From 5686c251f09fa25432d5db8195ac1df2fcda88fb Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 5 Jun 2010 01:55:17 +0000 Subject: Added missing animation initialisation code svn-id: r49436 --- engines/m4/animation.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 55566aad7e..bf49c649fb 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -198,6 +198,10 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S // Load all the sprite sets for the animation for (int i = 0; i < spriteListCount; ++i) { + if (_field12 && (i == _spriteListIndex)) + // Skip over field, since it's manually loaded + continue; + _spriteListIndexes[i] = _view->_spriteSlots.addSprites(_spriteSetNames[i].c_str()); } @@ -211,11 +215,17 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S _spriteListIndexes[_spriteListIndex] = _view->_spriteSlots.addSprites(resName.c_str()); } - // TODO: Unknown section about handling palette entries - I think it's adjusting sprite sets - // to the palette of the game screen + // TODO: Unknown section about handling sprite set list combined with messages size - // Process the sprite list indexes to remap them to the actual sprite list indexes - + // TODO: The original has two separate loops for the loop below based on _animMode == 4. Is it + // perhaps that in that mode the sprite frames has a different format..? + + // Remap the sprite list index fields from the initial value to the indexes of the loaded + // sprite sets for the animation + for (uint i = 0; i < _frameEntries.size(); ++i) { + int idx = _frameEntries[i].spriteSlot.spriteListIndex; + _frameEntries[i].spriteSlot.spriteListIndex = _spriteListIndexes[idx]; + } } /** @@ -270,8 +280,7 @@ void MadsAnimation::update() { // Loop checks for any prior animation sprite slots to be expired for (int slotIndex = 0; slotIndex < _view->_spriteSlots.startIndex; ++slotIndex) { - if ((_view->_spriteSlots[slotIndex].seqIndex >= 0x80) && - (_view->_spriteSlots[slotIndex].seqIndex <= 0xFD)) { + if (_view->_spriteSlots[slotIndex].seqIndex >= 0x80) { // Flag the frame as animation sprite slot _view->_spriteSlots[slotIndex].spriteType = EXPIRED_SPRITE; } @@ -334,8 +343,10 @@ void MadsAnimation::update() { if ((spriteSlotIndex == 0) && (index < spriteSlotsMax)) { int seqIndex = _frameEntries[_oldFrameEntry].seqIndex - _view->_spriteSlots[index].seqIndex; if (seqIndex == 0x80) { - if (_view->_spriteSlots[index] == _frameEntries[_oldFrameEntry].spriteSlot) + if (_view->_spriteSlots[index] == _frameEntries[_oldFrameEntry].spriteSlot) { _view->_spriteSlots[index].spriteType = SPRITE_ZERO; + spriteSlotIndex = -1; + } } ++index; continue; -- cgit v1.2.3 From b9065aa2d23d87c5da887ebe1f685230a4693827 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 5 Jun 2010 04:18:23 +0000 Subject: Various bugfixes to the animation code - first Rex animation now plays, albeit in the wrong place svn-id: r49437 --- engines/m4/animation.cpp | 9 ++++----- engines/m4/assets.cpp | 11 ++++++----- engines/m4/assets.h | 5 +++-- engines/m4/mads_views.cpp | 12 ++++++------ engines/m4/mads_views.h | 3 +-- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index bf49c649fb..a4e4ccbc0e 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -354,14 +354,13 @@ void MadsAnimation::update() { if (spriteSlotIndex == 0) { int slotIndex = _view->_spriteSlots.getIndex(); - _view->_spriteSlots[slotIndex].copy(_frameEntries[_oldFrameEntry].spriteSlot); - _view->_spriteSlots[slotIndex].seqIndex += 0x80; + MadsSpriteSlot &slot = _view->_spriteSlots[slotIndex]; + slot.copy(_frameEntries[_oldFrameEntry].spriteSlot); + slot.seqIndex = _frameEntries[_oldFrameEntry].seqIndex + 0x80; SpriteAsset &spriteSet = _view->_spriteSlots.getSprite( _view->_spriteSlots[slotIndex].spriteListIndex); - - _view->_spriteSlots[slotIndex].spriteType = (spriteSet.getAssetType() == 0) ? - SPRITE_FOUR : SPRITE_ZERO; + slot.spriteType = spriteSet.isBackground() ? BACKGROUND_SPRITE : FOREGROUND_SPRITE; } break; } diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index 91c371dec5..1f3cf278ae 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -210,11 +210,12 @@ void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStre _maxHeight = 0; Common::SeekableReadStream *spriteStream = sprite.getItemStream(0); - - _assetType = spriteStream->readUint16LE(); - for (int i = 0; i < 18; i++) { - spriteStream->readUint16LE(); - } + _mode = spriteStream->readByte(); + spriteStream->skip(1); + int type1 = spriteStream->readUint16LE(); + int type2 = spriteStream->readUint16LE(); + _isBackground = (type1 != 0) && (type2 < 4); + spriteStream->skip(32); _frameCount = spriteStream->readUint16LE(); // we skip the rest of the data delete spriteStream; diff --git a/engines/m4/assets.h b/engines/m4/assets.h index 816a8dcff0..e5beffbcae 100644 --- a/engines/m4/assets.h +++ b/engines/m4/assets.h @@ -114,7 +114,7 @@ public: int32 getFrameHeight(int index); int32 getMaxFrameWidth() const { return _maxWidth; } int32 getMaxFrameHeight() const { return _maxHeight; } - uint16 getAssetType() const { return _assetType; } + bool isBackground() const { return _isBackground; } M4Sprite *getFrame(int frameIndex); void loadStreamingFrame(M4Sprite *frame, int frameIndex, int destX, int destY); RGB8* getPalette() { return _palette; } @@ -137,7 +137,8 @@ protected: uint32 _frameStartOffset; // MADS sprite set fields - uint16 _assetType; + uint8 _mode; + bool _isBackground; int32 parseSprite(bool isBigEndian = false); void loadFrameHeader(SpriteAssetFrame &frameHeader, bool isBigEndian = false); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index c656db83f1..bfd57c4add 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -156,10 +156,10 @@ void MadsSpriteSlots::drawBackground() { if (_entries[i].depth <= 1) { // No depth, so simply copy the frame onto the background - frame->copyTo(_owner._bgSurface, xp, yp); + frame->copyTo(_owner._bgSurface, xp, yp, 0); } else { // Depth was specified, so draw frame using scene's depth information - frame->copyTo(_owner._bgSurface, xp, yp, _entries[i].depth, _owner._depthSurface, 100); + frame->copyTo(_owner._bgSurface, xp, yp, _entries[i].depth, _owner._depthSurface, 100, 0); } } } @@ -954,9 +954,9 @@ void MadsSequenceList::remove(int seqIndex) { void MadsSequenceList::setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot) { MadsSequenceEntry &timerEntry = _entries[seqIndex]; - SpriteAsset &sprite = _owner._spriteSlots.getSprite(timerEntry.spriteListIndex); + SpriteAsset &spriteSet = _owner._spriteSlots.getSprite(timerEntry.spriteListIndex); - spriteSlot.spriteType = sprite.getAssetType() == 1 ? BACKGROUND_SPRITE : FOREGROUND_SPRITE; + spriteSlot.spriteType = spriteSet.isBackground() ? BACKGROUND_SPRITE : FOREGROUND_SPRITE; spriteSlot.seqIndex = seqIndex; spriteSlot.spriteListIndex = timerEntry.spriteListIndex; spriteSlot.frameNumber = ((timerEntry.field_2 == 1) ? 0x8000 : 0) | timerEntry.frameIndex; @@ -967,8 +967,8 @@ void MadsSequenceList::setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot) { spriteSlot.xp = timerEntry.msgPos.x; spriteSlot.yp = timerEntry.msgPos.y; } else { - spriteSlot.xp = sprite.getFrame(timerEntry.frameIndex - 1)->x; - spriteSlot.yp = sprite.getFrame(timerEntry.frameIndex - 1)->y; + spriteSlot.xp = spriteSet.getFrame(timerEntry.frameIndex - 1)->x; + spriteSlot.yp = spriteSet.getFrame(timerEntry.frameIndex - 1)->y; } } diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 98944e6468..f44d640c8b 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -68,8 +68,7 @@ public: #define SPRITE_SLOTS_SIZE 50 enum SpriteIdSpecial { - BACKGROUND_SPRITE = -4, FULL_SCREEN_REFRESH = -2, EXPIRED_SPRITE = -1, SPRITE_ZERO = 0, FOREGROUND_SPRITE = 1, - SPRITE_FOUR = 4 + BACKGROUND_SPRITE = -4, FULL_SCREEN_REFRESH = -2, EXPIRED_SPRITE = -1, SPRITE_ZERO = 0, FOREGROUND_SPRITE = 1 }; class MadsSpriteSlots { -- cgit v1.2.3 From e9f35fbf4ce36b2a7cbdada429c5e7a2d49cbab8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 5 Jun 2010 14:09:52 +0000 Subject: Rewrote the remaining parts of the ResourceManager class to work with file streams, thus removing the SCI_detection hack in the fallback detector svn-id: r49438 --- engines/sci/detection.cpp | 23 +-------- engines/sci/resource.cpp | 105 ++++++++++++++++++++++++++--------------- engines/sci/resource_audio.cpp | 26 ++++++---- 3 files changed, 88 insertions(+), 66 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index aba2b0b74e..adec23c95e 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -373,19 +373,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl filename.toLowercase(); if (filename.contains("resource.map") || filename.contains("resmap.00") || filename.contains("Data1")) { - // HACK: resource.map is located in the same directory as the other resource files, - // therefore add the directory here, so that the game files can be opened later on - // We now add the parent directory temporary to our SearchMan so the engine code - // used in the detection can access all files via Common::File without any problems. - // In all branches returning from this function, we need to have a call to - // SearchMan.remove to remove it from the default directory pool again. - // - // A proper solution to remove this hack would be to have the code, which is needed - // for detection, to operate on Stream objects, so they can be easily called from - // the detection code. This might be easily to achieve through refactoring the - // code needed for detection. - assert(!SearchMan.hasArchive("SCI_detection")); - SearchMan.addDirectory("SCI_detection", file->getParent()); foundResMap = true; } @@ -429,7 +416,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl // If these files aren't found, it can't be SCI if (!foundResMap && !foundRes000) { - SearchMan.remove("SCI_detection"); return 0; } @@ -437,11 +423,10 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl ViewType gameViews = resMan->getViewType(); // Have we identified the game views? If not, stop here + // Can't be SCI (or unsupported SCI views). Pinball Creep by sierra also uses resource.map/resource.000 files + // but doesnt share sci format at all, if we dont return 0 here we will detect this game as SCI if (gameViews == kViewUnknown) { - SearchMan.remove("SCI_detection"); delete resMan; - // Can't be SCI (or unsupported SCI views). Pinball Creep by sierra also uses resource.map/resource.000 files - // but doesnt share sci format at all, if we dont return 0 here we will detect this game as SCI return 0; } @@ -449,7 +434,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl // Is SCI32 compiled in? If not, and this is a SCI32 game, // stop here if (getSciVersion() >= SCI_VERSION_2) { - SearchMan.remove("SCI_detection"); delete resMan; return (const ADGameDescription *)&s_fallbackDesc; } @@ -468,7 +452,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl // If we don't have a game id, the game is not SCI if (sierraGameId.empty()) { - SearchMan.remove("SCI_detection"); delete resMan; return 0; } @@ -522,8 +505,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl if (s_fallbackDesc.flags & ADGF_DEMO) s_fallbackDesc.extra = "demo"; - SearchMan.remove("SCI_detection"); - return (const ADGameDescription *)&s_fallbackDesc; } diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 449effd737..b17117a1cd 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -371,6 +371,8 @@ void ResourceManager::loadResource(Resource *res) { case kSourceWave: fileStream->seek(res->_fileOffset, SEEK_SET); loadFromWaveFile(res, fileStream); + if (res->_source->resourceFile) + delete fileStream; return; case kSourceAudioVolume: @@ -408,6 +410,8 @@ void ResourceManager::loadResource(Resource *res) { case kResourceTypeAudio36: // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 loadFromAudioVolumeSCI1(res, fileStream); + if (res->_source->resourceFile) + delete fileStream; return; default: break; @@ -420,11 +424,18 @@ void ResourceManager::loadResource(Resource *res) { loadFromAudioVolumeSCI1(res, fileStream); else loadFromAudioVolumeSCI11(res, fileStream); + + if (res->_source->resourceFile) + delete fileStream; return; default: fileStream->seek(res->_fileOffset, SEEK_SET); int error = decompress(res, fileStream); + + if (res->_source->resourceFile) + delete fileStream; + if (error) { warning("Error %d occured while reading %s from resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); @@ -437,19 +448,6 @@ Resource *ResourceManager::testResource(ResourceId id) { return _resMap.getVal(id, NULL); } -int sci0_get_compression_method(Common::ReadStream &stream) { - uint16 compressionMethod; - - stream.readUint16LE(); - stream.readUint16LE(); - stream.readUint16LE(); - compressionMethod = stream.readUint16LE(); - if (stream.err()) - return SCI_ERROR_IO_ERROR; - - return compressionMethod; -} - int ResourceManager::addAppropriateSources() { Common::ArchiveMemberList files; @@ -1205,25 +1203,34 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { } int ResourceManager::readResourceMapSCI0(ResourceSource *map) { - Common::File file; + Common::SeekableReadStream *fileStream = 0; Resource *res; ResourceType type; uint16 number, id; uint32 offset; - if (!file.open(map->location_name)) - return SCI_ERROR_RESMAP_NOT_FOUND; + if (map->resourceFile) { + fileStream = map->resourceFile->createReadStream(); + if (!fileStream) + return SCI_ERROR_RESMAP_NOT_FOUND; + } else { + Common::File *file = new Common::File(); + if (!file->open(map->location_name)) + return SCI_ERROR_RESMAP_NOT_FOUND; + fileStream = file; + } - file.seek(0, SEEK_SET); + fileStream->seek(0, SEEK_SET); byte bMask = (_mapVersion == kResVersionSci1Middle) ? 0xF0 : 0xFC; byte bShift = (_mapVersion == kResVersionSci1Middle) ? 28 : 26; do { - id = file.readUint16LE(); - offset = file.readUint32LE(); + id = fileStream->readUint16LE(); + offset = fileStream->readUint32LE(); - if (file.eos() || file.err()) { + if (fileStream->eos() || fileStream->err()) { + delete fileStream; warning("Error while reading %s", map->location_name.c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } @@ -1252,15 +1259,26 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { res->_id = resId; _resMap.setVal(resId, res); } - } while (!file.eos()); + } while (!fileStream->eos()); + + delete fileStream; return 0; } int ResourceManager::readResourceMapSCI1(ResourceSource *map) { - Common::File file; + Common::SeekableReadStream *fileStream = 0; Resource *res; - if (!file.open(map->location_name)) - return SCI_ERROR_RESMAP_NOT_FOUND; + + if (map->resourceFile) { + fileStream = map->resourceFile->createReadStream(); + if (!fileStream) + return SCI_ERROR_RESMAP_NOT_FOUND; + } else { + Common::File *file = new Common::File(); + if (!file->open(map->location_name)) + return SCI_ERROR_RESMAP_NOT_FOUND; + fileStream = file; + } resource_index_t resMap[32]; memset(resMap, 0, sizeof(resource_index_t) * 32); @@ -1271,8 +1289,8 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { // Read resource type and offsets to resource offsets block from .MAP file // The last entry has type=0xFF (0x1F) and offset equals to map file length do { - type = file.readByte() & 0x1F; - resMap[type].wOffset = file.readUint16LE(); + type = fileStream->readByte() & 0x1F; + resMap[type].wOffset = fileStream->readUint16LE(); resMap[prevtype].wSize = (resMap[type].wOffset - resMap[prevtype].wOffset) / nEntrySize; prevtype = type; @@ -1283,18 +1301,18 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { for (type = 0; type < 32; type++) { if (resMap[type].wOffset == 0) // this resource does not exist in map continue; - file.seek(resMap[type].wOffset); + fileStream->seek(resMap[type].wOffset); for (int i = 0; i < resMap[type].wSize; i++) { - uint16 number = file.readUint16LE(); + uint16 number = fileStream->readUint16LE(); int volume_nr = 0; if (_mapVersion == kResVersionSci11) { // offset stored in 3 bytes - off = file.readUint16LE(); - off |= file.readByte() << 16; + off = fileStream->readUint16LE(); + off |= fileStream->readByte() << 16; off <<= 1; } else { // offset/volume stored in 4 bytes - off = file.readUint32LE(); + off = fileStream->readUint32LE(); if (_mapVersion < kResVersionSci11) { volume_nr = off >> 28; // most significant 4 bits off &= 0x0FFFFFFF; // least significant 28 bits @@ -1302,7 +1320,8 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { // in SCI32 it's a plain offset } } - if (file.eos() || file.err()) { + if (fileStream->eos() || fileStream->err()) { + delete fileStream; warning("Error while reading %s", map->location_name.c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } @@ -1322,6 +1341,8 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { } } } + + delete fileStream; return 0; } @@ -1574,7 +1595,7 @@ ResourceCompression ResourceManager::getViewCompression() { // Test 10 views to see if any are compressed for (int i = 0; i < 1000; i++) { - Common::File *file; + Common::SeekableReadStream *fileStream = 0; Resource *res = testResource(ResourceId(kResourceTypeView, i)); if (!res) @@ -1583,16 +1604,26 @@ ResourceCompression ResourceManager::getViewCompression() { if (res->_source->source_type != kSourceVolume) continue; - file = getVolumeFile(res->_source->location_name.c_str()); - if (!file) + if (res->_source->resourceFile) + fileStream = res->_source->resourceFile->createReadStream(); + else + fileStream = getVolumeFile(res->_source->location_name.c_str()); + + if (!fileStream) continue; - file->seek(res->_fileOffset, SEEK_SET); + fileStream->seek(res->_fileOffset, SEEK_SET); uint32 szPacked; ResourceCompression compression; - if (readResourceInfo(res, file, szPacked, compression)) + if (readResourceInfo(res, fileStream, szPacked, compression)) { + if (res->_source->resourceFile) + delete fileStream; continue; + } + + if (res->_source->resourceFile) + delete fileStream; if (compression != kCompNone) return compression; diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 67bac974fc..ebc549c772 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -33,13 +33,20 @@ namespace Sci { void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { - Common::File *file = getVolumeFile(source->location_name.c_str()); - if (!file) { + Common::SeekableReadStream *fileStream; + + if (source->resourceFile) + fileStream = source->resourceFile->createReadStream(); + else + fileStream = getVolumeFile(source->location_name.c_str()); + + if (!fileStream) { warning("Failed to open %s", source->location_name.c_str()); return; } - file->seek(0, SEEK_SET); - uint32 compressionType = file->readUint32BE(); + + fileStream->seek(0, SEEK_SET); + uint32 compressionType = fileStream->readUint32BE(); switch (compressionType) { case MKID_BE('MP3 '): case MKID_BE('OGG '): @@ -47,19 +54,22 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { // Detected a compressed audio volume source->audioCompressionType = compressionType; // Now read the whole offset mapping table for later usage - int32 recordCount = file->readUint32LE(); + int32 recordCount = fileStream->readUint32LE(); if (!recordCount) error("compressed audio volume doesn't contain any entries!"); int32 *offsetMapping = new int32[(recordCount + 1) * 2]; source->audioCompressionOffsetMapping = offsetMapping; for (int recordNo = 0; recordNo < recordCount; recordNo++) { - *offsetMapping++ = file->readUint32LE(); - *offsetMapping++ = file->readUint32LE(); + *offsetMapping++ = fileStream->readUint32LE(); + *offsetMapping++ = fileStream->readUint32LE(); } // Put ending zero *offsetMapping++ = 0; - *offsetMapping++ = file->size(); + *offsetMapping++ = fileStream->size(); } + + if (source->resourceFile) + delete fileStream; } bool ResourceManager::loadFromWaveFile(Resource *res, Common::SeekableReadStream *file) { -- cgit v1.2.3 From c00d645506d60aea320a72cea2c5b9cb5368891c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 5 Jun 2010 18:15:41 +0000 Subject: Fixed the cursor limiting code in GK1 svn-id: r49440 --- engines/sci/engine/kgraphics.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 17d2cd630e..abe55455de 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -148,6 +148,10 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { int16 bottom = argv[2].toSint16(); int16 right = argv[3].toSint16(); + // In SCI32, the right parameter seems to be divided by 2 + if (getSciVersion() >= SCI_VERSION_2) + right *= 2; + if ((right >= left) && (bottom >= top)) { Common::Rect rect = Common::Rect(left, top, right, bottom); g_sci->_gfxCursor->kernelSetMoveZone(rect); -- cgit v1.2.3 From 6a796c2bb0b2a6d46546a97c24320bdceae2c69d Mon Sep 17 00:00:00 2001 From: John Willis Date: Sat, 5 Jun 2010 18:24:28 +0000 Subject: GP2X Wiz: Update handy shell scripts. svn-id: r49441 --- backends/platform/gp2xwiz/build/build.sh | 4 ++-- backends/platform/gp2xwiz/build/bundle.sh | 6 ++++-- backends/platform/gp2xwiz/build/config.sh | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backends/platform/gp2xwiz/build/build.sh b/backends/platform/gp2xwiz/build/build.sh index 1bdc020f17..876c3e378a 100755 --- a/backends/platform/gp2xwiz/build/build.sh +++ b/backends/platform/gp2xwiz/build/build.sh @@ -13,7 +13,7 @@ export ASFLAGS=-mfloat-abi=soft cd ../../../.. -echo Building ScummVM for GP2X. +echo Building ScummVM for GP2X Wiz. make -echo Build for GP2X - SDL - complete - Please check build logs. +echo Build for GP2X Wiz - complete - Please check build logs. diff --git a/backends/platform/gp2xwiz/build/bundle.sh b/backends/platform/gp2xwiz/build/bundle.sh index 492ba9e1c6..065bd7a685 100755 --- a/backends/platform/gp2xwiz/build/bundle.sh +++ b/backends/platform/gp2xwiz/build/bundle.sh @@ -35,10 +35,12 @@ loc=`dirname "$f"` cp $loc/../lib/libz.so.1.2.3 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libz.so.1 cp $loc/../lib/libvorbisidec.so.1.0.2 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libvorbisidec.so.1 - -echo Making Stripped exe. +echo Making Stripped Binary. arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/scummvm.wiz +echo Making Stripped Plugins. +arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins/* + echo Building ZIP bundle. if [ -f /usr/bin/zip ] then diff --git a/backends/platform/gp2xwiz/build/config.sh b/backends/platform/gp2xwiz/build/config.sh index 27c1fbf0bf..54c4795298 100755 --- a/backends/platform/gp2xwiz/build/config.sh +++ b/backends/platform/gp2xwiz/build/config.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh echo Quick script to make running configure all the time less painful echo and let all the build work be done from the backend/build folder. -- cgit v1.2.3 From 7b56f39985a62852478ccb8ad01a85e9f028097c Mon Sep 17 00:00:00 2001 From: John Willis Date: Sat, 5 Jun 2010 18:26:53 +0000 Subject: GP2X Wiz: Add missing "#include "graphics/scaler/aspect.h"". svn-id: r49442 --- backends/platform/gp2xwiz/build/clean.sh | 2 +- backends/platform/gp2xwiz/gp2xwiz-events.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/platform/gp2xwiz/build/clean.sh b/backends/platform/gp2xwiz/build/clean.sh index 2862887bb3..5ec1b9e62c 100755 --- a/backends/platform/gp2xwiz/build/clean.sh +++ b/backends/platform/gp2xwiz/build/clean.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh echo Quick script to make building all the time less painful. diff --git a/backends/platform/gp2xwiz/gp2xwiz-events.cpp b/backends/platform/gp2xwiz/gp2xwiz-events.cpp index 2774efce1b..a69aa42967 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-events.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-events.cpp @@ -30,6 +30,7 @@ #include "backends/platform/gp2xwiz/gp2xwiz-sdl.h" #include "backends/platform/gp2xwiz/gp2xwiz-hw.h" +#include "graphics/scaler/aspect.h" #include "common/util.h" #include "common/events.h" -- cgit v1.2.3 From abcd8e093a52745a5925993c74abfe901234df3a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 5 Jun 2010 19:55:03 +0000 Subject: Replaced a leftover Common::File::exists() call in the fallback detector svn-id: r49443 --- engines/sci/detection.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index adec23c95e..1ccfc6bf02 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -490,7 +490,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl } } - delete resMan; // Fill in extras field if (!strcmp(s_fallbackDesc.gameid, "lsl1sci") || @@ -498,13 +497,15 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl !strcmp(s_fallbackDesc.gameid, "sq1sci")) s_fallbackDesc.extra = "VGA Remake"; - if (!strcmp(s_fallbackDesc.gameid, "qfg1") && !Common::File::exists("resource.001")) + if (!strcmp(s_fallbackDesc.gameid, "qfg1") && getSciVersion() == SCI_VERSION_1_1) s_fallbackDesc.extra = "VGA Remake"; // Add "demo" to the description for demos if (s_fallbackDesc.flags & ADGF_DEMO) s_fallbackDesc.extra = "demo"; + delete resMan; + return (const ADGameDescription *)&s_fallbackDesc; } -- cgit v1.2.3 From 193d7df5940ada9c2ec7e3a233c2b26aa3b25e84 Mon Sep 17 00:00:00 2001 From: David Turner Date: Sun, 6 Jun 2010 00:27:56 +0000 Subject: Correction for SCI valgrind uninit memory error in MIDI sound which occurs during LSL6 intro. This may be "hiding" a bug in the use of sound/midiparser.cpp in SCI i.e. incorrect use of parseNextEvent(), so this should be reviewed, but this patch initialises _next_event at object construction, which corrects this, should not break anything else and is good practice. svn-id: r49445 --- sound/midiparser.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sound/midiparser.cpp b/sound/midiparser.cpp index 99319461e9..8ae2bad71a 100644 --- a/sound/midiparser.cpp +++ b/sound/midiparser.cpp @@ -47,6 +47,10 @@ _num_tracks(0), _active_track(255), _abort_parse(0) { memset(_active_notes, 0, sizeof(_active_notes)); + _next_event.start = NULL; + _next_event.delta = 0; + _next_event.event = 0; + _next_event.length = 0; } void MidiParser::property(int prop, int value) { -- cgit v1.2.3 From c253a57e471be34567c2a28f8ccb4f6e084d7e20 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 6 Jun 2010 01:12:41 +0000 Subject: Bugfix for #2974817 - Mad Drongo Animation Malfunction svn-id: r49447 --- engines/tinsel/saveload.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index b90ace4613..b010ad1fcb 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -180,7 +180,8 @@ static void syncSavedMover(Common::Serializer &s, SAVED_MOVER &sm) { static void syncSavedActor(Common::Serializer &s, SAVED_ACTOR &sa) { s.syncAsUint16LE(sa.actorID); s.syncAsUint16LE(sa.zFactor); - s.syncAsUint32LE(sa.bAlive); + s.syncAsUint16LE(sa.bAlive); + s.syncAsUint16LE(sa.bHidden); s.syncAsUint32LE(sa.presFilm); s.syncAsUint16LE(sa.presRnum); s.syncAsUint16LE(sa.presPlayX); -- cgit v1.2.3 From 3efec5720de2c46355c323763dee96b719ed5aa1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 6 Jun 2010 06:46:29 +0000 Subject: Bugfixes for correct positioning of opening animation svn-id: r49448 --- engines/m4/animation.cpp | 5 +++-- engines/m4/mads_views.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index a4e4ccbc0e..b372222bd0 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -34,6 +34,7 @@ namespace M4 { MadsAnimation::MadsAnimation(MadsM4Engine *vm, MadsView *view): Animation(vm), _view(view) { _font = NULL; + _resetFlag = false; _freeFlag = false; _skipLoad = false; _unkIndex = -1; @@ -159,7 +160,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S rec.spriteSlot.xp = animStream->readUint16LE(); rec.spriteSlot.yp = animStream->readUint16LE(); rec.spriteSlot.depth = animStream->readByte(); - rec.spriteSlot.scale = animStream->readByte(); + rec.spriteSlot.scale = (int8)animStream->readByte(); _frameEntries.push_back(rec); } @@ -287,7 +288,7 @@ void MadsAnimation::update() { } // Validate the current frame - if (_currentFrame > (int)_miscEntries.size()) { + if (_currentFrame >= (int)_miscEntries.size()) { // Is the animation allowed to be repeated? if (_resetFlag) { _currentFrame = 0; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index bfd57c4add..cfcb113dcd 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -195,7 +195,7 @@ void MadsSpriteSlots::drawForeground(View *view) { if (slot.scale < 100) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); - M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); + M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); spr->copyTo(view, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, 0); } else { int xp, yp; -- cgit v1.2.3 From 46155b2c3678784f6333eed1d65a35eefdcb2001 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 6 Jun 2010 09:34:36 +0000 Subject: Add Android backend from patch #2603856 svn-id: r49449 --- backends/platform/android/README.build | 84 ++ backends/platform/android/android.cpp | 1413 ++++++++++++++++++++ backends/platform/android/android.mk | 52 + backends/platform/android/asset-archive.cpp | 414 ++++++ backends/platform/android/asset-archive.h | 53 + backends/platform/android/module.mk | 85 ++ .../inodes/gus/scummvm/EditableSurfaceView.java | 59 + .../android/org/inodes/gus/scummvm/Event.java | 330 +++++ .../org/inodes/gus/scummvm/PluginProvider.java | 52 + .../android/org/inodes/gus/scummvm/ScummVM.java | 317 +++++ .../org/inodes/gus/scummvm/ScummVMActivity.java | 446 ++++++ .../org/inodes/gus/scummvm/ScummVMApplication.java | 29 + .../android/org/inodes/gus/scummvm/Unpacker.java | 370 +++++ .../android/scummvm-android-themeengine.patch | 135 ++ base/commandLine.cpp | 4 +- common/textconsole.cpp | 12 +- configure | 43 +- dists/android/mkmanifest.pl | 169 +++ dists/android/res/drawable/gradient.xml | 7 + dists/android/res/layout/main.xml | 10 + dists/android/res/layout/splash.xml | 19 + dists/android/res/values/strings.xml | 22 + sound/decoders/vorbis.cpp | 2 +- tools/update-version.pl | 1 + 24 files changed, 4121 insertions(+), 7 deletions(-) create mode 100644 backends/platform/android/README.build create mode 100644 backends/platform/android/android.cpp create mode 100644 backends/platform/android/android.mk create mode 100644 backends/platform/android/asset-archive.cpp create mode 100644 backends/platform/android/asset-archive.h create mode 100644 backends/platform/android/module.mk create mode 100644 backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/Event.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/ScummVM.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java create mode 100644 backends/platform/android/org/inodes/gus/scummvm/Unpacker.java create mode 100644 backends/platform/android/scummvm-android-themeengine.patch create mode 100644 dists/android/mkmanifest.pl create mode 100644 dists/android/res/drawable/gradient.xml create mode 100644 dists/android/res/layout/main.xml create mode 100644 dists/android/res/layout/splash.xml create mode 100644 dists/android/res/values/strings.xml diff --git a/backends/platform/android/README.build b/backends/platform/android/README.build new file mode 100644 index 0000000000..fa56bfc180 --- /dev/null +++ b/backends/platform/android/README.build @@ -0,0 +1,84 @@ +Building the ScummVM Android port +================================= + +You will need these things to build: +1. Android EGL headers and library +2. Android SDK +3. An arm-android-eabi GCC toolchain + +In the example commands, we are going to build against the Android 1.5 +native ABI (but using the Android 1.6 SDK tools). Other version +combinations might/should be possible with a bit of tweaking. + +In detail: + +1. Android EGL headers and library + +You can build these from the full Android source, but it is far easier +to just download the 3 Android EGL headers from here: + http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=opengl/include/EGL;hb=HEAD + (copy them to a directory called "EGL" somewhere) + +... and grab libEGL.so off an existing phone/emulator: + adb pull /system/lib/libEGL.so /tmp + +2. Android SDK + +Download and install somewhere. + +3. arm-android-eabi GCC toolchain + +You have several choices for toolchains: + +- Use Google arm-eabi prebuilt toolchain. + +This is shipped with both the Android source release and Android NDK. +The problem is that "arm-eabi-gcc" can't actually link anything +successfully without extra command line flags. To use this with the +ScummVM configure/build environment you will need to create a family +of shell wrapper scripts that convert "arm-android-eabi-foo" to +"arm-eabi-foo -mandroid". + +For example, I use this script: + #!/bin/sh + exec arm-eabi-${0##*-} -mandroid -DANDROID "$@" + +... and create a family of symlinks/hardlinks pointing to it called +arm-android-eabi-gcc, arm-android-eabi-g++, etc. For tools that don't +take a "-mandroid" argument - like arm-eabi-strip - I bypass the shell +wrapper and just create an arm-android-eabi-strip symlink to the tool +directly. + +- Build your own arm-android-eabi toolchain from GCC source. + +This is lots of fun. I suggest my Android openembedded patches, see: + http://wiki.github.com/anguslees/openembedded-android/ +(You just need to have lots of disk space and type a few commands) +If you get stuck, ask + +Alternatively, do a websearch - there are several other cross-compile +toolchains around. + + +Building ScummVM +================ + + export ANDROID_SDK= + + PATH=$ANDROID_SDK/platforms/android-1.6/tools:$ANDROID_SDK/tools:$PATH + # You also want to ensure your arm-android-eabi toolchain is in your $PATH + + export ANDROID_TOP= + + EGL_INC="-I" + EGL_LIBS="-L" + + CPPFLAGS="$EGL_INC" \ + LDFLAGS="-g $EGL_LIBS" \ + ./configure --backend=android --host=android --enable-zlib #and any other flags + make scummvm.apk + +This will build a "monolithic" ScummVM package, with the engines +statically linked in. If you want to build separate engine packages, +like on the market, add "--enable-plugins --default-dynamic" to +configure and also make scummvm-engine-scumm.apk, etc. diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp new file mode 100644 index 0000000000..76590ec823 --- /dev/null +++ b/backends/platform/android/android.cpp @@ -0,0 +1,1413 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/base-backend.h" +#include "base/main.h" +#include "graphics/surface.h" + +#include "backends/platform/android/video.h" + +#if defined(ANDROID_BACKEND) + +#define ANDROID_VERSION_GE(major,minor) \ + (ANDROID_MAJOR_VERSION > (major) || \ + (ANDROID_MAJOR_VERSION == (major) && ANDROID_MINOR_VERSION >= (minor))) + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "common/archive.h" +#include "common/util.h" +#include "common/rect.h" +#include "common/queue.h" +#include "common/mutex.h" +#include "common/events.h" +#include "common/config-manager.h" + +#include "backends/fs/posix/posix-fs-factory.h" +#include "backends/keymapper/keymapper.h" +#include "backends/saves/default/default-saves.h" +#include "backends/timer/default/default-timer.h" +#include "backends/plugins/posix/posix-provider.h" +#include "sound/mixer_intern.h" + +#include "backends/platform/android/asset-archive.h" + +#undef LOG_TAG +#define LOG_TAG "ScummVM" + +#if 0 +#define ENTER(args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, args) +#else +#define ENTER(args...) /**/ +#endif + +// Fix JNIEXPORT declaration to actually do something useful +#undef JNIEXPORT +#define JNIEXPORT __attribute__ ((visibility("default"))) + +static JavaVM *cached_jvm; +static jfieldID FID_Event_type; +static jfieldID FID_Event_synthetic; +static jfieldID FID_Event_kbd_keycode; +static jfieldID FID_Event_kbd_ascii; +static jfieldID FID_Event_kbd_flags; +static jfieldID FID_Event_mouse_x; +static jfieldID FID_Event_mouse_y; +static jfieldID FID_Event_mouse_relative; +static jfieldID FID_ScummVM_nativeScummVM; +static jmethodID MID_Object_wait; + +JNIEnv* JNU_GetEnv() { + JNIEnv* env; + bool version_unsupported = + cached_jvm->GetEnv((void**)&env, JNI_VERSION_1_2); + assert(! version_unsupported); + return env; +} + +static void JNU_ThrowByName(JNIEnv* env, const char* name, const char* msg) { + jclass cls = env->FindClass(name); + // if cls is NULL, an exception has already been thrown + if (cls != NULL) + env->ThrowNew(cls, msg); + env->DeleteLocalRef(cls); +} + +// floating point. use sparingly. +template +static inline T scalef(T in, float numerator, float denominator) { + return static_cast(in) * numerator / denominator; +} + +static inline GLfixed xdiv(int numerator, int denominator) { + assert(numerator < (1<<16)); + return (numerator << 16) / denominator; +} + +#ifdef DYNAMIC_MODULES +class AndroidPluginProvider : public POSIXPluginProvider { +protected: + virtual void addCustomDirectories(Common::FSList &dirs) const; +}; +#endif + + +#if 0 +#define CHECK_GL_ERROR() checkGlError(__FILE__, __LINE__) +static const char* getGlErrStr(GLenum error) { + switch (error) { + case GL_NO_ERROR: return "GL_NO_ERROR"; + case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; + case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; + case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW"; + case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW"; + case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; + } + + static char buf[40]; + snprintf(buf, sizeof(buf), "(Unknown GL error code 0x%x)", error); + return buf; +} +static void checkGlError(const char* file, int line) { + GLenum error = glGetError(); + if (error != GL_NO_ERROR) + warning("%s:%d: GL error: %s", file, line, getGlErrStr(error)); +} +#else +#define CHECK_GL_ERROR() do {} while (false) +#endif + +class OSystem_Android : public BaseBackend { +private: + jobject _back_ptr; // back pointer to (java) peer instance + jmethodID MID_displayMessageOnOSD; + jmethodID MID_setWindowCaption; + jmethodID MID_initBackend; + jmethodID MID_audioSampleRate; + jmethodID MID_showVirtualKeyboard; + jmethodID MID_getSysArchives; + jmethodID MID_getPluginDirectories; + jmethodID MID_setupScummVMSurface; + jmethodID MID_destroyScummVMSurface; + + int _screen_changeid; + EGLDisplay _egl_display; + EGLSurface _egl_surface; + EGLint _egl_surface_width; + EGLint _egl_surface_height; + + bool _force_redraw; + + // Game layer + GLESPaletteTexture* _game_texture; + int _shake_offset; + bool _full_screen_dirty; + Common::Array _dirty_rects; + + // Overlay layer + GLES4444Texture* _overlay_texture; + bool _show_overlay; + + // Mouse layer + GLESPaletteATexture* _mouse_texture; + Common::Point _mouse_hotspot; + int _mouse_targetscale; + bool _show_mouse; + bool _use_mouse_palette; + + Common::Queue _event_queue; + MutexRef _event_queue_lock; + + bool _timer_thread_exit; + pthread_t _timer_thread; + static void* timerThreadFunc(void* arg); + + bool _virtkeybd_on; + + Common::SaveFileManager *_savefile; + Audio::MixerImpl *_mixer; + Common::TimerManager *_timer; + FilesystemFactory *_fsFactory; + Common::Archive *_asset_archive; + timeval _startTime; + + void setupScummVMSurface(); + void destroyScummVMSurface(); + void setupKeymapper(); + void _setCursorPalette(const byte *colors, uint start, uint num); + +public: + OSystem_Android(jobject am); + virtual ~OSystem_Android(); + bool initJavaHooks(JNIEnv* env, jobject self); + + static OSystem_Android* fromJavaObject(JNIEnv* env, jobject obj); + virtual void initBackend(); + void addPluginDirectories(Common::FSList &dirs) const; + + virtual bool hasFeature(Feature f); + virtual void setFeatureState(Feature f, bool enable); + virtual bool getFeatureState(Feature f); + virtual const GraphicsMode *getSupportedGraphicsModes() const; + virtual int getDefaultGraphicsMode() const; + bool setGraphicsMode(const char *name); + virtual bool setGraphicsMode(int mode); + virtual int getGraphicsMode() const; + virtual void initSize(uint width, uint height, + const Graphics::PixelFormat *format); + virtual int getScreenChangeID() const { return _screen_changeid; } + virtual int16 getHeight(); + virtual int16 getWidth(); + virtual void setPalette(const byte *colors, uint start, uint num); + virtual void grabPalette(byte *colors, uint start, uint num); + virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); + virtual void updateScreen(); + virtual Graphics::Surface *lockScreen(); + virtual void unlockScreen(); + virtual void setShakePos(int shakeOffset); + virtual void fillScreen(uint32 col); + virtual void setFocusRectangle(const Common::Rect& rect); + virtual void clearFocusRectangle(); + + virtual void showOverlay(); + virtual void hideOverlay(); + virtual void clearOverlay(); + virtual void grabOverlay(OverlayColor *buf, int pitch); + virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); + virtual int16 getOverlayHeight(); + virtual int16 getOverlayWidth(); + virtual Graphics::PixelFormat getOverlayFormat() const { + // RGBA 4444 + Graphics::PixelFormat format; + format.bytesPerPixel = 2; + format.rLoss = 8 - 4; + format.gLoss = 8 - 4; + format.bLoss = 8 - 4; + format.aLoss = 8 - 4; + format.rShift = 3*4; + format.gShift = 2*4; + format.bShift = 1*4; + format.aShift = 0*4; + return format; + } + + virtual bool showMouse(bool visible); + + virtual void warpMouse(int x, int y); + virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format); + virtual void setCursorPalette(const byte *colors, uint start, uint num); + virtual void disableCursorPalette(bool disable); + + virtual bool pollEvent(Common::Event &event); + void pushEvent(const Common::Event& event); + virtual uint32 getMillis(); + virtual void delayMillis(uint msecs); + + virtual MutexRef createMutex(void); + virtual void lockMutex(MutexRef mutex); + virtual void unlockMutex(MutexRef mutex); + virtual void deleteMutex(MutexRef mutex); + + virtual void quit(); + + virtual void setWindowCaption(const char *caption); + virtual void displayMessageOnOSD(const char *msg); + virtual void showVirtualKeyboard(bool enable); + + virtual Common::SaveFileManager *getSavefileManager(); + virtual Audio::Mixer *getMixer(); + virtual void getTimeAndDate(TimeDate &t) const; + virtual Common::TimerManager *getTimerManager(); + virtual FilesystemFactory *getFilesystemFactory(); + virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); +}; + +OSystem_Android::OSystem_Android(jobject am) + : _back_ptr(0), + _egl_display(EGL_NO_DISPLAY), + _egl_surface(EGL_NO_SURFACE), + _screen_changeid(0), + _force_redraw(false), + _game_texture(NULL), + _overlay_texture(NULL), + _mouse_texture(NULL), + _use_mouse_palette(false), + _show_mouse(false), + _show_overlay(false), + _savefile(0), + _mixer(0), + _timer(0), + _fsFactory(new POSIXFilesystemFactory()), + _asset_archive(new AndroidAssetArchive(am)), + _shake_offset(0), + _full_screen_dirty(false), + _event_queue_lock(createMutex()) { +} + +OSystem_Android::~OSystem_Android() { + ENTER("~OSystem_Android()"); + delete _game_texture; + delete _overlay_texture; + delete _mouse_texture; + destroyScummVMSurface(); + JNIEnv* env = JNU_GetEnv(); + //env->DeleteWeakGlobalRef(_back_ptr); + env->DeleteGlobalRef(_back_ptr); + delete _savefile; + delete _mixer; + delete _timer; + delete _fsFactory; + delete _asset_archive; + deleteMutex(_event_queue_lock); +} + +OSystem_Android* OSystem_Android::fromJavaObject(JNIEnv* env, jobject obj) { + jlong peer = env->GetLongField(obj, FID_ScummVM_nativeScummVM); + return (OSystem_Android*)peer; +} + +bool OSystem_Android::initJavaHooks(JNIEnv* env, jobject self) { + // weak global ref to allow class to be unloaded + // ... except dalvik doesn't implement NewWeakGlobalRef (yet) + //_back_ptr = env->NewWeakGlobalRef(self); + _back_ptr = env->NewGlobalRef(self); + + jclass cls = env->GetObjectClass(_back_ptr); + +#define FIND_METHOD(name, signature) do { \ + MID_ ## name = env->GetMethodID(cls, #name, signature); \ + if (MID_ ## name == NULL) \ + return false; \ + } while (0) + + FIND_METHOD(setWindowCaption, "(Ljava/lang/String;)V"); + FIND_METHOD(displayMessageOnOSD, "(Ljava/lang/String;)V"); + FIND_METHOD(initBackend, "()V"); + FIND_METHOD(audioSampleRate, "()I"); + FIND_METHOD(showVirtualKeyboard, "(Z)V"); + FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); + FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); + FIND_METHOD(setupScummVMSurface, "()V"); + FIND_METHOD(destroyScummVMSurface, "()V"); + +#undef FIND_METHOD + + return true; +} + +static void ScummVM_create(JNIEnv* env, jobject self, jobject am) { + OSystem_Android* cpp_obj = new OSystem_Android(am); + if (!cpp_obj->initJavaHooks(env, self)) + // Exception already thrown by initJavaHooks + return; + + env->SetLongField(self, FID_ScummVM_nativeScummVM, (jlong)cpp_obj); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new AndroidPluginProvider()); +#endif +} + +static void ScummVM_nativeDestroy(JNIEnv* env, jobject self) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + delete cpp_obj; +} + +static void ScummVM_audioMixCallback(JNIEnv* env, jobject self, + jbyteArray jbuf) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + jsize len = env->GetArrayLength(jbuf); + jbyte* buf = env->GetByteArrayElements(jbuf, NULL); + if (buf == NULL) { + warning("Unable to get Java audio byte array. Skipping."); + return; + } + Audio::MixerImpl* mixer = + static_cast(cpp_obj->getMixer()); + assert(mixer); + mixer->mixCallback(reinterpret_cast(buf), len); + env->ReleaseByteArrayElements(jbuf, buf, 0); +} + +static void ScummVM_setConfManInt(JNIEnv* env, jclass cls, + jstring key_obj, jint value) { + ENTER("setConfManInt(%p, %d)", key_obj, (int)value); + const char* key = env->GetStringUTFChars(key_obj, NULL); + if (key == NULL) + return; + ConfMan.setInt(key, value); + env->ReleaseStringUTFChars(key_obj, key); +} + +static void ScummVM_setConfManString(JNIEnv* env, jclass cls, jstring key_obj, + jstring value_obj) { + ENTER("setConfManStr(%p, %p)", key_obj, value_obj); + const char* key = env->GetStringUTFChars(key_obj, NULL); + if (key == NULL) + return; + const char* value = env->GetStringUTFChars(value_obj, NULL); + if (value == NULL) { + env->ReleaseStringUTFChars(key_obj, key); + return; + } + ConfMan.set(key, value); + env->ReleaseStringUTFChars(value_obj, value); + env->ReleaseStringUTFChars(key_obj, key); +} + +void* OSystem_Android::timerThreadFunc(void* arg) { + OSystem_Android* system = (OSystem_Android*)arg; + DefaultTimerManager* timer = (DefaultTimerManager*)(system->_timer); + + struct timespec tv; + tv.tv_sec = 0; + tv.tv_nsec = 100 * 1000 * 1000; // 100ms + + while (!system->_timer_thread_exit) { + timer->handler(); + nanosleep(&tv, NULL); + } + + return NULL; +} + +void OSystem_Android::initBackend() { + ENTER("initBackend()"); + JNIEnv* env = JNU_GetEnv(); + + ConfMan.setInt("autosave_period", 0); + ConfMan.setInt("FM_medium_quality", true); + + // must happen before creating TimerManager to avoid race in + // creating EventManager + setupKeymapper(); + + // BUG: "transient" ConfMan settings get nuked by the options + // screen. Passing the savepath in this way makes it stick + // (via ConfMan.registerDefault) + _savefile = new DefaultSaveFileManager(ConfMan.get("savepath")); + _timer = new DefaultTimerManager(); + + gettimeofday(&_startTime, NULL); + + jint sample_rate = env->CallIntMethod(_back_ptr, MID_audioSampleRate); + if (env->ExceptionCheck()) { + warning("Error finding audio sample rate - assuming 11025HZ"); + env->ExceptionDescribe(); + env->ExceptionClear(); + sample_rate = 11025; + } + _mixer = new Audio::MixerImpl(this, sample_rate); + _mixer->setReady(true); + + env->CallVoidMethod(_back_ptr, MID_initBackend); + if (env->ExceptionCheck()) { + error("Error in Java initBackend"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } + + _timer_thread_exit = false; + pthread_create(&_timer_thread, NULL, timerThreadFunc, this); + + OSystem::initBackend(); + + setupScummVMSurface(); +} + +void OSystem_Android::addPluginDirectories(Common::FSList &dirs) const { + ENTER("OSystem_Android::addPluginDirectories()"); + JNIEnv* env = JNU_GetEnv(); + + jobjectArray array = + (jobjectArray)env->CallObjectMethod(_back_ptr, MID_getPluginDirectories); + if (env->ExceptionCheck()) { + warning("Error finding plugin directories"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return; + } + + jsize size = env->GetArrayLength(array); + for (jsize i = 0; i < size; ++i) { + jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); + if (path_obj == NULL) + continue; + const char* path = env->GetStringUTFChars(path_obj, NULL); + if (path == NULL) { + warning("Error getting string characters from plugin directory"); + env->ExceptionClear(); + env->DeleteLocalRef(path_obj); + continue; + } + dirs.push_back(Common::FSNode(path)); + env->ReleaseStringUTFChars(path_obj, path); + env->DeleteLocalRef(path_obj); + } +} + +bool OSystem_Android::hasFeature(Feature f) { + return (f == kFeatureCursorHasPalette || + f == kFeatureVirtualKeyboard || + f == kFeatureOverlaySupportsAlpha); +} + +void OSystem_Android::setFeatureState(Feature f, bool enable) { + ENTER("setFeatureState(%d, %d)", f, enable); + switch (f) { + case kFeatureVirtualKeyboard: + _virtkeybd_on = enable; + showVirtualKeyboard(enable); + break; + default: + break; + } +} + +bool OSystem_Android::getFeatureState(Feature f) { + switch (f) { + case kFeatureVirtualKeyboard: + return _virtkeybd_on; + default: + return false; + } +} + +const OSystem::GraphicsMode* OSystem_Android::getSupportedGraphicsModes() const { + static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { + {"default", "Default", 1}, + {0, 0, 0}, + }; + return s_supportedGraphicsModes; +} + + +int OSystem_Android::getDefaultGraphicsMode() const { + return 1; +} + +bool OSystem_Android::setGraphicsMode(const char *mode) { + ENTER("setGraphicsMode(%s)", mode); + return true; +} + +bool OSystem_Android::setGraphicsMode(int mode) { + ENTER("setGraphicsMode(%d)", mode); + return true; +} + +int OSystem_Android::getGraphicsMode() const { + return 1; +} + +void OSystem_Android::setupScummVMSurface() { + JNIEnv* env = JNU_GetEnv(); + env->CallVoidMethod(_back_ptr, MID_setupScummVMSurface); + if (env->ExceptionCheck()) + return; + + // EGL set up with a new surface. Initialise OpenGLES context. + + _egl_display = eglGetCurrentDisplay(); + _egl_surface = eglGetCurrentSurface(EGL_DRAW); + + static bool log_version = true; + if (log_version) { + __android_log_print(ANDROID_LOG_INFO, LOG_TAG, + "Using EGL %s (%s); GL %s/%s (%s)", + eglQueryString(_egl_display, EGL_VERSION), + eglQueryString(_egl_display, EGL_VENDOR), + glGetString(GL_VERSION), + glGetString(GL_RENDERER), + glGetString(GL_VENDOR)); + log_version = false; // only log this once + } + + GLESTexture::initGLExtensions(); + + if (!eglQuerySurface(_egl_display, _egl_surface, + EGL_WIDTH, &_egl_surface_width) || + !eglQuerySurface(_egl_display, _egl_surface, + EGL_HEIGHT, &_egl_surface_height)) { + JNU_ThrowByName(env, "java/lang/RuntimeException", + "Error fetching EGL surface width/height"); + return; + } + __android_log_print(ANDROID_LOG_INFO, LOG_TAG, + "New surface is %dx%d", + _egl_surface_width, _egl_surface_height); + + CHECK_GL_ERROR(); + + // Turn off anything that looks like 3D ;) + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + glDisable(GL_DITHER); + glShadeModel(GL_FLAT); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glEnable(GL_TEXTURE_2D); + + if (!_game_texture) + _game_texture = new GLESPaletteTexture(); + else + _game_texture->reinitGL(); + + if (!_overlay_texture) + _overlay_texture = new GLES4444Texture(); + else + _overlay_texture->reinitGL(); + + if (!_mouse_texture) + _mouse_texture = new GLESPaletteATexture(); + else + _mouse_texture->reinitGL(); + + glViewport(0, 0, _egl_surface_width, _egl_surface_height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + CHECK_GL_ERROR(); + + _force_redraw = true; +} + +void OSystem_Android::destroyScummVMSurface() { + _egl_surface = EGL_NO_SURFACE; + JNIEnv* env = JNU_GetEnv(); + env->CallVoidMethod(_back_ptr, MID_destroyScummVMSurface); + // Can't use OpenGLES functions after this +} + +void OSystem_Android::initSize(uint width, uint height, + const Graphics::PixelFormat *format) { + ENTER("initSize(%d,%d,%p)", width, height, format); + + _game_texture->allocBuffer(width, height); + + // Cap at 320x200 or the ScummVM themes abort :/ + GLuint overlay_width = MIN(_egl_surface_width, 320); + GLuint overlay_height = MIN(_egl_surface_height, 200); + _overlay_texture->allocBuffer(overlay_width, overlay_height); + + // Don't know mouse size yet - it gets reallocated in + // setMouseCursor. We need the palette allocated before + // setMouseCursor however, so just take a guess at the desired + // size (it's small). + _mouse_texture->allocBuffer(20, 20); +} + +int16 OSystem_Android::getHeight() { + return _game_texture->height(); +} + +int16 OSystem_Android::getWidth() { + return _game_texture->width(); +} + +void OSystem_Android::setPalette(const byte* colors, uint start, uint num) { + ENTER("setPalette(%p, %u, %u)", colors, start, num); + + if (!_use_mouse_palette) + _setCursorPalette(colors, start, num); + + byte* palette = _game_texture->palette() + start*3; + do { + for (int i = 0; i < 3; ++i) + palette[i] = colors[i]; + palette += 3; + colors += 4; + } while (--num); +} + +void OSystem_Android::grabPalette(byte *colors, uint start, uint num) { + ENTER("grabPalette(%p, %u, %u)", colors, start, num); + const byte* palette = _game_texture->palette_const() + start*3; + do { + for (int i = 0; i < 3; ++i) + colors[i] = palette[i]; + colors[3] = 0xff; // alpha + + palette += 3; + colors += 4; + } while (--num); +} + +void OSystem_Android::copyRectToScreen(const byte *buf, int pitch, + int x, int y, int w, int h) { + ENTER("copyRectToScreen(%p, %d, %d, %d, %d, %d)", + buf, pitch, x, y, w, h); + + _game_texture->updateBuffer(x, y, w, h, buf, pitch); +} + +void OSystem_Android::updateScreen() { + //ENTER("updateScreen()"); + + if (!_force_redraw && + !_game_texture->dirty() && + !_overlay_texture->dirty() && + !_mouse_texture->dirty()) + return; + + _force_redraw = false; + + glPushMatrix(); + + if (_shake_offset != 0) { + // This is the only case where _game_texture doesn't + // cover the entire screen. + glClearColorx(0, 0, 0, 1 << 16); + glClear(GL_COLOR_BUFFER_BIT); + + // Move everything up by _shake_offset (game) pixels + glTranslatex(0, -_shake_offset << 16, 0); + } + + _game_texture->drawTexture(0, 0, + _egl_surface_width, _egl_surface_height); + + CHECK_GL_ERROR(); + + if (_show_overlay) { + _overlay_texture->drawTexture(0, 0, + _egl_surface_width, + _egl_surface_height); + CHECK_GL_ERROR(); + } + + if (_show_mouse) { + glPushMatrix(); + + glTranslatex(-_mouse_hotspot.x << 16, + -_mouse_hotspot.y << 16, + 0); + + // Scale up ScummVM -> OpenGL (pixel) coordinates + int texwidth, texheight; + if (_show_overlay) { + texwidth = getOverlayWidth(); + texheight = getOverlayHeight(); + } else { + texwidth = getWidth(); + texheight = getHeight(); + } + glScalex(xdiv(_egl_surface_width, texwidth), + xdiv(_egl_surface_height, texheight), + 1 << 16); + + // Note the extra half texel to position the mouse in + // the middle of the x,y square: + const Common::Point& mouse = getEventManager()->getMousePos(); + glTranslatex((mouse.x << 16) | 1 << 15, + (mouse.y << 16) | 1 << 15, 0); + + // Mouse targetscale just seems to make the cursor way + // too big :/ + //glScalex(_mouse_targetscale << 16, _mouse_targetscale << 16, + // 1 << 16); + + _mouse_texture->drawTexture(); + + glPopMatrix(); + } + + glPopMatrix(); + + CHECK_GL_ERROR(); + + if (!eglSwapBuffers(_egl_display, _egl_surface)) { + EGLint error = eglGetError(); + warning("eglSwapBuffers exited with error 0x%x", error); + // Some errors mean we need to reinit GL + if (error == EGL_CONTEXT_LOST) { + destroyScummVMSurface(); + setupScummVMSurface(); + } + } +} + +Graphics::Surface *OSystem_Android::lockScreen() { + ENTER("lockScreen()"); + Graphics::Surface* surface = _game_texture->surface(); + assert(surface->pixels); + return surface; +} + +void OSystem_Android::unlockScreen() { + ENTER("unlockScreen()"); + assert(_game_texture->dirty()); +} + +void OSystem_Android::setShakePos(int shake_offset) { + ENTER("setShakePos(%d)", shake_offset); + if (_shake_offset != shake_offset) { + _shake_offset = shake_offset; + _force_redraw = true; + } +} + +void OSystem_Android::fillScreen(uint32 col) { + ENTER("fillScreen(%u)", col); + assert(col < 256); + _game_texture->fillBuffer(col); +} + +void OSystem_Android::setFocusRectangle(const Common::Rect& rect) { + ENTER("setFocusRectangle(%d,%d,%d,%d)", + rect.left, rect.top, rect.right, rect.bottom); +#if 0 + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrthof(rect.left, rect.right, rect.top, rect.bottom, 0, 1); + glMatrixMode(GL_MODELVIEW); + + _force_redraw = true; +#endif +} + +void OSystem_Android::clearFocusRectangle() { + ENTER("clearFocusRectangle()"); +#if 0 + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + _force_redraw = true; +#endif +} + +void OSystem_Android::showOverlay() { + ENTER("showOverlay()"); + _show_overlay = true; + _force_redraw = true; +} + +void OSystem_Android::hideOverlay() { + ENTER("hideOverlay()"); + _show_overlay = false; + _force_redraw = true; +} + +void OSystem_Android::clearOverlay() { + ENTER("clearOverlay()"); + _overlay_texture->fillBuffer(0); +} + +void OSystem_Android::grabOverlay(OverlayColor *buf, int pitch) { + ENTER("grabOverlay(%p, %d)", buf, pitch); + // We support overlay alpha blending, so the pixel data here + // shouldn't actually be used. Let's fill it with zeros, I'm sure + // it will be fine... + const Graphics::Surface* surface = _overlay_texture->surface_const(); + assert(surface->bytesPerPixel == sizeof(buf[0])); + int h = surface->h; + do { + memset(buf, 0, surface->w * sizeof(buf[0])); + buf += pitch; // This 'pitch' is pixels not bytes + } while (--h); +} + +void OSystem_Android::copyRectToOverlay(const OverlayColor *buf, int pitch, + int x, int y, int w, int h) { + ENTER("copyRectToOverlay(%p, %d, %d, %d, %d, %d)", + buf, pitch, x, y, w, h); + const Graphics::Surface* surface = _overlay_texture->surface_const(); + assert(surface->bytesPerPixel == sizeof(buf[0])); + + // This 'pitch' is pixels not bytes + _overlay_texture->updateBuffer(x, y, w, h, buf, pitch * sizeof(buf[0])); +} + +int16 OSystem_Android::getOverlayHeight() { + return _overlay_texture->height(); +} + +int16 OSystem_Android::getOverlayWidth() { + return _overlay_texture->width(); +} + +bool OSystem_Android::showMouse(bool visible) { + ENTER("showMouse(%d)", visible); + _show_mouse = visible; + return true; +} + +void OSystem_Android::warpMouse(int x, int y) { + ENTER("warpMouse(%d, %d)", x, y); + // We use only the eventmanager's idea of the current mouse + // position, so there is nothing extra to do here. +} + +void OSystem_Android::setMouseCursor(const byte *buf, uint w, uint h, + int hotspotX, int hotspotY, + uint32 keycolor, int cursorTargetScale, + const Graphics::PixelFormat *format) { + ENTER("setMouseCursor(%p, %u, %u, %d, %d, %d, %d, %p)", + buf, w, h, hotspotX, hotspotY, (int)keycolor, cursorTargetScale, + format); + + assert(keycolor < 256); + + _mouse_texture->allocBuffer(w, h); + + // Update palette alpha based on keycolor + byte* palette = _mouse_texture->palette(); + int i = 256; + do { + palette[3] = 0xff; + palette += 4; + } while (--i); + palette = _mouse_texture->palette(); + palette[keycolor*4 + 3] = 0x00; + _mouse_texture->updateBuffer(0, 0, w, h, buf, w); + + _mouse_hotspot = Common::Point(hotspotX, hotspotY); + _mouse_targetscale = cursorTargetScale; +} + +void OSystem_Android::_setCursorPalette(const byte *colors, + uint start, uint num) { + byte* palette = _mouse_texture->palette() + start*4; + do { + for (int i = 0; i < 3; ++i) + palette[i] = colors[i]; + // Leave alpha untouched to preserve keycolor + + palette += 4; + colors += 4; + } while (--num); +} + +void OSystem_Android::setCursorPalette(const byte *colors, + uint start, uint num) { + ENTER("setCursorPalette(%p, %u, %u)", colors, start, num); + _setCursorPalette(colors, start, num); + _use_mouse_palette = true; +} + +void OSystem_Android::disableCursorPalette(bool disable) { + ENTER("disableCursorPalette(%d)", disable); + _use_mouse_palette = !disable; +} + +void OSystem_Android::setupKeymapper() { +#ifdef ENABLE_KEYMAPPER + using namespace Common; + + Keymapper *mapper = getEventManager()->getKeymapper(); + + HardwareKeySet *keySet = new HardwareKeySet(); + keySet->addHardwareKey( + new HardwareKey("n", KeyState(KEYCODE_n), "n (vk)", + kTriggerLeftKeyType, + kVirtualKeyboardActionType)); + mapper->registerHardwareKeySet(keySet); + + Keymap *globalMap = new Keymap("global"); + Action *act; + + act = new Action(globalMap, "VIRT", "Display keyboard", + kVirtualKeyboardActionType); + act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0)); + + mapper->addGlobalKeymap(globalMap); + + mapper->pushKeymap("global"); +#endif +} + +bool OSystem_Android::pollEvent(Common::Event &event) { + //ENTER("pollEvent()"); + lockMutex(_event_queue_lock); + if (_event_queue.empty()) { + unlockMutex(_event_queue_lock); + return false; + } + event = _event_queue.pop(); + unlockMutex(_event_queue_lock); + + switch (event.type) { + case Common::EVENT_MOUSEMOVE: + // TODO: only dirty/redraw move bounds + _force_redraw = true; + // fallthrough + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONDOWN: + case Common::EVENT_RBUTTONUP: + case Common::EVENT_WHEELUP: + case Common::EVENT_WHEELDOWN: + case Common::EVENT_MBUTTONDOWN: + case Common::EVENT_MBUTTONUP: { + if (event.kbd.flags == 1) { // relative mouse hack + // Relative (trackball) mouse hack. + const Common::Point& mouse_pos = + getEventManager()->getMousePos(); + event.mouse.x += mouse_pos.x; + event.mouse.y += mouse_pos.y; + event.mouse.x = CLIP(event.mouse.x, (int16)0, _show_overlay ? + getOverlayWidth() : getWidth()); + event.mouse.y = CLIP(event.mouse.y, (int16)0, _show_overlay ? + getOverlayHeight() : getHeight()); + } else { + // Touchscreen events need to be converted + // from device to game coords first. + const GLESTexture* tex = _show_overlay + ? static_cast(_overlay_texture) + : static_cast(_game_texture); + event.mouse.x = scalef(event.mouse.x, tex->width(), + _egl_surface_width); + event.mouse.y = scalef(event.mouse.y, tex->height(), + _egl_surface_height); + event.mouse.x -= _shake_offset; + } + break; + } + case Common::EVENT_SCREEN_CHANGED: + debug("EVENT_SCREEN_CHANGED"); + _screen_changeid++; + destroyScummVMSurface(); + setupScummVMSurface(); + break; + default: + break; + } + + return true; +} + +void OSystem_Android::pushEvent(const Common::Event& event) { + lockMutex(_event_queue_lock); + + // Try to combine multiple queued mouse move events + if (event.type == Common::EVENT_MOUSEMOVE && + !_event_queue.empty() && + _event_queue.back().type == Common::EVENT_MOUSEMOVE) { + Common::Event tail = _event_queue.back(); + if (event.kbd.flags) { + // relative movement hack + tail.mouse.x += event.mouse.x; + tail.mouse.y += event.mouse.y; + } else { + // absolute position + tail.kbd.flags = 0; // clear relative flag + tail.mouse.x = event.mouse.x; + tail.mouse.y = event.mouse.y; + } + } + else + _event_queue.push(event); + + unlockMutex(_event_queue_lock); +} + +static void ScummVM_pushEvent(JNIEnv* env, jobject self, jobject java_event) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + + Common::Event event; + event.type = (Common::EventType)env->GetIntField(java_event, + FID_Event_type); + event.synthetic = + env->GetBooleanField(java_event, FID_Event_synthetic); + + switch (event.type) { + case Common::EVENT_KEYDOWN: + case Common::EVENT_KEYUP: + event.kbd.keycode = (Common::KeyCode)env->GetIntField( + java_event, FID_Event_kbd_keycode); + event.kbd.ascii = static_cast(env->GetIntField( + java_event, FID_Event_kbd_ascii)); + event.kbd.flags = static_cast(env->GetIntField( + java_event, FID_Event_kbd_flags)); + break; + case Common::EVENT_MOUSEMOVE: + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONDOWN: + case Common::EVENT_RBUTTONUP: + case Common::EVENT_WHEELUP: + case Common::EVENT_WHEELDOWN: + case Common::EVENT_MBUTTONDOWN: + case Common::EVENT_MBUTTONUP: + event.mouse.x = + env->GetIntField(java_event, FID_Event_mouse_x); + event.mouse.y = + env->GetIntField(java_event, FID_Event_mouse_y); + // This is a terrible hack. We stash "relativeness" + // in the kbd.flags field until pollEvent() can work + // it out. + event.kbd.flags = env->GetBooleanField( + java_event, FID_Event_mouse_relative) ? 1 : 0; + break; + default: + break; + } + + cpp_obj->pushEvent(event); +} + +uint32 OSystem_Android::getMillis() { + timeval curTime; + gettimeofday(&curTime, NULL); + return (uint32)(((curTime.tv_sec - _startTime.tv_sec) * 1000) + \ + ((curTime.tv_usec - _startTime.tv_usec) / 1000)); +} + +void OSystem_Android::delayMillis(uint msecs) { + usleep(msecs * 1000); +} + +OSystem::MutexRef OSystem_Android::createMutex() { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + + pthread_mutex_t *mutex = new pthread_mutex_t; + if (pthread_mutex_init(mutex, &attr) != 0) { + warning("pthread_mutex_init() failed!"); + delete mutex; + return NULL; + } + return (MutexRef)mutex; +} + +void OSystem_Android::lockMutex(MutexRef mutex) { + if (pthread_mutex_lock((pthread_mutex_t*)mutex) != 0) + warning("pthread_mutex_lock() failed!"); +} + +void OSystem_Android::unlockMutex(MutexRef mutex) { + if (pthread_mutex_unlock((pthread_mutex_t*)mutex) != 0) + warning("pthread_mutex_unlock() failed!"); +} + +void OSystem_Android::deleteMutex(MutexRef mutex) { + pthread_mutex_t* m = (pthread_mutex_t*)mutex; + if (pthread_mutex_destroy(m) != 0) + warning("pthread_mutex_destroy() failed!"); + else + delete m; +} + +void OSystem_Android::quit() { + ENTER("quit()"); + + _timer_thread_exit = true; + pthread_join(_timer_thread, NULL); +} + +void OSystem_Android::setWindowCaption(const char *caption) { + ENTER("setWindowCaption(%s)", caption); + JNIEnv* env = JNU_GetEnv(); + jstring java_caption = env->NewStringUTF(caption); + env->CallVoidMethod(_back_ptr, MID_setWindowCaption, java_caption); + if (env->ExceptionCheck()) { + warning("Failed to set window caption"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } + env->DeleteLocalRef(java_caption); +} + +void OSystem_Android::displayMessageOnOSD(const char *msg) { + ENTER("displayMessageOnOSD(%s)", msg); + JNIEnv* env = JNU_GetEnv(); + jstring java_msg = env->NewStringUTF(msg); + env->CallVoidMethod(_back_ptr, MID_displayMessageOnOSD, java_msg); + if (env->ExceptionCheck()) { + warning("Failed to display OSD message"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } + env->DeleteLocalRef(java_msg); +} + +void OSystem_Android::showVirtualKeyboard(bool enable) { + ENTER("showVirtualKeyboard(%d)", enable); + JNIEnv* env = JNU_GetEnv(); + env->CallVoidMethod(_back_ptr, MID_showVirtualKeyboard, enable); + if (env->ExceptionCheck()) { + error("Error trying to show virtual keyboard"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +Common::SaveFileManager *OSystem_Android::getSavefileManager() { + assert(_savefile); + return _savefile; +} + +Audio::Mixer *OSystem_Android::getMixer() { + assert(_mixer); + return _mixer; +} + +Common::TimerManager *OSystem_Android::getTimerManager() { + assert(_timer); + return _timer; +} + +void OSystem_Android::getTimeAndDate(TimeDate &td) const { + struct tm tm; + const time_t curTime = time(NULL); + localtime_r(&curTime, &tm); + td.tm_sec = tm.tm_sec; + td.tm_min = tm.tm_min; + td.tm_hour = tm.tm_hour; + td.tm_mday = tm.tm_mday; + td.tm_mon = tm.tm_mon; + td.tm_year = tm.tm_year; +} + +FilesystemFactory *OSystem_Android::getFilesystemFactory() { + return _fsFactory; +} + +void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s, + int priority) { + s.add("ASSET", _asset_archive, priority, false); + + JNIEnv* env = JNU_GetEnv(); + + jobjectArray array = + (jobjectArray)env->CallObjectMethod(_back_ptr, MID_getSysArchives); + if (env->ExceptionCheck()) { + warning("Error finding system archive path"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return; + } + + jsize size = env->GetArrayLength(array); + for (jsize i = 0; i < size; ++i) { + jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); + const char* path = env->GetStringUTFChars(path_obj, NULL); + if (path != NULL) { + s.addDirectory(path, path, priority); + env->ReleaseStringUTFChars(path_obj, path); + } + env->DeleteLocalRef(path_obj); + } +} + + +static jint ScummVM_scummVMMain(JNIEnv* env, jobject self, jobjectArray args) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + + const int MAX_NARGS = 32; + int res = -1; + + int argc = env->GetArrayLength(args); + if (argc > MAX_NARGS) { + JNU_ThrowByName(env, "java/lang/IllegalArgumentException", + "too many arguments"); + return 0; + } + + char* argv[MAX_NARGS]; + int nargs; // note use in cleanup loop below + for (nargs = 0; nargs < argc; ++nargs) { + jstring arg = (jstring)env->GetObjectArrayElement(args, nargs); + if (arg == NULL) { + argv[nargs] = NULL; + } else { + const char* cstr = env->GetStringUTFChars(arg, NULL); + argv[nargs] = const_cast(cstr); + if (cstr == NULL) + goto cleanup; // exception already thrown + } + env->DeleteLocalRef(arg); + } + + g_system = cpp_obj; + assert(g_system); + __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, + "Entering scummvm_main with %d args", argc); + res = scummvm_main(argc, argv); + __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "Exiting scummvm_main"); + g_system->quit(); + +cleanup: + nargs--; + for (int i = 0; i < nargs; ++i) { + if (argv[i] == NULL) + continue; + jstring arg = (jstring)env->GetObjectArrayElement(args, nargs); + if (arg == NULL) + // Exception already thrown + return res; + env->ReleaseStringUTFChars(arg, argv[i]); + env->DeleteLocalRef(arg); + } + + return res; +} + +#ifdef DYNAMIC_MODULES +void AndroidPluginProvider::addCustomDirectories(Common::FSList &dirs) const { + OSystem_Android* g_system_android = (OSystem_Android*)g_system; + g_system_android->addPluginDirectories(dirs); +} +#endif + +const static JNINativeMethod gMethods[] = { + { "create", "(Landroid/content/res/AssetManager;)V", + (void*)ScummVM_create }, + { "nativeDestroy", "()V", (void*)ScummVM_nativeDestroy }, + { "scummVMMain", "([Ljava/lang/String;)I", + (void*)ScummVM_scummVMMain }, + { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", + (void*)ScummVM_pushEvent }, + { "audioMixCallback", "([B)V", + (void*)ScummVM_audioMixCallback }, + { "setConfMan", "(Ljava/lang/String;I)V", + (void*)ScummVM_setConfManInt }, + { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", + (void*)ScummVM_setConfManString }, +}; + +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM* jvm, void* reserved) { + cached_jvm = jvm; + + JNIEnv* env; + if (jvm->GetEnv((void**)&env, JNI_VERSION_1_2)) + return JNI_ERR; + + jclass cls = env->FindClass("org/inodes/gus/scummvm/ScummVM"); + if (cls == NULL) + return JNI_ERR; + if (env->RegisterNatives(cls, gMethods, ARRAYSIZE(gMethods)) < 0) + return JNI_ERR; + + FID_ScummVM_nativeScummVM = env->GetFieldID(cls, "nativeScummVM", "J"); + if (FID_ScummVM_nativeScummVM == NULL) + return JNI_ERR; + + jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); + if (event == NULL) + return JNI_ERR; + FID_Event_type = env->GetFieldID(event, "type", "I"); + if (FID_Event_type == NULL) + return JNI_ERR; + FID_Event_synthetic = env->GetFieldID(event, "synthetic", "Z"); + if (FID_Event_synthetic == NULL) + return JNI_ERR; + FID_Event_kbd_keycode = env->GetFieldID(event, "kbd_keycode", "I"); + if (FID_Event_kbd_keycode == NULL) + return JNI_ERR; + FID_Event_kbd_ascii = env->GetFieldID(event, "kbd_ascii", "I"); + if (FID_Event_kbd_ascii == NULL) + return JNI_ERR; + FID_Event_kbd_flags = env->GetFieldID(event, "kbd_flags", "I"); + if (FID_Event_kbd_flags == NULL) + return JNI_ERR; + FID_Event_mouse_x = env->GetFieldID(event, "mouse_x", "I"); + if (FID_Event_mouse_x == NULL) + return JNI_ERR; + FID_Event_mouse_y = env->GetFieldID(event, "mouse_y", "I"); + if (FID_Event_mouse_y == NULL) + return JNI_ERR; + FID_Event_mouse_relative = env->GetFieldID(event, "mouse_relative", "Z"); + if (FID_Event_mouse_relative == NULL) + return JNI_ERR; + + cls = env->FindClass("java/lang/Object"); + if (cls == NULL) + return JNI_ERR; + MID_Object_wait = env->GetMethodID(cls, "wait", "()V"); + if (MID_Object_wait == NULL) + return JNI_ERR; + + return JNI_VERSION_1_2; +} + +#endif diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk new file mode 100644 index 0000000000..0bc8fa265e --- /dev/null +++ b/backends/platform/android/android.mk @@ -0,0 +1,52 @@ +# Android specific build targets + +AAPT = aapt +DX = dx +APKBUILDER = apkbuilder +ADB = adb -e +ANDROID_JAR = $(ANDROID_SDK)/platforms/android-1.6/android.jar +JAVAC ?= javac +JAVACFLAGS = -source 1.5 -target 1.5 + +# FIXME: find/mark plugin entry points and add all this back again: +#LDFLAGS += -Wl,--gc-sections +#CXXFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden + +scummvm.apk: build.tmp/libscummvm.so resources.ap_ classes.dex + # Package installer won't delete old libscummvm.so on upgrade so + # replace it with a zero size file + $(INSTALL) -d build.stage/common/lib/armeabi + touch build.stage/common/lib/armeabi/libscummvm.so + # We now handle the library unpacking ourselves from mylib/ + $(INSTALL) -d build.stage/common/mylib/armeabi + $(INSTALL) -c -m 644 build.tmp/libscummvm.so build.stage/common/mylib/armeabi/ + $(STRIP) build.stage/common/mylib/armeabi/libscummvm.so + # "-nf lib/armeabi/libscummvm.so" builds bogus paths? + $(APKBUILDER) $@ -z resources.ap_ -f classes.dex -rf build.stage/common || { $(RM) $@; exit 1; } + +scummvm-engine-%.apk: plugins/lib%.so build.tmp/%/resources.ap_ build.tmp/plugins/classes.dex + $(INSTALL) -d build.stage/$*/apk/mylib/armeabi/ + $(INSTALL) -c -m 644 plugins/lib$*.so build.stage/$*/apk/mylib/armeabi/ + $(STRIP) build.stage/$*/apk/mylib/armeabi/lib$*.so + $(APKBUILDER) $@ -z build.tmp/$*/resources.ap_ -f build.tmp/plugins/classes.dex -rf build.stage/$*/apk || { $(RM) $@; exit 1; } + +release/%.apk: %.apk + @$(MKDIR) -p $(@D) + @$(RM) $@ + $(CP) $< $@.tmp + # remove debugging signature + zip -d $@.tmp META-INF/\* + jarsigner $(JARSIGNER_FLAGS) $@.tmp release + zipalign 4 $@.tmp $@ + $(RM) $@.tmp + +androidrelease: release/scummvm.apk $(patsubst plugins/lib%.so,release/scummvm-engine-%.apk,$(PLUGINS)) + +androidtest: scummvm.apk scummvm-engine-scumm.apk scummvm-engine-kyra.apk + @set -e; for apk in $^; do \ + echo $(ADB) install -r $$apk; \ + $(ADB) install -r $$apk; \ + done + $(ADB) shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n org.inodes.gus.scummvm/.Unpacker + +.PHONY: androidrelease androidtest diff --git a/backends/platform/android/asset-archive.cpp b/backends/platform/android/asset-archive.cpp new file mode 100644 index 0000000000..20c6a653c0 --- /dev/null +++ b/backends/platform/android/asset-archive.cpp @@ -0,0 +1,414 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#if defined(ANDROID) + +#include + +#include +#include + +#include "common/str.h" +#include "common/stream.h" +#include "common/util.h" +#include "common/archive.h" +#include "common/debug.h" + +#include "backends/platform/android/asset-archive.h" + +extern JNIEnv* JNU_GetEnv(); + +// Must match android.content.res.AssetManager.ACCESS_* +const jint ACCESS_UNKNOWN = 0; +const jint ACCESS_RANDOM = 1; + +// This might be useful to someone else. Assumes markSupported() == true. +class JavaInputStream : public Common::SeekableReadStream { +public: + JavaInputStream(JNIEnv* env, jobject is); + virtual ~JavaInputStream(); + virtual bool eos() const { return _eos; } + virtual bool err() const { return _err; } + virtual void clearErr() { _eos = _err = false; } + virtual uint32 read(void *dataPtr, uint32 dataSize); + virtual int32 pos() const { return _pos; } + virtual int32 size() const { return _len; } + virtual bool seek(int32 offset, int whence = SEEK_SET); +private: + void close(JNIEnv* env); + jmethodID MID_mark; + jmethodID MID_available; + jmethodID MID_close; + jmethodID MID_read; + jmethodID MID_reset; + jmethodID MID_skip; + jobject _input_stream; + jsize _buflen; + jbyteArray _buf; + uint32 _pos; + jint _len; + bool _eos; + bool _err; +}; + +JavaInputStream::JavaInputStream(JNIEnv* env, jobject is) : + _eos(false), _err(false), _pos(0) +{ + _input_stream = env->NewGlobalRef(is); + _buflen = 8192; + _buf = static_cast(env->NewGlobalRef(env->NewByteArray(_buflen))); + + jclass cls = env->GetObjectClass(_input_stream); + MID_mark = env->GetMethodID(cls, "mark", "(I)V"); + assert(MID_mark); + MID_available = env->GetMethodID(cls, "available", "()I"); + assert(MID_mark); + MID_close = env->GetMethodID(cls, "close", "()V"); + assert(MID_close); + MID_read = env->GetMethodID(cls, "read", "([BII)I"); + assert(MID_read); + MID_reset = env->GetMethodID(cls, "reset", "()V"); + assert(MID_reset); + MID_skip = env->GetMethodID(cls, "skip", "(J)J"); + assert(MID_skip); + + // Mark start of stream, so we can reset back to it. + // readlimit is set to something bigger than anything we might + // want to seek within. + env->CallVoidMethod(_input_stream, MID_mark, 10*1024*1024); + _len = env->CallIntMethod(_input_stream, MID_available); +} + +JavaInputStream::~JavaInputStream() { + JNIEnv* env = JNU_GetEnv(); + close(env); + env->DeleteGlobalRef(_buf); + env->DeleteGlobalRef(_input_stream); +} + +void JavaInputStream::close(JNIEnv* env) { + env->CallVoidMethod(_input_stream, MID_close); + if (env->ExceptionCheck()) + env->ExceptionClear(); +} + +uint32 JavaInputStream::read(void *dataPtr, uint32 dataSize) { + JNIEnv* env = JNU_GetEnv(); + + if (_buflen < dataSize) { + _buflen = dataSize; + env->DeleteGlobalRef(_buf); + _buf = static_cast(env->NewGlobalRef(env->NewByteArray(_buflen))); + } + + jint ret = env->CallIntMethod(_input_stream, MID_read, _buf, 0, dataSize); + if (env->ExceptionCheck()) { + warning("Exception during JavaInputStream::read(%p, %d)", + dataPtr, dataSize); + env->ExceptionDescribe(); + env->ExceptionClear(); + _err = true; + ret = -1; + } else if (ret == -1) { + _eos = true; + ret = 0; + } else { + env->GetByteArrayRegion(_buf, 0, ret, static_cast(dataPtr)); + _pos += ret; + } + return ret; +} + +bool JavaInputStream::seek(int32 offset, int whence) { + JNIEnv* env = JNU_GetEnv(); + uint32 newpos; + switch (whence) { + case SEEK_SET: + newpos = offset; + break; + case SEEK_CUR: + newpos = _pos + offset; + break; + case SEEK_END: + newpos = _len + offset; + break; + default: + debug("Unknown 'whence' arg %d", whence); + return false; + } + + jlong skip_bytes; + if (newpos > _pos) { + skip_bytes = newpos - _pos; + } else { + // Can't skip backwards, so jump back to start and skip from there. + env->CallVoidMethod(_input_stream, MID_reset); + if (env->ExceptionCheck()) { + warning("Failed to rewind to start of asset stream"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return false; + } + _pos = 0; + skip_bytes = newpos; + } + + while (skip_bytes > 0) { + jlong ret = env->CallLongMethod(_input_stream, MID_skip, skip_bytes); + if (env->ExceptionCheck()) { + warning("Failed to skip %ld bytes into asset stream", + static_cast(skip_bytes)); + env->ExceptionDescribe(); + env->ExceptionClear(); + return false; + } else if (ret == 0) { + warning("InputStream->skip(%ld) didn't skip any bytes. Aborting seek.", + static_cast(skip_bytes)); + return false; // No point looping forever... + } + _pos += ret; + skip_bytes -= ret; + } + _eos = false; + return true; +} + + +// Must match android.content.res.AssetFileDescriptor.UNKNOWN_LENGTH +const jlong UNKNOWN_LENGTH = -1; + +// Reading directly from a fd is so much more efficient, that it is +// worth optimising for. +class AssetFdReadStream : public Common::SeekableReadStream { +public: + AssetFdReadStream(JNIEnv* env, jobject assetfd); + virtual ~AssetFdReadStream(); + virtual bool eos() const { return _eos; } + virtual bool err() const { return _err; } + virtual void clearErr() { _eos = _err = false; } + virtual uint32 read(void *dataPtr, uint32 dataSize); + virtual int32 pos() const { return _pos; } + virtual int32 size() const { return _declared_len; } + virtual bool seek(int32 offset, int whence = SEEK_SET); +private: + void close(JNIEnv* env); + int _fd; + jmethodID MID_close; + jobject _assetfd; + jlong _start_off; + jlong _declared_len; + uint32 _pos; + bool _eos; + bool _err; +}; + +AssetFdReadStream::AssetFdReadStream(JNIEnv* env, jobject assetfd) : + _eos(false), _err(false), _pos(0) +{ + _assetfd = env->NewGlobalRef(assetfd); + + jclass cls = env->GetObjectClass(_assetfd); + MID_close = env->GetMethodID(cls, "close", "()V"); + assert(MID_close); + + jmethodID MID_getStartOffset = + env->GetMethodID(cls, "getStartOffset", "()J"); + assert(MID_getStartOffset); + _start_off = env->CallLongMethod(_assetfd, MID_getStartOffset); + + jmethodID MID_getDeclaredLength = + env->GetMethodID(cls, "getDeclaredLength", "()J"); + assert(MID_getDeclaredLength); + _declared_len = env->CallLongMethod(_assetfd, MID_getDeclaredLength); + + jmethodID MID_getFileDescriptor = + env->GetMethodID(cls, "getFileDescriptor", "()Ljava/io/FileDescriptor;"); + assert(MID_getFileDescriptor); + jobject javafd = env->CallObjectMethod(_assetfd, MID_getFileDescriptor); + assert(javafd); + jclass fd_cls = env->GetObjectClass(javafd); + jfieldID FID_descriptor = env->GetFieldID(fd_cls, "descriptor", "I"); + assert(FID_descriptor); + _fd = env->GetIntField(javafd, FID_descriptor); +} + +AssetFdReadStream::~AssetFdReadStream() { + JNIEnv* env = JNU_GetEnv(); + env->CallVoidMethod(_assetfd, MID_close); + if (env->ExceptionCheck()) + env->ExceptionClear(); + env->DeleteGlobalRef(_assetfd); +} + +uint32 AssetFdReadStream::read(void *dataPtr, uint32 dataSize) { + if (_declared_len != UNKNOWN_LENGTH) { + jlong cap = _declared_len - _pos; + if (dataSize > cap) + dataSize = cap; + } + int ret = ::read(_fd, dataPtr, dataSize); + if (ret == 0) + _eos = true; + else if (ret == -1) + _err = true; + else + _pos += ret; + return ret; +} + +bool AssetFdReadStream::seek(int32 offset, int whence) { + if (whence == SEEK_SET) { + if (_declared_len != UNKNOWN_LENGTH && offset > _declared_len) + offset = _declared_len; + offset += _start_off; + } else if (whence == SEEK_END && _declared_len != UNKNOWN_LENGTH) { + whence = SEEK_SET; + offset = _start_off + _declared_len + offset; + } + int ret = lseek(_fd, offset, whence); + if (ret == -1) + return false; + _pos = ret - _start_off; + _eos = false; + return true; +} + +AndroidAssetArchive::AndroidAssetArchive(jobject am) { + JNIEnv* env = JNU_GetEnv(); + _am = env->NewGlobalRef(am); + + jclass cls = env->GetObjectClass(_am); + MID_open = env->GetMethodID(cls, "open", + "(Ljava/lang/String;I)Ljava/io/InputStream;"); + assert(MID_open); + MID_openFd = env->GetMethodID(cls, "openFd", + "(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;"); + assert(MID_openFd); + MID_list = env->GetMethodID(cls, "list", + "(Ljava/lang/String;)[Ljava/lang/String;"); + assert(MID_list); +} + +AndroidAssetArchive::~AndroidAssetArchive() { + JNIEnv* env = JNU_GetEnv(); + env->DeleteGlobalRef(_am); +} + +bool AndroidAssetArchive::hasFile(const Common::String &name) { + JNIEnv* env = JNU_GetEnv(); + jstring path = env->NewStringUTF(name.c_str()); + jobject result = env->CallObjectMethod(_am, MID_open, path, ACCESS_UNKNOWN); + if (env->ExceptionCheck()) { + // Assume FileNotFoundException + //warning("Error while calling AssetManager->open(%s)", name.c_str()); + //env->ExceptionDescribe(); + env->ExceptionClear(); + env->DeleteLocalRef(path); + return false; + } + env->DeleteLocalRef(result); + env->DeleteLocalRef(path); + return true; +} + +int AndroidAssetArchive::listMembers(Common::ArchiveMemberList &member_list) { + JNIEnv* env = JNU_GetEnv(); + Common::List dirlist; + dirlist.push_back(""); + + int count = 0; + while (!dirlist.empty()) { + const Common::String dir = dirlist.back(); + dirlist.pop_back(); + + jstring jpath = env->NewStringUTF(dir.c_str()); + jobjectArray jpathlist = static_cast(env->CallObjectMethod(_am, MID_list, jpath)); + if (env->ExceptionCheck()) { + warning("Error while calling AssetManager->list(%s). Ignoring.", + dir.c_str()); + env->ExceptionDescribe(); + env->ExceptionClear(); + continue; // May as well keep going ... + } + env->DeleteLocalRef(jpath); + + for (jsize i = 0; i < env->GetArrayLength(jpathlist); ++i) { + jstring elem = (jstring)env->GetObjectArrayElement(jpathlist, i); + const char* p = env->GetStringUTFChars(elem, NULL); + Common::String thispath = dir; + if (!thispath.empty()) + thispath += "/"; + thispath += p; + + // Assume files have a . in them, and directories don't + if (strchr(p, '.')) { + member_list.push_back(getMember(thispath)); + ++count; + } else + dirlist.push_back(thispath); + + env->ReleaseStringUTFChars(elem, p); + env->DeleteLocalRef(elem); + } + + env->DeleteLocalRef(jpathlist); + } + + return count; +} + +Common::ArchiveMemberPtr AndroidAssetArchive::getMember(const Common::String &name) { + return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this)); +} + +Common::SeekableReadStream *AndroidAssetArchive::createReadStreamForMember(const Common::String &path) const { + JNIEnv* env = JNU_GetEnv(); + jstring jpath = env->NewStringUTF(path.c_str()); + + // Try openFd() first ... + jobject afd = env->CallObjectMethod(_am, MID_openFd, jpath); + if (env->ExceptionCheck()) + env->ExceptionClear(); + else if (afd != NULL) { + // success :) + env->DeleteLocalRef(jpath); + return new AssetFdReadStream(env, afd); + } + + // ... and fallback to normal open() if that doesn't work + jobject is = env->CallObjectMethod(_am, MID_open, jpath, ACCESS_RANDOM); + if (env->ExceptionCheck()) { + // Assume FileNotFoundException + //warning("Error opening %s", path.c_str()); + //env->ExceptionDescribe(); + env->ExceptionClear(); + env->DeleteLocalRef(jpath); + return NULL; + } + + return new JavaInputStream(env, is); +} + +#endif diff --git a/backends/platform/android/asset-archive.h b/backends/platform/android/asset-archive.h new file mode 100644 index 0000000000..b3f6993c50 --- /dev/null +++ b/backends/platform/android/asset-archive.h @@ -0,0 +1,53 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#if defined(ANDROID) + +#include + +#include "common/str.h" +#include "common/stream.h" +#include "common/util.h" +#include "common/archive.h" + +class AndroidAssetArchive : public Common::Archive { +public: + AndroidAssetArchive(jobject am); + virtual ~AndroidAssetArchive(); + + virtual bool hasFile(const Common::String &name); + virtual int listMembers(Common::ArchiveMemberList &list); + virtual Common::ArchiveMemberPtr getMember(const Common::String &name); + virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const; + +private: + jmethodID MID_open; + jmethodID MID_openFd; + jmethodID MID_list; + + jobject _am; +}; + +#endif diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk new file mode 100644 index 0000000000..fdb0ed2ac4 --- /dev/null +++ b/backends/platform/android/module.mk @@ -0,0 +1,85 @@ +MODULE := backends/platform/android + +MODULE_OBJS := \ + android.o asset-archive.o video.o + +MODULE_DIRS += \ + backends/platform/android/ + +# We don't use the rules.mk here on purpose +OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) + +JAVA_SRC = \ + $(MODULE)/org/inodes/gus/scummvm/ScummVM.java \ + $(MODULE)/org/inodes/gus/scummvm/ScummVMApplication.java \ + $(MODULE)/org/inodes/gus/scummvm/ScummVMActivity.java \ + $(MODULE)/org/inodes/gus/scummvm/EditableSurfaceView.java \ + $(MODULE)/org/inodes/gus/scummvm/Unpacker.java \ + $(MODULE)/org/inodes/gus/scummvm/Manifest.java \ + $(MODULE)/org/inodes/gus/scummvm/R.java + +JAVA_PLUGIN_SRC = \ + $(MODULE)/org/inodes/gus/scummvm/PluginProvider.java + +RESOURCES = \ + $(srcdir)/dists/android/res/values/strings.xml \ + $(srcdir)/dists/android/res/layout/main.xml \ + $(srcdir)/dists/android/res/layout/splash.xml \ + $(srcdir)/dists/android/res/drawable/gradient.xml \ + $(srcdir)/dists/android/res/drawable/scummvm.png \ + $(srcdir)/dists/android/res/drawable/scummvm_big.png + +ASSETS = $(DIST_FILES_ENGINEDATA) $(DIST_FILES_THEMES) + +PLUGIN_RESOURCES = \ + $(srcdir)/dists/android/res/values/strings.xml \ + $(srcdir)/dists/android/res/drawable/scummvm.png + +# These must be incremented for each market upload +#ANDROID_VERSIONCODE = 6 Specified in dists/android/AndroidManifest.xml.in +ANDROID_PLUGIN_VERSIONCODE = 6 + +# This library contains scummvm proper +build.tmp/libscummvm.so: $(OBJS) + @$(MKDIR) -p $(@D) + $(CXX) $(PLUGIN_LDFLAGS) -shared $(LDFLAGS) -Wl,-soname,$(@F) -Wl,--no-undefined -o $@ $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LIBS) + + +backends/platform/android/org/inodes/gus/scummvm/R.java backends/platform/android/org/inodes/gus/scummvm/Manifest.java: $(srcdir)/dists/android/AndroidManifest.xml $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR) + $(AAPT) package -m -J backends/platform/android -M $< -S $(srcdir)/dists/android/res -I $(ANDROID_JAR) + +build.tmp/classes/%.class: $(srcdir)/backends/platform/android/%.java $(srcdir)/backends/platform/android/org/inodes/gus/scummvm/R.java + @$(MKDIR) -p $(@D) + $(JAVAC) $(JAVACFLAGS) -cp $(srcdir)/backends/platform/android -d build.tmp/classes -bootclasspath $(ANDROID_JAR) $< + +build.tmp/classes.plugin/%.class: $(srcdir)/backends/platform/android/%.java + @$(MKDIR) -p $(@D) + $(JAVAC) $(JAVACFLAGS) -cp $(srcdir)/backends/platform/android -d build.tmp/classes.plugin -bootclasspath $(ANDROID_JAR) $< + +classes.dex: $(JAVA_SRC:backends/platform/android/%.java=build.tmp/classes/%.class) + $(DX) --dex --output=$@ build.tmp/classes + +build.tmp/plugins/classes.dex: $(JAVA_PLUGIN_SRC:backends/platform/android/%.java=build.tmp/classes.plugin/%.class) + @$(MKDIR) -p $(@D) + $(DX) --dex --output=$@ build.tmp/classes.plugin + +resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) + $(INSTALL) -d build.tmp/assets/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/ + $(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR) -F $@ + +build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR) + $(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR) -F $@ + +build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml: dists/android/mkmanifest.pl configure dists/android/AndroidManifest.xml + dists/android/mkmanifest.pl --id=$* --configure=configure \ + --version-name=$(VERSION) \ + --version-code=$(ANDROID_PLUGIN_VERSIONCODE) \ + --stringres=build.stage/$*/res/values/strings.xml \ + --manifest=build.tmp/$*/AndroidManifest.xml \ + --master-manifest=dists/android/AndroidManifest.xml \ + --unpacklib=mylib/armeabi/lib$*.so + +build.stage/%/res/drawable/scummvm.png: dists/android/res/drawable/scummvm.png + @$(MKDIR) -p $(@D) + $(CP) $< $@ diff --git a/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java b/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java new file mode 100644 index 0000000000..5b71d4a3a5 --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java @@ -0,0 +1,59 @@ +package org.inodes.gus.scummvm; + +import android.content.Context; +import android.text.InputType; +import android.util.AttributeSet; +import android.view.SurfaceView; +import android.view.inputmethod.BaseInputConnection; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputMethodManager; + +public class EditableSurfaceView extends SurfaceView { + public EditableSurfaceView(Context context) { + super(context); + } + + public EditableSurfaceView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public EditableSurfaceView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean onCheckIsTextEditor() { + return true; + } + + private class MyInputConnection extends BaseInputConnection { + public MyInputConnection() { + super(EditableSurfaceView.this, false); + } + + @Override + public boolean performEditorAction(int actionCode) { + if (actionCode == EditorInfo.IME_ACTION_DONE) { + InputMethodManager imm = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(getWindowToken(), 0); + } + return super.performEditorAction(actionCode); // Sends enter key + } + } + + @Override + public InputConnection onCreateInputConnection(EditorInfo outAttrs) { + outAttrs.initialCapsMode = 0; + outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; + outAttrs.inputType = (InputType.TYPE_CLASS_TEXT | + InputType.TYPE_TEXT_VARIATION_NORMAL | + InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); + outAttrs.imeOptions = (EditorInfo.IME_ACTION_DONE | + EditorInfo.IME_FLAG_NO_EXTRACT_UI); + + return new MyInputConnection(); + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/Event.java b/backends/platform/android/org/inodes/gus/scummvm/Event.java new file mode 100644 index 0000000000..f9c7aba93b --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/Event.java @@ -0,0 +1,330 @@ +package org.inodes.gus.scummvm; + +import android.view.KeyEvent; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class Event { + // Common::EventType enum. + // Must be kept in sync with common/events.h + public final static int EVENT_INVALID = 0; + public final static int EVENT_KEYDOWN = 1; + public final static int EVENT_KEYUP = 2; + public final static int EVENT_MOUSEMOVE = 3; + public final static int EVENT_LBUTTONDOWN = 4; + public final static int EVENT_LBUTTONUP = 5; + public final static int EVENT_RBUTTONDOWN = 6; + public final static int EVENT_RBUTTONUP = 7; + public final static int EVENT_WHEELUP = 8; + public final static int EVENT_WHEELDOWN = 9; + public final static int EVENT_QUIT = 10; + public final static int EVENT_SCREEN_CHANGED = 11; + public final static int EVENT_PREDICTIVE_DIALOG = 12; + public final static int EVENT_MBUTTONDOWN = 13; + public final static int EVENT_MBUTTONUP = 14; + public final static int EVENT_MAINMENU = 15; + public final static int EVENT_RTL = 16; + + // common/keyboard.h + public final static int ASCII_F1 = 315; + public final static int ASCII_F2 = 316; + public final static int ASCII_F3 = 317; + public final static int ASCII_F4 = 318; + public final static int ASCII_F5 = 319; + public final static int ASCII_F6 = 320; + public final static int ASCII_F7 = 321; + public final static int ASCII_F8 = 322; + public final static int ASCII_F9 = 323; + public final static int ASCII_F10 = 324; + public final static int ASCII_F11 = 325; + public final static int ASCII_F12 = 326; + public final static int KBD_CTRL = 1 << 0; + public final static int KBD_ALT = 1 << 1; + public final static int KBD_SHIFT = 1 << 2; + + public final static int KEYCODE_INVALID = 0; + public final static int KEYCODE_BACKSPACE = 8; + public final static int KEYCODE_TAB = 9; + public final static int KEYCODE_CLEAR = 12; + public final static int KEYCODE_RETURN = 13; + public final static int KEYCODE_PAUSE = 19; + public final static int KEYCODE_ESCAPE = 27; + public final static int KEYCODE_SPACE = 32; + public final static int KEYCODE_EXCLAIM = 33; + public final static int KEYCODE_QUOTEDBL = 34; + public final static int KEYCODE_HASH = 35; + public final static int KEYCODE_DOLLAR = 36; + public final static int KEYCODE_AMPERSAND = 38; + public final static int KEYCODE_QUOTE = 39; + public final static int KEYCODE_LEFTPAREN = 40; + public final static int KEYCODE_RIGHTPAREN = 41; + public final static int KEYCODE_ASTERISK = 42; + public final static int KEYCODE_PLUS = 43; + public final static int KEYCODE_COMMA = 44; + public final static int KEYCODE_MINUS = 45; + public final static int KEYCODE_PERIOD = 46; + public final static int KEYCODE_SLASH = 47; + public final static int KEYCODE_0 = 48; + public final static int KEYCODE_1 = 49; + public final static int KEYCODE_2 = 50; + public final static int KEYCODE_3 = 51; + public final static int KEYCODE_4 = 52; + public final static int KEYCODE_5 = 53; + public final static int KEYCODE_6 = 54; + public final static int KEYCODE_7 = 55; + public final static int KEYCODE_8 = 56; + public final static int KEYCODE_9 = 57; + public final static int KEYCODE_COLON = 58; + public final static int KEYCODE_SEMICOLON = 59; + public final static int KEYCODE_LESS = 60; + public final static int KEYCODE_EQUALS = 61; + public final static int KEYCODE_GREATER = 62; + public final static int KEYCODE_QUESTION = 63; + public final static int KEYCODE_AT = 64; + public final static int KEYCODE_LEFTBRACKET = 91; + public final static int KEYCODE_BACKSLASH = 92; + public final static int KEYCODE_RIGHTBRACKET = 93; + public final static int KEYCODE_CARET = 94; + public final static int KEYCODE_UNDERSCORE = 95; + public final static int KEYCODE_BACKQUOTE = 96; + public final static int KEYCODE_a = 97; + public final static int KEYCODE_b = 98; + public final static int KEYCODE_c = 99; + public final static int KEYCODE_d = 100; + public final static int KEYCODE_e = 101; + public final static int KEYCODE_f = 102; + public final static int KEYCODE_g = 103; + public final static int KEYCODE_h = 104; + public final static int KEYCODE_i = 105; + public final static int KEYCODE_j = 106; + public final static int KEYCODE_k = 107; + public final static int KEYCODE_l = 108; + public final static int KEYCODE_m = 109; + public final static int KEYCODE_n = 110; + public final static int KEYCODE_o = 111; + public final static int KEYCODE_p = 112; + public final static int KEYCODE_q = 113; + public final static int KEYCODE_r = 114; + public final static int KEYCODE_s = 115; + public final static int KEYCODE_t = 116; + public final static int KEYCODE_u = 117; + public final static int KEYCODE_v = 118; + public final static int KEYCODE_w = 119; + public final static int KEYCODE_x = 120; + public final static int KEYCODE_y = 121; + public final static int KEYCODE_z = 122; + public final static int KEYCODE_DELETE = 127; + // Numeric keypad + public final static int KEYCODE_KP0 = 256; + public final static int KEYCODE_KP1 = 257; + public final static int KEYCODE_KP2 = 258; + public final static int KEYCODE_KP3 = 259; + public final static int KEYCODE_KP4 = 260; + public final static int KEYCODE_KP5 = 261; + public final static int KEYCODE_KP6 = 262; + public final static int KEYCODE_KP7 = 263; + public final static int KEYCODE_KP8 = 264; + public final static int KEYCODE_KP9 = 265; + public final static int KEYCODE_KP_PERIOD = 266; + public final static int KEYCODE_KP_DIVIDE = 267; + public final static int KEYCODE_KP_MULTIPLY = 268; + public final static int KEYCODE_KP_MINUS = 269; + public final static int KEYCODE_KP_PLUS = 270; + public final static int KEYCODE_KP_ENTER = 271; + public final static int KEYCODE_KP_EQUALS = 272; + // Arrows + Home/End pad + public final static int KEYCODE_UP = 273; + public final static int KEYCODE_DOWN = 274; + public final static int KEYCODE_RIGHT = 275; + public final static int KEYCODE_LEFT = 276; + public final static int KEYCODE_INSERT = 277; + public final static int KEYCODE_HOME = 278; + public final static int KEYCODE_END = 279; + public final static int KEYCODE_PAGEUP = 280; + public final static int KEYCODE_PAGEDOWN = 281; + // Function keys + public final static int KEYCODE_F1 = 282; + public final static int KEYCODE_F2 = 283; + public final static int KEYCODE_F3 = 284; + public final static int KEYCODE_F4 = 285; + public final static int KEYCODE_F5 = 286; + public final static int KEYCODE_F6 = 287; + public final static int KEYCODE_F7 = 288; + public final static int KEYCODE_F8 = 289; + public final static int KEYCODE_F9 = 290; + public final static int KEYCODE_F10 = 291; + public final static int KEYCODE_F11 = 292; + public final static int KEYCODE_F12 = 293; + public final static int KEYCODE_F13 = 294; + public final static int KEYCODE_F14 = 295; + public final static int KEYCODE_F15 = 296; + // Key state modifier keys + public final static int KEYCODE_NUMLOCK = 300; + public final static int KEYCODE_CAPSLOCK = 301; + public final static int KEYCODE_SCROLLOCK = 302; + public final static int KEYCODE_RSHIFT = 303; + public final static int KEYCODE_LSHIFT = 304; + public final static int KEYCODE_RCTRL = 305; + public final static int KEYCODE_LCTRL = 306; + public final static int KEYCODE_RALT = 307; + public final static int KEYCODE_LALT = 308; + public final static int KEYCODE_RMETA = 309; + public final static int KEYCODE_LMETA = 310; + public final static int KEYCODE_LSUPER = 311; // Left "Windows" key + public final static int KEYCODE_RSUPER = 312; // Right "Windows" key + public final static int KEYCODE_MODE = 313; // "Alt Gr" key + public final static int KEYCODE_COMPOSE = 314; // Multi-key compose key + // Miscellaneous function keys + public final static int KEYCODE_HELP = 315; + public final static int KEYCODE_PRINT = 316; + public final static int KEYCODE_SYSREQ = 317; + public final static int KEYCODE_BREAK = 318; + public final static int KEYCODE_MENU = 319; + public final static int KEYCODE_POWER = 320; // Power Macintosh power key + public final static int KEYCODE_EURO = 321; // Some european keyboards + public final static int KEYCODE_UNDO = 322; // Atari keyboard has Undo + + // Android KeyEvent keycode -> ScummVM keycode + public final static Map androidKeyMap; + static { + Map map = new HashMap(); + + map.put(KeyEvent.KEYCODE_DEL, KEYCODE_BACKSPACE); + map.put(KeyEvent.KEYCODE_TAB, KEYCODE_TAB); + map.put(KeyEvent.KEYCODE_CLEAR, KEYCODE_CLEAR); + map.put(KeyEvent.KEYCODE_ENTER, KEYCODE_RETURN); + //map.put(??, KEYCODE_PAUSE); + map.put(KeyEvent.KEYCODE_BACK, KEYCODE_ESCAPE); + map.put(KeyEvent.KEYCODE_SPACE, KEYCODE_SPACE); + //map.put(??, KEYCODE_EXCLAIM); + //map.put(??, KEYCODE_QUOTEDBL); + map.put(KeyEvent.KEYCODE_POUND, KEYCODE_HASH); + //map.put(??, KEYCODE_DOLLAR); + //map.put(??, KEYCODE_AMPERSAND); + map.put(KeyEvent.KEYCODE_APOSTROPHE, KEYCODE_QUOTE); + //map.put(??, KEYCODE_LEFTPAREN); + //map.put(??, KEYCODE_RIGHTPAREN); + //map.put(??, KEYCODE_ASTERISK); + map.put(KeyEvent.KEYCODE_PLUS, KEYCODE_PLUS); + map.put(KeyEvent.KEYCODE_COMMA, KEYCODE_COMMA); + map.put(KeyEvent.KEYCODE_MINUS, KEYCODE_MINUS); + map.put(KeyEvent.KEYCODE_PERIOD, KEYCODE_PERIOD); + map.put(KeyEvent.KEYCODE_SLASH, KEYCODE_SLASH); + map.put(KeyEvent.KEYCODE_0, KEYCODE_0); + map.put(KeyEvent.KEYCODE_1, KEYCODE_1); + map.put(KeyEvent.KEYCODE_2, KEYCODE_2); + map.put(KeyEvent.KEYCODE_3, KEYCODE_3); + map.put(KeyEvent.KEYCODE_4, KEYCODE_4); + map.put(KeyEvent.KEYCODE_5, KEYCODE_5); + map.put(KeyEvent.KEYCODE_6, KEYCODE_6); + map.put(KeyEvent.KEYCODE_7, KEYCODE_7); + map.put(KeyEvent.KEYCODE_8, KEYCODE_8); + map.put(KeyEvent.KEYCODE_9, KEYCODE_9); + //map.put(??, KEYCODE_COLON); + map.put(KeyEvent.KEYCODE_SEMICOLON, KEYCODE_SEMICOLON); + //map.put(??, KEYCODE_LESS); + map.put(KeyEvent.KEYCODE_EQUALS, KEYCODE_EQUALS); + //map.put(??, KEYCODE_GREATER); + //map.put(??, KEYCODE_QUESTION); + map.put(KeyEvent.KEYCODE_AT, KEYCODE_AT); + map.put(KeyEvent.KEYCODE_LEFT_BRACKET, KEYCODE_LEFTBRACKET); + map.put(KeyEvent.KEYCODE_BACKSLASH, KEYCODE_BACKSLASH); + map.put(KeyEvent.KEYCODE_RIGHT_BRACKET, KEYCODE_RIGHTBRACKET); + //map.put(??, KEYCODE_CARET); + //map.put(??, KEYCODE_UNDERSCORE); + //map.put(??, KEYCODE_BACKQUOTE); + map.put(KeyEvent.KEYCODE_A, KEYCODE_a); + map.put(KeyEvent.KEYCODE_B, KEYCODE_b); + map.put(KeyEvent.KEYCODE_C, KEYCODE_c); + map.put(KeyEvent.KEYCODE_D, KEYCODE_d); + map.put(KeyEvent.KEYCODE_E, KEYCODE_e); + map.put(KeyEvent.KEYCODE_F, KEYCODE_f); + map.put(KeyEvent.KEYCODE_G, KEYCODE_g); + map.put(KeyEvent.KEYCODE_H, KEYCODE_h); + map.put(KeyEvent.KEYCODE_I, KEYCODE_i); + map.put(KeyEvent.KEYCODE_J, KEYCODE_j); + map.put(KeyEvent.KEYCODE_K, KEYCODE_k); + map.put(KeyEvent.KEYCODE_L, KEYCODE_l); + map.put(KeyEvent.KEYCODE_M, KEYCODE_m); + map.put(KeyEvent.KEYCODE_N, KEYCODE_n); + map.put(KeyEvent.KEYCODE_O, KEYCODE_o); + map.put(KeyEvent.KEYCODE_P, KEYCODE_p); + map.put(KeyEvent.KEYCODE_Q, KEYCODE_q); + map.put(KeyEvent.KEYCODE_R, KEYCODE_r); + map.put(KeyEvent.KEYCODE_S, KEYCODE_s); + map.put(KeyEvent.KEYCODE_T, KEYCODE_t); + map.put(KeyEvent.KEYCODE_U, KEYCODE_u); + map.put(KeyEvent.KEYCODE_V, KEYCODE_v); + map.put(KeyEvent.KEYCODE_W, KEYCODE_w); + map.put(KeyEvent.KEYCODE_X, KEYCODE_x); + map.put(KeyEvent.KEYCODE_Y, KEYCODE_y); + map.put(KeyEvent.KEYCODE_Z, KEYCODE_z); + //map.put(KeyEvent.KEYCODE_DEL, KEYCODE_DELETE); use BACKSPACE instead + //map.put(??, KEYCODE_KP_*); + map.put(KeyEvent.KEYCODE_DPAD_UP, KEYCODE_UP); + map.put(KeyEvent.KEYCODE_DPAD_DOWN, KEYCODE_DOWN); + map.put(KeyEvent.KEYCODE_DPAD_RIGHT, KEYCODE_RIGHT); + map.put(KeyEvent.KEYCODE_DPAD_LEFT, KEYCODE_LEFT); + //map.put(??, KEYCODE_INSERT); + //map.put(??, KEYCODE_HOME); + //map.put(??, KEYCODE_END); + //map.put(??, KEYCODE_PAGEUP); + //map.put(??, KEYCODE_PAGEDOWN); + //map.put(??, KEYCODE_F{1-15}); + map.put(KeyEvent.KEYCODE_NUM, KEYCODE_NUMLOCK); + //map.put(??, KEYCODE_CAPSLOCK); + //map.put(??, KEYCODE_SCROLLLOCK); + map.put(KeyEvent.KEYCODE_SHIFT_RIGHT, KEYCODE_RSHIFT); + map.put(KeyEvent.KEYCODE_SHIFT_LEFT, KEYCODE_LSHIFT); + //map.put(??, KEYCODE_RCTRL); + //map.put(??, KEYCODE_LCTRL); + map.put(KeyEvent.KEYCODE_ALT_RIGHT, KEYCODE_RALT); + map.put(KeyEvent.KEYCODE_ALT_LEFT, KEYCODE_LALT); + // ?? META, SUPER + // ?? MODE, COMPOSE + // ?? HELP, PRINT, SYSREQ, BREAK, EURO, UNDO + map.put(KeyEvent.KEYCODE_MENU, KEYCODE_MENU); + map.put(KeyEvent.KEYCODE_POWER, KEYCODE_POWER); + + androidKeyMap = Collections.unmodifiableMap(map); + } + + public int type; + public boolean synthetic; + public int kbd_keycode; + public int kbd_ascii; + public int kbd_flags; + public int mouse_x; + public int mouse_y; + public boolean mouse_relative; // Used for trackball events + + public Event() { + type = EVENT_INVALID; + synthetic = false; + } + + public Event(int type) { + this.type = type; + synthetic = false; + } + + public static Event KeyboardEvent(int type, int keycode, int ascii, + int flags) { + Event e = new Event(); + e.type = type; + e.kbd_keycode = keycode; + e.kbd_ascii = ascii; + e.kbd_flags = flags; + return e; + } + + public static Event MouseEvent(int type, int x, int y) { + Event e = new Event(); + e.type = type; + e.mouse_x = x; + e.mouse_y = y; + return e; + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java new file mode 100644 index 0000000000..b4035a296b --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java @@ -0,0 +1,52 @@ +package org.inodes.gus.scummvm; + +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; + +import java.util.ArrayList; + +public class PluginProvider extends BroadcastReceiver { + public final static String META_UNPACK_LIB = + "org.inodes.gus.scummvm.meta.UNPACK_LIB"; + + public void onReceive(Context context, Intent intent) { + if (!intent.getAction().equals(ScummVMApplication.ACTION_PLUGIN_QUERY)) + return; + + Bundle extras = getResultExtras(true); + + final ActivityInfo info; + try { + info = context.getPackageManager() + .getReceiverInfo(new ComponentName(context, this.getClass()), + PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + Log.e(this.toString(), "Error finding my own info?", e); + return; + } + + String mylib = info.metaData.getString(META_UNPACK_LIB); + if (mylib != null) { + ArrayList all_libs = + extras.getStringArrayList(ScummVMApplication.EXTRA_UNPACK_LIBS); + + all_libs.add(new Uri.Builder() + .scheme("plugin") + .authority(context.getPackageName()) + .path(mylib) + .toString()); + + extras.putStringArrayList(ScummVMApplication.EXTRA_UNPACK_LIBS, + all_libs); + } + + setResultExtras(extras); + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java new file mode 100644 index 0000000000..bc0c5ef408 --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -0,0 +1,317 @@ +package org.inodes.gus.scummvm; + +import android.content.Context; +import android.content.res.AssetManager; +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioTrack; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; +import javax.microedition.khronos.egl.EGLSurface; + +import java.io.File; +import java.util.concurrent.Semaphore; + + +// At least in Android 2.1, eglCreateWindowSurface() requires an +// EGLNativeWindowSurface object, which is hidden deep in the bowels +// of libui. Until EGL is properly exposed, it's probably safer to +// use the Java versions of most EGL functions :( + +public class ScummVM implements SurfaceHolder.Callback { + private final static String LOG_TAG = "ScummVM.java"; + + private final int AUDIO_FRAME_SIZE = 2 * 2; // bytes. 16bit audio * stereo + public static class AudioSetupException extends Exception {} + + private long nativeScummVM; // native code hangs itself here + boolean scummVMRunning = false; + + private native void create(AssetManager am); + + public ScummVM(Context context) { + create(context.getAssets()); // Init C++ code, set nativeScummVM + } + + private native void nativeDestroy(); + + public synchronized void destroy() { + if (nativeScummVM != 0) { + nativeDestroy(); + nativeScummVM = 0; + } + } + protected void finalize() { + destroy(); + } + + // Surface creation: + // GUI thread: create surface, release lock + // ScummVM thread: acquire lock (block), read surface + // + // Surface deletion: + // GUI thread: post event, acquire lock (block), return + // ScummVM thread: read event, free surface, release lock + // + // In other words, ScummVM thread does this: + // acquire lock + // setup surface + // when SCREEN_CHANGED arrives: + // destroy surface + // release lock + // back to acquire lock + static final int configSpec[] = { + EGL10.EGL_RED_SIZE, 5, + EGL10.EGL_GREEN_SIZE, 5, + EGL10.EGL_BLUE_SIZE, 5, + EGL10.EGL_DEPTH_SIZE, 0, + EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, + EGL10.EGL_NONE, + }; + EGL10 egl; + EGLDisplay eglDisplay = EGL10.EGL_NO_DISPLAY; + EGLConfig eglConfig; + EGLContext eglContext = EGL10.EGL_NO_CONTEXT; + EGLSurface eglSurface = EGL10.EGL_NO_SURFACE; + Semaphore surfaceLock = new Semaphore(0, true); + SurfaceHolder nativeSurface; + + public void surfaceCreated(SurfaceHolder holder) { + nativeSurface = holder; + surfaceLock.release(); + } + + public void surfaceChanged(SurfaceHolder holder, int format, + int width, int height) { + // Disabled while I debug GL problems + //pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); + } + + public void surfaceDestroyed(SurfaceHolder holder) { + pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); + try { + surfaceLock.acquire(); + } catch (InterruptedException e) { + Log.e(this.toString(), + "Interrupted while waiting for surface lock", e); + } + } + + // Called by ScummVM thread (from initBackend) + private void createScummVMGLContext() { + egl = (EGL10)EGLContext.getEGL(); + eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + int[] version = new int[2]; + egl.eglInitialize(eglDisplay, version); + int[] num_config = new int[1]; + egl.eglChooseConfig(eglDisplay, configSpec, null, 0, num_config); + + final int numConfigs = num_config[0]; + if (numConfigs <= 0) + throw new IllegalArgumentException("No configs match configSpec"); + + EGLConfig[] configs = new EGLConfig[numConfigs]; + egl.eglChooseConfig(eglDisplay, configSpec, configs, numConfigs, + num_config); + eglConfig = configs[0]; + + eglContext = egl.eglCreateContext(eglDisplay, eglConfig, + EGL10.EGL_NO_CONTEXT, null); + } + + // Called by ScummVM thread + protected void setupScummVMSurface() { + try { + surfaceLock.acquire(); + } catch (InterruptedException e) { + Log.e(this.toString(), + "Interrupted while waiting for surface lock", e); + return; + } + eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, + nativeSurface, null); + egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); + } + + // Called by ScummVM thread + protected void destroyScummVMSurface() { + if (eglSurface != null) { + egl.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + egl.eglDestroySurface(eglDisplay, eglSurface); + eglSurface = EGL10.EGL_NO_SURFACE; + } + + surfaceLock.release(); + } + + public void setSurface(SurfaceHolder holder) { + holder.addCallback(this); + } + + // Set scummvm config options + final public native static void loadConfigFile(String path); + final public native static void setConfMan(String key, int value); + final public native static void setConfMan(String key, String value); + + // Feed an event to ScummVM. Safe to call from other threads. + final public native void pushEvent(Event e); + + final private native void audioMixCallback(byte[] buf); + + // Runs the actual ScummVM program and returns when it does. + // This should not be called from multiple threads simultaneously... + final public native int scummVMMain(String[] argv); + + // Callbacks from C++ peer instance + //protected GraphicsMode[] getSupportedGraphicsModes() {} + protected void displayMessageOnOSD(String msg) {} + protected void setWindowCaption(String caption) {} + protected void showVirtualKeyboard(boolean enable) {} + protected String[] getSysArchives() { return new String[0]; } + protected String[] getPluginDirectories() { return new String[0]; } + protected void initBackend() throws AudioSetupException { + createScummVMGLContext(); + initAudio(); + } + + private static class AudioThread extends Thread { + final private int buf_size; + private boolean is_paused = false; + final private ScummVM scummvm; + final private AudioTrack audio_track; + + AudioThread(ScummVM scummvm, AudioTrack audio_track, int buf_size) { + super("AudioThread"); + this.scummvm = scummvm; + this.audio_track = audio_track; + this.buf_size = buf_size; + setPriority(Thread.MAX_PRIORITY); + setDaemon(true); + } + + public void pauseAudio() { + synchronized (this) { + is_paused = true; + } + audio_track.pause(); + } + + public void resumeAudio() { + synchronized (this) { + is_paused = false; + notifyAll(); + } + audio_track.play(); + } + + public void run() { + byte[] buf = new byte[buf_size]; + audio_track.play(); + int offset = 0; + try { + while (true) { + synchronized (this) { + while (is_paused) + wait(); + } + + if (offset == buf.length) { + // Grab new audio data + scummvm.audioMixCallback(buf); + offset = 0; + } + int len = buf.length - offset; + int ret = audio_track.write(buf, offset, len); + if (ret < 0) { + Log.w(LOG_TAG, String.format( + "AudioTrack.write(%dB) returned error %d", + buf.length, ret)); + break; + } else if (ret != len) { + Log.w(LOG_TAG, String.format( + "Short audio write. Wrote %dB, not %dB", + ret, buf.length)); + // Buffer is full, so yield cpu for a while + Thread.sleep(100); + } + offset += ret; + } + } catch (InterruptedException e) { + Log.e(this.toString(), "Audio thread interrupted", e); + } + } + } + private AudioThread audio_thread; + + final public int audioSampleRate() { + return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC); + } + + private void initAudio() throws AudioSetupException { + int sample_rate = audioSampleRate(); + int buf_size = + AudioTrack.getMinBufferSize(sample_rate, + AudioFormat.CHANNEL_CONFIGURATION_STEREO, + AudioFormat.ENCODING_PCM_16BIT); + if (buf_size < 0) { + int guess = AUDIO_FRAME_SIZE * sample_rate / 100; // 10ms of audio + Log.w(LOG_TAG, String.format( + "Unable to get min audio buffer size (error %d). Guessing %dB.", + buf_size, guess)); + buf_size = guess; + } + Log.d(LOG_TAG, String.format("Using %dB buffer for %dHZ audio", + buf_size, sample_rate)); + AudioTrack audio_track = + new AudioTrack(AudioManager.STREAM_MUSIC, + sample_rate, + AudioFormat.CHANNEL_CONFIGURATION_STEREO, + AudioFormat.ENCODING_PCM_16BIT, + buf_size, + AudioTrack.MODE_STREAM); + if (audio_track.getState() != AudioTrack.STATE_INITIALIZED) { + Log.e(LOG_TAG, "Error initialising Android audio system."); + throw new AudioSetupException(); + } + + audio_thread = new AudioThread(this, audio_track, buf_size); + audio_thread.start(); + } + + public void pause() { + audio_thread.pauseAudio(); + // TODO: need to pause engine too + } + + public void resume() { + // TODO: need to resume engine too + audio_thread.resumeAudio(); + } + + static { + // For grabbing with gdb... + final boolean sleep_for_debugger = false; + if (sleep_for_debugger) { + try { + Thread.sleep(20*1000); + } catch (InterruptedException e) { + } + } + + //System.loadLibrary("scummvm"); + File cache_dir = ScummVMApplication.getLastCacheDir(); + String libname = System.mapLibraryName("scummvm"); + File libpath = new File(cache_dir, libname); + System.load(libpath.getPath()); + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java new file mode 100644 index 0000000000..29e1eba3d3 --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java @@ -0,0 +1,446 @@ +package org.inodes.gus.scummvm; + +import android.app.AlertDialog; +import android.app.Activity; +import android.content.DialogInterface; +import android.content.res.Configuration; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.inputmethod.InputMethodManager; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewConfiguration; +import android.widget.Toast; + +import java.io.IOException; + +public class ScummVMActivity extends Activity { + private boolean _do_right_click; + private boolean _last_click_was_right; + + // game pixels to move per trackball/dpad event. + // FIXME: replace this with proper mouse acceleration + private final static int TRACKBALL_SCALE = 2; + + private class MyScummVM extends ScummVM { + private boolean scummvmRunning = false; + + public MyScummVM() { + super(ScummVMActivity.this); + } + + @Override + protected void initBackend() throws ScummVM.AudioSetupException { + synchronized (this) { + scummvmRunning = true; + notifyAll(); + } + super.initBackend(); + } + + public void waitUntilRunning() throws InterruptedException { + synchronized (this) { + while (!scummvmRunning) + wait(); + } + } + + @Override + protected void displayMessageOnOSD(String msg) { + Log.i(this.toString(), "OSD: " + msg); + Toast.makeText(ScummVMActivity.this, msg, Toast.LENGTH_LONG).show(); + } + + @Override + protected void setWindowCaption(final String caption) { + runOnUiThread(new Runnable() { + public void run() { + setTitle(caption); + } + }); + } + + @Override + protected String[] getPluginDirectories() { + String[] dirs = new String[1]; + dirs[0] = ScummVMApplication.getLastCacheDir().getPath(); + return dirs; + } + + @Override + protected void showVirtualKeyboard(final boolean enable) { + if (getResources().getConfiguration().keyboard == + Configuration.KEYBOARD_NOKEYS) { + runOnUiThread(new Runnable() { + public void run() { + showKeyboard(enable); + } + }); + } + } + } + private MyScummVM scummvm; + private Thread scummvm_thread; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + _do_right_click = false; + setVolumeControlStream(AudioManager.STREAM_MUSIC); + + setContentView(R.layout.main); + takeKeyEvents(true); + + // This is a common enough error that we should warn about it + // explicitly. + if (!Environment.getExternalStorageDirectory().canRead()) { + new AlertDialog.Builder(this) + .setTitle(R.string.no_sdcard_title) + .setIcon(android.R.drawable.ic_dialog_alert) + .setMessage(R.string.no_sdcard) + .setNegativeButton(R.string.quit, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + finish(); + } + }) + .show(); + return; + } + + SurfaceView main_surface = (SurfaceView)findViewById(R.id.main_surface); + main_surface.setOnTouchListener(new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + return onTouchEvent(event); + } + }); + main_surface.setOnKeyListener(new View.OnKeyListener() { + public boolean onKey(View v, int code, KeyEvent ev) { + return onKeyDown(code, ev); + } + }); + main_surface.requestFocus(); + + // Start ScummVM + scummvm = new MyScummVM(); + scummvm_thread = new Thread(new Runnable() { + public void run() { + try { + runScummVM(); + } catch (Exception e) { + Log.e("ScummVM", "Fatal error in ScummVM thread", e); + new AlertDialog.Builder(ScummVMActivity.this) + .setTitle("Error") + .setMessage(e.toString()) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + finish(); + } + } + }, "ScummVM"); + scummvm_thread.start(); + + // Block UI thread until ScummVM has started. In particular, + // this means that surface and event callbacks should be safe + // after this point. + try { + scummvm.waitUntilRunning(); + } catch (InterruptedException e) { + Log.e(this.toString(), + "Interrupted while waiting for ScummVM.initBackend", e); + finish(); + } + + scummvm.setSurface(main_surface.getHolder()); + } + + // Runs in another thread + private void runScummVM() throws IOException { + getFilesDir().mkdirs(); + String[] args = { + "ScummVM-lib", + "--config=" + getFileStreamPath("scummvmrc").getPath(), + "--path=" + Environment.getExternalStorageDirectory().getPath(), + "--gui-theme=scummmodern", + "--savepath=" + getDir("saves", 0).getPath(), + }; + + int ret = scummvm.scummVMMain(args); + + // On exit, tear everything down for a fresh + // restart next time. + System.exit(ret); + } + + private boolean was_paused = false; + + @Override + public void onPause() { + if (scummvm != null) { + was_paused = true; + scummvm.pause(); + } + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + if (scummvm != null && was_paused) + scummvm.resume(); + was_paused = false; + } + + @Override + public void onStop() { + if (scummvm != null) { + scummvm.pushEvent(new Event(Event.EVENT_QUIT)); + try { + scummvm_thread.join(1000); // 1s timeout + } catch (InterruptedException e) { + Log.i(this.toString(), + "Error while joining ScummVM thread", e); + } + } + super.onStop(); + } + + static final int MSG_MENU_LONG_PRESS = 1; + private final Handler keycodeMenuTimeoutHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + if (msg.what == MSG_MENU_LONG_PRESS) { + InputMethodManager imm = (InputMethodManager) + getSystemService(INPUT_METHOD_SERVICE); + if (imm != null) + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + } + } + }; + + @Override + public boolean onKeyUp(int keyCode, KeyEvent kevent) { + return onKeyDown(keyCode, kevent); + } + + @Override + public boolean onKeyMultiple(int keyCode, int repeatCount, + KeyEvent kevent) { + return onKeyDown(keyCode, kevent); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent kevent) { + // Filter out "special" keys + switch (keyCode) { + case KeyEvent.KEYCODE_MENU: + // Have to reimplement hold-down-menu-brings-up-softkeybd + // ourselves, since we are otherwise hijacking the menu + // key :( + // See com.android.internal.policy.impl.PhoneWindow.onKeyDownPanel() + // for the usual Android implementation of this feature. + if (kevent.getRepeatCount() > 0) + // Ignore keyrepeat for menu + return false; + boolean timeout_fired = false; + if (getResources().getConfiguration().keyboard == + Configuration.KEYBOARD_NOKEYS) { + timeout_fired = !keycodeMenuTimeoutHandler.hasMessages(MSG_MENU_LONG_PRESS); + keycodeMenuTimeoutHandler.removeMessages(MSG_MENU_LONG_PRESS); + if (kevent.getAction() == KeyEvent.ACTION_DOWN) { + keycodeMenuTimeoutHandler.sendMessageDelayed( + keycodeMenuTimeoutHandler.obtainMessage(MSG_MENU_LONG_PRESS), + ViewConfiguration.getLongPressTimeout()); + return true; + } + } + if (kevent.getAction() == KeyEvent.ACTION_UP) { + if (!timeout_fired) + scummvm.pushEvent(new Event(Event.EVENT_MAINMENU)); + return true; + } + return false; + case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_SEARCH: + _do_right_click = (kevent.getAction() == KeyEvent.ACTION_DOWN); + return true; + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: { + // HTC Hero doesn't seem to generate + // MotionEvent.ACTION_DOWN events on trackball press :( + // We'll have to just fake one here. + // Some other handsets lack a trackball, so the DPAD is + // the only way of moving the cursor. + int motion_action; + // FIXME: this logic is a mess. + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { + switch (kevent.getAction()) { + case KeyEvent.ACTION_DOWN: + motion_action = MotionEvent.ACTION_DOWN; + break; + case KeyEvent.ACTION_UP: + motion_action = MotionEvent.ACTION_UP; + break; + default: // ACTION_MULTIPLE + return false; + } + } else + motion_action = MotionEvent.ACTION_MOVE; + + Event e = new Event(getEventType(motion_action)); + e.mouse_x = 0; + e.mouse_y = 0; + e.mouse_relative = true; + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_UP: + e.mouse_y = -TRACKBALL_SCALE; + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + e.mouse_y = TRACKBALL_SCALE; + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + e.mouse_x = -TRACKBALL_SCALE; + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + e.mouse_x = TRACKBALL_SCALE; + break; + } + scummvm.pushEvent(e); + return true; + } + case KeyEvent.KEYCODE_BACK: + // skip isSystem() check and fall through to main code + break; + default: + if (kevent.isSystem()) + return false; + } + + // FIXME: what do I need to do for composed characters? + + Event e = new Event(); + + switch (kevent.getAction()) { + case KeyEvent.ACTION_DOWN: + e.type = Event.EVENT_KEYDOWN; + e.synthetic = false; + break; + case KeyEvent.ACTION_UP: + e.type = Event.EVENT_KEYUP; + e.synthetic = false; + break; + case KeyEvent.ACTION_MULTIPLE: + // e.type is handled below + e.synthetic = true; + break; + default: + return false; + } + + e.kbd_keycode = Event.androidKeyMap.containsKey(keyCode) ? + Event.androidKeyMap.get(keyCode) : Event.KEYCODE_INVALID; + e.kbd_ascii = kevent.getUnicodeChar(); + if (e.kbd_ascii == 0) + e.kbd_ascii = e.kbd_keycode; // scummvm keycodes are mostly ascii + + + e.kbd_flags = 0; + if (kevent.isAltPressed()) + e.kbd_flags |= Event.KBD_ALT; + if (kevent.isSymPressed()) // no ctrl key in android, so use sym (?) + e.kbd_flags |= Event.KBD_CTRL; + if (kevent.isShiftPressed()) { + if (keyCode >= KeyEvent.KEYCODE_0 && + keyCode <= KeyEvent.KEYCODE_9) { + // Shift+number -> convert to F* key + int offset = keyCode == KeyEvent.KEYCODE_0 ? + 10 : keyCode - KeyEvent.KEYCODE_1; // turn 0 into 10 + e.kbd_keycode = Event.KEYCODE_F1 + offset; + e.kbd_ascii = Event.ASCII_F1 + offset; + } else + e.kbd_flags |= Event.KBD_SHIFT; + } + + if (kevent.getAction() == KeyEvent.ACTION_MULTIPLE) { + for (int i = 0; i <= kevent.getRepeatCount(); i++) { + e.type = Event.EVENT_KEYDOWN; + scummvm.pushEvent(e); + e.type = Event.EVENT_KEYUP; + scummvm.pushEvent(e); + } + } else + scummvm.pushEvent(e); + + return true; + } + + private int getEventType(int action) { + switch (action) { + case MotionEvent.ACTION_DOWN: + _last_click_was_right = _do_right_click; + return _last_click_was_right ? + Event.EVENT_RBUTTONDOWN : Event.EVENT_LBUTTONDOWN; + case MotionEvent.ACTION_UP: + return _last_click_was_right ? + Event.EVENT_RBUTTONUP : Event.EVENT_LBUTTONUP; + case MotionEvent.ACTION_MOVE: + return Event.EVENT_MOUSEMOVE; + default: + return Event.EVENT_INVALID; + } + } + + @Override + public boolean onTrackballEvent(MotionEvent event) { + int type = getEventType(event.getAction()); + if (type == Event.EVENT_INVALID) + return false; + + Event e = new Event(type); + e.mouse_x = + (int)(event.getX() * event.getXPrecision()) * TRACKBALL_SCALE; + e.mouse_y = + (int)(event.getY() * event.getYPrecision()) * TRACKBALL_SCALE; + e.mouse_relative = true; + scummvm.pushEvent(e); + + return true; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + int type = getEventType(event.getAction()); + if (type == Event.EVENT_INVALID) + return false; + + Event e = new Event(type); + e.mouse_x = (int)event.getX(); + e.mouse_y = (int)event.getY(); + e.mouse_relative = false; + scummvm.pushEvent(e); + + return true; + } + + private void showKeyboard(boolean show) { + SurfaceView main_surface = (SurfaceView)findViewById(R.id.main_surface); + InputMethodManager imm = (InputMethodManager) + getSystemService(INPUT_METHOD_SERVICE); + if (show) + imm.showSoftInput(main_surface, InputMethodManager.SHOW_IMPLICIT); + else + imm.hideSoftInputFromWindow(main_surface.getWindowToken(), + InputMethodManager.HIDE_IMPLICIT_ONLY); + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java new file mode 100644 index 0000000000..37a9d09e1a --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java @@ -0,0 +1,29 @@ +package org.inodes.gus.scummvm; + +import android.app.Application; + +import java.io.File; + +public class ScummVMApplication extends Application { + public final static String ACTION_PLUGIN_QUERY = "org.inodes.gus.scummvm.action.PLUGIN_QUERY"; + public final static String EXTRA_UNPACK_LIBS = "org.inodes.gus.scummvm.extra.UNPACK_LIBS"; + + private static File cache_dir; + + @Override + public void onCreate() { + super.onCreate(); + // This is still on /data :( + cache_dir = getCacheDir(); + // This is mounted noexec :( + //cache_dir = new File(Environment.getExternalStorageDirectory(), + // "/.ScummVM.tmp"); + // This is owned by download manager and requires special + // permissions to access :( + //cache_dir = Environment.getDownloadCacheDirectory(); + } + + public static File getLastCacheDir() { + return cache_dir; + } +} diff --git a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java new file mode 100644 index 0000000000..efa3e1d2ef --- /dev/null +++ b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java @@ -0,0 +1,370 @@ +package org.inodes.gus.scummvm; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.widget.ProgressBar; + +import java.io.IOException; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.zip.ZipFile; +import java.util.zip.ZipEntry; + +public class Unpacker extends Activity { + private final static String META_NEXT_ACTIVITY = + "org.inodes.gus.unpacker.nextActivity"; + private ProgressBar mProgress; + private File mUnpackDest; // location to unpack into + private AsyncTask mUnpacker; + private final static int REQUEST_MARKET = 1; + + private static class UnpackJob { + public ZipFile zipfile; + public Set paths; + + public UnpackJob(ZipFile zipfile, Set paths) { + this.zipfile = zipfile; + this.paths = paths; + } + + public long UnpackSize() { + long size = 0; + for (String path: paths) { + ZipEntry entry = zipfile.getEntry(path); + if (entry != null) size += entry.getSize(); + } + return size; + } + } + + private class UnpackTask extends AsyncTask { + @Override + protected void onProgressUpdate(Integer... progress) { + mProgress.setIndeterminate(false); + mProgress.setMax(progress[1]); + mProgress.setProgress(progress[0]); + mProgress.postInvalidate(); + } + + @Override + protected void onPostExecute(Void result) { + Bundle md = getMetaData(); + String nextActivity = md.getString(META_NEXT_ACTIVITY); + if (nextActivity != null) { + final ComponentName cn = + ComponentName.unflattenFromString(nextActivity); + if (cn != null) { + final Intent origIntent = getIntent(); + Intent intent = new Intent(); + intent.setPackage(origIntent.getPackage()); + intent.setComponent(cn); + if (origIntent.getExtras() != null) + intent.putExtras(origIntent.getExtras()); + intent.putExtra(Intent.EXTRA_INTENT, origIntent); + intent.setDataAndType(origIntent.getData(), + origIntent.getType()); + //intent.fillIn(getIntent(), 0); + intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); + Log.i(this.toString(), + "Starting next activity with intent " + intent); + startActivity(intent); + } else { + Log.w(this.toString(), + "Unable to extract a component name from " + nextActivity); + } + } + + finish(); + } + + @Override + protected Void doInBackground(String... all_libs) { + // This will contain all unpack jobs + Map unpack_jobs = + new HashMap(all_libs.length); + + // This will contain all unpack filenames (so we can + // detect stale files in the unpack directory) + Set all_files = new HashSet(all_libs.length); + + for (String lib: all_libs) { + final Uri uri = Uri.parse(lib); + final String pkg = uri.getAuthority(); + final String path = uri.getPath().substring(1); // skip first / + + all_files.add(new File(path).getName()); + + UnpackJob job = unpack_jobs.get(pkg); + if (job == null) { + try { + // getPackageResourcePath is hidden in Context, + // but exposed in ContextWrapper... + ContextWrapper context = + new ContextWrapper(createPackageContext(pkg, 0)); + ZipFile zipfile = + new ZipFile(context.getPackageResourcePath()); + job = new UnpackJob(zipfile, new HashSet(1)); + } catch (PackageManager.NameNotFoundException e) { + Log.e(this.toString(), "Package " + pkg + + " not found", e); + continue; + } catch (IOException e) { + // FIXME: show some sort of GUI error dialog + Log.e(this.toString(), + "Error opening ZIP for package " + pkg, e); + continue; + } + unpack_jobs.put(pkg, job); + } + job.paths.add(path); + } + + // Delete stale filenames from mUnpackDest + for (File file: mUnpackDest.listFiles()) { + if (!all_files.contains(file.getName())) { + Log.i(this.toString(), + "Deleting stale cached file " + file); + file.delete(); + } + } + + int total_size = 0; + for (UnpackJob job: unpack_jobs.values()) + total_size += job.UnpackSize(); + + publishProgress(0, total_size); + + mUnpackDest.mkdirs(); + + int progress = 0; + + for (UnpackJob job: unpack_jobs.values()) { + try { + ZipFile zipfile = job.zipfile; + for (String path: job.paths) { + ZipEntry zipentry = zipfile.getEntry(path); + if (zipentry == null) + throw new FileNotFoundException( + "Couldn't find " + path + " in zip"); + File dest = new File(mUnpackDest, new File(path).getName()); + if (dest.exists() && + dest.lastModified() == zipentry.getTime() && + dest.length() == zipentry.getSize()) { + // Already unpacked + progress += zipentry.getSize(); + } else { + if (dest.exists()) + Log.d(this.toString(), + "Replacing " + dest.getPath() + + " old.mtime=" + dest.lastModified() + + " new.mtime=" + zipentry.getTime() + + " old.size=" + dest.length() + + " new.size=" + zipentry.getSize()); + else + Log.i(this.toString(), + "Extracting " + zipentry.getName() + + " from " + zipfile.getName() + + " to " + dest.getPath()); + + long next_update = progress; + + InputStream in = zipfile.getInputStream(zipentry); + OutputStream out = new FileOutputStream(dest); + int len; + byte[] buffer = new byte[4096]; + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + progress += len; + if (progress >= next_update) { + publishProgress(progress, total_size); + // Arbitrary limit of 2% update steps + next_update += total_size / 50; + } + } + + in.close(); + out.close(); + dest.setLastModified(zipentry.getTime()); + } + publishProgress(progress, total_size); + } + + zipfile.close(); + } catch (IOException e) { + // FIXME: show some sort of GUI error dialog + Log.e(this.toString(), "Error unpacking plugin", e); + } + } + + if (progress != total_size) + Log.d(this.toString(), "Ended with progress " + progress + + " != total size " + total_size); + + setResult(RESULT_OK); + + return null; + } + } + + private class PluginBroadcastReciever extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (!intent.getAction() + .equals(ScummVMApplication.ACTION_PLUGIN_QUERY)) { + Log.e(this.toString(), + "Received unexpected action " + intent.getAction()); + return; + } + + Bundle extras = getResultExtras(false); + if (extras == null) { + // Nothing for us to do. + Unpacker.this.setResult(RESULT_OK); + finish(); + } + + ArrayList unpack_libs = + extras.getStringArrayList(ScummVMApplication.EXTRA_UNPACK_LIBS); + + if (unpack_libs != null && !unpack_libs.isEmpty()) { + final String[] libs = + unpack_libs.toArray(new String[unpack_libs.size()]); + mUnpacker = new UnpackTask().execute(libs); + } + } + } + + private void initPlugins() { + Bundle extras = new Bundle(1); + + ArrayList unpack_libs = new ArrayList(1); + // This is the common ScummVM code (not really a "plugin" as such) + unpack_libs.add(new Uri.Builder() + .scheme("plugin") + .authority(getPackageName()) + .path("mylib/armeabi/libscummvm.so") + .toString()); + extras.putStringArrayList(ScummVMApplication.EXTRA_UNPACK_LIBS, + unpack_libs); + + Intent intent = new Intent(ScummVMApplication.ACTION_PLUGIN_QUERY); + sendOrderedBroadcast(intent, Manifest.permission.SCUMMVM_PLUGIN, + new PluginBroadcastReciever(), + null, RESULT_OK, null, extras); + } + + @Override + public void onCreate(Bundle b) { + super.onCreate(b); + + mUnpackDest = ScummVMApplication.getLastCacheDir(); + + setContentView(R.layout.splash); + mProgress = (ProgressBar)findViewById(R.id.progress); + + setResult(RESULT_CANCELED); + + tryUnpack(); + } + + private void tryUnpack() { + Intent intent = new Intent(ScummVMApplication.ACTION_PLUGIN_QUERY); + List plugins = getPackageManager() + .queryBroadcastReceivers(intent, 0); + if (plugins.isEmpty()) { + // No plugins installed + AlertDialog.Builder alert = new AlertDialog.Builder(this) + .setTitle(R.string.no_plugins_title) + .setMessage(R.string.no_plugins_found) + .setIcon(android.R.drawable.ic_dialog_alert) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + finish(); + } + }) + .setNegativeButton(R.string.quit, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + + final Uri uri = Uri.parse("market://search?q=ScummVM plugin"); + final Intent market_intent = new Intent(Intent.ACTION_VIEW, uri); + if (getPackageManager().resolveActivity(market_intent, 0) != null) { + alert.setPositiveButton(R.string.to_market, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + try { + startActivityForResult(market_intent, + REQUEST_MARKET); + } catch (ActivityNotFoundException e) { + Log.e(this.toString(), + "Error starting market", e); + } + } + }); + } + + alert.show(); + + } else { + // Already have at least one plugin installed + initPlugins(); + } + } + + @Override + public void onStop() { + if (mUnpacker != null) + mUnpacker.cancel(true); + super.onStop(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, + Intent data) { + switch (requestCode) { + case REQUEST_MARKET: + if (resultCode != RESULT_OK) + Log.w(this.toString(), "Market returned " + resultCode); + tryUnpack(); + break; + } + } + + private Bundle getMetaData() { + try { + ActivityInfo ai = getPackageManager() + .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); + return ai.metaData; + } catch (PackageManager.NameNotFoundException e) { + Log.w(this.toString(), "Unable to find my own meta-data", e); + return new Bundle(); + } + } +} diff --git a/backends/platform/android/scummvm-android-themeengine.patch b/backends/platform/android/scummvm-android-themeengine.patch new file mode 100644 index 0000000000..1eafe7fb62 --- /dev/null +++ b/backends/platform/android/scummvm-android-themeengine.patch @@ -0,0 +1,135 @@ +diff -r 884e66fd1b9c gui/ThemeEngine.cpp +--- a/gui/ThemeEngine.cpp Tue Apr 13 09:30:52 2010 +1000 ++++ b/gui/ThemeEngine.cpp Fri May 28 23:24:43 2010 +1000 +@@ -390,21 +390,19 @@ + + // Try to create a Common::Archive with the files of the theme. + if (!_themeArchive && !_themeFile.empty()) { +- Common::FSNode node(_themeFile); +- if (node.getName().hasSuffix(".zip") && !node.isDirectory()) { ++ Common::ArchiveMemberPtr member = SearchMan.getMember(_themeFile); ++ if (member && member->getName().hasSuffix(".zip")) { + #ifdef USE_ZLIB +- Common::Archive *zipArchive = Common::makeZipArchive(node); ++ Common::Archive *zipArchive = Common::makeZipArchive(member->createReadStream()); + + if (!zipArchive) { +- warning("Failed to open Zip archive '%s'.", node.getPath().c_str()); ++ warning("Failed to open Zip archive '%s'.", member->getDisplayName().c_str()); + } + _themeArchive = zipArchive; + #else + warning("Trying to load theme '%s' in a Zip archive without zLib support", _themeFile.c_str()); + return false; + #endif +- } else if (node.isDirectory()) { +- _themeArchive = new Common::FSDirectory(node); + } + } + +@@ -1436,6 +1434,30 @@ + return tok.empty(); + } + ++bool ThemeEngine::themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName) { ++ Common::File stream; ++ bool foundHeader = false; ++ ++ if (member.getName().hasSuffix(".zip")) { ++#ifdef USE_ZLIB ++ Common::Archive *zipArchive = Common::makeZipArchive(member.createReadStream()); ++ ++ if (zipArchive && zipArchive->hasFile("THEMERC")) { ++ stream.open("THEMERC", *zipArchive); ++ } ++ ++ delete zipArchive; ++#endif ++ } ++ ++ if (stream.isOpen()) { ++ Common::String stxHeader = stream.readLine(); ++ foundHeader = themeConfigParseHeader(stxHeader, themeName); ++ } ++ ++ return foundHeader; ++} ++ + bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String &themeName) { + Common::File stream; + bool foundHeader = false; +@@ -1493,10 +1515,6 @@ + if (ConfMan.hasKey("themepath")) + listUsableThemes(Common::FSNode(ConfMan.get("themepath")), list); + +-#ifdef DATA_PATH +- listUsableThemes(Common::FSNode(DATA_PATH), list); +-#endif +- + #if defined(MACOSX) || defined(IPHONE) + CFURLRef resourceUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); + if (resourceUrl) { +@@ -1509,10 +1527,7 @@ + } + #endif + +- if (ConfMan.hasKey("extrapath")) +- listUsableThemes(Common::FSNode(ConfMan.get("extrapath")), list); +- +- listUsableThemes(Common::FSNode("."), list, 1); ++ listUsableThemes(SearchMan, list); + + // Now we need to strip all duplicates + // TODO: It might not be the best idea to strip duplicates. The user might +@@ -1531,6 +1546,34 @@ + output.clear(); + } + ++void ThemeEngine::listUsableThemes(Common::Archive &archive, Common::List &list) { ++ ThemeDescriptor td; ++ ++#ifdef USE_ZLIB ++ Common::ArchiveMemberList fileList; ++ archive.listMatchingMembers(fileList, "*.zip"); ++ for (Common::ArchiveMemberList::iterator i = fileList.begin(); ++ i != fileList.end(); ++i) { ++ td.name.clear(); ++ if (themeConfigUsable(**i, td.name)) { ++ td.filename = (*i)->getName(); ++ td.id = (*i)->getDisplayName(); ++ ++ // If the name of the node object also contains ++ // the ".zip" suffix, we will strip it. ++ if (td.id.hasSuffix(".zip")) { ++ for (int j = 0; j < 4; ++j) ++ td.id.deleteLastChar(); ++ } ++ ++ list.push_back(td); ++ } ++ } ++ ++ fileList.clear(); ++#endif ++} ++ + void ThemeEngine::listUsableThemes(const Common::FSNode &node, Common::List &list, int depth) { + if (!node.exists() || !node.isReadable() || !node.isDirectory()) + return; +diff -r 884e66fd1b9c gui/ThemeEngine.h +--- a/gui/ThemeEngine.h Tue Apr 13 09:30:52 2010 +1000 ++++ b/gui/ThemeEngine.h Fri May 28 23:24:43 2010 +1000 +@@ -560,11 +560,13 @@ + static void listUsableThemes(Common::List &list); + private: + static bool themeConfigUsable(const Common::FSNode &node, Common::String &themeName); ++ static bool themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName); + static bool themeConfigParseHeader(Common::String header, Common::String &themeName); + + static Common::String getThemeFile(const Common::String &id); + static Common::String getThemeId(const Common::String &filename); + static void listUsableThemes(const Common::FSNode &node, Common::List &list, int depth = -1); ++ static void listUsableThemes(Common::Archive &archive, Common::List &list); + + protected: + OSystem *_system; /** Global system object. */ diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 207ff79c4c..1c548d3f50 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -51,7 +51,7 @@ static const char USAGE_STRING[] = ; // DONT FIXME: DO NOT ORDER ALPHABETICALLY, THIS IS ORDERED BY IMPORTANCE/CATEGORY! :) -#if defined(PALMOS_MODE) || defined(__SYMBIAN32__) || defined(__GP32__) +#if defined(PALMOS_MODE) || defined(__SYMBIAN32__) || defined(__GP32__) || defined(ANDROID) static const char HELP_STRING[] = "NoUsageString"; // save more data segment space #else static const char HELP_STRING[] = @@ -948,7 +948,7 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin // environment variable. This is weaker than a --savepath on the // command line, but overrides the default savepath, hence it is // handled here, just before the command line gets parsed. -#if !defined(MACOS_CARBON) && !defined(_WIN32_WCE) && !defined(PALMOS_MODE) && !defined(__GP32__) +#if !defined(MACOS_CARBON) && !defined(_WIN32_WCE) && !defined(PALMOS_MODE) && !defined(__GP32__) && !defined(ANDROID) if (!settings.contains("savepath")) { const char *dir = getenv("SCUMMVM_SAVEPATH"); if (dir && *dir && strlen(dir) < MAXPATHLEN) { diff --git a/common/textconsole.cpp b/common/textconsole.cpp index eef58fa39c..87ba55ebf1 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -43,6 +43,10 @@ extern bool isSmartphone(); #define fputs(str, file) DS::std_fwrite(str, strlen(str), 1, file) #endif +#ifdef ANDROID + #include +#endif + namespace Common { static OutputFormatter s_errorOutputFormatter = 0; @@ -71,7 +75,9 @@ void warning(const char *s, ...) { vsnprintf(buf, STRINGBUFLEN, s, va); va_end(va); -#if !defined (__SYMBIAN32__) +#if defined( ANDROID ) + __android_log_write(ANDROID_LOG_WARN, "ScummVM", buf); +#elif !defined (__SYMBIAN32__) fputs("WARNING: ", stderr); fputs(buf, stderr); fputs("!\n", stderr); @@ -141,6 +147,10 @@ void NORETURN_PRE error(const char *s, ...) { #endif #endif +#ifdef ANDROID + __android_log_assert("Fatal error", "ScummVM", "%s", buf_output); +#endif + #ifdef PALMOS_MODE extern void PalmFatalError(const char *err); PalmFatalError(buf_output); diff --git a/configure b/configure index 17da22fb8f..0c06be13ea 100755 --- a/configure +++ b/configure @@ -999,6 +999,11 @@ wince) _host_cpu=arm _host_alias=arm-wince-mingw32ce ;; +android) + _host_os=android + _host_cpu=arm + _host_alias=arm-android-eabi + ;; *) if test -n "$_host"; then guessed_host=`$_srcdir/config.sub $_host` @@ -1077,6 +1082,12 @@ psp) exit 1 fi ;; +android) + if test -z "$ANDROID_SDK"; then + echo "Please set ANDROID_SDK in your environment. export ANDROID_SDK=" + exit 1 + fi + ;; *) ;; esac @@ -1399,6 +1410,11 @@ case $_host_os in DEFINES="$DEFINES -D_WIN32_WCE=300 -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT" DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" ;; + android) + DEFINES="$DEFINES -DUNIX" + CXXFLAGS="$CXXFLAGS -Os -msoft-float -mtune=xscale -march=armv5te -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__" + add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" + ;; # given this is a shell script assume some type of unix *) echo "WARNING: could not establish system type, assuming unix like" @@ -1647,6 +1663,19 @@ if test -n "$_host"; then _mt32emu="no" _port_mk="backends/platform/wince/wince.mk" ;; + android) + DEFINES="$DEFINES -DANDROID -DUNIX -DUSE_ARM_SMUSH_ASM" + _endian=little + _need_memalign=yes + add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' + add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' + add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' + add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' + add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' + _backend="android" + _port_mk="backends/platform/android/android.mk" + _build_hq_scalers="no" + ;; *) echo "WARNING: Unknown target, continuing with auto-detected values" ;; @@ -1825,7 +1854,7 @@ POST_OBJS_FLAGS := -Wl,-no-whole-archive LIBS += -ldl ' ;; - linux*) + linux*|android) _def_plugin=' #define PLUGIN_PREFIX "lib" #define PLUGIN_SUFFIX ".so" @@ -2432,6 +2461,14 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(srcdir) -I$(srcdir)/backends/platform/wince -I$(srcdir)/engines -I$(srcdir)/backends/platform/wince/missing/gcc -I$(srcdir)/backends/platform/wince/CEgui -I$(srcdir)/backends/platform/wince/CEkeys' LIBS="$LIBS -static -lSDL" ;; + android) + # -lgcc is carefully placed here - we want to catch + # all toolchain symbols in *our* libraries rather + # than pick up anything unhygenic from the Android libs. + LIBS="$LIBS -lgcc -lstdc++ -llog -lGLESv1_CM -lEGL" + DEFINES="$DEFINES -D__ANDROID__ -DANDROID_BACKEND -DREDUCE_MEMORY_USAGE" + add_line_to_config_mk 'PLUGIN_LDFLAGS += $(LDFLAGS) -Wl,-shared,-Bsymbolic' + ;; *) echo "support for $_backend backend not implemented in configure script yet" exit 1 @@ -2447,7 +2484,7 @@ if test "$have_gcc" = yes ; then case $_host_os in # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ - mingw* | dreamcast | wii | gamecube | psp | wince | amigaos*) + mingw* | dreamcast | wii | gamecube | psp | wince | amigaos* | android) CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) @@ -2468,7 +2505,7 @@ fi; # Some platforms use certain GNU extensions in header files case $_host_os in -gamecube | psp | wii) +gamecube | psp | wii | android) ;; *) CXXFLAGS="$CXXFLAGS -pedantic" diff --git a/dists/android/mkmanifest.pl b/dists/android/mkmanifest.pl new file mode 100644 index 0000000000..00d15f561e --- /dev/null +++ b/dists/android/mkmanifest.pl @@ -0,0 +1,169 @@ +#!/usr/bin/perl + +use File::Basename qw(dirname); +use File::Path qw(mkpath); +use IO::File; +use XML::Writer; +use XML::Parser; +use Getopt::Long; + +use warnings; +use strict; + +use constant ANDROID => 'http://schemas.android.com/apk/res/android'; + +my $id; +my $package_versionName; +my $package_versionCode; +my $configure = 'configure'; +my $stringres = 'res/string/values.xml'; +my $manifest = 'AndroidManifest.xml'; +my $master_manifest; +my @unpack_libs; +GetOptions('id=s' => \$id, + 'version-name=s' => \$package_versionName, + 'version-code=i' => \$package_versionCode, + 'configure=s' => \$configure, + 'stringres=s' => \$stringres, + 'manifest=s' => \$manifest, + 'master-manifest=s' => \$master_manifest, + 'unpacklib=s' => \@unpack_libs, + ) or die; +die "Missing required arg" + unless $id and $package_versionName and $package_versionCode; + + +sub grope_engine_info { + my $configure = shift; + my @ret; + while (<$configure>) { + m/^add_engine \s+ (\w+) \s+ "(.*?)" \s+ \w+ (?:\s+ "([\w\s]*)")?/x + or next; + my $subengines = $3 || ''; + my %info = (id => $1, name => $2, + subengines => [split / /, $subengines]); + push @ret, \%info; + } + return @ret; +} + +sub read_constraints { + my $manifest = shift; + my @constraints; + my $parser = new XML::Parser Handlers => { + Start => sub { + my $expat = shift; + my $elem = shift; + return if $elem !~ + /^(uses-configuration|supports-screens|uses-sdk)$/; + my @constraint = ($elem); + while (@_) { + my $attr = shift; + my $value = shift; + $attr = [ANDROID, $attr] if $attr =~ s/^android://; + push @constraint, $attr, $value; + } + push @constraints, \@constraint; + }, + }; + $parser->parse($manifest); + return @constraints; +} + +sub print_stringres { + my $output = shift; + my $info = shift; + + my $writer = new XML::Writer(OUTPUT => $output, ENCODING => 'utf-8', + DATA_MODE => 1, DATA_INDENT => 2); + + $writer->xmlDecl(); + $writer->startTag('resources'); + + while (my ($k,$v) = each %$info) { + $writer->dataElement('string', $v, name => $k); + } + + $writer->endTag('resources'); + $writer->end(); +} + +sub print_manifest { + my $output = shift; + my $info = shift; + my $constraints = shift; + + my $writer = new XML::Writer(OUTPUT => $output, ENCODING => 'utf-8', + DATA_MODE => 1, DATA_INDENT => 2, + NAMESPACES => 1, + PREFIX_MAP => {ANDROID, 'android'}); + + $writer->xmlDecl(); + + $writer->startTag( + 'manifest', + 'package' => "org.inodes.gus.scummvm.plugin.$info->{name}", + [ANDROID, 'versionCode'] => $package_versionCode, + [ANDROID, 'versionName'] => $package_versionName, + ); + + $writer->startTag( + 'application', + [ANDROID, 'label'] => '@string/app_name', + [ANDROID, 'description'] => '@string/app_desc', + [ANDROID, 'icon'] => '@drawable/scummvm', + ); + + $writer->startTag( + 'receiver', + [ANDROID, 'name'] => 'org.inodes.gus.scummvm.PluginProvider', + [ANDROID, 'process'] => 'org.inodes.gus.scummvm'); + + $writer->startTag('intent-filter'); + $writer->emptyTag('action', [ANDROID, 'name'] => + 'org.inodes.gus.scummvm.action.PLUGIN_QUERY'); + $writer->emptyTag('category', [ANDROID, 'name'] => + 'android.intent.category.INFO'); + $writer->endTag('intent-filter'); + $writer->emptyTag( + 'meta-data', + [ANDROID, 'name'] => 'org.inodes.gus.scummvm.meta.UNPACK_LIB', + [ANDROID, 'value'] => $_) + for @{$info->{unpack_libs}}; + + $writer->endTag('receiver'); + $writer->endTag('application'); + + $writer->emptyTag('uses-permission', [ANDROID, 'name'] => + 'org.inodes.gus.scummvm.permission.SCUMMVM_PLUGIN'); + + $writer->emptyTag(@$_) foreach @$constraints; + + $writer->endTag('manifest'); + $writer->end(); +} + + +my %engines; +for my $engine (grope_engine_info(new IO::File $configure, 'r')) { + $engines{$engine->{id}} = $engine; +} + +my @games = ($id, @{$engines{$id}{subengines}}); +my $games_desc = join('; ', map $engines{$_}{name}, @games); + +my @constraints = read_constraints(new IO::File $master_manifest, 'r'); + +print "Writing $stringres ...\n"; +mkpath(dirname($stringres)); +print_stringres(IO::File->new($stringres, 'w'), + {app_name => qq{ScummVM plugin: "$id"}, + app_desc => "Game engine for: $games_desc", + }); + +print "Writing $manifest ...\n"; +mkpath(dirname($manifest)); +print_manifest(IO::File->new($manifest, 'w'), + {name => $id, unpack_libs => \@unpack_libs}, \@constraints); + +exit 0; diff --git a/dists/android/res/drawable/gradient.xml b/dists/android/res/drawable/gradient.xml new file mode 100644 index 0000000000..dbfd9b5b34 --- /dev/null +++ b/dists/android/res/drawable/gradient.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dists/android/res/layout/main.xml b/dists/android/res/layout/main.xml new file mode 100644 index 0000000000..f5276ce41b --- /dev/null +++ b/dists/android/res/layout/main.xml @@ -0,0 +1,10 @@ + + diff --git a/dists/android/res/layout/splash.xml b/dists/android/res/layout/splash.xml new file mode 100644 index 0000000000..e9fd5f70e7 --- /dev/null +++ b/dists/android/res/layout/splash.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/dists/android/res/values/strings.xml b/dists/android/res/values/strings.xml new file mode 100644 index 0000000000..e06509d3ed --- /dev/null +++ b/dists/android/res/values/strings.xml @@ -0,0 +1,22 @@ + + + ScummVM + Graphic adventure game engine + Quit + ScummVM plugin + Allows the application to + provide a ScummVM loadable plugin: code that will be executed in the + ScummVM application. Malicious plugins may do anything ScummVM + itself could do: write to your SD card, delete your savegames, + change the ScummVM background to puce, replace menu labels with rude + words, etc. + No SD card? + Unable to read your SD card. This usually + means you still have it mounted on your PC. Unmount, reinsert, + whatever and then try again. + No plugins found + ScummVM requires at least one game + engine to be useful. Engines are available as separate plugin + packages, from wherever you found ScummVM. + To Market + diff --git a/sound/decoders/vorbis.cpp b/sound/decoders/vorbis.cpp index 39068603de..64869d7843 100644 --- a/sound/decoders/vorbis.cpp +++ b/sound/decoders/vorbis.cpp @@ -35,7 +35,7 @@ #include "sound/audiocd.h" #ifdef USE_TREMOR -#ifdef __GP32__ // GP32 uses custom libtremor +#if defined(ANDROID) || defined(__GP32__) // custom libtremor locations #include #else #include diff --git a/tools/update-version.pl b/tools/update-version.pl index f151ae7514..81aa5c27f9 100755 --- a/tools/update-version.pl +++ b/tools/update-version.pl @@ -40,6 +40,7 @@ my @subs_files = qw( dists/iphone/Info.plist dists/irix/scummvm.spec dists/wii/meta.xml + dists/android/AndroidManifest.xml backends/platform/psp/README.PSP ); -- cgit v1.2.3 From b90ca013a814fd1023254543217c554382a3bd67 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 6 Jun 2010 12:37:43 +0000 Subject: PSP: added news item about switch to media engine for MP3 playback svn-id: r49450 --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 9ab98dc4e5..e46bb302b4 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ For a more comprehensive changelog for the latest experimental SVN code, see: PSP port: - Switched to new backend design which fixes minor graphical issues, speeds things up, and provides 16-bit support. + - Enabled playback of MP3 files using the hardware decoder (ME). This means that + the port is now optimized for MP3 playback (as opposed to OGG). General: - Switched to the "fast" DOSBox OPL emulator. -- cgit v1.2.3 From 43c353d9308515e0ce4d73773e50810f9e89ae47 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 6 Jun 2010 13:04:24 +0000 Subject: Now opening all files via getVolumeFile() svn-id: r49451 --- engines/sci/resource.cpp | 20 ++++++++------------ engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 7 +------ 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index b17117a1cd..f22c4d75fe 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -299,10 +299,15 @@ bool ResourceManager::loadFromPatchFile(Resource *res) { return loadPatch(res, &file); } -Common::File *ResourceManager::getVolumeFile(const char *filename) { +Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *source) { Common::List::iterator it = _volumeFiles.begin(); Common::File *file; + if (source->resourceFile) + return source->resourceFile->createReadStream(); + + const char *filename = source->location_name.c_str(); + // check if file is already opened while (it != _volumeFiles.end()) { file = *it; @@ -353,13 +358,7 @@ void ResourceManager::loadResource(Resource *res) { return; } - Common::SeekableReadStream *fileStream; - - // Either loading from volume or patch loading failed - if (res->_source->resourceFile) - fileStream = res->_source->resourceFile->createReadStream(); - else - fileStream = getVolumeFile(res->_source->location_name.c_str()); + Common::SeekableReadStream *fileStream = getVolumeFile(res->_source); if (!fileStream) { warning("Failed to open %s", res->_source->location_name.c_str()); @@ -1604,10 +1603,7 @@ ResourceCompression ResourceManager::getViewCompression() { if (res->_source->source_type != kSourceVolume) continue; - if (res->_source->resourceFile) - fileStream = res->_source->resourceFile->createReadStream(); - else - fileStream = getVolumeFile(res->_source->location_name.c_str()); + fileStream = getVolumeFile(res->_source); if (!fileStream) continue; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index bc08154fed..4c7068c580 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -393,7 +393,7 @@ protected: */ const char *versionDescription(ResVersion version) const; - Common::File *getVolumeFile(const char *filename); + Common::SeekableReadStream *getVolumeFile(ResourceSource *source); void loadResource(Resource *res); bool loadPatch(Resource *res, Common::SeekableReadStream *file); bool loadFromPatchFile(Resource *res); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index ebc549c772..57efbdcb38 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -33,12 +33,7 @@ namespace Sci { void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { - Common::SeekableReadStream *fileStream; - - if (source->resourceFile) - fileStream = source->resourceFile->createReadStream(); - else - fileStream = getVolumeFile(source->location_name.c_str()); + Common::SeekableReadStream *fileStream = getVolumeFile(source); if (!fileStream) { warning("Failed to open %s", source->location_name.c_str()); -- cgit v1.2.3 From 8e6cc1201a43dbba52daa528c07622f02d121c3d Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Sun, 6 Jun 2010 13:31:19 +0000 Subject: use palette image during sequence 3 scrolling svn-id: r49452 --- engines/tucker/sequences.cpp | 30 +++++++++++++++++++----------- engines/tucker/tucker.h | 3 ++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp index 68f5301a80..e8e81bde2d 100644 --- a/engines/tucker/sequences.cpp +++ b/engines/tucker/sequences.cpp @@ -491,7 +491,6 @@ AnimationSequencePlayer::AnimationSequencePlayer(OSystem *system, Audio::Mixer * _offscreenBuffer = (uint8 *)malloc(kScreenWidth * kScreenHeight); _updateScreenWidth = 0; _updateScreenPicture = false; - _updateScreenOffset = 0; _picBufPtr = _pic2BufPtr = 0; } @@ -841,19 +840,28 @@ void AnimationSequencePlayer::displayLoadingScreen() { void AnimationSequencePlayer::initPicPart4() { _updateScreenWidth = 320; _updateScreenPicture = true; - _updateScreenOffset = 0; + _updateScreenCounter = 0; + _updateScreenIndex = -1; } void AnimationSequencePlayer::drawPicPart4() { - static const uint8 offsetsTable[77] = { - 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, - 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1 - }; - _updateScreenWidth = _updateScreenWidth - offsetsTable[_updateScreenOffset]; - ++_updateScreenOffset; + static const uint8 offsets[] = { 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 }; + if (_updateScreenIndex == -1) { + for (int i = 0; i < 256; ++i) { + if (memcmp(_animationPalette + i * 4, _picBufPtr + 32 + i * 3, 3) != 0) { + memcpy(_animationPalette + i * 4, _picBufPtr + 32 + i * 3, 3); + _animationPalette[i * 4 + 3] = 0; + } + } + } + if (_updateScreenCounter == 0) { + static const uint8 counter[] = { 1, 2, 3, 4, 5, 35, 5, 4, 3, 2, 1 }; + ++_updateScreenIndex; + assert(_updateScreenIndex < ARRAYSIZE(counter)); + _updateScreenCounter = counter[_updateScreenIndex]; + } + --_updateScreenCounter; + _updateScreenWidth -= offsets[_updateScreenIndex]; for (int y = 0; y < 200; ++y) { memcpy(_offscreenBuffer + y * 320, _picBufPtr + 800 + y * 640 + _updateScreenWidth, 320); } diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h index d9810c7929..d33b9d1e07 100644 --- a/engines/tucker/tucker.h +++ b/engines/tucker/tucker.h @@ -975,7 +975,8 @@ private: uint8 *_offscreenBuffer; int _updateScreenWidth; int _updateScreenPicture; - int _updateScreenOffset; + int _updateScreenCounter; + int _updateScreenIndex; int _frameCounter; int _frameTime; uint32 _lastFrameTime; -- cgit v1.2.3 From 4667907b5cf9da3336352053b16b84484adf0393 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 6 Jun 2010 13:35:08 +0000 Subject: whitespace corrections svn-id: r49453 --- backends/platform/android/android.cpp | 6 +++--- .../platform/android/org/inodes/gus/scummvm/PluginProvider.java | 2 +- backends/platform/android/org/inodes/gus/scummvm/ScummVM.java | 2 +- .../platform/android/org/inodes/gus/scummvm/ScummVMActivity.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 76590ec823..a6258df554 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -703,10 +703,10 @@ void OSystem_Android::setPalette(const byte* colors, uint start, uint num) { palette += 3; colors += 4; } while (--num); -} - +} + void OSystem_Android::grabPalette(byte *colors, uint start, uint num) { - ENTER("grabPalette(%p, %u, %u)", colors, start, num); + ENTER("grabPalette(%p, %u, %u)", colors, start, num); const byte* palette = _game_texture->palette_const() + start*3; do { for (int i = 0; i < 3; ++i) diff --git a/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java index b4035a296b..840f3440d5 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java +++ b/backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java @@ -42,7 +42,7 @@ public class PluginProvider extends BroadcastReceiver { .authority(context.getPackageName()) .path(mylib) .toString()); - + extras.putStringArrayList(ScummVMApplication.EXTRA_UNPACK_LIBS, all_libs); } diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java index bc0c5ef408..f4dca0e7e5 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -42,7 +42,7 @@ public class ScummVM implements SurfaceHolder.Callback { create(context.getAssets()); // Init C++ code, set nativeScummVM } - private native void nativeDestroy(); + private native void nativeDestroy(); public synchronized void destroy() { if (nativeScummVM != 0) { diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java index 29e1eba3d3..fb3cd6348f 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java @@ -83,7 +83,7 @@ public class ScummVMActivity extends Activity { } }); } - } + } } private MyScummVM scummvm; private Thread scummvm_thread; @@ -353,7 +353,7 @@ public class ScummVMActivity extends Activity { e.kbd_ascii = kevent.getUnicodeChar(); if (e.kbd_ascii == 0) e.kbd_ascii = e.kbd_keycode; // scummvm keycodes are mostly ascii - + e.kbd_flags = 0; if (kevent.isAltPressed()) -- cgit v1.2.3 From 48cfc944216c863ea59160a54739799af21d1768 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 6 Jun 2010 13:36:55 +0000 Subject: Add Gus to credits, update README & NEWS svn-id: r49454 --- AUTHORS | 3 +++ COPYRIGHT | 1 + NEWS | 5 ++++- README | 21 ++++++++++++++------- gui/credits.h | 3 +++ tools/credits.pl | 4 ++++ 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 7a8490ddf7..28d71b3698 100644 --- a/AUTHORS +++ b/AUTHORS @@ -166,6 +166,9 @@ ScummVM Team Backend Teams ------------- + Android: + Angus Lees + Dreamcast: Marcus Comstedt diff --git a/COPYRIGHT b/COPYRIGHT index 980ca32463..cc522d2215 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -48,6 +48,7 @@ Martin Kiewitz Pawel Kolodziejski Mutwin Kraus Andrew Kurushin +Angus Lees Claudio Matsuoka Thomas Mayer Neil Millstone diff --git a/NEWS b/NEWS index e46bb302b4..32fe9a81c6 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ For a more comprehensive changelog for the latest experimental SVN code, see: http://scummvm.svn.sourceforge.net/viewvc/scummvm/?view=log 1.2.0 (????-??-??) + New Ports: + - Added Android port. + PSP port: - Switched to new backend design which fixes minor graphical issues, speeds things up, and provides 16-bit support. @@ -20,7 +23,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see: 1.1.1 (2010-05-02) New Ports: - - Added Nintendo 64 Port. (Actually added in 1.1.0, but forgot to mention it. oops) + - Added Nintendo 64 port. (Actually added in 1.1.0, but forgot to mention it. oops) General: - Fixed several minor bugs here and there. diff --git a/README b/README index 043a087fab..3c97bbbbd7 100644 --- a/README +++ b/README @@ -81,9 +81,10 @@ You can find a thorough list with details on which games are supported and how well on the compatibility page. ScummVM is continually improving, so check back often. -Among the systems on which you can play those games are Windows, Linux, -Mac OS X, Dreamcast, PocketPC, PalmOS, AmigaOS, BeOS, OS/2, PSP, PS2, -SymbianOS/EPOC, iPhone and many more. +Among the systems on which you can play those games are regular desktop +computers (running Windows, Linux, Mac OS X, ...), game consoles +(Dreamcast, Nintendo DS & Wii, PS2, PSP, ...), smartphones (Android, +iPhone, PocketPC, Symbian ...) and more. At this time ScummVM should be considered beta software, and is still under heavy development. Be aware that whilst we attempt to make sure @@ -843,21 +844,25 @@ contact us! Supported platforms include (but are not limited to): - UNIX (Linux, Solaris, IRIX, *BSD) + UNIX (Linux, Solaris, IRIX, *BSD, ...) Windows Windows CE and Windows Mobile (including Smartphones and PocketPCs) Mac OS X AmigaOS + Android BeOS Dreamcast - iPhone (also includes the iPod Touch) + GP2x + iPhone (also includes iPod Touch and iPad) + Maemo (Nokia Internet tablets 770, N800, N810, N900) + Nintendo 64 Nintendo DS + Nintendo Wii + OS/2 PalmOS PlayStation 2 PlayStation Portable - RISC OS Symbian - Maemo (Nokia Internet tablets 770, N800, N810, N900) The Dreamcast port does not support The Curse of Monkey Island, nor The Dig. The PalmOS port does not support The Curse of Monkey Island, @@ -865,6 +870,8 @@ Beneath a Steel Sky, nor either Simon the Sorcerer 1 or 2. The Dig will only work on some Palm devices (those with a large dynamic heap). The Nintendo DS port does not support Full Throttle, The Dig, or The Curse of Monkey Island. +For more platform specific limitations, please refer to our Wiki: + http://wiki.scummvm.org/index.php/Platforms In the Macintosh port, the right mouse button is emulated via Cmd-Click (that is, you click the mouse button while holding the diff --git a/gui/credits.h b/gui/credits.h index 4bf3e429b0..0df894a642 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -189,6 +189,9 @@ static const char *credits[] = { "", "", "C1""Backend Teams", +"C1""Android", +"C0""Angus Lees", +"", "C1""Dreamcast", "C0""Marcus Comstedt", "", diff --git a/tools/credits.pl b/tools/credits.pl index 165834b9b9..bff1251f7a 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -666,6 +666,10 @@ begin_credits("Credits"); begin_section("Backend Teams"); + begin_section("Android"); + add_person("Angus Lees", "Gus", ""); + end_section(); + begin_section("Dreamcast"); add_person("Marcus Comstedt", "", ""); end_section(); -- cgit v1.2.3 From 536e6a9bc308153f36d3eaf509bc0e66bcefc5e7 Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Sun, 6 Jun 2010 13:40:15 +0000 Subject: fix sequence frame numbering (decrement if getCurFrame now returns the last decoded frame number) svn-id: r49455 --- engines/tucker/sequences.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp index e8e81bde2d..8b0d965987 100644 --- a/engines/tucker/sequences.cpp +++ b/engines/tucker/sequences.cpp @@ -536,9 +536,9 @@ void AnimationSequencePlayer::mainLoop() { } // budttle2.flc is shorter in french version ; start the background music // earlier and skip any sounds effects - if (_seqNum == 19 && _flicPlayer[0].getFrameCount() == 127) { + if (_seqNum == 19 && _flicPlayer[0].getFrameCount() == 126) { _soundSeqDataIndex = 6; - _frameCounter = 79; + _frameCounter = 80; } } (this->*(_updateFunc[_updateFuncIndex].play))(); @@ -806,7 +806,7 @@ void AnimationSequencePlayer::playIntroSeq19_20() { // cogs, and is being replayed when an intro credit appears ::Graphics::Surface *surface = 0; - if (_flicPlayer[0].getCurFrame() >= 117) { + if (_flicPlayer[0].getCurFrame() >= 115) { surface = _flicPlayer[1].decodeNextFrame(); if (_flicPlayer[1].endOfVideo()) _flicPlayer[1].reset(); @@ -883,7 +883,7 @@ void AnimationSequencePlayer::loadIntroSeq3_4() { void AnimationSequencePlayer::playIntroSeq3_4() { if (!_updateScreenPicture) { bool framesLeft = decodeNextAnimationFrame(0); - if (_flicPlayer[0].getCurFrame() == 707) { + if (_flicPlayer[0].getCurFrame() == 705) { initPicPart4(); } if (!framesLeft) { @@ -951,13 +951,13 @@ void AnimationSequencePlayer::loadIntroSeq9_10() { } void AnimationSequencePlayer::playIntroSeq9_10() { - if (_flicPlayer[0].getCurFrame() >= 265 && _flicPlayer[0].getCurFrame() <= 296) { + if (_flicPlayer[0].getCurFrame() >= 263 && _flicPlayer[0].getCurFrame() <= 294) { drawPic1Part10(); _updateScreenWidth += 6; - } else if (_flicPlayer[0].getCurFrame() == 985) { + } else if (_flicPlayer[0].getCurFrame() == 983) { decodeNextAnimationFrame(0); drawPic2Part10(); - } else if (_flicPlayer[0].getCurFrame() >= 989 && _flicPlayer[0].getCurFrame() <= 997) { + } else if (_flicPlayer[0].getCurFrame() >= 987 && _flicPlayer[0].getCurFrame() <= 995) { drawPic1Part10(); _updateScreenWidth -= 25; if (_updateScreenWidth < 0) { -- cgit v1.2.3 From 857f3ab550e015f9560bafa6bf080619216140fa Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 6 Jun 2010 14:17:37 +0000 Subject: PSP: faster way of getting file size svn-id: r49457 --- backends/fs/psp/psp-stream.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp index 9bcbe9d7cf..83ff095aa8 100644 --- a/backends/fs/psp/psp-stream.cpp +++ b/backends/fs/psp/psp-stream.cpp @@ -24,6 +24,8 @@ */ #ifdef __PSP__ +#include +#include #include #include @@ -106,10 +108,11 @@ void *PSPIoStream::open() { _handle = fopen(_path.c_str(), _writeMode ? "wb" : "rb"); // open if (_handle) { - // Get the file size - fseek((FILE *)_handle, 0, SEEK_END); // go to the end - _fileSize = ftell((FILE *)_handle); - fseek((FILE *)_handle, 0, SEEK_SET); // back to the beginning + // Get the file size. This way is much faster than going to the end of the file and back + SceIoStat stat; + sceIoGetstat(_path.c_str(), &stat); + _fileSize = *((uint32 *)(void *)&stat.st_size); // 4GB file is big enough for us + PSP_DEBUG_PRINT("%s filesize = %d\n", _path.c_str(), _fileSize); // Allocate the cache _cache = (char *)memalign(64, CACHE_SIZE); -- cgit v1.2.3 From 548015ac10c89da839343b12274123898c113df1 Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Sun, 6 Jun 2010 14:18:16 +0000 Subject: add missing decodeNextAnimationFrame in default case for sequence 9 svn-id: r49458 --- engines/tucker/sequences.cpp | 29 ++++++++++++----------------- engines/tucker/tucker.h | 2 +- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/engines/tucker/sequences.cpp b/engines/tucker/sequences.cpp index 8b0d965987..633ed2790d 100644 --- a/engines/tucker/sequences.cpp +++ b/engines/tucker/sequences.cpp @@ -764,10 +764,10 @@ void AnimationSequencePlayer::openAnimation(int index, const char *fileName) { } } -bool AnimationSequencePlayer::decodeNextAnimationFrame(int index) { +bool AnimationSequencePlayer::decodeNextAnimationFrame(int index, bool copyDirtyRects) { ::Graphics::Surface *surface = _flicPlayer[index].decodeNextFrame(); - if (_seqNum == 19) { + if (!copyDirtyRects) { for (uint16 y = 0; (y < surface->h) && (y < kScreenHeight); y++) memcpy(_offscreenBuffer + y * kScreenWidth, (byte *)surface->pixels + y * surface->pitch, surface->w); } else { @@ -812,7 +812,7 @@ void AnimationSequencePlayer::playIntroSeq19_20() { _flicPlayer[1].reset(); } - bool framesLeft = decodeNextAnimationFrame(0); + bool framesLeft = decodeNextAnimationFrame(0, false); if (surface) for (int i = 0; i < kScreenWidth * kScreenHeight; ++i) @@ -922,17 +922,10 @@ void AnimationSequencePlayer::drawPic2Part10() { } void AnimationSequencePlayer::drawPic1Part10() { - ::Graphics::Surface *surface = _flicPlayer[0].decodeNextFrame(); - _flicPlayer[0].copyDirtyRectsToBuffer(_offscreenBuffer, kScreenWidth); - ++_frameCounter; - - if (_flicPlayer[0].hasDirtyPalette()) - getRGBPalette(0); - int offset = 0; for (int y = 0; y < kScreenHeight; ++y) { for (int x = 0; x < kScreenWidth; ++x) { - byte color = *((byte *)surface->pixels + offset); + byte color = _offscreenBuffer[offset]; if (color == 0) color = _picBufPtr[800 + y * 640 + _updateScreenWidth + x]; @@ -951,22 +944,24 @@ void AnimationSequencePlayer::loadIntroSeq9_10() { } void AnimationSequencePlayer::playIntroSeq9_10() { - if (_flicPlayer[0].getCurFrame() >= 263 && _flicPlayer[0].getCurFrame() <= 294) { + const int nextFrame = _flicPlayer[0].getCurFrame() + 1; + if (nextFrame >= 263 && nextFrame <= 294) { + decodeNextAnimationFrame(0, false); drawPic1Part10(); _updateScreenWidth += 6; - } else if (_flicPlayer[0].getCurFrame() == 983) { + } else if (nextFrame == 983) { decodeNextAnimationFrame(0); drawPic2Part10(); - } else if (_flicPlayer[0].getCurFrame() >= 987 && _flicPlayer[0].getCurFrame() <= 995) { + } else if (nextFrame >= 987 && nextFrame <= 995) { + decodeNextAnimationFrame(0, false); drawPic1Part10(); _updateScreenWidth -= 25; if (_updateScreenWidth < 0) { _updateScreenWidth = 0; } - } - - if (_flicPlayer[0].endOfVideo()) + } else if (!decodeNextAnimationFrame(0)) { _changeToNextSequence = true; + } } void AnimationSequencePlayer::loadIntroSeq21_22() { diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h index d33b9d1e07..86f5843e77 100644 --- a/engines/tucker/tucker.h +++ b/engines/tucker/tucker.h @@ -934,7 +934,7 @@ private: void unloadAnimation(); uint8 *loadPicture(const char *fileName); void openAnimation(int index, const char *fileName); - bool decodeNextAnimationFrame(int index); + bool decodeNextAnimationFrame(int index, bool copyDirtyRects = true); void loadIntroSeq17_18(); void playIntroSeq17_18(); void loadIntroSeq19_20(); -- cgit v1.2.3 From 51a897845532cc1fe587352726051e5f420d5d68 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 6 Jun 2010 22:44:14 +0000 Subject: Throw a warning in kString(At) if the index is out-of-bounds instead of having it assert out. svn-id: r49464 --- engines/sci/engine/kernel32.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index b132543206..e093fa6fdf 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -524,8 +524,16 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { } case 1: // Size return make_reg(0, s->_segMan->getString(argv[1]).size()); - case 2: // At (return value at an index) - return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]); + case 2: { // At (return value at an index) + Common::String string = s->_segMan->getString(argv[1]); + + if (argv[2].toUint16() >= string.size()) { + warning("kString(At): Out of bounds: %d/%d\n", argv[2].toUint16(), string.size()); + return NULL_REG; + } + + return make_reg(0, string[argv[2].toUint16()]); + } case 3: { // Atput (put value at an index) SciString *string = s->_segMan->lookupString(argv[1]); -- cgit v1.2.3 From 3c82b6578fa3bd4b3d91c1933dd390581dbe08d1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 6 Jun 2010 23:00:33 +0000 Subject: Now that EngineState is not deleted when loading games, we can move some more state-related variables to it, and remove several FIXME's about non-const global variables. Also, the entries in the data stack are now deleted when loading (fixes a memory leak - thanks to digitall for this). svn-id: r49465 --- engines/sci/console.cpp | 38 ++--- engines/sci/engine/kevent.cpp | 2 +- engines/sci/engine/kmisc.cpp | 2 +- engines/sci/engine/savegame.cpp | 4 +- engines/sci/engine/scriptdebug.cpp | 44 +++--- engines/sci/engine/state.cpp | 4 + engines/sci/engine/state.h | 18 +++ engines/sci/engine/vm.cpp | 293 ++++++++++++++++++------------------- engines/sci/engine/vm.h | 32 +--- engines/sci/sci.cpp | 6 +- 10 files changed, 214 insertions(+), 229 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index bad39d3065..2549be9403 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -75,10 +75,10 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); - DVar_Register("gc_interval", &script_gc_interval, DVAR_INT, 0); + DVar_Register("gc_interval", &engine->_gamestate->script_gc_interval, DVAR_INT, 0); DVar_Register("simulated_key", &g_debug_simulated_key, DVAR_INT, 0); DVar_Register("track_mouse_clicks", &g_debug_track_mouse_clicks, DVAR_BOOL, 0); - DVar_Register("script_abort_flag", &script_abort_flag, DVAR_INT, 0); + DVar_Register("script_abort_flag", &_engine->_gamestate->script_abort_flag, DVAR_INT, 0); // General DCmd_Register("help", WRAP_METHOD(Console, cmdHelp)); @@ -595,14 +595,14 @@ bool Console::cmdSetParseNodes(int argc, const char **argv) { } bool Console::cmdRegisters(int argc, const char **argv) { + EngineState *s = _engine->_gamestate; DebugPrintf("Current register values:\n"); - DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(_engine->_gamestate->r_acc), PRINT_REG(_engine->_gamestate->r_prev), scriptState.restAdjust); + DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjust); - if (!_engine->_gamestate->_executionStack.empty()) { - EngineState *s = _engine->_gamestate; // for PRINT_STK + if (!s->_executionStack.empty()) { DebugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n", - PRINT_REG(scriptState.xs->addr.pc), PRINT_REG(scriptState.xs->objp), - (unsigned)(scriptState.xs->fp - s->stack_base), (unsigned)(scriptState.xs->sp - s->stack_base)); + PRINT_REG(s->xs->addr.pc), PRINT_REG(s->xs->objp), + (unsigned)(s->xs->fp - s->stack_base), (unsigned)(s->xs->sp - s->stack_base)); } else DebugPrintf("\n"); @@ -958,7 +958,7 @@ bool Console::cmdRestoreGame(int argc, const char **argv) { bool Console::cmdRestartGame(int argc, const char **argv) { _engine->_gamestate->restarting_flags |= SCI_GAME_IS_RESTARTING_NOW; - script_abort_flag = 1; + _engine->_gamestate->script_abort_flag = 1; return false; } @@ -1766,14 +1766,15 @@ bool Console::cmdGCNormalize(int argc, const char **argv) { } bool Console::cmdVMVarlist(int argc, const char **argv) { + EngineState *s = _engine->_gamestate; const char *varnames[] = {"global", "local", "temp", "param"}; DebugPrintf("Addresses of variables in the VM:\n"); for (int i = 0; i < 4; i++) { - DebugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(scriptState.variables_seg[i], scriptState.variables[i] - scriptState.variables_base[i]))); - if (scriptState.variables_max) - DebugPrintf(" total %d", scriptState.variables_max[i]); + DebugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(s->variables_seg[i], s->variables[i] - s->variables_base[i]))); + if (s->variables_max) + DebugPrintf(" total %d", s->variables_max[i]); DebugPrintf("\n"); } @@ -1791,6 +1792,7 @@ bool Console::cmdVMVars(int argc, const char **argv) { return true; } + EngineState *s = _engine->_gamestate; const char *varnames[] = {"global", "local", "temp", "param"}; const char *varabbrev = "gltp"; const char *vartype_pre = strchr(varabbrev, *argv[1]); @@ -1829,17 +1831,17 @@ bool Console::cmdVMVars(int argc, const char **argv) { return true; } - if ((scriptState.variables_max) && (scriptState.variables_max[vartype] <= idx)) { - DebugPrintf("Max. index is %d (0x%x)\n", scriptState.variables_max[vartype], scriptState.variables_max[vartype]); + if ((s->variables_max) && (s->variables_max[vartype] <= idx)) { + DebugPrintf("Max. index is %d (0x%x)\n", s->variables_max[vartype], s->variables_max[vartype]); return true; } switch (argc) { case 3: - DebugPrintf("%s var %d == %04x:%04x\n", varnames[vartype], idx, PRINT_REG(scriptState.variables[vartype][idx])); + DebugPrintf("%s var %d == %04x:%04x\n", varnames[vartype], idx, PRINT_REG(s->variables[vartype][idx])); break; case 4: - if (parse_reg_t(_engine->_gamestate, argv[3], &scriptState.variables[vartype][idx], true)) { + if (parse_reg_t(_engine->_gamestate, argv[3], &s->variables[vartype][idx], true)) { DebugPrintf("Invalid value/address passed.\n"); DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); DebugPrintf("Or pass a decimal or hexadecimal value directly (e.g. 12, 1Ah)\n"); @@ -2072,7 +2074,7 @@ bool Console::cmdViewObject(int argc, const char **argv) { bool Console::cmdViewActiveObject(int argc, const char **argv) { DebugPrintf("Information on the currently active object or class:\n"); - printObject(scriptState.xs->objp); + printObject(_engine->_gamestate->xs->objp); return true; } @@ -2085,7 +2087,7 @@ bool Console::cmdViewAccumulatorObject(int argc, const char **argv) { } bool Console::cmdScriptSteps(int argc, const char **argv) { - DebugPrintf("Number of executed SCI operations: %d\n", script_step_counter); + DebugPrintf("Number of executed SCI operations: %d\n", _engine->_gamestate->script_step_counter); return true; } @@ -2729,7 +2731,7 @@ bool Console::cmdQuit(int argc, const char **argv) { if (!scumm_stricmp(argv[1], "game")) { // Quit gracefully - script_abort_flag = 1; // Terminate VM + _engine->_gamestate->script_abort_flag = 1; // Terminate VM g_debugState.seeking = kDebugSeekNothing; g_debugState.runningStep = 0; diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 3e096074e6..fd7711f196 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -79,7 +79,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { switch (curEvent.type) { case SCI_EVENT_QUIT: - quit_vm(); + quit_vm(s); break; case SCI_EVENT_KEYBOARD: diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 68dc2fbba4..f91ba0fd82 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -41,7 +41,7 @@ reg_t kRestartGame(EngineState *s, int argc, reg_t *argv) { s->shrinkStackToBase(); - script_abort_flag = 1; // Force vm to abort ASAP + s->script_abort_flag = 1; // Force vm to abort ASAP return NULL_REG; } diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 798f889460..9bf23dedf5 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -615,7 +615,7 @@ void DynMem::saveLoadWithSerializer(Common::Serializer &s) { void DataStack::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsUint32LE(_capacity); if (s.isLoading()) { - //free(entries); + free(_entries); _entries = (reg_t *)calloc(_capacity, sizeof(reg_t)); } } @@ -915,7 +915,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->restoring = true; - script_abort_flag = 2; // Abort current game with replay + s->script_abort_flag = 2; // Abort current game with replay s->shrinkStackToBase(); } diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 103a016972..159c278e8c 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -190,12 +190,12 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod } } - if (pos == scriptState.xs->addr.pc) { // Extra information if debugging the current opcode + if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode if ((opcode == op_pTos) || (opcode == op_sTop) || (opcode == op_pToa) || (opcode == op_aTop) || (opcode == op_dpToa) || (opcode == op_ipToa) || (opcode == op_dpTos) || (opcode == op_ipTos)) { - const Object *obj = s->_segMan->getObject(scriptState.xs->objp); + const Object *obj = s->_segMan->getObject(s->xs->objp); if (!obj) - warning("Attempted to reference on non-object at %04x:%04x", PRINT_REG(scriptState.xs->objp)); + warning("Attempted to reference on non-object at %04x:%04x", PRINT_REG(s->xs->objp)); else printf(" (%s)", selector_name(s, obj->propertyOffsetToId(s->_segMan, scr[pos.offset + 1]))); } @@ -203,39 +203,39 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod printf("\n"); - if (pos == scriptState.xs->addr.pc) { // Extra information if debugging the current opcode + if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode if (opcode == op_callk) { - int stackframe = (scr[pos.offset + 2] >> 1) + (scriptState.restAdjust); - int argc = ((scriptState.xs->sp)[- stackframe - 1]).offset; + int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjust); + int argc = ((s->xs->sp)[- stackframe - 1]).offset; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) - argc += (scriptState.restAdjust); + argc += (s->restAdjust); printf(" Kernel params: ("); for (int j = 0; j < argc; j++) { - printf("%04x:%04x", PRINT_REG((scriptState.xs->sp)[j - stackframe])); + printf("%04x:%04x", PRINT_REG((s->xs->sp)[j - stackframe])); if (j + 1 < argc) printf(", "); } printf(")\n"); } else if ((opcode == op_send) || (opcode == op_self)) { - int restmod = scriptState.restAdjust; + int restmod = s->restAdjust; int stackframe = (scr[pos.offset + 1] >> 1) + restmod; - reg_t *sb = scriptState.xs->sp; + reg_t *sb = s->xs->sp; uint16 selector; reg_t fun_ref; while (stackframe > 0) { int argc = sb[- stackframe + 1].offset; const char *name = NULL; - reg_t called_obj_addr = scriptState.xs->objp; + reg_t called_obj_addr = s->xs->objp; if (opcode == op_send) called_obj_addr = s->r_acc; else if (opcode == op_self) - called_obj_addr = scriptState.xs->objp; + called_obj_addr = s->xs->objp; selector = sb[- stackframe].offset; @@ -285,10 +285,10 @@ void script_debug(EngineState *s) { #if 0 if (sci_debug_flags & _DEBUG_FLAG_LOGGING) { printf("%d: acc=%04x:%04x ", script_step_counter, PRINT_REG(s->r_acc)); - disassemble(s, scriptState.xs->addr.pc, 0, 1); - if (scriptState.seeking == kDebugSeekGlobal) - printf("Global %d (0x%x) = %04x:%04x\n", scriptState.seekSpecial, - scriptState.seekSpecial, PRINT_REG(s->script_000->_localsBlock->_locals[scriptState.seekSpecial])); + disassemble(s, s->xs->addr.pc, 0, 1); + if (s->seeking == kDebugSeekGlobal) + printf("Global %d (0x%x) = %04x:%04x\n", s->seekSpecial, + s->seekSpecial, PRINT_REG(s->script_000->_localsBlock->_locals[s->seekSpecial])); } #endif @@ -298,16 +298,16 @@ void script_debug(EngineState *s) { #endif if (g_debugState.seeking && !g_debugState.breakpointWasHit) { // Are we looking for something special? - SegmentObj *mobj = s->_segMan->getSegment(scriptState.xs->addr.pc.segment, SEG_TYPE_SCRIPT); + SegmentObj *mobj = s->_segMan->getSegment(s->xs->addr.pc.segment, SEG_TYPE_SCRIPT); if (mobj) { Script *scr = (Script *)mobj; byte *code_buf = scr->_buf; int code_buf_size = scr->getBufSize(); - int opcode = scriptState.xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[scriptState.xs->addr.pc.offset]; + int opcode = s->xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset]; int op = opcode >> 1; - int paramb1 = scriptState.xs->addr.pc.offset + 1 >= code_buf_size ? 0 : code_buf[scriptState.xs->addr.pc.offset + 1]; - int paramf1 = (opcode & 1) ? paramb1 : (scriptState.xs->addr.pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + scriptState.xs->addr.pc.offset + 1)); + int paramb1 = s->xs->addr.pc.offset + 1 >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset + 1]; + int paramf1 = (opcode & 1) ? paramb1 : (s->xs->addr.pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + s->xs->addr.pc.offset + 1)); switch (g_debugState.seeking) { case kDebugSeekSpecialCallk: @@ -351,8 +351,8 @@ void script_debug(EngineState *s) { } } - printf("Step #%d\n", script_step_counter); - disassemble(s, scriptState.xs->addr.pc, 0, 1); + printf("Step #%d\n", s->script_step_counter); + disassemble(s, s->xs->addr.pc, 0, 1); if (g_debugState.runningStep) { g_debugState.runningStep--; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index b642cd8dc9..b4a04f8826 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -114,6 +114,10 @@ void EngineState::reset(bool isRestoring) { _throttleLastTime = 0; _throttleTrigger = false; + script_abort_flag = 0; + script_step_counter = 0; + script_gc_interval = GC_INTERVAL; + restoring = false; } diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 431aac884e..68e6a5516a 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -148,8 +148,26 @@ public: StackPtr stack_base; /**< Pointer to the least stack element */ StackPtr stack_top; /**< First invalid stack element */ + // Script state + ExecStack *xs; + reg_t *variables[4]; ///< global, local, temp, param, as immediate pointers + reg_t *variables_base[4]; ///< Used for referencing VM ops + SegmentId variables_seg[4]; ///< Same as above, contains segment IDs + int variables_max[4]; ///< Max. values for all variables + Script *script_000; /**< script 000, e.g. for globals */ + int loadFromLauncher; + + /** + * Set this to 1 to abort script execution immediately. Aborting will + * leave the debug exec stack intact. + * Set it to 2 to force a replay afterwards. + */ + int script_abort_flag; // Set to 1 to abort execution. Set to 2 to force a replay afterwards + int script_step_counter; // Counts the number of steps executed + int script_gc_interval; // Number of steps in between gcs + uint16 currentRoomNumber() const; void setRoomNumber(uint16 roomNumber); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 36f5ec6893..b04cc473b5 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -46,13 +46,6 @@ const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; //#define VM_DEBUG_SEND -ScriptState scriptState; // FIXME: Avoid non-const global vars -int g_loadFromLauncher; // FIXME: Avoid non-const global vars - -int script_abort_flag = 0; // Set to 1 to abort execution. Set to 2 to force a replay afterwards // FIXME: Avoid non-const global vars -int script_step_counter = 0; // Counts the number of steps executed // FIXME: Avoid non-const global vars -int script_gc_interval = GC_INTERVAL; // Number of steps in between gcs // FIXME: Avoid non-const global vars - #define SCI_XS_CALLEE_LOCALS ((SegmentId)-1) /** @@ -236,8 +229,8 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #endif -#define READ_VAR(type, index, def) validate_read_var(scriptState.variables[type], s->stack_base, type, scriptState.variables_max[type], index, __LINE__, def) -#define WRITE_VAR(type, index, value) validate_write_var(scriptState.variables[type], s->stack_base, type, scriptState.variables_max[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) +#define READ_VAR(type, index, def) validate_read_var(s->variables[type], s->stack_base, type, s->variables_max[type], index, __LINE__, def) +#define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variables_max[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); #define ACC_ARITHMETIC_L(op) make_reg(0, (op validate_arithmetic(s->r_acc))) @@ -251,8 +244,8 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #define PUSH(v) PUSH32(make_reg(0, v)) #define POP() (validate_arithmetic(POP32())) // 32 bit: -#define PUSH32(a) (*(validate_stack_addr(s, (scriptState.xs->sp)++)) = (a)) -#define POP32() (*(validate_stack_addr(s, --(scriptState.xs->sp)))) +#define PUSH32(a) (*(validate_stack_addr(s, (s->xs->sp)++)) = (a)) +#define POP32() (*(validate_stack_addr(s, --(s->xs->sp)))) ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackPtr sp, reg_t calling_obj, uint16 argc, StackPtr argp) { int seg = s->_segMan->getScriptSegment(script); @@ -575,11 +568,11 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { const KernelFuncWithSignature &kernelFunc = g_sci->getKernel()->_kernelFuncs[kernelFuncNum]; if (kernelFunc.signature - && !g_sci->getKernel()->signatureMatch(kernelFunc.signature, argc, scriptState.xs->sp + 1)) { + && !g_sci->getKernel()->signatureMatch(kernelFunc.signature, argc, s->xs->sp + 1)) { error("[VM] Invalid arguments to kernel call %x", kernelFuncNum); } - reg_t *argv = scriptState.xs->sp + 1; + reg_t *argv = s->xs->sp + 1; if (!kernelFunc.isDummy) { // Add stack frame to indicate we're executing a callk. @@ -594,7 +587,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { //warning("callk %s", kernelFunc.orig_name.c_str()); // TODO: SCI2.1 equivalent - if (g_loadFromLauncher >= 0 && ( + if (s->loadFromLauncher >= 0 && ( (kernelFuncNum == 0x8 && getSciVersion() <= SCI_VERSION_1_1) || // DrawPic (kernelFuncNum == 0x3d && getSciVersion() == SCI_VERSION_2) // GetSaveDir //(kernelFuncNum == 0x28 && getSciVersion() == SCI_VERSION_2_1) // AddPlane @@ -605,8 +598,8 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { // Therefore, inject a kRestoreGame call here, instead of the requested function. // The restore call is injected here mainly for games which have a menu, as the menu is // constructed when the game starts and is not reconstructed when a saved game is loaded. - int saveSlot = g_loadFromLauncher; - g_loadFromLauncher = -1; // invalidate slot, so that we don't load again + int saveSlot = s->loadFromLauncher; + s->loadFromLauncher = -1; // invalidate slot, so that we don't load again if (saveSlot < 0) error("Requested to load invalid save slot"); // should never happen, really @@ -637,7 +630,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { static void gc_countdown(EngineState *s) { if (s->gc_countdown-- <= 0) { - s->gc_countdown = script_gc_interval; + s->gc_countdown = s->script_gc_interval; run_gc(s); } } @@ -725,13 +718,13 @@ void run_vm(EngineState *s, bool restoring) { StackPtr s_temp; // Temporary stack pointer int16 opparams[4]; // opcode parameters - scriptState.restAdjust = s->restAdjust; + s->restAdjust = s->restAdjust; // &rest adjusts the parameter count by this value // Current execution data: - scriptState.xs = &(s->_executionStack.back()); + s->xs = &(s->_executionStack.back()); ExecStack *xs_new = NULL; - Object *obj = s->_segMan->getObject(scriptState.xs->objp); - Script *local_script = s->_segMan->getScriptIfLoaded(scriptState.xs->local_segment); + Object *obj = s->_segMan->getObject(s->xs->objp); + Script *local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); int old_execution_stack_base = s->execution_stack_base; // Used to detect the stack bottom, for "physical" returns const byte *code_buf = NULL; // (Avoid spurious warning) @@ -746,20 +739,20 @@ void run_vm(EngineState *s, bool restoring) { #ifndef DISABLE_VALIDATIONS // Initialize maximum variable count if (s->script_000->_localsBlock) - scriptState.variables_max[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.size(); + s->variables_max[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.size(); else - scriptState.variables_max[VAR_GLOBAL] = 0; + s->variables_max[VAR_GLOBAL] = 0; #endif - scriptState.variables_seg[VAR_GLOBAL] = s->script_000->_localsSegment; - scriptState.variables_seg[VAR_TEMP] = scriptState.variables_seg[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); - scriptState.variables_base[VAR_TEMP] = scriptState.variables_base[VAR_PARAM] = s->stack_base; + s->variables_seg[VAR_GLOBAL] = s->script_000->_localsSegment; + s->variables_seg[VAR_TEMP] = s->variables_seg[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); + s->variables_base[VAR_TEMP] = s->variables_base[VAR_PARAM] = s->stack_base; // SCI code reads the zeroth argument to determine argc if (s->script_000->_localsBlock) - scriptState.variables_base[VAR_GLOBAL] = scriptState.variables[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.begin(); + s->variables_base[VAR_GLOBAL] = s->variables[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.begin(); else - scriptState.variables_base[VAR_GLOBAL] = scriptState.variables[VAR_GLOBAL] = NULL; + s->variables_base[VAR_GLOBAL] = s->variables[VAR_GLOBAL] = NULL; s->_executionStackPosChanged = true; // Force initialization @@ -767,63 +760,63 @@ void run_vm(EngineState *s, bool restoring) { int var_type; // See description below int var_number; - g_debugState.old_pc_offset = scriptState.xs->addr.pc.offset; - g_debugState.old_sp = scriptState.xs->sp; + g_debugState.old_pc_offset = s->xs->addr.pc.offset; + g_debugState.old_sp = s->xs->sp; if (s->_executionStackPosChanged) { Script *scr; - scriptState.xs = &(s->_executionStack.back()); + s->xs = &(s->_executionStack.back()); s->_executionStackPosChanged = false; - scr = s->_segMan->getScriptIfLoaded(scriptState.xs->addr.pc.segment); + scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); if (!scr) { // No script? Implicit return via fake instruction buffer - warning("Running on non-existant script in segment %x", scriptState.xs->addr.pc.segment); + warning("Running on non-existant script in segment %x", s->xs->addr.pc.segment); code_buf = _fake_return_buffer; #ifndef DISABLE_VALIDATIONS code_buf_size = 2; #endif - scriptState.xs->addr.pc.offset = 1; + s->xs->addr.pc.offset = 1; scr = NULL; obj = NULL; } else { - obj = s->_segMan->getObject(scriptState.xs->objp); + obj = s->_segMan->getObject(s->xs->objp); code_buf = scr->_buf; #ifndef DISABLE_VALIDATIONS code_buf_size = scr->getBufSize(); #endif - local_script = s->_segMan->getScriptIfLoaded(scriptState.xs->local_segment); + local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { - warning("Could not find local script from segment %x", scriptState.xs->local_segment); + warning("Could not find local script from segment %x", s->xs->local_segment); local_script = NULL; - scriptState.variables_base[VAR_LOCAL] = scriptState.variables[VAR_LOCAL] = NULL; + s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; #ifndef DISABLE_VALIDATIONS - scriptState.variables_max[VAR_LOCAL] = 0; + s->variables_max[VAR_LOCAL] = 0; #endif } else { - scriptState.variables_seg[VAR_LOCAL] = local_script->_localsSegment; + s->variables_seg[VAR_LOCAL] = local_script->_localsSegment; if (local_script->_localsBlock) - scriptState.variables_base[VAR_LOCAL] = scriptState.variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); + s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); else - scriptState.variables_base[VAR_LOCAL] = scriptState.variables[VAR_LOCAL] = NULL; + s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; #ifndef DISABLE_VALIDATIONS if (local_script->_localsBlock) - scriptState.variables_max[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); + s->variables_max[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); else - scriptState.variables_max[VAR_LOCAL] = 0; - scriptState.variables_max[VAR_TEMP] = scriptState.xs->sp - scriptState.xs->fp; - scriptState.variables_max[VAR_PARAM] = scriptState.xs->argc + 1; + s->variables_max[VAR_LOCAL] = 0; + s->variables_max[VAR_TEMP] = s->xs->sp - s->xs->fp; + s->variables_max[VAR_PARAM] = s->xs->argc + 1; #endif } - scriptState.variables[VAR_TEMP] = scriptState.xs->fp; - scriptState.variables[VAR_PARAM] = scriptState.xs->variables_argp; + s->variables[VAR_TEMP] = s->xs->fp; + s->variables[VAR_PARAM] = s->xs->variables_argp; } } - if (script_abort_flag || g_engine->shouldQuit()) + if (s->script_abort_flag || g_engine->shouldQuit()) return; // Emergency // Debug if this has been requested: @@ -838,20 +831,20 @@ void run_vm(EngineState *s, bool restoring) { } #ifndef DISABLE_VALIDATIONS - if (scriptState.xs->sp < scriptState.xs->fp) + if (s->xs->sp < s->xs->fp) error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", - PRINT_REG(*scriptState.xs->sp), PRINT_REG(*scriptState.xs->fp)); + PRINT_REG(*s->xs->sp), PRINT_REG(*s->xs->fp)); - scriptState.variables_max[VAR_TEMP] = scriptState.xs->sp - scriptState.xs->fp; + s->variables_max[VAR_TEMP] = s->xs->sp - s->xs->fp; - if (scriptState.xs->addr.pc.offset >= code_buf_size) + if (s->xs->addr.pc.offset >= code_buf_size) error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", - scriptState.xs->addr.pc.offset, code_buf_size); + s->xs->addr.pc.offset, code_buf_size); #endif // Get opcode byte extOpcode; - scriptState.xs->addr.pc.offset += readPMachineInstruction(code_buf + scriptState.xs->addr.pc.offset, extOpcode, opparams); + s->xs->addr.pc.offset += readPMachineInstruction(code_buf + s->xs->addr.pc.offset, extOpcode, opparams); const byte opcode = extOpcode >> 1; switch (opcode) { @@ -1082,16 +1075,16 @@ void run_vm(EngineState *s, bool restoring) { case op_bt: // 0x17 (23) if (s->r_acc.offset || s->r_acc.segment) - scriptState.xs->addr.pc.offset += opparams[0]; + s->xs->addr.pc.offset += opparams[0]; break; case op_bnt: // 0x18 (24) if (!(s->r_acc.offset || s->r_acc.segment)) - scriptState.xs->addr.pc.offset += opparams[0]; + s->xs->addr.pc.offset += opparams[0]; break; case op_jmp: // 0x19 (25) - scriptState.xs->addr.pc.offset += opparams[0]; + s->xs->addr.pc.offset += opparams[0]; break; case op_ldi: // 0x1a (26) @@ -1107,34 +1100,34 @@ void run_vm(EngineState *s, bool restoring) { break; case op_toss: // 0x1d (29) - scriptState.xs->sp--; + s->xs->sp--; break; case op_dup: // 0x1e (30) - r_temp = scriptState.xs->sp[-1]; + r_temp = s->xs->sp[-1]; PUSH32(r_temp); break; case op_link: // 0x1f (31) for (int i = 0; i < opparams[0]; i++) - scriptState.xs->sp[i] = NULL_REG; - scriptState.xs->sp += opparams[0]; + s->xs->sp[i] = NULL_REG; + s->xs->sp += opparams[0]; break; case op_call: { // 0x20 (32) int argc = (opparams[1] >> 1) // Given as offset, but we need count - + 1 + scriptState.restAdjust; - StackPtr call_base = scriptState.xs->sp - argc; - scriptState.xs->sp[1].offset += scriptState.restAdjust; - - xs_new = add_exec_stack_entry(s->_executionStack, make_reg(scriptState.xs->addr.pc.segment, - scriptState.xs->addr.pc.offset + opparams[0]), - scriptState.xs->sp, scriptState.xs->objp, - (validate_arithmetic(*call_base)) + scriptState.restAdjust, - call_base, NULL_SELECTOR, scriptState.xs->objp, - s->_executionStack.size()-1, scriptState.xs->local_segment); - scriptState.restAdjust = 0; // Used up the &rest adjustment - scriptState.xs->sp = call_base; + + 1 + s->restAdjust; + StackPtr call_base = s->xs->sp - argc; + s->xs->sp[1].offset += s->restAdjust; + + xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment, + s->xs->addr.pc.offset + opparams[0]), + s->xs->sp, s->xs->objp, + (validate_arithmetic(*call_base)) + s->restAdjust, + call_base, NULL_SELECTOR, s->xs->objp, + s->_executionStack.size()-1, s->xs->local_segment); + s->restAdjust = 0; // Used up the &rest adjustment + s->xs->sp = call_base; s->_executionStackPosChanged = true; break; @@ -1143,23 +1136,23 @@ void run_vm(EngineState *s, bool restoring) { case op_callk: { // 0x21 (33) gc_countdown(s); - scriptState.xs->sp -= (opparams[1] >> 1) + 1; + s->xs->sp -= (opparams[1] >> 1) + 1; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) { - scriptState.xs->sp -= scriptState.restAdjust; - s->restAdjust = 0; // We just used up the scriptState.restAdjust, remember? + s->xs->sp -= s->restAdjust; + s->restAdjust = 0; // We just used up the s->restAdjust, remember? } - int argc = validate_arithmetic(scriptState.xs->sp[0]); + int argc = validate_arithmetic(s->xs->sp[0]); if (!oldScriptHeader) - argc += scriptState.restAdjust; + argc += s->restAdjust; callKernelFunc(s, opparams[0], argc); if (!oldScriptHeader) - scriptState.restAdjust = s->restAdjust; + s->restAdjust = s->restAdjust; // Calculate xs again: The kernel function might // have spawned a new VM @@ -1170,27 +1163,27 @@ void run_vm(EngineState *s, bool restoring) { } case op_callb: // 0x22 (34) - temp = ((opparams[1] >> 1) + scriptState.restAdjust + 1); - s_temp = scriptState.xs->sp; - scriptState.xs->sp -= temp; - - scriptState.xs->sp[0].offset += scriptState.restAdjust; - xs_new = execute_method(s, 0, opparams[0], s_temp, scriptState.xs->objp, - scriptState.xs->sp[0].offset, scriptState.xs->sp); - scriptState.restAdjust = 0; // Used up the &rest adjustment + temp = ((opparams[1] >> 1) + s->restAdjust + 1); + s_temp = s->xs->sp; + s->xs->sp -= temp; + + s->xs->sp[0].offset += s->restAdjust; + xs_new = execute_method(s, 0, opparams[0], s_temp, s->xs->objp, + s->xs->sp[0].offset, s->xs->sp); + s->restAdjust = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; break; case op_calle: // 0x23 (35) - temp = ((opparams[2] >> 1) + scriptState.restAdjust + 1); - s_temp = scriptState.xs->sp; - scriptState.xs->sp -= temp; + temp = ((opparams[2] >> 1) + s->restAdjust + 1); + s_temp = s->xs->sp; + s->xs->sp -= temp; - scriptState.xs->sp[0].offset += scriptState.restAdjust; - xs_new = execute_method(s, opparams[0], opparams[1], s_temp, scriptState.xs->objp, - scriptState.xs->sp[0].offset, scriptState.xs->sp); - scriptState.restAdjust = 0; // Used up the &rest adjustment + s->xs->sp[0].offset += s->restAdjust; + xs_new = execute_method(s, opparams[0], opparams[1], s_temp, s->xs->objp, + s->xs->sp[0].offset, s->xs->sp); + s->restAdjust = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; @@ -1198,8 +1191,8 @@ void run_vm(EngineState *s, bool restoring) { case op_ret: // 0x24 (36) do { - StackPtr old_sp2 = scriptState.xs->sp; - StackPtr old_fp = scriptState.xs->fp; + StackPtr old_sp2 = s->xs->sp; + StackPtr old_fp = s->xs->fp; ExecStack *old_xs = &(s->_executionStack.back()); if ((int)s->_executionStack.size() - 1 == s->execution_stack_base) { // Have we reached the base? @@ -1208,7 +1201,7 @@ void run_vm(EngineState *s, bool restoring) { s->_executionStack.pop_back(); s->_executionStackPosChanged = true; - s->restAdjust = scriptState.restAdjust; // Update &rest + s->restAdjust = s->restAdjust; // Update &rest return; // "Hard" return } @@ -1224,33 +1217,33 @@ void run_vm(EngineState *s, bool restoring) { // Not reached the base, so let's do a soft return s->_executionStack.pop_back(); s->_executionStackPosChanged = true; - scriptState.xs = &(s->_executionStack.back()); + s->xs = &(s->_executionStack.back()); - if (scriptState.xs->sp == CALL_SP_CARRY // Used in sends to 'carry' the stack pointer - || scriptState.xs->type != EXEC_STACK_TYPE_CALL) { - scriptState.xs->sp = old_sp2; - scriptState.xs->fp = old_fp; + if (s->xs->sp == CALL_SP_CARRY // Used in sends to 'carry' the stack pointer + || s->xs->type != EXEC_STACK_TYPE_CALL) { + s->xs->sp = old_sp2; + s->xs->fp = old_fp; } - } while (scriptState.xs->type == EXEC_STACK_TYPE_VARSELECTOR); + } while (s->xs->type == EXEC_STACK_TYPE_VARSELECTOR); // Iterate over all varselector accesses s->_executionStackPosChanged = true; - xs_new = scriptState.xs; + xs_new = s->xs; break; case op_send: // 0x25 (37) - s_temp = scriptState.xs->sp; - scriptState.xs->sp -= ((opparams[0] >> 1) + scriptState.restAdjust); // Adjust stack + s_temp = s->xs->sp; + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack - scriptState.xs->sp[1].offset += scriptState.restAdjust; + s->xs->sp[1].offset += s->restAdjust; xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp, - (int)(opparams[0] >> 1) + (uint16)scriptState.restAdjust, scriptState.xs->sp); + (int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp); - if (xs_new && xs_new != scriptState.xs) + if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - scriptState.restAdjust = 0; + s->restAdjust = 0; break; @@ -1261,7 +1254,7 @@ void run_vm(EngineState *s, bool restoring) { case op_class: // 0x28 (40) s->r_acc = s->_segMan->getClassAddress((unsigned)opparams[0], SCRIPT_GET_LOCK, - scriptState.xs->addr.pc); + s->xs->addr.pc); break; case 0x29: // (41) @@ -1269,48 +1262,48 @@ void run_vm(EngineState *s, bool restoring) { break; case op_self: // 0x2a (42) - s_temp = scriptState.xs->sp; - scriptState.xs->sp -= ((opparams[0] >> 1) + scriptState.restAdjust); // Adjust stack + s_temp = s->xs->sp; + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack - scriptState.xs->sp[1].offset += scriptState.restAdjust; - xs_new = send_selector(s, scriptState.xs->objp, scriptState.xs->objp, - s_temp, (int)(opparams[0] >> 1) + (uint16)scriptState.restAdjust, - scriptState.xs->sp); + s->xs->sp[1].offset += s->restAdjust; + xs_new = send_selector(s, s->xs->objp, s->xs->objp, + s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjust, + s->xs->sp); - if (xs_new && xs_new != scriptState.xs) + if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - scriptState.restAdjust = 0; + s->restAdjust = 0; break; case op_super: // 0x2b (43) - r_temp = s->_segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, scriptState.xs->addr.pc); + r_temp = s->_segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, s->xs->addr.pc); if (!r_temp.segment) error("[VM]: Invalid superclass in object"); else { - s_temp = scriptState.xs->sp; - scriptState.xs->sp -= ((opparams[1] >> 1) + scriptState.restAdjust); // Adjust stack + s_temp = s->xs->sp; + s->xs->sp -= ((opparams[1] >> 1) + s->restAdjust); // Adjust stack - scriptState.xs->sp[1].offset += scriptState.restAdjust; - xs_new = send_selector(s, r_temp, scriptState.xs->objp, s_temp, - (int)(opparams[1] >> 1) + (uint16)scriptState.restAdjust, - scriptState.xs->sp); + s->xs->sp[1].offset += s->restAdjust; + xs_new = send_selector(s, r_temp, s->xs->objp, s_temp, + (int)(opparams[1] >> 1) + (uint16)s->restAdjust, + s->xs->sp); - if (xs_new && xs_new != scriptState.xs) + if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - scriptState.restAdjust = 0; + s->restAdjust = 0; } break; case op_rest: // 0x2c (44) temp = (uint16) opparams[0]; // First argument - scriptState.restAdjust = MAX(scriptState.xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't + s->restAdjust = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't - for (; temp <= scriptState.xs->argc; temp++) - PUSH32(scriptState.xs->variables_argp[temp]); + for (; temp <= s->xs->argc; temp++) + PUSH32(s->xs->variables_argp[temp]); break; @@ -1319,8 +1312,8 @@ void run_vm(EngineState *s, bool restoring) { var_number = temp & 0x03; // Get variable type // Get variable block offset - r_temp.segment = scriptState.variables_seg[var_number]; - r_temp.offset = scriptState.variables[var_number] - scriptState.variables_base[var_number]; + r_temp.segment = s->variables_seg[var_number]; + r_temp.offset = s->variables[var_number] - s->variables_base[var_number]; if (temp & 0x08) // Add accumulator offset if requested r_temp.offset += signed_validate_arithmetic(s->r_acc); @@ -1333,7 +1326,7 @@ void run_vm(EngineState *s, bool restoring) { case op_selfID: // 0x2e (46) - s->r_acc = scriptState.xs->objp; + s->r_acc = s->xs->objp; break; case 0x2f: // (47) @@ -1401,7 +1394,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_lofsa: // 0x39 (57) - s->r_acc.segment = scriptState.xs->addr.pc.segment; + s->r_acc.segment = s->xs->addr.pc.segment; switch (g_sci->_features->detectLofsType()) { case SCI_VERSION_1_1: @@ -1411,7 +1404,7 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc.offset = opparams[0]; break; default: - s->r_acc.offset = scriptState.xs->addr.pc.offset + opparams[0]; + s->r_acc.offset = s->xs->addr.pc.offset + opparams[0]; } #ifndef DISABLE_VALIDATIONS @@ -1423,7 +1416,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_lofss: // 0x3a (58) - r_temp.segment = scriptState.xs->addr.pc.segment; + r_temp.segment = s->xs->addr.pc.segment; switch (g_sci->_features->detectLofsType()) { case SCI_VERSION_1_1: @@ -1433,7 +1426,7 @@ void run_vm(EngineState *s, bool restoring) { r_temp.offset = opparams[0]; break; default: - r_temp.offset = scriptState.xs->addr.pc.offset + opparams[0]; + r_temp.offset = s->xs->addr.pc.offset + opparams[0]; } #ifndef DISABLE_VALIDATIONS @@ -1459,10 +1452,10 @@ void run_vm(EngineState *s, bool restoring) { case op_pushSelf: // 0x3e (62) if (!(extOpcode & 1)) { - PUSH32(scriptState.xs->objp); + PUSH32(s->xs->objp); } else { // Debug opcode op_file, skip null-terminated string (file name) - while (code_buf[scriptState.xs->addr.pc.offset++]) ; + while (code_buf[s->xs->addr.pc.offset++]) ; } break; @@ -1676,16 +1669,16 @@ void run_vm(EngineState *s, bool restoring) { } // switch (opcode) if (s->_executionStackPosChanged) // Force initialization - scriptState.xs = xs_new; + s->xs = xs_new; //#ifndef DISABLE_VALIDATIONS - if (scriptState.xs != &(s->_executionStack.back())) { + if (s->xs != &(s->_executionStack.back())) { warning("xs is stale (%p vs %p); last command was %02x", - (void *)scriptState.xs, (void *)&(s->_executionStack.back()), + (void *)s->xs, (void *)&(s->_executionStack.back()), opcode); } //#endif - ++script_step_counter; + ++s->script_step_counter; } } @@ -1718,7 +1711,7 @@ static EngineState *_game_run(EngineState *&s) { send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - script_abort_flag = 0; + s->script_abort_flag = 0; s->restarting_flags = SCI_GAME_WAS_RESTARTED; } else { @@ -1726,7 +1719,7 @@ static EngineState *_game_run(EngineState *&s) { if (restoring) { game_exit(s); s->restoring = false; - if (script_abort_flag == 2) { + if (s->script_abort_flag == 2) { debugC(2, kDebugLevelVM, "Restarting with replay()"); s->_executionStack.clear(); // Restart with replay @@ -1735,7 +1728,7 @@ static EngineState *_game_run(EngineState *&s) { send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); } - script_abort_flag = 0; + s->script_abort_flag = 0; } else break; // exit loop @@ -1766,8 +1759,8 @@ int game_run(EngineState **_s) { return 0; } -void quit_vm() { - script_abort_flag = 1; // Terminate VM +void quit_vm(EngineState *s) { + s->script_abort_flag = 1; // Terminate VM g_debugState.seeking = kDebugSeekNothing; g_debugState.runningStep = 0; } diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 42ee55cd06..67a6bd0dc3 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -224,41 +224,11 @@ enum { VAR_PARAM = 3 }; -/** - * Structure for storing the current internal state of the VM. - */ -struct ScriptState { - ExecStack *xs; - int16 restAdjust; - reg_t *variables[4]; ///< global, local, temp, param, as immediate pointers - reg_t *variables_base[4]; ///< Used for referencing VM ops - SegmentId variables_seg[4]; ///< Same as above, contains segment IDs - int variables_max[4]; ///< Max. values for all variables -}; - -/** - * The current internal state of the VM. - */ -extern ScriptState scriptState; - -/** - * Set this to 1 to abort script execution immediately. Aborting will - * leave the debug exec stack intact. - * Set it to 2 to force a replay afterwards. - */ -extern int script_abort_flag; - /** Number of kernel calls in between gcs; should be < 50000 */ enum { GC_INTERVAL = 32768 }; -/** Initially GC_DELAY, can be set at runtime */ -extern int script_gc_interval; - -/** Number of steps executed */ -extern int script_step_counter; - /** * Executes function pubfunct of the specified script. @@ -430,7 +400,7 @@ int game_exit(EngineState *s); /** * Instructs the virtual machine to abort */ -void quit_vm(); +void quit_vm(EngineState *s); /** * Read a PMachine instruction from a memory buffer and return its length. diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 1de42ab115..929bdf3307 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -56,8 +56,6 @@ namespace Sci { -extern int g_loadFromLauncher; - SciEngine *g_sci = 0; @@ -259,9 +257,9 @@ Common::Error SciEngine::run() { // Check whether loading a savestate was requested if (ConfMan.hasKey("save_slot")) { - g_loadFromLauncher = ConfMan.getInt("save_slot"); + _gamestate->loadFromLauncher = ConfMan.getInt("save_slot"); } else { - g_loadFromLauncher = -1; + _gamestate->loadFromLauncher = -1; } game_run(&_gamestate); // Run the game -- cgit v1.2.3 From 1e56ea9ac9ec21490d2ee626d4c49cdf6794e2b0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 7 Jun 2010 01:43:35 +0000 Subject: Change some kString subops to use the raw string directly instead of through a Common::String. Fixes usage with strings from kGetSaveFiles(). svn-id: r49468 --- engines/sci/engine/kernel32.cpp | 54 +++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index e093fa6fdf..d2a3362aca 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -525,14 +525,10 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { case 1: // Size return make_reg(0, s->_segMan->getString(argv[1]).size()); case 2: { // At (return value at an index) - Common::String string = s->_segMan->getString(argv[1]); - - if (argv[2].toUint16() >= string.size()) { - warning("kString(At): Out of bounds: %d/%d\n", argv[2].toUint16(), string.size()); - return NULL_REG; - } + if (argv[1].segment == s->_segMan->getStringSegmentId()) + return make_reg(0, s->_segMan->lookupString(argv[1])->getRawData()[argv[2].toUint16()]); - return make_reg(0, string[argv[2].toUint16()]); + return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]); } case 3: { // Atput (put value at an index) SciString *string = s->_segMan->lookupString(argv[1]); @@ -571,16 +567,28 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { return argv[1]; } case 6: { // Cpy - Common::String string2 = s->_segMan->getString(argv[3]); + const char *string2 = 0; + uint32 string2Size = 0; + + if (argv[3].segment == s->_segMan->getStringSegmentId()) { + SciString *string = s->_segMan->lookupString(argv[3]); + string2 = string->getRawData(); + string2Size = string->getSize(); + } else { + Common::String string = s->_segMan->getString(argv[3]); + string2 = string.c_str(); + string2Size = string.size() + 1; + } + uint32 index1 = argv[2].toUint16(); uint32 index2 = argv[4].toUint16(); // The original engine ignores bad copies too - if (index2 > string2.size()) + if (index2 > string2Size) break; // A count of -1 means fill the rest of the array - uint32 count = argv[5].toSint16() == -1 ? string2.size() - index2 + 1 : argv[5].toUint16(); + uint32 count = argv[5].toSint16() == -1 ? string2Size - index2 + 1 : argv[5].toUint16(); // We have a special case here for argv[1] being a system string if (argv[1].segment == s->_segMan->getSysStringsSegment()) { @@ -592,7 +600,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { s->_segMan->sysStrings->_strings[sysStringId]._value = (char *)calloc(index1 + count, sizeof(char)); } - strncpy(s->_segMan->sysStrings->_strings[sysStringId]._value + index1, string2.c_str() + index2, count); + strncpy(s->_segMan->sysStrings->_strings[sysStringId]._value + index1, string2 + index2, count); } else { SciString *string1 = s->_segMan->lookupString(argv[1]); @@ -602,7 +610,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { // Note: We're accessing from c_str() here because the string's size ignores // the trailing 0 and therefore triggers an assert when doing string2[i + index2]. for (uint16 i = 0; i < count; i++) - string1->setValue(i + index1, string2.c_str()[i + index2]); + string1->setValue(i + index1, string2[i + index2]); } } return argv[1]; @@ -616,15 +624,25 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { return make_reg(0, strcmp(string1.c_str(), string2.c_str())); } case 8: { // Dup - Common::String string = s->_segMan->getString(argv[1]); + const char *rawString = 0; + uint32 size = 0; + + if (argv[1].segment == s->_segMan->getStringSegmentId()) { + SciString *string = s->_segMan->lookupString(argv[1]); + rawString = string->getRawData(); + size = string->getSize(); + } else { + Common::String string = s->_segMan->getString(argv[1]); + rawString = string.c_str(); + size = string.size() + 1; + } + reg_t stringHandle; SciString *dupString = s->_segMan->allocateString(&stringHandle); - dupString->setSize(string.size() + 1); - - for (uint32 i = 0; i < string.size(); i++) - dupString->setValue(i, string.c_str()[i]); + dupString->setSize(size); - dupString->setValue(dupString->getSize() - 1, 0); + for (uint32 i = 0; i < size; i++) + dupString->setValue(i, rawString[i]); return stringHandle; } -- cgit v1.2.3 From b04535d487dd292b16768b036a0b24fc6965ed36 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Mon, 7 Jun 2010 02:11:01 +0000 Subject: SCI: Adjust kGetSaveFiles for SCI32. svn-id: r49469 --- engines/sci/engine/kfile.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index c48fb4035f..3e0ecd1a28 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -460,29 +460,37 @@ reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) { reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { Common::String game_id = s->_segMan->getString(argv[0]); - reg_t nametarget = argv[1]; - reg_t *slot = s->_segMan->derefRegPtr(argv[2], 0); debug(3, "kGetSaveFiles(%s)", game_id.c_str()); Common::Array saves; listSavegames(saves); - s->r_acc = NULL_REG; + uint totalSaves = MIN(saves.size(), MAX_SAVEGAME_NR); - for (uint i = 0; i < MIN(saves.size(), MAX_SAVEGAME_NR); i++) { - *slot++ = s->r_acc; // Store savegame ID - ++s->r_acc.offset; // Increase number of files found + reg_t *slot = s->_segMan->derefRegPtr(argv[2], totalSaves); - s->_segMan->strcpy(nametarget, saves[i].name); + if (!slot) { + warning("kGetSaveFiles: %04X:%04X invalid or too small to hold slot data", PRINT_REG(argv[2])); + totalSaves = 0; + } + + const uint bufSize = (totalSaves * SCI_MAX_SAVENAME_LENGTH) + 1; + char *saveNames = new char[bufSize]; + char *saveNamePtr = saveNames; - // Increase name offset pointer accordingly - nametarget.offset += SCI_MAX_SAVENAME_LENGTH; + for (uint i = 0; i < totalSaves; i++) { + *slot++ = make_reg(0, i); // Store slot + strcpy(saveNamePtr, saves[i].name); + saveNamePtr += SCI_MAX_SAVENAME_LENGTH; } - s->_segMan->strcpy(nametarget, ""); // Terminate list + *saveNamePtr = 0; // Terminate list - return s->r_acc; + s->_segMan->memcpy(argv[1], (byte *)saveNames, bufSize); + delete[] saveNames; + + return make_reg(0, totalSaves); } reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { -- cgit v1.2.3 From d30d57b923ddad194071d3fc07d79385c1ce4a37 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Mon, 7 Jun 2010 02:11:19 +0000 Subject: SCI: Relax signature of kCreateTextBitmap. svn-id: r49470 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/kernel32.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 0b7198d1bc..6ebee2dfbd 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -363,7 +363,7 @@ SciKernelFunction kfunct_mappers[] = { DEFUN("ListIndexOf", kListIndexOf, "lZo"), DEFUN("OnMe", kOnMe, "iio.*"), DEFUN("InPolygon", kInPolygon, "iio"), - DEFUN("CreateTextBitmap", kCreateTextBitmap, "iiio"), + DEFUN("CreateTextBitmap", kCreateTextBitmap, "i.*"), // SCI2.1 Kernel Functions DEFUN("Save", kSave, ".*"), diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index d2a3362aca..0afdc3f2eb 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -804,9 +804,16 @@ reg_t kInPolygon(EngineState *s, int argc, reg_t *argv) { reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { // TODO: argument 0 is usually 0, and arguments 1 and 2 are usually 1 - reg_t object = argv[3]; - Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); - debug("kCreateTextBitmap: %s", text.c_str()); + switch (argv[0].toUint16()) { + case 0: + if (argc != 4) { + warning("kCreateTextBitmap(0): expected 4 arguments, got %i", argc); + return NULL_REG; + } + reg_t object = argv[3]; + Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); + debug("kCreateTextBitmap: %s", text.c_str()); + } return NULL_REG; } -- cgit v1.2.3 From 1572524b645b9a40e097a99773cb40e7f954100c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 7 Jun 2010 09:06:06 +0000 Subject: Moved destruction of globals and resource manager to common M4 engine base class - this fixes a bug where resources were still being tossed after the resource manager was destroyed svn-id: r49476 --- engines/m4/m4.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index da271b10c9..a5db6660d8 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -146,6 +146,8 @@ MadsM4Engine::~MadsM4Engine() { delete _ws; delete _random; delete _palette; + delete _globals; + delete _resourceManager; } Common::Error MadsM4Engine::run() { @@ -303,8 +305,6 @@ M4Engine::M4Engine(OSystem *syst, const M4GameDescription *gameDesc): MadsM4Engi } M4Engine::~M4Engine() { - delete _resourceManager; - delete _globals; delete _converse; } @@ -500,8 +500,6 @@ MadsEngine::MadsEngine(OSystem *syst, const M4GameDescription *gameDesc): MadsM4 } MadsEngine::~MadsEngine() { - delete _globals; - delete _resourceManager; } Common::Error MadsEngine::run() { -- cgit v1.2.3 From 43ec405ffe08cef3168c9618be6169e6d81290f8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 7 Jun 2010 09:10:22 +0000 Subject: Some initial code for audio36 and sync36 patch support svn-id: r49477 --- engines/sci/resource.cpp | 77 ++++++++++++++++++++++++++++++++++++++---------- engines/sci/resource.h | 5 +++- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index f22c4d75fe..5d60438f7f 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -620,6 +620,9 @@ void ResourceManager::scanNewSources() { switch (source->source_type) { case kSourceDirectory: readResourcePatches(source); +#ifdef ENABLE_SCI32 + readResourcePatchesBase36(source); +#endif readWaveAudioPatches(); break; case kSourceExtMap: @@ -1063,10 +1066,10 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { } // version-agnostic patch application -void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, int resnumber) { +void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, uint16 resnumber, uint32 tuple) { Common::SeekableReadStream *fileStream = 0; Resource *newrsc; - ResourceId resId = ResourceId(restype, resnumber); + ResourceId resId = ResourceId(restype, resnumber, tuple); byte patchtype, patch_data_offset; int fsize; @@ -1137,32 +1140,73 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, debugC(1, kDebugLevelResMan, "Patching %s - OK", source->location_name.c_str()); } +#ifdef ENABLE_SCI32 + +void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { + // The base36 encoded audio36 and sync36 resources use a different naming scheme, because they + // cannot be described with a single resource number, but are a result of a + // tuple. Please don't be confused with the normal audio patches + // (*.aud) and normal sync patches (*.syn). audio36 patches can be seen for example in the AUD + // folder of GK1CD, and are like this file: @0CS0M00.0X1. GK1CD is the first game where these + // have been observed. The actual audio36 and sync36 resources exist in SCI1.1 as well, but the + // first game where external patch files for them have been found is GK1CD. The names of these + // files are base36 encoded, and we handle their decoding here. audio36 files start with a "@", + // whereas sync36 start with a "#" + + Common::String mask, name, inputName; + Common::ArchiveMemberList files; + //ResourceSource *psrcPatch; + + for (int i = kResourceTypeAudio36; i <= kResourceTypeSync36; ++i) { + // audio36 resources start with a @ + // sync36 resources start with a # + mask = (i == kResourceTypeAudio36) ? "@*.*" : "#*.*"; + SearchMan.listMatchingMembers(files, mask); + + for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { + name = (*x)->getName(); + inputName = (*x)->getName(); + inputName.toUppercase(); + inputName.deleteChar(0); // delete the first character (type) + inputName.deleteChar(7); // delete the dot + + // The base36 encoded resource contains the following: + // uint16 number, byte noun, byte verb, byte cond, byte seq + // TODO: this is still not right (especially the tuple part, seems to be overflowing?) + uint16 number = strtol(Common::String(inputName.c_str(), 2).c_str(), 0, 36); + uint32 tuple = strtol(inputName.c_str() + 2, 0, 36); + ResourceId resource36((ResourceType)i, number, tuple); + + if (i == kResourceTypeAudio36) + debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), tuple, resource36.toString().c_str()); + else + debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), tuple, resource36.toString().c_str()); + + /* + psrcPatch = new ResourceSource; + psrcPatch->source_type = kSourcePatch; + psrcPatch->location_name = name; + psrcPatch->resourceFile = 0; + processPatch(psrcPatch, (ResourceType)i, number, tuple); + */ + } + } +} + +#endif void ResourceManager::readResourcePatches(ResourceSource *source) { // Note: since some SCI1 games(KQ5 floppy, SQ4) might use SCI0 naming scheme for patch files // this function tries to read patch file with any supported naming scheme, // regardless of s_sciVersion value - // Note that audio36 and sync36 use a different naming scheme, because they cannot be described - // with a single resource number, but are a result of a tuple. - // Please don't be confused with the normal audio patches (*.aud) and normal sync patches (*.syn). - // audio36 patches can be seen for example in the AUD folder of GK1CD, and are like this file: - // @0CS0M00.0X1. GK1CD is the first game where these have been observed. The actual audio36 and - // sync36 resources exist in SCI1.1 as well, but the first game where external patch files for - // them have been found is GK1CD - Common::String mask, name; Common::ArchiveMemberList files; int number = -1; const char *szResType; ResourceSource *psrcPatch; - for (int i = kResourceTypeView; i <= kResourceTypeRobot; ++i) { - // TODO: add support for audio36 and sync36 files - // Such patches were introduced in SCI2, and didn't exist in SCI0-SCI1.1 - if (i == kResourceTypeAudio36 || i == kResourceTypeSync36) - continue; - + for (int i = kResourceTypeView; i <= kResourceTypeHeap; ++i) { files.clear(); szResType = getResourceTypeName((ResourceType)i); // SCI0 naming - type.nnn @@ -1173,6 +1217,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { mask = "*."; mask += resourceTypeSuffixes[i]; SearchMan.listMatchingMembers(files, mask); + for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { bool bAdd = false; name = (*x)->getName(); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 4c7068c580..43e61eaadb 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -452,7 +452,10 @@ protected: * Reads patch files from a local directory. */ void readResourcePatches(ResourceSource *source); - void processPatch(ResourceSource *source, ResourceType restype, int resnumber); +#ifdef ENABLE_SCI32 + void readResourcePatchesBase36(ResourceSource *source); +#endif + void processPatch(ResourceSource *source, ResourceType restype, uint16 resnumber, uint32 tuple = 0); /** * Process wave files as patches for Audio resources -- cgit v1.2.3 From 34f7c05e4dd0e7cd3f84576f57593d034f666d31 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 7 Jun 2010 09:19:42 +0000 Subject: Initial conversion of the AnimviewView class to use the expanded MadsAnimation class, rather than the older AAFile skeleton class svn-id: r49478 --- engines/m4/animation.cpp | 12 +++-- engines/m4/animation.h | 3 +- engines/m4/graphics.cpp | 11 +--- engines/m4/mads_anim.cpp | 128 ++++++++++++---------------------------------- engines/m4/mads_anim.h | 39 ++------------ engines/m4/mads_menus.cpp | 2 +- engines/m4/viewmgr.h | 13 +++++ 7 files changed, 63 insertions(+), 145 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index b372222bd0..1142ba48d1 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -39,6 +39,11 @@ MadsAnimation::MadsAnimation(MadsM4Engine *vm, MadsView *view): Animation(vm), _ _skipLoad = false; _unkIndex = -1; _messageCtr= 0; + _field12 = 0; + + _currentFrame = 0; + _oldFrameEntry = 0; + _nextFrameTimer = _madsVm->_currentTimer; } MadsAnimation::~MadsAnimation() { @@ -237,12 +242,14 @@ void MadsAnimation::load(const Common::String &filename, int abortTimers) { _messageCtr = 0; _skipLoad = true; +/* TODO: figure out extra stuff in this routine if (_field12) { _unkIndex = -1; int listIndex = _spriteListIndexes[_spriteListIndex]; SpriteAsset &spriteSet = _view->_spriteSlots.getSprite(listIndex); -warning("%d", spriteSet.getCount()); + ..?.. } +*/ // Initialise miscellaneous fields _currentFrame = 0; @@ -463,9 +470,6 @@ void MadsAnimation::loadInterface(M4Surface *&interfaceSurface, M4Surface *&dept MadsSceneResources sceneResources; sceneResources.load(_roomNumber, _interfaceFile.c_str(), 0, depthSurface, interfaceSurface); - // Rex only supports a single dialog draw style - assert(sceneResources.drawStyle == 2); - } else if (_animMode == 4) { // Load a scene interface interfaceSurface->madsLoadInterface(_interfaceFile); diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 883d3f2de6..5c7227a256 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -63,7 +63,7 @@ public: #define ANIM_SPRITE_SET_SIZE 50 -enum MadsAnimationFlags {ANIM_CUSTOM_FONT = 0x20}; +enum MadsAnimationFlags {ANIM_CUSTOM_FONT = 0x20, ANIM_HAS_SOUND = 0x8000}; class MadsAnimation: public Animation { private: @@ -114,6 +114,7 @@ public: virtual void setCurrentFrame(int frameNumber); bool freeFlag() const { return _freeFlag; } + int roomNumber() const { return _roomNumber; } }; } // End of namespace M4 diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 29aaa184a3..8624f18da1 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -633,16 +633,6 @@ void M4Surface::rexLoadBackground(Common::SeekableReadStream *source, RGBList ** int sceneWidth = sourceUnc->readUint16LE(); int sceneHeight = sourceUnc->readUint16LE(); int sceneSize = sceneWidth * sceneHeight; - if (sceneWidth > this->width()) { - warning("Background width is %i, too large to fit in screen. Setting it to %i", sceneWidth, this->width()); - sceneWidth = this->width(); - sceneSize = sceneWidth * sceneHeight; - } - if (sceneHeight > this->height()) { - warning("Background height is %i, too large to fit in screen.Setting it to %i", sceneHeight, this->height()); - sceneHeight = this->height(); - sceneSize = sceneWidth * sceneHeight; - } // Set palette if (!palData) { @@ -658,6 +648,7 @@ void M4Surface::rexLoadBackground(Common::SeekableReadStream *source, RGBList ** sourceUnc = packData.getItemStream(1); assert((int)sourceUnc->size() >= sceneSize); + create(sceneWidth, sceneHeight, 1); byte *pData = (byte *)pixels; sourceUnc->read(pData, sceneSize); diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index 24a041e04d..7709b65780 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -441,7 +441,11 @@ void TextviewView::processText() { AnimviewView::AnimviewView(MadsM4Engine *vm): View(vm, Common::Rect(0, 0, vm->_screen->width(), vm->_screen->height())), - _bgSurface(vm->_screen->width(), MADS_SURFACE_HEIGHT) { + MadsView(this), _backgroundSurface(MADS_SURFACE_WIDTH, MADS_SURFACE_HEIGHT), + _codeSurface(MADS_SURFACE_WIDTH, MADS_SURFACE_HEIGHT) { + + MadsView::_bgSurface = &_backgroundSurface; + MadsView::_depthSurface = &_codeSurface; _screenType = VIEWID_ANIMVIEW; _screenFlags.layer = LAYER_BACKGROUND; @@ -452,27 +456,28 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): _palData = NULL; _previousUpdate = 0; _transition = kTransitionNone; + _activeAnimation = NULL; reset(); // Set up system palette colors _vm->_palette->setMadsSystemPalette(); clear(); - _bgSurface.clear(); + _backgroundSurface.clear(); - int y = (height() - MADS_SURFACE_HEIGHT) / 2; setColor(2); - hLine(0, width() - 1, y - 2); - hLine(0, width() - 1, height() - y + 1); + hLine(0, width() - 1, MADS_Y_OFFSET - 2); + hLine(0, width() - 1, MADS_Y_OFFSET + MADS_SURFACE_HEIGHT + 2); } AnimviewView::~AnimviewView() { if (_script) _vm->res()->toss(_resourceName); + delete _activeAnimation; } void AnimviewView::reset() { - _bgSurface.clear(); + _backgroundSurface.clear(); _soundDriverLoaded = false; } @@ -515,19 +520,26 @@ void AnimviewView::updateState() { _previousUpdate = g_system->getMillis(); } - // Check if we're ready for the next command - bool animRunning = false; - if (!animRunning) { + if (!_activeAnimation) { + readNextCommand(); + assert(_activeAnimation); + } + + // Update the current animation + _activeAnimation->update(); + if (_activeAnimation->freeFlag()) { + delete _activeAnimation; + _activeAnimation = NULL; + if (_script->eos() || _script->err()) { scriptDone(); return; } readNextCommand(); - - // FIXME: Replace flag with proper animation end check - animRunning = true; } + + refresh(); } void AnimviewView::readNextCommand() { @@ -562,46 +574,15 @@ void AnimviewView::readNextCommand() { if (strchr(_currentLine, '.') == NULL) strcat(_currentLine, ".aa"); - AAFile aaFile(_currentLine, _vm); - - // Initial validation - if (aaFile.flags & AA_HAS_FONT) { - assert(_vm->_resourceManager->resourceExists(aaFile.fontResource.c_str())); - } - - for (int seriesCtr = 0; seriesCtr < aaFile.seriesCount; ++seriesCtr) - assert(_vm->_resourceManager->resourceExists(aaFile.filenames[seriesCtr].c_str())); - - // Start sound - if (aaFile.flags & AA_HAS_SOUND) { - char buffer[100]; - strcpy(buffer, aaFile.soundName.c_str()); - buffer[0] = 'A'; // A for AdLib resource - - /*Common::SeekableReadStream *stream = */_vm->_resourceManager->get(buffer); - - _vm->_resourceManager->toss(buffer); - } + _activeAnimation = new MadsAnimation(_vm, this); + _activeAnimation->load(_currentLine, 0); + _backgroundSurface.loadBackground(_activeAnimation->roomNumber()); + _codeSurface.create(_backgroundSurface.width(), _backgroundSurface.height(), 1); + _codeSurface.clear(); - char artFile[80]; - sprintf(artFile, "rm%d.art", aaFile.roomNumber); - - // Not all scenes have a background. If there is one, refresh it - if (_vm->_resourceManager->resourceExists(artFile)) { - if (_palData) { - _vm->_palette->deleteRange(_palData); - delete _palData; - } - _bgSurface.loadBackground(aaFile.roomNumber, &_palData); - _vm->_palette->addRange(_palData); - _bgSurface.translate(_palData); - } - - // Grab what the final palete will be - RGB8 destPalette[256]; - _vm->_palette->grabPalette(destPalette, 0, 256); - + _spriteSlots.fullRefresh(); +/* // Handle scene transition switch (_transition) { case kTransitionNone: @@ -631,16 +612,14 @@ void AnimviewView::readNextCommand() { // nothing to do break; } - - // Refresh the view - int yp = (height() - _bgSurface.height()) / 2; - _bgSurface.copyTo(this, 0, yp); +*/ _vm->_resourceManager->toss(_currentLine); } void AnimviewView::scriptDone() { +return; AnimviewCallback fn = _callback; MadsM4Engine *vm = _vm; @@ -714,45 +693,4 @@ void AnimviewView::processCommand() { } } -AAFile::AAFile(const char *resourceName, MadsM4Engine* vm): MadsPack(resourceName, vm) { - Common::MemoryReadStream stream1(*getItemStream(1)); - Common::MemoryReadStream stream2(*getItemStream(2)); - - Common::MemoryReadStream stream(*getItemStream(0)); - - seriesCount = stream.readUint16LE(); - frameCount = stream.readUint16LE(); - frameEntryCount = stream.readUint16LE(); - stream.skip(3); - flags = stream.readByte(); - stream.skip(4); - roomNumber = stream.readUint16LE(); - stream.skip(10); - frameTicks = stream.readUint16LE(); - - stream.skip(21); - for (int i = 0; i < 10; ++i) { - char filename[13]; - stream.read(filename, 13); - filenames.push_back(Common::String(filename, 13)); - } - - stream.skip(81); - char name[100]; - stream.read(name, 13); - lbmFilename = Common::String(name, 13); - - stream.skip(365); - stream.read(name, 13); - spritesFilename = Common::String(name, 13); - - stream.skip(48); - stream.read(name, 13); - soundName = Common::String(name, 13); - - stream.skip(26); - stream.read(name, 14); - fontResource = Common::String(name, 14); -} - } diff --git a/engines/m4/mads_anim.h b/engines/m4/mads_anim.h index 680c5ff901..8c4a5e6fb7 100644 --- a/engines/m4/mads_anim.h +++ b/engines/m4/mads_anim.h @@ -28,24 +28,12 @@ #include "m4/viewmgr.h" #include "m4/compression.h" +#include "m4/animation.h" #include "common/str-array.h" namespace M4 { -enum SceneTransition { - kTransitionNone = 0, - kTransitionFadeIn = 1, - kTransitionFadeIn2 = 2, - kTransitionBoxInBottomLeft = 3, - kTransitionBoxInBottomRight = 4, - kTransitionBoxInTopLeft = 5, - kTransitionBoxInTopRight = 6, - kTransitionPanLeftToRight = 7, - kTransitionPanRightToLeft = 8, - kTransitionCircleIn = 9 -}; - typedef void (*TextviewCallback)(MadsM4Engine *vm); class TextviewView : public View { @@ -89,36 +77,19 @@ public: typedef void (*AnimviewCallback)(MadsM4Engine *vm); -class AAFile : public MadsPack { -public: - AAFile(const char *resourceName, MadsM4Engine* vm); - - uint16 seriesCount; - uint16 frameCount; - uint16 frameEntryCount; - uint8 flags; - uint16 roomNumber; - uint16 frameTicks; - Common::StringArray filenames; - Common::String lbmFilename; - Common::String spritesFilename; - Common::String soundName; - Common::String fontResource; -}; - -enum AAFlags {AA_HAS_FONT = 0x20, AA_HAS_SOUND = 0x8000}; - -class AnimviewView : public View { +class AnimviewView : public View, MadsView { private: char _resourceName[80]; Common::SeekableReadStream *_script; uint32 _previousUpdate; char _currentLine[80]; - M4Surface _bgSurface; + M4Surface _backgroundSurface; + M4Surface _codeSurface; AnimviewCallback _callback; bool _soundDriverLoaded; RGBList *_palData; int _transition; + MadsAnimation *_activeAnimation; void reset(); void readNextCommand(); diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index d00272d31e..94894e78be 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -49,7 +49,7 @@ RexMainMenuView::RexMainMenuView(MadsM4Engine *vm): _skipFlag = false; // Load the background for the Rex Nebular game - _bgSurface = new M4Surface(width(), MADS_SURFACE_HEIGHT); + _bgSurface = new M4Surface(); _bgSurface->loadBackground(REX_MENUSCREEN, &_bgPalData); _vm->_palette->addRange(_bgPalData); _bgSurface->translate(_bgPalData); diff --git a/engines/m4/viewmgr.h b/engines/m4/viewmgr.h index 16c3d6ecc3..211e6087f4 100644 --- a/engines/m4/viewmgr.h +++ b/engines/m4/viewmgr.h @@ -42,6 +42,19 @@ namespace M4 { class View; class ViewManager; +enum SceneTransition { + kTransitionNone = 0, + kTransitionFadeIn = 1, + kTransitionFadeIn2 = 2, + kTransitionBoxInBottomLeft = 3, + kTransitionBoxInBottomRight = 4, + kTransitionBoxInTopLeft = 5, + kTransitionBoxInTopRight = 6, + kTransitionPanLeftToRight = 7, + kTransitionPanRightToLeft = 8, + kTransitionCircleIn = 9 +}; + enum {SCREEN_DIALOG, SCREEN_BUFFER, SCREEN_TEXT, SCREEN_TRANSPARENT}; enum ScreenEventType {SCREVENT_NONE = 0, SCREVENT_KEY = 1, SCREVENT_MOUSE = 2, SCREVENT_ALL = 3}; enum ScreenLayers { -- cgit v1.2.3 From b2678ddf52117773bf08bed260a6512464e286aa Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 7 Jun 2010 09:35:59 +0000 Subject: Changed a create call to setSize to fix compiler error svn-id: r49479 --- engines/m4/mads_anim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index 7709b65780..4400dbf094 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -578,7 +578,7 @@ void AnimviewView::readNextCommand() { _activeAnimation->load(_currentLine, 0); _backgroundSurface.loadBackground(_activeAnimation->roomNumber()); - _codeSurface.create(_backgroundSurface.width(), _backgroundSurface.height(), 1); + _codeSurface.setSize(_backgroundSurface.width(), _backgroundSurface.height()); _codeSurface.clear(); _spriteSlots.fullRefresh(); -- cgit v1.2.3 From 62402e743ece682c19f986ab25c9941686262ef7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 7 Jun 2010 10:17:44 +0000 Subject: Added extra positioning and dummy depths surface so that the introduction cutscene now starts up svn-id: r49480 --- engines/m4/mads_anim.cpp | 11 ++--------- engines/m4/mads_views.cpp | 25 +++++++++++++------------ engines/m4/mads_views.h | 7 ++++--- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index 4400dbf094..e1dbbaf106 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -446,6 +446,7 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): MadsView::_bgSurface = &_backgroundSurface; MadsView::_depthSurface = &_codeSurface; + MadsView::_yOffset = MADS_Y_OFFSET; _screenType = VIEWID_ANIMVIEW; _screenFlags.layer = LAYER_BACKGROUND; @@ -512,14 +513,6 @@ void AnimviewView::updateState() { if (!_script) return; - // Only update state if wait period has expired - if (_previousUpdate > 0) { - if (g_system->getMillis() - _previousUpdate < 100) - return; - - _previousUpdate = g_system->getMillis(); - } - if (!_activeAnimation) { readNextCommand(); assert(_activeAnimation); @@ -579,7 +572,7 @@ void AnimviewView::readNextCommand() { _backgroundSurface.loadBackground(_activeAnimation->roomNumber()); _codeSurface.setSize(_backgroundSurface.width(), _backgroundSurface.height()); - _codeSurface.clear(); + _codeSurface.fillRect(_codeSurface.bounds(), 0xff); _spriteSlots.fullRefresh(); /* diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index cfcb113dcd..c7b4f76a00 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -170,7 +170,7 @@ void MadsSpriteSlots::drawBackground() { _owner._dirtyAreas[i].active = false; } -void MadsSpriteSlots::drawForeground(View *view) { +void MadsSpriteSlots::drawForeground(View *view, int yOffset) { DepthList depthList; // Get a list of sprite object depths for active objects @@ -196,7 +196,7 @@ void MadsSpriteSlots::drawForeground(View *view) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); - spr->copyTo(view, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, 0); + spr->copyTo(view, slot.xp, slot.yp + yOffset, slot.depth, _owner._depthSurface, slot.scale, 0); } else { int xp, yp; M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); @@ -211,10 +211,10 @@ void MadsSpriteSlots::drawForeground(View *view) { if (slot.depth > 1) { // Draw the frame with depth processing - spr->copyTo(view, xp, yp, slot.depth, _owner._depthSurface, 100, 0); + spr->copyTo(view, xp, yp + yOffset, slot.depth, _owner._depthSurface, 100, 0); } else { // No depth, so simply draw the image - spr->copyTo(view, xp, yp, 0); + spr->copyTo(view, xp, yp + yOffset, 0); } } } @@ -326,12 +326,12 @@ void MadsTextDisplay::setDirtyAreas2() { } } -void MadsTextDisplay::draw(View *view) { +void MadsTextDisplay::draw(View *view, int yOffset) { for (uint idx = 0; idx < _entries.size(); ++idx) { if (_entries[idx].active && (_entries[idx].expire >= 0)) { _entries[idx].font->setColours(_entries[idx].colour1, _entries[idx].colour2, 0); _entries[idx].font->writeString(view, _entries[idx].msg, - _entries[idx].bounds.left, _entries[idx].bounds.top, _entries[idx].bounds.width(), + _entries[idx].bounds.left, _entries[idx].bounds.top + yOffset, _entries[idx].bounds.width(), _entries[idx].spacing); } } @@ -855,10 +855,10 @@ void MadsDirtyAreas::mergeAreas(int idx1, int idx2) { da1.textActive = true; } -void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src) { +void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset) { for (uint i = 0; i < _entries.size(); ++i) { if (_entries[i].active && _entries[i].bounds.isValidRect()) - src->copyTo(dest, _entries[i].bounds, _entries[i].bounds.left, _entries[i].bounds.top); + src->copyTo(dest, _entries[i].bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset); } } @@ -1180,7 +1180,8 @@ MadsView::MadsView(View *view): _view(view), _dynamicHotspots(*this), _sequenceL _abortTimers2 = 0; _abortTimersMode = ABORTMODE_0; _abortTimersMode2 = ABORTMODE_0; - + + _yOffset = 0; _depthSurface = NULL; _bgSurface = NULL; _sceneAnimation = new MadsAnimation(_vm, this); @@ -1201,7 +1202,7 @@ void MadsView::refresh() { _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); // Copy dirty areas to the main display surface - _dirtyAreas.copy(_view, _bgSurface); + _dirtyAreas.copy(_view, _bgSurface, _yOffset); // Handle dirty areas for foreground objects _spriteSlots.setDirtyAreas(); @@ -1209,10 +1210,10 @@ void MadsView::refresh() { _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); // Draw foreground sprites - _spriteSlots.drawForeground(_view); + _spriteSlots.drawForeground(_view, _yOffset); // Draw text elements onto the view - _textDisplay.draw(_view); + _textDisplay.draw(_view, _yOffset); // Remove any sprite slots that are no longer needed _spriteSlots.cleanUp(); diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index f44d640c8b..29adb7048a 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -98,7 +98,7 @@ public: void deleteTimer(int seqIndex); void drawBackground(); - void drawForeground(View *view); + void drawForeground(View *view, int yOffset); void setDirtyAreas(); void fullRefresh(); void cleanUp(); @@ -139,7 +139,7 @@ public: int add(int xp, int yp, uint fontColour, int charSpacing, const char *msg, Font *font); void clear(); - void draw(View *view); + void draw(View *view, int yOffset); void setDirtyAreas(); void setDirtyAreas2(); void cleanUp(); @@ -289,7 +289,7 @@ public: void merge(int startIndex, int count); bool intersects(int idx1, int idx2); void mergeAreas(int idx1, int idx2); - void copy(M4Surface *dest, M4Surface *src); + void copy(M4Surface *dest, M4Surface *src, int yOffset); }; enum SpriteAnimType {ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2}; @@ -398,6 +398,7 @@ public: M4Surface *_depthSurface; M4Surface *_bgSurface; + int _yOffset; public: MadsView(View *view); ~MadsView(); -- cgit v1.2.3 From d5b5a8dbaeac596d02ad6063a61f566c6c092de0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 7 Jun 2010 11:44:52 +0000 Subject: Allow for the other audio36 patch naming schemes (Mac and some Torin ones). svn-id: r49482 --- engines/sci/resource.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 5d60438f7f..d700513817 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1150,18 +1150,23 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { // folder of GK1CD, and are like this file: @0CS0M00.0X1. GK1CD is the first game where these // have been observed. The actual audio36 and sync36 resources exist in SCI1.1 as well, but the // first game where external patch files for them have been found is GK1CD. The names of these - // files are base36 encoded, and we handle their decoding here. audio36 files start with a "@", - // whereas sync36 start with a "#" + // files are base36 encoded, and we handle their decoding here. audio36 files start with a '@', + // whereas sync36 start with a '#'. Mac versions begin with 'A' (probably meaning AIFF). Torin + // has several that begin with 'B'. - Common::String mask, name, inputName; + Common::String name, inputName; Common::ArchiveMemberList files; //ResourceSource *psrcPatch; for (int i = kResourceTypeAudio36; i <= kResourceTypeSync36; ++i) { - // audio36 resources start with a @ + // audio36 resources start with a @, A, or B // sync36 resources start with a # - mask = (i == kResourceTypeAudio36) ? "@*.*" : "#*.*"; - SearchMan.listMatchingMembers(files, mask); + if (i == kResourceTypeAudio36) { + SearchMan.listMatchingMembers(files, "@???????.???"); + SearchMan.listMatchingMembers(files, "A???????.???"); + SearchMan.listMatchingMembers(files, "B???????.???"); + } else + SearchMan.listMatchingMembers(files, "#???????.???"); for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { name = (*x)->getName(); -- cgit v1.2.3 From 8ef5d55edb5b463abca1adf0ed1f359ce94bd391 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 7 Jun 2010 13:47:14 +0000 Subject: Fix gcc warning about an comparison which is always false due to data type range. svn-id: r49484 --- engines/sci/resource.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index d700513817..4818428663 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1073,7 +1073,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, byte patchtype, patch_data_offset; int fsize; - if (resnumber == -1) + if (resnumber == 0xFFFF) return; if (source->resourceFile) { -- cgit v1.2.3 From 356728dab7f2c4cedf73684d7fe3b968be7396fd Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Mon, 7 Jun 2010 13:47:27 +0000 Subject: PSP: found bug in fast getMillis() implementation. Fixed it by adding a fixed amount to the time counter. svn-id: r49485 --- backends/platform/psp/osys_psp.cpp | 3 +-- backends/platform/psp/osys_psp.h | 2 ++ backends/platform/psp/thread.cpp | 41 +++++++++++++++++++++++++++++++++++--- backends/platform/psp/thread.h | 16 +++++++++++++-- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index a36ae1847f..2043a4bef2 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -37,7 +37,6 @@ #include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/osys_psp.h" #include "backends/platform/psp/powerman.h" -#include "backends/platform/psp/thread.h" #include "backends/saves/psp/psp-saves.h" #include "backends/timer/default/default-timer.h" @@ -300,7 +299,7 @@ bool OSystem_PSP::pollEvent(Common::Event &event) { } uint32 OSystem_PSP::getMillis() { - return PspThread::getMillis(); + return _pspRtc.getMillis(); } void OSystem_PSP::delayMillis(uint msecs) { diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index 3f075d0139..a6c84ba39a 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -40,6 +40,7 @@ #include "backends/platform/psp/input.h" #include "backends/platform/psp/audio.h" #include "backends/timer/psp/timer.h" +#include "backends/platform/psp/thread.h" #include @@ -59,6 +60,7 @@ private: InputHandler _inputHandler; PspAudio _audio; PspTimer _pspTimer; + PspRtc _pspRtc; void initSDL(); diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index 88e7b6fe38..4e7d5eada9 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -29,6 +29,7 @@ #include #include "backends/platform/psp/thread.h" +#include "backends/platform/psp/trace.h" void PspThread::delayMillis(uint32 ms) { sceKernelDelayThread(ms * 1000); @@ -38,15 +39,49 @@ void PspThread::delayMicros(uint32 us) { sceKernelDelayThread(us); } -uint32 PspThread::getMillis() { +void PspRtc::init() { // init our starting ticks uint32 ticks[2]; sceRtcGetCurrentTick((u64 *)ticks); - return (ticks[0]/1000); + + _startMillis = ticks[0]/1000; + _startMicros = ticks[0]; + //_lastMillis = ticks[0]/1000; //debug - only when we don't subtract startMillis +} + +#define MS_LOOP_AROUND 4294967 /* We loop every 2^32 / 1000 = 71 minutes */ +#define MS_LOOP_CHECK 60000 /* Threading can cause weird mixups without this */ + +// Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause +// unpredictable results +uint32 PspRtc::getMillis() { + uint32 ticks[2]; + + sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays + + uint32 millis = ticks[0]/1000; + millis -= _startMillis; // get ms since start of program + + if ((int)_lastMillis - (int)millis > MS_LOOP_CHECK) { // we must have looped around + if (_looped == false) { // check to make sure threads do this once + _looped = true; + _milliOffset += MS_LOOP_AROUND; // add the needed offset + PSP_DEBUG_PRINT("looping around. last ms[%d], curr ms[%d]\n", _lastMillis, millis); + } + } else { + _looped = false; + } + + _lastMillis = millis; + + return millis + _milliOffset; } -uint32 PspThread::getMicros() { +uint32 PspRtc::getMicros() { uint32 ticks[2]; + sceRtcGetCurrentTick((u64 *)ticks); + ticks[0] -= _startMicros; + return ticks[0]; } diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index e83eead68e..380159fa2d 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -32,8 +32,20 @@ class PspThread { public: static void delayMillis(uint32 ms); static void delayMicros(uint32 us); - static uint32 getMillis(); - static uint32 getMicros(); +}; + +class PspRtc { +private: + uint32 _startMillis; + uint32 _startMicros; + uint32 _lastMillis; + uint32 _milliOffset; // to prevent looping around of millis + bool _looped; // make sure we only loop once +public: + PspRtc() : _startMillis(0), _startMicros(0), _lastMillis(0), _milliOffset(0), _looped(false) { init(); } + void init(); + uint32 getMillis(); + uint32 getMicros(); }; enum ThreadPriority { -- cgit v1.2.3 From 2c950b321c3354144debd6a7f5e7d19cbc6c3a32 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 7 Jun 2010 15:14:58 +0000 Subject: Fixed regression from commit #49465 - there are in fact two restAdjust variables, the current and global one svn-id: r49486 --- engines/sci/console.cpp | 2 +- engines/sci/engine/scriptdebug.cpp | 6 ++-- engines/sci/engine/state.h | 1 + engines/sci/engine/vm.cpp | 58 +++++++++++++++++++------------------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 2549be9403..814fbff636 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -597,7 +597,7 @@ bool Console::cmdSetParseNodes(int argc, const char **argv) { bool Console::cmdRegisters(int argc, const char **argv) { EngineState *s = _engine->_gamestate; DebugPrintf("Current register values:\n"); - DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjust); + DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjustCur); if (!s->_executionStack.empty()) { DebugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n", diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 159c278e8c..b465ab3d4e 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -205,12 +205,12 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode if (opcode == op_callk) { - int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjust); + int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjustCur); int argc = ((s->xs->sp)[- stackframe - 1]).offset; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) - argc += (s->restAdjust); + argc += (s->restAdjustCur); printf(" Kernel params: ("); @@ -221,7 +221,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod } printf(")\n"); } else if ((opcode == op_send) || (opcode == op_self)) { - int restmod = s->restAdjust; + int restmod = s->restAdjustCur; int stackframe = (scr[pos.offset + 1] >> 1) + restmod; reg_t *sb = s->xs->sp; uint16 selector; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 68e6a5516a..bcdf66d6ef 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -143,6 +143,7 @@ public: reg_t r_acc; /**< Accumulator */ int16 restAdjust; /**< &rest register (only used for save games) */ + int16 restAdjustCur; /**< current &rest register (only used for save games) */ reg_t r_prev; /**< previous comparison result */ StackPtr stack_base; /**< Pointer to the least stack element */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b04cc473b5..1dcdf450ba 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -718,7 +718,7 @@ void run_vm(EngineState *s, bool restoring) { StackPtr s_temp; // Temporary stack pointer int16 opparams[4]; // opcode parameters - s->restAdjust = s->restAdjust; + s->restAdjustCur = s->restAdjust; // &rest adjusts the parameter count by this value // Current execution data: s->xs = &(s->_executionStack.back()); @@ -1116,17 +1116,17 @@ void run_vm(EngineState *s, bool restoring) { case op_call: { // 0x20 (32) int argc = (opparams[1] >> 1) // Given as offset, but we need count - + 1 + s->restAdjust; + + 1 + s->restAdjustCur; StackPtr call_base = s->xs->sp - argc; - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->restAdjustCur; xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment, s->xs->addr.pc.offset + opparams[0]), s->xs->sp, s->xs->objp, - (validate_arithmetic(*call_base)) + s->restAdjust, + (validate_arithmetic(*call_base)) + s->restAdjustCur, call_base, NULL_SELECTOR, s->xs->objp, s->_executionStack.size()-1, s->xs->local_segment); - s->restAdjust = 0; // Used up the &rest adjustment + s->restAdjustCur = 0; // Used up the &rest adjustment s->xs->sp = call_base; s->_executionStackPosChanged = true; @@ -1140,19 +1140,19 @@ void run_vm(EngineState *s, bool restoring) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) { - s->xs->sp -= s->restAdjust; - s->restAdjust = 0; // We just used up the s->restAdjust, remember? + s->xs->sp -= s->restAdjustCur; + s->restAdjust = 0; // We just used up the s->restAdjustCur, remember? } int argc = validate_arithmetic(s->xs->sp[0]); if (!oldScriptHeader) - argc += s->restAdjust; + argc += s->restAdjustCur; callKernelFunc(s, opparams[0], argc); if (!oldScriptHeader) - s->restAdjust = s->restAdjust; + s->restAdjustCur = s->restAdjust; // Calculate xs again: The kernel function might // have spawned a new VM @@ -1163,27 +1163,27 @@ void run_vm(EngineState *s, bool restoring) { } case op_callb: // 0x22 (34) - temp = ((opparams[1] >> 1) + s->restAdjust + 1); + temp = ((opparams[1] >> 1) + s->restAdjustCur + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjust; + s->xs->sp[0].offset += s->restAdjustCur; xs_new = execute_method(s, 0, opparams[0], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjust = 0; // Used up the &rest adjustment + s->restAdjustCur = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; break; case op_calle: // 0x23 (35) - temp = ((opparams[2] >> 1) + s->restAdjust + 1); + temp = ((opparams[2] >> 1) + s->restAdjustCur + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjust; + s->xs->sp[0].offset += s->restAdjustCur; xs_new = execute_method(s, opparams[0], opparams[1], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjust = 0; // Used up the &rest adjustment + s->restAdjustCur = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; @@ -1201,7 +1201,7 @@ void run_vm(EngineState *s, bool restoring) { s->_executionStack.pop_back(); s->_executionStackPosChanged = true; - s->restAdjust = s->restAdjust; // Update &rest + s->restAdjust = s->restAdjustCur; // Update &rest return; // "Hard" return } @@ -1234,16 +1234,16 @@ void run_vm(EngineState *s, bool restoring) { case op_send: // 0x25 (37) s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->restAdjustCur; xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp, - (int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp); + (int)(opparams[0] >> 1) + (uint16)s->restAdjustCur, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->restAdjustCur = 0; break; @@ -1263,17 +1263,17 @@ void run_vm(EngineState *s, bool restoring) { case op_self: // 0x2a (42) s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->restAdjustCur; xs_new = send_selector(s, s->xs->objp, s->xs->objp, - s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjust, + s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjustCur, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->restAdjustCur = 0; break; case op_super: // 0x2b (43) @@ -1283,24 +1283,24 @@ void run_vm(EngineState *s, bool restoring) { error("[VM]: Invalid superclass in object"); else { s_temp = s->xs->sp; - s->xs->sp -= ((opparams[1] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[1] >> 1) + s->restAdjustCur); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->restAdjustCur; xs_new = send_selector(s, r_temp, s->xs->objp, s_temp, - (int)(opparams[1] >> 1) + (uint16)s->restAdjust, + (int)(opparams[1] >> 1) + (uint16)s->restAdjustCur, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->restAdjustCur = 0; } break; case op_rest: // 0x2c (44) temp = (uint16) opparams[0]; // First argument - s->restAdjust = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't + s->restAdjustCur = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't for (; temp <= s->xs->argc; temp++) PUSH32(s->xs->variables_argp[temp]); -- cgit v1.2.3 From 0e95d8a5faee7f674665067505635a9d31cc174b Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Mon, 7 Jun 2010 17:14:42 +0000 Subject: Groovie: - Rewritten T7G's font code to subclass Graphics::Font and make it cleaner. - Use theme fonts for the Mac version of T7G (which used ugly system fonts originally). With this the Mac version should be completable. - Cleanup include interdependencies. svn-id: r49487 --- engines/groovie/cell.h | 6 +- engines/groovie/cursor.h | 3 +- engines/groovie/debug.cpp | 6 +- engines/groovie/debug.h | 4 +- engines/groovie/detection.cpp | 4 +- engines/groovie/font.cpp | 157 +++++++++++++++++++++--------------------- engines/groovie/font.h | 36 +++++++--- engines/groovie/graphics.cpp | 3 +- engines/groovie/graphics.h | 2 + engines/groovie/groovie.cpp | 33 ++++++--- engines/groovie/groovie.h | 19 ++--- engines/groovie/music.cpp | 3 +- engines/groovie/music.h | 10 +-- engines/groovie/player.cpp | 2 +- engines/groovie/resource.cpp | 2 +- engines/groovie/roq.cpp | 3 +- engines/groovie/script.cpp | 62 ++++++++++++----- engines/groovie/script.h | 15 ++-- engines/groovie/vdx.cpp | 3 +- engines/groovie/vdx.h | 4 ++ 20 files changed, 223 insertions(+), 154 deletions(-) diff --git a/engines/groovie/cell.h b/engines/groovie/cell.h index 39ee529beb..a5feab4017 100644 --- a/engines/groovie/cell.h +++ b/engines/groovie/cell.h @@ -26,11 +26,7 @@ #ifndef GROOVIE_CELL_H #define GROOVIE_CELL_H -#include "common/file.h" -#include "common/util.h" - -#include "groovie/cell.h" -#include "groovie/groovie.h" +#include "common/textconsole.h" #define BOARDSIZE 7 #define CELL_CLEAR 0 diff --git a/engines/groovie/cursor.h b/engines/groovie/cursor.h index 83aebb37d3..7a1f3ccc0e 100644 --- a/engines/groovie/cursor.h +++ b/engines/groovie/cursor.h @@ -26,9 +26,8 @@ #ifndef GROOVIE_CURSOR_H #define GROOVIE_CURSOR_H -#include "common/system.h" #include "common/array.h" -#include "common/file.h" +#include "common/system.h" namespace Common { class MacResManager; diff --git a/engines/groovie/debug.cpp b/engines/groovie/debug.cpp index 41ebb2fbcd..7055965917 100644 --- a/engines/groovie/debug.cpp +++ b/engines/groovie/debug.cpp @@ -24,15 +24,17 @@ */ #include "groovie/debug.h" +#include "groovie/graphics.h" #include "groovie/groovie.h" #include "groovie/script.h" #include "common/debug-channels.h" +#include "common/system.h" namespace Groovie { Debugger::Debugger(GroovieEngine *vm) : - _vm (vm), _script(_vm->_script), _syst(_vm->_system) { + _vm(vm), _script(_vm->_script) { // Register the debugger comands DCmd_Register("step", WRAP_METHOD(Debugger, cmd_step)); @@ -136,7 +138,7 @@ bool Debugger::cmd_playref(int argc, const char **argv) { bool Debugger::cmd_dumppal(int argc, const char **argv) { uint16 i; byte palettedump[256 * 4]; - _syst->grabPalette(palettedump, 0, 256); + _vm->_system->grabPalette(palettedump, 0, 256); for (i = 0; i < 256; i++) { DebugPrintf("%3d: %3d,%3d,%3d,%3d\n", i, palettedump[(i * 4)], palettedump[(i * 4) + 1], palettedump[(i * 4) + 2], palettedump[(i * 4) + 3]); diff --git a/engines/groovie/debug.h b/engines/groovie/debug.h index dadba9482c..e21746a426 100644 --- a/engines/groovie/debug.h +++ b/engines/groovie/debug.h @@ -27,12 +27,11 @@ #define GROOVIE_DEBUG_H #include "gui/debugger.h" -#include "engines/engine.h" namespace Groovie { -class Script; class GroovieEngine; +class Script; class Debugger : public GUI::Debugger { public: @@ -42,7 +41,6 @@ public: private: GroovieEngine *_vm; Script *_script; - OSystem *_syst; int getNumber(const char *arg); diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index 5b0fa4b3b1..ec401e7d24 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -23,12 +23,12 @@ * */ -#include "common/savefile.h" - #include "groovie/groovie.h" #include "groovie/detection.h" #include "groovie/saveload.h" +#include "common/system.h" + namespace Groovie { static const PlainGameDescriptor groovieGames[] = { diff --git a/engines/groovie/font.cpp b/engines/groovie/font.cpp index ece8447735..6aa6c89d31 100644 --- a/engines/groovie/font.cpp +++ b/engines/groovie/font.cpp @@ -23,106 +23,105 @@ * */ -#include "common/file.h" -#include "graphics/surface.h" - #include "groovie/font.h" namespace Groovie { -Font::Font(OSystem *syst) : - _syst(syst), _sphinxfnt(NULL) { - - Common::File fontfile; - if (!fontfile.open("sphinx.fnt")) { - error("Groovie::Font: Couldn't open sphinx.fnt"); - } - uint16 fontfilesize = fontfile.size(); - _sphinxfnt = fontfile.readStream(fontfilesize); - fontfile.close(); +T7GFont::T7GFont() : _maxHeight(0), _maxWidth(0), _glyphs(0) { } -Font::~Font() { - delete _sphinxfnt; +T7GFont::~T7GFont() { + delete[] _glyphs; } -void Font::printstring(const char *messagein) { - uint16 totalwidth = 0, currxoffset, i; +bool T7GFont::load(Common::SeekableReadStream &stream) { + // Read the mapping of characters to glyphs + if (stream.read(_mapChar2Glyph, 128) < 128) { + error("Groovie::T7GFont: Couldn't read the character to glyph map"); + return false; + } - char message[15]; - memset(message, 0, 15); + // Calculate the number of glyphs + byte numGlyphs = 0; + for (int i = 0; i < 128; i++) + if (_mapChar2Glyph[i] >= numGlyphs) + numGlyphs = _mapChar2Glyph[i] + 1; - // Clear the top bar - Common::Rect topbar(640, 80); - Graphics::Surface *gamescreen; - gamescreen = _syst->lockScreen(); - gamescreen->fillRect(topbar, 0); - _syst->unlockScreen(); + // Read the glyph offsets + uint16 *glyphOffsets = new uint16[numGlyphs]; + for (int i = 0; i < numGlyphs; i++) + glyphOffsets[i] = stream.readUint16LE(); - for (i = 0; i < 14; i++) { - char chartocopy = messagein[i]; - if (chartocopy <= 0x00 || chartocopy == 0x24) { - break; - } - message[i] = chartocopy; + if (stream.eos()) { + error("Groovie::T7GFont: Couldn't read the glyph offsets"); + return false; } - Common::rtrim(message); - for (i = 0; i < strlen(message); i++) { - totalwidth += letterwidth(message[i]); - } - currxoffset = (640 - totalwidth) / 2; - char *currpos = message; - while (*(currpos) != 0) { - currxoffset += printletter(*(currpos++), currxoffset); - } -} -uint16 Font::letteroffset(char letter) { - uint16 offset; - offset = letter; - _sphinxfnt->seek(offset); - offset = _sphinxfnt->readByte() * 2 + 128; - _sphinxfnt->seek(offset); - offset = _sphinxfnt->readUint16LE(); - return offset; -} + // Allocate the glyph data + delete[] _glyphs; + _glyphs = new Glyph[numGlyphs]; + + // Read the glyphs + _maxHeight = _maxWidth = 0; + for (int i = 0; (i < numGlyphs) && !stream.eos(); i++) { + // Verify we're at the expected stream position + if (stream.pos() != glyphOffsets[i]) { + error("Groovie::T7GFont: Glyph %d starts at %d but the current " + "offset is %d", i, glyphOffsets[i], stream.pos()); + return false; + } -uint8 Font::letterwidth(char letter) { - uint16 offset = letteroffset(letter); - _sphinxfnt->seek(offset); - return _sphinxfnt->readByte(); -} + // Read the glyph information + Glyph *g = &_glyphs[i]; + g->width = stream.readByte(); + g->julia = stream.readByte(); + + // Read the pixels data into a dynamic array (we don't know its length) + Common::Array data; + data.reserve(300); + byte b = stream.readByte(); + while (!stream.eos() && (b != 0xFF)) { + data.push_back(b); + b = stream.readByte(); + } + + // Verify the pixel data size + assert (data.size() % g->width == 0); + g->height = data.size() / g->width; -uint8 Font::letterheight(char letter) { - uint16 offset, width, julia, data, counter = 0; - offset = letteroffset(letter); - _sphinxfnt->seek(offset); - width = _sphinxfnt->readByte(); - julia = _sphinxfnt->readByte(); - data = _sphinxfnt->readByte(); - while (data != 0xFF) { - data = _sphinxfnt->readByte(); - counter++; + // Copy the pixel data into the definitive static array + g->pixels = new byte[data.size()]; + memcpy(g->pixels, data.begin(), data.size()); + + // Update the max values + if (g->width > _maxWidth) + _maxWidth = g->width; + if (g->height > _maxHeight) + _maxHeight = g->height; } - if (counter % width != 0) assert("font file corrupt"); - return counter / width; + + delete[] glyphOffsets; + return true; } +void T7GFont::drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color) const { + // We ignore the color, as the font is already colored + const Glyph *glyph = getGlyph(chr); + const byte *src = glyph->pixels; + byte *target = (byte *)dst->getBasePtr(x, y); -uint8 Font::printletter(char letter, uint16 xoffset) { - uint16 offset, width, height, julia; - offset = letteroffset(letter); - height = letterheight(letter); - _sphinxfnt->seek(offset); - width = _sphinxfnt->readByte(); - julia = _sphinxfnt->readByte(); + for (int i = 0; i < glyph->height; i++) { + memcpy(target, src, glyph->width); + src += glyph->width; + target += dst->pitch; + } +} - byte *data = new byte[width * height]; - _sphinxfnt->read(data, width * height); - _syst->copyRectToScreen(data, width, xoffset, 16, width, height); - delete[] data; +const T7GFont::Glyph *T7GFont::getGlyph(byte chr) const { + assert (chr < 128); - return width; + byte numGlyph = _mapChar2Glyph[chr]; + return &_glyphs[numGlyph]; } } // End of Groovie namespace diff --git a/engines/groovie/font.h b/engines/groovie/font.h index 1a4a967fa6..71f8393d28 100644 --- a/engines/groovie/font.h +++ b/engines/groovie/font.h @@ -27,24 +27,38 @@ #define GROOVIE_FONT_H #include "common/stream.h" -#include "common/system.h" +#include "graphics/font.h" namespace Groovie { -class Font { +class T7GFont : public Graphics::Font { public: - Font(OSystem *syst); - ~Font(); - void printstring(const char *messagein); + T7GFont(); + ~T7GFont(); + + bool load(Common::SeekableReadStream &stream); + + int getFontHeight() const { return _maxHeight; } + int getMaxCharWidth() const { return _maxWidth; } + int getCharWidth(byte chr) const { return getGlyph(chr)->width; } + void drawChar(Graphics::Surface *dst, byte chr, int x, int y, uint32 color) const; private: - OSystem *_syst; - Common::MemoryReadStream *_sphinxfnt; + int _maxHeight, _maxWidth; + + struct Glyph { + Glyph() : pixels(0) {} + ~Glyph() { delete[] pixels; } + + byte width; + byte height; + byte julia; + byte *pixels; + }; - uint16 letteroffset(char letter); - uint8 letterwidth(char letter); - uint8 letterheight(char letter); - uint8 printletter(char letter, uint16 xoffset); + byte _mapChar2Glyph[128]; + Glyph *_glyphs; + const Glyph *getGlyph(byte chr) const; }; } // End of Groovie namespace diff --git a/engines/groovie/graphics.cpp b/engines/groovie/graphics.cpp index 1e54f0e79b..8546a13d40 100644 --- a/engines/groovie/graphics.cpp +++ b/engines/groovie/graphics.cpp @@ -23,8 +23,9 @@ * */ -#include "groovie/groovie.h" #include "groovie/graphics.h" +#include "groovie/groovie.h" +#include "common/system.h" namespace Groovie { diff --git a/engines/groovie/graphics.h b/engines/groovie/graphics.h index ea3261c85f..c9bade9538 100644 --- a/engines/groovie/graphics.h +++ b/engines/groovie/graphics.h @@ -26,6 +26,8 @@ #ifndef GROOVIE_GRAPHICS_H #define GROOVIE_GRAPHICS_H +#include "graphics/surface.h" + namespace Groovie { class GroovieEngine; diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index ba18b37690..e0760e1d41 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -23,27 +23,30 @@ * */ +#include "groovie/groovie.h" +#include "groovie/cursor.h" +#include "groovie/detection.h" +#include "groovie/graphics.h" +#include "groovie/music.h" +#include "groovie/resource.h" +#include "groovie/roq.h" +#include "groovie/vdx.h" + #include "common/config-manager.h" #include "common/debug-channels.h" #include "common/events.h" #include "common/macresman.h" #include "engines/util.h" - +#include "graphics/fontman.h" #include "sound/mixer.h" -#include "groovie/groovie.h" -#include "groovie/detection.h" -#include "groovie/music.h" -#include "groovie/roq.h" -#include "groovie/vdx.h" - namespace Groovie { GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) : Engine(syst), _gameDescription(gd), _debugger(NULL), _script(NULL), _resMan(NULL), _grvCursorMan(NULL), _videoPlayer(NULL), _musicPlayer(NULL), - _graphicsMan(NULL), _macResFork(NULL), _waitingForInput(false) { + _graphicsMan(NULL), _macResFork(NULL), _waitingForInput(false), _font(NULL) { // Adding the default directories const Common::FSNode gameDataDir(ConfMan.get("path")); @@ -104,12 +107,26 @@ Common::Error GroovieEngine::run() { _graphicsMan = new GraphicsMan(this); // Create the resource and cursor managers and the video player + // Prepare the font too switch (_gameDescription->version) { case kGroovieT7G: if (_gameDescription->desc.platform == Common::kPlatformMacintosh) { _macResFork = new Common::MacResManager(); if (!_macResFork->open(_gameDescription->desc.filesDescriptions[0].fileName)) error("Could not open %s as a resource fork", _gameDescription->desc.filesDescriptions[0].fileName); + // The Macintosh release used system fonts. We use GUI fonts. + _font = FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont); + } else { + Common::File fontfile; + if (!fontfile.open("sphinx.fnt")) { + error("Couldn't open sphinx.fnt"); + return Common::kNoGameDataFoundError; + } else if (!_sphinxFont.load(fontfile)) { + error("Error loading sphinx.fnt"); + return Common::kUnknownError; + } + fontfile.close(); + _font = &_sphinxFont; } _resMan = new ResMan_t7g(_macResFork); diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index dae2df0595..437debfd17 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -26,15 +26,11 @@ #ifndef GROOVIE_H #define GROOVIE_H -#include "engines/engine.h" -#include "graphics/surface.h" - -#include "groovie/cursor.h" #include "groovie/debug.h" -#include "groovie/graphics.h" -#include "groovie/player.h" -#include "groovie/resource.h" -#include "groovie/script.h" +#include "groovie/font.h" + +#include "engines/engine.h" +#include "graphics/pixelformat.h" namespace Common { class MacResManager; @@ -57,7 +53,12 @@ namespace Common { */ namespace Groovie { +class GraphicsMan; +class GrvCursorMan; class MusicPlayer; +class ResMan; +class Script; +class VideoPlayer; enum DebugLevels { kGroovieDebugAll = 1 << 0, @@ -106,6 +107,7 @@ public: VideoPlayer *_videoPlayer; MusicPlayer *_musicPlayer; GraphicsMan *_graphicsMan; + const Graphics::Font *_font; Common::MacResManager *_macResFork; @@ -113,6 +115,7 @@ private: const GroovieGameDescription *_gameDescription; Debugger *_debugger; bool _waitingForInput; + T7GFont _sphinxFont; }; } // End of namespace Groovie diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index f6670da716..2ea7454256 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -23,13 +23,14 @@ * */ -#include "groovie/lzss.h" #include "groovie/music.h" +#include "groovie/groovie.h" #include "groovie/resource.h" #include "common/config-manager.h" #include "common/macresman.h" #include "sound/audiocd.h" +#include "sound/midiparser.h" namespace Groovie { diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 6302c81dcc..2feef9cbf7 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -26,14 +26,16 @@ #ifndef GROOVIE_MUSIC_H #define GROOVIE_MUSIC_H -#include "groovie/groovie.h" - -#include "sound/mididrv.h" -#include "sound/midiparser.h" +#include "common/array.h" #include "common/mutex.h" +#include "sound/mididrv.h" + +class MidiParser; namespace Groovie { +class GroovieEngine; + class MusicPlayer { public: MusicPlayer(GroovieEngine *vm); diff --git a/engines/groovie/player.cpp b/engines/groovie/player.cpp index 5bac190701..8badd90012 100644 --- a/engines/groovie/player.cpp +++ b/engines/groovie/player.cpp @@ -23,8 +23,8 @@ * */ -#include "groovie/groovie.h" #include "groovie/player.h" +#include "groovie/groovie.h" namespace Groovie { diff --git a/engines/groovie/resource.cpp b/engines/groovie/resource.cpp index 42de1a804d..32cc1735ef 100644 --- a/engines/groovie/resource.cpp +++ b/engines/groovie/resource.cpp @@ -26,8 +26,8 @@ #include "common/archive.h" #include "common/macresman.h" -#include "groovie/groovie.h" #include "groovie/resource.h" +#include "groovie/groovie.h" namespace Groovie { diff --git a/engines/groovie/roq.cpp b/engines/groovie/roq.cpp index de91bb2067..11bacef8e8 100644 --- a/engines/groovie/roq.cpp +++ b/engines/groovie/roq.cpp @@ -26,8 +26,9 @@ // ROQ video player based on this specification by Dr. Tim Ferguson: // http://www.csse.monash.edu.au/~timf/videocodec/idroq.txt -#include "groovie/groovie.h" #include "groovie/roq.h" +#include "groovie/graphics.h" +#include "groovie/groovie.h" #include "graphics/jpeg.h" diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 15a0a473c0..297da6ccc2 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -23,18 +23,19 @@ * */ -#include "groovie/debug.h" -#include "groovie/music.h" #include "groovie/script.h" -#include "groovie/groovie.h" #include "groovie/cell.h" +#include "groovie/cursor.h" +#include "groovie/graphics.h" +#include "groovie/groovie.h" +#include "groovie/music.h" +#include "groovie/player.h" +#include "groovie/resource.h" #include "groovie/saveload.h" #include "common/archive.h" #include "common/config-manager.h" #include "common/debug-channels.h" -#include "common/endian.h" -#include "common/events.h" #include "common/EventRecorder.h" #include "common/macresman.h" @@ -63,9 +64,8 @@ static void debugScript(int level, bool nl, const char *s, ...) { } Script::Script(GroovieEngine *vm, EngineVersion version) : - _code(NULL), _savedCode(NULL), _stacktop(0), - _debugger(NULL), _vm(vm), - _videoFile(NULL), _videoRef(0), _font(NULL), _staufsMove(NULL) { + _code(NULL), _savedCode(NULL), _stacktop(0), _debugger(NULL), _vm(vm), + _videoFile(NULL), _videoRef(0), _staufsMove(NULL) { // Initialize the opcode set depending on the engine version switch (version) { case kGroovieT7G: @@ -112,7 +112,6 @@ Script::~Script() { delete[] _code; delete[] _savedCode; - delete _font; delete _videoFile; } @@ -429,6 +428,22 @@ void Script::savegame(uint slot) { _saveNames[slot] = save; } +void Script::printString(Graphics::Surface *surface, const char *str) { + char message[15]; + memset(message, 0, 15); + + // Preprocess the string + for (int i = 0; i < 14; i++) { + if (str[i] <= 0x00 || str[i] == 0x24) + break; + message[i] = str[i]; + } + Common::rtrim(message); + + // Draw the string + _vm->_font->drawString(surface, message, 0, 16, 640, 0xE2, Graphics::kTextAlignCenter); +} + // OPCODES void Script::o_invalid() { @@ -1249,11 +1264,16 @@ void Script::o_printstring() { stringstorage[counter] = 0; - // Load the font if required - if (!_font) { - _font = new Font(_vm->_system); - } - _font->printstring(stringstorage); + Common::Rect topbar(640, 80); + Graphics::Surface *gamescreen = _vm->_system->lockScreen(); + + // Clear the top bar + gamescreen->fillRect(topbar, 0); + + // Draw the string + printString(gamescreen, stringstorage); + + _vm->_system->unlockScreen(); } void Script::o_hotspot_slot() { @@ -1273,11 +1293,15 @@ void Script::o_hotspot_slot() { return; } - // Load the font if required - if (!_font) { - _font = new Font(_vm->_system); - } - _font->printstring(_saveNames[slot].c_str()); + Common::Rect topbar(640, 80); + Graphics::Surface *gamescreen = _vm->_system->lockScreen(); + + // Clear the top bar + gamescreen->fillRect(topbar, 0); + + printString(gamescreen, _saveNames[slot].c_str()); + + _vm->_system->unlockScreen(); // Save the currently highlighted slot _hotspotSlot = slot; diff --git a/engines/groovie/script.h b/engines/groovie/script.h index e4a6a288e6..43b7c06a54 100644 --- a/engines/groovie/script.h +++ b/engines/groovie/script.h @@ -26,12 +26,16 @@ #ifndef GROOVIE_SCRIPT_H #define GROOVIE_SCRIPT_H -#include "common/file.h" #include "common/random.h" #include "common/rect.h" -#include "groovie/font.h" -#include "groovie/cell.h" +namespace Common { +class SeekableReadStream; +} + +namespace Graphics { +class Surface; +} namespace Groovie { @@ -40,8 +44,9 @@ enum EngineVersion { kGroovieV2 }; -class GroovieEngine; class CellGame; +class Debugger; +class GroovieEngine; class Script { friend class Debugger; @@ -112,7 +117,6 @@ private: uint16 _hotspotSlot; // Video - Font *_font; Common::SeekableReadStream *_videoFile; uint32 _videoRef; uint16 _bitflags; @@ -140,6 +144,7 @@ private: void loadgame(uint slot); void savegame(uint slot); bool playvideofromref(uint32 fileref); + void printString(Graphics::Surface *surface, const char *str); // Opcodes typedef void (Script::*OpcodeFunc)(); diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index fb6377349f..1d3108a2cc 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -23,9 +23,10 @@ * */ +#include "groovie/vdx.h" +#include "groovie/graphics.h" #include "groovie/groovie.h" #include "groovie/lzss.h" -#include "groovie/vdx.h" #include "common/debug-channels.h" #include "sound/mixer.h" diff --git a/engines/groovie/vdx.h b/engines/groovie/vdx.h index 207d2e0c18..0b29493108 100644 --- a/engines/groovie/vdx.h +++ b/engines/groovie/vdx.h @@ -28,6 +28,10 @@ #include "groovie/player.h" +namespace Common { + class ReadStream; +} + namespace Groovie { class VDXPlayer : public VideoPlayer { -- cgit v1.2.3 From 354499c7372956ff045c39c5b85456340e26526c Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Mon, 7 Jun 2010 17:17:41 +0000 Subject: Fix some typos in a comment svn-id: r49488 --- graphics/font.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/graphics/font.h b/graphics/font.h index 6927e0e076..0e65e9418c 100644 --- a/graphics/font.h +++ b/graphics/font.h @@ -67,10 +67,10 @@ public: int getStringWidth(const Common::String &str) const; /** - * Take a text (which may contain newlines characters) and word wrap it so thata + * Take a text (which may contain newline characters) and word wrap it so that * no text line is wider than maxWidth pixels. If necessary, additional line breaks - * are generated, preferably between words (i.e. were whitespaces are). - * The resulting lines are appended to the string list lines. + * are generated, preferably between words (i.e. where whitespaces are). + * The resulting lines are appended to the lines string list. * It returns the maximal width of any of the new lines (i.e. a value which is less * or equal to maxWidth). * -- cgit v1.2.3 From 9255d7c3cb38093f060266d7cbd137792cea811e Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Mon, 7 Jun 2010 17:18:25 +0000 Subject: Remove some extra spaces svn-id: r49489 --- engines/scumm/imuse/instrument.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/scumm/imuse/instrument.cpp b/engines/scumm/imuse/instrument.cpp index efe15f308f..57a842f297 100644 --- a/engines/scumm/imuse/instrument.cpp +++ b/engines/scumm/imuse/instrument.cpp @@ -421,11 +421,11 @@ Instrument_Roland::Instrument_Roland(Serializer *s) { memset(&_instrument, 0, sizeof(_instrument)); } -void Instrument_Roland::saveOrLoad (Serializer *s) { +void Instrument_Roland::saveOrLoad(Serializer *s) { if (s->isSaving()) { - s->saveBytes (&_instrument, sizeof(_instrument)); + s->saveBytes(&_instrument, sizeof(_instrument)); } else { - s->loadBytes (&_instrument, sizeof(_instrument)); + s->loadBytes(&_instrument, sizeof(_instrument)); memcpy(&_instrument_name, &_instrument.common.name, sizeof(_instrument.common.name)); _instrument_name[10] = '\0'; if (!_native_mt32 && getEquivalentGM() >= 128) { -- cgit v1.2.3 From b0cb5e7b7e67ad3d87594041f6ea172c3650e888 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Mon, 7 Jun 2010 17:27:22 +0000 Subject: Document the Groovie engine news and reorder in order to match the previous releases. svn-id: r49490 --- NEWS | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 32fe9a81c6..5796a7f885 100644 --- a/NEWS +++ b/NEWS @@ -5,16 +5,20 @@ For a more comprehensive changelog for the latest experimental SVN code, see: New Ports: - Added Android port. + General: + - Switched to the "fast" DOSBox OPL emulator. + - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. + + Groovie: + - Added support for the Macintosh version of The 7th Guest. + - Added support for custom MT-32 instruments. + PSP port: - Switched to new backend design which fixes minor graphical issues, speeds things up, and provides 16-bit support. - Enabled playback of MP3 files using the hardware decoder (ME). This means that the port is now optimized for MP3 playback (as opposed to OGG). - General: - - Switched to the "fast" DOSBox OPL emulator. - - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. - 1.1.2 (????-??-??) Broken Sword 2 - Fixed missing speech in some cutscenes. -- cgit v1.2.3 From 419b4b7348038a64f9e9c405e69022035c4c832c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 7 Jun 2010 17:44:17 +0000 Subject: Added support for SCI2+ base36 encoded patches (audio36 and sync36) svn-id: r49491 --- engines/sci/resource.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 4818428663..64e42cafb9 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1073,6 +1073,13 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, byte patchtype, patch_data_offset; int fsize; + // base36 encoded patches (i.e. audio36 and sync36) have the same type as their non-base36 encoded counterparts + if (restype == kResourceTypeAudio36) + restype = kResourceTypeAudio; + + if (restype == kResourceTypeSync36) + restype = kResourceTypeSync; + if (resnumber == 0xFFFF) return; @@ -1156,9 +1163,11 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { Common::String name, inputName; Common::ArchiveMemberList files; - //ResourceSource *psrcPatch; + ResourceSource *psrcPatch; for (int i = kResourceTypeAudio36; i <= kResourceTypeSync36; ++i) { + files.clear(); + // audio36 resources start with a @, A, or B // sync36 resources start with a # if (i == kResourceTypeAudio36) { @@ -1172,28 +1181,33 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { name = (*x)->getName(); inputName = (*x)->getName(); inputName.toUppercase(); + if (inputName.hasPrefix("BOOT")) // skip bootdisk.* + continue; + inputName.deleteChar(0); // delete the first character (type) inputName.deleteChar(7); // delete the dot // The base36 encoded resource contains the following: // uint16 number, byte noun, byte verb, byte cond, byte seq - // TODO: this is still not right (especially the tuple part, seems to be overflowing?) - uint16 number = strtol(Common::String(inputName.c_str(), 2).c_str(), 0, 36); - uint32 tuple = strtol(inputName.c_str() + 2, 0, 36); - ResourceId resource36((ResourceType)i, number, tuple); + uint16 number = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters + byte noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters + byte verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters + byte cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters + byte seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character + ResourceId resource36((ResourceType)i, number, noun, verb, cond, seq); + /* if (i == kResourceTypeAudio36) - debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), tuple, resource36.toString().c_str()); + debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); else - debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), tuple, resource36.toString().c_str()); + debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); + */ - /* psrcPatch = new ResourceSource; psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; psrcPatch->resourceFile = 0; - processPatch(psrcPatch, (ResourceType)i, number, tuple); - */ + processPatch(psrcPatch, (ResourceType)i, number, resource36.tuple); } } } -- cgit v1.2.3 From ae599e63c26b315215c47666094ed844e36cddb2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 7 Jun 2010 21:33:55 +0000 Subject: SCI: fix regression from #49484, we were ignoring 65535 patches and this broke kq6 - the check was previously for -1 and this case wasn't able to happen at all, maybe it was left-over code from freesci somehow svn-id: r49494 --- engines/sci/resource.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 64e42cafb9..cae2e525ad 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1080,9 +1080,6 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, if (restype == kResourceTypeSync36) restype = kResourceTypeSync; - if (resnumber == 0xFFFF) - return; - if (source->resourceFile) { fileStream = source->resourceFile->createReadStream(); } else { -- cgit v1.2.3 From ea2e2053f25c216342c74bb7a74dabc682766720 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 7 Jun 2010 21:55:57 +0000 Subject: SCI: slight cleanup on processPatch, etc. svn-id: r49495 --- engines/sci/resource.cpp | 56 ++++++++++++++++++++++++------------------------ engines/sci/resource.h | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index cae2e525ad..400f0b1e67 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1066,19 +1066,19 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { } // version-agnostic patch application -void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, uint16 resnumber, uint32 tuple) { +void ResourceManager::processPatch(ResourceSource *source, ResourceType resourceType, uint16 resourceNr, uint32 tuple) { Common::SeekableReadStream *fileStream = 0; Resource *newrsc; - ResourceId resId = ResourceId(restype, resnumber, tuple); - byte patchtype, patch_data_offset; + ResourceId resId = ResourceId(resourceType, resourceNr, tuple); + byte patchType, patchDataOffset; int fsize; // base36 encoded patches (i.e. audio36 and sync36) have the same type as their non-base36 encoded counterparts - if (restype == kResourceTypeAudio36) - restype = kResourceTypeAudio; + if (resourceType == kResourceTypeAudio36) + resourceType = kResourceTypeAudio; - if (restype == kResourceTypeSync36) - restype = kResourceTypeSync; + if (resourceType == kResourceTypeSync36) + resourceType = kResourceTypeSync; if (source->resourceFile) { fileStream = source->resourceFile->createReadStream(); @@ -1096,36 +1096,36 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, return; } - patchtype = fileStream->readByte() & 0x7F; - patch_data_offset = fileStream->readByte(); + patchType = fileStream->readByte() & 0x7F; + patchDataOffset = fileStream->readByte(); delete fileStream; - if (patchtype != restype) { + if (patchType != resourceType) { debug("Patching %s failed - resource type mismatch", source->location_name.c_str()); } // Fixes SQ5/German, patch file special case logic taken from SCI View disassembly - if (patch_data_offset & 0x80) { - switch (patch_data_offset & 0x7F) { + if (patchDataOffset & 0x80) { + switch (patchDataOffset & 0x7F) { case 0: - patch_data_offset = 24; + patchDataOffset = 24; break; case 1: - patch_data_offset = 2; + patchDataOffset = 2; break; case 4: - patch_data_offset = 8; + patchDataOffset = 8; break; default: - warning("Resource patch unsupported special case %X", patch_data_offset & 0x7F); + warning("Resource patch unsupported special case %X", patchDataOffset & 0x7F); return; } } - if (patch_data_offset + 2 >= fsize) { + if (patchDataOffset + 2 >= fsize) { debug("Patching %s failed - patch starting at offset %d can't be in file of size %d", - source->location_name.c_str(), patch_data_offset + 2, fsize); + source->location_name.c_str(), patchDataOffset + 2, fsize); return; } // Prepare destination, if neccessary @@ -1138,8 +1138,8 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType restype, newrsc->_id = resId; newrsc->_status = kResStatusNoMalloc; newrsc->_source = source; - newrsc->size = fsize - patch_data_offset - 2; - newrsc->_headerSize = patch_data_offset; + newrsc->size = fsize - patchDataOffset - 2; + newrsc->_headerSize = patchDataOffset; newrsc->_fileOffset = 0; debugC(1, kDebugLevelResMan, "Patching %s - OK", source->location_name.c_str()); } @@ -1185,13 +1185,13 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { inputName.deleteChar(7); // delete the dot // The base36 encoded resource contains the following: - // uint16 number, byte noun, byte verb, byte cond, byte seq - uint16 number = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters + // uint16 resourceId, byte noun, byte verb, byte cond, byte seq + uint16 resourceNr = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters byte noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters byte verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters byte cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters byte seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character - ResourceId resource36((ResourceType)i, number, noun, verb, cond, seq); + ResourceId resource36((ResourceType)i, resourceNr, noun, verb, cond, seq); /* if (i == kResourceTypeAudio36) @@ -1204,7 +1204,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; psrcPatch->resourceFile = 0; - processPatch(psrcPatch, (ResourceType)i, number, resource36.tuple); + processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } } } @@ -1218,7 +1218,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { Common::String mask, name; Common::ArchiveMemberList files; - int number = -1; + uint16 resourceNr = 0; const char *szResType; ResourceSource *psrcPatch; @@ -1239,14 +1239,14 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { name = (*x)->getName(); // SCI1 scheme if (isdigit(name[0])) { - number = atoi(name.c_str()); + resourceNr = atoi(name.c_str()); bAdd = true; } else { // SCI0 scheme int resname_len = strlen(szResType); if (scumm_strnicmp(name.c_str(), szResType, resname_len) == 0 && !isalpha(name[resname_len + 1])) { - number = atoi(name.c_str() + resname_len + 1); + resourceNr = atoi(name.c_str() + resname_len + 1); bAdd = true; } } @@ -1256,7 +1256,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; psrcPatch->resourceFile = 0; - processPatch(psrcPatch, (ResourceType)i, number); + processPatch(psrcPatch, (ResourceType)i, resourceNr); } } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 43e61eaadb..533c81bdf5 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -455,7 +455,7 @@ protected: #ifdef ENABLE_SCI32 void readResourcePatchesBase36(ResourceSource *source); #endif - void processPatch(ResourceSource *source, ResourceType restype, uint16 resnumber, uint32 tuple = 0); + void processPatch(ResourceSource *source, ResourceType resourceType, uint16 resourceNr, uint32 tuple = 0); /** * Process wave files as patches for Audio resources -- cgit v1.2.3 From f743468ec7174088dffde0fd1a61d3afcf78280b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 8 Jun 2010 09:36:27 +0000 Subject: SCI: if song isn't playing, set signal and don't set fadeout/fadein variables - fixes lsl3 music lost after entering/exiting tv room (bug #3007406) svn-id: r49500 --- engines/sci/sound/soundcmd.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index ece4c1430c..4711fe385d 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -666,6 +666,13 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { int volume = musicSlot->volume; + // If sound is not playing currently, set signal directly + if (musicSlot->status != kSoundPlaying) { + warning("cmdFadeSound: fading requested, but sound is currently not playing"); + writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); + return; + } + switch (_argc) { case 2: // SCI0 // SCI0 fades out all the time and when fadeout is done it will also stop the music from playing @@ -688,12 +695,6 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { error("cmdFadeSound: unsupported argc %d", _argc); } - // If sound is not playing currently, set signal directly - if (musicSlot->status != kSoundPlaying) { - warning("cmdFadeSound: fading requested, but sound is currently not playing"); - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - } - debugC(2, kDebugLevelSound, "cmdFadeSound: to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); #endif } -- cgit v1.2.3 From 707ccdbac78510a5861d9460d1503e25f6634947 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 13:15:05 +0000 Subject: Add a version check for base36 encoded patches - they were introduced in SCI2 svn-id: r49501 --- engines/sci/resource.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 400f0b1e67..fd81c8d92f 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -621,7 +621,9 @@ void ResourceManager::scanNewSources() { case kSourceDirectory: readResourcePatches(source); #ifdef ENABLE_SCI32 - readResourcePatchesBase36(source); + // We can't use getSciVersion() at this point, thus using _volVersion + if (_volVersion == kResVersionSci32) // SCI2+ + readResourcePatchesBase36(source); #endif readWaveAudioPatches(); break; @@ -1180,6 +1182,8 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { inputName.toUppercase(); if (inputName.hasPrefix("BOOT")) // skip bootdisk.* continue; + if (inputName.hasSuffix("DRV")) // skip AUD*.DRV + continue; inputName.deleteChar(0); // delete the first character (type) inputName.deleteChar(7); // delete the dot -- cgit v1.2.3 From fb73cef4d9d481f616576a2779b53ea6c8c48b18 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:15:15 +0000 Subject: Add a few files mistakenly left out of initial Android patch :( svn-id: r49502 --- backends/platform/android/video.cpp | 333 +++++++++++++++++++++++++++++++++++ backends/platform/android/video.h | 140 +++++++++++++++ dists/android/AndroidManifest.xml | 75 ++++++++ dists/android/AndroidManifest.xml.in | 64 +++++++ 4 files changed, 612 insertions(+) create mode 100644 backends/platform/android/video.cpp create mode 100644 backends/platform/android/video.h create mode 100644 dists/android/AndroidManifest.xml create mode 100644 dists/android/AndroidManifest.xml.in diff --git a/backends/platform/android/video.cpp b/backends/platform/android/video.cpp new file mode 100644 index 0000000000..09d4dba154 --- /dev/null +++ b/backends/platform/android/video.cpp @@ -0,0 +1,333 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/null/null.cpp $ + * $Id: null.cpp 34912 2008-11-06 15:02:50Z fingolfin $ + * + */ + +#include "base/main.h" +#include "graphics/surface.h" + +#include +#include + +#include + +#include "common/rect.h" +#include "common/array.h" +#include "common/util.h" +#include "common/tokenizer.h" + +#include "backends/platform/android/video.h" + +#undef LOG_TAG +#define LOG_TAG "ScummVM-video" + +#if 0 +#define ENTER(args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, args) +#else +#define ENTER(args...) /**/ +#endif + +#if 1 +#define CHECK_GL_ERROR() checkGlError(__FILE__, __LINE__) +static const char* getGlErrStr(GLenum error) { + switch (error) { + case GL_NO_ERROR: return "GL_NO_ERROR"; + case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; + case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; + case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW"; + case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW"; + case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; + } + + static char buf[40]; + snprintf(buf, sizeof(buf), "(Unknown GL error code 0x%x)", error); + return buf; +} +static void checkGlError(const char* file, int line) { + GLenum error = glGetError(); + if (error != GL_NO_ERROR) + warning("%s:%d: GL error: %s", file, line, getGlErrStr(error)); +} +#else +#define CHECK_GL_ERROR() do {} while (false) +#endif + +// Supported GL extensions +static bool npot_supported = false; +#ifdef GL_OES_draw_texture +static bool draw_tex_supported = false; +#endif + +static inline GLfixed xdiv(int numerator, int denominator) { + assert(numerator < (1<<16)); + return (numerator << 16) / denominator; +} + +template +static T nextHigher2(T k) { + if (k == 0) + return 1; + --k; + for (uint i = 1; i < sizeof(T)*CHAR_BIT; i <<= 1) + k = k | k >> i; + return k + 1; +} + +void GLESTexture::initGLExtensions() { + const char* ext_string = + reinterpret_cast(glGetString(GL_EXTENSIONS)); + __android_log_print(ANDROID_LOG_INFO, LOG_TAG, + "Extensions: %s", ext_string); + Common::StringTokenizer tokenizer(ext_string, " "); + while (!tokenizer.empty()) { + Common::String token = tokenizer.nextToken(); + if (token == "GL_ARB_texture_non_power_of_two") + npot_supported = true; +#ifdef GL_OES_draw_texture + if (token == "GL_OES_draw_texture") + draw_tex_supported = true; +#endif + } +} + +GLESTexture::GLESTexture() : + _texture_width(0), + _texture_height(0), + _all_dirty(true) +{ + glGenTextures(1, &_texture_name); + // This all gets reset later in allocBuffer: + _surface.w = 0; + _surface.h = 0; + _surface.pitch = _texture_width; + _surface.pixels = NULL; + _surface.bytesPerPixel = 0; +} + +GLESTexture::~GLESTexture() { + debug("Destroying texture %u", _texture_name); + glDeleteTextures(1, &_texture_name); +} + +void GLESTexture::reinitGL() { + glGenTextures(1, &_texture_name); + setDirty(); +} + +void GLESTexture::allocBuffer(GLuint w, GLuint h) { + CHECK_GL_ERROR(); + int bpp = bytesPerPixel(); + _surface.w = w; + _surface.h = h; + _surface.bytesPerPixel = bpp; + + if (w <= _texture_width && h <= _texture_height) + // Already allocated a sufficiently large buffer + return; + + if (npot_supported) { + _texture_width = _surface.w; + _texture_height = _surface.h; + } else { + _texture_width = nextHigher2(_surface.w); + _texture_height = nextHigher2(_surface.h); + } + _surface.pitch = _texture_width * bpp; + + // Allocate room for the texture now, but pixel data gets uploaded + // later (perhaps with multiple TexSubImage2D operations). + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, _texture_name); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + glTexImage2D(GL_TEXTURE_2D, 0, glFormat(), + _texture_width, _texture_height, + 0, glFormat(), glType(), NULL); + CHECK_GL_ERROR(); +} + +void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, + const void* buf, int pitch) { + ENTER("updateBuffer(%u, %u, %u, %u, %p, %d)", x, y, w, h, buf, pitch); + glBindTexture(GL_TEXTURE_2D, _texture_name); + + if (static_cast(w) * bytesPerPixel() == pitch) { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, + glFormat(), glType(), buf); + } else { + // GLES removed the ability to specify pitch, so we + // have to do this row by row. + int i = h; + const byte* src = static_cast(buf); + do { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, + w, 1, glFormat(), glType(), src); + ++y; + src += pitch; + } while (--i); + } + + setDirtyRect(Common::Rect(x, y, x+w, y+h)); +} + +void GLESTexture::fillBuffer(byte x) { + byte tmpbuf[_surface.h * _surface.w * bytesPerPixel()]; + memset(tmpbuf, 0, _surface.h * _surface.w * bytesPerPixel()); + glBindTexture(GL_TEXTURE_2D, _texture_name); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _surface.w, _surface.h, + glFormat(), glType(), tmpbuf); + setDirty(); +} + +void GLESTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { + glBindTexture(GL_TEXTURE_2D, _texture_name); + +#ifdef GL_OES_draw_texture + // Great extension, but only works under specific conditions. + // Still a work-in-progress - disabled for now. + if (false && draw_tex_supported && paletteSize() == 0) { + //glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + const GLint crop[4] = {0, _surface.h, _surface.w, -_surface.h}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); + glDrawTexiOES(x, y, 0, w, h); + } else +#endif + { + const GLfixed tex_width = xdiv(_surface.w, _texture_width); + const GLfixed tex_height = xdiv(_surface.h, _texture_height); + const GLfixed texcoords[] = { + 0, 0, + tex_width, 0, + 0, tex_height, + tex_width, tex_height, + }; + glTexCoordPointer(2, GL_FIXED, 0, texcoords); + + const GLshort vertices[] = { + x, y, + x+w, y, + x, y+h, + x+w, y+h, + }; + glVertexPointer(2, GL_SHORT, 0, vertices); + + assert(ARRAYSIZE(vertices) == ARRAYSIZE(texcoords)); + glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAYSIZE(vertices)/2); + } + + _all_dirty = false; + _dirty_rect = Common::Rect(); +} + +GLESPaletteTexture::GLESPaletteTexture() : + GLESTexture(), + _texture(NULL) +{ +} + +GLESPaletteTexture::~GLESPaletteTexture() { + delete[] _texture; +} + +void GLESPaletteTexture::allocBuffer(GLuint w, GLuint h) { + CHECK_GL_ERROR(); + int bpp = bytesPerPixel(); + _surface.w = w; + _surface.h = h; + _surface.bytesPerPixel = bpp; + + if (w <= _texture_width && h <= _texture_height) + // Already allocated a sufficiently large buffer + return; + + if (npot_supported) { + _texture_width = _surface.w; + _texture_height = _surface.h; + } else { + _texture_width = nextHigher2(_surface.w); + _texture_height = nextHigher2(_surface.h); + } + _surface.pitch = _texture_width * bpp; + + // Texture gets uploaded later (from drawTexture()) + + byte* new_buffer = new byte[paletteSize() + + _texture_width * _texture_height * bytesPerPixel()]; + if (_texture) { + memcpy(new_buffer, _texture, paletteSize()); // preserve palette + delete[] _texture; + } + _texture = new_buffer; + _surface.pixels = _texture + paletteSize(); +} + +void GLESPaletteTexture::fillBuffer(byte x) { + assert(_surface.pixels); + memset(_surface.pixels, x, _surface.pitch * _surface.h); + setDirty(); +} + +void GLESPaletteTexture::updateBuffer(GLuint x, GLuint y, + GLuint w, GLuint h, + const void* buf, int pitch) { + const byte* src = static_cast(buf); + byte* dst = static_cast(_surface.getBasePtr(x, y)); + do { + memcpy(dst, src, w * bytesPerPixel()); + dst += _surface.pitch; + src += pitch; + } while (--h); +} + +void GLESPaletteTexture::uploadTexture() const { + const size_t texture_size = + paletteSize() + _texture_width * _texture_height * bytesPerPixel(); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, glType(), + _texture_width, _texture_height, + 0, texture_size, _texture); + CHECK_GL_ERROR(); +} + +void GLESPaletteTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { + if (_all_dirty) { + glBindTexture(GL_TEXTURE_2D, _texture_name); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + uploadTexture(); + _all_dirty = false; + } + + GLESTexture::drawTexture(x, y, w, h); +} diff --git a/backends/platform/android/video.h b/backends/platform/android/video.h new file mode 100644 index 0000000000..ee707e4cb5 --- /dev/null +++ b/backends/platform/android/video.h @@ -0,0 +1,140 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/null/null.cpp $ + * $Id: null.cpp 34912 2008-11-06 15:02:50Z fingolfin $ + * + */ + +#if defined(ANDROID) + +#include + +#include "graphics/surface.h" + +#include "common/rect.h" +#include "common/array.h" + +class GLESTexture { +public: + static void initGLExtensions(); + + GLESTexture(); + virtual ~GLESTexture(); + virtual void reinitGL(); + virtual void allocBuffer(GLuint width, GLuint height); + const Graphics::Surface* surface_const() const { return &_surface; } + GLuint width() const { return _surface.w; } + GLuint height() const { return _surface.h; } + GLuint texture_name() const { return _texture_name; } + bool dirty() const { return _all_dirty || !_dirty_rect.isEmpty(); } + virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, + const void* buf, int pitch); + virtual void fillBuffer(byte x); + virtual void drawTexture() { + drawTexture(0, 0, _surface.w, _surface.h); + } + virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); + +protected: + virtual byte bytesPerPixel() const = 0; + virtual GLenum glFormat() const = 0; + virtual GLenum glType() const = 0; + virtual size_t paletteSize() const { return 0; }; + void setDirty() { + _all_dirty = true; + _dirty_rect = Common::Rect(); + } + void setDirtyRect(const Common::Rect& r) { + if (!_all_dirty) { + if (_dirty_rect.isEmpty()) + _dirty_rect = r; + else + _dirty_rect.extend(r); + } + } + GLuint _texture_name; + Graphics::Surface _surface; + GLuint _texture_width; + GLuint _texture_height; + bool _all_dirty; + Common::Rect _dirty_rect; // Covers dirty area +}; + +// RGBA4444 texture +class GLES4444Texture : public GLESTexture { +protected: + virtual byte bytesPerPixel() const { return 2; } + virtual GLenum glFormat() const { return GL_RGBA; } + virtual GLenum glType() const { return GL_UNSIGNED_SHORT_4_4_4_4; } +}; + +// RGB565 texture +class GLES565Texture : public GLESTexture { +protected: + virtual byte bytesPerPixel() const { return 2; } + virtual GLenum glFormat() const { return GL_RGB; } + virtual GLenum glType() const { return GL_UNSIGNED_SHORT_5_6_5; } +}; + +// RGB888 256-entry paletted texture +class GLESPaletteTexture : public GLESTexture { +public: + GLESPaletteTexture(); + virtual ~GLESPaletteTexture(); + virtual void allocBuffer(GLuint width, GLuint height); + virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, + const void* buf, int pitch); + Graphics::Surface* surface() { + setDirty(); + return &_surface; + } + void* pixels() { + setDirty(); + return _surface.pixels; + } + const byte* palette_const() const { return _texture; }; + byte* palette() { + setDirty(); + return _texture; + }; + virtual void drawTexture() { + drawTexture(0, 0, _surface.w, _surface.h); + } + virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); + virtual void fillBuffer(byte x); +protected: + virtual byte bytesPerPixel() const { return 1; } + virtual GLenum glFormat() const { return GL_RGB; } + virtual GLenum glType() const { return GL_PALETTE8_RGB8_OES; } + virtual size_t paletteSize() const { return 256 * 3; }; + virtual void uploadTexture() const; + byte* _texture; +}; + +// RGBA8888 256-entry paletted texture +class GLESPaletteATexture : public GLESPaletteTexture { +protected: + virtual GLenum glFormat() const { return GL_RGBA; } + virtual GLenum glType() const { return GL_PALETTE8_RGBA8_OES; } + virtual size_t paletteSize() const { return 256 * 4; }; +}; + +#endif diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml new file mode 100644 index 0000000000..9eb1d995f0 --- /dev/null +++ b/dists/android/AndroidManifest.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dists/android/AndroidManifest.xml.in b/dists/android/AndroidManifest.xml.in new file mode 100644 index 0000000000..a7fd283f01 --- /dev/null +++ b/dists/android/AndroidManifest.xml.in @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 5ba761a687d9b908f09b218cc22aec548d98c3f6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 13:16:30 +0000 Subject: Made reconstruct_stack() a member of SegManager svn-id: r49503 --- engines/sci/engine/savegame.cpp | 20 +++++++++----------- engines/sci/engine/seg_manager.h | 5 +++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 9bf23dedf5..17dbbc94d9 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -739,15 +739,6 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename return 0; } -// TODO: This should probably be turned into an EngineState or DataStack method. -static void reconstruct_stack(EngineState *retval) { - SegmentId stack_seg = retval->_segMan->findSegmentByType(SEG_TYPE_STACK); - DataStack *stack = (DataStack *)(retval->_segMan->_heap[stack_seg]); - - retval->stack_base = stack->_entries; - retval->stack_top = stack->_entries + stack->_capacity; -} - // TODO: Move thie function to a more appropriate place, such as vm.cpp or script.cpp void SegManager::reconstructScripts(EngineState *s) { uint i; @@ -784,6 +775,14 @@ void SegManager::reconstructScripts(EngineState *s) { } } +void SegManager::reconstructStack(EngineState *s) { + SegmentId stack_seg = findSegmentByType(SEG_TYPE_STACK); + DataStack *stack = (DataStack *)(_heap[stack_seg]); + + s->stack_base = stack->_entries; + s->stack_top = stack->_entries + stack->_capacity; +} + #ifdef USE_OLD_MUSIC_FUNCTIONS static void reconstruct_sounds(EngineState *s) { Song *seeker; @@ -876,10 +875,9 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_soundCmd->updateSfxState(&retval->_sound); #endif - reconstruct_stack(s); + s->_segMan->reconstructStack(s); s->_segMan->reconstructScripts(s); s->_segMan->reconstructClones(); - s->_gameObj = s->_gameObj; s->script_000 = s->_segMan->getScript(s->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); s->gc_countdown = GC_INTERVAL - 1; diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 9312f51f9d..9bcdd80a62 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -95,6 +95,11 @@ public: */ void reconstructScripts(EngineState *s); + /** + * Reconstructs the stack. Used when restoring saved games + */ + void reconstructStack(EngineState *s); + /** * Determines the segment occupied by a certain script, if any. * @param script_nr Number of the script to look up -- cgit v1.2.3 From 33c2e03ccc30fb5c7464319081bf5599858f6fd1 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:18:25 +0000 Subject: Remove unnecessary explicit _endian=little for Android svn-id: r49504 --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index 0c06be13ea..cb2f690441 100755 --- a/configure +++ b/configure @@ -1665,7 +1665,6 @@ if test -n "$_host"; then ;; android) DEFINES="$DEFINES -DANDROID -DUNIX -DUSE_ARM_SMUSH_ASM" - _endian=little _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' -- cgit v1.2.3 From ec524e3705970a725c9dd1008fff97ccd7f1d250 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:23:08 +0000 Subject: Remove obsolete ANDROID_VERSION_GE macro svn-id: r49505 --- backends/platform/android/android.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index a6258df554..f319e220cc 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -31,10 +31,6 @@ #if defined(ANDROID_BACKEND) -#define ANDROID_VERSION_GE(major,minor) \ - (ANDROID_MAJOR_VERSION > (major) || \ - (ANDROID_MAJOR_VERSION == (major) && ANDROID_MINOR_VERSION >= (minor))) - #include #include -- cgit v1.2.3 From d72ae64e3447ca01e308e61c320692463596fb0b Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:25:00 +0000 Subject: Provide a replacement for bionic's __assert(). The usual Android version doesn't actually print the assert message before aborting. svn-id: r49506 --- backends/platform/android/android.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index f319e220cc..5d78ead6be 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -74,6 +74,14 @@ #undef JNIEXPORT #define JNIEXPORT __attribute__ ((visibility("default"))) +// This replaces the bionic libc assert message with something that +// actually prints the assertion failure before aborting. +extern "C" +void __assert(const char *file, int line, const char *expr) { + __android_log_assert(expr, LOG_TAG, "%s:%d: Assertion failure: %s", + file, line, expr); +} + static JavaVM *cached_jvm; static jfieldID FID_Event_type; static jfieldID FID_Event_synthetic; -- cgit v1.2.3 From f6b02e9986ae8965034ffd1d2e0b895e7f115deb Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:27:46 +0000 Subject: Whitespace fixup in last submit. I'll get the hang of this eventually :/ svn-id: r49507 --- backends/platform/android/android.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 5d78ead6be..7a8c976c82 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -78,8 +78,8 @@ // actually prints the assertion failure before aborting. extern "C" void __assert(const char *file, int line, const char *expr) { - __android_log_assert(expr, LOG_TAG, "%s:%d: Assertion failure: %s", - file, line, expr); + __android_log_assert(expr, LOG_TAG, "%s:%d: Assertion failure: %s", + file, line, expr); } static JavaVM *cached_jvm; -- cgit v1.2.3 From 8a3837ff3ab1b5b64efe196c9cc3e75434ec1e8a Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 13:38:47 +0000 Subject: Add png icon files that were too binary to be part of original Android patch. svn-id: r49508 --- dists/android/res/drawable/scummvm.png | Bin 0 -> 4390 bytes dists/android/res/drawable/scummvm_big.png | Bin 0 -> 26098 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dists/android/res/drawable/scummvm.png create mode 100644 dists/android/res/drawable/scummvm_big.png diff --git a/dists/android/res/drawable/scummvm.png b/dists/android/res/drawable/scummvm.png new file mode 100644 index 0000000000..9944876864 Binary files /dev/null and b/dists/android/res/drawable/scummvm.png differ diff --git a/dists/android/res/drawable/scummvm_big.png b/dists/android/res/drawable/scummvm_big.png new file mode 100644 index 0000000000..b0db57ea0b Binary files /dev/null and b/dists/android/res/drawable/scummvm_big.png differ -- cgit v1.2.3 From 12ca735cebcad417e995566e446142ffd41e6323 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 8 Jun 2010 15:08:45 +0000 Subject: SCI: use base36 sync/audio patches for sci1.1 as well and also check if patch filenames make sense, otherwise skip them - also remove hack for excluding bootdisk.* and aud*.drv svn-id: r49509 --- engines/sci/resource.cpp | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index fd81c8d92f..21ffcb4128 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -620,11 +620,9 @@ void ResourceManager::scanNewSources() { switch (source->source_type) { case kSourceDirectory: readResourcePatches(source); -#ifdef ENABLE_SCI32 // We can't use getSciVersion() at this point, thus using _volVersion - if (_volVersion == kResVersionSci32) // SCI2+ + if (_volVersion >= kResVersionSci11) // SCI1.1+ readResourcePatchesBase36(source); -#endif readWaveAudioPatches(); break; case kSourceExtMap: @@ -1180,10 +1178,6 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { name = (*x)->getName(); inputName = (*x)->getName(); inputName.toUppercase(); - if (inputName.hasPrefix("BOOT")) // skip bootdisk.* - continue; - if (inputName.hasSuffix("DRV")) // skip AUD*.DRV - continue; inputName.deleteChar(0); // delete the first character (type) inputName.deleteChar(7); // delete the dot @@ -1191,24 +1185,27 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { // The base36 encoded resource contains the following: // uint16 resourceId, byte noun, byte verb, byte cond, byte seq uint16 resourceNr = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters - byte noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters - byte verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters - byte cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters - byte seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character - ResourceId resource36((ResourceType)i, resourceNr, noun, verb, cond, seq); - - /* - if (i == kResourceTypeAudio36) - debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); - else - debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); - */ - - psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; - psrcPatch->location_name = name; - psrcPatch->resourceFile = 0; - processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); + uint16 noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters + uint16 verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters + uint16 cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters + uint16 seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character + // Check, if we got valid results + if ((noun <= 255) && (verb <= 255) && (cond <= 255) && (seq <= 255)) { + ResourceId resource36((ResourceType)i, resourceNr, noun, verb, cond, seq); + + /* + if (i == kResourceTypeAudio36) + debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); + else + debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); + */ + + psrcPatch = new ResourceSource; + psrcPatch->source_type = kSourcePatch; + psrcPatch->location_name = name; + psrcPatch->resourceFile = 0; + processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); + } } } } -- cgit v1.2.3 From 3d0ac2a676bd726a1f390b83812f8f5ac7a52d4a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 18:23:38 +0000 Subject: Merged sync_SegManagerPtr() inside EngineState::saveLoadWithSerializer() svn-id: r49512 --- engines/sci/engine/savegame.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 17dbbc94d9..835ae5b966 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -293,16 +293,6 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(Nodes_seg_id); } -static void sync_SegManagerPtr(Common::Serializer &s, SegManager *&obj) { - s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not - - if (s.isLoading()) - obj->resetSegMan(); - - obj->saveLoadWithSerializer(s); -} - - template <> void syncWithSerializer(Common::Serializer &s, Class &obj) { @@ -381,7 +371,12 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint16LE(picPortLeft); } - sync_SegManagerPtr(s, _segMan); + s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not + + if (s.isLoading()) + _segMan->resetSegMan(); + + _segMan->saveLoadWithSerializer(s); syncArray(s, _segMan->_classTable); -- cgit v1.2.3 From 67690e89a37a27ff34ab515c934edbce887fa897 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 18:44:27 +0000 Subject: Merged _game_run() inside game_run(). Some cleanup svn-id: r49513 --- engines/sci/engine/kevent.cpp | 4 +++- engines/sci/engine/vm.cpp | 52 ++++++++++++++++--------------------------- engines/sci/engine/vm.h | 10 ++------- 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index fd7711f196..519a4bcc8f 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -79,7 +79,9 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { switch (curEvent.type) { case SCI_EVENT_QUIT: - quit_vm(s); + s->script_abort_flag = 1; // Terminate VM + g_debugState.seeking = kDebugSeekNothing; + g_debugState.runningStep = 0; break; case SCI_EVENT_KEYBOARD: diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1dcdf450ba..9ee2db71b4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1687,17 +1687,31 @@ static void _init_stack_base_with_selector(EngineState *s, Selector selector) { s->stack_base[1] = NULL_REG; } -static EngineState *_game_run(EngineState *&s) { - bool restoring = false; +void game_run(EngineState **_s) { + EngineState *s = *_s; + + debugC(2, kDebugLevelVM, "Calling %s::play()", g_sci->getGameID()); + _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.play); // Call the play selector + + // Now: Register the first element on the execution stack + if (!send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base)) { + g_sci->getSciDebugger()->printObject(s->_gameObj); + error("Failed to run the game! Aborting..."); + return; + } + // and ENGAGE! + + // Attach the debug console on game startup, if requested if (DebugMan.isDebugChannelEnabled(kDebugLevelOnStartup)) g_sci->getSciDebugger()->attach(); do { s->_executionStackPosChanged = false; - run_vm(s, restoring); + run_vm(s, s->restoring); + if (s->restarting_flags & SCI_GAME_IS_RESTARTING_NOW) { // Restart was requested? - restoring = false; + s->restoring = false; s->_executionStack.clear(); s->_executionStackPosChanged = false; @@ -1715,8 +1729,7 @@ static EngineState *_game_run(EngineState *&s) { s->restarting_flags = SCI_GAME_WAS_RESTARTED; } else { - restoring = s->restoring; - if (restoring) { + if (s->restoring) { game_exit(s); s->restoring = false; if (s->script_abort_flag == 2) { @@ -1735,34 +1748,7 @@ static EngineState *_game_run(EngineState *&s) { } } while (true); - return s; -} - -int game_run(EngineState **_s) { - EngineState *s = *_s; - - debugC(2, kDebugLevelVM, "Calling %s::play()", g_sci->getGameID()); - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.play); // Call the play selector - - // Now: Register the first element on the execution stack- - if (!send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base)) { - Console *con = g_sci->getSciDebugger(); - con->printObject(s->_gameObj); - warning("Failed to run the game! Aborting..."); - return 1; - } - // and ENGAGE! - _game_run(*_s); - debugC(2, kDebugLevelVM, "Game::play() finished."); - - return 0; -} - -void quit_vm(EngineState *s) { - s->script_abort_flag = 1; // Terminate VM - g_debugState.seeking = kDebugSeekNothing; - g_debugState.runningStep = 0; } reg_t *ObjVarRef::getPointer(SegManager *segMan) const { diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 67a6bd0dc3..8c84587284 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -375,9 +375,8 @@ int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion); * Note that, EngineState *s may be changed during the game, e.g. if a game * state is restored. * @param[in] s Pointer to the pointer of the state to operate on - * @return 0 on success, 1 if an error occured. - */ -int game_run(EngineState **s); + */ +void game_run(EngineState **s); /** * Restores an SCI game state and runs the game @@ -397,11 +396,6 @@ int game_restore(EngineState **s, char *savegame_name); */ int game_exit(EngineState *s); -/** - * Instructs the virtual machine to abort - */ -void quit_vm(EngineState *s); - /** * Read a PMachine instruction from a memory buffer and return its length. * -- cgit v1.2.3 From 73010518b22c8c24cf09b07bbd6c17655aa1d331 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 19:36:33 +0000 Subject: Fixed compilation when the SCI32 code is disabled svn-id: r49514 --- engines/sci/resource.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 21ffcb4128..dda03e6063 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -620,9 +620,11 @@ void ResourceManager::scanNewSources() { switch (source->source_type) { case kSourceDirectory: readResourcePatches(source); +#ifdef ENABLE_SCI32 // We can't use getSciVersion() at this point, thus using _volVersion if (_volVersion >= kResVersionSci11) // SCI1.1+ readResourcePatchesBase36(source); +#endif readWaveAudioPatches(); break; case kSourceExtMap: -- cgit v1.2.3 From 641ffa5ee3b8036c1a03fc557d0f9705c824eb3e Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 8 Jun 2010 20:29:33 +0000 Subject: Modification to remove false positive "Possible divide by zero" warnings given by cppcheck-1.43. These are incorrect as '/' operator has precedence over >>, but this does improve readability anyway. This bug in cppcheck has already been corrected: http://sourceforge.net/apps/trac/cppcheck/ticket/1714 svn-id: r49517 --- engines/scumm/sound.cpp | 2 +- sound/softsynth/sid.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 65c50aff14..a845f623c2 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -1789,7 +1789,7 @@ static void convertADResource(ResourceManager *res, const GameSettings& game, in // There is a constant delay of ppqn/3 before the music starts. if (ppqn / 3 >= 128) - *ptr++ = (ppqn / 3 >> 7) | 0x80; + *ptr++ = ((ppqn / 3) >> 7) | 0x80; *ptr++ = ppqn / 3 & 0x7f; // Now copy the actual music data diff --git a/sound/softsynth/sid.cpp b/sound/softsynth/sid.cpp index e0dfd2efc0..d600ac28f5 100644 --- a/sound/softsynth/sid.cpp +++ b/sound/softsynth/sid.cpp @@ -506,7 +506,7 @@ Filter::Filter() { + sizeof(f0_points_6581)/sizeof(*f0_points_6581) - 1, PointPlotter(f0_6581), 1.0); - mixer_DC = -0xfff*0xff/18 >> 7; + mixer_DC = (-0xfff*0xff/18) >> 7; f0 = f0_6581; f0_points = f0_points_6581; -- cgit v1.2.3 From 9304b5fbeb4cb3d181d96be6da34073fc5851939 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 21:05:46 +0000 Subject: Merged the restarting_flags, script_abort_flag, and restoring members of the EngineState class into one variable, abortScriptProcessing. The flag kept to signify a game restart has been placed in a boolean, gameWasRestarted svn-id: r49518 --- engines/sci/console.cpp | 7 +++---- engines/sci/engine/game.cpp | 8 +++----- engines/sci/engine/kevent.cpp | 2 +- engines/sci/engine/kmisc.cpp | 8 +++----- engines/sci/engine/savegame.cpp | 6 +----- engines/sci/engine/state.cpp | 6 +----- engines/sci/engine/state.h | 20 ++++++++++---------- engines/sci/engine/vm.cpp | 34 +++++++++++++--------------------- engines/sci/sci.cpp | 4 ++-- 9 files changed, 37 insertions(+), 58 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 814fbff636..e7c70a2aed 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -78,7 +78,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DVar_Register("gc_interval", &engine->_gamestate->script_gc_interval, DVAR_INT, 0); DVar_Register("simulated_key", &g_debug_simulated_key, DVAR_INT, 0); DVar_Register("track_mouse_clicks", &g_debug_track_mouse_clicks, DVAR_BOOL, 0); - DVar_Register("script_abort_flag", &_engine->_gamestate->script_abort_flag, DVAR_INT, 0); + DVar_Register("script_abort_flag", &_engine->_gamestate->abortScriptProcessing, DVAR_INT, 0); // General DCmd_Register("help", WRAP_METHOD(Console, cmdHelp)); @@ -957,8 +957,7 @@ bool Console::cmdRestoreGame(int argc, const char **argv) { } bool Console::cmdRestartGame(int argc, const char **argv) { - _engine->_gamestate->restarting_flags |= SCI_GAME_IS_RESTARTING_NOW; - _engine->_gamestate->script_abort_flag = 1; + _engine->_gamestate->abortScriptProcessing = kAbortRestartGame;; return false; } @@ -2731,7 +2730,7 @@ bool Console::cmdQuit(int argc, const char **argv) { if (!scumm_stricmp(argv[1], "game")) { // Quit gracefully - _engine->_gamestate->script_abort_flag = 1; // Terminate VM + _engine->_gamestate->abortScriptProcessing = kAbortQuitGame; // Terminate VM g_debugState.seeking = kDebugSeekNothing; g_debugState.runningStep = 0; diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index bc10099e52..5fa1fc0558 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -75,7 +75,7 @@ int script_init_engine(EngineState *s) { s->_executionStack.clear(); // Start without any execution stack s->execution_stack_base = -1; // No vm is running yet - s->restarting_flags = SCI_GAME_IS_NOT_RESTARTING; + s->gameWasRestarted = false; debug(2, "Engine initialized"); @@ -111,8 +111,6 @@ int game_init(EngineState *s) { if (g_sci->_gfxMenu) g_sci->_gfxMenu->reset(); - s->restoring = false; - s->game_start_time = g_system->getMillis(); s->last_wait_time = s->game_start_time; @@ -134,7 +132,7 @@ int game_init(EngineState *s) { } int game_exit(EngineState *s) { - if (!s->restoring) { + if (s->abortScriptProcessing != kAbortLoadGame) { s->_executionStack.clear(); #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound.sfx_exit(); @@ -152,7 +150,7 @@ int game_exit(EngineState *s) { // the segment manager has already been initialized from the // save game. Deleting or resetting it here will result in // invalidating the loaded save state - if (s->restarting_flags & SCI_GAME_IS_RESTARTING_NOW) + if (s->abortScriptProcessing == kAbortRestartGame) s->_segMan->resetSegMan(); // TODO Free parser segment here diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 519a4bcc8f..4b4d605c68 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -79,7 +79,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { switch (curEvent.type) { case SCI_EVENT_QUIT: - s->script_abort_flag = 1; // Terminate VM + s->abortScriptProcessing = kAbortQuitGame; // Terminate VM g_debugState.seeking = kDebugSeekNothing; g_debugState.runningStep = 0; break; diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index f91ba0fd82..d90255ab41 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -37,11 +37,9 @@ namespace Sci { reg_t kRestartGame(EngineState *s, int argc, reg_t *argv) { - s->restarting_flags |= SCI_GAME_IS_RESTARTING_NOW; - s->shrinkStackToBase(); - s->script_abort_flag = 1; // Force vm to abort ASAP + s->abortScriptProcessing = kAbortRestartGame; // Force vm to abort ASAP return NULL_REG; } @@ -49,11 +47,11 @@ reg_t kRestartGame(EngineState *s, int argc, reg_t *argv) { ** Returns the restarting_flag in acc */ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { - s->r_acc = make_reg(0, (s->restarting_flags & SCI_GAME_WAS_RESTARTED)); + s->r_acc = make_reg(0, s->gameWasRestarted); if (argc) { // Only happens during replay if (!argv[0].toUint16()) // Set restarting flag - s->restarting_flags &= ~SCI_GAME_WAS_RESTARTED; + s->gameWasRestarted = false; } uint32 neededSleep = 30; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 835ae5b966..d6111146bd 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -880,8 +880,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->last_wait_time = g_system->getMillis(); s->game_start_time = g_system->getMillis(); - s->restoring = false; - #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound._it = NULL; s->_sound._flags = s->_sound._flags; @@ -906,9 +904,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } #endif - - s->restoring = true; - s->script_abort_flag = 2; // Abort current game with replay + s->abortScriptProcessing = kAbortLoadGame; s->shrinkStackToBase(); } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index b4a04f8826..849f1f3c89 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -91,8 +91,6 @@ void EngineState::reset(bool isRestoring) { _memorySegmentSize = 0; _soundCmd = 0; - restarting_flags = 0; - execution_stack_base = 0; _executionStackPosChanged = false; @@ -104,6 +102,7 @@ void EngineState::reset(bool isRestoring) { stack_base = 0; stack_top = 0; + abortScriptProcessing = kAbortNone; } last_wait_time = 0; @@ -114,11 +113,8 @@ void EngineState::reset(bool isRestoring) { _throttleLastTime = 0; _throttleTrigger = false; - script_abort_flag = 0; script_step_counter = 0; script_gc_interval = GC_INTERVAL; - - restoring = false; } void EngineState::wait(int16 ticks) { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index bcdf66d6ef..6b7dc54a24 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -52,6 +52,13 @@ class SciEvent; class MessageState; class SoundCommandParser; +enum AbortGameState { + kAbortNone = 0, + kAbortLoadGame = 1, + kAbortRestartGame = 2, + kAbortQuitGame = 3 +}; + class DirSeeker { protected: reg_t _outbuffer; @@ -113,8 +120,6 @@ public: #endif SoundCommandParser *_soundCmd; - byte restarting_flags; /**< Flags used for restarting */ - uint32 game_start_time; /**< The time at which the interpreter was started */ uint32 last_wait_time; /**< The last time the game invoked Wait() */ @@ -160,12 +165,9 @@ public: int loadFromLauncher; - /** - * Set this to 1 to abort script execution immediately. Aborting will - * leave the debug exec stack intact. - * Set it to 2 to force a replay afterwards. - */ - int script_abort_flag; // Set to 1 to abort execution. Set to 2 to force a replay afterwards + AbortGameState abortScriptProcessing; + bool gameWasRestarted; + int script_step_counter; // Counts the number of steps executed int script_gc_interval; // Number of steps in between gcs @@ -197,8 +199,6 @@ public: * Resets the engine state. */ void reset(bool isRestoring); - - bool restoring; /**< A flag to indicate if a game is being restored */ }; } // End of namespace Sci diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9ee2db71b4..5cb333db3c 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -816,7 +816,7 @@ void run_vm(EngineState *s, bool restoring) { } - if (s->script_abort_flag || g_engine->shouldQuit()) + if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) return; // Emergency // Debug if this has been requested: @@ -1708,14 +1708,14 @@ void game_run(EngineState **_s) { do { s->_executionStackPosChanged = false; - run_vm(s, s->restoring); + run_vm(s, (s->abortScriptProcessing == kAbortLoadGame)); + game_exit(s); - if (s->restarting_flags & SCI_GAME_IS_RESTARTING_NOW) { // Restart was requested? - s->restoring = false; + if (s->abortScriptProcessing == kAbortRestartGame) { + s->abortScriptProcessing = kAbortNone; s->_executionStack.clear(); s->_executionStackPosChanged = false; - game_exit(s); script_init_engine(s); game_init(s); #ifdef USE_OLD_MUSIC_FUNCTIONS @@ -1725,24 +1725,16 @@ void game_run(EngineState **_s) { send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - s->script_abort_flag = 0; - s->restarting_flags = SCI_GAME_WAS_RESTARTED; + s->gameWasRestarted = true; } else { - if (s->restoring) { - game_exit(s); - s->restoring = false; - if (s->script_abort_flag == 2) { - debugC(2, kDebugLevelVM, "Restarting with replay()"); - s->_executionStack.clear(); // Restart with replay - - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); - - send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - } - - s->script_abort_flag = 0; - + if (s->abortScriptProcessing == kAbortLoadGame) { + s->abortScriptProcessing = kAbortNone; + debugC(2, kDebugLevelVM, "Restarting with replay()"); + s->_executionStack.clear(); + // Restart with replay + _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); + send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); } else break; // exit loop } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 929bdf3307..8d23d5481c 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -219,6 +219,8 @@ Common::Error SciEngine::run() { _gfxCache = cache; _gfxCursor = cursor; + _gamestate->abortScriptProcessing = kAbortNone; + if (game_init(_gamestate)) { /* Initialize */ warning("Game initialization failed: Aborting..."); // TODO: Add an "init failed" error? @@ -264,8 +266,6 @@ Common::Error SciEngine::run() { game_run(&_gamestate); // Run the game - game_exit(_gamestate); - ConfMan.flushToDisk(); delete _gamestate->_soundCmd; -- cgit v1.2.3 From 6474eaa1b293b24db51d2a14ef345c7c853a26e1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 8 Jun 2010 21:15:53 +0000 Subject: SCI: check for SOL header in audio36 patches svn-id: r49520 --- engines/sci/resource.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index dda03e6063..307b4e888e 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1072,15 +1072,17 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource Common::SeekableReadStream *fileStream = 0; Resource *newrsc; ResourceId resId = ResourceId(resourceType, resourceNr, tuple); + ResourceType checkForType = resourceType; byte patchType, patchDataOffset; int fsize; + uint32 audio36Header = 0; // base36 encoded patches (i.e. audio36 and sync36) have the same type as their non-base36 encoded counterparts - if (resourceType == kResourceTypeAudio36) - resourceType = kResourceTypeAudio; + if (checkForType == kResourceTypeAudio36) + checkForType = kResourceTypeAudio; - if (resourceType == kResourceTypeSync36) - resourceType = kResourceTypeSync; + if (checkForType == kResourceTypeSync36) + checkForType = kResourceTypeSync; if (source->resourceFile) { fileStream = source->resourceFile->createReadStream(); @@ -1101,10 +1103,22 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource patchType = fileStream->readByte() & 0x7F; patchDataOffset = fileStream->readByte(); + if (resourceType == kResourceTypeAudio36) { + audio36Header = fileStream->readUint32BE(); + } + delete fileStream; - if (patchType != resourceType) { + if (patchType != checkForType) { debug("Patching %s failed - resource type mismatch", source->location_name.c_str()); + return; + } + + if (resourceType == kResourceTypeAudio36) { + if (audio36Header != MKID_BE('SOL\x00')) { + debug("Patching %s failed - audio36 patch doesn't have SOL header", source->location_name.c_str()); + return; + } } // Fixes SQ5/German, patch file special case logic taken from SCI View disassembly -- cgit v1.2.3 From eafc63e57266d690b177bf34fa593e37d8cf320f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 21:21:19 +0000 Subject: Cleanup svn-id: r49521 --- engines/sci/engine/savegame.cpp | 3 --- engines/sci/engine/state.cpp | 16 +++++++++------- engines/sci/engine/vm.cpp | 18 +++++++----------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index d6111146bd..8dedf3bae9 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -856,9 +856,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_sound.sfx_exit(); #endif - // Set exec stack base to zero - s->execution_stack_base = 0; - // Now copy all current state information #ifdef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 849f1f3c89..0c021863c0 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -91,20 +91,22 @@ void EngineState::reset(bool isRestoring) { _memorySegmentSize = 0; _soundCmd = 0; - execution_stack_base = 0; - _executionStackPosChanged = false; - _fileHandles.resize(5); - r_acc = NULL_REG; - restAdjust = 0; - r_prev = NULL_REG; - stack_base = 0; stack_top = 0; abortScriptProcessing = kAbortNone; } + execution_stack_base = 0; + _executionStackPosChanged = false; + + restAdjust = 0; + restAdjustCur = 0; + + r_acc = NULL_REG; + r_prev = NULL_REG; + last_wait_time = 0; gc_countdown = 0; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 5cb333db3c..d7e3c794b3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1713,7 +1713,6 @@ void game_run(EngineState **_s) { if (s->abortScriptProcessing == kAbortRestartGame) { s->abortScriptProcessing = kAbortNone; - s->_executionStack.clear(); s->_executionStackPosChanged = false; script_init_engine(s); @@ -1726,17 +1725,14 @@ void game_run(EngineState **_s) { send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); s->gameWasRestarted = true; - + } else if (s->abortScriptProcessing == kAbortLoadGame) { + s->abortScriptProcessing = kAbortNone; + debugC(2, kDebugLevelVM, "Restarting with replay()"); + // Restart with replay + _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); + send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); } else { - if (s->abortScriptProcessing == kAbortLoadGame) { - s->abortScriptProcessing = kAbortNone; - debugC(2, kDebugLevelVM, "Restarting with replay()"); - s->_executionStack.clear(); - // Restart with replay - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); - send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - } else - break; // exit loop + break; // exit loop } } while (true); -- cgit v1.2.3 From dc8b826f5ea77a0173c5ad64d6508f9ec7ed798a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 8 Jun 2010 22:00:59 +0000 Subject: SCI: set default palette after initializing music driver, fixes palette getting messed up when using mt32 emulation svn-id: r49523 --- engines/sci/graphics/palette.cpp | 20 +++++++++++--------- engines/sci/graphics/palette.h | 3 ++- engines/sci/sci.cpp | 2 ++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 3c4cf7e964..f9d320122b 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -36,7 +36,7 @@ namespace Sci { -GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool autoSetPalette) +GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) : _resMan(resMan), _screen(screen) { int16 color; @@ -57,19 +57,21 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool autoSetP _sysPalette.colors[255].b = 255; _sysPaletteChanged = false; - if (autoSetPalette) { - if (_resMan->getViewType() == kViewEga) - setEGA(); - else if (_resMan->isAmiga32color()) - setAmiga(); - else - kernelSetFromResource(999, true); - } } GfxPalette::~GfxPalette() { } +// meant to get called only once during init of engine +void GfxPalette::setDefault() { + if (_resMan->getViewType() == kViewEga) + setEGA(); + else if (_resMan->isAmiga32color()) + setAmiga(); + else + kernelSetFromResource(999, true); +} + #define SCI_PAL_FORMAT_CONSTANT 1 #define SCI_PAL_FORMAT_VARIABLE 0 diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 46fec48739..d84436d708 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -36,9 +36,10 @@ class Screen; */ class GfxPalette { public: - GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool autoSetPalette = true); + GfxPalette(ResourceManager *resMan, GfxScreen *screen); ~GfxPalette(); + void setDefault(); void createFromData(byte *data, Palette *paletteOut); bool setAmiga(); void modifyAmigaPalette(byte *data); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 8d23d5481c..888e72783c 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -254,6 +254,8 @@ Common::Error SciEngine::run() { else #endif _gui->init(_features->usesOldGfxFunctions()); + // Set default (EGA, amiga or resource 999) palette + _gfxPalette->setDefault(); debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion())); -- cgit v1.2.3 From 81907a8e6fdefbb173d596763e5ba9d9eacd4363 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 8 Jun 2010 23:29:35 +0000 Subject: Don't shrink the stack after reconstructing it, when loading a saved game. Fixes game restoring in some games (e.g. LSL3), a regression from commit #49376 svn-id: r49525 --- engines/sci/engine/savegame.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 8dedf3bae9..815ffa32a9 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -902,7 +902,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { #endif s->abortScriptProcessing = kAbortLoadGame; - s->shrinkStackToBase(); } bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata *meta) { -- cgit v1.2.3 From b494d46fdde717bf877c1422026038c3c9fed5f4 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 8 Jun 2010 23:29:48 +0000 Subject: chmod +x mkmanifest.pl svn-id: r49526 --- dists/android/mkmanifest.pl | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 dists/android/mkmanifest.pl diff --git a/dists/android/mkmanifest.pl b/dists/android/mkmanifest.pl old mode 100644 new mode 100755 -- cgit v1.2.3 From 10aeb33a4253b5df05f19a9bfabc3cc374db096c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 07:32:17 +0000 Subject: Merged restAdjust and restAdjustCur, as we don't save the restAdjust modifier inside saved games (rightfully so). Also, the segment manager is now reset inside the main loop, when the game is restarted, not in game_exit() svn-id: r49533 --- engines/sci/console.cpp | 2 +- engines/sci/engine/game.cpp | 10 ------ engines/sci/engine/scriptdebug.cpp | 6 ++-- engines/sci/engine/state.cpp | 1 - engines/sci/engine/state.h | 3 +- engines/sci/engine/vm.cpp | 63 ++++++++++++++++++-------------------- 6 files changed, 35 insertions(+), 50 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e7c70a2aed..9f1d03df25 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -597,7 +597,7 @@ bool Console::cmdSetParseNodes(int argc, const char **argv) { bool Console::cmdRegisters(int argc, const char **argv) { EngineState *s = _engine->_gamestate; DebugPrintf("Current register values:\n"); - DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjustCur); + DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjust); if (!s->_executionStack.empty()) { DebugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n", diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 5fa1fc0558..4f4ae774e0 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -70,7 +70,6 @@ int script_init_engine(EngineState *s) { s->_segMan->initSysStrings(); s->r_acc = s->r_prev = NULL_REG; - s->restAdjust = 0; s->_executionStack.clear(); // Start without any execution stack s->execution_stack_base = -1; // No vm is running yet @@ -144,15 +143,6 @@ int game_exit(EngineState *s) { #endif } - // Note: It's a bad idea to delete the segment manager here - // when loading a game. - // This function is called right after a game is loaded, and - // the segment manager has already been initialized from the - // save game. Deleting or resetting it here will result in - // invalidating the loaded save state - if (s->abortScriptProcessing == kAbortRestartGame) - s->_segMan->resetSegMan(); - // TODO Free parser segment here // TODO Free scripts here diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index b465ab3d4e..159c278e8c 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -205,12 +205,12 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode if (opcode == op_callk) { - int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjustCur); + int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjust); int argc = ((s->xs->sp)[- stackframe - 1]).offset; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) - argc += (s->restAdjustCur); + argc += (s->restAdjust); printf(" Kernel params: ("); @@ -221,7 +221,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod } printf(")\n"); } else if ((opcode == op_send) || (opcode == op_self)) { - int restmod = s->restAdjustCur; + int restmod = s->restAdjust; int stackframe = (scr[pos.offset + 1] >> 1) + restmod; reg_t *sb = s->xs->sp; uint16 selector; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 0c021863c0..2410b2666d 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -102,7 +102,6 @@ void EngineState::reset(bool isRestoring) { _executionStackPosChanged = false; restAdjust = 0; - restAdjustCur = 0; r_acc = NULL_REG; r_prev = NULL_REG; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 6b7dc54a24..3fcefd80c4 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -147,8 +147,7 @@ public: bool _executionStackPosChanged; /**< Set to true if the execution stack position should be re-evaluated by the vm */ reg_t r_acc; /**< Accumulator */ - int16 restAdjust; /**< &rest register (only used for save games) */ - int16 restAdjustCur; /**< current &rest register (only used for save games) */ + int16 restAdjust; /**< current &rest register (only used for save games) */ reg_t r_prev; /**< previous comparison result */ StackPtr stack_base; /**< Pointer to the least stack element */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d7e3c794b3..71d6672eb4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -718,7 +718,7 @@ void run_vm(EngineState *s, bool restoring) { StackPtr s_temp; // Temporary stack pointer int16 opparams[4]; // opcode parameters - s->restAdjustCur = s->restAdjust; + s->restAdjust = 0; // &rest adjusts the parameter count by this value // Current execution data: s->xs = &(s->_executionStack.back()); @@ -1116,17 +1116,17 @@ void run_vm(EngineState *s, bool restoring) { case op_call: { // 0x20 (32) int argc = (opparams[1] >> 1) // Given as offset, but we need count - + 1 + s->restAdjustCur; + + 1 + s->restAdjust; StackPtr call_base = s->xs->sp - argc; - s->xs->sp[1].offset += s->restAdjustCur; + s->xs->sp[1].offset += s->restAdjust; xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment, s->xs->addr.pc.offset + opparams[0]), s->xs->sp, s->xs->objp, - (validate_arithmetic(*call_base)) + s->restAdjustCur, + (validate_arithmetic(*call_base)) + s->restAdjust, call_base, NULL_SELECTOR, s->xs->objp, s->_executionStack.size()-1, s->xs->local_segment); - s->restAdjustCur = 0; // Used up the &rest adjustment + s->restAdjust = 0; // Used up the &rest adjustment s->xs->sp = call_base; s->_executionStackPosChanged = true; @@ -1139,20 +1139,18 @@ void run_vm(EngineState *s, bool restoring) { s->xs->sp -= (opparams[1] >> 1) + 1; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - if (!oldScriptHeader) { - s->xs->sp -= s->restAdjustCur; - s->restAdjust = 0; // We just used up the s->restAdjustCur, remember? - } + if (!oldScriptHeader) + s->xs->sp -= s->restAdjust; int argc = validate_arithmetic(s->xs->sp[0]); if (!oldScriptHeader) - argc += s->restAdjustCur; + argc += s->restAdjust; callKernelFunc(s, opparams[0], argc); if (!oldScriptHeader) - s->restAdjustCur = s->restAdjust; + s->restAdjust = 0; // Calculate xs again: The kernel function might // have spawned a new VM @@ -1163,27 +1161,27 @@ void run_vm(EngineState *s, bool restoring) { } case op_callb: // 0x22 (34) - temp = ((opparams[1] >> 1) + s->restAdjustCur + 1); + temp = ((opparams[1] >> 1) + s->restAdjust + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjustCur; + s->xs->sp[0].offset += s->restAdjust; xs_new = execute_method(s, 0, opparams[0], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjustCur = 0; // Used up the &rest adjustment + s->restAdjust = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; break; case op_calle: // 0x23 (35) - temp = ((opparams[2] >> 1) + s->restAdjustCur + 1); + temp = ((opparams[2] >> 1) + s->restAdjust + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjustCur; + s->xs->sp[0].offset += s->restAdjust; xs_new = execute_method(s, opparams[0], opparams[1], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjustCur = 0; // Used up the &rest adjustment + s->restAdjust = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; @@ -1201,7 +1199,6 @@ void run_vm(EngineState *s, bool restoring) { s->_executionStack.pop_back(); s->_executionStackPosChanged = true; - s->restAdjust = s->restAdjustCur; // Update &rest return; // "Hard" return } @@ -1234,16 +1231,16 @@ void run_vm(EngineState *s, bool restoring) { case op_send: // 0x25 (37) s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack - s->xs->sp[1].offset += s->restAdjustCur; + s->xs->sp[1].offset += s->restAdjust; xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp, - (int)(opparams[0] >> 1) + (uint16)s->restAdjustCur, s->xs->sp); + (int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjustCur = 0; + s->restAdjust = 0; break; @@ -1263,17 +1260,17 @@ void run_vm(EngineState *s, bool restoring) { case op_self: // 0x2a (42) s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack - s->xs->sp[1].offset += s->restAdjustCur; + s->xs->sp[1].offset += s->restAdjust; xs_new = send_selector(s, s->xs->objp, s->xs->objp, - s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjustCur, + s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjustCur = 0; + s->restAdjust = 0; break; case op_super: // 0x2b (43) @@ -1283,24 +1280,24 @@ void run_vm(EngineState *s, bool restoring) { error("[VM]: Invalid superclass in object"); else { s_temp = s->xs->sp; - s->xs->sp -= ((opparams[1] >> 1) + s->restAdjustCur); // Adjust stack + s->xs->sp -= ((opparams[1] >> 1) + s->restAdjust); // Adjust stack - s->xs->sp[1].offset += s->restAdjustCur; + s->xs->sp[1].offset += s->restAdjust; xs_new = send_selector(s, r_temp, s->xs->objp, s_temp, - (int)(opparams[1] >> 1) + (uint16)s->restAdjustCur, + (int)(opparams[1] >> 1) + (uint16)s->restAdjust, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjustCur = 0; + s->restAdjust = 0; } break; case op_rest: // 0x2c (44) temp = (uint16) opparams[0]; // First argument - s->restAdjustCur = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't + s->restAdjust = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't for (; temp <= s->xs->argc; temp++) PUSH32(s->xs->variables_argp[temp]); @@ -1715,6 +1712,7 @@ void game_run(EngineState **_s) { s->abortScriptProcessing = kAbortNone; s->_executionStackPosChanged = false; + s->_segMan->resetSegMan(); script_init_engine(s); game_init(s); #ifdef USE_OLD_MUSIC_FUNCTIONS @@ -1727,8 +1725,7 @@ void game_run(EngineState **_s) { s->gameWasRestarted = true; } else if (s->abortScriptProcessing == kAbortLoadGame) { s->abortScriptProcessing = kAbortNone; - debugC(2, kDebugLevelVM, "Restarting with replay()"); - // Restart with replay + // Insert a replay selector _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); } else { -- cgit v1.2.3 From 5cb311ee2c352372e8eb494933e2bc36ffd5c4f5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 07:59:42 +0000 Subject: Renamed the SciEvent class to EventManager, to separate it from the sciEvent structure, and removed it from the engine state svn-id: r49534 --- engines/sci/engine/kevent.cpp | 2 +- engines/sci/engine/state.cpp | 6 ++---- engines/sci/engine/state.h | 4 +--- engines/sci/event.cpp | 14 +++++++------- engines/sci/event.h | 6 +++--- engines/sci/graphics/cursor.cpp | 2 +- engines/sci/graphics/cursor.h | 4 ++-- engines/sci/graphics/gui32.cpp | 2 +- engines/sci/graphics/gui32.h | 2 +- engines/sci/graphics/menu.cpp | 2 +- engines/sci/graphics/menu.h | 4 ++-- engines/sci/graphics/portrait.cpp | 2 +- engines/sci/graphics/portrait.h | 4 ++-- engines/sci/sci.cpp | 6 +++--- engines/sci/sci.h | 3 +++ 15 files changed, 31 insertions(+), 32 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 4b4d605c68..d6cb4ebd8e 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -67,7 +67,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { oldx = mousePos.x; oldy = mousePos.y; - curEvent = s->_event->get(mask); + curEvent = g_sci->getEventManager()->get(mask); if (g_sci->getVocabulary()) g_sci->getVocabulary()->parser_event = NULL_REG; // Invalidate parser event diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 2410b2666d..e94be73077 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -119,14 +119,12 @@ void EngineState::reset(bool isRestoring) { } void EngineState::wait(int16 ticks) { - uint32 time; - - time = g_system->getMillis(); + uint32 time = g_system->getMillis(); r_acc = make_reg(0, ((long)time - (long)last_wait_time) * 60 / 1000); last_wait_time = time; ticks *= g_debug_sleeptime_factor; - _event->sleep(ticks * 1000 / 60); + g_sci->getEventManager()->sleep(ticks * 1000 / 60); } uint16 EngineState::currentRoomNumber() const { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 3fcefd80c4..ae81e9393d 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -48,7 +48,7 @@ namespace Common { namespace Sci { -class SciEvent; +class EventManager; class MessageState; class SoundCommandParser; @@ -112,8 +112,6 @@ public: /* Non-VM information */ - SciEvent *_event; // Event handling - #ifdef USE_OLD_MUSIC_FUNCTIONS SfxState _sound; /**< sound subsystem */ int sfx_init_flags; /**< flags the sfx subsystem was initialised with */ diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index c3be22b143..cdddb26ca4 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -36,12 +36,12 @@ namespace Sci { #define SCANCODE_ROWS_NR 3 -SciEvent::SciEvent(ResourceManager *resMan) { +EventManager::EventManager(ResourceManager *resMan) { // Check, if font of current game includes extended chars _fontIsExtended = resMan->detectFontExtended(); } -SciEvent::~SciEvent() { +EventManager::~EventManager() { } struct scancode_row { @@ -53,7 +53,7 @@ struct scancode_row { {0x2c, "ZXCVBNM,./"} }; -int SciEvent::altify (int ch) { +int EventManager::altify (int ch) { // Calculates a PC keyboard scancode from a character */ int row; int c = toupper((char)ch); @@ -74,7 +74,7 @@ int SciEvent::altify (int ch) { return ch; } -int SciEvent::numlockify (int c) { +int EventManager::numlockify (int c) { switch (c) { case SCI_KEY_DELETE: return '.'; @@ -114,7 +114,7 @@ static const byte codepagemap_88591toDOS[0x80] = { '?', 0xa4, 0x95, 0xa2, 0x93, '?', 0x94, '?', '?', 0x97, 0xa3, 0x96, 0x81, '?', '?', 0x98 // 0xFx }; -sciEvent SciEvent::getFromScummVM() { +sciEvent EventManager::getFromScummVM() { static int _modifierStates = 0; // FIXME: Avoid non-const global vars sciEvent input = { SCI_EVENT_NONE, 0, 0, 0 }; @@ -315,7 +315,7 @@ sciEvent SciEvent::getFromScummVM() { return input; } -sciEvent SciEvent::get(unsigned int mask) { +sciEvent EventManager::get(unsigned int mask) { //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; sciEvent event = { 0, 0, 0, 0 }; @@ -380,7 +380,7 @@ sciEvent SciEvent::get(unsigned int mask) { return event; } -void SciEvent::sleep(uint32 msecs) { +void EventManager::sleep(uint32 msecs) { uint32 time; const uint32 wakeup_time = g_system->getMillis() + msecs; diff --git a/engines/sci/event.h b/engines/sci/event.h index 9301b1ca09..7882e56c02 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -111,10 +111,10 @@ struct sciEvent { #define SCI_KEYMOD_NO_FOOLOCK (~(SCI_KEYMOD_SCRLOCK | SCI_KEYMOD_NUMLOCK | SCI_KEYMOD_CAPSLOCK | SCI_KEYMOD_INSERT)) #define SCI_KEYMOD_ALL 0xFF -class SciEvent { +class EventManager { public: - SciEvent(ResourceManager *resMgr); - ~SciEvent(); + EventManager(ResourceManager *resMgr); + ~EventManager(); sciEvent get(unsigned int mask); diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 2f8393f9ac..8cc99c787c 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -54,7 +54,7 @@ GfxCursor::~GfxCursor() { purgeCache(); } -void GfxCursor::init(GfxCoordAdjuster *coordAdjuster, SciEvent *event) { +void GfxCursor::init(GfxCoordAdjuster *coordAdjuster, EventManager *event) { _coordAdjuster = coordAdjuster; _event = event; } diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h index 6d92b3cf5f..7acd14acd9 100644 --- a/engines/sci/graphics/cursor.h +++ b/engines/sci/graphics/cursor.h @@ -45,7 +45,7 @@ public: GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *screen); ~GfxCursor(); - void init(GfxCoordAdjuster *coordAdjuster, SciEvent *event); + void init(GfxCoordAdjuster *coordAdjuster, EventManager *event); void kernelShow(); void kernelHide(); @@ -74,7 +74,7 @@ private: GfxScreen *_screen; GfxPalette *_palette; GfxCoordAdjuster *_coordAdjuster; - SciEvent *_event; + EventManager *_event; int _upscaledHires; diff --git a/engines/sci/graphics/gui32.cpp b/engines/sci/graphics/gui32.cpp index 4b72050d0b..10b2b1c4fd 100644 --- a/engines/sci/graphics/gui32.cpp +++ b/engines/sci/graphics/gui32.cpp @@ -45,7 +45,7 @@ namespace Sci { -SciGui32::SciGui32(SegManager *segMan, SciEvent *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor) +SciGui32::SciGui32(SegManager *segMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor) : _screen(screen), _palette(palette), _cache(cache), _cursor(cursor) { _coordAdjuster = new GfxCoordAdjuster32(segMan); diff --git a/engines/sci/graphics/gui32.h b/engines/sci/graphics/gui32.h index 99eb03b321..2c73272566 100644 --- a/engines/sci/graphics/gui32.h +++ b/engines/sci/graphics/gui32.h @@ -41,7 +41,7 @@ class GfxPaint32; class SciGui32 { public: - SciGui32(SegManager *segMan, SciEvent *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor); + SciGui32(SegManager *segMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor); ~SciGui32(); void init(); diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 880e1aba12..ac4f1c0653 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -43,7 +43,7 @@ namespace Sci { -GfxMenu::GfxMenu(SciEvent *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor) +GfxMenu::GfxMenu(EventManager *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor) : _event(event), _segMan(segMan), _gui(gui), _ports(ports), _paint16(paint16), _text16(text16), _screen(screen), _cursor(cursor) { _menuSaveHandle = NULL_REG; diff --git a/engines/sci/graphics/menu.h b/engines/sci/graphics/menu.h index 8f23b46ff8..ec344961de 100644 --- a/engines/sci/graphics/menu.h +++ b/engines/sci/graphics/menu.h @@ -83,7 +83,7 @@ typedef Common::List GuiMenuItemList; */ class GfxMenu { public: - GfxMenu(SciEvent *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor); + GfxMenu(EventManager *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor); ~GfxMenu(); void reset(); @@ -111,7 +111,7 @@ private: uint16 mouseFindMenuItemSelection(Common::Point mousePosition, uint16 menuId); GuiMenuItemEntry *interactiveGetItem(uint16 menuId, uint16 itemId, bool menuChanged); - SciEvent *_event; + EventManager *_event; SegManager *_segMan; SciGui *_gui; GfxPorts *_ports; diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index 1208f8ed65..1b4e4bde77 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -38,7 +38,7 @@ namespace Sci { -Portrait::Portrait(ResourceManager *resMan, SciEvent *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName) +Portrait::Portrait(ResourceManager *resMan, EventManager *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName) : _resMan(resMan), _event(event), _gui(gui), _screen(screen), _palette(palette), _audio(audio), _resourceName(resourceName) { init(); } diff --git a/engines/sci/graphics/portrait.h b/engines/sci/graphics/portrait.h index 4b22e209a3..2f23ced913 100644 --- a/engines/sci/graphics/portrait.h +++ b/engines/sci/graphics/portrait.h @@ -42,7 +42,7 @@ struct PortraitBitmap { */ class Portrait { public: - Portrait(ResourceManager *resMan, SciEvent *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName); + Portrait(ResourceManager *resMan, EventManager *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName); ~Portrait(); void setupAudio(uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq); @@ -56,7 +56,7 @@ private: void bitsShow(); ResourceManager *_resMan; - SciEvent *_event; + EventManager *_event; SciGui *_gui; GfxPalette *_palette; GfxScreen *_screen; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 888e72783c..b30665a59e 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -190,7 +190,7 @@ Common::Error SciEngine::run() { _gamestate = new EngineState(segMan); - _gamestate->_event = new SciEvent(_resMan); + _eventMan = new EventManager(_resMan); if (script_init_engine(_gamestate)) return Common::kUnknownError; @@ -203,7 +203,7 @@ Common::Error SciEngine::run() { _gfxPaint16 = 0; _gfxPorts = 0; _gui = 0; - _gui32 = new SciGui32(_gamestate->_segMan, _gamestate->_event, screen, palette, cache, cursor); + _gui32 = new SciGui32(_gamestate->_segMan, _eventMan, screen, palette, cache, cursor); } else { #endif _gfxPorts = new GfxPorts(segMan, screen); @@ -280,7 +280,7 @@ Common::Error SciEngine::run() { delete _gfxPalette; delete cursor; delete _gfxScreen; - delete _gamestate->_event; + delete _eventMan; delete segMan; delete _gamestate; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 685f05e685..0902a41139 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -51,6 +51,7 @@ class Kernel; class GameFeatures; class Console; class AudioPlayer; +class EventManager; class GfxAnimate; class GfxCache; @@ -164,6 +165,7 @@ public: inline Kernel *getKernel() const { return _kernel; } inline EngineState *getEngineState() const { return _gamestate; } inline Vocabulary *getVocabulary() const { return _vocabulary; } + inline EventManager *getEventManager() const { return _eventMan; } Common::String getSavegameName(int nr) const; Common::String getSavegamePattern() const; @@ -222,6 +224,7 @@ private: EngineState *_gamestate; Kernel *_kernel; Vocabulary *_vocabulary; + EventManager *_eventMan; Console *_console; OSystem *_system; }; -- cgit v1.2.3 From 95b080f60b74fe9b83d71abc9a80038f025845c6 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 9 Jun 2010 08:49:37 +0000 Subject: Fix compile errors svn-id: r49535 --- engines/sci/engine/kmisc.cpp | 2 +- engines/sci/graphics/gui.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index d90255ab41..25fb11d62f 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -80,7 +80,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { uint32 duration = curTime - s->_throttleLastTime; if (duration < neededSleep) { - s->_event->sleep(neededSleep - duration); + g_sci->getEventManager()->sleep(neededSleep - duration); s->_throttleLastTime = g_system->getMillis(); } else { s->_throttleLastTime = curTime; diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index e427edd732..df9227b87f 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -59,7 +59,7 @@ SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCa // then it should init it! _coordAdjuster = new GfxCoordAdjuster16(_ports); g_sci->_gfxCoordAdjuster = _coordAdjuster; - _cursor->init(_coordAdjuster, _s->_event); + _cursor->init(_coordAdjuster, g_sci->getEventManager()); _compare = new GfxCompare(_s->_segMan, g_sci->getKernel(), _cache, _screen, _coordAdjuster); g_sci->_gfxCompare = _compare; _transitions = new GfxTransitions(this, _screen, _palette, g_sci->getResMan()->isVGA()); @@ -71,7 +71,7 @@ SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCa _text16 = new GfxText16(g_sci->getResMan(), _cache, _ports, _paint16, _screen); _controls = new GfxControls(_s->_segMan, _ports, _paint16, _text16, _screen); g_sci->_gfxControls = _controls; - _menu = new GfxMenu(_s->_event, _s->_segMan, this, _ports, _paint16, _text16, _screen, _cursor); + _menu = new GfxMenu(g_sci->getEventManager(), _s->_segMan, this, _ports, _paint16, _text16, _screen, _cursor); g_sci->_gfxMenu = _menu; } @@ -123,7 +123,7 @@ reg_t SciGui::portraitLoad(Common::String resourceName) { } void SciGui::portraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { - Portrait *myPortrait = new Portrait(g_sci->getResMan(), _s->_event, this, _screen, _palette, _audio, resourceName); + Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), this, _screen, _palette, _audio, resourceName); // TODO: cache portraits // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates // on kDrawCel, yeah this whole stuff makes sense) -- cgit v1.2.3 From 536b2614e8bd7c3c6e47e686a90596460c5448d1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 09:17:48 +0000 Subject: Globals from script 0 are now initialized in script_init_engine(), and are accessed from the relevant variables pointer. Removed direct reference to script 0 from the engine state svn-id: r49536 --- engines/sci/engine/game.cpp | 7 +++---- engines/sci/engine/savegame.cpp | 2 +- engines/sci/engine/state.cpp | 16 +++++++++++++--- engines/sci/engine/state.h | 16 ++++++---------- engines/sci/engine/vm.cpp | 15 --------------- engines/sci/graphics/animate.cpp | 6 ++---- 6 files changed, 25 insertions(+), 37 deletions(-) diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 4f4ae774e0..9e5b9b8990 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -58,14 +58,13 @@ int script_init_engine(EngineState *s) { s->_msgState = new MessageState(s->_segMan); s->gc_countdown = GC_INTERVAL - 1; - SegmentId script_000_segment = s->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK); - - if (script_000_segment <= 0) { + // Script 0 should always be at segment 1 + if (s->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK) != 1) { debug(2, "Failed to instantiate script.000"); return 1; } - s->script_000 = s->_segMan->getScript(script_000_segment); + s->initGlobals(); s->_segMan->initSysStrings(); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 815ffa32a9..255e2700ee 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -870,7 +870,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_segMan->reconstructStack(s); s->_segMan->reconstructScripts(s); s->_segMan->reconstructClones(); - s->script_000 = s->_segMan->getScript(s->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); + s->initGlobals(); s->gc_countdown = GC_INTERVAL - 1; // Time state: diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index e94be73077..8860666bef 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -85,7 +85,6 @@ void EngineState::reset(bool isRestoring) { #endif if (!isRestoring) { - script_000 = 0; _gameObj = NULL_REG; _memorySegmentSize = 0; @@ -127,12 +126,23 @@ void EngineState::wait(int16 ticks) { g_sci->getEventManager()->sleep(ticks * 1000 / 60); } +void EngineState::initGlobals() { + Script *script_000 = _segMan->getScript(1); + + if (!script_000->_localsBlock) + error("Script 0 has no locals block"); + + variables_seg[VAR_GLOBAL] = script_000->_localsSegment; + variables_base[VAR_GLOBAL] = variables[VAR_GLOBAL] = script_000->_localsBlock->_locals.begin(); + variables_max[VAR_GLOBAL] = script_000->_localsBlock->_locals.size(); +} + uint16 EngineState::currentRoomNumber() const { - return script_000->_localsBlock->_locals[13].toUint16(); + return variables[VAR_GLOBAL][13].toUint16(); } void EngineState::setRoomNumber(uint16 roomNumber) { - script_000->_localsBlock->_locals[13] = make_reg(0, roomNumber); + variables[VAR_GLOBAL][13] = make_reg(0, roomNumber); } void EngineState::shrinkStackToBase() { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index ae81e9393d..aaeb8c49ee 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -79,13 +79,6 @@ enum { MAX_SAVE_DIR_SIZE = MAXPATHLEN }; -/** values for EngineState.restarting_flag */ -enum { - SCI_GAME_IS_NOT_RESTARTING = 0, - SCI_GAME_WAS_RESTARTED = 1, - SCI_GAME_IS_RESTARTING_NOW = 2 -}; - class FileHandle { public: Common::String _name; @@ -145,7 +138,7 @@ public: bool _executionStackPosChanged; /**< Set to true if the execution stack position should be re-evaluated by the vm */ reg_t r_acc; /**< Accumulator */ - int16 restAdjust; /**< current &rest register (only used for save games) */ + int16 restAdjust; /**< current &rest register */ reg_t r_prev; /**< previous comparison result */ StackPtr stack_base; /**< Pointer to the least stack element */ @@ -158,8 +151,6 @@ public: SegmentId variables_seg[4]; ///< Same as above, contains segment IDs int variables_max[4]; ///< Max. values for all variables - Script *script_000; /**< script 000, e.g. for globals */ - int loadFromLauncher; AbortGameState abortScriptProcessing; @@ -171,6 +162,11 @@ public: uint16 currentRoomNumber() const; void setRoomNumber(uint16 roomNumber); + /** + * Sets global variables from script 0 + */ + void initGlobals(); + /** * Shrink execution stack to size. * Contains an assert it is not already smaller. diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 71d6672eb4..851f301a75 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -736,24 +736,9 @@ void run_vm(EngineState *s, bool restoring) { if (!restoring) s->execution_stack_base = s->_executionStack.size() - 1; -#ifndef DISABLE_VALIDATIONS - // Initialize maximum variable count - if (s->script_000->_localsBlock) - s->variables_max[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.size(); - else - s->variables_max[VAR_GLOBAL] = 0; -#endif - - s->variables_seg[VAR_GLOBAL] = s->script_000->_localsSegment; s->variables_seg[VAR_TEMP] = s->variables_seg[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); s->variables_base[VAR_TEMP] = s->variables_base[VAR_PARAM] = s->stack_base; - // SCI code reads the zeroth argument to determine argc - if (s->script_000->_localsBlock) - s->variables_base[VAR_GLOBAL] = s->variables[VAR_GLOBAL] = s->script_000->_localsBlock->_locals.begin(); - else - s->variables_base[VAR_GLOBAL] = s->variables[VAR_GLOBAL] = NULL; - s->_executionStackPosChanged = true; // Force initialization while (1) { diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index c201b2cfb7..d4def39ebf 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -84,10 +84,8 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { if (!_ignoreFastCast) { // Check if the game has a fastCast object set // if we don't abort kAnimate processing, at least in kq5 there will be animation cels drawn into speech boxes. - reg_t global84 = _s->script_000->_localsBlock->_locals[84]; - - if (!global84.isNull()) { - if (!strcmp(_s->_segMan->getObjectName(global84), "fastCast")) + if (!_s->variables[VAR_GLOBAL][84].isNull()) { + if (!strcmp(_s->_segMan->getObjectName(_s->variables[VAR_GLOBAL][84]), "fastCast")) return false; } } -- cgit v1.2.3 From 2c629a04dd502ff130127072e69724b2eec29c68 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 10:45:54 +0000 Subject: Merged script_init_engine() and game_init() and cleaned up SciEngine::run() a bit svn-id: r49537 --- engines/sci/engine/game.cpp | 30 +++++++++++++----------------- engines/sci/engine/kernel.cpp | 10 +++++----- engines/sci/engine/kernel.h | 23 +++++++++++------------ engines/sci/engine/vm.cpp | 6 ------ engines/sci/engine/vm.h | 8 -------- engines/sci/sci.cpp | 39 ++++++++++++--------------------------- 6 files changed, 41 insertions(+), 75 deletions(-) diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 9e5b9b8990..704fe877c7 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -53,13 +53,21 @@ int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion) { } #endif -// Architectural stuff: Init/Unintialize engine -int script_init_engine(EngineState *s) { +/*************************************************************/ +/* Game instance stuff: Init/Unitialize state-dependant data */ +/*************************************************************/ + +int game_init(EngineState *s) { + // FIXME Use new VM instantiation code all over the place + // Script 0 needs to be allocated here before anything else! + int script0Segment = s->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK); + DataStack *stack = s->_segMan->allocateStack(VM_STACK_SIZE, NULL); + s->_msgState = new MessageState(s->_segMan); s->gc_countdown = GC_INTERVAL - 1; // Script 0 should always be at segment 1 - if (s->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK) != 1) { + if (script0Segment != 1) { debug(2, "Failed to instantiate script.000"); return 1; } @@ -72,23 +80,11 @@ int script_init_engine(EngineState *s) { s->_executionStack.clear(); // Start without any execution stack s->execution_stack_base = -1; // No vm is running yet + s->_executionStackPosChanged = false; + s->abortScriptProcessing = kAbortNone; s->gameWasRestarted = false; - debug(2, "Engine initialized"); - - return 0; -} - -/*************************************************************/ -/* Game instance stuff: Init/Unitialize state-dependant data */ -/*************************************************************/ - -int game_init(EngineState *s) { - // FIXME Use new VM instantiation code all over the place - DataStack *stack; - - stack = s->_segMan->allocateStack(VM_STACK_SIZE, NULL); s->stack_base = stack->_entries; s->stack_top = stack->_entries + stack->_capacity; diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 6ebee2dfbd..995ecc72a4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -392,6 +392,7 @@ SciKernelFunction kfunct_mappers[] = { }; Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { + loadKernelNames(); loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use } @@ -691,7 +692,7 @@ bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { return false; } -void Kernel::setDefaultKernelNames(Common::String gameId) { +void Kernel::setDefaultKernelNames() { _kernelNames = Common::StringArray(sci_default_knames, SCI_KNAMES_DEFAULT_ENTRIES_NR); // Some (later) SCI versions replaced CanBeHere by CantBeHere @@ -730,7 +731,7 @@ void Kernel::setDefaultKernelNames(Common::String gameId) { // In KQ6 CD, the empty kSetSynonyms function has been replaced // with kPortrait. In KQ6 Mac, kPlayBack has been replaced by // kShowMovie. - if (gameId == "kq6") { + if (!strcmp(g_sci->getGameID(), "kq6")) { if (g_sci->getPlatform() == Common::kPlatformMacintosh) _kernelNames[0x84] = "ShowMovie"; else @@ -747,7 +748,7 @@ void Kernel::setDefaultKernelNames(Common::String gameId) { } } -bool Kernel::loadKernelNames(Common::String gameId) { +void Kernel::loadKernelNames() { _kernelNames.clear(); #ifdef ENABLE_SCI32 @@ -757,10 +758,9 @@ bool Kernel::loadKernelNames(Common::String gameId) { setKernelNamesSci2(); else #endif - setDefaultKernelNames(gameId); + setDefaultKernelNames(); mapFunctions(); - return true; } Common::String Kernel::lookupText(reg_t address, int index) { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 8f8f34f74e..b79ba8caaa 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -155,17 +155,6 @@ public: uint getKernelNamesSize() const; const Common::String &getKernelName(uint number) const; - /** - * Loads the kernel function names. - * - * This function reads the kernel function name table from resource_map, - * and fills the _kernelNames array with them. - * The resulting list has the same format regardless of the format of the - * name table of the resource (the format changed between version 0 and 1). - * @return true on success, false on failure - */ - bool loadKernelNames(Common::String gameId); - /** * Determines the selector ID of a selector by its name * @param selectorName Name of the selector to look up @@ -219,10 +208,20 @@ public: Common::String lookupText(reg_t address, int index); private: + /** + * Loads the kernel function names. + * + * This function reads the kernel function name table from resource_map, + * and fills the _kernelNames array with them. + * The resulting list has the same format regardless of the format of the + * name table of the resource (the format changed between version 0 and 1). + */ + void loadKernelNames(); + /** * Sets the default kernel function names, based on the SCI version used */ - void setDefaultKernelNames(Common::String gameId); + void setDefaultKernelNames(); #ifdef ENABLE_SCI32 /** diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 851f301a75..eb2824d9c7 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1694,19 +1694,13 @@ void game_run(EngineState **_s) { game_exit(s); if (s->abortScriptProcessing == kAbortRestartGame) { - s->abortScriptProcessing = kAbortNone; - s->_executionStackPosChanged = false; - s->_segMan->resetSegMan(); - script_init_engine(s); game_init(s); #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound.sfx_reset_player(); #endif _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.play); - send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - s->gameWasRestarted = true; } else if (s->abortScriptProcessing == kAbortLoadGame) { s->abortScriptProcessing = kAbortNone; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 8c84587284..1764284dae 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -282,14 +282,6 @@ void run_vm(EngineState *s, bool restoring); */ void script_debug(EngineState *s); -/** - * Initializes a EngineState block - * @param[in] s The state to initialize - * @return 0 on success, 1 if vocab.996 (the class table) is missing - * or corrupted - */ -int script_init_engine(EngineState *); - /** * Looks up a selector and returns its type and value * varindex is written to iff it is non-NULL and the selector indicates a property of the object. diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index b30665a59e..22c93c1de0 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -163,20 +163,19 @@ Common::Error SciEngine::run() { upscaledHires = GFX_SCREEN_UPSCALED_640x400; // Initialize graphics-related parts - GfxScreen *screen = 0; // invokes initGraphics() if (_resMan->detectHires()) - screen = new GfxScreen(_resMan, 640, 480); + _gfxScreen = new GfxScreen(_resMan, 640, 480); else - screen = new GfxScreen(_resMan, 320, 200, upscaledHires); + _gfxScreen = new GfxScreen(_resMan, 320, 200, upscaledHires); if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) _gfxMacIconBar = new GfxMacIconBar(); - GfxPalette *palette = new GfxPalette(_resMan, screen); - GfxCache *cache = new GfxCache(_resMan, screen, palette); - GfxCursor *cursor = new GfxCursor(_resMan, palette, screen); + _gfxPalette = new GfxPalette(_resMan, _gfxScreen); + _gfxCache = new GfxCache(_resMan, _gfxScreen, _gfxPalette); + _gfxCursor = new GfxCursor(_resMan, _gfxPalette, _gfxScreen); // Create debugger console. It requires GFX to be initialized _console = new Console(this); @@ -185,16 +184,10 @@ Common::Error SciEngine::run() { // Only SCI0 and SCI01 games used a parser _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan) : NULL; _audio = new AudioPlayer(_resMan); - _features = new GameFeatures(segMan, _kernel); - _gamestate = new EngineState(segMan); - _eventMan = new EventManager(_resMan); - if (script_init_engine(_gamestate)) - return Common::kUnknownError; - #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2) { _gfxAnimate = 0; @@ -203,23 +196,19 @@ Common::Error SciEngine::run() { _gfxPaint16 = 0; _gfxPorts = 0; _gui = 0; - _gui32 = new SciGui32(_gamestate->_segMan, _eventMan, screen, palette, cache, cursor); + _gui32 = new SciGui32(_gamestate->_segMan, _eventMan, _gfxScreen, _gfxPalette, _gfxCache, _gfxCursor); } else { #endif - _gfxPorts = new GfxPorts(segMan, screen); - _gui = new SciGui(_gamestate, screen, palette, cache, cursor, _gfxPorts, _audio); + _gfxPorts = new GfxPorts(segMan, _gfxScreen); + _gui = new SciGui(_gamestate, _gfxScreen, _gfxPalette, _gfxCache, _gfxCursor, _gfxPorts, _audio); #ifdef ENABLE_SCI32 _gui32 = 0; _gfxFrameout = 0; } #endif - _gfxPalette = palette; - _gfxScreen = screen; - _gfxCache = cache; - _gfxCursor = cursor; - - _gamestate->abortScriptProcessing = kAbortNone; + // Add the after market GM patches for the specified game, if they exist + _resMan->addNewGMPatch(getGameID()); if (game_init(_gamestate)) { /* Initialize */ warning("Game initialization failed: Aborting..."); @@ -227,17 +216,13 @@ Common::Error SciEngine::run() { return Common::kUnknownError; } - // Add the after market GM patches for the specified game, if they exist - _resMan->addNewGMPatch(getGameID()); - script_adjust_opcode_formats(_gamestate); - _kernel->loadKernelNames(getGameID()); SciVersion soundVersion = _features->detectDoSoundType(); _gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, soundVersion); - screen->debugUnditherSetState(ConfMan.getBool("undither")); + _gfxScreen->debugUnditherSetState(ConfMan.getBool("undither")); #ifdef USE_OLD_MUSIC_FUNCTIONS if (game_init_sound(_gamestate, 0, soundVersion)) { @@ -278,7 +263,7 @@ Common::Error SciEngine::run() { delete _gfxPorts; delete _gfxCache; delete _gfxPalette; - delete cursor; + delete _gfxCursor; delete _gfxScreen; delete _eventMan; delete segMan; -- cgit v1.2.3 From 0f2e6b0f856afdfb540b681a194d001d051029f5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 9 Jun 2010 13:27:59 +0000 Subject: SCI: fix multiple playing of the same sound in a row (without using looping) - thx to LordHoto for helping me finding this one out - fixes pharkas right at the start (hammering only played once) svn-id: r49538 --- engines/sci/sound/music.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index fa5716e7cc..254c70a24f 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -317,6 +317,8 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { pSnd->pLoopStream, -1, pSnd->volume, 0, DisposeAfterUse::NO); } else { + // Rewind in case we play the same sample multiple times (non-looped) like in pharkas right at the start + pSnd->pStreamAud->rewind(); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, pSnd->volume, 0, DisposeAfterUse::NO); -- cgit v1.2.3 From 5b2a60d0495c76c32e358e8a2dff6c82f7ddd710 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 9 Jun 2010 13:34:15 +0000 Subject: Rewind the underlying audio stream on LoopingAudioStream creation. Also mention in the documentation that both LoopingAudioStream and SubLoopingAudioStream do rewind the underlying in their constructor. svn-id: r49539 --- sound/audiostream.cpp | 6 ++++++ sound/audiostream.h | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index ce2c521e5e..a092e6c29d 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -95,6 +95,12 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse) : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops), _completeIterations(0) { + assert(stream); + + if (!stream->rewind()) { + // TODO: Properly indicate error + _loops = _completeIterations = 1; + } } LoopingAudioStream::~LoopingAudioStream() { diff --git a/sound/audiostream.h b/sound/audiostream.h index 37a1953bb9..edf517b003 100644 --- a/sound/audiostream.h +++ b/sound/audiostream.h @@ -109,6 +109,9 @@ public: /** * Creates a looping audio stream object. * + * Note that on creation of the LoopingAudioStream object + * the underlying stream will be rewound. + * * @see makeLoopingAudioStream * * @param stream Stream to loop @@ -232,6 +235,9 @@ public: /** * Constructor for a SubLoopingAudioStream. * + * Note that on creation of the LoopingAudioStream object + * the underlying stream will be rewound. + * * @param stream Stream to loop * @param loops How often the stream should be looped (0 means infinite) * @param loopStart Start of the loop (this must be smaller than loopEnd) -- cgit v1.2.3 From 015262a0ee77abcbd49d9ab40909daa77d303a81 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 14:06:16 +0000 Subject: Fixed compilation when the old sound code is used svn-id: r49540 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 255e2700ee..3ad4ed096e 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -864,7 +864,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->sfx_init_flags = s->sfx_init_flags; s->_sound._songlib.freeSounds(); s->_sound._songlib = temp; - s->_soundCmd->updateSfxState(&retval->_sound); + s->_soundCmd->updateSfxState(&s->_sound); #endif s->_segMan->reconstructStack(s); -- cgit v1.2.3 From f770156dccff6ed5f1211cbe7676652897582ee9 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Wed, 9 Jun 2010 14:15:51 +0000 Subject: PSP: fixed missing frame issue with kyrandia and possibly other games by calling updateScreen() from pollEvent() once in a while svn-id: r49541 --- backends/platform/psp/display_manager.cpp | 11 +++++---- backends/platform/psp/display_manager.h | 8 +++---- backends/platform/psp/osys_psp.cpp | 37 +++++++++++++++++++++++++++++-- backends/platform/psp/osys_psp.h | 6 +++-- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index c2f21e084b..5c9f8f92f0 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -311,25 +311,26 @@ void DisplayManager::calculateScaleParams() { } } -void DisplayManager::renderAll() { +// return true if we really rendered or no dirty. False otherwise +bool DisplayManager::renderAll() { DEBUG_ENTER_FUNC(); #ifdef USE_DISPLAY_CALLBACK if (!_masterGuRenderer.isRenderFinished()) { PSP_DEBUG_PRINT("Callback render not finished.\n"); - return; + return false; // didn't render } #endif /* USE_DISPLAY_CALLBACK */ if (!isTimeToUpdate()) - return; + return false; // didn't render if (!_screen->isDirty() && (!_overlay->isDirty()) && (!_cursor->isDirty()) && (!_keyboard->isDirty())) { PSP_DEBUG_PRINT("Nothing dirty\n"); - return; + return true; // nothing to render } PSP_DEBUG_PRINT("screen[%s], overlay[%s], cursor[%s], keyboard[%s]\n", @@ -361,6 +362,8 @@ void DisplayManager::renderAll() { _keyboard->setClean(); _masterGuRenderer.guPostRender(); + + return true; // rendered successfully } inline bool DisplayManager::isTimeToUpdate() { diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h index 5864f39b36..bceb85703d 100644 --- a/backends/platform/psp/display_manager.h +++ b/backends/platform/psp/display_manager.h @@ -40,12 +40,12 @@ public: void setupCallbackThread(); private: static uint32 _displayList[]; - uint32 _lastRenderTime; // For measuring rendering + uint32 _lastRenderTime; // For measuring rendering time void guProgramDisplayBufferSizes(); static int guCallbackThread(SceSize, void *); // for the graphics callbacks static int guCallback(int, int, void *__this); - bool _renderFinished; - int _callbackId; + bool _renderFinished; // for sync with render callback + int _callbackId; // to keep track of render callback }; class Screen; @@ -68,7 +68,7 @@ public: ~DisplayManager(); void init(); - void renderAll(); + bool renderAll(); // return true if rendered or nothing dirty. False otherwise bool setGraphicsMode(int mode); bool setGraphicsMode(const char *name); int getGraphicsMode() const { return _graphicsMode; } diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 2043a4bef2..48e9044535 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -127,11 +127,13 @@ int OSystem_PSP::getDefaultGraphicsMode() const { bool OSystem_PSP::setGraphicsMode(int mode) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _displayManager.setGraphicsMode(mode); } bool OSystem_PSP::setGraphicsMode(const char *name) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _displayManager.setGraphicsMode(name); } @@ -154,6 +156,7 @@ Common::List OSystem_PSP::getSupportedFormats() { void OSystem_PSP::initSize(uint width, uint height, const Graphics::PixelFormat *format) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _displayManager.setSizeAndPixelFormat(width, height, format); _cursor.setVisible(false); @@ -172,6 +175,7 @@ int16 OSystem_PSP::getHeight() { void OSystem_PSP::setPalette(const byte *colors, uint start, uint num) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.setPartialPalette(colors, start, num); _cursor.setScreenPalette(colors, start, num); _cursor.clearKeyColor(); @@ -179,6 +183,7 @@ void OSystem_PSP::setPalette(const byte *colors, uint start, uint num) { void OSystem_PSP::setCursorPalette(const byte *colors, uint start, uint num) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.setCursorPalette(colors, start, num); _cursor.enableCursorPalette(true); _cursor.clearKeyColor(); // Do we need this? @@ -186,37 +191,43 @@ void OSystem_PSP::setCursorPalette(const byte *colors, uint start, uint num) { void OSystem_PSP::disableCursorPalette(bool disable) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.enableCursorPalette(!disable); } void OSystem_PSP::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.copyFromRect(buf, pitch, x, y, w, h); } Graphics::Surface *OSystem_PSP::lockScreen() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _screen.lockAndGetForEditing(); } void OSystem_PSP::unlockScreen() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; // The screen is always completely updated anyway, so we don't have to force a full update here. _screen.unlock(); } void OSystem_PSP::updateScreen() { DEBUG_ENTER_FUNC(); - _displayManager.renderAll(); + _pendingUpdate = !_displayManager.renderAll(); // if we didn't update, we have a pending update } void OSystem_PSP::setShakePos(int shakeOffset) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.setShakePos(shakeOffset); } void OSystem_PSP::showOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.setVisible(true); _cursor.setLimits(_overlay.getWidth(), _overlay.getHeight()); _cursor.useGlobalScaler(false); // mouse with overlay is 1:1 @@ -224,6 +235,7 @@ void OSystem_PSP::showOverlay() { void OSystem_PSP::hideOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.setVisible(false); _cursor.setLimits(_screen.getWidth(), _screen.getHeight()); _cursor.useGlobalScaler(true); // mouse needs to be scaled with screen @@ -231,6 +243,7 @@ void OSystem_PSP::hideOverlay() { void OSystem_PSP::clearOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.clearBuffer(); } @@ -241,6 +254,7 @@ void OSystem_PSP::grabOverlay(OverlayColor *buf, int pitch) { void OSystem_PSP::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.copyFromRect(buf, pitch, x, y, w, h); } @@ -259,6 +273,8 @@ void OSystem_PSP::grabPalette(byte *colors, uint start, uint num) { bool OSystem_PSP::showMouse(bool v) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; + PSP_DEBUG_PRINT("%s\n", v ? "true" : "false"); bool last = _cursor.isVisible(); _cursor.setVisible(v); @@ -268,11 +284,14 @@ bool OSystem_PSP::showMouse(bool v) { void OSystem_PSP::warpMouse(int x, int y) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.setXY(x, y); } void OSystem_PSP::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; + PSP_DEBUG_PRINT("pbuf[%p], w[%u], h[%u], hotspot:X[%d], Y[%d], keycolor[%d], scale[%d], pformat[%p]\n", buf, w, h, hotspotX, hotspotY, keycolor, cursorTargetScale, format); if (format) { PSP_DEBUG_PRINT("format: bpp[%d], rLoss[%d], gLoss[%d], bLoss[%d], aLoss[%d], rShift[%d], gShift[%d], bShift[%d], aShift[%d]\n", format->bytesPerPixel, format->rLoss, format->gLoss, format->bLoss, format->aLoss, format->rShift, format->gShift, format->bShift, format->aShift); @@ -292,9 +311,23 @@ bool OSystem_PSP::pollEvent(Common::Event &event) { // Pausing the engine is a necessary fix for games that use the timer for music synchronization // recovering many hours later causes the game to crash. We're polling without mutexes since it's not critical to // get it right now. - PowerMan.pollPauseEngine(); + // A hack: + // Check if we have a pending update that we missed for some reason (FPS throttling for example) + // Time between event polls is usually 5-10ms, so waiting for 4 calls before checking to update the screen should be fine + if (_pendingUpdate) { + _pendingUpdateCounter++; + + if (_pendingUpdateCounter >= 4) { + PSP_DEBUG_PRINT("servicing pending update\n"); + updateScreen(); + if (!_pendingUpdate) // we handled the update + _pendingUpdateCounter = 0; + } + } else + _pendingUpdateCounter = 0; // reset the counter, no pending + return _inputHandler.getAllInputs(event); } diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index a6c84ba39a..d8ec8fe824 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -50,6 +50,8 @@ private: Common::SaveFileManager *_savefile; Audio::MixerImpl *_mixer; Common::TimerManager *_timer; + bool _pendingUpdate; // save an update we couldn't perform + uint32 _pendingUpdateCounter; // prevent checking for pending update too often, in a cheap way // All needed sub-members Screen _screen; @@ -62,10 +64,10 @@ private: PspTimer _pspTimer; PspRtc _pspRtc; - void initSDL(); + void initSDL(); public: - OSystem_PSP() : _savefile(0), _mixer(0), _timer(0) {} + OSystem_PSP() : _savefile(0), _mixer(0), _timer(0), _pendingUpdate(false), _pendingUpdateCounter(0) {} ~OSystem_PSP(); static OSystem *instance(); -- cgit v1.2.3 From 32d7f7ddb09c908104dc83217aa08f6083189d17 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 14:16:00 +0000 Subject: Disabled the mouse warping code, as it can be annoying in windowed mode svn-id: r49542 --- engines/sci/graphics/cursor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 8cc99c787c..14ab3fcdaf 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -258,12 +258,16 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu } void GfxCursor::setPosition(Common::Point pos) { + // This code has been disabled because it's annoying in windowed mode. The engine shouldn't move + // the mouse cursor whenever it wants, it interferes with other programs +#if 0 if (!_upscaledHires) { g_system->warpMouse(pos.x, pos.y); } else { _screen->adjustToUpscaledCoordinates(pos.y, pos.x); g_system->warpMouse(pos.x, pos.y); } +#endif } Common::Point GfxCursor::getPosition() { @@ -289,6 +293,9 @@ Common::Point GfxCursor::getPosition() { } void GfxCursor::refreshPosition() { + // This code has been disabled because it's annoying in windowed mode. The engine shouldn't move + // the mouse cursor whenever it wants, it interferes with other programs +#if 0 bool clipped = false; Common::Point mousePoint = getPosition(); @@ -311,6 +318,7 @@ void GfxCursor::refreshPosition() { // FIXME: Do this only when mouse is grabbed? if (clipped) setPosition(mousePoint); +#endif } void GfxCursor::kernelSetMoveZone(Common::Rect zone) { -- cgit v1.2.3 From 3c9ab81a0764298baf1b604914a7c2e3f33f6b1a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 15:21:10 +0000 Subject: Fixed regression from commit #49537 svn-id: r49543 --- engines/sci/engine/kernel.cpp | 1 - engines/sci/engine/kernel.h | 2 +- engines/sci/sci.cpp | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 995ecc72a4..4d0e981f31 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -392,7 +392,6 @@ SciKernelFunction kfunct_mappers[] = { }; Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { - loadKernelNames(); loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index b79ba8caaa..2f1c867474 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -207,7 +207,6 @@ public: */ Common::String lookupText(reg_t address, int index); -private: /** * Loads the kernel function names. * @@ -218,6 +217,7 @@ private: */ void loadKernelNames(); +private: /** * Sets the default kernel function names, based on the SCI version used */ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 22c93c1de0..8f5cfbba65 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -217,6 +217,7 @@ Common::Error SciEngine::run() { } script_adjust_opcode_formats(_gamestate); + _kernel->loadKernelNames(); SciVersion soundVersion = _features->detectDoSoundType(); -- cgit v1.2.3 From a542ce174b68e32a9266c8efaea7be877b74fccc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 15:28:14 +0000 Subject: Proper fix for kernel name loading (regression from commit #49537) svn-id: r49544 --- engines/sci/engine/kernel.cpp | 1 + engines/sci/engine/kernel.h | 2 +- engines/sci/sci.cpp | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 4d0e981f31..93af161219 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -394,6 +394,7 @@ SciKernelFunction kfunct_mappers[] = { Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use + loadKernelNames(); // must be called after the selectors are set } Kernel::~Kernel() { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 2f1c867474..b79ba8caaa 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -207,6 +207,7 @@ public: */ Common::String lookupText(reg_t address, int index); +private: /** * Loads the kernel function names. * @@ -217,7 +218,6 @@ public: */ void loadKernelNames(); -private: /** * Sets the default kernel function names, based on the SCI version used */ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 8f5cfbba65..22c93c1de0 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -217,7 +217,6 @@ Common::Error SciEngine::run() { } script_adjust_opcode_formats(_gamestate); - _kernel->loadKernelNames(); SciVersion soundVersion = _features->detectDoSoundType(); -- cgit v1.2.3 From d191c9d0f935d280d7c1a7e71e3e13bbb76ee893 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 17:04:03 +0000 Subject: Limit kPortrait to be used in the Windows version of KQ6 only svn-id: r49545 --- engines/sci/engine/kernel.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 93af161219..08aa65aa6d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -728,14 +728,14 @@ void Kernel::setDefaultKernelNames() { break; case SCI_VERSION_1_1: - // In KQ6 CD, the empty kSetSynonyms function has been replaced - // with kPortrait. In KQ6 Mac, kPlayBack has been replaced by - // kShowMovie. + // In the Windows version of KQ6 CD, the empty kSetSynonyms + // function has been replaced with kPortrait. In KQ6 Mac, + // kPlayBack has been replaced by kShowMovie. if (!strcmp(g_sci->getGameID(), "kq6")) { - if (g_sci->getPlatform() == Common::kPlatformMacintosh) - _kernelNames[0x84] = "ShowMovie"; - else + if (g_sci->getPlatform() == Common::kPlatformWindows) _kernelNames[0x26] = "Portrait"; + else if (g_sci->getPlatform() == Common::kPlatformMacintosh) + _kernelNames[0x84] = "ShowMovie"; } _kernelNames[0x71] = "PalVary"; -- cgit v1.2.3 From c486b77bb7d96908d7df1e00b6a61b92fbd176ee Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 18:42:21 +0000 Subject: Fixed crash in SCI2.1 games svn-id: r49546 --- engines/sci/engine/kernel.cpp | 5 ++--- engines/sci/engine/kernel.h | 6 +++--- engines/sci/engine/kernel32.cpp | 4 ++-- engines/sci/sci.cpp | 14 ++++++++------ 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 08aa65aa6d..2315dc384f 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -394,7 +394,6 @@ SciKernelFunction kfunct_mappers[] = { Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use - loadKernelNames(); // must be called after the selectors are set } Kernel::~Kernel() { @@ -748,12 +747,12 @@ void Kernel::setDefaultKernelNames() { } } -void Kernel::loadKernelNames() { +void Kernel::loadKernelNames(GameFeatures *features) { _kernelNames.clear(); #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2_1) - setKernelNamesSci21(); + setKernelNamesSci21(features); else if (getSciVersion() == SCI_VERSION_2) setKernelNamesSci2(); else diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index b79ba8caaa..990e2aff17 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -207,7 +207,6 @@ public: */ Common::String lookupText(reg_t address, int index); -private: /** * Loads the kernel function names. * @@ -216,8 +215,9 @@ private: * The resulting list has the same format regardless of the format of the * name table of the resource (the format changed between version 0 and 1). */ - void loadKernelNames(); + void loadKernelNames(GameFeatures *features); +private: /** * Sets the default kernel function names, based on the SCI version used */ @@ -232,7 +232,7 @@ private: /** * Sets the default kernel function names to the SCI2.1 kernel functions */ - void setKernelNamesSci21(); + void setKernelNamesSci21(GameFeatures *features); #endif /** diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 0afdc3f2eb..f279d9a66f 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -378,7 +378,7 @@ void Kernel::setKernelNamesSci2() { _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesSci2); } -void Kernel::setKernelNamesSci21() { +void Kernel::setKernelNamesSci21(GameFeatures *features) { // Some SCI games use a modified SCI2 kernel table instead of the SCI2.1/SCI3 kernel table. // The GK2 demo does this as well as at least one version of KQ7. We detect which version // to use based on where kDoSound is called from Sound::play(). @@ -386,7 +386,7 @@ void Kernel::setKernelNamesSci21() { // This is interesting because they all have the same interpreter version (2.100.002), yet // they would not be compatible with other games of the same interpreter. - if (g_sci->_features->detectSci21KernelType() == SCI_VERSION_2) { + if (features->detectSci21KernelType() == SCI_VERSION_2) { _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); // OnMe is IsOnMe here, but they should be compatible _kernelNames[0x23] = "Robot"; // Graph in SCI2 diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 22c93c1de0..1d0bbadd63 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -141,6 +141,9 @@ Common::Error SciEngine::run() { return Common::kNoGameDataFoundError; } + // Add the after market GM patches for the specified game, if they exist + _resMan->addNewGMPatch(getGameID()); + SegManager *segMan = new SegManager(_resMan); // Scale the screen, if needed @@ -170,6 +173,8 @@ Common::Error SciEngine::run() { else _gfxScreen = new GfxScreen(_resMan, 320, 200, upscaledHires); + _gfxScreen->debugUnditherSetState(ConfMan.getBool("undither")); + if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) _gfxMacIconBar = new GfxMacIconBar(); @@ -181,10 +186,10 @@ Common::Error SciEngine::run() { _console = new Console(this); _kernel = new Kernel(_resMan, segMan); + _features = new GameFeatures(segMan, _kernel); // Only SCI0 and SCI01 games used a parser _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan) : NULL; _audio = new AudioPlayer(_resMan); - _features = new GameFeatures(segMan, _kernel); _gamestate = new EngineState(segMan); _eventMan = new EventManager(_resMan); @@ -207,14 +212,13 @@ Common::Error SciEngine::run() { } #endif - // Add the after market GM patches for the specified game, if they exist - _resMan->addNewGMPatch(getGameID()); - if (game_init(_gamestate)) { /* Initialize */ warning("Game initialization failed: Aborting..."); // TODO: Add an "init failed" error? return Common::kUnknownError; } + + _kernel->loadKernelNames(_features); // Must be called after game_init() script_adjust_opcode_formats(_gamestate); @@ -222,8 +226,6 @@ Common::Error SciEngine::run() { _gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, soundVersion); - _gfxScreen->debugUnditherSetState(ConfMan.getBool("undither")); - #ifdef USE_OLD_MUSIC_FUNCTIONS if (game_init_sound(_gamestate, 0, soundVersion)) { warning("Game initialization failed: Error in sound subsystem. Aborting..."); -- cgit v1.2.3 From 5d71ae952f47084da758cb5d2df0e53a6c663111 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 20:12:25 +0000 Subject: The EngineState is no longer recreated when a game is restored, thus we don't need to refresh pointers to it svn-id: r49549 --- engines/sci/engine/savegame.cpp | 1 - engines/sci/graphics/animate.h | 3 --- engines/sci/graphics/gui.cpp | 5 ----- engines/sci/graphics/gui.h | 3 --- 4 files changed, 12 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 3ad4ed096e..224115f95f 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -895,7 +895,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { g_sci->_gui32->init(); } else { #endif - g_sci->_gui->resetEngineState(s); g_sci->_gui->init(g_sci->_features->usesOldGfxFunctions()); #ifdef ENABLE_SCI32 } diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h index 706b7182cf..324ca0d700 100644 --- a/engines/sci/graphics/animate.h +++ b/engines/sci/graphics/animate.h @@ -90,9 +90,6 @@ public: GfxAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, GfxScreen *screen, GfxPalette *palette, GfxCursor *cursor, GfxTransitions *transitions); virtual ~GfxAnimate(); - // FIXME: Don't store EngineState - void resetEngineState(EngineState *newState) { _s = newState; } - void disposeLastCast(); bool invoke(List *list, int argc, reg_t *argv); void makeSortedList(List *list); diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index df9227b87f..63ac6c0a05 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -86,11 +86,6 @@ SciGui::~SciGui() { delete _coordAdjuster; } -void SciGui::resetEngineState(EngineState *s) { - _s = s; - _animate->resetEngineState(s); -} - void SciGui::init(bool usesOldGfxFunctions) { _ports->init(usesOldGfxFunctions, this, _paint16, _text16); _paint16->init(_animate, _text16); diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h index 7663036117..8e4abdf5b7 100644 --- a/engines/sci/graphics/gui.h +++ b/engines/sci/graphics/gui.h @@ -61,9 +61,6 @@ public: virtual void portraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); virtual void portraitUnload(uint16 portraitId); - // FIXME: Don't store EngineState - virtual void resetEngineState(EngineState *s); - protected: GfxCursor *_cursor; EngineState *_s; -- cgit v1.2.3 From e533289e07f9bbbc195d91619582df6eca39ec2a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 9 Jun 2010 20:32:55 +0000 Subject: SCI: document raw lipsync data skipping in readAudioMapSCI11() svn-id: r49550 --- engines/sci/resource_audio.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 57efbdcb38..2a5b56d4bc 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -334,6 +334,8 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { } if (n & 0x40) { + // This seems to define the size of raw lipsync data (at least in kq6), may also just be general appended + // data syncSize += READ_LE_UINT16(ptr); ptr += 2; } -- cgit v1.2.3 From d8050029f9940ec7abe0a3868f17e55319bad9c3 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Wed, 9 Jun 2010 21:30:06 +0000 Subject: Improve build instructions to include themeengine patch and scummmodern.zip compression. svn-id: r49551 --- backends/platform/android/README.build | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backends/platform/android/README.build b/backends/platform/android/README.build index fa56bfc180..a834f8431b 100644 --- a/backends/platform/android/README.build +++ b/backends/platform/android/README.build @@ -63,6 +63,18 @@ toolchains around. Building ScummVM ================ +Apply the theme engine patch: + + patch -p1 < backends/platform/android/scummvm-android-themeengine.patch + +(Optionally) compress scummmodern.zip: +(ScummVM usually ships it uncompressed, but Android can read it more +efficiently if it is compressed *before* adding it to the apk) + + ( cd gui/themes/scummmodern && zip -f ../scummmodern.zip ) + +Then build ScummVM: + export ANDROID_SDK= PATH=$ANDROID_SDK/platforms/android-1.6/tools:$ANDROID_SDK/tools:$PATH -- cgit v1.2.3 From d44efa817fd997f336ac83f0490212fb21e9bf02 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Wed, 9 Jun 2010 21:31:48 +0000 Subject: Fix dirty tracking in paletted textures. svn-id: r49552 --- backends/platform/android/video.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backends/platform/android/video.cpp b/backends/platform/android/video.cpp index 09d4dba154..5d16410cea 100644 --- a/backends/platform/android/video.cpp +++ b/backends/platform/android/video.cpp @@ -178,23 +178,22 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, ENTER("updateBuffer(%u, %u, %u, %u, %p, %d)", x, y, w, h, buf, pitch); glBindTexture(GL_TEXTURE_2D, _texture_name); + setDirtyRect(Common::Rect(x, y, x+w, y+h)); + if (static_cast(w) * bytesPerPixel() == pitch) { glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, glFormat(), glType(), buf); } else { // GLES removed the ability to specify pitch, so we // have to do this row by row. - int i = h; const byte* src = static_cast(buf); do { glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, 1, glFormat(), glType(), src); ++y; src += pitch; - } while (--i); + } while (--h); } - - setDirtyRect(Common::Rect(x, y, x+w, y+h)); } void GLESTexture::fillBuffer(byte x) { @@ -297,6 +296,8 @@ void GLESPaletteTexture::fillBuffer(byte x) { void GLESPaletteTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, const void* buf, int pitch) { + _all_dirty = true; + const byte* src = static_cast(buf); byte* dst = static_cast(_surface.getBasePtr(x, y)); do { -- cgit v1.2.3 From 14437e6394172dcabd0f5255b724c38f5b862332 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 9 Jun 2010 21:41:20 +0000 Subject: The segment manager is now initialized before the graphics subsystem. Fixes the detection of the fastCast object on startup, and hence fixes LSL1VGA svn-id: r49553 --- engines/sci/engine/game.cpp | 7 +++---- engines/sci/sci.cpp | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 704fe877c7..04f8501027 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -74,6 +74,9 @@ int game_init(EngineState *s) { s->initGlobals(); + if (s->abortScriptProcessing == kAbortRestartGame && g_sci->_gfxMenu) + g_sci->_gfxMenu->reset(); + s->_segMan->initSysStrings(); s->r_acc = s->r_prev = NULL_REG; @@ -101,10 +104,6 @@ int game_init(EngineState *s) { voc->parser_base = make_reg(s->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); } - // Initialize menu TODO: Actually this should be another init() - if (g_sci->_gfxMenu) - g_sci->_gfxMenu->reset(); - s->game_start_time = g_system->getMillis(); s->last_wait_time = s->game_start_time; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 1d0bbadd63..d5cab1adc9 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -44,6 +44,7 @@ #include "sci/sound/soundcmd.h" #include "sci/graphics/gui.h" #include "sci/graphics/maciconbar.h" +#include "sci/graphics/menu.h" #include "sci/graphics/ports.h" #include "sci/graphics/palette.h" #include "sci/graphics/cursor.h" @@ -193,6 +194,15 @@ Common::Error SciEngine::run() { _gamestate = new EngineState(segMan); _eventMan = new EventManager(_resMan); + // The game needs to be initialized before the graphics system is initialized, as + // the graphics code checks parts of the seg manager upon initialization (e.g. for + // the presence of the fastCast object) + if (game_init(_gamestate)) { /* Initialize */ + warning("Game initialization failed: Aborting..."); + // TODO: Add an "init failed" error? + return Common::kUnknownError; + } + #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2) { _gfxAnimate = 0; @@ -209,15 +219,11 @@ Common::Error SciEngine::run() { #ifdef ENABLE_SCI32 _gui32 = 0; _gfxFrameout = 0; - } -#endif - if (game_init(_gamestate)) { /* Initialize */ - warning("Game initialization failed: Aborting..."); - // TODO: Add an "init failed" error? - return Common::kUnknownError; + g_sci->_gfxMenu->reset(); } - +#endif + _kernel->loadKernelNames(_features); // Must be called after game_init() script_adjust_opcode_formats(_gamestate); -- cgit v1.2.3 From ede57eb61b541c9487d2068f01fb28be2e984f5f Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 10 Jun 2010 04:29:34 +0000 Subject: Removed some unnecessary whitespace. (Or should I have saved that for the rapidly approaching, much coveted r50000? :-) svn-id: r49558 --- engines/agos/vga_e2.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/agos/vga_e2.cpp b/engines/agos/vga_e2.cpp index 1bbc7f4849..54ec45b967 100644 --- a/engines/agos/vga_e2.cpp +++ b/engines/agos/vga_e2.cpp @@ -265,7 +265,7 @@ void AGOSEngine::vc53_dissolveIn() { *dst &= color; *dst |= *src & 0xF; - _system->unlockScreen(); + _system->unlockScreen(); dissolveCount--; if (!dissolveCount) { @@ -319,7 +319,7 @@ void AGOSEngine::vc54_dissolveOut() { dst += xoffs; *dst = color; - _system->unlockScreen(); + _system->unlockScreen(); dissolveCount--; if (!dissolveCount) { @@ -388,7 +388,7 @@ void AGOSEngine::vc56_fullScreen() { src += 320; dst += screen->pitch; } - _system->unlockScreen(); + _system->unlockScreen(); fullFade(); } -- cgit v1.2.3 From 9b8e4e8359083ba322c19701579762104b7a6826 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 07:32:05 +0000 Subject: Moved all of the game init/run/exit logic inside the SciEngine class svn-id: r49559 --- engines/sci/detection.cpp | 7 +- engines/sci/engine/game.cpp | 151 -------------------------------------------- engines/sci/engine/vm.cpp | 51 --------------- engines/sci/engine/vm.h | 59 ----------------- engines/sci/module.mk | 1 - engines/sci/sci.cpp | 132 +++++++++++++++++++++++++++++++++++++- engines/sci/sci.h | 41 ++++++++++++ 7 files changed, 177 insertions(+), 265 deletions(-) delete mode 100644 engines/sci/engine/game.cpp diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 1ccfc6bf02..f36bae2d6d 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -36,7 +36,6 @@ #include "sci/engine/script.h" #include "sci/engine/seg_manager.h" #include "sci/engine/state.h" -#include "sci/engine/vm.h" // for convertSierraGameId namespace Sci { @@ -198,6 +197,12 @@ static const OldNewIdTableEntry s_oldNewTable[] = { { "", "", SCI_VERSION_NONE } }; +/** + * Converts the builtin Sierra game IDs to the ones we use in ScummVM + * @param[in] gameId The internal game ID + * @param[in] gameFlags The game's flags, which are adjusted accordingly for demos + * @return The equivalent ScummVM game id + */ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, ResourceManager *resMan) { // Convert the id to lower case, so that we match all upper/lower case variants. sierraId.toLowercase(); diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp deleted file mode 100644 index 04f8501027..0000000000 --- a/engines/sci/engine/game.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/system.h" -#include "common/file.h" - -#include "engines/advancedDetector.h" // for ADGF_DEMO - -#include "sci/sci.h" -#include "sci/resource.h" -#include "sci/engine/features.h" -#include "sci/engine/state.h" -#include "sci/engine/kernel.h" -#include "sci/engine/message.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/menu.h" -#include "sci/sound/audio.h" -#include "sci/sound/music.h" - -namespace Sci { - -#ifdef USE_OLD_MUSIC_FUNCTIONS -int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion) { - if (getSciVersion() > SCI_VERSION_0_LATE) - sound_flags |= SFX_STATE_FLAG_MULTIPLAY; - - s->sfx_init_flags = sound_flags; - s->_sound.sfx_init(g_sci->getResMan(), sound_flags, soundVersion); - - return 0; -} -#endif - -/*************************************************************/ -/* Game instance stuff: Init/Unitialize state-dependant data */ -/*************************************************************/ - -int game_init(EngineState *s) { - // FIXME Use new VM instantiation code all over the place - // Script 0 needs to be allocated here before anything else! - int script0Segment = s->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK); - DataStack *stack = s->_segMan->allocateStack(VM_STACK_SIZE, NULL); - - s->_msgState = new MessageState(s->_segMan); - s->gc_countdown = GC_INTERVAL - 1; - - // Script 0 should always be at segment 1 - if (script0Segment != 1) { - debug(2, "Failed to instantiate script.000"); - return 1; - } - - s->initGlobals(); - - if (s->abortScriptProcessing == kAbortRestartGame && g_sci->_gfxMenu) - g_sci->_gfxMenu->reset(); - - s->_segMan->initSysStrings(); - - s->r_acc = s->r_prev = NULL_REG; - - s->_executionStack.clear(); // Start without any execution stack - s->execution_stack_base = -1; // No vm is running yet - s->_executionStackPosChanged = false; - - s->abortScriptProcessing = kAbortNone; - s->gameWasRestarted = false; - - s->stack_base = stack->_entries; - s->stack_top = stack->_entries + stack->_capacity; - - if (!script_instantiate(g_sci->getResMan(), s->_segMan, 0)) { - warning("game_init(): Could not instantiate script 0"); - return 1; - } - - // Reset parser - Vocabulary *voc = g_sci->getVocabulary(); - if (voc) { - voc->parserIsValid = false; // Invalidate parser - voc->parser_event = NULL_REG; // Invalidate parser event - voc->parser_base = make_reg(s->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); - } - - s->game_start_time = g_system->getMillis(); - s->last_wait_time = s->game_start_time; - - srand(g_system->getMillis()); // Initialize random number generator - - s->_gameObj = g_sci->getResMan()->findGameObject(); - -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (s->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) - game_init_sound(s, 0, g_sci->_features->detectDoSoundType()); -#endif - - // Load game language into printLang property of game object - // FIXME: It's evil to achieve this as a side effect of a getter. - // Much better to have an explicit init method for this. - g_sci->getSciLanguage(); - - return 0; -} - -int game_exit(EngineState *s) { - if (s->abortScriptProcessing != kAbortLoadGame) { - s->_executionStack.clear(); -#ifdef USE_OLD_MUSIC_FUNCTIONS - s->_sound.sfx_exit(); - // Reinit because some other code depends on having a valid state - game_init_sound(s, SFX_STATE_FLAG_NOSOUND, g_sci->_features->detectDoSoundType()); -#else - g_sci->_audio->stopAllAudio(); - s->_soundCmd->clearPlayList(); -#endif - } - - // TODO Free parser segment here - - // TODO Free scripts here - - // Close all opened file handles - s->_fileHandles.clear(); - s->_fileHandles.resize(5); - - return 0; -} - -} // End of namespace Sci diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index eb2824d9c7..2c92bdadc3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1664,57 +1664,6 @@ void run_vm(EngineState *s, bool restoring) { } } -static void _init_stack_base_with_selector(EngineState *s, Selector selector) { - s->stack_base[0] = make_reg(0, (uint16)selector); - s->stack_base[1] = NULL_REG; -} - -void game_run(EngineState **_s) { - EngineState *s = *_s; - - debugC(2, kDebugLevelVM, "Calling %s::play()", g_sci->getGameID()); - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.play); // Call the play selector - - // Now: Register the first element on the execution stack - if (!send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base)) { - g_sci->getSciDebugger()->printObject(s->_gameObj); - error("Failed to run the game! Aborting..."); - return; - } - - // and ENGAGE! - - // Attach the debug console on game startup, if requested - if (DebugMan.isDebugChannelEnabled(kDebugLevelOnStartup)) - g_sci->getSciDebugger()->attach(); - - do { - s->_executionStackPosChanged = false; - run_vm(s, (s->abortScriptProcessing == kAbortLoadGame)); - game_exit(s); - - if (s->abortScriptProcessing == kAbortRestartGame) { - s->_segMan->resetSegMan(); - game_init(s); -#ifdef USE_OLD_MUSIC_FUNCTIONS - s->_sound.sfx_reset_player(); -#endif - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.play); - send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - s->gameWasRestarted = true; - } else if (s->abortScriptProcessing == kAbortLoadGame) { - s->abortScriptProcessing = kAbortNone; - // Insert a replay selector - _init_stack_base_with_selector(s, g_sci->getKernel()->_selectorCache.replay); - send_selector(s, s->_gameObj, s->_gameObj, s->stack_base, 2, s->stack_base); - } else { - break; // exit loop - } - } while (true); - - debugC(2, kDebugLevelVM, "Game::play() finished."); -} - reg_t *ObjVarRef::getPointer(SegManager *segMan) const { Object *o = segMan->getObject(obj); return o ? &o->getVariableRef(varindex) : 0; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 1764284dae..fa57a1151c 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -329,65 +329,6 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_n */ void script_uninstantiate(SegManager *segMan, int script_nr); -/** - * Converts the builtin Sierra game IDs to the ones we use in ScummVM - * @param[in] gameId The internal game ID - * @param[in] gameFlags The game's flags, which are adjusted accordingly for demos - * @return The equivalent ScummVM game id - */ -Common::String convertSierraGameId(const char *gameId, uint32 *gameFlags, ResourceManager *resMan); - -/** - * Initializes an SCI game - * This function must be run before script_run() is executed. Graphics data - * is initialized iff s->gfx_state != NULL. - * @param[in] s The state to operate on - * @return 0 on success, 1 if an error occured. - */ -int game_init(EngineState *s); - -#ifdef USE_OLD_MUSIC_FUNCTIONS -/** - * Initializes the sound part of an SCI game - * This function may only be called if game_init() did not initialize - * the sound data. - * @param[in] s The state to initialize the sound in - * @param[in] sound_flags Flags to pass to the sound subsystem - * @param[in] soundVersion sound-version that got detected during game init - * @return 0 on success, 1 if an error occured - */ -int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion); -#endif - -/** - * Runs an SCI game - * This is the main function for SCI games. It takes a valid state, loads - * script 0 to it, finds the game object, allocates a stack, and runs the - * init method of the game object. In layman's terms, this runs an SCI game. - * Note that, EngineState *s may be changed during the game, e.g. if a game - * state is restored. - * @param[in] s Pointer to the pointer of the state to operate on - */ -void game_run(EngineState **s); - -/** - * Restores an SCI game state and runs the game - * This restores a savegame; otherwise, it behaves just like game_run(). - * @param[in] s Pointer to the pointer of the state to - * operate on - * @param[in] savegame_name Name of the savegame to restore - * @return 0 on success, 1 if an error occured. - */ -int game_restore(EngineState **s, char *savegame_name); - -/** - * Uninitializes an initialized SCI game - * This function should be run after each script_run() call. - * @param[in] s The state to operate on - * @return 0 on success, 1 if an error occured. - */ -int game_exit(EngineState *s); - /** * Read a PMachine instruction from a memory buffer and return its length. * diff --git a/engines/sci/module.mk b/engines/sci/module.mk index a2cfd38f95..4860ac7c2f 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -10,7 +10,6 @@ MODULE_OBJS := \ sci.o \ util.o \ engine/features.o \ - engine/game.o \ engine/gc.o \ engine/kernel.o \ engine/kevent.o \ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index d5cab1adc9..08236597b4 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -36,6 +36,7 @@ #include "sci/event.h" #include "sci/engine/features.h" +#include "sci/engine/message.h" #include "sci/engine/state.h" #include "sci/engine/kernel.h" #include "sci/engine/script.h" // for script_adjust_opcode_formats @@ -197,7 +198,7 @@ Common::Error SciEngine::run() { // The game needs to be initialized before the graphics system is initialized, as // the graphics code checks parts of the seg manager upon initialization (e.g. for // the presence of the fastCast object) - if (game_init(_gamestate)) { /* Initialize */ + if (!initGame()) { /* Initialize */ warning("Game initialization failed: Aborting..."); // TODO: Add an "init failed" error? return Common::kUnknownError; @@ -259,7 +260,7 @@ Common::Error SciEngine::run() { _gamestate->loadFromLauncher = -1; } - game_run(&_gamestate); // Run the game + runGame(); ConfMan.flushToDisk(); @@ -280,6 +281,133 @@ Common::Error SciEngine::run() { return Common::kNoError; } +bool SciEngine::initGame() { + // Script 0 needs to be allocated here before anything else! + int script0Segment = _gamestate->_segMan->getScriptSegment(0, SCRIPT_GET_LOCK); + DataStack *stack = _gamestate->_segMan->allocateStack(VM_STACK_SIZE, NULL); + + _gamestate->_msgState = new MessageState(_gamestate->_segMan); + _gamestate->gc_countdown = GC_INTERVAL - 1; + + // Script 0 should always be at segment 1 + if (script0Segment != 1) { + debug(2, "Failed to instantiate script.000"); + return false; + } + + _gamestate->initGlobals(); + + if (_gamestate->abortScriptProcessing == kAbortRestartGame && _gfxMenu) + _gfxMenu->reset(); + + _gamestate->_segMan->initSysStrings(); + + _gamestate->r_acc = _gamestate->r_prev = NULL_REG; + + _gamestate->_executionStack.clear(); // Start without any execution stack + _gamestate->execution_stack_base = -1; // No vm is running yet + _gamestate->_executionStackPosChanged = false; + + _gamestate->abortScriptProcessing = kAbortNone; + _gamestate->gameWasRestarted = false; + + _gamestate->stack_base = stack->_entries; + _gamestate->stack_top = stack->_entries + stack->_capacity; + + if (!script_instantiate(_resMan, _gamestate->_segMan, 0)) { + warning("initGame(): Could not instantiate script 0"); + return false; + } + + // Reset parser + if (_vocabulary) { + _vocabulary->parserIsValid = false; // Invalidate parser + _vocabulary->parser_event = NULL_REG; // Invalidate parser event + _vocabulary->parser_base = make_reg(_gamestate->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); + } + + _gamestate->game_start_time = _gamestate->last_wait_time = g_system->getMillis(); + + srand(g_system->getMillis()); // Initialize random number generator + + _gamestate->_gameObj = _resMan->findGameObject(); + +#ifdef USE_OLD_MUSIC_FUNCTIONS + if (_gamestate->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) + game_init_sound(_gamestate, 0, _features->detectDoSoundType()); +#endif + + // Load game language into printLang property of game object + // FIXME: It's evil to achieve this as a side effect of a getter. + // Much better to have an explicit init method for this. + getSciLanguage(); + + return true; +} + +void SciEngine::initStackBaseWithSelector(Selector selector) { + _gamestate->stack_base[0] = make_reg(0, (uint16)selector); + _gamestate->stack_base[1] = NULL_REG; + + // Register the first element on the execution stack + if (!send_selector(_gamestate, _gamestate->_gameObj, _gamestate->_gameObj, _gamestate->stack_base, 2, _gamestate->stack_base)) { + _console->printObject(_gamestate->_gameObj); + error("initStackBaseWithSelector: error while registering the first selector in the call stack"); + } + +} + +void SciEngine::runGame() { + initStackBaseWithSelector(_kernel->_selectorCache.play); // Call the play selector + + // Attach the debug console on game startup, if requested + if (DebugMan.isDebugChannelEnabled(kDebugLevelOnStartup)) + _console->attach(); + + do { + _gamestate->_executionStackPosChanged = false; + run_vm(_gamestate, (_gamestate->abortScriptProcessing == kAbortLoadGame)); + exitGame(); + + if (_gamestate->abortScriptProcessing == kAbortRestartGame) { + _gamestate->_segMan->resetSegMan(); + initGame(); +#ifdef USE_OLD_MUSIC_FUNCTIONS + _gamestate->_sound.sfx_reset_player(); +#endif + initStackBaseWithSelector(_kernel->_selectorCache.play); + _gamestate->gameWasRestarted = true; + } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { + _gamestate->abortScriptProcessing = kAbortNone; + initStackBaseWithSelector(_kernel->_selectorCache.replay); + } else { + break; // exit loop + } + } while (true); +} + +void SciEngine::exitGame() { + if (_gamestate->abortScriptProcessing != kAbortLoadGame) { + _gamestate->_executionStack.clear(); +#ifdef USE_OLD_MUSIC_FUNCTIONS + _gamestate->_sound.sfx_exit(); + // Reinit because some other code depends on having a valid state + game_init_sound(_gamestate, SFX_STATE_FLAG_NOSOUND, _features->detectDoSoundType()); +#else + _audio->stopAllAudio(); + _gamestate->_soundCmd->clearPlayList(); +#endif + } + + // TODO Free parser segment here + + // TODO Free scripts here + + // Close all opened file handles + _gamestate->_fileHandles.clear(); + _gamestate->_fileHandles.resize(5); +} + // Invoked by error() when a severe error occurs GUI::Debugger *SciEngine::getDebugger() { if (_gamestate) { diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 0902a41139..0bcff8a02e 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -28,6 +28,7 @@ #include "engines/engine.h" #include "common/util.h" +#include "engine/vm_types.h" // for Selector struct ADGameDescription; @@ -219,6 +220,46 @@ public: GameFeatures *_features; private: + /** + * Initializes a SCI game + * This function must be run before script_run() is executed. Graphics data + * is initialized iff s->gfx_state != NULL. + * @param[in] s The state to operate on + * @return true on success, false if an error occured. + */ + bool initGame(); + + /** + * Runs a SCI game + * This is the main function for SCI games. It takes a valid state, loads + * script 0 to it, finds the game object, allocates a stack, and runs the + * init method of the game object. In layman's terms, this runs a SCI game. + * @param[in] s Pointer to the pointer of the state to operate on + */ + void runGame(); + + /** + * Uninitializes an initialized SCI game + * This function should be run after each script_run() call. + * @param[in] s The state to operate on + */ + void exitGame(); + +#ifdef USE_OLD_MUSIC_FUNCTIONS + /** + * Initializes the sound part of a SCI game + * This function may only be called if game_init() did not initialize + * the sound data. + * @param[in] s The state to initialize the sound in + * @param[in] sound_flags Flags to pass to the sound subsystem + * @param[in] soundVersion sound-version that got detected during game init + * @return 0 on success, 1 if an error occured + */ + int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion); +#endif + + void initStackBaseWithSelector(Selector selector); + const ADGameDescription *_gameDescription; ResourceManager *_resMan; /**< The resource manager */ EngineState *_gamestate; -- cgit v1.2.3 From abc5f97608952d4d1f43c736ecd31f23d0aecb8c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 07:41:48 +0000 Subject: Fixed compilation with the old music code svn-id: r49560 --- engines/sci/sci.cpp | 21 +++++++++++++++------ engines/sci/sci.h | 3 +-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 08236597b4..537ec4bef0 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -234,10 +234,7 @@ Common::Error SciEngine::run() { _gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, soundVersion); #ifdef USE_OLD_MUSIC_FUNCTIONS - if (game_init_sound(_gamestate, 0, soundVersion)) { - warning("Game initialization failed: Error in sound subsystem. Aborting..."); - return Common::kUnknownError; - } + initGameSound(0, soundVersion); #endif syncSoundSettings(); @@ -334,7 +331,7 @@ bool SciEngine::initGame() { #ifdef USE_OLD_MUSIC_FUNCTIONS if (_gamestate->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) - game_init_sound(_gamestate, 0, _features->detectDoSoundType()); + initGameSound(0, _features->detectDoSoundType()); #endif // Load game language into printLang property of game object @@ -345,6 +342,18 @@ bool SciEngine::initGame() { return true; } +#ifdef USE_OLD_MUSIC_FUNCTIONS + +void SciEngine::initGameSound(int sound_flags, SciVersion soundVersion) { + if (getSciVersion() > SCI_VERSION_0_LATE) + sound_flags |= SFX_STATE_FLAG_MULTIPLAY; + + _gamestate->sfx_init_flags = sound_flags; + _gamestate->_sound.sfx_init(_resMan, sound_flags, soundVersion); +} + +#endif + void SciEngine::initStackBaseWithSelector(Selector selector) { _gamestate->stack_base[0] = make_reg(0, (uint16)selector); _gamestate->stack_base[1] = NULL_REG; @@ -392,7 +401,7 @@ void SciEngine::exitGame() { #ifdef USE_OLD_MUSIC_FUNCTIONS _gamestate->_sound.sfx_exit(); // Reinit because some other code depends on having a valid state - game_init_sound(_gamestate, SFX_STATE_FLAG_NOSOUND, _features->detectDoSoundType()); + initGameSound(SFX_STATE_FLAG_NOSOUND, _features->detectDoSoundType()); #else _audio->stopAllAudio(); _gamestate->_soundCmd->clearPlayList(); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 0bcff8a02e..43e9c88da9 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -253,9 +253,8 @@ private: * @param[in] s The state to initialize the sound in * @param[in] sound_flags Flags to pass to the sound subsystem * @param[in] soundVersion sound-version that got detected during game init - * @return 0 on success, 1 if an error occured */ - int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion); + void initGameSound(int sound_flags, SciVersion soundVersion); #endif void initStackBaseWithSelector(Selector selector); -- cgit v1.2.3 From 50c1f4e545dde784341eebf6eb8cd6d3ce0751b7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 07:48:32 +0000 Subject: Moved the MoveCountType enum above the GameFeatures class, as it's the only class using it svn-id: r49561 --- engines/sci/console.cpp | 2 +- engines/sci/engine/features.h | 6 ++++++ engines/sci/sci.h | 6 ------ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 9f1d03df25..7246bef586 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -434,7 +434,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) { DebugPrintf("Sound type: %s\n", getSciVersionDesc(_engine->_features->detectDoSoundType())); DebugPrintf("Graphics functions type: %s\n", getSciVersionDesc(_engine->_features->detectGfxFunctionsType())); DebugPrintf("Lofs type: %s\n", getSciVersionDesc(_engine->_features->detectLofsType())); - DebugPrintf("Move count type: %s\n", (_engine->_features->detectMoveCountType() == kIncrementMoveCount) ? "increment" : "ignore"); + DebugPrintf("Move count type: %s\n", (_engine->_features->handleMoveCount()) ? "increment" : "ignore"); DebugPrintf("SetCursor type: %s\n", getSciVersionDesc(_engine->_features->detectSetCursorType())); DebugPrintf("View type: %s\n", viewTypeDesc[g_sci->getResMan()->getViewType()]); DebugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc()); diff --git a/engines/sci/engine/features.h b/engines/sci/engine/features.h index 77c2f0cff7..5b383746d8 100644 --- a/engines/sci/engine/features.h +++ b/engines/sci/engine/features.h @@ -31,6 +31,12 @@ namespace Sci { +enum MoveCountType { + kMoveCountUninitialized, + kIgnoreMoveCount, + kIncrementMoveCount +}; + class GameFeatures { public: GameFeatures(SegManager *segMan, Kernel *kernel); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 43e9c88da9..4e6be667f1 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -118,12 +118,6 @@ enum SciVersion { SCI_VERSION_3 // LSL7, RAMA, Lighthouse }; -enum MoveCountType { - kMoveCountUninitialized, - kIgnoreMoveCount, - kIncrementMoveCount -}; - /** Supported languages */ enum kLanguage { K_LANG_NONE = 0, -- cgit v1.2.3 From 0ab7c908bb3971a74bb1c8848d6f59f161464ad1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 08:11:38 +0000 Subject: Removed the pointer to the game object from the EngineState class svn-id: r49562 --- engines/sci/engine/kparse.cpp | 4 ++-- engines/sci/engine/state.cpp | 8 +++----- engines/sci/engine/state.h | 2 -- engines/sci/sci.cpp | 7 +++---- engines/sci/sci.h | 2 ++ 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 785ff39d22..465bc177a0 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -118,7 +118,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, 1); writeSelectorValue(segMan, event, SELECTOR(claimed), 1); - invokeSelector(INV_SEL(s, s->_gameObj, syntaxFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); + invokeSelector(INV_SEL(s, g_sci->getGameObject(), syntaxFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); /* Issue warning */ debugC(2, kDebugLevelParser, "Tree building failed"); @@ -141,7 +141,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelParser, "Word unknown: %s", error); /* Issue warning: */ - invokeSelector(INV_SEL(s, s->_gameObj, wordFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); + invokeSelector(INV_SEL(s, g_sci->getGameObject(), wordFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); free(error); return make_reg(0, 1); /* Tell them that it didn't work */ } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 8860666bef..716f948ce6 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -85,8 +85,6 @@ void EngineState::reset(bool isRestoring) { #endif if (!isRestoring) { - _gameObj = NULL_REG; - _memorySegmentSize = 0; _soundCmd = 0; @@ -237,7 +235,7 @@ kLanguage SciEngine::getSciLanguage() { lang = K_LANG_ENGLISH; if (_kernel->_selectorCache.printLang != -1) { - lang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(printLang)); + lang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang)); if ((getSciVersion() >= SCI_VERSION_1_1) || (lang == K_LANG_NONE)) { // If language is set to none, we use the language from the game detector. @@ -272,7 +270,7 @@ kLanguage SciEngine::getSciLanguage() { } // Store language in printLang selector - writeSelectorValue(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(printLang), lang); + writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang); } } @@ -284,7 +282,7 @@ Common::String SciEngine::strSplit(const char *str, const char *sep) { kLanguage subLang = K_LANG_NONE; if (_kernel->_selectorCache.subtitleLang != -1) { - subLang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(subtitleLang)); + subLang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(subtitleLang)); } kLanguage secondLang; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index aaeb8c49ee..32da83b162 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -173,8 +173,6 @@ public: */ void shrinkStackToBase(); - reg_t _gameObj; /**< Pointer to the game object */ - int gc_countdown; /**< Number of kernel calls until next gc */ public: diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 537ec4bef0..fad4e8c4e8 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -145,6 +145,7 @@ Common::Error SciEngine::run() { // Add the after market GM patches for the specified game, if they exist _resMan->addNewGMPatch(getGameID()); + _gameObj = _resMan->findGameObject(); SegManager *segMan = new SegManager(_resMan); @@ -327,8 +328,6 @@ bool SciEngine::initGame() { srand(g_system->getMillis()); // Initialize random number generator - _gamestate->_gameObj = _resMan->findGameObject(); - #ifdef USE_OLD_MUSIC_FUNCTIONS if (_gamestate->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) initGameSound(0, _features->detectDoSoundType()); @@ -359,8 +358,8 @@ void SciEngine::initStackBaseWithSelector(Selector selector) { _gamestate->stack_base[1] = NULL_REG; // Register the first element on the execution stack - if (!send_selector(_gamestate, _gamestate->_gameObj, _gamestate->_gameObj, _gamestate->stack_base, 2, _gamestate->stack_base)) { - _console->printObject(_gamestate->_gameObj); + if (!send_selector(_gamestate, _gameObj, _gameObj, _gamestate->stack_base, 2, _gamestate->stack_base)) { + _console->printObject(_gameObj); error("initStackBaseWithSelector: error while registering the first selector in the call stack"); } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 4e6be667f1..4096019a86 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -161,6 +161,7 @@ public: inline EngineState *getEngineState() const { return _gamestate; } inline Vocabulary *getVocabulary() const { return _vocabulary; } inline EventManager *getEventManager() const { return _eventMan; } + inline reg_t getGameObject() const { return _gameObj; } Common::String getSavegameName(int nr) const; Common::String getSavegamePattern() const; @@ -259,6 +260,7 @@ private: Kernel *_kernel; Vocabulary *_vocabulary; EventManager *_eventMan; + reg_t _gameObj; /**< Pointer to the game object */ Console *_console; OSystem *_system; }; -- cgit v1.2.3 From eb4ec596cdb8e541d5221263b3db185bd01b206f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 09:18:57 +0000 Subject: Use the SELECTOR() macro for readability svn-id: r49563 --- engines/sci/engine/features.cpp | 14 +++++++------- engines/sci/engine/kgraphics.cpp | 4 ++-- engines/sci/engine/state.cpp | 4 ++-- engines/sci/engine/vm.cpp | 5 +++-- engines/sci/graphics/animate.cpp | 4 ++-- engines/sci/graphics/compare.cpp | 8 ++++---- engines/sci/sci.cpp | 7 ++++--- engines/sci/sound/soundcmd.cpp | 2 +- 8 files changed, 25 insertions(+), 23 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 48f7c2d64f..4eb6bf2a56 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -69,7 +69,7 @@ reg_t GameFeatures::getDetectionAddr(const Common::String &objName, Selector slc bool GameFeatures::autoDetectSoundType() { // Look up the script address - reg_t addr = getDetectionAddr("Sound", _kernel->_selectorCache.play); + reg_t addr = getDetectionAddr("Sound", SELECTOR(play)); if (!addr.segment) return false; @@ -138,7 +138,7 @@ SciVersion GameFeatures::detectDoSoundType() { if (getSciVersion() == SCI_VERSION_0_EARLY) { // This game is using early SCI0 sound code (different headers than SCI0 late) _doSoundType = SCI_VERSION_0_EARLY; - } else if (_kernel->_selectorCache.nodePtr == -1) { + } else if (SELECTOR(nodePtr) == -1) { // No nodePtr selector, so this game is definitely using newer // SCI0 sound code (i.e. SCI_VERSION_0_LATE) _doSoundType = SCI_VERSION_0_LATE; @@ -293,7 +293,7 @@ SciVersion GameFeatures::detectLofsType() { bool GameFeatures::autoDetectGfxFunctionsType(int methodNum) { // Look up the script address - reg_t addr = getDetectionAddr("Rm", _kernel->_selectorCache.overlay, methodNum); + reg_t addr = getDetectionAddr("Rm", SELECTOR(overlay), methodNum); if (!addr.segment) return false; @@ -343,10 +343,10 @@ SciVersion GameFeatures::detectGfxFunctionsType() { bool searchRoomObj = false; reg_t rmObjAddr = _segMan->findObjectByName("Rm"); - if (_kernel->_selectorCache.overlay != -1) { + if (SELECTOR(overlay) != -1) { // The game has an overlay selector, check how it calls kDrawPicto determine // the graphics functions type used - if (lookupSelector(_segMan, rmObjAddr, _kernel->_selectorCache.overlay, NULL, NULL) == kSelectorMethod) { + if (lookupSelector(_segMan, rmObjAddr, SELECTOR(overlay), NULL, NULL) == kSelectorMethod) { if (!autoDetectGfxFunctionsType()) { warning("Graphics functions detection failed, taking an educated guess"); @@ -396,7 +396,7 @@ SciVersion GameFeatures::detectGfxFunctionsType() { #ifdef ENABLE_SCI32 bool GameFeatures::autoDetectSci21KernelType() { // Look up the script address - reg_t addr = getDetectionAddr("Sound", _kernel->_selectorCache.play); + reg_t addr = getDetectionAddr("Sound", SELECTOR(play)); if (!addr.segment) return false; @@ -448,7 +448,7 @@ SciVersion GameFeatures::detectSci21KernelType() { bool GameFeatures::autoDetectMoveCountType() { // Look up the script address - reg_t addr = getDetectionAddr("Motion", _kernel->_selectorCache.doit); + reg_t addr = getDetectionAddr("Motion", SELECTOR(doit)); if (!addr.segment) return false; diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index abe55455de..f025d03a09 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -821,12 +821,12 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { maxChars = readSelectorValue(s->_segMan, controlObject, SELECTOR(x)); // max chars per entry cursorOffset = readSelectorValue(s->_segMan, controlObject, SELECTOR(cursor)); - if (g_sci->getKernel()->_selectorCache.topString != -1) { + if (SELECTOR(topString) != -1) { // Games from early SCI1 onwards use topString upperOffset = readSelectorValue(s->_segMan, controlObject, SELECTOR(topString)); } else { // Earlier games use lsTop or brTop - if (lookupSelector(s->_segMan, controlObject, g_sci->getKernel()->_selectorCache.brTop, NULL, NULL) == kSelectorVariable) + if (lookupSelector(s->_segMan, controlObject, SELECTOR(brTop), NULL, NULL) == kSelectorVariable) upperOffset = readSelectorValue(s->_segMan, controlObject, SELECTOR(brTop)); else upperOffset = readSelectorValue(s->_segMan, controlObject, SELECTOR(lsTop)); diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 716f948ce6..367a9b78b9 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -234,7 +234,7 @@ kLanguage SciEngine::getSciLanguage() { lang = K_LANG_ENGLISH; - if (_kernel->_selectorCache.printLang != -1) { + if (SELECTOR(printLang) != -1) { lang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang)); if ((getSciVersion() >= SCI_VERSION_1_1) || (lang == K_LANG_NONE)) { @@ -281,7 +281,7 @@ Common::String SciEngine::strSplit(const char *str, const char *sep) { kLanguage lang = getSciLanguage(); kLanguage subLang = K_LANG_NONE; - if (_kernel->_selectorCache.subtitleLang != -1) { + if (SELECTOR(subtitleLang) != -1) { subLang = (kLanguage)readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(subtitleLang)); } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 2c92bdadc3..f99ae817bf 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -35,8 +35,9 @@ #include "sci/engine/features.h" #include "sci/engine/state.h" #include "sci/engine/kernel.h" -#include "sci/engine/seg_manager.h" #include "sci/engine/script.h" +#include "sci/engine/seg_manager.h" +#include "sci/engine/selector.h" // for SELECTOR #include "sci/engine/gc.h" namespace Sci { @@ -205,7 +206,7 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i if (!stopGroopPos.isNull()) { // does the game have a stopGroop object? // Find the "client" member variable of the stopGroop object, and update it ObjVarRef varp; - if (lookupSelector(segMan, stopGroopPos, kernel->_selectorCache.client, &varp, NULL) == kSelectorVariable) { + if (lookupSelector(segMan, stopGroopPos, SELECTOR(client), &varp, NULL) == kSelectorVariable) { reg_t *clientVar = varp.getPointer(segMan); *clientVar = value; } diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index d4def39ebf..48715af53e 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -93,7 +93,7 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); if (!(signal & kSignalFrozen)) { // Call .doit method of that object - invokeSelector(_s, curObject, g_sci->getKernel()->_selectorCache.doit, kContinueOnInvalidSelector, argc, argv, 0); + invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0); // Lookup node again, since the nodetable it was in may have been reallocated curNode = _s->_segMan->lookupNode(curAddress); } @@ -497,7 +497,7 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { if (signal & kSignalDisposeMe) { // Call .delete_ method of that object - invokeSelector(_s, curObject, g_sci->getKernel()->_selectorCache.delete_, kContinueOnInvalidSelector, argc, argv, 0); + invokeSelector(_s, curObject, SELECTOR(delete_), argc, argv, 0); } listIterator--; } diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 3102edc2fa..47b4f22607 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -126,14 +126,14 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { int16 x = (int16)readSelectorValue(_segMan, objectReference, SELECTOR(x)); int16 y = (int16)readSelectorValue(_segMan, objectReference, SELECTOR(y)); int16 z = 0; - if (_kernel->_selectorCache.z > -1) + if (SELECTOR(z) > -1) z = (int16)readSelectorValue(_segMan, objectReference, SELECTOR(z)); // now get cel rectangle view = _cache->getView(viewId); view->getCelRect(loopNo, celNo, x, y, z, &celRect); - if (lookupSelector(_segMan, objectReference, _kernel->_selectorCache.nsTop, NULL, NULL) == kSelectorVariable) { + if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) { writeSelectorValue(_segMan, objectReference, SELECTOR(nsLeft), celRect.left); writeSelectorValue(_segMan, objectReference, SELECTOR(nsRight), celRect.right); writeSelectorValue(_segMan, objectReference, SELECTOR(nsTop), celRect.top); @@ -183,10 +183,10 @@ bool GfxCompare::kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, } void GfxCompare::kernelBaseSetter(reg_t object) { - if (lookupSelector(_segMan, object, _kernel->_selectorCache.brLeft, NULL, NULL) == kSelectorVariable) { + if (lookupSelector(_segMan, object, SELECTOR(brLeft), NULL, NULL) == kSelectorVariable) { int16 x = readSelectorValue(_segMan, object, SELECTOR(x)); int16 y = readSelectorValue(_segMan, object, SELECTOR(y)); - int16 z = (_kernel->_selectorCache.z > -1) ? readSelectorValue(_segMan, object, SELECTOR(z)) : 0; + int16 z = (SELECTOR(z) > -1) ? readSelectorValue(_segMan, object, SELECTOR(z)) : 0; int16 yStep = readSelectorValue(_segMan, object, SELECTOR(yStep)); GuiResourceId viewId = readSelectorValue(_segMan, object, SELECTOR(view)); int16 loopNo = readSelectorValue(_segMan, object, SELECTOR(loop)); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index fad4e8c4e8..3a3c147cb6 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -40,6 +40,7 @@ #include "sci/engine/state.h" #include "sci/engine/kernel.h" #include "sci/engine/script.h" // for script_adjust_opcode_formats +#include "sci/engine/selector.h" // for SELECTOR #include "sci/sound/audio.h" #include "sci/sound/soundcmd.h" @@ -366,7 +367,7 @@ void SciEngine::initStackBaseWithSelector(Selector selector) { } void SciEngine::runGame() { - initStackBaseWithSelector(_kernel->_selectorCache.play); // Call the play selector + initStackBaseWithSelector(SELECTOR(play)); // Call the play selector // Attach the debug console on game startup, if requested if (DebugMan.isDebugChannelEnabled(kDebugLevelOnStartup)) @@ -383,11 +384,11 @@ void SciEngine::runGame() { #ifdef USE_OLD_MUSIC_FUNCTIONS _gamestate->_sound.sfx_reset_player(); #endif - initStackBaseWithSelector(_kernel->_selectorCache.play); + initStackBaseWithSelector(SELECTOR(play)); _gamestate->gameWasRestarted = true; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { _gamestate->abortScriptProcessing = kAbortNone; - initStackBaseWithSelector(_kernel->_selectorCache.replay); + initStackBaseWithSelector(SELECTOR(replay)); } else { break; // exit loop } diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 4711fe385d..2bbc5b44de 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -842,7 +842,7 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { // Update MIDI slots if (musicSlot->signal == 0) { if (musicSlot->dataInc != readSelectorValue(_segMan, obj, SELECTOR(dataInc))) { - if (_kernel->_selectorCache.dataInc > -1) + if (SELECTOR(dataInc) > -1) writeSelectorValue(_segMan, obj, SELECTOR(dataInc), musicSlot->dataInc); writeSelectorValue(_segMan, obj, SELECTOR(signal), musicSlot->dataInc + 127); } -- cgit v1.2.3 From cc6f5eb3e42bb4f7af47a70802a236fdbffc7b74 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 09:22:30 +0000 Subject: Unified invokeSelector() and invokeSelectorArgv(), and removed the INV_SEL kludge. Also, removed the selectorInvocation parameter - if invokeSelector() fails, the error is in most cases unrecoverable, and the error description thrown covers all cases where kContinueOnInvalidSelector was used. This uncovered a bug too: in some places, non reg_t parameters were parsed svn-id: r49564 --- engines/sci/engine/klists.cpp | 9 +++++---- engines/sci/engine/kmovement.cpp | 34 +++++++++++----------------------- engines/sci/engine/kparse.cpp | 6 +++--- engines/sci/engine/selector.cpp | 26 ++------------------------ engines/sci/engine/selector.h | 19 ++----------------- 5 files changed, 23 insertions(+), 71 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index f06f3eec77..18d6638e92 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -424,7 +424,8 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) { i = 0; while (node) { - invokeSelector(INV_SEL(s, order_func, doit, kStopOnInvalidSelector), 1, node->value); + reg_t params[1] = { node->value }; + invokeSelector(s, order_func, SELECTOR(doit), argc, argv, 1, params); temp_array[i].key = node->key; temp_array[i].value = node->value; temp_array[i].order = s->r_acc; @@ -523,7 +524,7 @@ reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) { writeSelector(s->_segMan, curObject, slc, argv[2]); } } else { - invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2); + invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2); } curNode = s->_segMan->lookupNode(nextNode); @@ -552,7 +553,7 @@ reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) { // Can this happen with variable selectors? warning("kListFirstTrue: Attempted to access a variable selector"); } else { - invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2); + invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2); // Check if the result is true if (!s->r_acc.isNull()) @@ -586,7 +587,7 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) { // Can this happen with variable selectors? warning("kListAllTrue: Attempted to access a variable selector"); } else { - invokeSelectorArgv(s, curObject, slc, kContinueOnInvalidSelector, argc, argv, argc - 2, argv + 2); + invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2); // Check if the result isn't true if (s->r_acc.isNull()) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 499aeabcc6..e45e55373b 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -315,11 +315,11 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d", x, y, bdi); - if (g_sci->getKernel()->_selectorCache.cantBeHere != -1) { - invokeSelector(INV_SEL(s, client, cantBeHere, kStopOnInvalidSelector), 0); + if (SELECTOR(cantBeHere) != -1) { + invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv); s->r_acc = make_reg(0, !s->r_acc.offset); } else { - invokeSelector(INV_SEL(s, client, canBeHere, kStopOnInvalidSelector), 0); + invokeSelector(s, client, SELECTOR(canBeHere), argc, argv); } if (!s->r_acc.offset) { // Contains the return value @@ -335,7 +335,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { if ((getSciVersion() >= SCI_VERSION_1_EGA)) if (completed) - invokeSelector(INV_SEL(s, mover, moveDone, kStopOnInvalidSelector), 0); + invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); return make_reg(0, completed); } @@ -399,20 +399,13 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "Doing avoider %04x:%04x (dest=%d,%d)", PRINT_REG(avoider), destx, desty); - if (invokeSelector(INV_SEL(s, mover, doit, kContinueOnInvalidSelector) , 0)) { - error("Mover %04x:%04x of avoider %04x:%04x doesn't have a doit() funcselector", PRINT_REG(mover), PRINT_REG(avoider)); - return NULL_REG; - } + invokeSelector(s, mover, SELECTOR(doit), argc, argv); mover = readSelector(segMan, client, SELECTOR(mover)); if (!mover.segment) // Mover has been disposed? return s->r_acc; // Return gracefully. - if (invokeSelector(INV_SEL(s, client, isBlocked, kContinueOnInvalidSelector) , 0)) { - error("Client %04x:%04x of avoider %04x:%04x doesn't" - " have an isBlocked() funcselector", PRINT_REG(client), PRINT_REG(avoider)); - return NULL_REG; - } + invokeSelector(s, client, SELECTOR(isBlocked), argc, argv); dx = destx - readSelectorValue(segMan, client, SELECTOR(x)); dy = desty - readSelectorValue(segMan, client, SELECTOR(y)); @@ -439,11 +432,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "Pos (%d,%d): Trying angle %d; delta=(%d,%d)", oldx, oldy, angle, move_x, move_y); - if (invokeSelector(INV_SEL(s, client, canBeHere, kContinueOnInvalidSelector) , 0)) { - error("Client %04x:%04x of avoider %04x:%04x doesn't" - " have a canBeHere() funcselector", PRINT_REG(client), PRINT_REG(avoider)); - return NULL_REG; - } + invokeSelector(s, client, SELECTOR(canBeHere), argc, argv); writeSelectorValue(segMan, client, SELECTOR(x), oldx); writeSelectorValue(segMan, client, SELECTOR(y), oldy); @@ -472,12 +461,11 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, angle); + reg_t params[2] = { make_reg(0, angle), client }; + if (looper.segment) { - if (invokeSelector(INV_SEL(s, looper, doit, kContinueOnInvalidSelector), 2, angle, client)) { - error("Looper %04x:%04x of avoider %04x:%04x doesn't" - " have a doit() funcselector", PRINT_REG(looper), PRINT_REG(avoider)); - } else - return s->r_acc; + invokeSelector(s, looper, SELECTOR(doit), 2, params); + return s->r_acc; } else { // No looper? Fall back to DirLoop _k_dirloop(client, (uint16)angle, s, argc, argv); diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 465bc177a0..bb9a49c7e8 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -94,8 +94,8 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { ResultWordList words; reg_t event = argv[1]; Vocabulary *voc = g_sci->getVocabulary(); - voc->parser_event = event; + reg_t params[2] = { voc->parser_base, stringpos }; bool res = voc->tokenizeString(words, string.c_str(), &error); voc->parserIsValid = false; /* not valid */ @@ -118,7 +118,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, 1); writeSelectorValue(segMan, event, SELECTOR(claimed), 1); - invokeSelector(INV_SEL(s, g_sci->getGameObject(), syntaxFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); + invokeSelector(s, g_sci->getGameObject(), SELECTOR(syntaxFail), 2, params); /* Issue warning */ debugC(2, kDebugLevelParser, "Tree building failed"); @@ -141,7 +141,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelParser, "Word unknown: %s", error); /* Issue warning: */ - invokeSelector(INV_SEL(s, g_sci->getGameObject(), wordFail, kStopOnInvalidSelector), 2, voc->parser_base, stringpos); + invokeSelector(s, g_sci->getGameObject(), SELECTOR(wordFail), 2, params); free(error); return make_reg(0, 1); /* Tell them that it didn't work */ } diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 04a1b8fbba..eafed029c5 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -200,7 +200,7 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t *address.getPointer(segMan) = value; } -int invokeSelectorArgv(EngineState *s, reg_t object, int selectorId, SelectorInvocation noinvalid, +void invokeSelector(EngineState *s, reg_t object, int selectorId, int k_argc, StackPtr k_argp, int argc, const reg_t *argv) { int i; int framesize = 2 + 1 * argc; @@ -214,16 +214,12 @@ int invokeSelectorArgv(EngineState *s, reg_t object, int selectorId, SelectorInv slc_type = lookupSelector(s->_segMan, object, selectorId, NULL, &address); if (slc_type == kSelectorNone) { - warning("Selector '%s' of object at %04x:%04x could not be invoked", + error("Selector '%s' of object at %04x:%04x could not be invoked", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); - if (noinvalid == kStopOnInvalidSelector) - error("[Kernel] Not recoverable: VM was halted"); - return 1; } if (slc_type == kSelectorVariable) { warning("Attempting to invoke variable selector %s of object %04x:%04x", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); - return 0; } for (i = 0; i < argc; i++) @@ -238,24 +234,6 @@ int invokeSelectorArgv(EngineState *s, reg_t object, int selectorId, SelectorInv xstack->fp += argc + 2; run_vm(s, false); // Start a new vm - - return 0; -} - -int invokeSelector(EngineState *s, reg_t object, int selectorId, SelectorInvocation noinvalid, - int k_argc, StackPtr k_argp, int argc, ...) { - va_list argp; - reg_t *args = new reg_t[argc]; - - va_start(argp, argc); - for (int i = 0; i < argc; i++) - args[i] = va_arg(argp, reg_t); - va_end(argp); - - int retval = invokeSelectorArgv(s, object, selectorId, noinvalid, k_argc, k_argp, argc, args); - - delete[] args; - return retval; } SelectorType lookupSelector(SegManager *segMan, reg_t obj_location, Selector selectorId, ObjVarRef *varp, reg_t *fptr) { diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index f50b9ab1b3..851ff6bc81 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -34,11 +34,6 @@ namespace Sci { -enum SelectorInvocation { - kStopOnInvalidSelector = 0, - kContinueOnInvalidSelector = 1 -}; - /** * Map a selector name to a selector id. Shortcut for accessing the selector cache. */ @@ -71,18 +66,8 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t /** * Invokes a selector from an object. */ -int invokeSelector(EngineState *s, reg_t object, int selectorId, SelectorInvocation noinvalid, - int k_argc, StackPtr k_argp, int argc, ...); -int invokeSelectorArgv(EngineState *s, reg_t object, int selectorId, SelectorInvocation noinvalid, - int k_argc, StackPtr k_argp, int argc, const reg_t *argv); - -/** - * Kludge for use with invokeSelector(). Used for compatibility with compilers - * that cannot handle vararg macros. - */ -#define INV_SEL(s, _object_, _selector_, _noinvalid_) \ - s, _object_, g_sci->getKernel()->_selectorCache._selector_, _noinvalid_, argc, argv - +void invokeSelector(EngineState *s, reg_t object, int selectorId, + int k_argc, StackPtr k_argp, int argc = 0, const reg_t *argv = 0); } // End of namespace Sci -- cgit v1.2.3 From 8a5762c52db029386135ed7dd83f69fe5d34509c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 10 Jun 2010 10:15:32 +0000 Subject: SCI: set picport when loading saved games svn-id: r49565 --- engines/sci/engine/savegame.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 224115f95f..0376486667 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -369,6 +369,10 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint16LE(picPortRect.right); s.syncAsSint16LE(picPortTop); s.syncAsSint16LE(picPortLeft); + + if (s.isLoading()) { + g_sci->_gfxPorts->kernelSetPicWindow(picPortRect, picPortTop, picPortLeft, false); + } } s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not -- cgit v1.2.3 From 4d8734284701153f10e9a2691d9b3cf5fd51e069 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 10 Jun 2010 10:20:25 +0000 Subject: Added extra code and support methods for properly clearing up backgrounds and used sprites when an animation sequence ends svn-id: r49566 --- engines/m4/graphics.cpp | 45 +++++++++++++++++++++++++++++++-------------- engines/m4/graphics.h | 1 + engines/m4/mads_anim.cpp | 5 +++++ engines/m4/mads_views.cpp | 8 +++++++- engines/m4/mads_views.h | 1 + 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 8624f18da1..f332c8b06c 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -331,6 +331,16 @@ void M4Surface::clear() { Common::set_to((byte *)pixels, (byte *)pixels + w * h, _vm->_palette->BLACK); } +void M4Surface::reset() { + ::free(pixels); + pixels = NULL; + if (_rgbList) { + _vm->_palette->deleteRange(_rgbList); + delete _rgbList; + _rgbList = NULL; + } +} + void M4Surface::frameRect(const Common::Rect &r, uint8 color) { Graphics::Surface::frameRect(r, color); } @@ -412,6 +422,11 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surf if (!copyRect.isValidRect()) return; + if (scale != 100) { + destX -= (src->width() * scale / 100) / 2; + destY -= (src->height() * scale / 100); + } + // Copy the specified area byte *data = src->getBasePtr(); @@ -435,27 +450,31 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surf } } else { // Scaled variation - for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) { - int currX = -1; + int currY = -1; + + for (int rowCtr = 0, yTotal = 0; rowCtr < copyRect.height(); ++rowCtr, yTotal += scale, + srcPtr += src->width(), depthsPtr += depthsSurface->width()) { + int srcY = yTotal / 100; + if (srcY == currY) + continue; + currY = srcY; // Loop through the source pixels - for (int xCtr = 0, xTotal = 0; xCtr < copyRect.width(); ++xCtr, xTotal += (100 - scale)) { + int currX = -1; + byte *destP = destPtr; + for (int xCtr = 0, xTotal = 0; xCtr < copyRect.width(); ++xCtr, xTotal += scale) { int srcX = xTotal / 100; + if (srcX == currX) + continue; + currX = srcX; - if (srcX != currX) { - currX = srcX; - - if ((depthsPtr[currX] > depth) && (srcPtr[xCtr] != transparentColour)) - destPtr[currX] = srcPtr[xCtr]; - } + if ((depthsPtr[currX] > depth) && (srcPtr[xCtr] != transparentColour)) + *destP++ = srcPtr[xCtr]; } - srcPtr += src->width(); - depthsPtr += depthsSurface->width(); destPtr += width(); } } - src->freeData(); depthsSurface->freeData(); } @@ -471,8 +490,6 @@ void M4Surface::loadBackgroundRiddle(const char *sceneName) { } void M4Surface::loadBackground(int sceneNumber, RGBList **palData) { - clear(); // clear previous scene - if (_vm->isM4() || (_vm->getGameType() == GType_RexNebular)) { char resourceName[20]; Common::SeekableReadStream *stream; diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 8c4b9ac072..6901b72e87 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -154,6 +154,7 @@ public: } void freeData(); void clear(); + void reset(); void frameRect(const Common::Rect &r, uint8 color); void fillRect(const Common::Rect &r, uint8 color); void copyFrom(M4Surface *src, const Common::Rect &srcBounds, int destX, int destY, diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index e1dbbaf106..eac6d1b4aa 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -524,6 +524,11 @@ void AnimviewView::updateState() { delete _activeAnimation; _activeAnimation = NULL; + // Clear up current background and sprites + _backgroundSurface.reset(); + clearLists(); + + // Check if script is finished if (_script->eos() || _script->err()) { scriptDone(); return; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index c7b4f76a00..98b04e9f2d 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -192,7 +192,7 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { assert(slot.spriteListIndex < (int)_sprites.size()); SpriteAsset &spriteSet = *_sprites[slot.spriteListIndex]; - if (slot.scale < 100) { + if ((slot.scale < 100) && (slot.scale != -1)) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); @@ -1222,4 +1222,10 @@ void MadsView::refresh() { _textDisplay.cleanUp(); } +void MadsView::clearLists() { + _textDisplay.clear(); + _kernelMessages.clear(); + _spriteSlots.clear(); +} + } // End of namespace M4 diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 29adb7048a..85bfe9e552 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -404,6 +404,7 @@ public: ~MadsView(); void refresh(); + void clearLists(); }; } -- cgit v1.2.3 From a635b948239fbbd1ce302fb9d5eac943e90ca7ee Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 10:27:13 +0000 Subject: Pic port saving/loading is only used in SCI0-SCI11 svn-id: r49567 --- engines/sci/engine/savegame.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0376486667..99191146e5 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -352,16 +352,14 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_foreground s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_background - if (s.getVersion() >= 13 && g_sci->_gui) { - // Save/Load picPort as well (cause sierra sci also does this) + if (s.getVersion() >= 13 && getSciVersion() <= SCI_VERSION_1_1) { + // Save/Load picPort as well for SCI0-SCI1.1. Necessary for Castle of Dr. Brain, + // as the picPort has been changed when loading during the intro int16 picPortTop, picPortLeft; Common::Rect picPortRect; - if (s.isSaving()) { - // FIXME: _gfxPorts is 0 when using SCI32 code - assert(g_sci->_gfxPorts); + if (s.isSaving()) picPortRect = g_sci->_gfxPorts->kernelGetPicWindow(picPortTop, picPortLeft); - } s.syncAsSint16LE(picPortRect.top); s.syncAsSint16LE(picPortRect.left); @@ -370,9 +368,8 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint16LE(picPortTop); s.syncAsSint16LE(picPortLeft); - if (s.isLoading()) { + if (s.isLoading()) g_sci->_gfxPorts->kernelSetPicWindow(picPortRect, picPortTop, picPortLeft, false); - } } s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not -- cgit v1.2.3 From 93f33c7dab009e8ff82fac195e7b6d02e66ab755 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 11:18:10 +0000 Subject: Resolved a FIXME with getSciLanguage(), by creating a separate setter. Also, some camelCase changes svn-id: r49568 --- engines/sci/console.cpp | 6 +++--- engines/sci/detection.cpp | 4 ++-- engines/sci/engine/ksound.cpp | 5 ++++- engines/sci/engine/savegame.cpp | 4 ++-- engines/sci/engine/scriptdebug.cpp | 4 ++-- engines/sci/engine/state.cpp | 25 +++++++++++++++---------- engines/sci/engine/state.h | 10 +++++----- engines/sci/engine/vm.cpp | 12 ++++++------ engines/sci/sci.cpp | 8 +++----- engines/sci/sci.h | 2 ++ 10 files changed, 44 insertions(+), 36 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 7246bef586..098d83a2d3 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -75,7 +75,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); - DVar_Register("gc_interval", &engine->_gamestate->script_gc_interval, DVAR_INT, 0); + DVar_Register("gc_interval", &engine->_gamestate->scriptGCInterval, DVAR_INT, 0); DVar_Register("simulated_key", &g_debug_simulated_key, DVAR_INT, 0); DVar_Register("track_mouse_clicks", &g_debug_track_mouse_clicks, DVAR_BOOL, 0); DVar_Register("script_abort_flag", &_engine->_gamestate->abortScriptProcessing, DVAR_INT, 0); @@ -2086,7 +2086,7 @@ bool Console::cmdViewAccumulatorObject(int argc, const char **argv) { } bool Console::cmdScriptSteps(int argc, const char **argv) { - DebugPrintf("Number of executed SCI operations: %d\n", _engine->_gamestate->script_step_counter); + DebugPrintf("Number of executed SCI operations: %d\n", _engine->_gamestate->scriptStepCounter); return true; } @@ -2114,7 +2114,7 @@ bool Console::cmdSetAccumulator(int argc, const char **argv) { bool Console::cmdBacktrace(int argc, const char **argv) { DebugPrintf("Dumping the send/self/super/call/calle/callb stack:\n"); - DebugPrintf("Call stack (current base: 0x%x):\n", _engine->_gamestate->execution_stack_base); + DebugPrintf("Call stack (current base: 0x%x):\n", _engine->_gamestate->executionStackBase); Common::List::iterator iter; uint i = 0; diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index f36bae2d6d..579414b3ea 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -673,11 +673,11 @@ Common::Error SciEngine::saveGameState(int slot, const char *desc) { } bool SciEngine::canLoadGameStateCurrently() { - return !_gamestate->execution_stack_base; + return !_gamestate->executionStackBase; } bool SciEngine::canSaveGameStateCurrently() { - return !_gamestate->execution_stack_base; + return !_gamestate->executionStackBase; } } // End of namespace Sci diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 367a89005c..29302181b1 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -151,7 +151,10 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { if (language != -1) g_sci->getResMan()->setAudioLanguage(language); - return make_reg(0, g_sci->getSciLanguage()); + kLanguage kLang = g_sci->getSciLanguage(); + g_sci->setSciLanguage(kLang); + + return make_reg(0, kLang); } break; case kSciAudioCD: diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 99191146e5..3cd444d4d7 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -722,7 +722,7 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename meta.savegame_date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); meta.savegame_time = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); - if (s->execution_stack_base) { + if (s->executionStackBase) { warning("Cannot save from below kernel function"); return 1; } @@ -875,7 +875,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->gc_countdown = GC_INTERVAL - 1; // Time state: - s->last_wait_time = g_system->getMillis(); + s->lastWaitTime = g_system->getMillis(); s->game_start_time = g_system->getMillis(); #ifdef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 159c278e8c..436eaafec5 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -284,7 +284,7 @@ void script_debug(EngineState *s) { #if 0 if (sci_debug_flags & _DEBUG_FLAG_LOGGING) { - printf("%d: acc=%04x:%04x ", script_step_counter, PRINT_REG(s->r_acc)); + printf("%d: acc=%04x:%04x ", scriptStepCounter, PRINT_REG(s->r_acc)); disassemble(s, s->xs->addr.pc, 0, 1); if (s->seeking == kDebugSeekGlobal) printf("Global %d (0x%x) = %04x:%04x\n", s->seekSpecial, @@ -351,7 +351,7 @@ void script_debug(EngineState *s) { } } - printf("Step #%d\n", s->script_step_counter); + printf("Step #%d\n", s->scriptStepCounter); disassemble(s, s->xs->addr.pc, 0, 1); if (g_debugState.runningStep) { diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 367a9b78b9..8e4a5200c8 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -95,7 +95,7 @@ void EngineState::reset(bool isRestoring) { abortScriptProcessing = kAbortNone; } - execution_stack_base = 0; + executionStackBase = 0; _executionStackPosChanged = false; restAdjust = 0; @@ -103,7 +103,7 @@ void EngineState::reset(bool isRestoring) { r_acc = NULL_REG; r_prev = NULL_REG; - last_wait_time = 0; + lastWaitTime = 0; gc_countdown = 0; @@ -111,14 +111,14 @@ void EngineState::reset(bool isRestoring) { _throttleLastTime = 0; _throttleTrigger = false; - script_step_counter = 0; - script_gc_interval = GC_INTERVAL; + scriptStepCounter = 0; + scriptGCInterval = GC_INTERVAL; } void EngineState::wait(int16 ticks) { uint32 time = g_system->getMillis(); - r_acc = make_reg(0, ((long)time - (long)last_wait_time) * 60 / 1000); - last_wait_time = time; + r_acc = make_reg(0, ((long)time - (long)lastWaitTime) * 60 / 1000); + lastWaitTime = time; ticks *= g_debug_sleeptime_factor; g_sci->getEventManager()->sleep(ticks * 1000 / 60); @@ -144,7 +144,7 @@ void EngineState::setRoomNumber(uint16 roomNumber) { } void EngineState::shrinkStackToBase() { - uint size = execution_stack_base + 1; + uint size = executionStackBase + 1; assert(_executionStack.size() >= size); Common::List::iterator iter = _executionStack.begin(); for (uint i = 0; i < size; ++i) @@ -268,15 +268,20 @@ kLanguage SciEngine::getSciLanguage() { default: lang = K_LANG_ENGLISH; } - - // Store language in printLang selector - writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang); } } return lang; } +void SciEngine::setSciLanguage(kLanguage lang) { + writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang); +} + +void SciEngine::setSciLanguage() { + setSciLanguage(getSciLanguage()); +} + Common::String SciEngine::strSplit(const char *str, const char *sep) { kLanguage lang = getSciLanguage(); kLanguage subLang = K_LANG_NONE; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 32da83b162..fd2380667b 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -112,7 +112,7 @@ public: SoundCommandParser *_soundCmd; uint32 game_start_time; /**< The time at which the interpreter was started */ - uint32 last_wait_time; /**< The last time the game invoked Wait() */ + uint32 lastWaitTime; /**< The last time the game invoked Wait() */ void wait(int16 ticks); @@ -134,7 +134,7 @@ public: * When called from kernel functions, the vm is re-started recursively on * the same stack. This variable contains the stack base for the current vm. */ - int execution_stack_base; + int executionStackBase; bool _executionStackPosChanged; /**< Set to true if the execution stack position should be re-evaluated by the vm */ reg_t r_acc; /**< Accumulator */ @@ -156,8 +156,8 @@ public: AbortGameState abortScriptProcessing; bool gameWasRestarted; - int script_step_counter; // Counts the number of steps executed - int script_gc_interval; // Number of steps in between gcs + int scriptStepCounter; // Counts the number of steps executed + int scriptGCInterval; // Number of steps in between gcs uint16 currentRoomNumber() const; void setRoomNumber(uint16 roomNumber); @@ -169,7 +169,7 @@ public: /** * Shrink execution stack to size. - * Contains an assert it is not already smaller. + * Contains an assert if it is not already smaller. */ void shrinkStackToBase(); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f99ae817bf..a203352dcd 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -631,7 +631,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { static void gc_countdown(EngineState *s) { if (s->gc_countdown-- <= 0) { - s->gc_countdown = s->script_gc_interval; + s->gc_countdown = s->scriptGCInterval; run_gc(s); } } @@ -726,7 +726,7 @@ void run_vm(EngineState *s, bool restoring) { ExecStack *xs_new = NULL; Object *obj = s->_segMan->getObject(s->xs->objp); Script *local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); - int old_execution_stack_base = s->execution_stack_base; + int old_executionStackBase = s->executionStackBase; // Used to detect the stack bottom, for "physical" returns const byte *code_buf = NULL; // (Avoid spurious warning) @@ -735,7 +735,7 @@ void run_vm(EngineState *s, bool restoring) { } if (!restoring) - s->execution_stack_base = s->_executionStack.size() - 1; + s->executionStackBase = s->_executionStack.size() - 1; s->variables_seg[VAR_TEMP] = s->variables_seg[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); s->variables_base[VAR_TEMP] = s->variables_base[VAR_PARAM] = s->stack_base; @@ -1179,8 +1179,8 @@ void run_vm(EngineState *s, bool restoring) { StackPtr old_fp = s->xs->fp; ExecStack *old_xs = &(s->_executionStack.back()); - if ((int)s->_executionStack.size() - 1 == s->execution_stack_base) { // Have we reached the base? - s->execution_stack_base = old_execution_stack_base; // Restore stack base + if ((int)s->_executionStack.size() - 1 == s->executionStackBase) { // Have we reached the base? + s->executionStackBase = old_executionStackBase; // Restore stack base s->_executionStack.pop_back(); @@ -1661,7 +1661,7 @@ void run_vm(EngineState *s, bool restoring) { opcode); } //#endif - ++s->script_step_counter; + ++s->scriptStepCounter; } } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 3a3c147cb6..2b3194830d 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -304,7 +304,7 @@ bool SciEngine::initGame() { _gamestate->r_acc = _gamestate->r_prev = NULL_REG; _gamestate->_executionStack.clear(); // Start without any execution stack - _gamestate->execution_stack_base = -1; // No vm is running yet + _gamestate->executionStackBase = -1; // No vm is running yet _gamestate->_executionStackPosChanged = false; _gamestate->abortScriptProcessing = kAbortNone; @@ -325,7 +325,7 @@ bool SciEngine::initGame() { _vocabulary->parser_base = make_reg(_gamestate->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); } - _gamestate->game_start_time = _gamestate->last_wait_time = g_system->getMillis(); + _gamestate->game_start_time = _gamestate->lastWaitTime = g_system->getMillis(); srand(g_system->getMillis()); // Initialize random number generator @@ -335,9 +335,7 @@ bool SciEngine::initGame() { #endif // Load game language into printLang property of game object - // FIXME: It's evil to achieve this as a side effect of a getter. - // Much better to have an explicit init method for this. - getSciLanguage(); + setSciLanguage(); return true; } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 4096019a86..eb2b82fdce 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -187,6 +187,8 @@ public: Common::String strSplit(const char *str, const char *sep = "\r----------\r"); kLanguage getSciLanguage(); + void setSciLanguage(kLanguage lang); + void setSciLanguage(); Common::String getSciLanguageString(const char *str, kLanguage lang, kLanguage *lang2 = NULL) const; -- cgit v1.2.3 From 944b511633e793f149e787b3f9cd1502b14d9993 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 11:35:15 +0000 Subject: Fixed regression from commit #49564 svn-id: r49569 --- engines/sci/engine/kmovement.cpp | 2 +- engines/sci/engine/kparse.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index e45e55373b..c30a6e885a 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -464,7 +464,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { reg_t params[2] = { make_reg(0, angle), client }; if (looper.segment) { - invokeSelector(s, looper, SELECTOR(doit), 2, params); + invokeSelector(s, looper, SELECTOR(doit), argc, argv, 2, params); return s->r_acc; } else { // No looper? Fall back to DirLoop diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index bb9a49c7e8..45493a95d2 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -118,7 +118,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, 1); writeSelectorValue(segMan, event, SELECTOR(claimed), 1); - invokeSelector(s, g_sci->getGameObject(), SELECTOR(syntaxFail), 2, params); + invokeSelector(s, g_sci->getGameObject(), SELECTOR(syntaxFail), argc, argv, 2, params); /* Issue warning */ debugC(2, kDebugLevelParser, "Tree building failed"); @@ -141,7 +141,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelParser, "Word unknown: %s", error); /* Issue warning: */ - invokeSelector(s, g_sci->getGameObject(), SELECTOR(wordFail), 2, params); + invokeSelector(s, g_sci->getGameObject(), SELECTOR(wordFail), argc, argv, 2, params); free(error); return make_reg(0, 1); /* Tell them that it didn't work */ } -- cgit v1.2.3 From 711f679b7ffa9b51c2d6a07dab0a1dd7799f155d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 11:43:20 +0000 Subject: camelCase changes svn-id: r49570 --- engines/sci/console.cpp | 10 +++++----- engines/sci/engine/kmisc.cpp | 2 +- engines/sci/engine/savegame.cpp | 4 ++-- engines/sci/engine/state.cpp | 8 ++++---- engines/sci/engine/state.h | 10 +++++----- engines/sci/engine/vm.cpp | 40 ++++++++++++++++++++-------------------- engines/sci/sci.cpp | 4 ++-- 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 098d83a2d3..3f123fa41b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1771,9 +1771,9 @@ bool Console::cmdVMVarlist(int argc, const char **argv) { DebugPrintf("Addresses of variables in the VM:\n"); for (int i = 0; i < 4; i++) { - DebugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(s->variables_seg[i], s->variables[i] - s->variables_base[i]))); - if (s->variables_max) - DebugPrintf(" total %d", s->variables_max[i]); + DebugPrintf("%s vars at %04x:%04x ", varnames[i], PRINT_REG(make_reg(s->variablesSegment[i], s->variables[i] - s->variablesBase[i]))); + if (s->variablesMax) + DebugPrintf(" total %d", s->variablesMax[i]); DebugPrintf("\n"); } @@ -1830,8 +1830,8 @@ bool Console::cmdVMVars(int argc, const char **argv) { return true; } - if ((s->variables_max) && (s->variables_max[vartype] <= idx)) { - DebugPrintf("Max. index is %d (0x%x)\n", s->variables_max[vartype], s->variables_max[vartype]); + if ((s->variablesMax) && (s->variablesMax[vartype] <= idx)) { + DebugPrintf("Max. index is %d (0x%x)\n", s->variablesMax[vartype], s->variablesMax[vartype]); return true; } diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 25fb11d62f..f3d4c8a732 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -188,7 +188,7 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { int retval = 0; // Avoid spurious warning g_system->getTimeAndDate(loc_time); - elapsedTime = g_system->getMillis() - s->game_start_time; + elapsedTime = g_system->getMillis() - s->gameStartTime; int mode = (argc > 0) ? argv[0].toUint16() : 0; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 3cd444d4d7..9c2ff76088 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -872,11 +872,11 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_segMan->reconstructScripts(s); s->_segMan->reconstructClones(); s->initGlobals(); - s->gc_countdown = GC_INTERVAL - 1; + s->gcCountDown = GC_INTERVAL - 1; // Time state: s->lastWaitTime = g_system->getMillis(); - s->game_start_time = g_system->getMillis(); + s->gameStartTime = g_system->getMillis(); #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound._it = NULL; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 8e4a5200c8..68e7eea4a0 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -105,7 +105,7 @@ void EngineState::reset(bool isRestoring) { lastWaitTime = 0; - gc_countdown = 0; + gcCountDown = 0; _throttleCounter = 0; _throttleLastTime = 0; @@ -130,9 +130,9 @@ void EngineState::initGlobals() { if (!script_000->_localsBlock) error("Script 0 has no locals block"); - variables_seg[VAR_GLOBAL] = script_000->_localsSegment; - variables_base[VAR_GLOBAL] = variables[VAR_GLOBAL] = script_000->_localsBlock->_locals.begin(); - variables_max[VAR_GLOBAL] = script_000->_localsBlock->_locals.size(); + variablesSegment[VAR_GLOBAL] = script_000->_localsSegment; + variablesBase[VAR_GLOBAL] = variables[VAR_GLOBAL] = script_000->_localsBlock->_locals.begin(); + variablesMax[VAR_GLOBAL] = script_000->_localsBlock->_locals.size(); } uint16 EngineState::currentRoomNumber() const { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index fd2380667b..1b1a1fa86c 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -111,7 +111,7 @@ public: #endif SoundCommandParser *_soundCmd; - uint32 game_start_time; /**< The time at which the interpreter was started */ + uint32 gameStartTime; /**< The time at which the interpreter was started */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */ void wait(int16 ticks); @@ -147,9 +147,9 @@ public: // Script state ExecStack *xs; reg_t *variables[4]; ///< global, local, temp, param, as immediate pointers - reg_t *variables_base[4]; ///< Used for referencing VM ops - SegmentId variables_seg[4]; ///< Same as above, contains segment IDs - int variables_max[4]; ///< Max. values for all variables + reg_t *variablesBase[4]; ///< Used for referencing VM ops + SegmentId variablesSegment[4]; ///< Same as above, contains segment IDs + int variablesMax[4]; ///< Max. values for all variables int loadFromLauncher; @@ -173,7 +173,7 @@ public: */ void shrinkStackToBase(); - int gc_countdown; /**< Number of kernel calls until next gc */ + int gcCountDown; /**< Number of kernel calls until next gc */ public: MessageState *_msgState; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a203352dcd..1db9649a54 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -230,8 +230,8 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #endif -#define READ_VAR(type, index, def) validate_read_var(s->variables[type], s->stack_base, type, s->variables_max[type], index, __LINE__, def) -#define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variables_max[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) +#define READ_VAR(type, index, def) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, def) +#define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); #define ACC_ARITHMETIC_L(op) make_reg(0, (op validate_arithmetic(s->r_acc))) @@ -629,9 +629,9 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { } } -static void gc_countdown(EngineState *s) { - if (s->gc_countdown-- <= 0) { - s->gc_countdown = s->scriptGCInterval; +static void gcCountDown(EngineState *s) { + if (s->gcCountDown-- <= 0) { + s->gcCountDown = s->scriptGCInterval; run_gc(s); } } @@ -737,8 +737,8 @@ void run_vm(EngineState *s, bool restoring) { if (!restoring) s->executionStackBase = s->_executionStack.size() - 1; - s->variables_seg[VAR_TEMP] = s->variables_seg[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); - s->variables_base[VAR_TEMP] = s->variables_base[VAR_PARAM] = s->stack_base; + s->variablesSegment[VAR_TEMP] = s->variablesSegment[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); + s->variablesBase[VAR_TEMP] = s->variablesBase[VAR_PARAM] = s->stack_base; s->_executionStackPosChanged = true; // Force initialization @@ -776,24 +776,24 @@ void run_vm(EngineState *s, bool restoring) { if (!local_script) { warning("Could not find local script from segment %x", s->xs->local_segment); local_script = NULL; - s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; + s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; #ifndef DISABLE_VALIDATIONS - s->variables_max[VAR_LOCAL] = 0; + s->variablesMax[VAR_LOCAL] = 0; #endif } else { - s->variables_seg[VAR_LOCAL] = local_script->_localsSegment; + s->variablesSegment[VAR_LOCAL] = local_script->_localsSegment; if (local_script->_localsBlock) - s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); + s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); else - s->variables_base[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; + s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; #ifndef DISABLE_VALIDATIONS if (local_script->_localsBlock) - s->variables_max[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); + s->variablesMax[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); else - s->variables_max[VAR_LOCAL] = 0; - s->variables_max[VAR_TEMP] = s->xs->sp - s->xs->fp; - s->variables_max[VAR_PARAM] = s->xs->argc + 1; + s->variablesMax[VAR_LOCAL] = 0; + s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; + s->variablesMax[VAR_PARAM] = s->xs->argc + 1; #endif } s->variables[VAR_TEMP] = s->xs->fp; @@ -821,7 +821,7 @@ void run_vm(EngineState *s, bool restoring) { error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", PRINT_REG(*s->xs->sp), PRINT_REG(*s->xs->fp)); - s->variables_max[VAR_TEMP] = s->xs->sp - s->xs->fp; + s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; if (s->xs->addr.pc.offset >= code_buf_size) error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", @@ -1120,7 +1120,7 @@ void run_vm(EngineState *s, bool restoring) { } case op_callk: { // 0x21 (33) - gc_countdown(s); + gcCountDown(s); s->xs->sp -= (opparams[1] >> 1) + 1; @@ -1295,8 +1295,8 @@ void run_vm(EngineState *s, bool restoring) { var_number = temp & 0x03; // Get variable type // Get variable block offset - r_temp.segment = s->variables_seg[var_number]; - r_temp.offset = s->variables[var_number] - s->variables_base[var_number]; + r_temp.segment = s->variablesSegment[var_number]; + r_temp.offset = s->variables[var_number] - s->variablesBase[var_number]; if (temp & 0x08) // Add accumulator offset if requested r_temp.offset += signed_validate_arithmetic(s->r_acc); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 2b3194830d..9e928b82d9 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -286,7 +286,7 @@ bool SciEngine::initGame() { DataStack *stack = _gamestate->_segMan->allocateStack(VM_STACK_SIZE, NULL); _gamestate->_msgState = new MessageState(_gamestate->_segMan); - _gamestate->gc_countdown = GC_INTERVAL - 1; + _gamestate->gcCountDown = GC_INTERVAL - 1; // Script 0 should always be at segment 1 if (script0Segment != 1) { @@ -325,7 +325,7 @@ bool SciEngine::initGame() { _vocabulary->parser_base = make_reg(_gamestate->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); } - _gamestate->game_start_time = _gamestate->lastWaitTime = g_system->getMillis(); + _gamestate->gameStartTime = _gamestate->lastWaitTime = g_system->getMillis(); srand(g_system->getMillis()); // Initialize random number generator -- cgit v1.2.3 From c8ee854600710f36f09d8375fbe51e1924d97320 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Thu, 10 Jun 2010 13:41:29 +0000 Subject: PSP: switched to psp semaphores rather than SDL's. Removal of SDL is almost complete. svn-id: r49572 --- backends/platform/psp/osys_psp.cpp | 8 ++-- backends/platform/psp/thread.cpp | 84 ++++++++++++++++++++++++++++++++++++++ backends/platform/psp/thread.h | 27 ++++++++++++ 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 48e9044535..b0fb971230 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -346,19 +346,19 @@ void OSystem_PSP::setTimerCallback(TimerProc callback, int interval) { } OSystem::MutexRef OSystem_PSP::createMutex(void) { - return (MutexRef)SDL_CreateMutex(); + return (MutexRef) new PspMutex(true); // start with a full mutex } void OSystem_PSP::lockMutex(MutexRef mutex) { - SDL_mutexP((SDL_mutex *)mutex); + ((PspMutex *)mutex)->lock(); } void OSystem_PSP::unlockMutex(MutexRef mutex) { - SDL_mutexV((SDL_mutex *)mutex); + ((PspMutex *)mutex)->unlock(); } void OSystem_PSP::deleteMutex(MutexRef mutex) { - SDL_DestroyMutex((SDL_mutex *)mutex); + delete (PspMutex *)mutex; } void OSystem_PSP::mixCallback(void *sys, byte *samples, int len) { diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index 4e7d5eada9..684a985fed 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -31,6 +31,8 @@ #include "backends/platform/psp/thread.h" #include "backends/platform/psp/trace.h" +// Class PspThread -------------------------------------------------- + void PspThread::delayMillis(uint32 ms) { sceKernelDelayThread(ms * 1000); } @@ -39,6 +41,88 @@ void PspThread::delayMicros(uint32 us) { sceKernelDelayThread(us); } +// Class PspSemaphore ------------------------------------------------ +//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ +//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ + +#include "backends/platform/psp/trace.h" + +PspSemaphore::PspSemaphore(int initialValue, int maxValue) { + DEBUG_ENTER_FUNC(); + _handle = 0; + _handle = sceKernelCreateSema("ScummVM Sema", 0 /* attr */, + initialValue, maxValue, + 0 /*option*/); + if (!_handle) + PSP_ERROR("failed to create semaphore.\n"); +} + +PspSemaphore::~PspSemaphore() { + DEBUG_ENTER_FUNC(); + if (_handle) + if (sceKernelDeleteSema(_handle) < 0) + PSP_ERROR("failed to delete semaphore.\n"); +} + +int PspSemaphore::numOfWaitingThreads() { + DEBUG_ENTER_FUNC(); + SceKernelSemaInfo info; + info.numWaitThreads = 0; + + if (sceKernelReferSemaStatus(_handle, &info) < 0) + PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); + + return info.numWaitThreads; +} + +int PspSemaphore::getValue() { + DEBUG_ENTER_FUNC(); + SceKernelSemaInfo info; + info.currentCount = 0; + + if (sceKernelReferSemaStatus(_handle, &info) < 0) + PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); + + return info.currentCount; +} + +bool PspSemaphore::pollForValue(int value) { + DEBUG_ENTER_FUNC(); + if (sceKernelPollSema(_handle, value) < 0) + return false; + + return true; +} + +// false: timeout or error +bool PspSemaphore::takeWithTimeOut(int num, uint32 timeOut) { + DEBUG_ENTER_FUNC(); + + uint32 *pTimeOut = 0; + if (timeOut) + pTimeOut = &timeOut; + + if (sceKernelWaitSema(_handle, num, pTimeOut) < 0) + return false; + return true; +} + +bool PspSemaphore::give(int num) { + DEBUG_ENTER_FUNC(); + + if (sceKernelSignalSema(_handle, num) < 0) + return false; + return true; +} + +//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ +//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ + +#include "backends/platform/psp/trace.h" + + +// Class PspRtc --------------------------------------------------------------- + void PspRtc::init() { // init our starting ticks uint32 ticks[2]; sceRtcGetCurrentTick((u64 *)ticks); diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index 380159fa2d..23db8594dc 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -34,6 +34,33 @@ public: static void delayMicros(uint32 us); }; +class PspSemaphore { +private: + SceUID _handle; +public: + PspSemaphore(int initialValue, int maxValue); + ~PspSemaphore(); + bool take(int num) { return takeWithTimeOut(num, 0); } + bool takeWithTimeOut(int num, uint32 timeOut); + bool give(int num); + bool pollForValue(int value); // check for a certain value + int numOfWaitingThreads(); + int getValue(); +}; + +class PspMutex { +private: + PspSemaphore _semaphore; +public: + PspMutex(bool initialValue) : _semaphore(initialValue ? 1 : 0, 255) {} // initial, max value + bool lock() { return _semaphore.take(1); } + bool unlock() { return _semaphore.give(1); } + bool poll() { return _semaphore.pollForValue(1); } + int getNumWaitingThreads() { return _semaphore.numOfWaitingThreads(); } + bool getValue() { return (bool)_semaphore.getValue(); } +}; + + class PspRtc { private: uint32 _startMillis; -- cgit v1.2.3 From afa2af5dfb0214c4aeeb2f21ef43dca5e3886181 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 13:43:38 +0000 Subject: SCI: cleanup svn-id: r49573 --- engines/sci/console.cpp | 2 +- engines/sci/engine/kernel.h | 1 - engines/sci/engine/selector.cpp | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 3f123fa41b..c2ea377f9b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2370,7 +2370,7 @@ bool Console::cmdSend(int argc, const char **argv) { return true; } - SelectorType selector_type = lookupSelector(_engine->_gamestate->_segMan, object, selectorId, 0, 0); + SelectorType selector_type = lookupSelector(_engine->_gamestate->_segMan, object, selectorId, NULL, NULL); if (selector_type == kSelectorNone) { DebugPrintf("Object does not support selector: \"%s\"\n", selector_name); diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 990e2aff17..c5513f1240 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -258,7 +258,6 @@ private: ResourceManager *_resMan; SegManager *_segMan; - uint32 features; // Kernel-related lists Common::StringArray _selectorNames; diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index eafed029c5..15b008430b 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -204,14 +204,13 @@ void invokeSelector(EngineState *s, reg_t object, int selectorId, int k_argc, StackPtr k_argp, int argc, const reg_t *argv) { int i; int framesize = 2 + 1 * argc; - reg_t address; int slc_type; StackPtr stackframe = k_argp + k_argc; stackframe[0] = make_reg(0, selectorId); // The selector we want to call stackframe[1] = make_reg(0, argc); // Argument count - slc_type = lookupSelector(s->_segMan, object, selectorId, NULL, &address); + slc_type = lookupSelector(s->_segMan, object, selectorId, NULL, NULL); if (slc_type == kSelectorNone) { error("Selector '%s' of object at %04x:%04x could not be invoked", -- cgit v1.2.3 From d89da56f471735b50a5eafbf9ee9eeb0c190f4eb Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Thu, 10 Jun 2010 14:01:30 +0000 Subject: PSP: swapped order of checks in renderAll. It's a little cheaper this way. svn-id: r49574 --- backends/platform/psp/display_manager.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index 5c9f8f92f0..15e0188ebf 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -322,9 +322,7 @@ bool DisplayManager::renderAll() { } #endif /* USE_DISPLAY_CALLBACK */ - if (!isTimeToUpdate()) - return false; // didn't render - + // This is cheaper than checking time, so we do it first if (!_screen->isDirty() && (!_overlay->isDirty()) && (!_cursor->isDirty()) && @@ -333,6 +331,9 @@ bool DisplayManager::renderAll() { return true; // nothing to render } + if (!isTimeToUpdate()) + return false; // didn't render + PSP_DEBUG_PRINT("screen[%s], overlay[%s], cursor[%s], keyboard[%s]\n", _screen->isDirty() ? "true" : "false", _overlay->isDirty() ? "true" : "false", -- cgit v1.2.3 From 5330e632de917d603a6d246d53f4ed4e5bdf51ec Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 14:02:20 +0000 Subject: Don't attempt to modify the printLang selector if it doesn't exist svn-id: r49575 --- engines/sci/engine/state.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 68e7eea4a0..41f263bb62 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -275,7 +275,8 @@ kLanguage SciEngine::getSciLanguage() { } void SciEngine::setSciLanguage(kLanguage lang) { - writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang); + if (SELECTOR(printLang) != -1) + writeSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(printLang), lang); } void SciEngine::setSciLanguage() { -- cgit v1.2.3 From 6ad04a4a96b0290125e33535f84a98e4d79dff2c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 10 Jun 2010 15:06:25 +0000 Subject: Add support for AIFF sound in SCI32 Mac games and add support for AIFF/WAVE audio36 patches; minor cleanup. svn-id: r49576 --- engines/sci/resource.cpp | 72 +++++++++++++++++++++++------------------- engines/sci/resource.h | 3 +- engines/sci/resource_audio.cpp | 63 ++++++++++++++++++------------------ engines/sci/sound/audio.cpp | 24 +++++++++++--- 4 files changed, 90 insertions(+), 72 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 307b4e888e..0b7badb8f7 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -481,6 +481,7 @@ int ResourceManager::addAppropriateSources() { addPatchDir("Robot Folder"); addPatchDir("Sound Folder"); addPatchDir("Voices Folder"); + addPatchDir("Voices"); //addPatchDir("VMD Folder"); // There can also be a "Patches" resource fork with patches @@ -620,11 +621,11 @@ void ResourceManager::scanNewSources() { switch (source->source_type) { case kSourceDirectory: readResourcePatches(source); -#ifdef ENABLE_SCI32 + // We can't use getSciVersion() at this point, thus using _volVersion if (_volVersion >= kResVersionSci11) // SCI1.1+ readResourcePatchesBase36(source); -#endif + readWaveAudioPatches(); break; case kSourceExtMap: @@ -1070,18 +1071,14 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { // version-agnostic patch application void ResourceManager::processPatch(ResourceSource *source, ResourceType resourceType, uint16 resourceNr, uint32 tuple) { Common::SeekableReadStream *fileStream = 0; - Resource *newrsc; + Resource *newrsc = 0; ResourceId resId = ResourceId(resourceType, resourceNr, tuple); ResourceType checkForType = resourceType; - byte patchType, patchDataOffset; - int fsize; - uint32 audio36Header = 0; // base36 encoded patches (i.e. audio36 and sync36) have the same type as their non-base36 encoded counterparts if (checkForType == kResourceTypeAudio36) checkForType = kResourceTypeAudio; - - if (checkForType == kResourceTypeSync36) + else if (checkForType == kResourceTypeSync36) checkForType = kResourceTypeSync; if (source->resourceFile) { @@ -1094,18 +1091,15 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource } fileStream = file; } - fsize = fileStream->size(); + + int fsize = fileStream->size(); if (fsize < 3) { debug("Patching %s failed - file too small", source->location_name.c_str()); return; } - patchType = fileStream->readByte() & 0x7F; - patchDataOffset = fileStream->readByte(); - - if (resourceType == kResourceTypeAudio36) { - audio36Header = fileStream->readUint32BE(); - } + byte patchType = fileStream->readByte() & 0x7F; + byte patchDataOffset = fileStream->readByte(); delete fileStream; @@ -1114,13 +1108,6 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource return; } - if (resourceType == kResourceTypeAudio36) { - if (audio36Header != MKID_BE('SOL\x00')) { - debug("Patching %s failed - audio36 patch doesn't have SOL header", source->location_name.c_str()); - return; - } - } - // Fixes SQ5/German, patch file special case logic taken from SCI View disassembly if (patchDataOffset & 0x80) { switch (patchDataOffset & 0x7F) { @@ -1144,12 +1131,14 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource source->location_name.c_str(), patchDataOffset + 2, fsize); return; } + // Prepare destination, if neccessary if (_resMap.contains(resId) == false) { newrsc = new Resource; _resMap.setVal(resId, newrsc); } else newrsc = _resMap.getVal(resId); + // Overwrite everything, because we're patching newrsc->_id = resId; newrsc->_status = kResStatusNoMalloc; @@ -1160,8 +1149,6 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource debugC(1, kDebugLevelResMan, "Patching %s - OK", source->location_name.c_str()); } -#ifdef ENABLE_SCI32 - void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { // The base36 encoded audio36 and sync36 resources use a different naming scheme, because they // cannot be described with a single resource number, but are a result of a @@ -1192,19 +1179,20 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { name = (*x)->getName(); + inputName = (*x)->getName(); inputName.toUppercase(); - inputName.deleteChar(0); // delete the first character (type) inputName.deleteChar(7); // delete the dot // The base36 encoded resource contains the following: // uint16 resourceId, byte noun, byte verb, byte cond, byte seq - uint16 resourceNr = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters - uint16 noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters - uint16 verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters - uint16 cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters - uint16 seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character + uint16 resourceNr = strtol(Common::String(inputName.c_str(), 3).c_str(), 0, 36); // 3 characters + uint16 noun = strtol(Common::String(inputName.c_str() + 3, 2).c_str(), 0, 36); // 2 characters + uint16 verb = strtol(Common::String(inputName.c_str() + 5, 2).c_str(), 0, 36); // 2 characters + uint16 cond = strtol(Common::String(inputName.c_str() + 7, 2).c_str(), 0, 36); // 2 characters + uint16 seq = strtol(Common::String(inputName.c_str() + 9, 1).c_str(), 0, 36); // 1 character + // Check, if we got valid results if ((noun <= 255) && (verb <= 255) && (cond <= 255) && (seq <= 255)) { ResourceId resource36((ResourceType)i, resourceNr, noun, verb, cond, seq); @@ -1216,6 +1204,28 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { debug("sync36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); */ + // Make sure that the audio patch is a valid resource + if (i == kResourceTypeAudio36) { + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name); + uint32 tag = stream->readUint32BE(); + + if (tag == MKID_BE('RIFF') || tag == MKID_BE('FORM')) { + delete stream; + processWavePatch(resource36, name); + continue; + } + + // Check for SOL as well + tag = (tag << 16) | stream->readUint16BE(); + + if (tag != MKID_BE('SOL\0')) { + delete stream; + continue; + } + + delete stream; + } + psrcPatch = new ResourceSource; psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; @@ -1226,8 +1236,6 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { } } -#endif - void ResourceManager::readResourcePatches(ResourceSource *source) { // Note: since some SCI1 games(KQ5 floppy, SQ4) might use SCI0 naming scheme for patch files // this function tries to read patch file with any supported naming scheme, diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 533c81bdf5..66742f11f5 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -452,15 +452,14 @@ protected: * Reads patch files from a local directory. */ void readResourcePatches(ResourceSource *source); -#ifdef ENABLE_SCI32 void readResourcePatchesBase36(ResourceSource *source); -#endif void processPatch(ResourceSource *source, ResourceType resourceType, uint16 resourceNr, uint32 tuple = 0); /** * Process wave files as patches for Audio resources */ void readWaveAudioPatches(); + void processWavePatch(ResourceId resourceId, Common::String name); /** * Applies to all versions before 0.000.395 (i.e. KQ4 old, XMAS 1988 and LSL2). diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 2a5b56d4bc..861866edc0 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -162,6 +162,34 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { } } +void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { + ResourceSource *resSrc = new ResourceSource; + resSrc->source_type = kSourceWave; + resSrc->resourceFile = 0; + resSrc->location_name = name; + resSrc->volume_number = 0; + resSrc->audioCompressionType = 0; + + Resource *newRes = 0; + + if (_resMap.contains(resourceId)) { + newRes = _resMap.getVal(resourceId); + } else { + newRes = new Resource; + _resMap.setVal(resourceId, newRes); + } + + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name); + newRes->size = stream->size(); + delete stream; + + newRes->_id = resourceId; + newRes->_status = kResStatusNoMalloc; + newRes->_source = resSrc; + newRes->_headerSize = 0; + debugC(1, kDebugLevelResMan, "Patching %s - OK", name.c_str()); +} + void ResourceManager::readWaveAudioPatches() { // Here we do check for SCI1.1+ so we can patch wav files in as audio resources Common::ArchiveMemberList files; @@ -170,39 +198,8 @@ void ResourceManager::readWaveAudioPatches() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { Common::String name = (*x)->getName(); - if (isdigit(name[0])) { - int number = atoi(name.c_str()); - ResourceSource *psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourceWave; - psrcPatch->resourceFile = 0; - psrcPatch->location_name = name; - psrcPatch->volume_number = 0; - psrcPatch->audioCompressionType = 0; - - ResourceId resId = ResourceId(kResourceTypeAudio, number); - - Resource *newrsc = NULL; - - // Prepare destination, if neccessary - if (_resMap.contains(resId) == false) { - newrsc = new Resource; - _resMap.setVal(resId, newrsc); - } else - newrsc = _resMap.getVal(resId); - - // Get the size of the file - Common::SeekableReadStream *stream = (*x)->createReadStream(); - uint32 fileSize = stream->size(); - delete stream; - - // Overwrite everything, because we're patching - newrsc->_id = resId; - newrsc->_status = kResStatusNoMalloc; - newrsc->_source = psrcPatch; - newrsc->size = fileSize; - newrsc->_headerSize = 0; - debugC(1, kDebugLevelResMan, "Patching %s - OK", psrcPatch->location_name.c_str()); - } + if (isdigit(name[0])) + processWavePatch(ResourceId(kResourceTypeAudio, atoi(name.c_str())), name); } } diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 7748c0505b..f10cc5ed68 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -24,21 +24,22 @@ */ #include "sci/resource.h" -#include "sci/engine/selector.h" #include "sci/engine/kernel.h" +#include "sci/engine/selector.h" #include "sci/engine/seg_manager.h" #include "sci/sound/audio.h" -#include "common/system.h" #include "common/file.h" +#include "common/system.h" -#include "sound/audiostream.h" #include "sound/audiocd.h" -#include "sound/decoders/raw.h" -#include "sound/decoders/wave.h" +#include "sound/audiostream.h" +#include "sound/decoders/aiff.h" #include "sound/decoders/flac.h" #include "sound/decoders/mp3.h" +#include "sound/decoders/raw.h" #include "sound/decoders/vorbis.h" +#include "sound/decoders/wave.h" namespace Sci { @@ -287,6 +288,19 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 waveStream->seek(0, SEEK_SET); audioStream = Audio::makeWAVStream(waveStream, DisposeAfterUse::YES); + } else if (audioRes->size > 4 && READ_BE_UINT32(audioRes->data) == MKID_BE('FORM')) { + // AIFF detected + Common::MemoryReadStream *waveStream = new Common::MemoryReadStream(audioRes->data, audioRes->size, DisposeAfterUse::NO); + + // Calculate samplelen from AIFF header + int waveSize = 0, waveRate = 0; + byte waveFlags = 0; + Audio::loadAIFFFromStream(*waveStream, waveSize, waveRate, waveFlags); + *sampleLen = (waveFlags & Audio::FLAG_16BITS ? waveSize >> 1 : waveSize) * 60 / waveRate; + + waveStream->seek(0, SEEK_SET); + audioStream = Audio::makeAIFFStream(*waveStream); + delete waveStream; // makeAIFFStream doesn't handle this for us } else if (audioRes->size > 14 && READ_BE_UINT16(audioRes->data) == 1 && READ_BE_UINT16(audioRes->data + 2) == 1 && READ_BE_UINT16(audioRes->data + 4) == 5 && READ_BE_UINT32(audioRes->data + 10) == 0x00018051) { // Mac snd detected -- cgit v1.2.3 From 8295eb09cd7f0a62359631ab4b1975b2b6364bf3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 15:25:18 +0000 Subject: SCI: Fix Console::cmdValueType to handle all possible reg types svn-id: r49577 --- engines/sci/console.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index c2ea377f9b..f5a1880bf5 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1911,9 +1911,11 @@ bool Console::cmdValueType(int argc, const char **argv) { break; case KSIG_ARITHMETIC: DebugPrintf("Arithmetic"); + case KSIG_ARITHMETIC | KSIG_NULL: + DebugPrintf("Null"); break; default: - DebugPrintf("Erroneous unknown type %02x(%d decimal)\n", t, t); + DebugPrintf("Erroneous unknown type 0x%02x (%d decimal)\n", t, t); } return true; -- cgit v1.2.3 From 874151f5d12d86557dbea3bde180dbba0dfd4a2c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 15:25:36 +0000 Subject: SCI: Cleanup kernel signature code a bit. * Moved KSIG_SPEC_* from kernel.h to kernel.cpp * Clarified the comment on KSIG_SPEC_* a bit * Changed the other KSIG_ #defines into an enum * Removed KSIG_TERMINATOR and KSIG_SPEC_ARITMETIC (sic) svn-id: r49578 --- engines/sci/engine/kernel.cpp | 23 +++++++++++++++++++++-- engines/sci/engine/kernel.h | 40 ++++++++++++---------------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2315dc384f..33a4d68c88 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -33,6 +33,26 @@ namespace Sci { +// Uncompiled kernel signatures are formed from a string of letters. +// each corresponding to a type of a parameter (see below). +// Use small letters to indicate end of sum type. +// Use capital letters for sum types, e.g. +// "LNoLr" for a function which takes two arguments: +// (1) list, node or object +// (2) list or ref +#define KSIG_SPEC_LIST 'l' +#define KSIG_SPEC_NODE 'n' +#define KSIG_SPEC_OBJECT 'o' +#define KSIG_SPEC_REF 'r' // Said Specs and strings +#define KSIG_SPEC_ARITHMETIC 'i' +#define KSIG_SPEC_NULL 'z' +#define KSIG_SPEC_ANY '.' +#define KSIG_SPEC_ELLIPSIS '*' // Arbitrarily more TYPED arguments + +#define KSIG_SPEC_SUM_DONE ('a' - 'A') + + + // Default kernel name table #define SCI_KNAMES_DEFAULT_ENTRIES_NR 0x89 @@ -538,8 +558,7 @@ static void kernel_compile_signature(const char **s) { break; default: - error("INTERNAL ERROR when compiling kernel function signature '%s': (%02x) not understood (aka" - " '%c')\n", *s, c, c); + error("ERROR compiling kernel function signature '%s': (%02x / '%c') not understood", *s, c, c); } } while (*src && (*src == KSIG_SPEC_ELLIPSIS || (c < 'a' && c != KSIG_SPEC_ANY))); diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index c5513f1240..fc4b51f4ee 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -95,36 +95,20 @@ struct List; // from segment.h //#define DISABLE_VALIDATIONS // enable to stop validation checks // ---- Kernel signatures ----------------------------------------------------- -#define KSIG_TERMINATOR 0 - -// Uncompiled signatures -#define KSIG_SPEC_ARITMETIC 'i' -#define KSIG_SPEC_LIST 'l' -#define KSIG_SPEC_NODE 'n' -#define KSIG_SPEC_OBJECT 'o' -#define KSIG_SPEC_REF 'r' // Said Specs and strings -#define KSIG_SPEC_ARITHMETIC 'i' -#define KSIG_SPEC_NULL 'z' -#define KSIG_SPEC_ANY '.' -#define KSIG_SPEC_ELLIPSIS '*' // Arbitrarily more TYPED arguments - -#define KSIG_SPEC_SUM_DONE ('a' - 'A') // Use small letters to indicate end of sum type -/* Use capital letters for sum types, e.g. -** "LNoLr" for a function which takes two arguments: -** (1) list, node or object -** (2) list or ref -*/ + // Compiled signatures -#define KSIG_LIST 0x01 -#define KSIG_NODE 0x02 -#define KSIG_OBJECT 0x04 -#define KSIG_REF 0x08 -#define KSIG_ARITHMETIC 0x10 - -#define KSIG_NULL 0x40 -#define KSIG_ANY 0x5f -#define KSIG_ELLIPSIS 0x80 +enum { + KSIG_LIST = 0x01, + KSIG_NODE = 0x02, + KSIG_OBJECT = 0x04, + KSIG_REF = 0x08, + KSIG_ARITHMETIC = 0x10, + KSIG_NULL = 0x40, + KSIG_ANY = 0x5f, + KSIG_ELLIPSIS = 0x80 +}; + // ---------------------------------------------------------------------------- /* Generic description: */ -- cgit v1.2.3 From 5424d8aecb0d2c078aa8e18e94a2ac104d4bf039 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 15:25:54 +0000 Subject: SCI: Get rid of DEFUN, cleanup svn-id: r49579 --- engines/sci/engine/kernel.cpp | 405 +++++++++++++++++++++--------------------- 1 file changed, 199 insertions(+), 206 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 33a4d68c88..011dd0802e 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -53,10 +53,8 @@ namespace Sci { -// Default kernel name table -#define SCI_KNAMES_DEFAULT_ENTRIES_NR 0x89 - -static const char *sci_default_knames[SCI_KNAMES_DEFAULT_ENTRIES_NR] = { +/** Default kernel name table. */ +static const char *s_defaultKernelNames[] = { /*0x00*/ "Load", /*0x01*/ "UnLoad", /*0x02*/ "ScriptID", @@ -207,205 +205,203 @@ struct SciKernelFunction { const char *signature; /* kfunct signature */ }; -#define DEFUN(name, fun, sig) {name, fun, sig} - SciKernelFunction kfunct_mappers[] = { - /*00*/ DEFUN("Load", kLoad, "iii*"), - /*01*/ DEFUN("UnLoad", kUnLoad, "i.*"), // Work around SQ1 bug, when exiting the Ulence flats bar - /*02*/ DEFUN("ScriptID", kScriptID, "Ioi*"), - /*03*/ DEFUN("DisposeScript", kDisposeScript, "Oii*"), // Work around QfG1 bug - /*04*/ DEFUN("Clone", kClone, "o"), - /*05*/ DEFUN("DisposeClone", kDisposeClone, "o"), - /*06*/ DEFUN("IsObject", kIsObject, "."), - /*07*/ DEFUN("RespondsTo", kRespondsTo, ".i"), - /*08*/ DEFUN("DrawPic", kDrawPic, "i*"), - - /*0a*/ DEFUN("PicNotValid", kPicNotValid, "i*"), - /*0b*/ DEFUN("Animate", kAnimate, "LI*"), // More like (li?)? - /*0c*/ DEFUN("SetNowSeen", kSetNowSeen, "oi*"), // The second parameter is ignored - /*0d*/ DEFUN("NumLoops", kNumLoops, "o"), - /*0e*/ DEFUN("NumCels", kNumCels, "o"), - /*0f*/ DEFUN("CelWide", kCelWide, "iOi*"), - /*10*/ DEFUN("CelHigh", kCelHigh, "iOi*"), - /*11*/ DEFUN("DrawCel", kDrawCel, "iiiiii*i*r*"), - /*12*/ DEFUN("AddToPic", kAddToPic, "Il*"), + /*00*/ { "Load", kLoad, "iii*" }, + /*01*/ { "UnLoad", kUnLoad, "i.*" }, // Work around SQ1 bug, when exiting the Ulence flats bar + /*02*/ { "ScriptID", kScriptID, "Ioi*" }, + /*03*/ { "DisposeScript", kDisposeScript, "Oii*" }, // Work around QfG1 bug + /*04*/ { "Clone", kClone, "o" }, + /*05*/ { "DisposeClone", kDisposeClone, "o" }, + /*06*/ { "IsObject", kIsObject, "." }, + /*07*/ { "RespondsTo", kRespondsTo, ".i" }, + /*08*/ { "DrawPic", kDrawPic, "i*" }, + + /*0a*/ { "PicNotValid", kPicNotValid, "i*" }, + /*0b*/ { "Animate", kAnimate, "LI*" }, // More like (li?)? + /*0c*/ { "SetNowSeen", kSetNowSeen, "oi*" }, // The second parameter is ignored + /*0d*/ { "NumLoops", kNumLoops, "o" }, + /*0e*/ { "NumCels", kNumCels, "o" }, + /*0f*/ { "CelWide", kCelWide, "iOi*" }, + /*10*/ { "CelHigh", kCelHigh, "iOi*" }, + /*11*/ { "DrawCel", kDrawCel, "iiiiii*i*r*" }, + /*12*/ { "AddToPic", kAddToPic, "Il*" }, // FIXME: signature check removed (set to .*) as kNewWindow is different in Mac versions - /*13*/ DEFUN("NewWindow", kNewWindow, "*."), - ///*13*/ DEFUN("NewWindow", kNewWindow, "iiiiZRi*"), - /*14*/ DEFUN("GetPort", kGetPort, ""), - /*15*/ DEFUN("SetPort", kSetPort, "ii*"), - /*16*/ DEFUN("DisposeWindow", kDisposeWindow, "ii*"), - /*17*/ DEFUN("DrawControl", kDrawControl, "o"), - /*18*/ DEFUN("HiliteControl", kHiliteControl, "o"), - /*19*/ DEFUN("EditControl", kEditControl, "ZoZo"), - /*1a*/ DEFUN("TextSize", kTextSize, "rZrii*r*"), - /*1b*/ DEFUN("Display", kDisplay, ".*"), - /*1c*/ DEFUN("GetEvent", kGetEvent, "ioi*"), // Mac versions pass an extra 3rd parameter (ignored - always 0?) - /*1d*/ DEFUN("GlobalToLocal", kGlobalToLocal, "oo*"), - /*1e*/ DEFUN("LocalToGlobal", kLocalToGlobal, "oo*"), - /*1f*/ DEFUN("MapKeyToDir", kMapKeyToDir, "o"), - /*20*/ DEFUN("DrawMenuBar", kDrawMenuBar, "i"), - /*21*/ DEFUN("MenuSelect", kMenuSelect, "oi*"), - /*22*/ DEFUN("AddMenu", kAddMenu, "rr"), - /*23*/ DEFUN("DrawStatus", kDrawStatus, "Zri*"), - /*24*/ DEFUN("Parse", kParse, "ro"), - /*25*/ DEFUN("Said", kSaid, "Zr"), - /*26*/ DEFUN("SetSynonyms", kSetSynonyms, "o"), - /*27*/ DEFUN("HaveMouse", kHaveMouse, ""), - /*28*/ DEFUN("SetCursor", kSetCursor, "i*"), + /*13*/ { "NewWindow", kNewWindow, "*." }, + ///*13*/ { "NewWindow", kNewWindow, "iiiiZRi*" }, + /*14*/ { "GetPort", kGetPort, "" }, + /*15*/ { "SetPort", kSetPort, "ii*" }, + /*16*/ { "DisposeWindow", kDisposeWindow, "ii*" }, + /*17*/ { "DrawControl", kDrawControl, "o" }, + /*18*/ { "HiliteControl", kHiliteControl, "o" }, + /*19*/ { "EditControl", kEditControl, "ZoZo" }, + /*1a*/ { "TextSize", kTextSize, "rZrii*r*" }, + /*1b*/ { "Display", kDisplay, ".*" }, + /*1c*/ { "GetEvent", kGetEvent, "ioi*" }, // Mac versions pass an extra 3rd parameter (ignored - always 0?) + /*1d*/ { "GlobalToLocal", kGlobalToLocal, "oo*" }, + /*1e*/ { "LocalToGlobal", kLocalToGlobal, "oo*" }, + /*1f*/ { "MapKeyToDir", kMapKeyToDir, "o" }, + /*20*/ { "DrawMenuBar", kDrawMenuBar, "i" }, + /*21*/ { "MenuSelect", kMenuSelect, "oi*" }, + /*22*/ { "AddMenu", kAddMenu, "rr" }, + /*23*/ { "DrawStatus", kDrawStatus, "Zri*" }, + /*24*/ { "Parse", kParse, "ro" }, + /*25*/ { "Said", kSaid, "Zr" }, + /*26*/ { "SetSynonyms", kSetSynonyms, "o" }, + /*27*/ { "HaveMouse", kHaveMouse, "" }, + /*28*/ { "SetCursor", kSetCursor, "i*" }, // FIXME: The number 0x28 occurs twice :-) - /*28*/ DEFUN("MoveCursor", kMoveCursor, "ii"), - /*29*/ DEFUN("FOpen", kFOpen, "ri"), - /*2a*/ DEFUN("FPuts", kFPuts, "ir"), - /*2b*/ DEFUN("FGets", kFGets, "rii"), - /*2c*/ DEFUN("FClose", kFClose, "i"), - /*2d*/ DEFUN("SaveGame", kSaveGame, "rirr*"), - /*2e*/ DEFUN("RestoreGame", kRestoreGame, "rir*"), - /*2f*/ DEFUN("RestartGame", kRestartGame, ""), - /*30*/ DEFUN("GameIsRestarting", kGameIsRestarting, "i*"), - /*31*/ DEFUN("DoSound", kDoSound, "iIo*"), - /*32*/ DEFUN("NewList", kNewList, ""), - /*33*/ DEFUN("DisposeList", kDisposeList, "l"), - /*34*/ DEFUN("NewNode", kNewNode, ".."), - /*35*/ DEFUN("FirstNode", kFirstNode, "Zl"), - /*36*/ DEFUN("LastNode", kLastNode, "l"), - /*37*/ DEFUN("EmptyList", kEmptyList, "l"), - /*38*/ DEFUN("NextNode", kNextNode, "n"), - /*39*/ DEFUN("PrevNode", kPrevNode, "n"), - /*3a*/ DEFUN("NodeValue", kNodeValue, "Zn"), - /*3b*/ DEFUN("AddAfter", kAddAfter, "lnn"), - /*3c*/ DEFUN("AddToFront", kAddToFront, "ln"), - /*3d*/ DEFUN("AddToEnd", kAddToEnd, "ln"), - /*3e*/ DEFUN("FindKey", kFindKey, "l."), - /*3f*/ DEFUN("DeleteKey", kDeleteKey, "l."), - /*40*/ DEFUN("Random", kRandom, "i*"), - /*41*/ DEFUN("Abs", kAbs, "Oi"), - /*42*/ DEFUN("Sqrt", kSqrt, "i"), - /*43*/ DEFUN("GetAngle", kGetAngle, "iiiii*"), // occasionally KQ6 passes a 5th argument by mistake - /*44*/ DEFUN("GetDistance", kGetDistance, "iiiii*"), - /*45*/ DEFUN("Wait", kWait, "i"), - /*46*/ DEFUN("GetTime", kGetTime, "i*"), - /*47*/ DEFUN("StrEnd", kStrEnd, "r"), - /*48*/ DEFUN("StrCat", kStrCat, "rr"), - /*49*/ DEFUN("StrCmp", kStrCmp, "rri*"), - /*4a*/ DEFUN("StrLen", kStrLen, "Zr"), - /*4b*/ DEFUN("StrCpy", kStrCpy, "rZri*"), - /*4c*/ DEFUN("Format", kFormat, "r.*"), - /*4d*/ DEFUN("GetFarText", kGetFarText, "iiZr"), - /*4e*/ DEFUN("ReadNumber", kReadNumber, "r"), - /*4f*/ DEFUN("BaseSetter", kBaseSetter, "o"), - /*50*/ DEFUN("DirLoop", kDirLoop, "oi"), + /*28*/ { "MoveCursor", kMoveCursor, "ii" }, + /*29*/ { "FOpen", kFOpen, "ri" }, + /*2a*/ { "FPuts", kFPuts, "ir" }, + /*2b*/ { "FGets", kFGets, "rii" }, + /*2c*/ { "FClose", kFClose, "i" }, + /*2d*/ { "SaveGame", kSaveGame, "rirr*" }, + /*2e*/ { "RestoreGame", kRestoreGame, "rir*" }, + /*2f*/ { "RestartGame", kRestartGame, "" }, + /*30*/ { "GameIsRestarting", kGameIsRestarting, "i*" }, + /*31*/ { "DoSound", kDoSound, "iIo*" }, + /*32*/ { "NewList", kNewList, "" }, + /*33*/ { "DisposeList", kDisposeList, "l" }, + /*34*/ { "NewNode", kNewNode, ".." }, + /*35*/ { "FirstNode", kFirstNode, "Zl" }, + /*36*/ { "LastNode", kLastNode, "l" }, + /*37*/ { "EmptyList", kEmptyList, "l" }, + /*38*/ { "NextNode", kNextNode, "n" }, + /*39*/ { "PrevNode", kPrevNode, "n" }, + /*3a*/ { "NodeValue", kNodeValue, "Zn" }, + /*3b*/ { "AddAfter", kAddAfter, "lnn" }, + /*3c*/ { "AddToFront", kAddToFront, "ln" }, + /*3d*/ { "AddToEnd", kAddToEnd, "ln" }, + /*3e*/ { "FindKey", kFindKey, "l." }, + /*3f*/ { "DeleteKey", kDeleteKey, "l." }, + /*40*/ { "Random", kRandom, "i*" }, + /*41*/ { "Abs", kAbs, "Oi" }, + /*42*/ { "Sqrt", kSqrt, "i" }, + /*43*/ { "GetAngle", kGetAngle, "iiiii*" }, // occasionally KQ6 passes a 5th argument by mistake + /*44*/ { "GetDistance", kGetDistance, "iiiii*" }, + /*45*/ { "Wait", kWait, "i" }, + /*46*/ { "GetTime", kGetTime, "i*" }, + /*47*/ { "StrEnd", kStrEnd, "r" }, + /*48*/ { "StrCat", kStrCat, "rr" }, + /*49*/ { "StrCmp", kStrCmp, "rri*" }, + /*4a*/ { "StrLen", kStrLen, "Zr" }, + /*4b*/ { "StrCpy", kStrCpy, "rZri*" }, + /*4c*/ { "Format", kFormat, "r.*" }, + /*4d*/ { "GetFarText", kGetFarText, "iiZr" }, + /*4e*/ { "ReadNumber", kReadNumber, "r" }, + /*4f*/ { "BaseSetter", kBaseSetter, "o" }, + /*50*/ { "DirLoop", kDirLoop, "oi" }, // Opcode 51 is defined twice for a reason: In older SCI versions // it is CanBeHere, whereas in newer version it is CantBeHere - /*51*/ DEFUN("CanBeHere", kCanBeHere, "ol*"), - /*51*/ DEFUN("CantBeHere", kCantBeHere, "ol*"), - /*52*/ DEFUN("OnControl", kOnControl, "i*"), - /*53*/ DEFUN("InitBresen", kInitBresen, "oi*"), - /*54*/ DEFUN("DoBresen", kDoBresen, "o"), - /*55*/ DEFUN("DoAvoider", kDoAvoider, "o"), - /*56*/ DEFUN("SetJump", kSetJump, "oiii"), - /*57*/ DEFUN("SetDebug", kSetDebug, "i*"), - /*5c*/ DEFUN("MemoryInfo", kMemoryInfo, "i"), - /*5f*/ DEFUN("GetMenu", kGetMenu, "i."), - /*60*/ DEFUN("SetMenu", kSetMenu, "i.*"), - /*61*/ DEFUN("GetSaveFiles", kGetSaveFiles, "rrr"), - /*62*/ DEFUN("GetCWD", kGetCWD, "r"), - /*63*/ DEFUN("CheckFreeSpace", kCheckFreeSpace, "r.*"), - /*64*/ DEFUN("ValidPath", kValidPath, "r"), - /*65*/ DEFUN("CoordPri", kCoordPri, "ii*"), - /*66*/ DEFUN("StrAt", kStrAt, "rii*"), - /*67*/ DEFUN("DeviceInfo", kDeviceInfo, "i.*"), - /*68*/ DEFUN("GetSaveDir", kGetSaveDir, ".*"), // accepts a parameter in SCI2+ games - /*69*/ DEFUN("CheckSaveGame", kCheckSaveGame, ".*"), - /*6a*/ DEFUN("ShakeScreen", kShakeScreen, "ii*"), - /*6b*/ DEFUN("FlushResources", kFlushResources, "i"), - /*6c*/ DEFUN("TimesSin", kTimesSin, "ii"), - /*6d*/ DEFUN("TimesCos", kTimesCos, "ii"), - /*6e*/ DEFUN("6e", kTimesSin, "ii"), - /*6f*/ DEFUN("6f", kTimesCos, "ii"), - /*70*/ DEFUN("Graph", kGraph, ".*"), - /*71*/ DEFUN("Joystick", kJoystick, ".*"), + /*51*/ { "CanBeHere", kCanBeHere, "ol*" }, + /*51*/ { "CantBeHere", kCantBeHere, "ol*" }, + /*52*/ { "OnControl", kOnControl, "i*" }, + /*53*/ { "InitBresen", kInitBresen, "oi*" }, + /*54*/ { "DoBresen", kDoBresen, "o" }, + /*55*/ { "DoAvoider", kDoAvoider, "o" }, + /*56*/ { "SetJump", kSetJump, "oiii" }, + /*57*/ { "SetDebug", kSetDebug, "i*" }, + /*5c*/ { "MemoryInfo", kMemoryInfo, "i" }, + /*5f*/ { "GetMenu", kGetMenu, "i." }, + /*60*/ { "SetMenu", kSetMenu, "i.*" }, + /*61*/ { "GetSaveFiles", kGetSaveFiles, "rrr" }, + /*62*/ { "GetCWD", kGetCWD, "r" }, + /*63*/ { "CheckFreeSpace", kCheckFreeSpace, "r.*" }, + /*64*/ { "ValidPath", kValidPath, "r" }, + /*65*/ { "CoordPri", kCoordPri, "ii*" }, + /*66*/ { "StrAt", kStrAt, "rii*" }, + /*67*/ { "DeviceInfo", kDeviceInfo, "i.*" }, + /*68*/ { "GetSaveDir", kGetSaveDir, ".*" }, // accepts a parameter in SCI2+ games + /*69*/ { "CheckSaveGame", kCheckSaveGame, ".*" }, + /*6a*/ { "ShakeScreen", kShakeScreen, "ii*" }, + /*6b*/ { "FlushResources", kFlushResources, "i" }, + /*6c*/ { "TimesSin", kTimesSin, "ii" }, + /*6d*/ { "TimesCos", kTimesCos, "ii" }, + /*6e*/ { "6e", kTimesSin, "ii" }, + /*6f*/ { "6f", kTimesCos, "ii" }, + /*70*/ { "Graph", kGraph, ".*" }, + /*71*/ { "Joystick", kJoystick, ".*" }, // Experimental functions - /*74*/ DEFUN("FileIO", kFileIO, "i.*"), - /*(?)*/ DEFUN("Memory", kMemory, "i.*"), - /*(?)*/ DEFUN("Sort", kSort, "ooo"), - /*(?)*/ DEFUN("AvoidPath", kAvoidPath, "ii.*"), - /*(?)*/ DEFUN("Lock", kLock, "iii*"), - /*(?)*/ DEFUN("Palette", kPalette, "i.*"), - /*(?)*/ DEFUN("IsItSkip", kIsItSkip, "iiiii"), - /*7b*/ DEFUN("StrSplit", kStrSplit, "rrZr"), + /*74*/ { "FileIO", kFileIO, "i.*" }, + /*(?)*/ { "Memory", kMemory, "i.*" }, + /*(?)*/ { "Sort", kSort, "ooo" }, + /*(?)*/ { "AvoidPath", kAvoidPath, "ii.*" }, + /*(?)*/ { "Lock", kLock, "iii*" }, + /*(?)*/ { "Palette", kPalette, "i.*" }, + /*(?)*/ { "IsItSkip", kIsItSkip, "iiiii" }, + /*7b*/ { "StrSplit", kStrSplit, "rrZr" }, // Non-experimental functions without a fixed ID - DEFUN("CosMult", kTimesCos, "ii"), - DEFUN("SinMult", kTimesSin, "ii"), + { "CosMult", kTimesCos, "ii" }, + { "SinMult", kTimesSin, "ii" }, // Misc functions - /*(?)*/ DEFUN("CosDiv", kCosDiv, "ii"), - /*(?)*/ DEFUN("PriCoord", kPriCoord, "i"), - /*(?)*/ DEFUN("SinDiv", kSinDiv, "ii"), - /*(?)*/ DEFUN("TimesCot", kTimesCot, "ii"), - /*(?)*/ DEFUN("TimesTan", kTimesTan, "ii"), - DEFUN("Message", kMessage, ".*"), - DEFUN("GetMessage", kGetMessage, "iiir"), - DEFUN("DoAudio", kDoAudio, ".*"), - DEFUN("DoSync", kDoSync, ".*"), - DEFUN("MemorySegment", kMemorySegment, "iri*"), - DEFUN("Intersections", kIntersections, "iiiiriiiri"), - DEFUN("MergePoly", kMergePoly, "rli"), - DEFUN("ResCheck", kResCheck, "iii*"), - DEFUN("SetQuitStr", kSetQuitStr, "r"), - DEFUN("ShowMovie", kShowMovie, ".*"), - DEFUN("SetVideoMode", kSetVideoMode, "i"), - DEFUN("Platform", kPlatform, ".*"), - DEFUN("TextColors", kTextColors, ".*"), - DEFUN("TextFonts", kTextFonts, ".*"), - DEFUN("Portrait", kPortrait, ".*"), + /*(?)*/ { "CosDiv", kCosDiv, "ii" }, + /*(?)*/ { "PriCoord", kPriCoord, "i" }, + /*(?)*/ { "SinDiv", kSinDiv, "ii" }, + /*(?)*/ { "TimesCot", kTimesCot, "ii" }, + /*(?)*/ { "TimesTan", kTimesTan, "ii" }, + { "Message", kMessage, ".*" }, + { "GetMessage", kGetMessage, "iiir" }, + { "DoAudio", kDoAudio, ".*" }, + { "DoSync", kDoSync, ".*" }, + { "MemorySegment", kMemorySegment, "iri*" }, + { "Intersections", kIntersections, "iiiiriiiri" }, + { "MergePoly", kMergePoly, "rli" }, + { "ResCheck", kResCheck, "iii*" }, + { "SetQuitStr", kSetQuitStr, "r" }, + { "ShowMovie", kShowMovie, ".*" }, + { "SetVideoMode", kSetVideoMode, "i" }, + { "Platform", kPlatform, ".*" }, + { "TextColors", kTextColors, ".*" }, + { "TextFonts", kTextFonts, ".*" }, + { "Portrait", kPortrait, ".*" }, #ifdef ENABLE_SCI32 // SCI2 Kernel Functions - DEFUN("IsHiRes", kIsHiRes, ""), - DEFUN("Array", kArray, ".*"), - DEFUN("ListAt", kListAt, "li"), - DEFUN("String", kString, ".*"), - DEFUN("AddScreenItem", kAddScreenItem, "o"), - DEFUN("UpdateScreenItem", kUpdateScreenItem, "o"), - DEFUN("DeleteScreenItem", kDeleteScreenItem, "o"), - DEFUN("AddPlane", kAddPlane, "o"), - DEFUN("DeletePlane", kDeletePlane, "o"), - DEFUN("UpdatePlane", kUpdatePlane, "o"), - DEFUN("RepaintPlane", kRepaintPlane, "o"), - DEFUN("GetHighPlanePri", kGetHighPlanePri, ""), - DEFUN("FrameOut", kFrameOut, ""), - DEFUN("ListEachElementDo", kListEachElementDo, "li.*"), - DEFUN("ListFirstTrue", kListFirstTrue, "li.*"), - DEFUN("ListAllTrue", kListAllTrue, "li.*"), - DEFUN("ListIndexOf", kListIndexOf, "lZo"), - DEFUN("OnMe", kOnMe, "iio.*"), - DEFUN("InPolygon", kInPolygon, "iio"), - DEFUN("CreateTextBitmap", kCreateTextBitmap, "i.*"), + { "IsHiRes", kIsHiRes, "" }, + { "Array", kArray, ".*" }, + { "ListAt", kListAt, "li" }, + { "String", kString, ".*" }, + { "AddScreenItem", kAddScreenItem, "o" }, + { "UpdateScreenItem", kUpdateScreenItem, "o" }, + { "DeleteScreenItem", kDeleteScreenItem, "o" }, + { "AddPlane", kAddPlane, "o" }, + { "DeletePlane", kDeletePlane, "o" }, + { "UpdatePlane", kUpdatePlane, "o" }, + { "RepaintPlane", kRepaintPlane, "o" }, + { "GetHighPlanePri", kGetHighPlanePri, "" }, + { "FrameOut", kFrameOut, "" }, + { "ListEachElementDo", kListEachElementDo, "li.*" }, + { "ListFirstTrue", kListFirstTrue, "li.*" }, + { "ListAllTrue", kListAllTrue, "li.*" }, + { "ListIndexOf", kListIndexOf, "lZo" }, + { "OnMe", kOnMe, "iio.*" }, + { "InPolygon", kInPolygon, "iio" }, + { "CreateTextBitmap", kCreateTextBitmap, "i.*" }, // SCI2.1 Kernel Functions - DEFUN("Save", kSave, ".*"), - DEFUN("List", kList, ".*"), - DEFUN("Robot", kRobot, ".*"), - DEFUN("IsOnMe", kOnMe, "iio.*"), // TODO: this seems right, but verify... + { "Save", kSave, ".*" }, + { "List", kList, ".*" }, + { "Robot", kRobot, ".*" }, + { "IsOnMe", kOnMe, "iio.*" }, // TODO: this seems right, but verify... #endif // its a stub, but its needed for Pharkas to work - DEFUN("PalVary", kPalVary, "ii*"), - DEFUN("AssertPalette", kAssertPalette, "i"), + { "PalVary", kPalVary, "ii*" }, + { "AssertPalette", kAssertPalette, "i" }, #if 0 // Stub functions - /*09*/ DEFUN("Show", kShow, "i"), - DEFUN("ShiftScreen", kShiftScreen, ".*"), - DEFUN("ListOps", kListOps, ".*"), - DEFUN("ATan", kATan, ".*"), - DEFUN("Record", kRecord, ".*"), - DEFUN("PlayBack", kPlayBack, ".*"), - DEFUN("DbugStr", kDbugStr, ".*"), + /*09*/ { "Show", kShow, "i" }, + { "ShiftScreen", kShiftScreen, ".*" }, + { "ListOps", kListOps, ".*" }, + { "ATan", kATan, ".*" }, + { "Record", kRecord, ".*" }, + { "PlayBack", kPlayBack, ".*" }, + { "DbugStr", kDbugStr, ".*" }, #endif {NULL, NULL, NULL} // Terminator @@ -500,8 +496,7 @@ void Kernel::loadSelectorNames() { static void kernel_compile_signature(const char **s) { const char *src = *s; char *result; - int ellipsis = 0; - char v; + bool ellipsis = false; int index = 0; if (!src) @@ -511,7 +506,7 @@ static void kernel_compile_signature(const char **s) { while (*src) { char c; - v = 0; + char v = 0; if (ellipsis) { error("Failed compiling kernel function signature '%s': non-terminal ellipsis '%c'", *s, *src); @@ -554,7 +549,7 @@ static void kernel_compile_signature(const char **s) { case KSIG_SPEC_ELLIPSIS: v |= KSIG_ELLIPSIS; - ellipsis = 1; + ellipsis = true; break; default: @@ -706,12 +701,13 @@ bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { } if (*sig == 0 || (*sig & KSIG_ELLIPSIS)) return true; + warning("kernel_matches_signature: too few arguments"); return false; } void Kernel::setDefaultKernelNames() { - _kernelNames = Common::StringArray(sci_default_knames, SCI_KNAMES_DEFAULT_ENTRIES_NR); + _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); // Some (later) SCI versions replaced CanBeHere by CantBeHere if (_selectorCache.cantBeHere != -1) @@ -787,31 +783,28 @@ Common::String Kernel::lookupText(reg_t address, int index) { if (address.segment) return _segMan->getString(address); - else { - int textlen; - int _index = index; - textres = _resMan->findResource(ResourceId(kResourceTypeText, address.offset), 0); - - if (!textres) { - error("text.%03d not found", address.offset); - return NULL; /* Will probably segfault */ - } - textlen = textres->size; - seeker = (char *) textres->data; + int textlen; + int _index = index; + textres = _resMan->findResource(ResourceId(kResourceTypeText, address.offset), 0); - while (index--) - while ((textlen--) && (*seeker++)) - ; + if (!textres) { + error("text.%03d not found", address.offset); + return NULL; /* Will probably segfault */ + } - if (textlen) - return seeker; - else { - error("Index %d out of bounds in text.%03d", _index, address.offset); - return NULL; - } + textlen = textres->size; + seeker = (char *) textres->data; - } + while (index--) + while ((textlen--) && (*seeker++)) + ; + + if (textlen) + return seeker; + + error("Index %d out of bounds in text.%03d", _index, address.offset); + return NULL; } } // End of namespace Sci -- cgit v1.2.3 From 4b0f0894c4fbd864c7d75dd04134f4b59af448a6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 15:26:10 +0000 Subject: SCI: Switch Console::cmdSelector to use Kernel::getSelectorName svn-id: r49580 --- engines/sci/console.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f5a1880bf5..f025c63335 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -482,14 +482,15 @@ bool Console::cmdSelector(int argc, const char **argv) { return true; } - for (uint seeker = 0; seeker < _engine->getKernel()->getSelectorNamesSize(); seeker++) { - if (!scumm_stricmp(_engine->getKernel()->getSelectorName(seeker).c_str(), argv[1])) { - DebugPrintf("Selector %s found at %03x (%d)\n", _engine->getKernel()->getSelectorName(seeker).c_str(), seeker, seeker); - return true; - } + Common::String name = argv[1]; + name.toLowercase(); + int seeker = _engine->getKernel()->findSelector(name.c_str()); + if (seeker >= 0) { + DebugPrintf("Selector %s found at %03x (%d)\n", name.c_str(), seeker, seeker); + return true; } - DebugPrintf("Selector %s wasn't found\n", argv[1]); + DebugPrintf("Selector %s wasn't found\n", name.c_str()); return true; } -- cgit v1.2.3 From 85b0ec3408ca46251835f9e3db8f2e96cafe60ac Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 10 Jun 2010 15:26:26 +0000 Subject: SCI: Fix some doxygen comments svn-id: r49581 --- engines/sci/engine/kernel.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index fc4b51f4ee..5cd044eadb 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -128,7 +128,7 @@ enum AutoDetectedFeatures { class Kernel { public: /** - * Initializes the SCI kernel + * Initializes the SCI kernel. */ Kernel(ResourceManager *resMan, SegManager *segMan); ~Kernel(); @@ -140,7 +140,7 @@ public: const Common::String &getKernelName(uint number) const; /** - * Determines the selector ID of a selector by its name + * Determines the selector ID of a selector by its name. * @param selectorName Name of the selector to look up * @return The appropriate selector ID, or -1 on error */ @@ -151,9 +151,9 @@ public: void dumpScriptObject(char *data, int seeker, int objsize); void dumpScriptClass(char *data, int seeker, int objsize); - SelectorCache _selectorCache; /**< Shortcut list for important selectors */ + SelectorCache _selectorCache; /**< Shortcut list for important selectors. */ typedef Common::Array KernelFuncsContainer; - KernelFuncsContainer _kernelFuncs; /**< Table of kernel functions */ + KernelFuncsContainer _kernelFuncs; /**< Table of kernel functions. */ /** * Determines whether a list of registers matches a given signature. @@ -179,11 +179,11 @@ public: /******************** Text functionality ********************/ /** - * Looks up text referenced by scripts - * SCI uses two values to reference to text: An address, and an index. The address - * determines whether the text should be read from a resource file, or from the heap, - * while the index either refers to the number of the string in the specified source, - * or to a relative position inside the text. + * Looks up text referenced by scripts. + * SCI uses two values to reference to text: An address, and an index. The + * address determines whether the text should be read from a resource file, + * or from the heap, while the index either refers to the number of the + * string in the specified source, or to a relative position inside the text. * * @param address The address to look up * @param index The relative index @@ -203,18 +203,18 @@ public: private: /** - * Sets the default kernel function names, based on the SCI version used + * Sets the default kernel function names, based on the SCI version used. */ void setDefaultKernelNames(); #ifdef ENABLE_SCI32 /** - * Sets the default kernel function names to the SCI2 kernel functions + * Sets the default kernel function names to the SCI2 kernel functions. */ void setKernelNamesSci2(); /** - * Sets the default kernel function names to the SCI2.1 kernel functions + * Sets the default kernel function names to the SCI2.1 kernel functions. */ void setKernelNamesSci21(GameFeatures *features); #endif @@ -231,12 +231,12 @@ private: Common::StringArray checkStaticSelectorNames(); /** - * Maps special selectors + * Maps special selectors. */ void mapSelectors(); /** - * Maps kernel functions + * Maps kernel functions. */ void mapFunctions(); @@ -252,14 +252,14 @@ private: /******************** Misc functions ********************/ /** - * Get all sound events, apply their changes to the heap + * Get all sound events, apply their changes to the heap. */ void process_sound_events(EngineState *s); /******************** Constants ********************/ #endif -/* Maximum length of a savegame name (including terminator character) */ +/* Maximum length of a savegame name (including terminator character). */ #define SCI_MAX_SAVENAME_LENGTH 0x24 /******************** Kernel functions ********************/ -- cgit v1.2.3 From 8f55c4ddb4ceb64e6121ee9fe08b07c2905d4748 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 10 Jun 2010 18:16:05 +0000 Subject: Allow for digits in stage directions in SCI32 games: GK1 floppy uses them. svn-id: r49582 --- engines/sci/engine/message.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index 07f8792471..523e8321db 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -330,7 +330,8 @@ bool MessageState::stringStage(Common::String &outstr, const Common::String &inS } // If we find a lowercase character or a digit, it's not a stage direction - if (((inStr[i] >= 'a') && (inStr[i] <= 'z')) || ((inStr[i] >= '0') && (inStr[i] <= '9'))) + // SCI32 seems to support having digits in stage directions + if (((inStr[i] >= 'a') && (inStr[i] <= 'z')) || ((inStr[i] >= '0') && (inStr[i] <= '9') && (getSciVersion() < SCI_VERSION_2))) return false; } -- cgit v1.2.3 From 9f907aac095123ac016a23a559f54ada35af6772 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 10 Jun 2010 20:26:59 +0000 Subject: kSciAudioWPlay should not actually play the song, but 'pre-load' it. We fake the pre-loading with a flag that will return 0 if the song has been called with kSciAudioWPlay. Fixes the dream sequence sound in MUMG. svn-id: r49583 --- engines/sci/engine/ksound.cpp | 8 ++++++-- engines/sci/sound/audio.cpp | 16 ++++++++++++++++ engines/sci/sound/audio.h | 5 +++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 29302181b1..ebfd6e6885 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -44,7 +44,6 @@ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { - case kSciAudioWPlay: case kSciAudioPlay: { if (argc < 2) return NULL_REG; @@ -72,6 +71,7 @@ reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { break; case kSciAudioPosition: return make_reg(0, g_sci->_audio->audioCdPosition()); + case kSciAudioWPlay: // CD Audio can't be preloaded case kSciAudioRate: // No need to set the audio rate case kSciAudioVolume: // The speech setting isn't used by CD Audio case kSciAudioLanguage: // No need to set the language @@ -119,7 +119,11 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - return make_reg(0, g_sci->_audio->startAudio(module, number)); // return sample length in ticks + // return sample length in ticks + if (argv[0].toUint16() == kSciAudioWPlay) + return make_reg(0, g_sci->_audio->wPlayAudio(module, number)); + else + return make_reg(0, g_sci->_audio->startAudio(module, number)); } case kSciAudioStop: g_sci->_audio->stopAudio(); diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index f10cc5ed68..62cfcd9621 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -47,6 +47,7 @@ AudioPlayer::AudioPlayer(ResourceManager *resMan) : _resMan(resMan), _audioRate( _syncResource(NULL), _syncOffset(0), _audioCdStart(0) { _mixer = g_system->getMixer(); + _wPlayFlag = false; } AudioPlayer::~AudioPlayer() { @@ -65,6 +66,7 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { Audio::AudioStream *audioStream = getAudioStream(number, module, &sampleLen); if (audioStream) { + _wPlayFlag = false; _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_audioHandle, audioStream); return sampleLen; } @@ -72,6 +74,18 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { return 0; } +int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { + // Get the audio sample length and set the wPlay flag so we return 0 on position. + // SSCI pre-loads the audio here, but it's much easier for us to just get the + // sample length and return that. wPlayAudio should *not* actually start the sample. + + int sampleLen = 0; + Audio::AudioStream *audioStream = getAudioStream(module, tuple, &sampleLen); + delete audioStream; + _wPlayFlag = true; + return sampleLen; +} + void AudioPlayer::stopAudio() { _mixer->stopHandle(_audioHandle); } @@ -87,6 +101,8 @@ void AudioPlayer::resumeAudio() { int AudioPlayer::getAudioPosition() { if (_mixer->isSoundHandleActive(_audioHandle)) return _mixer->getSoundElapsedTime(_audioHandle) * 6 / 100; // return elapsed time in ticks + else if (_wPlayFlag) + return 0; // Sound has "loaded" so return that it hasn't started else return -1; // Sound finished } diff --git a/engines/sci/sound/audio.h b/engines/sci/sound/audio.h index 9fc3cbac51..7c1221fc4c 100644 --- a/engines/sci/sound/audio.h +++ b/engines/sci/sound/audio.h @@ -33,8 +33,7 @@ namespace Sci { enum AudioCommands { - // TODO: find the difference between kSci1AudioWPlay and kSci1AudioPlay - kSciAudioWPlay = 1, /* Plays an audio stream */ + kSciAudioWPlay = 1, /* Loads an audio stream */ kSciAudioPlay = 2, /* Plays an audio stream */ kSciAudioStop = 3, /* Stops an audio stream */ kSciAudioPause = 4, /* Pauses an audio stream */ @@ -69,6 +68,7 @@ public: Audio::RewindableAudioStream *getAudioStream(uint32 number, uint32 volume, int *sampleLen); int getAudioPosition(); int startAudio(uint16 module, uint32 tuple); + int wPlayAudio(uint16 module, uint32 tuple); void stopAudio(); void pauseAudio(); void resumeAudio(); @@ -92,6 +92,7 @@ private: Resource *_syncResource; /**< Used by kDoSync for speech syncing in CD talkie games */ uint _syncOffset; uint32 _audioCdStart; + bool _wPlayFlag; }; } // End of namespace Sci -- cgit v1.2.3 From f470e1d96ed152751dc57418b7659559bc43217b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 10 Jun 2010 20:52:04 +0000 Subject: SCI: adding current delta to tick position when getting the setsignalloop command - fixes sq3 music slight delay before actual looping svn-id: r49585 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 3ee8a3a83d..8f88945888 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -176,7 +176,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { _signalSet = true; _signalToSet = info.basic.param1; } else { - _loopTick = _position._play_tick; + _loopTick = _position._play_tick + info.delta; } } break; -- cgit v1.2.3 From 5baa47a9cbd42b2b40b599928ea6bf41f47fdc18 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 10 Jun 2010 23:16:32 +0000 Subject: In SCI1.1, kSetSynonyms is a dummy (empty) function svn-id: r49586 --- engines/sci/engine/kernel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 011dd0802e..829687f226 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -742,6 +742,9 @@ void Kernel::setDefaultKernelNames() { break; case SCI_VERSION_1_1: + // In SCI1.1, kSetSynonyms is a dummy (empty) function + _kernelNames[0x26] = "Dummy"; + // In the Windows version of KQ6 CD, the empty kSetSynonyms // function has been replaced with kPortrait. In KQ6 Mac, // kPlayBack has been replaced by kShowMovie. -- cgit v1.2.3 From 377cfe6fefe6a817a6ce778e7721dc3818780c01 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 11 Jun 2010 07:47:57 +0000 Subject: Added a new kernel function, kEmpty, for really empty (not dummy, i.e. unimplemented) functions svn-id: r49591 --- engines/sci/engine/kernel.cpp | 5 +++-- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kmisc.cpp | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 829687f226..d418fb7998 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -357,6 +357,7 @@ SciKernelFunction kfunct_mappers[] = { { "TextColors", kTextColors, ".*" }, { "TextFonts", kTextFonts, ".*" }, { "Portrait", kPortrait, ".*" }, + { "Empty", kEmpty, ".*" }, #ifdef ENABLE_SCI32 // SCI2 Kernel Functions @@ -742,8 +743,8 @@ void Kernel::setDefaultKernelNames() { break; case SCI_VERSION_1_1: - // In SCI1.1, kSetSynonyms is a dummy (empty) function - _kernelNames[0x26] = "Dummy"; + // In SCI1.1, kSetSynonyms is an empty function + _kernelNames[0x26] = "Empty"; // In the Windows version of KQ6 CD, the empty kSetSynonyms // function has been replaced with kPortrait. In KQ6 Mac, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 5cd044eadb..722473a85b 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -405,6 +405,7 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv); reg_t kPlatform(EngineState *s, int argc, reg_t *argv); reg_t kTextColors(EngineState *s, int argc, reg_t *argv); reg_t kTextFonts(EngineState *s, int argc, reg_t *argv); +reg_t kEmpty(EngineState *s, int argc, reg_t *argv); #ifdef ENABLE_SCI32 // SCI2 Kernel Functions diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index f3d4c8a732..d836ec4a7f 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -375,4 +375,12 @@ reg_t kPlatform(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } +reg_t kEmpty(EngineState *s, int argc, reg_t *argv) { + // Placeholder for empty kernel functions which are still called from the engine + // scripts (like the empty kSetSynonyms function in SCI1.1). This differs from + // dummy functions because it does nothing and never throws a warning when it's + // called + return s->r_acc; +} + } // End of namespace Sci -- cgit v1.2.3 From 3269e5cc4ca2ea04f862767595720ad2044cfd09 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 11 Jun 2010 09:17:11 +0000 Subject: SCI: adjust priority bottom, if its 200 to avoid possible out of bounds (sierra actually does the same) svn-id: r49592 --- engines/sci/graphics/ports.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index cdb6fe4ae1..d230c1eb9f 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -496,6 +496,11 @@ void GfxPorts::priorityBandsInit(int16 bandCount, int16 top, int16 bottom) { // We fill space that is left over with the highest band (hardcoded 200 limit, because this algo isnt meant to be used on hires) for (y = _priorityBottom; y < 200; y++) _priorityBands[y] = _priorityBandCount; + + // adjust, if bottom is 200 (one over the actual screen range) - we could otherwise go possible out of bounds + // sierra sci also adjust accordingly + if (_priorityBottom == 200) + _priorityBottom--; } void GfxPorts::priorityBandsInit(byte *data) { -- cgit v1.2.3 From 580c9032f02123ba1f46a49c098dbf34f0b2f3c1 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Fri, 11 Jun 2010 10:54:49 +0000 Subject: Add support for setFocusRectangle - enabled on 'small' Android screens. svn-id: r49594 --- backends/platform/android/android.cpp | 85 ++++++++++++++-------- .../android/org/inodes/gus/scummvm/ScummVM.java | 1 + .../org/inodes/gus/scummvm/ScummVMActivity.java | 11 ++- dists/android/AndroidManifest.xml | 15 ---- dists/android/AndroidManifest.xml.in | 4 - 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 7a8c976c82..105561e595 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -178,8 +178,8 @@ private: // Game layer GLESPaletteTexture* _game_texture; int _shake_offset; + Common::Rect _focus_rect; bool _full_screen_dirty; - Common::Array _dirty_rects; // Overlay layer GLES4444Texture* _overlay_texture; @@ -199,6 +199,7 @@ private: pthread_t _timer_thread; static void* timerThreadFunc(void* arg); + bool _enable_zoning; bool _virtkeybd_on; Common::SaveFileManager *_savefile; @@ -221,6 +222,7 @@ public: static OSystem_Android* fromJavaObject(JNIEnv* env, jobject obj); virtual void initBackend(); void addPluginDirectories(Common::FSList &dirs) const; + void enableZoning(bool enable) { _enable_zoning = enable; } virtual bool hasFeature(Feature f); virtual void setFeatureState(Feature f, bool enable); @@ -311,6 +313,7 @@ OSystem_Android::OSystem_Android(jobject am) _use_mouse_palette(false), _show_mouse(false), _show_overlay(false), + _enable_zoning(false), _savefile(0), _mixer(0), _timer(0), @@ -649,16 +652,15 @@ void OSystem_Android::setupScummVMSurface() { _mouse_texture->reinitGL(); glViewport(0, 0, _egl_surface_width, _egl_surface_height); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + clearFocusRectangle(); CHECK_GL_ERROR(); - - _force_redraw = true; } void OSystem_Android::destroyScummVMSurface() { @@ -680,7 +682,7 @@ void OSystem_Android::initSize(uint width, uint height, _overlay_texture->allocBuffer(overlay_width, overlay_height); // Don't know mouse size yet - it gets reallocated in - // setMouseCursor. We need the palette allocated before + // setMouseCursor. We need the palette allocated before // setMouseCursor however, so just take a guess at the desired // size (it's small). _mouse_texture->allocBuffer(20, 20); @@ -695,7 +697,7 @@ int16 OSystem_Android::getWidth() { } void OSystem_Android::setPalette(const byte* colors, uint start, uint num) { - ENTER("setPalette(%p, %u, %u)", colors, start, num); + ENTER("setPalette(%p, %u, %u)", colors, start, num); if (!_use_mouse_palette) _setCursorPalette(colors, start, num); @@ -753,15 +755,39 @@ void OSystem_Android::updateScreen() { glTranslatex(0, -_shake_offset << 16, 0); } - _game_texture->drawTexture(0, 0, - _egl_surface_width, _egl_surface_height); + if (_focus_rect.isEmpty()) { + _game_texture->drawTexture(0, 0, + _egl_surface_width, _egl_surface_height); + } else { + // Need to ensure any exposed out-of-bounds region doesn't go + // all hall-of-mirrors. If _shake_offset != 0, we've already + // done this above. + const Common::Rect + screen_bounds(_game_texture->width(), _game_texture->height()); + if (!screen_bounds.contains(_focus_rect) && _shake_offset != 0) { + glClearColorx(0, 0, 0, 1 << 16); + glClear(GL_COLOR_BUFFER_BIT); + } + + glPushMatrix(); + glScalex(xdiv(_egl_surface_width, _focus_rect.width()), + xdiv(_egl_surface_height, _focus_rect.height()), + 1 << 16); + glTranslatex(-_focus_rect.left << 16, -_focus_rect.top << 16, 0); + glScalex(xdiv(_game_texture->width(), _egl_surface_width), + xdiv(_game_texture->height(), _egl_surface_height), + 1 << 16); + _game_texture->drawTexture(0, 0, + _egl_surface_width, _egl_surface_height); + glPopMatrix(); + } CHECK_GL_ERROR(); if (_show_overlay) { _overlay_texture->drawTexture(0, 0, - _egl_surface_width, - _egl_surface_height); + _egl_surface_width, + _egl_surface_height); CHECK_GL_ERROR(); } @@ -769,8 +795,8 @@ void OSystem_Android::updateScreen() { glPushMatrix(); glTranslatex(-_mouse_hotspot.x << 16, - -_mouse_hotspot.y << 16, - 0); + -_mouse_hotspot.y << 16, + 0); // Scale up ScummVM -> OpenGL (pixel) coordinates int texwidth, texheight; @@ -782,8 +808,8 @@ void OSystem_Android::updateScreen() { texheight = getHeight(); } glScalex(xdiv(_egl_surface_width, texwidth), - xdiv(_egl_surface_height, texheight), - 1 << 16); + xdiv(_egl_surface_height, texheight), + 1 << 16); // Note the extra half texel to position the mouse in // the middle of the x,y square: @@ -845,26 +871,18 @@ void OSystem_Android::fillScreen(uint32 col) { void OSystem_Android::setFocusRectangle(const Common::Rect& rect) { ENTER("setFocusRectangle(%d,%d,%d,%d)", rect.left, rect.top, rect.right, rect.bottom); -#if 0 - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrthof(rect.left, rect.right, rect.top, rect.bottom, 0, 1); - glMatrixMode(GL_MODELVIEW); - - _force_redraw = true; -#endif + if (_enable_zoning) { + _focus_rect = rect; + _force_redraw = true; + } } void OSystem_Android::clearFocusRectangle() { ENTER("clearFocusRectangle()"); -#if 0 - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); - - _force_redraw = true; -#endif + if (_enable_zoning) { + _focus_rect = Common::Rect(); + _force_redraw = true; + } } void OSystem_Android::showOverlay() { @@ -1342,6 +1360,11 @@ void AndroidPluginProvider::addCustomDirectories(Common::FSList &dirs) const { } #endif +static void ScummVM_enableZoning(JNIEnv* env, jobject self, jboolean enable) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + cpp_obj->enableZoning(enable); +} + const static JNINativeMethod gMethods[] = { { "create", "(Landroid/content/res/AssetManager;)V", (void*)ScummVM_create }, @@ -1356,6 +1379,8 @@ const static JNINativeMethod gMethods[] = { (void*)ScummVM_setConfManInt }, { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", (void*)ScummVM_setConfManString }, + { "enableZoning", "(Z)V", + (void*)ScummVM_enableZoning }, }; JNIEXPORT jint JNICALL diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java index f4dca0e7e5..4ce8a85f30 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -162,6 +162,7 @@ public class ScummVM implements SurfaceHolder.Callback { final public native static void loadConfigFile(String path); final public native static void setConfMan(String key, int value); final public native static void setConfMan(String key, String value); + final public native void enableZoning(boolean enable); // Feed an event to ScummVM. Safe to call from other threads. final public native void pushEvent(Event e); diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java index fb3cd6348f..ba3c058ae4 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java @@ -1,7 +1,7 @@ package org.inodes.gus.scummvm; -import android.app.AlertDialog; import android.app.Activity; +import android.app.AlertDialog; import android.content.DialogInterface; import android.content.res.Configuration; import android.media.AudioManager; @@ -9,13 +9,14 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; +import android.util.DisplayMetrics; import android.util.Log; -import android.view.inputmethod.InputMethodManager; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.ViewConfiguration; +import android.view.inputmethod.InputMethodManager; import android.widget.Toast; import java.io.IOException; @@ -33,6 +34,12 @@ public class ScummVMActivity extends Activity { public MyScummVM() { super(ScummVMActivity.this); + + // Enable ScummVM zoning on 'small' screens. + // This 'density' term is very confusing. + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + enableZoning(metrics.densityDpi <= DisplayMetrics.DENSITY_LOW); } @Override diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml index 9eb1d995f0..438703a3cc 100644 --- a/dists/android/AndroidManifest.xml +++ b/dists/android/AndroidManifest.xml @@ -38,17 +38,6 @@ - - - - - - - - - diff --git a/dists/android/AndroidManifest.xml.in b/dists/android/AndroidManifest.xml.in index a7fd283f01..ce0bef6f94 100644 --- a/dists/android/AndroidManifest.xml.in +++ b/dists/android/AndroidManifest.xml.in @@ -57,8 +57,4 @@ android:reqKeyboardType="qwerty"/> - - - -- cgit v1.2.3 From ef34896dce9188591e8ddd6e8eed543febd70b87 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 11 Jun 2010 11:03:51 +0000 Subject: Clarified various incorrectly named parameters, and fixed code for loading the correct art file backgrounds when running animation sequences svn-id: r49595 --- engines/m4/animation.cpp | 4 ++-- engines/m4/animation.h | 2 +- engines/m4/mads_anim.cpp | 17 +++++++++++------ engines/m4/mads_anim.h | 1 + engines/m4/mads_scene.cpp | 2 +- engines/m4/mads_views.h | 2 +- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 1142ba48d1..dacfd8c581 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -63,7 +63,7 @@ MadsAnimation::~MadsAnimation() { /** * Initialises and loads the data of an animation */ -void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4Surface *interfaceSurface, M4Surface *sceneSurface) { +void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) { MadsPack anim(filename.c_str(), _vm); bool madsRes = filename[0] == '*'; char buffer[20]; @@ -114,7 +114,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S if (_animMode == 4) flags |= 0x4000; if (flags & 0x100) - loadInterface(interfaceSurface, sceneSurface); + loadInterface(surface, depthSurface); // Initialise the reference list for (int i = 0; i < spriteListCount; ++i) diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 5c7227a256..029cf45738 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -108,7 +108,7 @@ public: MadsAnimation(MadsM4Engine *vm, MadsView *view); virtual ~MadsAnimation(); - virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *interfaceSurface, M4Surface *sceneSurface); + virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface); virtual void load(const Common::String &filename, int abortTimers); virtual void update(); virtual void setCurrentFrame(int frameNumber); diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index eac6d1b4aa..c618ae57cc 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -458,6 +458,8 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): _previousUpdate = 0; _transition = kTransitionNone; _activeAnimation = NULL; + _bgLoadFlag = true; + reset(); // Set up system palette colors @@ -572,12 +574,12 @@ void AnimviewView::readNextCommand() { if (strchr(_currentLine, '.') == NULL) strcat(_currentLine, ".aa"); - _activeAnimation = new MadsAnimation(_vm, this); - _activeAnimation->load(_currentLine, 0); + uint16 flags = 0; + if (_bgLoadFlag) + flags |= 0x100; - _backgroundSurface.loadBackground(_activeAnimation->roomNumber()); - _codeSurface.setSize(_backgroundSurface.width(), _backgroundSurface.height()); - _codeSurface.fillRect(_codeSurface.bounds(), 0xff); + _activeAnimation = new MadsAnimation(_vm, this); + _activeAnimation->initialise(_currentLine, flags, &_backgroundSurface, &_codeSurface); _spriteSlots.fullRefresh(); /* @@ -675,7 +677,10 @@ void AnimviewView::processCommand() { str_upper(commandStr); char *param = commandStr; - if (!strncmp(commandStr, "X", 1)) { + if (!strncmp(commandStr, "B", 1)) { + // Toggle background load flag + _bgLoadFlag = !_bgLoadFlag; + } else if (!strncmp(commandStr, "X", 1)) { //printf("X "); } else if (!strncmp(commandStr, "W", 1)) { //printf("W "); diff --git a/engines/m4/mads_anim.h b/engines/m4/mads_anim.h index 8c4a5e6fb7..f18fe46f48 100644 --- a/engines/m4/mads_anim.h +++ b/engines/m4/mads_anim.h @@ -90,6 +90,7 @@ private: RGBList *_palData; int _transition; MadsAnimation *_activeAnimation; + bool _bgLoadFlag; void reset(); void readNextCommand(); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index a65224c722..f98684de6a 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -720,7 +720,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su _vm->_resourceManager->toss(sceneName); // Load the surface artwork - surface->loadBackground(sceneNumber); + surface->loadBackground(artFileNum); // Final cleanup if (ssFlag) diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 85bfe9e552..c0f3790a23 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -367,7 +367,7 @@ protected: public: Animation(MadsM4Engine *vm); virtual ~Animation(); - virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *walkSurface, M4Surface *sceneSurface) = 0; + virtual void initialise(const Common::String &filename, uint16 flags, M4Surface *surface, M4Surface *depthSurface) = 0; virtual void load(const Common::String &filename, int v0) = 0; virtual void update() = 0; virtual void setCurrentFrame(int frameNumber) = 0; -- cgit v1.2.3 From e572267a05674b4b462602781be58f813c84479d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 11 Jun 2010 11:08:37 +0000 Subject: Bugfixes to correctly scroll the background during animations svn-id: r49596 --- engines/m4/animation.cpp | 2 +- engines/m4/graphics.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index dacfd8c581..adb802ee0e 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -87,7 +87,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S animStream->skip(2); _field12 = animStream->readUint16LE() != 0; _spriteListIndex = animStream->readUint16LE(); - _scrollX = animStream->readUint16LE(); + _scrollX = animStream->readSint16LE(); _scrollY = animStream->readSint16LE(); animStream->skip(10); diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index f332c8b06c..dd18972eec 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -769,7 +769,7 @@ void M4Surface::scrollX(int xAmount) { return; byte buffer[80]; - int direction = (xAmount > 0) ? 1 : -1; + int direction = (xAmount > 0) ? -1 : 1; int xSize = ABS(xAmount); assert(xSize <= 80); -- cgit v1.2.3 From a08d06ad353996ee9bf495a84988f3a91cacf51a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 11 Jun 2010 14:47:13 +0000 Subject: - Added a new debug command, verify_midi, which can be used to check all the songs of a game for unmapped instruments (still WIP and disabled) - Fixed a bug in the verify_scripts command (it was loading the script resource twice) svn-id: r49597 --- engines/sci/console.cpp | 106 ++++++++++++++++++++++++++++++++++- engines/sci/console.h | 1 + engines/sci/sound/midiparser_sci.cpp | 42 ++++++++------ engines/sci/sound/midiparser_sci.h | 2 + 4 files changed, 132 insertions(+), 19 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f025c63335..ac165f22b1 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -39,6 +39,7 @@ #include "sci/sound/iterator/songlib.h" // for SongLibrary #include "sci/sound/iterator/iterator.h" // for SCI_SONG_ITERATOR_TYPE_SCI0 #else +#include "sci/sound/midiparser_sci.h" #include "sci/sound/music.h" #endif #include "sci/sound/drivers/mididriver.h" @@ -106,6 +107,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DCmd_Register("list", WRAP_METHOD(Console, cmdList)); DCmd_Register("hexgrep", WRAP_METHOD(Console, cmdHexgrep)); DCmd_Register("verify_scripts", WRAP_METHOD(Console, cmdVerifyScripts)); + DCmd_Register("verify_midi", WRAP_METHOD(Console, cmdVerifyMidi)); // Game DCmd_Register("save_game", WRAP_METHOD(Console, cmdSaveGame)); DCmd_Register("restore_game", WRAP_METHOD(Console, cmdRestoreGame)); @@ -326,6 +328,7 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" list - Lists all the resources of a given type\n"); DebugPrintf(" hexgrep - Searches some resources for a particular sequence of bytes, represented as hexadecimal numbers\n"); DebugPrintf(" verify_scripts - Performs sanity checks on SCI1.1-SCI2.1 game scripts (e.g. if they're up to 64KB in total)\n"); + DebugPrintf(" verify_midi - Performs checks on MIDI patches, for unmapped instruments\n"); DebugPrintf("\n"); DebugPrintf("Game:\n"); DebugPrintf(" save_game - Saves the current game state to the hard disk\n"); @@ -832,7 +835,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { if (!script) DebugPrintf("Error: script %d couldn't be loaded\n", itr->number); - heap = _engine->getResMan()->findResource(*itr, false); + heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->number), false); if (!heap) DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->number); @@ -848,6 +851,107 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { return true; } +bool Console::cmdVerifyMidi(int argc, const char **argv) { + // TODO: Sometimes this goes out of bounds with some songs, as it misses + // the EOT signal +#if 0 + SciVersion doSoundVersion = _engine->_features->detectDoSoundType(); + MidiPlayer *player = MidiPlayer_Midi_create(doSoundVersion); + MidiParser_SCI *parser = new MidiParser_SCI(doSoundVersion); + parser->setMidiDriver(player); + + Common::List *resources = _engine->getResMan()->listResources(kResourceTypeSound); + sort(resources->begin(), resources->end(), ResourceIdLess()); + Common::List::iterator itr = resources->begin(); + + DebugPrintf("%d sounds found, checking their instrument mappings...\n", resources->size()); + + SoundResource *sound; + + while (itr != resources->end()) { + sound = new SoundResource(itr->number, _engine->getResMan(), doSoundVersion); + int channelFilterMask = sound->getChannelFilterMask(player->getPlayId(), player->hasRhythmChannel()); + SoundResource::Track *track = sound->getTrackByType(player->getPlayId()); + if (track->digitalChannelNr != -1) { + // Skip digitized sound effects + delete sound; + continue; + } + + parser->loadMusic(track, NULL, channelFilterMask, doSoundVersion); + const byte *channelData = parser->getMixedData(); + + byte param1 = 0; + byte command = 0, prev = 0; + byte curEvent = 0; + bool endOfTrack = false; + + do { + while (*channelData == 0xF8) + channelData++; + + channelData++; // delta + + if ((*channelData & 0xF0) >= 0x80) + curEvent = *(channelData++); + else + curEvent = prev; + if (curEvent < 0x80) + continue; + + prev = curEvent; + command = curEvent >> 4; + + switch (command) { + case 0xC: // program change + param1 = *channelData++; + // TODO: verify that the instrument is mapped + printf("Song %d, patch %d\n", itr->number, param1); + break; + case 0xD: + case 0xB: + param1 = *channelData++; + break; + case 0x8: + case 0x9: + case 0xA: + case 0xE: + param1 = *channelData++; + *channelData++; // param2 + break; + case 0xF: + if ((curEvent & 0x0F) == 0x2) { + param1 = *channelData++; + *channelData++; // param2 + } else if ((curEvent & 0x0F) == 0x3) { + param1 = *channelData++; + } else if ((curEvent & 0x0F) == 0xF) { // META + byte type = *channelData++; + if (type == 0x2F) {// end of track reached + endOfTrack = true; + } else { + // no further processing necessary + } + } + break; + default: + break; + } + } while (!endOfTrack); + + delete sound; + ++itr; + } + + delete parser; + delete player; + + DebugPrintf("Music check finished\n"); +#endif + + return true; +} + bool Console::cmdList(int argc, const char **argv) { if (argc < 2) { DebugPrintf("Lists all the resources of a given type\n"); diff --git a/engines/sci/console.h b/engines/sci/console.h index 2b13e03ef6..572a62c274 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -74,6 +74,7 @@ private: bool cmdList(int argc, const char **argv); bool cmdHexgrep(int argc, const char **argv); bool cmdVerifyScripts(int argc, const char **argv); + bool cmdVerifyMidi(int argc, const char **argv); // Game bool cmdSaveGame(int argc, const char **argv); bool cmdRestoreGame(int argc, const char **argv); diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 8f88945888..f852367bfe 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -75,7 +75,8 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _pSnd = psnd; _soundVersion = soundVersion; - setVolume(psnd->volume); + if (_pSnd) + setVolume(psnd->volume); if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection @@ -86,30 +87,35 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _num_tracks = 1; _tracks[0] = _mixedData; - setTrack(0); + if (_pSnd) + setTrack(0); _loopTick = 0; - if (_soundVersion <= SCI_VERSION_0_LATE) { - // Set initial voice count - for (int i = 0; i < 16; ++i) { - byte voiceCount = 0; - if (channelFilterMask & (1 << i)) - voiceCount = psnd->soundRes->getInitialVoiceCount(i); - _driver->send(0xB0 | i, 0x4B, voiceCount); + if (_pSnd) { + if (_soundVersion <= SCI_VERSION_0_LATE) { + // Set initial voice count + for (int i = 0; i < 16; ++i) { + byte voiceCount = 0; + if (channelFilterMask & (1 << i)) + voiceCount = psnd->soundRes->getInitialVoiceCount(i); + _driver->send(0xB0 | i, 0x4B, voiceCount); + } } - } - // Send a velocity off signal to all channels - for (int i = 0; i < 16; ++i) { - _driver->send(0xB0 | i, 0x4E, 0); // Reset velocity + // Send a velocity off signal to all channels + for (int i = 0; i < 16; ++i) { + _driver->send(0xB0 | i, 0x4E, 0); // Reset velocity + } } return true; } void MidiParser_SCI::unloadMusic() { - resetTracking(); - allNotesOff(); + if (_pSnd) { + resetTracking(); + allNotesOff(); + } _num_tracks = 0; _active_track = 255; _resetOnPause = false; @@ -120,7 +126,7 @@ void MidiParser_SCI::unloadMusic() { } // Center the pitch wheels and hold pedal in preparation for the next piece of music - if (_driver) { + if (_driver && _pSnd) { for (int i = 0; i < 16; ++i) { if (isChannelUsed(i)) { _driver->send(0xE0 | i, 0, 0x40); // Reset pitch wheel @@ -359,10 +365,10 @@ byte *MidiParser_SCI::midiMixChannels() { long new_delta; SoundResource::Channel *channel; - while ((curr = midiGetNextChannel(ticker)) != 0xFF) { // there is still active channel + while ((curr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel channel = &_track->channels[curr]; curDelta = *channel->data++; - channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the comamnd is supposed to occur + channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the command is supposed to occur if (curDelta == 0xF8) continue; new_delta = channel->time - ticker; diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 9d4b5a39da..8384c74cf6 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -79,6 +79,8 @@ public: void clearUsedChannels() { _channelsUsed = 0; } + const byte *getMixedData() const { return _mixedData; } + protected: bool isChannelUsed(byte channel) const { return _channelsUsed & (1 << channel); } void setChannelUsed(byte channel) { _channelsUsed |= (1 << channel); } -- cgit v1.2.3 From a8af267651c054bb45a0b5da77ea71b7100474ad Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 11 Jun 2010 19:49:41 +0000 Subject: Renamed verify_midi to show_instruments (and fixed a bug with it at the same time). This command scans all songs, or a specific song of a game and displays the instruments used svn-id: r49599 --- engines/sci/console.cpp | 85 +++++++++++++++++++++++++++++++++++-------------- engines/sci/console.h | 2 +- 2 files changed, 62 insertions(+), 25 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index ac165f22b1..9d713cd2dd 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -107,7 +107,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DCmd_Register("list", WRAP_METHOD(Console, cmdList)); DCmd_Register("hexgrep", WRAP_METHOD(Console, cmdHexgrep)); DCmd_Register("verify_scripts", WRAP_METHOD(Console, cmdVerifyScripts)); - DCmd_Register("verify_midi", WRAP_METHOD(Console, cmdVerifyMidi)); + DCmd_Register("show_instruments", WRAP_METHOD(Console, cmdShowInstruments)); // Game DCmd_Register("save_game", WRAP_METHOD(Console, cmdSaveGame)); DCmd_Register("restore_game", WRAP_METHOD(Console, cmdRestoreGame)); @@ -328,7 +328,7 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" list - Lists all the resources of a given type\n"); DebugPrintf(" hexgrep - Searches some resources for a particular sequence of bytes, represented as hexadecimal numbers\n"); DebugPrintf(" verify_scripts - Performs sanity checks on SCI1.1-SCI2.1 game scripts (e.g. if they're up to 64KB in total)\n"); - DebugPrintf(" verify_midi - Performs checks on MIDI patches, for unmapped instruments\n"); + DebugPrintf(" show_instruments - Shows the instruments of a specific song, or all songs\n"); DebugPrintf("\n"); DebugPrintf("Game:\n"); DebugPrintf(" save_game - Saves the current game state to the hard disk\n"); @@ -851,40 +851,56 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { return true; } -bool Console::cmdVerifyMidi(int argc, const char **argv) { - // TODO: Sometimes this goes out of bounds with some songs, as it misses - // the EOT signal -#if 0 +bool Console::cmdShowInstruments(int argc, const char **argv) { + int songNumber = -1; + + if (argc == 2) + songNumber = atoi(argv[1]); + SciVersion doSoundVersion = _engine->_features->detectDoSoundType(); MidiPlayer *player = MidiPlayer_Midi_create(doSoundVersion); MidiParser_SCI *parser = new MidiParser_SCI(doSoundVersion); parser->setMidiDriver(player); - + Common::List *resources = _engine->getResMan()->listResources(kResourceTypeSound); sort(resources->begin(), resources->end(), ResourceIdLess()); Common::List::iterator itr = resources->begin(); + int instruments[128]; + for (int i = 0; i < 128; i++) + instruments[i] = 0; - DebugPrintf("%d sounds found, checking their instrument mappings...\n", resources->size()); + if (songNumber == -1) { + DebugPrintf("%d sounds found, checking their instrument mappings...\n", resources->size()); + DebugPrintf("Instruments:\n"); + DebugPrintf("============\n"); + } SoundResource *sound; while (itr != resources->end()) { + if (songNumber >= 0 && itr->number != songNumber) { + ++itr; + continue; + } + sound = new SoundResource(itr->number, _engine->getResMan(), doSoundVersion); int channelFilterMask = sound->getChannelFilterMask(player->getPlayId(), player->hasRhythmChannel()); SoundResource::Track *track = sound->getTrackByType(player->getPlayId()); if (track->digitalChannelNr != -1) { // Skip digitized sound effects delete sound; + ++itr; continue; } parser->loadMusic(track, NULL, channelFilterMask, doSoundVersion); const byte *channelData = parser->getMixedData(); - byte param1 = 0; - byte command = 0, prev = 0; - byte curEvent = 0; + byte curEvent = 0, prevEvent = 0, command = 0; bool endOfTrack = false; + bool firstOneShown = false; + + DebugPrintf("Song %d: ", itr->number); do { while (*channelData == 0xF8) @@ -895,36 +911,47 @@ bool Console::cmdVerifyMidi(int argc, const char **argv) { if ((*channelData & 0xF0) >= 0x80) curEvent = *(channelData++); else - curEvent = prev; + curEvent = prevEvent; if (curEvent < 0x80) continue; - prev = curEvent; + prevEvent = curEvent; command = curEvent >> 4; switch (command) { case 0xC: // program change - param1 = *channelData++; - // TODO: verify that the instrument is mapped - printf("Song %d, patch %d\n", itr->number, param1); + { + //byte channel = curEvent & 0x0F; + byte instrument = *channelData++; + if (!firstOneShown) + firstOneShown = true; + else + DebugPrintf(","); + + DebugPrintf(" %d", instrument); + instruments[instrument]++; + } break; case 0xD: + channelData++; // param1 + break; case 0xB: - param1 = *channelData++; + channelData++; // param1 + channelData++; // param2 break; case 0x8: case 0x9: case 0xA: case 0xE: - param1 = *channelData++; - *channelData++; // param2 + channelData++; // param1 + channelData++; // param2 break; case 0xF: if ((curEvent & 0x0F) == 0x2) { - param1 = *channelData++; - *channelData++; // param2 + channelData++; // param1 + channelData++; // param2 } else if ((curEvent & 0x0F) == 0x3) { - param1 = *channelData++; + channelData++; // param1 } else if ((curEvent & 0x0F) == 0xF) { // META byte type = *channelData++; if (type == 0x2F) {// end of track reached @@ -939,6 +966,8 @@ bool Console::cmdVerifyMidi(int argc, const char **argv) { } } while (!endOfTrack); + DebugPrintf("\n"); + delete sound; ++itr; } @@ -946,8 +975,16 @@ bool Console::cmdVerifyMidi(int argc, const char **argv) { delete parser; delete player; - DebugPrintf("Music check finished\n"); -#endif + DebugPrintf("\n"); + + if (songNumber == -1) { + DebugPrintf("Used instruments: "); + for (int i = 0; i < 128; i++) { + if (instruments[i] > 0) + DebugPrintf("%d, ", i); + } + DebugPrintf("\n\n"); + } return true; } diff --git a/engines/sci/console.h b/engines/sci/console.h index 572a62c274..5f3b0e3951 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -74,7 +74,7 @@ private: bool cmdList(int argc, const char **argv); bool cmdHexgrep(int argc, const char **argv); bool cmdVerifyScripts(int argc, const char **argv); - bool cmdVerifyMidi(int argc, const char **argv); + bool cmdShowInstruments(int argc, const char **argv); // Game bool cmdSaveGame(int argc, const char **argv); bool cmdRestoreGame(int argc, const char **argv); -- cgit v1.2.3 From b97d7adc3b43c648e56738fc6e43736a74248961 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 12 Jun 2010 09:29:28 +0000 Subject: Extended show_instruments to show the songs where each instrument is used in svn-id: r49603 --- engines/sci/console.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 9d713cd2dd..bd597aaa19 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -866,9 +866,15 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { sort(resources->begin(), resources->end(), ResourceIdLess()); Common::List::iterator itr = resources->begin(); int instruments[128]; + bool instrumentsSongs[128][1000]; + for (int i = 0; i < 128; i++) instruments[i] = 0; + for (int i = 0; i < 128; i++) + for (int j = 0; j < 1000; j++) + instrumentsSongs[i][j] = false; + if (songNumber == -1) { DebugPrintf("%d sounds found, checking their instrument mappings...\n", resources->size()); DebugPrintf("Instruments:\n"); @@ -930,6 +936,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf(" %d", instrument); instruments[instrument]++; + instrumentsSongs[instrument][itr->number] = true; } break; case 0xD: @@ -984,6 +991,20 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf("%d, ", i); } DebugPrintf("\n\n"); + + DebugPrintf("Used instruments in songs:\n"); + for (int i = 0; i < 128; i++) { + if (instruments[i] > 0) { + DebugPrintf("Instrument %d: ", i); + for (int j = 0; j < 1000; j++) { + if (instrumentsSongs[i][j]) + DebugPrintf("%d, ", j); + } + DebugPrintf("\n"); + } + } + + DebugPrintf("\n\n"); } return true; -- cgit v1.2.3 From 277a700e6743b481eba8efb86fe37c339d880279 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 12 Jun 2010 11:32:28 +0000 Subject: Reimplemented the scaled sprite drawing logic. The first introduction sequence scene now displays correctly svn-id: r49604 --- engines/m4/graphics.cpp | 190 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 137 insertions(+), 53 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index dd18972eec..fc5cb0f9f9 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -401,41 +401,33 @@ void M4Surface::copyFrom(M4Surface *src, const Common::Rect &srcBounds, int dest */ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthsSurface, int scale, int transparentColour) { - /* TODO: This isn't a straight re-implementation of the original draw routine. Double check in future - * whether this implementation provides equivalent functionality - */ - Common::Rect copyRect(0, 0, src->width(), src->height()); - if (destX < 0) { - copyRect.left += -destX; - destX = 0; - } else if (destX + copyRect.width() > w) { - copyRect.right -= destX + copyRect.width() - w; - } - if (destY < 0) { - copyRect.top += -destY; - destY = 0; - } else if (destY + copyRect.height() > h) { - copyRect.bottom -= destY + copyRect.height() - h; - } - - if (!copyRect.isValidRect()) - return; + if (scale == 100) { + // Copy the specified area + Common::Rect copyRect(0, 0, src->width(), src->height()); + + if (destX < 0) { + copyRect.left += -destX; + destX = 0; + } else if (destX + copyRect.width() > w) { + copyRect.right -= destX + copyRect.width() - w; + } + if (destY < 0) { + copyRect.top += -destY; + destY = 0; + } else if (destY + copyRect.height() > h) { + copyRect.bottom -= destY + copyRect.height() - h; + } - if (scale != 100) { - destX -= (src->width() * scale / 100) / 2; - destY -= (src->height() * scale / 100); - } + if (!copyRect.isValidRect()) + return; - // Copy the specified area + byte *data = src->getBasePtr(); + byte *srcPtr = data + (src->width() * copyRect.top + copyRect.left); + byte *depthsData = depthsSurface->getBasePtr(); + byte *depthsPtr = depthsData + (src->width() * copyRect.top + copyRect.left); + byte *destPtr = (byte *)pixels + (destY * width()) + destX; - byte *data = src->getBasePtr(); - byte *srcPtr = data + (src->width() * copyRect.top + copyRect.left); - byte *depthsData = depthsSurface->getBasePtr(); - byte *depthsPtr = depthsData + (src->width() * copyRect.top + copyRect.left); - byte *destPtr = (byte *)pixels + (destY * width()) + destX; - - if (scale == 100) { // 100% scaling variation for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) { // Copy each byte one at a time checking against the depth @@ -448,35 +440,127 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surf depthsPtr += depthsSurface->width(); destPtr += width(); } - } else { - // Scaled variation - int currY = -1; - for (int rowCtr = 0, yTotal = 0; rowCtr < copyRect.height(); ++rowCtr, yTotal += scale, - srcPtr += src->width(), depthsPtr += depthsSurface->width()) { - int srcY = yTotal / 100; - if (srcY == currY) + src->freeData(); + depthsSurface->freeData(); + return; + } + + // Start of draw logic for scaled sprites + const byte *srcPixelsP = src->getBasePtr(); + + int destRight = this->width() - 1; + int destBottom = this->height() - 1; + bool normalFrame = true; // TODO: false for negative frame numbers + int frameWidth = src->width(); + int frameHeight = src->height(); + + int highestDim = MAX(frameWidth, frameHeight); + bool lineDist[MADS_SURFACE_WIDTH]; + int distIndex = 0; + int distXCount = 0, distYCount = 0; + + int distCtr = 0; + do { + distCtr += scale; + if (distCtr < 100) { + lineDist[distIndex] = false; + } else { + lineDist[distIndex] = true; + distCtr -= 100; + + if (distIndex < frameWidth) + ++distXCount; + + if (distIndex < frameHeight) + ++distYCount; + } + } while (++distIndex < highestDim); + + destX -= distXCount / 2; + destY -= distYCount - 1; + + // Check x bounding area + int spriteLeft = 0; + int spriteWidth = distXCount; + int widthAmount = destX + distXCount - 1; + + if (destX < 0) { + spriteWidth += destX; + spriteLeft -= destX; + } + widthAmount -= destRight; + if (widthAmount > 0) + spriteWidth -= widthAmount; + + int spriteRight = spriteLeft + spriteWidth; + if (spriteWidth <= 0) + return; + if (!normalFrame) { + destX += distXCount - 1; + spriteLeft = -(distXCount - spriteRight); + spriteRight = (-spriteLeft + spriteWidth); + } + + // Check y bounding area + int spriteTop = 0; + int spriteHeight = distYCount; + int heightAmount = destY + distYCount - 1; + + if (destY < 0) { + spriteHeight += destY; + spriteTop -= destY; + } + heightAmount -= destBottom; + if (heightAmount > 0) + spriteHeight -= heightAmount; + int spriteBottom = spriteTop + spriteHeight; + + if (spriteHeight <= 0) + return; + + byte *destPixelsP = this->getBasePtr(destX + spriteLeft, destY + spriteTop); + const byte *depthPixelsP = depthsSurface->getBasePtr(destX + spriteLeft, destY + spriteTop); + + spriteLeft = (spriteLeft * (normalFrame ? 1 : -1)); + + // Loop through the lines of the sprite + for (int yp = 0, sprY = -1; yp < frameHeight; ++yp, srcPixelsP += src->pitch) { + if (!lineDist[yp]) + // Not a display line, so skip it + continue; + // Check whether the sprite line is in the display range + ++sprY; + if ((sprY >= spriteBottom) || (sprY < spriteTop)) + continue; + + // Found a line to display. Loop through the pixels + const byte *srcP = srcPixelsP; + const byte *depthP = depthPixelsP; + byte *destP = destPixelsP; + for (int xp = 0, sprX = 0; xp < frameWidth; ++xp, ++srcP) { + if (xp < spriteLeft) + // Not yet reached start of display area + continue; + if (!lineDist[sprX++]) + // Not a display pixel continue; - currY = srcY; - - // Loop through the source pixels - int currX = -1; - byte *destP = destPtr; - for (int xCtr = 0, xTotal = 0; xCtr < copyRect.width(); ++xCtr, xTotal += scale) { - int srcX = xTotal / 100; - if (srcX == currX) - continue; - currX = srcX; - - if ((depthsPtr[currX] > depth) && (srcPtr[xCtr] != transparentColour)) - *destP++ = srcPtr[xCtr]; - } - destPtr += width(); + if (depth <= *depthP) + *destP = *srcP; + + ++destP; + ++depthP; } + + // Move to the next destination line + destPixelsP += this->pitch; + depthPixelsP += depthsSurface->pitch; } + src->freeData(); depthsSurface->freeData(); + this->freeData(); } void M4Surface::loadBackgroundRiddle(const char *sceneName) { -- cgit v1.2.3 From f4739f9f68026d5e3ea3304777260cef3101a031 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 12 Jun 2010 11:41:22 +0000 Subject: Added debug output to kDoAudio and some music commands. Also added a warning when an audio stream can't be created. Finally, the debug level of the MIDI parser debug output has been raised to 4, as it's too verbose svn-id: r49605 --- engines/sci/engine/ksound.cpp | 15 +++++++++++++-- engines/sci/sound/audio.cpp | 4 ++++ engines/sci/sound/midiparser_sci.cpp | 30 +++++++++++++++--------------- engines/sci/sound/soundcmd.cpp | 9 +++++++-- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index ebfd6e6885..8cf9400353 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -119,6 +119,8 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } + debugC(2, kDebugLevelSound, "kDoAudio: play sample %d, module %d", number, module); + // return sample length in ticks if (argv[0].toUint16() == kSciAudioWPlay) return make_reg(0, g_sci->_audio->wPlayAudio(module, number)); @@ -126,31 +128,39 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { return make_reg(0, g_sci->_audio->startAudio(module, number)); } case kSciAudioStop: + debugC(2, kDebugLevelSound, "kDoAudio: stop"); g_sci->_audio->stopAudio(); break; case kSciAudioPause: + debugC(2, kDebugLevelSound, "kDoAudio: pause"); g_sci->_audio->pauseAudio(); break; case kSciAudioResume: + debugC(2, kDebugLevelSound, "kDoAudio: resume"); g_sci->_audio->resumeAudio(); break; case kSciAudioPosition: + //debugC(2, kDebugLevelSound, "kDoAudio: get position"); // too verbose return make_reg(0, g_sci->_audio->getAudioPosition()); case kSciAudioRate: + debugC(2, kDebugLevelSound, "kDoAudio: set audio rate to %d", argv[1].toUint16()); g_sci->_audio->setAudioRate(argv[1].toUint16()); break; case kSciAudioVolume: { int16 volume = argv[1].toUint16(); volume = CLIP(volume, 0, AUDIO_VOLUME_MAX); + debugC(2, kDebugLevelSound, "kDoAudio: set volume to %d", volume); mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume * 2); break; } case kSciAudioLanguage: // In SCI1.1: tests for digital audio support - if (getSciVersion() == SCI_VERSION_1_1) + if (getSciVersion() == SCI_VERSION_1_1) { + debugC(2, kDebugLevelSound, "kDoAudio: audio capability test"); return make_reg(0, 1); - else { + } else { int16 language = argv[1].toSint16(); + debugC(2, kDebugLevelSound, "kDoAudio: set language to %d", language); if (language != -1) g_sci->getResMan()->setAudioLanguage(language); @@ -162,6 +172,7 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { } break; case kSciAudioCD: + debugC(2, kDebugLevelSound, "kDoAudio: CD audio subop"); return kDoCdAudio(s, argc - 1, argv + 1); // TODO: There are 3 more functions used in Freddy Pharkas (11, 12 and 13) and new within sierra sci // Details currently unknown diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 62cfcd9621..b0b9a73e00 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -69,6 +69,8 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { _wPlayFlag = false; _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_audioHandle, audioStream); return sampleLen; + } else { + warning("startAudio: unable to create stream for audio number %d, module %d", number, module); } return 0; @@ -81,6 +83,8 @@ int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { int sampleLen = 0; Audio::AudioStream *audioStream = getAudioStream(module, tuple, &sampleLen); + if (!audioStream) + warning("wPlayAudio: unable to create stream for audio tuple %d, module %d", tuple, module); delete audioStream; _wPlayFlag = true; return sampleLen; diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index f852367bfe..bb353da780 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -148,12 +148,12 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { _dataincAdd = false; _pSnd->dataInc += _dataincToAdd; _pSnd->signal = 0x7f + _pSnd->dataInc; - debugC(2, kDebugLevelSound, "datainc %04x", _dataincToAdd); + debugC(4, kDebugLevelSound, "datainc %04x", _dataincToAdd); } if (_signalSet) { _signalSet = false; _pSnd->signal = _signalToSet; - debugC(2, kDebugLevelSound, "signal %04x", _signalToSet); + debugC(4, kDebugLevelSound, "signal %04x", _signalToSet); } info.start = _position._play_pos; @@ -313,7 +313,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { _pSnd->status = kSoundStopped; _pSnd->signal = SIGNAL_OFFSET; - debugC(2, kDebugLevelSound, "signal EOT"); + debugC(4, kDebugLevelSound, "signal EOT"); } } break; @@ -376,21 +376,21 @@ byte *MidiParser_SCI::midiMixChannels() { command = *channel->data++; if (command != kEndOfTrack) { - debugC(2, kDebugLevelSound, "\nDELTA "); + debugC(4, kDebugLevelSound, "\nDELTA "); // Write delta while (new_delta > 240) { *outData++ = 0xF8; - debugC(2, kDebugLevelSound, "F8 "); + debugC(4, kDebugLevelSound, "F8 "); new_delta -= 240; } *outData++ = (byte)new_delta; - debugC(2, kDebugLevelSound, "%02X ", (uint32)new_delta); + debugC(4, kDebugLevelSound, "%02X ", (uint32)new_delta); } // Write command switch (command) { case 0xF0: // sysEx *outData++ = command; - debugC(2, kDebugLevelSound, "%02X ", command); + debugC(4, kDebugLevelSound, "%02X ", command); do { par1 = *channel->data++; *outData++ = par1; // out @@ -478,22 +478,22 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) { } if ((1 << curChannel) & channelMask) { if (command != kEndOfTrack) { - debugC(2, kDebugLevelSound, "\nDELTA "); + debugC(4, kDebugLevelSound, "\nDELTA "); // Write delta while (delta > 240) { *outData++ = 0xF8; - debugC(2, kDebugLevelSound, "F8 "); + debugC(4, kDebugLevelSound, "F8 "); delta -= 240; } *outData++ = (byte)delta; - debugC(2, kDebugLevelSound, "%02X ", delta); + debugC(4, kDebugLevelSound, "%02X ", delta); delta = 0; } // Write command switch (command) { case 0xF0: // sysEx *outData++ = command; - debugC(2, kDebugLevelSound, "%02X ", command); + debugC(4, kDebugLevelSound, "%02X ", command); do { curByte = *channelData++; *outData++ = curByte; // out @@ -507,20 +507,20 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) { default: // MIDI command if (lastCommand != command) { *outData++ = command; - debugC(2, kDebugLevelSound, "%02X ", command); + debugC(4, kDebugLevelSound, "%02X ", command); lastCommand = command; } if (midiParamCount > 0) { if (curByte & 0x80) { - debugC(2, kDebugLevelSound, "%02X ", *channelData); + debugC(4, kDebugLevelSound, "%02X ", *channelData); *outData++ = *channelData++; } else { - debugC(2, kDebugLevelSound, "%02X ", curByte); + debugC(4, kDebugLevelSound, "%02X ", curByte); *outData++ = curByte; } } if (midiParamCount > 1) { - debugC(2, kDebugLevelSound, "%02X ", *channelData); + debugC(4, kDebugLevelSound, "%02X ", *channelData); *outData++ = *channelData++; } } diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 2bbc5b44de..71fc2b7ef0 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -307,6 +307,9 @@ void SoundCommandParser::cmdInitSound(reg_t obj, int16 value) { if (_soundVersion >= SCI_VERSION_1_EARLY) newSound->volume = CLIP(readSelectorValue(_segMan, obj, SELECTOR(vol)), 0, MUSIC_VOLUME_MAX); + debugC(2, kDebugLevelSound, "cmdInitSound, number %d, loop %d, prio %d, vol %d", resourceId, + newSound->loop, newSound->priority, newSound->volume); + // In SCI1.1 games, sound effects are started from here. If we can find // a relevant audio resource, play it, otherwise switch to synthesized // effects. If the resource exists, play it using map 65535 (sound @@ -423,8 +426,6 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { // Find slot again :) musicSlot = _music->getSlot(obj); } - int16 loop = readSelectorValue(_segMan, obj, SELECTOR(loop)); - debugC(2, kDebugLevelSound, "cmdPlaySound: resource number %d, loop %d", resourceId, loop); writeSelector(_segMan, obj, SELECTOR(handle), obj); @@ -442,6 +443,10 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { musicSlot->priority = readSelectorValue(_segMan, obj, SELECTOR(priority)); if (_soundVersion >= SCI_VERSION_1_EARLY) musicSlot->volume = readSelectorValue(_segMan, obj, SELECTOR(vol)); + + debugC(2, kDebugLevelSound, "cmdPlaySound, number %d, loop %d, prio %d, vol %d", resourceId, + musicSlot->loop, musicSlot->priority, musicSlot->volume); + _music->soundPlay(musicSlot); #endif -- cgit v1.2.3 From 6fa4d1ba805237cd44f6c64cf1088988c5d652f8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 12 Jun 2010 11:43:30 +0000 Subject: Initialize compression-related variables when loading external patch files. Fixes Cassima's speech in the intro of KQ6 (the engine thought that the external patch files of her speech were compressed) svn-id: r49606 --- engines/sci/resource.cpp | 4 ++++ engines/sci/resource_audio.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 0b7badb8f7..05aae0a39e 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1230,6 +1230,8 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; psrcPatch->resourceFile = 0; + psrcPatch->audioCompressionType = 0; + psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } } @@ -1281,6 +1283,8 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; psrcPatch->resourceFile = 0; + psrcPatch->audioCompressionType = 0; + psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, (ResourceType)i, resourceNr); } } diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 861866edc0..0e60239331 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -158,6 +158,8 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { psrcPatch->source_type = kSourcePatch; psrcPatch->resourceFile = 0; psrcPatch->location_name = gmPatchFile; + psrcPatch->audioCompressionType = 0; + psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, kResourceTypePatch, 4); } } -- cgit v1.2.3 From 0492bd6aa65fa931bb84bb994f9e9e9757acc90a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 12 Jun 2010 18:20:22 +0000 Subject: SAGA: Music code cleanup. The music driver is now placed inside the MusicPlayer class, instead of the SagaEngine class. Split the functionality that the music parser should handle from the functionality that the music driver should handle. Also, fixed a bug in MusicDriver::send() (the notes off signal was sent to unallocated channels, not allocated ones) svn-id: r49607 --- engines/saga/music.cpp | 272 +++++++++++++++++++------------------------------ engines/saga/music.h | 52 ++++------ engines/saga/saga.cpp | 16 +-- engines/saga/saga.h | 1 - 4 files changed, 123 insertions(+), 218 deletions(-) diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index 75c5cdffd7..f38e47dc48 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -42,19 +42,25 @@ namespace Saga { #define BUFFER_SIZE 4096 #define MUSIC_SUNSPOT 26 -MusicPlayer::MusicPlayer(MidiDriver *driver) : _parser(0), _driver(driver), _looping(false), _isPlaying(false), _passThrough(false), _isGM(false) { +MusicDriver::MusicDriver() : _isGM(false) { memset(_channel, 0, sizeof(_channel)); _masterVolume = 0; + _nativeMT32 = ConfMan.getBool("native_mt32"); + + _driverType = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _driver = MidiDriver::createMidi(_driverType); + if (isMT32()) + _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); + this->open(); } -MusicPlayer::~MusicPlayer() { - _driver->setTimerCallback(NULL, NULL); - stopMusic(); +MusicDriver::~MusicDriver() { this->close(); + delete _driver; } -void MusicPlayer::setVolume(int volume) { +void MusicDriver::setVolume(int volume) { volume = CLIP(volume, 0, 255); if (_masterVolume == volume) @@ -71,32 +77,7 @@ void MusicPlayer::setVolume(int volume) { } } -int MusicPlayer::open() { - // Don't ever call open without first setting the output driver! - if (!_driver) - return 255; - - int ret = _driver->open(); - if (ret) - return ret; - - _driver->setTimerCallback(this, &onTimer); - return 0; -} - -void MusicPlayer::close() { - stopMusic(); - if (_driver) - _driver->close(); - _driver = 0; -} - -void MusicPlayer::send(uint32 b) { - if (_passThrough) { - _driver->send(b); - return; - } - +void MusicDriver::send(uint32 b) { byte channel = (byte)(b & 0x0F); if ((b & 0xFFF0) == 0x07B0) { // Adjust volume changes by master volume @@ -104,71 +85,86 @@ void MusicPlayer::send(uint32 b) { _channelVolume[channel] = volume; volume = volume * _masterVolume / 255; b = (b & 0xFF00FFFF) | (volume << 16); - } else if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) { + } else if ((b & 0xF0) == 0xC0 && !_isGM && !isMT32()) { + // Remap MT32 instruments to General Midi b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; - } - else if ((b & 0xFFF0) == 0x007BB0) { - //Only respond to All Notes Off if this channel - //has currently been allocated - if (_channel[b & 0x0F]) + } else if ((b & 0xFFF0) == 0x007BB0) { + // Only respond to All Notes Off if this channel + // has currently been allocated + if (!_channel[channel]) return; } if (!_channel[channel]) _channel[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); - - if (_channel[channel]) + else _channel[channel]->send(b); } -void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { - // FIXME: The "elkfanfare" is played much too quickly. There are some - // meta events that we don't handle. Perhaps there is a - // connection...? - - switch (type) { - case 0x2F: // End of Track - if (_looping) - _parser->jumpToTick(0); - else - stopMusic(); - break; - default: - //warning("Unhandled meta event: %02x", type); - break; - } -} - -void MusicPlayer::onTimer(void *refCon) { - MusicPlayer *music = (MusicPlayer *)refCon; - Common::StackLock lock(music->_mutex); - - if (music->_isPlaying) - music->_parser->onTimer(); -} - -void MusicPlayer::playMusic() { - _isPlaying = true; -} +Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) { + _currentVolume = 0; + _driver = new MusicDriver(); -void MusicPlayer::stopMusic() { - Common::StackLock lock(_mutex); + _digitalMusicContext = _vm->_resource->getContext(GAME_DIGITALMUSICFILE); + if (!_driver->isAdlib()) + _musicContext = _vm->_resource->getContext(GAME_MUSICFILE_GM); + else + _musicContext = _vm->_resource->getContext(GAME_MUSICFILE_FM); - _isPlaying = false; - if (_parser) { - _parser->unloadMusic(); - _parser = NULL; + if (!_musicContext) { + if (_vm->getGameId() == GID_ITE) { + _musicContext = _vm->_resource->getContext(GAME_RESOURCEFILE); + } else { + // I've listened to music from both the FM and the GM + // file, and I've tentatively reached the conclusion + // that they are both General MIDI. My guess is that + // the FM file has been reorchestrated to sound better + // on AdLib and other FM synths. + // + // Sev says the AdLib music does not sound like in the + // original, but I still think assuming General MIDI is + // the right thing to do. Some music, like the End + // Title (song 0) sound absolutely atrocious when piped + // through our MT-32 to GM mapping. + // + // It is, however, quite possible that the original + // used a different GM to FM mapping. If the original + // sounded markedly better, perhaps we should add some + // way of replacing our stock mapping in adlib.cpp? + // + // For the composer's own recording of the End Title, + // see http://www.johnottman.com/ + + // Oddly enough, the intro music (song 1) is very + // different in the two files. I have no idea why. + // Note that the IHNM demo has only got one music file + // (music.rsc). It is assumed that it contains FM music + _musicContext = _vm->_resource->getContext(GAME_MUSICFILE_FM); + } } -} -Music::Music(SagaEngine *vm, Audio::Mixer *mixer, MidiDriver *driver) : _vm(vm), _mixer(mixer), _adlib(false) { - _player = new MusicPlayer(driver); - _currentVolume = 0; - - xmidiParser = MidiParser::createParser_XMIDI(); - smfParser = MidiParser::createParser_SMF(); + // Check if the game is using XMIDI or SMF music + if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) { + // Just set an XMIDI parser for Mac IHNM for now + _parser = MidiParser::createParser_XMIDI(); + } else { + byte *resourceData; + size_t resourceSize; + int resourceId = (_vm->getGameId() == GID_ITE ? 9 : 0); + _vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize); + if (!memcmp(resourceData, "FORM", 4)) { + _parser = MidiParser::createParser_XMIDI(); + // ITE had MT32 mapped instruments + _driver->setGM(_vm->getGameId() != GID_ITE); + } else { + _parser = MidiParser::createParser_SMF(); + } + free(resourceData); + } - _digitalMusicContext = _vm->_resource->getContext(GAME_DIGITALMUSICFILE); + _parser->setMidiDriver(_driver); + _parser->setTimerRate(_driver->getBaseTempo()); + _parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); _songTableLen = 0; _songTable = 0; @@ -180,11 +176,11 @@ Music::Music(SagaEngine *vm, Audio::Mixer *mixer, MidiDriver *driver) : _vm(vm), Music::~Music() { _vm->getTimerManager()->removeTimerProc(&musicVolumeGaugeCallback); _mixer->stopHandle(_musicHandle); - delete _player; - xmidiParser->setMidiDriver(NULL); - smfParser->setMidiDriver(NULL); - delete xmidiParser; - delete smfParser; + _driver->setTimerCallback(NULL, NULL); + _driver->close(); + delete _driver; + _parser->setMidiDriver(NULL); + delete _parser; free(_songTable); free(_midiMusicData); @@ -194,6 +190,12 @@ void Music::musicVolumeGaugeCallback(void *refCon) { ((Music *)refCon)->musicVolumeGauge(); } +void Music::onTimer(void *refCon) { + Music *music = (Music *)refCon; + Common::StackLock lock(music->_driver->_mutex); + music->_parser->onTimer(); +} + void Music::musicVolumeGauge() { int volume; @@ -209,7 +211,7 @@ void Music::musicVolumeGauge() { volume = 1; _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, volume); - _player->setVolume(volume); + _driver->setVolume(volume); if (_currentVolumePercent == 100) { _vm->getTimerManager()->removeTimerProc(&musicVolumeGaugeCallback); @@ -226,7 +228,7 @@ void Music::setVolume(int volume, int time) { if (time == 1) { _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, volume); - _player->setVolume(volume); + _driver->setVolume(volume); _vm->getTimerManager()->removeTimerProc(&musicVolumeGaugeCallback); _currentVolume = volume; return; @@ -236,13 +238,11 @@ void Music::setVolume(int volume, int time) { } bool Music::isPlaying() { - return _mixer->isSoundHandleActive(_musicHandle) || _player->isPlaying(); + return _mixer->isSoundHandleActive(_musicHandle) || _parser->isPlaying(); } void Music::play(uint32 resourceId, MusicFlags flags) { Audio::SeekableAudioStream *audioStream = NULL; - MidiParser *parser; - ResourceContext *context = NULL; byte *resourceData; size_t resourceSize; uint32 loopStart; @@ -254,8 +254,8 @@ void Music::play(uint32 resourceId, MusicFlags flags) { } _trackNumber = resourceId; - _player->stopMusic(); _mixer->stopHandle(_musicHandle); + _parser->unloadMusic(); int realTrackNumber; @@ -356,55 +356,10 @@ void Music::play(uint32 resourceId, MusicFlags flags) { return; } - if (flags == MUSIC_DEFAULT) { + if (flags == MUSIC_DEFAULT) flags = MUSIC_NORMAL; - } // Load MIDI/XMI resource data - - if (_vm->getGameId() == GID_ITE) { - context = _vm->_resource->getContext(GAME_MUSICFILE_GM); - if (context == NULL) { - context = _vm->_resource->getContext(GAME_RESOURCEFILE); - } - } else if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) { - // The music of the Mac version of IHNM is loaded from its - // associated external file later on - } else { - // I've listened to music from both the FM and the GM - // file, and I've tentatively reached the conclusion - // that they are both General MIDI. My guess is that - // the FM file has been reorchestrated to sound better - // on AdLib and other FM synths. - // - // Sev says the AdLib music does not sound like in the - // original, but I still think assuming General MIDI is - // the right thing to do. Some music, like the End - // Title (song 0) sound absolutely atrocious when piped - // through our MT-32 to GM mapping. - // - // It is, however, quite possible that the original - // used a different GM to FM mapping. If the original - // sounded markedly better, perhaps we should add some - // way of replacing our stock mapping in adlib.cpp? - // - // For the composer's own recording of the End Title, - // see http://www.johnottman.com/ - - // Oddly enough, the intro music (song 1) is very - // different in the two files. I have no idea why. - // Note that the IHNM demo has only got one music file - // (music.rsc). It is assumed that it contains FM music - - if (hasAdLib() || _vm->isIHNMDemo()) { - context = _vm->_resource->getContext(GAME_MUSICFILE_FM); - } else { - context = _vm->_resource->getContext(GAME_MUSICFILE_GM); - } - } - - _player->setGM(true); - if (_vm->getGameId() == GID_IHNM && _vm->isMacResources()) { // Load the external music file for Mac IHNM #if 0 @@ -422,56 +377,39 @@ void Music::play(uint32 resourceId, MusicFlags flags) { #endif return; } else { - _vm->_resource->loadResource(context, resourceId, resourceData, resourceSize); + _vm->_resource->loadResource(_musicContext, resourceId, resourceData, resourceSize); } if (resourceSize < 4) { error("Music::play() wrong music resource size"); } - if (xmidiParser->loadMusic(resourceData, resourceSize)) { - if (_vm->getGameId() == GID_ITE) - _player->setGM(false); + if (!_parser->loadMusic(resourceData, resourceSize)) + error("Music::play() wrong music resource"); - parser = xmidiParser; - } else { - if (smfParser->loadMusic(resourceData, resourceSize)) { - parser = smfParser; - } else { - error("Music::play() wrong music resource"); - } - } - - parser->setTrack(0); - parser->setMidiDriver(_player); - parser->setTimerRate(_player->getBaseTempo()); - parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); + _parser->setTrack(0); + _driver->setTimerCallback(this, &onTimer); - _player->_parser = parser; setVolume(_vm->_musicVolume); - if (flags & MUSIC_LOOP) - _player->setLoop(true); - else - _player->setLoop(false); + // Handle music looping + _parser->property(MidiParser::mpAutoLoop, (flags & MUSIC_LOOP) ? 1 : 0); - _player->playMusic(); free(_midiMusicData); _midiMusicData = resourceData; } void Music::pause() { - _player->setVolume(-1); - _player->setPlaying(false); + _driver->setTimerCallback(NULL, NULL); } void Music::resume() { - _player->setVolume(_vm->_musicVolume); - _player->setPlaying(true); + _driver->setTimerCallback(this, &onTimer); } void Music::stop() { - _player->stopMusic(); + _driver->setTimerCallback(NULL, NULL); + _parser->unloadMusic(); } } // End of namespace Saga diff --git a/engines/saga/music.h b/engines/saga/music.h index 22711ba167..cb068cd835 100644 --- a/engines/saga/music.h +++ b/engines/saga/music.h @@ -44,41 +44,32 @@ enum MusicFlags { MUSIC_DEFAULT = 0xffff }; -class MusicPlayer : public MidiDriver { +class MusicDriver : public MidiDriver { public: - MusicPlayer(MidiDriver *driver); - ~MusicPlayer(); - - bool isPlaying() { return _isPlaying; } - void setPlaying(bool playing) { _isPlaying = playing; } + MusicDriver(); + ~MusicDriver(); void setVolume(int volume); int getVolume() { return _masterVolume; } - void setNativeMT32(bool b) { _nativeMT32 = b; } - bool hasNativeMT32() { return _nativeMT32; } - void playMusic(); - void stopMusic(); - void setLoop(bool loop) { _looping = loop; } - void setPassThrough(bool b) { _passThrough = b; } - + bool isAdlib() { return _driverType == MD_ADLIB; } + bool isMT32() { return _driverType == MD_MT32 || _nativeMT32; } void setGM(bool isGM) { _isGM = isGM; } //MidiDriver interface implementation - int open(); - void close(); + int open() { return _driver->open(); } + void close() { _driver->close(); } void send(uint32 b); - void metaEvent(byte type, byte *data, uint16 length); + void metaEvent(byte type, byte *data, uint16 length) {} - void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { } - uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; } + void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { _driver->setTimerCallback(timerParam, timerProc); } + uint32 getBaseTempo() { return _driver->getBaseTempo(); } //Channel allocation functions MidiChannel *allocateChannel() { return 0; } MidiChannel *getPercussionChannel() { return 0; } - MidiParser *_parser; Common::Mutex _mutex; protected: @@ -87,14 +78,11 @@ protected: MidiChannel *_channel[16]; MidiDriver *_driver; + MidiDriverType _driverType; byte _channelVolume[16]; - bool _nativeMT32; bool _isGM; - bool _passThrough; + bool _nativeMT32; - bool _isPlaying; - bool _looping; - bool _randomLoop; byte _masterVolume; byte *_musicData; @@ -105,13 +93,8 @@ protected: class Music { public: - Music(SagaEngine *vm, Audio::Mixer *mixer, MidiDriver *driver); + Music(SagaEngine *vm, Audio::Mixer *mixer); ~Music(); - void setNativeMT32(bool b) { _player->setNativeMT32(b); } - bool hasNativeMT32() { return _player->hasNativeMT32(); } - void setAdLib(bool b) { _adlib = b; } - bool hasAdLib() { return _adlib; } - void setPassThrough(bool b) { _player->setPassThrough(b); } bool isPlaying(); bool hasDigitalMusic() { return _digitalMusic; } @@ -130,24 +113,23 @@ private: SagaEngine *_vm; Audio::Mixer *_mixer; - MusicPlayer *_player; + MusicDriver *_driver; Audio::SoundHandle _musicHandle; uint32 _trackNumber; - bool _adlib; - int _targetVolume; int _currentVolume; int _currentVolumePercent; bool _digitalMusic; + ResourceContext *_musicContext; ResourceContext *_digitalMusicContext; - MidiParser *xmidiParser; - MidiParser *smfParser; + MidiParser *_parser; byte *_midiMusicData; static void musicVolumeGaugeCallback(void *refCon); + static void onTimer(void *refCon); void musicVolumeGauge(); }; diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp index ed8a9055ba..446ab86228 100644 --- a/engines/saga/saga.cpp +++ b/engines/saga/saga.cpp @@ -83,7 +83,6 @@ SagaEngine::SagaEngine(OSystem *syst, const SAGAGameDescription *gameDesc) _sndRes = NULL; _sound = NULL; _music = NULL; - _driver = NULL; _anim = NULL; _render = NULL; _isoMap = NULL; @@ -198,9 +197,6 @@ SagaEngine::~SagaEngine() { delete _sound; _sound = NULL; - delete _driver; - _driver = NULL; - delete _gfx; _gfx = NULL; @@ -285,17 +281,7 @@ Common::Error SagaEngine::run() { _console = new Console(this); // Graphics should be initialized before music - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - bool adlib = (midiDriver == MD_ADLIB); - - _driver = MidiDriver::createMidi(midiDriver); - if (native_mt32) - _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - - _music = new Music(this, _mixer, _driver); - _music->setNativeMT32(native_mt32); - _music->setAdLib(adlib); + _music = new Music(this, _mixer); _render = new Render(this, _system); if (!_render->initialized()) { return Common::kUnknownError; diff --git a/engines/saga/saga.h b/engines/saga/saga.h index 2bef489e05..102d1e5c82 100644 --- a/engines/saga/saga.h +++ b/engines/saga/saga.h @@ -525,7 +525,6 @@ public: SndRes *_sndRes; Sound *_sound; Music *_music; - MidiDriver *_driver; Anim *_anim; Render *_render; IsoMap *_isoMap; -- cgit v1.2.3 From 2625c9b20be6ed4bef0fd8da600729a7316d7ac4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 12 Jun 2010 23:53:26 +0000 Subject: Applied fix for checking unallocated channels for All Notes Off MIDI command svn-id: r49613 --- engines/m4/midi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/midi.cpp b/engines/m4/midi.cpp index 78fe0d6bd6..2c767fdf5a 100644 --- a/engines/m4/midi.cpp +++ b/engines/m4/midi.cpp @@ -109,7 +109,7 @@ void MidiPlayer::send(uint32 b) { else if ((b & 0xFFF0) == 0x007BB0) { //Only respond to All Notes Off if this channel //has currently been allocated - if (_channel[b & 0x0F]) + if (!_channel[b & 0x0F]) return; } -- cgit v1.2.3 From 0659d5f2448cbea343d294146ba20f656f759f42 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 06:55:24 +0000 Subject: Improved debug output of BRA walk code. svn-id: r49618 --- engines/parallaction/walk.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp index 8fc916e490..4468a7a678 100644 --- a/engines/parallaction/walk.cpp +++ b/engines/parallaction/walk.cpp @@ -450,7 +450,7 @@ void PathWalker_BR::buildPath(State &s, uint16 x, uint16 y) { Common::Point foot; s._a->getFoot(foot); - debugC(1, kDebugWalk, "buildPath: from (%i, %i) to (%i, %i)", foot.x, foot.y, x, y); + debugC(1, kDebugWalk, "buildPath: try to build path from (%i, %i) to (%i, %i)", foot.x, foot.y, x, y); s._walkPath.clear(); // look for easy path first @@ -465,13 +465,13 @@ void PathWalker_BR::buildPath(State &s, uint16 x, uint16 y) { ZonePtr z0 = _vm->hitZone(kZonePath, x, y); if (!z0) { s._walkPath.push_back(dest); - debugC(3, kDebugWalk, "buildPath: corner case 0"); + debugC(3, kDebugWalk, "buildPath: corner case 0 (%i nodes)", s._walkPath.size()); return; } ZonePtr z1 = _vm->hitZone(kZonePath, foot.x, foot.y); if (!z1 || z1 == z0) { s._walkPath.push_back(dest); - debugC(3, kDebugWalk, "buildPath: corner case 1"); + debugC(3, kDebugWalk, "buildPath: corner case 1 (%i nodes)", s._walkPath.size()); return; } @@ -480,7 +480,7 @@ void PathWalker_BR::buildPath(State &s, uint16 x, uint16 y) { if (z1->u._pathLists[id].empty()) { s._walkPath.clear(); - debugC(3, kDebugWalk, "buildPath: no path"); + debugC(3, kDebugWalk, "buildPath: no path found"); return; } @@ -490,7 +490,7 @@ void PathWalker_BR::buildPath(State &s, uint16 x, uint16 y) { s._walkPath.push_front(*b); } s._walkPath.push_back(dest); - debugC(3, kDebugWalk, "buildPath: complex path"); + debugC(3, kDebugWalk, "buildPath: complex path (%i nodes)", s._walkPath.size()); } @@ -541,8 +541,6 @@ void PathWalker_BR::walk() { return; } - debugC(3, kDebugWalk, "PathWalker_BR::walk()"); - doWalk(_character); doWalk(_follower); @@ -566,8 +564,6 @@ void PathWalker_BR::walk() { } _vm->_gfx->initiateScroll(dx, dy); - - debugC(3, kDebugWalk, "PathWalker_BR::walk() -> done"); } void PathWalker_BR::checkTrap(const Common::Point &p) { @@ -601,8 +597,6 @@ void PathWalker_BR::doWalk(State &s) { return; } - debugC(3, kDebugWalk, "PathWalker_BR::doWalk(%s)", s._a->_name); - if (s._walkDelay > 0) { s._walkDelay--; if (s._walkDelay == 0 && s._a->_scriptName) { @@ -619,10 +613,10 @@ void PathWalker_BR::doWalk(State &s) { if (s._walkPath.empty()) { finalizeWalk(s); - debugC(3, kDebugWalk, "PathWalker_BR::doWalk, case 0"); + debugC(3, kDebugWalk, "PathWalker_BR::doWalk, walk completed (no more nodes)"); return; } else { - debugC(3, kDebugWalk, "PathWalker_BR::doWalk, moving to next node"); + debugC(3, kDebugWalk, "PathWalker_BR::doWalk, reached a walkpath node, %i left", s._walkPath.size()); } } @@ -714,7 +708,7 @@ void PathWalker_BR::doWalk(State &s) { Common::Point p2; s._a->getFoot(p2); checkTrap(p2); - debugC(3, kDebugWalk, "PathWalker_BR::doWalk, case 1"); + debugC(3, kDebugWalk, "PathWalker_BR::doWalk, stepped to (%i, %i)", p2.x, p2.y); return; } -- cgit v1.2.3 From 3cacd7bc4372dbaae5c454236b4413ab87955347 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 06:55:40 +0000 Subject: Keep the balloon from getting stuck in an infinite loop when floating near the borders of the screen. See the detailed explanation in walk.cpp. svn-id: r49619 --- engines/parallaction/walk.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp index 4468a7a678..d6df23d415 100644 --- a/engines/parallaction/walk.cpp +++ b/engines/parallaction/walk.cpp @@ -626,6 +626,19 @@ void PathWalker_BR::doWalk(State &s) { int xStep = (scale * 16) / 100 + 1; int yStep = (scale * 10) / 100 + 1; + + /* WORKAROUND: in the balloon scene, the position of the balloon (which is implemented as a + Character) is controlled by the user (for movement, via this walking code) and by the scripts + (to simulate the balloon floating in the air, in a neverending loop that alters the position + coordinates). + When the two step sizes are equal in magnitude and opposite in direction, then the walk code + enters an infinite loop without giving control back to the user (this happens quite frequently + when navigating the balloon near the borders of the screen, where the calculated step is + forcibly small because of clipping). Since the "floating" script (part1/scripts/mongolo.scr) + uses increments of 3 for both x and y, we tweak the calculated steps accordingly here. */ + if (xStep == 3) xStep--; + if (yStep == 3) yStep--; + debugC(9, kDebugWalk, "calculated step: (%i, %i)", xStep, yStep); s._fieldC = 0; -- cgit v1.2.3 From d16eb491b17e662705e80d14c1f2ebe5f4e38cef Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 06:55:58 +0000 Subject: Support for vertical scrolling. Patch 3005933 by fuzzie. svn-id: r49620 --- engines/parallaction/gfxbase.cpp | 4 +++- engines/parallaction/graphics.cpp | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp index fc6cb28d9e..835bb204b4 100644 --- a/engines/parallaction/gfxbase.cpp +++ b/engines/parallaction/gfxbase.cpp @@ -222,10 +222,12 @@ void Gfx::drawGfxObject(GfxObj *obj, Graphics::Surface &surf) { obj->getRect(obj->frame, rect); int x = obj->x; + int y = obj->y; if (_overlayMode) { x += _scrollPosX; + y += _scrollPosY; } - rect.translate(x, obj->y); + rect.translate(x, y); data = obj->getData(obj->frame); if (obj->getSize(obj->frame) == obj->getRawSize(obj->frame)) { diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index bc1759ecd7..2990d024d2 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -317,8 +317,10 @@ void Gfx::drawList(Graphics::Surface &surface, GfxObjArray &list) { void Gfx::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { if (_doubleBuffering) { - if (_overlayMode) + if (_overlayMode) { x += _scrollPosX; + y += _scrollPosY; + } byte *dst = (byte*)_backBuffer.getBasePtr(x, y); for (int i = 0; i < h; i++) { @@ -358,7 +360,7 @@ void Gfx::unlockScreen() { void Gfx::updateScreenIntern() { if (_doubleBuffering) { - byte *data = (byte*)_backBuffer.getBasePtr(_scrollPosX, 0); + byte *data = (byte*)_backBuffer.getBasePtr(_scrollPosX, _scrollPosY); _vm->_system->copyRectToScreen(data, _backBuffer.pitch, 0, 0, _vm->_screenWidth, _vm->_screenHeight); } @@ -863,6 +865,8 @@ void Gfx::setBackground(uint type, BackgroundInfo *info) { _minScrollX = 0; _maxScrollX = MAX(0, _backgroundInfo->width - _vm->_screenWidth); + _minScrollY = 0; + _maxScrollY = MAX(0, _backgroundInfo->height - _vm->_screenHeight); } -- cgit v1.2.3 From 94cdfefe1c9c32b3497d8d1564d4e5e0940dc403 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 06:56:13 +0000 Subject: Fixed clipping when drawing sprites at small scale factors (this fixes the balloon scene). svn-id: r49621 --- engines/parallaction/gfxbase.cpp | 56 ++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp index 835bb204b4..a1926fc197 100644 --- a/engines/parallaction/gfxbase.cpp +++ b/engines/parallaction/gfxbase.cpp @@ -283,30 +283,54 @@ void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *sur return; } - Common::Rect q(r); - Common::Rect clipper(surf->w, surf->h); - q.clip(clipper); - if (!q.isValidRect()) return; - - uint inc = r.width() * (100 - scale); - uint thr = r.width() * 100; - uint xAccum = 0, yAccum = 0; + // unscaled rectangle size + uint width = r.width(); + uint height = r.height(); + + // scaled rectangle size + uint scaledWidth = r.width() * scale / 100; + uint scaledHeight = r.height() * scale / 100; + + // scaled rectangle origin + uint scaledLeft = r.left + (width - scaledWidth) / 2; + uint scaledTop = r.top + (height - scaledHeight); + + // clipped scaled destination rectangle + Common::Rect dstRect(scaledWidth, scaledHeight); + dstRect.moveTo(scaledLeft, scaledTop); + + Common::Rect clipper(surf->w, surf->h); + dstRect.clip(clipper); + if (!dstRect.isValidRect()) return; + + + // clipped source rectangle + Common::Rect srcRect; + srcRect.left = (dstRect.left - scaledLeft) * 100 / scale; + srcRect.top = (dstRect.top - scaledTop) * 100 / scale; + srcRect.setWidth(dstRect.width() * 100 / scale); + srcRect.setHeight(dstRect.height() * 100 / scale); + if (!srcRect.isValidRect()) return; Common::Point dp; - dp.x = q.left + (r.width() * (100 - scale)) / 200; - dp.y = q.top + (r.height() * (100 - scale)) / 100; - q.translate(-r.left, -r.top); - byte *s = data + q.left + q.top * r.width(); + dp.x = dstRect.left; + dp.y = dstRect.top; + + byte *s = data + srcRect.left + srcRect.top * width; byte *d = (byte*)surf->getBasePtr(dp.x, dp.y); uint line = 0, col = 0; - for (uint16 i = 0; i < q.height(); i++) { + uint xAccum = 0, yAccum = 0; + uint inc = width * (100 - scale); + uint thr = width * 100; + + for (uint16 i = 0; i < srcRect.height(); i++) { yAccum += inc; if (yAccum >= thr) { yAccum -= thr; - s += r.width(); + s += width; continue; } @@ -314,7 +338,7 @@ void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *sur byte *d2 = d; col = 0; - for (uint16 j = 0; j < q.width(); j++) { + for (uint16 j = 0; j < srcRect.width(); j++) { xAccum += inc; if (xAccum >= thr) { @@ -337,7 +361,7 @@ void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *sur col++; } - s += r.width() - q.width(); + s += width - srcRect.width(); d += surf->w; line++; } -- cgit v1.2.3 From eff1d4bb1c2e1a33946c7333c3d28f38dfdcb5e8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 13 Jun 2010 07:17:44 +0000 Subject: Added a default constructor for the ResourceSource struct svn-id: r49622 --- engines/sci/resource.cpp | 20 -------------------- engines/sci/resource.h | 9 +++++++++ 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 05aae0a39e..1906510d24 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -174,9 +174,6 @@ ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volum newsrc->source_type = kSourceExtMap; newsrc->location_name = file_name; - newsrc->resourceFile = 0; - newsrc->scanned = false; - newsrc->associated_map = NULL; newsrc->volume_number = volume_nr; _sources.push_back(newsrc); @@ -189,8 +186,6 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i newsrc->source_type = kSourceExtMap; newsrc->location_name = mapFile->getName(); newsrc->resourceFile = mapFile; - newsrc->scanned = false; - newsrc->associated_map = NULL; newsrc->volume_number = volume_nr; _sources.push_back(newsrc); @@ -201,13 +196,9 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty ResourceSource *newsrc = new ResourceSource(); newsrc->source_type = type; - newsrc->scanned = false; newsrc->location_name = filename; - newsrc->resourceFile = 0; newsrc->volume_number = number; newsrc->associated_map = map; - newsrc->audioCompressionType = 0; - newsrc->audioCompressionOffsetMapping = NULL; if (type == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); @@ -219,13 +210,10 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty ResourceSource *newsrc = new ResourceSource(); newsrc->source_type = type; - newsrc->scanned = false; newsrc->location_name = resFile->getName(); newsrc->resourceFile = resFile; newsrc->volume_number = number; newsrc->associated_map = map; - newsrc->audioCompressionType = 0; - newsrc->audioCompressionOffsetMapping = NULL; if (type == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); @@ -237,8 +225,6 @@ ResourceSource *ResourceManager::addPatchDir(const char *dirname) { ResourceSource *newsrc = new ResourceSource(); newsrc->source_type = kSourceDirectory; - newsrc->resourceFile = 0; - newsrc->scanned = false; newsrc->location_name = dirname; _sources.push_back(newsrc); @@ -1229,9 +1215,6 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { psrcPatch = new ResourceSource; psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; - psrcPatch->resourceFile = 0; - psrcPatch->audioCompressionType = 0; - psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } } @@ -1282,9 +1265,6 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { psrcPatch = new ResourceSource; psrcPatch->source_type = kSourcePatch; psrcPatch->location_name = name; - psrcPatch->resourceFile = 0; - psrcPatch->audioCompressionType = 0; - psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, (ResourceType)i, resourceNr); } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 66742f11f5..7fbb3ca9a2 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -133,6 +133,15 @@ struct ResourceSource { uint32 audioCompressionType; int32 *audioCompressionOffsetMapping; Common::MacResManager macResMan; + ResourceSource() { + source_type = kSourceDirectory; + scanned = false; + resourceFile = 0; + volume_number = 0; + associated_map = NULL; + audioCompressionType = 0; + audioCompressionOffsetMapping = NULL; + } }; class ResourceId { -- cgit v1.2.3 From d1993773880143d234f3355dd5a03f778e35b78c Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 07:35:48 +0000 Subject: When closing inventory, do not force input back to game-mode if commands need otherwise. svn-id: r49623 --- engines/parallaction/input.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp index d6dd9feb19..6d3f6f0b04 100644 --- a/engines/parallaction/input.cpp +++ b/engines/parallaction/input.cpp @@ -395,7 +395,7 @@ void Input::exitInventoryMode() { _vm->dropItem(z->u._mergeObj1); _vm->dropItem(z->u._mergeObj2); _vm->addInventoryItem(z->u._mergeObj3); - _vm->_cmdExec->run(z->_commands); + _vm->_cmdExec->run(z->_commands); // commands might set a new _inputMode } } @@ -412,7 +412,11 @@ void Input::exitInventoryMode() { } _vm->resumeJobs(); - _inputMode = kInputModeGame; + // in case the input mode was not changed by the code above (especially by the commands + // executed in case of a merge), then assume we are going back to game mode + if (_inputMode == kInputModeInventory) { + _inputMode = kInputModeGame; + } } bool Input::updateInventoryInput() { -- cgit v1.2.3 From 02ed880180a83a46ec72f69879df565f42c840db Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 13 Jun 2010 08:53:06 +0000 Subject: Added logic for handling the rate of animation background scrolling, and miscellaneous extra fields svn-id: r49627 --- engines/m4/animation.cpp | 36 +++++++++++++++++++++++------------- engines/m4/animation.h | 6 ++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index adb802ee0e..cf2d201b81 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -44,6 +44,7 @@ MadsAnimation::MadsAnimation(MadsM4Engine *vm, MadsView *view): Animation(vm), _ _currentFrame = 0; _oldFrameEntry = 0; _nextFrameTimer = _madsVm->_currentTimer; + _nextScrollTimer = 0; } MadsAnimation::~MadsAnimation() { @@ -89,7 +90,8 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S _spriteListIndex = animStream->readUint16LE(); _scrollX = animStream->readSint16LE(); _scrollY = animStream->readSint16LE(); - animStream->skip(10); + _scrollTicks = animStream->readUint16LE(); + animStream->skip(8); animStream->read(buffer, 13); _interfaceFile = Common::String(buffer, 13); @@ -180,7 +182,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S for (int i = 0; i < miscEntriesCount; ++i) { AnimMiscEntry rec; rec.soundNum = animStream->readByte(); - animStream->skip(1); + rec.msgIndex = animStream->readSByte(); rec.numTicks = animStream->readUint16LE(); rec.posAdjust.x = animStream->readUint16LE(); rec.posAdjust.y = animStream->readUint16LE(); @@ -232,6 +234,9 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S int idx = _frameEntries[i].spriteSlot.spriteListIndex; _frameEntries[i].spriteSlot.spriteListIndex = _spriteListIndexes[idx]; } + + if (hasScroll()) + _nextScrollTimer = _madsVm->_currentTimer + _scrollTicks; } /** @@ -282,9 +287,24 @@ void MadsAnimation::update() { load1(newIndex); } + // Check for scroll change + bool screenChanged = false; + + // Handle any scrolling of the screen surface + if (hasScroll() && (_madsVm->_currentTimer >= _nextScrollTimer)) { + _view->_bgSurface->scrollX(_scrollX); + _view->_bgSurface->scrollY(_scrollY); + + _nextScrollTimer = _madsVm->_currentTimer + _scrollTicks; + screenChanged = true; + } + // If it's not time for the next frame, then exit - if (_madsVm->_currentTimer < _nextFrameTimer) + if (_madsVm->_currentTimer < _nextFrameTimer) { + if (screenChanged) + _view->_spriteSlots.fullRefresh(); return; + } // Loop checks for any prior animation sprite slots to be expired for (int slotIndex = 0; slotIndex < _view->_spriteSlots.startIndex; ++slotIndex) { @@ -311,16 +331,6 @@ void MadsAnimation::update() { if (misc.soundNum) _vm->_sound->playSound(misc.soundNum); - bool screenChanged = false; - - // Handle any scrolling of the screen surface - if ((_scrollX != 0) || (_scrollY != 0)) { - _view->_bgSurface->scrollX(_scrollX); - _view->_bgSurface->scrollY(_scrollY); - - screenChanged = true; - } - // Handle any offset adjustment for sprites as of this frame if (_view->_posAdjust.x != misc.posAdjust.x) { misc.posAdjust.x = _view->_posAdjust.x; diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 029cf45738..cffcf9f689 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -57,6 +57,7 @@ public: class AnimMiscEntry { public: int soundNum; + int msgIndex; int numTicks; Common::Point posAdjust; }; @@ -82,6 +83,7 @@ private: int _spriteListIndex; int _scrollX; int _scrollY; + int _scrollTicks; Common::String _interfaceFile; Common::String _spriteSetNames[10]; Common::String _lbmFilename; @@ -96,14 +98,17 @@ private: int _unkIndex; Common::Point _unkList[2]; uint32 _nextFrameTimer; + uint32 _nextScrollTimer; int _messageCtr; int _abortTimers; AbortTimerMode _abortMode; uint16 _actionNouns[3]; + void load1(int frameNumber); bool proc1(SpriteAsset &spriteSet, const Common::Point &pt, int frameNumber); void loadInterface(M4Surface *&interfaceSurface, M4Surface *&depthSurface); + bool hasScroll() const { return (_scrollX != 0) || (_scrollY != 0); } public: MadsAnimation(MadsM4Engine *vm, MadsView *view); virtual ~MadsAnimation(); @@ -114,6 +119,7 @@ public: virtual void setCurrentFrame(int frameNumber); bool freeFlag() const { return _freeFlag; } + bool getAnimMode() const { return _animMode; } int roomNumber() const { return _roomNumber; } }; -- cgit v1.2.3 From 466479eb77dfd04c7116f97f93e2f8013442307b Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 13 Jun 2010 09:07:15 +0000 Subject: Added a parser for kZoneNone zones/animations in BRA. The only thing it does is parsing a possible command list, which is enough to support the script bug in "scende2". See ticket #3005384. svn-id: r49628 --- engines/parallaction/parser.h | 1 + engines/parallaction/parser_br.cpp | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h index 3e46e99180..5eb26e9fa1 100644 --- a/engines/parallaction/parser.h +++ b/engines/parallaction/parser.h @@ -294,6 +294,7 @@ public: virtual void parseGetData(ZonePtr z); virtual void parseDoorData(ZonePtr z); virtual void parseHearData(ZonePtr z); + virtual void parseNoneData(ZonePtr z); protected: void parseAnswerCounter(Answer *answer); virtual Answer *parseAnswer(); diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index d3ce1235c1..57259fd637 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -825,6 +825,16 @@ void LocationParser_br::parseHearData(ZonePtr z) { } } +void LocationParser_br::parseNoneData(ZonePtr z) { + /* the only case we have to handle here is that of "scende2", which is the only Animation with + a command list following the type marker. + */ + if (!scumm_stricmp(_tokens[0], "commands")) { + parseCommands(z->_commands); + } +} + + typedef void (LocationParser_br::*ZoneTypeParser)(ZonePtr); static ZoneTypeParser parsers[] = { 0, // no type @@ -836,7 +846,7 @@ static ZoneTypeParser parsers[] = { &LocationParser_br::parseHearData, 0, // feel &LocationParser_br::parseSpeakData, - 0, // none + &LocationParser_br::parseNoneData, 0, // trap 0, // you 0, // command @@ -882,7 +892,6 @@ DECLARE_ANIM_PARSER(moveto) { // ctxt.a->_moveTo.z = atoi(_tokens[3]); } - DECLARE_ANIM_PARSER(endanimation) { debugC(7, kDebugParser, "ANIM_PARSER(endanimation) "); -- cgit v1.2.3 From 4c6d276ce914cafc170732fb7203145c8a763b37 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 13 Jun 2010 10:50:54 +0000 Subject: Bugfixes for correct moving of the screen viewport within an animation svn-id: r49629 --- engines/m4/animation.cpp | 6 ++++-- engines/m4/mads_scene.cpp | 1 - engines/m4/mads_views.cpp | 11 ++++++++--- engines/m4/mads_views.h | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index cf2d201b81..9b6d5d1a6f 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -333,13 +333,15 @@ void MadsAnimation::update() { // Handle any offset adjustment for sprites as of this frame if (_view->_posAdjust.x != misc.posAdjust.x) { - misc.posAdjust.x = _view->_posAdjust.x; + _view->_posAdjust.x = misc.posAdjust.x; screenChanged = true; } if (_view->_posAdjust.y != misc.posAdjust.y) { - misc.posAdjust.y = _view->_posAdjust.y; + _view->_posAdjust.y = misc.posAdjust.y; screenChanged = true; } + + if (screenChanged) { // Signal the entire screen needs refreshing _view->_spriteSlots.fullRefresh(); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index f98684de6a..d910340930 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -655,7 +655,6 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su drawStyle = stream->readUint16LE(); width = stream->readUint16LE(); height = stream->readUint16LE(); - assert((width == 320) && (height == 156)); stream->skip(24); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 98b04e9f2d..178fd90fd3 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -855,10 +855,15 @@ void MadsDirtyAreas::mergeAreas(int idx1, int idx2) { da1.textActive = true; } -void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset) { +void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust) { for (uint i = 0; i < _entries.size(); ++i) { + const Common::Rect &srcBounds = _entries[i].bounds; + + Common::Rect bounds(srcBounds.left + posAdjust.x, srcBounds.top + posAdjust.y, + srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y); + if (_entries[i].active && _entries[i].bounds.isValidRect()) - src->copyTo(dest, _entries[i].bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset); + src->copyTo(dest, bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset); } } @@ -1202,7 +1207,7 @@ void MadsView::refresh() { _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); // Copy dirty areas to the main display surface - _dirtyAreas.copy(_view, _bgSurface, _yOffset); + _dirtyAreas.copy(_view, _bgSurface, _yOffset, _posAdjust); // Handle dirty areas for foreground objects _spriteSlots.setDirtyAreas(); diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index c0f3790a23..f0ded634b1 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -289,7 +289,7 @@ public: void merge(int startIndex, int count); bool intersects(int idx1, int idx2); void mergeAreas(int idx1, int idx2); - void copy(M4Surface *dest, M4Surface *src, int yOffset); + void copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust); }; enum SpriteAnimType {ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2}; -- cgit v1.2.3 From a4ac9347d4bbac0ee8bef8786c9e23831ad60636 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 13 Jun 2010 21:43:13 +0000 Subject: Fixed regression from commit #49251, and added an explanation. Calls to kNewNode with 1 parameter are handled properly again. Fixes the demo of Phantasmagoria 1. Thanks to lskovlun and waltervn for spotting this svn-id: r49638 --- engines/sci/engine/klists.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 18d6638e92..050c8e515f 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -157,7 +157,9 @@ reg_t kDisposeList(EngineState *s, int argc, reg_t *argv) { reg_t kNewNode(EngineState *s, int argc, reg_t *argv) { reg_t nodeValue = argv[0]; - reg_t nodeKey = (argc == 2) ? argv[1] : NULL_REG; + // Some SCI32 games call this with 1 parameter (e.g. the demo of Phantasmagoria). + // Set the key to be the same as the value in this case + reg_t nodeKey = (argc == 2) ? argv[1] : argv[0]; s->r_acc = s->_segMan->newNode(nodeValue, nodeKey); debugC(2, kDebugLevelNodes, "New nodebase at %04x:%04x", PRINT_REG(s->r_acc)); -- cgit v1.2.3 From 01d53a62165d229b88db11647ffe40ff2502d7b4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 13 Jun 2010 22:01:10 +0000 Subject: Disabled two cases of findObjectByName() in SCI0 early games svn-id: r49639 --- engines/sci/engine/vm.cpp | 2 +- engines/sci/graphics/animate.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1db9649a54..95ed13a3d3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -201,7 +201,7 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i // stopGroop object, which points to ego, to the new ego object. If this is not // done, ego's movement will not be updated properly, so the result is // unpredictable (for example in LSL5, Patti spins around instead of walking). - if (index == 0 && type == VAR_GLOBAL) { // global 0 is ego + if (index == 0 && type == VAR_GLOBAL && getSciVersion() > SCI_VERSION_0_EARLY) { // global 0 is ego reg_t stopGroopPos = segMan->findObjectByName("stopGroop"); if (!stopGroopPos.isNull()) { // does the game have a stopGroop object? // Find the "client" member variable of the stopGroop object, and update it diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 48715af53e..598724f2be 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -63,9 +63,11 @@ void GfxAnimate::init() { if (getSciVersion() <= SCI_VERSION_01) _ignoreFastCast = true; // Also if fastCast object exists at gamestartup, we can assume that the interpreter doesnt do kAnimate aborts - // (found in larry 1) - if (!_s->_segMan->findObjectByName("fastCast").isNull()) - _ignoreFastCast = true; + // (found in Larry 1) + if (getSciVersion() > SCI_VERSION_0_EARLY) { + if (!_s->_segMan->findObjectByName("fastCast").isNull()) + _ignoreFastCast = true; + } } void GfxAnimate::disposeLastCast() { -- cgit v1.2.3 From b5ebd40d614ab7b1c2f1408750c09f528b7ae2de Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 13 Jun 2010 22:15:30 +0000 Subject: The offset of script local variables is now calculated when the script is loaded, thus we no longer need to save it. Merged scriptInitialiseLocals() with scriptInitialiseLocalsZero() svn-id: r49640 --- engines/sci/engine/savegame.cpp | 2 +- engines/sci/engine/savegame.h | 2 +- engines/sci/engine/script.cpp | 66 ++++++++++++++++++---------------------- engines/sci/engine/seg_manager.h | 12 ++------ engines/sci/engine/segment.cpp | 4 +++ 5 files changed, 37 insertions(+), 49 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 9c2ff76088..8c743189d7 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -566,7 +566,7 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { } } - s.syncAsSint32LE(_localsOffset); + s.skip(4, VER(9), VER(20)); // OBSOLETE: Used to be _localsOffset s.syncAsSint32LE(_localsSegment); s.syncAsSint32LE(_markedAsDeleted); diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 7be05381da..e7e8fff999 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -36,7 +36,7 @@ namespace Sci { struct EngineState; enum { - CURRENT_SAVEGAME_VERSION = 20, + CURRENT_SAVEGAME_VERSION = 21, MINIMUM_SAVEGAME_VERSION = 9 }; diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 1f32e50b67..54edd38f90 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -159,41 +159,48 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller } } -void SegManager::scriptInitialiseLocalsZero(SegmentId seg, int count) { - Script *scr = getScript(seg); +void SegManager::scriptInitialiseLocals(SegmentId segmentId) { + Script *scr = getScript(segmentId); + uint16 count; - scr->_localsOffset = -count * 2; // Make sure it's invalid + if (getSciVersion() == SCI_VERSION_0_EARLY) { + // Old script block. There won't be a localvar block in this case. + // Instead, the script starts with a 16 bit int specifying the + // number of locals we need; these are then allocated and zeroed. + int localsCount = READ_LE_UINT16(scr->_buf); + if (localsCount) { + scr->_localsOffset = -localsCount * 2; // Make sure it's invalid + LocalVariables *locals = allocLocalsSegment(scr, localsCount); + if (locals) { + for (int i = 0; i < localsCount; i++) + locals->_locals[i] = NULL_REG; + } + } - LocalVariables *locals = allocLocalsSegment(scr, count); - if (locals) { - for (int i = 0; i < count; i++) - locals->_locals[i] = NULL_REG; + return; } -} -void SegManager::scriptInitialiseLocals(reg_t location) { - Script *scr = getScript(location.segment); - unsigned int count; + // Check if the script actually has local variables + if (scr->_localsOffset == 0) + return; - VERIFY(location.offset + 1 < (uint16)scr->getBufSize(), "Locals beyond end of script\n"); + VERIFY(scr->_localsOffset + 1 < (uint16)scr->getBufSize(), "Locals beyond end of script\n"); if (getSciVersion() >= SCI_VERSION_1_1) - count = READ_SCI11ENDIAN_UINT16(scr->_buf + location.offset - 2); + count = READ_SCI11ENDIAN_UINT16(scr->_buf + scr->_localsOffset - 2); else - count = (READ_LE_UINT16(scr->_buf + location.offset - 2) - 4) >> 1; + count = (READ_LE_UINT16(scr->_buf + scr->_localsOffset - 2) - 4) >> 1; // half block size - scr->_localsOffset = location.offset; - - if (!(location.offset + count * 2 + 1 < scr->getBufSize())) { - warning("Locals extend beyond end of script: offset %04x, count %x vs size %x", location.offset, count, (uint)scr->getBufSize()); - count = (scr->getBufSize() - location.offset) >> 1; + if (!(scr->_localsOffset + count * 2 + 1 < (uint16)scr->getBufSize())) { + warning("Locals extend beyond end of script: offset %04x, count %x vs size %x", scr->_localsOffset, count, (uint)scr->getBufSize()); + count = (scr->getBufSize() - scr->_localsOffset) >> 1; } LocalVariables *locals = allocLocalsSegment(scr, count); if (locals) { uint i; - const byte *base = (const byte *)(scr->_buf + location.offset); + const byte *base = (const byte *)(scr->_buf + scr->_localsOffset); for (i = 0; i < count; i++) locals->_locals[i] = make_reg(0, READ_SCI11ENDIAN_UINT16(base + i * 2)); @@ -258,18 +265,7 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); uint16 curOffset = oldScriptHeader ? 2 : 0; - if (oldScriptHeader) { - // Old script block - // There won't be a localvar block in this case - // Instead, the script starts with a 16 bit int specifying the - // number of locals we need; these are then allocated and zeroed. - int localsCount = READ_LE_UINT16(scr->_buf); - if (localsCount) - segMan->scriptInitialiseLocalsZero(segmentId, localsCount); - } - - // Now do a first pass through the script objects to find the - // local variable blocks + // Now do a first pass through the script objects to find all the object classes do { objType = scr->getHeap(curOffset); @@ -280,9 +276,6 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { curOffset += 4; // skip header switch (objType) { - case SCI_OBJ_LOCALVARS: - segMan->scriptInitialiseLocals(make_reg(segmentId, curOffset)); - break; case SCI_OBJ_CLASS: { int classpos = curOffset - SCRIPT_OBJECT_MAGIC_OFFSET; int species = scr->getHeap(curOffset - SCRIPT_OBJECT_MAGIC_OFFSET + SCRIPT_SPECIES_OFFSET); @@ -365,10 +358,9 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNu scr->init(scriptNum, resMan); scr->load(resMan); + segMan->scriptInitialiseLocals(segmentId); if (getSciVersion() >= SCI_VERSION_1_1) { - int heapStart = scr->getScriptSize(); - segMan->scriptInitialiseLocals(make_reg(segmentId, heapStart + 4)); segMan->scriptInitialiseObjectsSci11(segmentId); scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); } else { diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 9bcdd80a62..62dcddbcbe 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -145,19 +145,11 @@ public: // to be used during script instantiation, // i.e. loading and linking. - /** - * Initializes a script's local variable block - * All variables are initialized to zero. - * @param seg Segment containing the script to initialize - * @param nr Number of local variables to allocate - */ - void scriptInitialiseLocalsZero(SegmentId seg, int nr); - /** * Initializes a script's local variable block according to a prototype - * @param location Location to initialize from + * @param segmentId Segment containing the script to initialize */ - void scriptInitialiseLocals(reg_t location); + void scriptInitialiseLocals(SegmentId segmentId); // 2. Clones diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 0e0a759d4b..4b3df11d8f 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -197,6 +197,7 @@ void Script::load(ResourceManager *resMan) { if (READ_LE_UINT16(_buf + 1 + 5) > 0) { _exportTable = (const uint16 *)(_buf + 1 + 5 + 2); _numExports = READ_SCI11ENDIAN_UINT16(_exportTable - 1); + _localsOffset = _scriptSize + 4; } } else { _exportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS); @@ -209,6 +210,9 @@ void Script::load(ResourceManager *resMan) { _numSynonyms = READ_SCI11ENDIAN_UINT16(_synonyms + 2) / 4; _synonyms += 4; // skip header } + const byte* localsBlock = findBlock(SCI_OBJ_LOCALVARS); + if (localsBlock) + _localsOffset = localsBlock - _buf + 4; } } -- cgit v1.2.3 From d36f6638c0fd6e5aeaf8d8ac8665d5d2d8a2575f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 13 Jun 2010 22:48:49 +0000 Subject: Fixed compilation with the old music code svn-id: r49641 --- engines/sci/console.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index bd597aaa19..6c022bb631 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -852,6 +852,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { } bool Console::cmdShowInstruments(int argc, const char **argv) { +#ifndef USE_OLD_MUSIC_FUNCTIONS int songNumber = -1; if (argc == 2) @@ -1007,6 +1008,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf("\n\n"); } +#endif return true; } -- cgit v1.2.3 From ae0a7a667504b3356f2355aadfa6add722749ca6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 14 Jun 2010 03:15:58 +0000 Subject: Added logic for animation sequences specifying a starting animation frame number svn-id: r49642 --- engines/m4/animation.cpp | 3 +++ engines/m4/mads_anim.cpp | 56 ++++++++++++++++++++++++++++++++++++++---------- engines/m4/mads_anim.h | 1 + 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 9b6d5d1a6f..1d9b1161c2 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -328,6 +328,7 @@ void MadsAnimation::update() { // Handle starting any sound for this frame AnimMiscEntry &misc = _miscEntries[_currentFrame]; +printf("frame %d delay %d\n", _currentFrame, misc.numTicks); if (misc.soundNum) _vm->_sound->playSound(misc.soundNum); @@ -449,6 +450,8 @@ void MadsAnimation::setCurrentFrame(int frameNumber) { _currentFrame = frameNumber; _oldFrameEntry = 0; _freeFlag = false; + + _nextScrollTimer = _nextFrameTimer = _madsVm->_currentTimer; } void MadsAnimation::load1(int frameNumber) { diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index c618ae57cc..c2e9ea4eee 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -459,7 +459,8 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): _transition = kTransitionNone; _activeAnimation = NULL; _bgLoadFlag = true; - + _startFrame = -1; + reset(); // Set up system palette colors @@ -536,6 +537,9 @@ void AnimviewView::updateState() { return; } + // Reset flags + _startFrame = -1; + readNextCommand(); } @@ -543,7 +547,15 @@ void AnimviewView::updateState() { } void AnimviewView::readNextCommand() { +static bool tempFlag = true;//****DEBUG - Temporarily allow me to skip several intro scenes **** + while (!_script->eos() && !_script->err()) { + if (!tempFlag) { + tempFlag = true; + strncpy(_currentLine, _script->readLine().c_str(), 79); + strncpy(_currentLine, _script->readLine().c_str(), 79); + } + strncpy(_currentLine, _script->readLine().c_str(), 79); // Process any switches on the line @@ -581,6 +593,9 @@ void AnimviewView::readNextCommand() { _activeAnimation = new MadsAnimation(_vm, this); _activeAnimation->initialise(_currentLine, flags, &_backgroundSurface, &_codeSurface); + if (_startFrame != -1) + _activeAnimation->setCurrentFrame(_startFrame); + _spriteSlots.fullRefresh(); /* // Handle scene transition @@ -634,6 +649,7 @@ return; Switches are: (taken from the help of the original executable) -b Toggle background load status off/on. -c:char Specify sound card id letter. + -f:num Specify a specific starting frame number -g Stay in graphics mode on exit. -h[:ex] Disable EMS/XMS high memory support. -i Switch sound interrupts mode off/on. @@ -677,21 +693,39 @@ void AnimviewView::processCommand() { str_upper(commandStr); char *param = commandStr; - if (!strncmp(commandStr, "B", 1)) { + switch (commandStr[0]) { + case 'B': // Toggle background load flag _bgLoadFlag = !_bgLoadFlag; - } else if (!strncmp(commandStr, "X", 1)) { - //printf("X "); - } else if (!strncmp(commandStr, "W", 1)) { - //printf("W "); - } else if (!strncmp(commandStr, "R", 1)) { - param = param + 2; - //printf("R:%s ", param); - } else if (!strncmp(commandStr, "O", 1)) { + break; + + case 'F': + // Start animation at a specific frame + ++param; + assert(*param == ':'); + _startFrame = atoi(++param); + break; + + case 'O': param = param + 2; //printf("O:%i ", atoi(param)); _transition = atoi(param); - } else { + break; + + case 'R': + param = param + 2; + //printf("R:%s ", param); + break; + + case 'W': + //printf("W "); + break; + + case 'X': + //printf("X "); + break; + + default: error("Unknown response command: '%s'", commandStr); } } diff --git a/engines/m4/mads_anim.h b/engines/m4/mads_anim.h index f18fe46f48..78cc8727f8 100644 --- a/engines/m4/mads_anim.h +++ b/engines/m4/mads_anim.h @@ -91,6 +91,7 @@ private: int _transition; MadsAnimation *_activeAnimation; bool _bgLoadFlag; + int _startFrame; void reset(); void readNextCommand(); -- cgit v1.2.3 From 466a151744618f89d6a0b53d23189af048d88831 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 14 Jun 2010 04:20:57 +0000 Subject: Fixes for memory leaks reported by Valgrind svn-id: r49643 --- engines/m4/graphics.cpp | 1 + engines/m4/m4.cpp | 1 + engines/m4/mads_scene.cpp | 7 +++++-- engines/m4/mads_views.cpp | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index fc5cb0f9f9..36de60af6c 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -74,6 +74,7 @@ M4Surface::~M4Surface() { _madsVm->_palette->deleteRange(_rgbList); delete _rgbList; } + free(); } void M4Surface::loadCodesM4(Common::SeekableReadStream *source) { diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index a5db6660d8..c30e946653 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -147,6 +147,7 @@ MadsM4Engine::~MadsM4Engine() { delete _random; delete _palette; delete _globals; + delete _sound; delete _resourceManager; } diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index d910340930..269f33878c 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -678,7 +678,9 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su Common::String s(buffer2, 64); setNames.push_back(s); } - + + delete stream; + // Initialise a copy of the surfaces if they weren't provided bool dsFlag = false, ssFlag = false; int gfxSize = width * height; @@ -696,6 +698,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su dsFlag = true; } + // For Rex Nebular, read in the scene's compressed walk surface information if (_vm->getGameType() == GType_RexNebular) { assert(depthSurface); @@ -712,7 +715,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su destP += runLength; } - delete walkData; + free(walkData); delete stream; } diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 178fd90fd3..5c6c01293e 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -270,6 +270,7 @@ MadsTextDisplay::MadsTextDisplay(MadsView &owner): _owner(owner) { for (int i = 0; i < TEXT_DISPLAY_SIZE; ++i) { MadsTextDisplayEntry rec; rec.active = false; + rec.expire = 0; _entries.push_back(rec); } } -- cgit v1.2.3 From 6fb462e6b05c5ead3fefe97e18d31f4835d5e321 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 14 Jun 2010 05:27:54 +0000 Subject: Further memory leak fixes reported by Valgrind svn-id: r49644 --- engines/m4/animation.cpp | 1 - engines/m4/events.cpp | 4 ++++ engines/m4/events.h | 1 + engines/m4/globals.cpp | 26 +++++++++++++------------- engines/m4/globals.h | 2 +- engines/m4/m4.cpp | 11 +++++++---- engines/m4/m4.h | 10 +++++++++- engines/m4/mads_menus.cpp | 7 +++---- engines/m4/scene.cpp | 1 + engines/m4/sound.cpp | 38 ++++++++++++++++++-------------------- engines/m4/sound.h | 2 +- 11 files changed, 58 insertions(+), 45 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 1d9b1161c2..a9d52a54c1 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -328,7 +328,6 @@ void MadsAnimation::update() { // Handle starting any sound for this frame AnimMiscEntry &misc = _miscEntries[_currentFrame]; -printf("frame %d delay %d\n", _currentFrame, misc.numTicks); if (misc.soundNum) _vm->_sound->playSound(misc.soundNum); diff --git a/engines/m4/events.cpp b/engines/m4/events.cpp index c0ca412f11..65378c5d6a 100644 --- a/engines/m4/events.cpp +++ b/engines/m4/events.cpp @@ -57,6 +57,10 @@ Events::Events(MadsM4Engine *vm) : _vm(vm) { _console = new MadsConsole(_madsVm); } +Events::~Events() { + delete _console; +} + M4EventType Events::handleEvents() { static int oldX = -1, oldY = -1; static uint32 dclickTime = 0; diff --git a/engines/m4/events.h b/engines/m4/events.h index 43b61c8f0d..1c1418d5f8 100644 --- a/engines/m4/events.h +++ b/engines/m4/events.h @@ -78,6 +78,7 @@ private: public: bool quitFlag; Events(MadsM4Engine *vm); + virtual ~Events(); Common::Event &event() { return _event; } Common::EventType type() { return _event.type; } diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index 1768c71787..e63504ad73 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -351,16 +351,16 @@ void MadsGlobals::loadMadsMessagesInfo() { //printf("%i messages\n", count); for (int i = 0; i < count; i++) { - MessageItem *curMessage = new MessageItem(); - curMessage->id = messageS->readUint32LE(); - curMessage->offset = messageS->readUint32LE(); - curMessage->uncompSize = messageS->readUint16LE(); + MessageItem curMessage; + curMessage.id = messageS->readUint32LE(); + curMessage.offset = messageS->readUint32LE(); + curMessage.uncompSize = messageS->readUint16LE(); if (i > 0) - _madsMessages[i - 1]->compSize = curMessage->offset - _madsMessages[i - 1]->offset; + _madsMessages[i - 1].compSize = curMessage.offset - _madsMessages[i - 1].offset; if (i == count - 1) - curMessage->compSize = messageS->size() - curMessage->offset; + curMessage.compSize = messageS->size() - curMessage.offset; //printf("id: %i, offset: %i, uncomp size: %i\n", curMessage->id, curMessage->offset, curMessage->uncompSize); _madsMessages.push_back(curMessage); @@ -382,7 +382,7 @@ void MadsGlobals::loadMadsObjects() { int MadsGlobals::messageIndexOf(uint32 messageId) { for (uint i = 0; i < _madsMessages.size(); ++i) { - if (_madsMessages[i]->id == messageId) + if (_madsMessages[i].id == messageId) return i; } return -1; @@ -395,15 +395,15 @@ const char *MadsGlobals::loadMessage(uint index) { } FabDecompressor fab; - byte *compData = new byte[_madsMessages[index]->compSize]; - byte *buffer = new byte[_madsMessages[index]->uncompSize]; + byte *compData = new byte[_madsMessages[index].compSize]; + byte *buffer = new byte[_madsMessages[index].uncompSize]; Common::SeekableReadStream *messageS = _vm->res()->get("messages.dat"); - messageS->seek(_madsMessages[index]->offset, SEEK_SET); - messageS->read(compData, _madsMessages[index]->compSize); - fab.decompress(compData, _madsMessages[index]->compSize, buffer, _madsMessages[index]->uncompSize); + messageS->seek(_madsMessages[index].offset, SEEK_SET); + messageS->read(compData, _madsMessages[index].compSize); + fab.decompress(compData, _madsMessages[index].compSize, buffer, _madsMessages[index].uncompSize); - for (int i = 0; i < _madsMessages[index]->uncompSize - 1; i++) + for (int i = 0; i < _madsMessages[index].uncompSize - 1; i++) if (buffer[i] == '\0') buffer[i] = '\n'; _vm->res()->toss("messages.dat"); diff --git a/engines/m4/globals.h b/engines/m4/globals.h index de6e716ece..1714d223ce 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -235,7 +235,7 @@ private: MadsEngine *_vm; Common::Array _madsVocab; Common::Array _madsQuotes; - Common::Array _madsMessages; + Common::Array _madsMessages; MadsObjectArray _madsObjects; Common::List _visitedScenes; public: diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index c30e946653..446f2bf974 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -148,6 +148,7 @@ MadsM4Engine::~MadsM4Engine() { delete _palette; delete _globals; delete _sound; + delete _driver; delete _resourceManager; } @@ -158,11 +159,11 @@ Common::Error MadsM4Engine::run() { MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - MidiDriver *driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(midiDriver); if (native_mt32) - driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); + _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - _midi = new MidiPlayer(this, driver); + _midi = new MidiPlayer(this, _driver); _midi->setGM(true); _midi->setNativeMT32(native_mt32); @@ -513,7 +514,6 @@ Common::Error MadsEngine::run() { // Set up needed common functionality MadsM4Engine::run(); - _scene = new MadsScene(this); _palette->setMadsSystemPalette(); _mouse->init("cursor.ss", NULL); @@ -538,9 +538,12 @@ Common::Error MadsEngine::run() { //printf("%s\n----------\n", _globals->loadMessage(i)); if ((getGameType() == GType_RexNebular) || (getGameType() == GType_DragonSphere)) { + _scene = NULL; loadMenu(MAIN_MENU); } else { + _scene = new MadsScene(this); + if (getGameType() == GType_DragonSphere) { _scene->loadScene(FIRST_SCENE); } else if (getGameType() == GType_Phantom) { diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 9937107668..f5ddcc28be 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -29,6 +29,7 @@ #include "common/scummsys.h" #include "common/util.h" #include "common/random.h" +#include "sound/mididrv.h" #include "engines/engine.h" @@ -123,7 +124,7 @@ enum { struct M4GameDescription; -#define GAME_FRAME_DELAY 50 +#define GAME_FRAME_DELAY 20 #define VALIDATE_MADS assert(!_vm->isM4()) @@ -144,6 +145,7 @@ protected: void shutdown(); + MidiDriver *_driver; MidiPlayer *_midi; public: @@ -219,6 +221,12 @@ public: MadsGlobals *globals() { return (MadsGlobals *)_globals; } MadsScene *scene() { return (MadsScene *)_scene; } + void startScene(int sceneNum) { + if (!_scene) + _scene = new MadsScene(this); + _scene->show(); + _scene->loadScene(101); + } }; class M4Engine : public MadsM4Engine { diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index 94894e78be..43b9031692 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -293,7 +293,7 @@ int RexMainMenuView::getHighlightedItem(int x, int y) { } void RexMainMenuView::handleAction(MadsGameAction action) { - MadsM4Engine *vm = _vm; + MadsEngine *vm = (MadsEngine *)_vm; vm->_mouse->cursorOff(); vm->_viewManager->deleteView(this); @@ -303,8 +303,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) { // Load a sample starting scene - note that, currently, calling loadScene automatically // removes this menu screen from being displayed vm->_mouse->cursorOn(); - vm->_scene->show(); - vm->_scene->loadScene(101); + vm->startScene(101); return; case SHOW_INTRO: @@ -325,7 +324,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) { // Activate the scene display with the specified scene bool altAdvert = vm->_random->getRandomNumber(1000) >= 500; - vm->_scene->loadScene(altAdvert ? 995 : 996); + vm->startScene(altAdvert ? 995 : 996); vm->_viewManager->addView(vm->_scene); vm->_viewManager->refreshAll(); diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 15c68f276c..e78d7f865e 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -55,6 +55,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, Scene::~Scene() { leaveScene(); + _vm->_scene = NULL; } void Scene::loadScene(int sceneNumber) { diff --git a/engines/m4/sound.cpp b/engines/m4/sound.cpp index 69ab8c0516..e0fbd2f7a9 100644 --- a/engines/m4/sound.cpp +++ b/engines/m4/sound.cpp @@ -197,20 +197,20 @@ void Sound::loadDSRFile(const char *fileName) { //printf("DSR has %i entries\n", _dsrFile.entryCount); for (int i = 0; i < _dsrFile.entryCount; i++) { - DSREntry* newEntry = new DSREntry(); - newEntry->frequency = fileStream->readUint16LE(); - newEntry->channels = fileStream->readUint32LE(); - newEntry->compSize = fileStream->readUint32LE(); - newEntry->uncompSize = fileStream->readUint32LE(); - newEntry->offset = fileStream->readUint32LE(); + DSREntry newEntry; + newEntry.frequency = fileStream->readUint16LE(); + newEntry.channels = fileStream->readUint32LE(); + newEntry.compSize = fileStream->readUint32LE(); + newEntry.uncompSize = fileStream->readUint32LE(); + newEntry.offset = fileStream->readUint32LE(); _dsrFile.dsrEntries.push_back(newEntry); /* printf("%i: ", i); printf("frequency: %i ", newEntry->frequency); printf("channels: %i ", newEntry->channels); - printf("comp: %i ", newEntry->compSize); - printf("uncomp: %i ", newEntry->uncompSize); + printf("comp: %i ", newEntry.compSize); + printf("uncomp: %i ", newEntry.uncompSize); printf("offset: %i ", newEntry->offset); printf("\n"); */ @@ -225,9 +225,7 @@ void Sound::unloadDSRFile() { if (!_dsrFileLoaded) return; - for (int i = 0; i < _dsrFile.entryCount; i++) { - _dsrFile.dsrEntries.remove_at(0); - } + _dsrFile.dsrEntries.clear(); _dsrFile.entryCount = 0; strcpy(_dsrFile.fileName, ""); @@ -251,28 +249,28 @@ void Sound::playDSRSound(int soundIndex, int volume, bool loop) { // Get sound data FabDecompressor fab; - byte *compData = new byte[_dsrFile.dsrEntries[soundIndex]->compSize]; - byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex]->uncompSize]; + byte *compData = new byte[_dsrFile.dsrEntries[soundIndex].compSize]; + byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex].uncompSize]; Common::SeekableReadStream *fileStream = _vm->res()->get(_dsrFile.fileName); - fileStream->seek(_dsrFile.dsrEntries[soundIndex]->offset, SEEK_SET); - fileStream->read(compData, _dsrFile.dsrEntries[soundIndex]->compSize); + fileStream->seek(_dsrFile.dsrEntries[soundIndex].offset, SEEK_SET); + fileStream->read(compData, _dsrFile.dsrEntries[soundIndex].compSize); _vm->res()->toss(_dsrFile.fileName); - fab.decompress(compData, _dsrFile.dsrEntries[soundIndex]->compSize, - buffer, _dsrFile.dsrEntries[soundIndex]->uncompSize); + fab.decompress(compData, _dsrFile.dsrEntries[soundIndex].compSize, + buffer, _dsrFile.dsrEntries[soundIndex].uncompSize); // Play sound Audio::AudioStream *stream = Audio::makeLoopingAudioStream( Audio::makeRawStream(buffer, - _dsrFile.dsrEntries[soundIndex]->uncompSize, - _dsrFile.dsrEntries[soundIndex]->frequency, Audio::FLAG_UNSIGNED), + _dsrFile.dsrEntries[soundIndex].uncompSize, + _dsrFile.dsrEntries[soundIndex].frequency, Audio::FLAG_UNSIGNED), loop ? 0 : 1); _mixer->playStream(Audio::Mixer::kSFXSoundType, &handle->handle, stream, -1, volume); /* // Dump the sound file FILE *destFile = fopen("sound.raw", "wb"); - fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex]->uncompSize, 1, destFile); + fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex].uncompSize, 1, destFile); fclose(destFile); */ } diff --git a/engines/m4/sound.h b/engines/m4/sound.h index 7d442a73cc..5587810506 100644 --- a/engines/m4/sound.h +++ b/engines/m4/sound.h @@ -65,7 +65,7 @@ struct DSREntry { struct DSRFile { char fileName[20]; int entryCount; - Common::Array dsrEntries; + Common::Array dsrEntries; }; class MadsM4Engine; -- cgit v1.2.3 From 58487da20bf0115cfdefc2769c831c64b22d524c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 14 Jun 2010 06:33:24 +0000 Subject: Moved the actionNouns array from the scene to the globals object, since the scene will no longer be active during animation sequences svn-id: r49646 --- engines/m4/animation.cpp | 4 ++-- engines/m4/globals.cpp | 2 ++ engines/m4/globals.h | 1 + engines/m4/mads_scene.cpp | 2 -- engines/m4/mads_scene.h | 1 - engines/m4/mads_views.cpp | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index a9d52a54c1..c39a1f0cd2 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -264,7 +264,7 @@ void MadsAnimation::load(const Common::String &filename, int abortTimers) { _abortMode = _madsVm->scene()->_abortTimersMode2; for (int i = 0; i < 3; ++i) - _actionNouns[i] = _madsVm->scene()->actionNouns[i]; + _actionNouns[i] = _madsVm->globals()->actionNouns[i]; // Initialise kernel message list for (uint i = 0; i < _messages.size(); ++i) @@ -436,7 +436,7 @@ void MadsAnimation::update() { if (_abortMode != ABORTMODE_1) { // Copy the noun list for (int i = 0; i < 3; ++i) - _madsVm->scene()->actionNouns[i] = _actionNouns[i]; + _madsVm->globals()->actionNouns[i] = _actionNouns[i]; } } } diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index e63504ad73..b9039e3afd 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -282,6 +282,8 @@ MadsGlobals::MadsGlobals(MadsEngine *vm): Globals(vm) { playerSpriteChanged = false; dialogType = DIALOG_NONE; sceneNumber = -1; + for (int i = 0; i < 3; ++i) + actionNouns[i] = 0; } MadsGlobals::~MadsGlobals() { diff --git a/engines/m4/globals.h b/engines/m4/globals.h index 1714d223ce..3a986ee294 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -249,6 +249,7 @@ public: MadsDialogType dialogType; int sceneNumber; int previousScene; + uint16 actionNouns[3]; void loadMadsVocab(); uint32 getVocabSize() { return _madsVocab.size(); } diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 269f33878c..428b92c657 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -55,8 +55,6 @@ MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResour MadsView::_bgSurface = Scene::_backgroundSurface; MadsView::_depthSurface = Scene::_walkSurface; _interfaceSurface = new MadsInterfaceView(vm); - for (int i = 0; i < 3; ++i) - actionNouns[i] = 0; } MadsScene::~MadsScene() { diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 0269de75c8..c4c6dedc0e 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -107,7 +107,6 @@ private: void setAction(); public: char _aaName[100]; - uint16 actionNouns[3]; public: MadsScene(MadsEngine *vm); virtual ~MadsScene(); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 5c6c01293e..af4177e6bb 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -404,7 +404,7 @@ int MadsKernelMessageList::add(const Common::Point &pt, uint fontColour, uint8 f rec.abortMode = _owner._abortTimersMode2; for (int i = 0; i < 3; ++i) - rec.actionNouns[i] = _madsVm->scene()->actionNouns[i]; + rec.actionNouns[i] = _madsVm->globals()->actionNouns[i]; if (flags & KMSG_OWNER_TIMEOUT) rec.frameTimer = _owner._ticksAmount + _owner._newTimeout; @@ -504,7 +504,7 @@ void MadsKernelMessageList::processText(int msgIndex) { if (_owner._abortTimersMode != ABORTMODE_1) { for (int i = 0; i < 3; ++i) - _madsVm->scene()->actionNouns[i] = msg.actionNouns[i]; + _madsVm->globals()->actionNouns[i] = msg.actionNouns[i]; } } } @@ -943,7 +943,7 @@ int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int trigg _entries[seqIndex].abortMode = _owner._abortTimersMode2; for (int i = 0; i < 3; ++i) - _entries[seqIndex].actionNouns[i] = _madsVm->scene()->actionNouns[i]; + _entries[seqIndex].actionNouns[i] = _madsVm->globals()->actionNouns[i]; return seqIndex; } -- cgit v1.2.3 From cfdbfaa28eb29cb17185d3d3d1ddde8c89a369c1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 08:36:52 +0000 Subject: SCI: Limit the screen refresh rate to 60fps svn-id: r49647 --- engines/sci/engine/savegame.cpp | 1 + engines/sci/engine/state.h | 1 + engines/sci/event.cpp | 10 ++++++++-- engines/sci/sci.cpp | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 8c743189d7..a7310d2b6a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -877,6 +877,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // Time state: s->lastWaitTime = g_system->getMillis(); s->gameStartTime = g_system->getMillis(); + s->_screenUpdateTime = g_system->getMillis(); #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound._it = NULL; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 1b1a1fa86c..b47b739007 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -113,6 +113,7 @@ public: uint32 gameStartTime; /**< The time at which the interpreter was started */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */ + uint32 _screenUpdateTime; /**< The last time the game updated the screen */ void wait(int16 ticks); diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index cdddb26ca4..ed9c4bfd0d 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -319,8 +319,14 @@ sciEvent EventManager::get(unsigned int mask) { //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; sciEvent event = { 0, 0, 0, 0 }; - // Update the screen here, since it's called very often - g_system->updateScreen(); + // Update the screen here, since it's called very often. + // Throttle the screen update rate to 60fps. + uint32 curTime = g_system->getMillis(); + uint32 duration = curTime - g_sci->getEngineState()->_screenUpdateTime; + if (duration >= 1000 / 60) { + g_system->updateScreen(); + g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); + } // Get all queued events from graphics driver do { diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 9e928b82d9..ee2f5845a2 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -325,7 +325,7 @@ bool SciEngine::initGame() { _vocabulary->parser_base = make_reg(_gamestate->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); } - _gamestate->gameStartTime = _gamestate->lastWaitTime = g_system->getMillis(); + _gamestate->gameStartTime = _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis(); srand(g_system->getMillis()); // Initialize random number generator -- cgit v1.2.3 From b921cebce882de6d32ed3fd62de16ee215daa467 Mon Sep 17 00:00:00 2001 From: John Willis Date: Mon, 14 Jun 2010 09:33:36 +0000 Subject: GP2XWiz: Add shellscripts to support building a non-stripped bundle for use with GDB. * This should help Tony (GSoC) get debug builds going. svn-id: r49648 --- backends/platform/gp2xwiz/build/bundle-debug.sh | 54 +++++++++++++++++++++++++ backends/platform/gp2xwiz/build/scummvm-gdb.gpe | 16 ++++++++ 2 files changed, 70 insertions(+) create mode 100755 backends/platform/gp2xwiz/build/bundle-debug.sh create mode 100755 backends/platform/gp2xwiz/build/scummvm-gdb.gpe diff --git a/backends/platform/gp2xwiz/build/bundle-debug.sh b/backends/platform/gp2xwiz/build/bundle-debug.sh new file mode 100755 index 0000000000..d275f681ea --- /dev/null +++ b/backends/platform/gp2xwiz/build/bundle-debug.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +echo Quick script to make building a distribution of the GP2X Wiz backend more consistent. + +echo Collecting files. +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`" +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm" +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves" +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins" +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data" +mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib" + + +echo "Please put your save games in this dir" >> "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves/PUT_SAVES_IN_THIS_DIR" + +cp ./scummvm-gdb.gpe ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/scummvm.gpe +cp ./scummvm.png ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ./README-GP2XWIZ ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ./scummvm.ini ./scummvm-wiz-`date '+%Y-%m-%d'`/ +cp ../../../../scummvm.wiz ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../AUTHORS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../README ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../COPYING ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../COPYRIGHT ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../NEWS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../gui/themes/scummmodern.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../dists/pred.dic ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ +cp ../../../../dists/engine-data/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data +cp ../../../../plugins/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins + +# Copy over dynamic libs needed by the app (as the ones in the default filesystem are broken). +f=`which arm-open2x-linux-g++` +loc=`dirname "$f"` +cp $loc/../lib/libz.so.1.2.3 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libz.so.1 +cp $loc/../lib/libvorbisidec.so.1.0.2 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libvorbisidec.so.1 + +echo Building ZIP bundle. +if [ -f /usr/bin/zip ] + then + rm ./"scummvm-wiz-`date '+%Y-%m-%d'`.zip" + cd "scummvm-wiz-`date '+%Y-%m-%d'`" + zip -r -9 "../scummvm-wiz-`date '+%Y-%m-%d'`.zip" * + echo You should have a "scummvm-wiz-`date '+%Y-%m-%d'`.zip" for the GP2X Wiz backend ready to go. + cd .. + rm -R ./"scummvm-wiz-`date '+%Y-%m-%d'`" + else + echo - /usr/bin/zip not found, ZIP bundle not created. + echo All included files can also be found in ./"scummvm-wiz-`date '+%Y-%m-%d'`" + echo - Please use you preferred archive tool to bundle these files. +fi + +echo Please ensure GDB is installed somewhere in the path on your Wiz. + diff --git a/backends/platform/gp2xwiz/build/scummvm-gdb.gpe b/backends/platform/gp2xwiz/build/scummvm-gdb.gpe new file mode 100755 index 0000000000..64b6c8b974 --- /dev/null +++ b/backends/platform/gp2xwiz/build/scummvm-gdb.gpe @@ -0,0 +1,16 @@ +#!/bin/sh + +# Export the location of any libs ScummVM depends on +# (to avoid installing to the NAND and overwriting the broken ones there). +export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH + +# Run ScummVM via GDB (so make sure you have a terminal open or serial). +# Oh, and GDB installed of course ;) +gdb --args ./scummvm.wiz --fullscreen --gfx-mode=1x --config=$(pwd)/.scummvmrc + +# Sync the SD card to check that everything is written. +sync + +# Return to the GPH menu screen +cd /usr/gp2x +exec /usr/gp2x/gp2xmenu -- cgit v1.2.3 From cd77cb96fc85ba2f681337630c4374ce0565927f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 12:44:57 +0000 Subject: Some cleanup of the script locals code svn-id: r49649 --- engines/sci/engine/script.cpp | 50 ++++++++------------------------------ engines/sci/engine/seg_manager.cpp | 6 ++--- engines/sci/engine/seg_manager.h | 2 +- engines/sci/engine/segment.cpp | 24 +++++++++++++++++- engines/sci/engine/segment.h | 6 ++++- 5 files changed, 42 insertions(+), 46 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 54edd38f90..6dfd39a496 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -161,49 +161,19 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller void SegManager::scriptInitialiseLocals(SegmentId segmentId) { Script *scr = getScript(segmentId); - uint16 count; - - if (getSciVersion() == SCI_VERSION_0_EARLY) { - // Old script block. There won't be a localvar block in this case. - // Instead, the script starts with a 16 bit int specifying the - // number of locals we need; these are then allocated and zeroed. - int localsCount = READ_LE_UINT16(scr->_buf); - if (localsCount) { - scr->_localsOffset = -localsCount * 2; // Make sure it's invalid - LocalVariables *locals = allocLocalsSegment(scr, localsCount); - if (locals) { - for (int i = 0; i < localsCount; i++) - locals->_locals[i] = NULL_REG; - } - } - - return; - } - - // Check if the script actually has local variables - if (scr->_localsOffset == 0) - return; - VERIFY(scr->_localsOffset + 1 < (uint16)scr->getBufSize(), "Locals beyond end of script\n"); - - if (getSciVersion() >= SCI_VERSION_1_1) - count = READ_SCI11ENDIAN_UINT16(scr->_buf + scr->_localsOffset - 2); - else - count = (READ_LE_UINT16(scr->_buf + scr->_localsOffset - 2) - 4) >> 1; - // half block size - - if (!(scr->_localsOffset + count * 2 + 1 < (uint16)scr->getBufSize())) { - warning("Locals extend beyond end of script: offset %04x, count %x vs size %x", scr->_localsOffset, count, (uint)scr->getBufSize()); - count = (scr->getBufSize() - scr->_localsOffset) >> 1; - } - - LocalVariables *locals = allocLocalsSegment(scr, count); + LocalVariables *locals = allocLocalsSegment(scr); if (locals) { - uint i; - const byte *base = (const byte *)(scr->_buf + scr->_localsOffset); + if (getSciVersion() > SCI_VERSION_0_EARLY) { + const byte *base = (const byte *)(scr->_buf + scr->getLocalsOffset()); - for (i = 0; i < count; i++) - locals->_locals[i] = make_reg(0, READ_SCI11ENDIAN_UINT16(base + i * 2)); + for (uint16 i = 0; i < scr->getLocalsCount(); i++) + locals->_locals[i] = make_reg(0, READ_SCI11ENDIAN_UINT16(base + i * 2)); + } else { + // In SCI0 early, locals are set at run time, thus zero them all here + for (uint16 i = 0; i < scr->getLocalsCount(); i++) + locals->_locals[i] = NULL_REG; + } } } diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 4d3e6f754e..8d51b27099 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -377,8 +377,8 @@ SegmentId SegManager::getScriptSegment(int script_nr, ScriptLoadType load) { return segment; } -LocalVariables *SegManager::allocLocalsSegment(Script *scr, int count) { - if (!count) { // No locals +LocalVariables *SegManager::allocLocalsSegment(Script *scr) { + if (!scr->getLocalsCount()) { // No locals scr->_localsSegment = 0; scr->_localsBlock = NULL; return NULL; @@ -395,7 +395,7 @@ LocalVariables *SegManager::allocLocalsSegment(Script *scr, int count) { scr->_localsBlock = locals; locals->script_id = scr->_nr; - locals->_locals.resize(count); + locals->_locals.resize(scr->getLocalsCount()); return locals; } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 62dcddbcbe..ec89e42f9c 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -478,7 +478,7 @@ private: private: SegmentObj *allocSegment(SegmentObj *mem, SegmentId *segid); - LocalVariables *allocLocalsSegment(Script *scr, int count); + LocalVariables *allocLocalsSegment(Script *scr); int deallocate(SegmentId seg, bool recursive); void createClassTable(); diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 4b3df11d8f..c32823a7c2 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -100,6 +100,7 @@ Script::Script() : SegmentObj(SEG_TYPE_SCRIPT) { _localsOffset = 0; _localsSegment = 0; _localsBlock = NULL; + _localsCount = 0; _markedAsDeleted = false; } @@ -122,6 +123,7 @@ void Script::init(int script_nr, ResourceManager *resMan) { _localsOffset = 0; _localsBlock = NULL; + _localsCount = 0; _codeBlocks.clear(); @@ -198,6 +200,7 @@ void Script::load(ResourceManager *resMan) { _exportTable = (const uint16 *)(_buf + 1 + 5 + 2); _numExports = READ_SCI11ENDIAN_UINT16(_exportTable - 1); _localsOffset = _scriptSize + 4; + _localsCount = READ_SCI11ENDIAN_UINT16(_buf + _localsOffset - 2); } } else { _exportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS); @@ -211,8 +214,27 @@ void Script::load(ResourceManager *resMan) { _synonyms += 4; // skip header } const byte* localsBlock = findBlock(SCI_OBJ_LOCALVARS); - if (localsBlock) + if (localsBlock) { _localsOffset = localsBlock - _buf + 4; + _localsCount = (READ_LE_UINT16(_buf + _localsOffset - 2) - 4) >> 1; // half block size + } + } + + if (getSciVersion() > SCI_VERSION_0_EARLY) { + // Does the script actually have locals? If not, set the locals offset to 0 + if (!_localsCount) + _localsOffset = 0; + + if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) { + warning("Locals extend beyond end of script: offset %04x, count %x vs size %x", _localsOffset, _localsCount, _bufSize); + _localsCount = (_bufSize - _localsOffset) >> 1; + } + } else { + // Old script block. There won't be a localvar block in this case. + // Instead, the script starts with a 16 bit int specifying the + // number of locals we need; these are then allocated and zeroed. + _localsCount = READ_LE_UINT16(_buf); + _localsOffset = -_localsCount * 2; // Make sure it's invalid } } diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index f1b6dccaa2..8759c630e8 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -364,6 +364,9 @@ private: Common::Array _codeBlocks; + int _localsOffset; + uint16 _localsCount; + public: /** * Table for objects, contains property variables. @@ -371,7 +374,8 @@ public: */ ObjMap _objects; - int _localsOffset; + int getLocalsOffset() const { return _localsOffset; } + uint16 getLocalsCount() const { return _localsCount; } SegmentId _localsSegment; /**< The local variable segment */ LocalVariables *_localsBlock; -- cgit v1.2.3 From 2a78b8279930212337c446948cc9a2943d685c94 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 13:13:02 +0000 Subject: Fixed a bug with commit #49640 svn-id: r49650 --- engines/sci/engine/segment.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index c32823a7c2..c5afe57eea 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -196,12 +196,12 @@ void Script::load(ResourceManager *resMan) { _numSynonyms = 0; if (getSciVersion() >= SCI_VERSION_1_1) { - if (READ_LE_UINT16(_buf + 1 + 5) > 0) { + if (READ_LE_UINT16(_buf + 1 + 5) > 0) { // does the script have an export table? _exportTable = (const uint16 *)(_buf + 1 + 5 + 2); _numExports = READ_SCI11ENDIAN_UINT16(_exportTable - 1); - _localsOffset = _scriptSize + 4; - _localsCount = READ_SCI11ENDIAN_UINT16(_buf + _localsOffset - 2); } + _localsOffset = _scriptSize + 4; + _localsCount = READ_SCI11ENDIAN_UINT16(_buf + _localsOffset - 2); } else { _exportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS); if (_exportTable) { -- cgit v1.2.3 From 5230930d9577726d6f64fa8ffa73690314fd0a56 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 13:41:06 +0000 Subject: Silenced warning svn-id: r49651 --- engines/sci/engine/segment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index c5afe57eea..99fcb1b821 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -226,7 +226,7 @@ void Script::load(ResourceManager *resMan) { _localsOffset = 0; if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) { - warning("Locals extend beyond end of script: offset %04x, count %x vs size %x", _localsOffset, _localsCount, _bufSize); + warning("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize); _localsCount = (_bufSize - _localsOffset) >> 1; } } else { -- cgit v1.2.3 From 4f3bb60cd59f7b24a4c1d29de7ba790d262b16ee Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 13:53:15 +0000 Subject: Really silence the warning with _bufSize svn-id: r49652 --- engines/sci/engine/segment.cpp | 2 +- engines/sci/engine/segment.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 99fcb1b821..492e928e31 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -161,7 +161,7 @@ void Script::init(int script_nr, ResourceManager *resMan) { } // As mentioned above, the script and the heap together should not exceed 64KB - if (_bufSize > 65535) + if (script->size + heap->size > 65535) error("Script and heap sizes combined exceed 64K. This means a fundamental " "design bug was made regarding SCI1.1 and newer games.\nPlease " "report this error to the ScummVM team"); diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 8759c630e8..045cb119a3 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -354,7 +354,7 @@ protected: private: size_t _scriptSize; size_t _heapSize; - size_t _bufSize; + uint16 _bufSize; const uint16 *_exportTable; /**< Abs. offset of the export table or 0 if not present */ uint16 _numExports; /**< Number of entries in the exports table */ -- cgit v1.2.3 From 4d517ed0e9870ef75b7b0c3eeda9659563d3ace9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:50:23 +0000 Subject: Extended advancedDetector with depth parameter. Now AD can search nested directories. By default it is turned off, but there is new parameter to ADParameters struct. Usually value of 2 is good enough for all purposes. svn-id: r49653 --- engines/advancedDetector.cpp | 42 +++++++++++++++++++++++++++----------- engines/advancedDetector.h | 7 +++++++ engines/agi/detection.cpp | 4 +++- engines/agos/detection.cpp | 4 +++- engines/cine/detection.cpp | 4 +++- engines/cruise/detection.cpp | 4 +++- engines/draci/detection.cpp | 4 +++- engines/drascula/detection.cpp | 4 +++- engines/gob/detection.cpp | 4 +++- engines/groovie/detection.cpp | 4 +++- engines/kyra/detection.cpp | 4 +++- engines/lure/detection.cpp | 4 +++- engines/m4/detection.cpp | 4 +++- engines/made/detection.cpp | 4 +++- engines/mohawk/detection.cpp | 4 +++- engines/parallaction/detection.cpp | 4 +++- engines/saga/detection.cpp | 4 +++- engines/sci/detection.cpp | 4 +++- engines/teenagent/detection.cpp | 3 ++- engines/tinsel/detection.cpp | 4 +++- engines/touche/detection.cpp | 4 +++- engines/tucker/detection.cpp | 3 ++- 22 files changed, 95 insertions(+), 32 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index b149b43ad7..f4932a1055 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -340,24 +340,24 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms); -static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra) { - FileMap allFiles; - SizeMD5Map filesSizeMD5; - - const ADGameFileDescription *fileDesc; - const ADGameDescription *g; - const byte *descPtr; +static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) { + if (depth == 0) + return; if (fslist.empty()) - return ADGameDescList(); - Common::FSNode parent = fslist.begin()->getParent(); - debug(3, "Starting detection in dir '%s'", parent.getPath().c_str()); + return; // First we compose a hashmap of all files in fslist. // Includes nifty stuff like removing trailing dots and ignoring case. for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { - if (file->isDirectory()) - continue; + if (file->isDirectory()) { + Common::FSList files; + + if (!file->getChildren(files, Common::FSNode::kListAll)) + continue; + + composeFileHashMap(files, allFiles, depth - 1); + } Common::String tstr = file->getName(); @@ -367,6 +367,24 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p allFiles[tstr] = *file; // Record the presence of this file } +} + +static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra) { + FileMap allFiles; + SizeMD5Map filesSizeMD5; + + const ADGameFileDescription *fileDesc; + const ADGameDescription *g; + const byte *descPtr; + + if (fslist.empty()) + return ADGameDescList(); + Common::FSNode parent = fslist.begin()->getParent(); + debug(3, "Starting detection in dir '%s'", parent.getPath().c_str()); + + // First we compose a hashmap of all files in fslist. + // Includes nifty stuff like removing trailing dots and ignoring case. + composeFileHashMap(fslist, allFiles, (params.depth == 0 ? 1 : params.depth)); // Check which files are included in some ADGameDescription *and* present // in fslist. Compute MD5s and file sizes for these files. diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 370d958ce6..a48dd0c1d2 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -190,6 +190,13 @@ struct ADParams { * enum for the list. */ uint32 guioptions; + + /** + * + * Maximum depth of directories to look up + * If set to 0, the depth is 1 level + */ + uint32 depth; }; diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index e72647d5e2..1c2638fc89 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -979,7 +979,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI + Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, + // Maximum directory depth + 1 }; } // End of namespace Agi diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp index 39974f9d53..d22ee720d7 100644 --- a/engines/agos/detection.cpp +++ b/engines/agos/detection.cpp @@ -102,7 +102,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOLAUNCHLOAD + Common::GUIO_NOLAUNCHLOAD, + // Maximum directory depth + 1 }; using namespace AGOS; diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index fcfa1f7f20..1cf9ed5fad 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -569,7 +569,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI + Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, + // Maximum directory depth + 1 }; class CineMetaEngine : public AdvancedMetaEngine { diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index e1f12b734e..9088b8261e 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -237,7 +237,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI + Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, + // Maximum directory depth + 1 }; class CruiseMetaEngine : public AdvancedMetaEngine { diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index c3204fc656..39834ab5fa 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -94,7 +94,9 @@ const ADParams detectionParams = { // Flags 0, // Global GUI options - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class DraciMetaEngine : public AdvancedMetaEngine { diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp index 76d48b7b89..a0781e0bff 100644 --- a/engines/drascula/detection.cpp +++ b/engines/drascula/detection.cpp @@ -264,7 +264,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOMIDI + Common::GUIO_NOMIDI, + // Maximum directory depth + 1 }; class DrasculaMetaEngine : public AdvancedMetaEngine { diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp index 1f8bfdc138..feb76fe091 100644 --- a/engines/gob/detection.cpp +++ b/engines/gob/detection.cpp @@ -5094,7 +5094,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOLAUNCHLOAD + Common::GUIO_NOLAUNCHLOAD, + // Maximum directory depth + 1 }; class GobMetaEngine : public AdvancedMetaEngine { diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index ec401e7d24..1f7156b2fc 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -176,7 +176,9 @@ static const ADParams detectionParams = { // Flags kADFlagUseExtraAsHint, // Additional GUI options (for every game} - Common::GUIO_NOSUBTITLES | Common::GUIO_NOSFX + Common::GUIO_NOSUBTITLES | Common::GUIO_NOSFX, + // Maximum directory depth + 1 }; diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index 6e9359e7fc..90a107099f 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -1226,7 +1226,9 @@ const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; } // End of anonymous namespace diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp index 36c1cf237d..d8c7b483f8 100644 --- a/engines/lure/detection.cpp +++ b/engines/lure/detection.cpp @@ -196,7 +196,9 @@ static const ADParams detectionParams = { // Flags kADFlagUseExtraAsHint, // Additional GUI options (for every game} - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH, + // Maximum directory depth + 1 }; class LureMetaEngine : public AdvancedMetaEngine { diff --git a/engines/m4/detection.cpp b/engines/m4/detection.cpp index 9493226c1a..80a899f1ac 100644 --- a/engines/m4/detection.cpp +++ b/engines/m4/detection.cpp @@ -400,7 +400,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOMIDI + Common::GUIO_NOMIDI, + // Maximum directory depth + 1 }; class M4MetaEngine : public AdvancedMetaEngine { diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp index 1dfc0c3f83..081bb98006 100644 --- a/engines/made/detection.cpp +++ b/engines/made/detection.cpp @@ -493,7 +493,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class MadeMetaEngine : public AdvancedMetaEngine { diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index 7f2e0cb312..44c3bc4f6d 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -1011,7 +1011,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game) - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class MohawkMetaEngine : public AdvancedMetaEngine { diff --git a/engines/parallaction/detection.cpp b/engines/parallaction/detection.cpp index e5e2b22644..2ecaf1c2d6 100644 --- a/engines/parallaction/detection.cpp +++ b/engines/parallaction/detection.cpp @@ -240,7 +240,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOLAUNCHLOAD + Common::GUIO_NOLAUNCHLOAD, + // Maximum directory depth + 1 }; class ParallactionMetaEngine : public AdvancedMetaEngine { diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index 1c2c6bacff..b57b056806 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -122,7 +122,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class SagaMetaEngine : public AdvancedMetaEngine { diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 579414b3ea..7f0a27c14f 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -310,7 +310,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class SciMetaEngine : public AdvancedMetaEngine { diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp index 258bd982ed..4c61e20b7a 100644 --- a/engines/teenagent/detection.cpp +++ b/engines/teenagent/detection.cpp @@ -91,7 +91,8 @@ static const ADParams detectionParams = { "teenagent", 0, 0, - Common::GUIO_NONE + Common::GUIO_NONE, + 1 }; #define MAX_SAVES 20 diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 70a2f475ee..a70b75f136 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -637,7 +637,9 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class TinselMetaEngine : public AdvancedMetaEngine { diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index 65a6a29bcc..72f87a2f3f 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -134,7 +134,9 @@ static const ADParams detectionParams = { Touche::fileBasedFallback, // file-based detection data to enable not yet known versions to start kADFlagPrintWarningOnFileBasedFallback, // Additional GUI options (for every game} - Common::GUIO_NONE + Common::GUIO_NONE, + // Maximum directory depth + 1 }; class ToucheMetaEngine : public AdvancedMetaEngine { diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp index b4f30cb7fd..7f88a8ff2f 100644 --- a/engines/tucker/detection.cpp +++ b/engines/tucker/detection.cpp @@ -114,7 +114,8 @@ static const ADParams detectionParams = { "tucker", 0, 0, - Common::GUIO_NONE + Common::GUIO_NONE, + 1 }; static const ADGameDescription tuckerDemoGameDescription = { -- cgit v1.2.3 From d59c312b0890d4ad9b97c4cc0280e00fac69d725 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:50:53 +0000 Subject: Mohawk: Added support for running Riven off DVD layout. Uses new directory depth feature of AdvancedDetector. Set directory depth to 2 and added Assets1/ directory. As a result, DVD layout which does not have any game data file in top level directory gets detected and runs well. svn-id: r49654 --- engines/mohawk/detection.cpp | 2 +- engines/mohawk/riven.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index 44c3bc4f6d..6f66398971 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -1013,7 +1013,7 @@ static const ADParams detectionParams = { // Additional GUI options (for every game) Common::GUIO_NONE, // Maximum directory depth - 1 + 2 }; class MohawkMetaEngine : public AdvancedMetaEngine { diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index c646855bc7..f1536b3204 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -57,6 +57,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio SearchMan.addSubDirectoryMatching(gameDataDir, "all"); SearchMan.addSubDirectoryMatching(gameDataDir, "data"); SearchMan.addSubDirectoryMatching(gameDataDir, "exe"); + SearchMan.addSubDirectoryMatching(gameDataDir, "assets1"); SearchMan.addSubDirectoryMatching(gameDataDir, "assets2"); g_atrusJournalRectSolo = new Common::Rect(295, 402, 313, 426); -- cgit v1.2.3 From e281f2599a8ad608b61be3a7129f951223cad9f6 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:51:18 +0000 Subject: Implement safeguard for negative depth values in AdvancedDetector. svn-id: r49655 --- engines/advancedDetector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index f4932a1055..061eec2faf 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -341,7 +341,7 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms); static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) { - if (depth == 0) + if (depth <= 0) return; if (fslist.empty()) -- cgit v1.2.3 From ca161920a4dcf26a6d8773dec5d95141b0383df2 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:51:46 +0000 Subject: SCUMM: Fix bug #1438631. Bug #1438631: "SCUMM: Detecting mac version of indy3/loom broken" fixed by implementing recursive directory lookup similar to what was done for AdvancedDetector, since SCUMM engine does not use it. svn-id: r49656 --- engines/scumm/detection.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 7275caaa1e..d8b758c8b2 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -381,10 +381,12 @@ static void computeGameSettingsFromMD5(const Common::FSList &fslist, const GameF } } -static void detectGames(const Common::FSList &fslist, Common::List &results, const char *gameid) { - DescMap fileMD5Map; - DetectorResult dr; - char md5str[32+1]; +static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map, int depth) { + if (depth <= 0) + return; + + if (fslist.empty()) + return; for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { @@ -392,8 +394,23 @@ static void detectGames(const Common::FSList &fslist, Common::ListgetName()] = d; + } else { + Common::FSList files; + + if (file->getChildren(files, Common::FSNode::kListAll)) { + composeFileHashMap(files, fileMD5Map, depth - 1); + } } } +} + +static void detectGames(const Common::FSList &fslist, Common::List &results, const char *gameid) { + DescMap fileMD5Map; + DetectorResult dr; + char md5str[32+1]; + + // Dive one level down since mac indy3/loom has its files split into directories. See Bug #1438631 + composeFileHashMap(fslist, fileMD5Map, 2); // Iterate over all filename patterns. for (const GameFilenamePattern *gfp = gameFilenamesTable; gfp->gameid; ++gfp) { -- cgit v1.2.3 From 6916e547a3cd3330bfc5da7df3fe2c74e64eae76 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:52:13 +0000 Subject: AGOS: Fix bug #1777795. Bug #1777795: "SIMON1: Acorn CD MD5s" fixed by specifying directory depth for AdvancedDetector to 2. svn-id: r49657 --- engines/agos/detection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp index d22ee720d7..9a23dde426 100644 --- a/engines/agos/detection.cpp +++ b/engines/agos/detection.cpp @@ -104,7 +104,7 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOLAUNCHLOAD, // Maximum directory depth - 1 + 2 }; using namespace AGOS; -- cgit v1.2.3 From 1c3e96ac122dd82b4dbd253c169f50013429e157 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 14 Jun 2010 14:52:49 +0000 Subject: Split out Mohawk detection tables into separate file. svn-id: r49658 --- engines/mohawk/detection.cpp | 872 +------------------------------------ engines/mohawk/detection_tables.h | 895 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 896 insertions(+), 871 deletions(-) create mode 100644 engines/mohawk/detection_tables.h diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index 6f66398971..a01f4a8759 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -121,877 +121,7 @@ static const PlainGameDescriptor mohawkGames[] = { {0, 0} }; - -namespace Mohawk { - -static const MohawkGameDescription gameDescriptions[] = { - // Myst - // English Windows 3.11 - // From clone2727 - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "ae3258c9c90128d274aa6a790b3ad181"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Myst Demo - // English Windows 3.11 - // From CD-ROM Today July, 1994 - { - { - "myst", - "Demo", - AD_ENTRY1("DEMO.DAT", "c39303dd53fb5c4e7f3c23231c606cd0"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_MYST, - GF_DEMO, - 0, - }, - - // Myst - // German Windows 3.11 - // From clone2727 - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "4beb3366ed3f3b9bfb6e81a14a43bdcc"), - Common::DE_DEU, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Myst - // German Windows 3.11 - // From LordHoto - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "e0937cca1ab125e48e30dc3cd5046ddf"), - Common::DE_DEU, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Myst - // Spanish Windows ? - // From jvprat - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "f7e7d7ca69934f1351b5acd4fe4d44c2"), - Common::ES_ESP, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Myst - // Japanese Windows 3.11 - // From clone2727 - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "032c88e3b7e8db4ca475e7b7db9a66bb"), - Common::JA_JPN, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Myst - // French Windows 3.11 - // From Strangerke - { - { - "myst", - "", - AD_ENTRY1("MYST.DAT", "d631d42567a941c67c78f2e491f4ea58"), - Common::FR_FRA, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0, - }, - - // Making of Myst - // English Windows 3.11 - // From clone2727 - { - { - "MakingOfMyst", - "", - AD_ENTRY1("MAKING.DAT", "f6387e8f0f7b8a3e42c95294315d6a0e"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MAKINGOF, - 0, - 0, - }, - - // Making of Myst - // Japanese Windows 3.11 - // From clone2727 - { - { - "MakingOfMyst", - "", - AD_ENTRY1("MAKING.DAT", "03ff62607e64419ab2b6ebf7b7bcdf63"), - Common::JA_JPN, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MAKINGOF, - 0, - 0, - }, - - // Myst Masterpiece Edition - // English Windows - // From clone2727 - { - { - "myst", - "Masterpiece Edition", - AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - GF_ME, - 0, - }, - - // Myst Masterpiece Edition - // English Windows - // From clone2727 - { - { - "myst", - "Masterpiece Edition", - AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - GF_ME, - 0, - }, - - // Myst Masterpiece Edition - // German Windows - // From DrMcCoy (Included in "Myst: Die Trilogie") - { - { - "myst", - "Masterpiece Edition", - AD_ENTRY1("MYST.DAT", "f88e0ace66dbca78eebdaaa1d3314ceb"), - Common::DE_DEU, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - GF_ME, - 0, - }, - - // Myst Masterpiece Edition - // French Windows - // From gamin (Included in "Myst: La Trilogie") - { - { - "myst", - "Masterpiece Edition", - AD_ENTRY1("MYST.DAT", "aea81633b2d2ae498f09072fb87263b6"), - Common::FR_FRA, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - GF_ME, - 0, - }, - - // Riven: The Sequel to Myst - // Version 1.0 (5CD) - // From clone2727 - { - { - "riven", - "", - AD_ENTRY1("a_Data.MHK", "71145fdecbd68a0cfc292c2fbddf8e08"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - 0, - 0, - }, - - // Riven: The Sequel to Myst - // Version 1.03 (5CD) - // From ST - { - { - "riven", - "", - AD_ENTRY1("a_Data.MHK", "d8ccae34a0e3c709135a73f449b783be"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - 0, - 0, - }, - - // Riven: The Sequel to Myst - // Version 1.? (5CD) - // From jvprat - { - { - "riven", - "", - AD_ENTRY1("a_Data.MHK", "249e8c995d191b03ee94c892c0eac775"), - Common::ES_ESP, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - 0, - 0, - }, - - // Riven: The Sequel to Myst - // Version 1.? (DVD, From "Myst 10th Anniversary Edition") - // From Clone2727 - { - { - "riven", - "DVD", - AD_ENTRY1("a_Data.MHK", "08fcaa5d5a2a01d7a5a6960f497212fe"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - GF_DVD, - 0, - }, - - // Riven: The Sequel to Myst - // Version 1.0 (DVD, From "Myst: Die Trilogie") - // From DrMcCoy - { - { - "riven", - "", - AD_ENTRY1("a_Data.MHK", "a5fe1c91a6033eb6ee54b287578b74b9"), - Common::DE_DEU, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - GF_DVD, - 0, - }, - - // Riven: The Sequel to Myst - // Version ? (DVD, From "Myst: La Trilogie") - // From gamin - { - { - "riven", - "", - AD_ENTRY1("a_Data.MHK", "aff2a384aaa9a0e0ec51010f708c5c04"), - Common::FR_FRA, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - GF_DVD, - 0, - }, - - // Riven: The Sequel to Myst - // Version ? (Demo, From "Prince of Persia Collector's Edition") - // From Clone2727 - { - { - "riven", - "Demo", - AD_ENTRY1("a_Data.MHK", "bae6b03bd8d6eb350d35fd13f0e3139f"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_RIVEN, - GF_DEMO, - 0, - }, - -#ifdef DETECT_BRODERBUND_TITLES - { - { - "zoombini", - "", - AD_ENTRY1("ZOOMBINI.MHK", "98b758fec55104c096cfd129048be9a6"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_ZOOMBINI, - GF_HASMIDI, - 0 - }, - - { - { - "csworld", - "v3.0", - AD_ENTRY1("C2K.MHK", "605fe88380848031bbd0ff84ade6fe40"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_CSWORLD, - 0, - 0 - }, - - { - { - "csworld", - "v3.5", - AD_ENTRY1("C2K.MHK", "d4857aeb0f5e2e0c4ac556aa74f38c23"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_CSWORLD, - 0, - 0 - }, - - { - { - "csamtrak", - "", - AD_ENTRY1("AMTRAK.MHK", "2f95301f0bb950d555bb7b0e3b1b7eb1"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_CSAMTRAK, - 0, - 0 - }, - - { - { - "maggiess", - "", - AD_ENTRY1("MAGGIESS.MHK", "08f75fc8c0390e68fdada5ddb35d0355"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MAGGIESS, - 0, - 0 - }, - - { - { - "jamesmath", - "", - AD_ENTRY1("BRODER.MHK", "007299da8b2c6e8ec1cde9598c243024"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_JAMESMATH, - GF_HASMIDI, - 0 - }, - - // This is in the NEWDATA folder, so I assume it's a newer version ;) - { - { - "jamesmath", - "", - AD_ENTRY1("BRODER.MHK", "53c000938a50dca92860fd9b546dd276"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_JAMESMATH, - GF_HASMIDI, - 1 - }, - - { - { - "treehouse", - "", - AD_ENTRY1("MAINROOM.MHK", "12f51894d7f838af639ea9bf1bc8f45b"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_TREEHOUSE, - GF_HASMIDI, - 0 - }, - - { - { - "greeneggs", - "", - AD_ENTRY1("GREEN.LB", "5df8438138186f89e71299d7b4f88d06"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV3, - 0, - 0 - }, - - // 32-bit version of the previous entry - { - { - "greeneggs", - "", - AD_ENTRY1("GREEN32.LB", "5df8438138186f89e71299d7b4f88d06"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV3, - 0, - 0 - }, - - { - { - "1stdegree", - "", - AD_ENTRY1("AL236_1.MHK", "3ba145492a7b8b4dee0ef4222c5639c3"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_1STDEGREE, - GF_HASMIDI, - 0 - }, - - // In The 1st Degree - // French Windows - // From Strangerke - { - { - "1stdegree", - "", - AD_ENTRY1("AL236_1.MHK", "0e0c70b1b702b6ddca61a1192ada1282"), - Common::FR_FRA, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_1STDEGREE, - GF_HASMIDI, - 0 - }, - - { - { - "csusa", - "", - AD_ENTRY1("USAC2K.MHK", "b8c9d3a2586f62bce3a48b50d7a700e9"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_CSUSA, - 0, - 0 - }, - - { - { - "tortoise", - "Demo v1.0", - AD_ENTRY1("TORTOISE.512", "75d9a2f8339e423604a0c6e8177600a6"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "tortoise", - "Demo v1.1", - AD_ENTRY1("TORTOISE.512", "a38c99360e2bea3bfdec418469aef022"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "arthur", - "", - AD_ENTRY1("PAGES.512", "1550a361454ec452fe7d2328aac2003c"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - 0, - 0 - }, - - { - { - "arthur", - "Demo", - AD_ENTRY1("PAGES.512", "a4d68cef197af1416921ca5b2e0c1e31"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "arthur", - "Demo", - AD_ENTRY1("Bookoutline", "7e2691611ff4c7b89c05221736628059"), - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "grandma", - "Demo v1.0", - AD_ENTRY1("PAGES.512", "95d9f4b035bf5d15c57a9189f231b0f8"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "grandma", - "Demo v1.1", - AD_ENTRY1("GRANDMA.512", "72a4d5fb1b3f06b5f75425635d42ce2e"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "grandma", - "Demo", - AD_ENTRY1("Bookoutline", "553c93891b9631d1e1d269599e1efa6c"), - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "ruff", - "Demo", - AD_ENTRY1("RUFF.512", "2ba1aa65177c816e156db648c398d362"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "ruff", - "Demo", - AD_ENTRY1("Ruff's Bone Demo", "22553ac2ceb2a166bdf1def6ad348532"), - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "newkid", - "Demo v1.0", - AD_ENTRY1("NEWKID.512", "2b9d94763a50d514c04a3af488934f73"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "newkid", - "Demo v1.1", - AD_ENTRY1("NEWKID.512", "41e975b7390c626f8d1058a34f9d9b2e"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_DEMO, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV1, - GF_DEMO, - 0 - }, - - { - { - "arthurrace", - "", - AD_ENTRY1("RACE.LB", "1645f36bcb36e440d928e920aa48c373"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV3, - 0, - 0 - }, - - // 32-bit version of the previous entry - { - { - "arthurrace", - "", - AD_ENTRY1("RACE32.LB", "292a05bc48c1dd9583821a4181a02ef2"), - Common::EN_ANY, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_LIVINGBOOKSV3, - 0, - 0 - }, -#endif - - { AD_TABLE_END_MARKER, 0, 0, 0 } -}; - -////////////////////////////// -//Fallback detection -////////////////////////////// - -static const MohawkGameDescription fallbackDescs[] = { - { - { - "myst", - "unknown", - AD_ENTRY1(0, 0), - Common::UNK_LANG, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - 0, - 0 - }, - - { - { - "MakingOfMyst", - "unknown", - AD_ENTRY1(0, 0), - Common::UNK_LANG, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MAKINGOF, - 0, - 0 - }, - - { - { - "myst", - "unknown (Masterpiece Edition)", - AD_ENTRY1(0, 0), - Common::UNK_LANG, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_MYST, - GF_ME, - 0 - }, - - { - { - "riven", - "unknown", - AD_ENTRY1(0, 0), - Common::UNK_LANG, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - 0, - 0 - }, - - { - { - "riven", - "unknown (DVD)", - AD_ENTRY1(0, 0), - Common::UNK_LANG, - Common::kPlatformWindows, - ADGF_NO_FLAGS, - Common::GUIO_NONE - }, - GType_RIVEN, - GF_DVD, - 0 - } -}; - -static const ADFileBasedFallback fileBased[] = { - { &fallbackDescs[0], { "MYST.DAT", 0 } }, - { &fallbackDescs[1], { "MAKING.DAT", 0 } }, - { &fallbackDescs[2], { "MYST.DAT", "Help.dat", 0 } }, // Help system doesn't exist in original - { &fallbackDescs[3], { "a_Data.MHK", 0 } }, - { &fallbackDescs[4], { "a_Data.MHK", "t_Data1.MHK" , 0 } }, - { 0, { 0 } } -}; - -} // End of namespace Mohawk +#include "mohawk/detection_tables.h" static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h new file mode 100644 index 0000000000..ea72574978 --- /dev/null +++ b/engines/mohawk/detection_tables.h @@ -0,0 +1,895 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Mohawk { + +static const MohawkGameDescription gameDescriptions[] = { + // Myst + // English Windows 3.11 + // From clone2727 + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "ae3258c9c90128d274aa6a790b3ad181"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Myst Demo + // English Windows 3.11 + // From CD-ROM Today July, 1994 + { + { + "myst", + "Demo", + AD_ENTRY1("DEMO.DAT", "c39303dd53fb5c4e7f3c23231c606cd0"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_MYST, + GF_DEMO, + 0, + }, + + // Myst + // German Windows 3.11 + // From clone2727 + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "4beb3366ed3f3b9bfb6e81a14a43bdcc"), + Common::DE_DEU, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Myst + // German Windows 3.11 + // From LordHoto + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "e0937cca1ab125e48e30dc3cd5046ddf"), + Common::DE_DEU, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Myst + // Spanish Windows ? + // From jvprat + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "f7e7d7ca69934f1351b5acd4fe4d44c2"), + Common::ES_ESP, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Myst + // Japanese Windows 3.11 + // From clone2727 + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "032c88e3b7e8db4ca475e7b7db9a66bb"), + Common::JA_JPN, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Myst + // French Windows 3.11 + // From Strangerke + { + { + "myst", + "", + AD_ENTRY1("MYST.DAT", "d631d42567a941c67c78f2e491f4ea58"), + Common::FR_FRA, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0, + }, + + // Making of Myst + // English Windows 3.11 + // From clone2727 + { + { + "MakingOfMyst", + "", + AD_ENTRY1("MAKING.DAT", "f6387e8f0f7b8a3e42c95294315d6a0e"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MAKINGOF, + 0, + 0, + }, + + // Making of Myst + // Japanese Windows 3.11 + // From clone2727 + { + { + "MakingOfMyst", + "", + AD_ENTRY1("MAKING.DAT", "03ff62607e64419ab2b6ebf7b7bcdf63"), + Common::JA_JPN, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MAKINGOF, + 0, + 0, + }, + + // Myst Masterpiece Edition + // English Windows + // From clone2727 + { + { + "myst", + "Masterpiece Edition", + AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + GF_ME, + 0, + }, + + // Myst Masterpiece Edition + // English Windows + // From clone2727 + { + { + "myst", + "Masterpiece Edition", + AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + GF_ME, + 0, + }, + + // Myst Masterpiece Edition + // German Windows + // From DrMcCoy (Included in "Myst: Die Trilogie") + { + { + "myst", + "Masterpiece Edition", + AD_ENTRY1("MYST.DAT", "f88e0ace66dbca78eebdaaa1d3314ceb"), + Common::DE_DEU, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + GF_ME, + 0, + }, + + // Myst Masterpiece Edition + // French Windows + // From gamin (Included in "Myst: La Trilogie") + { + { + "myst", + "Masterpiece Edition", + AD_ENTRY1("MYST.DAT", "aea81633b2d2ae498f09072fb87263b6"), + Common::FR_FRA, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + GF_ME, + 0, + }, + + // Riven: The Sequel to Myst + // Version 1.0 (5CD) + // From clone2727 + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "71145fdecbd68a0cfc292c2fbddf8e08"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + 0, + 0, + }, + + // Riven: The Sequel to Myst + // Version 1.03 (5CD) + // From ST + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "d8ccae34a0e3c709135a73f449b783be"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + 0, + 0, + }, + + // Riven: The Sequel to Myst + // Version 1.? (5CD) + // From jvprat + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "249e8c995d191b03ee94c892c0eac775"), + Common::ES_ESP, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + 0, + 0, + }, + + // Riven: The Sequel to Myst + // Version 1.? (DVD, From "Myst 10th Anniversary Edition") + // From Clone2727 + { + { + "riven", + "DVD", + AD_ENTRY1("a_Data.MHK", "08fcaa5d5a2a01d7a5a6960f497212fe"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + GF_DVD, + 0, + }, + + // Riven: The Sequel to Myst + // Version 1.0 (DVD, From "Myst: Die Trilogie") + // From DrMcCoy + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "a5fe1c91a6033eb6ee54b287578b74b9"), + Common::DE_DEU, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + GF_DVD, + 0, + }, + + // Riven: The Sequel to Myst + // Version ? (DVD, From "Myst: La Trilogie") + // From gamin + { + { + "riven", + "", + AD_ENTRY1("a_Data.MHK", "aff2a384aaa9a0e0ec51010f708c5c04"), + Common::FR_FRA, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + GF_DVD, + 0, + }, + + // Riven: The Sequel to Myst + // Version ? (Demo, From "Prince of Persia Collector's Edition") + // From Clone2727 + { + { + "riven", + "Demo", + AD_ENTRY1("a_Data.MHK", "bae6b03bd8d6eb350d35fd13f0e3139f"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_RIVEN, + GF_DEMO, + 0, + }, + +#ifdef DETECT_BRODERBUND_TITLES + { + { + "zoombini", + "", + AD_ENTRY1("ZOOMBINI.MHK", "98b758fec55104c096cfd129048be9a6"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_ZOOMBINI, + GF_HASMIDI, + 0 + }, + + { + { + "csworld", + "v3.0", + AD_ENTRY1("C2K.MHK", "605fe88380848031bbd0ff84ade6fe40"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_CSWORLD, + 0, + 0 + }, + + { + { + "csworld", + "v3.5", + AD_ENTRY1("C2K.MHK", "d4857aeb0f5e2e0c4ac556aa74f38c23"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_CSWORLD, + 0, + 0 + }, + + { + { + "csamtrak", + "", + AD_ENTRY1("AMTRAK.MHK", "2f95301f0bb950d555bb7b0e3b1b7eb1"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_CSAMTRAK, + 0, + 0 + }, + + { + { + "maggiess", + "", + AD_ENTRY1("MAGGIESS.MHK", "08f75fc8c0390e68fdada5ddb35d0355"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MAGGIESS, + 0, + 0 + }, + + { + { + "jamesmath", + "", + AD_ENTRY1("BRODER.MHK", "007299da8b2c6e8ec1cde9598c243024"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_JAMESMATH, + GF_HASMIDI, + 0 + }, + + // This is in the NEWDATA folder, so I assume it's a newer version ;) + { + { + "jamesmath", + "", + AD_ENTRY1("BRODER.MHK", "53c000938a50dca92860fd9b546dd276"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_JAMESMATH, + GF_HASMIDI, + 1 + }, + + { + { + "treehouse", + "", + AD_ENTRY1("MAINROOM.MHK", "12f51894d7f838af639ea9bf1bc8f45b"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_TREEHOUSE, + GF_HASMIDI, + 0 + }, + + { + { + "greeneggs", + "", + AD_ENTRY1("GREEN.LB", "5df8438138186f89e71299d7b4f88d06"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV3, + 0, + 0 + }, + + // 32-bit version of the previous entry + { + { + "greeneggs", + "", + AD_ENTRY1("GREEN32.LB", "5df8438138186f89e71299d7b4f88d06"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV3, + 0, + 0 + }, + + { + { + "1stdegree", + "", + AD_ENTRY1("AL236_1.MHK", "3ba145492a7b8b4dee0ef4222c5639c3"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_1STDEGREE, + GF_HASMIDI, + 0 + }, + + // In The 1st Degree + // French Windows + // From Strangerke + { + { + "1stdegree", + "", + AD_ENTRY1("AL236_1.MHK", "0e0c70b1b702b6ddca61a1192ada1282"), + Common::FR_FRA, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_1STDEGREE, + GF_HASMIDI, + 0 + }, + + { + { + "csusa", + "", + AD_ENTRY1("USAC2K.MHK", "b8c9d3a2586f62bce3a48b50d7a700e9"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_CSUSA, + 0, + 0 + }, + + { + { + "tortoise", + "Demo v1.0", + AD_ENTRY1("TORTOISE.512", "75d9a2f8339e423604a0c6e8177600a6"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "tortoise", + "Demo v1.1", + AD_ENTRY1("TORTOISE.512", "a38c99360e2bea3bfdec418469aef022"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "arthur", + "", + AD_ENTRY1("PAGES.512", "1550a361454ec452fe7d2328aac2003c"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + 0 + }, + + { + { + "arthur", + "Demo", + AD_ENTRY1("PAGES.512", "a4d68cef197af1416921ca5b2e0c1e31"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "arthur", + "Demo", + AD_ENTRY1("Bookoutline", "7e2691611ff4c7b89c05221736628059"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "grandma", + "Demo v1.0", + AD_ENTRY1("PAGES.512", "95d9f4b035bf5d15c57a9189f231b0f8"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "grandma", + "Demo v1.1", + AD_ENTRY1("GRANDMA.512", "72a4d5fb1b3f06b5f75425635d42ce2e"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "grandma", + "Demo", + AD_ENTRY1("Bookoutline", "553c93891b9631d1e1d269599e1efa6c"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "ruff", + "Demo", + AD_ENTRY1("RUFF.512", "2ba1aa65177c816e156db648c398d362"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "ruff", + "Demo", + AD_ENTRY1("Ruff's Bone Demo", "22553ac2ceb2a166bdf1def6ad348532"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "newkid", + "Demo v1.0", + AD_ENTRY1("NEWKID.512", "2b9d94763a50d514c04a3af488934f73"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "newkid", + "Demo v1.1", + AD_ENTRY1("NEWKID.512", "41e975b7390c626f8d1058a34f9d9b2e"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "arthurrace", + "", + AD_ENTRY1("RACE.LB", "1645f36bcb36e440d928e920aa48c373"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV3, + 0, + 0 + }, + + // 32-bit version of the previous entry + { + { + "arthurrace", + "", + AD_ENTRY1("RACE32.LB", "292a05bc48c1dd9583821a4181a02ef2"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV3, + 0, + 0 + }, +#endif + + { AD_TABLE_END_MARKER, 0, 0, 0 } +}; + +////////////////////////////// +//Fallback detection +////////////////////////////// + +static const MohawkGameDescription fallbackDescs[] = { + { + { + "myst", + "unknown", + AD_ENTRY1(0, 0), + Common::UNK_LANG, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + 0, + 0 + }, + + { + { + "MakingOfMyst", + "unknown", + AD_ENTRY1(0, 0), + Common::UNK_LANG, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MAKINGOF, + 0, + 0 + }, + + { + { + "myst", + "unknown (Masterpiece Edition)", + AD_ENTRY1(0, 0), + Common::UNK_LANG, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_MYST, + GF_ME, + 0 + }, + + { + { + "riven", + "unknown", + AD_ENTRY1(0, 0), + Common::UNK_LANG, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + 0, + 0 + }, + + { + { + "riven", + "unknown (DVD)", + AD_ENTRY1(0, 0), + Common::UNK_LANG, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_RIVEN, + GF_DVD, + 0 + } +}; + +static const ADFileBasedFallback fileBased[] = { + { &fallbackDescs[0], { "MYST.DAT", 0 } }, + { &fallbackDescs[1], { "MAKING.DAT", 0 } }, + { &fallbackDescs[2], { "MYST.DAT", "Help.dat", 0 } }, // Help system doesn't exist in original + { &fallbackDescs[3], { "a_Data.MHK", 0 } }, + { &fallbackDescs[4], { "a_Data.MHK", "t_Data1.MHK" , 0 } }, + { 0, { 0 } } +}; + +} // End of Namespace Mohawk -- cgit v1.2.3 From 95f55f3b05f2bb3074afba81ee1e1b2c02735203 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 15:49:11 +0000 Subject: Hopefully fixed kOnMe (SCI2) and implemented kIsOnMe (SCI2.1). GK1 and the demo of Phantasmagoria 1 should now be responding to mouse clicks and movement correctly svn-id: r49659 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel32.cpp | 53 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d418fb7998..d1b6ce72bc 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -386,7 +386,7 @@ SciKernelFunction kfunct_mappers[] = { { "Save", kSave, ".*" }, { "List", kList, ".*" }, { "Robot", kRobot, ".*" }, - { "IsOnMe", kOnMe, "iio.*" }, // TODO: this seems right, but verify... + { "IsOnMe", kIsOnMe, "iio.*" }, #endif diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 722473a85b..10225729d7 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -437,6 +437,7 @@ reg_t kInPolygon(EngineState *s, int argc, reg_t *argv); reg_t kSave(EngineState *s, int argc, reg_t *argv); reg_t kList(EngineState *s, int argc, reg_t *argv); reg_t kRobot(EngineState *s, int argc, reg_t *argv); +reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); #endif diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index f279d9a66f..139d4188a0 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -33,6 +33,7 @@ #include "sci/graphics/gui.h" #include "sci/graphics/gui32.h" #include "sci/graphics/frameout.h" +#include "sci/graphics/screen.h" #include "common/system.h" @@ -786,13 +787,63 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { // TODO: argv[3] - it's usually 0 Common::Rect nsRect; + // Get the bounding rectangle of the object + nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + // If these are 0, read them from nsLeft, nsTop. This is madness... + if (nsRect.left == 0 && nsRect.top == 0) { + nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); + nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); + } + nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); + nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); + + /* + warning("kOnMe: (%d, %d) on object %04x:%04x (%s), rect (%d, %d, %d, %d), parameter %d", + argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]), + nsRect.left, nsRect.top, nsRect.right, nsRect.bottom, + argv[3].toUint16()); + */ + + return make_reg(0, nsRect.contains(x, y)); +} + +reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { + // Tests if the cursor is on the passed object, after adjusting the coordinates + // of the object according to the object's plane + + uint16 x = argv[0].toUint16(); + uint16 y = argv[1].toUint16(); + reg_t targetObject = argv[2]; + // TODO: argv[3] - it's usually 0 + Common::Rect nsRect; + // Get the bounding rectangle of the object nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); - //warning("kOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); + // Get the object's plane + reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); + uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); + uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); + uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; + planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + + // Adjust the bounding rectangle of the object by the object's actual X, Y coordinates + uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY); + itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX); + itemY += planeTop; + itemX += planeLeft; + + nsRect.translate(itemX, itemY); + + //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); return make_reg(0, nsRect.contains(x, y)); } -- cgit v1.2.3 From b04269e7e4ebaf36e654f0604602dd64dee48211 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 16:04:28 +0000 Subject: Fixed GK1 again, including the inventory screen svn-id: r49660 --- engines/sci/engine/kernel32.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 139d4188a0..2b00daf34a 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -788,16 +788,20 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { Common::Rect nsRect; // Get the bounding rectangle of the object - nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - // If these are 0, read them from nsLeft, nsTop. This is madness... - if (nsRect.left == 0 && nsRect.top == 0) { - nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); - nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); - } + nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); + nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); + uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + if (nsRect.left == itemY && nsRect.top == itemX) { + // FIXME: Why is this happening?? + // Swap the values, as they're inversed(eh???) + nsRect.left = itemX; + nsRect.top = itemY; + } + /* warning("kOnMe: (%d, %d) on object %04x:%04x (%s), rect (%d, %d, %d, %d), parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]), -- cgit v1.2.3 From 60eced7a81c37d3db7c5fffee2d34463f8313e9d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 16:57:43 +0000 Subject: Cleanup svn-id: r49662 --- engines/sci/engine/kscripts.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 722d0175d1..c6d73556ba 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -160,19 +160,6 @@ reg_t kDisposeClone(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } - // QFG3 clears clones with underbits set - //if (readSelectorValue(victim_addr, underBits)) - // warning("Clone %04x:%04x was cleared with underBits set", PRINT_REG(victim_addr)); - -#if 0 - if (s->dyn_views) { // Free any widget associated with the clone - GfxWidget *widget = gfxw_set_id(gfxw_remove_ID(s->dyn_views, offset), GFXW_NO_ID); - - if (widget && s->bg_widgets) - s->bg_widgets->add(GFXWC(s->bg_widgets), widget); - } -#endif - victim_obj->markAsFreed(); return s->r_acc; -- cgit v1.2.3 From 303c7b0a8dd0fb120f1fa1ec0abb03b27912e8a5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 14 Jun 2010 16:58:15 +0000 Subject: Ignore and remove invalid plane and item objects in kFrameout. Fixes loading in-game in GK1. svn-id: r49663 --- engines/sci/graphics/frameout.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 3cc5ca5447..d794fad39e 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -126,6 +126,14 @@ void GfxFrameout::kernelFrameout() { for (uint32 planeNr = 0; planeNr < _planes.size(); planeNr++) { planeObject = _planes[planeNr]; + + // Remove any invalid planes + if (!_segMan->isObject(planeObject)) { + _planes.remove_at(planeNr); + planeNr--; + continue; + } + planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); if (planePriority == -1) // Plane currently not meant to be shown @@ -161,6 +169,14 @@ void GfxFrameout::kernelFrameout() { itemEntry = itemData; for (uint32 itemNr = 0; itemNr < _screenItems.size(); itemNr++) { itemObject = _screenItems[itemNr]; + + // Remove any invalid items + if (!_segMan->isObject(itemObject)) { + _screenItems.remove_at(itemNr); + itemNr--; + continue; + } + itemPlane = readSelector(_segMan, itemObject, SELECTOR(plane)); if (planeObject == itemPlane) { // Found an item on current plane -- cgit v1.2.3 From 86878450ee26cbf2b4f79e5e54787fe5cce2a10e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 19:37:19 +0000 Subject: Cleanup of the SCI0 object initialization code svn-id: r49666 --- engines/sci/engine/script.cpp | 148 ++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 85 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 6dfd39a496..c1810df679 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -192,8 +192,7 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { return; } - _classTable[species].reg.segment = seg; - _classTable[species].reg.offset = classpos; + setClassOffset(species, make_reg(seg, classpos)); } seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; } @@ -231,85 +230,69 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { int objType; - uint32 objLength = 0; + reg_t addr; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - uint16 curOffset = oldScriptHeader ? 2 : 0; - // Now do a first pass through the script objects to find all the object classes - - do { - objType = scr->getHeap(curOffset); - if (!objType) - break; - - objLength = scr->getHeap(curOffset + 2); - curOffset += 4; // skip header - - switch (objType) { - case SCI_OBJ_CLASS: { - int classpos = curOffset - SCRIPT_OBJECT_MAGIC_OFFSET; - int species = scr->getHeap(curOffset - SCRIPT_OBJECT_MAGIC_OFFSET + SCRIPT_SPECIES_OFFSET); - if (species < 0 || species >= (int)segMan->classTableSize()) { - if (species == (int)segMan->classTableSize()) { - // Happens in the LSL2 demo - warning("Applying workaround for an off-by-one invalid species access"); - segMan->resizeClassTable(segMan->classTableSize() + 1); - } else { - error("Invalid species %d(0x%x) not in interval " - "[0,%d) while instantiating script at segment %d\n", - species, species, segMan->classTableSize(), - segmentId); - return; + // The script is initialized in 2 passes. + // Pass 1: creates a lookup table of all used classes + // Pass 2: loads classes and objects + + for (uint16 pass = 0; pass <= 1; pass++) { + uint16 objLength = 0; + uint16 curOffset = oldScriptHeader ? 2 : 0; + + do { + objType = scr->getHeap(curOffset); + if (!objType) + break; + + objLength = scr->getHeap(curOffset + 2); + curOffset += 4; // skip header + addr = make_reg(segmentId, curOffset);; + + switch (objType) { + case SCI_OBJ_CODE: + if (pass == 0) + scr->scriptAddCodeBlock(addr); + break; + case SCI_OBJ_OBJECT: + case SCI_OBJ_CLASS: + if (pass == 0 && objType == SCI_OBJ_CLASS) { + int classpos = curOffset + 8; // SCRIPT_OBJECT_MAGIC_OFFSET + int species = scr->getHeap(classpos); + + if (species == (int)segMan->classTableSize()) { + // Happens in the LSL2 demo + warning("Applying workaround for an off-by-one invalid species access"); + segMan->resizeClassTable(segMan->classTableSize() + 1); + } else if (species < 0 || species > (int)segMan->classTableSize()) { + error("Invalid species %d(0x%x) not in interval " + "[0,%d) while instantiating script at segment %d\n", + species, species, segMan->classTableSize(), + segmentId); + return; + } + + segMan->setClassOffset(species, make_reg(segmentId, classpos)); + } else if (pass == 1) { + Object *obj = scr->scriptObjInit(addr); + obj->initSpecies(segMan, addr); + + if (!obj->initBaseObject(segMan, addr)) { + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + scr->scriptObjRemove(addr); + } } - } - - segMan->setClassOffset(species, make_reg(segmentId, classpos)); - // Set technical class position-- into the block allocated for it - } - break; - - default: - break; - } - - curOffset += objLength - 4; - } while (objType != 0 && curOffset < scr->getScriptSize() - 2); - - // And now a second pass to adjust objects and class pointers, and the general pointers - objLength = 0; - curOffset = oldScriptHeader ? 2 : 0; - - do { - objType = scr->getHeap(curOffset); - if (!objType) - break; - - objLength = scr->getHeap(curOffset + 2); - curOffset += 4; // skip header + break; - reg_t addr = make_reg(segmentId, curOffset); - - switch (objType) { - case SCI_OBJ_CODE: - scr->scriptAddCodeBlock(addr); - break; - case SCI_OBJ_OBJECT: - case SCI_OBJ_CLASS: { // object or class? - Object *obj = scr->scriptObjInit(addr); - obj->initSpecies(segMan, addr); - - if (!obj->initBaseObject(segMan, addr)) { - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - scr->scriptObjRemove(addr); + default: + break; } - } // if object or class - break; - default: - break; - } - curOffset += objLength - 4; - } while (objType != 0 && curOffset < scr->getScriptSize() - 2); + curOffset += objLength - 4; + } while (objType != 0 && curOffset < scr->getScriptSize() - 2); + } // for + } int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNum) { @@ -411,16 +394,11 @@ void script_uninstantiate(SegManager *segMan, int script_nr) { script_uninstantiate_sci0(segMan, script_nr, segment); // FIXME: Add proper script uninstantiation for SCI 1.1 - if (scr->getLockers()) - return; // if xxx.lockers > 0 - - // Otherwise unload it completely - // Explanation: I'm starting to believe that this work is done by SCI itself. - scr->markDeleted(); - - debugC(kDebugLevelScripts, "Unloaded script 0x%x.", script_nr); - - return; + if (!scr->getLockers()) { + // The actual script deletion seems to be done by SCI scripts themselves + scr->markDeleted(); + debugC(kDebugLevelScripts, "Unloaded script 0x%x.", script_nr); + } } -- cgit v1.2.3 From 1fde7f1abceb5f7c52982e9b2bf18188037b63d5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 20:45:00 +0000 Subject: Removed the code used for tracking script code block relocations in SCI0-SCI1 games, as we don't actually relocate these blocks, and it was used solely for verification of the exports table. The issue that this warning was created for should no longer occur svn-id: r49669 --- engines/sci/engine/script.cpp | 9 +++---- engines/sci/engine/segment.cpp | 57 +++++++++--------------------------------- engines/sci/engine/segment.h | 13 ---------- 3 files changed, 16 insertions(+), 63 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index c1810df679..cb112a90f9 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -179,7 +179,10 @@ void SegManager::scriptInitialiseLocals(SegmentId segmentId) { void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { Script *scr = getScript(seg); - const byte *seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + const byte *seeker = scr->_heapStart;; + uint16 entrySize = READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; + seeker += entrySize; // skip first entry + seeker += 4; // skip header while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { if (READ_SCI11ENDIAN_UINT16(seeker + 14) & kInfoFlagClass) { // -info- selector @@ -251,10 +254,6 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { addr = make_reg(segmentId, curOffset);; switch (objType) { - case SCI_OBJ_CODE: - if (pass == 0) - scr->scriptAddCodeBlock(addr); - break; case SCI_OBJ_OBJECT: case SCI_OBJ_CLASS: if (pass == 0 && objType == SCI_OBJ_CLASS) { diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 492e928e31..879cbc22ee 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -115,7 +115,6 @@ void Script::freeScript() { _bufSize = 0; _objects.clear(); - _codeBlocks.clear(); } void Script::init(int script_nr, ResourceManager *resMan) { @@ -125,8 +124,6 @@ void Script::init(int script_nr, ResourceManager *resMan) { _localsBlock = NULL; _localsCount = 0; - _codeBlocks.clear(); - _markedAsDeleted = false; _nr = script_nr; @@ -188,8 +185,6 @@ void Script::load(ResourceManager *resMan) { memcpy(_heapStart, heap->data, heap->size); } - _codeBlocks.clear(); - _exportTable = 0; _numExports = 0; _synonyms = 0; @@ -310,13 +305,6 @@ bool Script::relocateLocal(SegmentId segment, int location) { return false; } -void Script::scriptAddCodeBlock(reg_t location) { - CodeBlock cb; - cb.pos = location; - cb.size = READ_SCI11ENDIAN_UINT16(_buf + location.offset - 2); - _codeBlocks.push_back(cb); -} - void Script::relocate(reg_t block) { byte *heap = _buf; uint16 heapSize = (uint16)_bufSize; @@ -333,13 +321,14 @@ void Script::relocate(reg_t block) { int count = READ_SCI11ENDIAN_UINT16(heap + block.offset); int exportIndex = 0; + int pos = 0; for (int i = 0; i < count; i++) { - int pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; - // This occurs in SCI01/SCI1 games where every usually one export - // value is zero. It seems that in this situation, we should skip - // the export and move to the next one, though the total count - // of valid exports remains the same + pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; + // This occurs in SCI01/SCI1 games where usually one export value + // is zero. It seems that in this situation, we should skip the + // export and move to the next one, though the total count of valid + // exports remains the same if (!pos) { exportIndex++; pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; @@ -347,37 +336,15 @@ void Script::relocate(reg_t block) { error("Script::relocate(): Consecutive zero exports found"); } + // In SCI0-SCI1, script local variables, objects and code are relocated. We only relocate + // locals and objects here, and ignore relocation of code blocks. In SCI1.1 and newer + // versions, only locals and objects are relocated. if (!relocateLocal(block.segment, pos)) { - bool done = false; - uint k; - - ObjMap::iterator it; + // Not a local? It's probably an object or code block. If it's an object, relocate it. const ObjMap::iterator end = _objects.end(); - for (it = _objects.begin(); !done && it != end; ++it) { + for (ObjMap::iterator it = _objects.begin(); it != end; ++it) if (it->_value.relocate(block.segment, pos, _scriptSize)) - done = true; - } - - // Sanity check for SCI0-SCI1 - if (getSciVersion() < SCI_VERSION_1_1) { - for (k = 0; !done && k < _codeBlocks.size(); k++) { - if (pos >= _codeBlocks[k].pos.offset && - pos < _codeBlocks[k].pos.offset + _codeBlocks[k].size) - done = true; - } - } - - if (!done) { - debug("While processing relocation block %04x:%04x:\n", PRINT_REG(block)); - debug("Relocation failed for index %04x (%d/%d)\n", pos, exportIndex + 1, count); - if (_localsBlock) - debug("- locals: %d at %04x\n", _localsBlock->_locals.size(), _localsOffset); - else - debug("- No locals\n"); - for (it = _objects.begin(), k = 0; it != end; ++it, ++k) - debug("- obj#%d at %04x w/ %d vars\n", k, it->_value.getPos().offset, it->_value.getVarCount()); - debug("Trying to continue anyway...\n"); - } + break; } exportIndex++; diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 045cb119a3..02d4809b70 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -331,11 +331,6 @@ private: reg_t _pos; /**< Object offset within its script; for clones, this is their base */ }; -struct CodeBlock { - reg_t pos; - int size; -}; - typedef Common::HashMap ObjMap; class Script : public SegmentObj { @@ -362,8 +357,6 @@ private: const byte *_synonyms; /**< Synonyms block or 0 if not present*/ uint16 _numSynonyms; /**< Number of entries in the synonyms block */ - Common::Array _codeBlocks; - int _localsOffset; uint16 _localsCount; @@ -402,12 +395,6 @@ public: Object *getObject(uint16 offset); const Object *getObject(uint16 offset) const; - /** - * Informs the segment manager that a code block must be relocated - * @param location Start of block to relocate - */ - void scriptAddCodeBlock(reg_t location); - /** * Initializes an object within the segment manager * @param obj_pos Location (segment, offset) of the object. It must -- cgit v1.2.3 From 22e9fe8291b2f7f2111823614de4976f058ef524 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 22:31:38 +0000 Subject: Since allNotesOff() is virtual and can be overriden, make its associated variables protected instead of private svn-id: r49672 --- sound/midiparser.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sound/midiparser.h b/sound/midiparser.h index 0ba12ce2b1..37c00db5b6 100644 --- a/sound/midiparser.h +++ b/sound/midiparser.h @@ -267,13 +267,12 @@ struct NoteTimer { * memory block containing the music data.) */ class MidiParser { -private: +protected: uint16 _active_notes[128]; ///< Each uint16 is a bit mask for channels that have that note on. NoteTimer _hanging_notes[32]; ///< Maintains expiration info for up to 32 notes. ///< Used for "Smart Jump" and MIDI formats that do not include explicit Note Off events. byte _hanging_notes_count; ///< Count of hanging notes, used to optimize expiration. -protected: MidiDriver *_driver; ///< The device to which all events will be transmitted. uint32 _timer_rate; ///< The time in microseconds between onTimer() calls. Obtained from the MidiDriver. uint32 _ppqn; ///< Pulses Per Quarter Note. (We refer to "pulses" as "ticks".) -- cgit v1.2.3 From a6a482b83cb8f924f920ac16c8a48a321e89ecc9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 14 Jun 2010 22:35:49 +0000 Subject: SCI: Added a version of allNotesOff() which sends messages only to the channels used by the associated song instead of all channels svn-id: r49673 --- engines/sci/sound/midiparser_sci.cpp | 34 ++++++++++++++++++++++++++++++++++ engines/sci/sound/midiparser_sci.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index bb353da780..c74a7eae11 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -325,6 +325,40 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { }// switch (info.command()) } +void MidiParser_SCI::allNotesOff() { + if (!_driver) + return; + + int i, j; + + // Turn off all active notes + for (i = 0; i < 128; ++i) { + for (j = 0; j < 16; ++j) { + if ((_active_notes[i] & (1 << j)) && isChannelUsed(j)){ + _driver->send(0x80 | j, i, 0); + } + } + } + + // Turn off all hanging notes + for (i = 0; i < ARRAYSIZE(_hanging_notes); i++) { + if (_hanging_notes[i].time_left) { + _driver->send(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); + _hanging_notes[i].time_left = 0; + } + } + _hanging_notes_count = 0; + + // To be sure, send an "All Note Off" event (but not all MIDI devices + // support this...). + + for (i = 0; i < 16; ++i) { + if (isChannelUsed(i)) + _driver->send(0xB0 | i, 0x7b, 0); // All notes off + } + + memset(_active_notes, 0, sizeof(_active_notes)); +} byte MidiParser_SCI::midiGetNextChannel(long ticker) { byte curr = 0xFF; diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 8384c74cf6..80401460d2 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -71,6 +71,8 @@ public: jumpToTick(0); } + void allNotesOff(); + void remapChannel(byte channel, byte newChannel) { assert(channel < 0xF); // don't touch special SCI channel 15 assert(newChannel < 0xF); // don't touch special SCI channel 15 -- cgit v1.2.3 From 25c7dc08b1ca6816ef3b99bb13819469bd45c710 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 15 Jun 2010 05:34:37 +0000 Subject: PSP: fixed bug in hardware MP3 that caused crash in broken sword. The sample rate must be returned from our member variable, not from the header value which disappears. svn-id: r49680 --- backends/platform/psp/mp3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h index f8802f930c..029b3e498c 100644 --- a/backends/platform/psp/mp3.h +++ b/backends/platform/psp/mp3.h @@ -110,7 +110,7 @@ public: bool endOfData() const { return _state == MP3_STATE_EOS; } bool isStereo() const { return MAD_NCHANNELS(&_header) == 2; } - int getRate() const { return _header.samplerate; } + int getRate() const { return _sampleRate; } bool seek(const Timestamp &where); Timestamp getLength() const { return _length; } -- cgit v1.2.3 From ff66c67439ec501da5335e78e77b58943cea0972 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 15 Jun 2010 06:30:49 +0000 Subject: PSP: fixed SCI freeze issue by using recursive mutexes svn-id: r49682 --- backends/platform/psp/thread.cpp | 41 ++++++++++++++++++++++++++++++++++++++-- backends/platform/psp/thread.h | 14 ++++++++------ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index 684a985fed..d20df45215 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -95,14 +95,14 @@ bool PspSemaphore::pollForValue(int value) { } // false: timeout or error -bool PspSemaphore::takeWithTimeOut(int num, uint32 timeOut) { +bool PspSemaphore::takeWithTimeOut(uint32 timeOut) { DEBUG_ENTER_FUNC(); uint32 *pTimeOut = 0; if (timeOut) pTimeOut = &timeOut; - if (sceKernelWaitSema(_handle, num, pTimeOut) < 0) + if (sceKernelWaitSema(_handle, 1, pTimeOut) < 0) // we always wait for 1 return false; return true; } @@ -115,6 +115,43 @@ bool PspSemaphore::give(int num) { return true; } +// Class PspMutex ------------------------------------------------------------ + +bool PspMutex::lock() { + DEBUG_ENTER_FUNC(); + int threadId = sceKernelGetThreadId(); + bool ret = true; + + if (_ownerId == threadId) { + _recursiveCount++; + } else { + ret = _semaphore.take(); + _ownerId = threadId; + _recursiveCount = 0; + } + return ret; +} + +bool PspMutex::unlock() { + DEBUG_ENTER_FUNC(); + int threadId = sceKernelGetThreadId(); + bool ret = true; + + if (_ownerId != threadId) { + PSP_ERROR("attempt to unlock mutex by thread[%x] as opposed to owner[%x]\n", + threadId, _ownerId); + return false; + } + + if (_recursiveCount) { + _recursiveCount--; + } else { + _ownerId = 0; + ret = _semaphore.give(1); + } + return ret; +} + //#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ //#define __PSP_DEBUG_PRINT__ /* For debug printouts */ diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index 23db8594dc..33b3f6ce53 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -40,8 +40,8 @@ private: public: PspSemaphore(int initialValue, int maxValue); ~PspSemaphore(); - bool take(int num) { return takeWithTimeOut(num, 0); } - bool takeWithTimeOut(int num, uint32 timeOut); + bool take() { return takeWithTimeOut(0); } + bool takeWithTimeOut(uint32 timeOut); bool give(int num); bool pollForValue(int value); // check for a certain value int numOfWaitingThreads(); @@ -51,12 +51,14 @@ public: class PspMutex { private: PspSemaphore _semaphore; + int _recursiveCount; + int _ownerId; public: - PspMutex(bool initialValue) : _semaphore(initialValue ? 1 : 0, 255) {} // initial, max value - bool lock() { return _semaphore.take(1); } - bool unlock() { return _semaphore.give(1); } + PspMutex(bool initialValue) : _semaphore(initialValue ? 1 : 0, 255), _recursiveCount(0), _ownerId(0) {} // initial, max value + bool lock(); + bool unlock(); bool poll() { return _semaphore.pollForValue(1); } - int getNumWaitingThreads() { return _semaphore.numOfWaitingThreads(); } + int numOfWaitingThreads() { return _semaphore.numOfWaitingThreads(); } bool getValue() { return (bool)_semaphore.getValue(); } }; -- cgit v1.2.3 From e93f8902a89cb969fd344e49e7086213c8609dbf Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 07:20:53 +0000 Subject: Cleanup of the savegame code: - Added a saveLoadWithSerializer() method to the reg_t class - Moved SegManager::reconstructClones() inside savegame.cpp - Moved SoundCommandParser::syncPlayList() and SoundCommandParser::reconstructPlayList() inside savegame.cpp svn-id: r49683 --- engines/sci/engine/savegame.cpp | 103 +++++++++++++++++++++++++++++-------- engines/sci/engine/seg_manager.cpp | 33 ------------ engines/sci/engine/vm_types.h | 6 +++ engines/sci/sound/soundcmd.cpp | 34 ------------ 4 files changed, 87 insertions(+), 89 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index a7310d2b6a..34457a819f 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -36,6 +36,7 @@ #include "sci/engine/state.h" #include "sci/engine/message.h" #include "sci/engine/savegame.h" +#include "sci/engine/selector.h" #include "sci/engine/vm_types.h" #include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS #include "sci/graphics/gui.h" @@ -77,11 +78,6 @@ SongIterator *build_iterator(ResourceManager *resMan, int song_nr, SongIteratorT static void sync_songlib(Common::Serializer &s, SongLibrary &obj); #endif -static void sync_reg_t(Common::Serializer &s, reg_t &obj) { - s.syncAsUint16LE(obj.segment); - s.syncAsUint16LE(obj.offset); -} - #ifdef USE_OLD_MUSIC_FUNCTIONS static void syncSong(Common::Serializer &s, Song &obj) { s.syncAsSint32LE(obj._handle); @@ -132,7 +128,7 @@ void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { fadeTickerStep = 0; } else { // A bit more optimized saving - sync_reg_t(s, soundObj); + soundObj.saveLoadWithSerializer(s); s.syncAsSint16LE(resourceId); s.syncAsSint16LE(dataInc); s.syncAsSint16LE(ticker); @@ -217,7 +213,7 @@ void syncArray(Common::Serializer &s, Common::Array &arr) { template <> void syncWithSerializer(Common::Serializer &s, reg_t &obj) { - sync_reg_t(s, obj); + obj.saveLoadWithSerializer(s); } void SegManager::saveLoadWithSerializer(Common::Serializer &s) { @@ -297,7 +293,7 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { template <> void syncWithSerializer(Common::Serializer &s, Class &obj) { s.syncAsSint32LE(obj.script); - sync_reg_t(s, obj.reg); + obj.reg.saveLoadWithSerializer(s); } static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) { @@ -396,7 +392,7 @@ void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { void Object::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_flags); - sync_reg_t(s, _pos); + _pos.saveLoadWithSerializer(s); s.skip(4, VER(9), VER(12)); // OBSOLETE: Used to be variable_names_nr s.syncAsSint32LE(_methodCount); // that's actually a uint16 @@ -414,18 +410,18 @@ template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - sync_reg_t(s, obj.first); - sync_reg_t(s, obj.last); + obj.first.saveLoadWithSerializer(s); + obj.last.saveLoadWithSerializer(s); } template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - sync_reg_t(s, obj.pred); - sync_reg_t(s, obj.succ); - sync_reg_t(s, obj.key); - sync_reg_t(s, obj.value); + obj.pred.saveLoadWithSerializer(s); + obj.succ.saveLoadWithSerializer(s); + obj.key.saveLoadWithSerializer(s); + obj.value.saveLoadWithSerializer(s); } #ifdef ENABLE_SCI32 @@ -459,7 +455,7 @@ void syncWithSerializer(Common::Serializer &s, Table >::Entry &o if (s.isSaving()) value = obj.getValue(i); - sync_reg_t(s, value); + value.saveLoadWithSerializer(s); if (s.isLoading()) obj.setValue(i, value); @@ -692,6 +688,40 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { } #endif +void SoundCommandParser::syncPlayList(Common::Serializer &s) { +#ifndef USE_OLD_MUSIC_FUNCTIONS + _music->saveLoadWithSerializer(s); +#endif +} + +void SoundCommandParser::reconstructPlayList(int savegame_version) { +#ifndef USE_OLD_MUSIC_FUNCTIONS + Common::StackLock lock(_music->_mutex); + + const MusicList::iterator end = _music->getPlayListEnd(); + for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) { + if ((*i)->resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, (*i)->resourceId))) { + (*i)->soundRes = new SoundResource((*i)->resourceId, _resMan, _soundVersion); + _music->soundInitSnd(*i); + } else { + (*i)->soundRes = 0; + } + if ((*i)->status == kSoundPlaying) { + if (savegame_version < 14) { + (*i)->dataInc = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(dataInc)); + (*i)->signal = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(signal)); + + if (_soundVersion >= SCI_VERSION_1_LATE) + (*i)->volume = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(vol)); + } + + cmdPlaySound((*i)->soundObj, 0); + } + } + +#endif +} + #ifdef ENABLE_SCI32 void ArrayTable::saveLoadWithSerializer(Common::Serializer &ser) { if (ser.getVersion() < 18) @@ -735,7 +765,13 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename return 0; } -// TODO: Move thie function to a more appropriate place, such as vm.cpp or script.cpp +void SegManager::reconstructStack(EngineState *s) { + DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]); + s->stack_base = stack->_entries; + s->stack_top = s->stack_base + stack->_capacity; +} + +// TODO: Move this function to a more appropriate place, such as vm.cpp or script.cpp void SegManager::reconstructScripts(EngineState *s) { uint i; @@ -771,12 +807,35 @@ void SegManager::reconstructScripts(EngineState *s) { } } -void SegManager::reconstructStack(EngineState *s) { - SegmentId stack_seg = findSegmentByType(SEG_TYPE_STACK); - DataStack *stack = (DataStack *)(_heap[stack_seg]); +void SegManager::reconstructClones() { + for (uint i = 0; i < _heap.size(); i++) { + SegmentObj *mobj = _heap[i]; + if (mobj && mobj->getType() == SEG_TYPE_CLONES) { + CloneTable *ct = (CloneTable *)mobj; + + for (uint j = 0; j < ct->_table.size(); j++) { + // Check if the clone entry is used + uint entryNum = (uint)ct->first_free; + bool isUsed = true; + while (entryNum != ((uint) CloneTable::HEAPENTRY_INVALID)) { + if (entryNum == j) { + isUsed = false; + break; + } + entryNum = ct->_table[entryNum].next_free; + } - s->stack_base = stack->_entries; - s->stack_top = stack->_entries + stack->_capacity; + if (!isUsed) + continue; + + CloneTable::Entry &seeker = ct->_table[j]; + const Object *baseObj = getObject(seeker.getSpeciesSelector()); + seeker.cloneFromObject(baseObj); + if (!baseObj) + warning("Clone entry without a base class: %d", j); + } // end for + } // end if + } // end for } #ifdef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 8d51b27099..96670b5aeb 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -476,39 +476,6 @@ Clone *SegManager::allocateClone(reg_t *addr) { return &(table->_table[offset]); } -void SegManager::reconstructClones() { - for (uint i = 0; i < _heap.size(); i++) { - if (_heap[i]) { - SegmentObj *mobj = _heap[i]; - if (mobj->getType() == SEG_TYPE_CLONES) { - CloneTable *ct = (CloneTable *)mobj; - - for (uint j = 0; j < ct->_table.size(); j++) { - // Check if the clone entry is used - uint entryNum = (uint)ct->first_free; - bool isUsed = true; - while (entryNum != ((uint) CloneTable::HEAPENTRY_INVALID)) { - if (entryNum == j) { - isUsed = false; - break; - } - entryNum = ct->_table[entryNum].next_free; - } - - if (!isUsed) - continue; - - CloneTable::Entry &seeker = ct->_table[j]; - const Object *baseObj = getObject(seeker.getSpeciesSelector()); - seeker.cloneFromObject(baseObj); - if (!baseObj) - warning("Clone entry without a base class: %d", j); - } // end for - } // end if - } // end if - } // end for -} - List *SegManager::allocateList(reg_t *addr) { ListTable *table; int offset; diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index 29dc798c35..614b6f247d 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -27,6 +27,7 @@ #define SCI_ENGINE_VM_TYPES_H #include "common/scummsys.h" +#include "common/serializer.h" namespace Sci { @@ -56,6 +57,11 @@ struct reg_t { int16 toSint16() const { return (int16) offset; } + + void saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsUint16LE(segment); + s.syncAsUint16LE(offset); + } }; static inline reg_t make_reg(SegmentId segment, uint16 offset) { diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 71fc2b7ef0..e317796aad 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -1088,40 +1088,6 @@ void SoundCommandParser::clearPlayList() { #endif } -void SoundCommandParser::syncPlayList(Common::Serializer &s) { -#ifndef USE_OLD_MUSIC_FUNCTIONS - _music->saveLoadWithSerializer(s); -#endif -} - -void SoundCommandParser::reconstructPlayList(int savegame_version) { -#ifndef USE_OLD_MUSIC_FUNCTIONS - Common::StackLock lock(_music->_mutex); - - const MusicList::iterator end = _music->getPlayListEnd(); - for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) { - if ((*i)->resourceId && _resMan->testResource(ResourceId(kResourceTypeSound, (*i)->resourceId))) { - (*i)->soundRes = new SoundResource((*i)->resourceId, _resMan, _soundVersion); - _music->soundInitSnd(*i); - } else { - (*i)->soundRes = 0; - } - if ((*i)->status == kSoundPlaying) { - if (savegame_version < 14) { - (*i)->dataInc = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(dataInc)); - (*i)->signal = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(signal)); - - if (_soundVersion >= SCI_VERSION_1_LATE) - (*i)->volume = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(vol)); - } - - cmdPlaySound((*i)->soundObj, 0); - } - } - -#endif -} - void SoundCommandParser::printPlayList(Console *con) { #ifndef USE_OLD_MUSIC_FUNCTIONS _music->printPlayList(con); -- cgit v1.2.3 From 60d8cc5180c4033978e1bb38e6cc26dab8a126b2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 07:21:52 +0000 Subject: Removed the now unused EngineState parameter of script_adjust_opcode_formats(), as well as an obsolete TODO svn-id: r49684 --- engines/sci/engine/script.cpp | 3 +-- engines/sci/engine/script.h | 2 +- engines/sci/sci.cpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index cb112a90f9..19e0b6f81a 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -95,8 +95,7 @@ opcode_format g_opcode_formats[128][4] = { // TODO: script_adjust_opcode_formats should probably be part of the // constructor (?) of a VirtualMachine or a ScriptManager class. -void script_adjust_opcode_formats(EngineState *s) { - // TODO: Check that this is correct +void script_adjust_opcode_formats() { if (g_sci->_features->detectLofsType() != SCI_VERSION_0_EARLY) { g_opcode_formats[op_lofsa][0] = Script_Offset; g_opcode_formats[op_lofss][0] = Script_Offset; diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index e94e9f64e6..fe92dabe58 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -202,7 +202,7 @@ enum sci_opcodes { extern opcode_format g_opcode_formats[128][4]; -void script_adjust_opcode_formats(EngineState *s); +void script_adjust_opcode_formats(); } // End of namespace Sci diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index ee2f5845a2..e8847f380b 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -229,7 +229,7 @@ Common::Error SciEngine::run() { _kernel->loadKernelNames(_features); // Must be called after game_init() - script_adjust_opcode_formats(_gamestate); + script_adjust_opcode_formats(); SciVersion soundVersion = _features->detectDoSoundType(); -- cgit v1.2.3 From 0dab9e0e1f39b856a0b996dfa2c3103fe0dbfe2f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 07:25:09 +0000 Subject: Reorganized functions a bit svn-id: r49685 --- engines/sci/engine/savegame.cpp | 55 +++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 34457a819f..89bfa5302d 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -738,33 +738,6 @@ void StringTable::saveLoadWithSerializer(Common::Serializer &ser) { } #endif -#pragma mark - - - -int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename, const char *version) { - TimeDate curTime; - g_system->getTimeAndDate(curTime); - - SavegameMetadata meta; - meta.savegame_version = CURRENT_SAVEGAME_VERSION; - meta.savegame_name = savename; - meta.game_version = version; - meta.savegame_date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); - meta.savegame_time = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); - - if (s->executionStackBase) { - warning("Cannot save from below kernel function"); - return 1; - } - - Common::Serializer ser(0, fh); - sync_SavegameMetadata(ser, meta); - Graphics::saveThumbnail(*fh); - s->saveLoadWithSerializer(ser); // FIXME: Error handling? - - return 0; -} - void SegManager::reconstructStack(EngineState *s) { DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]); s->stack_base = stack->_entries; @@ -874,6 +847,34 @@ static void reconstruct_sounds(EngineState *s) { } #endif + +#pragma mark - + + +int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename, const char *version) { + TimeDate curTime; + g_system->getTimeAndDate(curTime); + + SavegameMetadata meta; + meta.savegame_version = CURRENT_SAVEGAME_VERSION; + meta.savegame_name = savename; + meta.game_version = version; + meta.savegame_date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); + meta.savegame_time = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); + + if (s->executionStackBase) { + warning("Cannot save from below kernel function"); + return 1; + } + + Common::Serializer ser(0, fh); + sync_SavegameMetadata(ser, meta); + Graphics::saveThumbnail(*fh); + s->saveLoadWithSerializer(ser); // FIXME: Error handling? + + return 0; +} + void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { #ifdef USE_OLD_MUSIC_FUNCTIONS SongLibrary temp; -- cgit v1.2.3 From 9a1db3f77092f13829604701b419ffc38577388b Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Tue, 15 Jun 2010 08:21:39 +0000 Subject: Add support for SCI32 segment types to seg_table and vr debug commands svn-id: r49686 --- engines/sci/console.cpp | 58 ++++++++++++++++++++++++++++++++---------- engines/sci/engine/segment.cpp | 2 +- engines/sci/engine/segment.h | 1 + 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 6c022bb631..a3e33b13c8 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1095,6 +1095,14 @@ bool Console::cmdSaveGame(int argc, const char **argv) { delete out; } + out->finalize(); + if (out->err()) { + delete out; + warning("Writing the savegame failed."); + } else { + delete out; + } + return true; } @@ -1420,6 +1428,16 @@ bool Console::cmdPrintSegmentTable(int argc, const char **argv) { DebugPrintf("F string fragments"); break; +#ifdef ENABLE_SCI32 + case SEG_TYPE_ARRAY: + DebugPrintf("A SCI32 arrays (%d)", (*(ArrayTable *)mobj).entries_used); + break; + + case SEG_TYPE_STRING: + DebugPrintf("T SCI32 strings (%d)", (*(StringTable *)mobj).entries_used); + break; +#endif + default: DebugPrintf("I Invalid (type = %x)", mobj->getType()); break; @@ -2180,26 +2198,40 @@ bool Console::cmdViewReference(int argc, const char **argv) { printObject(reg); break; case KSIG_REF: { - int size; - const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg); - size = block.maxSize; + switch (_engine->_gamestate->_segMan->getSegmentType(reg.segment)) { + case SEG_TYPE_STRING: { + const SciString *str = _engine->_gamestate->_segMan->lookupString(reg); + Common::hexdump((const byte *) str->getRawData(), str->getSize(), 16, 0); + break; + } + case SEG_TYPE_ARRAY: { + const SciArray *array = _engine->_gamestate->_segMan->lookupArray(reg); + Common::hexdump((const byte *) array->getRawData(), array->getSize(), 16, 0); + break; + } + default: { + int size; + const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg); + size = block.maxSize; - DebugPrintf("raw data\n"); + DebugPrintf("raw data\n"); - if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { - DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); - reg_end = NULL_REG; - } + if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { + DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); + reg_end = NULL_REG; + } - if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) - size = reg_end.offset - reg.offset; + if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) + size = reg_end.offset - reg.offset; - if (reg_end.segment != 0) - DebugPrintf("Block size less than or equal to %d\n", size); + if (reg_end.segment != 0) + DebugPrintf("Block size less than or equal to %d\n", size); - Common::hexdump(block.raw, size, 16, 0); + Common::hexdump(block.raw, size, 16, 0); + } } break; + } case KSIG_ARITHMETIC: DebugPrintf("arithmetic value\n %d (%04x)\n", (int16) reg.offset, reg.offset); break; diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 879cbc22ee..a6154e7512 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -435,7 +435,7 @@ bool Script::isValidOffset(uint16 offset) const { SegmentRef Script::dereference(reg_t pointer) { if (pointer.offset > _bufSize) { - warning("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", + error("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", PRINT_REG(pointer), (uint)_bufSize); return SegmentRef(); } diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 02d4809b70..61f1c7b3c9 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -802,6 +802,7 @@ public: byte getType() const { return _type; } uint32 getSize() const { return _size; } T *getRawData() { return _data; } + const T *getRawData()const { return _data; } protected: int8 _type; -- cgit v1.2.3 From 0ad3bedf9880b51e40459df4e33547bf234eeb4f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 08:25:51 +0000 Subject: Added a signature of the game itself inside saved games (the size of script 0, as well as the offset of the game object, which are unique for each game), to prevent users from loading saved games across different versions of the same game. In the cases where we can't load a saved game, throw a nice GUI dialog instead of a console warning svn-id: r49687 --- engines/sci/engine/savegame.cpp | 35 +++++++++++++++++++++++++++++++++-- engines/sci/engine/savegame.h | 4 +++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 89bfa5302d..155c5fad86 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -53,6 +53,8 @@ #include "sci/graphics/gui32.h" #endif +#include "gui/message.h" + namespace Sci { @@ -307,6 +309,13 @@ static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) s.skip(4, VER(9), VER(9)); // obsolete: used to be game version s.syncAsSint32LE(obj.savegame_date); s.syncAsSint32LE(obj.savegame_time); + if (s.getVersion() < 22) { + obj.game_object_offset = 0; + obj.script0_size = 0; + } else { + s.syncAsUint16LE(obj.game_object_offset); + s.syncAsUint16LE(obj.script0_size); + } } void EngineState::saveLoadWithSerializer(Common::Serializer &s) { @@ -862,6 +871,10 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename meta.savegame_date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); meta.savegame_time = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); + Resource *script0 = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 0), false); + meta.script0_size = script0->size; + meta.game_object_offset = g_sci->getGameObject().offset; + if (s->executionStackBase) { warning("Cannot save from below kernel function"); return 1; @@ -892,15 +905,33 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { if ((meta.savegame_version < MINIMUM_SAVEGAME_VERSION) || (meta.savegame_version > CURRENT_SAVEGAME_VERSION)) { + /* if (meta.savegame_version < MINIMUM_SAVEGAME_VERSION) - warning("Old savegame version detected- can't load"); + warning("Old savegame version detected, unable to load it"); else - warning("Savegame version is %d- maximum supported is %0d", meta.savegame_version, CURRENT_SAVEGAME_VERSION); + warning("Savegame version is %d, maximum supported is %0d", meta.savegame_version, CURRENT_SAVEGAME_VERSION); + */ + + GUI::MessageDialog dialog("The format of this saved game is obsolete, unable to load it", "OK"); + dialog.runModal(); s->r_acc = make_reg(0, 1); // signal failure return; } + if (meta.game_object_offset > 0 && meta.script0_size > 0) { + Resource *script0 = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 0), false); + if (script0->size != meta.script0_size || g_sci->getGameObject().offset != meta.game_object_offset) { + //warning("This saved game was created with a different version of the game, unable to load it"); + + GUI::MessageDialog dialog("This saved game was created with a different version of the game, unable to load it", "OK"); + dialog.runModal(); + + s->r_acc = make_reg(0, 1); // signal failure + return; + } + } + if (meta.savegame_version >= 12) { // We don't need the thumbnail here, so just read it and discard it Graphics::Surface *thumbnail = new Graphics::Surface(); diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index e7e8fff999..c8c7738fdf 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -36,7 +36,7 @@ namespace Sci { struct EngineState; enum { - CURRENT_SAVEGAME_VERSION = 21, + CURRENT_SAVEGAME_VERSION = 22, MINIMUM_SAVEGAME_VERSION = 9 }; @@ -47,6 +47,8 @@ struct SavegameMetadata { Common::String game_version; int savegame_date; int savegame_time; + uint16 game_object_offset; + uint16 script0_size; }; -- cgit v1.2.3 From ba3c43498b12b4c5855030bea7ab9e613c55d4ac Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 08:39:03 +0000 Subject: - Swapped the return value of gamestate_save (false = failed, true = succeeded) - Removed some duplicate code inside Console::cmdSaveGame() svn-id: r49688 --- engines/sci/console.cpp | 10 +--------- engines/sci/detection.cpp | 2 +- engines/sci/engine/kfile.cpp | 2 +- engines/sci/engine/savegame.cpp | 6 +++--- engines/sci/engine/savegame.h | 2 +- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index a3e33b13c8..0c017af281 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1085,7 +1085,7 @@ bool Console::cmdSaveGame(int argc, const char **argv) { } // TODO: enable custom descriptions? force filename into a specific format? - if (gamestate_save(_engine->_gamestate, out, "debugging", version)) { + if (!gamestate_save(_engine->_gamestate, out, "debugging", version)) { DebugPrintf("Saving the game state to '%s' failed\n", argv[1]); } else { out->finalize(); @@ -1095,14 +1095,6 @@ bool Console::cmdSaveGame(int argc, const char **argv) { delete out; } - out->finalize(); - if (out->err()) { - delete out; - warning("Writing the savegame failed."); - } else { - delete out; - } - return true; } diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 7f0a27c14f..b402f7cc0b 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -659,7 +659,7 @@ Common::Error SciEngine::saveGameState(int slot, const char *desc) { return Common::kWritingFailed; } - if (gamestate_save(_gamestate, out, desc, version)) { + if (!gamestate_save(_gamestate, out, desc, version)) { warning("Saving the game state to '%s' failed", fileName.c_str()); return Common::kWritingFailed; } else { diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 3e0ecd1a28..ad188f503a 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -543,7 +543,7 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - if (gamestate_save(s, out, game_description.c_str(), version.c_str())) { + if (!gamestate_save(s, out, game_description.c_str(), version.c_str())) { warning("Saving the game failed."); s->r_acc = NULL_REG; } else { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 155c5fad86..d2bd955793 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -860,7 +860,7 @@ static void reconstruct_sounds(EngineState *s) { #pragma mark - -int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename, const char *version) { +bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename, const char *version) { TimeDate curTime; g_system->getTimeAndDate(curTime); @@ -877,7 +877,7 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename if (s->executionStackBase) { warning("Cannot save from below kernel function"); - return 1; + return false; } Common::Serializer ser(0, fh); @@ -885,7 +885,7 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename Graphics::saveThumbnail(*fh); s->saveLoadWithSerializer(ser); // FIXME: Error handling? - return 0; + return true; } void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index c8c7738fdf..aa22d42135 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -59,7 +59,7 @@ struct SavegameMetadata { * @param savename The description of the savegame * @return 0 on success, 1 otherwise */ -int gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version); +bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version); /** * Restores a game state from a directory. -- cgit v1.2.3 From e64eb71ce86663c479bbbb94072fee94a015eecb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 09:11:26 +0000 Subject: Properly reconstruct the running stack when restoring (a regression from commits #49376 and #49525), some formatting svn-id: r49689 --- engines/sci/engine/savegame.cpp | 1 + engines/sci/engine/segment.h | 2 +- engines/sci/engine/state.cpp | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index d2bd955793..02fdde5622 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -994,6 +994,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { #endif s->abortScriptProcessing = kAbortLoadGame; + s->shrinkStackToBase(); } bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata *meta) { diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 61f1c7b3c9..253d94cc53 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -802,7 +802,7 @@ public: byte getType() const { return _type; } uint32 getSize() const { return _size; } T *getRawData() { return _data; } - const T *getRawData()const { return _data; } + const T *getRawData() const { return _data; } protected: int8 _type; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 41f263bb62..1c8113e5e4 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -90,13 +90,13 @@ void EngineState::reset(bool isRestoring) { _fileHandles.resize(5); - stack_base = 0; - stack_top = 0; abortScriptProcessing = kAbortNone; } executionStackBase = 0; _executionStackPosChanged = false; + stack_base = 0; + stack_top = 0; restAdjust = 0; -- cgit v1.2.3 From 13aba8747a8293388640211233375cc4e7ecaf95 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 10:09:42 +0000 Subject: Throttle screen updates to 60fps in some screen transition effects as well svn-id: r49690 --- engines/sci/event.cpp | 4 +--- engines/sci/graphics/paint16.cpp | 14 ++++++++++++-- engines/sci/graphics/transitions.cpp | 16 ++++++++++++---- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index ed9c4bfd0d..7a55555a70 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -321,9 +321,7 @@ sciEvent EventManager::get(unsigned int mask) { // Update the screen here, since it's called very often. // Throttle the screen update rate to 60fps. - uint32 curTime = g_system->getMillis(); - uint32 duration = curTime - g_sci->getEngineState()->_screenUpdateTime; - if (duration >= 1000 / 60) { + if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { g_system->updateScreen(); g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index ff4f3bec52..6a13f792cb 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -561,11 +561,21 @@ void GfxPaint16::kernelShakeScreen(uint16 shakeCount, uint16 directions) { if (directions & SCI_SHAKE_DIRECTION_VERTICAL) _screen->setVerticalShakePos(10); // TODO: horizontal shakes - g_system->updateScreen(); + + if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { + g_system->updateScreen(); + g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); + } + _gui->wait(3); if (directions & SCI_SHAKE_DIRECTION_VERTICAL) _screen->setVerticalShakePos(0); - g_system->updateScreen(); + + if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { + g_system->updateScreen(); + g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); + } + _gui->wait(3); } } diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 1976326aa9..f73525caaf 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -440,8 +440,12 @@ void GfxTransitions::scroll(int16 number) { } stepNr++; } - if ((stepNr & 1) == 0) - g_system->updateScreen(); + if ((stepNr & 1) == 0) { + if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { + g_system->updateScreen(); + g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); + } + } break; case SCI_TRANSITIONS_SCROLL_RIGHT: @@ -461,8 +465,12 @@ void GfxTransitions::scroll(int16 number) { } stepNr++; } - if ((stepNr & 1) == 0) - g_system->updateScreen(); + if ((stepNr & 1) == 0) { + if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { + g_system->updateScreen(); + g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); + } + } break; case SCI_TRANSITIONS_SCROLL_UP: -- cgit v1.2.3 From 28f6f7a3f0225406162b3dbf009ace4500f6e87c Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:14:04 +0000 Subject: Split out detection tables for Cine engine svn-id: r49691 --- engines/cine/detection.cpp | 491 +------------------------------------- engines/cine/detection_tables.h | 513 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 514 insertions(+), 490 deletions(-) create mode 100644 engines/cine/detection_tables.h diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index 1cf9ed5fad..bcc4951140 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -23,8 +23,6 @@ * */ - - #include "base/plugins.h" #include "engines/advancedDetector.h" @@ -62,494 +60,7 @@ static const ADObsoleteGameID obsoleteGameIDsTable[] = { {0, 0, Common::kPlatformUnknown} }; -namespace Cine { - -using Common::GUIO_NONE; - -static const CINEGameDescription gameDescriptions[] = { - { - { - "fw", - "", - AD_ENTRY1("part01", "61d003202d301c29dd399acfb1354310"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - // This is a CD version of Future Wars published by Sony. - // This version has a crypted AUTO00.PRC. - { - { - "fw", - "Sony CD version", - { - { "AUTO00.PRC", 0, "4fe1e7930b38e3c63f0f2474d471bf8f", -1}, - { "PART01", 0, "61d003202d301c29dd399acfb1354310", -1}, - { NULL, 0, NULL, 0} - }, - Common::EN_USA, - Common::kPlatformPC, - ADGF_CD, - GUIO_NONE - }, - GType_FW, - GF_CD | GF_CRYPTED_BOOT_PRC, - }, - - { - // This is the version included in the UK "Classic Collection" - { - "fw", - "", - AD_ENTRY1("part01", "91d7271155520eae6915a9dd2dac120c"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "f5e98fcca3fb5e7afa284c81c39d8b14"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - GF_ALT_FONT, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "570109f965c7f53984b98c83d86eb206"), - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - GF_ALT_FONT, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "5d1acb97abe9591f9008e00d07add95a"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "57afd280b598b4180fda6689fbedc4b8"), - Common::EN_ANY, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { // Amiga "Interplay" labeled version - { - "fw", - "", - AD_ENTRY1("part01", "a17a5eb15200c63276d486a88263ccd0"), - Common::EN_USA, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "3a87a913e0e33963a48a7f822ca0eb0e"), - Common::DE_DEU, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - GF_ALT_FONT, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "5ad0007ccd5f7b3dd6b15ea7f281f9e1"), - Common::ES_ESP, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "460f2da8793bc581a2d4b6fc19ccb5ae"), - Common::FR_FRA, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "1c8e5207743172134409ac58860021af"), - Common::IT_ITA, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "Demo", - { - { "demo", 0, "0f50767cd964e302d3af0ba2528df8c4", -1}, - { "demo.prc", 0, "d2ac3a743d288359c63644ea7071edae", -1}, - { NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformAmiga, - ADGF_DEMO, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "36050db13af57e462ca1adc4df99de4e"), - Common::EN_ANY, - Common::kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "fw", - "", - AD_ENTRY1("part01", "ef245573b7dab0d4825ceb98e37cef4d"), - Common::FR_FRA, - Common::kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_FW, - 0, - }, - - { - { - "os", - "256 colors", - AD_ENTRY1("procs00", "d6752e7d25924cb866b61eb7cb0c8b56"), - Common::EN_GRB, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - // This is a 16 color PC version (It came on three 720kB 3.5" disks). - // The protagonist is named John Glames in this version. - { - "os", - "", - AD_ENTRY1("procs1", "9629129b86979fa592c1787385bf3695"), - Common::EN_GRB, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs1", "d8c3a9d05a63e4cfa801826a7063a126"), - Common::EN_USA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "256 colors", - AD_ENTRY1("procs00", "862a75d76fb7fffec30e52be9ad1c474"), - Common::EN_USA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - GF_CD, - }, - - { - { - "os", - "", - AD_ENTRY1("procs1", "39b91ae35d1297ce0a76a1a803ca1593"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs1", "74c2dabd9d212525fca8875a5f6d8994"), - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "256 colors", - { - { "procs1", 0, "74c2dabd9d212525fca8875a5f6d8994", -1}, - { "sds1", 0, "75443ba39cdc95667e07d7118e5c151c", -1}, - { NULL, 0, NULL, 0} - }, - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - GF_CD, - }, - - { - { - "os", - "256 colors", - AD_ENTRY1("procs00", "f143567f08cfd1a9b1c9a41c89eadfef"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs1", "da066e6b8dd93f2502c2a3755f08dc12"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "a9da5531ead0ebf9ad387fa588c0cbb0"), - Common::EN_GRB, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "alt", - AD_ENTRY1("procs0", "8a429ced2f4acff8a15ae125174042e8"), - Common::EN_GRB, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "d5f27e33fc29c879f36f15b86ccfa58c"), - Common::EN_USA, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "8b7dce249821d3a62b314399c4334347"), - Common::DE_DEU, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "35fc295ddd0af9da932d256ba799a4b0"), - Common::ES_ESP, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "d4ea4a97e01fa67ea066f9e785050ed2"), - Common::FR_FRA, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "Demo", - AD_ENTRY1("demo", "8d3a750d1c840b1b1071e42f9e6f6aa2"), - Common::EN_GRB, - Common::kPlatformAmiga, - ADGF_DEMO, - GUIO_NONE - }, - GType_OS, - GF_DEMO, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "1501d5ae364b2814a33ed19347c3fcae"), - Common::EN_GRB, - Common::kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { - { - "os", - "", - AD_ENTRY1("procs0", "2148d25de3219dd4a36580ca735d0afa"), - Common::FR_FRA, - Common::kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GType_OS, - 0, - }, - - { AD_TABLE_END_MARKER, 0, 0 } -}; - -} // End of namespace Cine +#include "cine/detection_tables.h" static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure diff --git a/engines/cine/detection_tables.h b/engines/cine/detection_tables.h new file mode 100644 index 0000000000..6e450ebc80 --- /dev/null +++ b/engines/cine/detection_tables.h @@ -0,0 +1,513 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Cine { + +using Common::GUIO_NONE; + +static const CINEGameDescription gameDescriptions[] = { + { + { + "fw", + "", + AD_ENTRY1("part01", "61d003202d301c29dd399acfb1354310"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + // This is a CD version of Future Wars published by Sony. + // This version has a crypted AUTO00.PRC. + { + { + "fw", + "Sony CD version", + { + { "AUTO00.PRC", 0, "4fe1e7930b38e3c63f0f2474d471bf8f", -1}, + { "PART01", 0, "61d003202d301c29dd399acfb1354310", -1}, + { NULL, 0, NULL, 0} + }, + Common::EN_USA, + Common::kPlatformPC, + ADGF_CD, + GUIO_NONE + }, + GType_FW, + GF_CD | GF_CRYPTED_BOOT_PRC, + }, + + { + // This is the version included in the UK "Classic Collection" + { + "fw", + "", + AD_ENTRY1("part01", "91d7271155520eae6915a9dd2dac120c"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "f5e98fcca3fb5e7afa284c81c39d8b14"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + GF_ALT_FONT, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "570109f965c7f53984b98c83d86eb206"), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + GF_ALT_FONT, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "5d1acb97abe9591f9008e00d07add95a"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "57afd280b598b4180fda6689fbedc4b8"), + Common::EN_ANY, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { // Amiga "Interplay" labeled version + { + "fw", + "", + AD_ENTRY1("part01", "a17a5eb15200c63276d486a88263ccd0"), + Common::EN_USA, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "3a87a913e0e33963a48a7f822ca0eb0e"), + Common::DE_DEU, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + GF_ALT_FONT, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "5ad0007ccd5f7b3dd6b15ea7f281f9e1"), + Common::ES_ESP, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "460f2da8793bc581a2d4b6fc19ccb5ae"), + Common::FR_FRA, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "1c8e5207743172134409ac58860021af"), + Common::IT_ITA, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "Demo", + { + { "demo", 0, "0f50767cd964e302d3af0ba2528df8c4", -1}, + { "demo.prc", 0, "d2ac3a743d288359c63644ea7071edae", -1}, + { NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformAmiga, + ADGF_DEMO, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "36050db13af57e462ca1adc4df99de4e"), + Common::EN_ANY, + Common::kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "fw", + "", + AD_ENTRY1("part01", "ef245573b7dab0d4825ceb98e37cef4d"), + Common::FR_FRA, + Common::kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_FW, + 0, + }, + + { + { + "os", + "256 colors", + AD_ENTRY1("procs00", "d6752e7d25924cb866b61eb7cb0c8b56"), + Common::EN_GRB, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + // This is a 16 color PC version (It came on three 720kB 3.5" disks). + // The protagonist is named John Glames in this version. + { + "os", + "", + AD_ENTRY1("procs1", "9629129b86979fa592c1787385bf3695"), + Common::EN_GRB, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs1", "d8c3a9d05a63e4cfa801826a7063a126"), + Common::EN_USA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "256 colors", + AD_ENTRY1("procs00", "862a75d76fb7fffec30e52be9ad1c474"), + Common::EN_USA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + GF_CD, + }, + + { + { + "os", + "", + AD_ENTRY1("procs1", "39b91ae35d1297ce0a76a1a803ca1593"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs1", "74c2dabd9d212525fca8875a5f6d8994"), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "256 colors", + { + { "procs1", 0, "74c2dabd9d212525fca8875a5f6d8994", -1}, + { "sds1", 0, "75443ba39cdc95667e07d7118e5c151c", -1}, + { NULL, 0, NULL, 0} + }, + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + GF_CD, + }, + + { + { + "os", + "256 colors", + AD_ENTRY1("procs00", "f143567f08cfd1a9b1c9a41c89eadfef"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs1", "da066e6b8dd93f2502c2a3755f08dc12"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "a9da5531ead0ebf9ad387fa588c0cbb0"), + Common::EN_GRB, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "alt", + AD_ENTRY1("procs0", "8a429ced2f4acff8a15ae125174042e8"), + Common::EN_GRB, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "d5f27e33fc29c879f36f15b86ccfa58c"), + Common::EN_USA, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "8b7dce249821d3a62b314399c4334347"), + Common::DE_DEU, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "35fc295ddd0af9da932d256ba799a4b0"), + Common::ES_ESP, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "d4ea4a97e01fa67ea066f9e785050ed2"), + Common::FR_FRA, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "Demo", + AD_ENTRY1("demo", "8d3a750d1c840b1b1071e42f9e6f6aa2"), + Common::EN_GRB, + Common::kPlatformAmiga, + ADGF_DEMO, + GUIO_NONE + }, + GType_OS, + GF_DEMO, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "1501d5ae364b2814a33ed19347c3fcae"), + Common::EN_GRB, + Common::kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { + { + "os", + "", + AD_ENTRY1("procs0", "2148d25de3219dd4a36580ca735d0afa"), + Common::FR_FRA, + Common::kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GType_OS, + 0, + }, + + { AD_TABLE_END_MARKER, 0, 0 } +}; + +} // End of namespace Cine -- cgit v1.2.3 From 977b1561d4a13b980ab293316133c9e029b348b8 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:14:38 +0000 Subject: Split out detection tables for Gob engine svn-id: r49692 --- engines/gob/detection.cpp | 4989 +-------------------------------------- engines/gob/detection_tables.h | 5013 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5014 insertions(+), 4988 deletions(-) create mode 100644 engines/gob/detection_tables.h diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp index feb76fe091..3d83f12e39 100644 --- a/engines/gob/detection.cpp +++ b/engines/gob/detection.cpp @@ -87,4994 +87,7 @@ static const ADObsoleteGameID obsoleteGameIDsTable[] = { {0, 0, kPlatformUnknown} }; -namespace Gob { - -using Common::GUIO_NOSPEECH; -using Common::GUIO_NOSUBTITLES; -using Common::GUIO_NONE; - -static const GOBGameDescription gameDescriptions[] = { - { // Supplied by Florian Zeitz on scummvm-devel - { - "gob1", - "EGA", - AD_ENTRY1("intro.stk", "c65e9cc8ba23a38456242e1f2b1caad4"), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesEGA, - 0, 0, 0 - }, - { - { - "gob1", - "EGA", - AD_ENTRY1("intro.stk", "f9233283a0be2464248d83e14b95f09c"), - RU_RUS, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesEGA, - 0, 0, 0 - }, - { // Supplied by Theruler76 in bug report #1201233 - { - "gob1", - "VGA", - AD_ENTRY1("intro.stk", "26a9118c0770fa5ac93a9626761600b2"), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by raziel_ in bug report #1891864 - { - "gob1", - "VGA", - AD_ENTRY1s("intro.stk", "e157cb59c6d330ca70d12ab0ef1dd12b", 288972), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by raina in the forums - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "6d837c6380d8f4d984c9f6cc0026df4f", 192712), - EN_ANY, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob1", - "", - AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), - EN_ANY, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob1", - "", - AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), - DE_DEU, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob1", - "", - AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), - FR_FRA, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob1", - "", - AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), - IT_ITA, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob1", - "", - AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), - ES_ESP, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "gob1", - "", - { - {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "gob1", - "", - { - {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "gob1", - "", - { - {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "gob1", - "", - { - {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "gob1", - "", - { - {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob1", - "", - { - {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob1", - "", - { - {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob1", - "", - { - {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob1", - "", - { - {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob1", - "", - { - {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, - {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, 0, 0 - }, - { // CD 1.000 version. - { - "gob1cd", - "v1.000", - AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.000 version. - { - "gob1cd", - "v1.000", - AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.000 version. - { - "gob1cd", - "v1.000", - AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.000 version. - { - "gob1cd", - "v1.000", - AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.000 version. - { - "gob1cd", - "v1.000", - AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.02 version. Multilingual - { - "gob1cd", - "v1.02", - AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.02 version. Multilingual - { - "gob1cd", - "v1.02", - AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.02 version. Multilingual - { - "gob1cd", - "v1.02", - AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.02 version. Multilingual - { - "gob1cd", - "v1.02", - AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // CD 1.02 version. Multilingual - { - "gob1cd", - "v1.02", - AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob1cd", - "v1.02", - AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), - HU_HUN, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob1cd", - "v1.02", - AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob1cd", - "v1.02", - AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob1cd", - "v1.02", - AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob1", - "Demo", - AD_ENTRY1("intro.stk", "972f22c6ff8144a6636423f0354ca549"), - UNK_LANG, - kPlatformAmiga, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "gob1", - "Interactive Demo", - AD_ENTRY1("intro.stk", "e72bd1e3828c7dec4c8a3e58c48bdfdb"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "gob1", - "Interactive Demo", - AD_ENTRY1s("intro.stk", "a796096280d5efd48cf8e7dfbe426eb5", 193595), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2785958 - { - "gob1", - "Interactive Demo", - AD_ENTRY1s("intro.stk", "35a098571af9a03c04e2303aec7c9249", 116582), - FR_FRA, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "gob1", - "", - AD_ENTRY1s("intro.stk", "0e022d3f2481b39e9175d37b2c6ad4c6", 2390121), - FR_FRA, - kPlatformCDi, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesAdLib, - 0, "AVT003.TOT", 0 - }, - { // Supplied by fac76 in bug report #1883808 - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "eebf2810122cfd17399260cd1468e994", 554014), - EN_ANY, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1("intro.stk", "d28b9e9b41f31acfa58dcd12406c7b2c"), - DE_DEU, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2602057 - { - "gob2", - "", - AD_ENTRY1("intro.stk", "686c88f7302a80b744aae9f8413e853d"), - IT_ITA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by bgk in bug report #1706861 - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "4b13c02d1069b86bcfec80f4e474b98b", 554680), - FR_FRA, - kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by fac76 in bug report #1673397 - { - "gob2", - "", - { - {"intro.stk", 0, "b45b984ee8017efd6ea965b9becd4d66", 828443}, - {"musmac1.mid", 0, "7f96f491448c7a001b32df89cf8d2af2", 1658}, - {0, 0, 0, 0} - }, - UNK_LANG, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by koalet in bug report #2478585 - { - "gob2", - "", - { - {"intro.stk", 0, "a13ecb4f6d8fd881ebbcc02e45cb5475", 837275}, - {"musmac1.mid", 0, "7f96f491448c7a001b32df89cf8d2af2", 1658}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1("intro.stk", "b45b984ee8017efd6ea965b9becd4d66"), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1("intro.stk", "dedb5d31d8c8050a8cf77abedcc53dae"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by raziel_ in bug report #1891867 - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "25a99827cd59751a80bed9620fb677a0", 893302), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "a13ecb4f6d8fd881ebbcc02e45cb5475", 837275), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by blackwhiteeagle in bug report #1605235 - { - "gob2", - "", - AD_ENTRY1("intro.stk", "3e4e7db0d201587dd2df4003b2993ef6"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1("intro.stk", "a13892cdf4badda85a6f6fb47603a128"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2602017 - { - "gob2", - "", - AD_ENTRY1("intro.stk", "c47faf1d406504e6ffe63243610bb1f4"), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - AD_ENTRY1("intro.stk", "cd3e1df8b273636ee32e34b7064f50e8"), - RU_RUS, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by arcepi in bug report #1659884 - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "5f53c56e3aa2f1e76c2e4f0caa15887f", 829232), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "285d7340f98ebad65d465585da12910b", 837286}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - EN_USA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "6efac0a14c0de4d57dde8592456c8acf", 845172}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - EN_USA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "", - { - {"intro.stk", 0, "6efac0a14c0de4d57dde8592456c8acf", 845172}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "24489330a1d67ff978211f574822a5a6", 883756), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob2", - "", - AD_ENTRY1s("intro.stk", "285d7340f98ebad65d465585da12910b", 837286), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2cd", - "v1.000", - AD_ENTRY1("intro.stk", "9de5fbb41cf97182109e5fecc9d90347"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2cd", - "v2.01", - AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2cd", - "v2.01", - AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2cd", - "v2.01", - AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2cd", - "v2.01", - AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2cd", - "v2.01", - AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob2cd", - "v1.02", - AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), - HU_HUN, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob2cd", - "v1.02", - AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob2cd", - "v1.02", - AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob2cd", - "v1.02", - AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob2cd", - "v1.02", - AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob2", - "Non-Interactive Demo", - AD_ENTRY1("intro.stk", "8b1c98ff2ab2e14f47a1b891e9b92217"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, "usa.tot", 0 - }, - { - { - "gob2", - "Interactive Demo", - AD_ENTRY1("intro.stk", "cf1c95b2939bd8ff58a25c756cb6125e"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob2", - "Interactive Demo", - AD_ENTRY1("intro.stk", "4b278c2678ea01383fd5ca114d947eea"), - UNK_LANG, - kPlatformAmiga, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by polluks in bug report #1895126 - { - "gob2", - "Interactive Demo", - AD_ENTRY1s("intro.stk", "9fa85aea959fa8c582085855fbd99346", 553063), - UNK_LANG, - kPlatformAmiga, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by vampir_raziel in bug report #1658373 - { - "ween", - "", - { - {"intro.stk", 0, "bfd9d02faf3d8d60a2cf744f95eb48dd", 456570}, - {"ween.ins", 0, "d2cb24292c9ddafcad07e23382027218", 87800}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by vampir_raziel in bug report #1658373 - { - "ween", - "", - AD_ENTRY1s("intro.stk", "257fe669705ac4971efdfd5656eef16a", 457719), - FR_FRA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by vampir_raziel in bug report #1658373 - { - "ween", - "", - AD_ENTRY1s("intro.stk", "dffd1ab98fe76150d6933329ca6f4cc4", 459458), - FR_FRA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by vampir_raziel in bug report #1658373 - { - "ween", - "", - AD_ENTRY1s("intro.stk", "af83debf2cbea21faa591c7b4608fe92", 458192), - DE_DEU, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2563539 - { - "ween", - "", - { - {"intro.stk", 0, "dffd1ab98fe76150d6933329ca6f4cc4", 459458}, - {"ween.ins", 0, "d2cb24292c9ddafcad07e23382027218", 87800}, - {0, 0, 0, 0} - }, - IT_ITA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by pwigren in bug report #1764174 - { - "ween", - "", - { - {"intro.stk", 0, "bfd9d02faf3d8d60a2cf744f95eb48dd", 456570}, - {"music__5.snd", 0, "7d1819b9981ecddd53d3aacbc75f1cc8", 13446}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "ween", - "", - AD_ENTRY1("intro.stk", "e6d13fb3b858cb4f78a8780d184d5b2c"), - FR_FRA, - kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "ween", - "", - AD_ENTRY1("intro.stk", "2bb8878a8042244dd2b96ff682381baa"), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "ween", - "", - AD_ENTRY1s("intro.stk", "de92e5c6a8c163007ffceebef6e67f7d", 7117568), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by cybot_tmin in bug report #1667743 - { - "ween", - "", - AD_ENTRY1s("intro.stk", "6d60f9205ecfbd8735da2ee7823a70dc", 7014426), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "ween", - "", - AD_ENTRY1("intro.stk", "4b10525a3782aa7ecd9d833b5c1d308b"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by cartman_ on #scummvm - { - "ween", - "", - AD_ENTRY1("intro.stk", "63170e71f04faba88673b3f510f9c4c8"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by glorfindel in bugreport #1722142 - { - "ween", - "", - AD_ENTRY1s("intro.stk", "8b57cd510da8a3bbd99e3a0297a8ebd1", 7018771), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "ween", - "Demo", - AD_ENTRY1("intro.stk", "2e9c2898f6bf206ede801e3b2e7ee428"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, "show.tot", 0 - }, - { - { - "ween", - "Demo", - AD_ENTRY1("intro.stk", "15fb91a1b9b09684b28ac75edf66e504"), - EN_USA, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWeen, - kFeaturesAdLib, - 0, "show.tot", 0 - }, - { - { - "bargon", - "", - AD_ENTRY1("intro.stk", "da3c54be18ab73fbdb32db24624a9c23"), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by Trekky in the forums - { - "bargon", - "", - AD_ENTRY1s("intro.stk", "2f54b330d21f65b04b7c1f8cca76426c", 262109), - FR_FRA, - kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by cesardark in bug #1681649 - { - "bargon", - "", - AD_ENTRY1s("intro.stk", "11103b304286c23945560b391fd37e7d", 3181890), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by paul66 in bug #1692667 - { - "bargon", - "", - AD_ENTRY1s("intro.stk", "da3c54be18ab73fbdb32db24624a9c23", 3181825), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by pwigren in bugreport #1764174 - { - "bargon", - "", - AD_ENTRY1s("intro.stk", "569d679fe41d49972d34c9fce5930dda", 269825), - EN_ANY, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by kizkoool in bugreport #2089734 - { - "bargon", - "", - AD_ENTRY1s("intro.stk", "00f6b4e2ee26e5c40b488e2df5adcf03", 3975580), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { // Supplied by glorfindel in bugreport #1722142 - { - "bargon", - "Fanmade", - AD_ENTRY1s("intro.stk", "da3c54be18ab73fbdb32db24624a9c23", 3181825), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - { - {"intro.stk", 0, "0b72992f5d8b5e6e0330572a5753ea25", 256490}, - {"mod.babayaga", 0, "43484cde74e0860785f8e19f0bc776d1", 60248}, - {0, 0, 0, 0} - }, - UNK_LANG, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { // Found in french ADI 2 Francais-Maths CM1 - { - "littlered", - "", - AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib | kFeaturesEGA, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "7b7f48490dedc8a7cb999388e2fadbe3", 3930674), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "e0767783ff662ed93665446665693aef", 4371238), - HE_ISR, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by cartman_ on #scummvm - { - "lit", - "", - AD_ENTRY1s("intro.stk", "f1f78b663893b58887add182a77df151", 3944090), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2105220 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "cd322cb3c64ef2ba2f2134aa2122cfe9", 3936700), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by koalet in bug report #2479034 - { - "lit", - "", - { - {"intro.stk", 0, "af98bcdc70e1f1c1635577fd726fe7f1", 3937310}, - {"musmac1.mid", 0, "ae7229bb09c6abe4e60a2768b24bc890", 9398}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2093672 - { - "lit", - "", - AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4219382), - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "", - AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4219382), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in french ADI 2.6 Francais-Maths 4e - { - "lit", - "", - AD_ENTRY1s("intro.stk", "58ee9583a4fb837f02d9a58e5f442656", 3937120), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit1", - "Full install", - { - {"intro.stk", 0, "93c91bc9e783d00033042ae83144d7dd", 72318}, - {"partie2.itk", 0, "78f00bd8eb9e680e6289bba0130b1b33", 4396644}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit1", - "Light install", - { - {"intro.stk", 0, "93c91bc9e783d00033042ae83144d7dd", 72318}, - {"partie2.itk", 0, "78f00bd8eb9e680e6289bba0130b1b33", 664064}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit2", - "Light install", - AD_ENTRY1s("intro.stk", "17acbb212e62addbe48dc8f2282c98cb", 72318), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit2", - "Full install", - { - {"intro.stk", 0, "17acbb212e62addbe48dc8f2282c98cb", 72318}, - {"partie4.itk", 0, "6ce4967e0c79d7daeabc6c1d26783d4c", 2612087}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "lit", - "Demo", - AD_ENTRY1("demo.stk", "c06f8cc20eb239d4c71f225ce3093edf"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - "demo.stk", "demo.tot", 0 - }, - { - { - "lit", - "Non-interactive Demo", - AD_ENTRY1("demo.stk", "2eba8abd9e3878c57307576012dd2fec"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - "demo.stk", "demo.tot", 0 - }, - { - { - "fascination", - "CD Version (Censored)", - AD_ENTRY1s("disk0.stk", "9c61e9c22077f72921f07153e37ccf01", 545953), - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES - }, - kGameTypeFascination, - kFeaturesCD, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "VGA 3 disks edition", - AD_ENTRY1s("disk0.stk", "a50a8495e1b2d67699fb562cb98fc3e2", 1064387), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesAdLib, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "VGA 3 disks edition", - AD_ENTRY1s("intro.stk", "d6e45ce548598727e2b5587a99718eba", 1055909), - HE_ISR, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesAdLib, - "intro.stk", 0, 0 - }, - { // Supplied by sanguine - { - "fascination", - "VGA 3 disks edition", - AD_ENTRY1s("disk0.stk", "c14330d052fe4da5a441ac9d81bc5891", 1061955), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesAdLib, - "disk0.stk", 0, 0 - }, - { // Supplied by windlepoons in bug report #2809247 - { - "fascination", - "VGA 3 disks edition", - AD_ENTRY1s("disk0.stk", "3a24e60a035250189643c86a9ceafb97", 1062480), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesAdLib, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "VGA", - AD_ENTRY1s("disk0.stk", "e8ab4f200a2304849f462dc901705599", 183337), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesAdLib, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "", - AD_ENTRY1s("disk0.stk", "68b1c01564f774c0b640075fbad1b695", 189968), - DE_DEU, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "", - AD_ENTRY1s("disk0.stk", "7062117e9c5adfb6bfb2dac3ff74df9e", 189951), - EN_ANY, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "", - AD_ENTRY1s("disk0.stk", "55c154e5a3e8e98afebdcff4b522e1eb", 190005), - FR_FRA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "", - AD_ENTRY1s("disk0.stk", "7691827fff35df7799f14cfd6be178ad", 189931), - IT_ITA, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { - { - "fascination", - "", - AD_ENTRY1s("disk0.stk", "aff9fcc619f4dd19eae228affd0d34c8", 189964), - EN_ANY, - kPlatformAtariST, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { - { - "geisha", - "", - AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGeisha, - kFeaturesNone, - "disk1.stk", "intro.tot", 0 - }, - { - { - "geisha", - "", - AD_ENTRY1s("disk1.stk", "f4d4d9d20f7ad1f879fc417d47faba89", 336732), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGeisha, - kFeaturesNone, - "disk1.stk", "intro.tot", 0 - }, - { - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "32b0f57f5ae79a9ae97e8011df38af42", 157084), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "904fc32032295baa3efb3a41f17db611", 178582), - HE_ISR, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by raziel_ in bug report #1891869 - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "16b014bf32dbd6ab4c5163c44f56fed1", 445104), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by fac76 in bug report #1742716 - { - "gob3", - "", - { - {"intro.stk", 0, "32b0f57f5ae79a9ae97e8011df38af42", 157084}, - {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, - {0, 0, 0, 0} - }, - EN_GRB, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "1e2f64ec8dfa89f42ee49936a27e66e7"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by paul66 in bug report #1652352 - { - "gob3", - "", - AD_ENTRY1("intro.stk", "f6d225b25a180606fa5dbe6405c97380"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "e42a4f2337d6549487a80864d7826972"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by Paranoimia on #scummvm - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "fe8144daece35538085adb59c2d29613", 159402), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "4e3af248a48a2321364736afab868527"), - RU_RUS, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "8d28ce1591b0e9cc79bf41cad0fc4c9c"), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Supplied by SiRoCs in bug report #2098621 - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "d3b72938fbbc8159198088811f9e6d19", 160382), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "bd679eafde2084d8011f247e51b5a805"), - EN_GRB, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesNone, - 0, "menu.tot", 0 - }, - { - { - "gob3", - "", - AD_ENTRY1("intro.stk", "bd679eafde2084d8011f247e51b5a805"), - DE_DEU, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesNone, - 0, "menu.tot", 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "edd7403e5dc2a14459d2665a4c17714d", 209534}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "428e2de130cf3b303c938924539dc50d", 324420}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "", - { - {"intro.stk", 0, "428e2de130cf3b303c938924539dc50d", 324420}, - {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { // Found in Found in french ADI 2.5 Anglais Multimedia 5e - { - "gob3", - "", - AD_ENTRY1s("intro.stk", "edd7403e5dc2a14459d2665a4c17714d", 209534), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3cd", - "v1.000", - AD_ENTRY1("intro.stk", "6f2c226c62dd7ab0ab6f850e89d3fc47"), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 - { - "gob3cd", - "v1.02", - AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 - { - "gob3cd", - "v1.02", - AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 - { - "gob3cd", - "v1.02", - AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 - { - "gob3cd", - "v1.02", - AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 - { - "gob3cd", - "v1.02", - AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob3cd", - "v1.02", - AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), - HU_HUN, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob3cd", - "v1.02", - AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob3cd", - "v1.02", - AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2810082 - { - "gob3cd", - "v1.02", - AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "gob3", - "Interactive Demo", - AD_ENTRY1("intro.stk", "7aebd94e49c2c5c518c9e7b74f25de9d"), - FR_FRA, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "Interactive Demo 2", - AD_ENTRY1("intro.stk", "e5dcbc9f6658ebb1e8fe26bc4da0806d"), - FR_FRA, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "Interactive Demo 3", - AD_ENTRY1s("intro.stk", "9e20ad7b471b01f84db526da34eaf0a2", 395561), - EN_ANY, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "gob3", - "Non-interactive Demo", - AD_ENTRY1("intro.stk", "b9b898fccebe02b69c086052d5024a55"), - UNK_LANG, - kPlatformPC, - ADGF_DEMO, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesCD, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), - EN_USA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), - DE_DEU, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), - IT_ITA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), - ES_ESP, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "", - AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), - FR_FRA, - kPlatformWindows, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "inca2", - "Non-Interactive Demo", - { - {"cons.imd", 0, "f896ba0c4a1ac7f7260d342655980b49", 17804}, - {"conseil.imd", 0, "aaedd5482d5b271e233e86c5a03cf62e", 33999}, - {"int.imd", 0, "6308222fcefbcb20925f01c1aff70dee", 30871}, - {"inter.imd", 0, "39bd6d3540f3bedcc97293f352c7f3fc", 191719}, - {"machu.imd", 0, "c0bc8211d93b467bfd063b63fe61b85c", 34609}, - {"post.imd", 0, "d75cad0e3fc22cb0c8b6faf597f509b2", 1047709}, - {"posta.imd", 0, "2a5b3fe75681ddf4d21ac724db8111b4", 547250}, - {"postb.imd", 0, "24260ce4e80a4c472352b76637265d09", 868312}, - {"postc.imd", 0, "24accbcc8b83a9c2be4bd82849a2bd29", 415637}, - {"tum.imd", 0, "0993d4810ec9deb3f77c5e92095320fd", 20330}, - {"tumi.imd", 0, "bf53f229480d694de0947fe3366fbec6", 248952}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeInca2, - kFeaturesAdLib | kFeaturesBATDemo, - 0, 0, 7 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "5f5f4e0a72c33391e67a47674b120cc6", 20296422), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by DjDiabolik in bug report #1971294 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by DjDiabolik in bug report #1971294 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by DjDiabolik in bug report #1971294 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by DjDiabolik in bug report #1971294 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by DjDiabolik in bug report #1971294 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2098838 - { - "woodruff", - "", - AD_ENTRY1s("intro.stk", "08a96bf061af1fa4f75c6a7cc56b60a4", 20734979), - PL_POL, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { - { - "woodruff", - "Non-Interactive Demo", - { - {"demo.scn", 0, "16bb85fc5f8e519147b60475dbf33962", 89}, - {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 1 - }, - { - { - "dynasty", - "", - AD_ENTRY1s("intro.stk", "6190e32404b672f4bbbc39cf76f41fda", 2511470), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "", - AD_ENTRY1s("intro.stk", "61e4069c16e27775a6cc6d20f529fb36", 2511300), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "", - AD_ENTRY1s("intro.stk", "61e4069c16e27775a6cc6d20f529fb36", 2511300), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "", - AD_ENTRY1s("intro.stk", "b3f8472484b7a1df94557b51e7b6fca0", 2322644), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "", - AD_ENTRY1s("intro.stk", "bdbdac8919200a5e71ffb9fb0709f704", 2446652), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "Demo", - AD_ENTRY1s("intro.stk", "464538a17ed39755d7f1ba9c751af1bd", 1847864), - EN_USA, - kPlatformPC, - ADGF_DEMO, - GUIO_NONE - }, - kGameTypeDynasty, - kFeatures640, - 0, 0, 0 - }, - { - { - "dynasty", - "Demo", - AD_ENTRY1s("lda1.stk", "0e56a899357cbc0bf503260fd2dd634e", 15032774), - UNK_LANG, - kPlatformWindows, - ADGF_DEMO, - GUIO_NONE - }, - kGameTypeDynasty, - kFeatures640, - "lda1.stk", 0, 0 - }, - { - { - "dynasty", - "Demo", - AD_ENTRY1s("lda1.stk", "8669ea2e9a8239c070dc73958fbc8753", 15567724), - DE_DEU, - kPlatformWindows, - ADGF_DEMO, - GUIO_NONE - }, - kGameTypeDynasty, - kFeatures640, - "lda1.stk", 0, 0 - }, - { - { - "urban", - "", - AD_ENTRY1s("intro.stk", "3ab2c542bd9216ae5d02cc6f45701ae1", 1252436), - EN_USA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeUrban, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by gamin in the forums - { - "urban", - "", - AD_ENTRY1s("intro.stk", "b991ed1d31c793e560edefdb349882ef", 1276408), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeUrban, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by jvprat on #scummvm - { - "urban", - "", - AD_ENTRY1s("intro.stk", "4ec3c0864e2b54c5b4ccf9f6ad96528d", 1253328), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeUrban, - kFeatures640, - 0, 0, 0 - }, - { // Supplied by goodoldgeorg in bug report #2770340 - { - "urban", - "", - AD_ENTRY1s("intro.stk", "4bd31979ea3d77a58a358c09000a85ed", 1253018), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeUrban, - kFeatures640, - 0, 0, 0 - }, - { - { - "urban", - "Non-Interactive Demo", - { - {"wdemo.s24", 0, "14ac9bd51db7a075d69ddb144904b271", 87}, - {"demo.vmd", 0, "65d04715d871c292518b56dd160b0161", 9091237}, - {"urband.vmd", 0, "60343891868c91854dd5c82766c70ecc", 922461}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeUrban, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 2 - }, - { - { - "playtoons1", - "", - { - {"playtoon.stk", 0, "8c98e9a11be9bb203a55e8c6e68e519b", 25574338}, - {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons1", - "Pack mes histoires anim\xE9""es", - { - {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, - {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons1", - "", - { - {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, - {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { // Supplied by scoriae in the forums - { - "playtoons1", - "", - { - {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, - {"archi.stk", 0, "00d8274519dfcf8a0d8ae3099daea0f8", 5532135}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons1", - "Non-Interactive Demo", - { - {"play123.scn", 0, "4689a31f543915e488c3bc46ea358add", 258}, - {"archi.vmd", 0, "a410fcc8116bc173f038100f5857191c", 5617210}, - {"chato.vmd", 0, "5a10e39cb66c396f2f9d8fb35e9ac016", 5445937}, - {"genedeb.vmd", 0, "3bb4a45585f88f4d839efdda6a1b582b", 1244228}, - {"generik.vmd", 0, "b46bdd64b063e86927fb2826500ad512", 603242}, - {"genespi.vmd", 0, "b7611916f32a370ae9832962fc17ef72", 758719}, - {"spirou.vmd", 0, "8513dbf7ac51c057b21d371d6b217b47", 2550788}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 3 - }, - { - { - "playtoons1", - "Non-Interactive Demo", - { - {"e.scn", 0, "8a0db733c3f77be86e74e8242e5caa61", 124}, - {"demarchg.vmd", 0, "d14a95da7d8792faf5503f649ffcbc12", 5619415}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 4 - }, - { - { - "playtoons1", - "Non-Interactive Demo", - { - {"i.scn", 0, "8b3294474d39970463663edd22341730", 285}, - {"demarita.vmd", 0, "84c8672b91c7312462603446e224bfec", 5742533}, - {"dembouit.vmd", 0, "7a5fdf0a4dbdfe72e31dd489ea0f8aa2", 3536786}, - {"demo5.vmd", 0, "2abb7b6a26406c984f389f0b24b5e28e", 13290970}, - {"demoita.vmd", 0, "b4c0622d14c8749965cd0f5dfca4cf4b", 1183566}, - {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, - {0, 0, 0, 0} - }, - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 5 - }, - { - { - "playtoons1", - "Non-Interactive Demo", - { - {"s.scn", 0, "1f527010626b5490761f16ba7a6f639a", 251}, - {"demaresp.vmd", 0, "3f860f944056842b35a5fd05416f208e", 5720619}, - {"demboues.vmd", 0, "3a0caa10c98ef92a15942f8274075b43", 3535838}, - {"demo5.vmd", 0, "2abb7b6a26406c984f389f0b24b5e28e", 13290970}, - {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, - {0, 0, 0, 0} - }, - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 6 - }, - { - { - "playtoons2", - "", - { - {"playtoon.stk", 0, "4772c96be88a57f0561519e4a1526c62", 24406262}, - {"spirou.stk", 0, "5d9c7644d0c47840169b4d016765cc1a", 9816201}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons2", - "", - { - {"playtoon.stk", 0, "55a85036dd93cce93532d8f743d90074", 17467154}, - {"spirou.stk", 0, "e3e1b6148dd72fafc3637f1a8e5764f5", 9812043}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons2", - "", - { - {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, - {"spirou.stk", 0, "91080dc148de1bbd6a97321c1a1facf3", 9817086}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { // Supplied by scoriae in the forums - { - "playtoons2", - "", - { - {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, - {"spirou.stk", 0, "993737f112ca6a9b33c814273280d832", 9825760}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons3", - "", - { - {"playtoon.stk", 0, "8c98e9a11be9bb203a55e8c6e68e519b", 25574338}, - {"chato.stk", 0, "4fa4ed96a427c344e9f916f9f236598d", 6033793}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons3", - "", - { - {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, - {"chato.stk", 0, "8fc8d0da5b3e758908d1d7298d497d0b", 6041026}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons3", - "Pack mes histoires anim\xE9""es", - { - {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, - {"chato.stk", 0, "4fa4ed96a427c344e9f916f9f236598d", 6033793}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons3", - "", - { - {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, - {"chato.stk", 0, "3c6cb3ac8a5a7cf681a19971a92a748d", 6033791}, - {0, 0, 0, 0} - }, - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { // Supplied by Hkz on #scummvm - { - "playtoons3", - "", - { - {"playtoon.stk", 0, "4772c96be88a57f0561519e4a1526c62", 24406262}, - {"chato.stk", 0, "bdef407387112bfcee90e664865ac3af", 6033867}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons4", - "", - { - {"playtoon.stk", 0, "b7f5afa2dc1b0f75970b7c07d175db1b", 24340406}, - {"manda.stk", 0, "92529e0b927191d9898a34c2892e9a3a", 6485072}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { //Supplied by goodoldgeorg in bug report #2820006 - { - "playtoons4", - "", - { - {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, - {"manda.stk", 0, "69a79c9f61b2618e482726f2ff68078d", 6499208}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtoons5", - "", - { - {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, - {"wakan.stk", 0, "f493bf82851bc5ba74d57de6b7e88df8", 5520153}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "bambou", - "", - { - {"intro.stk", 0, "2f8db6963ff8d72a8331627ebda918f4", 3613238}, - {"bambou.itk", 0, "0875914d31126d0749313428f10c7768", 114440192}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBambou, - kFeatures640, - "intro.stk", "intro.tot", 0 - }, - { - { - "playtnck1", - "", - { - {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, - {"dan.itk", 0, "906d67b3e438d5e95ec7ea9e781a94f3", 3000320}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtnck2", - "", - { - {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, - {"dan.itk", 0, "74eeb075bd2cb47b243349730264af01", 3213312}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "playtnck3", - "", - { - {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, - {"dan.itk", 0, "9a8f62809eca5a52f429b5b6a8e70f8f", 2861056}, - {0, 0, 0, 0} - }, - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - "intro2.stk", 0, 0 - }, - { - { - "adi2", - "Adi 2.0 for Teachers", - AD_ENTRY1s("adi2.stk", "da6f1fb68bff32260c5eecdf9286a2f5", 1533168), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeaturesNone, - "adi2.stk", "ediintro.tot", 0 - }, - { // Found in french ADI 2 Francais-Maths CM1. Exact version not specified. - { - "adi2", - "Adi 2", - AD_ENTRY1s("adi2.stk", "23f279615c736dc38320f1348e70c36e", 10817668), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { // Found in french ADI 2 Francais-Maths CE2. Exact version not specified. - { - "adi2", - "Adi 2", - AD_ENTRY1s("adi2.stk", "d4162c4298f9423ecc1fb04965557e90", 11531214), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2", - AD_ENTRY1s("adi2.stk", "29694c5a649298a42f87ae731d6d6f6d", 311132), - EN_ANY, - kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeaturesNone, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2", - AD_ENTRY1s("adi2.stk", "2a40bb48ccbd4e6fb3f7f0fc2f069d80", 17720132), - ES_ESP, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2.5", - AD_ENTRY1s("adi2.stk", "fcac60e6627f37aee219575b60859de9", 16944268), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2.5", - AD_ENTRY1s("adi2.stk", "072d5e2d7826a7c055865568ebf918bb", 16934596), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2.6", - AD_ENTRY1s("adi2.stk", "2fb940eb8105b12871f6b88c8c4d1615", 16780058), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2.6", - AD_ENTRY1s("adi2.stk", "fde7d98a67dbf859423b6473796e932a", 18044780), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Adi 2.7.1", - AD_ENTRY1s("adi2.stk", "6fa5dffebf5c7243c6af6b8c188ee00a", 19278008), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", "ediintro.tot", 0 - }, - { - { - "adi2", - "Non-Interactive Demo", - { - {"demo.scn", 0, "8b5ba359fd87d586ad39c1754bf6ea35", 168}, - {"demadi2t.vmd", 0, "08a1b18cfe2015d3b43270da35cc813d", 7250723}, - {"demarch.vmd", 0, "4c4a4616585d40ef3df209e3c3911062", 5622731}, - {"demobou.vmd", 0, "2208b9855775564d15c4a5a559da0aec", 3550511}, - {0, 0, 0, 0} - }, - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeAdi2, - kFeatures640 | kFeaturesSCNDemo, - 0, 0, 1 - }, - { - { - "adi4", - "Addy 4 Grundschule Basis CD", - AD_ENTRY1s("intro.stk", "d2f0fb8909e396328dc85c0e29131ba8", 5847588), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Addy 4 Sekundarstufe Basis CD", - AD_ENTRY1s("intro.stk", "367340e59c461b4fa36651cd74e32c4e", 5847378), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0", - AD_ENTRY1s("intro.stk", "a3c35d19b2d28ea261d96321d208cb5a", 6021466), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0", - AD_ENTRY1s("intro.stk", "44491d85648810bc6fcf84f9b3aa47d5", 5834944), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0", - AD_ENTRY1s("intro.stk", "29374c0e3c10b17dd8463b06a55ad093", 6012072), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0 Limited Edition", - AD_ENTRY1s("intro.stk", "ebbbc5e28a4adb695535ed989c1b8d66", 5929644), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "ADI 4.10", - AD_ENTRY1s("intro.stk", "3e3fa9656e37d802027635ace88c4cc5", 5359144), - EN_GRB, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adi4", - "ADI 4.10", - AD_ENTRY1s("intro.stk", "6afc2590856433b9f5295b032f2b205d", 5923112), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adi4", - "ADI 4.11", - AD_ENTRY1s("intro.stk", "6296e4be4e0c270c24d1330881900c7f", 5921234), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adi4", - "Addy 4.21", - AD_ENTRY1s("intro.stk", "534f0b674cd4830df94a9c32c4ea7225", 6878034), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "ADI 4.21", - AD_ENTRY1s("intro.stk", "c5b9f6222c0b463f51dab47317c5b687", 5950490), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0 Interactive Demo", - AD_ENTRY1s("intro.stk", "89ace204dbaac001425c73f394334f6f", 2413102), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "adi4", - "Adi 4.0 / Adibou 2 Demo", - AD_ENTRY1s("intro.stk", "d41d8cd98f00b204e9800998ecf8427e", 0), - FR_FRA, - kPlatformPC, - ADGF_DEMO, - GUIO_NONE - }, - kGameTypeAdi4, - kFeatures640, - 0, 0, 0 - }, - { - { - "ajworld", - "", - AD_ENTRY1s("intro.stk", "e453bea7b28a67c930764d945f64d898", 3913628), - EN_ANY, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "adibou1", - "ADIBOU 1 Environnement 4-7 ans", - AD_ENTRY1s("intro.stk", "6db110188fcb7c5208d9721b5282682a", 4805104), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeAdibou1, - kFeaturesAdLib, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2", - AD_ENTRY1s("intro.stk", "94ae7004348dc8bf99c23a9a6ef81827", 956162), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "Le Jardin Magique d'Adibou", - AD_ENTRY1s("intro.stk", "a8ff86f3cc40dfe5898e0a741217ef27", 956328), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2", - AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), - DE_DEU, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIB\xD9 2", - AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), - IT_ITA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU Version Decouverte", - AD_ENTRY1s("intro.stk", "558c14327b79ed39214b49d567a75e33", 8737856), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2.10 Environnement", - AD_ENTRY1s("intro.stk", "f2b797819aeedee557e904b0b5ccd82e", 8736454), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2.11 Environnement", - AD_ENTRY1s("intro.stk", "7b1f1f6f6477f54401e95d913f75e333", 8736904), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2.12 Environnement", - AD_ENTRY1s("intro.stk", "1e49c39a4a3ce6032a84b712539c2d63", 8738134), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOU 2.13s Environnement", - AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { - { - "adibou2", - "ADIBOO 2.14 Environnement", - AD_ENTRY1s("intro.stk", "ff63637e3cb7f0a457edf79457b1c6b3", 9333874), - FR_FRA, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeAdibou2, - kFeaturesNone, - 0, 0, 0 - }, - { AD_TABLE_END_MARKER, kGameTypeNone, kFeaturesNone, 0, 0, 0} -}; - -static const GOBGameDescription fallbackDescs[] = { - { //0 - { - "gob1", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesNone, - 0, 0, 0 - }, - { //1 - { - "gob1cd", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob1, - kFeaturesCD, - 0, 0, 0 - }, - { //2 - { - "gob2", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { //3 - { - "gob2mac", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesAdLib, - 0, 0, 0 - }, - { //4 - { - "gob2cd", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob2, - kFeaturesCD, - 0, 0, 0 - }, - { //5 - { - "bargon", - "", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBargon, - kFeaturesNone, - 0, 0, 0 - }, - { //6 - { - "gob3", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesAdLib, - 0, 0, 0 - }, - { //7 - { - "gob3cd", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGob3, - kFeaturesCD, - 0, 0, 0 - }, - { //8 - { - "woodruff", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeWoodruff, - kFeatures640, - 0, 0, 0 - }, - { //9 - { - "lostintime", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { //10 - { - "lostintime", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesAdLib, - 0, 0, 0 - }, - { //11 - { - "lostintime", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeLostInTime, - kFeaturesCD, - 0, 0, 0 - }, - { //12 - { - "urban", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeUrban, - kFeaturesCD, - 0, 0, 0 - }, - { //13 - { - "playtoons1", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //14 - { - "playtoons2", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //15 - { - "playtoons3", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //16 - { - "playtoons4", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //17 - { - "playtoons5", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //18 - { - "playtoons construction kit", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypePlaytoons, - kFeatures640, - 0, 0, 0 - }, - { //19 - { - "bambou", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeBambou, - kFeatures640, - 0, 0, 0 - }, - { //20 - { - "fascination", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeFascination, - kFeaturesNone, - "disk0.stk", 0, 0 - }, - { //21 - { - "geisha", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeGeisha, - kFeaturesNone, - "disk1.stk", "intro.tot", 0 - }, - { //22 - { - "adi2", - "", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeAdi2, - kFeatures640, - "adi2.stk", 0, 0 - }, - { //23 - { - "adi4", - "", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSUBTITLES | GUIO_NOSPEECH - }, - kGameTypeAdi4, - kFeatures640, - "adif41.stk", 0, 0 - }, - { //24 - { - "coktelplayer", - "unknown", - AD_ENTRY1(0, 0), - UNK_LANG, - kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - kGameTypeUrban, - kFeaturesAdLib | kFeatures640 | kFeaturesSCNDemo, - "", "", 8 - } -}; - -static const ADFileBasedFallback fileBased[] = { - { &fallbackDescs[ 0], { "intro.stk", "disk1.stk", "disk2.stk", "disk3.stk", "disk4.stk", 0 } }, - { &fallbackDescs[ 1], { "intro.stk", "gob.lic", 0 } }, - { &fallbackDescs[ 2], { "intro.stk", 0 } }, - { &fallbackDescs[ 2], { "intro.stk", "disk2.stk", "disk3.stk", 0 } }, - { &fallbackDescs[ 3], { "intro.stk", "disk2.stk", "disk3.stk", "musmac1.mid", 0 } }, - { &fallbackDescs[ 4], { "intro.stk", "gobnew.lic", 0 } }, - { &fallbackDescs[ 5], { "intro.stk", "scaa.imd", "scba.imd", "scbf.imd", 0 } }, - { &fallbackDescs[ 6], { "intro.stk", "imd.itk", 0 } }, - { &fallbackDescs[ 7], { "intro.stk", "mus_gob3.lic", 0 } }, - { &fallbackDescs[ 8], { "intro.stk", "woodruff.itk", 0 } }, - { &fallbackDescs[ 9], { "intro.stk", "commun1.itk", 0 } }, - { &fallbackDescs[10], { "intro.stk", "commun1.itk", "musmac1.mid", 0 } }, - { &fallbackDescs[11], { "intro.stk", "commun1.itk", "lost.lic", 0 } }, - { &fallbackDescs[12], { "intro.stk", "cd1.itk", "objet1.itk", 0 } }, - { &fallbackDescs[13], { "playtoon.stk", "archi.stk", 0 } }, - { &fallbackDescs[14], { "playtoon.stk", "spirou.stk", 0 } }, - { &fallbackDescs[15], { "playtoon.stk", "chato.stk", 0 } }, - { &fallbackDescs[16], { "playtoon.stk", "manda.stk", 0 } }, - { &fallbackDescs[17], { "playtoon.stk", "wakan.stk", 0 } }, - { &fallbackDescs[18], { "playtoon.stk", "dan.itk" } }, - { &fallbackDescs[19], { "intro.stk", "bambou.itk", 0 } }, - { &fallbackDescs[20], { "disk0.stk", "disk1.stk", "disk2.stk", "disk3.stk", 0 } }, - { &fallbackDescs[21], { "disk1.stk", "disk2.stk", "disk3.stk", 0 } }, - { &fallbackDescs[22], { "adi2.stk", 0 } }, - { &fallbackDescs[23], { "adif41.stk", "adim41.stk", 0 } }, - { &fallbackDescs[24], { "coktelplayer.scn", 0 } }, - { 0, { 0 } } -}; - -} +#include "gob/detection_tables.h" static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure diff --git a/engines/gob/detection_tables.h b/engines/gob/detection_tables.h new file mode 100644 index 0000000000..20edb9fbc3 --- /dev/null +++ b/engines/gob/detection_tables.h @@ -0,0 +1,5013 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Gob { + +using Common::GUIO_NOSPEECH; +using Common::GUIO_NOSUBTITLES; +using Common::GUIO_NONE; + +static const GOBGameDescription gameDescriptions[] = { + { // Supplied by Florian Zeitz on scummvm-devel + { + "gob1", + "EGA", + AD_ENTRY1("intro.stk", "c65e9cc8ba23a38456242e1f2b1caad4"), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesEGA, + 0, 0, 0 + }, + { + { + "gob1", + "EGA", + AD_ENTRY1("intro.stk", "f9233283a0be2464248d83e14b95f09c"), + RU_RUS, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesEGA, + 0, 0, 0 + }, + { // Supplied by Theruler76 in bug report #1201233 + { + "gob1", + "VGA", + AD_ENTRY1("intro.stk", "26a9118c0770fa5ac93a9626761600b2"), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by raziel_ in bug report #1891864 + { + "gob1", + "VGA", + AD_ENTRY1s("intro.stk", "e157cb59c6d330ca70d12ab0ef1dd12b", 288972), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by raina in the forums + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "6d837c6380d8f4d984c9f6cc0026df4f", 192712), + EN_ANY, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob1", + "", + AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), + EN_ANY, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob1", + "", + AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), + DE_DEU, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob1", + "", + AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), + FR_FRA, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob1", + "", + AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), + IT_ITA, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob1", + "", + AD_ENTRY1("intro.stk", "00a42a7d2d22e6b6ab1b8c673c4ed267"), + ES_ESP, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "gob1", + "", + { + {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "gob1", + "", + { + {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "gob1", + "", + { + {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "gob1", + "", + { + {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "gob1", + "", + { + {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob1", + "", + { + {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob1", + "", + { + {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob1", + "", + { + {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob1", + "", + { + {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob1", + "", + { + {"intro.stk", 0, "e157cb59c6d330ca70d12ab0ef1dd12b", 288972}, + {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "f5f028ee39c456fa51fa63b606583918", 313472), + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, 0, 0 + }, + { // CD 1.000 version. + { + "gob1cd", + "v1.000", + AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.000 version. + { + "gob1cd", + "v1.000", + AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.000 version. + { + "gob1cd", + "v1.000", + AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.000 version. + { + "gob1cd", + "v1.000", + AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.000 version. + { + "gob1cd", + "v1.000", + AD_ENTRY1("intro.stk", "2fbf4b5b82bbaee87eb45d4404c28998"), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.02 version. Multilingual + { + "gob1cd", + "v1.02", + AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.02 version. Multilingual + { + "gob1cd", + "v1.02", + AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.02 version. Multilingual + { + "gob1cd", + "v1.02", + AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.02 version. Multilingual + { + "gob1cd", + "v1.02", + AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // CD 1.02 version. Multilingual + { + "gob1cd", + "v1.02", + AD_ENTRY1("intro.stk", "8bd873137b6831c896ee8ad217a6a398"), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob1cd", + "v1.02", + AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), + HU_HUN, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob1cd", + "v1.02", + AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob1cd", + "v1.02", + AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob1cd", + "v1.02", + AD_ENTRY1s("intro.stk", "40d4a53818f4fce3f5997d02c3fafe73", 4049248), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob1", + "Demo", + AD_ENTRY1("intro.stk", "972f22c6ff8144a6636423f0354ca549"), + UNK_LANG, + kPlatformAmiga, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "gob1", + "Interactive Demo", + AD_ENTRY1("intro.stk", "e72bd1e3828c7dec4c8a3e58c48bdfdb"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "gob1", + "Interactive Demo", + AD_ENTRY1s("intro.stk", "a796096280d5efd48cf8e7dfbe426eb5", 193595), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2785958 + { + "gob1", + "Interactive Demo", + AD_ENTRY1s("intro.stk", "35a098571af9a03c04e2303aec7c9249", 116582), + FR_FRA, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "gob1", + "", + AD_ENTRY1s("intro.stk", "0e022d3f2481b39e9175d37b2c6ad4c6", 2390121), + FR_FRA, + kPlatformCDi, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesAdLib, + 0, "AVT003.TOT", 0 + }, + { // Supplied by fac76 in bug report #1883808 + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "eebf2810122cfd17399260cd1468e994", 554014), + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1("intro.stk", "d28b9e9b41f31acfa58dcd12406c7b2c"), + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2602057 + { + "gob2", + "", + AD_ENTRY1("intro.stk", "686c88f7302a80b744aae9f8413e853d"), + IT_ITA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by bgk in bug report #1706861 + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "4b13c02d1069b86bcfec80f4e474b98b", 554680), + FR_FRA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by fac76 in bug report #1673397 + { + "gob2", + "", + { + {"intro.stk", 0, "b45b984ee8017efd6ea965b9becd4d66", 828443}, + {"musmac1.mid", 0, "7f96f491448c7a001b32df89cf8d2af2", 1658}, + {0, 0, 0, 0} + }, + UNK_LANG, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by koalet in bug report #2478585 + { + "gob2", + "", + { + {"intro.stk", 0, "a13ecb4f6d8fd881ebbcc02e45cb5475", 837275}, + {"musmac1.mid", 0, "7f96f491448c7a001b32df89cf8d2af2", 1658}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1("intro.stk", "b45b984ee8017efd6ea965b9becd4d66"), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1("intro.stk", "dedb5d31d8c8050a8cf77abedcc53dae"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by raziel_ in bug report #1891867 + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "25a99827cd59751a80bed9620fb677a0", 893302), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "a13ecb4f6d8fd881ebbcc02e45cb5475", 837275), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by blackwhiteeagle in bug report #1605235 + { + "gob2", + "", + AD_ENTRY1("intro.stk", "3e4e7db0d201587dd2df4003b2993ef6"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1("intro.stk", "a13892cdf4badda85a6f6fb47603a128"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2602017 + { + "gob2", + "", + AD_ENTRY1("intro.stk", "c47faf1d406504e6ffe63243610bb1f4"), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + AD_ENTRY1("intro.stk", "cd3e1df8b273636ee32e34b7064f50e8"), + RU_RUS, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by arcepi in bug report #1659884 + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "5f53c56e3aa2f1e76c2e4f0caa15887f", 829232), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "285d7340f98ebad65d465585da12910b", 837286}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + EN_USA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "25a99827cd59751a80bed9620fb677a0", 893302}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "6efac0a14c0de4d57dde8592456c8acf", 845172}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + EN_USA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "", + { + {"intro.stk", 0, "6efac0a14c0de4d57dde8592456c8acf", 845172}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "24489330a1d67ff978211f574822a5a6", 883756), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob2", + "", + AD_ENTRY1s("intro.stk", "285d7340f98ebad65d465585da12910b", 837286), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2cd", + "v1.000", + AD_ENTRY1("intro.stk", "9de5fbb41cf97182109e5fecc9d90347"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2cd", + "v2.01", + AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2cd", + "v2.01", + AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2cd", + "v2.01", + AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2cd", + "v2.01", + AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2cd", + "v2.01", + AD_ENTRY1("intro.stk", "24a6b32757752ccb1917ce92fd7c2a04"), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob2cd", + "v1.02", + AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), + HU_HUN, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob2cd", + "v1.02", + AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob2cd", + "v1.02", + AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob2cd", + "v1.02", + AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob2cd", + "v1.02", + AD_ENTRY1s("intro.stk", "5ba85a4769a1ab03a283dd694588d526", 5006236), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob2", + "Non-Interactive Demo", + AD_ENTRY1("intro.stk", "8b1c98ff2ab2e14f47a1b891e9b92217"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, "usa.tot", 0 + }, + { + { + "gob2", + "Interactive Demo", + AD_ENTRY1("intro.stk", "cf1c95b2939bd8ff58a25c756cb6125e"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob2", + "Interactive Demo", + AD_ENTRY1("intro.stk", "4b278c2678ea01383fd5ca114d947eea"), + UNK_LANG, + kPlatformAmiga, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by polluks in bug report #1895126 + { + "gob2", + "Interactive Demo", + AD_ENTRY1s("intro.stk", "9fa85aea959fa8c582085855fbd99346", 553063), + UNK_LANG, + kPlatformAmiga, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by vampir_raziel in bug report #1658373 + { + "ween", + "", + { + {"intro.stk", 0, "bfd9d02faf3d8d60a2cf744f95eb48dd", 456570}, + {"ween.ins", 0, "d2cb24292c9ddafcad07e23382027218", 87800}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by vampir_raziel in bug report #1658373 + { + "ween", + "", + AD_ENTRY1s("intro.stk", "257fe669705ac4971efdfd5656eef16a", 457719), + FR_FRA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by vampir_raziel in bug report #1658373 + { + "ween", + "", + AD_ENTRY1s("intro.stk", "dffd1ab98fe76150d6933329ca6f4cc4", 459458), + FR_FRA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by vampir_raziel in bug report #1658373 + { + "ween", + "", + AD_ENTRY1s("intro.stk", "af83debf2cbea21faa591c7b4608fe92", 458192), + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2563539 + { + "ween", + "", + { + {"intro.stk", 0, "dffd1ab98fe76150d6933329ca6f4cc4", 459458}, + {"ween.ins", 0, "d2cb24292c9ddafcad07e23382027218", 87800}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by pwigren in bug report #1764174 + { + "ween", + "", + { + {"intro.stk", 0, "bfd9d02faf3d8d60a2cf744f95eb48dd", 456570}, + {"music__5.snd", 0, "7d1819b9981ecddd53d3aacbc75f1cc8", 13446}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "ween", + "", + AD_ENTRY1("intro.stk", "e6d13fb3b858cb4f78a8780d184d5b2c"), + FR_FRA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "ween", + "", + AD_ENTRY1("intro.stk", "2bb8878a8042244dd2b96ff682381baa"), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "ween", + "", + AD_ENTRY1s("intro.stk", "de92e5c6a8c163007ffceebef6e67f7d", 7117568), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by cybot_tmin in bug report #1667743 + { + "ween", + "", + AD_ENTRY1s("intro.stk", "6d60f9205ecfbd8735da2ee7823a70dc", 7014426), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "ween", + "", + AD_ENTRY1("intro.stk", "4b10525a3782aa7ecd9d833b5c1d308b"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by cartman_ on #scummvm + { + "ween", + "", + AD_ENTRY1("intro.stk", "63170e71f04faba88673b3f510f9c4c8"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by glorfindel in bugreport #1722142 + { + "ween", + "", + AD_ENTRY1s("intro.stk", "8b57cd510da8a3bbd99e3a0297a8ebd1", 7018771), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "ween", + "Demo", + AD_ENTRY1("intro.stk", "2e9c2898f6bf206ede801e3b2e7ee428"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, "show.tot", 0 + }, + { + { + "ween", + "Demo", + AD_ENTRY1("intro.stk", "15fb91a1b9b09684b28ac75edf66e504"), + EN_USA, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWeen, + kFeaturesAdLib, + 0, "show.tot", 0 + }, + { + { + "bargon", + "", + AD_ENTRY1("intro.stk", "da3c54be18ab73fbdb32db24624a9c23"), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by Trekky in the forums + { + "bargon", + "", + AD_ENTRY1s("intro.stk", "2f54b330d21f65b04b7c1f8cca76426c", 262109), + FR_FRA, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by cesardark in bug #1681649 + { + "bargon", + "", + AD_ENTRY1s("intro.stk", "11103b304286c23945560b391fd37e7d", 3181890), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by paul66 in bug #1692667 + { + "bargon", + "", + AD_ENTRY1s("intro.stk", "da3c54be18ab73fbdb32db24624a9c23", 3181825), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by pwigren in bugreport #1764174 + { + "bargon", + "", + AD_ENTRY1s("intro.stk", "569d679fe41d49972d34c9fce5930dda", 269825), + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by kizkoool in bugreport #2089734 + { + "bargon", + "", + AD_ENTRY1s("intro.stk", "00f6b4e2ee26e5c40b488e2df5adcf03", 3975580), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { // Supplied by glorfindel in bugreport #1722142 + { + "bargon", + "Fanmade", + AD_ENTRY1s("intro.stk", "da3c54be18ab73fbdb32db24624a9c23", 3181825), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "0b72992f5d8b5e6e0330572a5753ea25", 256490), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + { + {"intro.stk", 0, "0b72992f5d8b5e6e0330572a5753ea25", 256490}, + {"mod.babayaga", 0, "43484cde74e0860785f8e19f0bc776d1", 60248}, + {0, 0, 0, 0} + }, + UNK_LANG, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "113a16877e4f72037d9714be1c2b0221", 1187522), + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { // Found in french ADI 2 Francais-Maths CM1 + { + "littlered", + "", + AD_ENTRY1s("intro.stk", "5c15b37ed27ac2470854e9e09374d50e", 1248610), + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib | kFeaturesEGA, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "7b7f48490dedc8a7cb999388e2fadbe3", 3930674), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "e0767783ff662ed93665446665693aef", 4371238), + HE_ISR, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by cartman_ on #scummvm + { + "lit", + "", + AD_ENTRY1s("intro.stk", "f1f78b663893b58887add182a77df151", 3944090), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2105220 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "cd322cb3c64ef2ba2f2134aa2122cfe9", 3936700), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by koalet in bug report #2479034 + { + "lit", + "", + { + {"intro.stk", 0, "af98bcdc70e1f1c1635577fd726fe7f1", 3937310}, + {"musmac1.mid", 0, "ae7229bb09c6abe4e60a2768b24bc890", 9398}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "6263d09e996c1b4e84ef2d650b820e57", 4831170), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2093672 + { + "lit", + "", + AD_ENTRY1s("intro.stk", "795be7011ec31bf5bb8ce4efdb9ee5d3", 4838904), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4207330), + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4219382), + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "", + AD_ENTRY1s("intro.stk", "0ddf39cea1ec30ecc8bfe444ebd7b845", 4219382), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in french ADI 2.6 Francais-Maths 4e + { + "lit", + "", + AD_ENTRY1s("intro.stk", "58ee9583a4fb837f02d9a58e5f442656", 3937120), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit1", + "Full install", + { + {"intro.stk", 0, "93c91bc9e783d00033042ae83144d7dd", 72318}, + {"partie2.itk", 0, "78f00bd8eb9e680e6289bba0130b1b33", 4396644}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit1", + "Light install", + { + {"intro.stk", 0, "93c91bc9e783d00033042ae83144d7dd", 72318}, + {"partie2.itk", 0, "78f00bd8eb9e680e6289bba0130b1b33", 664064}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit2", + "Light install", + AD_ENTRY1s("intro.stk", "17acbb212e62addbe48dc8f2282c98cb", 72318), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit2", + "Full install", + { + {"intro.stk", 0, "17acbb212e62addbe48dc8f2282c98cb", 72318}, + {"partie4.itk", 0, "6ce4967e0c79d7daeabc6c1d26783d4c", 2612087}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "lit", + "Demo", + AD_ENTRY1("demo.stk", "c06f8cc20eb239d4c71f225ce3093edf"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + "demo.stk", "demo.tot", 0 + }, + { + { + "lit", + "Non-interactive Demo", + AD_ENTRY1("demo.stk", "2eba8abd9e3878c57307576012dd2fec"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + "demo.stk", "demo.tot", 0 + }, + { + { + "fascination", + "CD Version (Censored)", + AD_ENTRY1s("disk0.stk", "9c61e9c22077f72921f07153e37ccf01", 545953), + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES + }, + kGameTypeFascination, + kFeaturesCD, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "VGA 3 disks edition", + AD_ENTRY1s("disk0.stk", "a50a8495e1b2d67699fb562cb98fc3e2", 1064387), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesAdLib, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "VGA 3 disks edition", + AD_ENTRY1s("intro.stk", "d6e45ce548598727e2b5587a99718eba", 1055909), + HE_ISR, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesAdLib, + "intro.stk", 0, 0 + }, + { // Supplied by sanguine + { + "fascination", + "VGA 3 disks edition", + AD_ENTRY1s("disk0.stk", "c14330d052fe4da5a441ac9d81bc5891", 1061955), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesAdLib, + "disk0.stk", 0, 0 + }, + { // Supplied by windlepoons in bug report #2809247 + { + "fascination", + "VGA 3 disks edition", + AD_ENTRY1s("disk0.stk", "3a24e60a035250189643c86a9ceafb97", 1062480), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesAdLib, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "VGA", + AD_ENTRY1s("disk0.stk", "e8ab4f200a2304849f462dc901705599", 183337), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesAdLib, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "", + AD_ENTRY1s("disk0.stk", "68b1c01564f774c0b640075fbad1b695", 189968), + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "", + AD_ENTRY1s("disk0.stk", "7062117e9c5adfb6bfb2dac3ff74df9e", 189951), + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "", + AD_ENTRY1s("disk0.stk", "55c154e5a3e8e98afebdcff4b522e1eb", 190005), + FR_FRA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "", + AD_ENTRY1s("disk0.stk", "7691827fff35df7799f14cfd6be178ad", 189931), + IT_ITA, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { + { + "fascination", + "", + AD_ENTRY1s("disk0.stk", "aff9fcc619f4dd19eae228affd0d34c8", 189964), + EN_ANY, + kPlatformAtariST, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGeisha, + kFeaturesNone, + "disk1.stk", "intro.tot", 0 + }, + { + { + "geisha", + "", + AD_ENTRY1s("disk1.stk", "f4d4d9d20f7ad1f879fc417d47faba89", 336732), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGeisha, + kFeaturesNone, + "disk1.stk", "intro.tot", 0 + }, + { + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "32b0f57f5ae79a9ae97e8011df38af42", 157084), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "904fc32032295baa3efb3a41f17db611", 178582), + HE_ISR, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by raziel_ in bug report #1891869 + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "16b014bf32dbd6ab4c5163c44f56fed1", 445104), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "16b014bf32dbd6ab4c5163c44f56fed1", 445104}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by fac76 in bug report #1742716 + { + "gob3", + "", + { + {"intro.stk", 0, "32b0f57f5ae79a9ae97e8011df38af42", 157084}, + {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661}, + {0, 0, 0, 0} + }, + EN_GRB, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "1e2f64ec8dfa89f42ee49936a27e66e7"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by paul66 in bug report #1652352 + { + "gob3", + "", + AD_ENTRY1("intro.stk", "f6d225b25a180606fa5dbe6405c97380"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "e42a4f2337d6549487a80864d7826972"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by Paranoimia on #scummvm + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "fe8144daece35538085adb59c2d29613", 159402), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "4e3af248a48a2321364736afab868527"), + RU_RUS, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "8d28ce1591b0e9cc79bf41cad0fc4c9c"), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Supplied by SiRoCs in bug report #2098621 + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "d3b72938fbbc8159198088811f9e6d19", 160382), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "bd679eafde2084d8011f247e51b5a805"), + EN_GRB, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesNone, + 0, "menu.tot", 0 + }, + { + { + "gob3", + "", + AD_ENTRY1("intro.stk", "bd679eafde2084d8011f247e51b5a805"), + DE_DEU, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesNone, + 0, "menu.tot", 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "edd7403e5dc2a14459d2665a4c17714d", 209534}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "428e2de130cf3b303c938924539dc50d", 324420}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "", + { + {"intro.stk", 0, "428e2de130cf3b303c938924539dc50d", 324420}, + {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { // Found in Found in french ADI 2.5 Anglais Multimedia 5e + { + "gob3", + "", + AD_ENTRY1s("intro.stk", "edd7403e5dc2a14459d2665a4c17714d", 209534), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3cd", + "v1.000", + AD_ENTRY1("intro.stk", "6f2c226c62dd7ab0ab6f850e89d3fc47"), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 + { + "gob3cd", + "v1.02", + AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 + { + "gob3cd", + "v1.02", + AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 + { + "gob3cd", + "v1.02", + AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 + { + "gob3cd", + "v1.02", + AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230 + { + "gob3cd", + "v1.02", + AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob3cd", + "v1.02", + AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), + HU_HUN, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob3cd", + "v1.02", + AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob3cd", + "v1.02", + AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2810082 + { + "gob3cd", + "v1.02", + AD_ENTRY1s("intro.stk", "bfd7d4c6fedeb2cfcc8baa4d5ddb1f74", 616220), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "gob3", + "Interactive Demo", + AD_ENTRY1("intro.stk", "7aebd94e49c2c5c518c9e7b74f25de9d"), + FR_FRA, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "Interactive Demo 2", + AD_ENTRY1("intro.stk", "e5dcbc9f6658ebb1e8fe26bc4da0806d"), + FR_FRA, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "Interactive Demo 3", + AD_ENTRY1s("intro.stk", "9e20ad7b471b01f84db526da34eaf0a2", 395561), + EN_ANY, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "gob3", + "Non-interactive Demo", + AD_ENTRY1("intro.stk", "b9b898fccebe02b69c086052d5024a55"), + UNK_LANG, + kPlatformPC, + ADGF_DEMO, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "47c3b452767c4f49ea7b109143e77c30", 916828), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesCD, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "1fa92b00fe80a20f34ec34a8e2fa869e", 923072), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), + EN_USA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), + DE_DEU, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), + IT_ITA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), + ES_ESP, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "", + AD_ENTRY1s("intro.stk", "d33011df8758ac64ca3dca77c7719001", 908612), + FR_FRA, + kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "inca2", + "Non-Interactive Demo", + { + {"cons.imd", 0, "f896ba0c4a1ac7f7260d342655980b49", 17804}, + {"conseil.imd", 0, "aaedd5482d5b271e233e86c5a03cf62e", 33999}, + {"int.imd", 0, "6308222fcefbcb20925f01c1aff70dee", 30871}, + {"inter.imd", 0, "39bd6d3540f3bedcc97293f352c7f3fc", 191719}, + {"machu.imd", 0, "c0bc8211d93b467bfd063b63fe61b85c", 34609}, + {"post.imd", 0, "d75cad0e3fc22cb0c8b6faf597f509b2", 1047709}, + {"posta.imd", 0, "2a5b3fe75681ddf4d21ac724db8111b4", 547250}, + {"postb.imd", 0, "24260ce4e80a4c472352b76637265d09", 868312}, + {"postc.imd", 0, "24accbcc8b83a9c2be4bd82849a2bd29", 415637}, + {"tum.imd", 0, "0993d4810ec9deb3f77c5e92095320fd", 20330}, + {"tumi.imd", 0, "bf53f229480d694de0947fe3366fbec6", 248952}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeInca2, + kFeaturesAdLib | kFeaturesBATDemo, + 0, 0, 7 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "dccf9d31cb720b34d75487408821b77e", 20296390), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "b50fee012a5abcd0ac2963e1b4b56bec", 20298108), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "5f5f4e0a72c33391e67a47674b120cc6", 20296422), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "270529d9b8cce770b1575908a3800b52", 20296452), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "f4c344023b073782d2fddd9d8b515318", 7069736), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by DjDiabolik in bug report #1971294 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by DjDiabolik in bug report #1971294 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by DjDiabolik in bug report #1971294 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by DjDiabolik in bug report #1971294 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by DjDiabolik in bug report #1971294 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "60348a87651f92e8492ee070556a96d8", 7069736), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2098838 + { + "woodruff", + "", + AD_ENTRY1s("intro.stk", "08a96bf061af1fa4f75c6a7cc56b60a4", 20734979), + PL_POL, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { + { + "woodruff", + "Non-Interactive Demo", + { + {"demo.scn", 0, "16bb85fc5f8e519147b60475dbf33962", 89}, + {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 1 + }, + { + { + "dynasty", + "", + AD_ENTRY1s("intro.stk", "6190e32404b672f4bbbc39cf76f41fda", 2511470), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "", + AD_ENTRY1s("intro.stk", "61e4069c16e27775a6cc6d20f529fb36", 2511300), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "", + AD_ENTRY1s("intro.stk", "61e4069c16e27775a6cc6d20f529fb36", 2511300), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "", + AD_ENTRY1s("intro.stk", "b3f8472484b7a1df94557b51e7b6fca0", 2322644), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "", + AD_ENTRY1s("intro.stk", "bdbdac8919200a5e71ffb9fb0709f704", 2446652), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "Demo", + AD_ENTRY1s("intro.stk", "464538a17ed39755d7f1ba9c751af1bd", 1847864), + EN_USA, + kPlatformPC, + ADGF_DEMO, + GUIO_NONE + }, + kGameTypeDynasty, + kFeatures640, + 0, 0, 0 + }, + { + { + "dynasty", + "Demo", + AD_ENTRY1s("lda1.stk", "0e56a899357cbc0bf503260fd2dd634e", 15032774), + UNK_LANG, + kPlatformWindows, + ADGF_DEMO, + GUIO_NONE + }, + kGameTypeDynasty, + kFeatures640, + "lda1.stk", 0, 0 + }, + { + { + "dynasty", + "Demo", + AD_ENTRY1s("lda1.stk", "8669ea2e9a8239c070dc73958fbc8753", 15567724), + DE_DEU, + kPlatformWindows, + ADGF_DEMO, + GUIO_NONE + }, + kGameTypeDynasty, + kFeatures640, + "lda1.stk", 0, 0 + }, + { + { + "urban", + "", + AD_ENTRY1s("intro.stk", "3ab2c542bd9216ae5d02cc6f45701ae1", 1252436), + EN_USA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeUrban, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by gamin in the forums + { + "urban", + "", + AD_ENTRY1s("intro.stk", "b991ed1d31c793e560edefdb349882ef", 1276408), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeUrban, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by jvprat on #scummvm + { + "urban", + "", + AD_ENTRY1s("intro.stk", "4ec3c0864e2b54c5b4ccf9f6ad96528d", 1253328), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeUrban, + kFeatures640, + 0, 0, 0 + }, + { // Supplied by goodoldgeorg in bug report #2770340 + { + "urban", + "", + AD_ENTRY1s("intro.stk", "4bd31979ea3d77a58a358c09000a85ed", 1253018), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeUrban, + kFeatures640, + 0, 0, 0 + }, + { + { + "urban", + "Non-Interactive Demo", + { + {"wdemo.s24", 0, "14ac9bd51db7a075d69ddb144904b271", 87}, + {"demo.vmd", 0, "65d04715d871c292518b56dd160b0161", 9091237}, + {"urband.vmd", 0, "60343891868c91854dd5c82766c70ecc", 922461}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeUrban, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 2 + }, + { + { + "playtoons1", + "", + { + {"playtoon.stk", 0, "8c98e9a11be9bb203a55e8c6e68e519b", 25574338}, + {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons1", + "Pack mes histoires anim\xE9""es", + { + {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, + {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons1", + "", + { + {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, + {"archi.stk", 0, "8d44b2a0d4e3139471213f9f0ed21e81", 5524674}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { // Supplied by scoriae in the forums + { + "playtoons1", + "", + { + {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, + {"archi.stk", 0, "00d8274519dfcf8a0d8ae3099daea0f8", 5532135}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons1", + "Non-Interactive Demo", + { + {"play123.scn", 0, "4689a31f543915e488c3bc46ea358add", 258}, + {"archi.vmd", 0, "a410fcc8116bc173f038100f5857191c", 5617210}, + {"chato.vmd", 0, "5a10e39cb66c396f2f9d8fb35e9ac016", 5445937}, + {"genedeb.vmd", 0, "3bb4a45585f88f4d839efdda6a1b582b", 1244228}, + {"generik.vmd", 0, "b46bdd64b063e86927fb2826500ad512", 603242}, + {"genespi.vmd", 0, "b7611916f32a370ae9832962fc17ef72", 758719}, + {"spirou.vmd", 0, "8513dbf7ac51c057b21d371d6b217b47", 2550788}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 3 + }, + { + { + "playtoons1", + "Non-Interactive Demo", + { + {"e.scn", 0, "8a0db733c3f77be86e74e8242e5caa61", 124}, + {"demarchg.vmd", 0, "d14a95da7d8792faf5503f649ffcbc12", 5619415}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 4 + }, + { + { + "playtoons1", + "Non-Interactive Demo", + { + {"i.scn", 0, "8b3294474d39970463663edd22341730", 285}, + {"demarita.vmd", 0, "84c8672b91c7312462603446e224bfec", 5742533}, + {"dembouit.vmd", 0, "7a5fdf0a4dbdfe72e31dd489ea0f8aa2", 3536786}, + {"demo5.vmd", 0, "2abb7b6a26406c984f389f0b24b5e28e", 13290970}, + {"demoita.vmd", 0, "b4c0622d14c8749965cd0f5dfca4cf4b", 1183566}, + {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, + {0, 0, 0, 0} + }, + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 5 + }, + { + { + "playtoons1", + "Non-Interactive Demo", + { + {"s.scn", 0, "1f527010626b5490761f16ba7a6f639a", 251}, + {"demaresp.vmd", 0, "3f860f944056842b35a5fd05416f208e", 5720619}, + {"demboues.vmd", 0, "3a0caa10c98ef92a15942f8274075b43", 3535838}, + {"demo5.vmd", 0, "2abb7b6a26406c984f389f0b24b5e28e", 13290970}, + {"wooddem3.vmd", 0, "a1700596172c2d4e264760030c3a3d47", 8994250}, + {0, 0, 0, 0} + }, + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 6 + }, + { + { + "playtoons2", + "", + { + {"playtoon.stk", 0, "4772c96be88a57f0561519e4a1526c62", 24406262}, + {"spirou.stk", 0, "5d9c7644d0c47840169b4d016765cc1a", 9816201}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons2", + "", + { + {"playtoon.stk", 0, "55a85036dd93cce93532d8f743d90074", 17467154}, + {"spirou.stk", 0, "e3e1b6148dd72fafc3637f1a8e5764f5", 9812043}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons2", + "", + { + {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, + {"spirou.stk", 0, "91080dc148de1bbd6a97321c1a1facf3", 9817086}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { // Supplied by scoriae in the forums + { + "playtoons2", + "", + { + {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, + {"spirou.stk", 0, "993737f112ca6a9b33c814273280d832", 9825760}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons3", + "", + { + {"playtoon.stk", 0, "8c98e9a11be9bb203a55e8c6e68e519b", 25574338}, + {"chato.stk", 0, "4fa4ed96a427c344e9f916f9f236598d", 6033793}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons3", + "", + { + {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, + {"chato.stk", 0, "8fc8d0da5b3e758908d1d7298d497d0b", 6041026}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons3", + "Pack mes histoires anim\xE9""es", + { + {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, + {"chato.stk", 0, "4fa4ed96a427c344e9f916f9f236598d", 6033793}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons3", + "", + { + {"playtoon.stk", 0, "c5ca2a288cdaefca9556cd9ae4b579cf", 25158926}, + {"chato.stk", 0, "3c6cb3ac8a5a7cf681a19971a92a748d", 6033791}, + {0, 0, 0, 0} + }, + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { // Supplied by Hkz on #scummvm + { + "playtoons3", + "", + { + {"playtoon.stk", 0, "4772c96be88a57f0561519e4a1526c62", 24406262}, + {"chato.stk", 0, "bdef407387112bfcee90e664865ac3af", 6033867}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons4", + "", + { + {"playtoon.stk", 0, "b7f5afa2dc1b0f75970b7c07d175db1b", 24340406}, + {"manda.stk", 0, "92529e0b927191d9898a34c2892e9a3a", 6485072}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { //Supplied by goodoldgeorg in bug report #2820006 + { + "playtoons4", + "", + { + {"playtoon.stk", 0, "9e513e993a5b0e2496add3f50c08764b", 30448506}, + {"manda.stk", 0, "69a79c9f61b2618e482726f2ff68078d", 6499208}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtoons5", + "", + { + {"playtoon.stk", 0, "55f0293202963854192e39474e214f5f", 30448474}, + {"wakan.stk", 0, "f493bf82851bc5ba74d57de6b7e88df8", 5520153}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "bambou", + "", + { + {"intro.stk", 0, "2f8db6963ff8d72a8331627ebda918f4", 3613238}, + {"bambou.itk", 0, "0875914d31126d0749313428f10c7768", 114440192}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBambou, + kFeatures640, + "intro.stk", "intro.tot", 0 + }, + { + { + "playtnck1", + "", + { + {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, + {"dan.itk", 0, "906d67b3e438d5e95ec7ea9e781a94f3", 3000320}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtnck2", + "", + { + {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, + {"dan.itk", 0, "74eeb075bd2cb47b243349730264af01", 3213312}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "playtnck3", + "", + { + {"playtoon.stk", 0, "5f9aae29265f1f105ad8ec195dff81de", 68382024}, + {"dan.itk", 0, "9a8f62809eca5a52f429b5b6a8e70f8f", 2861056}, + {0, 0, 0, 0} + }, + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + "intro2.stk", 0, 0 + }, + { + { + "adi2", + "Adi 2.0 for Teachers", + AD_ENTRY1s("adi2.stk", "da6f1fb68bff32260c5eecdf9286a2f5", 1533168), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeaturesNone, + "adi2.stk", "ediintro.tot", 0 + }, + { // Found in french ADI 2 Francais-Maths CM1. Exact version not specified. + { + "adi2", + "Adi 2", + AD_ENTRY1s("adi2.stk", "23f279615c736dc38320f1348e70c36e", 10817668), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { // Found in french ADI 2 Francais-Maths CE2. Exact version not specified. + { + "adi2", + "Adi 2", + AD_ENTRY1s("adi2.stk", "d4162c4298f9423ecc1fb04965557e90", 11531214), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2", + AD_ENTRY1s("adi2.stk", "29694c5a649298a42f87ae731d6d6f6d", 311132), + EN_ANY, + kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeaturesNone, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2", + AD_ENTRY1s("adi2.stk", "2a40bb48ccbd4e6fb3f7f0fc2f069d80", 17720132), + ES_ESP, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2.5", + AD_ENTRY1s("adi2.stk", "fcac60e6627f37aee219575b60859de9", 16944268), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2.5", + AD_ENTRY1s("adi2.stk", "072d5e2d7826a7c055865568ebf918bb", 16934596), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2.6", + AD_ENTRY1s("adi2.stk", "2fb940eb8105b12871f6b88c8c4d1615", 16780058), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2.6", + AD_ENTRY1s("adi2.stk", "fde7d98a67dbf859423b6473796e932a", 18044780), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Adi 2.7.1", + AD_ENTRY1s("adi2.stk", "6fa5dffebf5c7243c6af6b8c188ee00a", 19278008), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", "ediintro.tot", 0 + }, + { + { + "adi2", + "Non-Interactive Demo", + { + {"demo.scn", 0, "8b5ba359fd87d586ad39c1754bf6ea35", 168}, + {"demadi2t.vmd", 0, "08a1b18cfe2015d3b43270da35cc813d", 7250723}, + {"demarch.vmd", 0, "4c4a4616585d40ef3df209e3c3911062", 5622731}, + {"demobou.vmd", 0, "2208b9855775564d15c4a5a559da0aec", 3550511}, + {0, 0, 0, 0} + }, + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeAdi2, + kFeatures640 | kFeaturesSCNDemo, + 0, 0, 1 + }, + { + { + "adi4", + "Addy 4 Grundschule Basis CD", + AD_ENTRY1s("intro.stk", "d2f0fb8909e396328dc85c0e29131ba8", 5847588), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Addy 4 Sekundarstufe Basis CD", + AD_ENTRY1s("intro.stk", "367340e59c461b4fa36651cd74e32c4e", 5847378), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0", + AD_ENTRY1s("intro.stk", "a3c35d19b2d28ea261d96321d208cb5a", 6021466), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0", + AD_ENTRY1s("intro.stk", "44491d85648810bc6fcf84f9b3aa47d5", 5834944), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0", + AD_ENTRY1s("intro.stk", "29374c0e3c10b17dd8463b06a55ad093", 6012072), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0 Limited Edition", + AD_ENTRY1s("intro.stk", "ebbbc5e28a4adb695535ed989c1b8d66", 5929644), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "ADI 4.10", + AD_ENTRY1s("intro.stk", "3e3fa9656e37d802027635ace88c4cc5", 5359144), + EN_GRB, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adi4", + "ADI 4.10", + AD_ENTRY1s("intro.stk", "6afc2590856433b9f5295b032f2b205d", 5923112), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adi4", + "ADI 4.11", + AD_ENTRY1s("intro.stk", "6296e4be4e0c270c24d1330881900c7f", 5921234), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adi4", + "Addy 4.21", + AD_ENTRY1s("intro.stk", "534f0b674cd4830df94a9c32c4ea7225", 6878034), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "ADI 4.21", + AD_ENTRY1s("intro.stk", "c5b9f6222c0b463f51dab47317c5b687", 5950490), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0 Interactive Demo", + AD_ENTRY1s("intro.stk", "89ace204dbaac001425c73f394334f6f", 2413102), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "adi4", + "Adi 4.0 / Adibou 2 Demo", + AD_ENTRY1s("intro.stk", "d41d8cd98f00b204e9800998ecf8427e", 0), + FR_FRA, + kPlatformPC, + ADGF_DEMO, + GUIO_NONE + }, + kGameTypeAdi4, + kFeatures640, + 0, 0, 0 + }, + { + { + "ajworld", + "", + AD_ENTRY1s("intro.stk", "e453bea7b28a67c930764d945f64d898", 3913628), + EN_ANY, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "adibou1", + "ADIBOU 1 Environnement 4-7 ans", + AD_ENTRY1s("intro.stk", "6db110188fcb7c5208d9721b5282682a", 4805104), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeAdibou1, + kFeaturesAdLib, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2", + AD_ENTRY1s("intro.stk", "94ae7004348dc8bf99c23a9a6ef81827", 956162), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "Le Jardin Magique d'Adibou", + AD_ENTRY1s("intro.stk", "a8ff86f3cc40dfe5898e0a741217ef27", 956328), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2", + AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), + DE_DEU, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIB\xD9 2", + AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), + IT_ITA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU Version Decouverte", + AD_ENTRY1s("intro.stk", "558c14327b79ed39214b49d567a75e33", 8737856), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2.10 Environnement", + AD_ENTRY1s("intro.stk", "f2b797819aeedee557e904b0b5ccd82e", 8736454), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2.11 Environnement", + AD_ENTRY1s("intro.stk", "7b1f1f6f6477f54401e95d913f75e333", 8736904), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2.12 Environnement", + AD_ENTRY1s("intro.stk", "1e49c39a4a3ce6032a84b712539c2d63", 8738134), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOU 2.13s Environnement", + AD_ENTRY1s("intro.stk", "092707829555f27706920e4cacf1fada", 8737958), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { + { + "adibou2", + "ADIBOO 2.14 Environnement", + AD_ENTRY1s("intro.stk", "ff63637e3cb7f0a457edf79457b1c6b3", 9333874), + FR_FRA, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeAdibou2, + kFeaturesNone, + 0, 0, 0 + }, + { AD_TABLE_END_MARKER, kGameTypeNone, kFeaturesNone, 0, 0, 0} +}; + +static const GOBGameDescription fallbackDescs[] = { + { //0 + { + "gob1", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesNone, + 0, 0, 0 + }, + { //1 + { + "gob1cd", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob1, + kFeaturesCD, + 0, 0, 0 + }, + { //2 + { + "gob2", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { //3 + { + "gob2mac", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesAdLib, + 0, 0, 0 + }, + { //4 + { + "gob2cd", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob2, + kFeaturesCD, + 0, 0, 0 + }, + { //5 + { + "bargon", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBargon, + kFeaturesNone, + 0, 0, 0 + }, + { //6 + { + "gob3", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesAdLib, + 0, 0, 0 + }, + { //7 + { + "gob3cd", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGob3, + kFeaturesCD, + 0, 0, 0 + }, + { //8 + { + "woodruff", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeWoodruff, + kFeatures640, + 0, 0, 0 + }, + { //9 + { + "lostintime", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { //10 + { + "lostintime", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesAdLib, + 0, 0, 0 + }, + { //11 + { + "lostintime", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeLostInTime, + kFeaturesCD, + 0, 0, 0 + }, + { //12 + { + "urban", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeUrban, + kFeaturesCD, + 0, 0, 0 + }, + { //13 + { + "playtoons1", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //14 + { + "playtoons2", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //15 + { + "playtoons3", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //16 + { + "playtoons4", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //17 + { + "playtoons5", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //18 + { + "playtoons construction kit", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypePlaytoons, + kFeatures640, + 0, 0, 0 + }, + { //19 + { + "bambou", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeBambou, + kFeatures640, + 0, 0, 0 + }, + { //20 + { + "fascination", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeFascination, + kFeaturesNone, + "disk0.stk", 0, 0 + }, + { //21 + { + "geisha", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeGeisha, + kFeaturesNone, + "disk1.stk", "intro.tot", 0 + }, + { //22 + { + "adi2", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeAdi2, + kFeatures640, + "adi2.stk", 0, 0 + }, + { //23 + { + "adi4", + "", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSUBTITLES | GUIO_NOSPEECH + }, + kGameTypeAdi4, + kFeatures640, + "adif41.stk", 0, 0 + }, + { //24 + { + "coktelplayer", + "unknown", + AD_ENTRY1(0, 0), + UNK_LANG, + kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + kGameTypeUrban, + kFeaturesAdLib | kFeatures640 | kFeaturesSCNDemo, + "", "", 8 + } +}; + +static const ADFileBasedFallback fileBased[] = { + { &fallbackDescs[ 0], { "intro.stk", "disk1.stk", "disk2.stk", "disk3.stk", "disk4.stk", 0 } }, + { &fallbackDescs[ 1], { "intro.stk", "gob.lic", 0 } }, + { &fallbackDescs[ 2], { "intro.stk", 0 } }, + { &fallbackDescs[ 2], { "intro.stk", "disk2.stk", "disk3.stk", 0 } }, + { &fallbackDescs[ 3], { "intro.stk", "disk2.stk", "disk3.stk", "musmac1.mid", 0 } }, + { &fallbackDescs[ 4], { "intro.stk", "gobnew.lic", 0 } }, + { &fallbackDescs[ 5], { "intro.stk", "scaa.imd", "scba.imd", "scbf.imd", 0 } }, + { &fallbackDescs[ 6], { "intro.stk", "imd.itk", 0 } }, + { &fallbackDescs[ 7], { "intro.stk", "mus_gob3.lic", 0 } }, + { &fallbackDescs[ 8], { "intro.stk", "woodruff.itk", 0 } }, + { &fallbackDescs[ 9], { "intro.stk", "commun1.itk", 0 } }, + { &fallbackDescs[10], { "intro.stk", "commun1.itk", "musmac1.mid", 0 } }, + { &fallbackDescs[11], { "intro.stk", "commun1.itk", "lost.lic", 0 } }, + { &fallbackDescs[12], { "intro.stk", "cd1.itk", "objet1.itk", 0 } }, + { &fallbackDescs[13], { "playtoon.stk", "archi.stk", 0 } }, + { &fallbackDescs[14], { "playtoon.stk", "spirou.stk", 0 } }, + { &fallbackDescs[15], { "playtoon.stk", "chato.stk", 0 } }, + { &fallbackDescs[16], { "playtoon.stk", "manda.stk", 0 } }, + { &fallbackDescs[17], { "playtoon.stk", "wakan.stk", 0 } }, + { &fallbackDescs[18], { "playtoon.stk", "dan.itk" } }, + { &fallbackDescs[19], { "intro.stk", "bambou.itk", 0 } }, + { &fallbackDescs[20], { "disk0.stk", "disk1.stk", "disk2.stk", "disk3.stk", 0 } }, + { &fallbackDescs[21], { "disk1.stk", "disk2.stk", "disk3.stk", 0 } }, + { &fallbackDescs[22], { "adi2.stk", 0 } }, + { &fallbackDescs[23], { "adif41.stk", "adim41.stk", 0 } }, + { &fallbackDescs[24], { "coktelplayer.scn", 0 } }, + { 0, { 0 } } +}; + +} -- cgit v1.2.3 From 560809e42c16425a80d2bddeeb8a13b49ad4f498 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:15:08 +0000 Subject: Split out detection tables for AGI engine svn-id: r49693 --- engines/agi/detection.cpp | 838 +-------------------------------------- engines/agi/detection_tables.h | 861 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 862 insertions(+), 837 deletions(-) create mode 100644 engines/agi/detection_tables.h diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index 1c2638fc89..fa21925b78 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -125,841 +125,7 @@ static const PlainGameDescriptor agiGames[] = { {0, 0} }; - -namespace Agi { - -using Common::GUIO_NONE; - -#define GAME_LVFPN(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \ - { \ - id, \ - name, \ - AD_ENTRY1s(fname,md5,size), \ - lang, \ - platform, \ - ADGF_NO_FLAGS, \ - GUIO_NONE \ - }, \ - gid, \ - interp, \ - features, \ - ver, \ - } - -#define GAME_LVFPNF(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \ - { \ - id, \ - name, \ - AD_ENTRY1s(fname,md5,size), \ - lang, \ - platform, \ - ADGF_USEEXTRAASTITLE, \ - GUIO_NONE \ - }, \ - gid, \ - interp, \ - features, \ - ver, \ - } - -#define GAME(id,name,md5,ver,gid) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2) -#define GAME3(id,name,fname,md5,ver,gid) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V3) - -#define GAME_P(id,name,md5,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_V2) - -#define GAME_FP(id,name,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V2) - -#define GAME_PS(id,name,md5,size,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,Common::EN_ANY,ver,0,gid,platform,GType_V2) - -#define GAME_LPS(id,name,md5,size,lang,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,0,gid,platform,GType_V2) - -#define GAME_LFPS(id,name,md5,size,lang,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,flags,gid,platform,GType_V2) - -#define GAME3_P(id,name,fname,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V3) - -#define GAMEpre_P(id,name,fname,md5,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) - -#define GAMEpre_PS(id,name,fname,md5,size,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) - -#define GAME3_PS(id,name,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) - -#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPNF(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) - -#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPNF(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) -#define FANMADE_SVP(name,md5,size,ver,platform) FANMADE_ISVP("agi-fanmade",name,md5,size,ver,platform) - -#define FANMADE_LVF(name,md5,lang,ver,features) FANMADE_ILVF("agi-fanmade",name,md5,lang,ver,features) - -#define FANMADE_LF(name,md5,lang,features) FANMADE_LVF(name,md5,lang,0x2917,features) -#define FANMADE_IF(id,name,md5,features) FANMADE_ILVF(id,name,md5,Common::EN_ANY,0x2917,features) - -#define FANMADE_V(name,md5,ver) FANMADE_LVF(name,md5,Common::EN_ANY,ver,0) -#define FANMADE_F(name,md5,features) FANMADE_LF(name,md5,Common::EN_ANY,features) -#define FANMADE_L(name,md5,lang) FANMADE_LF(name,md5,lang,0) -#define FANMADE_I(id,name,md5) FANMADE_IF(id,name,md5,0) - -#define FANMADE(name,md5) FANMADE_F(name,md5,0) - -static const AGIGameDescription gameDescriptions[] = { - - // AGI Demo 1 (PC) 05/87 [AGI 2.425] - GAME("agidemo", "Demo 1 1987-05-20", "9c4a5b09cc3564bc48b4766e679ea332", 0x2440, GID_AGIDEMO), - - // AGI Demo 2 (IIgs) 1.0C (Censored) - GAME_P("agidemo", "Demo 2 1987-11-24 1.0C", "580ffdc569ff158f56fb92761604f70e", 0x2917, GID_AGIDEMO, Common::kPlatformApple2GS), - - // AGI Demo 2 (PC 3.5") 11/87 [AGI 2.915] - GAME("agidemo", "Demo 2 1987-11-24 3.5\"", "e8ebeb0bbe978172fe166f91f51598c7", 0x2917, GID_AGIDEMO), - - // AGI Demo 2 (PC 5.25") 11/87 [v1] [AGI 2.915] - GAME("agidemo", "Demo 2 1987-11-24 [version 1] 5.25\"", "852ac303a374df62571642ca1e2d1f0a", 0x2917, GID_AGIDEMO), - - // AGI Demo 2 (PC 5.25") 01/88 [v2] [AGI 2.917] - GAME("agidemo", "Demo 2 1987-11-25 [version 2] 5.25\"", "1503f02086ea9f388e7e041c039eaa69", 0x2917, GID_AGIDEMO), - - // AGI Demo 3 (PC) 09/88 [AGI 3.002.102] - GAME3("agidemo", "Demo 3 1988-09-13", "dmdir", "289c7a2c881f1d973661e961ced77d74", 0x3149, GID_AGIDEMO), - - // AGI Demo for Kings Quest III and Space Quest I - GAME("agidemo", "Demo Kings Quest III and Space Quest I", "502e6bf96827b6c4d3e67c9cdccd1033", 0x2272, GID_AGIDEMO), - - // Black Cauldron (Amiga) 2.00 6/14/87 - GAME_P("bc", "2.00 1987-06-14", "7b01694af21213b4727bb94476f64eb5", 0x2440, GID_BC, Common::kPlatformAmiga), - - // Black Cauldron (Apple IIgs) 1.0O 2/24/89 (CE) - // Menus not tested - GAME3_P("bc", "1.0O 1989-02-24 (CE)", "bcdir", "dc09d30b147242692f4f85b9811962db", 0x3149, 0, GID_BC, Common::kPlatformApple2GS), - - // Black Cauldron (PC) 2.00 6/14/87 [AGI 2.439] - GAME("bc", "2.00 1987-06-14", "7f598d4712319b09d7bd5b3be10a2e4a", 0x2440, GID_BC), - - // Black Cauldron (Russian) - GAME_LPS("bc", "", "b7de782dfdf8ea7dde8064f09804bcf5", 357, Common::RU_RUS, 0x2440, GID_BC, Common::kPlatformPC), - - // Black Cauldron (PC 5.25") 2.10 11/10/88 [AGI 3.002.098] - GAME3("bc", "2.10 1988-11-10 5.25\"", "bcdir", "0c5a9acbcc7e51127c34818e75806df6", 0x3149, GID_BC), - - // Black Cauldron (PC) 2.10 [AGI 3.002.097] - GAME3("bc", "2.10", "bcdir", "0de3953c9225009dc91e5b0d1692967b", 0x3149, GID_BC), - - // Black Cauldron (CoCo3 360k) [AGI 2.023] - GAME_PS("bc", "", "51212c54808ade96176f201ae0ac7a6f", 357, 0x2440, GID_BC, Common::kPlatformCoCo3), - - // Black Cauldron (CoCo3 360k) [AGI 2.072] - GAME_PS("bc", "updated", "c4e1937f74e8100cd0152b904434d8b4", 357, 0x2440, GID_BC, Common::kPlatformCoCo3), - -// TODO -// These aren't supposed to work now as they require unsupported agi engine 2.01 -#if 0 - // Donald Duck's Playground (Amiga) 1.0C - // Menus not tested - GAME_P("ddp", "1.0C 1987-04-27", "550971d196f65190a5c760d2479406ef", 0x2272, GID_DDP, Common::kPlatformAmiga), - - // Donald Duck's Playground (ST) 1.0A 8/8/86 - // Menus not tested - GAME("ddp", "1.0A 1986-08-08", "64388812e25dbd75f7af1103bc348596", 0x2272, GID_DDP), - - // reported by Filippos (thebluegr) in bugreport #1654500 - // Menus not tested - GAME_PS("ddp", "1.0C 1986-06-09", "550971d196f65190a5c760d2479406ef", 132, 0x2272, GID_DDP, Common::kPlatformPC), -#endif - - // Gold Rush! (Amiga) 1.01 1/13/89 aka 2.05 3/9/89 # 2.316 - GAME3_PS("goldrush", "1.01 1989-01-13 aka 2.05 1989-03-09", "dirs", "a1d4de3e75c2688c1e2ca2634ffc3bd8", 2399, 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAmiga), - - // Gold Rush! (Apple IIgs) 1.0M 2/28/89 (CE) aka 2.01 12/22/88 - // Menus not tested - GAME3_P("goldrush", "1.0M 1989-02-28 (CE) aka 2.01 1988-12-22", "grdir", "3f7b9ce62631434389f85371b11921d6", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformApple2GS), - - // Gold Rush! (ST) 1.01 1/13/89 aka 2.01 12/22/88 - GAME3_P("goldrush", "1.01 1989-01-13 aka 2.01 1988-12-22", "grdir", "4dd4d50480a3d6c206fa227ce8142735", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAtariST), - - // Gold Rush! (PC 5.25") 2.01 12/22/88 [AGI 3.002.149] - GAME3("goldrush", "2.01 1988-12-22 5.25\"", "grdir", "db733d199238d4009a9e95f11ece34e9", 0x3149, GID_GOLDRUSH), - - // Gold Rush! (PC 3.5") 2.01 12/22/88 [AGI 3.002.149] - GAME3("goldrush", "2.01 1988-12-22 3.5\"", "grdir", "6a285235745f69b4b421403659497216", 0x3149, GID_GOLDRUSH), - - // Gold Rush! (PC 3.5", bought from The Software Farm) 3.0 1998-12-22 [AGI 3.002.149] - GAME3("goldrush", "3.0 1998-12-22 3.5\"", "grdir", "6882b6090473209da4cd78bb59f78dbe", 0x3149, GID_GOLDRUSH), - - { - // Gold Rush! (PC 5.25") 2.01 12/22/88 [AGI 3.002.149] - { - "goldrush", - "2.01 1988-12-22", - { - { "grdir", 0, "db733d199238d4009a9e95f11ece34e9", 2399}, - { "vol.0", 0, "4b6423d143674d3757ab1b875d25951d", 25070}, - { NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_GOLDRUSH, - GType_V3, - GF_MACGOLDRUSH, - 0x3149, - }, - - - // Gold Rush! (CoCo3 720k) [AGI 2.023] - GAME_PS("goldrush", "", "0a41b65efc0cd6c4271e957e6ffbbd8e", 744, 0x2440, GID_GOLDRUSH, Common::kPlatformCoCo3), - - // Gold Rush! (CoCo3 360k/720k) [AGI 2.072] - GAME_PS("goldrush", "updated", "c49bf56bf91e31a4601a604e51ef8bfb", 744, 0x2440, GID_GOLDRUSH, Common::kPlatformCoCo3), - - // King's Quest 1 (Amiga) 1.0U # 2.082 - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("kq1", "1.0U 1986", "246c695324f1c514aee2b904fa352fad", 0x2440, GF_MENUS, GID_KQ1, Common::kPlatformAmiga), - - // King's Quest 1 (ST) 1.0V - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("kq1", "1.0V 1986", "c3a017e556c4b0eece366a4cd9abb657", 0x2272, GF_MENUS, GID_KQ1, Common::kPlatformAtariST), - - // King's Quest 1 (IIgs) 1.0S-88223 - // Menus not tested - GAME_P("kq1", "1.0S 1988-02-23", "f4277aa34b43d37382bc424c81627617", 0x2272, GID_KQ1, Common::kPlatformApple2GS), - - // King's Quest 1 (Mac) 2.0C - GAME_P("kq1", "2.0C 1987-03-26", "d4c4739d4ac63f7dbd29255425077d48", 0x2440, GID_KQ1, Common::kPlatformMacintosh), - - // King's Quest 1 (PC 5.25"/3.5") 2.0F [AGI 2.917] - GAME("kq1", "2.0F 1987-05-05 5.25\"/3.5\"", "10ad66e2ecbd66951534a50aedcd0128", 0x2917, GID_KQ1), - - // King's Quest 1 (CoCo3 360k) [AGI 2.023] - GAME_PS("kq1", "", "10ad66e2ecbd66951534a50aedcd0128", 315, 0x2440, GID_KQ1, Common::kPlatformCoCo3), - - // King's Quest 1 (CoCo3 360k) [AGI 2.023] - GAME_PS("kq1", "fixed", "4c8ef8b5d2f1b6c1a93e456d1f1ffc74", 768, 0x2440, GID_KQ1, Common::kPlatformCoCo3), - - // King's Quest 1 (CoCo3 360k) [AGI 2.072] - GAME_PS("kq1", "updated", "94087178c78933a4af3cd24d1c8dd7b2", 315, 0x2440, GID_KQ1, Common::kPlatformCoCo3), - - // King's Quest 2 (IIgs) 2.0A 6/16/88 (CE) - GAME_P("kq2", "2.0A 1988-06-16 (CE)", "5203c8b95250a2ecfee93ddb99414753", 0x2917, GID_KQ2, Common::kPlatformApple2GS), - - // King's Quest 2 (Amiga) 2.0J (Broken) - GAME_P("kq2", "2.0J 1987-01-29 [OBJECT decrypted]", "b866f0fab2fad91433a637a828cfa410", 0x2440, GID_KQ2, Common::kPlatformAmiga), - - // King's Quest 2 (Mac) 2.0R - GAME_P("kq2", "2.0R 1988-03-23", "cbdb0083317c8e7cfb7ac35da4bc7fdc", 0x2440, GID_KQ2, Common::kPlatformMacintosh), - - // King's Quest 2 (PC) 2.1 [AGI 2.411]; entry from DAGII, but missing from Sarien? - // XXX: any major differences from 2.411 to 2.440? - GAME("kq2", "2.1 1987-04-10", "759e39f891a0e1d86dd29d7de485c6ac", 0x2440, GID_KQ2), - - // King's Quest 2 (PC 5.25"/3.5") 2.2 [AGI 2.426] - GAME("kq2", "2.2 1987-05-07 5.25\"/3.5\"", "b944c4ff18fb8867362dc21cc688a283", 0x2917, GID_KQ2), - - // King's Quest 2 (Russian) - GAME_LPS("kq2", "", "35211c574ececebdc723b23e35f99275", 543, Common::RU_RUS, 0x2917, GID_KQ2, Common::kPlatformPC), - - // King's Quest 2 (CoCo3 360k) [AGI 2.023] - GAME_PS("kq2", "", "b944c4ff18fb8867362dc21cc688a283", 543, 0x2440, GID_KQ2, Common::kPlatformCoCo3), - - // King's Quest 2 (CoCo3 360k) [AGI 2.072] - GAME_PS("kq2", "updated", "f64a606de740a5348f3d125c03e989fe", 543, 0x2440, GID_KQ2, Common::kPlatformCoCo3), - - // King's Quest 2 (CoCo3 360k) [AGI 2.023] - GAME_PS("kq2", "fixed", "fb33ac2768a94a89117a270771db465c", 768, 0x2440, GID_KQ2, Common::kPlatformCoCo3), - - // King's Quest 3 (Amiga) 1.01 11/8/86 - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("kq3", "1.01 1986-11-08", "8ab343306df0e2d98f136be4e8cfd0ef", 0x2440, GF_MENUS, GID_KQ3, Common::kPlatformAmiga), - - // King's Quest 3 (ST) 1.02 11/18/86 - // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game - GAME_FP("kq3", "1.02 1986-11-18", "8846df2654302b623217ba8bd6d657a9", 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformAtariST), - - // King's Quest 3 (Mac) 2.14 3/15/88 - GAME_P("kq3", "2.14 1988-03-15", "7639c0da5ce94848227d409351fabda2", 0x2440, GID_KQ3, Common::kPlatformMacintosh), - - // King's Quest 3 (IIgs) 2.0A 8/28/88 (CE) - GAME_P("kq3", "2.0A 1988-08-28 (CE)", "ac30b7ca5a089b5e642fbcdcbe872c12", 0x2917, GID_KQ3, Common::kPlatformApple2GS), - - // King's Quest 3 (Amiga) 2.15 11/15/89 # 2.333 - // Original pauses with ESC, has menus accessible with mouse. - // ver = 0x3086 -> menus accessible with ESC or mouse, bug #2835581 (KQ3: Game Crash When Leaving Tavern as Fly). - // ver = 0x3149 -> menus accessible with mouse, ESC pauses game, bug #2835581 disappears. - GAME3_PS("kq3", "2.15 1989-11-15", "dirs", "8e35bded2bc5cf20f5eec2b15523b155", 1805, 0x3149, 0, GID_KQ3, Common::kPlatformAmiga), - - // King's Quest 3 (PC) 1.01 11/08/86 [AGI 2.272] - // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game - GAME_FP("kq3", "1.01 1986-11-08", "9c2b34e7ffaa89c8e2ecfeb3695d444b", 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformPC), - - // King's Quest 3 (Russian) - GAME_LFPS("kq3", "", "5856dec6ccb9c4b70aee21044a19270a", 390, Common::RU_RUS, 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformPC), - - // King's Quest 3 (PC 5.25") 2.00 5/25/87 [AGI 2.435] - GAME("kq3", "2.00 1987-05-25 5.25\"", "18aad8f7acaaff760720c5c6885b6bab", 0x2440, GID_KQ3), - - // King's Quest 3 (Mac) 2.14 3/15/88 - // Menus not tested - GAME_P("kq3", "2.14 1988-03-15 5.25\"", "7650e659c7bc0f1e9f8a410b7a2e9de6", 0x2440, GID_KQ3, Common::kPlatformMacintosh), - - // King's Quest 3 (PC 3.5") 2.14 3/15/88 [AGI 2.936] - GAME("kq3", "2.14 1988-03-15 3.5\"", "d3d17b77b3b3cd13246749231d9473cd", 0x2936, GID_KQ3), - - // King's Quest 3 (CoCo3 158k/360k) [AGI 2.023] - GAME_PS("kq3", "", "5a6be7d16b1c742c369ef5cc64fefdd2", 429, 0x2440, GID_KQ3, Common::kPlatformCoCo3), - - // King's Quest 4 (PC 5.25") 2.0 7/27/88 [AGI 3.002.086] - GAME3("kq4", "2.0 1988-07-27", "kq4dir", "f50f7f997208ca0e35b2650baec43a2d", 0x3086, GID_KQ4), - - // King's Quest 4 (PC 3.5") 2.0 7/27/88 [AGI 3.002.086] - GAME3("kq4", "2.0 1988-07-27 3.5\"", "kq4dir", "fe44655c42f16c6f81046fdf169b6337", 0x3086, GID_KQ4), - - // King's Quest 4 (PC 3.5") 2.2 9/27/88 [AGI 3.002.086] - // Menus not tested - GAME3("kq4", "2.2 1988-09-27 3.5\"", "kq4dir", "7470b3aeb49d867541fc66cc8454fb7d", 0x3086, GID_KQ4), - - // King's Quest 4 (PC 5.25") 2.3 9/27/88 [AGI 3.002.086] - GAME3("kq4", "2.3 1988-09-27", "kq4dir", "6d7714b8b61466a5f5981242b993498f", 0x3086, GID_KQ4), - - // King's Quest 4 (PC 3.5") 2.3 9/27/88 [AGI 3.002.086] - GAME3("kq4", "2.3 1988-09-27 3.5\"", "kq4dir", "82a0d39af891042e99ac1bd6e0b29046", 0x3086, GID_KQ4), - - // King's Quest 4 (IIgs) 1.0K 11/22/88 (CE) - // Menus not tested - GAME3_P("kq4", "1.0K 1988-11-22", "kq4dir", "8536859331159f15012e35dc82cb154e", 0x3086, 0, GID_KQ4, Common::kPlatformApple2GS), - - // King's Quest 4 demo (PC) [AGI 3.002.102] - // Menus not tested - GAME3("kq4", "Demo 1988-12-20", "dmdir", "a3332d70170a878469d870b14863d0bf", 0x3149, GID_KQ4), - - // King's Quest 4 (CoCo3 720k) [AGI 2.023] - GAME_PS("kq4", "", "9e7729a28e749ca241d2bf71b9b2dbde", 741, 0x2440, GID_KQ4, Common::kPlatformCoCo3), - - // King's Quest 4 (CoCo3 360k/720k) [AGI 2.072] - GAME_PS("kq4", "updated", "1959ca10739edb34069bb504dbd74805", 741, 0x2440, GID_KQ4, Common::kPlatformCoCo3), - - // Leisure Suit Larry 1 (PC 5.25"/3.5") 1.00 6/1/87 [AGI 2.440] - GAME("lsl1", "1.00 1987-06-01 5.25\"/3.5\"", "1fe764e66857e7f305a5f03ca3f4971d", 0x2440, GID_LSL1), - - // Leisure Suit Larry 1 Polish - GAME_LPS("lsl1", "2.00 2001-12-11", "7ba1fccc46d27c141e704706c1d0a85f", 303, Common::PL_POL, 0x2440, GID_LSL1, Common::kPlatformPC), - - // Leisure Suit Larry 1 Polish - Demo - GAME_LPS("lsl1", "Demo", "3b2f564306c401dff6334441df967ddd", 666, Common::PL_POL, 0x2917, GID_LSL1, Common::kPlatformPC), - - // Leisure Suit Larry 1 (ST) 1.04 6/18/87 - GAME_P("lsl1", "1.04 1987-06-18", "8b579f8673fe9448c2538f5ed9887cf0", 0x2440, GID_LSL1, Common::kPlatformAtariST), - - // Leisure Suit Larry 1 (Amiga) 1.05 6/26/87 # x.yyy - GAME_P("lsl1", "1.05 1987-06-26", "3f5d26d8834ca49c147fb60936869d56", 0x2440, GID_LSL1, Common::kPlatformAmiga), - - // Leisure Suit Larry 1 (IIgs) 1.0E - GAME_P("lsl1", "1.0E 1987", "5f9e1dd68d626c6d303131c119582ad4", 0x2440, GID_LSL1, Common::kPlatformApple2GS), - - // Leisure Suit Larry 1 (Mac) 1.05 6/26/87 - GAME_P("lsl1", "1.05 1987-06-26", "8a0076429890531832f0dc113285e31e", 0x2440, GID_LSL1, Common::kPlatformMacintosh), - - // Leisure Suit Larry 1 (CoCo3 158k/360k) [AGI 2.072] - GAME_PS("lsl1", "", "a2de1fe76565c3e8b40c9d036b5e5612", 198, 0x2440, GID_LSL1, Common::kPlatformCoCo3), - - // Manhunter NY (ST) 1.03 10/20/88 - GAME3_P("mh1", "1.03 1988-10-20", "mhdir", "f2d58056ad802452d60776ee920a52a6", 0x3149, 0, GID_MH1, Common::kPlatformAtariST), - - // Manhunter NY (IIgs) 2.0E 10/05/88 (CE) - GAME3_P("mh1", "2.0E 1988-10-05 (CE)", "mhdir", "2f1509f76f24e6e7d213f2dadebbf156", 0x3149, 0, GID_MH1, Common::kPlatformApple2GS), - - // Manhunter NY (Amiga) 1.06 3/18/89 - GAME3_P("mh1", "1.06 1989-03-18", "dirs", "92c6183042d1c2bb76236236a7d7a847", 0x3149, GF_OLDAMIGAV20, GID_MH1, Common::kPlatformAmiga), - - // reported by Filippos (thebluegr) in bugreport #1654500 - // Manhunter NY (PC 5.25") 1.22 8/31/88 [AGI 3.002.107] - GAME3_PS("mh1", "1.22 1988-08-31", "mhdir", "0c7b86f05fe02c2e26cff1b07450b82a", 2123, 0x3149, 0, GID_MH1, Common::kPlatformPC), - - // Manhunter NY (PC 3.5") 1.22 8/31/88 [AGI 3.002.102] - GAME3_PS("mh1", "1.22 1988-08-31", "mhdir", "5b625329021ad49fd0c1d6f2d6f54bba", 2141, 0x3149, 0, GID_MH1, Common::kPlatformPC), - - // Manhunter NY (CoCo3 720k) [AGI 2.023] - GAME_PS("mh1", "", "b968285caf2f591c78dd9c9e26ab8974", 495, 0x2440, GID_MH1, Common::kPlatformCoCo3), - - // Manhunter NY (CoCo3 360k/720k) [AGI 2.072] - GAME_PS("mh1", "updated", "d47da950c62289f8d4ccf36af73365f2", 495, 0x2440, GID_MH1, Common::kPlatformCoCo3), - - // Manhunter SF (ST) 1.0 7/29/89 - GAME3_P("mh2", "1.0 1989-07-29", "mh2dir", "5e3581495708b952fea24438a6c7e040", 0x3149, 0, GID_MH1, Common::kPlatformAtariST), - - // Manhunter SF (Amiga) 3.06 8/17/89 # 2.333 - GAME3_PS("mh2", "3.06 1989-08-17", "dirs", "b412e8a126368b76696696f7632d4c16", 2573, 0x3086, GF_OLDAMIGAV20, GID_MH2, Common::kPlatformAmiga), - - // Manhunter SF (PC 5.25") 3.03 8/17/89 [AGI 3.002.149] - GAME3("mh2", "3.03 1989-08-17 5.25\"", "mh2dir", "b90e4795413c43de469a715fb3c1fa93", 0x3149, GID_MH2), - - // Manhunter SF (PC 3.5") 3.02 7/26/89 [AGI 3.002.149] - GAME3("mh2", "3.02 1989-07-26 3.5\"", "mh2dir", "6fb6f0ee2437704c409cf17e081ba152", 0x3149, GID_MH2), - - // Manhunter SF (CoCo3 720k) [AGI 2.023] - GAME_PS("mh2", "", "acaaa577e10d1753c5a74f6ae1d858d4", 591, 0x2440, GID_MH2, Common::kPlatformCoCo3), - - // Manhunter SF (CoCo3 720k) [AGI 2.072] - GAME_PS("mh2", "updated", "c64875766700196e72a92359f70f45a9", 591, 0x2440, GID_MH2, Common::kPlatformCoCo3), - - // Mickey's Space Adventure - // Preagi game - GAMEpre_P("mickey", "", "1.pic", "b6ec04c91a05df374792872c4d4ce66d", 0x0000, GID_MICKEY, Common::kPlatformPC), - -#if 0 - // Mixed-Up Mother Goose (Amiga) 1.1 - // Problematic: crashes - // Menus not tested - GAME3_PS("mixedup", "1.1 1986-12-10", "dirs", "5c1295fe6daaf95831195ba12894dbd9", 2021, 0x3086, 0, GID_MIXEDUP, Common::kPlatformAmiga), -#endif - - // Mixed Up Mother Goose (IIgs) - GAME_P("mixedup", "1987", "3541954a7303467c6df87665312ffb6a", 0x2917, GID_MIXEDUP, Common::kPlatformApple2GS), - - // Mixed-Up Mother Goose (PC) [AGI 2.915] - GAME("mixedup", "1987-11-10", "e524655abf9b96a3b179ffcd1d0f79af", 0x2917, GID_MIXEDUP), - - // Mixed-Up Mother Goose (CoCo3 360k) [AGI 2.072] - GAME_PS("mixedup", "", "44e63e9b4d4822a31edea0e8a7e7eac4", 606, 0x2440, GID_MIXEDUP, Common::kPlatformCoCo3), - - // Police Quest 1 (PC) 2.0E 11/17/87 [AGI 2.915] - GAME("pq1", "2.0E 1987-11-17", "2fd992a92df6ab0461d5a2cd83c72139", 0x2917, GID_PQ1), - - // Police Quest 1 (Mac) 2.0G 12/3/87 - GAME_P("pq1", "2.0G 1987-12-03", "805750b66c1c5b88a214e67bfdca17a1", 0x2440, GID_PQ1, Common::kPlatformMacintosh), - - // Police Quest 1 (IIgs) 2.0B-88421 - GAME_P("pq1", "2.0B 1988-04-21", "e7c175918372336461e3811d594f482f", 0x2917, GID_PQ1, Common::kPlatformApple2GS), - - // Police Quest 1 (Amiga) 2.0B 2/22/89 # 2.310 - GAME3_PS("pq1", "2.0B 1989-02-22", "dirs", "cfa93e5f2aa7378bddd10ad6746a2ffb", 1613, 0x3149, 0, GID_PQ1, Common::kPlatformAmiga), - - // Police Quest 1 (IIgs) 2.0A-88318 - GAME_P("pq1", "2.0A 1988-03-18", "8994e39d0901de3d07cecfb954075bb5", 0x2917, GID_PQ1, Common::kPlatformApple2GS), - - // Police Quest 1 (PC) 2.0A 10/23/87 [AGI 2.903/2.911] - GAME("pq1", "2.0A 1987-10-23", "b9dbb305092851da5e34d6a9f00240b1", 0x2917, GID_PQ1), - - // Police Quest 1 (Russian) - GAME_LPS("pq1", "", "604cc8041d24c4c7e5fa8baf386ef76e", 360, Common::RU_RUS, 0x2917, GID_PQ1, Common::kPlatformPC), - - // Police Quest 1 2.0G 12/3/87 - GAME("pq1", "2.0G 1987-12-03 5.25\"/ST", "231f3e28170d6e982fc0ced4c98c5c1c", 0x2440, GID_PQ1), - - // Police Quest 1 (PC) 2.0G 12/3/87; entry from DAGII, but missing from Sarien? - // not sure about disk format -- dsymonds - GAME("pq1", "2.0G 1987-12-03", "d194e5d88363095f55d5096b8e32fbbb", 0x2917, GID_PQ1), - - // Police Quest 1 (CoCo3 360k) [AGI 2.023] - GAME_PS("pq1", "", "28a077041f75aab78f66804800940085", 375, 0x2440, GID_PQ1, Common::kPlatformCoCo3), - - // Police Quest 1 (CoCo3 360k) [AGI 2.072] - GAME_PS("pq1", "updated", "63b9a9c6eec154751dd446cd3693e0e2", 768, 0x2440, GID_PQ1, Common::kPlatformCoCo3), - - // Space Quest 1 (ST) 1.1A - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("sq1", "1.1A 1986-02-06", "6421fb64b0e6604c9dd065975d9279e9", 0x2440, GF_MENUS, GID_SQ1, Common::kPlatformAtariST), - - // Space Quest 1 (PC 360k) 1.1A [AGI 2.272] - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("sq1", "1.1A 1986-11-13", "8d8c20ab9f4b6e4817698637174a1cb6", 0x2272, GF_MENUS, GID_SQ1, Common::kPlatformPC), - - // Space Quest 1 (PC 720k) 1.1A [AGI 2.272] - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("sq1", "1.1A 720kb", "0a92b1be7daf3bb98caad3f849868aeb", 0x2272, GF_MENUS, GID_SQ1, Common::kPlatformPC), - - // Space Quest 1 (Amiga) 1.2 # 2.082 - // The original game did not have menus, they are enabled under ScummVM - GAME_FP("sq1", "1.2 1986", "0b216d931e95750f1f4837d6a4b821e5", 0x2440, GF_MENUS | GF_OLDAMIGAV20, GID_SQ1, Common::kPlatformAmiga), - - // Space Quest 1 (Mac) 1.5D - GAME_P("sq1", "1.5D 1987-04-02", "ce88419aadd073d1c6682d859b3d8aa2", 0x2440, GID_SQ1, Common::kPlatformMacintosh), - - // Space Quest 1 (IIgs) 2.2 - GAME_P("sq1", "2.2 1987", "64b9b3d04c1066d36e6a6e56187a83f7", 0x2917, GID_SQ1, Common::kPlatformApple2GS), - - // Space Quest 1 (PC) 1.0X [AGI 2.089] - // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game - GAME_FP("sq1", "1.0X 1986-09-24", "af93941b6c51460790a9efa0e8cb7122", 0x2089, GF_ESCPAUSE, GID_SQ1, Common::kPlatformPC), - - // Space Quest 1 (Russian) - GAME_LFPS("sq1", "", "a279eb8ddbdefdb1ea6adc827a1d632a", 372, Common::RU_RUS, 0x2089, GF_ESCPAUSE, GID_SQ1, Common::kPlatformPC), - - // Space Quest 1 (PC 5.25"/3.5") 2.2 [AGI 2.426/2.917] - GAME("sq1", "2.2 1987-05-07 5.25\"/3.5\"", "5d67630aba008ec5f7f9a6d0a00582f4", 0x2440, GID_SQ1), - - // Space Quest 1 (CoCo3 360k) [AGI 2.072] - GAME_PS("sq1", "", "5d67630aba008ec5f7f9a6d0a00582f4", 372, 0x2440, GID_SQ1, Common::kPlatformCoCo3), - - // Space Quest 1 (CoCo3 360k) [AGI 2.023] - GAME_PS("sq1", "fixed", "ca822b768b6462e410423ea7f498daee", 768, 0x2440, GID_SQ1, Common::kPlatformCoCo3), - - // Space Quest 1 (CoCo3 360k) [AGI 2.072] - GAME_PS("sq1", "updated", "7fa54e6bb7ffeb4cf20eca39d86f5fb2", 387, 0x2440, GID_SQ1, Common::kPlatformCoCo3), - - // Space Quest 2 (PC 3.5") 2.0D [AGI 2.936] - GAME("sq2", "2.0D 1988-03-14 3.5\"", "85390bde8958c39830e1adbe9fff87f3", 0x2936, GID_SQ2), - - // Space Quest 2 (IIgs) 2.0A 7/25/88 (CE) - GAME_P("sq2", "2.0A 1988-07-25 (CE)", "5dfdac98dd3c01fcfb166529f917e911", 0x2936, GID_SQ2, Common::kPlatformApple2GS), - - { - // Space Quest 2 (Amiga) 2.0F - { - "sq2", - "2.0F 1986-12-09 [VOL.2->PICTURE.16 broken]", - { - { "logdir", 0, "28add5125484302d213911df60d2aded", 426}, - { "object", 0, "5dc52be721257719f4b311a84ce22b16", 372}, - { NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_SQ2, - GType_V2, - 0, - 0x2936, - }, - - - // Space Quest 2 (Mac) 2.0D - GAME_P("sq2", "2.0D 1988-04-04", "bfbebe0b59d83f931f2e1c62ce9484a7", 0x2936, GID_SQ2, Common::kPlatformMacintosh), - - // reported by Filippos (thebluegr) in bugreport #1654500 - // Space Quest 2 (PC 5.25") 2.0A [AGI 2.912] - GAME_PS("sq2", "2.0A 1987-11-06 5.25\"", "ad7ce8f800581ecc536f3e8021d7a74d", 423, 0x2917, GID_SQ2, Common::kPlatformPC), - - // Space Quest 2 (Russian) - GAME_LPS("sq2", "", "ba21c8934caf28e3ba45ce7d1cd6b041", 423, Common::RU_RUS, 0x2917, GID_SQ2, Common::kPlatformPC), - - // Space Quest 2 (PC 3.5") 2.0A [AGI 2.912] - GAME_PS("sq2", "2.0A 1987-11-06 3.5\"", "6c25e33d23b8bed42a5c7fa63d588e5c", 423, 0x2917, GID_SQ2, Common::kPlatformPC), - - // Space Quest 2 (PC 5.25"/ST) 2.0C/A [AGI 2.915] - // Menus not tested - GAME("sq2", "2.0C/A 5.25\"/ST", "bd71fe54869e86945041700f1804a651", 0x2917, GID_SQ2), - - // Space Quest 2 (PC 3.5") 2.0F [AGI 2.936] - GAME("sq2", "2.0F 1989-01-05 3.5\"", "28add5125484302d213911df60d2aded", 0x2936, GID_SQ2), - - // Space Quest 2 (CoCo3 360k) [AGI 2.023] - GAME_PS("sq2", "", "12973d39b892dc9d280257fd271e9597", 768, 0x2440, GID_SQ2, Common::kPlatformCoCo3), - - // Space Quest 2 (CoCo3 360k) [AGI 2.072] - GAME_PS("sq2", "updated", "d24f19b047e65e1763eff4b46f3d50df", 768, 0x2440, GID_SQ2, Common::kPlatformCoCo3), - - // Troll's Tale - GAMEpre_PS("troll", "", "troll.img", "62903f264b3d849be4214b3a5c42a2fa", 184320, 0x0000, GID_TROLL, Common::kPlatformPC), - - // Winnie the Pooh in the Hundred Acre Wood - GAMEpre_P("winnie", "", "title.pic", "2e7900c1ccaa7671d65405f6d1efed30", 0x0000, GID_WINNIE, Common::kPlatformPC), - - // Winnie the Pooh in the Hundred Acre Wood (Amiga) - GAMEpre_P("winnie", "", "title", "2e7900c1ccaa7671d65405f6d1efed30", 0x0000, GID_WINNIE, Common::kPlatformAmiga), - - // Winnie the Pooh in the Hundred Acre Wood (C64) - GAMEpre_P("winnie", "", "title.pic", "d4eb97cffc866110f71e1ec9f84fe643", 0x0000, GID_WINNIE, Common::kPlatformC64), - - // Winnie the Pooh in the Hundred Acre Wood (Apple //gs) - GAMEpre_P("winnie", "", "title.pic", "45e06010a3c61d78f4661103c901ae11", 0x0000, GID_WINNIE, Common::kPlatformApple2GS), - - // Xmas Card 1986 (PC) [AGI 2.272] - GAME("xmascard", "1986-11-13 [version 1]", "3067b8d5957e2861e069c3c0011bd43d", 0x2272, GID_XMASCARD), - - // Xmas Card 1986 (CoCo3 360k) [AGI 2.072] - GAME_PS("xmascard", "", "25ad35e9628fc77e5e0dd35852a272b6", 768, 0x2440, GID_XMASCARD, Common::kPlatformCoCo3), - - FANMADE_F("2 Player Demo", "4279f46b3cebd855132496476b1d2cca", GF_AGIMOUSE), - FANMADE("AGI Contest 1 Template", "d879aed25da6fc655564b29567358ae2"), - FANMADE("AGI Contest 2 Template", "5a2fb2894207eff36c72f5c1b08bcc07"), - FANMADE("AGI Mouse Demo 0.60 demo 1", "c07e2519de674c67386cb2cc6f2e3904"), - FANMADE("AGI Mouse Demo 0.60 demo 2", "cc49d8b88ed6faf4f53ce92c84e0fe1b"), - FANMADE("AGI Mouse Demo 0.70", "3497c291e4afb6f758e61740678a2aec"), - FANMADE_F("AGI Mouse Demo 1.00", "20397f0bf0ef936f416bb321fb768fc7", GF_AGIMOUSE), - FANMADE_F("AGI Mouse Demo 1.10", "f4ad396b496d6167635ad0b410312ab8", GF_AGIMOUSE|GF_AGIPAL), - FANMADE("AGI Piano (v1.0)", "8778b3d89eb93c1d50a70ef06ef10310"), - FANMADE("AGI Quest (v1.46-TJ0)", "1cf1a5307c1a0a405f5039354f679814"), - FANMADE_I("tetris", "", "7a874e2db2162e7a4ce31c9130248d8a"), - FANMADE_V("AGI Trek (Demo)", "c02882b8a8245b629c91caf7eb78eafe", 0x2440), - FANMADE_F("AGI256 Demo", "79261ac143b2e2773b2753674733b0d5", GF_AGI256), - FANMADE_F("AGI256-2 Demo", "3cad9b3aff1467cebf0c5c5b110985c5", GF_AGI256_2), - FANMADE_LF("Abrah: L'orphelin de l'espace (v1.2)", "b7b6d1539e14d5a26fa3088288e1badc", Common::FR_FRA, GF_AGIPAL), - FANMADE("Acidopolis", "7017db1a4b726d0d59e65e9020f7d9f7"), - FANMADE("Agent 0055 (v1.0)", "c2b34a0c77acb05482781dda32895f24"), - FANMADE("Agent 06 vs. The Super Nazi", "136f89ca9f117c617e88a85119777529"), - FANMADE("Agent Quest", "59e49e8f72058a33c00d60ee1097e631"), - FANMADE("Al Pond - On Holiday (v1.0)", "a84975496b42d485920e886e92eed68b"), - FANMADE("Al Pond - On Holiday (v1.1)", "7c95ac4689d0c3bfec61e935f3093634"), - FANMADE("Al Pond - On Holiday (v1.3)", "8f30c260de9e1dd3d8b8f89cc19d2633"), - FANMADE("Al Pond 1 - Al Lives Forever (v1.0)", "e8921c3043b749b056ff51f56d1b451b"), - FANMADE("Al Pond 1 - Al Lives Forever (v1.3)", "fb4699474054962e0dbfb4cf12ca52f6"), - FANMADE("Apocalyptic Quest (v0.03 Teaser)", "42ced528b67965d3bc3b52c635f94a57"), - FANMADE_F("Apocalyptic Quest (v4.00 Alpha 1)", "e15581628d84949b8d352d224ec3184b", GF_AGIMOUSE), - FANMADE_F("Apocalyptic Quest (v4.00 Alpha 2)", "0eee850005860e46345b38fea093d194", GF_AGIMOUSE), - FANMADE_F("Band Quest (Demo)", "7326abefd793571cc17ed0db647bdf34", GF_AGIMOUSE), - FANMADE_F("Band Quest (Early Demo)", "de4758dd34676b248c8301b32d93bc6f", GF_AGIMOUSE), - FANMADE("Beyond the Titanic 2", "9b8de38dc64ffb3f52b7877ea3ebcef9"), - FANMADE("Biri Quest 1", "1b08f34f2c43e626c775c9d6649e2f17"), - FANMADE("Bob The Farmboy", "e4b7df9d0830addee5af946d380e66d7"), - FANMADE_F("Boring Man 1: The Toad to Robinland", "d74481cbd227f67ace37ce6a5493039f", GF_AGIMOUSE), - FANMADE_F("Boring Man 2: Ho Man! This Game Sucks!", "250032ba105bdf7c1bc4fed767c2d37e", GF_AGIMOUSE), - FANMADE("Botz", "a8fabe4e807adfe5ec02bfec6d983695"), - FANMADE("Brian's Quest (v1.0)", "0964aa79b9cdcff7f33a12b1d7e04b9c"), - FANMADE("CPU-21 (v1.0)", "35b7cdb4d17e890e4c52018d96e9cbf4"), - FANMADE_I("caitlyn", "Demo", "5b8a3cdb2fc05469f8119d49f50fbe98"), - FANMADE_I("caitlyn", "", "818469c484cae6dad6f0e9a353f68bf8"), - FANMADE("Car Driver (v1.1)", "2311611d2d36d20ccc9da806e6cba157"), - FANMADE("Cloak of Darkness (v1.0)", "5ba6e18bf0b53be10db8f2f3831ee3e5"), - FANMADE("Coco Coq (English) - Coco Coq In Grostesteing's Base (v.1.0.3)", "97631f8e710544a58bd6da9e780f9320"), - FANMADE_L("Coco Coq (French) - Coco Coq Dans la Base de Grostesteing (v1.0.2)", "ef579ebccfe5e356f9a557eb3b2d8649", Common::FR_FRA), - FANMADE("Corby's Murder Mystery (v1.0)", "4ebe62ac24c5a8c7b7898c8eb070efe5"), - FANMADE_F("DG: The AGIMouse Adventure (English v1.1)", "efe453b92bc1487ea69fbebede4d5f26", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_LF("DG: The AGIMouse Adventure (French v1.1)", "eb3d17ca466d672cbb95947e8d6e846a", Common::FR_FRA, GF_AGIMOUSE|GF_AGIPAL), - FANMADE("DG: The Adventure Game (English v1.1)", "0d6376d493fa7a21ec4da1a063e12b25"), - FANMADE_L("DG: The Adventure Game (French v1.1)", "258bdb3bb8e61c92b71f2f456cc69e23", Common::FR_FRA), - FANMADE("Dashiki (16 Colors)", "9b2c7b9b0283ab9f12bedc0cb6770a07"), - FANMADE_F("Dashiki (256 Colors)", "c68052bb209e23b39b55ff3d759958e6", GF_AGIMOUSE|GF_AGI256), - FANMADE("Date Quest 1 (v1.0)", "ba3dcb2600645be53a13170aa1a12e69"), - FANMADE("Date Quest 2 (v1.0 Demo)", "1602d6a2874856e928d9a8c8d2d166e9"), - FANMADE("Date Quest 2 (v1.0)", "f13f6fc85aa3e6e02b0c20408fb63b47"), - FANMADE("Dave's Quest (v0.07)", "f29c3660de37bacc1d23547a167f27c9"), - FANMADE("Dave's Quest (v0.17)", "da3772624cc4a86f7137db812f6d7c39"), - FANMADE("Disco Nights (Demo)", "dc5a2b21182ba38bdcd992a3a978e690"), - FANMADE("Dogs Quest - The Quest for the Golden Bone (v1.0)", "f197357edaaea0ff70880602d2f09b3e"), - FANMADE("Dr. Jummybummy's Space Adventure", "988bd81785f8a452440a2a8ac67f96aa"), - FANMADE("Ed Ward", "98be839b9f30cbedea4c9cee5442d827"), - FANMADE("Elfintard", "c3b847e9e9e978af9708df76a0751dc2"), - FANMADE("Enclosure (v1.01)", "f08e66fee9ecdde77db7ee9a10c96ba2"), - FANMADE("Enclosure (v1.03)", "e4a0613ed02401502e506ba3565a8c40"), - FANMADE_SVP("Enclosure", "fe98e6126db74c6cc6fd8fe395cc6e8c", 345, 0x2440, Common::kPlatformCoCo3), - FANMADE("Epic Fighting (v0.1)", "aff24a1b3bdd676187685c4d95ba4294"), - FANMADE("Escape Quest (v0.0.3)", "2346b65619b1da0298b715b06d1a45a1"), - FANMADE("Escape from the Desert (beta 1)", "dfdc634d340854bd6ece28024010758d"), - FANMADE("Escape from the Salesman", "e723ca4fe0f6f56affe039fbb4dbeb6c"), - FANMADE("Fu$k Quest 1 (final)", "1cd0587422313f6ca77d6a95988e88ed"), - FANMADE("Fu$k Quest 1", "1cd0587422313f6ca77d6a95988e88ed"), - FANMADE("Fu$k Quest 2 - Romancing the Bone (Teaser)", "d288355d71d9bb1639260ccaa3b2fbfe"), - FANMADE("Fu$k Quest 2 - Romancing the Bone", "294beeb7765c7ea6b05ed7b9bf7bff4f"), - FANMADE("Gennadi Tahab Autot - Mission Pack 1 - Kuressaare", "bfa5fe71978e6ccf3d4eedd430124015"), - FANMADE("Go West, Young Hippie", "ff31484ea465441cb5f3a0f8e956b716"), - FANMADE("Good Man (demo v3.41)", "3facd8a8f856b7b6e0f6c3200274d88c"), - - { - // Groza - { - "agi-fanmade", - "Groza (russian) [AGDS sample]", - AD_ENTRY1("logdir", "421da3a18004122a966d64ab6bd86d2e"), - Common::RU_RUS, - Common::kPlatformPC, - ADGF_USEEXTRAASTITLE, - GUIO_NONE - }, - GID_FANMADE, - GType_V2, - GF_AGDS, - 0x2440, - }, - - { - // Get Outta SQ - { - "agi-fanmade", - "Get Outta Space Quest", - AD_ENTRY1("logdir", "aaea5b4a348acb669d13b0e6f22d4dc9"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_USEEXTRAASTITLE, - GUIO_NONE - }, - GID_GETOUTTASQ, - GType_V2, - 0, - 0x2440, - }, - - FANMADE_F("Half-Death - Terror At White-Mesa", "b62c05d0ace878261392073f57ae788c", GF_AGIMOUSE), - FANMADE("Hank's Quest (v1.0 English) - Victim of Society", "64c15b3d0483d17888129100dc5af213"), - FANMADE("Hank's Quest (v1.1 English) - Victim of Society", "86d1f1dd9b0c4858d096e2a60cca8a14"), - FANMADE_L("Hank's Quest (v1.81 Dutch) - Slachtoffer Van Het Gebeuren", "41e53972d55ff3dff9e90d15fe1b659f", Common::NL_NLD), - FANMADE("Hank's Quest (v1.81 English) - Victim of Society", "7a776383282f62a57c3a960dafca62d1"), - FANMADE("Herbao (v0.2)", "6a5186fc8383a9060517403e85214fc2"), - FANMADE_F("Hitler's Legacy (v.0004q)", "a412881269ba34584bd0a3268e5a9863", GF_AGIMOUSE), - FANMADE("Hobbits", "4a1c1ef3a7901baf0ab45fde0cfadd89"), - FANMADE_F("Isabella Coq - A Present For My Dad", "55c6819f2330c4d5d6459874c9f123d9", GF_AGIMOUSE), - FANMADE("Jack & Julia - VAMPYR", "8aa0b9a26f8d5a4421067ab8cc3706f6"), - FANMADE("Jeff's Quest (v.5 alpha Jun 1)", "10f1720eed40c12b02a0f32df3e72ded"), - FANMADE("Jeff's Quest (v.5 alpha May 31)", "51ff71c0ed90db4e987a488ed3bf0551"), - FANMADE("Jen's Quest (Demo 1)", "361afb5bdb6160213a1857245e711939"), - FANMADE("Jen's Quest (Demo 2)", "3c321eee33013b289ab8775449df7df2"), - FANMADE("Jiggy Jiggy Uh! Uh!", "bc331588a71e7a1c8840f6cc9b9487e4"), - FANMADE("Jimmy In: The Alien Attack (v0.1)", "a4e9db0564a494728de7873684a4307c"), - FANMADE("Joe McMuffin In \"What's Cooking, Doc\" (v1.0)", "8a3de7e61a99cb605fa6d233dd91c8e1"), - FANMADE_LVF("Jolimie, le Village Maudit (v0.5)", "21818501636b3cb8ad5de5c1a66de5c2", Common::FR_FRA, 0x2936, GF_AGIMOUSE|GF_AGIPAL), - FANMADE_LVF("Jolimie, le Village Maudit (v1.1)", "68d7aef1161bb5972fe03efdf29ccb7f", Common::FR_FRA, 0x2936, GF_AGIMOUSE|GF_AGIPAL), - FANMADE("Journey Of Chef", "aa0a0b5a6364801ae65fdb96d6741df5"), - FANMADE("Jukebox (v1.0)", "c4b9c5528cc67f6ba777033830de7751"), - FANMADE("Justin Quest (v1.0 in development)", "103050989da7e0ffdc1c5e1793a4e1ec"), - FANMADE("J\xf5ulumaa (v0.05) (Estonian)", "53982ecbfb907e41392b3961ad1c3475"), - FANMADE("Kings Quest 2 - Breast Intentions (v2.0 Mar 26)", "a25d7379d281b1b296d4785df90a8e78"), - FANMADE("Kings Quest 2 - Breast Intentions (v2.0 Aug 16)", "6b4f796d0421d2e12e501b511962e03a"), - FANMADE("Lasse Holm: The Quest for Revenge (v1.0)", "f9fbcc8a4ef510bfbb92423296ff4abb"), - FANMADE("Lawman for Hire", "c78b28bfd3767dd455b992cd8b7854fa"), - FANMADE("Lefty Goes on Vacation (Not in The Right Place)", "ccdc49a33870310b01f2c48b8a1f3c34"), - FANMADE("Les Ins\xe3parables (v1.0)", "4b780887cab0ecabc5eca319acb3acf2"), - FANMADE("Little Pirate (Demo 2 v0.6)", "437068efe4ec32d436da09d6f2ea56e1"), - FANMADE("Lost Eternity (v1.0)", "95f15c5632feb8a39e9ca3d9af35fcc9"), - FANMADE("MD Quest - The Search for Michiel (v0.10)", "2a6fcb21d2b5e4144c38ed817fabe8ee"), - FANMADE("Maale Adummin Quest", "ddfbeb33feb7cf78504fe4dba14ec63b"), - FANMADE("Monkey Man", "2322d03f997e8cc235d4578efff69cfa"), - FANMADE_F("Napalm Quest (v0.5)", "b659afb491d967bb34810d1c6ce22093", GF_AGIMOUSE), - FANMADE("Naturette 1 (English v1.2)", "0a75884e7f010974a230bdf269651117"), - FANMADE("Naturette 1 (English v1.3)", "f15bbf999ac55ebd404aa1eb84f7c1d9"), - FANMADE_L("Naturette 1 (French v1.2)", "d3665622cc41aeb9c7ecf4fa43f20e53", Common::FR_FRA), - FANMADE_F("Naturette 2: Daughter of the Moon (v1.0)", "bdf76a45621c7f56d1c9d40292c6137a", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_F("Naturette 3: Adventure in Treeworld (v1.0a)", "6dbb0e7fc75fec442e6d9e5a06f1530e", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_F("Naturette 4: From a Planet to Another Planet (Not Finished)", "13be8cd9cf35aeff0a39b8757057fbc8", GF_AGIMOUSE), - // FIXME: Actually Naturette 4 has both English and French language support built into it. How to add that information? - FANMADE_F("Naturette 4: From a Planet to Another Planet (2007-10-05)", "8253706b6ef5423a79413b216760297c", GF_AGIMOUSE|GF_AGIPAL), - FANMADE("New AGI Hangman Test", "d69c0e9050ccc29fd662b74d9fc73a15"), - FANMADE("Nick's Quest - In Pursuit of QuakeMovie (v2.1 Gold)", "e29cbf9222551aee40397fabc83eeca0"), - FANMADE_F("Open Mic Night (v0.1)", "70000a2f67aac27d1133d019df70246d", GF_AGIMOUSE|GF_AGIPAL), - FANMADE("Operation: Recon", "0679ce8405411866ccffc8a6743370d0"), - FANMADE("Patrick's Quest (Demo v1.0)", "f254f5b894b98fec5f92acc07fb62841"), - FANMADE("Phantasmagoria", "87d20c1c11aee99a4baad3797b63146b"), - FANMADE("Pharaoh Quest (v0.0)", "51c630899d076cf799e573dadaa2276d"), - FANMADE("Phil's Quest - the Search for Tolbaga", "5e7ca45c360e03164b8358e49900c588"), - FANMADE("Pinkun Maze Quest (v0.1)", "148ff0843af389928b3939f463bfd20d"), - FANMADE("Pirate Quest", "bb612a919ed2b9ea23bbf03ce69fed42"), - FANMADE("Pothead (v0.1)", "d181101385d3a45082f418cd4b3c5b01"), - FANMADE("President's Quest", "4937d0e8ecadb7888faeb347799b0388"), - FANMADE("Prince Quest", "266248d75c3130c8ccc9c9bf2ad30a0d"), - FANMADE("Professor (English) - The Professor is Missing (Mar 17)", "6232de31cc204affdf2e92dfe3dc0e4d"), - FANMADE("Professor (English) - The Professor is Missing (Mar 22)", "b5fcf0ca2f0d1c073be82f01e2170961"), - FANMADE_L("Professor (French) - Le Professeur a Disparu", "7d9f8a4d4610bb9b0b97caa17590c2d3", Common::FR_FRA), - FANMADE("Quest for Glory VI - Hero's Adventure", "d26765c3075064c80d284c5e06e33a7e"), - FANMADE("Quest for Home", "d2895dc1cd3930f2489af0f843b144b3"), - FANMADE("Quest for Ladies (demo v1.1 Apr 1)", "3f6e02f16e1154a0daf296c8895edd97"), - FANMADE("Quest for Ladies (demo v1.1 Apr 6)", "f75e7b6a0769a3fa926eea0854711591"), - FANMADE("Quest for Piracy 1 - Enter the Silver Pirate (v0.15)", "d23f5c2a26f6dc60c686f8a2436ea4a6"), - FANMADE("Quest for a Record Deal", "f4fbd7abf056d2d3204f790da5ac89ab"), - FANMADE("Ralph's Quest (v0.1)", "5cf56378aa01a26ec30f25295f0750ca"), - FANMADE("Residence 44 Quest (Dutch v0.99)", "7c5cc64200660c70240053b33d379d7d"), - FANMADE("Residence 44 Quest (English v0.99)", "fe507851fddc863d540f2bec67cc67fd"), - FANMADE("Residence 44 Quest (English v1.0a)", "f99e3f69dc8c77a45399da9472ef5801"), - FANMADE("SQ2Eye (v0.3)", "2be2519401d38ad9ce8f43b948d093a3"), - // FANMADE("SQ2Eye (v0.4)", "2be2519401d38ad9ce8f43b948d093a3"), - FANMADE("SQ2Eye (v0.41)", "f0e82c55f10eb3542d7cd96c107ae113"), - FANMADE("SQ2Eye (v0.42)", "d7beae55f6328ef8b2da47b1aafea40c"), - FANMADE("SQ2Eye (v0.43)", "2a895f06e45de153bb4b77c982009e06"), - FANMADE("SQ2Eye (v0.44)", "5174fc4b6d8a477ba0ff0575cd64e0aa"), - FANMADE("SQ2Eye (v0.45)", "6e06f8bb7b90ce6f6aabf1a0e620159c"), - FANMADE("SQ2Eye (v0.46)", "bf0ad7a035ff9113951d09d1efe380c4"), - FANMADE("SQ2Eye (v0.47)", "85dc3be1d33ff932c292b74f9037abaa"), - FANMADE("SQ2Eye (v0.48)", "587574252972a5b5c070a647973a9b4a"), - FANMADE("SQ2Eye (v0.481)", "fc9234beb49804ae869696ce5af8ef30"), - FANMADE("SQ2Eye (v0.482)", "3ed84b7b87fa6840f25c15f250a11ffb"), - FANMADE("SQ2Eye (v0.483)", "647c31298d3f9cda641231b893e347c0"), - FANMADE("SQ2Eye (v0.484)", "f2c86fae7b9046d408c62c8c49a4b882"), - FANMADE("SQ2Eye (v0.485)", "af59e36bc28f44545458b68a93e91e67"), - FANMADE("SQ2Eye (v0.486)", "3fd86436e93456770dbdd4593eded70a"), - FANMADE("Save Santa (v1.0)", "4644f6beb5802081772f14be56ae196c"), - FANMADE("Save Santa (v1.3)", "f8afdb6efc5af5e7c0228b44633066af"), - FANMADE("Schiller (preview 1)", "ade39dea968c959cfebe1cf935d653e9"), - FANMADE("Schiller (preview 2)", "62cd1f8fc758bf6b4aa334e553624cef"), - FANMADE_IF("serguei1", "v1.0", "b86725f067e456e10cdbdf5f58e01dec", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei1", "v1.1 2002 Sep 5", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei1", "v1.1 2003 Apr 10", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei2", "v0.1.1 Demo", "906ccbc2ddedb29b63141acc6d10cd28", GF_AGIMOUSE), - FANMADE_IF("serguei2", "v1.3.1 Demo (March 22nd 2008)", "ad1308fcb8f48723cd388e012ebf5e20", GF_AGIMOUSE|GF_AGIPAL), - FANMADE("Shifty (v1.0)", "2a07984d27b938364bf6bd243ac75080"), - FANMADE_F("Sliding Tile Game (v1.00)", "949bfff5d8a81c3139152eed4d84ca75", GF_AGIMOUSE), - FANMADE("Snowboarding Demo (v1.0)", "24bb8f29f1eddb5c0a099705267c86e4"), - FANMADE("Solar System Tour", "b5a3d0f392dfd76a6aa63f3d5f578403"), - FANMADE("Sorceror's Appraisal", "fe62615557b3cb7b08dd60c9d35efef1"), - FANMADE_I("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590"), - FANMADE_I("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6"), - FANMADE_ISVP("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, Common::kPlatformCoCo3), - FANMADE_I("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1"), - FANMADE_I("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910"), - FANMADE_ISVP("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, Common::kPlatformCoCo3), - FANMADE_F("Space Quest 3.5", "c077bc28d7b36213dd99dc9ecb0147fc", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_F("Space Trek (v1.0)", "807a1aeadb2ace6968831d36ab5ea37a", GF_CLIPCOORDS), - FANMADE("Special Delivery", "88764dfe61126b8e73612c851b510a33"), - FANMADE("Speeder Bike Challenge (v1.0)", "2deb25bab379285ca955df398d96c1e7"), - FANMADE("Star Commander 1 - The Escape (v1.0)", "a7806f01e6fa14ebc029faa58f263750"), - FANMADE("Star Pilot: Bigger Fish", "8cb26f8e1c045b75c6576c839d4a0172"), - FANMADE_F("Street Quest (Demo)", "cf2aa94a7eb78dce6892c37f03e310d6", GF_AGIPAL), - FANMADE("Tales of the Tiki", "8103c9c87e3964690a14a3d0d83f7ddc"), - FANMADE("Tex McPhilip 1 - Quest For The Papacy", "3c74b9a24b51aa8020ac82bee3132266"), - FANMADE("Tex McPhilip 2 - Road To Divinity (v1.5)", "7387e8df854440bc26620ca0ea43af9a"), - FANMADE("Tex McPhilip 3 - A Destiny of Sin (Demo v0.25)", "992d12031a486ad84e592ff5d7c9d782"), - FANMADE("The 13th Disciple (v1.00)", "887719ad59afce9a41ec057dbb73ad73"), - FANMADE("The Adventures of a Crazed Hermit", "6e3086cbb794d3299a9c5a9792295511"), - FANMADE("The Grateful Dead", "c2146631afacf8cb455ce24f3d2d46e7"), - FANMADE("The Legend of Shay-Larah 1 - The Lost Prince", "04e720c8e30c9cf12db22ea14a24a3dd"), - FANMADE("The Legend of Zelda: The Fungus of Time (Demo v1.00)", "dcaf8166ceb62a3d9b9aea7f3b197c09"), - FANMADE("The Legendary Harry Soupsmith (Demo 1998 Apr 2)", "64c46b0d6fc135c9835afa80980d2831"), - FANMADE("The Legendary Harry Soupsmith (Demo 1998 Aug 19)", "8d06d82970f2c591d880a95476efbcf0"), - FANMADE("The Long Haired Dude: Encounter of the 18-th Kind", "86ea17b9fc2f3e537a7e40863d352c29"), - FANMADE("The Lost Planet (v0.9)", "590dffcbd932a9fbe554be13b769cac0"), - FANMADE("The Lost Planet (v1.0)", "58564df8b6394612dd4b6f5c0fd68d44"), - FANMADE("The New Adventure of Roger Wilco (v1.00)", "e5f0a7cb8d49f66b89114951888ca688"), - FANMADE("The Ruby Cast (v0.02)", "ed138e461bb1516e097007e017ab62df"), - FANMADE("The Shadow Plan", "c02cd10267e721f4e836b1431f504a0a"), - FANMADE("Time Quest (Demo v0.1)", "12e1a6f03ea4b8c5531acd0400b4ed8d"), - FANMADE("Time Quest (Demo v0.2)", "7b710608abc99e0861ac59b967bf3f6d"), - FANMADE_SVP("Time Quest", "90314f473d8317be5cd1f0306f139aea", 300, 0x2440, Common::kPlatformCoCo3), - FANMADE("Tonight The Shrieking Corpses Bleed (Demo v0.11)", "bcc57a7c8d563fa0c333107ae1c0a6e6"), - FANMADE("Tonight The Shrieking Corpses Bleed (v1.01)", "36b38f621b38e8d104aa0807302dc8c9"), - FANMADE("Turks' Quest - Heir to the Planet", "3d19254b737c8b218e5bc4580542b79a"), - FANMADE("URI Quest (v0.173 Feb 27)", "3986eefcf546dafc45f920ae91a697c3"), - FANMADE("URI Quest (v0.173 Jan 29)", "494150940d34130605a4f2e67ee40b12"), - { - // V - The Graphical Adventure - { - "agi-fanmade", - "V - The Graphical Adventure (Demo 2)", - AD_ENTRY1s("vdir", "c71f5c1e008d352ae9040b77fcf79327", 3080), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_USEEXTRAASTITLE, - GUIO_NONE - }, - GID_FANMADE, - GType_V3, - GF_FANMADE, - 0x3149, - }, - FANMADE_SVP("V - The Graphical Adventure", "1646eaade74f137a9041eb427a389969", 768, 0x2440, Common::kPlatformCoCo3), - - FANMADE("Voodoo Girl - Queen of the Darned (v1.2 2002 Jan 1)", "ae95f0c77d9a97b61420fd192348b937"), - FANMADE("Voodoo Girl - Queen of the Darned (v1.2 2002 Mar 29)", "11d0417b7b886f963d0b36789dac4c8f"), - FANMADE("Wizaro (v0.1)", "abeec1eda6eaf8dbc52443ea97ff140c"), - - { AD_TABLE_END_MARKER, 0, 0, 0, 0 } -}; - -/** - * The fallback game descriptor used by the AGI engine's fallbackDetector. - * Contents of this struct are to be overwritten by the fallbackDetector. - */ -static AGIGameDescription g_fallbackDesc = { - { - "", - "", - AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor - Common::UNK_LANG, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_FANMADE, - GType_V2, - GF_FANMADE, - 0x2917, -}; +#include "agi/detection_tables.h" static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure @@ -984,8 +150,6 @@ static const ADParams detectionParams = { 1 }; -} // End of namespace Agi - using namespace Agi; class AgiMetaEngine : public AdvancedMetaEngine { diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h new file mode 100644 index 0000000000..96cb12cdd2 --- /dev/null +++ b/engines/agi/detection_tables.h @@ -0,0 +1,861 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Agi { + +using Common::GUIO_NONE; + +#define GAME_LVFPN(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \ + { \ + id, \ + name, \ + AD_ENTRY1s(fname,md5,size), \ + lang, \ + platform, \ + ADGF_NO_FLAGS, \ + GUIO_NONE \ + }, \ + gid, \ + interp, \ + features, \ + ver, \ + } + +#define GAME_LVFPNF(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \ + { \ + id, \ + name, \ + AD_ENTRY1s(fname,md5,size), \ + lang, \ + platform, \ + ADGF_USEEXTRAASTITLE, \ + GUIO_NONE \ + }, \ + gid, \ + interp, \ + features, \ + ver, \ + } + +#define GAME(id,name,md5,ver,gid) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2) +#define GAME3(id,name,fname,md5,ver,gid) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V3) + +#define GAME_P(id,name,md5,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_V2) + +#define GAME_FP(id,name,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V2) + +#define GAME_PS(id,name,md5,size,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,Common::EN_ANY,ver,0,gid,platform,GType_V2) + +#define GAME_LPS(id,name,md5,size,lang,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,0,gid,platform,GType_V2) + +#define GAME_LFPS(id,name,md5,size,lang,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,flags,gid,platform,GType_V2) + +#define GAME3_P(id,name,fname,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V3) + +#define GAMEpre_P(id,name,fname,md5,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) + +#define GAMEpre_PS(id,name,fname,md5,size,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) + +#define GAME3_PS(id,name,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) + +#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPNF(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) + +#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPNF(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) +#define FANMADE_SVP(name,md5,size,ver,platform) FANMADE_ISVP("agi-fanmade",name,md5,size,ver,platform) + +#define FANMADE_LVF(name,md5,lang,ver,features) FANMADE_ILVF("agi-fanmade",name,md5,lang,ver,features) + +#define FANMADE_LF(name,md5,lang,features) FANMADE_LVF(name,md5,lang,0x2917,features) +#define FANMADE_IF(id,name,md5,features) FANMADE_ILVF(id,name,md5,Common::EN_ANY,0x2917,features) + +#define FANMADE_V(name,md5,ver) FANMADE_LVF(name,md5,Common::EN_ANY,ver,0) +#define FANMADE_F(name,md5,features) FANMADE_LF(name,md5,Common::EN_ANY,features) +#define FANMADE_L(name,md5,lang) FANMADE_LF(name,md5,lang,0) +#define FANMADE_I(id,name,md5) FANMADE_IF(id,name,md5,0) + +#define FANMADE(name,md5) FANMADE_F(name,md5,0) + +static const AGIGameDescription gameDescriptions[] = { + + // AGI Demo 1 (PC) 05/87 [AGI 2.425] + GAME("agidemo", "Demo 1 1987-05-20", "9c4a5b09cc3564bc48b4766e679ea332", 0x2440, GID_AGIDEMO), + + // AGI Demo 2 (IIgs) 1.0C (Censored) + GAME_P("agidemo", "Demo 2 1987-11-24 1.0C", "580ffdc569ff158f56fb92761604f70e", 0x2917, GID_AGIDEMO, Common::kPlatformApple2GS), + + // AGI Demo 2 (PC 3.5") 11/87 [AGI 2.915] + GAME("agidemo", "Demo 2 1987-11-24 3.5\"", "e8ebeb0bbe978172fe166f91f51598c7", 0x2917, GID_AGIDEMO), + + // AGI Demo 2 (PC 5.25") 11/87 [v1] [AGI 2.915] + GAME("agidemo", "Demo 2 1987-11-24 [version 1] 5.25\"", "852ac303a374df62571642ca1e2d1f0a", 0x2917, GID_AGIDEMO), + + // AGI Demo 2 (PC 5.25") 01/88 [v2] [AGI 2.917] + GAME("agidemo", "Demo 2 1987-11-25 [version 2] 5.25\"", "1503f02086ea9f388e7e041c039eaa69", 0x2917, GID_AGIDEMO), + + // AGI Demo 3 (PC) 09/88 [AGI 3.002.102] + GAME3("agidemo", "Demo 3 1988-09-13", "dmdir", "289c7a2c881f1d973661e961ced77d74", 0x3149, GID_AGIDEMO), + + // AGI Demo for Kings Quest III and Space Quest I + GAME("agidemo", "Demo Kings Quest III and Space Quest I", "502e6bf96827b6c4d3e67c9cdccd1033", 0x2272, GID_AGIDEMO), + + // Black Cauldron (Amiga) 2.00 6/14/87 + GAME_P("bc", "2.00 1987-06-14", "7b01694af21213b4727bb94476f64eb5", 0x2440, GID_BC, Common::kPlatformAmiga), + + // Black Cauldron (Apple IIgs) 1.0O 2/24/89 (CE) + // Menus not tested + GAME3_P("bc", "1.0O 1989-02-24 (CE)", "bcdir", "dc09d30b147242692f4f85b9811962db", 0x3149, 0, GID_BC, Common::kPlatformApple2GS), + + // Black Cauldron (PC) 2.00 6/14/87 [AGI 2.439] + GAME("bc", "2.00 1987-06-14", "7f598d4712319b09d7bd5b3be10a2e4a", 0x2440, GID_BC), + + // Black Cauldron (Russian) + GAME_LPS("bc", "", "b7de782dfdf8ea7dde8064f09804bcf5", 357, Common::RU_RUS, 0x2440, GID_BC, Common::kPlatformPC), + + // Black Cauldron (PC 5.25") 2.10 11/10/88 [AGI 3.002.098] + GAME3("bc", "2.10 1988-11-10 5.25\"", "bcdir", "0c5a9acbcc7e51127c34818e75806df6", 0x3149, GID_BC), + + // Black Cauldron (PC) 2.10 [AGI 3.002.097] + GAME3("bc", "2.10", "bcdir", "0de3953c9225009dc91e5b0d1692967b", 0x3149, GID_BC), + + // Black Cauldron (CoCo3 360k) [AGI 2.023] + GAME_PS("bc", "", "51212c54808ade96176f201ae0ac7a6f", 357, 0x2440, GID_BC, Common::kPlatformCoCo3), + + // Black Cauldron (CoCo3 360k) [AGI 2.072] + GAME_PS("bc", "updated", "c4e1937f74e8100cd0152b904434d8b4", 357, 0x2440, GID_BC, Common::kPlatformCoCo3), + +// TODO +// These aren't supposed to work now as they require unsupported agi engine 2.01 +#if 0 + // Donald Duck's Playground (Amiga) 1.0C + // Menus not tested + GAME_P("ddp", "1.0C 1987-04-27", "550971d196f65190a5c760d2479406ef", 0x2272, GID_DDP, Common::kPlatformAmiga), + + // Donald Duck's Playground (ST) 1.0A 8/8/86 + // Menus not tested + GAME("ddp", "1.0A 1986-08-08", "64388812e25dbd75f7af1103bc348596", 0x2272, GID_DDP), + + // reported by Filippos (thebluegr) in bugreport #1654500 + // Menus not tested + GAME_PS("ddp", "1.0C 1986-06-09", "550971d196f65190a5c760d2479406ef", 132, 0x2272, GID_DDP, Common::kPlatformPC), +#endif + + // Gold Rush! (Amiga) 1.01 1/13/89 aka 2.05 3/9/89 # 2.316 + GAME3_PS("goldrush", "1.01 1989-01-13 aka 2.05 1989-03-09", "dirs", "a1d4de3e75c2688c1e2ca2634ffc3bd8", 2399, 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAmiga), + + // Gold Rush! (Apple IIgs) 1.0M 2/28/89 (CE) aka 2.01 12/22/88 + // Menus not tested + GAME3_P("goldrush", "1.0M 1989-02-28 (CE) aka 2.01 1988-12-22", "grdir", "3f7b9ce62631434389f85371b11921d6", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformApple2GS), + + // Gold Rush! (ST) 1.01 1/13/89 aka 2.01 12/22/88 + GAME3_P("goldrush", "1.01 1989-01-13 aka 2.01 1988-12-22", "grdir", "4dd4d50480a3d6c206fa227ce8142735", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAtariST), + + // Gold Rush! (PC 5.25") 2.01 12/22/88 [AGI 3.002.149] + GAME3("goldrush", "2.01 1988-12-22 5.25\"", "grdir", "db733d199238d4009a9e95f11ece34e9", 0x3149, GID_GOLDRUSH), + + // Gold Rush! (PC 3.5") 2.01 12/22/88 [AGI 3.002.149] + GAME3("goldrush", "2.01 1988-12-22 3.5\"", "grdir", "6a285235745f69b4b421403659497216", 0x3149, GID_GOLDRUSH), + + // Gold Rush! (PC 3.5", bought from The Software Farm) 3.0 1998-12-22 [AGI 3.002.149] + GAME3("goldrush", "3.0 1998-12-22 3.5\"", "grdir", "6882b6090473209da4cd78bb59f78dbe", 0x3149, GID_GOLDRUSH), + + { + // Gold Rush! (PC 5.25") 2.01 12/22/88 [AGI 3.002.149] + { + "goldrush", + "2.01 1988-12-22", + { + { "grdir", 0, "db733d199238d4009a9e95f11ece34e9", 2399}, + { "vol.0", 0, "4b6423d143674d3757ab1b875d25951d", 25070}, + { NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_GOLDRUSH, + GType_V3, + GF_MACGOLDRUSH, + 0x3149, + }, + + + // Gold Rush! (CoCo3 720k) [AGI 2.023] + GAME_PS("goldrush", "", "0a41b65efc0cd6c4271e957e6ffbbd8e", 744, 0x2440, GID_GOLDRUSH, Common::kPlatformCoCo3), + + // Gold Rush! (CoCo3 360k/720k) [AGI 2.072] + GAME_PS("goldrush", "updated", "c49bf56bf91e31a4601a604e51ef8bfb", 744, 0x2440, GID_GOLDRUSH, Common::kPlatformCoCo3), + + // King's Quest 1 (Amiga) 1.0U # 2.082 + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("kq1", "1.0U 1986", "246c695324f1c514aee2b904fa352fad", 0x2440, GF_MENUS, GID_KQ1, Common::kPlatformAmiga), + + // King's Quest 1 (ST) 1.0V + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("kq1", "1.0V 1986", "c3a017e556c4b0eece366a4cd9abb657", 0x2272, GF_MENUS, GID_KQ1, Common::kPlatformAtariST), + + // King's Quest 1 (IIgs) 1.0S-88223 + // Menus not tested + GAME_P("kq1", "1.0S 1988-02-23", "f4277aa34b43d37382bc424c81627617", 0x2272, GID_KQ1, Common::kPlatformApple2GS), + + // King's Quest 1 (Mac) 2.0C + GAME_P("kq1", "2.0C 1987-03-26", "d4c4739d4ac63f7dbd29255425077d48", 0x2440, GID_KQ1, Common::kPlatformMacintosh), + + // King's Quest 1 (PC 5.25"/3.5") 2.0F [AGI 2.917] + GAME("kq1", "2.0F 1987-05-05 5.25\"/3.5\"", "10ad66e2ecbd66951534a50aedcd0128", 0x2917, GID_KQ1), + + // King's Quest 1 (CoCo3 360k) [AGI 2.023] + GAME_PS("kq1", "", "10ad66e2ecbd66951534a50aedcd0128", 315, 0x2440, GID_KQ1, Common::kPlatformCoCo3), + + // King's Quest 1 (CoCo3 360k) [AGI 2.023] + GAME_PS("kq1", "fixed", "4c8ef8b5d2f1b6c1a93e456d1f1ffc74", 768, 0x2440, GID_KQ1, Common::kPlatformCoCo3), + + // King's Quest 1 (CoCo3 360k) [AGI 2.072] + GAME_PS("kq1", "updated", "94087178c78933a4af3cd24d1c8dd7b2", 315, 0x2440, GID_KQ1, Common::kPlatformCoCo3), + + // King's Quest 2 (IIgs) 2.0A 6/16/88 (CE) + GAME_P("kq2", "2.0A 1988-06-16 (CE)", "5203c8b95250a2ecfee93ddb99414753", 0x2917, GID_KQ2, Common::kPlatformApple2GS), + + // King's Quest 2 (Amiga) 2.0J (Broken) + GAME_P("kq2", "2.0J 1987-01-29 [OBJECT decrypted]", "b866f0fab2fad91433a637a828cfa410", 0x2440, GID_KQ2, Common::kPlatformAmiga), + + // King's Quest 2 (Mac) 2.0R + GAME_P("kq2", "2.0R 1988-03-23", "cbdb0083317c8e7cfb7ac35da4bc7fdc", 0x2440, GID_KQ2, Common::kPlatformMacintosh), + + // King's Quest 2 (PC) 2.1 [AGI 2.411]; entry from DAGII, but missing from Sarien? + // XXX: any major differences from 2.411 to 2.440? + GAME("kq2", "2.1 1987-04-10", "759e39f891a0e1d86dd29d7de485c6ac", 0x2440, GID_KQ2), + + // King's Quest 2 (PC 5.25"/3.5") 2.2 [AGI 2.426] + GAME("kq2", "2.2 1987-05-07 5.25\"/3.5\"", "b944c4ff18fb8867362dc21cc688a283", 0x2917, GID_KQ2), + + // King's Quest 2 (Russian) + GAME_LPS("kq2", "", "35211c574ececebdc723b23e35f99275", 543, Common::RU_RUS, 0x2917, GID_KQ2, Common::kPlatformPC), + + // King's Quest 2 (CoCo3 360k) [AGI 2.023] + GAME_PS("kq2", "", "b944c4ff18fb8867362dc21cc688a283", 543, 0x2440, GID_KQ2, Common::kPlatformCoCo3), + + // King's Quest 2 (CoCo3 360k) [AGI 2.072] + GAME_PS("kq2", "updated", "f64a606de740a5348f3d125c03e989fe", 543, 0x2440, GID_KQ2, Common::kPlatformCoCo3), + + // King's Quest 2 (CoCo3 360k) [AGI 2.023] + GAME_PS("kq2", "fixed", "fb33ac2768a94a89117a270771db465c", 768, 0x2440, GID_KQ2, Common::kPlatformCoCo3), + + // King's Quest 3 (Amiga) 1.01 11/8/86 + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("kq3", "1.01 1986-11-08", "8ab343306df0e2d98f136be4e8cfd0ef", 0x2440, GF_MENUS, GID_KQ3, Common::kPlatformAmiga), + + // King's Quest 3 (ST) 1.02 11/18/86 + // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game + GAME_FP("kq3", "1.02 1986-11-18", "8846df2654302b623217ba8bd6d657a9", 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformAtariST), + + // King's Quest 3 (Mac) 2.14 3/15/88 + GAME_P("kq3", "2.14 1988-03-15", "7639c0da5ce94848227d409351fabda2", 0x2440, GID_KQ3, Common::kPlatformMacintosh), + + // King's Quest 3 (IIgs) 2.0A 8/28/88 (CE) + GAME_P("kq3", "2.0A 1988-08-28 (CE)", "ac30b7ca5a089b5e642fbcdcbe872c12", 0x2917, GID_KQ3, Common::kPlatformApple2GS), + + // King's Quest 3 (Amiga) 2.15 11/15/89 # 2.333 + // Original pauses with ESC, has menus accessible with mouse. + // ver = 0x3086 -> menus accessible with ESC or mouse, bug #2835581 (KQ3: Game Crash When Leaving Tavern as Fly). + // ver = 0x3149 -> menus accessible with mouse, ESC pauses game, bug #2835581 disappears. + GAME3_PS("kq3", "2.15 1989-11-15", "dirs", "8e35bded2bc5cf20f5eec2b15523b155", 1805, 0x3149, 0, GID_KQ3, Common::kPlatformAmiga), + + // King's Quest 3 (PC) 1.01 11/08/86 [AGI 2.272] + // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game + GAME_FP("kq3", "1.01 1986-11-08", "9c2b34e7ffaa89c8e2ecfeb3695d444b", 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformPC), + + // King's Quest 3 (Russian) + GAME_LFPS("kq3", "", "5856dec6ccb9c4b70aee21044a19270a", 390, Common::RU_RUS, 0x2272, GF_ESCPAUSE, GID_KQ3, Common::kPlatformPC), + + // King's Quest 3 (PC 5.25") 2.00 5/25/87 [AGI 2.435] + GAME("kq3", "2.00 1987-05-25 5.25\"", "18aad8f7acaaff760720c5c6885b6bab", 0x2440, GID_KQ3), + + // King's Quest 3 (Mac) 2.14 3/15/88 + // Menus not tested + GAME_P("kq3", "2.14 1988-03-15 5.25\"", "7650e659c7bc0f1e9f8a410b7a2e9de6", 0x2440, GID_KQ3, Common::kPlatformMacintosh), + + // King's Quest 3 (PC 3.5") 2.14 3/15/88 [AGI 2.936] + GAME("kq3", "2.14 1988-03-15 3.5\"", "d3d17b77b3b3cd13246749231d9473cd", 0x2936, GID_KQ3), + + // King's Quest 3 (CoCo3 158k/360k) [AGI 2.023] + GAME_PS("kq3", "", "5a6be7d16b1c742c369ef5cc64fefdd2", 429, 0x2440, GID_KQ3, Common::kPlatformCoCo3), + + // King's Quest 4 (PC 5.25") 2.0 7/27/88 [AGI 3.002.086] + GAME3("kq4", "2.0 1988-07-27", "kq4dir", "f50f7f997208ca0e35b2650baec43a2d", 0x3086, GID_KQ4), + + // King's Quest 4 (PC 3.5") 2.0 7/27/88 [AGI 3.002.086] + GAME3("kq4", "2.0 1988-07-27 3.5\"", "kq4dir", "fe44655c42f16c6f81046fdf169b6337", 0x3086, GID_KQ4), + + // King's Quest 4 (PC 3.5") 2.2 9/27/88 [AGI 3.002.086] + // Menus not tested + GAME3("kq4", "2.2 1988-09-27 3.5\"", "kq4dir", "7470b3aeb49d867541fc66cc8454fb7d", 0x3086, GID_KQ4), + + // King's Quest 4 (PC 5.25") 2.3 9/27/88 [AGI 3.002.086] + GAME3("kq4", "2.3 1988-09-27", "kq4dir", "6d7714b8b61466a5f5981242b993498f", 0x3086, GID_KQ4), + + // King's Quest 4 (PC 3.5") 2.3 9/27/88 [AGI 3.002.086] + GAME3("kq4", "2.3 1988-09-27 3.5\"", "kq4dir", "82a0d39af891042e99ac1bd6e0b29046", 0x3086, GID_KQ4), + + // King's Quest 4 (IIgs) 1.0K 11/22/88 (CE) + // Menus not tested + GAME3_P("kq4", "1.0K 1988-11-22", "kq4dir", "8536859331159f15012e35dc82cb154e", 0x3086, 0, GID_KQ4, Common::kPlatformApple2GS), + + // King's Quest 4 demo (PC) [AGI 3.002.102] + // Menus not tested + GAME3("kq4", "Demo 1988-12-20", "dmdir", "a3332d70170a878469d870b14863d0bf", 0x3149, GID_KQ4), + + // King's Quest 4 (CoCo3 720k) [AGI 2.023] + GAME_PS("kq4", "", "9e7729a28e749ca241d2bf71b9b2dbde", 741, 0x2440, GID_KQ4, Common::kPlatformCoCo3), + + // King's Quest 4 (CoCo3 360k/720k) [AGI 2.072] + GAME_PS("kq4", "updated", "1959ca10739edb34069bb504dbd74805", 741, 0x2440, GID_KQ4, Common::kPlatformCoCo3), + + // Leisure Suit Larry 1 (PC 5.25"/3.5") 1.00 6/1/87 [AGI 2.440] + GAME("lsl1", "1.00 1987-06-01 5.25\"/3.5\"", "1fe764e66857e7f305a5f03ca3f4971d", 0x2440, GID_LSL1), + + // Leisure Suit Larry 1 Polish + GAME_LPS("lsl1", "2.00 2001-12-11", "7ba1fccc46d27c141e704706c1d0a85f", 303, Common::PL_POL, 0x2440, GID_LSL1, Common::kPlatformPC), + + // Leisure Suit Larry 1 Polish - Demo + GAME_LPS("lsl1", "Demo", "3b2f564306c401dff6334441df967ddd", 666, Common::PL_POL, 0x2917, GID_LSL1, Common::kPlatformPC), + + // Leisure Suit Larry 1 (ST) 1.04 6/18/87 + GAME_P("lsl1", "1.04 1987-06-18", "8b579f8673fe9448c2538f5ed9887cf0", 0x2440, GID_LSL1, Common::kPlatformAtariST), + + // Leisure Suit Larry 1 (Amiga) 1.05 6/26/87 # x.yyy + GAME_P("lsl1", "1.05 1987-06-26", "3f5d26d8834ca49c147fb60936869d56", 0x2440, GID_LSL1, Common::kPlatformAmiga), + + // Leisure Suit Larry 1 (IIgs) 1.0E + GAME_P("lsl1", "1.0E 1987", "5f9e1dd68d626c6d303131c119582ad4", 0x2440, GID_LSL1, Common::kPlatformApple2GS), + + // Leisure Suit Larry 1 (Mac) 1.05 6/26/87 + GAME_P("lsl1", "1.05 1987-06-26", "8a0076429890531832f0dc113285e31e", 0x2440, GID_LSL1, Common::kPlatformMacintosh), + + // Leisure Suit Larry 1 (CoCo3 158k/360k) [AGI 2.072] + GAME_PS("lsl1", "", "a2de1fe76565c3e8b40c9d036b5e5612", 198, 0x2440, GID_LSL1, Common::kPlatformCoCo3), + + // Manhunter NY (ST) 1.03 10/20/88 + GAME3_P("mh1", "1.03 1988-10-20", "mhdir", "f2d58056ad802452d60776ee920a52a6", 0x3149, 0, GID_MH1, Common::kPlatformAtariST), + + // Manhunter NY (IIgs) 2.0E 10/05/88 (CE) + GAME3_P("mh1", "2.0E 1988-10-05 (CE)", "mhdir", "2f1509f76f24e6e7d213f2dadebbf156", 0x3149, 0, GID_MH1, Common::kPlatformApple2GS), + + // Manhunter NY (Amiga) 1.06 3/18/89 + GAME3_P("mh1", "1.06 1989-03-18", "dirs", "92c6183042d1c2bb76236236a7d7a847", 0x3149, GF_OLDAMIGAV20, GID_MH1, Common::kPlatformAmiga), + + // reported by Filippos (thebluegr) in bugreport #1654500 + // Manhunter NY (PC 5.25") 1.22 8/31/88 [AGI 3.002.107] + GAME3_PS("mh1", "1.22 1988-08-31", "mhdir", "0c7b86f05fe02c2e26cff1b07450b82a", 2123, 0x3149, 0, GID_MH1, Common::kPlatformPC), + + // Manhunter NY (PC 3.5") 1.22 8/31/88 [AGI 3.002.102] + GAME3_PS("mh1", "1.22 1988-08-31", "mhdir", "5b625329021ad49fd0c1d6f2d6f54bba", 2141, 0x3149, 0, GID_MH1, Common::kPlatformPC), + + // Manhunter NY (CoCo3 720k) [AGI 2.023] + GAME_PS("mh1", "", "b968285caf2f591c78dd9c9e26ab8974", 495, 0x2440, GID_MH1, Common::kPlatformCoCo3), + + // Manhunter NY (CoCo3 360k/720k) [AGI 2.072] + GAME_PS("mh1", "updated", "d47da950c62289f8d4ccf36af73365f2", 495, 0x2440, GID_MH1, Common::kPlatformCoCo3), + + // Manhunter SF (ST) 1.0 7/29/89 + GAME3_P("mh2", "1.0 1989-07-29", "mh2dir", "5e3581495708b952fea24438a6c7e040", 0x3149, 0, GID_MH1, Common::kPlatformAtariST), + + // Manhunter SF (Amiga) 3.06 8/17/89 # 2.333 + GAME3_PS("mh2", "3.06 1989-08-17", "dirs", "b412e8a126368b76696696f7632d4c16", 2573, 0x3086, GF_OLDAMIGAV20, GID_MH2, Common::kPlatformAmiga), + + // Manhunter SF (PC 5.25") 3.03 8/17/89 [AGI 3.002.149] + GAME3("mh2", "3.03 1989-08-17 5.25\"", "mh2dir", "b90e4795413c43de469a715fb3c1fa93", 0x3149, GID_MH2), + + // Manhunter SF (PC 3.5") 3.02 7/26/89 [AGI 3.002.149] + GAME3("mh2", "3.02 1989-07-26 3.5\"", "mh2dir", "6fb6f0ee2437704c409cf17e081ba152", 0x3149, GID_MH2), + + // Manhunter SF (CoCo3 720k) [AGI 2.023] + GAME_PS("mh2", "", "acaaa577e10d1753c5a74f6ae1d858d4", 591, 0x2440, GID_MH2, Common::kPlatformCoCo3), + + // Manhunter SF (CoCo3 720k) [AGI 2.072] + GAME_PS("mh2", "updated", "c64875766700196e72a92359f70f45a9", 591, 0x2440, GID_MH2, Common::kPlatformCoCo3), + + // Mickey's Space Adventure + // Preagi game + GAMEpre_P("mickey", "", "1.pic", "b6ec04c91a05df374792872c4d4ce66d", 0x0000, GID_MICKEY, Common::kPlatformPC), + +#if 0 + // Mixed-Up Mother Goose (Amiga) 1.1 + // Problematic: crashes + // Menus not tested + GAME3_PS("mixedup", "1.1 1986-12-10", "dirs", "5c1295fe6daaf95831195ba12894dbd9", 2021, 0x3086, 0, GID_MIXEDUP, Common::kPlatformAmiga), +#endif + + // Mixed Up Mother Goose (IIgs) + GAME_P("mixedup", "1987", "3541954a7303467c6df87665312ffb6a", 0x2917, GID_MIXEDUP, Common::kPlatformApple2GS), + + // Mixed-Up Mother Goose (PC) [AGI 2.915] + GAME("mixedup", "1987-11-10", "e524655abf9b96a3b179ffcd1d0f79af", 0x2917, GID_MIXEDUP), + + // Mixed-Up Mother Goose (CoCo3 360k) [AGI 2.072] + GAME_PS("mixedup", "", "44e63e9b4d4822a31edea0e8a7e7eac4", 606, 0x2440, GID_MIXEDUP, Common::kPlatformCoCo3), + + // Police Quest 1 (PC) 2.0E 11/17/87 [AGI 2.915] + GAME("pq1", "2.0E 1987-11-17", "2fd992a92df6ab0461d5a2cd83c72139", 0x2917, GID_PQ1), + + // Police Quest 1 (Mac) 2.0G 12/3/87 + GAME_P("pq1", "2.0G 1987-12-03", "805750b66c1c5b88a214e67bfdca17a1", 0x2440, GID_PQ1, Common::kPlatformMacintosh), + + // Police Quest 1 (IIgs) 2.0B-88421 + GAME_P("pq1", "2.0B 1988-04-21", "e7c175918372336461e3811d594f482f", 0x2917, GID_PQ1, Common::kPlatformApple2GS), + + // Police Quest 1 (Amiga) 2.0B 2/22/89 # 2.310 + GAME3_PS("pq1", "2.0B 1989-02-22", "dirs", "cfa93e5f2aa7378bddd10ad6746a2ffb", 1613, 0x3149, 0, GID_PQ1, Common::kPlatformAmiga), + + // Police Quest 1 (IIgs) 2.0A-88318 + GAME_P("pq1", "2.0A 1988-03-18", "8994e39d0901de3d07cecfb954075bb5", 0x2917, GID_PQ1, Common::kPlatformApple2GS), + + // Police Quest 1 (PC) 2.0A 10/23/87 [AGI 2.903/2.911] + GAME("pq1", "2.0A 1987-10-23", "b9dbb305092851da5e34d6a9f00240b1", 0x2917, GID_PQ1), + + // Police Quest 1 (Russian) + GAME_LPS("pq1", "", "604cc8041d24c4c7e5fa8baf386ef76e", 360, Common::RU_RUS, 0x2917, GID_PQ1, Common::kPlatformPC), + + // Police Quest 1 2.0G 12/3/87 + GAME("pq1", "2.0G 1987-12-03 5.25\"/ST", "231f3e28170d6e982fc0ced4c98c5c1c", 0x2440, GID_PQ1), + + // Police Quest 1 (PC) 2.0G 12/3/87; entry from DAGII, but missing from Sarien? + // not sure about disk format -- dsymonds + GAME("pq1", "2.0G 1987-12-03", "d194e5d88363095f55d5096b8e32fbbb", 0x2917, GID_PQ1), + + // Police Quest 1 (CoCo3 360k) [AGI 2.023] + GAME_PS("pq1", "", "28a077041f75aab78f66804800940085", 375, 0x2440, GID_PQ1, Common::kPlatformCoCo3), + + // Police Quest 1 (CoCo3 360k) [AGI 2.072] + GAME_PS("pq1", "updated", "63b9a9c6eec154751dd446cd3693e0e2", 768, 0x2440, GID_PQ1, Common::kPlatformCoCo3), + + // Space Quest 1 (ST) 1.1A + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("sq1", "1.1A 1986-02-06", "6421fb64b0e6604c9dd065975d9279e9", 0x2440, GF_MENUS, GID_SQ1, Common::kPlatformAtariST), + + // Space Quest 1 (PC 360k) 1.1A [AGI 2.272] + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("sq1", "1.1A 1986-11-13", "8d8c20ab9f4b6e4817698637174a1cb6", 0x2272, GF_MENUS, GID_SQ1, Common::kPlatformPC), + + // Space Quest 1 (PC 720k) 1.1A [AGI 2.272] + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("sq1", "1.1A 720kb", "0a92b1be7daf3bb98caad3f849868aeb", 0x2272, GF_MENUS, GID_SQ1, Common::kPlatformPC), + + // Space Quest 1 (Amiga) 1.2 # 2.082 + // The original game did not have menus, they are enabled under ScummVM + GAME_FP("sq1", "1.2 1986", "0b216d931e95750f1f4837d6a4b821e5", 0x2440, GF_MENUS | GF_OLDAMIGAV20, GID_SQ1, Common::kPlatformAmiga), + + // Space Quest 1 (Mac) 1.5D + GAME_P("sq1", "1.5D 1987-04-02", "ce88419aadd073d1c6682d859b3d8aa2", 0x2440, GID_SQ1, Common::kPlatformMacintosh), + + // Space Quest 1 (IIgs) 2.2 + GAME_P("sq1", "2.2 1987", "64b9b3d04c1066d36e6a6e56187a83f7", 0x2917, GID_SQ1, Common::kPlatformApple2GS), + + // Space Quest 1 (PC) 1.0X [AGI 2.089] + // Does not have menus, crashes if menus are enforced. Therefore, ESC pauses the game + GAME_FP("sq1", "1.0X 1986-09-24", "af93941b6c51460790a9efa0e8cb7122", 0x2089, GF_ESCPAUSE, GID_SQ1, Common::kPlatformPC), + + // Space Quest 1 (Russian) + GAME_LFPS("sq1", "", "a279eb8ddbdefdb1ea6adc827a1d632a", 372, Common::RU_RUS, 0x2089, GF_ESCPAUSE, GID_SQ1, Common::kPlatformPC), + + // Space Quest 1 (PC 5.25"/3.5") 2.2 [AGI 2.426/2.917] + GAME("sq1", "2.2 1987-05-07 5.25\"/3.5\"", "5d67630aba008ec5f7f9a6d0a00582f4", 0x2440, GID_SQ1), + + // Space Quest 1 (CoCo3 360k) [AGI 2.072] + GAME_PS("sq1", "", "5d67630aba008ec5f7f9a6d0a00582f4", 372, 0x2440, GID_SQ1, Common::kPlatformCoCo3), + + // Space Quest 1 (CoCo3 360k) [AGI 2.023] + GAME_PS("sq1", "fixed", "ca822b768b6462e410423ea7f498daee", 768, 0x2440, GID_SQ1, Common::kPlatformCoCo3), + + // Space Quest 1 (CoCo3 360k) [AGI 2.072] + GAME_PS("sq1", "updated", "7fa54e6bb7ffeb4cf20eca39d86f5fb2", 387, 0x2440, GID_SQ1, Common::kPlatformCoCo3), + + // Space Quest 2 (PC 3.5") 2.0D [AGI 2.936] + GAME("sq2", "2.0D 1988-03-14 3.5\"", "85390bde8958c39830e1adbe9fff87f3", 0x2936, GID_SQ2), + + // Space Quest 2 (IIgs) 2.0A 7/25/88 (CE) + GAME_P("sq2", "2.0A 1988-07-25 (CE)", "5dfdac98dd3c01fcfb166529f917e911", 0x2936, GID_SQ2, Common::kPlatformApple2GS), + + { + // Space Quest 2 (Amiga) 2.0F + { + "sq2", + "2.0F 1986-12-09 [VOL.2->PICTURE.16 broken]", + { + { "logdir", 0, "28add5125484302d213911df60d2aded", 426}, + { "object", 0, "5dc52be721257719f4b311a84ce22b16", 372}, + { NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_SQ2, + GType_V2, + 0, + 0x2936, + }, + + + // Space Quest 2 (Mac) 2.0D + GAME_P("sq2", "2.0D 1988-04-04", "bfbebe0b59d83f931f2e1c62ce9484a7", 0x2936, GID_SQ2, Common::kPlatformMacintosh), + + // reported by Filippos (thebluegr) in bugreport #1654500 + // Space Quest 2 (PC 5.25") 2.0A [AGI 2.912] + GAME_PS("sq2", "2.0A 1987-11-06 5.25\"", "ad7ce8f800581ecc536f3e8021d7a74d", 423, 0x2917, GID_SQ2, Common::kPlatformPC), + + // Space Quest 2 (Russian) + GAME_LPS("sq2", "", "ba21c8934caf28e3ba45ce7d1cd6b041", 423, Common::RU_RUS, 0x2917, GID_SQ2, Common::kPlatformPC), + + // Space Quest 2 (PC 3.5") 2.0A [AGI 2.912] + GAME_PS("sq2", "2.0A 1987-11-06 3.5\"", "6c25e33d23b8bed42a5c7fa63d588e5c", 423, 0x2917, GID_SQ2, Common::kPlatformPC), + + // Space Quest 2 (PC 5.25"/ST) 2.0C/A [AGI 2.915] + // Menus not tested + GAME("sq2", "2.0C/A 5.25\"/ST", "bd71fe54869e86945041700f1804a651", 0x2917, GID_SQ2), + + // Space Quest 2 (PC 3.5") 2.0F [AGI 2.936] + GAME("sq2", "2.0F 1989-01-05 3.5\"", "28add5125484302d213911df60d2aded", 0x2936, GID_SQ2), + + // Space Quest 2 (CoCo3 360k) [AGI 2.023] + GAME_PS("sq2", "", "12973d39b892dc9d280257fd271e9597", 768, 0x2440, GID_SQ2, Common::kPlatformCoCo3), + + // Space Quest 2 (CoCo3 360k) [AGI 2.072] + GAME_PS("sq2", "updated", "d24f19b047e65e1763eff4b46f3d50df", 768, 0x2440, GID_SQ2, Common::kPlatformCoCo3), + + // Troll's Tale + GAMEpre_PS("troll", "", "troll.img", "62903f264b3d849be4214b3a5c42a2fa", 184320, 0x0000, GID_TROLL, Common::kPlatformPC), + + // Winnie the Pooh in the Hundred Acre Wood + GAMEpre_P("winnie", "", "title.pic", "2e7900c1ccaa7671d65405f6d1efed30", 0x0000, GID_WINNIE, Common::kPlatformPC), + + // Winnie the Pooh in the Hundred Acre Wood (Amiga) + GAMEpre_P("winnie", "", "title", "2e7900c1ccaa7671d65405f6d1efed30", 0x0000, GID_WINNIE, Common::kPlatformAmiga), + + // Winnie the Pooh in the Hundred Acre Wood (C64) + GAMEpre_P("winnie", "", "title.pic", "d4eb97cffc866110f71e1ec9f84fe643", 0x0000, GID_WINNIE, Common::kPlatformC64), + + // Winnie the Pooh in the Hundred Acre Wood (Apple //gs) + GAMEpre_P("winnie", "", "title.pic", "45e06010a3c61d78f4661103c901ae11", 0x0000, GID_WINNIE, Common::kPlatformApple2GS), + + // Xmas Card 1986 (PC) [AGI 2.272] + GAME("xmascard", "1986-11-13 [version 1]", "3067b8d5957e2861e069c3c0011bd43d", 0x2272, GID_XMASCARD), + + // Xmas Card 1986 (CoCo3 360k) [AGI 2.072] + GAME_PS("xmascard", "", "25ad35e9628fc77e5e0dd35852a272b6", 768, 0x2440, GID_XMASCARD, Common::kPlatformCoCo3), + + FANMADE_F("2 Player Demo", "4279f46b3cebd855132496476b1d2cca", GF_AGIMOUSE), + FANMADE("AGI Contest 1 Template", "d879aed25da6fc655564b29567358ae2"), + FANMADE("AGI Contest 2 Template", "5a2fb2894207eff36c72f5c1b08bcc07"), + FANMADE("AGI Mouse Demo 0.60 demo 1", "c07e2519de674c67386cb2cc6f2e3904"), + FANMADE("AGI Mouse Demo 0.60 demo 2", "cc49d8b88ed6faf4f53ce92c84e0fe1b"), + FANMADE("AGI Mouse Demo 0.70", "3497c291e4afb6f758e61740678a2aec"), + FANMADE_F("AGI Mouse Demo 1.00", "20397f0bf0ef936f416bb321fb768fc7", GF_AGIMOUSE), + FANMADE_F("AGI Mouse Demo 1.10", "f4ad396b496d6167635ad0b410312ab8", GF_AGIMOUSE|GF_AGIPAL), + FANMADE("AGI Piano (v1.0)", "8778b3d89eb93c1d50a70ef06ef10310"), + FANMADE("AGI Quest (v1.46-TJ0)", "1cf1a5307c1a0a405f5039354f679814"), + FANMADE_I("tetris", "", "7a874e2db2162e7a4ce31c9130248d8a"), + FANMADE_V("AGI Trek (Demo)", "c02882b8a8245b629c91caf7eb78eafe", 0x2440), + FANMADE_F("AGI256 Demo", "79261ac143b2e2773b2753674733b0d5", GF_AGI256), + FANMADE_F("AGI256-2 Demo", "3cad9b3aff1467cebf0c5c5b110985c5", GF_AGI256_2), + FANMADE_LF("Abrah: L'orphelin de l'espace (v1.2)", "b7b6d1539e14d5a26fa3088288e1badc", Common::FR_FRA, GF_AGIPAL), + FANMADE("Acidopolis", "7017db1a4b726d0d59e65e9020f7d9f7"), + FANMADE("Agent 0055 (v1.0)", "c2b34a0c77acb05482781dda32895f24"), + FANMADE("Agent 06 vs. The Super Nazi", "136f89ca9f117c617e88a85119777529"), + FANMADE("Agent Quest", "59e49e8f72058a33c00d60ee1097e631"), + FANMADE("Al Pond - On Holiday (v1.0)", "a84975496b42d485920e886e92eed68b"), + FANMADE("Al Pond - On Holiday (v1.1)", "7c95ac4689d0c3bfec61e935f3093634"), + FANMADE("Al Pond - On Holiday (v1.3)", "8f30c260de9e1dd3d8b8f89cc19d2633"), + FANMADE("Al Pond 1 - Al Lives Forever (v1.0)", "e8921c3043b749b056ff51f56d1b451b"), + FANMADE("Al Pond 1 - Al Lives Forever (v1.3)", "fb4699474054962e0dbfb4cf12ca52f6"), + FANMADE("Apocalyptic Quest (v0.03 Teaser)", "42ced528b67965d3bc3b52c635f94a57"), + FANMADE_F("Apocalyptic Quest (v4.00 Alpha 1)", "e15581628d84949b8d352d224ec3184b", GF_AGIMOUSE), + FANMADE_F("Apocalyptic Quest (v4.00 Alpha 2)", "0eee850005860e46345b38fea093d194", GF_AGIMOUSE), + FANMADE_F("Band Quest (Demo)", "7326abefd793571cc17ed0db647bdf34", GF_AGIMOUSE), + FANMADE_F("Band Quest (Early Demo)", "de4758dd34676b248c8301b32d93bc6f", GF_AGIMOUSE), + FANMADE("Beyond the Titanic 2", "9b8de38dc64ffb3f52b7877ea3ebcef9"), + FANMADE("Biri Quest 1", "1b08f34f2c43e626c775c9d6649e2f17"), + FANMADE("Bob The Farmboy", "e4b7df9d0830addee5af946d380e66d7"), + FANMADE_F("Boring Man 1: The Toad to Robinland", "d74481cbd227f67ace37ce6a5493039f", GF_AGIMOUSE), + FANMADE_F("Boring Man 2: Ho Man! This Game Sucks!", "250032ba105bdf7c1bc4fed767c2d37e", GF_AGIMOUSE), + FANMADE("Botz", "a8fabe4e807adfe5ec02bfec6d983695"), + FANMADE("Brian's Quest (v1.0)", "0964aa79b9cdcff7f33a12b1d7e04b9c"), + FANMADE("CPU-21 (v1.0)", "35b7cdb4d17e890e4c52018d96e9cbf4"), + FANMADE_I("caitlyn", "Demo", "5b8a3cdb2fc05469f8119d49f50fbe98"), + FANMADE_I("caitlyn", "", "818469c484cae6dad6f0e9a353f68bf8"), + FANMADE("Car Driver (v1.1)", "2311611d2d36d20ccc9da806e6cba157"), + FANMADE("Cloak of Darkness (v1.0)", "5ba6e18bf0b53be10db8f2f3831ee3e5"), + FANMADE("Coco Coq (English) - Coco Coq In Grostesteing's Base (v.1.0.3)", "97631f8e710544a58bd6da9e780f9320"), + FANMADE_L("Coco Coq (French) - Coco Coq Dans la Base de Grostesteing (v1.0.2)", "ef579ebccfe5e356f9a557eb3b2d8649", Common::FR_FRA), + FANMADE("Corby's Murder Mystery (v1.0)", "4ebe62ac24c5a8c7b7898c8eb070efe5"), + FANMADE_F("DG: The AGIMouse Adventure (English v1.1)", "efe453b92bc1487ea69fbebede4d5f26", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_LF("DG: The AGIMouse Adventure (French v1.1)", "eb3d17ca466d672cbb95947e8d6e846a", Common::FR_FRA, GF_AGIMOUSE|GF_AGIPAL), + FANMADE("DG: The Adventure Game (English v1.1)", "0d6376d493fa7a21ec4da1a063e12b25"), + FANMADE_L("DG: The Adventure Game (French v1.1)", "258bdb3bb8e61c92b71f2f456cc69e23", Common::FR_FRA), + FANMADE("Dashiki (16 Colors)", "9b2c7b9b0283ab9f12bedc0cb6770a07"), + FANMADE_F("Dashiki (256 Colors)", "c68052bb209e23b39b55ff3d759958e6", GF_AGIMOUSE|GF_AGI256), + FANMADE("Date Quest 1 (v1.0)", "ba3dcb2600645be53a13170aa1a12e69"), + FANMADE("Date Quest 2 (v1.0 Demo)", "1602d6a2874856e928d9a8c8d2d166e9"), + FANMADE("Date Quest 2 (v1.0)", "f13f6fc85aa3e6e02b0c20408fb63b47"), + FANMADE("Dave's Quest (v0.07)", "f29c3660de37bacc1d23547a167f27c9"), + FANMADE("Dave's Quest (v0.17)", "da3772624cc4a86f7137db812f6d7c39"), + FANMADE("Disco Nights (Demo)", "dc5a2b21182ba38bdcd992a3a978e690"), + FANMADE("Dogs Quest - The Quest for the Golden Bone (v1.0)", "f197357edaaea0ff70880602d2f09b3e"), + FANMADE("Dr. Jummybummy's Space Adventure", "988bd81785f8a452440a2a8ac67f96aa"), + FANMADE("Ed Ward", "98be839b9f30cbedea4c9cee5442d827"), + FANMADE("Elfintard", "c3b847e9e9e978af9708df76a0751dc2"), + FANMADE("Enclosure (v1.01)", "f08e66fee9ecdde77db7ee9a10c96ba2"), + FANMADE("Enclosure (v1.03)", "e4a0613ed02401502e506ba3565a8c40"), + FANMADE_SVP("Enclosure", "fe98e6126db74c6cc6fd8fe395cc6e8c", 345, 0x2440, Common::kPlatformCoCo3), + FANMADE("Epic Fighting (v0.1)", "aff24a1b3bdd676187685c4d95ba4294"), + FANMADE("Escape Quest (v0.0.3)", "2346b65619b1da0298b715b06d1a45a1"), + FANMADE("Escape from the Desert (beta 1)", "dfdc634d340854bd6ece28024010758d"), + FANMADE("Escape from the Salesman", "e723ca4fe0f6f56affe039fbb4dbeb6c"), + FANMADE("Fu$k Quest 1 (final)", "1cd0587422313f6ca77d6a95988e88ed"), + FANMADE("Fu$k Quest 1", "1cd0587422313f6ca77d6a95988e88ed"), + FANMADE("Fu$k Quest 2 - Romancing the Bone (Teaser)", "d288355d71d9bb1639260ccaa3b2fbfe"), + FANMADE("Fu$k Quest 2 - Romancing the Bone", "294beeb7765c7ea6b05ed7b9bf7bff4f"), + FANMADE("Gennadi Tahab Autot - Mission Pack 1 - Kuressaare", "bfa5fe71978e6ccf3d4eedd430124015"), + FANMADE("Go West, Young Hippie", "ff31484ea465441cb5f3a0f8e956b716"), + FANMADE("Good Man (demo v3.41)", "3facd8a8f856b7b6e0f6c3200274d88c"), + + { + // Groza + { + "agi-fanmade", + "Groza (russian) [AGDS sample]", + AD_ENTRY1("logdir", "421da3a18004122a966d64ab6bd86d2e"), + Common::RU_RUS, + Common::kPlatformPC, + ADGF_USEEXTRAASTITLE, + GUIO_NONE + }, + GID_FANMADE, + GType_V2, + GF_AGDS, + 0x2440, + }, + + { + // Get Outta SQ + { + "agi-fanmade", + "Get Outta Space Quest", + AD_ENTRY1("logdir", "aaea5b4a348acb669d13b0e6f22d4dc9"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_USEEXTRAASTITLE, + GUIO_NONE + }, + GID_GETOUTTASQ, + GType_V2, + 0, + 0x2440, + }, + + FANMADE_F("Half-Death - Terror At White-Mesa", "b62c05d0ace878261392073f57ae788c", GF_AGIMOUSE), + FANMADE("Hank's Quest (v1.0 English) - Victim of Society", "64c15b3d0483d17888129100dc5af213"), + FANMADE("Hank's Quest (v1.1 English) - Victim of Society", "86d1f1dd9b0c4858d096e2a60cca8a14"), + FANMADE_L("Hank's Quest (v1.81 Dutch) - Slachtoffer Van Het Gebeuren", "41e53972d55ff3dff9e90d15fe1b659f", Common::NL_NLD), + FANMADE("Hank's Quest (v1.81 English) - Victim of Society", "7a776383282f62a57c3a960dafca62d1"), + FANMADE("Herbao (v0.2)", "6a5186fc8383a9060517403e85214fc2"), + FANMADE_F("Hitler's Legacy (v.0004q)", "a412881269ba34584bd0a3268e5a9863", GF_AGIMOUSE), + FANMADE("Hobbits", "4a1c1ef3a7901baf0ab45fde0cfadd89"), + FANMADE_F("Isabella Coq - A Present For My Dad", "55c6819f2330c4d5d6459874c9f123d9", GF_AGIMOUSE), + FANMADE("Jack & Julia - VAMPYR", "8aa0b9a26f8d5a4421067ab8cc3706f6"), + FANMADE("Jeff's Quest (v.5 alpha Jun 1)", "10f1720eed40c12b02a0f32df3e72ded"), + FANMADE("Jeff's Quest (v.5 alpha May 31)", "51ff71c0ed90db4e987a488ed3bf0551"), + FANMADE("Jen's Quest (Demo 1)", "361afb5bdb6160213a1857245e711939"), + FANMADE("Jen's Quest (Demo 2)", "3c321eee33013b289ab8775449df7df2"), + FANMADE("Jiggy Jiggy Uh! Uh!", "bc331588a71e7a1c8840f6cc9b9487e4"), + FANMADE("Jimmy In: The Alien Attack (v0.1)", "a4e9db0564a494728de7873684a4307c"), + FANMADE("Joe McMuffin In \"What's Cooking, Doc\" (v1.0)", "8a3de7e61a99cb605fa6d233dd91c8e1"), + FANMADE_LVF("Jolimie, le Village Maudit (v0.5)", "21818501636b3cb8ad5de5c1a66de5c2", Common::FR_FRA, 0x2936, GF_AGIMOUSE|GF_AGIPAL), + FANMADE_LVF("Jolimie, le Village Maudit (v1.1)", "68d7aef1161bb5972fe03efdf29ccb7f", Common::FR_FRA, 0x2936, GF_AGIMOUSE|GF_AGIPAL), + FANMADE("Journey Of Chef", "aa0a0b5a6364801ae65fdb96d6741df5"), + FANMADE("Jukebox (v1.0)", "c4b9c5528cc67f6ba777033830de7751"), + FANMADE("Justin Quest (v1.0 in development)", "103050989da7e0ffdc1c5e1793a4e1ec"), + FANMADE("J\xf5ulumaa (v0.05) (Estonian)", "53982ecbfb907e41392b3961ad1c3475"), + FANMADE("Kings Quest 2 - Breast Intentions (v2.0 Mar 26)", "a25d7379d281b1b296d4785df90a8e78"), + FANMADE("Kings Quest 2 - Breast Intentions (v2.0 Aug 16)", "6b4f796d0421d2e12e501b511962e03a"), + FANMADE("Lasse Holm: The Quest for Revenge (v1.0)", "f9fbcc8a4ef510bfbb92423296ff4abb"), + FANMADE("Lawman for Hire", "c78b28bfd3767dd455b992cd8b7854fa"), + FANMADE("Lefty Goes on Vacation (Not in The Right Place)", "ccdc49a33870310b01f2c48b8a1f3c34"), + FANMADE("Les Ins\xe3parables (v1.0)", "4b780887cab0ecabc5eca319acb3acf2"), + FANMADE("Little Pirate (Demo 2 v0.6)", "437068efe4ec32d436da09d6f2ea56e1"), + FANMADE("Lost Eternity (v1.0)", "95f15c5632feb8a39e9ca3d9af35fcc9"), + FANMADE("MD Quest - The Search for Michiel (v0.10)", "2a6fcb21d2b5e4144c38ed817fabe8ee"), + FANMADE("Maale Adummin Quest", "ddfbeb33feb7cf78504fe4dba14ec63b"), + FANMADE("Monkey Man", "2322d03f997e8cc235d4578efff69cfa"), + FANMADE_F("Napalm Quest (v0.5)", "b659afb491d967bb34810d1c6ce22093", GF_AGIMOUSE), + FANMADE("Naturette 1 (English v1.2)", "0a75884e7f010974a230bdf269651117"), + FANMADE("Naturette 1 (English v1.3)", "f15bbf999ac55ebd404aa1eb84f7c1d9"), + FANMADE_L("Naturette 1 (French v1.2)", "d3665622cc41aeb9c7ecf4fa43f20e53", Common::FR_FRA), + FANMADE_F("Naturette 2: Daughter of the Moon (v1.0)", "bdf76a45621c7f56d1c9d40292c6137a", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_F("Naturette 3: Adventure in Treeworld (v1.0a)", "6dbb0e7fc75fec442e6d9e5a06f1530e", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_F("Naturette 4: From a Planet to Another Planet (Not Finished)", "13be8cd9cf35aeff0a39b8757057fbc8", GF_AGIMOUSE), + // FIXME: Actually Naturette 4 has both English and French language support built into it. How to add that information? + FANMADE_F("Naturette 4: From a Planet to Another Planet (2007-10-05)", "8253706b6ef5423a79413b216760297c", GF_AGIMOUSE|GF_AGIPAL), + FANMADE("New AGI Hangman Test", "d69c0e9050ccc29fd662b74d9fc73a15"), + FANMADE("Nick's Quest - In Pursuit of QuakeMovie (v2.1 Gold)", "e29cbf9222551aee40397fabc83eeca0"), + FANMADE_F("Open Mic Night (v0.1)", "70000a2f67aac27d1133d019df70246d", GF_AGIMOUSE|GF_AGIPAL), + FANMADE("Operation: Recon", "0679ce8405411866ccffc8a6743370d0"), + FANMADE("Patrick's Quest (Demo v1.0)", "f254f5b894b98fec5f92acc07fb62841"), + FANMADE("Phantasmagoria", "87d20c1c11aee99a4baad3797b63146b"), + FANMADE("Pharaoh Quest (v0.0)", "51c630899d076cf799e573dadaa2276d"), + FANMADE("Phil's Quest - the Search for Tolbaga", "5e7ca45c360e03164b8358e49900c588"), + FANMADE("Pinkun Maze Quest (v0.1)", "148ff0843af389928b3939f463bfd20d"), + FANMADE("Pirate Quest", "bb612a919ed2b9ea23bbf03ce69fed42"), + FANMADE("Pothead (v0.1)", "d181101385d3a45082f418cd4b3c5b01"), + FANMADE("President's Quest", "4937d0e8ecadb7888faeb347799b0388"), + FANMADE("Prince Quest", "266248d75c3130c8ccc9c9bf2ad30a0d"), + FANMADE("Professor (English) - The Professor is Missing (Mar 17)", "6232de31cc204affdf2e92dfe3dc0e4d"), + FANMADE("Professor (English) - The Professor is Missing (Mar 22)", "b5fcf0ca2f0d1c073be82f01e2170961"), + FANMADE_L("Professor (French) - Le Professeur a Disparu", "7d9f8a4d4610bb9b0b97caa17590c2d3", Common::FR_FRA), + FANMADE("Quest for Glory VI - Hero's Adventure", "d26765c3075064c80d284c5e06e33a7e"), + FANMADE("Quest for Home", "d2895dc1cd3930f2489af0f843b144b3"), + FANMADE("Quest for Ladies (demo v1.1 Apr 1)", "3f6e02f16e1154a0daf296c8895edd97"), + FANMADE("Quest for Ladies (demo v1.1 Apr 6)", "f75e7b6a0769a3fa926eea0854711591"), + FANMADE("Quest for Piracy 1 - Enter the Silver Pirate (v0.15)", "d23f5c2a26f6dc60c686f8a2436ea4a6"), + FANMADE("Quest for a Record Deal", "f4fbd7abf056d2d3204f790da5ac89ab"), + FANMADE("Ralph's Quest (v0.1)", "5cf56378aa01a26ec30f25295f0750ca"), + FANMADE("Residence 44 Quest (Dutch v0.99)", "7c5cc64200660c70240053b33d379d7d"), + FANMADE("Residence 44 Quest (English v0.99)", "fe507851fddc863d540f2bec67cc67fd"), + FANMADE("Residence 44 Quest (English v1.0a)", "f99e3f69dc8c77a45399da9472ef5801"), + FANMADE("SQ2Eye (v0.3)", "2be2519401d38ad9ce8f43b948d093a3"), + // FANMADE("SQ2Eye (v0.4)", "2be2519401d38ad9ce8f43b948d093a3"), + FANMADE("SQ2Eye (v0.41)", "f0e82c55f10eb3542d7cd96c107ae113"), + FANMADE("SQ2Eye (v0.42)", "d7beae55f6328ef8b2da47b1aafea40c"), + FANMADE("SQ2Eye (v0.43)", "2a895f06e45de153bb4b77c982009e06"), + FANMADE("SQ2Eye (v0.44)", "5174fc4b6d8a477ba0ff0575cd64e0aa"), + FANMADE("SQ2Eye (v0.45)", "6e06f8bb7b90ce6f6aabf1a0e620159c"), + FANMADE("SQ2Eye (v0.46)", "bf0ad7a035ff9113951d09d1efe380c4"), + FANMADE("SQ2Eye (v0.47)", "85dc3be1d33ff932c292b74f9037abaa"), + FANMADE("SQ2Eye (v0.48)", "587574252972a5b5c070a647973a9b4a"), + FANMADE("SQ2Eye (v0.481)", "fc9234beb49804ae869696ce5af8ef30"), + FANMADE("SQ2Eye (v0.482)", "3ed84b7b87fa6840f25c15f250a11ffb"), + FANMADE("SQ2Eye (v0.483)", "647c31298d3f9cda641231b893e347c0"), + FANMADE("SQ2Eye (v0.484)", "f2c86fae7b9046d408c62c8c49a4b882"), + FANMADE("SQ2Eye (v0.485)", "af59e36bc28f44545458b68a93e91e67"), + FANMADE("SQ2Eye (v0.486)", "3fd86436e93456770dbdd4593eded70a"), + FANMADE("Save Santa (v1.0)", "4644f6beb5802081772f14be56ae196c"), + FANMADE("Save Santa (v1.3)", "f8afdb6efc5af5e7c0228b44633066af"), + FANMADE("Schiller (preview 1)", "ade39dea968c959cfebe1cf935d653e9"), + FANMADE("Schiller (preview 2)", "62cd1f8fc758bf6b4aa334e553624cef"), + FANMADE_IF("serguei1", "v1.0", "b86725f067e456e10cdbdf5f58e01dec", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_IF("serguei1", "v1.1 2002 Sep 5", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_IF("serguei1", "v1.1 2003 Apr 10", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_IF("serguei2", "v0.1.1 Demo", "906ccbc2ddedb29b63141acc6d10cd28", GF_AGIMOUSE), + FANMADE_IF("serguei2", "v1.3.1 Demo (March 22nd 2008)", "ad1308fcb8f48723cd388e012ebf5e20", GF_AGIMOUSE|GF_AGIPAL), + FANMADE("Shifty (v1.0)", "2a07984d27b938364bf6bd243ac75080"), + FANMADE_F("Sliding Tile Game (v1.00)", "949bfff5d8a81c3139152eed4d84ca75", GF_AGIMOUSE), + FANMADE("Snowboarding Demo (v1.0)", "24bb8f29f1eddb5c0a099705267c86e4"), + FANMADE("Solar System Tour", "b5a3d0f392dfd76a6aa63f3d5f578403"), + FANMADE("Sorceror's Appraisal", "fe62615557b3cb7b08dd60c9d35efef1"), + FANMADE_I("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590"), + FANMADE_I("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6"), + FANMADE_ISVP("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, Common::kPlatformCoCo3), + FANMADE_I("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1"), + FANMADE_I("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910"), + FANMADE_ISVP("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, Common::kPlatformCoCo3), + FANMADE_F("Space Quest 3.5", "c077bc28d7b36213dd99dc9ecb0147fc", GF_AGIMOUSE|GF_AGIPAL), + FANMADE_F("Space Trek (v1.0)", "807a1aeadb2ace6968831d36ab5ea37a", GF_CLIPCOORDS), + FANMADE("Special Delivery", "88764dfe61126b8e73612c851b510a33"), + FANMADE("Speeder Bike Challenge (v1.0)", "2deb25bab379285ca955df398d96c1e7"), + FANMADE("Star Commander 1 - The Escape (v1.0)", "a7806f01e6fa14ebc029faa58f263750"), + FANMADE("Star Pilot: Bigger Fish", "8cb26f8e1c045b75c6576c839d4a0172"), + FANMADE_F("Street Quest (Demo)", "cf2aa94a7eb78dce6892c37f03e310d6", GF_AGIPAL), + FANMADE("Tales of the Tiki", "8103c9c87e3964690a14a3d0d83f7ddc"), + FANMADE("Tex McPhilip 1 - Quest For The Papacy", "3c74b9a24b51aa8020ac82bee3132266"), + FANMADE("Tex McPhilip 2 - Road To Divinity (v1.5)", "7387e8df854440bc26620ca0ea43af9a"), + FANMADE("Tex McPhilip 3 - A Destiny of Sin (Demo v0.25)", "992d12031a486ad84e592ff5d7c9d782"), + FANMADE("The 13th Disciple (v1.00)", "887719ad59afce9a41ec057dbb73ad73"), + FANMADE("The Adventures of a Crazed Hermit", "6e3086cbb794d3299a9c5a9792295511"), + FANMADE("The Grateful Dead", "c2146631afacf8cb455ce24f3d2d46e7"), + FANMADE("The Legend of Shay-Larah 1 - The Lost Prince", "04e720c8e30c9cf12db22ea14a24a3dd"), + FANMADE("The Legend of Zelda: The Fungus of Time (Demo v1.00)", "dcaf8166ceb62a3d9b9aea7f3b197c09"), + FANMADE("The Legendary Harry Soupsmith (Demo 1998 Apr 2)", "64c46b0d6fc135c9835afa80980d2831"), + FANMADE("The Legendary Harry Soupsmith (Demo 1998 Aug 19)", "8d06d82970f2c591d880a95476efbcf0"), + FANMADE("The Long Haired Dude: Encounter of the 18-th Kind", "86ea17b9fc2f3e537a7e40863d352c29"), + FANMADE("The Lost Planet (v0.9)", "590dffcbd932a9fbe554be13b769cac0"), + FANMADE("The Lost Planet (v1.0)", "58564df8b6394612dd4b6f5c0fd68d44"), + FANMADE("The New Adventure of Roger Wilco (v1.00)", "e5f0a7cb8d49f66b89114951888ca688"), + FANMADE("The Ruby Cast (v0.02)", "ed138e461bb1516e097007e017ab62df"), + FANMADE("The Shadow Plan", "c02cd10267e721f4e836b1431f504a0a"), + FANMADE("Time Quest (Demo v0.1)", "12e1a6f03ea4b8c5531acd0400b4ed8d"), + FANMADE("Time Quest (Demo v0.2)", "7b710608abc99e0861ac59b967bf3f6d"), + FANMADE_SVP("Time Quest", "90314f473d8317be5cd1f0306f139aea", 300, 0x2440, Common::kPlatformCoCo3), + FANMADE("Tonight The Shrieking Corpses Bleed (Demo v0.11)", "bcc57a7c8d563fa0c333107ae1c0a6e6"), + FANMADE("Tonight The Shrieking Corpses Bleed (v1.01)", "36b38f621b38e8d104aa0807302dc8c9"), + FANMADE("Turks' Quest - Heir to the Planet", "3d19254b737c8b218e5bc4580542b79a"), + FANMADE("URI Quest (v0.173 Feb 27)", "3986eefcf546dafc45f920ae91a697c3"), + FANMADE("URI Quest (v0.173 Jan 29)", "494150940d34130605a4f2e67ee40b12"), + { + // V - The Graphical Adventure + { + "agi-fanmade", + "V - The Graphical Adventure (Demo 2)", + AD_ENTRY1s("vdir", "c71f5c1e008d352ae9040b77fcf79327", 3080), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_USEEXTRAASTITLE, + GUIO_NONE + }, + GID_FANMADE, + GType_V3, + GF_FANMADE, + 0x3149, + }, + FANMADE_SVP("V - The Graphical Adventure", "1646eaade74f137a9041eb427a389969", 768, 0x2440, Common::kPlatformCoCo3), + + FANMADE("Voodoo Girl - Queen of the Darned (v1.2 2002 Jan 1)", "ae95f0c77d9a97b61420fd192348b937"), + FANMADE("Voodoo Girl - Queen of the Darned (v1.2 2002 Mar 29)", "11d0417b7b886f963d0b36789dac4c8f"), + FANMADE("Wizaro (v0.1)", "abeec1eda6eaf8dbc52443ea97ff140c"), + + { AD_TABLE_END_MARKER, 0, 0, 0, 0 } +}; + +/** + * The fallback game descriptor used by the AGI engine's fallbackDetector. + * Contents of this struct are to be overwritten by the fallbackDetector. + */ +static AGIGameDescription g_fallbackDesc = { + { + "", + "", + AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor + Common::UNK_LANG, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_FANMADE, + GType_V2, + GF_FANMADE, + 0x2917, +}; + +} // End of namespace Agi -- cgit v1.2.3 From d5c3cda8c5cc06a75b27d7fd7f735fb27e5877e3 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:15:29 +0000 Subject: Moved tinsel detection tables to separate file. svn-id: r49694 --- engines/tinsel/detection.cpp | 544 +----------------------------------- engines/tinsel/detection_tables.h | 567 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 568 insertions(+), 543 deletions(-) create mode 100644 engines/tinsel/detection_tables.h diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index a70b75f136..c46a93fb38 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -75,549 +75,7 @@ static const PlainGameDescriptor tinselGames[] = { {0, 0} }; - -namespace Tinsel { - -using Common::GUIO_NONE; -using Common::GUIO_NOSPEECH; -using Common::GUIO_NOSFX; -using Common::GUIO_NOMUSIC; - -static const TinselGameDescription gameDescriptions[] = { - - // Note: The following is the (hopefully) definitive list of version details: - // TINSEL_V0: Used only by the Discworld 1 demo - this used a more primitive version - // of the Tinsel engine and graphics compression - // TINSEL_V1: There were two versions of the Discworld 1 game - the first used .GRA - // files, and the second used .SCN files. The second also provided some fixes to - // various script bugs and coding errors, but is still considered TINSEL_V1, - // as both game versions work equally well with the newer code. - // TINSEL_V2: The Discworld 2 game used this updated version of the Tinsel 1 engine, - // and as far as we know there aren't any variations of this engine. - - { // Floppy Demo V0 from http://www.adventure-treff.de/specials/dl_demos.php - { - "dw", - "Floppy Demo", - AD_ENTRY1s("dw.gra", "ce1b57761ba705221bcf70955b827b97", 441192), - //AD_ENTRY1s("dw.scn", "ccd72f02183d0e96b6e7d8df9492cda8", 23308), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - GUIO_NOSPEECH | GUIO_NOSFX | GUIO_NOMUSIC - }, - GID_DW1, - 0, - GF_DEMO, - TINSEL_V0, - }, - - { // CD Demo V1 version, with *.gra files - { - "dw", - "CD Demo", - { - {"dw.gra", 0, "ef5a2518c9e205f786f5a4526396e661", 781676}, - {"english.smp", 0, NULL, -1}, - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD, - TINSEL_V1, - }, - - { // Multilingual Floppy V1 with *.gra files. - // Note: It contains no english subtitles. - { - "dw", - "Floppy", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"french.txt", 0, NULL, -1}, - {"german.txt", 0, NULL, -1}, - {"italian.txt", 0, NULL, -1}, - {"spanish.txt", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NOSPEECH - }, - GID_DW1, - 0, - GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Floppy V1 version, with *.gra files - { - "dw", - "Floppy", - AD_ENTRY1s("dw.gra", "c8808ccd988d603dd35dff42013ae7fd", 781656), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NOSPEECH - }, - GID_DW1, - 0, - GF_FLOPPY | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // CD V1 version, with *.gra files (same as the floppy one, with english.smp) - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.smp", 0, NULL, -1}, - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Italian CD with english speech and *.gra files. - // Note: It contains only italian subtitles, but inside english.txt - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.txt", 0, "15f0703f85477d7fab4280bf938b61c1", 237774}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::IT_ITA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Multilingual CD with english speech and *.gra files. - // Note: It contains no english subtitles. - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.smp", 0, NULL, -1}, - {"french.txt", 0, NULL, -1}, - {"german.txt", 0, NULL, -1}, - {"italian.txt", 0, NULL, -1}, - {"spanish.txt", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.smp", 0, NULL, -1}, - {"french.txt", 0, NULL, -1}, - {"german.txt", 0, NULL, -1}, - {"italian.txt", 0, NULL, -1}, - {"spanish.txt", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - { - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.smp", 0, NULL, -1}, - {"french.txt", 0, NULL, -1}, - {"german.txt", 0, NULL, -1}, - {"italian.txt", 0, NULL, -1}, - {"spanish.txt", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::IT_ITA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - { - { - "dw", - "CD", - { - {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, - {"english.smp", 0, NULL, -1}, - {"french.txt", 0, NULL, -1}, - {"german.txt", 0, NULL, -1}, - {"italian.txt", 0, NULL, -1}, - {"spanish.txt", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::ES_ESP, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // English CD v2 - { - "dw", - "CD", - { - {"dw.scn", 0, "70955425870c7720d6eebed903b2ef41", 776188}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Hebrew CD v2 - { - "dw", - "CD", - { - {"dw.scn", 0, "759d1374b4f02af6d52fc07c96679936", 770780}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::HE_ISR, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Discworld PSX CD - { - "dw", - "CD", - { - {"english.txt", 0, "7526cfc3a64e00f223795de476b4e2c9", 230326}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformPSX, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // multilanguage PSX demo - { - "dw", - "CD demo", - { - {"french.txt", 0, "e7020d35f58d0d187052ac406d86cc87", 273914}, - {"german.txt", 0, "52f0a01e0ff0d340b02a36fd5109d705", 263942}, - {"italian.txt", 0, "15f0703f85477d7fab4280bf938b61c1", 239834}, - {"spanish.txt", 0, "c324170c3f1922c605c5cc09ba265aa5", 236702}, - {"english.txt", 0, "7526cfc3a64e00f223795de476b4e2c9", 230326}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformPSX, - ADGF_DEMO, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V1, - }, - -#if 0 - { // English Saturn CD - { - "dw", - "CD", - { - {"dw.scn", 0, "6803f293c88758057cc685b9437f7637", 382248}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, -#endif - -#if 0 - { // Mac multilanguage CD - { - "dw", - "CD", - { - {"dw.scn", 0, "cfc40a8d5d476a1c9d3abf826fa46f8c", 1265532}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - -#endif - - { // German CD re-release "Neon Edition" - // Note: This release has ENGLISH.TXT (with german content) instead of GERMAN.TXT - { - "dw", - "CD", - AD_ENTRY1s("dw.scn", "6182c7986eaec893c62fb6ea13a9f225", 774556), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // Russian Discworld 1 - { - "dw", - "CD", - { - {"dw.scn", 0, "133041bde59d05c1bf084fd6f1bdce4b", 776524}, - {"english.txt", 0, "f73dcbd7b136b37c2adf7c9448ea336d", 231821}, - {"english.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::RU_RUS, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW1, - 0, - GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, - TINSEL_V1, - }, - - { // European/Australian Discworld 2 release - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"english1.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::EN_GRB, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { // US Discworld 2 release - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"us1.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::EN_USA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { // French version of Discworld 2 - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"french1.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { // German Discworld 2 re-release "Neon Edition" - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"german1.smp", 0, NULL, -1}, - {NULL, 0, NULL, 0} - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { // Italian/Spanish Discworld 2 - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"english1.smp", 0, NULL, -1}, - {"italian1.txt", 0, "d443249f8b55489b5888c227b9096f4e", 246495}, - {NULL, 0, NULL, 0} - }, - Common::IT_ITA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - { - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"english1.smp", 0, NULL, -1}, - {"spanish1.txt", 0, "bc6e147c5f542db228ac577357e4d897", 230323}, - {NULL, 0, NULL, 0} - }, - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { // Russian Discworld 2 release by Fargus - { - "dw2", - "CD", - { - {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, - {"english1.smp", 0, NULL, -1}, - {"english1.txt", 0, "b522e19d7b2cd7b85e50e36fe48e36a9", 274444}, - {NULL, 0, NULL, 0} - }, - Common::RU_RUS, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - GID_DW2, - 0, - GF_CD | GF_SCNFILES, - TINSEL_V2, - }, - - { AD_TABLE_END_MARKER, 0, 0, 0, 0 } -}; - -} // End of namespace Tinsel +#include "tinsel/detection_tables.h" static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h new file mode 100644 index 0000000000..b467cc613e --- /dev/null +++ b/engines/tinsel/detection_tables.h @@ -0,0 +1,567 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Tinsel { + +using Common::GUIO_NONE; +using Common::GUIO_NOSPEECH; +using Common::GUIO_NOSFX; +using Common::GUIO_NOMUSIC; + +static const TinselGameDescription gameDescriptions[] = { + + // Note: The following is the (hopefully) definitive list of version details: + // TINSEL_V0: Used only by the Discworld 1 demo - this used a more primitive version + // of the Tinsel engine and graphics compression + // TINSEL_V1: There were two versions of the Discworld 1 game - the first used .GRA + // files, and the second used .SCN files. The second also provided some fixes to + // various script bugs and coding errors, but is still considered TINSEL_V1, + // as both game versions work equally well with the newer code. + // TINSEL_V2: The Discworld 2 game used this updated version of the Tinsel 1 engine, + // and as far as we know there aren't any variations of this engine. + + { // Floppy Demo V0 from http://www.adventure-treff.de/specials/dl_demos.php + { + "dw", + "Floppy Demo", + AD_ENTRY1s("dw.gra", "ce1b57761ba705221bcf70955b827b97", 441192), + //AD_ENTRY1s("dw.scn", "ccd72f02183d0e96b6e7d8df9492cda8", 23308), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + GUIO_NOSPEECH | GUIO_NOSFX | GUIO_NOMUSIC + }, + GID_DW1, + 0, + GF_DEMO, + TINSEL_V0, + }, + + { // CD Demo V1 version, with *.gra files + { + "dw", + "CD Demo", + { + {"dw.gra", 0, "ef5a2518c9e205f786f5a4526396e661", 781676}, + {"english.smp", 0, NULL, -1}, + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD, + TINSEL_V1, + }, + + { // Multilingual Floppy V1 with *.gra files. + // Note: It contains no english subtitles. + { + "dw", + "Floppy", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"french.txt", 0, NULL, -1}, + {"german.txt", 0, NULL, -1}, + {"italian.txt", 0, NULL, -1}, + {"spanish.txt", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NOSPEECH + }, + GID_DW1, + 0, + GF_FLOPPY | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Floppy V1 version, with *.gra files + { + "dw", + "Floppy", + AD_ENTRY1s("dw.gra", "c8808ccd988d603dd35dff42013ae7fd", 781656), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NOSPEECH + }, + GID_DW1, + 0, + GF_FLOPPY | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // CD V1 version, with *.gra files (same as the floppy one, with english.smp) + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.smp", 0, NULL, -1}, + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Italian CD with english speech and *.gra files. + // Note: It contains only italian subtitles, but inside english.txt + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.txt", 0, "15f0703f85477d7fab4280bf938b61c1", 237774}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::IT_ITA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Multilingual CD with english speech and *.gra files. + // Note: It contains no english subtitles. + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.smp", 0, NULL, -1}, + {"french.txt", 0, NULL, -1}, + {"german.txt", 0, NULL, -1}, + {"italian.txt", 0, NULL, -1}, + {"spanish.txt", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.smp", 0, NULL, -1}, + {"french.txt", 0, NULL, -1}, + {"german.txt", 0, NULL, -1}, + {"italian.txt", 0, NULL, -1}, + {"spanish.txt", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + { + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.smp", 0, NULL, -1}, + {"french.txt", 0, NULL, -1}, + {"german.txt", 0, NULL, -1}, + {"italian.txt", 0, NULL, -1}, + {"spanish.txt", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::IT_ITA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + { + { + "dw", + "CD", + { + {"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656}, + {"english.smp", 0, NULL, -1}, + {"french.txt", 0, NULL, -1}, + {"german.txt", 0, NULL, -1}, + {"italian.txt", 0, NULL, -1}, + {"spanish.txt", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::ES_ESP, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_USE_4FLAGS | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // English CD v2 + { + "dw", + "CD", + { + {"dw.scn", 0, "70955425870c7720d6eebed903b2ef41", 776188}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Hebrew CD v2 + { + "dw", + "CD", + { + {"dw.scn", 0, "759d1374b4f02af6d52fc07c96679936", 770780}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::HE_ISR, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Discworld PSX CD + { + "dw", + "CD", + { + {"english.txt", 0, "7526cfc3a64e00f223795de476b4e2c9", 230326}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformPSX, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // multilanguage PSX demo + { + "dw", + "CD demo", + { + {"french.txt", 0, "e7020d35f58d0d187052ac406d86cc87", 273914}, + {"german.txt", 0, "52f0a01e0ff0d340b02a36fd5109d705", 263942}, + {"italian.txt", 0, "15f0703f85477d7fab4280bf938b61c1", 239834}, + {"spanish.txt", 0, "c324170c3f1922c605c5cc09ba265aa5", 236702}, + {"english.txt", 0, "7526cfc3a64e00f223795de476b4e2c9", 230326}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformPSX, + ADGF_DEMO, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V1, + }, + +#if 0 + { // English Saturn CD + { + "dw", + "CD", + { + {"dw.scn", 0, "6803f293c88758057cc685b9437f7637", 382248}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, +#endif + +#if 0 + { // Mac multilanguage CD + { + "dw", + "CD", + { + {"dw.scn", 0, "cfc40a8d5d476a1c9d3abf826fa46f8c", 1265532}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + +#endif + + { // German CD re-release "Neon Edition" + // Note: This release has ENGLISH.TXT (with german content) instead of GERMAN.TXT + { + "dw", + "CD", + AD_ENTRY1s("dw.scn", "6182c7986eaec893c62fb6ea13a9f225", 774556), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // Russian Discworld 1 + { + "dw", + "CD", + { + {"dw.scn", 0, "133041bde59d05c1bf084fd6f1bdce4b", 776524}, + {"english.txt", 0, "f73dcbd7b136b37c2adf7c9448ea336d", 231821}, + {"english.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::RU_RUS, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW1, + 0, + GF_CD | GF_SCNFILES | GF_ENHANCED_AUDIO_SUPPORT, + TINSEL_V1, + }, + + { // European/Australian Discworld 2 release + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"english1.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::EN_GRB, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { // US Discworld 2 release + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"us1.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::EN_USA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { // French version of Discworld 2 + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"french1.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { // German Discworld 2 re-release "Neon Edition" + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"german1.smp", 0, NULL, -1}, + {NULL, 0, NULL, 0} + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { // Italian/Spanish Discworld 2 + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"english1.smp", 0, NULL, -1}, + {"italian1.txt", 0, "d443249f8b55489b5888c227b9096f4e", 246495}, + {NULL, 0, NULL, 0} + }, + Common::IT_ITA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + { + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"english1.smp", 0, NULL, -1}, + {"spanish1.txt", 0, "bc6e147c5f542db228ac577357e4d897", 230323}, + {NULL, 0, NULL, 0} + }, + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { // Russian Discworld 2 release by Fargus + { + "dw2", + "CD", + { + {"dw2.scn", 0, "c6d15ce9720a9d8fef06e6582dcf3f34", 103593}, + {"english1.smp", 0, NULL, -1}, + {"english1.txt", 0, "b522e19d7b2cd7b85e50e36fe48e36a9", 274444}, + {NULL, 0, NULL, 0} + }, + Common::RU_RUS, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_DW2, + 0, + GF_CD | GF_SCNFILES, + TINSEL_V2, + }, + + { AD_TABLE_END_MARKER, 0, 0, 0, 0 } +}; + +} // End of namespace Tinsel -- cgit v1.2.3 From d137b4610ab6c2d1577d6656bf8c193d2e4cf8a3 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:15:51 +0000 Subject: Split out detection code in Kyra engine. svn-id: r49695 --- engines/kyra/detection.cpp | 1169 +------------------------------------- engines/kyra/detection_tables.h | 1192 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 1193 insertions(+), 1168 deletions(-) create mode 100644 engines/kyra/detection_tables.h diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index 90a107099f..4ed314934d 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -41,1172 +41,7 @@ struct KYRAGameDescription { Kyra::GameFlags flags; }; -namespace { - -#define FLAGS(x, y, z, a, b, c, d, id) { Common::UNK_LANG, Common::UNK_LANG, Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, d, id } -#define FLAGS_FAN(fanLang, repLang, x, y, z, a, b, c, d, id) { Common::UNK_LANG, fanLang, repLang, Common::kPlatformUnknown, x, y, z, a, b, c, d, id } - -#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA1) -#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, true, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA1) -#define KYRA1_DEMO_CD_FLAGS FLAGS(true, true, true, false, false, false, false, Kyra::GI_KYRA1) - -#define KYRA2_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA2) -#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2) -#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, true, false, false, false, Kyra::GI_KYRA2) - -#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, false, true, true, Kyra::GI_KYRA3) -#define KYRA3_CD_INS_FLAGS FLAGS(false, false, true, false, false, true, false, Kyra::GI_KYRA3) -#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, true, false, Kyra::GI_KYRA3) - -#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_LOL) -#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_LOL) -#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_LOL) -#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, true, false, false, Kyra::GI_LOL) -#define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL) -#define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) - -const KYRAGameDescription adGameDescs[] = { - /* disable these targets until they get supported - { - { - "kyra1", - 0, - AD_ENTRY1("DISK1.EXE", "c8641d0414d6c966d0a3dad79db07bf4"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_CMP_FLAGS - }, - - { - { - "kyra1", - 0, - AD_ENTRY1("DISK1.EXE", "5d5cee4c3d0b68d586788b74243d254a"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_CMP_FLAGS - }, - */ - - { - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "3c244298395520bb62b5edfe41688879"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "796e44863dd22fa635b042df1bf16673"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "abf8eb360e79a6c2a837751fbd4d3d24"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "6018e1dfeaca7fe83f8d0b00eb0dd049"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { // from Arne.F - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "f0b276781f47c130f423ec9679fe9ed9"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { // from VooD - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "8909b41596913b3f5deaf3c9f1017b01"), - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { // floppy 1.8 from clemmy - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "747861d2a9c643c59fdab570df5b9093"), - Common::ES_ESP, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - { // from gourry - { - "kyra1", - "Extracted", - AD_ENTRY1("GEMCUT.EMC", "ef08c8c237ee1473fd52578303fc36df"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - - { - { - "kyra1", - 0, - { - { "GEMCUT.PAK", 0, "2bd1da653eaefd691e050e4a9eb68a64", -1 }, - { "GEMCUT.EMC", 0, "2a3f44e179f1e9f7643e90083c747571", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::EN_ANY, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_AMIGA_FLAGS - }, - - { - { - "kyra1", - 0, - { - { "GEMCUT.PAK", 0, "2bd1da653eaefd691e050e4a9eb68a64", -1 }, - { "GEMCUT.EMC", 0, "74f99e9ed99abf8d0429826d78485a2a", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::DE_DEU, - Common::kPlatformAmiga, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_AMIGA_FLAGS - }, - - { - { - "kyra1", - 0, - { - { "GEMCUT.EMC", 0, "796e44863dd22fa635b042df1bf16673", -1 }, - { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_FLOPPY_FLAGS - }, - - { // FM-TOWNS version - { - "kyra1", - 0, - { - { "EMC.PAK", 0, "a046bb0b422061aab8e4c4689400343a", -1 }, - { "TWMUSIC.PAK", 0, "e53bca3a3e3fb49107d59463ec387a59", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::EN_ANY, - Common::kPlatformFMTowns, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_TOWNS_FLAGS - }, - { - { - "kyra1", - 0, - { - { "JMC.PAK", 0, "9c5707a2a478e8167e44283246612d2c", -1 }, - { "TWMUSIC.PAK", 0, "e53bca3a3e3fb49107d59463ec387a59", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::JA_JPN, - Common::kPlatformFMTowns, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_TOWNS_SJIS_FLAGS - }, - - // PC-9801 floppy + CD / PC-9821 floppy version are all using the same data files, - // thus we will mark it as non CD game. - { - { - "kyra1", - "", - { - { "JMC.PAK", 0, "9c5707a2a478e8167e44283246612d2c", -1 }, - { "MUSIC98.PAK", 0, "02fc212f799331b769b274e33d87b37f", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::JA_JPN, - Common::kPlatformPC98, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA1_TOWNS_SJIS_FLAGS - }, - - { - { - "kyra1", - "CD", - AD_ENTRY1("GEMCUT.PAK", "fac399fe62f98671e56a005c5e94e39f"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - { - { - "kyra1", - "CD", - AD_ENTRY1("GEMCUT.PAK", "230f54e6afc007ab4117159181a1c722"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - { - { - "kyra1", - "CD", - AD_ENTRY1("GEMCUT.PAK", "b037c41768b652a040360ffa3556fd2a"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - - { // italian fan translation see fr#1727941 "KYRA: add Italian CD Version to kyra.dat" - { - "kyra1", - "CD", - AD_ENTRY1("GEMCUT.PAK", "d8327fc4b7a72b23c900fa13aef4093a"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - - { // Kyra 1 Mac CD as mentioned in fr #2766454 "KYRA1: Add support for Macintosh CD" by nnooiissee - { - "kyra1", - "CD", - { - { "GEMCUT.PAK", 0, "d3d4b281cd357230aabcec46843d04bd", -1 }, - { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - { - { - "kyra1", - "CD", - { - { "GEMCUT.PAK", 0, "4a0cb720e824295bcbccbd1407652110", -1 }, - { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::DE_DEU, - Common::kPlatformMacintosh, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - { - { - "kyra1", - "CD", - { - { "GEMCUT.PAK", 0, "b71ee090aa12e80ed2ba068826d92bed", -1 }, - { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, - { NULL, 0, NULL, 0 } - }, - Common::FR_FRA, - Common::kPlatformMacintosh, - ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_CD_FLAGS - }, - - { - { - "kyra1", - "Demo", - AD_ENTRY1("DEMO1.WSA", "fb722947d94897512b13b50cc84fd648"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - Common::GUIO_NOSPEECH - }, - KYRA1_DEMO_FLAGS - }, - - { // Special Kyrandia 1 CD demo - { - "kyra1", - "Demo/CD", - AD_ENTRY1("INTRO.VRM", "e3045fb69b8c29db84b8fda3ccbdac54"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO | ADGF_CD, - Common::GUIO_NONE - }, - KYRA1_DEMO_CD_FLAGS - }, - - { // Floppy version - { - "kyra2", - 0, - AD_ENTRY1("WESTWOOD.001", "3f52dda68c4f7696c8309038be9f4151"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_CMP_FLAGS - }, - - { // Floppy version - { - "kyra2", - 0, - AD_ENTRY1("WESTWOOD.001", "d787b9559afddfe058b84c0b3a787224"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_CMP_FLAGS - }, - - { // Floppy version extracted - { - "kyra2", - "Extracted", - AD_ENTRY1("FATE.PAK", "1ba18be685ad8e5a0ab5d46a0ce4d345"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_FLAGS - }, - - { // Floppy version extracted - { - "kyra2", - "Extracted", - AD_ENTRY1("FATE.PAK", "262fb69dd8e52e596c7aefc6456f7c1b"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_FLAGS - }, - - { // Floppy version extracted - { - "kyra2", - "Extracted", - AD_ENTRY1("FATE.PAK", "f7de11506b4c8fdf64bc763206c3e4e7"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_FLAGS - }, - - { // Floppy version extracted - { - "kyra2", - "Extracted", - AD_ENTRY1("FATE.PAK", "e0a70c31b022cb4bb3061890020fc27c"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_FLOPPY_FLAGS - }, - - { // CD version - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FLAGS - }, - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FLAGS - }, - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FLAGS - }, - - // Italian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3" - { // CD version - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), - Common::IT_ITA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - - { - { - "kyra2", - "CD", - AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) - }, - - { // Interactive Demo - { - "kyra2", - "CD/Demo", - AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE - }, - KYRA2_CD_DEMO_FLAGS - }, - - { // Interactive Demo - { - "kyra2", - "CD/Demo", - AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE - }, - KYRA2_CD_DEMO_FLAGS - }, - - { // Interactive Demo - { - "kyra2", - "CD/Demo", - AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE - }, - KYRA2_CD_DEMO_FLAGS - }, - - { // Non-Interactive Demos - { - "kyra2", - "Demo", - AD_ENTRY1("VOC.PAK", "ecb3561b63749158172bf21528cf5f45"), - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - Common::GUIO_NONE - }, - KYRA2_DEMO_FLAGS - }, - - { // FM-TOWNS - { - "kyra2", - 0, - AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), - Common::EN_ANY, - Common::kPlatformFMTowns, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_TOWNS_FLAGS - }, - { - { - "kyra2", - 0, - AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), - Common::JA_JPN, - Common::kPlatformFMTowns, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - KYRA2_TOWNS_SJIS_FLAGS - }, - { // PC-9821 - { - "kyra2", - "CD", - AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), - Common::EN_ANY, - Common::kPlatformPC98, - ADGF_CD, - Common::GUIO_NOSPEECH - }, - KYRA2_TOWNS_FLAGS - }, - { - { - "kyra2", - "CD", - AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), - Common::JA_JPN, - Common::kPlatformPC98, - ADGF_CD, - Common::GUIO_NOSPEECH - }, - KYRA2_TOWNS_SJIS_FLAGS - }, - - // Kyra3 - - // non installed version - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "WESTWOOD.001", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "WESTWOOD.001", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "WESTWOOD.001", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FLAGS - }, - - // installed version - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - - // Mac version - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformMacintosh, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformMacintosh, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformMacintosh, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_INS_FLAGS - }, - - // Spanish fan translation, see fr#1994040 "KYRA3: Add support for Spanish fan translation" - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::ES_ESP, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) - }, - - // Italian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3" - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) - }, - { - { - "kyra3", - 0, - { - { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, - { "AUD.PAK", 0, 0, -1 }, - { 0, 0, 0, 0 } - }, - Common::IT_ITA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE, - Common::GUIO_NOMIDI - }, - KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) - }, - -#ifdef ENABLE_LOL - // Lands of Lore CD - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - "CD", - { - { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, - { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, - { 0, 0, 0, 0 } - }, - Common::FR_FRA, - Common::kPlatformPC, - ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE - }, - LOL_CD_FLAGS - }, - - { - { - "lol", - 0, - { - { "WESTWOOD.1", 0, "c656aa9a2b4032d341e3dc8e3525b917", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - LOL_FLOPPY_CMP_FLAGS - }, - - { - { - "lol", - 0, - { - { "WESTWOOD.1", 0, "3c61cb7de5b2ec452f5851f5075207ee", -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - LOL_FLOPPY_CMP_FLAGS - }, - - { - { - "lol", - "Extracted", - { - { "GENERAL.PAK", 0, "2aaa30e120c08af87196820e9dd4bf73", -1 }, - { "CHAPTER7.PAK", 0, "eb92bf7ebb4e890add1233a6b0c810ff", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - LOL_FLOPPY_FLAGS - }, - - { - { - "lol", - "Extracted", - { - { "GENERAL.PAK", 0, "996e66e81054d36249907a1d8158da3d", -1 }, - { "CHAPTER7.PAK", 0, "cabee57f00d6d84b65a732b6868a4959", -1 }, - { 0, 0, 0, 0 } - }, - Common::DE_DEU, - Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - LOL_FLOPPY_FLAGS - }, - - { - { - "lol", - 0, - { - { "GENERAL.PAK", 0, "3fe6539b9b09084c0984eaf7170464e9", -1 }, - { "MUS.PAK", 0, "008dc69d8cbcdb6bae30e270fab26e76", -1 }, - { 0, 0, 0, 0 } - }, - Common::JA_JPN, - Common::kPlatformPC98, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH - }, - LOL_PC98_SJIS_FLAGS - }, - - { - { - "lol", - "Demo", - { - { "INTRO.PAK", 0, "4bc22a3b57f19a49212c5de58ab014d6", -1 }, - { "INTROVOC.PAK", 0, "7e578e4f1da31c1f294e14a8e8f3cc44", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - Common::GUIO_NONE - }, - LOL_DEMO_FLAGS - }, - - { - { - "lol", - "Demo", - { - { "GENERAL.PAK", 0, "e94863d86c4597a2d581d05481c152ba", -1 }, - { 0, 0, 0, 0 } - }, - Common::EN_ANY, - Common::kPlatformPC, - ADGF_DEMO, - Common::GUIO_NOSPEECH - }, - LOL_KYRA2_DEMO_FLAGS - }, -#endif // ENABLE_LOL - - { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0) } -}; - -const PlainGameDescriptor gameList[] = { - { "kyra1", "The Legend of Kyrandia" }, - { "kyra2", "The Legend of Kyrandia: The Hand of Fate" }, - { "kyra3", "The Legend of Kyrandia: Malcolm's Revenge" }, -#ifdef ENABLE_LOL - { "lol", "Lands of Lore: The Throne of Chaos" }, -#endif // ENABLE_LOL - { 0, 0 } -}; +#include "kyra/detection_tables.h" const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure @@ -1231,8 +66,6 @@ const ADParams detectionParams = { 1 }; -} // End of anonymous namespace - class KyraMetaEngine : public AdvancedMetaEngine { public: KyraMetaEngine() : AdvancedMetaEngine(detectionParams) {} diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h new file mode 100644 index 0000000000..9f40cc3b1f --- /dev/null +++ b/engines/kyra/detection_tables.h @@ -0,0 +1,1192 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +namespace { + +#define FLAGS(x, y, z, a, b, c, d, id) { Common::UNK_LANG, Common::UNK_LANG, Common::UNK_LANG, Common::kPlatformUnknown, x, y, z, a, b, c, d, id } +#define FLAGS_FAN(fanLang, repLang, x, y, z, a, b, c, d, id) { Common::UNK_LANG, fanLang, repLang, Common::kPlatformUnknown, x, y, z, a, b, c, d, id } + +#define KYRA1_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA1) +#define KYRA1_AMIGA_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_TOWNS_FLAGS FLAGS(false, true, false, false, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_TOWNS_SJIS_FLAGS FLAGS(false, true, false, true, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_CD_FLAGS FLAGS(false, true, true, false, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA1) +#define KYRA1_DEMO_CD_FLAGS FLAGS(true, true, true, false, false, false, false, Kyra::GI_KYRA1) + +#define KYRA2_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_KYRA2) +#define KYRA2_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_CD_DEMO_FLAGS FLAGS(true, false, true, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_TOWNS_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_KYRA2) +#define KYRA2_TOWNS_SJIS_FLAGS FLAGS(false, false, false, true, false, false, false, Kyra::GI_KYRA2) + +#define KYRA3_CD_FLAGS FLAGS(false, false, true, false, false, true, true, Kyra::GI_KYRA3) +#define KYRA3_CD_INS_FLAGS FLAGS(false, false, true, false, false, true, false, Kyra::GI_KYRA3) +#define KYRA3_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, true, false, Kyra::GI_KYRA3) + +#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_LOL) +#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_LOL) +#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_LOL) +#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, true, false, false, Kyra::GI_LOL) +#define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL) +#define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) + +const KYRAGameDescription adGameDescs[] = { + /* disable these targets until they get supported + { + { + "kyra1", + 0, + AD_ENTRY1("DISK1.EXE", "c8641d0414d6c966d0a3dad79db07bf4"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_CMP_FLAGS + }, + + { + { + "kyra1", + 0, + AD_ENTRY1("DISK1.EXE", "5d5cee4c3d0b68d586788b74243d254a"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_CMP_FLAGS + }, + */ + + { + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "3c244298395520bb62b5edfe41688879"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "796e44863dd22fa635b042df1bf16673"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "abf8eb360e79a6c2a837751fbd4d3d24"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "6018e1dfeaca7fe83f8d0b00eb0dd049"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { // from Arne.F + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "f0b276781f47c130f423ec9679fe9ed9"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { // from VooD + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "8909b41596913b3f5deaf3c9f1017b01"), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { // floppy 1.8 from clemmy + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "747861d2a9c643c59fdab570df5b9093"), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + { // from gourry + { + "kyra1", + "Extracted", + AD_ENTRY1("GEMCUT.EMC", "ef08c8c237ee1473fd52578303fc36df"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + + { + { + "kyra1", + 0, + { + { "GEMCUT.PAK", 0, "2bd1da653eaefd691e050e4a9eb68a64", -1 }, + { "GEMCUT.EMC", 0, "2a3f44e179f1e9f7643e90083c747571", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::EN_ANY, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_AMIGA_FLAGS + }, + + { + { + "kyra1", + 0, + { + { "GEMCUT.PAK", 0, "2bd1da653eaefd691e050e4a9eb68a64", -1 }, + { "GEMCUT.EMC", 0, "74f99e9ed99abf8d0429826d78485a2a", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::DE_DEU, + Common::kPlatformAmiga, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_AMIGA_FLAGS + }, + + { + { + "kyra1", + 0, + { + { "GEMCUT.EMC", 0, "796e44863dd22fa635b042df1bf16673", -1 }, + { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_FLOPPY_FLAGS + }, + + { // FM-TOWNS version + { + "kyra1", + 0, + { + { "EMC.PAK", 0, "a046bb0b422061aab8e4c4689400343a", -1 }, + { "TWMUSIC.PAK", 0, "e53bca3a3e3fb49107d59463ec387a59", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::EN_ANY, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_TOWNS_FLAGS + }, + { + { + "kyra1", + 0, + { + { "JMC.PAK", 0, "9c5707a2a478e8167e44283246612d2c", -1 }, + { "TWMUSIC.PAK", 0, "e53bca3a3e3fb49107d59463ec387a59", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::JA_JPN, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_TOWNS_SJIS_FLAGS + }, + + // PC-9801 floppy + CD / PC-9821 floppy version are all using the same data files, + // thus we will mark it as non CD game. + { + { + "kyra1", + "", + { + { "JMC.PAK", 0, "9c5707a2a478e8167e44283246612d2c", -1 }, + { "MUSIC98.PAK", 0, "02fc212f799331b769b274e33d87b37f", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::JA_JPN, + Common::kPlatformPC98, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA1_TOWNS_SJIS_FLAGS + }, + + { + { + "kyra1", + "CD", + AD_ENTRY1("GEMCUT.PAK", "fac399fe62f98671e56a005c5e94e39f"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + { + { + "kyra1", + "CD", + AD_ENTRY1("GEMCUT.PAK", "230f54e6afc007ab4117159181a1c722"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + { + { + "kyra1", + "CD", + AD_ENTRY1("GEMCUT.PAK", "b037c41768b652a040360ffa3556fd2a"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + + { // italian fan translation see fr#1727941 "KYRA: add Italian CD Version to kyra.dat" + { + "kyra1", + "CD", + AD_ENTRY1("GEMCUT.PAK", "d8327fc4b7a72b23c900fa13aef4093a"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + + { // Kyra 1 Mac CD as mentioned in fr #2766454 "KYRA1: Add support for Macintosh CD" by nnooiissee + { + "kyra1", + "CD", + { + { "GEMCUT.PAK", 0, "d3d4b281cd357230aabcec46843d04bd", -1 }, + { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + { + { + "kyra1", + "CD", + { + { "GEMCUT.PAK", 0, "4a0cb720e824295bcbccbd1407652110", -1 }, + { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::DE_DEU, + Common::kPlatformMacintosh, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + { + { + "kyra1", + "CD", + { + { "GEMCUT.PAK", 0, "b71ee090aa12e80ed2ba068826d92bed", -1 }, + { "BEAD.CPS", 0, "3038466f65b7751451844707187aa401", -1 }, + { NULL, 0, NULL, 0 } + }, + Common::FR_FRA, + Common::kPlatformMacintosh, + ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_CD_FLAGS + }, + + { + { + "kyra1", + "Demo", + AD_ENTRY1("DEMO1.WSA", "fb722947d94897512b13b50cc84fd648"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + Common::GUIO_NOSPEECH + }, + KYRA1_DEMO_FLAGS + }, + + { // Special Kyrandia 1 CD demo + { + "kyra1", + "Demo/CD", + AD_ENTRY1("INTRO.VRM", "e3045fb69b8c29db84b8fda3ccbdac54"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO | ADGF_CD, + Common::GUIO_NONE + }, + KYRA1_DEMO_CD_FLAGS + }, + + { // Floppy version + { + "kyra2", + 0, + AD_ENTRY1("WESTWOOD.001", "3f52dda68c4f7696c8309038be9f4151"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_CMP_FLAGS + }, + + { // Floppy version + { + "kyra2", + 0, + AD_ENTRY1("WESTWOOD.001", "d787b9559afddfe058b84c0b3a787224"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_CMP_FLAGS + }, + + { // Floppy version extracted + { + "kyra2", + "Extracted", + AD_ENTRY1("FATE.PAK", "1ba18be685ad8e5a0ab5d46a0ce4d345"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_FLAGS + }, + + { // Floppy version extracted + { + "kyra2", + "Extracted", + AD_ENTRY1("FATE.PAK", "262fb69dd8e52e596c7aefc6456f7c1b"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_FLAGS + }, + + { // Floppy version extracted + { + "kyra2", + "Extracted", + AD_ENTRY1("FATE.PAK", "f7de11506b4c8fdf64bc763206c3e4e7"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_FLAGS + }, + + { // Floppy version extracted + { + "kyra2", + "Extracted", + AD_ENTRY1("FATE.PAK", "e0a70c31b022cb4bb3061890020fc27c"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_FLOPPY_FLAGS + }, + + { // CD version + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FLAGS + }, + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FLAGS + }, + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "28cbad1c5bf06b2d3825ae57d760d032"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FLAGS + }, + + // Italian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3" + { // CD version + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "30487f3b8d7790c7857f4769ff2dd125"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), + Common::IT_ITA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + + { + { + "kyra2", + "CD", + AD_ENTRY1("FATE.PAK", "39772ff82e42c4c520050518deb82e64"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) + }, + + { // Interactive Demo + { + "kyra2", + "CD/Demo", + AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, + Common::GUIO_NONE + }, + KYRA2_CD_DEMO_FLAGS + }, + + { // Interactive Demo + { + "kyra2", + "CD/Demo", + AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, + Common::GUIO_NONE + }, + KYRA2_CD_DEMO_FLAGS + }, + + { // Interactive Demo + { + "kyra2", + "CD/Demo", + AD_ENTRY1("THANKS.CPS", "b1a78d990b120bb2234b7094f74e30a5"), + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, + Common::GUIO_NONE + }, + KYRA2_CD_DEMO_FLAGS + }, + + { // Non-Interactive Demos + { + "kyra2", + "Demo", + AD_ENTRY1("VOC.PAK", "ecb3561b63749158172bf21528cf5f45"), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + Common::GUIO_NONE + }, + KYRA2_DEMO_FLAGS + }, + + { // FM-TOWNS + { + "kyra2", + 0, + AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), + Common::EN_ANY, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_TOWNS_FLAGS + }, + { + { + "kyra2", + 0, + AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), + Common::JA_JPN, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + KYRA2_TOWNS_SJIS_FLAGS + }, + { // PC-9821 + { + "kyra2", + "CD", + AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), + Common::EN_ANY, + Common::kPlatformPC98, + ADGF_CD, + Common::GUIO_NOSPEECH + }, + KYRA2_TOWNS_FLAGS + }, + { + { + "kyra2", + "CD", + AD_ENTRY1("WSCORE.PAK", "c44de1302b67f27d4707409987b7a685"), + Common::JA_JPN, + Common::kPlatformPC98, + ADGF_CD, + Common::GUIO_NOSPEECH + }, + KYRA2_TOWNS_SJIS_FLAGS + }, + + // Kyra3 + + // non installed version + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "WESTWOOD.001", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "WESTWOOD.001", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "WESTWOOD.001", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FLAGS + }, + + // installed version + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + + // Mac version + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformMacintosh, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "3833ff312757b8e6147f464cca0a6587", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformMacintosh, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_INS_FLAGS + }, + + // Spanish fan translation, see fr#1994040 "KYRA3: Add support for Spanish fan translation" + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::ES_ESP, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "9aaca21d2a205ca02ec53132f2911794", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::ES_ESP, Common::EN_ANY) + }, + + // Italian fan translation, see fr#2003504 "KYRA: add support for Italian version of Kyrandia 2&3" + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) + }, + { + { + "kyra3", + 0, + { + { "ONETIME.PAK", 0, "ee2d4d056a5de5333a3c6bda055b3cb4", -1 }, + { "AUD.PAK", 0, 0, -1 }, + { 0, 0, 0, 0 } + }, + Common::IT_ITA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE, + Common::GUIO_NOMIDI + }, + KYRA3_CD_FAN_FLAGS(Common::IT_ITA, Common::FR_FRA) + }, + +#ifdef ENABLE_LOL + // Lands of Lore CD + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "05a4f588fb81dc9c0ef1f2ec20d89e24", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + "CD", + { + { "GENERAL.PAK", 0, "9e4bab499b7ea9337b91ac29fcba6d13", -1 }, + { "L01.PAK", 0, "759a0ac26808d77ea968bd392355ba1d", -1 }, + { 0, 0, 0, 0 } + }, + Common::FR_FRA, + Common::kPlatformPC, + ADGF_DROPLANGUAGE | ADGF_CD, + Common::GUIO_NONE + }, + LOL_CD_FLAGS + }, + + { + { + "lol", + 0, + { + { "WESTWOOD.1", 0, "c656aa9a2b4032d341e3dc8e3525b917", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + LOL_FLOPPY_CMP_FLAGS + }, + + { + { + "lol", + 0, + { + { "WESTWOOD.1", 0, "3c61cb7de5b2ec452f5851f5075207ee", -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + LOL_FLOPPY_CMP_FLAGS + }, + + { + { + "lol", + "Extracted", + { + { "GENERAL.PAK", 0, "2aaa30e120c08af87196820e9dd4bf73", -1 }, + { "CHAPTER7.PAK", 0, "eb92bf7ebb4e890add1233a6b0c810ff", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + LOL_FLOPPY_FLAGS + }, + + { + { + "lol", + "Extracted", + { + { "GENERAL.PAK", 0, "996e66e81054d36249907a1d8158da3d", -1 }, + { "CHAPTER7.PAK", 0, "cabee57f00d6d84b65a732b6868a4959", -1 }, + { 0, 0, 0, 0 } + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + LOL_FLOPPY_FLAGS + }, + + { + { + "lol", + 0, + { + { "GENERAL.PAK", 0, "3fe6539b9b09084c0984eaf7170464e9", -1 }, + { "MUS.PAK", 0, "008dc69d8cbcdb6bae30e270fab26e76", -1 }, + { 0, 0, 0, 0 } + }, + Common::JA_JPN, + Common::kPlatformPC98, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH + }, + LOL_PC98_SJIS_FLAGS + }, + + { + { + "lol", + "Demo", + { + { "INTRO.PAK", 0, "4bc22a3b57f19a49212c5de58ab014d6", -1 }, + { "INTROVOC.PAK", 0, "7e578e4f1da31c1f294e14a8e8f3cc44", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + Common::GUIO_NONE + }, + LOL_DEMO_FLAGS + }, + + { + { + "lol", + "Demo", + { + { "GENERAL.PAK", 0, "e94863d86c4597a2d581d05481c152ba", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_DEMO, + Common::GUIO_NOSPEECH + }, + LOL_KYRA2_DEMO_FLAGS + }, +#endif // ENABLE_LOL + + { AD_TABLE_END_MARKER, FLAGS(0, 0, 0, 0, 0, 0, 0, 0) } +}; + +const PlainGameDescriptor gameList[] = { + { "kyra1", "The Legend of Kyrandia" }, + { "kyra2", "The Legend of Kyrandia: The Hand of Fate" }, + { "kyra3", "The Legend of Kyrandia: Malcolm's Revenge" }, +#ifdef ENABLE_LOL + { "lol", "Lands of Lore: The Throne of Chaos" }, +#endif // ENABLE_LOL + { 0, 0 } +}; + +} // End of anonymous namespace -- cgit v1.2.3 From 723cb6c0f0a638cc9d4f07c0fccf7bdf0197a6ac Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:16:13 +0000 Subject: SAGA: Moved more code under ENABLE_IHNM svn-id: r49696 --- engines/saga/interface.cpp | 8 ++++++++ engines/saga/scene.cpp | 4 ++++ engines/saga/sfuncs.cpp | 12 ------------ engines/saga/sfuncs_ihnm.cpp | 12 ++++++++++++ 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp index c0d3cee465..70e6aa0c6b 100644 --- a/engines/saga/interface.cpp +++ b/engines/saga/interface.cpp @@ -544,8 +544,10 @@ bool Interface::processAscii(Common::KeyState keystate) { return true; } +#ifdef ENABLE_IHNM if (_vm->_scene->isNonInteractiveIHNMDemoPart()) _vm->_scene->showIHNMDemoSpecialScreen(); +#endif break; case kPanelCutaway: if (keystate.keycode == Common::KEYCODE_ESCAPE) { @@ -555,8 +557,10 @@ bool Interface::processAscii(Common::KeyState keystate) { return true; } +#ifdef ENABLE_INHM if (_vm->_scene->isNonInteractiveIHNMDemoPart()) _vm->_scene->showIHNMDemoSpecialScreen(); +#endif break; case kPanelVideo: if (keystate.keycode == Common::KEYCODE_ESCAPE) { @@ -570,8 +574,10 @@ bool Interface::processAscii(Common::KeyState keystate) { return true; } +#ifdef ENABLE_IHNM if (_vm->_scene->isNonInteractiveIHNMDemoPart()) _vm->_scene->showIHNMDemoSpecialScreen(); +#endif break; case kPanelOption: // TODO: check input dialog keys @@ -1866,8 +1872,10 @@ void Interface::update(const Point& mousePoint, int updateFlag) { break; case kPanelNull: +#ifdef ENABLE_IHNM if (_vm->_scene->isNonInteractiveIHNMDemoPart() && (updateFlag & UPDATE_MOUSECLICK)) _vm->_scene->showIHNMDemoSpecialScreen(); +#endif break; } diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp index 40ee1fb720..1b2a600729 100644 --- a/engines/saga/scene.cpp +++ b/engines/saga/scene.cpp @@ -1425,6 +1425,8 @@ void Scene::clearPlacard() { q_event = _vm->_events->chain(q_event, &event); } +#ifdef ENABLE_IHNM + void Scene::showPsychicProfile(const char *text) { int textHeight; static PalEntry cur_pal[PAL_ENTRIES]; @@ -1531,4 +1533,6 @@ void Scene::showIHNMDemoSpecialScreen() { _vm->_scene->changeScene(150, 0, kTransitionFade); } +#endif // IHNM + } // End of namespace Saga diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp index f98a80acd8..a924383ba3 100644 --- a/engines/saga/sfuncs.cpp +++ b/engines/saga/sfuncs.cpp @@ -1153,18 +1153,6 @@ void Script::sfPlacardOff(SCRIPTFUNC_PARAMS) { _vm->_scene->clearPlacard(); } -void Script::sfPsychicProfile(SCRIPTFUNC_PARAMS) { - thread->wait(kWaitTypePlacard); - - _vm->_scene->showPsychicProfile(thread->_strings->getString(thread->pop())); -} - -void Script::sfPsychicProfileOff(SCRIPTFUNC_PARAMS) { - // This is called a while after the psychic profile is - // opened, to close it automatically - _vm->_scene->clearPsychicProfile(); -} - // Script function #50 (0x32) void Script::sfSetProtagState(SCRIPTFUNC_PARAMS) { _vm->_actor->setProtagState(thread->pop()); diff --git a/engines/saga/sfuncs_ihnm.cpp b/engines/saga/sfuncs_ihnm.cpp index fe586b54ae..b98c1cb852 100644 --- a/engines/saga/sfuncs_ihnm.cpp +++ b/engines/saga/sfuncs_ihnm.cpp @@ -440,6 +440,18 @@ void Script::sfDisableAbortSpeeches(SCRIPTFUNC_PARAMS) { _vm->_interface->disableAbortSpeeches(thread->pop() != 0); } +void Script::sfPsychicProfile(SCRIPTFUNC_PARAMS) { + thread->wait(kWaitTypePlacard); + + _vm->_scene->showPsychicProfile(thread->_strings->getString(thread->pop())); +} + +void Script::sfPsychicProfileOff(SCRIPTFUNC_PARAMS) { + // This is called a while after the psychic profile is + // opened, to close it automatically + _vm->_scene->clearPsychicProfile(); +} + } // End of namespace Saga #endif -- cgit v1.2.3 From 5d72a614ec75b875e950ecd62222bac3008945bc Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:16:32 +0000 Subject: SAGA: Add more thread-related output. svn-id: r49697 --- engines/saga/script.h | 3 +++ engines/saga/sthread.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/engines/saga/script.h b/engines/saga/script.h index f31af7b2ea..21afeb5c44 100644 --- a/engines/saga/script.h +++ b/engines/saga/script.h @@ -246,16 +246,19 @@ public: } void waitWalk(void *threadObj) { + debug(3, "waitWalk()"); wait(kWaitTypeWalk); _threadObj = threadObj; } void waitDelay(int sleepTime) { + debug(3, "waitDelay(%d)", sleepTime); wait(kWaitTypeDelay); _sleepTime = sleepTime; } void waitFrames(int frames) { + debug(3, "waitFrames(%d)", frames); wait(kWaitTypeWaitFrames); _frameWait = frames; } diff --git a/engines/saga/sthread.cpp b/engines/saga/sthread.cpp index c133f8de88..be674e5acd 100644 --- a/engines/saga/sthread.cpp +++ b/engines/saga/sthread.cpp @@ -58,6 +58,8 @@ ScriptThread &Script::createThread(uint16 scriptModuleNumber, uint16 scriptEntry _threadList.push_front(newThread); + debug(3, "createThread(). Total threads: %d", _threadList.size()); + ScriptThread &tmp = *_threadList.begin(); tmp._stackBuf = (int16 *)malloc(ScriptThread::THREAD_STACK_SIZE * sizeof(int16)); tmp._stackTopIndex = ScriptThread::THREAD_STACK_SIZE - 2; @@ -78,6 +80,8 @@ void Script::wakeUpActorThread(int waitType, void *threadObj) { void Script::wakeUpThreads(int waitType) { ScriptThreadList::iterator threadIterator; + debug(3, "wakeUpThreads(%d)", waitType); + for (threadIterator = _threadList.begin(); threadIterator != _threadList.end(); ++threadIterator) { ScriptThread &thread = *threadIterator; if ((thread._flags & kTFlagWaiting) && (thread._waitType == waitType)) { @@ -89,6 +93,8 @@ void Script::wakeUpThreads(int waitType) { void Script::wakeUpThreadsDelayed(int waitType, int sleepTime) { ScriptThreadList::iterator threadIterator; + debug(3, "wakeUpThreads(%d, %d)", waitType, sleepTime); + for (threadIterator = _threadList.begin(); threadIterator != _threadList.end(); ++threadIterator) { ScriptThread &thread = *threadIterator; if ((thread._flags & kTFlagWaiting) && (thread._waitType == waitType)) { @@ -169,6 +175,8 @@ void Script::executeThreads(uint msec) { void Script::abortAllThreads() { ScriptThreadList::iterator threadIterator; + debug(3, "abortAllThreads()"); + threadIterator = _threadList.begin(); while (threadIterator != _threadList.end()) { -- cgit v1.2.3 From 7746321ed62d80c918a3687b595405e07e80e2aa Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:16:53 +0000 Subject: SAGA: Fix bug #1970191. Bug #1970191: "IHNM: Psychic Profile problem". Still there is a slight artefact. When the profile has 2 pages and is skipped, there are two fade-ins in a row. It could be checked by analysing event queue. svn-id: r49698 --- engines/saga/interface.cpp | 1 + engines/saga/scene.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp index 70e6aa0c6b..c4b4688785 100644 --- a/engines/saga/interface.cpp +++ b/engines/saga/interface.cpp @@ -1861,6 +1861,7 @@ void Interface::update(const Point& mousePoint, int updateFlag) { if (updateFlag & UPDATE_MOUSECLICK) { if (!_vm->isIHNMDemo()) { _vm->_scene->clearPsychicProfile(); + _vm->_script->wakeUpThreads(kWaitTypeDelay); } else { setMode(kPanelConverse); _vm->_scene->_textList.clear(); diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp index 1b2a600729..8cb632ae91 100644 --- a/engines/saga/scene.cpp +++ b/engines/saga/scene.cpp @@ -1442,6 +1442,8 @@ void Scene::showPsychicProfile(const char *text) { _vm->_interface->setMode(kPanelPlacard); _vm->_gfx->savePalette(); + _vm->_events->clearList(); + event.type = kEvTOneshot; event.code = kCursorEvent; event.op = kEventHide; -- cgit v1.2.3 From d577d863ce4cee58b973e3a1cb461ad339e91c61 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:17:18 +0000 Subject: CINE: Fix bug #2812694. Bug #2812694: "CINE: Operation Stealth german crash". Our code assumed that there exists only 256-color version which is not the case for German version. Added code to store background format. Old savegames are broken and could not be fixed. Bumped savefile version. svn-id: r49699 --- engines/cine/gfx.cpp | 22 +++++++++++++++------- engines/cine/gfx.h | 4 ++-- engines/cine/saveload.cpp | 4 ++-- engines/cine/saveload.h | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index a4220e6e35..aa0330df84 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -772,7 +772,7 @@ const char *FWRenderer::getBgName(uint idx) const { * Restore active and backup palette from save * @param fHandle Savefile open for reading */ -void FWRenderer::restorePalette(Common::SeekableReadStream &fHandle) { +void FWRenderer::restorePalette(Common::SeekableReadStream &fHandle, int version) { byte buf[kLowPalNumBytes]; // Load the active 16 color palette from file @@ -819,9 +819,8 @@ void FWRenderer::savePalette(Common::OutSaveFile &fHandle) { void OSRenderer::savePalette(Common::OutSaveFile &fHandle) { byte buf[kHighPalNumBytes]; - // Make sure the active palette has the correct format and color count - assert(_activePal.colorFormat() == kHighPalFormat); - assert(_activePal.colorCount() == kHighPalNumColors); + // We can have 16 color palette in many cases + fHandle.writeUint16LE(_activePal.colorCount()); // Write the active 256 color palette. _activePal.save(buf, sizeof(buf), CINE_LITTLE_ENDIAN); @@ -836,12 +835,21 @@ void OSRenderer::savePalette(Common::OutSaveFile &fHandle) { * Restore active and backup palette from save * @param fHandle Savefile open for reading */ -void OSRenderer::restorePalette(Common::SeekableReadStream &fHandle) { +void OSRenderer::restorePalette(Common::SeekableReadStream &fHandle, int version) { byte buf[kHighPalNumBytes]; + uint colorCount; + + if (version > 0) + colorCount = fHandle.readUint16LE(); - // Load the active 256 color palette from file fHandle.read(buf, kHighPalNumBytes); - _activePal.load(buf, sizeof(buf), kHighPalFormat, kHighPalNumColors, CINE_LITTLE_ENDIAN); + + if (colorCount == kHighPalNumBytes || version == 0) { + // Load the active 256 color palette from file + _activePal.load(buf, sizeof(buf), kHighPalFormat, kHighPalNumColors, CINE_LITTLE_ENDIAN); + } else { + _activePal.load(buf, sizeof(buf), kLowPalFormat, kLowPalNumColors, CINE_LITTLE_ENDIAN); + } // Jump over the backup 256 color palette. // FIXME: Load the backup 256 color palette and use it properly. diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 56ba6885f4..da7e3dd572 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -197,7 +197,7 @@ public: virtual void refreshPalette(); virtual void reloadPalette(); - virtual void restorePalette(Common::SeekableReadStream &fHandle); + virtual void restorePalette(Common::SeekableReadStream &fHandle, int version); virtual void savePalette(Common::OutSaveFile &fHandle); virtual void rotatePalette(int a, int b, int c); virtual void transformPalette(int first, int last, int r, int g, int b); @@ -257,7 +257,7 @@ public: const char *getBgName(uint idx = 0) const; void reloadPalette(); - void restorePalette(Common::SeekableReadStream &fHandle); + void restorePalette(Common::SeekableReadStream &fHandle, int version); void savePalette(Common::OutSaveFile &fHandle); void transformPalette(int first, int last, int r, int g, int b); diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index c76bed3f8e..b5adebcd0b 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -566,7 +566,7 @@ bool CineEngine::loadTempSaveOS(Common::SeekableReadStream &in) { } loadObjectTable(in); - renderer->restorePalette(in); + renderer->restorePalette(in, hdr.version); globalVars.load(in, NUM_MAX_VAR); loadZoneData(in); loadCommandVariables(in); @@ -698,7 +698,7 @@ bool CineEngine::loadPlainSaveFW(Common::SeekableReadStream &in, CineSaveGameFor loadObjectTable(in); // At 0x2043 (i.e. 0x005F + 2 * 2 + 255 * 32): - renderer->restorePalette(in); + renderer->restorePalette(in, 0); // At 0x2083 (i.e. 0x2043 + 16 * 2 * 2): globalVars.load(in, NUM_MAX_VAR); diff --git a/engines/cine/saveload.h b/engines/cine/saveload.h index 65f24f838d..a6e0e3f1ab 100644 --- a/engines/cine/saveload.h +++ b/engines/cine/saveload.h @@ -74,7 +74,7 @@ enum CineSaveGameFormat { static const uint32 TEMP_OS_FORMAT_ID = MKID_BE('TEMP'); /** The current version number of Operation Stealth's savegame format. */ -static const uint32 CURRENT_OS_SAVE_VER = 0; +static const uint32 CURRENT_OS_SAVE_VER = 1; /** Chunk header used by the temporary Operation Stealth savegame format. */ struct ChunkHeader { -- cgit v1.2.3 From c933bec975e7d8e176884312a257472a6358fea1 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:17:34 +0000 Subject: Drascula: Optimized blitting code. svn-id: r49700 --- engines/drascula/graphics.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 00399816da..03c866857f 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -190,10 +190,16 @@ void DrasculaEngine::copyRect(int xorg, int yorg, int xdes, int ydes, int width, dest += xdes + ydes * 320; src += xorg + yorg * 320; - for (y = 0; y < height; y++) - for (x = 0; x < width; x++) - if (src[x + y * 320] != 255) - dest[x + y * 320] = src[x + y * 320]; + int ptr = 0; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (src[ptr] != 255) + dest[ptr] = src[ptr]; + ptr++; + } + ptr += 320 - width; + } + } void DrasculaEngine::updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer) { -- cgit v1.2.3 From b78663f6fb45728fd90da0c91f5432e1389e421e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:17:51 +0000 Subject: Drascula: Added animation-related debug output. svn-id: r49701 --- engines/drascula/animation.cpp | 104 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index e4bd844d75..67a1e2bee3 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -43,6 +43,8 @@ void DrasculaEngine::updateAnim(int y, int destX, int destY, int width, int heig // This is the game's introduction sequence void DrasculaEngine::animation_1_1() { + debug(4, "animation_1_1()"); + int l, l2, p; //int pixelPos[6]; @@ -371,6 +373,8 @@ void DrasculaEngine::animation_1_1() { // John falls in love with BJ, who is then abducted by Drascula void DrasculaEngine::animation_2_1() { + debug(4, "animation_2_1()"); + int l; gotoObject(231, 91); @@ -560,6 +564,8 @@ void DrasculaEngine::animation_2_1() { // John Hacker talks with the bartender to book a room void DrasculaEngine::animation_3_1() { + debug(4, "animation_3_1()"); + loadPic("an11y13.alg", extraSurface); playTalkSequence(3); // sequence 3, chapter 1 @@ -569,6 +575,8 @@ void DrasculaEngine::animation_3_1() { // John Hacker talks with the pianist void DrasculaEngine::animation_4_1() { + debug(4, "animation_4_1()"); + loadPic("an12.alg", extraSurface); talk(205); @@ -605,6 +613,8 @@ void DrasculaEngine::animation_4_1() { } void DrasculaEngine::animation_2_2() { + debug(4, "animation_2_2()"); + trackProtagonist = 0; copyBackground(); moveCharacters(); @@ -640,6 +650,8 @@ void DrasculaEngine::animation_2_2() { } void DrasculaEngine::animation_4_2() { + debug(4, "animation_4_2()"); + stopMusic(); flags[9] = 1; @@ -704,6 +716,8 @@ void DrasculaEngine::animation_4_2() { } void DrasculaEngine::animation_14_2() { + debug(4, "animation_14_2()"); + int cY = -160; int l = 0; @@ -735,6 +749,8 @@ void DrasculaEngine::animation_14_2() { // The drunk tells us about Von Braun void DrasculaEngine::animation_16_2() { + debug(4, "animation_16_2()"); + char curPic[20]; talk_drunk(12); talk(371); @@ -812,6 +828,8 @@ asco: } void DrasculaEngine::animation_20_2() { + debug(4, "animation_20_2()"); + talk_vonBraun(7, kVonBraunDoor); talk_vonBraun(8, kVonBraunDoor); talk(383); @@ -842,6 +860,8 @@ void DrasculaEngine::animation_20_2() { } void DrasculaEngine::animation_23_2() { + debug(4, "animation_23_2()"); + loadPic("an24.alg", frontSurface); flags[21] = 1; @@ -897,6 +917,8 @@ void DrasculaEngine::animation_23_2() { } void DrasculaEngine::animation_23_joined() { + debug(4, "animation_23_joined()"); + int p_x = curX + 2, p_y = curY - 3; int x[] = {1, 38, 75, 112, 75, 112, 75, 112, 149, 112, 149, 112, 149, 186, 223, 260, 1, 38, 75, 112, 149, 112, 149, 112, 149, 112, 149, 186, 223, 260, 260, 260, 260, 223}; @@ -917,6 +939,8 @@ void DrasculaEngine::animation_23_joined() { } void DrasculaEngine::animation_23_joined2() { + debug(4, "animation_23_joined2()"); + int p_x = curX + 4, p_y = curY; int x[] = {1, 35, 69, 103, 137, 171, 205, 239, 273, 1, 35, 69, 103, 137}; int y[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 73, 73, 73, 73}; @@ -937,6 +961,8 @@ void DrasculaEngine::animation_23_joined2() { } void DrasculaEngine::animation_25_2() { + debug(4, "animation_25_2()"); + int cY = 0; loadPic("an14_2.alg", backSurface); @@ -967,6 +993,8 @@ void DrasculaEngine::animation_25_2() { } void DrasculaEngine::animation_27_2() { + debug(4, "animation_27_2()"); + flags[22] = 1; selectVerb(kVerbNone); @@ -986,6 +1014,8 @@ void DrasculaEngine::animation_27_2() { } void DrasculaEngine::animation_29_2() { + debug(4, "animation_29_2()"); + if (flags[33] == 0) { playTalkSequence(29); // sequence 29, chapter 2 } else @@ -1002,6 +1032,8 @@ void DrasculaEngine::animation_29_2() { } void DrasculaEngine::animation_31_2() { + debug(4, "animation_31_2()"); + talk_vonBraun(44, kVonBraunNormal); placeVonBraun(-50); pause(15); @@ -1020,6 +1052,8 @@ void DrasculaEngine::animation_31_2() { } void DrasculaEngine::animation_35_2() { + debug(4, "animation_35_2()"); + gotoObject(96, 165); gotoObject(79, 165); @@ -1050,6 +1084,8 @@ void DrasculaEngine::animation_35_2() { } void DrasculaEngine::animation_2_3() { + debug(4, "animation_2_3()"); + flags[0] = 1; playMusic(13); animation_3_3(); @@ -1070,6 +1106,8 @@ void DrasculaEngine::animation_2_3() { } void DrasculaEngine::animation_3_3() { + debug(4, "animation_3_3()"); + int px = curX - 20, py = curY - 1; loadPic("an2y_1.alg", frontSurface); @@ -1085,6 +1123,8 @@ void DrasculaEngine::animation_3_3() { } void DrasculaEngine::animation_4_3() { + debug(4, "animation_4_3()"); + int px = 120, py = 63; loadPic("any_1.alg", frontSurface); @@ -1100,6 +1140,8 @@ void DrasculaEngine::animation_4_3() { } void DrasculaEngine::animation_5_3() { + debug(4, "animation_5_3()"); + int px = curX - 20, py = curY - 1; loadPic("an3y_1.alg", frontSurface); @@ -1115,6 +1157,8 @@ void DrasculaEngine::animation_5_3() { } void DrasculaEngine::animation_6_3() { + debug(4, "animation_6_3()"); + int frame = 0, px = 112, py = 62; int yoda_x[] = { 3 ,82, 161, 240, 3, 82 }; int yoda_y[] = { 3, 3, 3, 3, 94, 94 }; @@ -1144,6 +1188,8 @@ void DrasculaEngine::animation_6_3() { } void DrasculaEngine::animation_ray() { + debug(4, "animation_ray()"); + loadPic("anr_1.alg", frontSurface, HALF_PAL); loadPic("anr_2.alg", extraSurface); loadPic("anr_3.alg", backSurface); @@ -1171,6 +1217,8 @@ void DrasculaEngine::animation_ray() { } void DrasculaEngine::animation_7_4() { + debug(4, "animation_7_4()"); + black(); talk(427); fadeFromBlack(1); @@ -1184,6 +1232,8 @@ void DrasculaEngine::animation_7_4() { } void DrasculaEngine::animation_1_5() { + debug(4, "animation_1_5()"); + if (flags[0] == 0) { talk(430); talk_bj(16); @@ -1224,6 +1274,8 @@ void DrasculaEngine::animation_1_5() { } void DrasculaEngine::animation_5_5(){ + debug(4, "animation_5_5("); + int h; int frame = 0; int boneX[] = {1, 99, 197, 1, 99, 197, 1, 99, 197}; @@ -1299,6 +1351,8 @@ void DrasculaEngine::animation_5_5(){ } void DrasculaEngine::animation_11_5() { + debug(4, "animation_11_5()"); + flags[9] = 1; if (flags[2] == 1 && flags[3] == 1 && flags[4] == 1) animation_12_5(); @@ -1309,6 +1363,8 @@ void DrasculaEngine::animation_11_5() { } void DrasculaEngine::animation_12_5() { + debug(4, "animation_12_5()"); + DacPalette256 bgPalette1; DacPalette256 bgPalette2; DacPalette256 bgPalette3; @@ -1415,6 +1471,8 @@ void DrasculaEngine::animation_12_5() { } void DrasculaEngine::animation_13_5() { + debug(4, "animation_13_5()"); + int frank_x = 199; int frame = 0; int frus_x[] = {1, 46, 91, 136, 181, 226, 271}; @@ -1446,6 +1504,8 @@ void DrasculaEngine::animation_13_5() { } void DrasculaEngine::animation_14_5() { + debug(4, "animation_14_5()"); + flags[11] = 1; playSound(3); updateRoom(); @@ -1469,6 +1529,8 @@ void DrasculaEngine::animation_14_5() { } void DrasculaEngine::animation_1_6() { + debug(4, "animation_1_6()"); + trackProtagonist = 0; curX = 103; curY = 108; @@ -1540,6 +1602,8 @@ void DrasculaEngine::animation_1_6() { } void DrasculaEngine::animation_5_6() { + debug(4, "animation_5_6()"); + int pY = -125; animate("man.bin", 14); @@ -1560,6 +1624,8 @@ void DrasculaEngine::animation_5_6() { } void DrasculaEngine::animation_6_6() { + debug(4, "animation_6_6()"); + animate("rct.bin", 11); clearRoom(); selectVerb(kVerbNone); @@ -1584,6 +1650,8 @@ void DrasculaEngine::animation_6_6() { } void DrasculaEngine::animation_9_6() { + debug(4, "animation_9_6()"); + int v_cd; animate("fin.bin", 14); @@ -1660,6 +1728,8 @@ void DrasculaEngine::animation_9_6() { } void DrasculaEngine::animation_19_6() { + debug(4, "animation_19_6()"); + copyBackground(); copyBackground(140, 23, 161, 69, 35, 80, drawSurface3, screenSurface); @@ -1675,6 +1745,8 @@ void DrasculaEngine::animation_19_6() { } void DrasculaEngine::animation_12_2() { + debug(4, "animation_12_2()"); + loadPic("an12.alg", extraSurface); talk(356); @@ -1705,6 +1777,8 @@ void DrasculaEngine::animation_12_2() { } void DrasculaEngine::animation_26_2() { + debug(4, "animation_26_2()"); + loadPic("an12.alg", extraSurface); talk(392); @@ -1762,6 +1836,8 @@ void DrasculaEngine::animation_26_2() { } void DrasculaEngine::animation_11_2() { + debug(4, "animation_11_2()"); + loadPic("an11y13.alg", extraSurface); playTalkSequence(11); // sequence 11, chapter 2 @@ -1770,6 +1846,8 @@ void DrasculaEngine::animation_11_2() { } void DrasculaEngine::animation_13_2() { + debug(4, "animation_13_2()"); + loadPic("an11y13.alg", frontSurface); if (flags[41] == 0) { @@ -1780,6 +1858,8 @@ void DrasculaEngine::animation_13_2() { } void DrasculaEngine::animation_24_2() { + debug(4, "animation_24_2()"); + if (curX < 178) gotoObject(208, 136); trackProtagonist = 3; @@ -1810,6 +1890,8 @@ void DrasculaEngine::animation_24_2() { } void DrasculaEngine::animation_32_2() { + debug(4, "animation_32_2()"); + loadPic("an32_1.alg", drawSurface3); loadPic("an32_2.alg", backSurface); @@ -1831,6 +1913,8 @@ void DrasculaEngine::animation_32_2() { } void DrasculaEngine::animation_34_2() { + debug(4, "animation_34_2()"); + trackProtagonist = 1; updateRoom(); updateScreen(); @@ -1858,6 +1942,8 @@ void DrasculaEngine::animation_34_2() { } void DrasculaEngine::animation_36_2() { + debug(4, "animation_36_2()"); + loadPic("an11y13.alg", extraSurface); talk(404); @@ -1872,6 +1958,8 @@ void DrasculaEngine::animation_36_2() { } void DrasculaEngine::animation_7_2() { + debug(4, "animation_7_2()"); + loadPic("an7_1.alg", backSurface); loadPic("an7_2.alg", extraSurface); loadPic("an7_3.alg", frontSurface); @@ -1928,6 +2016,8 @@ void DrasculaEngine::animation_7_2() { } void DrasculaEngine::animation_5_2() { + debug(4, "animation_5_2()"); + trackProtagonist = 0; updateRoom(); updateScreen(); @@ -1964,6 +2054,8 @@ void DrasculaEngine::animation_5_2() { } void DrasculaEngine::animation_6_2() { + debug(4, "animation_6_2()"); + stopMusic(); flags[9] = 1; @@ -2005,6 +2097,8 @@ void DrasculaEngine::animation_6_2() { } void DrasculaEngine::animation_33_2() { + debug(4, "animation_33_2()"); + stopMusic(); flags[9] = 1; @@ -2052,6 +2146,8 @@ void DrasculaEngine::animation_33_2() { } void DrasculaEngine::animation_1_4() { + debug(4, "animation_1_4()"); + if (flags[21] == 0) { strcpy(objName[2], "igor"); talk(275); @@ -2108,6 +2204,8 @@ void DrasculaEngine::animation_1_4() { } void DrasculaEngine::animation_5_4(){ + debug(4, "animation_5_4("); + trackProtagonist = 3; loadPic("anh_dr.alg", backSurface); gotoObject(99, 160); @@ -2136,6 +2234,8 @@ void DrasculaEngine::animation_5_4(){ } void DrasculaEngine::animation_6_4() { + debug(4, "animation_6_4()"); + int prevRoom = roomNumber; roomNumber = 26; @@ -2161,6 +2261,8 @@ void DrasculaEngine::animation_6_4() { } void DrasculaEngine::animation_8_4() { + debug(4, "animation_8_4()"); + int bookcaseX[] = {1, 75, 149, 223, 1, 75, 149, 223, 149, 223, 149, 223, 149, 223}; int bookcaseY[] = {1, 1, 1, 1, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}; @@ -2177,6 +2279,8 @@ void DrasculaEngine::animation_8_4() { } void DrasculaEngine::activatePendulum() { + debug(4, "activatePendulum()"); + flags[1] = 2; hare_se_ve = 0; roomNumber = 102; -- cgit v1.2.3 From f992721361d182223f1f551fe8bbfd030a27bd1f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:18:08 +0000 Subject: Drascula: hid room updater-related debug output to deeper level svn-id: r49702 --- engines/drascula/rooms.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp index a71545feca..57bfad26af 100644 --- a/engines/drascula/rooms.cpp +++ b/engines/drascula/rooms.cpp @@ -1091,7 +1091,7 @@ void DrasculaEngine::updateRefresh() { sprintf(rm, "update_%d", roomNumber); for (uint i = 0; i < _roomHandlers->roomUpdaters.size(); i++) { if (!strcmp(rm, _roomHandlers->roomUpdaters[i]->desc)) { - debug(4, "Calling room updater %d", roomNumber); + debug(8, "Calling room updater %d", roomNumber); (this->*(_roomHandlers->roomUpdaters[i]->proc))(); break; } @@ -1129,7 +1129,7 @@ void DrasculaEngine::updateRefresh_pre() { sprintf(rm, "update_%d_pre", roomNumber); for (uint i = 0; i < _roomHandlers->roomPreupdaters.size(); i++) { if (!strcmp(rm, _roomHandlers->roomPreupdaters[i]->desc)) { - debug(4, "Calling room preupdater %d", roomNumber); + debug(8, "Calling room preupdater %d", roomNumber); (this->*(_roomHandlers->roomPreupdaters[i]->proc))(); break; } -- cgit v1.2.3 From 2ccb5bb0251d801ef8b2fc15accbf7d421990afa Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:18:34 +0000 Subject: Drascula: Added debug console. Implemented a (buggy) room comand. svn-id: r49703 --- engines/drascula/console.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++ engines/drascula/console.h | 51 +++++++++++++++++++++++++++++++++++ engines/drascula/drascula.cpp | 6 +++++ engines/drascula/drascula.h | 4 +++ engines/drascula/module.mk | 1 + 5 files changed, 125 insertions(+) create mode 100755 engines/drascula/console.cpp create mode 100755 engines/drascula/console.h diff --git a/engines/drascula/console.cpp b/engines/drascula/console.cpp new file mode 100755 index 0000000000..d017468285 --- /dev/null +++ b/engines/drascula/console.cpp @@ -0,0 +1,63 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "drascula/console.h" +#include "gui/debugger.h" +#include "drascula/drascula.h" + +namespace Drascula { + +Console::Console(DrasculaEngine *vm) : GUI::Debugger(), _vm(vm) { + DCmd_Register("room", WRAP_METHOD(Console, Cmd_Room)); +} + +Console::~Console() { +} + +void Console::preEnter() { +} + +void Console::postEnter() { +} + +bool Console::Cmd_Room(int argc, const char **argv) { + if (argc < 2) { + DebugPrintf("Usage: changeCard \n"); + return true; + } + + int roomNum = atoi(argv[1]); + + _vm->loadedDifferentChapter = 0; + _vm->enterRoom(roomNum); + _vm->selectVerb(kVerbNone); + _vm->clearRoom(); + _vm->loadPic(roomNum, _vm->bgSurface, HALF_PAL); + _vm->selectionMade = 0; + + return false; +} + +} // End of namespace Drascula diff --git a/engines/drascula/console.h b/engines/drascula/console.h new file mode 100755 index 0000000000..33e2f626e4 --- /dev/null +++ b/engines/drascula/console.h @@ -0,0 +1,51 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef DRASCULA_CONSOLE_H +#define DRASCULA_CONSOLE_H + +#include "gui/debugger.h" + +namespace Drascula { + +class DrasculaEngine; + +class Console : public GUI::Debugger { +public: + Console(DrasculaEngine *vm); + virtual ~Console(void); + +protected: + virtual void preEnter(); + virtual void postEnter(); + +private: + DrasculaEngine *_vm; + + bool Cmd_Room(int argc, const char **argv); +}; + +} // End of namespace Drascula +#endif diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 2c3ca63600..b16182e3e2 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -38,6 +38,7 @@ #include "sound/mixer.h" #include "drascula/drascula.h" +#include "drascula/console.h" namespace Drascula { @@ -173,6 +174,8 @@ Common::Error DrasculaEngine::run() { _lang = kEnglish; } + _console = new Console(this); + if (!loadDrasculaDat()) return Common::kUnknownError; @@ -594,6 +597,9 @@ bool DrasculaEngine::runCurrentChapter() { } else if (key == Common::KEYCODE_ESCAPE) { if (!confirmExit()) return false; + } else if (key == Common::KEYCODE_TILDE || key == Common::KEYCODE_BACKQUOTE) { + _console->attach(); + _console->onFrame(); } else if (currentChapter == 6 && key == Common::KEYCODE_0 && roomNumber == 61) { loadPic("alcbar.alg", bgSurface, 255); } diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index 4876cf3390..aaa1a4f42a 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -317,6 +317,8 @@ static const int interf_y[] = { 51, 51, 51, 51, 83, 83, 83 }; struct RoomHandlers; +class Console; + class DrasculaEngine : public ::Engine { protected: // Engine APIs @@ -733,6 +735,8 @@ public: private: int _lang; + Console *_console; + CharInfo *_charMap; int _charMapSize; diff --git a/engines/drascula/module.mk b/engines/drascula/module.mk index a9fa257549..20fd900124 100644 --- a/engines/drascula/module.mk +++ b/engines/drascula/module.mk @@ -3,6 +3,7 @@ MODULE := engines/drascula MODULE_OBJS := \ actors.o \ animation.o \ + console.o \ converse.o \ detection.o \ drascula.o \ -- cgit v1.2.3 From 6d4ad23b55c328fd1674b07330f85b14bfc20482 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:18:51 +0000 Subject: Drascula: Fix bug #2854303. Bug #2854303: "DRASCULA: Glitch when using cross on vampire guard". Apparently during refactoring of animation-related code duplication the conversion was incorrect. Rewrote relevant function. svn-id: r49704 --- engines/drascula/animation.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 67a1e2bee3..33607c2f15 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -32,9 +32,12 @@ void DrasculaEngine::updateAnim(int y, int destX, int destY, int width, int heig for (int n = 0; n < count; n++){ x++; - copyBackground(x, y, destX, destY, width, height, src, screenSurface); - if (copyRectangle) + if (copyRectangle) { + copyBackground(destX, destY, destX, destY, width, height, bgSurface, screenSurface); copyRect(x, y, destX, destY, width, height, src, screenSurface); + } else { + copyBackground(x, y, destX, destY, width, height, src, screenSurface); + } updateScreen(destX, destY, destX, destY, width, height, screenSurface); x += width; pause(delayVal); @@ -1083,6 +1086,7 @@ void DrasculaEngine::animation_35_2() { fadeToBlack(2); } +// Use cross on Yoda void DrasculaEngine::animation_2_3() { debug(4, "animation_2_3()"); -- cgit v1.2.3 From 9224a0bd6e560dbd6dbf3a07f136ba412e1bd316 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:19:06 +0000 Subject: Hid hashed fileopening to debuglevel 8. svn-id: r49705 --- common/file.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/file.cpp b/common/file.cpp index 6291aa8855..dec0f2a953 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -51,11 +51,11 @@ bool File::open(const String &filename, Archive &archive) { SeekableReadStream *stream = 0; if ((stream = archive.createReadStreamForMember(filename))) { - debug(3, "Opening hashed: %s", filename.c_str()); + debug(8, "Opening hashed: %s", filename.c_str()); } else if ((stream = archive.createReadStreamForMember(filename + "."))) { // WORKAROUND: Bug #1458388: "SIMON1: Game Detection fails" // sometimes instead of "GAMEPC" we get "GAMEPC." (note trailing dot) - debug(3, "Opening hashed: %s.", filename.c_str()); + debug(8, "Opening hashed: %s.", filename.c_str()); } return open(stream, filename); -- cgit v1.2.3 From eac1fdc7caf115f2deacecd8438cb650b403e6c2 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:19:25 +0000 Subject: Drascula: added more debug output svn-id: r49706 --- engines/drascula/converse.cpp | 4 ++++ engines/drascula/interface.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp index b2a7e217e6..deefcaddbe 100644 --- a/engines/drascula/converse.cpp +++ b/engines/drascula/converse.cpp @@ -131,6 +131,8 @@ void DrasculaEngine::cleanupString(char *string) { } void DrasculaEngine::converse(int index) { + debug(4, "converse(%d)", index); + char fileName[20]; sprintf(fileName, "op_%d.cal", index); Common::SeekableReadStream *stream = _archives.open(fileName); @@ -279,6 +281,8 @@ void DrasculaEngine::converse(int index) { } void DrasculaEngine::response(int function) { + debug(4, "response(%d)", function); + playTalkSequence(function); if (currentChapter == 2) { diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp index 21803a8932..507cc6e123 100644 --- a/engines/drascula/interface.cpp +++ b/engines/drascula/interface.cpp @@ -65,6 +65,8 @@ void DrasculaEngine::selectVerbFromBar() { } void DrasculaEngine::selectVerb(int verb) { + debug(4, "selectVerb(%d)", verb); + int c = _menuScreen ? 0 : 171; if (currentChapter == 5) { -- cgit v1.2.3 From b743cc316e3a0af47880f98f01f1437dc5b8124d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:19:48 +0000 Subject: Drascula: Fix bug #2929931. Bug #2929931: "DRASCULA: Graphic Glitches". Cursor graphics was not loaded at needed time. svn-id: r49707 --- engines/drascula/converse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp index deefcaddbe..122e473f15 100644 --- a/engines/drascula/converse.cpp +++ b/engines/drascula/converse.cpp @@ -288,9 +288,10 @@ void DrasculaEngine::response(int function) { if (currentChapter == 2) { if (function == 16) animation_16_2(); - else if (function == 20) + else if (function == 20) { + loadPic(menuBackground, backSurface); animation_20_2(); - else if (function == 23) + } else if (function == 23) animation_23_2(); else if (function == 29) animation_29_2(); -- cgit v1.2.3 From 27c27c82b1f29030af468142a452dc33e87e56f4 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:20:10 +0000 Subject: Drascula: add more pic-related debug output. svn-id: r49708 --- engines/drascula/graphics.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 03c866857f..018b64d59f 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -90,6 +90,8 @@ void DrasculaEngine::moveCursor() { } void DrasculaEngine::loadPic(const char *NamePcc, byte *targetSurface, int colorCount) { + debug(5, "loadPic(%s)", NamePcc); + uint dataSize = 0; byte *pcxData; -- cgit v1.2.3 From e8b72467e1472c42bb99c5eba84f2e9e059c1a3b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:20:26 +0000 Subject: Drascula: ease load on backend. svn-id: r49709 --- engines/drascula/graphics.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 018b64d59f..28ade30601 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -205,9 +205,7 @@ void DrasculaEngine::copyRect(int xorg, int yorg, int xdes, int ydes, int width, } void DrasculaEngine::updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer) { - byte *screenBuffer = (byte *)_system->lockScreen()->pixels; - copyBackground(xorg, yorg, xdes, ydes, width, height, buffer, screenBuffer); - _system->unlockScreen(); + _system->copyRectToScreen(buffer + xorg + yorg * 320, 320, xdes, ydes, width, height); _system->updateScreen(); } -- cgit v1.2.3 From a9b9da5d7263c0c0cb9c1cc76a4351440d4d3a97 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:20:44 +0000 Subject: Drascula: Fix bug #2826610. Bug #2826610: "DRASCULA: Graveyard GFX error". Actually it was fixed by previous commit. Added more responsiveness for this animation. svn-id: r49710 --- engines/drascula/animation.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 33607c2f15..9f2ffe164b 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -40,6 +40,7 @@ void DrasculaEngine::updateAnim(int y, int destX, int destY, int width, int heig } updateScreen(destX, destY, destX, destY, width, height, screenSurface); x += width; + updateEvents(); pause(delayVal); } } @@ -1961,6 +1962,7 @@ void DrasculaEngine::animation_36_2() { loadPic(974, extraSurface); } +// Use sickle on plant void DrasculaEngine::animation_7_2() { debug(4, "animation_7_2()"); -- cgit v1.2.3 From 07cc483e139ac9449b2c41240aa43dbb18bab823 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:21:01 +0000 Subject: Drascula: Restore cursors before automated converse responses svn-id: r49711 --- engines/drascula/converse.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp index 122e473f15..7c845fb251 100644 --- a/engines/drascula/converse.cpp +++ b/engines/drascula/converse.cpp @@ -286,12 +286,14 @@ void DrasculaEngine::response(int function) { playTalkSequence(function); if (currentChapter == 2) { + if (function == 16 || function == 20 || function == 23 || function == 29 || function == 31) + loadPic(menuBackground, backSurface); + if (function == 16) animation_16_2(); - else if (function == 20) { - loadPic(menuBackground, backSurface); + else if (function == 20) animation_20_2(); - } else if (function == 23) + else if (function == 23) animation_23_2(); else if (function == 29) animation_29_2(); -- cgit v1.2.3 From 0796580c3e10c99af209b26537823ca4a69acd76 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:21:18 +0000 Subject: Drascula: Made actors animation more smooth. svn-id: r49712 --- engines/drascula/actors.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/drascula/actors.cpp b/engines/drascula/actors.cpp index ff46d8201a..c4996d543e 100644 --- a/engines/drascula/actors.cpp +++ b/engines/drascula/actors.cpp @@ -77,6 +77,7 @@ void DrasculaEngine::hiccup(int counter) { do { counter--; + updateEvents(); updateRoom(); if (currentChapter == 3) updateScreen(0, 0, 0, y, 320, 200, screenSurface); @@ -449,6 +450,7 @@ void DrasculaEngine::placeVonBraun(int pointX) { vonBraunHasMoved = 1; for (;;) { + updateEvents(); updateRoom(); updateScreen(); if (trackVonBraun == 0) { -- cgit v1.2.3 From 671ed4873f163bc64f59af6317791db4bbaa2824 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:21:42 +0000 Subject: Drascula: Fixed bug #2826608. Bug #2826608: "DRASCULA: Cursor GFX error" fixed by introducing separate buffer for cursors. This also fixes the root cause of the problem. svn-id: r49713 --- engines/drascula/drascula.cpp | 2 ++ engines/drascula/drascula.h | 1 + engines/drascula/graphics.cpp | 2 ++ engines/drascula/interface.cpp | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index b16182e3e2..4c38a87291 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -244,6 +244,8 @@ Common::Error DrasculaEngine::run() { if (currentChapter != 3) loadPic(96, frontSurface, COMPLETE_PAL); + loadPic(99, cursorSurface); + if (currentChapter == 1) { } else if (currentChapter == 2) { loadPic("pts.alg", drawSurface2); diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index aaa1a4f42a..0a8b7c8c9b 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -391,6 +391,7 @@ public: // Graphics buffers/pointers byte *bgSurface; byte *backSurface; + byte *cursorSurface; byte *drawSurface3; byte *drawSurface2; byte *tableSurface; diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 28ade30601..088e1e1da9 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -54,6 +54,7 @@ void DrasculaEngine::allocMemory() { assert(crosshairCursor); mouseCursor = (byte *)malloc(OBJWIDTH * OBJHEIGHT); assert(mouseCursor); + cursorSurface = (byte *)malloc(64000); } void DrasculaEngine::freeMemory() { @@ -67,6 +68,7 @@ void DrasculaEngine::freeMemory() { free(frontSurface); free(crosshairCursor); free(mouseCursor); + free(cursorSurface); } void DrasculaEngine::moveCursor() { diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp index 507cc6e123..38be3c6d5c 100644 --- a/engines/drascula/interface.cpp +++ b/engines/drascula/interface.cpp @@ -78,7 +78,7 @@ void DrasculaEngine::selectVerb(int verb) { } for (int i = 0; i < OBJHEIGHT; i++) - memcpy(mouseCursor + i * OBJWIDTH, backSurface + OBJWIDTH * verb + (c + i) * 320, OBJWIDTH); + memcpy(mouseCursor + i * OBJWIDTH, cursorSurface + OBJWIDTH * verb + (c + i) * 320, OBJWIDTH); setCursor(kCursorCurrentItem); if (verb > 0) { -- cgit v1.2.3 From 1850d53793388f81b3c058ba02c314994a6e6ec9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:21:59 +0000 Subject: Drascula: Plug memory leak svn-id: r49714 --- engines/drascula/drascula.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 4c38a87291..bc6f57ea12 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -116,6 +116,8 @@ DrasculaEngine::~DrasculaEngine() { freeRoomsTable(); + delete _console; + free(_charMap); free(_itemLocations); free(_polX); -- cgit v1.2.3 From f53211fbadb6c88161f8830baee476a91a0cc547 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:22:19 +0000 Subject: Drascula: Move more cursor-related blits to cursorSurface. svn-id: r49715 --- engines/drascula/drascula.cpp | 21 +++++++++++++++------ engines/drascula/graphics.cpp | 3 +-- engines/drascula/interface.cpp | 4 ++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index bc6f57ea12..0b2ddc6799 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -279,6 +279,7 @@ Common::Error DrasculaEngine::run() { loadPic(974, tableSurface); if (currentChapter != 2) { + loadPic(99, cursorSurface); loadPic(99, backSurface); loadPic(97, extraSurface); } @@ -507,10 +508,13 @@ bool DrasculaEngine::runCurrentChapter() { if (rightMouseButton == 1 && _menuScreen) { #endif delay(100); - if (currentChapter == 2) + if (currentChapter == 2) { + loadPic(menuBackground, cursorSurface); loadPic(menuBackground, backSurface); - else + } else { + loadPic(99, cursorSurface); loadPic(99, backSurface); + } setPalette((byte *)&gamePalette); _menuScreen = false; #ifndef _WIN32_WCE @@ -535,14 +539,19 @@ bool DrasculaEngine::runCurrentChapter() { characterMoved = 0; if (trackProtagonist == 2) trackProtagonist = 1; - if (currentChapter == 4) + if (currentChapter == 4) { loadPic("icons2.alg", backSurface); - else if (currentChapter == 5) + loadPic("icons2.alg", cursorSurface); + } else if (currentChapter == 5) { loadPic("icons3.alg", backSurface); - else if (currentChapter == 6) + loadPic("icons3.alg", cursorSurface); + } else if (currentChapter == 6) { loadPic("iconsp.alg", backSurface); - else + loadPic("iconsp.alg", cursorSurface); + } else { loadPic("icons.alg", backSurface); + loadPic("icons.alg", cursorSurface); + } _menuScreen = true; #ifndef _WIN32_WCE updateEvents(); diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 088e1e1da9..70085b99af 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -151,8 +151,7 @@ void DrasculaEngine::showFrame(Common::SeekableReadStream *stream, bool firstFra free(prevFrame); } -void DrasculaEngine::copyBackground(int xorg, int yorg, int xdes, int ydes, int width, - int height, byte *src, byte *dest) { +void DrasculaEngine::copyBackground(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *src, byte *dest) { dest += xdes + ydes * 320; src += xorg + yorg * 320; /* Unoptimized code diff --git a/engines/drascula/interface.cpp b/engines/drascula/interface.cpp index 38be3c6d5c..1495694a1b 100644 --- a/engines/drascula/interface.cpp +++ b/engines/drascula/interface.cpp @@ -128,7 +128,7 @@ void DrasculaEngine::showMenu() { OBJWIDTH, OBJHEIGHT, srcSurface, screenSurface); } copyRect(_x1d_menu[h], _y1d_menu[h], _itemLocations[n].x, _itemLocations[n].y, - OBJWIDTH, OBJHEIGHT, backSurface, screenSurface); + OBJWIDTH, OBJHEIGHT, cursorSurface, screenSurface); } if (x < 7) @@ -142,7 +142,7 @@ void DrasculaEngine::clearMenu() { if (mouseX > _verbBarX[n] && mouseX < _verbBarX[n + 1]) verbActivated = 0; copyRect(OBJWIDTH * n, OBJHEIGHT * verbActivated, _verbBarX[n], 2, - OBJWIDTH, OBJHEIGHT, backSurface, screenSurface); + OBJWIDTH, OBJHEIGHT, cursorSurface, screenSurface); verbActivated = 1; } } -- cgit v1.2.3 From e4d77cf098e9e9bdefce9ab13e7808ca89226c74 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:22:39 +0000 Subject: Drascula: Add responsiveness while talking. svn-id: r49716 --- engines/drascula/talk.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp index 54175c5e5b..91711681e3 100644 --- a/engines/drascula/talk.cpp +++ b/engines/drascula/talk.cpp @@ -331,11 +331,9 @@ void DrasculaEngine::talk_bj(int index) { updateRefresh_pre(); - copyBackground(bjX + 2, bjY - 1, bjX + 2, bjY - 1, 27, 40, - bgSurface, screenSurface); + copyBackground(bjX + 2, bjY - 1, bjX + 2, bjY - 1, 27, 40, bgSurface, screenSurface); - copyRect(x_talk[face], 99, bjX + 2, bjY - 1, 27, 40, - drawSurface3, screenSurface); + copyRect(x_talk[face], 99, bjX + 2, bjY - 1, 27, 40, drawSurface3, screenSurface); moveCharacters(); updateRefresh(); @@ -353,6 +351,7 @@ void DrasculaEngine::talk_bj(int index) { updateScreen(); } + updateEvents(); } while (!isTalkFinished()); updateRoom(); -- cgit v1.2.3 From ba25faaf421bbe28403ede0fcf15015b7eb4729e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:22:56 +0000 Subject: Drascula: more responsiveness. svn-id: r49717 --- engines/drascula/animation.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 9f2ffe164b..11489edd0b 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -147,9 +147,9 @@ void DrasculaEngine::animation_1_1() { copyBackground(0, 0, 320 - l, 0, l, 200, drawSurface3, screenSurface); copyBackground(l, 0, 0, 0, 320 - l, 200, bgSurface, screenSurface); - copyRect(interf_x[l2], interf_y[l2], 156 - l, 45, 63, 31, - drawSurface2, screenSurface); + copyRect(interf_x[l2], interf_y[l2], 156 - l, 45, 63, 31, drawSurface2, screenSurface); updateScreen(); + updateEvents(); p++; if (p == 6) { p = 0; @@ -936,6 +936,7 @@ void DrasculaEngine::animation_23_joined() { copyRect(x[n], y[n], p_x, p_y, 36, 74, backSurface, screenSurface); updateRefresh(); updateScreen(p_x, p_y, p_x, p_y, 36, 74, screenSurface); + updateEvents(); pause(5); } @@ -958,6 +959,7 @@ void DrasculaEngine::animation_23_joined2() { copyRect(x[n], y[n], p_x, p_y, 33, 71, backSurface, screenSurface); updateRefresh(); updateScreen(p_x,p_y, p_x,p_y, 33,71, screenSurface); + updateEvents(); pause(5); } @@ -989,6 +991,7 @@ void DrasculaEngine::animation_25_2() { updateRefresh(); updateScreen(); + updateEvents(); } finishSound(); @@ -1182,6 +1185,7 @@ void DrasculaEngine::animation_6_3() { copyBackground(); copyRect(yoda_x[frame], yoda_y[frame], px, py, 78, 90, frontSurface, screenSurface); updateScreen(px, py, px, py, 78, 90, screenSurface); + updateEvents(); } flags[2] = 1; @@ -1267,6 +1271,7 @@ void DrasculaEngine::animation_1_5() { break; updateRoom(); updateScreen(); + updateEvents(); } trackProtagonist = 1; @@ -1304,6 +1309,7 @@ void DrasculaEngine::animation_5_5(){ copyBackground(); copyRect(boneX[frame], boneY[frame], pixelX, pixelY, 97, 64, backSurface, screenSurface); updateScreen(pixelX, pixelY, pixelX,pixelY, 97,64, screenSurface); + updateEvents(); } copyBackground(52, 161, 198, 81, 26, 24, drawSurface3, screenSurface); @@ -1314,6 +1320,7 @@ void DrasculaEngine::animation_5_5(){ copyBackground(); copyRect(boneX[frame], boneY[frame], pixelX, pixelY, 97, 64, frontSurface, screenSurface); updateScreen(pixelX, pixelY, pixelX,pixelY, 97, 64, screenSurface); + updateEvents(); } flags[6] = 1; @@ -1336,11 +1343,13 @@ void DrasculaEngine::animation_5_5(){ pause(3); copyBackground(flyX[frame], 1, 174, 79, 61, 109, backSurface, screenSurface); updateScreen(174, 79, 174, 79, 61, 109, screenSurface); + updateEvents(); } for (frame = 0; frame < 5; frame++) { pause(3); copyBackground(flyX[frame], 1, 174, 79, 61, 109, extraSurface, screenSurface); updateScreen(174, 79, 174, 79, 61, 109, screenSurface); + updateEvents(); } updateScreen(0, 0, 0, 0, 320, 200, bgSurface); @@ -1428,6 +1437,7 @@ void DrasculaEngine::animation_12_5() { copyRect(rayX[frame], 1, 41, 0, 44, 44, backSurface, screenSurface); copyRect(frusky_x[frame], 113, 205, 50, 38, 86, drawSurface3, screenSurface); updateScreen(); + updateEvents(); } stopSound(); @@ -1444,6 +1454,7 @@ void DrasculaEngine::animation_12_5() { updateRoom(); copyRect(elfrusky_x[frame], 47, 192, 39, 66, 106, backSurface, screenSurface); updateScreen(); + updateEvents(); } animate("frel.bin", 16); @@ -1504,6 +1515,7 @@ void DrasculaEngine::animation_13_5() { frame = 0; trackProtagonist = 3; } + updateEvents(); pause(6); } } @@ -1622,6 +1634,7 @@ void DrasculaEngine::animation_5_6() { updateRefresh(); updateScreen(); + updateEvents(); pause(2); } @@ -1824,6 +1837,7 @@ void DrasculaEngine::animation_26_2() { x = x + 50; if (n == 2) playSound(9); + updateEvents(); pause(3); } @@ -1912,6 +1926,8 @@ void DrasculaEngine::animation_32_2() { x = x + 65; if (n < 2) pause(4); + + updateEvents(); } loadPic("aux18.alg", drawSurface3); @@ -2278,6 +2294,7 @@ void DrasculaEngine::animation_8_4() { pause(2); copyBackground(bookcaseX[frame], bookcaseY[frame], 77, 45, 73, 72, frontSurface, screenSurface); updateScreen(77, 45, 77, 45, 73, 72, screenSurface); + updateEvents(); } loadPic(96, frontSurface); -- cgit v1.2.3 From 02a76b2e91a0993d551ad799ebe2f98ed0f9e98b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:23:17 +0000 Subject: Drascula: add even more responsiveness svn-id: r49718 --- engines/drascula/actors.cpp | 1 + engines/drascula/animation.cpp | 7 +++++++ engines/drascula/objects.cpp | 3 +++ engines/drascula/talk.cpp | 28 ++++++++++++++++++++++------ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/engines/drascula/actors.cpp b/engines/drascula/actors.cpp index c4996d543e..33cb7fd478 100644 --- a/engines/drascula/actors.cpp +++ b/engines/drascula/actors.cpp @@ -100,6 +100,7 @@ void DrasculaEngine::hiccup(int counter) { if (y == 0) trackCharacter = 0; } + pause(3); } while (counter > 0); updateRoom(); diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index 11489edd0b..d6a3bafd9f 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -1576,11 +1576,15 @@ void DrasculaEngine::animation_1_6() { talk_drascula(28, 1); talk(255); talk_drascula(29, 1); + updateEvents(); fadeToBlack(1); + updateEvents(); clearRoom(); loadPic("time1.alg", screenSurface); updateScreen(); + updateEvents(); delay(930); + updateEvents(); clearRoom(); black(); hare_se_ve = 0; @@ -1592,10 +1596,13 @@ void DrasculaEngine::animation_1_6() { talk_drascula(30, 1); talk(257); fadeToBlack(0); + updateEvents(); clearRoom(); loadPic("time1.alg", screenSurface); updateScreen(); + updateEvents(); delay(900); + updateEvents(); clearRoom(); black(); updateRoom(); diff --git a/engines/drascula/objects.cpp b/engines/drascula/objects.cpp index 13c8a742ca..73aea7b7f2 100644 --- a/engines/drascula/objects.cpp +++ b/engines/drascula/objects.cpp @@ -78,8 +78,11 @@ void DrasculaEngine::gotoObject(int pointX, int pointY) { for (;;) { updateRoom(); updateScreen(); + updateEvents(); if (characterMoved == 0) break; + + pause(3); } if (walkToObject == 1) { diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp index 91711681e3..e7dbe5cba9 100644 --- a/engines/drascula/talk.cpp +++ b/engines/drascula/talk.cpp @@ -170,6 +170,7 @@ void DrasculaEngine::talk_drascula(int index, int talkerType) { centerText(said, drasculaX + 19, drasculaY); updateScreen(); + updateEvents(); pause(3); @@ -215,6 +216,7 @@ void DrasculaEngine::talk_drascula_big(int index) { centerText(said, 191, 69); updateScreen(); + updateEvents(); pause(3); @@ -245,7 +247,9 @@ void DrasculaEngine::talk_solo(const char *said, const char *filename) { else if (currentChapter == 5) centerText(said, 173, 92); } + updateEvents(); updateScreen(); + pause(3); } while (!isTalkFinished()); if (currentChapter == 6) { @@ -304,6 +308,7 @@ void DrasculaEngine::talk_bartender(int index, int talkerType) { centerText(said, 132, 45); updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -466,6 +471,7 @@ void DrasculaEngine::talk(const char *said, const char *filename) { centerText(said, curX, curY); updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -557,16 +563,15 @@ void DrasculaEngine::talk_vonBraun(int index, int talkerType) { if (!_subtitlesDisabled) centerText(said, vonBraunX, 66); - updateScreen(); - pause(3); } else { updateRoom(); if (!_subtitlesDisabled) centerText(said, 150, 80); - - updateScreen(); } + updateScreen(); + updateEvents(); + pause(3); } while (!isTalkFinished()); updateRoom(); @@ -620,6 +625,7 @@ void DrasculaEngine::talk_blind(int index) { centerText(said, 260, 71); updateScreen(); + updateEvents(); pause(2); p++; } while (!isTalkFinished()); @@ -640,7 +646,9 @@ void DrasculaEngine::talk_hacker(int index) { do { if (!_subtitlesDisabled) centerText(said, 156, 170); + updateEvents(); updateScreen(); + pause(3); } while (!isTalkFinished()); } @@ -707,6 +715,7 @@ void DrasculaEngine::talk_pen(const char *said, const char *filename, int talker } updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -744,6 +753,7 @@ void DrasculaEngine::talk_bj_bed(int index) { centerText(said, 104, 102); updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -780,6 +790,7 @@ void DrasculaEngine::talk_htel(int index) { centerText(said, 90, 50); updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -861,6 +872,7 @@ void DrasculaEngine::talk_sync(const char *said, const char *filename, const cha centerText(said, curX, curY); updateScreen(); + updateEvents(); p++; pause(3); @@ -894,6 +906,7 @@ void DrasculaEngine::talk_trunk(int index) { centerText(said, 263, 69); updateScreen(); + updateEvents(); pause(4); } while (!isTalkFinished()); @@ -921,6 +934,7 @@ void DrasculaEngine::talk_generic(const char* said, const char* filename, int* f centerText(said, coords[5], coords[6]); updateScreen(); + updateEvents(); pause(3); } while (!isTalkFinished()); @@ -943,8 +957,10 @@ void DrasculaEngine::grr() { updateScreen(); - while (!isTalkFinished()) - ; + while (!isTalkFinished()) { + updateEvents(); + pause(3); + } updateRoom(); updateScreen(); -- cgit v1.2.3 From e71caf8600bfdfeccd1cf817401daf457ce17a94 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:23:36 +0000 Subject: Drascula: Fix bug #2827169. Bug #2827169: "DRASCULA: gfx glitch in pendulum room" fixed by rearranging draw sequence. svn-id: r49719 --- engines/drascula/talk.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp index e7dbe5cba9..8cefe0385c 100644 --- a/engines/drascula/talk.cpp +++ b/engines/drascula/talk.cpp @@ -700,13 +700,13 @@ void DrasculaEngine::talk_pen(const char *said, const char *filename, int talker copyBackground(); updateRefresh_pre(); + updateRefresh(); + if (talkerType == 0) copyRect(x_talk[face], 145, 145, 105, 25, 29, drawSurface3, screenSurface); else copyBackground(x_talk2[face], 171, 173, 116, 25, 28, drawSurface3, screenSurface); - updateRefresh(); - if (!_subtitlesDisabled) { if (talkerType == 0) centerText(said, 160, 105); -- cgit v1.2.3 From 08c5d37da495538e5a4b634ec5a705ec305a97bc Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:23:58 +0000 Subject: Drascula: Fix bug #2827166. Bug #2827166: "DRASCULA: Repeating conversations". It looked like bug in original engine. svn-id: r49720 --- engines/drascula/converse.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/drascula/converse.cpp b/engines/drascula/converse.cpp index 7c845fb251..0e70348148 100644 --- a/engines/drascula/converse.cpp +++ b/engines/drascula/converse.cpp @@ -283,7 +283,8 @@ void DrasculaEngine::converse(int index) { void DrasculaEngine::response(int function) { debug(4, "response(%d)", function); - playTalkSequence(function); + if (function != 31) + playTalkSequence(function); if (currentChapter == 2) { if (function == 16 || function == 20 || function == 23 || function == 29 || function == 31) -- cgit v1.2.3 From 508256a71e3a194043f1c5e65699613ba2b441db Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:24:19 +0000 Subject: Drascula: Fix bug #2011470. Bug #2011470: "DRASCULA: slowdown when you hold mouse buttons" fixed by changing right mouse semantic. Now the items menu showed on button up instead mouse down like earlier. svn-id: r49721 --- engines/drascula/drascula.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 0b2ddc6799..d8aeee3c97 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -507,6 +507,7 @@ bool DrasculaEngine::runCurrentChapter() { #else if (rightMouseButton == 1 && _menuScreen) { #endif + rightMouseButton = 0; delay(100); if (currentChapter == 2) { loadPic(menuBackground, cursorSurface); @@ -535,6 +536,7 @@ bool DrasculaEngine::runCurrentChapter() { if (rightMouseButton == 1 && !_menuScreen && !(currentChapter == 5 && pickedObject == 16)) { #endif + rightMouseButton = 0; delay(100); characterMoved = 0; if (trackProtagonist == 2) @@ -760,10 +762,10 @@ void DrasculaEngine::updateEvents() { leftMouseButton = 0; break; case Common::EVENT_RBUTTONDOWN: - rightMouseButton = 1; + // We changed semantic and react only on button up event break; case Common::EVENT_RBUTTONUP: - rightMouseButton = 0; + rightMouseButton = 1; break; case Common::EVENT_QUIT: // TODO -- cgit v1.2.3 From 2e20a48f907c61352a1ae69573830dd346a1bc61 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:24:38 +0000 Subject: Drascula: improve responsivity during pauses and palette updates. svn-id: r49722 --- engines/drascula/drascula.cpp | 10 ++++++++-- engines/drascula/palette.cpp | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index d8aeee3c97..7e9f68a355 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -779,11 +779,17 @@ void DrasculaEngine::updateEvents() { } void DrasculaEngine::delay(int ms) { - _system->delayMillis(ms * 2); // originally was 1 + uint32 end = _system->getMillis() + ms * 2; // originally was 1 + + do { + _system->delayMillis(10); + updateEvents(); + _system->updateScreen(); + } while (_system->getMillis() < end); } void DrasculaEngine::pause(int duration) { - _system->delayMillis(duration * 30); // was originally 2 + delay(duration * 15); } int DrasculaEngine::getTime() { diff --git a/engines/drascula/palette.cpp b/engines/drascula/palette.cpp index 1e51deffd9..0f75bb7959 100644 --- a/engines/drascula/palette.cpp +++ b/engines/drascula/palette.cpp @@ -106,6 +106,8 @@ void DrasculaEngine::fadeToBlack(int fadeSpeed) { pause(fadeSpeed); setPalette((byte *)&palFade); + + updateEvents(); } } @@ -124,6 +126,8 @@ void DrasculaEngine::fadeFromBlack(int fadeSpeed) { pause(fadeSpeed); setPalette((byte *)&palFade); + + updateEvents(); } } -- cgit v1.2.3 From 6d2c916c34d875d540f2a06b112b2e2fba5f2473 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:24:55 +0000 Subject: SAGA: Add debug output for sfLockUser() svn-id: r49723 --- engines/saga/sfuncs.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp index a924383ba3..99a9cbf4d9 100644 --- a/engines/saga/sfuncs.cpp +++ b/engines/saga/sfuncs.cpp @@ -370,12 +370,15 @@ void Script::sfStopBgdAnim(SCRIPTFUNC_PARAMS) { // reenabled. // Param1: boolean void Script::sfLockUser(SCRIPTFUNC_PARAMS) { - if (thread->pop()) { + int16 param = thread->pop(); + + if (param != 0) { _vm->_interface->deactivate(); } else { _vm->_interface->activate(); } + debug(1, "sfLockUser(%d)", param); } // Script function #12 (0x0C) -- cgit v1.2.3 From 0b8f8d7a249b5077e8866bc2f5d959d4a118d5b1 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:25:13 +0000 Subject: SAGA: Fix bug #2886151. Bug #2886151: "ITE: Mouse stops responding at Boar Castle" fixed by implementing a workaround. It is a script bug in original. svn-id: r49724 --- engines/saga/scene.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp index 8cb632ae91..d7ee037c50 100644 --- a/engines/saga/scene.cpp +++ b/engines/saga/scene.cpp @@ -1201,6 +1201,12 @@ void Scene::endScene() { _vm->_script->abortAllThreads(); _vm->_script->_skipSpeeches = false; + // WORKAROUND: Bug #2886151: "ITE: Mouse stops responding at Boar Castle" + // This is bug in original engine + if (_sceneNumber == 50) { + _vm->_interface->activate(); + } + // Copy current screen to render buffer so inset rooms will get proper background if (!(_sceneDescription.flags & kSceneFlagISO) && !_vm->_scene->isInIntro()) { BGInfo bgInfo; -- cgit v1.2.3 From d1c34efad91e4b42dd88e0e45452f26d117d3c04 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:25:34 +0000 Subject: SAGA: Fix bug #2886141. Bug #2886141: "ITE: Cumulative Snoring sounds in Prince's Bedroom". Implemented safeguard against running same looped sound more than once. svn-id: r49725 --- engines/saga/sfuncs.cpp | 2 ++ engines/saga/sndres.cpp | 2 +- engines/saga/sound.cpp | 13 ++++++++++++- engines/saga/sound.h | 3 ++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp index 99a9cbf4d9..328d4040af 100644 --- a/engines/saga/sfuncs.cpp +++ b/engines/saga/sfuncs.cpp @@ -1464,6 +1464,8 @@ void Script::sfPlayLoopedSound(SCRIPTFUNC_PARAMS) { } else { _vm->_sound->stopSound(); } + + debug(1, "sfPlayLoopedSound(%d)", param); } // Script function #72 (0x48) diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp index 8ea3fc4003..a27608dcf5 100644 --- a/engines/saga/sndres.cpp +++ b/engines/saga/sndres.cpp @@ -159,7 +159,7 @@ void SndRes::playSound(uint32 resourceId, int volume, bool loop) { return; } - _vm->_sound->playSound(buffer, volume, loop); + _vm->_sound->playSound(buffer, volume, loop, resourceId); } void SndRes::playVoice(uint32 resourceId) { diff --git a/engines/saga/sound.cpp b/engines/saga/sound.cpp index 811ee709f7..db979e8104 100644 --- a/engines/saga/sound.cpp +++ b/engines/saga/sound.cpp @@ -105,10 +105,20 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundBuffer &buffe _mixer->playStream(soundType, handle, Audio::makeLoopingAudioStream(stream, loop ? 0 : 1), -1, volume); } -void Sound::playSound(SoundBuffer &buffer, int volume, bool loop) { +void Sound::playSound(SoundBuffer &buffer, int volume, bool loop, int resId) { + // WORKAROUND + // Prevent playing same looped sound for several times + // Fixes bug #2886141: "ITE: Cumulative Snoring sounds in Prince's Bedroom" + for (int i = 0; i < SOUND_HANDLES; i++) + if (_handles[i].type == kEffectHandle && _handles[i].resId == resId) { + debug(1, "Skipped playing SFX #%d", resId); + return; + } + SndHandle *handle = getHandle(); handle->type = kEffectHandle; + handle->resId = resId; playSoundBuffer(&handle->handle, buffer, 2 * volume, handle->type, loop); } @@ -129,6 +139,7 @@ void Sound::stopSound() { if (_handles[i].type == kEffectHandle) { _mixer->stopHandle(_handles[i].handle); _handles[i].type = kFreeHandle; + _handles[i].resId = -1; } } diff --git a/engines/saga/sound.h b/engines/saga/sound.h index 9cf8f29767..7ee2765a0f 100644 --- a/engines/saga/sound.h +++ b/engines/saga/sound.h @@ -63,6 +63,7 @@ enum sndHandleType { struct SndHandle { Audio::SoundHandle handle; sndHandleType type; + int resId; }; class Sound { @@ -71,7 +72,7 @@ public: Sound(SagaEngine *vm, Audio::Mixer *mixer); ~Sound(); - void playSound(SoundBuffer &buffer, int volume, bool loop); + void playSound(SoundBuffer &buffer, int volume, bool loop, int resId); void pauseSound(); void resumeSound(); void stopSound(); -- cgit v1.2.3 From fead2bb719c0a86b5aab8a3ea62d3c4d0eb5cd92 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:25:50 +0000 Subject: SAGA: Fix bug #2886130. Bug #2886130: "ITE: Graphic Glitches during Cat Tribe Celebration". We redraw statusbar for this scene. Bug in original. svn-id: r49726 --- engines/saga/render.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/saga/render.cpp b/engines/saga/render.cpp index ec168d296e..dc9334b037 100644 --- a/engines/saga/render.cpp +++ b/engines/saga/render.cpp @@ -110,6 +110,12 @@ void Render::drawScene() { _vm->_actor->drawActors(); } + // WORKAROUND + // Bug #2886130: "ITE: Graphic Glitches during Cat Tribe Celebration" + if (_vm->_scene->currentSceneNumber() == 274) { + _vm->_interface->drawStatusBar(); + } + #ifdef SAGA_DEBUG if (getFlags() & RF_OBJECTMAP_TEST) { if (_vm->_scene->_objectMap) -- cgit v1.2.3 From 51c22b39c86426b7f303d4d4f4d797e19bd63dbf Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:26:10 +0000 Subject: SAGA: Fix bug #2928923. Bug #2928923: 'ITE: Graphic Glitches during racoon death "Cut Scene"'. Disable actor drawing for these scenes. A long standing bug in original. svn-id: r49727 --- engines/saga/actor.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp index c3f5fec83a..8bc8025032 100644 --- a/engines/saga/actor.cpp +++ b/engines/saga/actor.cpp @@ -1173,7 +1173,9 @@ void Actor::drawActors() { return; } - if (_vm->_anim->hasCutaway()) { + // WORKAROUND + // Bug #2928923: 'ITE: Graphic Glitches during racoon death "Cut Scene"' + if (_vm->_anim->hasCutaway() || _vm->_scene->currentSceneNumber() == 287 || _vm->_scene->currentSceneNumber() == 286) { drawSpeech(); return; } -- cgit v1.2.3 From fa2b0a0dd20afa55d133ba3aece36148d98cd15c Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:26:29 +0000 Subject: SAGA: Fix bug #2827504. Bug #2827504: "ITE: Music restarts on every background change in credits". We errorneously were stopping music on each scene, though it appeared only with Adlib music. svn-id: r49728 --- engines/saga/events.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/saga/events.cpp b/engines/saga/events.cpp index d15f0b2af3..1f4091d07c 100644 --- a/engines/saga/events.cpp +++ b/engines/saga/events.cpp @@ -306,7 +306,6 @@ int Events::handleOneShot(Event *event) { _vm->_sndRes->playVoice(event->param); break; case kMusicEvent: - _vm->_music->stop(); if (event->op == kEventPlay) _vm->_music->play(event->param, (MusicFlags)event->param2); break; -- cgit v1.2.3 From 4046cd84571694c66f19b9fe0215a284a7d14357 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:26:46 +0000 Subject: AGI: debugger. Improved usage output, added safeguards to runopcode command svn-id: r49729 --- engines/agi/console.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index a0621f80dd..c7396f47b2 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -64,7 +64,7 @@ void Console::postEnter() { bool Console::Cmd_SetVar(int argc, const char **argv) { if (argc != 3) { - DebugPrintf("Usage: setvar "); + DebugPrintf("Usage: setvar \n"); return true; } int p1 = (int)atoi(argv[1]); @@ -76,7 +76,7 @@ bool Console::Cmd_SetVar(int argc, const char **argv) { bool Console::Cmd_SetFlag(int argc, const char **argv) { if (argc != 3) { - DebugPrintf("Usage: setvar "); + DebugPrintf("Usage: setvar \n"); return true; } int p1 = (int)atoi(argv[1]); @@ -88,7 +88,7 @@ bool Console::Cmd_SetFlag(int argc, const char **argv) { bool Console::Cmd_SetObj(int argc, const char **argv) { if (argc != 3) { - DebugPrintf("Usage: setvar "); + DebugPrintf("Usage: setvar \n"); return true; } int p1 = (int)atoi(argv[1]); @@ -99,6 +99,11 @@ bool Console::Cmd_SetObj(int argc, const char **argv) { } bool Console::Cmd_RunOpcode(int argc, const char **argv) { + if (argc < 2) { + DebugPrintf("Usage: runopcode ....\n"); + return true; + } + for (int i = 0; logicNamesCmd[i].name; i++) { if (!strcmp(argv[1], logicNamesCmd[i].name)) { uint8 p[16]; @@ -120,6 +125,8 @@ bool Console::Cmd_RunOpcode(int argc, const char **argv) { } } + DebugPrintf("Unknown opcode\n"); + return true; } -- cgit v1.2.3 From 1c1fb7c9acb77d552e51d7f41d91fadb35c63ee1 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:27:04 +0000 Subject: AGI: add optional parameter to 'room' debug console command. svn-id: r49730 --- engines/agi/console.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index c7396f47b2..e881b092e3 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -250,6 +250,10 @@ bool Console::Cmd_Cont(int argc, const char **argv) { } bool Console::Cmd_Room(int argc, const char **argv) { + if (argc == 2) { + _vm->newRoom(strtoul(argv[1], NULL, 0)); + } + DebugPrintf("Current room: %d\n", _vm->getvar(0)); return true; -- cgit v1.2.3 From 14205bdbc0aaeea34824c8f2dc43ec273955c7fd Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:27:23 +0000 Subject: AGI: add more status-related debug output. svn-id: r49731 --- engines/agi/keyboard.cpp | 2 +- engines/agi/text.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp index 2bea49a807..e0e1bca045 100644 --- a/engines/agi/keyboard.cpp +++ b/engines/agi/keyboard.cpp @@ -320,7 +320,7 @@ void AgiEngine::handleKeys(int key) { // Clear to start a new line _game.hasPrompt = 0; _game.inputBuffer[_game.cursorPos = 0] = 0; - debugC(3, kDebugLevelInput, "clear lines"); + debugC(3, kDebugLevelInput | kDebugLevelText, "clear lines"); clearLines(l, l + 1, bg); flushLines(l, l + 1); #ifdef __DS__ diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp index ee9aebf240..5689b691a9 100644 --- a/engines/agi/text.cpp +++ b/engines/agi/text.cpp @@ -214,6 +214,7 @@ void AgiEngine::printTextConsole(const char *msg, int x, int y, int len, int fg, x *= CHAR_COLS; y *= 10; + debugC(4, kDebugLevelText, "printTextConsole(): %s, %d, %d, %d, %d, %d", msg, x, y, len, fg, bg); printText2(1, msg, 0, x, y, len, fg, bg); } @@ -699,6 +700,8 @@ void AgiEngine::clearLines(int l1, int l2, int c) { // inc for endline so it matches the correct num // ie, from 22 to 24 is 3 lines, not 2 lines. + debugC(4, kDebugLevelText, "clearLines(%d, %d, %d)", l1, l2, c); + l1 *= CHAR_LINES; l2 *= CHAR_LINES; l2 += CHAR_LINES - 1; -- cgit v1.2.3 From 316e171e67ddf01f9ae36b06c075b7d2ea46ad3c Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:27:42 +0000 Subject: AGI: Fix bug #2959630. Bug #2959630: "LSL1: Security in blackjack" fixed by partially reverting r41241. Do not clear prompt without on disabling input. svn-id: r49732 --- engines/agi/text.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp index 5689b691a9..f656abfa0c 100644 --- a/engines/agi/text.cpp +++ b/engines/agi/text.cpp @@ -656,11 +656,8 @@ void AgiEngine::writePrompt() { int l, fg, bg, pos; int promptLength = strlen(agiSprintf(_game.strings[0])); - if (!_game.inputEnabled || _game.inputMode != INPUT_NORMAL) { - clearPrompt(); - + if (!_game.inputEnabled || _game.inputMode != INPUT_NORMAL) return; - } l = _game.lineUserInput; fg = _game.colorFg; -- cgit v1.2.3 From 4c617e8282dedf2f3c5d8c344851310665cc0be5 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:28:01 +0000 Subject: AGI: Fixed named fanmade games detection. svn-id: r49733 --- engines/agi/detection_tables.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index 96cb12cdd2..8ec3bb031b 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -80,12 +80,12 @@ using Common::GUIO_NONE; #define GAME3_PS(id,name,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) -#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPNF(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) +#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPN(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) -#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPNF(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) -#define FANMADE_SVP(name,md5,size,ver,platform) FANMADE_ISVP("agi-fanmade",name,md5,size,ver,platform) +#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPN(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) +#define FANMADE_SVP(name,md5,size,ver,platform) GAME_LVFPNF("agi-fanmade",name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) -#define FANMADE_LVF(name,md5,lang,ver,features) FANMADE_ILVF("agi-fanmade",name,md5,lang,ver,features) +#define FANMADE_LVF(name,md5,lang,ver,features) GAME_LVFPNF("agi-fanmade",name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) #define FANMADE_LF(name,md5,lang,features) FANMADE_LVF(name,md5,lang,0x2917,features) #define FANMADE_IF(id,name,md5,features) FANMADE_ILVF(id,name,md5,Common::EN_ANY,0x2917,features) -- cgit v1.2.3 From 968f959158ced8c1820b847e4c2b3a85d82d6e61 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:28:21 +0000 Subject: AGI: Fix bug #2960567. Bug #2960567: "AGI: Ego partly erased in Load/Save thumbnails". Force screen redraw after confirmation window is closed. svn-id: r49734 --- engines/agi/saveload.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp index b7e830dc53..88e279ecf8 100644 --- a/engines/agi/saveload.cpp +++ b/engines/agi/saveload.cpp @@ -864,6 +864,10 @@ int AgiEngine::saveGameDialog() { sprintf(fileName, "%s", getSavegameFilename(_firstSlot + slot)); debugC(8, kDebugLevelMain | kDebugLevelResources, "file is [%s]", fileName); + // Make sure all graphics was blitted to screen. This fixes bug + // #2960567: "AGI: Ego partly erased in Load/Save thumbnails" + _gfx->doUpdate(); + int result = saveGame(fileName, desc); if (result == errOK) -- cgit v1.2.3 From 4dddfd44ceb8de712e51e83738f897ea9f9d3444 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:28:40 +0000 Subject: AGI: Fix bug #2960584. Bug #2960584: "AGI: (Fan) SQ0: Music lost on saving (and loading)". Actually music did not loop at all. Our looping code was broken. svn-id: r49735 --- engines/agi/sound.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index ca5d42d981..1b76b1ee40 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -411,6 +411,8 @@ void SoundMgr::stopSound() { debugC(3, kDebugLevelSound, "stopSound() --> %d", _playingSound); + _vm->setflag(_endflag, true); + _endflag = -1; if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { for (i = 0; i < NUM_CHANNELS; i++) -- cgit v1.2.3 From a993e2fb45dd836efad3bc225f7186a4f48384fe Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:28:58 +0000 Subject: AGI: Fix bug #2960563. Bug #2960563: "AGI: (Fan) SQ0: Text input field overdraws Text window". Now our text wrapping code matches original. svn-id: r49736 --- engines/agi/text.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp index f656abfa0c..36a289c47b 100644 --- a/engines/agi/text.cpp +++ b/engines/agi/text.cpp @@ -135,8 +135,8 @@ void AgiEngine::blitTextbox(const char *p, int y, int x, int len) { if (x == 0 && y == 0 && len == 0) x = y = -1; - if (len <= 0 || len >= 40) - len = 32; + if (len <= 0) + len = 30; xoff = x * CHAR_COLS; yoff = y * CHAR_LINES; -- cgit v1.2.3 From 25948606c46fdb841b961439023bb64ca542e461 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:29:20 +0000 Subject: AGI: Fix bug #2960557. Bug #2960557: "AGI: (Fan) SQ0 - Sprite (Ego) not erased". Added a workaround. Actually root cause is not yet clear. svn-id: r49737 --- engines/agi/agi.h | 5 +++-- engines/agi/detection_tables.h | 14 +++++++------- engines/agi/view.cpp | 5 ++++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index fb9e204101..b00b0b3d7e 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -110,10 +110,11 @@ enum AgiGameID { GID_SQ2, GID_XMASCARD, GID_FANMADE, - GID_GETOUTTASQ, + GID_GETOUTTASQ, // Fanmade + GID_SQ0, // Fanmade GID_MICKEY, // PreAGI GID_WINNIE, // PreAGI - GID_TROLL // PreAGI + GID_TROLL // PreAGI }; } // End of namespace Agi diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index 8ec3bb031b..9c915b12f5 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -80,12 +80,12 @@ using Common::GUIO_NONE; #define GAME3_PS(id,name,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) -#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPN(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) +#define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPNF(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) -#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPN(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) -#define FANMADE_SVP(name,md5,size,ver,platform) GAME_LVFPNF("agi-fanmade",name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) +#define FANMADE_ISVP(id,name,md5,size,ver,platform) GAME_LVFPNF(id,name,"logdir",md5,size,Common::EN_ANY,ver,GF_FANMADE,GID_FANMADE,platform,GType_V2) +#define FANMADE_SVP(name,md5,size,ver,platform) FANMADE_ISVP("agi-fanmade",name,md5,size,ver,platform) -#define FANMADE_LVF(name,md5,lang,ver,features) GAME_LVFPNF("agi-fanmade",name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) +#define FANMADE_LVF(name,md5,lang,ver,features) FANMADE_ILVF("agi-fanmade",name,md5,lang,ver,features) #define FANMADE_LF(name,md5,lang,features) FANMADE_LVF(name,md5,lang,0x2917,features) #define FANMADE_IF(id,name,md5,features) FANMADE_ILVF(id,name,md5,Common::EN_ANY,0x2917,features) @@ -775,9 +775,9 @@ static const AGIGameDescription gameDescriptions[] = { FANMADE("Snowboarding Demo (v1.0)", "24bb8f29f1eddb5c0a099705267c86e4"), FANMADE("Solar System Tour", "b5a3d0f392dfd76a6aa63f3d5f578403"), FANMADE("Sorceror's Appraisal", "fe62615557b3cb7b08dd60c9d35efef1"), - FANMADE_I("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590"), - FANMADE_I("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6"), - FANMADE_ISVP("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, Common::kPlatformCoCo3), + GAME("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590", 0x2917, GID_SQ0), + GAME("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6", 0x2917, GID_SQ0), + GAME_PS("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, GID_SQ0, Common::kPlatformCoCo3), FANMADE_I("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1"), FANMADE_I("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910"), FANMADE_ISVP("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, Common::kPlatformCoCo3), diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index fb417e86a9..b506c1ecab 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -297,14 +297,17 @@ void AgiEngine::setView(VtEntry *v, int n) { uint16 viewFlags = 0; + // WORKAROUND // When setting a view to the view table, if there's already another view set in that // view table entry and it's still drawn, erase the existing view before setting the new one // Fixes bug #1658643: AGI: SQ1 (2.2 DOS ENG) Graphic error, ego leaves behind copy // Update: Apparently, this makes ego dissapear at times, e.g. when textboxes are shown // Therefore, it's limited to view 118 in SQ1 (Roger climbing the ladder) // Fixes bug #1715284: Roger sometimes disappears + // Update: Added case fot bug #2960557: AGI: (Fan) SQ0 - Sprite (Ego) not erased if (v->viewData != NULL) { - if (v->currentView == 118 && v->flags & DRAWN && getGameID() == GID_SQ1) { + if (((v->currentView == 118 && getGameID() == GID_SQ1) || + (v->currentView == 2 & (n == 254 || n == 255) && getGameID() == GID_SQ0)) && v->flags & DRAWN) { viewFlags = v->flags; // Store the flags for the view _sprites->eraseUpdSprites(); -- cgit v1.2.3 From 341fba383e8493e214c9e74c67cf3de0467c3e6a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:29:43 +0000 Subject: AGI: Fix bug #2862508. Bug #2862508: "AGI: Black cauldron save through GMM". BC does not have input line, and that was used for determining that user can save. Added special case for BC, so it is always allowed to save. In fact, original does not allow saving in some rare occasions, but that will require analysing of variables, which is a gross hack. svn-id: r49738 --- engines/agi/detection.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index fa21925b78..a809d24467 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -488,6 +488,9 @@ bool AgiBase::canLoadGameStateCurrently() { } bool AgiBase::canSaveGameStateCurrently() { + if (getGameID() == GID_BC) // Technically in Black Cauldron we may save anytime + return true; + return (!(getGameType() == GType_PreAGI) && getflag(fMenusWork) && !_noSaveLoadAllowed && _game.inputEnabled); } -- cgit v1.2.3 From 409fe0bd561e75b7312e4143b5e9c3803322430e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:30:01 +0000 Subject: AGI: made sprite-related debug output more informative svn-id: r49739 --- engines/agi/sprite.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 63ac880267..26aa100d2a 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -452,7 +452,7 @@ void SpritesMgr::blitSprites(SpriteList& l) { Sprite *s = *iter; objsSaveArea(s); - debugC(8, kDebugLevelSprites, "s->v->entry = %d (prio %d)", s->v->entry, s->v->priority); + debugC(8, kDebugLevelSprites, "blitSprites(): s->v->entry = %d (prio %d)", s->v->entry, s->v->priority); hidden = blitCel(s->xPos, s->yPos, s->v->priority, s->v->celData, s->v->viewData->agi256_2); if (s->v->entry == 0) { // if ego, update f1 @@ -528,7 +528,7 @@ void SpritesMgr::eraseBoth() { * @see blit_both() */ void SpritesMgr::blitUpdSprites() { - debugC(7, kDebugLevelSprites, "blit updating"); + debugC(7, kDebugLevelSprites, "blitUpdSprites()"); buildUpdBlitlist(); blitSprites(_sprUpd); } @@ -542,7 +542,7 @@ void SpritesMgr::blitUpdSprites() { * @see blit_both() */ void SpritesMgr::blitNonupdSprites() { - debugC(7, kDebugLevelSprites, "blit non-updating"); + debugC(7, kDebugLevelSprites, "blitNonupdSprites()"); buildNonupdBlitlist(); blitSprites(_sprNonupd); } @@ -578,7 +578,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in int x1, y1, x2, y2, y3; uint8 *p1, *p2; - debugC(3, kDebugLevelSprites, "v=%d, l=%d, c=%d, x=%d, y=%d, p=%d, m=%d", view, loop, cel, x, y, pri, mar); + debugC(3, kDebugLevelSprites, "addToPic(view=%d, loop=%d, cel=%d, x=%d, y=%d, pri=%d, mar=%d)", view, loop, cel, x, y, pri, mar); _vm->recordImageStackCall(ADD_VIEW, view, loop, cel, x, y, pri, mar); @@ -609,7 +609,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in eraseBoth(); - debugC(4, kDebugLevelSprites, "blit_cel (%d, %d, %d, c)", x, y, pri); + debugC(4, kDebugLevelSprites, "blitCel(%d, %d, %d, c)", x, y, pri); blitCel(x1, y1, pri, c, _vm->_game.views[view].agi256_2); // If margin is 0, 1, 2, or 3, the base of the cel is @@ -659,7 +659,6 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in blitBoth(); - debugC(4, kDebugLevelSprites, "commit_block (%d, %d, %d, %d)", x1, y1, x2, y2); commitBlock(x1, y1, x2, y2); } @@ -711,7 +710,7 @@ void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { y1 = CLIP(y1, 0, _HEIGHT - 1); y2 = CLIP(y2, 0, _HEIGHT - 1); - debugC(7, kDebugLevelSprites, "%d, %d, %d, %d", x1, y1, x2, y2); + debugC(7, kDebugLevelSprites, "commitBlock(%d, %d, %d, %d)", x1, y1, x2, y2); w = x2 - x1 + 1; q = &_vm->_game.sbuf16c[x1 + _WIDTH * y1]; -- cgit v1.2.3 From 295edafdc4b266a7283ba494e685dfb22f132c6a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:30:26 +0000 Subject: AGI: improve script-related debug output. svn-id: r49740 --- engines/agi/op_cmd.cpp | 27 +++++++++++++-------------- engines/agi/sprite.cpp | 2 ++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index d7e3ba416c..f31e1d156d 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -209,47 +209,38 @@ cmd(object_on_anything) { } cmd(object_on_land) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags |= ON_LAND; } cmd(object_on_water) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags |= ON_WATER; } cmd(observe_horizon) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags &= ~IGNORE_HORIZON; } cmd(ignore_horizon) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags |= IGNORE_HORIZON; } cmd(observe_objs) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags &= ~IGNORE_OBJECTS; } cmd(ignore_objs) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags |= IGNORE_OBJECTS; } cmd(observe_blocks) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags &= ~IGNORE_BLOCKS; } cmd(ignore_blocks) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); vt.flags |= IGNORE_BLOCKS; } cmd(set_horizon) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); game.horizon = p0; } @@ -328,7 +319,6 @@ cmd(set_cel_f) { } cmd(set_view) { - debugC(4, kDebugLevelScripts, "o%d, %d", p0, p1); g_agi->setView(&vt, p1); } @@ -423,12 +413,10 @@ cmd(word_to_string) { } cmd(open_dialogue) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); game.hasWindow = true; } cmd(close_dialogue) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); game.hasWindow = false; } @@ -1438,7 +1426,6 @@ cmd(display) { } cmd(display_f) { - debugC(4, kDebugLevelScripts, "p0 = %d", p0); g_agi->printText(curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, game.colorFg, game.colorBg); } @@ -1781,6 +1768,9 @@ int AgiEngine::runLogic(int n) { int num = 0; ScriptPos sp; + debugC(2, kDebugLevelScripts, "================="); + debugC(2, kDebugLevelScripts, "runLogic(%d)", n); + sp.script = n; sp.curIP = 0; _game.execStack.push_back(sp); @@ -1816,6 +1806,11 @@ int AgiEngine::runLogic(int n) { _game.execStack.back().curIP = ip; + char st[101]; + int sz = MIN(_game.execStack.size(), 100u); + memset(st, '.', sz); + st[sz] = 0; + switch (op = *(code + ip++)) { case 0xff: // if (open/close) testIfCode(n); @@ -1833,6 +1828,9 @@ int AgiEngine::runLogic(int n) { } break; case 0x00: // return + debugC(2, kDebugLevelScripts, "%sreturn() // Logic %d", st, n); + debugC(2, kDebugLevelScripts, "================="); + _game.execStack.pop_back(); return 1; default: @@ -1840,7 +1838,8 @@ int AgiEngine::runLogic(int n) { memmove(p, code + ip, num); memset(p + num, 0, CMD_BSIZE - num); - debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]); + debugC(2, kDebugLevelScripts, "%s%s(%d %d %d)", st, logicNamesCmd[op].name, p[0], p[1], p[2]); + agiCommand[op](this, p); ip += num; } diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 26aa100d2a..70cc279420 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -332,6 +332,8 @@ void SpritesMgr::buildList(SpriteList &l, bool (*test)(VtEntry *, AgiEngine *)) } } + debugC(5, kDebugLevelSprites, "buildList() --> entries %d", i); + // now look for the smallest y value in the array and put that // sprite in the list for (j = 0; j < i; j++) { -- cgit v1.2.3 From 7034d071b6f44fb77f3379535f146a095357c5be Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:30:54 +0000 Subject: AGI: proper fix for sprite leftover-related bugs. Removed workarounds. svn-id: r49741 --- engines/agi/op_cmd.cpp | 23 ++++++++++++++++++++++- engines/agi/sprite.cpp | 8 ++------ engines/agi/view.cpp | 31 ------------------------------- 3 files changed, 24 insertions(+), 38 deletions(-) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index f31e1d156d..fb95c1cee1 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -889,7 +889,28 @@ cmd(erase) { } g_sprites->blitUpdSprites(); - g_sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos); + int x1, y1, x2, y2, w, h; + + w = MAX(vt.celData->width, vt.celData2->width); + h = MAX(vt.celData->height, vt.celData2->height); + + if (vt.xPos < vt.xPos2) { + x1 = vt.xPos; + x2 = vt.xPos2 + w - 1; + } else { + x1 = vt.xPos2; + x2 = vt.xPos + w - 1; + } + + if (vt.yPos < vt.yPos2) { + y1 = vt.yPos - h + 1; + y2 = vt.yPos2; + } else { + y1 = vt.yPos2 - h + 1; + y2 = vt.yPos; + } + + g_sprites->commitBlock(x1, y1, x2, y2); } cmd(position) { diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 70cc279420..10184fcaa4 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -389,12 +389,8 @@ void SpritesMgr::commitSprites(SpriteList &l) { Sprite *s = *iter; int x1, y1, x2, y2, w, h; - w = (s->v->celData->width > s->v->celData2->width) ? - s->v->celData->width : s->v->celData2->width; - - h = (s->v->celData->height > - s->v->celData2->height) ? s->v->celData-> - height : s->v->celData2->height; + w = MAX(s->v->celData->width, s->v->celData2->width); + h = MAX(s->v->celData->height, s->v->celData2->height); s->v->celData2 = s->v->celData; diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index b506c1ecab..a775b5f78b 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -294,37 +294,6 @@ void AgiEngine::setLoop(VtEntry *v, int n) { * @param n number of AGI view resource */ void AgiEngine::setView(VtEntry *v, int n) { - - uint16 viewFlags = 0; - - // WORKAROUND - // When setting a view to the view table, if there's already another view set in that - // view table entry and it's still drawn, erase the existing view before setting the new one - // Fixes bug #1658643: AGI: SQ1 (2.2 DOS ENG) Graphic error, ego leaves behind copy - // Update: Apparently, this makes ego dissapear at times, e.g. when textboxes are shown - // Therefore, it's limited to view 118 in SQ1 (Roger climbing the ladder) - // Fixes bug #1715284: Roger sometimes disappears - // Update: Added case fot bug #2960557: AGI: (Fan) SQ0 - Sprite (Ego) not erased - if (v->viewData != NULL) { - if (((v->currentView == 118 && getGameID() == GID_SQ1) || - (v->currentView == 2 & (n == 254 || n == 255) && getGameID() == GID_SQ0)) && v->flags & DRAWN) { - viewFlags = v->flags; // Store the flags for the view - _sprites->eraseUpdSprites(); - - if (v->flags & UPDATE) { - v->flags &= ~DRAWN; - } else { - _sprites->eraseNonupdSprites(); - v->flags &= ~DRAWN; - _sprites->blitNonupdSprites(); - } - _sprites->blitUpdSprites(); - - _sprites->commitBlock(v->xPos, v->yPos - v->ySize + 1, v->xPos + v->xSize - 1, v->yPos); - v->flags = viewFlags; // Restore the view's flags - } - } - v->viewData = &_game.views[n]; v->currentView = n; v->numLoops = v->viewData->numLoops; -- cgit v1.2.3 From ffc390e64c1adc8bd863ecd0bfe72ff7ecba6832 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:31:18 +0000 Subject: AGI: Fix bug #1945716. Bug #1945716: "AGI: Fan(Kings Quest 2 1/4) - Sprite not erased". Added a workaround, since it is design flaw of our rendering system. svn-id: r49742 --- engines/agi/op_cmd.cpp | 24 +++++------------------- engines/agi/sprite.cpp | 32 +++++++++++++------------------- engines/agi/view.cpp | 1 + engines/agi/view.h | 1 + 4 files changed, 20 insertions(+), 38 deletions(-) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index fb95c1cee1..bb0799d92c 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -889,26 +889,12 @@ cmd(erase) { } g_sprites->blitUpdSprites(); - int x1, y1, x2, y2, w, h; + int x1, y1, x2, y2; - w = MAX(vt.celData->width, vt.celData2->width); - h = MAX(vt.celData->height, vt.celData2->height); - - if (vt.xPos < vt.xPos2) { - x1 = vt.xPos; - x2 = vt.xPos2 + w - 1; - } else { - x1 = vt.xPos2; - x2 = vt.xPos + w - 1; - } - - if (vt.yPos < vt.yPos2) { - y1 = vt.yPos - h + 1; - y2 = vt.yPos2; - } else { - y1 = vt.yPos2 - h + 1; - y2 = vt.yPos; - } + x1 = MIN((int)MIN(vt.xPos, vt.xPos2), MIN(vt.xPos + vt.celData->width, vt.xPos2 + vt.celData2->width)); + x2 = MAX((int)MAX(vt.xPos, vt.xPos2), MAX(vt.xPos + vt.celData->width, vt.xPos2 + vt.celData2->width)); + y1 = MIN((int)MIN(vt.yPos, vt.yPos2), MIN(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); + y2 = MAX((int)MAX(vt.yPos, vt.yPos2), MAX(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); g_sprites->commitBlock(x1, y1, x2, y2); } diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 10184fcaa4..611dd16478 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -241,6 +241,14 @@ void SpritesMgr::objsRestoreArea(Sprite *s) { q += xSize; pos0 += _WIDTH; } + + // WORKAROUND + // When set.view command is called, current code cannot detect this situation while updating + // Thus we force removal of the old sprite + if (s->v->viewReplaced) { + commitBlock(xPos, yPos, xPos + xSize, yPos + ySize); + s->v->viewReplaced = false; + } } @@ -387,29 +395,15 @@ void SpritesMgr::commitSprites(SpriteList &l) { SpriteList::iterator iter; for (iter = l.begin(); iter != l.end(); ++iter) { Sprite *s = *iter; - int x1, y1, x2, y2, w, h; + int x1, y1, x2, y2; - w = MAX(s->v->celData->width, s->v->celData2->width); - h = MAX(s->v->celData->height, s->v->celData2->height); + x1 = MIN((int)MIN(s->v->xPos, s->v->xPos2), MIN(s->v->xPos + s->v->celData->width, s->v->xPos2 + s->v->celData2->width)); + x2 = MAX((int)MAX(s->v->xPos, s->v->xPos2), MAX(s->v->xPos + s->v->celData->width, s->v->xPos2 + s->v->celData2->width)); + y1 = MIN((int)MIN(s->v->yPos, s->v->yPos2), MIN(s->v->yPos - s->v->celData->height, s->v->yPos2 - s->v->celData2->height)); + y2 = MAX((int)MAX(s->v->yPos, s->v->yPos2), MAX(s->v->yPos - s->v->celData->height, s->v->yPos2 - s->v->celData2->height)); s->v->celData2 = s->v->celData; - if (s->v->xPos < s->v->xPos2) { - x1 = s->v->xPos; - x2 = s->v->xPos2 + w - 1; - } else { - x1 = s->v->xPos2; - x2 = s->v->xPos + w - 1; - } - - if (s->v->yPos < s->v->yPos2) { - y1 = s->v->yPos - h + 1; - y2 = s->v->yPos2; - } else { - y1 = s->v->yPos2 - h + 1; - y2 = s->v->yPos; - } - commitBlock(x1, y1, x2, y2); if (s->v->stepTimeCount != s->v->stepTime) diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index a775b5f78b..b89ab3915c 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -297,6 +297,7 @@ void AgiEngine::setView(VtEntry *v, int n) { v->viewData = &_game.views[n]; v->currentView = n; v->numLoops = v->viewData->numLoops; + v->viewReplaced = true; setLoop(v, v->currentLoop >= v->numLoops ? 0 : v->currentLoop); } diff --git a/engines/agi/view.h b/engines/agi/view.h index f9017ec4ae..85f2d6eaf9 100644 --- a/engines/agi/view.h +++ b/engines/agi/view.h @@ -63,6 +63,7 @@ struct VtEntry { int16 xPos; int16 yPos; uint8 currentView; + bool viewReplaced; struct AgiView *viewData; uint8 currentLoop; uint8 numLoops; -- cgit v1.2.3 From 83053ecc27905bc60cdeea2cbfc9f9550764579b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:31:39 +0000 Subject: AGI: Fix bug #2825278. Bug #2825278: "AGI: KQ4: Swimming on land". Our drawing code was not picture perfect, and thus priority screen was trashed by one of Fills, i.e. the color leaked and took whole screen. svn-id: r49743 --- engines/agi/loader_v3.cpp | 16 ++++------------ engines/agi/picture.cpp | 14 ++++++++------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp index cd97c44521..4227745c5f 100644 --- a/engines/agi/loader_v3.cpp +++ b/engines/agi/loader_v3.cpp @@ -227,19 +227,12 @@ uint8 *AgiLoader_v3::loadVolRes(AgiDir *agid) { compBuffer = (uint8 *)calloc(1, agid->clen + 32); fp.read(compBuffer, agid->clen); - if (x[2] & 0x80 || agid->len == agid->clen) { + if (x[2] & 0x80) { // compressed pic + data = _vm->_picture->convertV3Pic(compBuffer, agid->clen); + free(compBuffer); + } else if (agid->len == agid->clen) { // do not decompress data = compBuffer; - -#if 0 - // CM: added to avoid problems in - // convert_v2_v3_pic() when clen > len - // e.g. Sierra demo 4, first picture - // (Tue Mar 16 13:13:43 EST 1999) - agid->len = agid->clen; - - // Now removed to fix Gold Rush! in demo4 -#endif } else { // it is compressed data = (uint8 *)calloc(1, agid->len + 32); @@ -309,7 +302,6 @@ int AgiLoader_v3::loadResource(int t, int n) { unloadResource(rPICTURE, n); data = loadVolRes(&_vm->_game.dirPic[n]); if (data != NULL) { - data = _vm->_picture->convertV3Pic(data, _vm->_game.dirPic[n].len); _vm->_game.pictures[n].rdata = data; _vm->_game.dirPic[n].flags |= RES_LOADED; } else { diff --git a/engines/agi/picture.cpp b/engines/agi/picture.cpp index 60877de430..dc77433cb2 100644 --- a/engines/agi/picture.cpp +++ b/engines/agi/picture.cpp @@ -476,7 +476,7 @@ void PictureMgr::plotPattern(int x, int y) { // new purpose for temp16 - temp16 =( pen_size<<1) +1; // pen size + temp16 = (pen_size << 1) + 1; // pen size pen_final_y += temp16; // the last row of this shape temp16 = temp16 << 1; pen_width = temp16; // width of shape? @@ -495,7 +495,7 @@ void PictureMgr::plotPattern(int x, int y) { } else { circleCond = ((_patCode & 0x10) != 0); counterStep = 4; - ditherCond = 0x02; + ditherCond = 0x01; } for (; pen_y < pen_final_y; pen_y++) { @@ -503,10 +503,12 @@ void PictureMgr::plotPattern(int x, int y) { for (counter = 0; counter <= pen_width; counter += counterStep) { if (circleCond || ((binary_list[counter>>1] & circle_word) != 0)) { - temp8 = t % 2; - t = t >> 1; - if (temp8 != 0) - t = t ^ 0xB8; + if ((_patCode & 0x20) != 0) { + temp8 = t % 2; + t = t >> 1; + if (temp8 != 0) + t = t ^ 0xB8; + } // == box plot, != circle plot if ((_patCode & 0x20) == 0 || (t & 0x03) == ditherCond) -- cgit v1.2.3 From 462d1afed8ffbc9a018d07d0c0b280af448e7b52 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:32:01 +0000 Subject: AGI: Fix bug #1875842. Bug #1875842: "AGI: Character loses final walking position". Do not reset ADJ_EGO_XY if non-directional keys were pressed. svn-id: r49744 --- engines/agi/keyboard.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp index e0e1bca045..056df8f026 100644 --- a/engines/agi/keyboard.cpp +++ b/engines/agi/keyboard.cpp @@ -191,9 +191,8 @@ int AgiEngine::handleController(int key) { } } - v->flags &= ~ADJ_EGO_XY; - if (d || key == KEY_STATIONARY) { + v->flags &= ~ADJ_EGO_XY; v->direction = v->direction == d ? 0 : d; return true; } -- cgit v1.2.3 From 88421532aa2fc34fda1a940a4ba994f96e324574 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:32:25 +0000 Subject: AGI: Implemented immediate update for most of gfx to match original. This fixes many subtle effects as in many cases there were no special pausing and engine relied only on the slowliness of the machine. svn-id: r49745 --- engines/agi/op_cmd.cpp | 7 +++++-- engines/agi/sprite.cpp | 19 +++++++++++-------- engines/agi/sprite.h | 4 ++-- engines/agi/view.cpp | 2 ++ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index bb0799d92c..ab7e5010e7 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -741,6 +741,7 @@ cmd(draw_pic) { g_sprites->eraseBoth(); g_picture->decodePicture(_v[p0], true); g_sprites->blitBoth(); + g_sprites->commitBoth(); game.pictureShown = 0; debugC(6, kDebugLevelScripts, "--- end of draw pic %d ---", _v[p0]); @@ -778,6 +779,7 @@ cmd(load_pic) { g_sprites->eraseBoth(); g_agi->agiLoadResource(rPICTURE, _v[p0]); g_sprites->blitBoth(); + g_sprites->commitBoth(); } cmd(discard_pic) { @@ -869,7 +871,7 @@ cmd(draw) { g_sprites->blitUpdSprites(); vt.flags &= ~DONTUPDATE; - g_sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos); + g_sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos, true); debugC(4, kDebugLevelScripts, "vt entry #%d flags = %02x", p0, vt.flags); } @@ -896,7 +898,7 @@ cmd(erase) { y1 = MIN((int)MIN(vt.yPos, vt.yPos2), MIN(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); y2 = MAX((int)MAX(vt.yPos, vt.yPos2), MAX(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); - g_sprites->commitBlock(x1, y1, x2, y2); + g_sprites->commitBlock(x1, y1, x2, y2, true); } cmd(position) { @@ -1804,6 +1806,7 @@ int AgiEngine::runLogic(int n) { } } else { _sprites->blitBoth(); + _sprites->commitBoth(); do { mainCycle(); } while (!_debug.steps && _debug.enabled); diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 611dd16478..d3bd1a6212 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -391,7 +391,7 @@ void SpritesMgr::freeList(SpriteList &l) { * Copy sprites from the pic buffer to the screen buffer, and check if * sprites of the given list have moved. */ -void SpritesMgr::commitSprites(SpriteList &l) { +void SpritesMgr::commitSprites(SpriteList &l, bool immediate) { SpriteList::iterator iter; for (iter = l.begin(); iter != l.end(); ++iter) { Sprite *s = *iter; @@ -404,7 +404,7 @@ void SpritesMgr::commitSprites(SpriteList &l) { s->v->celData2 = s->v->celData; - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, immediate); if (s->v->stepTimeCount != s->v->stepTime) continue; @@ -458,11 +458,11 @@ void SpritesMgr::blitSprites(SpriteList& l) { */ void SpritesMgr::commitUpdSprites() { - commitSprites(_sprUpd); + commitSprites(_sprUpd, true); } void SpritesMgr::commitNonupdSprites() { - commitSprites(_sprNonupd); + commitSprites(_sprNonupd, true); } // check moves in both lists @@ -651,7 +651,7 @@ void SpritesMgr::addToPic(int view, int loop, int cel, int x, int y, int pri, in blitBoth(); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); } /** @@ -682,15 +682,15 @@ void SpritesMgr::showObj(int n) { objsSaveArea(&s); blitCel(x1, y1, 15, c, _vm->_game.views[n].agi256_2); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); _vm->messageBox(_vm->_game.views[n].descr); objsRestoreArea(&s); - commitBlock(x1, y1, x2, y2); + commitBlock(x1, y1, x2, y2, true); free(s.buffer); } -void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { +void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2, bool immediate) { int i, w, offset; uint8 *q; @@ -714,6 +714,9 @@ void SpritesMgr::commitBlock(int x1, int y1, int x2, int y2) { } _gfx->flushBlockA(x1, y1 + offset, x2, y2 + offset); + + if (immediate) + _gfx->doUpdate(); } SpritesMgr::SpritesMgr(AgiEngine *agi, GfxMgr *gfx) { diff --git a/engines/agi/sprite.h b/engines/agi/sprite.h index 7d6d7bb97e..57fd0dacf2 100644 --- a/engines/agi/sprite.h +++ b/engines/agi/sprite.h @@ -65,7 +65,7 @@ private: void buildUpdBlitlist(); void buildNonupdBlitlist(); void freeList(SpriteList &l); - void commitSprites(SpriteList &l); + void commitSprites(SpriteList &l, bool immediate = false); void eraseSprites(SpriteList &l); void blitSprites(SpriteList &l); static bool testUpdating(VtEntry *v, AgiEngine *); @@ -88,7 +88,7 @@ public: void commitBoth(); void addToPic(int, int, int, int, int, int, int); void showObj(int); - void commitBlock(int, int, int, int); + void commitBlock(int x1, int y1, int x2, int y2, bool immediate = false); }; } // End of namespace Agi diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index b89ab3915c..cd3584dcae 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -311,6 +311,7 @@ void AgiEngine::startUpdate(VtEntry *v) { v->flags |= UPDATE; _sprites->blitBoth(); + _sprites->commitBoth(); } } @@ -324,6 +325,7 @@ void AgiEngine::stopUpdate(VtEntry *v) { v->flags &= ~UPDATE; _sprites->blitBoth(); + _sprites->commitBoth(); } } -- cgit v1.2.3 From 81870dba5804b776044f89112976d0110b5c0695 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:32:44 +0000 Subject: AGI: Fix bug #2825273. Bug #2825273: "AGI: KQ4: Dwarf sequence". Always allow ESC to work in KQ4. svn-id: r49746 --- engines/agi/keyboard.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp index 056df8f026..f99d5728be 100644 --- a/engines/agi/keyboard.cpp +++ b/engines/agi/keyboard.cpp @@ -104,10 +104,10 @@ int AgiEngine::handleController(int key) { VtEntry *v = &_game.viewTable[0]; int i; - // AGI 3.149 games and The Black Cauldron need KEY_ESCAPE to use menus + // AGI 3.149 games, The Black Cauldron and King's Quest 4 need KEY_ESCAPE to use menus // Games with the GF_ESCPAUSE flag need KEY_ESCAPE to pause the game if (key == 0 || - (key == KEY_ESCAPE && getVersion() != 0x3149 && getGameID() != GID_BC && !(getFeatures() & GF_ESCPAUSE)) ) + (key == KEY_ESCAPE && getVersion() != 0x3149 && getGameID() != GID_BC && getGameID() != GID_KQ4 && !(getFeatures() & GF_ESCPAUSE)) ) return false; if ((getGameID() == GID_MH1 || getGameID() == GID_MH2) && (key == KEY_ENTER) && -- cgit v1.2.3 From f7c830af26b8a7cac4b8a6864e161f614e0e9e06 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:33:07 +0000 Subject: AGI: Fix walking for some versions of KQ4. svn-id: r49747 --- engines/agi/view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index cd3584dcae..03509e81f9 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -368,7 +368,7 @@ void AgiEngine::updateViewtable() { break; default: // for KQ4 - if (getVersion() == 0x3086) + if (getVersion() == 0x3086 || getGameId() == GID_KQ4) loop = loopTable4[v->direction]; break; } -- cgit v1.2.3 From 71917dc52daf2f2cbc2931f59c893c6c933fa2aa Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:33:26 +0000 Subject: AGI: Implement FR #1881179. FR #1881179: "AGI detecting agi mouse". Always run ScummVM in AGIMOUSE compatibility mode, thus no detection for it is needed. svn-id: r49748 --- engines/agi/cycle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index 10df40556f..5614195fcf 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -314,7 +314,8 @@ int AgiEngine::playGame() { _game.clockEnabled = true; _game.lineUserInput = 22; - if (getFeatures() & GF_AGIMOUSE) + // We run AGIMOUSE always as a side effect + if (getFeatures() & GF_AGIMOUSE || 1) report("Using AGI Mouse 1.0 protocol\n"); if (getFeatures() & GF_AGIPAL) -- cgit v1.2.3 From 38ef876d5beabb3f5e5d35690b5b14d6643e6aa3 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:33:57 +0000 Subject: AGI: Split out IIgs sound emulator into separate files. svn-id: r49749 --- engines/agi/module.mk | 1 + engines/agi/sound.cpp | 718 +------------------------------------------- engines/agi/sound.h | 282 +----------------- engines/agi/sound_2gs.cpp | 736 ++++++++++++++++++++++++++++++++++++++++++++++ engines/agi/sound_2gs.h | 311 ++++++++++++++++++++ 5 files changed, 1063 insertions(+), 985 deletions(-) create mode 100644 engines/agi/sound_2gs.cpp create mode 100644 engines/agi/sound_2gs.h diff --git a/engines/agi/module.mk b/engines/agi/module.mk index f031834c9d..3b7741443d 100644 --- a/engines/agi/module.mk +++ b/engines/agi/module.mk @@ -30,6 +30,7 @@ MODULE_OBJS := \ predictive.o \ saveload.o \ sound.o \ + sound_2gs.o \ sprite.o \ text.o \ view.o \ diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index 1b76b1ee40..014a3dba1a 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -31,6 +31,8 @@ #include "agi/agi.h" +#include "agi/sound_2gs.h" + namespace Agi { #define USE_INTERPOLATION @@ -57,18 +59,6 @@ AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, S return NULL; } -IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { - _data = data; // Save the resource pointer - _ptr = _data + 2; // Set current position to just after the header - _len = len; // Save the resource's length - _type = READ_LE_UINT16(data); // Read sound resource's type - _midiTicks = _soundBufTicks = 0; - _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); - - if (!_isValid) // Check for errors - warning("Error creating Apple IIGS midi sound from resource %d (Type %d, length %d)", resnum, _type, len); -} - PCjrSound::PCjrSound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { _data = data; // Save the resource pointer _len = len; // Save the resource's length @@ -86,208 +76,6 @@ const uint8 *PCjrSound::getVoicePointer(uint voiceNum) { return _data + voiceStartOffset; } -IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { - Common::MemoryReadStream stream(data, len, DisposeAfterUse::YES); - - // Check that the header was read ok and that it's of the correct type - if (_header.read(stream) && _header.type == AGI_SOUND_SAMPLE) { // An Apple IIGS AGI sample resource - uint32 sampleStartPos = stream.pos(); - uint32 tailLen = stream.size() - sampleStartPos; - - if (tailLen < _header.sampleSize) { // Check if there's no room for the sample data in the stream - // Apple IIGS Manhunter I: Sound resource 16 has only 16074 bytes - // of sample data although header says it should have 16384 bytes. - warning("Apple IIGS sample (%d) too short (%d bytes. Should be %d bytes). Using the part that's left", - resnum, tailLen, _header.sampleSize); - - _header.sampleSize = (uint16) tailLen; // Use the part that's left - } - - if (_header.pitch > 0x7F) { // Check if the pitch is invalid - warning("Apple IIGS sample (%d) has too high pitch (0x%02x)", resnum, _header.pitch); - - _header.pitch &= 0x7F; // Apple IIGS AGI probably did it this way too - } - - // Finalize the header info using the 8-bit unsigned sample data - _header.finalize(stream); - - // Convert sample data from 8-bit unsigned to 8-bit signed format - stream.seek(sampleStartPos); - _sample = new int8[_header.sampleSize]; - - if (_sample != NULL) - _isValid = SoundMgr::convertWave(stream, _sample, _header.sampleSize); - } - - if (!_isValid) // Check for errors - warning("Error creating Apple IIGS sample from resource %d (Type %d, length %d)", resnum, _header.type, len); -} - -/** Reads an Apple IIGS envelope from then given stream. */ -bool IIgsEnvelope::read(Common::SeekableReadStream &stream) { - for (int segNum = 0; segNum < ENVELOPE_SEGMENT_COUNT; segNum++) { - seg[segNum].bp = stream.readByte(); - seg[segNum].inc = stream.readUint16LE(); - } - - return !(stream.eos() || stream.err()); -} - -/** Reads an Apple IIGS wave information structure from the given stream. */ -bool IIgsWaveInfo::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - top = stream.readByte(); - addr = stream.readByte() * 256; - size = (1 << (stream.readByte() & 7)) * 256; - - // Read packed mode byte and parse it into parts - byte packedModeByte = stream.readByte(); - channel = (packedModeByte >> 4) & 1; // Bit 4 - mode = (packedModeByte >> 1) & 3; // Bits 1-2 - halt = (packedModeByte & 1) != 0; // Bit 0 (Converted to boolean) - - relPitch = stream.readSint16LE(); - - // Zero the wave address if we want to ignore the wave address info - if (ignoreAddr) - addr = 0; - - return !(stream.eos() || stream.err()); -} - -bool IIgsWaveInfo::finalize(Common::SeekableReadStream &uint8Wave) { - uint32 startPos = uint8Wave.pos(); // Save stream's starting position - uint8Wave.seek(addr, SEEK_CUR); // Seek to wave's address - - // Calculate the true sample size (A zero ends the sample prematurely) - uint trueSize = size; // Set a default value for the result - for (uint i = 0; i < size; i++) { - if (uint8Wave.readByte() == 0) { - trueSize = i; - // A zero in the sample stream turns off looping - // (At least that's what MESS 0.117 and KEGS32 0.91 seem to do) - if (mode == OSC_MODE_LOOP) - mode = OSC_MODE_ONESHOT; - break; - } - } - size = trueSize; // Set the true sample size - - uint8Wave.seek(startPos); // Seek back to the stream's starting position - - return true; -} - -bool IIgsOscillator::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < WAVES_PER_OSCILLATOR; i++) - if (!waves[i].finalize(uint8Wave)) - return false; - - return true; -} - -bool IIgsOscillatorList::read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr) { - // First read the A waves and then the B waves for the oscillators - for (uint waveNum = 0; waveNum < WAVES_PER_OSCILLATOR; waveNum++) - for (uint oscNum = 0; oscNum < oscillatorCount; oscNum++) - if (!osc[oscNum].waves[waveNum].read(stream, ignoreAddr)) - return false; - - count = oscillatorCount; // Set the oscillator count - - return true; -} - -bool IIgsOscillatorList::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < count; i++) - if (!osc[i].finalize(uint8Wave)) - return false; - - return true; -} - -bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - env.read(stream); - relseg = stream.readByte(); - /*byte priority =*/ stream.readByte(); // Not needed? 32 in all tested data. - bendrange = stream.readByte(); - vibdepth = stream.readByte(); - vibspeed = stream.readByte(); - /*byte spare =*/ stream.readByte(); // Not needed? 0 in all tested data. - byte wac = stream.readByte(); // Read A wave count - byte wbc = stream.readByte(); // Read B wave count - oscList.read(stream, wac, ignoreAddr); // Read the oscillators - return (wac == wbc) && !(stream.eos() || stream.err()); // A and B wave counts must match -} - -bool IIgsInstrumentHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return oscList.finalize(uint8Wave); -} - -bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { - type = stream.readUint16LE(); - pitch = stream.readByte(); - unknownByte_Ofs3 = stream.readByte(); - volume = stream.readByte(); - unknownByte_Ofs5 = stream.readByte(); - instrumentSize = stream.readUint16LE(); - sampleSize = stream.readUint16LE(); - // Read the instrument header *ignoring* its wave address info - - return instrument.read(stream, true); -} - -bool IIgsSampleHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return instrument.finalize(uint8Wave); -} - -/** Older Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV1 = { - {19, 20, 22, 23, 21, 24, 5, 5, 5, 5, - 6, 7, 10, 9, 11, 9, 15, 8, 5, 5, - 17, 16, 18, 12, 14, 5, 5, 5, 5, 5, - 0, 1, 2, 9, 3, 4, 15, 2, 2, 2, - 25, 13, 13, 25}, - 5 -}; - -/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV2 = { - {21, 22, 24, 25, 23, 26, 6, 6, 6, 6, - 7, 9, 12, 8, 13, 11, 17, 10, 6, 6, - 19, 18, 20, 14, 16, 6, 6, 6, 6, 6, - 0, 1, 2, 4, 3, 5, 17, 2, 2, 2, - 27, 15, 15, 27}, - 6 -}; - -/** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ -static const InstrumentSetInfo instSetV1 = { - 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", progToInstMappingV1 -}; - -/** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ -static const InstrumentSetInfo instSetV2 = { - 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", progToInstMappingV2 -}; - -/** Information about different Apple IIGS AGI executables. */ -static const IIgsExeInfo IIgsExeInfos[] = { - {GID_SQ1, "SQ", 0x1002, 138496, 0x80AD, instSetV1}, - {GID_LSL1, "LL", 0x1003, 141003, 0x844E, instSetV2}, - {GID_AGIDEMO, "DEMO", 0x1005, 141884, 0x8469, instSetV2}, - {GID_KQ1, "KQ", 0x1006, 141894, 0x8469, instSetV2}, - {GID_PQ1, "PQ", 0x1007, 141882, 0x8469, instSetV2}, - {GID_MIXEDUP, "MG", 0x1013, 142552, 0x84B7, instSetV2}, - {GID_KQ2, "KQ2", 0x1013, 143775, 0x84B7, instSetV2}, - {GID_KQ3, "KQ3", 0x1014, 144312, 0x84B7, instSetV2}, - {GID_SQ2, "SQ2", 0x1014, 107882, 0x6563, instSetV2}, - {GID_MH1, "MH", 0x2004, 147678, 0x8979, instSetV2}, - {GID_KQ4, "KQ4", 0x2006, 147652, 0x8979, instSetV2}, - {GID_BC, "BC", 0x3001, 148192, 0x8979, instSetV2}, - {GID_GOLDRUSH, "GR", 0x3003, 148268, 0x8979, instSetV2} -}; - static const int16 waveformRamp[WAVEFORM_SIZE] = { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, @@ -370,7 +158,7 @@ void SoundMgr::startSound(int resnum, int flag) { switch (type) { case AGI_SOUND_SAMPLE: { IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[_playingSound]; - _gsSound.playSampleSound(sampleRes->getHeader(), sampleRes->getSample()); + _gsSound->playSampleSound(sampleRes->getHeader(), sampleRes->getSample()); break; } case AGI_SOUND_MIDI: @@ -411,8 +199,6 @@ void SoundMgr::stopSound() { debugC(3, kDebugLevelSound, "stopSound() --> %d", _playingSound); - _vm->setflag(_endflag, true); - _endflag = -1; if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { for (i = 0; i < NUM_CHANNELS; i++) @@ -424,38 +210,13 @@ void SoundMgr::stopSound() { _vm->_game.sounds[_playingSound]->stop(); if (_vm->_soundemu == SOUND_EMU_APPLE2GS) { - _gsSound.stopSounds(); + _gsSound->stopSounds(); } _playingSound = -1; } } -void IIgsSoundMgr::stopSounds() { - // Stops all sounds on all MIDI channels - for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->stopSounds(); -} - -bool IIgsSoundMgr::playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample) { - stopSounds(); - IIgsMidiChannel &channel = _midiChannels[kSfxMidiChannel]; - - channel.setInstrument(&sampleHeader.instrument, sample); - channel.setVolume(sampleHeader.volume); - channel.noteOn(sampleHeader.pitch, 64); // Use default velocity (i.e. 64) - - return true; -} - -void IIgsMidiChannel::stopSounds() { - // Stops all sounds on this single MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->stop(); - - _gsChannels.clear(); -} - int SoundMgr::initSound() { int r = -1; @@ -540,290 +301,6 @@ void SoundMgr::playNote(int i, int freq, int vol) { } } -void SoundMgr::playMidiSound() { - if (_disabledMidi) - return; - - const uint8 *p; - uint8 parm1, parm2; - static uint8 cmd, ch; - - if (_playingSound == -1 || _vm->_game.sounds[_playingSound] == NULL) { - warning("Error playing Apple IIGS MIDI sound resource"); - _playing = false; - - return; - } - - IIgsMidi *midiObj = (IIgsMidi *) _vm->_game.sounds[_playingSound]; - - _playing = true; - p = midiObj->getPtr(); - - midiObj->_soundBufTicks++; - - while (true) { - uint8 readByte = *p; - - // Check for end of MIDI sequence marker (Can also be here before delta-time) - if (readByte == MIDI_BYTE_STOP_SEQUENCE) { - debugC(3, kDebugLevelSound, "End of MIDI sequence (Before reading delta-time)"); - _playing = false; - - midiObj->rewind(); - - return; - } else if (readByte == MIDI_BYTE_TIMER_SYNC) { - debugC(3, kDebugLevelSound, "Timer sync"); - p++; // Jump over the timer sync byte as it's not needed - - continue; - } - - uint8 deltaTime = readByte; - if (midiObj->_midiTicks + deltaTime > midiObj->_soundBufTicks) { - break; - } - midiObj->_midiTicks += deltaTime; - p++; // Jump over the delta-time byte as it was already taken care of - - // Check for end of MIDI sequence marker (This time it after reading delta-time) - if (*p == MIDI_BYTE_STOP_SEQUENCE) { - debugC(3, kDebugLevelSound, "End of MIDI sequence (After reading delta-time)"); - _playing = false; - - midiObj->rewind(); - - return; - } - - // Separate byte into command and channel if it's a command byte. - // Otherwise use running status (i.e. previously set command and channel). - if (*p & 0x80) { - cmd = *p++; - ch = cmd & 0x0f; - cmd >>= 4; - } - - switch (cmd) { - case MIDI_CMD_NOTE_OFF: - parm1 = *p++; - parm2 = *p++; - _gsSound.midiNoteOff(ch, parm1, parm2); - break; - case MIDI_CMD_NOTE_ON: - parm1 = *p++; - parm2 = *p++; - _gsSound.midiNoteOn(ch, parm1, parm2); - break; - case MIDI_CMD_CONTROLLER: - parm1 = *p++; - parm2 = *p++; - _gsSound.midiController(ch, parm1, parm2); - break; - case MIDI_CMD_PROGRAM_CHANGE: - parm1 = *p++; - _gsSound.midiProgramChange(ch, parm1); - break; - case MIDI_CMD_PITCH_WHEEL: - parm1 = *p++; - parm2 = *p++; - - uint16 wheelPos = ((parm2 & 0x7F) << 7) | (parm1 & 0x7F); // 14-bit value - _gsSound.midiPitchWheel(wheelPos); - break; - } - } - - midiObj->setPtr(p); -} - -void IIgsSoundMgr::midiNoteOff(uint8 channel, uint8 note, uint8 velocity) { - _midiChannels[channel].noteOff(note, velocity); - debugC(3, kDebugLevelSound, "note off, channel %02x, note %02x, velocity %02x", channel, note, velocity); -} - -void IIgsSoundMgr::midiNoteOn(uint8 channel, uint8 note, uint8 velocity) { - _midiChannels[channel].noteOn(note, velocity); - debugC(3, kDebugLevelSound, "note on, channel %02x, note %02x, velocity %02x", channel, note, velocity); -} - -// TODO: Check if controllers behave differently on different MIDI channels -// TODO: Doublecheck what other controllers than the volume controller do -void IIgsSoundMgr::midiController(uint8 channel, uint8 controller, uint8 value) { - IIgsMidiChannel &midiChannel = _midiChannels[channel]; - - // The tested Apple IIGS AGI MIDI resources only used - // controllers 0 (Bank select?), 7 (Volume) and 64 (Sustain On/Off). - // Controller 0's parameter was in range 94-127, - // controller 7's parameter was in range 0-127 and - // controller 64's parameter was always 0 (i.e. sustain off). - bool unimplemented = false; - switch (controller) { - case 7: // Volume - midiChannel.setVolume(value); - break; - default: - unimplemented = true; - break; - } - debugC(3, kDebugLevelSound, "controller %02x, ch %02x, val %02x%s", controller, channel, value, unimplemented ? " (Unimplemented)" : ""); -} - -void IIgsSoundMgr::midiProgramChange(uint8 channel, uint8 program) { - _midiChannels[channel].setInstrument(getInstrument(program), _wave.begin()); - debugC(3, kDebugLevelSound, "program change %02x, channel %02x", program, channel); -} - -void IIgsSoundMgr::midiPitchWheel(uint8 wheelPos) { - // In all the tested Apple IIGS AGI MIDI resources - // pitch wheel commands always used 0x2000 (Center position). - // Therefore it should be quite safe to ignore this command. - debugC(3, kDebugLevelSound, "pitch wheel position %04x (Unimplemented)", wheelPos); -} - -IIgsSoundMgr::IIgsSoundMgr() { - _midiChannels.resize(16); // Set the amount of available MIDI channels -} - -const IIgsInstrumentHeader* IIgsSoundMgr::getInstrument(uint8 program) const { - return &_instruments[_midiProgToInst->map(program)]; -} - -void IIgsSoundMgr::setProgramChangeMapping(const MidiProgramChangeMapping *mapping) { - _midiProgToInst = mapping; -} - -void IIgsSoundMgr::removeStoppedSounds() { - for (Common::Array::iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->removeStoppedSounds(); -} - -void IIgsMidiChannel::removeStoppedSounds() { - for (int i = _gsChannels.size() - 1; i >= 0; i--) - if (!_gsChannels[i].playing()) - _gsChannels.remove_at(i); -} - -uint IIgsSoundMgr::activeSounds() const { - uint result = 0; - - for (Common::Array::const_iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - result += iter->activeSounds(); - - return result; -} - -uint IIgsMidiChannel::activeSounds() const { - uint result = 0; - - for (const_iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - if (!iter->end) - result++; - - return result; -} - -void IIgsMidiChannel::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { - _instrument = instrument; - _sample = sample; - - // Set program on each Apple IIGS channel playing on this MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->setInstrument(instrument, sample); -} - -void IIgsMidiChannel::setVolume(uint8 volume) { - _volume = volume; - - // Set volume on each Apple IIGS channel playing on this MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->setChannelVolume(volume); -} - -void IIgsMidiChannel::noteOff(uint8 note, uint8 velocity) { - // Go through all the notes playing on this MIDI channel - // and turn off the ones that are playing the given note - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - if (iter->origNote == note) - iter->noteOff(velocity); -} - -void IIgsMidiChannel::noteOn(uint8 note, uint8 velocity) { - IIgsChannelInfo channel; - - // Use the default channel volume and instrument - channel.setChannelVolume(_volume); - channel.setInstrument(_instrument, _sample); - - // Set the note on and save the channel - channel.noteOn(note, velocity); - _gsChannels.push_back(channel); -} - -void IIgsChannelInfo::rewind() { - this->envVol = this->startEnvVol; - this->envSeg = 0; - this->pos = intToFrac(0); -} - -void IIgsChannelInfo::setChannelVolume(uint8 volume) { - this->chanVol = intToFrac(volume); -} - -void IIgsChannelInfo::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { - assert(instrument != NULL && sample != NULL); - this->ins = instrument; - this->unrelocatedSample = sample; -} - -// TODO/FIXME: Implement correctly and fully (Take velocity into account etc) -void IIgsChannelInfo::noteOn(uint8 noteParam, uint8 velocity) { - this->origNote = noteParam; - this->startEnvVol = intToFrac(0); - rewind(); - - const IIgsWaveInfo *waveInfo = NULL; - - for (uint i = 0; i < ins->oscList.count; i++) - if (ins->oscList(i).waves[0].top >= noteParam) - waveInfo = &ins->oscList(i).waves[0]; - - assert(waveInfo != NULL); - - this->relocatedSample = this->unrelocatedSample + waveInfo->addr; - this->posAdd = intToFrac(0); - this->note = intToFrac(noteParam) + doubleToFrac(waveInfo->relPitch/256.0); - this->vol = doubleToFrac(fracToDouble(this->envVol) * fracToDouble(this->chanVol) / 127.0); - this->loop = (waveInfo->mode == OSC_MODE_LOOP); - this->size = waveInfo->size - waveInfo->addr; - this->end = waveInfo->halt; -} - -// TODO/FIXME: Implement correctly and fully (Take release time and velocity into account etc) -void IIgsChannelInfo::noteOff(uint8 velocity) { - this->loop = false; - this->envSeg = ins->relseg; -} - -void IIgsChannelInfo::stop() { - this->end = true; -} - -bool IIgsChannelInfo::playing() { - return !this->end; -} - -void SoundMgr::playSampleSound() { - if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { - warning("Trying to play a sample but not using Apple IIGS sound emulation mode"); - return; - } - - if (_playingSound != -1) - _playing = _gsSound.activeSounds() > 0; -} - static int cocoFrequencies[] = { 130, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, 261, 277, 293, 311, 329, 349, 369, 391, 415, 440, 466, 493, @@ -946,9 +423,9 @@ uint32 SoundMgr::mixSound() { // TODO: Implement playing both waves in an oscillator // TODO: Implement swap-mode in an oscillator if (_vm->_soundemu == SOUND_EMU_APPLE2GS) { - for (uint midiChan = 0; midiChan < _gsSound._midiChannels.size(); midiChan++) { - for (uint gsChan = 0; gsChan < _gsSound._midiChannels[midiChan]._gsChannels.size(); gsChan++) { - IIgsChannelInfo &channel = _gsSound._midiChannels[midiChan]._gsChannels[gsChan]; + for (uint midiChan = 0; midiChan < _gsSound->_midiChannels.size(); midiChan++) { + for (uint gsChan = 0; gsChan < _gsSound->_midiChannels[midiChan]._gsChannels.size(); gsChan++) { + IIgsChannelInfo &channel = _gsSound->_midiChannels[midiChan]._gsChannels[gsChan]; if (channel.playing()) { // Only mix in actively playing channels // Frequency multiplier was 1076.0 based on tests made with MESS 0.117. // Tests made with KEGS32 averaged the multiplier to around 1045. @@ -1002,7 +479,7 @@ uint32 SoundMgr::mixSound() { } } } - _gsSound.removeStoppedSounds(); + _gsSound->removeStoppedSounds(); return IIGS_BUFFER_SIZE; } // else ... @@ -1077,77 +554,6 @@ uint32 SoundMgr::mixSound() { return BUFFER_SIZE; } -/** - * Finds information about an Apple IIGS AGI executable based on the game ID. - * @return A non-null IIgsExeInfo pointer if successful, otherwise NULL. - */ -const IIgsExeInfo *SoundMgr::getIIgsExeInfo(enum AgiGameID gameid) const { - for (int i = 0; i < ARRAYSIZE(IIgsExeInfos); i++) - if (IIgsExeInfos[i].gameid == gameid) - return &IIgsExeInfos[i]; - return NULL; -} - -bool IIgsSoundMgr::loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo) { - bool loadedOk = false; // Was loading successful? - Common::File file; - - // Open the executable file and check that it has correct size - file.open(exePath); - if (file.size() != (int32)exeInfo.exeSize) { - debugC(3, kDebugLevelSound, "Apple IIGS executable (%s) has wrong size (Is %d, should be %d)", - exePath.getPath().c_str(), file.size(), exeInfo.exeSize); - } - - // Read the whole executable file into memory - Common::SharedPtr data(file.readStream(file.size())); - file.close(); - - // Check that we got enough data to be able to parse the instruments - if (data && data->size() >= (int32)(exeInfo.instSetStart + exeInfo.instSet.byteCount)) { - // Check instrument set's length (The info's saved in the executable) - data->seek(exeInfo.instSetStart - 4); - uint16 instSetByteCount = data->readUint16LE(); - if (instSetByteCount != exeInfo.instSet.byteCount) { - debugC(3, kDebugLevelSound, "Wrong instrument set size (Is %d, should be %d) in Apple IIGS executable (%s)", - instSetByteCount, exeInfo.instSet.byteCount, exePath.getPath().c_str()); - } - - // Check instrument set's md5sum - data->seek(exeInfo.instSetStart); - - char md5str[32+1]; - Common::md5_file_string(*data, md5str, exeInfo.instSet.byteCount); - if (scumm_stricmp(md5str, exeInfo.instSet.md5)) { - warning("Unknown Apple IIGS instrument set (md5: %s) in %s, trying to use it nonetheless", - md5str, exePath.getPath().c_str()); - } - - // Read in the instrument set one instrument at a time - data->seek(exeInfo.instSetStart); - - // Load the instruments - _instruments.clear(); - _instruments.reserve(exeInfo.instSet.instCount); - - IIgsInstrumentHeader instrument; - for (uint i = 0; i < exeInfo.instSet.instCount; i++) { - if (!instrument.read(*data)) { - warning("Error loading Apple IIGS instrument (%d. of %d) from %s, not loading more instruments", - i + 1, exeInfo.instSet.instCount, exePath.getPath().c_str()); - break; - } - _instruments.push_back(instrument); // Add the successfully loaded instrument to the instruments array - } - - // Loading was successful only if all instruments were loaded successfully - loadedOk = (_instruments.size() == exeInfo.instSet.instCount); - } else // Couldn't read enough data from the executable file - warning("Error loading instruments from Apple IIGS executable (%s)", exePath.getPath().c_str()); - - return loadedOk; -} - /** * Convert sample from 8-bit unsigned to 8-bit signed format. * @param source Source stream containing the 8-bit unsigned sample data. @@ -1161,111 +567,6 @@ bool SoundMgr::convertWave(Common::SeekableReadStream &source, int8 *dest, uint return !(source.eos() || source.err()); } -bool IIgsSoundMgr::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo) { - Common::File file; - - // Open the wave file and read it into memory - file.open(wavePath); - Common::SharedPtr uint8Wave(file.readStream(file.size())); - file.close(); - - // Check that we got the whole wave file - if (uint8Wave && uint8Wave->size() == SIERRASTANDARD_SIZE) { - // Check wave file's md5sum - char md5str[32+1]; - Common::md5_file_string(*uint8Wave, md5str, SIERRASTANDARD_SIZE); - if (scumm_stricmp(md5str, exeInfo.instSet.waveFileMd5)) { - warning("Unknown Apple IIGS wave file (md5: %s, game: %s).\n" \ - "Please report the information on the previous line to the ScummVM team.\n" \ - "Using the wave file as it is - music may sound weird", md5str, exeInfo.exePrefix); - } - - uint8Wave->seek(0); // Seek wave to its start - // Convert the wave file from 8-bit unsigned to 8-bit signed and save the result - _wave.resize(uint8Wave->size()); - return SoundMgr::convertWave(*uint8Wave, _wave.begin(), uint8Wave->size()); - } else { // Couldn't read the wave file or it had incorrect size - warning("Error loading Apple IIGS wave file (%s), not loading instruments", wavePath.getPath().c_str()); - return false; - } -} - -/** - * A function object (i.e. a functor) for testing if a Common::FSNode - * object's name is equal (Ignoring case) to a string or to at least - * one of the strings in a list of strings. Can be used e.g. with find_if(). - */ -struct fsnodeNameEqualsIgnoreCase : public Common::UnaryFunction { -// FIXME: This should be replaced; use SearchMan instead - fsnodeNameEqualsIgnoreCase(const Common::StringArray &str) : _str(str) {} - fsnodeNameEqualsIgnoreCase(const Common::String str) { _str.push_back(str); } - bool operator()(const Common::FSNode ¶m) const { - for (Common::StringArray::const_iterator iter = _str.begin(); iter != _str.end(); ++iter) - if (param.getName().equalsIgnoreCase(*iter)) - return true; - return false; - } -private: - Common::StringArray _str; -}; - -bool SoundMgr::loadInstruments() { - // Check that the platform is Apple IIGS, as only it uses custom instruments - if (_vm->getPlatform() != Common::kPlatformApple2GS) { - debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); - return true; - } - - // Get info on the particular Apple IIGS AGI game's executable - const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID) _vm->getGameID()); - if (exeInfo == NULL) { - warning("Unsupported Apple IIGS game, not loading instruments"); - return false; - } - - // List files in the game path - Common::FSList fslist; - Common::FSNode dir(ConfMan.get("path")); - if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly)) { - warning("Invalid game path (\"%s\"), not loading Apple IIGS instruments", dir.getPath().c_str()); - return false; - } - - // Populate executable filenames list (Long filename and short filename) for searching - Common::StringArray exeNames; - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS16"); - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS"); - - // Populate wave filenames list (Long filename and short filename) for searching - Common::StringArray waveNames; - waveNames.push_back("SIERRASTANDARD"); - waveNames.push_back("SIERRAST"); - - // Search for the executable file and the wave file (i.e. check if any of the filenames match) - Common::FSList::const_iterator exeFsnode, waveFsnode; - exeFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(exeNames)); - waveFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(waveNames)); - - // Make sure that we found the executable file - if (exeFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS game executable (%s), not loading instruments", exeNames.begin()->c_str()); - return false; - } - - // Make sure that we found the wave file - if (waveFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS wave file (%s), not loading instruments", waveNames.begin()->c_str()); - return false; - } - - // Set the MIDI program change to instrument number mapping and - // load the instrument headers and their sample data. - // None of the tested SIERRASTANDARD-files have zeroes in them so - // there's no need to check for prematurely ending samples here. - _gsSound.setProgramChangeMapping(&exeInfo->instSet.progToInst); - return _gsSound.loadWaveFile(*waveFsnode, *exeInfo) && _gsSound.loadInstrumentHeaders(*exeFsnode, *exeInfo); -} - void SoundMgr::fillAudio(void *udata, int16 *stream, uint len) { SoundMgr *soundMgr = (SoundMgr *)udata; uint32 p = 0; @@ -1306,6 +607,8 @@ SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) : _chn() { _waveform = 0; _disabledMidi = false; _useChorus = true; // FIXME: Currently always true? + + _gsSound = new IIgsSoundMgr; } void SoundMgr::premixerCall(int16 *data, uint len) { @@ -1318,6 +621,7 @@ void SoundMgr::setVolume(uint8 volume) { SoundMgr::~SoundMgr() { free(_sndBuffer); + delete _gsSound; } } // End of namespace Agi diff --git a/engines/agi/sound.h b/engines/agi/sound.h index 881e3efd56..ab0c9e20e5 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -28,20 +28,11 @@ #include "sound/audiostream.h" #include "sound/mixer.h" -#include "common/frac.h" namespace Agi { #define BUFFER_SIZE 410 -// Apple IIGS MIDI uses 60 ticks per second (Based on tests with Apple IIGS -// KQ1 and SQ1 under MESS 0.124a). So we make the audio buffer size to be a -// 1/60th of a second in length. That should be getSampleRate() / 60 samples -// in length but as getSampleRate() is always 22050 at the moment we just use -// the hardcoded value of 368 (22050/60 = 367.5 which rounds up to 368). -// FIXME: Use getSampleRate() / 60 rather than a hardcoded value -#define IIGS_BUFFER_SIZE 368 - #define SOUND_EMU_NONE 0 #define SOUND_EMU_PC 1 #define SOUND_EMU_TANDY 2 @@ -57,130 +48,6 @@ namespace Agi { #define ENV_RELEASE 7500 /**< envelope release rate */ #define NUM_CHANNELS 7 /**< number of sound channels */ -// MIDI command values (Shifted right by 4 so they're in the lower nibble) -#define MIDI_CMD_NOTE_OFF 0x08 -#define MIDI_CMD_NOTE_ON 0x09 -#define MIDI_CMD_CONTROLLER 0x0B -#define MIDI_CMD_PROGRAM_CHANGE 0x0C -#define MIDI_CMD_PITCH_WHEEL 0x0E -// Whole MIDI byte values (Command and channel info together) -#define MIDI_BYTE_STOP_SEQUENCE 0xFC -#define MIDI_BYTE_TIMER_SYNC 0xF8 - -struct IIgsEnvelopeSegment { - uint8 bp; - uint16 inc; ///< 8b.8b fixed point, very probably little endian -}; - -#define ENVELOPE_SEGMENT_COUNT 8 -struct IIgsEnvelope { - IIgsEnvelopeSegment seg[ENVELOPE_SEGMENT_COUNT]; - - /** Reads an Apple IIGS envelope from then given stream. */ - bool read(Common::SeekableReadStream &stream); -}; - -// 2**(1/12) i.e. the 12th root of 2 -#define SEMITONE 1.059463094359295 - -// C6's frequency is A4's (440 Hz) frequency but one full octave and three semitones higher -// i.e. C6_FREQ = 440 * pow(2.0, 15/12.0) -#define C6_FREQ 1046.502261202395 - -// Size of the SIERRASTANDARD file (i.e. the wave file i.e. the sample data used by the instruments). -#define SIERRASTANDARD_SIZE 65536 - -// Maximum number of instruments in an Apple IIGS instrument set. -// Chosen empirically based on Apple IIGS AGI game data, increase if needed. -#define MAX_INSTRUMENTS 28 - -struct IIgsWaveInfo { - uint8 top; - uint addr; - uint size; -// Oscillator channel -#define OSC_CHANNEL_RIGHT 0 -#define OSC_CHANNEL_LEFT 1 - uint channel; -// Oscillator mode -#define OSC_MODE_LOOP 0 -#define OSC_MODE_ONESHOT 1 -#define OSC_MODE_SYNC_AM 2 -#define OSC_MODE_SWAP 3 - uint mode; - bool halt; - int16 relPitch; ///< Relative pitch in semitones (Signed 8b.8b fixed point) - - /** Reads an Apple IIGS wave information structure from the given stream. */ - bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -// Number of waves per Apple IIGS sound oscillator -#define WAVES_PER_OSCILLATOR 2 - -/** An Apple IIGS sound oscillator. Consists always of two waves. */ -struct IIgsOscillator { - IIgsWaveInfo waves[WAVES_PER_OSCILLATOR]; - - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -// Maximum number of oscillators in an Apple IIGS instrument. -// Chosen empirically based on Apple IIGS AGI game data, increase if needed. -#define MAX_OSCILLATORS 4 - -/** An Apple IIGS sound oscillator list. */ -struct IIgsOscillatorList { - uint count; ///< Oscillator count - IIgsOscillator osc[MAX_OSCILLATORS]; ///< The oscillators - - /** Indexing operators for easier access to the oscillators. */ - const IIgsOscillator &operator()(uint index) const { return osc[index]; } - IIgsOscillator &operator()(uint index) { return osc[index]; } - - /** Reads an Apple IIGS oscillator list from the given stream. */ - bool read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -struct IIgsInstrumentHeader { - IIgsEnvelope env; - uint8 relseg; - uint8 bendrange; - uint8 vibdepth; - uint8 vibspeed; - IIgsOscillatorList oscList; - - /** - * Read an Apple IIGS instrument header from the given stream. - * @param stream The source stream from which to read the data. - * @param ignoreAddr Should we ignore wave infos' wave address variable's value? - * @return True if successful, false otherwise. - */ - bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - -struct IIgsSampleHeader { - uint16 type; - uint8 pitch; ///< Logarithmic, base is 2**(1/12), unknown multiplier (Possibly in range 1040-1080) - uint8 unknownByte_Ofs3; // 0x7F in Gold Rush's sound resource 60, 0 in all others. - uint8 volume; ///< Current guess: Logarithmic in 6 dB steps - uint8 unknownByte_Ofs5; ///< 0 in all tested samples. - uint16 instrumentSize; ///< Little endian. 44 in all tested samples. A guess. - uint16 sampleSize; ///< Little endian. Accurate in all tested samples excluding Manhunter I's sound resource 16. - IIgsInstrumentHeader instrument; - - /** - * Read an Apple IIGS AGI sample header from the given stream. - * @param stream The source stream from which to read the data. - * @return True if successful, false otherwise. - */ - bool read(Common::SeekableReadStream &stream); - bool finalize(Common::SeekableReadStream &uint8Wave); -}; - /** * AGI sound note structure. */ @@ -200,32 +67,6 @@ struct AgiNote { } }; -struct IIgsChannelInfo { - const IIgsInstrumentHeader *ins; ///< Instrument info - const int8 *relocatedSample; ///< Source sample data (8-bit signed format) using relocation - const int8 *unrelocatedSample; ///< Source sample data (8-bit signed format) without relocation - frac_t pos; ///< Current sample position - frac_t posAdd; ///< Current sample position adder (Calculated using note, vibrato etc) - uint8 origNote; ///< The original note without the added relative pitch - frac_t note; ///< Note (With the added relative pitch) - frac_t vol; ///< Current volume (Takes both channel volume and enveloping into account) - frac_t chanVol; ///< Channel volume - frac_t startEnvVol; ///< Starting envelope volume - frac_t envVol; ///< Current envelope volume - uint envSeg; ///< Current envelope segment - uint size; ///< Sample size - bool loop; ///< Should we loop the sample? - bool end; ///< Has the playing ended? - - void rewind(); ///< Rewinds the sound playing on this channel to its start - void setChannelVolume(uint8 volume); ///< Sets the channel volume - void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); ///< Sets the instrument to be used on this channel - void noteOn(uint8 noteParam, uint8 velocity); ///< Starts playing a note on this channel - void noteOff(uint8 velocity); ///< Releases the note on this channel - void stop(); ///< Stops the note playing on this channel instantly - bool playing(); ///< Is there a note playing on this channel? -}; - struct CoCoNote { uint8 freq; uint8 volume; @@ -322,126 +163,11 @@ protected: uint16 _type; ///< Sound resource type }; -class IIgsMidi : public AgiSound { -public: - IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager); - ~IIgsMidi() { if (_data != NULL) free(_data); } - virtual uint16 type() { return _type; } - virtual const uint8 *getPtr() { return _ptr; } - virtual void setPtr(const uint8 *ptr) { _ptr = ptr; } - virtual void rewind() { _ptr = _data + 2; _midiTicks = _soundBufTicks = 0; } -protected: - uint8 *_data; ///< Raw sound resource data - const uint8 *_ptr; ///< Pointer to the current position in the MIDI data - uint32 _len; ///< Length of the raw sound resource - uint16 _type; ///< Sound resource type -public: - uint _midiTicks; ///< MIDI song position in ticks (1/60ths of a second) - uint _soundBufTicks; ///< Sound buffer position in ticks (1/60ths of a second) -}; - -class IIgsSample : public AgiSound { -public: - IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager); - ~IIgsSample() { delete[] _sample; } - virtual uint16 type() { return _header.type; } - const IIgsSampleHeader &getHeader() const { return _header; } - const int8 *getSample() const { return _sample; } -protected: - IIgsSampleHeader _header; ///< Apple IIGS AGI sample header - int8 *_sample; ///< Sample data (8-bit signed format) -}; - -/** Apple IIGS MIDI program change to instrument number mapping. */ -struct MidiProgramChangeMapping { - byte midiProgToInst[44]; ///< Lookup table for the MIDI program number to instrument number mapping - byte undefinedInst; ///< The undefined instrument number - - // Maps the MIDI program number to an instrument number - byte map(uint midiProg) const { - return midiProg < ARRAYSIZE(midiProgToInst) ? midiProgToInst[midiProg] : undefinedInst; - } -}; - -/** Apple IIGS AGI instrument set information. */ -struct InstrumentSetInfo { - uint byteCount; ///< Length of the whole instrument set in bytes - uint instCount; ///< Amount of instrument in the set - const char *md5; ///< MD5 hex digest of the whole instrument set - const char *waveFileMd5; ///< MD5 hex digest of the wave file (i.e. the sample data used by the instruments) - const MidiProgramChangeMapping &progToInst; ///< Program change to instrument number mapping -}; - -/** Apple IIGS AGI executable file information. */ -struct IIgsExeInfo { - enum AgiGameID gameid; ///< Game ID - const char *exePrefix; ///< Prefix of the Apple IIGS AGI executable (e.g. "SQ", "PQ", "KQ4" etc) - uint agiVer; ///< Apple IIGS AGI version number, not strictly needed - uint exeSize; ///< Size of the Apple IIGS AGI executable file in bytes - uint instSetStart; ///< Starting offset of the instrument set inside the executable file - const InstrumentSetInfo &instSet; ///< Information about the used instrument set -}; - -class IIgsMidiChannel { -public: - IIgsMidiChannel() : _instrument(0), _sample(0), _volume(0) {} - uint activeSounds() const; ///< How many active sounds are playing? - void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); - void setVolume(uint8 volume); - void noteOff(uint8 note, uint8 velocity); - void noteOn(uint8 note, uint8 velocity); - void stopSounds(); ///< Clears the channel of any sounds - void removeStoppedSounds(); ///< Removes all stopped sounds from this MIDI channel -public: - typedef Common::Array::const_iterator const_iterator; - typedef Common::Array::iterator iterator; - Common::Array _gsChannels; ///< Apple IIGS channels playing on this MIDI channel -protected: - const IIgsInstrumentHeader *_instrument; ///< Instrument used on this MIDI channel - const int8 *_sample; ///< Sample data used on this MIDI channel - uint8 _volume; ///< MIDI controller number 7 (Volume) -}; - -/** - * Class for managing Apple IIGS sound channels. - * TODO: Check what instruments are used by default on the MIDI channels - * FIXME: Some instrument choices sound wrong - */ -class IIgsSoundMgr { -public: - typedef Common::Array::const_iterator const_iterator; - typedef Common::Array::iterator iterator; - static const uint kSfxMidiChannel = 0; ///< The MIDI channel used for playing sound effects -public: - // For initializing - IIgsSoundMgr(); - void setProgramChangeMapping(const MidiProgramChangeMapping *mapping); - bool loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo); - bool loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo); - // Miscellaneous methods - uint activeSounds() const; ///< How many active sounds are playing? - void stopSounds(); ///< Stops all sounds - void removeStoppedSounds(); ///< Removes all stopped sounds from the MIDI channels - // For playing Apple IIGS AGI samples (Sound effects etc) - bool playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample); - // MIDI commands - void midiNoteOff(uint8 channel, uint8 note, uint8 velocity); - void midiNoteOn(uint8 channel, uint8 note, uint8 velocity); - void midiController(uint8 channel, uint8 controller, uint8 value); - void midiProgramChange(uint8 channel, uint8 program); - void midiPitchWheel(uint8 wheelPos); -protected: - const IIgsInstrumentHeader* getInstrument(uint8 program) const; -public: - Common::Array _midiChannels; ///< Information about each MIDI channel -protected: - Common::Array _wave; ///< Sample data used by the Apple IIGS MIDI instruments - const MidiProgramChangeMapping *_midiProgToInst; ///< MIDI program change to instrument number mapping - Common::Array _instruments; ///< Instruments used by the Apple IIGS AGI -}; - class AgiEngine; class AgiBase; +class IIgsSoundMgr; + +struct IIgsExeInfo; class SoundMgr : public Audio::AudioStream { AgiBase *_vm; @@ -477,7 +203,7 @@ private: bool _playing; ChannelInfo _chn[NUM_CHANNELS]; - IIgsSoundMgr _gsSound; + IIgsSoundMgr *_gsSound; int _endflag; int _playingSound; uint8 _env; diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp new file mode 100644 index 0000000000..ce4aa160a0 --- /dev/null +++ b/engines/agi/sound_2gs.cpp @@ -0,0 +1,736 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/md5.h" +#include "common/config-manager.h" +#include "common/fs.h" +#include "common/random.h" +#include "common/str-array.h" + +#include "agi/agi.h" +#include "agi/sound_2gs.h" + +namespace Agi { + +IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { + _data = data; // Save the resource pointer + _ptr = _data + 2; // Set current position to just after the header + _len = len; // Save the resource's length + _type = READ_LE_UINT16(data); // Read sound resource's type + _midiTicks = _soundBufTicks = 0; + _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); + + if (!_isValid) // Check for errors + warning("Error creating Apple IIGS midi sound from resource %d (Type %d, length %d)", resnum, _type, len); +} + +IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { + Common::MemoryReadStream stream(data, len, DisposeAfterUse::YES); + + // Check that the header was read ok and that it's of the correct type + if (_header.read(stream) && _header.type == AGI_SOUND_SAMPLE) { // An Apple IIGS AGI sample resource + uint32 sampleStartPos = stream.pos(); + uint32 tailLen = stream.size() - sampleStartPos; + + if (tailLen < _header.sampleSize) { // Check if there's no room for the sample data in the stream + // Apple IIGS Manhunter I: Sound resource 16 has only 16074 bytes + // of sample data although header says it should have 16384 bytes. + warning("Apple IIGS sample (%d) too short (%d bytes. Should be %d bytes). Using the part that's left", + resnum, tailLen, _header.sampleSize); + + _header.sampleSize = (uint16) tailLen; // Use the part that's left + } + + if (_header.pitch > 0x7F) { // Check if the pitch is invalid + warning("Apple IIGS sample (%d) has too high pitch (0x%02x)", resnum, _header.pitch); + + _header.pitch &= 0x7F; // Apple IIGS AGI probably did it this way too + } + + // Finalize the header info using the 8-bit unsigned sample data + _header.finalize(stream); + + // Convert sample data from 8-bit unsigned to 8-bit signed format + stream.seek(sampleStartPos); + _sample = new int8[_header.sampleSize]; + + if (_sample != NULL) + _isValid = SoundMgr::convertWave(stream, _sample, _header.sampleSize); + } + + if (!_isValid) // Check for errors + warning("Error creating Apple IIGS sample from resource %d (Type %d, length %d)", resnum, _header.type, len); +} + +/** Reads an Apple IIGS envelope from then given stream. */ +bool IIgsEnvelope::read(Common::SeekableReadStream &stream) { + for (int segNum = 0; segNum < ENVELOPE_SEGMENT_COUNT; segNum++) { + seg[segNum].bp = stream.readByte(); + seg[segNum].inc = stream.readUint16LE(); + } + + return !(stream.eos() || stream.err()); +} + +/** Reads an Apple IIGS wave information structure from the given stream. */ +bool IIgsWaveInfo::read(Common::SeekableReadStream &stream, bool ignoreAddr) { + top = stream.readByte(); + addr = stream.readByte() * 256; + size = (1 << (stream.readByte() & 7)) * 256; + + // Read packed mode byte and parse it into parts + byte packedModeByte = stream.readByte(); + channel = (packedModeByte >> 4) & 1; // Bit 4 + mode = (packedModeByte >> 1) & 3; // Bits 1-2 + halt = (packedModeByte & 1) != 0; // Bit 0 (Converted to boolean) + + relPitch = stream.readSint16LE(); + + // Zero the wave address if we want to ignore the wave address info + if (ignoreAddr) + addr = 0; + + return !(stream.eos() || stream.err()); +} + +bool IIgsWaveInfo::finalize(Common::SeekableReadStream &uint8Wave) { + uint32 startPos = uint8Wave.pos(); // Save stream's starting position + uint8Wave.seek(addr, SEEK_CUR); // Seek to wave's address + + // Calculate the true sample size (A zero ends the sample prematurely) + uint trueSize = size; // Set a default value for the result + for (uint i = 0; i < size; i++) { + if (uint8Wave.readByte() == 0) { + trueSize = i; + // A zero in the sample stream turns off looping + // (At least that's what MESS 0.117 and KEGS32 0.91 seem to do) + if (mode == OSC_MODE_LOOP) + mode = OSC_MODE_ONESHOT; + break; + } + } + size = trueSize; // Set the true sample size + + uint8Wave.seek(startPos); // Seek back to the stream's starting position + + return true; +} + +bool IIgsOscillator::finalize(Common::SeekableReadStream &uint8Wave) { + for (uint i = 0; i < WAVES_PER_OSCILLATOR; i++) + if (!waves[i].finalize(uint8Wave)) + return false; + + return true; +} + +bool IIgsOscillatorList::read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr) { + // First read the A waves and then the B waves for the oscillators + for (uint waveNum = 0; waveNum < WAVES_PER_OSCILLATOR; waveNum++) + for (uint oscNum = 0; oscNum < oscillatorCount; oscNum++) + if (!osc[oscNum].waves[waveNum].read(stream, ignoreAddr)) + return false; + + count = oscillatorCount; // Set the oscillator count + + return true; +} + +bool IIgsOscillatorList::finalize(Common::SeekableReadStream &uint8Wave) { + for (uint i = 0; i < count; i++) + if (!osc[i].finalize(uint8Wave)) + return false; + + return true; +} + +bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { + env.read(stream); + relseg = stream.readByte(); + /*byte priority =*/ stream.readByte(); // Not needed? 32 in all tested data. + bendrange = stream.readByte(); + vibdepth = stream.readByte(); + vibspeed = stream.readByte(); + /*byte spare =*/ stream.readByte(); // Not needed? 0 in all tested data. + byte wac = stream.readByte(); // Read A wave count + byte wbc = stream.readByte(); // Read B wave count + oscList.read(stream, wac, ignoreAddr); // Read the oscillators + return (wac == wbc) && !(stream.eos() || stream.err()); // A and B wave counts must match +} + +bool IIgsInstrumentHeader::finalize(Common::SeekableReadStream &uint8Wave) { + return oscList.finalize(uint8Wave); +} + +bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { + type = stream.readUint16LE(); + pitch = stream.readByte(); + unknownByte_Ofs3 = stream.readByte(); + volume = stream.readByte(); + unknownByte_Ofs5 = stream.readByte(); + instrumentSize = stream.readUint16LE(); + sampleSize = stream.readUint16LE(); + // Read the instrument header *ignoring* its wave address info + + return instrument.read(stream, true); +} + +bool IIgsSampleHeader::finalize(Common::SeekableReadStream &uint8Wave) { + return instrument.finalize(uint8Wave); +} + +/** Older Apple IIGS AGI MIDI program change to instrument number mapping. */ +static const MidiProgramChangeMapping progToInstMappingV1 = { + {19, 20, 22, 23, 21, 24, 5, 5, 5, 5, + 6, 7, 10, 9, 11, 9, 15, 8, 5, 5, + 17, 16, 18, 12, 14, 5, 5, 5, 5, 5, + 0, 1, 2, 9, 3, 4, 15, 2, 2, 2, + 25, 13, 13, 25}, + 5 +}; + +/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. */ +static const MidiProgramChangeMapping progToInstMappingV2 = { + {21, 22, 24, 25, 23, 26, 6, 6, 6, 6, + 7, 9, 12, 8, 13, 11, 17, 10, 6, 6, + 19, 18, 20, 14, 16, 6, 6, 6, 6, 6, + 0, 1, 2, 4, 3, 5, 17, 2, 2, 2, + 27, 15, 15, 27}, + 6 +}; + +/** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ +static const InstrumentSetInfo instSetV1 = { + 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", progToInstMappingV1 +}; + +/** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ +static const InstrumentSetInfo instSetV2 = { + 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", progToInstMappingV2 +}; + +/** Information about different Apple IIGS AGI executables. */ +static const IIgsExeInfo IIgsExeInfos[] = { + {GID_SQ1, "SQ", 0x1002, 138496, 0x80AD, instSetV1}, + {GID_LSL1, "LL", 0x1003, 141003, 0x844E, instSetV2}, + {GID_AGIDEMO, "DEMO", 0x1005, 141884, 0x8469, instSetV2}, + {GID_KQ1, "KQ", 0x1006, 141894, 0x8469, instSetV2}, + {GID_PQ1, "PQ", 0x1007, 141882, 0x8469, instSetV2}, + {GID_MIXEDUP, "MG", 0x1013, 142552, 0x84B7, instSetV2}, + {GID_KQ2, "KQ2", 0x1013, 143775, 0x84B7, instSetV2}, + {GID_KQ3, "KQ3", 0x1014, 144312, 0x84B7, instSetV2}, + {GID_SQ2, "SQ2", 0x1014, 107882, 0x6563, instSetV2}, + {GID_MH1, "MH", 0x2004, 147678, 0x8979, instSetV2}, + {GID_KQ4, "KQ4", 0x2006, 147652, 0x8979, instSetV2}, + {GID_BC, "BC", 0x3001, 148192, 0x8979, instSetV2}, + {GID_GOLDRUSH, "GR", 0x3003, 148268, 0x8979, instSetV2} +}; + +void IIgsSoundMgr::stopSounds() { + // Stops all sounds on all MIDI channels + for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) + iter->stopSounds(); +} + +void SoundMgr::playSampleSound() { + if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { + warning("Trying to play a sample but not using Apple IIGS sound emulation mode"); + return; + } + + if (_playingSound != -1) + _playing = _gsSound->activeSounds() > 0; +} + +bool IIgsSoundMgr::playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample) { + stopSounds(); + IIgsMidiChannel &channel = _midiChannels[kSfxMidiChannel]; + + channel.setInstrument(&sampleHeader.instrument, sample); + channel.setVolume(sampleHeader.volume); + channel.noteOn(sampleHeader.pitch, 64); // Use default velocity (i.e. 64) + + return true; +} + +void IIgsMidiChannel::stopSounds() { + // Stops all sounds on this single MIDI channel + for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + iter->stop(); + + _gsChannels.clear(); +} + +void SoundMgr::playMidiSound() { + if (_disabledMidi) + return; + + const uint8 *p; + uint8 parm1, parm2; + static uint8 cmd, ch; + + if (_playingSound == -1 || _vm->_game.sounds[_playingSound] == NULL) { + warning("Error playing Apple IIGS MIDI sound resource"); + _playing = false; + + return; + } + + IIgsMidi *midiObj = (IIgsMidi *) _vm->_game.sounds[_playingSound]; + + _playing = true; + p = midiObj->getPtr(); + + midiObj->_soundBufTicks++; + + while (true) { + uint8 readByte = *p; + + // Check for end of MIDI sequence marker (Can also be here before delta-time) + if (readByte == MIDI_BYTE_STOP_SEQUENCE) { + debugC(3, kDebugLevelSound, "End of MIDI sequence (Before reading delta-time)"); + _playing = false; + + midiObj->rewind(); + + return; + } else if (readByte == MIDI_BYTE_TIMER_SYNC) { + debugC(3, kDebugLevelSound, "Timer sync"); + p++; // Jump over the timer sync byte as it's not needed + + continue; + } + + uint8 deltaTime = readByte; + if (midiObj->_midiTicks + deltaTime > midiObj->_soundBufTicks) { + break; + } + midiObj->_midiTicks += deltaTime; + p++; // Jump over the delta-time byte as it was already taken care of + + // Check for end of MIDI sequence marker (This time it after reading delta-time) + if (*p == MIDI_BYTE_STOP_SEQUENCE) { + debugC(3, kDebugLevelSound, "End of MIDI sequence (After reading delta-time)"); + _playing = false; + + midiObj->rewind(); + + return; + } + + // Separate byte into command and channel if it's a command byte. + // Otherwise use running status (i.e. previously set command and channel). + if (*p & 0x80) { + cmd = *p++; + ch = cmd & 0x0f; + cmd >>= 4; + } + + switch (cmd) { + case MIDI_CMD_NOTE_OFF: + parm1 = *p++; + parm2 = *p++; + _gsSound->midiNoteOff(ch, parm1, parm2); + break; + case MIDI_CMD_NOTE_ON: + parm1 = *p++; + parm2 = *p++; + _gsSound->midiNoteOn(ch, parm1, parm2); + break; + case MIDI_CMD_CONTROLLER: + parm1 = *p++; + parm2 = *p++; + _gsSound->midiController(ch, parm1, parm2); + break; + case MIDI_CMD_PROGRAM_CHANGE: + parm1 = *p++; + _gsSound->midiProgramChange(ch, parm1); + break; + case MIDI_CMD_PITCH_WHEEL: + parm1 = *p++; + parm2 = *p++; + + uint16 wheelPos = ((parm2 & 0x7F) << 7) | (parm1 & 0x7F); // 14-bit value + _gsSound->midiPitchWheel(wheelPos); + break; + } + } + + midiObj->setPtr(p); +} + +void IIgsSoundMgr::midiNoteOff(uint8 channel, uint8 note, uint8 velocity) { + _midiChannels[channel].noteOff(note, velocity); + debugC(3, kDebugLevelSound, "note off, channel %02x, note %02x, velocity %02x", channel, note, velocity); +} + +void IIgsSoundMgr::midiNoteOn(uint8 channel, uint8 note, uint8 velocity) { + _midiChannels[channel].noteOn(note, velocity); + debugC(3, kDebugLevelSound, "note on, channel %02x, note %02x, velocity %02x", channel, note, velocity); +} + +// TODO: Check if controllers behave differently on different MIDI channels +// TODO: Doublecheck what other controllers than the volume controller do +void IIgsSoundMgr::midiController(uint8 channel, uint8 controller, uint8 value) { + IIgsMidiChannel &midiChannel = _midiChannels[channel]; + + // The tested Apple IIGS AGI MIDI resources only used + // controllers 0 (Bank select?), 7 (Volume) and 64 (Sustain On/Off). + // Controller 0's parameter was in range 94-127, + // controller 7's parameter was in range 0-127 and + // controller 64's parameter was always 0 (i.e. sustain off). + bool unimplemented = false; + switch (controller) { + case 7: // Volume + midiChannel.setVolume(value); + break; + default: + unimplemented = true; + break; + } + debugC(3, kDebugLevelSound, "controller %02x, ch %02x, val %02x%s", controller, channel, value, unimplemented ? " (Unimplemented)" : ""); +} + +void IIgsSoundMgr::midiProgramChange(uint8 channel, uint8 program) { + _midiChannels[channel].setInstrument(getInstrument(program), _wave.begin()); + debugC(3, kDebugLevelSound, "program change %02x, channel %02x", program, channel); +} + +void IIgsSoundMgr::midiPitchWheel(uint8 wheelPos) { + // In all the tested Apple IIGS AGI MIDI resources + // pitch wheel commands always used 0x2000 (Center position). + // Therefore it should be quite safe to ignore this command. + debugC(3, kDebugLevelSound, "pitch wheel position %04x (Unimplemented)", wheelPos); +} + +IIgsSoundMgr::IIgsSoundMgr() { + _midiChannels.resize(16); // Set the amount of available MIDI channels +} + +const IIgsInstrumentHeader* IIgsSoundMgr::getInstrument(uint8 program) const { + return &_instruments[_midiProgToInst->map(program)]; +} + +void IIgsSoundMgr::setProgramChangeMapping(const MidiProgramChangeMapping *mapping) { + _midiProgToInst = mapping; +} + +void IIgsSoundMgr::removeStoppedSounds() { + for (Common::Array::iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) + iter->removeStoppedSounds(); +} + +void IIgsMidiChannel::removeStoppedSounds() { + for (int i = _gsChannels.size() - 1; i >= 0; i--) + if (!_gsChannels[i].playing()) + _gsChannels.remove_at(i); +} + +uint IIgsSoundMgr::activeSounds() const { + uint result = 0; + + for (Common::Array::const_iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) + result += iter->activeSounds(); + + return result; +} + +uint IIgsMidiChannel::activeSounds() const { + uint result = 0; + + for (const_iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + if (!iter->end) + result++; + + return result; +} + +void IIgsMidiChannel::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { + _instrument = instrument; + _sample = sample; + + // Set program on each Apple IIGS channel playing on this MIDI channel + for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + iter->setInstrument(instrument, sample); +} + +void IIgsMidiChannel::setVolume(uint8 volume) { + _volume = volume; + + // Set volume on each Apple IIGS channel playing on this MIDI channel + for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + iter->setChannelVolume(volume); +} + +void IIgsMidiChannel::noteOff(uint8 note, uint8 velocity) { + // Go through all the notes playing on this MIDI channel + // and turn off the ones that are playing the given note + for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + if (iter->origNote == note) + iter->noteOff(velocity); +} + +void IIgsMidiChannel::noteOn(uint8 note, uint8 velocity) { + IIgsChannelInfo channel; + + // Use the default channel volume and instrument + channel.setChannelVolume(_volume); + channel.setInstrument(_instrument, _sample); + + // Set the note on and save the channel + channel.noteOn(note, velocity); + _gsChannels.push_back(channel); +} + +void IIgsChannelInfo::rewind() { + this->envVol = this->startEnvVol; + this->envSeg = 0; + this->pos = intToFrac(0); +} + +void IIgsChannelInfo::setChannelVolume(uint8 volume) { + this->chanVol = intToFrac(volume); +} + +void IIgsChannelInfo::setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample) { + assert(instrument != NULL && sample != NULL); + this->ins = instrument; + this->unrelocatedSample = sample; +} + +// TODO/FIXME: Implement correctly and fully (Take velocity into account etc) +void IIgsChannelInfo::noteOn(uint8 noteParam, uint8 velocity) { + this->origNote = noteParam; + this->startEnvVol = intToFrac(0); + rewind(); + + const IIgsWaveInfo *waveInfo = NULL; + + for (uint i = 0; i < ins->oscList.count; i++) + if (ins->oscList(i).waves[0].top >= noteParam) + waveInfo = &ins->oscList(i).waves[0]; + + assert(waveInfo != NULL); + + this->relocatedSample = this->unrelocatedSample + waveInfo->addr; + this->posAdd = intToFrac(0); + this->note = intToFrac(noteParam) + doubleToFrac(waveInfo->relPitch/256.0); + this->vol = doubleToFrac(fracToDouble(this->envVol) * fracToDouble(this->chanVol) / 127.0); + this->loop = (waveInfo->mode == OSC_MODE_LOOP); + this->size = waveInfo->size - waveInfo->addr; + this->end = waveInfo->halt; +} + +// TODO/FIXME: Implement correctly and fully (Take release time and velocity into account etc) +void IIgsChannelInfo::noteOff(uint8 velocity) { + this->loop = false; + this->envSeg = ins->relseg; +} + +void IIgsChannelInfo::stop() { + this->end = true; +} + +bool IIgsChannelInfo::playing() { + return !this->end; +} + +/** + * Finds information about an Apple IIGS AGI executable based on the game ID. + * @return A non-null IIgsExeInfo pointer if successful, otherwise NULL. + */ +const IIgsExeInfo *SoundMgr::getIIgsExeInfo(enum AgiGameID gameid) const { + for (int i = 0; i < ARRAYSIZE(IIgsExeInfos); i++) + if (IIgsExeInfos[i].gameid == gameid) + return &IIgsExeInfos[i]; + return NULL; +} + +bool IIgsSoundMgr::loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo) { + bool loadedOk = false; // Was loading successful? + Common::File file; + + // Open the executable file and check that it has correct size + file.open(exePath); + if (file.size() != (int32)exeInfo.exeSize) { + debugC(3, kDebugLevelSound, "Apple IIGS executable (%s) has wrong size (Is %d, should be %d)", + exePath.getPath().c_str(), file.size(), exeInfo.exeSize); + } + + // Read the whole executable file into memory + Common::SharedPtr data(file.readStream(file.size())); + file.close(); + + // Check that we got enough data to be able to parse the instruments + if (data && data->size() >= (int32)(exeInfo.instSetStart + exeInfo.instSet.byteCount)) { + // Check instrument set's length (The info's saved in the executable) + data->seek(exeInfo.instSetStart - 4); + uint16 instSetByteCount = data->readUint16LE(); + if (instSetByteCount != exeInfo.instSet.byteCount) { + debugC(3, kDebugLevelSound, "Wrong instrument set size (Is %d, should be %d) in Apple IIGS executable (%s)", + instSetByteCount, exeInfo.instSet.byteCount, exePath.getPath().c_str()); + } + + // Check instrument set's md5sum + data->seek(exeInfo.instSetStart); + + char md5str[32+1]; + Common::md5_file_string(*data, md5str, exeInfo.instSet.byteCount); + if (scumm_stricmp(md5str, exeInfo.instSet.md5)) { + warning("Unknown Apple IIGS instrument set (md5: %s) in %s, trying to use it nonetheless", + md5str, exePath.getPath().c_str()); + } + + // Read in the instrument set one instrument at a time + data->seek(exeInfo.instSetStart); + + // Load the instruments + _instruments.clear(); + _instruments.reserve(exeInfo.instSet.instCount); + + IIgsInstrumentHeader instrument; + for (uint i = 0; i < exeInfo.instSet.instCount; i++) { + if (!instrument.read(*data)) { + warning("Error loading Apple IIGS instrument (%d. of %d) from %s, not loading more instruments", + i + 1, exeInfo.instSet.instCount, exePath.getPath().c_str()); + break; + } + _instruments.push_back(instrument); // Add the successfully loaded instrument to the instruments array + } + + // Loading was successful only if all instruments were loaded successfully + loadedOk = (_instruments.size() == exeInfo.instSet.instCount); + } else // Couldn't read enough data from the executable file + warning("Error loading instruments from Apple IIGS executable (%s)", exePath.getPath().c_str()); + + return loadedOk; +} + +bool IIgsSoundMgr::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo) { + Common::File file; + + // Open the wave file and read it into memory + file.open(wavePath); + Common::SharedPtr uint8Wave(file.readStream(file.size())); + file.close(); + + // Check that we got the whole wave file + if (uint8Wave && uint8Wave->size() == SIERRASTANDARD_SIZE) { + // Check wave file's md5sum + char md5str[32+1]; + Common::md5_file_string(*uint8Wave, md5str, SIERRASTANDARD_SIZE); + if (scumm_stricmp(md5str, exeInfo.instSet.waveFileMd5)) { + warning("Unknown Apple IIGS wave file (md5: %s, game: %s).\n" \ + "Please report the information on the previous line to the ScummVM team.\n" \ + "Using the wave file as it is - music may sound weird", md5str, exeInfo.exePrefix); + } + + uint8Wave->seek(0); // Seek wave to its start + // Convert the wave file from 8-bit unsigned to 8-bit signed and save the result + _wave.resize(uint8Wave->size()); + return SoundMgr::convertWave(*uint8Wave, _wave.begin(), uint8Wave->size()); + } else { // Couldn't read the wave file or it had incorrect size + warning("Error loading Apple IIGS wave file (%s), not loading instruments", wavePath.getPath().c_str()); + return false; + } +} + +/** + * A function object (i.e. a functor) for testing if a Common::FSNode + * object's name is equal (Ignoring case) to a string or to at least + * one of the strings in a list of strings. Can be used e.g. with find_if(). + */ +struct fsnodeNameEqualsIgnoreCase : public Common::UnaryFunction { +// FIXME: This should be replaced; use SearchMan instead + fsnodeNameEqualsIgnoreCase(const Common::StringArray &str) : _str(str) {} + fsnodeNameEqualsIgnoreCase(const Common::String str) { _str.push_back(str); } + bool operator()(const Common::FSNode ¶m) const { + for (Common::StringArray::const_iterator iter = _str.begin(); iter != _str.end(); ++iter) + if (param.getName().equalsIgnoreCase(*iter)) + return true; + return false; + } +private: + Common::StringArray _str; +}; + +bool SoundMgr::loadInstruments() { + // Check that the platform is Apple IIGS, as only it uses custom instruments + if (_vm->getPlatform() != Common::kPlatformApple2GS) { + debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); + return true; + } + + // Get info on the particular Apple IIGS AGI game's executable + const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID) _vm->getGameID()); + if (exeInfo == NULL) { + warning("Unsupported Apple IIGS game, not loading instruments"); + return false; + } + + // List files in the game path + Common::FSList fslist; + Common::FSNode dir(ConfMan.get("path")); + if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly)) { + warning("Invalid game path (\"%s\"), not loading Apple IIGS instruments", dir.getPath().c_str()); + return false; + } + + // Populate executable filenames list (Long filename and short filename) for searching + Common::StringArray exeNames; + exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS16"); + exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS"); + + // Populate wave filenames list (Long filename and short filename) for searching + Common::StringArray waveNames; + waveNames.push_back("SIERRASTANDARD"); + waveNames.push_back("SIERRAST"); + + // Search for the executable file and the wave file (i.e. check if any of the filenames match) + Common::FSList::const_iterator exeFsnode, waveFsnode; + exeFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(exeNames)); + waveFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(waveNames)); + + // Make sure that we found the executable file + if (exeFsnode == fslist.end()) { + warning("Couldn't find Apple IIGS game executable (%s), not loading instruments", exeNames.begin()->c_str()); + return false; + } + + // Make sure that we found the wave file + if (waveFsnode == fslist.end()) { + warning("Couldn't find Apple IIGS wave file (%s), not loading instruments", waveNames.begin()->c_str()); + return false; + } + + // Set the MIDI program change to instrument number mapping and + // load the instrument headers and their sample data. + // None of the tested SIERRASTANDARD-files have zeroes in them so + // there's no need to check for prematurely ending samples here. + _gsSound->setProgramChangeMapping(&exeInfo->instSet.progToInst); + return _gsSound->loadWaveFile(*waveFsnode, *exeInfo) && _gsSound->loadInstrumentHeaders(*exeFsnode, *exeInfo); +} + +} // End of namespace Agi diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h new file mode 100644 index 0000000000..3669d29955 --- /dev/null +++ b/engines/agi/sound_2gs.h @@ -0,0 +1,311 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef AGI_SOUND_2GS_H +#define AGI_SOUND_2GS_H + +#include "common/frac.h" + +namespace Agi { + +// Apple IIGS MIDI uses 60 ticks per second (Based on tests with Apple IIGS +// KQ1 and SQ1 under MESS 0.124a). So we make the audio buffer size to be a +// 1/60th of a second in length. That should be getSampleRate() / 60 samples +// in length but as getSampleRate() is always 22050 at the moment we just use +// the hardcoded value of 368 (22050/60 = 367.5 which rounds up to 368). +// FIXME: Use getSampleRate() / 60 rather than a hardcoded value +#define IIGS_BUFFER_SIZE 368 + +// MIDI command values (Shifted right by 4 so they're in the lower nibble) +#define MIDI_CMD_NOTE_OFF 0x08 +#define MIDI_CMD_NOTE_ON 0x09 +#define MIDI_CMD_CONTROLLER 0x0B +#define MIDI_CMD_PROGRAM_CHANGE 0x0C +#define MIDI_CMD_PITCH_WHEEL 0x0E +// Whole MIDI byte values (Command and channel info together) +#define MIDI_BYTE_STOP_SEQUENCE 0xFC +#define MIDI_BYTE_TIMER_SYNC 0xF8 + +struct IIgsEnvelopeSegment { + uint8 bp; + uint16 inc; ///< 8b.8b fixed point, very probably little endian +}; + +#define ENVELOPE_SEGMENT_COUNT 8 +struct IIgsEnvelope { + IIgsEnvelopeSegment seg[ENVELOPE_SEGMENT_COUNT]; + + /** Reads an Apple IIGS envelope from then given stream. */ + bool read(Common::SeekableReadStream &stream); +}; + +// 2**(1/12) i.e. the 12th root of 2 +#define SEMITONE 1.059463094359295 + +// C6's frequency is A4's (440 Hz) frequency but one full octave and three semitones higher +// i.e. C6_FREQ = 440 * pow(2.0, 15/12.0) +#define C6_FREQ 1046.502261202395 + +// Size of the SIERRASTANDARD file (i.e. the wave file i.e. the sample data used by the instruments). +#define SIERRASTANDARD_SIZE 65536 + +// Maximum number of instruments in an Apple IIGS instrument set. +// Chosen empirically based on Apple IIGS AGI game data, increase if needed. +#define MAX_INSTRUMENTS 28 + +struct IIgsWaveInfo { + uint8 top; + uint addr; + uint size; +// Oscillator channel +#define OSC_CHANNEL_RIGHT 0 +#define OSC_CHANNEL_LEFT 1 + uint channel; +// Oscillator mode +#define OSC_MODE_LOOP 0 +#define OSC_MODE_ONESHOT 1 +#define OSC_MODE_SYNC_AM 2 +#define OSC_MODE_SWAP 3 + uint mode; + bool halt; + int16 relPitch; ///< Relative pitch in semitones (Signed 8b.8b fixed point) + + /** Reads an Apple IIGS wave information structure from the given stream. */ + bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); + bool finalize(Common::SeekableReadStream &uint8Wave); +}; + +// Number of waves per Apple IIGS sound oscillator +#define WAVES_PER_OSCILLATOR 2 + +/** An Apple IIGS sound oscillator. Consists always of two waves. */ +struct IIgsOscillator { + IIgsWaveInfo waves[WAVES_PER_OSCILLATOR]; + + bool finalize(Common::SeekableReadStream &uint8Wave); +}; + +// Maximum number of oscillators in an Apple IIGS instrument. +// Chosen empirically based on Apple IIGS AGI game data, increase if needed. +#define MAX_OSCILLATORS 4 + +/** An Apple IIGS sound oscillator list. */ +struct IIgsOscillatorList { + uint count; ///< Oscillator count + IIgsOscillator osc[MAX_OSCILLATORS]; ///< The oscillators + + /** Indexing operators for easier access to the oscillators. */ + const IIgsOscillator &operator()(uint index) const { return osc[index]; } + IIgsOscillator &operator()(uint index) { return osc[index]; } + + /** Reads an Apple IIGS oscillator list from the given stream. */ + bool read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr = false); + bool finalize(Common::SeekableReadStream &uint8Wave); +}; + +struct IIgsInstrumentHeader { + IIgsEnvelope env; + uint8 relseg; + uint8 bendrange; + uint8 vibdepth; + uint8 vibspeed; + IIgsOscillatorList oscList; + + /** + * Read an Apple IIGS instrument header from the given stream. + * @param stream The source stream from which to read the data. + * @param ignoreAddr Should we ignore wave infos' wave address variable's value? + * @return True if successful, false otherwise. + */ + bool read(Common::SeekableReadStream &stream, bool ignoreAddr = false); + bool finalize(Common::SeekableReadStream &uint8Wave); +}; + +struct IIgsSampleHeader { + uint16 type; + uint8 pitch; ///< Logarithmic, base is 2**(1/12), unknown multiplier (Possibly in range 1040-1080) + uint8 unknownByte_Ofs3; // 0x7F in Gold Rush's sound resource 60, 0 in all others. + uint8 volume; ///< Current guess: Logarithmic in 6 dB steps + uint8 unknownByte_Ofs5; ///< 0 in all tested samples. + uint16 instrumentSize; ///< Little endian. 44 in all tested samples. A guess. + uint16 sampleSize; ///< Little endian. Accurate in all tested samples excluding Manhunter I's sound resource 16. + IIgsInstrumentHeader instrument; + + /** + * Read an Apple IIGS AGI sample header from the given stream. + * @param stream The source stream from which to read the data. + * @return True if successful, false otherwise. + */ + bool read(Common::SeekableReadStream &stream); + bool finalize(Common::SeekableReadStream &uint8Wave); +}; + +struct IIgsChannelInfo { + const IIgsInstrumentHeader *ins; ///< Instrument info + const int8 *relocatedSample; ///< Source sample data (8-bit signed format) using relocation + const int8 *unrelocatedSample; ///< Source sample data (8-bit signed format) without relocation + frac_t pos; ///< Current sample position + frac_t posAdd; ///< Current sample position adder (Calculated using note, vibrato etc) + uint8 origNote; ///< The original note without the added relative pitch + frac_t note; ///< Note (With the added relative pitch) + frac_t vol; ///< Current volume (Takes both channel volume and enveloping into account) + frac_t chanVol; ///< Channel volume + frac_t startEnvVol; ///< Starting envelope volume + frac_t envVol; ///< Current envelope volume + uint envSeg; ///< Current envelope segment + uint size; ///< Sample size + bool loop; ///< Should we loop the sample? + bool end; ///< Has the playing ended? + + void rewind(); ///< Rewinds the sound playing on this channel to its start + void setChannelVolume(uint8 volume); ///< Sets the channel volume + void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); ///< Sets the instrument to be used on this channel + void noteOn(uint8 noteParam, uint8 velocity); ///< Starts playing a note on this channel + void noteOff(uint8 velocity); ///< Releases the note on this channel + void stop(); ///< Stops the note playing on this channel instantly + bool playing(); ///< Is there a note playing on this channel? +}; + +class IIgsMidi : public AgiSound { +public: + IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + ~IIgsMidi() { if (_data != NULL) free(_data); } + virtual uint16 type() { return _type; } + virtual const uint8 *getPtr() { return _ptr; } + virtual void setPtr(const uint8 *ptr) { _ptr = ptr; } + virtual void rewind() { _ptr = _data + 2; _midiTicks = _soundBufTicks = 0; } +protected: + uint8 *_data; ///< Raw sound resource data + const uint8 *_ptr; ///< Pointer to the current position in the MIDI data + uint32 _len; ///< Length of the raw sound resource + uint16 _type; ///< Sound resource type +public: + uint _midiTicks; ///< MIDI song position in ticks (1/60ths of a second) + uint _soundBufTicks; ///< Sound buffer position in ticks (1/60ths of a second) +}; + +class IIgsSample : public AgiSound { +public: + IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + ~IIgsSample() { delete[] _sample; } + virtual uint16 type() { return _header.type; } + const IIgsSampleHeader &getHeader() const { return _header; } + const int8 *getSample() const { return _sample; } +protected: + IIgsSampleHeader _header; ///< Apple IIGS AGI sample header + int8 *_sample; ///< Sample data (8-bit signed format) +}; + +/** Apple IIGS MIDI program change to instrument number mapping. */ +struct MidiProgramChangeMapping { + byte midiProgToInst[44]; ///< Lookup table for the MIDI program number to instrument number mapping + byte undefinedInst; ///< The undefined instrument number + + // Maps the MIDI program number to an instrument number + byte map(uint midiProg) const { + return midiProg < ARRAYSIZE(midiProgToInst) ? midiProgToInst[midiProg] : undefinedInst; + } +}; + +/** Apple IIGS AGI instrument set information. */ +struct InstrumentSetInfo { + uint byteCount; ///< Length of the whole instrument set in bytes + uint instCount; ///< Amount of instrument in the set + const char *md5; ///< MD5 hex digest of the whole instrument set + const char *waveFileMd5; ///< MD5 hex digest of the wave file (i.e. the sample data used by the instruments) + const MidiProgramChangeMapping &progToInst; ///< Program change to instrument number mapping +}; + +/** Apple IIGS AGI executable file information. */ +struct IIgsExeInfo { + enum AgiGameID gameid; ///< Game ID + const char *exePrefix; ///< Prefix of the Apple IIGS AGI executable (e.g. "SQ", "PQ", "KQ4" etc) + uint agiVer; ///< Apple IIGS AGI version number, not strictly needed + uint exeSize; ///< Size of the Apple IIGS AGI executable file in bytes + uint instSetStart; ///< Starting offset of the instrument set inside the executable file + const InstrumentSetInfo &instSet; ///< Information about the used instrument set +}; + +class IIgsMidiChannel { +public: + IIgsMidiChannel() : _instrument(0), _sample(0), _volume(0) {} + uint activeSounds() const; ///< How many active sounds are playing? + void setInstrument(const IIgsInstrumentHeader *instrument, const int8 *sample); + void setVolume(uint8 volume); + void noteOff(uint8 note, uint8 velocity); + void noteOn(uint8 note, uint8 velocity); + void stopSounds(); ///< Clears the channel of any sounds + void removeStoppedSounds(); ///< Removes all stopped sounds from this MIDI channel +public: + typedef Common::Array::const_iterator const_iterator; + typedef Common::Array::iterator iterator; + Common::Array _gsChannels; ///< Apple IIGS channels playing on this MIDI channel +protected: + const IIgsInstrumentHeader *_instrument; ///< Instrument used on this MIDI channel + const int8 *_sample; ///< Sample data used on this MIDI channel + uint8 _volume; ///< MIDI controller number 7 (Volume) +}; + +/** + * Class for managing Apple IIGS sound channels. + * TODO: Check what instruments are used by default on the MIDI channels + * FIXME: Some instrument choices sound wrong + */ +class IIgsSoundMgr { +public: + typedef Common::Array::const_iterator const_iterator; + typedef Common::Array::iterator iterator; + static const uint kSfxMidiChannel = 0; ///< The MIDI channel used for playing sound effects +public: + // For initializing + IIgsSoundMgr(); + void setProgramChangeMapping(const MidiProgramChangeMapping *mapping); + bool loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo); + bool loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo); + // Miscellaneous methods + uint activeSounds() const; ///< How many active sounds are playing? + void stopSounds(); ///< Stops all sounds + void removeStoppedSounds(); ///< Removes all stopped sounds from the MIDI channels + // For playing Apple IIGS AGI samples (Sound effects etc) + bool playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample); + // MIDI commands + void midiNoteOff(uint8 channel, uint8 note, uint8 velocity); + void midiNoteOn(uint8 channel, uint8 note, uint8 velocity); + void midiController(uint8 channel, uint8 controller, uint8 value); + void midiProgramChange(uint8 channel, uint8 program); + void midiPitchWheel(uint8 wheelPos); +protected: + const IIgsInstrumentHeader* getInstrument(uint8 program) const; +public: + Common::Array _midiChannels; ///< Information about each MIDI channel +protected: + Common::Array _wave; ///< Sample data used by the Apple IIGS MIDI instruments + const MidiProgramChangeMapping *_midiProgToInst; ///< MIDI program change to instrument number mapping + Common::Array _instruments; ///< Instruments used by the Apple IIGS AGI +}; + +} // End of namespace Agi + +#endif /* AGI_SOUND_2GS_H */ -- cgit v1.2.3 From 024f49213781a34c9d18a9580589e088062cec33 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:34:14 +0000 Subject: Added seek() method to MemoryWriteStreamDynamic. If it deserves a separate class, shout. svn-id: r49750 --- common/stream.cpp | 25 +++++++++++++++++++++++++ common/stream.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/common/stream.cpp b/common/stream.cpp index 6737eafc9c..204efd79b9 100644 --- a/common/stream.cpp +++ b/common/stream.cpp @@ -303,4 +303,29 @@ bool BufferedSeekableReadStream::seek(int32 offset, int whence) { return true; // FIXME: STREAM REWRITE } +bool MemoryWriteStreamDynamic::seek(int32 offs, int whence) { + // Pre-Condition + assert(_pos <= _size); + switch (whence) { + case SEEK_END: + // SEEK_END works just like SEEK_SET, only 'reversed', + // i.e. from the end. + offs = _size + offs; + // Fall through + case SEEK_SET: + _ptr = _data + offs; + _pos = offs; + break; + + case SEEK_CUR: + _ptr += offs; + _pos += offs; + break; + } + // Post-Condition + assert(_pos <= _size); + + return true; // FIXME: STREAM REWRITE +} + } // End of namespace Common diff --git a/common/stream.h b/common/stream.h index 11041fa3ce..5e0d7149b0 100644 --- a/common/stream.h +++ b/common/stream.h @@ -687,6 +687,8 @@ public: uint32 size() const { return _size; } byte *getData() { return _data; } + + bool seek(int32 offset, int whence = SEEK_SET); }; } // End of namespace Common -- cgit v1.2.3 From 0a1a9194064a96673b45d856f06dbb689838d746 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:34:45 +0000 Subject: AGI: Implement FR #1913900. FR #1913900: "AGI: MIDI support". Currently it gets selected when Adlib is chosen. Finding a better way to do it is a todo. Also default instrument mapping is plain. Based on original code by Jens. Christian Restemeier. svn-id: r49751 --- engines/agi/agi.cpp | 5 +- engines/agi/loader_v2.cpp | 2 +- engines/agi/loader_v3.cpp | 2 +- engines/agi/module.mk | 1 + engines/agi/sound.cpp | 71 +++++++--- engines/agi/sound.h | 17 ++- engines/agi/sound_midi.cpp | 340 +++++++++++++++++++++++++++++++++++++++++++++ engines/agi/sound_midi.h | 113 +++++++++++++++ 8 files changed, 524 insertions(+), 27 deletions(-) create mode 100755 engines/agi/sound_midi.cpp create mode 100755 engines/agi/sound_midi.h diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index c2c6d10bfe..d89b10bb32 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -583,10 +583,13 @@ void AgiEngine::initialize() { } else if (getPlatform() == Common::kPlatformCoCo3) { _soundemu = SOUND_EMU_COCO3; } else { - switch (MidiDriver::detectMusicDriver(MDT_PCSPK)) { + switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB)) { case MD_PCSPK: _soundemu = SOUND_EMU_PC; break; + case MD_ADLIB: + _soundemu = SOUND_EMU_MIDI; + break; default: _soundemu = SOUND_EMU_NONE; break; diff --git a/engines/agi/loader_v2.cpp b/engines/agi/loader_v2.cpp index 3d1c4fa2cf..de6f8d0653 100644 --- a/engines/agi/loader_v2.cpp +++ b/engines/agi/loader_v2.cpp @@ -232,7 +232,7 @@ int AgiLoader_v2::loadResource(int t, int n) { if (data != NULL) { // Freeing of the raw resource from memory is delegated to the createFromRawResource-function - _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound); + _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu); _vm->_game.dirSound[n].flags |= RES_LOADED; } else { ec = errBadResource; diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp index 4227745c5f..4ee35d73eb 100644 --- a/engines/agi/loader_v3.cpp +++ b/engines/agi/loader_v3.cpp @@ -316,7 +316,7 @@ int AgiLoader_v3::loadResource(int t, int n) { data = loadVolRes(&_vm->_game.dirSound[n]); if (data != NULL) { // Freeing of the raw resource from memory is delegated to the createFromRawResource-function - _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound); + _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu); _vm->_game.dirSound[n].flags |= RES_LOADED; } else { ec = errBadResource; diff --git a/engines/agi/module.mk b/engines/agi/module.mk index 3b7741443d..4f27447dbd 100644 --- a/engines/agi/module.mk +++ b/engines/agi/module.mk @@ -31,6 +31,7 @@ MODULE_OBJS := \ saveload.o \ sound.o \ sound_2gs.o \ + sound_midi.o \ sprite.o \ text.o \ view.o \ diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index 014a3dba1a..b9a118c95f 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -29,9 +29,12 @@ #include "common/random.h" #include "common/str-array.h" +#include "sound/mididrv.h" + #include "agi/agi.h" #include "agi/sound_2gs.h" +#include "agi/sound_midi.h" namespace Agi { @@ -41,7 +44,7 @@ namespace Agi { // TODO: add support for variable sampling rate in the output device // -AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager) { +AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager, int soundemu) { if (data == NULL || len < 2) // Check for too small resource or no resource at all return NULL; uint16 type = READ_LE_UINT16(data); @@ -50,9 +53,13 @@ AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, S case AGI_SOUND_SAMPLE: return new IIgsSample(data, len, resnum, manager); case AGI_SOUND_MIDI: - return new IIgsMidi (data, len, resnum, manager); + return new IIgsMidi(data, len, resnum, manager); case AGI_SOUND_4CHN: - return new PCjrSound (data, len, resnum, manager); + if (soundemu == SOUND_EMU_MIDI) { + return new MIDISound(data, len, resnum, manager); + } else { + return new PCjrSound(data, len, resnum, manager); + } } warning("Sound resource (%d) has unknown type (0x%04x). Not using the sound", resnum, type); @@ -165,24 +172,29 @@ void SoundMgr::startSound(int resnum, int flag) { ((IIgsMidi *) _vm->_game.sounds[_playingSound])->rewind(); break; case AGI_SOUND_4CHN: - PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum]; + if (_vm->_soundemu == SOUND_EMU_MIDI) { + _musicPlayer->playMIDI((MIDISound *)_vm->_game.sounds[resnum]); + } else { - // Initialize channel info - for (i = 0; i < NUM_CHANNELS; i++) { - _chn[i].type = type; - _chn[i].flags = AGI_SOUND_LOOP; + PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum]; - if (_env) { - _chn[i].flags |= AGI_SOUND_ENVELOPE; - _chn[i].adsr = AGI_SOUND_ENV_ATTACK; - } + // Initialize channel info + for (i = 0; i < NUM_CHANNELS; i++) { + _chn[i].type = type; + _chn[i].flags = AGI_SOUND_LOOP; + + if (_env) { + _chn[i].flags |= AGI_SOUND_ENVELOPE; + _chn[i].adsr = AGI_SOUND_ENV_ATTACK; + } - _chn[i].ins = _waveform; - _chn[i].size = WAVEFORM_SIZE; - _chn[i].ptr = pcjrSound->getVoicePointer(i % 4); - _chn[i].timer = 0; - _chn[i].vol = 0; - _chn[i].end = 0; + _chn[i].ins = _waveform; + _chn[i].size = WAVEFORM_SIZE; + _chn[i].ptr = pcjrSound->getVoicePointer(i % 4); + _chn[i].timer = 0; + _chn[i].vol = 0; + _chn[i].end = 0; + } } break; } @@ -213,6 +225,10 @@ void SoundMgr::stopSound() { _gsSound->stopSounds(); } + if (_vm->_soundemu == SOUND_EMU_MIDI) { + _musicPlayer->stop(); + } + _playingSound = -1; } } @@ -240,6 +256,8 @@ int SoundMgr::initSound() { break; case SOUND_EMU_COCO3: break; + case SOUND_EMU_MIDI: + break; } report("Initializing sound:\n"); @@ -251,7 +269,8 @@ int SoundMgr::initSound() { report("disabled\n"); } - _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + if (_vm->_soundemu != SOUND_EMU_MIDI) + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); return r; } @@ -607,12 +626,21 @@ SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) : _chn() { _waveform = 0; _disabledMidi = false; _useChorus = true; // FIXME: Currently always true? + _midiDriver = 0; _gsSound = new IIgsSoundMgr; + + if (_vm->_soundemu == SOUND_EMU_MIDI) { + MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB); + + _midiDriver = MidiDriver::createMidi(midiDriver); + _musicPlayer = new MusicPlayer(_midiDriver, this); + } } void SoundMgr::premixerCall(int16 *data, uint len) { - fillAudio(this, data, len); + if (_vm->_soundemu != SOUND_EMU_MIDI) + fillAudio(this, data, len); } void SoundMgr::setVolume(uint8 volume) { @@ -622,6 +650,9 @@ void SoundMgr::setVolume(uint8 volume) { SoundMgr::~SoundMgr() { free(_sndBuffer); delete _gsSound; + + delete _musicPlayer; + delete _midiDriver; } } // End of namespace Agi diff --git a/engines/agi/sound.h b/engines/agi/sound.h index ab0c9e20e5..16ec81d19a 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -29,6 +29,8 @@ #include "sound/audiostream.h" #include "sound/mixer.h" +class MidiDriver; + namespace Agi { #define BUFFER_SIZE 410 @@ -40,6 +42,7 @@ namespace Agi { #define SOUND_EMU_AMIGA 4 #define SOUND_EMU_APPLE2GS 5 #define SOUND_EMU_COCO3 6 +#define SOUND_EMU_MIDI 7 #define WAVEFORM_SIZE 64 #define ENV_ATTACK 10000 /**< envelope attack rate */ @@ -143,7 +146,7 @@ public: * from memory using free() or delegate the responsibility onwards to some other * function! */ - static AgiSound *createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + static AgiSound *createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager, int soundemu); protected: SoundMgr &_manager; ///< AGI sound manager object @@ -154,7 +157,7 @@ protected: class PCjrSound : public AgiSound { public: PCjrSound(uint8 *data, uint32 len, int resnum, SoundMgr &manager); - ~PCjrSound() { if (_data != NULL) free(_data); } + ~PCjrSound() { free(_data); } virtual uint16 type() { return _type; } const uint8 *getVoicePointer(uint voiceNum); protected: @@ -166,11 +169,11 @@ protected: class AgiEngine; class AgiBase; class IIgsSoundMgr; +class MusicPlayer; struct IIgsExeInfo; class SoundMgr : public Audio::AudioStream { - AgiBase *_vm; public: SoundMgr(AgiBase *agi, Audio::Mixer *pMixer); @@ -196,15 +199,21 @@ public: return 22050; } + int _endflag; + AgiBase *_vm; + private: Audio::Mixer *_mixer; Audio::SoundHandle _soundHandle; + + MusicPlayer *_musicPlayer; + MidiDriver *_midiDriver; + uint32 _sampleRate; bool _playing; ChannelInfo _chn[NUM_CHANNELS]; IIgsSoundMgr *_gsSound; - int _endflag; int _playingSound; uint8 _env; bool _disabledMidi; diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp new file mode 100755 index 0000000000..b31a4228fb --- /dev/null +++ b/engines/agi/sound_midi.cpp @@ -0,0 +1,340 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// Code is based on: +// +// A very simple program, that converts an AGI-song into a MIDI-song. +// Feel free to use it for anything. +// +// The default instrument is "piano" for all the channels, what gives +// good results on most games. But I found, that some songs are interesting +// with other instruments. If you want to experiment, modify the "instr" +// array. +// +// Timing is not perfect, yet. It plays correct, when I use the +// Gravis-Midiplayer, but the songs are too fast when I use playmidi on +// Linux. +// +// Original program developed by Jens. Christian Restemeier +// + +// MIDI and digital music class + +#include "sound/audiostream.h" +#include "sound/mididrv.h" +#include "sound/midiparser.h" +#include "common/config-manager.h" +#include "common/file.h" +#include "common/stream.h" + +#include "agi/agi.h" + +#include "agi/sound.h" +#include "agi/sound_midi.h" + +#define SPEED_FACTOR 6 + +namespace Agi { + +static uint32 convertSND2MIDI(byte *snddata, byte **data); + +MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { + _data = data; // Save the resource pointer + _len = len; // Save the resource's length + _type = READ_LE_UINT16(data); // Read sound resource's type + _isValid = (_type == AGI_SOUND_4CHN) && (_data != NULL) && (_len >= 2); + + if (!_isValid) // Check for errors + warning("Error creating MIDI sound from resource %d (Type %d, length %d)", resnum, _type, len); +} + +MusicPlayer::MusicPlayer(MidiDriver *driver, SoundMgr *manager) : _parser(0), _driver(driver), _isPlaying(false), _passThrough(false), _isGM(false), _manager(manager) { + memset(_channel, 0, sizeof(_channel)); + memset(_channelVolume, 255, sizeof(_channelVolume)); + _masterVolume = 0; + this->open(); + _smfParser = MidiParser::createParser_SMF(); + _midiMusicData = NULL; +} + +MusicPlayer::~MusicPlayer() { + _driver->setTimerCallback(NULL, NULL); + stop(); + this->close(); + _smfParser->setMidiDriver(NULL); + delete _smfParser; + delete[] _midiMusicData; +} + +void MusicPlayer::setChannelVolume(int channel) { + int newVolume = _channelVolume[channel] * _masterVolume / 255; + _channel[channel]->volume(newVolume); +} + +void MusicPlayer::setVolume(int volume) { + Common::StackLock lock(_mutex); + + volume = CLIP(volume, 0, 255); + if (_masterVolume == volume) + return; + _masterVolume = volume; + + for (int i = 0; i < 16; ++i) { + if (_channel[i]) { + setChannelVolume(i); + } + } +} + +int MusicPlayer::open() { + // Don't ever call open without first setting the output driver! + if (!_driver) + return 255; + + int ret = _driver->open(); + if (ret) + return ret; + + _driver->setTimerCallback(this, &onTimer); + return 0; +} + +void MusicPlayer::close() { + stop(); + if (_driver) + _driver->close(); + _driver = 0; +} + +void MusicPlayer::send(uint32 b) { + if (_passThrough) { + _driver->send(b); + return; + } + + byte channel = (byte)(b & 0x0F); + if ((b & 0xFFF0) == 0x07B0) { + // Adjust volume changes by master volume + byte volume = (byte)((b >> 16) & 0x7F); + _channelVolume[channel] = volume; + volume = volume * _masterVolume / 255; + b = (b & 0xFF00FFFF) | (volume << 16); + } else if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) { + b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; + } + else if ((b & 0xFFF0) == 0x007BB0) { + //Only respond to All Notes Off if this channel + //has currently been allocated + if (_channel[b & 0x0F]) + return; + } + + if (!_channel[channel]) { + _channel[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); + // If a new channel is allocated during the playback, make sure + // its volume is correctly initialized. + if (_channel[channel]) + setChannelVolume(channel); + } + + if (_channel[channel]) + _channel[channel]->send(b); +} + +void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { + + switch (type) { + case 0x2F: // End of Track + stop(); + break; + default: + //warning("Unhandled meta event: %02x", type); + break; + } +} + +void MusicPlayer::onTimer(void *refCon) { + MusicPlayer *music = (MusicPlayer *)refCon; + Common::StackLock lock(music->_mutex); + + if (music->_parser) + music->_parser->onTimer(); +} + +void MusicPlayer::playMIDI(MIDISound *track) { + stop(); + + _isGM = true; + + // Convert AGI Sound data to MIDI + int midiMusicSize = convertSND2MIDI(track->_data, &_midiMusicData); + + if (_smfParser->loadMusic(_midiMusicData, midiMusicSize)) { + MidiParser *parser = _smfParser; + parser->setTrack(0); + parser->setMidiDriver(this); + parser->setTimerRate(getBaseTempo()); + parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); + + _parser = parser; + + syncVolume(); + + _isPlaying = true; + } +} + +void MusicPlayer::stop() { + Common::StackLock lock(_mutex); + + if (!_isPlaying) + return; + + _isPlaying = false; + if (_parser) { + _parser->unloadMusic(); + _parser = NULL; + } + + if (_manager->_endflag != -1) + _manager->_vm->setflag(_manager->_endflag, true); +} + +void MusicPlayer::pause() { + setVolume(-1); + _isPlaying = false; +} + +void MusicPlayer::resume() { + syncVolume(); + _isPlaying = true; +} + +void MusicPlayer::syncVolume() { + int volume = ConfMan.getInt("music_volume"); + if (ConfMan.getBool("mute")) { + volume = -1; + } + setVolume(volume); +} + +/* channel / intrument setup: */ + +/* most songs are good with this: */ +unsigned char instr[] = {0, 0, 0}; + +/* cool for sq2: +unsigned char instr[] = {50, 51, 19}; +*/ + +static void writeDelta(Common::MemoryWriteStreamDynamic *st, int32 delta) { + int32 i; + + i = delta >> 21; if (i > 0) st->writeByte((i & 127) | 128); + i = delta >> 14; if (i > 0) st->writeByte((i & 127) | 128); + i = delta >> 7; if (i > 0) st->writeByte((i & 127) | 128); + st->writeByte(delta & 127); +} + +static uint32 convertSND2MIDI(byte *snddata, byte **data) { + int32 lp, ep; + int n; + double ll; + + Common::MemoryWriteStreamDynamic st; + + ll = log10(pow(2.0, 1.0 / 12.0)); + + /* Header */ + st.write("MThd", 4); + st.writeUint32BE(6); + st.writeUint16BE(1); /* mode */ + st.writeUint16BE(3); /* number of tracks */ + st.writeUint16BE(192); /* ticks / quarter */ + + for (n = 0; n < 3; n++) { + uint16 start, end, pos; + + st.write("MTrk", 4); + lp = st.pos(); + st.writeUint32BE(0); /* chunklength */ + writeDelta(&st, 0); /* set instrument */ + st.writeByte(0xc0 + n); + st.writeByte(instr[n]); + start = snddata[n * 2 + 0] | (snddata[n * 2 + 1] << 8); + end = ((snddata[n * 2 + 2] | (snddata[n * 2 + 3] << 8))) - 5; + + for (pos = start; pos < end; pos += 5) { + uint16 freq, dur; + dur = (snddata[pos + 0] | (snddata[pos + 1] << 8)) * SPEED_FACTOR; + freq = ((snddata[pos + 2] & 0x3F) << 4) + (snddata[pos + 3] & 0x0F); + if (snddata[pos + 2] > 0) { + double fr; + int note; + /* I don't know, what frequency equals midi note 0 ... */ + /* This moves the song 4 octaves down: */ + fr = (log10(111860.0 / (double)freq) / ll) - 48; + note = (int)floor(fr + 0.5); + if (note < 0) note = 0; + if (note > 127) note = 127; + /* note on */ + writeDelta(&st, 0); + st.writeByte(144 + n); + st.writeByte(note); + st.writeByte(100); + /* note off */ + writeDelta(&st, dur); + st.writeByte(128 + n); + st.writeByte(note); + st.writeByte(0); + } else { + /* note on */ + writeDelta(&st, 0); + st.writeByte(144 + n); + st.writeByte(0); + st.writeByte(0); + /* note off */ + writeDelta(&st, dur); + st.writeByte(128 + n); + st.writeByte(0); + st.writeByte(0); + } + } + writeDelta(&st, 0); + st.writeByte(0xff); + st.writeByte(0x2f); + st.writeByte(0x0); + ep = st.pos(); + st.seek(lp, SEEK_SET); + st.writeUint32BE((ep - lp) - 4); + st.seek(ep, SEEK_SET); + } + + *data = st.getData(); + + return st.pos(); +} + +} // End of namespace Agi diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h new file mode 100755 index 0000000000..48216ceb12 --- /dev/null +++ b/engines/agi/sound_midi.h @@ -0,0 +1,113 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// Music class + +#ifndef AGI_SOUND_MIDI_H +#define AGI_SOUND_MIDI_H + +#include "sound/mididrv.h" +#include "sound/midiparser.h" +#include "common/mutex.h" + +namespace Agi { + +class MIDISound : public AgiSound { +public: + MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + ~MIDISound() { free(_data); } + virtual uint16 type() { return _type; } + uint8 *_data; ///< Raw sound resource data + uint32 _len; ///< Length of the raw sound resource + +protected: + uint16 _type; ///< Sound resource type +}; + +class MusicPlayer : public MidiDriver { +public: + MusicPlayer(MidiDriver *driver, SoundMgr *manager); + ~MusicPlayer(); + + bool isPlaying() { return _isPlaying; } + void setPlaying(bool playing) { _isPlaying = playing; } + + void setVolume(int volume); + int getVolume() { return _masterVolume; } + void syncVolume(); + + void setNativeMT32(bool b) { _nativeMT32 = b; } + bool hasNativeMT32() { return _nativeMT32; } + void playMIDI(MIDISound *track); + void stop(); + void pause(); + void resume(); + void setLoop(bool loop) { _looping = loop; } + void setPassThrough(bool b) { _passThrough = b; } + + void setGM(bool isGM) { _isGM = isGM; } + + // MidiDriver interface implementation + int open(); + void close(); + void send(uint32 b); + + void metaEvent(byte type, byte *data, uint16 length); + + void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { } + uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; } + + // Channel allocation functions + MidiChannel *allocateChannel() { return 0; } + MidiChannel *getPercussionChannel() { return 0; } + + MidiParser *_parser; + Common::Mutex _mutex; + +protected: + + static void onTimer(void *data); + void setChannelVolume(int channel); + + MidiChannel *_channel[16]; + MidiDriver *_driver; + MidiParser *_smfParser; + byte _channelVolume[16]; + bool _nativeMT32; + bool _isGM; + bool _passThrough; + + bool _isPlaying; + bool _looping; + byte _masterVolume; + + byte *_midiMusicData; + + SoundMgr *_manager; +}; + +} // End of namespace Agi + +#endif -- cgit v1.2.3 From c7e9b620eef9973beee5f2055fb37308682d86ff Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:35:10 +0000 Subject: AGI: properly setup Sound var. svn-id: r49752 --- engines/agi/agi.h | 9 ++++++++- engines/agi/cycle.cpp | 11 ++++++++--- engines/agi/detection_tables.h | 2 +- engines/agi/sound.cpp | 4 ++-- engines/agi/sound.h | 4 ++-- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index b00b0b3d7e..4cc823df5a 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -152,7 +152,8 @@ enum AgiGameFeatures { GF_MENUS = (1 << 7), GF_ESCPAUSE = (1 << 8), GF_OLDAMIGAV20 = (1 << 9), - GF_CLIPCOORDS = (1 << 10) + GF_CLIPCOORDS = (1 << 10), + GF_2GSOLDSOUND = (1 << 11) }; struct AGIGameDescription; @@ -317,6 +318,12 @@ enum AgiComputerType { kAgiComputerAmigaOld = 20 // Older Amiga AGI interpreters' value (Seldom used) }; +enum AgiSoundType { + kAgiSoundPC = 1, + kAgiSoundTandy = 3, // Tandy (This value is also used by the Amiga AGI and Apple IIGS AGI) + kAgiSound2GSOld = 8 // Apple IIGS's Gold Rush! (Version 1.0M 1989-02-28 (CE), AGI 3.003) uses value 8 +}; + /** * AGI flags */ diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index 5614195fcf..40d6f2d008 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -387,28 +387,33 @@ int AgiEngine::runGame() { _restartGame = false; } - // Set computer type (v20 i.e. vComputer) + // Set computer type (v20 i.e. vComputer) and sound type switch (getPlatform()) { case Common::kPlatformAtariST: setvar(vComputer, kAgiComputerAtariST); + setvar(vSoundgen, kAgiSoundPC); break; case Common::kPlatformAmiga: if (getFeatures() & GF_OLDAMIGAV20) setvar(vComputer, kAgiComputerAmigaOld); else setvar(vComputer, kAgiComputerAmiga); + setvar(vSoundgen, kAgiSoundTandy); break; case Common::kPlatformApple2GS: setvar(vComputer, kAgiComputerApple2GS); + if (getFeatures() & GF_2GSOLDSOUND) + setvar(vSoundgen, kAgiSound2GSOld); + else + setvar(vSoundgen, kAgiSoundTandy); break; case Common::kPlatformPC: default: setvar(vComputer, kAgiComputerPC); + setvar(vSoundgen, kAgiSoundPC); break; } - setvar(vSoundgen, 1); // IBM PC SOUND - // Set monitor type (v26 i.e. vMonitor) switch (_renderMode) { case Common::kRenderCGA: diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index 9c915b12f5..a3e95241c1 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -166,7 +166,7 @@ static const AGIGameDescription gameDescriptions[] = { // Gold Rush! (Apple IIgs) 1.0M 2/28/89 (CE) aka 2.01 12/22/88 // Menus not tested - GAME3_P("goldrush", "1.0M 1989-02-28 (CE) aka 2.01 1988-12-22", "grdir", "3f7b9ce62631434389f85371b11921d6", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformApple2GS), + GAME3_P("goldrush", "1.0M 1989-02-28 (CE) aka 2.01 1988-12-22", "grdir", "3f7b9ce62631434389f85371b11921d6", 0x3149, GF_2GSOLDSOUND, GID_GOLDRUSH, Common::kPlatformApple2GS), // Gold Rush! (ST) 1.01 1/13/89 aka 2.01 12/22/88 GAME3_P("goldrush", "1.01 1989-01-13 aka 2.01 1988-12-22", "grdir", "4dd4d50480a3d6c206fa227ce8142735", 0x3149, 0, GID_GOLDRUSH, Common::kPlatformAtariST), diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index b9a118c95f..c4c695c59e 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -142,7 +142,7 @@ void SoundMgr::unloadSound(int resnum) { void SoundMgr::startSound(int resnum, int flag) { int i; - AgiSoundType type; + AgiSoundEmuType type; if (_vm->_game.sounds[resnum] != NULL && _vm->_game.sounds[resnum]->isPlaying()) return; @@ -152,7 +152,7 @@ void SoundMgr::startSound(int resnum, int flag) { if (_vm->_game.sounds[resnum] == NULL) // Is this needed at all? return; - type = (AgiSoundType)_vm->_game.sounds[resnum]->type(); + type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); if (type != AGI_SOUND_SAMPLE && type != AGI_SOUND_MIDI && type != AGI_SOUND_4CHN) return; diff --git a/engines/agi/sound.h b/engines/agi/sound.h index 16ec81d19a..d217d52ac6 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -89,7 +89,7 @@ struct CoCoNote { * as they're simply the different used values in AGI sound resources' * starts (The first 16-bit little endian word, to be precise). */ -enum AgiSoundType { +enum AgiSoundEmuType { AGI_SOUND_SAMPLE = 0x0001, AGI_SOUND_MIDI = 0x0002, AGI_SOUND_4CHN = 0x0008 @@ -110,7 +110,7 @@ enum AgiSoundEnv { * AGI engine sound channel structure. */ struct ChannelInfo { - AgiSoundType type; + AgiSoundEmuType type; const uint8 *ptr; // Pointer to the AgiNote data const int16 *ins; int32 size; -- cgit v1.2.3 From 9358b54332411498e1dec39ceb90b60748d7c921 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:35:23 +0000 Subject: Mention in NEWS most significant items which have been done so far. svn-id: r49753 --- NEWS | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/NEWS b/NEWS index 5796a7f885..3e09ab5961 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,20 @@ For a more comprehensive changelog for the latest experimental SVN code, see: General: - Switched to the "fast" DOSBox OPL emulator. - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. + - Added support for more original media layouts. + + AGI: + - Fixed number of GFX glitches. + - Made PIC drawing code picture perfect. + - Added support of MIDI devices. + + Drascula: + - Fixed number of GFX glitches. + - Made many cutscenes smoother. + - Changed behavior of items menu. Now it shows up on mouse up. + + SAGA: + - Fixed graphics glithces in several scenes. Groovie: - Added support for the Macintosh version of The 7th Guest. -- cgit v1.2.3 From 85d8b4f5d848c0e1ec6c7b4ef3e6bdd839b05197 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:35:42 +0000 Subject: AGI: Make sure that sound variable is reset once music is stopped. svn-id: r49754 --- engines/agi/sound.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index c4c695c59e..c35b23ae55 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -231,6 +231,9 @@ void SoundMgr::stopSound() { _playingSound = -1; } + + if (_endflag != -1) + _vm->setflag(_endflag, true); } int SoundMgr::initSound() { -- cgit v1.2.3 From 6903fc7a070e33809ba277256b23fa1963e65db7 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:36:10 +0000 Subject: AGI: Implement FR #2813133. FR #2813133: "AGI: Proper Tandy 3-Voice/IBM PCjr Sound Support". Add proper Tandy music. Heavily based on NAGI source, thus attached its X11 license. To run it now use -e pcjr. Old one is still default for adlib but most likely will be changed in the future. Also lied ground for further separation of different sound generators. svn-id: r49755 --- engines/agi/agi.cpp | 9 +- engines/agi/module.mk | 1 + engines/agi/sound.cpp | 28 ++- engines/agi/sound.h | 25 ++- engines/agi/sound_pcjr.cpp | 497 +++++++++++++++++++++++++++++++++++++++++++++ engines/agi/sound_pcjr.h | 112 ++++++++++ 6 files changed, 659 insertions(+), 13 deletions(-) create mode 100755 engines/agi/sound_pcjr.cpp create mode 100755 engines/agi/sound_pcjr.h diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index d89b10bb32..2f87d7b8ef 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -583,15 +583,18 @@ void AgiEngine::initialize() { } else if (getPlatform() == Common::kPlatformCoCo3) { _soundemu = SOUND_EMU_COCO3; } else { - switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB)) { + switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB | MDT_MIDI)) { case MD_PCSPK: _soundemu = SOUND_EMU_PC; break; + case MD_PCJR: + _soundemu = SOUND_EMU_PCJR; + break; case MD_ADLIB: - _soundemu = SOUND_EMU_MIDI; + _soundemu = SOUND_EMU_NONE; break; default: - _soundemu = SOUND_EMU_NONE; + _soundemu = SOUND_EMU_MIDI; break; } } diff --git a/engines/agi/module.mk b/engines/agi/module.mk index 4f27447dbd..db640c02b5 100644 --- a/engines/agi/module.mk +++ b/engines/agi/module.mk @@ -32,6 +32,7 @@ MODULE_OBJS := \ sound.o \ sound_2gs.o \ sound_midi.o \ + sound_pcjr.o \ sprite.o \ text.o \ view.o \ diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index c35b23ae55..0a71bcabca 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -35,6 +35,7 @@ #include "agi/sound_2gs.h" #include "agi/sound_midi.h" +#include "agi/sound_pcjr.h" namespace Agi { @@ -127,6 +128,15 @@ static int noteToPeriod(int note) { } #endif +int SoundMgr::readBuffer(int16 *buffer, const int numSamples) { + if (_vm->_soundemu == SOUND_EMU_PCJR) + _soundGen->premixerCall(buffer, numSamples); + else + premixerCall(buffer, numSamples / 2); + + return numSamples; +} + void SoundMgr::unloadSound(int resnum) { if (_vm->_game.dirSound[resnum].flags & RES_LOADED) { if (_vm->_game.sounds[resnum]->isPlaying()) { @@ -174,6 +184,8 @@ void SoundMgr::startSound(int resnum, int flag) { case AGI_SOUND_4CHN: if (_vm->_soundemu == SOUND_EMU_MIDI) { _musicPlayer->playMIDI((MIDISound *)_vm->_game.sounds[resnum]); + } else if (_vm->_soundemu == SOUND_EMU_PCJR) { + _soundGen->play(resnum, flag); } else { PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum]; @@ -212,7 +224,8 @@ void SoundMgr::stopSound() { debugC(3, kDebugLevelSound, "stopSound() --> %d", _playingSound); _endflag = -1; - if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { + + if (_vm->_soundemu != SOUND_EMU_APPLE2GS && _vm->_soundemu != SOUND_EMU_PCJR) { for (i = 0; i < NUM_CHANNELS; i++) stopNote(i); } @@ -229,6 +242,10 @@ void SoundMgr::stopSound() { _musicPlayer->stop(); } + if (_vm->_soundemu == SOUND_EMU_PCJR) { + _soundGen->stop(); + } + _playingSound = -1; } @@ -261,6 +278,9 @@ int SoundMgr::initSound() { break; case SOUND_EMU_MIDI: break; + case SOUND_EMU_PCJR: + _soundGen = new SoundGenPCJr(_vm); + break; } report("Initializing sound:\n"); @@ -281,6 +301,7 @@ int SoundMgr::initSound() { void SoundMgr::deinitSound() { debugC(3, kDebugLevelSound, "()"); + stopSound(); _mixer->stopHandle(_soundHandle); } @@ -617,7 +638,7 @@ void SoundMgr::fillAudio(void *udata, int16 *stream, uint len) { data_available -= len; } -SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) : _chn() { +SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) : _chn() { _vm = agi; _mixer = pMixer; _sampleRate = pMixer->getOutputRate(); @@ -630,6 +651,8 @@ SoundMgr::SoundMgr(AgiBase *agi, Audio::Mixer *pMixer) : _chn() { _disabledMidi = false; _useChorus = true; // FIXME: Currently always true? _midiDriver = 0; + _musicPlayer = 0; + _soundGen = 0; _gsSound = new IIgsSoundMgr; @@ -654,6 +677,7 @@ SoundMgr::~SoundMgr() { free(_sndBuffer); delete _gsSound; + delete _soundGen; delete _musicPlayer; delete _midiDriver; } diff --git a/engines/agi/sound.h b/engines/agi/sound.h index d217d52ac6..001b3e35c2 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -37,7 +37,7 @@ namespace Agi { #define SOUND_EMU_NONE 0 #define SOUND_EMU_PC 1 -#define SOUND_EMU_TANDY 2 +#define SOUND_EMU_PCJR 2 #define SOUND_EMU_MAC 3 #define SOUND_EMU_AMIGA 4 #define SOUND_EMU_APPLE2GS 5 @@ -126,6 +126,17 @@ struct ChannelInfo { class SoundMgr; +class SoundGen { +public: + SoundGen() {} + virtual ~SoundGen() {} + + virtual void play(int resnum, int flag) = 0; + virtual void stop(void) = 0; + + virtual void premixerCall(int16 *stream, int len) = 0; +}; + /** * AGI sound resource structure. */ @@ -167,7 +178,6 @@ protected: }; class AgiEngine; -class AgiBase; class IIgsSoundMgr; class MusicPlayer; @@ -176,15 +186,12 @@ struct IIgsExeInfo; class SoundMgr : public Audio::AudioStream { public: - SoundMgr(AgiBase *agi, Audio::Mixer *pMixer); + SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer); ~SoundMgr(); virtual void setVolume(uint8 volume); // AudioStream API - int readBuffer(int16 *buffer, const int numSamples) { - premixerCall(buffer, numSamples / 2); - return numSamples; - } + int readBuffer(int16 *buffer, const int numSamples); bool isStereo() const { return false; @@ -200,7 +207,7 @@ public: } int _endflag; - AgiBase *_vm; + AgiEngine *_vm; private: Audio::Mixer *_mixer; @@ -226,6 +233,8 @@ private: void premixerCall(int16 *buf, uint len); void fillAudio(void *udata, int16 *stream, uint len); + SoundGen *_soundGen; + public: void unloadSound(int); void playSound(); diff --git a/engines/agi/sound_pcjr.cpp b/engines/agi/sound_pcjr.cpp new file mode 100755 index 0000000000..f00c4424bc --- /dev/null +++ b/engines/agi/sound_pcjr.cpp @@ -0,0 +1,497 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/* Heavily based on code from NAGI + * + * COPYRIGHT AND PERMISSION NOTICE + * + * Copyright (c) 2001, 2001, 2002 Nick Sonneveld + * + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons + * to whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL + * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, use + * or other dealings in this Software without prior written authorization + * + */ + +#include "agi/agi.h" +#include "agi/sound.h" +#include "agi/sound_pcjr.h" + +namespace Agi { + +// "fade out" or possibly "dissolve" +// v2.9xx +const int8 dissolveDataV2[] = { + -2, -3, -2, -1, + 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, + 0x09, 0x09, 0x09, 0x09, + 0x0A, 0x0A, 0x0A, 0x0A, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0D, + -100 +}; + +// v3 +const int8 dissolveDataV3[] = { + -2, -3, -2, -1, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, + 0x09, 0x09, 0x09, 0x09, + 0x0A, 0x0A, 0x0A, 0x0A, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0D, + -100 +}; + + +SoundGenPCJr::SoundGenPCJr(AgiEngine *vm) : _vm(vm) { + _chanAllocated = 10240; // preallocate something which will most likely fit + _chanData = (int16 *)malloc(_chanAllocated << 1); + + // Pick dissolve method + // + // 0 = no dissolve.. just play for as long as it's meant to be played + // this was used in older v2.4 and under games i THINK + // 1 = not used + // 2 = v2.9+ games used a shorter dissolve + // 3 (default) = v3 games used this dissolve pattern.. slightly longer + if (_vm->getVersion() >= 0x3000) + _dissolveMethod = 3; + else if (_vm->getVersion() >= 0x2900) + _dissolveMethod = 2; + else + _dissolveMethod = 0; +} + +SoundGenPCJr::~SoundGenPCJr() { + free(_chanData); +} + +void SoundGenPCJr::play(int resnum, int flag) { + PCjrSound *pcjrSound = (PCjrSound *)_vm->_game.sounds[resnum]; + + for (int i = 0; i < CHAN_MAX; i++) { + _channel[i].data = pcjrSound->getVoicePointer(i % 4); + _channel[i].duration = 0; + _channel[i].avail = 0xffff; + _channel[i].dissolveCount = 0xFFFF; + _channel[i].attenuation = 0; + _channel[i].attenuationCopy = 0; + + _tchannel[i].avail = 1; + _tchannel[i].noteCount = 0; + _tchannel[i].freqCount = 250; + _tchannel[i].freqCountPrev = -1; + _tchannel[i].atten = 0xF; // silence + _tchannel[i].genType = kGenTone; + _tchannel[i].genTypePrev = -1; + } +} + +void SoundGenPCJr::stop(void) { + int i; + + for (i = 0; i < CHAN_MAX ; i++) { + _channel[i].avail = 0; + _tchannel[i].avail = 0; + } +} + +int SoundGenPCJr::volumeCalc(SndGenChan *chan) { + int8 attenuation, dissolveValue; + + const int8 *dissolveData; + + switch (_dissolveMethod) { + case 2: + dissolveData = dissolveDataV2; + break; + case 3: + default: + dissolveData = dissolveDataV3; + break; + } + + assert(chan); + + attenuation = chan->attenuation; + if (attenuation != 0x0F) { // != silence + if (chan->dissolveCount != 0xFFFF) { + dissolveValue = dissolveData[chan->dissolveCount]; + if (dissolveValue == -100) { // if at end of list + chan->dissolveCount = 0xFFFF; + chan->attenuation = chan->attenuationCopy; + attenuation = chan->attenuation; + } else { + chan->dissolveCount++; + + attenuation += dissolveValue; + if (attenuation < 0) + attenuation = 0; + if (attenuation > 0x0F) + attenuation = 0x0F; + + chan->attenuationCopy = attenuation; + + attenuation &= 0x0F; + attenuation += _vm->getvar(vVolume); + if (attenuation > 0x0F) + attenuation = 0x0F; + } + } + //if (computer_type == 2) && (attenuation < 8) + if (attenuation < 8) + attenuation += 2; + } + + return attenuation; +} + +// read the next channel data.. fill it in *tone +// if tone isn't touched.. it should be inited so it just plays silence +// return 0 if it's passing more data +// return -1 if it's passing nothing (end of data) +int SoundGenPCJr::getNextNote(int ch, Tone *tone) { + SndGenChan *chan; + const byte *data; + + assert(tone); + assert(ch < CHAN_MAX); + + if (!_vm->getflag(fSoundOn)) + return -1; + + chan = &_channel[ch]; + if (!chan->avail) + return -1; + + while ((chan->duration == 0) && (chan->duration != 0xFFFF)) { + data = chan->data; + + // read the duration of the note + chan->duration = READ_LE_UINT16(data); // duration + + // if it's 0 then it's not going to be played + // if it's 0xFFFF then the channel data has finished. + if ((chan->duration != 0) && (chan->duration != 0xFFFF)) { + // only tone channels dissolve + if ((ch != 3) && (_dissolveMethod != 0)) // != noise?? + chan->dissolveCount = 0; + + // attenuation (volume) + chan->attenuation = data[4] & 0xF; + + // frequency + if (ch < (CHAN_MAX - 1)) { + chan->freqCount = (uint16)data[2] & 0x3F; + chan->freqCount <<= 4; + chan->freqCount |= data[3] & 0x0F; + + chan->genType = kGenTone; + } else { + int noiseFreq; + + // check for white noise (1) or periodic (0) + chan->genType = (data[3] & 0x04) ? kGenWhite : kGenPeriod; + + noiseFreq = data[3] & 0x03; + + switch (noiseFreq) { + case 0: + chan->freqCount = 32; + break; + case 1: + chan->freqCount = 64; + break; + case 2: + chan->freqCount = 128; + break; + case 3: + chan->freqCount = _channel[2].freqCount * 2; + break; + } + } + } + // data now points to the next data seg-a-ment + chan->data += 5; + } + + if (chan->duration != 0xFFFF) { + tone->freqCount = chan->freqCount; + tone->atten = volumeCalc(chan); // calc volume, sent vol is different from saved vol + tone->type = chan->genType; + chan->duration--; + } else { + // kill channel + chan->avail = 0; + chan->attenuation = 0x0F; // silent + chan->attenuationCopy = 0x0F; // dunno really + + return -1; + } + + return 0; +} + +// Formulas for noise generator +// bit0 = output + +// noise feedback for white noise mode +#define FB_WNOISE 0x12000 // bit15.d(16bits) = bit0(out) ^ bit2 +//#define FB_WNOISE 0x14000 // bit15.d(16bits) = bit0(out) ^ bit1 +//#define FB_WNOISE 0x28000 // bit16.d(17bits) = bit0(out) ^ bit2 (same to AY-3-8910) +//#define FB_WNOISE 0x50000 // bit17.d(18bits) = bit0(out) ^ bit2 + +// noise feedback for periodic noise mode +// it is correct maybe (it was in the Megadrive sound manual) +//#define FB_PNOISE 0x10000 // 16bit rorate +#define FB_PNOISE 0x08000 + +// noise generator start preset (for periodic noise) +#define NG_PRESET 0x0f35 + +//#define WAVE_HEIGHT (0x7FFF) + +// Volume table. +// +// 2dB = 20*log(a/b) +// 10^(2/20)*b = a; +// value = 0x7fff; +// value /= 1.258925411794; +const int16 volTable[16] = { + 32767, 26027, 20674, 16422, 13044, 10361, 8230, 6537, 5193, 4125, 3276, 2602, 2067, 1642, 1304, 0 +}; + +#define FREQ_DIV 111844 +#define MULT FREQ_DIV + +// fill buff +int SoundGenPCJr::chanGen(int chan, int16 *stream, int len) { + ToneChan *tpcm; + Tone toneNew; + int fillSize; + int retVal; + + tpcm = &_tchannel[chan]; + + retVal = -1; + + while (len > 0) { + if (tpcm->noteCount <= 0) { + // get new tone data + toneNew.freqCount = 0; + toneNew.atten = 0xF; + toneNew.type = kGenTone; + if ((tpcm->avail) && (getNextNote(chan, &toneNew) == 0)) { + tpcm->atten = toneNew.atten; + tpcm->freqCount = toneNew.freqCount; + tpcm->genType = toneNew.type; + + // setup counters 'n stuff + // SAMPLE_RATE samples per sec.. tone changes 60 times per sec + tpcm->noteCount = SAMPLE_RATE / 60; + retVal = 0; + } else { + // if it doesn't return an + tpcm->genType = kGenSilence; + tpcm->noteCount = len; + tpcm->avail = 0; + } + } + + // write nothing + if ((tpcm->freqCount == 0) || (tpcm->atten == 0xf)) { + tpcm->genType = kGenSilence; + } + + // find which is smaller.. the buffer or the + fillSize = (tpcm->noteCount <= len) ? tpcm->noteCount : len; + + switch (tpcm->genType) { + case kGenTone: + fillSize = fillSquare(tpcm, stream, fillSize); + break; + case kGenPeriod: + case kGenWhite: + fillSize = fillNoise(tpcm, stream, fillSize); + break; + case kGenSilence: + default: + // fill with whitespace + memset(stream, 0, fillSize * sizeof(int16)); + break; + } + + tpcm->noteCount -= fillSize; + stream += fillSize; + len -= fillSize; + } + + return retVal; +} + +int SoundGenPCJr::fillSquare(ToneChan *t, int16 *buf, int len) { + int count; + + if (t->genType != t->genTypePrev) { + // make sure the freqCount is checked + t->freqCountPrev = -1; + t->sign = 1; + t->genTypePrev = t->genType; + } + + if (t->freqCount != t->freqCountPrev) { + //t->scale = (int)( (double)t->samp->freq*t->freqCount/FREQ_DIV * MULT + 0.5); + t->scale = (SAMPLE_RATE / 2) * t->freqCount; + t->count = t->scale; + t->freqCountPrev = t->freqCount; + } + + count = len; + + while (count > 0) { + *(buf++) = t->sign ? volTable[t->atten] : -volTable[t->atten]; + count--; + + // get next sample + t->count -= MULT; + while (t->count <= 0) { + t->sign ^= 1; + t->count += t->scale; + } + } + + return len; +} + +int SoundGenPCJr::fillNoise(ToneChan *t, int16 *buf, int len) { + int count; + + if (t->genType != t->genTypePrev) { + // make sure the freqCount is checked + t->freqCountPrev = -1; + t->genTypePrev = t->genType; + } + + if (t->freqCount != t->freqCountPrev) { + //t->scale = (int)( (double)t->samp->freq*t->freqCount/FREQ_DIV * MULT + 0.5); + t->scale = (SAMPLE_RATE / 2) * t->freqCount; + t->count = t->scale; + t->freqCountPrev = t->freqCount; + + t->feedback = (t->genType == kGenWhite) ? FB_WNOISE : FB_PNOISE; + // reset noise shifter + t->noiseState = NG_PRESET; + t->sign = t->noiseState & 1; + } + + count = len; + + while (count > 0) { + *(buf++) = t->sign ? volTable[t->atten] : -volTable[t->atten]; + count--; + + // get next sample + t->count -= MULT; + while (t->count <= 0) { + if (t->noiseState & 1) + t->noiseState ^= t->feedback; + + t->noiseState >>= 1; + t->sign = t->noiseState & 1; + t->count += t->scale; + } + } + + return len; +} + +void SoundGenPCJr::premixerCall(int16 *stream, int len) { + int streamCount; + int16 *sPtr, *cPtr; + + if (_chanAllocated < len) { + free(_chanData); + _chanData = (int16 *)malloc(len << 1); + _chanAllocated = len; + } + memset(stream, 0, len << 1); + + assert(stream); + + for (int i = 0; i < CHAN_MAX; i++) { + // get channel data(chan.userdata) + if (chanGen(i, _chanData, len) == 0) { + // divide by number of channels then add to stream + streamCount = len; + sPtr = stream; + cPtr = _chanData; + + while (streamCount--) + *(sPtr++) += *(cPtr++) / CHAN_MAX; + } + } +} + +} // End of namespace Agi diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h new file mode 100755 index 0000000000..9ef9aa2385 --- /dev/null +++ b/engines/agi/sound_pcjr.h @@ -0,0 +1,112 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef AGI_SOUND_PCJR_H +#define AGI_SOUND_PCJR_H + +namespace Agi { + +#define CHAN_MAX 4 + +#define SAMPLE_RATE 22050 + +enum GenType { + kGenSilence, + kGenTone, + kGenPeriod, + kGenWhite +}; + +struct SndGenChan { + const byte *data; + uint16 duration; + uint16 avail; // turned on (1) but when the channel's data runs out, it's set to (0) + uint16 dissolveCount; + byte attenuation; + byte attenuationCopy; + + GenType genType; + + // for the sample mixer + int freqCount; +}; + +struct ToneChan { + int avail; + + int noteCount; // length of tone.. duration + + int freqCount; + int freqCountPrev; + int atten; // volume + + GenType genType; + int genTypePrev; + + int count; + int scale; + int sign; + unsigned int noiseState; /* noise generator */ + int feedback; /* noise feedback mask */ +}; + +struct Tone { + int freqCount; + int atten; + GenType type; +}; + +class SoundGenPCJr : public SoundGen { +public: + SoundGenPCJr(AgiEngine *vm); + ~SoundGenPCJr(); + + void play(int resnum, int flag); + void stop(void); + + void premixerCall(int16 *stream, int len); + +private: + int getNextNote(int ch, Tone *tone); + int volumeCalc(SndGenChan *chan); + + int chanGen(int chan, int16 *stream, int len); + + int fillNoise(ToneChan *t, int16 *buf, int len); + int fillSquare(ToneChan *t, int16 *buf, int len); + +private: + AgiEngine *_vm; + SndGenChan _channel[CHAN_MAX]; + ToneChan _tchannel[CHAN_MAX]; + int16 *_chanData; + int _chanAllocated; + + int _dissolveMethod; +}; + +} // End of namespace Agi + +#endif /* AGI_SOUND_PCJR_H */ -- cgit v1.2.3 From 0fe65d3e5fcabaac354ffb67cb1970e3e0f5f270 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 15 Jun 2010 10:36:53 +0000 Subject: PSP: fixed invisible bug in power callback svn-id: r49756 --- backends/platform/psp/psp_main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp index e6940eba13..c26aed539e 100644 --- a/backends/platform/psp/psp_main.cpp +++ b/backends/platform/psp/psp_main.cpp @@ -110,12 +110,13 @@ int exit_callback(void) { } /* Function for handling suspend/resume */ -void power_callback(int , int powerinfo) { +int power_callback(int , int powerinfo, void *) { if (powerinfo & PSP_POWER_CB_POWER_SWITCH || powerinfo & PSP_POWER_CB_SUSPENDING) { PowerMan.suspend(); } else if (powerinfo & PSP_POWER_CB_RESUME_COMPLETE) { PowerMan.resume(); } + return 0; } /* Callback thread */ -- cgit v1.2.3 From ceb2909e0ad0ee4db8846bc2e6e9009364e24731 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:36:54 +0000 Subject: AGI: Split all sound generators into separate modules. Now the sound subsystem of the engine finally is possible to grasp. Also now it is obvious why CoCo3 sounds are not functioning. svn-id: r49757 --- engines/agi/module.mk | 2 + engines/agi/sound.cpp | 553 ++++--------------------------------------- engines/agi/sound.h | 141 ++--------- engines/agi/sound_2gs.cpp | 259 +++++++++++++++++--- engines/agi/sound_2gs.h | 58 ++++- engines/agi/sound_coco3.cpp | 80 +++++++ engines/agi/sound_coco3.h | 73 ++++++ engines/agi/sound_midi.cpp | 41 ++-- engines/agi/sound_midi.h | 13 +- engines/agi/sound_pcjr.cpp | 23 +- engines/agi/sound_pcjr.h | 25 +- engines/agi/sound_sarien.cpp | 357 ++++++++++++++++++++++++++++ engines/agi/sound_sarien.h | 120 ++++++++++ 13 files changed, 1036 insertions(+), 709 deletions(-) create mode 100644 engines/agi/sound_coco3.cpp create mode 100755 engines/agi/sound_coco3.h create mode 100644 engines/agi/sound_sarien.cpp create mode 100755 engines/agi/sound_sarien.h diff --git a/engines/agi/module.mk b/engines/agi/module.mk index db640c02b5..2339d1019f 100644 --- a/engines/agi/module.mk +++ b/engines/agi/module.mk @@ -31,8 +31,10 @@ MODULE_OBJS := \ saveload.o \ sound.o \ sound_2gs.o \ + sound_coco3.o \ sound_midi.o \ sound_pcjr.o \ + sound_sarien.o \ sprite.o \ text.o \ view.o \ diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index 0a71bcabca..2ca2706259 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -23,6 +23,15 @@ * */ +#include "agi/agi.h" + +#include "agi/sound_2gs.h" +#include "agi/sound_coco3.h" +#include "agi/sound_midi.h" +#include "agi/sound_sarien.h" +#include "agi/sound_pcjr.h" + +#if 0 #include "common/md5.h" #include "common/config-manager.h" #include "common/fs.h" @@ -31,16 +40,11 @@ #include "sound/mididrv.h" -#include "agi/agi.h" -#include "agi/sound_2gs.h" -#include "agi/sound_midi.h" -#include "agi/sound_pcjr.h" +#endif namespace Agi { -#define USE_INTERPOLATION - // // TODO: add support for variable sampling rate in the output device // @@ -84,59 +88,17 @@ const uint8 *PCjrSound::getVoicePointer(uint voiceNum) { return _data + voiceStartOffset; } -static const int16 waveformRamp[WAVEFORM_SIZE] = { - 0, 8, 16, 24, 32, 40, 48, 56, - 64, 72, 80, 88, 96, 104, 112, 120, - 128, 136, 144, 152, 160, 168, 176, 184, - 192, 200, 208, 216, 224, 232, 240, 255, - 0, -248, -240, -232, -224, -216, -208, -200, - -192, -184, -176, -168, -160, -152, -144, -136, - -128, -120, -112, -104, -96, -88, -80, -72, - -64, -56, -48, -40, -32, -24, -16, -8 // Ramp up -}; - -static const int16 waveformSquare[WAVEFORM_SIZE] = { - 255, 230, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 110, - -255, -230, -220, -220, -220, -220, -220, -220, - -220, -220, -220, -220, -220, -220, -220, -220, - -220, -220, -220, -220, -220, -220, -220, -220, - -220, -220, -220, -110, 0, 0, 0, 0 // Square -}; - -static const int16 waveformMac[WAVEFORM_SIZE] = { - 45, 110, 135, 161, 167, 173, 175, 176, - 156, 137, 123, 110, 91, 72, 35, -2, - -60, -118, -142, -165, -170, -176, -177, -179, - -177, -176, -164, -152, -117, -82, -17, 47, - 92, 137, 151, 166, 170, 173, 171, 169, - 151, 133, 116, 100, 72, 43, -7, -57, - -99, -141, -156, -170, -174, -177, -178, -179, - -175, -172, -165, -159, -137, -114, -67, -19 -}; - +#if 0 static const uint16 period[] = { 1024, 1085, 1149, 1218, 1290, 1367, 1448, 1534, 1625, 1722, 1825, 1933 }; -#if 0 static int noteToPeriod(int note) { return 10 * (period[note % 12] >> (note / 12 - 3)); } #endif -int SoundMgr::readBuffer(int16 *buffer, const int numSamples) { - if (_vm->_soundemu == SOUND_EMU_PCJR) - _soundGen->premixerCall(buffer, numSamples); - else - premixerCall(buffer, numSamples / 2); - - return numSamples; -} - void SoundMgr::unloadSound(int resnum) { if (_vm->_game.dirSound[resnum].flags & RES_LOADED) { if (_vm->_game.sounds[resnum]->isPlaying()) { @@ -151,7 +113,6 @@ void SoundMgr::unloadSound(int resnum) { } void SoundMgr::startSound(int resnum, int flag) { - int i; AgiSoundEmuType type; if (_vm->_game.sounds[resnum] != NULL && _vm->_game.sounds[resnum]->isPlaying()) @@ -172,46 +133,8 @@ void SoundMgr::startSound(int resnum, int flag) { debugC(3, kDebugLevelSound, "startSound(resnum = %d, flag = %d) type = %d", resnum, flag, type); - switch (type) { - case AGI_SOUND_SAMPLE: { - IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[_playingSound]; - _gsSound->playSampleSound(sampleRes->getHeader(), sampleRes->getSample()); - break; - } - case AGI_SOUND_MIDI: - ((IIgsMidi *) _vm->_game.sounds[_playingSound])->rewind(); - break; - case AGI_SOUND_4CHN: - if (_vm->_soundemu == SOUND_EMU_MIDI) { - _musicPlayer->playMIDI((MIDISound *)_vm->_game.sounds[resnum]); - } else if (_vm->_soundemu == SOUND_EMU_PCJR) { - _soundGen->play(resnum, flag); - } else { - - PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum]; - - // Initialize channel info - for (i = 0; i < NUM_CHANNELS; i++) { - _chn[i].type = type; - _chn[i].flags = AGI_SOUND_LOOP; - - if (_env) { - _chn[i].flags |= AGI_SOUND_ENVELOPE; - _chn[i].adsr = AGI_SOUND_ENV_ATTACK; - } - - _chn[i].ins = _waveform; - _chn[i].size = WAVEFORM_SIZE; - _chn[i].ptr = pcjrSound->getVoicePointer(i % 4); - _chn[i].timer = 0; - _chn[i].vol = 0; - _chn[i].end = 0; - } - } - break; - } + _soundGen->play(resnum); - memset(_sndBuffer, 0, BUFFER_SIZE << 1); _endflag = flag; // Nat Budin reports that the flag should be reset when sound starts @@ -219,32 +142,15 @@ void SoundMgr::startSound(int resnum, int flag) { } void SoundMgr::stopSound() { - int i; - debugC(3, kDebugLevelSound, "stopSound() --> %d", _playingSound); _endflag = -1; - if (_vm->_soundemu != SOUND_EMU_APPLE2GS && _vm->_soundemu != SOUND_EMU_PCJR) { - for (i = 0; i < NUM_CHANNELS; i++) - stopNote(i); - } - if (_playingSound != -1) { if (_vm->_game.sounds[_playingSound]) // sanity checking _vm->_game.sounds[_playingSound]->stop(); - if (_vm->_soundemu == SOUND_EMU_APPLE2GS) { - _gsSound->stopSounds(); - } - - if (_vm->_soundemu == SOUND_EMU_MIDI) { - _musicPlayer->stop(); - } - - if (_vm->_soundemu == SOUND_EMU_PCJR) { - _soundGen->stop(); - } + _soundGen->stop(); _playingSound = -1; } @@ -254,432 +160,57 @@ void SoundMgr::stopSound() { } int SoundMgr::initSound() { - int r = -1; + return -1; +} - memset(_sndBuffer, 0, BUFFER_SIZE << 1); - _env = false; +void SoundMgr::deinitSound() { + stopSound(); + + delete _soundGen; +} + +void SoundMgr::soundIsFinished() { + if (_endflag != -1) + _vm->setflag(_endflag, true); + + if (_playingSound != -1) + _vm->_game.sounds[_playingSound]->stop(); + _playingSound = -1; + _endflag = -1; +} + +SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) { + _vm = agi; + _endflag = -1; + _playingSound = -1; switch (_vm->_soundemu) { case SOUND_EMU_NONE: - _waveform = waveformRamp; - _env = true; - break; case SOUND_EMU_AMIGA: case SOUND_EMU_PC: - _waveform = waveformSquare; - break; case SOUND_EMU_MAC: - _waveform = waveformMac; + _soundGen = new SoundGenSarien(_vm, pMixer); + break; + case SOUND_EMU_PCJR: + _soundGen = new SoundGenPCJr(_vm, pMixer); break; case SOUND_EMU_APPLE2GS: - _disabledMidi = !loadInstruments(); + _soundGen = new SoundGen2GS(_vm, pMixer); break; case SOUND_EMU_COCO3: + _soundGen = new SoundGenCoCo3(_vm, pMixer); break; case SOUND_EMU_MIDI: + _soundGen = new SoundGenMIDI(_vm, pMixer); break; - case SOUND_EMU_PCJR: - _soundGen = new SoundGenPCJr(_vm); - break; - } - - report("Initializing sound:\n"); - - report("sound: envelopes "); - if (_env) { - report("enabled (decay=%d, sustain=%d)\n", ENV_DECAY, ENV_SUSTAIN); - } else { - report("disabled\n"); - } - - if (_vm->_soundemu != SOUND_EMU_MIDI) - _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - - return r; -} - -void SoundMgr::deinitSound() { - debugC(3, kDebugLevelSound, "()"); - - stopSound(); - _mixer->stopHandle(_soundHandle); -} - -void SoundMgr::stopNote(int i) { - _chn[i].adsr = AGI_SOUND_ENV_RELEASE; - - if (_useChorus) { - // Stop chorus ;) - if (_chn[i].type == AGI_SOUND_4CHN && - _vm->_soundemu == SOUND_EMU_NONE && i < 3) { - stopNote(i + 4); - } - } -} - -void SoundMgr::playNote(int i, int freq, int vol) { - if (!_vm->getflag(fSoundOn)) - vol = 0; - else if (vol && _vm->_soundemu == SOUND_EMU_PC) - vol = 160; - - _chn[i].phase = 0; - _chn[i].freq = freq; - _chn[i].vol = vol; - _chn[i].env = 0x10000; - _chn[i].adsr = AGI_SOUND_ENV_ATTACK; - - if (_useChorus) { - // Add chorus ;) - if (_chn[i].type == AGI_SOUND_4CHN && - _vm->_soundemu == SOUND_EMU_NONE && i < 3) { - - int newfreq = freq * 1007 / 1000; - - if (freq == newfreq) - newfreq++; - - playNote(i + 4, newfreq, vol * 2 / 3); - } - } -} - -static int cocoFrequencies[] = { - 130, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, - 261, 277, 293, 311, 329, 349, 369, 391, 415, 440, 466, 493, - 523, 554, 587, 622, 659, 698, 739, 783, 830, 880, 932, 987, - 1046, 1108, 1174, 1244, 1318, 1396, 1479, 1567, 1661, 1760, 1864, 1975, - 2093, 2217, 2349, 2489, 2637, 2793, 2959, 3135, 3322, 3520, 3729, 3951 -}; - -void SoundMgr::playCoCoSound() { - int i = 0; - CoCoNote note; - - do { - note.read(_chn[i].ptr); - - if (note.freq != 0xff) { - playNote(0, cocoFrequencies[note.freq], note.volume); - - uint32 start_time = _vm->_system->getMillis(); - - while (_vm->_system->getMillis() < start_time + note.duration) { - _vm->_system->updateScreen(); - - _vm->_system->delayMillis(10); - } - } - } while (note.freq != 0xff); -} - -void SoundMgr::playAgiSound() { - int i; - AgiNote note; - - _playing = false; - for (i = 0; i < (_vm->_soundemu == SOUND_EMU_PC ? 1 : 4); i++) { - _playing |= !_chn[i].end; - note.read(_chn[i].ptr); // Read a single note (Doesn't advance the pointer) - - if (_chn[i].end) - continue; - - if ((--_chn[i].timer) <= 0) { - stopNote(i); - - if (note.freqDiv != 0) { - int volume = (note.attenuation == 0x0F) ? 0 : (0xFF - note.attenuation * 2); - playNote(i, note.freqDiv * 10, volume); - } - - _chn[i].timer = note.duration; - - if (_chn[i].timer == 0xffff) { - _chn[i].end = 1; - _chn[i].vol = 0; - _chn[i].env = 0; - - if (_useChorus) { - // chorus - if (_chn[i].type == AGI_SOUND_4CHN && _vm->_soundemu == SOUND_EMU_NONE && i < 3) { - _chn[i + 4].vol = 0; - _chn[i + 4].env = 0; - } - } - } - _chn[i].ptr += 5; // Advance the pointer to the next note data (5 bytes per note) - } - } -} - -void SoundMgr::playSound() { - int i; - - if (_endflag == -1) - return; - - if (_vm->_soundemu == SOUND_EMU_APPLE2GS) { - if (_playingSound != -1) { - if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_MIDI) { - playMidiSound(); - //warning("playSound: Trying to play an Apple IIGS MIDI sound. Not yet implemented"); - } else if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_SAMPLE) { - //debugC(3, kDebugLevelSound, "playSound: Trying to play an Apple IIGS sample"); - playSampleSound(); - } - } - } else if (_vm->_soundemu == SOUND_EMU_COCO3) { - playCoCoSound(); - } else { - //debugC(3, kDebugLevelSound, "playSound: Trying to play a PCjr 4-channel sound"); - playAgiSound(); - } - - if (!_playing) { - if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { - for (i = 0; i < NUM_CHANNELS; _chn[i++].vol = 0) - ; - } - - if (_endflag != -1) - _vm->setflag(_endflag, true); - - if (_playingSound != -1) - _vm->_game.sounds[_playingSound]->stop(); - _playingSound = -1; - _endflag = -1; } } -uint32 SoundMgr::mixSound() { - register int i, p; - const int16 *src; - int c, b, m; - - memset(_sndBuffer, 0, BUFFER_SIZE << 1); - - if (!_playing || _playingSound == -1) - return BUFFER_SIZE; - - // Handle Apple IIGS sound mixing here - // TODO: Implement playing both waves in an oscillator - // TODO: Implement swap-mode in an oscillator - if (_vm->_soundemu == SOUND_EMU_APPLE2GS) { - for (uint midiChan = 0; midiChan < _gsSound->_midiChannels.size(); midiChan++) { - for (uint gsChan = 0; gsChan < _gsSound->_midiChannels[midiChan]._gsChannels.size(); gsChan++) { - IIgsChannelInfo &channel = _gsSound->_midiChannels[midiChan]._gsChannels[gsChan]; - if (channel.playing()) { // Only mix in actively playing channels - // Frequency multiplier was 1076.0 based on tests made with MESS 0.117. - // Tests made with KEGS32 averaged the multiplier to around 1045. - // So this is a guess but maybe it's 1046.5... i.e. C6's frequency? - double hertz = C6_FREQ * pow(SEMITONE, fracToDouble(channel.note)); - channel.posAdd = doubleToFrac(hertz / getRate()); - channel.vol = doubleToFrac(fracToDouble(channel.envVol) * fracToDouble(channel.chanVol) / 127.0); - double tempVol = fracToDouble(channel.vol)/127.0; - for (i = 0; i < IIGS_BUFFER_SIZE; i++) { - b = channel.relocatedSample[fracToInt(channel.pos)]; - // TODO: Find out what volume/amplification setting is loud enough - // but still doesn't clip when playing many channels on it. - _sndBuffer[i] += (int16) (b * tempVol * 256/4); - channel.pos += channel.posAdd; - - if (channel.pos >= intToFrac(channel.size)) { - if (channel.loop) { - // Don't divide by zero on zero length samples - channel.pos %= intToFrac(channel.size + (channel.size == 0)); - // Probably we should loop the envelope too - channel.envSeg = 0; - channel.envVol = channel.startEnvVol; - } else { - channel.pos = channel.chanVol = 0; - channel.end = true; - break; - } - } - } - - if (channel.envSeg < ENVELOPE_SEGMENT_COUNT) { - const IIgsEnvelopeSegment &seg = channel.ins->env.seg[channel.envSeg]; - // I currently assume enveloping works with the same speed as the MIDI - // (i.e. with 1/60ths of a second ticks). - // TODO: Check if enveloping really works with the same speed as MIDI - frac_t envVolDelta = doubleToFrac(seg.inc/256.0); - if (intToFrac(seg.bp) >= channel.envVol) { - channel.envVol += envVolDelta; - if (channel.envVol >= intToFrac(seg.bp)) { - channel.envVol = intToFrac(seg.bp); - channel.envSeg += 1; - } - } else { - channel.envVol -= envVolDelta; - if (channel.envVol <= intToFrac(seg.bp)) { - channel.envVol = intToFrac(seg.bp); - channel.envSeg += 1; - } - } - } - } - } - } - _gsSound->removeStoppedSounds(); - return IIGS_BUFFER_SIZE; - } // else ... - - // Handle PCjr 4-channel sound mixing here - for (c = 0; c < NUM_CHANNELS; c++) { - if (!_chn[c].vol) - continue; - - m = _chn[c].flags & AGI_SOUND_ENVELOPE ? - _chn[c].vol * _chn[c].env >> 16 : _chn[c].vol; - - if (_chn[c].type != AGI_SOUND_4CHN || c != 3) { - src = _chn[c].ins; - - p = _chn[c].phase; - for (i = 0; i < BUFFER_SIZE; i++) { - b = src[p >> 8]; -#ifdef USE_INTERPOLATION - b += ((src[((p >> 8) + 1) % _chn[c].size] - src[p >> 8]) * (p & 0xff)) >> 8; -#endif - _sndBuffer[i] += (b * m) >> 4; - - p += (uint32) 118600 *4 / _chn[c].freq; - - // FIXME: Fingolfin asks: why is there a FIXME here? Please either clarify what - // needs fixing, or remove it! - // FIXME - if (_chn[c].flags & AGI_SOUND_LOOP) { - p %= _chn[c].size << 8; - } else { - if (p >= _chn[c].size << 8) { - p = _chn[c].vol = 0; - _chn[c].end = 1; - break; - } - } - - } - _chn[c].phase = p; - } else { - // Add white noise - for (i = 0; i < BUFFER_SIZE; i++) { - b = _vm->_rnd->getRandomNumber(255) - 128; - _sndBuffer[i] += (b * m) >> 4; - } - } - - switch (_chn[c].adsr) { - case AGI_SOUND_ENV_ATTACK: - // not implemented - _chn[c].adsr = AGI_SOUND_ENV_DECAY; - break; - case AGI_SOUND_ENV_DECAY: - if (_chn[c].env > _chn[c].vol * ENV_SUSTAIN + ENV_DECAY) { - _chn[c].env -= ENV_DECAY; - } else { - _chn[c].env = _chn[c].vol * ENV_SUSTAIN; - _chn[c].adsr = AGI_SOUND_ENV_SUSTAIN; - } - break; - case AGI_SOUND_ENV_SUSTAIN: - break; - case AGI_SOUND_ENV_RELEASE: - if (_chn[c].env >= ENV_RELEASE) { - _chn[c].env -= ENV_RELEASE; - } else { - _chn[c].env = 0; - } - } - } - - return BUFFER_SIZE; -} - -/** - * Convert sample from 8-bit unsigned to 8-bit signed format. - * @param source Source stream containing the 8-bit unsigned sample data. - * @param dest Destination buffer for the 8-bit signed sample data. - * @param length Length of the sample data to be converted. - */ -bool SoundMgr::convertWave(Common::SeekableReadStream &source, int8 *dest, uint length) { - // Convert the wave from 8-bit unsigned to 8-bit signed format - for (uint i = 0; i < length; i++) - dest[i] = (int8) ((int) source.readByte() - 128); - return !(source.eos() || source.err()); -} - -void SoundMgr::fillAudio(void *udata, int16 *stream, uint len) { - SoundMgr *soundMgr = (SoundMgr *)udata; - uint32 p = 0; - - // current number of audio bytes in _sndBuffer - static uint32 data_available = 0; - // offset of start of audio bytes in _sndBuffer - static uint32 data_offset = 0; - - len <<= 2; - - debugC(5, kDebugLevelSound, "(%p, %p, %d)", (void *)udata, (void *)stream, len); - - while (len > data_available) { - memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, data_available); - p += data_available; - len -= data_available; - - soundMgr->playSound(); - data_available = soundMgr->mixSound() << 1; - data_offset = 0; - } - - memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, len); - data_offset += len; - data_available -= len; -} - -SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) : _chn() { - _vm = agi; - _mixer = pMixer; - _sampleRate = pMixer->getOutputRate(); - _endflag = -1; - _playingSound = -1; - _env = false; - _playing = false; - _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE); - _waveform = 0; - _disabledMidi = false; - _useChorus = true; // FIXME: Currently always true? - _midiDriver = 0; - _musicPlayer = 0; - _soundGen = 0; - - _gsSound = new IIgsSoundMgr; - - if (_vm->_soundemu == SOUND_EMU_MIDI) { - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB); - - _midiDriver = MidiDriver::createMidi(midiDriver); - _musicPlayer = new MusicPlayer(_midiDriver, this); - } -} - -void SoundMgr::premixerCall(int16 *data, uint len) { - if (_vm->_soundemu != SOUND_EMU_MIDI) - fillAudio(this, data, len); -} - void SoundMgr::setVolume(uint8 volume) { // TODO } SoundMgr::~SoundMgr() { - free(_sndBuffer); - delete _gsSound; - - delete _soundGen; - delete _musicPlayer; - delete _midiDriver; } } // End of namespace Agi diff --git a/engines/agi/sound.h b/engines/agi/sound.h index 001b3e35c2..63b36e017c 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -26,15 +26,10 @@ #ifndef AGI_SOUND_H #define AGI_SOUND_H -#include "sound/audiostream.h" #include "sound/mixer.h" -class MidiDriver; - namespace Agi { -#define BUFFER_SIZE 410 - #define SOUND_EMU_NONE 0 #define SOUND_EMU_PC 1 #define SOUND_EMU_PCJR 2 @@ -44,13 +39,6 @@ namespace Agi { #define SOUND_EMU_COCO3 6 #define SOUND_EMU_MIDI 7 -#define WAVEFORM_SIZE 64 -#define ENV_ATTACK 10000 /**< envelope attack rate */ -#define ENV_DECAY 1000 /**< envelope decay rate */ -#define ENV_SUSTAIN 100 /**< envelope sustain level */ -#define ENV_RELEASE 7500 /**< envelope release rate */ -#define NUM_CHANNELS 7 /**< number of sound channels */ - /** * AGI sound note structure. */ @@ -70,19 +58,6 @@ struct AgiNote { } }; -struct CoCoNote { - uint8 freq; - uint8 volume; - uint16 duration; ///< Note duration - - /** Reads a CoCoNote through the given pointer. */ - void read(const uint8 *ptr) { - freq = *ptr; - volume = *(ptr + 1); - duration = READ_LE_UINT16(ptr + 2); - } -}; - /** * AGI sound resource types. * It's probably coincidence that all the values here are powers of two @@ -94,47 +69,26 @@ enum AgiSoundEmuType { AGI_SOUND_MIDI = 0x0002, AGI_SOUND_4CHN = 0x0008 }; -enum AgiSoundFlags { - AGI_SOUND_LOOP = 0x0001, - AGI_SOUND_ENVELOPE = 0x0002 -}; -enum AgiSoundEnv { - AGI_SOUND_ENV_ATTACK = 3, - AGI_SOUND_ENV_DECAY = 2, - AGI_SOUND_ENV_SUSTAIN = 1, - AGI_SOUND_ENV_RELEASE = 0 -}; - - -/** - * AGI engine sound channel structure. - */ -struct ChannelInfo { - AgiSoundEmuType type; - const uint8 *ptr; // Pointer to the AgiNote data - const int16 *ins; - int32 size; - uint32 phase; - uint32 flags; // ORs values from AgiSoundFlags - AgiSoundEnv adsr; - int32 timer; - uint32 end; - uint32 freq; - uint32 vol; - uint32 env; -}; class SoundMgr; class SoundGen { public: - SoundGen() {} + SoundGen(AgiEngine *vm, Audio::Mixer *pMixer) : _vm(vm), _mixer(pMixer) { + _sampleRate = pMixer->getOutputRate(); + } + virtual ~SoundGen() {} - virtual void play(int resnum, int flag) = 0; + virtual void play(int resnum) = 0; virtual void stop(void) = 0; - virtual void premixerCall(int16 *stream, int len) = 0; + AgiEngine *_vm; + + Audio::Mixer *_mixer; + Audio::SoundHandle _soundHandle; + + uint32 _sampleRate; }; /** @@ -177,81 +131,30 @@ protected: uint16 _type; ///< Sound resource type }; -class AgiEngine; -class IIgsSoundMgr; -class MusicPlayer; - -struct IIgsExeInfo; - -class SoundMgr : public Audio::AudioStream { +class SoundMgr { public: SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer); ~SoundMgr(); - virtual void setVolume(uint8 volume); - // AudioStream API - int readBuffer(int16 *buffer, const int numSamples); + void setVolume(uint8 volume); - bool isStereo() const { - return false; - } - - bool endOfData() const { - return false; - } + void unloadSound(int); + void playSound(); + int initSound(); + void deinitSound(); + void startSound(int, int); + void stopSound(); - int getRate() const { - // FIXME: Ideally, we should use _sampleRate. - return 22050; - } + void soundIsFinished(); +private: int _endflag; AgiEngine *_vm; -private: - Audio::Mixer *_mixer; - Audio::SoundHandle _soundHandle; - - MusicPlayer *_musicPlayer; - MidiDriver *_midiDriver; - - uint32 _sampleRate; - - bool _playing; - ChannelInfo _chn[NUM_CHANNELS]; - IIgsSoundMgr *_gsSound; - int _playingSound; - uint8 _env; - bool _disabledMidi; - - int16 *_sndBuffer; - const int16 *_waveform; - - bool _useChorus; - - void premixerCall(int16 *buf, uint len); - void fillAudio(void *udata, int16 *stream, uint len); - SoundGen *_soundGen; -public: - void unloadSound(int); - void playSound(); - int initSound(); - void deinitSound(); - void startSound(int, int); - void stopSound(); - void stopNote(int i); - void playNote(int i, int freq, int vol); - void playAgiSound(); - void playCoCoSound(); - uint32 mixSound(); - bool loadInstruments(); - void playMidiSound(); - void playSampleSound(); - const IIgsExeInfo *getIIgsExeInfo(enum AgiGameID gameid) const; - static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint length); + int _playingSound; }; } // End of namespace Agi diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index ce4aa160a0..056eac2d5c 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -23,10 +23,9 @@ * */ -#include "common/md5.h" #include "common/config-manager.h" #include "common/fs.h" -#include "common/random.h" +#include "common/md5.h" #include "common/str-array.h" #include "agi/agi.h" @@ -34,6 +33,194 @@ namespace Agi { +SoundGen2GS::SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) { + _disabledMidi = !loadInstruments(); + + _playingSound = -1; + _playing = false; + + _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE); + + _midiChannels.resize(16); // Set the amount of available MIDI channels + + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); +} + +SoundGen2GS::~SoundGen2GS() { + _mixer->stopHandle(_soundHandle); + + free(_sndBuffer); +} + +int SoundGen2GS::readBuffer(int16 *buffer, const int numSamples) { + fillAudio(buffer, numSamples / 2); + + return numSamples; +} + +void SoundGen2GS::play(int resnum) { + AgiSoundEmuType type; + + _playingSound = resnum; + + type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); + + assert (type == AGI_SOUND_SAMPLE || type == AGI_SOUND_MIDI); + + switch (type) { + case AGI_SOUND_SAMPLE: { + IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[_playingSound]; + playSampleSound(sampleRes->getHeader(), sampleRes->getSample()); + break; + } + case AGI_SOUND_MIDI: + ((IIgsMidi *) _vm->_game.sounds[_playingSound])->rewind(); + break; + default: + break; + } +} + +void SoundGen2GS::stop() { + _playingSound = -1; + + // Stops all sounds on all MIDI channels + for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) + iter->stopSounds(); +} + +void SoundGen2GS::playSound() { + if (_playingSound == -1) + return; + + if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_MIDI) { + playMidiSound(); + //warning("playSound: Trying to play an Apple IIGS MIDI sound. Not yet implemented"); + } else if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_SAMPLE) { + //debugC(3, kDebugLevelSound, "playSound: Trying to play an Apple IIGS sample"); + playSampleSound(); + } + + if (!_playing) { + _vm->_sound->soundIsFinished(); + + _playingSound = -1; + } +} + +uint32 SoundGen2GS::mixSound() { + int i, b; + + memset(_sndBuffer, 0, BUFFER_SIZE << 1); + + if (!_playing || _playingSound == -1) + return BUFFER_SIZE; + + // Handle Apple IIGS sound mixing here + // TODO: Implement playing both waves in an oscillator + // TODO: Implement swap-mode in an oscillator + for (uint midiChan = 0; midiChan < _midiChannels.size(); midiChan++) { + for (uint gsChan = 0; gsChan < _midiChannels[midiChan]._gsChannels.size(); gsChan++) { + IIgsChannelInfo &channel = _midiChannels[midiChan]._gsChannels[gsChan]; + if (channel.playing()) { // Only mix in actively playing channels + // Frequency multiplier was 1076.0 based on tests made with MESS 0.117. + // Tests made with KEGS32 averaged the multiplier to around 1045. + // So this is a guess but maybe it's 1046.5... i.e. C6's frequency? + double hertz = C6_FREQ * pow(SEMITONE, fracToDouble(channel.note)); + channel.posAdd = doubleToFrac(hertz / getRate()); + channel.vol = doubleToFrac(fracToDouble(channel.envVol) * fracToDouble(channel.chanVol) / 127.0); + double tempVol = fracToDouble(channel.vol)/127.0; + for (i = 0; i < IIGS_BUFFER_SIZE; i++) { + b = channel.relocatedSample[fracToInt(channel.pos)]; + // TODO: Find out what volume/amplification setting is loud enough + // but still doesn't clip when playing many channels on it. + _sndBuffer[i] += (int16) (b * tempVol * 256/4); + channel.pos += channel.posAdd; + + if (channel.pos >= intToFrac(channel.size)) { + if (channel.loop) { + // Don't divide by zero on zero length samples + channel.pos %= intToFrac(channel.size + (channel.size == 0)); + // Probably we should loop the envelope too + channel.envSeg = 0; + channel.envVol = channel.startEnvVol; + } else { + channel.pos = channel.chanVol = 0; + channel.end = true; + break; + } + } + } + + if (channel.envSeg < ENVELOPE_SEGMENT_COUNT) { + const IIgsEnvelopeSegment &seg = channel.ins->env.seg[channel.envSeg]; + // I currently assume enveloping works with the same speed as the MIDI + // (i.e. with 1/60ths of a second ticks). + // TODO: Check if enveloping really works with the same speed as MIDI + frac_t envVolDelta = doubleToFrac(seg.inc/256.0); + if (intToFrac(seg.bp) >= channel.envVol) { + channel.envVol += envVolDelta; + if (channel.envVol >= intToFrac(seg.bp)) { + channel.envVol = intToFrac(seg.bp); + channel.envSeg += 1; + } + } else { + channel.envVol -= envVolDelta; + if (channel.envVol <= intToFrac(seg.bp)) { + channel.envVol = intToFrac(seg.bp); + channel.envSeg += 1; + } + } + } + } + } + } + + removeStoppedSounds(); + + return IIGS_BUFFER_SIZE; +} + +/** + * Convert sample from 8-bit unsigned to 8-bit signed format. + * @param source Source stream containing the 8-bit unsigned sample data. + * @param dest Destination buffer for the 8-bit signed sample data. + * @param length Length of the sample data to be converted. + */ +static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint length) { + // Convert the wave from 8-bit unsigned to 8-bit signed format + for (uint i = 0; i < length; i++) + dest[i] = (int8) ((int) source.readByte() - 128); + return !(source.eos() || source.err()); +} + +void SoundGen2GS::fillAudio(int16 *stream, uint len) { + uint32 p = 0; + + // current number of audio bytes in _sndBuffer + static uint32 data_available = 0; + // offset of start of audio bytes in _sndBuffer + static uint32 data_offset = 0; + + len <<= 2; + + debugC(5, kDebugLevelSound, "(%p, %d)", (void *)stream, len); + + while (len > data_available) { + memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, data_available); + p += data_available; + len -= data_available; + + playSound(); + data_available = mixSound() << 1; + data_offset = 0; + } + + memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, len); + data_offset += len; + data_available -= len; +} + IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { _data = data; // Save the resource pointer _ptr = _data + 2; // Set current position to just after the header @@ -77,7 +264,7 @@ IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : _sample = new int8[_header.sampleSize]; if (_sample != NULL) - _isValid = SoundMgr::convertWave(stream, _sample, _header.sampleSize); + _isValid = convertWave(stream, _sample, _header.sampleSize); } if (!_isValid) // Check for errors @@ -248,23 +435,23 @@ static const IIgsExeInfo IIgsExeInfos[] = { {GID_GOLDRUSH, "GR", 0x3003, 148268, 0x8979, instSetV2} }; -void IIgsSoundMgr::stopSounds() { - // Stops all sounds on all MIDI channels - for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) - iter->stopSounds(); -} - -void SoundMgr::playSampleSound() { +void SoundGen2GS::playSampleSound() { if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { warning("Trying to play a sample but not using Apple IIGS sound emulation mode"); return; } if (_playingSound != -1) - _playing = _gsSound->activeSounds() > 0; + _playing = activeSounds() > 0; } -bool IIgsSoundMgr::playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample) { +void SoundGen2GS::stopSounds() { + // Stops all sounds on all MIDI channels + for (iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) + iter->stopSounds(); +} + +bool SoundGen2GS::playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample) { stopSounds(); IIgsMidiChannel &channel = _midiChannels[kSfxMidiChannel]; @@ -283,7 +470,7 @@ void IIgsMidiChannel::stopSounds() { _gsChannels.clear(); } -void SoundMgr::playMidiSound() { +void SoundGen2GS::playMidiSound() { if (_disabledMidi) return; @@ -352,28 +539,28 @@ void SoundMgr::playMidiSound() { case MIDI_CMD_NOTE_OFF: parm1 = *p++; parm2 = *p++; - _gsSound->midiNoteOff(ch, parm1, parm2); + midiNoteOff(ch, parm1, parm2); break; case MIDI_CMD_NOTE_ON: parm1 = *p++; parm2 = *p++; - _gsSound->midiNoteOn(ch, parm1, parm2); + midiNoteOn(ch, parm1, parm2); break; case MIDI_CMD_CONTROLLER: parm1 = *p++; parm2 = *p++; - _gsSound->midiController(ch, parm1, parm2); + midiController(ch, parm1, parm2); break; case MIDI_CMD_PROGRAM_CHANGE: parm1 = *p++; - _gsSound->midiProgramChange(ch, parm1); + midiProgramChange(ch, parm1); break; case MIDI_CMD_PITCH_WHEEL: parm1 = *p++; parm2 = *p++; uint16 wheelPos = ((parm2 & 0x7F) << 7) | (parm1 & 0x7F); // 14-bit value - _gsSound->midiPitchWheel(wheelPos); + midiPitchWheel(wheelPos); break; } } @@ -381,19 +568,19 @@ void SoundMgr::playMidiSound() { midiObj->setPtr(p); } -void IIgsSoundMgr::midiNoteOff(uint8 channel, uint8 note, uint8 velocity) { +void SoundGen2GS::midiNoteOff(uint8 channel, uint8 note, uint8 velocity) { _midiChannels[channel].noteOff(note, velocity); debugC(3, kDebugLevelSound, "note off, channel %02x, note %02x, velocity %02x", channel, note, velocity); } -void IIgsSoundMgr::midiNoteOn(uint8 channel, uint8 note, uint8 velocity) { +void SoundGen2GS::midiNoteOn(uint8 channel, uint8 note, uint8 velocity) { _midiChannels[channel].noteOn(note, velocity); debugC(3, kDebugLevelSound, "note on, channel %02x, note %02x, velocity %02x", channel, note, velocity); } // TODO: Check if controllers behave differently on different MIDI channels // TODO: Doublecheck what other controllers than the volume controller do -void IIgsSoundMgr::midiController(uint8 channel, uint8 controller, uint8 value) { +void SoundGen2GS::midiController(uint8 channel, uint8 controller, uint8 value) { IIgsMidiChannel &midiChannel = _midiChannels[channel]; // The tested Apple IIGS AGI MIDI resources only used @@ -413,31 +600,27 @@ void IIgsSoundMgr::midiController(uint8 channel, uint8 controller, uint8 value) debugC(3, kDebugLevelSound, "controller %02x, ch %02x, val %02x%s", controller, channel, value, unimplemented ? " (Unimplemented)" : ""); } -void IIgsSoundMgr::midiProgramChange(uint8 channel, uint8 program) { +void SoundGen2GS::midiProgramChange(uint8 channel, uint8 program) { _midiChannels[channel].setInstrument(getInstrument(program), _wave.begin()); debugC(3, kDebugLevelSound, "program change %02x, channel %02x", program, channel); } -void IIgsSoundMgr::midiPitchWheel(uint8 wheelPos) { +void SoundGen2GS::midiPitchWheel(uint8 wheelPos) { // In all the tested Apple IIGS AGI MIDI resources // pitch wheel commands always used 0x2000 (Center position). // Therefore it should be quite safe to ignore this command. debugC(3, kDebugLevelSound, "pitch wheel position %04x (Unimplemented)", wheelPos); } -IIgsSoundMgr::IIgsSoundMgr() { - _midiChannels.resize(16); // Set the amount of available MIDI channels -} - -const IIgsInstrumentHeader* IIgsSoundMgr::getInstrument(uint8 program) const { +const IIgsInstrumentHeader* SoundGen2GS::getInstrument(uint8 program) const { return &_instruments[_midiProgToInst->map(program)]; } -void IIgsSoundMgr::setProgramChangeMapping(const MidiProgramChangeMapping *mapping) { +void SoundGen2GS::setProgramChangeMapping(const MidiProgramChangeMapping *mapping) { _midiProgToInst = mapping; } -void IIgsSoundMgr::removeStoppedSounds() { +void SoundGen2GS::removeStoppedSounds() { for (Common::Array::iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) iter->removeStoppedSounds(); } @@ -448,7 +631,7 @@ void IIgsMidiChannel::removeStoppedSounds() { _gsChannels.remove_at(i); } -uint IIgsSoundMgr::activeSounds() const { +uint SoundGen2GS::activeSounds() const { uint result = 0; for (Common::Array::const_iterator iter = _midiChannels.begin(); iter != _midiChannels.end(); ++iter) @@ -561,14 +744,14 @@ bool IIgsChannelInfo::playing() { * Finds information about an Apple IIGS AGI executable based on the game ID. * @return A non-null IIgsExeInfo pointer if successful, otherwise NULL. */ -const IIgsExeInfo *SoundMgr::getIIgsExeInfo(enum AgiGameID gameid) const { +const IIgsExeInfo *SoundGen2GS::getIIgsExeInfo(enum AgiGameID gameid) const { for (int i = 0; i < ARRAYSIZE(IIgsExeInfos); i++) if (IIgsExeInfos[i].gameid == gameid) return &IIgsExeInfos[i]; return NULL; } -bool IIgsSoundMgr::loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo) { +bool SoundGen2GS::loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo) { bool loadedOk = false; // Was loading successful? Common::File file; @@ -628,7 +811,7 @@ bool IIgsSoundMgr::loadInstrumentHeaders(const Common::FSNode &exePath, const II return loadedOk; } -bool IIgsSoundMgr::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo) { +bool SoundGen2GS::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo) { Common::File file; // Open the wave file and read it into memory @@ -650,7 +833,7 @@ bool IIgsSoundMgr::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInf uint8Wave->seek(0); // Seek wave to its start // Convert the wave file from 8-bit unsigned to 8-bit signed and save the result _wave.resize(uint8Wave->size()); - return SoundMgr::convertWave(*uint8Wave, _wave.begin(), uint8Wave->size()); + return convertWave(*uint8Wave, _wave.begin(), uint8Wave->size()); } else { // Couldn't read the wave file or it had incorrect size warning("Error loading Apple IIGS wave file (%s), not loading instruments", wavePath.getPath().c_str()); return false; @@ -676,7 +859,7 @@ private: Common::StringArray _str; }; -bool SoundMgr::loadInstruments() { +bool SoundGen2GS::loadInstruments() { // Check that the platform is Apple IIGS, as only it uses custom instruments if (_vm->getPlatform() != Common::kPlatformApple2GS) { debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); @@ -729,8 +912,8 @@ bool SoundMgr::loadInstruments() { // load the instrument headers and their sample data. // None of the tested SIERRASTANDARD-files have zeroes in them so // there's no need to check for prematurely ending samples here. - _gsSound->setProgramChangeMapping(&exeInfo->instSet.progToInst); - return _gsSound->loadWaveFile(*waveFsnode, *exeInfo) && _gsSound->loadInstrumentHeaders(*exeFsnode, *exeInfo); + setProgramChangeMapping(&exeInfo->instSet.progToInst); + return loadWaveFile(*waveFsnode, *exeInfo) && loadInstrumentHeaders(*exeFsnode, *exeInfo); } } // End of namespace Agi diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 3669d29955..12dede0b69 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -27,9 +27,12 @@ #define AGI_SOUND_2GS_H #include "common/frac.h" +#include "sound/audiostream.h" namespace Agi { +#define BUFFER_SIZE 410 + // Apple IIGS MIDI uses 60 ticks per second (Based on tests with Apple IIGS // KQ1 and SQ1 under MESS 0.124a). So we make the audio buffer size to be a // 1/60th of a second in length. That should be getSampleRate() / 60 samples @@ -268,39 +271,78 @@ protected: uint8 _volume; ///< MIDI controller number 7 (Volume) }; +class SoundGen2GS : public SoundGen, public Audio::AudioStream { +public: + SoundGen2GS(AgiEngine *vm, Audio::Mixer *pMixer); + ~SoundGen2GS(); + + void play(int resnum); + void stop(void); + + // AudioStream API + int readBuffer(int16 *buffer, const int numSamples); + + bool isStereo() const { + return false; + } + + bool endOfData() const { + return false; + } + + int getRate() const { + // FIXME: Ideally, we should use _sampleRate. + return 22050; + } + +private: + bool _disabledMidi; + int _playingSound; + bool _playing; + + int16 *_sndBuffer; + /** * Class for managing Apple IIGS sound channels. * TODO: Check what instruments are used by default on the MIDI channels * FIXME: Some instrument choices sound wrong */ -class IIgsSoundMgr { -public: +private: typedef Common::Array::const_iterator const_iterator; typedef Common::Array::iterator iterator; static const uint kSfxMidiChannel = 0; ///< The MIDI channel used for playing sound effects -public: - // For initializing - IIgsSoundMgr(); + + bool loadInstruments(); + const IIgsExeInfo *getIIgsExeInfo(enum AgiGameID gameid) const; + void setProgramChangeMapping(const MidiProgramChangeMapping *mapping); bool loadInstrumentHeaders(const Common::FSNode &exePath, const IIgsExeInfo &exeInfo); bool loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo &exeInfo); + // Miscellaneous methods + void fillAudio(int16 *stream, uint len); + uint32 mixSound(); + void playSound(); uint activeSounds() const; ///< How many active sounds are playing? void stopSounds(); ///< Stops all sounds void removeStoppedSounds(); ///< Removes all stopped sounds from the MIDI channels + // For playing Apple IIGS AGI samples (Sound effects etc) bool playSampleSound(const IIgsSampleHeader &sampleHeader, const int8 *sample); + void playMidiSound(); + void playSampleSound(); + // MIDI commands void midiNoteOff(uint8 channel, uint8 note, uint8 velocity); void midiNoteOn(uint8 channel, uint8 note, uint8 velocity); void midiController(uint8 channel, uint8 controller, uint8 value); void midiProgramChange(uint8 channel, uint8 program); void midiPitchWheel(uint8 wheelPos); -protected: + //protected: const IIgsInstrumentHeader* getInstrument(uint8 program) const; -public: + //public: Common::Array _midiChannels; ///< Information about each MIDI channel -protected: + //protected: Common::Array _wave; ///< Sample data used by the Apple IIGS MIDI instruments const MidiProgramChangeMapping *_midiProgToInst; ///< MIDI program change to instrument number mapping Common::Array _instruments; ///< Instruments used by the Apple IIGS AGI diff --git a/engines/agi/sound_coco3.cpp b/engines/agi/sound_coco3.cpp new file mode 100644 index 0000000000..f054be0682 --- /dev/null +++ b/engines/agi/sound_coco3.cpp @@ -0,0 +1,80 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "agi/agi.h" + +#include "agi/sound_coco3.h" + +namespace Agi { + +static int cocoFrequencies[] = { + 130, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, + 261, 277, 293, 311, 329, 349, 369, 391, 415, 440, 466, 493, + 523, 554, 587, 622, 659, 698, 739, 783, 830, 880, 932, 987, + 1046, 1108, 1174, 1244, 1318, 1396, 1479, 1567, 1661, 1760, 1864, 1975, + 2093, 2217, 2349, 2489, 2637, 2793, 2959, 3135, 3322, 3520, 3729, 3951 +}; + +SoundGenCoCo3::SoundGenCoCo3(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) { +} + +SoundGenCoCo3::~SoundGenCoCo3() { +} + +void SoundGenCoCo3::play(int resnum) { + int i = cocoFrequencies[0]; // Silence warning + + i = i + 1; + +#if 0 + int i = 0; + CoCoNote note; + + do { + note.read(_chn[i].ptr); + + if (note.freq != 0xff) { + playNote(0, cocoFrequencies[note.freq], note.volume); + + uint32 start_time = _vm->_system->getMillis(); + + while (_vm->_system->getMillis() < start_time + note.duration) { + _vm->_system->updateScreen(); + + _vm->_system->delayMillis(10); + } + } + } while (note.freq != 0xff); +#endif +} + +void SoundGenCoCo3::stop() { +} + +int SoundGenCoCo3::readBuffer(int16 *buffer, const int numSamples) { + return numSamples; +} + +} // End of namespace Agi diff --git a/engines/agi/sound_coco3.h b/engines/agi/sound_coco3.h new file mode 100755 index 0000000000..b60f1937cd --- /dev/null +++ b/engines/agi/sound_coco3.h @@ -0,0 +1,73 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef AGI_SOUND_COCO3_H +#define AGI_SOUND_COCO3_H + +#include "sound/audiostream.h" + +namespace Agi { + +struct CoCoNote { + uint8 freq; + uint8 volume; + uint16 duration; ///< Note duration + + /** Reads a CoCoNote through the given pointer. */ + void read(const uint8 *ptr) { + freq = *ptr; + volume = *(ptr + 1); + duration = READ_LE_UINT16(ptr + 2); + } +}; + +class SoundGenCoCo3 : public SoundGen, public Audio::AudioStream { +public: + SoundGenCoCo3(AgiEngine *vm, Audio::Mixer *pMixer); + ~SoundGenCoCo3(); + + void play(int resnum); + void stop(void); + + // AudioStream API + int readBuffer(int16 *buffer, const int numSamples); + + bool isStereo() const { + return false; + } + + bool endOfData() const { + return false; + } + + int getRate() const { + // FIXME: Ideally, we should use _sampleRate. + return 22050; + } +}; + +} // End of namespace Agi + +#endif /* AGI_SOUND_COCO3_H */ diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp index b31a4228fb..551df527cc 100755 --- a/engines/agi/sound_midi.cpp +++ b/engines/agi/sound_midi.cpp @@ -70,7 +70,10 @@ MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : A warning("Error creating MIDI sound from resource %d (Type %d, length %d)", resnum, _type, len); } -MusicPlayer::MusicPlayer(MidiDriver *driver, SoundMgr *manager) : _parser(0), _driver(driver), _isPlaying(false), _passThrough(false), _isGM(false), _manager(manager) { +SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _parser(0), _isPlaying(false), _passThrough(false), _isGM(false) { + MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB); + _driver = MidiDriver::createMidi(midiDriver); + memset(_channel, 0, sizeof(_channel)); memset(_channelVolume, 255, sizeof(_channelVolume)); _masterVolume = 0; @@ -79,7 +82,7 @@ MusicPlayer::MusicPlayer(MidiDriver *driver, SoundMgr *manager) : _parser(0), _d _midiMusicData = NULL; } -MusicPlayer::~MusicPlayer() { +SoundGenMIDI::~SoundGenMIDI() { _driver->setTimerCallback(NULL, NULL); stop(); this->close(); @@ -88,12 +91,12 @@ MusicPlayer::~MusicPlayer() { delete[] _midiMusicData; } -void MusicPlayer::setChannelVolume(int channel) { +void SoundGenMIDI::setChannelVolume(int channel) { int newVolume = _channelVolume[channel] * _masterVolume / 255; _channel[channel]->volume(newVolume); } -void MusicPlayer::setVolume(int volume) { +void SoundGenMIDI::setVolume(int volume) { Common::StackLock lock(_mutex); volume = CLIP(volume, 0, 255); @@ -108,7 +111,7 @@ void MusicPlayer::setVolume(int volume) { } } -int MusicPlayer::open() { +int SoundGenMIDI::open() { // Don't ever call open without first setting the output driver! if (!_driver) return 255; @@ -121,14 +124,14 @@ int MusicPlayer::open() { return 0; } -void MusicPlayer::close() { +void SoundGenMIDI::close() { stop(); if (_driver) _driver->close(); _driver = 0; } -void MusicPlayer::send(uint32 b) { +void SoundGenMIDI::send(uint32 b) { if (_passThrough) { _driver->send(b); return; @@ -163,11 +166,12 @@ void MusicPlayer::send(uint32 b) { _channel[channel]->send(b); } -void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { +void SoundGenMIDI::metaEvent(byte type, byte *data, uint16 length) { switch (type) { case 0x2F: // End of Track stop(); + _vm->_sound->soundIsFinished(); break; default: //warning("Unhandled meta event: %02x", type); @@ -175,19 +179,23 @@ void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { } } -void MusicPlayer::onTimer(void *refCon) { - MusicPlayer *music = (MusicPlayer *)refCon; +void SoundGenMIDI::onTimer(void *refCon) { + SoundGenMIDI *music = (SoundGenMIDI *)refCon; Common::StackLock lock(music->_mutex); if (music->_parser) music->_parser->onTimer(); } -void MusicPlayer::playMIDI(MIDISound *track) { +void SoundGenMIDI::play(int resnum) { + MIDISound *track; + stop(); _isGM = true; + track = (MIDISound *)_vm->_game.sounds[resnum]; + // Convert AGI Sound data to MIDI int midiMusicSize = convertSND2MIDI(track->_data, &_midiMusicData); @@ -206,7 +214,7 @@ void MusicPlayer::playMIDI(MIDISound *track) { } } -void MusicPlayer::stop() { +void SoundGenMIDI::stop() { Common::StackLock lock(_mutex); if (!_isPlaying) @@ -217,22 +225,19 @@ void MusicPlayer::stop() { _parser->unloadMusic(); _parser = NULL; } - - if (_manager->_endflag != -1) - _manager->_vm->setflag(_manager->_endflag, true); } -void MusicPlayer::pause() { +void SoundGenMIDI::pause() { setVolume(-1); _isPlaying = false; } -void MusicPlayer::resume() { +void SoundGenMIDI::resume() { syncVolume(); _isPlaying = true; } -void MusicPlayer::syncVolume() { +void SoundGenMIDI::syncVolume() { int volume = ConfMan.getInt("music_volume"); if (ConfMan.getBool("mute")) { volume = -1; diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h index 48216ceb12..26b75e0d70 100755 --- a/engines/agi/sound_midi.h +++ b/engines/agi/sound_midi.h @@ -46,10 +46,13 @@ protected: uint16 _type; ///< Sound resource type }; -class MusicPlayer : public MidiDriver { +class SoundGenMIDI : public SoundGen, public MidiDriver { public: - MusicPlayer(MidiDriver *driver, SoundMgr *manager); - ~MusicPlayer(); + SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer); + ~SoundGenMIDI(); + + void play(int resnum); + void stop(); bool isPlaying() { return _isPlaying; } void setPlaying(bool playing) { _isPlaying = playing; } @@ -60,8 +63,6 @@ public: void setNativeMT32(bool b) { _nativeMT32 = b; } bool hasNativeMT32() { return _nativeMT32; } - void playMIDI(MIDISound *track); - void stop(); void pause(); void resume(); void setLoop(bool loop) { _looping = loop; } @@ -86,7 +87,7 @@ public: MidiParser *_parser; Common::Mutex _mutex; -protected: +private: static void onTimer(void *data); void setChannelVolume(int channel); diff --git a/engines/agi/sound_pcjr.cpp b/engines/agi/sound_pcjr.cpp index f00c4424bc..b9d701d7f7 100755 --- a/engines/agi/sound_pcjr.cpp +++ b/engines/agi/sound_pcjr.cpp @@ -105,7 +105,7 @@ const int8 dissolveDataV3[] = { }; -SoundGenPCJr::SoundGenPCJr(AgiEngine *vm) : _vm(vm) { +SoundGenPCJr::SoundGenPCJr(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer) { _chanAllocated = 10240; // preallocate something which will most likely fit _chanData = (int16 *)malloc(_chanAllocated << 1); @@ -122,13 +122,19 @@ SoundGenPCJr::SoundGenPCJr(AgiEngine *vm) : _vm(vm) { _dissolveMethod = 2; else _dissolveMethod = 0; + + _dissolveMethod = 3; + + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); } SoundGenPCJr::~SoundGenPCJr() { free(_chanData); + + _mixer->stopHandle(_soundHandle); } -void SoundGenPCJr::play(int resnum, int flag) { +void SoundGenPCJr::play(int resnum) { PCjrSound *pcjrSound = (PCjrSound *)_vm->_game.sounds[resnum]; for (int i = 0; i < CHAN_MAX; i++) { @@ -467,7 +473,7 @@ int SoundGenPCJr::fillNoise(ToneChan *t, int16 *buf, int len) { return len; } -void SoundGenPCJr::premixerCall(int16 *stream, int len) { +int SoundGenPCJr::readBuffer(int16 *stream, const int len) { int streamCount; int16 *sPtr, *cPtr; @@ -480,6 +486,8 @@ void SoundGenPCJr::premixerCall(int16 *stream, int len) { assert(stream); + bool finished = true; + for (int i = 0; i < CHAN_MAX; i++) { // get channel data(chan.userdata) if (chanGen(i, _chanData, len) == 0) { @@ -487,11 +495,18 @@ void SoundGenPCJr::premixerCall(int16 *stream, int len) { streamCount = len; sPtr = stream; cPtr = _chanData; - + while (streamCount--) *(sPtr++) += *(cPtr++) / CHAN_MAX; + + finished = false; } } + + if (finished) + _vm->_sound->soundIsFinished(); + + return len; } } // End of namespace Agi diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h index 9ef9aa2385..fe0e762f4e 100755 --- a/engines/agi/sound_pcjr.h +++ b/engines/agi/sound_pcjr.h @@ -26,6 +26,8 @@ #ifndef AGI_SOUND_PCJR_H #define AGI_SOUND_PCJR_H +#include "sound/audiostream.h" + namespace Agi { #define CHAN_MAX 4 @@ -78,15 +80,29 @@ struct Tone { GenType type; }; -class SoundGenPCJr : public SoundGen { +class SoundGenPCJr : public SoundGen, public Audio::AudioStream { public: - SoundGenPCJr(AgiEngine *vm); + SoundGenPCJr(AgiEngine *vm, Audio::Mixer *pMixer); ~SoundGenPCJr(); - void play(int resnum, int flag); + void play(int resnum); void stop(void); - void premixerCall(int16 *stream, int len); + // AudioStream API + int readBuffer(int16 *buffer, const int numSamples); + + bool isStereo() const { + return false; + } + + bool endOfData() const { + return false; + } + + int getRate() const { + // FIXME: Ideally, we should use _sampleRate. + return 22050; + } private: int getNextNote(int ch, Tone *tone); @@ -98,7 +114,6 @@ private: int fillSquare(ToneChan *t, int16 *buf, int len); private: - AgiEngine *_vm; SndGenChan _channel[CHAN_MAX]; ToneChan _tchannel[CHAN_MAX]; int16 *_chanData; diff --git a/engines/agi/sound_sarien.cpp b/engines/agi/sound_sarien.cpp new file mode 100644 index 0000000000..08bdd47497 --- /dev/null +++ b/engines/agi/sound_sarien.cpp @@ -0,0 +1,357 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/md5.h" +#include "common/config-manager.h" +#include "common/fs.h" +#include "common/random.h" +#include "common/str-array.h" + +#include "sound/mididrv.h" + +#include "agi/agi.h" + +#include "agi/sound_sarien.h" + +namespace Agi { + +#define USE_INTERPOLATION + +static const int16 waveformRamp[WAVEFORM_SIZE] = { + 0, 8, 16, 24, 32, 40, 48, 56, + 64, 72, 80, 88, 96, 104, 112, 120, + 128, 136, 144, 152, 160, 168, 176, 184, + 192, 200, 208, 216, 224, 232, 240, 255, + 0, -248, -240, -232, -224, -216, -208, -200, + -192, -184, -176, -168, -160, -152, -144, -136, + -128, -120, -112, -104, -96, -88, -80, -72, + -64, -56, -48, -40, -32, -24, -16, -8 // Ramp up +}; + +static const int16 waveformSquare[WAVEFORM_SIZE] = { + 255, 230, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 220, 220, 220, 110, + -255, -230, -220, -220, -220, -220, -220, -220, + -220, -220, -220, -220, -220, -220, -220, -220, + -220, -220, -220, -220, -220, -220, -220, -220, + -220, -220, -220, -110, 0, 0, 0, 0 // Square +}; + +static const int16 waveformMac[WAVEFORM_SIZE] = { + 45, 110, 135, 161, 167, 173, 175, 176, + 156, 137, 123, 110, 91, 72, 35, -2, + -60, -118, -142, -165, -170, -176, -177, -179, + -177, -176, -164, -152, -117, -82, -17, 47, + 92, 137, 151, 166, 170, 173, 171, 169, + 151, 133, 116, 100, 72, 43, -7, -57, + -99, -141, -156, -170, -174, -177, -178, -179, + -175, -172, -165, -159, -137, -114, -67, -19 +}; + +SoundGenSarien::SoundGenSarien(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _chn() { + _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE); + + memset(_sndBuffer, 0, BUFFER_SIZE << 1); + _env = false; + _playingSound = -1; + _playing = false; + _useChorus = true; // FIXME: Currently always true? + + switch (_vm->_soundemu) { + case SOUND_EMU_NONE: + _waveform = waveformRamp; + _env = true; + break; + case SOUND_EMU_AMIGA: + case SOUND_EMU_PC: + _waveform = waveformSquare; + break; + case SOUND_EMU_MAC: + _waveform = waveformMac; + break; + } + + report("Initializing sound:\n"); + + report("sound: envelopes "); + if (_env) { + report("enabled (decay=%d, sustain=%d)\n", ENV_DECAY, ENV_SUSTAIN); + } else { + report("disabled\n"); + } + + _mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); +} + +SoundGenSarien::~SoundGenSarien() { + _mixer->stopHandle(_soundHandle); + + free(_sndBuffer); +} + +int SoundGenSarien::readBuffer(int16 *buffer, const int numSamples) { + fillAudio(buffer, numSamples / 2); + + return numSamples; +} + +void SoundGenSarien::play(int resnum) { + AgiSoundEmuType type; + + type = (AgiSoundEmuType)_vm->_game.sounds[resnum]->type(); + + assert(type == AGI_SOUND_4CHN); + + _playingSound = resnum; + + PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum]; + + // Initialize channel info + for (int i = 0; i < NUM_CHANNELS; i++) { + _chn[i].type = type; + _chn[i].flags = AGI_SOUND_LOOP; + + if (_env) { + _chn[i].flags |= AGI_SOUND_ENVELOPE; + _chn[i].adsr = AGI_SOUND_ENV_ATTACK; + } + + _chn[i].ins = _waveform; + _chn[i].size = WAVEFORM_SIZE; + _chn[i].ptr = pcjrSound->getVoicePointer(i % 4); + _chn[i].timer = 0; + _chn[i].vol = 0; + _chn[i].end = 0; + } + + memset(_sndBuffer, 0, BUFFER_SIZE << 1); +} + +void SoundGenSarien::stop() { + _playingSound = -1; + + for (int i = 0; i < NUM_CHANNELS; i++) + stopNote(i); +} + +void SoundGenSarien::stopNote(int i) { + _chn[i].adsr = AGI_SOUND_ENV_RELEASE; + + if (_useChorus) { + // Stop chorus ;) + if (_chn[i].type == AGI_SOUND_4CHN && + _vm->_soundemu == SOUND_EMU_NONE && i < 3) { + stopNote(i + 4); + } + } +} + +void SoundGenSarien::playNote(int i, int freq, int vol) { + if (!_vm->getflag(fSoundOn)) + vol = 0; + else if (vol && _vm->_soundemu == SOUND_EMU_PC) + vol = 160; + + _chn[i].phase = 0; + _chn[i].freq = freq; + _chn[i].vol = vol; + _chn[i].env = 0x10000; + _chn[i].adsr = AGI_SOUND_ENV_ATTACK; + + if (_useChorus) { + // Add chorus ;) + if (_chn[i].type == AGI_SOUND_4CHN && + _vm->_soundemu == SOUND_EMU_NONE && i < 3) { + + int newfreq = freq * 1007 / 1000; + + if (freq == newfreq) + newfreq++; + + playNote(i + 4, newfreq, vol * 2 / 3); + } + } +} + +void SoundGenSarien::playSound() { + int i; + AgiNote note; + + if (_playingSound == -1) + return; + + _playing = false; + for (i = 0; i < (_vm->_soundemu == SOUND_EMU_PC ? 1 : 4); i++) { + _playing |= !_chn[i].end; + note.read(_chn[i].ptr); // Read a single note (Doesn't advance the pointer) + + if (_chn[i].end) + continue; + + if ((--_chn[i].timer) <= 0) { + stopNote(i); + + if (note.freqDiv != 0) { + int volume = (note.attenuation == 0x0F) ? 0 : (0xFF - note.attenuation * 2); + playNote(i, note.freqDiv * 10, volume); + } + + _chn[i].timer = note.duration; + + if (_chn[i].timer == 0xffff) { + _chn[i].end = 1; + _chn[i].vol = 0; + _chn[i].env = 0; + + if (_useChorus) { + // chorus + if (_chn[i].type == AGI_SOUND_4CHN && _vm->_soundemu == SOUND_EMU_NONE && i < 3) { + _chn[i + 4].vol = 0; + _chn[i + 4].env = 0; + } + } + } + _chn[i].ptr += 5; // Advance the pointer to the next note data (5 bytes per note) + } + } + + if (!_playing) { + _vm->_sound->soundIsFinished(); + + _playingSound = -1; + } +} + +uint32 SoundGenSarien::mixSound() { + register int i, p; + const int16 *src; + int c, b, m; + + memset(_sndBuffer, 0, BUFFER_SIZE << 1); + + if (!_playing || _playingSound == -1) + return BUFFER_SIZE; + + // Handle PCjr 4-channel sound mixing here + for (c = 0; c < NUM_CHANNELS; c++) { + if (!_chn[c].vol) + continue; + + m = _chn[c].flags & AGI_SOUND_ENVELOPE ? + _chn[c].vol * _chn[c].env >> 16 : _chn[c].vol; + + if (_chn[c].type != AGI_SOUND_4CHN || c != 3) { + src = _chn[c].ins; + + p = _chn[c].phase; + for (i = 0; i < BUFFER_SIZE; i++) { + b = src[p >> 8]; +#ifdef USE_INTERPOLATION + b += ((src[((p >> 8) + 1) % _chn[c].size] - src[p >> 8]) * (p & 0xff)) >> 8; +#endif + _sndBuffer[i] += (b * m) >> 4; + + p += (uint32) 118600 *4 / _chn[c].freq; + + // FIXME: Fingolfin asks: why is there a FIXME here? Please either clarify what + // needs fixing, or remove it! + // FIXME + if (_chn[c].flags & AGI_SOUND_LOOP) { + p %= _chn[c].size << 8; + } else { + if (p >= _chn[c].size << 8) { + p = _chn[c].vol = 0; + _chn[c].end = 1; + break; + } + } + + } + _chn[c].phase = p; + } else { + // Add white noise + for (i = 0; i < BUFFER_SIZE; i++) { + b = _vm->_rnd->getRandomNumber(255) - 128; + _sndBuffer[i] += (b * m) >> 4; + } + } + + switch (_chn[c].adsr) { + case AGI_SOUND_ENV_ATTACK: + // not implemented + _chn[c].adsr = AGI_SOUND_ENV_DECAY; + break; + case AGI_SOUND_ENV_DECAY: + if (_chn[c].env > _chn[c].vol * ENV_SUSTAIN + ENV_DECAY) { + _chn[c].env -= ENV_DECAY; + } else { + _chn[c].env = _chn[c].vol * ENV_SUSTAIN; + _chn[c].adsr = AGI_SOUND_ENV_SUSTAIN; + } + break; + case AGI_SOUND_ENV_SUSTAIN: + break; + case AGI_SOUND_ENV_RELEASE: + if (_chn[c].env >= ENV_RELEASE) { + _chn[c].env -= ENV_RELEASE; + } else { + _chn[c].env = 0; + } + } + } + + return BUFFER_SIZE; +} + +void SoundGenSarien::fillAudio(int16 *stream, uint len) { + uint32 p = 0; + + // current number of audio bytes in _sndBuffer + static uint32 data_available = 0; + // offset of start of audio bytes in _sndBuffer + static uint32 data_offset = 0; + + len <<= 2; + + debugC(5, kDebugLevelSound, "(%p, %d)", (void *)stream, len); + + while (len > data_available) { + memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, data_available); + p += data_available; + len -= data_available; + + playSound(); + data_available = mixSound() << 1; + data_offset = 0; + } + + memcpy((uint8 *)stream + p, (uint8*)_sndBuffer + data_offset, len); + data_offset += len; + data_available -= len; +} + +} // End of namespace Agi diff --git a/engines/agi/sound_sarien.h b/engines/agi/sound_sarien.h new file mode 100755 index 0000000000..54222ba624 --- /dev/null +++ b/engines/agi/sound_sarien.h @@ -0,0 +1,120 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef AGI_SOUND_SARIEN_H +#define AGI_SOUND_SARIEN_H + +#include "sound/audiostream.h" + +namespace Agi { + +#define BUFFER_SIZE 410 + +#define WAVEFORM_SIZE 64 +#define ENV_ATTACK 10000 /**< envelope attack rate */ +#define ENV_DECAY 1000 /**< envelope decay rate */ +#define ENV_SUSTAIN 100 /**< envelope sustain level */ +#define ENV_RELEASE 7500 /**< envelope release rate */ +#define NUM_CHANNELS 7 /**< number of sound channels */ + +enum AgiSoundFlags { + AGI_SOUND_LOOP = 0x0001, + AGI_SOUND_ENVELOPE = 0x0002 +}; +enum AgiSoundEnv { + AGI_SOUND_ENV_ATTACK = 3, + AGI_SOUND_ENV_DECAY = 2, + AGI_SOUND_ENV_SUSTAIN = 1, + AGI_SOUND_ENV_RELEASE = 0 +}; + + +/** + * AGI engine sound channel structure. + */ +struct ChannelInfo { + AgiSoundEmuType type; + const uint8 *ptr; // Pointer to the AgiNote data + const int16 *ins; + int32 size; + uint32 phase; + uint32 flags; // ORs values from AgiSoundFlags + AgiSoundEnv adsr; + int32 timer; + uint32 end; + uint32 freq; + uint32 vol; + uint32 env; +}; + +class SoundGenSarien : public SoundGen, public Audio::AudioStream { +public: + SoundGenSarien(AgiEngine *vm, Audio::Mixer *pMixer); + ~SoundGenSarien(); + + void play(int resnum); + void stop(void); + + // AudioStream API + int readBuffer(int16 *buffer, const int numSamples); + + bool isStereo() const { + return false; + } + + bool endOfData() const { + return false; + } + + int getRate() const { + // FIXME: Ideally, we should use _sampleRate. + return 22050; + } + +private: + ChannelInfo _chn[NUM_CHANNELS]; + uint8 _env; + + int16 *_sndBuffer; + const int16 *_waveform; + + bool _useChorus; + + bool _playing; + int _playingSound; + +private: + void playSound(); + uint32 mixSound(); + void fillAudio(int16 *stream, uint len); + + void stopNote(int i); + void playNote(int i, int freq, int vol); + +}; + +} // End of namespace Agi + +#endif /* AGI_SOUND_SARIEN_H */ -- cgit v1.2.3 From db6673c408865b201808e01ab5db796f2e794058 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:38:39 +0000 Subject: AGI: rearranged class methods a bit and cleanup. svn-id: r49758 --- engines/agi/sound.cpp | 12 - engines/agi/sound_2gs.cpp | 644 +++++++++++++++++++++++----------------------- 2 files changed, 322 insertions(+), 334 deletions(-) diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index 2ca2706259..9dda3e91f5 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -31,18 +31,6 @@ #include "agi/sound_sarien.h" #include "agi/sound_pcjr.h" -#if 0 -#include "common/md5.h" -#include "common/config-manager.h" -#include "common/fs.h" -#include "common/random.h" -#include "common/str-array.h" - -#include "sound/mididrv.h" - - -#endif - namespace Agi { // diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 056eac2d5c..cc1cd0f6d5 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -181,19 +181,6 @@ uint32 SoundGen2GS::mixSound() { return IIGS_BUFFER_SIZE; } -/** - * Convert sample from 8-bit unsigned to 8-bit signed format. - * @param source Source stream containing the 8-bit unsigned sample data. - * @param dest Destination buffer for the 8-bit signed sample data. - * @param length Length of the sample data to be converted. - */ -static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint length) { - // Convert the wave from 8-bit unsigned to 8-bit signed format - for (uint i = 0; i < length; i++) - dest[i] = (int8) ((int) source.readByte() - 128); - return !(source.eos() || source.err()); -} - void SoundGen2GS::fillAudio(int16 *stream, uint len) { uint32 p = 0; @@ -221,220 +208,6 @@ void SoundGen2GS::fillAudio(int16 *stream, uint len) { data_available -= len; } -IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { - _data = data; // Save the resource pointer - _ptr = _data + 2; // Set current position to just after the header - _len = len; // Save the resource's length - _type = READ_LE_UINT16(data); // Read sound resource's type - _midiTicks = _soundBufTicks = 0; - _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); - - if (!_isValid) // Check for errors - warning("Error creating Apple IIGS midi sound from resource %d (Type %d, length %d)", resnum, _type, len); -} - -IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { - Common::MemoryReadStream stream(data, len, DisposeAfterUse::YES); - - // Check that the header was read ok and that it's of the correct type - if (_header.read(stream) && _header.type == AGI_SOUND_SAMPLE) { // An Apple IIGS AGI sample resource - uint32 sampleStartPos = stream.pos(); - uint32 tailLen = stream.size() - sampleStartPos; - - if (tailLen < _header.sampleSize) { // Check if there's no room for the sample data in the stream - // Apple IIGS Manhunter I: Sound resource 16 has only 16074 bytes - // of sample data although header says it should have 16384 bytes. - warning("Apple IIGS sample (%d) too short (%d bytes. Should be %d bytes). Using the part that's left", - resnum, tailLen, _header.sampleSize); - - _header.sampleSize = (uint16) tailLen; // Use the part that's left - } - - if (_header.pitch > 0x7F) { // Check if the pitch is invalid - warning("Apple IIGS sample (%d) has too high pitch (0x%02x)", resnum, _header.pitch); - - _header.pitch &= 0x7F; // Apple IIGS AGI probably did it this way too - } - - // Finalize the header info using the 8-bit unsigned sample data - _header.finalize(stream); - - // Convert sample data from 8-bit unsigned to 8-bit signed format - stream.seek(sampleStartPos); - _sample = new int8[_header.sampleSize]; - - if (_sample != NULL) - _isValid = convertWave(stream, _sample, _header.sampleSize); - } - - if (!_isValid) // Check for errors - warning("Error creating Apple IIGS sample from resource %d (Type %d, length %d)", resnum, _header.type, len); -} - -/** Reads an Apple IIGS envelope from then given stream. */ -bool IIgsEnvelope::read(Common::SeekableReadStream &stream) { - for (int segNum = 0; segNum < ENVELOPE_SEGMENT_COUNT; segNum++) { - seg[segNum].bp = stream.readByte(); - seg[segNum].inc = stream.readUint16LE(); - } - - return !(stream.eos() || stream.err()); -} - -/** Reads an Apple IIGS wave information structure from the given stream. */ -bool IIgsWaveInfo::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - top = stream.readByte(); - addr = stream.readByte() * 256; - size = (1 << (stream.readByte() & 7)) * 256; - - // Read packed mode byte and parse it into parts - byte packedModeByte = stream.readByte(); - channel = (packedModeByte >> 4) & 1; // Bit 4 - mode = (packedModeByte >> 1) & 3; // Bits 1-2 - halt = (packedModeByte & 1) != 0; // Bit 0 (Converted to boolean) - - relPitch = stream.readSint16LE(); - - // Zero the wave address if we want to ignore the wave address info - if (ignoreAddr) - addr = 0; - - return !(stream.eos() || stream.err()); -} - -bool IIgsWaveInfo::finalize(Common::SeekableReadStream &uint8Wave) { - uint32 startPos = uint8Wave.pos(); // Save stream's starting position - uint8Wave.seek(addr, SEEK_CUR); // Seek to wave's address - - // Calculate the true sample size (A zero ends the sample prematurely) - uint trueSize = size; // Set a default value for the result - for (uint i = 0; i < size; i++) { - if (uint8Wave.readByte() == 0) { - trueSize = i; - // A zero in the sample stream turns off looping - // (At least that's what MESS 0.117 and KEGS32 0.91 seem to do) - if (mode == OSC_MODE_LOOP) - mode = OSC_MODE_ONESHOT; - break; - } - } - size = trueSize; // Set the true sample size - - uint8Wave.seek(startPos); // Seek back to the stream's starting position - - return true; -} - -bool IIgsOscillator::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < WAVES_PER_OSCILLATOR; i++) - if (!waves[i].finalize(uint8Wave)) - return false; - - return true; -} - -bool IIgsOscillatorList::read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr) { - // First read the A waves and then the B waves for the oscillators - for (uint waveNum = 0; waveNum < WAVES_PER_OSCILLATOR; waveNum++) - for (uint oscNum = 0; oscNum < oscillatorCount; oscNum++) - if (!osc[oscNum].waves[waveNum].read(stream, ignoreAddr)) - return false; - - count = oscillatorCount; // Set the oscillator count - - return true; -} - -bool IIgsOscillatorList::finalize(Common::SeekableReadStream &uint8Wave) { - for (uint i = 0; i < count; i++) - if (!osc[i].finalize(uint8Wave)) - return false; - - return true; -} - -bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { - env.read(stream); - relseg = stream.readByte(); - /*byte priority =*/ stream.readByte(); // Not needed? 32 in all tested data. - bendrange = stream.readByte(); - vibdepth = stream.readByte(); - vibspeed = stream.readByte(); - /*byte spare =*/ stream.readByte(); // Not needed? 0 in all tested data. - byte wac = stream.readByte(); // Read A wave count - byte wbc = stream.readByte(); // Read B wave count - oscList.read(stream, wac, ignoreAddr); // Read the oscillators - return (wac == wbc) && !(stream.eos() || stream.err()); // A and B wave counts must match -} - -bool IIgsInstrumentHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return oscList.finalize(uint8Wave); -} - -bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { - type = stream.readUint16LE(); - pitch = stream.readByte(); - unknownByte_Ofs3 = stream.readByte(); - volume = stream.readByte(); - unknownByte_Ofs5 = stream.readByte(); - instrumentSize = stream.readUint16LE(); - sampleSize = stream.readUint16LE(); - // Read the instrument header *ignoring* its wave address info - - return instrument.read(stream, true); -} - -bool IIgsSampleHeader::finalize(Common::SeekableReadStream &uint8Wave) { - return instrument.finalize(uint8Wave); -} - -/** Older Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV1 = { - {19, 20, 22, 23, 21, 24, 5, 5, 5, 5, - 6, 7, 10, 9, 11, 9, 15, 8, 5, 5, - 17, 16, 18, 12, 14, 5, 5, 5, 5, 5, - 0, 1, 2, 9, 3, 4, 15, 2, 2, 2, - 25, 13, 13, 25}, - 5 -}; - -/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. */ -static const MidiProgramChangeMapping progToInstMappingV2 = { - {21, 22, 24, 25, 23, 26, 6, 6, 6, 6, - 7, 9, 12, 8, 13, 11, 17, 10, 6, 6, - 19, 18, 20, 14, 16, 6, 6, 6, 6, 6, - 0, 1, 2, 4, 3, 5, 17, 2, 2, 2, - 27, 15, 15, 27}, - 6 -}; - -/** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ -static const InstrumentSetInfo instSetV1 = { - 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", progToInstMappingV1 -}; - -/** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ -static const InstrumentSetInfo instSetV2 = { - 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", progToInstMappingV2 -}; - -/** Information about different Apple IIGS AGI executables. */ -static const IIgsExeInfo IIgsExeInfos[] = { - {GID_SQ1, "SQ", 0x1002, 138496, 0x80AD, instSetV1}, - {GID_LSL1, "LL", 0x1003, 141003, 0x844E, instSetV2}, - {GID_AGIDEMO, "DEMO", 0x1005, 141884, 0x8469, instSetV2}, - {GID_KQ1, "KQ", 0x1006, 141894, 0x8469, instSetV2}, - {GID_PQ1, "PQ", 0x1007, 141882, 0x8469, instSetV2}, - {GID_MIXEDUP, "MG", 0x1013, 142552, 0x84B7, instSetV2}, - {GID_KQ2, "KQ2", 0x1013, 143775, 0x84B7, instSetV2}, - {GID_KQ3, "KQ3", 0x1014, 144312, 0x84B7, instSetV2}, - {GID_SQ2, "SQ2", 0x1014, 107882, 0x6563, instSetV2}, - {GID_MH1, "MH", 0x2004, 147678, 0x8979, instSetV2}, - {GID_KQ4, "KQ4", 0x2006, 147652, 0x8979, instSetV2}, - {GID_BC, "BC", 0x3001, 148192, 0x8979, instSetV2}, - {GID_GOLDRUSH, "GR", 0x3003, 148268, 0x8979, instSetV2} -}; - void SoundGen2GS::playSampleSound() { if (_vm->_soundemu != SOUND_EMU_APPLE2GS) { warning("Trying to play a sample but not using Apple IIGS sound emulation mode"); @@ -462,14 +235,6 @@ bool SoundGen2GS::playSampleSound(const IIgsSampleHeader &sampleHeader, const in return true; } -void IIgsMidiChannel::stopSounds() { - // Stops all sounds on this single MIDI channel - for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - iter->stop(); - - _gsChannels.clear(); -} - void SoundGen2GS::playMidiSound() { if (_disabledMidi) return; @@ -625,12 +390,6 @@ void SoundGen2GS::removeStoppedSounds() { iter->removeStoppedSounds(); } -void IIgsMidiChannel::removeStoppedSounds() { - for (int i = _gsChannels.size() - 1; i >= 0; i--) - if (!_gsChannels[i].playing()) - _gsChannels.remove_at(i); -} - uint SoundGen2GS::activeSounds() const { uint result = 0; @@ -640,12 +399,206 @@ uint SoundGen2GS::activeSounds() const { return result; } -uint IIgsMidiChannel::activeSounds() const { - uint result = 0; +IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { + _data = data; // Save the resource pointer + _ptr = _data + 2; // Set current position to just after the header + _len = len; // Save the resource's length + _type = READ_LE_UINT16(data); // Read sound resource's type + _midiTicks = _soundBufTicks = 0; + _isValid = (_type == AGI_SOUND_MIDI) && (_data != NULL) && (_len >= 2); - for (const_iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) - if (!iter->end) - result++; + if (!_isValid) // Check for errors + warning("Error creating Apple IIGS midi sound from resource %d (Type %d, length %d)", resnum, _type, len); +} + +/** + * Convert sample from 8-bit unsigned to 8-bit signed format. + * @param source Source stream containing the 8-bit unsigned sample data. + * @param dest Destination buffer for the 8-bit signed sample data. + * @param length Length of the sample data to be converted. + */ +static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint length) { + // Convert the wave from 8-bit unsigned to 8-bit signed format + for (uint i = 0; i < length; i++) + dest[i] = (int8) ((int) source.readByte() - 128); + return !(source.eos() || source.err()); +} + +IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { + Common::MemoryReadStream stream(data, len, DisposeAfterUse::YES); + + // Check that the header was read ok and that it's of the correct type + if (_header.read(stream) && _header.type == AGI_SOUND_SAMPLE) { // An Apple IIGS AGI sample resource + uint32 sampleStartPos = stream.pos(); + uint32 tailLen = stream.size() - sampleStartPos; + + if (tailLen < _header.sampleSize) { // Check if there's no room for the sample data in the stream + // Apple IIGS Manhunter I: Sound resource 16 has only 16074 bytes + // of sample data although header says it should have 16384 bytes. + warning("Apple IIGS sample (%d) too short (%d bytes. Should be %d bytes). Using the part that's left", + resnum, tailLen, _header.sampleSize); + + _header.sampleSize = (uint16) tailLen; // Use the part that's left + } + + if (_header.pitch > 0x7F) { // Check if the pitch is invalid + warning("Apple IIGS sample (%d) has too high pitch (0x%02x)", resnum, _header.pitch); + + _header.pitch &= 0x7F; // Apple IIGS AGI probably did it this way too + } + + // Finalize the header info using the 8-bit unsigned sample data + _header.finalize(stream); + + // Convert sample data from 8-bit unsigned to 8-bit signed format + stream.seek(sampleStartPos); + _sample = new int8[_header.sampleSize]; + + if (_sample != NULL) + _isValid = convertWave(stream, _sample, _header.sampleSize); + } + + if (!_isValid) // Check for errors + warning("Error creating Apple IIGS sample from resource %d (Type %d, length %d)", resnum, _header.type, len); +} + +/** Reads an Apple IIGS envelope from then given stream. */ +bool IIgsEnvelope::read(Common::SeekableReadStream &stream) { + for (int segNum = 0; segNum < ENVELOPE_SEGMENT_COUNT; segNum++) { + seg[segNum].bp = stream.readByte(); + seg[segNum].inc = stream.readUint16LE(); + } + + return !(stream.eos() || stream.err()); +} + +/** Reads an Apple IIGS wave information structure from the given stream. */ +bool IIgsWaveInfo::read(Common::SeekableReadStream &stream, bool ignoreAddr) { + top = stream.readByte(); + addr = stream.readByte() * 256; + size = (1 << (stream.readByte() & 7)) * 256; + + // Read packed mode byte and parse it into parts + byte packedModeByte = stream.readByte(); + channel = (packedModeByte >> 4) & 1; // Bit 4 + mode = (packedModeByte >> 1) & 3; // Bits 1-2 + halt = (packedModeByte & 1) != 0; // Bit 0 (Converted to boolean) + + relPitch = stream.readSint16LE(); + + // Zero the wave address if we want to ignore the wave address info + if (ignoreAddr) + addr = 0; + + return !(stream.eos() || stream.err()); +} + +bool IIgsWaveInfo::finalize(Common::SeekableReadStream &uint8Wave) { + uint32 startPos = uint8Wave.pos(); // Save stream's starting position + uint8Wave.seek(addr, SEEK_CUR); // Seek to wave's address + + // Calculate the true sample size (A zero ends the sample prematurely) + uint trueSize = size; // Set a default value for the result + for (uint i = 0; i < size; i++) { + if (uint8Wave.readByte() == 0) { + trueSize = i; + // A zero in the sample stream turns off looping + // (At least that's what MESS 0.117 and KEGS32 0.91 seem to do) + if (mode == OSC_MODE_LOOP) + mode = OSC_MODE_ONESHOT; + break; + } + } + size = trueSize; // Set the true sample size + + uint8Wave.seek(startPos); // Seek back to the stream's starting position + + return true; +} + +bool IIgsOscillator::finalize(Common::SeekableReadStream &uint8Wave) { + for (uint i = 0; i < WAVES_PER_OSCILLATOR; i++) + if (!waves[i].finalize(uint8Wave)) + return false; + + return true; +} + +bool IIgsOscillatorList::read(Common::SeekableReadStream &stream, uint oscillatorCount, bool ignoreAddr) { + // First read the A waves and then the B waves for the oscillators + for (uint waveNum = 0; waveNum < WAVES_PER_OSCILLATOR; waveNum++) + for (uint oscNum = 0; oscNum < oscillatorCount; oscNum++) + if (!osc[oscNum].waves[waveNum].read(stream, ignoreAddr)) + return false; + + count = oscillatorCount; // Set the oscillator count + + return true; +} + +bool IIgsOscillatorList::finalize(Common::SeekableReadStream &uint8Wave) { + for (uint i = 0; i < count; i++) + if (!osc[i].finalize(uint8Wave)) + return false; + + return true; +} + +bool IIgsInstrumentHeader::read(Common::SeekableReadStream &stream, bool ignoreAddr) { + env.read(stream); + relseg = stream.readByte(); + /*byte priority =*/ stream.readByte(); // Not needed? 32 in all tested data. + bendrange = stream.readByte(); + vibdepth = stream.readByte(); + vibspeed = stream.readByte(); + /*byte spare =*/ stream.readByte(); // Not needed? 0 in all tested data. + byte wac = stream.readByte(); // Read A wave count + byte wbc = stream.readByte(); // Read B wave count + oscList.read(stream, wac, ignoreAddr); // Read the oscillators + return (wac == wbc) && !(stream.eos() || stream.err()); // A and B wave counts must match +} + +bool IIgsInstrumentHeader::finalize(Common::SeekableReadStream &uint8Wave) { + return oscList.finalize(uint8Wave); +} + +bool IIgsSampleHeader::read(Common::SeekableReadStream &stream) { + type = stream.readUint16LE(); + pitch = stream.readByte(); + unknownByte_Ofs3 = stream.readByte(); + volume = stream.readByte(); + unknownByte_Ofs5 = stream.readByte(); + instrumentSize = stream.readUint16LE(); + sampleSize = stream.readUint16LE(); + // Read the instrument header *ignoring* its wave address info + + return instrument.read(stream, true); +} + +bool IIgsSampleHeader::finalize(Common::SeekableReadStream &uint8Wave) { + return instrument.finalize(uint8Wave); +} + +void IIgsMidiChannel::stopSounds() { + // Stops all sounds on this single MIDI channel + for (iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + iter->stop(); + + _gsChannels.clear(); +} + +void IIgsMidiChannel::removeStoppedSounds() { + for (int i = _gsChannels.size() - 1; i >= 0; i--) + if (!_gsChannels[i].playing()) + _gsChannels.remove_at(i); +} + +uint IIgsMidiChannel::activeSounds() const { + uint result = 0; + + for (const_iterator iter = _gsChannels.begin(); iter != _gsChannels.end(); ++iter) + if (!iter->end) + result++; return result; } @@ -740,6 +693,129 @@ bool IIgsChannelInfo::playing() { return !this->end; } +/** + * A function object (i.e. a functor) for testing if a Common::FSNode + * object's name is equal (Ignoring case) to a string or to at least + * one of the strings in a list of strings. Can be used e.g. with find_if(). + */ +struct fsnodeNameEqualsIgnoreCase : public Common::UnaryFunction { +// FIXME: This should be replaced; use SearchMan instead + fsnodeNameEqualsIgnoreCase(const Common::StringArray &str) : _str(str) {} + fsnodeNameEqualsIgnoreCase(const Common::String str) { _str.push_back(str); } + bool operator()(const Common::FSNode ¶m) const { + for (Common::StringArray::const_iterator iter = _str.begin(); iter != _str.end(); ++iter) + if (param.getName().equalsIgnoreCase(*iter)) + return true; + return false; + } +private: + Common::StringArray _str; +}; + +bool SoundGen2GS::loadInstruments() { + // Check that the platform is Apple IIGS, as only it uses custom instruments + if (_vm->getPlatform() != Common::kPlatformApple2GS) { + debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); + return true; + } + + // Get info on the particular Apple IIGS AGI game's executable + const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID) _vm->getGameID()); + if (exeInfo == NULL) { + warning("Unsupported Apple IIGS game, not loading instruments"); + return false; + } + + // List files in the game path + Common::FSList fslist; + Common::FSNode dir(ConfMan.get("path")); + if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly)) { + warning("Invalid game path (\"%s\"), not loading Apple IIGS instruments", dir.getPath().c_str()); + return false; + } + + // Populate executable filenames list (Long filename and short filename) for searching + Common::StringArray exeNames; + exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS16"); + exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS"); + + // Populate wave filenames list (Long filename and short filename) for searching + Common::StringArray waveNames; + waveNames.push_back("SIERRASTANDARD"); + waveNames.push_back("SIERRAST"); + + // Search for the executable file and the wave file (i.e. check if any of the filenames match) + Common::FSList::const_iterator exeFsnode, waveFsnode; + exeFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(exeNames)); + waveFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(waveNames)); + + // Make sure that we found the executable file + if (exeFsnode == fslist.end()) { + warning("Couldn't find Apple IIGS game executable (%s), not loading instruments", exeNames.begin()->c_str()); + return false; + } + + // Make sure that we found the wave file + if (waveFsnode == fslist.end()) { + warning("Couldn't find Apple IIGS wave file (%s), not loading instruments", waveNames.begin()->c_str()); + return false; + } + + // Set the MIDI program change to instrument number mapping and + // load the instrument headers and their sample data. + // None of the tested SIERRASTANDARD-files have zeroes in them so + // there's no need to check for prematurely ending samples here. + setProgramChangeMapping(&exeInfo->instSet.progToInst); + return loadWaveFile(*waveFsnode, *exeInfo) && loadInstrumentHeaders(*exeFsnode, *exeInfo); +} + +/** Older Apple IIGS AGI MIDI program change to instrument number mapping. */ +static const MidiProgramChangeMapping progToInstMappingV1 = { + {19, 20, 22, 23, 21, 24, 5, 5, 5, 5, + 6, 7, 10, 9, 11, 9, 15, 8, 5, 5, + 17, 16, 18, 12, 14, 5, 5, 5, 5, 5, + 0, 1, 2, 9, 3, 4, 15, 2, 2, 2, + 25, 13, 13, 25}, + 5 +}; + +/** Newer Apple IIGS AGI MIDI program change to instrument number mapping. */ +static const MidiProgramChangeMapping progToInstMappingV2 = { + {21, 22, 24, 25, 23, 26, 6, 6, 6, 6, + 7, 9, 12, 8, 13, 11, 17, 10, 6, 6, + 19, 18, 20, 14, 16, 6, 6, 6, 6, 6, + 0, 1, 2, 4, 3, 5, 17, 2, 2, 2, + 27, 15, 15, 27}, + 6 +}; + +/** Older Apple IIGS AGI instrument set. Used only by Space Quest I (AGI v1.002). */ +static const InstrumentSetInfo instSetV1 = { + 1192, 26, "7ee16bbc135171ffd6b9120cc7ff1af2", "edd3bf8905d9c238e02832b732fb2e18", progToInstMappingV1 +}; + +/** Newer Apple IIGS AGI instrument set (AGI v1.003+). Used by all others than Space Quest I. */ +static const InstrumentSetInfo instSetV2 = { + 1292, 28, "b7d428955bb90721996de1cbca25e768", "c05fb0b0e11deefab58bc68fbd2a3d07", progToInstMappingV2 +}; + +/** Information about different Apple IIGS AGI executables. */ +static const IIgsExeInfo IIgsExeInfos[] = { + {GID_SQ1, "SQ", 0x1002, 138496, 0x80AD, instSetV1}, + {GID_LSL1, "LL", 0x1003, 141003, 0x844E, instSetV2}, + {GID_AGIDEMO, "DEMO", 0x1005, 141884, 0x8469, instSetV2}, + {GID_KQ1, "KQ", 0x1006, 141894, 0x8469, instSetV2}, + {GID_PQ1, "PQ", 0x1007, 141882, 0x8469, instSetV2}, + {GID_MIXEDUP, "MG", 0x1013, 142552, 0x84B7, instSetV2}, + {GID_KQ2, "KQ2", 0x1013, 143775, 0x84B7, instSetV2}, + {GID_KQ3, "KQ3", 0x1014, 144312, 0x84B7, instSetV2}, + {GID_SQ2, "SQ2", 0x1014, 107882, 0x6563, instSetV2}, + {GID_MH1, "MH", 0x2004, 147678, 0x8979, instSetV2}, + {GID_KQ4, "KQ4", 0x2006, 147652, 0x8979, instSetV2}, + {GID_BC, "BC", 0x3001, 148192, 0x8979, instSetV2}, + {GID_GOLDRUSH, "GR", 0x3003, 148268, 0x8979, instSetV2} +}; + /** * Finds information about an Apple IIGS AGI executable based on the game ID. * @return A non-null IIgsExeInfo pointer if successful, otherwise NULL. @@ -840,80 +916,4 @@ bool SoundGen2GS::loadWaveFile(const Common::FSNode &wavePath, const IIgsExeInfo } } -/** - * A function object (i.e. a functor) for testing if a Common::FSNode - * object's name is equal (Ignoring case) to a string or to at least - * one of the strings in a list of strings. Can be used e.g. with find_if(). - */ -struct fsnodeNameEqualsIgnoreCase : public Common::UnaryFunction { -// FIXME: This should be replaced; use SearchMan instead - fsnodeNameEqualsIgnoreCase(const Common::StringArray &str) : _str(str) {} - fsnodeNameEqualsIgnoreCase(const Common::String str) { _str.push_back(str); } - bool operator()(const Common::FSNode ¶m) const { - for (Common::StringArray::const_iterator iter = _str.begin(); iter != _str.end(); ++iter) - if (param.getName().equalsIgnoreCase(*iter)) - return true; - return false; - } -private: - Common::StringArray _str; -}; - -bool SoundGen2GS::loadInstruments() { - // Check that the platform is Apple IIGS, as only it uses custom instruments - if (_vm->getPlatform() != Common::kPlatformApple2GS) { - debugC(3, kDebugLevelSound, "Platform isn't Apple IIGS so not loading any instruments"); - return true; - } - - // Get info on the particular Apple IIGS AGI game's executable - const IIgsExeInfo *exeInfo = getIIgsExeInfo((enum AgiGameID) _vm->getGameID()); - if (exeInfo == NULL) { - warning("Unsupported Apple IIGS game, not loading instruments"); - return false; - } - - // List files in the game path - Common::FSList fslist; - Common::FSNode dir(ConfMan.get("path")); - if (!dir.getChildren(fslist, Common::FSNode::kListFilesOnly)) { - warning("Invalid game path (\"%s\"), not loading Apple IIGS instruments", dir.getPath().c_str()); - return false; - } - - // Populate executable filenames list (Long filename and short filename) for searching - Common::StringArray exeNames; - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS16"); - exeNames.push_back(Common::String(exeInfo->exePrefix) + ".SYS"); - - // Populate wave filenames list (Long filename and short filename) for searching - Common::StringArray waveNames; - waveNames.push_back("SIERRASTANDARD"); - waveNames.push_back("SIERRAST"); - - // Search for the executable file and the wave file (i.e. check if any of the filenames match) - Common::FSList::const_iterator exeFsnode, waveFsnode; - exeFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(exeNames)); - waveFsnode = Common::find_if(fslist.begin(), fslist.end(), fsnodeNameEqualsIgnoreCase(waveNames)); - - // Make sure that we found the executable file - if (exeFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS game executable (%s), not loading instruments", exeNames.begin()->c_str()); - return false; - } - - // Make sure that we found the wave file - if (waveFsnode == fslist.end()) { - warning("Couldn't find Apple IIGS wave file (%s), not loading instruments", waveNames.begin()->c_str()); - return false; - } - - // Set the MIDI program change to instrument number mapping and - // load the instrument headers and their sample data. - // None of the tested SIERRASTANDARD-files have zeroes in them so - // there's no need to check for prematurely ending samples here. - setProgramChangeMapping(&exeInfo->instSet.progToInst); - return loadWaveFile(*waveFsnode, *exeInfo) && loadInstrumentHeaders(*exeFsnode, *exeInfo); -} - } // End of namespace Agi -- cgit v1.2.3 From 859212df2523e8b15076d968018dbf98618fd60f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:44:51 +0000 Subject: Implement translation support for ScummVM GUI. Based on patch #2903830: "Updated Translation Prototype" by alexbevi which in turn is based on patch #1739965 by jvprat. Currently it builds all translations right into ScummVM. Once the feature will be accepted more widely, i.e. more translations will pop up, it will be trivial to move translation strings to external file. Finished translation: Russian Unfinished translation: Hungarian Things which are nice to do: - Language code -> language mapping for more user friendness - Specifying fonts to be used with language - Updating of interface language without restart. It will require moving of much code to reflowLayout() methods for each dialog The .po files must be in single byte encodings. I.e. no support for Unicode. svn-id: r49759 --- Makefile.common | 1 + base/main.cpp | 37 +- common/error.cpp | 30 +- common/messages.cpp | 543 ++++++++++++++++++ common/module.mk | 8 + common/translation.cpp | 221 ++++++++ common/translation.h | 126 +++++ configure | 46 ++ engines/dialogs.cpp | 27 +- gui/GuiManager.cpp | 18 +- gui/GuiManager.h | 2 +- gui/KeysDialog.cpp | 26 +- gui/ThemeEngine.cpp | 7 +- gui/about.cpp | 7 +- gui/browser.cpp | 8 +- gui/error.cpp | 4 +- gui/launcher.cpp | 115 ++-- gui/massadd.cpp | 17 +- gui/options.cpp | 195 ++++--- gui/options.h | 2 + gui/saveload.cpp | 31 +- gui/themebrowser.cpp | 8 +- gui/themes/scummclassic.zip | Bin 52242 -> 52484 bytes gui/themes/scummclassic/classic_layout.stx | 8 + gui/themes/scummmodern.zip | Bin 158233 -> 158475 bytes gui/themes/scummmodern/scummmodern_layout.stx | 8 + po/POTFILES | 24 + po/hu_HU.po | 321 +++++++++++ po/module.mk | 39 ++ po/remove-potcdate.sed | 19 + po/ru_RU.po | 784 ++++++++++++++++++++++++++ po/scummvm.pot | 779 +++++++++++++++++++++++++ sound/mididrv.cpp | 41 +- tools/module.mk | 1 - tools/po2c | 280 +++++++++ 35 files changed, 3528 insertions(+), 255 deletions(-) create mode 100755 common/messages.cpp create mode 100755 common/translation.cpp create mode 100755 common/translation.h create mode 100755 po/POTFILES create mode 100644 po/hu_HU.po create mode 100755 po/module.mk create mode 100755 po/remove-potcdate.sed create mode 100644 po/ru_RU.po create mode 100755 po/scummvm.pot create mode 100755 tools/po2c diff --git a/Makefile.common b/Makefile.common index 419090a705..14d220f990 100644 --- a/Makefile.common +++ b/Makefile.common @@ -28,6 +28,7 @@ MODULES += \ engines \ graphics \ common \ + po ifdef USE_MT32EMU MODULES += sound/softsynth/mt32 diff --git a/base/main.cpp b/base/main.cpp index bfb6611a91..ad6118c905 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -47,6 +47,7 @@ #include "common/fs.h" #include "common/system.h" #include "common/tokenizer.h" +#include "common/translation.h" #include "gui/GuiManager.h" #include "gui/message.h" @@ -101,20 +102,20 @@ static const EnginePlugin *detectPlugin() { ConfMan.set("gameid", gameid); // Query the plugins and find one that will handle the specified gameid - printf("User picked target '%s' (gameid '%s')...\n", ConfMan.getActiveDomainName().c_str(), gameid.c_str()); - printf(" Looking for a plugin supporting this gameid... "); + printf(_t("User picked target '%s' (gameid '%s')...\n"), ConfMan.getActiveDomainName().c_str(), gameid.c_str()); + printf(_t(" Looking for a plugin supporting this gameid... ")); GameDescriptor game = EngineMan.findGame(gameid, &plugin); if (plugin == 0) { - printf("failed\n"); - warning("%s is an invalid gameid. Use the --list-games option to list supported gameid", gameid.c_str()); + printf(_t("failed\n")); + warning(_t("%s is an invalid gameid. Use the --list-games option to list supported gameid"), gameid.c_str()); return 0; } else { printf("%s\n", plugin->getName()); } // FIXME: Do we really need this one? - printf(" Starting '%s'\n", game.description().c_str()); + printf(_t(" Starting '%s'\n"), game.description().c_str()); return plugin; } @@ -141,9 +142,9 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const // Is a separate dialog here still required? //GUI::displayErrorDialog("ScummVM could not find any game in the specified directory!"); - const char *errMsg = Common::errorToString(err); + const char *errMsg = _(Common::errorToString(err)); - warning("%s failed to instantiate engine: %s (target '%s', path '%s')", + warning(_t("%s failed to instantiate engine: %s (target '%s', path '%s')"), plugin->getName(), errMsg, ConfMan.getActiveDomainName().c_str(), @@ -200,7 +201,7 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const while (!tokenizer.empty()) { Common::String token = tokenizer.nextToken(); if (!DebugMan.enableDebugChannel(token)) - warning("Engine does not support debug level '%s'", token.c_str()); + warning(_("Engine does not support debug level '%s'"), token.c_str()); } // Inform backend that the engine is about to be run @@ -268,22 +269,22 @@ static void setupKeymapper(OSystem &system) { mapper->registerHardwareKeySet(keySet); // Now create the global keymap - act = new Action(globalMap, "MENU", "Menu", kGenericActionType, kSelectKeyType); + act = new Action(globalMap, "MENU", _("Menu"), kGenericActionType, kSelectKeyType); act->addKeyEvent(KeyState(KEYCODE_F5, ASCII_F5, 0)); - act = new Action(globalMap, "SKCT", "Skip", kGenericActionType, kActionKeyType); + act = new Action(globalMap, "SKCT", _("Skip"), kGenericActionType, kActionKeyType); act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0)); - act = new Action(globalMap, "PAUS", "Pause", kGenericActionType, kStartKeyType); + act = new Action(globalMap, "PAUS", _("Pause"), kGenericActionType, kStartKeyType); act->addKeyEvent(KeyState(KEYCODE_SPACE, ' ', 0)); - act = new Action(globalMap, "SKLI", "Skip line", kGenericActionType, kActionKeyType); + act = new Action(globalMap, "SKLI", _("Skip line"), kGenericActionType, kActionKeyType); act->addKeyEvent(KeyState(KEYCODE_PERIOD, '.', 0)); - act = new Action(globalMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType); + act = new Action(globalMap, "VIRT", _("Display keyboard"), kVirtualKeyboardActionType); act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0)); - act = new Action(globalMap, "REMP", "Remap keys", kKeyRemapActionType); + act = new Action(globalMap, "REMP", _("Remap keys"), kKeyRemapActionType); act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0)); mapper->addGlobalKeymap(globalMap); @@ -319,6 +320,8 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Update the config file ConfMan.set("versioninfo", gScummVMVersion, Common::ConfigManager::kApplicationDomain); + // Enable translation + TransMan.setLanguage(ConfMan.get("gui_language").c_str()); // Load and setup the debuglevel and the debug flags. We do this at the // soonest possible moment to ensure debug output starts early on, if @@ -387,7 +390,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Did an error occur ? if (result != Common::kNoError) { // Shows an informative error dialog if starting the selected game failed. - GUI::displayErrorDialog(result, "Error running game:"); + GUI::displayErrorDialog(result, _("Error running game:")); } // Quit unless an error occurred, or Return to launcher was requested @@ -413,8 +416,8 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { } else { // A dialog would be nicer, but we don't have any // screen to draw on yet. - warning("Could not find any engine capable of running the selected game"); - GUI::displayErrorDialog("Could not find any engine capable of running the selected game"); + warning(_("Could not find any engine capable of running the selected game")); + GUI::displayErrorDialog(_("Could not find any engine capable of running the selected game")); } // We will destroy the AudioCDManager singleton here to save some memory. diff --git a/common/error.cpp b/common/error.cpp index d51774fd3e..6d1e349287 100644 --- a/common/error.cpp +++ b/common/error.cpp @@ -26,6 +26,8 @@ #include "common/error.h" #include "common/util.h" +#include "common/translation.h" + namespace Common { /** @@ -38,24 +40,24 @@ struct ErrorMessage { }; static const ErrorMessage _errMsgTable[] = { - { kInvalidPathError, "Invalid Path" }, - { kNoGameDataFoundError, "Game Data not found" }, - { kUnsupportedGameidError, "Game Id not supported" }, - { kUnsupportedColorMode, "Unsupported Color Mode" }, + { kInvalidPathError, _s("Invalid Path") }, + { kNoGameDataFoundError, _s("Game Data not found") }, + { kUnsupportedGameidError, _s("Game Id not supported") }, + { kUnsupportedColorMode, _s("Unsupported Color Mode") }, - { kReadPermissionDenied, "Read permission denied" }, - { kWritePermissionDenied, "Write permission denied" }, + { kReadPermissionDenied, _s("Read permission denied") }, + { kWritePermissionDenied, _s("Write permission denied") }, // The following three overlap a bit with kInvalidPathError and each other. Which to keep? - { kPathDoesNotExist, "Path not exists" }, - { kPathNotDirectory, "Path not a directory" }, - { kPathNotFile, "Path not a file" }, + { kPathDoesNotExist, _s("Path not exists") }, + { kPathNotDirectory, _s("Path not a directory") }, + { kPathNotFile, _s("Path not a file") }, - { kCreatingFileFailed, "Cannot create file" }, - { kReadingFailed, "Reading failed" }, - { kWritingFailed, "Writing data failed" }, + { kCreatingFileFailed, _s("Cannot create file") }, + { kReadingFailed, _s("Reading failed") }, + { kWritingFailed, _s("Writing data failed") }, - { kUnknownError, "Unknown Error" } + { kUnknownError, _s("Unknown Error") } }; const char *errorToString(Error error) { @@ -66,7 +68,7 @@ const char *errorToString(Error error) { } } - return "Unknown Error"; + return _("Unknown Error"); } } // End of namespace Common diff --git a/common/messages.cpp b/common/messages.cpp new file mode 100755 index 0000000000..6a5fc5d813 --- /dev/null +++ b/common/messages.cpp @@ -0,0 +1,543 @@ +/* generated by po2c 1.0.2 - Do not modify */ + +#include +#include + +static const char * _po2c_msgids[] = { + /* 0 */ "", + /* 1 */ " Looking for a plugin supporting this gameid... ", + /* 2 */ " Starting '%s'\n", + /* 3 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", + /* 4 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", + /* 5 */ "... progress ...", + /* 6 */ "11kHz", + /* 7 */ "22 kHz", + /* 8 */ "44 kHz", + /* 9 */ "48 kHz", + /* 10 */ "8 kHz", + /* 11 */ "", + /* 12 */ "ALSA", + /* 13 */ "About", + /* 14 */ "About...", + /* 15 */ "AdLib", + /* 16 */ "AdLib emulator:", + /* 17 */ "Add Game...", + /* 18 */ "Angol", + /* 19 */ "Antialiased Renderer (16bpp)", + /* 20 */ "Aspect ratio correction", + /* 21 */ "Associated key : %s", + /* 22 */ "Associated key : none", + /* 23 */ "Atari ST MIDI", + /* 24 */ "Audio", + /* 25 */ "Autosave:", + /* 26 */ "C1Available engines:", + /* 27 */ "C1Features compiled in:", + /* 28 */ "C2(built on ", + /* 29 */ "CAMD", + /* 30 */ "Cancel", + /* 31 */ "Cannot create file", + /* 32 */ "Choose", + /* 33 */ "Choose an action to map", + /* 34 */ "Close", + /* 35 */ "CoreAudio", + /* 36 */ "CoreMIDI", + /* 37 */ "Could not find any engine capable of running the selected game", + /* 38 */ "Creative Music System", + /* 39 */ "DMedia", + /* 40 */ "Date: ", + /* 41 */ "Default", + /* 42 */ "Delete", + /* 43 */ "Disabled GFX", + /* 44 */ "Discovered %d new games ...", + /* 45 */ "Discovered %d new games.", + /* 46 */ "Display keyboard", + /* 47 */ "Do you really want to delete this savegame?", + /* 48 */ "Do you really want to remove this game configuration?", + /* 49 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 50 */ "Edit Game...", + /* 51 */ "Enable Roland GS Mode", + /* 52 */ "Engine does not support debug level '%s'", + /* 53 */ "English", + /* 54 */ "Error running game:", + /* 55 */ "Extra Path:", + /* 56 */ "FM Towns", + /* 57 */ "Failed to load any GUI theme, aborting", + /* 58 */ "FluidSynth", + /* 59 */ "Fullscreen mode", + /* 60 */ "GFX", + /* 61 */ "GUI Renderer:", + /* 62 */ "Game", + /* 63 */ "Game Data not found", + /* 64 */ "Game Id not supported", + /* 65 */ "Game Path:", + /* 66 */ "Go up", + /* 67 */ "Graphics", + /* 68 */ "Graphics mode:", + /* 69 */ "Help", + /* 70 */ "IBM PCjr", + /* 71 */ "ID:", + /* 72 */ "Invalid Path", + /* 73 */ "Invalid game path", + /* 74 */ "Keys", + /* 75 */ "Language:", + /* 76 */ "Load", + /* 77 */ "Load game:", + /* 78 */ "Load...", + /* 79 */ "MIDI", + /* 80 */ "MIDI gain:", + /* 81 */ "MT-32 Emulation", + /* 82 */ "Map", + /* 83 */ "Mass Add...", + /* 84 */ "Menu", + /* 85 */ "Misc", + /* 86 */ "Mixed AdLib/MIDI mode", + /* 87 */ "Mouse click", + /* 88 */ "Music driver:", + /* 89 */ "Music volume:", + /* 90 */ "Mute All", + /* 91 */ "Name:", + /* 92 */ "Never", + /* 93 */ "No", + /* 94 */ "No date saved", + /* 95 */ "No music", + /* 96 */ "No playtime saved", + /* 97 */ "No time saved", + /* 98 */ "None", + /* 99 */ "OK", + /* 100 */ "Options", + /* 101 */ "Options...", + /* 102 */ "Output rate:", + /* 103 */ "Override global MIDI settings", + /* 104 */ "Override global audio settings", + /* 105 */ "Override global graphic settings", + /* 106 */ "Override global volume settings", + /* 107 */ "PC Speaker", + /* 108 */ "Path not a directory", + /* 109 */ "Path not a file", + /* 110 */ "Path not exists", + /* 111 */ "Paths", + /* 112 */ "Pause", + /* 113 */ "Pick the game:", + /* 114 */ "Platform:", + /* 115 */ "Playtime: ", + /* 116 */ "Please select an action", + /* 117 */ "Plugins Path:", + /* 118 */ "Press the key to associate", + /* 119 */ "Quit", + /* 120 */ "Read permission denied", + /* 121 */ "Reading failed", + /* 122 */ "Remap keys", + /* 123 */ "Remove Game", + /* 124 */ "Render mode:", + /* 125 */ "Resume", + /* 126 */ "Return to Launcher", + /* 127 */ "SEQ", + /* 128 */ "SFX volume:", + /* 129 */ "Save", + /* 130 */ "Save Path:", + /* 131 */ "Save Path: ", + /* 132 */ "Save game:", + /* 133 */ "Scan complete!", + /* 134 */ "Scanned %d directories ...", + /* 135 */ "ScummVM could not find any engine capable of running the selected game!", + /* 136 */ "ScummVM could not find any game in the specified directory!", + /* 137 */ "ScummVM couldn't open the specified directory!", + /* 138 */ "Search:", + /* 139 */ "Select SoundFont", + /* 140 */ "Select a Theme", + /* 141 */ "Select additional game directory", + /* 142 */ "Select an action and click 'Map'", + /* 143 */ "Select directory for GUI themes", + /* 144 */ "Select directory for extra files", + /* 145 */ "Select directory for plugins", + /* 146 */ "Select directory for saved games", + /* 147 */ "Select directory for savegames", + /* 148 */ "Select directory with game data", + /* 149 */ "Skip", + /* 150 */ "Skip line", + /* 151 */ "SoundFont:", + /* 152 */ "Speech & Subs", + /* 153 */ "Speech Only", + /* 154 */ "Speech and Subtitles", + /* 155 */ "Speech volume:", + /* 156 */ "Standard Renderer (16bpp)", + /* 157 */ "Start", + /* 158 */ "Subtitle speed:", + /* 159 */ "Subtitles Only", + /* 160 */ "Szakítani", + /* 161 */ "Tapwave Zodiac", + /* 162 */ "Text and Speech:", + /* 163 */ "The chosen directory cannot be written to. Please select another one.", + /* 164 */ "Theme Path:", + /* 165 */ "Theme:", + /* 166 */ "This game ID is already taken. Please choose another one.", + /* 167 */ "This game does not support loading games from the launcher.", + /* 168 */ "TiMidity", + /* 169 */ "Time: ", + /* 170 */ "True Roland MT-32 (disable GM emulation)", + /* 171 */ "Unable to locate game data", + /* 172 */ "Unknown Error", + /* 173 */ "Unknown error", + /* 174 */ "Unsupported Color Mode", + /* 175 */ "Untitled savestate", + /* 176 */ "User picked target '%s' (gameid '%s')...\n", + /* 177 */ "Volume", + /* 178 */ "Windows MIDI", + /* 179 */ "Write permission denied", + /* 180 */ "Writing data failed", + /* 181 */ "Wrong configuration: Both subtitles and speech are off. Assuming subtitles only", + /* 182 */ "Yamaha Pa1", + /* 183 */ "Yes", + /* 184 */ "You have to restart ScummVM to take the effect.", + /* 185 */ "every 10 mins", + /* 186 */ "every 15 mins", + /* 187 */ "every 30 mins", + /* 188 */ "every 5 mins", + /* 189 */ "failed\n", + NULL +}; + +struct _po2c_msg { + int msgid; + const char * msgstr; +}; + +static struct _po2c_msg _po2c_lang_ru_RU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-08 17:25+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, + { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, + { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, + { 4, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, + { 5, "... \350\371\363 ..." }, + { 6, "11 \352\303\366" }, + { 7, "22 \352\303\366" }, + { 8, "44 \352\303\366" }, + { 9, "48 \352\303\366" }, + { 10, "8 \352\303\366" }, + { 11, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, + { 12, "ALSA" }, + { 13, "\316 \357\360\356\343\360\340\354\354\345" }, + { 14, "\316 \357\360\356\343\360\340\354\354\345..." }, + { 15, "AdLib" }, + { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 17, "\315\356\342. \350\343\360\340..." }, + { 19, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 20, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 21, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 23, "Atars ST MIDI" }, + { 24, "\300\363\344\350\356" }, + { 25, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 27, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 28, "C2(\361\356\341\360\340\355 " }, + { 29, "CAMD" }, + { 30, "\316\362\354\345\355\340" }, + { 31, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 32, "\302\373\341\360\340\362\374" }, + { 33, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 34, "\307\340\352\360\373\362\374" }, + { 35, "CoreAudio" }, + { 36, "CoreMIDI" }, + { 37, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 38, "Creative Music System" }, + { 39, "DMedia" }, + { 40, "\304\340\362\340: " }, + { 41, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 42, "\323\344\340\353\350\362\374" }, + { 43, "\301\345\347 \343\360\340\364\350\352\350" }, + { 44, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 45, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 46, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 47, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 48, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 50, "\310\347\354. \350\343\360\363..." }, + { 51, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 52, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 53, "English" }, + { 54, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 55, "\304\356\357. \357\363\362\374:" }, + { 56, "FM Towns" }, + { 57, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 58, "FluidSynth" }, + { 59, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 60, "\303\360\364" }, + { 61, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 62, "\310\343\360\340" }, + { 63, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 64, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 65, "\317\363\362\374 \352 \350\343\360\345: " }, + { 66, "\302\342\345\360\365" }, + { 67, "\303\360\340\364\350\352\340" }, + { 68, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 69, "\317\356\354\356\371\374" }, + { 70, "IBM PCjr" }, + { 71, "ID:" }, + { 72, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 74, "\312\353\340\342\350\370\350" }, + { 75, "\337\347\373\352:" }, + { 76, "\307\340\343\360\363\347\350\362\374" }, + { 77, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 78, "\307\340\343\360...." }, + { 79, "MIDI" }, + { 80, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 81, "\335\354\363\353\377\366\350\377 MT-32" }, + { 82, "\315\340\347\355\340\367\350\362\374" }, + { 83, "\304\356\341. \354\355\356\343\356..." }, + { 84, "\314\345\355\376" }, + { 85, "\320\340\347\355\356\345" }, + { 86, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 87, "\312\353\350\352 \354\373\370\374\376" }, + { 88, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 89, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 90, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 91, "\315\340\347\342\340\355\350\345:" }, + { 92, "\315\350\352\356\343\344\340" }, + { 93, "\315\345\362" }, + { 94, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 95, "\301\345\347 \354\363\347\373\352\350" }, + { 96, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 97, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 98, "\315\345 \347\340\344\340\355" }, + { 99, "OK" }, + { 100, "\316\357\366\350\350" }, + { 101, "\316\357\366\350\350..." }, + { 102, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 107, "PC \361\357\350\352\345\360" }, + { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 109, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 110, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 111, "\317\363\362\350" }, + { 112, "\317\340\363\347\340" }, + { 113, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 114, "\317\353\340\362\364\356\360\354\340:" }, + { 115, "\302\360\345\354\377 \350\343\360\373: " }, + { 116, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 117, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 118, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 119, "\302\373\365\356\344" }, + { 120, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 121, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 122, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 123, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 124, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 125, "\317\360\356\344\356\353\346\350\362\374" }, + { 126, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 127, "SEQ" }, + { 128, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 129, "\307\340\357\350\361\340\362\374" }, + { 130, "\317\363\362\374 \361\356\365\360.: " }, + { 131, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 132, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 133, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 134, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 135, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 136, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 137, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 138, "\317\356\350\361\352:" }, + { 139, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 140, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 141, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 142, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 146, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 149, "\317\360\356\357\363\361\362\350\362\374" }, + { 150, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 151, "SoundFont:" }, + { 152, "\307\342\363\352 \350 \361\363\341." }, + { 153, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 154, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 155, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 156, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 157, "\317\363\361\352" }, + { 158, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 159, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 161, "Tapware Zodiac" }, + { 162, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 163, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 164, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 165, "\322\345\354\340:" }, + { 166, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 167, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 168, "TiMidity" }, + { 169, "\302\360\345\354\377: " }, + { 170, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 172, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 174, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 175, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 176, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 177, "\303\360\356\354\352\356\361\362\374" }, + { 178, "Windows MIDI" }, + { 179, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 180, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 182, "Yamaha Pa1" }, + { 183, "\304\340" }, + { 184, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 185, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 186, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 187, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 188, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 189, "\355\345 \363\344\340\353\356\361\374\n" }, + { -1, NULL } +}; + +static struct _po2c_msg _po2c_lang_hu_HU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\nPOT-Creation-Date: 2009-11-25 07:10-0500\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=ASCII\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 11, "" }, + { 16, "AdLib vezet :" }, + { 20, "Aspect adag korrekci\363" }, + { 24, "Hang" }, + { 25, "Automatikus ment\351s:" }, + { 51, "K\351pess\351 Roland GS Mode" }, + { 55, "Extra \332tvonal:" }, + { 59, "Teljes k\351perny s m\363d:" }, + { 61, "Lek\351pez eszk\366z GUI:" }, + { 67, "Grafik\341val" }, + { 68, "Grafikus m\363d:" }, + { 74, "Kulcsok" }, + { 80, "MIDI nyeres\351g:" }, + { 86, "Vegyes AdLib/MIDI m\363d" }, + { 88, "Zenei vezet :" }, + { 89, "Zene mennyis\351g:" }, + { 90, "Muta \326sszes" }, + { 92, "Soha" }, + { 98, "Semmi" }, + { 99, "Igen" }, + { 102, "Kimeneti teljes\355tm\351ny:" }, + { 111, "\326sv\351nyek" }, + { 124, "Renderel\351si m\363d:" }, + { 128, "SFX mennyis\351ge" }, + { 152, "Besz\351d s Feliratok" }, + { 153, "Csak a besz\351d" }, + { 154, "Besz\351d \351s a Feliratok" }, + { 155, "Besz\351d mennyis\351g:" }, + { 158, "Felirat sebess\351g:" }, + { 159, "Csak feliratok" }, + { 162, "Sz\366veg \351s besz\351d:" }, + { 165, "T\351ma:" }, + { 170, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 177, "Volumene" }, + { 185, "10 percenk\351nt" }, + { 186, "15 percenk\351nt" }, + { 187, "30 percenk\351nt" }, + { 188, "5 percenk\351nt" }, + { -1, NULL } +}; + +static struct { + const char * lang; + const char * charset; + struct _po2c_msg * msgs; +} _po2c_langs[] = { + { "ru_RU", "cp1251", _po2c_lang_ru_RU }, + { "hu_HU", "ASCII", _po2c_lang_hu_HU }, + { NULL, NULL, NULL } +}; + +/* code */ + +static struct _po2c_msg * _po2c_lang=NULL; +static int _po2c_lang_size=0; +static const char * _po2c_charset=NULL; + +void po2c_setlang(const char * lang) +{ + int n; + + _po2c_lang=NULL; + _po2c_lang_size=0; + _po2c_charset=NULL; + + /* if lang is NULL or "", deactivate it */ + if(lang == NULL || *lang == '\0') + return; + + /* searches for a valid language array */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strcmp(lang, _po2c_langs[n].lang) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* try partial searches */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* if found, count entries */ + if(_po2c_lang != NULL) + { + struct _po2c_msg * m; + + for(m=_po2c_lang;m->msgid != -1;m++) + _po2c_lang_size++; + } +} + +const char * po2c_gettext(const char * msgid) +{ + struct _po2c_msg * m; + int b, t, n, c; + + /* if no language is set or msgid is empty, return msgid as is */ + if(_po2c_lang == NULL || *msgid == '\0') + return(msgid); + + /* binary-search for the msgid */ + b=0; t=_po2c_lang_size - 1; + + while(t >= b) + { + n=(b + t) / 2; + m=&_po2c_lang[n]; + + c=strcmp(msgid, _po2c_msgids[m->msgid]); + + if(c == 0) + return(m->msgstr); + else + if(c < 0) + t=n - 1; + else + b=n + 1; + } + + return(msgid); +} + +const char * po2c_getcharset(void) +{ + if (_po2c_charset) + return _po2c_charset; + else + return "ASCII"; +} + +int po2c_getnumlangs(void) +{ + int n = 0; + while (_po2c_langs[n].lang) + n++; + + return n; +} + +const char * po2c_getlang(int num) +{ + return _po2c_langs[num].lang; +} diff --git a/common/module.mk b/common/module.mk index 83d30f0a9b..857fb10edf 100644 --- a/common/module.mk +++ b/common/module.mk @@ -22,11 +22,19 @@ MODULE_OBJS := \ system.o \ textconsole.o \ tokenizer.o \ + translation.o \ unarj.o \ unzip.o \ util.o \ xmlparser.o \ zlib.o +ifdef ENABLE_TRANSLATION +common/translation.cpp: common/messages.cpp + +common/messages.cpp: $(wildcard po/*.po) + tools/po2c $^ > common/messages.cpp +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/common/translation.cpp b/common/translation.cpp new file mode 100755 index 0000000000..8301b22ecc --- /dev/null +++ b/common/translation.cpp @@ -0,0 +1,221 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "translation.h" + +DECLARE_SINGLETON(Common::TranslationManager) + +#ifdef DETECTLANG +#include +#endif + +#ifdef TERMCONV +#include +#endif + +#ifdef TRANSLATION +#include "messages.cpp" +#endif + +namespace Common { + + +#ifdef TRANSLATION + +// Translation enabled + + +TranslationManager::TranslationManager() { +#ifdef DETECTLANG + // Activating current locale settings + const char* locale = setlocale(LC_ALL, ""); + + // Detect the language from the locale + if (!locale) { + strcpy(_syslang, "C"); + } else { + int len = strlen(locale); + if (len > 5) + len = 5; + strncpy(_syslang, locale, len); + _syslang[len] = 0; + } +#else // DETECTLANG + strcpy(_syslang, "C"); +#endif // DETECTLANG + +#ifdef TERMCONV + _convmsg = NULL; + _conversion = NULL; +#endif // TERMCONV + + // Set the default language + setLanguage(""); +} + +TranslationManager::~TranslationManager() { +#ifdef TERMCONV + iconv_close(_conversion); + if (_convmsg) + delete [] _convmsg; +#endif // TERMCONV +} + +void TranslationManager::setLanguage(const char* lang) { + if (*lang == '\0') + po2c_setlang(_syslang); + else + po2c_setlang(lang); + +#ifdef TERMCONV + // Get the locale character set (for terminal output) + const char* charset_term = nl_langinfo(CODESET); + + // Get the messages character set + const char* charset_po = po2c_getcharset(); + + // Delete previous conversion + if (_conversion) + iconv_close(_conversion); + + // Initialize the conversion + _conversion = iconv_open(charset_term, charset_po); +#endif // TERMCONV +} + +const char* TranslationManager::getTranslation(const char* message) { + return po2c_gettext(message); +} + +#ifdef TERMCONV +bool TranslationManager::convert(const char* message) { + // Preparing conversion origin + size_t len = strlen(message); + char* msgcpy = new char[len + 1]; + strcpy(msgcpy, message); + char* msg = msgcpy; + char** pmsg = &msg; + + // Preparing conversion destination + size_t len2 = _sizeconv; + char *conv = _convmsg; + char** pconv = &conv; + + // Clean previous conversions + iconv(_conversion, NULL, NULL, pconv, &len2); + + // Do the real conversion + size_t result = iconv(_conversion, pmsg, &len, pconv, &len2); + + delete [] msgcpy; + + return result != ((size_t)-1); +} +#endif // TERMCONV + +const char* TranslationManager::convertTerm(const char* message) { +#ifdef TERMCONV + size_t len = strlen(message); + if (!_convmsg) { + _sizeconv = len * 2; + _convmsg = new char[_sizeconv]; + } + + if (!convert(message)) { + // Resizing the buffer + delete [] _convmsg; + _sizeconv = len * 2; + _convmsg = new char[_sizeconv]; + + if (!convert(message)) { + printf("Error while converting character sets\n"); + return "Error while converting character sets"; + } + } + + return _convmsg; +#else // TERMCONV + return message; +#endif // TERMCONV +} + +const TLangArray TranslationManager::getSupportedLanguages() const { + TLangArray languages; + + int total = po2c_getnumlangs(); + for (int i = 0; i < total; i++) { + TLanguage lng(po2c_getlang(i), i + 1); + languages.push_back(lng); + } + + //sort(languages.begin(), languages.end()); + + return languages; +} + +int TranslationManager::parseLanguage(const String lang) { + int total = po2c_getnumlangs(); + + for (int i = 0; i < total; i++) { + if (lang == po2c_getlang(i)) + return i + 1; + } + + return kTranslationBuiltinId; +} + + +const char *TranslationManager::getLangById(int id) { + switch (id) { + case kTranslationAutodetectId: + return ""; + case kTranslationBuiltinId: + return "C"; + default: + return po2c_getlang(id - 1); + } +} + +#else // TRANSLATION + +// Translation disabled + + +TranslationManager::TranslationManager() {} + +TranslationManager::~TranslationManager() {} + +void TranslationManager::setLanguage(const char* lang) {} + +const char* TranslationManager::getTranslation(const char* message) { + return message; +} + +const char* TranslationManager::convertTerm(const char* message) { + return message; +} + +#endif // TRANSLATION + +} // End of namespace Common diff --git a/common/translation.h b/common/translation.h new file mode 100755 index 0000000000..95deb6bb38 --- /dev/null +++ b/common/translation.h @@ -0,0 +1,126 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef COMMON_TRANSLATION_H +#define COMMON_TRANSLATION_H + +#include "common/singleton.h" +#include "common/str-array.h" + +#ifdef TERMCONV +#include +#endif + +namespace Common { + +enum TranslationIDs { + kTranslationAutodetectId = 0, + kTranslationBuiltinId = 1000 +}; + +struct TLanguage { + const char *name; + int id; + + TLanguage() { + name = 0; + id = 0; + } + + TLanguage(const char *n, int i) { + name = n; + id = i; + } +}; + +typedef Array TLangArray; + +/** + * Message translation manager. + */ +class TranslationManager : public Singleton { +private: + char _syslang[6]; + +#ifdef TERMCONV + iconv_t _conversion; + char* _convmsg; + int _sizeconv; + + bool convert(const char* message); +#endif // TERMCONV + +public: + /** + * The constructor detects the system language and sets default + * language to English. + */ + TranslationManager(); + ~TranslationManager(); + + const char *getLangById(int id); + + /** + * Sets the current translation language to the one specified in the + * parameter. If the parameter is an empty string, it sets the default + * system language. + */ + void setLanguage(const char *); + void setLanguage(int id) { + setLanguage(getLangById(id)); + } + + int parseLanguage(const String lang); + + /** + * Returns the translation into the current language of the parameter + * message. In case the message isn't found in the translation catalog, + * it returns the original untranslated message. + */ + const char* getTranslation(const char* message); + + /** + * Converts the message into the terminal character set (which may be + * different than the GUI's "native" one. + */ + const char* convertTerm(const char* message); + + const TLangArray getSupportedLanguages() const; +}; + +} // End of namespace Common + +#define TransMan Common::TranslationManager::instance() + +#ifdef TRANSLATION +#define _(str) TransMan.getTranslation(str) +#define _t(str) TransMan.convertTerm(_(str)) +#else +#define _(str) str +#define _t(str) str +#endif + +#define _s(str) str + +#endif diff --git a/configure b/configure index cb2f690441..56827b3855 100755 --- a/configure +++ b/configure @@ -136,6 +136,8 @@ _enable_prof=no # Default vkeybd/keymapper options _vkeybd=no _keymapper=no +# GUI translation options +_translation=yes # Default platform settings _backend=sdl _endian=unknown @@ -676,6 +678,7 @@ Optional Features: --disable-16bit don't enable 16bit color support --disable-scalers exclude scalers --disable-hq-scalers exclude HQ2x and HQ3x scalers + --disable-translation don't build support for translated messages --enable-text-console use text console instead of graphical console --enable-verbose-build enable regular echoing of commands during build process @@ -760,6 +763,8 @@ for ac_option in $@; do --default-dynamic) _plugins_default=dynamic ;; --enable-mt32emu) _mt32emu=yes ;; --disable-mt32emu) _mt32emu=no ;; + --enable-translation) _translation=yes ;; + --disable-translation) _translation=no ;; --enable-vkeybd) _vkeybd=yes ;; --disable-vkeybd) _vkeybd=no ;; --enable-keymapper) _keymapper=yes ;; @@ -2312,6 +2317,47 @@ if test "$_keymapper" = yes ; then DEFINES="$DEFINES -DENABLE_KEYMAPPER" fi +# Check whether to build translation support +# +echo_n "Building translation support... " +add_to_config_mk_if_yes $_translation 'ENABLE_TRANSLATION = 1' +add_to_config_h_if_yes $_translation '#define TRANSLATION' +if test "$_translation" = no ; then + echo "no" +else + echo_n "yes (" + + cat > $TMPC << EOF +#include +int main(void) { setlocale(LC_ALL, ""); return 0; } +EOF + _detectlang=no + cc_check $LDFLAGS $CXXFLAGS && _detectlang=yes + + add_to_config_h_if_yes $_detectlang '#define DETECTLANG' + if test "$_detectlang" = yes ; then + echo_n "with runtime language detection, " + + cat > $TMPC << EOF +#include +#include +int main(void) { nl_langinfo(CODESET); iconv_open(0, 0); return 0; } +EOF + _termconv=no + cc_check_no_clean $LDFLAGS $CXXFLAGS && _termconv=yes + cc_check $LDFLAGS $CXXFLAGS -liconv && LIBS="$LIBS -liconv" && _termconv=yes + + add_to_config_h_if_yes $_termconv '#define TERMCONV' + if test "$_termconv" = yes ; then + echo "with terminal conversion)" + else + echo "without terminal conversion)" + fi + else + echo "without runtime language detection)" + fi +fi + # # Figure out installation directories # diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 954bc81470..4e4a656cc0 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -28,6 +28,7 @@ #include "common/savefile.h" #include "common/system.h" #include "common/events.h" +#include "common/translation.h" #include "graphics/scaler.h" @@ -85,37 +86,37 @@ MainMenuDialog::MainMenuDialog(Engine *engine) StaticTextWidget *version = new StaticTextWidget(this, "GlobalMenu.Version", gScummVMVersionDate); version->setAlign(Graphics::kTextAlignCenter); - new GUI::ButtonWidget(this, "GlobalMenu.Resume", "Resume", kPlayCmd, 'P'); + new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("Resume"), kPlayCmd, 'P'); - _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", "Load", kLoadCmd, 'L'); + _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("Load"), kLoadCmd, 'L'); // TODO: setEnabled -> setVisible _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsLoadingDuringRuntime)); - _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", "Save", kSaveCmd, 'S'); + _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("Save"), kSaveCmd, 'S'); // TODO: setEnabled -> setVisible _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsSavingDuringRuntime)); - new GUI::ButtonWidget(this, "GlobalMenu.Options", "Options", kOptionsCmd, 'O'); + new GUI::ButtonWidget(this, "GlobalMenu.Options", _("Options"), kOptionsCmd, 'O'); // The help button is disabled by default. // To enable "Help", an engine needs to use a subclass of MainMenuDialog // (at least for now, we might change how this works in the future). - _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", "Help", kHelpCmd, 'H'); + _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("Help"), kHelpCmd, 'H'); _helpButton->setEnabled(false); - new GUI::ButtonWidget(this, "GlobalMenu.About", "About", kAboutCmd, 'A'); + new GUI::ButtonWidget(this, "GlobalMenu.About", _("About"), kAboutCmd, 'A'); - _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", "Return to Launcher", kRTLCmd, 'R'); + _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("Return to Launcher"), kRTLCmd, 'R'); _rtlButton->setEnabled(_engine->hasFeature(Engine::kSupportsRTL)); - new GUI::ButtonWidget(this, "GlobalMenu.Quit", "Quit", kQuitCmd, 'Q'); + new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("Quit"), kQuitCmd, 'Q'); _aboutDialog = new GUI::AboutDialog(); _optionsDialog = new ConfigDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions)); - _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load"); + _loadDialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); _loadDialog->setSaveMode(false); - _saveDialog = new GUI::SaveLoadChooser("Save game:", "Save"); + _saveDialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); _saveDialog->setSaveMode(true); } @@ -297,11 +298,11 @@ ConfigDialog::ConfigDialog(bool subtitleControls) // Add the buttons // - new GUI::ButtonWidget(this, "GlobalConfig.Ok", "OK", GUI::kOKCmd, 'O'); - new GUI::ButtonWidget(this, "GlobalConfig.Cancel", "Cancel", GUI::kCloseCmd, 'C'); + new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("OK"), GUI::kOKCmd, 'O'); + new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("Cancel"), GUI::kCloseCmd, 'C'); #ifdef SMALL_SCREEN_DEVICE - new GUI::ButtonWidget(this, "GlobalConfig.Keys", "Keys", kKeysCmd, 'K'); + new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("Keys"), kKeysCmd, 'K'); _keysDialog = NULL; #endif } diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index 99fb3be4dc..9f04c382cb 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -27,6 +27,7 @@ #include "common/util.h" #include "common/config-manager.h" #include "common/algorithm.h" +#include "common/translation.h" #include "backends/keymapper/keymapper.h" @@ -71,7 +72,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), // Loading the theme failed, try to load the built-in theme if (!loadNewTheme("builtin", gfxMode)) { // Loading the built-in theme failed as well. Bail out - error("Failed to load any GUI theme, aborting"); + error(_t("Failed to load any GUI theme, aborting")); } } } @@ -94,27 +95,28 @@ void GuiManager::initKeymap() { Action *act; Keymap *guiMap = new Keymap("gui"); - act = new Action(guiMap, "CLOS", "Close", kGenericActionType, kStartKeyType); + act = new Action(guiMap, "CLOS", _("Close"), kGenericActionType, kStartKeyType); act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0)); - act = new Action(guiMap, "CLIK", "Mouse click"); + act = new Action(guiMap, "CLIK", _("Mouse click")); act->addLeftClickEvent(); - act = new Action(guiMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType); + act = new Action(guiMap, "VIRT", _("Display keyboard"), kVirtualKeyboardActionType); act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0)); - act = new Action(guiMap, "REMP", "Remap keys", kKeyRemapActionType); + act = new Action(guiMap, "REMP", _("Remap keys"), kKeyRemapActionType); act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0)); mapper->addGlobalKeymap(guiMap); } #endif -bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx) { +bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx, bool forced) { // If we are asked to reload the currently active theme, just do nothing // FIXME: Actually, why? It might be desirable at times to force a theme reload... - if (_theme && id == _theme->getThemeId() && gfx == _theme->getGraphicsMode()) - return true; + if (!forced) + if (_theme && id == _theme->getThemeId() && gfx == _theme->getGraphicsMode()) + return true; ThemeEngine *newTheme = 0; diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 892d1aa3ac..3187a0ba73 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -71,7 +71,7 @@ public: bool isActive() const { return ! _dialogStack.empty(); } - bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled); + bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled, bool force = false); ThemeEngine *theme() { return _theme; } ThemeEval *xmlEval() { return _theme->getEvaluator(); } diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp index b80dd200bb..65b14f9078 100644 --- a/gui/KeysDialog.cpp +++ b/gui/KeysDialog.cpp @@ -40,15 +40,15 @@ enum { KeysDialog::KeysDialog(const Common::String &title) : GUI::Dialog("KeysDialog") { - new ButtonWidget(this, "KeysDialog.Map", "Map", kMapCmd, 0); - new ButtonWidget(this, "KeysDialog.Ok", "OK", kOKCmd, 0); - new ButtonWidget(this, "KeysDialog.Cancel", "Cancel", kCloseCmd, 0); + new ButtonWidget(this, "KeysDialog.Map", _("Map"), kMapCmd, 0); + new ButtonWidget(this, "KeysDialog.Ok", _("OK"), kOKCmd, 0); + new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), kCloseCmd, 0); _actionsList = new ListWidget(this, "KeysDialog.List"); _actionsList->setNumberingMode(kListNumberingZero); _actionTitle = new StaticTextWidget(this, "KeysDialog.Action", title); - _keyMapping = new StaticTextWidget(this, "KeysDialog.Mapping", "Select an action and click 'Map'"); + _keyMapping = new StaticTextWidget(this, "KeysDialog.Mapping", _("Select an action and click 'Map'")); _actionTitle->setFlags(WIDGET_CLEARBG); _keyMapping->setFlags(WIDGET_CLEARBG); @@ -79,9 +79,9 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { key = key - Common::ASCII_F1 + SDLK_F1; #endif if (key != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey)key)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey)key)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); _keyMapping->setLabel(selection); _keyMapping->draw(); @@ -89,7 +89,7 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { break; case kMapCmd: if (_actionsList->getSelected() < 0) { - _actionTitle->setLabel("Please select an action"); + _actionTitle->setLabel(_("Please select an action")); } else { char selection[100]; @@ -101,11 +101,11 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { key = key - Common::ASCII_F1 + SDLK_F1; #endif if (key != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey)key)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey)key)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); - _actionTitle->setLabel("Press the key to associate"); + _actionTitle->setLabel(_("Press the key to associate")); _keyMapping->setLabel(selection); _keyMapping->draw(); Actions::Instance()->beginMapping(true); @@ -140,11 +140,11 @@ void KeysDialog::handleKeyUp(Common::KeyState state) { Actions::Instance()->setMapping((ActionType)_actionSelected, state.ascii); if (state.ascii != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey) state.keycode)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey) state.keycode)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); - _actionTitle->setLabel("Choose an action to map"); + _actionTitle->setLabel(_("Choose an action to map")); _keyMapping->setLabel(selection); _keyMapping->draw(); _actionTitle->draw(); diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index b472ad0535..03e21153a5 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -30,6 +30,7 @@ #include "common/fs.h" #include "common/unzip.h" #include "common/tokenizer.h" +#include "common/translation.h" #include "graphics/colormasks.h" #include "graphics/cursorman.h" @@ -329,10 +330,10 @@ ThemeEngine::~ThemeEngine() { * Rendering mode management *********************************************************/ const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = { - { "Disabled GFX", "none", kGfxDisabled }, - { "Standard Renderer (16bpp)", "normal_16bpp", kGfxStandard16bit }, + { _s("Disabled GFX"), "none", kGfxDisabled }, + { _s("Standard Renderer (16bpp)"), "normal_16bpp", kGfxStandard16bit }, #ifndef DISABLE_FANCY_THEMES - { "Antialiased Renderer (16bpp)", "aa_16bpp", kGfxAntialias16bit } + { _s("Antialiased Renderer (16bpp)"), "aa_16bpp", kGfxAntialias16bit } #endif }; diff --git a/gui/about.cpp b/gui/about.cpp index 8b2f470bf6..a999674751 100644 --- a/gui/about.cpp +++ b/gui/about.cpp @@ -27,6 +27,7 @@ #include "base/version.h" #include "common/events.h" #include "common/system.h" +#include "common/translation.h" #include "common/util.h" #include "gui/about.h" #include "gui/GuiManager.h" @@ -92,7 +93,7 @@ AboutDialog::AboutDialog() version += gScummVMVersion; _lines.push_back(version); - Common::String date("C2""(built on "); + Common::String date(_s("C2""(built on ")); date += gScummVMBuildDate; date += ')'; _lines.push_back(date); @@ -100,14 +101,14 @@ AboutDialog::AboutDialog() for (i = 0; i < ARRAYSIZE(copyright_text); i++) addLine(copyright_text[i]); - addLine("C1""Features compiled in:"); + addLine(_s("C1""Features compiled in:")); Common::String features("C0"); features += gScummVMFeatures; addLine(features.c_str()); _lines.push_back(""); - addLine("C1""Available engines:"); + addLine(_s("C1""Available engines:")); const EnginePlugin::List &plugins = EngineMan.getPlugins(); EnginePlugin::List::const_iterator iter = plugins.begin(); for (; iter != plugins.end(); ++iter) { diff --git a/gui/browser.cpp b/gui/browser.cpp index c090742988..86fadf667e 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -30,6 +30,8 @@ #include "common/system.h" #include "common/algorithm.h" +#include "common/translation.h" + namespace GUI { enum { @@ -64,9 +66,9 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Up", "Go up", kGoUpCmd, 0); - new ButtonWidget(this, "Browser.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", "Choose", kChooseCmd, 0); + new ButtonWidget(this, "Browser.Up", _("Go up"), kGoUpCmd, 0); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); } void BrowserDialog::open() { diff --git a/gui/error.cpp b/gui/error.cpp index fbe09c5a02..3332eb533a 100644 --- a/gui/error.cpp +++ b/gui/error.cpp @@ -27,6 +27,8 @@ #include "gui/message.h" #include "gui/error.h" +#include "common/translation.h" + namespace GUI { void displayErrorDialog(const char *text) { @@ -37,7 +39,7 @@ void displayErrorDialog(const char *text) { void displayErrorDialog(Common::Error error, const char *extraText) { Common::String errorText(extraText); errorText += " "; - errorText += Common::errorToString(error); + errorText += _(Common::errorToString(error)); GUI::MessageDialog alert(errorText); alert.runModal(); } diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 0f484c5233..3634ef7e3d 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -30,6 +30,7 @@ #include "common/util.h" #include "common/savefile.h" #include "common/system.h" +#include "common/translation.h" #include "gui/about.h" #include "gui/browser.h" @@ -166,20 +167,20 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 1) The game tab // - tab->addTab("Game"); + tab->addTab(_("Game")); // GUI: Label & edit widget for the game ID - new StaticTextWidget(tab, "GameOptions_Game.Id", "ID:"); + new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:")); _domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain); // GUI: Label & edit widget for the description - new StaticTextWidget(tab, "GameOptions_Game.Name", "Name:"); + new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:")); _descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description); // Language popup - _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", "Language:"); + _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:")); _langPopUp = new PopUpWidget(tab, "GameOptions_Game.LangPopup"); - _langPopUp->appendEntry(""); + _langPopUp->appendEntry(_("")); _langPopUp->appendEntry(""); const Common::LanguageDescription *l = Common::g_languages; for (; l->code; ++l) { @@ -187,9 +188,9 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // Platform popup - _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", "Platform:"); + _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:")); _platformPopUp = new PopUpWidget(tab, "GameOptions_Game.PlatformPopup"); - _platformPopUp->appendEntry(""); + _platformPopUp->appendEntry(_("")); _platformPopUp->appendEntry(""); const Common::PlatformDescription *p = Common::g_platforms; for (; p->code; ++p) { @@ -199,18 +200,18 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 3) The graphics tab // - _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); - _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", "Override global graphic settings", kCmdGlobalGraphicsOverride, 0); + _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), kCmdGlobalGraphicsOverride, 0); addGraphicControls(tab, "GameOptions_Graphics."); // // 4) The audio tab // - tab->addTab("Audio"); + tab->addTab(_("Audio")); - _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", "Override global audio settings", kCmdGlobalAudioOverride, 0); + _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), kCmdGlobalAudioOverride, 0); addAudioControls(tab, "GameOptions_Audio."); addSubtitleControls(tab, "GameOptions_Audio."); @@ -218,18 +219,18 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 5) The volume tab // - tab->addTab("Volume"); + tab->addTab(_("Volume")); - _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", "Override global volume settings", kCmdGlobalVolumeOverride, 0); + _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), kCmdGlobalVolumeOverride, 0); addVolumeControls(tab, "GameOptions_Volume."); // // 6) The MIDI tab // - tab->addTab("MIDI"); + tab->addTab(_("MIDI")); - _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", "Override global MIDI settings", kCmdGlobalMIDIOverride, 0); + _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), kCmdGlobalMIDIOverride, 0); if (_guioptions & Common::GUIO_NOMIDI) _globalMIDIOverride->setEnabled(false); @@ -239,21 +240,21 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 2) The 'Path' tab // - tab->addTab("Paths"); + tab->addTab(_("Paths")); // These buttons have to be extra wide, or the text will be truncated // in the small version of the GUI. // GUI: Button + Label for the game path - new ButtonWidget(tab, "GameOptions_Paths.Gamepath", "Game Path:", kCmdGameBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), kCmdGameBrowser, 0); _gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath); // GUI: Button + Label for the additional path - new ButtonWidget(tab, "GameOptions_Paths.Extrapath", "Extra Path:", kCmdExtraBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), kCmdExtraBrowser, 0); _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath); // GUI: Button + Label for the save path - new ButtonWidget(tab, "GameOptions_Paths.Savepath", "Save Path:", kCmdSaveBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), kCmdSaveBrowser, 0); _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath); // Activate the first tab @@ -261,8 +262,8 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GameOptions.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "GameOptions.Ok", "OK", kOKCmd, 0); + new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "GameOptions.Ok", _("OK"), kOKCmd, 0); } void EditGameDialog::open() { @@ -270,12 +271,12 @@ void EditGameDialog::open() { String extraPath(ConfMan.get("extrapath", _domain)); if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) { - _extraPathWidget->setLabel("None"); + _extraPathWidget->setLabel(_("None")); } String savePath(ConfMan.get("savepath", _domain)); if (savePath.empty() || !ConfMan.hasKey("savepath", _domain)) { - _savePathWidget->setLabel("Default"); + _savePathWidget->setLabel(_("Default")); } int sel, i; @@ -349,11 +350,11 @@ void EditGameDialog::close() { ConfMan.set("path", gamePath, _domain); String extraPath(_extraPathWidget->getLabel()); - if (!extraPath.empty() && (extraPath != "None")) + if (!extraPath.empty() && (extraPath != _("None"))) ConfMan.set("extrapath", extraPath, _domain); String savePath(_savePathWidget->getLabel()); - if (!savePath.empty() && (savePath != "Default")) + if (!savePath.empty() && (savePath != _("Default"))) ConfMan.set("savepath", savePath, _domain); Common::Platform platform = (Common::Platform)_platformPopUp->getSelectedTag(); @@ -387,14 +388,14 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat draw(); break; case kCmdChooseSoundFontCmd: { - BrowserDialog browser("Select SoundFont", false); + BrowserDialog browser(_("Select SoundFont"), false); if (browser.runModal() > 0) { // User made this choice... Common::FSNode file(browser.getResult()); _soundFont->setLabel(file.getPath()); - if (!file.getPath().empty() && (file.getPath() != "None")) + if (!file.getPath().empty() && (file.getPath() != _("None"))) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); @@ -406,7 +407,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat // Change path for the game case kCmdGameBrowser: { - BrowserDialog browser("Select directory with game data", true); + BrowserDialog browser(_("Select directory with game data"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -424,7 +425,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat // Change path for extra game data (eg, using sword cutscenes when playing via CD) case kCmdExtraBrowser: { - BrowserDialog browser("Select additional game directory", true); + BrowserDialog browser(_("Select additional game directory"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -436,7 +437,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat } // Change path for stored save game (perm and temp) data case kCmdSaveBrowser: { - BrowserDialog browser("Select directory for saved games", true); + BrowserDialog browser(_("Select directory for saved games"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -455,7 +456,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat || newDomain.hasPrefix("_") || newDomain == ConfigManager::kApplicationDomain || ConfMan.hasGameDomain(newDomain)) { - MessageDialog alert("This game ID is already taken. Please choose another one."); + MessageDialog alert(_("This game ID is already taken. Please choose another one.")); alert.runModal(); return; } @@ -496,22 +497,22 @@ LauncherDialog::LauncherDialog() new StaticTextWidget(this, "Launcher.Version", gScummVMFullVersion); #endif - new ButtonWidget(this, "Launcher.QuitButton", "Quit", kQuitCmd, 'Q'); - new ButtonWidget(this, "Launcher.AboutButton", "About...", kAboutCmd, 'B'); - new ButtonWidget(this, "Launcher.OptionsButton", "Options...", kOptionsCmd, 'O'); + new ButtonWidget(this, "Launcher.QuitButton", _("Quit"), kQuitCmd, 'Q'); + new ButtonWidget(this, "Launcher.AboutButton", _("About..."), kAboutCmd, 'B'); + new ButtonWidget(this, "Launcher.OptionsButton", _("Options..."), kOptionsCmd, 'O'); _startButton = - new ButtonWidget(this, "Launcher.StartButton", "Start", kStartCmd, 'S'); + new ButtonWidget(this, "Launcher.StartButton", _("Start"), kStartCmd, 'S'); _loadButton = - new ButtonWidget(this, "Launcher.LoadGameButton", "Load...", kLoadGameCmd, 'L'); + new ButtonWidget(this, "Launcher.LoadGameButton", _("Load..."), kLoadGameCmd, 'L'); // Above the lowest button rows: two more buttons (directly below the list box) _addButton = - new ButtonWidget(this, "Launcher.AddGameButton", "Add Game...", kAddGameCmd, 'A'); + new ButtonWidget(this, "Launcher.AddGameButton", _("Add Game..."), kAddGameCmd, 'A'); _editButton = - new ButtonWidget(this, "Launcher.EditGameButton", "Edit Game...", kEditGameCmd, 'E'); + new ButtonWidget(this, "Launcher.EditGameButton", _("Edit Game..."), kEditGameCmd, 'E'); _removeButton = - new ButtonWidget(this, "Launcher.RemoveGameButton", "Remove Game", kRemoveGameCmd, 'R'); + new ButtonWidget(this, "Launcher.RemoveGameButton", _("Remove Game"), kRemoveGameCmd, 'R'); // Search box _searchDesc = 0; @@ -522,7 +523,7 @@ LauncherDialog::LauncherDialog() _searchPic->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageSearch)); } else #endif - _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", "Search:"); + _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, kSearchCmd); _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", kSearchClearCmd, 0); @@ -544,10 +545,10 @@ LauncherDialog::LauncherDialog() updateButtons(); // Create file browser dialog - _browser = new BrowserDialog("Select directory with game data", true); + _browser = new BrowserDialog(_("Select directory with game data"), true); // Create Load dialog - _loadDialog = new SaveLoadChooser("Load game:", "Load"); + _loadDialog = new SaveLoadChooser(_("Load game:"), _("Load")); } void LauncherDialog::selectTarget(const String &target) { @@ -619,8 +620,12 @@ void LauncherDialog::updateListing() { description = g.description(); } - if (description.empty()) - description = "Unknown (target " + iter->_key + ", gameid " + gameid + ")"; + if (description.empty()) { + char tmp[200]; + + snprintf(tmp, 200, "Unknown (target %s, gameid %s)", iter->_key.c_str(), gameid.c_str()); + description = tmp; + } if (!gameid.empty() && !description.empty()) { // Insert the game into the launcher list @@ -652,8 +657,8 @@ void LauncherDialog::addGame() { const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0; if (massAdd) { - MessageDialog alert("Do you really want to run the mass game detector? " - "This could potentially add a huge number of games.", "Yes", "No"); + MessageDialog alert(_("Do you really want to run the mass game detector? " + "This could potentially add a huge number of games."), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK && _browser->runModal() > 0) { MassAddDialog massAddDlg(_browser->getResult()); @@ -700,7 +705,7 @@ void LauncherDialog::addGame() { Common::FSNode dir(_browser->getResult()); Common::FSList files; if (!dir.getChildren(files, Common::FSNode::kListAll)) { - MessageDialog alert("ScummVM couldn't open the specified directory!"); + MessageDialog alert(_("ScummVM couldn't open the specified directory!")); alert.runModal(); return; } @@ -712,7 +717,7 @@ void LauncherDialog::addGame() { int idx; if (candidates.empty()) { // No game was found in the specified directory - MessageDialog alert("ScummVM could not find any game in the specified directory!"); + MessageDialog alert(_("ScummVM could not find any game in the specified directory!")); alert.runModal(); idx = -1; @@ -726,7 +731,7 @@ void LauncherDialog::addGame() { for (idx = 0; idx < (int)candidates.size(); idx++) list.push_back(candidates[idx].description()); - ChooserDialog dialog("Pick the game:"); + ChooserDialog dialog(_("Pick the game:")); dialog.setList(list); idx = dialog.runModal(); } @@ -802,7 +807,7 @@ Common::String addGameToConf(const GameDescriptor &result) { } void LauncherDialog::removeGame(int item) { - MessageDialog alert("Do you really want to remove this game configuration?", "Yes", "No"); + MessageDialog alert(_("Do you really want to remove this game configuration?"), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) { // Remove the currently selected game from the list @@ -865,11 +870,11 @@ void LauncherDialog::loadGame(int item) { } } else { MessageDialog dialog - ("This game does not support loading games from the launcher.", "OK"); + (_("This game does not support loading games from the launcher."), _("OK")); dialog.runModal(); } } else { - MessageDialog dialog("ScummVM could not find any engine capable of running the selected game!", "OK"); + MessageDialog dialog(_("ScummVM could not find any engine capable of running the selected game!"), _("OK")); dialog.runModal(); } } @@ -981,8 +986,8 @@ void LauncherDialog::updateButtons() { int modifiers = g_system->getEventManager()->getModifierState(); const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0; const char *newAddButtonLabel = massAdd - ? "Mass Add..." - : "Add Game..."; + ? _("Mass Add...") + : _("Add Game..."); if (_addButton->getLabel() != newAddButtonLabel) _addButton->setLabel(newAddButtonLabel); @@ -1029,7 +1034,7 @@ void LauncherDialog::reflowLayout() { } } else { if (!_searchDesc) - _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", "Search:"); + _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); if (_searchPic) { removeWidget(_searchPic); diff --git a/gui/massadd.cpp b/gui/massadd.cpp index 266226161a..36efdfdd59 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -27,6 +27,7 @@ #include "common/events.h" #include "common/func.h" #include "common/config-manager.h" +#include "common/translation.h" #include "gui/launcher.h" // For addGameToConf() #include "gui/massadd.h" @@ -75,10 +76,10 @@ MassAddDialog::MassAddDialog(const Common::FSNode &startDir) // new StaticTextWidget(this, "massadddialog_caption", "Mass Add Dialog"); _dirProgressText = new StaticTextWidget(this, "MassAdd.DirProgressText", - "... progress ..."); + _("... progress ...")); _gameProgressText = new StaticTextWidget(this, "MassAdd.GameProgressText", - "... progress ..."); + _("... progress ...")); _dirProgressText->setAlign(Graphics::kTextAlignCenter); _gameProgressText->setAlign(Graphics::kTextAlignCenter); @@ -88,10 +89,10 @@ MassAddDialog::MassAddDialog(const Common::FSNode &startDir) _list->setNumberingMode(kListNumberingOff); _list->setList(l); - _okButton = new ButtonWidget(this, "MassAdd.Ok", "OK", kOkCmd, Common::ASCII_RETURN); + _okButton = new ButtonWidget(this, "MassAdd.Ok", _("OK"), kOkCmd, Common::ASCII_RETURN); _okButton->setEnabled(false); - new ButtonWidget(this, "MassAdd.Cancel", "Cancel", kCancelCmd, Common::ASCII_ESCAPE); + new ButtonWidget(this, "MassAdd.Cancel", _("Cancel"), kCancelCmd, Common::ASCII_ESCAPE); // Build a map from all configured game paths to the targets using them const Common::ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); @@ -240,17 +241,17 @@ void MassAddDialog::handleTickle() { // Enable the OK button _okButton->setEnabled(true); - snprintf(buf, sizeof(buf), "Scan complete!"); + snprintf(buf, sizeof(buf), _("Scan complete!")); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), "Discovered %d new games.", _games.size()); + snprintf(buf, sizeof(buf), _("Discovered %d new games."), _games.size()); _gameProgressText->setLabel(buf); } else { - snprintf(buf, sizeof(buf), "Scanned %d directories ...", _dirsScanned); + snprintf(buf, sizeof(buf), _("Scanned %d directories ..."), _dirsScanned); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), "Discovered %d new games ...", _games.size()); + snprintf(buf, sizeof(buf), _("Discovered %d new games ..."), _games.size()); _gameProgressText->setLabel(buf); } diff --git a/gui/options.cpp b/gui/options.cpp index 212e90f9f0..9ea3c7a1e8 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -35,6 +35,7 @@ #include "common/fs.h" #include "common/config-manager.h" #include "common/system.h" +#include "common/translation.h" #include "graphics/scaler.h" @@ -67,9 +68,9 @@ enum { }; #endif -static const char *savePeriodLabels[] = { "Never", "every 5 mins", "every 10 mins", "every 15 mins", "every 30 mins", 0 }; +static const char *savePeriodLabels[] = { _s("Never"), _s("every 5 mins"), _s("every 10 mins"), _s("every 15 mins"), _s("every 30 mins"), 0 }; static const int savePeriodValues[] = { 0, 5 * 60, 10 * 60, 15 * 60, 30 * 60, -1 }; -static const char *outputRateLabels[] = { "", "8 kHz", "11kHz", "22 kHz", "44 kHz", "48 kHz", 0 }; +static const char *outputRateLabels[] = { _s(""), _s("8 kHz"), _s("11kHz"), _s("22 kHz"), _s("44 kHz"), _s("48 kHz"), 0 }; static const int outputRateValues[] = { 0, 8000, 11025, 22050, 44100, 48000, -1 }; @@ -85,15 +86,15 @@ OptionsDialog::OptionsDialog(const Common::String &domain, const Common::String } const char *OptionsDialog::_subModeDesc[] = { - "Speech Only", - "Speech and Subtitles", - "Subtitles Only" + _s("Speech Only"), + _s("Speech and Subtitles"), + _s("Subtitles Only") }; const char *OptionsDialog::_lowresSubModeDesc[] = { - "Speech Only", - "Speech & Subs", - "Subtitles Only" + _s("Speech Only"), + _s("Speech & Subs"), + _s("Subtitles Only") }; void OptionsDialog::init() { @@ -222,7 +223,7 @@ void OptionsDialog::open() { Common::String soundFont(ConfMan.get("soundfont", _domain)); if (soundFont.empty() || !ConfMan.hasKey("soundfont", _domain)) { - _soundFont->setLabel("None"); + _soundFont->setLabel(_("None")); _soundFontClearButton->setEnabled(false); } else { _soundFont->setLabel(soundFont); @@ -267,7 +268,7 @@ void OptionsDialog::open() { int speed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); _subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); - _subToggleButton->setLabel(_subModeDesc[_subMode]); + _subToggleButton->setLabel(_(_subModeDesc[_subMode])); // Engines that reuse the subtitle speed widget set their own max value. // Scale the config value accordingly (see addSubtitleControls) @@ -378,7 +379,7 @@ void OptionsDialog::close() { ConfMan.setInt("midi_gain", _midiGainSlider->getValue(), _domain); Common::String soundFont(_soundFont->getLabel()); - if (!soundFont.empty() && (soundFont != "None")) + if (!soundFont.empty() && (soundFont != _("None"))) ConfMan.set("soundfont", soundFont, _domain); else ConfMan.removeKey("soundfont", _domain); @@ -465,7 +466,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data else _subMode = 0; - _subToggleButton->setLabel(g_system->getOverlayWidth() > 320 ? _subModeDesc[_subMode] : _lowresSubModeDesc[_subMode]); + _subToggleButton->setLabel(g_system->getOverlayWidth() > 320 ? _(_subModeDesc[_subMode]) : _(_lowresSubModeDesc[_subMode])); _subToggleButton->draw(); _subSpeedDesc->draw(); _subSpeedSlider->draw(); @@ -476,7 +477,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data _subSpeedLabel->draw(); break; case kClearSoundFontCmd: - _soundFont->setLabel("None"); + _soundFont->setLabel(_("None")); _soundFontClearButton->setEnabled(false); draw(); break; @@ -522,7 +523,7 @@ void OptionsDialog::setMIDISettingsState(bool enabled) { _soundFontButton->setEnabled(enabled); _soundFont->setEnabled(enabled); - if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != "None")) + if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != _("None"))) _soundFontClearButton->setEnabled(enabled); else _soundFontClearButton->setEnabled(false); @@ -591,64 +592,64 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes(); // The GFX mode popup - _gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", "Graphics mode:"); + _gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", _("Graphics mode:")); _gfxPopUp = new PopUpWidget(boss, prefix + "grModePopup"); - _gfxPopUp->appendEntry(""); + _gfxPopUp->appendEntry(_("")); _gfxPopUp->appendEntry(""); while (gm->name) { - _gfxPopUp->appendEntry(gm->description, gm->id); + _gfxPopUp->appendEntry(_(gm->description), gm->id); gm++; } // RenderMode popup - _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", "Render mode:"); + _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", _("Render mode:")); _renderModePopUp = new PopUpWidget(boss, prefix + "grRenderPopup"); - _renderModePopUp->appendEntry("", Common::kRenderDefault); + _renderModePopUp->appendEntry(_(""), Common::kRenderDefault); _renderModePopUp->appendEntry(""); const Common::RenderModeDescription *rm = Common::g_renderModes; for (; rm->code; ++rm) { - _renderModePopUp->appendEntry(rm->description, rm->id); + _renderModePopUp->appendEntry(_(rm->description), rm->id); } // Fullscreen checkbox - _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", "Fullscreen mode", 0, 0); + _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode"), 0, 0); // Aspect ratio checkbox - _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", "Aspect ratio correction", 0, 0); + _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction"), 0, 0); _enableGraphicSettings = true; } void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", "Music driver:"); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup"); // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); while (md->name) { - _midiPopUp->appendEntry(md->description, md->id); + _midiPopUp->appendEntry(_(md->description), md->id); md++; } // The OPL emulator popup & a label - _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", "AdLib emulator:"); + _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", _("AdLib emulator:")); _oplPopUp = new PopUpWidget(boss, prefix + "auOPLPopup"); // Populate it const OPL::Config::EmulatorDescription *ed = OPL::Config::getAvailable(); while (ed->name) { - _oplPopUp->appendEntry(ed->description, ed->id); + _oplPopUp->appendEntry(_(ed->description), ed->id); ++ed; } // Sample rate settings - _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", "Output rate:"); + _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", _("Output rate:")); _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup"); for (int i = 0; outputRateLabels[i]; i++) { - _outputRatePopUp->appendEntry(outputRateLabels[i], outputRateValues[i]); + _outputRatePopUp->appendEntry(_(outputRateLabels[i]), outputRateValues[i]); } _enableAudioSettings = true; @@ -656,21 +657,21 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { // SoundFont - _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", "SoundFont:", kChooseSoundFontCmd, 0); - _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", "None"); + _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), kChooseSoundFontCmd, 0); + _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None")); _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", kClearSoundFontCmd, 0); // Multi midi setting - _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", "Mixed AdLib/MIDI mode", 0, 0); + _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode"), 0, 0); // Native mt32 setting - _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", "True Roland MT-32 (disable GM emulation)", 0, 0); + _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), 0, 0); // GS Extensions setting - _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", "Enable Roland GS Mode", 0, 0); + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), 0, 0); // MIDI gain setting (FluidSynth uses this) - _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", "MIDI gain:"); + _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); _midiGainSlider = new SliderWidget(boss, prefix + "mcMidiGainSlider", kMidiGainChanged); _midiGainSlider->setMinValue(0); _midiGainSlider->setMaxValue(1000); @@ -683,11 +684,11 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi // make use of the widgets. The launcher range is 0-255. SCUMM's 0-9 void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) { - _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", "Text and Speech:"); + _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:")); _subToggleButton = new ButtonWidget(boss, prefix + "subToggleButton", "", kSubtitleToggle, 0); // Subtitle speed - _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", "Subtitle speed:"); + _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:")); _subSpeedSlider = new SliderWidget(boss, prefix + "subSubtitleSpeedSlider", kSubtitleSpeedChanged); _subSpeedLabel = new StaticTextWidget(boss, prefix + "subSubtitleSpeedLabel", "100%"); _subSpeedSlider->setMinValue(0); _subSpeedSlider->setMaxValue(maxSliderVal); @@ -699,24 +700,24 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &prefix) { // Volume controllers - _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", "Music volume:"); + _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _("Music volume:")); _musicVolumeSlider = new SliderWidget(boss, prefix + "vcMusicSlider", kMusicVolumeChanged); _musicVolumeLabel = new StaticTextWidget(boss, prefix + "vcMusicLabel", "100%"); _musicVolumeSlider->setMinValue(0); _musicVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _musicVolumeLabel->setFlags(WIDGET_CLEARBG); - _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", "Mute All", kMuteAllChanged, 0); + _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), kMuteAllChanged, 0); - _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", "SFX volume:"); + _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:")); _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", kSfxVolumeChanged); _sfxVolumeLabel = new StaticTextWidget(boss, prefix + "vcSfxLabel", "100%"); _sfxVolumeSlider->setMinValue(0); _sfxVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _sfxVolumeLabel->setFlags(WIDGET_CLEARBG); - _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , "Speech volume:"); + _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _("Speech volume:")); _speechVolumeSlider = new SliderWidget(boss, prefix + "vcSpeechSlider", kSpeechVolumeChanged); _speechVolumeLabel = new StaticTextWidget(boss, prefix + "vcSpeechLabel", "100%"); _speechVolumeSlider->setMinValue(0); @@ -745,7 +746,7 @@ int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { void OptionsDialog::reflowLayout() { if (_graphicsTabId != -1 && _tabWidget) - _tabWidget->setTabTitle(_graphicsTabId, g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _tabWidget->setTabTitle(_graphicsTabId, g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); Dialog::reflowLayout(); } @@ -762,17 +763,17 @@ GlobalOptionsDialog::GlobalOptionsDialog() // // 1) The graphics tab // - _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); addGraphicControls(tab, "GlobalOptions_Graphics."); // // 2) The audio tab // - tab->addTab("Audio"); + tab->addTab(_("Audio")); addAudioControls(tab, "GlobalOptions_Audio."); addSubtitleControls(tab, "GlobalOptions_Audio."); - tab->addTab("Volume"); + tab->addTab(_("Volume")); addVolumeControls(tab, "GlobalOptions_Volume."); // TODO: cd drive setting @@ -780,67 +781,85 @@ GlobalOptionsDialog::GlobalOptionsDialog() // // 3) The MIDI tab // - tab->addTab("MIDI"); + tab->addTab(_("MIDI")); addMIDIControls(tab, "GlobalOptions_MIDI."); // // 4) The miscellaneous tab // - tab->addTab("Paths"); + tab->addTab(_("Paths")); #if !( defined(__DC__) || defined(__GP32__) ) // These two buttons have to be extra wide, or the text will be // truncated in the small version of the GUI. // Save game path - new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", "Save Path: ", kChooseSaveDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), kChooseSaveDirCmd, 0); _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar"); - new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", "Theme Path:", kChooseThemeDirCmd, 0); - _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), kChooseThemeDirCmd, 0); + _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None")); - new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", "Extra Path:", kChooseExtraDirCmd, 0); - _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), kChooseExtraDirCmd, 0); + _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None")); #ifdef DYNAMIC_MODULES - new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", "Plugins Path:", kChoosePluginsDirCmd, 0); - _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), kChoosePluginsDirCmd, 0); + _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _("None")); #endif #endif - tab->addTab("Misc"); + tab->addTab(_("Misc")); - new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", "Theme:", kChooseThemeCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), kChooseThemeCmd, 0); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); - _rendererPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.RendererPopupDesc", "GUI Renderer:"); + _rendererPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.RendererPopupDesc", _("GUI Renderer:")); _rendererPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.RendererPopup"); for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i) - _rendererPopUp->appendEntry(GUI::ThemeEngine::_rendererModes[i].name, GUI::ThemeEngine::_rendererModes[i].mode); + _rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].name), GUI::ThemeEngine::_rendererModes[i].mode); - _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", "Autosave:"); + _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", _("Autosave:")); _autosavePeriodPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopup"); for (int i = 0; savePeriodLabels[i]; i++) { - _autosavePeriodPopUp->appendEntry(savePeriodLabels[i], savePeriodValues[i]); + _autosavePeriodPopUp->appendEntry(_(savePeriodLabels[i]), savePeriodValues[i]); } #ifdef SMALL_SCREEN_DEVICE - new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", "Keys", kChooseKeyMappingCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), kChooseKeyMappingCmd, 0); #endif // TODO: joystick setting +#ifdef TRANSLATION + _guiLanguagePopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.GuiLanguagePopupDesc", _("Language:")); + _guiLanguagePopUp = new PopUpWidget(tab, "GlobalOptions_Misc.GuiLanguagePopup"); +#ifdef DETECTLANG + _guiLanguagePopUp->appendEntry(_(""), Common::kTranslationAutodetectId); +#endif // DETECTLANG + _guiLanguagePopUp->appendEntry(_("English"), Common::kTranslationBuiltinId); + _guiLanguagePopUp->appendEntry("", 0); + Common::TLangArray languages = TransMan.getSupportedLanguages(); + Common::TLangArray::iterator lang = languages.begin(); + while (lang != languages.end()) { + _guiLanguagePopUp->appendEntry(lang->name, lang->id); + lang++; + } + _guiLanguagePopUp->setSelectedTag(TransMan.parseLanguage(ConfMan.get("gui_language").c_str())); + +#endif // TRANSLATION + // Activate the first tab tab->setActiveTab(0); _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GlobalOptions.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "GlobalOptions.Ok", "OK", kOKCmd, 0); + new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), kOKCmd, 0); #ifdef SMALL_SCREEN_DEVICE _keysDialog = new KeysDialog(); @@ -863,19 +882,19 @@ void GlobalOptionsDialog::open() { Common::String extraPath(ConfMan.get("extrapath", _domain)); if (savePath.empty() || !ConfMan.hasKey("savepath", _domain)) { - _savePath->setLabel("None"); + _savePath->setLabel(_("None")); } else { _savePath->setLabel(savePath); } if (themePath.empty() || !ConfMan.hasKey("themepath", _domain)) { - _themePath->setLabel("None"); + _themePath->setLabel(_("None")); } else { _themePath->setLabel(themePath); } if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) { - _extraPath->setLabel("None"); + _extraPath->setLabel(_("None")); } else { _extraPath->setLabel(extraPath); } @@ -883,7 +902,7 @@ void GlobalOptionsDialog::open() { #ifdef DYNAMIC_MODULES Common::String pluginsPath(ConfMan.get("pluginspath", _domain)); if (pluginsPath.empty() || !ConfMan.hasKey("pluginspath", _domain)) { - _pluginsPath->setLabel("None"); + _pluginsPath->setLabel(_("None")); } else { _pluginsPath->setLabel(pluginsPath); } @@ -907,24 +926,24 @@ void GlobalOptionsDialog::open() { void GlobalOptionsDialog::close() { if (getResult()) { Common::String savePath(_savePath->getLabel()); - if (!savePath.empty() && (savePath != "None")) + if (!savePath.empty() && (savePath != _("None"))) ConfMan.set("savepath", savePath, _domain); Common::String themePath(_themePath->getLabel()); - if (!themePath.empty() && (themePath != "None")) + if (!themePath.empty() && (themePath != _("None"))) ConfMan.set("themepath", themePath, _domain); else ConfMan.removeKey("themepath", _domain); Common::String extraPath(_extraPath->getLabel()); - if (!extraPath.empty() && (extraPath != "None")) + if (!extraPath.empty() && (extraPath != _("None"))) ConfMan.set("extrapath", extraPath, _domain); else ConfMan.removeKey("extrapath", _domain); #ifdef DYNAMIC_MODULES Common::String pluginsPath(_pluginsPath->getLabel()); - if (!pluginsPath.empty() && (pluginsPath != "None")) + if (!pluginsPath.empty() && (pluginsPath != _("None"))) ConfMan.set("pluginspath", pluginsPath, _domain); else ConfMan.removeKey("pluginspath", _domain); @@ -940,6 +959,28 @@ void GlobalOptionsDialog::close() { g_gui.loadNewTheme(g_gui.theme()->getThemeId(), selected); ConfMan.set("gui_renderer", cfg, _domain); } +#ifdef TRANSLATION + Common::String oldLang = ConfMan.get("gui_language"); + int selLang = _guiLanguagePopUp->getSelectedTag(); + + ConfMan.set("gui_language", TransMan.getLangById(selLang)); + + Common::String newLang = ConfMan.get("gui_language").c_str(); + if (newLang != oldLang) { +#if 0 + // Activate the selected language + TransMan.setLanguage(selLang); + + // FIXME: Actually, any changes (including the theme change) should + // only become active *after* the options dialog has closed. + g_gui.loadNewTheme(g_gui.theme()->getThemeId(), ThemeEngine::kGfxDisabled, true); +#else + MessageDialog error(_("You have to restart ScummVM to take the effect.")); + error.runModal(); +#endif + } +#endif // TRANSLATION + } OptionsDialog::close(); } @@ -947,14 +988,14 @@ void GlobalOptionsDialog::close() { void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kChooseSaveDirCmd: { - BrowserDialog browser("Select directory for savegames", true); + BrowserDialog browser(_("Select directory for savegames"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); if (dir.isWritable()) { _savePath->setLabel(dir.getPath()); } else { - MessageDialog error("The chosen directory cannot be written to. Please select another one."); + MessageDialog error(_("The chosen directory cannot be written to. Please select another one.")); error.runModal(); return; } @@ -963,7 +1004,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; } case kChooseThemeDirCmd: { - BrowserDialog browser("Select directory for GUI themes", true); + BrowserDialog browser(_("Select directory for GUI themes"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -973,7 +1014,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; } case kChooseExtraDirCmd: { - BrowserDialog browser("Select directory for extra files", true); + BrowserDialog browser(_("Select directory for extra files"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -984,7 +1025,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #ifdef DYNAMIC_MODULES case kChoosePluginsDirCmd: { - BrowserDialog browser("Select directory for plugins", true); + BrowserDialog browser(_("Select directory for plugins"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -995,13 +1036,13 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #endif case kChooseSoundFontCmd: { - BrowserDialog browser("Select SoundFont", false); + BrowserDialog browser(_("Select SoundFont"), false); if (browser.runModal() > 0) { // User made his choice... Common::FSNode file(browser.getResult()); _soundFont->setLabel(file.getPath()); - if (!file.getPath().empty() && (file.getPath() != "None")) + if (!file.getPath().empty() && (file.getPath() != _("None"))) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); diff --git a/gui/options.h b/gui/options.h index 956f78c18f..de25bfc998 100644 --- a/gui/options.h +++ b/gui/options.h @@ -184,6 +184,8 @@ protected: PopUpWidget *_rendererPopUp; StaticTextWidget *_autosavePeriodPopUpDesc; PopUpWidget *_autosavePeriodPopUp; + StaticTextWidget *_guiLanguagePopUpDesc; + PopUpWidget *_guiLanguagePopUp; }; } // End of namespace GUI diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 8ec4dc4133..85bbd252c7 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -23,6 +23,7 @@ */ #include "common/config-manager.h" +#include "common/translation.h" #include "gui/ListWidget.h" #include "gui/message.h" @@ -56,16 +57,16 @@ SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel) _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10); - _date = new StaticTextWidget(this, 0, 0, 10, 10, "No date saved", Graphics::kTextAlignCenter); - _time = new StaticTextWidget(this, 0, 0, 10, 10, "No time saved", Graphics::kTextAlignCenter); - _playtime = new StaticTextWidget(this, 0, 0, 10, 10, "No playtime saved", Graphics::kTextAlignCenter); + _date = new StaticTextWidget(this, 0, 0, 10, 10, _("No date saved"), Graphics::kTextAlignCenter); + _time = new StaticTextWidget(this, 0, 0, 10, 10, _("No time saved"), Graphics::kTextAlignCenter); + _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", "Cancel", kCloseCmd, 0); + new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), kCloseCmd, 0); _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, kChooseCmd, 0); _chooseButton->setEnabled(false); - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", "Delete", kDelCmd, 0); + _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), kDelCmd, 0); _deleteButton->setEnabled(false); _delSupport = _metaInfoSupport = _thumbnailSupport = false; @@ -152,8 +153,8 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da break; case kDelCmd: if (selItem >= 0 && _delSupport) { - MessageDialog alert("Do you really want to delete this savegame?", - "Delete", "Cancel"); + MessageDialog alert(_("Do you really want to delete this savegame?"), + _("Delete"), _("Cancel")); if (alert.runModal() == GUI::kMessageOK) { (*_plugin)->removeSaveState(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str())); @@ -237,9 +238,9 @@ void SaveLoadChooser::updateSelection(bool redraw) { bool startEditMode = _list->isEditable(); _gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB); - _date->setLabel("No date saved"); - _time->setLabel("No time saved"); - _playtime->setLabel("No playtime saved"); + _date->setLabel(_("No date saved")); + _time->setLabel(_("No time saved")); + _playtime->setLabel(_("No playtime saved")); if (selItem >= 0 && !_list->getSelectedString().empty() && _metaInfoSupport) { SaveStateDescriptor desc = (*_plugin)->querySaveMetaInfos(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str())); @@ -261,15 +262,15 @@ void SaveLoadChooser::updateSelection(bool redraw) { if (_saveDateSupport) { if (desc.contains("save_date")) - _date->setLabel("Date: " + desc.getVal("save_date")); + _date->setLabel(_("Date: ") + desc.getVal("save_date")); if (desc.contains("save_time")) - _time->setLabel("Time: " + desc.getVal("save_time")); + _time->setLabel(_("Time: ") + desc.getVal("save_time")); } if (_playTimeSupport) { if (desc.contains("play_time")) - _playtime->setLabel("Playtime: " + desc.getVal("play_time")); + _playtime->setLabel(_("Playtime: ") + desc.getVal("play_time")); } } @@ -282,7 +283,7 @@ void SaveLoadChooser::updateSelection(bool redraw) { if (startEditMode) { _list->startEditMode(); - if (_chooseButton->isEnabled() && _list->getSelectedString() == "Untitled savestate" && + if (_chooseButton->isEnabled() && _list->getSelectedString() == _("Untitled savestate") && _list->getSelectionColor() == ThemeEngine::kFontColorAlternate) { _list->setEditString(""); _list->setEditColor(ThemeEngine::kFontColorNormal); @@ -349,7 +350,7 @@ void SaveLoadChooser::updateSaveList() { Common::String trimmedDescription = description; trimmedDescription.trim(); if (trimmedDescription.empty()) { - description = "Untitled savestate"; + description = _("Untitled savestate"); colors.push_back(ThemeEngine::kFontColorAlternate); } else { colors.push_back(ThemeEngine::kFontColorNormal); diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp index 5d0e24394f..43a9ed8d0a 100644 --- a/gui/themebrowser.cpp +++ b/gui/themebrowser.cpp @@ -26,6 +26,8 @@ #include "gui/ListWidget.h" #include "gui/widget.h" +#include "common/translation.h" + namespace GUI { enum { @@ -41,7 +43,7 @@ enum { ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _fileList = 0; - new StaticTextWidget(this, "Browser.Headline", "Select a Theme"); + new StaticTextWidget(this, "Browser.Headline", _("Select a Theme")); // Add file list _fileList = new ListWidget(this, "Browser.List"); @@ -51,8 +53,8 @@ ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", "Choose", kChooseCmd, 0); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); } void ThemeBrowser::open() { diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 67cbbf7990..1a4481376d 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 14f19a7151..b7b07f8845 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -406,6 +406,14 @@ type = 'PopUp' /> + + + + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index b3dc16b67e..64e9a633ff 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 25add37462..699d59b0be 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -419,6 +419,14 @@ type = 'PopUp' /> + + + + diff --git a/po/POTFILES b/po/POTFILES new file mode 100755 index 0000000000..a8f672d01c --- /dev/null +++ b/po/POTFILES @@ -0,0 +1,24 @@ +#TODO: help_string & usage_string: + +gui/about.cpp +gui/browser.cpp +gui/error.cpp +gui/GuiManager.cpp +gui/KeysDialog.cpp +gui/launcher.cpp +gui/massadd.cpp +gui/options.cpp +gui/saveload.cpp +gui/themebrowser.cpp +gui/ThemeEngine.cpp + +base/main.cpp + +common/error.cpp + +engines/dialogs.cpp + +sound/mididrv.cpp + + +#TODO: backends engines tools? diff --git a/po/hu_HU.po b/po/hu_HU.po new file mode 100644 index 0000000000..bdc4371212 --- /dev/null +++ b/po/hu_HU.po @@ -0,0 +1,321 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2010-06-08 13:39-0100\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +# LANGUAGE translation for ScummVM. +# Copyright (C) 2009 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Alex Bevilacqua , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM VERSION\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\n" +"POT-Creation-Date: 2009-11-25 07:10-0500\n" +"PO-Revision-Date: 2009-11-25 07:42-0500\n" +"Last-Translator: Alex Bevilacqua \n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: gui/options.cpp:71 +msgid "Never" +msgstr "Soha" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "5 percenként" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "10 percenként" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "15 percenként" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "30 percenként" + +#: gui/options.cpp:73 gui/options.cpp:598 gui/options.cpp:608 +#: gui/options.cpp:838 +msgid "" +msgstr "" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "Csak a beszéd" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "Beszéd és a Feliratok" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "Csak feliratok" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "Beszéd s Feliratok" + +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:882 gui/options.cpp:888 +#: gui/options.cpp:894 gui/options.cpp:902 gui/options.cpp:926 +#: gui/options.cpp:930 gui/options.cpp:936 gui/options.cpp:943 +#: gui/options.cpp:1049 +msgid "None" +msgstr "Semmi" + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "Grafikus mód:" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "Renderelési mód:" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "Teljes képerny s mód:" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "Aspect adag korrekció" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "Zenei vezet :" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "AdLib vezet :" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "Kimeneti teljesítmény:" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "Vegyes AdLib/MIDI mód" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "Képessé Roland GS Mode" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "MIDI nyereség:" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "Szöveg és beszéd:" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "Felirat sebesség:" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "Zene mennyiség:" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "Muta Összes" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "SFX mennyisége" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "Beszéd mennyiség:" + +#: gui/options.cpp:743 +msgid "" +"Wrong configuration: Both subtitles and speech are off. Assuming subtitles " +"only" +msgstr "" + +#: gui/options.cpp:749 +msgid "Graphics" +msgstr "Grafikával" + +#: gui/options.cpp:749 +msgid "GFX" +msgstr "" + +#: gui/options.cpp:772 +msgid "Audio" +msgstr "Hang" + +#: gui/options.cpp:776 +msgid "Volume" +msgstr "Volumene" + +#: gui/options.cpp:784 +msgid "MIDI" +msgstr "" + +#: gui/options.cpp:790 +msgid "Paths" +msgstr "Ösvények" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "" + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "" + +#: gui/options.cpp:803 +msgid "Extra Path:" +msgstr "Extra Útvonal:" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "Téma:" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "Leképez eszköz GUI:" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "Automatikus mentés:" + +#: gui/options.cpp:832 +msgid "Keys" +msgstr "Kulcsok" + +#: gui/options.cpp:840 +msgid "Angol" +msgstr "" + +#: gui/options.cpp:858 +msgid "Szakítani" +msgstr "" + +#: gui/options.cpp:859 +msgid "OK" +msgstr "Igen" + +#: gui/options.cpp:995 +msgid "Select directory for savegames" +msgstr "" + +#: gui/options.cpp:1002 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" + +#: gui/options.cpp:1011 +msgid "Select directory for GUI themes" +msgstr "" + +#: gui/options.cpp:1021 +msgid "Select directory for extra files" +msgstr "" + +#: gui/options.cpp:1032 +msgid "Select directory for plugins" +msgstr "" + +#: gui/options.cpp:1043 +msgid "Select SoundFont" +msgstr "" + +#: gui/GuiManager.cpp:73 +msgid "Failed to load any GUI theme, aborting" +msgstr "" + +#: base/main.cpp:98 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "" + +#: base/main.cpp:99 +msgid " Looking for a plugin supporting this gameid... " +msgstr "" + +#: base/main.cpp:103 +msgid "failed\n" +msgstr "" + +#: base/main.cpp:104 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" + +#: base/main.cpp:111 +#, c-format +msgid " Starting '%s'\n" +msgstr "" + +#: base/main.cpp:140 +msgid "Invalid game path" +msgstr "" + +#: base/main.cpp:143 +msgid "Unable to locate game data" +msgstr "" + +#: base/main.cpp:146 +msgid "Unknown error" +msgstr "" + +#: base/main.cpp:149 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "" \ No newline at end of file diff --git a/po/module.mk b/po/module.mk new file mode 100755 index 0000000000..88dde53e87 --- /dev/null +++ b/po/module.mk @@ -0,0 +1,39 @@ +POTFILE := po/scummvm.pot +POFILES := $(wildcard po/*.po) + +updatepot: + xgettext -f po/POTFILES -d scummvm --c++ -k_ -k_t -k_s -o po/scummvm.pot \ + "--copyright-holder=ScummVM Team" --package-name=ScummVM \ + --package-version=$(VERSION) --msgid-bugs-address=scummvm-devel@lists.sf.net -o $(POTFILE)_ + + sed -e 's/SOME DESCRIPTIVE TITLE/LANGUAGE translation for ScummVM/' \ + -e 's/UTF-8/CHARSET/' -e 's/PACKAGE/ScummVM/' $(POTFILE)_ > $(POTFILE).new + + rm $(POTFILE)_ + if test -f $(POTFILE); then \ + sed -f po/remove-potcdate.sed < $(POTFILE) > $(POTFILE).1 && \ + sed -f po/remove-potcdate.sed < $(POTFILE).new > $(POTFILE).2 && \ + if cmp $(POTFILE).1 $(POTFILE).2 >/dev/null 2>&1; then \ + rm -f $(POTFILE).new; \ + else \ + rm -f $(POTFILE) && \ + mv -f $(POTFILE).new $(POTFILE); \ + fi; \ + rm -f $(POTFILE).1 $(POTFILE).2; \ + else \ + mv -f $(POTFILE).new $(POTFILE); \ + fi; + +po/%.po: $(POTFILE) + msgmerge $@ $(POTFILE) -o $@.new + if cmp $@ $@.new >/dev/null 2>&1; then \ + rm -f $@.new; \ + else \ + mv -f $@.new $@; \ + fi; + +update-translations: updatepot $(POFILES) + @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) + @rm -f messages.mo + +.PHONY: updatepot update-translations diff --git a/po/remove-potcdate.sed b/po/remove-potcdate.sed new file mode 100755 index 0000000000..2436c49e78 --- /dev/null +++ b/po/remove-potcdate.sed @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100644 index 0000000000..684226b1cc --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,784 @@ +# Russian translation for ScummVM. +# Copyright (C) 2010 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Eugene Sandulenko , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM VERSION\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"PO-Revision-Date: 2010-06-08 08:52-0100\n" +"Last-Translator: Eugene Sandulenko \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=cp1251\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" +"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: gui/about.cpp:117 +msgid "C2(built on " +msgstr "C2(ñîáðàí " + +#: gui/about.cpp:125 +msgid "C1Features compiled in:" +msgstr "C1Âêëþ÷åííûå â áèëä îïöèè:" + +#: gui/about.cpp:132 +msgid "C1Available engines:" +msgstr "C1Äîñòóïíûå äâèæêè:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Ââåðõ" + +#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 +#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 +#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 +#: gui/options.cpp:861 +msgid "Cancel" +msgstr "Îòìåíà" + +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Âûáðàòü" + +#: gui/GuiManager.cpp:75 +msgid "Failed to load any GUI theme, aborting" +msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" + +#: gui/GuiManager.cpp:98 +msgid "Close" +msgstr "Çàêðûòü" + +#: gui/GuiManager.cpp:101 +msgid "Mouse click" +msgstr "Êëèê ìûøüþ" + +#: gui/GuiManager.cpp:104 base/main.cpp:284 +msgid "Display keyboard" +msgstr "Ïîêàçàòü êëàâèàòóðó" + +#: gui/GuiManager.cpp:107 base/main.cpp:287 +msgid "Remap keys" +msgstr "Ïåðåíàçíà÷èòü êëàâèøè" + +#: gui/KeysDialog.cpp:43 +msgid "Map" +msgstr "Íàçíà÷èòü" + +#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 +#: engines/dialogs.cpp:301 gui/options.cpp:862 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:51 +msgid "Select an action and click 'Map'" +msgstr "Âûáåðèòå äåéñòâèå è êëèêíèòå 'Íàçíà÷èòü'" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : %s" +msgstr "Íàçíà÷åííàÿ êëàâèøà : %s" + +#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#, c-format +msgid "Associated key : none" +msgstr "Íàçíà÷åííàÿ êëàâèøà : íåò" + +#: gui/KeysDialog.cpp:92 +msgid "Please select an action" +msgstr "Ïîæàëóéñòà, âûáåðèòå äåéñòâèå" + +#: gui/KeysDialog.cpp:108 +msgid "Press the key to associate" +msgstr "Íàæìèòå êëàâèøó äëÿ íàçíà÷åíèÿ" + +#: gui/KeysDialog.cpp:147 +msgid "Choose an action to map" +msgstr "Âûáåðèòå äåéñòâèå äëÿ íàçíà÷åíèÿ" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Èãðà" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Íàçâàíèå:" + +#: gui/launcher.cpp:181 gui/options.cpp:839 +msgid "Language:" +msgstr "ßçûê:" + +#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 +#: sound/mididrv.cpp:38 +msgid "" +msgstr "<ïî óìîë÷àíèþ>" + +#: gui/launcher.cpp:191 +msgid "Platform:" +msgstr "Ïëàòôîðìà:" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "Graphics" +msgstr "Ãðàôèêà" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "GFX" +msgstr "Ãðô" + +#: gui/launcher.cpp:205 +msgid "Override global graphic settings" +msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" + +#: gui/launcher.cpp:212 gui/options.cpp:772 +msgid "Audio" +msgstr "Àóäèî" + +#: gui/launcher.cpp:214 +msgid "Override global audio settings" +msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" + +#: gui/launcher.cpp:222 gui/options.cpp:776 +msgid "Volume" +msgstr "Ãðîìêîñòü" + +#: gui/launcher.cpp:224 +msgid "Override global volume settings" +msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" + +#: gui/launcher.cpp:231 gui/options.cpp:784 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:233 +msgid "Override global MIDI settings" +msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" + +#: gui/launcher.cpp:243 gui/options.cpp:790 +msgid "Paths" +msgstr "Ïóòè" + +#: gui/launcher.cpp:249 +msgid "Game Path:" +msgstr "Ïóòü ê èãðå: " + +#: gui/launcher.cpp:253 gui/options.cpp:803 +msgid "Extra Path:" +msgstr "Äîï. ïóòü:" + +#: gui/launcher.cpp:257 +msgid "Save Path:" +msgstr "Ïóòü ñîõð.: " + +#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 +#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 +#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 +#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 +#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 +#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 +#: gui/options.cpp:946 gui/options.cpp:1045 +msgid "None" +msgstr "Íå çàäàí" + +#: gui/launcher.cpp:279 gui/launcher.cpp:357 +msgid "Default" +msgstr "Ïî óìîë÷àíèþ" + +#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +msgid "Select SoundFont" +msgstr "Âûáåðèòå SoundFont" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Âûáåðèòå äèðåêòîðèþ ñ ôàéëàìè èãðû" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Âûáåðèòå äîïîëíèòåëüíóþ äèðåêòîðèþ èãðû" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "Ýòîò ID èãðû óæå èñïîëüçóåòñÿ. Ïîæàëóéñòà, âûáåðèòå äðóãîé." + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "Quit" +msgstr "Âûõîä" + +#: gui/launcher.cpp:501 +msgid "About..." +msgstr "Î ïðîãðàììå..." + +#: gui/launcher.cpp:502 +msgid "Options..." +msgstr "Îïöèè..." + +#: gui/launcher.cpp:504 +msgid "Start" +msgstr "Ïóñê" + +#: gui/launcher.cpp:507 +msgid "Load..." +msgstr "Çàãð...." + +#: gui/launcher.cpp:511 gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Íîâ. èãðà..." + +#: gui/launcher.cpp:513 +msgid "Edit Game..." +msgstr "Èçì. èãðó..." + +#: gui/launcher.cpp:515 +msgid "Remove Game" +msgstr "Óäàëèòü èãðó" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Ïîèñê:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Çàãðóçèòü èãðó:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +msgid "Load" +msgstr "Çàãðóçèòü" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Âû äåéñòâèòåëüíî õîòèòå çàïóñòèòü äåòåêòîð âñåõ èãð? Ýòî ïîòåíöèàëüíî ìîæåò " +"äîáàâèòü áîëüøîå êîëè÷åñòâî èãð." + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "Yes" +msgstr "Äà" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "No" +msgstr "Íåò" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM íå ìîæåò îòêðûòü óêàçàííóþ äèðåêòîðèþ!" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM íå ìîæåò íàéòè èãðó â óêàçàííîé äèðåêòîðèè!" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Âûáåðèòå èãðó:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü óñòàíîâêè äëÿ ýòîé èãðû?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "Ýòà èãðà íå ïîääåðæèâàåò çàãðóçêó ñîõðàíåíèé ÷åðåç ãëàâíîå ìåíþ." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM íå ñìîã íàéòè äâèæîê äëÿ çàïóñêà âûáðàííîé èãðû!" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Äîá. ìíîãî..." + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... èùó ..." + +#: gui/massadd.cpp:244 +#, c-format +msgid "Scan complete!" +msgstr "Ïîèñê çàêîí÷åí!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "Íàéäåíî %d íîâûõ èãð." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "Ïðîñìîòðåíî %d äèðåêòîðèé ..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "Íàéäåíî %d íîâûõ èãð ..." + +#: gui/options.cpp:71 +msgid "Never" +msgstr "Íèêîãäà" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "êàæäûå 5 ìèíóò" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "êàæäûå 10 ìèíóò" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "êàæäûå 15 ìèíóò" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "êàæäûå 30 ìèíóò" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "8 êÃö" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "11 êÃö" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "22 êÃö" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "44 êÃö" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "48 êÃö" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "Òîëüêî îçâó÷êà" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "Îçâó÷êà è ñóáòèòðû" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "Òîëüêî ñóáòèòðû" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "Çâóê è ñóá." + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "Ãðàôè÷åñêèé ðåæèì:" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "Ïîëíîýêðàííûé ðåæèì" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "Äðàéâåð ìóçûêè:" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "Ýìóëÿòîð AdLib:" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "Âûõîäíàÿ ÷àñòîòà:" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "Âêëþ÷èòü ðåæèì Roland GS" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "Óñèëåíèå MIDI:" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "Òåêñò è îçâó÷êà:" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "Ñêîðîñòü ñóáòèòðîâ:" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "Ãðîìêîñòü ìóçûêè:" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "Âûêëþ÷èòü âñ¸" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "Ãðîìêîñòü ýôôåêòîâ:" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "Ãðîìêîñòü îçâó÷êè:" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "Ïóòü äëÿ ñîõðàíåíèé: " + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "Ïóòü ê òåìàì:" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "Ïóòü ê ïëàãèíàì:" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "Ðàçíîå" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "Òåìà:" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "Ðàñòåðèçàòîð GUI:" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "Àâòîñîõðàíåíèå:" + +#: gui/options.cpp:832 engines/dialogs.cpp:305 +msgid "Keys" +msgstr "Êëàâèøè" + +#: gui/options.cpp:844 +msgid "English" +msgstr "English" + +#: gui/options.cpp:996 gui/options.cpp:991 +msgid "Select directory for savegames" +msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" + +#: gui/options.cpp:1003 gui/options.cpp:998 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." + +#: gui/options.cpp:1012 gui/options.cpp:1007 +msgid "Select directory for GUI themes" +msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" + +#: gui/options.cpp:1022 gui/options.cpp:1017 +msgid "Select directory for extra files" +msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" + +#: gui/options.cpp:1033 gui/options.cpp:1028 +msgid "Select directory for plugins" +msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "Äàòà íå çàïèñàíà" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "Âðåìÿ íå çàïèñàíî" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "Âðåìÿ èãðû íå çàïèñàíî" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "Óäàëèòü" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü ýòî ñîõðàíåíèå?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Äàòà: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Âðåìÿ: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Âðåìÿ èãðû: " + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Ñîõðàíåíèå áåç èìåíè" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Âûáåðèòå òåìó" + +#: base/main.cpp:105 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "Ïîëüçîâàòåëü âûáðàë öåëü'%s' (gameid '%s')...\n" + +#: base/main.cpp:106 +msgid " Looking for a plugin supporting this gameid... " +msgstr " Èùó ïëàãèí ñ ïîääåðæêîé ýòîãî gameid... " + +#: base/main.cpp:110 +msgid "failed\n" +msgstr "íå óäàëîñü\n" + +#: base/main.cpp:111 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" +"Íåâåðíûé gameid %s. Èñïîëüçóéòå îïöèþ --list-games äëÿ ïðîñìîòðà ñïèñêà " +"ïîääåðæèâàåìûõ gameid" + +#: base/main.cpp:118 +#, c-format +msgid " Starting '%s'\n" +msgstr " Çàïóñêàþ '%s'\n" + +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "%s íå ñìîã çàïóñòèòü äâèæîê: %s (öåëü '%s', ïóòü '%s')" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Äâèæîê íå ïîääåðæèâàåò óðîâåíü îòëàäêè '%s'" + +#: base/main.cpp:272 +msgid "Menu" +msgstr "Ìåíþ" + +#: base/main.cpp:275 +msgid "Skip" +msgstr "Ïðîïóñòèòü" + +#: base/main.cpp:278 +msgid "Pause" +msgstr "Ïàóçà" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "Ïðîïóñòèòü ñòðîêó" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "Îøèáêà çàïóñêà èãðû:" + +#: base/main.cpp:419 base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "Íå ìîãó íàéòè äâèæîê äëÿ çàïóñêà âûáðàííîé èãðû" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Íåâåðíûé ïóòü" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "Íåò ôàéëîâ èãðû" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "Game Id íå ïîääåðæèâàåòñÿ" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Íåïîääåðæèâàåìûé ðåæèì öâåòà" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Íåäîñòàòî÷íî ïðàâ äëÿ ÷òåíèÿ" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Íåäîñòàòî÷íî ïðàâ äëÿ çàïèñè" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "Ïóòü íå íàéäåí" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "Ïóòü íå ÿâëÿåòñÿ äèðåêòîðèåé" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "Ïóòü íå ÿâëÿåòñÿ ôàéëîì" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Íå ìîãó ñîçäàòü ôàéë" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Îøèáêà ÷òåíèÿ" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Îøèáêà çàïèñè äàííûõ" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "Íåèçâåñòíàÿ îøèáêà" + +#: engines/dialogs.cpp:89 +msgid "Resume" +msgstr "Ïðîäîëæèòü" + +#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +msgid "Save" +msgstr "Çàïèñàòü" + +#: engines/dialogs.cpp:99 +msgid "Options" +msgstr "Îïöèè" + +#: engines/dialogs.cpp:104 +msgid "Help" +msgstr "Ïîìîùü" + +#: engines/dialogs.cpp:107 +msgid "About" +msgstr "Î ïðîãðàììå" + +#: engines/dialogs.cpp:109 +msgid "Return to Launcher" +msgstr "Âåðíóòüñÿ â ãëàâíîå ìåíþ" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Ñîõðàíèòü èãðó: " + +#: gui/options.cpp:978 +msgid "You have to restart ScummVM to take the effect." +msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." + +#: gui/ThemeEngine.cpp:333 +msgid "Disabled GFX" +msgstr "Áåç ãðàôèêè" + +#: gui/ThemeEngine.cpp:334 +msgid "Standard Renderer (16bpp)" +msgstr "Ñòàíäàðòíûé ðàñòåðèçàòîð (16bpp)" + +#: gui/ThemeEngine.cpp:336 +msgid "Antialiased Renderer (16bpp)" +msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" + +#: sound/mididrv.cpp:39 +msgid "No music" +msgstr "Áåç ìóçûêè" + +#: sound/mididrv.cpp:42 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: sound/mididrv.cpp:46 +msgid "ALSA" +msgstr "ALSA" + +#: sound/mididrv.cpp:50 +msgid "Atari ST MIDI" +msgstr "Atars ST MIDI" + +#: sound/mididrv.cpp:54 +msgid "SEQ" +msgstr "SEQ" + +#: sound/mididrv.cpp:58 +msgid "DMedia" +msgstr "DMedia" + +#: sound/mididrv.cpp:62 +msgid "CAMD" +msgstr "CAMD" + +#: sound/mididrv.cpp:66 +msgid "CoreAudio" +msgstr "CoreAudio" + +#: sound/mididrv.cpp:68 +msgid "CoreMIDI" +msgstr "CoreMIDI" + +#: sound/mididrv.cpp:73 +msgid "Yamaha Pa1" +msgstr "Yamaha Pa1" + +#: sound/mididrv.cpp:75 +msgid "Tapwave Zodiac" +msgstr "Tapware Zodiac" + +#: sound/mididrv.cpp:80 +msgid "FluidSynth" +msgstr "FluidSynth" + +#: sound/mididrv.cpp:83 +msgid "MT-32 Emulation" +msgstr "Ýìóëÿöèÿ MT-32" + +#: sound/mididrv.cpp:87 +msgid "AdLib" +msgstr "AdLib" + +#: sound/mididrv.cpp:88 +msgid "PC Speaker" +msgstr "PC ñïèêåð" + +#: sound/mididrv.cpp:89 +msgid "IBM PCjr" +msgstr "IBM PCjr" + +#: sound/mididrv.cpp:90 +msgid "Creative Music System" +msgstr "Creative Music System" + +#: sound/mididrv.cpp:91 +msgid "FM Towns" +msgstr "FM Towns" + +#: sound/mididrv.cpp:93 +msgid "TiMidity" +msgstr "TiMidity" diff --git a/po/scummvm.pot b/po/scummvm.pot new file mode 100755 index 0000000000..77040dd25f --- /dev/null +++ b/po/scummvm.pot @@ -0,0 +1,779 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ScummVM Team +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gui/about.cpp:117 +msgid "C2(built on " +msgstr "" + +#: gui/about.cpp:125 +msgid "C1Features compiled in:" +msgstr "" + +#: gui/about.cpp:132 +msgid "C1Available engines:" +msgstr "" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "" + +#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 +#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 +#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 +#: gui/options.cpp:861 +msgid "Cancel" +msgstr "" + +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "" + +#: gui/GuiManager.cpp:75 +msgid "Failed to load any GUI theme, aborting" +msgstr "" + +#: gui/GuiManager.cpp:98 +msgid "Close" +msgstr "" + +#: gui/GuiManager.cpp:101 +msgid "Mouse click" +msgstr "" + +#: gui/GuiManager.cpp:104 base/main.cpp:284 +msgid "Display keyboard" +msgstr "" + +#: gui/GuiManager.cpp:107 base/main.cpp:287 +msgid "Remap keys" +msgstr "" + +#: gui/KeysDialog.cpp:43 +msgid "Map" +msgstr "" + +#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 +#: engines/dialogs.cpp:301 gui/options.cpp:862 +msgid "OK" +msgstr "" + +#: gui/KeysDialog.cpp:51 +msgid "Select an action and click 'Map'" +msgstr "" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : %s" +msgstr "" + +#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#, c-format +msgid "Associated key : none" +msgstr "" + +#: gui/KeysDialog.cpp:92 +msgid "Please select an action" +msgstr "" + +#: gui/KeysDialog.cpp:108 +msgid "Press the key to associate" +msgstr "" + +#: gui/KeysDialog.cpp:147 +msgid "Choose an action to map" +msgstr "" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "" + +#: gui/launcher.cpp:181 gui/options.cpp:839 +msgid "Language:" +msgstr "" + +#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 +#: sound/mididrv.cpp:38 +msgid "" +msgstr "" + +#: gui/launcher.cpp:191 +msgid "Platform:" +msgstr "" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "Graphics" +msgstr "" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "GFX" +msgstr "" + +#: gui/launcher.cpp:205 +msgid "Override global graphic settings" +msgstr "" + +#: gui/launcher.cpp:212 gui/options.cpp:772 +msgid "Audio" +msgstr "" + +#: gui/launcher.cpp:214 +msgid "Override global audio settings" +msgstr "" + +#: gui/launcher.cpp:222 gui/options.cpp:776 +msgid "Volume" +msgstr "" + +#: gui/launcher.cpp:224 +msgid "Override global volume settings" +msgstr "" + +#: gui/launcher.cpp:231 gui/options.cpp:784 +msgid "MIDI" +msgstr "" + +#: gui/launcher.cpp:233 +msgid "Override global MIDI settings" +msgstr "" + +#: gui/launcher.cpp:243 gui/options.cpp:790 +msgid "Paths" +msgstr "" + +#: gui/launcher.cpp:249 +msgid "Game Path:" +msgstr "" + +#: gui/launcher.cpp:253 gui/options.cpp:803 +msgid "Extra Path:" +msgstr "" + +#: gui/launcher.cpp:257 +msgid "Save Path:" +msgstr "" + +#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 +#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 +#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 +#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 +#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 +#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 +#: gui/options.cpp:946 gui/options.cpp:1045 +msgid "None" +msgstr "" + +#: gui/launcher.cpp:279 gui/launcher.cpp:357 +msgid "Default" +msgstr "" + +#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +msgid "Select SoundFont" +msgstr "" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "Quit" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Options..." +msgstr "" + +#: gui/launcher.cpp:504 +msgid "Start" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "Load..." +msgstr "" + +#: gui/launcher.cpp:511 gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Edit Game..." +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove Game" +msgstr "" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +msgid "Load" +msgstr "" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "Yes" +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "No" +msgstr "" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "" + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "" + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "" + +#: gui/massadd.cpp:244 +#, c-format +msgid "Scan complete!" +msgstr "" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "" + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "" + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "" + +#: gui/options.cpp:71 +msgid "Never" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "" + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "" + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "" + +#: gui/options.cpp:832 engines/dialogs.cpp:305 +msgid "Keys" +msgstr "" + +#: gui/options.cpp:844 +msgid "English" +msgstr "" + +#: gui/options.cpp:996 gui/options.cpp:991 +msgid "Select directory for savegames" +msgstr "" + +#: gui/options.cpp:1003 gui/options.cpp:998 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" + +#: gui/options.cpp:1012 gui/options.cpp:1007 +msgid "Select directory for GUI themes" +msgstr "" + +#: gui/options.cpp:1022 gui/options.cpp:1017 +msgid "Select directory for extra files" +msgstr "" + +#: gui/options.cpp:1033 gui/options.cpp:1028 +msgid "Select directory for plugins" +msgstr "" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "" + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "" + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "" + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "" + +#: base/main.cpp:105 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "" + +#: base/main.cpp:106 +msgid " Looking for a plugin supporting this gameid... " +msgstr "" + +#: base/main.cpp:110 +msgid "failed\n" +msgstr "" + +#: base/main.cpp:111 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" + +#: base/main.cpp:118 +#, c-format +msgid " Starting '%s'\n" +msgstr "" + +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "" + +#: base/main.cpp:272 +msgid "Menu" +msgstr "" + +#: base/main.cpp:275 +msgid "Skip" +msgstr "" + +#: base/main.cpp:278 +msgid "Pause" +msgstr "" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "" + +#: base/main.cpp:419 base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "" + +#: engines/dialogs.cpp:89 +msgid "Resume" +msgstr "" + +#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +msgid "Save" +msgstr "" + +#: engines/dialogs.cpp:99 +msgid "Options" +msgstr "" + +#: engines/dialogs.cpp:104 +msgid "Help" +msgstr "" + +#: engines/dialogs.cpp:107 +msgid "About" +msgstr "" + +#: engines/dialogs.cpp:109 +msgid "Return to Launcher" +msgstr "" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "" + +#: gui/options.cpp:978 +msgid "You have to restart ScummVM to take the effect." +msgstr "" + +#: gui/ThemeEngine.cpp:333 +msgid "Disabled GFX" +msgstr "" + +#: gui/ThemeEngine.cpp:334 +msgid "Standard Renderer (16bpp)" +msgstr "" + +#: gui/ThemeEngine.cpp:336 +msgid "Antialiased Renderer (16bpp)" +msgstr "" + +#: sound/mididrv.cpp:39 +msgid "No music" +msgstr "" + +#: sound/mididrv.cpp:42 +msgid "Windows MIDI" +msgstr "" + +#: sound/mididrv.cpp:46 +msgid "ALSA" +msgstr "" + +#: sound/mididrv.cpp:50 +msgid "Atari ST MIDI" +msgstr "" + +#: sound/mididrv.cpp:54 +msgid "SEQ" +msgstr "" + +#: sound/mididrv.cpp:58 +msgid "DMedia" +msgstr "" + +#: sound/mididrv.cpp:62 +msgid "CAMD" +msgstr "" + +#: sound/mididrv.cpp:66 +msgid "CoreAudio" +msgstr "" + +#: sound/mididrv.cpp:68 +msgid "CoreMIDI" +msgstr "" + +#: sound/mididrv.cpp:73 +msgid "Yamaha Pa1" +msgstr "" + +#: sound/mididrv.cpp:75 +msgid "Tapwave Zodiac" +msgstr "" + +#: sound/mididrv.cpp:80 +msgid "FluidSynth" +msgstr "" + +#: sound/mididrv.cpp:83 +msgid "MT-32 Emulation" +msgstr "" + +#: sound/mididrv.cpp:87 +msgid "AdLib" +msgstr "" + +#: sound/mididrv.cpp:88 +msgid "PC Speaker" +msgstr "" + +#: sound/mididrv.cpp:89 +msgid "IBM PCjr" +msgstr "" + +#: sound/mididrv.cpp:90 +msgid "Creative Music System" +msgstr "" + +#: sound/mididrv.cpp:91 +msgid "FM Towns" +msgstr "" + +#: sound/mididrv.cpp:93 +msgid "TiMidity" +msgstr "" diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index a9a782184e..e34f5a9705 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -27,6 +27,7 @@ #include "common/config-manager.h" #include "common/str.h" #include "common/system.h" +#include "common/translation.h" #include "common/util.h" #include "sound/mididrv.h" @@ -35,62 +36,62 @@ static const MidiDriverDescription s_musicDrivers[] = { // The flags for the "auto" & "null" drivers indicate that they are anything // you want it to be. - {"auto", "", MD_AUTO, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, - {"null", "No music", MD_NULL, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, + {"auto", _s(""), MD_AUTO, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, + {"null", _s("No music"), MD_NULL, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - {"windows", "Windows MIDI", MD_WINDOWS, MDT_MIDI}, + {"windows", _s("Windows MIDI"), MD_WINDOWS, MDT_MIDI}, #endif #if defined(UNIX) && defined(USE_ALSA) - {"alsa", "ALSA", MD_ALSA, MDT_MIDI}, + {"alsa", _s("ALSA"), MD_ALSA, MDT_MIDI}, #endif #if defined(__MINT__) - {"stmidi", "Atari ST MIDI", MD_STMIDI, MDT_MIDI}, + {"stmidi", _s("Atari ST MIDI"), MD_STMIDI, MDT_MIDI}, #endif #if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) && !defined(__MINT__) - {"seq", "SEQ", MD_SEQ, MDT_MIDI}, + {"seq", _s("SEQ"), MD_SEQ, MDT_MIDI}, #endif #if defined(IRIX) - {"dmedia", "DMedia", MD_DMEDIA, MDT_MIDI}, + {"dmedia", _s("DMedia"), MD_DMEDIA, MDT_MIDI}, #endif #if defined(__amigaos4__) - {"camd", "CAMD", MD_CAMD, MDT_MIDI}, + {"camd", _s("CAMD"), MD_CAMD, MDT_MIDI}, #endif #if defined(MACOSX) - {"core", "CoreAudio", MD_COREAUDIO, MDT_MIDI}, + {"core", _s("CoreAudio"), MD_COREAUDIO, MDT_MIDI}, // {"coreaudio", "CoreAudio", MD_COREAUDIO, MDT_MIDI}, - {"coremidi", "CoreMIDI", MD_COREMIDI, MDT_MIDI}, + {"coremidi", _s("CoreMIDI"), MD_COREMIDI, MDT_MIDI}, #endif #if defined(PALMOS_MODE) # if defined(COMPILE_CLIE) - {"ypa1", "Yamaha Pa1", MD_YPA1, MDT_MIDI}, + {"ypa1", _s("Yamaha Pa1"), MD_YPA1, MDT_MIDI}, # elif defined(COMPILE_ZODIAC) && (!defined(ENABLE_SCUMM) || !defined(PALMOS_ARM)) - {"zodiac", "Tapwave Zodiac", MD_ZODIAC, MDT_MIDI}, + {"zodiac", _s("Tapwave Zodiac"), MD_ZODIAC, MDT_MIDI}, # endif #endif #ifdef USE_FLUIDSYNTH - {"fluidsynth", "FluidSynth", MD_FLUIDSYNTH, MDT_MIDI}, + {"fluidsynth", _s("FluidSynth"), MD_FLUIDSYNTH, MDT_MIDI}, #endif #ifdef USE_MT32EMU - {"mt32", "MT-32 Emulation", MD_MT32, MDT_MIDI}, + {"mt32", _s("MT-32 Emulation"), MD_MT32, MDT_MIDI}, #endif // The flags for the "adlib" driver indicates that it can do AdLib and MIDI. - {"adlib", "AdLib", MD_ADLIB, MDT_ADLIB}, - {"pcspk", "PC Speaker", MD_PCSPK, MDT_PCSPK}, - {"pcjr", "IBM PCjr", MD_PCJR, MDT_PCSPK}, - {"cms", "Creative Music System", MD_CMS, MDT_CMS}, - {"towns", "FM Towns", MD_TOWNS, MDT_TOWNS}, + {"adlib", _s("AdLib"), MD_ADLIB, MDT_ADLIB}, + {"pcspk", _s("PC Speaker"), MD_PCSPK, MDT_PCSPK}, + {"pcjr", _s("IBM PCjr"), MD_PCJR, MDT_PCSPK}, + {"cms", _s("Creative Music System"), MD_CMS, MDT_CMS}, + {"towns", _s("FM Towns"), MD_TOWNS, MDT_TOWNS}, #if defined(UNIX) - {"timidity", "TiMidity", MD_TIMIDITY, MDT_MIDI}, + {"timidity", _s("TiMidity"), MD_TIMIDITY, MDT_MIDI}, #endif {0, 0, MD_NULL, MDT_NONE} diff --git a/tools/module.mk b/tools/module.mk index 896a2e504b..2c62e427ea 100644 --- a/tools/module.mk +++ b/tools/module.mk @@ -65,7 +65,6 @@ md5scumm: tools/md5table$(EXEEXT) tools/md5table$(EXEEXT) --c++ < $(srcdir)/tools/scumm-md5.txt > $(srcdir)/engines/scumm/scumm-md5.h cp $(srcdir)/tools/scumm-md5.txt $(srcdir)/../../web/trunk/data/scumm-md5.txt - # # Rules which automatically and implicitly rebuild the credits and # MD5 tables when needed. diff --git a/tools/po2c b/tools/po2c new file mode 100755 index 0000000000..ac1744aa2c --- /dev/null +++ b/tools/po2c @@ -0,0 +1,280 @@ +#!/usr/bin/perl + +# +# po2c - Converts .po files to C code +# +# Copyright (C) 2004 Angel Ortega +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# http://www.triptico.com +# + +$VERSION = "1.0.2"; + +if(scalar(@ARGV) == 0) +{ + print "Usage: po2c {po file[s]}\n"; + exit 1; +} + +%msgs = (); +%msgids = (); + +# stage 1: loading + +# arguments are .po files +foreach my $f (@ARGV) +{ + my ($lang); + my ($langDesc); + + next unless(($lang) = ($f =~ /([^\/]+)\.po$/)); + + if(open F, $f) + { + my ($msgid, $val, %a); + + while() + { + chomp; + + # ignore blank lines or comments + next if /^$/ or /^#/; + + if(/^msgid\s+\"(.*)\"\s*$/) + { + # store previous msgid + if(defined($msgid)) + { + $a{$msgid} = $val; + $msgids{$msgid} ++; + } + + # start of msgid + $val = $1; + } + elsif(/^msgstr\s+\"(.*)\"\s*$/) + { + # store previous msgid + $msgid = $val; + + # start of msgstr + $val = $1; + } + elsif(/^\"(.*)\"\s*$/) + { + # add to current value + $val .= $1; + } + } + + # store previous msgid + if(defined($msgid)) + { + $a{$msgid} = $val; + $msgids{$msgid} ++; + } + + close F; + + # add to the global message pool + $msgs{$lang} = \%a; + } +} + +# stage 2: convert the data + +# stores all sorted msgids into @msgids +@msgids = sort(keys(%msgids)); + +# travels again, storing indexes into %msgids +for(my $n = 0;$n < scalar(@msgids);$n++) +{ + $msgids{$msgids[$n]} = $n; +} + +# stage 3: dump as C code + +print "/* generated by po2c $VERSION - Do not modify */\n\n"; +print "#include \n"; +print "#include \n\n"; + +# dump first the msgid array +print "static const char * _po2c_msgids[] = {\n"; + +for(my $n = 0;$n < scalar(@msgids);$n++) +{ + print "\t/* $n */ \"" . $msgids[$n] . "\",\n"; +} + +print "\tNULL\n};\n\n"; + +# dump the lang structure +print "struct _po2c_msg {\n"; +print "\tint msgid;\n"; +print "\tconst char * msgstr;\n"; +print "};\n\n"; + +# dump now each language + +foreach my $l (keys(%msgs)) +{ + print "static struct _po2c_msg _po2c_lang_${l}\[\] = {\n"; + + # get the translation table for the language $l + my ($m) = $msgs{$l}; + +# while (my ($msgstr, $msgid) = each (%$m)) + foreach my $msgid (sort(keys(%$m))) + { + my ($msgstr) = ""; + + # make it 7-bit safe + foreach $c (split(//, $m->{$msgid})) { + if (ord($c) > 0x7f) { + $msgstr .= sprintf("\\%o", ord($c)); + } else { + $msgstr .= $c; + } + } + + print "\t{ " . $msgids{$msgid} . ", \"" . $msgstr . "\" },\n" + if $msgstr; + } + + print "\t{ -1, NULL }\n};\n\n"; +} + +# finally, dump the languages + +print "static struct {\n"; +print "\tconst char * lang;\n"; +print "\tconst char * charset;\n"; +print "\tstruct _po2c_msg * msgs;\n"; +print "} _po2c_langs[] = {\n"; + +foreach my $l (keys(%msgs)) +{ + $header = $msgs{$l}->{""}; + $header =~ /charset=([^\\]+)/; + $charset = $1; + print "\t{ \"" . $l . "\", \"" . $charset . "\", _po2c_lang_${l} },\n"; +} + +print "\t{ NULL, NULL, NULL }\n};\n\n"; + +print "/* code */\n"; +print << 'EOF'; + +static struct _po2c_msg * _po2c_lang=NULL; +static int _po2c_lang_size=0; +static const char * _po2c_charset=NULL; + +void po2c_setlang(const char * lang) +{ + int n; + + _po2c_lang=NULL; + _po2c_lang_size=0; + _po2c_charset=NULL; + + /* if lang is NULL or "", deactivate it */ + if(lang == NULL || *lang == '\0') + return; + + /* searches for a valid language array */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strcmp(lang, _po2c_langs[n].lang) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* try partial searches */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* if found, count entries */ + if(_po2c_lang != NULL) + { + struct _po2c_msg * m; + + for(m=_po2c_lang;m->msgid != -1;m++) + _po2c_lang_size++; + } +} + +const char * po2c_gettext(const char * msgid) +{ + struct _po2c_msg * m; + int b, t, n, c; + + /* if no language is set or msgid is empty, return msgid as is */ + if(_po2c_lang == NULL || *msgid == '\0') + return(msgid); + + /* binary-search for the msgid */ + b=0; t=_po2c_lang_size - 1; + + while(t >= b) + { + n=(b + t) / 2; + m=&_po2c_lang[n]; + + c=strcmp(msgid, _po2c_msgids[m->msgid]); + + if(c == 0) + return(m->msgstr); + else + if(c < 0) + t=n - 1; + else + b=n + 1; + } + + return(msgid); +} + +const char * po2c_getcharset(void) +{ + if (_po2c_charset) + return _po2c_charset; + else + return "ASCII"; +} + +int po2c_getnumlangs(void) +{ + int n = 0; + while (_po2c_langs[n].lang) + n++; + + return n; +} + +const char * po2c_getlang(int num) +{ + return _po2c_langs[num].lang; +} +EOF + +exit 0; -- cgit v1.2.3 From 09b776ad1f421ac947826771b06c02975b2dcbb9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:45:14 +0000 Subject: AGI: Made proper Tandy emulator default for PC games. svn-id: r49760 --- engines/agi/sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index 9dda3e91f5..cb4e307ea6 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -175,10 +175,10 @@ SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) { switch (_vm->_soundemu) { case SOUND_EMU_NONE: case SOUND_EMU_AMIGA: - case SOUND_EMU_PC: case SOUND_EMU_MAC: _soundGen = new SoundGenSarien(_vm, pMixer); break; + case SOUND_EMU_PC: case SOUND_EMU_PCJR: _soundGen = new SoundGenPCJr(_vm, pMixer); break; -- cgit v1.2.3 From c066372b9bb560ed12537280771a5bfef17ff9e0 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:45:29 +0000 Subject: Mentioned support for GUI translation in NEWS. svn-id: r49761 --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 3e09ab5961..c6fa944575 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Switched to the "fast" DOSBox OPL emulator. - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. - Added support for more original media layouts. + - Added support for GUI localization. AGI: - Fixed number of GFX glitches. -- cgit v1.2.3 From 9867d4ba875a9de5eaad245f395d7c2d22940258 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:45:43 +0000 Subject: Mention AGI sound improvements in NEWS file. svn-id: r49762 --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index c6fa944575..eb98cabbf9 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Fixed number of GFX glitches. - Made PIC drawing code picture perfect. - Added support of MIDI devices. + - Added support for accurate Tandy sound emulation. Switched to it as default. Drascula: - Fixed number of GFX glitches. -- cgit v1.2.3 From 48d0d3008b3e886f06f63a9a67733cb3de8fcb0a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:46:04 +0000 Subject: SCUMM: Fix bug #1879604. Bug 1879604: "MANIACNES: Music not played when loading game". Actually previous attempt to fix this bug was not successful since first entry of script 5 does not have needed functionality. Now we resume music manually. svn-id: r49763 --- engines/scumm/saveload.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 7362dcd8cf..762b38fba2 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -577,6 +577,10 @@ bool ScummEngine::loadState(int slot, bool compat) { // Fixes bug #1766072: MANIACNES: Music Doesn't Start On Load Game if (_game.platform == Common::kPlatformNES) { runScript(5, 0, 0, 0); + + if (VAR(224)) { + _sound->addSoundToQueue(VAR(224)); + } } return true; -- cgit v1.2.3 From ba72975d3f5e88691506c670158ccda2e542013b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:46:23 +0000 Subject: SCUMM: Fix bug #1328120: Bug #1328120: "MANIACNES: Screen width incorrect, camera halts sometimes". Fixed by workaround and was tested with intro and on the kitchen, where now it is possible to see Edna without her noticing you first. svn-id: r49764 --- engines/scumm/scumm.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index bb50ce7bb2..862353bf95 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -2081,6 +2081,12 @@ void ScummEngine::scummLoop_updateScummVars() { if (_game.version >= 7) { VAR(VAR_CAMERA_POS_X) = camera._cur.x; VAR(VAR_CAMERA_POS_Y) = camera._cur.y; + } else if (_game.platform == Common::kPlatformNES) { + // WORKAROUND: + // Since there are 2 2-stripes wide borders in MM NES screen, + // we have to compensate for it here. This fixes paning effects. + // Fixes bug #1328120: "MANIACNES: Screen width incorrect, camera halts sometimes" + VAR(VAR_CAMERA_POS_X) = (camera._cur.x >> V12_X_SHIFT) + 2; } else if (_game.version <= 2) { VAR(VAR_CAMERA_POS_X) = camera._cur.x >> V12_X_SHIFT; } else { -- cgit v1.2.3 From 9ebed7b3d9c1f3f93d44d5e94cdf8669f3f441b6 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:46:37 +0000 Subject: Mention MM NES improvements in NEWS file. svn-id: r49765 --- NEWS | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index eb98cabbf9..b0370098ec 100644 --- a/NEWS +++ b/NEWS @@ -11,24 +11,27 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Added support for more original media layouts. - Added support for GUI localization. - AGI: + AGI: - Fixed number of GFX glitches. - Made PIC drawing code picture perfect. - Added support of MIDI devices. - Added support for accurate Tandy sound emulation. Switched to it as default. - Drascula: + Drascula: - Fixed number of GFX glitches. - Made many cutscenes smoother. - Changed behavior of items menu. Now it shows up on mouse up. - SAGA: - - Fixed graphics glithces in several scenes. - Groovie: - Added support for the Macintosh version of The 7th Guest. - Added support for custom MT-32 instruments. + SAGA: + - Fixed graphics glithces in several scenes. + + SCUMM: + - Several improvements in Maniac Mansion NES. + PSP port: - Switched to new backend design which fixes minor graphical issues, speeds things up, and provides 16-bit support. -- cgit v1.2.3 From 3fafa07ab0aeb65fedad159fb0cf345cc8f5f278 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:47:31 +0000 Subject: GUI: Added in-place hotkeys for widgets. Now it is possible to specify hotkeys in place for ButtonWidget and CheckboxWidget (the only widgets with hotkeys now). Use de-facto standard with putting hotkey between tildes (~). Like '~O~pen'. The tildes gets stripped before after hotkey is extracted. This is done for giving translators possibility to specify their own hotkeys. Old hotkeys defined at widget instance creation are left for leaving possibility to specify non-printable hotkeys such as Common::ASCII_ESCAPE. Translation files were updated respectively. svn-id: r49766 --- common/messages.cpp | 596 +++++++++++++++++++----------------- engines/dialogs.cpp | 22 +- engines/scumm/dialogs.cpp | 7 +- gui/KeysDialog.cpp | 6 +- gui/TabWidget.cpp | 4 +- gui/browser.cpp | 6 +- gui/chooser.cpp | 5 +- gui/launcher.cpp | 36 +-- gui/options.cpp | 34 +-- gui/saveload.cpp | 6 +- gui/themebrowser.cpp | 4 +- gui/widget.cpp | 59 +++- gui/widget.h | 3 + po/POTFILES | 2 + po/hu_HU.po | 760 +++++++++++++++++++++++++++++++++++++++------- po/ru_RU.po | 130 ++++++-- po/scummvm.pot | 130 ++++++-- 17 files changed, 1317 insertions(+), 493 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 6a5fc5d813..5b0846d56f 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -22,14 +22,14 @@ static const char * _po2c_msgids[] = { /* 15 */ "AdLib", /* 16 */ "AdLib emulator:", /* 17 */ "Add Game...", - /* 18 */ "Angol", - /* 19 */ "Antialiased Renderer (16bpp)", - /* 20 */ "Aspect ratio correction", - /* 21 */ "Associated key : %s", - /* 22 */ "Associated key : none", - /* 23 */ "Atari ST MIDI", - /* 24 */ "Audio", - /* 25 */ "Autosave:", + /* 18 */ "Antialiased Renderer (16bpp)", + /* 19 */ "Aspect ratio correction", + /* 20 */ "Associated key : %s", + /* 21 */ "Associated key : none", + /* 22 */ "Atari ST MIDI", + /* 23 */ "Audio", + /* 24 */ "Autosave:", + /* 25 */ "A~b~out...", /* 26 */ "C1Available engines:", /* 27 */ "C1Features compiled in:", /* 28 */ "C2(built on ", @@ -77,123 +77,138 @@ static const char * _po2c_msgids[] = { /* 70 */ "IBM PCjr", /* 71 */ "ID:", /* 72 */ "Invalid Path", - /* 73 */ "Invalid game path", - /* 74 */ "Keys", - /* 75 */ "Language:", - /* 76 */ "Load", - /* 77 */ "Load game:", - /* 78 */ "Load...", - /* 79 */ "MIDI", - /* 80 */ "MIDI gain:", - /* 81 */ "MT-32 Emulation", - /* 82 */ "Map", - /* 83 */ "Mass Add...", - /* 84 */ "Menu", - /* 85 */ "Misc", - /* 86 */ "Mixed AdLib/MIDI mode", - /* 87 */ "Mouse click", - /* 88 */ "Music driver:", - /* 89 */ "Music volume:", - /* 90 */ "Mute All", - /* 91 */ "Name:", - /* 92 */ "Never", - /* 93 */ "No", - /* 94 */ "No date saved", - /* 95 */ "No music", - /* 96 */ "No playtime saved", - /* 97 */ "No time saved", - /* 98 */ "None", - /* 99 */ "OK", - /* 100 */ "Options", - /* 101 */ "Options...", - /* 102 */ "Output rate:", - /* 103 */ "Override global MIDI settings", - /* 104 */ "Override global audio settings", - /* 105 */ "Override global graphic settings", - /* 106 */ "Override global volume settings", - /* 107 */ "PC Speaker", - /* 108 */ "Path not a directory", - /* 109 */ "Path not a file", - /* 110 */ "Path not exists", - /* 111 */ "Paths", - /* 112 */ "Pause", - /* 113 */ "Pick the game:", - /* 114 */ "Platform:", - /* 115 */ "Playtime: ", - /* 116 */ "Please select an action", - /* 117 */ "Plugins Path:", - /* 118 */ "Press the key to associate", - /* 119 */ "Quit", - /* 120 */ "Read permission denied", - /* 121 */ "Reading failed", - /* 122 */ "Remap keys", - /* 123 */ "Remove Game", - /* 124 */ "Render mode:", - /* 125 */ "Resume", - /* 126 */ "Return to Launcher", - /* 127 */ "SEQ", - /* 128 */ "SFX volume:", - /* 129 */ "Save", - /* 130 */ "Save Path:", - /* 131 */ "Save Path: ", - /* 132 */ "Save game:", - /* 133 */ "Scan complete!", - /* 134 */ "Scanned %d directories ...", - /* 135 */ "ScummVM could not find any engine capable of running the selected game!", - /* 136 */ "ScummVM could not find any game in the specified directory!", - /* 137 */ "ScummVM couldn't open the specified directory!", - /* 138 */ "Search:", - /* 139 */ "Select SoundFont", - /* 140 */ "Select a Theme", - /* 141 */ "Select additional game directory", - /* 142 */ "Select an action and click 'Map'", - /* 143 */ "Select directory for GUI themes", - /* 144 */ "Select directory for extra files", - /* 145 */ "Select directory for plugins", - /* 146 */ "Select directory for saved games", - /* 147 */ "Select directory for savegames", - /* 148 */ "Select directory with game data", - /* 149 */ "Skip", - /* 150 */ "Skip line", - /* 151 */ "SoundFont:", - /* 152 */ "Speech & Subs", - /* 153 */ "Speech Only", - /* 154 */ "Speech and Subtitles", - /* 155 */ "Speech volume:", - /* 156 */ "Standard Renderer (16bpp)", - /* 157 */ "Start", - /* 158 */ "Subtitle speed:", - /* 159 */ "Subtitles Only", - /* 160 */ "Szakítani", - /* 161 */ "Tapwave Zodiac", - /* 162 */ "Text and Speech:", - /* 163 */ "The chosen directory cannot be written to. Please select another one.", - /* 164 */ "Theme Path:", - /* 165 */ "Theme:", - /* 166 */ "This game ID is already taken. Please choose another one.", - /* 167 */ "This game does not support loading games from the launcher.", - /* 168 */ "TiMidity", - /* 169 */ "Time: ", - /* 170 */ "True Roland MT-32 (disable GM emulation)", - /* 171 */ "Unable to locate game data", - /* 172 */ "Unknown Error", - /* 173 */ "Unknown error", - /* 174 */ "Unsupported Color Mode", - /* 175 */ "Untitled savestate", - /* 176 */ "User picked target '%s' (gameid '%s')...\n", - /* 177 */ "Volume", - /* 178 */ "Windows MIDI", - /* 179 */ "Write permission denied", - /* 180 */ "Writing data failed", - /* 181 */ "Wrong configuration: Both subtitles and speech are off. Assuming subtitles only", - /* 182 */ "Yamaha Pa1", - /* 183 */ "Yes", - /* 184 */ "You have to restart ScummVM to take the effect.", - /* 185 */ "every 10 mins", - /* 186 */ "every 15 mins", - /* 187 */ "every 30 mins", - /* 188 */ "every 5 mins", - /* 189 */ "failed\n", + /* 73 */ "Keys", + /* 74 */ "Language:", + /* 75 */ "Load", + /* 76 */ "Load game:", + /* 77 */ "Load...", + /* 78 */ "MIDI", + /* 79 */ "MIDI gain:", + /* 80 */ "MT-32 Emulation", + /* 81 */ "Map", + /* 82 */ "Mass Add...", + /* 83 */ "Menu", + /* 84 */ "Misc", + /* 85 */ "Mixed AdLib/MIDI mode", + /* 86 */ "Mouse click", + /* 87 */ "Music driver:", + /* 88 */ "Music volume:", + /* 89 */ "Mute All", + /* 90 */ "Name:", + /* 91 */ "Never", + /* 92 */ "No", + /* 93 */ "No date saved", + /* 94 */ "No music", + /* 95 */ "No playtime saved", + /* 96 */ "No time saved", + /* 97 */ "None", + /* 98 */ "OK", + /* 99 */ "Options", + /* 100 */ "Options...", + /* 101 */ "Output rate:", + /* 102 */ "Override global MIDI settings", + /* 103 */ "Override global audio settings", + /* 104 */ "Override global graphic settings", + /* 105 */ "Override global volume settings", + /* 106 */ "PC Speaker", + /* 107 */ "Path not a directory", + /* 108 */ "Path not a file", + /* 109 */ "Path not exists", + /* 110 */ "Paths", + /* 111 */ "Pause", + /* 112 */ "Pick the game:", + /* 113 */ "Platform:", + /* 114 */ "Playtime: ", + /* 115 */ "Please select an action", + /* 116 */ "Plugins Path:", + /* 117 */ "Press the key to associate", + /* 118 */ "Quit", + /* 119 */ "Read permission denied", + /* 120 */ "Reading failed", + /* 121 */ "Remap keys", + /* 122 */ "Remove Game", + /* 123 */ "Render mode:", + /* 124 */ "Resume", + /* 125 */ "Return to Launcher", + /* 126 */ "SEQ", + /* 127 */ "SFX volume:", + /* 128 */ "Save", + /* 129 */ "Save Path:", + /* 130 */ "Save Path: ", + /* 131 */ "Save game:", + /* 132 */ "Scan complete!", + /* 133 */ "Scanned %d directories ...", + /* 134 */ "ScummVM could not find any engine capable of running the selected game!", + /* 135 */ "ScummVM could not find any game in the specified directory!", + /* 136 */ "ScummVM couldn't open the specified directory!", + /* 137 */ "Search:", + /* 138 */ "Select SoundFont", + /* 139 */ "Select a Theme", + /* 140 */ "Select additional game directory", + /* 141 */ "Select an action and click 'Map'", + /* 142 */ "Select directory for GUI themes", + /* 143 */ "Select directory for extra files", + /* 144 */ "Select directory for plugins", + /* 145 */ "Select directory for saved games", + /* 146 */ "Select directory for savegames", + /* 147 */ "Select directory with game data", + /* 148 */ "Skip", + /* 149 */ "Skip line", + /* 150 */ "SoundFont:", + /* 151 */ "Speech & Subs", + /* 152 */ "Speech Only", + /* 153 */ "Speech and Subtitles", + /* 154 */ "Speech volume:", + /* 155 */ "Standard Renderer (16bpp)", + /* 156 */ "Start", + /* 157 */ "Subtitle speed:", + /* 158 */ "Subtitles Only", + /* 159 */ "Tapwave Zodiac", + /* 160 */ "Text and Speech:", + /* 161 */ "The chosen directory cannot be written to. Please select another one.", + /* 162 */ "Theme Path:", + /* 163 */ "Theme:", + /* 164 */ "This game ID is already taken. Please choose another one.", + /* 165 */ "This game does not support loading games from the launcher.", + /* 166 */ "TiMidity", + /* 167 */ "Time: ", + /* 168 */ "True Roland MT-32 (disable GM emulation)", + /* 169 */ "Unknown Error", + /* 170 */ "Unsupported Color Mode", + /* 171 */ "Untitled savestate", + /* 172 */ "User picked target '%s' (gameid '%s')...\n", + /* 173 */ "Volume", + /* 174 */ "Windows MIDI", + /* 175 */ "Write permission denied", + /* 176 */ "Writing data failed", + /* 177 */ "Yamaha Pa1", + /* 178 */ "Yes", + /* 179 */ "You have to restart ScummVM to take the effect.", + /* 180 */ "every 10 mins", + /* 181 */ "every 15 mins", + /* 182 */ "every 30 mins", + /* 183 */ "every 5 mins", + /* 184 */ "failed\n", + /* 185 */ "~A~bout", + /* 186 */ "~A~dd Game...", + /* 187 */ "~C~ancel", + /* 188 */ "~C~lose", + /* 189 */ "~E~dit Game...", + /* 190 */ "~H~elp", + /* 191 */ "~K~eys", + /* 192 */ "~L~oad", + /* 193 */ "~L~oad...", + /* 194 */ "~N~ext", + /* 195 */ "~O~K", + /* 196 */ "~O~ptions", + /* 197 */ "~O~ptions...", + /* 198 */ "~P~revious", + /* 199 */ "~Q~uit", + /* 200 */ "~R~emove Game", + /* 201 */ "~R~esume", + /* 202 */ "~R~eturn to Launcher", + /* 203 */ "~S~ave", + /* 204 */ "~S~tart", NULL }; @@ -203,7 +218,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-08 17:25+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 17:42+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, @@ -221,13 +236,14 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 15, "AdLib" }, { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, { 17, "\315\356\342. \350\343\360\340..." }, - { 19, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 20, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 21, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 23, "Atars ST MIDI" }, - { 24, "\300\363\344\350\356" }, - { 25, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 18, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 19, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 20, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 21, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 22, "Atars ST MIDI" }, + { 23, "\300\363\344\350\356" }, + { 24, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 25, "\316 \357~\360~\356\343\360\340\354\354\345..." }, { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, { 27, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, { 28, "C2(\361\356\341\360\340\355 " }, @@ -275,161 +291,191 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 70, "IBM PCjr" }, { 71, "ID:" }, { 72, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 74, "\312\353\340\342\350\370\350" }, - { 75, "\337\347\373\352:" }, - { 76, "\307\340\343\360\363\347\350\362\374" }, - { 77, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 78, "\307\340\343\360...." }, - { 79, "MIDI" }, - { 80, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 81, "\335\354\363\353\377\366\350\377 MT-32" }, - { 82, "\315\340\347\355\340\367\350\362\374" }, - { 83, "\304\356\341. \354\355\356\343\356..." }, - { 84, "\314\345\355\376" }, - { 85, "\320\340\347\355\356\345" }, - { 86, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 87, "\312\353\350\352 \354\373\370\374\376" }, - { 88, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 89, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 90, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 91, "\315\340\347\342\340\355\350\345:" }, - { 92, "\315\350\352\356\343\344\340" }, - { 93, "\315\345\362" }, - { 94, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 95, "\301\345\347 \354\363\347\373\352\350" }, - { 96, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 97, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 98, "\315\345 \347\340\344\340\355" }, - { 99, "OK" }, - { 100, "\316\357\366\350\350" }, - { 101, "\316\357\366\350\350..." }, - { 102, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 107, "PC \361\357\350\352\345\360" }, - { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 109, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 110, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 111, "\317\363\362\350" }, - { 112, "\317\340\363\347\340" }, - { 113, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 114, "\317\353\340\362\364\356\360\354\340:" }, - { 115, "\302\360\345\354\377 \350\343\360\373: " }, - { 116, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 117, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 118, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 119, "\302\373\365\356\344" }, - { 120, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 121, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 122, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 123, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 124, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 125, "\317\360\356\344\356\353\346\350\362\374" }, - { 126, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 127, "SEQ" }, - { 128, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 129, "\307\340\357\350\361\340\362\374" }, - { 130, "\317\363\362\374 \361\356\365\360.: " }, - { 131, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 132, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 133, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 134, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 135, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 136, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 137, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 138, "\317\356\350\361\352:" }, - { 139, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 140, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 141, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 142, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 73, "\312\353\340\342\350\370\350" }, + { 74, "\337\347\373\352:" }, + { 75, "\307\340\343\360\363\347\350\362\374" }, + { 76, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 77, "\307\340\343\360...." }, + { 78, "MIDI" }, + { 79, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 80, "\335\354\363\353\377\366\350\377 MT-32" }, + { 81, "\315\340\347\355\340\367\350\362\374" }, + { 82, "\304\356\341. \354\355\356\343\356..." }, + { 83, "\314\345\355\376" }, + { 84, "\320\340\347\355\356\345" }, + { 85, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 86, "\312\353\350\352 \354\373\370\374\376" }, + { 87, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 88, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 89, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 90, "\315\340\347\342\340\355\350\345:" }, + { 91, "\315\350\352\356\343\344\340" }, + { 92, "\315\345\362" }, + { 93, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 94, "\301\345\347 \354\363\347\373\352\350" }, + { 95, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 96, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 97, "\315\345 \347\340\344\340\355" }, + { 98, "OK" }, + { 99, "\316\357\366\350\350" }, + { 100, "\316\357\366\350\350..." }, + { 101, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 102, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 106, "PC \361\357\350\352\345\360" }, + { 107, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 109, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 110, "\317\363\362\350" }, + { 111, "\317\340\363\347\340" }, + { 112, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 113, "\317\353\340\362\364\356\360\354\340:" }, + { 114, "\302\360\345\354\377 \350\343\360\373: " }, + { 115, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 116, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 117, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 118, "\302\373\365\356\344" }, + { 119, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 120, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 121, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 122, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 123, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 124, "\317\360\356\344\356\353\346\350\362\374" }, + { 125, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 126, "SEQ" }, + { 127, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 128, "\307\340\357\350\361\340\362\374" }, + { 129, "\317\363\362\374 \361\356\365\360.: " }, + { 130, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 131, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 132, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 133, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 134, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 135, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 136, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 137, "\317\356\350\361\352:" }, + { 138, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 139, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 140, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 141, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 142, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, { 146, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 149, "\317\360\356\357\363\361\362\350\362\374" }, - { 150, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 151, "SoundFont:" }, - { 152, "\307\342\363\352 \350 \361\363\341." }, - { 153, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 154, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 155, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 156, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 157, "\317\363\361\352" }, - { 158, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 159, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 161, "Tapware Zodiac" }, - { 162, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 163, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 164, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 165, "\322\345\354\340:" }, - { 166, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 167, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 168, "TiMidity" }, - { 169, "\302\360\345\354\377: " }, - { 170, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 172, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 174, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 175, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 176, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 177, "\303\360\356\354\352\356\361\362\374" }, - { 178, "Windows MIDI" }, - { 179, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 180, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 182, "Yamaha Pa1" }, - { 183, "\304\340" }, - { 184, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 185, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 186, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 187, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 188, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 189, "\355\345 \363\344\340\353\356\361\374\n" }, + { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 148, "\317\360\356\357\363\361\362\350\362\374" }, + { 149, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 150, "SoundFont:" }, + { 151, "\307\342\363\352 \350 \361\363\341." }, + { 152, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 153, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 154, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 155, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 156, "\317\363\361\352" }, + { 157, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 158, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 159, "Tapware Zodiac" }, + { 160, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 161, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 162, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 163, "\322\345\354\340:" }, + { 164, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 165, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 166, "TiMidity" }, + { 167, "\302\360\345\354\377: " }, + { 168, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 169, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 170, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 171, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 172, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 173, "\303\360\356\354\352\356\361\362\374" }, + { 174, "Windows MIDI" }, + { 175, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 176, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 177, "Yamaha Pa1" }, + { 178, "\304\340" }, + { 179, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 180, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 181, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 182, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 183, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 184, "\355\345 \363\344\340\353\356\361\374\n" }, + { 185, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 186, "~\304~\356\341. \350\343\360\363..." }, + { 187, "\316~\362~\354\345\355\340" }, + { 188, "~\307~\340\352\360\373\362\374" }, + { 189, "\310\347~\354~. \350\343\360\363..." }, + { 190, "~\317~\356\354\356\371\374" }, + { 191, "~\312~\353\340\342\350\370\350" }, + { 192, "~\307~\340\343\360\363\347\350\362\374" }, + { 193, "~\307~\340\343\360...." }, + { 194, "~\321~\353\345\344" }, + { 195, "~O~K" }, + { 196, "~\316~\357\366\350\350" }, + { 197, "~\316~\357\366\350\350..." }, + { 198, "~\317~\360\345\344" }, + { 199, "~\302~\373\365\356\344" }, + { 200, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 201, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 202, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 203, "~\307~\340\357\350\361\340\362\374" }, + { 204, "\317~\363~\361\352" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\nPOT-Creation-Date: 2009-11-25 07:10-0500\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=ASCII\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 17:42+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 11, "" }, + { 15, "Hang" }, { 16, "AdLib vezet :" }, - { 20, "Aspect adag korrekci\363" }, - { 24, "Hang" }, - { 25, "Automatikus ment\351s:" }, + { 19, "Aspect adag korrekci\363" }, + { 23, "Hang" }, + { 24, "Automatikus ment\351s:" }, + { 35, "Hang" }, + { 41, "" }, { 51, "K\351pess\351 Roland GS Mode" }, { 55, "Extra \332tvonal:" }, { 59, "Teljes k\351perny s m\363d:" }, { 61, "Lek\351pez eszk\366z GUI:" }, + { 65, "Extra \332tvonal:" }, { 67, "Grafik\341val" }, { 68, "Grafikus m\363d:" }, - { 74, "Kulcsok" }, - { 80, "MIDI nyeres\351g:" }, - { 86, "Vegyes AdLib/MIDI m\363d" }, - { 88, "Zenei vezet :" }, - { 89, "Zene mennyis\351g:" }, - { 90, "Muta \326sszes" }, - { 92, "Soha" }, - { 98, "Semmi" }, - { 99, "Igen" }, - { 102, "Kimeneti teljes\355tm\351ny:" }, + { 73, "Kulcsok" }, + { 79, "MIDI nyeres\351g:" }, + { 85, "Vegyes AdLib/MIDI m\363d" }, + { 87, "Zenei vezet :" }, + { 88, "Zene mennyis\351g:" }, + { 89, "Muta \326sszes" }, + { 91, "Soha" }, + { 92, "Semmi" }, + { 97, "Semmi" }, + { 98, "Igen" }, + { 101, "Kimeneti teljes\355tm\351ny:" }, + { 110, "\326sv\351nyek" }, { 111, "\326sv\351nyek" }, - { 124, "Renderel\351si m\363d:" }, - { 128, "SFX mennyis\351ge" }, - { 152, "Besz\351d s Feliratok" }, - { 153, "Csak a besz\351d" }, - { 154, "Besz\351d \351s a Feliratok" }, - { 155, "Besz\351d mennyis\351g:" }, - { 158, "Felirat sebess\351g:" }, - { 159, "Csak feliratok" }, - { 162, "Sz\366veg \351s besz\351d:" }, - { 165, "T\351ma:" }, - { 170, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 177, "Volumene" }, - { 185, "10 percenk\351nt" }, - { 186, "15 percenk\351nt" }, - { 187, "30 percenk\351nt" }, - { 188, "5 percenk\351nt" }, + { 123, "Renderel\351si m\363d:" }, + { 127, "SFX mennyis\351ge" }, + { 129, "Extra \332tvonal:" }, + { 151, "Besz\351d s Feliratok" }, + { 152, "Csak a besz\351d" }, + { 153, "Besz\351d \351s a Feliratok" }, + { 154, "Besz\351d mennyis\351g:" }, + { 157, "Felirat sebess\351g:" }, + { 158, "Csak feliratok" }, + { 160, "Sz\366veg \351s besz\351d:" }, + { 163, "T\351ma:" }, + { 167, "T\351ma:" }, + { 168, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 173, "Volumene" }, + { 180, "10 percenk\351nt" }, + { 181, "15 percenk\351nt" }, + { 182, "30 percenk\351nt" }, + { 183, "5 percenk\351nt" }, + { 191, "Kulcsok" }, + { 195, "Igen" }, { -1, NULL } }; @@ -439,7 +485,7 @@ static struct { struct _po2c_msg * msgs; } _po2c_langs[] = { { "ru_RU", "cp1251", _po2c_lang_ru_RU }, - { "hu_HU", "ASCII", _po2c_lang_hu_HU }, + { "hu_HU", "cp1250", _po2c_lang_hu_HU }, { NULL, NULL, NULL } }; diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 4e4a656cc0..0f391692e8 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -86,31 +86,31 @@ MainMenuDialog::MainMenuDialog(Engine *engine) StaticTextWidget *version = new StaticTextWidget(this, "GlobalMenu.Version", gScummVMVersionDate); version->setAlign(Graphics::kTextAlignCenter); - new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("Resume"), kPlayCmd, 'P'); + new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("~R~esume"), kPlayCmd, 'P'); - _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("Load"), kLoadCmd, 'L'); + _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("~L~oad"), kLoadCmd); // TODO: setEnabled -> setVisible _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsLoadingDuringRuntime)); - _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("Save"), kSaveCmd, 'S'); + _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("~S~ave"), kSaveCmd); // TODO: setEnabled -> setVisible _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsSavingDuringRuntime)); - new GUI::ButtonWidget(this, "GlobalMenu.Options", _("Options"), kOptionsCmd, 'O'); + new GUI::ButtonWidget(this, "GlobalMenu.Options", _("~O~ptions"), kOptionsCmd); // The help button is disabled by default. // To enable "Help", an engine needs to use a subclass of MainMenuDialog // (at least for now, we might change how this works in the future). - _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("Help"), kHelpCmd, 'H'); + _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("~H~elp"), kHelpCmd); _helpButton->setEnabled(false); - new GUI::ButtonWidget(this, "GlobalMenu.About", _("About"), kAboutCmd, 'A'); + new GUI::ButtonWidget(this, "GlobalMenu.About", _("~A~bout"), kAboutCmd); - _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("Return to Launcher"), kRTLCmd, 'R'); + _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("~R~eturn to Launcher"), kRTLCmd); _rtlButton->setEnabled(_engine->hasFeature(Engine::kSupportsRTL)); - new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("Quit"), kQuitCmd, 'Q'); + new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("~Q~uit"), kQuitCmd); _aboutDialog = new GUI::AboutDialog(); _optionsDialog = new ConfigDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions)); @@ -298,11 +298,11 @@ ConfigDialog::ConfigDialog(bool subtitleControls) // Add the buttons // - new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("OK"), GUI::kOKCmd, 'O'); - new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("Cancel"), GUI::kCloseCmd, 'C'); + new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("~O~K"), GUI::kOKCmd); + new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("~C~ancel"), GUI::kCloseCmd); #ifdef SMALL_SCREEN_DEVICE - new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("Keys"), kKeysCmd, 'K'); + new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("~K~eys"), kKeysCmd); _keysDialog = NULL; #endif } diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp index d9c24ddca2..258b1875fe 100644 --- a/engines/scumm/dialogs.cpp +++ b/engines/scumm/dialogs.cpp @@ -26,6 +26,7 @@ #include "common/savefile.h" #include "common/system.h" #include "common/events.h" +#include "common/translation.h" #include "graphics/scaler.h" @@ -283,9 +284,9 @@ HelpDialog::HelpDialog(const GameSettings &game) _numPages = ScummHelp::numPages(_game.id); - _prevButton = new GUI::ButtonWidget(this, "ScummHelp.Prev", "Previous", kPrevCmd, 'P'); - _nextButton = new GUI::ButtonWidget(this, "ScummHelp.Next", "Next", kNextCmd, 'N'); - new GUI::ButtonWidget(this, "ScummHelp.Close", "Close", GUI::kCloseCmd, 'C'); + _prevButton = new GUI::ButtonWidget(this, "ScummHelp.Prev", _("~P~revious"), kPrevCmd); + _nextButton = new GUI::ButtonWidget(this, "ScummHelp.Next", _("~N~ext"), kNextCmd); + new GUI::ButtonWidget(this, "ScummHelp.Close", _("~C~lose"), GUI::kCloseCmd); _prevButton->clearFlags(WIDGET_ENABLED); _numLines = HELP_NUM_LINES; diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp index 65b14f9078..85ee53b72e 100644 --- a/gui/KeysDialog.cpp +++ b/gui/KeysDialog.cpp @@ -40,9 +40,9 @@ enum { KeysDialog::KeysDialog(const Common::String &title) : GUI::Dialog("KeysDialog") { - new ButtonWidget(this, "KeysDialog.Map", _("Map"), kMapCmd, 0); - new ButtonWidget(this, "KeysDialog.Ok", _("OK"), kOKCmd, 0); - new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "KeysDialog.Map", _("Map"), kMapCmd); + new ButtonWidget(this, "KeysDialog.Ok", _("OK"), kOKCmd); + new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), kCloseCmd); _actionsList = new ListWidget(this, "KeysDialog.List"); _actionsList->setNumberingMode(kListNumberingZero); diff --git a/gui/TabWidget.cpp b/gui/TabWidget.cpp index 3eb45297f3..691eebf033 100644 --- a/gui/TabWidget.cpp +++ b/gui/TabWidget.cpp @@ -63,8 +63,8 @@ void TabWidget::init() { int x = _w - _butRP - _butW * 2 - 2; int y = _butTP - _tabHeight; - _navLeft = new ButtonWidget(this, x, y, _butW, _butH, "<", kCmdLeft, 0); - _navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", kCmdRight, 0); + _navLeft = new ButtonWidget(this, x, y, _butW, _butH, "<", kCmdLeft); + _navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", kCmdRight); } TabWidget::~TabWidget() { diff --git a/gui/browser.cpp b/gui/browser.cpp index 86fadf667e..000359e1e7 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -66,9 +66,9 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Up", _("Go up"), kGoUpCmd, 0); - new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); + new ButtonWidget(this, "Browser.Up", _("Go up"), kGoUpCmd); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd); } void BrowserDialog::open() { diff --git a/gui/chooser.cpp b/gui/chooser.cpp index 0155bb2afb..7039e40947 100644 --- a/gui/chooser.cpp +++ b/gui/chooser.cpp @@ -23,6 +23,7 @@ */ #include "common/system.h" +#include "common/translation.h" #include "gui/chooser.h" #include "gui/GuiManager.h" #include "gui/ListWidget.h" @@ -45,8 +46,8 @@ ChooserDialog::ChooserDialog(const String &title, String dialogId) _list->setEditable(false); // Buttons - new ButtonWidget(this, dialogId + ".Cancel", "Cancel", kCloseCmd, 0); - _chooseButton = new ButtonWidget(this, dialogId + ".Choose", "Choose", kChooseCmd, 0); + new ButtonWidget(this, dialogId + ".Cancel", _("Cancel"), kCloseCmd); + _chooseButton = new ButtonWidget(this, dialogId + ".Choose", _("Choose"), kChooseCmd); _chooseButton->setEnabled(false); } diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 3634ef7e3d..b12c56dbde 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -202,7 +202,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); - _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), kCmdGlobalGraphicsOverride, 0); + _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), kCmdGlobalGraphicsOverride); addGraphicControls(tab, "GameOptions_Graphics."); @@ -211,7 +211,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("Audio")); - _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), kCmdGlobalAudioOverride, 0); + _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), kCmdGlobalAudioOverride); addAudioControls(tab, "GameOptions_Audio."); addSubtitleControls(tab, "GameOptions_Audio."); @@ -221,7 +221,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("Volume")); - _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), kCmdGlobalVolumeOverride, 0); + _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), kCmdGlobalVolumeOverride); addVolumeControls(tab, "GameOptions_Volume."); @@ -230,7 +230,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("MIDI")); - _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), kCmdGlobalMIDIOverride, 0); + _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), kCmdGlobalMIDIOverride); if (_guioptions & Common::GUIO_NOMIDI) _globalMIDIOverride->setEnabled(false); @@ -246,15 +246,15 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // in the small version of the GUI. // GUI: Button + Label for the game path - new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), kCmdGameBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), kCmdGameBrowser); _gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath); // GUI: Button + Label for the additional path - new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), kCmdExtraBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), kCmdExtraBrowser); _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath); // GUI: Button + Label for the save path - new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), kCmdSaveBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), kCmdSaveBrowser); _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath); // Activate the first tab @@ -262,8 +262,8 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), kCloseCmd, 0); - new ButtonWidget(this, "GameOptions.Ok", _("OK"), kOKCmd, 0); + new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), kCloseCmd); + new ButtonWidget(this, "GameOptions.Ok", _("OK"), kOKCmd); } void EditGameDialog::open() { @@ -497,22 +497,22 @@ LauncherDialog::LauncherDialog() new StaticTextWidget(this, "Launcher.Version", gScummVMFullVersion); #endif - new ButtonWidget(this, "Launcher.QuitButton", _("Quit"), kQuitCmd, 'Q'); - new ButtonWidget(this, "Launcher.AboutButton", _("About..."), kAboutCmd, 'B'); - new ButtonWidget(this, "Launcher.OptionsButton", _("Options..."), kOptionsCmd, 'O'); + new ButtonWidget(this, "Launcher.QuitButton", _("~Q~uit"), kQuitCmd); + new ButtonWidget(this, "Launcher.AboutButton", _("A~b~out..."), kAboutCmd); + new ButtonWidget(this, "Launcher.OptionsButton", _("~O~ptions..."), kOptionsCmd); _startButton = - new ButtonWidget(this, "Launcher.StartButton", _("Start"), kStartCmd, 'S'); + new ButtonWidget(this, "Launcher.StartButton", _("~S~tart"), kStartCmd); _loadButton = - new ButtonWidget(this, "Launcher.LoadGameButton", _("Load..."), kLoadGameCmd, 'L'); + new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), kLoadGameCmd); // Above the lowest button rows: two more buttons (directly below the list box) _addButton = - new ButtonWidget(this, "Launcher.AddGameButton", _("Add Game..."), kAddGameCmd, 'A'); + new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), kAddGameCmd); _editButton = - new ButtonWidget(this, "Launcher.EditGameButton", _("Edit Game..."), kEditGameCmd, 'E'); + new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), kEditGameCmd); _removeButton = - new ButtonWidget(this, "Launcher.RemoveGameButton", _("Remove Game"), kRemoveGameCmd, 'R'); + new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), kRemoveGameCmd); // Search box _searchDesc = 0; @@ -526,7 +526,7 @@ LauncherDialog::LauncherDialog() _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, kSearchCmd); - _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", kSearchClearCmd, 0); + _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", kSearchClearCmd); // Add list with game titles _list = new ListWidget(this, "Launcher.GameList", kListSearchCmd); diff --git a/gui/options.cpp b/gui/options.cpp index 9ea3c7a1e8..be83624254 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -613,10 +613,10 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr } // Fullscreen checkbox - _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode"), 0, 0); + _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode")); // Aspect ratio checkbox - _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction"), 0, 0); + _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction")); _enableGraphicSettings = true; } @@ -657,18 +657,18 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { // SoundFont - _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), kChooseSoundFontCmd, 0); + _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), kChooseSoundFontCmd); _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None")); - _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", kClearSoundFontCmd, 0); + _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", kClearSoundFontCmd); // Multi midi setting - _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode"), 0, 0); + _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode")); // Native mt32 setting - _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), 0, 0); + _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)")); // GS Extensions setting - _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), 0, 0); + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode")); // MIDI gain setting (FluidSynth uses this) _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); @@ -685,7 +685,7 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) { _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:")); - _subToggleButton = new ButtonWidget(boss, prefix + "subToggleButton", "", kSubtitleToggle, 0); + _subToggleButton = new ButtonWidget(boss, prefix + "subToggleButton", "", kSubtitleToggle); // Subtitle speed _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:")); @@ -707,7 +707,7 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _musicVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _musicVolumeLabel->setFlags(WIDGET_CLEARBG); - _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), kMuteAllChanged, 0); + _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), kMuteAllChanged); _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:")); @@ -794,24 +794,24 @@ GlobalOptionsDialog::GlobalOptionsDialog() // truncated in the small version of the GUI. // Save game path - new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), kChooseSaveDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), kChooseSaveDirCmd); _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar"); - new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), kChooseThemeDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), kChooseThemeDirCmd); _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None")); - new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), kChooseExtraDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), kChooseExtraDirCmd); _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None")); #ifdef DYNAMIC_MODULES - new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), kChoosePluginsDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), kChoosePluginsDirCmd); _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _("None")); #endif #endif tab->addTab(_("Misc")); - new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), kChooseThemeCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), kChooseThemeCmd); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); @@ -829,7 +829,7 @@ GlobalOptionsDialog::GlobalOptionsDialog() } #ifdef SMALL_SCREEN_DEVICE - new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), kChooseKeyMappingCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), kChooseKeyMappingCmd); #endif // TODO: joystick setting @@ -858,8 +858,8 @@ GlobalOptionsDialog::GlobalOptionsDialog() _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), kCloseCmd, 0); - new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), kOKCmd, 0); + new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), kCloseCmd); + new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), kOKCmd); #ifdef SMALL_SCREEN_DEVICE _keysDialog = new KeysDialog(); diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 85bbd252c7..bd5aadc206 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -62,11 +62,11 @@ SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel) _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), kCloseCmd, 0); - _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, kChooseCmd, 0); + new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), kCloseCmd); + _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, kChooseCmd); _chooseButton->setEnabled(false); - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), kDelCmd, 0); + _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), kDelCmd); _deleteButton->setEnabled(false); _delSupport = _metaInfoSupport = _thumbnailSupport = false; diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp index 43a9ed8d0a..987408e1b4 100644 --- a/gui/themebrowser.cpp +++ b/gui/themebrowser.cpp @@ -53,8 +53,8 @@ ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd); } void ThemeBrowser::open() { diff --git a/gui/widget.cpp b/gui/widget.cpp index e4b37dc3c2..c47c6099ba 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -177,6 +177,51 @@ bool Widget::isVisible() const { return !(_flags & WIDGET_INVISIBLE); } +uint8 Widget::parseHotkey(const Common::String &label) { + if (!label.contains('~')) + return 0; + + int state = 0; + uint8 hotkey = 0; + + for (uint i = 0; i < label.size() && state != 3; i++) { + switch (state) { + case 0: + if (label[i] == '~') + state = 1; + break; + case 1: + if (label[i] != '~') { + state = 2; + hotkey = label[i]; + } else + state = 0; + break; + case 2: + if (label[i] == '~') + state = 3; + else + state = 0; + break; + } + } + + if (state == 3) + return hotkey; + + return 0; +} + +Common::String Widget::cleanupHotkey(const Common::String &label) { + Common::String res; + + for (uint i = 0; i < label.size() ; i++) + if (label[i] != '~') + res = res + label[i]; + + return res; +} + #pragma mark - StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align) @@ -228,15 +273,21 @@ void StaticTextWidget::drawWidget() { #pragma mark - ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, uint32 cmd, uint8 hotkey) - : StaticTextWidget(boss, x, y, w, h, label, Graphics::kTextAlignCenter), CommandSender(boss), - _cmd(cmd), _hotkey(hotkey) { + : StaticTextWidget(boss, x, y, w, h, cleanupHotkey(label), Graphics::kTextAlignCenter), CommandSender(boss), + _cmd(cmd) { + + if (hotkey == 0) + _hotkey = parseHotkey(label); + setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG); _type = kButtonWidget; } ButtonWidget::ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, uint32 cmd, uint8 hotkey) - : StaticTextWidget(boss, name, label), CommandSender(boss), - _cmd(cmd), _hotkey(hotkey) { + : StaticTextWidget(boss, name, cleanupHotkey(label)), CommandSender(boss), + _cmd(cmd) { + if (hotkey == 0) + _hotkey = parseHotkey(label); setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG); _type = kButtonWidget; } diff --git a/gui/widget.h b/gui/widget.h index ebadc53241..3bbc565bbe 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -135,6 +135,9 @@ public: void setVisible(bool e); bool isVisible() const; + uint8 parseHotkey(const Common::String &label); + Common::String cleanupHotkey(const Common::String &label); + protected: void updateState(int oldFlags, int newFlags); diff --git a/po/POTFILES b/po/POTFILES index a8f672d01c..6a2d426e4d 100755 --- a/po/POTFILES +++ b/po/POTFILES @@ -2,6 +2,7 @@ gui/about.cpp gui/browser.cpp +gui/chooser.cpp gui/error.cpp gui/GuiManager.cpp gui/KeysDialog.cpp @@ -17,6 +18,7 @@ base/main.cpp common/error.cpp engines/dialogs.cpp +engines/scumm/dialogs.cpp sound/mididrv.cpp diff --git a/po/hu_HU.po b/po/hu_HU.po index bdc4371212..329d62b721 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -1,18 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2010-06-08 13:39-0100\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - # LANGUAGE translation for ScummVM. # Copyright (C) 2009 ScummVM # This file is distributed under the same license as the ScummVM package. @@ -21,16 +6,328 @@ msgstr "" msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" -"Report-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2009-11-25 07:10-0500\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-10 17:42+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ASCII\n" +"Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: gui/about.cpp:117 +msgid "C2(built on " +msgstr "" + +#: gui/about.cpp:125 +msgid "C1Features compiled in:" +msgstr "" + +#: gui/about.cpp:132 +msgid "C1Available engines:" +msgstr "" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "" + +#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 +#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 +#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 +#: gui/options.cpp:861 gui/chooser.cpp:49 +msgid "Cancel" +msgstr "" + +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 +msgid "Choose" +msgstr "" + +#: gui/GuiManager.cpp:75 +msgid "Failed to load any GUI theme, aborting" +msgstr "" + +#: gui/GuiManager.cpp:98 +msgid "Close" +msgstr "" + +#: gui/GuiManager.cpp:101 +msgid "Mouse click" +msgstr "" + +#: gui/GuiManager.cpp:104 base/main.cpp:284 +msgid "Display keyboard" +msgstr "" + +#: gui/GuiManager.cpp:107 base/main.cpp:287 +msgid "Remap keys" +msgstr "" + +#: gui/KeysDialog.cpp:43 +msgid "Map" +msgstr "" + +#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 +#: engines/dialogs.cpp:301 gui/options.cpp:862 +msgid "OK" +msgstr "Igen" + +#: gui/KeysDialog.cpp:51 +msgid "Select an action and click 'Map'" +msgstr "" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : %s" +msgstr "" + +#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#, c-format +msgid "Associated key : none" +msgstr "" + +#: gui/KeysDialog.cpp:92 +msgid "Please select an action" +msgstr "" + +#: gui/KeysDialog.cpp:108 +msgid "Press the key to associate" +msgstr "" + +#: gui/KeysDialog.cpp:147 +msgid "Choose an action to map" +msgstr "" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "" + +#: gui/launcher.cpp:181 gui/options.cpp:839 +msgid "Language:" +msgstr "" + +#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 +msgid "" +msgstr "" + +#: gui/launcher.cpp:191 +msgid "Platform:" +msgstr "" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "Graphics" +msgstr "Grafikával" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "GFX" +msgstr "" + +#: gui/launcher.cpp:205 +msgid "Override global graphic settings" +msgstr "" + +#: gui/launcher.cpp:212 gui/options.cpp:772 +msgid "Audio" +msgstr "Hang" + +#: gui/launcher.cpp:214 +msgid "Override global audio settings" +msgstr "" + +#: gui/launcher.cpp:222 gui/options.cpp:776 +msgid "Volume" +msgstr "Volumene" + +#: gui/launcher.cpp:224 +msgid "Override global volume settings" +msgstr "" + +#: gui/launcher.cpp:231 gui/options.cpp:784 +msgid "MIDI" +msgstr "" + +#: gui/launcher.cpp:233 +msgid "Override global MIDI settings" +msgstr "" + +#: gui/launcher.cpp:243 gui/options.cpp:790 +msgid "Paths" +msgstr "Ösvények" + +#: gui/launcher.cpp:249 +#, fuzzy +msgid "Game Path:" +msgstr "Extra Útvonal:" + +#: gui/launcher.cpp:253 gui/options.cpp:803 +msgid "Extra Path:" +msgstr "Extra Útvonal:" + +#: gui/launcher.cpp:257 +#, fuzzy +msgid "Save Path:" +msgstr "Extra Útvonal:" + +#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 +#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 +#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 +#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 +#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 +#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 +#: gui/options.cpp:946 gui/options.cpp:1045 +msgid "None" +msgstr "Semmi" + +#: gui/launcher.cpp:279 gui/launcher.cpp:357 +#, fuzzy +msgid "Default" +msgstr "" + +#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +msgid "Select SoundFont" +msgstr "" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "Quit" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Options..." +msgstr "" + +#: gui/launcher.cpp:504 +msgid "Start" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "Load..." +msgstr "" + +#: gui/launcher.cpp:511 gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Edit Game..." +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove Game" +msgstr "" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +msgid "Load" +msgstr "" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "Yes" +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#, fuzzy +msgid "No" +msgstr "Semmi" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "" + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "" + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "" + +#: gui/massadd.cpp:244 +#, c-format +msgid "Scan complete!" +msgstr "" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "" + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "" + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "" + #: gui/options.cpp:71 msgid "Never" msgstr "Soha" @@ -51,21 +348,16 @@ msgstr "15 percenk msgid "every 30 mins" msgstr "30 percenként" -#: gui/options.cpp:73 gui/options.cpp:598 gui/options.cpp:608 -#: gui/options.cpp:838 -msgid "" -msgstr "" - #: gui/options.cpp:73 -msgid "22 kHz" +msgid "8 kHz" msgstr "" #: gui/options.cpp:73 -msgid "8 kHz" +msgid "11kHz" msgstr "" #: gui/options.cpp:73 -msgid "11kHz" +msgid "22 kHz" msgstr "" #: gui/options.cpp:73 @@ -92,15 +384,6 @@ msgstr "Csak feliratok" msgid "Speech & Subs" msgstr "Beszéd s Feliratok" -#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 -#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 -#: gui/options.cpp:804 gui/options.cpp:882 gui/options.cpp:888 -#: gui/options.cpp:894 gui/options.cpp:902 gui/options.cpp:926 -#: gui/options.cpp:930 gui/options.cpp:936 gui/options.cpp:943 -#: gui/options.cpp:1049 -msgid "None" -msgstr "Semmi" - #: gui/options.cpp:595 msgid "Graphics mode:" msgstr "Grafikus mód:" @@ -173,36 +456,6 @@ msgstr "SFX mennyis msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:743 -msgid "" -"Wrong configuration: Both subtitles and speech are off. Assuming subtitles " -"only" -msgstr "" - -#: gui/options.cpp:749 -msgid "Graphics" -msgstr "Grafikával" - -#: gui/options.cpp:749 -msgid "GFX" -msgstr "" - -#: gui/options.cpp:772 -msgid "Audio" -msgstr "Hang" - -#: gui/options.cpp:776 -msgid "Volume" -msgstr "Volumene" - -#: gui/options.cpp:784 -msgid "MIDI" -msgstr "" - -#: gui/options.cpp:790 -msgid "Paths" -msgstr "Ösvények" - #: gui/options.cpp:797 msgid "Save Path: " msgstr "" @@ -211,10 +464,6 @@ msgstr "" msgid "Theme Path:" msgstr "" -#: gui/options.cpp:803 -msgid "Extra Path:" -msgstr "Extra Útvonal:" - #: gui/options.cpp:807 msgid "Plugins Path:" msgstr "" @@ -235,87 +484,390 @@ msgstr "Lek msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:832 +#: gui/options.cpp:832 engines/dialogs.cpp:305 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:840 -msgid "Angol" -msgstr "" - -#: gui/options.cpp:858 -msgid "Szakítani" +#: gui/options.cpp:844 +msgid "English" msgstr "" -#: gui/options.cpp:859 -msgid "OK" -msgstr "Igen" - -#: gui/options.cpp:995 +#: gui/options.cpp:996 gui/options.cpp:991 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1002 +#: gui/options.cpp:1003 gui/options.cpp:998 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1011 +#: gui/options.cpp:1012 gui/options.cpp:1007 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1021 +#: gui/options.cpp:1022 gui/options.cpp:1017 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1032 +#: gui/options.cpp:1033 gui/options.cpp:1028 msgid "Select directory for plugins" msgstr "" -#: gui/options.cpp:1043 -msgid "Select SoundFont" +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" msgstr "" -#: gui/GuiManager.cpp:73 -msgid "Failed to load any GUI theme, aborting" +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "" + +#: gui/saveload.cpp:268 +#, fuzzy +msgid "Time: " +msgstr "Téma:" + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "" + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" msgstr "" -#: base/main.cpp:98 +#: base/main.cpp:105 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" msgstr "" -#: base/main.cpp:99 +#: base/main.cpp:106 msgid " Looking for a plugin supporting this gameid... " msgstr "" -#: base/main.cpp:103 +#: base/main.cpp:110 msgid "failed\n" msgstr "" -#: base/main.cpp:104 +#: base/main.cpp:111 #, c-format msgid "" "%s is an invalid gameid. Use the --list-games option to list supported gameid" msgstr "" -#: base/main.cpp:111 +#: base/main.cpp:118 #, c-format msgid " Starting '%s'\n" msgstr "" -#: base/main.cpp:140 -msgid "Invalid game path" +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" msgstr "" -#: base/main.cpp:143 -msgid "Unable to locate game data" +#: base/main.cpp:272 +msgid "Menu" msgstr "" -#: base/main.cpp:146 -msgid "Unknown error" +#: base/main.cpp:275 +msgid "Skip" msgstr "" -#: base/main.cpp:149 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "" \ No newline at end of file +#: base/main.cpp:278 +#, fuzzy +msgid "Pause" +msgstr "Ösvények" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "" + +#: base/main.cpp:419 base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "" + +#: engines/dialogs.cpp:89 +msgid "Resume" +msgstr "" + +#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +msgid "Save" +msgstr "" + +#: engines/dialogs.cpp:99 +msgid "Options" +msgstr "" + +#: engines/dialogs.cpp:104 +msgid "Help" +msgstr "" + +#: engines/dialogs.cpp:107 +msgid "About" +msgstr "" + +#: engines/dialogs.cpp:109 +msgid "Return to Launcher" +msgstr "" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "" + +#: gui/options.cpp:978 +msgid "You have to restart ScummVM to take the effect." +msgstr "" + +#: gui/ThemeEngine.cpp:333 +msgid "Disabled GFX" +msgstr "" + +#: gui/ThemeEngine.cpp:334 +msgid "Standard Renderer (16bpp)" +msgstr "" + +#: gui/ThemeEngine.cpp:336 +msgid "Antialiased Renderer (16bpp)" +msgstr "" + +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 +msgid "No music" +msgstr "" + +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 +msgid "Windows MIDI" +msgstr "" + +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 +msgid "ALSA" +msgstr "" + +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 +msgid "Atari ST MIDI" +msgstr "" + +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 +msgid "SEQ" +msgstr "" + +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 +msgid "DMedia" +msgstr "" + +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 +msgid "CAMD" +msgstr "" + +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 +#, fuzzy +msgid "CoreAudio" +msgstr "Hang" + +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 +msgid "CoreMIDI" +msgstr "" + +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 +msgid "Yamaha Pa1" +msgstr "" + +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 +msgid "Tapwave Zodiac" +msgstr "" + +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 +msgid "FluidSynth" +msgstr "" + +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 +msgid "MT-32 Emulation" +msgstr "" + +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 +#, fuzzy +msgid "AdLib" +msgstr "Hang" + +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 +msgid "PC Speaker" +msgstr "" + +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 +msgid "IBM PCjr" +msgstr "" + +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 +msgid "Creative Music System" +msgstr "" + +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 +msgid "FM Towns" +msgstr "" + +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 +msgid "TiMidity" +msgstr "" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "" + +#: engines/dialogs.cpp:301 +#, fuzzy +msgid "~O~K" +msgstr "Igen" + +#: engines/dialogs.cpp:302 +msgid "~C~ancel" +msgstr "" + +#: engines/dialogs.cpp:305 +#, fuzzy +msgid "~K~eys" +msgstr "Kulcsok" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "" + +#: engines/scumm/dialogs.cpp:289 +msgid "~C~lose" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index 684226b1cc..40a36a013d 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"POT-Creation-Date: 2010-06-10 17:42+0300\n" "PO-Revision-Date: 2010-06-08 08:52-0100\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -36,11 +36,11 @@ msgstr " #: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 #: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 #: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 +#: gui/options.cpp:861 gui/chooser.cpp:49 msgid "Cancel" msgstr "Îòìåíà" -#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 msgid "Choose" msgstr "Âûáðàòü" @@ -118,7 +118,7 @@ msgstr " #: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 msgid "" msgstr "<ïî óìîë÷àíèþ>" @@ -707,78 +707,162 @@ msgstr " msgid "Antialiased Renderer (16bpp)" msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" -#: sound/mididrv.cpp:39 +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 msgid "No music" msgstr "Áåç ìóçûêè" -#: sound/mididrv.cpp:42 +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 msgid "Windows MIDI" msgstr "Windows MIDI" -#: sound/mididrv.cpp:46 +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 msgid "ALSA" msgstr "ALSA" -#: sound/mididrv.cpp:50 +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 msgid "Atari ST MIDI" msgstr "Atars ST MIDI" -#: sound/mididrv.cpp:54 +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 msgid "SEQ" msgstr "SEQ" -#: sound/mididrv.cpp:58 +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 msgid "DMedia" msgstr "DMedia" -#: sound/mididrv.cpp:62 +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 msgid "CAMD" msgstr "CAMD" -#: sound/mididrv.cpp:66 +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 msgid "CoreAudio" msgstr "CoreAudio" -#: sound/mididrv.cpp:68 +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 msgid "CoreMIDI" msgstr "CoreMIDI" -#: sound/mididrv.cpp:73 +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 msgid "Yamaha Pa1" msgstr "Yamaha Pa1" -#: sound/mididrv.cpp:75 +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 msgid "Tapwave Zodiac" msgstr "Tapware Zodiac" -#: sound/mididrv.cpp:80 +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 msgid "FluidSynth" msgstr "FluidSynth" -#: sound/mididrv.cpp:83 +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 msgid "MT-32 Emulation" msgstr "Ýìóëÿöèÿ MT-32" -#: sound/mididrv.cpp:87 +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 msgid "AdLib" msgstr "AdLib" -#: sound/mididrv.cpp:88 +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 msgid "PC Speaker" msgstr "PC ñïèêåð" -#: sound/mididrv.cpp:89 +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 msgid "IBM PCjr" msgstr "IBM PCjr" -#: sound/mididrv.cpp:90 +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 msgid "Creative Music System" msgstr "Creative Music System" -#: sound/mididrv.cpp:91 +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 msgid "FM Towns" msgstr "FM Towns" -#: sound/mididrv.cpp:93 +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 msgid "TiMidity" msgstr "TiMidity" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~Â~ûõîä" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "Î ï~ð~îãðàììå..." + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~Î~ïöèè..." + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "Ï~ó~ñê" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~Ç~àãð...." + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "~Ä~îá. èãðó..." + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "Èç~ì~. èãðó..." + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "~Ó~äàëèòü èãðó" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "Ïðîäîë~æ~èòü" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~Ç~àãðóçèòü" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~Ç~àïèñàòü" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~Î~ïöèè" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~Ï~îìîùü" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "Î ïðî~ã~ðàììå" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "~Â~åðíóòüñÿ â ãëàâíîå ìåíþ" + +#: engines/dialogs.cpp:301 +msgid "~O~K" +msgstr "~O~K" + +#: engines/dialogs.cpp:302 +msgid "~C~ancel" +msgstr "Î~ò~ìåíà" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~Ê~ëàâèøè" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~Ï~ðåä" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~Ñ~ëåä" + +#: engines/scumm/dialogs.cpp:289 +msgid "~C~lose" +msgstr "~Ç~àêðûòü" diff --git a/po/scummvm.pot b/po/scummvm.pot index 77040dd25f..be9b114111 100755 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"POT-Creation-Date: 2010-06-10 17:42+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,11 +35,11 @@ msgstr "" #: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 #: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 #: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 +#: gui/options.cpp:861 gui/chooser.cpp:49 msgid "Cancel" msgstr "" -#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 msgid "Choose" msgstr "" @@ -117,7 +117,7 @@ msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 msgid "" msgstr "" @@ -702,78 +702,162 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: sound/mididrv.cpp:39 +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 msgid "No music" msgstr "" -#: sound/mididrv.cpp:42 +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 msgid "Windows MIDI" msgstr "" -#: sound/mididrv.cpp:46 +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 msgid "ALSA" msgstr "" -#: sound/mididrv.cpp:50 +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 msgid "Atari ST MIDI" msgstr "" -#: sound/mididrv.cpp:54 +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 msgid "SEQ" msgstr "" -#: sound/mididrv.cpp:58 +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 msgid "DMedia" msgstr "" -#: sound/mididrv.cpp:62 +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 msgid "CAMD" msgstr "" -#: sound/mididrv.cpp:66 +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 msgid "CoreAudio" msgstr "" -#: sound/mididrv.cpp:68 +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 msgid "CoreMIDI" msgstr "" -#: sound/mididrv.cpp:73 +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 msgid "Yamaha Pa1" msgstr "" -#: sound/mididrv.cpp:75 +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 msgid "Tapwave Zodiac" msgstr "" -#: sound/mididrv.cpp:80 +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 msgid "FluidSynth" msgstr "" -#: sound/mididrv.cpp:83 +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 msgid "MT-32 Emulation" msgstr "" -#: sound/mididrv.cpp:87 +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 msgid "AdLib" msgstr "" -#: sound/mididrv.cpp:88 +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 msgid "PC Speaker" msgstr "" -#: sound/mididrv.cpp:89 +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 msgid "IBM PCjr" msgstr "" -#: sound/mididrv.cpp:90 +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 msgid "Creative Music System" msgstr "" -#: sound/mididrv.cpp:91 +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 msgid "FM Towns" msgstr "" -#: sound/mididrv.cpp:93 +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 msgid "TiMidity" msgstr "" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "" + +#: engines/dialogs.cpp:301 +msgid "~O~K" +msgstr "" + +#: engines/dialogs.cpp:302 +msgid "~C~ancel" +msgstr "" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "" + +#: engines/scumm/dialogs.cpp:289 +msgid "~C~lose" +msgstr "" -- cgit v1.2.3 From dc040aa8671797853b0b1f9add3320c6e1f22c33 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:48:39 +0000 Subject: GUI: Implement radiobuttons. Implement radiobuttons in GUI. Also closes FR #2821529: "GUI: volume and subtitles speed sliders". Subtitle toggle button is replaced by three radiobuttons grouped by a single group. Updated translations and themes. svn-id: r49767 --- common/messages.cpp | 812 +++++++++++---------- gui/ThemeEngine.cpp | 30 + gui/ThemeEngine.h | 7 + gui/options.cpp | 78 +- gui/options.h | 5 +- gui/themes/default.inc | 127 +++- gui/themes/scummclassic.zip | Bin 52484 -> 54695 bytes gui/themes/scummclassic/classic_gfx.stx | 63 ++ gui/themes/scummclassic/classic_layout.stx | 25 +- gui/themes/scummclassic/classic_layout_lowres.stx | 37 +- gui/themes/scummmodern.zip | Bin 158475 -> 162132 bytes gui/themes/scummmodern/radiobutton.bmp | Bin 0 -> 774 bytes gui/themes/scummmodern/radiobutton_empty.bmp | Bin 0 -> 774 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 38 + gui/themes/scummmodern/scummmodern_layout.stx | 28 +- .../scummmodern/scummmodern_layout_lowres.stx | 35 +- gui/widget.cpp | 68 ++ gui/widget.h | 50 ++ po/hu_HU.po | 139 ++-- po/ru_RU.po | 137 ++-- po/scummvm.pot | 137 ++-- 21 files changed, 1169 insertions(+), 647 deletions(-) create mode 100755 gui/themes/scummmodern/radiobutton.bmp create mode 100755 gui/themes/scummmodern/radiobutton_empty.bmp diff --git a/common/messages.cpp b/common/messages.cpp index 5b0846d56f..2a6ea63e43 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -30,185 +30,190 @@ static const char * _po2c_msgids[] = { /* 23 */ "Audio", /* 24 */ "Autosave:", /* 25 */ "A~b~out...", - /* 26 */ "C1Available engines:", - /* 27 */ "C1Features compiled in:", - /* 28 */ "C2(built on ", - /* 29 */ "CAMD", - /* 30 */ "Cancel", - /* 31 */ "Cannot create file", - /* 32 */ "Choose", - /* 33 */ "Choose an action to map", - /* 34 */ "Close", - /* 35 */ "CoreAudio", - /* 36 */ "CoreMIDI", - /* 37 */ "Could not find any engine capable of running the selected game", - /* 38 */ "Creative Music System", - /* 39 */ "DMedia", - /* 40 */ "Date: ", - /* 41 */ "Default", - /* 42 */ "Delete", - /* 43 */ "Disabled GFX", - /* 44 */ "Discovered %d new games ...", - /* 45 */ "Discovered %d new games.", - /* 46 */ "Display keyboard", - /* 47 */ "Do you really want to delete this savegame?", - /* 48 */ "Do you really want to remove this game configuration?", - /* 49 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 50 */ "Edit Game...", - /* 51 */ "Enable Roland GS Mode", - /* 52 */ "Engine does not support debug level '%s'", - /* 53 */ "English", - /* 54 */ "Error running game:", - /* 55 */ "Extra Path:", - /* 56 */ "FM Towns", - /* 57 */ "Failed to load any GUI theme, aborting", - /* 58 */ "FluidSynth", - /* 59 */ "Fullscreen mode", - /* 60 */ "GFX", - /* 61 */ "GUI Renderer:", - /* 62 */ "Game", - /* 63 */ "Game Data not found", - /* 64 */ "Game Id not supported", - /* 65 */ "Game Path:", - /* 66 */ "Go up", - /* 67 */ "Graphics", - /* 68 */ "Graphics mode:", - /* 69 */ "Help", - /* 70 */ "IBM PCjr", - /* 71 */ "ID:", - /* 72 */ "Invalid Path", - /* 73 */ "Keys", - /* 74 */ "Language:", - /* 75 */ "Load", - /* 76 */ "Load game:", - /* 77 */ "Load...", - /* 78 */ "MIDI", - /* 79 */ "MIDI gain:", - /* 80 */ "MT-32 Emulation", - /* 81 */ "Map", - /* 82 */ "Mass Add...", - /* 83 */ "Menu", - /* 84 */ "Misc", - /* 85 */ "Mixed AdLib/MIDI mode", - /* 86 */ "Mouse click", - /* 87 */ "Music driver:", - /* 88 */ "Music volume:", - /* 89 */ "Mute All", - /* 90 */ "Name:", - /* 91 */ "Never", - /* 92 */ "No", - /* 93 */ "No date saved", - /* 94 */ "No music", - /* 95 */ "No playtime saved", - /* 96 */ "No time saved", - /* 97 */ "None", - /* 98 */ "OK", - /* 99 */ "Options", - /* 100 */ "Options...", - /* 101 */ "Output rate:", - /* 102 */ "Override global MIDI settings", - /* 103 */ "Override global audio settings", - /* 104 */ "Override global graphic settings", - /* 105 */ "Override global volume settings", - /* 106 */ "PC Speaker", - /* 107 */ "Path not a directory", - /* 108 */ "Path not a file", - /* 109 */ "Path not exists", - /* 110 */ "Paths", - /* 111 */ "Pause", - /* 112 */ "Pick the game:", - /* 113 */ "Platform:", - /* 114 */ "Playtime: ", - /* 115 */ "Please select an action", - /* 116 */ "Plugins Path:", - /* 117 */ "Press the key to associate", - /* 118 */ "Quit", - /* 119 */ "Read permission denied", - /* 120 */ "Reading failed", - /* 121 */ "Remap keys", - /* 122 */ "Remove Game", - /* 123 */ "Render mode:", - /* 124 */ "Resume", - /* 125 */ "Return to Launcher", - /* 126 */ "SEQ", - /* 127 */ "SFX volume:", - /* 128 */ "Save", - /* 129 */ "Save Path:", - /* 130 */ "Save Path: ", - /* 131 */ "Save game:", - /* 132 */ "Scan complete!", - /* 133 */ "Scanned %d directories ...", - /* 134 */ "ScummVM could not find any engine capable of running the selected game!", - /* 135 */ "ScummVM could not find any game in the specified directory!", - /* 136 */ "ScummVM couldn't open the specified directory!", - /* 137 */ "Search:", - /* 138 */ "Select SoundFont", - /* 139 */ "Select a Theme", - /* 140 */ "Select additional game directory", - /* 141 */ "Select an action and click 'Map'", - /* 142 */ "Select directory for GUI themes", - /* 143 */ "Select directory for extra files", - /* 144 */ "Select directory for plugins", - /* 145 */ "Select directory for saved games", - /* 146 */ "Select directory for savegames", - /* 147 */ "Select directory with game data", - /* 148 */ "Skip", - /* 149 */ "Skip line", - /* 150 */ "SoundFont:", - /* 151 */ "Speech & Subs", - /* 152 */ "Speech Only", - /* 153 */ "Speech and Subtitles", - /* 154 */ "Speech volume:", - /* 155 */ "Standard Renderer (16bpp)", - /* 156 */ "Start", - /* 157 */ "Subtitle speed:", - /* 158 */ "Subtitles Only", - /* 159 */ "Tapwave Zodiac", - /* 160 */ "Text and Speech:", - /* 161 */ "The chosen directory cannot be written to. Please select another one.", - /* 162 */ "Theme Path:", - /* 163 */ "Theme:", - /* 164 */ "This game ID is already taken. Please choose another one.", - /* 165 */ "This game does not support loading games from the launcher.", - /* 166 */ "TiMidity", - /* 167 */ "Time: ", - /* 168 */ "True Roland MT-32 (disable GM emulation)", - /* 169 */ "Unknown Error", - /* 170 */ "Unsupported Color Mode", - /* 171 */ "Untitled savestate", - /* 172 */ "User picked target '%s' (gameid '%s')...\n", - /* 173 */ "Volume", - /* 174 */ "Windows MIDI", - /* 175 */ "Write permission denied", - /* 176 */ "Writing data failed", - /* 177 */ "Yamaha Pa1", - /* 178 */ "Yes", - /* 179 */ "You have to restart ScummVM to take the effect.", - /* 180 */ "every 10 mins", - /* 181 */ "every 15 mins", - /* 182 */ "every 30 mins", - /* 183 */ "every 5 mins", - /* 184 */ "failed\n", - /* 185 */ "~A~bout", - /* 186 */ "~A~dd Game...", - /* 187 */ "~C~ancel", - /* 188 */ "~C~lose", - /* 189 */ "~E~dit Game...", - /* 190 */ "~H~elp", - /* 191 */ "~K~eys", - /* 192 */ "~L~oad", - /* 193 */ "~L~oad...", - /* 194 */ "~N~ext", - /* 195 */ "~O~K", - /* 196 */ "~O~ptions", - /* 197 */ "~O~ptions...", - /* 198 */ "~P~revious", - /* 199 */ "~Q~uit", - /* 200 */ "~R~emove Game", - /* 201 */ "~R~esume", - /* 202 */ "~R~eturn to Launcher", - /* 203 */ "~S~ave", - /* 204 */ "~S~tart", + /* 26 */ "Both", + /* 27 */ "C1Available engines:", + /* 28 */ "C1Features compiled in:", + /* 29 */ "C2(built on ", + /* 30 */ "CAMD", + /* 31 */ "Cancel", + /* 32 */ "Cannot create file", + /* 33 */ "Choose", + /* 34 */ "Choose an action to map", + /* 35 */ "Close", + /* 36 */ "CoreAudio", + /* 37 */ "CoreMIDI", + /* 38 */ "Could not find any engine capable of running the selected game", + /* 39 */ "Creative Music System", + /* 40 */ "DMedia", + /* 41 */ "Date: ", + /* 42 */ "Default", + /* 43 */ "Delete", + /* 44 */ "Disabled GFX", + /* 45 */ "Discovered %d new games ...", + /* 46 */ "Discovered %d new games.", + /* 47 */ "Display keyboard", + /* 48 */ "Do you really want to delete this savegame?", + /* 49 */ "Do you really want to remove this game configuration?", + /* 50 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 51 */ "Edit Game...", + /* 52 */ "Enable Roland GS Mode", + /* 53 */ "Engine does not support debug level '%s'", + /* 54 */ "English", + /* 55 */ "Error running game:", + /* 56 */ "Extra Path:", + /* 57 */ "FM Towns", + /* 58 */ "Failed to load any GUI theme, aborting", + /* 59 */ "FluidSynth", + /* 60 */ "Fullscreen mode", + /* 61 */ "GFX", + /* 62 */ "GUI Renderer:", + /* 63 */ "Game", + /* 64 */ "Game Data not found", + /* 65 */ "Game Id not supported", + /* 66 */ "Game Path:", + /* 67 */ "Go up", + /* 68 */ "Graphics", + /* 69 */ "Graphics mode:", + /* 70 */ "Help", + /* 71 */ "IBM PCjr", + /* 72 */ "ID:", + /* 73 */ "Invalid Path", + /* 74 */ "Keys", + /* 75 */ "Language:", + /* 76 */ "Load", + /* 77 */ "Load game:", + /* 78 */ "Load...", + /* 79 */ "MIDI", + /* 80 */ "MIDI gain:", + /* 81 */ "MT-32 Emulation", + /* 82 */ "Map", + /* 83 */ "Mass Add...", + /* 84 */ "Menu", + /* 85 */ "Misc", + /* 86 */ "Mixed AdLib/MIDI mode", + /* 87 */ "Mouse click", + /* 88 */ "Music driver:", + /* 89 */ "Music volume:", + /* 90 */ "Mute All", + /* 91 */ "Name:", + /* 92 */ "Never", + /* 93 */ "No", + /* 94 */ "No date saved", + /* 95 */ "No music", + /* 96 */ "No playtime saved", + /* 97 */ "No time saved", + /* 98 */ "None", + /* 99 */ "OK", + /* 100 */ "Options", + /* 101 */ "Options...", + /* 102 */ "Output rate:", + /* 103 */ "Override global MIDI settings", + /* 104 */ "Override global audio settings", + /* 105 */ "Override global graphic settings", + /* 106 */ "Override global volume settings", + /* 107 */ "PC Speaker", + /* 108 */ "Path not a directory", + /* 109 */ "Path not a file", + /* 110 */ "Path not exists", + /* 111 */ "Paths", + /* 112 */ "Pause", + /* 113 */ "Pick the game:", + /* 114 */ "Platform:", + /* 115 */ "Playtime: ", + /* 116 */ "Please select an action", + /* 117 */ "Plugins Path:", + /* 118 */ "Press the key to associate", + /* 119 */ "Quit", + /* 120 */ "Read permission denied", + /* 121 */ "Reading failed", + /* 122 */ "Remap keys", + /* 123 */ "Remove Game", + /* 124 */ "Render mode:", + /* 125 */ "Resume", + /* 126 */ "Return to Launcher", + /* 127 */ "SEQ", + /* 128 */ "SFX volume:", + /* 129 */ "Save", + /* 130 */ "Save Path:", + /* 131 */ "Save Path: ", + /* 132 */ "Save game:", + /* 133 */ "Scan complete!", + /* 134 */ "Scanned %d directories ...", + /* 135 */ "ScummVM could not find any engine capable of running the selected game!", + /* 136 */ "ScummVM could not find any game in the specified directory!", + /* 137 */ "ScummVM couldn't open the specified directory!", + /* 138 */ "Search:", + /* 139 */ "Select SoundFont", + /* 140 */ "Select a Theme", + /* 141 */ "Select additional game directory", + /* 142 */ "Select an action and click 'Map'", + /* 143 */ "Select directory for GUI themes", + /* 144 */ "Select directory for extra files", + /* 145 */ "Select directory for plugins", + /* 146 */ "Select directory for saved games", + /* 147 */ "Select directory for savegames", + /* 148 */ "Select directory with game data", + /* 149 */ "Skip", + /* 150 */ "Skip line", + /* 151 */ "SoundFont:", + /* 152 */ "Spch", + /* 153 */ "Speech", + /* 154 */ "Speech & Subs", + /* 155 */ "Speech Only", + /* 156 */ "Speech and Subtitles", + /* 157 */ "Speech volume:", + /* 158 */ "Standard Renderer (16bpp)", + /* 159 */ "Start", + /* 160 */ "Subs", + /* 161 */ "Subtitle speed:", + /* 162 */ "Subtitles", + /* 163 */ "Subtitles Only", + /* 164 */ "Tapwave Zodiac", + /* 165 */ "Text and Speech:", + /* 166 */ "The chosen directory cannot be written to. Please select another one.", + /* 167 */ "Theme Path:", + /* 168 */ "Theme:", + /* 169 */ "This game ID is already taken. Please choose another one.", + /* 170 */ "This game does not support loading games from the launcher.", + /* 171 */ "TiMidity", + /* 172 */ "Time: ", + /* 173 */ "True Roland MT-32 (disable GM emulation)", + /* 174 */ "Unknown Error", + /* 175 */ "Unsupported Color Mode", + /* 176 */ "Untitled savestate", + /* 177 */ "User picked target '%s' (gameid '%s')...\n", + /* 178 */ "Volume", + /* 179 */ "Windows MIDI", + /* 180 */ "Write permission denied", + /* 181 */ "Writing data failed", + /* 182 */ "Yamaha Pa1", + /* 183 */ "Yes", + /* 184 */ "You have to restart ScummVM to take the effect.", + /* 185 */ "every 10 mins", + /* 186 */ "every 15 mins", + /* 187 */ "every 30 mins", + /* 188 */ "every 5 mins", + /* 189 */ "failed\n", + /* 190 */ "~A~bout", + /* 191 */ "~A~dd Game...", + /* 192 */ "~C~ancel", + /* 193 */ "~C~lose", + /* 194 */ "~E~dit Game...", + /* 195 */ "~H~elp", + /* 196 */ "~K~eys", + /* 197 */ "~L~oad", + /* 198 */ "~L~oad...", + /* 199 */ "~N~ext", + /* 200 */ "~O~K", + /* 201 */ "~O~ptions", + /* 202 */ "~O~ptions...", + /* 203 */ "~P~revious", + /* 204 */ "~Q~uit", + /* 205 */ "~R~emove Game", + /* 206 */ "~R~esume", + /* 207 */ "~R~eturn to Launcher", + /* 208 */ "~S~ave", + /* 209 */ "~S~tart", NULL }; @@ -218,7 +223,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 17:42+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 23:21+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, @@ -244,238 +249,245 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 23, "\300\363\344\350\356" }, { 24, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, { 25, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 27, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 28, "C2(\361\356\341\360\340\355 " }, - { 29, "CAMD" }, - { 30, "\316\362\354\345\355\340" }, - { 31, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 32, "\302\373\341\360\340\362\374" }, - { 33, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 34, "\307\340\352\360\373\362\374" }, - { 35, "CoreAudio" }, - { 36, "CoreMIDI" }, - { 37, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 38, "Creative Music System" }, - { 39, "DMedia" }, - { 40, "\304\340\362\340: " }, - { 41, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 42, "\323\344\340\353\350\362\374" }, - { 43, "\301\345\347 \343\360\340\364\350\352\350" }, - { 44, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 45, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 46, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 47, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 48, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 50, "\310\347\354. \350\343\360\363..." }, - { 51, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 52, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 53, "English" }, - { 54, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 55, "\304\356\357. \357\363\362\374:" }, - { 56, "FM Towns" }, - { 57, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 58, "FluidSynth" }, - { 59, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 60, "\303\360\364" }, - { 61, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 62, "\310\343\360\340" }, - { 63, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 64, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 65, "\317\363\362\374 \352 \350\343\360\345: " }, - { 66, "\302\342\345\360\365" }, - { 67, "\303\360\340\364\350\352\340" }, - { 68, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 69, "\317\356\354\356\371\374" }, - { 70, "IBM PCjr" }, - { 71, "ID:" }, - { 72, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 73, "\312\353\340\342\350\370\350" }, - { 74, "\337\347\373\352:" }, - { 75, "\307\340\343\360\363\347\350\362\374" }, - { 76, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 77, "\307\340\343\360...." }, - { 78, "MIDI" }, - { 79, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 80, "\335\354\363\353\377\366\350\377 MT-32" }, - { 81, "\315\340\347\355\340\367\350\362\374" }, - { 82, "\304\356\341. \354\355\356\343\356..." }, - { 83, "\314\345\355\376" }, - { 84, "\320\340\347\355\356\345" }, - { 85, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 86, "\312\353\350\352 \354\373\370\374\376" }, - { 87, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 88, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 89, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 90, "\315\340\347\342\340\355\350\345:" }, - { 91, "\315\350\352\356\343\344\340" }, - { 92, "\315\345\362" }, - { 93, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 94, "\301\345\347 \354\363\347\373\352\350" }, - { 95, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 96, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 97, "\315\345 \347\340\344\340\355" }, - { 98, "OK" }, - { 99, "\316\357\366\350\350" }, - { 100, "\316\357\366\350\350..." }, - { 101, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 102, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 106, "PC \361\357\350\352\345\360" }, - { 107, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 109, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 110, "\317\363\362\350" }, - { 111, "\317\340\363\347\340" }, - { 112, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 113, "\317\353\340\362\364\356\360\354\340:" }, - { 114, "\302\360\345\354\377 \350\343\360\373: " }, - { 115, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 116, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 117, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 118, "\302\373\365\356\344" }, - { 119, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 120, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 121, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 122, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 123, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 124, "\317\360\356\344\356\353\346\350\362\374" }, - { 125, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 126, "SEQ" }, - { 127, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 128, "\307\340\357\350\361\340\362\374" }, - { 129, "\317\363\362\374 \361\356\365\360.: " }, - { 130, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 131, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 132, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 133, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 134, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 135, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 136, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 137, "\317\356\350\361\352:" }, - { 138, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 139, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 140, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 141, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 142, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 26, "\302\361\270" }, + { 27, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 28, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 29, "C2(\361\356\341\360\340\355 " }, + { 30, "CAMD" }, + { 31, "\316\362\354\345\355\340" }, + { 32, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 33, "\302\373\341\360\340\362\374" }, + { 34, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 35, "\307\340\352\360\373\362\374" }, + { 36, "CoreAudio" }, + { 37, "CoreMIDI" }, + { 38, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 39, "Creative Music System" }, + { 40, "DMedia" }, + { 41, "\304\340\362\340: " }, + { 42, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 43, "\323\344\340\353\350\362\374" }, + { 44, "\301\345\347 \343\360\340\364\350\352\350" }, + { 45, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 46, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 47, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 48, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 50, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 51, "\310\347\354. \350\343\360\363..." }, + { 52, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 53, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 54, "English" }, + { 55, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 56, "\304\356\357. \357\363\362\374:" }, + { 57, "FM Towns" }, + { 58, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 59, "FluidSynth" }, + { 60, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 61, "\303\360\364" }, + { 62, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 63, "\310\343\360\340" }, + { 64, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 65, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 66, "\317\363\362\374 \352 \350\343\360\345: " }, + { 67, "\302\342\345\360\365" }, + { 68, "\303\360\340\364\350\352\340" }, + { 69, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 70, "\317\356\354\356\371\374" }, + { 71, "IBM PCjr" }, + { 72, "ID:" }, + { 73, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 74, "\312\353\340\342\350\370\350" }, + { 75, "\337\347\373\352:" }, + { 76, "\307\340\343\360\363\347\350\362\374" }, + { 77, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 78, "\307\340\343\360...." }, + { 79, "MIDI" }, + { 80, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 81, "\335\354\363\353\377\366\350\377 MT-32" }, + { 82, "\315\340\347\355\340\367\350\362\374" }, + { 83, "\304\356\341. \354\355\356\343\356..." }, + { 84, "\314\345\355\376" }, + { 85, "\320\340\347\355\356\345" }, + { 86, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 87, "\312\353\350\352 \354\373\370\374\376" }, + { 88, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 89, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 90, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 91, "\315\340\347\342\340\355\350\345:" }, + { 92, "\315\350\352\356\343\344\340" }, + { 93, "\315\345\362" }, + { 94, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 95, "\301\345\347 \354\363\347\373\352\350" }, + { 96, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 97, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 98, "\315\345 \347\340\344\340\355" }, + { 99, "OK" }, + { 100, "\316\357\366\350\350" }, + { 101, "\316\357\366\350\350..." }, + { 102, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 107, "PC \361\357\350\352\345\360" }, + { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 109, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 110, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 111, "\317\363\362\350" }, + { 112, "\317\340\363\347\340" }, + { 113, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 114, "\317\353\340\362\364\356\360\354\340:" }, + { 115, "\302\360\345\354\377 \350\343\360\373: " }, + { 116, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 117, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 118, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 119, "\302\373\365\356\344" }, + { 120, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 121, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 122, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 123, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 124, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 125, "\317\360\356\344\356\353\346\350\362\374" }, + { 126, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 127, "SEQ" }, + { 128, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 129, "\307\340\357\350\361\340\362\374" }, + { 130, "\317\363\362\374 \361\356\365\360.: " }, + { 131, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 132, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 133, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 134, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 135, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 136, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 137, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 138, "\317\356\350\361\352:" }, + { 139, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 140, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 141, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 142, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, { 146, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 148, "\317\360\356\357\363\361\362\350\362\374" }, - { 149, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 150, "SoundFont:" }, - { 151, "\307\342\363\352 \350 \361\363\341." }, - { 152, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 153, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 154, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 155, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 156, "\317\363\361\352" }, - { 157, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 158, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 159, "Tapware Zodiac" }, - { 160, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 161, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 162, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 163, "\322\345\354\340:" }, - { 164, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 165, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 166, "TiMidity" }, - { 167, "\302\360\345\354\377: " }, - { 168, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 169, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 170, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 171, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 172, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 173, "\303\360\356\354\352\356\361\362\374" }, - { 174, "Windows MIDI" }, - { 175, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 176, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 177, "Yamaha Pa1" }, - { 178, "\304\340" }, - { 179, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 180, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 181, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 182, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 183, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 184, "\355\345 \363\344\340\353\356\361\374\n" }, - { 185, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 186, "~\304~\356\341. \350\343\360\363..." }, - { 187, "\316~\362~\354\345\355\340" }, - { 188, "~\307~\340\352\360\373\362\374" }, - { 189, "\310\347~\354~. \350\343\360\363..." }, - { 190, "~\317~\356\354\356\371\374" }, - { 191, "~\312~\353\340\342\350\370\350" }, - { 192, "~\307~\340\343\360\363\347\350\362\374" }, - { 193, "~\307~\340\343\360...." }, - { 194, "~\321~\353\345\344" }, - { 195, "~O~K" }, - { 196, "~\316~\357\366\350\350" }, - { 197, "~\316~\357\366\350\350..." }, - { 198, "~\317~\360\345\344" }, - { 199, "~\302~\373\365\356\344" }, - { 200, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 201, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 202, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 203, "~\307~\340\357\350\361\340\362\374" }, - { 204, "\317~\363~\361\352" }, + { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 149, "\317\360\356\357\363\361\362\350\362\374" }, + { 150, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 151, "SoundFont:" }, + { 152, "\316\347\342" }, + { 153, "\316\347\342\363\367\352\340" }, + { 154, "\307\342\363\352 \350 \361\363\341." }, + { 155, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 156, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 157, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 158, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 159, "\317\363\361\352" }, + { 160, "\321\363\341" }, + { 161, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 162, "\321\363\341\362\350\362\360\373" }, + { 163, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 164, "Tapware Zodiac" }, + { 165, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 166, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 167, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 168, "\322\345\354\340:" }, + { 169, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 170, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 171, "TiMidity" }, + { 172, "\302\360\345\354\377: " }, + { 173, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 174, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 175, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 176, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 177, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 178, "\303\360\356\354\352\356\361\362\374" }, + { 179, "Windows MIDI" }, + { 180, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 181, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 182, "Yamaha Pa1" }, + { 183, "\304\340" }, + { 184, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 185, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 186, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 187, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 188, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 189, "\355\345 \363\344\340\353\356\361\374\n" }, + { 190, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 191, "~\304~\356\341. \350\343\360\363..." }, + { 192, "\316~\362~\354\345\355\340" }, + { 193, "~\307~\340\352\360\373\362\374" }, + { 194, "\310\347~\354~. \350\343\360\363..." }, + { 195, "~\317~\356\354\356\371\374" }, + { 196, "~\312~\353\340\342\350\370\350" }, + { 197, "~\307~\340\343\360\363\347\350\362\374" }, + { 198, "~\307~\340\343\360...." }, + { 199, "~\321~\353\345\344" }, + { 200, "~O~K" }, + { 201, "~\316~\357\366\350\350" }, + { 202, "~\316~\357\366\350\350..." }, + { 203, "~\317~\360\345\344" }, + { 204, "~\302~\373\365\356\344" }, + { 205, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 206, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 207, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 208, "~\307~\340\357\350\361\340\362\374" }, + { 209, "\317~\363~\361\352" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 17:42+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 23:21+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 11, "" }, { 15, "Hang" }, { 16, "AdLib vezet :" }, { 19, "Aspect adag korrekci\363" }, { 23, "Hang" }, { 24, "Automatikus ment\351s:" }, - { 35, "Hang" }, - { 41, "" }, - { 51, "K\351pess\351 Roland GS Mode" }, - { 55, "Extra \332tvonal:" }, - { 59, "Teljes k\351perny s m\363d:" }, - { 61, "Lek\351pez eszk\366z GUI:" }, - { 65, "Extra \332tvonal:" }, - { 67, "Grafik\341val" }, - { 68, "Grafikus m\363d:" }, - { 73, "Kulcsok" }, - { 79, "MIDI nyeres\351g:" }, - { 85, "Vegyes AdLib/MIDI m\363d" }, - { 87, "Zenei vezet :" }, - { 88, "Zene mennyis\351g:" }, - { 89, "Muta \326sszes" }, - { 91, "Soha" }, - { 92, "Semmi" }, - { 97, "Semmi" }, - { 98, "Igen" }, - { 101, "Kimeneti teljes\355tm\351ny:" }, - { 110, "\326sv\351nyek" }, + { 36, "Hang" }, + { 42, "" }, + { 52, "K\351pess\351 Roland GS Mode" }, + { 56, "Extra \332tvonal:" }, + { 60, "Teljes k\351perny s m\363d:" }, + { 62, "Lek\351pez eszk\366z GUI:" }, + { 66, "Extra \332tvonal:" }, + { 68, "Grafik\341val" }, + { 69, "Grafikus m\363d:" }, + { 74, "Kulcsok" }, + { 80, "MIDI nyeres\351g:" }, + { 86, "Vegyes AdLib/MIDI m\363d" }, + { 88, "Zenei vezet :" }, + { 89, "Zene mennyis\351g:" }, + { 90, "Muta \326sszes" }, + { 92, "Soha" }, + { 93, "Semmi" }, + { 98, "Semmi" }, + { 99, "Igen" }, + { 102, "Kimeneti teljes\355tm\351ny:" }, { 111, "\326sv\351nyek" }, - { 123, "Renderel\351si m\363d:" }, - { 127, "SFX mennyis\351ge" }, - { 129, "Extra \332tvonal:" }, - { 151, "Besz\351d s Feliratok" }, - { 152, "Csak a besz\351d" }, - { 153, "Besz\351d \351s a Feliratok" }, - { 154, "Besz\351d mennyis\351g:" }, - { 157, "Felirat sebess\351g:" }, - { 158, "Csak feliratok" }, - { 160, "Sz\366veg \351s besz\351d:" }, - { 163, "T\351ma:" }, - { 167, "T\351ma:" }, - { 168, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 173, "Volumene" }, - { 180, "10 percenk\351nt" }, - { 181, "15 percenk\351nt" }, - { 182, "30 percenk\351nt" }, - { 183, "5 percenk\351nt" }, - { 191, "Kulcsok" }, - { 195, "Igen" }, + { 112, "\326sv\351nyek" }, + { 124, "Renderel\351si m\363d:" }, + { 128, "SFX mennyis\351ge" }, + { 130, "Extra \332tvonal:" }, + { 153, "Csak a besz\351d" }, + { 154, "Besz\351d s Feliratok" }, + { 155, "Csak a besz\351d" }, + { 156, "Besz\351d \351s a Feliratok" }, + { 157, "Besz\351d mennyis\351g:" }, + { 161, "Felirat sebess\351g:" }, + { 162, "Csak feliratok" }, + { 163, "Csak feliratok" }, + { 165, "Sz\366veg \351s besz\351d:" }, + { 168, "T\351ma:" }, + { 172, "T\351ma:" }, + { 173, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 178, "Volumene" }, + { 185, "10 percenk\351nt" }, + { 186, "15 percenk\351nt" }, + { 187, "30 percenk\351nt" }, + { 188, "5 percenk\351nt" }, + { 196, "Kulcsok" }, + { 200, "Igen" }, { -1, NULL } }; diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 03e21153a5..5bde44d792 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -190,6 +190,10 @@ static const DrawDataInfo kDrawDataDefaults[] = { {kDDCheckboxDisabled, "checkbox_disabled", true, kDDNone}, {kDDCheckboxSelected, "checkbox_selected", false, kDDCheckboxDefault}, + {kDDRadiobuttonDefault, "radiobutton_default", true, kDDNone}, + {kDDRadiobuttonDisabled, "radiobutton_disabled", true, kDDNone}, + {kDDRadiobuttonSelected, "radiobutton_selected", false, kDDRadiobuttonDefault}, + {kDDTabActive, "tab_active", false, kDDTabInactive}, {kDDTabInactive, "tab_inactive", true, kDDNone}, {kDDTabBackground, "tab_background", true, kDDNone}, @@ -885,6 +889,32 @@ void ThemeEngine::drawCheckbox(const Common::Rect &r, const Common::String &str, queueDDText(getTextData(dd), getTextColor(dd), r2, str, false, false, _widgets[kDDCheckboxDefault]->_textAlignH, _widgets[dd]->_textAlignV); } +void ThemeEngine::drawRadiobutton(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) { + if (!ready()) + return; + + Common::Rect r2 = r; + DrawData dd = kDDRadiobuttonDefault; + + if (checked) + dd = kDDRadiobuttonSelected; + + if (state == kStateDisabled) + dd = kDDRadiobuttonDisabled; + + const int checkBoxSize = MIN((int)r.height(), getFontHeight()); + + r2.bottom = r2.top + checkBoxSize; + r2.right = r2.left + checkBoxSize; + + queueDD(dd, r2); + + r2.left = r2.right + checkBoxSize; + r2.right = r.right; + + queueDDText(getTextData(dd), getTextColor(dd), r2, str, false, false, _widgets[kDDRadiobuttonDefault]->_textAlignH, _widgets[dd]->_textAlignV); +} + void ThemeEngine::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) { if (!ready()) return; diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 2da1c3a014..2ef6fe3781 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -82,6 +82,10 @@ enum DrawData { kDDCheckboxDisabled, kDDCheckboxSelected, + kDDRadiobuttonDefault, + kDDRadiobuttonDisabled, + kDDRadiobuttonSelected, + kDDTabActive, kDDTabInactive, kDDTabBackground, @@ -312,6 +316,9 @@ public: void drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state = kStateEnabled); + void drawRadiobutton(const Common::Rect &r, const Common::String &str, + bool checked, WidgetStateInfo state = kStateEnabled); + void drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state = kStateEnabled); diff --git a/gui/options.cpp b/gui/options.cpp index be83624254..e9be2834a4 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -62,6 +62,12 @@ enum { kChooseThemeCmd = 'chtf' }; +enum { + kSubtitlesSpeech, + kSubtitlesSubs, + kSubtitlesBoth +}; + #ifdef SMALL_SCREEN_DEVICE enum { kChooseKeyMappingCmd = 'chma' @@ -85,18 +91,6 @@ OptionsDialog::OptionsDialog(const Common::String &domain, const Common::String init(); } -const char *OptionsDialog::_subModeDesc[] = { - _s("Speech Only"), - _s("Speech and Subtitles"), - _s("Subtitles Only") -}; - -const char *OptionsDialog::_lowresSubModeDesc[] = { - _s("Speech Only"), - _s("Speech & Subs"), - _s("Subtitles Only") -}; - void OptionsDialog::init() { _enableGraphicSettings = false; _gfxPopUp = 0; @@ -123,7 +117,9 @@ void OptionsDialog::init() { _speechVolumeLabel = 0; _muteCheckbox = 0; _subToggleDesc = 0; - _subToggleButton = 0; + _subToggleSubOnly = 0; + _subToggleSpeechOnly = 0; + _subToggleSubBoth = 0; _subSpeedDesc = 0; _subSpeedSlider = 0; _subSpeedLabel = 0; @@ -264,11 +260,12 @@ void OptionsDialog::open() { } // Subtitle options - if (_subToggleButton) { - int speed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); + if (_subToggleGroup) { + int speed; + int sliderMaxValue = _subSpeedSlider->getMaxValue(); _subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); - _subToggleButton->setLabel(_(_subModeDesc[_subMode])); + _subToggleGroup->setValue(_subMode); // Engines that reuse the subtitle speed widget set their own max value. // Scale the config value accordingly (see addSubtitleControls) @@ -393,21 +390,21 @@ void OptionsDialog::close() { } // Subtitle options - if (_subToggleButton) { + if (_subToggleGroup) { if (_enableSubtitleSettings) { bool subtitles, speech_mute; int talkspeed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); switch (_subMode) { - case 0: + case kSubtitlesSpeech: subtitles = speech_mute = false; break; - case 1: + case kSubtitlesBoth: subtitles = true; speech_mute = false; break; - case 2: + case kSubtitlesSubs: default: subtitles = speech_mute = true; break; @@ -460,18 +457,6 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data // 'true' because if control is disabled then event do not pass setVolumeSettingsState(true); break; - case kSubtitleToggle: - if (_subMode < 2) - _subMode++; - else - _subMode = 0; - - _subToggleButton->setLabel(g_system->getOverlayWidth() > 320 ? _(_subModeDesc[_subMode]) : _(_lowresSubModeDesc[_subMode])); - _subToggleButton->draw(); - _subSpeedDesc->draw(); - _subSpeedSlider->draw(); - _subSpeedLabel->draw(); - break; case kSubtitleSpeedChanged: _subSpeedLabel->setValue(_subSpeedSlider->getValue()); _subSpeedLabel->draw(); @@ -576,7 +561,7 @@ void OptionsDialog::setSubtitleSettingsState(bool enabled) { if ((_guioptions & Common::GUIO_NOSUBTITLES) || (_guioptions & Common::GUIO_NOSPEECH)) ena = false; - _subToggleButton->setEnabled(ena); + _subToggleGroup->setEnabled(ena); _subToggleDesc->setEnabled(ena); ena = enabled; @@ -685,7 +670,20 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) { _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:")); - _subToggleButton = new ButtonWidget(boss, prefix + "subToggleButton", "", kSubtitleToggle); + + if (g_system->getOverlayWidth() > 320) { + _subToggleGroup = new RadiobuttonGroup(boss, kSubtitleToggle); + + _subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Speech")); + _subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subtitles")); + _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both")); + } else { + _subToggleGroup = new RadiobuttonGroup(boss, kSubtitleToggle); + + _subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Spch")); + _subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subs")); + _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both")); + } // Subtitle speed _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:")); @@ -729,19 +727,19 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { if (_guioptions & Common::GUIO_NOSUBTITLES) - return 0; // Speech only + return kSubtitlesSpeech; // Speech only if (_guioptions & Common::GUIO_NOSPEECH) - return 2; // Subtitles only + return kSubtitlesSubs; // Subtitles only if (!subtitles && !speech_mute) // Speech only - return 0; + return kSubtitlesSpeech; else if (subtitles && !speech_mute) // Speech and subtitles - return 1; + return kSubtitlesBoth; else if (subtitles && speech_mute) // Subtitles only - return 2; + return kSubtitlesSubs; else warning("Wrong configuration: Both subtitles and speech are off. Assuming subtitles only"); - return 2; + return kSubtitlesSubs; } void OptionsDialog::reflowLayout() { diff --git a/gui/options.h b/gui/options.h index de25bfc998..48282a7fd7 100644 --- a/gui/options.h +++ b/gui/options.h @@ -121,7 +121,10 @@ private: int getSubtitleMode(bool subtitles, bool speech_mute); bool _enableSubtitleSettings; StaticTextWidget *_subToggleDesc; - ButtonWidget *_subToggleButton; + RadiobuttonGroup *_subToggleGroup; + RadiobuttonWidget *_subToggleSubOnly; + RadiobuttonWidget *_subToggleSpeechOnly; + RadiobuttonWidget *_subToggleSubBoth; int _subMode; static const char *_subModeDesc[]; static const char *_lowresSubModeDesc[]; diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 93897a7d88..9d1cabf7f0 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -349,6 +349,63 @@ "fill='none' " "/> " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " +" " " " @@ -560,9 +620,14 @@ " " -" " +" " +" " " " " " @@ -721,6 +786,14 @@ "type='PopUp' " "/> " " " +" " +" " +" " +" " " " @@ -957,9 +1030,14 @@ " " -" " +" " +" " " " " " @@ -1116,6 +1194,9 @@ " " +" " " " @@ -1281,13 +1362,18 @@ "type='PopUp' " "/> " " " -" " +" " " " -" " +" " +" " " " " " @@ -1449,6 +1535,14 @@ "type='PopUp' " "/> " " " +" " +" " +" " +" " " " @@ -1687,13 +1781,18 @@ "/> " " " " " -" " +" " " " -" " +" " +" " " " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 1a4481376d..bff76afd91 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_gfx.stx b/gui/themes/scummclassic/classic_gfx.stx index cc6d7d471f..e107c1f04d 100644 --- a/gui/themes/scummclassic/classic_gfx.stx +++ b/gui/themes/scummclassic/classic_gfx.stx @@ -418,6 +418,69 @@ /> + + + + + + + + + + + + + + + + + + + + @@ -241,9 +244,14 @@ - + + @@ -661,9 +669,14 @@ - + + diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 8a0180db3c..3573e56a79 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -63,6 +63,9 @@ + @@ -235,13 +238,18 @@ type = 'PopUp' /> - + - + + @@ -407,6 +415,14 @@ type = 'PopUp' /> + + + + @@ -655,13 +671,18 @@ /> - + - + + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 64e9a633ff..a301e25f14 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/radiobutton.bmp b/gui/themes/scummmodern/radiobutton.bmp new file mode 100755 index 0000000000..d3ba468321 Binary files /dev/null and b/gui/themes/scummmodern/radiobutton.bmp differ diff --git a/gui/themes/scummmodern/radiobutton_empty.bmp b/gui/themes/scummmodern/radiobutton_empty.bmp new file mode 100755 index 0000000000..06b9f9bb70 Binary files /dev/null and b/gui/themes/scummmodern/radiobutton_empty.bmp differ diff --git a/gui/themes/scummmodern/scummmodern_gfx.stx b/gui/themes/scummmodern/scummmodern_gfx.stx index 05316b516f..13f9cd2196 100644 --- a/gui/themes/scummmodern/scummmodern_gfx.stx +++ b/gui/themes/scummmodern/scummmodern_gfx.stx @@ -98,6 +98,8 @@ + + @@ -595,6 +597,42 @@ /> + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 699d59b0be..787696dc34 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -70,6 +70,9 @@ + @@ -254,9 +257,14 @@ - + + @@ -674,9 +682,17 @@ - + + diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 1c2f83a3b7..9b811f5a48 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -61,6 +61,9 @@ + @@ -233,13 +236,18 @@ type = 'PopUp' /> - + - + + @@ -403,6 +411,14 @@ type = 'PopUp' /> + + + + @@ -655,9 +671,14 @@ - + + diff --git a/gui/widget.cpp b/gui/widget.cpp index c47c6099ba..1958ffe398 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -334,6 +334,74 @@ void CheckboxWidget::drawWidget() { g_gui.theme()->drawCheckbox(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, Widget::_state); } +#pragma mark - +RadiobuttonGroup::RadiobuttonGroup(GuiObject *boss, uint32 cmd) : CommandSender(boss) { + _value = -1; + _cmd = cmd; +} + +void RadiobuttonGroup::setValue(int value) { + Common::Array::iterator button = _buttons.begin(); + while (button != _buttons.end()) { + (*button)->setState((*button)->getValue() == value, false); + + button++; + } + + _value = value; + + sendCommand(_cmd, _value); +} + +void RadiobuttonGroup::setEnabled(bool ena) { + Common::Array::iterator button = _buttons.begin(); + while (button != _buttons.end()) { + (*button)->setEnabled(ena); + + button++; + } +} + +#pragma mark - + +RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey) + : ButtonWidget(boss, x, y, w, h, label, 0, hotkey), _state(false), _value(value), _group(group) { + setFlags(WIDGET_ENABLED); + _type = kRadiobuttonWidget; + _group->addButton(this); +} + +RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey) + : ButtonWidget(boss, name, label, 0, hotkey), _state(false), _value(value), _group(group) { + setFlags(WIDGET_ENABLED); + _type = kRadiobuttonWidget; + _group->addButton(this); +} + +void RadiobuttonWidget::handleMouseUp(int x, int y, int button, int clickCount) { + if (isEnabled() && x >= 0 && x < _w && y >= 0 && y < _h) { + toggleState(); + } +} + +void RadiobuttonWidget::setState(bool state, bool setGroup) { + if (setGroup) { + _group->setValue(_value); + return; + } + + if (_state != state) { + _state = state; + //_flags ^= WIDGET_INV_BORDER; + draw(); + } + sendCommand(_cmd, _state); +} + +void RadiobuttonWidget::drawWidget() { + g_gui.theme()->drawRadiobutton(Common::Rect(_x, _y, _x+_w, _y+_h), _label, _state, Widget::_state); +} + #pragma mark - SliderWidget::SliderWidget(GuiObject *boss, int x, int y, int w, int h, uint32 cmd) diff --git a/gui/widget.h b/gui/widget.h index 3bbc565bbe..0b075c19db 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -62,6 +62,7 @@ enum { kEditTextWidget = 'EDIT', kButtonWidget = 'BTTN', kCheckboxWidget = 'CHKB', + kRadiobuttonWidget = 'RDBT', kSliderWidget = 'SLDE', kListWidget = 'LIST', kScrollBarWidget = 'SCRB', @@ -213,6 +214,55 @@ protected: void drawWidget(); }; +class RadiobuttonWidget; + +class RadiobuttonGroup : public CommandSender { +public: + RadiobuttonGroup(GuiObject *boss, uint32 cmd = 0); + ~RadiobuttonGroup() {} + + void addButton(RadiobuttonWidget *button) { _buttons.push_back(button); } + Common::Array getButtonList() const { return _buttons; } + + void setValue(int state); + int getValue() const { return _value; } + + void setEnabled(bool ena); + + void setCmd(uint32 cmd) { _cmd = cmd; } + uint32 getCmd() const { return _cmd; } + +protected: + Common::Array _buttons; + int _value; + uint32 _cmd; +}; + +/* RadiobuttonWidget */ +class RadiobuttonWidget : public ButtonWidget { +protected: + bool _state; + int _value; + +public: + RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey = 0); + RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey = 0); + + void handleMouseUp(int x, int y, int button, int clickCount); + virtual void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); } + virtual void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); draw(); } + + void setState(bool state, bool setGroup = true); + void toggleState() { setState(!_state); } + bool getState() const { return _state; } + int getValue() const { return _value; } + +protected: + void drawWidget(); + + RadiobuttonGroup *_group; +}; + /* SliderWidget */ class SliderWidget : public Widget, public CommandSender { protected: diff --git a/po/hu_HU.po b/po/hu_HU.po index 329d62b721..5f352f17f1 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 17:42+0300\n" +"POT-Creation-Date: 2010-06-10 23:21+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -111,13 +111,14 @@ msgstr "" msgid "Name:" msgstr "" -#: gui/launcher.cpp:181 gui/options.cpp:839 +#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 msgid "Language:" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 +#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 msgid "" msgstr "" @@ -126,10 +127,12 @@ msgid "Platform:" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "Graphics" msgstr "Grafikával" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "GFX" msgstr "" @@ -137,7 +140,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:212 gui/options.cpp:772 +#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 msgid "Audio" msgstr "Hang" @@ -145,7 +148,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:222 gui/options.cpp:776 +#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 msgid "Volume" msgstr "Volumene" @@ -153,7 +156,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:231 gui/options.cpp:784 +#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 msgid "MIDI" msgstr "" @@ -161,7 +164,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:243 gui/options.cpp:790 +#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 msgid "Paths" msgstr "Ösvények" @@ -170,7 +173,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:253 gui/options.cpp:803 +#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -188,7 +191,10 @@ msgstr "Extra #: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 #: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 #: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 +#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 +#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 +#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 +#: gui/options.cpp:806 gui/options.cpp:1043 msgid "None" msgstr "Semmi" @@ -198,6 +204,7 @@ msgid "Default" msgstr "" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +#: gui/options.cpp:1037 msgid "Select SoundFont" msgstr "" @@ -328,43 +335,43 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "Never" msgstr "Soha" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 5 mins" msgstr "5 percenként" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 10 mins" msgstr "10 percenként" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 15 mins" msgstr "15 percenként" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 30 mins" msgstr "30 percenként" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "8 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "11kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "22 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "44 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "48 kHz" msgstr "" @@ -384,131 +391,131 @@ msgstr "Csak feliratok" msgid "Speech & Subs" msgstr "Beszéd s Feliratok" -#: gui/options.cpp:595 +#: gui/options.cpp:595 gui/options.cpp:580 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:606 +#: gui/options.cpp:606 gui/options.cpp:591 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:616 +#: gui/options.cpp:616 gui/options.cpp:601 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:619 +#: gui/options.cpp:619 gui/options.cpp:604 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:626 +#: gui/options.cpp:626 gui/options.cpp:611 msgid "Music driver:" msgstr "Zenei vezet :" -#: gui/options.cpp:637 +#: gui/options.cpp:637 gui/options.cpp:622 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:648 +#: gui/options.cpp:648 gui/options.cpp:633 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:660 +#: gui/options.cpp:660 gui/options.cpp:645 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 +#: gui/options.cpp:665 gui/options.cpp:650 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:668 +#: gui/options.cpp:668 gui/options.cpp:653 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:671 +#: gui/options.cpp:671 gui/options.cpp:656 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:674 +#: gui/options.cpp:674 gui/options.cpp:659 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:687 +#: gui/options.cpp:687 gui/options.cpp:672 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:691 +#: gui/options.cpp:691 gui/options.cpp:689 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:703 +#: gui/options.cpp:703 gui/options.cpp:701 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:710 +#: gui/options.cpp:710 gui/options.cpp:708 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:713 +#: gui/options.cpp:713 gui/options.cpp:711 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:720 +#: gui/options.cpp:720 gui/options.cpp:718 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:797 +#: gui/options.cpp:797 gui/options.cpp:795 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 +#: gui/options.cpp:800 gui/options.cpp:798 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 +#: gui/options.cpp:807 gui/options.cpp:805 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 +#: gui/options.cpp:812 gui/options.cpp:810 msgid "Misc" msgstr "" -#: gui/options.cpp:814 +#: gui/options.cpp:814 gui/options.cpp:812 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:818 +#: gui/options.cpp:818 gui/options.cpp:816 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:824 +#: gui/options.cpp:824 gui/options.cpp:822 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:832 engines/dialogs.cpp:305 +#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:844 +#: gui/options.cpp:844 gui/options.cpp:842 msgid "English" msgstr "" -#: gui/options.cpp:996 gui/options.cpp:991 +#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1003 gui/options.cpp:998 +#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1012 gui/options.cpp:1007 +#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1022 gui/options.cpp:1017 +#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1033 gui/options.cpp:1028 +#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 msgid "Select directory for plugins" msgstr "" @@ -692,19 +699,19 @@ msgstr "" msgid "Save game:" msgstr "" -#: gui/options.cpp:978 +#: gui/options.cpp:978 gui/options.cpp:976 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/ThemeEngine.cpp:333 +#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:334 +#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "" @@ -871,3 +878,25 @@ msgstr "" #: engines/scumm/dialogs.cpp:289 msgid "~C~lose" msgstr "" + +#: gui/options.cpp:677 +#, fuzzy +msgid "Speech" +msgstr "Csak a beszéd" + +#: gui/options.cpp:678 +#, fuzzy +msgid "Subtitles" +msgstr "Csak feliratok" + +#: gui/options.cpp:679 gui/options.cpp:685 +msgid "Both" +msgstr "" + +#: gui/options.cpp:683 +msgid "Spch" +msgstr "" + +#: gui/options.cpp:684 +msgid "Subs" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index 40a36a013d..bb35629d91 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 17:42+0300\n" +"POT-Creation-Date: 2010-06-10 23:21+0300\n" "PO-Revision-Date: 2010-06-08 08:52-0100\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -112,13 +112,14 @@ msgstr "ID:" msgid "Name:" msgstr "Íàçâàíèå:" -#: gui/launcher.cpp:181 gui/options.cpp:839 +#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 msgid "Language:" msgstr "ßçûê:" #: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 +#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 msgid "" msgstr "<ïî óìîë÷àíèþ>" @@ -127,10 +128,12 @@ msgid "Platform:" msgstr "Ïëàòôîðìà:" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "Graphics" msgstr "Ãðàôèêà" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "GFX" msgstr "Ãðô" @@ -138,7 +141,7 @@ msgstr " msgid "Override global graphic settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" -#: gui/launcher.cpp:212 gui/options.cpp:772 +#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 msgid "Audio" msgstr "Àóäèî" @@ -146,7 +149,7 @@ msgstr " msgid "Override global audio settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" -#: gui/launcher.cpp:222 gui/options.cpp:776 +#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 msgid "Volume" msgstr "Ãðîìêîñòü" @@ -154,7 +157,7 @@ msgstr " msgid "Override global volume settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" -#: gui/launcher.cpp:231 gui/options.cpp:784 +#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 msgid "MIDI" msgstr "MIDI" @@ -162,7 +165,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" -#: gui/launcher.cpp:243 gui/options.cpp:790 +#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 msgid "Paths" msgstr "Ïóòè" @@ -170,7 +173,7 @@ msgstr " msgid "Game Path:" msgstr "Ïóòü ê èãðå: " -#: gui/launcher.cpp:253 gui/options.cpp:803 +#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 msgid "Extra Path:" msgstr "Äîï. ïóòü:" @@ -187,7 +190,10 @@ msgstr " #: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 #: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 #: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 +#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 +#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 +#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 +#: gui/options.cpp:806 gui/options.cpp:1043 msgid "None" msgstr "Íå çàäàí" @@ -196,6 +202,7 @@ msgid "Default" msgstr "Ïî óìîë÷àíèþ" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +#: gui/options.cpp:1037 msgid "Select SoundFont" msgstr "Âûáåðèòå SoundFont" @@ -327,43 +334,43 @@ msgstr " msgid "Discovered %d new games ..." msgstr "Íàéäåíî %d íîâûõ èãð ..." -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "Never" msgstr "Íèêîãäà" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 5 mins" msgstr "êàæäûå 5 ìèíóò" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 10 mins" msgstr "êàæäûå 10 ìèíóò" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 15 mins" msgstr "êàæäûå 15 ìèíóò" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 30 mins" msgstr "êàæäûå 30 ìèíóò" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "8 kHz" msgstr "8 êÃö" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "11kHz" msgstr "11 êÃö" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "22 kHz" msgstr "22 êÃö" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "44 kHz" msgstr "44 êÃö" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "48 kHz" msgstr "48 êÃö" @@ -383,131 +390,131 @@ msgstr " msgid "Speech & Subs" msgstr "Çâóê è ñóá." -#: gui/options.cpp:595 +#: gui/options.cpp:595 gui/options.cpp:580 msgid "Graphics mode:" msgstr "Ãðàôè÷åñêèé ðåæèì:" -#: gui/options.cpp:606 +#: gui/options.cpp:606 gui/options.cpp:591 msgid "Render mode:" msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" -#: gui/options.cpp:616 +#: gui/options.cpp:616 gui/options.cpp:601 msgid "Fullscreen mode" msgstr "Ïîëíîýêðàííûé ðåæèì" -#: gui/options.cpp:619 +#: gui/options.cpp:619 gui/options.cpp:604 msgid "Aspect ratio correction" msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" -#: gui/options.cpp:626 +#: gui/options.cpp:626 gui/options.cpp:611 msgid "Music driver:" msgstr "Äðàéâåð ìóçûêè:" -#: gui/options.cpp:637 +#: gui/options.cpp:637 gui/options.cpp:622 msgid "AdLib emulator:" msgstr "Ýìóëÿòîð AdLib:" -#: gui/options.cpp:648 +#: gui/options.cpp:648 gui/options.cpp:633 msgid "Output rate:" msgstr "Âûõîäíàÿ ÷àñòîòà:" -#: gui/options.cpp:660 +#: gui/options.cpp:660 gui/options.cpp:645 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:665 +#: gui/options.cpp:665 gui/options.cpp:650 msgid "Mixed AdLib/MIDI mode" msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" -#: gui/options.cpp:668 +#: gui/options.cpp:668 gui/options.cpp:653 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" -#: gui/options.cpp:671 +#: gui/options.cpp:671 gui/options.cpp:656 msgid "Enable Roland GS Mode" msgstr "Âêëþ÷èòü ðåæèì Roland GS" -#: gui/options.cpp:674 +#: gui/options.cpp:674 gui/options.cpp:659 msgid "MIDI gain:" msgstr "Óñèëåíèå MIDI:" -#: gui/options.cpp:687 +#: gui/options.cpp:687 gui/options.cpp:672 msgid "Text and Speech:" msgstr "Òåêñò è îçâó÷êà:" -#: gui/options.cpp:691 +#: gui/options.cpp:691 gui/options.cpp:689 msgid "Subtitle speed:" msgstr "Ñêîðîñòü ñóáòèòðîâ:" -#: gui/options.cpp:703 +#: gui/options.cpp:703 gui/options.cpp:701 msgid "Music volume:" msgstr "Ãðîìêîñòü ìóçûêè:" -#: gui/options.cpp:710 +#: gui/options.cpp:710 gui/options.cpp:708 msgid "Mute All" msgstr "Âûêëþ÷èòü âñ¸" -#: gui/options.cpp:713 +#: gui/options.cpp:713 gui/options.cpp:711 msgid "SFX volume:" msgstr "Ãðîìêîñòü ýôôåêòîâ:" -#: gui/options.cpp:720 +#: gui/options.cpp:720 gui/options.cpp:718 msgid "Speech volume:" msgstr "Ãðîìêîñòü îçâó÷êè:" -#: gui/options.cpp:797 +#: gui/options.cpp:797 gui/options.cpp:795 msgid "Save Path: " msgstr "Ïóòü äëÿ ñîõðàíåíèé: " -#: gui/options.cpp:800 +#: gui/options.cpp:800 gui/options.cpp:798 msgid "Theme Path:" msgstr "Ïóòü ê òåìàì:" -#: gui/options.cpp:807 +#: gui/options.cpp:807 gui/options.cpp:805 msgid "Plugins Path:" msgstr "Ïóòü ê ïëàãèíàì:" -#: gui/options.cpp:812 +#: gui/options.cpp:812 gui/options.cpp:810 msgid "Misc" msgstr "Ðàçíîå" -#: gui/options.cpp:814 +#: gui/options.cpp:814 gui/options.cpp:812 msgid "Theme:" msgstr "Òåìà:" -#: gui/options.cpp:818 +#: gui/options.cpp:818 gui/options.cpp:816 msgid "GUI Renderer:" msgstr "Ðàñòåðèçàòîð GUI:" -#: gui/options.cpp:824 +#: gui/options.cpp:824 gui/options.cpp:822 msgid "Autosave:" msgstr "Àâòîñîõðàíåíèå:" -#: gui/options.cpp:832 engines/dialogs.cpp:305 +#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 msgid "Keys" msgstr "Êëàâèøè" -#: gui/options.cpp:844 +#: gui/options.cpp:844 gui/options.cpp:842 msgid "English" msgstr "English" -#: gui/options.cpp:996 gui/options.cpp:991 +#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 msgid "Select directory for savegames" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" -#: gui/options.cpp:1003 gui/options.cpp:998 +#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." -#: gui/options.cpp:1012 gui/options.cpp:1007 +#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 msgid "Select directory for GUI themes" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" -#: gui/options.cpp:1022 gui/options.cpp:1017 +#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 msgid "Select directory for extra files" msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" -#: gui/options.cpp:1033 gui/options.cpp:1028 +#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 msgid "Select directory for plugins" msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" @@ -691,19 +698,19 @@ msgstr " msgid "Save game:" msgstr "Ñîõðàíèòü èãðó: " -#: gui/options.cpp:978 +#: gui/options.cpp:978 gui/options.cpp:976 msgid "You have to restart ScummVM to take the effect." msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." -#: gui/ThemeEngine.cpp:333 +#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "Áåç ãðàôèêè" -#: gui/ThemeEngine.cpp:334 +#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "Ñòàíäàðòíûé ðàñòåðèçàòîð (16bpp)" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" @@ -866,3 +873,23 @@ msgstr "~ #: engines/scumm/dialogs.cpp:289 msgid "~C~lose" msgstr "~Ç~àêðûòü" + +#: gui/options.cpp:677 +msgid "Speech" +msgstr "Îçâó÷êà" + +#: gui/options.cpp:678 +msgid "Subtitles" +msgstr "Ñóáòèòðû" + +#: gui/options.cpp:679 gui/options.cpp:685 +msgid "Both" +msgstr "Âñ¸" + +#: gui/options.cpp:683 +msgid "Spch" +msgstr "Îçâ" + +#: gui/options.cpp:684 +msgid "Subs" +msgstr "Ñóá" diff --git a/po/scummvm.pot b/po/scummvm.pot index be9b114111..a327eb08e5 100755 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 17:42+0300\n" +"POT-Creation-Date: 2010-06-10 23:21+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -111,13 +111,14 @@ msgstr "" msgid "Name:" msgstr "" -#: gui/launcher.cpp:181 gui/options.cpp:839 +#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 msgid "Language:" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 +#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 +#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 msgid "" msgstr "" @@ -126,10 +127,12 @@ msgid "Platform:" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "Graphics" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +#: gui/options.cpp:747 gui/options.cpp:764 msgid "GFX" msgstr "" @@ -137,7 +140,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:212 gui/options.cpp:772 +#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 msgid "Audio" msgstr "" @@ -145,7 +148,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:222 gui/options.cpp:776 +#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 msgid "Volume" msgstr "" @@ -153,7 +156,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:231 gui/options.cpp:784 +#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 msgid "MIDI" msgstr "" @@ -161,7 +164,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:243 gui/options.cpp:790 +#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 msgid "Paths" msgstr "" @@ -169,7 +172,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:253 gui/options.cpp:803 +#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 msgid "Extra Path:" msgstr "" @@ -186,7 +189,10 @@ msgstr "" #: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 #: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 #: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 +#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 +#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 +#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 +#: gui/options.cpp:806 gui/options.cpp:1043 msgid "None" msgstr "" @@ -195,6 +201,7 @@ msgid "Default" msgstr "" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +#: gui/options.cpp:1037 msgid "Select SoundFont" msgstr "" @@ -324,43 +331,43 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "Never" msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 5 mins" msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 10 mins" msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 15 mins" msgstr "" -#: gui/options.cpp:71 +#: gui/options.cpp:71 gui/options.cpp:77 msgid "every 30 mins" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "8 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "11kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "22 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "44 kHz" msgstr "" -#: gui/options.cpp:73 +#: gui/options.cpp:73 gui/options.cpp:79 msgid "48 kHz" msgstr "" @@ -380,131 +387,131 @@ msgstr "" msgid "Speech & Subs" msgstr "" -#: gui/options.cpp:595 +#: gui/options.cpp:595 gui/options.cpp:580 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:606 +#: gui/options.cpp:606 gui/options.cpp:591 msgid "Render mode:" msgstr "" -#: gui/options.cpp:616 +#: gui/options.cpp:616 gui/options.cpp:601 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:619 +#: gui/options.cpp:619 gui/options.cpp:604 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:626 +#: gui/options.cpp:626 gui/options.cpp:611 msgid "Music driver:" msgstr "" -#: gui/options.cpp:637 +#: gui/options.cpp:637 gui/options.cpp:622 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:648 +#: gui/options.cpp:648 gui/options.cpp:633 msgid "Output rate:" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:660 gui/options.cpp:645 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 +#: gui/options.cpp:665 gui/options.cpp:650 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:668 +#: gui/options.cpp:668 gui/options.cpp:653 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:671 +#: gui/options.cpp:671 gui/options.cpp:656 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:674 +#: gui/options.cpp:674 gui/options.cpp:659 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:687 +#: gui/options.cpp:687 gui/options.cpp:672 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:691 +#: gui/options.cpp:691 gui/options.cpp:689 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:703 +#: gui/options.cpp:703 gui/options.cpp:701 msgid "Music volume:" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:710 gui/options.cpp:708 msgid "Mute All" msgstr "" -#: gui/options.cpp:713 +#: gui/options.cpp:713 gui/options.cpp:711 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:720 +#: gui/options.cpp:720 gui/options.cpp:718 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:797 +#: gui/options.cpp:797 gui/options.cpp:795 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 +#: gui/options.cpp:800 gui/options.cpp:798 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 +#: gui/options.cpp:807 gui/options.cpp:805 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 +#: gui/options.cpp:812 gui/options.cpp:810 msgid "Misc" msgstr "" -#: gui/options.cpp:814 +#: gui/options.cpp:814 gui/options.cpp:812 msgid "Theme:" msgstr "" -#: gui/options.cpp:818 +#: gui/options.cpp:818 gui/options.cpp:816 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:824 +#: gui/options.cpp:824 gui/options.cpp:822 msgid "Autosave:" msgstr "" -#: gui/options.cpp:832 engines/dialogs.cpp:305 +#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 msgid "Keys" msgstr "" -#: gui/options.cpp:844 +#: gui/options.cpp:844 gui/options.cpp:842 msgid "English" msgstr "" -#: gui/options.cpp:996 gui/options.cpp:991 +#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1003 gui/options.cpp:998 +#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1012 gui/options.cpp:1007 +#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1022 gui/options.cpp:1017 +#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1033 gui/options.cpp:1028 +#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 msgid "Select directory for plugins" msgstr "" @@ -686,19 +693,19 @@ msgstr "" msgid "Save game:" msgstr "" -#: gui/options.cpp:978 +#: gui/options.cpp:978 gui/options.cpp:976 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/ThemeEngine.cpp:333 +#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:334 +#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:336 +#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" msgstr "" @@ -861,3 +868,23 @@ msgstr "" #: engines/scumm/dialogs.cpp:289 msgid "~C~lose" msgstr "" + +#: gui/options.cpp:677 +msgid "Speech" +msgstr "" + +#: gui/options.cpp:678 +msgid "Subtitles" +msgstr "" + +#: gui/options.cpp:679 gui/options.cpp:685 +msgid "Both" +msgstr "" + +#: gui/options.cpp:683 +msgid "Spch" +msgstr "" + +#: gui/options.cpp:684 +msgid "Subs" +msgstr "" -- cgit v1.2.3 From 24abc6fb39ebf79e06fb39888bba6ae7e87f771a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:49:16 +0000 Subject: GUI: Improved look of GMM options menu. svn-id: r49768 --- gui/themes/default.inc | 11 ++++++++- gui/themes/scummclassic.zip | Bin 54695 -> 54961 bytes gui/themes/scummclassic/classic_layout.stx | 3 +++ gui/themes/scummclassic/classic_layout_lowres.stx | 26 +++++++++++++-------- gui/themes/scummmodern.zip | Bin 162132 -> 162341 bytes gui/themes/scummmodern/scummmodern_layout.stx | 6 ++--- .../scummmodern/scummmodern_layout_lowres.stx | 26 +++++++++++++-------- 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 9d1cabf7f0..8dabe7c998 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1032,12 +1032,15 @@ "/> " " " " " " " " " " " @@ -1781,20 +1784,26 @@ "/> " " " " " -" " +" " " " +" " " " " " " " " " +" " +" " " " " diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 3573e56a79..a2fc1097f2 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -671,20 +671,26 @@ /> - + - - - + + + + + + diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 9b811f5a48..72965d73f7 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -667,20 +667,26 @@ /> - + - - - + + + + + + 55015 bytes gui/themes/scummclassic/classic_layout_lowres.stx | 4 +++- gui/themes/scummmodern.zip | Bin 162341 -> 162447 bytes .../scummmodern/scummmodern_layout_lowres.stx | 6 +++++- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 8dabe7c998..636e7f4ff0 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1540,7 +1540,9 @@ " " " " " " " 55147 bytes gui/themes/scummclassic/classic_layout.stx | 3 +++ gui/themes/scummclassic/classic_layout_lowres.stx | 3 +++ gui/themes/scummmodern.zip | Bin 162447 -> 162581 bytes gui/themes/scummmodern/scummmodern_layout.stx | 5 +++++ .../scummmodern/scummmodern_layout_lowres.stx | 3 +++ 9 files changed, 34 insertions(+), 3 deletions(-) diff --git a/gui/TabWidget.cpp b/gui/TabWidget.cpp index 691eebf033..275e3613b5 100644 --- a/gui/TabWidget.cpp +++ b/gui/TabWidget.cpp @@ -37,12 +37,12 @@ enum { }; TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h) - : Widget(boss, x, y, w, h) { + : Widget(boss, x, y, w, h), _bodyBackgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) { init(); } TabWidget::TabWidget(GuiObject *boss, const String &name) - : Widget(boss, name) { + : Widget(boss, name), _bodyBackgroundType(GUI::ThemeEngine::kDialogBackgroundDefault) { init(); } @@ -56,7 +56,12 @@ void TabWidget::init() { _tabHeight = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Height"); _titleVPad = g_gui.xmlEval()->getVar("Globals.TabWidget.Tab.Padding.Top"); - _butRP = g_gui.xmlEval()->getVar("Globals.TabWidget.navButtonPadding.Right", 0); + _bodyTP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Top"); + _bodyBP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Bottom"); + _bodyLP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Left"); + _bodyRP = g_gui.xmlEval()->getVar("Globals.TabWidget.Body.Padding.Right"); + + _butRP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButtonPadding.Right", 0); _butTP = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Padding.Top", 0); _butW = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Width", 10); _butH = g_gui.xmlEval()->getVar("Globals.TabWidget.NavButton.Height", 10); @@ -279,11 +284,14 @@ void TabWidget::drawWidget() { for (int i = _firstVisibleTab; i < (int)_tabs.size(); ++i) { tabs.push_back(_tabs[i].title); } + g_gui.theme()->drawDialogBackground(Common::Rect(_x + _bodyLP, _y + _bodyTP, _x+_w-_bodyRP, _y+_h-_bodyBP), _bodyBackgroundType); + g_gui.theme()->drawTab(Common::Rect(_x, _y, _x+_w, _y+_h), _tabHeight, _tabWidth, tabs, _activeTab - _firstVisibleTab, 0, _titleVPad); } void TabWidget::draw() { Widget::draw(); + if (_tabWidth * _tabs.size() > _w) { _navLeft->draw(); _navRight->draw(); diff --git a/gui/TabWidget.h b/gui/TabWidget.h index 81544c2de7..e7b8733d8f 100644 --- a/gui/TabWidget.h +++ b/gui/TabWidget.h @@ -46,6 +46,9 @@ protected: int _tabWidth; int _tabHeight; + int _bodyRP, _bodyTP, _bodyLP, _bodyBP; + ThemeEngine::DialogBackground _bodyBackgroundType; + int _titleVPad; int _butRP, _butTP, _butW, _butH; diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 636e7f4ff0..17294703f4 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -469,6 +469,9 @@ "size='75,27' " "padding='0,0,8,0' " "/> " +" " " " +" " " + + + + + + getTimerManager()->installTimerProc(&musicVolumeGaugeCallback, time * 100L, this); + _vm->getTimerManager()->installTimerProc(&musicVolumeGaugeCallback, time * 3000L, this); } bool Music::isPlaying() { diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp index 957ab3c8b6..5b13473d77 100644 --- a/engines/saga/puzzle.cpp +++ b/engines/saga/puzzle.cpp @@ -411,12 +411,12 @@ void Puzzle::solicitHint() { switch (_hintRqState) { case kRQSpeaking: if (_vm->_actor->isSpeaking()) { - _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50000, this); + _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50 * 1000000, this); break; } _hintRqState = _hintNextRqState; - _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 333333, this); + _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 100*1000000/3, this); break; case kRQNoHint: @@ -439,11 +439,11 @@ void Puzzle::solicitHint() { // Roll to see if Sakka scolds if (_vm->_rnd.getRandomNumber(1)) { _hintRqState = kRQSakkaDenies; - _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 200000, this); + _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 200*1000000, this); } else { _hintRqState = kRQSpeaking; _hintNextRqState = kRQHintRequested; - _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50000, this); + _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this); } break; @@ -456,7 +456,7 @@ void Puzzle::solicitHint() { _hintRqState = kRQSpeaking; _hintNextRqState = kRQHintRequestedStage2; - _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50000, this); + _vm->getTimerManager()->installTimerProc(&hintTimerCallback, 50*1000000, this); _vm->_interface->converseClear(); _vm->_interface->converseAddText(optionsStr[_lang][kROAccept], 0, 1, 0, 0 ); -- cgit v1.2.3 From a8a44a07d15aa3012ca27b38db3c702c3a40b0a3 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:51:10 +0000 Subject: SCI: Fix timer. installTimerProc requires interval specified in milliseconds, not microseconds. Correct palVary method accordingly. svn-id: r49772 --- engines/sci/graphics/palette.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index f9d320122b..d28fb2ada1 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -455,7 +455,7 @@ void GfxPalette::startPalVary(uint16 paletteId, uint16 ticks) { _palVaryId = paletteId; _palVaryStart = g_system->getMillis(); _palVaryEnd = _palVaryStart + ticks * 1000 / 60; - g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000 / 60, this); + g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60, this); } void GfxPalette::togglePalVary(bool pause) { -- cgit v1.2.3 From ea7405d7ef177a547d840424497d2f7ffd72626b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:51:26 +0000 Subject: GUI: Added default names for builtin fonts. svn-id: r49773 --- graphics/fontman.cpp | 12 ++++++++++++ graphics/fontman.h | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp index 1827cb69aa..808dbafa1a 100644 --- a/graphics/fontman.cpp +++ b/graphics/fontman.cpp @@ -57,7 +57,19 @@ FontManager::~FontManager() { g_consolefont = 0; } +const char *builtinFontNames[] = { + "builtinOSD", + "builtinConsole", + "builtinGUI", + "builtinBigGUI", + 0 +}; + const Font *FontManager::getFontByName(const Common::String &name) const { + for (int i = 0; builtinFontNames[i]; i++) + if (!strcmp(name.c_str(), builtinFontNames[i])) + return getFontByUsage((FontUsage)i); + if (!_fontMap.contains(name)) return 0; return _fontMap[name]; diff --git a/graphics/fontman.h b/graphics/fontman.h index 9896fad38c..7871f32ba9 100644 --- a/graphics/fontman.h +++ b/graphics/fontman.h @@ -38,10 +38,10 @@ namespace Graphics { class FontManager : public Common::Singleton { public: enum FontUsage { - kOSDFont, - kConsoleFont, - kGUIFont, - kBigGUIFont + kOSDFont = 0, + kConsoleFont = 1, + kGUIFont = 2, + kBigGUIFont = 3 }; /** -- cgit v1.2.3 From 01f9006ee7e8d0fd153f42fb00afbc25c4804d2b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:52:35 +0000 Subject: GUI: Implement tooltips. FR #2821513. FR #2821513: "GUI: add tooltips". Added tooltips for Add Game button, clear field buttons and couple other. Current problem: Only first call correctly restores text. I could not find where restore information gets lost. svn-id: r49774 --- engines/dialogs.cpp | 22 ++-- engines/scumm/dialogs.cpp | 6 +- gui/GuiManager.cpp | 31 ++++- gui/GuiManager.h | 6 + gui/PopUpWidget.cpp | 4 +- gui/PopUpWidget.h | 2 +- gui/TabWidget.cpp | 4 +- gui/ThemeEngine.cpp | 72 ++++++++++-- gui/ThemeEngine.h | 19 ++- gui/ThemeParser.cpp | 3 +- gui/browser.cpp | 6 +- gui/chooser.cpp | 4 +- gui/dialog.h | 1 + gui/launcher.cpp | 38 +++--- gui/massadd.cpp | 4 +- gui/message.cpp | 4 +- gui/options.cpp | 32 ++--- gui/saveload.cpp | 6 +- gui/themebrowser.cpp | 4 +- gui/themes/default.inc | 14 +++ gui/themes/scummclassic.zip | Bin 55147 -> 55660 bytes gui/themes/scummclassic/classic_gfx.stx | 9 ++ gui/themes/scummclassic/classic_layout.stx | 4 + gui/themes/scummclassic/classic_layout_lowres.stx | 4 + gui/themes/scummmodern.zip | Bin 162581 -> 162933 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 7 +- gui/themes/scummmodern/scummmodern_layout.stx | 4 + .../scummmodern/scummmodern_layout_lowres.stx | 4 + gui/widget.cpp | 129 ++++++++++++++++----- gui/widget.h | 57 ++++++--- 30 files changed, 375 insertions(+), 125 deletions(-) diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 0f391692e8..2397a474c6 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -86,31 +86,31 @@ MainMenuDialog::MainMenuDialog(Engine *engine) StaticTextWidget *version = new StaticTextWidget(this, "GlobalMenu.Version", gScummVMVersionDate); version->setAlign(Graphics::kTextAlignCenter); - new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("~R~esume"), kPlayCmd, 'P'); + new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("~R~esume"), 0, kPlayCmd, 'P'); - _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("~L~oad"), kLoadCmd); + _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("~L~oad"), 0, kLoadCmd); // TODO: setEnabled -> setVisible _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsLoadingDuringRuntime)); - _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("~S~ave"), kSaveCmd); + _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("~S~ave"), 0, kSaveCmd); // TODO: setEnabled -> setVisible _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsSavingDuringRuntime)); - new GUI::ButtonWidget(this, "GlobalMenu.Options", _("~O~ptions"), kOptionsCmd); + new GUI::ButtonWidget(this, "GlobalMenu.Options", _("~O~ptions"), 0, kOptionsCmd); // The help button is disabled by default. // To enable "Help", an engine needs to use a subclass of MainMenuDialog // (at least for now, we might change how this works in the future). - _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("~H~elp"), kHelpCmd); + _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("~H~elp"), 0, kHelpCmd); _helpButton->setEnabled(false); - new GUI::ButtonWidget(this, "GlobalMenu.About", _("~A~bout"), kAboutCmd); + new GUI::ButtonWidget(this, "GlobalMenu.About", _("~A~bout"), 0, kAboutCmd); - _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("~R~eturn to Launcher"), kRTLCmd); + _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("~R~eturn to Launcher"), 0, kRTLCmd); _rtlButton->setEnabled(_engine->hasFeature(Engine::kSupportsRTL)); - new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("~Q~uit"), kQuitCmd); + new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("~Q~uit"), 0, kQuitCmd); _aboutDialog = new GUI::AboutDialog(); _optionsDialog = new ConfigDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions)); @@ -298,11 +298,11 @@ ConfigDialog::ConfigDialog(bool subtitleControls) // Add the buttons // - new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("~O~K"), GUI::kOKCmd); - new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("~C~ancel"), GUI::kCloseCmd); + new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("~O~K"), 0, GUI::kOKCmd); + new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("~C~ancel"), 0, GUI::kCloseCmd); #ifdef SMALL_SCREEN_DEVICE - new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("~K~eys"), kKeysCmd); + new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("~K~eys"), 0, kKeysCmd); _keysDialog = NULL; #endif } diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp index 258b1875fe..1e0bf6d4be 100644 --- a/engines/scumm/dialogs.cpp +++ b/engines/scumm/dialogs.cpp @@ -284,9 +284,9 @@ HelpDialog::HelpDialog(const GameSettings &game) _numPages = ScummHelp::numPages(_game.id); - _prevButton = new GUI::ButtonWidget(this, "ScummHelp.Prev", _("~P~revious"), kPrevCmd); - _nextButton = new GUI::ButtonWidget(this, "ScummHelp.Next", _("~N~ext"), kNextCmd); - new GUI::ButtonWidget(this, "ScummHelp.Close", _("~C~lose"), GUI::kCloseCmd); + _prevButton = new GUI::ButtonWidget(this, "ScummHelp.Prev", _("~P~revious"), 0, kPrevCmd); + _nextButton = new GUI::ButtonWidget(this, "ScummHelp.Next", _("~N~ext"), 0, kNextCmd); + new GUI::ButtonWidget(this, "ScummHelp.Close", _("~C~lose"), 0, GUI::kCloseCmd); _prevButton->clearFlags(WIDGET_ENABLED); _numLines = HELP_NUM_LINES; diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index 9f04c382cb..49c078a723 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -27,6 +27,7 @@ #include "common/util.h" #include "common/config-manager.h" #include "common/algorithm.h" +#include "common/timer.h" #include "common/translation.h" #include "backends/keymapper/keymapper.h" @@ -49,7 +50,7 @@ enum { // Constructor GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), - _stateIsSaved(false), _cursorAnimateCounter(0), _cursorAnimateTimer(0) { + _stateIsSaved(false), _cursorAnimateCounter(0), _cursorAnimateTimer(0) { _theme = 0; _useStdCursor = false; @@ -75,10 +76,13 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), error(_t("Failed to load any GUI theme, aborting")); } } + + _tooltip = new Tooltip(this); } GuiManager::~GuiManager() { delete _theme; + delete _tooltip; } #ifdef ENABLE_KEYMAPPER @@ -220,6 +224,13 @@ Dialog *GuiManager::getTopDialog() const { return _dialogStack.top(); } +static void tooltipCallback(void *ref) { + GuiManager *guiManager = (GuiManager *)ref; + + guiManager->getTooltip()->setVisible(true); + g_system->getTimerManager()->removeTimerProc(&tooltipCallback); +} + void GuiManager::runLoop() { Dialog *activeDialog = getTopDialog(); bool didSaveState = false; @@ -278,6 +289,8 @@ void GuiManager::runLoop() { } Common::Event event; + + bool eventTookplace = false; while (eventMan->pollEvent(event)) { // The top dialog can change during the event loop. In that case, flush all the @@ -300,16 +313,21 @@ void GuiManager::runLoop() { switch (event.type) { case Common::EVENT_KEYDOWN: activeDialog->handleKeyDown(event.kbd); + eventTookplace = true; break; case Common::EVENT_KEYUP: activeDialog->handleKeyUp(event.kbd); + eventTookplace = true; break; case Common::EVENT_MOUSEMOVE: activeDialog->handleMouseMoved(mouse.x, mouse.y, 0); + _tooltip->setMouseXY(mouse.x, mouse.y); + eventTookplace = true; break; // We don't distinguish between mousebuttons (for now at least) case Common::EVENT_LBUTTONDOWN: case Common::EVENT_RBUTTONDOWN: + eventTookplace = true; button = (event.type == Common::EVENT_LBUTTONDOWN ? 1 : 2); time = _system->getMillis(); if (_lastClick.count && (time < _lastClick.time + kDoubleClickDelay) @@ -326,18 +344,22 @@ void GuiManager::runLoop() { break; case Common::EVENT_LBUTTONUP: case Common::EVENT_RBUTTONUP: + eventTookplace = true; button = (event.type == Common::EVENT_LBUTTONUP ? 1 : 2); activeDialog->handleMouseUp(mouse.x, mouse.y, button, _lastClick.count); break; case Common::EVENT_WHEELUP: + eventTookplace = true; activeDialog->handleMouseWheel(mouse.x, mouse.y, -1); break; case Common::EVENT_WHEELDOWN: + eventTookplace = true; activeDialog->handleMouseWheel(mouse.x, mouse.y, 1); break; case Common::EVENT_QUIT: return; case Common::EVENT_SCREEN_CHANGED: + eventTookplace = true; screenChange(); break; default: @@ -345,6 +367,13 @@ void GuiManager::runLoop() { } } + if (eventTookplace) { + _tooltip->setVisible(false); + + _system->getTimerManager()->removeTimerProc(&tooltipCallback); + _system->getTimerManager()->installTimerProc(&tooltipCallback, 2*1000000, this); + } + // Delay for a moment _system->delayMillis(10); } diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 3187a0ba73..2591838416 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -60,6 +60,7 @@ typedef Common::FixedStack DialogStack; */ class GuiManager : public Common::Singleton { friend class Dialog; + friend class Tooltip; friend class Common::Singleton; GuiManager(); ~GuiManager(); @@ -91,6 +92,9 @@ public: * @return true if the a screen change indeed occurred, false otherwise */ bool checkScreenChange(); + + Tooltip *getTooltip() { return _tooltip; } + protected: enum RedrawStatus { kRedrawDisabled = 0, @@ -114,6 +118,8 @@ protected: bool _useStdCursor; + Tooltip *_tooltip; + // position and time of last mouse click (used to detect double clicks) struct { int16 x, y; // Position of mouse when the click occured diff --git a/gui/PopUpWidget.cpp b/gui/PopUpWidget.cpp index 7463399e0b..1bd9cc5063 100644 --- a/gui/PopUpWidget.cpp +++ b/gui/PopUpWidget.cpp @@ -378,8 +378,8 @@ void PopUpDialog::drawMenuEntry(int entry, bool hilite) { // PopUpWidget // -PopUpWidget::PopUpWidget(GuiObject *boss, const String &name) - : Widget(boss, name), CommandSender(boss) { +PopUpWidget::PopUpWidget(GuiObject *boss, const String &name, const char *tooltip) + : Widget(boss, name, tooltip), CommandSender(boss) { setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_IGNORE_DRAG); _type = kPopUpWidget; diff --git a/gui/PopUpWidget.h b/gui/PopUpWidget.h index bd1d3b3918..d1c89e45ae 100644 --- a/gui/PopUpWidget.h +++ b/gui/PopUpWidget.h @@ -59,7 +59,7 @@ protected: int _rightPadding; public: - PopUpWidget(GuiObject *boss, const String &name); + PopUpWidget(GuiObject *boss, const String &name, const char *tooltip = 0); void handleMouseDown(int x, int y, int button, int clickCount); void handleMouseWheel(int x, int y, int direction); diff --git a/gui/TabWidget.cpp b/gui/TabWidget.cpp index 275e3613b5..ca409e50ab 100644 --- a/gui/TabWidget.cpp +++ b/gui/TabWidget.cpp @@ -68,8 +68,8 @@ void TabWidget::init() { int x = _w - _butRP - _butW * 2 - 2; int y = _butTP - _tabHeight; - _navLeft = new ButtonWidget(this, x, y, _butW, _butH, "<", kCmdLeft); - _navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", kCmdRight); + _navLeft = new ButtonWidget(this, x, y, _butW, _butH, "<", 0, kCmdLeft); + _navRight = new ButtonWidget(this, x + _butW + 2, y, _butW, _butH, ">", 0, kCmdRight); } TabWidget::~TabWidget() { diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 5bde44d792..8f4f767a94 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1070,7 +1070,7 @@ void ThemeEngine::drawTab(const Common::Rect &r, int tabHeight, int tabWidth, co } } -void ThemeEngine::drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, Graphics::TextAlign align, TextInversionState inverted, int deltax, bool useEllipsis, FontStyle font, FontColor color) { +void ThemeEngine::drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, Graphics::TextAlign align, TextInversionState inverted, int deltax, bool useEllipsis, FontStyle font, FontColor color, bool restore) { if (!ready()) return; @@ -1121,13 +1121,7 @@ void ThemeEngine::drawText(const Common::Rect &r, const Common::String &str, Wid return; } - TextData textId = kTextDataNone; - if (font == kFontStyleNormal) - textId = kTextDataNormalFont; - else - textId = kTextDataDefault; - - bool restore = true; + TextData textId = fontStyleToData(font); switch (inverted) { case kTextInversion: @@ -1169,7 +1163,69 @@ void ThemeEngine::debugWidgetPosition(const char *name, const Common::Rect &r) { _screen.vLine(r.right, r.top, r.bottom, 0xFFFF); } +ThemeEngine::StoredState *ThemeEngine::storeState(const Common::Rect &r) { + StoredState *state = new StoredState; + byte *dst; + byte *src; + + state->r.top = r.top; + state->r.bottom = r.bottom; + state->r.left = r.left; + state->r.right = r.right; + + state->r.clip(_screen.w, _screen.h); + state->screen.create(state->r.width(), state->r.height(), _screen.bytesPerPixel); + state->backBuffer.create(state->r.width(), state->r.height(), _backBuffer.bytesPerPixel); + + src = (byte *)_screen.getBasePtr(state->r.left, state->r.top); + dst = (byte *)state->screen.getBasePtr(0, 0); + + for (int i = state->r.height(); i > 0; i--) { + memcpy(dst, src, state->r.width() * _screen.bytesPerPixel); + src += _screen.pitch; + dst += state->screen.pitch; + } + + src = (byte *)_backBuffer.getBasePtr(state->r.left, state->r.top); + dst = (byte *)state->backBuffer.getBasePtr(0, 0); + + for (int i = state->r.height(); i > 0; i--) { + memcpy(dst, src, state->r.width() * _backBuffer.bytesPerPixel); + src += _backBuffer.pitch; + dst += state->backBuffer.pitch; + } + + return state; +} + +void ThemeEngine::restoreState(StoredState *state) { + byte *dst; + byte *src; + + if (!state) + return; + + src = (byte *)state->screen.getBasePtr(0, 0); + dst = (byte *)_screen.getBasePtr(state->r.left, state->r.top); + + for (int i = state->r.height(); i > 0; i--) { + memcpy(dst, src, state->r.width() * _screen.bytesPerPixel); + src += state->screen.pitch; + dst += _screen.pitch; + } + + src = (byte *)state->backBuffer.getBasePtr(0, 0); + dst = (byte *)_backBuffer.getBasePtr(state->r.left, state->r.top); + + for (int i = state->r.height(); i > 0; i--) { + memcpy(dst, src, state->r.width() * _backBuffer.bytesPerPixel); + src += state->backBuffer.pitch; + dst += _backBuffer.pitch; + } + + addDirtyRect(state->r); +} /********************************************************** * Screen/overlay management diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 2ef6fe3781..5f474f1a88 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -112,6 +112,7 @@ enum TextData { kTextDataDefault = 0, kTextDataButton, kTextDataNormalFont, + kTextDataTooltip, kTextDataMAX }; @@ -177,7 +178,7 @@ public: enum TextInversionState { kTextInversionNone, ///< Indicates that the text should not be drawn inverted kTextInversion, ///< Indicates that the text should be drawn inverted, but not focused - kTextInversionFocus ///< Indicates thte the test should be drawn inverted, and focused + kTextInversionFocus ///< Indicates that the text should be drawn inverted, and focused }; enum ScrollbarState { @@ -196,6 +197,7 @@ public: kFontStyleFixedNormal = 3, ///< Fixed size font. kFontStyleFixedBold = 4, ///< Fixed size bold font. kFontStyleFixedItalic = 5, ///< Fixed size italic font. + kFontStyleTooltip = 6, ///< Tiny console font kFontStyleMax }; @@ -259,6 +261,17 @@ public: void enable(); void disable(); + struct StoredState { + Common::Rect r; + Graphics::Surface screen; + Graphics::Surface backBuffer; + + StoredState() {} + }; + + StoredState *storeState(const Common::Rect &r); + void restoreState(StoredState *state); + /** * Implementation of the GUI::Theme API. Called when a * new dialog is opened. Note that the boolean parameter @@ -284,6 +297,8 @@ public: TextData fontStyleToData(FontStyle font) const { if (font == kFontStyleNormal) return kTextDataNormalFont; + if (font == kFontStyleTooltip) + return kTextDataTooltip; return kTextDataDefault; } @@ -336,7 +351,7 @@ public: void drawDialogBackground(const Common::Rect &r, DialogBackground type, WidgetStateInfo state = kStateEnabled); - void drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignCenter, TextInversionState inverted = kTextInversionNone, int deltax = 0, bool useEllipsis = true, FontStyle font = kFontStyleBold, FontColor color = kFontColorNormal); + void drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state = kStateEnabled, Graphics::TextAlign align = Graphics::kTextAlignCenter, TextInversionState inverted = kTextInversionNone, int deltax = 0, bool useEllipsis = true, FontStyle font = kFontStyleBold, FontColor color = kFontColorNormal, bool restore = true); void drawChar(const Common::Rect &r, byte ch, const Graphics::Font *font, WidgetStateInfo state = kStateEnabled, FontColor color = kFontColorNormal); diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index e22d440bd9..4cabf6ad2e 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -42,7 +42,8 @@ struct TextDataInfo { static const TextDataInfo kTextDataDefaults[] = { { kTextDataDefault, "text_default" }, { kTextDataButton, "text_button" }, - { kTextDataNormalFont, "text_normal" } + { kTextDataNormalFont, "text_normal" }, + { kTextDataTooltip, "tooltip_normal" } }; diff --git a/gui/browser.cpp b/gui/browser.cpp index 000359e1e7..0d95e5397b 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -66,9 +66,9 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Up", _("Go up"), kGoUpCmd); - new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd); - new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd); + new ButtonWidget(this, "Browser.Up", _("Go up"), _("Go to previous directory level"), kGoUpCmd); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "Browser.Choose", _("Choose"), 0, kChooseCmd); } void BrowserDialog::open() { diff --git a/gui/chooser.cpp b/gui/chooser.cpp index 7039e40947..a7b453c957 100644 --- a/gui/chooser.cpp +++ b/gui/chooser.cpp @@ -46,8 +46,8 @@ ChooserDialog::ChooserDialog(const String &title, String dialogId) _list->setEditable(false); // Buttons - new ButtonWidget(this, dialogId + ".Cancel", _("Cancel"), kCloseCmd); - _chooseButton = new ButtonWidget(this, dialogId + ".Choose", _("Choose"), kChooseCmd); + new ButtonWidget(this, dialogId + ".Cancel", _("Cancel"), 0, kCloseCmd); + _chooseButton = new ButtonWidget(this, dialogId + ".Choose", _("Choose"), 0, kChooseCmd); _chooseButton->setEnabled(false); } diff --git a/gui/dialog.h b/gui/dialog.h index 5008f272ba..1845786044 100644 --- a/gui/dialog.h +++ b/gui/dialog.h @@ -44,6 +44,7 @@ enum { class Dialog : public GuiObject { friend class GuiManager; + friend class Tooltip; protected: Widget *_mouseWidget; Widget *_focusedWidget; diff --git a/gui/launcher.cpp b/gui/launcher.cpp index b12c56dbde..829a57469b 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -202,7 +202,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); - _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), kCmdGlobalGraphicsOverride); + _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), 0, kCmdGlobalGraphicsOverride); addGraphicControls(tab, "GameOptions_Graphics."); @@ -211,7 +211,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("Audio")); - _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), kCmdGlobalAudioOverride); + _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), 0, kCmdGlobalAudioOverride); addAudioControls(tab, "GameOptions_Audio."); addSubtitleControls(tab, "GameOptions_Audio."); @@ -221,7 +221,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("Volume")); - _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), kCmdGlobalVolumeOverride); + _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), 0, kCmdGlobalVolumeOverride); addVolumeControls(tab, "GameOptions_Volume."); @@ -230,7 +230,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // tab->addTab(_("MIDI")); - _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), kCmdGlobalMIDIOverride); + _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), 0, kCmdGlobalMIDIOverride); if (_guioptions & Common::GUIO_NOMIDI) _globalMIDIOverride->setEnabled(false); @@ -246,15 +246,15 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // in the small version of the GUI. // GUI: Button + Label for the game path - new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), kCmdGameBrowser); + new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), 0, kCmdGameBrowser); _gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath); // GUI: Button + Label for the additional path - new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), kCmdExtraBrowser); + new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), 0, kCmdExtraBrowser); _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath); // GUI: Button + Label for the save path - new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), kCmdSaveBrowser); + new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), 0, kCmdSaveBrowser); _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath); // Activate the first tab @@ -262,8 +262,8 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), kCloseCmd); - new ButtonWidget(this, "GameOptions.Ok", _("OK"), kOKCmd); + new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "GameOptions.Ok", _("OK"), 0, kOKCmd); } void EditGameDialog::open() { @@ -497,36 +497,36 @@ LauncherDialog::LauncherDialog() new StaticTextWidget(this, "Launcher.Version", gScummVMFullVersion); #endif - new ButtonWidget(this, "Launcher.QuitButton", _("~Q~uit"), kQuitCmd); - new ButtonWidget(this, "Launcher.AboutButton", _("A~b~out..."), kAboutCmd); - new ButtonWidget(this, "Launcher.OptionsButton", _("~O~ptions..."), kOptionsCmd); + new ButtonWidget(this, "Launcher.QuitButton", _("~Q~uit"), 0, kQuitCmd); + new ButtonWidget(this, "Launcher.AboutButton", _("A~b~out..."), 0, kAboutCmd); + new ButtonWidget(this, "Launcher.OptionsButton", _("~O~ptions..."), 0, kOptionsCmd); _startButton = - new ButtonWidget(this, "Launcher.StartButton", _("~S~tart"), kStartCmd); + new ButtonWidget(this, "Launcher.StartButton", _("~S~tart"), 0, kStartCmd); _loadButton = - new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), kLoadGameCmd); + new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), 0, kLoadGameCmd); // Above the lowest button rows: two more buttons (directly below the list box) _addButton = - new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), kAddGameCmd); + new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), _("Hold Shift for Mass Add"), kAddGameCmd); _editButton = - new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), kEditGameCmd); + new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), 0, kEditGameCmd); _removeButton = - new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), kRemoveGameCmd); + new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), 0, kRemoveGameCmd); // Search box _searchDesc = 0; #ifndef DISABLE_FANCY_THEMES _searchPic = 0; if (g_gui.xmlEval()->getVar("Globals.ShowSearchPic") == 1 && g_gui.theme()->supportsImages()) { - _searchPic = new GraphicsWidget(this, "Launcher.SearchPic"); + _searchPic = new GraphicsWidget(this, "Launcher.SearchPic", _("Search in game list")); _searchPic->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageSearch)); } else #endif _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, kSearchCmd); - _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", kSearchClearCmd); + _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", _("Clear value"), kSearchClearCmd); // Add list with game titles _list = new ListWidget(this, "Launcher.GameList", kListSearchCmd); diff --git a/gui/massadd.cpp b/gui/massadd.cpp index 36efdfdd59..b981520cdc 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -89,10 +89,10 @@ MassAddDialog::MassAddDialog(const Common::FSNode &startDir) _list->setNumberingMode(kListNumberingOff); _list->setList(l); - _okButton = new ButtonWidget(this, "MassAdd.Ok", _("OK"), kOkCmd, Common::ASCII_RETURN); + _okButton = new ButtonWidget(this, "MassAdd.Ok", _("OK"), 0, kOkCmd, Common::ASCII_RETURN); _okButton->setEnabled(false); - new ButtonWidget(this, "MassAdd.Cancel", _("Cancel"), kCancelCmd, Common::ASCII_ESCAPE); + new ButtonWidget(this, "MassAdd.Cancel", _("Cancel"), 0, kCancelCmd, Common::ASCII_ESCAPE); // Build a map from all configured game paths to the targets using them const Common::ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); diff --git a/gui/message.cpp b/gui/message.cpp index 12ac3123a4..6406976569 100644 --- a/gui/message.cpp +++ b/gui/message.cpp @@ -89,10 +89,10 @@ MessageDialog::MessageDialog(const Common::String &message, const char *defaultB } if (defaultButton) - new ButtonWidget(this, okButtonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, defaultButton, kOkCmd, Common::ASCII_RETURN); // Confirm dialog + new ButtonWidget(this, okButtonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, defaultButton, 0, kOkCmd, Common::ASCII_RETURN); // Confirm dialog if (altButton) - new ButtonWidget(this, cancelButtonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, altButton, kCancelCmd, Common::ASCII_ESCAPE); // Cancel dialog + new ButtonWidget(this, cancelButtonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, altButton, 0, kCancelCmd, Common::ASCII_ESCAPE); // Cancel dialog } void MessageDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { diff --git a/gui/options.cpp b/gui/options.cpp index e9be2834a4..ac7b2dc475 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -642,9 +642,9 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { // SoundFont - _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), kChooseSoundFontCmd); + _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), 0, kChooseSoundFontCmd); _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None")); - _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", kClearSoundFontCmd); + _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", _("Clear value"), kClearSoundFontCmd); // Multi midi setting _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode")); @@ -657,7 +657,7 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi // MIDI gain setting (FluidSynth uses this) _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); - _midiGainSlider = new SliderWidget(boss, prefix + "mcMidiGainSlider", kMidiGainChanged); + _midiGainSlider = new SliderWidget(boss, prefix + "mcMidiGainSlider", 0, kMidiGainChanged); _midiGainSlider->setMinValue(0); _midiGainSlider->setMaxValue(1000); _midiGainLabel = new StaticTextWidget(boss, prefix + "mcMidiGainLabel", "1.00"); @@ -687,7 +687,7 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p // Subtitle speed _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:")); - _subSpeedSlider = new SliderWidget(boss, prefix + "subSubtitleSpeedSlider", kSubtitleSpeedChanged); + _subSpeedSlider = new SliderWidget(boss, prefix + "subSubtitleSpeedSlider", 0, kSubtitleSpeedChanged); _subSpeedLabel = new StaticTextWidget(boss, prefix + "subSubtitleSpeedLabel", "100%"); _subSpeedSlider->setMinValue(0); _subSpeedSlider->setMaxValue(maxSliderVal); _subSpeedLabel->setFlags(WIDGET_CLEARBG); @@ -699,24 +699,24 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre // Volume controllers _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _("Music volume:")); - _musicVolumeSlider = new SliderWidget(boss, prefix + "vcMusicSlider", kMusicVolumeChanged); + _musicVolumeSlider = new SliderWidget(boss, prefix + "vcMusicSlider", 0, kMusicVolumeChanged); _musicVolumeLabel = new StaticTextWidget(boss, prefix + "vcMusicLabel", "100%"); _musicVolumeSlider->setMinValue(0); _musicVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _musicVolumeLabel->setFlags(WIDGET_CLEARBG); - _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), kMuteAllChanged); + _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), 0, kMuteAllChanged); _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:")); - _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", kSfxVolumeChanged); + _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", 0, kSfxVolumeChanged); _sfxVolumeLabel = new StaticTextWidget(boss, prefix + "vcSfxLabel", "100%"); _sfxVolumeSlider->setMinValue(0); _sfxVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _sfxVolumeLabel->setFlags(WIDGET_CLEARBG); _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _("Speech volume:")); - _speechVolumeSlider = new SliderWidget(boss, prefix + "vcSpeechSlider", kSpeechVolumeChanged); + _speechVolumeSlider = new SliderWidget(boss, prefix + "vcSpeechSlider", 0, kSpeechVolumeChanged); _speechVolumeLabel = new StaticTextWidget(boss, prefix + "vcSpeechLabel", "100%"); _speechVolumeSlider->setMinValue(0); _speechVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); @@ -792,24 +792,24 @@ GlobalOptionsDialog::GlobalOptionsDialog() // truncated in the small version of the GUI. // Save game path - new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), kChooseSaveDirCmd); + new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), 0, kChooseSaveDirCmd); _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar"); - new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), kChooseThemeDirCmd); + new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), 0, kChooseThemeDirCmd); _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None")); - new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), kChooseExtraDirCmd); + new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), 0, kChooseExtraDirCmd); _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None")); #ifdef DYNAMIC_MODULES - new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), kChoosePluginsDirCmd); + new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), 0, kChoosePluginsDirCmd); _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _("None")); #endif #endif tab->addTab(_("Misc")); - new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), kChooseThemeCmd); + new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), 0, kChooseThemeCmd); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); @@ -827,7 +827,7 @@ GlobalOptionsDialog::GlobalOptionsDialog() } #ifdef SMALL_SCREEN_DEVICE - new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), kChooseKeyMappingCmd); + new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), 0, kChooseKeyMappingCmd); #endif // TODO: joystick setting @@ -856,8 +856,8 @@ GlobalOptionsDialog::GlobalOptionsDialog() _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), kCloseCmd); - new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), kOKCmd); + new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), 0, kOKCmd); #ifdef SMALL_SCREEN_DEVICE _keysDialog = new KeysDialog(); diff --git a/gui/saveload.cpp b/gui/saveload.cpp index bd5aadc206..cef7269b95 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -62,11 +62,11 @@ SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel) _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), kCloseCmd); - _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, kChooseCmd); + new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), 0, kCloseCmd); + _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, 0, kChooseCmd); _chooseButton->setEnabled(false); - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), kDelCmd); + _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), 0, kDelCmd); _deleteButton->setEnabled(false); _delSupport = _metaInfoSupport = _thumbnailSupport = false; diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp index 987408e1b4..c8f732fe5f 100644 --- a/gui/themebrowser.cpp +++ b/gui/themebrowser.cpp @@ -53,8 +53,8 @@ ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd); - new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), 0, kCloseCmd); + new ButtonWidget(this, "Browser.Choose", _("Choose"), 0, kChooseCmd); } void ThemeBrowser::open() { diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 17294703f4..1009f31816 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -27,6 +27,9 @@ " " +" " " " @@ -411,6 +414,11 @@ "bevel='2' " "/> " " " +" " +" " +" " " " " " " " @@ -425,6 +433,9 @@ " " " " " " +" " +" " +" " " " " " " " +" " +" " +" " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index cc288765ac..3f3f9cee37 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_gfx.stx b/gui/themes/scummclassic/classic_gfx.stx index e107c1f04d..05040751f9 100644 --- a/gui/themes/scummclassic/classic_gfx.stx +++ b/gui/themes/scummclassic/classic_gfx.stx @@ -52,6 +52,9 @@ + + + + + diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 9f241c06e5..e4a31e0971 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -41,6 +41,10 @@ + + + + + + + + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 1f3a017b45..22e8ccaa90 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_gfx.stx b/gui/themes/scummmodern/scummmodern_gfx.stx index 13f9cd2196..3ed915200a 100644 --- a/gui/themes/scummmodern/scummmodern_gfx.stx +++ b/gui/themes/scummmodern/scummmodern_gfx.stx @@ -114,6 +114,9 @@ + - - + + + + + + + + getFontHeight(ThemeEngine::kFontStyleTooltip) + 2; + + // Make Rect bigger for compensating the shadow + _storedState = g_gui.theme()->storeState(Common::Rect(_x - 5, _y - 5, _x + _w + 5, _y + _h + 5)); + + g_gui.theme()->startBuffering(); + g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorderSmall); + + for (Common::StringArray::const_iterator i = _wrappedLines.begin(); i != _wrappedLines.end(); ++i, ++num) { + g_gui.theme()->drawText(Common::Rect(_x + 1, _y + 1 + num * h, _x + 1 +_w, _y + 1+ (num + 1) * h), *i, ThemeEngine::kStateEnabled, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, 0, false, ThemeEngine::kFontStyleTooltip, ThemeEngine::kFontColorNormal, false); + } + g_gui.theme()->finishBuffering(); +} + +void Tooltip::reflowLayout() { +} + +void Tooltip::setMouseXY(int x, int y) { + _mouseX = x; + _mouseY = y; +} + +void Tooltip::setVisible(bool state) { + if (state == _visible) + return; + + if (state) { + Widget *wdg = _guiManager->getTopDialog()->findWidget(_mouseX, _mouseY); + + if (!wdg) + return; + + if (wdg->getTooltip()) { + _visible = state; + + // Cache config values. + // NOTE: we cannot do it in the consturctor + if (_maxWidth == -1) { + _maxWidth = g_gui.xmlEval()->getVar("Globals.Tooltip.MaxWidth", 100); + _xdelta = g_gui.xmlEval()->getVar("Globals.Tooltip.XDelta", 0); + _ydelta = g_gui.xmlEval()->getVar("Globals.Tooltip.YDelta", 0); + } + + const Graphics::Font *tooltipFont = g_gui.theme()->getFont(ThemeEngine::kFontStyleTooltip); + + _wrappedLines.clear(); + _w = tooltipFont->wordWrapText(wdg->getTooltip(), _maxWidth - 4, _wrappedLines); + _h = (tooltipFont->getFontHeight() + 2) * _wrappedLines.size(); + + _x = MIN(_guiManager->getTopDialog()->_x + _mouseX + _xdelta, g_gui.getWidth() - _w - 3); + _y = MIN(_guiManager->getTopDialog()->_y + _mouseY + _ydelta, g_gui.getHeight() - _h - 3); + + draw(); + } + } else { + _visible = state; + + g_gui.theme()->restoreState(_storedState); + delete _storedState; + } +} + +#pragma mark - + +StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align, const char *tooltip) + : Widget(boss, x, y, w, h, tooltip), _align(align) { setFlags(WIDGET_ENABLED); _type = kStaticTextWidget; _label = text; } -StaticTextWidget::StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text) - : Widget(boss, name) { +StaticTextWidget::StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text, const char *tooltip) + : Widget(boss, name, tooltip) { setFlags(WIDGET_ENABLED); _type = kStaticTextWidget; _label = text; @@ -272,8 +345,8 @@ void StaticTextWidget::drawWidget() { #pragma mark - -ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, uint32 cmd, uint8 hotkey) - : StaticTextWidget(boss, x, y, w, h, cleanupHotkey(label), Graphics::kTextAlignCenter), CommandSender(boss), +ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) + : StaticTextWidget(boss, x, y, w, h, cleanupHotkey(label), Graphics::kTextAlignCenter, tooltip), CommandSender(boss), _cmd(cmd) { if (hotkey == 0) @@ -283,8 +356,8 @@ ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Co _type = kButtonWidget; } -ButtonWidget::ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, uint32 cmd, uint8 hotkey) - : StaticTextWidget(boss, name, cleanupHotkey(label)), CommandSender(boss), +ButtonWidget::ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) + : StaticTextWidget(boss, name, cleanupHotkey(label), tooltip), CommandSender(boss), _cmd(cmd) { if (hotkey == 0) _hotkey = parseHotkey(label); @@ -303,14 +376,14 @@ void ButtonWidget::drawWidget() { #pragma mark - -CheckboxWidget::CheckboxWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, uint32 cmd, uint8 hotkey) - : ButtonWidget(boss, x, y, w, h, label, cmd, hotkey), _state(false) { +CheckboxWidget::CheckboxWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) + : ButtonWidget(boss, x, y, w, h, label, tooltip, cmd, hotkey), _state(false) { setFlags(WIDGET_ENABLED); _type = kCheckboxWidget; } -CheckboxWidget::CheckboxWidget(GuiObject *boss, const Common::String &name, const Common::String &label, uint32 cmd, uint8 hotkey) - : ButtonWidget(boss, name, label, cmd, hotkey), _state(false) { +CheckboxWidget::CheckboxWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) + : ButtonWidget(boss, name, label, tooltip, cmd, hotkey), _state(false) { setFlags(WIDGET_ENABLED); _type = kCheckboxWidget; } @@ -364,15 +437,15 @@ void RadiobuttonGroup::setEnabled(bool ena) { #pragma mark - -RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey) - : ButtonWidget(boss, x, y, w, h, label, 0, hotkey), _state(false), _value(value), _group(group) { +RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip, uint8 hotkey) + : ButtonWidget(boss, x, y, w, h, label, tooltip, 0, hotkey), _state(false), _value(value), _group(group) { setFlags(WIDGET_ENABLED); _type = kRadiobuttonWidget; _group->addButton(this); } -RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey) - : ButtonWidget(boss, name, label, 0, hotkey), _state(false), _value(value), _group(group) { +RadiobuttonWidget::RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip, uint8 hotkey) + : ButtonWidget(boss, name, label, tooltip, 0, hotkey), _state(false), _value(value), _group(group) { setFlags(WIDGET_ENABLED); _type = kRadiobuttonWidget; _group->addButton(this); @@ -404,15 +477,15 @@ void RadiobuttonWidget::drawWidget() { #pragma mark - -SliderWidget::SliderWidget(GuiObject *boss, int x, int y, int w, int h, uint32 cmd) - : Widget(boss, x, y, w, h), CommandSender(boss), +SliderWidget::SliderWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd) + : Widget(boss, x, y, w, h, tooltip), CommandSender(boss), _cmd(cmd), _value(0), _oldValue(0), _valueMin(0), _valueMax(100), _isDragging(false) { setFlags(WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG); _type = kSliderWidget; } -SliderWidget::SliderWidget(GuiObject *boss, const Common::String &name, uint32 cmd) - : Widget(boss, name), CommandSender(boss), +SliderWidget::SliderWidget(GuiObject *boss, const Common::String &name, const char *tooltip, uint32 cmd) + : Widget(boss, name, tooltip), CommandSender(boss), _cmd(cmd), _value(0), _oldValue(0), _valueMin(0), _valueMax(100), _isDragging(false) { setFlags(WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG); _type = kSliderWidget; @@ -484,14 +557,14 @@ int SliderWidget::posToValue(int pos) { #pragma mark - -GraphicsWidget::GraphicsWidget(GuiObject *boss, int x, int y, int w, int h) - : Widget(boss, x, y, w, h), _gfx(), _alpha(256), _transparency(false) { +GraphicsWidget::GraphicsWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip) + : Widget(boss, x, y, w, h, tooltip), _gfx(), _alpha(256), _transparency(false) { setFlags(WIDGET_ENABLED | WIDGET_CLEARBG); _type = kGraphicsWidget; } -GraphicsWidget::GraphicsWidget(GuiObject *boss, const Common::String &name) - : Widget(boss, name), _gfx(), _alpha(256), _transparency(false) { +GraphicsWidget::GraphicsWidget(GuiObject *boss, const Common::String &name, const char *tooltip) + : Widget(boss, name, tooltip), _gfx(), _alpha(256), _transparency(false) { setFlags(WIDGET_ENABLED | WIDGET_CLEARBG); _type = kGraphicsWidget; } diff --git a/gui/widget.h b/gui/widget.h index 0b075c19db..7b5fe9253f 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -27,6 +27,7 @@ #include "common/scummsys.h" #include "common/str.h" +#include "common/str-array.h" #include "common/keyboard.h" #include "graphics/surface.h" #include "gui/object.h" @@ -86,6 +87,7 @@ protected: uint16 _id; bool _hasFocus; ThemeEngine::WidgetStateInfo _state; + const char *_tooltip; private: uint16 _flags; @@ -95,8 +97,8 @@ public: static Widget *findWidgetInChain(Widget *start, const char *name); public: - Widget(GuiObject *boss, int x, int y, int w, int h); - Widget(GuiObject *boss, const Common::String &name); + Widget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0); + Widget(GuiObject *boss, const Common::String &name, const char *tooltip = 0); virtual ~Widget(); void init(); @@ -139,6 +141,8 @@ public: uint8 parseHotkey(const Common::String &label); Common::String cleanupHotkey(const Common::String &label); + const char *getTooltip() const { return _tooltip; } + protected: void updateState(int oldFlags, int newFlags); @@ -155,14 +159,39 @@ protected: void handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { assert(_boss); _boss->handleCommand(sender, cmd, data); } }; +class GuiManager; + +class Tooltip : public GuiObject { +public: + Tooltip(GuiManager *guiManager); + + bool isVisible() const { return _visible; } + void draw(); + void reflowLayout(); + void releaseFocus() {} + void setVisible(bool state); + void setMouseXY(int x, int y); + +protected: + Common::String _text; + GuiManager *_guiManager; + bool _visible; + int _mouseX, _mouseY; + int _maxWidth; + int _xdelta, _ydelta; + + Common::StringArray _wrappedLines; + ThemeEngine::StoredState *_storedState; +}; + /* StaticTextWidget */ class StaticTextWidget : public Widget { protected: Common::String _label; Graphics::TextAlign _align; public: - StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align); - StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text); + StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align, const char *tooltip = 0); + StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text, const char *tooltip = 0); void setValue(int value); void setLabel(const Common::String &label); const Common::String &getLabel() const { return _label; } @@ -180,8 +209,8 @@ protected: uint32 _cmd; uint8 _hotkey; public: - ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, uint32 cmd = 0, uint8 hotkey = 0); - ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, uint32 cmd = 0, uint8 hotkey = 0); + ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, const char *tooltip = 0, uint32 cmd = 0, uint8 hotkey = 0); + ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip = 0, uint32 cmd = 0, uint8 hotkey = 0); void setCmd(uint32 cmd) { _cmd = cmd; } uint32 getCmd() const { return _cmd; } @@ -199,8 +228,8 @@ class CheckboxWidget : public ButtonWidget { protected: bool _state; public: - CheckboxWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, uint32 cmd = 0, uint8 hotkey = 0); - CheckboxWidget(GuiObject *boss, const Common::String &name, const Common::String &label, uint32 cmd = 0, uint8 hotkey = 0); + CheckboxWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, const char *tooltip = 0, uint32 cmd = 0, uint8 hotkey = 0); + CheckboxWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip = 0, uint32 cmd = 0, uint8 hotkey = 0); void handleMouseUp(int x, int y, int button, int clickCount); virtual void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); } @@ -245,8 +274,8 @@ protected: int _value; public: - RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey = 0); - RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, uint8 hotkey = 0); + RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip = 0, uint8 hotkey = 0); + RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip = 0, uint8 hotkey = 0); void handleMouseUp(int x, int y, int button, int clickCount); virtual void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); draw(); } @@ -272,8 +301,8 @@ protected: bool _isDragging; uint _labelWidth; public: - SliderWidget(GuiObject *boss, int x, int y, int w, int h, uint32 cmd = 0); - SliderWidget(GuiObject *boss, const Common::String &name, uint32 cmd = 0); + SliderWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0); + SliderWidget(GuiObject *boss, const Common::String &name, const char *tooltip = 0, uint32 cmd = 0); void setCmd(uint32 cmd) { _cmd = cmd; } uint32 getCmd() const { return _cmd; } @@ -304,8 +333,8 @@ protected: /* GraphicsWidget */ class GraphicsWidget : public Widget { public: - GraphicsWidget(GuiObject *boss, int x, int y, int w, int h); - GraphicsWidget(GuiObject *boss, const Common::String &name); + GraphicsWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0); + GraphicsWidget(GuiObject *boss, const Common::String &name, const char *tooltip = 0); ~GraphicsWidget(); void setGfx(const Graphics::Surface *gfx); -- cgit v1.2.3 From d19807e983d001c3bd910275a274eda4ec0ed26d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:52:52 +0000 Subject: GUI: Add auto-repeater to scrollbar arrows. svn-id: r49775 --- gui/ScrollBarWidget.cpp | 29 +++++++++++++++++++++++++++++ gui/ScrollBarWidget.h | 3 ++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/gui/ScrollBarWidget.cpp b/gui/ScrollBarWidget.cpp index f6b36b3aa0..f4aaa8ffc9 100644 --- a/gui/ScrollBarWidget.cpp +++ b/gui/ScrollBarWidget.cpp @@ -26,6 +26,8 @@ #include "gui/dialog.h" #include "gui/GuiManager.h" +#include "common/timer.h" + namespace GUI { #define UP_DOWN_BOX_HEIGHT (_w+1) @@ -47,6 +49,28 @@ ScrollBarWidget::ScrollBarWidget(GuiObject *boss, int x, int y, int w, int h) _currentPos = 0; } +static void upArrowRepeater(void *ref) { + ScrollBarWidget *sb = (ScrollBarWidget *)ref; + int old_pos = sb->_currentPos; + + sb->_currentPos -= 3; + sb->checkBounds(old_pos); + + g_system->getTimerManager()->removeTimerProc(&upArrowRepeater); + g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/10, ref); +} + +static void downArrowRepeater(void *ref) { + ScrollBarWidget *sb = (ScrollBarWidget *)ref; + int old_pos = sb->_currentPos; + + sb->_currentPos += 3; + sb->checkBounds(old_pos); + + g_system->getTimerManager()->removeTimerProc(&downArrowRepeater); + g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/10, ref); +} + void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) { int old_pos = _currentPos; @@ -58,10 +82,12 @@ void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) // Up arrow _currentPos--; _draggingPart = kUpArrowPart; + g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/2, this); } else if (y >= _h - UP_DOWN_BOX_HEIGHT) { // Down arrow _currentPos++; _draggingPart = kDownArrowPart; + g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/2, this); } else if (y < _sliderPos) { _currentPos -= _entriesPerPage - 1; } else if (y >= _sliderPos + _sliderHeight) { @@ -77,6 +103,9 @@ void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) void ScrollBarWidget::handleMouseUp(int x, int y, int button, int clickCount) { _draggingPart = kNoPart; + + g_system->getTimerManager()->removeTimerProc(&upArrowRepeater); + g_system->getTimerManager()->removeTimerProc(&downArrowRepeater); } void ScrollBarWidget::handleMouseWheel(int x, int y, int direction) { diff --git a/gui/ScrollBarWidget.h b/gui/ScrollBarWidget.h index 9379736f05..dd2b702686 100644 --- a/gui/ScrollBarWidget.h +++ b/gui/ScrollBarWidget.h @@ -73,9 +73,10 @@ public: // should these accessors force a redraw? void recalc(); + void checkBounds(int old_pos); + protected: void drawWidget(); - void checkBounds(int old_pos); }; } // End of namespace GUI -- cgit v1.2.3 From b13636d6240d3926c7c79e8b69737e497e7824ab Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:53:13 +0000 Subject: i18n: update Russian translation with tooltips. svn-id: r49776 --- common/messages.cpp | 798 ++++++++++++++++++++++++++-------------------------- po/hu_HU.po | 28 +- po/ru_RU.po | 28 +- po/scummvm.pot | 28 +- 4 files changed, 469 insertions(+), 413 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 2a6ea63e43..27ae9453e0 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -39,181 +39,185 @@ static const char * _po2c_msgids[] = { /* 32 */ "Cannot create file", /* 33 */ "Choose", /* 34 */ "Choose an action to map", - /* 35 */ "Close", - /* 36 */ "CoreAudio", - /* 37 */ "CoreMIDI", - /* 38 */ "Could not find any engine capable of running the selected game", - /* 39 */ "Creative Music System", - /* 40 */ "DMedia", - /* 41 */ "Date: ", - /* 42 */ "Default", - /* 43 */ "Delete", - /* 44 */ "Disabled GFX", - /* 45 */ "Discovered %d new games ...", - /* 46 */ "Discovered %d new games.", - /* 47 */ "Display keyboard", - /* 48 */ "Do you really want to delete this savegame?", - /* 49 */ "Do you really want to remove this game configuration?", - /* 50 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 51 */ "Edit Game...", - /* 52 */ "Enable Roland GS Mode", - /* 53 */ "Engine does not support debug level '%s'", - /* 54 */ "English", - /* 55 */ "Error running game:", - /* 56 */ "Extra Path:", - /* 57 */ "FM Towns", - /* 58 */ "Failed to load any GUI theme, aborting", - /* 59 */ "FluidSynth", - /* 60 */ "Fullscreen mode", - /* 61 */ "GFX", - /* 62 */ "GUI Renderer:", - /* 63 */ "Game", - /* 64 */ "Game Data not found", - /* 65 */ "Game Id not supported", - /* 66 */ "Game Path:", - /* 67 */ "Go up", - /* 68 */ "Graphics", - /* 69 */ "Graphics mode:", - /* 70 */ "Help", - /* 71 */ "IBM PCjr", - /* 72 */ "ID:", - /* 73 */ "Invalid Path", - /* 74 */ "Keys", - /* 75 */ "Language:", - /* 76 */ "Load", - /* 77 */ "Load game:", - /* 78 */ "Load...", - /* 79 */ "MIDI", - /* 80 */ "MIDI gain:", - /* 81 */ "MT-32 Emulation", - /* 82 */ "Map", - /* 83 */ "Mass Add...", - /* 84 */ "Menu", - /* 85 */ "Misc", - /* 86 */ "Mixed AdLib/MIDI mode", - /* 87 */ "Mouse click", - /* 88 */ "Music driver:", - /* 89 */ "Music volume:", - /* 90 */ "Mute All", - /* 91 */ "Name:", - /* 92 */ "Never", - /* 93 */ "No", - /* 94 */ "No date saved", - /* 95 */ "No music", - /* 96 */ "No playtime saved", - /* 97 */ "No time saved", - /* 98 */ "None", - /* 99 */ "OK", - /* 100 */ "Options", - /* 101 */ "Options...", - /* 102 */ "Output rate:", - /* 103 */ "Override global MIDI settings", - /* 104 */ "Override global audio settings", - /* 105 */ "Override global graphic settings", - /* 106 */ "Override global volume settings", - /* 107 */ "PC Speaker", - /* 108 */ "Path not a directory", - /* 109 */ "Path not a file", - /* 110 */ "Path not exists", - /* 111 */ "Paths", - /* 112 */ "Pause", - /* 113 */ "Pick the game:", - /* 114 */ "Platform:", - /* 115 */ "Playtime: ", - /* 116 */ "Please select an action", - /* 117 */ "Plugins Path:", - /* 118 */ "Press the key to associate", - /* 119 */ "Quit", - /* 120 */ "Read permission denied", - /* 121 */ "Reading failed", - /* 122 */ "Remap keys", - /* 123 */ "Remove Game", - /* 124 */ "Render mode:", - /* 125 */ "Resume", - /* 126 */ "Return to Launcher", - /* 127 */ "SEQ", - /* 128 */ "SFX volume:", - /* 129 */ "Save", - /* 130 */ "Save Path:", - /* 131 */ "Save Path: ", - /* 132 */ "Save game:", - /* 133 */ "Scan complete!", - /* 134 */ "Scanned %d directories ...", - /* 135 */ "ScummVM could not find any engine capable of running the selected game!", - /* 136 */ "ScummVM could not find any game in the specified directory!", - /* 137 */ "ScummVM couldn't open the specified directory!", - /* 138 */ "Search:", - /* 139 */ "Select SoundFont", - /* 140 */ "Select a Theme", - /* 141 */ "Select additional game directory", - /* 142 */ "Select an action and click 'Map'", - /* 143 */ "Select directory for GUI themes", - /* 144 */ "Select directory for extra files", - /* 145 */ "Select directory for plugins", - /* 146 */ "Select directory for saved games", - /* 147 */ "Select directory for savegames", - /* 148 */ "Select directory with game data", - /* 149 */ "Skip", - /* 150 */ "Skip line", - /* 151 */ "SoundFont:", - /* 152 */ "Spch", - /* 153 */ "Speech", - /* 154 */ "Speech & Subs", - /* 155 */ "Speech Only", - /* 156 */ "Speech and Subtitles", - /* 157 */ "Speech volume:", - /* 158 */ "Standard Renderer (16bpp)", - /* 159 */ "Start", - /* 160 */ "Subs", - /* 161 */ "Subtitle speed:", - /* 162 */ "Subtitles", - /* 163 */ "Subtitles Only", - /* 164 */ "Tapwave Zodiac", - /* 165 */ "Text and Speech:", - /* 166 */ "The chosen directory cannot be written to. Please select another one.", - /* 167 */ "Theme Path:", - /* 168 */ "Theme:", - /* 169 */ "This game ID is already taken. Please choose another one.", - /* 170 */ "This game does not support loading games from the launcher.", - /* 171 */ "TiMidity", - /* 172 */ "Time: ", - /* 173 */ "True Roland MT-32 (disable GM emulation)", - /* 174 */ "Unknown Error", - /* 175 */ "Unsupported Color Mode", - /* 176 */ "Untitled savestate", - /* 177 */ "User picked target '%s' (gameid '%s')...\n", - /* 178 */ "Volume", - /* 179 */ "Windows MIDI", - /* 180 */ "Write permission denied", - /* 181 */ "Writing data failed", - /* 182 */ "Yamaha Pa1", - /* 183 */ "Yes", - /* 184 */ "You have to restart ScummVM to take the effect.", - /* 185 */ "every 10 mins", - /* 186 */ "every 15 mins", - /* 187 */ "every 30 mins", - /* 188 */ "every 5 mins", - /* 189 */ "failed\n", - /* 190 */ "~A~bout", - /* 191 */ "~A~dd Game...", - /* 192 */ "~C~ancel", - /* 193 */ "~C~lose", - /* 194 */ "~E~dit Game...", - /* 195 */ "~H~elp", - /* 196 */ "~K~eys", - /* 197 */ "~L~oad", - /* 198 */ "~L~oad...", - /* 199 */ "~N~ext", - /* 200 */ "~O~K", - /* 201 */ "~O~ptions", - /* 202 */ "~O~ptions...", - /* 203 */ "~P~revious", - /* 204 */ "~Q~uit", - /* 205 */ "~R~emove Game", - /* 206 */ "~R~esume", - /* 207 */ "~R~eturn to Launcher", - /* 208 */ "~S~ave", - /* 209 */ "~S~tart", + /* 35 */ "Clear value", + /* 36 */ "Close", + /* 37 */ "CoreAudio", + /* 38 */ "CoreMIDI", + /* 39 */ "Could not find any engine capable of running the selected game", + /* 40 */ "Creative Music System", + /* 41 */ "DMedia", + /* 42 */ "Date: ", + /* 43 */ "Default", + /* 44 */ "Delete", + /* 45 */ "Disabled GFX", + /* 46 */ "Discovered %d new games ...", + /* 47 */ "Discovered %d new games.", + /* 48 */ "Display keyboard", + /* 49 */ "Do you really want to delete this savegame?", + /* 50 */ "Do you really want to remove this game configuration?", + /* 51 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 52 */ "Edit Game...", + /* 53 */ "Enable Roland GS Mode", + /* 54 */ "Engine does not support debug level '%s'", + /* 55 */ "English", + /* 56 */ "Error running game:", + /* 57 */ "Extra Path:", + /* 58 */ "FM Towns", + /* 59 */ "Failed to load any GUI theme, aborting", + /* 60 */ "FluidSynth", + /* 61 */ "Fullscreen mode", + /* 62 */ "GFX", + /* 63 */ "GUI Renderer:", + /* 64 */ "Game", + /* 65 */ "Game Data not found", + /* 66 */ "Game Id not supported", + /* 67 */ "Game Path:", + /* 68 */ "Go to previous directory level", + /* 69 */ "Go up", + /* 70 */ "Graphics", + /* 71 */ "Graphics mode:", + /* 72 */ "Help", + /* 73 */ "Hold Shift for Mass Add", + /* 74 */ "IBM PCjr", + /* 75 */ "ID:", + /* 76 */ "Invalid Path", + /* 77 */ "Keys", + /* 78 */ "Language:", + /* 79 */ "Load", + /* 80 */ "Load game:", + /* 81 */ "Load...", + /* 82 */ "MIDI", + /* 83 */ "MIDI gain:", + /* 84 */ "MT-32 Emulation", + /* 85 */ "Map", + /* 86 */ "Mass Add...", + /* 87 */ "Menu", + /* 88 */ "Misc", + /* 89 */ "Mixed AdLib/MIDI mode", + /* 90 */ "Mouse click", + /* 91 */ "Music driver:", + /* 92 */ "Music volume:", + /* 93 */ "Mute All", + /* 94 */ "Name:", + /* 95 */ "Never", + /* 96 */ "No", + /* 97 */ "No date saved", + /* 98 */ "No music", + /* 99 */ "No playtime saved", + /* 100 */ "No time saved", + /* 101 */ "None", + /* 102 */ "OK", + /* 103 */ "Options", + /* 104 */ "Options...", + /* 105 */ "Output rate:", + /* 106 */ "Override global MIDI settings", + /* 107 */ "Override global audio settings", + /* 108 */ "Override global graphic settings", + /* 109 */ "Override global volume settings", + /* 110 */ "PC Speaker", + /* 111 */ "Path not a directory", + /* 112 */ "Path not a file", + /* 113 */ "Path not exists", + /* 114 */ "Paths", + /* 115 */ "Pause", + /* 116 */ "Pick the game:", + /* 117 */ "Platform:", + /* 118 */ "Playtime: ", + /* 119 */ "Please select an action", + /* 120 */ "Plugins Path:", + /* 121 */ "Press the key to associate", + /* 122 */ "Quit", + /* 123 */ "Read permission denied", + /* 124 */ "Reading failed", + /* 125 */ "Remap keys", + /* 126 */ "Remove Game", + /* 127 */ "Render mode:", + /* 128 */ "Resume", + /* 129 */ "Return to Launcher", + /* 130 */ "SEQ", + /* 131 */ "SFX volume:", + /* 132 */ "Save", + /* 133 */ "Save Path:", + /* 134 */ "Save Path: ", + /* 135 */ "Save game:", + /* 136 */ "Scan complete!", + /* 137 */ "Scanned %d directories ...", + /* 138 */ "ScummVM could not find any engine capable of running the selected game!", + /* 139 */ "ScummVM could not find any game in the specified directory!", + /* 140 */ "ScummVM couldn't open the specified directory!", + /* 141 */ "Search in game list", + /* 142 */ "Search:", + /* 143 */ "Select SoundFont", + /* 144 */ "Select a Theme", + /* 145 */ "Select additional game directory", + /* 146 */ "Select an action and click 'Map'", + /* 147 */ "Select directory for GUI themes", + /* 148 */ "Select directory for extra files", + /* 149 */ "Select directory for plugins", + /* 150 */ "Select directory for saved games", + /* 151 */ "Select directory for savegames", + /* 152 */ "Select directory with game data", + /* 153 */ "Skip", + /* 154 */ "Skip line", + /* 155 */ "SoundFont:", + /* 156 */ "Spch", + /* 157 */ "Speech", + /* 158 */ "Speech & Subs", + /* 159 */ "Speech Only", + /* 160 */ "Speech and Subtitles", + /* 161 */ "Speech volume:", + /* 162 */ "Standard Renderer (16bpp)", + /* 163 */ "Start", + /* 164 */ "Subs", + /* 165 */ "Subtitle speed:", + /* 166 */ "Subtitles", + /* 167 */ "Subtitles Only", + /* 168 */ "Tapwave Zodiac", + /* 169 */ "Text and Speech:", + /* 170 */ "The chosen directory cannot be written to. Please select another one.", + /* 171 */ "Theme Path:", + /* 172 */ "Theme:", + /* 173 */ "This game ID is already taken. Please choose another one.", + /* 174 */ "This game does not support loading games from the launcher.", + /* 175 */ "TiMidity", + /* 176 */ "Time: ", + /* 177 */ "True Roland MT-32 (disable GM emulation)", + /* 178 */ "Unknown Error", + /* 179 */ "Unsupported Color Mode", + /* 180 */ "Untitled savestate", + /* 181 */ "User picked target '%s' (gameid '%s')...\n", + /* 182 */ "Volume", + /* 183 */ "Windows MIDI", + /* 184 */ "Write permission denied", + /* 185 */ "Writing data failed", + /* 186 */ "Yamaha Pa1", + /* 187 */ "Yes", + /* 188 */ "You have to restart ScummVM to take the effect.", + /* 189 */ "every 10 mins", + /* 190 */ "every 15 mins", + /* 191 */ "every 30 mins", + /* 192 */ "every 5 mins", + /* 193 */ "failed\n", + /* 194 */ "~A~bout", + /* 195 */ "~A~dd Game...", + /* 196 */ "~C~ancel", + /* 197 */ "~C~lose", + /* 198 */ "~E~dit Game...", + /* 199 */ "~H~elp", + /* 200 */ "~K~eys", + /* 201 */ "~L~oad", + /* 202 */ "~L~oad...", + /* 203 */ "~N~ext", + /* 204 */ "~O~K", + /* 205 */ "~O~ptions", + /* 206 */ "~O~ptions...", + /* 207 */ "~P~revious", + /* 208 */ "~Q~uit", + /* 209 */ "~R~emove Game", + /* 210 */ "~R~esume", + /* 211 */ "~R~eturn to Launcher", + /* 212 */ "~S~ave", + /* 213 */ "~S~tart", NULL }; @@ -223,7 +227,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 23:21+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 18:43+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, @@ -258,236 +262,240 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 32, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, { 33, "\302\373\341\360\340\362\374" }, { 34, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 35, "\307\340\352\360\373\362\374" }, - { 36, "CoreAudio" }, - { 37, "CoreMIDI" }, - { 38, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 39, "Creative Music System" }, - { 40, "DMedia" }, - { 41, "\304\340\362\340: " }, - { 42, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 43, "\323\344\340\353\350\362\374" }, - { 44, "\301\345\347 \343\360\340\364\350\352\350" }, - { 45, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 46, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 47, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 48, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 50, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 51, "\310\347\354. \350\343\360\363..." }, - { 52, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 53, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 54, "English" }, - { 55, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 56, "\304\356\357. \357\363\362\374:" }, - { 57, "FM Towns" }, - { 58, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 59, "FluidSynth" }, - { 60, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 61, "\303\360\364" }, - { 62, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 63, "\310\343\360\340" }, - { 64, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 65, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 66, "\317\363\362\374 \352 \350\343\360\345: " }, - { 67, "\302\342\345\360\365" }, - { 68, "\303\360\340\364\350\352\340" }, - { 69, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 70, "\317\356\354\356\371\374" }, - { 71, "IBM PCjr" }, - { 72, "ID:" }, - { 73, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 74, "\312\353\340\342\350\370\350" }, - { 75, "\337\347\373\352:" }, - { 76, "\307\340\343\360\363\347\350\362\374" }, - { 77, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 78, "\307\340\343\360...." }, - { 79, "MIDI" }, - { 80, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 81, "\335\354\363\353\377\366\350\377 MT-32" }, - { 82, "\315\340\347\355\340\367\350\362\374" }, - { 83, "\304\356\341. \354\355\356\343\356..." }, - { 84, "\314\345\355\376" }, - { 85, "\320\340\347\355\356\345" }, - { 86, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 87, "\312\353\350\352 \354\373\370\374\376" }, - { 88, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 89, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 90, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 91, "\315\340\347\342\340\355\350\345:" }, - { 92, "\315\350\352\356\343\344\340" }, - { 93, "\315\345\362" }, - { 94, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 95, "\301\345\347 \354\363\347\373\352\350" }, - { 96, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 97, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 98, "\315\345 \347\340\344\340\355" }, - { 99, "OK" }, - { 100, "\316\357\366\350\350" }, - { 101, "\316\357\366\350\350..." }, - { 102, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 107, "PC \361\357\350\352\345\360" }, - { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 109, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 110, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 111, "\317\363\362\350" }, - { 112, "\317\340\363\347\340" }, - { 113, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 114, "\317\353\340\362\364\356\360\354\340:" }, - { 115, "\302\360\345\354\377 \350\343\360\373: " }, - { 116, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 117, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 118, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 119, "\302\373\365\356\344" }, - { 120, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 121, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 122, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 123, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 124, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 125, "\317\360\356\344\356\353\346\350\362\374" }, - { 126, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 127, "SEQ" }, - { 128, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 129, "\307\340\357\350\361\340\362\374" }, - { 130, "\317\363\362\374 \361\356\365\360.: " }, - { 131, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 132, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 133, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 134, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 135, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 136, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 137, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 138, "\317\356\350\361\352:" }, - { 139, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 140, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 141, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 142, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 146, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 149, "\317\360\356\357\363\361\362\350\362\374" }, - { 150, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 151, "SoundFont:" }, - { 152, "\316\347\342" }, - { 153, "\316\347\342\363\367\352\340" }, - { 154, "\307\342\363\352 \350 \361\363\341." }, - { 155, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 156, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 157, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 158, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 159, "\317\363\361\352" }, - { 160, "\321\363\341" }, - { 161, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 162, "\321\363\341\362\350\362\360\373" }, - { 163, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 164, "Tapware Zodiac" }, - { 165, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 166, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 167, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 168, "\322\345\354\340:" }, - { 169, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 170, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 171, "TiMidity" }, - { 172, "\302\360\345\354\377: " }, - { 173, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 174, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 175, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 176, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 177, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 178, "\303\360\356\354\352\356\361\362\374" }, - { 179, "Windows MIDI" }, - { 180, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 181, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 182, "Yamaha Pa1" }, - { 183, "\304\340" }, - { 184, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 185, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 186, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 187, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 188, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 189, "\355\345 \363\344\340\353\356\361\374\n" }, - { 190, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 191, "~\304~\356\341. \350\343\360\363..." }, - { 192, "\316~\362~\354\345\355\340" }, - { 193, "~\307~\340\352\360\373\362\374" }, - { 194, "\310\347~\354~. \350\343\360\363..." }, - { 195, "~\317~\356\354\356\371\374" }, - { 196, "~\312~\353\340\342\350\370\350" }, - { 197, "~\307~\340\343\360\363\347\350\362\374" }, - { 198, "~\307~\340\343\360...." }, - { 199, "~\321~\353\345\344" }, - { 200, "~O~K" }, - { 201, "~\316~\357\366\350\350" }, - { 202, "~\316~\357\366\350\350..." }, - { 203, "~\317~\360\345\344" }, - { 204, "~\302~\373\365\356\344" }, - { 205, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 206, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 207, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 208, "~\307~\340\357\350\361\340\362\374" }, - { 209, "\317~\363~\361\352" }, + { 35, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 36, "\307\340\352\360\373\362\374" }, + { 37, "CoreAudio" }, + { 38, "CoreMIDI" }, + { 39, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 40, "Creative Music System" }, + { 41, "DMedia" }, + { 42, "\304\340\362\340: " }, + { 43, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 44, "\323\344\340\353\350\362\374" }, + { 45, "\301\345\347 \343\360\340\364\350\352\350" }, + { 46, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 47, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 48, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 50, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 51, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 52, "\310\347\354. \350\343\360\363..." }, + { 53, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 54, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 55, "English" }, + { 56, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 57, "\304\356\357. \357\363\362\374:" }, + { 58, "FM Towns" }, + { 59, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 60, "FluidSynth" }, + { 61, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 62, "\303\360\364" }, + { 63, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 64, "\310\343\360\340" }, + { 65, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 66, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 67, "\317\363\362\374 \352 \350\343\360\345: " }, + { 68, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 69, "\302\342\345\360\365" }, + { 70, "\303\360\340\364\350\352\340" }, + { 71, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 72, "\317\356\354\356\371\374" }, + { 73, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 74, "IBM PCjr" }, + { 75, "ID:" }, + { 76, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 77, "\312\353\340\342\350\370\350" }, + { 78, "\337\347\373\352:" }, + { 79, "\307\340\343\360\363\347\350\362\374" }, + { 80, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 81, "\307\340\343\360...." }, + { 82, "MIDI" }, + { 83, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 84, "\335\354\363\353\377\366\350\377 MT-32" }, + { 85, "\315\340\347\355\340\367\350\362\374" }, + { 86, "\304\356\341. \354\355\356\343\356..." }, + { 87, "\314\345\355\376" }, + { 88, "\320\340\347\355\356\345" }, + { 89, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 90, "\312\353\350\352 \354\373\370\374\376" }, + { 91, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 92, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 93, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 94, "\315\340\347\342\340\355\350\345:" }, + { 95, "\315\350\352\356\343\344\340" }, + { 96, "\315\345\362" }, + { 97, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 98, "\301\345\347 \354\363\347\373\352\350" }, + { 99, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 100, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 101, "\315\345 \347\340\344\340\355" }, + { 102, "OK" }, + { 103, "\316\357\366\350\350" }, + { 104, "\316\357\366\350\350..." }, + { 105, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 107, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 108, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 109, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 110, "PC \361\357\350\352\345\360" }, + { 111, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 112, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 113, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 114, "\317\363\362\350" }, + { 115, "\317\340\363\347\340" }, + { 116, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 117, "\317\353\340\362\364\356\360\354\340:" }, + { 118, "\302\360\345\354\377 \350\343\360\373: " }, + { 119, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 120, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 121, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 122, "\302\373\365\356\344" }, + { 123, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 124, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 125, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 126, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 127, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 128, "\317\360\356\344\356\353\346\350\362\374" }, + { 129, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 130, "SEQ" }, + { 131, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 132, "\307\340\357\350\361\340\362\374" }, + { 133, "\317\363\362\374 \361\356\365\360.: " }, + { 134, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 135, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 136, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 137, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 138, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 139, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 140, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 141, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 142, "\317\356\350\361\352:" }, + { 143, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 144, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 145, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 146, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 149, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 150, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 151, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 152, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 153, "\317\360\356\357\363\361\362\350\362\374" }, + { 154, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 155, "SoundFont:" }, + { 156, "\316\347\342" }, + { 157, "\316\347\342\363\367\352\340" }, + { 158, "\307\342\363\352 \350 \361\363\341." }, + { 159, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 160, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 161, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 162, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 163, "\317\363\361\352" }, + { 164, "\321\363\341" }, + { 165, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 166, "\321\363\341\362\350\362\360\373" }, + { 167, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 168, "Tapware Zodiac" }, + { 169, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 170, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 171, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 172, "\322\345\354\340:" }, + { 173, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 174, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 175, "TiMidity" }, + { 176, "\302\360\345\354\377: " }, + { 177, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 178, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 179, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 180, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 181, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 182, "\303\360\356\354\352\356\361\362\374" }, + { 183, "Windows MIDI" }, + { 184, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 185, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 186, "Yamaha Pa1" }, + { 187, "\304\340" }, + { 188, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 189, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 190, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 191, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 192, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 193, "\355\345 \363\344\340\353\356\361\374\n" }, + { 194, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 195, "~\304~\356\341. \350\343\360\363..." }, + { 196, "\316~\362~\354\345\355\340" }, + { 197, "~\307~\340\352\360\373\362\374" }, + { 198, "\310\347~\354~. \350\343\360\363..." }, + { 199, "~\317~\356\354\356\371\374" }, + { 200, "~\312~\353\340\342\350\370\350" }, + { 201, "~\307~\340\343\360\363\347\350\362\374" }, + { 202, "~\307~\340\343\360...." }, + { 203, "~\321~\353\345\344" }, + { 204, "~O~K" }, + { 205, "~\316~\357\366\350\350" }, + { 206, "~\316~\357\366\350\350..." }, + { 207, "~\317~\360\345\344" }, + { 208, "~\302~\373\365\356\344" }, + { 209, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 210, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 211, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 212, "~\307~\340\357\350\361\340\362\374" }, + { 213, "\317~\363~\361\352" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-10 23:21+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 18:43+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 11, "" }, { 15, "Hang" }, { 16, "AdLib vezet :" }, { 19, "Aspect adag korrekci\363" }, { 23, "Hang" }, { 24, "Automatikus ment\351s:" }, - { 36, "Hang" }, - { 42, "" }, - { 52, "K\351pess\351 Roland GS Mode" }, - { 56, "Extra \332tvonal:" }, - { 60, "Teljes k\351perny s m\363d:" }, - { 62, "Lek\351pez eszk\366z GUI:" }, - { 66, "Extra \332tvonal:" }, - { 68, "Grafik\341val" }, - { 69, "Grafikus m\363d:" }, - { 74, "Kulcsok" }, - { 80, "MIDI nyeres\351g:" }, - { 86, "Vegyes AdLib/MIDI m\363d" }, - { 88, "Zenei vezet :" }, - { 89, "Zene mennyis\351g:" }, - { 90, "Muta \326sszes" }, - { 92, "Soha" }, - { 93, "Semmi" }, - { 98, "Semmi" }, - { 99, "Igen" }, - { 102, "Kimeneti teljes\355tm\351ny:" }, - { 111, "\326sv\351nyek" }, - { 112, "\326sv\351nyek" }, - { 124, "Renderel\351si m\363d:" }, - { 128, "SFX mennyis\351ge" }, - { 130, "Extra \332tvonal:" }, - { 153, "Csak a besz\351d" }, - { 154, "Besz\351d s Feliratok" }, - { 155, "Csak a besz\351d" }, - { 156, "Besz\351d \351s a Feliratok" }, - { 157, "Besz\351d mennyis\351g:" }, - { 161, "Felirat sebess\351g:" }, - { 162, "Csak feliratok" }, - { 163, "Csak feliratok" }, - { 165, "Sz\366veg \351s besz\351d:" }, - { 168, "T\351ma:" }, + { 37, "Hang" }, + { 43, "" }, + { 53, "K\351pess\351 Roland GS Mode" }, + { 57, "Extra \332tvonal:" }, + { 61, "Teljes k\351perny s m\363d:" }, + { 63, "Lek\351pez eszk\366z GUI:" }, + { 67, "Extra \332tvonal:" }, + { 70, "Grafik\341val" }, + { 71, "Grafikus m\363d:" }, + { 77, "Kulcsok" }, + { 83, "MIDI nyeres\351g:" }, + { 89, "Vegyes AdLib/MIDI m\363d" }, + { 91, "Zenei vezet :" }, + { 92, "Zene mennyis\351g:" }, + { 93, "Muta \326sszes" }, + { 95, "Soha" }, + { 96, "Semmi" }, + { 101, "Semmi" }, + { 102, "Igen" }, + { 105, "Kimeneti teljes\355tm\351ny:" }, + { 114, "\326sv\351nyek" }, + { 115, "\326sv\351nyek" }, + { 127, "Renderel\351si m\363d:" }, + { 131, "SFX mennyis\351ge" }, + { 133, "Extra \332tvonal:" }, + { 157, "Csak a besz\351d" }, + { 158, "Besz\351d s Feliratok" }, + { 159, "Csak a besz\351d" }, + { 160, "Besz\351d \351s a Feliratok" }, + { 161, "Besz\351d mennyis\351g:" }, + { 165, "Felirat sebess\351g:" }, + { 166, "Csak feliratok" }, + { 167, "Csak feliratok" }, + { 169, "Sz\366veg \351s besz\351d:" }, { 172, "T\351ma:" }, - { 173, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 178, "Volumene" }, - { 185, "10 percenk\351nt" }, - { 186, "15 percenk\351nt" }, - { 187, "30 percenk\351nt" }, - { 188, "5 percenk\351nt" }, - { 196, "Kulcsok" }, - { 200, "Igen" }, + { 176, "T\351ma:" }, + { 177, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 182, "Volumene" }, + { 189, "10 percenk\351nt" }, + { 190, "15 percenk\351nt" }, + { 191, "30 percenk\351nt" }, + { 192, "5 percenk\351nt" }, + { 200, "Kulcsok" }, + { 204, "Igen" }, { -1, NULL } }; diff --git a/po/hu_HU.po b/po/hu_HU.po index 5f352f17f1..1f4c7171ba 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 23:21+0300\n" +"POT-Creation-Date: 2010-06-12 18:43+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -43,23 +43,23 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:75 +#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "" -#: gui/GuiManager.cpp:98 +#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:101 +#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:104 base/main.cpp:284 +#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:107 base/main.cpp:287 +#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 msgid "Remap keys" msgstr "" @@ -900,3 +900,19 @@ msgstr "" #: gui/options.cpp:684 msgid "Subs" msgstr "" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "" + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "" + +#: gui/launcher.cpp:529 gui/options.cpp:647 +msgid "Clear value" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index bb35629d91..dea76ac03e 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 23:21+0300\n" +"POT-Creation-Date: 2010-06-12 18:43+0300\n" "PO-Revision-Date: 2010-06-08 08:52-0100\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -44,23 +44,23 @@ msgstr " msgid "Choose" msgstr "Âûáðàòü" -#: gui/GuiManager.cpp:75 +#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" -#: gui/GuiManager.cpp:98 +#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 msgid "Close" msgstr "Çàêðûòü" -#: gui/GuiManager.cpp:101 +#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "Êëèê ìûøüþ" -#: gui/GuiManager.cpp:104 base/main.cpp:284 +#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 msgid "Display keyboard" msgstr "Ïîêàçàòü êëàâèàòóðó" -#: gui/GuiManager.cpp:107 base/main.cpp:287 +#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 msgid "Remap keys" msgstr "Ïåðåíàçíà÷èòü êëàâèøè" @@ -893,3 +893,19 @@ msgstr " #: gui/options.cpp:684 msgid "Subs" msgstr "Ñóá" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "Óäåðæèâàéòå êëàâèøó Shift äëÿ òîãî, ÷òîáû äîáàâèòü íåñêîëüêî èãð" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "Ïîèñê â ñïèñêå èãð" + +#: gui/launcher.cpp:529 gui/options.cpp:647 +msgid "Clear value" +msgstr "Î÷èñòèòü çíà÷åíèå" diff --git a/po/scummvm.pot b/po/scummvm.pot index a327eb08e5..100e32ec72 100755 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-10 23:21+0300\n" +"POT-Creation-Date: 2010-06-12 18:43+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -43,23 +43,23 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:75 +#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "" -#: gui/GuiManager.cpp:98 +#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:101 +#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:104 base/main.cpp:284 +#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:107 base/main.cpp:287 +#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 msgid "Remap keys" msgstr "" @@ -888,3 +888,19 @@ msgstr "" #: gui/options.cpp:684 msgid "Subs" msgstr "" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "" + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "" + +#: gui/launcher.cpp:529 gui/options.cpp:647 +msgid "Clear value" +msgstr "" -- cgit v1.2.3 From 96b3aa65046a371700228e4bfcecda2f8f84fa56 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:53:30 +0000 Subject: GUI: Added tons of tooltips. svn-id: r49777 --- gui/launcher.cpp | 34 +++++++++++++++++----------------- gui/options.cpp | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 829a57469b..84d27e9892 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -170,16 +170,16 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) tab->addTab(_("Game")); // GUI: Label & edit widget for the game ID - new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:")); + new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:"), _("Short game identifier used for referring to savegames and running the game from the command line")); _domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain); // GUI: Label & edit widget for the description - new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:")); + new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:"), _("Full title of the game")); _descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description); // Language popup - _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:")); - _langPopUp = new PopUpWidget(tab, "GameOptions_Game.LangPopup"); + _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:"), _("Language of the game. This will not turn your Spanish game version into English")); + _langPopUp = new PopUpWidget(tab, "GameOptions_Game.LangPopup", _("Language of the game. This will not turn your Spanish game version into English")); _langPopUp->appendEntry(_("")); _langPopUp->appendEntry(""); const Common::LanguageDescription *l = Common::g_languages; @@ -188,8 +188,8 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // Platform popup - _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:")); - _platformPopUp = new PopUpWidget(tab, "GameOptions_Game.PlatformPopup"); + _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:"), _("Platform the game was originally designed for")); + _platformPopUp = new PopUpWidget(tab, "GameOptions_Game.PlatformPopup", _("Platform the game was originally designed for")); _platformPopUp->appendEntry(_("")); _platformPopUp->appendEntry(""); const Common::PlatformDescription *p = Common::g_platforms; @@ -250,12 +250,12 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath); // GUI: Button + Label for the additional path - new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), 0, kCmdExtraBrowser); - _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath); + new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), _("Specifies path to additional data used the game"), kCmdExtraBrowser); + _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath, _("Specifies path to additional data used the game")); // GUI: Button + Label for the save path - new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), 0, kCmdSaveBrowser); - _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath); + new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), _("Specifies where your savegames are put"), kCmdSaveBrowser); + _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath, _("Specifies where your savegames are put")); // Activate the first tab tab->setActiveTab(0); @@ -497,22 +497,22 @@ LauncherDialog::LauncherDialog() new StaticTextWidget(this, "Launcher.Version", gScummVMFullVersion); #endif - new ButtonWidget(this, "Launcher.QuitButton", _("~Q~uit"), 0, kQuitCmd); - new ButtonWidget(this, "Launcher.AboutButton", _("A~b~out..."), 0, kAboutCmd); - new ButtonWidget(this, "Launcher.OptionsButton", _("~O~ptions..."), 0, kOptionsCmd); + new ButtonWidget(this, "Launcher.QuitButton", _("~Q~uit"), _("Quit ScummVM"), kQuitCmd); + new ButtonWidget(this, "Launcher.AboutButton", _("A~b~out..."), _("About ScummVM"), kAboutCmd); + new ButtonWidget(this, "Launcher.OptionsButton", _("~O~ptions..."), _("Change global ScummVM options"), kOptionsCmd); _startButton = - new ButtonWidget(this, "Launcher.StartButton", _("~S~tart"), 0, kStartCmd); + new ButtonWidget(this, "Launcher.StartButton", _("~S~tart"), _("Start selected game"), kStartCmd); _loadButton = - new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), 0, kLoadGameCmd); + new ButtonWidget(this, "Launcher.LoadGameButton", _("~L~oad..."), _("Load savegame for selected game"), kLoadGameCmd); // Above the lowest button rows: two more buttons (directly below the list box) _addButton = new ButtonWidget(this, "Launcher.AddGameButton", _("~A~dd Game..."), _("Hold Shift for Mass Add"), kAddGameCmd); _editButton = - new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), 0, kEditGameCmd); + new ButtonWidget(this, "Launcher.EditGameButton", _("~E~dit Game..."), _("Change game options"), kEditGameCmd); _removeButton = - new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), 0, kRemoveGameCmd); + new ButtonWidget(this, "Launcher.RemoveGameButton", _("~R~emove Game"), _("Remove game from the list. The game data files stay intact"), kRemoveGameCmd); // Search box _searchDesc = 0; diff --git a/gui/options.cpp b/gui/options.cpp index ac7b2dc475..4a028521a5 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -588,8 +588,8 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr } // RenderMode popup - _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", _("Render mode:")); - _renderModePopUp = new PopUpWidget(boss, prefix + "grRenderPopup"); + _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", _("Render mode:"), _("Special dithering modes supported by some games")); + _renderModePopUp = new PopUpWidget(boss, prefix + "grRenderPopup", _("Special dithering modes supported by some games")); _renderModePopUp->appendEntry(_(""), Common::kRenderDefault); _renderModePopUp->appendEntry(""); const Common::RenderModeDescription *rm = Common::g_renderModes; @@ -601,15 +601,15 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode")); // Aspect ratio checkbox - _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction")); + _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction"), _("Correct aspect ratio for 320x200 games")); _enableGraphicSettings = true; } void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:")); - _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup"); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:"), _("Specifies output sound device or sound emulator")); + _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound emulator")); // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); @@ -619,8 +619,8 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref } // The OPL emulator popup & a label - _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", _("AdLib emulator:")); - _oplPopUp = new PopUpWidget(boss, prefix + "auOPLPopup"); + _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", _("AdLib emulator:"), _("AdLib is used for music in many games")); + _oplPopUp = new PopUpWidget(boss, prefix + "auOPLPopup", _("AdLib is used for music in many games")); // Populate it const OPL::Config::EmulatorDescription *ed = OPL::Config::getAvailable(); @@ -630,8 +630,8 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref } // Sample rate settings - _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", _("Output rate:")); - _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup"); + _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", _("Output rate:"), _("Higher value specifies better sound quality but may be not supported by your soundcard")); + _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup", _("Higher value specifies better sound quality but may be not supported by your soundcard")); for (int i = 0; outputRateLabels[i]; i++) { _outputRatePopUp->appendEntry(_(outputRateLabels[i]), outputRateValues[i]); @@ -642,18 +642,18 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { // SoundFont - _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), 0, kChooseSoundFontCmd); - _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None")); + _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"), kChooseSoundFontCmd); + _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity")); _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", _("Clear value"), kClearSoundFontCmd); // Multi midi setting - _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode")); + _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode"), _("Use both MIDI and AdLib sound generation")); // Native mt32 setting - _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)")); + _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer")); // GS Extensions setting - _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode")); + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack")); // MIDI gain setting (FluidSynth uses this) _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); @@ -680,9 +680,9 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p } else { _subToggleGroup = new RadiobuttonGroup(boss, kSubtitleToggle); - _subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Spch")); - _subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subs")); - _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both")); + _subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Spch"), _("Speech")); + _subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subs"), _("Subtitles")); + _subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both"), _("Show subtitles and play speech")); } // Subtitle speed @@ -708,8 +708,8 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), 0, kMuteAllChanged); - _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:")); - _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", 0, kSfxVolumeChanged); + _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:"), _("Special sound effects volume")); + _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", _("Special sound effects volume"), kSfxVolumeChanged); _sfxVolumeLabel = new StaticTextWidget(boss, prefix + "vcSfxLabel", "100%"); _sfxVolumeSlider->setMinValue(0); _sfxVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); @@ -792,14 +792,14 @@ GlobalOptionsDialog::GlobalOptionsDialog() // truncated in the small version of the GUI. // Save game path - new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), 0, kChooseSaveDirCmd); - _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar"); + new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), _("Specifies where your savegames are put"), kChooseSaveDirCmd); + _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar", _("Specifies where your savegames are put")); new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), 0, kChooseThemeDirCmd); _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None")); - new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), 0, kChooseExtraDirCmd); - _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None")); + new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), _("Specifies path to additional data used by all games or ScummVM"), kChooseExtraDirCmd); + _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None"), _("Specifies path to additional data used by all games or ScummVM")); #ifdef DYNAMIC_MODULES new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), 0, kChoosePluginsDirCmd); @@ -834,7 +834,7 @@ GlobalOptionsDialog::GlobalOptionsDialog() #ifdef TRANSLATION - _guiLanguagePopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.GuiLanguagePopupDesc", _("Language:")); + _guiLanguagePopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.GuiLanguagePopupDesc", _("GUI Language:"), _("Language of ScummVM GUI")); _guiLanguagePopUp = new PopUpWidget(tab, "GlobalOptions_Misc.GuiLanguagePopup"); #ifdef DETECTLANG _guiLanguagePopUp->appendEntry(_(""), Common::kTranslationAutodetectId); -- cgit v1.2.3 From 5370fc2312b1f01f81c5ad4ce2ef0a2c879f9c71 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:53:55 +0000 Subject: GUI: Widened max tooltip width for bigger screen resolutions svn-id: r49778 --- gui/themes/default.inc | 2 +- gui/themes/scummclassic.zip | Bin 55660 -> 55660 bytes gui/themes/scummclassic/classic_layout.stx | 2 +- gui/themes/scummmodern.zip | Bin 162933 -> 162933 bytes gui/themes/scummmodern/scummmodern_layout.stx | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 1009f31816..a360c95a00 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -433,7 +433,7 @@ " " " " " " -" " +" " " " " " " - + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 22e8ccaa90..0a6c172fe0 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 1488967a9c..0025722731 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -48,7 +48,7 @@ - + -- cgit v1.2.3 From 2b67bcc8e499581c33f9a4d914df056e9c2c0bf2 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:54:22 +0000 Subject: GUI: Added tooltips to more widgets. svn-id: r49779 --- gui/EditTextWidget.cpp | 8 ++++---- gui/EditTextWidget.h | 4 ++-- gui/ListWidget.cpp | 8 ++++---- gui/ListWidget.h | 4 ++-- gui/editable.cpp | 8 ++++---- gui/editable.h | 4 ++-- gui/launcher.cpp | 12 ++++++------ gui/options.cpp | 4 ++-- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/gui/EditTextWidget.cpp b/gui/EditTextWidget.cpp index 658ac21117..7079453173 100644 --- a/gui/EditTextWidget.cpp +++ b/gui/EditTextWidget.cpp @@ -30,16 +30,16 @@ namespace GUI { -EditTextWidget::EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, uint32 cmd) - : EditableWidget(boss, x, y - 1, w, h + 2, cmd) { +EditTextWidget::EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, const char *tooltip, uint32 cmd) + : EditableWidget(boss, x, y - 1, w, h + 2, tooltip, cmd) { setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE); _type = kEditTextWidget; setEditString(text); } -EditTextWidget::EditTextWidget(GuiObject *boss, const String &name, const String &text, uint32 cmd) - : EditableWidget(boss, name, cmd) { +EditTextWidget::EditTextWidget(GuiObject *boss, const String &name, const String &text, const char *tooltip, uint32 cmd) + : EditableWidget(boss, name, tooltip, cmd) { setFlags(WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANT_TICKLE); _type = kEditTextWidget; diff --git a/gui/EditTextWidget.h b/gui/EditTextWidget.h index 5a5823cfb1..9c4ef03648 100644 --- a/gui/EditTextWidget.h +++ b/gui/EditTextWidget.h @@ -41,8 +41,8 @@ protected: int _rightPadding; public: - EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, uint32 cmd = 0); - EditTextWidget(GuiObject *boss, const String &name, const String &text, uint32 cmd = 0); + EditTextWidget(GuiObject *boss, int x, int y, int w, int h, const String &text, const char *tooltip = 0, uint32 cmd = 0); + EditTextWidget(GuiObject *boss, const String &name, const String &text, const char *tooltp = 0, uint32 cmd = 0); void setEditString(const String &str); diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp index 97dde29824..e08bc09b0b 100644 --- a/gui/ListWidget.cpp +++ b/gui/ListWidget.cpp @@ -36,8 +36,8 @@ namespace GUI { -ListWidget::ListWidget(Dialog *boss, const String &name, uint32 cmd) - : EditableWidget(boss, name), _cmd(cmd) { +ListWidget::ListWidget(Dialog *boss, const String &name, const char *tooltip, uint32 cmd) + : EditableWidget(boss, name, tooltip), _cmd(cmd) { _scrollBar = NULL; _textWidth = NULL; @@ -68,8 +68,8 @@ ListWidget::ListWidget(Dialog *boss, const String &name, uint32 cmd) _editColor = ThemeEngine::kFontColorNormal; } -ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, uint32 cmd) - : EditableWidget(boss, x, y, w, h), _cmd(cmd) { +ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd) + : EditableWidget(boss, x, y, w, h, tooltip), _cmd(cmd) { _scrollBar = NULL; _textWidth = NULL; diff --git a/gui/ListWidget.h b/gui/ListWidget.h index a3fb825761..3858fa6de2 100644 --- a/gui/ListWidget.h +++ b/gui/ListWidget.h @@ -87,8 +87,8 @@ protected: ThemeEngine::FontColor _editColor; public: - ListWidget(Dialog *boss, const String &name, uint32 cmd = 0); - ListWidget(Dialog *boss, int x, int y, int w, int h, uint32 cmd = 0); + ListWidget(Dialog *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0); + ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0); virtual ~ListWidget(); virtual Widget *findWidget(int x, int y); diff --git a/gui/editable.cpp b/gui/editable.cpp index 058f08e233..755e34e380 100644 --- a/gui/editable.cpp +++ b/gui/editable.cpp @@ -28,13 +28,13 @@ namespace GUI { -EditableWidget::EditableWidget(GuiObject *boss, int x, int y, int w, int h, uint32 cmd) - : Widget(boss, x, y, w, h), CommandSender(boss), _cmd(cmd) { +EditableWidget::EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip, uint32 cmd) + : Widget(boss, x, y, w, h, tooltip), CommandSender(boss), _cmd(cmd) { init(); } -EditableWidget::EditableWidget(GuiObject *boss, const String &name, uint32 cmd) - : Widget(boss, name), CommandSender(boss), _cmd(cmd) { +EditableWidget::EditableWidget(GuiObject *boss, const String &name, const char *tooltip, uint32 cmd) + : Widget(boss, name, tooltip), CommandSender(boss), _cmd(cmd) { init(); } diff --git a/gui/editable.h b/gui/editable.h index 00cb3431a5..8ff5298511 100644 --- a/gui/editable.h +++ b/gui/editable.h @@ -55,8 +55,8 @@ protected: ThemeEngine::FontStyle _font; public: - EditableWidget(GuiObject *boss, int x, int y, int w, int h, uint32 cmd = 0); - EditableWidget(GuiObject *boss, const String &name, uint32 cmd = 0); + EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0); + EditableWidget(GuiObject *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0); virtual ~EditableWidget(); void init(); diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 84d27e9892..176fb45214 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -88,8 +88,8 @@ enum { */ class DomainEditTextWidget : public EditTextWidget { public: - DomainEditTextWidget(GuiObject *boss, const String &name, const String &text) - : EditTextWidget(boss, name, text) { + DomainEditTextWidget(GuiObject *boss, const String &name, const String &text, const char *tooltip = 0) + : EditTextWidget(boss, name, text, tooltip) { } protected: @@ -171,11 +171,11 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // GUI: Label & edit widget for the game ID new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:"), _("Short game identifier used for referring to savegames and running the game from the command line")); - _domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain); + _domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain, _("Short game identifier used for referring to savegames and running the game from the command line")); // GUI: Label & edit widget for the description new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:"), _("Full title of the game")); - _descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description); + _descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description, _("Full title of the game")); // Language popup _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:"), _("Language of the game. This will not turn your Spanish game version into English")); @@ -525,11 +525,11 @@ LauncherDialog::LauncherDialog() #endif _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); - _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, kSearchCmd); + _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, 0, kSearchCmd); _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", _("Clear value"), kSearchClearCmd); // Add list with game titles - _list = new ListWidget(this, "Launcher.GameList", kListSearchCmd); + _list = new ListWidget(this, "Launcher.GameList", 0, kListSearchCmd); _list->setEditable(false); _list->setNumberingMode(kListNumberingOff); diff --git a/gui/options.cpp b/gui/options.cpp index 4a028521a5..ad32bfd4e3 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -608,8 +608,8 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:"), _("Specifies output sound device or sound emulator")); - _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound emulator")); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:"), _("Specifies output sound device or sound card emulator")); + _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator")); // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); -- cgit v1.2.3 From 7be2812757f066c8b73deda0406e79cd31d2f601 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:54:48 +0000 Subject: i18n: Update Russian translation with new tooltips svn-id: r49780 --- common/messages.cpp | 958 +++++++++++++++++++++++++++------------------------- po/hu_HU.po | 127 ++++++- po/ru_RU.po | 140 +++++++- po/scummvm.pot | 127 ++++++- 4 files changed, 892 insertions(+), 460 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 27ae9453e0..752fbbcc0e 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -18,206 +18,234 @@ static const char * _po2c_msgids[] = { /* 11 */ "", /* 12 */ "ALSA", /* 13 */ "About", - /* 14 */ "About...", - /* 15 */ "AdLib", - /* 16 */ "AdLib emulator:", - /* 17 */ "Add Game...", - /* 18 */ "Antialiased Renderer (16bpp)", - /* 19 */ "Aspect ratio correction", - /* 20 */ "Associated key : %s", - /* 21 */ "Associated key : none", - /* 22 */ "Atari ST MIDI", - /* 23 */ "Audio", - /* 24 */ "Autosave:", - /* 25 */ "A~b~out...", - /* 26 */ "Both", - /* 27 */ "C1Available engines:", - /* 28 */ "C1Features compiled in:", - /* 29 */ "C2(built on ", - /* 30 */ "CAMD", - /* 31 */ "Cancel", - /* 32 */ "Cannot create file", - /* 33 */ "Choose", - /* 34 */ "Choose an action to map", - /* 35 */ "Clear value", - /* 36 */ "Close", - /* 37 */ "CoreAudio", - /* 38 */ "CoreMIDI", - /* 39 */ "Could not find any engine capable of running the selected game", - /* 40 */ "Creative Music System", - /* 41 */ "DMedia", - /* 42 */ "Date: ", - /* 43 */ "Default", - /* 44 */ "Delete", - /* 45 */ "Disabled GFX", - /* 46 */ "Discovered %d new games ...", - /* 47 */ "Discovered %d new games.", - /* 48 */ "Display keyboard", - /* 49 */ "Do you really want to delete this savegame?", - /* 50 */ "Do you really want to remove this game configuration?", - /* 51 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 52 */ "Edit Game...", - /* 53 */ "Enable Roland GS Mode", - /* 54 */ "Engine does not support debug level '%s'", - /* 55 */ "English", - /* 56 */ "Error running game:", - /* 57 */ "Extra Path:", - /* 58 */ "FM Towns", - /* 59 */ "Failed to load any GUI theme, aborting", - /* 60 */ "FluidSynth", - /* 61 */ "Fullscreen mode", - /* 62 */ "GFX", - /* 63 */ "GUI Renderer:", - /* 64 */ "Game", - /* 65 */ "Game Data not found", - /* 66 */ "Game Id not supported", - /* 67 */ "Game Path:", - /* 68 */ "Go to previous directory level", - /* 69 */ "Go up", - /* 70 */ "Graphics", - /* 71 */ "Graphics mode:", - /* 72 */ "Help", - /* 73 */ "Hold Shift for Mass Add", - /* 74 */ "IBM PCjr", - /* 75 */ "ID:", - /* 76 */ "Invalid Path", - /* 77 */ "Keys", - /* 78 */ "Language:", - /* 79 */ "Load", - /* 80 */ "Load game:", - /* 81 */ "Load...", - /* 82 */ "MIDI", - /* 83 */ "MIDI gain:", - /* 84 */ "MT-32 Emulation", - /* 85 */ "Map", - /* 86 */ "Mass Add...", - /* 87 */ "Menu", - /* 88 */ "Misc", - /* 89 */ "Mixed AdLib/MIDI mode", - /* 90 */ "Mouse click", - /* 91 */ "Music driver:", - /* 92 */ "Music volume:", - /* 93 */ "Mute All", - /* 94 */ "Name:", - /* 95 */ "Never", - /* 96 */ "No", - /* 97 */ "No date saved", - /* 98 */ "No music", - /* 99 */ "No playtime saved", - /* 100 */ "No time saved", - /* 101 */ "None", - /* 102 */ "OK", - /* 103 */ "Options", - /* 104 */ "Options...", - /* 105 */ "Output rate:", - /* 106 */ "Override global MIDI settings", - /* 107 */ "Override global audio settings", - /* 108 */ "Override global graphic settings", - /* 109 */ "Override global volume settings", - /* 110 */ "PC Speaker", - /* 111 */ "Path not a directory", - /* 112 */ "Path not a file", - /* 113 */ "Path not exists", - /* 114 */ "Paths", - /* 115 */ "Pause", - /* 116 */ "Pick the game:", - /* 117 */ "Platform:", - /* 118 */ "Playtime: ", - /* 119 */ "Please select an action", - /* 120 */ "Plugins Path:", - /* 121 */ "Press the key to associate", - /* 122 */ "Quit", - /* 123 */ "Read permission denied", - /* 124 */ "Reading failed", - /* 125 */ "Remap keys", - /* 126 */ "Remove Game", - /* 127 */ "Render mode:", - /* 128 */ "Resume", - /* 129 */ "Return to Launcher", - /* 130 */ "SEQ", - /* 131 */ "SFX volume:", - /* 132 */ "Save", - /* 133 */ "Save Path:", - /* 134 */ "Save Path: ", - /* 135 */ "Save game:", - /* 136 */ "Scan complete!", - /* 137 */ "Scanned %d directories ...", - /* 138 */ "ScummVM could not find any engine capable of running the selected game!", - /* 139 */ "ScummVM could not find any game in the specified directory!", - /* 140 */ "ScummVM couldn't open the specified directory!", - /* 141 */ "Search in game list", - /* 142 */ "Search:", - /* 143 */ "Select SoundFont", - /* 144 */ "Select a Theme", - /* 145 */ "Select additional game directory", - /* 146 */ "Select an action and click 'Map'", - /* 147 */ "Select directory for GUI themes", - /* 148 */ "Select directory for extra files", - /* 149 */ "Select directory for plugins", - /* 150 */ "Select directory for saved games", - /* 151 */ "Select directory for savegames", - /* 152 */ "Select directory with game data", - /* 153 */ "Skip", - /* 154 */ "Skip line", - /* 155 */ "SoundFont:", - /* 156 */ "Spch", - /* 157 */ "Speech", - /* 158 */ "Speech & Subs", - /* 159 */ "Speech Only", - /* 160 */ "Speech and Subtitles", - /* 161 */ "Speech volume:", - /* 162 */ "Standard Renderer (16bpp)", - /* 163 */ "Start", - /* 164 */ "Subs", - /* 165 */ "Subtitle speed:", - /* 166 */ "Subtitles", - /* 167 */ "Subtitles Only", - /* 168 */ "Tapwave Zodiac", - /* 169 */ "Text and Speech:", - /* 170 */ "The chosen directory cannot be written to. Please select another one.", - /* 171 */ "Theme Path:", - /* 172 */ "Theme:", - /* 173 */ "This game ID is already taken. Please choose another one.", - /* 174 */ "This game does not support loading games from the launcher.", - /* 175 */ "TiMidity", - /* 176 */ "Time: ", - /* 177 */ "True Roland MT-32 (disable GM emulation)", - /* 178 */ "Unknown Error", - /* 179 */ "Unsupported Color Mode", - /* 180 */ "Untitled savestate", - /* 181 */ "User picked target '%s' (gameid '%s')...\n", - /* 182 */ "Volume", - /* 183 */ "Windows MIDI", - /* 184 */ "Write permission denied", - /* 185 */ "Writing data failed", - /* 186 */ "Yamaha Pa1", - /* 187 */ "Yes", - /* 188 */ "You have to restart ScummVM to take the effect.", - /* 189 */ "every 10 mins", - /* 190 */ "every 15 mins", - /* 191 */ "every 30 mins", - /* 192 */ "every 5 mins", - /* 193 */ "failed\n", - /* 194 */ "~A~bout", - /* 195 */ "~A~dd Game...", - /* 196 */ "~C~ancel", - /* 197 */ "~C~lose", - /* 198 */ "~E~dit Game...", - /* 199 */ "~H~elp", - /* 200 */ "~K~eys", - /* 201 */ "~L~oad", - /* 202 */ "~L~oad...", - /* 203 */ "~N~ext", - /* 204 */ "~O~K", - /* 205 */ "~O~ptions", - /* 206 */ "~O~ptions...", - /* 207 */ "~P~revious", - /* 208 */ "~Q~uit", - /* 209 */ "~R~emove Game", - /* 210 */ "~R~esume", - /* 211 */ "~R~eturn to Launcher", - /* 212 */ "~S~ave", - /* 213 */ "~S~tart", + /* 14 */ "About ScummVM", + /* 15 */ "About...", + /* 16 */ "AdLib", + /* 17 */ "AdLib emulator:", + /* 18 */ "AdLib is used for music in many games", + /* 19 */ "Add Game...", + /* 20 */ "Antialiased Renderer (16bpp)", + /* 21 */ "Aspect ratio correction", + /* 22 */ "Associated key : %s", + /* 23 */ "Associated key : none", + /* 24 */ "Atari ST MIDI", + /* 25 */ "Audio", + /* 26 */ "Autosave:", + /* 27 */ "A~b~out...", + /* 28 */ "Both", + /* 29 */ "C1Available engines:", + /* 30 */ "C1Features compiled in:", + /* 31 */ "C2(built on ", + /* 32 */ "CAMD", + /* 33 */ "Cancel", + /* 34 */ "Cannot create file", + /* 35 */ "Change game options", + /* 36 */ "Change global ScummVM options", + /* 37 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 38 */ "Choose", + /* 39 */ "Choose an action to map", + /* 40 */ "Clear value", + /* 41 */ "Close", + /* 42 */ "CoreAudio", + /* 43 */ "CoreMIDI", + /* 44 */ "Correct aspect ratio for 320x200 games", + /* 45 */ "Could not find any engine capable of running the selected game", + /* 46 */ "Creative Music System", + /* 47 */ "DMedia", + /* 48 */ "Date: ", + /* 49 */ "Default", + /* 50 */ "Delete", + /* 51 */ "Disabled GFX", + /* 52 */ "Discovered %d new games ...", + /* 53 */ "Discovered %d new games.", + /* 54 */ "Display keyboard", + /* 55 */ "Do you really want to delete this savegame?", + /* 56 */ "Do you really want to remove this game configuration?", + /* 57 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 58 */ "Edit Game...", + /* 59 */ "Enable Roland GS Mode", + /* 60 */ "Engine does not support debug level '%s'", + /* 61 */ "English", + /* 62 */ "Error running game:", + /* 63 */ "Extra Path:", + /* 64 */ "FM Towns", + /* 65 */ "Failed to load any GUI theme, aborting", + /* 66 */ "FluidSynth", + /* 67 */ "Full title of the game", + /* 68 */ "Fullscreen mode", + /* 69 */ "GFX", + /* 70 */ "GUI Language:", + /* 71 */ "GUI Renderer:", + /* 72 */ "Game", + /* 73 */ "Game Data not found", + /* 74 */ "Game Id not supported", + /* 75 */ "Game Path:", + /* 76 */ "Go to previous directory level", + /* 77 */ "Go up", + /* 78 */ "Graphics", + /* 79 */ "Graphics mode:", + /* 80 */ "Help", + /* 81 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 82 */ "Hold Shift for Mass Add", + /* 83 */ "IBM PCjr", + /* 84 */ "ID:", + /* 85 */ "Invalid Path", + /* 86 */ "Keys", + /* 87 */ "Language of ScummVM GUI", + /* 88 */ "Language of the game. This will not turn your Spanish game version into English", + /* 89 */ "Language:", + /* 90 */ "Load", + /* 91 */ "Load game:", + /* 92 */ "Load savegame for selected game", + /* 93 */ "Load...", + /* 94 */ "MIDI", + /* 95 */ "MIDI gain:", + /* 96 */ "MT-32 Emulation", + /* 97 */ "Map", + /* 98 */ "Mass Add...", + /* 99 */ "Menu", + /* 100 */ "Misc", + /* 101 */ "Mixed AdLib/MIDI mode", + /* 102 */ "Mouse click", + /* 103 */ "Music driver:", + /* 104 */ "Music volume:", + /* 105 */ "Mute All", + /* 106 */ "Name:", + /* 107 */ "Never", + /* 108 */ "No", + /* 109 */ "No date saved", + /* 110 */ "No music", + /* 111 */ "No playtime saved", + /* 112 */ "No time saved", + /* 113 */ "None", + /* 114 */ "OK", + /* 115 */ "Options", + /* 116 */ "Options...", + /* 117 */ "Output rate:", + /* 118 */ "Override global MIDI settings", + /* 119 */ "Override global audio settings", + /* 120 */ "Override global graphic settings", + /* 121 */ "Override global volume settings", + /* 122 */ "PC Speaker", + /* 123 */ "Path not a directory", + /* 124 */ "Path not a file", + /* 125 */ "Path not exists", + /* 126 */ "Paths", + /* 127 */ "Pause", + /* 128 */ "Pick the game:", + /* 129 */ "Platform the game was originally designed for", + /* 130 */ "Platform:", + /* 131 */ "Playtime: ", + /* 132 */ "Please select an action", + /* 133 */ "Plugins Path:", + /* 134 */ "Press the key to associate", + /* 135 */ "Quit", + /* 136 */ "Quit ScummVM", + /* 137 */ "Read permission denied", + /* 138 */ "Reading failed", + /* 139 */ "Remap keys", + /* 140 */ "Remove Game", + /* 141 */ "Remove game from the list. The game data files stay intact", + /* 142 */ "Render mode:", + /* 143 */ "Resume", + /* 144 */ "Return to Launcher", + /* 145 */ "SEQ", + /* 146 */ "SFX volume:", + /* 147 */ "Save", + /* 148 */ "Save Path:", + /* 149 */ "Save Path: ", + /* 150 */ "Save game:", + /* 151 */ "Scan complete!", + /* 152 */ "Scanned %d directories ...", + /* 153 */ "ScummVM could not find any engine capable of running the selected game!", + /* 154 */ "ScummVM could not find any game in the specified directory!", + /* 155 */ "ScummVM couldn't open the specified directory!", + /* 156 */ "Search in game list", + /* 157 */ "Search:", + /* 158 */ "Select SoundFont", + /* 159 */ "Select a Theme", + /* 160 */ "Select additional game directory", + /* 161 */ "Select an action and click 'Map'", + /* 162 */ "Select directory for GUI themes", + /* 163 */ "Select directory for extra files", + /* 164 */ "Select directory for plugins", + /* 165 */ "Select directory for saved games", + /* 166 */ "Select directory for savegames", + /* 167 */ "Select directory with game data", + /* 168 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 169 */ "Show subtitles and play speech", + /* 170 */ "Skip", + /* 171 */ "Skip line", + /* 172 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 173 */ "SoundFont:", + /* 174 */ "Spch", + /* 175 */ "Special dithering modes supported by some games", + /* 176 */ "Special sound effects volume", + /* 177 */ "Specifies output sound device or sound card emulator", + /* 178 */ "Specifies output sound device or sound emulator", + /* 179 */ "Specifies path to additional data used by all games or ScummVM", + /* 180 */ "Specifies path to additional data used the game", + /* 181 */ "Specifies where your savegames are put", + /* 182 */ "Speech", + /* 183 */ "Speech & Subs", + /* 184 */ "Speech Only", + /* 185 */ "Speech and Subtitles", + /* 186 */ "Speech volume:", + /* 187 */ "Standard Renderer (16bpp)", + /* 188 */ "Start", + /* 189 */ "Start selected game", + /* 190 */ "Subs", + /* 191 */ "Subtitle speed:", + /* 192 */ "Subtitles", + /* 193 */ "Subtitles Only", + /* 194 */ "Tapwave Zodiac", + /* 195 */ "Text and Speech:", + /* 196 */ "The chosen directory cannot be written to. Please select another one.", + /* 197 */ "Theme Path:", + /* 198 */ "Theme:", + /* 199 */ "This game ID is already taken. Please choose another one.", + /* 200 */ "This game does not support loading games from the launcher.", + /* 201 */ "TiMidity", + /* 202 */ "Time: ", + /* 203 */ "True Roland MT-32 (disable GM emulation)", + /* 204 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 205 */ "Unknown Error", + /* 206 */ "Unsupported Color Mode", + /* 207 */ "Untitled savestate", + /* 208 */ "Use both MIDI and AdLib sound generation", + /* 209 */ "User picked target '%s' (gameid '%s')...\n", + /* 210 */ "Volume", + /* 211 */ "Windows MIDI", + /* 212 */ "Write permission denied", + /* 213 */ "Writing data failed", + /* 214 */ "Yamaha Pa1", + /* 215 */ "Yes", + /* 216 */ "You have to restart ScummVM to take the effect.", + /* 217 */ "every 10 mins", + /* 218 */ "every 15 mins", + /* 219 */ "every 30 mins", + /* 220 */ "every 5 mins", + /* 221 */ "failed\n", + /* 222 */ "~A~bout", + /* 223 */ "~A~dd Game...", + /* 224 */ "~C~ancel", + /* 225 */ "~C~lose", + /* 226 */ "~E~dit Game...", + /* 227 */ "~H~elp", + /* 228 */ "~K~eys", + /* 229 */ "~L~oad", + /* 230 */ "~L~oad...", + /* 231 */ "~N~ext", + /* 232 */ "~O~K", + /* 233 */ "~O~ptions", + /* 234 */ "~O~ptions...", + /* 235 */ "~P~revious", + /* 236 */ "~Q~uit", + /* 237 */ "~R~emove Game", + /* 238 */ "~R~esume", + /* 239 */ "~R~eturn to Launcher", + /* 240 */ "~S~ave", + /* 241 */ "~S~tart", NULL }; @@ -227,7 +255,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 18:43+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 19:52+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, @@ -241,261 +269,289 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 11, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, { 12, "ALSA" }, { 13, "\316 \357\360\356\343\360\340\354\354\345" }, - { 14, "\316 \357\360\356\343\360\340\354\354\345..." }, - { 15, "AdLib" }, - { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 17, "\315\356\342. \350\343\360\340..." }, - { 18, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 19, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 20, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 21, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 22, "Atars ST MIDI" }, - { 23, "\300\363\344\350\356" }, - { 24, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 25, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 26, "\302\361\270" }, - { 27, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 28, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 29, "C2(\361\356\341\360\340\355 " }, - { 30, "CAMD" }, - { 31, "\316\362\354\345\355\340" }, - { 32, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 33, "\302\373\341\360\340\362\374" }, - { 34, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 35, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 36, "\307\340\352\360\373\362\374" }, - { 37, "CoreAudio" }, - { 38, "CoreMIDI" }, - { 39, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 40, "Creative Music System" }, - { 41, "DMedia" }, - { 42, "\304\340\362\340: " }, - { 43, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 44, "\323\344\340\353\350\362\374" }, - { 45, "\301\345\347 \343\360\340\364\350\352\350" }, - { 46, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 47, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 48, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 50, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 51, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 52, "\310\347\354. \350\343\360\363..." }, - { 53, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 54, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 55, "English" }, - { 56, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 57, "\304\356\357. \357\363\362\374:" }, - { 58, "FM Towns" }, - { 59, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 60, "FluidSynth" }, - { 61, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 62, "\303\360\364" }, - { 63, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 64, "\310\343\360\340" }, - { 65, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 66, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 67, "\317\363\362\374 \352 \350\343\360\345: " }, - { 68, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 69, "\302\342\345\360\365" }, - { 70, "\303\360\340\364\350\352\340" }, - { 71, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 72, "\317\356\354\356\371\374" }, - { 73, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 74, "IBM PCjr" }, - { 75, "ID:" }, - { 76, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 77, "\312\353\340\342\350\370\350" }, - { 78, "\337\347\373\352:" }, - { 79, "\307\340\343\360\363\347\350\362\374" }, - { 80, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 81, "\307\340\343\360...." }, - { 82, "MIDI" }, - { 83, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 84, "\335\354\363\353\377\366\350\377 MT-32" }, - { 85, "\315\340\347\355\340\367\350\362\374" }, - { 86, "\304\356\341. \354\355\356\343\356..." }, - { 87, "\314\345\355\376" }, - { 88, "\320\340\347\355\356\345" }, - { 89, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 90, "\312\353\350\352 \354\373\370\374\376" }, - { 91, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 92, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 93, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 94, "\315\340\347\342\340\355\350\345:" }, - { 95, "\315\350\352\356\343\344\340" }, - { 96, "\315\345\362" }, - { 97, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 98, "\301\345\347 \354\363\347\373\352\350" }, - { 99, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 100, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 101, "\315\345 \347\340\344\340\355" }, - { 102, "OK" }, - { 103, "\316\357\366\350\350" }, - { 104, "\316\357\366\350\350..." }, - { 105, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 107, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 108, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 109, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 110, "PC \361\357\350\352\345\360" }, - { 111, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 112, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 113, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 114, "\317\363\362\350" }, - { 115, "\317\340\363\347\340" }, - { 116, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 117, "\317\353\340\362\364\356\360\354\340:" }, - { 118, "\302\360\345\354\377 \350\343\360\373: " }, - { 119, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 120, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 121, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 122, "\302\373\365\356\344" }, - { 123, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 124, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 125, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 126, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 127, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 128, "\317\360\356\344\356\353\346\350\362\374" }, - { 129, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 130, "SEQ" }, - { 131, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 132, "\307\340\357\350\361\340\362\374" }, - { 133, "\317\363\362\374 \361\356\365\360.: " }, - { 134, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 135, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 136, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 137, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 138, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 139, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 140, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 141, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 142, "\317\356\350\361\352:" }, - { 143, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 144, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 145, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 146, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 149, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 150, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 151, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 152, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 153, "\317\360\356\357\363\361\362\350\362\374" }, - { 154, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 155, "SoundFont:" }, - { 156, "\316\347\342" }, - { 157, "\316\347\342\363\367\352\340" }, - { 158, "\307\342\363\352 \350 \361\363\341." }, - { 159, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 160, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 161, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 162, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 163, "\317\363\361\352" }, - { 164, "\321\363\341" }, - { 165, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 166, "\321\363\341\362\350\362\360\373" }, - { 167, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 168, "Tapware Zodiac" }, - { 169, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 170, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 171, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 172, "\322\345\354\340:" }, - { 173, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 174, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 175, "TiMidity" }, - { 176, "\302\360\345\354\377: " }, - { 177, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 178, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 179, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 180, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 181, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 182, "\303\360\356\354\352\356\361\362\374" }, - { 183, "Windows MIDI" }, - { 184, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 185, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 186, "Yamaha Pa1" }, - { 187, "\304\340" }, - { 188, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 189, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 190, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 191, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 192, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 193, "\355\345 \363\344\340\353\356\361\374\n" }, - { 194, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 195, "~\304~\356\341. \350\343\360\363..." }, - { 196, "\316~\362~\354\345\355\340" }, - { 197, "~\307~\340\352\360\373\362\374" }, - { 198, "\310\347~\354~. \350\343\360\363..." }, - { 199, "~\317~\356\354\356\371\374" }, - { 200, "~\312~\353\340\342\350\370\350" }, - { 201, "~\307~\340\343\360\363\347\350\362\374" }, - { 202, "~\307~\340\343\360...." }, - { 203, "~\321~\353\345\344" }, - { 204, "~O~K" }, - { 205, "~\316~\357\366\350\350" }, - { 206, "~\316~\357\366\350\350..." }, - { 207, "~\317~\360\345\344" }, - { 208, "~\302~\373\365\356\344" }, - { 209, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 210, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 211, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 212, "~\307~\340\357\350\361\340\362\374" }, - { 213, "\317~\363~\361\352" }, + { 14, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, + { 15, "\316 \357\360\356\343\360\340\354\354\345..." }, + { 16, "AdLib" }, + { 17, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 18, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 19, "\315\356\342. \350\343\360\340..." }, + { 20, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 21, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 23, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 24, "Atars ST MIDI" }, + { 25, "\300\363\344\350\356" }, + { 26, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 27, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 28, "\302\361\270" }, + { 29, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 30, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 31, "C2(\361\356\341\360\340\355 " }, + { 32, "CAMD" }, + { 33, "\316\362\354\345\355\340" }, + { 34, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 35, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 36, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 37, "\316\362\354\345\362\374\362\345 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 38, "\302\373\341\360\340\362\374" }, + { 39, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 40, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 41, "\307\340\352\360\373\362\374" }, + { 42, "CoreAudio" }, + { 43, "CoreMIDI" }, + { 44, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 45, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 46, "Creative Music System" }, + { 47, "DMedia" }, + { 48, "\304\340\362\340: " }, + { 49, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 50, "\323\344\340\353\350\362\374" }, + { 51, "\301\345\347 \343\360\340\364\350\352\350" }, + { 52, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 53, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 54, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 55, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 56, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 57, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 58, "\310\347\354. \350\343\360\363..." }, + { 59, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 60, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 61, "English" }, + { 62, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 63, "\304\356\357. \357\363\362\374:" }, + { 64, "FM Towns" }, + { 65, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 66, "FluidSynth" }, + { 67, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 68, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 69, "\303\360\364" }, + { 70, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 71, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 72, "\310\343\360\340" }, + { 73, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 74, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 75, "\317\363\362\374 \352 \350\343\360\345: " }, + { 76, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 77, "\302\342\345\360\365" }, + { 78, "\303\360\340\364\350\352\340" }, + { 79, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 80, "\317\356\354\356\371\374" }, + { 81, "\301\356\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 82, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 83, "IBM PCjr" }, + { 84, "ID:" }, + { 85, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 86, "\312\353\340\342\350\370\350" }, + { 87, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 88, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 89, "\337\347\373\352:" }, + { 90, "\307\340\343\360\363\347\350\362\374" }, + { 91, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 92, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 93, "\307\340\343\360...." }, + { 94, "MIDI" }, + { 95, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 96, "\335\354\363\353\377\366\350\377 MT-32" }, + { 97, "\315\340\347\355\340\367\350\362\374" }, + { 98, "\304\356\341. \354\355\356\343\356..." }, + { 99, "\314\345\355\376" }, + { 100, "\320\340\347\355\356\345" }, + { 101, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 102, "\312\353\350\352 \354\373\370\374\376" }, + { 103, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 104, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 105, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 106, "\315\340\347\342\340\355\350\345:" }, + { 107, "\315\350\352\356\343\344\340" }, + { 108, "\315\345\362" }, + { 109, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 110, "\301\345\347 \354\363\347\373\352\350" }, + { 111, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 112, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 113, "\315\345 \347\340\344\340\355" }, + { 114, "OK" }, + { 115, "\316\357\366\350\350" }, + { 116, "\316\357\366\350\350..." }, + { 117, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 118, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 119, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 120, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 121, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 122, "PC \361\357\350\352\345\360" }, + { 123, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 124, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 125, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 126, "\317\363\362\350" }, + { 127, "\317\340\363\347\340" }, + { 128, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 129, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 130, "\317\353\340\362\364\356\360\354\340:" }, + { 131, "\302\360\345\354\377 \350\343\360\373: " }, + { 132, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 133, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 134, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 135, "\302\373\365\356\344" }, + { 136, "\302\373\365\356\344 \350\347 ScummVM" }, + { 137, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 138, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 139, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 140, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 141, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 142, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 143, "\317\360\356\344\356\353\346\350\362\374" }, + { 144, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 145, "SEQ" }, + { 146, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 147, "\307\340\357\350\361\340\362\374" }, + { 148, "\317\363\362\374 \361\356\365\360.: " }, + { 149, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 150, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 151, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 152, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 153, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 154, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 155, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 156, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 157, "\317\356\350\361\352:" }, + { 158, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 159, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 160, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 161, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 162, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 163, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 164, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 165, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 166, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 167, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 168, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\363\353\374\347\363\345\354\373\351 \344\353\377 \350\343\360\373 \342 \361\356\365\360\340\355\345\355\350\377 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 169, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \357\360\356\350\343\360\373\342\340\362\374 \360\345\367\374" }, + { 170, "\317\360\356\357\363\361\362\350\362\374" }, + { 171, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 172, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 173, "SoundFont:" }, + { 174, "\316\347\342" }, + { 175, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 176, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 177, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 178, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 179, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 180, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 181, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 182, "\316\347\342\363\367\352\340" }, + { 183, "\307\342\363\352 \350 \361\363\341." }, + { 184, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 185, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 186, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 187, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 188, "\317\363\361\352" }, + { 189, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 190, "\321\363\341" }, + { 191, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 192, "\321\363\341\362\350\362\360\373" }, + { 193, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 194, "Tapware Zodiac" }, + { 195, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 196, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 197, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 198, "\322\345\354\340:" }, + { 199, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 200, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 201, "TiMidity" }, + { 202, "\302\360\345\354\377: " }, + { 203, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 204, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 205, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 206, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 207, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 208, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 209, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 210, "\303\360\356\354\352\356\361\362\374" }, + { 211, "Windows MIDI" }, + { 212, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 213, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 214, "Yamaha Pa1" }, + { 215, "\304\340" }, + { 216, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 217, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 218, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 219, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 220, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 221, "\355\345 \363\344\340\353\356\361\374\n" }, + { 222, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 223, "~\304~\356\341. \350\343\360\363..." }, + { 224, "\316~\362~\354\345\355\340" }, + { 225, "~\307~\340\352\360\373\362\374" }, + { 226, "\310\347~\354~. \350\343\360\363..." }, + { 227, "~\317~\356\354\356\371\374" }, + { 228, "~\312~\353\340\342\350\370\350" }, + { 229, "~\307~\340\343\360\363\347\350\362\374" }, + { 230, "~\307~\340\343\360...." }, + { 231, "~\321~\353\345\344" }, + { 232, "~O~K" }, + { 233, "~\316~\357\366\350\350" }, + { 234, "~\316~\357\366\350\350..." }, + { 235, "~\317~\360\345\344" }, + { 236, "~\302~\373\365\356\344" }, + { 237, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 238, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 239, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 240, "~\307~\340\357\350\361\340\362\374" }, + { 241, "\317~\363~\361\352" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 18:43+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 19:52+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 11, "" }, - { 15, "Hang" }, - { 16, "AdLib vezet :" }, - { 19, "Aspect adag korrekci\363" }, - { 23, "Hang" }, - { 24, "Automatikus ment\351s:" }, - { 37, "Hang" }, - { 43, "" }, - { 53, "K\351pess\351 Roland GS Mode" }, - { 57, "Extra \332tvonal:" }, - { 61, "Teljes k\351perny s m\363d:" }, - { 63, "Lek\351pez eszk\366z GUI:" }, - { 67, "Extra \332tvonal:" }, - { 70, "Grafik\341val" }, - { 71, "Grafikus m\363d:" }, - { 77, "Kulcsok" }, - { 83, "MIDI nyeres\351g:" }, - { 89, "Vegyes AdLib/MIDI m\363d" }, - { 91, "Zenei vezet :" }, - { 92, "Zene mennyis\351g:" }, - { 93, "Muta \326sszes" }, - { 95, "Soha" }, - { 96, "Semmi" }, - { 101, "Semmi" }, - { 102, "Igen" }, - { 105, "Kimeneti teljes\355tm\351ny:" }, - { 114, "\326sv\351nyek" }, - { 115, "\326sv\351nyek" }, - { 127, "Renderel\351si m\363d:" }, - { 131, "SFX mennyis\351ge" }, - { 133, "Extra \332tvonal:" }, - { 157, "Csak a besz\351d" }, - { 158, "Besz\351d s Feliratok" }, - { 159, "Csak a besz\351d" }, - { 160, "Besz\351d \351s a Feliratok" }, - { 161, "Besz\351d mennyis\351g:" }, - { 165, "Felirat sebess\351g:" }, - { 166, "Csak feliratok" }, - { 167, "Csak feliratok" }, - { 169, "Sz\366veg \351s besz\351d:" }, - { 172, "T\351ma:" }, - { 176, "T\351ma:" }, - { 177, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 182, "Volumene" }, - { 189, "10 percenk\351nt" }, - { 190, "15 percenk\351nt" }, - { 191, "30 percenk\351nt" }, - { 192, "5 percenk\351nt" }, - { 200, "Kulcsok" }, - { 204, "Igen" }, + { 16, "Hang" }, + { 17, "AdLib vezet :" }, + { 21, "Aspect adag korrekci\363" }, + { 25, "Hang" }, + { 26, "Automatikus ment\351s:" }, + { 42, "Hang" }, + { 49, "" }, + { 59, "K\351pess\351 Roland GS Mode" }, + { 63, "Extra \332tvonal:" }, + { 68, "Teljes k\351perny s m\363d:" }, + { 71, "Lek\351pez eszk\366z GUI:" }, + { 75, "Extra \332tvonal:" }, + { 78, "Grafik\341val" }, + { 79, "Grafikus m\363d:" }, + { 86, "Kulcsok" }, + { 95, "MIDI nyeres\351g:" }, + { 101, "Vegyes AdLib/MIDI m\363d" }, + { 103, "Zenei vezet :" }, + { 104, "Zene mennyis\351g:" }, + { 105, "Muta \326sszes" }, + { 107, "Soha" }, + { 108, "Semmi" }, + { 113, "Semmi" }, + { 114, "Igen" }, + { 117, "Kimeneti teljes\355tm\351ny:" }, + { 126, "\326sv\351nyek" }, + { 127, "\326sv\351nyek" }, + { 142, "Renderel\351si m\363d:" }, + { 146, "SFX mennyis\351ge" }, + { 148, "Extra \332tvonal:" }, + { 182, "Csak a besz\351d" }, + { 183, "Besz\351d s Feliratok" }, + { 184, "Csak a besz\351d" }, + { 185, "Besz\351d \351s a Feliratok" }, + { 186, "Besz\351d mennyis\351g:" }, + { 191, "Felirat sebess\351g:" }, + { 192, "Csak feliratok" }, + { 193, "Csak feliratok" }, + { 195, "Sz\366veg \351s besz\351d:" }, + { 198, "T\351ma:" }, + { 202, "T\351ma:" }, + { 203, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 210, "Volumene" }, + { 217, "10 percenk\351nt" }, + { 218, "15 percenk\351nt" }, + { 219, "30 percenk\351nt" }, + { 220, "5 percenk\351nt" }, + { 228, "Kulcsok" }, + { 232, "Igen" }, { -1, NULL } }; diff --git a/po/hu_HU.po b/po/hu_HU.po index 1f4c7171ba..8301f50a11 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 18:43+0300\n" +"POT-Creation-Date: 2010-06-12 19:52+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -879,12 +879,12 @@ msgstr "" msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 +#: gui/options.cpp:677 gui/options.cpp:683 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:678 +#: gui/options.cpp:678 gui/options.cpp:684 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" @@ -916,3 +916,124 @@ msgstr "" #: gui/launcher.cpp:529 gui/options.cpp:647 msgid "Clear value" msgstr "" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" + +#: gui/launcher.cpp:191 gui/launcher.cpp:192 +msgid "Platform the game was originally designed for" +msgstr "" + +#: gui/launcher.cpp:253 gui/launcher.cpp:254 +msgid "Specifies path to additional data used the game" +msgstr "" + +#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 +#: gui/options.cpp:796 +msgid "Specifies where your savegames are put" +msgstr "" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "" + +#: gui/options.cpp:591 gui/options.cpp:592 +msgid "Special dithering modes supported by some games" +msgstr "" + +#: gui/options.cpp:604 +msgid "Correct aspect ratio for 320x200 games" +msgstr "" + +#: gui/options.cpp:611 gui/options.cpp:612 +msgid "Specifies output sound device or sound emulator" +msgstr "" + +#: gui/options.cpp:622 gui/options.cpp:623 +msgid "AdLib is used for music in many games" +msgstr "" + +#: gui/options.cpp:633 gui/options.cpp:634 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" + +#: gui/options.cpp:645 gui/options.cpp:646 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" + +#: gui/options.cpp:650 +msgid "Use both MIDI and AdLib sound generation" +msgstr "" + +#: gui/options.cpp:653 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" + +#: gui/options.cpp:656 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" + +#: gui/options.cpp:685 +msgid "Show subtitles and play speech" +msgstr "" + +#: gui/options.cpp:711 gui/options.cpp:712 +msgid "Special sound effects volume" +msgstr "" + +#: gui/options.cpp:801 gui/options.cpp:802 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" + +#: gui/options.cpp:837 +msgid "GUI Language:" +msgstr "" + +#: gui/options.cpp:837 +msgid "Language of ScummVM GUI" +msgstr "" + +#: gui/options.cpp:612 gui/options.cpp:611 +msgid "Specifies output sound device or sound card emulator" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index dea76ac03e..6349f601d2 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 18:43+0300\n" +"POT-Creation-Date: 2010-06-12 19:52+0300\n" "PO-Revision-Date: 2010-06-08 08:52-0100\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -874,11 +874,11 @@ msgstr "~ msgid "~C~lose" msgstr "~Ç~àêðûòü" -#: gui/options.cpp:677 +#: gui/options.cpp:677 gui/options.cpp:683 msgid "Speech" msgstr "Îçâó÷êà" -#: gui/options.cpp:678 +#: gui/options.cpp:678 gui/options.cpp:684 msgid "Subtitles" msgstr "Ñóáòèòðû" @@ -909,3 +909,137 @@ msgstr " #: gui/launcher.cpp:529 gui/options.cpp:647 msgid "Clear value" msgstr "Î÷èñòèòü çíà÷åíèå" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Êîðîòêèé èäåíòèôèêàòîð, èñïóëüçóåìûé äëÿ èãðû â ñîõðàíåíèÿ è äëÿ çàïóñêà èç " +"êîìàíäíîé ñòðîêè" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Ïîëíîå íàçâàíèå èãðû" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " +"ðóññêóþ" + +#: gui/launcher.cpp:191 gui/launcher.cpp:192 +msgid "Platform the game was originally designed for" +msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" + +#: gui/launcher.cpp:253 gui/launcher.cpp:254 +msgid "Specifies path to additional data used the game" +msgstr "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ äëÿ èãðû" + +#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 +#: gui/options.cpp:796 +msgid "Specifies where your savegames are put" +msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "Âûõîä èç ScummVM" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "Î ïðîãðàììå ScummVM" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "Èçìåíèòü ãëîáàëüíûå îïöèè ScummVM" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Çàïóñòèòü âûáðàííóþ èãðó" + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "Çàãðóçèòü ñîõðíåíèå äëÿ âûáðàííîé èãðû" + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "Èçìåíèòü îïöèè èãðû" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Óäàëèòü èãðó èç ñïèñêà. Íå óäàëÿåò èãðó ñ æåñòêîãî äèñêà" + +#: gui/options.cpp:591 gui/options.cpp:592 +msgid "Special dithering modes supported by some games" +msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" + +#: gui/options.cpp:604 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" + +#: gui/options.cpp:611 gui/options.cpp:612 +msgid "Specifies output sound device or sound emulator" +msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" + +#: gui/options.cpp:622 gui/options.cpp:623 +msgid "AdLib is used for music in many games" +msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" + +#: gui/options.cpp:633 gui/options.cpp:634 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Áîëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " +"ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" + +#: gui/options.cpp:645 gui/options.cpp:646 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" +"SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " +"Timidity" + +#: gui/options.cpp:650 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" + +#: gui/options.cpp:653 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Îòìåòüòå ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû õîòèòå " +"åãî èñïîëüçîâàòü" + +#: gui/options.cpp:656 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" + +#: gui/options.cpp:685 +msgid "Show subtitles and play speech" +msgstr "Ïîêàçûâàòü ñóáòèòðû è ïðîèãðûâàòü ðå÷ü" + +#: gui/options.cpp:711 gui/options.cpp:712 +msgid "Special sound effects volume" +msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" + +#: gui/options.cpp:801 gui/options.cpp:802 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " +"ëèáî ScummVM" + +#: gui/options.cpp:837 +msgid "GUI Language:" +msgstr "ßçûê èíòåðôåéñà:" + +#: gui/options.cpp:837 +msgid "Language of ScummVM GUI" +msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" + +#: gui/options.cpp:612 gui/options.cpp:611 +msgid "Specifies output sound device or sound card emulator" +msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" diff --git a/po/scummvm.pot b/po/scummvm.pot index 100e32ec72..7c6675cd2a 100755 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 18:43+0300\n" +"POT-Creation-Date: 2010-06-12 19:52+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -869,11 +869,11 @@ msgstr "" msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 +#: gui/options.cpp:677 gui/options.cpp:683 msgid "Speech" msgstr "" -#: gui/options.cpp:678 +#: gui/options.cpp:678 gui/options.cpp:684 msgid "Subtitles" msgstr "" @@ -904,3 +904,124 @@ msgstr "" #: gui/launcher.cpp:529 gui/options.cpp:647 msgid "Clear value" msgstr "" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" + +#: gui/launcher.cpp:191 gui/launcher.cpp:192 +msgid "Platform the game was originally designed for" +msgstr "" + +#: gui/launcher.cpp:253 gui/launcher.cpp:254 +msgid "Specifies path to additional data used the game" +msgstr "" + +#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 +#: gui/options.cpp:796 +msgid "Specifies where your savegames are put" +msgstr "" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "" + +#: gui/options.cpp:591 gui/options.cpp:592 +msgid "Special dithering modes supported by some games" +msgstr "" + +#: gui/options.cpp:604 +msgid "Correct aspect ratio for 320x200 games" +msgstr "" + +#: gui/options.cpp:611 gui/options.cpp:612 +msgid "Specifies output sound device or sound emulator" +msgstr "" + +#: gui/options.cpp:622 gui/options.cpp:623 +msgid "AdLib is used for music in many games" +msgstr "" + +#: gui/options.cpp:633 gui/options.cpp:634 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" + +#: gui/options.cpp:645 gui/options.cpp:646 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" + +#: gui/options.cpp:650 +msgid "Use both MIDI and AdLib sound generation" +msgstr "" + +#: gui/options.cpp:653 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" + +#: gui/options.cpp:656 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" + +#: gui/options.cpp:685 +msgid "Show subtitles and play speech" +msgstr "" + +#: gui/options.cpp:711 gui/options.cpp:712 +msgid "Special sound effects volume" +msgstr "" + +#: gui/options.cpp:801 gui/options.cpp:802 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" + +#: gui/options.cpp:837 +msgid "GUI Language:" +msgstr "" + +#: gui/options.cpp:837 +msgid "Language of ScummVM GUI" +msgstr "" + +#: gui/options.cpp:612 gui/options.cpp:611 +msgid "Specifies output sound device or sound card emulator" +msgstr "" -- cgit v1.2.3 From eef983c2c6eec26c29d032818a838c563e0a0b98 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:55:07 +0000 Subject: AGI: enable MIDI in options since now there are ways to play it. svn-id: r49781 --- engines/agi/detection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index a809d24467..aa4d368fca 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -145,7 +145,7 @@ static const ADParams detectionParams = { // Flags 0, // Additional GUI options (for every game} - Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, + Common::GUIO_NOSPEECH, // Maximum directory depth 1 }; -- cgit v1.2.3 From 2bcafcb02dd406a36fd0a11c6b0df742840a9a7e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:55:31 +0000 Subject: Sound: add PCJR as a pseudodriver. Since AGI distinguishes between PCSPK and PCJR/Tandy, make it as a pseudodriver. svn-id: r49782 --- engines/agi/agi.cpp | 2 +- sound/mididrv.cpp | 2 +- sound/mididrv.h | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 2f87d7b8ef..21b28fd445 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -583,7 +583,7 @@ void AgiEngine::initialize() { } else if (getPlatform() == Common::kPlatformCoCo3) { _soundemu = SOUND_EMU_COCO3; } else { - switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB | MDT_MIDI)) { + switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI)) { case MD_PCSPK: _soundemu = SOUND_EMU_PC; break; diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index e34f5a9705..f7198056b4 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -87,7 +87,7 @@ static const MidiDriverDescription s_musicDrivers[] = { // The flags for the "adlib" driver indicates that it can do AdLib and MIDI. {"adlib", _s("AdLib"), MD_ADLIB, MDT_ADLIB}, {"pcspk", _s("PC Speaker"), MD_PCSPK, MDT_PCSPK}, - {"pcjr", _s("IBM PCjr"), MD_PCJR, MDT_PCSPK}, + {"pcjr", _s("IBM PCjr"), MD_PCJR, MDT_PCSPK | MDT_PCJR}, {"cms", _s("Creative Music System"), MD_CMS, MDT_CMS}, {"towns", _s("FM Towns"), MD_TOWNS, MDT_TOWNS}, #if defined(UNIX) diff --git a/sound/mididrv.h b/sound/mididrv.h index d7e89dd9ca..69cbb7ab65 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -100,10 +100,11 @@ enum MidiDriverFlags { MDT_NONE = 0, MDT_PCSPK = 1 << 0, // PC Speaker: Maps to MD_PCSPK and MD_PCJR MDT_CMS = 1 << 1, // Creative Music System / Gameblaster: Maps to MD_CMS - MDT_ADLIB = 1 << 2, // AdLib: Maps to MD_ADLIB - MDT_TOWNS = 1 << 3, // FM-TOWNS: Maps to MD_TOWNS - MDT_MIDI = 1 << 4, // Real MIDI - MDT_PREFER_MIDI = 1 << 5 // Real MIDI output is preferred + MDT_PCJR = 1 << 2, // Tandy/PC Junior driver + MDT_ADLIB = 1 << 3, // AdLib: Maps to MD_ADLIB + MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MD_TOWNS + MDT_MIDI = 1 << 5, // Real MIDI + MDT_PREFER_MIDI = 1 << 6 // Real MIDI output is preferred }; /** -- cgit v1.2.3 From 67bc7115804b6f256f776fc761f7fffffa901c31 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:56:12 +0000 Subject: GUI: Implement MIDI drivers as GUI options. Proper version of patch #2988641: "GSoC: Select drivers in GUI based on output types". So far only SCUMM engine supports this feature. svn-id: r49783 --- common/util.cpp | 18 +++++++++++++----- common/util.h | 13 ++++++++++--- engines/scumm/detection.cpp | 2 +- gui/options.cpp | 7 ++++++- sound/mididrv.cpp | 21 +++++++++++++++++++++ sound/mididrv.h | 2 ++ 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/common/util.cpp b/common/util.cpp index 742eb0035d..895bcebef7 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -293,12 +293,20 @@ const struct GameOpt { uint32 option; const char *desc; } g_gameOptions[] = { - { GUIO_NOSUBTITLES, "sndNoSubs" }, - { GUIO_NOMUSIC, "sndNoMusic" }, - { GUIO_NOSPEECH, "sndNoSpeech" }, - { GUIO_NOSFX, "sndNoSFX" }, - { GUIO_NOMIDI, "sndNoMIDI" }, + { GUIO_NOSUBTITLES, "sndNoSubs" }, + { GUIO_NOMUSIC, "sndNoMusic" }, + { GUIO_NOSPEECH, "sndNoSpeech" }, + { GUIO_NOSFX, "sndNoSFX" }, + { GUIO_NOMIDI, "sndNoMIDI" }, { GUIO_NOLAUNCHLOAD, "launchNoLoad" }, + + { GUIO_MIDIPCSPK, "midiPCSpk" }, + { GUIO_MIDICMS, "midiCMS" }, + { GUIO_MIDIPCJR, "midiPCJr" }, + { GUIO_MIDIADLIB, "midiAdLib" }, + { GUIO_MIDITOWNS, "midiTowns" }, + { GUIO_MIDI, "midiMidi" }, + { GUIO_NONE, 0 } }; diff --git a/common/util.h b/common/util.h index 0b7a44f5b3..62c8f0d1fb 100644 --- a/common/util.h +++ b/common/util.h @@ -215,9 +215,16 @@ enum GameGUIOption { GUIO_NOSUBTITLES = (1 << 0), GUIO_NOMUSIC = (1 << 1), GUIO_NOSPEECH = (1 << 2), - GUIO_NOSFX = (1 << 3), - GUIO_NOMIDI = (1 << 4), - GUIO_NOLAUNCHLOAD = (1 << 5) + GUIO_NOSFX = (1 << 3), + GUIO_NOMIDI = (1 << 4), + GUIO_NOLAUNCHLOAD = (1 << 5), + + GUIO_MIDIPCSPK = (1 << 6), + GUIO_MIDICMS = (1 << 7), + GUIO_MIDIPCJR = (1 << 8), + GUIO_MIDIADLIB = (1 << 9), + GUIO_MIDITOWNS = (1 << 10), + GUIO_MIDI = (1 << 11) }; bool checkGameGUIOption(GameGUIOption option, const String &str); diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index d8b758c8b2..667dab91de 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -883,7 +883,7 @@ GameList ScummMetaEngine::detectGames(const Common::FSList &fslist) const { } } - dg.setGUIOptions(x->game.guioptions); + dg.setGUIOptions(x->game.guioptions | MidiDriver::midiDriverFlags2GUIO(x->game.midi)); detectedGames.push_back(dg); } diff --git a/gui/options.cpp b/gui/options.cpp index ad32bfd4e3..62262bf782 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -613,8 +613,13 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); + uint32 allFlags = MidiDriver::midiDriverFlags2GUIO(~0ul); + while (md->name) { - _midiPopUp->appendEntry(_(md->description), md->id); + if (_domain == Common::ConfigManager::kApplicationDomain || // global dialog + !(_guioptions & allFlags) || // No flags are specified + _guioptions & (MidiDriver::midiDriverFlags2GUIO(md->flags))) // flag is present + _midiPopUp->appendEntry(_(md->description), md->id); md++; } diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index f7198056b4..c6e208ae47 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -31,6 +31,27 @@ #include "common/util.h" #include "sound/mididrv.h" +static const uint32 GUIOMapping[] = { + MDT_PCSPK, Common::GUIO_MIDIPCSPK, + MDT_CMS, Common::GUIO_MIDICMS, + MDT_PCJR, Common::GUIO_MIDIPCJR, + MDT_ADLIB, Common::GUIO_MIDIADLIB, + MDT_TOWNS, Common::GUIO_MIDITOWNS, + MDT_MIDI, Common::GUIO_MIDI, + 0, 0 +}; + +uint32 MidiDriver::midiDriverFlags2GUIO(uint32 flags) { + uint32 res = 0; + + for (int i = 0; GUIOMapping[i] || GUIOMapping[i + 1]; i += 2) { + if (flags & GUIOMapping[i]) + res |= GUIOMapping[i + 1]; + } + + return res; +} + /** Internal list of all available 'midi' drivers. */ static const MidiDriverDescription s_musicDrivers[] = { diff --git a/sound/mididrv.h b/sound/mididrv.h index 69cbb7ab65..2931e2571e 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -134,6 +134,8 @@ public: /** Get the id of the music driver matching the given driver name, or MD_AUTO if there is no match. */ static MidiDriverType parseMusicDriver(const Common::String &str); + static uint32 midiDriverFlags2GUIO(uint32 flags); + /** * Get a list of all available MidiDriver types. * @return list of all available midi drivers, terminated by a zero entry -- cgit v1.2.3 From dc57c684547bab8368d05a3822d1848d62211dd0 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:56:30 +0000 Subject: GUI: Fix crash. svn-id: r49784 --- gui/widget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/widget.cpp b/gui/widget.cpp index 6b5095f89e..27cae0123d 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -260,6 +260,9 @@ void Tooltip::setVisible(bool state) { return; if (state) { + if (!_guiManager->getTopDialog()) + return; + Widget *wdg = _guiManager->getTopDialog()->findWidget(_mouseX, _mouseY); if (!wdg) -- cgit v1.2.3 From 8dcc49251f08492968ddfcbb825bfe0a17d0747b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:56:46 +0000 Subject: GUI: Disable AdLib controls if game does not support it. svn-id: r49785 --- gui/options.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 62262bf782..b00886b40e 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -493,8 +493,18 @@ void OptionsDialog::setAudioSettingsState(bool enabled) { _midiPopUpDesc->setEnabled(enabled); _midiPopUp->setEnabled(enabled); - _oplPopUpDesc->setEnabled(enabled); - _oplPopUp->setEnabled(enabled); + + uint32 allFlags = MidiDriver::midiDriverFlags2GUIO(~0ul); + + if (_domain != Common::ConfigManager::kApplicationDomain && // global dialog + (_guioptions & allFlags) && // No flags are specified + !(_guioptions & Common::GUIO_MIDIADLIB)) { + _oplPopUpDesc->setEnabled(false); + _oplPopUp->setEnabled(false); + } else { + _oplPopUpDesc->setEnabled(enabled); + _oplPopUp->setEnabled(enabled); + } _outputRatePopUpDesc->setEnabled(enabled); _outputRatePopUp->setEnabled(enabled); } -- cgit v1.2.3 From 01bc5dda944f121187a4499f03d3a3814741f093 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:57:28 +0000 Subject: GUI: Implemented Languages as GUI options. SCUMM and AdvancedDetector support this feature. svn-id: r49786 --- common/util.cpp | 21 +++++++++++++++++++-- common/util.h | 4 +++- engines/advancedDetector.cpp | 1 + engines/game.cpp | 4 ++++ engines/game.h | 1 + engines/scumm/detection.cpp | 1 + gui/PopUpWidget.h | 1 + gui/launcher.cpp | 20 ++++++++++---------- gui/options.cpp | 12 ++++++++---- gui/options.h | 1 + 10 files changed, 49 insertions(+), 17 deletions(-) diff --git a/common/util.cpp b/common/util.cpp index 895bcebef7..b8bd327a0a 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -322,9 +322,26 @@ bool checkGameGUIOption(GameGUIOption option, const String &str) { return false; } +bool checkGameGUIOptionLanguage(Language lang, const String &str) { + if (!str.contains("lang_")) // If no languages are specified + return true; + + if (str.contains(getGameGUIOptionsDescriptionLanguage(lang))) + return true; + + return false; +} + +const String getGameGUIOptionsDescriptionLanguage(Language lang) { + if (lang == UNK_LANG) + return ""; + + return String(String("lang_") + getLanguageDescription(lang)); +} + uint32 parseGameGUIOptions(const String &str) { uint32 res = 0; - + for (int i = 0; g_gameOptions[i].desc; i++) if (str.contains(g_gameOptions[i].desc)) res |= g_gameOptions[i].option; @@ -332,7 +349,7 @@ uint32 parseGameGUIOptions(const String &str) { return res; } -String getGameGUIOptionsDescription(uint32 options) { +const String getGameGUIOptionsDescription(uint32 options) { String res = ""; for (int i = 0; g_gameOptions[i].desc; i++) diff --git a/common/util.h b/common/util.h index 62c8f0d1fb..71456353c7 100644 --- a/common/util.h +++ b/common/util.h @@ -228,8 +228,10 @@ enum GameGUIOption { }; bool checkGameGUIOption(GameGUIOption option, const String &str); +bool checkGameGUIOptionLanguage(Language lang, const String &str); uint32 parseGameGUIOptions(const String &str); -String getGameGUIOptionsDescription(uint32 options); +const String getGameGUIOptionsDescription(uint32 options); +const String getGameGUIOptionsDescriptionLanguage(Language lang); /** * Updates the GUI options of the current config manager diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 061eec2faf..ee0c5c7c62 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -208,6 +208,7 @@ static void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription * desc["extra"] = realDesc->extra; desc.setGUIOptions(realDesc->guioptions | params.guioptions); + desc.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(realDesc->language)); } GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const { diff --git a/engines/game.cpp b/engines/game.cpp index c7f26019d6..dea6d37485 100644 --- a/engines/game.cpp +++ b/engines/game.cpp @@ -73,6 +73,10 @@ void GameDescriptor::setGUIOptions(uint32 guioptions) { erase("guioptions"); } +void GameDescriptor::appendGUIOptions(const Common::String &str) { + setVal("guioptions", getVal("guioptions", "") + " " + str); +} + void GameDescriptor::updateDesc(const char *extra) { // TODO: The format used here (LANG/PLATFORM/EXTRA) is not set in stone. // We may want to change the order (PLATFORM/EXTRA/LANG, anybody?), or diff --git a/engines/game.h b/engines/game.h index 49136ecf5a..b125421ff6 100644 --- a/engines/game.h +++ b/engines/game.h @@ -83,6 +83,7 @@ public: void updateDesc(const char *extra = 0); void setGUIOptions(uint32 options); + void appendGUIOptions(const Common::String &str); Common::String &gameid() { return getVal("gameid"); } Common::String &description() { return getVal("description"); } diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 667dab91de..21da732064 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -884,6 +884,7 @@ GameList ScummMetaEngine::detectGames(const Common::FSList &fslist) const { } dg.setGUIOptions(x->game.guioptions | MidiDriver::midiDriverFlags2GUIO(x->game.midi)); + dg.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(x->language)); detectedGames.push_back(dg); } diff --git a/gui/PopUpWidget.h b/gui/PopUpWidget.h index d1c89e45ae..f2c1728b52 100644 --- a/gui/PopUpWidget.h +++ b/gui/PopUpWidget.h @@ -66,6 +66,7 @@ public: void appendEntry(const String &entry, uint32 tag = (uint32)-1); void clearEntries(); + int numEntries() { return _entries.size(); } /** Select the entry at the given index. */ void setSelected(int item); diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 176fb45214..1daf9ffd50 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -180,11 +180,12 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // Language popup _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:"), _("Language of the game. This will not turn your Spanish game version into English")); _langPopUp = new PopUpWidget(tab, "GameOptions_Game.LangPopup", _("Language of the game. This will not turn your Spanish game version into English")); - _langPopUp->appendEntry(_("")); - _langPopUp->appendEntry(""); + _langPopUp->appendEntry(_(""), 0); + _langPopUp->appendEntry("", 0); const Common::LanguageDescription *l = Common::g_languages; for (; l->code; ++l) { - _langPopUp->appendEntry(l->description, l->id); + if (checkGameGUIOptionLanguage(l->id, _guioptionsString)) + _langPopUp->appendEntry(l->description, l->id); } // Platform popup @@ -311,17 +312,16 @@ void EditGameDialog::open() { // TODO: game path - const Common::LanguageDescription *l = Common::g_languages; const Common::Language lang = Common::parseLanguage(ConfMan.get("language", _domain)); - sel = 0; if (ConfMan.hasKey("language", _domain)) { - for (i = 0; l->code; ++l, ++i) { - if (lang == l->id) - sel = i + 2; - } + _langPopUp->setSelectedTag(lang); + } + + if (_langPopUp->numEntries() <= 3) { // If only one language is avaliable + _langPopUpDesc->setEnabled(false); + _langPopUp->setEnabled(false); } - _langPopUp->setSelected(sel); const Common::PlatformDescription *p = Common::g_platforms; diff --git a/gui/options.cpp b/gui/options.cpp index b00886b40e..bee06a4dce 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -126,8 +126,10 @@ void OptionsDialog::init() { // Retrieve game GUI options _guioptions = 0; - if (ConfMan.hasKey("guioptions", _domain)) - _guioptions = parseGameGUIOptions(ConfMan.get("guioptions", _domain)); + if (ConfMan.hasKey("guioptions", _domain)) { + _guioptionsString = ConfMan.get("guioptions", _domain); + _guioptions = parseGameGUIOptions(_guioptionsString); + } } void OptionsDialog::open() { @@ -138,8 +140,10 @@ void OptionsDialog::open() { // Retrieve game GUI options _guioptions = 0; - if (ConfMan.hasKey("guioptions", _domain)) - _guioptions = parseGameGUIOptions(ConfMan.get("guioptions", _domain)); + if (ConfMan.hasKey("guioptions", _domain)) { + _guioptionsString = ConfMan.get("guioptions", _domain); + _guioptions = parseGameGUIOptions(_guioptionsString); + } // Graphic options if (_fullscreenCheckbox) { diff --git a/gui/options.h b/gui/options.h index 48282a7fd7..fab25ebaed 100644 --- a/gui/options.h +++ b/gui/options.h @@ -156,6 +156,7 @@ protected: // Game GUI options // uint32 _guioptions; + Common::String _guioptionsString; }; -- cgit v1.2.3 From 0b83afce03572eb513dd2802a8ad4c0377600f84 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:57:47 +0000 Subject: MOHAWK: Sync with latest GUI changes. svn-id: r49787 --- engines/mohawk/dialogs.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp index c5327dbeea..c09763cbb3 100644 --- a/engines/mohawk/dialogs.cpp +++ b/engines/mohawk/dialogs.cpp @@ -30,6 +30,7 @@ #include "gui/GuiManager.h" #include "common/savefile.h" +#include "common/translation.h" namespace Mohawk { @@ -77,11 +78,11 @@ enum { }; MystOptionsDialog::MystOptionsDialog(MohawkEngine_Myst* vm) : GUI::OptionsDialog("", 120, 120, 360, 200), _vm(vm) { - _zipModeCheckbox = new GUI::CheckboxWidget(this, 15, 10, 300, 15, "Zip Mode Activated", kZipCmd, 'Z'); - _transitionsCheckbox = new GUI::CheckboxWidget(this, 15, 30, 300, 15, "Transitions Enabled", kTransCmd, 'T'); + _zipModeCheckbox = new GUI::CheckboxWidget(this, 15, 10, 300, 15, _("~Z~ip Mode Activated"), 0, kZipCmd); + _transitionsCheckbox = new GUI::CheckboxWidget(this, 15, 30, 300, 15, _("~T~ransitions Enabled"), 0, kTransCmd); - new GUI::ButtonWidget(this, 95, 160, 120, 25, "OK", GUI::kOKCmd, 'O'); - new GUI::ButtonWidget(this, 225, 160, 120, 25, "Cancel", GUI::kCloseCmd, 'C'); + new GUI::ButtonWidget(this, 95, 160, 120, 25, _("~O~K"), 0, GUI::kOKCmd); + new GUI::ButtonWidget(this, 225, 160, 120, 25, _("~C~ancel"), 0, GUI::kCloseCmd); } MystOptionsDialog::~MystOptionsDialog() { @@ -111,11 +112,11 @@ void MystOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, ui } RivenOptionsDialog::RivenOptionsDialog(MohawkEngine_Riven* vm) : GUI::OptionsDialog("", 120, 120, 360, 200), _vm(vm) { - _zipModeCheckbox = new GUI::CheckboxWidget(this, 15, 10, 300, 15, "Zip Mode Activated", kZipCmd, 'Z'); - _waterEffectCheckbox = new GUI::CheckboxWidget(this, 15, 30, 300, 15, "Water Effect Enabled", kWaterCmd, 'W'); + _zipModeCheckbox = new GUI::CheckboxWidget(this, 15, 10, 300, 15, _("~Z~ip Mode Activated"), 0, kZipCmd); + _waterEffectCheckbox = new GUI::CheckboxWidget(this, 15, 30, 300, 15, _("~W~ater Effect Enabled"), 0, kWaterCmd); - new GUI::ButtonWidget(this, 95, 160, 120, 25, "OK", GUI::kOKCmd, 'O'); - new GUI::ButtonWidget(this, 225, 160, 120, 25, "Cancel", GUI::kCloseCmd, 'C'); + new GUI::ButtonWidget(this, 95, 160, 120, 25, _("~O~K"), 0, GUI::kOKCmd); + new GUI::ButtonWidget(this, 225, 160, 120, 25, _("~C~ancel"), 0, GUI::kCloseCmd); } RivenOptionsDialog::~RivenOptionsDialog() { -- cgit v1.2.3 From 44a39ffbc66dbc9f019f041a47aaf9ba5a24d19f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:59:23 +0000 Subject: AdvancedDetector: Add new parameter directoryGlobs. Without this parameter mass detection gave tons of false alarms. Use globbing for narrowing down the depth search. svn-id: r49788 --- engines/advancedDetector.cpp | 19 ++++++++++++++++--- engines/advancedDetector.h | 10 +++++++++- engines/agi/detection.cpp | 4 +++- engines/agos/detection.cpp | 4 +++- engines/cine/detection.cpp | 4 +++- engines/cruise/detection.cpp | 4 +++- engines/draci/detection.cpp | 4 +++- engines/drascula/detection.cpp | 4 +++- engines/gob/detection.cpp | 4 +++- engines/groovie/detection.cpp | 4 +++- engines/kyra/detection.cpp | 4 +++- engines/lure/detection.cpp | 4 +++- engines/m4/detection.cpp | 4 +++- engines/made/detection.cpp | 4 +++- engines/mohawk/detection.cpp | 4 +++- engines/parallaction/detection.cpp | 4 +++- engines/saga/detection.cpp | 4 +++- engines/sci/detection.cpp | 4 +++- engines/teenagent/detection.cpp | 3 ++- engines/tinsel/detection.cpp | 4 +++- engines/touche/detection.cpp | 4 +++- engines/tucker/detection.cpp | 3 ++- 22 files changed, 83 insertions(+), 24 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index ee0c5c7c62..974970ff0f 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -341,7 +341,7 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms); -static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) { +static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth, const char **directoryGlobs) { if (depth <= 0) return; @@ -354,10 +354,23 @@ static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, if (file->isDirectory()) { Common::FSList files; + if (!directoryGlobs) + continue; + + bool matched = false; + for (const char *glob = *directoryGlobs; *glob; glob++) + if (file->getName().matchString(glob, true)) { + matched = true; + break; + } + + if (!matched) + continue; + if (!file->getChildren(files, Common::FSNode::kListAll)) continue; - composeFileHashMap(files, allFiles, depth - 1); + composeFileHashMap(files, allFiles, depth - 1, directoryGlobs); } Common::String tstr = file->getName(); @@ -385,7 +398,7 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p // First we compose a hashmap of all files in fslist. // Includes nifty stuff like removing trailing dots and ignoring case. - composeFileHashMap(fslist, allFiles, (params.depth == 0 ? 1 : params.depth)); + composeFileHashMap(fslist, allFiles, (params.depth == 0 ? 1 : params.depth), params.directoryGlobs); // Check which files are included in some ADGameDescription *and* present // in fslist. Compute MD5s and file sizes for these files. diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index a48dd0c1d2..de4fc3bbf8 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -192,11 +192,19 @@ struct ADParams { uint32 guioptions; /** - * * Maximum depth of directories to look up * If set to 0, the depth is 1 level */ uint32 depth; + + /** + * Case-insensitive list of directory globs which could be used for + * going deeper int directory structure. + * @see String::matchString() method for format description. + * + * @note Last item must be 0 + */ + const char **directoryGlobs; }; diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index aa4d368fca..d1bed5d716 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -147,7 +147,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOSPEECH, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; using namespace Agi; diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp index 9a23dde426..cec2db2c10 100644 --- a/engines/agos/detection.cpp +++ b/engines/agos/detection.cpp @@ -104,7 +104,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOLAUNCHLOAD, // Maximum directory depth - 2 + 2, + // List of directory globs + 0 }; using namespace AGOS; diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index bcc4951140..b92ad8a0a2 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -82,7 +82,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class CineMetaEngine : public AdvancedMetaEngine { diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index 9088b8261e..e43fadf598 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -239,7 +239,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOSPEECH | Common::GUIO_NOMIDI, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class CruiseMetaEngine : public AdvancedMetaEngine { diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index 39834ab5fa..e1025e698a 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -96,7 +96,9 @@ const ADParams detectionParams = { // Global GUI options Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class DraciMetaEngine : public AdvancedMetaEngine { diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp index a0781e0bff..c10222cadd 100644 --- a/engines/drascula/detection.cpp +++ b/engines/drascula/detection.cpp @@ -266,7 +266,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOMIDI, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class DrasculaMetaEngine : public AdvancedMetaEngine { diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp index 3d83f12e39..a1eb8055aa 100644 --- a/engines/gob/detection.cpp +++ b/engines/gob/detection.cpp @@ -109,7 +109,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOLAUNCHLOAD, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class GobMetaEngine : public AdvancedMetaEngine { diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index 1f7156b2fc..b30c2361d2 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -178,7 +178,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOSUBTITLES | Common::GUIO_NOSFX, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index 4ed314934d..f3e6c7c8cc 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -63,7 +63,9 @@ const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class KyraMetaEngine : public AdvancedMetaEngine { diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp index d8c7b483f8..dd2a702e2a 100644 --- a/engines/lure/detection.cpp +++ b/engines/lure/detection.cpp @@ -198,7 +198,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOSPEECH, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class LureMetaEngine : public AdvancedMetaEngine { diff --git a/engines/m4/detection.cpp b/engines/m4/detection.cpp index 80a899f1ac..4b204996f3 100644 --- a/engines/m4/detection.cpp +++ b/engines/m4/detection.cpp @@ -402,7 +402,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOMIDI, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class M4MetaEngine : public AdvancedMetaEngine { diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp index 081bb98006..dd2becd3b8 100644 --- a/engines/made/detection.cpp +++ b/engines/made/detection.cpp @@ -495,7 +495,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class MadeMetaEngine : public AdvancedMetaEngine { diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index a01f4a8759..9c3154a8bd 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -143,7 +143,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game) Common::GUIO_NONE, // Maximum directory depth - 2 + 2, + // List of directory globs + 0 }; class MohawkMetaEngine : public AdvancedMetaEngine { diff --git a/engines/parallaction/detection.cpp b/engines/parallaction/detection.cpp index 2ecaf1c2d6..e00a087923 100644 --- a/engines/parallaction/detection.cpp +++ b/engines/parallaction/detection.cpp @@ -242,7 +242,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NOLAUNCHLOAD, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class ParallactionMetaEngine : public AdvancedMetaEngine { diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index b57b056806..7913291527 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -124,7 +124,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class SagaMetaEngine : public AdvancedMetaEngine { diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index b402f7cc0b..7163c879b1 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -312,7 +312,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class SciMetaEngine : public AdvancedMetaEngine { diff --git a/engines/teenagent/detection.cpp b/engines/teenagent/detection.cpp index 4c61e20b7a..a2dab9658d 100644 --- a/engines/teenagent/detection.cpp +++ b/engines/teenagent/detection.cpp @@ -92,7 +92,8 @@ static const ADParams detectionParams = { 0, 0, Common::GUIO_NONE, - 1 + 1, + 0 }; #define MAX_SAVES 20 diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index c46a93fb38..d6bdad6032 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -97,7 +97,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class TinselMetaEngine : public AdvancedMetaEngine { diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index 72f87a2f3f..f336c2e008 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -136,7 +136,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1 + 1, + // List of directory globs + 0 }; class ToucheMetaEngine : public AdvancedMetaEngine { diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp index 7f88a8ff2f..0a9dec9b46 100644 --- a/engines/tucker/detection.cpp +++ b/engines/tucker/detection.cpp @@ -115,7 +115,8 @@ static const ADParams detectionParams = { 0, 0, Common::GUIO_NONE, - 1 + 1, + 0 }; static const ADGameDescription tuckerDemoGameDescription = { -- cgit v1.2.3 From f2a62bb1f5bdc422eda47b5d673614e02d796035 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 10:59:43 +0000 Subject: MOHAWK: Properly add detection for Riven DVD. svn-id: r49789 --- engines/mohawk/detection.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index 9c3154a8bd..c3a0c17251 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -123,6 +123,13 @@ static const PlainGameDescriptor mohawkGames[] = { #include "mohawk/detection_tables.h" +static const char *directoryGlobs[] = { + "all", + "assets1", + "data", + 0 +}; + static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure (const byte *)Mohawk::gameDescriptions, @@ -145,7 +152,7 @@ static const ADParams detectionParams = { // Maximum directory depth 2, // List of directory globs - 0 + directoryGlobs }; class MohawkMetaEngine : public AdvancedMetaEngine { -- cgit v1.2.3 From 03ed49169c22cf169369ccec005e6e6e6cb129dd Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:00:07 +0000 Subject: AGOS: Readd Simon1 Acorn CD detection. svn-id: r49790 --- engines/agos/detection.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp index cec2db2c10..646e63dacf 100644 --- a/engines/agos/detection.cpp +++ b/engines/agos/detection.cpp @@ -84,6 +84,11 @@ static const PlainGameDescriptor simonGames[] = { #include "agos/detection_tables.h" +static const char *directoryGlobs[] = { + "execute", // Used by Simon1 Acorn CD + 0 +}; + static const ADParams detectionParams = { // Pointer to ADGameDescription or its superset structure (const byte *)AGOS::gameDescriptions, @@ -106,7 +111,7 @@ static const ADParams detectionParams = { // Maximum directory depth 2, // List of directory globs - 0 + directoryGlobs }; using namespace AGOS; -- cgit v1.2.3 From c6d9812270a7ae2fcf68a054a6730c6cfcbfed29 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:00:35 +0000 Subject: DS: sync with recent GUI changes. NOT TESTED. svn-id: r49791 --- backends/platform/ds/arm9/source/dsoptions.cpp | 44 ++++++++++++++------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 9937e81e61..300324a1de 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -31,6 +31,8 @@ #include "touchkeyboard.h" #include "gui/PopUpWidget.h" +#include "common/translation.h" + #define ALLOW_CPU_SCALER namespace DS { @@ -51,26 +53,26 @@ static int confGetInt(Common::String key, int defaultVal) { DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { - new GUI::ButtonWidget(this, 10, 170, 72, 16, "Close", GUI::kCloseCmd, 'C'); - new GUI::ButtonWidget(this, 320 - 10 - 130, 170, 120, 16, "ScummVM Main Menu", 0x40000000, 'M'); + new GUI::ButtonWidget(this, 10, 170, 72, 16, _("~C~lose"), 0, GUI::kCloseCmd); + new GUI::ButtonWidget(this, 320 - 10 - 130, 170, 120, 16, _("ScummVM Main Menu"), 0, 0x40000000, 'M'); _tab = new GUI::TabWidget(this, 10, 5, 300, 230 - 20 - 40 - 20); _tab->addTab("Controls"); - _leftHandedCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 130, 20, "Left handed mode", 0, 'L'); - _indyFightCheckbox = new GUI::CheckboxWidget(_tab, 5, 20, 140, 20, "Indy fight controls", 0, 'I'); - _showCursorCheckbox = new GUI::CheckboxWidget(_tab, 150, 5, 130, 20, "Show mouse cursor", 0, 'T'); - _snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, "Snap to edges", 0, 'T'); + _leftHandedCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 130, 20, _("~L~eft handed mode")); + _indyFightCheckbox = new GUI::CheckboxWidget(_tab, 5, 20, 140, 20, _("~I~ndy fight controls")); + _showCursorCheckbox = new GUI::CheckboxWidget(_tab, 150, 5, 130, 20, _("Show mouse cursor"), 0, 0, 'T'); + _snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, _("Snap to edges"), 0, 0, 'T'); - new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, "Touch X Offset", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, _("Touch X Offset"), Graphics::kTextAlignLeft); _touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, 1); _touchX->setMinValue(-8); _touchX->setMaxValue(+8); _touchX->setValue(0); _touchX->setFlags(GUI::WIDGET_CLEARBG); - new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, "Touch Y Offset", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, _("Touch Y Offset"), Graphics::kTextAlignLeft); _touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, 2); _touchY->setMinValue(-8); _touchY->setMaxValue(+8); @@ -82,10 +84,10 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { new GUI::StaticTextWidget(_tab, 130 - 20, 65, 20, 15, "-8", Graphics::kTextAlignCenter); - _touchPadStyle = new GUI::CheckboxWidget(_tab, 5, 80, 270, 20, "Use laptop trackpad-style cursor control", 0x20000001, 'T'); - _screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, "Tap for left click, double tap right click", 0x20000002, 'T'); + _touchPadStyle = new GUI::CheckboxWidget(_tab, 5, 80, 270, 20, _("Use laptop trackpad-style cursor control"), 0, 0x20000001, 'T'); + _screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, _("Tap for left click, double tap right click"), 0, 0x20000002, 'T'); - _sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, "Sensitivity", Graphics::kTextAlignLeft); + _sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, _("Sensitivity"), Graphics::kTextAlignLeft); _sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, 1); _sensitivity->setMinValue(4); _sensitivity->setMaxValue(16); @@ -94,19 +96,19 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _tab->addTab("Graphics"); - new GUI::StaticTextWidget(_tab, 5, 67, 180, 15, "Initial top screen scale:", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 5, 67, 180, 15, _("Initial top screen scale:"), Graphics::kTextAlignLeft); _100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 82, 80, 20, "100%", 0x30000001, 'T'); _150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 97, 80, 20, "150%", 0x30000002, 'T'); _200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 112, 80, 20, "200%", 0x30000003, 'T'); - new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, "Main screen scaling:", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, _("Main screen scaling:"), Graphics::kTextAlignLeft); - _hardScaler = new GUI::CheckboxWidget(_tab, 5, 20, 270, 20, "Hardware scale (fast, but low quality)", 0x10000001, 'T'); - _cpuScaler = new GUI::CheckboxWidget(_tab, 5, 35, 270, 20, "Software scale (good quality, but slower)", 0x10000002, 'S'); - _unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, "Unscaled (you must scroll left and right)", 0x10000003, 'S'); + _hardScaler = new GUI::CheckboxWidget(_tab, 5, 20, 270, 20, _("Hardware scale (fast, but low quality)"), 0, 0x10000001, 'T'); + _cpuScaler = new GUI::CheckboxWidget(_tab, 5, 35, 270, 20, _("Software scale (good quality, but slower)"), 0, 0x10000002, 'S'); + _unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, _("Unscaled (you must scroll left and right)"), 0, 0x10000003, 'S'); - new GUI::StaticTextWidget(_tab, 5, 125, 110, 15, "Brightness:", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 5, 125, 110, 15, _("Brightness:"), Graphics::kTextAlignLeft); _gammaCorrection = new GUI::SliderWidget(_tab, 130, 120, 130, 12, 1); _gammaCorrection->setMinValue(0); _gammaCorrection->setMaxValue(8); @@ -116,8 +118,8 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _tab->addTab("General"); - _highQualityAudioCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 250, 20, "High quality audio (slower) (reboot)", 0, 'T'); - _disablePowerOff = new GUI::CheckboxWidget(_tab, 5, 20, 200, 20, "Disable power off", 0, 'T'); + _highQualityAudioCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 250, 20, _("High quality audio (slower) (reboot)"), 0, 0, 'T'); + _disablePowerOff = new GUI::CheckboxWidget(_tab, 5, 20, 200, 20, _("Disable power off"), 0, 0, 'T'); _tab->setActiveTab(0); @@ -125,7 +127,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { #ifdef DS_SCUMM_BUILD if (!DS::isGBAMPAvailable()) { -// addButton(this, 100, 140, "Delete Save", 'dels', 'D'); +// addButton(this, 100, 140, "Delete Save", 0, 'dels', 'D'); } #endif @@ -133,7 +135,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { //#ifdef ALLOW_CPU_SCALER -// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T'); +// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 0, 'T'); //#endif -- cgit v1.2.3 From d6d7cf3edfa0b69f3ad67c032ca4ec15229126bd Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:00:57 +0000 Subject: IPhone: sync with recent GUI changes. NOT TESTED. svn-id: r49792 --- backends/platform/iphone/osys_events.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backends/platform/iphone/osys_events.cpp b/backends/platform/iphone/osys_events.cpp index 72408be89a..c1c7ffdc0c 100644 --- a/backends/platform/iphone/osys_events.cpp +++ b/backends/platform/iphone/osys_events.cpp @@ -24,6 +24,7 @@ */ #include "gui/message.h" +#include "common/translation.h" #include "osys_main.h" @@ -335,9 +336,9 @@ bool OSystem_IPHONE::handleEvent_mouseSecondDragged(Common::Event &event, int x, _touchpadModeEnabled = !_touchpadModeEnabled; const char *dialogMsg; if (_touchpadModeEnabled) - dialogMsg = "Touchpad mode enabled."; + dialogMsg = _("Touchpad mode enabled."); else - dialogMsg = "Touchpad mode disabled."; + dialogMsg = _("Touchpad mode disabled."); GUI::TimedMessageDialog dialog(dialogMsg, 1500); dialog.runModal(); return false; -- cgit v1.2.3 From 91078cc1bba6e768881ec099424b58cf822ef1b6 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:01:17 +0000 Subject: WII: sync with recent GUI changes. NOT TESTED. svn-id: r49793 --- backends/platform/wii/options.cpp | 82 ++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp index a8f3552313..402782a58d 100644 --- a/backends/platform/wii/options.cpp +++ b/backends/platform/wii/options.cpp @@ -28,6 +28,8 @@ #include "gui/dialog.h" #include "backends/fs/wii/wii-fs-factory.h" +#include "common/translation.h" + #include "options.h" WiiOptionsDialog::WiiOptionsDialog(bool doubleStrike) : @@ -42,84 +44,84 @@ WiiOptionsDialog::WiiOptionsDialog(bool doubleStrike) : _strUnderscanY = "wii_video_default_underscan_y"; } - new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, "Ok", 'k'); - new ButtonWidget(this, _w - 216 - 32, _h - 24 - 16, 108, 24, "Cancel", 'c'); + new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, _("Ok"), 0, 'k'); + new ButtonWidget(this, _w - 216 - 32, _h - 24 - 16, 108, 24, _("Cancel"), 0, 'c'); _tab = new TabWidget(this, 0, 0, _w, _h - 54); - _tabVideo = _tab->addTab("Video"); + _tabVideo = _tab->addTab(_("Video")); new StaticTextWidget(_tab, 16, 16, 128, 16, - "Current video mode:", Graphics::kTextAlignRight); + _("Current video mode:"), Graphics::kTextAlignRight); new StaticTextWidget(_tab, 160, 16, 128, 16, - _doubleStrike ? "Double-strike" : "Default", + _doubleStrike ? _("Double-strike") : _("Default"), Graphics::kTextAlignLeft); new StaticTextWidget(_tab, 16, 48, 128, 16, - "Horizontal underscan:", Graphics::kTextAlignRight); - _sliderUnderscanX = new SliderWidget(_tab, 160, 47, 128, 18, 'x'); + _("Horizontal underscan:"), Graphics::kTextAlignRight); + _sliderUnderscanX = new SliderWidget(_tab, 160, 47, 128, 18, 0, 'x'); _sliderUnderscanX->setMinValue(0); _sliderUnderscanX->setMaxValue(32); new StaticTextWidget(_tab, 16, 80, 128, 16, - "Vertical underscan:", Graphics::kTextAlignRight); - _sliderUnderscanY = new SliderWidget(_tab, 160, 79, 128, 18, 'y'); + _("Vertical underscan:"), Graphics::kTextAlignRight); + _sliderUnderscanY = new SliderWidget(_tab, 160, 79, 128, 18, 0, 'y'); _sliderUnderscanY->setMinValue(0); _sliderUnderscanY->setMaxValue(32); - _tabInput = _tab->addTab("Input"); + _tabInput = _tab->addTab(_("Input")); new StaticTextWidget(_tab, 16, 16, 128, 16, - "GC Pad sensitivity:", Graphics::kTextAlignRight); - _sliderPadSensitivity = new SliderWidget(_tab, 160, 15, 128, 18, 'x'); + _("GC Pad sensitivity:"), Graphics::kTextAlignRight); + _sliderPadSensitivity = new SliderWidget(_tab, 160, 15, 128, 18, 0, 'x'); _sliderPadSensitivity->setMinValue(0); _sliderPadSensitivity->setMaxValue(64); new StaticTextWidget(_tab, 16, 44, 128, 16, - "GC Pad acceleration:", Graphics::kTextAlignRight); - _sliderPadAcceleration = new SliderWidget(_tab, 160, 43, 128, 18, 'y'); + _("GC Pad acceleration:"), Graphics::kTextAlignRight); + _sliderPadAcceleration = new SliderWidget(_tab, 160, 43, 128, 18, 0, 'y'); _sliderPadAcceleration->setMinValue(0); _sliderPadAcceleration->setMaxValue(8); #ifdef USE_WII_DI - _tabDVD = _tab->addTab("DVD"); + _tabDVD = _tab->addTab(_("DVD")); new StaticTextWidget(_tab, 16, 16, 64, 16, - "Status:", Graphics::kTextAlignRight); - _textDVDStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, "Unknown", + _("Status:"), Graphics::kTextAlignRight); + _textDVDStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, _("Unknown"), Graphics::kTextAlignLeft); - new ButtonWidget(_tab, 16, 48, 108, 24, "Mount DVD", 'mdvd'); - new ButtonWidget(_tab, 140, 48, 108, 24, "Unmount DVD", 'udvd'); + new ButtonWidget(_tab, 16, 48, 108, 24, _("Mount DVD"), 0, 'mdvd'); + new ButtonWidget(_tab, 140, 48, 108, 24, _("Unmount DVD"), 0, 'udvd'); #endif #ifdef USE_WII_SMB - _tabSMB = _tab->addTab("SMB"); + _tabSMB = _tab->addTab(_("SMB")); new StaticTextWidget(_tab, 16, 16, 64, 16, - "Status:", Graphics::kTextAlignRight); - _textSMBStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, "Unknown", + _("Status:"), Graphics::kTextAlignRight); + _textSMBStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, _("Unknown"), Graphics::kTextAlignLeft); new StaticTextWidget(_tab, 16, 52, 64, 16, - "Server:", Graphics::kTextAlignRight); + _("Server:"), Graphics::kTextAlignRight); _editSMBServer = new EditTextWidget(_tab, 96, 48, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 92, 64, 16, - "Share:", Graphics::kTextAlignRight); + _("Share:"), Graphics::kTextAlignRight); _editSMBShare = new EditTextWidget(_tab, 96, 88, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 132, 64, 16, - "Username:", Graphics::kTextAlignRight); + _("Username:"), Graphics::kTextAlignRight); _editSMBUsername = new EditTextWidget(_tab, 96, 128, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 172, 64, 16, - "Password:", Graphics::kTextAlignRight); + _("Password:"), Graphics::kTextAlignRight); _editSMBPassword = new EditTextWidget(_tab, 96, 168, _w - 96 - 32, 24, ""); - new ButtonWidget(_tab, 16, 208, 108, 24, "Init network", 'net'); + new ButtonWidget(_tab, 16, 208, 108, 24, _("Init network"), 0, 'net'); - new ButtonWidget(_tab, 140, 208, 108, 24, "Mount SMB", 'msmb'); - new ButtonWidget(_tab, 264, 208, 108, 24, "Unmount SMB", 'usmb'); + new ButtonWidget(_tab, 140, 208, 108, 24, _("Mount SMB"), 0, 'msmb'); + new ButtonWidget(_tab, 264, 208, 108, 24, _("Unmount SMB"), 0, 'usmb'); #endif _tab->setActiveTab(_tabVideo); @@ -140,12 +142,12 @@ void WiiOptionsDialog::handleTickle() { #ifdef USE_WII_DI if (tab == _tabDVD) { if (fsf.isMounted(WiiFilesystemFactory::kDVD)) { - _textDVDStatus->setLabel("DVD Mounted successfully"); + _textDVDStatus->setLabel(_("DVD Mounted successfully")); } else { if (fsf.failedToMount(WiiFilesystemFactory::kDVD)) - _textDVDStatus->setLabel("Error while mounting the DVD"); + _textDVDStatus->setLabel(_("Error while mounting the DVD")); else - _textDVDStatus->setLabel("DVD not mounted"); + _textDVDStatus->setLabel(_("DVD not mounted")); } } #endif @@ -158,32 +160,32 @@ void WiiOptionsDialog::handleTickle() { switch (status) { case 0: if (fsf.isMounted(WiiFilesystemFactory::kSMB)) { - label = "Network up, share mounted"; + label = _("Network up, share mounted"); } else { - label = "Network up"; + label = _("Network up"); if (fsf.failedToMount(WiiFilesystemFactory::kSMB)) - label += ", error while mounting the share"; + label += _(", error while mounting the share"); else - label += ", share not mounted"; + label += _(", share not mounted"); } break; case -ENETDOWN: - label = "Network down"; + label = _("Network down"); break; case -EBUSY: - label = "Initialising network"; + label = _("Initialising network"); break; case -ETIMEDOUT: - label = "Timeout while initialising network"; + label = _("Timeout while initialising network"); break; default: - label = String::printf("Network not initialsed (%d)", status); + label = String::printf(_("Network not initialsed (%d)"), status); break; } -- cgit v1.2.3 From 9aa8a9d51903cf68b594a9403fe22fe92af7d036 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:01:41 +0000 Subject: Symbian: sync with recent GUI changes. NOT TESTED. svn-id: r49794 --- backends/platform/symbian/src/SymbianActions.cpp | 41 ++++++++++++------------ backends/platform/symbian/src/SymbianOS.cpp | 3 +- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/backends/platform/symbian/src/SymbianActions.cpp b/backends/platform/symbian/src/SymbianActions.cpp index d925f5f0e7..1a55a68778 100644 --- a/backends/platform/symbian/src/SymbianActions.cpp +++ b/backends/platform/symbian/src/SymbianActions.cpp @@ -28,6 +28,7 @@ #include "gui/message.h" #include "scumm/scumm.h" #include "common/config-manager.h" +#include "common/translation.h" #include @@ -37,25 +38,25 @@ namespace GUI { // or we put them in this file separated by #ifdefs, this one is up to you, AnotherGuest :) const Common::String actionNames[] = { - "Up", - "Down", - "Left", - "Right", - "Left Click", - "Right Click", - "Save", - "Skip", - "Zone", - "Multi Function", - "Swap character", - "Skip text", - "Pause", - "Fast mode", - "Quit", - "Debugger", - "Global menu", - "Virtual keyboard", - "Key mapper" + _s("Up"), + _s("Down"), + _s("Left"), + _s("Right"), + _s("Left Click"), + _s("Right Click"), + _s("Save"), + _s("Skip"), + _s("Zone"), + _s("Multi Function"), + _s("Swap character"), + _s("Skip text"), + _s("Pause"), + _s("Fast mode"), + _s("Quit"), + _s("Debugger"), + _s("Global menu"), + _s("Virtual keyboard"), + _s("Key mapper") }; #ifdef UIQ @@ -75,7 +76,7 @@ void SymbianActions::init() { Common::String SymbianActions::actionName(ActionType action) { - return actionNames[action]; + return _(actionNames[action]); } int SymbianActions::size() { diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp index 2ae47b07a8..d63c9fe044 100644 --- a/backends/platform/symbian/src/SymbianOS.cpp +++ b/backends/platform/symbian/src/SymbianOS.cpp @@ -35,6 +35,7 @@ #include "common/config-manager.h" #include "common/scummsys.h" +#include "common/translation.h" #include "gui/message.h" @@ -442,7 +443,7 @@ bool OSystem_SDL_Symbian::remapKey(SDL_Event &ev, Common::Event &event) { case GUI::ACTION_QUIT: { - GUI::MessageDialog alert("Do you want to quit ?", "Yes", "No"); + GUI::MessageDialog alert(_("Do you want to quit ?"), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) quit(); -- cgit v1.2.3 From 9793c96f1b0afd9e6898d73012be2492e4d53be8 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:02:23 +0000 Subject: WINCE: sync with recent GUI changes. NOT TESTED. svn-id: r49795 --- backends/platform/wince/CEActionsPocket.cpp | 46 +++++++++++++------------ backends/platform/wince/CEActionsSmartphone.cpp | 36 ++++++++++--------- backends/platform/wince/CELauncherDialog.cpp | 10 +++--- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/backends/platform/wince/CEActionsPocket.cpp b/backends/platform/wince/CEActionsPocket.cpp index ebe6981290..64abd0be3e 100644 --- a/backends/platform/wince/CEActionsPocket.cpp +++ b/backends/platform/wince/CEActionsPocket.cpp @@ -31,30 +31,32 @@ #include "common/config-manager.h" #include "gui/KeysDialog.h" +#include "common/translation.h" + #ifdef _WIN32_WCE #define KEY_ALL_SKIP 3457 #endif const String pocketActionNames[] = { - "Pause", - "Save", - "Quit", - "Skip", - "Hide Toolbar", - "Show Keyboard", - "Sound on/off", - "Right click", - "Show/Hide Cursor", - "Free look", - "Zoom up", - "Zoom down", - "Multi Function", - "Bind Keys", - "Cursor Up", - "Cursor Down", - "Cursor Left", - "Cursor Right", - "Left Click", + _s("Pause"), + _s("Save"), + _s("Quit"), + _s("Skip"), + _s("Hide Toolbar"), + _s("Show Keyboard"), + _s("Sound on/off"), + _s("Right click"), + _s("Show/Hide Cursor"), + _s("Free look"), + _s("Zoom up"), + _s("Zoom down"), + _s("Multi Function"), + _s("Bind Keys"), + _s("Cursor Up"), + _s("Cursor Down"), + _s("Cursor Left"), + _s("Cursor Right"), + _s("Left Click") }; void CEActionsPocket::init() { @@ -63,7 +65,7 @@ void CEActionsPocket::init() { String CEActionsPocket::actionName(GUI::ActionType action) { - return pocketActionNames[action]; + return _(pocketActionNames[action]); } int CEActionsPocket::size() { @@ -258,7 +260,7 @@ bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) { if (action == POCKET_ACTION_SAVE && ConfMan.get("gameid") == "parallaction") { // FIXME: This is a temporary solution. The engine should handle its own menus. // Note that the user can accomplish this via the virtual keyboard as well, this is just for convenience - GUI::MessageDialog alert("Do you want to load or save the game?", "Load", "Save"); + GUI::MessageDialog alert(_("Do you want to load or save the game?"), _("Load"), _("Save")); if (alert.runModal() == GUI::kMessageOK) _key_action[action].setKey(SDLK_l); else @@ -308,7 +310,7 @@ bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) { case POCKET_ACTION_QUIT: if (!quitdialog) { quitdialog = true; - GUI::MessageDialog alert(" Are you sure you want to quit ? ", "Yes", "No"); + GUI::MessageDialog alert(_(" Are you sure you want to quit ? "), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) _mainSystem->quit(); quitdialog = false; diff --git a/backends/platform/wince/CEActionsSmartphone.cpp b/backends/platform/wince/CEActionsSmartphone.cpp index 47733ae317..af80bd2908 100644 --- a/backends/platform/wince/CEActionsSmartphone.cpp +++ b/backends/platform/wince/CEActionsSmartphone.cpp @@ -30,23 +30,25 @@ #include "common/config-manager.h" #include "gui/KeysDialog.h" +#include "common/translation.h" + #define KEY_ALL_SKIP 3457 const String smartphoneActionNames[] = { - "Up", - "Down", - "Left", - "Right", - "Left Click", - "Right Click", - "Save", - "Skip", - "Zone", - "Multi Function", - "Bind Keys", - "Keyboard", - "Rotate", - "Quit" + _s("Up"), + _s("Down"), + _s("Left"), + _s("Right"), + _s("Left Click"), + _s("Right Click"), + _s("Save"), + _s("Skip"), + _s("Zone"), + _s("Multi Function"), + _s("Bind Keys"), + _s("Keyboard"), + _s("Rotate"), + _s("Quit") }; const int ACTIONS_SMARTPHONE_DEFAULT[] = { SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_ESCAPE, SDLK_9, SDLK_8, SDLK_F4, SDLK_RETURN, SDLK_5, SDLK_0 }; @@ -57,7 +59,7 @@ void CEActionsSmartphone::init() { String CEActionsSmartphone::actionName(GUI::ActionType action) { - return smartphoneActionNames[action]; + return _(smartphoneActionNames[action]); } int CEActionsSmartphone::size() { @@ -220,7 +222,7 @@ bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) { if (action == SMARTPHONE_ACTION_SAVE && ConfMan.get("gameid") == "parallaction") { // FIXME: This is a temporary solution. The engine should handle its own menus. // Note that the user can accomplish this via the virtual keyboard as well, this is just for convenience - GUI::MessageDialog alert("Do you want to load or save the game?", "Load", "Save"); + GUI::MessageDialog alert(_("Do you want to load or save the game?"), _("Load"), _("Save")); if (alert.runModal() == GUI::kMessageOK) _key_action[action].setKey(SDLK_l); else @@ -267,7 +269,7 @@ bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) { case SMARTPHONE_ACTION_QUIT: if (!quitdialog) { quitdialog = true; - GUI::MessageDialog alert(" Are you sure you want to quit ? ", "Yes", "No"); + GUI::MessageDialog alert(_(" Are you sure you want to quit ? "), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) _mainSystem->quit(); quitdialog = false; diff --git a/backends/platform/wince/CELauncherDialog.cpp b/backends/platform/wince/CELauncherDialog.cpp index 21a967336e..11e4900c2d 100644 --- a/backends/platform/wince/CELauncherDialog.cpp +++ b/backends/platform/wince/CELauncherDialog.cpp @@ -38,6 +38,8 @@ #include "common/config-manager.h" +#include "common/translation.h" + using namespace GUI; using namespace Common; @@ -51,13 +53,13 @@ public: // needs fixing, or remove it! const int buttonWidth = g_gui.xmlEval()->getVar("Globals.Button.Width", 0); const int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0); - new ButtonWidget(this, (_w - buttonWidth) / 2, 45, buttonWidth, buttonHeight, "OK", kCloseCmd, '\r'); // Close dialog - FIXME + new ButtonWidget(this, (_w - buttonWidth) / 2, 45, buttonWidth, buttonHeight, _("OK"), 0, kCloseCmd, '\r'); // Close dialog - FIXME - Common::String videoDriver("Using SDL driver "); + Common::String videoDriver(_("Using SDL driver ")); SDL_VideoDriverName(tempo, sizeof(tempo)); videoDriver += tempo; new StaticTextWidget(this, 0, 10, _w, kLineHeight, videoDriver, Graphics::kTextAlignCenter); - Common::String displayInfos("Display "); + Common::String displayInfos(_("Display ")); sprintf(tempo, "%dx%d (real %dx%d)", GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), OSystem_WINCE3::getScreenWidth(), OSystem_WINCE3::getScreenHeight()); displayInfos += tempo; new StaticTextWidget(this, 0, 20, _w, kLineHeight, displayInfos, Graphics::kTextAlignCenter); @@ -99,7 +101,7 @@ void CELauncherDialog::automaticScanDirectory(const Common::FSNode &node) { * returns some illegal paths atm. */ void CELauncherDialog::addGame() { - MessageDialog alert("Do you want to perform an automatic scan ?", "Yes", "No"); + MessageDialog alert(_("Do you want to perform an automatic scan ?"), _("Yes"), _("No")); if (alert.runModal() == kMessageOK && _browser->runModal() > 0) { // Clear existing domains ConfigManager::DomainMap &domains = (ConfigManager::DomainMap&)ConfMan.getGameDomains(); -- cgit v1.2.3 From 9e006b74d342c5b020f36b5b75285e71d74f7d20 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:02:42 +0000 Subject: Keymapper: sync with recent GUI changes. svn-id: r49796 --- backends/keymapper/remap-dialog.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp index fd90b67d60..067d8453a5 100644 --- a/backends/keymapper/remap-dialog.cpp +++ b/backends/keymapper/remap-dialog.cpp @@ -31,6 +31,8 @@ #include "gui/ScrollBarWidget.h" #include "gui/ThemeEval.h" +#include "common/translation.h" + namespace Common { enum { @@ -44,12 +46,12 @@ RemapDialog::RemapDialog() _keymapper = g_system->getEventManager()->getKeymapper(); assert(_keymapper); - _kmPopUpDesc = new GUI::StaticTextWidget(this, "KeyMapper.PopupDesc", "Keymap:"); + _kmPopUpDesc = new GUI::StaticTextWidget(this, "KeyMapper.PopupDesc", _("Keymap:")); _kmPopUp = new GUI::PopUpWidget(this, "KeyMapper.Popup"); _scrollBar = new GUI::ScrollBarWidget(this, 0, 0, 0, 0); - new GUI::ButtonWidget(this, "KeyMapper.Close", "Close", kCloseCmd); + new GUI::ButtonWidget(this, "KeyMapper.Close", _("Close"), 0, kCloseCmd); } RemapDialog::~RemapDialog() { @@ -61,7 +63,7 @@ void RemapDialog::open() { const Stack &activeKeymaps = _keymapper->getActiveStack(); if (!(activeKeymaps.size() > 0)) { - _kmPopUp->appendEntry(activeKeymaps.top().keymap->getName() + " (Active)"); + _kmPopUp->appendEntry(activeKeymaps.top().keymap->getName() + _(" (Active)")); divider = true; } @@ -95,7 +97,7 @@ void RemapDialog::open() { if (divider) _kmPopUp->appendEntry(""); for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); ++it) { - _kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx); + _kmPopUp->appendEntry(it->_value->getName() + _(" (Global)"), idx); _keymapTable[idx++] = it->_value; } divider = true; @@ -105,7 +107,7 @@ void RemapDialog::open() { if (divider) _kmPopUp->appendEntry(""); for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); ++it) { - _kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx); + _kmPopUp->appendEntry(it->_value->getName() + _(" (Game)"), idx); _keymapTable[idx++] = it->_value; } } @@ -168,7 +170,7 @@ void RemapDialog::reflowLayout() { widg.actionText = new GUI::StaticTextWidget(this, 0, 0, 0, 0, "", Graphics::kTextAlignRight); widg.keyButton = - new GUI::ButtonWidget(this, 0, 0, 0, 0, "", kRemapCmd + i); + new GUI::ButtonWidget(this, 0, 0, 0, 0, "", 0, kRemapCmd + i); _keymapWidgets.push_back(widg); } else { widg = _keymapWidgets[i]; -- cgit v1.2.3 From 94c9f9cdd11c64810aa0333d503403e54413fc09 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:03:11 +0000 Subject: I18n: Add backend files to POTFILES. Update .pot. Translations were not updated. svn-id: r49797 --- common/messages.cpp | 1188 ++++++++++++++++++++++++++++----------------------- po/POTFILES | 12 +- po/hu_HU.po | 640 +++++++++++++++++++++++---- po/ru_RU.po | 650 ++++++++++++++++++++++++---- po/scummvm.pot | 633 +++++++++++++++++++++++---- 5 files changed, 2323 insertions(+), 800 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 752fbbcc0e..ef4065d1f9 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -5,247 +5,343 @@ static const char * _po2c_msgids[] = { /* 0 */ "", - /* 1 */ " Looking for a plugin supporting this gameid... ", - /* 2 */ " Starting '%s'\n", - /* 3 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", - /* 4 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", - /* 5 */ "... progress ...", - /* 6 */ "11kHz", - /* 7 */ "22 kHz", - /* 8 */ "44 kHz", - /* 9 */ "48 kHz", - /* 10 */ "8 kHz", - /* 11 */ "", - /* 12 */ "ALSA", - /* 13 */ "About", - /* 14 */ "About ScummVM", - /* 15 */ "About...", - /* 16 */ "AdLib", - /* 17 */ "AdLib emulator:", - /* 18 */ "AdLib is used for music in many games", - /* 19 */ "Add Game...", - /* 20 */ "Antialiased Renderer (16bpp)", - /* 21 */ "Aspect ratio correction", - /* 22 */ "Associated key : %s", - /* 23 */ "Associated key : none", - /* 24 */ "Atari ST MIDI", - /* 25 */ "Audio", - /* 26 */ "Autosave:", - /* 27 */ "A~b~out...", - /* 28 */ "Both", - /* 29 */ "C1Available engines:", - /* 30 */ "C1Features compiled in:", - /* 31 */ "C2(built on ", - /* 32 */ "CAMD", - /* 33 */ "Cancel", - /* 34 */ "Cannot create file", - /* 35 */ "Change game options", - /* 36 */ "Change global ScummVM options", - /* 37 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", - /* 38 */ "Choose", - /* 39 */ "Choose an action to map", - /* 40 */ "Clear value", - /* 41 */ "Close", - /* 42 */ "CoreAudio", - /* 43 */ "CoreMIDI", - /* 44 */ "Correct aspect ratio for 320x200 games", - /* 45 */ "Could not find any engine capable of running the selected game", - /* 46 */ "Creative Music System", - /* 47 */ "DMedia", - /* 48 */ "Date: ", - /* 49 */ "Default", - /* 50 */ "Delete", - /* 51 */ "Disabled GFX", - /* 52 */ "Discovered %d new games ...", - /* 53 */ "Discovered %d new games.", - /* 54 */ "Display keyboard", - /* 55 */ "Do you really want to delete this savegame?", - /* 56 */ "Do you really want to remove this game configuration?", - /* 57 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 58 */ "Edit Game...", - /* 59 */ "Enable Roland GS Mode", - /* 60 */ "Engine does not support debug level '%s'", - /* 61 */ "English", - /* 62 */ "Error running game:", - /* 63 */ "Extra Path:", - /* 64 */ "FM Towns", - /* 65 */ "Failed to load any GUI theme, aborting", - /* 66 */ "FluidSynth", - /* 67 */ "Full title of the game", - /* 68 */ "Fullscreen mode", - /* 69 */ "GFX", - /* 70 */ "GUI Language:", - /* 71 */ "GUI Renderer:", - /* 72 */ "Game", - /* 73 */ "Game Data not found", - /* 74 */ "Game Id not supported", - /* 75 */ "Game Path:", - /* 76 */ "Go to previous directory level", - /* 77 */ "Go up", - /* 78 */ "Graphics", - /* 79 */ "Graphics mode:", - /* 80 */ "Help", - /* 81 */ "Higher value specifies better sound quality but may be not supported by your soundcard", - /* 82 */ "Hold Shift for Mass Add", - /* 83 */ "IBM PCjr", - /* 84 */ "ID:", - /* 85 */ "Invalid Path", - /* 86 */ "Keys", - /* 87 */ "Language of ScummVM GUI", - /* 88 */ "Language of the game. This will not turn your Spanish game version into English", - /* 89 */ "Language:", - /* 90 */ "Load", - /* 91 */ "Load game:", - /* 92 */ "Load savegame for selected game", - /* 93 */ "Load...", - /* 94 */ "MIDI", - /* 95 */ "MIDI gain:", - /* 96 */ "MT-32 Emulation", - /* 97 */ "Map", - /* 98 */ "Mass Add...", - /* 99 */ "Menu", - /* 100 */ "Misc", - /* 101 */ "Mixed AdLib/MIDI mode", - /* 102 */ "Mouse click", - /* 103 */ "Music driver:", - /* 104 */ "Music volume:", - /* 105 */ "Mute All", - /* 106 */ "Name:", - /* 107 */ "Never", - /* 108 */ "No", - /* 109 */ "No date saved", - /* 110 */ "No music", - /* 111 */ "No playtime saved", - /* 112 */ "No time saved", - /* 113 */ "None", - /* 114 */ "OK", - /* 115 */ "Options", - /* 116 */ "Options...", - /* 117 */ "Output rate:", - /* 118 */ "Override global MIDI settings", - /* 119 */ "Override global audio settings", - /* 120 */ "Override global graphic settings", - /* 121 */ "Override global volume settings", - /* 122 */ "PC Speaker", - /* 123 */ "Path not a directory", - /* 124 */ "Path not a file", - /* 125 */ "Path not exists", - /* 126 */ "Paths", - /* 127 */ "Pause", - /* 128 */ "Pick the game:", - /* 129 */ "Platform the game was originally designed for", - /* 130 */ "Platform:", - /* 131 */ "Playtime: ", - /* 132 */ "Please select an action", - /* 133 */ "Plugins Path:", - /* 134 */ "Press the key to associate", - /* 135 */ "Quit", - /* 136 */ "Quit ScummVM", - /* 137 */ "Read permission denied", - /* 138 */ "Reading failed", - /* 139 */ "Remap keys", - /* 140 */ "Remove Game", - /* 141 */ "Remove game from the list. The game data files stay intact", - /* 142 */ "Render mode:", - /* 143 */ "Resume", - /* 144 */ "Return to Launcher", - /* 145 */ "SEQ", - /* 146 */ "SFX volume:", - /* 147 */ "Save", - /* 148 */ "Save Path:", - /* 149 */ "Save Path: ", - /* 150 */ "Save game:", - /* 151 */ "Scan complete!", - /* 152 */ "Scanned %d directories ...", - /* 153 */ "ScummVM could not find any engine capable of running the selected game!", - /* 154 */ "ScummVM could not find any game in the specified directory!", - /* 155 */ "ScummVM couldn't open the specified directory!", - /* 156 */ "Search in game list", - /* 157 */ "Search:", - /* 158 */ "Select SoundFont", - /* 159 */ "Select a Theme", - /* 160 */ "Select additional game directory", - /* 161 */ "Select an action and click 'Map'", - /* 162 */ "Select directory for GUI themes", - /* 163 */ "Select directory for extra files", - /* 164 */ "Select directory for plugins", - /* 165 */ "Select directory for saved games", - /* 166 */ "Select directory for savegames", - /* 167 */ "Select directory with game data", - /* 168 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 169 */ "Show subtitles and play speech", - /* 170 */ "Skip", - /* 171 */ "Skip line", - /* 172 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 173 */ "SoundFont:", - /* 174 */ "Spch", - /* 175 */ "Special dithering modes supported by some games", - /* 176 */ "Special sound effects volume", - /* 177 */ "Specifies output sound device or sound card emulator", - /* 178 */ "Specifies output sound device or sound emulator", - /* 179 */ "Specifies path to additional data used by all games or ScummVM", - /* 180 */ "Specifies path to additional data used the game", - /* 181 */ "Specifies where your savegames are put", - /* 182 */ "Speech", - /* 183 */ "Speech & Subs", - /* 184 */ "Speech Only", - /* 185 */ "Speech and Subtitles", - /* 186 */ "Speech volume:", - /* 187 */ "Standard Renderer (16bpp)", - /* 188 */ "Start", - /* 189 */ "Start selected game", - /* 190 */ "Subs", - /* 191 */ "Subtitle speed:", - /* 192 */ "Subtitles", - /* 193 */ "Subtitles Only", - /* 194 */ "Tapwave Zodiac", - /* 195 */ "Text and Speech:", - /* 196 */ "The chosen directory cannot be written to. Please select another one.", - /* 197 */ "Theme Path:", - /* 198 */ "Theme:", - /* 199 */ "This game ID is already taken. Please choose another one.", - /* 200 */ "This game does not support loading games from the launcher.", - /* 201 */ "TiMidity", - /* 202 */ "Time: ", - /* 203 */ "True Roland MT-32 (disable GM emulation)", - /* 204 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 205 */ "Unknown Error", - /* 206 */ "Unsupported Color Mode", - /* 207 */ "Untitled savestate", - /* 208 */ "Use both MIDI and AdLib sound generation", - /* 209 */ "User picked target '%s' (gameid '%s')...\n", - /* 210 */ "Volume", - /* 211 */ "Windows MIDI", - /* 212 */ "Write permission denied", - /* 213 */ "Writing data failed", - /* 214 */ "Yamaha Pa1", - /* 215 */ "Yes", - /* 216 */ "You have to restart ScummVM to take the effect.", - /* 217 */ "every 10 mins", - /* 218 */ "every 15 mins", - /* 219 */ "every 30 mins", - /* 220 */ "every 5 mins", - /* 221 */ "failed\n", - /* 222 */ "~A~bout", - /* 223 */ "~A~dd Game...", - /* 224 */ "~C~ancel", - /* 225 */ "~C~lose", - /* 226 */ "~E~dit Game...", - /* 227 */ "~H~elp", - /* 228 */ "~K~eys", - /* 229 */ "~L~oad", - /* 230 */ "~L~oad...", - /* 231 */ "~N~ext", - /* 232 */ "~O~K", - /* 233 */ "~O~ptions", - /* 234 */ "~O~ptions...", - /* 235 */ "~P~revious", - /* 236 */ "~Q~uit", - /* 237 */ "~R~emove Game", - /* 238 */ "~R~esume", - /* 239 */ "~R~eturn to Launcher", - /* 240 */ "~S~ave", - /* 241 */ "~S~tart", + /* 1 */ " Are you sure you want to quit ? ", + /* 2 */ " Looking for a plugin supporting this gameid... ", + /* 3 */ " Starting '%s'\n", + /* 4 */ " (Active)", + /* 5 */ " (Game)", + /* 6 */ " (Global)", + /* 7 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", + /* 8 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", + /* 9 */ ", error while mounting the share", + /* 10 */ ", share not mounted", + /* 11 */ "... progress ...", + /* 12 */ "11kHz", + /* 13 */ "22 kHz", + /* 14 */ "44 kHz", + /* 15 */ "48 kHz", + /* 16 */ "8 kHz", + /* 17 */ "", + /* 18 */ "ALSA", + /* 19 */ "About", + /* 20 */ "About ScummVM", + /* 21 */ "About...", + /* 22 */ "AdLib", + /* 23 */ "AdLib emulator:", + /* 24 */ "AdLib is used for music in many games", + /* 25 */ "Add Game...", + /* 26 */ "Antialiased Renderer (16bpp)", + /* 27 */ "Aspect ratio correction", + /* 28 */ "Associated key : %s", + /* 29 */ "Associated key : none", + /* 30 */ "Atari ST MIDI", + /* 31 */ "Audio", + /* 32 */ "Autosave:", + /* 33 */ "A~b~out...", + /* 34 */ "Bind Keys", + /* 35 */ "Both", + /* 36 */ "Brightness:", + /* 37 */ "C1Available engines:", + /* 38 */ "C1Features compiled in:", + /* 39 */ "C2(built on ", + /* 40 */ "CAMD", + /* 41 */ "Cancel", + /* 42 */ "Cannot create file", + /* 43 */ "Change game options", + /* 44 */ "Change global ScummVM options", + /* 45 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 46 */ "Choose", + /* 47 */ "Choose an action to map", + /* 48 */ "Clear value", + /* 49 */ "Close", + /* 50 */ "CoreAudio", + /* 51 */ "CoreMIDI", + /* 52 */ "Correct aspect ratio for 320x200 games", + /* 53 */ "Could not find any engine capable of running the selected game", + /* 54 */ "Creative Music System", + /* 55 */ "Current video mode:", + /* 56 */ "Cursor Down", + /* 57 */ "Cursor Left", + /* 58 */ "Cursor Right", + /* 59 */ "Cursor Up", + /* 60 */ "DMedia", + /* 61 */ "DVD", + /* 62 */ "DVD Mounted successfully", + /* 63 */ "DVD not mounted", + /* 64 */ "Date: ", + /* 65 */ "Debugger", + /* 66 */ "Default", + /* 67 */ "Delete", + /* 68 */ "Disable power off", + /* 69 */ "Disabled GFX", + /* 70 */ "Discovered %d new games ...", + /* 71 */ "Discovered %d new games.", + /* 72 */ "Display ", + /* 73 */ "Display keyboard", + /* 74 */ "Do you really want to delete this savegame?", + /* 75 */ "Do you really want to remove this game configuration?", + /* 76 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 77 */ "Do you want to load or save the game?", + /* 78 */ "Do you want to perform an automatic scan ?", + /* 79 */ "Do you want to quit ?", + /* 80 */ "Double-strike", + /* 81 */ "Down", + /* 82 */ "Edit Game...", + /* 83 */ "Enable Roland GS Mode", + /* 84 */ "Engine does not support debug level '%s'", + /* 85 */ "English", + /* 86 */ "Error running game:", + /* 87 */ "Error while mounting the DVD", + /* 88 */ "Extra Path:", + /* 89 */ "FM Towns", + /* 90 */ "Failed to load any GUI theme, aborting", + /* 91 */ "Fast mode", + /* 92 */ "FluidSynth", + /* 93 */ "Free look", + /* 94 */ "Full title of the game", + /* 95 */ "Fullscreen mode", + /* 96 */ "GC Pad acceleration:", + /* 97 */ "GC Pad sensitivity:", + /* 98 */ "GFX", + /* 99 */ "GUI Language:", + /* 100 */ "GUI Renderer:", + /* 101 */ "Game", + /* 102 */ "Game Data not found", + /* 103 */ "Game Id not supported", + /* 104 */ "Game Path:", + /* 105 */ "Global menu", + /* 106 */ "Go to previous directory level", + /* 107 */ "Go up", + /* 108 */ "Graphics", + /* 109 */ "Graphics mode:", + /* 110 */ "Hardware scale (fast, but low quality)", + /* 111 */ "Help", + /* 112 */ "Hide Toolbar", + /* 113 */ "High quality audio (slower) (reboot)", + /* 114 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 115 */ "Hold Shift for Mass Add", + /* 116 */ "Horizontal underscan:", + /* 117 */ "IBM PCjr", + /* 118 */ "ID:", + /* 119 */ "Init network", + /* 120 */ "Initial top screen scale:", + /* 121 */ "Initialising network", + /* 122 */ "Input", + /* 123 */ "Invalid Path", + /* 124 */ "Key mapper", + /* 125 */ "Keyboard", + /* 126 */ "Keymap:", + /* 127 */ "Keys", + /* 128 */ "Language of ScummVM GUI", + /* 129 */ "Language of the game. This will not turn your Spanish game version into English", + /* 130 */ "Language:", + /* 131 */ "Left", + /* 132 */ "Left Click", + /* 133 */ "Load", + /* 134 */ "Load game:", + /* 135 */ "Load savegame for selected game", + /* 136 */ "Load...", + /* 137 */ "MIDI", + /* 138 */ "MIDI gain:", + /* 139 */ "MT-32 Emulation", + /* 140 */ "Main screen scaling:", + /* 141 */ "Map", + /* 142 */ "Mass Add...", + /* 143 */ "Menu", + /* 144 */ "Misc", + /* 145 */ "Mixed AdLib/MIDI mode", + /* 146 */ "Mount DVD", + /* 147 */ "Mount SMB", + /* 148 */ "Mouse click", + /* 149 */ "Multi Function", + /* 150 */ "Music driver:", + /* 151 */ "Music volume:", + /* 152 */ "Mute All", + /* 153 */ "Name:", + /* 154 */ "Network down", + /* 155 */ "Network not initialsed (%d)", + /* 156 */ "Network up", + /* 157 */ "Network up, share mounted", + /* 158 */ "Never", + /* 159 */ "No", + /* 160 */ "No date saved", + /* 161 */ "No music", + /* 162 */ "No playtime saved", + /* 163 */ "No time saved", + /* 164 */ "None", + /* 165 */ "OK", + /* 166 */ "Ok", + /* 167 */ "Options", + /* 168 */ "Options...", + /* 169 */ "Output rate:", + /* 170 */ "Override global MIDI settings", + /* 171 */ "Override global audio settings", + /* 172 */ "Override global graphic settings", + /* 173 */ "Override global volume settings", + /* 174 */ "PC Speaker", + /* 175 */ "Password:", + /* 176 */ "Path not a directory", + /* 177 */ "Path not a file", + /* 178 */ "Path not exists", + /* 179 */ "Paths", + /* 180 */ "Pause", + /* 181 */ "Pick the game:", + /* 182 */ "Platform the game was originally designed for", + /* 183 */ "Platform:", + /* 184 */ "Playtime: ", + /* 185 */ "Please select an action", + /* 186 */ "Plugins Path:", + /* 187 */ "Press the key to associate", + /* 188 */ "Quit", + /* 189 */ "Quit ScummVM", + /* 190 */ "Read permission denied", + /* 191 */ "Reading failed", + /* 192 */ "Remap keys", + /* 193 */ "Remove Game", + /* 194 */ "Remove game from the list. The game data files stay intact", + /* 195 */ "Render mode:", + /* 196 */ "Resume", + /* 197 */ "Return to Launcher", + /* 198 */ "Right", + /* 199 */ "Right Click", + /* 200 */ "Right click", + /* 201 */ "Rotate", + /* 202 */ "SEQ", + /* 203 */ "SFX volume:", + /* 204 */ "SMB", + /* 205 */ "Save", + /* 206 */ "Save Path:", + /* 207 */ "Save Path: ", + /* 208 */ "Save game:", + /* 209 */ "Scan complete!", + /* 210 */ "Scanned %d directories ...", + /* 211 */ "ScummVM Main Menu", + /* 212 */ "ScummVM could not find any engine capable of running the selected game!", + /* 213 */ "ScummVM could not find any game in the specified directory!", + /* 214 */ "ScummVM couldn't open the specified directory!", + /* 215 */ "Search in game list", + /* 216 */ "Search:", + /* 217 */ "Select SoundFont", + /* 218 */ "Select a Theme", + /* 219 */ "Select additional game directory", + /* 220 */ "Select an action and click 'Map'", + /* 221 */ "Select directory for GUI themes", + /* 222 */ "Select directory for extra files", + /* 223 */ "Select directory for plugins", + /* 224 */ "Select directory for saved games", + /* 225 */ "Select directory for savegames", + /* 226 */ "Select directory with game data", + /* 227 */ "Sensitivity", + /* 228 */ "Server:", + /* 229 */ "Share:", + /* 230 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 231 */ "Show Keyboard", + /* 232 */ "Show mouse cursor", + /* 233 */ "Show subtitles and play speech", + /* 234 */ "Show/Hide Cursor", + /* 235 */ "Skip", + /* 236 */ "Skip line", + /* 237 */ "Skip text", + /* 238 */ "Snap to edges", + /* 239 */ "Software scale (good quality, but slower)", + /* 240 */ "Sound on/off", + /* 241 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 242 */ "SoundFont:", + /* 243 */ "Spch", + /* 244 */ "Special dithering modes supported by some games", + /* 245 */ "Special sound effects volume", + /* 246 */ "Specifies output sound device or sound card emulator", + /* 247 */ "Specifies output sound device or sound emulator", + /* 248 */ "Specifies path to additional data used by all games or ScummVM", + /* 249 */ "Specifies path to additional data used the game", + /* 250 */ "Specifies where your savegames are put", + /* 251 */ "Speech", + /* 252 */ "Speech & Subs", + /* 253 */ "Speech Only", + /* 254 */ "Speech and Subtitles", + /* 255 */ "Speech volume:", + /* 256 */ "Standard Renderer (16bpp)", + /* 257 */ "Start", + /* 258 */ "Start selected game", + /* 259 */ "Status:", + /* 260 */ "Subs", + /* 261 */ "Subtitle speed:", + /* 262 */ "Subtitles", + /* 263 */ "Subtitles Only", + /* 264 */ "Swap character", + /* 265 */ "Tap for left click, double tap right click", + /* 266 */ "Tapwave Zodiac", + /* 267 */ "Text and Speech:", + /* 268 */ "The chosen directory cannot be written to. Please select another one.", + /* 269 */ "Theme Path:", + /* 270 */ "Theme:", + /* 271 */ "This game ID is already taken. Please choose another one.", + /* 272 */ "This game does not support loading games from the launcher.", + /* 273 */ "TiMidity", + /* 274 */ "Time: ", + /* 275 */ "Timeout while initialising network", + /* 276 */ "Touch X Offset", + /* 277 */ "Touch Y Offset", + /* 278 */ "Touchpad mode disabled.", + /* 279 */ "Touchpad mode enabled.", + /* 280 */ "True Roland MT-32 (disable GM emulation)", + /* 281 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 282 */ "Unknown", + /* 283 */ "Unknown Error", + /* 284 */ "Unmount DVD", + /* 285 */ "Unmount SMB", + /* 286 */ "Unscaled (you must scroll left and right)", + /* 287 */ "Unsupported Color Mode", + /* 288 */ "Untitled savestate", + /* 289 */ "Up", + /* 290 */ "Use both MIDI and AdLib sound generation", + /* 291 */ "Use laptop trackpad-style cursor control", + /* 292 */ "User picked target '%s' (gameid '%s')...\n", + /* 293 */ "Username:", + /* 294 */ "Using SDL driver ", + /* 295 */ "Vertical underscan:", + /* 296 */ "Video", + /* 297 */ "Virtual keyboard", + /* 298 */ "Volume", + /* 299 */ "Windows MIDI", + /* 300 */ "Write permission denied", + /* 301 */ "Writing data failed", + /* 302 */ "Yamaha Pa1", + /* 303 */ "Yes", + /* 304 */ "You have to restart ScummVM to take the effect.", + /* 305 */ "Zone", + /* 306 */ "Zoom down", + /* 307 */ "Zoom up", + /* 308 */ "every 10 mins", + /* 309 */ "every 15 mins", + /* 310 */ "every 30 mins", + /* 311 */ "every 5 mins", + /* 312 */ "failed\n", + /* 313 */ "~A~bout", + /* 314 */ "~A~dd Game...", + /* 315 */ "~C~ancel", + /* 316 */ "~C~lose", + /* 317 */ "~E~dit Game...", + /* 318 */ "~H~elp", + /* 319 */ "~I~ndy fight controls", + /* 320 */ "~K~eys", + /* 321 */ "~L~eft handed mode", + /* 322 */ "~L~oad", + /* 323 */ "~L~oad...", + /* 324 */ "~N~ext", + /* 325 */ "~O~K", + /* 326 */ "~O~ptions", + /* 327 */ "~O~ptions...", + /* 328 */ "~P~revious", + /* 329 */ "~Q~uit", + /* 330 */ "~R~emove Game", + /* 331 */ "~R~esume", + /* 332 */ "~R~eturn to Launcher", + /* 333 */ "~S~ave", + /* 334 */ "~S~tart", + /* 335 */ "~T~ransitions Enabled", + /* 336 */ "~W~ater Effect Enabled", + /* 337 */ "~Z~ip Mode Activated", NULL }; @@ -255,303 +351,327 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 19:52+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, - { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, - { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, - { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, - { 4, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, - { 5, "... \350\371\363 ..." }, - { 6, "11 \352\303\366" }, - { 7, "22 \352\303\366" }, - { 8, "44 \352\303\366" }, - { 9, "48 \352\303\366" }, - { 10, "8 \352\303\366" }, - { 11, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, - { 12, "ALSA" }, - { 13, "\316 \357\360\356\343\360\340\354\354\345" }, - { 14, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 15, "\316 \357\360\356\343\360\340\354\354\345..." }, - { 16, "AdLib" }, - { 17, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 18, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 19, "\315\356\342. \350\343\360\340..." }, - { 20, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 21, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 23, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 24, "Atars ST MIDI" }, - { 25, "\300\363\344\350\356" }, - { 26, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 27, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 28, "\302\361\270" }, - { 29, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 30, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 31, "C2(\361\356\341\360\340\355 " }, - { 32, "CAMD" }, - { 33, "\316\362\354\345\355\340" }, - { 34, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 35, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 36, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 37, "\316\362\354\345\362\374\362\345 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 38, "\302\373\341\360\340\362\374" }, - { 39, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 40, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 41, "\307\340\352\360\373\362\374" }, - { 42, "CoreAudio" }, - { 43, "CoreMIDI" }, - { 44, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 45, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 46, "Creative Music System" }, - { 47, "DMedia" }, - { 48, "\304\340\362\340: " }, - { 49, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 50, "\323\344\340\353\350\362\374" }, - { 51, "\301\345\347 \343\360\340\364\350\352\350" }, - { 52, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 53, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 54, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 55, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 56, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 57, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 58, "\310\347\354. \350\343\360\363..." }, - { 59, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 60, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 61, "English" }, - { 62, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 63, "\304\356\357. \357\363\362\374:" }, - { 64, "FM Towns" }, - { 65, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 66, "FluidSynth" }, - { 67, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 68, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 69, "\303\360\364" }, - { 70, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 71, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 72, "\310\343\360\340" }, - { 73, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 74, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 75, "\317\363\362\374 \352 \350\343\360\345: " }, - { 76, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 77, "\302\342\345\360\365" }, - { 78, "\303\360\340\364\350\352\340" }, - { 79, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 80, "\317\356\354\356\371\374" }, - { 81, "\301\356\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 82, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 83, "IBM PCjr" }, - { 84, "ID:" }, - { 85, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 86, "\312\353\340\342\350\370\350" }, - { 87, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 88, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 89, "\337\347\373\352:" }, - { 90, "\307\340\343\360\363\347\350\362\374" }, - { 91, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 92, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 93, "\307\340\343\360...." }, - { 94, "MIDI" }, - { 95, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 96, "\335\354\363\353\377\366\350\377 MT-32" }, - { 97, "\315\340\347\355\340\367\350\362\374" }, - { 98, "\304\356\341. \354\355\356\343\356..." }, - { 99, "\314\345\355\376" }, - { 100, "\320\340\347\355\356\345" }, - { 101, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 102, "\312\353\350\352 \354\373\370\374\376" }, - { 103, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 104, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 105, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 106, "\315\340\347\342\340\355\350\345:" }, - { 107, "\315\350\352\356\343\344\340" }, - { 108, "\315\345\362" }, - { 109, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 110, "\301\345\347 \354\363\347\373\352\350" }, - { 111, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 112, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 113, "\315\345 \347\340\344\340\355" }, - { 114, "OK" }, - { 115, "\316\357\366\350\350" }, - { 116, "\316\357\366\350\350..." }, - { 117, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 118, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 119, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 120, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 121, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 122, "PC \361\357\350\352\345\360" }, - { 123, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 124, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 125, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 126, "\317\363\362\350" }, - { 127, "\317\340\363\347\340" }, - { 128, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 129, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 130, "\317\353\340\362\364\356\360\354\340:" }, - { 131, "\302\360\345\354\377 \350\343\360\373: " }, - { 132, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 133, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 134, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 135, "\302\373\365\356\344" }, - { 136, "\302\373\365\356\344 \350\347 ScummVM" }, - { 137, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 138, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 139, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 140, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 141, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 142, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 143, "\317\360\356\344\356\353\346\350\362\374" }, - { 144, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 145, "SEQ" }, - { 146, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 147, "\307\340\357\350\361\340\362\374" }, - { 148, "\317\363\362\374 \361\356\365\360.: " }, - { 149, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 150, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 151, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 152, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 153, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 154, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 155, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 156, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 157, "\317\356\350\361\352:" }, - { 158, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 159, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 160, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 161, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 162, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 163, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 164, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 165, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 166, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 167, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 168, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\363\353\374\347\363\345\354\373\351 \344\353\377 \350\343\360\373 \342 \361\356\365\360\340\355\345\355\350\377 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 169, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \357\360\356\350\343\360\373\342\340\362\374 \360\345\367\374" }, - { 170, "\317\360\356\357\363\361\362\350\362\374" }, - { 171, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 172, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, - { 173, "SoundFont:" }, - { 174, "\316\347\342" }, - { 175, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 176, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 177, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 178, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 179, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 180, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 181, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 182, "\316\347\342\363\367\352\340" }, - { 183, "\307\342\363\352 \350 \361\363\341." }, - { 184, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 185, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 186, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 187, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 188, "\317\363\361\352" }, - { 189, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 190, "\321\363\341" }, - { 191, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 192, "\321\363\341\362\350\362\360\373" }, - { 193, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 194, "Tapware Zodiac" }, - { 195, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 196, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 197, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 198, "\322\345\354\340:" }, - { 199, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 200, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 201, "TiMidity" }, - { 202, "\302\360\345\354\377: " }, - { 203, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 204, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 205, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 206, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 207, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 208, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 209, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 210, "\303\360\356\354\352\356\361\362\374" }, - { 211, "Windows MIDI" }, - { 212, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 213, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 214, "Yamaha Pa1" }, - { 215, "\304\340" }, - { 216, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 217, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 218, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 219, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 220, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 221, "\355\345 \363\344\340\353\356\361\374\n" }, - { 222, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 223, "~\304~\356\341. \350\343\360\363..." }, - { 224, "\316~\362~\354\345\355\340" }, - { 225, "~\307~\340\352\360\373\362\374" }, - { 226, "\310\347~\354~. \350\343\360\363..." }, - { 227, "~\317~\356\354\356\371\374" }, - { 228, "~\312~\353\340\342\350\370\350" }, - { 229, "~\307~\340\343\360\363\347\350\362\374" }, - { 230, "~\307~\340\343\360...." }, - { 231, "~\321~\353\345\344" }, - { 232, "~O~K" }, - { 233, "~\316~\357\366\350\350" }, - { 234, "~\316~\357\366\350\350..." }, - { 235, "~\317~\360\345\344" }, - { 236, "~\302~\373\365\356\344" }, - { 237, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 238, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 239, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 240, "~\307~\340\357\350\361\340\362\374" }, - { 241, "\317~\363~\361\352" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, + { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, + { 5, "\310\343\360\340" }, + { 7, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, + { 8, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, + { 11, "... \350\371\363 ..." }, + { 12, "11 \352\303\366" }, + { 13, "22 \352\303\366" }, + { 14, "44 \352\303\366" }, + { 15, "48 \352\303\366" }, + { 16, "8 \352\303\366" }, + { 17, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, + { 18, "ALSA" }, + { 19, "\316 \357\360\356\343\360\340\354\354\345" }, + { 20, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, + { 21, "\316 \357\360\356\343\360\340\354\354\345..." }, + { 22, "AdLib" }, + { 23, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 24, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 25, "\315\356\342. \350\343\360\340..." }, + { 26, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 27, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 28, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 29, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 30, "Atars ST MIDI" }, + { 31, "\300\363\344\350\356" }, + { 32, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 33, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 34, "\312\353\340\342\350\370\350" }, + { 35, "\302\361\270" }, + { 37, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 38, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 39, "C2(\361\356\341\360\340\355 " }, + { 40, "CAMD" }, + { 41, "\316\362\354\345\355\340" }, + { 42, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 43, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 44, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 45, "\316\362\354\345\362\374\362\345 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 46, "\302\373\341\360\340\362\374" }, + { 47, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 48, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 49, "\307\340\352\360\373\362\374" }, + { 50, "CoreAudio" }, + { 51, "CoreMIDI" }, + { 52, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 53, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 54, "Creative Music System" }, + { 55, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 60, "DMedia" }, + { 64, "\304\340\362\340: " }, + { 66, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 67, "\323\344\340\353\350\362\374" }, + { 69, "\301\345\347 \343\360\340\364\350\352\350" }, + { 70, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 71, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 72, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 73, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 74, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 75, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 76, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 77, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 82, "\310\347\354. \350\343\360\363..." }, + { 83, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 84, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 85, "English" }, + { 86, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 88, "\304\356\357. \357\363\362\374:" }, + { 89, "FM Towns" }, + { 90, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 91, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 92, "FluidSynth" }, + { 94, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 95, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 98, "\303\360\364" }, + { 99, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 100, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 101, "\310\343\360\340" }, + { 102, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 103, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 104, "\317\363\362\374 \352 \350\343\360\345: " }, + { 106, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 107, "\302\342\345\360\365" }, + { 108, "\303\360\340\364\350\352\340" }, + { 109, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 111, "\317\356\354\356\371\374" }, + { 114, "\301\356\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 115, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 117, "IBM PCjr" }, + { 118, "ID:" }, + { 123, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 127, "\312\353\340\342\350\370\350" }, + { 128, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 129, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 130, "\337\347\373\352:" }, + { 133, "\307\340\343\360\363\347\350\362\374" }, + { 134, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 135, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 136, "\307\340\343\360...." }, + { 137, "MIDI" }, + { 138, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 139, "\335\354\363\353\377\366\350\377 MT-32" }, + { 141, "\315\340\347\355\340\367\350\362\374" }, + { 142, "\304\356\341. \354\355\356\343\356..." }, + { 143, "\314\345\355\376" }, + { 144, "\320\340\347\355\356\345" }, + { 145, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 148, "\312\353\350\352 \354\373\370\374\376" }, + { 150, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 151, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 152, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 153, "\315\340\347\342\340\355\350\345:" }, + { 158, "\315\350\352\356\343\344\340" }, + { 159, "\315\345\362" }, + { 160, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 161, "\301\345\347 \354\363\347\373\352\350" }, + { 162, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 163, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 164, "\315\345 \347\340\344\340\355" }, + { 165, "OK" }, + { 167, "\316\357\366\350\350" }, + { 168, "\316\357\366\350\350..." }, + { 169, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 170, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 171, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 172, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 173, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 174, "PC \361\357\350\352\345\360" }, + { 176, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 177, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 178, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 179, "\317\363\362\350" }, + { 180, "\317\340\363\347\340" }, + { 181, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 182, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 183, "\317\353\340\362\364\356\360\354\340:" }, + { 184, "\302\360\345\354\377 \350\343\360\373: " }, + { 185, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 186, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 187, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 188, "\302\373\365\356\344" }, + { 189, "\302\373\365\356\344 \350\347 ScummVM" }, + { 190, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 191, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 192, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 193, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 194, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 195, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 196, "\317\360\356\344\356\353\346\350\362\374" }, + { 197, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 202, "SEQ" }, + { 203, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 205, "\307\340\357\350\361\340\362\374" }, + { 206, "\317\363\362\374 \361\356\365\360.: " }, + { 207, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 208, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 209, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 210, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 212, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 213, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 214, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 215, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 216, "\317\356\350\361\352:" }, + { 217, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 218, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 219, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 220, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 221, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 222, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 223, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 224, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 225, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 226, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 228, "\315\350\352\356\343\344\340" }, + { 229, "\317\356\350\361\352:" }, + { 230, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\363\353\374\347\363\345\354\373\351 \344\353\377 \350\343\360\373 \342 \361\356\365\360\340\355\345\355\350\377 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 233, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \357\360\356\350\343\360\373\342\340\362\374 \360\345\367\374" }, + { 235, "\317\360\356\357\363\361\362\350\362\374" }, + { 236, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 237, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 240, "SoundFont:" }, + { 241, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 242, "SoundFont:" }, + { 243, "\316\347\342" }, + { 244, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 245, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 246, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 247, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 248, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 249, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 250, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 251, "\316\347\342\363\367\352\340" }, + { 252, "\307\342\363\352 \350 \361\363\341." }, + { 253, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 254, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 255, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 256, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 257, "\317\363\361\352" }, + { 258, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 259, "\317\363\361\352" }, + { 260, "\321\363\341" }, + { 261, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 262, "\321\363\341\362\350\362\360\373" }, + { 263, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 266, "Tapware Zodiac" }, + { 267, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 268, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 269, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 270, "\322\345\354\340:" }, + { 271, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 272, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 273, "TiMidity" }, + { 274, "\302\360\345\354\377: " }, + { 280, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 281, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 282, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 283, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 287, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 288, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 290, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 292, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 294, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 297, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 298, "\303\360\356\354\352\356\361\362\374" }, + { 299, "Windows MIDI" }, + { 300, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 301, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 302, "Yamaha Pa1" }, + { 303, "\304\340" }, + { 304, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 305, "\315\345 \347\340\344\340\355" }, + { 307, "\302\342\345\360\365" }, + { 308, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 309, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 310, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 311, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 312, "\355\345 \363\344\340\353\356\361\374\n" }, + { 313, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 314, "~\304~\356\341. \350\343\360\363..." }, + { 315, "\316~\362~\354\345\355\340" }, + { 316, "~\307~\340\352\360\373\362\374" }, + { 317, "\310\347~\354~. \350\343\360\363..." }, + { 318, "~\317~\356\354\356\371\374" }, + { 320, "~\312~\353\340\342\350\370\350" }, + { 321, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 322, "~\307~\340\343\360\363\347\350\362\374" }, + { 323, "~\307~\340\343\360...." }, + { 324, "~\321~\353\345\344" }, + { 325, "~O~K" }, + { 326, "~\316~\357\366\350\350" }, + { 327, "~\316~\357\366\350\350..." }, + { 328, "~\317~\360\345\344" }, + { 329, "~\302~\373\365\356\344" }, + { 330, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 331, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 332, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 333, "~\307~\340\357\350\361\340\362\374" }, + { 334, "\317~\363~\361\352" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-12 19:52+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, - { 11, "" }, - { 16, "Hang" }, - { 17, "AdLib vezet :" }, - { 21, "Aspect adag korrekci\363" }, - { 25, "Hang" }, - { 26, "Automatikus ment\351s:" }, - { 42, "Hang" }, - { 49, "" }, - { 59, "K\351pess\351 Roland GS Mode" }, - { 63, "Extra \332tvonal:" }, - { 68, "Teljes k\351perny s m\363d:" }, - { 71, "Lek\351pez eszk\366z GUI:" }, - { 75, "Extra \332tvonal:" }, - { 78, "Grafik\341val" }, - { 79, "Grafikus m\363d:" }, - { 86, "Kulcsok" }, - { 95, "MIDI nyeres\351g:" }, - { 101, "Vegyes AdLib/MIDI m\363d" }, - { 103, "Zenei vezet :" }, - { 104, "Zene mennyis\351g:" }, - { 105, "Muta \326sszes" }, - { 107, "Soha" }, - { 108, "Semmi" }, - { 113, "Semmi" }, - { 114, "Igen" }, - { 117, "Kimeneti teljes\355tm\351ny:" }, - { 126, "\326sv\351nyek" }, - { 127, "\326sv\351nyek" }, - { 142, "Renderel\351si m\363d:" }, - { 146, "SFX mennyis\351ge" }, - { 148, "Extra \332tvonal:" }, - { 182, "Csak a besz\351d" }, - { 183, "Besz\351d s Feliratok" }, - { 184, "Csak a besz\351d" }, - { 185, "Besz\351d \351s a Feliratok" }, - { 186, "Besz\351d mennyis\351g:" }, - { 191, "Felirat sebess\351g:" }, - { 192, "Csak feliratok" }, - { 193, "Csak feliratok" }, - { 195, "Sz\366veg \351s besz\351d:" }, - { 198, "T\351ma:" }, - { 202, "T\351ma:" }, - { 203, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 210, "Volumene" }, - { 217, "10 percenk\351nt" }, - { 218, "15 percenk\351nt" }, - { 219, "30 percenk\351nt" }, - { 220, "5 percenk\351nt" }, - { 228, "Kulcsok" }, - { 232, "Igen" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 17, "" }, + { 22, "Hang" }, + { 23, "AdLib vezet :" }, + { 27, "Aspect adag korrekci\363" }, + { 31, "Hang" }, + { 32, "Automatikus ment\351s:" }, + { 34, "Kulcsok" }, + { 50, "Hang" }, + { 55, "Renderel\351si m\363d:" }, + { 66, "" }, + { 83, "K\351pess\351 Roland GS Mode" }, + { 88, "Extra \332tvonal:" }, + { 91, "Grafikus m\363d:" }, + { 95, "Teljes k\351perny s m\363d:" }, + { 100, "Lek\351pez eszk\366z GUI:" }, + { 104, "Extra \332tvonal:" }, + { 108, "Grafik\341val" }, + { 109, "Grafikus m\363d:" }, + { 127, "Kulcsok" }, + { 138, "MIDI nyeres\351g:" }, + { 145, "Vegyes AdLib/MIDI m\363d" }, + { 150, "Zenei vezet :" }, + { 151, "Zene mennyis\351g:" }, + { 152, "Muta \326sszes" }, + { 158, "Soha" }, + { 159, "Semmi" }, + { 164, "Semmi" }, + { 165, "Igen" }, + { 169, "Kimeneti teljes\355tm\351ny:" }, + { 179, "\326sv\351nyek" }, + { 180, "\326sv\351nyek" }, + { 195, "Renderel\351si m\363d:" }, + { 203, "SFX mennyis\351ge" }, + { 206, "Extra \332tvonal:" }, + { 228, "Soha" }, + { 251, "Csak a besz\351d" }, + { 252, "Besz\351d s Feliratok" }, + { 253, "Csak a besz\351d" }, + { 254, "Besz\351d \351s a Feliratok" }, + { 255, "Besz\351d mennyis\351g:" }, + { 261, "Felirat sebess\351g:" }, + { 262, "Csak feliratok" }, + { 263, "Csak feliratok" }, + { 267, "Sz\366veg \351s besz\351d:" }, + { 270, "T\351ma:" }, + { 274, "T\351ma:" }, + { 280, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 294, "Zenei vezet :" }, + { 298, "Volumene" }, + { 305, "Semmi" }, + { 308, "10 percenk\351nt" }, + { 309, "15 percenk\351nt" }, + { 310, "30 percenk\351nt" }, + { 311, "5 percenk\351nt" }, + { 320, "Kulcsok" }, + { 321, "Renderel\351si m\363d:" }, + { 325, "Igen" }, { -1, NULL } }; diff --git a/po/POTFILES b/po/POTFILES index 6a2d426e4d..8150006eaa 100755 --- a/po/POTFILES +++ b/po/POTFILES @@ -19,8 +19,16 @@ common/error.cpp engines/dialogs.cpp engines/scumm/dialogs.cpp +engines/mohawk/dialogs.cpp sound/mididrv.cpp - -#TODO: backends engines tools? +backends/keymapper/remap-dialog.cpp +backends/platform/ds/arm9/source/dsoptions.cpp +backends/platform/iphone/osys_events.cpp +backends/platform/symbian/src/SymbianActions.cpp +backends/platform/symbian/src/SymbianOS.cpp +backends/platform/wii/options.cpp +backends/platform/wince/CEActionsPocket.cpp +backends/platform/wince/CEActionsSmartphone.cpp +backends/platform/wince/CELauncherDialog.cpp diff --git a/po/hu_HU.po b/po/hu_HU.po index 8301f50a11..aaa5df9f52 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 19:52+0300\n" +"POT-Creation-Date: 2010-06-13 16:52+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -35,7 +35,8 @@ msgstr "" #: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 #: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 #: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 +#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 +#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "" @@ -48,6 +49,7 @@ msgid "Failed to load any GUI theme, aborting" msgstr "" #: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 +#: backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" @@ -69,7 +71,8 @@ msgstr "" #: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 #: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 +#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 +#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "Igen" @@ -119,65 +122,74 @@ msgstr "" #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 #: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 #: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 +#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 +#: gui/options.cpp:859 sound/mididrv.cpp:60 msgid "" msgstr "" -#: gui/launcher.cpp:191 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 msgid "Platform:" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "Graphics" msgstr "Grafikával" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "GFX" msgstr "" -#: gui/launcher.cpp:205 +#: gui/launcher.cpp:205 gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "" #: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 +#: gui/launcher.cpp:213 gui/options.cpp:789 msgid "Audio" msgstr "Hang" -#: gui/launcher.cpp:214 +#: gui/launcher.cpp:214 gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "" #: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 +#: gui/launcher.cpp:223 gui/options.cpp:793 msgid "Volume" msgstr "Volumene" -#: gui/launcher.cpp:224 +#: gui/launcher.cpp:224 gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "" #: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 +#: gui/launcher.cpp:232 gui/options.cpp:801 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:233 +#: gui/launcher.cpp:233 gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "" #: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 +#: gui/launcher.cpp:244 gui/options.cpp:807 msgid "Paths" msgstr "Ösvények" -#: gui/launcher.cpp:249 +#: gui/launcher.cpp:249 gui/launcher.cpp:250 #, fuzzy msgid "Game Path:" msgstr "Extra Útvonal:" #: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 +#: gui/launcher.cpp:254 gui/options.cpp:820 msgid "Extra Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:257 +#: gui/launcher.cpp:257 gui/launcher.cpp:258 #, fuzzy msgid "Save Path:" msgstr "Extra Útvonal:" @@ -194,17 +206,23 @@ msgstr "Extra #: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 #: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 #: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 +#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 +#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 +#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 +#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 +#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 +#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 msgid "None" msgstr "Semmi" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 +#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: backends/platform/wii/options.cpp:56 #, fuzzy msgid "Default" msgstr "" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 +#: gui/options.cpp:1037 gui/options.cpp:1056 msgid "Select SoundFont" msgstr "" @@ -225,6 +243,9 @@ msgid "This game ID is already taken. Please choose another one." msgstr "" #: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 msgid "Quit" msgstr "" @@ -265,6 +286,8 @@ msgid "Load game:" msgstr "" #: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "" @@ -275,10 +298,18 @@ msgid "" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Yes" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 #, fuzzy msgid "No" msgstr "Semmi" @@ -391,131 +422,137 @@ msgstr "Csak feliratok" msgid "Speech & Subs" msgstr "Beszéd s Feliratok" -#: gui/options.cpp:595 gui/options.cpp:580 +#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:606 gui/options.cpp:591 +#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:616 gui/options.cpp:601 +#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:619 gui/options.cpp:604 +#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:626 gui/options.cpp:611 +#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 msgid "Music driver:" msgstr "Zenei vezet :" -#: gui/options.cpp:637 gui/options.cpp:622 +#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:648 gui/options.cpp:633 +#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:660 gui/options.cpp:645 +#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:650 +#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:668 gui/options.cpp:653 +#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:671 gui/options.cpp:656 +#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:674 gui/options.cpp:659 +#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:687 gui/options.cpp:672 +#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:691 gui/options.cpp:689 +#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:703 gui/options.cpp:701 +#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:710 gui/options.cpp:708 +#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:713 gui/options.cpp:711 +#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:720 gui/options.cpp:718 +#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:797 gui/options.cpp:795 +#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 gui/options.cpp:798 +#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 gui/options.cpp:805 +#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 gui/options.cpp:810 +#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 msgid "Misc" msgstr "" -#: gui/options.cpp:814 gui/options.cpp:812 +#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:818 gui/options.cpp:816 +#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:824 gui/options.cpp:822 +#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 msgid "Autosave:" msgstr "Automatikus mentés:" #: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 +#: gui/options.cpp:849 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:844 gui/options.cpp:842 +#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 msgid "English" msgstr "" #: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 +#: gui/options.cpp:1008 msgid "Select directory for savegames" msgstr "" #: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 +#: gui/options.cpp:1015 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" #: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 +#: gui/options.cpp:1024 msgid "Select directory for GUI themes" msgstr "" #: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 +#: gui/options.cpp:1034 msgid "Select directory for extra files" msgstr "" #: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 +#: gui/options.cpp:1045 msgid "Select directory for plugins" msgstr "" @@ -598,11 +635,14 @@ msgstr "" msgid "Menu" msgstr "" -#: base/main.cpp:275 +#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "" -#: base/main.cpp:278 +#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 #, fuzzy msgid "Pause" msgstr "Ösvények" @@ -676,6 +716,11 @@ msgid "Resume" msgstr "" #: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Save" msgstr "" @@ -699,7 +744,7 @@ msgstr "" msgid "Save game:" msgstr "" -#: gui/options.cpp:978 gui/options.cpp:976 +#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 msgid "You have to restart ScummVM to take the effect." msgstr "" @@ -715,81 +760,81 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 msgid "No music" msgstr "" -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 msgid "Windows MIDI" msgstr "" -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 msgid "ALSA" msgstr "" -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 msgid "Atari ST MIDI" msgstr "" -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 msgid "SEQ" msgstr "" -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 msgid "DMedia" msgstr "" -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 msgid "CAMD" msgstr "" -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 #, fuzzy msgid "CoreAudio" msgstr "Hang" -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 msgid "CoreMIDI" msgstr "" -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 msgid "Yamaha Pa1" msgstr "" -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 msgid "Tapwave Zodiac" msgstr "" -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 msgid "FluidSynth" msgstr "" -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 msgid "MT-32 Emulation" msgstr "" -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 #, fuzzy msgid "AdLib" msgstr "Hang" -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 msgid "PC Speaker" msgstr "" -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 msgid "IBM PCjr" msgstr "" -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 msgid "Creative Music System" msgstr "" -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 msgid "FM Towns" msgstr "" -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 msgid "TiMidity" msgstr "" @@ -853,12 +898,14 @@ msgstr "" msgid "~R~eturn to Launcher" msgstr "" -#: engines/dialogs.cpp:301 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 #, fuzzy msgid "~O~K" msgstr "Igen" -#: engines/dialogs.cpp:302 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "" @@ -876,28 +923,32 @@ msgid "~N~ext" msgstr "" #: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 gui/options.cpp:683 +#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 +#: gui/options.cpp:702 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:678 gui/options.cpp:684 +#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 +#: gui/options.cpp:703 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:679 gui/options.cpp:685 +#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 +#: gui/options.cpp:704 msgid "Both" msgstr "" -#: gui/options.cpp:683 +#: gui/options.cpp:683 gui/options.cpp:702 msgid "Spch" msgstr "" -#: gui/options.cpp:684 +#: gui/options.cpp:684 gui/options.cpp:703 msgid "Subs" msgstr "" @@ -913,7 +964,7 @@ msgstr "" msgid "Search in game list" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:647 +#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 msgid "Clear value" msgstr "" @@ -933,16 +984,17 @@ msgid "" "English" msgstr "" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:253 gui/launcher.cpp:254 +#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "" #: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 +#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Specifies where your savegames are put" msgstr "" @@ -974,11 +1026,12 @@ msgstr "" msgid "Remove game from the list. The game data files stay intact" msgstr "" -#: gui/options.cpp:591 gui/options.cpp:592 +#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 +#: gui/options.cpp:606 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:604 +#: gui/options.cpp:604 gui/options.cpp:618 msgid "Correct aspect ratio for 320x200 games" msgstr "" @@ -986,54 +1039,465 @@ msgstr "" msgid "Specifies output sound device or sound emulator" msgstr "" -#: gui/options.cpp:622 gui/options.cpp:623 +#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 +#: gui/options.cpp:642 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:633 gui/options.cpp:634 +#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 +#: gui/options.cpp:653 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 +#: gui/options.cpp:665 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:650 +#: gui/options.cpp:650 gui/options.cpp:669 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:653 +#: gui/options.cpp:653 gui/options.cpp:672 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:656 gui/options.cpp:675 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:685 +#: gui/options.cpp:685 gui/options.cpp:704 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:801 gui/options.cpp:802 +#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 +#: gui/options.cpp:821 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:612 gui/options.cpp:611 +#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 +#: gui/options.cpp:626 msgid "Specifies output sound device or sound card emulator" msgstr "" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#, fuzzy +msgid "~L~eft handed mode" +msgstr "Renderelési mód:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +#, fuzzy +msgid "Zone" +msgstr "Semmi" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +#, fuzzy +msgid "Fast mode" +msgstr "Grafikus mód:" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "" + +#: backends/platform/symbian/src/SymbianOS.cpp:447 +msgid "Do you want to quit ?" +msgstr "" + +#: backends/platform/wii/options.cpp:47 +msgid "Ok" +msgstr "" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "" + +#: backends/platform/wii/options.cpp:54 +#, fuzzy +msgid "Current video mode:" +msgstr "Renderelési mód:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:106 +#, fuzzy +msgid "Server:" +msgstr "Soha" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr "" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +#, fuzzy +msgid "Bind Keys" +msgstr "Kulcsok" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +#, fuzzy +msgid "Using SDL driver " +msgstr "Zenei vezet :" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index 6349f601d2..c4dc4df396 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 19:52+0300\n" +"POT-Creation-Date: 2010-06-13 16:52+0300\n" "PO-Revision-Date: 2010-06-08 08:52-0100\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -36,7 +36,8 @@ msgstr " #: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 #: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 #: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 +#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 +#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Îòìåíà" @@ -49,6 +50,7 @@ msgid "Failed to load any GUI theme, aborting" msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" #: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 +#: backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Çàêðûòü" @@ -70,7 +72,8 @@ msgstr " #: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 #: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 +#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 +#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -120,64 +123,73 @@ msgstr " #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 #: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 #: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 +#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 +#: gui/options.cpp:859 sound/mididrv.cpp:60 msgid "" msgstr "<ïî óìîë÷àíèþ>" -#: gui/launcher.cpp:191 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 msgid "Platform:" msgstr "Ïëàòôîðìà:" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "Graphics" msgstr "Ãðàôèêà" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "GFX" msgstr "Ãðô" -#: gui/launcher.cpp:205 +#: gui/launcher.cpp:205 gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" #: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 +#: gui/launcher.cpp:213 gui/options.cpp:789 msgid "Audio" msgstr "Àóäèî" -#: gui/launcher.cpp:214 +#: gui/launcher.cpp:214 gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" #: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 +#: gui/launcher.cpp:223 gui/options.cpp:793 msgid "Volume" msgstr "Ãðîìêîñòü" -#: gui/launcher.cpp:224 +#: gui/launcher.cpp:224 gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" #: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 +#: gui/launcher.cpp:232 gui/options.cpp:801 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:233 +#: gui/launcher.cpp:233 gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" #: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 +#: gui/launcher.cpp:244 gui/options.cpp:807 msgid "Paths" msgstr "Ïóòè" -#: gui/launcher.cpp:249 +#: gui/launcher.cpp:249 gui/launcher.cpp:250 msgid "Game Path:" msgstr "Ïóòü ê èãðå: " #: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 +#: gui/launcher.cpp:254 gui/options.cpp:820 msgid "Extra Path:" msgstr "Äîï. ïóòü:" -#: gui/launcher.cpp:257 +#: gui/launcher.cpp:257 gui/launcher.cpp:258 msgid "Save Path:" msgstr "Ïóòü ñîõð.: " @@ -193,16 +205,22 @@ msgstr " #: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 #: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 #: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 +#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 +#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 +#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 +#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 +#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 +#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 msgid "None" msgstr "Íå çàäàí" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 +#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Ïî óìîë÷àíèþ" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 +#: gui/options.cpp:1037 gui/options.cpp:1056 msgid "Select SoundFont" msgstr "Âûáåðèòå SoundFont" @@ -223,6 +241,9 @@ msgid "This game ID is already taken. Please choose another one." msgstr "Ýòîò ID èãðû óæå èñïîëüçóåòñÿ. Ïîæàëóéñòà, âûáåðèòå äðóãîé." #: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 msgid "Quit" msgstr "Âûõîä" @@ -263,6 +284,8 @@ msgid "Load game:" msgstr "Çàãðóçèòü èãðó:" #: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Çàãðóçèòü" @@ -275,10 +298,18 @@ msgstr "" "äîáàâèòü áîëüøîå êîëè÷åñòâî èãð." #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Yes" msgstr "Äà" #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 msgid "No" msgstr "Íåò" @@ -390,131 +421,137 @@ msgstr " msgid "Speech & Subs" msgstr "Çâóê è ñóá." -#: gui/options.cpp:595 gui/options.cpp:580 +#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 msgid "Graphics mode:" msgstr "Ãðàôè÷åñêèé ðåæèì:" -#: gui/options.cpp:606 gui/options.cpp:591 +#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 msgid "Render mode:" msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" -#: gui/options.cpp:616 gui/options.cpp:601 +#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 msgid "Fullscreen mode" msgstr "Ïîëíîýêðàííûé ðåæèì" -#: gui/options.cpp:619 gui/options.cpp:604 +#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 msgid "Aspect ratio correction" msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" -#: gui/options.cpp:626 gui/options.cpp:611 +#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 msgid "Music driver:" msgstr "Äðàéâåð ìóçûêè:" -#: gui/options.cpp:637 gui/options.cpp:622 +#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 msgid "AdLib emulator:" msgstr "Ýìóëÿòîð AdLib:" -#: gui/options.cpp:648 gui/options.cpp:633 +#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 msgid "Output rate:" msgstr "Âûõîäíàÿ ÷àñòîòà:" -#: gui/options.cpp:660 gui/options.cpp:645 +#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:665 gui/options.cpp:650 +#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 msgid "Mixed AdLib/MIDI mode" msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" -#: gui/options.cpp:668 gui/options.cpp:653 +#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" -#: gui/options.cpp:671 gui/options.cpp:656 +#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 msgid "Enable Roland GS Mode" msgstr "Âêëþ÷èòü ðåæèì Roland GS" -#: gui/options.cpp:674 gui/options.cpp:659 +#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 msgid "MIDI gain:" msgstr "Óñèëåíèå MIDI:" -#: gui/options.cpp:687 gui/options.cpp:672 +#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 msgid "Text and Speech:" msgstr "Òåêñò è îçâó÷êà:" -#: gui/options.cpp:691 gui/options.cpp:689 +#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 msgid "Subtitle speed:" msgstr "Ñêîðîñòü ñóáòèòðîâ:" -#: gui/options.cpp:703 gui/options.cpp:701 +#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 msgid "Music volume:" msgstr "Ãðîìêîñòü ìóçûêè:" -#: gui/options.cpp:710 gui/options.cpp:708 +#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 msgid "Mute All" msgstr "Âûêëþ÷èòü âñ¸" -#: gui/options.cpp:713 gui/options.cpp:711 +#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 msgid "SFX volume:" msgstr "Ãðîìêîñòü ýôôåêòîâ:" -#: gui/options.cpp:720 gui/options.cpp:718 +#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 msgid "Speech volume:" msgstr "Ãðîìêîñòü îçâó÷êè:" -#: gui/options.cpp:797 gui/options.cpp:795 +#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 msgid "Save Path: " msgstr "Ïóòü äëÿ ñîõðàíåíèé: " -#: gui/options.cpp:800 gui/options.cpp:798 +#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 msgid "Theme Path:" msgstr "Ïóòü ê òåìàì:" -#: gui/options.cpp:807 gui/options.cpp:805 +#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 msgid "Plugins Path:" msgstr "Ïóòü ê ïëàãèíàì:" -#: gui/options.cpp:812 gui/options.cpp:810 +#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 msgid "Misc" msgstr "Ðàçíîå" -#: gui/options.cpp:814 gui/options.cpp:812 +#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 msgid "Theme:" msgstr "Òåìà:" -#: gui/options.cpp:818 gui/options.cpp:816 +#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 msgid "GUI Renderer:" msgstr "Ðàñòåðèçàòîð GUI:" -#: gui/options.cpp:824 gui/options.cpp:822 +#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 msgid "Autosave:" msgstr "Àâòîñîõðàíåíèå:" #: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 +#: gui/options.cpp:849 msgid "Keys" msgstr "Êëàâèøè" -#: gui/options.cpp:844 gui/options.cpp:842 +#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 msgid "English" msgstr "English" #: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 +#: gui/options.cpp:1008 msgid "Select directory for savegames" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" #: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 +#: gui/options.cpp:1015 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." #: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 +#: gui/options.cpp:1024 msgid "Select directory for GUI themes" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" #: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 +#: gui/options.cpp:1034 msgid "Select directory for extra files" msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" #: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 +#: gui/options.cpp:1045 msgid "Select directory for plugins" msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" @@ -598,11 +635,14 @@ msgstr " msgid "Menu" msgstr "Ìåíþ" -#: base/main.cpp:275 +#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Ïðîïóñòèòü" -#: base/main.cpp:278 +#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Ïàóçà" @@ -675,6 +715,11 @@ msgid "Resume" msgstr "Ïðîäîëæèòü" #: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Save" msgstr "Çàïèñàòü" @@ -698,7 +743,7 @@ msgstr " msgid "Save game:" msgstr "Ñîõðàíèòü èãðó: " -#: gui/options.cpp:978 gui/options.cpp:976 +#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 msgid "You have to restart ScummVM to take the effect." msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." @@ -714,79 +759,79 @@ msgstr " msgid "Antialiased Renderer (16bpp)" msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 msgid "No music" msgstr "Áåç ìóçûêè" -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 msgid "Windows MIDI" msgstr "Windows MIDI" -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 msgid "ALSA" msgstr "ALSA" -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 msgid "Atari ST MIDI" msgstr "Atars ST MIDI" -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 msgid "SEQ" msgstr "SEQ" -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 msgid "DMedia" msgstr "DMedia" -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 msgid "CAMD" msgstr "CAMD" -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 msgid "CoreAudio" msgstr "CoreAudio" -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 msgid "CoreMIDI" msgstr "CoreMIDI" -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 msgid "Yamaha Pa1" msgstr "Yamaha Pa1" -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 msgid "Tapwave Zodiac" msgstr "Tapware Zodiac" -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 msgid "FluidSynth" msgstr "FluidSynth" -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 msgid "MT-32 Emulation" msgstr "Ýìóëÿöèÿ MT-32" -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 msgid "AdLib" msgstr "AdLib" -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 msgid "PC Speaker" msgstr "PC ñïèêåð" -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 msgid "IBM PCjr" msgstr "IBM PCjr" -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 msgid "Creative Music System" msgstr "Creative Music System" -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 msgid "FM Towns" msgstr "FM Towns" -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 msgid "TiMidity" msgstr "TiMidity" @@ -850,11 +895,13 @@ msgstr " msgid "~R~eturn to Launcher" msgstr "~Â~åðíóòüñÿ â ãëàâíîå ìåíþ" -#: engines/dialogs.cpp:301 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "Î~ò~ìåíà" @@ -871,26 +918,30 @@ msgid "~N~ext" msgstr "~Ñ~ëåä" #: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 msgid "~C~lose" msgstr "~Ç~àêðûòü" -#: gui/options.cpp:677 gui/options.cpp:683 +#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 +#: gui/options.cpp:702 msgid "Speech" msgstr "Îçâó÷êà" -#: gui/options.cpp:678 gui/options.cpp:684 +#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 +#: gui/options.cpp:703 msgid "Subtitles" msgstr "Ñóáòèòðû" -#: gui/options.cpp:679 gui/options.cpp:685 +#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 +#: gui/options.cpp:704 msgid "Both" msgstr "Âñ¸" -#: gui/options.cpp:683 +#: gui/options.cpp:683 gui/options.cpp:702 msgid "Spch" msgstr "Îçâ" -#: gui/options.cpp:684 +#: gui/options.cpp:684 gui/options.cpp:703 msgid "Subs" msgstr "Ñóá" @@ -906,7 +957,7 @@ msgstr " msgid "Search in game list" msgstr "Ïîèñê â ñïèñêå èãð" -#: gui/launcher.cpp:529 gui/options.cpp:647 +#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 msgid "Clear value" msgstr "Î÷èñòèòü çíà÷åíèå" @@ -930,16 +981,17 @@ msgstr "" "ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " "ðóññêóþ" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" -#: gui/launcher.cpp:253 gui/launcher.cpp:254 +#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ äëÿ èãðû" #: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 +#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Specifies where your savegames are put" msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" @@ -971,11 +1023,12 @@ msgstr " msgid "Remove game from the list. The game data files stay intact" msgstr "Óäàëèòü èãðó èç ñïèñêà. Íå óäàëÿåò èãðó ñ æåñòêîãî äèñêà" -#: gui/options.cpp:591 gui/options.cpp:592 +#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 +#: gui/options.cpp:606 msgid "Special dithering modes supported by some games" msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" -#: gui/options.cpp:604 +#: gui/options.cpp:604 gui/options.cpp:618 msgid "Correct aspect ratio for 320x200 games" msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" @@ -983,11 +1036,13 @@ msgstr " msgid "Specifies output sound device or sound emulator" msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" -#: gui/options.cpp:622 gui/options.cpp:623 +#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 +#: gui/options.cpp:642 msgid "AdLib is used for music in many games" msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" -#: gui/options.cpp:633 gui/options.cpp:634 +#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 +#: gui/options.cpp:653 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -995,17 +1050,18 @@ msgstr "" "Áîëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " "ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 +#: gui/options.cpp:665 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " "Timidity" -#: gui/options.cpp:650 +#: gui/options.cpp:650 gui/options.cpp:669 msgid "Use both MIDI and AdLib sound generation" msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" -#: gui/options.cpp:653 +#: gui/options.cpp:653 gui/options.cpp:672 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -1013,33 +1069,451 @@ msgstr "" "Îòìåòüòå ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû õîòèòå " "åãî èñïîëüçîâàòü" -#: gui/options.cpp:656 +#: gui/options.cpp:656 gui/options.cpp:675 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" -#: gui/options.cpp:685 +#: gui/options.cpp:685 gui/options.cpp:704 msgid "Show subtitles and play speech" msgstr "Ïîêàçûâàòü ñóáòèòðû è ïðîèãðûâàòü ðå÷ü" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "Special sound effects volume" msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" -#: gui/options.cpp:801 gui/options.cpp:802 +#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 +#: gui/options.cpp:821 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " "ëèáî ScummVM" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "GUI Language:" msgstr "ßçûê èíòåðôåéñà:" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "Language of ScummVM GUI" msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" -#: gui/options.cpp:612 gui/options.cpp:611 +#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 +#: gui/options.cpp:626 msgid "Specifies output sound device or sound card emulator" msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:110 +#, fuzzy +msgid " (Game)" +msgstr "Èãðà" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#, fuzzy +msgid "~L~eft handed mode" +msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +#, fuzzy +msgid "Zone" +msgstr "Íå çàäàí" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +#, fuzzy +msgid "Skip text" +msgstr "Ïðîïóñòèòü ñòðîêó" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +#, fuzzy +msgid "Fast mode" +msgstr "Ãðàôè÷åñêèé ðåæèì:" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +#, fuzzy +msgid "Virtual keyboard" +msgstr "Ïîêàçàòü êëàâèàòóðó" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "" + +#: backends/platform/symbian/src/SymbianOS.cpp:447 +msgid "Do you want to quit ?" +msgstr "" + +#: backends/platform/wii/options.cpp:47 +msgid "Ok" +msgstr "" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "" + +#: backends/platform/wii/options.cpp:54 +#, fuzzy +msgid "Current video mode:" +msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +#, fuzzy +msgid "Status:" +msgstr "Ïóñê" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +#, fuzzy +msgid "Unknown" +msgstr "Íåèçâåñòíàÿ îøèáêà" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:106 +#, fuzzy +msgid "Server:" +msgstr "Íèêîãäà" + +#: backends/platform/wii/options.cpp:110 +#, fuzzy +msgid "Share:" +msgstr "Ïîèñê:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr "" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +#, fuzzy +msgid "Sound on/off" +msgstr "SoundFont:" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +#, fuzzy +msgid "Zoom up" +msgstr "Ââåðõ" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +#, fuzzy +msgid "Bind Keys" +msgstr "Êëàâèøè" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +#, fuzzy +msgid "Do you want to load or save the game?" +msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü ýòî ñîõðàíåíèå?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +#, fuzzy +msgid "Using SDL driver " +msgstr "Äðàéâåð ìóçûêè:" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +#, fuzzy +msgid "Display " +msgstr "Ïîêàçàòü êëàâèàòóðó" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "" diff --git a/po/scummvm.pot b/po/scummvm.pot index 7c6675cd2a..a2b540637a 100755 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-12 19:52+0300\n" +"POT-Creation-Date: 2010-06-13 16:52+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,7 +35,8 @@ msgstr "" #: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 #: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 #: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 +#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 +#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "" @@ -48,6 +49,7 @@ msgid "Failed to load any GUI theme, aborting" msgstr "" #: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 +#: backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" @@ -69,7 +71,8 @@ msgstr "" #: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 #: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 +#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 +#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "" @@ -119,64 +122,73 @@ msgstr "" #: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 #: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 #: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 +#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 +#: gui/options.cpp:859 sound/mididrv.cpp:60 msgid "" msgstr "" -#: gui/launcher.cpp:191 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 msgid "Platform:" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "Graphics" msgstr "" #: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 +#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 +#: gui/options.cpp:783 msgid "GFX" msgstr "" -#: gui/launcher.cpp:205 +#: gui/launcher.cpp:205 gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "" #: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 +#: gui/launcher.cpp:213 gui/options.cpp:789 msgid "Audio" msgstr "" -#: gui/launcher.cpp:214 +#: gui/launcher.cpp:214 gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "" #: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 +#: gui/launcher.cpp:223 gui/options.cpp:793 msgid "Volume" msgstr "" -#: gui/launcher.cpp:224 +#: gui/launcher.cpp:224 gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "" #: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 +#: gui/launcher.cpp:232 gui/options.cpp:801 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:233 +#: gui/launcher.cpp:233 gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "" #: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 +#: gui/launcher.cpp:244 gui/options.cpp:807 msgid "Paths" msgstr "" -#: gui/launcher.cpp:249 +#: gui/launcher.cpp:249 gui/launcher.cpp:250 msgid "Game Path:" msgstr "" #: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 +#: gui/launcher.cpp:254 gui/options.cpp:820 msgid "Extra Path:" msgstr "" -#: gui/launcher.cpp:257 +#: gui/launcher.cpp:257 gui/launcher.cpp:258 msgid "Save Path:" msgstr "" @@ -192,16 +204,22 @@ msgstr "" #: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 #: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 #: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 +#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 +#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 +#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 +#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 +#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 +#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 msgid "None" msgstr "" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 +#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "" #: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 +#: gui/options.cpp:1037 gui/options.cpp:1056 msgid "Select SoundFont" msgstr "" @@ -222,6 +240,9 @@ msgid "This game ID is already taken. Please choose another one." msgstr "" #: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 msgid "Quit" msgstr "" @@ -262,6 +283,8 @@ msgid "Load game:" msgstr "" #: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "" @@ -272,10 +295,18 @@ msgid "" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Yes" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 msgid "No" msgstr "" @@ -387,131 +418,137 @@ msgstr "" msgid "Speech & Subs" msgstr "" -#: gui/options.cpp:595 gui/options.cpp:580 +#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:606 gui/options.cpp:591 +#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 msgid "Render mode:" msgstr "" -#: gui/options.cpp:616 gui/options.cpp:601 +#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:619 gui/options.cpp:604 +#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:626 gui/options.cpp:611 +#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 msgid "Music driver:" msgstr "" -#: gui/options.cpp:637 gui/options.cpp:622 +#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:648 gui/options.cpp:633 +#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 msgid "Output rate:" msgstr "" -#: gui/options.cpp:660 gui/options.cpp:645 +#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:650 +#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:668 gui/options.cpp:653 +#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:671 gui/options.cpp:656 +#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:674 gui/options.cpp:659 +#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:687 gui/options.cpp:672 +#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:691 gui/options.cpp:689 +#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:703 gui/options.cpp:701 +#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 msgid "Music volume:" msgstr "" -#: gui/options.cpp:710 gui/options.cpp:708 +#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 msgid "Mute All" msgstr "" -#: gui/options.cpp:713 gui/options.cpp:711 +#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:720 gui/options.cpp:718 +#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:797 gui/options.cpp:795 +#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 gui/options.cpp:798 +#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 gui/options.cpp:805 +#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 gui/options.cpp:810 +#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 msgid "Misc" msgstr "" -#: gui/options.cpp:814 gui/options.cpp:812 +#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 msgid "Theme:" msgstr "" -#: gui/options.cpp:818 gui/options.cpp:816 +#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:824 gui/options.cpp:822 +#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 msgid "Autosave:" msgstr "" #: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 +#: gui/options.cpp:849 msgid "Keys" msgstr "" -#: gui/options.cpp:844 gui/options.cpp:842 +#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 msgid "English" msgstr "" #: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 +#: gui/options.cpp:1008 msgid "Select directory for savegames" msgstr "" #: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 +#: gui/options.cpp:1015 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" #: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 +#: gui/options.cpp:1024 msgid "Select directory for GUI themes" msgstr "" #: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 +#: gui/options.cpp:1034 msgid "Select directory for extra files" msgstr "" #: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 +#: gui/options.cpp:1045 msgid "Select directory for plugins" msgstr "" @@ -593,11 +630,14 @@ msgstr "" msgid "Menu" msgstr "" -#: base/main.cpp:275 +#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "" -#: base/main.cpp:278 +#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "" @@ -670,6 +710,11 @@ msgid "Resume" msgstr "" #: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Save" msgstr "" @@ -693,7 +738,7 @@ msgstr "" msgid "Save game:" msgstr "" -#: gui/options.cpp:978 gui/options.cpp:976 +#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 msgid "You have to restart ScummVM to take the effect." msgstr "" @@ -709,79 +754,79 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 +#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 msgid "No music" msgstr "" -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 +#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 msgid "Windows MIDI" msgstr "" -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 +#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 msgid "ALSA" msgstr "" -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 +#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 msgid "Atari ST MIDI" msgstr "" -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 +#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 msgid "SEQ" msgstr "" -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 +#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 msgid "DMedia" msgstr "" -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 +#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 msgid "CAMD" msgstr "" -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 +#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 msgid "CoreAudio" msgstr "" -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 +#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 msgid "CoreMIDI" msgstr "" -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 +#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 msgid "Yamaha Pa1" msgstr "" -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 +#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 msgid "Tapwave Zodiac" msgstr "" -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 +#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 msgid "FluidSynth" msgstr "" -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 +#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 msgid "MT-32 Emulation" msgstr "" -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 +#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 msgid "AdLib" msgstr "" -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 +#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 msgid "PC Speaker" msgstr "" -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 +#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 msgid "IBM PCjr" msgstr "" -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 +#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 msgid "Creative Music System" msgstr "" -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 +#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 msgid "FM Towns" msgstr "" -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 +#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 msgid "TiMidity" msgstr "" @@ -845,11 +890,13 @@ msgstr "" msgid "~R~eturn to Launcher" msgstr "" -#: engines/dialogs.cpp:301 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "" -#: engines/dialogs.cpp:302 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "" @@ -866,26 +913,30 @@ msgid "~N~ext" msgstr "" #: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 gui/options.cpp:683 +#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 +#: gui/options.cpp:702 msgid "Speech" msgstr "" -#: gui/options.cpp:678 gui/options.cpp:684 +#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 +#: gui/options.cpp:703 msgid "Subtitles" msgstr "" -#: gui/options.cpp:679 gui/options.cpp:685 +#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 +#: gui/options.cpp:704 msgid "Both" msgstr "" -#: gui/options.cpp:683 +#: gui/options.cpp:683 gui/options.cpp:702 msgid "Spch" msgstr "" -#: gui/options.cpp:684 +#: gui/options.cpp:684 gui/options.cpp:703 msgid "Subs" msgstr "" @@ -901,7 +952,7 @@ msgstr "" msgid "Search in game list" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:647 +#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 msgid "Clear value" msgstr "" @@ -921,16 +972,17 @@ msgid "" "English" msgstr "" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:253 gui/launcher.cpp:254 +#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "" #: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 +#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Specifies where your savegames are put" msgstr "" @@ -962,11 +1014,12 @@ msgstr "" msgid "Remove game from the list. The game data files stay intact" msgstr "" -#: gui/options.cpp:591 gui/options.cpp:592 +#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 +#: gui/options.cpp:606 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:604 +#: gui/options.cpp:604 gui/options.cpp:618 msgid "Correct aspect ratio for 320x200 games" msgstr "" @@ -974,54 +1027,458 @@ msgstr "" msgid "Specifies output sound device or sound emulator" msgstr "" -#: gui/options.cpp:622 gui/options.cpp:623 +#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 +#: gui/options.cpp:642 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:633 gui/options.cpp:634 +#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 +#: gui/options.cpp:653 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 +#: gui/options.cpp:665 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:650 +#: gui/options.cpp:650 gui/options.cpp:669 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:653 +#: gui/options.cpp:653 gui/options.cpp:672 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:656 gui/options.cpp:675 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:685 +#: gui/options.cpp:685 gui/options.cpp:704 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:801 gui/options.cpp:802 +#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 +#: gui/options.cpp:821 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:837 +#: gui/options.cpp:837 gui/options.cpp:856 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:612 gui/options.cpp:611 +#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 +#: gui/options.cpp:626 msgid "Specifies output sound device or sound card emulator" msgstr "" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr "" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "" + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "" + +#: backends/platform/symbian/src/SymbianOS.cpp:447 +msgid "Do you want to quit ?" +msgstr "" + +#: backends/platform/wii/options.cpp:47 +msgid "Ok" +msgstr "" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr "" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr "" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "" -- cgit v1.2.3 From b6940caaaa59a534774425104f48733f8277d82b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:04:35 +0000 Subject: SCUMM: Added directory globs for in-depth search. The code was compied from AdvancedDetector. Currently it is set up to detect Mac indy3/loom which contains it data in Rooms 1, Roooms 2 and Rooms 3 directories. svn-id: r49798 --- engines/scumm/detection.cpp | 19 ++++++++++++++++--- engines/scumm/detection_tables.h | 9 +++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 21da732064..c164ac38fd 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -381,7 +381,7 @@ static void computeGameSettingsFromMD5(const Common::FSList &fslist, const GameF } } -static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map, int depth) { +static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map, int depth, const char **globs) { if (depth <= 0) return; @@ -395,10 +395,23 @@ static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map d.md5Entry = 0; fileMD5Map[file->getName()] = d; } else { + if (!directoryGlobs) + continue; + + bool matched = false; + for (const char *glob = *globs; *glob; glob++) + if (file->getName().matchString(glob, true)) { + matched = true; + break; + } + + if (!matched) + continue; + Common::FSList files; if (file->getChildren(files, Common::FSNode::kListAll)) { - composeFileHashMap(files, fileMD5Map, depth - 1); + composeFileHashMap(files, fileMD5Map, depth - 1, directoryGlobs); } } } @@ -410,7 +423,7 @@ static void detectGames(const Common::FSList &fslist, Common::Listgameid; ++gfp) { diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index 0b90af4ec4..db6d04b785 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -48,6 +48,15 @@ namespace Scumm { #pragma mark --- Tables --- #pragma mark - +/** + * This table contains list of directories which could contain game data + * and which should be looked into during detection. + */ +static const char *directoryGlobs[] = { + "rooms *", // Mac version of indy3/loom + 0 +}; + /** * This table contains all game IDs supported by the SCUMM engine, and maps -- cgit v1.2.3 From 2399f998a393b8c4cff6410da4bead1374674b08 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:05:52 +0000 Subject: i18n: Update Russian translation. svn-id: r49799 --- common/messages.cpp | 123 +++++++++++++++++++++++------ po/ru_RU.po | 223 ++++++++++++++++++++++++---------------------------- 2 files changed, 204 insertions(+), 142 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index ef4065d1f9..331d259859 100755 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -351,12 +351,17 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, - { 5, "\310\343\360\340" }, + { 4, " (\300\352\362\350\342\355\340\377)" }, + { 5, " (\310\343\360\373)" }, + { 6, " (\303\353\356\341\340\353\374\355\340\377)" }, { 7, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, { 8, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, + { 9, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, + { 10, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, { 11, "... \350\371\363 ..." }, { 12, "11 \352\303\366" }, { 13, "22 \352\303\366" }, @@ -380,8 +385,9 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 31, "\300\363\344\350\356" }, { 32, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, { 33, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 34, "\312\353\340\342\350\370\350" }, + { 34, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, { 35, "\302\361\270" }, + { 36, "\337\360\352\356\361\362\374:" }, { 37, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, { 38, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, { 39, "C2(\361\356\341\360\340\355 " }, @@ -390,7 +396,7 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 42, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, { 43, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, { 44, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 45, "\316\362\354\345\362\374\362\345 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 45, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, { 46, "\302\373\341\360\340\362\374" }, { 47, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, { 48, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, @@ -400,32 +406,49 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 52, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, { 53, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, { 54, "Creative Music System" }, - { 55, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 55, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, + { 56, "\312\363\360\361\356\360 \342\355\350\347" }, + { 57, "\312\363\360\361\356\360 \342\353\345\342\356" }, + { 58, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, + { 59, "\312\363\360\361\356\360 \342\342\345\360\365" }, { 60, "DMedia" }, + { 61, "DVD" }, + { 62, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, + { 63, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, { 64, "\304\340\362\340: " }, + { 65, "\316\362\353\340\344\367\350\352" }, { 66, "\317\356 \363\354\356\353\367\340\355\350\376" }, { 67, "\323\344\340\353\350\362\374" }, + { 68, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, { 69, "\301\345\347 \343\360\340\364\350\352\350" }, { 70, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, { 71, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 72, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 72, "\317\356\352\340\347\340\362\374 " }, { 73, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, { 74, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, { 75, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, { 76, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 77, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 77, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, + { 78, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, + { 79, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, + { 80, "\304\342\356\351\355\356\351 \363\344\340\360" }, + { 81, "\302\355\350\347" }, { 82, "\310\347\354. \350\343\360\363..." }, { 83, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, { 84, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, { 85, "English" }, { 86, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 87, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, { 88, "\304\356\357. \357\363\362\374:" }, { 89, "FM Towns" }, { 90, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 91, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 91, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, { 92, "FluidSynth" }, + { 93, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, { 94, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, { 95, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 96, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, + { 97, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, { 98, "\303\360\364" }, { 99, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, { 100, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, @@ -433,20 +456,34 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 102, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, { 103, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, { 104, "\317\363\362\374 \352 \350\343\360\345: " }, + { 105, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, { 106, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, { 107, "\302\342\345\360\365" }, { 108, "\303\360\340\364\350\352\340" }, { 109, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 110, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, { 111, "\317\356\354\356\371\374" }, - { 114, "\301\356\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 112, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, + { 113, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, + { 114, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, { 115, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 116, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, { 117, "IBM PCjr" }, { 118, "ID:" }, + { 119, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, + { 120, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, + { 121, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 122, "\302\342\356\344" }, { 123, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 124, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, + { 125, "\312\353\340\342\350\340\362\363\360\340" }, + { 126, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, { 127, "\312\353\340\342\350\370\350" }, { 128, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, { 129, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, { 130, "\337\347\373\352:" }, + { 131, "\302\353\345\342\356" }, + { 132, "\313\345\342\373\351 \371\345\353\367\356\352" }, { 133, "\307\340\343\360\363\347\350\362\374" }, { 134, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, { 135, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, @@ -454,16 +491,24 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 137, "MIDI" }, { 138, "\323\361\350\353\345\355\350\345 MIDI:" }, { 139, "\335\354\363\353\377\366\350\377 MT-32" }, + { 140, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, { 141, "\315\340\347\355\340\367\350\362\374" }, { 142, "\304\356\341. \354\355\356\343\356..." }, { 143, "\314\345\355\376" }, { 144, "\320\340\347\355\356\345" }, { 145, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 146, "\317\356\344\352\353\376\367\350\362\374 DVD" }, + { 147, "\317\356\344\352\353\376\367\350\362\374 SMB" }, { 148, "\312\353\350\352 \354\373\370\374\376" }, + { 149, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, { 150, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, { 151, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, { 152, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, { 153, "\315\340\347\342\340\355\350\345:" }, + { 154, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, + { 155, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, + { 156, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, + { 157, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, { 158, "\315\350\352\356\343\344\340" }, { 159, "\315\345\362" }, { 160, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, @@ -472,6 +517,7 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 163, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, { 164, "\315\345 \347\340\344\340\355" }, { 165, "OK" }, + { 166, "Ok" }, { 167, "\316\357\366\350\350" }, { 168, "\316\357\366\350\350..." }, { 169, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, @@ -480,6 +526,7 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 172, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, { 173, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, { 174, "PC \361\357\350\352\345\360" }, + { 175, "\317\340\360\356\353\374:" }, { 176, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, { 177, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, { 178, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, @@ -502,14 +549,20 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 195, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, { 196, "\317\360\356\344\356\353\346\350\362\374" }, { 197, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 198, "\302\357\360\340\342\356" }, + { 199, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 200, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 201, "\317\356\342\345\360\355\363\362\374" }, { 202, "SEQ" }, { 203, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 204, "SMB" }, { 205, "\307\340\357\350\361\340\362\374" }, { 206, "\317\363\362\374 \361\356\365\360.: " }, { 207, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, { 208, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, { 209, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, { 210, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 211, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, { 212, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, { 213, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, { 214, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, @@ -525,14 +578,20 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 224, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, { 225, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, { 226, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 228, "\315\350\352\356\343\344\340" }, - { 229, "\317\356\350\361\352:" }, - { 230, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\363\353\374\347\363\345\354\373\351 \344\353\377 \350\343\360\373 \342 \361\356\365\360\340\355\345\355\350\377 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 233, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \357\360\356\350\343\360\373\342\340\362\374 \360\345\367\374" }, + { 227, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, + { 228, "\321\345\360\342\345\360:" }, + { 229, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, + { 230, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 231, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 232, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, + { 233, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, + { 234, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, { 235, "\317\360\356\357\363\361\362\350\362\374" }, { 236, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 237, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 240, "SoundFont:" }, + { 237, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, + { 238, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, + { 239, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, + { 240, "\307\342\363\352 \342\352\353/\342\373\352\353" }, { 241, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, { 242, "SoundFont:" }, { 243, "\316\347\342" }, @@ -551,11 +610,13 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 256, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, { 257, "\317\363\361\352" }, { 258, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 259, "\317\363\361\352" }, + { 259, "\321\356\361\362\356\377\355\350\345:" }, { 260, "\321\363\341" }, { 261, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, { 262, "\321\363\341\362\350\362\360\373" }, { 263, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 264, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, + { 265, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, { 266, "Tapware Zodiac" }, { 267, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, { 268, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, @@ -565,16 +626,29 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 272, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, { 273, "TiMidity" }, { 274, "\302\360\345\354\377: " }, + { 275, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, + { 276, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, + { 277, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, + { 278, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, + { 279, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, { 280, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, { 281, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 282, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 282, "\315\345\350\347\342\345\361\362\355\356" }, { 283, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 284, "\316\362\352\353\376\367\350\362\374 DVD" }, + { 285, "\316\362\352\353\376\367\362\374 SMB" }, + { 286, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, { 287, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, { 288, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 289, "\302\342\345\360\365" }, { 290, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 291, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, { 292, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 294, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 297, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 293, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, + { 294, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, + { 295, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, + { 296, "\302\350\344\345\356" }, + { 297, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, { 298, "\303\360\356\354\352\356\361\362\374" }, { 299, "Windows MIDI" }, { 300, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, @@ -582,8 +656,9 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 302, "Yamaha Pa1" }, { 303, "\304\340" }, { 304, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 305, "\315\345 \347\340\344\340\355" }, - { 307, "\302\342\345\360\365" }, + { 305, "\307\356\355\340" }, + { 306, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, + { 307, "\323\342\345\353. \354\340\361\370\362\340\341" }, { 308, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, { 309, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, { 310, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, @@ -595,8 +670,9 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 316, "~\307~\340\352\360\373\362\374" }, { 317, "\310\347~\354~. \350\343\360\363..." }, { 318, "~\317~\356\354\356\371\374" }, + { 319, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, { 320, "~\312~\353\340\342\350\370\350" }, - { 321, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 321, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, { 322, "~\307~\340\343\360\363\347\350\362\374" }, { 323, "~\307~\340\343\360...." }, { 324, "~\321~\353\345\344" }, @@ -610,6 +686,9 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 332, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, { 333, "~\307~\340\357\350\361\340\362\374" }, { 334, "\317~\363~\361\352" }, + { 335, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, + { 336, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, + { 337, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, { -1, NULL } }; diff --git a/po/ru_RU.po b/po/ru_RU.po index c4dc4df396..1d1582962e 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2010-06-13 16:52+0300\n" -"PO-Revision-Date: 2010-06-08 08:52-0100\n" +"PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" @@ -966,8 +966,8 @@ msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" msgstr "" -"Êîðîòêèé èäåíòèôèêàòîð, èñïóëüçóåìûé äëÿ èãðû â ñîõðàíåíèÿ è äëÿ çàïóñêà èç " -"êîìàíäíîé ñòðîêè" +"Êîðîòêèé èäåíòèôèêàòîð, èñïîëüçóåìûé äëÿ èìåí ñîõðàíåíèé èãð è äëÿ çàïóñêà " +"èç êîìàíäíîé ñòðîêè" #: gui/launcher.cpp:177 gui/launcher.cpp:178 msgid "Full title of the game" @@ -1047,7 +1047,7 @@ msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -"Áîëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " +"ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " "ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" #: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 @@ -1066,8 +1066,8 @@ msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -"Îòìåòüòå ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû õîòèòå " -"åãî èñïîëüçîâàòü" +"Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " +"õîòèòå åãî èñïîëüçîâàòü" #: gui/options.cpp:656 gui/options.cpp:675 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" @@ -1076,7 +1076,7 @@ msgstr "" #: gui/options.cpp:685 gui/options.cpp:704 msgid "Show subtitles and play speech" -msgstr "Ïîêàçûâàòü ñóáòèòðû è ïðîèãðûâàòü ðå÷ü" +msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" #: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 #: gui/options.cpp:731 @@ -1105,415 +1105,398 @@ msgstr " #: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" -msgstr "" +msgstr "Ðåæèì áûñòðîãî ïåðåõîäà àêòèâèðîâàí" #: engines/mohawk/dialogs.cpp:82 msgid "~T~ransitions Enabled" -msgstr "" +msgstr "Ïåðåõîäû àêòèâèðîâàíû" #: engines/mohawk/dialogs.cpp:116 msgid "~W~ater Effect Enabled" -msgstr "" +msgstr "Ýôôåêòû âîäû âêëþ÷åíû" #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" -msgstr "" +msgstr "Òàáëèöà êëàâèø:" #: backends/keymapper/remap-dialog.cpp:66 msgid " (Active)" -msgstr "" +msgstr " (Àêòèâíàÿ)" #: backends/keymapper/remap-dialog.cpp:100 msgid " (Global)" -msgstr "" +msgstr " (Ãëîáàëüíàÿ)" #: backends/keymapper/remap-dialog.cpp:110 -#, fuzzy msgid " (Game)" -msgstr "Èãðà" +msgstr " (Èãðû)" #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" -msgstr "" +msgstr "Ãëàâíîå ìåíþ ScummVM" #: backends/platform/ds/arm9/source/dsoptions.cpp:63 -#, fuzzy msgid "~L~eft handed mode" -msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" +msgstr "Ëåâîðóêèé ðåæèì" #: backends/platform/ds/arm9/source/dsoptions.cpp:64 msgid "~I~ndy fight controls" -msgstr "" +msgstr "Óïðàâëåíèå áîÿìè â Indy" #: backends/platform/ds/arm9/source/dsoptions.cpp:65 msgid "Show mouse cursor" -msgstr "" +msgstr "Ïîêàçûâàòü êóðñîð ìûøè" #: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "Snap to edges" -msgstr "" +msgstr "Ïðèêðåïèòü ê ãðàíèöàì" #: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Touch X Offset" -msgstr "" +msgstr "Ñìåùåíèå êàñàíèé ïî îñè X" #: backends/platform/ds/arm9/source/dsoptions.cpp:75 msgid "Touch Y Offset" -msgstr "" +msgstr "Ñìåùåíèå êàñàíèé ïî îñè Y" #: backends/platform/ds/arm9/source/dsoptions.cpp:87 msgid "Use laptop trackpad-style cursor control" -msgstr "" +msgstr "Èñïîëüçîâàòü óïðàâëåíèå êóðñîðîì êàê íà òðåêïàäå ëåïòîïîâ" #: backends/platform/ds/arm9/source/dsoptions.cpp:88 msgid "Tap for left click, double tap right click" -msgstr "" +msgstr "Òàï äëÿ ëåâîãî ùåë÷êà, äâîéíîé òàï äëÿ ïðàâîãî ùåë÷êà" #: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Sensitivity" -msgstr "" +msgstr "×óâñòâèòåëüíîñòü" #: backends/platform/ds/arm9/source/dsoptions.cpp:99 msgid "Initial top screen scale:" -msgstr "" +msgstr "Íà÷àëüíûé ìàñøòàá âåðõíåãî ýêðàíà:" #: backends/platform/ds/arm9/source/dsoptions.cpp:105 msgid "Main screen scaling:" -msgstr "" +msgstr "Ìàñøòàá ãëàâíîãî ýêðàíà:" #: backends/platform/ds/arm9/source/dsoptions.cpp:107 msgid "Hardware scale (fast, but low quality)" -msgstr "" +msgstr "Õàðäâàðíîå ìàñøòàáèðîâàíèå (áûñòðî, íî íèçêîãî êà÷åñòâà)" #: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Software scale (good quality, but slower)" -msgstr "" +msgstr "Ïðîãðàììíîå ìàñøòàáèðîâàíèå (õîðîøåå êà÷åñòâî, íî ìåäëåííåå)" #: backends/platform/ds/arm9/source/dsoptions.cpp:109 msgid "Unscaled (you must scroll left and right)" -msgstr "" +msgstr "Áåç ìàñøòàáèðîâàíèÿ (íóæíî áóäåò ïðîêðó÷èâàòü âëåâî è âïðàâî)" #: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Brightness:" -msgstr "" +msgstr "ßðêîñòü:" #: backends/platform/ds/arm9/source/dsoptions.cpp:121 msgid "High quality audio (slower) (reboot)" -msgstr "" +msgstr "Âûñîêîå êà÷åñòâî çâóêà (ìåäëåííåå) (ðåáóò)" #: backends/platform/ds/arm9/source/dsoptions.cpp:122 msgid "Disable power off" -msgstr "" +msgstr "Çàïðåòèòü âûêëþ÷åíèå" #: backends/platform/iphone/osys_events.cpp:339 msgid "Touchpad mode enabled." -msgstr "" +msgstr "Ðåæèì òà÷ïàäà âêëþ÷åí." #: backends/platform/iphone/osys_events.cpp:341 msgid "Touchpad mode disabled." -msgstr "" +msgstr "Ðåæèì òà÷ïàäà âûêëþ÷åí." #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" -msgstr "" +msgstr "Ââåðõ" #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsSmartphone.cpp:39 msgid "Down" -msgstr "" +msgstr "Âíèç" #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:40 msgid "Left" -msgstr "" +msgstr "Âëåâî" #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:41 msgid "Right" -msgstr "" +msgstr "Âïðàâî" #: backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:59 #: backends/platform/wince/CEActionsSmartphone.cpp:42 msgid "Left Click" -msgstr "" +msgstr "Ëåâûé ùåë÷îê" #: backends/platform/symbian/src/SymbianActions.cpp:46 #: backends/platform/wince/CEActionsSmartphone.cpp:43 msgid "Right Click" -msgstr "" +msgstr "Ïðàâûé ùåë÷îê" #: backends/platform/symbian/src/SymbianActions.cpp:49 #: backends/platform/wince/CEActionsSmartphone.cpp:46 -#, fuzzy msgid "Zone" -msgstr "Íå çàäàí" +msgstr "Çîíà" #: backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:53 #: backends/platform/wince/CEActionsSmartphone.cpp:47 msgid "Multi Function" -msgstr "" +msgstr "Ìóëüòèôóíêöèÿ" #: backends/platform/symbian/src/SymbianActions.cpp:51 msgid "Swap character" -msgstr "" +msgstr "Ñìåíèòü ãåðîÿ" #: backends/platform/symbian/src/SymbianActions.cpp:52 -#, fuzzy msgid "Skip text" -msgstr "Ïðîïóñòèòü ñòðîêó" +msgstr "Ïðîïóñòèòü òåêñò" #: backends/platform/symbian/src/SymbianActions.cpp:54 -#, fuzzy msgid "Fast mode" -msgstr "Ãðàôè÷åñêèé ðåæèì:" +msgstr "Áûñòðûé ðåæèì" #: backends/platform/symbian/src/SymbianActions.cpp:56 msgid "Debugger" -msgstr "" +msgstr "Îòëàä÷èê" #: backends/platform/symbian/src/SymbianActions.cpp:57 msgid "Global menu" -msgstr "" +msgstr "Ãëîáàëüíîå ìåíþ" #: backends/platform/symbian/src/SymbianActions.cpp:58 -#, fuzzy msgid "Virtual keyboard" -msgstr "Ïîêàçàòü êëàâèàòóðó" +msgstr "Âèðòóàëüíàÿ êëàâèàòóðà" #: backends/platform/symbian/src/SymbianActions.cpp:59 msgid "Key mapper" -msgstr "" +msgstr "Íàçíà÷åíèå êëàâèø" #: backends/platform/symbian/src/SymbianOS.cpp:447 msgid "Do you want to quit ?" -msgstr "" +msgstr "Âû õîòèòå âûéòè?" #: backends/platform/wii/options.cpp:47 msgid "Ok" -msgstr "" +msgstr "Ok" #: backends/platform/wii/options.cpp:51 msgid "Video" -msgstr "" +msgstr "Âèäåî" #: backends/platform/wii/options.cpp:54 -#, fuzzy msgid "Current video mode:" -msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" +msgstr "Òåêóùèé âèäåîðåæèì:" #: backends/platform/wii/options.cpp:56 msgid "Double-strike" -msgstr "" +msgstr "Äâîéíîé óäàð" #: backends/platform/wii/options.cpp:60 msgid "Horizontal underscan:" -msgstr "" +msgstr "Ãîðèçîíòàëüíûé underscan:" #: backends/platform/wii/options.cpp:66 msgid "Vertical underscan:" -msgstr "" +msgstr "Âåðòèêàëüíûé underscan:" #: backends/platform/wii/options.cpp:71 msgid "Input" -msgstr "" +msgstr "Ââîä" #: backends/platform/wii/options.cpp:74 msgid "GC Pad sensitivity:" -msgstr "" +msgstr "×óâñòàèòåëüíîñòü GC ïàäà:" #: backends/platform/wii/options.cpp:80 msgid "GC Pad acceleration:" -msgstr "" +msgstr "Óñêîðåíèå GC ïàäà:" #: backends/platform/wii/options.cpp:86 msgid "DVD" -msgstr "" +msgstr "DVD" #: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 -#, fuzzy msgid "Status:" -msgstr "Ïóñê" +msgstr "Ñîñòîÿíèå:" #: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 -#, fuzzy msgid "Unknown" -msgstr "Íåèçâåñòíàÿ îøèáêà" +msgstr "Íåèçâåñòíî" #: backends/platform/wii/options.cpp:93 msgid "Mount DVD" -msgstr "" +msgstr "Ïîäêëþ÷èòü DVD" #: backends/platform/wii/options.cpp:94 msgid "Unmount DVD" -msgstr "" +msgstr "Îòêëþ÷èòü DVD" #: backends/platform/wii/options.cpp:98 msgid "SMB" -msgstr "" +msgstr "SMB" #: backends/platform/wii/options.cpp:106 -#, fuzzy msgid "Server:" -msgstr "Íèêîãäà" +msgstr "Ñåðâåð:" #: backends/platform/wii/options.cpp:110 -#, fuzzy msgid "Share:" -msgstr "Ïîèñê:" +msgstr "Ñåòåâàÿ ïàïêà:" #: backends/platform/wii/options.cpp:114 msgid "Username:" -msgstr "" +msgstr "Ïîëüçîâàòåëü:" #: backends/platform/wii/options.cpp:118 msgid "Password:" -msgstr "" +msgstr "Ïàðîëü:" #: backends/platform/wii/options.cpp:121 msgid "Init network" -msgstr "" +msgstr "Èíèöèàëèçàöèÿ ñåòè" #: backends/platform/wii/options.cpp:123 msgid "Mount SMB" -msgstr "" +msgstr "Ïîäêëþ÷èòü SMB" #: backends/platform/wii/options.cpp:124 msgid "Unmount SMB" -msgstr "" +msgstr "Îòêëþ÷òü SMB" #: backends/platform/wii/options.cpp:145 msgid "DVD Mounted successfully" -msgstr "" +msgstr "DVD ïîäêëþ÷åí óñïåøíî" #: backends/platform/wii/options.cpp:148 msgid "Error while mounting the DVD" -msgstr "" +msgstr "Îøèáêà âî âðåìÿ ïîäêëþ÷åíèÿ DVD" #: backends/platform/wii/options.cpp:150 msgid "DVD not mounted" -msgstr "" +msgstr "DVD íå ïîäêëþ÷åí" #: backends/platform/wii/options.cpp:163 msgid "Network up, share mounted" -msgstr "" +msgstr "Ñåòü ðàáîòàåò, ïàïêà ïîäêëþ÷åíà" #: backends/platform/wii/options.cpp:165 msgid "Network up" -msgstr "" +msgstr "Ñåòü ðàáîòàåò" #: backends/platform/wii/options.cpp:168 msgid ", error while mounting the share" -msgstr "" +msgstr ", îøèáêà âî âðåìÿ ïîäêëþ÷åíèÿ ïàïêè" #: backends/platform/wii/options.cpp:170 msgid ", share not mounted" -msgstr "" +msgstr ", ïàïêà íå ïîäêëþ÷åíà" #: backends/platform/wii/options.cpp:176 msgid "Network down" -msgstr "" +msgstr "Ñåòü âûêëþ÷åíà" #: backends/platform/wii/options.cpp:180 msgid "Initialising network" -msgstr "" +msgstr "Íàñòðàèâàþ ñåòü" #: backends/platform/wii/options.cpp:184 msgid "Timeout while initialising network" -msgstr "" +msgstr "Âðåìÿ ïîäêëþ÷åíèÿ ê ñåòè èñòåêëî" #: backends/platform/wii/options.cpp:188 #, c-format msgid "Network not initialsed (%d)" -msgstr "" +msgstr "Ñåòü íå íàñòðîåíà (%d)" #: backends/platform/wince/CEActionsPocket.cpp:45 msgid "Hide Toolbar" -msgstr "" +msgstr "Ñïðÿòàòü ïàíåëü èíñòðóìåíòîâ" #: backends/platform/wince/CEActionsPocket.cpp:46 msgid "Show Keyboard" -msgstr "" +msgstr "Ïîêàçàòü êëàâèàòóðó" #: backends/platform/wince/CEActionsPocket.cpp:47 -#, fuzzy msgid "Sound on/off" -msgstr "SoundFont:" +msgstr "Çâóê âêë/âûêë" #: backends/platform/wince/CEActionsPocket.cpp:48 msgid "Right click" -msgstr "" +msgstr "Ïðàâûé ùåë÷îê" #: backends/platform/wince/CEActionsPocket.cpp:49 msgid "Show/Hide Cursor" -msgstr "" +msgstr "Ïîêàçàòü/Óáðàòü êóðñîð" #: backends/platform/wince/CEActionsPocket.cpp:50 msgid "Free look" -msgstr "" +msgstr "Ñâîáîäíûé îáçîð" #: backends/platform/wince/CEActionsPocket.cpp:51 -#, fuzzy msgid "Zoom up" -msgstr "Ââåðõ" +msgstr "Óâåë. ìàñøòàá" #: backends/platform/wince/CEActionsPocket.cpp:52 msgid "Zoom down" -msgstr "" +msgstr "Óìåíüø. ìàñøòàá" #: backends/platform/wince/CEActionsPocket.cpp:54 #: backends/platform/wince/CEActionsSmartphone.cpp:48 -#, fuzzy msgid "Bind Keys" -msgstr "Êëàâèøè" +msgstr "Íàçíà÷èòü êëàâèøè" #: backends/platform/wince/CEActionsPocket.cpp:55 msgid "Cursor Up" -msgstr "" +msgstr "Êóðñîð ââåðõ" #: backends/platform/wince/CEActionsPocket.cpp:56 msgid "Cursor Down" -msgstr "" +msgstr "Êóðñîð âíèç" #: backends/platform/wince/CEActionsPocket.cpp:57 msgid "Cursor Left" -msgstr "" +msgstr "Êóðñîð âëåâî" #: backends/platform/wince/CEActionsPocket.cpp:58 msgid "Cursor Right" -msgstr "" +msgstr "Êóðñîð âïðàâî" #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 -#, fuzzy msgid "Do you want to load or save the game?" -msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü ýòî ñîõðàíåíèå?" +msgstr "Âû õîòèòå çàãðóçèòü ëèáî ñîõðàíèòü èãðó?" #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 msgid " Are you sure you want to quit ? " -msgstr "" +msgstr " Âû óâåðåíû, ÷òî õîòèòå âûéòè? " #: backends/platform/wince/CEActionsSmartphone.cpp:49 msgid "Keyboard" -msgstr "" +msgstr "Êëàâèàòóðà" #: backends/platform/wince/CEActionsSmartphone.cpp:50 msgid "Rotate" -msgstr "" +msgstr "Ïîâåðíóòü" #: backends/platform/wince/CELauncherDialog.cpp:58 -#, fuzzy msgid "Using SDL driver " -msgstr "Äðàéâåð ìóçûêè:" +msgstr "Èñïîëüçóþ äðàéâåð SDL " #: backends/platform/wince/CELauncherDialog.cpp:62 -#, fuzzy msgid "Display " -msgstr "Ïîêàçàòü êëàâèàòóðó" +msgstr "Ïîêàçàòü " #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Do you want to perform an automatic scan ?" -msgstr "" +msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" -- cgit v1.2.3 From ab901bccd06ea88fdd7c16f77e8f7e437092e9eb Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:06:14 +0000 Subject: Mention GUI improvements in NEWS. svn-id: r49800 --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index b0370098ec..db70d16ee0 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. - Added support for more original media layouts. - Added support for GUI localization. + - Improved GUI by adding tooltips and radiobuttons. + - Improved GUI usability by hiding more irrelevant options not supported by + specific games. AGI: - Fixed number of GFX glitches. -- cgit v1.2.3 From deb907de637b963af91aa530251fad5ad6b45025 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 15 Jun 2010 11:19:32 +0000 Subject: Bugfixes to depth processing that was causing the 'Microprose Design Group' message not to appear in the first intro scene svn-id: r49801 --- engines/m4/graphics.cpp | 10 +++++----- engines/m4/graphics.h | 9 ++++----- engines/m4/mads_views.cpp | 4 ++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 36de60af6c..d7a0c9edfc 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -400,8 +400,8 @@ void M4Surface::copyFrom(M4Surface *src, const Common::Rect &srcBounds, int dest * Copies a given image onto a destination surface with scaling, transferring only pixels that meet * the specified depth requirement on a secondary surface contain depth information */ -void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthsSurface, - int scale, int transparentColour) { +void M4Surface::copyFrom(M4Surface *src, int destX, int destY, Common::Point destAdjust, + int depth, M4Surface *depthsSurface, int scale, int transparentColour) { if (scale == 100) { // Copy the specified area @@ -426,8 +426,8 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surf byte *data = src->getBasePtr(); byte *srcPtr = data + (src->width() * copyRect.top + copyRect.left); byte *depthsData = depthsSurface->getBasePtr(); - byte *depthsPtr = depthsData + (src->width() * copyRect.top + copyRect.left); - byte *destPtr = (byte *)pixels + (destY * width()) + destX; + byte *depthsPtr = depthsData + (depthsSurface->pitch * destY) + destX; + byte *destPtr = (byte *)pixels + ((destY + destAdjust.y) * pitch) + destX + destAdjust.x; // 100% scaling variation for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) { @@ -520,7 +520,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surf if (spriteHeight <= 0) return; - byte *destPixelsP = this->getBasePtr(destX + spriteLeft, destY + spriteTop); + byte *destPixelsP = this->getBasePtr(destX + spriteLeft + destAdjust.x, destY + spriteTop + destAdjust.y); const byte *depthPixelsP = depthsSurface->getBasePtr(destX + spriteLeft, destY + spriteTop); spriteLeft = (spriteLeft * (normalFrame ? 1 : -1)); diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 6901b72e87..24c0edf223 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -157,10 +157,9 @@ public: void reset(); void frameRect(const Common::Rect &r, uint8 color); void fillRect(const Common::Rect &r, uint8 color); - void copyFrom(M4Surface *src, const Common::Rect &srcBounds, int destX, int destY, - int transparentColour = -1); - void copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthSurface, int scale, - int transparentColour = -1); + void copyFrom(M4Surface *src, const Common::Rect &srcBounds, int destX, int destY, int transparentColour = -1); + void copyFrom(M4Surface *src, int destX, int destY, Common::Point destAdjust, int depth, M4Surface *depthSurface, + int scale, int transparentColour = -1); void update() { if (_isScreen) { @@ -182,7 +181,7 @@ public: } inline void copyTo(M4Surface *dest, int destX, int destY, int depth, M4Surface *depthsSurface, int scale, int transparentColour = -1) { - dest->copyFrom(this, destX, destY, depth, depthsSurface, scale, transparentColour); + dest->copyFrom(this, destX, destY, Common::Point(0, 0), depth, depthsSurface, scale, transparentColour); } void scrollX(int xAmount); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index af4177e6bb..5a7abcf484 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -196,7 +196,7 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); - spr->copyTo(view, slot.xp, slot.yp + yOffset, slot.depth, _owner._depthSurface, slot.scale, 0); + view->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, slot.scale, 0); } else { int xp, yp; M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); @@ -211,7 +211,7 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { if (slot.depth > 1) { // Draw the frame with depth processing - spr->copyTo(view, xp, yp + yOffset, slot.depth, _owner._depthSurface, 100, 0); + view->copyFrom(spr, xp, yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, 100, 0); } else { // No depth, so simply draw the image spr->copyTo(view, xp, yp + yOffset, 0); -- cgit v1.2.3 From 079713c717cb06b93fbf7d8c510bec3151ab4b9b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:32:08 +0000 Subject: GUI: Fix crash svn-id: r49803 --- gui/options.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/options.cpp b/gui/options.cpp index bee06a4dce..f8ec722468 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -117,6 +117,7 @@ void OptionsDialog::init() { _speechVolumeLabel = 0; _muteCheckbox = 0; _subToggleDesc = 0; + _subToggleGroup = 0; _subToggleSubOnly = 0; _subToggleSpeechOnly = 0; _subToggleSubBoth = 0; -- cgit v1.2.3 From 103cb1b3baffbb1a480e5e1dccd6f98aaa97f591 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 15 Jun 2010 11:38:53 +0000 Subject: GUI: Fixed warnings svn-id: r49804 --- gui/options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index f8ec722468..792b99ba22 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -499,7 +499,7 @@ void OptionsDialog::setAudioSettingsState(bool enabled) { _midiPopUpDesc->setEnabled(enabled); _midiPopUp->setEnabled(enabled); - uint32 allFlags = MidiDriver::midiDriverFlags2GUIO(~0ul); + uint32 allFlags = MidiDriver::midiDriverFlags2GUIO((uint32)-1); if (_domain != Common::ConfigManager::kApplicationDomain && // global dialog (_guioptions & allFlags) && // No flags are specified @@ -628,7 +628,7 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); - uint32 allFlags = MidiDriver::midiDriverFlags2GUIO(~0ul); + uint32 allFlags = MidiDriver::midiDriverFlags2GUIO((uint32)-1); while (md->name) { if (_domain == Common::ConfigManager::kApplicationDomain || // global dialog -- cgit v1.2.3 From 5b484b5be7a9b9abbaf6b686e59b2ee9f88acb2d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 11:44:55 +0000 Subject: Fixed compilation when SCI32 code is not enabled svn-id: r49805 --- engines/sci/console.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 0c017af281..1c6f4461a8 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2191,6 +2191,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { break; case KSIG_REF: { switch (_engine->_gamestate->_segMan->getSegmentType(reg.segment)) { +#ifdef ENABLE_SCI32 case SEG_TYPE_STRING: { const SciString *str = _engine->_gamestate->_segMan->lookupString(reg); Common::hexdump((const byte *) str->getRawData(), str->getSize(), 16, 0); @@ -2201,6 +2202,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { Common::hexdump((const byte *) array->getRawData(), array->getSize(), 16, 0); break; } +#endif default: { int size; const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg); -- cgit v1.2.3 From 59d0035b033ac4791bfa91245418852a66e4e63a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 12:01:49 +0000 Subject: SCI: move portrait methods to gfxPaint16 svn-id: r49806 --- engines/sci/engine/kgraphics.cpp | 6 +++--- engines/sci/graphics/gui.cpp | 20 -------------------- engines/sci/graphics/gui.h | 4 ---- engines/sci/graphics/paint16.cpp | 20 ++++++++++++++++++++ engines/sci/graphics/paint16.h | 4 ++++ 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f025d03a09..cf6bd41fa9 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -698,7 +698,7 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { case 0: { // load if (argc == 2) { Common::String resourceName = s->_segMan->getString(argv[1]); - s->r_acc = g_sci->_gui->portraitLoad(resourceName); + s->r_acc = g_sci->_gfxPaint16->kernelPortraitLoad(resourceName); } else { warning("kPortrait(loadResource) called with unsupported argc %d", argc); } @@ -715,7 +715,7 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { uint seq = argv[8].toUint16() & 0xff; // argv[9] is usually 0??!! - g_sci->_gui->portraitShow(resourceName, position, resourceNum, noun, verb, cond, seq); + g_sci->_gfxPaint16->kernelPortraitShow(resourceName, position, resourceNum, noun, verb, cond, seq); return SIGNAL_REG; } else { warning("kPortrait(show) called with unsupported argc %d", argc); @@ -725,7 +725,7 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { case 2: { // unload if (argc == 2) { uint16 portraitId = argv[1].toUint16(); - g_sci->_gui->portraitUnload(portraitId); + g_sci->_gfxPaint16->kernelPortraitUnload(portraitId); } else { warning("kPortrait(unload) called with unsupported argc %d", argc); } diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 63ac6c0a05..677359c201 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -43,7 +43,6 @@ #include "sci/graphics/animate.h" #include "sci/graphics/controls.h" #include "sci/graphics/menu.h" -#include "sci/graphics/portrait.h" #include "sci/graphics/text16.h" #include "sci/graphics/transitions.h" #include "sci/graphics/view.h" @@ -112,23 +111,4 @@ void SciGui::textColors(int argc, reg_t *argv) { _text16->CodeSetColors(argc, argv); } -reg_t SciGui::portraitLoad(Common::String resourceName) { - //Portrait *myPortrait = new Portrait(g_sci->getResMan(), _screen, _palette, resourceName); - return NULL_REG; -} - -void SciGui::portraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { - Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), this, _screen, _palette, _audio, resourceName); - // TODO: cache portraits - // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates - // on kDrawCel, yeah this whole stuff makes sense) - position.x += _ports->getPort()->left; position.y += _ports->getPort()->top; - _screen->adjustToUpscaledCoordinates(position.y, position.x); - myPortrait->doit(position, resourceId, noun, verb, cond, seq); - delete myPortrait; -} - -void SciGui::portraitUnload(uint16 portraitId) { -} - } // End of namespace Sci diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h index 8e4abdf5b7..73c37de099 100644 --- a/engines/sci/graphics/gui.h +++ b/engines/sci/graphics/gui.h @@ -57,10 +57,6 @@ public: virtual void textFonts(int argc, reg_t *argv); virtual void textColors(int argc, reg_t *argv); - virtual reg_t portraitLoad(Common::String resourceName); - virtual void portraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); - virtual void portraitUnload(uint16 portraitId); - protected: GfxCursor *_cursor; EngineState *_s; diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 6a13f792cb..eb3fea969a 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -42,6 +42,7 @@ #include "sci/graphics/view.h" #include "sci/graphics/screen.h" #include "sci/graphics/palette.h" +#include "sci/graphics/portrait.h" #include "sci/graphics/text16.h" #include "sci/graphics/transitions.h" @@ -580,4 +581,23 @@ void GfxPaint16::kernelShakeScreen(uint16 shakeCount, uint16 directions) { } } +reg_t GfxPaint16::kernelPortraitLoad(Common::String resourceName) { + //Portrait *myPortrait = new Portrait(g_sci->getResMan(), _screen, _palette, resourceName); + return NULL_REG; +} + +void GfxPaint16::kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { + Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), this, _screen, _palette, _audio, resourceName); + // TODO: cache portraits + // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates + // on kDrawCel, yeah this whole stuff makes sense) + position.x += _ports->getPort()->left; position.y += _ports->getPort()->top; + _screen->adjustToUpscaledCoordinates(position.y, position.x); + myPortrait->doit(position, resourceId, noun, verb, cond, seq); + delete myPortrait; +} + +void GfxPaint16::kernelPortraitUnload(uint16 portraitId) { +} + } // End of namespace Sci diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 65f9dd0d9c..7a1a3bd7eb 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -91,6 +91,10 @@ public: void kernelShakeScreen(uint16 shakeCount, uint16 directions); + reg_t kernelPortraitLoad(Common::String resourceName); + void kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); + void kernelPortraitUnload(uint16 portraitId); + private: ResourceManager *_resMan; SegManager *_segMan; -- cgit v1.2.3 From 69bfbdfa0406cd12c2275d481e296cf4f1e3faad Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:08:40 +0000 Subject: SCI: Move ResourceSource to new header resource_intern.h svn-id: r49807 --- engines/sci/resource.cpp | 1 + engines/sci/resource.h | 29 +++------------------ engines/sci/resource_audio.cpp | 1 + engines/sci/resource_intern.h | 59 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 engines/sci/resource_intern.h diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 1906510d24..d25c3286df 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -28,6 +28,7 @@ #include "common/file.h" #include "sci/resource.h" +#include "sci/resource_intern.h" #include "sci/util.h" namespace Sci { diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 7fbb3ca9a2..e94eaf4d57 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -23,11 +23,10 @@ * */ -#ifndef SCI_SCICORE_RESOURCE_H -#define SCI_SCICORE_RESOURCE_H +#ifndef SCI_RESOURCE_H +#define SCI_RESOURCE_H #include "common/fs.h" -#include "common/macresman.h" #include "common/str.h" #include "sci/graphics/helpers.h" // for ViewType @@ -122,27 +121,7 @@ const char *getResourceTypeName(ResourceType restype); class ResourceManager; - -struct ResourceSource { - ResSourceType source_type; - bool scanned; - Common::String location_name; // FIXME: Replace by FSNode ? - const Common::FSNode *resourceFile; - int volume_number; - ResourceSource *associated_map; - uint32 audioCompressionType; - int32 *audioCompressionOffsetMapping; - Common::MacResManager macResMan; - ResourceSource() { - source_type = kSourceDirectory; - scanned = false; - resourceFile = 0; - volume_number = 0; - associated_map = NULL; - audioCompressionType = 0; - audioCompressionOffsetMapping = NULL; - } -}; +struct ResourceSource; class ResourceId { public: @@ -538,4 +517,4 @@ private: } // End of namespace Sci -#endif // SCI_SCICORE_RESOURCE_H +#endif // SCI_RESOURCE_H diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 0e60239331..d2f1d53e11 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -28,6 +28,7 @@ #include "common/file.h" #include "sci/resource.h" +#include "sci/resource_intern.h" #include "sci/util.h" namespace Sci { diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h new file mode 100644 index 0000000000..01f1f45180 --- /dev/null +++ b/engines/sci/resource_intern.h @@ -0,0 +1,59 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCI_RESOURCE_INTERN_H +#define SCI_RESOURCE_INTERN_H + +#include "common/macresman.h" + +#include "sci/resource.h" + +namespace Sci { + +struct ResourceSource { + ResSourceType source_type; + bool scanned; + Common::String location_name; // FIXME: Replace by FSNode ? + const Common::FSNode *resourceFile; + int volume_number; + ResourceSource *associated_map; + uint32 audioCompressionType; + int32 *audioCompressionOffsetMapping; + Common::MacResManager macResMan; + ResourceSource() { + source_type = kSourceDirectory; + scanned = false; + resourceFile = 0; + volume_number = 0; + associated_map = NULL; + audioCompressionType = 0; + audioCompressionOffsetMapping = NULL; + } +}; + + +} // End of namespace Sci + +#endif // SCI_RESOURCE_INTERN_H -- cgit v1.2.3 From e32f3d5a4344953d9fdec6b9bd1627a4eb8de156 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:09:03 +0000 Subject: SCI: cleanup svn-id: r49808 --- engines/sci/resource.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index e94eaf4d57..822d1d31f4 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -34,10 +34,7 @@ #include "sci/sci.h" namespace Common { -class ReadStream; -class WriteStream; class File; -class FSNode; } namespace Sci { @@ -192,6 +189,10 @@ public: byte *_header; uint32 _headerSize; + /** + * Write the resource to the specified stream. + * This method is used only by the "dump" debugger command. + */ void writeToStream(Common::WriteStream *stream) const; uint32 getAudioCompressionType(); -- cgit v1.2.3 From 98e1f1a193a27cad12a888c8375c523420b25cbe Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:09:30 +0000 Subject: SCI: Only use MacResManager if needed; start to OOPify ResourceSource svn-id: r49809 --- engines/sci/resource.cpp | 76 +++++++++++++++++++++++++----------------- engines/sci/resource_audio.cpp | 14 ++------ engines/sci/resource_intern.h | 26 +++++++-------- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index d25c3286df..0de1a3f2bd 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -26,6 +26,7 @@ // Resource library #include "common/file.h" +#include "common/macresman.h" #include "sci/resource.h" #include "sci/resource_intern.h" @@ -144,7 +145,7 @@ Resource::Resource() { Resource::~Resource() { delete[] data; - if (_source && _source->source_type == kSourcePatch) + if (_source && _source->getSourceType() == kSourcePatch) delete _source; } @@ -166,14 +167,33 @@ uint32 Resource::getAudioCompressionType() { return _source->audioCompressionType; } + +ResourceSource::ResourceSource(ResSourceType type) + : _sourceType(type) { + scanned = false; + resourceFile = 0; + volume_number = 0; + associated_map = NULL; + audioCompressionType = 0; + audioCompressionOffsetMapping = NULL; + + if (_sourceType == kSourceMacResourceFork) + _macResMan = new Common::MacResManager(); + else + _macResMan = NULL; +} + +ResourceSource::~ResourceSource() { + delete _macResMan; +} + //-- resMan helper functions -- // Resource source list management ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap); - newsrc->source_type = kSourceExtMap; newsrc->location_name = file_name; newsrc->volume_number = volume_nr; @@ -182,9 +202,8 @@ ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volum } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap); - newsrc->source_type = kSourceExtMap; newsrc->location_name = mapFile->getName(); newsrc->resourceFile = mapFile; newsrc->volume_number = volume_nr; @@ -194,9 +213,8 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const char *filename, int number) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(type); - newsrc->source_type = type; newsrc->location_name = filename; newsrc->volume_number = number; newsrc->associated_map = map; @@ -208,9 +226,8 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::FSNode *resFile, int number) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(type); - newsrc->source_type = type; newsrc->location_name = resFile->getName(); newsrc->resourceFile = resFile; newsrc->volume_number = number; @@ -223,9 +240,8 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addPatchDir(const char *dirname) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceDirectory); - newsrc->source_type = kSourceDirectory; newsrc->location_name = dirname; _sources.push_back(newsrc); @@ -235,7 +251,7 @@ ResourceSource *ResourceManager::addPatchDir(const char *dirname) { ResourceSource *ResourceManager::getVolume(ResourceSource *map, int volume_nr) { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) { ResourceSource *src = *it; - if ((src->source_type == kSourceVolume || src->source_type == kSourceAudioVolume) + if ((src->getSourceType() == kSourceVolume || src->getSourceType() == kSourceAudioVolume) && src->associated_map == map && src->volume_number == volume_nr) return src; } @@ -327,11 +343,12 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc static uint32 resTypeToMacTag(ResourceType type); void ResourceManager::loadResource(Resource *res) { - if (res->_source->source_type == kSourcePatch && loadFromPatchFile(res)) + if (res->_source->getSourceType() == kSourcePatch && loadFromPatchFile(res)) return; - if (res->_source->source_type == kSourceMacResourceFork) { - Common::SeekableReadStream *stream = res->_source->macResMan.getResource(resTypeToMacTag(res->_id.type), res->_id.number); + if (res->_source->getSourceType() == kSourceMacResourceFork) { + assert(res->_source->_macResMan); + Common::SeekableReadStream *stream = res->_source->_macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); if (!stream) error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); @@ -353,7 +370,7 @@ void ResourceManager::loadResource(Resource *res) { return; } - switch(res->_source->source_type) { + switch(res->_source->getSourceType()) { case kSourceWave: fileStream->seek(res->_fileOffset, SEEK_SET); loadFromWaveFile(res, fileStream); @@ -605,7 +622,7 @@ void ResourceManager::scanNewSources() { if (!source->scanned) { source->scanned = true; - switch (source->source_type) { + switch (source->getSourceType()) { case kSourceDirectory: readResourcePatches(source); @@ -874,7 +891,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) { rsrc = *it; - if (rsrc->source_type == kSourceExtMap) { + if (rsrc->getSourceType() == kSourceExtMap) { if (rsrc->resourceFile) { fileStream = rsrc->resourceFile->createReadStream(); } else { @@ -884,7 +901,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { fileStream = file; } break; - } else if (rsrc->source_type == kSourceMacResourceFork) + } else if (rsrc->getSourceType() == kSourceMacResourceFork) return kResVersionSci11Mac; } @@ -963,7 +980,7 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) { rsrc = *it; - if (rsrc->source_type == kSourceVolume) { + if (rsrc->getSourceType() == kSourceVolume) { if (rsrc->resourceFile) { fileStream = rsrc->resourceFile->createReadStream(); } else { @@ -973,7 +990,7 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { fileStream = file; } break; - } else if (rsrc->source_type == kSourceMacResourceFork) + } else if (rsrc->getSourceType() == kSourceMacResourceFork) return kResVersionSci11Mac; } @@ -1213,8 +1230,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { delete stream; } - psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; + psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = name; processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } @@ -1263,8 +1279,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { } if (bAdd) { - psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; + psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = name; processPatch(psrcPatch, (ResourceType)i, resourceNr); } @@ -1449,10 +1464,11 @@ static uint32 resTypeToMacTag(ResourceType type) { } int ResourceManager::readMacResourceFork(ResourceSource *source) { - if (!source->macResMan.open(source->location_name.c_str())) + assert(source->_macResMan); + if (!source->_macResMan->open(source->location_name.c_str())) error("%s is not a valid Mac resource fork", source->location_name.c_str()); - Common::MacResTagArray tagArray = source->macResMan.getResTagArray(); + Common::MacResTagArray tagArray = source->_macResMan->getResTagArray(); for (uint32 i = 0; i < tagArray.size(); i++) { ResourceType type = kResourceTypeInvalid; @@ -1467,11 +1483,11 @@ int ResourceManager::readMacResourceFork(ResourceSource *source) { if (type == kResourceTypeInvalid) continue; - Common::MacResIDArray idArray = source->macResMan.getResIDArray(tagArray[i]); + Common::MacResIDArray idArray = source->_macResMan->getResIDArray(tagArray[i]); for (uint32 j = 0; j < idArray.size(); j++) { // Get the size of the file - Common::SeekableReadStream *stream = source->macResMan.getResource(tagArray[i], idArray[j]); + Common::SeekableReadStream *stream = source->_macResMan->getResource(tagArray[i], idArray[j]); // Some IBIS resources have a size of 0, so we skip them if (!stream) @@ -1671,7 +1687,7 @@ ResourceCompression ResourceManager::getViewCompression() { if (!res) continue; - if (res->_source->source_type != kSourceVolume) + if (res->_source->getSourceType() != kSourceVolume) continue; fileStream = getVolumeFile(res->_source); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index d2f1d53e11..85758e9ef0 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -155,23 +155,15 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { gmPatchFile = "TALEGM.PAT"; if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { - ResourceSource *psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; - psrcPatch->resourceFile = 0; + ResourceSource *psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = gmPatchFile; - psrcPatch->audioCompressionType = 0; - psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, kResourceTypePatch, 4); } } void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { - ResourceSource *resSrc = new ResourceSource; - resSrc->source_type = kSourceWave; - resSrc->resourceFile = 0; + ResourceSource *resSrc = new ResourceSource(kSourceWave); resSrc->location_name = name; - resSrc->volume_number = 0; - resSrc->audioCompressionType = 0; Resource *newRes = 0; @@ -211,7 +203,7 @@ void ResourceManager::removeAudioResource(ResourceId resId) { if (_resMap.contains(resId)) { Resource *res = _resMap.getVal(resId); - if (res->_source->source_type == kSourceAudioVolume) { + if (res->_source->getSourceType() == kSourceAudioVolume) { if (res->_status == kResStatusLocked) { warning("Failed to remove resource %s (still in use)", resId.toString().c_str()); } else { diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 01f1f45180..89fde718d7 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -26,14 +26,16 @@ #ifndef SCI_RESOURCE_INTERN_H #define SCI_RESOURCE_INTERN_H -#include "common/macresman.h" - #include "sci/resource.h" +namespace Common { + class MacResManager; +} + namespace Sci { struct ResourceSource { - ResSourceType source_type; + const ResSourceType _sourceType; bool scanned; Common::String location_name; // FIXME: Replace by FSNode ? const Common::FSNode *resourceFile; @@ -41,16 +43,14 @@ struct ResourceSource { ResourceSource *associated_map; uint32 audioCompressionType; int32 *audioCompressionOffsetMapping; - Common::MacResManager macResMan; - ResourceSource() { - source_type = kSourceDirectory; - scanned = false; - resourceFile = 0; - volume_number = 0; - associated_map = NULL; - audioCompressionType = 0; - audioCompressionOffsetMapping = NULL; - } + Common::MacResManager *_macResMan; + +public: + + ResourceSource(ResSourceType type); + ~ResourceSource(); + + ResSourceType getSourceType() const { return _sourceType; } }; -- cgit v1.2.3 From dea38106f84873a62c4a342c564dbfe9f38ff480 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:09:51 +0000 Subject: SCI: Change ResourceSource to a class, further OOPify it. In particular, renamed location_name to _name and made it const and protected. Thus it cannot be changed after creation, and only read access is now possible, via a getter method. svn-id: r49810 --- engines/sci/resource.cpp | 62 ++++++++++++++++++------------------------ engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 12 ++++---- engines/sci/resource_intern.h | 11 +++++--- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 0de1a3f2bd..0d7e435aa0 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -168,8 +168,8 @@ uint32 Resource::getAudioCompressionType() { } -ResourceSource::ResourceSource(ResSourceType type) - : _sourceType(type) { +ResourceSource::ResourceSource(ResSourceType type, const Common::String &name) + : _sourceType(type), _name(name) { scanned = false; resourceFile = 0; volume_number = 0; @@ -192,9 +192,8 @@ ResourceSource::~ResourceSource() { // Resource source list management ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(kSourceExtMap); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap, file_name); - newsrc->location_name = file_name; newsrc->volume_number = volume_nr; _sources.push_back(newsrc); @@ -202,9 +201,8 @@ ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volum } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(kSourceExtMap); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap, mapFile->getName()); - newsrc->location_name = mapFile->getName(); newsrc->resourceFile = mapFile; newsrc->volume_number = volume_nr; @@ -213,9 +211,8 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const char *filename, int number) { - ResourceSource *newsrc = new ResourceSource(type); + ResourceSource *newsrc = new ResourceSource(type, filename); - newsrc->location_name = filename; newsrc->volume_number = number; newsrc->associated_map = map; if (type == kSourceAudioVolume) @@ -226,9 +223,8 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::FSNode *resFile, int number) { - ResourceSource *newsrc = new ResourceSource(type); + ResourceSource *newsrc = new ResourceSource(type, resFile->getName()); - newsrc->location_name = resFile->getName(); newsrc->resourceFile = resFile; newsrc->volume_number = number; newsrc->associated_map = map; @@ -240,9 +236,7 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addPatchDir(const char *dirname) { - ResourceSource *newsrc = new ResourceSource(kSourceDirectory); - - newsrc->location_name = dirname; + ResourceSource *newsrc = new ResourceSource(kSourceDirectory, dirname); _sources.push_back(newsrc); return 0; @@ -291,9 +285,9 @@ bool ResourceManager::loadPatch(Resource *res, Common::SeekableReadStream *file) bool ResourceManager::loadFromPatchFile(Resource *res) { Common::File file; - const char *filename = res->_source->location_name.c_str(); + const Common::String &filename = res->_source->getLocationName(); if (file.open(filename) == false) { - warning("Failed to open patch file %s", filename); + warning("Failed to open patch file %s", filename.c_str()); res->unalloc(); return false; } @@ -309,7 +303,7 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc if (source->resourceFile) return source->resourceFile->createReadStream(); - const char *filename = source->location_name.c_str(); + const char *filename = source->getLocationName().c_str(); // check if file is already opened while (it != _volumeFiles.end()) { @@ -365,7 +359,7 @@ void ResourceManager::loadResource(Resource *res) { Common::SeekableReadStream *fileStream = getVolumeFile(res->_source); if (!fileStream) { - warning("Failed to open %s", res->_source->location_name.c_str()); + warning("Failed to open %s", res->_source->getLocationName().c_str()); res->unalloc(); return; } @@ -896,7 +890,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { fileStream = rsrc->resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); - file->open(rsrc->location_name); + file->open(rsrc->getLocationName()); if (file->isOpen()) fileStream = file; } @@ -985,7 +979,7 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { fileStream = rsrc->resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); - file->open(rsrc->location_name); + file->open(rsrc->getLocationName()); if (file->isOpen()) fileStream = file; } @@ -1089,8 +1083,8 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource fileStream = source->resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); - if (!file->open(source->location_name)) { - warning("ResourceManager::processPatch(): failed to open %s", source->location_name.c_str()); + if (!file->open(source->getLocationName())) { + warning("ResourceManager::processPatch(): failed to open %s", source->getLocationName().c_str()); return; } fileStream = file; @@ -1098,7 +1092,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource int fsize = fileStream->size(); if (fsize < 3) { - debug("Patching %s failed - file too small", source->location_name.c_str()); + debug("Patching %s failed - file too small", source->getLocationName().c_str()); return; } @@ -1108,7 +1102,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource delete fileStream; if (patchType != checkForType) { - debug("Patching %s failed - resource type mismatch", source->location_name.c_str()); + debug("Patching %s failed - resource type mismatch", source->getLocationName().c_str()); return; } @@ -1132,7 +1126,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource if (patchDataOffset + 2 >= fsize) { debug("Patching %s failed - patch starting at offset %d can't be in file of size %d", - source->location_name.c_str(), patchDataOffset + 2, fsize); + source->getLocationName().c_str(), patchDataOffset + 2, fsize); return; } @@ -1150,7 +1144,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource newrsc->size = fsize - patchDataOffset - 2; newrsc->_headerSize = patchDataOffset; newrsc->_fileOffset = 0; - debugC(1, kDebugLevelResMan, "Patching %s - OK", source->location_name.c_str()); + debugC(1, kDebugLevelResMan, "Patching %s - OK", source->getLocationName().c_str()); } void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { @@ -1230,8 +1224,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { delete stream; } - psrcPatch = new ResourceSource(kSourcePatch); - psrcPatch->location_name = name; + psrcPatch = new ResourceSource(kSourcePatch, name); processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } } @@ -1279,8 +1272,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { } if (bAdd) { - psrcPatch = new ResourceSource(kSourcePatch); - psrcPatch->location_name = name; + psrcPatch = new ResourceSource(kSourcePatch, name); processPatch(psrcPatch, (ResourceType)i, resourceNr); } } @@ -1300,7 +1292,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { return SCI_ERROR_RESMAP_NOT_FOUND; } else { Common::File *file = new Common::File(); - if (!file->open(map->location_name)) + if (!file->open(map->getLocationName())) return SCI_ERROR_RESMAP_NOT_FOUND; fileStream = file; } @@ -1316,7 +1308,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { if (fileStream->eos() || fileStream->err()) { delete fileStream; - warning("Error while reading %s", map->location_name.c_str()); + warning("Error while reading %s", map->getLocationName().c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } if (offset == 0xFFFFFFFF) @@ -1360,7 +1352,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { return SCI_ERROR_RESMAP_NOT_FOUND; } else { Common::File *file = new Common::File(); - if (!file->open(map->location_name)) + if (!file->open(map->getLocationName())) return SCI_ERROR_RESMAP_NOT_FOUND; fileStream = file; } @@ -1407,7 +1399,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { } if (fileStream->eos() || fileStream->err()) { delete fileStream; - warning("Error while reading %s", map->location_name.c_str()); + warning("Error while reading %s", map->getLocationName().c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } resId = ResourceId((ResourceType)type, number); @@ -1465,8 +1457,8 @@ static uint32 resTypeToMacTag(ResourceType type) { int ResourceManager::readMacResourceFork(ResourceSource *source) { assert(source->_macResMan); - if (!source->_macResMan->open(source->location_name.c_str())) - error("%s is not a valid Mac resource fork", source->location_name.c_str()); + if (!source->_macResMan->open(source->getLocationName().c_str())) + error("%s is not a valid Mac resource fork", source->getLocationName().c_str()); Common::MacResTagArray tagArray = source->_macResMan->getResTagArray(); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 822d1d31f4..7677209d2d 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -118,7 +118,7 @@ const char *getResourceTypeName(ResourceType restype); class ResourceManager; -struct ResourceSource; +class ResourceSource; class ResourceId { public: diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 85758e9ef0..f7f5077455 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -37,7 +37,7 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { Common::SeekableReadStream *fileStream = getVolumeFile(source); if (!fileStream) { - warning("Failed to open %s", source->location_name.c_str()); + warning("Failed to open %s", source->getLocationName().c_str()); return; } @@ -155,15 +155,13 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { gmPatchFile = "TALEGM.PAT"; if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { - ResourceSource *psrcPatch = new ResourceSource(kSourcePatch); - psrcPatch->location_name = gmPatchFile; + ResourceSource *psrcPatch = new ResourceSource(kSourcePatch, gmPatchFile); processPatch(psrcPatch, kResourceTypePatch, 4); } } void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { - ResourceSource *resSrc = new ResourceSource(kSourceWave); - resSrc->location_name = name; + ResourceSource *resSrc = new ResourceSource(kSourceWave, name); Resource *newRes = 0; @@ -352,7 +350,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { int ResourceManager::readAudioMapSCI1(ResourceSource *map, bool unload) { Common::File file; - if (!file.open(map->location_name)) + if (!file.open(map->getLocationName())) return SCI_ERROR_RESMAP_NOT_FOUND; bool oldFormat = (file.readUint16LE() >> 11) == kResourceTypeAudio; @@ -364,7 +362,7 @@ int ResourceManager::readAudioMapSCI1(ResourceSource *map, bool unload) { uint32 size = file.readUint32LE(); if (file.eos() || file.err()) { - warning("Error while reading %s", map->location_name.c_str()); + warning("Error while reading %s", map->getLocationName().c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 89fde718d7..60cf1b99a4 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -34,10 +34,13 @@ namespace Common { namespace Sci { -struct ResourceSource { +class ResourceSource { +protected: const ResSourceType _sourceType; + const Common::String _name; + +public: bool scanned; - Common::String location_name; // FIXME: Replace by FSNode ? const Common::FSNode *resourceFile; int volume_number; ResourceSource *associated_map; @@ -46,11 +49,11 @@ struct ResourceSource { Common::MacResManager *_macResMan; public: - - ResourceSource(ResSourceType type); + ResourceSource(ResSourceType type, const Common::String &name); ~ResourceSource(); ResSourceType getSourceType() const { return _sourceType; } + const Common::String &getLocationName() const { return _name; } }; -- cgit v1.2.3 From 793c04f43b3d75b4b6d1ff2a2a93f2a496c0065f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:10:18 +0000 Subject: SCI: Changed some 'const char *' to Common::String svn-id: r49811 --- engines/sci/resource.cpp | 14 +++++++------- engines/sci/resource.h | 8 ++++---- engines/sci/resource_audio.cpp | 4 ++-- engines/sci/resource_intern.h | 1 - 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 0d7e435aa0..f60c6a3c96 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -191,8 +191,8 @@ ResourceSource::~ResourceSource() { // Resource source list management -ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(kSourceExtMap, file_name); +ResourceSource *ResourceManager::addExternalMap(const Common::String &filename, int volume_nr) { + ResourceSource *newsrc = new ResourceSource(kSourceExtMap, filename); newsrc->volume_number = volume_nr; @@ -210,7 +210,7 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const char *filename, int number) { +ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::String &filename, int number) { ResourceSource *newsrc = new ResourceSource(type, filename); newsrc->volume_number = number; @@ -235,7 +235,7 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty return newsrc; } -ResourceSource *ResourceManager::addPatchDir(const char *dirname) { +ResourceSource *ResourceManager::addPatchDir(const Common::String &dirname) { ResourceSource *newsrc = new ResourceSource(kSourceDirectory, dirname); _sources.push_back(newsrc); @@ -459,7 +459,7 @@ int ResourceManager::addAppropriateSources() { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(map, kSourceVolume, name.c_str(), number); + addSource(map, kSourceVolume, name, number); } #ifdef ENABLE_SCI32 // GK1CD hires content @@ -472,7 +472,7 @@ int ResourceManager::addAppropriateSources() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { Common::String filename = (*x)->getName(); - addSource(0, kSourceMacResourceFork, filename.c_str(), atoi(filename.c_str() + 4)); + addSource(0, kSourceMacResourceFork, filename, atoi(filename.c_str() + 4)); } #ifdef ENABLE_SCI32 // Mac SCI32 games have extra folders for patches @@ -504,7 +504,7 @@ int ResourceManager::addAppropriateSources() { int resNumber = atoi(strrchr(resName.c_str(), '.') + 1); if (mapNumber == resNumber) { - addSource(addExternalMap(mapName.c_str(), mapNumber), kSourceVolume, resName.c_str(), mapNumber); + addSource(addExternalMap(mapName, mapNumber), kSourceVolume, resName, mapNumber); break; } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 7677209d2d..9b498b59de 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -322,7 +322,7 @@ protected: * Add a path to the resource manager's list of sources. * @return a pointer to the added source structure, or NULL if an error occurred. */ - ResourceSource *addPatchDir(const char *path); + ResourceSource *addPatchDir(const Common::String &path); ResourceSource *getVolume(ResourceSource *map, int volume_nr); @@ -333,7 +333,7 @@ protected: * @param filename The name of the source to add * @return A pointer to the added source structure, or NULL if an error occurred. */ - ResourceSource *addSource(ResourceSource *map, ResSourceType type, const char *filename, + ResourceSource *addSource(ResourceSource *map, ResSourceType type, const Common::String &filename, int number); ResourceSource *addSource(ResourceSource *map, ResSourceType type, @@ -345,7 +345,7 @@ protected: * @param volume_nr The volume number the map starts at, 0 for volume_number = volume_nr; @@ -201,7 +201,7 @@ ResourceSource *ResourceManager::addExternalMap(const Common::String &filename, } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(kSourceExtMap, mapFile->getName()); + ResourceSource *newsrc = new ExtMapResourceSource(mapFile->getName()); newsrc->resourceFile = mapFile; newsrc->volume_number = volume_nr; @@ -236,7 +236,7 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addPatchDir(const Common::String &dirname) { - ResourceSource *newsrc = new ResourceSource(kSourceDirectory, dirname); + ResourceSource *newsrc = new DirectoryResourceSource(dirname); _sources.push_back(newsrc); return 0; @@ -1224,7 +1224,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { delete stream; } - psrcPatch = new ResourceSource(kSourcePatch, name); + psrcPatch = new PatchResourceSource(name); processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } } @@ -1272,7 +1272,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { } if (bAdd) { - psrcPatch = new ResourceSource(kSourcePatch, name); + psrcPatch = new PatchResourceSource(name); processPatch(psrcPatch, (ResourceType)i, resourceNr); } } diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 9721a884dc..1b001ad975 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -155,13 +155,13 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { gmPatchFile = "TALEGM.PAT"; if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { - ResourceSource *psrcPatch = new ResourceSource(kSourcePatch, gmPatchFile); + ResourceSource *psrcPatch = new PatchResourceSource(gmPatchFile); processPatch(psrcPatch, kResourceTypePatch, 4); } } void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { - ResourceSource *resSrc = new ResourceSource(kSourceWave, name); + ResourceSource *resSrc = new WaveResourceSource(name); Resource *newRes = 0; diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index ceae474b39..1a8e6ec747 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -50,12 +50,57 @@ public: public: ResourceSource(ResSourceType type, const Common::String &name); - ~ResourceSource(); + virtual ~ResourceSource(); ResSourceType getSourceType() const { return _sourceType; } const Common::String &getLocationName() const { return _name; } }; +class DirectoryResourceSource : public ResourceSource { +public: + DirectoryResourceSource(const Common::String &name) : ResourceSource(kSourceDirectory, name) {} +}; + +class PatchResourceSource : public ResourceSource { +public: + PatchResourceSource(const Common::String &name) : ResourceSource(kSourcePatch, name) {} +}; + +class VolumeResourceSource : public ResourceSource { +public: + VolumeResourceSource(const Common::String &name) : ResourceSource(kSourceVolume, name) {} +}; + +class ExtMapResourceSource : public ResourceSource { +public: + ExtMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtMap, name) {} +}; + +class IntMapResourceSource : public ResourceSource { +public: + IntMapResourceSource(const Common::String &name) : ResourceSource(kSourceIntMap, name) {} +}; + +class AudioVolumeResourceSource : public ResourceSource { +public: + AudioVolumeResourceSource(const Common::String &name) : ResourceSource(kSourceAudioVolume, name) {} +}; + +class ExtAudioMapResourceSource : public ResourceSource { +public: + ExtAudioMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtAudioMap, name) {} +}; + +class WaveResourceSource : public ResourceSource { +public: + WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {} +}; + +class MacResourceForkResourceSource : public ResourceSource { +public: + MacResourceForkResourceSource(const Common::String &name) : ResourceSource(kSourceMacResourceFork, name) {} +}; + } // End of namespace Sci #endif // SCI_RESOURCE_INTERN_H -- cgit v1.2.3 From 17a51121623a971b249cd33a8b581fe44b3e5616 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:11:04 +0000 Subject: SCI: Convert code to use ResourceSource subclasses svn-id: r49813 --- engines/sci/resource.cpp | 36 ++++++++++++++++++------------------ engines/sci/resource.h | 19 +++---------------- engines/sci/resource_audio.cpp | 4 ++-- engines/sci/resource_intern.h | 16 +++++++++++++++- 4 files changed, 38 insertions(+), 37 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 9691fa3f9c..83dd64339d 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -210,25 +210,25 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::String &filename, int number) { - ResourceSource *newsrc = new ResourceSource(type, filename); +ResourceSource *ResourceManager::addSource(ResourceSource *map, ResourceSource *newsrc, int number) { + assert(newsrc); newsrc->volume_number = number; newsrc->associated_map = map; - if (type == kSourceAudioVolume) + if (newsrc->getSourceType() == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); _sources.push_back(newsrc); return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::FSNode *resFile, int number) { - ResourceSource *newsrc = new ResourceSource(type, resFile->getName()); +ResourceSource *ResourceManager::addSource(ResourceSource *map, ResourceSource *newsrc, const Common::FSNode *resFile, int number) { + assert(newsrc); newsrc->resourceFile = resFile; newsrc->volume_number = number; newsrc->associated_map = map; - if (type == kSourceAudioVolume) + if (newsrc->getSourceType() == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); _sources.push_back(newsrc); @@ -459,12 +459,12 @@ int ResourceManager::addAppropriateSources() { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(map, kSourceVolume, name, number); + addSource(map, new VolumeResourceSource(name), number); } #ifdef ENABLE_SCI32 // GK1CD hires content if (Common::File::exists("alt.map") && Common::File::exists("resource.alt")) - addSource(addExternalMap("alt.map", 10), kSourceVolume, "resource.alt", 10); + addSource(addExternalMap("alt.map", 10), new VolumeResourceSource("resource.alt"), 10); #endif } else if (Common::File::exists("Data1")) { // Mac SCI1.1+ file naming scheme @@ -472,7 +472,7 @@ int ResourceManager::addAppropriateSources() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { Common::String filename = (*x)->getName(); - addSource(0, kSourceMacResourceFork, filename, atoi(filename.c_str() + 4)); + addSource(0, new MacResourceForkResourceSource(filename), atoi(filename.c_str() + 4)); } #ifdef ENABLE_SCI32 // Mac SCI32 games have extra folders for patches @@ -484,7 +484,7 @@ int ResourceManager::addAppropriateSources() { // There can also be a "Patches" resource fork with patches if (Common::File::exists("Patches")) - addSource(0, kSourceMacResourceFork, "Patches", 100); + addSource(0, new MacResourceForkResourceSource("Patches"), 100); } else { // SCI2.1-SCI3 file naming scheme Common::ArchiveMemberList mapFiles; @@ -504,7 +504,7 @@ int ResourceManager::addAppropriateSources() { int resNumber = atoi(strrchr(resName.c_str(), '.') + 1); if (mapNumber == resNumber) { - addSource(addExternalMap(mapName, mapNumber), kSourceVolume, resName, mapNumber); + addSource(addExternalMap(mapName, mapNumber), new VolumeResourceSource(resName), mapNumber); break; } } @@ -513,7 +513,7 @@ int ResourceManager::addAppropriateSources() { // SCI2.1 resource patches if (Common::File::exists("resmap.pat") && Common::File::exists("ressci.pat")) { // We add this resource with a map which surely won't exist - addSource(addExternalMap("resmap.pat", 100), kSourceVolume, "ressci.pat", 100); + addSource(addExternalMap("resmap.pat", 100), new VolumeResourceSource("ressci.pat"), 100); } } #else @@ -523,7 +523,7 @@ int ResourceManager::addAppropriateSources() { addPatchDir("."); if (Common::File::exists("message.map")) - addSource(addExternalMap("message.map"), kSourceVolume, "resource.msg", 0); + addSource(addExternalMap("message.map"), new VolumeResourceSource("resource.msg"), 0); return 1; } @@ -567,7 +567,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { #ifdef ENABLE_SCI32 if (sci21PatchMap && sci21PatchRes) - addSource(sci21PatchMap, kSourceVolume, sci21PatchRes, 100); + addSource(sci21PatchMap, new VolumeResourceSource(sci21PatchRes->getName()), sci21PatchRes, 100); #endif // Now find all the resource.0?? files @@ -582,7 +582,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { const char *dot = strrchr(filename.c_str(), '.'); int number = atoi(dot + 1); - addSource(map, kSourceVolume, file, number); + addSource(map, new VolumeResourceSource(file->getName()), file, number); } } @@ -597,12 +597,12 @@ int ResourceManager::addInternalSources() { Common::List::iterator itr = resources->begin(); while (itr != resources->end()) { - ResourceSource *src = addSource(NULL, kSourceIntMap, "MAP", itr->number); + ResourceSource *src = addSource(NULL, new IntMapResourceSource("MAP"), itr->number); if ((itr->number == 65535) && Common::File::exists("RESOURCE.SFX")) - addSource(src, kSourceAudioVolume, "RESOURCE.SFX", 0); + addSource(src, new AudioVolumeResourceSource("RESOURCE.SFX"), 0); else if (Common::File::exists("RESOURCE.AUD")) - addSource(src, kSourceAudioVolume, "RESOURCE.AUD", 0); + addSource(src, new AudioVolumeResourceSource("RESOURCE.AUD"), 0); ++itr; } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 9b498b59de..cb43c9e13a 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -69,18 +69,6 @@ enum { MAX_OPENED_VOLUMES = 5 ///< Max number of simultaneously opened volumes }; -enum ResSourceType { - kSourceDirectory = 0, - kSourcePatch, - kSourceVolume, - kSourceExtMap, - kSourceIntMap, - kSourceAudioVolume, - kSourceExtAudioMap, - kSourceWave, - kSourceMacResourceFork -}; - enum ResourceType { kResourceTypeView = 0, kResourceTypePic, @@ -329,14 +317,13 @@ protected: /** * Adds a source to the resource manager's list of sources. * @param map The map associated with this source - * @param type The source type - * @param filename The name of the source to add + * @param source The new source to add * @return A pointer to the added source structure, or NULL if an error occurred. */ - ResourceSource *addSource(ResourceSource *map, ResSourceType type, const Common::String &filename, + ResourceSource *addSource(ResourceSource *map, ResourceSource *source, int number); - ResourceSource *addSource(ResourceSource *map, ResSourceType type, + ResourceSource *addSource(ResourceSource *map, ResourceSource *source, const Common::FSNode *resFile, int number); /** diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 1b001ad975..416e4ea361 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -433,7 +433,7 @@ void ResourceManager::setAudioLanguage(int language) { return; } - _audioMapSCI1 = addSource(NULL, kSourceExtAudioMap, fullname, language); + _audioMapSCI1 = addSource(NULL, new ExtAudioMapResourceSource(fullname), language); // Search for audio volumes for this language and add them to the source list Common::ArchiveMemberList files; @@ -443,7 +443,7 @@ void ResourceManager::setAudioLanguage(int language) { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(_audioMapSCI1, kSourceAudioVolume, name, number); + addSource(_audioMapSCI1, new AudioVolumeResourceSource(name), number); } scanNewSources(); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 1a8e6ec747..c3642cda1b 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -34,6 +34,19 @@ namespace Common { namespace Sci { +enum ResSourceType { + kSourceDirectory = 0, + kSourcePatch, + kSourceVolume, + kSourceExtMap, + kSourceIntMap, + kSourceAudioVolume, + kSourceExtAudioMap, + kSourceWave, + kSourceMacResourceFork +}; + + class ResourceSource { protected: const ResSourceType _sourceType; @@ -48,8 +61,9 @@ public: int32 *audioCompressionOffsetMapping; Common::MacResManager *_macResMan; -public: +protected: ResourceSource(ResSourceType type, const Common::String &name); +public: virtual ~ResourceSource(); ResSourceType getSourceType() const { return _sourceType; } -- cgit v1.2.3 From 8c06425ee3cac66469c817ab96cd0ab3688cdae6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:11:30 +0000 Subject: SCI: Remove 'map' param from addSource, and let AudioVolumeResourceSource subclass VolumeResourceSource svn-id: r49814 --- engines/sci/resource.cpp | 30 ++++++++++++++---------------- engines/sci/resource.h | 7 ++----- engines/sci/resource_audio.cpp | 4 ++-- engines/sci/resource_intern.h | 13 +++++++++---- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 83dd64339d..08ca46f881 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -210,11 +210,10 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *map, ResourceSource *newsrc, int number) { +ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, int number) { assert(newsrc); newsrc->volume_number = number; - newsrc->associated_map = map; if (newsrc->getSourceType() == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); @@ -222,12 +221,11 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResourceSource * return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *map, ResourceSource *newsrc, const Common::FSNode *resFile, int number) { +ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common::FSNode *resFile, int number) { assert(newsrc); newsrc->resourceFile = resFile; newsrc->volume_number = number; - newsrc->associated_map = map; if (newsrc->getSourceType() == kSourceAudioVolume) checkIfAudioVolumeIsCompressed(newsrc); @@ -459,12 +457,12 @@ int ResourceManager::addAppropriateSources() { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(map, new VolumeResourceSource(name), number); + addSource(new VolumeResourceSource(name, map), number); } #ifdef ENABLE_SCI32 // GK1CD hires content if (Common::File::exists("alt.map") && Common::File::exists("resource.alt")) - addSource(addExternalMap("alt.map", 10), new VolumeResourceSource("resource.alt"), 10); + addSource(new VolumeResourceSource("resource.alt", addExternalMap("alt.map", 10)), 10); #endif } else if (Common::File::exists("Data1")) { // Mac SCI1.1+ file naming scheme @@ -472,7 +470,7 @@ int ResourceManager::addAppropriateSources() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { Common::String filename = (*x)->getName(); - addSource(0, new MacResourceForkResourceSource(filename), atoi(filename.c_str() + 4)); + addSource(new MacResourceForkResourceSource(filename), atoi(filename.c_str() + 4)); } #ifdef ENABLE_SCI32 // Mac SCI32 games have extra folders for patches @@ -484,7 +482,7 @@ int ResourceManager::addAppropriateSources() { // There can also be a "Patches" resource fork with patches if (Common::File::exists("Patches")) - addSource(0, new MacResourceForkResourceSource("Patches"), 100); + addSource(new MacResourceForkResourceSource("Patches"), 100); } else { // SCI2.1-SCI3 file naming scheme Common::ArchiveMemberList mapFiles; @@ -504,7 +502,7 @@ int ResourceManager::addAppropriateSources() { int resNumber = atoi(strrchr(resName.c_str(), '.') + 1); if (mapNumber == resNumber) { - addSource(addExternalMap(mapName, mapNumber), new VolumeResourceSource(resName), mapNumber); + addSource(new VolumeResourceSource(resName, addExternalMap(mapName, mapNumber)), mapNumber); break; } } @@ -513,7 +511,7 @@ int ResourceManager::addAppropriateSources() { // SCI2.1 resource patches if (Common::File::exists("resmap.pat") && Common::File::exists("ressci.pat")) { // We add this resource with a map which surely won't exist - addSource(addExternalMap("resmap.pat", 100), new VolumeResourceSource("ressci.pat"), 100); + addSource(new VolumeResourceSource("ressci.pat", addExternalMap("resmap.pat", 100)), 100); } } #else @@ -523,7 +521,7 @@ int ResourceManager::addAppropriateSources() { addPatchDir("."); if (Common::File::exists("message.map")) - addSource(addExternalMap("message.map"), new VolumeResourceSource("resource.msg"), 0); + addSource(new VolumeResourceSource("resource.msg", addExternalMap("message.map")), 0); return 1; } @@ -567,7 +565,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { #ifdef ENABLE_SCI32 if (sci21PatchMap && sci21PatchRes) - addSource(sci21PatchMap, new VolumeResourceSource(sci21PatchRes->getName()), sci21PatchRes, 100); + addSource(new VolumeResourceSource(sci21PatchRes->getName(), sci21PatchMap), sci21PatchRes, 100); #endif // Now find all the resource.0?? files @@ -582,7 +580,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { const char *dot = strrchr(filename.c_str(), '.'); int number = atoi(dot + 1); - addSource(map, new VolumeResourceSource(file->getName()), file, number); + addSource(new VolumeResourceSource(file->getName(), map), file, number); } } @@ -597,12 +595,12 @@ int ResourceManager::addInternalSources() { Common::List::iterator itr = resources->begin(); while (itr != resources->end()) { - ResourceSource *src = addSource(NULL, new IntMapResourceSource("MAP"), itr->number); + ResourceSource *src = addSource(new IntMapResourceSource("MAP"), itr->number); if ((itr->number == 65535) && Common::File::exists("RESOURCE.SFX")) - addSource(src, new AudioVolumeResourceSource("RESOURCE.SFX"), 0); + addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src), 0); else if (Common::File::exists("RESOURCE.AUD")) - addSource(src, new AudioVolumeResourceSource("RESOURCE.AUD"), 0); + addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src), 0); ++itr; } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index cb43c9e13a..67cc4d3c1f 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -316,15 +316,12 @@ protected: /** * Adds a source to the resource manager's list of sources. - * @param map The map associated with this source * @param source The new source to add * @return A pointer to the added source structure, or NULL if an error occurred. */ - ResourceSource *addSource(ResourceSource *map, ResourceSource *source, - int number); + ResourceSource *addSource(ResourceSource *source, int number); - ResourceSource *addSource(ResourceSource *map, ResourceSource *source, - const Common::FSNode *resFile, int number); + ResourceSource *addSource(ResourceSource *source, const Common::FSNode *resFile, int number); /** * Add an external (i.e., separate file) map resource to the resource manager's list of sources. diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 416e4ea361..36084087fd 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -433,7 +433,7 @@ void ResourceManager::setAudioLanguage(int language) { return; } - _audioMapSCI1 = addSource(NULL, new ExtAudioMapResourceSource(fullname), language); + _audioMapSCI1 = addSource(new ExtAudioMapResourceSource(fullname), language); // Search for audio volumes for this language and add them to the source list Common::ArchiveMemberList files; @@ -443,7 +443,7 @@ void ResourceManager::setAudioLanguage(int language) { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(_audioMapSCI1, new AudioVolumeResourceSource(name), number); + addSource(new AudioVolumeResourceSource(name, _audioMapSCI1), number); } scanNewSources(); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index c3642cda1b..e0d7cdcf87 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -56,7 +56,7 @@ public: bool scanned; const Common::FSNode *resourceFile; int volume_number; - ResourceSource *associated_map; + ResourceSource *associated_map; // TODO: Move to VolumeResourceSource uint32 audioCompressionType; int32 *audioCompressionOffsetMapping; Common::MacResManager *_macResMan; @@ -82,7 +82,10 @@ public: class VolumeResourceSource : public ResourceSource { public: - VolumeResourceSource(const Common::String &name) : ResourceSource(kSourceVolume, name) {} + VolumeResourceSource(const Common::String &name, ResourceSource *map, ResSourceType type = kSourceVolume) + : ResourceSource(type, name) { + associated_map = map; + } }; class ExtMapResourceSource : public ResourceSource { @@ -95,9 +98,11 @@ public: IntMapResourceSource(const Common::String &name) : ResourceSource(kSourceIntMap, name) {} }; -class AudioVolumeResourceSource : public ResourceSource { +class AudioVolumeResourceSource : public VolumeResourceSource { public: - AudioVolumeResourceSource(const Common::String &name) : ResourceSource(kSourceAudioVolume, name) {} + AudioVolumeResourceSource(const Common::String &name, ResourceSource *map) + : VolumeResourceSource(name, map, kSourceAudioVolume) { + } }; class ExtAudioMapResourceSource : public ResourceSource { -- cgit v1.2.3 From 89cf6f7cb1b8336931b46e714b403f9bfe9af128 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:11:56 +0000 Subject: SCI: Change ResourceManager::getVolume() to use new classes * Add new ResourceSource::findVolume() virtual method * Rename ResourceManager::getVolume() to findVolume(), and change it to use the new ResourceSource method * Add some TODO comments pointing to further OOPification possibilities svn-id: r49815 --- engines/sci/resource.cpp | 29 +++++++++++++++++++---------- engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 4 ++-- engines/sci/resource_intern.h | 16 +++++++++++++--- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 08ca46f881..44b4525cd2 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -214,8 +214,13 @@ ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, int number) { assert(newsrc); newsrc->volume_number = number; - if (newsrc->getSourceType() == kSourceAudioVolume) + if (newsrc->getSourceType() == kSourceAudioVolume) { + // TODO: Move this call into the AudioVolumeResourceSource constructor. + // Need to verify if this is safe, though; in particular, whether this + // method may be called before the new AudioVolumeResourceSource has been + // added to the _sources lists. checkIfAudioVolumeIsCompressed(newsrc); + } _sources.push_back(newsrc); return newsrc; @@ -226,8 +231,13 @@ ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common: newsrc->resourceFile = resFile; newsrc->volume_number = number; - if (newsrc->getSourceType() == kSourceAudioVolume) + if (newsrc->getSourceType() == kSourceAudioVolume) { + // TODO: Move this call into the AudioVolumeResourceSource constructor. + // Need to verify if this is safe, though; in particular, whether this + // method may be called before the new AudioVolumeResourceSource has been + // added to the _sources lists. checkIfAudioVolumeIsCompressed(newsrc); + } _sources.push_back(newsrc); return newsrc; @@ -240,11 +250,10 @@ ResourceSource *ResourceManager::addPatchDir(const Common::String &dirname) { return 0; } -ResourceSource *ResourceManager::getVolume(ResourceSource *map, int volume_nr) { +ResourceSource *ResourceManager::findVolume(ResourceSource *map, int volume_nr) { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) { - ResourceSource *src = *it; - if ((src->getSourceType() == kSourceVolume || src->getSourceType() == kSourceAudioVolume) - && src->associated_map == map && src->volume_number == volume_nr) + ResourceSource *src = (*it)->findVolume(map, volume_nr); + if (src) return src; } @@ -908,7 +917,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { // check if 0 or 01 - try to read resources in SCI0 format and see if exists fileStream->seek(0, SEEK_SET); while (fileStream->read(buff, 6) == 6 && !(buff[0] == 0xFF && buff[1] == 0xFF && buff[2] == 0xFF)) { - if (getVolume(rsrc, (buff[5] & 0xFC) >> 2) == NULL) + if (findVolume(rsrc, (buff[5] & 0xFC) >> 2) == NULL) return kResVersionSci1Middle; } return kResVersionSci0Sci1Early; @@ -1318,7 +1327,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { // adding a new resource if (_resMap.contains(resId) == false) { res = new Resource; - res->_source = getVolume(map, offset >> bShift); + res->_source = findVolume(map, offset >> bShift); if (!res->_source) { warning("Could not get volume for resource %d, VolumeID %d", id, offset >> bShift); if (_mapVersion != _volVersion) { @@ -1327,7 +1336,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { _mapVersion = _volVersion; bMask = (_mapVersion == kResVersionSci1Middle) ? 0xF0 : 0xFC; bShift = (_mapVersion == kResVersionSci1Middle) ? 28 : 26; - res->_source = getVolume(map, offset >> bShift); + res->_source = findVolume(map, offset >> bShift); } } res->_fileOffset = offset & (((~bMask) << 24) | 0xFFFFFF); @@ -1411,7 +1420,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers // need to be used in concurrence with the volume specified in the map to get // the actual resource file. - res->_source = getVolume(map, volume_nr + map->volume_number); + res->_source = findVolume(map, volume_nr + map->volume_number); res->_fileOffset = off; } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 67cc4d3c1f..826fbff850 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -312,7 +312,7 @@ protected: */ ResourceSource *addPatchDir(const Common::String &path); - ResourceSource *getVolume(ResourceSource *map, int volume_nr); + ResourceSource *findVolume(ResourceSource *map, int volume_nr); /** * Adds a source to the resource manager's list of sources. diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 36084087fd..7d716f0f20 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -260,7 +260,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { return SCI_ERROR_RESMAP_NOT_FOUND; } - ResourceSource *src = getVolume(map, 0); + ResourceSource *src = findVolume(map, 0); if (!src) return SCI_ERROR_NO_RESOURCE_FILES_FOUND; @@ -380,7 +380,7 @@ int ResourceManager::readAudioMapSCI1(ResourceSource *map, bool unload) { offset &= 0x0fffffff; // least significant 28 bits } - ResourceSource *src = getVolume(map, volume_nr); + ResourceSource *src = findVolume(map, volume_nr); if (src) { if (unload) diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index e0d7cdcf87..15fd5c391d 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -57,9 +57,9 @@ public: const Common::FSNode *resourceFile; int volume_number; ResourceSource *associated_map; // TODO: Move to VolumeResourceSource - uint32 audioCompressionType; - int32 *audioCompressionOffsetMapping; - Common::MacResManager *_macResMan; + uint32 audioCompressionType; // TODO: Move to AudioVolumeResourceSource + int32 *audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource + Common::MacResManager *_macResMan; // TODO: Move to MacResourceForkResourceSource protected: ResourceSource(ResSourceType type, const Common::String &name); @@ -68,6 +68,10 @@ public: ResSourceType getSourceType() const { return _sourceType; } const Common::String &getLocationName() const { return _name; } + + virtual ResourceSource *findVolume(ResourceSource *map, int volume_nr) { + return NULL; + }; }; class DirectoryResourceSource : public ResourceSource { @@ -86,6 +90,12 @@ public: : ResourceSource(type, name) { associated_map = map; } + + virtual ResourceSource *findVolume(ResourceSource *map, int volume_nr) { + if (associated_map == map && volume_number == volume_nr) + return this; + return NULL; + }; }; class ExtMapResourceSource : public ResourceSource { -- cgit v1.2.3 From 055ee6ab5b51c0e0fbaa8e6e9e66850ac48504aa Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:12:21 +0000 Subject: SCI: Add virtual method ResourceSource::scanSource svn-id: r49816 --- engines/sci/resource.cpp | 59 +++++++++++++++++++++++-------------------- engines/sci/resource.h | 9 +++++++ engines/sci/resource_intern.h | 16 ++++++++++++ 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 44b4525cd2..74f99ecd03 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -623,38 +623,41 @@ void ResourceManager::scanNewSources() { if (!source->scanned) { source->scanned = true; - switch (source->getSourceType()) { - case kSourceDirectory: - readResourcePatches(source); - - // We can't use getSciVersion() at this point, thus using _volVersion - if (_volVersion >= kResVersionSci11) // SCI1.1+ - readResourcePatchesBase36(source); - - readWaveAudioPatches(); - break; - case kSourceExtMap: - if (_mapVersion < kResVersionSci1Late) - readResourceMapSCI0(source); - else - readResourceMapSCI1(source); - break; - case kSourceExtAudioMap: - readAudioMapSCI1(source); - break; - case kSourceIntMap: - readAudioMapSCI11(source); - break; - case kSourceMacResourceFork: - readMacResourceFork(source); - break; - default: - break; - } + source->scanSource(this); } } } +void DirectoryResourceSource::scanSource(ResourceManager *resMan) { + resMan->readResourcePatches(this); + + // We can't use getSciVersion() at this point, thus using _volVersion + if (resMan->_volVersion >= ResourceManager::kResVersionSci11) // SCI1.1+ + resMan->readResourcePatchesBase36(this); + + resMan->readWaveAudioPatches(); +} + +void ExtMapResourceSource::scanSource(ResourceManager *resMan) { + if (resMan->_mapVersion < ResourceManager::kResVersionSci1Late) + resMan->readResourceMapSCI0(this); + else + resMan->readResourceMapSCI1(this); +} + +void ExtAudioMapResourceSource::scanSource(ResourceManager *resMan) { + resMan->readAudioMapSCI1(this); +} + +void IntMapResourceSource::scanSource(ResourceManager *resMan) { + resMan->readAudioMapSCI11(this); +} + +void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { + resMan->readMacResourceFork(this); +} + + void ResourceManager::freeResourceSources() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) delete *it; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 826fbff850..8720e8eabb 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -194,6 +194,15 @@ protected: typedef Common::HashMap ResourceMap; class ResourceManager { + // FIXME: These 'friend' declarations are meant to be a temporary hack to + // ease transition to the ResourceSource class system. + friend class ResourceSource; + friend class DirectoryResourceSource; + friend class ExtMapResourceSource; + friend class IntMapResourceSource; + friend class ExtAudioMapResourceSource; + friend class MacResourceForkResourceSource; + public: enum ResVersion { kResVersionUnknown, diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 15fd5c391d..fc07572cea 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -72,11 +72,19 @@ public: virtual ResourceSource *findVolume(ResourceSource *map, int volume_nr) { return NULL; }; + + /** + * Scan this source for TODO. + * TODO: The resMan param for now is just a hack. + */ + virtual void scanSource(ResourceManager *resMan) {} }; class DirectoryResourceSource : public ResourceSource { public: DirectoryResourceSource(const Common::String &name) : ResourceSource(kSourceDirectory, name) {} + + virtual void scanSource(ResourceManager *resMan); }; class PatchResourceSource : public ResourceSource { @@ -101,11 +109,15 @@ public: class ExtMapResourceSource : public ResourceSource { public: ExtMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtMap, name) {} + + virtual void scanSource(ResourceManager *resMan); }; class IntMapResourceSource : public ResourceSource { public: IntMapResourceSource(const Common::String &name) : ResourceSource(kSourceIntMap, name) {} + + virtual void scanSource(ResourceManager *resMan); }; class AudioVolumeResourceSource : public VolumeResourceSource { @@ -118,6 +130,8 @@ public: class ExtAudioMapResourceSource : public ResourceSource { public: ExtAudioMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtAudioMap, name) {} + + virtual void scanSource(ResourceManager *resMan); }; class WaveResourceSource : public ResourceSource { @@ -128,6 +142,8 @@ public: class MacResourceForkResourceSource : public ResourceSource { public: MacResourceForkResourceSource(const Common::String &name) : ResourceSource(kSourceMacResourceFork, name) {} + + virtual void scanSource(ResourceManager *resMan); }; } // End of namespace Sci -- cgit v1.2.3 From d15e09fdc27a2a65857ab0d7fa42c923470021ae Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:12:44 +0000 Subject: SCI: Merge MacResourceForkResourceSource::scanSource and ResourceManager::readMacResourceFork svn-id: r49817 --- engines/sci/resource.cpp | 28 +++++++++++----------------- engines/sci/resource.h | 13 +++++-------- engines/sci/resource_intern.h | 3 +++ 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 74f99ecd03..4f6b557ea4 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -653,10 +653,6 @@ void IntMapResourceSource::scanSource(ResourceManager *resMan) { resMan->readAudioMapSCI11(this); } -void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { - resMan->readMacResourceFork(this); -} - void ResourceManager::freeResourceSources() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) @@ -1465,12 +1461,12 @@ static uint32 resTypeToMacTag(ResourceType type) { return 0; } -int ResourceManager::readMacResourceFork(ResourceSource *source) { - assert(source->_macResMan); - if (!source->_macResMan->open(source->getLocationName().c_str())) - error("%s is not a valid Mac resource fork", source->getLocationName().c_str()); +void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { + assert(_macResMan); + if (!_macResMan->open(getLocationName().c_str())) + error("%s is not a valid Mac resource fork", getLocationName().c_str()); - Common::MacResTagArray tagArray = source->_macResMan->getResTagArray(); + Common::MacResTagArray tagArray = _macResMan->getResTagArray(); for (uint32 i = 0; i < tagArray.size(); i++) { ResourceType type = kResourceTypeInvalid; @@ -1485,11 +1481,11 @@ int ResourceManager::readMacResourceFork(ResourceSource *source) { if (type == kResourceTypeInvalid) continue; - Common::MacResIDArray idArray = source->_macResMan->getResIDArray(tagArray[i]); + Common::MacResIDArray idArray = _macResMan->getResIDArray(tagArray[i]); for (uint32 j = 0; j < idArray.size(); j++) { // Get the size of the file - Common::SeekableReadStream *stream = source->_macResMan->getResource(tagArray[i], idArray[j]); + Common::SeekableReadStream *stream = _macResMan->getResource(tagArray[i], idArray[j]); // Some IBIS resources have a size of 0, so we skip them if (!stream) @@ -1503,22 +1499,20 @@ int ResourceManager::readMacResourceFork(ResourceSource *source) { Resource *newrsc = NULL; // Prepare destination, if neccessary. Resource forks may contain patches. - if (!_resMap.contains(resId)) { + if (!resMan->_resMap.contains(resId)) { newrsc = new Resource; - _resMap.setVal(resId, newrsc); + resMan->_resMap.setVal(resId, newrsc); } else - newrsc = _resMap.getVal(resId); + newrsc = resMan->_resMap.getVal(resId); // Overwrite everything newrsc->_id = resId; newrsc->_status = kResStatusNoMalloc; - newrsc->_source = source; + newrsc->_source = this; newrsc->size = fileSize; newrsc->_headerSize = 0; } } - - return 0; } void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size) { diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 8720e8eabb..fa5d757def 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -163,6 +163,11 @@ struct ResourceIdLess : public Common::BinaryFunctiongetName()); - newsrc->resourceFile = mapFile; + newsrc->_resourceFile = mapFile; newsrc->volume_number = volume_nr; _sources.push_back(newsrc); @@ -229,7 +229,7 @@ ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, int number) { ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common::FSNode *resFile, int number) { assert(newsrc); - newsrc->resourceFile = resFile; + newsrc->_resourceFile = resFile; newsrc->volume_number = number; if (newsrc->getSourceType() == kSourceAudioVolume) { // TODO: Move this call into the AudioVolumeResourceSource constructor. @@ -307,8 +307,8 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc Common::List::iterator it = _volumeFiles.begin(); Common::File *file; - if (source->resourceFile) - return source->resourceFile->createReadStream(); + if (source->_resourceFile) + return source->_resourceFile->createReadStream(); const char *filename = source->getLocationName().c_str(); @@ -375,7 +375,7 @@ void ResourceManager::loadResource(Resource *res) { case kSourceWave: fileStream->seek(res->_fileOffset, SEEK_SET); loadFromWaveFile(res, fileStream); - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; return; @@ -414,7 +414,7 @@ void ResourceManager::loadResource(Resource *res) { case kResourceTypeAudio36: // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 loadFromAudioVolumeSCI1(res, fileStream); - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; return; default: @@ -429,7 +429,7 @@ void ResourceManager::loadResource(Resource *res) { else loadFromAudioVolumeSCI11(res, fileStream); - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; return; @@ -437,7 +437,7 @@ void ResourceManager::loadResource(Resource *res) { fileStream->seek(res->_fileOffset, SEEK_SET); int error = decompress(res, fileStream); - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; if (error) { @@ -892,8 +892,8 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { rsrc = *it; if (rsrc->getSourceType() == kSourceExtMap) { - if (rsrc->resourceFile) { - fileStream = rsrc->resourceFile->createReadStream(); + if (rsrc->_resourceFile) { + fileStream = rsrc->_resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); file->open(rsrc->getLocationName()); @@ -981,8 +981,8 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { rsrc = *it; if (rsrc->getSourceType() == kSourceVolume) { - if (rsrc->resourceFile) { - fileStream = rsrc->resourceFile->createReadStream(); + if (rsrc->_resourceFile) { + fileStream = rsrc->_resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); file->open(rsrc->getLocationName()); @@ -1085,8 +1085,8 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource else if (checkForType == kResourceTypeSync36) checkForType = kResourceTypeSync; - if (source->resourceFile) { - fileStream = source->resourceFile->createReadStream(); + if (source->_resourceFile) { + fileStream = source->_resourceFile->createReadStream(); } else { Common::File *file = new Common::File(); if (!file->open(source->getLocationName())) { @@ -1292,8 +1292,8 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { uint16 number, id; uint32 offset; - if (map->resourceFile) { - fileStream = map->resourceFile->createReadStream(); + if (map->_resourceFile) { + fileStream = map->_resourceFile->createReadStream(); if (!fileStream) return SCI_ERROR_RESMAP_NOT_FOUND; } else { @@ -1352,8 +1352,8 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { Common::SeekableReadStream *fileStream = 0; Resource *res; - if (map->resourceFile) { - fileStream = map->resourceFile->createReadStream(); + if (map->_resourceFile) { + fileStream = map->_resourceFile->createReadStream(); if (!fileStream) return SCI_ERROR_RESMAP_NOT_FOUND; } else { @@ -1696,12 +1696,12 @@ ResourceCompression ResourceManager::getViewCompression() { ResourceCompression compression; if (readResourceInfo(res, fileStream, szPacked, compression)) { - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; continue; } - if (res->_source->resourceFile) + if (res->_source->_resourceFile) delete fileStream; if (compression != kCompNone) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 7d716f0f20..d94c7d010a 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -64,7 +64,7 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { *offsetMapping++ = fileStream->size(); } - if (source->resourceFile) + if (source->_resourceFile) delete fileStream; } diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 617977c3dc..c492602187 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -54,7 +54,7 @@ protected: public: bool scanned; - const Common::FSNode *resourceFile; + const Common::FSNode *_resourceFile; int volume_number; ResourceSource *associated_map; // TODO: Move to VolumeResourceSource uint32 audioCompressionType; // TODO: Move to AudioVolumeResourceSource -- cgit v1.2.3 From d4f16962d03f7b1e88ea76560801f2f77a20ebd1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:13:29 +0000 Subject: SCI: Move code from ResourceManager::loadResource to ResourceSource::loadResource svn-id: r49819 --- engines/sci/resource.cpp | 57 +++++++++++++++++++++++++------------------ engines/sci/resource.h | 2 ++ engines/sci/resource_intern.h | 12 ++++++++- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 3792d5d9c8..ad4daab005 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -176,14 +176,18 @@ ResourceSource::ResourceSource(ResSourceType type, const Common::String &name) associated_map = NULL; audioCompressionType = 0; audioCompressionOffsetMapping = NULL; - - if (_sourceType == kSourceMacResourceFork) - _macResMan = new Common::MacResManager(); - else - _macResMan = NULL; + _macResMan = NULL; } ResourceSource::~ResourceSource() { +} + +MacResourceForkResourceSource::MacResourceForkResourceSource(const Common::String &name) + : ResourceSource(kSourceMacResourceFork, name) { + _macResMan = new Common::MacResManager(); +} + +MacResourceForkResourceSource::~MacResourceForkResourceSource() { delete _macResMan; } @@ -344,17 +348,22 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc static uint32 resTypeToMacTag(ResourceType type); void ResourceManager::loadResource(Resource *res) { - if (res->_source->getSourceType() == kSourcePatch && loadFromPatchFile(res)) + res->_source->loadResource(res, this); +} + +void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + + if (getSourceType() == kSourcePatch && resMan->loadFromPatchFile(res)) return; - if (res->_source->getSourceType() == kSourceMacResourceFork) { - assert(res->_source->_macResMan); - Common::SeekableReadStream *stream = res->_source->_macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); + if (getSourceType() == kSourceMacResourceFork) { + assert(_macResMan); + Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); if (!stream) error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); - int error = decompress(res, stream); + int error = resMan->decompress(res, stream); if (error) { warning("Error %d occured while reading %s from Mac resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); @@ -363,27 +372,27 @@ void ResourceManager::loadResource(Resource *res) { return; } - Common::SeekableReadStream *fileStream = getVolumeFile(res->_source); + Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { - warning("Failed to open %s", res->_source->getLocationName().c_str()); + warning("Failed to open %s", getLocationName().c_str()); res->unalloc(); return; } - switch(res->_source->getSourceType()) { + switch(getSourceType()) { case kSourceWave: fileStream->seek(res->_fileOffset, SEEK_SET); - loadFromWaveFile(res, fileStream); - if (res->_source->_resourceFile) + resMan->loadFromWaveFile(res, fileStream); + if (_resourceFile) delete fileStream; return; case kSourceAudioVolume: - if (res->_source->audioCompressionType) { + if (audioCompressionType) { // this file is compressed, so lookup our offset in the offset-translation table and get the new offset // also calculate the compressed size by using the next offset - int32 *mappingTable = res->_source->audioCompressionOffsetMapping; + int32 *mappingTable = audioCompressionOffsetMapping; int32 compressedOffset = 0; do { @@ -413,8 +422,8 @@ void ResourceManager::loadResource(Resource *res) { case kResourceTypeAudio: case kResourceTypeAudio36: // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 - loadFromAudioVolumeSCI1(res, fileStream); - if (res->_source->_resourceFile) + resMan->loadFromAudioVolumeSCI1(res, fileStream); + if (_resourceFile) delete fileStream; return; default: @@ -425,19 +434,19 @@ void ResourceManager::loadResource(Resource *res) { fileStream->seek(res->_fileOffset, SEEK_SET); } if (getSciVersion() < SCI_VERSION_1_1) - loadFromAudioVolumeSCI1(res, fileStream); + resMan->loadFromAudioVolumeSCI1(res, fileStream); else - loadFromAudioVolumeSCI11(res, fileStream); + resMan->loadFromAudioVolumeSCI11(res, fileStream); - if (res->_source->_resourceFile) + if (_resourceFile) delete fileStream; return; default: fileStream->seek(res->_fileOffset, SEEK_SET); - int error = decompress(res, fileStream); + int error = resMan->decompress(res, fileStream); - if (res->_source->_resourceFile) + if (_resourceFile) delete fileStream; if (error) { diff --git a/engines/sci/resource.h b/engines/sci/resource.h index fa5d757def..89af97df7e 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -166,6 +166,7 @@ class Resource { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. + friend class ResourceSource; friend class MacResourceForkResourceSource; public: @@ -201,6 +202,7 @@ typedef Common::HashMap_source->loadResource(res, this); } -void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { - if (getSourceType() == kSourcePatch && resMan->loadFromPatchFile(res)) - return; +void PatchResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + bool result = resMan->loadFromPatchFile(res); + if (!result) { + // TODO: We used to fallback to the "default" code here if loadFromPatchFile + // failed, but I am not sure whether that is really appropriate. + // In fact it looks like a bug to me, so I commented this out for now. + //ResourceSource::loadResource(res, resMan); + } +} - if (getSourceType() == kSourceMacResourceFork) { - assert(_macResMan); - Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); +void MacResourceForkResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); - if (!stream) - error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); + if (!stream) + error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); - int error = resMan->decompress(res, stream); - if (error) { - warning("Error %d occured while reading %s from Mac resource file: %s", - error, res->_id.toString().c_str(), sci_error_types[error]); - res->unalloc(); - } - return; + int error = resMan->decompress(res, stream); + if (error) { + warning("Error %d occured while reading %s from Mac resource file: %s", + error, res->_id.toString().c_str(), sci_error_types[error]); + res->unalloc(); } +} +void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { @@ -1471,7 +1476,6 @@ static uint32 resTypeToMacTag(ResourceType type) { } void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { - assert(_macResMan); if (!_macResMan->open(getLocationName().c_str())) error("%s is not a valid Mac resource fork", getLocationName().c_str()); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 89af97df7e..ff848d24b2 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -204,9 +204,12 @@ class ResourceManager { // ease transition to the ResourceSource class system. friend class ResourceSource; friend class DirectoryResourceSource; + friend class PatchResourceSource; friend class ExtMapResourceSource; friend class IntMapResourceSource; + friend class AudioVolumeResourceSource; friend class ExtAudioMapResourceSource; + friend class WaveResourceSource; friend class MacResourceForkResourceSource; public: diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 5c63436b1b..3d51e0ae02 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -59,7 +59,6 @@ public: ResourceSource *associated_map; // TODO: Move to VolumeResourceSource uint32 audioCompressionType; // TODO: Move to AudioVolumeResourceSource int32 *audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource - Common::MacResManager *_macResMan; // TODO: Move to MacResourceForkResourceSource protected: ResourceSource(ResSourceType type, const Common::String &name); @@ -99,6 +98,8 @@ public: class PatchResourceSource : public ResourceSource { public: PatchResourceSource(const Common::String &name) : ResourceSource(kSourcePatch, name) {} + + virtual void loadResource(Resource *res, ResourceManager *resMan); }; class VolumeResourceSource : public ResourceSource { @@ -134,6 +135,8 @@ public: AudioVolumeResourceSource(const Common::String &name, ResourceSource *map) : VolumeResourceSource(name, map, kSourceAudioVolume) { } + + //virtual void loadResource(Resource *res, ResourceManager *resMan); }; class ExtAudioMapResourceSource : public ResourceSource { @@ -146,9 +149,14 @@ public: class WaveResourceSource : public ResourceSource { public: WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {} + + //virtual void loadResource(Resource *res, ResourceManager *resMan); }; class MacResourceForkResourceSource : public ResourceSource { +protected: + Common::MacResManager *_macResMan; + public: MacResourceForkResourceSource(const Common::String &name); ~MacResourceForkResourceSource(); @@ -157,6 +165,8 @@ public: * Reads the SCI1.1+ resource file from a Mac resource fork. */ virtual void scanSource(ResourceManager *resMan); + + virtual void loadResource(Resource *res, ResourceManager *resMan); }; } // End of namespace Sci -- cgit v1.2.3 From bb1336ca415311ed28195b2b7ac574e2244c2cc5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:14:15 +0000 Subject: SCI: Add loadResource impls for WaveResourceSource and AudioVolumeResourceSource svn-id: r49821 --- engines/sci/resource.cpp | 142 +++++++++++++++++++++++------------------- engines/sci/resource.h | 4 +- engines/sci/resource_intern.h | 7 ++- 3 files changed, 85 insertions(+), 68 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 35e0c93d59..45ee9b3d0f 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -376,89 +376,101 @@ void MacResourceForkResourceSource::loadResource(Resource *res, ResourceManager } } -void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { +Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res, ResourceManager *resMan) { Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { warning("Failed to open %s", getLocationName().c_str()); res->unalloc(); - return; } - switch(getSourceType()) { - case kSourceWave: - fileStream->seek(res->_fileOffset, SEEK_SET); - resMan->loadFromWaveFile(res, fileStream); - if (_resourceFile) - delete fileStream; + return fileStream; +} + +void WaveResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); + if (!fileStream) return; - case kSourceAudioVolume: - if (audioCompressionType) { - // this file is compressed, so lookup our offset in the offset-translation table and get the new offset - // also calculate the compressed size by using the next offset - int32 *mappingTable = audioCompressionOffsetMapping; - int32 compressedOffset = 0; - - do { - if (*mappingTable == res->_fileOffset) { - mappingTable++; - compressedOffset = *mappingTable; - // Go to next compressed offset and use that to calculate size of compressed sample - switch (res->_id.type) { - case kResourceTypeSync: - case kResourceTypeSync36: - // we should already have a (valid) size - break; - default: - mappingTable += 2; - res->size = *mappingTable - compressedOffset; - } + fileStream->seek(res->_fileOffset, SEEK_SET); + resMan->loadFromWaveFile(res, fileStream); + if (_resourceFile) + delete fileStream; +} + +void AudioVolumeResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); + if (!fileStream) + return; + + if (audioCompressionType) { + // this file is compressed, so lookup our offset in the offset-translation table and get the new offset + // also calculate the compressed size by using the next offset + int32 *mappingTable = audioCompressionOffsetMapping; + int32 compressedOffset = 0; + + do { + if (*mappingTable == res->_fileOffset) { + mappingTable++; + compressedOffset = *mappingTable; + // Go to next compressed offset and use that to calculate size of compressed sample + switch (res->_id.type) { + case kResourceTypeSync: + case kResourceTypeSync36: + // we should already have a (valid) size break; + default: + mappingTable += 2; + res->size = *mappingTable - compressedOffset; } - mappingTable += 2; - } while (*mappingTable); - - if (!compressedOffset) - error("could not translate offset to compressed offset in audio volume"); - fileStream->seek(compressedOffset, SEEK_SET); - - switch (res->_id.type) { - case kResourceTypeAudio: - case kResourceTypeAudio36: - // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 - resMan->loadFromAudioVolumeSCI1(res, fileStream); - if (_resourceFile) - delete fileStream; - return; - default: break; } - } else { - // original file, directly seek to given offset and get SCI1/SCI1.1 audio resource - fileStream->seek(res->_fileOffset, SEEK_SET); - } - if (getSciVersion() < SCI_VERSION_1_1) + mappingTable += 2; + } while (*mappingTable); + + if (!compressedOffset) + error("could not translate offset to compressed offset in audio volume"); + fileStream->seek(compressedOffset, SEEK_SET); + + switch (res->_id.type) { + case kResourceTypeAudio: + case kResourceTypeAudio36: + // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 resMan->loadFromAudioVolumeSCI1(res, fileStream); - else - resMan->loadFromAudioVolumeSCI11(res, fileStream); + if (_resourceFile) + delete fileStream; + return; + default: + break; + } + } else { + // original file, directly seek to given offset and get SCI1/SCI1.1 audio resource + fileStream->seek(res->_fileOffset, SEEK_SET); + } + if (getSciVersion() < SCI_VERSION_1_1) + resMan->loadFromAudioVolumeSCI1(res, fileStream); + else + resMan->loadFromAudioVolumeSCI11(res, fileStream); - if (_resourceFile) - delete fileStream; + if (_resourceFile) + delete fileStream; +} + +void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { + Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); + if (!fileStream) return; - default: - fileStream->seek(res->_fileOffset, SEEK_SET); - int error = resMan->decompress(res, fileStream); + fileStream->seek(res->_fileOffset, SEEK_SET); + int error = resMan->decompress(res, fileStream); - if (_resourceFile) - delete fileStream; + if (_resourceFile) + delete fileStream; - if (error) { - warning("Error %d occured while reading %s from resource file: %s", - error, res->_id.toString().c_str(), sci_error_types[error]); - res->unalloc(); - } + if (error) { + warning("Error %d occured while reading %s from resource file: %s", + error, res->_id.toString().c_str(), sci_error_types[error]); + res->unalloc(); } } @@ -1541,7 +1553,7 @@ void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 } int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file, - uint32&szPacked, ResourceCompression &compression) { + uint32 &szPacked, ResourceCompression &compression) { // SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes // SCI1 volume format: {bResType wResNumber wPacked+4 wUnpacked wCompression} = 9 bytes // SCI1.1 volume format: {bResType wResNumber wPacked wUnpacked wCompression} = 9 bytes diff --git a/engines/sci/resource.h b/engines/sci/resource.h index ff848d24b2..6d37455f52 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -167,6 +167,8 @@ class Resource { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. friend class ResourceSource; + friend class WaveResourceSource; + friend class AudioVolumeResourceSource; friend class MacResourceForkResourceSource; public: @@ -393,7 +395,7 @@ protected: bool loadFromAudioVolumeSCI11(Resource *res, Common::SeekableReadStream *file); void freeOldResources(); int decompress(Resource *res, Common::SeekableReadStream *file); - int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32&szPacked, ResourceCompression &compression); + int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0); void removeAudioResource(ResourceId resId); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 3d51e0ae02..560e99ac80 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -68,6 +68,9 @@ public: ResSourceType getSourceType() const { return _sourceType; } const Common::String &getLocationName() const { return _name; } + // Auxiliary method, used by loadResource implementations. + Common::SeekableReadStream *getVolumeFile(Resource *res, ResourceManager *resMan); + /** * TODO: Document this */ @@ -136,7 +139,7 @@ public: : VolumeResourceSource(name, map, kSourceAudioVolume) { } - //virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res, ResourceManager *resMan); }; class ExtAudioMapResourceSource : public ResourceSource { @@ -150,7 +153,7 @@ class WaveResourceSource : public ResourceSource { public: WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {} - //virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res, ResourceManager *resMan); }; class MacResourceForkResourceSource : public ResourceSource { -- cgit v1.2.3 From 07b896802b3d56748c0e33877a325978db0513ff Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:14:39 +0000 Subject: SCI: Pass volume number to ResourceSource subclass constructors; make ResourceSource::volume_number const svn-id: r49822 --- engines/sci/resource.cpp | 46 ++++++++++++++++++------------------------ engines/sci/resource.h | 4 ++-- engines/sci/resource_audio.cpp | 8 ++++++-- engines/sci/resource_intern.h | 32 ++++++++++++++++------------- 4 files changed, 46 insertions(+), 44 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 45ee9b3d0f..69bce4f5d5 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -168,11 +168,10 @@ uint32 Resource::getAudioCompressionType() { } -ResourceSource::ResourceSource(ResSourceType type, const Common::String &name) - : _sourceType(type), _name(name) { +ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, int volNum) + : _sourceType(type), _name(name), volume_number(volNum) { scanned = false; _resourceFile = 0; - volume_number = 0; associated_map = NULL; audioCompressionType = 0; audioCompressionOffsetMapping = NULL; @@ -181,8 +180,8 @@ ResourceSource::ResourceSource(ResSourceType type, const Common::String &name) ResourceSource::~ResourceSource() { } -MacResourceForkResourceSource::MacResourceForkResourceSource(const Common::String &name) - : ResourceSource(kSourceMacResourceFork, name) { +MacResourceForkResourceSource::MacResourceForkResourceSource(const Common::String &name, int volNum) + : ResourceSource(kSourceMacResourceFork, name, volNum) { _macResMan = new Common::MacResManager(); assert(_macResMan); } @@ -196,28 +195,24 @@ MacResourceForkResourceSource::~MacResourceForkResourceSource() { // Resource source list management ResourceSource *ResourceManager::addExternalMap(const Common::String &filename, int volume_nr) { - ResourceSource *newsrc = new ExtMapResourceSource(filename); - - newsrc->volume_number = volume_nr; + ResourceSource *newsrc = new ExtMapResourceSource(filename, volume_nr); _sources.push_back(newsrc); return newsrc; } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ExtMapResourceSource(mapFile->getName()); + ResourceSource *newsrc = new ExtMapResourceSource(mapFile->getName(), volume_nr); newsrc->_resourceFile = mapFile; - newsrc->volume_number = volume_nr; _sources.push_back(newsrc); return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, int number) { +ResourceSource *ResourceManager::addSource(ResourceSource *newsrc) { assert(newsrc); - newsrc->volume_number = number; if (newsrc->getSourceType() == kSourceAudioVolume) { // TODO: Move this call into the AudioVolumeResourceSource constructor. // Need to verify if this is safe, though; in particular, whether this @@ -230,11 +225,10 @@ ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, int number) { return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common::FSNode *resFile, int number) { +ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common::FSNode *resFile) { assert(newsrc); newsrc->_resourceFile = resFile; - newsrc->volume_number = number; if (newsrc->getSourceType() == kSourceAudioVolume) { // TODO: Move this call into the AudioVolumeResourceSource constructor. // Need to verify if this is safe, though; in particular, whether this @@ -492,12 +486,12 @@ int ResourceManager::addAppropriateSources() { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(new VolumeResourceSource(name, map), number); + addSource(new VolumeResourceSource(name, map, number)); } #ifdef ENABLE_SCI32 // GK1CD hires content if (Common::File::exists("alt.map") && Common::File::exists("resource.alt")) - addSource(new VolumeResourceSource("resource.alt", addExternalMap("alt.map", 10)), 10); + addSource(new VolumeResourceSource("resource.alt", addExternalMap("alt.map", 10), 10)); #endif } else if (Common::File::exists("Data1")) { // Mac SCI1.1+ file naming scheme @@ -505,7 +499,7 @@ int ResourceManager::addAppropriateSources() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { Common::String filename = (*x)->getName(); - addSource(new MacResourceForkResourceSource(filename), atoi(filename.c_str() + 4)); + addSource(new MacResourceForkResourceSource(filename, atoi(filename.c_str() + 4))); } #ifdef ENABLE_SCI32 // Mac SCI32 games have extra folders for patches @@ -517,7 +511,7 @@ int ResourceManager::addAppropriateSources() { // There can also be a "Patches" resource fork with patches if (Common::File::exists("Patches")) - addSource(new MacResourceForkResourceSource("Patches"), 100); + addSource(new MacResourceForkResourceSource("Patches", 100)); } else { // SCI2.1-SCI3 file naming scheme Common::ArchiveMemberList mapFiles; @@ -537,7 +531,7 @@ int ResourceManager::addAppropriateSources() { int resNumber = atoi(strrchr(resName.c_str(), '.') + 1); if (mapNumber == resNumber) { - addSource(new VolumeResourceSource(resName, addExternalMap(mapName, mapNumber)), mapNumber); + addSource(new VolumeResourceSource(resName, addExternalMap(mapName, mapNumber), mapNumber)); break; } } @@ -546,7 +540,7 @@ int ResourceManager::addAppropriateSources() { // SCI2.1 resource patches if (Common::File::exists("resmap.pat") && Common::File::exists("ressci.pat")) { // We add this resource with a map which surely won't exist - addSource(new VolumeResourceSource("ressci.pat", addExternalMap("resmap.pat", 100)), 100); + addSource(new VolumeResourceSource("ressci.pat", addExternalMap("resmap.pat", 100), 100)); } } #else @@ -556,7 +550,7 @@ int ResourceManager::addAppropriateSources() { addPatchDir("."); if (Common::File::exists("message.map")) - addSource(new VolumeResourceSource("resource.msg", addExternalMap("message.map")), 0); + addSource(new VolumeResourceSource("resource.msg", addExternalMap("message.map"), 0)); return 1; } @@ -600,7 +594,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { #ifdef ENABLE_SCI32 if (sci21PatchMap && sci21PatchRes) - addSource(new VolumeResourceSource(sci21PatchRes->getName(), sci21PatchMap), sci21PatchRes, 100); + addSource(new VolumeResourceSource(sci21PatchRes->getName(), sci21PatchMap, 100), sci21PatchRes); #endif // Now find all the resource.0?? files @@ -615,7 +609,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { const char *dot = strrchr(filename.c_str(), '.'); int number = atoi(dot + 1); - addSource(new VolumeResourceSource(file->getName(), map), file, number); + addSource(new VolumeResourceSource(file->getName(), map, number), file); } } @@ -630,12 +624,12 @@ int ResourceManager::addInternalSources() { Common::List::iterator itr = resources->begin(); while (itr != resources->end()) { - ResourceSource *src = addSource(new IntMapResourceSource("MAP"), itr->number); + ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->number)); if ((itr->number == 65535) && Common::File::exists("RESOURCE.SFX")) - addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src), 0); + addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src, 0)); else if (Common::File::exists("RESOURCE.AUD")) - addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src), 0); + addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src, 0)); ++itr; } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 6d37455f52..bddcbffae7 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -339,9 +339,9 @@ protected: * @param source The new source to add * @return A pointer to the added source structure, or NULL if an error occurred. */ - ResourceSource *addSource(ResourceSource *source, int number); + ResourceSource *addSource(ResourceSource *source); - ResourceSource *addSource(ResourceSource *source, const Common::FSNode *resFile, int number); + ResourceSource *addSource(ResourceSource *source, const Common::FSNode *resFile); /** * Add an external (i.e., separate file) map resource to the resource manager's list of sources. diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index d94c7d010a..cbd713c906 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -33,6 +33,10 @@ namespace Sci { +AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum) + : VolumeResourceSource(name, map, volNum, kSourceAudioVolume) { +} + void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { Common::SeekableReadStream *fileStream = getVolumeFile(source); @@ -433,7 +437,7 @@ void ResourceManager::setAudioLanguage(int language) { return; } - _audioMapSCI1 = addSource(new ExtAudioMapResourceSource(fullname), language); + _audioMapSCI1 = addSource(new ExtAudioMapResourceSource(fullname, language)); // Search for audio volumes for this language and add them to the source list Common::ArchiveMemberList files; @@ -443,7 +447,7 @@ void ResourceManager::setAudioLanguage(int language) { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(new AudioVolumeResourceSource(name, _audioMapSCI1), number); + addSource(new AudioVolumeResourceSource(name, _audioMapSCI1, number)); } scanNewSources(); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 560e99ac80..52f47aca8b 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -55,13 +55,13 @@ protected: public: bool scanned; const Common::FSNode *_resourceFile; - int volume_number; + const int volume_number; ResourceSource *associated_map; // TODO: Move to VolumeResourceSource uint32 audioCompressionType; // TODO: Move to AudioVolumeResourceSource int32 *audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource protected: - ResourceSource(ResSourceType type, const Common::String &name); + ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0); public: virtual ~ResourceSource(); @@ -74,7 +74,7 @@ public: /** * TODO: Document this */ - virtual ResourceSource *findVolume(ResourceSource *map, int volume_nr) { + virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { return NULL; }; @@ -107,13 +107,13 @@ public: class VolumeResourceSource : public ResourceSource { public: - VolumeResourceSource(const Common::String &name, ResourceSource *map, ResSourceType type = kSourceVolume) - : ResourceSource(type, name) { + VolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum, ResSourceType type = kSourceVolume) + : ResourceSource(type, name, volNum) { associated_map = map; } - virtual ResourceSource *findVolume(ResourceSource *map, int volume_nr) { - if (associated_map == map && volume_number == volume_nr) + virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { + if (associated_map == map && volume_number == volNum) return this; return NULL; }; @@ -121,30 +121,34 @@ public: class ExtMapResourceSource : public ResourceSource { public: - ExtMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtMap, name) {} + ExtMapResourceSource(const Common::String &name, int volNum) + : ResourceSource(kSourceExtMap, name, volNum) { + } virtual void scanSource(ResourceManager *resMan); }; class IntMapResourceSource : public ResourceSource { public: - IntMapResourceSource(const Common::String &name) : ResourceSource(kSourceIntMap, name) {} + IntMapResourceSource(const Common::String &name, int volNum) + : ResourceSource(kSourceIntMap, name, volNum) { + } virtual void scanSource(ResourceManager *resMan); }; class AudioVolumeResourceSource : public VolumeResourceSource { public: - AudioVolumeResourceSource(const Common::String &name, ResourceSource *map) - : VolumeResourceSource(name, map, kSourceAudioVolume) { - } + AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum); virtual void loadResource(Resource *res, ResourceManager *resMan); }; class ExtAudioMapResourceSource : public ResourceSource { public: - ExtAudioMapResourceSource(const Common::String &name) : ResourceSource(kSourceExtAudioMap, name) {} + ExtAudioMapResourceSource(const Common::String &name, int volNum) + : ResourceSource(kSourceExtAudioMap, name, volNum) { + } virtual void scanSource(ResourceManager *resMan); }; @@ -161,7 +165,7 @@ protected: Common::MacResManager *_macResMan; public: - MacResourceForkResourceSource(const Common::String &name); + MacResourceForkResourceSource(const Common::String &name, int volNum); ~MacResourceForkResourceSource(); /** -- cgit v1.2.3 From 4020500640481e0a8089fd82ad94d2c286f0e024 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:15:05 +0000 Subject: SCI: Rename ResourceSource members to follow _camelCase convention svn-id: r49823 --- engines/sci/resource.cpp | 22 +++++++++++----------- engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 20 ++++++++++---------- engines/sci/resource_intern.h | 14 +++++++------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 69bce4f5d5..1614700886 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -164,17 +164,17 @@ void Resource::writeToStream(Common::WriteStream *stream) const { } uint32 Resource::getAudioCompressionType() { - return _source->audioCompressionType; + return _source->_audioCompressionType; } ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, int volNum) - : _sourceType(type), _name(name), volume_number(volNum) { - scanned = false; + : _sourceType(type), _name(name), _volumeNumber(volNum) { + _scanned = false; _resourceFile = 0; - associated_map = NULL; - audioCompressionType = 0; - audioCompressionOffsetMapping = NULL; + _associatedMap = NULL; + _audioCompressionType = 0; + _audioCompressionOffsetMapping = NULL; } ResourceSource::~ResourceSource() { @@ -397,10 +397,10 @@ void AudioVolumeResourceSource::loadResource(Resource *res, ResourceManager *res if (!fileStream) return; - if (audioCompressionType) { + if (_audioCompressionType) { // this file is compressed, so lookup our offset in the offset-translation table and get the new offset // also calculate the compressed size by using the next offset - int32 *mappingTable = audioCompressionOffsetMapping; + int32 *mappingTable = _audioCompressionOffsetMapping; int32 compressedOffset = 0; do { @@ -641,8 +641,8 @@ void ResourceManager::scanNewSources() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) { ResourceSource *source = *it; - if (!source->scanned) { - source->scanned = true; + if (!source->_scanned) { + source->_scanned = true; source->scanSource(this); } } @@ -1439,7 +1439,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers // need to be used in concurrence with the volume specified in the map to get // the actual resource file. - res->_source = findVolume(map, volume_nr + map->volume_number); + res->_source = findVolume(map, volume_nr + map->_volumeNumber); res->_fileOffset = off; } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index bddcbffae7..e753dc1686 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -362,7 +362,7 @@ protected: ResourceSource *addInternalMap(const Common::String &name, int resNr); /** - * Checks, if an audio volume got compressed by our tool. If that's the case, it will set audioCompressionType + * Checks, if an audio volume got compressed by our tool. If that's the case, it will set _audioCompressionType * and read in the offset translation table for later usage. */ void checkIfAudioVolumeIsCompressed(ResourceSource *source); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index cbd713c906..25e73242ef 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -52,13 +52,13 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { case MKID_BE('OGG '): case MKID_BE('FLAC'): // Detected a compressed audio volume - source->audioCompressionType = compressionType; + source->_audioCompressionType = compressionType; // Now read the whole offset mapping table for later usage int32 recordCount = fileStream->readUint32LE(); if (!recordCount) error("compressed audio volume doesn't contain any entries!"); int32 *offsetMapping = new int32[(recordCount + 1) * 2]; - source->audioCompressionOffsetMapping = offsetMapping; + source->_audioCompressionOffsetMapping = offsetMapping; for (int recordNo = 0; recordNo < recordCount; recordNo++) { *offsetMapping++ = fileStream->readUint32LE(); *offsetMapping++ = fileStream->readUint32LE(); @@ -257,10 +257,10 @@ void ResourceManager::removeAudioResource(ResourceId resId) { int ResourceManager::readAudioMapSCI11(ResourceSource *map) { bool isEarly = true; uint32 offset = 0; - Resource *mapRes = findResource(ResourceId(kResourceTypeMap, map->volume_number), false); + Resource *mapRes = findResource(ResourceId(kResourceTypeMap, map->_volumeNumber), false); if (!mapRes) { - warning("Failed to open %i.MAP", map->volume_number); + warning("Failed to open %i.MAP", map->_volumeNumber); return SCI_ERROR_RESMAP_NOT_FOUND; } @@ -271,7 +271,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { byte *ptr = mapRes->data; - if (map->volume_number == 65535) { + if (map->_volumeNumber == 65535) { // Heuristic to detect late SCI1.1 map format if ((mapRes->size >= 6) && (ptr[mapRes->size - 6] != 0xff)) isEarly = false; @@ -324,7 +324,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { ptr += 2; if (syncSize > 0) - addResource(ResourceId(kResourceTypeSync36, map->volume_number, n & 0xffffff3f), src, offset, syncSize); + addResource(ResourceId(kResourceTypeSync36, map->_volumeNumber, n & 0xffffff3f), src, offset, syncSize); } if (n & 0x40) { @@ -334,7 +334,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { ptr += 2; } - addResource(ResourceId(kResourceTypeAudio36, map->volume_number, n & 0xffffff3f), src, offset + syncSize); + addResource(ResourceId(kResourceTypeAudio36, map->_volumeNumber, n & 0xffffff3f), src, offset + syncSize); } } @@ -401,7 +401,7 @@ int ResourceManager::readAudioMapSCI1(ResourceSource *map, bool unload) { void ResourceManager::setAudioLanguage(int language) { if (_audioMapSCI1) { - if (_audioMapSCI1->volume_number == language) { + if (_audioMapSCI1->_volumeNumber == language) { // This language is already loaded return; } @@ -413,7 +413,7 @@ void ResourceManager::setAudioLanguage(int language) { Common::List::iterator it = _sources.begin(); while (it != _sources.end()) { ResourceSource *src = *it; - if (src->associated_map == _audioMapSCI1) { + if (src->_associatedMap == _audioMapSCI1) { it = _sources.erase(it); delete src; } else { @@ -454,7 +454,7 @@ void ResourceManager::setAudioLanguage(int language) { } int ResourceManager::getAudioLanguage() const { - return (_audioMapSCI1 ? _audioMapSCI1->volume_number : 0); + return (_audioMapSCI1 ? _audioMapSCI1->_volumeNumber : 0); } SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersion soundVersion) : _resMan(resMan), _soundVersion(soundVersion) { diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 52f47aca8b..5a5129c125 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -53,12 +53,12 @@ protected: const Common::String _name; public: - bool scanned; + bool _scanned; const Common::FSNode *_resourceFile; - const int volume_number; - ResourceSource *associated_map; // TODO: Move to VolumeResourceSource - uint32 audioCompressionType; // TODO: Move to AudioVolumeResourceSource - int32 *audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource + const int _volumeNumber; + ResourceSource *_associatedMap; // TODO: Move to VolumeResourceSource + uint32 _audioCompressionType; // TODO: Move to AudioVolumeResourceSource + int32 *_audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource protected: ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0); @@ -109,11 +109,11 @@ class VolumeResourceSource : public ResourceSource { public: VolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum, ResSourceType type = kSourceVolume) : ResourceSource(type, name, volNum) { - associated_map = map; + _associatedMap = map; } virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { - if (associated_map == map && volume_number == volNum) + if (_associatedMap == map && _volumeNumber == volNum) return this; return NULL; }; -- cgit v1.2.3 From 713e61acba05c49ec4bc896fa2e873c3265000a7 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:15:27 +0000 Subject: SCI: Doxygen fixes svn-id: r49824 --- engines/sci/resource.h | 77 +++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index e753dc1686..3d5b874977 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -234,36 +234,39 @@ public: /** * Looks up a resource's data. - * @param id: The resource type to look for - * @param lock: non-zero iff the resource should be locked - * @return (Resource *): The resource, or NULL if it doesn't exist + * @param id The resource type to look for + * @param lock non-zero iff the resource should be locked + * @return The resource, or NULL if it doesn't exist * @note Locked resources are guaranteed not to have their contents freed until * they are unlocked explicitly (by unlockResource). */ Resource *findResource(ResourceId id, bool lock); - /* Unlocks a previously locked resource - ** (Resource *) res: The resource to free - ** Returns : () - */ + /** + * Unlocks a previously locked resource. + * @param res The resource to free + */ void unlockResource(Resource *res); - /* Tests whether a resource exists - ** (ResourceId) id: Id of the resource to check - ** Returns : (Resource *) non-NULL if the resource exists, NULL otherwise - ** This function may often be much faster than finding the resource - ** and should be preferred for simple tests. - ** The resource object returned is, indeed, the resource in question, but - ** it should be used with care, as it may be unallocated. - ** Use scir_find_resource() if you want to use the data contained in the resource. - */ + /** + * Tests whether a resource exists. + * + * This function may often be much faster than finding the resource + * and should be preferred for simple tests. + * The resource object returned is, indeed, the resource in question, but + * it should be used with care, as it may be unallocated. + * Use scir_find_resource() if you want to use the data contained in the resource. + * + * @param id Id of the resource to check + * @return non-NULL if the resource exists, NULL otherwise + */ Resource *testResource(ResourceId id); /** * Returns a list of all resources of the specified type. - * @param type: The resource type to look for - * @param mapNumber: For audio36 and sync36, limit search to this map - * @return: The resource list + * @param type The resource type to look for + * @param mapNumber For audio36 and sync36, limit search to this map + * @return The resource list */ Common::List *listResources(ResourceType type, int mapNumber = -1); @@ -280,7 +283,7 @@ public: * Adds the appropriate GM patch from the Sierra MIDI utility as 4.pat, without * requiring the user to rename the file to 4.pat. Thus, the original Sierra * archive can be extracted in the extras directory, and the GM patches can be - * applied per game, if applicable + * applied per game, if applicable. */ void addNewGMPatch(const Common::String &gameId); @@ -289,13 +292,13 @@ public: bool detectFontExtended(); /** - * Finds the internal Sierra ID of the current game from script 0 + * Finds the internal Sierra ID of the current game from script 0. */ Common::String findSierraGameId(); /** - * Finds the location of the game object from script 0 - * @param addSci11ScriptOffset: Adjust the return value for SCI1.1 and newer + * Finds the location of the game object from script 0. + * @param addSci11ScriptOffset Adjust the return value for SCI1.1 and newer * games. Needs to be false when the heap is accessed directly inside * findSierraGameId(). */ @@ -337,14 +340,15 @@ protected: /** * Adds a source to the resource manager's list of sources. * @param source The new source to add - * @return A pointer to the added source structure, or NULL if an error occurred. + * @return A pointer to the added source structure, or NULL if an error occurred. */ ResourceSource *addSource(ResourceSource *source); ResourceSource *addSource(ResourceSource *source, const Common::FSNode *resFile); /** - * Add an external (i.e., separate file) map resource to the resource manager's list of sources. + * Add an external (i.e., separate file) map resource to the resource + * manager's list of sources. * @param file_name The name of the volume to add * @param volume_nr The volume number the map starts at, 0 for getResMan() returns a valid value much sooner, allowing me to simplify some code. Also added a note about potentially replacing Common::FSList usage by Common::Archive (and FSNode by Archive/ArchiveMember ?). This might be a way to unify the addAppropriateSources variants again. svn-id: r49825 --- engines/sci/detection.cpp | 7 ++++++- engines/sci/resource.cpp | 7 ------- engines/sci/resource.h | 18 ++++++++++-------- engines/sci/sci.cpp | 21 +++++++++++++++++---- 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 7163c879b1..3b153d3dd1 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -428,7 +428,12 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl return 0; } - ResourceManager *resMan = new ResourceManager(fslist); + ResourceManager *resMan = new ResourceManager(); + assert(resMan); + resMan->addAppropriateSources(fslist); + resMan->init(); + // TODO: Add error handling. + ViewType gameViews = resMan->getViewType(); // Have we identified the game views? If not, stop here diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 1614700886..a1e7a5c85c 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -682,13 +682,6 @@ void ResourceManager::freeResourceSources() { } ResourceManager::ResourceManager() { - addAppropriateSources(); - init(); -} - -ResourceManager::ResourceManager(const Common::FSList &fslist) { - addAppropriateSources(fslist); - init(); } void ResourceManager::init() { diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 3d5b874977..36d75fb56f 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -229,9 +229,17 @@ public: * Creates a new SCI resource manager. */ ResourceManager(); - ResourceManager(const Common::FSList &fslist); ~ResourceManager(); + + /** + * Initializes the resource manager. + */ + void init(); + + int addAppropriateSources(); + int addAppropriateSources(const Common::FSList &fslist); // TODO: Switch from FSList to Common::Archive? + /** * Looks up a resource's data. * @param id The resource type to look for @@ -324,11 +332,6 @@ protected: ResVersion _volVersion; ///< resource.0xx version ResVersion _mapVersion; ///< resource.map version - /** - * Initializes the resource manager - */ - void init(); - /** * Add a path to the resource manager's list of sources. * @return a pointer to the added source structure, or NULL if an error occurred. @@ -379,8 +382,7 @@ protected: * @return One of SCI_ERROR_*. */ void scanNewSources(); - int addAppropriateSources(); - int addAppropriateSources(const Common::FSList &fslist); + int addInternalSources(); void freeResourceSources(); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index e8847f380b..2680da9d39 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -66,11 +66,20 @@ class GfxDriver; SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) : Engine(syst), _gameDescription(desc), _system(syst) { - _console = NULL; assert(g_sci == 0); g_sci = this; + + _gfxMacIconBar = 0; + + _audio = 0; _features = 0; + _resMan = 0; + _gamestate = 0; + _kernel = 0; + _vocabulary = 0; + _eventMan = 0; + _console = 0; // Set up the engine specific debug levels DebugMan.addDebugChannel(kDebugLevelError, "Error", "Script error debugging"); @@ -98,9 +107,6 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) DebugMan.addDebugChannel(kDebugLevelResMan, "ResMan", "Resource manager debugging"); DebugMan.addDebugChannel(kDebugLevelOnStartup, "OnStartup", "Enter debugger at start of game"); - _gamestate = 0; - _gfxMacIconBar = 0; - const Common::FSNode gameDataDir(ConfMan.get("path")); SearchMan.addSubDirectoryMatching(gameDataDir, "actors"); // KQ6 hi-res portraits @@ -138,11 +144,18 @@ Common::Error SciEngine::run() { ConfMan.registerDefault("enable_fb01", "false"); _resMan = new ResourceManager(); + assert(_resMan); + _resMan->addAppropriateSources(); + _resMan->init(); + // TODO: Add error handling. Check return values of addAppropriateSources + // and init. We first have to *add* sensible return values, though ;). +/* if (!_resMan) { warning("No resources found, aborting"); return Common::kNoGameDataFoundError; } +*/ // Add the after market GM patches for the specified game, if they exist _resMan->addNewGMPatch(getGameID()); -- cgit v1.2.3 From 348953c067bc9e70702b64f130cbbe4cbc742223 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:16:17 +0000 Subject: SCI: Make ResourceSource::_resourceFile const svn-id: r49826 --- engines/sci/resource.cpp | 29 +++++------------------------ engines/sci/resource.h | 2 -- engines/sci/resource_intern.h | 13 +++++++++---- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index a1e7a5c85c..108cfa5f63 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -168,10 +168,9 @@ uint32 Resource::getAudioCompressionType() { } -ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, int volNum) - : _sourceType(type), _name(name), _volumeNumber(volNum) { +ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, int volNum, const Common::FSNode *resFile) + : _sourceType(type), _name(name), _volumeNumber(volNum), _resourceFile(resFile) { _scanned = false; - _resourceFile = 0; _associatedMap = NULL; _audioCompressionType = 0; _audioCompressionOffsetMapping = NULL; @@ -202,9 +201,7 @@ ResourceSource *ResourceManager::addExternalMap(const Common::String &filename, } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ExtMapResourceSource(mapFile->getName(), volume_nr); - - newsrc->_resourceFile = mapFile; + ResourceSource *newsrc = new ExtMapResourceSource(mapFile->getName(), volume_nr, mapFile); _sources.push_back(newsrc); return newsrc; @@ -225,22 +222,6 @@ ResourceSource *ResourceManager::addSource(ResourceSource *newsrc) { return newsrc; } -ResourceSource *ResourceManager::addSource(ResourceSource *newsrc, const Common::FSNode *resFile) { - assert(newsrc); - - newsrc->_resourceFile = resFile; - if (newsrc->getSourceType() == kSourceAudioVolume) { - // TODO: Move this call into the AudioVolumeResourceSource constructor. - // Need to verify if this is safe, though; in particular, whether this - // method may be called before the new AudioVolumeResourceSource has been - // added to the _sources lists. - checkIfAudioVolumeIsCompressed(newsrc); - } - - _sources.push_back(newsrc); - return newsrc; -} - ResourceSource *ResourceManager::addPatchDir(const Common::String &dirname) { ResourceSource *newsrc = new DirectoryResourceSource(dirname); @@ -594,7 +575,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { #ifdef ENABLE_SCI32 if (sci21PatchMap && sci21PatchRes) - addSource(new VolumeResourceSource(sci21PatchRes->getName(), sci21PatchMap, 100), sci21PatchRes); + addSource(new VolumeResourceSource(sci21PatchRes->getName(), sci21PatchMap, 100, sci21PatchRes)); #endif // Now find all the resource.0?? files @@ -609,7 +590,7 @@ int ResourceManager::addAppropriateSources(const Common::FSList &fslist) { const char *dot = strrchr(filename.c_str(), '.'); int number = atoi(dot + 1); - addSource(new VolumeResourceSource(file->getName(), map, number), file); + addSource(new VolumeResourceSource(file->getName(), map, number, file)); } } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 36d75fb56f..de40f73306 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -347,8 +347,6 @@ protected: */ ResourceSource *addSource(ResourceSource *source); - ResourceSource *addSource(ResourceSource *source, const Common::FSNode *resFile); - /** * Add an external (i.e., separate file) map resource to the resource * manager's list of sources. diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 5a5129c125..f2853951fa 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -54,14 +54,14 @@ protected: public: bool _scanned; - const Common::FSNode *_resourceFile; + const Common::FSNode * const _resourceFile; const int _volumeNumber; ResourceSource *_associatedMap; // TODO: Move to VolumeResourceSource uint32 _audioCompressionType; // TODO: Move to AudioVolumeResourceSource int32 *_audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource protected: - ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0); + ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0, const Common::FSNode *resFile = 0); public: virtual ~ResourceSource(); @@ -112,6 +112,11 @@ public: _associatedMap = map; } + VolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum, const Common::FSNode *resFile) + : ResourceSource(kSourceVolume, name, volNum, resFile) { + _associatedMap = map; + } + virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { if (_associatedMap == map && _volumeNumber == volNum) return this; @@ -121,8 +126,8 @@ public: class ExtMapResourceSource : public ResourceSource { public: - ExtMapResourceSource(const Common::String &name, int volNum) - : ResourceSource(kSourceExtMap, name, volNum) { + ExtMapResourceSource(const Common::String &name, int volNum, const Common::FSNode *resFile = 0) + : ResourceSource(kSourceExtMap, name, volNum, resFile) { } virtual void scanSource(ResourceManager *resMan); -- cgit v1.2.3 From 88663c9186e5a4282f5553ad401b340db51164c2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:16:42 +0000 Subject: SCI: Merge ResourceManager::checkIfAudioVolumeIsCompressed into AudioVolumeResourceSource constructor svn-id: r49827 --- engines/sci/resource.cpp | 8 -------- engines/sci/resource.h | 7 ------- engines/sci/resource_audio.cpp | 20 +++++++++++++------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 108cfa5f63..fcff177262 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -210,14 +210,6 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i ResourceSource *ResourceManager::addSource(ResourceSource *newsrc) { assert(newsrc); - if (newsrc->getSourceType() == kSourceAudioVolume) { - // TODO: Move this call into the AudioVolumeResourceSource constructor. - // Need to verify if this is safe, though; in particular, whether this - // method may be called before the new AudioVolumeResourceSource has been - // added to the _sources lists. - checkIfAudioVolumeIsCompressed(newsrc); - } - _sources.push_back(newsrc); return newsrc; } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index de40f73306..0d76a4e4a9 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -366,13 +366,6 @@ protected: */ ResourceSource *addInternalMap(const Common::String &name, int resNr); - /** - * Checks if an audio volume got compressed by our tool. If that is the - * case, set _audioCompressionType and read in the offset translation - * table for later usage. - */ - void checkIfAudioVolumeIsCompressed(ResourceSource *source); - /** * Scans newly registered resource sources for resources, earliest addition first. * @param detected_version Pointer to the detected version number, diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 25e73242ef..4f38fe15d1 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -35,13 +35,19 @@ namespace Sci { AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum) : VolumeResourceSource(name, map, volNum, kSourceAudioVolume) { -} -void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { - Common::SeekableReadStream *fileStream = getVolumeFile(source); + ResourceManager *resMan = g_sci->getResMan(); + + /* + * Check if this audio volume got compressed by our tool. If that is the + * case, set _audioCompressionType and read in the offset translation + * table for later usage. + */ + + Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { - warning("Failed to open %s", source->getLocationName().c_str()); + warning("Failed to open %s", getLocationName().c_str()); return; } @@ -52,13 +58,13 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { case MKID_BE('OGG '): case MKID_BE('FLAC'): // Detected a compressed audio volume - source->_audioCompressionType = compressionType; + _audioCompressionType = compressionType; // Now read the whole offset mapping table for later usage int32 recordCount = fileStream->readUint32LE(); if (!recordCount) error("compressed audio volume doesn't contain any entries!"); int32 *offsetMapping = new int32[(recordCount + 1) * 2]; - source->_audioCompressionOffsetMapping = offsetMapping; + _audioCompressionOffsetMapping = offsetMapping; for (int recordNo = 0; recordNo < recordCount; recordNo++) { *offsetMapping++ = fileStream->readUint32LE(); *offsetMapping++ = fileStream->readUint32LE(); @@ -68,7 +74,7 @@ void ResourceManager::checkIfAudioVolumeIsCompressed(ResourceSource *source) { *offsetMapping++ = fileStream->size(); } - if (source->_resourceFile) + if (_resourceFile) delete fileStream; } -- cgit v1.2.3 From 6248daccfc636533ad294df7739b00c0f011f2e3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:17:05 +0000 Subject: SCI: Get rid of ugly resMan params to ResourceSource methods We might want to add a ResourceSource::_resMan member, but for now I am not adding one on purpose; many more things might still move between ResourceSource and ResourceManager, so we should wait till the refactoring is complete. svn-id: r49828 --- engines/sci/resource.cpp | 45 +++++++++++++++++++++++++++---------------- engines/sci/resource_intern.h | 26 ++++++++++++------------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index fcff177262..7d6835a336 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -315,21 +315,23 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc static uint32 resTypeToMacTag(ResourceType type); void ResourceManager::loadResource(Resource *res) { - res->_source->loadResource(res, this); + res->_source->loadResource(res); } -void PatchResourceSource::loadResource(Resource *res, ResourceManager *resMan) { +void PatchResourceSource::loadResource(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); bool result = resMan->loadFromPatchFile(res); if (!result) { // TODO: We used to fallback to the "default" code here if loadFromPatchFile // failed, but I am not sure whether that is really appropriate. // In fact it looks like a bug to me, so I commented this out for now. - //ResourceSource::loadResource(res, resMan); + //ResourceSource::loadResource(res); } } -void MacResourceForkResourceSource::loadResource(Resource *res, ResourceManager *resMan) { +void MacResourceForkResourceSource::loadResource(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); if (!stream) @@ -343,7 +345,8 @@ void MacResourceForkResourceSource::loadResource(Resource *res, ResourceManager } } -Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res, ResourceManager *resMan) { +Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { @@ -354,8 +357,9 @@ Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res, Resourc return fileStream; } -void WaveResourceSource::loadResource(Resource *res, ResourceManager *resMan) { - Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); +void WaveResourceSource::loadResource(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); + Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; @@ -365,8 +369,9 @@ void WaveResourceSource::loadResource(Resource *res, ResourceManager *resMan) { delete fileStream; } -void AudioVolumeResourceSource::loadResource(Resource *res, ResourceManager *resMan) { - Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); +void AudioVolumeResourceSource::loadResource(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); + Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; @@ -423,8 +428,9 @@ void AudioVolumeResourceSource::loadResource(Resource *res, ResourceManager *res delete fileStream; } -void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) { - Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan); +void ResourceSource::loadResource(Resource *res) { + ResourceManager *resMan = g_sci->getResMan(); + Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; @@ -616,12 +622,13 @@ void ResourceManager::scanNewSources() { if (!source->_scanned) { source->_scanned = true; - source->scanSource(this); + source->scanSource(); } } } -void DirectoryResourceSource::scanSource(ResourceManager *resMan) { +void DirectoryResourceSource::scanSource() { + ResourceManager *resMan = g_sci->getResMan(); resMan->readResourcePatches(this); // We can't use getSciVersion() at this point, thus using _volVersion @@ -631,18 +638,21 @@ void DirectoryResourceSource::scanSource(ResourceManager *resMan) { resMan->readWaveAudioPatches(); } -void ExtMapResourceSource::scanSource(ResourceManager *resMan) { +void ExtMapResourceSource::scanSource() { + ResourceManager *resMan = g_sci->getResMan(); if (resMan->_mapVersion < ResourceManager::kResVersionSci1Late) resMan->readResourceMapSCI0(this); else resMan->readResourceMapSCI1(this); } -void ExtAudioMapResourceSource::scanSource(ResourceManager *resMan) { +void ExtAudioMapResourceSource::scanSource() { + ResourceManager *resMan = g_sci->getResMan(); resMan->readAudioMapSCI1(this); } -void IntMapResourceSource::scanSource(ResourceManager *resMan) { +void IntMapResourceSource::scanSource() { + ResourceManager *resMan = g_sci->getResMan(); resMan->readAudioMapSCI11(this); } @@ -1447,7 +1457,8 @@ static uint32 resTypeToMacTag(ResourceType type) { return 0; } -void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { +void MacResourceForkResourceSource::scanSource() { + ResourceManager *resMan = g_sci->getResMan(); if (!_macResMan->open(getLocationName().c_str())) error("%s is not a valid Mac resource fork", getLocationName().c_str()); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index f2853951fa..ce5e3ac0e6 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -69,7 +69,7 @@ public: const Common::String &getLocationName() const { return _name; } // Auxiliary method, used by loadResource implementations. - Common::SeekableReadStream *getVolumeFile(Resource *res, ResourceManager *resMan); + Common::SeekableReadStream *getVolumeFile(Resource *res); /** * TODO: Document this @@ -80,29 +80,27 @@ public: /** * Scan this source for TODO. - * TODO: The resMan param for now is just a hack. */ - virtual void scanSource(ResourceManager *resMan) {} + virtual void scanSource() {} /** * Load a resource. - * TODO: The resMan param for now is just a hack. */ - virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res); }; class DirectoryResourceSource : public ResourceSource { public: DirectoryResourceSource(const Common::String &name) : ResourceSource(kSourceDirectory, name) {} - virtual void scanSource(ResourceManager *resMan); + virtual void scanSource(); }; class PatchResourceSource : public ResourceSource { public: PatchResourceSource(const Common::String &name) : ResourceSource(kSourcePatch, name) {} - virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res); }; class VolumeResourceSource : public ResourceSource { @@ -130,7 +128,7 @@ public: : ResourceSource(kSourceExtMap, name, volNum, resFile) { } - virtual void scanSource(ResourceManager *resMan); + virtual void scanSource(); }; class IntMapResourceSource : public ResourceSource { @@ -139,14 +137,14 @@ public: : ResourceSource(kSourceIntMap, name, volNum) { } - virtual void scanSource(ResourceManager *resMan); + virtual void scanSource(); }; class AudioVolumeResourceSource : public VolumeResourceSource { public: AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum); - virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res); }; class ExtAudioMapResourceSource : public ResourceSource { @@ -155,14 +153,14 @@ public: : ResourceSource(kSourceExtAudioMap, name, volNum) { } - virtual void scanSource(ResourceManager *resMan); + virtual void scanSource(); }; class WaveResourceSource : public ResourceSource { public: WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {} - virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res); }; class MacResourceForkResourceSource : public ResourceSource { @@ -176,9 +174,9 @@ public: /** * Reads the SCI1.1+ resource file from a Mac resource fork. */ - virtual void scanSource(ResourceManager *resMan); + virtual void scanSource(); - virtual void loadResource(Resource *res, ResourceManager *resMan); + virtual void loadResource(Resource *res); }; } // End of namespace Sci -- cgit v1.2.3 From 1a0201f7e978df307e496a43691b81950eba66b1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:17:25 +0000 Subject: SCI: cleanup svn-id: r49829 --- engines/sci/resource.cpp | 3 ++- engines/sci/resource_audio.cpp | 9 ++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 7d6835a336..df66fe0e38 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -351,7 +351,8 @@ Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res) { if (!fileStream) { warning("Failed to open %s", getLocationName().c_str()); - res->unalloc(); + if (res) + res->unalloc(); } return fileStream; diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 4f38fe15d1..472a9773ae 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -36,20 +36,15 @@ namespace Sci { AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum) : VolumeResourceSource(name, map, volNum, kSourceAudioVolume) { - ResourceManager *resMan = g_sci->getResMan(); - /* * Check if this audio volume got compressed by our tool. If that is the * case, set _audioCompressionType and read in the offset translation * table for later usage. */ - Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); - - if (!fileStream) { - warning("Failed to open %s", getLocationName().c_str()); + Common::SeekableReadStream *fileStream = getVolumeFile(0); + if (!fileStream) return; - } fileStream->seek(0, SEEK_SET); uint32 compressionType = fileStream->readUint32BE(); -- cgit v1.2.3 From 6667a7102738cda6e36e928bb7a9b4ca8f128e78 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:17:47 +0000 Subject: SCI: Move _audioCompression(Type|OffsetMapping) to AudioVolumeResourceSource svn-id: r49830 --- engines/sci/resource.cpp | 10 ++++++---- engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 3 +++ engines/sci/resource_intern.h | 11 +++++++++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index df66fe0e38..b37f89ae5b 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -163,8 +163,12 @@ void Resource::writeToStream(Common::WriteStream *stream) const { stream->write(data, size); } -uint32 Resource::getAudioCompressionType() { - return _source->_audioCompressionType; +uint32 Resource::getAudioCompressionType() const { + return _source->getAudioCompressionType(); +} + +uint32 AudioVolumeResourceSource::getAudioCompressionType() const { + return _audioCompressionType; } @@ -172,8 +176,6 @@ ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, i : _sourceType(type), _name(name), _volumeNumber(volNum), _resourceFile(resFile) { _scanned = false; _associatedMap = NULL; - _audioCompressionType = 0; - _audioCompressionOffsetMapping = NULL; } ResourceSource::~ResourceSource() { diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 0d76a4e4a9..db8a1c2a47 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -190,7 +190,7 @@ public: * This method is used only by the "dump" debugger command. */ void writeToStream(Common::WriteStream *stream) const; - uint32 getAudioCompressionType(); + uint32 getAudioCompressionType() const; protected: int32 _fileOffset; /**< Offset in file */ diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 472a9773ae..81ea99e17a 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -36,6 +36,9 @@ namespace Sci { AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum) : VolumeResourceSource(name, map, volNum, kSourceAudioVolume) { + _audioCompressionType = 0; + _audioCompressionOffsetMapping = NULL; + /* * Check if this audio volume got compressed by our tool. If that is the * case, set _audioCompressionType and read in the offset translation diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index ce5e3ac0e6..c58fc72ff2 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -57,8 +57,6 @@ public: const Common::FSNode * const _resourceFile; const int _volumeNumber; ResourceSource *_associatedMap; // TODO: Move to VolumeResourceSource - uint32 _audioCompressionType; // TODO: Move to AudioVolumeResourceSource - int32 *_audioCompressionOffsetMapping; // TODO: Move to AudioVolumeResourceSource protected: ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0, const Common::FSNode *resFile = 0); @@ -87,6 +85,9 @@ public: * Load a resource. */ virtual void loadResource(Resource *res); + + virtual uint32 getAudioCompressionType() const { return 0; } + }; class DirectoryResourceSource : public ResourceSource { @@ -141,10 +142,16 @@ public: }; class AudioVolumeResourceSource : public VolumeResourceSource { +protected: + uint32 _audioCompressionType; + int32 *_audioCompressionOffsetMapping; + public: AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum); virtual void loadResource(Resource *res); + + virtual uint32 getAudioCompressionType() const; }; class ExtAudioMapResourceSource : public ResourceSource { -- cgit v1.2.3 From b9a3a9c12d04ab0886cedc2dec81689d5458d4ca Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:18:07 +0000 Subject: SCI: Move _associatedMap to VolumeResourceSource and make it const svn-id: r49831 --- engines/sci/resource.cpp | 1 - engines/sci/resource_audio.cpp | 2 +- engines/sci/resource_intern.h | 10 +++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index b37f89ae5b..df33ec6b89 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -175,7 +175,6 @@ uint32 AudioVolumeResourceSource::getAudioCompressionType() const { ResourceSource::ResourceSource(ResSourceType type, const Common::String &name, int volNum, const Common::FSNode *resFile) : _sourceType(type), _name(name), _volumeNumber(volNum), _resourceFile(resFile) { _scanned = false; - _associatedMap = NULL; } ResourceSource::~ResourceSource() { diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 81ea99e17a..4df2f6515b 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -417,7 +417,7 @@ void ResourceManager::setAudioLanguage(int language) { Common::List::iterator it = _sources.begin(); while (it != _sources.end()) { ResourceSource *src = *it; - if (src->_associatedMap == _audioMapSCI1) { + if (src->findVolume(_audioMapSCI1, src->_volumeNumber)) { it = _sources.erase(it); delete src; } else { diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index c58fc72ff2..209f3720b1 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -56,7 +56,6 @@ public: bool _scanned; const Common::FSNode * const _resourceFile; const int _volumeNumber; - ResourceSource *_associatedMap; // TODO: Move to VolumeResourceSource protected: ResourceSource(ResSourceType type, const Common::String &name, int volNum = 0, const Common::FSNode *resFile = 0); @@ -105,15 +104,16 @@ public: }; class VolumeResourceSource : public ResourceSource { +protected: + ResourceSource * const _associatedMap; + public: VolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum, ResSourceType type = kSourceVolume) - : ResourceSource(type, name, volNum) { - _associatedMap = map; + : ResourceSource(type, name, volNum), _associatedMap(map) { } VolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum, const Common::FSNode *resFile) - : ResourceSource(kSourceVolume, name, volNum, resFile) { - _associatedMap = map; + : ResourceSource(kSourceVolume, name, volNum, resFile), _associatedMap(map) { } virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { -- cgit v1.2.3 From 63d9cfb3bf0eb252838ad30946fa8cf51921124b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:18:31 +0000 Subject: SCI: Add ResourceManager::updateResource(); change some code to use addResource() svn-id: r49832 --- engines/sci/resource.cpp | 72 ++++++++++++++++++------------------------ engines/sci/resource.h | 1 + engines/sci/resource_audio.cpp | 19 ++--------- engines/sci/resource_intern.h | 6 ++-- 4 files changed, 38 insertions(+), 60 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index df33ec6b89..a57ae04847 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1134,20 +1134,12 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource return; } - // Prepare destination, if neccessary - if (_resMap.contains(resId) == false) { - newrsc = new Resource; - _resMap.setVal(resId, newrsc); - } else - newrsc = _resMap.getVal(resId); - // Overwrite everything, because we're patching - newrsc->_id = resId; - newrsc->_status = kResStatusNoMalloc; - newrsc->_source = source; - newrsc->size = fsize - patchDataOffset - 2; + newrsc = updateResource(resId, source, fsize - patchDataOffset - 2); newrsc->_headerSize = patchDataOffset; newrsc->_fileOffset = 0; + + debugC(1, kDebugLevelResMan, "Patching %s - OK", source->getLocationName().c_str()); } @@ -1285,7 +1277,6 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { int ResourceManager::readResourceMapSCI0(ResourceSource *map) { Common::SeekableReadStream *fileStream = 0; - Resource *res; ResourceType type; uint16 number, id; uint32 offset; @@ -1323,9 +1314,8 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { ResourceId resId = ResourceId(type, number); // adding a new resource if (_resMap.contains(resId) == false) { - res = new Resource; - res->_source = findVolume(map, offset >> bShift); - if (!res->_source) { + ResourceSource *source = findVolume(map, offset >> bShift); + if (!source) { warning("Could not get volume for resource %d, VolumeID %d", id, offset >> bShift); if (_mapVersion != _volVersion) { warning("Retrying with the detected volume version instead"); @@ -1333,12 +1323,11 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { _mapVersion = _volVersion; bMask = (_mapVersion == kResVersionSci1Middle) ? 0xF0 : 0xFC; bShift = (_mapVersion == kResVersionSci1Middle) ? 28 : 26; - res->_source = findVolume(map, offset >> bShift); + source = findVolume(map, offset >> bShift); } } - res->_fileOffset = offset & (((~bMask) << 24) | 0xFFFFFF); - res->_id = resId; - _resMap.setVal(resId, res); + + addResource(resId, source, offset & (((~bMask) << 24) | 0xFFFFFF)); } } while (!fileStream->eos()); @@ -1348,7 +1337,6 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { int ResourceManager::readResourceMapSCI1(ResourceSource *map) { Common::SeekableReadStream *fileStream = 0; - Resource *res; if (map->_resourceFile) { fileStream = map->_resourceFile->createReadStream(); @@ -1409,16 +1397,11 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { resId = ResourceId((ResourceType)type, number); // adding new resource only if it does not exist if (_resMap.contains(resId) == false) { - res = new Resource; - _resMap.setVal(resId, res); - res->_id = resId; - // NOTE: We add the map's volume number here to the specified volume number // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers // need to be used in concurrence with the volume specified in the map to get // the actual resource file. - res->_source = findVolume(map, volume_nr + map->_volumeNumber); - res->_fileOffset = off; + addResource(resId, findVolume(map, volume_nr + map->_volumeNumber), off); } } } @@ -1494,21 +1477,8 @@ void MacResourceForkResourceSource::scanSource() { ResourceId resId = ResourceId(type, idArray[j]); - Resource *newrsc = NULL; - - // Prepare destination, if neccessary. Resource forks may contain patches. - if (!resMan->_resMap.contains(resId)) { - newrsc = new Resource; - resMan->_resMap.setVal(resId, newrsc); - } else - newrsc = resMan->_resMap.getVal(resId); - - // Overwrite everything - newrsc->_id = resId; - newrsc->_status = kResStatusNoMalloc; - newrsc->_source = this; - newrsc->size = fileSize; - newrsc->_headerSize = 0; + // Overwrite Resource instance. Resource forks may contain patches. + resMan->updateResource(resId, this, fileSize); } } } @@ -1525,6 +1495,26 @@ void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 } } +Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, uint32 size) { + // Update a patched resource, whether it exists or not + Resource *res = 0; + + if (_resMap.contains(resId)) { + res = _resMap.getVal(resId); + } else { + res = new Resource; + _resMap.setVal(resId, res); + } + + res->_id = resId; + res->_status = kResStatusNoMalloc; + res->_source = src; + res->_headerSize = 0; + res->size = size; + + return res; +} + int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression) { // SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes diff --git a/engines/sci/resource.h b/engines/sci/resource.h index db8a1c2a47..09d87eb9e3 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -395,6 +395,7 @@ protected: int decompress(Resource *res, Common::SeekableReadStream *file); int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0); + Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size); void removeAudioResource(ResourceId resId); /**--- Resource map decoding functions ---*/ diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 4df2f6515b..26ea96fb6c 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -170,24 +170,11 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { ResourceSource *resSrc = new WaveResourceSource(name); + Common::File file; + file.open(name); - Resource *newRes = 0; - - if (_resMap.contains(resourceId)) { - newRes = _resMap.getVal(resourceId); - } else { - newRes = new Resource; - _resMap.setVal(resourceId, newRes); - } - - Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name); - newRes->size = stream->size(); - delete stream; + updateResource(resourceId, resSrc, name.size()); - newRes->_id = resourceId; - newRes->_status = kResStatusNoMalloc; - newRes->_source = resSrc; - newRes->_headerSize = 0; debugC(1, kDebugLevelResMan, "Patching %s - OK", name.c_str()); } diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 209f3720b1..042c5428d8 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -170,6 +170,9 @@ public: virtual void loadResource(Resource *res); }; +/** + * Reads SCI1.1+ resources from a Mac resource fork. + */ class MacResourceForkResourceSource : public ResourceSource { protected: Common::MacResManager *_macResMan; @@ -178,9 +181,6 @@ public: MacResourceForkResourceSource(const Common::String &name, int volNum); ~MacResourceForkResourceSource(); - /** - * Reads the SCI1.1+ resource file from a Mac resource fork. - */ virtual void scanSource(); virtual void loadResource(Resource *res); -- cgit v1.2.3 From 335e17af012590a68ae16ed60eff6fda221a1dce Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:18:57 +0000 Subject: SCI: Move several methods from ResourceManager to Resource svn-id: r49833 --- engines/sci/resource.cpp | 25 ++++++++++++------------- engines/sci/resource.h | 11 ++++++----- engines/sci/resource_audio.cpp | 16 +++++++++++----- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index a57ae04847..370a135a69 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -234,7 +234,9 @@ ResourceSource *ResourceManager::findVolume(ResourceSource *map, int volume_nr) // Resource manager constructors and operations -bool ResourceManager::loadPatch(Resource *res, Common::SeekableReadStream *file) { +bool Resource::loadPatch(Common::SeekableReadStream *file) { + Resource *res = this; + // We assume that the resource type matches res->type // We also assume that the current file position is right at the actual data (behind resourceid/headersize byte) @@ -262,17 +264,17 @@ bool ResourceManager::loadPatch(Resource *res, Common::SeekableReadStream *file) return true; } -bool ResourceManager::loadFromPatchFile(Resource *res) { +bool Resource::loadFromPatchFile() { Common::File file; - const Common::String &filename = res->_source->getLocationName(); + const Common::String &filename = _source->getLocationName(); if (file.open(filename) == false) { warning("Failed to open patch file %s", filename.c_str()); - res->unalloc(); + unalloc(); return false; } // Skip resourceid and header size byte file.seek(2, SEEK_SET); - return loadPatch(res, &file); + return loadPatch(&file); } Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *source) { @@ -321,8 +323,7 @@ void ResourceManager::loadResource(Resource *res) { void PatchResourceSource::loadResource(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); - bool result = resMan->loadFromPatchFile(res); + bool result = res->loadFromPatchFile(); if (!result) { // TODO: We used to fallback to the "default" code here if loadFromPatchFile // failed, but I am not sure whether that is really appropriate. @@ -360,19 +361,17 @@ Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res) { } void WaveResourceSource::loadResource(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; fileStream->seek(res->_fileOffset, SEEK_SET); - resMan->loadFromWaveFile(res, fileStream); + res->loadFromWaveFile(fileStream); if (_resourceFile) delete fileStream; } void AudioVolumeResourceSource::loadResource(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; @@ -410,7 +409,7 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { case kResourceTypeAudio: case kResourceTypeAudio36: // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 - resMan->loadFromAudioVolumeSCI1(res, fileStream); + res->loadFromAudioVolumeSCI1(fileStream); if (_resourceFile) delete fileStream; return; @@ -422,9 +421,9 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { fileStream->seek(res->_fileOffset, SEEK_SET); } if (getSciVersion() < SCI_VERSION_1_1) - resMan->loadFromAudioVolumeSCI1(res, fileStream); + res->loadFromAudioVolumeSCI1(fileStream); else - resMan->loadFromAudioVolumeSCI11(res, fileStream); + res->loadFromAudioVolumeSCI11(fileStream); if (_resourceFile) delete fileStream; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 09d87eb9e3..85e03d3a4c 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -192,6 +192,12 @@ public: void writeToStream(Common::WriteStream *stream) const; uint32 getAudioCompressionType() const; + bool loadPatch(Common::SeekableReadStream *file); + bool loadFromPatchFile(); + bool loadFromWaveFile(Common::SeekableReadStream *file); + bool loadFromAudioVolumeSCI1(Common::SeekableReadStream *file); + bool loadFromAudioVolumeSCI11(Common::SeekableReadStream *file); + protected: int32 _fileOffset; /**< Offset in file */ ResourceStatus _status; @@ -386,11 +392,6 @@ protected: Common::SeekableReadStream *getVolumeFile(ResourceSource *source); void loadResource(Resource *res); - bool loadPatch(Resource *res, Common::SeekableReadStream *file); - bool loadFromPatchFile(Resource *res); - bool loadFromWaveFile(Resource *res, Common::SeekableReadStream *file); - bool loadFromAudioVolumeSCI1(Resource *res, Common::SeekableReadStream *file); - bool loadFromAudioVolumeSCI11(Resource *res, Common::SeekableReadStream *file); void freeOldResources(); int decompress(Resource *res, Common::SeekableReadStream *file); int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 26ea96fb6c..1b90cdfb02 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -76,7 +76,9 @@ AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, delete fileStream; } -bool ResourceManager::loadFromWaveFile(Resource *res, Common::SeekableReadStream *file) { +bool Resource::loadFromWaveFile(Common::SeekableReadStream *file) { + Resource *res = this; + res->data = new byte[res->size]; uint32 really_read = file->read(res->data, res->size); @@ -87,14 +89,16 @@ bool ResourceManager::loadFromWaveFile(Resource *res, Common::SeekableReadStream return true; } -bool ResourceManager::loadFromAudioVolumeSCI11(Resource *res, Common::SeekableReadStream *file) { +bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { + Resource *res = this; + // Check for WAVE files here uint32 riffTag = file->readUint32BE(); if (riffTag == MKID_BE('RIFF')) { res->_headerSize = 0; res->size = file->readUint32LE(); file->seek(-8, SEEK_CUR); - return loadFromWaveFile(res, file); + return loadFromWaveFile(file); } file->seek(-4, SEEK_CUR); @@ -122,10 +126,12 @@ bool ResourceManager::loadFromAudioVolumeSCI11(Resource *res, Common::SeekableRe file->seek(-11, SEEK_CUR); } - return loadPatch(res, file); + return loadPatch(file); } -bool ResourceManager::loadFromAudioVolumeSCI1(Resource *res, Common::SeekableReadStream *file) { +bool Resource::loadFromAudioVolumeSCI1(Common::SeekableReadStream *file) { + Resource *res = this; + res->data = new byte[res->size]; if (res->data == NULL) { -- cgit v1.2.3 From 4392cdaee19b626058144b0fc309c1a6ea09cd79 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:19:14 +0000 Subject: SCI: cleanup svn-id: r49834 --- engines/sci/resource.cpp | 5 +++-- engines/sci/resource_audio.cpp | 50 +++++++++++++++++++----------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 370a135a69..2833a00c76 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -333,12 +333,12 @@ void PatchResourceSource::loadResource(Resource *res) { } void MacResourceForkResourceSource::loadResource(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); if (!stream) error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); + ResourceManager *resMan = g_sci->getResMan(); int error = resMan->decompress(res, stream); if (error) { warning("Error %d occured while reading %s from Mac resource file: %s", @@ -430,12 +430,13 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { } void ResourceSource::loadResource(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); Common::SeekableReadStream *fileStream = getVolumeFile(res); if (!fileStream) return; fileStream->seek(res->_fileOffset, SEEK_SET); + + ResourceManager *resMan = g_sci->getResMan(); int error = resMan->decompress(res, fileStream); if (_resourceFile) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 1b90cdfb02..7daaa0f979 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -77,51 +77,47 @@ AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, } bool Resource::loadFromWaveFile(Common::SeekableReadStream *file) { - Resource *res = this; + data = new byte[size]; - res->data = new byte[res->size]; + uint32 really_read = file->read(data, size); + if (really_read != size) + error("Read %d bytes from %s but expected %d", really_read, _id.toString().c_str(), size); - uint32 really_read = file->read(res->data, res->size); - if (really_read != res->size) - error("Read %d bytes from %s but expected %d", really_read, res->_id.toString().c_str(), res->size); - - res->_status = kResStatusAllocated; + _status = kResStatusAllocated; return true; } bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { - Resource *res = this; - // Check for WAVE files here uint32 riffTag = file->readUint32BE(); if (riffTag == MKID_BE('RIFF')) { - res->_headerSize = 0; - res->size = file->readUint32LE(); + _headerSize = 0; + size = file->readUint32LE(); file->seek(-8, SEEK_CUR); return loadFromWaveFile(file); } file->seek(-4, SEEK_CUR); ResourceType type = (ResourceType)(file->readByte() & 0x7f); - if (((res->_id.type == kResourceTypeAudio || res->_id.type == kResourceTypeAudio36) && (type != kResourceTypeAudio)) - || ((res->_id.type == kResourceTypeSync || res->_id.type == kResourceTypeSync36) && (type != kResourceTypeSync))) { - warning("Resource type mismatch loading %s", res->_id.toString().c_str()); - res->unalloc(); + if (((_id.type == kResourceTypeAudio || _id.type == kResourceTypeAudio36) && (type != kResourceTypeAudio)) + || ((_id.type == kResourceTypeSync || _id.type == kResourceTypeSync36) && (type != kResourceTypeSync))) { + warning("Resource type mismatch loading %s", _id.toString().c_str()); + unalloc(); return false; } - res->_headerSize = file->readByte(); + _headerSize = file->readByte(); if (type == kResourceTypeAudio) { - if (res->_headerSize != 11 && res->_headerSize != 12) { + if (_headerSize != 11 && _headerSize != 12) { warning("Unsupported audio header"); - res->unalloc(); + unalloc(); return false; } // Load sample size file->seek(7, SEEK_CUR); - res->size = file->readUint32LE(); + size = file->readUint32LE(); // Adjust offset to point at the header data again file->seek(-11, SEEK_CUR); } @@ -130,19 +126,17 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { } bool Resource::loadFromAudioVolumeSCI1(Common::SeekableReadStream *file) { - Resource *res = this; - - res->data = new byte[res->size]; + data = new byte[size]; - if (res->data == NULL) { - error("Can't allocate %d bytes needed for loading %s", res->size, res->_id.toString().c_str()); + if (data == NULL) { + error("Can't allocate %d bytes needed for loading %s", size, _id.toString().c_str()); } - unsigned int really_read = file->read(res->data, res->size); - if (really_read != res->size) - warning("Read %d bytes from %s but expected %d", really_read, res->_id.toString().c_str(), res->size); + unsigned int really_read = file->read(data, size); + if (really_read != size) + warning("Read %d bytes from %s but expected %d", really_read, _id.toString().c_str(), size); - res->_status = kResStatusAllocated; + _status = kResStatusAllocated; return true; } -- cgit v1.2.3 From 583a966d8c91250284ebe3fd84fce4e0ed12ae13 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:19:39 +0000 Subject: SCI: Move decompress & readResourceInfo to Resource; more cleanup svn-id: r49835 --- engines/sci/resource.cpp | 51 +++++++++++++++++++++--------------------- engines/sci/resource.h | 42 +++++++++++++++++----------------- engines/sci/resource_audio.cpp | 4 ++-- 3 files changed, 49 insertions(+), 48 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 2833a00c76..ee32458748 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -338,8 +338,7 @@ void MacResourceForkResourceSource::loadResource(Resource *res) { if (!stream) error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); - ResourceManager *resMan = g_sci->getResMan(); - int error = resMan->decompress(res, stream); + int error = res->decompress(stream); if (error) { warning("Error %d occured while reading %s from Mac resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); @@ -436,8 +435,7 @@ void ResourceSource::loadResource(Resource *res) { fileStream->seek(res->_fileOffset, SEEK_SET); - ResourceManager *resMan = g_sci->getResMan(); - int error = resMan->decompress(res, fileStream); + int error = res->decompress(fileStream); if (_resourceFile) delete fileStream; @@ -631,18 +629,18 @@ void ResourceManager::scanNewSources() { void DirectoryResourceSource::scanSource() { ResourceManager *resMan = g_sci->getResMan(); - resMan->readResourcePatches(this); + resMan->readResourcePatches(); // We can't use getSciVersion() at this point, thus using _volVersion - if (resMan->_volVersion >= ResourceManager::kResVersionSci11) // SCI1.1+ - resMan->readResourcePatchesBase36(this); + if (resMan->_volVersion >= kResVersionSci11) // SCI1.1+ + resMan->readResourcePatchesBase36(); resMan->readWaveAudioPatches(); } void ExtMapResourceSource::scanSource() { ResourceManager *resMan = g_sci->getResMan(); - if (resMan->_mapVersion < ResourceManager::kResVersionSci1Late) + if (resMan->_mapVersion < kResVersionSci1Late) resMan->readResourceMapSCI0(this); else resMan->readResourceMapSCI1(this); @@ -881,7 +879,7 @@ const char *ResourceManager::versionDescription(ResVersion version) const { return "Version not valid"; } -ResourceManager::ResVersion ResourceManager::detectMapVersion() { +ResVersion ResourceManager::detectMapVersion() { Common::SeekableReadStream *fileStream = 0; byte buff[6]; ResourceSource *rsrc= 0; @@ -971,7 +969,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { return kResVersionUnknown; } -ResourceManager::ResVersion ResourceManager::detectVolVersion() { +ResVersion ResourceManager::detectVolVersion() { Common::SeekableReadStream *fileStream = 0; ResourceSource *rsrc; @@ -1143,7 +1141,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource debugC(1, kDebugLevelResMan, "Patching %s - OK", source->getLocationName().c_str()); } -void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { +void ResourceManager::readResourcePatchesBase36() { // The base36 encoded audio36 and sync36 resources use a different naming scheme, because they // cannot be described with a single resource number, but are a result of a // tuple. Please don't be confused with the normal audio patches @@ -1227,7 +1225,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { } } -void ResourceManager::readResourcePatches(ResourceSource *source) { +void ResourceManager::readResourcePatches() { // Note: since some SCI1 games(KQ5 floppy, SQ4) might use SCI0 naming scheme for patch files // this function tries to read patch file with any supported naming scheme, // regardless of s_sciVersion value @@ -1515,7 +1513,7 @@ Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, return res; } -int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file, +int Resource::readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression) { // SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes // SCI1 volume format: {bResType wResNumber wPacked+4 wUnpacked wCompression} = 9 bytes @@ -1525,7 +1523,8 @@ int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream uint32 wCompression, szUnpacked; ResourceType type; - switch (_volVersion) { + ResourceManager *resMan = g_sci->getResMan(); + switch (resMan->_volVersion) { case kResVersionSci0Sci1Early: case kResVersionSci1Middle: w = file->readUint16LE(); @@ -1552,8 +1551,8 @@ int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream case kResVersionSci11Mac: // Doesn't store this data in the resource. Fortunately, // we already have this data. - type = res->_id.type; - number = res->_id.number; + type = _id.type; + number = _id.number; szPacked = file->size(); szUnpacked = file->size(); wCompression = 0; @@ -1575,8 +1574,8 @@ int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream if ((file->eos() || file->err())) return SCI_ERROR_IO_ERROR; - res->_id = ResourceId(type, number); - res->size = szUnpacked; + _id = ResourceId(type, number); + size = szUnpacked; // checking compression method switch (wCompression) { @@ -1612,13 +1611,13 @@ int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream return compression == kCompUnknown ? SCI_ERROR_UNKNOWN_COMPRESSION : 0; } -int ResourceManager::decompress(Resource *res, Common::SeekableReadStream *file) { +int Resource::decompress(Common::SeekableReadStream *file) { int error; uint32 szPacked = 0; ResourceCompression compression = kCompUnknown; // fill resource info - error = readResourceInfo(res, file, szPacked, compression); + error = readResourceInfo(file, szPacked, compression); if (error) return error; @@ -1646,15 +1645,15 @@ int ResourceManager::decompress(Resource *res, Common::SeekableReadStream *file) break; #endif default: - warning("Resource %s: Compression method %d not supported", res->_id.toString().c_str(), compression); + warning("Resource %s: Compression method %d not supported", _id.toString().c_str(), compression); return SCI_ERROR_UNKNOWN_COMPRESSION; } - res->data = new byte[res->size]; - res->_status = kResStatusAllocated; - error = res->data ? dec->unpack(file, res->data, szPacked, res->size) : SCI_ERROR_RESOURCE_TOO_BIG; + data = new byte[size]; + _status = kResStatusAllocated; + error = data ? dec->unpack(file, data, szPacked, size) : SCI_ERROR_RESOURCE_TOO_BIG; if (error) - res->unalloc(); + unalloc(); delete dec; return error; @@ -1683,7 +1682,7 @@ ResourceCompression ResourceManager::getViewCompression() { uint32 szPacked; ResourceCompression compression; - if (readResourceInfo(res, fileStream, szPacked, compression)) { + if (res->readResourceInfo(fileStream, szPacked, compression)) { if (res->_source->_resourceFile) delete fileStream; continue; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 85e03d3a4c..53cf2ddb47 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -167,6 +167,7 @@ class Resource { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. friend class ResourceSource; + friend class PatchResourceSource; friend class WaveResourceSource; friend class AudioVolumeResourceSource; friend class MacResourceForkResourceSource; @@ -192,24 +193,37 @@ public: void writeToStream(Common::WriteStream *stream) const; uint32 getAudioCompressionType() const; - bool loadPatch(Common::SeekableReadStream *file); - bool loadFromPatchFile(); - bool loadFromWaveFile(Common::SeekableReadStream *file); - bool loadFromAudioVolumeSCI1(Common::SeekableReadStream *file); - bool loadFromAudioVolumeSCI11(Common::SeekableReadStream *file); - protected: int32 _fileOffset; /**< Offset in file */ ResourceStatus _status; uint16 _lockers; /**< Number of places where this resource was locked */ ResourceSource *_source; + + bool loadPatch(Common::SeekableReadStream *file); + bool loadFromPatchFile(); + bool loadFromWaveFile(Common::SeekableReadStream *file); + bool loadFromAudioVolumeSCI1(Common::SeekableReadStream *file); + bool loadFromAudioVolumeSCI11(Common::SeekableReadStream *file); + int decompress(Common::SeekableReadStream *file); + int readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); }; typedef Common::HashMap ResourceMap; +enum ResVersion { + kResVersionUnknown, + kResVersionSci0Sci1Early, + kResVersionSci1Middle, + kResVersionSci1Late, + kResVersionSci11, + kResVersionSci11Mac, + kResVersionSci32 +}; + class ResourceManager { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. + friend class Resource; // For _volVersion friend class ResourceSource; friend class DirectoryResourceSource; friend class PatchResourceSource; @@ -221,16 +235,6 @@ class ResourceManager { friend class MacResourceForkResourceSource; public: - enum ResVersion { - kResVersionUnknown, - kResVersionSci0Sci1Early, - kResVersionSci1Middle, - kResVersionSci1Late, - kResVersionSci11, - kResVersionSci11Mac, - kResVersionSci32 - }; - /** * Creates a new SCI resource manager. */ @@ -393,8 +397,6 @@ protected: Common::SeekableReadStream *getVolumeFile(ResourceSource *source); void loadResource(Resource *res); void freeOldResources(); - int decompress(Resource *res, Common::SeekableReadStream *file); - int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0); Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size); void removeAudioResource(ResourceId resId); @@ -437,8 +439,8 @@ protected: /** * Reads patch files from a local directory. */ - void readResourcePatches(ResourceSource *source); - void readResourcePatchesBase36(ResourceSource *source); + void readResourcePatches(); + void readResourcePatchesBase36(); void processPatch(ResourceSource *source, ResourceType resourceType, uint16 resourceNr, uint32 tuple = 0); /** diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 7daaa0f979..eba14d4d5e 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -319,8 +319,8 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { } if (n & 0x40) { - // This seems to define the size of raw lipsync data (at least in kq6), may also just be general appended - // data + // This seems to define the size of raw lipsync data (at least + // in kq6), may also just be general appended data. syncSize += READ_LE_UINT16(ptr); ptr += 2; } -- cgit v1.2.3 From 79c9be5d96ca58a20afa61b4b26e28839dfb925e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:20:03 +0000 Subject: Reduce header dependencies svn-id: r49836 --- engines/sci/graphics/portrait.cpp | 1 + engines/sci/resource.cpp | 1 + engines/sci/resource.h | 7 ++++++- engines/sci/resource_audio.cpp | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index 1b4e4bde77..b912bf552e 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -23,6 +23,7 @@ * */ +#include "common/archive.h" #include "common/util.h" #include "common/stack.h" #include "graphics/primitives.h" diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index ee32458748..fb601c7f82 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -26,6 +26,7 @@ // Resource library #include "common/file.h" +#include "common/fs.h" #include "common/macresman.h" #include "sci/resource.h" diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 53cf2ddb47..0fd256633f 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -26,8 +26,9 @@ #ifndef SCI_RESOURCE_H #define SCI_RESOURCE_H -#include "common/fs.h" #include "common/str.h" +#include "common/list.h" +#include "common/hashmap.h" #include "sci/graphics/helpers.h" // for ViewType #include "sci/decompressor.h" @@ -35,6 +36,10 @@ namespace Common { class File; +class FSList; +class FSNode; +class WriteStream; +class SeekableReadStream; } namespace Sci { diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index eba14d4d5e..9cd3f32561 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -25,6 +25,7 @@ // Resource library +#include "common/archive.h" #include "common/file.h" #include "sci/resource.h" -- cgit v1.2.3 From 96f1e293009a7fe1291ed0f7c1255f9010b75098 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:20:24 +0000 Subject: cleanup svn-id: r49837 --- engines/sci/resource.h | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 0fd256633f..4b391cf6cd 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -365,7 +365,7 @@ protected: /** * Add an external (i.e., separate file) map resource to the resource * manager's list of sources. - * @param file_name The name of the volume to add + * @param filename The name of the volume to add * @param volume_nr The volume number the map starts at, 0 for getSupportedFormats(); + Common::List getSupportedFormats() const; // Set the size of the video bitmap. // Typically, 320x200 diff --git a/backends/platform/dc/display.cpp b/backends/platform/dc/display.cpp index 35fc94b3cc..53dbff333d 100644 --- a/backends/platform/dc/display.cpp +++ b/backends/platform/dc/display.cpp @@ -198,7 +198,7 @@ Graphics::PixelFormat OSystem_Dreamcast::getScreenFormat() const return screenFormats[_screenFormat]; } -Common::List OSystem_Dreamcast::getSupportedFormats() +Common::List OSystem_Dreamcast::getSupportedFormats() const { Common::List list; unsigned i; diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index 15e0188ebf..a9f33f6091 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -379,7 +379,7 @@ inline bool DisplayManager::isTimeToUpdate() { return true; } -Common::List DisplayManager::getSupportedPixelFormats() { +Common::List DisplayManager::getSupportedPixelFormats() const { Common::List list; // In order of preference diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h index bceb85703d..dbbdf2022c 100644 --- a/backends/platform/psp/display_manager.h +++ b/backends/platform/psp/display_manager.h @@ -83,12 +83,12 @@ public: void setSizeAndPixelFormat(uint width, uint height, const Graphics::PixelFormat *format); // Getters - float getScaleX() { return _displayParams.scaleX; } - float getScaleY() { return _displayParams.scaleY; } - uint32 getOutputWidth() { return _displayParams.screenOutput.width; } - uint32 getOutputHeight() { return _displayParams.screenOutput.height; } - uint32 getOutputBitsPerPixel() { return _displayParams.outputBitsPerPixel; } - Common::List getSupportedPixelFormats(); + float getScaleX() const { return _displayParams.scaleX; } + float getScaleY() const { return _displayParams.scaleY; } + uint32 getOutputWidth() const { return _displayParams.screenOutput.width; } + uint32 getOutputHeight() const { return _displayParams.screenOutput.height; } + uint32 getOutputBitsPerPixel() const { return _displayParams.outputBitsPerPixel; } + Common::List getSupportedPixelFormats() const; private: struct GlobalDisplayParams { diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index b0fb971230..580e4f1cfd 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -148,7 +148,7 @@ Graphics::PixelFormat OSystem_PSP::getScreenFormat() const { return _screen.getScummvmPixelFormat(); } -Common::List OSystem_PSP::getSupportedFormats() { +Common::List OSystem_PSP::getSupportedFormats() const { return _displayManager.getSupportedPixelFormats(); } diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index d8ec8fe824..56a64ccb80 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -87,7 +87,7 @@ public: int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List getSupportedFormats(); + virtual Common::List getSupportedFormats() const; #endif // Screen size diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 82670cfcb7..83a256f568 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -243,7 +243,7 @@ const Graphics::PixelFormat BGRList[] = { }; // TODO: prioritize matching alpha masks -Common::List OSystem_SDL::getSupportedFormats() { +Common::List OSystem_SDL::getSupportedFormats() const { static Common::List list; static bool inited = false; diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 341a59c8cf..480e0af41b 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -98,7 +98,7 @@ public: virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; } // Highest supported - virtual Common::List getSupportedFormats(); + virtual Common::List getSupportedFormats() const; #endif // Set the size and format of the video bitmap. diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h index d277aa38b1..8180d5727f 100644 --- a/backends/platform/wii/osystem.h +++ b/backends/platform/wii/osystem.h @@ -156,7 +156,7 @@ public: virtual bool setGraphicsMode(int mode); #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List getSupportedFormats(); + virtual Common::List getSupportedFormats() const; #endif virtual int getGraphicsMode() const; virtual void initSize(uint width, uint height, diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index 3d4e75883b..19190048a0 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -209,7 +209,7 @@ Graphics::PixelFormat OSystem_Wii::getScreenFormat() const { return _pfGame; } -Common::List OSystem_Wii::getSupportedFormats() { +Common::List OSystem_Wii::getSupportedFormats() const { Common::List res; res.push_back(_pfRGB565); res.push_back(Graphics::PixelFormat::createFormatCLUT8()); diff --git a/common/system.h b/common/system.h index 60cea49f87..a09912b3a7 100644 --- a/common/system.h +++ b/common/system.h @@ -383,7 +383,7 @@ public: * @note Backends supporting RGB color should accept game data in RGB color * order, even if hardware uses BGR or some other color order. */ - virtual Common::List getSupportedFormats() = 0; + virtual Common::List getSupportedFormats() const = 0; #else inline Graphics::PixelFormat getScreenFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); -- cgit v1.2.3 From db4533533a4e6676a834a5c036a088cdcb04de5f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 12:21:26 +0000 Subject: SCI: fix changes from r49806 svn-id: r49839 --- engines/sci/graphics/gui.cpp | 2 +- engines/sci/graphics/paint16.cpp | 6 +++--- engines/sci/graphics/paint16.h | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 677359c201..468fbed776 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -62,7 +62,7 @@ SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCa _compare = new GfxCompare(_s->_segMan, g_sci->getKernel(), _cache, _screen, _coordAdjuster); g_sci->_gfxCompare = _compare; _transitions = new GfxTransitions(this, _screen, _palette, g_sci->getResMan()->isVGA()); - _paint16 = new GfxPaint16(g_sci->getResMan(), _s->_segMan, g_sci->getKernel(), this, _cache, _ports, _coordAdjuster, _screen, _palette, _transitions); + _paint16 = new GfxPaint16(g_sci->getResMan(), _s->_segMan, g_sci->getKernel(), this, _cache, _ports, _coordAdjuster, _screen, _palette, _transitions, _audio); g_sci->_gfxPaint = _paint16; g_sci->_gfxPaint16 = _paint16; _animate = new GfxAnimate(_s, _cache, _ports, _paint16, _screen, _palette, _cursor, _transitions); diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index eb3fea969a..10eae3c618 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -48,8 +48,8 @@ namespace Sci { -GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions) - : _resMan(resMan), _segMan(segMan), _kernel(kernel), _gui(gui), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions) { +GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio) + : _resMan(resMan), _segMan(segMan), _kernel(kernel), _gui(gui), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions), _audio(audio) { } GfxPaint16::~GfxPaint16() { @@ -587,7 +587,7 @@ reg_t GfxPaint16::kernelPortraitLoad(Common::String resourceName) { } void GfxPaint16::kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { - Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), this, _screen, _palette, _audio, resourceName); + Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), _gui, _screen, _palette, _audio, resourceName); // TODO: cache portraits // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates // on kDrawCel, yeah this whole stuff makes sense) diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 7a1a3bd7eb..3b2ffd6fc2 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -45,7 +45,7 @@ class GfxView; */ class GfxPaint16 : public GfxPaint { public: - GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions); + GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio); ~GfxPaint16(); void init(GfxAnimate *animate, GfxText16 *text16); @@ -99,6 +99,7 @@ private: ResourceManager *_resMan; SegManager *_segMan; Kernel *_kernel; + AudioPlayer *_audio; SciGui *_gui; GfxAnimate *_animate; GfxCache *_cache; -- cgit v1.2.3 From 68eeef8f1aa560954297291887f26bad6591aa15 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:21:29 +0000 Subject: SCI: Add ResourceManager::getVolVersion() svn-id: r49840 --- engines/sci/resource.cpp | 2 +- engines/sci/resource.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index fb601c7f82..80b3108988 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1525,7 +1525,7 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file, ResourceType type; ResourceManager *resMan = g_sci->getResMan(); - switch (resMan->_volVersion) { + switch (resMan->getVolVersion()) { case kResVersionSci0Sci1Early: case kResVersionSci1Middle: w = file->readUint16LE(); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 4b391cf6cd..d2dff8f58d 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -228,7 +228,6 @@ enum ResVersion { class ResourceManager { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. - friend class Resource; // For _volVersion friend class ResourceSource; friend class DirectoryResourceSource; friend class PatchResourceSource; @@ -301,6 +300,7 @@ public: ViewType getViewType() const { return _viewType; } const char *getMapVersionDesc() const { return versionDescription(_mapVersion); } const char *getVolVersionDesc() const { return versionDescription(_volVersion); } + ResVersion getVolVersion() const { return _volVersion; } /** * Adds the appropriate GM patch from the Sierra MIDI utility as 4.pat, without -- cgit v1.2.3 From 2b24a1a2adcd112a6f3d878c9172ec570a6077d9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:31:16 +0000 Subject: SCI: OOpify class ResourceId svn-id: r49841 --- engines/sci/console.cpp | 32 ++++++++++---------- engines/sci/engine/kscripts.cpp | 4 +-- engines/sci/resource.cpp | 22 +++++++------- engines/sci/resource.h | 67 +++++++++++++++++++++++------------------ engines/sci/resource_audio.cpp | 4 +-- 5 files changed, 69 insertions(+), 60 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 1c6f4461a8..4c8d588fa0 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -824,7 +824,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { } Common::List *resources = _engine->getResMan()->listResources(kResourceTypeScript); - sort(resources->begin(), resources->end(), ResourceIdLess()); + Common::sort(resources->begin(), resources->end()); Common::List::iterator itr = resources->begin(); DebugPrintf("%d SCI1.1-SCI2.1 scripts found, performing sanity checks...\n", resources->size()); @@ -833,15 +833,15 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { while (itr != resources->end()) { script = _engine->getResMan()->findResource(*itr, false); if (!script) - DebugPrintf("Error: script %d couldn't be loaded\n", itr->number); + DebugPrintf("Error: script %d couldn't be loaded\n", itr->getNumber()); - heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->number), false); + heap = _engine->getResMan()->findResource(ResourceId(kResourceTypeHeap, itr->getNumber()), false); if (!heap) - DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->number); + DebugPrintf("Error: script %d doesn't have a corresponding heap\n", itr->getNumber()); if (script && heap && (script->size + heap->size > 65535)) DebugPrintf("Error: script and heap %d together are larger than 64KB (%d bytes)\n", - itr->number, script->size + heap->size); + itr->getNumber(), script->size + heap->size); ++itr; } @@ -864,7 +864,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { parser->setMidiDriver(player); Common::List *resources = _engine->getResMan()->listResources(kResourceTypeSound); - sort(resources->begin(), resources->end(), ResourceIdLess()); + Common::sort(resources->begin(), resources->end()); Common::List::iterator itr = resources->begin(); int instruments[128]; bool instrumentsSongs[128][1000]; @@ -885,12 +885,12 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { SoundResource *sound; while (itr != resources->end()) { - if (songNumber >= 0 && itr->number != songNumber) { + if (songNumber >= 0 && itr->getNumber() != songNumber) { ++itr; continue; } - sound = new SoundResource(itr->number, _engine->getResMan(), doSoundVersion); + sound = new SoundResource(itr->getNumber(), _engine->getResMan(), doSoundVersion); int channelFilterMask = sound->getChannelFilterMask(player->getPlayId(), player->hasRhythmChannel()); SoundResource::Track *track = sound->getTrackByType(player->getPlayId()); if (track->digitalChannelNr != -1) { @@ -907,7 +907,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { bool endOfTrack = false; bool firstOneShown = false; - DebugPrintf("Song %d: ", itr->number); + DebugPrintf("Song %d: ", itr->getNumber()); do { while (*channelData == 0xF8) @@ -937,7 +937,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf(" %d", instrument); instruments[instrument]++; - instrumentsSongs[instrument][itr->number] = true; + instrumentsSongs[instrument][itr->getNumber()] = true; } break; case 0xD: @@ -1035,19 +1035,19 @@ bool Console::cmdList(int argc, const char **argv) { } Common::List *resources = _engine->getResMan()->listResources(res, number); - sort(resources->begin(), resources->end(), ResourceIdLess()); + Common::sort(resources->begin(), resources->end()); Common::List::iterator itr = resources->begin(); int cnt = 0; while (itr != resources->end()) { if (number == -1) { - DebugPrintf("%8i", itr->number); + DebugPrintf("%8i", itr->getNumber()); if (++cnt % 10 == 0) DebugPrintf("\n"); - } - else if (number == (int)itr->number) { - DebugPrintf("(%3i, %3i, %3i, %3i) ", (itr->tuple >> 24) & 0xff, (itr->tuple >> 16) & 0xff, - (itr->tuple >> 8) & 0xff, itr->tuple & 0xff); + } else if (number == (int)itr->getNumber()) { + const uint32 tuple = itr->getTuple(); + DebugPrintf("(%3i, %3i, %3i, %3i) ", (tuple >> 24) & 0xff, (tuple >> 16) & 0xff, + (tuple >> 8) & 0xff, tuple & 0xff); if (++cnt % 4 == 0) DebugPrintf("\n"); } diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index c6d73556ba..a8cf92b2a6 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -61,8 +61,8 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { if (which) g_sci->getResMan()->unlockResource(which); else { - if (id.type == kResourceTypeInvalid) - warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.number, type); + if (id.getType() == kResourceTypeInvalid) + warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type); else warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); } diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 80b3108988..00da600b26 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -157,7 +157,7 @@ void Resource::unalloc() { } void Resource::writeToStream(Common::WriteStream *stream) const { - stream->writeByte(_id.type | 0x80); // 0x80 is required by old sierra sci, otherwise it wont accept the patch file + stream->writeByte(getType() | 0x80); // 0x80 is required by old sierra sci, otherwise it wont accept the patch file stream->writeByte(_headerSize); if (_headerSize > 0) stream->write(_header, _headerSize); @@ -334,10 +334,10 @@ void PatchResourceSource::loadResource(Resource *res) { } void MacResourceForkResourceSource::loadResource(Resource *res) { - Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); + Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->_id.getNumber()); if (!stream) - error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); + error("Could not get Mac resource fork resource: %d %d", res->getType(), res->_id.getNumber()); int error = res->decompress(stream); if (error) { @@ -387,7 +387,7 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { mappingTable++; compressedOffset = *mappingTable; // Go to next compressed offset and use that to calculate size of compressed sample - switch (res->_id.type) { + switch (res->getType()) { case kResourceTypeSync: case kResourceTypeSync36: // we should already have a (valid) size @@ -405,7 +405,7 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { error("could not translate offset to compressed offset in audio volume"); fileStream->seek(compressedOffset, SEEK_SET); - switch (res->_id.type) { + switch (res->getType()) { case kResourceTypeAudio: case kResourceTypeAudio36: // Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1 @@ -604,9 +604,9 @@ int ResourceManager::addInternalSources() { Common::List::iterator itr = resources->begin(); while (itr != resources->end()) { - ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->number)); + ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->getNumber())); - if ((itr->number == 65535) && Common::File::exists("RESOURCE.SFX")) + if ((itr->getNumber() == 65535) && Common::File::exists("RESOURCE.SFX")) addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src, 0)); else if (Common::File::exists("RESOURCE.AUD")) addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src, 0)); @@ -799,7 +799,7 @@ Common::List *ResourceManager::listResources(ResourceType type, int ResourceMap::iterator itr = _resMap.begin(); while (itr != _resMap.end()) { - if ((itr->_value->_id.type == type) && ((mapNumber == -1) || (itr->_value->_id.number == mapNumber))) + if ((itr->_value->getType() == type) && ((mapNumber == -1) || (itr->_value->_id.getNumber() == mapNumber))) resources->push_back(itr->_value->_id); ++itr; } @@ -1220,7 +1220,7 @@ void ResourceManager::readResourcePatchesBase36() { } psrcPatch = new PatchResourceSource(name); - processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); + processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.getTuple()); } } } @@ -1552,8 +1552,8 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file, case kResVersionSci11Mac: // Doesn't store this data in the resource. Fortunately, // we already have this data. - type = _id.type; - number = _id.number; + type = getType(); + number = _id.getNumber(); szPacked = file->size(); szUnpacked = file->size(); wCompression = 0; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index d2dff8f58d..e030db4bc4 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -114,57 +114,64 @@ class ResourceManager; class ResourceSource; class ResourceId { -public: - ResourceType type; - uint16 number; - uint32 tuple; // Only used for audio36 and sync36 + static inline ResourceType fixupType(ResourceType type) { + if (type < kResourceTypeMacPict || type > kResourceTypeInvalid) + return kResourceTypeInvalid; + return type; + } - ResourceId() : type(kResourceTypeInvalid), number(0), tuple(0) { } + ResourceType _type; + uint16 _number; + uint32 _tuple; // Only used for audio36 and sync36 + +public: + ResourceId() : _type(kResourceTypeInvalid), _number(0), _tuple(0) { } ResourceId(ResourceType type_, uint16 number_, uint32 tuple_ = 0) - : type(type_), number(number_), tuple(tuple_) { - if (type < kResourceTypeMacPict || type > kResourceTypeInvalid) - type = kResourceTypeInvalid; + : _type(fixupType(type_)), _number(number_), _tuple(tuple_) { } ResourceId(ResourceType type_, uint16 number_, byte noun, byte verb, byte cond, byte seq) - : type(type_), number(number_) { - tuple = (noun << 24) | (verb << 16) | (cond << 8) | seq; - - if ((type < kResourceTypeView) || (type > kResourceTypeInvalid)) - type = kResourceTypeInvalid; + : _type(fixupType(type_)), _number(number_) { + _tuple = (noun << 24) | (verb << 16) | (cond << 8) | seq; } - Common::String toString() { + Common::String toString() const { char buf[32]; - snprintf(buf, 32, "%s.%i", getResourceTypeName(type), number); + snprintf(buf, 32, "%s.%i", getResourceTypeName(_type), _number); Common::String retStr = buf; - if (tuple != 0) { - snprintf(buf, 32, "(%i, %i, %i, %i)", tuple >> 24, (tuple >> 16) & 0xff, (tuple >> 8) & 0xff, tuple & 0xff); + if (_tuple != 0) { + snprintf(buf, 32, "(%i, %i, %i, %i)", _tuple >> 24, (_tuple >> 16) & 0xff, (_tuple >> 8) & 0xff, _tuple & 0xff); retStr += buf; } return retStr; } -}; -struct ResourceIdHash : public Common::UnaryFunction { - uint operator()(ResourceId val) const { return ((uint)((val.type << 16) | val.number)) ^ val.tuple; } -}; + inline ResourceType getType() const { return _type; } + inline uint16 getNumber() const { return _number; } + inline uint32 getTuple() const { return _tuple; } -struct ResourceIdEqualTo : public Common::BinaryFunction { - bool operator()(const ResourceId &x, const ResourceId &y) const { return (x.type == y.type) && (x.number == y.number) && (x.tuple == y.tuple); } -}; + inline uint hash() const { + return ((uint)((_type << 16) | _number)) ^ _tuple; + } + + bool operator==(const ResourceId &other) const { + return (_type == other._type) && (_number == other._number) && (_tuple == other._tuple); + } -struct ResourceIdLess : public Common::BinaryFunction { - bool operator()(const ResourceId &x, const ResourceId &y) const { - return (x.type < y.type) || ((x.type == y.type) && (x.number < y.number)) - || ((x.type == y.type) && (x.number == y.number) && (x.tuple < y.tuple)); + bool operator<(const ResourceId &other) const { + return (_type < other._type) || ((_type == other._type) && (_number < other._number)) + || ((_type == other._type) && (_number == other._number) && (_tuple < other._tuple)); } }; +struct ResourceIdHash : public Common::UnaryFunction { + uint operator()(ResourceId val) const { return val.hash(); } +}; + /** Class for storing resources in memory */ class Resource { friend class ResourceManager; @@ -191,6 +198,8 @@ public: byte *_header; uint32 _headerSize; + inline ResourceType getType() const { return _id.getType(); } + /** * Write the resource to the specified stream. * This method is used only by the "dump" debugger command. @@ -213,7 +222,7 @@ protected: int readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); }; -typedef Common::HashMap ResourceMap; +typedef Common::HashMap ResourceMap; enum ResVersion { kResVersionUnknown, diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 9cd3f32561..7a0d9bac6e 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -100,8 +100,8 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { file->seek(-4, SEEK_CUR); ResourceType type = (ResourceType)(file->readByte() & 0x7f); - if (((_id.type == kResourceTypeAudio || _id.type == kResourceTypeAudio36) && (type != kResourceTypeAudio)) - || ((_id.type == kResourceTypeSync || _id.type == kResourceTypeSync36) && (type != kResourceTypeSync))) { + if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio)) + || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) { warning("Resource type mismatch loading %s", _id.toString().c_str()); unalloc(); return false; -- cgit v1.2.3 From 7a5ce0eddd01d29d14543679aef8892e08829a63 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:31:37 +0000 Subject: SCI: Make Resource::_id protected svn-id: r49842 --- engines/sci/resource.cpp | 8 +++----- engines/sci/resource.h | 16 ++++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 00da600b26..e23d8fd080 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -133,7 +133,7 @@ const char *getResourceTypeName(ResourceType restype) { } //-- Resource main functions -- -Resource::Resource() { +Resource::Resource(ResourceId id) : _id(id) { data = NULL; size = 0; _fileOffset = 0; @@ -1485,9 +1485,8 @@ void MacResourceForkResourceSource::scanSource() { void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size) { // Adding new resource only if it does not exist if (_resMap.contains(resId) == false) { - Resource *res = new Resource; + Resource *res = new Resource(resId); _resMap.setVal(resId, res); - res->_id = resId; res->_source = src; res->_fileOffset = offset; res->size = size; @@ -1501,11 +1500,10 @@ Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, if (_resMap.contains(resId)) { res = _resMap.getVal(resId); } else { - res = new Resource; + res = new Resource(resId); _resMap.setVal(resId, res); } - res->_id = resId; res->_status = kResStatusNoMalloc; res->_source = src; res->_headerSize = 0; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index e030db4bc4..43408b0ffe 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -184,20 +184,19 @@ class Resource { friend class AudioVolumeResourceSource; friend class MacResourceForkResourceSource; +// NOTE : Currently most member variables lack the underscore prefix and have +// public visibility to let the rest of the engine compile without changes. public: - Resource(); - ~Resource(); - void unalloc(); - -// NOTE : Currently all member data has the same name and public visibility -// to let the rest of the engine compile without changes -public: - ResourceId _id; byte *data; uint32 size; byte *_header; uint32 _headerSize; +public: + Resource(ResourceId id); + ~Resource(); + void unalloc(); + inline ResourceType getType() const { return _id.getType(); } /** @@ -208,6 +207,7 @@ public: uint32 getAudioCompressionType() const; protected: + ResourceId _id; // TODO: _id could almost be made const, only readResourceInfo() modifies it... int32 _fileOffset; /**< Offset in file */ ResourceStatus _status; uint16 _lockers; /**< Number of places where this resource was locked */ -- cgit v1.2.3 From 651e2760a3b2de0c542ccbbf1bf3caa319cc0349 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:33:20 +0000 Subject: Fix spelling, cleanup svn-id: r49843 --- backends/fs/amigaos4/amigaos4-fs.cpp | 2 +- backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp | 6 +++--- backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp | 2 +- backends/platform/PalmOS/Src/launcher/launch.cpp | 2 +- backends/platform/ds/arm9/source/fat/io_nmmc.c | 10 +++++----- common/config-file.cpp | 2 +- common/error.h | 2 +- common/savefile.h | 4 ++-- common/stream.cpp | 2 +- common/system.h | 2 +- engines/agi/keyboard.cpp | 2 +- engines/agos/icons.cpp | 2 +- engines/agos/vga_s2.cpp | 2 +- engines/saga/saga.cpp | 2 +- engines/sci/engine/kevent.cpp | 4 ++-- engines/sci/engine/seg_manager.h | 2 +- engines/sci/resource.cpp | 6 +++--- engines/sci/sci.h | 2 +- engines/scumm/verbs.h | 2 +- graphics/scaler.h | 2 +- graphics/video/codecs/qdm2.h | 2 +- gui/GuiManager.h | 2 +- gui/dialog.cpp | 2 +- sound/decoders/adpcm.h | 2 +- sound/decoders/flac.cpp | 6 +++--- sound/decoders/flac.h | 4 ++-- sound/decoders/mp3.h | 4 ++-- sound/decoders/vag.h | 2 +- sound/decoders/voc.h | 2 +- sound/decoders/vorbis.h | 4 ++-- sound/decoders/wave.h | 4 ++-- sound/mods/protracker.h | 2 +- 32 files changed, 48 insertions(+), 48 deletions(-) diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index fe6164cb0c..8a57a3cf1c 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -368,7 +368,7 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b } if (ERROR_NO_MORE_ENTRIES != IDOS->IoErr() ) { - debug(6, "An error occured during ExamineDir"); + debug(6, "An error occurred during ExamineDir"); ret = false; } else { ret = true; diff --git a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp b/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp index b4c1e222d0..9566a25311 100644 --- a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp +++ b/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp @@ -107,7 +107,7 @@ static void SkinsFormExit(Boolean bSave) { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (bSave && selected == -1) { // may never occured... + if (bSave && selected == -1) { // may never occurred... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } @@ -164,7 +164,7 @@ static void SkinsFormBeam() { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (selected == -1) { // may never occured... + if (selected == -1) { // may never occurred... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } @@ -187,7 +187,7 @@ static void SkinsFormDelete() { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (selected == -1) { // may never occured... + if (selected == -1) { // may never occurred... FrmCustomAlert(FrmInfoAlert, "You didn't select a skin.", 0, 0); return; } diff --git a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp b/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp index 58eaa5b5fc..48399efa95 100644 --- a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp +++ b/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp @@ -258,7 +258,7 @@ static void MusicFormInit(UInt16 index) { ogameInfoP = (GameInfoType *)MemHandleLock(recordH); if (!ogameInfoP) { - FrmCustomAlert(FrmErrorAlert, "An error occured.",0,0); + FrmCustomAlert(FrmErrorAlert, "An error occurred.",0,0); return; } diff --git a/backends/platform/PalmOS/Src/launcher/launch.cpp b/backends/platform/PalmOS/Src/launcher/launch.cpp index cb2d52b20e..d83a34e94c 100644 --- a/backends/platform/PalmOS/Src/launcher/launch.cpp +++ b/backends/platform/PalmOS/Src/launcher/launch.cpp @@ -468,7 +468,7 @@ Boolean StartScummVM(Int16 engine) { return false; } - // reset mode if screen rotation occured (DIA only) + // reset mode if screen rotation occurred (DIA only) if (!direct && OPTIONS_TST(kOptCollapsible)) { UInt8 mode = PalmScreenSize(0,0, &(gVars->screenFullWidth), &(gVars->screenFullHeight)); OPTIONS_RST(kOptModeLandscape); diff --git a/backends/platform/ds/arm9/source/fat/io_nmmc.c b/backends/platform/ds/arm9/source/fat/io_nmmc.c index 261096a27b..6c996f5de1 100644 --- a/backends/platform/ds/arm9/source/fat/io_nmmc.c +++ b/backends/platform/ds/arm9/source/fat/io_nmmc.c @@ -170,7 +170,7 @@ bool NMMC_IsInserted(void) { Neo_EnableMMC( true ); // Open SPI port to MMC card Neo_SendMMCCommand(MMC_SEND_CSD, 0); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -227,14 +227,14 @@ bool NMMC_StartUp(void) { // Set block length Neo_SendMMCCommand(MMC_SET_BLOCKLEN, BYTE_PER_READ ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } // Check if we can use a higher SPI frequency Neo_SendMMCCommand(MMC_SEND_CSD, 0); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -268,7 +268,7 @@ bool NMMC_WriteSectors (u32 sector, u8 numSecs, void* buffer) Neo_EnableMMC( true ); // Open SPI port to MMC card Neo_SendMMCCommand( 25, sector ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -318,7 +318,7 @@ bool NMMC_ReadSectors (u32 sector, u8 numSecs, void* buffer) while (totalSecs--) { Neo_SendMMCCommand(MMC_READ_BLOCK, sector ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } diff --git a/common/config-file.cpp b/common/config-file.cpp index cc55ebd6c7..d001a66c9e 100644 --- a/common/config-file.cpp +++ b/common/config-file.cpp @@ -125,7 +125,7 @@ bool ConfigFile::loadFromStream(SeekableReadStream &stream) { if (*p == '\0') error("ConfigFile::loadFromStream: missing ] in line %d", lineno); else if (*p != ']') - error("ConfigFile::loadFromStream: Invalid character '%c' occured in section name in line %d", *p, lineno); + error("ConfigFile::loadFromStream: Invalid character '%c' occurred in section name in line %d", *p, lineno); // Previous section is finished now, store it. if (!section.name.empty()) diff --git a/common/error.h b/common/error.h index 7aff8d40b9..58343114a2 100644 --- a/common/error.h +++ b/common/error.h @@ -44,7 +44,7 @@ namespace Common { * kPathInvalid, kPathIsInvalid, kInvalidPathError */ enum Error { - kNoError = 0, ///< No error occured + kNoError = 0, ///< No error occurred kInvalidPathError, ///< Engine initialization: Invalid game path was passed kNoGameDataFoundError, ///< Engine initialization: No game data was found in the specified location kUnsupportedGameidError, ///< Engine initialization: Gameid not supported by this (Meta)Engine diff --git a/common/savefile.h b/common/savefile.h index 39be661b45..16b0fdbfbe 100644 --- a/common/savefile.h +++ b/common/savefile.h @@ -109,14 +109,14 @@ public: /** * Open the savefile with the specified name in the given directory for saving. * @param name the name of the savefile - * @return pointer to an OutSaveFile, or NULL if an error occured. + * @return pointer to an OutSaveFile, or NULL if an error occurred. */ virtual OutSaveFile *openForSaving(const String &name) = 0; /** * Open the file with the specified name in the given directory for loading. * @param name the name of the savefile - * @return pointer to an InSaveFile, or NULL if an error occured. + * @return pointer to an InSaveFile, or NULL if an error occurred. */ virtual InSaveFile *openForLoading(const String &name) = 0; diff --git a/common/stream.cpp b/common/stream.cpp index 204efd79b9..84b712a562 100644 --- a/common/stream.cpp +++ b/common/stream.cpp @@ -152,7 +152,7 @@ char *SeekableReadStream::readLine(char *buf, size_t bufSize) { len++; } - // We always terminate the buffer if no error occured + // We always terminate the buffer if no error occurred *p = 0; return buf; } diff --git a/common/system.h b/common/system.h index a09912b3a7..0ff841e441 100644 --- a/common/system.h +++ b/common/system.h @@ -879,7 +879,7 @@ public: /** * Create a new mutex. - * @return the newly created mutex, or 0 if an error occured. + * @return the newly created mutex, or 0 if an error occurred. */ virtual MutexRef createMutex() = 0; diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp index f99d5728be..62bcd5d8d8 100644 --- a/engines/agi/keyboard.cpp +++ b/engines/agi/keyboard.cpp @@ -121,7 +121,7 @@ int AgiEngine::handleController(int key) { if (_game.controllers[i].keycode == key) { debugC(3, kDebugLevelInput, "event %d: key press", _game.controllers[i].controller); _game.controllerOccured[_game.controllers[i].controller] = true; - report("event AC:%i occured\n", _game.controllers[i].controller); + report("event AC:%i occurred\n", _game.controllers[i].controller); return true; } } diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp index fdc5d1707e..08a3d4e2f0 100644 --- a/engines/agos/icons.cpp +++ b/engines/agos/icons.cpp @@ -448,7 +448,7 @@ void AGOSEngine_Feeble::drawIconArray(uint num, Item *itemRef, int line, int cla setupIconHitArea(window, k++, xp, yp, itemRef); } else { /* - * Just remember the overflow has occured + * Just remember the overflow has occurred */ window->iconPtr->iconArray[icount].item = NULL; /* END MARKINGS */ _iOverflow = 1; diff --git a/engines/agos/vga_s2.cpp b/engines/agos/vga_s2.cpp index 4eb739e974..db3a7c18f3 100644 --- a/engines/agos/vga_s2.cpp +++ b/engines/agos/vga_s2.cpp @@ -138,7 +138,7 @@ void AGOSEngine::vc69_playSeq() { // This is a "play track". The original // design stored the track to play if one was // already in progress, so that the next time a - // "fill MIDI stream" event occured, the MIDI + // "fill MIDI stream" event occurred, the MIDI // player would find the change and switch // tracks. We use a different architecture that // allows for an immediate response here, but diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp index 446ab86228..d1ab3bc9d7 100644 --- a/engines/saga/saga.cpp +++ b/engines/saga/saga.cpp @@ -419,7 +419,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin offset = scriptS.readUint16(); // In some rooms in IHNM, string offsets can be greater than the maximum value than a 16-bit integer can hold // We detect this by checking the previous offset, and if it was bigger than the current one, an overflow - // occured (since the string offsets are sequential), so we're adding the missing part of the number + // occurred (since the string offsets are sequential), so we're adding the missing part of the number // Fixes bug #1895205 - "IHNM: end game text/caption error" if (prevOffset > offset) offset += 65536; diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index d6cb4ebd8e..da014cd917 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -129,9 +129,9 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { if ((s->r_acc.offset) && (g_debugState.stopOnEvent)) { g_debugState.stopOnEvent = false; - // A SCI event occured, and we have been asked to stop, so open the debug console + // A SCI event occurred, and we have been asked to stop, so open the debug console Console *con = g_sci->getSciDebugger(); - con->DebugPrintf("SCI event occured: "); + con->DebugPrintf("SCI event occurred: "); switch (curEvent.type) { case SCI_EVENT_QUIT: con->DebugPrintf("quit event\n"); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index ec89e42f9c..990836992c 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -407,7 +407,7 @@ public: * Determines the name of an object * @param[in] pos Location (segment, offset) of the object * @return A name for that object, or a string describing an error - * that occured while looking it up. The string is stored + * that occurred while looking it up. The string is stored * in a static buffer and need not be freed (neither may * it be modified). */ diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index e23d8fd080..cf253619e6 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -341,7 +341,7 @@ void MacResourceForkResourceSource::loadResource(Resource *res) { int error = res->decompress(stream); if (error) { - warning("Error %d occured while reading %s from Mac resource file: %s", + warning("Error %d occurred while reading %s from Mac resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); res->unalloc(); } @@ -442,7 +442,7 @@ void ResourceSource::loadResource(Resource *res) { delete fileStream; if (error) { - warning("Error %d occured while reading %s from resource file: %s", + warning("Error %d occurred while reading %s from resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); res->unalloc(); } @@ -817,7 +817,7 @@ Resource *ResourceManager::findResource(ResourceId id, bool lock) { loadResource(retval); else if (retval->_status == kResStatusEnqueued) removeFromLRU(retval); - // Unless an error occured, the resource is now either + // Unless an error occurred, the resource is now either // locked or allocated, but never queued or freed. freeOldResources(); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index eb2b82fdce..c2f3f17732 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -222,7 +222,7 @@ private: * This function must be run before script_run() is executed. Graphics data * is initialized iff s->gfx_state != NULL. * @param[in] s The state to operate on - * @return true on success, false if an error occured. + * @return true on success, false if an error occurred. */ bool initGame(); diff --git a/engines/scumm/verbs.h b/engines/scumm/verbs.h index 96a49a7ced..83e924edac 100644 --- a/engines/scumm/verbs.h +++ b/engines/scumm/verbs.h @@ -31,7 +31,7 @@ namespace Scumm { /** - * The area in which some click (or key press) occured and which is passed + * The area in which some click (or key press) occurred and which is passed * to the input script. */ enum ClickArea { diff --git a/graphics/scaler.h b/graphics/scaler.h index 22bda5273a..577a91ccc1 100644 --- a/graphics/scaler.h +++ b/graphics/scaler.h @@ -77,7 +77,7 @@ enum { * Creates a thumbnail from the current screen (without overlay). * * @param surf a surface (will always have 16 bpp after this for now) - * @return false if a error occured + * @return false if a error occurred */ extern bool createThumbnailFromScreen(Graphics::Surface *surf); diff --git a/graphics/video/codecs/qdm2.h b/graphics/video/codecs/qdm2.h index c9a01a70ee..9eb566d04d 100644 --- a/graphics/video/codecs/qdm2.h +++ b/graphics/video/codecs/qdm2.h @@ -44,7 +44,7 @@ namespace Graphics { * * @param stream the SeekableReadStream from which to read the FLAC data * @param extraData the QuickTime extra data stream - * @return a new AudioStream, or NULL, if an error occured + * @return a new AudioStream, or NULL, if an error occurred */ Audio::AudioStream *makeQDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadStream *extraData); diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 2591838416..2a187a92f9 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -122,7 +122,7 @@ protected: // position and time of last mouse click (used to detect double clicks) struct { - int16 x, y; // Position of mouse when the click occured + int16 x, y; // Position of mouse when the click occurred uint32 time; // Time int count; // How often was it already pressed? } _lastClick; diff --git a/gui/dialog.cpp b/gui/dialog.cpp index 5e3a9a1927..e20b181c83 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -171,7 +171,7 @@ void Dialog::handleMouseDown(int x, int y, int button, int clickCount) { if (w && !(w->getFlags() & WIDGET_IGNORE_DRAG)) _dragWidget = w; - // If the click occured inside a widget which is not the currently + // If the click occurred inside a widget which is not the currently // focused one, change the focus to that widget. if (w && w != _focusedWidget && w->wantsFocus()) { setFocusWidget(w); diff --git a/sound/decoders/adpcm.h b/sound/decoders/adpcm.h index 7452478f35..04dbb1a521 100644 --- a/sound/decoders/adpcm.h +++ b/sound/decoders/adpcm.h @@ -71,7 +71,7 @@ enum typesADPCM { * @param rate the sampling rate * @param channels the number of channels * @param blockAlign block alignment ??? - * @return a new RewindableAudioStream, or NULL, if an error occured + * @return a new RewindableAudioStream, or NULL, if an error occurred */ RewindableAudioStream *makeADPCMStream( Common::SeekableReadStream *stream, diff --git a/sound/decoders/flac.cpp b/sound/decoders/flac.cpp index 91c48199e3..e588aa872f 100644 --- a/sound/decoders/flac.cpp +++ b/sound/decoders/flac.cpp @@ -230,7 +230,7 @@ FLACStream::FLACStream(Common::SeekableReadStream *inStream, bool dispose) if (processUntilEndOfMetadata() && _streaminfo.channels > 0) { _lastSample = _streaminfo.total_samples + 1; _length = Timestamp(0, _lastSample - 1, getRate()); - return; // no error occured + return; // no error occurred } } @@ -355,7 +355,7 @@ int FLACStream::readBuffer(int16 *buffer, const int numSamples) { break; default: decoderOk = false; - warning("FLACStream: An error occured while decoding. DecoderState is: %s", + warning("FLACStream: An error occurred while decoding. DecoderState is: %s", FLAC__StreamDecoderStateString[getStreamDecoderState()]); } @@ -668,7 +668,7 @@ inline void FLACStream::callbackMetadata(const ::FLAC__StreamMetadata *metadata) } inline void FLACStream::callbackError(::FLAC__StreamDecoderErrorStatus status) { // some of these are non-critical-Errors - debug(1, "FLACStream: An error occured while decoding. DecoderState is: %s", + debug(1, "FLACStream: An error occurred while decoding. DecoderState is: %s", FLAC__StreamDecoderErrorStatusString[status]); } diff --git a/sound/decoders/flac.h b/sound/decoders/flac.h index 982450c045..3c00ec3d5d 100644 --- a/sound/decoders/flac.h +++ b/sound/decoders/flac.h @@ -41,8 +41,8 @@ #ifndef SOUND_FLAC_H #define SOUND_FLAC_H -#include "common/types.h" #include "common/scummsys.h" +#include "common/types.h" #ifdef USE_FLAC @@ -61,7 +61,7 @@ class SeekableAudioStream; * * @param stream the SeekableReadStream from which to read the FLAC data * @param disposeAfterUse whether to delete the stream after use - * @return a new SeekableAudioStream, or NULL, if an error occured + * @return a new SeekableAudioStream, or NULL, if an error occurred */ SeekableAudioStream *makeFLACStream( Common::SeekableReadStream *stream, diff --git a/sound/decoders/mp3.h b/sound/decoders/mp3.h index 3175df5e92..ed54c8b013 100644 --- a/sound/decoders/mp3.h +++ b/sound/decoders/mp3.h @@ -41,8 +41,8 @@ #ifndef SOUND_MP3_H #define SOUND_MP3_H -#include "common/types.h" #include "common/scummsys.h" +#include "common/types.h" #ifdef USE_MAD @@ -61,7 +61,7 @@ class SeekableAudioStream; * * @param stream the SeekableReadStream from which to read the MP3 data * @param disposeAfterUse whether to delete the stream after use - * @return a new SeekableAudioStream, or NULL, if an error occured + * @return a new SeekableAudioStream, or NULL, if an error occurred */ SeekableAudioStream *makeMP3Stream( Common::SeekableReadStream *stream, diff --git a/sound/decoders/vag.h b/sound/decoders/vag.h index 7e0ed255be..cdf91a8ea1 100644 --- a/sound/decoders/vag.h +++ b/sound/decoders/vag.h @@ -49,7 +49,7 @@ class RewindableAudioStream; * * @param stream the SeekableReadStream from which to read the ADPCM data * @param rate the sampling rate - * @return a new RewindableAudioStream, or NULL, if an error occured + * @return a new RewindableAudioStream, or NULL, if an error occurred */ RewindableAudioStream *makeVagStream( Common::SeekableReadStream *stream, diff --git a/sound/decoders/voc.h b/sound/decoders/voc.h index 79956ee62a..82cc261f2c 100644 --- a/sound/decoders/voc.h +++ b/sound/decoders/voc.h @@ -38,8 +38,8 @@ #ifndef SOUND_VOC_H #define SOUND_VOC_H -#include "common/types.h" #include "common/scummsys.h" +#include "common/types.h" namespace Common { class ReadStream; } namespace Common { class SeekableReadStream; } diff --git a/sound/decoders/vorbis.h b/sound/decoders/vorbis.h index dd0a89bfdd..0a0cf43bc9 100644 --- a/sound/decoders/vorbis.h +++ b/sound/decoders/vorbis.h @@ -41,8 +41,8 @@ #ifndef SOUND_VORBIS_H #define SOUND_VORBIS_H -#include "common/types.h" #include "common/scummsys.h" +#include "common/types.h" #ifdef USE_VORBIS @@ -61,7 +61,7 @@ class SeekableAudioStream; * * @param stream the SeekableReadStream from which to read the Ogg Vorbis data * @param disposeAfterUse whether to delete the stream after use - * @return a new SeekableAudioStream, or NULL, if an error occured + * @return a new SeekableAudioStream, or NULL, if an error occurred */ SeekableAudioStream *makeVorbisStream( Common::SeekableReadStream *stream, diff --git a/sound/decoders/wave.h b/sound/decoders/wave.h index f0e3bb249b..edd37e7ac9 100644 --- a/sound/decoders/wave.h +++ b/sound/decoders/wave.h @@ -38,8 +38,8 @@ #ifndef SOUND_WAVE_H #define SOUND_WAVE_H -#include "common/types.h" #include "common/scummsys.h" +#include "common/types.h" namespace Common { class SeekableReadStream; } @@ -71,7 +71,7 @@ extern bool loadWAVFromStream( * * @param stream the SeekableReadStream from which to read the WAVE data * @param disposeAfterUse whether to delete the stream after use - * @return a new RewindableAudioStream, or NULL, if an error occured + * @return a new RewindableAudioStream, or NULL, if an error occurred */ RewindableAudioStream *makeWAVStream( Common::SeekableReadStream *stream, diff --git a/sound/mods/protracker.h b/sound/mods/protracker.h index dfcb0e6c51..af722637c7 100644 --- a/sound/mods/protracker.h +++ b/sound/mods/protracker.h @@ -48,7 +48,7 @@ class AudioStream; * @param stream the ReadStream from which to read the ProTracker data * @param rate TODO * @param stereo TODO - * @return a new AudioStream, or NULL, if an error occured + * @return a new AudioStream, or NULL, if an error occurred */ AudioStream *makeProtrackerStream(Common::SeekableReadStream *stream, int offs = 0, int rate = 44100, bool stereo = true); -- cgit v1.2.3 From d570e10b77887fa163f17de512b14fc824f45f33 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:33:54 +0000 Subject: Modify makeAIFFStream to match the other sound decoder factories svn-id: r49844 --- engines/sci/sound/audio.cpp | 11 ++++++----- engines/sword1/music.cpp | 2 +- sound/decoders/aiff.cpp | 11 ++++++++--- sound/decoders/aiff.h | 9 ++++++++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index b0b9a73e00..8dfbc18976 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -260,9 +260,11 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 // Compressed audio made by our tool byte *compressedData = (byte *)malloc(audioRes->size); assert(compressedData); - // We copy over the compressed data in our own buffer. If we don't do this resourcemanager may free the data - // later. All other compression-types already decompress completely into an additional buffer here. - // MP3/OGG/FLAC decompression works on-the-fly instead. + // We copy over the compressed data in our own buffer. We have to do + // this, because ResourceManager may free the original data late. + // All other compression types already decompress completely into an + // additional buffer here. MP3/OGG/FLAC decompression works on-the-fly + // instead. memcpy(compressedData, audioRes->data, audioRes->size); Common::MemoryReadStream *compressedStream = new Common::MemoryReadStream(compressedData, audioRes->size, DisposeAfterUse::YES); @@ -319,8 +321,7 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 *sampleLen = (waveFlags & Audio::FLAG_16BITS ? waveSize >> 1 : waveSize) * 60 / waveRate; waveStream->seek(0, SEEK_SET); - audioStream = Audio::makeAIFFStream(*waveStream); - delete waveStream; // makeAIFFStream doesn't handle this for us + audioStream = Audio::makeAIFFStream(waveStream, DisposeAfterUse::YES); } else if (audioRes->size > 14 && READ_BE_UINT16(audioRes->data) == 1 && READ_BE_UINT16(audioRes->data + 2) == 1 && READ_BE_UINT16(audioRes->data + 4) == 5 && READ_BE_UINT32(audioRes->data + 10) == 0x00018051) { // Mac snd detected diff --git a/engines/sword1/music.cpp b/engines/sword1/music.cpp index 91c943472c..23cc30e4b1 100644 --- a/engines/sword1/music.cpp +++ b/engines/sword1/music.cpp @@ -107,7 +107,7 @@ bool MusicHandle::play(const char *fileBase, bool loop) { if (!_audioSource) { sprintf(fileName, "%s.aif", fileBase); if (_file.open(fileName)) - _audioSource = Audio::makeLoopingAudioStream(Audio::makeAIFFStream(_file), loop ? 0 : 1); + _audioSource = Audio::makeLoopingAudioStream(Audio::makeAIFFStream(&_file, DisposeAfterUse::NO), loop ? 0 : 1); } if (!_audioSource) diff --git a/sound/decoders/aiff.cpp b/sound/decoders/aiff.cpp index 2f12669072..b76410f8d1 100644 --- a/sound/decoders/aiff.cpp +++ b/sound/decoders/aiff.cpp @@ -161,16 +161,21 @@ bool loadAIFFFromStream(Common::SeekableReadStream &stream, int &size, int &rate return true; } -SeekableAudioStream *makeAIFFStream(Common::SeekableReadStream &stream) { +SeekableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeAfterUse) { int size, rate; byte *data, flags; - if (!loadAIFFFromStream(stream, size, rate, flags)) + if (!loadAIFFFromStream(*stream, size, rate, flags)) { + if (disposeAfterUse == DisposeAfterUse::YES) + delete stream; return 0; + } data = (byte *)malloc(size); assert(data); - stream.read(data, size); + stream->read(data, size); + delete stream; // Since we allocated our own buffer for the data, we must specify DisposeAfterUse::YES. return makeRawStream(data, size, rate, flags); diff --git a/sound/decoders/aiff.h b/sound/decoders/aiff.h index e8a3b6f0b0..53f86c95fd 100644 --- a/sound/decoders/aiff.h +++ b/sound/decoders/aiff.h @@ -34,6 +34,7 @@ #define SOUND_AIFF_H #include "common/scummsys.h" +#include "common/types.h" namespace Common { class SeekableReadStream; } @@ -55,8 +56,14 @@ extern bool loadAIFFFromStream(Common::SeekableReadStream &stream, int &size, in * from that data. * * This function uses loadAIFFFromStream() internally. + * + * @param stream the SeekableReadStream from which to read the AIFF data + * @param disposeAfterUse whether to delete the stream after use + * @return a new SeekableAudioStream, or NULL, if an error occurred */ -SeekableAudioStream *makeAIFFStream(Common::SeekableReadStream &stream); +SeekableAudioStream *makeAIFFStream( + Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeAfterUse); } // End of namespace Audio -- cgit v1.2.3 From e62169c383c987949a5e7aad971691c030eb8a97 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:34:12 +0000 Subject: AGI: Specify bug reference for workaround svn-id: r49845 --- engines/agi/sprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index d3bd1a6212..25118b69a6 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -242,7 +242,7 @@ void SpritesMgr::objsRestoreArea(Sprite *s) { pos0 += _WIDTH; } - // WORKAROUND + // WORKAROUND (see ScummVM bug #1945716) // When set.view command is called, current code cannot detect this situation while updating // Thus we force removal of the old sprite if (s->v->viewReplaced) { -- cgit v1.2.3 From f93644325244cc111634e2e8e4f97adb5a3fbe15 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:34:33 +0000 Subject: SCI: Saner and simpler conversion from msecs to ticks svn-id: r49846 --- engines/sci/sound/audio.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 8dfbc18976..ac3ef54c9a 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -353,9 +353,7 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 } if (audioSeekStream) { - *sampleLen = (audioSeekStream->getLength().msecs() * 10000) / 166666; // we translate msecs to ticks - // Original code - //*sampleLen = (flags & Audio::FLAG_16BITS ? size >> 1 : size) * 60 / _audioRate; + *sampleLen = (audioSeekStream->getLength().msecs() * 60) / 1000; // we translate msecs to ticks audioStream = audioSeekStream; } // We have to make sure that we don't depend on resource manager pointers after this point, because the actual -- cgit v1.2.3 From 82b66ffdf8439eff0043256bff9daf4f0c3d84ed Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:34:55 +0000 Subject: Fix some warnings about 'format not a string literal'. svn-id: r49847 --- base/main.cpp | 6 +++--- gui/GuiManager.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index ad6118c905..0360c89502 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -103,11 +103,11 @@ static const EnginePlugin *detectPlugin() { // Query the plugins and find one that will handle the specified gameid printf(_t("User picked target '%s' (gameid '%s')...\n"), ConfMan.getActiveDomainName().c_str(), gameid.c_str()); - printf(_t(" Looking for a plugin supporting this gameid... ")); + printf("%s", _t(" Looking for a plugin supporting this gameid... ")); GameDescriptor game = EngineMan.findGame(gameid, &plugin); if (plugin == 0) { - printf(_t("failed\n")); + printf("%s", _t("failed\n")); warning(_t("%s is an invalid gameid. Use the --list-games option to list supported gameid"), gameid.c_str()); return 0; } else { @@ -416,7 +416,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { } else { // A dialog would be nicer, but we don't have any // screen to draw on yet. - warning(_("Could not find any engine capable of running the selected game")); + warning("%s", _("Could not find any engine capable of running the selected game")); GUI::displayErrorDialog(_("Could not find any engine capable of running the selected game")); } diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index 49c078a723..fbcacf2d16 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -73,7 +73,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), // Loading the theme failed, try to load the built-in theme if (!loadNewTheme("builtin", gfxMode)) { // Loading the built-in theme failed as well. Bail out - error(_t("Failed to load any GUI theme, aborting")); + error("%s", _t("Failed to load any GUI theme, aborting")); } } -- cgit v1.2.3 From e4153ffa381542ee14ad268475f679917d177254 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:35:17 +0000 Subject: SCI: Add Resource::getNumber method svn-id: r49848 --- engines/sci/resource.cpp | 8 ++++---- engines/sci/resource.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index cf253619e6..24e92060e2 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -334,10 +334,10 @@ void PatchResourceSource::loadResource(Resource *res) { } void MacResourceForkResourceSource::loadResource(Resource *res) { - Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->_id.getNumber()); + Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->getNumber()); if (!stream) - error("Could not get Mac resource fork resource: %d %d", res->getType(), res->_id.getNumber()); + error("Could not get Mac resource fork resource: %d %d", res->getType(), res->getNumber()); int error = res->decompress(stream); if (error) { @@ -799,7 +799,7 @@ Common::List *ResourceManager::listResources(ResourceType type, int ResourceMap::iterator itr = _resMap.begin(); while (itr != _resMap.end()) { - if ((itr->_value->getType() == type) && ((mapNumber == -1) || (itr->_value->_id.getNumber() == mapNumber))) + if ((itr->_value->getType() == type) && ((mapNumber == -1) || (itr->_value->getNumber() == mapNumber))) resources->push_back(itr->_value->_id); ++itr; } @@ -1551,7 +1551,7 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file, // Doesn't store this data in the resource. Fortunately, // we already have this data. type = getType(); - number = _id.getNumber(); + number = getNumber(); szPacked = file->size(); szUnpacked = file->size(); wCompression = 0; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 43408b0ffe..9d372eaf02 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -198,6 +198,7 @@ public: void unalloc(); inline ResourceType getType() const { return _id.getType(); } + inline uint16 getNumber() const { return _id.getNumber(); } /** * Write the resource to the specified stream. -- cgit v1.2.3 From f387025e9b6a38b9023ffb2a766c168120472202 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:35:39 +0000 Subject: SCI: Add FIXME regarding audio specific code in Resource(Source) svn-id: r49849 --- engines/sci/resource.h | 4 ++++ engines/sci/resource_intern.h | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 9d372eaf02..9cf7120ed7 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -205,6 +205,10 @@ public: * This method is used only by the "dump" debugger command. */ void writeToStream(Common::WriteStream *stream) const; + + // FIXME: This audio specific method is a hack. After all, why should a + // Resource have audio specific methods? But for now we keep this, as it + // eases transition. uint32 getAudioCompressionType() const; protected: diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 042c5428d8..8cb13bd311 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -85,8 +85,10 @@ public: */ virtual void loadResource(Resource *res); + // FIXME: This audio specific method is a hack. After all, why should a + // ResourceSource or a Resource (which uses this method) have audio + // specific methods? But for now we keep this, as it eases transition. virtual uint32 getAudioCompressionType() const { return 0; } - }; class DirectoryResourceSource : public ResourceSource { -- cgit v1.2.3 From 604f85588965498f7852b579e19a9f6e99d32590 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 12:36:04 +0000 Subject: SCUMM: Fix composeFileHashMap svn-id: r49850 --- engines/scumm/detection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index c164ac38fd..551e4c70a7 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -395,7 +395,7 @@ static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map d.md5Entry = 0; fileMD5Map[file->getName()] = d; } else { - if (!directoryGlobs) + if (!globs) continue; bool matched = false; @@ -411,7 +411,7 @@ static void composeFileHashMap(const Common::FSList &fslist, DescMap &fileMD5Map Common::FSList files; if (file->getChildren(files, Common::FSNode::kListAll)) { - composeFileHashMap(files, fileMD5Map, depth - 1, directoryGlobs); + composeFileHashMap(files, fileMD5Map, depth - 1, globs); } } } -- cgit v1.2.3 From 891b568fde51c7f1732c86fd34cc40efcd4314ce Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 13:01:07 +0000 Subject: SCI: move textSize and textFonts and textColors inside gfxText16 svn-id: r49851 --- engines/sci/engine/kgraphics.cpp | 14 ++++++----- engines/sci/graphics/gui.cpp | 18 +------------- engines/sci/graphics/gui.h | 4 --- engines/sci/graphics/gui32.cpp | 5 ---- engines/sci/graphics/text16.cpp | 53 +++++++++++++++++++++++----------------- engines/sci/graphics/text16.h | 6 +++-- engines/sci/sci.h | 2 ++ 7 files changed, 46 insertions(+), 56 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index cf6bd41fa9..3e74bb206a 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -48,6 +48,7 @@ #include "sci/graphics/paint16.h" #include "sci/graphics/ports.h" #include "sci/graphics/screen.h" +#include "sci/graphics/text16.h" #include "sci/graphics/view.h" namespace Sci { @@ -345,11 +346,12 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) { textWidth = dest[3].toUint16(); textHeight = dest[2].toUint16(); #ifdef ENABLE_SCI32 - if (g_sci->_gui32) - g_sci->_gui32->textSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight); - else + if (!g_sci->_gfxText16) { + // TODO: Implement this + textWidth = 0; textHeight = 0; + } else #endif - g_sci->_gui->textSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight); + g_sci->_gfxText16->kernelTextSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight); debugC(2, kDebugLevelStrings, "GetTextSize '%s' -> %dx%d", text.c_str(), textWidth, textHeight); dest[2] = make_reg(0, textHeight); @@ -1246,12 +1248,12 @@ reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { // New calls for SCI11. Using those is only needed when using text-codes so that one is able to change // font and/or color multiple times during kDisplay and kDrawControl reg_t kTextFonts(EngineState *s, int argc, reg_t *argv) { - g_sci->_gui->textFonts(argc, argv); + g_sci->_gfxText16->kernelTextFonts(argc, argv); return s->r_acc; } reg_t kTextColors(EngineState *s, int argc, reg_t *argv) { - g_sci->_gui->textColors(argc, argv); + g_sci->_gfxText16->kernelTextColors(argc, argv); return s->r_acc; } diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 468fbed776..847831c909 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -68,6 +68,7 @@ SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCa _animate = new GfxAnimate(_s, _cache, _ports, _paint16, _screen, _palette, _cursor, _transitions); g_sci->_gfxAnimate = _animate; _text16 = new GfxText16(g_sci->getResMan(), _cache, _ports, _paint16, _screen); + g_sci->_gfxText16 = _text16; _controls = new GfxControls(_s->_segMan, _ports, _paint16, _text16, _screen); g_sci->_gfxControls = _controls; _menu = new GfxMenu(g_sci->getEventManager(), _s->_segMan, this, _ports, _paint16, _text16, _screen, _cursor); @@ -94,21 +95,4 @@ void SciGui::wait(int16 ticks) { _s->wait(ticks); } -void SciGui::textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { - Common::Rect rect(0, 0, *textWidth, *textHeight); - _text16->Size(rect, text, font, maxWidth); - *textWidth = rect.width(); - *textHeight = rect.height(); -} - -// Used SCI1+ for text codes -void SciGui::textFonts(int argc, reg_t *argv) { - _text16->CodeSetFonts(argc, argv); -} - -// Used SCI1+ for text codes -void SciGui::textColors(int argc, reg_t *argv) { - _text16->CodeSetColors(argc, argv); -} - } // End of namespace Sci diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h index 73c37de099..edb93e10cb 100644 --- a/engines/sci/graphics/gui.h +++ b/engines/sci/graphics/gui.h @@ -53,10 +53,6 @@ public: virtual void wait(int16 ticks); - virtual void textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight); - virtual void textFonts(int argc, reg_t *argv); - virtual void textColors(int argc, reg_t *argv); - protected: GfxCursor *_cursor; EngineState *_s; diff --git a/engines/sci/graphics/gui32.cpp b/engines/sci/graphics/gui32.cpp index 10b2b1c4fd..fb2da08ae5 100644 --- a/engines/sci/graphics/gui32.cpp +++ b/engines/sci/graphics/gui32.cpp @@ -69,11 +69,6 @@ SciGui32::~SciGui32() { void SciGui32::init() { } -void SciGui32::textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { - *textWidth = 0; - *textHeight = 0; -} - void SciGui32::drawRobot(GuiResourceId robotId) { Robot *test = new Robot(g_sci->getResMan(), _screen, robotId); test->draw(); diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 952d13fbbd..c9a7f09973 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -73,28 +73,6 @@ void GfxText16::SetFont(GuiResourceId fontId) { _ports->_curPort->fontHeight = _font->getHeight(); } -void GfxText16::CodeSetFonts(int argc, reg_t *argv) { - int i; - - delete _codeFonts; - _codeFontsCount = argc; - _codeFonts = new GuiResourceId[argc]; - for (i = 0; i < argc; i++) { - _codeFonts[i] = (GuiResourceId)argv[i].toUint16(); - } -} - -void GfxText16::CodeSetColors(int argc, reg_t *argv) { - int i; - - delete _codeColors; - _codeColorsCount = argc; - _codeColors = new uint16[argc]; - for (i = 0; i < argc; i++) { - _codeColors[i] = argv[i].toUint16(); - } -} - void GfxText16::ClearChar(int16 chr) { if (_ports->_curPort->penMode != 1) return; @@ -488,4 +466,35 @@ bool GfxText16::SwitchToFont900OnSjis(const char *text) { return false; } +void GfxText16::kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { + Common::Rect rect(0, 0, *textWidth, *textHeight); + Size(rect, text, font, maxWidth); + *textWidth = rect.width(); + *textHeight = rect.height(); +} + +// Used SCI1+ for text codes +void GfxText16::kernelTextFonts(int argc, reg_t *argv) { + int i; + + delete _codeFonts; + _codeFontsCount = argc; + _codeFonts = new GuiResourceId[argc]; + for (i = 0; i < argc; i++) { + _codeFonts[i] = (GuiResourceId)argv[i].toUint16(); + } +} + +// Used SCI1+ for text codes +void GfxText16::kernelTextColors(int argc, reg_t *argv) { + int i; + + delete _codeColors; + _codeColorsCount = argc; + _codeColors = new uint16[argc]; + for (i = 0; i < argc; i++) { + _codeColors[i] = argv[i].toUint16(); + } +} + } // End of namespace Sci diff --git a/engines/sci/graphics/text16.h b/engines/sci/graphics/text16.h index 2885fc928b..71b602d116 100644 --- a/engines/sci/graphics/text16.h +++ b/engines/sci/graphics/text16.h @@ -48,8 +48,6 @@ public: GfxFont *GetFont(); void SetFont(GuiResourceId fontId); - void CodeSetFonts(int argc, reg_t *argv); - void CodeSetColors(int argc, reg_t *argv); int16 CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor); void ClearChar(int16 chr); @@ -67,6 +65,10 @@ public: GfxFont *_font; + void kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight); + void kernelTextFonts(int argc, reg_t *argv); + void kernelTextColors(int argc, reg_t *argv); + private: void init(); bool SwitchToFont900OnSjis(const char *text); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index c2f3f17732..7cfeec0e09 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -66,6 +66,7 @@ class GfxPaint16; class GfxPalette; class GfxPorts; class GfxScreen; +class GfxText16; class SciGui; class GfxMacIconBar; @@ -205,6 +206,7 @@ public: GfxPaint16 *_gfxPaint16; // Painting in 16-bit gfx GfxPorts *_gfxPorts; // Port managment for 16-bit gfx GfxScreen *_gfxScreen; + GfxText16 *_gfxText16; SciGui *_gui; /* Currently active Gui */ GfxMacIconBar *_gfxMacIconBar; // Mac Icon Bar manager -- cgit v1.2.3 From a21b9c7b96a29d3be9285b4217e91f835fed31ec Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 15 Jun 2010 13:10:00 +0000 Subject: PSP: fixed up PowerManager and removed dependency on SDL svn-id: r49852 --- backends/fs/psp/psp-stream.cpp | 14 +- backends/platform/psp/powerman.cpp | 352 +++++++++++++------------------------ backends/platform/psp/powerman.h | 75 ++++---- backends/platform/psp/thread.cpp | 56 +++++- backends/platform/psp/thread.h | 20 ++- 5 files changed, 232 insertions(+), 285 deletions(-) diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp index 83ff095aa8..67c73beeaa 100644 --- a/backends/fs/psp/psp-stream.cpp +++ b/backends/fs/psp/psp-stream.cpp @@ -81,10 +81,10 @@ PSPIoStream::PSPIoStream(const Common::String &path, bool writeMode) PSPIoStream::~PSPIoStream() { DEBUG_ENTER_FUNC(); - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); - PowerMan.unregisterSuspend(this); // Unregister with powermanager to be suspended + PowerMan.unregisterForSuspend(this); // Unregister with powermanager to be suspended // Must do this before fclose() or resume() will reopen. fclose((FILE *)_handle); // We don't need a critical section. Worst case, the handle gets closed on its own @@ -100,7 +100,7 @@ PSPIoStream::~PSPIoStream() { */ void *PSPIoStream::open() { DEBUG_ENTER_FUNC(); - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) { + if (PowerMan.beginCriticalSection()) { // No need to open. Just return the _handle resume() already opened. PSP_DEBUG_PRINT_FUNC("Suspended\n"); } @@ -118,7 +118,7 @@ void *PSPIoStream::open() { _cache = (char *)memalign(64, CACHE_SIZE); } - PowerMan.registerSuspend(this); // Register with the powermanager to be suspended + PowerMan.registerForSuspend(this); // Register with the powermanager to be suspended PowerMan.endCriticalSection(); @@ -233,7 +233,7 @@ uint32 PSPIoStream::read(void *ptr, uint32 len) { } } - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); @@ -309,7 +309,7 @@ inline bool PSPIoStream::isOffsetInCache(uint32 offset) { uint32 PSPIoStream::write(const void *ptr, uint32 len) { DEBUG_ENTER_FUNC(); // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x]\n", _path.c_str(), len); @@ -346,7 +346,7 @@ uint32 PSPIoStream::write(const void *ptr, uint32 len) { bool PSPIoStream::flush() { DEBUG_ENTER_FUNC(); // Enter critical section - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); int ret = fflush((FILE *)_handle); diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp index df8da12f6d..eaadad16c5 100644 --- a/backends/platform/psp/powerman.cpp +++ b/backends/platform/psp/powerman.cpp @@ -23,16 +23,16 @@ * */ -//#define __PSP_DEBUG_FUNCS__ /* can put this locally too */ -//#define __PSP_DEBUG_PRINT__ -#include "backends/platform/psp/trace.h" - #include #include #include "backends/platform/psp/powerman.h" #include "engine.h" +//#define __PSP_DEBUG_FUNCS__ /* can put this locally too */ +//#define __PSP_DEBUG_PRINT__ +#include "backends/platform/psp/trace.h" + DECLARE_SINGLETON(PowerManager) // Function to debug the Power Manager (we have no output to screen) @@ -47,68 +47,30 @@ inline void PowerManager::debugPM() { * Constructor * ********************************************/ -PowerManager::PowerManager() { - DEBUG_ENTER_FUNC(); - - _flagMutex = NULL; /* Init mutex handle */ - _listMutex = NULL; /* Init mutex handle */ - _condSuspendable = NULL; /* Init condition variable */ - _condPM = NULL; - - _condSuspendable = SDL_CreateCond(); - if (_condSuspendable <= 0) { - PSP_ERROR("Couldn't create Suspendable condition variable\n"); - } - - _condPM = SDL_CreateCond(); - if (_condPM <= 0) { - PSP_ERROR("Couldn't create PM condition variable\n"); - } - - _flagMutex = SDL_CreateMutex(); - if (_flagMutex <= 0) { - PSP_ERROR("Couldn't create flag Mutex\n"); - } - - _listMutex = SDL_CreateMutex(); - if (_listMutex <= 0) { - PSP_ERROR("Couldn't create list Mutex\n"); - } - - _suspendFlag = false; - _criticalCounter = 0; // How many are in the critical section - _pauseFlag = 0; - _pauseFlagOld = 0; - _pauseClientState = 0; - _listCounter = 0; - PMStatusSet(kInitDone); - _error = 0; -} +PowerManager::PowerManager() : _pauseFlag(false), _pauseFlagOld(false), _pauseClientState(UNPAUSED), + _suspendFlag(false), _flagMutex(true), _listMutex(true), + _criticalCounter(0), _listCounter(0), _error(0), _PMStatus(kInitDone) {} /******************************************* * * Function to register to be notified when suspend/resume time comes * ********************************************/ -int PowerManager::registerSuspend(Suspendable *item) { +bool PowerManager::registerForSuspend(Suspendable *item) { DEBUG_ENTER_FUNC(); // Register in list debugPM(); - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock _listMutex[%p]\n", _listMutex); - } + _listMutex.lock(); _suspendList.push_front(item); _listCounter++; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } + _listMutex.unlock(); debugPM(); - return 0; + return true; } /******************************************* @@ -116,26 +78,20 @@ int PowerManager::registerSuspend(Suspendable *item) { * Function to unregister to be notified when suspend/resume time comes * ********************************************/ -int PowerManager::unregisterSuspend(Suspendable *item) { +bool PowerManager::unregisterForSuspend(Suspendable *item) { DEBUG_ENTER_FUNC(); debugPM(); // Unregister from stream list - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } - + _listMutex.lock(); + _suspendList.remove(item); _listCounter--; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } + _listMutex.unlock(); - PSP_DEBUG_PRINT("Out of unregisterSuspend\n"); debugPM(); - - return 0; + return true; } /******************************************* @@ -144,21 +100,7 @@ int PowerManager::unregisterSuspend(Suspendable *item) { * ********************************************/ PowerManager::~PowerManager() { - DEBUG_ENTER_FUNC(); - - PMStatusSet(kDestroyPM); - - SDL_DestroyCond(_condSuspendable); - _condSuspendable = 0; - - SDL_DestroyCond(_condPM); - _condPM = 0; - - SDL_DestroyMutex(_flagMutex); - _flagMutex = 0; - - SDL_DestroyMutex(_listMutex); - _listMutex = 0; + _PMStatus = kDestroyPM; } /******************************************* @@ -171,114 +113,92 @@ PowerManager::~PowerManager() { * ********************************************/ void PowerManager::pollPauseEngine() { - + DEBUG_ENTER_FUNC(); + + bool pause = _pauseFlag; // We copy so as not to have multiple values - if ((pause != _pauseFlagOld) && g_engine) { // Check to see if we have an engine - if (pause && _pauseClientState == PowerManager::Unpaused) { - _pauseClientState = PowerManager::Pausing; // Tell PM we're in the middle of pausing - g_engine->pauseEngine(true); - PSP_DEBUG_PRINT_FUNC("Pausing engine\n"); - _pauseClientState = PowerManager::Paused; // Tell PM we're done pausing - } else if (!pause && _pauseClientState == PowerManager::Paused) { - g_engine->pauseEngine(false); - PSP_DEBUG_PRINT_FUNC("Unpausing for resume\n"); - _pauseClientState = PowerManager::Unpaused; // Tell PM we're in the middle of pausing + if (pause != _pauseFlagOld) { + if (g_engine) { // Check to see if we have an engine + if (pause && _pauseClientState == UNPAUSED) { + _pauseClientState = PAUSING; // Tell PM we're in the middle of pausing + g_engine->pauseEngine(true); + PSP_DEBUG_PRINT_FUNC("Pausing engine\n"); + _pauseClientState = PAUSED; // Tell PM we're done pausing + } else if (!pause && _pauseClientState == PAUSED) { + g_engine->pauseEngine(false); + PSP_DEBUG_PRINT_FUNC("Unpausing for resume\n"); + _pauseClientState = UNPAUSED; // Tell PM we're unpaused + } } - _pauseFlagOld = pause; } } -/******************************************* -* -* Function to be called by threads wanting to block on the PSP entering suspend -* Use this for small critical sections where you can easily restore the previous state. -* -********************************************/ -int PowerManager::blockOnSuspend() { - return beginCriticalSection(true); -} - /******************************************* * * Function to block on a suspend, then start a non-suspendable critical section * Use this for large or REALLY critical critical-sections. * Make sure to call endCriticalSection or the PSP won't suspend. +* returns true if blocked, false if not blocked ********************************************/ -int PowerManager::beginCriticalSection(bool justBlock) { +bool PowerManager::beginCriticalSection() { DEBUG_ENTER_FUNC(); - int ret = NotBlocked; - - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("PowerManager::blockOnSuspend(): Couldn't lock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + bool ret = false; + + _flagMutex.lock(); // Check the access flag - if (_suspendFlag == true) { - PSP_DEBUG_PRINT("We're being blocked!\n"); - debugPM(); - ret = Blocked; + if (_suspendFlag) { + ret = true; - // If it's true, we wait for a signal to continue - if (SDL_CondWait(_condSuspendable, _flagMutex) != 0) { - PSP_DEBUG_PRINT("PowerManager::blockOnSuspend(): Couldn't wait on cond[%p]\n", _condSuspendable); - } + PSP_DEBUG_PRINT("I got blocked. ThreadId[%x]\n", sceKernelGetThreadId()); + debugPM(); + + _threadSleep.wait(_flagMutex); - PSP_DEBUG_PRINT("We got blocked!!\n"); + PSP_DEBUG_PRINT_FUNC("I got released. ThreadId[%x]\n", sceKernelGetThreadId()); debugPM(); } // Now prevent the PM from suspending until we're done - if (justBlock == false) - _criticalCounter++; + _criticalCounter++; - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("PowerManager::blockOnSuspend(): Couldn't unlock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + _flagMutex.unlock(); return ret; } -int PowerManager::endCriticalSection() { +// returns success = true +void PowerManager::endCriticalSection() { DEBUG_ENTER_FUNC(); - int ret = 0; - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("PowerManager::endCriticalSection(): Couldn't lock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + _flagMutex.lock(); // We're done with our critical section _criticalCounter--; if (_criticalCounter <= 0) { - if (_suspendFlag == true) { // If the PM is sleeping, this flag must be set - PSP_DEBUG_PRINT("Unblocked thread waking up the PM.\n"); - debugPM(); - - SDL_CondBroadcast(_condPM); - - PSP_DEBUG_PRINT("Woke up the PM\n"); - debugPM(); + if (_suspendFlag) { // If the PM is sleeping, this flag must be set + PSP_DEBUG_PRINT_FUNC("PM is asleep. Waking it up.\n"); + debugPM(); + + _pmSleep.releaseAll(); + + PSP_DEBUG_PRINT_FUNC("Woke up the PM\n"); + + debugPM(); } if (_criticalCounter < 0) { // Check for bad usage of critical sections - PSP_ERROR("Critical counter[%d]\n", _criticalCounter); + PSP_ERROR("Critical counter[%d]!!!\n", _criticalCounter); debugPM(); } } - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - ret = Error; - } - - return ret; + _flagMutex.unlock(); } /******************************************* @@ -286,90 +206,77 @@ int PowerManager::endCriticalSection() { * Callback function to be called to put every Suspendable to suspend * ********************************************/ -int PowerManager::suspend() { +void PowerManager::suspend() { DEBUG_ENTER_FUNC(); - int ret = 0; - if (_pauseFlag) return ret; // Very important - make sure we only suspend once + if (_pauseFlag) + return; // Very important - make sure we only suspend once - scePowerLock(0); // Critical to make sure PSP doesn't suspend before we're done + scePowerLock(0); // Also critical to make sure PSP doesn't suspend before we're done // The first stage of suspend is pausing the engine if possible. We don't want to cause files // to block, or we might not get the engine to pause. On the other hand, we might wait for polling // and it'll never happen. We also want to do this w/o mutexes (for speed) which is ok in this case. _pauseFlag = true; - PMStatusSet(kWaitForClientPause); + _PMStatus = kWaitForClientPause; // Now we wait, giving the engine thread some time to find our flag. - for (int i = 0; i < 10 && _pauseClientState == Unpaused; i++) - sceKernelDelayThread(50000); // We wait 50 msec x 10 times = 0.5 seconds + for (int i = 0; i < 10 && _pauseClientState == UNPAUSED; i++) + PspThread::delayMicros(50000); // We wait 50 msec x 10 times = 0.5 seconds - if (_pauseClientState == Pausing) { // Our event has been acknowledged. Let's wait until the client is done. - PMStatusSet(kWaitForClientToFinishPausing); + if (_pauseClientState == PAUSING) { // Our event has been acknowledged. Let's wait until the client is done. + _PMStatus = kWaitForClientToFinishPausing; - while (_pauseClientState != Paused) - sceKernelDelayThread(50000); // We wait 50 msec at a time + while (_pauseClientState != PAUSED) + PspThread::delayMicros(50000); // We wait 50 msec at a time } - // It's possible that the polling thread missed our pause event, but there's nothing we can do about that. - // We can't know if there's polling going on or not. It's usually not a critical thing anyway. + // It's possible that the polling thread missed our pause event, but there's + // nothing we can do about that. + // We can't know if there's polling going on or not. + // It's usually not a critical thing anyway. - PMStatusSet(kGettingFlagMutexSuspend); + _PMStatus = kGettingFlagMutexSuspend; // Now we set the suspend flag to true to cause reading threads to block + _flagMutex.lock(); - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("Couldn't lock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGotFlagMutexSuspend); + _PMStatus = kGotFlagMutexSuspend; _suspendFlag = true; // Check if anyone is in a critical section. If so, we'll wait for them if (_criticalCounter > 0) { - PMStatusSet(kWaitCritSectionSuspend); - SDL_CondWait(_condPM, _flagMutex); - PMStatusSet(kDoneWaitingCritSectionSuspend); - } + _PMStatus = kWaitCritSectionSuspend; + + _pmSleep.wait(_flagMutex); + + _PMStatus = kDoneWaitingCritSectionSuspend; + } + + _flagMutex.unlock(); - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGettingListMutexSuspend); + _PMStatus = kGettingListMutexSuspend; // Loop over list, calling suspend() - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kIteratingListSuspend); + _listMutex.lock(); + + _PMStatus = kIteratingListSuspend; // Iterate Common::List::iterator i; for (i = _suspendList.begin(); i != _suspendList.end(); ++i) { (*i)->suspend(); } + _PMStatus = kDoneIteratingListSuspend; - PMStatusSet(kDoneIteratingListSuspend); - - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneSuspend); + _listMutex.unlock(); + _PMStatus = kDoneSuspend; scePowerUnlock(0); // Allow the PSP to go to sleep now - - return ret; + + _PMStatus = kDonePowerUnlock; } /******************************************* @@ -377,24 +284,26 @@ int PowerManager::suspend() { * Callback function to resume every Suspendable * ********************************************/ -int PowerManager::resume() { +void PowerManager::resume() { DEBUG_ENTER_FUNC(); - int ret = 0; + + _PMStatus = kBeginResume; // Make sure we can't get another suspend scePowerLock(0); - if (!_pauseFlag) return ret; // Make sure we can only resume once + _PMStatus = kCheckingPauseFlag; + + if (!_pauseFlag) + return; // Make sure we can only resume once - PMStatusSet(kGettingListMutexResume); + _PMStatus = kGettingListMutexResume; // First we notify our Suspendables. Loop over list, calling resume() - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kIteratingListResume); + _listMutex.lock(); + + _PMStatus = kIteratingListResume; + // Iterate Common::List::iterator i = _suspendList.begin(); @@ -402,46 +311,31 @@ int PowerManager::resume() { (*i)->resume(); } - PMStatusSet(kDoneIteratingListResume); + _PMStatus = kDoneIteratingListResume; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGettingFlagMutexResume); + _listMutex.unlock(); + + _PMStatus = kGettingFlagMutexResume; // Now we set the suspend flag to false - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("Couldn't lock flagMutex %p\n", _flagMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kGotFlagMutexResume); + _flagMutex.lock(); + + _PMStatus = kGotFlagMutexResume; _suspendFlag = false; - PMStatusSet(kSignalSuspendedThreadsResume); + _PMStatus = kSignalSuspendedThreadsResume; - // Signal the other threads to wake up - if (SDL_CondBroadcast(_condSuspendable) != 0) { - PSP_ERROR("Couldn't broadcast condition[%p]\n", _condSuspendable); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneSignallingSuspendedThreadsResume); + // Signal the threads to wake up + _threadSleep.releaseAll(); + + _PMStatus = kDoneSignallingSuspendedThreadsResume; - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneResume); + _flagMutex.unlock(); + + _PMStatus = kDoneResume; - _pauseFlag = false; // Signal engine to unpause + _pauseFlag = false; // Signal engine to unpause -- no mutex needed scePowerUnlock(0); // Allow new suspends - - return ret; } diff --git a/backends/platform/psp/powerman.h b/backends/platform/psp/powerman.h index af3134adee..5f09bc7794 100644 --- a/backends/platform/psp/powerman.h +++ b/backends/platform/psp/powerman.h @@ -26,8 +26,7 @@ #ifndef POWERMAN_H #define POWERMAN_H -#include -#include +#include "backends/platform/psp/thread.h" #include "common/singleton.h" #include "common/list.h" @@ -53,12 +52,12 @@ class PowerManager: public Common::Singleton { public: int blockOnSuspend(); /* block if suspending */ - int beginCriticalSection(bool justBlock = false); /* Use a critical section to block (if suspend was already pressed) */ - int endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */ - int registerSuspend(Suspendable *item); /* register to be called to suspend/resume */ - int unregisterSuspend(Suspendable *item); /* remove from suspend/resume list */ - int suspend(); /* callback to have all items in list suspend */ - int resume(); /* callback to have all items in list resume */ + bool beginCriticalSection(); /* Use a critical section to block (if suspend was already pressed) */ + void endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */ + bool registerForSuspend(Suspendable *item); /* register to be called to suspend/resume */ + bool unregisterForSuspend(Suspendable *item); /* remove from suspend/resume list */ + void suspend(); /* callback to have all items in list suspend */ + void resume(); /* callback to have all items in list resume */ // Functions for pausing the engine void pollPauseEngine(); /* Poll whether the engine should be paused */ @@ -69,11 +68,9 @@ public: }; enum PauseState { - Unpaused = 0, - PauseEvent, - UnpauseEvent, - Pausing, - Paused + UNPAUSED = 0, + PAUSING, + PAUSED }; private: @@ -81,34 +78,38 @@ private: PowerManager(); ~PowerManager(); - Common::List _suspendList; /* list to register in */ + Common::List _suspendList; // list to register in - volatile bool _pauseFlag; /* For pausing, which is before suspending */ - volatile bool _pauseFlagOld; /* Save the last state of the flag while polling */ - volatile int _pauseClientState; /* Pause state of the target */ + volatile bool _pauseFlag; // For pausing, which is before suspending + volatile bool _pauseFlagOld; // Save the last state of the flag while polling + volatile PauseState _pauseClientState; // Pause state of the target - volatile bool _suspendFlag; /* protected variable */ - SDL_mutex *_flagMutex; /* mutex to access access flag */ - SDL_mutex *_listMutex; /* mutex to access Suspendable list */ - SDL_cond *_condSuspendable; /* signal to synchronize accessing threads */ - SDL_cond *_condPM; /* signal to wake up the PM from a critical section */ - volatile int _criticalCounter; /* Counter of how many threads are in a critical section */ - int _error; /* error code - PM can't talk to us. For debugging */ + volatile bool _suspendFlag; // protected variable + PspMutex _flagMutex; // mutex to access access flag + PspMutex _listMutex; // mutex to access Suspendable list + PspCondition _threadSleep; // signal to synchronize accessing threads + PspCondition _pmSleep; // signal to wake up the PM from a critical section + volatile int _criticalCounter; // Counter of how many threads are in a critical section + int _error; // error code - PM can't talk to us. For debugging + volatile int _PMStatus; // What the PM is doing. for debugging // States for PM to be in (used for debugging) enum PMState { - kInitDone = 1 , - kDestroyPM, - kWaitForClientPause, - kWaitForClientToFinishPausing, - kGettingFlagMutexSuspend, - kGotFlagMutexSuspend, - kWaitCritSectionSuspend, - kDoneWaitingCritSectionSuspend, - kGettingListMutexSuspend, - kIteratingListSuspend, - kDoneIteratingListSuspend, - kDoneSuspend, + kInitDone = 1, + kDestroyPM = 2, + kWaitForClientPause = 3, + kWaitForClientToFinishPausing = 4, + kGettingFlagMutexSuspend = 5, + kGotFlagMutexSuspend = 6, + kWaitCritSectionSuspend = 7, + kDoneWaitingCritSectionSuspend = 8, + kGettingListMutexSuspend = 9, + kIteratingListSuspend = 10, + kDoneIteratingListSuspend = 11, + kDoneSuspend = 12, + kDonePowerUnlock, + kBeginResume, + kCheckingPauseFlag, kGettingListMutexResume, kIteratingListResume, kDoneIteratingListResume, @@ -122,8 +123,6 @@ private: volatile int _listCounter; /* How many people are in the list - just for debugging */ void debugPM(); /* print info about the PM */ - void PMStatusSet(PMState s) { _PMStatus = s; } - volatile int _PMStatus; /* What the PM is doing */ public: int getPMStatus() const { return _PMStatus; } diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index d20df45215..43e3b931c3 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -47,10 +47,10 @@ void PspThread::delayMicros(uint32 us) { #include "backends/platform/psp/trace.h" -PspSemaphore::PspSemaphore(int initialValue, int maxValue) { +PspSemaphore::PspSemaphore(int initialValue, int maxValue/*=255*/) { DEBUG_ENTER_FUNC(); _handle = 0; - _handle = sceKernelCreateSema("ScummVM Sema", 0 /* attr */, + _handle = (uint32)sceKernelCreateSema("ScummVM Sema", 0 /* attr */, initialValue, maxValue, 0 /*option*/); if (!_handle) @@ -60,7 +60,7 @@ PspSemaphore::PspSemaphore(int initialValue, int maxValue) { PspSemaphore::~PspSemaphore() { DEBUG_ENTER_FUNC(); if (_handle) - if (sceKernelDeleteSema(_handle) < 0) + if (sceKernelDeleteSema((SceUID)_handle) < 0) PSP_ERROR("failed to delete semaphore.\n"); } @@ -69,7 +69,7 @@ int PspSemaphore::numOfWaitingThreads() { SceKernelSemaInfo info; info.numWaitThreads = 0; - if (sceKernelReferSemaStatus(_handle, &info) < 0) + if (sceKernelReferSemaStatus((SceUID)_handle, &info) < 0) PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); return info.numWaitThreads; @@ -80,7 +80,7 @@ int PspSemaphore::getValue() { SceKernelSemaInfo info; info.currentCount = 0; - if (sceKernelReferSemaStatus(_handle, &info) < 0) + if (sceKernelReferSemaStatus((SceUID)_handle, &info) < 0) PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); return info.currentCount; @@ -88,7 +88,7 @@ int PspSemaphore::getValue() { bool PspSemaphore::pollForValue(int value) { DEBUG_ENTER_FUNC(); - if (sceKernelPollSema(_handle, value) < 0) + if (sceKernelPollSema((SceUID)_handle, value) < 0) return false; return true; @@ -107,10 +107,10 @@ bool PspSemaphore::takeWithTimeOut(uint32 timeOut) { return true; } -bool PspSemaphore::give(int num) { +bool PspSemaphore::give(int num /*=1*/) { DEBUG_ENTER_FUNC(); - if (sceKernelSignalSema(_handle, num) < 0) + if (sceKernelSignalSema((SceUID)_handle, num) < 0) return false; return true; } @@ -152,6 +152,46 @@ bool PspMutex::unlock() { return ret; } +// Class PspCondition ------------------------------------------------- + +// Release all threads waiting on the condition +void PspCondition::releaseAll() { + _mutex.lock(); + if (_waitingThreads > _signaledThreads) { // we have signals to issue + int numWaiting = _waitingThreads - _signaledThreads; // threads we haven't signaled + _signaledThreads = _waitingThreads; + + _waitSem.give(numWaiting); + _mutex.unlock(); + for (int i=0; i 0 ) { + _doneSem.give(); // let the thread know + _signaledThreads--; + } + _waitingThreads--; + _mutex.unlock(); + + externalMutex.lock(); // must lock external mutex here for continuation +} + //#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ //#define __PSP_DEBUG_PRINT__ /* For debug printouts */ diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index 33b3f6ce53..bd7a60b6ed 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -36,13 +36,13 @@ public: class PspSemaphore { private: - SceUID _handle; + uint32 _handle; public: - PspSemaphore(int initialValue, int maxValue); + PspSemaphore(int initialValue, int maxValue=255); ~PspSemaphore(); bool take() { return takeWithTimeOut(0); } bool takeWithTimeOut(uint32 timeOut); - bool give(int num); + bool give(int num=1); bool pollForValue(int value); // check for a certain value int numOfWaitingThreads(); int getValue(); @@ -62,6 +62,20 @@ public: bool getValue() { return (bool)_semaphore.getValue(); } }; +class PspCondition { +private: + PspMutex _mutex; + int _waitingThreads; + int _signaledThreads; + PspSemaphore _waitSem; + PspSemaphore _doneSem; +public: + PspCondition() : _mutex(true), _waitingThreads(0), _signaledThreads(0), + _waitSem(0), _doneSem(0) {} + void wait(PspMutex &externalMutex); + void releaseAll(); +}; + class PspRtc { private: -- cgit v1.2.3 From af5346e7ab97190f45be17192deef9a764cd128d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 13:14:23 +0000 Subject: SCI: calling wait() directly and removing it from SciGui svn-id: r49853 --- engines/sci/graphics/gui.cpp | 4 ---- engines/sci/graphics/gui.h | 2 -- engines/sci/graphics/paint16.cpp | 16 ++++------------ engines/sci/graphics/portrait.cpp | 2 +- engines/sci/graphics/transitions.cpp | 4 ++-- 5 files changed, 7 insertions(+), 21 deletions(-) diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 847831c909..7febbeba69 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -91,8 +91,4 @@ void SciGui::init(bool usesOldGfxFunctions) { _paint16->init(_animate, _text16); } -void SciGui::wait(int16 ticks) { - _s->wait(ticks); -} - } // End of namespace Sci diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h index edb93e10cb..c3954286b3 100644 --- a/engines/sci/graphics/gui.h +++ b/engines/sci/graphics/gui.h @@ -51,8 +51,6 @@ public: virtual void init(bool usesOldGfxFunctions); - virtual void wait(int16 ticks); - protected: GfxCursor *_cursor; EngineState *_s; diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 10eae3c618..103da594e6 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -562,22 +562,14 @@ void GfxPaint16::kernelShakeScreen(uint16 shakeCount, uint16 directions) { if (directions & SCI_SHAKE_DIRECTION_VERTICAL) _screen->setVerticalShakePos(10); // TODO: horizontal shakes + g_system->updateScreen(); + g_sci->getEngineState()->wait(3); - if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { - g_system->updateScreen(); - g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); - } - - _gui->wait(3); if (directions & SCI_SHAKE_DIRECTION_VERTICAL) _screen->setVerticalShakePos(0); - if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { - g_system->updateScreen(); - g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); - } - - _gui->wait(3); + g_system->updateScreen(); + g_sci->getEngineState()->wait(3); } } diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index b912bf552e..a85d9a3b06 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -182,7 +182,7 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint // Wait till syncTime passed, then show specific animation bitmap do { - _gui->wait(1); + g_sci->getEngineState()->wait(1); curEvent = _event->get(SCI_EVENT_ANY); if (curEvent.type == SCI_EVENT_MOUSE_PRESS || (curEvent.type == SCI_EVENT_KEYBOARD && curEvent.data == SCI_KEY_ESC) || diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index f73525caaf..0bb1a87fc2 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -291,7 +291,7 @@ void GfxTransitions::fadeOut() { workPalette[colorNr * 4 + 2] = oldPalette[colorNr * 4 + 2] * stepNr / 100; } g_system->setPalette(workPalette + 4, 1, 254); - _gui->wait(2); + g_sci->getEngineState()->wait(2); } } @@ -301,7 +301,7 @@ void GfxTransitions::fadeIn() { for (stepNr = 0; stepNr <= 100; stepNr += 10) { _palette->kernelSetIntensity(1, 255, stepNr, true); - _gui->wait(2); + g_sci->getEngineState()->wait(2); } } -- cgit v1.2.3 From ba2de6dfa4f160d04474b76d8d5f7a24634196e1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 13:34:40 +0000 Subject: SCI: putting SciGui::init into SciEngine, removing it from SciGui(32) svn-id: r49854 --- engines/sci/engine/savegame.cpp | 10 +--------- engines/sci/graphics/gui.cpp | 5 ----- engines/sci/graphics/gui.h | 2 -- engines/sci/graphics/gui32.cpp | 3 --- engines/sci/graphics/gui32.h | 4 ---- engines/sci/graphics/ports.cpp | 3 +-- engines/sci/graphics/ports.h | 3 +-- engines/sci/sci.cpp | 19 +++++++++++-------- engines/sci/sci.h | 3 +++ 9 files changed, 17 insertions(+), 35 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 02fdde5622..97872253cb 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -983,15 +983,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // Message state: s->_msgState = new MessageState(s->_segMan); -#ifdef ENABLE_SCI32 - if (g_sci->_gui32) { - g_sci->_gui32->init(); - } else { -#endif - g_sci->_gui->init(g_sci->_features->usesOldGfxFunctions()); -#ifdef ENABLE_SCI32 - } -#endif + g_sci->initGraphics(); s->abortScriptProcessing = kAbortLoadGame; s->shrinkStackToBase(); diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 7febbeba69..a450870079 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -86,9 +86,4 @@ SciGui::~SciGui() { delete _coordAdjuster; } -void SciGui::init(bool usesOldGfxFunctions) { - _ports->init(usesOldGfxFunctions, this, _paint16, _text16); - _paint16->init(_animate, _text16); -} - } // End of namespace Sci diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h index c3954286b3..26028e0cc5 100644 --- a/engines/sci/graphics/gui.h +++ b/engines/sci/graphics/gui.h @@ -49,8 +49,6 @@ public: SciGui(EngineState *s, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor, GfxPorts *ports, AudioPlayer *audio); virtual ~SciGui(); - virtual void init(bool usesOldGfxFunctions); - protected: GfxCursor *_cursor; EngineState *_s; diff --git a/engines/sci/graphics/gui32.cpp b/engines/sci/graphics/gui32.cpp index fb2da08ae5..c953ed7f70 100644 --- a/engines/sci/graphics/gui32.cpp +++ b/engines/sci/graphics/gui32.cpp @@ -66,9 +66,6 @@ SciGui32::~SciGui32() { delete _coordAdjuster; } -void SciGui32::init() { -} - void SciGui32::drawRobot(GuiResourceId robotId) { Robot *test = new Robot(g_sci->getResMan(), _screen, robotId); test->draw(); diff --git a/engines/sci/graphics/gui32.h b/engines/sci/graphics/gui32.h index 2c73272566..2be37d0aaf 100644 --- a/engines/sci/graphics/gui32.h +++ b/engines/sci/graphics/gui32.h @@ -44,10 +44,6 @@ public: SciGui32(SegManager *segMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor); ~SciGui32(); - void init(); - - void textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight); - void drawRobot(GuiResourceId robotId); protected: diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index d230c1eb9f..b8d38910d1 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -54,11 +54,10 @@ GfxPorts::~GfxPorts() { delete _menuPort; } -void GfxPorts::init(bool usesOldGfxFunctions, SciGui *gui, GfxPaint16 *paint16, GfxText16 *text16) { +void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16) { int16 offTop = 10; _usesOldGfxFunctions = usesOldGfxFunctions; - _gui = gui; _paint16 = paint16; _text16 = text16; diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h index c8ce6b3470..818f92f44f 100644 --- a/engines/sci/graphics/ports.h +++ b/engines/sci/graphics/ports.h @@ -45,7 +45,7 @@ public: GfxPorts(SegManager *segMan, GfxScreen *screen); ~GfxPorts(); - void init(bool usesOldGfxFunctions, SciGui *gui, GfxPaint16 *paint16, GfxText16 *text16); + void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16); void kernelSetActive(uint16 portId); Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft); @@ -102,7 +102,6 @@ private: typedef Common::List PortList; SegManager *_segMan; - SciGui *_gui; GfxPaint16 *_paint16; GfxScreen *_screen; GfxText16 *_text16; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 2680da9d39..7dba21b800 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -47,6 +47,7 @@ #include "sci/graphics/gui.h" #include "sci/graphics/maciconbar.h" #include "sci/graphics/menu.h" +#include "sci/graphics/paint16.h" #include "sci/graphics/ports.h" #include "sci/graphics/palette.h" #include "sci/graphics/cursor.h" @@ -254,14 +255,7 @@ Common::Error SciEngine::run() { syncSoundSettings(); -#ifdef ENABLE_SCI32 - if (_gui32) - _gui32->init(); - else -#endif - _gui->init(_features->usesOldGfxFunctions()); - // Set default (EGA, amiga or resource 999) palette - _gfxPalette->setDefault(); + initGraphics(); debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion())); @@ -353,6 +347,15 @@ bool SciEngine::initGame() { return true; } +void SciEngine::initGraphics() { + if (_gfxPorts) { + _gfxPorts->init(_features->usesOldGfxFunctions(), _gfxPaint16, _gfxText16); + _gfxPaint16->init(_gfxAnimate, _gfxText16); + } + // Set default (EGA, amiga or resource 999) palette + _gfxPalette->setDefault(); +} + #ifdef USE_OLD_MUSIC_FUNCTIONS void SciEngine::initGameSound(int sound_flags, SciVersion soundVersion) { diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 7cfeec0e09..6f6a6b5dd1 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -193,6 +193,9 @@ public: Common::String getSciLanguageString(const char *str, kLanguage lang, kLanguage *lang2 = NULL) const; + // Initializes ports and paint16 for non-sci32 games, also sets default palette + void initGraphics(); + public: GfxAnimate *_gfxAnimate; // Animate for 16-bit gfx GfxCache *_gfxCache; -- cgit v1.2.3 From 45fe9a469e0f0281926920614e1ffec88932d7e8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 15 Jun 2010 13:45:12 +0000 Subject: Fix wave patches. svn-id: r49855 --- engines/sci/resource_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 7a0d9bac6e..fc30047e1c 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -174,7 +174,7 @@ void ResourceManager::processWavePatch(ResourceId resourceId, Common::String nam Common::File file; file.open(name); - updateResource(resourceId, resSrc, name.size()); + updateResource(resourceId, resSrc, file.size()); debugC(1, kDebugLevelResMan, "Patching %s - OK", name.c_str()); } -- cgit v1.2.3 From ddb5a769a2e4f74c1da945914a67e169bc94bafb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 13:52:06 +0000 Subject: SCI: reset _gfxText16 for sci32, fixes gk1 svn-id: r49856 --- engines/sci/sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 7dba21b800..692928f12c 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -227,6 +227,7 @@ Common::Error SciEngine::run() { _gfxMenu = 0; _gfxPaint16 = 0; _gfxPorts = 0; + _gfxText16 = 0; _gui = 0; _gui32 = new SciGui32(_gamestate->_segMan, _eventMan, _gfxScreen, _gfxPalette, _gfxCache, _gfxCursor); } else { -- cgit v1.2.3 From ab558b45d252743797bca27d2240bf0e2057863f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 14:55:52 +0000 Subject: Fixed detective Mosely's hotspot in GK1 (day 1) svn-id: r49857 --- engines/sci/engine/kernel32.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 2b00daf34a..8c5cb019b9 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -792,12 +792,18 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); - uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + if (nsRect.left < 0 || nsRect.top < 0) { + // If top and left are negative, we need to adjust coordinates by the item's x and y + nsRect.translate(itemX, itemY); + } + + // HACK: nsLeft and nsTop can be invalid, so try and fix them here using x and y + // (e.g. with the inventory screen in GK1 or detective Mosely in his office) + // Not sure why this is happening, but at least this hack fixes most of the issues if (nsRect.left == itemY && nsRect.top == itemX) { - // FIXME: Why is this happening?? - // Swap the values, as they're inversed(eh???) + // Swap the values, as they're inversed (eh???) nsRect.left = itemX; nsRect.top = itemY; } -- cgit v1.2.3 From e94e91222c70537740ce9610cd8eecfa15f93cb0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 15:02:52 +0000 Subject: Fixed comments svn-id: r49858 --- engines/sci/engine/kernel32.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 8c5cb019b9..0a510dabbb 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -796,12 +796,12 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); if (nsRect.left < 0 || nsRect.top < 0) { // If top and left are negative, we need to adjust coordinates by the item's x and y + // (e.g. happens in GK1, day 1, with detective Mosely's hotspot in his office) nsRect.translate(itemX, itemY); } // HACK: nsLeft and nsTop can be invalid, so try and fix them here using x and y - // (e.g. with the inventory screen in GK1 or detective Mosely in his office) - // Not sure why this is happening, but at least this hack fixes most of the issues + // (e.g. with the inventory screen in GK1) if (nsRect.left == itemY && nsRect.top == itemX) { // Swap the values, as they're inversed (eh???) nsRect.left = itemX; -- cgit v1.2.3 From 44ce741f9c3fd1651c62ffee91467437f24e5d3c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 15:39:59 +0000 Subject: Code formatting svn-id: r49859 --- common/translation.cpp | 28 ++++++++++++++-------------- common/translation.h | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 8301b22ecc..454bbaa402 100755 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -49,7 +49,7 @@ namespace Common { TranslationManager::TranslationManager() { #ifdef DETECTLANG // Activating current locale settings - const char* locale = setlocale(LC_ALL, ""); + const char *locale = setlocale(LC_ALL, ""); // Detect the language from the locale if (!locale) { @@ -82,7 +82,7 @@ TranslationManager::~TranslationManager() { #endif // TERMCONV } -void TranslationManager::setLanguage(const char* lang) { +void TranslationManager::setLanguage(const char *lang) { if (*lang == '\0') po2c_setlang(_syslang); else @@ -90,10 +90,10 @@ void TranslationManager::setLanguage(const char* lang) { #ifdef TERMCONV // Get the locale character set (for terminal output) - const char* charset_term = nl_langinfo(CODESET); + const char *charset_term = nl_langinfo(CODESET); // Get the messages character set - const char* charset_po = po2c_getcharset(); + const char *charset_po = po2c_getcharset(); // Delete previous conversion if (_conversion) @@ -104,23 +104,23 @@ void TranslationManager::setLanguage(const char* lang) { #endif // TERMCONV } -const char* TranslationManager::getTranslation(const char* message) { +const char *TranslationManager::getTranslation(const char *message) { return po2c_gettext(message); } #ifdef TERMCONV -bool TranslationManager::convert(const char* message) { +bool TranslationManager::convert(const char *message) { // Preparing conversion origin size_t len = strlen(message); - char* msgcpy = new char[len + 1]; + char *msgcpy = new char[len + 1]; strcpy(msgcpy, message); - char* msg = msgcpy; - char** pmsg = &msg; + char *msg = msgcpy; + char **pmsg = &msg; // Preparing conversion destination size_t len2 = _sizeconv; char *conv = _convmsg; - char** pconv = &conv; + char **pconv = &conv; // Clean previous conversions iconv(_conversion, NULL, NULL, pconv, &len2); @@ -134,7 +134,7 @@ bool TranslationManager::convert(const char* message) { } #endif // TERMCONV -const char* TranslationManager::convertTerm(const char* message) { +const char *TranslationManager::convertTerm(const char *message) { #ifdef TERMCONV size_t len = strlen(message); if (!_convmsg) { @@ -206,13 +206,13 @@ TranslationManager::TranslationManager() {} TranslationManager::~TranslationManager() {} -void TranslationManager::setLanguage(const char* lang) {} +void TranslationManager::setLanguage(const char *lang) {} -const char* TranslationManager::getTranslation(const char* message) { +const char *TranslationManager::getTranslation(const char *message) { return message; } -const char* TranslationManager::convertTerm(const char* message) { +const char *TranslationManager::convertTerm(const char *message) { return message; } diff --git a/common/translation.h b/common/translation.h index 95deb6bb38..623a7ccd31 100755 --- a/common/translation.h +++ b/common/translation.h @@ -65,10 +65,10 @@ private: #ifdef TERMCONV iconv_t _conversion; - char* _convmsg; + char *_convmsg; int _sizeconv; - bool convert(const char* message); + bool convert(const char *message); #endif // TERMCONV public: @@ -98,13 +98,13 @@ public: * message. In case the message isn't found in the translation catalog, * it returns the original untranslated message. */ - const char* getTranslation(const char* message); + const char *getTranslation(const char *message); /** * Converts the message into the terminal character set (which may be * different than the GUI's "native" one. */ - const char* convertTerm(const char* message); + const char *convertTerm(const char *message); const TLangArray getSupportedLanguages() const; }; -- cgit v1.2.3 From b25aba1d1ed9c867bbb4ff1b6b7ef9ea075b3cd1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 15:44:24 +0000 Subject: SCI: SciGui/SciGui32 gone for good... svn-id: r49860 --- engines/sci/console.cpp | 9 ++-- engines/sci/engine/kernel32.cpp | 2 - engines/sci/engine/kevent.cpp | 2 - engines/sci/engine/kgraphics.cpp | 5 +- engines/sci/engine/kmenu.cpp | 1 - engines/sci/engine/kmisc.cpp | 1 - engines/sci/engine/savegame.cpp | 5 -- engines/sci/graphics/cache.h | 2 - engines/sci/graphics/compare.h | 2 - engines/sci/graphics/frameout.h | 3 ++ engines/sci/graphics/gui.cpp | 89 ------------------------------------ engines/sci/graphics/gui.h | 76 ------------------------------ engines/sci/graphics/gui32.cpp | 75 ------------------------------ engines/sci/graphics/gui32.h | 64 -------------------------- engines/sci/graphics/menu.cpp | 5 +- engines/sci/graphics/menu.h | 3 +- engines/sci/graphics/paint.h | 2 - engines/sci/graphics/paint16.cpp | 6 +-- engines/sci/graphics/paint16.h | 4 +- engines/sci/graphics/paint32.cpp | 7 +++ engines/sci/graphics/paint32.h | 3 +- engines/sci/graphics/portrait.cpp | 5 +- engines/sci/graphics/portrait.h | 3 +- engines/sci/graphics/robot.cpp | 8 ++-- engines/sci/graphics/robot.h | 6 +-- engines/sci/graphics/transitions.cpp | 5 +- engines/sci/graphics/transitions.h | 3 +- engines/sci/module.mk | 2 - engines/sci/sci.cpp | 81 ++++++++++++++++++++++++-------- engines/sci/sci.h | 9 ++-- 30 files changed, 106 insertions(+), 382 deletions(-) delete mode 100644 engines/sci/graphics/gui.cpp delete mode 100644 engines/sci/graphics/gui.h delete mode 100644 engines/sci/graphics/gui32.cpp delete mode 100644 engines/sci/graphics/gui32.h diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 4c8d588fa0..8fc49fa396 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -43,12 +43,11 @@ #include "sci/sound/music.h" #endif #include "sci/sound/drivers/mididriver.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/gui32.h" #include "sci/graphics/cursor.h" #include "sci/graphics/screen.h" #include "sci/graphics/paint.h" #include "sci/graphics/paint16.h" +#include "sci/graphics/paint32.h" #include "sci/graphics/palette.h" #include "sci/parser/vocabulary.h" @@ -1299,7 +1298,11 @@ bool Console::cmdDrawRobot(int argc, const char **argv) { uint16 resourceId = atoi(argv[1]); - _engine->_gui32->drawRobot(resourceId); + if (_engine->_gfxPaint32) { + _engine->_gfxPaint32->debugDrawRobot(resourceId); + } else { + DebugPrintf("command not available in non-sci32 games"); + } return true; } #endif diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 0a510dabbb..b42e0c4144 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -30,8 +30,6 @@ #include "sci/engine/segment.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/gui32.h" #include "sci/graphics/frameout.h" #include "sci/graphics/screen.h" diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index da014cd917..c5a37dde94 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -31,8 +31,6 @@ #include "sci/console.h" #include "sci/debug.h" // for g_debug_simulated_key #include "sci/event.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/gui32.h" #include "sci/graphics/coordadjuster.h" #include "sci/graphics/cursor.h" diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 3e74bb206a..c7126127ca 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -37,8 +37,6 @@ #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/engine/kernel.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/gui32.h" #include "sci/graphics/animate.h" #include "sci/graphics/cache.h" #include "sci/graphics/compare.h" @@ -634,7 +632,8 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); - if (!g_sci->_gui) + // Exit for SCI32 for now + if (!g_sci->_gfxPaint16) return s->r_acc; switch (operation) { diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp index a5f2f01297..13937c2f61 100644 --- a/engines/sci/engine/kmenu.cpp +++ b/engines/sci/engine/kmenu.cpp @@ -27,7 +27,6 @@ #include "sci/resource.h" #include "sci/engine/state.h" #include "sci/engine/kernel.h" -#include "sci/graphics/gui.h" #include "sci/graphics/cursor.h" #include "sci/graphics/menu.h" diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index d836ec4a7f..ef6088b6d5 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -31,7 +31,6 @@ #include "sci/engine/state.h" #include "sci/engine/kernel.h" #include "sci/engine/gc.h" -#include "sci/graphics/gui.h" #include "sci/graphics/maciconbar.h" namespace Sci { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 97872253cb..256a1aef03 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -39,7 +39,6 @@ #include "sci/engine/selector.h" #include "sci/engine/vm_types.h" #include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS -#include "sci/graphics/gui.h" #include "sci/graphics/ports.h" #include "sci/sound/audio.h" #ifdef USE_OLD_MUSIC_FUNCTIONS @@ -49,10 +48,6 @@ #include "sci/sound/music.h" #endif -#ifdef ENABLE_SCI32 -#include "sci/graphics/gui32.h" -#endif - #include "gui/message.h" namespace Sci { diff --git a/engines/sci/graphics/cache.h b/engines/sci/graphics/cache.h index 16ab1916d4..2e9a345230 100644 --- a/engines/sci/graphics/cache.h +++ b/engines/sci/graphics/cache.h @@ -26,8 +26,6 @@ #ifndef SCI_GRAPHICS_CACHE_H #define SCI_GRAPHICS_CACHE_H -#include "sci/graphics/gui.h" - #include "common/hashmap.h" namespace Sci { diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h index 348d5ef723..be461cdc5b 100644 --- a/engines/sci/graphics/compare.h +++ b/engines/sci/graphics/compare.h @@ -26,8 +26,6 @@ #ifndef SCI_GRAPHICS_GFX_H #define SCI_GRAPHICS_GFX_H -#include "sci/graphics/gui.h" - #include "common/hashmap.h" namespace Sci { diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 36c02af278..8015b9879f 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -44,7 +44,10 @@ struct FrameoutEntry { typedef Common::List FrameoutList; class GfxCache; +class GfxCoordAdjuster32; class GfxPaint32; +class GfxPalette; +class GfxScreen; /** * Frameout class, kFrameout and relevant functions for SCI32 games */ diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp deleted file mode 100644 index a450870079..0000000000 --- a/engines/sci/graphics/gui.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/timer.h" -#include "common/util.h" - -#include "sci/sci.h" -#include "sci/debug.h" // for g_debug_sleeptime_factor -#include "sci/event.h" -#include "sci/engine/state.h" -#include "sci/engine/selector.h" -#include "sci/graphics/gui.h" -#include "sci/graphics/screen.h" -#include "sci/graphics/palette.h" -#include "sci/graphics/cursor.h" -#include "sci/graphics/ports.h" -#include "sci/graphics/paint16.h" -#include "sci/graphics/cache.h" -#include "sci/graphics/compare.h" -#include "sci/graphics/coordadjuster.h" -#include "sci/graphics/animate.h" -#include "sci/graphics/controls.h" -#include "sci/graphics/menu.h" -#include "sci/graphics/text16.h" -#include "sci/graphics/transitions.h" -#include "sci/graphics/view.h" -#include "sci/sound/audio.h" - -namespace Sci { - -SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor, GfxPorts *ports, AudioPlayer *audio) - : _s(state), _screen(screen), _palette(palette), _cache(cache), _cursor(cursor), _ports(ports), _audio(audio) { - - // FIXME/TODO: If SciGui inits all the stuff below, then it should *own* it, - // not SciEngine. Conversely, if we want SciEngine to own this stuff, - // then it should init it! - _coordAdjuster = new GfxCoordAdjuster16(_ports); - g_sci->_gfxCoordAdjuster = _coordAdjuster; - _cursor->init(_coordAdjuster, g_sci->getEventManager()); - _compare = new GfxCompare(_s->_segMan, g_sci->getKernel(), _cache, _screen, _coordAdjuster); - g_sci->_gfxCompare = _compare; - _transitions = new GfxTransitions(this, _screen, _palette, g_sci->getResMan()->isVGA()); - _paint16 = new GfxPaint16(g_sci->getResMan(), _s->_segMan, g_sci->getKernel(), this, _cache, _ports, _coordAdjuster, _screen, _palette, _transitions, _audio); - g_sci->_gfxPaint = _paint16; - g_sci->_gfxPaint16 = _paint16; - _animate = new GfxAnimate(_s, _cache, _ports, _paint16, _screen, _palette, _cursor, _transitions); - g_sci->_gfxAnimate = _animate; - _text16 = new GfxText16(g_sci->getResMan(), _cache, _ports, _paint16, _screen); - g_sci->_gfxText16 = _text16; - _controls = new GfxControls(_s->_segMan, _ports, _paint16, _text16, _screen); - g_sci->_gfxControls = _controls; - _menu = new GfxMenu(g_sci->getEventManager(), _s->_segMan, this, _ports, _paint16, _text16, _screen, _cursor); - g_sci->_gfxMenu = _menu; -} - -SciGui::~SciGui() { - delete _menu; - delete _controls; - delete _text16; - delete _animate; - delete _paint16; - delete _transitions; - delete _compare; - delete _coordAdjuster; -} - -} // End of namespace Sci diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h deleted file mode 100644 index 26028e0cc5..0000000000 --- a/engines/sci/graphics/gui.h +++ /dev/null @@ -1,76 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_GRAPHICS_GUI_H -#define SCI_GRAPHICS_GUI_H - -#include "sci/graphics/helpers.h" - -namespace Sci { - -class GfxScreen; -class GfxPalette; -class GfxCursor; -class GfxCache; -class GfxCompare; -class GfxCoordAdjuster16; -class GfxPorts; -class GfxPaint16; -class GfxAnimate; -class GfxControls; -class GfxMenu; -class GfxText16; -class GfxTransitions; - -class SciGui { -public: - SciGui(EngineState *s, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor, GfxPorts *ports, AudioPlayer *audio); - virtual ~SciGui(); - -protected: - GfxCursor *_cursor; - EngineState *_s; - GfxScreen *_screen; - GfxPalette *_palette; - GfxCache *_cache; - GfxCoordAdjuster16 *_coordAdjuster; - GfxCompare *_compare; - GfxPorts *_ports; - GfxPaint16 *_paint16; - -private: - AudioPlayer *_audio; - GfxAnimate *_animate; - GfxControls *_controls; - GfxMenu *_menu; - GfxText16 *_text16; - GfxTransitions *_transitions; - - bool _usesOldGfxFunctions; -}; - -} // End of namespace Sci - -#endif diff --git a/engines/sci/graphics/gui32.cpp b/engines/sci/graphics/gui32.cpp deleted file mode 100644 index c953ed7f70..0000000000 --- a/engines/sci/graphics/gui32.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/timer.h" -#include "common/util.h" - -#include "sci/sci.h" -#include "sci/event.h" -#include "sci/engine/state.h" -#include "sci/engine/selector.h" -#include "sci/graphics/gui32.h" -#include "sci/graphics/screen.h" -#include "sci/graphics/palette.h" -#include "sci/graphics/cursor.h" -#include "sci/graphics/cache.h" -#include "sci/graphics/compare.h" -#include "sci/graphics/coordadjuster.h" -#include "sci/graphics/frameout.h" -#include "sci/graphics/paint32.h" -#include "sci/graphics/picture.h" -#include "sci/graphics/robot.h" -#include "sci/graphics/view.h" - -namespace Sci { - -SciGui32::SciGui32(SegManager *segMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor) - : _screen(screen), _palette(palette), _cache(cache), _cursor(cursor) { - - _coordAdjuster = new GfxCoordAdjuster32(segMan); - g_sci->_gfxCoordAdjuster = _coordAdjuster; - _cursor->init(_coordAdjuster, event); - _compare = new GfxCompare(segMan, g_sci->getKernel(), _cache, _screen, _coordAdjuster); - g_sci->_gfxCompare = _compare; - _paint32 = new GfxPaint32(g_sci->getResMan(), segMan, g_sci->getKernel(), _coordAdjuster, _cache, _screen, _palette); - g_sci->_gfxPaint = _paint32; - _frameout = new GfxFrameout(segMan, g_sci->getResMan(), _coordAdjuster, _cache, _screen, _palette, _paint32); - g_sci->_gfxFrameout = _frameout; -} - -SciGui32::~SciGui32() { - delete _frameout; - delete _paint32; - delete _compare; - delete _coordAdjuster; -} - -void SciGui32::drawRobot(GuiResourceId robotId) { - Robot *test = new Robot(g_sci->getResMan(), _screen, robotId); - test->draw(); - delete test; -} - -} // End of namespace Sci diff --git a/engines/sci/graphics/gui32.h b/engines/sci/graphics/gui32.h deleted file mode 100644 index 2be37d0aaf..0000000000 --- a/engines/sci/graphics/gui32.h +++ /dev/null @@ -1,64 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_GRAPHICS_GUI32_H -#define SCI_GRAPHICS_GUI32_H - -#include "sci/graphics/helpers.h" - -namespace Sci { - -class GfxCursor; -class GfxScreen; -class GfxPalette; -class GfxCache; -class GfxCoordAdjuster32; -class GfxCompare; -class GfxFrameout; -class GfxPaint32; - -class SciGui32 { -public: - SciGui32(SegManager *segMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, GfxCache *cache, GfxCursor *cursor); - ~SciGui32(); - - void drawRobot(GuiResourceId robotId); - -protected: - GfxCursor *_cursor; - GfxScreen *_screen; - GfxPalette *_palette; - GfxCache *_cache; - GfxCoordAdjuster32 *_coordAdjuster; - GfxCompare *_compare; - GfxFrameout *_frameout; - GfxPaint32 *_paint32; - -private: -}; - -} // End of namespace Sci - -#endif diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index ac4f1c0653..5ca4d8176b 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -31,7 +31,6 @@ #include "sci/event.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" -#include "sci/graphics/gui.h" #include "sci/graphics/ports.h" #include "sci/graphics/paint16.h" #include "sci/graphics/animate.h" @@ -43,8 +42,8 @@ namespace Sci { -GfxMenu::GfxMenu(EventManager *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor) - : _event(event), _segMan(segMan), _gui(gui), _ports(ports), _paint16(paint16), _text16(text16), _screen(screen), _cursor(cursor) { +GfxMenu::GfxMenu(EventManager *event, SegManager *segMan, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor) + : _event(event), _segMan(segMan), _ports(ports), _paint16(paint16), _text16(text16), _screen(screen), _cursor(cursor) { _menuSaveHandle = NULL_REG; _barSaveHandle = NULL_REG; diff --git a/engines/sci/graphics/menu.h b/engines/sci/graphics/menu.h index ec344961de..b72d518977 100644 --- a/engines/sci/graphics/menu.h +++ b/engines/sci/graphics/menu.h @@ -83,7 +83,7 @@ typedef Common::List GuiMenuItemList; */ class GfxMenu { public: - GfxMenu(EventManager *event, SegManager *segMan, SciGui *gui, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor); + GfxMenu(EventManager *event, SegManager *segMan, GfxPorts *ports, GfxPaint16 *paint16, GfxText16 *text16, GfxScreen *screen, GfxCursor *cursor); ~GfxMenu(); void reset(); @@ -113,7 +113,6 @@ private: EventManager *_event; SegManager *_segMan; - SciGui *_gui; GfxPorts *_ports; GfxPaint16 *_paint16; GfxText16 *_text16; diff --git a/engines/sci/graphics/paint.h b/engines/sci/graphics/paint.h index f1342d55e5..75a17461d4 100644 --- a/engines/sci/graphics/paint.h +++ b/engines/sci/graphics/paint.h @@ -26,8 +26,6 @@ #ifndef SCI_GRAPHICS_PAINT_H #define SCI_GRAPHICS_PAINT_H -#include "sci/graphics/gui.h" - #include "common/hashmap.h" namespace Sci { diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 103da594e6..a52fd304e2 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -48,8 +48,8 @@ namespace Sci { -GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio) - : _resMan(resMan), _segMan(segMan), _kernel(kernel), _gui(gui), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions), _audio(audio) { +GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio) + : _resMan(resMan), _segMan(segMan), _kernel(kernel), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions), _audio(audio) { } GfxPaint16::~GfxPaint16() { @@ -579,7 +579,7 @@ reg_t GfxPaint16::kernelPortraitLoad(Common::String resourceName) { } void GfxPaint16::kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { - Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), _gui, _screen, _palette, _audio, resourceName); + Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), _screen, _palette, _audio, resourceName); // TODO: cache portraits // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates // on kDrawCel, yeah this whole stuff makes sense) diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 3b2ffd6fc2..f54b8059c1 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -26,7 +26,6 @@ #ifndef SCI_GRAPHICS_PAINT16_H #define SCI_GRAPHICS_PAINT16_H -#include "sci/graphics/gui.h" #include "sci/graphics/paint.h" #include "common/hashmap.h" @@ -45,7 +44,7 @@ class GfxView; */ class GfxPaint16 : public GfxPaint { public: - GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, SciGui *gui, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio); + GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio); ~GfxPaint16(); void init(GfxAnimate *animate, GfxText16 *text16); @@ -100,7 +99,6 @@ private: SegManager *_segMan; Kernel *_kernel; AudioPlayer *_audio; - SciGui *_gui; GfxAnimate *_animate; GfxCache *_cache; GfxPorts *_ports; diff --git a/engines/sci/graphics/paint32.cpp b/engines/sci/graphics/paint32.cpp index 711efc9816..9b24da413b 100644 --- a/engines/sci/graphics/paint32.cpp +++ b/engines/sci/graphics/paint32.cpp @@ -38,6 +38,7 @@ #include "sci/graphics/view.h" #include "sci/graphics/screen.h" #include "sci/graphics/palette.h" +#include "sci/graphics/robot.h" namespace Sci { @@ -79,4 +80,10 @@ void GfxPaint32::kernelGraphDrawLine(Common::Point startPoint, Common::Point end _screen->drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, color, priority, control); } +void GfxPaint32::debugDrawRobot(GuiResourceId robotId) { + GfxRobot *test = new GfxRobot(g_sci->getResMan(), _screen, robotId); + test->draw(); + delete test; +} + } // End of namespace Sci diff --git a/engines/sci/graphics/paint32.h b/engines/sci/graphics/paint32.h index f4d6340361..a048d7f307 100644 --- a/engines/sci/graphics/paint32.h +++ b/engines/sci/graphics/paint32.h @@ -26,7 +26,6 @@ #ifndef SCI_GRAPHICS_PAINT32_H #define SCI_GRAPHICS_PAINT32_H -#include "sci/graphics/gui.h" #include "sci/graphics/paint.h" #include "common/hashmap.h" @@ -49,6 +48,8 @@ public: void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle); void kernelGraphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control); + void debugDrawRobot(GuiResourceId robotId); + private: ResourceManager *_resMan; SegManager *_segMan; diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index a85d9a3b06..f7d6f4de0a 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -31,7 +31,6 @@ #include "sci/sci.h" #include "sci/event.h" #include "sci/engine/state.h" -#include "sci/graphics/gui.h" #include "sci/graphics/screen.h" #include "sci/graphics/palette.h" #include "sci/graphics/portrait.h" @@ -39,8 +38,8 @@ namespace Sci { -Portrait::Portrait(ResourceManager *resMan, EventManager *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName) - : _resMan(resMan), _event(event), _gui(gui), _screen(screen), _palette(palette), _audio(audio), _resourceName(resourceName) { +Portrait::Portrait(ResourceManager *resMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName) + : _resMan(resMan), _event(event), _screen(screen), _palette(palette), _audio(audio), _resourceName(resourceName) { init(); } diff --git a/engines/sci/graphics/portrait.h b/engines/sci/graphics/portrait.h index 2f23ced913..7da9425c9d 100644 --- a/engines/sci/graphics/portrait.h +++ b/engines/sci/graphics/portrait.h @@ -42,7 +42,7 @@ struct PortraitBitmap { */ class Portrait { public: - Portrait(ResourceManager *resMan, EventManager *event, SciGui *gui, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName); + Portrait(ResourceManager *resMan, EventManager *event, GfxScreen *screen, GfxPalette *palette, AudioPlayer *audio, Common::String resourceName); ~Portrait(); void setupAudio(uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq); @@ -57,7 +57,6 @@ private: ResourceManager *_resMan; EventManager *_event; - SciGui *_gui; GfxPalette *_palette; GfxScreen *_screen; AudioPlayer *_audio; diff --git a/engines/sci/graphics/robot.cpp b/engines/sci/graphics/robot.cpp index 2f711eb58a..d926e037f4 100644 --- a/engines/sci/graphics/robot.cpp +++ b/engines/sci/graphics/robot.cpp @@ -31,17 +31,17 @@ namespace Sci { #ifdef ENABLE_SCI32 -Robot::Robot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId resourceId) +GfxRobot::GfxRobot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId resourceId) : _resMan(resMan), _screen(screen), _resourceId(resourceId) { assert(resourceId != -1); initData(resourceId); } -Robot::~Robot() { +GfxRobot::~GfxRobot() { _resMan->unlockResource(_resource); } -void Robot::initData(GuiResourceId resourceId) { +void GfxRobot::initData(GuiResourceId resourceId) { _resource = _resMan->findResource(ResourceId(kResourceTypeRobot, resourceId), true); if (!_resource) { error("robot resource %d not found", resourceId); @@ -158,7 +158,7 @@ void Robot::initData(GuiResourceId resourceId) { // TODO: just trying around in here... -void Robot::draw() { +void GfxRobot::draw() { byte *bitmapData = _resourceData + ROBOT_FILE_STARTOFDATA; int x, y; //int frame; diff --git a/engines/sci/graphics/robot.h b/engines/sci/graphics/robot.h index 009b76a91c..80dae95f95 100644 --- a/engines/sci/graphics/robot.h +++ b/engines/sci/graphics/robot.h @@ -31,10 +31,10 @@ namespace Sci { #define ROBOT_FILE_STARTOFDATA 58 #ifdef ENABLE_SCI32 -class Robot { +class GfxRobot { public: - Robot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId resourceId); - ~Robot(); + GfxRobot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId resourceId); + ~GfxRobot(); void draw(); diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 0bb1a87fc2..9f8d4d1164 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -31,15 +31,14 @@ #include "sci/sci.h" #include "sci/engine/state.h" -#include "sci/graphics/gui.h" #include "sci/graphics/screen.h" #include "sci/graphics/palette.h" #include "sci/graphics/transitions.h" namespace Sci { -GfxTransitions::GfxTransitions(SciGui *gui, GfxScreen *screen, GfxPalette *palette, bool isVGA) - : _gui(gui), _screen(screen), _palette(palette), _isVGA(isVGA) { +GfxTransitions::GfxTransitions(GfxScreen *screen, GfxPalette *palette, bool isVGA) + : _screen(screen), _palette(palette), _isVGA(isVGA) { init(); } diff --git a/engines/sci/graphics/transitions.h b/engines/sci/graphics/transitions.h index 9a1a412d5b..788cefabca 100644 --- a/engines/sci/graphics/transitions.h +++ b/engines/sci/graphics/transitions.h @@ -65,7 +65,7 @@ class Screen; */ class GfxTransitions { public: - GfxTransitions(SciGui *gui, GfxScreen *screen, GfxPalette *palette, bool isVGA); + GfxTransitions(GfxScreen *screen, GfxPalette *palette, bool isVGA); ~GfxTransitions(); void setup(int16 number, bool blackoutFlag); @@ -92,7 +92,6 @@ private: void diagonalRollToCenter(bool blackoutFlag); void updateScreenAndWait(int msec); - SciGui *_gui; GfxScreen *_screen; GfxPalette *_palette; diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 4860ac7c2f..792522f153 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -43,7 +43,6 @@ MODULE_OBJS := \ graphics/cursor.o \ graphics/font.o \ graphics/fontsjis.o \ - graphics/gui.o \ graphics/maciconbar.o \ graphics/menu.o \ graphics/paint.o \ @@ -78,7 +77,6 @@ ifdef ENABLE_SCI32 MODULE_OBJS += \ engine/kernel32.o \ graphics/frameout.o \ - graphics/gui32.o \ graphics/paint32.o \ graphics/robot.o \ video/vmd_decoder.o diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 692928f12c..4af6bc7b43 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -44,18 +44,24 @@ #include "sci/sound/audio.h" #include "sci/sound/soundcmd.h" -#include "sci/graphics/gui.h" +#include "sci/graphics/animate.h" +#include "sci/graphics/cache.h" +#include "sci/graphics/compare.h" +#include "sci/graphics/controls.h" +#include "sci/graphics/coordadjuster.h" +#include "sci/graphics/cursor.h" #include "sci/graphics/maciconbar.h" #include "sci/graphics/menu.h" #include "sci/graphics/paint16.h" +#include "sci/graphics/paint32.h" #include "sci/graphics/ports.h" #include "sci/graphics/palette.h" -#include "sci/graphics/cursor.h" #include "sci/graphics/screen.h" -#include "sci/graphics/cache.h" +#include "sci/graphics/text16.h" +#include "sci/graphics/transitions.h" #ifdef ENABLE_SCI32 -#include "sci/graphics/gui32.h" +#include "sci/graphics/frameout.h" #endif namespace Sci { @@ -183,9 +189,29 @@ Common::Error SciEngine::run() { if ((getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) upscaledHires = GFX_SCREEN_UPSCALED_640x400; + // Reset all graphics objects + _gfxAnimate = 0; + _gfxCache = 0; + _gfxCompare = 0; + _gfxControls = 0; + _gfxCoordAdjuster = 0; + _gfxCursor = 0; + _gfxMacIconBar = 0; + _gfxMenu = 0; + _gfxPaint = 0; + _gfxPaint16 = 0; + _gfxPalette = 0; + _gfxPorts = 0; + _gfxScreen = 0; + _gfxText16 = 0; + _gfxTransitions = 0; +#ifdef ENABLE_SCI32 + _gfxFrameout = 0; + _gfxPaint32 = 0; +#endif + // Initialize graphics-related parts - // invokes initGraphics() if (_resMan->detectHires()) _gfxScreen = new GfxScreen(_resMan, 640, 480); else @@ -222,23 +248,30 @@ Common::Error SciEngine::run() { #ifdef ENABLE_SCI32 if (getSciVersion() >= SCI_VERSION_2) { - _gfxAnimate = 0; - _gfxControls = 0; - _gfxMenu = 0; - _gfxPaint16 = 0; - _gfxPorts = 0; - _gfxText16 = 0; - _gui = 0; - _gui32 = new SciGui32(_gamestate->_segMan, _eventMan, _gfxScreen, _gfxPalette, _gfxCache, _gfxCursor); + // SCI32 graphic objects creation + _gfxCoordAdjuster = new GfxCoordAdjuster32(segMan); + _gfxCursor->init(_gfxCoordAdjuster, _eventMan); + _gfxCompare = new GfxCompare(segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxPaint32 = new GfxPaint32(g_sci->getResMan(), segMan, g_sci->getKernel(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette); + _gfxPaint = _gfxPaint32; + _gfxFrameout = new GfxFrameout(segMan, g_sci->getResMan(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32); } else { #endif + // SCI0-SCI1.1 graphic objects creation _gfxPorts = new GfxPorts(segMan, _gfxScreen); - _gui = new SciGui(_gamestate, _gfxScreen, _gfxPalette, _gfxCache, _gfxCursor, _gfxPorts, _audio); -#ifdef ENABLE_SCI32 - _gui32 = 0; - _gfxFrameout = 0; + _gfxCoordAdjuster = new GfxCoordAdjuster16(_gfxPorts); + _gfxCursor->init(_gfxCoordAdjuster, g_sci->getEventManager()); + _gfxCompare = new GfxCompare(segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxTransitions = new GfxTransitions(_gfxScreen, _gfxPalette, g_sci->getResMan()->isVGA()); + _gfxPaint16 = new GfxPaint16(g_sci->getResMan(), segMan, g_sci->getKernel(), _gfxCache, _gfxPorts, _gfxCoordAdjuster, _gfxScreen, _gfxPalette, _gfxTransitions, _audio); + _gfxPaint = _gfxPaint16; + _gfxAnimate = new GfxAnimate(_gamestate, _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen, _gfxPalette, _gfxCursor, _gfxTransitions); + _gfxText16 = new GfxText16(g_sci->getResMan(), _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen); + _gfxControls = new GfxControls(segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen); + _gfxMenu = new GfxMenu(g_sci->getEventManager(), segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen, _gfxCursor); - g_sci->_gfxMenu->reset(); + _gfxMenu->reset(); +#ifdef ENABLE_SCI32 } #endif @@ -272,15 +305,23 @@ Common::Error SciEngine::run() { ConfMan.flushToDisk(); delete _gamestate->_soundCmd; - delete _gui; #ifdef ENABLE_SCI32 - delete _gui32; + delete _gfxFrameout; #endif + delete _gfxMenu; + delete _gfxControls; + delete _gfxText16; + delete _gfxAnimate; + delete _gfxPaint; + delete _gfxTransitions; + delete _gfxCompare; + delete _gfxCoordAdjuster; delete _gfxPorts; delete _gfxCache; delete _gfxPalette; delete _gfxCursor; delete _gfxScreen; + delete _eventMan; delete segMan; delete _gamestate; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 6f6a6b5dd1..7d04840759 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -60,15 +60,16 @@ class GfxCompare; class GfxControls; class GfxCoordAdjuster; class GfxCursor; +class GfxMacIconBar; class GfxMenu; class GfxPaint; class GfxPaint16; +class GfxPaint32; class GfxPalette; class GfxPorts; class GfxScreen; class GfxText16; -class SciGui; -class GfxMacIconBar; +class GfxTransitions; #ifdef ENABLE_SCI32 class SciGui32; @@ -207,14 +208,14 @@ public: GfxPalette *_gfxPalette; GfxPaint *_gfxPaint; GfxPaint16 *_gfxPaint16; // Painting in 16-bit gfx + GfxPaint32 *_gfxPaint32; // Painting in 32-bit gfx GfxPorts *_gfxPorts; // Port managment for 16-bit gfx GfxScreen *_gfxScreen; GfxText16 *_gfxText16; - SciGui *_gui; /* Currently active Gui */ + GfxTransitions *_gfxTransitions; // transitions between screens for 16-bit gfx GfxMacIconBar *_gfxMacIconBar; // Mac Icon Bar manager #ifdef ENABLE_SCI32 - SciGui32 *_gui32; // GUI for SCI32 games GfxFrameout *_gfxFrameout; // kFrameout and the like for 32-bit gfx #endif -- cgit v1.2.3 From 365973542c1b5abbf0d9320d85115f0ff24c3bbf Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 15:50:37 +0000 Subject: Add TranslationManager::getTranslation variant taking/returning a Common::String (should fix WinCE build) svn-id: r49861 --- common/translation.cpp | 4 ++++ common/translation.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/common/translation.cpp b/common/translation.cpp index 454bbaa402..7346441d27 100755 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -108,6 +108,10 @@ const char *TranslationManager::getTranslation(const char *message) { return po2c_gettext(message); } +String TranslationManager::getTranslation(const String &message) { + return po2c_gettext(message.c_str()); +} + #ifdef TERMCONV bool TranslationManager::convert(const char *message) { // Preparing conversion origin diff --git a/common/translation.h b/common/translation.h index 623a7ccd31..7be21df60f 100755 --- a/common/translation.h +++ b/common/translation.h @@ -100,6 +100,8 @@ public: */ const char *getTranslation(const char *message); + String getTranslation(const String &message); + /** * Converts the message into the terminal character set (which may be * different than the GUI's "native" one. -- cgit v1.2.3 From 90408a59cca70c9890f7b32bc0788f8c0418bad7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 16:36:09 +0000 Subject: Don't adjust the object's coordinates if the object does not belong to a plane in kIsOnMe(). It's now possible to start the interactive part of the Phantasmagoria 1 demo svn-id: r49862 --- engines/sci/engine/kernel32.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index b42e0c4144..a077f110cf 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -834,22 +834,24 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { // Get the object's plane reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); - uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); - uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); - uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); - uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); - planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; - planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; - - // Adjust the bounding rectangle of the object by the object's actual X, Y coordinates - uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY); - itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX); - itemY += planeTop; - itemX += planeLeft; + if (!planeObject.isNull()) { + uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); + uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); + uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; + planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + + // Adjust the bounding rectangle of the object by the object's actual X, Y coordinates + itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY); + itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX); + itemY += planeTop; + itemX += planeLeft; - nsRect.translate(itemX, itemY); + nsRect.translate(itemX, itemY); + } //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); -- cgit v1.2.3 From b8d9cf27737f13937b5950b72d7911cf5281e7c5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 16:50:10 +0000 Subject: SCI: Pass resman to scanSource() methods svn-id: r49863 --- engines/sci/resource.cpp | 24 +++++++++--------------- engines/sci/resource_intern.h | 12 ++++++------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 24e92060e2..e167d50c1a 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -437,15 +437,14 @@ void ResourceSource::loadResource(Resource *res) { fileStream->seek(res->_fileOffset, SEEK_SET); int error = res->decompress(fileStream); - - if (_resourceFile) - delete fileStream; - if (error) { warning("Error %d occurred while reading %s from resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); res->unalloc(); } + + if (_resourceFile) + delete fileStream; } Resource *ResourceManager::testResource(ResourceId id) { @@ -623,13 +622,12 @@ void ResourceManager::scanNewSources() { if (!source->_scanned) { source->_scanned = true; - source->scanSource(); + source->scanSource(this); } } } -void DirectoryResourceSource::scanSource() { - ResourceManager *resMan = g_sci->getResMan(); +void DirectoryResourceSource::scanSource(ResourceManager *resMan) { resMan->readResourcePatches(); // We can't use getSciVersion() at this point, thus using _volVersion @@ -639,21 +637,18 @@ void DirectoryResourceSource::scanSource() { resMan->readWaveAudioPatches(); } -void ExtMapResourceSource::scanSource() { - ResourceManager *resMan = g_sci->getResMan(); +void ExtMapResourceSource::scanSource(ResourceManager *resMan) { if (resMan->_mapVersion < kResVersionSci1Late) resMan->readResourceMapSCI0(this); else resMan->readResourceMapSCI1(this); } -void ExtAudioMapResourceSource::scanSource() { - ResourceManager *resMan = g_sci->getResMan(); +void ExtAudioMapResourceSource::scanSource(ResourceManager *resMan) { resMan->readAudioMapSCI1(this); } -void IntMapResourceSource::scanSource() { - ResourceManager *resMan = g_sci->getResMan(); +void IntMapResourceSource::scanSource(ResourceManager *resMan) { resMan->readAudioMapSCI11(this); } @@ -1441,8 +1436,7 @@ static uint32 resTypeToMacTag(ResourceType type) { return 0; } -void MacResourceForkResourceSource::scanSource() { - ResourceManager *resMan = g_sci->getResMan(); +void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { if (!_macResMan->open(getLocationName().c_str())) error("%s is not a valid Mac resource fork", getLocationName().c_str()); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 8cb13bd311..7993fc303e 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -78,7 +78,7 @@ public: /** * Scan this source for TODO. */ - virtual void scanSource() {} + virtual void scanSource(ResourceManager *resMan) {} /** * Load a resource. @@ -95,7 +95,7 @@ class DirectoryResourceSource : public ResourceSource { public: DirectoryResourceSource(const Common::String &name) : ResourceSource(kSourceDirectory, name) {} - virtual void scanSource(); + virtual void scanSource(ResourceManager *resMan); }; class PatchResourceSource : public ResourceSource { @@ -131,7 +131,7 @@ public: : ResourceSource(kSourceExtMap, name, volNum, resFile) { } - virtual void scanSource(); + virtual void scanSource(ResourceManager *resMan); }; class IntMapResourceSource : public ResourceSource { @@ -140,7 +140,7 @@ public: : ResourceSource(kSourceIntMap, name, volNum) { } - virtual void scanSource(); + virtual void scanSource(ResourceManager *resMan); }; class AudioVolumeResourceSource : public VolumeResourceSource { @@ -162,7 +162,7 @@ public: : ResourceSource(kSourceExtAudioMap, name, volNum) { } - virtual void scanSource(); + virtual void scanSource(ResourceManager *resMan); }; class WaveResourceSource : public ResourceSource { @@ -183,7 +183,7 @@ public: MacResourceForkResourceSource(const Common::String &name, int volNum); ~MacResourceForkResourceSource(); - virtual void scanSource(); + virtual void scanSource(ResourceManager *resMan); virtual void loadResource(Resource *res); }; -- cgit v1.2.3 From 953b1324a3dd7c4eca5446fa4ab128960178173c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 16:50:28 +0000 Subject: Another attempt to fix WinCE compilation svn-id: r49864 --- gui/KeysDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp index 85ee53b72e..4162935e45 100644 --- a/gui/KeysDialog.cpp +++ b/gui/KeysDialog.cpp @@ -25,6 +25,7 @@ #include "gui/KeysDialog.h" #include "gui/Actions.h" +#include "common/translation.h" #include #ifdef _WIN32_WCE -- cgit v1.2.3 From cf38303497e00744fbd7c95bbd711d25cac1c6c4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 15 Jun 2010 16:56:23 +0000 Subject: Don't disable kPalVary for SCI32, the semantics have remained the same. svn-id: r49865 --- engines/sci/engine/kgraphics.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index c7126127ca..f56c5bb5e1 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -632,10 +632,6 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); - // Exit for SCI32 for now - if (!g_sci->_gfxPaint16) - return s->r_acc; - switch (operation) { case 0: { // Init GuiResourceId paletteId; -- cgit v1.2.3 From 831e626ccd488df9e8c3d534bf129c48e66f18e0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 16:58:03 +0000 Subject: SDL: only change mouse cursor, when mouse is currently within our window, also enable mouse position changing again for SCI svn-id: r49866 --- backends/platform/sdl/graphics.cpp | 4 ++++ engines/sci/graphics/cursor.cpp | 9 +-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 83a256f568..721cc54c90 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -1377,6 +1377,10 @@ void OSystem_SDL::setMousePos(int x, int y) { void OSystem_SDL::warpMouse(int x, int y) { int y1 = y; + // Don't change mouse position, when mouse is outside of our window (in case of windowed mode) + if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS)) + return; + if (_videoMode.aspectRatioCorrection && !_overlayVisible) y1 = real2Aspect(y); diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 14ab3fcdaf..38e9d389a6 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -219,6 +219,7 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu // TODO: What about the 2000 resources? Inventory items? How to handle? // TODO: What games does this work for? At least it does for KQ6. // TODO: Stop asking rhetorical questions. + // TODO: It was fred all along! Resource *resource = _resMan->findResource(ResourceId(kResourceTypeCursor, 1000 + celNum), false); @@ -258,16 +259,12 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu } void GfxCursor::setPosition(Common::Point pos) { - // This code has been disabled because it's annoying in windowed mode. The engine shouldn't move - // the mouse cursor whenever it wants, it interferes with other programs -#if 0 if (!_upscaledHires) { g_system->warpMouse(pos.x, pos.y); } else { _screen->adjustToUpscaledCoordinates(pos.y, pos.x); g_system->warpMouse(pos.x, pos.y); } -#endif } Common::Point GfxCursor::getPosition() { @@ -293,9 +290,6 @@ Common::Point GfxCursor::getPosition() { } void GfxCursor::refreshPosition() { - // This code has been disabled because it's annoying in windowed mode. The engine shouldn't move - // the mouse cursor whenever it wants, it interferes with other programs -#if 0 bool clipped = false; Common::Point mousePoint = getPosition(); @@ -318,7 +312,6 @@ void GfxCursor::refreshPosition() { // FIXME: Do this only when mouse is grabbed? if (clipped) setPosition(mousePoint); -#endif } void GfxCursor::kernelSetMoveZone(Common::Rect zone) { -- cgit v1.2.3 From cf6a29e8623be7ae9575ee34fa42e1c2c2d29a3b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:13:18 +0000 Subject: Some documentation cleanup to ease readability. svn-id: r49867 --- sound/audiostream.h | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/sound/audiostream.h b/sound/audiostream.h index edf517b003..64ad128931 100644 --- a/sound/audiostream.h +++ b/sound/audiostream.h @@ -129,6 +129,7 @@ public: /** * Returns number of loops the stream has played. + * * @param numLoops number of loops to play, 0 - infinite */ uint getCompleteIterations() const { return _completeIterations; } @@ -148,8 +149,8 @@ private: * overhead down, when the code does not require any functionality only offered * by LoopingAudioStream. * - * @param stream Stream to loop (will be automatically destroyed, when the looping is done) - * @param loops How often to loop (0 = infinite) + * @param stream Stream to loop (will be automatically destroyed, when the looping is done) + * @param loops How often to loop (0 = infinite) * @return A new AudioStream, which offers the desired functionality. */ AudioStream *makeLoopingAudioStream(RewindableAudioStream *stream, uint loops); @@ -165,7 +166,8 @@ public: * Tries to load a file by trying all available formats. * In case of an error, the file handle will be closed, but deleting * it is still the responsibility of the caller. - * @param basename a filename without an extension + * + * @param basename a filename without an extension * @return an SeekableAudioStream ready to use in case of success; * NULL in case of an error (e.g. invalid/nonexisting file) */ @@ -211,9 +213,9 @@ public: * by LoopingAudioStream. * * @param stream Stream to loop (will be automatically destroyed, when the looping is done) - * @param start Starttime of the stream interval to be looped - * @param end End of the stream interval to be looped (a zero time, means till end) - * @param loops How often to loop (0 = infinite) + * @param start Starttime of the stream interval to be looped + * @param end End of the stream interval to be looped (a zero time, means till end) + * @param loops How often to loop (0 = infinite) * @return A new AudioStream, which offers the desired functionality. */ AudioStream *makeLoopingAudioStream(SeekableAudioStream *stream, Timestamp start, Timestamp end, uint loops); @@ -235,13 +237,13 @@ public: /** * Constructor for a SubLoopingAudioStream. * - * Note that on creation of the LoopingAudioStream object + * Note that on creation of the SubLoopingAudioStream object * the underlying stream will be rewound. * - * @param stream Stream to loop - * @param loops How often the stream should be looped (0 means infinite) - * @param loopStart Start of the loop (this must be smaller than loopEnd) - * @param loopEnd End of the loop (thus must be greater than loopStart) + * @param stream Stream to loop + * @param loops How often the stream should be looped (0 means infinite) + * @param loopStart Start of the loop (this must be smaller than loopEnd) + * @param loopEnd End of the loop (thus must be greater than loopStart) * @param disposeAfterUse Whether the stream should be disposed, when the * SubLoopingAudioStream is destroyed. */ @@ -285,9 +287,9 @@ public: /** * Creates a new SubSeekableAudioStream. * - * @param parent parent stream object. - * @param start Start time. - * @param end End time. + * @param parent parent stream object. + * @param start Start time. + * @param end End time. * @param disposeAfterUse Whether the parent stream object should be destroyed on destruction of the SubSeekableAudioStream. */ SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); @@ -323,7 +325,7 @@ public: * contained in it has been played. */ virtual void queueAudioStream(Audio::AudioStream *audStream, - DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) = 0; + DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) = 0; /** * Queue a block of raw audio data for playback. This stream plays all @@ -333,10 +335,10 @@ public: * * @note Make sure to allocate the data block with malloc(), not with new[]. * - * @param data pointer to the audio data block - * @param size length of the audio data block - * @param disposeAfterUse if equal to DisposeAfterUse::YES, the block is released using free() after use. - * @param flags a bit-ORed combination of RawFlags describing the audio data format + * @param data pointer to the audio data block + * @param size length of the audio data block + * @param disposeAfterUse if equal to DisposeAfterUse::YES, the block is released using free() after use. + * @param flags a bit-ORed combination of RawFlags describing the audio data format */ void queueBuffer(byte *data, uint32 size, DisposeAfterUse::Flag disposeAfterUse, byte flags); @@ -363,8 +365,8 @@ QueuingAudioStream *makeQueuingAudioStream(int rate, bool stereo); * Converts a point in time to a precise sample offset * with the given parameters. * - * @param where Point in time. - * @param rate Rate of the stream. + * @param where Point in time. + * @param rate Rate of the stream. * @param isStereo Is the stream a stereo stream? */ Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo); -- cgit v1.2.3 From 0d7c8071cc8baed030d5f25203982e0613440412 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:13:42 +0000 Subject: Fix iconv signature on BSD systems. (Based on what we do in tools/) svn-id: r49868 --- common/translation.cpp | 4 ++++ configure | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/common/translation.cpp b/common/translation.cpp index 7346441d27..7dfb3fcc8e 100755 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -119,7 +119,11 @@ bool TranslationManager::convert(const char *message) { char *msgcpy = new char[len + 1]; strcpy(msgcpy, message); char *msg = msgcpy; +#ifdef ICONV_USES_CONST + const char **pmsg = &msg; +#else char **pmsg = &msg; +#endif // Preparing conversion destination size_t len2 = _sizeconv; diff --git a/configure b/configure index 56827b3855..c8a640bea2 100755 --- a/configure +++ b/configure @@ -2349,6 +2349,18 @@ EOF add_to_config_h_if_yes $_termconv '#define TERMCONV' if test "$_termconv" = yes ; then + uses_const=no + cat > $TMPC << EOF +#include +int main(int argc, char **argv) { + iconv_t iconvP; + const char **inbuf = 0; + iconv(iconvP, inbuf, 0, 0, 0); + return 0; +} +EOF + cc_check $LDFLAGS $LIBS $CXXFLAGS && uses_const=yes + add_to_config_h_if_yes $uses_const '#define ICONV_USES_CONST' echo "with terminal conversion)" else echo "without terminal conversion)" -- cgit v1.2.3 From c09af1dcae051220f896002ca10877dc8eac76dd Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:14:02 +0000 Subject: Some style fixes. svn-id: r49869 --- common/translation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 7dfb3fcc8e..0b3d1237a9 100755 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -78,7 +78,7 @@ TranslationManager::~TranslationManager() { #ifdef TERMCONV iconv_close(_conversion); if (_convmsg) - delete [] _convmsg; + delete[] _convmsg; #endif // TERMCONV } @@ -136,7 +136,7 @@ bool TranslationManager::convert(const char *message) { // Do the real conversion size_t result = iconv(_conversion, pmsg, &len, pconv, &len2); - delete [] msgcpy; + delete[] msgcpy; return result != ((size_t)-1); } @@ -152,7 +152,7 @@ const char *TranslationManager::convertTerm(const char *message) { if (!convert(message)) { // Resizing the buffer - delete [] _convmsg; + delete[] _convmsg; _sizeconv = len * 2; _convmsg = new char[_sizeconv]; -- cgit v1.2.3 From 7c7054dbd1697b95634979f05d4a7b153bb17082 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 15 Jun 2010 17:14:38 +0000 Subject: Remove unnecessary svn:executable properties svn-id: r49870 --- common/messages.cpp | 0 common/translation.cpp | 0 common/translation.h | 0 engines/agi/sound_coco3.h | 0 engines/agi/sound_midi.cpp | 0 engines/agi/sound_midi.h | 0 engines/agi/sound_pcjr.cpp | 0 engines/agi/sound_pcjr.h | 0 engines/agi/sound_sarien.h | 0 engines/drascula/console.cpp | 0 engines/drascula/console.h | 0 gui/themes/scummmodern/radiobutton.bmp | Bin gui/themes/scummmodern/radiobutton_empty.bmp | Bin po/POTFILES | 0 po/module.mk | 0 po/remove-potcdate.sed | 0 po/scummvm.pot | 0 17 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 common/messages.cpp mode change 100755 => 100644 common/translation.cpp mode change 100755 => 100644 common/translation.h mode change 100755 => 100644 engines/agi/sound_coco3.h mode change 100755 => 100644 engines/agi/sound_midi.cpp mode change 100755 => 100644 engines/agi/sound_midi.h mode change 100755 => 100644 engines/agi/sound_pcjr.cpp mode change 100755 => 100644 engines/agi/sound_pcjr.h mode change 100755 => 100644 engines/agi/sound_sarien.h mode change 100755 => 100644 engines/drascula/console.cpp mode change 100755 => 100644 engines/drascula/console.h mode change 100755 => 100644 gui/themes/scummmodern/radiobutton.bmp mode change 100755 => 100644 gui/themes/scummmodern/radiobutton_empty.bmp mode change 100755 => 100644 po/POTFILES mode change 100755 => 100644 po/module.mk mode change 100755 => 100644 po/remove-potcdate.sed mode change 100755 => 100644 po/scummvm.pot diff --git a/common/messages.cpp b/common/messages.cpp old mode 100755 new mode 100644 diff --git a/common/translation.cpp b/common/translation.cpp old mode 100755 new mode 100644 diff --git a/common/translation.h b/common/translation.h old mode 100755 new mode 100644 diff --git a/engines/agi/sound_coco3.h b/engines/agi/sound_coco3.h old mode 100755 new mode 100644 diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp old mode 100755 new mode 100644 diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h old mode 100755 new mode 100644 diff --git a/engines/agi/sound_pcjr.cpp b/engines/agi/sound_pcjr.cpp old mode 100755 new mode 100644 diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h old mode 100755 new mode 100644 diff --git a/engines/agi/sound_sarien.h b/engines/agi/sound_sarien.h old mode 100755 new mode 100644 diff --git a/engines/drascula/console.cpp b/engines/drascula/console.cpp old mode 100755 new mode 100644 diff --git a/engines/drascula/console.h b/engines/drascula/console.h old mode 100755 new mode 100644 diff --git a/gui/themes/scummmodern/radiobutton.bmp b/gui/themes/scummmodern/radiobutton.bmp old mode 100755 new mode 100644 diff --git a/gui/themes/scummmodern/radiobutton_empty.bmp b/gui/themes/scummmodern/radiobutton_empty.bmp old mode 100755 new mode 100644 diff --git a/po/POTFILES b/po/POTFILES old mode 100755 new mode 100644 diff --git a/po/module.mk b/po/module.mk old mode 100755 new mode 100644 diff --git a/po/remove-potcdate.sed b/po/remove-potcdate.sed old mode 100755 new mode 100644 diff --git a/po/scummvm.pot b/po/scummvm.pot old mode 100755 new mode 100644 -- cgit v1.2.3 From 0bff5c29fe8d7d0c4edaabee576289ea3cb21d4c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:33:45 +0000 Subject: Use a Common::String instead of a fixed size array for _syslang in TranslationManager. svn-id: r49871 --- common/translation.cpp | 17 ++++++----------- common/translation.h | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 0b3d1237a9..5598cbcf8c 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -52,17 +52,12 @@ TranslationManager::TranslationManager() { const char *locale = setlocale(LC_ALL, ""); // Detect the language from the locale - if (!locale) { - strcpy(_syslang, "C"); - } else { - int len = strlen(locale); - if (len > 5) - len = 5; - strncpy(_syslang, locale, len); - _syslang[len] = 0; - } + if (!locale) + _syslang = "C"; + else + _syslang = locale; #else // DETECTLANG - strcpy(_syslang, "C"); + _syslang = "C"; #endif // DETECTLANG #ifdef TERMCONV @@ -84,7 +79,7 @@ TranslationManager::~TranslationManager() { void TranslationManager::setLanguage(const char *lang) { if (*lang == '\0') - po2c_setlang(_syslang); + po2c_setlang(_syslang.c_str()); else po2c_setlang(lang); diff --git a/common/translation.h b/common/translation.h index 7be21df60f..a844c1f438 100644 --- a/common/translation.h +++ b/common/translation.h @@ -61,7 +61,7 @@ typedef Array TLangArray; */ class TranslationManager : public Singleton { private: - char _syslang[6]; + Common::String _syslang; #ifdef TERMCONV iconv_t _conversion; -- cgit v1.2.3 From f607fc59dbdeecedb3151a7532be7e170812cb38 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:34:07 +0000 Subject: Extend (and along with it add) some doxygen comments. svn-id: r49872 --- common/translation.h | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/common/translation.h b/common/translation.h index a844c1f438..772e96fe58 100644 --- a/common/translation.h +++ b/common/translation.h @@ -79,18 +79,40 @@ public: TranslationManager(); ~TranslationManager(); + /** + * Retrieves the language string to the given id. + * + * @param id Id of the language + * @return the matching string description of the language + */ const char *getLangById(int id); /** * Sets the current translation language to the one specified in the * parameter. If the parameter is an empty string, it sets the default * system language. + * + * @param lang Language to setup. + */ + void setLanguage(const char *lang); + + /** + * Sets the current translation language to the one specified by the + * id parameter. + * + * @param id The id of the language. */ - void setLanguage(const char *); void setLanguage(int id) { setLanguage(getLangById(id)); } + /** + * Parses a language string and returns an id instead. + * + * @param lang Language string + * @return id of the language or kTranslationBuiltinId in case the + * language could not be found. + */ int parseLanguage(const String lang); /** @@ -100,6 +122,11 @@ public: */ const char *getTranslation(const char *message); + /** + * Returns the translation into the current language of the parameter + * message. In case the message isn't found in the translation catalog, + * it returns the original untranslated message. + */ String getTranslation(const String &message); /** @@ -108,6 +135,11 @@ public: */ const char *convertTerm(const char *message); + /** + * Returns a list of supported languages. + * + * @return The list of supported languages. + */ const TLangArray getSupportedLanguages() const; }; -- cgit v1.2.3 From 34d8196334c628ebf240c7e3fc86615bc371bdc0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:34:26 +0000 Subject: Output some warning in case an invalid ID was passed to TranslationManager::getLangById. svn-id: r49873 --- common/translation.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/common/translation.cpp b/common/translation.cpp index 5598cbcf8c..d29e7b5c72 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -196,8 +196,14 @@ const char *TranslationManager::getLangById(int id) { case kTranslationBuiltinId: return "C"; default: - return po2c_getlang(id - 1); + if (id >= 0 && id - 1 < po2c_getnumlangs()) + return po2c_getlang(id - 1); } + + // In case an invalid ID was specified, we will output a warning + // and return the same value as the auto detection id. + warning("Invalid language id %d passed to TranslationManager::getLangById", id); + return ""; } #else // TRANSLATION -- cgit v1.2.3 From c9ba23f2b461c40c1b985faa4091c9363d20163c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 17:41:33 +0000 Subject: SCI: only set mouse position, when cursor is visible (fixes non-stop, but escapeable mouse position setting to 0, 0 in eco quest 1 floppy during intro) svn-id: r49874 --- engines/sci/graphics/cursor.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 38e9d389a6..46bd981b7f 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -259,6 +259,13 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu } void GfxCursor::setPosition(Common::Point pos) { + // Don't set position, when cursor is not visible + // This fixes eco quest 1 (floppy) right at the start, which is setting mouse cursor to 0, 0 all the time during the + // intro. It's escapeable (now) by moving to the left or top, but it's getting on your nerves. + // This could theoretically break some things, although sierra normally sets position only when showing the cursor. + if (!_isVisible) + return; + if (!_upscaledHires) { g_system->warpMouse(pos.x, pos.y); } else { -- cgit v1.2.3 From f3288b0f267672a6f9b0039cf9aeff514d2e42f8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:47:04 +0000 Subject: Fix a typo. svn-id: r49875 --- common/translation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/translation.h b/common/translation.h index 772e96fe58..ce65688884 100644 --- a/common/translation.h +++ b/common/translation.h @@ -131,7 +131,7 @@ public: /** * Converts the message into the terminal character set (which may be - * different than the GUI's "native" one. + * different than the GUI's "native" one). */ const char *convertTerm(const char *message); -- cgit v1.2.3 From d8bc79814532818615a571e327e9f4d201e93057 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:47:23 +0000 Subject: Strip out charset information from the system locale again (like it was done before r49871). Unlike with the old code, we know allow for locales with a different size than 5 though. svn-id: r49876 --- common/translation.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index d29e7b5c72..c7bcb385d1 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -52,10 +52,28 @@ TranslationManager::TranslationManager() { const char *locale = setlocale(LC_ALL, ""); // Detect the language from the locale - if (!locale) + if (!locale) { _syslang = "C"; - else - _syslang = locale; + } else { + int length = 0; + + // Strip out additional information, like + // ".UTF-8" or the like. We do this, since + // our translation languages are usually + // specified without any charset information. + for (int i = 0; locale[i]; ++i) { + // TODO: Check whether "@" should really be checked + // here. + if (locale[i] == '.' || locale[i] == ' ' || locale[i] == '@') { + length = i; + break; + } + + length = i; + } + + _syslang = String(locale, length); + } #else // DETECTLANG _syslang = "C"; #endif // DETECTLANG -- cgit v1.2.3 From ee419aad9cb16e36248158a434831163a93731db Mon Sep 17 00:00:00 2001 From: John Willis Date: Tue, 15 Jun 2010 17:49:40 +0000 Subject: GP2XWiz: Add port distribution rules into a makefile so they can be used with buildbot. This removes them from the old scripts in /backends/platform/gp2xwiz/build/ and puts them in the right place as make targets. svn-id: r49877 --- backends/platform/gp2xwiz/build/bundle-debug.sh | 51 +---------------- backends/platform/gp2xwiz/build/bundle.sh | 54 +----------------- backends/platform/gp2xwiz/gp2xwiz-bundle.mk | 73 +++++++++++++++++++++++++ configure | 1 + 4 files changed, 80 insertions(+), 99 deletions(-) create mode 100755 backends/platform/gp2xwiz/gp2xwiz-bundle.mk diff --git a/backends/platform/gp2xwiz/build/bundle-debug.sh b/backends/platform/gp2xwiz/build/bundle-debug.sh index d275f681ea..cd5145b31d 100755 --- a/backends/platform/gp2xwiz/build/bundle-debug.sh +++ b/backends/platform/gp2xwiz/build/bundle-debug.sh @@ -2,53 +2,8 @@ echo Quick script to make building a distribution of the GP2X Wiz backend more consistent. -echo Collecting files. -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib" +cd ../../../.. +echo Building ScummVM for GP2X Wiz. -echo "Please put your save games in this dir" >> "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves/PUT_SAVES_IN_THIS_DIR" - -cp ./scummvm-gdb.gpe ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/scummvm.gpe -cp ./scummvm.png ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./README-GP2XWIZ ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./scummvm.ini ./scummvm-wiz-`date '+%Y-%m-%d'`/ -cp ../../../../scummvm.wiz ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../AUTHORS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../README ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYING ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYRIGHT ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../NEWS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../gui/themes/scummmodern.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/pred.dic ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/engine-data/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data -cp ../../../../plugins/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins - -# Copy over dynamic libs needed by the app (as the ones in the default filesystem are broken). -f=`which arm-open2x-linux-g++` -loc=`dirname "$f"` -cp $loc/../lib/libz.so.1.2.3 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libz.so.1 -cp $loc/../lib/libvorbisidec.so.1.0.2 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libvorbisidec.so.1 - -echo Building ZIP bundle. -if [ -f /usr/bin/zip ] - then - rm ./"scummvm-wiz-`date '+%Y-%m-%d'`.zip" - cd "scummvm-wiz-`date '+%Y-%m-%d'`" - zip -r -9 "../scummvm-wiz-`date '+%Y-%m-%d'`.zip" * - echo You should have a "scummvm-wiz-`date '+%Y-%m-%d'`.zip" for the GP2X Wiz backend ready to go. - cd .. - rm -R ./"scummvm-wiz-`date '+%Y-%m-%d'`" - else - echo - /usr/bin/zip not found, ZIP bundle not created. - echo All included files can also be found in ./"scummvm-wiz-`date '+%Y-%m-%d'`" - echo - Please use you preferred archive tool to bundle these files. -fi - -echo Please ensure GDB is installed somewhere in the path on your Wiz. - +make gp2xwiz-bundle-debug diff --git a/backends/platform/gp2xwiz/build/bundle.sh b/backends/platform/gp2xwiz/build/bundle.sh index 065bd7a685..579e2dc77b 100755 --- a/backends/platform/gp2xwiz/build/bundle.sh +++ b/backends/platform/gp2xwiz/build/bundle.sh @@ -2,56 +2,8 @@ echo Quick script to make building a distribution of the GP2X Wiz backend more consistent. -echo Collecting files. -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib" +cd ../../../.. +echo Building ScummVM for GP2X Wiz. -echo "Please put your save games in this dir" >> "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves/PUT_SAVES_IN_THIS_DIR" - -cp ./scummvm.gpe ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./scummvm.png ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./README-GP2XWIZ ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./scummvm.ini ./scummvm-wiz-`date '+%Y-%m-%d'`/ -cp ../../../../scummvm.wiz ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../AUTHORS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../README ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYING ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYRIGHT ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../NEWS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../gui/themes/scummmodern.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/pred.dic ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/engine-data/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data -cp ../../../../plugins/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins - -# Copy over dynamic libs needed by the app (as the ones in the default filesystem are broken). -f=`which arm-open2x-linux-g++` -loc=`dirname "$f"` -cp $loc/../lib/libz.so.1.2.3 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libz.so.1 -cp $loc/../lib/libvorbisidec.so.1.0.2 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libvorbisidec.so.1 - -echo Making Stripped Binary. -arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/scummvm.wiz - -echo Making Stripped Plugins. -arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins/* - -echo Building ZIP bundle. -if [ -f /usr/bin/zip ] - then - rm ./"scummvm-wiz-`date '+%Y-%m-%d'`.zip" - cd "scummvm-wiz-`date '+%Y-%m-%d'`" - zip -r -9 "../scummvm-wiz-`date '+%Y-%m-%d'`.zip" * - echo You should have a "scummvm-wiz-`date '+%Y-%m-%d'`.zip" for the GP2X Wiz backend ready to go. - cd .. - rm -R ./"scummvm-wiz-`date '+%Y-%m-%d'`" - else - echo - /usr/bin/zip not found, ZIP bundle not created. - echo All included files can also be found in ./"scummvm-wiz-`date '+%Y-%m-%d'`" - echo - Please use you preferred archive tool to bundle these files. -fi +make gp2xwiz-bundle diff --git a/backends/platform/gp2xwiz/gp2xwiz-bundle.mk b/backends/platform/gp2xwiz/gp2xwiz-bundle.mk new file mode 100755 index 0000000000..fa5a247865 --- /dev/null +++ b/backends/platform/gp2xwiz/gp2xwiz-bundle.mk @@ -0,0 +1,73 @@ +# Special target to create bundles for the GP2X Wiz. + +#bundle_name = release/scummvm-wiz-`date '+%Y-%m-%d'` +bundle_name = release/scummvm-gp2xwiz +f=$(shell which $(STRIP)) +libloc = $(shell dirname $(f)) + +gp2xwiz-bundle: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/scummvm" + $(MKDIR) "$(bundle_name)/scummvm/saves" + $(MKDIR) "$(bundle_name)/scummvm/engine-data" + $(MKDIR) "$(bundle_name)/scummvm/lib" + + echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.gpe $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/ + + $(STRIP) $(EXECUTABLE) -o $(bundle_name)/scummvm/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" + $(STRIP) $(bundle_name)/scummvm/plugins/* +endif + + $(CP) $(libloc)/../lib/libz.so.1.2.3 $(bundle_name)/scummvm/lib/libz.so.1 + $(CP) $(libloc)/../lib/libvorbisidec.so.1.0.2 $(bundle_name)/scummvm/lib/libvorbisidec.so.1 + + tar -C $(bundle_name) -cvjf $(bundle_name).tar.bz2 . + rm -R ./$(bundle_name) + +gp2xwiz-bundle-debug: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/scummvm" + $(MKDIR) "$(bundle_name)/scummvm/saves" + $(MKDIR) "$(bundle_name)/scummvm/engine-data" + $(MKDIR) "$(bundle_name)/scummvm/lib" + + echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm-gdb.gpe $(bundle_name)/scummvm/scummvm.gpe + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/ + + $(INSTALL) -c -m 777 $(srcdir)/$(EXECUTABLE) $(bundle_name)/scummvm/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" +endif + + $(CP) $(libloc)/../lib/libz.so.1.2.3 $(bundle_name)/scummvm/lib/libz.so.1 + $(CP) $(libloc)/../lib/libvorbisidec.so.1.0.2 $(bundle_name)/scummvm/lib/libvorbisidec.so.1 + + tar -C $(bundle_name) -cvjf $(bundle_name)-debug.tar.bz2 . + rm -R ./$(bundle_name) + +.PHONY: gp2xwiz-bundle gp2xwiz-bundle-debug diff --git a/configure b/configure index c8a640bea2..954f812707 100755 --- a/configure +++ b/configure @@ -1505,6 +1505,7 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _port_mk="backends/platform/gp2xwiz/gp2xwiz-bundle.mk" ;; iphone) DEFINES="$DEFINES -DIPHONE -DUNIX" -- cgit v1.2.3 From 212d0ac28c3b10c57ffefb16af998f58fa5e294c Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Tue, 15 Jun 2010 17:50:14 +0000 Subject: Fix compilation when using ICONV_USES_CONST. svn-id: r49878 --- common/translation.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index c7bcb385d1..60ae4c2257 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -129,27 +129,29 @@ String TranslationManager::getTranslation(const String &message) { bool TranslationManager::convert(const char *message) { // Preparing conversion origin size_t len = strlen(message); - char *msgcpy = new char[len + 1]; - strcpy(msgcpy, message); - char *msg = msgcpy; #ifdef ICONV_USES_CONST + const char *msg = message; const char **pmsg = &msg; #else + char *msgcpy = new char[len + 1]; + strcpy(msgcpy, message); + char *msg = msgcpy; char **pmsg = &msg; #endif // Preparing conversion destination size_t len2 = _sizeconv; char *conv = _convmsg; - char **pconv = &conv; // Clean previous conversions - iconv(_conversion, NULL, NULL, pconv, &len2); + iconv(_conversion, NULL, NULL, &conv, &len2); // Do the real conversion - size_t result = iconv(_conversion, pmsg, &len, pconv, &len2); + size_t result = iconv(_conversion, pmsg, &len, &conv, &len2); +#ifndef ICONV_USES_CONST delete[] msgcpy; +#endif return result != ((size_t)-1); } -- cgit v1.2.3 From a42ea73a768f52105ef3ac36041db0c5c14ec113 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 17:56:05 +0000 Subject: Simplify code for the "ICONV_USES_CONST" case even more. (i.e. remove the "msg" variable there). svn-id: r49880 --- common/translation.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 60ae4c2257..791958b911 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -130,8 +130,7 @@ bool TranslationManager::convert(const char *message) { // Preparing conversion origin size_t len = strlen(message); #ifdef ICONV_USES_CONST - const char *msg = message; - const char **pmsg = &msg; + const char **pmsg = &message; #else char *msgcpy = new char[len + 1]; strcpy(msgcpy, message); -- cgit v1.2.3 From 93df097f39dda7b1b0d68a94d0f06b01b9b834b4 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 15 Jun 2010 18:17:51 +0000 Subject: Added the same quit/restart test to print() as we have in so many other places. This makes it easier to quit the game during the text box in the King's Quest 3 into, and probably other places as well. svn-id: r49881 --- engines/agi/text.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp index 36a289c47b..778da0a527 100644 --- a/engines/agi/text.cpp +++ b/engines/agi/text.cpp @@ -489,7 +489,7 @@ int AgiEngine::print(const char *p, int lin, int col, int len) { _game.keypress = 0; break; } - } while (_game.msgBoxTicks > 0); + } while (_game.msgBoxTicks > 0 && !(shouldQuit() || _restartGame)); setvar(vWindowReset, 0); -- cgit v1.2.3 From 6210b44eba8ec045a06a1ef272b9b1465652889f Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Tue, 15 Jun 2010 18:30:30 +0000 Subject: Fix linking of the cc_tests svn-id: r49882 --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 954f812707..cfeb6fe8df 100755 --- a/configure +++ b/configure @@ -1408,7 +1408,8 @@ case $_host_os in CXXFLAGS="$CXXFLAGS -Os -mrvl -mcpu=750 -meabi -mhard-float" CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fmodulo-sched" CXXFLAGS="$CXXFLAGS -I$DEVKITPRO/libogc/include -I$DEVKITPRO/wii/include" - LDFLAGS="$LDFLAGS -mrvl -mcpu=750 -L$DEVKITPRO/libogc/lib/wii -L$DEVKITPRO/wii/lib" + # libogc is required to link the cc tests (includes _start()) + LDFLAGS="$LDFLAGS -mrvl -mcpu=750 -L$DEVKITPRO/libogc/lib/wii -L$DEVKITPRO/wii/lib -logc" ;; wince) CXXFLAGS="$CXXFLAGS -O3 -march=armv4 -mtune=xscale" -- cgit v1.2.3 From 9938661ffaa5923069fe5ee9e8f2ecb96a961ff5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 15 Jun 2010 18:36:05 +0000 Subject: Surface is a struct, not a class svn-id: r49883 --- engines/groovie/script.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/groovie/script.h b/engines/groovie/script.h index 43b7c06a54..cda87a8917 100644 --- a/engines/groovie/script.h +++ b/engines/groovie/script.h @@ -34,7 +34,7 @@ class SeekableReadStream; } namespace Graphics { -class Surface; +struct Surface; } namespace Groovie { -- cgit v1.2.3 From 7360bea1ee55443c14639c13bc0b548bb941a705 Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Tue, 15 Jun 2010 18:42:08 +0000 Subject: Fix linking of the cc_tests (gamecube too) svn-id: r49884 --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index cfeb6fe8df..095fbc3ab9 100755 --- a/configure +++ b/configure @@ -1355,7 +1355,8 @@ case $_host_os in CXXFLAGS="$CXXFLAGS -Os -mogc -mcpu=750 -meabi -mhard-float" CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fmodulo-sched" CXXFLAGS="$CXXFLAGS -I$DEVKITPRO/libogc/include -I$DEVKITPRO/cube/include" - LDFLAGS="$LDFLAGS -mogc -mcpu=750 -L$DEVKITPRO/libogc/lib/cube -L$DEVKITPRO/cube/lib" + # libogc is required to link the cc tests (includes _start()) + LDFLAGS="$LDFLAGS -mogc -mcpu=750 -L$DEVKITPRO/libogc/lib/cube -L$DEVKITPRO/cube/lib -logc" ;; haiku*) DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" -- cgit v1.2.3 From 49463c2bf95f8293746f2b6cb9420f313c6babf3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 19:20:58 +0000 Subject: Use USE_TRANSLATION, USE_DETECTLANG and USE_TERMCONV instead of (ENABLE_)TRANSLATION, DETECTLANG and TERMCONV. svn-id: r49885 --- common/module.mk | 2 +- common/translation.cpp | 40 ++++++++++++++++++++-------------------- common/translation.h | 8 ++++---- configure | 8 ++++---- gui/options.cpp | 12 ++++++------ 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/common/module.mk b/common/module.mk index 857fb10edf..7a1f83c995 100644 --- a/common/module.mk +++ b/common/module.mk @@ -29,7 +29,7 @@ MODULE_OBJS := \ xmlparser.o \ zlib.o -ifdef ENABLE_TRANSLATION +ifdef USE_TRANSLATION common/translation.cpp: common/messages.cpp common/messages.cpp: $(wildcard po/*.po) diff --git a/common/translation.cpp b/common/translation.cpp index 791958b911..3119c074ab 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -26,28 +26,28 @@ DECLARE_SINGLETON(Common::TranslationManager) -#ifdef DETECTLANG +#ifdef USE_DETECTLANG #include #endif -#ifdef TERMCONV +#ifdef USE_TERMCONV #include #endif -#ifdef TRANSLATION +#ifdef USE_TRANSLATION #include "messages.cpp" #endif namespace Common { -#ifdef TRANSLATION +#ifdef USE_TRANSLATION // Translation enabled TranslationManager::TranslationManager() { -#ifdef DETECTLANG +#ifdef USE_DETECTLANG // Activating current locale settings const char *locale = setlocale(LC_ALL, ""); @@ -74,25 +74,25 @@ TranslationManager::TranslationManager() { _syslang = String(locale, length); } -#else // DETECTLANG +#else // USE_DETECTLANG _syslang = "C"; -#endif // DETECTLANG +#endif // USE_DETECTLANG -#ifdef TERMCONV +#ifdef USE_TERMCONV _convmsg = NULL; _conversion = NULL; -#endif // TERMCONV +#endif // USE_TERMCONV // Set the default language setLanguage(""); } TranslationManager::~TranslationManager() { -#ifdef TERMCONV +#ifdef USE_TERMCONV iconv_close(_conversion); if (_convmsg) delete[] _convmsg; -#endif // TERMCONV +#endif // USE_TERMCONV } void TranslationManager::setLanguage(const char *lang) { @@ -101,7 +101,7 @@ void TranslationManager::setLanguage(const char *lang) { else po2c_setlang(lang); -#ifdef TERMCONV +#ifdef USE_TERMCONV // Get the locale character set (for terminal output) const char *charset_term = nl_langinfo(CODESET); @@ -114,7 +114,7 @@ void TranslationManager::setLanguage(const char *lang) { // Initialize the conversion _conversion = iconv_open(charset_term, charset_po); -#endif // TERMCONV +#endif // USE_TERMCONV } const char *TranslationManager::getTranslation(const char *message) { @@ -125,7 +125,7 @@ String TranslationManager::getTranslation(const String &message) { return po2c_gettext(message.c_str()); } -#ifdef TERMCONV +#ifdef USE_TERMCONV bool TranslationManager::convert(const char *message) { // Preparing conversion origin size_t len = strlen(message); @@ -154,10 +154,10 @@ bool TranslationManager::convert(const char *message) { return result != ((size_t)-1); } -#endif // TERMCONV +#endif // USE_TERMCONV const char *TranslationManager::convertTerm(const char *message) { -#ifdef TERMCONV +#ifdef USE_TERMCONV size_t len = strlen(message); if (!_convmsg) { _sizeconv = len * 2; @@ -177,9 +177,9 @@ const char *TranslationManager::convertTerm(const char *message) { } return _convmsg; -#else // TERMCONV +#else // USE_TERMCONV return message; -#endif // TERMCONV +#endif // USE_TERMCONV } const TLangArray TranslationManager::getSupportedLanguages() const { @@ -225,7 +225,7 @@ const char *TranslationManager::getLangById(int id) { return ""; } -#else // TRANSLATION +#else // USE_TRANSLATION // Translation disabled @@ -244,6 +244,6 @@ const char *TranslationManager::convertTerm(const char *message) { return message; } -#endif // TRANSLATION +#endif // USE_TRANSLATION } // End of namespace Common diff --git a/common/translation.h b/common/translation.h index ce65688884..c264eadfd9 100644 --- a/common/translation.h +++ b/common/translation.h @@ -28,7 +28,7 @@ #include "common/singleton.h" #include "common/str-array.h" -#ifdef TERMCONV +#ifdef USE_TERMCONV #include #endif @@ -63,13 +63,13 @@ class TranslationManager : public Singleton { private: Common::String _syslang; -#ifdef TERMCONV +#ifdef USE_TERMCONV iconv_t _conversion; char *_convmsg; int _sizeconv; bool convert(const char *message); -#endif // TERMCONV +#endif // USE_TERMCONV public: /** @@ -147,7 +147,7 @@ public: #define TransMan Common::TranslationManager::instance() -#ifdef TRANSLATION +#ifdef USE_TRANSLATION #define _(str) TransMan.getTranslation(str) #define _t(str) TransMan.convertTerm(_(str)) #else diff --git a/configure b/configure index 095fbc3ab9..7ccf36ca74 100755 --- a/configure +++ b/configure @@ -2323,8 +2323,8 @@ fi # Check whether to build translation support # echo_n "Building translation support... " -add_to_config_mk_if_yes $_translation 'ENABLE_TRANSLATION = 1' -add_to_config_h_if_yes $_translation '#define TRANSLATION' +add_to_config_mk_if_yes $_translation 'USE_TRANSLATION = 1' +add_to_config_h_if_yes $_translation '#define USE_TRANSLATION' if test "$_translation" = no ; then echo "no" else @@ -2337,7 +2337,7 @@ EOF _detectlang=no cc_check $LDFLAGS $CXXFLAGS && _detectlang=yes - add_to_config_h_if_yes $_detectlang '#define DETECTLANG' + add_to_config_h_if_yes $_detectlang '#define USE_DETECTLANG' if test "$_detectlang" = yes ; then echo_n "with runtime language detection, " @@ -2350,7 +2350,7 @@ EOF cc_check_no_clean $LDFLAGS $CXXFLAGS && _termconv=yes cc_check $LDFLAGS $CXXFLAGS -liconv && LIBS="$LIBS -liconv" && _termconv=yes - add_to_config_h_if_yes $_termconv '#define TERMCONV' + add_to_config_h_if_yes $_termconv '#define USE_TERMCONV' if test "$_termconv" = yes ; then uses_const=no cat > $TMPC << EOF diff --git a/gui/options.cpp b/gui/options.cpp index 792b99ba22..780670e78b 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -853,12 +853,12 @@ GlobalOptionsDialog::GlobalOptionsDialog() // TODO: joystick setting -#ifdef TRANSLATION +#ifdef USE_TRANSLATION _guiLanguagePopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.GuiLanguagePopupDesc", _("GUI Language:"), _("Language of ScummVM GUI")); _guiLanguagePopUp = new PopUpWidget(tab, "GlobalOptions_Misc.GuiLanguagePopup"); -#ifdef DETECTLANG +#ifdef USE_DETECTLANG _guiLanguagePopUp->appendEntry(_(""), Common::kTranslationAutodetectId); -#endif // DETECTLANG +#endif // USE_DETECTLANG _guiLanguagePopUp->appendEntry(_("English"), Common::kTranslationBuiltinId); _guiLanguagePopUp->appendEntry("", 0); Common::TLangArray languages = TransMan.getSupportedLanguages(); @@ -869,7 +869,7 @@ GlobalOptionsDialog::GlobalOptionsDialog() } _guiLanguagePopUp->setSelectedTag(TransMan.parseLanguage(ConfMan.get("gui_language").c_str())); -#endif // TRANSLATION +#endif // USE_TRANSLATION // Activate the first tab tab->setActiveTab(0); @@ -977,7 +977,7 @@ void GlobalOptionsDialog::close() { g_gui.loadNewTheme(g_gui.theme()->getThemeId(), selected); ConfMan.set("gui_renderer", cfg, _domain); } -#ifdef TRANSLATION +#ifdef USE_TRANSLATION Common::String oldLang = ConfMan.get("gui_language"); int selLang = _guiLanguagePopUp->getSelectedTag(); @@ -997,7 +997,7 @@ void GlobalOptionsDialog::close() { error.runModal(); #endif } -#endif // TRANSLATION +#endif // USE_TRANSLATION } OptionsDialog::close(); -- cgit v1.2.3 From a6fc45b29b07c6b619b4889893846e6dec151b34 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 19:21:20 +0000 Subject: Add translation feature support in create_msvc. svn-id: r49886 --- tools/create_msvc/create_msvc.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/create_msvc/create_msvc.cpp b/tools/create_msvc/create_msvc.cpp index f418971239..dee91defdb 100644 --- a/tools/create_msvc/create_msvc.cpp +++ b/tools/create_msvc/create_msvc.cpp @@ -835,11 +835,12 @@ const Feature s_features[] = { { "mpeg2", "USE_MPEG2", "libmpeg2.lib", false, "mpeg2 codec for cutscenes" }, // ScummVM feature flags - { "scalers", "USE_SCALERS", "", true, "Scalers" }, - { "hqscalers", "USE_HQ_SCALERS", "", true, "HQ scalers" }, - { "16bit", "USE_RGB_COLOR", "", true, "16bit color support" }, - { "mt32emu", "USE_MT32EMU", "", true, "integrated MT-32 emulator" }, - { "nasm", "USE_NASM", "", true, "IA-32 assembly support" }, // This feature is special in the regard, that it needs additional handling. + { "scalers", "USE_SCALERS", "", true, "Scalers" }, + { "hqscalers", "USE_HQ_SCALERS", "", true, "HQ scalers" }, + { "16bit", "USE_RGB_COLOR", "", true, "16bit color support" }, + { "mt32emu", "USE_MT32EMU", "", true, "integrated MT-32 emulator" }, + { "nasm", "USE_NASM", "", true, "IA-32 assembly support" }, // This feature is special in the regard, that it needs additional handling. + { "translation", "USE_TRANSLATION", "", true, "Translation support" } }; } // End of anonymous namespace -- cgit v1.2.3 From a8598767c627d8be616f31855b1ff5d6e0f752f9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 19:25:45 +0000 Subject: Fix some warnings inside convbdf.c svn-id: r49887 --- tools/convbdf.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/convbdf.c b/tools/convbdf.c index 4341eac2e7..ad0d9d2373 100644 --- a/tools/convbdf.c +++ b/tools/convbdf.c @@ -38,12 +38,12 @@ #include int READ_UINT16(void *addr) { - unsigned char *buf = addr; + unsigned char *buf = (unsigned char *)addr; return (buf[0] << 8) | buf[1]; } void WRITE_UINT16(void *addr, int value) { - unsigned char *buf = addr; + unsigned char *buf = (unsigned char *)addr; buf[0] = (value >> 8) & 0xFF; buf[1] = value & 0xFF; } @@ -611,7 +611,7 @@ int bdf_read_bitmaps(FILE *fp, struct font* pf) { /* determine whether font doesn't require encode table*/ l = 0; for (i = 0; i < pf->size; ++i) { - if (pf->offset[i] != l) { + if (pf->offset[i] != (unsigned long)l) { encodetable = 1; break; } @@ -648,7 +648,7 @@ int bdf_read_bitmaps(FILE *fp, struct font* pf) { /* reallocate bits array to actual bits used*/ if (ofs < pf->bits_size) { - pf->bits = realloc(pf->bits, ofs * sizeof(bitmap_t)); + pf->bits = (bitmap_t *)realloc(pf->bits, ofs * sizeof(bitmap_t)); pf->bits_size = ofs; } else { -- cgit v1.2.3 From 3f9bb1e9b08511f89bd53ff3e456ef4335a2ba71 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 19:26:14 +0000 Subject: Fix some warnings inside make-scumm-fontdata.c svn-id: r49888 --- tools/make-scumm-fontdata.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make-scumm-fontdata.c b/tools/make-scumm-fontdata.c index f251a22b80..991d49831a 100644 --- a/tools/make-scumm-fontdata.c +++ b/tools/make-scumm-fontdata.c @@ -821,7 +821,7 @@ static const unsigned char spanishCharsetDataV2[] = { unsigned char *specialCharsetData = NULL; int numSpecialChars = 0; -void compressCharset(const unsigned char *data, char *var, char *name) { +void compressCharset(const unsigned char *data, const char *var, const char *name) { int i; printf("// %s\n", name); -- cgit v1.2.3 From 38fc910353009fe14124e1041d34d0df654d3f88 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 20:01:31 +0000 Subject: Yet another WinCE fix svn-id: r49889 --- gui/KeysDialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp index 4162935e45..897dd8c741 100644 --- a/gui/KeysDialog.cpp +++ b/gui/KeysDialog.cpp @@ -41,9 +41,9 @@ enum { KeysDialog::KeysDialog(const Common::String &title) : GUI::Dialog("KeysDialog") { - new ButtonWidget(this, "KeysDialog.Map", _("Map"), kMapCmd); - new ButtonWidget(this, "KeysDialog.Ok", _("OK"), kOKCmd); - new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), kCloseCmd); + new ButtonWidget(this, "KeysDialog.Map", _("Map"), 0, kMapCmd); + new ButtonWidget(this, "KeysDialog.Ok", _("OK"), 0, kOKCmd); + new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), 0, kCloseCmd); _actionsList = new ListWidget(this, "KeysDialog.List"); _actionsList->setNumberingMode(kListNumberingZero); -- cgit v1.2.3 From fea248ae2f0c2659d84bd8ec400530a6c5e5bc22 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 15 Jun 2010 20:23:25 +0000 Subject: SCI: make umlauts work in kFrameout for sci32 svn-id: r49890 --- engines/sci/graphics/frameout.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index d794fad39e..f16f1068a9 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -265,14 +265,15 @@ void GfxFrameout::kernelFrameout() { uint16 curX = itemEntry->x; uint16 curY = itemEntry->y; for (uint32 i = 0; i < text.size(); i++) { + unsigned char curChar = text[i]; // TODO: proper text splitting... this is a hack - if ((text[i] == ' ' && i > 0 && text[i - i] == ' ') || text[i] == '\n' || - (curX + font->getCharWidth(text[i]) > _screen->getWidth())) { + if ((curChar == ' ' && i > 0 && text[i - i] == ' ') || curChar == '\n' || + (curX + font->getCharWidth(curChar) > _screen->getWidth())) { curY += font->getHeight(); curX = itemEntry->x; } - font->draw(text[i], curY, curX, foreColor, dimmed); - curX += font->getCharWidth(text[i]); + font->draw(curChar, curY, curX, foreColor, dimmed); + curX += font->getCharWidth(curChar); } delete font; } -- cgit v1.2.3 From 2e9a7155e6ba4398a1594df4c21de97f29a99193 Mon Sep 17 00:00:00 2001 From: John Willis Date: Tue, 15 Jun 2010 20:45:13 +0000 Subject: GP2X: Move port distribution rules into a makefile for use with buildbot. This removes them from the old scripts in /backends/platform/gp2x/build/ and puts them in the right place. svn-id: r49892 --- backends/platform/gp2x/build/bundle.sh | 50 +++------------------------- backends/platform/gp2x/gp2x-bundle.mk | 60 ++++++++++++++++++++++++++++++++++ configure | 1 + 3 files changed, 65 insertions(+), 46 deletions(-) create mode 100755 backends/platform/gp2x/gp2x-bundle.mk diff --git a/backends/platform/gp2x/build/bundle.sh b/backends/platform/gp2x/build/bundle.sh index c68c62191b..d17f8bd831 100755 --- a/backends/platform/gp2x/build/bundle.sh +++ b/backends/platform/gp2x/build/bundle.sh @@ -1,52 +1,10 @@ -#!/bin/bash +#!/bin/sh echo Quick script to make building a distribution of the GP2X port more consistent. -PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH -PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH -export CXX=arm-open2x-linux-g++ -export CXXFLAGS=-march=armv4t -export CPPFLAGS=-I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include -export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib +cd ../../../.. -echo Collecting files. -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/saves" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/plugins" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/engine-data" +echo Building ScummVM for GP2X Wiz. -echo "Please put your save games in this dir" >> "scummvm-gp2x-`date '+%Y-%m-%d'`/saves/PUT_SAVES_IN_THIS_DIR" +make gp2x-bundle -cp ./scummvm.gpe ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./scummvm.png ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./README-GP2X ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./mmuhack.o ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../scummvm.gp2x ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../AUTHORS ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../README ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../COPYING ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../COPYRIGHT ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../NEWS ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../gui/themes/scummmodern.zip ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../dists/pred.dic ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../dists/engine-data/* ./scummvm-gp2x-`date '+%Y-%m-%d'`/engine-data -cp ../../../../plugins/* ./scummvm-gp2x-`date '+%Y-%m-%d'`/plugins - -echo Making Stripped GPE. -arm-open2x-linux-strip ./scummvm-gp2x-`date '+%Y-%m-%d'`/scummvm.gp2x - -echo Building ZIP bundle. -if [ -f /usr/bin/zip ] - then - rm ./"scummvm-gp2x-`date '+%Y-%m-%d'`.zip" - cd "scummvm-gp2x-`date '+%Y-%m-%d'`" - zip -r -9 "../scummvm-gp2x-`date '+%Y-%m-%d'`.zip" * - echo You should have a "scummvm-gp2x-`date '+%Y-%m-%d'`.zip" for the GP2X port ready to go. - cd .. - rm -R ./"scummvm-gp2x-`date '+%Y-%m-%d'`" - else - echo - /usr/bin/zip not found, ZIP bundle not created. - echo All included files can also be found in ./"scummvm-gp2x-`date '+%Y-%m-%d'`" - echo - Please use you preferred archive tool to bundle these files. -fi diff --git a/backends/platform/gp2x/gp2x-bundle.mk b/backends/platform/gp2x/gp2x-bundle.mk new file mode 100755 index 0000000000..c6fb72c1c3 --- /dev/null +++ b/backends/platform/gp2x/gp2x-bundle.mk @@ -0,0 +1,60 @@ +# Special target to create bundles for the GP2X. + +bundle_name = release/scummvm-gp2x + +gp2x-bundle: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/saves" + $(MKDIR) "$(bundle_name)/engine-data" + + echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/ + + $(STRIP) $(EXECUTABLE) -o $(bundle_name)/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/plugins" + $(STRIP) $(bundle_name)/plugins/* +endif + + tar -C $(bundle_name) -cvjf $(bundle_name).tar.bz2 . + rm -R ./$(bundle_name) + +gp2x-bundle-debug: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/saves" + $(MKDIR) "$(bundle_name)/engine-data" + + echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/ + + $(INSTALL) -c -m 777 $(srcdir)/$(EXECUTABLE) $(bundle_name)/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" +endif + + tar -C $(bundle_name) -cvjf $(bundle_name)-debug.tar.bz2 . + rm -R ./$(bundle_name) + +.PHONY: gp2x-bundle gp2x-bundle-debug diff --git a/configure b/configure index 7ccf36ca74..3b8dbe2471 100755 --- a/configure +++ b/configure @@ -1492,6 +1492,7 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _port_mk="backends/platform/gp2x/gp2x-bundle.mk" ;; gp2xwiz) DEFINES="$DEFINES -DUNIX -DGP2XWIZ -DNDEBUG" -- cgit v1.2.3 From 3f4ec4a8a4bd70bb340a5ba358e8aa4b622ee844 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Tue, 15 Jun 2010 21:31:46 +0000 Subject: Fix link of scummvm-static (for MacOS X bundle) when translation is enabled. svn-id: r49894 --- ports.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ports.mk b/ports.mk index 8f51ebb005..0feaacbea3 100644 --- a/ports.mk +++ b/ports.mk @@ -101,6 +101,10 @@ ifdef USE_ZLIB OSX_ZLIB ?= -lz endif +ifdef USE_TRANSLATION +OSX_ICONV ?= -liconv +endif + # Special target to create a static linked binary for Mac OS X. # We use -force_cpusubtype_ALL to ensure the binary runs on every # PowerPC machine. @@ -109,6 +113,7 @@ scummvm-static: $(OBJS) -framework CoreMIDI \ $(OSX_STATIC_LIBS) \ $(OSX_ZLIB) \ + $(OSX_ICONV) \ -lSystemStubs # Special target to create a static linked binary for the iPhone -- cgit v1.2.3 From 444a6b5976f1f5b41db1db94ae16a8987fff134c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 15 Jun 2010 23:12:34 +0000 Subject: Workaround bug #3003643 (MI1EGA German: Credit text incorrect) svn-id: r49895 --- engines/scumm/script_v5.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index b1545db0f3..5c20e0dfd3 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -2594,6 +2594,17 @@ void ScummEngine_v5::decodeParseString() { else strcpy((char *)tmpBuf+16, "^19^"); printString(textSlot, tmpBuf); + } else if (_game.id == GID_MONKEY_EGA && _roomResource == 30 && vm.slot[_currentScript].number == 411 && + strstr((const char *)_scriptPointer, "NCREDIT-NOTE-AMOUNT")) { + // WORKAROUND for bug #3003643 (MI1EGA German: Credit text incorrect) + // The script contains buggy text. + const char *tmp = strstr((const char *)_scriptPointer, "NCREDIT-NOTE-AMOUNT"); + char tmpBuf[256]; + const int diff = tmp - (const char *)_scriptPointer; + memcpy(tmpBuf, _scriptPointer, diff); + strcpy(tmpBuf + diff, "5000"); + strcpy(tmpBuf + diff + 4, tmp + sizeof("NCREDIT-NOTE-AMOUNT") - 1); + printString(textSlot, (byte *)tmpBuf); } else { printString(textSlot, _scriptPointer); } -- cgit v1.2.3 From 81926f106abce4d73a899962a7a1f3fd0307ff40 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 15 Jun 2010 23:45:13 +0000 Subject: Fix g++ warning "format not a string literal and no format arguments". svn-id: r49896 --- gui/massadd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/massadd.cpp b/gui/massadd.cpp index b981520cdc..7a597085c5 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -241,7 +241,7 @@ void MassAddDialog::handleTickle() { // Enable the OK button _okButton->setEnabled(true); - snprintf(buf, sizeof(buf), _("Scan complete!")); + snprintf(buf, sizeof(buf), "%s", _("Scan complete!")); _dirProgressText->setLabel(buf); snprintf(buf, sizeof(buf), _("Discovered %d new games."), _games.size()); -- cgit v1.2.3 From e7275161f431d0025a7e2bb47bc2d442670fd155 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 16 Jun 2010 00:24:16 +0000 Subject: SCI: Avoid using g_sci in resman (as it might not yet be inited) svn-id: r49897 --- engines/sci/resource.cpp | 40 +++++++++++++++++++--------------------- engines/sci/resource.h | 24 ++++++++++++------------ engines/sci/resource_audio.cpp | 6 +++--- engines/sci/resource_intern.h | 14 +++++++------- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index e167d50c1a..bda854cfd0 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -319,11 +319,11 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc static uint32 resTypeToMacTag(ResourceType type); void ResourceManager::loadResource(Resource *res) { - res->_source->loadResource(res); + res->_source->loadResource(this, res); } -void PatchResourceSource::loadResource(Resource *res) { +void PatchResourceSource::loadResource(ResourceManager *resMan, Resource *res) { bool result = res->loadFromPatchFile(); if (!result) { // TODO: We used to fallback to the "default" code here if loadFromPatchFile @@ -333,13 +333,13 @@ void PatchResourceSource::loadResource(Resource *res) { } } -void MacResourceForkResourceSource::loadResource(Resource *res) { +void MacResourceForkResourceSource::loadResource(ResourceManager *resMan, Resource *res) { Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->getNumber()); if (!stream) error("Could not get Mac resource fork resource: %d %d", res->getType(), res->getNumber()); - int error = res->decompress(stream); + int error = res->decompress(resMan->getVolVersion(), stream); if (error) { warning("Error %d occurred while reading %s from Mac resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); @@ -347,8 +347,7 @@ void MacResourceForkResourceSource::loadResource(Resource *res) { } } -Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res) { - ResourceManager *resMan = g_sci->getResMan(); +Common::SeekableReadStream *ResourceSource::getVolumeFile(ResourceManager *resMan, Resource *res) { Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this); if (!fileStream) { @@ -360,8 +359,8 @@ Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res) { return fileStream; } -void WaveResourceSource::loadResource(Resource *res) { - Common::SeekableReadStream *fileStream = getVolumeFile(res); +void WaveResourceSource::loadResource(ResourceManager *resMan, Resource *res) { + Common::SeekableReadStream *fileStream = getVolumeFile(resMan, res); if (!fileStream) return; @@ -371,8 +370,8 @@ void WaveResourceSource::loadResource(Resource *res) { delete fileStream; } -void AudioVolumeResourceSource::loadResource(Resource *res) { - Common::SeekableReadStream *fileStream = getVolumeFile(res); +void AudioVolumeResourceSource::loadResource(ResourceManager *resMan, Resource *res) { + Common::SeekableReadStream *fileStream = getVolumeFile(resMan, res); if (!fileStream) return; @@ -429,14 +428,14 @@ void AudioVolumeResourceSource::loadResource(Resource *res) { delete fileStream; } -void ResourceSource::loadResource(Resource *res) { - Common::SeekableReadStream *fileStream = getVolumeFile(res); +void ResourceSource::loadResource(ResourceManager *resMan, Resource *res) { + Common::SeekableReadStream *fileStream = getVolumeFile(resMan, res); if (!fileStream) return; fileStream->seek(res->_fileOffset, SEEK_SET); - int error = res->decompress(fileStream); + int error = res->decompress(resMan->getVolVersion(), fileStream); if (error) { warning("Error %d occurred while reading %s from resource file: %s", error, res->_id.toString().c_str(), sci_error_types[error]); @@ -606,9 +605,9 @@ int ResourceManager::addInternalSources() { ResourceSource *src = addSource(new IntMapResourceSource("MAP", itr->getNumber())); if ((itr->getNumber() == 65535) && Common::File::exists("RESOURCE.SFX")) - addSource(new AudioVolumeResourceSource("RESOURCE.SFX", src, 0)); + addSource(new AudioVolumeResourceSource(this, "RESOURCE.SFX", src, 0)); else if (Common::File::exists("RESOURCE.AUD")) - addSource(new AudioVolumeResourceSource("RESOURCE.AUD", src, 0)); + addSource(new AudioVolumeResourceSource(this, "RESOURCE.AUD", src, 0)); ++itr; } @@ -1506,7 +1505,7 @@ Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, return res; } -int Resource::readResourceInfo(Common::SeekableReadStream *file, +int Resource::readResourceInfo(ResVersion volVersion, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression) { // SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes // SCI1 volume format: {bResType wResNumber wPacked+4 wUnpacked wCompression} = 9 bytes @@ -1516,8 +1515,7 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file, uint32 wCompression, szUnpacked; ResourceType type; - ResourceManager *resMan = g_sci->getResMan(); - switch (resMan->getVolVersion()) { + switch (volVersion) { case kResVersionSci0Sci1Early: case kResVersionSci1Middle: w = file->readUint16LE(); @@ -1604,13 +1602,13 @@ int Resource::readResourceInfo(Common::SeekableReadStream *file, return compression == kCompUnknown ? SCI_ERROR_UNKNOWN_COMPRESSION : 0; } -int Resource::decompress(Common::SeekableReadStream *file) { +int Resource::decompress(ResVersion volVersion, Common::SeekableReadStream *file) { int error; uint32 szPacked = 0; ResourceCompression compression = kCompUnknown; // fill resource info - error = readResourceInfo(file, szPacked, compression); + error = readResourceInfo(volVersion, file, szPacked, compression); if (error) return error; @@ -1675,7 +1673,7 @@ ResourceCompression ResourceManager::getViewCompression() { uint32 szPacked; ResourceCompression compression; - if (res->readResourceInfo(fileStream, szPacked, compression)) { + if (res->readResourceInfo(_volVersion, fileStream, szPacked, compression)) { if (res->_source->_resourceFile) delete fileStream; continue; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 9cf7120ed7..13eb6567ab 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -110,6 +110,16 @@ enum ResourceType { const char *getResourceTypeName(ResourceType restype); +enum ResVersion { + kResVersionUnknown, + kResVersionSci0Sci1Early, + kResVersionSci1Middle, + kResVersionSci1Late, + kResVersionSci11, + kResVersionSci11Mac, + kResVersionSci32 +}; + class ResourceManager; class ResourceSource; @@ -223,22 +233,12 @@ protected: bool loadFromWaveFile(Common::SeekableReadStream *file); bool loadFromAudioVolumeSCI1(Common::SeekableReadStream *file); bool loadFromAudioVolumeSCI11(Common::SeekableReadStream *file); - int decompress(Common::SeekableReadStream *file); - int readResourceInfo(Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); + int decompress(ResVersion volVersion, Common::SeekableReadStream *file); + int readResourceInfo(ResVersion volVersion, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); }; typedef Common::HashMap ResourceMap; -enum ResVersion { - kResVersionUnknown, - kResVersionSci0Sci1Early, - kResVersionSci1Middle, - kResVersionSci1Late, - kResVersionSci11, - kResVersionSci11Mac, - kResVersionSci32 -}; - class ResourceManager { // FIXME: These 'friend' declarations are meant to be a temporary hack to // ease transition to the ResourceSource class system. diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index fc30047e1c..c98b5387be 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -34,7 +34,7 @@ namespace Sci { -AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum) +AudioVolumeResourceSource::AudioVolumeResourceSource(ResourceManager *resMan, const Common::String &name, ResourceSource *map, int volNum) : VolumeResourceSource(name, map, volNum, kSourceAudioVolume) { _audioCompressionType = 0; @@ -46,7 +46,7 @@ AudioVolumeResourceSource::AudioVolumeResourceSource(const Common::String &name, * table for later usage. */ - Common::SeekableReadStream *fileStream = getVolumeFile(0); + Common::SeekableReadStream *fileStream = getVolumeFile(resMan, 0); if (!fileStream) return; @@ -439,7 +439,7 @@ void ResourceManager::setAudioLanguage(int language) { const char *dot = strrchr(name.c_str(), '.'); int number = atoi(dot + 1); - addSource(new AudioVolumeResourceSource(name, _audioMapSCI1, number)); + addSource(new AudioVolumeResourceSource(this, name, _audioMapSCI1, number)); } scanNewSources(); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 7993fc303e..45421dd722 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -66,7 +66,7 @@ public: const Common::String &getLocationName() const { return _name; } // Auxiliary method, used by loadResource implementations. - Common::SeekableReadStream *getVolumeFile(Resource *res); + Common::SeekableReadStream *getVolumeFile(ResourceManager *resMan, Resource *res); /** * TODO: Document this @@ -83,7 +83,7 @@ public: /** * Load a resource. */ - virtual void loadResource(Resource *res); + virtual void loadResource(ResourceManager *resMan, Resource *res); // FIXME: This audio specific method is a hack. After all, why should a // ResourceSource or a Resource (which uses this method) have audio @@ -102,7 +102,7 @@ class PatchResourceSource : public ResourceSource { public: PatchResourceSource(const Common::String &name) : ResourceSource(kSourcePatch, name) {} - virtual void loadResource(Resource *res); + virtual void loadResource(ResourceManager *resMan, Resource *res); }; class VolumeResourceSource : public ResourceSource { @@ -149,9 +149,9 @@ protected: int32 *_audioCompressionOffsetMapping; public: - AudioVolumeResourceSource(const Common::String &name, ResourceSource *map, int volNum); + AudioVolumeResourceSource(ResourceManager *resMan, const Common::String &name, ResourceSource *map, int volNum); - virtual void loadResource(Resource *res); + virtual void loadResource(ResourceManager *resMan, Resource *res); virtual uint32 getAudioCompressionType() const; }; @@ -169,7 +169,7 @@ class WaveResourceSource : public ResourceSource { public: WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {} - virtual void loadResource(Resource *res); + virtual void loadResource(ResourceManager *resMan, Resource *res); }; /** @@ -185,7 +185,7 @@ public: virtual void scanSource(ResourceManager *resMan); - virtual void loadResource(Resource *res); + virtual void loadResource(ResourceManager *resMan, Resource *res); }; } // End of namespace Sci -- cgit v1.2.3 From 408bfa20981bfef70b904cdc396c175c9612b7c7 Mon Sep 17 00:00:00 2001 From: David Turner Date: Wed, 16 Jun 2010 04:47:18 +0000 Subject: Fixed QDM2 to working state. Major issue was that the input frames are reused 16 times to produce output frames. Thanks to clone2727 for helping with this. svn-id: r49900 --- graphics/video/codecs/qdm2.cpp | 159 +++++++++++++++-------------------------- graphics/video/qt_decoder.cpp | 4 +- 2 files changed, 60 insertions(+), 103 deletions(-) diff --git a/graphics/video/codecs/qdm2.cpp b/graphics/video/codecs/qdm2.cpp index e12be21303..9f151b4ba8 100644 --- a/graphics/video/codecs/qdm2.cpp +++ b/graphics/video/codecs/qdm2.cpp @@ -157,7 +157,7 @@ public: ~QDM2Stream(); bool isStereo() const { return _channels == 2; } - bool endOfData() const { return ((_stream->pos() == _stream->size()) && (_outputSamples.size() == 0)); } + bool endOfData() const { return _stream->pos() >= _stream->size() && _outputSamples.size() == 0 && _subPacket == 0; } int getRate() const { return _sampleRate; } int readBuffer(int16 *buffer, const int numSamples); @@ -199,7 +199,7 @@ private: int _fftCoefsMinIndex[5]; int _fftCoefsMaxIndex[5]; int _fftLevelExp[6]; - //RDFTContext _rdftCtx; + RDFTContext _rdftCtx; QDM2FFT _fft; // I/O data @@ -230,6 +230,7 @@ private: int _doSynthFilter; // used to perform or skip synthesis filter uint8 _subPacket; // 0 to 15 + uint32 _superBlockStart; int _noiseIdx; // index for dithering noise table byte _emptyBuffer[FF_INPUT_BUFFER_PADDING_SIZE]; @@ -261,8 +262,6 @@ private: float _noiseSamples[128]; void initNoiseSamples(void); - RDFTContext _rdftCtx; - void average_quantized_coeffs(void); void build_sb_samples_from_noise(int sb); void fix_coding_method_array(int sb, int channels, sb_int8_array coding_method); @@ -331,8 +330,6 @@ static inline int scummvm_log2(int n) { static inline void initGetBits(GetBitContext *s, const uint8 *buffer, int bitSize) { int bufferSize = (bitSize + 7) >> 3; - debug(1, "void initGetBits(GetBitContext *s, const uint8 *buffer, int bitSize)"); - if (bufferSize < 0 || bitSize < 0) { bufferSize = bitSize = 0; buffer = NULL; @@ -345,7 +342,6 @@ static inline void initGetBits(GetBitContext *s, const uint8 *buffer, int bitSiz } static inline int getBitsCount(GetBitContext *s) { - debug(1, "int getBitsCount(GetBitContext *s)"); return s->index; } @@ -353,13 +349,9 @@ static inline unsigned int getBits1(GetBitContext *s) { int index; uint8 result; - debug(1, "unsigned int getBits1(GetBitContext *s)"); - index = s->index; result = s->buffer[index >> 3]; - debug(1, "index : %d", index); - result >>= (index & 0x07); result &= 1; index++; @@ -371,12 +363,8 @@ static inline unsigned int getBits1(GetBitContext *s) { static inline unsigned int getBits(GetBitContext *s, int n) { int tmp, reCache, reIndex; - debug(1, "unsigned int getBits(GetBitContext *s, int n)"); - reIndex = s->index; - debug(1, "reIndex : %d", reIndex); - reCache = READ_LE_UINT32((const uint8 *)s->buffer + (reIndex >> 3)) >> (reIndex & 0x07); tmp = (reCache) & ((uint32)0xffffffff >> (32 - n)); @@ -389,13 +377,9 @@ static inline unsigned int getBits(GetBitContext *s, int n) { static inline void skipBits(GetBitContext *s, int n) { int reIndex, reCache; - debug(1, "void skipBits(GetBitContext *s, int n)"); - reIndex = s->index; reCache = 0; - debug(1, "reIndex : %d", reIndex); - reCache = READ_LE_UINT32((const uint8 *)s->buffer + (reIndex >> 3)) >> (reIndex & 0x07); s->index = reIndex + n; } @@ -1331,20 +1315,12 @@ static int getVlc2(GetBitContext *s, int16 (*table)[2], int bits, int maxDepth) int code; int n; - debug(1, "int getVlc2(GetBitContext *s, int16 (*table)[2], int bits, int maxDepth)"); - reIndex = s->index; reCache = READ_LE_UINT32(s->buffer + (reIndex >> 3)) >> (reIndex & 0x07); index = reCache & (0xffffffff >> (32 - bits)); code = table[index][0]; n = table[index][1]; - debug(1, "reIndex : %d", reIndex); - debug(1, "reCache : %d", reCache); - debug(1, "index : %d", index); - debug(1, "code : %d", code); - debug(1, "n : %d", n); - if (maxDepth > 1 && n < 0){ reIndex += bits; reCache = READ_LE_UINT32(s->buffer + (reIndex >> 3)) >> (reIndex & 0x07); @@ -1416,7 +1392,6 @@ static int build_table(VLC *vlc, int table_nb_bits, table_size = 1 << table_nb_bits; table_index = allocTable(vlc, table_size, flags & 4); - debug(2, "QDM2 new table index=%d size=%d code_prefix=%x n=%d", table_index, table_size, code_prefix, n_prefix); if (table_index < 0) return -1; table = &vlc->table[table_index]; @@ -1437,7 +1412,6 @@ static int build_table(VLC *vlc, int table_nb_bits, symbol = i; else GET_DATA(symbol, symbols, i, symbols_wrap, symbols_size); - debug(2, "QDM2 i=%d n=%d code=0x%x", i, n, code); // if code matches the prefix, it is in the table n -= n_prefix; if(flags & 2) @@ -1452,7 +1426,6 @@ static int build_table(VLC *vlc, int table_nb_bits, for(k = 0; k < nb; k++) { if(flags & 2) j = (code >> n_prefix) + (k<> ((flags & 2) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); - debug(2, "QDM2 %4x: n=%d (subtable)", j, n); // compute table size n1 = -table[j][1]; //bits if (n > n1) @@ -1537,8 +1509,6 @@ void initVlcSparse(VLC *vlc, int nb_bits, int nb_codes, error("called on a partially initialized table"); } - debug(2, "QDM2 build table nb_codes=%d", nb_codes); - if (build_table(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, @@ -1754,6 +1724,7 @@ QDM2Stream::QDM2Stream(Common::SeekableReadStream *stream, Common::SeekableReadS _stream = stream; _compressedData = NULL; _subPacket = 0; + _superBlockStart = 0; memset(_quantizedCoeffs, 0, sizeof(_quantizedCoeffs)); memset(_fftLevelExp, 0, sizeof(_fftLevelExp)); _noiseIdx = 0; @@ -2015,8 +1986,6 @@ static void qdm2_decode_sub_packet_header(GetBitContext *gb, QDM2SubPacket *sub_ sub_packet->data = &gb->buffer[getBitsCount(gb) / 8]; // FIXME: this depends on bitreader internal data } - - debug(1, "QDM2 Subpacket: type=%d size=%d start_offs=%x", sub_packet->type, sub_packet->size, getBitsCount(gb) / 8); } /** @@ -2881,7 +2850,6 @@ void QDM2Stream::qdm2_fft_init_coefficient(int sub_packet, int offset, int durat } void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) { - debug(1, "QDM2Stream::qdm2_fft_decode_tones() duration: %d b:%d", duration, b); int channel, stereo, phase, exp; int local_int_4, local_int_8, stereo_phase, local_int_10; int local_int_14, stereo_exp, local_int_20, local_int_28; @@ -2896,9 +2864,7 @@ void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) { while (1) { if (_superblocktype_2_3) { - debug(1, "QDM2Stream::qdm2_fft_decode_tones() local_int_8: %d", local_int_8); while ((n = qdm2_get_vlc(gb, &_vlcTabFftToneOffset[local_int_8], 1, 2)) < 2) { - debug(1, "QDM2Stream::qdm2_fft_decode_tones() local_int_8: %d", local_int_8); offset = 1; if (n == 0) { local_int_4 += local_int_10; @@ -2959,7 +2925,6 @@ void QDM2Stream::qdm2_fft_decode_tones(int duration, GetBitContext *gb, int b) { } void QDM2Stream::qdm2_decode_fft_packets(void) { - debug(1, "QDM2Stream::qdm2_decode_fft_packets()"); int i, j, min, max, value, type, unknown_flag; GetBitContext gb; @@ -2994,7 +2959,6 @@ void QDM2Stream::qdm2_decode_fft_packets(void) { return; // decode FFT tones - debug(1, "QDM2Stream::qdm2_decode_fft_packets initGetBits() packet->size*8: %d", packet->size*8); initGetBits(&gb, packet->data, packet->size*8); if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16]) @@ -3008,19 +2972,16 @@ void QDM2Stream::qdm2_decode_fft_packets(void) { int duration = _subSampling + 5 - (type & 15); if (duration >= 0 && duration < 4) { // TODO: Should be <= 4? - debug(1, "QDM2Stream::qdm2_decode_fft_packets qdm2_fft_decode_tones() #1"); qdm2_fft_decode_tones(duration, &gb, unknown_flag); } } else if (type == 31) { for (j=0; j < 4; j++) { - debug(1, "QDM2Stream::qdm2_decode_fft_packets qdm2_fft_decode_tones() #2"); qdm2_fft_decode_tones(j, &gb, unknown_flag); } } else if (type == 46) { for (j=0; j < 6; j++) _fftLevelExp[j] = getBits(&gb, 6); for (j=0; j < 4; j++) { - debug(1, "QDM2Stream::qdm2_decode_fft_packets qdm2_fft_decode_tones() #3"); qdm2_fft_decode_tones(j, &gb, unknown_flag); } } @@ -3151,16 +3112,12 @@ void QDM2Stream::qdm2_fft_tone_synthesizer(uint8 sub_packet) { } void QDM2Stream::qdm2_calculate_fft(int channel) { - debug(1, "QDM2Stream::qdm2_calculate_fft channel: %d", channel); const float gain = (_channels == 1 && _channels == 2) ? 0.5f : 1.0f; int i; _fft.complex[channel][0].re *= 2.0f; _fft.complex[channel][0].im = 0.0f; - //debug(1, "QDM2Stream::qdm2_calculate_fft _fft.complex[channel][0].re: %lf", _fft.complex[channel][0].re); - //debug(1, "QDM2Stream::qdm2_calculate_fft _fft.complex[channel][0].im: %lf", _fft.complex[channel][0].im); - rdftCalc(&_rdftCtx, (float *)_fft.complex[channel]); // add samples to output buffer @@ -3209,82 +3166,80 @@ int QDM2Stream::qdm2_decodeFrame(Common::SeekableReadStream *in) { int ch, i; const int frame_size = (_sFrameSize * _channels); + // If we're in any packet but the first, seek back to the first + if (_subPacket == 0) + _superBlockStart = in->pos(); + else + in->seek(_superBlockStart); + // select input buffer - if(in->eos() || in->size() == in->pos()) { + if (in->eos() || in->pos() >= in->size()) { debug(1, "QDM2Stream::qdm2_decodeFrame End of Input Stream"); return 0; } - if((in->size() - in->pos()) < _packetSize) { + + if ((in->size() - in->pos()) < _packetSize) { debug(1, "QDM2Stream::qdm2_decodeFrame Insufficient Packet Data in Input Stream Found: %d Need: %d", in->size() - in->pos(), _packetSize); return 0; } - in->read(_compressedData, _packetSize); - debug(1, "QDM2Stream::qdm2_decodeFrame constructed input data"); + if (!in->eos()) { + in->read(_compressedData, _packetSize); + debug(1, "QDM2Stream::qdm2_decodeFrame constructed input data"); + } // copy old block, clear new block of output samples memmove(_outputBuffer, &_outputBuffer[frame_size], frame_size * sizeof(float)); memset(&_outputBuffer[frame_size], 0, frame_size * sizeof(float)); debug(1, "QDM2Stream::qdm2_decodeFrame cleared outputBuffer"); - // decode block of QDM2 compressed data - debug(1, "QDM2Stream::qdm2_decodeFrame decode block of QDM2 compressed data"); - if (_subPacket == 0) { - _hasErrors = false; // reset it for a new super block - debug(1, "QDM2 : Superblock follows"); - qdm2_decode_super_block(); - } - - // parse subpackets - debug(1, "QDM2Stream::qdm2_decodeFrame parse subpackets"); - if (!_hasErrors) { - if (_subPacket == 2) { - debug(1, "QDM2Stream::qdm2_decodeFrame qdm2_decode_fft_packets()"); - qdm2_decode_fft_packets(); + if (!in->eos()) { + // decode block of QDM2 compressed data + debug(1, "QDM2Stream::qdm2_decodeFrame decode block of QDM2 compressed data"); + if (_subPacket == 0) { + _hasErrors = false; // reset it for a new super block + debug(1, "QDM2 : Superblock follows"); + qdm2_decode_super_block(); } - debug(1, "QDM2Stream::qdm2_decodeFrame qdm2_fft_tone_synthesizer(%d)", _subPacket); - qdm2_fft_tone_synthesizer(_subPacket); - } - - // sound synthesis stage 1 (FFT) - debug(1, "QDM2Stream::qdm2_decodeFrame sound synthesis stage 1 (FFT)"); - for (ch = 0; ch < _channels; ch++) { - qdm2_calculate_fft(ch); + // parse subpackets + debug(1, "QDM2Stream::qdm2_decodeFrame parse subpackets"); + if (!_hasErrors) { + if (_subPacket == 2) { + debug(1, "QDM2Stream::qdm2_decodeFrame qdm2_decode_fft_packets()"); + qdm2_decode_fft_packets(); + } - if (!_hasErrors && _subPacketListC[0].packet != NULL) { - error("QDM2 : has errors, and C list is not empty"); - return 0; + debug(1, "QDM2Stream::qdm2_decodeFrame qdm2_fft_tone_synthesizer(%d)", _subPacket); + qdm2_fft_tone_synthesizer(_subPacket); } - } - // sound synthesis stage 2 (MPEG audio like synthesis filter) - debug(1, "QDM2Stream::qdm2_decodeFrame sound synthesis stage 2 (MPEG audio like synthesis filter)"); - if (!_hasErrors && _doSynthFilter) - qdm2_synthesis_filter(_subPacket); + // sound synthesis stage 1 (FFT) + debug(1, "QDM2Stream::qdm2_decodeFrame sound synthesis stage 1 (FFT)"); + for (ch = 0; ch < _channels; ch++) { + qdm2_calculate_fft(ch); - _subPacket = (_subPacket + 1) % 16; + if (!_hasErrors && _subPacketListC[0].packet != NULL) { + error("QDM2 : has errors, and C list is not empty"); + return 0; + } + } - if(_hasErrors) - warning("QDM2 Packet error..."); + // sound synthesis stage 2 (MPEG audio like synthesis filter) + debug(1, "QDM2Stream::qdm2_decodeFrame sound synthesis stage 2 (MPEG audio like synthesis filter)"); + if (!_hasErrors && _doSynthFilter) + qdm2_synthesis_filter(_subPacket); - // clip and convert output float[] to 16bit signed samples - debug(1, "QDM2Stream::qdm2_decodeFrame clip and convert output float[] to 16bit signed samples"); + _subPacket = (_subPacket + 1) % 16; -/* - debugN(1, "Input Data Packet:"); - for(i = 0; i < _packetSize; i++) { - debugN(1, " %d", _compressedData[i]); - } - debugN(1, " Output Data Packet:"); - for(i = 0; i < frame_size; i++) { - debugN(1, " %d", (int)_outputBuffer[i]); + if(_hasErrors) + warning("QDM2 Packet error..."); + + // clip and convert output float[] to 16bit signed samples + debug(1, "QDM2Stream::qdm2_decodeFrame clip and convert output float[] to 16bit signed samples"); } - debug(1, ""); -*/ for (i = 0; i < frame_size; i++) { - //debug(1, "QDM2Stream::qdm2_decodeFrame i: %d", i); int value = (int)_outputBuffer[i]; if (value > SOFTCLIP_THRESHOLD) @@ -3302,17 +3257,17 @@ int QDM2Stream::readBuffer(int16 *buffer, const int numSamples) { int32 decodedSamples = _outputSamples.size(); int32 i; - //while((int)_outputSamples.size() < numSamples) { - while(!_stream->eos() && _stream->pos() != _stream->size()) { + while (decodedSamples < numSamples) { i = qdm2_decodeFrame(_stream); - if(i == 0) + if (i == 0) break; // Out Of Decode Frames... decodedSamples += i; } - if(decodedSamples > numSamples) + + if (decodedSamples > numSamples) decodedSamples = numSamples; - for(i = 0; i < decodedSamples; i++) + for (i = 0; i < decodedSamples; i++) buffer[i] = _outputSamples.remove_at(0); return decodedSamples; diff --git a/graphics/video/qt_decoder.cpp b/graphics/video/qt_decoder.cpp index 49d2b0aed9..842c38f315 100644 --- a/graphics/video/qt_decoder.cpp +++ b/graphics/video/qt_decoder.cpp @@ -191,8 +191,10 @@ Codec *QuickTimeDecoder::createCodec(uint32 codecTag, byte bitsPerPixel) { } void QuickTimeDecoder::startAudio() { - if (_audStream) // No audio/audio not supported + if (_audStream) { // No audio/audio not supported + updateAudioBuffer(); g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audHandle, _audStream); + } } void QuickTimeDecoder::stopAudio() { -- cgit v1.2.3 From 8f962a8fc319f757ea281848a78bb6c5d5365203 Mon Sep 17 00:00:00 2001 From: David Turner Date: Wed, 16 Jun 2010 06:24:21 +0000 Subject: Fix for Tooltip calls causing valgrind errors. svn-id: r49901 --- gui/widget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/widget.cpp b/gui/widget.cpp index 27cae0123d..2d4306d26a 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -227,6 +227,7 @@ Common::String Widget::cleanupHotkey(const Common::String &label) { Tooltip::Tooltip(GuiManager *guiManager) : GuiObject(0, 0, 0, 0) { _guiManager = guiManager; + _visible = false; _maxWidth = -1; _storedState = 0; } -- cgit v1.2.3 From 4ac81f3d18c6d31d1e6291e53d128db9f7199f57 Mon Sep 17 00:00:00 2001 From: David Turner Date: Wed, 16 Jun 2010 07:22:54 +0000 Subject: Fix for Valgrind Uninitialised Error from SDL_Event in sdl backend and derived backends. svn-id: r49902 --- backends/platform/gp2x/events.cpp | 1 + backends/platform/gp2xwiz/gp2xwiz-events.cpp | 1 + backends/platform/sdl/events.cpp | 1 + backends/platform/wince/wince-sdl.cpp | 1 + 4 files changed, 4 insertions(+) diff --git a/backends/platform/gp2x/events.cpp b/backends/platform/gp2x/events.cpp index 496e045ab0..a40967743c 100644 --- a/backends/platform/gp2x/events.cpp +++ b/backends/platform/gp2x/events.cpp @@ -229,6 +229,7 @@ int GP2X_BUTTON_STATE_L = false; bool OSystem_GP2X::pollEvent(Common::Event &event) { SDL_Event ev; + ev.type = SDL_NOEVENT; int axis; byte b = 0; diff --git a/backends/platform/gp2xwiz/gp2xwiz-events.cpp b/backends/platform/gp2xwiz/gp2xwiz-events.cpp index a69aa42967..19ef24ef58 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-events.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-events.cpp @@ -165,6 +165,7 @@ int GP2X_BUTTON_STATE_L = false; /* Override the SDL pollEvent with the Wiz's own event code. */ bool OSystem_GP2XWIZ::pollEvent(Common::Event &event) { SDL_Event ev; + ev.type = SDL_NOEVENT; int axis; byte b = 0; diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp index 1965cb3031..1c1d82730f 100644 --- a/backends/platform/sdl/events.cpp +++ b/backends/platform/sdl/events.cpp @@ -180,6 +180,7 @@ static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { bool OSystem_SDL::pollEvent(Common::Event &event) { SDL_Event ev; + ev.type = SDL_NOEVENT; handleKbdMouse(); diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index b3480702b5..970c9dce90 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -2263,6 +2263,7 @@ static int mapKeyCE(SDLKey key, SDLMod mod, Uint16 unicode, bool unfilter) { bool OSystem_WINCE3::pollEvent(Common::Event &event) { SDL_Event ev; + ev.type = SDL_NOEVENT; byte b = 0; DWORD currentTime; bool keyEvent = false; -- cgit v1.2.3 From e7e8808affc1a256b228da859e44ec3071c3a5a4 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Wed, 16 Jun 2010 09:04:27 +0000 Subject: PSP: got rid of SDL svn-id: r49903 --- backends/platform/psp/Makefile | 6 +---- backends/platform/psp/README.PSP | 2 -- backends/platform/psp/README.PSP.in | 2 -- backends/platform/psp/osys_psp.cpp | 49 ------------------------------------- backends/platform/psp/osys_psp.h | 4 --- configure | 9 +------ 6 files changed, 2 insertions(+), 70 deletions(-) diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile index 7f8bb63b0a..02fd8b022a 100644 --- a/backends/platform/psp/Makefile +++ b/backends/platform/psp/Makefile @@ -124,17 +124,13 @@ CXXFLAGS += -pg -g LDFLAGS += -pg endif -# SDL Libs and Flags -SDLFLAGS := $(shell $(PSPBIN)/sdl-config --cflags) -SDLLIBS := $(shell $(PSPBIN)/sdl-config --libs) # PSP LIBS PSPLIBS = -lpspprof -lpspvfpu -lpspdebug -lpspgu -lpspge -lpspdisplay -lpspctrl -lpspsdk \ -lpsputility -lpspuser -lpsppower -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lpspaudiocodec \ -lpspkernel # Add in PSPSDK includes and libraries. -CXXFLAGS += $(SDLFLAGS) -LIBS += -lpng -lSDL -lz $(findstring -lGL,$(SDLLIBS)) -lstdc++ -lc -lm $(filter -L%,$(SDLLIBS)) $(PSPLIBS) +LIBS += -lpng -lz -lstdc++ -lc -lm $(PSPLIBS) OBJS := powerman.o \ psp_main.o \ diff --git a/backends/platform/psp/README.PSP b/backends/platform/psp/README.PSP index 45f31483f7..f4d5bae6d6 100644 --- a/backends/platform/psp/README.PSP +++ b/backends/platform/psp/README.PSP @@ -99,8 +99,6 @@ To build ScummVM for PSP you need: Note: This usually gets installed by the PSP toolchain, so you don't have to do it manually. -- SDL (svn co svn://svn.pspdev.org/psp/trunk/SDL) - - zlib (svn co svn://svn.pspdev.org/psp/trunk/zlib) - libPNG (svn co svn://svn.pspdev.org/psp/trunk/libpng) diff --git a/backends/platform/psp/README.PSP.in b/backends/platform/psp/README.PSP.in index d9f75974f1..2d53fd3b47 100644 --- a/backends/platform/psp/README.PSP.in +++ b/backends/platform/psp/README.PSP.in @@ -99,8 +99,6 @@ To build ScummVM for PSP you need: Note: This usually gets installed by the PSP toolchain, so you don't have to do it manually. -- SDL (svn co svn://svn.pspdev.org/psp/trunk/SDL) - - zlib (svn co svn://svn.pspdev.org/psp/trunk/zlib) - libPNG (svn co svn://svn.pspdev.org/psp/trunk/libpng) diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 580e4f1cfd..01053b8cbb 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -48,8 +48,6 @@ #include "backends/platform/psp/trace.h" -#define USE_PSP_AUDIO - #define SAMPLES_PER_SEC 44100 static int timer_handler(int t) { @@ -58,14 +56,6 @@ static int timer_handler(int t) { return t; } -void OSystem_PSP::initSDL() { -#ifdef USE_PSP_AUDIO - SDL_Init(0); -#else - SDL_Init(SDL_INIT_AUDIO); -#endif -} - OSystem_PSP::~OSystem_PSP() {} #define PSP_SCREEN_WIDTH 480 @@ -89,8 +79,6 @@ void OSystem_PSP::initBackend() { _inputHandler.setKeyboard(&_keyboard); _inputHandler.init(); - initSDL(); - _savefile = new PSPSaveFileManager; _timer = new DefaultTimerManager(); @@ -388,7 +376,6 @@ void OSystem_PSP::setupMixer(void) { assert(!_mixer); -#ifdef USE_PSP_AUDIO if (!_audio.open(samplesPerSec, 2, samples, mixCallback, this)) { PSP_ERROR("failed to open audio\n"); return; @@ -398,46 +385,10 @@ void OSystem_PSP::setupMixer(void) { assert(_mixer); _mixer->setReady(true); _audio.unpause(); -#else - SDL_AudioSpec obtained; - SDL_AudioSpec desired; - - memset(&desired, 0, sizeof(desired)); - desired.freq = samplesPerSec; - desired.format = AUDIO_S16SYS; - desired.channels = 2; - desired.samples = samples; - desired.callback = mixCallback; - desired.userdata = this; - - if (SDL_OpenAudio(&desired, &obtained) != 0) { - warning("Could not open audio: %s", SDL_GetError()); - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(false); - } else { - // Note: This should be the obtained output rate, but it seems that at - // least on some platforms SDL will lie and claim it did get the rate - // even if it didn't. Probably only happens for "weird" rates, though. - samplesPerSec = obtained.freq; - - // Create the mixer instance and start the sound processing - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(true); - - SDL_PauseAudio(0); - } -#endif /* USE_PSP_AUDIO */ } void OSystem_PSP::quit() { -#ifdef USE_PSP_AUDIO _audio.close(); -#else - SDL_CloseAudio(); -#endif - SDL_Quit(); sceKernelExitGame(); } diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index 56a64ccb80..46f258f577 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -42,8 +42,6 @@ #include "backends/timer/psp/timer.h" #include "backends/platform/psp/thread.h" -#include - class OSystem_PSP : public BaseBackend { private: @@ -64,8 +62,6 @@ private: PspTimer _pspTimer; PspRtc _pspRtc; - void initSDL(); - public: OSystem_PSP() : _savefile(0), _mixer(0), _timer(0), _pendingUpdate(false), _pendingUpdateCounter(0) {} ~OSystem_PSP(); diff --git a/configure b/configure index 3b8dbe2471..41e6a46f44 100755 --- a/configure +++ b/configure @@ -2484,14 +2484,7 @@ case $_backend in ;; psp) DEFINES="$DEFINES -D__PSP__ -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" - INCLUDES="$INCLUDES -I$PSPDEV/psp/include/SDL" - LIBS="$LIBS -lpng -lSDL -Wl,-Map,mapfile.txt" - SDLLIBS=`$PSPDEV/psp/bin/sdl-config --libs` - - if `echo "$SDLLIBS" | grep ".*-lGL.*" 1>/dev/null 2>&1` - then - LIBS="$LIBS -lGL" - fi + LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" ;; samsungtv) find_sdlconfig -- cgit v1.2.3 From af65de6e1aaa197e17f10cd976ea2f5d15f0d7c8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 16 Jun 2010 21:02:58 +0000 Subject: SCI: implement channel remapping for SCI1 svn-id: r49905 --- engines/sci/console.cpp | 3 +- engines/sci/resource.h | 4 -- engines/sci/resource_audio.cpp | 3 -- engines/sci/sound/midiparser_sci.cpp | 76 ++++++++++++++++++++++++------------ engines/sci/sound/midiparser_sci.h | 25 ++++-------- engines/sci/sound/music.cpp | 64 +++++++++++++----------------- engines/sci/sound/music.h | 13 ++---- sound/midiparser.cpp | 22 ++++++----- sound/midiparser.h | 5 +++ 9 files changed, 109 insertions(+), 106 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 8fc49fa396..ebe7edecbe 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -859,7 +859,8 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { SciVersion doSoundVersion = _engine->_features->detectDoSoundType(); MidiPlayer *player = MidiPlayer_Midi_create(doSoundVersion); - MidiParser_SCI *parser = new MidiParser_SCI(doSoundVersion); + MidiParser_SCI *parser; // = new MidiParser_SCI(doSoundVersion); + // FIXME: add SciMusic object parser->setMidiDriver(player); Common::List *resources = _engine->getResMan()->listResources(kResourceTypeSound); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 13eb6567ab..b37f71832d 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -513,7 +513,6 @@ public: Track *getDigitalTrack(); int getChannelFilterMask(int hardwareMask, bool wantsRhythm); byte getInitialVoiceCount(byte channel); - bool isChannelUsed(byte channel) const { return _channelsUsed & (1 << channel); } private: SciVersion _soundVersion; @@ -521,9 +520,6 @@ private: Track *_tracks; Resource *_innerResource; ResourceManager *_resMan; - uint16 _channelsUsed; - - void setChannelUsed(byte channel) { _channelsUsed |= (1 << channel); } }; } // End of namespace Sci diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index c98b5387be..72fd8f4594 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -461,8 +461,6 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi byte *dataEnd; Channel *channel, *sampleChannel; - _channelsUsed = 0; - switch (_soundVersion) { case SCI_VERSION_0_EARLY: case SCI_VERSION_0_LATE: @@ -552,7 +550,6 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi channel->data = resource->data + READ_LE_UINT16(data + 2) + 2; channel->size = READ_LE_UINT16(data + 4) - 2; // Not counting channel header channel->number = *(channel->data - 2); - setChannelUsed(channel->number); channel->poly = *(channel->data - 1); channel->time = channel->prev = 0; if (channel->number == 0xFE) { // Digital channel diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index c74a7eae11..8bc9b97926 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -43,9 +43,10 @@ enum SciMidiCommands { // MidiParser_SCI // -MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion) : +MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : MidiParser() { _soundVersion = soundVersion; + _music = music; _mixedData = NULL; // mididata contains delta in 1/60th second // values of ppqn and tempo are found experimentally and may be wrong @@ -59,10 +60,6 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion) : _dataincAdd = false; _dataincToAdd = 0; _resetOnPause = false; - _channelsUsed = 0; - - for (int i = 0; i < 16; i++) - _channelRemap[i] = i; } MidiParser_SCI::~MidiParser_SCI() { @@ -78,6 +75,13 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in if (_pSnd) setVolume(psnd->volume); + for (int i = 0; i < 15; i++) { + _channelUsed[i] = false; + _channelRemap[i] = -1; + } + _channelRemap[9] = 9; // never map channel 9, because that's used for percussion + _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally + if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection midiFilterChannels(channelFilterMask); @@ -128,21 +132,24 @@ void MidiParser_SCI::unloadMusic() { // Center the pitch wheels and hold pedal in preparation for the next piece of music if (_driver && _pSnd) { for (int i = 0; i < 16; ++i) { - if (isChannelUsed(i)) { - _driver->send(0xE0 | i, 0, 0x40); // Reset pitch wheel - _driver->send(0xB0 | i, 0x40, 0); // Reset hold pedal + int16 realChannel = _channelRemap[i]; + if (realChannel != -1) { + _driver->send(0xE0 | realChannel, 0, 0x40); // Reset pitch wheel + _driver->send(0xB0 | realChannel, 0x40, 0); // Reset hold pedal } } } +} - for (int i = 0; i < 16; i++) - _channelRemap[i] = i; +void MidiParser_SCI::sendToDriver(uint32 b) { + // Channel remapping + int16 realChannel = _channelRemap[b & 0xf]; + assert(realChannel != -1); + b = (b & 0xFFFFFFF0) | realChannel; + _driver->send(b); } void MidiParser_SCI::parseNextEvent(EventInfo &info) { - // Monitor which channels are used by this song - setChannelUsed(info.channel()); - // Set signal AFTER waiting for delta, otherwise we would set signal too soon resulting in all sorts of bugs if (_dataincAdd) { _dataincAdd = false; @@ -334,8 +341,9 @@ void MidiParser_SCI::allNotesOff() { // Turn off all active notes for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { - if ((_active_notes[i] & (1 << j)) && isChannelUsed(j)){ - _driver->send(0x80 | j, i, 0); + int16 realChannel = _channelRemap[j]; + if ((_active_notes[i] & (1 << j)) && realChannel != -1){ + _driver->send(0x80 | realChannel, i, 0); } } } @@ -353,8 +361,9 @@ void MidiParser_SCI::allNotesOff() { // support this...). for (i = 0; i < 16; ++i) { - if (isChannelUsed(i)) - _driver->send(0xB0 | i, 0x7b, 0); // All notes off + int16 realChannel = _channelRemap[i]; + if (realChannel != -1) + _driver->send(0xB0 | realChannel, 0x7b, 0); // All notes off } memset(_active_notes, 0, sizeof(_active_notes)); @@ -436,19 +445,23 @@ byte *MidiParser_SCI::midiMixChannels() { default: // MIDI command if (command & 0x80) { par1 = *channel->data++; - - // TODO: Fix remapping - -#if 0 - // Remap channel. Keep the upper 4 bits (command code) and change - // the lower 4 bits (channel) - byte remappedChannel = _channelRemap[par1 & 0xF]; - par1 = (par1 & 0xF0) | (remappedChannel & 0xF); -#endif } else {// running status par1 = command; command = channel->prev; } + + // remember which channel got used for channel remapping + byte midiChannel = command & 0xF; + _channelUsed[midiChannel] = true; +// int16 realChannel = _channelRemap[midiChannel]; +// if (realChannel == -1) { +// // We don't own this channel yet, so ask SciMusic to get it (or a remapped one) +// realChannel = _music->tryToOwnChannel(_pSnd, midiChannel); +// _channelRemap[midiChannel] = realChannel; +// } +// // Map new channel +// command = realChannel | (command & 0xF0); + if (command != global_prev) *outData++ = command; // out command *outData++ = par1;// pout par1 @@ -577,6 +590,17 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) { return _mixedData; } +// This will get called right before actual playing and will try to own the used channels +void MidiParser_SCI::tryToOwnChannels() { + for (int curChannel = 0; curChannel < 15; curChannel++) { + if (_channelUsed[curChannel]) { + if (_channelRemap[curChannel] == -1) { + _channelRemap[curChannel] = _music->tryToOwnChannel(_pSnd, curChannel); + } + } + } +} + void MidiParser_SCI::setVolume(byte volume) { // FIXME: This receives values > 127... throw a warning for now and clip the variable if (volume > MUSIC_VOLUME_MAX) { diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 80401460d2..4888fa06ca 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -53,7 +53,7 @@ namespace Sci { */ class MidiParser_SCI : public MidiParser { public: - MidiParser_SCI(SciVersion soundVersion); + MidiParser_SCI(SciVersion soundVersion, SciMusic *music); ~MidiParser_SCI(); bool loadMusic(SoundResource::Track *track, MusicEntry *psnd, int channelFilterMask, SciVersion soundVersion); bool loadMusic(byte *, uint32) { @@ -73,25 +73,19 @@ public: void allNotesOff(); - void remapChannel(byte channel, byte newChannel) { - assert(channel < 0xF); // don't touch special SCI channel 15 - assert(newChannel < 0xF); // don't touch special SCI channel 15 - _channelRemap[channel] = newChannel; - } - - void clearUsedChannels() { _channelsUsed = 0; } - const byte *getMixedData() const { return _mixedData; } -protected: - bool isChannelUsed(byte channel) const { return _channelsUsed & (1 << channel); } - void setChannelUsed(byte channel) { _channelsUsed |= (1 << channel); } + void tryToOwnChannels(); +protected: + void sendToDriver(uint32 b); void parseNextEvent(EventInfo &info); byte *midiMixChannels(); byte *midiFilterChannels(int channelMask); byte midiGetNextChannel(long ticker); + SciMusic *_music; + SciVersion _soundVersion; byte *_mixedData; SoundResource::Track *_track; @@ -105,11 +99,8 @@ protected: int16 _dataincToAdd; bool _resetOnPause; - // A 16-bit mask, containing the channels used - // by the currently parsed song - uint16 _channelsUsed; - - byte _channelRemap[16]; + bool _channelUsed[16]; + int16 _channelRemap[16]; }; } // End of namespace Sci diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 254c70a24f..69e1c180e8 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -43,6 +43,9 @@ SciMusic::SciMusic(SciVersion soundVersion) // Reserve some space in the playlist, to avoid expensive insertion // operations _playList.reserve(10); + + for (int i = 0; i < 16; i++) + _usedChannel[i] = 0; } SciMusic::~SciMusic() { @@ -174,20 +177,6 @@ void SciMusic::sortPlayList() { Common::sort(_playList.begin(), _playList.end(), musicEntryCompare); } -void SciMusic::findUsedChannels() { - // Reset list - for (int k = 0; k < 16; k++) - _usedChannels[k] = false; - - const MusicList::const_iterator end = _playList.end(); - for (MusicList::const_iterator i = _playList.begin(); i != end; ++i) { - for (int channel = 0; channel < 16; channel++) { - if ((*i)->soundRes && (*i)->soundRes->isChannelUsed(channel)) - _usedChannels[channel] = true; - } - } -} - void SciMusic::soundInitSnd(MusicEntry *pSnd) { int channelFilterMask = 0; SoundResource::Track *track = pSnd->soundRes->getTrackByType(_pMidiDrv->getPlayId()); @@ -224,34 +213,13 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { _mutex.lock(); pSnd->soundType = Audio::Mixer::kMusicSoundType; if (pSnd->pMidiParser == NULL) { - pSnd->pMidiParser = new MidiParser_SCI(_soundVersion); + pSnd->pMidiParser = new MidiParser_SCI(_soundVersion, this); pSnd->pMidiParser->setMidiDriver(_pMidiDrv); pSnd->pMidiParser->setTimerRate(_dwTempo); } pSnd->pauseCounter = 0; - // TODO: Fix channel remapping. This doesn't quite work... (e.g. no difference in LSL1VGA) -#if 0 - // Remap channels - findUsedChannels(); - - pSnd->pMidiParser->clearUsedChannels(); - - for (int i = 0; i < 16; i++) { - if (_usedChannels[i] && pSnd->soundRes->isChannelUsed(i)) { - int16 newChannel = getNextUnusedChannel(); - if (newChannel >= 0) { - _usedChannels[newChannel] = true; - debug("Remapping channel %d to %d\n", i, newChannel); - pSnd->pMidiParser->remapChannel(i, newChannel); - } else { - warning("Attempt to remap channel %d, but no unused channels exist", i); - } - } - } -#endif - // Find out what channels to filter for SCI0 channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayId(), _pMidiDrv->hasRhythmChannel()); pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion); @@ -263,6 +231,24 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { } } +// This one checks, if requested channel is available -> in that case give caller that channel +// Otherwise look for an unused one +int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { + if (!_usedChannel[bestChannel]) { + // currently unused, so give it to caller directly + _usedChannel[bestChannel] = caller; + return bestChannel; + } + // otherwise look for unused channel + for (int channelNr = 0; channelNr < 15; channelNr++) { + if (!_usedChannel[channelNr]) { + _usedChannel[channelNr] = caller; + return channelNr; + } + } + error("no free channels"); +} + void SciMusic::onTimer() { const MusicList::iterator end = _playList.end(); for (MusicList::iterator i = _playList.begin(); i != end; ++i) @@ -324,6 +310,7 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { DisposeAfterUse::NO); } } else { + pSnd->pMidiParser->tryToOwnChannels(); _mutex.lock(); if (pSnd->pMidiParser) { pSnd->pMidiParser->setVolume(pSnd->volume); @@ -388,6 +375,11 @@ void SciMusic::soundKill(MusicEntry *pSnd) { _mutex.lock(); uint sz = _playList.size(), i; + // Remove used channels + for (i = 0; i < 15; i++) { + if (_usedChannel[i] == pSnd) + _usedChannel[i] = 0; + } // Remove sound from playlist for (i = 0; i < sz; i++) { if (_playList[i] == pSnd) { diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 83cd59e89b..bbafb808cb 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -196,6 +196,8 @@ public: // where a deadlock can occur Common::Mutex _mutex; + int16 tryToOwnChannel(MusicEntry *caller, int16 bestChannel); + protected: void sortPlayList(); @@ -210,20 +212,11 @@ protected: bool _bMultiMidi; private: static void miditimerCallback(void *p); - void findUsedChannels(); - int16 getNextUnusedChannel() const { - for (int i = 0; i < 16; i++) { - if (!_usedChannels[i]) - return i; - } - - return -1; - } MusicList _playList; bool _soundOn; byte _masterVolume; - bool _usedChannels[16]; + MusicEntry *_usedChannel[16]; }; } // End of namespace Sci diff --git a/sound/midiparser.cpp b/sound/midiparser.cpp index 8ae2bad71a..d58471765e 100644 --- a/sound/midiparser.cpp +++ b/sound/midiparser.cpp @@ -67,6 +67,10 @@ void MidiParser::property(int prop, int value) { } } +void MidiParser::sendToDriver(uint32 b) { + _driver->send(b); +} + void MidiParser::setTempo(uint32 tempo) { _tempo = tempo; if (_ppqn) @@ -127,7 +131,7 @@ void MidiParser::hangingNote(byte channel, byte note, uint32 time_left, bool rec best = ptr; if (ptr->time_left) { if (recycle) - _driver->send(0x80 | channel, note, 0); + sendToDriver(0x80 | channel, note, 0); --_hanging_notes_count; } break; @@ -172,7 +176,7 @@ void MidiParser::onTimer() { for (i = ARRAYSIZE(_hanging_notes); i; --i, ++ptr) { if (ptr->time_left) { if (ptr->time_left <= _timer_rate) { - _driver->send(0x80 | ptr->channel, ptr->note, 0); + sendToDriver(0x80 | ptr->channel, ptr->note, 0); ptr->time_left = 0; --_hanging_notes_count; } else { @@ -232,7 +236,7 @@ void MidiParser::onTimer() { else activeNote(info.channel(), info.basic.param1, true); } - _driver->send(info.event, info.basic.param1, info.basic.param2); + sendToDriver(info.event, info.basic.param1, info.basic.param2); } @@ -258,7 +262,7 @@ void MidiParser::allNotesOff() { for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { if (_active_notes[i] & (1 << j)) { - _driver->send(0x80 | j, i, 0); + sendToDriver(0x80 | j, i, 0); } } } @@ -266,7 +270,7 @@ void MidiParser::allNotesOff() { // Turn off all hanging notes for (i = 0; i < ARRAYSIZE(_hanging_notes); i++) { if (_hanging_notes[i].time_left) { - _driver->send(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); + sendToDriver(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); _hanging_notes[i].time_left = 0; } } @@ -276,7 +280,7 @@ void MidiParser::allNotesOff() { // support this...). for (i = 0; i < 16; ++i) { - _driver->send(0xB0 | i, 0x7b, 0); // All notes off + sendToDriver(0xB0 | i, 0x7b, 0); // All notes off } memset(_active_notes, 0, sizeof(_active_notes)); @@ -348,7 +352,7 @@ void MidiParser::hangAllActiveNotes() { for (j = 0; j < 16; ++j) { if (temp_active[i] & (1 << j)) { activeNote(j, i, false); - _driver->send(0x80 | j, i, 0); + sendToDriver(0x80 | j, i, 0); } } } @@ -399,7 +403,7 @@ bool MidiParser::jumpToTick(uint32 tick, bool fireEvents, bool stopNotes) { else _driver->sysEx(info.ext.data, (uint16)info.length); } else - _driver->send(info.event, info.basic.param1, info.basic.param2); + sendToDriver(info.event, info.basic.param1, info.basic.param2); } parseNextEvent(_next_event); @@ -441,7 +445,7 @@ void MidiParser::unloadMusic() { if (_driver) { for (int i = 0; i < 16; ++i) { - _driver->send(0xE0 | i, 0, 0x40); + sendToDriver(0xE0 | i, 0, 0x40); } } } diff --git a/sound/midiparser.h b/sound/midiparser.h index 37c00db5b6..35a14954a7 100644 --- a/sound/midiparser.h +++ b/sound/midiparser.h @@ -374,6 +374,11 @@ public: void setTempo(uint32 tempo); void onTimer(); + virtual void sendToDriver(uint32 b); + void sendToDriver(byte status, byte firstOp, byte secondOp) { + sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); + } + bool isPlaying() const { return (_position._play_pos != 0); } void stopPlaying(); -- cgit v1.2.3 From 02c3397ddf12e636da0b851f6350b45af1859dcd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 16 Jun 2010 21:07:26 +0000 Subject: SCI: fix debug command "show_instruments", got broken by r49905 on purpose svn-id: r49906 --- engines/sci/console.cpp | 3 +-- engines/sci/sound/midiparser_sci.cpp | 11 +++-------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index ebe7edecbe..3737ccd59e 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -859,8 +859,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { SciVersion doSoundVersion = _engine->_features->detectDoSoundType(); MidiPlayer *player = MidiPlayer_Midi_create(doSoundVersion); - MidiParser_SCI *parser; // = new MidiParser_SCI(doSoundVersion); - // FIXME: add SciMusic object + MidiParser_SCI *parser = new MidiParser_SCI(doSoundVersion, 0); parser->setMidiDriver(player); Common::List *resources = _engine->getResMan()->listResources(kResourceTypeSound); diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 8bc9b97926..b76c5d0624 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -453,14 +453,6 @@ byte *MidiParser_SCI::midiMixChannels() { // remember which channel got used for channel remapping byte midiChannel = command & 0xF; _channelUsed[midiChannel] = true; -// int16 realChannel = _channelRemap[midiChannel]; -// if (realChannel == -1) { -// // We don't own this channel yet, so ask SciMusic to get it (or a remapped one) -// realChannel = _music->tryToOwnChannel(_pSnd, midiChannel); -// _channelRemap[midiChannel] = realChannel; -// } -// // Map new channel -// command = realChannel | (command & 0xF0); if (command != global_prev) *outData++ = command; // out command @@ -592,6 +584,9 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) { // This will get called right before actual playing and will try to own the used channels void MidiParser_SCI::tryToOwnChannels() { + // We don't have SciMusic in case debug command show_instruments is used + if (!_music) + return; for (int curChannel = 0; curChannel < 15; curChannel++) { if (_channelUsed[curChannel]) { if (_channelRemap[curChannel] == -1) { -- cgit v1.2.3 From 289b668099071c4609a6081cca97c626d61e93eb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 16 Jun 2010 21:23:47 +0000 Subject: SCI: dont seek during init of music but on play, fixes assert when restoring saves caused by r49905 - because channel remapping isn't done at that point svn-id: r49907 --- engines/sci/sound/music.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 69e1c180e8..213d3830c7 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -224,8 +224,6 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayId(), _pMidiDrv->hasRhythmChannel()); pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion); - // Fast forward to the last position and perform associated events when loading - pSnd->pMidiParser->jumpToTick(pSnd->ticker, true); _mutex.unlock(); } } @@ -316,6 +314,9 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSoundStopped) pSnd->pMidiParser->jumpToTick(0); + else + // Fast forward to the last position and perform associated events when loading + pSnd->pMidiParser->jumpToTick(pSnd->ticker, true); } _mutex.unlock(); } -- cgit v1.2.3 From 9b6f71d7cf76e529ed8010224442ceef18183fcb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 16 Jun 2010 21:44:33 +0000 Subject: Added handling for the SCI2.1 kPalette(1) call. The graphics in Torin's Passage are shown with the correct colors now svn-id: r49908 --- engines/sci/engine/kgraphics.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f56c5bb5e1..424d5049e5 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -553,9 +553,11 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 1: // Set resource palette - if (argc==3) { + if (argc == 2 || argc == 3) { GuiResourceId resourceId = argv[1].toUint16(); - bool force = argv[2].toUint16() == 2 ? true : false; + bool force = false; + if (argc == 3) + force = argv[2].toUint16() == 2 ? true : false; g_sci->_gfxPalette->kernelSetFromResource(resourceId, force); } else { warning("kPalette(1) called with %d parameters", argc); -- cgit v1.2.3 From 20d8de27bad1e9e8cd218c258ec863f89219b49c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 16 Jun 2010 21:56:39 +0000 Subject: Implemented the SCI2.1 kMulDiv kernel function. Walking in Torin's Passage is done correctly now, without leaving trails svn-id: r49909 --- engines/sci/engine/kernel.cpp | 1 + engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel32.cpp | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d1b6ce72bc..3da34d44e4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -387,6 +387,7 @@ SciKernelFunction kfunct_mappers[] = { { "List", kList, ".*" }, { "Robot", kRobot, ".*" }, { "IsOnMe", kIsOnMe, "iio.*" }, + { "MulDiv", kMulDiv, "iii" }, #endif diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 10225729d7..b3730cb6df 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -413,6 +413,7 @@ reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv); reg_t kArray(EngineState *s, int argc, reg_t *argv); reg_t kListAt(EngineState *s, int argc, reg_t *argv); reg_t kString(EngineState *s, int argc, reg_t *argv); +reg_t kMulDiv(EngineState *s, int argc, reg_t *argv); // "Screen items" in SCI32 are views reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv); reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index a077f110cf..d35dd38792 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -879,6 +879,14 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } +reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { + int16 multiplicant = argv[0].toSint16(); + int16 multiplier = argv[1].toSint16(); + int16 denominator = argv[2].toSint16(); + + return make_reg(0, multiplicant * multiplier / denominator); +} + } // End of namespace Sci #endif // ENABLE_SCI32 -- cgit v1.2.3 From fa0011f51216d926d0922fba7bfb1ed65958dff2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 16 Jun 2010 21:59:21 +0000 Subject: Added a sanity check inside kMulDiv svn-id: r49910 --- engines/sci/engine/kernel32.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index d35dd38792..7067e87c60 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -884,6 +884,12 @@ reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { int16 multiplier = argv[1].toSint16(); int16 denominator = argv[2].toSint16(); + // Sanity check... + if (!denominator) { + warning("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator); + return NULL_REG; + } + return make_reg(0, multiplicant * multiplier / denominator); } -- cgit v1.2.3 From 93890a49c1f62791f39e4ee07c2366c8fdb8fb37 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 16 Jun 2010 23:28:20 +0000 Subject: Added back the functionality to skip videos svn-id: r49911 --- engines/sci/console.cpp | 9 ++++++--- engines/sci/engine/kgraphics.cpp | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 3737ccd59e..6845e7282e 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -244,8 +244,9 @@ void Console::postEnter() { if (videoDecoder && videoDecoder->loadFile(_videoFile)) { uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; + bool skipVideo = false; - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo()) { + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { if (videoDecoder->needsUpdate()) { Graphics::Surface *frame = videoDecoder->decodeNextFrame(); if (frame) { @@ -259,8 +260,10 @@ void Console::postEnter() { } Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) - ; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } g_system->delayMillis(10); } diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 424d5049e5..5c84ddfb49 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1160,8 +1160,9 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { if (videoDecoder) { uint16 x = (screenWidth - videoDecoder->getWidth()) / 2; uint16 y = (screenHeight - videoDecoder->getHeight()) / 2; + bool skipVideo = false; - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo()) { + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { if (videoDecoder->needsUpdate()) { Graphics::Surface *frame = videoDecoder->decodeNextFrame(); if (frame) { @@ -1175,8 +1176,10 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { } Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) - ; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } g_system->delayMillis(10); } -- cgit v1.2.3 From 18dc295a339cb7cc618ba565f68d05c6eada9782 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 16 Jun 2010 23:30:22 +0000 Subject: Hooked the VMD player in kPlayVMD. The VMD videos in the demo of Phantasmagoria 1 are shown now (e.g. the intro and the chapter beginning) svn-id: r49912 --- engines/sci/engine/kernel.cpp | 1 + engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel32.cpp | 70 +++++++++++++++++++++++++++++++++++++++++ engines/sci/sci.cpp | 7 +++-- 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 3da34d44e4..ef219390a4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -386,6 +386,7 @@ SciKernelFunction kfunct_mappers[] = { { "Save", kSave, ".*" }, { "List", kList, ".*" }, { "Robot", kRobot, ".*" }, + { "PlayVMD", kPlayVMD, ".*" }, { "IsOnMe", kIsOnMe, "iio.*" }, { "MulDiv", kMulDiv, "iii" }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index b3730cb6df..0a4998868d 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -438,6 +438,7 @@ reg_t kInPolygon(EngineState *s, int argc, reg_t *argv); reg_t kSave(EngineState *s, int argc, reg_t *argv); reg_t kList(EngineState *s, int argc, reg_t *argv); reg_t kRobot(EngineState *s, int argc, reg_t *argv); +reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv); reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); #endif diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 7067e87c60..9adfdca21c 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -30,8 +30,10 @@ #include "sci/engine/segment.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" +#include "sci/graphics/cursor.h" #include "sci/graphics/frameout.h" #include "sci/graphics/screen.h" +#include "sci/video/vmd_decoder.h" #include "common/system.h" @@ -893,6 +895,74 @@ reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { return make_reg(0, multiplicant * multiplier / denominator); } +reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { + uint16 operation = argv[0].toUint16(); + Graphics::VideoDecoder *videoDecoder = 0; + Common::String fileName; + + Common::String warningMsg; + + switch (operation) { + case 0: // play + fileName = s->_segMan->derefString(argv[1]); + // TODO: argv[2] (usually 0) + videoDecoder = new VMDDecoder(g_system->getMixer()); + + g_sci->_gfxCursor->kernelHide(); + + if (videoDecoder && videoDecoder->loadFile(fileName)) { + uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; + uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; + bool skipVideo = false; + + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (frame) { + g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); + + if (videoDecoder->hasDirtyPalette()) + videoDecoder->setSystemPalette(); + + g_system->updateScreen(); + } + } + + Common::Event event; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } + + g_system->delayMillis(10); + } + + // Copy video contents to screen buffer + g_sci->_gfxScreen->kernelSyncWithFramebuffer(); + + delete videoDecoder; + } else + warning("Could not play video %s\n", fileName.c_str()); + + g_sci->_gfxCursor->kernelShow(); + + break; + default: + warningMsg = "PlayVMD - unsupported subop. Params: " + + Common::String::printf("%d", argc) + " ("; + + for (int i = 0; i < argc; i++) { + warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + warningMsg += (i == argc - 1 ? ")" : ", "); + } + + warning("%s", warningMsg.c_str()); + break; + } + + return s->r_acc; +} + } // End of namespace Sci #endif // ENABLE_SCI32 diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 4af6bc7b43..03f54caf31 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -118,11 +118,12 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) SearchMan.addSubDirectoryMatching(gameDataDir, "actors"); // KQ6 hi-res portraits SearchMan.addSubDirectoryMatching(gameDataDir, "aud"); // resource.aud and audio files - SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions - SearchMan.addSubDirectoryMatching(gameDataDir, "seq"); // SEQ movie files for DOS versions SearchMan.addSubDirectoryMatching(gameDataDir, "wav"); // speech files in WAV format SearchMan.addSubDirectoryMatching(gameDataDir, "sfx"); // music/sound files in WAV format - SearchMan.addSubDirectoryMatching(gameDataDir, "robot"); // robot files + SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions + SearchMan.addSubDirectoryMatching(gameDataDir, "seq"); // SEQ movie files for DOS versions + SearchMan.addSubDirectoryMatching(gameDataDir, "robot"); // robot movie files + SearchMan.addSubDirectoryMatching(gameDataDir, "vmd"); // vmd movie files // Add the patches directory, except for KQ6CD; The patches folder in some versions of KQ6CD // is for the demo of Phantasmagoria, included in the disk -- cgit v1.2.3 From a7b76c04d9df2c30d541554b9f907f6bcedd307a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 00:07:03 +0000 Subject: Added handling of VMD video files in kResCheck, fixes video playing in GK2 svn-id: r49913 --- engines/sci/engine/kscripts.cpp | 8 ++++++++ engines/sci/resource.h | 1 + engines/sci/sci.cpp | 1 + 3 files changed, 10 insertions(+) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index a8cf92b2a6..88e765a0ff 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -29,6 +29,8 @@ #include "sci/engine/selector.h" #include "sci/engine/kernel.h" +#include "common/file.h" + namespace Sci { // Loads arbitrary resources of type 'restype' with resource numbers 'resnrs' @@ -93,6 +95,12 @@ reg_t kResCheck(EngineState *s, int argc, reg_t *argv) { Resource *res = NULL; ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); + if (restype == kResourceTypeVMD) { + char fileName[50]; + sprintf(fileName, "%d.vmd", argv[1].toUint16()); + return make_reg(0, Common::File::exists(fileName)); + } + if ((restype == kResourceTypeAudio36) || (restype == kResourceTypeSync36)) { if (argc >= 6) { uint noun = argv[2].toUint16() & 0xff; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index b37f71832d..591273b252 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -98,6 +98,7 @@ enum ResourceType { kResourceTypeUnknown1, // Translation, currently unsupported kResourceTypeUnknown2, kResourceTypeRobot, + kResourceTypeVMD, kResourceTypeInvalid, // Mac-only resources, these resource types are self-defined diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 03f54caf31..1dc02ac7c3 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -123,6 +123,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions SearchMan.addSubDirectoryMatching(gameDataDir, "seq"); // SEQ movie files for DOS versions SearchMan.addSubDirectoryMatching(gameDataDir, "robot"); // robot movie files + SearchMan.addSubDirectoryMatching(gameDataDir, "movies"); // vmd movie files SearchMan.addSubDirectoryMatching(gameDataDir, "vmd"); // vmd movie files // Add the patches directory, except for KQ6CD; The patches folder in some versions of KQ6CD -- cgit v1.2.3 From 2cba994bb4179cbed1c54921ff825bc4f7735efb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 00:20:40 +0000 Subject: Only hide/show cursor when playing a VMD if it was visible in the first place. svn-id: r49914 --- engines/sci/engine/kernel32.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 9adfdca21c..dedcf0df5f 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -898,9 +898,8 @@ reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); Graphics::VideoDecoder *videoDecoder = 0; - Common::String fileName; - - Common::String warningMsg; + bool reshowCursor = g_sci->_gfxCursor->isVisible(); + Common::String fileName, warningMsg; switch (operation) { case 0: // play @@ -908,7 +907,8 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // TODO: argv[2] (usually 0) videoDecoder = new VMDDecoder(g_system->getMixer()); - g_sci->_gfxCursor->kernelHide(); + if (reshowCursor) + g_sci->_gfxCursor->kernelHide(); if (videoDecoder && videoDecoder->loadFile(fileName)) { uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; @@ -944,8 +944,8 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { } else warning("Could not play video %s\n", fileName.c_str()); - g_sci->_gfxCursor->kernelShow(); - + if (reshowCursor) + g_sci->_gfxCursor->kernelShow(); break; default: warningMsg = "PlayVMD - unsupported subop. Params: " + -- cgit v1.2.3 From e5f609a40ab68cad298b75a3d69a7d61e7b79e70 Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 17 Jun 2010 03:22:52 +0000 Subject: Correction for Invalid reads in Translation iconv calls reported by Valgrind. The string terminators were omitted from the iconv call and not restored. svn-id: r49916 --- common/translation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 3119c074ab..925da26407 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -128,11 +128,11 @@ String TranslationManager::getTranslation(const String &message) { #ifdef USE_TERMCONV bool TranslationManager::convert(const char *message) { // Preparing conversion origin - size_t len = strlen(message); + size_t len = strlen(message) + 1; #ifdef ICONV_USES_CONST const char **pmsg = &message; #else - char *msgcpy = new char[len + 1]; + char *msgcpy = new char[len]; strcpy(msgcpy, message); char *msg = msgcpy; char **pmsg = &msg; @@ -158,7 +158,7 @@ bool TranslationManager::convert(const char *message) { const char *TranslationManager::convertTerm(const char *message) { #ifdef USE_TERMCONV - size_t len = strlen(message); + size_t len = strlen(message) + 1; if (!_convmsg) { _sizeconv = len * 2; _convmsg = new char[_sizeconv]; -- cgit v1.2.3 From 6ee4bf06ade5fdc6158d55b10cd73b1bf9377941 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 03:53:13 +0000 Subject: Fix a valgrind warning in GfxCursor. Thanks to digitall for finding it. svn-id: r49917 --- engines/sci/graphics/cursor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 46bd981b7f..2930bb8a46 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -43,11 +43,11 @@ GfxCursor::GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *sc : _resMan(resMan), _palette(palette), _screen(screen) { _upscaledHires = _screen->getUpscaledHires(); + _isVisible = true; + // center mouse cursor setPosition(Common::Point(_screen->getWidth() / 2, _screen->getHeight() / 2)); kernelSetMoveZone(Common::Rect(0, 0, _screen->getDisplayWidth(), _screen->getDisplayHeight())); - - _isVisible = true; } GfxCursor::~GfxCursor() { -- cgit v1.2.3 From 39276e82dbebf55e68ecc298cbeef01133fb0bf8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 03:57:38 +0000 Subject: Fix another valgrind warning, thanks to digitall for spotting. svn-id: r49918 --- engines/sci/sound/midiparser_sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index b76c5d0624..189d9b8727 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -60,6 +60,7 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : _dataincAdd = false; _dataincToAdd = 0; _resetOnPause = false; + _pSnd = 0; } MidiParser_SCI::~MidiParser_SCI() { -- cgit v1.2.3 From f10b1a23f807d7889a2776ce80ea8b7a77160eb5 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 17 Jun 2010 05:40:48 +0000 Subject: Fixed a few cppcheck errors. svn-id: r49919 --- engines/groovie/font.cpp | 1 + engines/m4/mads_scene.cpp | 2 +- graphics/video/qt_decoder.cpp | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/groovie/font.cpp b/engines/groovie/font.cpp index 6aa6c89d31..dc1d7ae73a 100644 --- a/engines/groovie/font.cpp +++ b/engines/groovie/font.cpp @@ -54,6 +54,7 @@ bool T7GFont::load(Common::SeekableReadStream &stream) { if (stream.eos()) { error("Groovie::T7GFont: Couldn't read the glyph offsets"); + delete[] glyphOffsets; return false; } diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 428b92c657..43b39af0db 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -635,7 +635,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su if (sceneNumber > 0) { sceneName = MADSResourceManager::getResourceName(RESPREFIX_RM, sceneNumber, ".DAT"); } else { - strcat(buffer1, "*"); + strcpy(buffer1, "*"); strcat(buffer1, resName); sceneName = buffer1; // TODO: Check whether this needs to be converted to 'HAG form' } diff --git a/graphics/video/qt_decoder.cpp b/graphics/video/qt_decoder.cpp index 842c38f315..a95243ba6a 100644 --- a/graphics/video/qt_decoder.cpp +++ b/graphics/video/qt_decoder.cpp @@ -536,6 +536,8 @@ int QuickTimeDecoder::readCMOV(MOVatom atom) { unsigned long dstLen = uncompressedSize; if (!Common::uncompress(uncompressedData, &dstLen, compressedData, compressedSize)) { warning ("Could not uncompress cmov chunk"); + free(compressedData); + free(uncompressedData); return -1; } -- cgit v1.2.3 From 894ba682cdfb60a268dd4f4cb09d74d5cbb590b0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 07:26:06 +0000 Subject: Moved kMulDiv together with the rest of the math functions, and kPlayVMD together with the rest of the video playing functions svn-id: r49920 --- engines/sci/engine/kernel32.cpp | 84 ---------------------------------------- engines/sci/engine/kgraphics.cpp | 75 +++++++++++++++++++++++++++++++++++ engines/sci/engine/kmath.cpp | 18 +++++++++ 3 files changed, 93 insertions(+), 84 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index dedcf0df5f..a077f110cf 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -30,10 +30,8 @@ #include "sci/engine/segment.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" -#include "sci/graphics/cursor.h" #include "sci/graphics/frameout.h" #include "sci/graphics/screen.h" -#include "sci/video/vmd_decoder.h" #include "common/system.h" @@ -881,88 +879,6 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } -reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { - int16 multiplicant = argv[0].toSint16(); - int16 multiplier = argv[1].toSint16(); - int16 denominator = argv[2].toSint16(); - - // Sanity check... - if (!denominator) { - warning("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator); - return NULL_REG; - } - - return make_reg(0, multiplicant * multiplier / denominator); -} - -reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { - uint16 operation = argv[0].toUint16(); - Graphics::VideoDecoder *videoDecoder = 0; - bool reshowCursor = g_sci->_gfxCursor->isVisible(); - Common::String fileName, warningMsg; - - switch (operation) { - case 0: // play - fileName = s->_segMan->derefString(argv[1]); - // TODO: argv[2] (usually 0) - videoDecoder = new VMDDecoder(g_system->getMixer()); - - if (reshowCursor) - g_sci->_gfxCursor->kernelHide(); - - if (videoDecoder && videoDecoder->loadFile(fileName)) { - uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; - uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; - bool skipVideo = false; - - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { - if (videoDecoder->needsUpdate()) { - Graphics::Surface *frame = videoDecoder->decodeNextFrame(); - if (frame) { - g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); - - if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); - - g_system->updateScreen(); - } - } - - Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) { - if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) - skipVideo = true; - } - - g_system->delayMillis(10); - } - - // Copy video contents to screen buffer - g_sci->_gfxScreen->kernelSyncWithFramebuffer(); - - delete videoDecoder; - } else - warning("Could not play video %s\n", fileName.c_str()); - - if (reshowCursor) - g_sci->_gfxCursor->kernelShow(); - break; - default: - warningMsg = "PlayVMD - unsupported subop. Params: " + - Common::String::printf("%d", argc) + " ("; - - for (int i = 0; i < argc; i++) { - warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - warningMsg += (i == argc - 1 ? ")" : ", "); - } - - warning("%s", warningMsg.c_str()); - break; - } - - return s->r_acc; -} - } // End of namespace Sci #endif // ENABLE_SCI32 diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 5c84ddfb49..84fbbe98eb 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -48,6 +48,9 @@ #include "sci/graphics/screen.h" #include "sci/graphics/text16.h" #include "sci/graphics/view.h" +#ifdef ENABLE_SCI32 +#include "sci/video/vmd_decoder.h" +#endif namespace Sci { @@ -1230,6 +1233,78 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } + +reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { + uint16 operation = argv[0].toUint16(); + Graphics::VideoDecoder *videoDecoder = 0; + bool reshowCursor = g_sci->_gfxCursor->isVisible(); + Common::String fileName, warningMsg; + + switch (operation) { + case 0: // play + fileName = s->_segMan->derefString(argv[1]); + // TODO: argv[2] (usually 0) + if (argv[2] != NULL_REG) + warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x)", PRINT_REG(argv[2])); + + videoDecoder = new VMDDecoder(g_system->getMixer()); + + if (reshowCursor) + g_sci->_gfxCursor->kernelHide(); + + if (videoDecoder && videoDecoder->loadFile(fileName)) { + uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; + uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; + bool skipVideo = false; + + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (frame) { + g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); + + if (videoDecoder->hasDirtyPalette()) + videoDecoder->setSystemPalette(); + + g_system->updateScreen(); + } + } + + Common::Event event; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } + + g_system->delayMillis(10); + } + + // Copy video contents to screen buffer + g_sci->_gfxScreen->kernelSyncWithFramebuffer(); + + delete videoDecoder; + } else + warning("Could not play video %s\n", fileName.c_str()); + + if (reshowCursor) + g_sci->_gfxCursor->kernelShow(); + break; + default: + warningMsg = "PlayVMD - unsupported subop. Params: " + + Common::String::printf("%d", argc) + " ("; + + for (int i = 0; i < argc; i++) { + warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + warningMsg += (i == argc - 1 ? ")" : ", "); + } + + warning("%s", warningMsg.c_str()); + break; + } + + return s->r_acc; +} + #endif reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index dbf317860f..6d4b9a2a04 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -153,4 +153,22 @@ reg_t kTimesCot(EngineState *s, int argc, reg_t *argv) { return make_reg(0, (int16)(tan(param * PI / 180.0) * scale)); } +#ifdef ENABLE_SCI32 + +reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { + int16 multiplicant = argv[0].toSint16(); + int16 multiplier = argv[1].toSint16(); + int16 denominator = argv[2].toSint16(); + + // Sanity check... + if (!denominator) { + warning("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator); + return NULL_REG; + } + + return make_reg(0, multiplicant * multiplier / denominator); +} + +#endif + } // End of namespace Sci -- cgit v1.2.3 From 25496abe1b494e125cc8dd7892e9c95e3da61042 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 07:53:57 +0000 Subject: Added 2x scaling for VMD videos, for bugtesting (temporarily in SCI itself). It's currently not optimized much, but since the VMD decoder code will be revamped, we don't really care about performance at this point svn-id: r49921 --- engines/sci/engine/kgraphics.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 84fbbe98eb..41aca3ff49 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1253,15 +1253,27 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxCursor->kernelHide(); if (videoDecoder && videoDecoder->loadFile(fileName)) { - uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; - uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; + //uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; + //uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; + uint16 w = videoDecoder->getWidth() * 2; + uint16 h = videoDecoder->getHeight() * 2; + uint16 x = (g_system->getWidth() - w) / 2; + uint16 y = (g_system->getHeight() - h) / 2; + byte *frameBuf = new byte[w * h]; + bool skipVideo = false; while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { if (videoDecoder->needsUpdate()) { Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (frame) { - g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); + //g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); + // All the VMD videos in SCI2.1 need to be scaled by 2 + // TODO: This isn't optimized much, but since the VMD decoder code will be revamped, we + // don't really care about performance at this point anyway + g_sci->_gfxScreen->scale2x((byte *)frame->pixels, frameBuf, videoDecoder->getWidth(), videoDecoder->getHeight()); + g_system->copyRectToScreen(frameBuf, frame->pitch * 2, x, y, frame->w * 2, frame->h * 2); if (videoDecoder->hasDirtyPalette()) videoDecoder->setSystemPalette(); @@ -1282,6 +1294,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // Copy video contents to screen buffer g_sci->_gfxScreen->kernelSyncWithFramebuffer(); + delete frameBuf; delete videoDecoder; } else warning("Could not play video %s\n", fileName.c_str()); -- cgit v1.2.3 From 705d3c2d85b30368a7b138328cdd99040fe0bf28 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 08:41:04 +0000 Subject: SCI: fixes regressions of r49905 (thx to digitall) - first we now find out what channels are used in sci0 as well, we are doing straight mapping for sci0 though - this fixes music in sci0 games, also fixing crash in sq1vga because of using null pMidiParser svn-id: r49922 --- engines/sci/sound/midiparser_sci.cpp | 4 ++++ engines/sci/sound/music.cpp | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 189d9b8727..bdb907a451 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -545,6 +545,10 @@ byte *MidiParser_SCI::midiFilterChannels(int channelMask) { break; default: // MIDI command + // remember which channel got used for channel remapping + byte midiChannel = command & 0xF; + _channelUsed[midiChannel] = true; + if (lastCommand != command) { *outData++ = command; debugC(4, kDebugLevelSound, "%02X ", command); diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 213d3830c7..a1c6cc0a56 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -232,6 +232,9 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { // This one checks, if requested channel is available -> in that case give caller that channel // Otherwise look for an unused one int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { + // Don't even try this for SCI0 + if (_soundVersion <= SCI_VERSION_0_LATE) + return bestChannel; if (!_usedChannel[bestChannel]) { // currently unused, so give it to caller directly _usedChannel[bestChannel] = caller; @@ -308,9 +311,9 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { DisposeAfterUse::NO); } } else { - pSnd->pMidiParser->tryToOwnChannels(); _mutex.lock(); if (pSnd->pMidiParser) { + pSnd->pMidiParser->tryToOwnChannels(); pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSoundStopped) pSnd->pMidiParser->jumpToTick(0); -- cgit v1.2.3 From 81fe1aa19ee4a9e8ffb7a77fbef8dc40fddbc750 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 08:55:08 +0000 Subject: Added some more information on some of the calls of kPlayVMD svn-id: r49923 --- engines/sci/engine/kgraphics.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 41aca3ff49..03989be374 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1241,11 +1241,14 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { Common::String fileName, warningMsg; switch (operation) { - case 0: // play + case 0: // init + // This is actually meant to init the video file, but we play it instead fileName = s->_segMan->derefString(argv[1]); - // TODO: argv[2] (usually 0) + // TODO: argv[2] (usually null). When it exists, it points to an "Event" object, + // that holds no data initially (e.g. in the intro of Phantasmagoria 1 demo). + // Perhaps it's meant for syncing if (argv[2] != NULL_REG) - warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x)", PRINT_REG(argv[2])); + warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x - %s)", PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2])); videoDecoder = new VMDDecoder(g_system->getMixer()); @@ -1302,6 +1305,18 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { if (reshowCursor) g_sci->_gfxCursor->kernelShow(); break; + case 1: + // Unknown. Called with 5 extra integer parameterrs + // (e.g. 174, 95, 20, 0, 55, 236) + case 6: + // Play, perhaps? Or stop? This is the last call made, and takes no extra parameters + case 14: + // Takes an additional integer parameter (e.g. 3) + case 16: + // Takes an additional parameter, usually 0 + case 21: + // Looks to be setting the video size and position. Called with 4 extra integer + // parameters (e.g. 86, 41, 235, 106) default: warningMsg = "PlayVMD - unsupported subop. Params: " + Common::String::printf("%d", argc) + " ("; -- cgit v1.2.3 From 3a8e11767d07e836bc001e931c480a3cd63dcd67 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 11:05:39 +0000 Subject: SCI: decreasing channel given to us on cmdSendMidi by one, so mute command now matches the right channel. sierra sci also decreased by one (their channel is 1-based) svn-id: r49924 --- engines/sci/sound/soundcmd.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index e317796aad..6ee23d7fc8 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -232,6 +232,10 @@ reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { uint16 controller = argv[4].toUint16(); uint16 param = argv[5].toUint16(); + if (!channel) + error("invalid channel specified on cmdSendMidi"); + channel--; // channel is given 1-based, we are using 0-based + _midiCommand = (channel | midiCmd) | ((uint32)controller << 8) | ((uint32)param << 16); } -- cgit v1.2.3 From 423029c027c2013c4d23062b2ce81a807d6c74ec Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 11:54:54 +0000 Subject: SCI: implemented channel muting for sci1, finally fixes lsl5 paino scene with patti svn-id: r49926 --- engines/sci/sound/midiparser_sci.cpp | 23 ++++++++++++++++++++--- engines/sci/sound/midiparser_sci.h | 3 ++- engines/sci/sound/music.cpp | 12 ++++++++++++ engines/sci/sound/music.h | 6 ++---- engines/sci/sound/soundcmd.cpp | 15 +++++++++++---- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index bdb907a451..1ea990332b 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -79,6 +79,7 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in for (int i = 0; i < 15; i++) { _channelUsed[i] = false; _channelRemap[i] = -1; + _channelMuted[i] = false; } _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally @@ -143,8 +144,22 @@ void MidiParser_SCI::unloadMusic() { } void MidiParser_SCI::sendToDriver(uint32 b) { + byte midiChannel = b & 0xf; + + if ((b & 0xFFF0) == 0x4EB0) { + // this is channel mute only for sci1 + // it's velocity control for sci0 + if (_soundVersion >= SCI_VERSION_1_EARLY) { + _channelMuted[midiChannel] = b & 0xFF0000 ? true : false; + return; // don't send this to driver at all + } + } + + // Is channel muted? if so, don't send command + if (_channelMuted[midiChannel]) + return; // Channel remapping - int16 realChannel = _channelRemap[b & 0xf]; + int16 realChannel = _channelRemap[midiChannel]; assert(realChannel != -1); b = (b & 0xFFFFFFF0) | realChannel; _driver->send(b); @@ -249,7 +264,6 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { case 0x0A: // pan case 0x0B: // expression case 0x40: // sustain - case 0x4E: // velocity control case 0x79: // reset all case 0x7B: // notes off // These are all handled by the music driver, so ignore them @@ -263,8 +277,11 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { break; } } - if (info.basic.param1 == 7) // channel volume change -scale it + switch (info.basic.param1) { + case 7: // channel volume change -scale it info.basic.param2 = info.basic.param2 * _volume / MUSIC_VOLUME_MAX; + break; + } info.length = 0; break; diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 4888fa06ca..89d1e63d8c 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -76,9 +76,9 @@ public: const byte *getMixedData() const { return _mixedData; } void tryToOwnChannels(); + void sendToDriver(uint32 b); protected: - void sendToDriver(uint32 b); void parseNextEvent(EventInfo &info); byte *midiMixChannels(); byte *midiFilterChannels(int channelMask); @@ -101,6 +101,7 @@ protected: bool _channelUsed[16]; int16 _channelRemap[16]; + bool _channelMuted[16]; }; } // End of namespace Sci diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index a1c6cc0a56..c5fc07bfd7 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -446,6 +446,18 @@ void SciMusic::soundSetMasterVolume(uint16 vol) { _pMidiDrv->setVolume(vol); } +void SciMusic::sendMidiCommand(uint32 cmd) { + Common::StackLock lock(_mutex); + _pMidiDrv->send(cmd); +} + +void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { + if (pSnd->pMidiParser) + pSnd->pMidiParser->sendToDriver(cmd); + else + warning("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); +} + void SciMusic::printPlayList(Console *con) { Common::StackLock lock(_mutex); diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index bbafb808cb..8e68d3df92 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -179,10 +179,8 @@ public: MusicList::iterator getPlayListStart() { return _playList.begin(); } MusicList::iterator getPlayListEnd() { return _playList.end(); } - void sendMidiCommand(uint32 cmd) { - Common::StackLock lock(_mutex); - _pMidiDrv->send(cmd); - } + void sendMidiCommand(uint32 cmd); + void sendMidiCommand(MusicEntry *pSnd, uint32 cmd); void setReverb(byte reverb); diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 6ee23d7fc8..fa215ac302 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -232,9 +232,8 @@ reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { uint16 controller = argv[4].toUint16(); uint16 param = argv[5].toUint16(); - if (!channel) - error("invalid channel specified on cmdSendMidi"); - channel--; // channel is given 1-based, we are using 0-based + if (channel) + channel--; // channel is given 1-based, we are using 0-based _midiCommand = (channel | midiCmd) | ((uint32)controller << 8) | ((uint32)param << 16); } @@ -901,7 +900,15 @@ void SoundCommandParser::cmdSendMidi(reg_t obj, int16 value) { //SongHandle handle = FROBNICATE_HANDLE(obj); //_state->sfx_send_midi(handle, value, _midiCmd, _controller, _param); #else - _music->sendMidiCommand(_midiCommand); + MusicEntry *musicSlot = _music->getSlot(obj); + if (!musicSlot) { + // TODO: maybe it's possible to call this with obj == 0:0 and send directly?! + // if so, allow it + //_music->sendMidiCommand(_midiCommand); + warning("cmdSendMidi: Slot not found (%04x:%04x)", PRINT_REG(obj)); + return; + } + _music->sendMidiCommand(musicSlot, _midiCommand); #endif } -- cgit v1.2.3 From cf86b447939a3baea5aa3bd53450f8f56f436740 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 12:13:27 +0000 Subject: M4/MADS: Some slight tweaks to the animation message chunks svn-id: r49927 --- engines/m4/animation.cpp | 18 +++++++++++++----- engines/m4/animation.h | 1 + 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index c39a1f0cd2..6b32bdca17 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -132,9 +132,9 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S for (int i = 0; i < messagesCount; ++i) { AnimMessage rec; + rec.soundId = animStream->readUint16LE(); animStream->read(rec.msg, 70); - rec.pos.x = animStream->readUint16LE(); - rec.pos.y = animStream->readUint16LE(); + animStream->readUint16LE(); animStream->readUint16LE(); rec.rgb1.r = animStream->readByte(); rec.rgb1.g = animStream->readByte(); @@ -142,11 +142,13 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S rec.rgb2.r = animStream->readByte(); rec.rgb2.g = animStream->readByte(); rec.rgb2.b = animStream->readByte(); + animStream->readUint16LE(); + animStream->readUint16LE(); rec.kernelMsgIndex = animStream->readUint16LE(); - animStream->skip(6); + rec.pos.x = animStream->readUint16LE(); + rec.pos.y = animStream->readUint16LE(); rec.startFrame = animStream->readUint16LE(); rec.endFrame = animStream->readUint16LE(); - animStream->readUint16LE(); _messages.push_back(rec); } @@ -201,7 +203,10 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S fontName += "*"; fontName += fontResource; - _font = _vm->_font->getFont(fontName); + if (fontName != "") + _font = _vm->_font->getFont(fontName); + else + warning("Attempted to set a font with an empty name"); } // Load all the sprite sets for the animation @@ -421,6 +426,9 @@ void MadsAnimation::update() { // Add a kernel message to display the given text me.kernelMsgIndex = _view->_kernelMessages.add(me.pos, colIndex * 101, 0, 0, INDEFINITE_TIMEOUT, me.msg); + // Play the associated sound, if it exists + if (me.soundId >= 0) + _vm->_sound->playDSRSound(me.soundId, 255, false); ++_messageCtr; } } diff --git a/engines/m4/animation.h b/engines/m4/animation.h index cffcf9f689..89c3cbbfaf 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -39,6 +39,7 @@ class SpriteSlotSubset; class AnimMessage { public: + int16 soundId; char msg[70]; Common::Point pos; RGB8 rgb1, rgb2; -- cgit v1.2.3 From 0e365131ac58b7504e9e16b08a8b3125b6b37027 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 12:29:58 +0000 Subject: Fixed wPlayAudio, and added some documentation on the 3 new kDoAudio subops. Digital sounds in Pharkas work again svn-id: r49928 --- engines/sci/engine/ksound.cpp | 16 +++++++++++++--- engines/sci/sound/audio.cpp | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 8cf9400353..d4af4ade5c 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -174,9 +174,19 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { case kSciAudioCD: debugC(2, kDebugLevelSound, "kDoAudio: CD audio subop"); return kDoCdAudio(s, argc - 1, argv + 1); - // TODO: There are 3 more functions used in Freddy Pharkas (11, 12 and 13) and new within sierra sci - // Details currently unknown - // kDoAudio sits at seg026:038C + + // 3 new subops in Pharkas. kDoAudio in Pharkas sits at seg026:038C + case 11: + warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + break; + case 12: + // Seems to be audio sync, used in Pharkas, silenced warning cause of the spam it produces + //warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + break; + case 13: + // Used in Pharkas whenever a speech sample starts + warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + break; default: warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); } diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index ac3ef54c9a..0e235ee400 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -82,7 +82,7 @@ int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { // sample length and return that. wPlayAudio should *not* actually start the sample. int sampleLen = 0; - Audio::AudioStream *audioStream = getAudioStream(module, tuple, &sampleLen); + Audio::AudioStream *audioStream = getAudioStream(tuple, module, &sampleLen); if (!audioStream) warning("wPlayAudio: unable to create stream for audio tuple %d, module %d", tuple, module); delete audioStream; -- cgit v1.2.3 From 45b23601e77d816415cccd7cd73f487d3a0f485b Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Thu, 17 Jun 2010 13:42:02 +0000 Subject: Add detection of original directory structure for Touche. svn-id: r49929 --- engines/touche/detection.cpp | 9 +++++++-- engines/touche/touche.cpp | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index f336c2e008..35f03fa657 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -124,6 +124,11 @@ static const ADFileBasedFallback fileBasedFallback[] = { } // End of namespace Touche +static const char *directoryGlobs[] = { + "database", + 0 +}; + static const ADParams detectionParams = { (const byte *)Touche::gameDescriptions, sizeof(ADGameDescription), @@ -136,9 +141,9 @@ static const ADParams detectionParams = { // Additional GUI options (for every game} Common::GUIO_NONE, // Maximum directory depth - 1, + 2, // List of directory globs - 0 + directoryGlobs }; class ToucheMetaEngine : public AdvancedMetaEngine { diff --git a/engines/touche/touche.cpp b/engines/touche/touche.cpp index 187e685d06..2dc8b76b4f 100644 --- a/engines/touche/touche.cpp +++ b/engines/touche/touche.cpp @@ -28,6 +28,8 @@ #include "common/debug-channels.h" #include "common/events.h" #include "common/EventRecorder.h" +#include "common/file.h" +#include "common/fs.h" #include "common/system.h" #include "engines/util.h" @@ -70,6 +72,10 @@ ToucheEngine::ToucheEngine(OSystem *system, Common::Language language) _menuRedrawCounter = 0; memset(_paletteBuffer, 0, sizeof(_paletteBuffer)); + const Common::FSNode gameDataDir(ConfMan.get("path")); + + SearchMan.addSubDirectoryMatching(gameDataDir, "database"); + DebugMan.addDebugChannel(kDebugEngine, "Engine", "Engine debug level"); DebugMan.addDebugChannel(kDebugGraphics, "Graphics", "Graphics debug level"); DebugMan.addDebugChannel(kDebugResource, "Resource", "Resource debug level"); -- cgit v1.2.3 From 36d92b4566ba15d381f56870ccf9898ca0383138 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 14:05:05 +0000 Subject: Fixed kLoad and kUnload (the resource type was incorrect) svn-id: r49931 --- engines/sci/engine/kscripts.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 88e765a0ff..7e33f17f5f 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -36,7 +36,7 @@ namespace Sci { // Loads arbitrary resources of type 'restype' with resource numbers 'resnrs' // This implementation ignores all resource numbers except the first one. reg_t kLoad(EngineState *s, int argc, reg_t *argv) { - int restype = argv[0].toUint16(); + ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); int resnr = argv[1].toUint16(); // Request to dynamically allocate hunk memory for later use @@ -76,7 +76,7 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { // Unloads an arbitrary resource of type 'restype' with resource numbber 'resnr' reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { if (argc >= 2) { - int restype = argv[0].toUint16(); + ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); reg_t resnr = argv[1]; if (restype == kResourceTypeMemory) -- cgit v1.2.3 From 4e7b98db0cd978af5913ca3604fc72f4d4f7d7d9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 14:06:12 +0000 Subject: Removed a now obsolete FIXME (spotted by Fingolfin) svn-id: r49932 --- engines/sci/engine/seg_manager.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 96670b5aeb..310e600133 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -535,9 +535,6 @@ Node *SegManager::lookupNode(reg_t addr) { return NULL; // Non-error null if (getSegmentType(addr.segment) != SEG_TYPE_NODES) { - // FIXME: This occurs right at the beginning of SQ4, when walking north from the first screen. It doesn't - // seem to have any apparent ill-effects, though, so it's been changed to non-fatal, for now - //error("%s, L%d: Attempt to use non-node %04x:%04x as list node", __FILE__, __LINE__, PRINT_REG(addr)); warning("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); return NULL; } -- cgit v1.2.3 From f403d0f806d56dbe2017374792e0697e6d46bc1f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 15:02:18 +0000 Subject: Don't translate both x and y of the rect in kOnMe if only one of the variables is negative. Fixes the GKEgo hotspot outside of the Madame Cazanoux's house. svn-id: r49933 --- engines/sci/engine/kernel32.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index a077f110cf..fb90cfb147 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -792,11 +792,15 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - if (nsRect.left < 0 || nsRect.top < 0) { - // If top and left are negative, we need to adjust coordinates by the item's x and y - // (e.g. happens in GK1, day 1, with detective Mosely's hotspot in his office) - nsRect.translate(itemX, itemY); - } + + // If top and left are negative, we need to adjust coordinates by the item's x and y + // (e.g. happens in GK1, day 1, with detective Mosely's hotspot in his office) + + if (nsRect.left < 0) + nsRect.translate(itemX, 0); + + if (nsRect.top < 0) + nsRect.translate(0, itemY); // HACK: nsLeft and nsTop can be invalid, so try and fix them here using x and y // (e.g. with the inventory screen in GK1) -- cgit v1.2.3 From 1bbb9d7bd29020566c36d7812c6de236a25c025e Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 17 Jun 2010 15:46:01 +0000 Subject: Fixed cppcheck warning. svn-id: r49935 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 03989be374..8b2501ff62 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1297,7 +1297,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // Copy video contents to screen buffer g_sci->_gfxScreen->kernelSyncWithFramebuffer(); - delete frameBuf; + delete[] frameBuf; delete videoDecoder; } else warning("Could not play video %s\n", fileName.c_str()); -- cgit v1.2.3 From 00ac852dc861877857bbb4065a6cd1f78f04b023 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 16:06:01 +0000 Subject: SCI: implement workaround for laura bow 2 demo, because that interpreter uses the old real palette merging from sci1 - some views contain a palette that has all colors marked as being used, which would overwrite sysPalette with blacks svn-id: r49936 --- engines/sci/graphics/palette.cpp | 12 ++++++++++++ engines/sci/graphics/palette.h | 1 + 2 files changed, 13 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index d28fb2ada1..f10446098f 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -57,6 +57,15 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _sysPalette.colors[255].b = 255; _sysPaletteChanged = false; + _alwaysForceRealMerge = false; + + // Pseudo-WORKAROUND + // Laura Bow 2 is an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 + // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging + // If we use the copying over, we will get issues because some views have marked all colors as being used + // and those will overwrite the current palette in that case + if (!strcmp(g_sci->getGameID(), "laurabow2") && (g_sci->isDemo())) + _alwaysForceRealMerge = true; } GfxPalette::~GfxPalette() { @@ -211,6 +220,9 @@ bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealM int i,j; bool paletteChanged = false; + // for Laura Bow 2 demo + forceRealMerge |= _alwaysForceRealMerge; + if ((!forceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes for (i = 1; i < 255; i++) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index d84436d708..fead340090 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -77,6 +77,7 @@ private: uint32 _palVaryEnd; bool _sysPaletteChanged; + bool _alwaysForceRealMerge; Common::Array _schedules; }; -- cgit v1.2.3 From 7bb48adda7e9e04fb1b8a6ccce38b29a143ba835 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 16:09:06 +0000 Subject: SCI: slightly change comment from r49936 svn-id: r49937 --- engines/sci/graphics/palette.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index f10446098f..608c2339f5 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -60,7 +60,7 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _alwaysForceRealMerge = false; // Pseudo-WORKAROUND - // Laura Bow 2 is an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 + // Laura Bow 2 demo uses an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case -- cgit v1.2.3 From 5daa17473ba3b21683f111989eaa1156f72171cd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 16:36:01 +0000 Subject: SCI: applying forceRealMerge change to pq1 and qfg3 demo as well (see r49936) for now svn-id: r49938 --- engines/sci/graphics/palette.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 608c2339f5..1b2e5f410e 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -64,8 +64,14 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case + // Quest for Glory 3 demo and police quest 1 vga behave the same interpreter wise and all have glitches, if we don't + // switch back if (!strcmp(g_sci->getGameID(), "laurabow2") && (g_sci->isDemo())) _alwaysForceRealMerge = true; + if (!strcmp(g_sci->getGameID(), "qfg3") && (g_sci->isDemo())) + _alwaysForceRealMerge = true; + if (!strcmp(g_sci->getGameID(), "pq1sci")) + _alwaysForceRealMerge = true; } GfxPalette::~GfxPalette() { -- cgit v1.2.3 From 1cb4f703f116d5d69e72f9ae45fa863fb062ab9f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 18:30:11 +0000 Subject: Fix the QFG4 Demo: kStrSplit has been replaced with kRemapColors. svn-id: r49939 --- engines/sci/engine/kernel.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ef219390a4..b6e064b4d5 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -748,14 +748,16 @@ void Kernel::setDefaultKernelNames() { // In SCI1.1, kSetSynonyms is an empty function _kernelNames[0x26] = "Empty"; - // In the Windows version of KQ6 CD, the empty kSetSynonyms - // function has been replaced with kPortrait. In KQ6 Mac, - // kPlayBack has been replaced by kShowMovie. if (!strcmp(g_sci->getGameID(), "kq6")) { + // In the Windows version of KQ6 CD, the empty kSetSynonyms + // function has been replaced with kPortrait. In KQ6 Mac, + // kPlayBack has been replaced by kShowMovie. if (g_sci->getPlatform() == Common::kPlatformWindows) _kernelNames[0x26] = "Portrait"; else if (g_sci->getPlatform() == Common::kPlatformMacintosh) _kernelNames[0x84] = "ShowMovie"; + } else if (!strcmp(g_sci->getGameID(), "qfg4") && g_sci->isDemo()) { + _kernelNames[0x7b] = "RemapColors"; // QFG4 Demo has this SCI2 function instead of StrSplit } _kernelNames[0x71] = "PalVary"; -- cgit v1.2.3 From b56b3b9eadd82685da6f8973bc8775176e67f1ff Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 18:47:25 +0000 Subject: Fix common/messages.cpp rule for out of source directory builds. (Maybe this fixed bug #3017628 "AMIGAOS4: messages.cpp errors") svn-id: r49940 --- common/module.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/module.mk b/common/module.mk index 7a1f83c995..f40ca2f0a0 100644 --- a/common/module.mk +++ b/common/module.mk @@ -30,10 +30,10 @@ MODULE_OBJS := \ zlib.o ifdef USE_TRANSLATION -common/translation.cpp: common/messages.cpp +$(srcdir)/common/translation.cpp: $(srcdir)/common/messages.cpp -common/messages.cpp: $(wildcard po/*.po) - tools/po2c $^ > common/messages.cpp +$(srcdir)/common/messages.cpp: $(wildcard $(srcdir)/po/*.po) + $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp endif # Include common rules -- cgit v1.2.3 From 690203de7486b577dc8b34d1a2fa8b97b686d2f9 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 17 Jun 2010 18:54:37 +0000 Subject: Fix possible link error for scummvm-static (for MacOS X bundle) when USE_TRANSLATION is set but USE_TERMCONV is not. svn-id: r49941 --- configure | 1 + ports.mk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 41e6a46f44..eeec7df204 100755 --- a/configure +++ b/configure @@ -2351,6 +2351,7 @@ EOF cc_check_no_clean $LDFLAGS $CXXFLAGS && _termconv=yes cc_check $LDFLAGS $CXXFLAGS -liconv && LIBS="$LIBS -liconv" && _termconv=yes + add_to_config_mk_if_yes $_termconv 'USE_TERMCONV = 1' add_to_config_h_if_yes $_termconv '#define USE_TERMCONV' if test "$_termconv" = yes ; then uses_const=no diff --git a/ports.mk b/ports.mk index 0feaacbea3..a7ad8febfe 100644 --- a/ports.mk +++ b/ports.mk @@ -101,7 +101,7 @@ ifdef USE_ZLIB OSX_ZLIB ?= -lz endif -ifdef USE_TRANSLATION +ifdef USE_TERMCONV OSX_ICONV ?= -liconv endif -- cgit v1.2.3 From e7305339abe68d32506afd3667ba006ca780a21a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 19:07:45 +0000 Subject: Fix out of updatepot and update-translations for source builds. svn-id: r49942 --- po/module.mk | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/po/module.mk b/po/module.mk index 88dde53e87..f6ed7ad18f 100644 --- a/po/module.mk +++ b/po/module.mk @@ -1,8 +1,8 @@ -POTFILE := po/scummvm.pot -POFILES := $(wildcard po/*.po) +POTFILE := $(srcdir)/po/scummvm.pot +POFILES := $(wildcard $(srcdir)/po/*.po) updatepot: - xgettext -f po/POTFILES -d scummvm --c++ -k_ -k_t -k_s -o po/scummvm.pot \ + xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_t -k_s -o $(POTFILE) \ "--copyright-holder=ScummVM Team" --package-name=ScummVM \ --package-version=$(VERSION) --msgid-bugs-address=scummvm-devel@lists.sf.net -o $(POTFILE)_ @@ -11,8 +11,8 @@ updatepot: rm $(POTFILE)_ if test -f $(POTFILE); then \ - sed -f po/remove-potcdate.sed < $(POTFILE) > $(POTFILE).1 && \ - sed -f po/remove-potcdate.sed < $(POTFILE).new > $(POTFILE).2 && \ + sed -f $(srcdir)/po/remove-potcdate.sed < $(POTFILE) > $(POTFILE).1 && \ + sed -f $(srcdir)/po/remove-potcdate.sed < $(POTFILE).new > $(POTFILE).2 && \ if cmp $(POTFILE).1 $(POTFILE).2 >/dev/null 2>&1; then \ rm -f $(POTFILE).new; \ else \ @@ -24,8 +24,8 @@ updatepot: mv -f $(POTFILE).new $(POTFILE); \ fi; -po/%.po: $(POTFILE) - msgmerge $@ $(POTFILE) -o $@.new +po/%.po: $(srcdir)/$(POTFILE) + msgmerge $@ $(srcdir)/$(POTFILE) -o $@.new if cmp $@ $@.new >/dev/null 2>&1; then \ rm -f $@.new; \ else \ -- cgit v1.2.3 From 10b95b93eacdd89095a4642dd1058516f90e1d41 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 19:08:05 +0000 Subject: Update scummvm.pot. svn-id: r49943 --- po/scummvm.pot | 794 +++++++++++++++++++++++++-------------------------------- 1 file changed, 342 insertions(+), 452 deletions(-) diff --git a/po/scummvm.pot b/po/scummvm.pot index a2b540637a..5ec8c93c63 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -1,6 +1,6 @@ -# SOME DESCRIPTIVE TITLE. +# LANGUAGE translation for ScummVM. # Copyright (C) YEAR ScummVM Team -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR , YEAR. # #, fuzzy @@ -8,23 +8,24 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-13 16:52+0300\n" +"POT-Creation-Date: 2010-06-17 20:57+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: gui/about.cpp:117 +#: gui/about.cpp:96 msgid "C2(built on " msgstr "" -#: gui/about.cpp:125 +#: gui/about.cpp:104 msgid "C1Features compiled in:" msgstr "" -#: gui/about.cpp:132 +#: gui/about.cpp:111 msgid "C1Available engines:" msgstr "" @@ -32,73 +33,74 @@ msgstr "" msgid "Go up" msgstr "" -#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 -#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 -#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 -#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "" -#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 +#: gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "" -#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 -#: backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 +#: gui/GuiManager.cpp:108 base/main.cpp:284 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 +#: gui/GuiManager.cpp:111 base/main.cpp:287 msgid "Remap keys" msgstr "" -#: gui/KeysDialog.cpp:43 +#: gui/KeysDialog.cpp:44 msgid "Map" msgstr "" -#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 -#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "" -#: gui/KeysDialog.cpp:51 +#: gui/KeysDialog.cpp:52 msgid "Select an action and click 'Map'" msgstr "" -#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "" -#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "" -#: gui/KeysDialog.cpp:92 +#: gui/KeysDialog.cpp:93 msgid "Please select an action" msgstr "" -#: gui/KeysDialog.cpp:108 +#: gui/KeysDialog.cpp:109 msgid "Press the key to associate" msgstr "" -#: gui/KeysDialog.cpp:147 +#: gui/KeysDialog.cpp:148 msgid "Choose an action to map" msgstr "" @@ -110,116 +112,121 @@ msgstr "" msgid "ID:" msgstr "" +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" + #: gui/launcher.cpp:177 msgid "Name:" msgstr "" -#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "" + +#: gui/launcher.cpp:181 msgid "Language:" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 -#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 -#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 -#: gui/options.cpp:859 sound/mididrv.cpp:60 +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 +#: sound/mididrv.cpp:60 msgid "" msgstr "" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:192 msgid "Platform:" msgstr "" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "" + +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "GFX" msgstr "" -#: gui/launcher.cpp:205 gui/launcher.cpp:206 +#: gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 -#: gui/launcher.cpp:213 gui/options.cpp:789 +#: gui/launcher.cpp:213 gui/options.cpp:790 msgid "Audio" msgstr "" -#: gui/launcher.cpp:214 gui/launcher.cpp:215 +#: gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 -#: gui/launcher.cpp:223 gui/options.cpp:793 +#: gui/launcher.cpp:223 gui/options.cpp:794 msgid "Volume" msgstr "" -#: gui/launcher.cpp:224 gui/launcher.cpp:225 +#: gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 -#: gui/launcher.cpp:232 gui/options.cpp:801 +#: gui/launcher.cpp:232 gui/options.cpp:802 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:233 gui/launcher.cpp:234 +#: gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 -#: gui/launcher.cpp:244 gui/options.cpp:807 +#: gui/launcher.cpp:244 gui/options.cpp:808 msgid "Paths" msgstr "" -#: gui/launcher.cpp:249 gui/launcher.cpp:250 +#: gui/launcher.cpp:250 msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 -#: gui/launcher.cpp:254 gui/options.cpp:820 +#: gui/launcher.cpp:254 gui/options.cpp:821 msgid "Extra Path:" msgstr "" -#: gui/launcher.cpp:257 gui/launcher.cpp:258 +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "" + +#: gui/launcher.cpp:258 msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 -#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 -#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 -#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 -#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 -#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 -#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 -#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 -#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 -#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 -#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 -#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 -#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 -#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 -#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 +#: gui/options.cpp:816 +msgid "Specifies where your savegames are put" +msgstr "" + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 +#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 +#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 +#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 +#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 +#: gui/options.cpp:964 gui/options.cpp:1063 msgid "None" msgstr "" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 gui/options.cpp:1056 +#: gui/launcher.cpp:391 gui/options.cpp:1057 msgid "Select SoundFont" msgstr "" @@ -240,49 +247,86 @@ msgid "This game ID is already taken. Please choose another one." msgstr "" #: gui/launcher.cpp:500 engines/dialogs.cpp:113 -#: backends/platform/symbian/src/SymbianActions.cpp:55 -#: backends/platform/wince/CEActionsPocket.cpp:43 -#: backends/platform/wince/CEActionsSmartphone.cpp:51 -msgid "Quit" +msgid "~Q~uit" +msgstr "" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" msgstr "" #: gui/launcher.cpp:501 -msgid "About..." +msgid "A~b~out..." +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" msgstr "" #: gui/launcher.cpp:502 -msgid "Options..." +msgid "~O~ptions..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "" + +#: gui/launcher.cpp:504 +msgid "~S~tart" msgstr "" #: gui/launcher.cpp:504 -msgid "Start" +msgid "Start selected game" msgstr "" #: gui/launcher.cpp:507 -msgid "Load..." +msgid "~L~oad..." msgstr "" -#: gui/launcher.cpp:511 gui/launcher.cpp:990 -msgid "Add Game..." +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "" + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" msgstr "" #: gui/launcher.cpp:513 -msgid "Edit Game..." +msgid "~E~dit Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" msgstr "" #: gui/launcher.cpp:515 -msgid "Remove Game" +msgid "Remove game from the list. The game data files stay intact" +msgstr "" + +#: gui/launcher.cpp:522 +msgid "Search in game list" msgstr "" #: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" msgstr "" +#: gui/launcher.cpp:529 gui/options.cpp:667 +msgid "Clear value" +msgstr "" + #: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" @@ -295,7 +339,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -303,7 +347,7 @@ msgid "Yes" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -338,12 +382,15 @@ msgstr "" msgid "Mass Add..." msgstr "" +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "" + #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." msgstr "" #: gui/massadd.cpp:244 -#, c-format msgid "Scan complete!" msgstr "" @@ -362,193 +409,255 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "Never" msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 5 mins" msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 10 mins" msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 15 mins" msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 30 mins" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "8 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "11kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "22 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "44 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "48 kHz" msgstr "" -#: gui/options.cpp:89 gui/options.cpp:95 -msgid "Speech Only" +#: gui/options.cpp:595 +msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:90 -msgid "Speech and Subtitles" +#: gui/options.cpp:606 +msgid "Render mode:" msgstr "" -#: gui/options.cpp:91 gui/options.cpp:97 -msgid "Subtitles Only" +#: gui/options.cpp:606 gui/options.cpp:607 +msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:96 -msgid "Speech & Subs" +#: gui/options.cpp:616 +msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 -msgid "Graphics mode:" +#: gui/options.cpp:619 +msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 -msgid "Render mode:" +#: gui/options.cpp:619 +msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 -msgid "Fullscreen mode" +#: gui/options.cpp:626 +msgid "Music driver:" msgstr "" -#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 -msgid "Aspect ratio correction" +#: gui/options.cpp:626 gui/options.cpp:627 +msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 -msgid "Music driver:" +#: gui/options.cpp:642 +msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 -msgid "AdLib emulator:" +#: gui/options.cpp:642 gui/options.cpp:643 +msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 +#: gui/options.cpp:653 msgid "Output rate:" msgstr "" -#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 +#: gui/options.cpp:653 gui/options.cpp:654 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" + +#: gui/options.cpp:665 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 +#: gui/options.cpp:665 gui/options.cpp:666 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" + +#: gui/options.cpp:670 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 +#: gui/options.cpp:670 +msgid "Use both MIDI and AdLib sound generation" +msgstr "" + +#: gui/options.cpp:673 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 +#: gui/options.cpp:673 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" + +#: gui/options.cpp:676 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 +#: gui/options.cpp:676 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" + +#: gui/options.cpp:679 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 +#: gui/options.cpp:692 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 +#: gui/options.cpp:697 gui/options.cpp:703 +msgid "Speech" +msgstr "" + +#: gui/options.cpp:698 gui/options.cpp:704 +msgid "Subtitles" +msgstr "" + +#: gui/options.cpp:699 gui/options.cpp:705 +msgid "Both" +msgstr "" + +#: gui/options.cpp:703 +msgid "Spch" +msgstr "" + +#: gui/options.cpp:704 +msgid "Subs" +msgstr "" + +#: gui/options.cpp:705 +msgid "Show subtitles and play speech" +msgstr "" + +#: gui/options.cpp:709 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 +#: gui/options.cpp:721 msgid "Music volume:" msgstr "" -#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 +#: gui/options.cpp:728 msgid "Mute All" msgstr "" -#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 +#: gui/options.cpp:731 gui/options.cpp:732 +msgid "Special sound effects volume" +msgstr "" + +#: gui/options.cpp:738 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 +#: gui/options.cpp:818 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 +#: gui/options.cpp:821 gui/options.cpp:822 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" + +#: gui/options.cpp:825 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 +#: gui/options.cpp:830 msgid "Misc" msgstr "" -#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 +#: gui/options.cpp:832 msgid "Theme:" msgstr "" -#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 +#: gui/options.cpp:836 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 +#: gui/options.cpp:842 msgid "Autosave:" msgstr "" -#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 -#: gui/options.cpp:849 +#: gui/options.cpp:850 msgid "Keys" msgstr "" -#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 +#: gui/options.cpp:857 +msgid "GUI Language:" +msgstr "" + +#: gui/options.cpp:857 +msgid "Language of ScummVM GUI" +msgstr "" + +#: gui/options.cpp:862 msgid "English" msgstr "" -#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 -#: gui/options.cpp:1008 +#: gui/options.cpp:996 +msgid "You have to restart ScummVM to take the effect." +msgstr "" + +#: gui/options.cpp:1009 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 -#: gui/options.cpp:1015 +#: gui/options.cpp:1016 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 -#: gui/options.cpp:1024 +#: gui/options.cpp:1025 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 -#: gui/options.cpp:1034 +#: gui/options.cpp:1035 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 -#: gui/options.cpp:1045 +#: gui/options.cpp:1046 msgid "Select directory for plugins" msgstr "" @@ -592,6 +701,18 @@ msgstr "" msgid "Select a Theme" msgstr "" +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "" + #: base/main.cpp:105 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" @@ -705,163 +826,6 @@ msgstr "" msgid "Unknown Error" msgstr "" -#: engines/dialogs.cpp:89 -msgid "Resume" -msgstr "" - -#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 -#: backends/platform/symbian/src/SymbianActions.cpp:47 -#: backends/platform/wince/CEActionsPocket.cpp:42 -#: backends/platform/wince/CEActionsPocket.cpp:263 -#: backends/platform/wince/CEActionsSmartphone.cpp:44 -#: backends/platform/wince/CEActionsSmartphone.cpp:225 -msgid "Save" -msgstr "" - -#: engines/dialogs.cpp:99 -msgid "Options" -msgstr "" - -#: engines/dialogs.cpp:104 -msgid "Help" -msgstr "" - -#: engines/dialogs.cpp:107 -msgid "About" -msgstr "" - -#: engines/dialogs.cpp:109 -msgid "Return to Launcher" -msgstr "" - -#: engines/dialogs.cpp:119 -msgid "Save game:" -msgstr "" - -#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 -msgid "You have to restart ScummVM to take the effect." -msgstr "" - -#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 -msgid "Disabled GFX" -msgstr "" - -#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 -msgid "Standard Renderer (16bpp)" -msgstr "" - -#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 -msgid "Antialiased Renderer (16bpp)" -msgstr "" - -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 -msgid "No music" -msgstr "" - -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "" - -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "" - -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 -msgid "Atari ST MIDI" -msgstr "" - -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "" - -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "" - -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "" - -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 -msgid "CoreAudio" -msgstr "" - -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "" - -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "" - -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "" - -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "" - -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 -msgid "MT-32 Emulation" -msgstr "" - -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 -msgid "AdLib" -msgstr "" - -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "" - -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 -msgid "IBM PCjr" -msgstr "" - -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 -msgid "Creative Music System" -msgstr "" - -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 -msgid "FM Towns" -msgstr "" - -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 -msgid "TiMidity" -msgstr "" - -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 -msgid "~Q~uit" -msgstr "" - -#: gui/launcher.cpp:501 -msgid "A~b~out..." -msgstr "" - -#: gui/launcher.cpp:502 -msgid "~O~ptions..." -msgstr "" - -#: gui/launcher.cpp:504 -msgid "~S~tart" -msgstr "" - -#: gui/launcher.cpp:507 -msgid "~L~oad..." -msgstr "" - -#: gui/launcher.cpp:511 -msgid "~A~dd Game..." -msgstr "" - -#: gui/launcher.cpp:513 -msgid "~E~dit Game..." -msgstr "" - -#: gui/launcher.cpp:515 -msgid "~R~emove Game" -msgstr "" - #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "" @@ -890,6 +854,18 @@ msgstr "" msgid "~R~eturn to Launcher" msgstr "" +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "" + +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "" + #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 msgid "~O~K" @@ -917,184 +893,92 @@ msgstr "" msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 -#: gui/options.cpp:702 -msgid "Speech" -msgstr "" - -#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 -#: gui/options.cpp:703 -msgid "Subtitles" -msgstr "" - -#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 -#: gui/options.cpp:704 -msgid "Both" -msgstr "" - -#: gui/options.cpp:683 gui/options.cpp:702 -msgid "Spch" -msgstr "" - -#: gui/options.cpp:684 gui/options.cpp:703 -msgid "Subs" -msgstr "" - -#: gui/browser.cpp:69 -msgid "Go to previous directory level" -msgstr "" - -#: gui/launcher.cpp:511 -msgid "Hold Shift for Mass Add" -msgstr "" - -#: gui/launcher.cpp:522 -msgid "Search in game list" -msgstr "" - -#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 -msgid "Clear value" -msgstr "" - -#: gui/launcher.cpp:173 gui/launcher.cpp:174 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" - -#: gui/launcher.cpp:177 gui/launcher.cpp:178 -msgid "Full title of the game" -msgstr "" - -#: gui/launcher.cpp:181 gui/launcher.cpp:182 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" - -#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 -msgid "Platform the game was originally designed for" -msgstr "" - -#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 -msgid "Specifies path to additional data used the game" -msgstr "" - -#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 -#: gui/options.cpp:815 -msgid "Specifies where your savegames are put" -msgstr "" - -#: gui/launcher.cpp:500 -msgid "Quit ScummVM" -msgstr "" - -#: gui/launcher.cpp:501 -msgid "About ScummVM" -msgstr "" - -#: gui/launcher.cpp:502 -msgid "Change global ScummVM options" -msgstr "" - -#: gui/launcher.cpp:504 -msgid "Start selected game" +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" msgstr "" -#: gui/launcher.cpp:507 -msgid "Load savegame for selected game" +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" msgstr "" -#: gui/launcher.cpp:513 -msgid "Change game options" +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" msgstr "" -#: gui/launcher.cpp:515 -msgid "Remove game from the list. The game data files stay intact" +#: sound/mididrv.cpp:61 +msgid "No music" msgstr "" -#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 -#: gui/options.cpp:606 -msgid "Special dithering modes supported by some games" +#: sound/mididrv.cpp:64 +msgid "Windows MIDI" msgstr "" -#: gui/options.cpp:604 gui/options.cpp:618 -msgid "Correct aspect ratio for 320x200 games" +#: sound/mididrv.cpp:68 +msgid "ALSA" msgstr "" -#: gui/options.cpp:611 gui/options.cpp:612 -msgid "Specifies output sound device or sound emulator" +#: sound/mididrv.cpp:72 +msgid "Atari ST MIDI" msgstr "" -#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 -#: gui/options.cpp:642 -msgid "AdLib is used for music in many games" +#: sound/mididrv.cpp:76 +msgid "SEQ" msgstr "" -#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 -#: gui/options.cpp:653 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" +#: sound/mididrv.cpp:80 +msgid "DMedia" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 -#: gui/options.cpp:665 -msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +#: sound/mididrv.cpp:84 +msgid "CAMD" msgstr "" -#: gui/options.cpp:650 gui/options.cpp:669 -msgid "Use both MIDI and AdLib sound generation" +#: sound/mididrv.cpp:88 +msgid "CoreAudio" msgstr "" -#: gui/options.cpp:653 gui/options.cpp:672 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" +#: sound/mididrv.cpp:90 +msgid "CoreMIDI" msgstr "" -#: gui/options.cpp:656 gui/options.cpp:675 -msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +#: sound/mididrv.cpp:95 +msgid "Yamaha Pa1" msgstr "" -#: gui/options.cpp:685 gui/options.cpp:704 -msgid "Show subtitles and play speech" +#: sound/mididrv.cpp:97 +msgid "Tapwave Zodiac" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 -#: gui/options.cpp:731 -msgid "Special sound effects volume" +#: sound/mididrv.cpp:102 +msgid "FluidSynth" msgstr "" -#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 -#: gui/options.cpp:821 -msgid "Specifies path to additional data used by all games or ScummVM" +#: sound/mididrv.cpp:105 +msgid "MT-32 Emulation" msgstr "" -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "GUI Language:" +#: sound/mididrv.cpp:109 +msgid "AdLib" msgstr "" -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "Language of ScummVM GUI" +#: sound/mididrv.cpp:110 +msgid "PC Speaker" msgstr "" -#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 -#: gui/options.cpp:626 -msgid "Specifies output sound device or sound card emulator" +#: sound/mididrv.cpp:111 +msgid "IBM PCjr" msgstr "" -#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 -msgid "~Z~ip Mode Activated" +#: sound/mididrv.cpp:112 +msgid "Creative Music System" msgstr "" -#: engines/mohawk/dialogs.cpp:82 -msgid "~T~ransitions Enabled" +#: sound/mididrv.cpp:113 +msgid "FM Towns" msgstr "" -#: engines/mohawk/dialogs.cpp:116 -msgid "~W~ater Effect Enabled" +#: sound/mididrv.cpp:115 +msgid "TiMidity" msgstr "" #: backends/keymapper/remap-dialog.cpp:49 @@ -1247,6 +1131,12 @@ msgstr "" msgid "Fast mode" msgstr "" +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:56 msgid "Debugger" msgstr "" @@ -1263,7 +1153,7 @@ msgstr "" msgid "Key mapper" msgstr "" -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 msgid "Do you want to quit ?" msgstr "" -- cgit v1.2.3 From 1028e8e0c8a9ebef7f99d0ee512ff8e60fe563fe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 19:14:40 +0000 Subject: Yet another fix for "update-translations" in out of soucre directory builds. (Whoops...) svn-id: r49944 --- po/module.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/po/module.mk b/po/module.mk index f6ed7ad18f..bc15902833 100644 --- a/po/module.mk +++ b/po/module.mk @@ -24,8 +24,8 @@ updatepot: mv -f $(POTFILE).new $(POTFILE); \ fi; -po/%.po: $(srcdir)/$(POTFILE) - msgmerge $@ $(srcdir)/$(POTFILE) -o $@.new +%.po: $(POTFILE) + msgmerge $@ $(POTFILE) -o $@.new if cmp $@ $@.new >/dev/null 2>&1; then \ rm -f $@.new; \ else \ -- cgit v1.2.3 From 4dbee278f1c768c2840d9eb3b46877c5d7dc2520 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 19:15:03 +0000 Subject: Update our two current translations too. svn-id: r49945 --- po/hu_HU.po | 818 +++++++++++++++++++++++----------------------------- po/ru_RU.po | 946 ++++++++++++++++++++++++++++-------------------------------- 2 files changed, 802 insertions(+), 962 deletions(-) diff --git a/po/hu_HU.po b/po/hu_HU.po index aaa5df9f52..196754d1fe 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,24 +7,25 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-13 16:52+0300\n" +"POT-Creation-Date: 2010-06-17 20:57+0200\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: gui/about.cpp:117 +#: gui/about.cpp:96 msgid "C2(built on " msgstr "" -#: gui/about.cpp:125 +#: gui/about.cpp:104 msgid "C1Features compiled in:" msgstr "" -#: gui/about.cpp:132 +#: gui/about.cpp:111 msgid "C1Available engines:" msgstr "" @@ -32,73 +33,74 @@ msgstr "" msgid "Go up" msgstr "" -#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 -#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 -#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 -#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "" -#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 +#: gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "" -#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 -#: backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 +#: gui/GuiManager.cpp:108 base/main.cpp:284 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 +#: gui/GuiManager.cpp:111 base/main.cpp:287 msgid "Remap keys" msgstr "" -#: gui/KeysDialog.cpp:43 +#: gui/KeysDialog.cpp:44 msgid "Map" msgstr "" -#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 -#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "Igen" -#: gui/KeysDialog.cpp:51 +#: gui/KeysDialog.cpp:52 msgid "Select an action and click 'Map'" msgstr "" -#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "" -#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "" -#: gui/KeysDialog.cpp:92 +#: gui/KeysDialog.cpp:93 msgid "Please select an action" msgstr "" -#: gui/KeysDialog.cpp:108 +#: gui/KeysDialog.cpp:109 msgid "Press the key to associate" msgstr "" -#: gui/KeysDialog.cpp:147 +#: gui/KeysDialog.cpp:148 msgid "Choose an action to map" msgstr "" @@ -110,119 +112,124 @@ msgstr "" msgid "ID:" msgstr "" +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" + #: gui/launcher.cpp:177 msgid "Name:" msgstr "" -#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "" + +#: gui/launcher.cpp:181 msgid "Language:" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 -#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 -#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 -#: gui/options.cpp:859 sound/mididrv.cpp:60 +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 +#: sound/mididrv.cpp:60 msgid "" msgstr "" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:192 msgid "Platform:" msgstr "" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "" + +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "GFX" msgstr "" -#: gui/launcher.cpp:205 gui/launcher.cpp:206 +#: gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 -#: gui/launcher.cpp:213 gui/options.cpp:789 +#: gui/launcher.cpp:213 gui/options.cpp:790 msgid "Audio" msgstr "Hang" -#: gui/launcher.cpp:214 gui/launcher.cpp:215 +#: gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 -#: gui/launcher.cpp:223 gui/options.cpp:793 +#: gui/launcher.cpp:223 gui/options.cpp:794 msgid "Volume" msgstr "Volumene" -#: gui/launcher.cpp:224 gui/launcher.cpp:225 +#: gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 -#: gui/launcher.cpp:232 gui/options.cpp:801 +#: gui/launcher.cpp:232 gui/options.cpp:802 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:233 gui/launcher.cpp:234 +#: gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 -#: gui/launcher.cpp:244 gui/options.cpp:807 +#: gui/launcher.cpp:244 gui/options.cpp:808 msgid "Paths" msgstr "Ösvények" -#: gui/launcher.cpp:249 gui/launcher.cpp:250 +#: gui/launcher.cpp:250 #, fuzzy msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 -#: gui/launcher.cpp:254 gui/options.cpp:820 +#: gui/launcher.cpp:254 gui/options.cpp:821 msgid "Extra Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:257 gui/launcher.cpp:258 +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "" + +#: gui/launcher.cpp:258 #, fuzzy msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 -#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 -#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 -#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 -#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 -#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 -#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 -#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 -#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 -#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 -#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 -#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 -#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 -#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 -#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 +#: gui/options.cpp:816 +msgid "Specifies where your savegames are put" +msgstr "" + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 +#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 +#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 +#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 +#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 +#: gui/options.cpp:964 gui/options.cpp:1063 msgid "None" msgstr "Semmi" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 #, fuzzy msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 gui/options.cpp:1056 +#: gui/launcher.cpp:391 gui/options.cpp:1057 msgid "Select SoundFont" msgstr "" @@ -243,49 +250,86 @@ msgid "This game ID is already taken. Please choose another one." msgstr "" #: gui/launcher.cpp:500 engines/dialogs.cpp:113 -#: backends/platform/symbian/src/SymbianActions.cpp:55 -#: backends/platform/wince/CEActionsPocket.cpp:43 -#: backends/platform/wince/CEActionsSmartphone.cpp:51 -msgid "Quit" +msgid "~Q~uit" +msgstr "" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" msgstr "" #: gui/launcher.cpp:501 -msgid "About..." +msgid "A~b~out..." +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" msgstr "" #: gui/launcher.cpp:502 -msgid "Options..." +msgid "~O~ptions..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "" + +#: gui/launcher.cpp:504 +msgid "~S~tart" msgstr "" #: gui/launcher.cpp:504 -msgid "Start" +msgid "Start selected game" msgstr "" #: gui/launcher.cpp:507 -msgid "Load..." +msgid "~L~oad..." msgstr "" -#: gui/launcher.cpp:511 gui/launcher.cpp:990 -msgid "Add Game..." +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "" + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" msgstr "" #: gui/launcher.cpp:513 -msgid "Edit Game..." +msgid "~E~dit Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Change game options" msgstr "" #: gui/launcher.cpp:515 -msgid "Remove Game" +msgid "~R~emove Game" +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "" + +#: gui/launcher.cpp:522 +msgid "Search in game list" msgstr "" #: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" msgstr "" +#: gui/launcher.cpp:529 gui/options.cpp:667 +msgid "Clear value" +msgstr "" + #: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" @@ -298,7 +342,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -306,7 +350,7 @@ msgid "Yes" msgstr "" #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -342,12 +386,15 @@ msgstr "" msgid "Mass Add..." msgstr "" +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "" + #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." msgstr "" #: gui/massadd.cpp:244 -#, c-format msgid "Scan complete!" msgstr "" @@ -366,193 +413,257 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "Never" msgstr "Soha" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 5 mins" msgstr "5 percenként" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 10 mins" msgstr "10 percenként" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 15 mins" msgstr "15 percenként" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 30 mins" msgstr "30 percenként" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "8 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "11kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "22 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "44 kHz" msgstr "" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "48 kHz" msgstr "" -#: gui/options.cpp:89 gui/options.cpp:95 -msgid "Speech Only" -msgstr "Csak a beszéd" - -#: gui/options.cpp:90 -msgid "Speech and Subtitles" -msgstr "Beszéd és a Feliratok" - -#: gui/options.cpp:91 gui/options.cpp:97 -msgid "Subtitles Only" -msgstr "Csak feliratok" - -#: gui/options.cpp:96 -msgid "Speech & Subs" -msgstr "Beszéd s Feliratok" - -#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 +#: gui/options.cpp:595 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 +#: gui/options.cpp:606 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 +#: gui/options.cpp:606 gui/options.cpp:607 +msgid "Special dithering modes supported by some games" +msgstr "" + +#: gui/options.cpp:616 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 +#: gui/options.cpp:619 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 +#: gui/options.cpp:619 +msgid "Correct aspect ratio for 320x200 games" +msgstr "" + +#: gui/options.cpp:626 msgid "Music driver:" msgstr "Zenei vezet :" -#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 +#: gui/options.cpp:626 gui/options.cpp:627 +msgid "Specifies output sound device or sound card emulator" +msgstr "" + +#: gui/options.cpp:642 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 +#: gui/options.cpp:642 gui/options.cpp:643 +msgid "AdLib is used for music in many games" +msgstr "" + +#: gui/options.cpp:653 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 +#: gui/options.cpp:653 gui/options.cpp:654 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" + +#: gui/options.cpp:665 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 +#: gui/options.cpp:665 gui/options.cpp:666 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" + +#: gui/options.cpp:670 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 +#: gui/options.cpp:670 +msgid "Use both MIDI and AdLib sound generation" +msgstr "" + +#: gui/options.cpp:673 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 +#: gui/options.cpp:673 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" + +#: gui/options.cpp:676 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 +#: gui/options.cpp:676 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" + +#: gui/options.cpp:679 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 +#: gui/options.cpp:692 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 +#: gui/options.cpp:697 gui/options.cpp:703 +#, fuzzy +msgid "Speech" +msgstr "Csak a beszéd" + +#: gui/options.cpp:698 gui/options.cpp:704 +#, fuzzy +msgid "Subtitles" +msgstr "Csak feliratok" + +#: gui/options.cpp:699 gui/options.cpp:705 +msgid "Both" +msgstr "" + +#: gui/options.cpp:703 +msgid "Spch" +msgstr "" + +#: gui/options.cpp:704 +msgid "Subs" +msgstr "" + +#: gui/options.cpp:705 +msgid "Show subtitles and play speech" +msgstr "" + +#: gui/options.cpp:709 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 +#: gui/options.cpp:721 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 +#: gui/options.cpp:728 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 +#: gui/options.cpp:731 gui/options.cpp:732 +msgid "Special sound effects volume" +msgstr "" + +#: gui/options.cpp:738 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Save Path: " msgstr "" -#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 +#: gui/options.cpp:818 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 +#: gui/options.cpp:821 gui/options.cpp:822 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" + +#: gui/options.cpp:825 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 +#: gui/options.cpp:830 msgid "Misc" msgstr "" -#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 +#: gui/options.cpp:832 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 +#: gui/options.cpp:836 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 +#: gui/options.cpp:842 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 -#: gui/options.cpp:849 +#: gui/options.cpp:850 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 +#: gui/options.cpp:857 +msgid "GUI Language:" +msgstr "" + +#: gui/options.cpp:857 +msgid "Language of ScummVM GUI" +msgstr "" + +#: gui/options.cpp:862 msgid "English" msgstr "" -#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 -#: gui/options.cpp:1008 +#: gui/options.cpp:996 +msgid "You have to restart ScummVM to take the effect." +msgstr "" + +#: gui/options.cpp:1009 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 -#: gui/options.cpp:1015 +#: gui/options.cpp:1016 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 -#: gui/options.cpp:1024 +#: gui/options.cpp:1025 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 -#: gui/options.cpp:1034 +#: gui/options.cpp:1035 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 -#: gui/options.cpp:1045 +#: gui/options.cpp:1046 msgid "Select directory for plugins" msgstr "" @@ -597,6 +708,18 @@ msgstr "" msgid "Select a Theme" msgstr "" +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "" + #: base/main.cpp:105 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" @@ -711,165 +834,6 @@ msgstr "" msgid "Unknown Error" msgstr "" -#: engines/dialogs.cpp:89 -msgid "Resume" -msgstr "" - -#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 -#: backends/platform/symbian/src/SymbianActions.cpp:47 -#: backends/platform/wince/CEActionsPocket.cpp:42 -#: backends/platform/wince/CEActionsPocket.cpp:263 -#: backends/platform/wince/CEActionsSmartphone.cpp:44 -#: backends/platform/wince/CEActionsSmartphone.cpp:225 -msgid "Save" -msgstr "" - -#: engines/dialogs.cpp:99 -msgid "Options" -msgstr "" - -#: engines/dialogs.cpp:104 -msgid "Help" -msgstr "" - -#: engines/dialogs.cpp:107 -msgid "About" -msgstr "" - -#: engines/dialogs.cpp:109 -msgid "Return to Launcher" -msgstr "" - -#: engines/dialogs.cpp:119 -msgid "Save game:" -msgstr "" - -#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 -msgid "You have to restart ScummVM to take the effect." -msgstr "" - -#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 -msgid "Disabled GFX" -msgstr "" - -#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 -msgid "Standard Renderer (16bpp)" -msgstr "" - -#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 -msgid "Antialiased Renderer (16bpp)" -msgstr "" - -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 -msgid "No music" -msgstr "" - -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "" - -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "" - -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 -msgid "Atari ST MIDI" -msgstr "" - -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "" - -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "" - -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "" - -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 -#, fuzzy -msgid "CoreAudio" -msgstr "Hang" - -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "" - -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "" - -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "" - -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "" - -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 -msgid "MT-32 Emulation" -msgstr "" - -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 -#, fuzzy -msgid "AdLib" -msgstr "Hang" - -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "" - -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 -msgid "IBM PCjr" -msgstr "" - -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 -msgid "Creative Music System" -msgstr "" - -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 -msgid "FM Towns" -msgstr "" - -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 -msgid "TiMidity" -msgstr "" - -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 -msgid "~Q~uit" -msgstr "" - -#: gui/launcher.cpp:501 -msgid "A~b~out..." -msgstr "" - -#: gui/launcher.cpp:502 -msgid "~O~ptions..." -msgstr "" - -#: gui/launcher.cpp:504 -msgid "~S~tart" -msgstr "" - -#: gui/launcher.cpp:507 -msgid "~L~oad..." -msgstr "" - -#: gui/launcher.cpp:511 -msgid "~A~dd Game..." -msgstr "" - -#: gui/launcher.cpp:513 -msgid "~E~dit Game..." -msgstr "" - -#: gui/launcher.cpp:515 -msgid "~R~emove Game" -msgstr "" - #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "" @@ -898,6 +862,18 @@ msgstr "" msgid "~R~eturn to Launcher" msgstr "" +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "" + +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "" + #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 #, fuzzy @@ -927,186 +903,94 @@ msgstr "" msgid "~C~lose" msgstr "" -#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 -#: gui/options.cpp:702 -#, fuzzy -msgid "Speech" -msgstr "Csak a beszéd" - -#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 -#: gui/options.cpp:703 -#, fuzzy -msgid "Subtitles" -msgstr "Csak feliratok" - -#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 -#: gui/options.cpp:704 -msgid "Both" -msgstr "" - -#: gui/options.cpp:683 gui/options.cpp:702 -msgid "Spch" -msgstr "" - -#: gui/options.cpp:684 gui/options.cpp:703 -msgid "Subs" -msgstr "" - -#: gui/browser.cpp:69 -msgid "Go to previous directory level" -msgstr "" - -#: gui/launcher.cpp:511 -msgid "Hold Shift for Mass Add" -msgstr "" - -#: gui/launcher.cpp:522 -msgid "Search in game list" -msgstr "" - -#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 -msgid "Clear value" -msgstr "" - -#: gui/launcher.cpp:173 gui/launcher.cpp:174 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" - -#: gui/launcher.cpp:177 gui/launcher.cpp:178 -msgid "Full title of the game" -msgstr "" - -#: gui/launcher.cpp:181 gui/launcher.cpp:182 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" - -#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 -msgid "Platform the game was originally designed for" -msgstr "" - -#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 -msgid "Specifies path to additional data used the game" -msgstr "" - -#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 -#: gui/options.cpp:815 -msgid "Specifies where your savegames are put" -msgstr "" - -#: gui/launcher.cpp:500 -msgid "Quit ScummVM" -msgstr "" - -#: gui/launcher.cpp:501 -msgid "About ScummVM" -msgstr "" - -#: gui/launcher.cpp:502 -msgid "Change global ScummVM options" -msgstr "" - -#: gui/launcher.cpp:504 -msgid "Start selected game" +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" msgstr "" -#: gui/launcher.cpp:507 -msgid "Load savegame for selected game" +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" msgstr "" -#: gui/launcher.cpp:513 -msgid "Change game options" +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" msgstr "" -#: gui/launcher.cpp:515 -msgid "Remove game from the list. The game data files stay intact" +#: sound/mididrv.cpp:61 +msgid "No music" msgstr "" -#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 -#: gui/options.cpp:606 -msgid "Special dithering modes supported by some games" +#: sound/mididrv.cpp:64 +msgid "Windows MIDI" msgstr "" -#: gui/options.cpp:604 gui/options.cpp:618 -msgid "Correct aspect ratio for 320x200 games" +#: sound/mididrv.cpp:68 +msgid "ALSA" msgstr "" -#: gui/options.cpp:611 gui/options.cpp:612 -msgid "Specifies output sound device or sound emulator" +#: sound/mididrv.cpp:72 +msgid "Atari ST MIDI" msgstr "" -#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 -#: gui/options.cpp:642 -msgid "AdLib is used for music in many games" +#: sound/mididrv.cpp:76 +msgid "SEQ" msgstr "" -#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 -#: gui/options.cpp:653 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" +#: sound/mididrv.cpp:80 +msgid "DMedia" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 -#: gui/options.cpp:665 -msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +#: sound/mididrv.cpp:84 +msgid "CAMD" msgstr "" -#: gui/options.cpp:650 gui/options.cpp:669 -msgid "Use both MIDI and AdLib sound generation" -msgstr "" +#: sound/mididrv.cpp:88 +#, fuzzy +msgid "CoreAudio" +msgstr "Hang" -#: gui/options.cpp:653 gui/options.cpp:672 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" +#: sound/mididrv.cpp:90 +msgid "CoreMIDI" msgstr "" -#: gui/options.cpp:656 gui/options.cpp:675 -msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +#: sound/mididrv.cpp:95 +msgid "Yamaha Pa1" msgstr "" -#: gui/options.cpp:685 gui/options.cpp:704 -msgid "Show subtitles and play speech" +#: sound/mididrv.cpp:97 +msgid "Tapwave Zodiac" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 -#: gui/options.cpp:731 -msgid "Special sound effects volume" +#: sound/mididrv.cpp:102 +msgid "FluidSynth" msgstr "" -#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 -#: gui/options.cpp:821 -msgid "Specifies path to additional data used by all games or ScummVM" +#: sound/mididrv.cpp:105 +msgid "MT-32 Emulation" msgstr "" -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "GUI Language:" -msgstr "" +#: sound/mididrv.cpp:109 +#, fuzzy +msgid "AdLib" +msgstr "Hang" -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "Language of ScummVM GUI" +#: sound/mididrv.cpp:110 +msgid "PC Speaker" msgstr "" -#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 -#: gui/options.cpp:626 -msgid "Specifies output sound device or sound card emulator" +#: sound/mididrv.cpp:111 +msgid "IBM PCjr" msgstr "" -#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 -msgid "~Z~ip Mode Activated" +#: sound/mididrv.cpp:112 +msgid "Creative Music System" msgstr "" -#: engines/mohawk/dialogs.cpp:82 -msgid "~T~ransitions Enabled" +#: sound/mididrv.cpp:113 +msgid "FM Towns" msgstr "" -#: engines/mohawk/dialogs.cpp:116 -msgid "~W~ater Effect Enabled" +#: sound/mididrv.cpp:115 +msgid "TiMidity" msgstr "" #: backends/keymapper/remap-dialog.cpp:49 @@ -1262,6 +1146,12 @@ msgstr "" msgid "Fast mode" msgstr "Grafikus mód:" +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:56 msgid "Debugger" msgstr "" @@ -1278,7 +1168,7 @@ msgstr "" msgid "Key mapper" msgstr "" -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 msgid "Do you want to quit ?" msgstr "" @@ -1501,3 +1391,15 @@ msgstr "" #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Do you want to perform an automatic scan ?" msgstr "" + +#~ msgid "Speech Only" +#~ msgstr "Csak a beszéd" + +#~ msgid "Speech and Subtitles" +#~ msgstr "Beszéd és a Feliratok" + +#~ msgid "Subtitles Only" +#~ msgstr "Csak feliratok" + +#~ msgid "Speech & Subs" +#~ msgstr "Beszéd s Feliratok" diff --git a/po/ru_RU.po b/po/ru_RU.po index 1d1582962e..ab11755975 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,25 +7,26 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-13 16:52+0300\n" +"POT-Creation-Date: 2010-06-17 20:57+0200\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1251\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" -"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: gui/about.cpp:117 +#: gui/about.cpp:96 msgid "C2(built on " msgstr "C2(ñîáðàí " -#: gui/about.cpp:125 +#: gui/about.cpp:104 msgid "C1Features compiled in:" msgstr "C1Âêëþ÷åííûå â áèëä îïöèè:" -#: gui/about.cpp:132 +#: gui/about.cpp:111 msgid "C1Available engines:" msgstr "C1Äîñòóïíûå äâèæêè:" @@ -33,73 +34,74 @@ msgstr "C1 msgid "Go up" msgstr "Ââåðõ" -#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 -#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 -#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 -#: gui/options.cpp:861 gui/chooser.cpp:49 gui/launcher.cpp:266 -#: gui/options.cpp:878 backends/platform/wii/options.cpp:48 +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Îòìåíà" -#: gui/browser.cpp:71 gui/themebrowser.cpp:57 gui/chooser.cpp:50 +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" msgstr "Âûáðàòü" -#: gui/GuiManager.cpp:75 gui/GuiManager.cpp:76 +#: gui/GuiManager.cpp:76 msgid "Failed to load any GUI theme, aborting" msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" -#: gui/GuiManager.cpp:98 gui/GuiManager.cpp:102 -#: backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Çàêðûòü" -#: gui/GuiManager.cpp:101 gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:105 msgid "Mouse click" msgstr "Êëèê ìûøüþ" -#: gui/GuiManager.cpp:104 base/main.cpp:284 gui/GuiManager.cpp:108 +#: gui/GuiManager.cpp:108 base/main.cpp:284 msgid "Display keyboard" msgstr "Ïîêàçàòü êëàâèàòóðó" -#: gui/GuiManager.cpp:107 base/main.cpp:287 gui/GuiManager.cpp:111 +#: gui/GuiManager.cpp:111 base/main.cpp:287 msgid "Remap keys" msgstr "Ïåðåíàçíà÷èòü êëàâèøè" -#: gui/KeysDialog.cpp:43 +#: gui/KeysDialog.cpp:44 msgid "Map" msgstr "Íàçíà÷èòü" -#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 -#: engines/dialogs.cpp:301 gui/options.cpp:862 gui/launcher.cpp:267 -#: gui/options.cpp:879 backends/platform/wince/CELauncherDialog.cpp:56 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" -#: gui/KeysDialog.cpp:51 +#: gui/KeysDialog.cpp:52 msgid "Select an action and click 'Map'" msgstr "Âûáåðèòå äåéñòâèå è êëèêíèòå 'Íàçíà÷èòü'" -#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "Íàçíà÷åííàÿ êëàâèøà : %s" -#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "Íàçíà÷åííàÿ êëàâèøà : íåò" -#: gui/KeysDialog.cpp:92 +#: gui/KeysDialog.cpp:93 msgid "Please select an action" msgstr "Ïîæàëóéñòà, âûáåðèòå äåéñòâèå" -#: gui/KeysDialog.cpp:108 +#: gui/KeysDialog.cpp:109 msgid "Press the key to associate" msgstr "Íàæìèòå êëàâèøó äëÿ íàçíà÷åíèÿ" -#: gui/KeysDialog.cpp:147 +#: gui/KeysDialog.cpp:148 msgid "Choose an action to map" msgstr "Âûáåðèòå äåéñòâèå äëÿ íàçíà÷åíèÿ" @@ -111,116 +113,125 @@ msgstr " msgid "ID:" msgstr "ID:" +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Êîðîòêèé èäåíòèôèêàòîð, èñïîëüçóåìûé äëÿ èìåí ñîõðàíåíèé èãð è äëÿ çàïóñêà " +"èç êîìàíäíîé ñòðîêè" + #: gui/launcher.cpp:177 msgid "Name:" msgstr "Íàçâàíèå:" -#: gui/launcher.cpp:181 gui/options.cpp:839 gui/options.cpp:837 +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Ïîëíîå íàçâàíèå èãðû" + +#: gui/launcher.cpp:181 msgid "Language:" msgstr "ßçûê:" -#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 -#: sound/mididrv.cpp:38 sound/mididrv.cpp:39 gui/options.cpp:79 -#: gui/options.cpp:583 gui/options.cpp:593 gui/options.cpp:840 -#: gui/launcher.cpp:194 gui/options.cpp:597 gui/options.cpp:607 -#: gui/options.cpp:859 sound/mididrv.cpp:60 +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " +"ðóññêóþ" + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 +#: sound/mididrv.cpp:60 msgid "" msgstr "<ïî óìîë÷àíèþ>" -#: gui/launcher.cpp:191 gui/launcher.cpp:192 +#: gui/launcher.cpp:192 msgid "Platform:" msgstr "Ïëàòôîðìà:" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" + +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "Graphics" msgstr "Ãðàôèêà" -#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 -#: gui/options.cpp:747 gui/options.cpp:764 gui/launcher.cpp:204 -#: gui/options.cpp:783 +#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 msgid "GFX" msgstr "Ãðô" -#: gui/launcher.cpp:205 gui/launcher.cpp:206 +#: gui/launcher.cpp:206 msgid "Override global graphic settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" -#: gui/launcher.cpp:212 gui/options.cpp:772 gui/options.cpp:770 -#: gui/launcher.cpp:213 gui/options.cpp:789 +#: gui/launcher.cpp:213 gui/options.cpp:790 msgid "Audio" msgstr "Àóäèî" -#: gui/launcher.cpp:214 gui/launcher.cpp:215 +#: gui/launcher.cpp:215 msgid "Override global audio settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" -#: gui/launcher.cpp:222 gui/options.cpp:776 gui/options.cpp:774 -#: gui/launcher.cpp:223 gui/options.cpp:793 +#: gui/launcher.cpp:223 gui/options.cpp:794 msgid "Volume" msgstr "Ãðîìêîñòü" -#: gui/launcher.cpp:224 gui/launcher.cpp:225 +#: gui/launcher.cpp:225 msgid "Override global volume settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" -#: gui/launcher.cpp:231 gui/options.cpp:784 gui/options.cpp:782 -#: gui/launcher.cpp:232 gui/options.cpp:801 +#: gui/launcher.cpp:232 gui/options.cpp:802 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:233 gui/launcher.cpp:234 +#: gui/launcher.cpp:234 msgid "Override global MIDI settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" -#: gui/launcher.cpp:243 gui/options.cpp:790 gui/options.cpp:788 -#: gui/launcher.cpp:244 gui/options.cpp:807 +#: gui/launcher.cpp:244 gui/options.cpp:808 msgid "Paths" msgstr "Ïóòè" -#: gui/launcher.cpp:249 gui/launcher.cpp:250 +#: gui/launcher.cpp:250 msgid "Game Path:" msgstr "Ïóòü ê èãðå: " -#: gui/launcher.cpp:253 gui/options.cpp:803 gui/options.cpp:801 -#: gui/launcher.cpp:254 gui/options.cpp:820 +#: gui/launcher.cpp:254 gui/options.cpp:821 msgid "Extra Path:" msgstr "Äîï. ïóòü:" -#: gui/launcher.cpp:257 gui/launcher.cpp:258 +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ äëÿ èãðû" + +#: gui/launcher.cpp:258 msgid "Save Path:" msgstr "Ïóòü ñîõð.: " -#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 -#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 -#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 -#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 -#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 -#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 -#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 -#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 -#: gui/options.cpp:946 gui/options.cpp:1045 gui/options.cpp:222 -#: gui/options.cpp:379 gui/options.cpp:465 gui/options.cpp:511 -#: gui/options.cpp:646 gui/options.cpp:799 gui/options.cpp:802 -#: gui/options.cpp:806 gui/options.cpp:1043 gui/launcher.cpp:275 -#: gui/options.cpp:383 gui/options.cpp:469 gui/options.cpp:525 -#: gui/options.cpp:665 gui/options.cpp:818 gui/options.cpp:821 -#: gui/options.cpp:825 gui/options.cpp:902 gui/options.cpp:908 -#: gui/options.cpp:914 gui/options.cpp:922 gui/options.cpp:950 -#: gui/options.cpp:956 gui/options.cpp:963 gui/options.cpp:1062 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 +#: gui/options.cpp:816 +msgid "Specifies where your savegames are put" +msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 +#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 +#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 +#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 +#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 +#: gui/options.cpp:964 gui/options.cpp:1063 msgid "None" msgstr "Íå çàäàí" -#: gui/launcher.cpp:279 gui/launcher.cpp:357 gui/launcher.cpp:280 +#: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Ïî óìîë÷àíèþ" -#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 -#: gui/options.cpp:1037 gui/options.cpp:1056 +#: gui/launcher.cpp:391 gui/options.cpp:1057 msgid "Select SoundFont" msgstr "Âûáåðèòå SoundFont" @@ -241,49 +252,86 @@ msgid "This game ID is already taken. Please choose another one." msgstr "Ýòîò ID èãðû óæå èñïîëüçóåòñÿ. Ïîæàëóéñòà, âûáåðèòå äðóãîé." #: gui/launcher.cpp:500 engines/dialogs.cpp:113 -#: backends/platform/symbian/src/SymbianActions.cpp:55 -#: backends/platform/wince/CEActionsPocket.cpp:43 -#: backends/platform/wince/CEActionsSmartphone.cpp:51 -msgid "Quit" -msgstr "Âûõîä" +msgid "~Q~uit" +msgstr "~Â~ûõîä" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "Âûõîä èç ScummVM" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "Î ï~ð~îãðàììå..." #: gui/launcher.cpp:501 -msgid "About..." -msgstr "Î ïðîãðàììå..." +msgid "About ScummVM" +msgstr "Î ïðîãðàììå ScummVM" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~Î~ïöèè..." #: gui/launcher.cpp:502 -msgid "Options..." -msgstr "Îïöèè..." +msgid "Change global ScummVM options" +msgstr "Èçìåíèòü ãëîáàëüíûå îïöèè ScummVM" #: gui/launcher.cpp:504 -msgid "Start" -msgstr "Ïóñê" +msgid "~S~tart" +msgstr "Ï~ó~ñê" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Çàïóñòèòü âûáðàííóþ èãðó" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~Ç~àãð...." #: gui/launcher.cpp:507 -msgid "Load..." -msgstr "Çàãð...." +msgid "Load savegame for selected game" +msgstr "Çàãðóçèòü ñîõðíåíèå äëÿ âûáðàííîé èãðû" -#: gui/launcher.cpp:511 gui/launcher.cpp:990 -msgid "Add Game..." -msgstr "Íîâ. èãðà..." +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "~Ä~îá. èãðó..." + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "Óäåðæèâàéòå êëàâèøó Shift äëÿ òîãî, ÷òîáû äîáàâèòü íåñêîëüêî èãð" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "Èç~ì~. èãðó..." #: gui/launcher.cpp:513 -msgid "Edit Game..." -msgstr "Èçì. èãðó..." +msgid "Change game options" +msgstr "Èçìåíèòü îïöèè èãðû" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "~Ó~äàëèòü èãðó" #: gui/launcher.cpp:515 -msgid "Remove Game" -msgstr "Óäàëèòü èãðó" +msgid "Remove game from the list. The game data files stay intact" +msgstr "Óäàëèòü èãðó èç ñïèñêà. Íå óäàëÿåò èãðó ñ æåñòêîãî äèñêà" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "Ïîèñê â ñïèñêå èãð" #: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" msgstr "Ïîèñê:" +#: gui/launcher.cpp:529 gui/options.cpp:667 +msgid "Clear value" +msgstr "Î÷èñòèòü çíà÷åíèå" + #: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Çàãðóçèòü èãðó:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" @@ -298,7 +346,7 @@ msgstr "" "äîáàâèòü áîëüøîå êîëè÷åñòâî èãð." #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -306,7 +354,7 @@ msgid "Yes" msgstr "Äà" #: gui/launcher.cpp:661 gui/launcher.cpp:810 -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 @@ -341,12 +389,15 @@ msgstr "ScummVM msgid "Mass Add..." msgstr "Äîá. ìíîãî..." +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Íîâ. èãðà..." + #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." msgstr "... èùó ..." #: gui/massadd.cpp:244 -#, c-format msgid "Scan complete!" msgstr "Ïîèñê çàêîí÷åí!" @@ -365,193 +416,264 @@ msgstr " msgid "Discovered %d new games ..." msgstr "Íàéäåíî %d íîâûõ èãð ..." -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "Never" msgstr "Íèêîãäà" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 5 mins" msgstr "êàæäûå 5 ìèíóò" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 10 mins" msgstr "êàæäûå 10 ìèíóò" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 15 mins" msgstr "êàæäûå 15 ìèíóò" -#: gui/options.cpp:71 gui/options.cpp:77 +#: gui/options.cpp:77 msgid "every 30 mins" msgstr "êàæäûå 30 ìèíóò" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "8 kHz" msgstr "8 êÃö" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "11kHz" msgstr "11 êÃö" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "22 kHz" msgstr "22 êÃö" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "44 kHz" msgstr "44 êÃö" -#: gui/options.cpp:73 gui/options.cpp:79 +#: gui/options.cpp:79 msgid "48 kHz" msgstr "48 êÃö" -#: gui/options.cpp:89 gui/options.cpp:95 -msgid "Speech Only" -msgstr "Òîëüêî îçâó÷êà" - -#: gui/options.cpp:90 -msgid "Speech and Subtitles" -msgstr "Îçâó÷êà è ñóáòèòðû" - -#: gui/options.cpp:91 gui/options.cpp:97 -msgid "Subtitles Only" -msgstr "Òîëüêî ñóáòèòðû" - -#: gui/options.cpp:96 -msgid "Speech & Subs" -msgstr "Çâóê è ñóá." - -#: gui/options.cpp:595 gui/options.cpp:580 gui/options.cpp:594 +#: gui/options.cpp:595 msgid "Graphics mode:" msgstr "Ãðàôè÷åñêèé ðåæèì:" -#: gui/options.cpp:606 gui/options.cpp:591 gui/options.cpp:605 +#: gui/options.cpp:606 msgid "Render mode:" msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" -#: gui/options.cpp:616 gui/options.cpp:601 gui/options.cpp:615 +#: gui/options.cpp:606 gui/options.cpp:607 +msgid "Special dithering modes supported by some games" +msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" + +#: gui/options.cpp:616 msgid "Fullscreen mode" msgstr "Ïîëíîýêðàííûé ðåæèì" -#: gui/options.cpp:619 gui/options.cpp:604 gui/options.cpp:618 +#: gui/options.cpp:619 msgid "Aspect ratio correction" msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" -#: gui/options.cpp:626 gui/options.cpp:611 gui/options.cpp:625 +#: gui/options.cpp:619 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" + +#: gui/options.cpp:626 msgid "Music driver:" msgstr "Äðàéâåð ìóçûêè:" -#: gui/options.cpp:637 gui/options.cpp:622 gui/options.cpp:641 +#: gui/options.cpp:626 gui/options.cpp:627 +msgid "Specifies output sound device or sound card emulator" +msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" + +#: gui/options.cpp:642 msgid "AdLib emulator:" msgstr "Ýìóëÿòîð AdLib:" -#: gui/options.cpp:648 gui/options.cpp:633 gui/options.cpp:652 +#: gui/options.cpp:642 gui/options.cpp:643 +msgid "AdLib is used for music in many games" +msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" + +#: gui/options.cpp:653 msgid "Output rate:" msgstr "Âûõîäíàÿ ÷àñòîòà:" -#: gui/options.cpp:660 gui/options.cpp:645 gui/options.cpp:664 +#: gui/options.cpp:653 gui/options.cpp:654 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " +"ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" + +#: gui/options.cpp:665 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:665 gui/options.cpp:650 gui/options.cpp:669 +#: gui/options.cpp:665 gui/options.cpp:666 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" +"SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " +"Timidity" + +#: gui/options.cpp:670 msgid "Mixed AdLib/MIDI mode" msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" -#: gui/options.cpp:668 gui/options.cpp:653 gui/options.cpp:672 +#: gui/options.cpp:670 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" + +#: gui/options.cpp:673 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" -#: gui/options.cpp:671 gui/options.cpp:656 gui/options.cpp:675 +#: gui/options.cpp:673 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " +"õîòèòå åãî èñïîëüçîâàòü" + +#: gui/options.cpp:676 msgid "Enable Roland GS Mode" msgstr "Âêëþ÷èòü ðåæèì Roland GS" -#: gui/options.cpp:674 gui/options.cpp:659 gui/options.cpp:678 +#: gui/options.cpp:676 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" + +#: gui/options.cpp:679 msgid "MIDI gain:" msgstr "Óñèëåíèå MIDI:" -#: gui/options.cpp:687 gui/options.cpp:672 gui/options.cpp:691 +#: gui/options.cpp:692 msgid "Text and Speech:" msgstr "Òåêñò è îçâó÷êà:" -#: gui/options.cpp:691 gui/options.cpp:689 gui/options.cpp:708 +#: gui/options.cpp:697 gui/options.cpp:703 +msgid "Speech" +msgstr "Îçâó÷êà" + +#: gui/options.cpp:698 gui/options.cpp:704 +msgid "Subtitles" +msgstr "Ñóáòèòðû" + +#: gui/options.cpp:699 gui/options.cpp:705 +msgid "Both" +msgstr "Âñ¸" + +#: gui/options.cpp:703 +msgid "Spch" +msgstr "Îçâ" + +#: gui/options.cpp:704 +msgid "Subs" +msgstr "Ñóá" + +#: gui/options.cpp:705 +msgid "Show subtitles and play speech" +msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" + +#: gui/options.cpp:709 msgid "Subtitle speed:" msgstr "Ñêîðîñòü ñóáòèòðîâ:" -#: gui/options.cpp:703 gui/options.cpp:701 gui/options.cpp:720 +#: gui/options.cpp:721 msgid "Music volume:" msgstr "Ãðîìêîñòü ìóçûêè:" -#: gui/options.cpp:710 gui/options.cpp:708 gui/options.cpp:727 +#: gui/options.cpp:728 msgid "Mute All" msgstr "Âûêëþ÷èòü âñ¸" -#: gui/options.cpp:713 gui/options.cpp:711 gui/options.cpp:730 +#: gui/options.cpp:731 msgid "SFX volume:" msgstr "Ãðîìêîñòü ýôôåêòîâ:" -#: gui/options.cpp:720 gui/options.cpp:718 gui/options.cpp:737 +#: gui/options.cpp:731 gui/options.cpp:732 +msgid "Special sound effects volume" +msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" + +#: gui/options.cpp:738 msgid "Speech volume:" msgstr "Ãðîìêîñòü îçâó÷êè:" -#: gui/options.cpp:797 gui/options.cpp:795 gui/options.cpp:814 +#: gui/options.cpp:815 msgid "Save Path: " msgstr "Ïóòü äëÿ ñîõðàíåíèé: " -#: gui/options.cpp:800 gui/options.cpp:798 gui/options.cpp:817 +#: gui/options.cpp:818 msgid "Theme Path:" msgstr "Ïóòü ê òåìàì:" -#: gui/options.cpp:807 gui/options.cpp:805 gui/options.cpp:824 +#: gui/options.cpp:821 gui/options.cpp:822 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " +"ëèáî ScummVM" + +#: gui/options.cpp:825 msgid "Plugins Path:" msgstr "Ïóòü ê ïëàãèíàì:" -#: gui/options.cpp:812 gui/options.cpp:810 gui/options.cpp:829 +#: gui/options.cpp:830 msgid "Misc" msgstr "Ðàçíîå" -#: gui/options.cpp:814 gui/options.cpp:812 gui/options.cpp:831 +#: gui/options.cpp:832 msgid "Theme:" msgstr "Òåìà:" -#: gui/options.cpp:818 gui/options.cpp:816 gui/options.cpp:835 +#: gui/options.cpp:836 msgid "GUI Renderer:" msgstr "Ðàñòåðèçàòîð GUI:" -#: gui/options.cpp:824 gui/options.cpp:822 gui/options.cpp:841 +#: gui/options.cpp:842 msgid "Autosave:" msgstr "Àâòîñîõðàíåíèå:" -#: gui/options.cpp:832 engines/dialogs.cpp:305 gui/options.cpp:830 -#: gui/options.cpp:849 +#: gui/options.cpp:850 msgid "Keys" msgstr "Êëàâèøè" -#: gui/options.cpp:844 gui/options.cpp:842 gui/options.cpp:861 +#: gui/options.cpp:857 +msgid "GUI Language:" +msgstr "ßçûê èíòåðôåéñà:" + +#: gui/options.cpp:857 +msgid "Language of ScummVM GUI" +msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" + +#: gui/options.cpp:862 msgid "English" msgstr "English" -#: gui/options.cpp:996 gui/options.cpp:991 gui/options.cpp:989 -#: gui/options.cpp:1008 +#: gui/options.cpp:996 +msgid "You have to restart ScummVM to take the effect." +msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." + +#: gui/options.cpp:1009 msgid "Select directory for savegames" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" -#: gui/options.cpp:1003 gui/options.cpp:998 gui/options.cpp:996 -#: gui/options.cpp:1015 +#: gui/options.cpp:1016 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." -#: gui/options.cpp:1012 gui/options.cpp:1007 gui/options.cpp:1005 -#: gui/options.cpp:1024 +#: gui/options.cpp:1025 msgid "Select directory for GUI themes" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" -#: gui/options.cpp:1022 gui/options.cpp:1017 gui/options.cpp:1015 -#: gui/options.cpp:1034 +#: gui/options.cpp:1035 msgid "Select directory for extra files" msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" -#: gui/options.cpp:1033 gui/options.cpp:1028 gui/options.cpp:1026 -#: gui/options.cpp:1045 +#: gui/options.cpp:1046 msgid "Select directory for plugins" msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" @@ -595,6 +717,18 @@ msgstr " msgid "Select a Theme" msgstr "Âûáåðèòå òåìó" +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "Áåç ãðàôèêè" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Ñòàíäàðòíûé ðàñòåðèçàòîð (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" + #: base/main.cpp:105 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" @@ -711,410 +845,160 @@ msgid "Unknown Error" msgstr "Íåèçâåñòíàÿ îøèáêà" #: engines/dialogs.cpp:89 -msgid "Resume" -msgstr "Ïðîäîëæèòü" +msgid "~R~esume" +msgstr "Ïðîäîë~æ~èòü" -#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 -#: backends/platform/symbian/src/SymbianActions.cpp:47 -#: backends/platform/wince/CEActionsPocket.cpp:42 -#: backends/platform/wince/CEActionsPocket.cpp:263 -#: backends/platform/wince/CEActionsSmartphone.cpp:44 -#: backends/platform/wince/CEActionsSmartphone.cpp:225 -msgid "Save" -msgstr "Çàïèñàòü" +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~Ç~àãðóçèòü" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~Ç~àïèñàòü" #: engines/dialogs.cpp:99 -msgid "Options" -msgstr "Îïöèè" +msgid "~O~ptions" +msgstr "~Î~ïöèè" #: engines/dialogs.cpp:104 -msgid "Help" -msgstr "Ïîìîùü" +msgid "~H~elp" +msgstr "~Ï~îìîùü" #: engines/dialogs.cpp:107 -msgid "About" -msgstr "Î ïðîãðàììå" +msgid "~A~bout" +msgstr "Î ïðî~ã~ðàììå" #: engines/dialogs.cpp:109 -msgid "Return to Launcher" -msgstr "Âåðíóòüñÿ â ãëàâíîå ìåíþ" +msgid "~R~eturn to Launcher" +msgstr "~Â~åðíóòüñÿ â ãëàâíîå ìåíþ" #: engines/dialogs.cpp:119 msgid "Save game:" msgstr "Ñîõðàíèòü èãðó: " -#: gui/options.cpp:978 gui/options.cpp:976 gui/options.cpp:995 -msgid "You have to restart ScummVM to take the effect." -msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Çàïèñàòü" -#: gui/ThemeEngine.cpp:333 gui/ThemeEngine.cpp:337 -msgid "Disabled GFX" -msgstr "Áåç ãðàôèêè" +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~O~K" -#: gui/ThemeEngine.cpp:334 gui/ThemeEngine.cpp:338 -msgid "Standard Renderer (16bpp)" -msgstr "Ñòàíäàðòíûé ðàñòåðèçàòîð (16bpp)" +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "Î~ò~ìåíà" -#: gui/ThemeEngine.cpp:336 gui/ThemeEngine.cpp:340 -msgid "Antialiased Renderer (16bpp)" -msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~Ê~ëàâèøè" -#: sound/mididrv.cpp:39 sound/mididrv.cpp:40 sound/mididrv.cpp:61 -msgid "No music" -msgstr "Áåç ìóçûêè" +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~Ï~ðåä" -#: sound/mididrv.cpp:42 sound/mididrv.cpp:43 sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "Windows MIDI" +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~Ñ~ëåä" -#: sound/mididrv.cpp:46 sound/mididrv.cpp:47 sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "ALSA" +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~Ç~àêðûòü" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "Ðåæèì áûñòðîãî ïåðåõîäà àêòèâèðîâàí" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "Ïåðåõîäû àêòèâèðîâàíû" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "Ýôôåêòû âîäû âêëþ÷åíû" + +#: sound/mididrv.cpp:61 +msgid "No music" +msgstr "Áåç ìóçûêè" -#: sound/mididrv.cpp:50 sound/mididrv.cpp:51 sound/mididrv.cpp:72 +#: sound/mididrv.cpp:64 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: sound/mididrv.cpp:68 +msgid "ALSA" +msgstr "ALSA" + +#: sound/mididrv.cpp:72 msgid "Atari ST MIDI" msgstr "Atars ST MIDI" -#: sound/mididrv.cpp:54 sound/mididrv.cpp:55 sound/mididrv.cpp:76 +#: sound/mididrv.cpp:76 msgid "SEQ" msgstr "SEQ" -#: sound/mididrv.cpp:58 sound/mididrv.cpp:59 sound/mididrv.cpp:80 +#: sound/mididrv.cpp:80 msgid "DMedia" msgstr "DMedia" -#: sound/mididrv.cpp:62 sound/mididrv.cpp:63 sound/mididrv.cpp:84 +#: sound/mididrv.cpp:84 msgid "CAMD" msgstr "CAMD" -#: sound/mididrv.cpp:66 sound/mididrv.cpp:67 sound/mididrv.cpp:88 +#: sound/mididrv.cpp:88 msgid "CoreAudio" msgstr "CoreAudio" -#: sound/mididrv.cpp:68 sound/mididrv.cpp:69 sound/mididrv.cpp:90 +#: sound/mididrv.cpp:90 msgid "CoreMIDI" msgstr "CoreMIDI" -#: sound/mididrv.cpp:73 sound/mididrv.cpp:74 sound/mididrv.cpp:95 +#: sound/mididrv.cpp:95 msgid "Yamaha Pa1" msgstr "Yamaha Pa1" -#: sound/mididrv.cpp:75 sound/mididrv.cpp:76 sound/mididrv.cpp:97 +#: sound/mididrv.cpp:97 msgid "Tapwave Zodiac" msgstr "Tapware Zodiac" -#: sound/mididrv.cpp:80 sound/mididrv.cpp:81 sound/mididrv.cpp:102 +#: sound/mididrv.cpp:102 msgid "FluidSynth" msgstr "FluidSynth" -#: sound/mididrv.cpp:83 sound/mididrv.cpp:84 sound/mididrv.cpp:105 +#: sound/mididrv.cpp:105 msgid "MT-32 Emulation" msgstr "Ýìóëÿöèÿ MT-32" -#: sound/mididrv.cpp:87 sound/mididrv.cpp:88 sound/mididrv.cpp:109 +#: sound/mididrv.cpp:109 msgid "AdLib" msgstr "AdLib" -#: sound/mididrv.cpp:88 sound/mididrv.cpp:89 sound/mididrv.cpp:110 +#: sound/mididrv.cpp:110 msgid "PC Speaker" msgstr "PC ñïèêåð" -#: sound/mididrv.cpp:89 sound/mididrv.cpp:90 sound/mididrv.cpp:111 +#: sound/mididrv.cpp:111 msgid "IBM PCjr" msgstr "IBM PCjr" -#: sound/mididrv.cpp:90 sound/mididrv.cpp:91 sound/mididrv.cpp:112 +#: sound/mididrv.cpp:112 msgid "Creative Music System" msgstr "Creative Music System" -#: sound/mididrv.cpp:91 sound/mididrv.cpp:92 sound/mididrv.cpp:113 +#: sound/mididrv.cpp:113 msgid "FM Towns" msgstr "FM Towns" -#: sound/mididrv.cpp:93 sound/mididrv.cpp:94 sound/mididrv.cpp:115 +#: sound/mididrv.cpp:115 msgid "TiMidity" msgstr "TiMidity" -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 -msgid "~Q~uit" -msgstr "~Â~ûõîä" - -#: gui/launcher.cpp:501 -msgid "A~b~out..." -msgstr "Î ï~ð~îãðàììå..." - -#: gui/launcher.cpp:502 -msgid "~O~ptions..." -msgstr "~Î~ïöèè..." - -#: gui/launcher.cpp:504 -msgid "~S~tart" -msgstr "Ï~ó~ñê" - -#: gui/launcher.cpp:507 -msgid "~L~oad..." -msgstr "~Ç~àãð...." - -#: gui/launcher.cpp:511 -msgid "~A~dd Game..." -msgstr "~Ä~îá. èãðó..." - -#: gui/launcher.cpp:513 -msgid "~E~dit Game..." -msgstr "Èç~ì~. èãðó..." - -#: gui/launcher.cpp:515 -msgid "~R~emove Game" -msgstr "~Ó~äàëèòü èãðó" - -#: engines/dialogs.cpp:89 -msgid "~R~esume" -msgstr "Ïðîäîë~æ~èòü" - -#: engines/dialogs.cpp:91 -msgid "~L~oad" -msgstr "~Ç~àãðóçèòü" - -#: engines/dialogs.cpp:95 -msgid "~S~ave" -msgstr "~Ç~àïèñàòü" - -#: engines/dialogs.cpp:99 -msgid "~O~ptions" -msgstr "~Î~ïöèè" - -#: engines/dialogs.cpp:104 -msgid "~H~elp" -msgstr "~Ï~îìîùü" - -#: engines/dialogs.cpp:107 -msgid "~A~bout" -msgstr "Î ïðî~ã~ðàììå" - -#: engines/dialogs.cpp:109 -msgid "~R~eturn to Launcher" -msgstr "~Â~åðíóòüñÿ â ãëàâíîå ìåíþ" - -#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 -#: engines/mohawk/dialogs.cpp:118 -msgid "~O~K" -msgstr "~O~K" - -#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 -#: engines/mohawk/dialogs.cpp:119 -msgid "~C~ancel" -msgstr "Î~ò~ìåíà" - -#: engines/dialogs.cpp:305 -msgid "~K~eys" -msgstr "~Ê~ëàâèøè" - -#: engines/scumm/dialogs.cpp:287 -msgid "~P~revious" -msgstr "~Ï~ðåä" - -#: engines/scumm/dialogs.cpp:288 -msgid "~N~ext" -msgstr "~Ñ~ëåä" - -#: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 -msgid "~C~lose" -msgstr "~Ç~àêðûòü" - -#: gui/options.cpp:677 gui/options.cpp:683 gui/options.cpp:696 -#: gui/options.cpp:702 -msgid "Speech" -msgstr "Îçâó÷êà" - -#: gui/options.cpp:678 gui/options.cpp:684 gui/options.cpp:697 -#: gui/options.cpp:703 -msgid "Subtitles" -msgstr "Ñóáòèòðû" - -#: gui/options.cpp:679 gui/options.cpp:685 gui/options.cpp:698 -#: gui/options.cpp:704 -msgid "Both" -msgstr "Âñ¸" - -#: gui/options.cpp:683 gui/options.cpp:702 -msgid "Spch" -msgstr "Îçâ" - -#: gui/options.cpp:684 gui/options.cpp:703 -msgid "Subs" -msgstr "Ñóá" - -#: gui/browser.cpp:69 -msgid "Go to previous directory level" -msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" - -#: gui/launcher.cpp:511 -msgid "Hold Shift for Mass Add" -msgstr "Óäåðæèâàéòå êëàâèøó Shift äëÿ òîãî, ÷òîáû äîáàâèòü íåñêîëüêî èãð" - -#: gui/launcher.cpp:522 -msgid "Search in game list" -msgstr "Ïîèñê â ñïèñêå èãð" - -#: gui/launcher.cpp:529 gui/options.cpp:647 gui/options.cpp:666 -msgid "Clear value" -msgstr "Î÷èñòèòü çíà÷åíèå" - -#: gui/launcher.cpp:173 gui/launcher.cpp:174 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" -"Êîðîòêèé èäåíòèôèêàòîð, èñïîëüçóåìûé äëÿ èìåí ñîõðàíåíèé èãð è äëÿ çàïóñêà " -"èç êîìàíäíîé ñòðîêè" - -#: gui/launcher.cpp:177 gui/launcher.cpp:178 -msgid "Full title of the game" -msgstr "Ïîëíîå íàçâàíèå èãðû" - -#: gui/launcher.cpp:181 gui/launcher.cpp:182 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" -"ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " -"ðóññêóþ" - -#: gui/launcher.cpp:191 gui/launcher.cpp:192 gui/launcher.cpp:193 -msgid "Platform the game was originally designed for" -msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" - -#: gui/launcher.cpp:253 gui/launcher.cpp:254 gui/launcher.cpp:255 -msgid "Specifies path to additional data used the game" -msgstr "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ äëÿ èãðû" - -#: gui/launcher.cpp:257 gui/launcher.cpp:258 gui/options.cpp:795 -#: gui/options.cpp:796 gui/launcher.cpp:259 gui/options.cpp:814 -#: gui/options.cpp:815 -msgid "Specifies where your savegames are put" -msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" - -#: gui/launcher.cpp:500 -msgid "Quit ScummVM" -msgstr "Âûõîä èç ScummVM" - -#: gui/launcher.cpp:501 -msgid "About ScummVM" -msgstr "Î ïðîãðàììå ScummVM" - -#: gui/launcher.cpp:502 -msgid "Change global ScummVM options" -msgstr "Èçìåíèòü ãëîáàëüíûå îïöèè ScummVM" - -#: gui/launcher.cpp:504 -msgid "Start selected game" -msgstr "Çàïóñòèòü âûáðàííóþ èãðó" - -#: gui/launcher.cpp:507 -msgid "Load savegame for selected game" -msgstr "Çàãðóçèòü ñîõðíåíèå äëÿ âûáðàííîé èãðû" - -#: gui/launcher.cpp:513 -msgid "Change game options" -msgstr "Èçìåíèòü îïöèè èãðû" - -#: gui/launcher.cpp:515 -msgid "Remove game from the list. The game data files stay intact" -msgstr "Óäàëèòü èãðó èç ñïèñêà. Íå óäàëÿåò èãðó ñ æåñòêîãî äèñêà" - -#: gui/options.cpp:591 gui/options.cpp:592 gui/options.cpp:605 -#: gui/options.cpp:606 -msgid "Special dithering modes supported by some games" -msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" - -#: gui/options.cpp:604 gui/options.cpp:618 -msgid "Correct aspect ratio for 320x200 games" -msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" - -#: gui/options.cpp:611 gui/options.cpp:612 -msgid "Specifies output sound device or sound emulator" -msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" - -#: gui/options.cpp:622 gui/options.cpp:623 gui/options.cpp:641 -#: gui/options.cpp:642 -msgid "AdLib is used for music in many games" -msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" - -#: gui/options.cpp:633 gui/options.cpp:634 gui/options.cpp:652 -#: gui/options.cpp:653 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" -msgstr "" -"ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " -"ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" - -#: gui/options.cpp:645 gui/options.cpp:646 gui/options.cpp:664 -#: gui/options.cpp:665 -msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" -msgstr "" -"SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " -"Timidity" - -#: gui/options.cpp:650 gui/options.cpp:669 -msgid "Use both MIDI and AdLib sound generation" -msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" - -#: gui/options.cpp:653 gui/options.cpp:672 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" -msgstr "" -"Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " -"õîòèòå åãî èñïîëüçîâàòü" - -#: gui/options.cpp:656 gui/options.cpp:675 -msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" -msgstr "" -"Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" - -#: gui/options.cpp:685 gui/options.cpp:704 -msgid "Show subtitles and play speech" -msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" - -#: gui/options.cpp:711 gui/options.cpp:712 gui/options.cpp:730 -#: gui/options.cpp:731 -msgid "Special sound effects volume" -msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" - -#: gui/options.cpp:801 gui/options.cpp:802 gui/options.cpp:820 -#: gui/options.cpp:821 -msgid "Specifies path to additional data used by all games or ScummVM" -msgstr "" -"Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " -"ëèáî ScummVM" - -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "GUI Language:" -msgstr "ßçûê èíòåðôåéñà:" - -#: gui/options.cpp:837 gui/options.cpp:856 -msgid "Language of ScummVM GUI" -msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" - -#: gui/options.cpp:612 gui/options.cpp:611 gui/options.cpp:625 -#: gui/options.cpp:626 -msgid "Specifies output sound device or sound card emulator" -msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" - -#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 -msgid "~Z~ip Mode Activated" -msgstr "Ðåæèì áûñòðîãî ïåðåõîäà àêòèâèðîâàí" - -#: engines/mohawk/dialogs.cpp:82 -msgid "~T~ransitions Enabled" -msgstr "Ïåðåõîäû àêòèâèðîâàíû" - -#: engines/mohawk/dialogs.cpp:116 -msgid "~W~ater Effect Enabled" -msgstr "Ýôôåêòû âîäû âêëþ÷åíû" - #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" msgstr "Òàáëèöà êëàâèø:" @@ -1265,6 +1149,12 @@ msgstr " msgid "Fast mode" msgstr "Áûñòðûé ðåæèì" +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Âûõîä" + #: backends/platform/symbian/src/SymbianActions.cpp:56 msgid "Debugger" msgstr "Îòëàä÷èê" @@ -1281,7 +1171,7 @@ msgstr " msgid "Key mapper" msgstr "Íàçíà÷åíèå êëàâèø" -#: backends/platform/symbian/src/SymbianOS.cpp:447 +#: backends/platform/symbian/src/SymbianOS.cpp:446 msgid "Do you want to quit ?" msgstr "Âû õîòèòå âûéòè?" @@ -1500,3 +1390,51 @@ msgstr " #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Do you want to perform an automatic scan ?" msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" + +#~ msgid "About..." +#~ msgstr "Î ïðîãðàììå..." + +#~ msgid "Options..." +#~ msgstr "Îïöèè..." + +#~ msgid "Start" +#~ msgstr "Ïóñê" + +#~ msgid "Load..." +#~ msgstr "Çàãð...." + +#~ msgid "Edit Game..." +#~ msgstr "Èçì. èãðó..." + +#~ msgid "Remove Game" +#~ msgstr "Óäàëèòü èãðó" + +#~ msgid "Speech Only" +#~ msgstr "Òîëüêî îçâó÷êà" + +#~ msgid "Speech and Subtitles" +#~ msgstr "Îçâó÷êà è ñóáòèòðû" + +#~ msgid "Subtitles Only" +#~ msgstr "Òîëüêî ñóáòèòðû" + +#~ msgid "Speech & Subs" +#~ msgstr "Çâóê è ñóá." + +#~ msgid "Resume" +#~ msgstr "Ïðîäîëæèòü" + +#~ msgid "Options" +#~ msgstr "Îïöèè" + +#~ msgid "Help" +#~ msgstr "Ïîìîùü" + +#~ msgid "About" +#~ msgstr "Î ïðîãðàììå" + +#~ msgid "Return to Launcher" +#~ msgstr "Âåðíóòüñÿ â ãëàâíîå ìåíþ" + +#~ msgid "Specifies output sound device or sound emulator" +#~ msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" -- cgit v1.2.3 From cb92890d7bc99ddad504c43bd12423caa4a8fcda Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 17 Jun 2010 19:15:23 +0000 Subject: Commit updated common/messages.cpp too. svn-id: r49946 --- common/messages.cpp | 1354 +++++++++++++++++++++++++-------------------------- 1 file changed, 659 insertions(+), 695 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 331d259859..6a835845ae 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -23,325 +23,309 @@ static const char * _po2c_msgids[] = { /* 16 */ "8 kHz", /* 17 */ "", /* 18 */ "ALSA", - /* 19 */ "About", - /* 20 */ "About ScummVM", - /* 21 */ "About...", - /* 22 */ "AdLib", - /* 23 */ "AdLib emulator:", - /* 24 */ "AdLib is used for music in many games", - /* 25 */ "Add Game...", - /* 26 */ "Antialiased Renderer (16bpp)", - /* 27 */ "Aspect ratio correction", - /* 28 */ "Associated key : %s", - /* 29 */ "Associated key : none", - /* 30 */ "Atari ST MIDI", - /* 31 */ "Audio", - /* 32 */ "Autosave:", - /* 33 */ "A~b~out...", - /* 34 */ "Bind Keys", - /* 35 */ "Both", - /* 36 */ "Brightness:", - /* 37 */ "C1Available engines:", - /* 38 */ "C1Features compiled in:", - /* 39 */ "C2(built on ", - /* 40 */ "CAMD", - /* 41 */ "Cancel", - /* 42 */ "Cannot create file", - /* 43 */ "Change game options", - /* 44 */ "Change global ScummVM options", - /* 45 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", - /* 46 */ "Choose", - /* 47 */ "Choose an action to map", - /* 48 */ "Clear value", - /* 49 */ "Close", - /* 50 */ "CoreAudio", - /* 51 */ "CoreMIDI", - /* 52 */ "Correct aspect ratio for 320x200 games", - /* 53 */ "Could not find any engine capable of running the selected game", - /* 54 */ "Creative Music System", - /* 55 */ "Current video mode:", - /* 56 */ "Cursor Down", - /* 57 */ "Cursor Left", - /* 58 */ "Cursor Right", - /* 59 */ "Cursor Up", - /* 60 */ "DMedia", - /* 61 */ "DVD", - /* 62 */ "DVD Mounted successfully", - /* 63 */ "DVD not mounted", - /* 64 */ "Date: ", - /* 65 */ "Debugger", - /* 66 */ "Default", - /* 67 */ "Delete", - /* 68 */ "Disable power off", - /* 69 */ "Disabled GFX", - /* 70 */ "Discovered %d new games ...", - /* 71 */ "Discovered %d new games.", - /* 72 */ "Display ", - /* 73 */ "Display keyboard", - /* 74 */ "Do you really want to delete this savegame?", - /* 75 */ "Do you really want to remove this game configuration?", - /* 76 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 77 */ "Do you want to load or save the game?", - /* 78 */ "Do you want to perform an automatic scan ?", - /* 79 */ "Do you want to quit ?", - /* 80 */ "Double-strike", - /* 81 */ "Down", - /* 82 */ "Edit Game...", - /* 83 */ "Enable Roland GS Mode", - /* 84 */ "Engine does not support debug level '%s'", - /* 85 */ "English", - /* 86 */ "Error running game:", - /* 87 */ "Error while mounting the DVD", - /* 88 */ "Extra Path:", - /* 89 */ "FM Towns", - /* 90 */ "Failed to load any GUI theme, aborting", - /* 91 */ "Fast mode", - /* 92 */ "FluidSynth", - /* 93 */ "Free look", - /* 94 */ "Full title of the game", - /* 95 */ "Fullscreen mode", - /* 96 */ "GC Pad acceleration:", - /* 97 */ "GC Pad sensitivity:", - /* 98 */ "GFX", - /* 99 */ "GUI Language:", - /* 100 */ "GUI Renderer:", - /* 101 */ "Game", - /* 102 */ "Game Data not found", - /* 103 */ "Game Id not supported", - /* 104 */ "Game Path:", - /* 105 */ "Global menu", - /* 106 */ "Go to previous directory level", - /* 107 */ "Go up", - /* 108 */ "Graphics", - /* 109 */ "Graphics mode:", - /* 110 */ "Hardware scale (fast, but low quality)", - /* 111 */ "Help", - /* 112 */ "Hide Toolbar", - /* 113 */ "High quality audio (slower) (reboot)", - /* 114 */ "Higher value specifies better sound quality but may be not supported by your soundcard", - /* 115 */ "Hold Shift for Mass Add", - /* 116 */ "Horizontal underscan:", - /* 117 */ "IBM PCjr", - /* 118 */ "ID:", - /* 119 */ "Init network", - /* 120 */ "Initial top screen scale:", - /* 121 */ "Initialising network", - /* 122 */ "Input", - /* 123 */ "Invalid Path", - /* 124 */ "Key mapper", - /* 125 */ "Keyboard", - /* 126 */ "Keymap:", - /* 127 */ "Keys", - /* 128 */ "Language of ScummVM GUI", - /* 129 */ "Language of the game. This will not turn your Spanish game version into English", - /* 130 */ "Language:", - /* 131 */ "Left", - /* 132 */ "Left Click", - /* 133 */ "Load", - /* 134 */ "Load game:", - /* 135 */ "Load savegame for selected game", - /* 136 */ "Load...", - /* 137 */ "MIDI", - /* 138 */ "MIDI gain:", - /* 139 */ "MT-32 Emulation", - /* 140 */ "Main screen scaling:", - /* 141 */ "Map", - /* 142 */ "Mass Add...", - /* 143 */ "Menu", - /* 144 */ "Misc", - /* 145 */ "Mixed AdLib/MIDI mode", - /* 146 */ "Mount DVD", - /* 147 */ "Mount SMB", - /* 148 */ "Mouse click", - /* 149 */ "Multi Function", - /* 150 */ "Music driver:", - /* 151 */ "Music volume:", - /* 152 */ "Mute All", - /* 153 */ "Name:", - /* 154 */ "Network down", - /* 155 */ "Network not initialsed (%d)", - /* 156 */ "Network up", - /* 157 */ "Network up, share mounted", - /* 158 */ "Never", - /* 159 */ "No", - /* 160 */ "No date saved", - /* 161 */ "No music", - /* 162 */ "No playtime saved", - /* 163 */ "No time saved", - /* 164 */ "None", - /* 165 */ "OK", - /* 166 */ "Ok", - /* 167 */ "Options", - /* 168 */ "Options...", - /* 169 */ "Output rate:", - /* 170 */ "Override global MIDI settings", - /* 171 */ "Override global audio settings", - /* 172 */ "Override global graphic settings", - /* 173 */ "Override global volume settings", - /* 174 */ "PC Speaker", - /* 175 */ "Password:", - /* 176 */ "Path not a directory", - /* 177 */ "Path not a file", - /* 178 */ "Path not exists", - /* 179 */ "Paths", - /* 180 */ "Pause", - /* 181 */ "Pick the game:", - /* 182 */ "Platform the game was originally designed for", - /* 183 */ "Platform:", - /* 184 */ "Playtime: ", - /* 185 */ "Please select an action", - /* 186 */ "Plugins Path:", - /* 187 */ "Press the key to associate", - /* 188 */ "Quit", - /* 189 */ "Quit ScummVM", - /* 190 */ "Read permission denied", - /* 191 */ "Reading failed", - /* 192 */ "Remap keys", - /* 193 */ "Remove Game", - /* 194 */ "Remove game from the list. The game data files stay intact", - /* 195 */ "Render mode:", - /* 196 */ "Resume", - /* 197 */ "Return to Launcher", - /* 198 */ "Right", - /* 199 */ "Right Click", - /* 200 */ "Right click", - /* 201 */ "Rotate", - /* 202 */ "SEQ", - /* 203 */ "SFX volume:", - /* 204 */ "SMB", - /* 205 */ "Save", - /* 206 */ "Save Path:", - /* 207 */ "Save Path: ", - /* 208 */ "Save game:", - /* 209 */ "Scan complete!", - /* 210 */ "Scanned %d directories ...", - /* 211 */ "ScummVM Main Menu", - /* 212 */ "ScummVM could not find any engine capable of running the selected game!", - /* 213 */ "ScummVM could not find any game in the specified directory!", - /* 214 */ "ScummVM couldn't open the specified directory!", - /* 215 */ "Search in game list", - /* 216 */ "Search:", - /* 217 */ "Select SoundFont", - /* 218 */ "Select a Theme", - /* 219 */ "Select additional game directory", - /* 220 */ "Select an action and click 'Map'", - /* 221 */ "Select directory for GUI themes", - /* 222 */ "Select directory for extra files", - /* 223 */ "Select directory for plugins", - /* 224 */ "Select directory for saved games", - /* 225 */ "Select directory for savegames", - /* 226 */ "Select directory with game data", - /* 227 */ "Sensitivity", - /* 228 */ "Server:", - /* 229 */ "Share:", - /* 230 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 231 */ "Show Keyboard", - /* 232 */ "Show mouse cursor", - /* 233 */ "Show subtitles and play speech", - /* 234 */ "Show/Hide Cursor", - /* 235 */ "Skip", - /* 236 */ "Skip line", - /* 237 */ "Skip text", - /* 238 */ "Snap to edges", - /* 239 */ "Software scale (good quality, but slower)", - /* 240 */ "Sound on/off", - /* 241 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 242 */ "SoundFont:", - /* 243 */ "Spch", - /* 244 */ "Special dithering modes supported by some games", - /* 245 */ "Special sound effects volume", - /* 246 */ "Specifies output sound device or sound card emulator", - /* 247 */ "Specifies output sound device or sound emulator", - /* 248 */ "Specifies path to additional data used by all games or ScummVM", - /* 249 */ "Specifies path to additional data used the game", - /* 250 */ "Specifies where your savegames are put", - /* 251 */ "Speech", - /* 252 */ "Speech & Subs", - /* 253 */ "Speech Only", - /* 254 */ "Speech and Subtitles", - /* 255 */ "Speech volume:", - /* 256 */ "Standard Renderer (16bpp)", - /* 257 */ "Start", - /* 258 */ "Start selected game", - /* 259 */ "Status:", - /* 260 */ "Subs", - /* 261 */ "Subtitle speed:", - /* 262 */ "Subtitles", - /* 263 */ "Subtitles Only", - /* 264 */ "Swap character", - /* 265 */ "Tap for left click, double tap right click", - /* 266 */ "Tapwave Zodiac", - /* 267 */ "Text and Speech:", - /* 268 */ "The chosen directory cannot be written to. Please select another one.", - /* 269 */ "Theme Path:", - /* 270 */ "Theme:", - /* 271 */ "This game ID is already taken. Please choose another one.", - /* 272 */ "This game does not support loading games from the launcher.", - /* 273 */ "TiMidity", - /* 274 */ "Time: ", - /* 275 */ "Timeout while initialising network", - /* 276 */ "Touch X Offset", - /* 277 */ "Touch Y Offset", - /* 278 */ "Touchpad mode disabled.", - /* 279 */ "Touchpad mode enabled.", - /* 280 */ "True Roland MT-32 (disable GM emulation)", - /* 281 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 282 */ "Unknown", - /* 283 */ "Unknown Error", - /* 284 */ "Unmount DVD", - /* 285 */ "Unmount SMB", - /* 286 */ "Unscaled (you must scroll left and right)", - /* 287 */ "Unsupported Color Mode", - /* 288 */ "Untitled savestate", - /* 289 */ "Up", - /* 290 */ "Use both MIDI and AdLib sound generation", - /* 291 */ "Use laptop trackpad-style cursor control", - /* 292 */ "User picked target '%s' (gameid '%s')...\n", - /* 293 */ "Username:", - /* 294 */ "Using SDL driver ", - /* 295 */ "Vertical underscan:", - /* 296 */ "Video", - /* 297 */ "Virtual keyboard", - /* 298 */ "Volume", - /* 299 */ "Windows MIDI", - /* 300 */ "Write permission denied", - /* 301 */ "Writing data failed", - /* 302 */ "Yamaha Pa1", - /* 303 */ "Yes", - /* 304 */ "You have to restart ScummVM to take the effect.", - /* 305 */ "Zone", - /* 306 */ "Zoom down", - /* 307 */ "Zoom up", - /* 308 */ "every 10 mins", - /* 309 */ "every 15 mins", - /* 310 */ "every 30 mins", - /* 311 */ "every 5 mins", - /* 312 */ "failed\n", - /* 313 */ "~A~bout", - /* 314 */ "~A~dd Game...", - /* 315 */ "~C~ancel", - /* 316 */ "~C~lose", - /* 317 */ "~E~dit Game...", - /* 318 */ "~H~elp", - /* 319 */ "~I~ndy fight controls", - /* 320 */ "~K~eys", - /* 321 */ "~L~eft handed mode", - /* 322 */ "~L~oad", - /* 323 */ "~L~oad...", - /* 324 */ "~N~ext", - /* 325 */ "~O~K", - /* 326 */ "~O~ptions", - /* 327 */ "~O~ptions...", - /* 328 */ "~P~revious", - /* 329 */ "~Q~uit", - /* 330 */ "~R~emove Game", - /* 331 */ "~R~esume", - /* 332 */ "~R~eturn to Launcher", - /* 333 */ "~S~ave", - /* 334 */ "~S~tart", - /* 335 */ "~T~ransitions Enabled", - /* 336 */ "~W~ater Effect Enabled", - /* 337 */ "~Z~ip Mode Activated", + /* 19 */ "About ScummVM", + /* 20 */ "AdLib", + /* 21 */ "AdLib emulator:", + /* 22 */ "AdLib is used for music in many games", + /* 23 */ "Add Game...", + /* 24 */ "Antialiased Renderer (16bpp)", + /* 25 */ "Aspect ratio correction", + /* 26 */ "Associated key : %s", + /* 27 */ "Associated key : none", + /* 28 */ "Atari ST MIDI", + /* 29 */ "Audio", + /* 30 */ "Autosave:", + /* 31 */ "A~b~out...", + /* 32 */ "Bind Keys", + /* 33 */ "Both", + /* 34 */ "Brightness:", + /* 35 */ "C1Available engines:", + /* 36 */ "C1Features compiled in:", + /* 37 */ "C2(built on ", + /* 38 */ "CAMD", + /* 39 */ "Cancel", + /* 40 */ "Cannot create file", + /* 41 */ "Change game options", + /* 42 */ "Change global ScummVM options", + /* 43 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 44 */ "Choose", + /* 45 */ "Choose an action to map", + /* 46 */ "Clear value", + /* 47 */ "Close", + /* 48 */ "CoreAudio", + /* 49 */ "CoreMIDI", + /* 50 */ "Correct aspect ratio for 320x200 games", + /* 51 */ "Could not find any engine capable of running the selected game", + /* 52 */ "Creative Music System", + /* 53 */ "Current video mode:", + /* 54 */ "Cursor Down", + /* 55 */ "Cursor Left", + /* 56 */ "Cursor Right", + /* 57 */ "Cursor Up", + /* 58 */ "DMedia", + /* 59 */ "DVD", + /* 60 */ "DVD Mounted successfully", + /* 61 */ "DVD not mounted", + /* 62 */ "Date: ", + /* 63 */ "Debugger", + /* 64 */ "Default", + /* 65 */ "Delete", + /* 66 */ "Disable power off", + /* 67 */ "Disabled GFX", + /* 68 */ "Discovered %d new games ...", + /* 69 */ "Discovered %d new games.", + /* 70 */ "Display ", + /* 71 */ "Display keyboard", + /* 72 */ "Do you really want to delete this savegame?", + /* 73 */ "Do you really want to remove this game configuration?", + /* 74 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 75 */ "Do you want to load or save the game?", + /* 76 */ "Do you want to perform an automatic scan ?", + /* 77 */ "Do you want to quit ?", + /* 78 */ "Double-strike", + /* 79 */ "Down", + /* 80 */ "Enable Roland GS Mode", + /* 81 */ "Engine does not support debug level '%s'", + /* 82 */ "English", + /* 83 */ "Error running game:", + /* 84 */ "Error while mounting the DVD", + /* 85 */ "Extra Path:", + /* 86 */ "FM Towns", + /* 87 */ "Failed to load any GUI theme, aborting", + /* 88 */ "Fast mode", + /* 89 */ "FluidSynth", + /* 90 */ "Free look", + /* 91 */ "Full title of the game", + /* 92 */ "Fullscreen mode", + /* 93 */ "GC Pad acceleration:", + /* 94 */ "GC Pad sensitivity:", + /* 95 */ "GFX", + /* 96 */ "GUI Language:", + /* 97 */ "GUI Renderer:", + /* 98 */ "Game", + /* 99 */ "Game Data not found", + /* 100 */ "Game Id not supported", + /* 101 */ "Game Path:", + /* 102 */ "Global menu", + /* 103 */ "Go to previous directory level", + /* 104 */ "Go up", + /* 105 */ "Graphics", + /* 106 */ "Graphics mode:", + /* 107 */ "Hardware scale (fast, but low quality)", + /* 108 */ "Hide Toolbar", + /* 109 */ "High quality audio (slower) (reboot)", + /* 110 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 111 */ "Hold Shift for Mass Add", + /* 112 */ "Horizontal underscan:", + /* 113 */ "IBM PCjr", + /* 114 */ "ID:", + /* 115 */ "Init network", + /* 116 */ "Initial top screen scale:", + /* 117 */ "Initialising network", + /* 118 */ "Input", + /* 119 */ "Invalid Path", + /* 120 */ "Key mapper", + /* 121 */ "Keyboard", + /* 122 */ "Keymap:", + /* 123 */ "Keys", + /* 124 */ "Language of ScummVM GUI", + /* 125 */ "Language of the game. This will not turn your Spanish game version into English", + /* 126 */ "Language:", + /* 127 */ "Left", + /* 128 */ "Left Click", + /* 129 */ "Load", + /* 130 */ "Load game:", + /* 131 */ "Load savegame for selected game", + /* 132 */ "MIDI", + /* 133 */ "MIDI gain:", + /* 134 */ "MT-32 Emulation", + /* 135 */ "Main screen scaling:", + /* 136 */ "Map", + /* 137 */ "Mass Add...", + /* 138 */ "Menu", + /* 139 */ "Misc", + /* 140 */ "Mixed AdLib/MIDI mode", + /* 141 */ "Mount DVD", + /* 142 */ "Mount SMB", + /* 143 */ "Mouse click", + /* 144 */ "Multi Function", + /* 145 */ "Music driver:", + /* 146 */ "Music volume:", + /* 147 */ "Mute All", + /* 148 */ "Name:", + /* 149 */ "Network down", + /* 150 */ "Network not initialsed (%d)", + /* 151 */ "Network up", + /* 152 */ "Network up, share mounted", + /* 153 */ "Never", + /* 154 */ "No", + /* 155 */ "No date saved", + /* 156 */ "No music", + /* 157 */ "No playtime saved", + /* 158 */ "No time saved", + /* 159 */ "None", + /* 160 */ "OK", + /* 161 */ "Ok", + /* 162 */ "Output rate:", + /* 163 */ "Override global MIDI settings", + /* 164 */ "Override global audio settings", + /* 165 */ "Override global graphic settings", + /* 166 */ "Override global volume settings", + /* 167 */ "PC Speaker", + /* 168 */ "Password:", + /* 169 */ "Path not a directory", + /* 170 */ "Path not a file", + /* 171 */ "Path not exists", + /* 172 */ "Paths", + /* 173 */ "Pause", + /* 174 */ "Pick the game:", + /* 175 */ "Platform the game was originally designed for", + /* 176 */ "Platform:", + /* 177 */ "Playtime: ", + /* 178 */ "Please select an action", + /* 179 */ "Plugins Path:", + /* 180 */ "Press the key to associate", + /* 181 */ "Quit", + /* 182 */ "Quit ScummVM", + /* 183 */ "Read permission denied", + /* 184 */ "Reading failed", + /* 185 */ "Remap keys", + /* 186 */ "Remove game from the list. The game data files stay intact", + /* 187 */ "Render mode:", + /* 188 */ "Right", + /* 189 */ "Right Click", + /* 190 */ "Right click", + /* 191 */ "Rotate", + /* 192 */ "SEQ", + /* 193 */ "SFX volume:", + /* 194 */ "SMB", + /* 195 */ "Save", + /* 196 */ "Save Path:", + /* 197 */ "Save Path: ", + /* 198 */ "Save game:", + /* 199 */ "Scan complete!", + /* 200 */ "Scanned %d directories ...", + /* 201 */ "ScummVM Main Menu", + /* 202 */ "ScummVM could not find any engine capable of running the selected game!", + /* 203 */ "ScummVM could not find any game in the specified directory!", + /* 204 */ "ScummVM couldn't open the specified directory!", + /* 205 */ "Search in game list", + /* 206 */ "Search:", + /* 207 */ "Select SoundFont", + /* 208 */ "Select a Theme", + /* 209 */ "Select additional game directory", + /* 210 */ "Select an action and click 'Map'", + /* 211 */ "Select directory for GUI themes", + /* 212 */ "Select directory for extra files", + /* 213 */ "Select directory for plugins", + /* 214 */ "Select directory for saved games", + /* 215 */ "Select directory for savegames", + /* 216 */ "Select directory with game data", + /* 217 */ "Sensitivity", + /* 218 */ "Server:", + /* 219 */ "Share:", + /* 220 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 221 */ "Show Keyboard", + /* 222 */ "Show mouse cursor", + /* 223 */ "Show subtitles and play speech", + /* 224 */ "Show/Hide Cursor", + /* 225 */ "Skip", + /* 226 */ "Skip line", + /* 227 */ "Skip text", + /* 228 */ "Snap to edges", + /* 229 */ "Software scale (good quality, but slower)", + /* 230 */ "Sound on/off", + /* 231 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 232 */ "SoundFont:", + /* 233 */ "Spch", + /* 234 */ "Special dithering modes supported by some games", + /* 235 */ "Special sound effects volume", + /* 236 */ "Specifies output sound device or sound card emulator", + /* 237 */ "Specifies path to additional data used by all games or ScummVM", + /* 238 */ "Specifies path to additional data used the game", + /* 239 */ "Specifies where your savegames are put", + /* 240 */ "Speech", + /* 241 */ "Speech volume:", + /* 242 */ "Standard Renderer (16bpp)", + /* 243 */ "Start selected game", + /* 244 */ "Status:", + /* 245 */ "Subs", + /* 246 */ "Subtitle speed:", + /* 247 */ "Subtitles", + /* 248 */ "Swap character", + /* 249 */ "Tap for left click, double tap right click", + /* 250 */ "Tapwave Zodiac", + /* 251 */ "Text and Speech:", + /* 252 */ "The chosen directory cannot be written to. Please select another one.", + /* 253 */ "Theme Path:", + /* 254 */ "Theme:", + /* 255 */ "This game ID is already taken. Please choose another one.", + /* 256 */ "This game does not support loading games from the launcher.", + /* 257 */ "TiMidity", + /* 258 */ "Time: ", + /* 259 */ "Timeout while initialising network", + /* 260 */ "Touch X Offset", + /* 261 */ "Touch Y Offset", + /* 262 */ "Touchpad mode disabled.", + /* 263 */ "Touchpad mode enabled.", + /* 264 */ "True Roland MT-32 (disable GM emulation)", + /* 265 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 266 */ "Unknown", + /* 267 */ "Unknown Error", + /* 268 */ "Unmount DVD", + /* 269 */ "Unmount SMB", + /* 270 */ "Unscaled (you must scroll left and right)", + /* 271 */ "Unsupported Color Mode", + /* 272 */ "Untitled savestate", + /* 273 */ "Up", + /* 274 */ "Use both MIDI and AdLib sound generation", + /* 275 */ "Use laptop trackpad-style cursor control", + /* 276 */ "User picked target '%s' (gameid '%s')...\n", + /* 277 */ "Username:", + /* 278 */ "Using SDL driver ", + /* 279 */ "Vertical underscan:", + /* 280 */ "Video", + /* 281 */ "Virtual keyboard", + /* 282 */ "Volume", + /* 283 */ "Windows MIDI", + /* 284 */ "Write permission denied", + /* 285 */ "Writing data failed", + /* 286 */ "Yamaha Pa1", + /* 287 */ "Yes", + /* 288 */ "You have to restart ScummVM to take the effect.", + /* 289 */ "Zone", + /* 290 */ "Zoom down", + /* 291 */ "Zoom up", + /* 292 */ "every 10 mins", + /* 293 */ "every 15 mins", + /* 294 */ "every 30 mins", + /* 295 */ "every 5 mins", + /* 296 */ "failed\n", + /* 297 */ "~A~bout", + /* 298 */ "~A~dd Game...", + /* 299 */ "~C~ancel", + /* 300 */ "~C~lose", + /* 301 */ "~E~dit Game...", + /* 302 */ "~H~elp", + /* 303 */ "~I~ndy fight controls", + /* 304 */ "~K~eys", + /* 305 */ "~L~eft handed mode", + /* 306 */ "~L~oad", + /* 307 */ "~L~oad...", + /* 308 */ "~N~ext", + /* 309 */ "~O~K", + /* 310 */ "~O~ptions", + /* 311 */ "~O~ptions...", + /* 312 */ "~P~revious", + /* 313 */ "~Q~uit", + /* 314 */ "~R~emove Game", + /* 315 */ "~R~esume", + /* 316 */ "~R~eturn to Launcher", + /* 317 */ "~S~ave", + /* 318 */ "~S~tart", + /* 319 */ "~T~ransitions Enabled", + /* 320 */ "~W~ater Effect Enabled", + /* 321 */ "~Z~ip Mode Activated", NULL }; @@ -351,7 +335,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-17 20:57+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, @@ -370,387 +354,367 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 16, "8 \352\303\366" }, { 17, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, { 18, "ALSA" }, - { 19, "\316 \357\360\356\343\360\340\354\354\345" }, - { 20, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 21, "\316 \357\360\356\343\360\340\354\354\345..." }, - { 22, "AdLib" }, - { 23, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 24, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 25, "\315\356\342. \350\343\360\340..." }, - { 26, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 27, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 28, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 29, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 30, "Atars ST MIDI" }, - { 31, "\300\363\344\350\356" }, - { 32, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 33, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 34, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 35, "\302\361\270" }, - { 36, "\337\360\352\356\361\362\374:" }, - { 37, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 38, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 39, "C2(\361\356\341\360\340\355 " }, - { 40, "CAMD" }, - { 41, "\316\362\354\345\355\340" }, - { 42, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 43, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 44, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 45, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 46, "\302\373\341\360\340\362\374" }, - { 47, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 48, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 49, "\307\340\352\360\373\362\374" }, - { 50, "CoreAudio" }, - { 51, "CoreMIDI" }, - { 52, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 53, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 54, "Creative Music System" }, - { 55, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, - { 56, "\312\363\360\361\356\360 \342\355\350\347" }, - { 57, "\312\363\360\361\356\360 \342\353\345\342\356" }, - { 58, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, - { 59, "\312\363\360\361\356\360 \342\342\345\360\365" }, - { 60, "DMedia" }, - { 61, "DVD" }, - { 62, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, - { 63, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, - { 64, "\304\340\362\340: " }, - { 65, "\316\362\353\340\344\367\350\352" }, - { 66, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 67, "\323\344\340\353\350\362\374" }, - { 68, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, - { 69, "\301\345\347 \343\360\340\364\350\352\350" }, - { 70, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 71, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 72, "\317\356\352\340\347\340\362\374 " }, - { 73, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 74, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 75, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 76, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 77, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, - { 78, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, - { 79, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, - { 80, "\304\342\356\351\355\356\351 \363\344\340\360" }, - { 81, "\302\355\350\347" }, - { 82, "\310\347\354. \350\343\360\363..." }, - { 83, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 84, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 85, "English" }, - { 86, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 87, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, - { 88, "\304\356\357. \357\363\362\374:" }, - { 89, "FM Towns" }, - { 90, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 91, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, - { 92, "FluidSynth" }, - { 93, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, - { 94, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 95, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 96, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, - { 97, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, - { 98, "\303\360\364" }, - { 99, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 100, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 101, "\310\343\360\340" }, - { 102, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 103, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 104, "\317\363\362\374 \352 \350\343\360\345: " }, - { 105, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, - { 106, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 107, "\302\342\345\360\365" }, - { 108, "\303\360\340\364\350\352\340" }, - { 109, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 110, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, - { 111, "\317\356\354\356\371\374" }, - { 112, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, - { 113, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, - { 114, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 115, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 116, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, - { 117, "IBM PCjr" }, - { 118, "ID:" }, - { 119, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, - { 120, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, - { 121, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 122, "\302\342\356\344" }, - { 123, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 124, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, - { 125, "\312\353\340\342\350\340\362\363\360\340" }, - { 126, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, - { 127, "\312\353\340\342\350\370\350" }, - { 128, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 129, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 130, "\337\347\373\352:" }, - { 131, "\302\353\345\342\356" }, - { 132, "\313\345\342\373\351 \371\345\353\367\356\352" }, - { 133, "\307\340\343\360\363\347\350\362\374" }, - { 134, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 135, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 136, "\307\340\343\360...." }, - { 137, "MIDI" }, - { 138, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 139, "\335\354\363\353\377\366\350\377 MT-32" }, - { 140, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, - { 141, "\315\340\347\355\340\367\350\362\374" }, - { 142, "\304\356\341. \354\355\356\343\356..." }, - { 143, "\314\345\355\376" }, - { 144, "\320\340\347\355\356\345" }, - { 145, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 146, "\317\356\344\352\353\376\367\350\362\374 DVD" }, - { 147, "\317\356\344\352\353\376\367\350\362\374 SMB" }, - { 148, "\312\353\350\352 \354\373\370\374\376" }, - { 149, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, - { 150, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 151, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 152, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 153, "\315\340\347\342\340\355\350\345:" }, - { 154, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, - { 155, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, - { 156, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, - { 157, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, - { 158, "\315\350\352\356\343\344\340" }, - { 159, "\315\345\362" }, - { 160, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 161, "\301\345\347 \354\363\347\373\352\350" }, - { 162, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 163, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 164, "\315\345 \347\340\344\340\355" }, - { 165, "OK" }, - { 166, "Ok" }, - { 167, "\316\357\366\350\350" }, - { 168, "\316\357\366\350\350..." }, - { 169, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 170, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 171, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 172, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 173, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 174, "PC \361\357\350\352\345\360" }, - { 175, "\317\340\360\356\353\374:" }, - { 176, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 177, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 178, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 179, "\317\363\362\350" }, - { 180, "\317\340\363\347\340" }, - { 181, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 182, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 183, "\317\353\340\362\364\356\360\354\340:" }, - { 184, "\302\360\345\354\377 \350\343\360\373: " }, - { 185, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 186, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 187, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 188, "\302\373\365\356\344" }, - { 189, "\302\373\365\356\344 \350\347 ScummVM" }, - { 190, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 191, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 192, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 193, "\323\344\340\353\350\362\374 \350\343\360\363" }, - { 194, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 195, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 196, "\317\360\356\344\356\353\346\350\362\374" }, - { 197, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 198, "\302\357\360\340\342\356" }, - { 199, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 200, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 201, "\317\356\342\345\360\355\363\362\374" }, - { 202, "SEQ" }, - { 203, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 204, "SMB" }, - { 205, "\307\340\357\350\361\340\362\374" }, - { 206, "\317\363\362\374 \361\356\365\360.: " }, - { 207, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 208, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 209, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 210, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 211, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, - { 212, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 213, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 214, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 215, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 216, "\317\356\350\361\352:" }, - { 217, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 218, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 219, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 220, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 221, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 222, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 223, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 224, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 225, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 226, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 227, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, - { 228, "\321\345\360\342\345\360:" }, - { 229, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, - { 230, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 231, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 232, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, - { 233, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, - { 234, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, - { 235, "\317\360\356\357\363\361\362\350\362\374" }, - { 236, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 237, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, - { 238, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, - { 239, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, - { 240, "\307\342\363\352 \342\352\353/\342\373\352\353" }, - { 241, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, - { 242, "SoundFont:" }, - { 243, "\316\347\342" }, - { 244, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 245, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 246, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 247, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 248, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 249, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 250, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 251, "\316\347\342\363\367\352\340" }, - { 252, "\307\342\363\352 \350 \361\363\341." }, - { 253, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, - { 254, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, - { 255, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 256, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 257, "\317\363\361\352" }, - { 258, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 259, "\321\356\361\362\356\377\355\350\345:" }, - { 260, "\321\363\341" }, - { 261, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 262, "\321\363\341\362\350\362\360\373" }, - { 263, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, - { 264, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, - { 265, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, - { 266, "Tapware Zodiac" }, - { 267, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 268, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 269, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 270, "\322\345\354\340:" }, - { 271, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 272, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 273, "TiMidity" }, - { 274, "\302\360\345\354\377: " }, - { 275, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, - { 276, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, - { 277, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, - { 278, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, - { 279, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, - { 280, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 281, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 282, "\315\345\350\347\342\345\361\362\355\356" }, - { 283, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 284, "\316\362\352\353\376\367\350\362\374 DVD" }, - { 285, "\316\362\352\353\376\367\362\374 SMB" }, - { 286, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, - { 287, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 288, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 289, "\302\342\345\360\365" }, - { 290, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 291, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, - { 292, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 293, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, - { 294, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, - { 295, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, - { 296, "\302\350\344\345\356" }, - { 297, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, - { 298, "\303\360\356\354\352\356\361\362\374" }, - { 299, "Windows MIDI" }, - { 300, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 301, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 302, "Yamaha Pa1" }, - { 303, "\304\340" }, - { 304, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 305, "\307\356\355\340" }, - { 306, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, - { 307, "\323\342\345\353. \354\340\361\370\362\340\341" }, - { 308, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 309, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 310, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 311, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 312, "\355\345 \363\344\340\353\356\361\374\n" }, - { 313, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 314, "~\304~\356\341. \350\343\360\363..." }, - { 315, "\316~\362~\354\345\355\340" }, - { 316, "~\307~\340\352\360\373\362\374" }, - { 317, "\310\347~\354~. \350\343\360\363..." }, - { 318, "~\317~\356\354\356\371\374" }, - { 319, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, - { 320, "~\312~\353\340\342\350\370\350" }, - { 321, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, - { 322, "~\307~\340\343\360\363\347\350\362\374" }, - { 323, "~\307~\340\343\360...." }, - { 324, "~\321~\353\345\344" }, - { 325, "~O~K" }, - { 326, "~\316~\357\366\350\350" }, - { 327, "~\316~\357\366\350\350..." }, - { 328, "~\317~\360\345\344" }, - { 329, "~\302~\373\365\356\344" }, - { 330, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 331, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 332, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 333, "~\307~\340\357\350\361\340\362\374" }, - { 334, "\317~\363~\361\352" }, - { 335, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, - { 336, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, - { 337, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, + { 19, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, + { 20, "AdLib" }, + { 21, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 22, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 23, "\315\356\342. \350\343\360\340..." }, + { 24, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 25, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 27, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 28, "Atars ST MIDI" }, + { 29, "\300\363\344\350\356" }, + { 30, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 31, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 32, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 33, "\302\361\270" }, + { 34, "\337\360\352\356\361\362\374:" }, + { 35, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 36, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 37, "C2(\361\356\341\360\340\355 " }, + { 38, "CAMD" }, + { 39, "\316\362\354\345\355\340" }, + { 40, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 41, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 42, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 43, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 44, "\302\373\341\360\340\362\374" }, + { 45, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 46, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 47, "\307\340\352\360\373\362\374" }, + { 48, "CoreAudio" }, + { 49, "CoreMIDI" }, + { 50, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 51, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 52, "Creative Music System" }, + { 53, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, + { 54, "\312\363\360\361\356\360 \342\355\350\347" }, + { 55, "\312\363\360\361\356\360 \342\353\345\342\356" }, + { 56, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, + { 57, "\312\363\360\361\356\360 \342\342\345\360\365" }, + { 58, "DMedia" }, + { 59, "DVD" }, + { 60, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, + { 61, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, + { 62, "\304\340\362\340: " }, + { 63, "\316\362\353\340\344\367\350\352" }, + { 64, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 65, "\323\344\340\353\350\362\374" }, + { 66, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, + { 67, "\301\345\347 \343\360\340\364\350\352\350" }, + { 68, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 69, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 70, "\317\356\352\340\347\340\362\374 " }, + { 71, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 72, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 73, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 74, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 75, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, + { 76, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, + { 77, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, + { 78, "\304\342\356\351\355\356\351 \363\344\340\360" }, + { 79, "\302\355\350\347" }, + { 80, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 81, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 82, "English" }, + { 83, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 84, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, + { 85, "\304\356\357. \357\363\362\374:" }, + { 86, "FM Towns" }, + { 87, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 88, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, + { 89, "FluidSynth" }, + { 90, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, + { 91, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 92, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 93, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, + { 94, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, + { 95, "\303\360\364" }, + { 96, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 97, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 98, "\310\343\360\340" }, + { 99, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 100, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 101, "\317\363\362\374 \352 \350\343\360\345: " }, + { 102, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, + { 103, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 104, "\302\342\345\360\365" }, + { 105, "\303\360\340\364\350\352\340" }, + { 106, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 107, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, + { 108, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, + { 109, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, + { 110, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 111, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 112, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, + { 113, "IBM PCjr" }, + { 114, "ID:" }, + { 115, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, + { 116, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, + { 117, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 118, "\302\342\356\344" }, + { 119, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 120, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, + { 121, "\312\353\340\342\350\340\362\363\360\340" }, + { 122, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, + { 123, "\312\353\340\342\350\370\350" }, + { 124, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 125, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 126, "\337\347\373\352:" }, + { 127, "\302\353\345\342\356" }, + { 128, "\313\345\342\373\351 \371\345\353\367\356\352" }, + { 129, "\307\340\343\360\363\347\350\362\374" }, + { 130, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 131, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 132, "MIDI" }, + { 133, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 134, "\335\354\363\353\377\366\350\377 MT-32" }, + { 135, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, + { 136, "\315\340\347\355\340\367\350\362\374" }, + { 137, "\304\356\341. \354\355\356\343\356..." }, + { 138, "\314\345\355\376" }, + { 139, "\320\340\347\355\356\345" }, + { 140, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 141, "\317\356\344\352\353\376\367\350\362\374 DVD" }, + { 142, "\317\356\344\352\353\376\367\350\362\374 SMB" }, + { 143, "\312\353\350\352 \354\373\370\374\376" }, + { 144, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, + { 145, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 146, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 147, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 148, "\315\340\347\342\340\355\350\345:" }, + { 149, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, + { 150, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, + { 151, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, + { 152, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, + { 153, "\315\350\352\356\343\344\340" }, + { 154, "\315\345\362" }, + { 155, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 156, "\301\345\347 \354\363\347\373\352\350" }, + { 157, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 158, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 159, "\315\345 \347\340\344\340\355" }, + { 160, "OK" }, + { 161, "Ok" }, + { 162, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 163, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 164, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 165, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 166, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 167, "PC \361\357\350\352\345\360" }, + { 168, "\317\340\360\356\353\374:" }, + { 169, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 170, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 171, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 172, "\317\363\362\350" }, + { 173, "\317\340\363\347\340" }, + { 174, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 175, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 176, "\317\353\340\362\364\356\360\354\340:" }, + { 177, "\302\360\345\354\377 \350\343\360\373: " }, + { 178, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 179, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 180, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 181, "\302\373\365\356\344" }, + { 182, "\302\373\365\356\344 \350\347 ScummVM" }, + { 183, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 184, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 185, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 186, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 187, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 188, "\302\357\360\340\342\356" }, + { 189, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 190, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 191, "\317\356\342\345\360\355\363\362\374" }, + { 192, "SEQ" }, + { 193, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 194, "SMB" }, + { 195, "\307\340\357\350\361\340\362\374" }, + { 196, "\317\363\362\374 \361\356\365\360.: " }, + { 197, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 198, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 199, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 200, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 201, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, + { 202, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 203, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 204, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 205, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 206, "\317\356\350\361\352:" }, + { 207, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 208, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 209, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 210, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 211, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 212, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 213, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 214, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 215, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 216, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 217, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, + { 218, "\321\345\360\342\345\360:" }, + { 219, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, + { 220, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 221, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 222, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, + { 223, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, + { 224, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, + { 225, "\317\360\356\357\363\361\362\350\362\374" }, + { 226, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 227, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, + { 228, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, + { 229, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, + { 230, "\307\342\363\352 \342\352\353/\342\373\352\353" }, + { 231, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 232, "SoundFont:" }, + { 233, "\316\347\342" }, + { 234, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 235, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 236, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 237, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 238, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 239, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 240, "\316\347\342\363\367\352\340" }, + { 241, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 242, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 243, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 244, "\321\356\361\362\356\377\355\350\345:" }, + { 245, "\321\363\341" }, + { 246, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 247, "\321\363\341\362\350\362\360\373" }, + { 248, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, + { 249, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, + { 250, "Tapware Zodiac" }, + { 251, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 252, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 253, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 254, "\322\345\354\340:" }, + { 255, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 256, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 257, "TiMidity" }, + { 258, "\302\360\345\354\377: " }, + { 259, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, + { 260, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, + { 261, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, + { 262, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, + { 263, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, + { 264, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 265, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 266, "\315\345\350\347\342\345\361\362\355\356" }, + { 267, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 268, "\316\362\352\353\376\367\350\362\374 DVD" }, + { 269, "\316\362\352\353\376\367\362\374 SMB" }, + { 270, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, + { 271, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 272, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 273, "\302\342\345\360\365" }, + { 274, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 275, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, + { 276, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 277, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, + { 278, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, + { 279, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, + { 280, "\302\350\344\345\356" }, + { 281, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, + { 282, "\303\360\356\354\352\356\361\362\374" }, + { 283, "Windows MIDI" }, + { 284, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 285, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 286, "Yamaha Pa1" }, + { 287, "\304\340" }, + { 288, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 289, "\307\356\355\340" }, + { 290, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, + { 291, "\323\342\345\353. \354\340\361\370\362\340\341" }, + { 292, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 293, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 294, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 295, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 296, "\355\345 \363\344\340\353\356\361\374\n" }, + { 297, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 298, "~\304~\356\341. \350\343\360\363..." }, + { 299, "\316~\362~\354\345\355\340" }, + { 300, "~\307~\340\352\360\373\362\374" }, + { 301, "\310\347~\354~. \350\343\360\363..." }, + { 302, "~\317~\356\354\356\371\374" }, + { 303, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, + { 304, "~\312~\353\340\342\350\370\350" }, + { 305, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, + { 306, "~\307~\340\343\360\363\347\350\362\374" }, + { 307, "~\307~\340\343\360...." }, + { 308, "~\321~\353\345\344" }, + { 309, "~O~K" }, + { 310, "~\316~\357\366\350\350" }, + { 311, "~\316~\357\366\350\350..." }, + { 312, "~\317~\360\345\344" }, + { 313, "~\302~\373\365\356\344" }, + { 314, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 315, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 316, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 317, "~\307~\340\357\350\361\340\362\374" }, + { 318, "\317~\363~\361\352" }, + { 319, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, + { 320, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, + { 321, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, { -1, NULL } }; static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-13 16:52+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-17 20:57+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, - { 22, "Hang" }, - { 23, "AdLib vezet :" }, - { 27, "Aspect adag korrekci\363" }, - { 31, "Hang" }, - { 32, "Automatikus ment\351s:" }, - { 34, "Kulcsok" }, - { 50, "Hang" }, - { 55, "Renderel\351si m\363d:" }, - { 66, "" }, - { 83, "K\351pess\351 Roland GS Mode" }, - { 88, "Extra \332tvonal:" }, - { 91, "Grafikus m\363d:" }, - { 95, "Teljes k\351perny s m\363d:" }, - { 100, "Lek\351pez eszk\366z GUI:" }, - { 104, "Extra \332tvonal:" }, - { 108, "Grafik\341val" }, - { 109, "Grafikus m\363d:" }, - { 127, "Kulcsok" }, - { 138, "MIDI nyeres\351g:" }, - { 145, "Vegyes AdLib/MIDI m\363d" }, - { 150, "Zenei vezet :" }, - { 151, "Zene mennyis\351g:" }, - { 152, "Muta \326sszes" }, - { 158, "Soha" }, + { 20, "Hang" }, + { 21, "AdLib vezet :" }, + { 25, "Aspect adag korrekci\363" }, + { 29, "Hang" }, + { 30, "Automatikus ment\351s:" }, + { 32, "Kulcsok" }, + { 48, "Hang" }, + { 53, "Renderel\351si m\363d:" }, + { 64, "" }, + { 80, "K\351pess\351 Roland GS Mode" }, + { 85, "Extra \332tvonal:" }, + { 88, "Grafikus m\363d:" }, + { 92, "Teljes k\351perny s m\363d:" }, + { 97, "Lek\351pez eszk\366z GUI:" }, + { 101, "Extra \332tvonal:" }, + { 105, "Grafik\341val" }, + { 106, "Grafikus m\363d:" }, + { 123, "Kulcsok" }, + { 133, "MIDI nyeres\351g:" }, + { 140, "Vegyes AdLib/MIDI m\363d" }, + { 145, "Zenei vezet :" }, + { 146, "Zene mennyis\351g:" }, + { 147, "Muta \326sszes" }, + { 153, "Soha" }, + { 154, "Semmi" }, { 159, "Semmi" }, - { 164, "Semmi" }, - { 165, "Igen" }, - { 169, "Kimeneti teljes\355tm\351ny:" }, - { 179, "\326sv\351nyek" }, - { 180, "\326sv\351nyek" }, - { 195, "Renderel\351si m\363d:" }, - { 203, "SFX mennyis\351ge" }, - { 206, "Extra \332tvonal:" }, - { 228, "Soha" }, - { 251, "Csak a besz\351d" }, - { 252, "Besz\351d s Feliratok" }, - { 253, "Csak a besz\351d" }, - { 254, "Besz\351d \351s a Feliratok" }, - { 255, "Besz\351d mennyis\351g:" }, - { 261, "Felirat sebess\351g:" }, - { 262, "Csak feliratok" }, - { 263, "Csak feliratok" }, - { 267, "Sz\366veg \351s besz\351d:" }, - { 270, "T\351ma:" }, - { 274, "T\351ma:" }, - { 280, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 294, "Zenei vezet :" }, - { 298, "Volumene" }, - { 305, "Semmi" }, - { 308, "10 percenk\351nt" }, - { 309, "15 percenk\351nt" }, - { 310, "30 percenk\351nt" }, - { 311, "5 percenk\351nt" }, - { 320, "Kulcsok" }, - { 321, "Renderel\351si m\363d:" }, - { 325, "Igen" }, + { 160, "Igen" }, + { 162, "Kimeneti teljes\355tm\351ny:" }, + { 172, "\326sv\351nyek" }, + { 173, "\326sv\351nyek" }, + { 187, "Renderel\351si m\363d:" }, + { 193, "SFX mennyis\351ge" }, + { 196, "Extra \332tvonal:" }, + { 218, "Soha" }, + { 240, "Csak a besz\351d" }, + { 241, "Besz\351d mennyis\351g:" }, + { 246, "Felirat sebess\351g:" }, + { 247, "Csak feliratok" }, + { 251, "Sz\366veg \351s besz\351d:" }, + { 254, "T\351ma:" }, + { 258, "T\351ma:" }, + { 264, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 278, "Zenei vezet :" }, + { 282, "Volumene" }, + { 289, "Semmi" }, + { 292, "10 percenk\351nt" }, + { 293, "15 percenk\351nt" }, + { 294, "30 percenk\351nt" }, + { 295, "5 percenk\351nt" }, + { 304, "Kulcsok" }, + { 305, "Renderel\351si m\363d:" }, + { 309, "Igen" }, { -1, NULL } }; -- cgit v1.2.3 From 27741ee9707b97bcfa09d4bb4f274e4788a46449 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 17 Jun 2010 19:42:34 +0000 Subject: SCI: dont subtract offTop on wmgrPort when using old gfx functions - fixes about window in pq2 svn-id: r49947 --- engines/sci/graphics/ports.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index b8d38910d1..c964ccd346 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -95,9 +95,12 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te setPort(_wmgrPort); // SCI0 games till kq4 (.502 - not including) did not adjust against _wmgrPort in kNewWindow // We leave _wmgrPort top at 0, so the adjustment wont get done - if (!g_sci->_features->usesOldGfxFunctions()) + if (!g_sci->_features->usesOldGfxFunctions()) { setOrigin(0, offTop); - _wmgrPort->rect.bottom = _screen->getHeight() - offTop; + _wmgrPort->rect.bottom = _screen->getHeight() - offTop; + } else { + _wmgrPort->rect.bottom = _screen->getHeight(); + } _wmgrPort->rect.right = _screen->getWidth(); _wmgrPort->rect.moveTo(0, 0); _wmgrPort->curTop = 0; -- cgit v1.2.3 From c8dfa255a3c812dbd4a852c839407a31c0122a70 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 20:49:33 +0000 Subject: Fixed the selector console command (don't change the selector name to lowercase...) svn-id: r49949 --- engines/sci/console.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 6845e7282e..99494fa800 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -488,7 +488,6 @@ bool Console::cmdSelector(int argc, const char **argv) { } Common::String name = argv[1]; - name.toLowercase(); int seeker = _engine->getKernel()->findSelector(name.c_str()); if (seeker >= 0) { DebugPrintf("Selector %s found at %03x (%d)\n", name.c_str(), seeker, seeker); -- cgit v1.2.3 From 701d69d6e2c1cd6007107720e41c2de2670951a1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 20:52:53 +0000 Subject: Don't show warnings for a known script bug in SQ4CD with the Sq4GlobalNarrator object svn-id: r49950 --- engines/sci/engine/vm.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 95ed13a3d3..f38ce5e3ab 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -406,19 +406,24 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } if (argc > 1) { - // argc can indeed be bigger than 1 in some cases, and it seems correct - // (i.e. we should skip that many bytes later on)... question is, why - // does this occur? Could such calls be used to point to data after X - // bytes in the heap? What are the skipped bytes in this case? - // In SQ4CD, this occurs with the returnVal selector of object - // Sq4GlobalNarrator when the game starts, and right after the narrator - // is heard (e.g. after he talks when examining something) - reg_t oldReg = *varp.getPointer(s->_segMan); - reg_t newReg = argp[1]; - warning("send_selector(): argc = %d while modifying variable selector " - "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", - argc, selector, g_sci->getKernel()->getSelectorName(selector).c_str(), PRINT_REG(send_obj), - s->_segMan->getObjectName(send_obj), PRINT_REG(oldReg), PRINT_REG(newReg)); + // argc can indeed be bigger than 1 in some cases, and it's usually the + // result of a script bug + + const char *objectName = s->_segMan->getObjectName(send_obj); + + if (!strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { + // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the + // returnVal selector, which doesn't affect gameplay, thus don't diplay it + } else { + // Unknown script bug, show it + reg_t oldReg = *varp.getPointer(s->_segMan); + reg_t newReg = argp[1]; + const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); + warning("send_selector(): argc = %d while modifying variable selector " + "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", + argc, selector, selectorName, PRINT_REG(send_obj), + objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); + } } { -- cgit v1.2.3 From 82c36b6b262bd435fc358917494eed34a25eac5c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 17 Jun 2010 21:00:45 +0000 Subject: Only do video scaling when required (hopefully fixes SQ6). Adapt the scaling code to normal SCI videos as well. svn-id: r49951 --- engines/sci/engine/kgraphics.cpp | 128 +++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 73 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 8b2501ff62..4727694729 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1085,6 +1085,58 @@ reg_t kDisplay(EngineState *s, int argc, reg_t *argv) { return g_sci->_gfxPaint16->kernelDisplay(g_sci->strSplit(text.c_str()).c_str(), argc, argv); } +void playVideo(Graphics::VideoDecoder *videoDecoder) { + if (!videoDecoder) + return; + + byte *scaleBuffer = 0; + uint16 width = videoDecoder->getWidth(); + uint16 height = videoDecoder->getHeight(); + uint16 screenWidth = g_system->getWidth(); + uint16 screenHeight = g_system->getHeight(); + + if (screenWidth == 640 && width <= 320 && height <= 240) { + assert(videoDecoder->getPixelFormat().bytesPerPixel == 1); + width *= 2; + height *= 2; + scaleBuffer = new byte[width * height]; + } + + uint16 x = (screenWidth - width) / 2; + uint16 y = (screenHeight - height) / 2; + bool skipVideo = false; + + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (frame) { + if (scaleBuffer) { + // TODO: Probably should do aspect ratio correction in e.g. GK1 Windows + g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight()); + g_system->copyRectToScreen(scaleBuffer, width, x, y, width, height); + } else + g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, width, height); + + if (videoDecoder->hasDirtyPalette()) + videoDecoder->setSystemPalette(); + + g_system->updateScreen(); + } + } + + Common::Event event; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } + + g_system->delayMillis(10); + } + + delete[] scaleBuffer; + delete videoDecoder; +} + reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { // Hide the cursor if it's showing and then show it again if it was // previously visible. @@ -1161,31 +1213,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { } if (videoDecoder) { - uint16 x = (screenWidth - videoDecoder->getWidth()) / 2; - uint16 y = (screenHeight - videoDecoder->getHeight()) / 2; - bool skipVideo = false; - - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { - if (videoDecoder->needsUpdate()) { - Graphics::Surface *frame = videoDecoder->decodeNextFrame(); - if (frame) { - g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); - - if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); - - g_system->updateScreen(); - } - } - - Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) { - if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) - skipVideo = true; - } - - g_system->delayMillis(10); - } + playVideo(videoDecoder); // HACK: Switch back to 8bpp if we played a QuickTime video. // We also won't be copying the screen to the SCI screen... @@ -1193,8 +1221,6 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { initGraphics(screenWidth, screenHeight, screenWidth > 320); else g_sci->_gfxScreen->kernelSyncWithFramebuffer(); - - delete videoDecoder; } if (reshowCursor) @@ -1255,52 +1281,8 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { if (reshowCursor) g_sci->_gfxCursor->kernelHide(); - if (videoDecoder && videoDecoder->loadFile(fileName)) { - //uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; - //uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; - uint16 w = videoDecoder->getWidth() * 2; - uint16 h = videoDecoder->getHeight() * 2; - uint16 x = (g_system->getWidth() - w) / 2; - uint16 y = (g_system->getHeight() - h) / 2; - byte *frameBuf = new byte[w * h]; - - bool skipVideo = false; - - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { - if (videoDecoder->needsUpdate()) { - Graphics::Surface *frame = videoDecoder->decodeNextFrame(); - - if (frame) { - //g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); - // All the VMD videos in SCI2.1 need to be scaled by 2 - // TODO: This isn't optimized much, but since the VMD decoder code will be revamped, we - // don't really care about performance at this point anyway - g_sci->_gfxScreen->scale2x((byte *)frame->pixels, frameBuf, videoDecoder->getWidth(), videoDecoder->getHeight()); - g_system->copyRectToScreen(frameBuf, frame->pitch * 2, x, y, frame->w * 2, frame->h * 2); - - if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); - - g_system->updateScreen(); - } - } - - Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) { - if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) - skipVideo = true; - } - - g_system->delayMillis(10); - } - - // Copy video contents to screen buffer - g_sci->_gfxScreen->kernelSyncWithFramebuffer(); - - delete[] frameBuf; - delete videoDecoder; - } else - warning("Could not play video %s\n", fileName.c_str()); + if (videoDecoder && videoDecoder->loadFile(fileName)) + playVideo(videoDecoder); if (reshowCursor) g_sci->_gfxCursor->kernelShow(); -- cgit v1.2.3 From d1964ec18b81b157617ac7fb914400ec98cf8255 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Thu, 17 Jun 2010 22:05:28 +0000 Subject: Add additional documentation and code to PlayVMD(1) describing the myriad parameters settable here, and dump actual parameters passed svn-id: r49952 --- engines/sci/engine/kgraphics.cpp | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 4727694729..cb1a4794b8 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1288,8 +1288,56 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxCursor->kernelShow(); break; case 1: - // Unknown. Called with 5 extra integer parameterrs - // (e.g. 174, 95, 20, 0, 55, 236) + { + // Set VMD parameters. Called with a maximum of 5 parameters: + // + // x, y, flags, gammaBoost, gammaFirst, gammaLast + // + // Flags are as follows: + // bit 0 doubled + // bit 1 "drop frames"? + // bit 2 insert black lines + // bit 3 unknown + // bit 4 gamma correction + // bit 5 hold black frame + // bit 6 hold last frame + // bit 7 unknown + // bit 8 stretch + + // gammaBoost boosts palette colors in the range gammaFirst to gammaLast, but + // only if bit 4 in flags is set. Percent value such that 100% = no amplification + // These three parameters are optional if bit 4 is clear. + // Also note that the x, y parameters play subtle games if used with subfx 21. + + int flags = argv[3].offset; + Common::String flagspec; + + if (flags & 1) + flagspec += "doubled "; + if (flags & 2) + flagspec += "dropframes "; + if (flags & 4) + flagspec += "blacklines "; + if (flags & 8) + flagspec += "bit3 "; + if (flags & 16) + flagspec += "gammaboost "; + if (flags & 32) + flagspec += "holdblack "; + if (flags & 64) + flagspec += "holdlast "; + if (flags & 128) + flagspec += "bit7 "; + if (flags & 256) + flagspec += "stretch"; + + warning("VMDFlags: %s", flagspec.c_str()); + warning("x, y: %d, %d", argv[1].offset, argv[2].offset); + + if (argc > 4) + warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].offset, argv[5].offset, argv[6].offset); + break; + } case 6: // Play, perhaps? Or stop? This is the last call made, and takes no extra parameters case 14: -- cgit v1.2.3 From 37434d86ae8f4e7ca3e7f0258c78ad9441f99e31 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Thu, 17 Jun 2010 22:08:07 +0000 Subject: SCI: PlayVMD(1): Hmmm. Don't print gammaBoost etc if they aren't used svn-id: r49953 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index cb1a4794b8..6241c22f88 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1334,7 +1334,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { warning("VMDFlags: %s", flagspec.c_str()); warning("x, y: %d, %d", argv[1].offset, argv[2].offset); - if (argc > 4) + if (argc > 4 && flags & 16) warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].offset, argv[5].offset, argv[6].offset); break; } -- cgit v1.2.3 From 8e07a1e16768548112a290d04348e26173e8afa0 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:10:37 +0000 Subject: SCI: Moved the event code a little bit around. * Move sleep() from EventManager to SciEngine * Rename EventManager methods: get -> getSciEvent, and getFromScummVM -> getScummVMEvent * Make scancode_rows static const * Turn altify & numlockify from EventManager methods into static functions (and comment out the currently unused numlockify) svn-id: r49959 --- engines/sci/engine/kevent.cpp | 2 +- engines/sci/engine/kmisc.cpp | 2 +- engines/sci/engine/state.cpp | 2 +- engines/sci/event.cpp | 18 ++++++++++-------- engines/sci/event.h | 9 ++------- engines/sci/graphics/cursor.cpp | 2 +- engines/sci/graphics/menu.cpp | 8 ++++---- engines/sci/graphics/portrait.cpp | 2 +- engines/sci/sci.h | 2 ++ 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index c5a37dde94..718da6c3d3 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -65,7 +65,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { oldx = mousePos.x; oldy = mousePos.y; - curEvent = g_sci->getEventManager()->get(mask); + curEvent = g_sci->getEventManager()->getSciEvent(mask); if (g_sci->getVocabulary()) g_sci->getVocabulary()->parser_event = NULL_REG; // Invalidate parser event diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index ef6088b6d5..99b268f774 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -79,7 +79,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { uint32 duration = curTime - s->_throttleLastTime; if (duration < neededSleep) { - g_sci->getEventManager()->sleep(neededSleep - duration); + g_sci->sleep(neededSleep - duration); s->_throttleLastTime = g_system->getMillis(); } else { s->_throttleLastTime = curTime; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 1c8113e5e4..80b9ba3bcb 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -121,7 +121,7 @@ void EngineState::wait(int16 ticks) { lastWaitTime = time; ticks *= g_debug_sleeptime_factor; - g_sci->getEventManager()->sleep(ticks * 1000 / 60); + g_sci->sleep(ticks * 1000 / 60); } void EngineState::initGlobals() { diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 7a55555a70..6681e12008 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -44,7 +44,7 @@ EventManager::EventManager(ResourceManager *resMan) { EventManager::~EventManager() { } -struct scancode_row { +static const struct scancode_row { int offset; const char *keys; } scancode_rows[SCANCODE_ROWS_NR] = { @@ -53,7 +53,7 @@ struct scancode_row { {0x2c, "ZXCVBNM,./"} }; -int EventManager::altify (int ch) { +static int altify(int ch) { // Calculates a PC keyboard scancode from a character */ int row; int c = toupper((char)ch); @@ -74,7 +74,8 @@ int EventManager::altify (int ch) { return ch; } -int EventManager::numlockify (int c) { +/* +static int numlockify(int c) { switch (c) { case SCI_KEY_DELETE: return '.'; @@ -102,6 +103,7 @@ int EventManager::numlockify (int c) { return c; // Unchanged } } +*/ static const byte codepagemap_88591toDOS[0x80] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', // 0x8x @@ -114,7 +116,7 @@ static const byte codepagemap_88591toDOS[0x80] = { '?', 0xa4, 0x95, 0xa2, 0x93, '?', 0x94, '?', '?', 0x97, 0xa3, 0x96, 0x81, '?', '?', 0x98 // 0xFx }; -sciEvent EventManager::getFromScummVM() { +sciEvent EventManager::getScummVMEvent() { static int _modifierStates = 0; // FIXME: Avoid non-const global vars sciEvent input = { SCI_EVENT_NONE, 0, 0, 0 }; @@ -315,7 +317,7 @@ sciEvent EventManager::getFromScummVM() { return input; } -sciEvent EventManager::get(unsigned int mask) { +sciEvent EventManager::getSciEvent(unsigned int mask) { //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; sciEvent event = { 0, 0, 0, 0 }; @@ -328,7 +330,7 @@ sciEvent EventManager::get(unsigned int mask) { // Get all queued events from graphics driver do { - event = getFromScummVM(); + event = getScummVMEvent(); if (event.type != SCI_EVENT_NONE) _events.push_back(event); } while (event.type != SCI_EVENT_NONE); @@ -384,13 +386,13 @@ sciEvent EventManager::get(unsigned int mask) { return event; } -void EventManager::sleep(uint32 msecs) { +void SciEngine::sleep(uint32 msecs) { uint32 time; const uint32 wakeup_time = g_system->getMillis() + msecs; while (true) { // let backend process events and update the screen - get(SCI_EVENT_PEEK); + _eventMan->getSciEvent(SCI_EVENT_PEEK); time = g_system->getMillis(); if (time + 10 < wakeup_time) { g_system->delayMillis(10); diff --git a/engines/sci/event.h b/engines/sci/event.h index 7882e56c02..b973733f48 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -116,15 +116,10 @@ public: EventManager(ResourceManager *resMgr); ~EventManager(); - sciEvent get(unsigned int mask); - - void sleep(uint32 msecs); + sciEvent getSciEvent(unsigned int mask); private: - int altify (int ch); - int shiftify (int c); - int numlockify (int c); - sciEvent getFromScummVM(); + sciEvent getScummVMEvent(); ResourceManager *_resMan; diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 2930bb8a46..369549cf7b 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -341,7 +341,7 @@ void GfxCursor::kernelMoveCursor(Common::Point pos) { // Trigger event reading to make sure the mouse coordinates will // actually have changed the next time we read them. - _event->get(SCI_EVENT_PEEK); + _event->getSciEvent(SCI_EVENT_PEEK); } } // End of namespace Sci diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 5ca4d8176b..f5eac70ccd 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -705,7 +705,7 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { _paint16->bitsShow(_menuRect); while (true) { - curEvent = _event->get(SCI_EVENT_ANY); + curEvent = _event->getSciEvent(SCI_EVENT_ANY); switch (curEvent.type) { case SCI_EVENT_KEYBOARD: @@ -795,7 +795,7 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { } break; case SCI_EVENT_NONE: - _event->sleep(2500 / 1000); + g_sci->sleep(2500 / 1000); break; } } @@ -823,7 +823,7 @@ GuiMenuItemEntry *GfxMenu::interactiveWithMouse() { _paint16->bitsShow(_ports->_menuRect); while (true) { - curEvent = _event->get(SCI_EVENT_ANY); + curEvent = _event->getSciEvent(SCI_EVENT_ANY); switch (curEvent.type) { case SCI_EVENT_MOUSE_RELEASE: @@ -834,7 +834,7 @@ GuiMenuItemEntry *GfxMenu::interactiveWithMouse() { return curItemEntry; case SCI_EVENT_NONE: - _event->sleep(2500 / 1000); + g_sci->sleep(2500 / 1000); break; } diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index f7d6f4de0a..9c113cf5f4 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -182,7 +182,7 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint // Wait till syncTime passed, then show specific animation bitmap do { g_sci->getEngineState()->wait(1); - curEvent = _event->get(SCI_EVENT_ANY); + curEvent = _event->getSciEvent(SCI_EVENT_ANY); if (curEvent.type == SCI_EVENT_MOUSE_PRESS || (curEvent.type == SCI_EVENT_KEYBOARD && curEvent.data == SCI_KEY_ESC) || g_engine->shouldQuit()) diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 7d04840759..6a069fecda 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -176,6 +176,8 @@ public: /** Remove the 'TARGET-' prefix of the given filename, if present. */ Common::String unwrapFilename(const Common::String &name) const; + void sleep(uint32 msecs); + public: /** -- cgit v1.2.3 From a2bcf9ac31d025d09fabcd2d636eeb34d3c75df0 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:11:12 +0000 Subject: SCI: Rename sciEvent to SciEvent svn-id: r49960 --- engines/sci/engine/kevent.cpp | 2 +- engines/sci/event.cpp | 10 +++++----- engines/sci/event.h | 8 ++++---- engines/sci/graphics/menu.cpp | 4 ++-- engines/sci/graphics/portrait.cpp | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 718da6c3d3..2f1afd4358 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -41,7 +41,7 @@ namespace Sci { reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { int mask = argv[0].toUint16(); reg_t obj = argv[1]; - sciEvent curEvent; + SciEvent curEvent; int oldx, oldy; int modifier_mask = getSciVersion() <= SCI_VERSION_01 ? SCI_KEYMOD_ALL : SCI_KEYMOD_NO_FOOLOCK; SegManager *segMan = s->_segMan; diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 6681e12008..9ba4f166b4 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -116,9 +116,9 @@ static const byte codepagemap_88591toDOS[0x80] = { '?', 0xa4, 0x95, 0xa2, 0x93, '?', 0x94, '?', '?', 0x97, 0xa3, 0x96, 0x81, '?', '?', 0x98 // 0xFx }; -sciEvent EventManager::getScummVMEvent() { +SciEvent EventManager::getScummVMEvent() { static int _modifierStates = 0; // FIXME: Avoid non-const global vars - sciEvent input = { SCI_EVENT_NONE, 0, 0, 0 }; + SciEvent input = { SCI_EVENT_NONE, 0, 0, 0 }; Common::EventManager *em = g_system->getEventManager(); Common::Event ev; @@ -317,9 +317,9 @@ sciEvent EventManager::getScummVMEvent() { return input; } -sciEvent EventManager::getSciEvent(unsigned int mask) { +SciEvent EventManager::getSciEvent(unsigned int mask) { //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; - sciEvent event = { 0, 0, 0, 0 }; + SciEvent event = { 0, 0, 0, 0 }; // Update the screen here, since it's called very often. // Throttle the screen update rate to 60fps. @@ -336,7 +336,7 @@ sciEvent EventManager::getSciEvent(unsigned int mask) { } while (event.type != SCI_EVENT_NONE); // Search for matching event in queue - Common::List::iterator iter = _events.begin(); + Common::List::iterator iter = _events.begin(); while (iter != _events.end() && !((*iter).type & mask)) ++iter; diff --git a/engines/sci/event.h b/engines/sci/event.h index b973733f48..bdfbf4bebe 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -34,7 +34,7 @@ namespace Sci { #define SCI_INPUT_DEFAULT_REDRAWTIME 30000 -struct sciEvent { +struct SciEvent { short type; short data; short modifiers; @@ -116,15 +116,15 @@ public: EventManager(ResourceManager *resMgr); ~EventManager(); - sciEvent getSciEvent(unsigned int mask); + SciEvent getSciEvent(unsigned int mask); private: - sciEvent getScummVMEvent(); + SciEvent getScummVMEvent(); ResourceManager *_resMan; bool _fontIsExtended; - Common::List _events; + Common::List _events; }; } // End of namespace Sci diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index f5eac70ccd..00eb533b41 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -681,7 +681,7 @@ uint16 GfxMenu::mouseFindMenuItemSelection(Common::Point mousePosition, uint16 m } GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { - sciEvent curEvent; + SciEvent curEvent; uint16 newMenuId = _curMenuId; uint16 newItemId = _curItemId; GuiMenuItemEntry *curItemEntry = findItem(_curMenuId, _curItemId); @@ -805,7 +805,7 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { // The menu item that is selected at that time is chosen. If no menu item is selected we cancel // No keyboard interaction is allowed, cause that wouldnt make any sense at all GuiMenuItemEntry *GfxMenu::interactiveWithMouse() { - sciEvent curEvent; + SciEvent curEvent; uint16 newMenuId = 0, newItemId = 0; uint16 curMenuId = 0, curItemId = 0; Common::Point mousePosition = _cursor->getPosition(); diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index 9c113cf5f4..8f4fe094a8 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -166,7 +166,7 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint // Do animation depending on sync resource till audio is done playing uint16 syncCue; int timerPosition, curPosition; - sciEvent curEvent; + SciEvent curEvent; bool userAbort = false; while ((syncOffset < syncResource->size - 2) && (!userAbort)) { -- cgit v1.2.3 From fabba55e6df2a3ae1b1bba5f3e145cae5bba0dc4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:11:34 +0000 Subject: SCI: cleanup svn-id: r49961 --- engines/sci/event.cpp | 4 +--- engines/sci/event.h | 36 ++++++++++++++++-------------------- engines/sci/sci.cpp | 2 +- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 9ba4f166b4..45de30cb5c 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -36,9 +36,7 @@ namespace Sci { #define SCANCODE_ROWS_NR 3 -EventManager::EventManager(ResourceManager *resMan) { - // Check, if font of current game includes extended chars - _fontIsExtended = resMan->detectFontExtended(); +EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended) { } EventManager::~EventManager() { diff --git a/engines/sci/event.h b/engines/sci/event.h index bdfbf4bebe..dc7aebc98e 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -23,31 +23,29 @@ * */ -#ifndef SCI_ENGINE_EVENT_H -#define SCI_ENGINE_EVENT_H +#ifndef SCI_EVENT_H +#define SCI_EVENT_H #include "common/list.h" namespace Sci { -#define SCI_INPUT_DEFAULT_CLOCKTIME 100000 -#define SCI_INPUT_DEFAULT_REDRAWTIME 30000 - - struct SciEvent { short type; short data; short modifiers; - short character; /* for keyboard events: 'data' after applying - ** the effects of 'modifiers', e.g. if - ** type == SCI_EVT_KEYBOARD - ** data == 'a' - ** buckybits == SCI_EVM_LSHIFT - ** then - ** character == 'A' - ** For 'Alt', characters are interpreted by their - ** PC keyboard scancodes. - */ + /** + * For keyboard events: 'data' after applying + * the effects of 'modifiers', e.g. if + * type == SCI_EVT_KEYBOARD + * data == 'a' + * buckybits == SCI_EVM_LSHIFT + * then + * character == 'A' + * For 'Alt', characters are interpreted by their + * PC keyboard scancodes. + */ + short character; }; /*Values for type*/ @@ -113,7 +111,7 @@ struct SciEvent { class EventManager { public: - EventManager(ResourceManager *resMgr); + EventManager(bool fontIsExtended); ~EventManager(); SciEvent getSciEvent(unsigned int mask); @@ -121,9 +119,7 @@ public: private: SciEvent getScummVMEvent(); - ResourceManager *_resMan; - - bool _fontIsExtended; + const bool _fontIsExtended; Common::List _events; }; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 1dc02ac7c3..f29811cfae 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -237,7 +237,7 @@ Common::Error SciEngine::run() { _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan) : NULL; _audio = new AudioPlayer(_resMan); _gamestate = new EngineState(segMan); - _eventMan = new EventManager(_resMan); + _eventMan = new EventManager(_resMan->detectFontExtended()); // The game needs to be initialized before the graphics system is initialized, as // the graphics code checks parts of the seg manager upon initialization (e.g. for -- cgit v1.2.3 From 06997c0da6f45a760b8bf4dcf3d604bc1a977bad Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:11:56 +0000 Subject: SCI: Update FIXME in SegmentManager * Turn one FIXME into a simple comment * Rewrap comment to 80 columns * Turn several warnings into errors svn-id: r49962 --- engines/sci/engine/seg_manager.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 310e600133..58b496ccfc 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -100,16 +100,10 @@ void SegManager::initSysStrings() { } SegmentId SegManager::findFreeSegment() const { - // FIXME: This is a very crude approach: We find a free segment id by scanning - // from the start. This can be slow if the number of segments becomes large. - // Optimizations are possible and easy, but I refrain from doing any until this - // refactoring is complete. - // One very simple yet probably effective approach would be to add - // "int firstFreeSegment", which is updated when allocating/freeing segments. - // There are some scenarios where it performs badly, but we should first check - // whether those occur at all. If so, there are easy refinements that deal - // with this. Finally, we could switch to a more elaborate scheme, - // such as keeping track of all free segments. But I doubt this is necessary. + // The following is a very crude approach: We find a free segment id by + // scanning from the start. This can be slow if the number of segments + // becomes large. Optimizations are possible and easy, but I'll refrain + // from attempting any until we determine we actually need it. uint seg = 1; while (seg < _heap.size() && _heap[seg]) { ++seg; @@ -516,14 +510,14 @@ reg_t SegManager::newNode(reg_t value, reg_t key) { List *SegManager::lookupList(reg_t addr) { if (getSegmentType(addr.segment) != SEG_TYPE_LISTS) { - warning("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); + error("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); return NULL; } ListTable *lt = (ListTable *)_heap[addr.segment]; if (!lt->isValidEntry(addr.offset)) { - warning("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); + error("Attempt to use non-list %04x:%04x as list", PRINT_REG(addr)); return NULL; } @@ -535,14 +529,14 @@ Node *SegManager::lookupNode(reg_t addr) { return NULL; // Non-error null if (getSegmentType(addr.segment) != SEG_TYPE_NODES) { - warning("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); + error("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); return NULL; } NodeTable *nt = (NodeTable *)_heap[addr.segment]; if (!nt->isValidEntry(addr.offset)) { - warning("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); + error("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); return NULL; } -- cgit v1.2.3 From 2556ea192cac369f86d1b237335ae7c0aa0b13e2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:12:17 +0000 Subject: SCI: Turn _modifierStates into member of class EventManager svn-id: r49963 --- engines/sci/event.cpp | 3 +-- engines/sci/event.h | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 45de30cb5c..b93f7bddec 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -36,7 +36,7 @@ namespace Sci { #define SCANCODE_ROWS_NR 3 -EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended) { +EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended), _modifierStates(0) { } EventManager::~EventManager() { @@ -115,7 +115,6 @@ static const byte codepagemap_88591toDOS[0x80] = { }; SciEvent EventManager::getScummVMEvent() { - static int _modifierStates = 0; // FIXME: Avoid non-const global vars SciEvent input = { SCI_EVENT_NONE, 0, 0, 0 }; Common::EventManager *em = g_system->getEventManager(); diff --git a/engines/sci/event.h b/engines/sci/event.h index dc7aebc98e..314add7b2c 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -120,6 +120,7 @@ private: SciEvent getScummVMEvent(); const bool _fontIsExtended; + int _modifierStates; Common::List _events; }; -- cgit v1.2.3 From 69fb7032460e7874d12d8f07bcc436eb0bbab18d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:12:38 +0000 Subject: SCI: cleanup scancode rows code svn-id: r49964 --- engines/sci/event.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index b93f7bddec..eff7984d39 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -34,18 +34,19 @@ namespace Sci { -#define SCANCODE_ROWS_NR 3 - EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended), _modifierStates(0) { } EventManager::~EventManager() { } -static const struct scancode_row { + +struct ScancodeRow { int offset; const char *keys; -} scancode_rows[SCANCODE_ROWS_NR] = { +}; + +static const ScancodeRow s_scancodeRows[] = { {0x10, "QWERTYUIOP[]"}, {0x1e, "ASDFGHJKL;'\\"}, {0x2c, "ZXCVBNM,./"} @@ -56,9 +57,9 @@ static int altify(int ch) { int row; int c = toupper((char)ch); - for (row = 0; row < SCANCODE_ROWS_NR; row++) { - const char *keys = scancode_rows[row].keys; - int offset = scancode_rows[row].offset; + for (row = 0; row < ARRAYSIZE(s_scancodeRows); row++) { + const char *keys = s_scancodeRows[row].keys; + int offset = s_scancodeRows[row].offset; while (*keys) { if (*keys == c) -- cgit v1.2.3 From 337711d3215bf199260746920c46f7db85a2f70c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:12:59 +0000 Subject: SCI: Get rid of duplicate _system member in SciEngine svn-id: r49965 --- engines/sci/sci.cpp | 2 +- engines/sci/sci.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index f29811cfae..c594184f29 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -72,7 +72,7 @@ SciEngine *g_sci = 0; class GfxDriver; SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) - : Engine(syst), _gameDescription(desc), _system(syst) { + : Engine(syst), _gameDescription(desc) { assert(g_sci == 0); g_sci = this; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 6a069fecda..5ea5edc17b 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -272,7 +272,6 @@ private: EventManager *_eventMan; reg_t _gameObj; /**< Pointer to the game object */ Console *_console; - OSystem *_system; }; -- cgit v1.2.3 From cfcbdf86569dac5856d364316caa5b0a57713fd7 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:13:30 +0000 Subject: SCI: Remove selector_name function, some cleanup svn-id: r49966 --- engines/sci/console.cpp | 28 +++++++------------ engines/sci/engine/kernel.cpp | 8 ++++-- engines/sci/engine/kernel.h | 2 ++ engines/sci/engine/scriptdebug.cpp | 56 +++++++++++++++----------------------- engines/sci/sci.cpp | 2 +- 5 files changed, 40 insertions(+), 56 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 99494fa800..d17b1facaa 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -419,13 +419,6 @@ ResourceType parseResourceType(const char *resid) { return res; } -const char *selector_name(EngineState *s, int selector) { - if (selector >= 0 && selector < (int)g_sci->getKernel()->getSelectorNamesSize()) - return g_sci->getKernel()->getSelectorName(selector).c_str(); - else - return "--INVALID--"; -} - bool Console::cmdGetVersion(int argc, const char **argv) { const char *viewTypeDesc[] = { "Unknown", "EGA", "VGA", "VGA SCI1.1", "Amiga" }; @@ -2217,7 +2210,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); - reg_end = NULL_REG; + reg_end = NULL_REG; } if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) @@ -2324,11 +2317,10 @@ bool Console::cmdBacktrace(int argc, const char **argv) { switch (call.type) { - case EXEC_STACK_TYPE_CALL: {// Normal function + case EXEC_STACK_TYPE_CALL: // Normal function DebugPrintf(" %x:[%x] %s::%s(", i, call.origin, objname, (call.selector == -1) ? "" : - selector_name(_engine->_gamestate, call.selector)); - } - break; + _engine->getKernel()->getSelectorName(call.selector).c_str()); + break; case EXEC_STACK_TYPE_KERNEL: // Kernel function DebugPrintf(" %x:[%x] k%s(", i, call.origin, _engine->getKernel()->getKernelName(call.selector).c_str()); @@ -2554,11 +2546,11 @@ bool Console::cmdSend(int argc, const char **argv) { return true; } - const char *selector_name = argv[2]; - int selectorId = _engine->getKernel()->findSelector(selector_name); + const char *selectorName = argv[2]; + int selectorId = _engine->getKernel()->findSelector(selectorName); if (selectorId < 0) { - DebugPrintf("Unknown selector: \"%s\"\n", selector_name); + DebugPrintf("Unknown selector: \"%s\"\n", selectorName); return true; } @@ -2571,7 +2563,7 @@ bool Console::cmdSend(int argc, const char **argv) { SelectorType selector_type = lookupSelector(_engine->_gamestate->_segMan, object, selectorId, NULL, NULL); if (selector_type == kSelectorNone) { - DebugPrintf("Object does not support selector: \"%s\"\n", selector_name); + DebugPrintf("Object does not support selector: \"%s\"\n", selectorName); return true; } @@ -3273,7 +3265,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" "); if (i < var_container->getVarCount()) { uint16 varSelector = var_container->getVarSelector(i); - DebugPrintf("[%03x] %s = ", varSelector, selector_name(s, varSelector)); + DebugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str()); } else DebugPrintf("p#%x = ", i); @@ -3292,7 +3284,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" -- methods:\n"); for (i = 0; i < obj->getMethodCount(); i++) { reg_t fptr = obj->getFunction(i); - DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), selector_name(s, obj->getFuncSelector(i)), PRINT_REG(fptr)); + DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), PRINT_REG(fptr)); } if (s->_segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT) DebugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.segment)->_nr); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index b6e064b4d5..8ebe78637c 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -410,7 +410,8 @@ SciKernelFunction kfunct_mappers[] = { {NULL, NULL, NULL} // Terminator }; -Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan) { +Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) + : _resMan(resMan), _segMan(segMan), _invalid("") { loadSelectorNames(); mapSelectors(); // Map a few special selectors for later use } @@ -428,6 +429,8 @@ uint Kernel::getSelectorNamesSize() const { } const Common::String &Kernel::getSelectorName(uint selector) const { + if (selector >= _selectorNames.size()) + return _invalid; return _selectorNames[selector]; } @@ -439,9 +442,8 @@ const Common::String &Kernel::getKernelName(uint number) const { // FIXME: The following check is a temporary workaround for // an issue leading to crashes when using the debugger's backtrace // command. - static const Common::String invalid = "(invalid)"; if (number >= _kernelNames.size()) - return invalid; + return _invalid; return _kernelNames[number]; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 0a4998868d..f17e751709 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -246,6 +246,8 @@ private: // Kernel-related lists Common::StringArray _selectorNames; Common::StringArray _kernelNames; + + const Common::String _invalid; }; #ifdef USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 436eaafec5..d829b01c31 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -63,9 +63,7 @@ const char *opcodeNames[] = { "-sli", "-sti", "-spi" }; -extern const char *selector_name(EngineState *s, int selector); - -DebugState g_debugState; +DebugState g_debugState; // FIXME: Avoid non-const global vars // Disassembles one command from the heap, returns address of next command or 0 if a ret was encountered. reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecode) { @@ -197,7 +195,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (!obj) warning("Attempted to reference on non-object at %04x:%04x", PRINT_REG(s->xs->objp)); else - printf(" (%s)", selector_name(s, obj->propertyOffsetToId(s->_segMan, scr[pos.offset + 1]))); + printf(" (%s)", g_sci->getKernel()->getSelectorName(obj->propertyOffsetToId(s->_segMan, scr[pos.offset + 1])).c_str()); } } @@ -244,7 +242,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod if (!name) name = ""; - printf(" %s::%s[", name, (selector > kernel->getSelectorNamesSize()) ? "" : selector_name(s, selector)); + printf(" %s::%s[", name, g_sci->getKernel()->getSelectorName(selector).c_str()); switch (lookupSelector(s->_segMan, called_obj_addr, selector, 0, &fun_ref)) { case kSelectorMethod: @@ -314,17 +312,15 @@ void script_debug(EngineState *s) { if (paramb1 != g_debugState.seekSpecial) return; - case kDebugSeekCallk: { + case kDebugSeekCallk: if (op != op_callk) return; break; - } - case kDebugSeekLevelRet: { + case kDebugSeekLevelRet: if ((op != op_ret) || (g_debugState.seekLevel < (int)s->_executionStack.size()-1)) return; break; - } case kDebugSeekGlobal: if (op < op_sag) @@ -361,7 +357,7 @@ void script_debug(EngineState *s) { g_debugState.debugging = false; - Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger(); + Console *con = ((Sci::SciEngine *)g_engine)->getSciDebugger(); con->attach(); } @@ -491,19 +487,17 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { dumpScriptObject((char *)script->data, seeker, objsize); break; - case SCI_OBJ_CODE: { + case SCI_OBJ_CODE: printf("Code\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case 3: { + case 3: printf("\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_SAID: { + case SCI_OBJ_SAID: printf("Said\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); @@ -551,46 +545,40 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { } } printf("\n"); - } - break; + break; - case SCI_OBJ_STRINGS: { + case SCI_OBJ_STRINGS: printf("Strings\n"); while (script->data [seeker]) { printf("%04x: %s\n", seeker, script->data + seeker); seeker += strlen((char *)script->data + seeker) + 1; } seeker++; // the ending zero byte - }; - break; + break; case SCI_OBJ_CLASS: dumpScriptClass((char *)script->data, seeker, objsize); break; - case SCI_OBJ_EXPORTS: { + case SCI_OBJ_EXPORTS: printf("Exports\n"); Common::hexdump((unsigned char *)script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_POINTERS: { + case SCI_OBJ_POINTERS: printf("Pointers\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case 9: { + case 9: printf("\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; - case SCI_OBJ_LOCALVARS: { + case SCI_OBJ_LOCALVARS: printf("Local vars\n"); Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); - }; - break; + break; default: printf("Unsupported!\n"); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index c594184f29..00f832817b 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -276,7 +276,7 @@ Common::Error SciEngine::run() { #ifdef ENABLE_SCI32 } #endif - + _kernel->loadKernelNames(_features); // Must be called after game_init() script_adjust_opcode_formats(); -- cgit v1.2.3 From 78cd1aa145fb454de67444ef58bed6381ce2396c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:13:54 +0000 Subject: SCI: Remove hack related to compiled kernel signatures. Also change some things to comply to our code formatting conventions. svn-id: r49967 --- engines/sci/engine/kernel.cpp | 45 ++++++++++++++++++++----------------------- engines/sci/engine/kernel.h | 6 +++--- engines/sci/engine/vm.cpp | 6 +++--- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 8ebe78637c..7367e3f34a 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -201,11 +201,11 @@ static const char *s_defaultKernelNames[] = { struct SciKernelFunction { const char *name; - KernelFunc *fun; /* The actual function */ + KernelFunc *func; /* The actual function */ const char *signature; /* kfunct signature */ }; -SciKernelFunction kfunct_mappers[] = { +static SciKernelFunction s_kernelFuncMap[] = { /*00*/ { "Load", kLoad, "iii*" }, /*01*/ { "UnLoad", kUnLoad, "i.*" }, // Work around SQ1 bug, when exiting the Ulence flats bar /*02*/ { "ScriptID", kScriptID, "Ioi*" }, @@ -418,10 +418,7 @@ Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) Kernel::~Kernel() { for (KernelFuncsContainer::iterator i = _kernelFuncs.begin(); i != _kernelFuncs.end(); ++i) - // TODO: Doing a const_cast is not that nice actually... But since KernelFuncWithSignature - // keeps the signature member as "const char *" there is no way around it. - // Think of a clever way to avoid this. - free(const_cast(i->signature)); + free(i->signature); } uint Kernel::getSelectorNamesSize() const { @@ -498,23 +495,23 @@ void Kernel::loadSelectorNames() { } } -static void kernel_compile_signature(const char **s) { - const char *src = *s; +static char *compileKernelSignature(const char *s) { + const char *src = s; char *result; bool ellipsis = false; int index = 0; if (!src) - return; // NULL signature: Nothing to do + return 0; // NULL signature: Nothing to do - result = (char *)malloc(strlen(*s) + 1); + result = (char *)malloc(strlen(s) + 1); while (*src) { char c; char v = 0; if (ellipsis) { - error("Failed compiling kernel function signature '%s': non-terminal ellipsis '%c'", *s, *src); + error("Failed compiling kernel function signature '%s': non-terminal ellipsis '%c'", s, *src); } do { @@ -558,7 +555,7 @@ static void kernel_compile_signature(const char **s) { break; default: - error("ERROR compiling kernel function signature '%s': (%02x / '%c') not understood", *s, c, c); + error("ERROR compiling kernel function signature '%s': (%02x / '%c') not understood", s, c, c); } } while (*src && (*src == KSIG_SPEC_ELLIPSIS || (c < 'a' && c != KSIG_SPEC_ANY))); @@ -567,7 +564,8 @@ static void kernel_compile_signature(const char **s) { } result[index] = 0; - *s = result; // Write back + + return result; } void Kernel::mapFunctions() { @@ -584,9 +582,9 @@ void Kernel::mapFunctions() { Common::String sought_name = _kernelNames[functnr]; // Reset the table entry - _kernelFuncs[functnr].fun = NULL; + _kernelFuncs[functnr].func = NULL; _kernelFuncs[functnr].signature = NULL; - _kernelFuncs[functnr].orig_name = sought_name; + _kernelFuncs[functnr].origName = sought_name; if (sought_name.empty()) { // No name was given -> must be an unknown opcode @@ -601,10 +599,10 @@ void Kernel::mapFunctions() { continue; } - // If the name is known, look it up in kfunct_mappers. This table + // If the name is known, look it up in s_kernelFuncMap. This table // maps kernel func names to actual function (pointers). - for (uint seeker = 0; (found == -1) && kfunct_mappers[seeker].name; seeker++) - if (sought_name == kfunct_mappers[seeker].name) + for (uint seeker = 0; (found == -1) && s_kernelFuncMap[seeker].name; seeker++) + if (sought_name == s_kernelFuncMap[seeker].name) found = seeker; // Found a kernel function with the correct name! if (found == -1) { @@ -612,15 +610,14 @@ void Kernel::mapFunctions() { warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functnr); _kernelFuncs[functnr].isDummy = true; } else { - // A match in kfunct_mappers was found - if (kfunct_mappers[found].fun) { - _kernelFuncs[functnr].fun = kfunct_mappers[found].fun; - _kernelFuncs[functnr].signature = kfunct_mappers[found].signature; + // A match in s_kernelFuncMap was found + if (s_kernelFuncMap[found].func) { + _kernelFuncs[functnr].func = s_kernelFuncMap[found].func; + _kernelFuncs[functnr].signature = compileKernelSignature(s_kernelFuncMap[found].signature); _kernelFuncs[functnr].isDummy = false; - kernel_compile_signature(&(_kernelFuncs[functnr].signature)); ++mapped; } else { - //warning("Ignoring function %s\n", kfunct_mappers[found].name); + //warning("Ignoring function %s\n", s_kernelFuncMap[found].name); ++ignored; } } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index f17e751709..11bc76348d 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -115,9 +115,9 @@ enum { typedef reg_t KernelFunc(EngineState *s, int argc, reg_t *argv); struct KernelFuncWithSignature { - KernelFunc *fun; /**< The actual function */ - const char *signature; /**< KernelFunc signature */ - Common::String orig_name; /**< Original name, in case we couldn't map it */ + KernelFunc *func; /**< The actual function */ + char *signature; /**< KernelFunc signature */ + Common::String origName; /**< Original name, in case we couldn't map it */ bool isDummy; }; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f38ce5e3ab..3fbfba1c92 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -590,7 +590,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { xstack->selector = kernelFuncNum; xstack->type = EXEC_STACK_TYPE_KERNEL; - //warning("callk %s", kernelFunc.orig_name.c_str()); + //warning("callk %s", kernelFunc.origName.c_str()); // TODO: SCI2.1 equivalent if (s->loadFromLauncher >= 0 && ( @@ -614,13 +614,13 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { kRestoreGame(s, 2, restoreArgv); } else { // Call kernel function - s->r_acc = kernelFunc.fun(s, argc, argv); + s->r_acc = kernelFunc.func(s, argc, argv); } // Remove callk stack frame again s->_executionStack.pop_back(); } else { - Common::String warningMsg = "Dummy function " + kernelFunc.orig_name + + Common::String warningMsg = "Dummy function " + kernelFunc.origName + Common::String::printf("[0x%x]", kernelFuncNum) + " invoked - ignoring. Params: " + Common::String::printf("%d", argc) + " ("; -- cgit v1.2.3 From 359be0c0665d9fed898ad1c511614a76ee92e331 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:14:34 +0000 Subject: SCI: Change SciEngine's 'char *getGameID()' to 'Common::String getGameId()' svn-id: r49968 --- engines/sci/console.cpp | 2 +- engines/sci/engine/kernel.cpp | 4 ++-- engines/sci/engine/kgraphics.cpp | 8 ++++---- engines/sci/engine/kmisc.cpp | 4 ++-- engines/sci/engine/kpathing.cpp | 4 ++-- engines/sci/graphics/palette.cpp | 6 +++--- engines/sci/graphics/picture.cpp | 4 ++-- engines/sci/graphics/ports.cpp | 2 +- engines/sci/graphics/screen.cpp | 4 ++-- engines/sci/sci.cpp | 20 +++++++------------- engines/sci/sci.h | 3 ++- 11 files changed, 28 insertions(+), 33 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index d17b1facaa..b46e03830d 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -424,7 +424,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) { bool hasVocab997 = g_sci->getResMan()->testResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SELECTORS)) ? true : false; - DebugPrintf("Game ID: %s\n", _engine->getGameID()); + DebugPrintf("Game ID: %s\n", _engine->getGameId().c_str()); DebugPrintf("Emulated interpreter version: %s\n", getSciVersionDesc(getSciVersion())); DebugPrintf("\n"); DebugPrintf("Detected features:\n"); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7367e3f34a..6e02bbbb4e 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -747,7 +747,7 @@ void Kernel::setDefaultKernelNames() { // In SCI1.1, kSetSynonyms is an empty function _kernelNames[0x26] = "Empty"; - if (!strcmp(g_sci->getGameID(), "kq6")) { + if (g_sci->getGameId() == "kq6") { // In the Windows version of KQ6 CD, the empty kSetSynonyms // function has been replaced with kPortrait. In KQ6 Mac, // kPlayBack has been replaced by kShowMovie. @@ -755,7 +755,7 @@ void Kernel::setDefaultKernelNames() { _kernelNames[0x26] = "Portrait"; else if (g_sci->getPlatform() == Common::kPlatformMacintosh) _kernelNames[0x84] = "ShowMovie"; - } else if (!strcmp(g_sci->getGameID(), "qfg4") && g_sci->isDemo()) { + } else if (g_sci->getGameId() == "qfg4" && g_sci->isDemo()) { _kernelNames[0x7b] = "RemapColors"; // QFG4 Demo has this SCI2 function instead of StrSplit } diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6241c22f88..0a334924ab 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -534,7 +534,7 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) { // WORKAROUND for a problem in LSL1VGA. This allows the casino door to be opened, // till the actual problem is found - if (!strcmp(g_sci->getGameID(), "lsl1sci") && s->currentRoomNumber() == 300) { + if (g_sci->getGameId() == "lsl1sci" && s->currentRoomNumber() == 300) { int top = readSelectorValue(s->_segMan, object, SELECTOR(brTop)); writeSelectorValue(s->_segMan, object, SELECTOR(brTop), top + 2); } @@ -807,7 +807,7 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { // ALL other games use a hardcoded -1 (madness!) // We are detecting jones/talkie as "jones" as well, but the sierra interpreter of talkie doesnt have this // "hack". Hopefully it wont cause regressions (the code causes regressions if used against kq5/floppy) - if (!strcmp(g_sci->getGameID(), "jones")) + if (g_sci->getGameId() == "jones") priority = readSelectorValue(s->_segMan, controlObject, SELECTOR(priority)); else priority = -1; @@ -991,7 +991,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { bool hiresMode = (argc > 7) ? true : false; reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; - if (!strcmp(g_sci->getGameID(), "freddypharkas") || !strcmp(g_sci->getGameID(), "freddypharkas-demo")) { + if (g_sci->getGameId() == "freddypharkas" || g_sci->getGameId() == "freddypharkas-demo") { // WORKAROUND // Script 24 contains code that draws the game menu on screen. It uses a temp variable for setting priority that // is not set. in Sierra sci this happens to be 8250h. In our sci temporary variables are initialized thus we would @@ -1002,7 +1002,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { priority = 15; } - if (!strcmp(g_sci->getGameID(), "laurabow2")) { + if (g_sci->getGameId() == "laurabow2") { // WORKAROUND // see the one above if ((viewId == 995) && (priority == 0)) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 99b268f774..525f9f5bf4 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -59,9 +59,9 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { // LSL3 calculates a machinespeed variable during game startup (right after the filthy questions) // This one would go through w/o throttling resulting in having to do 1000 pushups or something // Another way of handling this would be delaying incrementing of "machineSpeed" selector - if (!strcmp(g_sci->getGameID(), "lsl3") && s->currentRoomNumber() == 290) + if (g_sci->getGameId() == "lsl3" && s->currentRoomNumber() == 290) s->_throttleTrigger = true; - if (!strcmp(g_sci->getGameID(), "iceman") && s->currentRoomNumber() == 27) { + if (g_sci->getGameId() == "iceman" && s->currentRoomNumber() == 27) { s->_throttleTrigger = true; neededSleep = 60; } diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 857ccc2a08..09cec29a79 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1056,7 +1056,7 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) { // WORKAROUND: broken polygon in lsl1sci, room 350, after opening elevator // Polygon has 17 points but size is set to 19 - if ((size == 19) && !strcmp(g_sci->getGameID(), "lsl1sci")) { + if ((size == 19) && g_sci->getGameId() == "lsl1sci") { if ((s->currentRoomNumber() == 350) && (read_point(segMan, points, 18) == Common::Point(108, 137))) { debug(1, "Applying fix for broken polygon in lsl1sci, room 350"); @@ -1174,7 +1174,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co // WORKAROUND LSL5 room 660. Priority glitch due to us choosing a different path // than SSCI. Happens when Patti walks to the control room. - if (!strcmp(g_sci->getGameID(), "lsl5") && (s->currentRoomNumber() == 660) && (Common::Point(67, 131) == *new_start) && (Common::Point(229, 101) == *new_end)) { + if (g_sci->getGameId() == "lsl5" && (s->currentRoomNumber() == 660) && (Common::Point(67, 131) == *new_start) && (Common::Point(229, 101) == *new_end)) { debug(1, "[avoidpath] Applying fix for priority problem in LSL5, room 660"); pf_s->_prependPoint = new_start; new_start = new Common::Point(77, 107); diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 1b2e5f410e..35741dedf7 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -66,11 +66,11 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) // and those will overwrite the current palette in that case // Quest for Glory 3 demo and police quest 1 vga behave the same interpreter wise and all have glitches, if we don't // switch back - if (!strcmp(g_sci->getGameID(), "laurabow2") && (g_sci->isDemo())) + if (g_sci->getGameId() == "laurabow2" && (g_sci->isDemo())) _alwaysForceRealMerge = true; - if (!strcmp(g_sci->getGameID(), "qfg3") && (g_sci->isDemo())) + else if (g_sci->getGameId() == "qfg3" && (g_sci->isDemo())) _alwaysForceRealMerge = true; - if (!strcmp(g_sci->getGameID(), "pq1sci")) + else if (g_sci->getGameId() == "pq1sci") _alwaysForceRealMerge = true; } diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index a59153f116..0b62a558ca 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -437,7 +437,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { memcpy(&EGApalettes[i], &vector_defaultEGApalette, sizeof(vector_defaultEGApalette)); memcpy(&EGApriority, &vector_defaultEGApriority, sizeof(vector_defaultEGApriority)); - if (strcmp(g_sci->getGameID(), "iceman") == 0) { + if (g_sci->getGameId() == "iceman") { // WORKAROUND: we remove certain visual&priority lines in underwater rooms of iceman, when not dithering the // picture. Normally those lines aren't shown, because they share the same color as the dithered // fill color combination. When not dithering, those lines would appear and get distracting. @@ -532,7 +532,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { // inside picture data for such games case PIC_OP_SET_PATTERN: if (_resourceType >= SCI_PICTURE_TYPE_SCI11) { - if (strcmp(g_sci->getGameID(), "sq4") == 0) { + if (g_sci->getGameId() == "sq4") { // WORKAROUND: For SQ4 / for some pictures handle this like a terminator // This picture includes garbage data, first a set pattern w/o parameter and then short pattern // I guess that garbage is a left over from the sq4-floppy (sci1) to sq4-cd (sci1.1) conversion diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index c964ccd346..b762872357 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -87,7 +87,7 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te // Jones, Slater and Hoyle 3 were called with parameter -Nw 0 0 200 320. // Mother Goose (SCI1) uses -Nw 0 0 159 262. The game will later use SetPort so we don't need to set the other fields. // This actually meant not skipping the first 10 pixellines in windowMgrPort - Common::String gameId = g_sci->getGameID(); + Common::String gameId = g_sci->getGameId(); if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 0e054d5a76..82ff478da2 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -97,9 +97,9 @@ GfxScreen::GfxScreen(ResourceManager *resMan, int16 width, int16 height, int ups if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) { // For SCI1.1 Mac, we need to expand the screen to accommodate for // the icon bar. Of course, both KQ6 and QFG1 VGA differ in size. - if (!scumm_stricmp(g_sci->getGameID(), "kq6")) + if (g_sci->getGameId() == "kq6") initGraphics(_displayWidth, _displayHeight + 26, _displayWidth > 320); - else if (!scumm_stricmp(g_sci->getGameID(), "qfg1")) + else if (g_sci->getGameId() == "qfg1") initGraphics(_displayWidth, _displayHeight + 20, _displayWidth > 320); else error("Unknown SCI1.1 Mac game"); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 00f832817b..265d5dc151 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -72,7 +72,7 @@ SciEngine *g_sci = 0; class GfxDriver; SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) - : Engine(syst), _gameDescription(desc) { + : Engine(syst), _gameDescription(desc), _gameId(_gameDescription->gameid) { assert(g_sci == 0); g_sci = this; @@ -128,7 +128,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) // Add the patches directory, except for KQ6CD; The patches folder in some versions of KQ6CD // is for the demo of Phantasmagoria, included in the disk - if (strcmp(getGameID(), "kq6")) + if (_gameId != "kq6") SearchMan.addSubDirectoryMatching(gameDataDir, "patches"); // resource patches } @@ -167,7 +167,7 @@ Common::Error SciEngine::run() { */ // Add the after market GM patches for the specified game, if they exist - _resMan->addNewGMPatch(getGameID()); + _resMan->addNewGMPatch(_gameId); _gameObj = _resMan->findGameObject(); SegManager *segMan = new SegManager(_resMan); @@ -179,10 +179,10 @@ Common::Error SciEngine::run() { // gk1/floppy does support upscaled hires scriptswise, but doesn't actually have the hires content we need to limit // it to platform windows. if (getPlatform() == Common::kPlatformWindows) { - if (!strcmp(getGameID(), "kq6")) + if (_gameId == "kq6") upscaledHires = GFX_SCREEN_UPSCALED_640x440; #ifdef ENABLE_SCI32 - if (!strcmp(getGameID(), "gk1")) + if (_gameId == "gk1") upscaledHires = GFX_SCREEN_UPSCALED_640x480; #endif } @@ -494,10 +494,6 @@ Console *SciEngine::getSciDebugger() { return _console; } -const char* SciEngine::getGameID() const { - return _gameDescription->gameid; -} - Common::Language SciEngine::getLanguage() const { return _gameDescription->language; } @@ -523,14 +519,12 @@ Common::String SciEngine::getSavegamePattern() const { } Common::String SciEngine::getFilePrefix() const { - const char* gameID = getGameID(); - if (!strcmp(gameID, "qfg2")) { + if (_gameId == "qfg2") { // Quest for Glory 2 wants to read files from Quest for Glory 1 (EGA/VGA) to import character data if (_gamestate->currentRoomNumber() == 805) return "qfg1"; // TODO: Include import-room for qfg1vga - } - if (!strcmp(gameID, "qfg3")) { + } else if (_gameId == "qfg3") { // Quest for Glory 3 wants to read files from Quest for Glory 2 to import character data if (_gamestate->currentRoomNumber() == 54) return "qfg2"; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 5ea5edc17b..ee51147a4e 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -151,7 +151,7 @@ public: bool canSaveGameStateCurrently(); void syncSoundSettings(); - const char* getGameID() const; + const Common::String &getGameId() const { return _gameId; } int getResourceVersion() const; Common::Language getLanguage() const; Common::Platform getPlatform() const; @@ -265,6 +265,7 @@ private: void initStackBaseWithSelector(Selector selector); const ADGameDescription *_gameDescription; + const Common::String _gameId; ResourceManager *_resMan; /**< The resource manager */ EngineState *_gamestate; Kernel *_kernel; -- cgit v1.2.3 From b474a72d1823d721f6f50de07bdebfdab3951632 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 17 Jun 2010 23:14:57 +0000 Subject: SCI: Remove incorrect gameid check svn-id: r49969 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 0a334924ab..596f8fb4b7 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -991,7 +991,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { bool hiresMode = (argc > 7) ? true : false; reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; - if (g_sci->getGameId() == "freddypharkas" || g_sci->getGameId() == "freddypharkas-demo") { + if (g_sci->getGameId() == "freddypharkas") { // WORKAROUND // Script 24 contains code that draws the game menu on screen. It uses a temp variable for setting priority that // is not set. in Sierra sci this happens to be 8250h. In our sci temporary variables are initialized thus we would -- cgit v1.2.3 From 50c3a087e3fb75ac06ea6186909b49885de6226d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 23:20:39 +0000 Subject: Reduced header dependency svn-id: r49970 --- engines/sci/graphics/fontsjis.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/fontsjis.h b/engines/sci/graphics/fontsjis.h index 24c8423ddb..684e6cac5e 100644 --- a/engines/sci/graphics/fontsjis.h +++ b/engines/sci/graphics/fontsjis.h @@ -26,10 +26,12 @@ #ifndef SCI_GRAPHICS_FONTSJIS_H #define SCI_GRAPHICS_FONTSJIS_H -#include "graphics/sjis.h" - #include "sci/graphics/helpers.h" +namespace Graphics { + class FontSJIS; +} + namespace Sci { /** -- cgit v1.2.3 From f977faaf9f9d2289adfbc2ccf9338cb24266dce5 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Thu, 17 Jun 2010 23:44:01 +0000 Subject: SCI: Fix a few errors in PlayVMD comment. svn-id: r49971 --- engines/sci/engine/kgraphics.cpp | 49 ++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 596f8fb4b7..8f59f553a7 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1289,7 +1289,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { break; case 1: { - // Set VMD parameters. Called with a maximum of 5 parameters: + // Set VMD parameters. Called with a maximum of 6 parameters: // // x, y, flags, gammaBoost, gammaFirst, gammaLast // @@ -1305,33 +1305,38 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // bit 8 stretch // gammaBoost boosts palette colors in the range gammaFirst to gammaLast, but - // only if bit 4 in flags is set. Percent value such that 100% = no amplification + // only if bit 4 in flags is set. Percent value such that 0% = no amplification // These three parameters are optional if bit 4 is clear. // Also note that the x, y parameters play subtle games if used with subfx 21. + // The subtleness has to do with creation of temporary planes and positioning relative to such planes. int flags = argv[3].offset; Common::String flagspec; - if (flags & 1) - flagspec += "doubled "; - if (flags & 2) - flagspec += "dropframes "; - if (flags & 4) - flagspec += "blacklines "; - if (flags & 8) - flagspec += "bit3 "; - if (flags & 16) - flagspec += "gammaboost "; - if (flags & 32) - flagspec += "holdblack "; - if (flags & 64) - flagspec += "holdlast "; - if (flags & 128) - flagspec += "bit7 "; - if (flags & 256) - flagspec += "stretch"; - - warning("VMDFlags: %s", flagspec.c_str()); + if (argc > 3) + { + if (flags & 1) + flagspec += "doubled "; + if (flags & 2) + flagspec += "dropframes "; + if (flags & 4) + flagspec += "blacklines "; + if (flags & 8) + flagspec += "bit3 "; + if (flags & 16) + flagspec += "gammaboost "; + if (flags & 32) + flagspec += "holdblack "; + if (flags & 64) + flagspec += "holdlast "; + if (flags & 128) + flagspec += "bit7 "; + if (flags & 256) + flagspec += "stretch"; + + warning("VMDFlags: %s", flagspec.c_str()); + } + warning("x, y: %d, %d", argv[1].offset, argv[2].offset); if (argc > 4 && flags & 16) -- cgit v1.2.3 From 9c1ec81d76def56d55df701df9d158532da1bf0f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 23:45:38 +0000 Subject: Strict mode: Turned several severe errors (almost all detection related) into errors, instead of warnings svn-id: r49972 --- engines/sci/engine/features.cpp | 6 +++--- engines/sci/engine/ksound.cpp | 4 ++-- engines/sci/engine/message.cpp | 6 +++--- engines/sci/resource.cpp | 14 +++++++------- engines/sci/sci.cpp | 2 +- engines/sci/sound/soundcmd.cpp | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 4eb6bf2a56..e8f2fe326c 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -51,13 +51,13 @@ reg_t GameFeatures::getDetectionAddr(const Common::String &objName, Selector slc reg_t addr; if (objAddr.isNull()) { - warning("getDetectionAddr: %s object couldn't be found", objName.c_str()); + error("getDetectionAddr: %s object couldn't be found", objName.c_str()); return NULL_REG; } if (methodNum == -1) { if (lookupSelector(_segMan, objAddr, slc, NULL, &addr) != kSelectorMethod) { - warning("getDetectionAddr: target selector is not a method of object %s", objName.c_str()); + error("getDetectionAddr: target selector is not a method of object %s", objName.c_str()); return NULL_REG; } } else { @@ -491,7 +491,7 @@ MoveCountType GameFeatures::detectMoveCountType() { _moveCountType = kIncrementMoveCount; } else { if (!autoDetectMoveCountType()) { - warning("Move count autodetection failed"); + error("Move count autodetection failed"); _moveCountType = kIncrementMoveCount; // Most games do this, so best guess } } diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index d4af4ade5c..83407c140d 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -80,7 +80,7 @@ reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { // Init return make_reg(0, 1); default: - warning("kCdDoAudio: Unhandled case %d", argv[0].toUint16()); + error("kCdDoAudio: Unhandled case %d", argv[0].toUint16()); } return s->r_acc; @@ -223,7 +223,7 @@ reg_t kDoSync(EngineState *s, int argc, reg_t *argv) { g_sci->_audio->stopSoundSync(); break; default: - warning("DoSync: Unhandled subfunction %d", argv[0].toUint16()); + error("DoSync: Unhandled subfunction %d", argv[0].toUint16()); } return s->r_acc; diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index 523e8321db..a4bde9b582 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -161,7 +161,7 @@ bool MessageState::getRecord(CursorStack &stack, bool recurse, MessageRecord &re reader = new MessageReaderV4(res->data, res->size); break; default: - warning("Message: unsupported resource version %d", version); + error("Message: unsupported resource version %d", version); return false; } @@ -259,7 +259,7 @@ void MessageState::popCursorStack() { if (!_cursorStackStack.empty()) _cursorStack = _cursorStackStack.pop(); else - warning("Message: attempt to pop from empty stack"); + error("Message: attempt to pop from empty stack"); } int MessageState::hexDigitToInt(char h) { @@ -380,7 +380,7 @@ void MessageState::outputString(reg_t buf, const Common::String &str) { if ((unsigned)buffer_r.maxSize >= str.size() + 1) { _segMan->strcpy(buf, str.c_str()); } else { - warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); + error("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); // Set buffer to empty string if possible if (buffer_r.maxSize > 0) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index bda854cfd0..46a8352567 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -714,7 +714,7 @@ void ResourceManager::init() { debugC(1, kDebugLevelResMan, "resMan: Detected Amiga graphic resources"); break; default: - warning("resMan: Couldn't determine view type"); + error("resMan: Couldn't determine view type"); } } @@ -1116,7 +1116,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource patchDataOffset = 8; break; default: - warning("Resource patch unsupported special case %X", patchDataOffset & 0x7F); + error("Resource patch unsupported special case %X", patchDataOffset & 0x7F); return; } } @@ -1636,7 +1636,7 @@ int Resource::decompress(ResVersion volVersion, Common::SeekableReadStream *file break; #endif default: - warning("Resource %s: Compression method %d not supported", _id.toString().c_str(), compression); + error("Resource %s: Compression method %d not supported", _id.toString().c_str(), compression); return SCI_ERROR_UNKNOWN_COMPRESSION; } @@ -1752,7 +1752,7 @@ ViewType ResourceManager::detectViewType() { } } - warning("resMan: Couldn't find any views"); + error("resMan: Couldn't find any views"); return kViewUnknown; } @@ -1862,7 +1862,7 @@ void ResourceManager::detectSciVersion() { } } - warning("Failed to accurately determine SCI version"); + error("Failed to accurately determine SCI version"); // No parser, we assume SCI_VERSION_01. s_sciVersion = SCI_VERSION_01; return; @@ -1919,7 +1919,7 @@ bool ResourceManager::detectHires() { } } - warning("resMan: Couldn't detect hires"); + error("resMan: Couldn't detect hires"); return false; #else error("no sci32 support"); @@ -1944,7 +1944,7 @@ bool ResourceManager::hasOldScriptHeader() { Resource *res = findResource(ResourceId(kResourceTypeScript, 0), 0); if (!res) { - warning("resMan: Failed to find script.000"); + error("resMan: Failed to find script.000"); return false; } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 265d5dc151..b8c541fc03 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -365,7 +365,7 @@ bool SciEngine::initGame() { _gamestate->stack_top = stack->_entries + stack->_capacity; if (!script_instantiate(_resMan, _gamestate->_segMan, 0)) { - warning("initGame(): Could not instantiate script 0"); + error("initGame(): Could not instantiate script 0"); return false; } diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index fa215ac302..6b0a69f5b8 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -203,7 +203,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM _cmdUpdateCuesIndex = 17; break; default: - warning("Sound command parser: unknown sound version %d", _soundVersion); + error("Sound command parser: unknown sound version %d", _soundVersion); break; } } @@ -246,7 +246,7 @@ reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { (this->*(_soundCommands[command]->sndCmd))(obj, value); } else { - warning("Invalid sound command requested (%d), valid range is 0-%d", command, _soundCommands.size() - 1); + error("Invalid sound command requested (%d), valid range is 0-%d", command, _soundCommands.size() - 1); } return _acc; -- cgit v1.2.3 From db70d66e4ae872ebdeb2a88ef0870708a30c7667 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 23:50:28 +0000 Subject: Strict mode: Changed several warnings due to logic bugs into errors. If an error pops up from these ones, please add the game where it occurred and the steps to reproduce the error before turning it into a warning svn-id: r49973 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/kmovement.cpp | 8 ++++---- engines/sci/engine/savegame.cpp | 6 +++--- engines/sci/engine/script.cpp | 4 ++-- engines/sci/engine/segment.cpp | 20 +++++++++++--------- engines/sci/engine/segment.h | 2 ++ engines/sci/engine/selector.cpp | 6 +++--- engines/sci/engine/state.cpp | 2 +- engines/sci/engine/vm.cpp | 18 +++++++++++------- engines/sci/graphics/ports.cpp | 2 +- engines/sci/sound/drivers/adlib.cpp | 4 ++-- engines/sci/sound/music.cpp | 2 +- 12 files changed, 42 insertions(+), 34 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 6e02bbbb4e..71bedd5ad9 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -640,7 +640,7 @@ int Kernel::findRegType(reg_t reg) { return 0; // Invalid if (!mobj->isValidOffset(reg.offset)) - warning("[KERN] ref %04x:%04x is invalid", PRINT_REG(reg)); + error("[KERN] ref %04x:%04x is invalid", PRINT_REG(reg)); switch (mobj->getType()) { case SEG_TYPE_SCRIPT: diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index c30a6e885a..b247275e8c 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -373,14 +373,14 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { s->r_acc = SIGNAL_REG; if (!s->_segMan->isHeapObject(avoider)) { - warning("DoAvoider() where avoider %04x:%04x is not an object", PRINT_REG(avoider)); + error("DoAvoider() where avoider %04x:%04x is not an object", PRINT_REG(avoider)); return NULL_REG; } client = readSelector(segMan, avoider, SELECTOR(client)); if (!s->_segMan->isHeapObject(client)) { - warning("DoAvoider() where client %04x:%04x is not an object", PRINT_REG(client)); + error("DoAvoider() where client %04x:%04x is not an object", PRINT_REG(client)); return NULL_REG; } @@ -389,7 +389,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { if (!s->_segMan->isHeapObject(mover)) { if (mover.segment) { - warning("DoAvoider() where mover %04x:%04x is not an object", PRINT_REG(mover)); + error("DoAvoider() where mover %04x:%04x is not an object", PRINT_REG(mover)); } return s->r_acc; } @@ -450,7 +450,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { angle -= 360; } - warning("DoAvoider failed for avoider %04x:%04x", PRINT_REG(avoider)); + error("DoAvoider failed for avoider %04x:%04x", PRINT_REG(avoider)); } else { int heading = readSelectorValue(segMan, client, SELECTOR(heading)); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 256a1aef03..eba5e67cb6 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -776,8 +776,8 @@ void SegManager::reconstructScripts(EngineState *s) { if (getSciVersion() < SCI_VERSION_1_1) { if (!obj->initBaseObject(this, addr, false)) { - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - scr->scriptObjRemove(addr); + error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + //scr->scriptObjRemove(addr); } } } @@ -809,7 +809,7 @@ void SegManager::reconstructClones() { const Object *baseObj = getObject(seeker.getSpeciesSelector()); seeker.cloneFromObject(baseObj); if (!baseObj) - warning("Clone entry without a base class: %d", j); + error("Clone entry without a base class: %d", j); } // end for } // end if } // end for diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 19e0b6f81a..8f3792552f 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -277,8 +277,8 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { obj->initSpecies(segMan, addr); if (!obj->initBaseObject(segMan, addr)) { - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - scr->scriptObjRemove(addr); + error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + //scr->scriptObjRemove(addr); } } break; diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index a6154e7512..c2f72ecdbd 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -221,7 +221,7 @@ void Script::load(ResourceManager *resMan) { _localsOffset = 0; if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) { - warning("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize); + error("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize); _localsCount = (_bufSize - _localsOffset) >> 1; } } else { @@ -268,12 +268,14 @@ Object *Script::scriptObjInit(reg_t obj_pos, bool fullObjectInit) { return obj; } +#if 0 void Script::scriptObjRemove(reg_t obj_pos) { if (getSciVersion() < SCI_VERSION_1_1) obj_pos.offset += 8; _objects.erase(obj_pos.toUint16()); } +#endif // This helper function is used by Script::relocateLocal and Object::relocate static bool relocateBlock(Common::Array &block, int block_location, SegmentId segment, int location, size_t scriptSize) { @@ -288,7 +290,7 @@ static bool relocateBlock(Common::Array &block, int block_location, Segme return false; if (rel & 1) { - warning("Attempt to relocate odd variable #%d.5e (relative to %04x)\n", idx, block_location); + error("Attempt to relocate odd variable #%d.5e (relative to %04x)\n", idx, block_location); return false; } block[idx].segment = segment; // Perform relocation @@ -372,7 +374,7 @@ uint16 Script::validateExportFunc(int pubfunct) { bool exportsAreWide = (g_sci->_features->detectLofsType() == SCI_VERSION_1_MIDDLE); if (_numExports <= pubfunct) { - warning("validateExportFunc(): pubfunct is invalid"); + error("validateExportFunc(): pubfunct is invalid"); return 0; } @@ -464,7 +466,7 @@ SegmentRef LocalVariables::dereference(reg_t pointer) { if (ret.maxSize > 0) { ret.reg = &_locals[pointer.offset / 2]; } else { - warning("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); + error("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); ret.reg = 0; } return ret; @@ -551,7 +553,7 @@ void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback not for (uint i = 0; i < obj->getVarCount(); i++) (*note)(param, obj->getVariable(i)); } else { - warning("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr)); + error("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr)); } } else { /* warning("Unexpected request for outgoing script-object references at %04x:%04x", PRINT_REG(addr));*/ @@ -642,7 +644,7 @@ void ListTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { if (!isValidEntry(addr.offset)) { - warning("Invalid list referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); + error("Invalid list referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); return; } @@ -662,7 +664,7 @@ void NodeTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { if (!isValidEntry(addr.offset)) { - warning("Invalid node referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); + error("Invalid node referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); return; } const Node *node = &(_table[addr.offset]); @@ -736,7 +738,7 @@ int Object::propertyOffsetToId(SegManager *segMan, int propertyOffset) const { int selectors = getVarCount(); if (propertyOffset < 0 || (propertyOffset >> 1) >= selectors) { - warning("Applied propertyOffsetToId to invalid property offset %x (property #%d not in [0..%d])", + error("Applied propertyOffsetToId to invalid property offset %x (property #%d not in [0..%d])", propertyOffset, propertyOffset >> 1, selectors - 1); return -1; } @@ -814,7 +816,7 @@ void ArrayTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { void ArrayTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { if (!isValidEntry(addr.offset)) { - warning("Invalid array referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); + error("Invalid array referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); return; } diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 253d94cc53..141576cb67 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -406,11 +406,13 @@ public: */ Object *scriptObjInit(reg_t obj_pos, bool fullObjectInit = true); +#if 0 /** * Removes a script object * @param obj_pos Location (segment, offset) of the object. */ void scriptObjRemove(reg_t obj_pos); +#endif /** * Processes a relocation block witin a script diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 15b008430b..08e2ba5e99 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -188,13 +188,13 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t ObjVarRef address; if ((selectorId < 0) || (selectorId > (int)g_sci->getKernel()->getSelectorNamesSize())) { - warning("Attempt to write to invalid selector %d of" + error("Attempt to write to invalid selector %d of" " object at %04x:%04x.", selectorId, PRINT_REG(object)); return; } if (lookupSelector(segMan, object, selectorId, &address, NULL) != kSelectorVariable) - warning("Selector '%s' of object at %04x:%04x could not be" + error("Selector '%s' of object at %04x:%04x could not be" " written to", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); else *address.getPointer(segMan) = value; @@ -217,7 +217,7 @@ void invokeSelector(EngineState *s, reg_t object, int selectorId, g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); } if (slc_type == kSelectorVariable) { - warning("Attempting to invoke variable selector %s of object %04x:%04x", + error("Attempting to invoke variable selector %s of object %04x:%04x", g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object)); } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 80b9ba3bcb..129976ce99 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -207,7 +207,7 @@ Common::String SciEngine::getSciLanguageString(const char *str, kLanguage lang, // Copy double-byte character char c2 = *(++seeker); if (!c2) { - warning("SJIS character %02X is missing second byte", c); + error("SJIS character %02X is missing second byte", c); break; } fullWidth += c; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 3fbfba1c92..c3f27b77b3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -128,7 +128,8 @@ static StackPtr validate_stack_addr(EngineState *s, StackPtr sp) { static int validate_arithmetic(reg_t reg) { if (reg.segment) { - warning("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); + // The results of this are likely unpredictable... + error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); return 0; } @@ -137,7 +138,8 @@ static int validate_arithmetic(reg_t reg) { static int signed_validate_arithmetic(reg_t reg) { if (reg.segment) { - warning("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); + // The results of this are likely unpredictable... + error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); return 0; } @@ -159,8 +161,8 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in if (type == VAR_PARAM || type == VAR_TEMP) { int total_offset = r - stack_base; if (total_offset < 0 || total_offset >= VM_STACK_SIZE) { - warning("%s", txt.c_str()); - warning("[VM] Access would be outside even of the stack (%d); access denied", total_offset); + // Fatal, as the game is trying to do an OOB access + error("%s. [VM] Access would be outside even of the stack (%d); access denied", txt.c_str(), total_offset); return false; } else { debugC(2, kDebugLevelVM, "%s", txt.c_str()); @@ -298,7 +300,7 @@ static void _exec_varselectors(EngineState *s) { ExecStack &xs = s->_executionStack.back(); reg_t *var = xs.getVarPointer(s->_segMan); if (!var) { - warning("Invalid varselector exec stack entry"); + error("Invalid varselector exec stack entry"); } else { // varselector access? if (xs.argc) { // write? @@ -419,7 +421,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt reg_t oldReg = *varp.getPointer(s->_segMan); reg_t newReg = argp[1]; const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); - warning("send_selector(): argc = %d while modifying variable selector " + error("send_selector(): argc = %d while modifying variable selector " "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", argc, selector, selectorName, PRINT_REG(send_obj), objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); @@ -762,6 +764,7 @@ void run_vm(EngineState *s, bool restoring) { scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); if (!scr) { // No script? Implicit return via fake instruction buffer + // FIXME: Why does this happen? Are there leftover calls in the call stack? warning("Running on non-existant script in segment %x", s->xs->addr.pc.segment); code_buf = _fake_return_buffer; #ifndef DISABLE_VALIDATIONS @@ -779,6 +782,7 @@ void run_vm(EngineState *s, bool restoring) { #endif local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { + // FIXME: Why does this happen? Is the script not loaded yet at this point? warning("Could not find local script from segment %x", s->xs->local_segment); local_script = NULL; s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; @@ -1661,7 +1665,7 @@ void run_vm(EngineState *s, bool restoring) { //#ifndef DISABLE_VALIDATIONS if (s->xs != &(s->_executionStack.back())) { - warning("xs is stale (%p vs %p); last command was %02x", + error("xs is stale (%p vs %p); last command was %02x", (void *)s->xs, (void *)&(s->_executionStack.back()), opcode); } diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index b762872357..a3135e7177 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -216,7 +216,7 @@ Window *GfxPorts::newWindow(const Common::Rect &dims, const Common::Rect *restor Common::Rect r; if (!pwnd) { - warning("Can't open window!"); + error("Can't open window!"); return 0; } diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index a743e4b5d9..4f93314b64 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -703,7 +703,7 @@ void MidiDriver_AdLib::setVelocityReg(int regOffset, int velocity, int kbScaleLe void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { - warning("ADLIB: Invalid patch %i requested", patch); + error("ADLIB: Invalid patch %i requested", patch); patch = 0; } @@ -749,7 +749,7 @@ void MidiDriver_AdLib::playSwitch(bool play) { bool MidiDriver_AdLib::loadResource(const byte *data, uint size) { if ((size != 1344) && (size != 2690) && (size != 5382)) { - warning("ADLIB: Unsupported patch format (%i bytes)", size); + error("ADLIB: Unsupported patch format (%i bytes)", size); return false; } diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index c5fc07bfd7..f6a4d5beb4 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -455,7 +455,7 @@ void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { if (pSnd->pMidiParser) pSnd->pMidiParser->sendToDriver(cmd); else - warning("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); + error("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); } void SciMusic::printPlayList(Console *con) { -- cgit v1.2.3 From c9c9a21a0836edfc824e821702e886a656167692 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 23:52:17 +0000 Subject: Renamed error -> errorNum to avoid name clashes with error() svn-id: r49974 --- engines/sci/resource.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 46a8352567..e59f69513c 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1603,14 +1603,14 @@ int Resource::readResourceInfo(ResVersion volVersion, Common::SeekableReadStream } int Resource::decompress(ResVersion volVersion, Common::SeekableReadStream *file) { - int error; + int errorNum; uint32 szPacked = 0; ResourceCompression compression = kCompUnknown; // fill resource info - error = readResourceInfo(volVersion, file, szPacked, compression); - if (error) - return error; + errorNum = readResourceInfo(volVersion, file, szPacked, compression); + if (errorNum) + return errorNum; // getting a decompressor Decompressor *dec = NULL; @@ -1642,12 +1642,12 @@ int Resource::decompress(ResVersion volVersion, Common::SeekableReadStream *file data = new byte[size]; _status = kResStatusAllocated; - error = data ? dec->unpack(file, data, szPacked, size) : SCI_ERROR_RESOURCE_TOO_BIG; - if (error) + errorNum = data ? dec->unpack(file, data, szPacked, size) : SCI_ERROR_RESOURCE_TOO_BIG; + if (errorNum) unalloc(); delete dec; - return error; + return errorNum; } ResourceCompression ResourceManager::getViewCompression() { -- cgit v1.2.3 From 6946167f34518d16036e37ce19683be1592a9424 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 17 Jun 2010 23:53:30 +0000 Subject: Strict mode: error out on unhandled subops, to note if they actually exist and where they're used svn-id: r49975 --- engines/sci/engine/kgraphics.cpp | 20 ++++++++++---------- engines/sci/graphics/paint16.cpp | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 8f59f553a7..15567a08e3 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -173,7 +173,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxCursor->kernelSetView(argv[0].toUint16(), argv[1].toUint16(), argv[2].toUint16(), hotspot); break; default : - warning("kSetCursor: Unhandled case: %d arguments given", argc); + error("kSetCursor: Unhandled case: %d arguments given", argc); break; } return s->r_acc; @@ -186,7 +186,7 @@ reg_t kSetCursor(EngineState *s, int argc, reg_t *argv) { case SCI_VERSION_1_1: return kSetCursorSci11(s, argc, argv); default: - warning("Unknown SetCursor type"); + error("Unknown SetCursor type"); return NULL_REG; } } @@ -316,7 +316,7 @@ reg_t kGraph(EngineState *s, int argc, reg_t *argv) { return g_sci->_gfxPaint16->kernelGraphSaveUpscaledHiresBox(rect); default: - warning("Unsupported kGraph() operation %04x", argv[0].toSint16()); + error("Unsupported kGraph() operation %04x", argv[0].toSint16()); } return s->r_acc; @@ -627,7 +627,7 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { break; } default: - warning("kPalette(%d), not implemented", argv[0].toUint16()); + error("kPalette(%d), not implemented", argv[0].toUint16()); } return s->r_acc; @@ -680,7 +680,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { break; } default: - warning("kPalVary(%d), not implemented (argc = %d)", operation, argc); + error("kPalVary(%d), not implemented (argc = %d)", operation, argc); } return NULL_REG; } @@ -702,7 +702,7 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { Common::String resourceName = s->_segMan->getString(argv[1]); s->r_acc = g_sci->_gfxPaint16->kernelPortraitLoad(resourceName); } else { - warning("kPortrait(loadResource) called with unsupported argc %d", argc); + error("kPortrait(loadResource) called with unsupported argc %d", argc); } break; } @@ -720,7 +720,7 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxPaint16->kernelPortraitShow(resourceName, position, resourceNum, noun, verb, cond, seq); return SIGNAL_REG; } else { - warning("kPortrait(show) called with unsupported argc %d", argc); + error("kPortrait(show) called with unsupported argc %d", argc); } break; } @@ -729,12 +729,12 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { uint16 portraitId = argv[1].toUint16(); g_sci->_gfxPaint16->kernelPortraitUnload(portraitId); } else { - warning("kPortrait(unload) called with unsupported argc %d", argc); + error("kPortrait(unload) called with unsupported argc %d", argc); } break; } default: - warning("kPortrait(%d), not implemented (argc = %d)", operation, argc); + error("kPortrait(%d), not implemented (argc = %d)", operation, argc); } return s->r_acc; @@ -1160,7 +1160,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { initGraphics(screenWidth, screenHeight, screenWidth > 320, NULL); if (g_system->getScreenFormat().bytesPerPixel == 1) { - warning("This video requires >8bpp color to be displayed, but could not switch to RGB color mode."); + error("This video requires >8bpp color to be displayed, but could not switch to RGB color mode."); return NULL_REG; } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index a52fd304e2..feda84e993 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -514,7 +514,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { bRedraw = 0; break; default: - warning("Unknown kDisplay argument %X", displayArg); + error("Unknown kDisplay argument %X", displayArg); break; } } -- cgit v1.2.3 From 39e77edbb71f04dc1436db152849aec1cd09e873 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 00:05:41 +0000 Subject: Process kAddAfter with 4 parameters (Torin's Passage) svn-id: r49976 --- engines/sci/engine/klists.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 050c8e515f..ba3ab61237 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -293,11 +293,14 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - if (argc != 3) { - warning("kAddAfter: Haven't got 3 arguments, aborting"); + if (argc != 3 && argc != 4) { + warning("kAddAfter: Haven't got 3 or 4 arguments, aborting"); return NULL_REG; } + if (argc == 4) // Torin's Passage + warning("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); + if (firstnode) { // We're really appending after reg_t oldnext = firstnode->succ; -- cgit v1.2.3 From 660ae052c88fc2e209dde87595799bff8b2bd09b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 00:36:20 +0000 Subject: Fixed a bug in detectHires(), so that it actually works svn-id: r49978 --- engines/sci/resource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index e59f69513c..b71c6b9317 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1909,8 +1909,8 @@ bool ResourceManager::detectHires() { if (res) { if (READ_LE_UINT16(res->data) == 0x0e) { // SCI32 picture - uint16 width = READ_LE_UINT16(res->data + 10); - uint16 height = READ_LE_UINT16(res->data + 12); + uint16 width = READ_LE_UINT16(res->data + 14); + uint16 height = READ_LE_UINT16(res->data + 16); if ((width == 320) && ((height == 190) || (height == 200))) return false; if ((width >= 600) || (height >= 400)) -- cgit v1.2.3 From 880e07250ea86416c29fde16341429f347dc4d8a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 00:37:56 +0000 Subject: Added warning about unhandled kGraph subop 1 (GK1CD) svn-id: r49979 --- engines/sci/engine/kgraphics.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 15567a08e3..7f5ae82a99 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -245,6 +245,11 @@ reg_t kGraph(EngineState *s, int argc, reg_t *argv) { } switch (argv[0].toSint16()) { + case 1: + // Happens in GK1CD, right when it starts + warning("Unsupported kGraph() operation %04x", argv[0].toSint16()); + return s->r_acc; + case K_GRAPH_GET_COLORS_NR: if (g_sci->getResMan()->isAmiga32color()) return make_reg(0, 32); -- cgit v1.2.3 From 949493d14160530a37c02f2440f41e5dac49e725 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 00:49:55 +0000 Subject: Fixed invalid memory read in GK1CD svn-id: r49980 --- engines/sci/engine/kgraphics.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 7f5ae82a99..348855964c 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -246,9 +246,10 @@ reg_t kGraph(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toSint16()) { case 1: - // Happens in GK1CD, right when it starts + // TODO: Happens in GK1CD, right when it starts warning("Unsupported kGraph() operation %04x", argv[0].toSint16()); - return s->r_acc; + // Returns an integer + return SIGNAL_REG; case K_GRAPH_GET_COLORS_NR: if (g_sci->getResMan()->isAmiga32color()) -- cgit v1.2.3 From d2a9fdae260b74b23be7b2f14f5723914ab5a559 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 00:59:10 +0000 Subject: Added stubs for kPalVary, subops 2 and 5 (XMAS '92, QFG4 demo) svn-id: r49981 --- engines/sci/engine/kgraphics.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 348855964c..b20c98f16b 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -661,6 +661,11 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } + case 2: { // Unknown + // Called in QFG4 demo (1 parameter) + warning("kPalVary(2) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + break; + } case 3: { // DeInit if (argc == 1) { g_sci->_gfxPalette->stopPalVary(); @@ -674,6 +679,11 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(4) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } + case 5: { // Unknown + // Called in xmas 1992 demo (2 parameters) + warning("kPalVary(5) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + break; + } case 6: { // Pause bool pauseState; if (argc == 2) { -- cgit v1.2.3 From b453d139d49bb17fef58a329d1fba55b3fa8fbba Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Fri, 18 Jun 2010 01:09:40 +0000 Subject: SCI: (Temporary?) workaround for firmware bug in common USB-MIDI cables. svn-id: r49982 --- engines/sci/sound/drivers/midi.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index 2432a8fab0..b97564342c 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -271,6 +271,17 @@ void MidiPlayer_Midi::setPatch(int channel, int patch) { _driver->setPitchBendRange(channel, bendRange); _driver->send(0xc0 | channel, _patchMap[patch], 0); + + // Send a pointless command to work around a firmware bug in common + // USB-MIDI cables. If the first MIDI command in a USB packet is a + // Cx or Dx command, the second command in the packet is dropped + // somewhere. + // FIXME: consider putting a workaround in the MIDI backend drivers + // instead. + // Known to be affected: alsa, coremidi + // Known *not* to be affected: windows (only seems to send one MIDI + // command per USB packet even if the device allows larger packets). + _driver->send(0xb0 | channel, 0x0a, _channels[channel].pan); } void MidiPlayer_Midi::send(uint32 b) { -- cgit v1.2.3 From ac4659b92acd42690dae6b09a1a72bb0d30c1764 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 01:11:00 +0000 Subject: Added several unimplemented kDisplay subops, as well as a new sound command, found in the demo of Longbow svn-id: r49983 --- engines/sci/graphics/paint16.cpp | 15 +++++++++++++++ engines/sci/sound/soundcmd.cpp | 1 + 2 files changed, 16 insertions(+) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index feda84e993..ebb6cebb44 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -513,6 +513,21 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_DONTSHOWBITS: bRedraw = 0; break; + case 4: // Longbow demo + warning("Unknown kDisplay argument %X", displayArg); + break; + case 7: // Longbow demo + warning("Unknown kDisplay argument %X", displayArg); + break; + case 9: // Longbow demo + warning("Unknown kDisplay argument %X", displayArg); + break; + case 114: // Longbow demo + warning("Unknown kDisplay argument %X", displayArg); + break; + case 115: // Longbow demo + warning("Unknown kDisplay argument %X", displayArg); + break; default: error("Unknown kDisplay argument %X", displayArg); break; diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 6b0a69f5b8..6470b17e83 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -176,6 +176,7 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM SOUNDCOMMAND(cmdSendMidi); SOUNDCOMMAND(cmdReverb); SOUNDCOMMAND(cmdSetSoundHold); + SOUNDCOMMAND(cmdDummy); // Longbow demo _cmdUpdateCuesIndex = 11; break; case SCI_VERSION_1_LATE: -- cgit v1.2.3 From 30ea5f3ad2c45702f15e0941829fe002a4d22711 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 01:27:25 +0000 Subject: Added a workaround for the KQ1 demo (looks like a script bug) svn-id: r49984 --- engines/sci/engine/seg_manager.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 58b496ccfc..5c49855367 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -528,15 +528,23 @@ Node *SegManager::lookupNode(reg_t addr) { if (addr.isNull()) return NULL; // Non-error null - if (getSegmentType(addr.segment) != SEG_TYPE_NODES) { - error("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); + SegmentType type = getSegmentType(addr.segment); + + if (type != SEG_TYPE_NODES) { + if (g_sci->getGameId() == "kq1sci") { + // The demo of KQ1 is trying to use an invalid memory reference as a list node + warning("Attempt to use non-node %04x:%04x (type %d) as list node", PRINT_REG(addr), type); + return NULL; + } + + error("Attempt to use non-node %04x:%04x (type %d) as list node", PRINT_REG(addr), type); return NULL; } NodeTable *nt = (NodeTable *)_heap[addr.segment]; if (!nt->isValidEntry(addr.offset)) { - error("Attempt to use non-node %04x:%04x as list node", PRINT_REG(addr)); + error("Attempt to use invalid reference %04x:%04x as list node", PRINT_REG(addr)); return NULL; } -- cgit v1.2.3 From 7a22e491e39a5e15cf17168c2fde1368eea2d96b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 01:29:07 +0000 Subject: Marked the KQ1 demo workaround as a workaround svn-id: r49985 --- engines/sci/engine/seg_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 5c49855367..f19c03d5a8 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -532,7 +532,7 @@ Node *SegManager::lookupNode(reg_t addr) { if (type != SEG_TYPE_NODES) { if (g_sci->getGameId() == "kq1sci") { - // The demo of KQ1 is trying to use an invalid memory reference as a list node + // WORKAROUND: The demo of KQ1 is trying to use an invalid memory reference as a list node warning("Attempt to use non-node %04x:%04x (type %d) as list node", PRINT_REG(addr), type); return NULL; } -- cgit v1.2.3 From 2d61dd8608aafe0e524cec3e496f6d33f55cd922 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 01:38:08 +0000 Subject: Fixed invalid memory access in SQ6 svn-id: r49986 --- engines/sci/engine/ksound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 83407c140d..daff676a28 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -151,7 +151,7 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { volume = CLIP(volume, 0, AUDIO_VOLUME_MAX); debugC(2, kDebugLevelSound, "kDoAudio: set volume to %d", volume); mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume * 2); - break; + return make_reg(0, volume); } case kSciAudioLanguage: // In SCI1.1: tests for digital audio support -- cgit v1.2.3 From 8f761de15ffb4475bf529248b0bf7b635db53400 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 01:48:56 +0000 Subject: Added a new subop of kPalVary (PQ4) svn-id: r49987 --- engines/sci/engine/kgraphics.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index b20c98f16b..2ee30f1771 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -695,6 +695,11 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } break; } + case 8: { // Unknown + // Called in PQ4 (1 parameter) + warning("kPalVary(8) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + break; + } default: error("kPalVary(%d), not implemented (argc = %d)", operation, argc); } -- cgit v1.2.3 From 01cb1cf01164987770ac76b897f2dc7eb7cb300d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:03:28 +0000 Subject: Turned more warnings into errors, some cleanup svn-id: r49990 --- engines/sci/engine/klists.cpp | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index ba3ab61237..86d82bd3d1 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -127,31 +127,6 @@ reg_t kDisposeList(EngineState *s, int argc, reg_t *argv) { // This function is not needed in ScummVM. The garbage collector // cleans up unused objects automatically -#if 0 - List *l = s->_segMan->lookupList(argv[0]); - - if (!l) { - // FIXME: This should be an error, but it's turned to a warning for now - warning("Attempt to dispose non-list at %04x:%04x", PRINT_REG(argv[0])); - return NULL_REG; - } - - checkListPointer(s->_segMan, argv[0]); - - if (!l->first.isNull()) { - reg_t n_addr = l->first; - - while (!n_addr.isNull()) { // Free all nodes - Node *n = s->_segMan->lookupNode(n_addr); - n_addr = n->succ; - - //s->_segMan->free_Node(n_addr); // TODO - } - } - - //s->_segMan->free_list(argv[0]); // TODO -#endif - return s->r_acc; } @@ -211,9 +186,8 @@ static void _k_add_to_front(EngineState *s, reg_t listbase, reg_t nodebase) { debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); - // FIXME: This should be an error, but it's turned to a warning for now if (!new_n) - warning("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); + error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); checkListPointer(s->_segMan, listbase); new_n->succ = l->first; @@ -234,9 +208,8 @@ static void _k_add_to_end(EngineState *s, reg_t listbase, reg_t nodebase) { debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); - // FIXME: This should be an error, but it's turned to a warning for now if (!new_n) - warning("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); + error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); checkListPointer(s->_segMan, listbase); new_n->succ = NULL_REG; @@ -287,9 +260,8 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { checkListPointer(s->_segMan, argv[0]); - // FIXME: This should be an error, but it's turned to a warning for now if (!newnode) { - warning("New 'node' %04x:%04x is not a node", PRINT_REG(argv[2])); + error("New 'node' %04x:%04x is not a node", PRINT_REG(argv[2])); return NULL_REG; } -- cgit v1.2.3 From e347a6856ef3d4796a794cc51e7d078ec3c2a26f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 18 Jun 2010 02:08:00 +0000 Subject: Do not rebuild common/messages.cpp automatically when a translation changes, but require the user to do "make update-translations". This should be helpful for building on a system without perl. svn-id: r49991 --- common/module.mk | 7 ------- po/module.mk | 5 ++++- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/common/module.mk b/common/module.mk index f40ca2f0a0..239f8e9ccf 100644 --- a/common/module.mk +++ b/common/module.mk @@ -29,12 +29,5 @@ MODULE_OBJS := \ xmlparser.o \ zlib.o -ifdef USE_TRANSLATION -$(srcdir)/common/translation.cpp: $(srcdir)/common/messages.cpp - -$(srcdir)/common/messages.cpp: $(wildcard $(srcdir)/po/*.po) - $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp -endif - # Include common rules include $(srcdir)/rules.mk diff --git a/po/module.mk b/po/module.mk index bc15902833..b7f796f67c 100644 --- a/po/module.mk +++ b/po/module.mk @@ -32,7 +32,10 @@ updatepot: mv -f $@.new $@; \ fi; -update-translations: updatepot $(POFILES) +$(srcdir)/common/messages.cpp: $(POFILES) + $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp + +update-translations: updatepot $(POFILES) $(srcdir)/common/messages.cpp @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) @rm -f messages.mo -- cgit v1.2.3 From e3c8624510fb0d7b28e95dd79d99c39b643d42e1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 18 Jun 2010 02:08:21 +0000 Subject: Explcitily use "perl" from the PATH, this fixes translation updating on systems, where perl is not installed in /usr/bin/perl. svn-id: r49992 --- po/module.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/module.mk b/po/module.mk index b7f796f67c..adea399adb 100644 --- a/po/module.mk +++ b/po/module.mk @@ -33,7 +33,7 @@ updatepot: fi; $(srcdir)/common/messages.cpp: $(POFILES) - $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp + perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp update-translations: updatepot $(POFILES) $(srcdir)/common/messages.cpp @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) -- cgit v1.2.3 From 31930b6d09a711a1c1ed708d2f23a6fc05ba2d63 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:09:12 +0000 Subject: Error out on unimplemented kDeviceInfo() calls svn-id: r49993 --- engines/sci/engine/kfile.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index ad188f503a..1c0ff31ec1 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -402,8 +402,7 @@ reg_t kDeviceInfo(EngineState *s, int argc, reg_t *argv) { break; default: - // TODO: Not all sub-commands are handled. E.g. KQ5CD calls sub-command 5 - warning("Unknown DeviceInfo() sub-command: %d", mode); + error("Unknown DeviceInfo() sub-command: %d", mode); break; } -- cgit v1.2.3 From 0eee4e79bf320a2b068a1460613e879751853b17 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:16:00 +0000 Subject: Changed an assert into a warning with a FIXME (happens in SQ1) svn-id: r49994 --- engines/sci/sound/midiparser_sci.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 1ea990332b..b2ccbd5c81 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -160,7 +160,12 @@ void MidiParser_SCI::sendToDriver(uint32 b) { return; // Channel remapping int16 realChannel = _channelRemap[midiChannel]; - assert(realChannel != -1); + if (realChannel == -1) { + // FIXME: Happens in SQ1VGA when the game starts + warning("Attempt to send to uninitialized channel %d", midiChannel); + return; + } + b = (b & 0xFFFFFFF0) | realChannel; _driver->send(b); } -- cgit v1.2.3 From 773f3bf1453b7e4cc55753e8ca882f5346ef5f83 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:23:30 +0000 Subject: Changed another warning into an error. Cleanup svn-id: r49995 --- engines/sci/engine/kscripts.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 7e33f17f5f..5f552080e3 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -66,6 +66,7 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { if (id.getType() == kResourceTypeInvalid) warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type); else + // Happens in CD games (e.g. LSL6CD) with the message resource warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); } break; @@ -163,7 +164,6 @@ reg_t kDisposeClone(EngineState *s, int argc, reg_t *argv) { } if (!victim_obj->isClone()) { - //warning("Attempt to dispose something other than a clone at %04x", offset); // SCI silently ignores this behaviour; some games actually depend on it return s->r_acc; } @@ -193,9 +193,10 @@ reg_t kScriptID(EngineState *s, int argc, reg_t *argv) { // and this call is probably used to load them in memory, ignoring // the return value. If only one argument is passed, this call is done // only to load the script in memory. Thus, don't show any warning, - // as no return value is expected + // as no return value is expected. If an export is requested, then + // it will most certainly fail with OOB access. if (argc == 2) - warning("Script 0x%x does not have a dispatch table and export %d " + error("Script 0x%x does not have a dispatch table and export %d " "was requested from it", script, index); return NULL_REG; } -- cgit v1.2.3 From a451ffe2687dc894d8026de14b4235b4e9b2953d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 18 Jun 2010 02:25:11 +0000 Subject: Make MidiParser::sendToDriver protected. The client code should never try to pass commands to the output via the MidiParser API. SCI currently does that though... Actually that shows that either our MidiParser API becomes more and more an MidiPlayer than just a parser or that the SCI design has its flaws here. svn-id: r49996 --- sound/midiparser.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sound/midiparser.h b/sound/midiparser.h index 35a14954a7..3ef99fcd6e 100644 --- a/sound/midiparser.h +++ b/sound/midiparser.h @@ -302,6 +302,11 @@ protected: void hangingNote(byte channel, byte note, uint32 ticks_left, bool recycle = true); void hangAllActiveNotes(); + virtual void sendToDriver(uint32 b); + void sendToDriver(byte status, byte firstOp, byte secondOp) { + sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); + } + /** * Platform independent BE uint32 read-and-advance. * This helper function reads Big Endian 32-bit numbers @@ -374,11 +379,6 @@ public: void setTempo(uint32 tempo); void onTimer(); - virtual void sendToDriver(uint32 b); - void sendToDriver(byte status, byte firstOp, byte secondOp) { - sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); - } - bool isPlaying() const { return (_position._play_pos != 0); } void stopPlaying(); -- cgit v1.2.3 From d869d1370e01839bb6213c61e82bf2aca793b4d2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 18 Jun 2010 02:25:33 +0000 Subject: Properly provide stub implementations for all TranslationManager methods when USE_TRANSLATIONS is not defined. svn-id: r49997 --- common/translation.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/common/translation.cpp b/common/translation.cpp index 925da26407..1d8295f5a2 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -236,14 +236,30 @@ TranslationManager::~TranslationManager() {} void TranslationManager::setLanguage(const char *lang) {} +const char *TranslationManager::getLangById(int id) { + return ""; +} + +int TranslationManager::parseLanguage(const String lang) { + return kTranslationBuiltinId; +} + const char *TranslationManager::getTranslation(const char *message) { return message; } +String TranslationManager::getTranslation(const String &message) { + return message; +} + const char *TranslationManager::convertTerm(const char *message) { return message; } +const TLangArray TranslationManager::getSupportedLanguages() const { + return TLangArray(); +} + #endif // USE_TRANSLATION } // End of namespace Common -- cgit v1.2.3 From 492f748a4baaf72a5ca41a4b487966b3110ea580 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 18 Jun 2010 02:28:58 +0000 Subject: Add a comment on the unknown switch command argument. svn-id: r49999 --- engines/mohawk/riven_scripts.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index d574a455c6..a23fd26b96 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -61,7 +61,7 @@ uint32 RivenScript::calculateCommandSize(Common::SeekableReadStream* script) { uint16 command = script->readUint16BE(); uint32 commandSize = 2; if (command == 8) { - if (script->readUint16BE() != 2) + if (script->readUint16BE() != 2) // Arg count? warning ("if-then-else unknown value is not 2"); script->readUint16BE(); // variable to check against uint16 logicBlockCount = script->readUint16BE(); // number of logic blocks -- cgit v1.2.3 From 8bd71a6ab2ba9dcce676ee7935540ca651c0f5e6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 18 Jun 2010 02:29:04 +0000 Subject: Cleanup; add a TODO. svn-id: r50000 --- engines/mohawk/riven.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index f1536b3204..fa7ffd7c45 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -50,15 +50,13 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _ignoreNextMouseUp = false; _extrasFile = NULL; - // Attempt to let game run from the CDs - // NOTE: assets2 contains higher quality audio than assets1 - const Common::FSNode gameDataDir(ConfMan.get("path")); + // TODO: Add support for CD swapping + const Common::FSNode gameDataDir(ConfMan.get("path")); SearchMan.addSubDirectoryMatching(gameDataDir, "all"); SearchMan.addSubDirectoryMatching(gameDataDir, "data"); SearchMan.addSubDirectoryMatching(gameDataDir, "exe"); SearchMan.addSubDirectoryMatching(gameDataDir, "assets1"); - SearchMan.addSubDirectoryMatching(gameDataDir, "assets2"); g_atrusJournalRectSolo = new Common::Rect(295, 402, 313, 426); g_atrusJournalRect = new Common::Rect(222, 402, 240, 426); -- cgit v1.2.3 From 98944b81719ba0c173e8c603a22e229994318447 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:29:20 +0000 Subject: Added information regarding a FIXME svn-id: r50002 --- engines/sci/sound/midiparser_sci.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index b2ccbd5c81..b6f4a6802b 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -463,6 +463,8 @@ byte *MidiParser_SCI::midiMixChannels() { } while (par1 != 0xF7); break; case kEndOfTrack: // end of channel + // FIXME: Why does this need to be fixed? There's no + // additional information available channel->time = -1; // FIXME break; default: // MIDI command -- cgit v1.2.3 From 4d3d63223b2f3297ab1c977dc3bbf198c08ecbec Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 18 Jun 2010 02:29:21 +0000 Subject: Cleanup. svn-id: r50003 --- po/module.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/module.mk b/po/module.mk index adea399adb..c9b0e6c1f4 100644 --- a/po/module.mk +++ b/po/module.mk @@ -35,7 +35,7 @@ updatepot: $(srcdir)/common/messages.cpp: $(POFILES) perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp -update-translations: updatepot $(POFILES) $(srcdir)/common/messages.cpp +update-translations: updatepot $(srcdir)/common/messages.cpp @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) @rm -f messages.mo -- cgit v1.2.3 From cccfed3ba352edc81ccc06f51bbd2f8f18b892ea Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 02:30:19 +0000 Subject: Cleanup svn-id: r50004 --- engines/saga/console.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/saga/console.cpp b/engines/saga/console.cpp index 2c201ac57d..228febfe9c 100644 --- a/engines/saga/console.cpp +++ b/engines/saga/console.cpp @@ -40,9 +40,6 @@ Console::Console(SagaEngine *vm) : GUI::Debugger() { DCmd_Register("continue", WRAP_METHOD(Console, Cmd_Exit)); - // CVAR_Register_I(&_soundEnabled, "sound", NULL, CVAR_CFG, 0, 1); - // CVAR_Register_I(&_musicEnabled, "music", NULL, CVAR_CFG, 0, 1); - // Actor commands DCmd_Register("actor_walk_to", WRAP_METHOD(Console, cmdActorWalkTo)); -- cgit v1.2.3 From 8f655615d774d7172e606ad2b99e02afe3ad5010 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 05:40:12 +0000 Subject: SCI: reverting #49978, it worked correctly. the new values contain the full height/width of the picture (may be much larger cause of scrollable areas) and we actually don't want that. the values before and now contain the height/width of the on-screen picture size - although this may contain 0, 0 for low-res games, but that's fine then svn-id: r50006 --- engines/sci/resource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index b71c6b9317..e59f69513c 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1909,8 +1909,8 @@ bool ResourceManager::detectHires() { if (res) { if (READ_LE_UINT16(res->data) == 0x0e) { // SCI32 picture - uint16 width = READ_LE_UINT16(res->data + 14); - uint16 height = READ_LE_UINT16(res->data + 16); + uint16 width = READ_LE_UINT16(res->data + 10); + uint16 height = READ_LE_UINT16(res->data + 12); if ((width == 320) && ((height == 190) || (height == 200))) return false; if ((width >= 600) || (height >= 400)) -- cgit v1.2.3 From 08ff57cc9705bcbce30439a489988bcc059ce22b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 05:55:27 +0000 Subject: SCI: partially revert r49983 - all of those are not implemented in sierra sci or not even pseudo-valid in there. all of those seem to be script bugs svn-id: r50007 --- engines/sci/graphics/paint16.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index ebb6cebb44..a52fd304e2 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -513,23 +513,8 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_DONTSHOWBITS: bRedraw = 0; break; - case 4: // Longbow demo - warning("Unknown kDisplay argument %X", displayArg); - break; - case 7: // Longbow demo - warning("Unknown kDisplay argument %X", displayArg); - break; - case 9: // Longbow demo - warning("Unknown kDisplay argument %X", displayArg); - break; - case 114: // Longbow demo - warning("Unknown kDisplay argument %X", displayArg); - break; - case 115: // Longbow demo - warning("Unknown kDisplay argument %X", displayArg); - break; default: - error("Unknown kDisplay argument %X", displayArg); + warning("Unknown kDisplay argument %X", displayArg); break; } } -- cgit v1.2.3 From 8493edf0827f8c931b68ce35fe71718e3a3c176a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 06:47:16 +0000 Subject: SCI: changing error to warning inside detectHires() for gk1 to work again... svn-id: r50008 --- engines/sci/resource.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index e59f69513c..1639b954b9 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1919,7 +1919,8 @@ bool ResourceManager::detectHires() { } } - error("resMan: Couldn't detect hires"); + // This is fine for (some?) low-res sci32 games, because in those games the picture size is specified as 0, 0 + warning("resMan: Couldn't detect hires"); return false; #else error("no sci32 support"); -- cgit v1.2.3 From bb528d894cff2a6e249d6b7fe469fc86f048a894 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 09:37:06 +0000 Subject: SCI: Rewrap some overlong comments svn-id: r50012 --- engines/sci/engine/kernel.cpp | 5 +-- engines/sci/engine/kernel32.cpp | 36 ++++++++++-------- engines/sci/engine/kfile.cpp | 80 +++++++++++++++++++++++----------------- engines/sci/engine/kgraphics.cpp | 28 +++++++------- engines/sci/engine/kmenu.cpp | 2 +- engines/sci/engine/kmisc.cpp | 35 ++++++++++-------- engines/sci/engine/kmovement.cpp | 75 ++++++++++++++++++------------------- engines/sci/engine/kscripts.cpp | 4 +- engines/sci/engine/ksound.cpp | 9 +++-- engines/sci/engine/kstring.cpp | 25 ++++++++----- 10 files changed, 165 insertions(+), 134 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 71bedd5ad9..c9b547e6f8 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -436,9 +436,8 @@ uint Kernel::getKernelNamesSize() const { } const Common::String &Kernel::getKernelName(uint number) const { - // FIXME: The following check is a temporary workaround for - // an issue leading to crashes when using the debugger's backtrace - // command. + // FIXME: The following check is a temporary workaround for an issue + // leading to crashes when using the debugger's backtrace command. if (number >= _kernelNames.size()) return _invalid; return _kernelNames[number]; diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index fb90cfb147..b317719252 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -378,12 +378,14 @@ void Kernel::setKernelNamesSci2() { } void Kernel::setKernelNamesSci21(GameFeatures *features) { - // Some SCI games use a modified SCI2 kernel table instead of the SCI2.1/SCI3 kernel table. - // The GK2 demo does this as well as at least one version of KQ7. We detect which version - // to use based on where kDoSound is called from Sound::play(). + // Some SCI games use a modified SCI2 kernel table instead of the + // SCI2.1/SCI3 kernel table. The GK2 demo does this as well as at + // least one version of KQ7. We detect which version to use based on + // where kDoSound is called from Sound::play(). - // This is interesting because they all have the same interpreter version (2.100.002), yet - // they would not be compatible with other games of the same interpreter. + // This is interesting because they all have the same interpreter + // version (2.100.002), yet they would not be compatible with other + // games of the same interpreter. if (features->detectSci21KernelType() == SCI_VERSION_2) { _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); @@ -399,7 +401,8 @@ void Kernel::setKernelNamesSci21(GameFeatures *features) { // SCI2 Kernel Functions reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) { - // Returns 0 if the screen width or height is less than 640 or 400, respectively. + // Returns 0 if the screen width or height is less than 640 or 400, + // respectively. if (g_system->getWidth() < 640 || g_system->getHeight() < 400) return make_reg(0, 0); @@ -606,8 +609,9 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { if (string1->getSize() < index1 + count) string1->setSize(index1 + count); - // Note: We're accessing from c_str() here because the string's size ignores - // the trailing 0 and therefore triggers an assert when doing string2[i + index2]. + // Note: We're accessing from c_str() here because the + // string's size ignores the trailing 0 and therefore + // triggers an assert when doing string2[i + index2]. for (uint16 i = 0; i < count; i++) string1->setValue(i + index1, string2[i + index2]); } @@ -793,8 +797,9 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - // If top and left are negative, we need to adjust coordinates by the item's x and y - // (e.g. happens in GK1, day 1, with detective Mosely's hotspot in his office) + // If top and left are negative, we need to adjust coordinates by + // the item's x and y (e.g. happens in GK1, day 1, with detective + // Mosely's hotspot in his office) if (nsRect.left < 0) nsRect.translate(itemX, 0); @@ -802,8 +807,8 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { if (nsRect.top < 0) nsRect.translate(0, itemY); - // HACK: nsLeft and nsTop can be invalid, so try and fix them here using x and y - // (e.g. with the inventory screen in GK1) + // HACK: nsLeft and nsTop can be invalid, so try and fix them here + // using x and y (e.g. with the inventory screen in GK1) if (nsRect.left == itemY && nsRect.top == itemX) { // Swap the values, as they're inversed (eh???) nsRect.left = itemX; @@ -821,8 +826,8 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { } reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { - // Tests if the cursor is on the passed object, after adjusting the coordinates - // of the object according to the object's plane + // Tests if the cursor is on the passed object, after adjusting the + // coordinates of the object according to the object's plane uint16 x = argv[0].toUint16(); uint16 y = argv[1].toUint16(); @@ -848,7 +853,8 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; - // Adjust the bounding rectangle of the object by the object's actual X, Y coordinates + // Adjust the bounding rectangle of the object by the object's + // actual X, Y coordinates itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY); itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX); itemY += planeTop; diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 1c0ff31ec1..f371e8a799 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -115,15 +115,17 @@ void file_open(EngineState *s, const char *filename, int mode) { if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { // Try to open file, abort if not possible inFile = saveFileMan->openForLoading(wrappedName); - // If no matching savestate exists: fall back to reading from a regular file + // If no matching savestate exists: fall back to reading from a regular + // file if (!inFile) inFile = SearchMan.createReadStreamForMember(englishName); - // Special case for LSL3: It tries to create a new dummy file, LARRY3.DRV - // Apparently, if the file doesn't exist here, it should be created. The game - // scripts then go ahead and fill its contents with data. It seems to be a similar - // case as the dummy MEMORY.DRV file in LSL5, but LSL5 creates the file if it can't - // find it with a separate call to file_open() + // Special case for LSL3: It tries to create a new dummy file, + // LARRY3.DRV. Apparently, if the file doesn't exist here, it should be + // created. The game scripts then go ahead and fill its contents with + // data. It seems to be a similar case as the dummy MEMORY.DRV file in + // LSL5, but LSL5 creates the file if it can't find it with a separate + // call to file_open(). if (!inFile && englishName == "LARRY3.DRV") { outFile = saveFileMan->openForSaving(wrappedName); outFile->finalize(); @@ -144,10 +146,11 @@ void file_open(EngineState *s, const char *filename, int mode) { outFile = saveFileMan->openForSaving(wrappedName); if (!outFile) warning("file_open(_K_FILE_MODE_CREATE) failed to create file '%s'", englishName.c_str()); - // QfG1 opens the character export file with _K_FILE_MODE_CREATE first, closes it immediately and opens it again - // with this here - // Perhaps other games use this for read access as well - // I guess changing this whole code into using virtual files and writing them after close would be more appropriate + // QfG1 opens the character export file with _K_FILE_MODE_CREATE first, + // closes it immediately and opens it again with this here. Perhaps + // other games use this for read access as well. I guess changing this + // whole code into using virtual files and writing them after close + // would be more appropriate. } else { error("file_open: unsupported mode %d (filename '%s')", mode, englishName.c_str()); } @@ -163,7 +166,8 @@ void file_open(EngineState *s, const char *filename, int mode) { while ((handle < s->_fileHandles.size()) && s->_fileHandles[handle].isOpen()) handle++; - if (handle == s->_fileHandles.size()) { // Hit size limit => Allocate more space + if (handle == s->_fileHandles.size()) { + // Hit size limit => Allocate more space s->_fileHandles.resize(s->_fileHandles.size() + 1); } @@ -274,7 +278,8 @@ void listSavegames(Common::Array &saves) { SavegameDesc desc; desc.id = strtol(filename.end() - 3, NULL, 10); desc.date = meta.savegame_date; - // We need to fix date in here, because we save DDMMYYYY instead of YYYYMMDD, so sorting wouldnt work + // We need to fix date in here, because we save DDMMYYYY instead of + // YYYYMMDD, so sorting wouldn't work desc.date = ((desc.date & 0xFFFF) << 16) | ((desc.date & 0xFF0000) >> 8) | ((desc.date & 0xFF000000) >> 24); desc.time = meta.savegame_time; desc.version = meta.savegame_version; @@ -429,9 +434,9 @@ reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) { Common::String path = s->_segMan->getString(argv[0]); debug(3, "kCheckFreeSpace(%s)", path.c_str()); - // We simply always pretend that there is enough space. - // The alternative would be to write a big test file, which is not nice - // on systems where doing so is very slow. + // We simply always pretend that there is enough space. The alternative + // would be to write a big test file, which is not nice on systems where + // doing so is very slow. return make_reg(0, 1); } @@ -641,7 +646,8 @@ reg_t DirSeeker::firstFile(const Common::String &mask, reg_t buffer, SegManager Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); _savefiles = saveFileMan->listSavefiles(wrappedMask); - // Reset the list iterator and write the first match to the output buffer, if any. + // Reset the list iterator and write the first match to the output buffer, + // if any. _iter = _savefiles.begin(); return nextFile(segMan); } @@ -671,7 +677,8 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { case K_FILEIO_OPEN : { Common::String name = s->_segMan->getString(argv[1]); - // SCI32 can call K_FILEIO_OPEN with only two arguments. It seems to just be checking if it exists. + // SCI32 can call K_FILEIO_OPEN with only two arguments. It seems to + // just be checking if it exists. int mode = (argc < 3) ? (int)_K_FILE_MODE_OPEN_OR_FAIL : argv[2].toUint16(); // SQ4 floppy prepends /\ to the filenames @@ -680,10 +687,10 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { name.deleteChar(0); } - // SQ4 floppy attempts to update the savegame index file sq4sg.dir - // when deleting saved games. We don't use an index file for saving - // or loading, so just stop the game from modifying the file here - // in order to avoid having it saved in the ScummVM save directory + // SQ4 floppy attempts to update the savegame index file sq4sg.dir when + // deleting saved games. We don't use an index file for saving or + // loading, so just stop the game from modifying the file here in order + // to avoid having it saved in the ScummVM save directory. if (name == "sq4sg.dir") { debugC(2, kDebugLevelFile, "Not opening unused file sq4sg.dir"); return SIGNAL_REG; @@ -744,11 +751,13 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { name.deleteChar(0); } - // Special case for SQ4 floppy: This game has hardcoded names for all of its - // savegames, and they are all named "sq4sg.xxx", where xxx is the slot. We just - // take the slot number here, and delete the appropriate save game + // Special case for SQ4 floppy: This game has hardcoded names for all of + // its savegames, and they are all named "sq4sg.xxx", where xxx is the + // slot. We just take the slot number here, and delete the appropriate + // save game. if (name.hasPrefix("sq4sg.")) { - // Special handling for SQ4... get the slot number and construct the save game name + // Special handling for SQ4... get the slot number and construct the + // save game name. int slotNum = atoi(name.c_str() + name.size() - 3); Common::Array saves; listSavegames(saves); @@ -848,14 +857,17 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { delete inFile; } - // Special case for non-English versions of LSL5: The English version of LSL5 calls - // kFileIO(), case K_FILEIO_OPEN for reading to check if memory.drv exists (which is - // where the game's password is stored). If it's not found, it calls kFileIO() again, - // case K_FILEIO_OPEN for writing and creates a new file. Non-English versions call - // kFileIO(), case K_FILEIO_FILE_EXISTS instead, and fail if memory.drv can't be found. - // We create a default memory.drv file with no password, so that the game can continue + // Special case for non-English versions of LSL5: The English version of + // LSL5 calls kFileIO(), case K_FILEIO_OPEN for reading to check if + // memory.drv exists (which is where the game's password is stored). If + // it's not found, it calls kFileIO() again, case K_FILEIO_OPEN for + // writing and creates a new file. Non-English versions call kFileIO(), + // case K_FILEIO_FILE_EXISTS instead, and fail if memory.drv can't be + // found. We create a default memory.drv file with no password, so that + // the game can continue. if (!exists && name == "memory.drv") { - // Create a new file, and write the bytes for the empty password string inside + // Create a new file, and write the bytes for the empty password + // string inside byte defaultContent[] = { 0xE9, 0xE9, 0xEB, 0xE1, 0x0D, 0x0A, 0x31, 0x30, 0x30, 0x30 }; Common::WriteStream *outFile = saveFileMan->openForSaving(wrappedName); for (int i = 0; i < 10; i++) @@ -872,8 +884,8 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { Common::String oldName = s->_segMan->getString(argv[1]); Common::String newName = s->_segMan->getString(argv[2]); - // SCI1.1 returns 0 on success and a DOS error code on fail. SCI32 returns -1 on fail. - // We just return -1 for all versions. + // SCI1.1 returns 0 on success and a DOS error code on fail. SCI32 + // returns -1 on fail. We just return -1 for all versions. if (g_engine->getSaveFileManager()->renameSavefile(oldName, newName)) return NULL_REG; else diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 2ee30f1771..4614ee878a 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1325,11 +1325,12 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // bit 7 unknown // bit 8 stretch - // gammaBoost boosts palette colors in the range gammaFirst to gammaLast, but - // only if bit 4 in flags is set. Percent value such that 0% = no amplification - // These three parameters are optional if bit 4 is clear. - // Also note that the x, y parameters play subtle games if used with subfx 21. - // The subtleness has to do with creation of temporary planes and positioning relative to such planes. + // gammaBoost boosts palette colors in the range gammaFirst to + // gammaLast, but only if bit 4 in flags is set. Percent value such that + // 0% = no amplification These three parameters are optional if bit 4 is + // clear. Also note that the x, y parameters play subtle games if used + // with subfx 21. The subtleness has to do with creation of temporary + // planes and positioning relative to such planes. int flags = argv[3].offset; Common::String flagspec; @@ -1392,20 +1393,21 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { #endif reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { - // This call is used for KQ6's intro. It has one parameter, which is - // 1 when the intro begins, and 0 when it ends. It is suspected that - // this is actually a flag to enable video planar memory access, as - // the video decoder in KQ6 is specifically written for the planar - // memory model. Planar memory mode access was used for VGA "Mode X" - // (320x240 resolution, although the intro in KQ6 is 320x200). + // This call is used for KQ6's intro. It has one parameter, which is 1 when + // the intro begins, and 0 when it ends. It is suspected that this is + // actually a flag to enable video planar memory access, as the video + // decoder in KQ6 is specifically written for the planar memory model. + // Planar memory mode access was used for VGA "Mode X" (320x240 resolution, + // although the intro in KQ6 is 320x200). // Refer to http://en.wikipedia.org/wiki/Mode_X //warning("STUB: SetVideoMode %d", argv[0].toUint16()); return s->r_acc; } -// New calls for SCI11. Using those is only needed when using text-codes so that one is able to change -// font and/or color multiple times during kDisplay and kDrawControl +// New calls for SCI11. Using those is only needed when using text-codes so that +// one is able to change font and/or color multiple times during kDisplay and +// kDrawControl reg_t kTextFonts(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxText16->kernelTextFonts(argc, argv); return s->r_acc; diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp index 13937c2f61..54543d783f 100644 --- a/engines/sci/engine/kmenu.cpp +++ b/engines/sci/engine/kmenu.cpp @@ -73,7 +73,7 @@ reg_t kDrawStatus(EngineState *s, int argc, reg_t *argv) { int16 colorBack = (argc > 2) ? argv[2].toSint16() : g_sci->getResMan()->isVGA() ? 255 : 15; if (!textReference.isNull()) { - // Sometimes this is called without giving text, if thats the case dont process it + // Sometimes this is called without giving text, if thats the case dont process it. text = s->_segMan->getString(textReference); g_sci->_gfxMenu->kernelDrawStatus(g_sci->strSplit(text.c_str(), NULL).c_str(), colorPen, colorBack); diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 525f9f5bf4..64da511ca8 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -55,20 +55,22 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { uint32 neededSleep = 30; - // WORKAROUND: - // LSL3 calculates a machinespeed variable during game startup (right after the filthy questions) - // This one would go through w/o throttling resulting in having to do 1000 pushups or something - // Another way of handling this would be delaying incrementing of "machineSpeed" selector + // WORKAROUND: LSL3 calculates a machinespeed variable during game startup + // (right after the filthy questions). This one would go through w/o + // throttling resulting in having to do 1000 pushups or something. Another + // way of handling this would be delaying incrementing of "machineSpeed" + // selector. if (g_sci->getGameId() == "lsl3" && s->currentRoomNumber() == 290) s->_throttleTrigger = true; - if (g_sci->getGameId() == "iceman" && s->currentRoomNumber() == 27) { + else if (g_sci->getGameId() == "iceman" && s->currentRoomNumber() == 27) { s->_throttleTrigger = true; neededSleep = 60; } if (s->_throttleTrigger) { - // Some games seem to get the duration of main loop initially and then switch of animations for the whole game - // based on that (qfg2, iceman). We are now running full speed initially to avoid that. + // Some games seem to get the duration of main loop initially and then + // switch of animations for the whole game based on that (qfg2, iceman). + // We are now running full speed initially to avoid that. // It seems like we dont need to do that anymore //if (s->_throttleCounter < 50) { // s->_throttleCounter++; @@ -332,11 +334,12 @@ reg_t kPlatform(EngineState *s, int argc, reg_t *argv) { bool isWindows = g_sci->getPlatform() == Common::kPlatformWindows; if (argc == 0 && getSciVersion() < SCI_VERSION_2) { - // This is called in KQ5CD with no parameters, where it seems to do some graphics - // driver check. This kernel function didn't have subfunctions then. If 0 is - // returned, the game functions normally, otherwise all the animations show up - // like a slideshow (e.g. in the intro). So we return 0. However, the behavior - // changed for kPlatform with no parameters in SCI32. + // This is called in KQ5CD with no parameters, where it seems to do some + // graphics driver check. This kernel function didn't have subfunctions + // then. If 0 is returned, the game functions normally, otherwise all + // the animations show up like a slideshow (e.g. in the intro). So we + // return 0. However, the behavior changed for kPlatform with no + // parameters in SCI32. return NULL_REG; } @@ -375,10 +378,10 @@ reg_t kPlatform(EngineState *s, int argc, reg_t *argv) { } reg_t kEmpty(EngineState *s, int argc, reg_t *argv) { - // Placeholder for empty kernel functions which are still called from the engine - // scripts (like the empty kSetSynonyms function in SCI1.1). This differs from - // dummy functions because it does nothing and never throws a warning when it's - // called + // Placeholder for empty kernel functions which are still called from the + // engine scripts (like the empty kSetSynonyms function in SCI1.1). This + // differs from dummy functions because it does nothing and never throws a + // warning when it is called. return s->r_acc; } diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index b247275e8c..ccef3d862a 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -33,42 +33,43 @@ namespace Sci { -/* -Compute "velocity" vector (xStep,yStep)=(vx,vy) for a jump from (0,0) to (dx,dy), with gravity gy. -The gravity is assumed to be non-negative. - -If this was ordinary continuous physics, we would compute the desired (floating point!) -velocity vector (vx,vy) as follows, under the assumption that vx and vy are linearly correlated -by some constant factor c, i.e. vy = c * vx: - dx = t * vx - dy = t * vy + gy * t^2 / 2 -=> dy = c * dx + gy * (dx/vx)^2 / 2 -=> |vx| = sqrt( gy * dx^2 / (2 * (dy - c * dx)) ) -Here, the sign of vx must be chosen equal to the sign of dx, obviously. - -Clearly, this square root only makes sense in our context if the denominator is positive, -or equivalently, (dy - c * dx) must be positive. For simplicity and by symmetry -along the x-axis, we assume dx to be positive for all computations, and only adjust for -its sign in the end. Switching the sign of c appropriately, we set tmp := (dy + c * dx) -and compute c so that this term becomes positive. - -Remark #1: If the jump is straight up, i.e. dx == 0, then we should not assume the above -linear correlation vy = c * vx of the velocities (as vx will be 0, but vy shouldn't be, -unless we drop). - - -Remark #2: We are actually in a discrete setup. The motion is computed iteratively: each iteration, -we add vx and vy to the position, then add gy to vy. So the real formula is the following -(where t is ideally close to an int): - - dx = t * vx - dy = t * vy + gy * t*(t-1) / 2 - -But the solution resulting from that is a lot more complicated, so we use the above approximation instead. - -Still, what we compute in the end is of course not a real velocity anymore, but an integer approximation, -used in an iterative stepping algorithm -*/ +/** + * Compute "velocity" vector (xStep,yStep)=(vx,vy) for a jump from (0,0) to + * (dx,dy), with gravity constant gy. The gravity is assumed to be non-negative. + * + * If this was ordinary continuous physics, we would compute the desired + * (floating point!) velocity vector (vx,vy) as follows, under the assumption + * that vx and vy are linearly correlated by a constant c, i.e., vy = c * vx: + * dx = t * vx + * dy = t * vy + gy * t^2 / 2 + * => dy = c * dx + gy * (dx/vx)^2 / 2 + * => |vx| = sqrt( gy * dx^2 / (2 * (dy - c * dx)) ) + * Here, the sign of vx must be chosen equal to the sign of dx, obviously. + * + * This square root only makes sense in our context if the denominator is + * positive, or equivalently, (dy - c * dx) must be positive. For simplicity + * and by symmetry along the x-axis, we assume dx to be positive for all + * computations, and only adjust for its sign in the end. Switching the sign of + * c appropriately, we set tmp := (dy + c * dx) and compute c so that this term + * becomes positive. + * + * Remark #1: If the jump is straight up, i.e. dx == 0, then we should not + * assume the above linear correlation vy = c * vx of the velocities (as vx + * will be 0, but vy shouldn't be, unless we drop down). + * + * Remark #2: We are actually in a discrete setup. The motion is computed + * iteratively: each iteration, we add vx and vy to the position, then add gy + * to vy. So the real formula is the following (where t ideally is close to an int): + * + * dx = t * vx + * dy = t * vy + gy * t*(t-1) / 2 + * + * But the solution resulting from that is a lot more complicated, so we use + * the above approximation instead. + * + * Still, what we compute in the end is of course not a real velocity anymore, + * but an integer approximation, used in an iterative stepping algorithm. + */ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { SegManager *segMan = s->_segMan; // Input data @@ -115,7 +116,7 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) { //tmp = dx * 3 / 2; // ALMOST the resulting value, except for obvious rounding issues // FIXME: Where is the 3 coming from? Maybe they hard/coded, by "accident", that usually gy=3 ? - // Then this choice of will make t equal to roughly sqrt(dx) + // Then this choice of scalar will make t equal to roughly sqrt(dx) } } // POST: c >= 1 diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 5f552080e3..de8710bd83 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -234,8 +234,8 @@ reg_t kDisposeScript(EngineState *s, int argc, reg_t *argv) { if (argc != 2) { return s->r_acc; } else { - // This exists in the KQ5CD and GK1 interpreter. We know it is used when GK1 starts - // up, before the Sierra logo. + // This exists in the KQ5CD and GK1 interpreter. We know it is used + // when GK1 starts up, before the Sierra logo. warning("kDisposeScript called with 2 parameters, still untested"); return argv[1]; } diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index daff676a28..0d08cc2e06 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -110,8 +110,10 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { number = argv[1].toUint16(); } else if (argc == 6 || argc == 8) { module = argv[1].toUint16(); - number = ((argv[2].toUint16() & 0xff) << 24) | ((argv[3].toUint16() & 0xff) << 16) | - ((argv[4].toUint16() & 0xff) << 8) | (argv[5].toUint16() & 0xff); + number = ((argv[2].toUint16() & 0xff) << 24) | + ((argv[3].toUint16() & 0xff) << 16) | + ((argv[4].toUint16() & 0xff) << 8) | + (argv[5].toUint16() & 0xff); if (argc == 8) warning("kDoAudio: Play called with SQ6 extra parameters"); } else { @@ -180,7 +182,8 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); break; case 12: - // Seems to be audio sync, used in Pharkas, silenced warning cause of the spam it produces + // Seems to be audio sync, used in Pharkas. Silenced the warning due to + // the high level of spam it produces. //warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); break; case 13: diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 2681b612e9..5dd3910e3e 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -141,19 +141,22 @@ reg_t kReadNumber(EngineState *s, int argc, reg_t *argv) { int16 result = 0; if (*source == '$') { - // hexadecimal input + // Hexadecimal input result = (int16)strtol(source + 1, NULL, 16); } else { - // decimal input, we can not use strtol/atoi in here, because sierra used atoi BUT it was a non standard compliant - // atoi, that didnt do clipping. In SQ4 we get the door code in here and that's even larger than uint32! + // Decimal input. We can not use strtol/atoi in here, because while + // Sierra used atoi, it was a non standard compliant atoi, that didn't + // do clipping. In SQ4 we get the door code in here and that's even + // larger than uint32! if (*source == '-') { result = -1; source++; } while (*source) { if ((*source < '0') || (*source > '9')) { - // Sierras atoi stopped processing at anything different than number - // Sometimes the input has a trailing space, that's fine (example: lsl3) + // Sierra's atoi stopped processing at anything which is not + // a digit. Sometimes the input has a trailing space, that's + // fine (example: lsl3) if (*source != ' ') { // TODO: this happens in lsl5 right in the intro -> we get '1' '3' 0xCD 0xCD 0xCD 0xCD 0xCD // find out why this happens and fix it @@ -423,15 +426,16 @@ reg_t kGetFarText(EngineState *s, int argc, reg_t *argv) { seeker = (char *)textres->data; - // The second parameter (counter) determines the number of the string inside the text - // resource. + // The second parameter (counter) determines the number of the string + // inside the text resource. while (counter--) { while (*seeker++) ; } - // If the third argument is NULL, allocate memory for the destination. This occurs in - // SCI1 Mac games. The memory will later be freed by the game's scripts. + // If the third argument is NULL, allocate memory for the destination. This + // occurs in SCI1 Mac games. The memory will later be freed by the game's + // scripts. if (argv[2] == NULL_REG) s->_segMan->allocDynmem(strlen(seeker) + 1, "Mac FarText", &argv[2]); @@ -578,7 +582,8 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv) { // Make sure target buffer is large enough SegmentRef buf_r = s->_segMan->dereference(argv[0]); if (!buf_r.isValid() || buf_r.maxSize < (int)str.size() + 1) { - warning("StrSplit: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(argv[0]), str.size() + 1, str.c_str()); + warning("StrSplit: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", + PRINT_REG(argv[0]), str.size() + 1, str.c_str()); return NULL_REG; } s->_segMan->strcpy(argv[0], str.c_str()); -- cgit v1.2.3 From 5a95c2a652e5043673dff16383f3114247059d46 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 09:37:25 +0000 Subject: SCI: Doxygenify some comments svn-id: r50013 --- engines/sci/engine/kpathing.cpp | 238 +++++++++++++++++++++++----------------- 1 file changed, 140 insertions(+), 98 deletions(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 09cec29a79..8988aa5734 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -436,33 +436,41 @@ static void print_input(EngineState *s, reg_t poly_list, Common::Point start, Co } } +/** + * Computes the area of a triangle + * Parameters: (const Common::Point &) a, b, c: The points of the triangle + * Returns : (int) The area multiplied by two + */ static int area(const Common::Point &a, const Common::Point &b, const Common::Point &c) { - // Computes the area of a triangle - // Parameters: (const Common::Point &) a, b, c: The points of the triangle - // Returns : (int) The area multiplied by two return (b.x - a.x) * (a.y - c.y) - (c.x - a.x) * (a.y - b.y); } +/** + * Determines whether or not a point is to the left of a directed line + * Parameters: (const Common::Point &) a, b: The directed line (a, b) + * (const Common::Point &) c: The query point + * Returns : (int) true if c is to the left of (a, b), false otherwise + */ static bool left(const Common::Point &a, const Common::Point &b, const Common::Point &c) { - // Determines whether or not a point is to the left of a directed line - // Parameters: (const Common::Point &) a, b: The directed line (a, b) - // (const Common::Point &) c: The query point - // Returns : (int) true if c is to the left of (a, b), false otherwise return area(a, b, c) > 0; } +/** + * Determines whether or not three points are collinear + * Parameters: (const Common::Point &) a, b, c: The three points + * Returns : (int) true if a, b, and c are collinear, false otherwise + */ static bool collinear(const Common::Point &a, const Common::Point &b, const Common::Point &c) { - // Determines whether or not three points are collinear - // Parameters: (const Common::Point &) a, b, c: The three points - // Returns : (int) true if a, b, and c are collinear, false otherwise return area(a, b, c) == 0; } +/** + * Determines whether or not a point lies on a line segment + * Parameters: (const Common::Point &) a, b: The line segment (a, b) + * (const Common::Point &) c: The query point + * Returns : (int) true if c lies on (a, b), false otherwise + */ static bool between(const Common::Point &a, const Common::Point &b, const Common::Point &c) { - // Determines whether or not a point lies on a line segment - // Parameters: (const Common::Point &) a, b: The line segment (a, b) - // (const Common::Point &) c: The query point - // Returns : (int) true if c lies on (a, b), false otherwise if (!collinear(a, b, c)) return false; @@ -473,25 +481,29 @@ static bool between(const Common::Point &a, const Common::Point &b, const Common return ((a.y <= c.y) && (c.y <= b.y)) || ((a.y >= c.y) && (c.y >= b.y)); } +/** + * Determines whether or not two line segments properly intersect + * Parameters: (const Common::Point &) a, b: The line segment (a, b) + * (const Common::Point &) c, d: The line segment (c, d) + * Returns : (int) true if (a, b) properly intersects (c, d), false otherwise + */ static bool intersect_proper(const Common::Point &a, const Common::Point &b, const Common::Point &c, const Common::Point &d) { - // Determines whether or not two line segments properly intersect - // Parameters: (const Common::Point &) a, b: The line segment (a, b) - // (const Common::Point &) c, d: The line segment (c, d) - // Returns : (int) true if (a, b) properly intersects (c, d), false otherwise int ab = (left(a, b, c) && left(b, a, d)) || (left(a, b, d) && left(b, a, c)); int cd = (left(c, d, a) && left(d, c, b)) || (left(c, d, b) && left(d, c, a)); return ab && cd; } +/** + * Polygon containment test + * Parameters: (const Common::Point &) p: The point + * (Polygon *) polygon: The polygon + * Returns : (int) CONT_INSIDE if p is strictly contained in polygon, + * CONT_ON_EDGE if p lies on an edge of polygon, + * CONT_OUTSIDE otherwise + * Number of ray crossing left and right + */ static int contained(const Common::Point &p, Polygon *polygon) { - // Polygon containment test - // Parameters: (const Common::Point &) p: The point - // (Polygon *) polygon: The polygon - // Returns : (int) CONT_INSIDE if p is strictly contained in polygon, - // CONT_ON_EDGE if p lies on an edge of polygon, - // CONT_OUTSIDE otherwise - // Number of ray crossing left and right int lcross = 0, rcross = 0; Vertex *vertex; @@ -549,10 +561,12 @@ static int contained(const Common::Point &p, Polygon *polygon) { return CONT_OUTSIDE; } +/** + * Computes polygon area + * Parameters: (Polygon *) polygon: The polygon + * Returns : (int) The area multiplied by two + */ static int polygon_area(Polygon *polygon) { - // Computes polygon area - // Parameters: (Polygon *) polygon: The polygon - // Returns : (int) The area multiplied by two Vertex *first = polygon->vertices.first(); Vertex *v; int size = 0; @@ -567,11 +581,13 @@ static int polygon_area(Polygon *polygon) { return size; } +/** + * Fixes the vertex order of a polygon if incorrect. Contained access + * polygons should have their vertices ordered clockwise, all other types + * anti-clockwise + * Parameters: (Polygon *) polygon: The polygon + */ static void fix_vertex_order(Polygon *polygon) { - // Fixes the vertex order of a polygon if incorrect. Contained access - // polygons should have their vertices ordered clockwise, all other types - // anti-clockwise - // Parameters: (Polygon *) polygon: The polygon int area = polygon_area(polygon); // When the polygon area is positive the vertices are ordered @@ -584,13 +600,15 @@ static void fix_vertex_order(Polygon *polygon) { } } +/** + * Determines whether or not a line from a point to a vertex intersects the + * interior of the polygon, locally at that vertex + * Parameters: (Common::Point) p: The point + * (Vertex *) vertex: The vertex + * Returns : (int) 1 if the line (p, vertex->v) intersects the interior of + * the polygon, locally at the vertex. 0 otherwise + */ static int inside(const Common::Point &p, Vertex *vertex) { - // Determines whether or not a line from a point to a vertex intersects the - // interior of the polygon, locally at that vertex - // Parameters: (Common::Point) p: The point - // (Vertex *) vertex: The vertex - // Returns : (int) 1 if the line (p, vertex->v) intersects the interior of - // the polygon, locally at the vertex. 0 otherwise // Check that it's not a single-vertex polygon if (VERTEX_HAS_EDGES(vertex)) { const Common::Point &prev = CLIST_PREV(vertex)->v; @@ -655,28 +673,34 @@ static VertexList *visible_vertices(PathfindingState *s, Vertex *vertex_cur) { return visVerts; } +/** + * Determines if a point lies on the screen border + * Parameters: (const Common::Point &) p: The point + * Returns : (int) true if p lies on the screen border, false otherwise + */ bool PathfindingState::pointOnScreenBorder(const Common::Point &p) { - // Determines if a point lies on the screen border - // Parameters: (const Common::Point &) p: The point - // Returns : (int) true if p lies on the screen border, false otherwise return (p.x == 0) || (p.x == _width - 1) || (p.y == 0) || (p.y == _height - 1); } +/** + * Determines if an edge lies on the screen border + * Parameters: (const Common::Point &) p, q: The edge (p, q) + * Returns : (int) true if (p, q) lies on the screen border, false otherwise + */ bool PathfindingState::edgeOnScreenBorder(const Common::Point &p, const Common::Point &q) { - // Determines if an edge lies on the screen border - // Parameters: (const Common::Point &) p, q: The edge (p, q) - // Returns : (int) true if (p, q) lies on the screen border, false otherwise return ((p.x == 0 && q.x == 0) || (p.y == 0 && q.y == 0) || ((p.x == _width - 1) && (q.x == _width - 1)) || ((p.y == _height - 1) && (q.y == _height - 1))); } +/** + * Searches for a nearby point that is not contained in a polygon + * Parameters: (FloatPoint) f: The pointf to search nearby + * (Polygon *) polygon: The polygon + * Returns : (int) PF_OK on success, PF_FATAL otherwise + * (Common::Point) *ret: The non-contained point on success + */ static int find_free_point(FloatPoint f, Polygon *polygon, Common::Point *ret) { - // Searches for a nearby point that is not contained in a polygon - // Parameters: (FloatPoint) f: The pointf to search nearby - // (Polygon *) polygon: The polygon - // Returns : (int) PF_OK on success, PF_FATAL otherwise - // (Common::Point) *ret: The non-contained point on success Common::Point p; // Try nearest point first @@ -706,12 +730,14 @@ static int find_free_point(FloatPoint f, Polygon *polygon, Common::Point *ret) { return PF_OK; } +/** + * Computes the near point of a point contained in a polygon + * Parameters: (const Common::Point &) p: The point + * (Polygon *) polygon: The polygon + * Returns : (int) PF_OK on success, PF_FATAL otherwise + * (Common::Point) *ret: The near point of p in polygon on success + */ int PathfindingState::findNearPoint(const Common::Point &p, Polygon *polygon, Common::Point *ret) { - // Computes the near point of a point contained in a polygon - // Parameters: (const Common::Point &) p: The point - // (Polygon *) polygon: The polygon - // Returns : (int) PF_OK on success, PF_FATAL otherwise - // (Common::Point) *ret: The near point of p in polygon on success Vertex *vertex; FloatPoint near_p; uint32 dist = HUGE_DISTANCE; @@ -751,13 +777,15 @@ int PathfindingState::findNearPoint(const Common::Point &p, Polygon *polygon, Co return find_free_point(near_p, polygon, ret); } +/** + * Computes the intersection point of a line segment and an edge (not + * including the vertices themselves) + * Parameters: (const Common::Point &) a, b: The line segment (a, b) + * (Vertex *) vertex: The first vertex of the edge + * Returns : (int) FP_OK on success, PF_ERROR otherwise + * (FloatPoint) *ret: The intersection point + */ static int intersection(const Common::Point &a, const Common::Point &b, Vertex *vertex, FloatPoint *ret) { - // Computes the intersection point of a line segment and an edge (not - // including the vertices themselves) - // Parameters: (const Common::Point &) a, b: The line segment (a, b) - // (Vertex *) vertex: The first vertex of the edge - // Returns : (int) FP_OK on success, PF_ERROR otherwise - // (FloatPoint) *ret: The intersection point // Parameters of parametric equations float s, t; // Numerator and denominator of equations @@ -790,16 +818,18 @@ static int intersection(const Common::Point &a, const Common::Point &b, Vertex * return PF_ERROR; } +/** + * Computes the nearest intersection point of a line segment and the polygon + * set. Intersection points that are reached from the inside of a polygon + * are ignored as are improper intersections which do not obstruct + * visibility + * Parameters: (PathfindingState *) s: The pathfinding state + * (const Common::Point &) p, q: The line segment (p, q) + * Returns : (int) PF_OK on success, PF_ERROR when no intersections were + * found, PF_FATAL otherwise + * (Common::Point) *ret: On success, the closest intersection point + */ static int nearest_intersection(PathfindingState *s, const Common::Point &p, const Common::Point &q, Common::Point *ret) { - // Computes the nearest intersection point of a line segment and the polygon - // set. Intersection points that are reached from the inside of a polygon - // are ignored as are improper intersections which do not obstruct - // visibility - // Parameters: (PathfindingState *) s: The pathfinding state - // (const Common::Point &) p, q: The line segment (p, q) - // Returns : (int) PF_OK on success, PF_ERROR when no intersections were - // found, PF_FATAL otherwise - // (Common::Point) *ret: On success, the closest intersection point Polygon *polygon = 0; FloatPoint isec; Polygon *ipolygon = 0; @@ -981,14 +1011,16 @@ static Common::Point *fixup_end_point(PathfindingState *s, const Common::Point & return new_end; } +/** + * Merges a point into the polygon set. A new vertex is allocated for this + * point, unless a matching vertex already exists. If the point is on an + * already existing edge that edge is split up into two edges connected by + * the new vertex + * Parameters: (PathfindingState *) s: The pathfinding state + * (const Common::Point &) v: The point to merge + * Returns : (Vertex *) The vertex corresponding to v + */ static Vertex *merge_point(PathfindingState *s, const Common::Point &v) { - // Merges a point into the polygon set. A new vertex is allocated for this - // point, unless a matching vertex already exists. If the point is on an - // already existing edge that edge is split up into two edges connected by - // the new vertex - // Parameters: (PathfindingState *) s: The pathfinding state - // (const Common::Point &) v: The point to merge - // Returns : (Vertex *) The vertex corresponding to v Vertex *vertex; Vertex *v_new; Polygon *polygon; @@ -1029,11 +1061,13 @@ static Vertex *merge_point(PathfindingState *s, const Common::Point &v) { return v_new; } +/** + * Converts an SCI polygon into a Polygon + * Parameters: (EngineState *) s: The game state + * (reg_t) polygon: The SCI polygon to convert + * Returns : (Polygon *) The converted polygon, or NULL on error + */ static Polygon *convert_polygon(EngineState *s, reg_t polygon) { - // Converts an SCI polygon into a Polygon - // Parameters: (EngineState *) s: The game state - // (reg_t) polygon: The SCI polygon to convert - // Returns : (Polygon *) The converted polygon, or NULL on error SegManager *segMan = s->_segMan; int i; reg_t points = readSelector(segMan, polygon, SELECTOR(points)); @@ -1074,11 +1108,13 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) { return poly; } +/** + * Changes the polygon list for optimization level 0 (used for keyboard + * support). Totally accessible polygons are removed and near-point + * accessible polygons are changed into totally accessible polygons. + * Parameters: (PathfindingState *) s: The pathfinding state + */ static void change_polygons_opt_0(PathfindingState *s) { - // Changes the polygon list for optimization level 0 (used for keyboard - // support). Totally accessible polygons are removed and near-point - // accessible polygons are changed into totally accessible polygons. - // Parameters: (PathfindingState *) s: The pathfinding state PolygonList::iterator it = s->polygons.begin(); while (it != s->polygons.end()) { @@ -1096,15 +1132,17 @@ static void change_polygons_opt_0(PathfindingState *s) { } } +/** + * Converts the SCI input data for pathfinding + * Parameters: (EngineState *) s: The game state + * (reg_t) poly_list: Polygon list + * (Common::Point) start: The start point + * (Common::Point) end: The end point + * (int) opt: Optimization level (0, 1 or 2) + * Returns : (PathfindingState *) On success a newly allocated pathfinding state, + * NULL otherwise + */ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Common::Point start, Common::Point end, int width, int height, int opt) { - // Converts the SCI input data for pathfinding - // Parameters: (EngineState *) s: The game state - // (reg_t) poly_list: Polygon list - // (Common::Point) start: The start point - // (Common::Point) end: The end point - // (int) opt: Optimization level (0, 1 or 2) - // Returns : (PathfindingState *) On success a newly allocated pathfinding state, - // NULL otherwise SegManager *segMan = s->_segMan; Polygon *polygon; int err; @@ -1297,11 +1335,13 @@ static reg_t allocateOutputArray(SegManager *segMan, int size) { return addr; } +/** + * Stores the final path in newly allocated dynmem + * Parameters: (PathfindingState *) p: The pathfinding state + * (EngineState *) s: The game state + * Returns : (reg_t) Pointer to dynmem containing path + */ static reg_t output_path(PathfindingState *p, EngineState *s) { - // Stores the final path in newly allocated dynmem - // Parameters: (PathfindingState *) p: The pathfinding state - // (EngineState *) s: The game state - // Returns : (reg_t) Pointer to dynmem containing path int path_len = 0; reg_t output; Vertex *vertex = p->vertex_end; @@ -1694,8 +1734,10 @@ reg_t kIntersections(EngineState *s, int argc, reg_t *argv) { } } -// This is a quite rare kernel function. An example of when it's called -// is in QFG1VGA, after killing any monster. +/** + * This is a quite rare kernel function. An example of when it's called + * is in QFG1VGA, after killing any monster. + */ reg_t kMergePoly(EngineState *s, int argc, reg_t *argv) { // 3 parameters: raw polygon data, polygon list, list size reg_t polygonData = argv[0]; -- cgit v1.2.3 From 8ade66ba132a9ca929838722aa67857666871c6f Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Fri, 18 Jun 2010 10:49:26 +0000 Subject: SCI: Unbreak diskdump console command, maybe others svn-id: r50014 --- engines/sci/resource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 1639b954b9..6e739a5247 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -114,7 +114,7 @@ static const char *resourceTypeNames[] = { "memory", "vocab", "font", "cursor", "patch", "bitmap", "palette", "cdaudio", "audio", "sync", "message", "map", "heap", - "audio36", "sync36", "", "", "robot" + "audio36", "sync36", "", "", "robot", "vmd" }; static const char *resourceTypeSuffixes[] = { @@ -122,7 +122,7 @@ static const char *resourceTypeSuffixes[] = { " ", "voc", "fon", "cur", "pat", "bit", "pal", "cda", "aud", "syn", "msg", "map", "hep", "aud", "syn", - "trn", " ", "rbt" + "trn", " ", "rbt", "vmd" }; const char *getResourceTypeName(ResourceType restype) { -- cgit v1.2.3 From 543610d4d4a7458ac99e0126e03e96ab581adf68 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 12:15:33 +0000 Subject: Don't throw a warning when we can't find hires content svn-id: r50015 --- engines/sci/resource.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 6e739a5247..075d104f3e 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1911,16 +1911,18 @@ bool ResourceManager::detectHires() { // SCI32 picture uint16 width = READ_LE_UINT16(res->data + 10); uint16 height = READ_LE_UINT16(res->data + 12); + // Surely lowres (e.g. QFG4CD) if ((width == 320) && ((height == 190) || (height == 200))) return false; + // Surely hires if ((width >= 600) || (height >= 400)) return true; } } } - // This is fine for (some?) low-res sci32 games, because in those games the picture size is specified as 0, 0 - warning("resMan: Couldn't detect hires"); + // We haven't been able to find hires content + return false; #else error("no sci32 support"); -- cgit v1.2.3 From 919c348c5a739ed4cd85f7c38cb7cf10f86f3737 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 13:02:48 +0000 Subject: SCI: pseudo-implemented 0x72 and 0x73 for kDisplay used by longbow-demo, although sierra sci doesn't support them at all svn-id: r50016 --- engines/sci/graphics/paint16.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index a52fd304e2..f9ee3c3ae3 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -448,6 +448,8 @@ void GfxPaint16::kernelGraphRedrawBox(Common::Rect rect) { #define SCI_DISPLAY_WIDTH 106 #define SCI_DISPLAY_SAVEUNDER 107 #define SCI_DISPLAY_RESTOREUNDER 108 +#define SCI_DISPLAY_DUMMY1 114 // used in longbow-demo, not supported in sierra sci - no parameters +#define SCI_DISPLAY_DUMMY2 115 // used in longbow-demo, not supported in sierra sci - has 1 parameter #define SCI_DISPLAY_DONTSHOWBITS 121 reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { @@ -513,8 +515,22 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_DONTSHOWBITS: bRedraw = 0; break; + + // 2 Dummy functions, longbow-demo is using those several times but sierra sci doesn't support them at all + case SCI_DISPLAY_DUMMY1: + case SCI_DISPLAY_DUMMY2: + if (!((g_sci->getGameId() == "longbow") && (g_sci->isDemo()))) + error("Unknown kDisplay argument %X", displayArg); + if (displayArg == SCI_DISPLAY_DUMMY2) { + if (argc) { + argc--; argv++; + } else { + error("No parameter left for kDisplay(0x73)"); + } + } + break; default: - warning("Unknown kDisplay argument %X", displayArg); + error("Unknown kDisplay argument %X", displayArg); break; } } -- cgit v1.2.3 From 661a170c86ee1fc7db05e16b19455bddeb6f66e8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 13:05:08 +0000 Subject: SCI: change error() inside adlib driver ::setPatch() to warning() again, fixing pq2 svn-id: r50017 --- engines/sci/sound/drivers/adlib.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index 4f93314b64..44e52cf768 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -703,7 +703,8 @@ void MidiDriver_AdLib::setVelocityReg(int regOffset, int velocity, int kbScaleLe void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { - error("ADLIB: Invalid patch %i requested", patch); + // This happens a lot at least in pq2, seems to me as if it's meant for mt32 actually + warning("ADLIB: Invalid patch %i requested", patch); patch = 0; } -- cgit v1.2.3 From 562f8a9463a23e7dfac01d81b6e11c13b4c66600 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 13:36:29 +0000 Subject: SCI: implementing fading for sci1 only for used channels of the object, fixes lsl1 music issues when going right at the start svn-id: r50018 --- engines/sci/sound/midiparser_sci.cpp | 8 ++++---- engines/sci/sound/midiparser_sci.h | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index b6f4a6802b..931919b2b5 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -646,10 +646,10 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: - // sending volume change to all active channels - for (int i = 0; i < _track->channelCount; i++) - if (_track->channels[i].number <= 0xF) - _driver->send(0xB0 + _track->channels[i].number, 7, _volume); + // sending volume change to all used channels + for (int i = 0; i < 15; i++) + if (_channelUsed[i]) + sendToDriver(0xB0 + i, 7, _volume); break; default: diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 89d1e63d8c..abedafdde0 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -77,6 +77,9 @@ public: void tryToOwnChannels(); void sendToDriver(uint32 b); + void sendToDriver(byte status, byte firstOp, byte secondOp) { + sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); + } protected: void parseNextEvent(EventInfo &info); -- cgit v1.2.3 From b152f6d68ff00290b475df35df180e95f84af6d3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 14:36:22 +0000 Subject: Added an explanation about the invalid instruments used when using the Adlib driver in PQ2 svn-id: r50019 --- engines/sci/sound/drivers/adlib.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index 44e52cf768..2e56b023e0 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -703,8 +703,15 @@ void MidiDriver_AdLib::setVelocityReg(int regOffset, int velocity, int kbScaleLe void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { - // This happens a lot at least in pq2, seems to me as if it's meant for mt32 actually - warning("ADLIB: Invalid patch %i requested", patch); + // This happens a lot at least in PQ2. This game has a small patch.003 (1344 bytes), + // containing 48 instruments. However it has several songs which use instruments + // not specified in that patch (namely, songs 1, 3, 5, 9, 15, 16, 17, 23, 25, 27, + // 29, 32, 36, 38, 44, 45, 46 all use instruments not specified in patch.003). + // These were probably written for MT32. These warnings in PQ2 can probably go away + // if a bigger patch.003 file is used (one that contains all the instruments used + // by the songs, i.e. 5382 bytes) + warning("ADLIB: Invalid patch %i requested (patch.003 contains %d instruments)", + patch, _patches.size()); patch = 0; } -- cgit v1.2.3 From 874eeb2370164d0a7f8cd588f817beb64d98575d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 14:48:39 +0000 Subject: Added hints inside validate_arithmetic(), together with some code useful for debugging. Some cleanup svn-id: r50020 --- engines/sci/engine/vm.cpp | 30 +++++++++++++++++++++--------- engines/sci/sound/drivers/adlib.cpp | 2 +- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c3f27b77b3..706d2ceb22 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -128,8 +128,10 @@ static StackPtr validate_stack_addr(EngineState *s, StackPtr sp) { static int validate_arithmetic(reg_t reg) { if (reg.segment) { - // The results of this are likely unpredictable... - error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); + // The results of this are likely unpredictable... It most likely means that a kernel function is returning something wrong. + // If such an error occurs, we usually need to find the last kernel function called and check its return value. Check + // callKernelFunc() below + error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]. Address: %04x:%04x", reg.segment, PRINT_REG(reg)); return 0; } @@ -137,13 +139,7 @@ static int validate_arithmetic(reg_t reg) { } static int signed_validate_arithmetic(reg_t reg) { - if (reg.segment) { - // The results of this are likely unpredictable... - error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]", reg.segment); - return 0; - } - - return (int16)reg.offset; + return (int16)validate_arithmetic(reg); } static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, int index, int line) { @@ -617,6 +613,22 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { } else { // Call kernel function s->r_acc = kernelFunc.func(s, argc, argv); + +#if 0 + // Used for debugging + Common::String debugMsg = kernelFunc.origName + + Common::String::printf("[0x%x]", kernelFuncNum) + + Common::String::printf(", %d params: ", argc) + + " ("; + + for (int i = 0; i < argc; i++) { + debugMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + debugMsg += (i == argc - 1 ? ")" : ", "); + } + + debugMsg += ", result: " + Common::String::printf("%04x:%04x", PRINT_REG(s->r_acc)); + debug("%s", debugMsg.c_str()); +#endif } // Remove callk stack frame again diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index 2e56b023e0..d0ca00fe0f 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -705,7 +705,7 @@ void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { // This happens a lot at least in PQ2. This game has a small patch.003 (1344 bytes), // containing 48 instruments. However it has several songs which use instruments - // not specified in that patch (namely, songs 1, 3, 5, 9, 15, 16, 17, 23, 25, 27, + // not specified in that patch (namely, songs 1, 3, 5, 9, 15, 16, 17, 23, 25, 27, // 29, 32, 36, 38, 44, 45, 46 all use instruments not specified in patch.003). // These were probably written for MT32. These warnings in PQ2 can probably go away // if a bigger patch.003 file is used (one that contains all the instruments used -- cgit v1.2.3 From 5d378574a438f7b7f60fd01b88dd58e05c0bcd9b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 15:18:14 +0000 Subject: Fixed show_instruments to ignore instruments in Sierra's special MIDI channel 15, and updated the comment regarding PQ2 accordingly (it only has 2 incorrect instruments) svn-id: r50021 --- engines/sci/console.cpp | 24 +++++++++++++----------- engines/sci/sound/drivers/adlib.cpp | 11 ++++------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b46e03830d..1fdcd579c0 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -919,19 +919,21 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { prevEvent = curEvent; command = curEvent >> 4; + byte channel; + switch (command) { case 0xC: // program change - { - //byte channel = curEvent & 0x0F; - byte instrument = *channelData++; - if (!firstOneShown) - firstOneShown = true; - else - DebugPrintf(","); - - DebugPrintf(" %d", instrument); - instruments[instrument]++; - instrumentsSongs[instrument][itr->getNumber()] = true; + channel = curEvent & 0x0F; + if (channel != 15) { // SCI special + byte instrument = *channelData++; + if (!firstOneShown) + firstOneShown = true; + else + DebugPrintf(","); + + DebugPrintf(" %d", instrument); + instruments[instrument]++; + instrumentsSongs[instrument][itr->getNumber()] = true; } break; case 0xD: diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index d0ca00fe0f..c2cc49e336 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -703,13 +703,9 @@ void MidiDriver_AdLib::setVelocityReg(int regOffset, int velocity, int kbScaleLe void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { - // This happens a lot at least in PQ2. This game has a small patch.003 (1344 bytes), - // containing 48 instruments. However it has several songs which use instruments - // not specified in that patch (namely, songs 1, 3, 5, 9, 15, 16, 17, 23, 25, 27, - // 29, 32, 36, 38, 44, 45, 46 all use instruments not specified in patch.003). - // These were probably written for MT32. These warnings in PQ2 can probably go away - // if a bigger patch.003 file is used (one that contains all the instruments used - // by the songs, i.e. 5382 bytes) + // This happens with songs 1 and 23 in PQ2. Song 1 (the title song) uses an invalid + // instrument 80, and song 23 (car horn when the car runs over you at the airport, + // rooms 14/15) an invalid instrument 89. These are probably leftovers from MT32. warning("ADLIB: Invalid patch %i requested (patch.003 contains %d instruments)", patch, _patches.size()); patch = 0; @@ -768,6 +764,7 @@ bool MidiDriver_AdLib::loadResource(const byte *data, uint size) { for (int i = 48; i < 96; i++) loadInstrument(data + 2 + (28 * i)); } else if (size == 5382) { + // SCI1.1 and later for (int i = 48; i < 190; i++) loadInstrument(data + (28 * i)); _rhythmKeyMap = new byte[kRhythmKeys]; -- cgit v1.2.3 From 680f7c897af5dac091e1abc47f0500cccbd07a51 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 15:40:18 +0000 Subject: Fixed a problem in kAnimate which occurred when a list was modified by a call (e.g. in KQ1 demo, PQ2) svn-id: r50022 --- engines/sci/engine/seg_manager.cpp | 8 +------- engines/sci/graphics/animate.cpp | 3 +++ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index f19c03d5a8..5371238304 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -531,12 +531,6 @@ Node *SegManager::lookupNode(reg_t addr) { SegmentType type = getSegmentType(addr.segment); if (type != SEG_TYPE_NODES) { - if (g_sci->getGameId() == "kq1sci") { - // WORKAROUND: The demo of KQ1 is trying to use an invalid memory reference as a list node - warning("Attempt to use non-node %04x:%04x (type %d) as list node", PRINT_REG(addr), type); - return NULL; - } - error("Attempt to use non-node %04x:%04x (type %d) as list node", PRINT_REG(addr), type); return NULL; } @@ -544,7 +538,7 @@ Node *SegManager::lookupNode(reg_t addr) { NodeTable *nt = (NodeTable *)_heap[addr.segment]; if (!nt->isValidEntry(addr.offset)) { - error("Attempt to use invalid reference %04x:%04x as list node", PRINT_REG(addr)); + error("Attempt to use invalid or discarded reference %04x:%04x as list node", PRINT_REG(addr)); return NULL; } diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 598724f2be..06054f3a19 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -606,6 +606,9 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t if (cycle) { if (!invoke(list, argc, argv)) return; + + // Look up the list again, as it may have been modified + list = _s->_segMan->lookupList(listReference); } Port *oldPort = _ports->setPort((Port *)_ports->_picWind); -- cgit v1.2.3 From 8a8480c0caa2848522cf18ec870343677c6af44f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 17:20:09 +0000 Subject: SCI: fix typo when setting EGA palette svn-id: r50023 --- engines/sci/graphics/palette.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 35741dedf7..0972943b79 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -197,7 +197,7 @@ void GfxPalette::setEGA() { // Now setting colors 16-254 to the correct mix colors that occur when not doing a dithering run on // finished pictures for (curColor = 0x10; curColor <= 0xFE; curColor++) { - _sysPalette.colors[curColor].used = curColor; + _sysPalette.colors[curColor].used = 1; color1 = curColor & 0x0F; color2 = curColor >> 4; _sysPalette.colors[curColor].r = (_sysPalette.colors[color1].r >> 1) + (_sysPalette.colors[color2].r >> 1); _sysPalette.colors[curColor].g = (_sysPalette.colors[color1].g >> 1) + (_sysPalette.colors[color2].g >> 1); -- cgit v1.2.3 From 6f7f6572c4ded607d5f479c699d035cb2c8ebabb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 18 Jun 2010 17:34:34 +0000 Subject: Fixed invalid memory read in LSL6 hires - kRobot(1) returns an integer svn-id: r50024 --- engines/sci/engine/kgraphics.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 4614ee878a..6e0dab7e28 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1265,6 +1265,9 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { warning("kRobot(init), id %d, obj %04x:%04x, flag %d, x=%d, y=%d", id, PRINT_REG(obj), flag, x, y); } break; + case 1: // LSL6 hires (startup) + // TODO + return NULL_REG; // an integer is expected case 4: { // start int id = argv[1].toUint16(); warning("kRobot(start), id %d", id); -- cgit v1.2.3 From 636ef64c688d1a059bc3dedb2afc35c3acb2e713 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 17:40:13 +0000 Subject: SCI: making vga views work in ega games :P svn-id: r50025 --- engines/sci/graphics/palette.cpp | 1 + engines/sci/graphics/view.cpp | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 0972943b79..8af6b597d6 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -203,6 +203,7 @@ void GfxPalette::setEGA() { _sysPalette.colors[curColor].g = (_sysPalette.colors[color1].g >> 1) + (_sysPalette.colors[color2].g >> 1); _sysPalette.colors[curColor].b = (_sysPalette.colors[color1].b >> 1) + (_sysPalette.colors[color2].b >> 1); } + _sysPalette.timestamp = 1; setOnScreen(); } diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 2ba14fbd8f..40c96dcfed 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -75,12 +75,27 @@ void GfxView::initData(GuiResourceId resourceId) { byte seekEntry; bool isEGA = false; bool isCompressed = true; + ViewType curViewType = _resMan->getViewType(); _loopCount = 0; _embeddedPal = false; _EGAmapping = NULL; - switch (_resMan->getViewType()) { + // If we find a SCI1/SCI1.1 view (not amiga), we switch to that type for EGA + if (curViewType == kViewEga) { + if (_resourceData[1] == 0x80) { + switch (READ_LE_UINT16(_resourceData + 4)) { + case 0: // SCI1 + curViewType = kViewVga; + break; + case 1: // SCI1.1 + curViewType = kViewVga11; + break; + } + } + } + + switch (curViewType) { case kViewEga: // View-format SCI0 (and Amiga 16 colors) isEGA = true; case kViewAmiga: // View-format Amiga (32 colors) -- cgit v1.2.3 From 3197dfc033adba2ced19dcaf3762a5b2c0ad2452 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 17:53:35 +0000 Subject: SCI: added more description about changes in r50025 svn-id: r50026 --- engines/sci/graphics/view.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 40c96dcfed..3fdfd86d2f 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -82,6 +82,9 @@ void GfxView::initData(GuiResourceId resourceId) { _EGAmapping = NULL; // If we find a SCI1/SCI1.1 view (not amiga), we switch to that type for EGA + // This could get used to make view patches for EGA games, where the new views include more colors + // Users could manually adjust old views to make them look better (like removing dithered colors that aren't + // caught by our undithering or even improve the graphics overall) if (curViewType == kViewEga) { if (_resourceData[1] == 0x80) { switch (READ_LE_UINT16(_resourceData + 4)) { -- cgit v1.2.3 From 8c8ce14164c21210e05115ab6a8f4f3f8a1d0e20 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 18:49:06 +0000 Subject: SCI: not using views coming from patch files anymore for detecting view type svn-id: r50027 --- engines/sci/resource.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 075d104f3e..a4eff573ab 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1697,6 +1697,10 @@ ViewType ResourceManager::detectViewType() { Resource *res = findResource(ResourceId(kResourceTypeView, i), 0); if (res) { + // Skip views coming from patch files + if (res->_source->getSourceType() == kSourcePatch) + continue; + switch (res->data[1]) { case 128: // If the 2nd byte is 128, it's a VGA game -- cgit v1.2.3 From 602b32175a75cac3ddf6d8ff531202fe197c91c4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 18:55:17 +0000 Subject: SCI: fixing detection of vga sci11 views for ega games (original change in r50025) svn-id: r50028 --- engines/sci/graphics/view.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 3fdfd86d2f..6c0f6fda75 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -87,14 +87,10 @@ void GfxView::initData(GuiResourceId resourceId) { // caught by our undithering or even improve the graphics overall) if (curViewType == kViewEga) { if (_resourceData[1] == 0x80) { - switch (READ_LE_UINT16(_resourceData + 4)) { - case 0: // SCI1 - curViewType = kViewVga; - break; - case 1: // SCI1.1 + curViewType = kViewVga; + } else { + if (READ_LE_UINT16(_resourceData + 4) == 1) curViewType = kViewVga11; - break; - } } } -- cgit v1.2.3 From 75b7b54fe119bffa74cbba9b5c663b45769f3e10 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 22:06:13 +0000 Subject: SCI: Add mac SQ1 & SQ3 svn-id: r50030 --- engines/sci/detection_tables.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index dba4d879aa..2ac76578fe 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2572,6 +2572,18 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Space Quest 1 VGA Remake - English Mac (from Fingolfin) + {"sq1sci", "VGA Remake", { + {"resource.map", 0, "5c6ad20407261b544238e8dce87afead", 5895}, + {"resource.000", 0, "2c414644b23839069c8d1a93b721df16", 1017033}, + {"resource.001", 0, "8744ae2ea6b316e91e2a35ab1aa301d2", 1024622}, + {"resource.002", 0, "96860704f7a07ecc10bef223b4b2f153", 1273992}, + {"resource.003", 0, "ae46e195e66df5a131917f0aa80b5669", 1242794}, + {"resource.004", 0, "91d58a9eb2187c38424990afe4c12bc6", 1250949}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH + }, + // Space Quest 1 VGA Remake - English Non-Interactive Demo (from FRG) // SCI interpreter version 1.000.181 {"sq1sci", "VGA Remake, Demo", { @@ -2660,6 +2672,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Space Quest 3 - English Mac (from Fingolfin) + {"sq3", "", { + {"resource.map", 0, "5c931675c6e01c4b418faca85d76c92c", 5844}, + {"resource.001", 0, "0d8dfe42683b46f3131823233a91ce6a", 771917}, + {"resource.002", 0, "0d8dfe42683b46f3131823233a91ce6a", 794072}, + {"resource.003", 0, "0d8dfe42683b46f3131823233a91ce6a", 776536}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, + // Space Quest 3 - German DOS (from Tobis87) // SCI interpreter version 0.000.453 (?) {"sq3", "", { -- cgit v1.2.3 From e5fcbc0c3a9b926cca5ba61d9c89038b260fbfa1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 22:06:31 +0000 Subject: AGI: Fix serguei1/serguei2/sqx detection svn-id: r50031 --- engines/agi/detection_tables.h | 44 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index a3e95241c1..d4d5c0df76 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -27,10 +27,10 @@ namespace Agi { using Common::GUIO_NONE; -#define GAME_LVFPN(id,name,fname,md5,size,lang,ver,features,gid,platform,interp) { \ +#define GAME_LVFPN(id,extra,fname,md5,size,lang,ver,features,gid,platform,interp) { \ { \ id, \ - name, \ + extra, \ AD_ENTRY1s(fname,md5,size), \ lang, \ platform, \ @@ -59,26 +59,27 @@ using Common::GUIO_NONE; ver, \ } -#define GAME(id,name,md5,ver,gid) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2) -#define GAME3(id,name,fname,md5,ver,gid) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V3) +#define GAME(id,extra,md5,ver,gid) GAME_LVFPN(id,extra,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V2) +#define GAME3(id,extra,fname,md5,ver,gid) GAME_LVFPN(id,extra,fname,md5,-1,Common::EN_ANY,ver,0,gid,Common::kPlatformPC,GType_V3) -#define GAME_P(id,name,md5,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_V2) +#define GAME_P(id,extra,md5,ver,gid,platform) GAME_LVFPN(id,extra,"logdir",md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_V2) -#define GAME_FP(id,name,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V2) +#define GAME_FP(id,extra,md5,ver,flags,gid,platform) GAME_LVFPN(id,extra,"logdir",md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V2) +#define GAME_F(id,extra,md5,ver,flags,gid) GAME_FP(id,extra,md5,ver,flags,gid,Common::kPlatformPC) -#define GAME_PS(id,name,md5,size,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,Common::EN_ANY,ver,0,gid,platform,GType_V2) +#define GAME_PS(id,extra,md5,size,ver,gid,platform) GAME_LVFPN(id,extra,"logdir",md5,size,Common::EN_ANY,ver,0,gid,platform,GType_V2) -#define GAME_LPS(id,name,md5,size,lang,ver,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,0,gid,platform,GType_V2) +#define GAME_LPS(id,extra,md5,size,lang,ver,gid,platform) GAME_LVFPN(id,extra,"logdir",md5,size,lang,ver,0,gid,platform,GType_V2) -#define GAME_LFPS(id,name,md5,size,lang,ver,flags,gid,platform) GAME_LVFPN(id,name,"logdir",md5,size,lang,ver,flags,gid,platform,GType_V2) +#define GAME_LFPS(id,extra,md5,size,lang,ver,flags,gid,platform) GAME_LVFPN(id,extra,"logdir",md5,size,lang,ver,flags,gid,platform,GType_V2) -#define GAME3_P(id,name,fname,md5,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V3) +#define GAME3_P(id,extra,fname,md5,ver,flags,gid,platform) GAME_LVFPN(id,extra,fname,md5,-1,Common::EN_ANY,ver,flags,gid,platform,GType_V3) -#define GAMEpre_P(id,name,fname,md5,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) +#define GAMEpre_P(id,extra,fname,md5,ver,gid,platform) GAME_LVFPN(id,extra,fname,md5,-1,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) -#define GAMEpre_PS(id,name,fname,md5,size,ver,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) +#define GAMEpre_PS(id,extra,fname,md5,size,ver,gid,platform) GAME_LVFPN(id,extra,fname,md5,size,Common::EN_ANY,ver,0,gid,platform,GType_PreAGI) -#define GAME3_PS(id,name,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,name,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) +#define GAME3_PS(id,extra,fname,md5,size,ver,flags,gid,platform) GAME_LVFPN(id,extra,fname,md5,size,Common::EN_ANY,ver,flags,gid,platform,GType_V3) #define FANMADE_ILVF(id,name,md5,lang,ver,features) GAME_LVFPNF(id,name,"logdir",md5,-1,lang,ver,(GF_FANMADE|features),GID_FANMADE,Common::kPlatformPC,GType_V2) @@ -765,11 +766,12 @@ static const AGIGameDescription gameDescriptions[] = { FANMADE("Save Santa (v1.3)", "f8afdb6efc5af5e7c0228b44633066af"), FANMADE("Schiller (preview 1)", "ade39dea968c959cfebe1cf935d653e9"), FANMADE("Schiller (preview 2)", "62cd1f8fc758bf6b4aa334e553624cef"), - FANMADE_IF("serguei1", "v1.0", "b86725f067e456e10cdbdf5f58e01dec", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei1", "v1.1 2002 Sep 5", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei1", "v1.1 2003 Apr 10", "91975c1fb4b13b0f9a8e9ff74731030d", GF_AGIMOUSE|GF_AGIPAL), - FANMADE_IF("serguei2", "v0.1.1 Demo", "906ccbc2ddedb29b63141acc6d10cd28", GF_AGIMOUSE), - FANMADE_IF("serguei2", "v1.3.1 Demo (March 22nd 2008)", "ad1308fcb8f48723cd388e012ebf5e20", GF_AGIMOUSE|GF_AGIPAL), + GAME_F("serguei1", "v1.0", "b86725f067e456e10cdbdf5f58e01dec", 0x2917, GF_FANMADE|GF_AGIMOUSE|GF_AGIPAL, GID_FANMADE), + // FIXME: The following two entries have identical MD5 checksums? + GAME_F("serguei1", "v1.1 2002 Sep 5", "91975c1fb4b13b0f9a8e9ff74731030d", 0x2917, GF_FANMADE|GF_AGIMOUSE|GF_AGIPAL, GID_FANMADE), + GAME_F("serguei1", "v1.1 2003 Apr 10", "91975c1fb4b13b0f9a8e9ff74731030d", 0x2917, GF_FANMADE|GF_AGIMOUSE|GF_AGIPAL, GID_FANMADE), + GAME_F("serguei2", "v0.1.1 Demo", "906ccbc2ddedb29b63141acc6d10cd28", 0x2917, GF_FANMADE|GF_AGIMOUSE, GID_FANMADE), + GAME_F("serguei2", "v1.3.1 Demo (March 22nd 2008)", "ad1308fcb8f48723cd388e012ebf5e20", 0x2917, GF_FANMADE|GF_AGIMOUSE|GF_AGIPAL, GID_FANMADE), FANMADE("Shifty (v1.0)", "2a07984d27b938364bf6bd243ac75080"), FANMADE_F("Sliding Tile Game (v1.00)", "949bfff5d8a81c3139152eed4d84ca75", GF_AGIMOUSE), FANMADE("Snowboarding Demo (v1.0)", "24bb8f29f1eddb5c0a099705267c86e4"), @@ -778,9 +780,9 @@ static const AGIGameDescription gameDescriptions[] = { GAME("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590", 0x2917, GID_SQ0), GAME("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6", 0x2917, GID_SQ0), GAME_PS("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, GID_SQ0, Common::kPlatformCoCo3), - FANMADE_I("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1"), - FANMADE_I("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910"), - FANMADE_ISVP("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, Common::kPlatformCoCo3), + GAME("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1", 0x2917, GID_FANMADE), + GAME("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910", 0x2917, GID_FANMADE), + GAME_PS("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, GID_FANMADE, Common::kPlatformCoCo3), FANMADE_F("Space Quest 3.5", "c077bc28d7b36213dd99dc9ecb0147fc", GF_AGIMOUSE|GF_AGIPAL), FANMADE_F("Space Trek (v1.0)", "807a1aeadb2ace6968831d36ab5ea37a", GF_CLIPCOORDS), FANMADE("Special Delivery", "88764dfe61126b8e73612c851b510a33"), -- cgit v1.2.3 From 7a8b8c88ae52cb4a6a40ec233e43d006ce645c8d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 22:06:56 +0000 Subject: AGI: cleanup svn-id: r50032 --- engines/agi/agi.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 4cc823df5a..34aa99b3f2 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -37,6 +37,14 @@ #include "gui/debugger.h" +// AGI resources +#include "agi/console.h" +#include "agi/view.h" +#include "agi/picture.h" +#include "agi/logic.h" +#include "agi/sound.h" + + namespace Common { class RandomSource; } /** @@ -117,17 +125,6 @@ enum AgiGameID { GID_TROLL // PreAGI }; -} // End of namespace Agi - -// AGI resources -#include "agi/console.h" -#include "agi/view.h" -#include "agi/picture.h" -#include "agi/logic.h" -#include "agi/sound.h" - -namespace Agi { - enum AgiGameType { GType_PreAGI = 0, GType_V2 = 1, -- cgit v1.2.3 From da28fde4c61d8f050be8b2eb90b7b634869e3f22 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 18 Jun 2010 22:07:32 +0000 Subject: AGI: Change some #defines to enums svn-id: r50033 --- engines/agi/agi.cpp | 2 +- engines/agi/agi.h | 53 ++++++++++++++++++++++++++++++------------------ engines/agi/cycle.cpp | 6 +++--- engines/agi/op_cmd.cpp | 4 ++-- engines/agi/op_test.cpp | 2 +- engines/agi/saveload.cpp | 6 +++--- 6 files changed, 43 insertions(+), 30 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 21b28fd445..0875646148 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -556,7 +556,7 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _restartGame = false; - _oldMode = -1; + _oldMode = INPUT_NONE; _predictiveDialogRunning = false; _predictiveDictText = NULL; diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 34aa99b3f2..fb425b6b87 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -502,10 +502,32 @@ struct ScriptPos { int curIP; }; -#define EGO_VIEW_TABLE 0 -#define HORIZON 36 -#define _WIDTH 160 -#define _HEIGHT 168 +enum { + EGO_VIEW_TABLE = 0, + HORIZON = 36, + _WIDTH = 160, + _HEIGHT = 168 +}; + +enum InputMode { + INPUT_NORMAL = 0x01, + INPUT_GETSTRING = 0x02, + INPUT_MENU = 0x03, + INPUT_NONE = 0x04 +}; + +enum State { + STATE_INIT = 0x00, + STATE_LOADED = 0x01, + STATE_RUNNING = 0x02 +}; + +enum { + SBUF16_OFFSET = 0, + SBUF256_OFFSET = ((_WIDTH) * (_HEIGHT)), + FROM_SBUF16_TO_SBUF256_OFFSET = ((SBUF256_OFFSET) - (SBUF16_OFFSET)), + FROM_SBUF256_TO_SBUF16_OFFSET = ((SBUF16_OFFSET) - (SBUF256_OFFSET)) +}; /** * AGI game structure. @@ -513,10 +535,7 @@ struct ScriptPos { * by the interpreter. */ struct AgiGame { -#define STATE_INIT 0x00 -#define STATE_LOADED 0x01 -#define STATE_RUNNING 0x02 - int state; /**< state of the interpreter */ + State state; /**< state of the interpreter */ // TODO: Check whether adjMouseX and adjMouseY must be saved and loaded when using savegames. // If they must be then loading and saving is partially broken at the moment. @@ -540,12 +559,9 @@ struct AgiGame { uint8 inputBuffer[40]; /**< buffer for user input */ uint8 echoBuffer[40]; /**< buffer for echo.line */ int keypress; -#define INPUT_NORMAL 0x01 -#define INPUT_GETSTRING 0x02 -#define INPUT_MENU 0x03 -#define INPUT_NONE 0x04 - int inputMode; /**< keyboard input mode */ - int inputEnabled; /**< keyboard input enabled */ + + InputMode inputMode; /**< keyboard input mode */ + bool inputEnabled; /**< keyboard input enabled */ int lognum; /**< current logic number */ Common::Array execStack; @@ -573,10 +589,7 @@ struct AgiGame { char cursorChar; unsigned int colorFg; unsigned int colorBg; -#define SBUF16_OFFSET 0 -#define SBUF256_OFFSET ((_WIDTH) * (_HEIGHT)) -#define FROM_SBUF16_TO_SBUF256_OFFSET ((SBUF256_OFFSET) - (SBUF16_OFFSET)) -#define FROM_SBUF256_TO_SBUF16_OFFSET ((SBUF16_OFFSET) - (SBUF256_OFFSET)) + uint8 *sbufOrig; /**< Pointer to the 160x336 AGI screen buffer that contains vertically two 160x168 screens (16 color and 256 color). */ uint8 *sbuf16c; /**< 160x168 16 color (+control line & priority information) AGI screen buffer. Points at sbufOrig + SBUF16_OFFSET. */ uint8 *sbuf256c; /**< 160x168 256 color AGI screen buffer (For AGI256 and AGI256-2 support). Points at sbufOrig + SBUF256_OFFSET. */ @@ -834,7 +847,7 @@ public: int loadGameSimple(); uint8 *_intobj; - int _oldMode; + InputMode _oldMode; bool _restartGame; Menu* _menu; @@ -876,7 +889,7 @@ public: static void agiTimerFunctionLow(void *refCon); void initPriTable(); - void newInputMode(int); + void newInputMode(InputMode mode); void oldInputMode(); int getvar(int); diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index 40d6f2d008..ee55c783f1 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -177,9 +177,9 @@ void AgiEngine::updateTimer() { setvar(vDays, getvar(vDays) + 1); } -void AgiEngine::newInputMode(int i) { +void AgiEngine::newInputMode(InputMode mode) { _oldMode = _game.inputMode; - _game.inputMode = i; + _game.inputMode = mode; } void AgiEngine::oldInputMode() { @@ -436,7 +436,7 @@ int AgiEngine::runGame() { setvar(vFreePages, 180); // Set amount of free memory to realistic value setvar(vMaxInputChars, 38); _game.inputMode = INPUT_NONE; - _game.inputEnabled = 0; + _game.inputEnabled = false; _game.hasPrompt = 0; _game.state = STATE_RUNNING; diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index ab7e5010e7..9728ed9b42 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1563,8 +1563,8 @@ cmd(shake_screen) { // Disables input while shaking to prevent bug // #1678230: AGI: Entering text while screen is shaking - int originalValue = game.inputEnabled; - game.inputEnabled = 0; + bool originalValue = game.inputEnabled; + game.inputEnabled = false; g_gfx->shakeStart(); diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp index 71d307556b..f10cdd3f17 100644 --- a/engines/agi/op_test.cpp +++ b/engines/agi/op_test.cpp @@ -111,7 +111,7 @@ static uint8 testKeypressed() { game.keypress = 0; if (!x) { - int mode = game.inputMode; + InputMode mode = game.inputMode; game.inputMode = INPUT_NONE; g_agi->mainCycle(); diff --git a/engines/agi/saveload.cpp b/engines/agi/saveload.cpp index 88e279ecf8..88b14dcfe2 100644 --- a/engines/agi/saveload.cpp +++ b/engines/agi/saveload.cpp @@ -132,7 +132,7 @@ int AgiEngine::saveGame(const char *fileName, const char *description) { out->writeSint16BE((int16)_game.hasPrompt); out->writeSint16BE((int16)_game.gameFlags); - out->writeSint16BE((int16)_game.inputEnabled); + out->writeSint16BE(_game.inputEnabled); for (i = 0; i < _HEIGHT; i++) out->writeByte(_game.priTable[i]); @@ -302,7 +302,7 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) { // TODO: played time } - _game.state = in->readByte(); + _game.state = (State)in->readByte(); in->read(loadId, 8); if (strcmp(loadId, _game.id) && checkId) { @@ -361,7 +361,7 @@ int AgiEngine::loadGame(const char *fileName, bool checkId) { _game.echoBuffer[0] = 0; _game.keypress = 0; - _game.inputMode = in->readSint16BE(); + _game.inputMode = (InputMode)in->readSint16BE(); _game.lognum = in->readSint16BE(); _game.playerControl = in->readSint16BE(); -- cgit v1.2.3 From 25c86e8b03574163d7c6df6e54d00cbffc66b4ef Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 18 Jun 2010 22:16:05 +0000 Subject: SCI: set resulting type to keyboard+joystick for sci1middle+ in kMapKeyToDir - fixes keyboard controlling of mouse in all sorts of games - although this is not 100% done, the change actually happened inbetween sci1early, added fixme svn-id: r50034 --- engines/sci/engine/kevent.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 2f1afd4358..f516a9d4b1 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -203,7 +203,12 @@ reg_t kMapKeyToDir(EngineState *s, int argc, reg_t *argv) { } if (mover >= 0) { - writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_JOYSTICK); + // FIXME: changing point was actually inbetween SCI1EARLY, we need to find out when it happened + // and then find some method of finding out those specific games + if (getSciVersion() >= SCI_VERSION_1_MIDDLE) + writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_KEYBOARD | SCI_EVENT_JOYSTICK); + else + writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_JOYSTICK); writeSelectorValue(segMan, obj, SELECTOR(message), mover); return make_reg(0, 1); } else -- cgit v1.2.3 From f4b700c4c45e601a5d1571f980ec7e5636e0f166 Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Sat, 19 Jun 2010 01:16:25 +0000 Subject: SCI: AdLib: add dummy instruments when there are only 48 in the patch svn-id: r50035 --- engines/sci/sound/drivers/adlib.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/engines/sci/sound/drivers/adlib.cpp b/engines/sci/sound/drivers/adlib.cpp index c2cc49e336..55c3640c9d 100644 --- a/engines/sci/sound/drivers/adlib.cpp +++ b/engines/sci/sound/drivers/adlib.cpp @@ -703,11 +703,8 @@ void MidiDriver_AdLib::setVelocityReg(int regOffset, int velocity, int kbScaleLe void MidiDriver_AdLib::setPatch(int voice, int patch) { if ((patch < 0) || ((uint)patch >= _patches.size())) { - // This happens with songs 1 and 23 in PQ2. Song 1 (the title song) uses an invalid - // instrument 80, and song 23 (car horn when the car runs over you at the airport, - // rooms 14/15) an invalid instrument 89. These are probably leftovers from MT32. - warning("ADLIB: Invalid patch %i requested (patch.003 contains %d instruments)", - patch, _patches.size()); + warning("ADLIB: Invalid patch %i requested", patch); + // Substitute instrument 0 patch = 0; } @@ -760,10 +757,16 @@ bool MidiDriver_AdLib::loadResource(const byte *data, uint size) { for (int i = 0; i < 48; i++) loadInstrument(data + (28 * i)); - if (size == 2690) { + if (size == 1344) { + byte dummy[28] = {0}; + + // Only 48 instruments, add dummies + for (int i = 0; i < 48; i++) + loadInstrument(dummy); + } else if (size == 2690) { for (int i = 48; i < 96; i++) loadInstrument(data + 2 + (28 * i)); - } else if (size == 5382) { + } else { // SCI1.1 and later for (int i = 48; i < 190; i++) loadInstrument(data + (28 * i)); -- cgit v1.2.3 From 61c40e2bd4cf5f23314d819e70d7eb0a966993cf Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 02:50:46 +0000 Subject: Save the context of a suspended list before resuming the execution, so that it can safely be suspended again. Patch 3004652 by fuzzie. svn-id: r50037 --- engines/parallaction/exec.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/parallaction/exec.cpp b/engines/parallaction/exec.cpp index 24579286e6..434c4f6ae6 100644 --- a/engines/parallaction/exec.cpp +++ b/engines/parallaction/exec.cpp @@ -193,8 +193,10 @@ void CommandExec::runSuspended() { debugC(3, kDebugExec, "CommandExec::runSuspended()"); _execZone = _suspendedCtxt._zone; - runList(_suspendedCtxt._first, _suspendedCtxt._last); + CommandList::iterator first = _suspendedCtxt._first; + CommandList::iterator last = _suspendedCtxt._last; cleanSuspendedList(); + runList(first, last); } } -- cgit v1.2.3 From 5b3075bd653f888d814abd32b878870c2388668c Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 02:51:03 +0000 Subject: Guarded the command execution suspension for NS demo (this was due in r38662 - see bug #2619824). svn-id: r50038 --- engines/parallaction/callables_ns.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp index a493523301..cfe6ad8954 100644 --- a/engines/parallaction/callables_ns.cpp +++ b/engines/parallaction/callables_ns.cpp @@ -453,14 +453,15 @@ void Parallaction_ns::_c_startIntro(void *parm) { } void Parallaction_ns::_c_endIntro(void *parm) { - // NOTE: suspend command execution queue, to - // avoid running the QUIT command before - // credits are displayed. This solves bug - // #2619824. - // Execution of the command list will resume - // as soon as runGameFrame is run. - _cmdExec->suspend(); - + if (getFeatures() & GF_DEMO) { + // NOTE: suspend command execution queue, to + // avoid running the QUIT command before + // credits are displayed. This solves bug + // #2619824. + // Execution of the command list will resume + // as soon as runGameFrame is run. + _cmdExec->suspend(); + } startCreditSequence(); _intro = false; } -- cgit v1.2.3 From d7a165b9f256244ed5b4e7f48cea82a540cf1698 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 04:50:44 +0000 Subject: Implemented PART command for BRA, largely based on patch #3005434 by fuzzie. svn-id: r50039 --- engines/parallaction/exec_br.cpp | 2 +- engines/parallaction/parallaction.h | 3 +++ engines/parallaction/parallaction_br.cpp | 22 ++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index e145c0da94..76e6f0dfe0 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -293,7 +293,7 @@ DECLARE_COMMAND_OPCODE(text) { DECLARE_COMMAND_OPCODE(part) { - warning("Parallaction_br::cmdOp_part not yet implemented"); + _vm->_nextPart = ctxt._cmd->_counterValue; } diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 151bfd958d..7bbdf79f1c 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -548,6 +548,9 @@ public: const char **_audioCommandsNamesRes; static const char *_partNames[]; int _part; + int _nextPart; + + #if 0 // disabled since I couldn't find any references to lip sync in the scripts int16 _lipSyncVal; uint _subtitleLipSync; diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index c752c85d4f..5023a05d85 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -86,6 +86,7 @@ Common::Error Parallaction_br::init() { _walker = new PathWalker_BR; _part = -1; + _nextPart = -1; _subtitle[0] = 0; _subtitle[1] = 0; @@ -260,6 +261,8 @@ void Parallaction_br::cleanupGame() { _globalFlagsNames = 0; _objectsNames = 0; _countersNames = 0; + + memset(_zoneFlags, 0, sizeof(_zoneFlags)); } @@ -272,13 +275,23 @@ void Parallaction_br::changeLocation() { strcpy(location, _newLocationName.c_str()); char *partStr = strrchr(location, '.'); - if (partStr) { + if (partStr || _nextPart != -1) { cleanupGame(); - int n = partStr - location; - location[n] = '\0'; + // more cleanup needed for part changes (see also saveload) + _globalFlags = 0; + cleanInventory(true); + strcpy(_characterName1, "null"); + + if (partStr) { + int n = partStr - location; + location[n] = '\0'; + + _part = atoi(++partStr); + } else { + _part = _nextPart; + } - _part = atoi(++partStr); if (getFeatures() & GF_DEMO) { assert(_part == 1); } else { @@ -357,6 +370,7 @@ void Parallaction_br::changeLocation() { _engineFlags &= ~kEngineChangeLocation; _newLocationName.clear(); + _nextPart = -1; } // FIXME: Parallaction_br::parseLocation() is now a verbatim copy of the same routine from Parallaction_ns. -- cgit v1.2.3 From de7de460e8c985764d9e5719789da0aa8df914e9 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 04:51:00 +0000 Subject: Use the new _nextPart member switching part from the menu in BRA. svn-id: r50040 --- engines/parallaction/gui_br.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp index 7096bbe569..21cb2d8b00 100644 --- a/engines/parallaction/gui_br.cpp +++ b/engines/parallaction/gui_br.cpp @@ -98,6 +98,12 @@ public: } }; + +struct LocationPart { + int part; + const char *location; +}; + class MainMenuInputState_BR : public MenuInputState { Parallaction_br *_vm; @@ -158,7 +164,7 @@ class MainMenuInputState_BR : public MenuInputState { const char **_menuStrings; const MenuOptions *_options; - static const char *_firstLocation[]; + static LocationPart _firstLocation[]; int _availItems; int _selection; @@ -205,7 +211,8 @@ public: return this; } - switch (_options[_selection]) { + int selection = _options[_selection]; + switch (selection) { case kMenuQuit: { _vm->quitGame(); break; @@ -218,8 +225,10 @@ public: } break; - default: - _vm->scheduleLocationSwitch(_firstLocation[_options[_selection]]); + default: + _vm->_nextPart = _firstLocation[selection].part; + _vm->scheduleLocationSwitch(_firstLocation[selection].location); + } _vm->_system->showMouse(false); @@ -262,14 +271,15 @@ public: }; -const char *MainMenuInputState_BR::_firstLocation[] = { - "intro.0", - "museo.1", - "start.2", - "bolscoi.3", - "treno.4" +LocationPart MainMenuInputState_BR::_firstLocation[] = { + { 0, "intro" }, + { 1, "museo" }, + { 2, "start" }, + { 3, "bolscoi" }, + { 4, "treno" } }; + const char *MainMenuInputState_BR::_menuStringsAmiga[NUM_MENULINES] = { "See the introduction", "Load a Saved Game", -- cgit v1.2.3 From 96d4ae0fcccbe6438c5829a4a679d94180407159 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 04:51:14 +0000 Subject: Cleanup some more state when switching part in BRA. svn-id: r50041 --- engines/parallaction/parallaction_br.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 5023a05d85..cd9b15381b 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -262,6 +262,10 @@ void Parallaction_br::cleanupGame() { _objectsNames = 0; _countersNames = 0; + _numLocations = 0; + _globalFlags = 0; + memset(_localFlags, 0, sizeof(_localFlags)); + memset(_locationNames, 0, sizeof(_locationNames)); memset(_zoneFlags, 0, sizeof(_zoneFlags)); } -- cgit v1.2.3 From 5328abe2f0b1afa33c360b098865de491410b677 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 04:51:31 +0000 Subject: Cleanup. Got rid of the legacy "location.part" string handling in BRA. svn-id: r50042 --- engines/parallaction/parallaction_br.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index cd9b15381b..153ea1541d 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -275,11 +275,7 @@ void Parallaction_br::changeLocation() { return; } - char location[200]; - strcpy(location, _newLocationName.c_str()); - - char *partStr = strrchr(location, '.'); - if (partStr || _nextPart != -1) { + if (_nextPart != -1) { cleanupGame(); // more cleanup needed for part changes (see also saveload) @@ -287,14 +283,7 @@ void Parallaction_br::changeLocation() { cleanInventory(true); strcpy(_characterName1, "null"); - if (partStr) { - int n = partStr - location; - location[n] = '\0'; - - _part = atoi(++partStr); - } else { - _part = _nextPart; - } + _part = _nextPart; if (getFeatures() & GF_DEMO) { assert(_part == 1); @@ -322,8 +311,8 @@ void Parallaction_br::changeLocation() { freeLocation(false); // load new location - strcpy(_location._name, location); - parseLocation(location); + strcpy(_location._name, _newLocationName.c_str()); + parseLocation(_location._name); if (_location._startPosition.x != -1000) { _char._ani->setFoot(_location._startPosition); -- cgit v1.2.3 From 73e612a801dc26afe518ef7033efea5602988057 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 19 Jun 2010 04:57:54 +0000 Subject: Mention that part 1 of BRA is completable. svn-id: r50043 --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index db70d16ee0..c6311d74f4 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,9 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Added support for the Macintosh version of The 7th Guest. - Added support for custom MT-32 instruments. + Parallaction: + - Made part one of The Big Red Adveture completable. + SAGA: - Fixed graphics glithces in several scenes. -- cgit v1.2.3 From 4fb3059edcfdcfc6ab64cd0c4437e1cbb289d00e Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Sat, 19 Jun 2010 08:43:50 +0000 Subject: Fix some typos (thanks to fuzzie). svn-id: r50044 --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index c6311d74f4..908c121721 100644 --- a/NEWS +++ b/NEWS @@ -30,10 +30,10 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Added support for custom MT-32 instruments. Parallaction: - - Made part one of The Big Red Adveture completable. + - Made part one of The Big Red Adventure completable. SAGA: - - Fixed graphics glithces in several scenes. + - Fixed graphics glitches in several scenes. SCUMM: - Several improvements in Maniac Mansion NES. -- cgit v1.2.3 From a7fa0649dfc71c79f496a86986413f35c8d36966 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 09:46:04 +0000 Subject: SCI: implemented checking of keyboard driver in case of SCI1EGA/EARLY, also renamed SCI_EVENT_JOYSTICK to SCI_EVENT_DIRECTION svn-id: r50045 --- engines/sci/engine/kevent.cpp | 8 +++----- engines/sci/event.cpp | 34 ++++++++++++++++++++++++++++++++++ engines/sci/event.h | 5 ++++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index f516a9d4b1..e38550adee 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -203,12 +203,10 @@ reg_t kMapKeyToDir(EngineState *s, int argc, reg_t *argv) { } if (mover >= 0) { - // FIXME: changing point was actually inbetween SCI1EARLY, we need to find out when it happened - // and then find some method of finding out those specific games - if (getSciVersion() >= SCI_VERSION_1_MIDDLE) - writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_KEYBOARD | SCI_EVENT_JOYSTICK); + if (g_sci->getEventManager()->getUsesNewKeyboardDirectionType()) + writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_KEYBOARD | SCI_EVENT_DIRECTION); else - writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_JOYSTICK); + writeSelectorValue(segMan, obj, SELECTOR(type), SCI_EVENT_DIRECTION); writeSelectorValue(segMan, obj, SELECTOR(message), mover); return make_reg(0, 1); } else diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index eff7984d39..6c9e95a804 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -25,6 +25,7 @@ #include "common/system.h" #include "common/events.h" +#include "common/file.h" #include "sci/sci.h" #include "sci/event.h" @@ -35,11 +36,44 @@ namespace Sci { EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended), _modifierStates(0) { + + if (getSciVersion() >= SCI_VERSION_1_MIDDLE) { + _usesNewKeyboardDirectionType = true; + } else if (getSciVersion() <= SCI_VERSION_01) { + _usesNewKeyboardDirectionType = false; + } else { + // they changed this somewhere inbetween SCI1EGA/EARLY, so we need to check the size of the keyboard driver + _usesNewKeyboardDirectionType = false; + + Common::File keyboardDriver; + if (keyboardDriver.open("IBMKBD.DRV")) { + switch (keyboardDriver.size()) { + case 442: // SCI0 (PQ2) + case 446: // SCI0 (SQ3) + case 449: // SCI1EGA (QfG2) + break; + case 537: // SCI1 (SQ4) + case 564: // SCI1.1 (LB2) + case 758: // SCI1.1 (LB2cd) + case 760: // SCI1.1 (Pepper) + _usesNewKeyboardDirectionType = true; + break; + default: + error("Unsupported IBMKBD.DRV size (%d)", keyboardDriver.size()); + } + } else { + // We just default to OFF here in case the keyboard driver could not be found + warning("IBMKBD.DRV not found to distinguish usage of direction type"); + } + } } EventManager::~EventManager() { } +bool EventManager::getUsesNewKeyboardDirectionType() { + return _usesNewKeyboardDirectionType; +} struct ScancodeRow { int offset; diff --git a/engines/sci/event.h b/engines/sci/event.h index 314add7b2c..30098b0f6e 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -53,7 +53,7 @@ struct SciEvent { #define SCI_EVENT_MOUSE_PRESS (1<<0) #define SCI_EVENT_MOUSE_RELEASE (1<<1) #define SCI_EVENT_KEYBOARD (1<<2) -#define SCI_EVENT_JOYSTICK (1<<6) +#define SCI_EVENT_DIRECTION (1<<6) #define SCI_EVENT_SAID (1<<7) /*Fake values for other events*/ #define SCI_EVENT_ERROR (1<<10) @@ -115,6 +115,7 @@ public: ~EventManager(); SciEvent getSciEvent(unsigned int mask); + bool getUsesNewKeyboardDirectionType(); private: SciEvent getScummVMEvent(); @@ -122,6 +123,8 @@ private: const bool _fontIsExtended; int _modifierStates; Common::List _events; + + bool _usesNewKeyboardDirectionType; }; } // End of namespace Sci -- cgit v1.2.3 From 101218c1b6843692d82e992372e5ac8af81393d5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 10:28:41 +0000 Subject: SCI: added TODO for keyboard driver size check, maybe this whole stuff isn't needed at all svn-id: r50046 --- engines/sci/event.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 6c9e95a804..7931e8266b 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -42,6 +42,8 @@ EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended } else if (getSciVersion() <= SCI_VERSION_01) { _usesNewKeyboardDirectionType = false; } else { + // TODO: maybe this is even not needed at all and we can just use the old method for sci1early + // sq4 floppy doesn't have issues when using the old method although the keyboard driver is new // they changed this somewhere inbetween SCI1EGA/EARLY, so we need to check the size of the keyboard driver _usesNewKeyboardDirectionType = false; -- cgit v1.2.3 From 710f0257eb1cd1fda1f5ac340375b13ee6efabe9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 10:57:01 +0000 Subject: SCI: replacing the keyboard size check for direction type detection with checking for script 933 (pseudoMouse) instead - this is better because its working multiplatform svn-id: r50047 --- engines/sci/event.cpp | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 7931e8266b..a100dda27c 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -42,31 +42,15 @@ EventManager::EventManager(bool fontIsExtended) : _fontIsExtended(fontIsExtended } else if (getSciVersion() <= SCI_VERSION_01) { _usesNewKeyboardDirectionType = false; } else { - // TODO: maybe this is even not needed at all and we can just use the old method for sci1early - // sq4 floppy doesn't have issues when using the old method although the keyboard driver is new - // they changed this somewhere inbetween SCI1EGA/EARLY, so we need to check the size of the keyboard driver + // they changed this somewhere inbetween SCI1EGA/EARLY _usesNewKeyboardDirectionType = false; - Common::File keyboardDriver; - if (keyboardDriver.open("IBMKBD.DRV")) { - switch (keyboardDriver.size()) { - case 442: // SCI0 (PQ2) - case 446: // SCI0 (SQ3) - case 449: // SCI1EGA (QfG2) - break; - case 537: // SCI1 (SQ4) - case 564: // SCI1.1 (LB2) - case 758: // SCI1.1 (LB2cd) - case 760: // SCI1.1 (Pepper) - _usesNewKeyboardDirectionType = true; - break; - default: - error("Unsupported IBMKBD.DRV size (%d)", keyboardDriver.size()); - } - } else { - // We just default to OFF here in case the keyboard driver could not be found - warning("IBMKBD.DRV not found to distinguish usage of direction type"); - } + // We are looking if script 933 exists, that one has the PseudoMouse class in it that handles it + // The good thing is that PseudoMouse seems to only exists in games that use the new method + if (g_sci->getResMan()->testResource(ResourceId(kResourceTypeScript, 933))) + _usesNewKeyboardDirectionType = true; + // Checking the keyboard driver size in here would also be a valid method, but the driver is only available + // in PC versions of the game } } -- cgit v1.2.3 From 0c93154eb90b58cf5618b45e5e63a91694196d93 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 19 Jun 2010 11:08:16 +0000 Subject: AGI: Fix detection of AGI Tetris and Caitlyn's Destiny svn-id: r50048 --- engines/agi/detection_tables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index d4d5c0df76..a9caa538b1 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -578,7 +578,7 @@ static const AGIGameDescription gameDescriptions[] = { FANMADE_F("AGI Mouse Demo 1.10", "f4ad396b496d6167635ad0b410312ab8", GF_AGIMOUSE|GF_AGIPAL), FANMADE("AGI Piano (v1.0)", "8778b3d89eb93c1d50a70ef06ef10310"), FANMADE("AGI Quest (v1.46-TJ0)", "1cf1a5307c1a0a405f5039354f679814"), - FANMADE_I("tetris", "", "7a874e2db2162e7a4ce31c9130248d8a"), + GAME("tetris", "", "7a874e2db2162e7a4ce31c9130248d8a", 0x2917, GID_FANMADE), FANMADE_V("AGI Trek (Demo)", "c02882b8a8245b629c91caf7eb78eafe", 0x2440), FANMADE_F("AGI256 Demo", "79261ac143b2e2773b2753674733b0d5", GF_AGI256), FANMADE_F("AGI256-2 Demo", "3cad9b3aff1467cebf0c5c5b110985c5", GF_AGI256_2), @@ -605,8 +605,8 @@ static const AGIGameDescription gameDescriptions[] = { FANMADE("Botz", "a8fabe4e807adfe5ec02bfec6d983695"), FANMADE("Brian's Quest (v1.0)", "0964aa79b9cdcff7f33a12b1d7e04b9c"), FANMADE("CPU-21 (v1.0)", "35b7cdb4d17e890e4c52018d96e9cbf4"), - FANMADE_I("caitlyn", "Demo", "5b8a3cdb2fc05469f8119d49f50fbe98"), - FANMADE_I("caitlyn", "", "818469c484cae6dad6f0e9a353f68bf8"), + GAME("caitlyn", "Demo", "5b8a3cdb2fc05469f8119d49f50fbe98", 0x2917, GID_FANMADE), + GAME("caitlyn", "", "818469c484cae6dad6f0e9a353f68bf8", 0x2917, GID_FANMADE), FANMADE("Car Driver (v1.1)", "2311611d2d36d20ccc9da806e6cba157"), FANMADE("Cloak of Darkness (v1.0)", "5ba6e18bf0b53be10db8f2f3831ee3e5"), FANMADE("Coco Coq (English) - Coco Coq In Grostesteing's Base (v.1.0.3)", "97631f8e710544a58bd6da9e780f9320"), -- cgit v1.2.3 From 32668b553fe69fc8cea5afc60d5f82abdc9a4fb8 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 19 Jun 2010 11:08:41 +0000 Subject: AGI: Get rid of GID_SQ0 svn-id: r50049 --- engines/agi/agi.h | 1 - engines/agi/detection_tables.h | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index fb425b6b87..18f291d62c 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -119,7 +119,6 @@ enum AgiGameID { GID_XMASCARD, GID_FANMADE, GID_GETOUTTASQ, // Fanmade - GID_SQ0, // Fanmade GID_MICKEY, // PreAGI GID_WINNIE, // PreAGI GID_TROLL // PreAGI diff --git a/engines/agi/detection_tables.h b/engines/agi/detection_tables.h index a9caa538b1..711701f55a 100644 --- a/engines/agi/detection_tables.h +++ b/engines/agi/detection_tables.h @@ -777,9 +777,9 @@ static const AGIGameDescription gameDescriptions[] = { FANMADE("Snowboarding Demo (v1.0)", "24bb8f29f1eddb5c0a099705267c86e4"), FANMADE("Solar System Tour", "b5a3d0f392dfd76a6aa63f3d5f578403"), FANMADE("Sorceror's Appraisal", "fe62615557b3cb7b08dd60c9d35efef1"), - GAME("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590", 0x2917, GID_SQ0), - GAME("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6", 0x2917, GID_SQ0), - GAME_PS("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, GID_SQ0, Common::kPlatformCoCo3), + GAME("sq0", "v1.03", "d2fd6f7404e86182458494e64375e590", 0x2917, GID_FANMADE), + GAME("sq0", "v1.04", "2ad9d1a4624a98571ee77dcc83f231b6", 0x2917, GID_FANMADE), + GAME_PS("sq0", "", "e1a8e4efcce86e1efcaa14633b9eb986", 762, 0x2440, GID_FANMADE, Common::kPlatformCoCo3), GAME("sqx", "v10.0 Feb 05", "c992ae2f8ab18360404efdf16fa9edd1", 0x2917, GID_FANMADE), GAME("sqx", "v10.0 Jul 18", "812edec45cefad559d190ffde2f9c910", 0x2917, GID_FANMADE), GAME_PS("sqx", "", "f0a59044475a5fa37c055d8c3eb4d1a7", 768, 0x2440, GID_FANMADE, Common::kPlatformCoCo3), -- cgit v1.2.3 From 721db3eccb82e27d1169a46b282975534ce106fe Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 19 Jun 2010 15:35:21 +0000 Subject: Fix an issue in String::ensureCapacity() when the string is shared. It could allocate two much memory as it was at least doubling the current capacity even when this one was sufficient. It fixes a crash in GUI::Widget::cleanupHotkey() as the capacity of the string was doubled at each iteration once it was too long for the internal storage (only to add one character to the string). This ended up in a bad_alloc exception after a few iterations. svn-id: r50050 --- common/str.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/str.cpp b/common/str.cpp index 5e771c8b4d..50b9bdb879 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -151,7 +151,11 @@ void String::ensureCapacity(uint32 new_size, bool keep_old) { // We need to allocate storage on the heap! // Compute a suitable new capacity limit - newCapacity = MAX(curCapacity * 2, computeCapacity(new_size+1)); + // If the current capacity is sufficient we use the same capacity + if (new_size < curCapacity) + newCapacity = curCapacity; + else + newCapacity = MAX(curCapacity * 2, computeCapacity(new_size+1)); // Allocate new storage newStorage = new char[newCapacity]; -- cgit v1.2.3 From 3b6fac3703a76192022bfbf8bc513f424ee1872c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 19 Jun 2010 17:06:37 +0000 Subject: Comment out rule for common/messages.cpp for now and make update-translations update common/messages.cpp directly. svn-id: r50051 --- po/module.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/po/module.mk b/po/module.mk index c9b0e6c1f4..0159759c4d 100644 --- a/po/module.mk +++ b/po/module.mk @@ -32,11 +32,12 @@ updatepot: mv -f $@.new $@; \ fi; -$(srcdir)/common/messages.cpp: $(POFILES) - perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp +#$(srcdir)/common/messages.cpp: $(POFILES) +# perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp -update-translations: updatepot $(srcdir)/common/messages.cpp +update-translations: updatepot $(POFILES) @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) @rm -f messages.mo + perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp .PHONY: updatepot update-translations -- cgit v1.2.3 From 78068df9084867faef35a1ada3abe3c4bb764a13 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 19 Jun 2010 17:08:17 +0000 Subject: Whoops copy&paste mistake... svn-id: r50052 --- po/module.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/module.mk b/po/module.mk index 0159759c4d..7ed9499593 100644 --- a/po/module.mk +++ b/po/module.mk @@ -38,6 +38,6 @@ updatepot: update-translations: updatepot $(POFILES) @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) @rm -f messages.mo - perl $(srcdir)/tools/po2c $^ > $(srcdir)/common/messages.cpp + perl $(srcdir)/tools/po2c $(POFILES) > $(srcdir)/common/messages.cpp .PHONY: updatepot update-translations -- cgit v1.2.3 From 26e4e0e345bbfb5b84a53a023b9b78207f859cc7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 17:12:17 +0000 Subject: SCI: cleanup view decompression code svn-id: r50053 --- engines/sci/graphics/view.cpp | 131 +++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 6c0f6fda75..7c33f87a14 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -323,78 +323,41 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou memset(outPtr + pixelNo, pixel & 0x0F, MIN(runLength, pixelCount - pixelNo)); pixelNo += runLength; } - return; - } - - rlePtr = _resourceData + celInfo->offsetRLE; - if (!celInfo->offsetLiteral) { // no additional literal data - if (_resMan->isAmiga32color()) { - // decompression for amiga views - while (pixelNo < pixelCount) { - pixel = *rlePtr++; - if (pixel & 0x07) { // fill with color - runLength = pixel & 0x07; - pixel = pixel >> 3; - while (runLength-- && pixelNo < pixelCount) { - outPtr[pixelNo++] = pixel; - } - } else { // fill with transparent - runLength = pixel >> 3; - pixelNo += runLength; - } - } - return; - } else { - // decompression for data that has just one combined stream - while (pixelNo < pixelCount) { - pixel = *rlePtr++; - runLength = pixel & 0x3F; - switch (pixel & 0xC0) { - case 0: // copy bytes as-is - while (runLength-- && pixelNo < pixelCount) - outPtr[pixelNo++] = *rlePtr++; - break; - case 0x80: // fill with color - memset(outPtr + pixelNo, *rlePtr++, MIN(runLength, pixelCount - pixelNo)); - pixelNo += runLength; - break; - case 0xC0: // fill with transparent - pixelNo += runLength; - break; - } - } - return; - } } else { - literalPtr = _resourceData + celInfo->offsetLiteral; - if (celInfo->offsetRLE) { - if (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1) { - // Crazy-Ass compression for SCI1.1+ Mac + // we skip over transparent pixels, so the buffer needs to be already filled with it + // also some RLE compressed cels are possibly ending with the last non-transparent pixel + // (is this even possible with the current code?) + memset(outPtr, _loop[loopNo].cel[celNo].clearKey, pixelCount); + + rlePtr = _resourceData + celInfo->offsetRLE; + if (!celInfo->offsetLiteral) { // no additional literal data + if (_resMan->isAmiga32color()) { + // decompression for amiga views while (pixelNo < pixelCount) { - uint32 pixelLine = pixelNo; - runLength = *rlePtr++; - pixelNo += runLength; - runLength = *rlePtr++; - while (runLength-- && pixelNo < pixelCount) { - outPtr[pixelNo] = *literalPtr++; - if (outPtr[pixelNo] == 255) - outPtr[pixelNo] = 0; - pixelNo++; + pixel = *rlePtr++; + if (pixel & 0x07) { // fill with color + runLength = pixel & 0x07; + pixel = pixel >> 3; + while (runLength-- && pixelNo < pixelCount) { + outPtr[pixelNo++] = pixel; + } + } else { // fill with transparent + runLength = pixel >> 3; + pixelNo += runLength; } - pixelNo = pixelLine + celInfo->width; } } else { - // decompression for data that has separate rle and literal streams + // decompression for data that has just one combined stream while (pixelNo < pixelCount) { pixel = *rlePtr++; runLength = pixel & 0x3F; switch (pixel & 0xC0) { case 0: // copy bytes as-is while (runLength-- && pixelNo < pixelCount) - outPtr[pixelNo++] = *literalPtr++; + outPtr[pixelNo++] = *rlePtr++; break; case 0x80: // fill with color - memset(outPtr + pixelNo, *literalPtr++, MIN(runLength, pixelCount - pixelNo)); + memset(outPtr + pixelNo, *rlePtr++, MIN(runLength, pixelCount - pixelNo)); pixelNo += runLength; break; case 0xC0: // fill with transparent @@ -404,12 +367,50 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou } } } else { - // literal stream only, so no compression - memcpy(outPtr, literalPtr, pixelCount); + literalPtr = _resourceData + celInfo->offsetLiteral; + if (celInfo->offsetRLE) { + if (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1) { + // Crazy-Ass compression for SCI1.1+ Mac + while (pixelNo < pixelCount) { + uint32 pixelLine = pixelNo; + runLength = *rlePtr++; + pixelNo += runLength; + runLength = *rlePtr++; + while (runLength-- && pixelNo < pixelCount) { + outPtr[pixelNo] = *literalPtr++; + if (outPtr[pixelNo] == 255) + outPtr[pixelNo] = 0; + pixelNo++; + } + pixelNo = pixelLine + celInfo->width; + } + } else { + // decompression for data that has separate rle and literal streams + while (pixelNo < pixelCount) { + pixel = *rlePtr++; + runLength = pixel & 0x3F; + switch (pixel & 0xC0) { + case 0: // copy bytes as-is + while (runLength-- && pixelNo < pixelCount) + outPtr[pixelNo++] = *literalPtr++; + break; + case 0x80: // fill with color + memset(outPtr + pixelNo, *literalPtr++, MIN(runLength, pixelCount - pixelNo)); + pixelNo += runLength; + break; + case 0xC0: // fill with transparent + pixelNo += runLength; + break; + } + } + } + } else { + // literal stream only, so no compression + memcpy(outPtr, literalPtr, pixelCount); + pixelNo = pixelCount; + } } - return; } - error("Unable to decompress view"); } byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { @@ -425,9 +426,7 @@ byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { _loop[loopNo].cel[celNo].rawBitmap = new byte[pixelCount]; byte *pBitmap = _loop[loopNo].cel[celNo].rawBitmap; - // Some RLE compressed cels end with the last non-transparent pixel, thats why we fill it up here - // FIXME: change this to fill the remaining bytes within unpackCel() - memset(pBitmap, _loop[loopNo].cel[celNo].clearKey, pixelCount); + // unpack the actual cel bitmap data unpackCel(loopNo, celNo, pBitmap, pixelCount); if (!_resMan->isVGA()) { -- cgit v1.2.3 From ab4e02422cda7ba436c667bf4a3758a4588f170a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 17:43:13 +0000 Subject: SCI: free channels for channel remapping on stop and pause, instead of dispose - fixes qfg3 demo going out of channels svn-id: r50054 --- engines/sci/sound/music.cpp | 29 ++++++++++++++++++----------- engines/sci/sound/music.h | 1 + 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index f6a4d5beb4..96257b1f9d 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -250,6 +250,14 @@ int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { error("no free channels"); } +void SciMusic::freeChannels(MusicEntry *caller) { + // Remove used channels + for (int i = 0; i < 15; i++) { + if (_usedChannel[i] == caller) + _usedChannel[i] = 0; + } +} + void SciMusic::onTimer() { const MusicList::iterator end = _playList.end(); for (MusicList::iterator i = _playList.begin(); i != end; ++i) @@ -334,10 +342,12 @@ void SciMusic::soundStop(MusicEntry *pSnd) { if (pSnd->pStreamAud) _pMixer->stopHandle(pSnd->hCurrentAud); - _mutex.lock(); - if (pSnd->pMidiParser) + if (pSnd->pMidiParser) { + _mutex.lock(); pSnd->pMidiParser->stop(); - _mutex.unlock(); + freeChannels(pSnd); + _mutex.unlock(); + } } void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) { @@ -379,11 +389,6 @@ void SciMusic::soundKill(MusicEntry *pSnd) { _mutex.lock(); uint sz = _playList.size(), i; - // Remove used channels - for (i = 0; i < 15; i++) { - if (_usedChannel[i] == pSnd) - _usedChannel[i] = 0; - } // Remove sound from playlist for (i = 0; i < sz; i++) { if (_playList[i] == pSnd) { @@ -404,10 +409,12 @@ void SciMusic::soundPause(MusicEntry *pSnd) { if (pSnd->pStreamAud) { _pMixer->pauseHandle(pSnd->hCurrentAud, true); } else { - _mutex.lock(); - if (pSnd->pMidiParser) + if (pSnd->pMidiParser) { + _mutex.lock(); pSnd->pMidiParser->pause(); - _mutex.unlock(); + freeChannels(pSnd); + _mutex.unlock(); + } } } diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 8e68d3df92..cd6dcbc317 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -195,6 +195,7 @@ public: Common::Mutex _mutex; int16 tryToOwnChannel(MusicEntry *caller, int16 bestChannel); + void freeChannels(MusicEntry *caller); protected: void sortPlayList(); -- cgit v1.2.3 From 996bd693e0ad45d5d5d599b6d5e320c1f52afe8a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 19:04:35 +0000 Subject: SCI: resume when unable to locate base objects - fixes loading some saved games svn-id: r50055 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index eba5e67cb6..fb79056e0c 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -776,7 +776,7 @@ void SegManager::reconstructScripts(EngineState *s) { if (getSciVersion() < SCI_VERSION_1_1) { if (!obj->initBaseObject(this, addr, false)) { - error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); //scr->scriptObjRemove(addr); } } -- cgit v1.2.3 From ed50ecd62d21e728480710e64aea79c5d132ac77 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 19:06:58 +0000 Subject: SCI: make channel remapping stop using channel 0 for mt32 - fixes playback accordingly (like lsl1 at the start) svn-id: r50056 --- engines/sci/sound/drivers/midi.cpp | 8 ++++++++ engines/sci/sound/drivers/mididriver.h | 1 + engines/sci/sound/music.cpp | 5 ++++- engines/sci/sound/music.h | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index b97564342c..625874eea1 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -55,6 +55,7 @@ public: bool hasRhythmChannel() const { return true; } byte getPlayId(); int getPolyphony() const { return kVoices; } + int getFirstChannel(); void setVolume(byte volume); int getVolume(); void setReverb(byte reverb); @@ -317,6 +318,13 @@ void MidiPlayer_Midi::send(uint32 b) { } } +// We return 1 for mt32, because if we remap channels to 0 for mt32, those won't get played at all +int MidiPlayer_Midi::getFirstChannel() { + if (_isMt32) + return 1; + return 0; +} + void MidiPlayer_Midi::setVolume(byte volume) { _masterVolume = volume; diff --git a/engines/sci/sound/drivers/mididriver.h b/engines/sci/sound/drivers/mididriver.h index 12d3e57f5d..58803db260 100644 --- a/engines/sci/sound/drivers/mididriver.h +++ b/engines/sci/sound/drivers/mididriver.h @@ -86,6 +86,7 @@ public: virtual byte getPlayId() = 0; virtual int getPolyphony() const = 0; + virtual int getFirstChannel() { return 0; }; virtual void setVolume(byte volume) { if(_driver) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 96257b1f9d..6e12ac7409 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -103,6 +103,9 @@ void SciMusic::init() { } _bMultiMidi = ConfMan.getBool("multi_midi"); + + // Find out what the first possible channel is (used, when doing channel remapping) + _driverFirstChannel = _pMidiDrv->getFirstChannel(); } void SciMusic::clearPlayList() { @@ -241,7 +244,7 @@ int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { return bestChannel; } // otherwise look for unused channel - for (int channelNr = 0; channelNr < 15; channelNr++) { + for (int channelNr = _driverFirstChannel; channelNr < 15; channelNr++) { if (!_usedChannel[channelNr]) { _usedChannel[channelNr] = caller; return channelNr; diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index cd6dcbc317..36db9a04bf 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -216,6 +216,8 @@ private: bool _soundOn; byte _masterVolume; MusicEntry *_usedChannel[16]; + + int _driverFirstChannel; }; } // End of namespace Sci -- cgit v1.2.3 From 447f1270139890877ecdc32c06138f88525e1458 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 19:16:42 +0000 Subject: SCI: fixing uninitialized usage in MidiParser_SCI svn-id: r50057 --- engines/sci/sound/midiparser_sci.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 931919b2b5..71d363d172 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -73,9 +73,6 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _pSnd = psnd; _soundVersion = soundVersion; - if (_pSnd) - setVolume(psnd->volume); - for (int i = 0; i < 15; i++) { _channelUsed[i] = false; _channelRemap[i] = -1; @@ -84,6 +81,9 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally + if (_pSnd) + setVolume(psnd->volume); + if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection midiFilterChannels(channelFilterMask); -- cgit v1.2.3 From a845e8b859e215a24e68bfbc5990153faf733548 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 19:39:36 +0000 Subject: SCI: move setVolume down inside loadMusic so that it actually affects the used channels svn-id: r50058 --- engines/sci/sound/midiparser_sci.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 71d363d172..18eaba3de6 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -81,9 +81,6 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally - if (_pSnd) - setVolume(psnd->volume); - if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection midiFilterChannels(channelFilterMask); @@ -91,6 +88,9 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in midiMixChannels(); } + if (_pSnd) + setVolume(_pSnd->volume); + _num_tracks = 1; _tracks[0] = _mixedData; if (_pSnd) -- cgit v1.2.3 From 24459b5842e6cf8ef906e81c9b43c36c657f1119 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 19:47:22 +0000 Subject: SCI: reverting r50058 - we can't actually send to the channels at that time, because we do not own the channels at that point svn-id: r50059 --- engines/sci/sound/midiparser_sci.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 18eaba3de6..99468fe09c 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -81,6 +81,10 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally + // we can't do this later, because otherwise we really send to unmapped channels + if (_pSnd) + setVolume(_pSnd->volume); + if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection midiFilterChannels(channelFilterMask); @@ -88,9 +92,6 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in midiMixChannels(); } - if (_pSnd) - setVolume(_pSnd->volume); - _num_tracks = 1; _tracks[0] = _mixedData; if (_pSnd) -- cgit v1.2.3 From 089f5bba1491be81cebc495a7e5245fe045da323 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 20:00:32 +0000 Subject: SCI: stopping scripts from sending to unused channels manually (fixes sq1vga) svn-id: r50060 --- engines/sci/sound/midiparser_sci.cpp | 20 +++++++++++++++----- engines/sci/sound/midiparser_sci.h | 1 + engines/sci/sound/music.cpp | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 99468fe09c..1cfaadd36d 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -144,6 +144,20 @@ void MidiParser_SCI::unloadMusic() { } } +// this is used for scripts sending direct midi commands to us. we verify in that case that the channel is actually +// used +void MidiParser_SCI::sendManuallyToDriver(uint32 b) { + byte midiChannel = b & 0xf; + + if (!_channelUsed[midiChannel]) { + // scripts trying to send to unused channel + // this happens at least in sq1vga right at the start, it's a script issue + return; + } + + sendToDriver(b); +} + void MidiParser_SCI::sendToDriver(uint32 b) { byte midiChannel = b & 0xf; @@ -161,11 +175,7 @@ void MidiParser_SCI::sendToDriver(uint32 b) { return; // Channel remapping int16 realChannel = _channelRemap[midiChannel]; - if (realChannel == -1) { - // FIXME: Happens in SQ1VGA when the game starts - warning("Attempt to send to uninitialized channel %d", midiChannel); - return; - } + assert(realChannel != -1); b = (b & 0xFFFFFFF0) | realChannel; _driver->send(b); diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index abedafdde0..31a3b923fb 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -80,6 +80,7 @@ public: void sendToDriver(byte status, byte firstOp, byte secondOp) { sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); } + void sendManuallyToDriver(uint32 b); protected: void parseNextEvent(EventInfo &info); diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 6e12ac7409..8499b6da59 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -463,7 +463,7 @@ void SciMusic::sendMidiCommand(uint32 cmd) { void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { if (pSnd->pMidiParser) - pSnd->pMidiParser->sendToDriver(cmd); + pSnd->pMidiParser->sendManuallyToDriver(cmd); else error("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); } -- cgit v1.2.3 From f3b8a5927d16da3a35a55069a9fe9d9e6500a2f8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 20:23:55 +0000 Subject: SCI: fixing another uninitialized variable usage issue - also limiting reset velocity to used channels only, same is true for setting voice count svn-id: r50062 --- engines/sci/sound/midiparser_sci.cpp | 28 ++++++++++++++-------------- engines/sci/sound/midiparser_sci.h | 1 + engines/sci/sound/music.cpp | 5 +++-- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 1cfaadd36d..61e9d81392 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -81,10 +81,6 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally - // we can't do this later, because otherwise we really send to unmapped channels - if (_pSnd) - setVolume(_pSnd->volume); - if (channelFilterMask) { // SCI0 only has 1 data stream, but we need to filter out channels depending on music hardware selection midiFilterChannels(channelFilterMask); @@ -98,24 +94,28 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in setTrack(0); _loopTick = 0; + return true; +} + +void MidiParser_SCI::sendInitCommands() { if (_pSnd) { if (_soundVersion <= SCI_VERSION_0_LATE) { // Set initial voice count - for (int i = 0; i < 16; ++i) { + for (int i = 0; i < 15; ++i) { byte voiceCount = 0; - if (channelFilterMask & (1 << i)) - voiceCount = psnd->soundRes->getInitialVoiceCount(i); - _driver->send(0xB0 | i, 0x4B, voiceCount); + if (_channelUsed[i]) { + voiceCount = _pSnd->soundRes->getInitialVoiceCount(i); + _driver->send(0xB0 | i, 0x4B, voiceCount); + } } } - - // Send a velocity off signal to all channels - for (int i = 0; i < 16; ++i) { - _driver->send(0xB0 | i, 0x4E, 0); // Reset velocity - } } - return true; + // Send a velocity off signal to all channels + for (int i = 0; i < 15; ++i) { + if (_channelUsed[i]) + sendToDriver(0xB0 | i, 0x4E, 0); // Reset velocity + } } void MidiParser_SCI::unloadMusic() { diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 31a3b923fb..48de44555d 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -59,6 +59,7 @@ public: bool loadMusic(byte *, uint32) { return false; } + void sendInitCommands(); void unloadMusic(); void setVolume(byte volume); void stop() { diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 8499b6da59..8da0557a31 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -326,9 +326,10 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { if (pSnd->pMidiParser) { pSnd->pMidiParser->tryToOwnChannels(); pSnd->pMidiParser->setVolume(pSnd->volume); - if (pSnd->status == kSoundStopped) + if (pSnd->status == kSoundStopped) { + pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->jumpToTick(0); - else + } else // Fast forward to the last position and perform associated events when loading pSnd->pMidiParser->jumpToTick(pSnd->ticker, true); } -- cgit v1.2.3 From ef67a37b5498fd256533369f2c8e531887d2b6f6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 20:37:53 +0000 Subject: SCI: fixing last uninitialized variable issue in MidiParser_SCI (hopefully) svn-id: r50063 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 61e9d81392..31d9d95116 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -73,7 +73,7 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _pSnd = psnd; _soundVersion = soundVersion; - for (int i = 0; i < 15; i++) { + for (int i = 0; i < 16; i++) { _channelUsed[i] = false; _channelRemap[i] = -1; _channelMuted[i] = false; -- cgit v1.2.3 From b0a36849daaf02ba01e2a0603569b20a608250e0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 21:15:58 +0000 Subject: SCI: locking _mutex inside SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) svn-id: r50065 --- engines/sci/sound/music.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 8da0557a31..688b88a910 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -463,6 +463,7 @@ void SciMusic::sendMidiCommand(uint32 cmd) { } void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { + Common::StackLock lock(_mutex); if (pSnd->pMidiParser) pSnd->pMidiParser->sendManuallyToDriver(cmd); else -- cgit v1.2.3 From 87132bd411c760812ef2b5b65c11115d689de52b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 19 Jun 2010 22:14:15 +0000 Subject: SCI: changing error to warning in ResMan::detectViewType() svn-id: r50067 --- engines/sci/resource.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index a4eff573ab..745cad7029 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1756,7 +1756,8 @@ ViewType ResourceManager::detectViewType() { } } - error("resMan: Couldn't find any views"); + // this may happen if there are serious system issues (or trying to add a broken game) + warning("resMan: Couldn't find any views"); return kViewUnknown; } -- cgit v1.2.3 From f2983093e83425d7a5b14cbb43b1ba2d995e29f4 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 19 Jun 2010 22:56:58 +0000 Subject: Add nearly complete french translation. I tried to make it work also in 320x200 but french can be quite verbose, so in a few places it does not fit. Also I could not check any of the device specific strings (e.g. from WinCE, Wii or other backends) and a few are missing. svn-id: r50068 --- common/messages.cpp | 324 ++++++++++- po/fr_FR.po | 1497 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1819 insertions(+), 2 deletions(-) create mode 100644 po/fr_FR.po diff --git a/common/messages.cpp b/common/messages.cpp index 6a835845ae..970990d56e 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -335,7 +335,7 @@ struct _po2c_msg { }; static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-17 20:57+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, @@ -660,8 +660,327 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { -1, NULL } }; +static struct _po2c_msg _po2c_lang_fr_FR[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, + { 1, "Voulez-vous vraiment quitter?" }, + { 2, "Recherche d'un plugin supportant cet ID..." }, + { 3, "D\351marrage de '%s'\n" }, + { 4, "(Actif)" }, + { 5, "(Jeu)" }, + { 6, "(Global)" }, + { 7, "Le plugin %s a \351chou\351 dans l'instanciation du moteur de jeu: %s (cible '%s', chemin '%s')" }, + { 8, "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour obtenir la liste des ID reconnus" }, + { 9, ", \351chec du montage du disque partag\351" }, + { 10, ", disque partag\351 non mont\351" }, + { 11, "... en cours ..." }, + { 12, "11 kHz" }, + { 13, "22 kHz" }, + { 14, "44 kHz" }, + { 15, "48 kHz" }, + { 16, "8 kHz" }, + { 17, "" }, + { 18, "ALSA" }, + { 19, "\300 propos de ScummVM" }, + { 20, "AdLib" }, + { 21, "\311mulateur AdLib:" }, + { 22, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, + { 23, "Ajouter..." }, + { 24, "Anti-cr\351nel\351 (16 bpp)" }, + { 25, "Correction du rapport d'aspect" }, + { 26, "Touche associ\351e: %s" }, + { 27, "Touche associ\351e: aucune" }, + { 28, "MIDI Atari ST" }, + { 29, "Audio" }, + { 30, "Sauvegarde auto:" }, + { 31, "\300 ~P~ropos..." }, + { 32, "Affecter les touches" }, + { 33, "Les deux" }, + { 34, "Luminosit\351:" }, + { 35, "C1Moteurs disponibles:" }, + { 36, "C1Options incluses:" }, + { 37, "C2(compil\351 sur" }, + { 38, "CAMD" }, + { 39, "Annuler" }, + { 40, "Impossible de cr\351er le fichier" }, + { 41, "Change les options du jeu" }, + { 42, "Change les options globales de ScummVM" }, + { 43, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, + { 44, "Choisir" }, + { 45, "S\351lectionnez une action \340 affecter" }, + { 46, "Effacer la valeur" }, + { 47, "Fermer" }, + { 48, "CoreAudio" }, + { 49, "CoreMIDI" }, + { 50, "Corrige le rapport d'aspect pour les jeu 320x200" }, + { 51, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, + { 52, "Creative Music System" }, + { 53, "Mode vid\351o actuel" }, + { 54, "Bas" }, + { 55, "Gauche" }, + { 56, "Droit" }, + { 57, "Haut" }, + { 58, "DMedia" }, + { 59, "DVD" }, + { 60, "DVD mont\351 avec succ\350s" }, + { 61, "DVD non mont\351" }, + { 62, "Date:" }, + { 63, "Debugger" }, + { 64, "D\351faut" }, + { 65, "Supprimer" }, + { 66, "D\351sactiv\351 l'extinction" }, + { 67, "GFX d\351sactiv\351" }, + { 68, "%d nouveaux jeux trouv\351s ..." }, + { 69, "%d nouveaux jeux trouv\351s." }, + { 70, "Affichage" }, + { 71, "Afficher le clavier" }, + { 72, "Voulez-vous vraiment supprimer cette sauvegarde?" }, + { 73, "Voulez-vous vraiment supprimer ce jeu?" }, + { 74, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, + { 75, "Voulez-vous charger ou sauver le jeu?" }, + { 76, "Voulez-vous ex\351cuter une recherche automatique?" }, + { 77, "Voulez-vous quitter?" }, + { 78, "Coup double" }, + { 79, "Bas" }, + { 80, "Activer le mode Roland GS" }, + { 81, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, + { 82, "Anglais" }, + { 83, "Erreur lors de l'\351x\351cution du jeu:" }, + { 84, "\311chec du montage du DVD" }, + { 85, "Extra:" }, + { 86, "FM Towns" }, + { 87, "Aucun th\350me GUI n'a pu \352tre charg\351; abandon" }, + { 88, "Mode rapide" }, + { 89, "FluidSynth" }, + { 91, "Nom complet du jeu" }, + { 92, "Plein \351cran" }, + { 93, "Acceleration du pad GC:" }, + { 94, "Sensibilit\351 du pad GC:" }, + { 95, "GFX" }, + { 96, "Langue:" }, + { 97, "Interface:" }, + { 98, "Jeu" }, + { 99, "Fichier de don\351es introuvable" }, + { 100, "ID de jeu non support\351" }, + { 101, "Chemin du Jeu:" }, + { 102, "Menu global" }, + { 103, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, + { 104, "Remonter" }, + { 105, "Graphique" }, + { 106, "Mode graphique:" }, + { 107, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 108, "Cach\351 la barre d'outils" }, + { 109, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, + { 110, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, + { 111, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, + { 113, "IBM PCjr" }, + { 114, "ID:" }, + { 115, "Initialiser le r\351seau" }, + { 116, "\311chelle initiale de l'\351cran du haut" }, + { 117, "Initialisation du r\351seau" }, + { 118, "Entr\351e" }, + { 119, "Chemin Invalide" }, + { 120, "Affectation des touches" }, + { 121, "Clavier" }, + { 122, "Affectation des touches:" }, + { 123, "Touches" }, + { 124, "Langue de l'interface graphique de ScummVM" }, + { 125, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, + { 126, "Langue:" }, + { 127, "Gauche" }, + { 128, "Clic Gauche" }, + { 129, "Charger" }, + { 130, "Charger le jeu:" }, + { 131, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, + { 132, "MIDI" }, + { 133, "Gain MIDI:" }, + { 134, "\311mulation MT-32" }, + { 135, "\311chelle de l'\351cran principal" }, + { 136, "Affecter" }, + { 137, "Ajout Massif..." }, + { 138, "Menu" }, + { 139, "Divers" }, + { 140, "Mode mixe AdLib/MIDI" }, + { 141, "Monter le DVD" }, + { 142, "Monter SMB" }, + { 143, "Clic de souris" }, + { 145, "Pilote audio:" }, + { 146, "Volume Musique:" }, + { 147, "Silence" }, + { 148, "Nom:" }, + { 149, "R\351seau d\351connect\351" }, + { 150, "R\351seau non initialis\351 (%d)" }, + { 151, "R\351seau connect\351" }, + { 152, "R\351seau connect\351, disque partag\351 mont\351" }, + { 153, "Jamais" }, + { 154, "Non" }, + { 155, "Date non sauv\351e" }, + { 156, "Pas de musique" }, + { 157, "Dur\351e de jeu non sauv\351e" }, + { 158, "Heure non sauv\351e" }, + { 159, "Aucun" }, + { 160, "OK" }, + { 161, "Ok" }, + { 162, "Fr\351quence:" }, + { 163, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, + { 164, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, + { 165, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, + { 166, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, + { 167, "Haut Parleur PC" }, + { 168, "Mot de passe:" }, + { 169, "Chemin n'est pas un r\351pertoire" }, + { 170, "Chemin n'est pas un fichier" }, + { 171, "Chemin inexistant" }, + { 172, "Chemins" }, + { 173, "Mettre en pause" }, + { 174, "Choisissez le jeu:" }, + { 175, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 176, "Plateforme:" }, + { 177, "Dur\351e de jeu:" }, + { 178, "Selectionnez une action" }, + { 179, "Plugins:" }, + { 180, "Appuyez sur la touche \340 associer" }, + { 181, "Quitter" }, + { 182, "Quitter ScummVM" }, + { 183, "V\351roulli\351 en lecture" }, + { 184, "Echec de la lecture" }, + { 185, "Changer l'affectation des touches" }, + { 186, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 187, "Mode de rendu:" }, + { 188, "Droite" }, + { 189, "Clic Droit" }, + { 190, "Clic droit" }, + { 191, "Pivoter" }, + { 192, "SEQ" }, + { 193, "Volume Bruitage:" }, + { 194, "SMB" }, + { 195, "Sauver" }, + { 196, "Sauvegardes:" }, + { 197, "Sauvegardes:" }, + { 198, "Sauvegarde:" }, + { 199, "Examen termin\351!" }, + { 200, "%d r\351pertoires examin\351s ..." }, + { 201, "Menu Principal ScummVM" }, + { 202, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 203, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 204, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 205, "Recherche dans la liste de jeux" }, + { 206, "Filtre:" }, + { 207, "Choisir une banque de sons" }, + { 208, "S\351lectionnez un Th\350me" }, + { 209, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 210, "Selectionez une action et cliquez 'Affecter'" }, + { 211, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 212, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 213, "S\351lectionner le r\351pertoire des plugins" }, + { 214, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 215, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 216, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 217, "Sensibilit\351" }, + { 218, "Serveur:" }, + { 219, "Disque partag\351:" }, + { 220, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 221, "Afficher le clavier" }, + { 222, "Afficher le curseur de la souris" }, + { 223, "Affiche les sous-titres et joue les dialogues audio" }, + { 224, "Afficher/Cacher le curseur" }, + { 225, "Passer" }, + { 226, "Passer la phrase" }, + { 227, "Sauter le texte" }, + { 228, "Aligner sur les bords" }, + { 229, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 230, "Audio marche/arr\352t" }, + { 231, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 232, "Banque de sons:" }, + { 233, "Audio" }, + { 234, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 235, "Volume des effets sp\351ciaux sonores" }, + { 236, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 237, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 238, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 239, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 240, "Audio" }, + { 241, "Volume Dialogues:" }, + { 242, "Standard (16bpp)" }, + { 243, "D\351marre le jeu s\351lectionn\351" }, + { 244, "Status:" }, + { 245, "Subs" }, + { 246, "Vitesse des ST:" }, + { 247, "Sous-titres" }, + { 249, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 250, "Tapwave Zodiac" }, + { 251, "Dialogue:" }, + { 252, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 253, "Th\350mes:" }, + { 254, "Th\350me:" }, + { 255, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 256, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 257, "TiMidity" }, + { 258, "Heure:" }, + { 259, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 260, "D\351calage X du toucher" }, + { 261, "D\351callage Y du toucher" }, + { 262, "Mode touchpad d\351sactiv\351" }, + { 263, "Mode touchpad activ\351" }, + { 264, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 265, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 266, "Inconue" }, + { 267, "Erreur inconnue" }, + { 268, "D\351monter le DVD" }, + { 269, "D\351monter SMB" }, + { 270, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 271, "Mode de couleurs non support\351" }, + { 272, "Sauvegarde sans nom" }, + { 273, "Haut" }, + { 274, "Utiliser \340 la fois MIDI et AdLib" }, + { 275, "Activer le contr\364le du curseur de type trackpad" }, + { 276, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, + { 277, "Nom d'utilisateur:" }, + { 278, "Utilise le pilote SDL" }, + { 280, "Vid\351o" }, + { 281, "Clavier virtuel" }, + { 282, "Volume" }, + { 283, "MIDI Windows" }, + { 284, "Verrouill\351 en \351criture" }, + { 285, "Echec de l'\351criture des donn\351es" }, + { 286, "Yamaha Pa1" }, + { 287, "Oui" }, + { 288, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 289, "Zone" }, + { 292, "Toutes les 10 mins" }, + { 293, "Toutes les 15 mins" }, + { 294, "Toutes les 30 mins" }, + { 295, "Toutes les 5 mins" }, + { 296, "Echec\n" }, + { 297, "\300 ~P~ropos" }, + { 298, "~A~jouter..." }, + { 299, "~A~nnuler" }, + { 300, "~F~ermer" }, + { 301, "~E~diter..." }, + { 302, "~A~ide" }, + { 303, "Contr\364le des combats d'~I~ndy" }, + { 304, "~T~ouches" }, + { 305, "Mode ~G~aucher" }, + { 306, "~C~harger" }, + { 307, "~C~harger" }, + { 308, "~S~uivant" }, + { 309, "~O~K" }, + { 310, "~O~ptions" }, + { 311, "~O~ptions..." }, + { 312, "~P~r\351c\351dent" }, + { 313, "~Q~uitter" }, + { 314, "~S~upprimer" }, + { 315, "~R~eprendre" }, + { 316, "Retour au ~L~anceur" }, + { 317, "~S~auver" }, + { 318, "~D~\351marrer" }, + { 319, "T~r~ansitions activ\351" }, + { 320, "~E~ffets de l'Eau activ\351s" }, + { 321, "Mode ~Z~ip Activ\351" }, + { -1, NULL } +}; + static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-17 20:57+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, { 20, "Hang" }, { 21, "AdLib vezet :" }, @@ -724,6 +1043,7 @@ static struct { struct _po2c_msg * msgs; } _po2c_langs[] = { { "ru_RU", "cp1251", _po2c_lang_ru_RU }, + { "fr_FR", "iso-8859-1", _po2c_lang_fr_FR }, { "hu_HU", "cp1250", _po2c_lang_hu_HU }, { NULL, NULL, NULL } }; diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100644 index 0000000000..8a771a69c0 --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,1497 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ScummVM Team +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-19 22:36+0100\n" +"PO-Revision-Date: 2010-06-19 23:43+0100\n" +"Last-Translator: Thierry Crozat \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" + +#: gui/about.cpp:96 +msgid "C2(built on " +msgstr "C2(compilé sur" + +#: gui/about.cpp:104 +msgid "C1Features compiled in:" +msgstr "C1Options incluses:" + +#: gui/about.cpp:111 +msgid "C1Available engines:" +msgstr "C1Moteurs disponibles:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Remonter" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" + +#: gui/browser.cpp:70 +#: gui/chooser.cpp:49 +#: gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 +#: gui/massadd.cpp:95 +#: gui/options.cpp:879 +#: gui/saveload.cpp:65 +#: gui/saveload.cpp:157 +#: gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "Annuler" + +#: gui/browser.cpp:71 +#: gui/chooser.cpp:50 +#: gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Choisir" + +#: gui/GuiManager.cpp:76 +msgid "Failed to load any GUI theme, aborting" +msgstr "Aucun thème GUI n'a pu être chargé; abandon" + +#: gui/GuiManager.cpp:102 +#: backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "Fermer" + +#: gui/GuiManager.cpp:105 +msgid "Mouse click" +msgstr "Clic de souris" + +#: gui/GuiManager.cpp:108 +#: base/main.cpp:284 +msgid "Display keyboard" +msgstr "Afficher le clavier" + +#: gui/GuiManager.cpp:111 +#: base/main.cpp:287 +msgid "Remap keys" +msgstr "Changer l'affectation des touches" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "Affecter" + +#: gui/KeysDialog.cpp:45 +#: gui/launcher.cpp:267 +#: gui/launcher.cpp:873 +#: gui/launcher.cpp:877 +#: gui/massadd.cpp:92 +#: gui/options.cpp:880 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "Selectionez une action et cliquez 'Affecter'" + +#: gui/KeysDialog.cpp:83 +#: gui/KeysDialog.cpp:105 +#: gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "Touche associée: %s" + +#: gui/KeysDialog.cpp:85 +#: gui/KeysDialog.cpp:107 +#: gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "Touche associée: aucune" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "Selectionnez une action" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "Appuyez sur la touche à associer" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "Sélectionnez une action à affecter" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Jeu" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:173 +#: gui/launcher.cpp:174 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Nom:" + +#: gui/launcher.cpp:177 +#: gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Nom complet du jeu" + +#: gui/launcher.cpp:181 +msgid "Language:" +msgstr "Langue:" + +#: gui/launcher.cpp:181 +#: gui/launcher.cpp:182 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." + +#: gui/launcher.cpp:183 +#: gui/launcher.cpp:194 +#: gui/options.cpp:79 +#: gui/options.cpp:598 +#: gui/options.cpp:608 +#: gui/options.cpp:860 +#: sound/mididrv.cpp:60 +msgid "" +msgstr "" + +#: gui/launcher.cpp:192 +msgid "Platform:" +msgstr "Plateforme:" + +#: gui/launcher.cpp:192 +#: gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "Plateforme pour laquelle votre jeu a été conçu" + +#: gui/launcher.cpp:204 +#: gui/options.cpp:767 +#: gui/options.cpp:784 +msgid "Graphics" +msgstr "Graphique" + +#: gui/launcher.cpp:204 +#: gui/options.cpp:767 +#: gui/options.cpp:784 +msgid "GFX" +msgstr "GFX" + +#: gui/launcher.cpp:206 +msgid "Override global graphic settings" +msgstr "Utiliser des réglages graphiques spécifique à ce jeux" + +#: gui/launcher.cpp:213 +#: gui/options.cpp:790 +msgid "Audio" +msgstr "Audio" + +#: gui/launcher.cpp:215 +msgid "Override global audio settings" +msgstr "Utiliser des réglages audio spécifique à ce jeux" + +#: gui/launcher.cpp:223 +#: gui/options.cpp:794 +msgid "Volume" +msgstr "Volume" + +#: gui/launcher.cpp:225 +msgid "Override global volume settings" +msgstr "Utiliser des réglages de volume sonore spécifique à ce jeux" + +#: gui/launcher.cpp:232 +#: gui/options.cpp:802 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:234 +msgid "Override global MIDI settings" +msgstr "Utiliser des réglages MIDI spécifique à ce jeux" + +#: gui/launcher.cpp:244 +#: gui/options.cpp:808 +msgid "Paths" +msgstr "Chemins" + +#: gui/launcher.cpp:250 +msgid "Game Path:" +msgstr "Chemin du Jeu:" + +#: gui/launcher.cpp:254 +#: gui/options.cpp:821 +msgid "Extra Path:" +msgstr "Extra:" + +#: gui/launcher.cpp:254 +#: gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu" + +#: gui/launcher.cpp:258 +msgid "Save Path:" +msgstr "Sauvegardes:" + +#: gui/launcher.cpp:258 +#: gui/launcher.cpp:259 +#: gui/options.cpp:815 +#: gui/options.cpp:816 +msgid "Specifies where your savegames are put" +msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" + +#: gui/launcher.cpp:275 +#: gui/launcher.cpp:353 +#: gui/launcher.cpp:398 +#: gui/options.cpp:227 +#: gui/options.cpp:384 +#: gui/options.cpp:470 +#: gui/options.cpp:526 +#: gui/options.cpp:666 +#: gui/options.cpp:819 +#: gui/options.cpp:822 +#: gui/options.cpp:826 +#: gui/options.cpp:903 +#: gui/options.cpp:909 +#: gui/options.cpp:915 +#: gui/options.cpp:923 +#: gui/options.cpp:947 +#: gui/options.cpp:951 +#: gui/options.cpp:957 +#: gui/options.cpp:964 +#: gui/options.cpp:1063 +msgid "None" +msgstr "Aucun" + +#: gui/launcher.cpp:280 +#: gui/launcher.cpp:357 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "Défaut" + +#: gui/launcher.cpp:391 +#: gui/options.cpp:1057 +msgid "Select SoundFont" +msgstr "Choisir une banque de sons" + +#: gui/launcher.cpp:410 +#: gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Sélectionner le répertoire contenant les données du jeu" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Sélectionner un répertoire supplémentaire" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Sélectionner le répertoire pour les sauvegardes" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." + +#: gui/launcher.cpp:500 +#: engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~Q~uitter" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "Quitter ScummVM" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "À ~P~ropos..." + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "À propos de ScummVM" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~O~ptions..." + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "Change les options globales de ScummVM" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "~D~émarrer" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Démarre le jeu sélectionné" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~C~harger" + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "Charge une sauvegarde pour le jeu sélectionné" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "~A~jouter..." + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "~E~diter..." + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "Change les options du jeu" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "~S~upprimer" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Supprime le jeu de la liste. Les fichiers sont conservés" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "Recherche dans la liste de jeux" + +#: gui/launcher.cpp:526 +#: gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Filtre:" + +#: gui/launcher.cpp:529 +#: gui/options.cpp:667 +msgid "Clear value" +msgstr "Effacer la valeur" + +#: gui/launcher.cpp:551 +#: engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Charger le jeu:" + +#: gui/launcher.cpp:551 +#: engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "Charger" + +#: gui/launcher.cpp:660 +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." + +#: gui/launcher.cpp:661 +#: gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "Oui" + +#: gui/launcher.cpp:661 +#: gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "Non" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM n'a pas pu ouvrir le répertoire sélectionné." + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM n'a pas trouvé de jeux dans le répertoire sélectionné." + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Choisissez le jeu:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Voulez-vous vraiment supprimer ce jeu?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM n'a pas pu trouvé de moteur pour lancer le jeu sélectionné." + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Ajout Massif..." + +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Ajouter..." + +#: gui/massadd.cpp:79 +#: gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... en cours ..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "Examen terminé!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "%d nouveaux jeux trouvés." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "%d répertoires examinés ..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "%d nouveaux jeux trouvés ..." + +#: gui/options.cpp:77 +msgid "Never" +msgstr "Jamais" + +#: gui/options.cpp:77 +msgid "every 5 mins" +msgstr "Toutes les 5 mins" + +#: gui/options.cpp:77 +msgid "every 10 mins" +msgstr "Toutes les 10 mins" + +#: gui/options.cpp:77 +msgid "every 15 mins" +msgstr "Toutes les 15 mins" + +#: gui/options.cpp:77 +msgid "every 30 mins" +msgstr "Toutes les 30 mins" + +#: gui/options.cpp:79 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:79 +msgid "11kHz" +msgstr "11 kHz" + +#: gui/options.cpp:79 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:79 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:79 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "Mode graphique:" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "Mode de rendu:" + +#: gui/options.cpp:606 +#: gui/options.cpp:607 +msgid "Special dithering modes supported by some games" +msgstr "Mode spécial de tramage supporté par certains jeux" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "Plein écran" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "Correction du rapport d'aspect" + +#: gui/options.cpp:619 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Corrige le rapport d'aspect pour les jeu 320x200" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "Pilote audio:" + +#: gui/options.cpp:626 +#: gui/options.cpp:627 +msgid "Specifies output sound device or sound card emulator" +msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" + +#: gui/options.cpp:642 +msgid "AdLib emulator:" +msgstr "Émulateur AdLib:" + +#: gui/options.cpp:642 +#: gui/options.cpp:643 +msgid "AdLib is used for music in many games" +msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" + +#: gui/options.cpp:653 +msgid "Output rate:" +msgstr "Fréquence:" + +#: gui/options.cpp:653 +#: gui/options.cpp:654 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son" + +#: gui/options.cpp:665 +msgid "SoundFont:" +msgstr "Banque de sons:" + +#: gui/options.cpp:665 +#: gui/options.cpp:666 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity" + +#: gui/options.cpp:670 +msgid "Mixed AdLib/MIDI mode" +msgstr "Mode mixe AdLib/MIDI" + +#: gui/options.cpp:670 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Utiliser à la fois MIDI et AdLib" + +#: gui/options.cpp:673 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Roland MT-32 exacte (désactive l'émulation GM)" + +#: gui/options.cpp:673 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur" + +#: gui/options.cpp:676 +msgid "Enable Roland GS Mode" +msgstr "Activer le mode Roland GS" + +#: gui/options.cpp:676 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" + +#: gui/options.cpp:679 +msgid "MIDI gain:" +msgstr "Gain MIDI:" + +#: gui/options.cpp:692 +msgid "Text and Speech:" +msgstr "Dialogue:" + +#: gui/options.cpp:697 +#: gui/options.cpp:703 +msgid "Speech" +msgstr "Audio" + +#: gui/options.cpp:698 +#: gui/options.cpp:704 +msgid "Subtitles" +msgstr "Sous-titres" + +#: gui/options.cpp:699 +#: gui/options.cpp:705 +msgid "Both" +msgstr "Les deux" + +#: gui/options.cpp:703 +msgid "Spch" +msgstr "Audio" + +#: gui/options.cpp:704 +msgid "Subs" +msgstr "Subs" + +#: gui/options.cpp:705 +msgid "Show subtitles and play speech" +msgstr "Affiche les sous-titres et joue les dialogues audio" + +#: gui/options.cpp:709 +msgid "Subtitle speed:" +msgstr "Vitesse des ST:" + +#: gui/options.cpp:721 +msgid "Music volume:" +msgstr "Volume Musique:" + +#: gui/options.cpp:728 +msgid "Mute All" +msgstr "Silence" + +#: gui/options.cpp:731 +msgid "SFX volume:" +msgstr "Volume Bruitage:" + +#: gui/options.cpp:731 +#: gui/options.cpp:732 +msgid "Special sound effects volume" +msgstr "Volume des effets spéciaux sonores" + +#: gui/options.cpp:738 +msgid "Speech volume:" +msgstr "Volume Dialogues:" + +#: gui/options.cpp:815 +msgid "Save Path: " +msgstr "Sauvegardes:" + +#: gui/options.cpp:818 +msgid "Theme Path:" +msgstr "Thèmes:" + +#: gui/options.cpp:821 +#: gui/options.cpp:822 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM" + +#: gui/options.cpp:825 +msgid "Plugins Path:" +msgstr "Plugins:" + +#: gui/options.cpp:830 +msgid "Misc" +msgstr "Divers" + +#: gui/options.cpp:832 +msgid "Theme:" +msgstr "Thème:" + +#: gui/options.cpp:836 +msgid "GUI Renderer:" +msgstr "Interface:" + +#: gui/options.cpp:842 +msgid "Autosave:" +msgstr "Sauvegarde auto:" + +#: gui/options.cpp:850 +msgid "Keys" +msgstr "Touches" + +#: gui/options.cpp:857 +msgid "GUI Language:" +msgstr "Langue:" + +#: gui/options.cpp:857 +msgid "Language of ScummVM GUI" +msgstr "Langue de l'interface graphique de ScummVM" + +#: gui/options.cpp:862 +msgid "English" +msgstr "Anglais" + +#: gui/options.cpp:996 +msgid "You have to restart ScummVM to take the effect." +msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte." + +#: gui/options.cpp:1009 +msgid "Select directory for savegames" +msgstr "Sélectionner le répertoire pour les sauvegardes" + +#: gui/options.cpp:1016 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire." + +#: gui/options.cpp:1025 +msgid "Select directory for GUI themes" +msgstr "Sélectionner le répertoire des thèmes d'interface" + +#: gui/options.cpp:1035 +msgid "Select directory for extra files" +msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" + +#: gui/options.cpp:1046 +msgid "Select directory for plugins" +msgstr "Sélectionner le répertoire des plugins" + +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:241 +msgid "No date saved" +msgstr "Date non sauvée" + +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:242 +msgid "No time saved" +msgstr "Heure non sauvée" + +#: gui/saveload.cpp:62 +#: gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "Durée de jeu non sauvée" + +#: gui/saveload.cpp:69 +#: gui/saveload.cpp:157 +msgid "Delete" +msgstr "Supprimer" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Voulez-vous vraiment supprimer cette sauvegarde?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Date:" + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Heure:" + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Durée de jeu:" + +#: gui/saveload.cpp:286 +#: gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Sauvegarde sans nom" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Sélectionnez un Thème" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "GFX désactivé" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Standard (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Anti-crénelé (16 bpp)" + +#: base/main.cpp:105 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" + +#: base/main.cpp:106 +msgid " Looking for a plugin supporting this gameid... " +msgstr "Recherche d'un plugin supportant cet ID..." + +#: base/main.cpp:110 +msgid "failed\n" +msgstr "Echec\n" + +#: base/main.cpp:111 +#, c-format +msgid "%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour obtenir la liste des ID reconnus" + +#: base/main.cpp:118 +#, c-format +msgid " Starting '%s'\n" +msgstr "Démarrage de '%s'\n" + +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%s', chemin '%s')" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Le niveau de debug '%s' n'est pas supporté par ce moteur de jeu" + +#: base/main.cpp:272 +msgid "Menu" +msgstr "Menu" + +#: base/main.cpp:275 +#: backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "Passer" + +#: base/main.cpp:278 +#: backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "Mettre en pause" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "Passer la phrase" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "Erreur lors de l'éxécution du jeu:" + +#: base/main.cpp:419 +#: base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Chemin Invalide" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "Fichier de donées introuvable" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "ID de jeu non supporté" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Mode de couleurs non supporté" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Véroullié en lecture" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Verrouillé en écriture" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "Chemin inexistant" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "Chemin n'est pas un répertoire" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "Chemin n'est pas un fichier" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Impossible de créer le fichier" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Echec de la lecture" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Echec de l'écriture des données" + +#: common/error.cpp:60 +#: common/error.cpp:71 +msgid "Unknown Error" +msgstr "Erreur inconnue" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "~R~eprendre" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~C~harger" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~S~auver" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~O~ptions" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~A~ide" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "À ~P~ropos" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "Retour au ~L~anceur" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Sauvegarde:" + +#: engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Sauver" + +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~O~K" + +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "~A~nnuler" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~T~ouches" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~P~récédent" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~S~uivant" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~F~ermer" + +#: engines/mohawk/dialogs.cpp:81 +#: engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "Mode ~Z~ip Activé" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "T~r~ansitions activé" + +#: engines/mohawk/dialogs.cpp:116 +#, fuzzy +msgid "~W~ater Effect Enabled" +msgstr "~E~ffets de l'Eau activés" + +#: sound/mididrv.cpp:61 +msgid "No music" +msgstr "Pas de musique" + +#: sound/mididrv.cpp:64 +msgid "Windows MIDI" +msgstr "MIDI Windows" + +#: sound/mididrv.cpp:68 +msgid "ALSA" +msgstr "ALSA" + +#: sound/mididrv.cpp:72 +msgid "Atari ST MIDI" +msgstr "MIDI Atari ST" + +#: sound/mididrv.cpp:76 +msgid "SEQ" +msgstr "SEQ" + +#: sound/mididrv.cpp:80 +msgid "DMedia" +msgstr "DMedia" + +#: sound/mididrv.cpp:84 +msgid "CAMD" +msgstr "CAMD" + +#: sound/mididrv.cpp:88 +msgid "CoreAudio" +msgstr "CoreAudio" + +#: sound/mididrv.cpp:90 +msgid "CoreMIDI" +msgstr "CoreMIDI" + +#: sound/mididrv.cpp:95 +msgid "Yamaha Pa1" +msgstr "Yamaha Pa1" + +#: sound/mididrv.cpp:97 +msgid "Tapwave Zodiac" +msgstr "Tapwave Zodiac" + +#: sound/mididrv.cpp:102 +msgid "FluidSynth" +msgstr "FluidSynth" + +#: sound/mididrv.cpp:105 +msgid "MT-32 Emulation" +msgstr "Émulation MT-32" + +#: sound/mididrv.cpp:109 +msgid "AdLib" +msgstr "AdLib" + +#: sound/mididrv.cpp:110 +msgid "PC Speaker" +msgstr "Haut Parleur PC" + +#: sound/mididrv.cpp:111 +msgid "IBM PCjr" +msgstr "IBM PCjr" + +#: sound/mididrv.cpp:112 +msgid "Creative Music System" +msgstr "Creative Music System" + +#: sound/mididrv.cpp:113 +msgid "FM Towns" +msgstr "FM Towns" + +#: sound/mididrv.cpp:115 +msgid "TiMidity" +msgstr "TiMidity" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "Affectation des touches:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr "(Actif)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr "(Global)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr "(Jeu)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "Menu Principal ScummVM" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "Mode ~G~aucher" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "Contrôle des combats d'~I~ndy" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "Afficher le curseur de la souris" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "Aligner sur les bords" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "Décalage X du toucher" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "Décallage Y du toucher" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "Activer le contrôle du curseur de type trackpad" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "Toucher pour un clic gauche, toucher deux fois pour un clic droit" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "Sensibilité" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "Échelle initiale de l'écran du haut" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "Échelle de l'écran principal" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "Mise à l'echelle matérielle (rapide mais qualité faible)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "Mise à l'échelle logicielle (bonne qualité mais plus lent)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "Sans changement d'échelle (vous devez faire défiler l'écran)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "Luminosité:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "Audio haute qualité (plus lent) (redémarrer)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "Désactivé l'extinction" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "Mode touchpad activé" + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "Mode touchpad désactivé" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "Haut" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "Bas" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "Gauche" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "Droite" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "Clic Gauche" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "Clic Droit" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "Zone" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "Sauter le texte" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "Mode rapide" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Quitter" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "Debugger" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "Menu global" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "Clavier virtuel" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +#, fuzzy +msgid "Key mapper" +msgstr "Affectation des touches" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "Voulez-vous quitter?" + +#: backends/platform/wii/options.cpp:47 +msgid "Ok" +msgstr "Ok" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Vidéo" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Mode vidéo actuel" + +#: backends/platform/wii/options.cpp:56 +#, fuzzy +msgid "Double-strike" +msgstr "Coup double" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Entrée" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "Sensibilité du pad GC:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "Acceleration du pad GC:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "Status:" + +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Inconue" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "Monter le DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "Démonter le DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Serveur:" + +#: backends/platform/wii/options.cpp:110 +#, fuzzy +msgid "Share:" +msgstr "Disque partagé:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Nom d'utilisateur:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Mot de passe:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Initialiser le réseau" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "Monter SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "Démonter SMB" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "DVD monté avec succès" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "Échec du montage du DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "DVD non monté" + +#: backends/platform/wii/options.cpp:163 +#, fuzzy +msgid "Network up, share mounted" +msgstr "Réseau connecté, disque partagé monté" + +#: backends/platform/wii/options.cpp:165 +#, fuzzy +msgid "Network up" +msgstr "Réseau connecté" + +#: backends/platform/wii/options.cpp:168 +#, fuzzy +msgid ", error while mounting the share" +msgstr ", échec du montage du disque partagé" + +#: backends/platform/wii/options.cpp:170 +#, fuzzy +msgid ", share not mounted" +msgstr ", disque partagé non monté" + +#: backends/platform/wii/options.cpp:176 +#, fuzzy +msgid "Network down" +msgstr "Réseau déconnecté" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "Initialisation du réseau" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "Dépassement du délai lors de l'initialisation du réseau" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "Réseau non initialisé (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "Caché la barre d'outils" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "Afficher le clavier" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "Audio marche/arrêt" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "Clic droit" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "Afficher/Cacher le curseur" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +#, fuzzy +msgid "Bind Keys" +msgstr "Affecter les touches" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +#, fuzzy +msgid "Cursor Up" +msgstr "Haut" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +#, fuzzy +msgid "Cursor Down" +msgstr "Bas" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +#, fuzzy +msgid "Cursor Left" +msgstr "Gauche" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +#, fuzzy +msgid "Cursor Right" +msgstr "Droit" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "Voulez-vous charger ou sauver le jeu?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "Voulez-vous vraiment quitter?" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "Clavier" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "Pivoter" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "Utilise le pilote SDL" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "Affichage" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "Voulez-vous exécuter une recherche automatique?" + +#~ msgid "About..." +#~ msgstr "A propos..." + +#~ msgid "Options..." +#~ msgstr "Options..." + +#~ msgid "Start" +#~ msgstr "Lancer" + +#~ msgid "Load..." +#~ msgstr "Charger..." + +#~ msgid "Edit Game..." +#~ msgstr "Préférence du Jeu..." + +#~ msgid "Remove Game" +#~ msgstr "Supprimer le Jeu" + +#~ msgid "Speech Only" +#~ msgstr "Audio Uniquement" + +#~ msgid "Speech and Subtitles" +#~ msgstr "Audio et Sous-titres" + +#~ msgid "Subtitles Only" +#~ msgstr "Sous-titres Uniquement" + +#~ msgid "Speech & Subs" +#~ msgstr "Parole & Sous-titres" -- cgit v1.2.3 From d6cd656f15aed3ac3b8428442f9397944e6b2c85 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 20 Jun 2010 05:25:34 +0000 Subject: Added support for the alternate encoding for depth surfaces svn-id: r50069 --- engines/m4/mads_scene.cpp | 30 +++++++++++++++++++++--------- engines/m4/mads_scene.h | 2 +- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 43b39af0db..8a33424602 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -650,7 +650,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su int resSceneId = stream->readUint16LE(); assert(resSceneId == sceneNumber); artFileNum = stream->readUint16LE(); - drawStyle = stream->readUint16LE(); + depthStyle = stream->readUint16LE(); width = stream->readUint16LE(); height = stream->readUint16LE(); @@ -685,16 +685,15 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su if (!surface) { surface = new M4Surface(width, height); ssFlag = true; - } + } else if ((width != surface->width()) || (height != surface->height())) + surface->setSize(width, height); + int walkSize = gfxSize; - if (drawStyle == 2) { - width >>= 2; - walkSize = width * height; - } if (!depthSurface) { depthSurface = new M4Surface(width, height); dsFlag = true; - } + } else if ((width != depthSurface->width()) || (height != depthSurface->height())) + depthSurface->setSize(width, height); // For Rex Nebular, read in the scene's compressed walk surface information @@ -708,9 +707,22 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su byte *destP = depthSurface->getBasePtr(0, 0); const byte *srcP = walkData; byte runLength; + + // Run length encoded depth data while ((runLength = *srcP++) != 0) { - Common::set_to(destP, destP + runLength, *srcP++); - destP += runLength; + if (depthStyle == 2) { + // 2-bit depth pixels + byte byteVal = *srcP++; + for (int byteCtr = 0; byteCtr < runLength; ++byteCtr) { + byte v = byteVal; + for (int bitCtr = 0; bitCtr < 4; ++bitCtr, v >>= 2) + *destP++ = v & 3; + } + } else { + // 8-bit depth pixels + Common::set_to(destP, destP + runLength, *srcP++); + destP += runLength; + } } free(walkData); diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index c4c6dedc0e..ef5cd312d7 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -39,7 +39,7 @@ class MadsSceneResources: public SceneResources { public: int sceneId; int artFileNum; - int drawStyle; + int depthStyle; int width; int height; Common::Array objects; -- cgit v1.2.3 From fcdb7807a456f5a6cb94932977a1b0e4f0e11089 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 20 Jun 2010 07:04:58 +0000 Subject: Implemented explicit transparency index support - the previous hardcoded index of 0 wasn't correct, since some sprites need that index svn-id: r50070 --- engines/m4/console.cpp | 2 +- engines/m4/events.cpp | 3 ++- engines/m4/graphics.cpp | 2 +- engines/m4/graphics.h | 1 + engines/m4/mads_anim.cpp | 2 +- engines/m4/mads_menus.cpp | 12 +++++++----- engines/m4/mads_scene.cpp | 2 +- engines/m4/mads_views.cpp | 8 +++++--- engines/m4/sprite.cpp | 15 ++++++++------- engines/m4/sprite.h | 2 +- 10 files changed, 28 insertions(+), 21 deletions(-) diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp index 4e14afdfaf..19fbf6e852 100644 --- a/engines/m4/console.cpp +++ b/engines/m4/console.cpp @@ -196,7 +196,7 @@ bool Console::cmdShowSprite(int argc, const char **argv) { if (y >= bg->height()) break; - spr->copyTo(bg, x, y, (int)spr->getTransparentColor()); + spr->copyTo(bg, x, y, (int)spr->getTransparencyIndex()); x += spr->width(); yMax = MAX(yMax, spr->height()); diff --git a/engines/m4/events.cpp b/engines/m4/events.cpp index 65378c5d6a..c66609844a 100644 --- a/engines/m4/events.cpp +++ b/engines/m4/events.cpp @@ -256,7 +256,8 @@ bool Mouse::setCursorNum(int cursorIndex) { _cursor = _cursorSprites->getFrame(cursorIndex); // Set the cursor to the sprite - CursorMan.replaceCursor((const byte *)_cursor->getBasePtr(), _cursor->width(), _cursor->height(), _cursor->xOffset, _cursor->yOffset, 0); + CursorMan.replaceCursor((const byte *)_cursor->getBasePtr(), _cursor->width(), _cursor->height(), + _cursor->xOffset, _cursor->yOffset, TRANSPARENT_COLOUR_INDEX); return true; } diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index d7a0c9edfc..b0bc8bbc0c 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -919,7 +919,7 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { byte *palIndexes = list->palIndexes(); for (int i = 0; i < width() * height(); ++i, ++p) { - if (!isTransparent || (*p != 0)) { + if (!isTransparent || (*p != TRANSPARENT_COLOUR_INDEX)) { assert(*p < list->size()); *p = palIndexes[*p]; } diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 24c0edf223..96cd039e27 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -40,6 +40,7 @@ namespace M4 { #define MADS_SCREEN_HEIGHT 200 #define MADS_Y_OFFSET ((MADS_SCREEN_HEIGHT - MADS_SURFACE_HEIGHT) / 2) +#define TRANSPARENT_COLOUR_INDEX 0xFF struct BGR8 { uint8 b, g, r; diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index c2e9ea4eee..fb565a927c 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -547,7 +547,7 @@ void AnimviewView::updateState() { } void AnimviewView::readNextCommand() { -static bool tempFlag = true;//****DEBUG - Temporarily allow me to skip several intro scenes **** +static bool tempFlag = false;//****DEBUG - Temporarily allow me to skip several intro scenes **** while (!_script->eos() && !_script->err()) { if (!tempFlag) { diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index 43b9031692..d7d9cf4150 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -163,7 +163,7 @@ bool RexMainMenuView::onEvent(M4EventType eventType, int32 param, int x, int y, if (_highlightedIndex != -1) { M4Sprite *spr = _menuItem->getFrame(_highlightedIndex); const Common::Point &pt = _menuItemPosList[_highlightedIndex]; - spr->copyTo(this, pt.x, row + pt.y, 0); + spr->copyTo(this, pt.x, row + pt.y, spr->getTransparencyIndex()); } } } else { @@ -211,10 +211,12 @@ void RexMainMenuView::updateState() { M4Sprite *spr = _menuItem->getFrame(0); itemSize = _menuItem->getFrame(0)->height(); spr->copyTo(this, _menuItemPosList[_menuItemIndex - 1].x, - _menuItemPosList[_menuItemIndex - 1].y + row + (itemSize / 2) - (spr->height() / 2), 0); + _menuItemPosList[_menuItemIndex - 1].y + row + (itemSize / 2) - (spr->height() / 2), + spr->getTransparencyIndex()); delete _menuItem; - copyTo(_bgSurface, Common::Rect(0, row, width(), row + MADS_SURFACE_HEIGHT), 0, 0); + copyTo(_bgSurface, Common::Rect(0, row, width(), row + MADS_SURFACE_HEIGHT), 0, 0, + spr->getTransparencyIndex()); } // Get the next sprite set @@ -275,7 +277,7 @@ void RexMainMenuView::updateState() { _bgSurface->copyTo(this, 0, row); M4Sprite *spr = _menuItem->getFrame(_frameIndex); spr->copyTo(this, _menuItemPosList[_menuItemIndex - 1].x, _menuItemPosList[_menuItemIndex - 1].y + - row + (itemSize / 2) - (spr->height() / 2), 0); + row + (itemSize / 2) - (spr->height() / 2), spr->getTransparencyIndex()); } int RexMainMenuView::getHighlightedItem(int x, int y) { @@ -531,7 +533,7 @@ void DragonMainMenuView::updateState() { _itemPalData.push_back(palData); spr = _menuItem->getFrame(1); - spr->copyTo(this, spr->xOffset - 140, spr->yOffset - spr->height(), (int)spr->getTransparentColor()); + spr->copyTo(this, spr->xOffset - 140, spr->yOffset - spr->height(), spr->getTransparencyIndex()); _vm->_mouse->cursorOn(); } diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 8a33424602..7e45b5f1f7 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -927,7 +927,7 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) { // Display object sprite. Note that the frame number isn't used directly, because it would result // in too fast an animation M4Sprite *spr = _objectSprites->getFrame(_objectFrameNumber / INV_ANIM_FRAME_SPEED); - spr->copyTo(destSurface, INVENTORY_X, INVENTORY_Y, 0); + spr->copyTo(destSurface, INVENTORY_X, INVENTORY_Y, TRANSPARENT_COLOUR_INDEX); if (!_madsVm->globals()->_config.invObjectsStill && !dialogVisible) { // If objects need to be animated, move to the next frame diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 5a7abcf484..a644e81d51 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -196,7 +196,8 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); - view->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, slot.scale, 0); + view->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, + slot.scale, spr->getTransparencyIndex()); } else { int xp, yp; M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); @@ -211,10 +212,11 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { if (slot.depth > 1) { // Draw the frame with depth processing - view->copyFrom(spr, xp, yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, 100, 0); + view->copyFrom(spr, xp, yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, 100, + spr->getTransparencyIndex()); } else { // No depth, so simply draw the image - spr->copyTo(view, xp, yp + yOffset, 0); + spr->copyTo(view, xp, yp + yOffset, spr->getTransparencyIndex()); } } } diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 0ff4bec855..da043c695f 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -131,6 +131,9 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { byte cmd1, cmd2, count, pixel; if (newLine) { + if (outp < (lineStart + w)) + Common::set_to(outp, lineStart + w, TRANSPARENT_COLOUR_INDEX); + outp = lineStart + w; lineStart = outp; newLine = false; @@ -150,7 +153,7 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { } else { pixel = source->readByte(); while (count--) - *outp++ = (pixel == 0xFD) ? 0 : pixel; + *outp++ = (pixel == 0xFD) ? TRANSPARENT_COLOUR_INDEX : pixel; } } } else { @@ -162,19 +165,17 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { count = source->readByte(); pixel = source->readByte(); while (count--) - *outp++ = (pixel == 0xFD) ? 0 : pixel; + *outp++ = (pixel == 0xFD) ? TRANSPARENT_COLOUR_INDEX : pixel; } else { - *outp++ = (cmd2 == 0xFD) ? 0 : cmd2; + *outp++ = (cmd2 == 0xFD) ? TRANSPARENT_COLOUR_INDEX : cmd2; } } } } } -byte M4Sprite::getTransparentColor() const { - // FIXME: We assume that the transparent color is the color of the - // top left pixel. - return *getBasePtr(0, 0); +byte M4Sprite::getTransparencyIndex() const { + return TRANSPARENT_COLOUR_INDEX; } } // End of namespace M4 diff --git a/engines/m4/sprite.h b/engines/m4/sprite.h index 49a96a6c4a..d4e5502efd 100644 --- a/engines/m4/sprite.h +++ b/engines/m4/sprite.h @@ -115,7 +115,7 @@ public: void loadDeltaRle(Common::SeekableReadStream* rleData, int destX, int destY); void loadMadsSprite(Common::SeekableReadStream* source); - byte getTransparentColor() const; + byte getTransparencyIndex() const; protected: }; -- cgit v1.2.3 From 110e03c87b65330ef1ac105ddfca55bb1ac1d4ac Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 20 Jun 2010 07:06:22 +0000 Subject: Removed unused variables svn-id: r50071 --- engines/m4/mads_scene.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 7e45b5f1f7..a464438981 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -681,14 +681,12 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su // Initialise a copy of the surfaces if they weren't provided bool dsFlag = false, ssFlag = false; - int gfxSize = width * height; if (!surface) { surface = new M4Surface(width, height); ssFlag = true; } else if ((width != surface->width()) || (height != surface->height())) surface->setSize(width, height); - int walkSize = gfxSize; if (!depthSurface) { depthSurface = new M4Surface(width, height); dsFlag = true; -- cgit v1.2.3 From 41990883bf003ff075821bc484b605b1ba87c8ad Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sun, 20 Jun 2010 09:51:11 +0000 Subject: Don't go into "menu input mode" unless the game currently allows the menus to be displayed. I hope this is the correct fix to keep Police Quest 1 from hanging if you press Escape while reading the newspaper in the briefing room. svn-id: r50072 --- engines/agi/cycle.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index ee55c783f1..c185c3efb3 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -178,6 +178,9 @@ void AgiEngine::updateTimer() { } void AgiEngine::newInputMode(InputMode mode) { + if (mode == INPUT_MENU && !getflag(fMenusWork) && !(getFeatures() & GF_MENUS)) + return; + _oldMode = _game.inputMode; _game.inputMode = mode; } -- cgit v1.2.3 From 81f64c9e3e8cacf106c36eff2f443f29ed1f50c3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 10:25:46 +0000 Subject: SCI: storing all manual midi commands now and actually sending them to driver during onTimer() - fixes mt32 emulation crashing during lsl5 piano scene svn-id: r50073 --- engines/sci/sound/midiparser_sci.cpp | 50 ++++++++++++++++++++++-------------- engines/sci/sound/midiparser_sci.h | 10 +++++++- engines/sci/sound/music.cpp | 4 ++- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 31d9d95116..640000235e 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -61,6 +61,8 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : _dataincToAdd = 0; _resetOnPause = false; _pSnd = 0; + + _manualCommandCount = 0; } MidiParser_SCI::~MidiParser_SCI() { @@ -105,7 +107,7 @@ void MidiParser_SCI::sendInitCommands() { byte voiceCount = 0; if (_channelUsed[i]) { voiceCount = _pSnd->soundRes->getInitialVoiceCount(i); - _driver->send(0xB0 | i, 0x4B, voiceCount); + sendToDriverQueue(0xB0 | i, 0x4B, voiceCount); } } } @@ -113,8 +115,7 @@ void MidiParser_SCI::sendInitCommands() { // Send a velocity off signal to all channels for (int i = 0; i < 15; ++i) { - if (_channelUsed[i]) - sendToDriver(0xB0 | i, 0x4E, 0); // Reset velocity + sendToDriverQueue(0xB0 | i, 0x4E, 0); // Reset velocity } } @@ -145,17 +146,33 @@ void MidiParser_SCI::unloadMusic() { } // this is used for scripts sending direct midi commands to us. we verify in that case that the channel is actually -// used -void MidiParser_SCI::sendManuallyToDriver(uint32 b) { +// used and actually store the command for getting really sent when being onTimer() +void MidiParser_SCI::sendToDriverQueue(uint32 b) { byte midiChannel = b & 0xf; if (!_channelUsed[midiChannel]) { - // scripts trying to send to unused channel - // this happens at least in sq1vga right at the start, it's a script issue + // trying to send to an unused channel + // this happens for cmdSendMidi at least in sq1vga right at the start, it's a script issue return; } - sendToDriver(b); + if (_manualCommandCount >= 200) + error("driver queue is full"); + _manualCommands[_manualCommandCount] = b; + _manualCommandCount++; +} + +// This sends the stored commands from queue to driver (is supposed to get called only during onTimer()) +// at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get +// a crash during piano scene in lsl5) +void MidiParser_SCI::sendQueueToDriver() { + int curCommand = 0; + + while (curCommand < _manualCommandCount) { + sendToDriver(_manualCommands[curCommand]); + curCommand++; + } + _manualCommandCount = 0; } void MidiParser_SCI::sendToDriver(uint32 b) { @@ -375,9 +392,8 @@ void MidiParser_SCI::allNotesOff() { // Turn off all active notes for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { - int16 realChannel = _channelRemap[j]; - if ((_active_notes[i] & (1 << j)) && realChannel != -1){ - _driver->send(0x80 | realChannel, i, 0); + if ((_active_notes[i] & (1 << j))){ + sendToDriverQueue(0x80 | j, i, 0); } } } @@ -385,7 +401,7 @@ void MidiParser_SCI::allNotesOff() { // Turn off all hanging notes for (i = 0; i < ARRAYSIZE(_hanging_notes); i++) { if (_hanging_notes[i].time_left) { - _driver->send(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); + sendToDriverQueue(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); _hanging_notes[i].time_left = 0; } } @@ -394,11 +410,8 @@ void MidiParser_SCI::allNotesOff() { // To be sure, send an "All Note Off" event (but not all MIDI devices // support this...). - for (i = 0; i < 16; ++i) { - int16 realChannel = _channelRemap[i]; - if (realChannel != -1) - _driver->send(0xB0 | realChannel, 0x7b, 0); // All notes off - } + for (i = 0; i < 16; ++i) + sendToDriverQueue(0xB0 | i, 0x7b, 0); // All notes off memset(_active_notes, 0, sizeof(_active_notes)); } @@ -659,8 +672,7 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_LATE: // sending volume change to all used channels for (int i = 0; i < 15; i++) - if (_channelUsed[i]) - sendToDriver(0xB0 + i, 7, _volume); + sendToDriverQueue(0xB0 + i, 7, _volume); break; default: diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 48de44555d..5abffdb3a1 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -81,7 +81,12 @@ public: void sendToDriver(byte status, byte firstOp, byte secondOp) { sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); } - void sendManuallyToDriver(uint32 b); + void sendToDriverQueue(uint32 b); + void sendToDriverQueue(byte status, byte firstOp, byte secondOp) { + sendToDriverQueue(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); + } + + void sendQueueToDriver(); protected: void parseNextEvent(EventInfo &info); @@ -107,6 +112,9 @@ protected: bool _channelUsed[16]; int16 _channelRemap[16]; bool _channelMuted[16]; + + int _manualCommandCount; + uint32 _manualCommands[200]; }; } // End of namespace Sci diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 688b88a910..fbf37a78b1 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -465,7 +465,7 @@ void SciMusic::sendMidiCommand(uint32 cmd) { void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { Common::StackLock lock(_mutex); if (pSnd->pMidiParser) - pSnd->pMidiParser->sendManuallyToDriver(cmd); + pSnd->pMidiParser->sendToDriverQueue(cmd); else error("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); } @@ -573,6 +573,8 @@ void MusicEntry::onTimer() { // Only process MIDI streams in this thread, not digital sound effects if (pMidiParser) { + // Process manual commands first + pMidiParser->sendQueueToDriver(); pMidiParser->onTimer(); ticker = (uint16)pMidiParser->getTick(); } -- cgit v1.2.3 From 36ca2ce421d1dfbf6517d6ea008bbd97b9f6ccb8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 12:21:57 +0000 Subject: SCI: some cleanup for kPalVary svn-id: r50074 --- engines/sci/graphics/palette.cpp | 13 +++++++------ engines/sci/graphics/palette.h | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 8af6b597d6..fbf3433c29 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -464,14 +464,14 @@ void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { // Saving/restoring // need to save start and target-palette, when palVaryOn = true -void GfxPalette::startPalVary(uint16 paletteId, uint16 ticks) { - kernelSetFromResource(paletteId, true); +void GfxPalette::startPalVary(GuiResourceId resourceId, uint16 ticks) { + kernelSetFromResource(resourceId, true); return; - if (_palVaryId >= 0) // another palvary is taking place, return + if (_palVaryResourceId >= 0) // another palvary is taking place, return return; - _palVaryId = paletteId; + _palVaryResourceId = resourceId; _palVaryStart = g_system->getMillis(); _palVaryEnd = _palVaryStart + ticks * 1000 / 60; g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60, this); @@ -486,10 +486,11 @@ void GfxPalette::togglePalVary(bool pause) { void GfxPalette::stopPalVary() { g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); - _palVaryId = -1; // invalidate the target palette // HACK: just set the target palette - kernelSetFromResource(_palVaryId, true); + kernelSetFromResource(_palVaryResourceId, true); + + _palVaryResourceId = -1; // invalidate the target palette } void GfxPalette::palVaryCallback(void *refCon) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index fead340090..265f36ad54 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -60,7 +60,7 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); - void startPalVary(uint16 paletteId, uint16 ticks); + void startPalVary(GuiResourceId resourceId, uint16 ticks); void togglePalVary(bool pause); void stopPalVary(); @@ -72,7 +72,7 @@ private: GfxScreen *_screen; ResourceManager *_resMan; - int16 _palVaryId; + GuiResourceId _palVaryResourceId; uint32 _palVaryStart; uint32 _palVaryEnd; -- cgit v1.2.3 From daf1429ca22e887d49e761304e60b47f46e97bbf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 12:38:08 +0000 Subject: SCI: implementing reading of parameters for kPalVary(init) for argc 4 and argc 5 svn-id: r50075 --- engines/sci/engine/kgraphics.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6e0dab7e28..344d79b9d2 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -646,12 +646,14 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { switch (operation) { case 0: { // Init GuiResourceId paletteId; - uint16 time; - if (argc == 3) { + uint16 ticks, paletteStop, paletteDirection; + if ((argc >= 3) && (argc <= 5)) { paletteId = argv[1].toUint16(); - time = argv[2].toUint16(); - g_sci->_gfxPalette->startPalVary(paletteId, time); - warning("kPalVary(init) called with paletteId = %d, time = %d", paletteId, time); + ticks = argv[2].toUint16(); + paletteStop = argc >= 4 ? argv[3].toUint16() : 64; + paletteDirection = argc >= 5 ? argv[4].toUint16() : 1; + g_sci->_gfxPalette->startPalVary(paletteId, ticks); + warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, paletteStop, paletteDirection); } else { warning("kPalVary(init) called with unsupported argc %d", argc); } -- cgit v1.2.3 From 871c9bdddeaee6756f5c8d943c2ff8ed337abd4d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 13:15:45 +0000 Subject: SCI: removing unneeded parameters inside SciPalette, cleanup of SciPalette svn-id: r50076 --- engines/sci/graphics/cursor.cpp | 2 +- engines/sci/graphics/palette.cpp | 62 ++++++++++++++++++++-------------------- engines/sci/graphics/palette.h | 4 +-- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 369549cf7b..db42dac3dd 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -120,7 +120,7 @@ void GfxCursor::kernelSetShape(GuiResourceId resourceId) { colorMapping[0] = 0; // Black is hardcoded colorMapping[1] = _screen->getColorWhite(); // White is also hardcoded colorMapping[2] = SCI_CURSOR_SCI0_TRANSPARENCYCOLOR; - colorMapping[3] = _palette->matchColor(&_palette->_sysPalette, 170, 170, 170); // Grey + colorMapping[3] = _palette->matchColor(170, 170, 170); // Grey // Seek to actual data resourceData += 4; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index fbf3433c29..7fa76586ad 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -207,12 +207,12 @@ void GfxPalette::setEGA() { setOnScreen(); } -void GfxPalette::set(Palette *sciPal, bool force, bool forceRealMerge) { +void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { uint32 systime = _sysPalette.timestamp; - if (force || sciPal->timestamp != systime) { - _sysPaletteChanged |= merge(sciPal, &_sysPalette, force, forceRealMerge); - sciPal->timestamp = _sysPalette.timestamp; + if (force || newPalette->timestamp != systime) { + _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); + newPalette->timestamp = _sysPalette.timestamp; if (_sysPaletteChanged && _screen->_picNotValid == 0) { // && systime != _sysPalette.timestamp) { // Removed timestamp checking, because this shouldnt be needed anymore. I'm leaving it commented just in // case this causes regressions @@ -222,7 +222,7 @@ void GfxPalette::set(Palette *sciPal, bool force, bool forceRealMerge) { } } -bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealMerge) { +bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { uint16 res; int i,j; bool paletteChanged = false; @@ -234,13 +234,13 @@ bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealM // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes for (i = 1; i < 255; i++) { if (pFrom->colors[i].used) { - if ((pFrom->colors[i].r != pTo->colors[i].r) || (pFrom->colors[i].g != pTo->colors[i].g) || (pFrom->colors[i].b != pTo->colors[i].b)) { - pTo->colors[i].r = pFrom->colors[i].r; - pTo->colors[i].g = pFrom->colors[i].g; - pTo->colors[i].b = pFrom->colors[i].b; + if ((pFrom->colors[i].r != _sysPalette.colors[i].r) || (pFrom->colors[i].g != _sysPalette.colors[i].g) || (pFrom->colors[i].b != _sysPalette.colors[i].b)) { + _sysPalette.colors[i].r = pFrom->colors[i].r; + _sysPalette.colors[i].g = pFrom->colors[i].g; + _sysPalette.colors[i].b = pFrom->colors[i].b; paletteChanged = true; } - pTo->colors[i].used = pFrom->colors[i].used; + _sysPalette.colors[i].used = pFrom->colors[i].used; pFrom->mapping[i] = i; } } @@ -250,12 +250,12 @@ bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealM if (!pFrom->colors[i].used)// color is not used - so skip it continue; // forced palette merging or dest color is not used yet - if (force || (!pTo->colors[i].used)) { - pTo->colors[i].used = pFrom->colors[i].used; - if ((pFrom->colors[i].r != pTo->colors[i].r) || (pFrom->colors[i].g != pTo->colors[i].g) || (pFrom->colors[i].b != pTo->colors[i].b)) { - pTo->colors[i].r = pFrom->colors[i].r; - pTo->colors[i].g = pFrom->colors[i].g; - pTo->colors[i].b = pFrom->colors[i].b; + if (force || (!_sysPalette.colors[i].used)) { + _sysPalette.colors[i].used = pFrom->colors[i].used; + if ((pFrom->colors[i].r != _sysPalette.colors[i].r) || (pFrom->colors[i].g != _sysPalette.colors[i].g) || (pFrom->colors[i].b != _sysPalette.colors[i].b)) { + _sysPalette.colors[i].r = pFrom->colors[i].r; + _sysPalette.colors[i].g = pFrom->colors[i].g; + _sysPalette.colors[i].b = pFrom->colors[i].b; paletteChanged = true; } pFrom->mapping[i] = i; @@ -264,23 +264,23 @@ bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealM // is the same color already at the same position? -> match it directly w/o lookup // this fixes games like lsl1demo/sq5 where the same rgb color exists multiple times and where we would // otherwise match the wrong one (which would result into the pixels affected (or not) by palette changes) - if ((pTo->colors[i].r == pFrom->colors[i].r) && (pTo->colors[i].g == pFrom->colors[i].g) && (pTo->colors[i].b == pFrom->colors[i].b)) { + if ((_sysPalette.colors[i].r == pFrom->colors[i].r) && (_sysPalette.colors[i].g == pFrom->colors[i].g) && (_sysPalette.colors[i].b == pFrom->colors[i].b)) { pFrom->mapping[i] = i; continue; } // check if exact color could be matched - res = matchColor(pTo, pFrom->colors[i].r, pFrom->colors[i].g, pFrom->colors[i].b); + res = matchColor(pFrom->colors[i].r, pFrom->colors[i].g, pFrom->colors[i].b); if (res & 0x8000) { // exact match was found pFrom->mapping[i] = res & 0xFF; continue; } // no exact match - see if there is an unused color for (j = 1; j < 256; j++) - if (!pTo->colors[j].used) { - pTo->colors[j].used = pFrom->colors[i].used; - pTo->colors[j].r = pFrom->colors[i].r; - pTo->colors[j].g = pFrom->colors[i].g; - pTo->colors[j].b = pFrom->colors[i].b; + if (!_sysPalette.colors[j].used) { + _sysPalette.colors[j].used = pFrom->colors[i].used; + _sysPalette.colors[j].r = pFrom->colors[i].r; + _sysPalette.colors[j].g = pFrom->colors[i].g; + _sysPalette.colors[j].b = pFrom->colors[i].b; pFrom->mapping[i] = j; paletteChanged = true; break; @@ -288,25 +288,25 @@ bool GfxPalette::merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealM // if still no luck - set an approximate color if (j == 256) { pFrom->mapping[i] = res & 0xFF; - pTo->colors[res & 0xFF].used |= 0x10; + _sysPalette.colors[res & 0xFF].used |= 0x10; } } } - pTo->timestamp = g_system->getMillis() * 60 / 1000; + _sysPalette.timestamp = g_system->getMillis() * 60 / 1000; return paletteChanged; } -uint16 GfxPalette::matchColor(Palette *pPal, byte r, byte g, byte b) { +uint16 GfxPalette::matchColor(byte r, byte g, byte b) { byte found = 0xFF; int diff = 0x2FFFF, cdiff; int16 dr,dg,db; for (int i = 1; i < 255; i++) { - if ((!pPal->colors[i].used)) + if ((!_sysPalette.colors[i].used)) continue; - dr = pPal->colors[i].r - r; - dg = pPal->colors[i].g - g; - db = pPal->colors[i].b - b; + dr = _sysPalette.colors[i].r - r; + dg = _sysPalette.colors[i].g - g; + db = _sysPalette.colors[i].b - b; // minimum squares match cdiff = (dr*dr) + (dg*dg) + (db*db); // minimum sum match (Sierra's) @@ -372,7 +372,7 @@ void GfxPalette::kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 int } int16 GfxPalette::kernelFindColor(uint16 r, uint16 g, uint16 b) { - return matchColor(&_sysPalette, r, g, b) & 0xFF; + return matchColor(r, g, b) & 0xFF; } // Returns true, if palette got changed diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 265f36ad54..b7767537a1 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -45,8 +45,8 @@ public: void modifyAmigaPalette(byte *data); void setEGA(); void set(Palette *sciPal, bool force, bool forceRealMerge = false); - bool merge(Palette *pFrom, Palette *pTo, bool force, bool forceRealMerge); - uint16 matchColor(Palette *pPal, byte r, byte g, byte b); + bool merge(Palette *pFrom, bool force, bool forceRealMerge); + uint16 matchColor(byte r, byte g, byte b); void getSys(Palette *pal); void setOnScreen(); -- cgit v1.2.3 From 30f6e7824bad89293db3a43b6d67657862a03c51 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 13:25:08 +0000 Subject: SCI: update sys palette timestamp only on kDrawPic in SCI1.1, fixes intro of island of dr. brain svn-id: r50077 --- engines/sci/graphics/paint16.cpp | 4 ++++ engines/sci/graphics/palette.cpp | 10 +++++++++- engines/sci/graphics/palette.h | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index f9ee3c3ae3..63e7d30ca0 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -75,6 +75,10 @@ void GfxPaint16::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mi picture->draw(animationNr, mirroredFlag, addToFlag, paletteId); delete picture; + + // We update our sys palette timestamp here (SCI1.1 only) + if (getSciVersion() == SCI_VERSION_1_1) + _palette->increaseSysTimestamp(); } // This one is the only one that updates screen! diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 7fa76586ad..447ad23ebe 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -292,10 +292,18 @@ bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { } } } - _sysPalette.timestamp = g_system->getMillis() * 60 / 1000; + + // We don't update the timestamp here for SCI1.1, it's only updated on kDrawPic calls + if (getSciVersion() < SCI_VERSION_1_1) + _sysPalette.timestamp = g_system->getMillis() * 60 / 1000; return paletteChanged; } +// This is used for SCI1.1 and called from kDrawPic. We only update sysPalette timestamp this way for SCI1.1 +void GfxPalette::increaseSysTimestamp() { + _sysPalette.timestamp++; +} + uint16 GfxPalette::matchColor(byte r, byte g, byte b) { byte found = 0xFF; int diff = 0x2FFFF, cdiff; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index b7767537a1..53eb97e6a1 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -51,6 +51,8 @@ public: void setOnScreen(); + void increaseSysTimestamp(); + bool kernelSetFromResource(GuiResourceId resourceId, bool force); void kernelSetFlag(uint16 fromColor, uint16 toColor, uint16 flag); void kernelUnsetFlag(uint16 fromColor, uint16 toColor, uint16 flag); -- cgit v1.2.3 From d2a3f59bfb5d27c5524a4bd59a789378f7bd09e6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 13:30:40 +0000 Subject: SCI: update timestamp like before for inbetween SCI1.1 games svn-id: r50078 --- engines/sci/graphics/palette.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 447ad23ebe..9058680c46 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -244,6 +244,9 @@ bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { pFrom->mapping[i] = i; } } + // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls + return paletteChanged; + } else { // colors 0 (black) and 255 (white) are not affected by merging for (i = 1 ; i < 255; i++) { @@ -293,15 +296,15 @@ bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { } } - // We don't update the timestamp here for SCI1.1, it's only updated on kDrawPic calls - if (getSciVersion() < SCI_VERSION_1_1) + if (!forceRealMerge) _sysPalette.timestamp = g_system->getMillis() * 60 / 1000; return paletteChanged; } // This is used for SCI1.1 and called from kDrawPic. We only update sysPalette timestamp this way for SCI1.1 void GfxPalette::increaseSysTimestamp() { - _sysPalette.timestamp++; + if (!_alwaysForceRealMerge) // Don't do this on inbetween SCI1.1 games + _sysPalette.timestamp++; } uint16 GfxPalette::matchColor(byte r, byte g, byte b) { -- cgit v1.2.3 From 15ae4d8f595346dffde8be6b186fc696f28c8900 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 13:38:24 +0000 Subject: SCI: fix r50078, we need to update timestamp for inbetween SCI1.1 games, but not on kPortrait palette changes svn-id: r50079 --- engines/sci/graphics/palette.cpp | 56 +++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 9058680c46..56e2ff67a2 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -222,26 +222,24 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } -bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { +bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { uint16 res; int i,j; bool paletteChanged = false; - // for Laura Bow 2 demo - forceRealMerge |= _alwaysForceRealMerge; - - if ((!forceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { + if ((!forceRealMerge) && (!_alwaysForceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes + // There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo) for (i = 1; i < 255; i++) { - if (pFrom->colors[i].used) { - if ((pFrom->colors[i].r != _sysPalette.colors[i].r) || (pFrom->colors[i].g != _sysPalette.colors[i].g) || (pFrom->colors[i].b != _sysPalette.colors[i].b)) { - _sysPalette.colors[i].r = pFrom->colors[i].r; - _sysPalette.colors[i].g = pFrom->colors[i].g; - _sysPalette.colors[i].b = pFrom->colors[i].b; + if (newPalette->colors[i].used) { + if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { + _sysPalette.colors[i].r = newPalette->colors[i].r; + _sysPalette.colors[i].g = newPalette->colors[i].g; + _sysPalette.colors[i].b = newPalette->colors[i].b; paletteChanged = true; } - _sysPalette.colors[i].used = pFrom->colors[i].used; - pFrom->mapping[i] = i; + _sysPalette.colors[i].used = newPalette->colors[i].used; + newPalette->mapping[i] = i; } } // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls @@ -250,47 +248,47 @@ bool GfxPalette::merge(Palette *pFrom, bool force, bool forceRealMerge) { } else { // colors 0 (black) and 255 (white) are not affected by merging for (i = 1 ; i < 255; i++) { - if (!pFrom->colors[i].used)// color is not used - so skip it + if (!newPalette->colors[i].used)// color is not used - so skip it continue; // forced palette merging or dest color is not used yet if (force || (!_sysPalette.colors[i].used)) { - _sysPalette.colors[i].used = pFrom->colors[i].used; - if ((pFrom->colors[i].r != _sysPalette.colors[i].r) || (pFrom->colors[i].g != _sysPalette.colors[i].g) || (pFrom->colors[i].b != _sysPalette.colors[i].b)) { - _sysPalette.colors[i].r = pFrom->colors[i].r; - _sysPalette.colors[i].g = pFrom->colors[i].g; - _sysPalette.colors[i].b = pFrom->colors[i].b; + _sysPalette.colors[i].used = newPalette->colors[i].used; + if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { + _sysPalette.colors[i].r = newPalette->colors[i].r; + _sysPalette.colors[i].g = newPalette->colors[i].g; + _sysPalette.colors[i].b = newPalette->colors[i].b; paletteChanged = true; } - pFrom->mapping[i] = i; + newPalette->mapping[i] = i; continue; } // is the same color already at the same position? -> match it directly w/o lookup // this fixes games like lsl1demo/sq5 where the same rgb color exists multiple times and where we would // otherwise match the wrong one (which would result into the pixels affected (or not) by palette changes) - if ((_sysPalette.colors[i].r == pFrom->colors[i].r) && (_sysPalette.colors[i].g == pFrom->colors[i].g) && (_sysPalette.colors[i].b == pFrom->colors[i].b)) { - pFrom->mapping[i] = i; + if ((_sysPalette.colors[i].r == newPalette->colors[i].r) && (_sysPalette.colors[i].g == newPalette->colors[i].g) && (_sysPalette.colors[i].b == newPalette->colors[i].b)) { + newPalette->mapping[i] = i; continue; } // check if exact color could be matched - res = matchColor(pFrom->colors[i].r, pFrom->colors[i].g, pFrom->colors[i].b); + res = matchColor(newPalette->colors[i].r, newPalette->colors[i].g, newPalette->colors[i].b); if (res & 0x8000) { // exact match was found - pFrom->mapping[i] = res & 0xFF; + newPalette->mapping[i] = res & 0xFF; continue; } // no exact match - see if there is an unused color for (j = 1; j < 256; j++) if (!_sysPalette.colors[j].used) { - _sysPalette.colors[j].used = pFrom->colors[i].used; - _sysPalette.colors[j].r = pFrom->colors[i].r; - _sysPalette.colors[j].g = pFrom->colors[i].g; - _sysPalette.colors[j].b = pFrom->colors[i].b; - pFrom->mapping[i] = j; + _sysPalette.colors[j].used = newPalette->colors[i].used; + _sysPalette.colors[j].r = newPalette->colors[i].r; + _sysPalette.colors[j].g = newPalette->colors[i].g; + _sysPalette.colors[j].b = newPalette->colors[i].b; + newPalette->mapping[i] = j; paletteChanged = true; break; } // if still no luck - set an approximate color if (j == 256) { - pFrom->mapping[i] = res & 0xFF; + newPalette->mapping[i] = res & 0xFF; _sysPalette.colors[res & 0xFF].used |= 0x10; } } -- cgit v1.2.3 From f58c69e65d8dfa7ca924885d86043b84b18a522b Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 20 Jun 2010 14:46:00 +0000 Subject: Commit slightly modified version of patch #3018727: fix subtitle options (thanks fuzzie). svn-id: r50080 --- gui/options.cpp | 6 +++--- gui/options.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 780670e78b..7a69c6a25f 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -269,8 +269,8 @@ void OptionsDialog::open() { int speed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); - _subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); - _subToggleGroup->setValue(_subMode); + int subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); + _subToggleGroup->setValue(subMode); // Engines that reuse the subtitle speed widget set their own max value. // Scale the config value accordingly (see addSubtitleControls) @@ -401,7 +401,7 @@ void OptionsDialog::close() { int talkspeed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); - switch (_subMode) { + switch (_subToggleGroup->getValue()) { case kSubtitlesSpeech: subtitles = speech_mute = false; break; diff --git a/gui/options.h b/gui/options.h index fab25ebaed..cc62a309b4 100644 --- a/gui/options.h +++ b/gui/options.h @@ -125,7 +125,6 @@ private: RadiobuttonWidget *_subToggleSubOnly; RadiobuttonWidget *_subToggleSpeechOnly; RadiobuttonWidget *_subToggleSubBoth; - int _subMode; static const char *_subModeDesc[]; static const char *_lowresSubModeDesc[]; StaticTextWidget *_subSpeedDesc; -- cgit v1.2.3 From 7ce739f51b1556e211bffc3f82617013afe23cb8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 15:01:31 +0000 Subject: SCI: kPalVary - cleanup and some more code svn-id: r50081 --- engines/sci/engine/kgraphics.cpp | 6 +++--- engines/sci/graphics/animate.cpp | 4 ++++ engines/sci/graphics/palette.cpp | 40 +++++++++++++++++++++++++++++----------- engines/sci/graphics/palette.h | 13 +++++++++---- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 344d79b9d2..da0f533709 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -652,7 +652,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { ticks = argv[2].toUint16(); paletteStop = argc >= 4 ? argv[3].toUint16() : 64; paletteDirection = argc >= 5 ? argv[4].toUint16() : 1; - g_sci->_gfxPalette->startPalVary(paletteId, ticks); + g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks); warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, paletteStop, paletteDirection); } else { warning("kPalVary(init) called with unsupported argc %d", argc); @@ -670,7 +670,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } case 3: { // DeInit if (argc == 1) { - g_sci->_gfxPalette->stopPalVary(); + g_sci->_gfxPalette->kernelPalVaryDeinit(); warning("kPalVary(deinit)"); } else { warning("kPalVary(deinit) called with unsupported argc %d", argc); @@ -690,7 +690,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { bool pauseState; if (argc == 2) { pauseState = argv[1].isNull() ? false : true; - g_sci->_gfxPalette->togglePalVary(pauseState); + g_sci->_gfxPalette->kernelPalVaryToggle(pauseState); warning("kPalVary(pause) called with state = %d", pauseState); } else { warning("kPalVary(pause) called with unsupported argc %d", argc); diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 06054f3a19..339132a76c 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -35,6 +35,7 @@ #include "sci/graphics/cursor.h" #include "sci/graphics/ports.h" #include "sci/graphics/paint16.h" +#include "sci/graphics/palette.h" #include "sci/graphics/view.h" #include "sci/graphics/screen.h" #include "sci/graphics/transitions.h" @@ -592,6 +593,9 @@ void GfxAnimate::animateShowPic() { void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t *argv) { byte old_picNotValid = _screen->_picNotValid; + if (getSciVersion() >= SCI_VERSION_1_1) + _palette->palVaryUpdate(); + if (listReference.isNull()) { disposeLastCast(); if (_screen->_picNotValid) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 56e2ff67a2..5a0a661a56 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -72,6 +72,8 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _alwaysForceRealMerge = true; else if (g_sci->getGameId() == "pq1sci") _alwaysForceRealMerge = true; + + palVaryInit(); } GfxPalette::~GfxPalette() { @@ -473,7 +475,7 @@ void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { // Saving/restoring // need to save start and target-palette, when palVaryOn = true -void GfxPalette::startPalVary(GuiResourceId resourceId, uint16 ticks) { +void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks) { kernelSetFromResource(resourceId, true); return; @@ -481,19 +483,23 @@ void GfxPalette::startPalVary(GuiResourceId resourceId, uint16 ticks) { return; _palVaryResourceId = resourceId; - _palVaryStart = g_system->getMillis(); - _palVaryEnd = _palVaryStart + ticks * 1000 / 60; - g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60, this); + _palVarySignal = 0; + // Call signal increase every [ticks] + g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); } -void GfxPalette::togglePalVary(bool pause) { +void GfxPalette::kernelPalVaryToggle(bool pause) { // this call is actually counting states, so calling this 3 times with true will require calling it later // 3 times with false to actually remove pause - - // TODO + if (pause) { + _palVaryPaused++; + } else { + if (_palVaryPaused) + _palVaryPaused--; + } } -void GfxPalette::stopPalVary() { +void GfxPalette::kernelPalVaryDeinit() { g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); // HACK: just set the target palette @@ -502,12 +508,24 @@ void GfxPalette::stopPalVary() { _palVaryResourceId = -1; // invalidate the target palette } +void GfxPalette::palVaryInit() { + _palVaryResourceId = -1; + _palVaryPaused = 0; + _palVarySignal = 0; +} + void GfxPalette::palVaryCallback(void *refCon) { - ((GfxPalette *)refCon)->doPalVary(); + ((GfxPalette *)refCon)->palVaryIncreaseSignal(); +} + +void GfxPalette::palVaryIncreaseSignal() { + if (!_palVaryPaused) + _palVarySignal++; } -void GfxPalette::doPalVary() { - // TODO: do palette transition here... +// Actually do the pal vary processing +void GfxPalette::palVaryUpdate() { + } } // End of namespace Sci diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 53eb97e6a1..af649015d5 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -62,21 +62,26 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); - void startPalVary(GuiResourceId resourceId, uint16 ticks); - void togglePalVary(bool pause); - void stopPalVary(); + void kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks); + void kernelPalVaryToggle(bool pause); + void kernelPalVaryDeinit(); + void palVaryUpdate(); Palette _sysPalette; private: + void palVaryInit(); static void palVaryCallback(void *refCon); - void doPalVary(); + void palVaryIncreaseSignal(); GfxScreen *_screen; ResourceManager *_resMan; + GuiResourceId _palVaryResourceId; uint32 _palVaryStart; uint32 _palVaryEnd; + int _palVaryPaused; + int _palVarySignal; bool _sysPaletteChanged; bool _alwaysForceRealMerge; -- cgit v1.2.3 From b016c16300577ae29d5a78e5be532cef3d4e21ce Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 16:31:24 +0000 Subject: SCI: some kPalVary support - intro of island dr. brain works fine now svn-id: r50082 --- engines/sci/engine/kgraphics.cpp | 11 ++--- engines/sci/graphics/palette.cpp | 91 +++++++++++++++++++++++++++++++++------- engines/sci/graphics/palette.h | 18 ++++---- 3 files changed, 94 insertions(+), 26 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index da0f533709..f011f0e2d6 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -646,14 +646,15 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { switch (operation) { case 0: { // Init GuiResourceId paletteId; - uint16 ticks, paletteStop, paletteDirection; + uint16 ticks, stepStop; + int16 direction; if ((argc >= 3) && (argc <= 5)) { paletteId = argv[1].toUint16(); ticks = argv[2].toUint16(); - paletteStop = argc >= 4 ? argv[3].toUint16() : 64; - paletteDirection = argc >= 5 ? argv[4].toUint16() : 1; - g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks); - warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, paletteStop, paletteDirection); + stepStop = argc >= 4 ? argv[3].toUint16() : 64; + direction = argc >= 5 ? argv[4].toUint16() : 1; + g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction); + warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, stepStop, direction); } else { warning("kPalVary(init) called with unsupported argc %d", argc); } diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 5a0a661a56..68483ac954 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -212,6 +212,10 @@ void GfxPalette::setEGA() { void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { uint32 systime = _sysPalette.timestamp; + // Pal-Vary is taking place -> abort merge + if (_palVaryResourceId != -1) + return; + if (force || newPalette->timestamp != systime) { _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); newPalette->timestamp = _sysPalette.timestamp; @@ -475,17 +479,36 @@ void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { // Saving/restoring // need to save start and target-palette, when palVaryOn = true -void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks) { - kernelSetFromResource(resourceId, true); - return; +void GfxPalette::palVaryInit() { + _palVaryResourceId = -1; + _palVaryPaused = 0; + _palVarySignal = 0; + _palVaryStep = 0; + _palVaryStepStop = 0; + _palVaryDirection = 0; +} - if (_palVaryResourceId >= 0) // another palvary is taking place, return +void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, int16 direction) { + //kernelSetFromResource(resourceId, true); + //return; + if (_palVaryResourceId != -1) // another palvary is taking place, return return; _palVaryResourceId = resourceId; - _palVarySignal = 0; - // Call signal increase every [ticks] - g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), 0); + if (palResource) { + // Load and initialize destination palette + createFromData(palResource->data, &_palVaryTargetPalette); + // Save current palette + memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette)); + + _palVarySignal = 0; + _palVaryStep = 1; + _palVaryStepStop = stepStop; + _palVaryDirection = direction; + // Call signal increase every [ticks] + g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); + } } void GfxPalette::kernelPalVaryToggle(bool pause) { @@ -503,17 +526,11 @@ void GfxPalette::kernelPalVaryDeinit() { g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); // HACK: just set the target palette - kernelSetFromResource(_palVaryResourceId, true); + //kernelSetFromResource(_palVaryResourceId, true); _palVaryResourceId = -1; // invalidate the target palette } -void GfxPalette::palVaryInit() { - _palVaryResourceId = -1; - _palVaryPaused = 0; - _palVarySignal = 0; -} - void GfxPalette::palVaryCallback(void *refCon) { ((GfxPalette *)refCon)->palVaryIncreaseSignal(); } @@ -525,7 +542,53 @@ void GfxPalette::palVaryIncreaseSignal() { // Actually do the pal vary processing void GfxPalette::palVaryUpdate() { + if (_palVarySignal) { + palVaryProcess(_palVarySignal, true); + _palVarySignal = 0; + } +} + +// Processes pal vary updates +void GfxPalette::palVaryProcess(int signal, bool setPalette) { + int16 stepChange = signal * _palVaryDirection; + + _palVaryStep += stepChange; + if (stepChange > 0) { + if (_palVaryStep > _palVaryStepStop) + _palVaryStep = _palVaryStepStop; + } else { + if (_palVaryStep < _palVaryStepStop) { + if (!signal) + _palVaryStep = _palVaryStepStop; + } + } + // We don't need updates anymore, if we reached end-position + if (_palVaryStep == _palVaryStepStop) + g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); + + // Calculate inbetween palette + Sci::Color inbetween; + int16 color; + for (int colorNr = 1; colorNr < 255; colorNr++) { + inbetween.used = _sysPalette.colors[colorNr].used; + color = _palVaryTargetPalette.colors[colorNr].r - _palVaryOriginPalette.colors[colorNr].r; + inbetween.r = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].r; + color = _palVaryTargetPalette.colors[colorNr].g - _palVaryOriginPalette.colors[colorNr].g; + inbetween.g = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].g; + color = _palVaryTargetPalette.colors[colorNr].b - _palVaryOriginPalette.colors[colorNr].b; + inbetween.b = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].b; + + if (memcmp(&inbetween, &_sysPalette.colors[colorNr], sizeof(Sci::Color))) { + _sysPalette.colors[colorNr] = inbetween; + _sysPaletteChanged = true; + } + } + + if ((_sysPaletteChanged) && (setPalette) && (_screen->_picNotValid == 0)) { + setOnScreen(); + _sysPaletteChanged = false; + } } } // End of namespace Sci diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index af649015d5..861684ecb4 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -62,10 +62,11 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); - void kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks); + void kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stopPercentage, int16 direction); void kernelPalVaryToggle(bool pause); void kernelPalVaryDeinit(); void palVaryUpdate(); + void palVaryProcess(int signal, bool setPalette); Palette _sysPalette; @@ -77,16 +78,19 @@ private: GfxScreen *_screen; ResourceManager *_resMan; - GuiResourceId _palVaryResourceId; - uint32 _palVaryStart; - uint32 _palVaryEnd; - int _palVaryPaused; - int _palVarySignal; - bool _sysPaletteChanged; bool _alwaysForceRealMerge; Common::Array _schedules; + + GuiResourceId _palVaryResourceId; + Palette _palVaryOriginPalette; + Palette _palVaryTargetPalette; + uint16 _palVaryStep; + uint16 _palVaryStepStop; + int16 _palVaryDirection; + int _palVaryPaused; + int _palVarySignal; }; } // End of namespace Sci -- cgit v1.2.3 From 8fcb14d235cc4dbfc25eb503d197ff5c2f268179 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 16:36:34 +0000 Subject: SCI: adding kPalVary update call to kFrameout - it's getting morning now in gabriel knight 1 svn-id: r50083 --- engines/sci/graphics/frameout.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index f16f1068a9..d8f7285887 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -37,6 +37,7 @@ #include "sci/graphics/view.h" #include "sci/graphics/screen.h" #include "sci/graphics/paint32.h" +#include "sci/graphics/palette.h" #include "sci/graphics/picture.h" #include "sci/graphics/frameout.h" @@ -121,6 +122,8 @@ void GfxFrameout::kernelFrameout() { FrameoutList itemList; FrameoutEntry *itemEntry; + _palette->palVaryUpdate(); + // Allocate enough space for all screen items itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); -- cgit v1.2.3 From e8262d989e31742f554d37c962254c6ac37a1a7f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 16:48:52 +0000 Subject: SCI: adding code for kPalVary ticks == 0 case, fixes pharkas svn-id: r50084 --- engines/sci/graphics/palette.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 68483ac954..812bbfb234 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -506,6 +506,11 @@ void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1 _palVaryStep = 1; _palVaryStepStop = stepStop; _palVaryDirection = direction; + if (!ticks) { + // if no ticks are given, jump directly to destination + _palVaryDirection = stepStop; + ticks = 1; + } // Call signal increase every [ticks] g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); } -- cgit v1.2.3 From 7ecff0a300e2e8a809818472160121743971e17a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 17:08:39 +0000 Subject: SCI: implementing kPalVary(2) svn-id: r50085 --- engines/sci/engine/kgraphics.cpp | 17 +++++++++++------ engines/sci/graphics/palette.cpp | 16 +++++++++++++--- engines/sci/graphics/palette.h | 5 +++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f011f0e2d6..2ec2cdb4c3 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -653,7 +653,8 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { ticks = argv[2].toUint16(); stepStop = argc >= 4 ? argv[3].toUint16() : 64; direction = argc >= 5 ? argv[4].toUint16() : 1; - g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction); + if (g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction)) + return SIGNAL_REG; warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, stepStop, direction); } else { warning("kPalVary(init) called with unsupported argc %d", argc); @@ -664,9 +665,13 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } - case 2: { // Unknown - // Called in QFG4 demo (1 parameter) - warning("kPalVary(2) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + case 2: { // Get Current Step + if (argc == 1) { + int16 currentStep = g_sci->_gfxPalette->kernelPalVaryGetCurrentStep(); + return make_reg(0, currentStep); + } else { + warning("kPalVary(GetCurrentStep) called with unsupported argc %d", argc); + } break; } case 3: { // DeInit @@ -687,11 +692,11 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(5) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } - case 6: { // Pause + case 6: { // Pause/Resume bool pauseState; if (argc == 2) { pauseState = argv[1].isNull() ? false : true; - g_sci->_gfxPalette->kernelPalVaryToggle(pauseState); + g_sci->_gfxPalette->kernelPalVaryPause(pauseState); warning("kPalVary(pause) called with state = %d", pauseState); } else { warning("kPalVary(pause) called with unsupported argc %d", argc); diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 812bbfb234..f4222fabdd 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -488,11 +488,11 @@ void GfxPalette::palVaryInit() { _palVaryDirection = 0; } -void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, int16 direction) { +bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, int16 direction) { //kernelSetFromResource(resourceId, true); //return; if (_palVaryResourceId != -1) // another palvary is taking place, return - return; + return false; _palVaryResourceId = resourceId; Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), 0); @@ -513,10 +513,20 @@ void GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1 } // Call signal increase every [ticks] g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); + return true; } + return false; } -void GfxPalette::kernelPalVaryToggle(bool pause) { +int16 GfxPalette::kernelPalVaryGetCurrentStep() { + if (_palVaryDirection >= 0) + return _palVaryStep; + return -_palVaryStep; +} + +void GfxPalette::kernelPalVaryPause(bool pause) { + if (_palVaryResourceId == -1) + return; // this call is actually counting states, so calling this 3 times with true will require calling it later // 3 times with false to actually remove pause if (pause) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 861684ecb4..7ea231f13b 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -62,8 +62,9 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); - void kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stopPercentage, int16 direction); - void kernelPalVaryToggle(bool pause); + bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stopPercentage, int16 direction); + int16 kernelPalVaryGetCurrentStep(); + void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); void palVaryUpdate(); void palVaryProcess(int signal, bool setPalette); -- cgit v1.2.3 From bb1358ae3b224d8cdb1a870778e75334a691cf13 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 17:14:58 +0000 Subject: SCI: adding info about kPalVary(8) being SCI32 exclusive svn-id: r50086 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 2ec2cdb4c3..090af4fb1f 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -703,7 +703,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } break; } - case 8: { // Unknown + case 8: { // Unknown (seems to be SCI32 exclusive) // Called in PQ4 (1 parameter) warning("kPalVary(8) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; -- cgit v1.2.3 From ff785325ad3527394cec06fbd9dc331854e97f30 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 20 Jun 2010 17:17:46 +0000 Subject: Sort planes in kFrameOut by priority and keep plane/item priority separate as they represent two different things. Fixes various SCI32 graphical glitches. Most (all?) remaining glitches are because we don't yet handle kSignalFixedPriority. svn-id: r50087 --- engines/sci/graphics/frameout.cpp | 145 ++++++++++++++++++-------------------- engines/sci/graphics/frameout.h | 6 +- 2 files changed, 74 insertions(+), 77 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index d8f7285887..8fa4f417b0 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -47,7 +47,6 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd : _segMan(segMan), _resMan(resMan), _cache(cache), _screen(screen), _palette(palette), _paint32(paint32) { _coordAdjuster = (GfxCoordAdjuster32 *)coordAdjuster; - _highPlanePri = 0; } GfxFrameout::~GfxFrameout() { @@ -55,30 +54,20 @@ GfxFrameout::~GfxFrameout() { void GfxFrameout::kernelAddPlane(reg_t object) { _planes.push_back(object); - int16 planePri = readSelectorValue(_segMan, object, SELECTOR(priority)) & 0xFFFF; - if (planePri > _highPlanePri) - _highPlanePri = planePri; + sortPlanes(); } void GfxFrameout::kernelUpdatePlane(reg_t object) { + sortPlanes(); } void GfxFrameout::kernelDeletePlane(reg_t object) { - for (uint32 planeNr = 0; planeNr < _planes.size(); planeNr++) { - if (_planes[planeNr] == object) { - _planes.remove_at(planeNr); - break; + for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { + if (object == *it) { + _planes.erase(it); + return; } } - - // Recalculate highPlanePri - _highPlanePri = 0; - - for (uint32 planeNr = 0; planeNr < _planes.size(); planeNr++) { - int16 planePri = readSelectorValue(_segMan, _planes[planeNr], SELECTOR(priority)) & 0xFFFF; - if (planePri > _highPlanePri) - _highPlanePri = planePri; - } } void GfxFrameout::kernelAddScreenItem(reg_t object) { @@ -96,70 +85,77 @@ void GfxFrameout::kernelDeleteScreenItem(reg_t object) { } int16 GfxFrameout::kernelGetHighPlanePri() { - return _highPlanePri; + sortPlanes(); + reg_t object = _planes.back(); + return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back(), SELECTOR(priority)); } bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { return (entry1->priority == entry2->priority) ? (entry1->y < entry2->y) : (entry1->priority < entry2->priority); } -void GfxFrameout::kernelFrameout() { - int16 itemCount = 0; - reg_t planeObject; - GuiResourceId planePictureNr; - GfxPicture *planePicture = 0; - int16 planePictureCels = 0; - int16 planePictureCel; - int16 planePriority; - Common::Rect planeRect; - int16 planeResY, planeResX; - byte planeBack; - - reg_t itemObject; - reg_t itemPlane; - - FrameoutEntry *itemData; - FrameoutList itemList; - FrameoutEntry *itemEntry; +bool planeSortHelper(const reg_t entry1, const reg_t entry2) { + SegManager *segMan = g_sci->getEngineState()->_segMan; - _palette->palVaryUpdate(); + uint16 plane1Priority = readSelectorValue(segMan, entry1, SELECTOR(priority)); + uint16 plane2Priority = readSelectorValue(segMan, entry2, SELECTOR(priority)); - // Allocate enough space for all screen items - itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); + if (plane1Priority == 0xffff) + return true; - for (uint32 planeNr = 0; planeNr < _planes.size(); planeNr++) { - planeObject = _planes[planeNr]; + if (plane2Priority == 0xffff) + return false; - // Remove any invalid planes - if (!_segMan->isObject(planeObject)) { - _planes.remove_at(planeNr); - planeNr--; - continue; - } + return plane1Priority < plane2Priority; +} + +void GfxFrameout::sortPlanes() { + // First, remove any invalid planes + for (Common::List::iterator it = _planes.begin(); it != _planes.end();) { + if (!_segMan->isObject(*it)) + it = _planes.erase(it); + else + it++; + } + + // Sort the rest of them + Common::sort(_planes.begin(), _planes.end(), planeSortHelper); +} - planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); +void GfxFrameout::kernelFrameout() { + _palette->palVaryUpdate(); - if (planePriority == -1) // Plane currently not meant to be shown + // Allocate enough space for all screen items + FrameoutEntry *itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); + + for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { + reg_t planeObject = *it; + uint16 planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); + + if (planePriority == 0xffff) // Plane currently not meant to be shown continue; + Common::Rect planeRect; planeRect.top = readSelectorValue(_segMan, planeObject, SELECTOR(top)); planeRect.left = readSelectorValue(_segMan, planeObject, SELECTOR(left)); planeRect.bottom = readSelectorValue(_segMan, planeObject, SELECTOR(bottom)); planeRect.right = readSelectorValue(_segMan, planeObject, SELECTOR(right)); - planeResY = readSelectorValue(_segMan, planeObject, SELECTOR(resY)); - planeResX = readSelectorValue(_segMan, planeObject, SELECTOR(resX)); + int16 planeResY = readSelectorValue(_segMan, planeObject, SELECTOR(resY)); + int16 planeResX = readSelectorValue(_segMan, planeObject, SELECTOR(resX)); planeRect.top = (planeRect.top * _screen->getHeight()) / planeResY; planeRect.left = (planeRect.left * _screen->getWidth()) / planeResX; planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; - planeBack = readSelectorValue(_segMan, planeObject, SELECTOR(back)); - if (planeBack) { + byte planeBack = readSelectorValue(_segMan, planeObject, SELECTOR(back)); + if (planeBack) _paint32->fillRect(planeRect, planeBack); - } - planePictureNr = readSelectorValue(_segMan, planeObject, SELECTOR(picture)); + GuiResourceId planePictureNr = readSelectorValue(_segMan, planeObject, SELECTOR(picture)); + GfxPicture *planePicture = 0; + int16 planePictureCels = 0; + if ((planePictureNr != 0xFFFF) && (planePictureNr != 0xFFFE)) { planePicture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, planePictureNr, false); planePictureCels = planePicture->getSci32celCount(); @@ -168,10 +164,12 @@ void GfxFrameout::kernelFrameout() { } // Fill our itemlist for this plane - itemCount = 0; - itemEntry = itemData; + int16 itemCount = 0; + FrameoutEntry *itemEntry = itemData; + FrameoutList itemList; + for (uint32 itemNr = 0; itemNr < _screenItems.size(); itemNr++) { - itemObject = _screenItems[itemNr]; + reg_t itemObject = _screenItems[itemNr]; // Remove any invalid items if (!_segMan->isObject(itemObject)) { @@ -180,7 +178,7 @@ void GfxFrameout::kernelFrameout() { continue; } - itemPlane = readSelector(_segMan, itemObject, SELECTOR(plane)); + reg_t itemPlane = readSelector(_segMan, itemObject, SELECTOR(plane)); if (planeObject == itemPlane) { // Found an item on current plane itemEntry->viewId = readSelectorValue(_segMan, itemObject, SELECTOR(view)); @@ -200,8 +198,9 @@ void GfxFrameout::kernelFrameout() { itemEntry->y += planeRect.top; itemEntry->x += planeRect.left; - if (itemEntry->priority == 0) - itemEntry->priority = itemEntry->y; + if (!(itemEntry->signal & 0x0010)) { // kSignalFixedPriority + // TODO: Change priority of this item + } itemList.push_back(itemEntry); itemEntry++; @@ -213,12 +212,10 @@ void GfxFrameout::kernelFrameout() { Common::sort(itemList.begin(), itemList.end(), sortHelper); // Now display itemlist - planePictureCel = 0; - + int16 planePictureCel = 0; itemEntry = itemData; - FrameoutList::iterator listIterator = itemList.begin(); - FrameoutList::iterator listEnd = itemList.end(); - while (listIterator != listEnd) { + + for (FrameoutList::iterator listIterator = itemList.begin(); listIterator != itemList.end(); listIterator++) { itemEntry = *listIterator; if (planePicture) { while ((planePictureCel <= itemEntry->priority) && (planePictureCel < planePictureCels)) { @@ -226,23 +223,20 @@ void GfxFrameout::kernelFrameout() { planePictureCel++; } } + if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); - if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) { + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, &itemEntry->celRect); - } else + else view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, &itemEntry->celRect); - if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= _screen->getHeight()) { - listIterator++; + if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= _screen->getHeight()) continue; - } - if (itemEntry->celRect.left < 0 || itemEntry->celRect.left >= _screen->getWidth()) { - listIterator++; + if (itemEntry->celRect.left < 0 || itemEntry->celRect.left >= _screen->getWidth()) continue; - } Common::Rect clipRect; clipRect = itemEntry->celRect; @@ -282,8 +276,8 @@ void GfxFrameout::kernelFrameout() { } } } - listIterator++; } + if (planePicture) { while (planePictureCel < planePictureCels) { planePicture->drawSci32Vga(planePictureCel); @@ -293,6 +287,7 @@ void GfxFrameout::kernelFrameout() { planePicture = 0; } } + free(itemData); _screen->copyToScreen(); } diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 8015b9879f..e4568ad602 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -41,6 +41,7 @@ struct FrameoutEntry { int16 scaleY; Common::Rect celRect; }; + typedef Common::List FrameoutList; class GfxCache; @@ -74,8 +75,9 @@ private: GfxPaint32 *_paint32; Common::Array _screenItems; - Common::Array _planes; - int16 _highPlanePri; + Common::List _planes; + + void sortPlanes(); }; } // End of namespace Sci -- cgit v1.2.3 From 3c6639eb86e8328af84c190878b09c331fe4c1ac Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 18:20:05 +0000 Subject: SCI: implemented kPalVary(reverse) for pharkas, although there is a bug somewhere, not working 100% svn-id: r50089 --- engines/sci/engine/kgraphics.cpp | 19 ++++++++++++---- engines/sci/engine/message.cpp | 2 +- engines/sci/graphics/palette.cpp | 47 ++++++++++++++++++++++++++++------------ engines/sci/graphics/palette.h | 9 +++++--- 4 files changed, 55 insertions(+), 22 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 090af4fb1f..1c69afc48a 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -647,7 +647,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { case 0: { // Init GuiResourceId paletteId; uint16 ticks, stepStop; - int16 direction; + uint16 direction; if ((argc >= 3) && (argc <= 5)) { paletteId = argv[1].toUint16(); ticks = argv[2].toUint16(); @@ -661,9 +661,20 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } break; } - case 1: { // Unknown - warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc); - break; + case 1: { // Reverse + int16 ticks, stepStop, direction; + + if ((argc >= 1) && (argc <= 4)) { + ticks = argc >= 2 ? argv[1].toUint16() : -1; + stepStop = argc >= 3 ? argv[2].toUint16() : 0; + direction = argc >= 4 ? argv[3].toSint16() : -1; + + int16 result = g_sci->_gfxPalette->kernelPalVaryReverse(ticks, stepStop, direction); + warning("kPalVary(reverse) called with ticks = %d, stop = %d, direction = %d", ticks, stepStop, direction); + return make_reg(0, result); + } else { + warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + } } case 2: { // Get Current Step if (argc == 1) { diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index a4bde9b582..18e60eb521 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -380,7 +380,7 @@ void MessageState::outputString(reg_t buf, const Common::String &str) { if ((unsigned)buffer_r.maxSize >= str.size() + 1) { _segMan->strcpy(buf, str.c_str()); } else { - error("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); + warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); // Set buffer to empty string if possible if (buffer_r.maxSize > 0) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index f4222fabdd..94e847014f 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -486,9 +486,16 @@ void GfxPalette::palVaryInit() { _palVaryStep = 0; _palVaryStepStop = 0; _palVaryDirection = 0; + _palVaryTicks = 0; } -bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, int16 direction) { +void GfxPalette::palVaryInstallTimer() { + int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1; + // Call signal increase every [ticks] + g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); +} + +bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction) { //kernelSetFromResource(resourceId, true); //return; if (_palVaryResourceId != -1) // another palvary is taking place, return @@ -503,21 +510,36 @@ bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1 memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette)); _palVarySignal = 0; + _palVaryTicks = ticks; _palVaryStep = 1; _palVaryStepStop = stepStop; _palVaryDirection = direction; - if (!ticks) { - // if no ticks are given, jump directly to destination + // if no ticks are given, jump directly to destination + if (!_palVaryTicks) _palVaryDirection = stepStop; - ticks = 1; - } - // Call signal increase every [ticks] - g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); + palVaryInstallTimer(); return true; } return false; } +int16 GfxPalette::kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction) { + if (_palVaryResourceId == -1) + return 0; + + if (_palVaryStep > 64) + _palVaryStep = 64; + if (ticks != -1) + _palVaryTicks = ticks; + _palVaryStepStop = stepStop; + _palVaryDirection = direction != -1 ? -direction : -_palVaryDirection; + + if (!_palVaryTicks) + _palVaryDirection = _palVaryStepStop - _palVaryStep; + palVaryInstallTimer(); + return kernelPalVaryGetCurrentStep(); +} + int16 GfxPalette::kernelPalVaryGetCurrentStep() { if (_palVaryDirection >= 0) return _palVaryStep; @@ -540,9 +562,6 @@ void GfxPalette::kernelPalVaryPause(bool pause) { void GfxPalette::kernelPalVaryDeinit() { g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); - // HACK: just set the target palette - //kernelSetFromResource(_palVaryResourceId, true); - _palVaryResourceId = -1; // invalidate the target palette } @@ -573,7 +592,7 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) { _palVaryStep = _palVaryStepStop; } else { if (_palVaryStep < _palVaryStepStop) { - if (!signal) + if (signal) _palVaryStep = _palVaryStepStop; } } @@ -588,11 +607,11 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) { for (int colorNr = 1; colorNr < 255; colorNr++) { inbetween.used = _sysPalette.colors[colorNr].used; color = _palVaryTargetPalette.colors[colorNr].r - _palVaryOriginPalette.colors[colorNr].r; - inbetween.r = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].r; + inbetween.r = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].r; color = _palVaryTargetPalette.colors[colorNr].g - _palVaryOriginPalette.colors[colorNr].g; - inbetween.g = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].g; + inbetween.g = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].g; color = _palVaryTargetPalette.colors[colorNr].b - _palVaryOriginPalette.colors[colorNr].b; - inbetween.b = ((color * _palVaryStep) >> 6) + _palVaryOriginPalette.colors[colorNr].b; + inbetween.b = ((color * _palVaryStep) / 64) + _palVaryOriginPalette.colors[colorNr].b; if (memcmp(&inbetween, &_sysPalette.colors[colorNr], sizeof(Sci::Color))) { _sysPalette.colors[colorNr] = inbetween; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 7ea231f13b..5fcf1a0412 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -62,7 +62,8 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); - bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stopPercentage, int16 direction); + bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction); + int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction); int16 kernelPalVaryGetCurrentStep(); void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); @@ -73,6 +74,7 @@ public: private: void palVaryInit(); + void palVaryInstallTimer(); static void palVaryCallback(void *refCon); void palVaryIncreaseSignal(); @@ -87,9 +89,10 @@ private: GuiResourceId _palVaryResourceId; Palette _palVaryOriginPalette; Palette _palVaryTargetPalette; - uint16 _palVaryStep; - uint16 _palVaryStepStop; + int16 _palVaryStep; + int16 _palVaryStepStop; int16 _palVaryDirection; + uint16 _palVaryTicks; int _palVaryPaused; int _palVarySignal; }; -- cgit v1.2.3 From 05e2bbcc333afd73a5671980a90f70e0e0fb9506 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 18:22:49 +0000 Subject: SCI: dont display string set by kSetQuitStr svn-id: r50090 --- engines/sci/engine/kstring.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 5dd3910e3e..1927a79eea 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -565,7 +565,7 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { reg_t kSetQuitStr(EngineState *s, int argc, reg_t *argv) { Common::String quitStr = s->_segMan->getString(argv[0]); - debug("Setting quit string to '%s'", quitStr.c_str()); + //debug("Setting quit string to '%s'", quitStr.c_str()); return s->r_acc; } -- cgit v1.2.3 From d37a25cfee6832e7b92abaa693531e496b83a3c2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 19:18:33 +0000 Subject: SCI: cleanup of SciPalette svn-id: r50091 --- engines/sci/graphics/palette.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 94e847014f..abe6043f29 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -342,8 +342,6 @@ void GfxPalette::getSys(Palette *pal) { } void GfxPalette::setOnScreen() { -// if (pal != &_sysPalette) -// memcpy(&_sysPalette,pal,sizeof(Palette)); // We dont change palette at all times for amiga if (_resMan->isAmiga32color()) return; @@ -355,7 +353,7 @@ void GfxPalette::setOnScreen() { } bool GfxPalette::kernelSetFromResource(GuiResourceId resourceId, bool force) { - Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), 0); + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); Palette palette; if (palResource) { @@ -496,13 +494,11 @@ void GfxPalette::palVaryInstallTimer() { } bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction) { - //kernelSetFromResource(resourceId, true); - //return; if (_palVaryResourceId != -1) // another palvary is taking place, return return false; _palVaryResourceId = resourceId; - Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), 0); + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); if (palResource) { // Load and initialize destination palette createFromData(palResource->data, &_palVaryTargetPalette); -- cgit v1.2.3 From a22e294ca674a2e879b31eff877fc30d256965d7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 19:39:08 +0000 Subject: SCI: displaying debug warning again for kPalVary(init) svn-id: r50092 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 1c69afc48a..ca2bec39d7 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -653,9 +653,9 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { ticks = argv[2].toUint16(); stepStop = argc >= 4 ? argv[3].toUint16() : 64; direction = argc >= 5 ? argv[4].toUint16() : 1; + warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, stepStop, direction); if (g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction)) return SIGNAL_REG; - warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, stepStop, direction); } else { warning("kPalVary(init) called with unsupported argc %d", argc); } -- cgit v1.2.3 From 3a9217dd5a2b1f9376f65111f8b975c07d50a9ad Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 20:05:00 +0000 Subject: SCI: disable palvary when reverse is fully done - fixes palette getting stuck in pharkas (the broken palette in there is actually not caused by palvary, it was just overwritten before by view palette updates and those dont occur when palvary is active) svn-id: r50093 --- engines/sci/graphics/palette.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index abe6043f29..3ff6c4dc54 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -596,6 +596,8 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) { // We don't need updates anymore, if we reached end-position if (_palVaryStep == _palVaryStepStop) g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); + if (_palVaryStep == 0) + _palVaryResourceId = -1; // Calculate inbetween palette Sci::Color inbetween; -- cgit v1.2.3 From 66b9eaac34d3eefc12cf6dcbacf2eb8192e0de81 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 20:09:07 +0000 Subject: SCI: adding timestamp update for frameout, fixes gk1 windows main menu svn-id: r50094 --- engines/sci/graphics/frameout.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 8fa4f417b0..545121c2b8 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -161,6 +161,7 @@ void GfxFrameout::kernelFrameout() { planePictureCels = planePicture->getSci32celCount(); _coordAdjuster->pictureSetDisplayArea(planeRect); + _palette->increaseSysTimestamp(); } // Fill our itemlist for this plane -- cgit v1.2.3 From d79428e816af4a73a21d6c350c5a266af01a08de Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 20 Jun 2010 20:36:14 +0000 Subject: GUI: Tweak low-res Launcher layout (1-2 more games visible in game list, less space wasted between buttons) svn-id: r50098 --- gui/themes/default.inc | 8 ++++---- gui/themes/scummclassic.zip | Bin 55660 -> 55657 bytes gui/themes/scummclassic/classic_layout_lowres.stx | 8 ++++---- gui/themes/scummmodern.zip | Bin 162933 -> 162946 bytes .../scummmodern/scummmodern_layout_lowres.stx | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index a360c95a00..7d80884073 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1245,11 +1245,11 @@ "/> " " " " " -" " +" " " " -" " +" " " " " " " " -" " +" " " " @@ -1280,7 +1280,7 @@ "height='12' " "/> " " " -" " +" " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index acece13d23..080bed0612 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index c994968677..46156aa21c 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -99,11 +99,11 @@ - + - + - + @@ -134,7 +134,7 @@ height = '12' /> - + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 0a6c172fe0..5139fcd573 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 079da11c34..4532b44a06 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -97,11 +97,11 @@ - + - + - + @@ -132,7 +132,7 @@ height = 'Globals.Button.Height' /> - + -- cgit v1.2.3 From 4a83b2c5f6a0b43c25d8870168baca9a76eee103 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 20:52:31 +0000 Subject: SCI: properly implement kPalVary functionality within kDrawPic and transitions, so pharkas finally works w/o palette corruption svn-id: r50099 --- engines/sci/graphics/frameout.cpp | 2 +- engines/sci/graphics/paint16.cpp | 5 ++- engines/sci/graphics/palette.cpp | 77 +++++++++++++++++++++++++----------- engines/sci/graphics/palette.h | 5 ++- engines/sci/graphics/transitions.cpp | 2 + 5 files changed, 63 insertions(+), 28 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 545121c2b8..05c2a1b7ad 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -161,7 +161,7 @@ void GfxFrameout::kernelFrameout() { planePictureCels = planePicture->getSci32celCount(); _coordAdjuster->pictureSetDisplayArea(planeRect); - _palette->increaseSysTimestamp(); + _palette->drewPicture(planePictureNr); } // Fill our itemlist for this plane diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 63e7d30ca0..4cf3cc16e5 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -76,9 +76,10 @@ void GfxPaint16::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mi picture->draw(animationNr, mirroredFlag, addToFlag, paletteId); delete picture; - // We update our sys palette timestamp here (SCI1.1 only) + // We make a call to SciPalette here, for increasing sys timestamp and also loading targetpalette, if palvary active + // (SCI1.1 only) if (getSciVersion() == SCI_VERSION_1_1) - _palette->increaseSysTimestamp(); + _palette->drewPicture(pictureId); } // This one is the only one that updates screen! diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 3ff6c4dc54..c9fb42b48d 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -212,13 +212,16 @@ void GfxPalette::setEGA() { void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { uint32 systime = _sysPalette.timestamp; - // Pal-Vary is taking place -> abort merge - if (_palVaryResourceId != -1) - return; - if (force || newPalette->timestamp != systime) { _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); newPalette->timestamp = _sysPalette.timestamp; + + if (_palVaryResourceId != -1) { + // Pal-vary currently active, we don't set at any time, but also insert into origin palette + insert(newPalette, &_palVaryOriginPalette); + return; + } + if (_sysPaletteChanged && _screen->_picNotValid == 0) { // && systime != _sysPalette.timestamp) { // Removed timestamp checking, because this shouldnt be needed anymore. I'm leaving it commented just in // case this causes regressions @@ -228,6 +231,24 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } +bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { + bool paletteChanged = false; + + for (int i = 1; i < 255; i++) { + if (newPalette->colors[i].used) { + if ((newPalette->colors[i].r != destPalette->colors[i].r) || (newPalette->colors[i].g != destPalette->colors[i].g) || (newPalette->colors[i].b != destPalette->colors[i].b)) { + destPalette->colors[i].r = newPalette->colors[i].r; + destPalette->colors[i].g = newPalette->colors[i].g; + destPalette->colors[i].b = newPalette->colors[i].b; + paletteChanged = true; + } + destPalette->colors[i].used = newPalette->colors[i].used; + newPalette->mapping[i] = i; + } + } + return paletteChanged; +} + bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { uint16 res; int i,j; @@ -236,20 +257,9 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { if ((!forceRealMerge) && (!_alwaysForceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes // There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo) - for (i = 1; i < 255; i++) { - if (newPalette->colors[i].used) { - if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { - _sysPalette.colors[i].r = newPalette->colors[i].r; - _sysPalette.colors[i].g = newPalette->colors[i].g; - _sysPalette.colors[i].b = newPalette->colors[i].b; - paletteChanged = true; - } - _sysPalette.colors[i].used = newPalette->colors[i].used; - newPalette->mapping[i] = i; - } - } + // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls - return paletteChanged; + return insert(newPalette, &_sysPalette); } else { // colors 0 (black) and 255 (white) are not affected by merging @@ -305,10 +315,15 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { return paletteChanged; } -// This is used for SCI1.1 and called from kDrawPic. We only update sysPalette timestamp this way for SCI1.1 -void GfxPalette::increaseSysTimestamp() { +// This is called for SCI1.1, when kDrawPic got done. We update sysPalette timestamp this way for SCI1.1 and also load +// target-palette, if palvary is active +void GfxPalette::drewPicture(GuiResourceId pictureId) { if (!_alwaysForceRealMerge) // Don't do this on inbetween SCI1.1 games _sysPalette.timestamp++; + + if (_palVaryResourceId != -1) { + palVaryLoadTargetPalette(pictureId); + } } uint16 GfxPalette::matchColor(byte r, byte g, byte b) { @@ -487,6 +502,17 @@ void GfxPalette::palVaryInit() { _palVaryTicks = 0; } +bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) { + _palVaryResourceId = resourceId; + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); + if (palResource) { + // Load and initialize destination palette + createFromData(palResource->data, &_palVaryTargetPalette); + return true; + } + return false; +} + void GfxPalette::palVaryInstallTimer() { int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1; // Call signal increase every [ticks] @@ -497,11 +523,7 @@ bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint1 if (_palVaryResourceId != -1) // another palvary is taking place, return return false; - _palVaryResourceId = resourceId; - Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); - if (palResource) { - // Load and initialize destination palette - createFromData(palResource->data, &_palVaryTargetPalette); + if (palVaryLoadTargetPalette(resourceId)) { // Save current palette memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette)); @@ -578,6 +600,13 @@ void GfxPalette::palVaryUpdate() { } } +void GfxPalette::palVaryPrepareForTransition() { + if (_palVaryResourceId != -1) { + // Before doing transitions, we have to prepare palette + palVaryProcess(0, false); + } +} + // Processes pal vary updates void GfxPalette::palVaryProcess(int signal, bool setPalette) { int16 stepChange = signal * _palVaryDirection; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 5fcf1a0412..af193e4b62 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -45,13 +45,14 @@ public: void modifyAmigaPalette(byte *data); void setEGA(); void set(Palette *sciPal, bool force, bool forceRealMerge = false); + bool insert(Palette *newPaette, Palette *destPalette); bool merge(Palette *pFrom, bool force, bool forceRealMerge); uint16 matchColor(byte r, byte g, byte b); void getSys(Palette *pal); void setOnScreen(); - void increaseSysTimestamp(); + void drewPicture(GuiResourceId pictureId); bool kernelSetFromResource(GuiResourceId resourceId, bool force); void kernelSetFlag(uint16 fromColor, uint16 toColor, uint16 flag); @@ -68,6 +69,7 @@ public: void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); void palVaryUpdate(); + void palVaryPrepareForTransition(); void palVaryProcess(int signal, bool setPalette); Palette _sysPalette; @@ -75,6 +77,7 @@ public: private: void palVaryInit(); void palVaryInstallTimer(); + bool palVaryLoadTargetPalette(GuiResourceId resourceId); static void palVaryCallback(void *refCon); void palVaryIncreaseSignal(); diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 9f8d4d1164..9f37aa016d 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -167,6 +167,8 @@ void GfxTransitions::doit(Common::Rect picRect) { } } + _palette->palVaryPrepareForTransition(); + // Now we do the actual transition to the new screen doTransition(_number, false); -- cgit v1.2.3 From 6f195ae5a4c862fede87126e2587b0fdc2952827 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 21:12:15 +0000 Subject: SCI: implemented kPalVary(changeTicks) svn-id: r50100 --- engines/sci/engine/kgraphics.cpp | 17 +++++++++++------ engines/sci/graphics/palette.cpp | 16 ++++++++++++++-- engines/sci/graphics/palette.h | 2 ++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index ca2bec39d7..0b2f37f690 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -673,7 +673,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(reverse) called with ticks = %d, stop = %d, direction = %d", ticks, stepStop, direction); return make_reg(0, result); } else { - warning("kPalVary(1) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + warning("kPalVary(reverse) called with parameter %d (argc %d)", argv[1].toUint16(), argc); } } case 2: { // Get Current Step @@ -694,13 +694,18 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } break; } - case 4: { // Unknown - warning("kPalVary(4) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + case 4: { // Change Target + // seems to be 1 parameter, we should find a game that is using this feature before implementing it + warning("kPalVary(changeTarget) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } - case 5: { // Unknown - // Called in xmas 1992 demo (2 parameters) - warning("kPalVary(5) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + case 5: { // Change ticks + if (argc == 2) { + uint16 ticks = argv[1].toUint16(); + g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks); + } else { + warning("kPalVary(changeTicks) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + } break; } case 6: { // Pause/Resume diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index c9fb42b48d..228e5dfced 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -519,6 +519,10 @@ void GfxPalette::palVaryInstallTimer() { g_sci->getTimerManager()->installTimerProc(&palVaryCallback, 1000000 / 60 * ticks, this); } +void GfxPalette::palVaryRemoveTimer() { + g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); +} + bool GfxPalette::kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction) { if (_palVaryResourceId != -1) // another palvary is taking place, return return false; @@ -564,6 +568,14 @@ int16 GfxPalette::kernelPalVaryGetCurrentStep() { return -_palVaryStep; } +void GfxPalette::kernelPalVaryChangeTicks(uint16 ticks) { + _palVaryTicks = ticks; + if (_palVaryStep - _palVaryStepStop) { + palVaryRemoveTimer(); + palVaryInstallTimer(); + } +} + void GfxPalette::kernelPalVaryPause(bool pause) { if (_palVaryResourceId == -1) return; @@ -578,7 +590,7 @@ void GfxPalette::kernelPalVaryPause(bool pause) { } void GfxPalette::kernelPalVaryDeinit() { - g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); + palVaryRemoveTimer(); _palVaryResourceId = -1; // invalidate the target palette } @@ -624,7 +636,7 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) { // We don't need updates anymore, if we reached end-position if (_palVaryStep == _palVaryStepStop) - g_sci->getTimerManager()->removeTimerProc(&palVaryCallback); + palVaryRemoveTimer(); if (_palVaryStep == 0) _palVaryResourceId = -1; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index af193e4b62..021096873b 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -66,6 +66,7 @@ public: bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction); int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction); int16 kernelPalVaryGetCurrentStep(); + void kernelPalVaryChangeTicks(uint16 ticks); void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); void palVaryUpdate(); @@ -77,6 +78,7 @@ public: private: void palVaryInit(); void palVaryInstallTimer(); + void palVaryRemoveTimer(); bool palVaryLoadTargetPalette(GuiResourceId resourceId); static void palVaryCallback(void *refCon); void palVaryIncreaseSignal(); -- cgit v1.2.3 From 7694993bef7a1c60e7e6413b09d54d2808bb699b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 20 Jun 2010 21:14:46 +0000 Subject: SCI: fixed typo svn-id: r50101 --- engines/sci/graphics/transitions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 9f37aa016d..27cda249d0 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -194,7 +194,7 @@ void GfxTransitions::doTransition(int16 number, bool blackoutFlag) { verticalRollFromCenter(blackoutFlag); break; case SCI_TRANSITIONS_VERTICALROLL_TOCENTER: - verticalRollFromCenter(blackoutFlag); + verticalRollToCenter(blackoutFlag); break; case SCI_TRANSITIONS_HORIZONTALROLL_FROMCENTER: horizontalRollFromCenter(blackoutFlag); -- cgit v1.2.3 From 72534afea9696316c61c2b647f87638a34c2f57e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 20 Jun 2010 22:30:20 +0000 Subject: Ignore the broken 65535x.map file in the QFG4 demo, mistakenly picked up when checking for patches. Audio now works there. svn-id: r50102 --- engines/sci/resource.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 745cad7029..acb7d46127 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1246,6 +1246,11 @@ void ResourceManager::readResourcePatches() { for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { bool bAdd = false; name = (*x)->getName(); + + // HACK: Skip broken map in QFG4 Demo + if (name.equalsIgnoreCase("65535x.map")) + continue; + // SCI1 scheme if (isdigit(name[0])) { resourceNr = atoi(name.c_str()); -- cgit v1.2.3 From 473ae1c11efd6833fd0a9172b9fc54ee6ef66211 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 20 Jun 2010 23:41:54 +0000 Subject: Cleaner fix for the QFG4 demo audio map problem. svn-id: r50104 --- engines/sci/resource.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index acb7d46127..718c675db1 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1247,14 +1247,11 @@ void ResourceManager::readResourcePatches() { bool bAdd = false; name = (*x)->getName(); - // HACK: Skip broken map in QFG4 Demo - if (name.equalsIgnoreCase("65535x.map")) - continue; - // SCI1 scheme if (isdigit(name[0])) { - resourceNr = atoi(name.c_str()); - bAdd = true; + char *end = 0; + resourceNr = strtol(name.c_str(), &end, 10); + bAdd = (*end == '.'); // Ensure the next character is the period } else { // SCI0 scheme int resname_len = strlen(szResType); -- cgit v1.2.3 From 98196b8af672ecbf42738487e659fe905163819a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 10:14:04 +0000 Subject: SCI: GfxPalette::kernelSetIntensity() now also triggers throttler - somewhat "fixes" lb2cd when selecting play game svn-id: r50108 --- engines/sci/graphics/palette.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 228e5dfced..bcf84095dc 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -395,8 +395,10 @@ void GfxPalette::kernelUnsetFlag(uint16 fromColor, uint16 toColor, uint16 flag) void GfxPalette::kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 intensity, bool setPalette) { memset(&_sysPalette.intensity[0] + fromColor, intensity, toColor - fromColor); - if (setPalette) + if (setPalette) { setOnScreen(); + g_sci->getEngineState()->_throttleTrigger = true; + } } int16 GfxPalette::kernelFindColor(uint16 r, uint16 g, uint16 b) { -- cgit v1.2.3 From 8fce6600904e2094de6488e01540fca1433b1530 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 10:40:48 +0000 Subject: SCI: also set throttle trigger on kPalette(animate) svn-id: r50109 --- engines/sci/graphics/palette.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index bcf84095dc..d256227ea8 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -429,6 +429,8 @@ bool GfxPalette::kernelAnimate(byte fromColor, byte toColor, int speed) { scheduleCount++; } + g_sci->getEngineState()->_throttleTrigger = true; + for (scheduleNr = 0; scheduleNr < scheduleCount; scheduleNr++) { if (_schedules[scheduleNr].from == fromColor) { if (_schedules[scheduleNr].schedule <= now) { -- cgit v1.2.3 From cfcf53bec0f566d8fc20c5ba75ccdc00ba62ee86 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 10:51:14 +0000 Subject: SCI: fix regression of r50073, allNotesOff() now directly sends to driver again. If we send to queue, queue will never actually get processed and even if it was, the channels wouldnt be mapped anymore anyway svn-id: r50110 --- engines/sci/sound/midiparser_sci.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 640000235e..734b2fdda9 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -389,19 +389,23 @@ void MidiParser_SCI::allNotesOff() { int i, j; + // Note: we send to driver here directly, because in this case we would free previously mapped channels + // and onTimer() wouldn't send them to driver anymore afterwards anyway + // Turn off all active notes for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { - if ((_active_notes[i] & (1 << j))){ - sendToDriverQueue(0x80 | j, i, 0); + if ((_active_notes[i] & (1 << j)) && (_channelRemap[j] != -1)){ + sendToDriver(0x80 | j, i, 0); } } } // Turn off all hanging notes for (i = 0; i < ARRAYSIZE(_hanging_notes); i++) { - if (_hanging_notes[i].time_left) { - sendToDriverQueue(0x80 | _hanging_notes[i].channel, _hanging_notes[i].note, 0); + byte midiChannel = _hanging_notes[i].channel; + if ((_hanging_notes[i].time_left) && (_channelRemap[midiChannel] != -1)) { + sendToDriver(0x80 | midiChannel, _hanging_notes[i].note, 0); _hanging_notes[i].time_left = 0; } } @@ -410,8 +414,10 @@ void MidiParser_SCI::allNotesOff() { // To be sure, send an "All Note Off" event (but not all MIDI devices // support this...). - for (i = 0; i < 16; ++i) - sendToDriverQueue(0xB0 | i, 0x7b, 0); // All notes off + for (i = 0; i < 16; ++i) { + if (_channelRemap[i] != -1) + sendToDriver(0xB0 | i, 0x7b, 0); // All notes off + } memset(_active_notes, 0, sizeof(_active_notes)); } -- cgit v1.2.3 From 3c857be0c5cf397d364f9a6e23a095cfef0cda04 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Mon, 21 Jun 2010 11:51:19 +0000 Subject: PSP: switched loader to use PSP's debug mechanism svn-id: r50111 --- backends/platform/psp/psploader.cpp | 141 ++++++++++++++++++---------------- backends/plugins/psp/psp-provider.cpp | 8 +- 2 files changed, 81 insertions(+), 68 deletions(-) diff --git a/backends/platform/psp/psploader.cpp b/backends/platform/psp/psploader.cpp index 68e51c1a50..464e20770c 100644 --- a/backends/platform/psp/psploader.cpp +++ b/backends/platform/psp/psploader.cpp @@ -37,24 +37,20 @@ #include "backends/platform/psp/psploader.h" #include "backends/platform/psp/powerman.h" -//#define __PSP_DEBUG_PLUGINS__ +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ -#ifdef __PSP_DEBUG_PLUGINS__ -#define DBG(x,...) fprintf(stderr,x, ## __VA_ARGS__) -#else -#define DBG(x,...) -#endif - -#define seterror(x,...) fprintf(stderr,x, ## __VA_ARGS__) +#include "backends/platform/psp/trace.h" extern char __plugin_hole_start; // Indicates start of hole in program file for shorts extern char __plugin_hole_end; // Indicates end of hole in program file -extern char _gp[]; // Value of gp register +extern char _gp[]; // Value of gp register DECLARE_SINGLETON(ShortSegmentManager) // For singleton // Get rid of symbol table in memory void DLObject::discard_symtab() { + DEBUG_ENTER_FUNC(); free(_symtab); free(_strtab); _symtab = NULL; @@ -64,6 +60,7 @@ void DLObject::discard_symtab() { // Unload all objects from memory void DLObject::unload() { + DEBUG_ENTER_FUNC(); discard_symtab(); free(_segment); _segment = NULL; @@ -84,18 +81,19 @@ void DLObject::unload() { * */ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void *relSegment) { + DEBUG_ENTER_FUNC(); Elf32_Rel *rel = NULL; // relocation entry // Allocate memory for relocation table if (!(rel = (Elf32_Rel *)malloc(size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return false; } // Read in our relocation table if (lseek(fd, offset, SEEK_SET) < 0 || read(fd, rel, size) != (ssize_t)size) { - seterror("Relocation table load failed."); + PSP_ERROR("Relocation table load failed."); free(rel); return false; } @@ -103,7 +101,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * // Treat each relocation entry. Loop over all of them int cnt = size / sizeof(*rel); - DBG("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment); + PSP_DEBUG_PRINT("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment); bool seenHi16 = false; // For treating HI/LO16 commands int firstHi16 = -1; // Mark the point of the first hi16 seen @@ -127,7 +125,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * // Get the target instruction in the code unsigned int *target = (unsigned int *)((char *)relSegment + rel[i].r_offset); - unsigned int origTarget = *target; // Save for debugging + PSP_DEBUG_DO(unsigned int origTarget = *target); // Save for debugging // Act differently based on the type of relocation switch (REL_TYPE(rel[i].r_info)) { @@ -142,7 +140,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * lastHiSymVal = sym->st_value; hi16InShorts = (ShortsMan.inGeneralSegment((char *)sym->st_value)); // Fix for problem with switching btw segments if (debugRelocs[0]++ < DEBUG_NUM) // Print only a set number - DBG("R_MIPS_HI16: i=%d, offset=%x, ahl = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_HI16: i=%d, offset=%x, ahl = %x, target = %x\n", i, rel[i].r_offset, ahl, *target); } break; @@ -150,7 +148,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * case R_MIPS_LO16: // Absolute addressing. Needs a HI16 to come before it if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section. (ie. has a real section index) if (!seenHi16) { // We MUST have seen HI16 first - seterror("R_MIPS_LO16 w/o preceding R_MIPS_HI16 at relocation %d!\n", i); + PSP_ERROR("R_MIPS_LO16 w/o preceding R_MIPS_HI16 at relocation %d!\n", i); free(rel); return false; } @@ -195,10 +193,10 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= relocation & 0xffff; // Take the lower 16 bits of the relocation if (debugRelocs[1]++ < DEBUG_NUM) - DBG("R_MIPS_LO16: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_LO16: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", i, rel[i].r_offset, a, ahl, *lastTarget, origTarget, *target); if (lo16InShorts && debugRelocs[2]++ < DEBUG_NUM) - DBG("R_MIPS_LO16s: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_LO16s: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", i, rel[i].r_offset, a, ahl, *lastTarget, origTarget, *target); } break; @@ -212,11 +210,11 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= (relocation & 0x03ffffff); if (debugRelocs[3]++ < DEBUG_NUM) - DBG("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", + PSP_DEBUG_PRINT("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", i, rel[i].r_offset, REL_INDEX(rel[i].r_info), sym->st_info, a, origTarget, *target); } else { if (debugRelocs[4]++ < DEBUG_NUM) - DBG("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", + PSP_DEBUG_PRINT("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", i, rel[i].r_offset, REL_INDEX(rel[i].r_info), sym->st_info, a, origTarget, *target); } break; @@ -233,7 +231,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= relocation & 0xffff; if (debugRelocs[5]++ < DEBUG_NUM) - DBG("R_MIPS_GPREL16: i=%d, a=%x, gpVal=%x, origTarget=%x, target=%x, offset=%x\n", + PSP_DEBUG_PRINT("R_MIPS_GPREL16: i=%d, a=%x, gpVal=%x, origTarget=%x, target=%x, offset=%x\n", i, a, _gpVal, origTarget, *target, _shortsSegment->getOffset()); } @@ -250,24 +248,25 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target = relocation; if (debugRelocs[6]++ < DEBUG_NUM) - DBG("R_MIPS_32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target); + PSP_DEBUG_PRINT("R_MIPS_32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target); } break; default: - seterror("Unknown relocation type %x at relocation %d.\n", REL_TYPE(rel[i].r_info), i); + PSP_ERROR("Unknown relocation type %x at relocation %d.\n", REL_TYPE(rel[i].r_info), i); free(rel); return false; } } - DBG("Done with relocation. extendedHi16=%d\n\n", extendedHi16); + PSP_DEBUG_PRINT("Done with relocation. extendedHi16=%d\n\n", extendedHi16); free(rel); return true; } bool DLObject::readElfHeader(int fd, Elf32_Ehdr *ehdr) { + DEBUG_ENTER_FUNC(); // Start reading the elf header. Check for errors if (read(fd, ehdr, sizeof(*ehdr)) != sizeof(*ehdr) || memcmp(ehdr->e_ident, ELFMAG, SELFMAG) || // Check MAGIC @@ -275,31 +274,32 @@ bool DLObject::readElfHeader(int fd, Elf32_Ehdr *ehdr) { ehdr->e_machine != EM_MIPS || // Check for MIPS machine type ehdr->e_phentsize < sizeof(Elf32_Phdr) || // Check for size of program header ehdr->e_shentsize != sizeof(Elf32_Shdr)) { // Check for size of section header - seterror("Invalid file type."); + PSP_ERROR("Invalid file type."); return false; } - DBG("phoff = %d, phentsz = %d, phnum = %d\n", + PSP_DEBUG_PRINT("phoff = %d, phentsz = %d, phnum = %d\n", ehdr->e_phoff, ehdr->e_phentsize, ehdr->e_phnum); return true; } bool DLObject::readProgramHeaders(int fd, Elf32_Ehdr *ehdr, Elf32_Phdr *phdr, int num) { + DEBUG_ENTER_FUNC(); // Read program header if (lseek(fd, ehdr->e_phoff + sizeof(*phdr)*num, SEEK_SET) < 0 || read(fd, phdr, sizeof(*phdr)) != sizeof(*phdr)) { - seterror("Program header load failed."); + PSP_ERROR("Program header load failed."); return false; } // Check program header values if (phdr->p_type != PT_LOAD || phdr->p_filesz > phdr->p_memsz) { - seterror("Invalid program header."); + PSP_ERROR("Invalid program header."); return false; } - DBG("offs = %x, filesz = %x, memsz = %x, align = %x\n", + PSP_DEBUG_PRINT("offs = %x, filesz = %x, memsz = %x, align = %x\n", phdr->p_offset, phdr->p_filesz, phdr->p_memsz, phdr->p_align); return true; @@ -307,6 +307,7 @@ bool DLObject::readProgramHeaders(int fd, Elf32_Ehdr *ehdr, Elf32_Phdr *phdr, in } bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { + DEBUG_ENTER_FUNC(); char *baseAddress = 0; @@ -315,15 +316,15 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { // Attempt to allocate memory for segment int extra = phdr->p_vaddr % phdr->p_align; // Get extra length TODO: check logic here - DBG("extra mem is %x\n", extra); + PSP_DEBUG_PRINT("extra mem is %x\n", extra); if (phdr->p_align < 0x10000) phdr->p_align = 0x10000; // Fix for wrong alignment on e.g. AGI if (!(_segment = (char *)memalign(phdr->p_align, phdr->p_memsz + extra))) { - seterror("Out of memory.\n"); + PSP_ERROR("Out of memory.\n"); return false; } - DBG("allocated segment @ %p\n", _segment); + PSP_DEBUG_PRINT("allocated segment @ %p\n", _segment); // Get offset to load segment into baseAddress = (char *)_segment + phdr->p_vaddr; @@ -332,20 +333,20 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { _shortsSegment = ShortsMan.newSegment(phdr->p_memsz, (char *)phdr->p_vaddr); baseAddress = _shortsSegment->getStart(); - DBG("shorts segment @ %p to %p. Segment wants to be at %x. Offset=%x\n", + PSP_DEBUG_PRINT("shorts segment @ %p to %p. Segment wants to be at %x. Offset=%x\n", _shortsSegment->getStart(), _shortsSegment->getEnd(), phdr->p_vaddr, _shortsSegment->getOffset()); } // Set bss segment to 0 if necessary (assumes bss is at the end) if (phdr->p_memsz > phdr->p_filesz) { - DBG("Setting %p to %p to 0 for bss\n", baseAddress + phdr->p_filesz, baseAddress + phdr->p_memsz); + PSP_DEBUG_PRINT("Setting %p to %p to 0 for bss\n", baseAddress + phdr->p_filesz, baseAddress + phdr->p_memsz); memset(baseAddress + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); } // Read the segment into memory if (lseek(fd, phdr->p_offset, SEEK_SET) < 0 || read(fd, baseAddress, phdr->p_filesz) != (ssize_t)phdr->p_filesz) { - seterror("Segment load failed."); + PSP_ERROR("Segment load failed."); return false; } @@ -354,12 +355,13 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { + DEBUG_ENTER_FUNC(); Elf32_Shdr *shdr = NULL; // Allocate memory for section headers if (!(shdr = (Elf32_Shdr *)malloc(ehdr->e_shnum * sizeof(*shdr)))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return NULL; } @@ -367,7 +369,7 @@ Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { if (lseek(fd, ehdr->e_shoff, SEEK_SET) < 0 || read(fd, shdr, ehdr->e_shnum * sizeof(*shdr)) != (ssize_t)(ehdr->e_shnum * sizeof(*shdr))) { - seterror("Section headers load failed."); + PSP_ERROR("Section headers load failed."); return NULL; } @@ -375,11 +377,12 @@ Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { } int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); // Loop over sections, looking for symbol table linked to a string table for (int i = 0; i < ehdr->e_shnum; i++) { - //DBG("Section %d: type = %x, size = %x, entsize = %x, link = %x\n", - // i, shdr[i].sh_type, shdr[i].sh_size, shdr[i].sh_entsize, shdr[i].sh_link); + PSP_DEBUG_PRINT("Section %d: type = %x, size = %x, entsize = %x, link = %x\n", + i, shdr[i].sh_type, shdr[i].sh_size, shdr[i].sh_entsize, shdr[i].sh_link); if (shdr[i].sh_type == SHT_SYMTAB && shdr[i].sh_entsize == sizeof(Elf32_Sym) && @@ -392,15 +395,15 @@ int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { // Check for no symbol table if (_symtab_sect < 0) { - seterror("No symbol table."); + PSP_ERROR("No symbol table."); return -1; } - DBG("Symbol section at section %d, size %x\n", _symtab_sect, shdr[_symtab_sect].sh_size); + PSP_DEBUG_PRINT("Symbol section at section %d, size %x\n", _symtab_sect, shdr[_symtab_sect].sh_size); // Allocate memory for symbol table if (!(_symtab = malloc(shdr[_symtab_sect].sh_size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return -1; } @@ -408,25 +411,26 @@ int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { if (lseek(fd, shdr[_symtab_sect].sh_offset, SEEK_SET) < 0 || read(fd, _symtab, shdr[_symtab_sect].sh_size) != (ssize_t)shdr[_symtab_sect].sh_size) { - seterror("Symbol table load failed."); + PSP_ERROR("Symbol table load failed."); return -1; } // Set number of symbols _symbol_cnt = shdr[_symtab_sect].sh_size / sizeof(Elf32_Sym); - DBG("Loaded %d symbols.\n", _symbol_cnt); + PSP_DEBUG_PRINT("Loaded %d symbols.\n", _symbol_cnt); return _symtab_sect; } bool DLObject::loadStringTable(int fd, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); int string_sect = shdr[_symtab_sect].sh_link; // Allocate memory for string table if (!(_strtab = (char *)malloc(shdr[string_sect].sh_size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return false; } @@ -434,16 +438,17 @@ bool DLObject::loadStringTable(int fd, Elf32_Shdr *shdr) { if (lseek(fd, shdr[string_sect].sh_offset, SEEK_SET) < 0 || read(fd, _strtab, shdr[string_sect].sh_size) != (ssize_t)shdr[string_sect].sh_size) { - seterror("Symbol table strings load failed."); + PSP_ERROR("Symbol table strings load failed."); return false; } return true; } void DLObject::relocateSymbols(Elf32_Addr offset, Elf32_Addr shortsOffset) { + DEBUG_ENTER_FUNC(); int shortsCount = 0, othersCount = 0; - DBG("Relocating symbols by %x. Shorts offset=%x\n", offset, shortsOffset); + PSP_DEBUG_PRINT("Relocating symbols by %x. Shorts offset=%x\n", offset, shortsOffset); // Loop over symbols, add relocation offset Elf32_Sym *s = (Elf32_Sym *)_symtab; @@ -454,22 +459,23 @@ void DLObject::relocateSymbols(Elf32_Addr offset, Elf32_Addr shortsOffset) { othersCount++; s->st_value += offset; if (s->st_value < (Elf32_Addr)_segment || s->st_value > (Elf32_Addr)_segment + _segmentSize) - seterror("Symbol out of bounds! st_value = %x\n", s->st_value); + PSP_ERROR("Symbol out of bounds! st_value = %x\n", s->st_value); } else { // shorts section shortsCount++; s->st_value += shortsOffset; if (!_shortsSegment->inSegment((char *)s->st_value)) - seterror("Symbol out of bounds! st_value = %x\n", s->st_value); + PSP_ERROR("Symbol out of bounds! st_value = %x\n", s->st_value); } } } - DBG("Relocated %d short symbols, %d others.\n", shortsCount, othersCount); + PSP_DEBUG_PRINT("Relocated %d short symbols, %d others.\n", shortsCount, othersCount); } bool DLObject::relocateRels(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); // Loop over sections, finding relocation sections for (int i = 0; i < ehdr->e_shnum; i++) { @@ -500,7 +506,7 @@ bool DLObject::relocateRels(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { bool DLObject::load(int fd) { - fprintf(stderr, "In DLObject::load\n"); + DEBUG_ENTER_FUNC(); Elf32_Ehdr ehdr; // ELF header Elf32_Phdr phdr; // Program header @@ -512,8 +518,7 @@ bool DLObject::load(int fd) { } for (int i = 0; i < ehdr.e_phnum; i++) { // Load our 2 segments - - fprintf(stderr, "Loading segment %d\n", i); + PSP_DEBUG_PRINT("Loading segment %d\n", i); if (readProgramHeaders(fd, &ehdr, &phdr, i) == false) return false; @@ -543,19 +548,20 @@ bool DLObject::load(int fd) { } bool DLObject::open(const char *path) { + DEBUG_ENTER_FUNC(); int fd; void *ctors_start, *ctors_end; - DBG("open(\"%s\")\n", path); + PSP_DEBUG_PRINT("open(\"%s\")\n", path); // Get the address of the global pointer _gpVal = (unsigned int) & _gp; - DBG("_gpVal is %x\n", _gpVal); + PSP_DEBUG_PRINT("_gpVal is %x\n", _gpVal); PowerMan.beginCriticalSection(); if ((fd = ::open(path, O_RDONLY)) < 0) { - seterror("%s not found.", path); + PSP_ERROR("%s not found.", path); return false; } @@ -581,21 +587,22 @@ bool DLObject::open(const char *path) { if (ctors_start == NULL || ctors_end == NULL || _dtors_start == NULL || _dtors_end == NULL) { - seterror("Missing ctors/dtors."); + PSP_ERROR("Missing ctors/dtors."); _dtors_start = _dtors_end = NULL; unload(); return false; } - DBG("Calling constructors.\n"); + PSP_DEBUG_PRINT("Calling constructors.\n"); for (void (**f)(void) = (void (**)(void))ctors_start; f != ctors_end; f++) (**f)(); - DBG("%s opened ok.\n", path); + PSP_DEBUG_PRINT("%s opened ok.\n", path); return true; } bool DLObject::close() { + DEBUG_ENTER_FUNC(); if (_dtors_start != NULL && _dtors_end != NULL) for (void (**f)(void) = (void (**)(void))_dtors_start; f != _dtors_end; f++) (**f)(); @@ -605,10 +612,11 @@ bool DLObject::close() { } void *DLObject::symbol(const char *name) { - DBG("symbol(\"%s\")\n", name); + DEBUG_ENTER_FUNC(); + PSP_DEBUG_PRINT("symbol(\"%s\")\n", name); if (_symtab == NULL || _strtab == NULL || _symbol_cnt < 1) { - seterror("No symbol table loaded."); + PSP_ERROR("No symbol table loaded."); return NULL; } @@ -621,23 +629,25 @@ void *DLObject::symbol(const char *name) { !strcmp(name, _strtab + s->st_name)) { // We found the symbol - DBG("=> %p\n", (void*)s->st_value); + PSP_DEBUG_PRINT("=> %p\n", (void*)s->st_value); return (void*)s->st_value; } } - seterror("Symbol \"%s\" not found.", name); + PSP_ERROR("Symbol \"%s\" not found.", name); return NULL; } ShortSegmentManager::ShortSegmentManager() { + DEBUG_ENTER_FUNC(); _shortsStart = &__plugin_hole_start ; _shortsEnd = &__plugin_hole_end; } ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *origAddr) { + DEBUG_ENTER_FUNC(); char *lastAddress = origAddr; Common::List::iterator i; @@ -654,7 +664,7 @@ ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *or lastAddress += 4 - ((Elf32_Addr)lastAddress & 3); // Round up to multiple of 4 if (lastAddress + size > _shortsEnd) { - seterror("Error. No space in shorts segment for %x bytes. Last address is %p, max address is %p.\n", + PSP_ERROR("No space in shorts segment for %x bytes. Last address is %p, max address is %p.\n", size, lastAddress, _shortsEnd); return NULL; } @@ -665,14 +675,15 @@ ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *or _list.insert(i, seg); - DBG("Shorts segment size %x allocated. End = %p. Remaining space = %x. Highest so far is %p.\n", + PSP_DEBUG_PRINT("Shorts segment size %x allocated. End = %p. Remaining space = %x. Highest so far is %p.\n", size, lastAddress + size, _shortsEnd - _list.back()->getEnd(), _highestAddress); return seg; } void ShortSegmentManager::deleteSegment(ShortSegmentManager::Segment *seg) { - DBG("Deleting shorts segment from %p to %p.\n\n", seg->getStart(), seg->getEnd()); + DEBUG_ENTER_FUNC(); + PSP_DEBUG_PRINT("Deleting shorts segment from %p to %p.\n\n", seg->getStart(), seg->getEnd()); _list.remove(seg); delete seg; } diff --git a/backends/plugins/psp/psp-provider.cpp b/backends/plugins/psp/psp-provider.cpp index f394916538..5760424cbf 100644 --- a/backends/plugins/psp/psp-provider.cpp +++ b/backends/plugins/psp/psp-provider.cpp @@ -31,6 +31,8 @@ #include "backends/platform/psp/psploader.h" +#include "backends/platform/psp/trace.h" + class PSPPlugin : public DynamicPlugin { protected: @@ -95,13 +97,13 @@ Plugin* PSPPluginProvider::createPlugin(const Common::FSNode &node) const { bool PSPPluginProvider::isPluginFilename(const Common::FSNode &node) const { // Check the plugin suffix Common::String filename = node.getName(); - fprintf(stderr, "Testing name %s", filename.c_str()); + PSP_DEBUG_PRINT("Testing name %s", filename.c_str()); if (!filename.hasSuffix(".PLG") && !filename.hasSuffix(".plg")) { - fprintf(stderr," fail.\n"); + PSP_DEBUG_PRINT(" fail.\n"); return false; } - fprintf(stderr," success!\n"); + PSP_DEBUG_PRINT(" success!\n"); return true; } -- cgit v1.2.3 From 57b8e2caaabebde88eb46d0d85d3c09414cdc778 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Mon, 21 Jun 2010 13:23:13 +0000 Subject: PSP: removed default 'using ME' message svn-id: r50112 --- backends/platform/psp/mp3.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp index 972c5a8ba8..eab8670280 100644 --- a/backends/platform/psp/mp3.cpp +++ b/backends/platform/psp/mp3.cpp @@ -85,13 +85,13 @@ bool Mp3PspStream::initDecoder() { } } else { if (sceUtilityLoadAvModule(PSP_AV_MODULE_AVCODEC) < 0) { - PSP_ERROR("failed to load AVCODEC module.\n"); + PSP_ERROR("failed to load AVCODEC module. ME cannot start.\n"); _decoderFail = true; return false; } } - PSP_INFO_PRINT("Using PSP's ME for MP3\n"); // important to know this is happening + PSP_DEBUG_PRINT("Using PSP's ME for MP3\n"); // important to know this is happening _decoderInit = true; return true; -- cgit v1.2.3 From b5a25a6e1988c11929fe68cc9e5786bf738b21ce Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Mon, 21 Jun 2010 13:58:51 +0000 Subject: PSP: errors from both ScummVM and the PSP port now print to file by default. This should make debugging easier, especially for users. svn-id: r50113 --- backends/platform/psp/mp3.cpp | 2 +- backends/platform/psp/trace.cpp | 11 ++++++++--- backends/platform/psp/trace.h | 6 +++--- common/textconsole.cpp | 9 +++++++++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp index eab8670280..e25891396b 100644 --- a/backends/platform/psp/mp3.cpp +++ b/backends/platform/psp/mp3.cpp @@ -319,7 +319,7 @@ void Mp3PspStream::decodeMP3Data() { // This function blocks. We'll want to put it in a thread int ret = sceAudiocodecDecode(_codecParams, 0x1002); if (ret < 0) { - PSP_ERROR("failed to decode MP3 data in ME. sceAudiocodecDecode returned 0x%x\n", ret); + PSP_INFO_PRINT("failed to decode MP3 data in ME. sceAudiocodecDecode returned 0x%x\n", ret); // handle error here } diff --git a/backends/platform/psp/trace.cpp b/backends/platform/psp/trace.cpp index 4bf5450177..7bac6534da 100644 --- a/backends/platform/psp/trace.cpp +++ b/backends/platform/psp/trace.cpp @@ -30,8 +30,9 @@ #include int psp_debug_indent = 0; +bool firstWriteToFile = true; -void PSPDebugTrace(bool alsoToScreen, const char *format, ...) { +void PspDebugTrace(bool alsoToScreen, const char *format, ...) { va_list opt; char buffer[2048]; int bufsz; @@ -41,8 +42,12 @@ void PSPDebugTrace(bool alsoToScreen, const char *format, ...) { bufsz = vsnprintf(buffer, (size_t) sizeof(buffer), format, opt); va_end(opt); - //fd = fopen("MS0:/SCUMMTRACE.TXT", "ab"); - fd = fopen("SCUMMTRACE.TXT", "ab"); + if (firstWriteToFile) { + fd = fopen("SCUMMTRACE.TXT", "wb"); // erase the file the first time we write + firstWriteToFile = false; + } else { + fd = fopen("SCUMMTRACE.TXT", "ab"); + } if (fd == 0) return; diff --git a/backends/platform/psp/trace.h b/backends/platform/psp/trace.h index 1aad0f6781..ade8fd7214 100644 --- a/backends/platform/psp/trace.h +++ b/backends/platform/psp/trace.h @@ -39,8 +39,8 @@ #define __PSP_PRINT__(format,...) fprintf(stderr, format, ## __VA_ARGS__) #endif /* PSP_PRINT_TO_FILE/SCREEN */ -/* Error function */ -#define PSP_ERROR(format,...) __PSP_PRINT__("Error in %s: " format, __PRETTY_FUNCTION__, ## __VA_ARGS__) +/* Error function - always print to file as well */ +#define PSP_ERROR(format,...) PspDebugTrace(true, "Error in %s: " format, __PRETTY_FUNCTION__, ## __VA_ARGS__) /* Do the indent */ #define __PSP_INDENT__ for(int _i=psp_debug_indent; _i>0; _i--) \ @@ -52,7 +52,7 @@ #define PSP_INFO_PRINT_INDENT(format,...) { __PSP_INDENT__; \ __PSP_PRINT__(format, ## __VA_ARGS__); } -void PSPDebugTrace(bool alsoToScreen, const char *format, ...); +void PspDebugTrace(bool alsoToScreen, const char *format, ...); extern int psp_debug_indent; diff --git a/common/textconsole.cpp b/common/textconsole.cpp index 87ba55ebf1..2e5a347489 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -47,6 +47,10 @@ extern bool isSmartphone(); #include #endif +#ifdef __PSP__ + #include "backends/platform/psp/trace.h" +#endif + namespace Common { static OutputFormatter s_errorOutputFormatter = 0; @@ -159,6 +163,11 @@ void NORETURN_PRE error(const char *s, ...) { #ifdef __SYMBIAN32__ Symbian::FatalError(buf_output); #endif + +#ifdef __PSP__ + PspDebugTrace(false, "%s", buf_output); // write to file +#endif + // Finally exit. quit() will terminate the program if g_system is present if (g_system) g_system->quit(); -- cgit v1.2.3 From faef4ab349df5cd206fe2e5dfc666f76be3b60ec Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 21 Jun 2010 14:44:18 +0000 Subject: Check against the signature of Groovie v2 cursors with MKID_BE, makes it easier to see what it's doing. svn-id: r50114 --- engines/groovie/cursor.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/engines/groovie/cursor.cpp b/engines/groovie/cursor.cpp index 3f304c7859..2d0a2df245 100644 --- a/engines/groovie/cursor.cpp +++ b/engines/groovie/cursor.cpp @@ -403,18 +403,15 @@ GrvCursorMan_v2::GrvCursorMan_v2(OSystem *system) : // Open the icons file Common::File iconsFile; - if (!iconsFile.open("icons.ph")) { + if (!iconsFile.open("icons.ph")) error("Groovie::Cursor: Couldn't open icons.ph"); - return; - } // Verify the signature - uint32 tmp32 = iconsFile.readUint32LE(); + uint32 tmp32 = iconsFile.readUint32BE(); uint16 tmp16 = iconsFile.readUint16LE(); - if (tmp32 != 0x6e6f6369 || tmp16 != 1) { - error("Groovie::Cursor: icons.ph signature failed: %04X %d", tmp32, tmp16); - return; - } + if (tmp32 != MKID_BE('icon') || tmp16 != 1) + error("Groovie::Cursor: icons.ph signature failed: %s %d", tag2str(tmp32), tmp16); + // Read the number of icons uint16 nicons = iconsFile.readUint16LE(); -- cgit v1.2.3 From 4a4fcb19dd85cd8f3ffc63ef44f033d21b50744e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 15:05:48 +0000 Subject: SCI: added fixme about r50110/r50073 svn-id: r50115 --- engines/sci/sound/midiparser_sci.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 734b2fdda9..9a6be1e1df 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -392,6 +392,9 @@ void MidiParser_SCI::allNotesOff() { // Note: we send to driver here directly, because in this case we would free previously mapped channels // and onTimer() wouldn't send them to driver anymore afterwards anyway + // FIXME: the common midiparser/driver code doesn't really like getting called from various threads + // but we don't have an option here... i guess midiparser/driver code should be made thread-safe + // Turn off all active notes for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { -- cgit v1.2.3 From 65fe8d817c627fe56929533a4a0fb4d2c5cb76c2 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Mon, 21 Jun 2010 15:13:36 +0000 Subject: PSP: moved RTC to singleton to allow usage by classes other than Osystem svn-id: r50116 --- backends/platform/psp/Makefile | 1 + backends/platform/psp/module.mk | 1 + backends/platform/psp/osys_psp.cpp | 6 ++- backends/platform/psp/osys_psp.h | 1 - backends/platform/psp/rtc.cpp | 87 ++++++++++++++++++++++++++++++++++++++ backends/platform/psp/rtc.h | 45 ++++++++++++++++++++ backends/platform/psp/thread.cpp | 57 ------------------------- backends/platform/psp/thread.h | 17 +------- 8 files changed, 140 insertions(+), 75 deletions(-) create mode 100644 backends/platform/psp/rtc.cpp create mode 100644 backends/platform/psp/rtc.h diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile index 02fd8b022a..fed558eaad 100644 --- a/backends/platform/psp/Makefile +++ b/backends/platform/psp/Makefile @@ -147,6 +147,7 @@ OBJS := powerman.o \ pspkeyboard.o \ audio.o \ thread.o \ + rtc.o \ mp3.o # Include common Scummvm makefile diff --git a/backends/platform/psp/module.mk b/backends/platform/psp/module.mk index 99170ce7fb..e9c896acfd 100644 --- a/backends/platform/psp/module.mk +++ b/backends/platform/psp/module.mk @@ -15,6 +15,7 @@ MODULE_OBJS := powerman.o \ pspkeyboard.o \ audio.o \ thread.o \ + rtc.o \ mp3.o MODULE_DIRS += \ diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 01053b8cbb..b09d9c0c00 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -37,6 +37,7 @@ #include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/osys_psp.h" #include "backends/platform/psp/powerman.h" +#include "backends/platform/psp/rtc.h" #include "backends/saves/psp/psp-saves.h" #include "backends/timer/default/default-timer.h" @@ -64,6 +65,9 @@ OSystem_PSP::~OSystem_PSP() {} void OSystem_PSP::initBackend() { DEBUG_ENTER_FUNC(); + // Instantiate real time clock + PspRtc::instance(); + _cursor.enableCursorPalette(false); _cursor.setXY(PSP_SCREEN_WIDTH >> 1, PSP_SCREEN_HEIGHT >> 1); // Mouse in the middle of the screen @@ -320,7 +324,7 @@ bool OSystem_PSP::pollEvent(Common::Event &event) { } uint32 OSystem_PSP::getMillis() { - return _pspRtc.getMillis(); + return PspRtc::instance().getMillis(); } void OSystem_PSP::delayMillis(uint msecs) { diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index 46f258f577..5721296c94 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -60,7 +60,6 @@ private: InputHandler _inputHandler; PspAudio _audio; PspTimer _pspTimer; - PspRtc _pspRtc; public: OSystem_PSP() : _savefile(0), _mixer(0), _timer(0), _pendingUpdate(false), _pendingUpdateCounter(0) {} diff --git a/backends/platform/psp/rtc.cpp b/backends/platform/psp/rtc.cpp new file mode 100644 index 0000000000..57edea7e49 --- /dev/null +++ b/backends/platform/psp/rtc.cpp @@ -0,0 +1,87 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 49903 2010-06-16 09:04:27Z Bluddy $ + * + */ + +#include +#include +#include + +#include "common/scummsys.h" +#include "backends/platform/psp/rtc.h" + +//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ +//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ + +#include "backends/platform/psp/trace.h" + + +// Class PspRtc --------------------------------------------------------------- +DECLARE_SINGLETON(PspRtc) + +void PspRtc::init() { // init our starting ticks + uint32 ticks[2]; + sceRtcGetCurrentTick((u64 *)ticks); + + _startMillis = ticks[0]/1000; + _startMicros = ticks[0]; + //_lastMillis = ticks[0]/1000; //debug - only when we don't subtract startMillis +} + +#define MS_LOOP_AROUND 4294967 /* We loop every 2^32 / 1000 = 71 minutes */ +#define MS_LOOP_CHECK 60000 /* Threading can cause weird mixups without this */ + +// Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause +// unpredictable results +uint32 PspRtc::getMillis() { + uint32 ticks[2]; + + sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays + + uint32 millis = ticks[0]/1000; + millis -= _startMillis; // get ms since start of program + + if ((int)_lastMillis - (int)millis > MS_LOOP_CHECK) { // we must have looped around + if (_looped == false) { // check to make sure threads do this once + _looped = true; + _milliOffset += MS_LOOP_AROUND; // add the needed offset + PSP_DEBUG_PRINT("looping around. last ms[%d], curr ms[%d]\n", _lastMillis, millis); + } + } else { + _looped = false; + } + + _lastMillis = millis; + + return millis + _milliOffset; +} + +uint32 PspRtc::getMicros() { + uint32 ticks[2]; + + sceRtcGetCurrentTick((u64 *)ticks); + ticks[0] -= _startMicros; + + return ticks[0]; +} + diff --git a/backends/platform/psp/rtc.h b/backends/platform/psp/rtc.h new file mode 100644 index 0000000000..3f2d52ff16 --- /dev/null +++ b/backends/platform/psp/rtc.h @@ -0,0 +1,45 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 49903 2010-06-16 09:04:27Z Bluddy $ + * + */ + +#ifndef _PSP_RTC_H_ +#define _PSP_RTC_H_ + +#include "common/singleton.h" + +class PspRtc : public Common::Singleton{ +private: + uint32 _startMillis; + uint32 _startMicros; + uint32 _lastMillis; + uint32 _milliOffset; // to prevent looping around of millis + bool _looped; // make sure we only loop once - for threading +public: + PspRtc() : _startMillis(0), _startMicros(0), _lastMillis(0), _milliOffset(0), _looped(false) { init(); } + void init(); + uint32 getMillis(); + uint32 getMicros(); +}; + +#endif \ No newline at end of file diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index 43e3b931c3..c19ff5f9e3 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -23,9 +23,6 @@ * */ -#include -#include -#include #include #include "backends/platform/psp/thread.h" @@ -192,57 +189,3 @@ void PspCondition::wait(PspMutex &externalMutex) { externalMutex.lock(); // must lock external mutex here for continuation } -//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ -//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ - -#include "backends/platform/psp/trace.h" - - -// Class PspRtc --------------------------------------------------------------- - -void PspRtc::init() { // init our starting ticks - uint32 ticks[2]; - sceRtcGetCurrentTick((u64 *)ticks); - - _startMillis = ticks[0]/1000; - _startMicros = ticks[0]; - //_lastMillis = ticks[0]/1000; //debug - only when we don't subtract startMillis -} - -#define MS_LOOP_AROUND 4294967 /* We loop every 2^32 / 1000 = 71 minutes */ -#define MS_LOOP_CHECK 60000 /* Threading can cause weird mixups without this */ - -// Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause -// unpredictable results -uint32 PspRtc::getMillis() { - uint32 ticks[2]; - - sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays - - uint32 millis = ticks[0]/1000; - millis -= _startMillis; // get ms since start of program - - if ((int)_lastMillis - (int)millis > MS_LOOP_CHECK) { // we must have looped around - if (_looped == false) { // check to make sure threads do this once - _looped = true; - _milliOffset += MS_LOOP_AROUND; // add the needed offset - PSP_DEBUG_PRINT("looping around. last ms[%d], curr ms[%d]\n", _lastMillis, millis); - } - } else { - _looped = false; - } - - _lastMillis = millis; - - return millis + _milliOffset; -} - -uint32 PspRtc::getMicros() { - uint32 ticks[2]; - - sceRtcGetCurrentTick((u64 *)ticks); - ticks[0] -= _startMicros; - - return ticks[0]; -} - diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index bd7a60b6ed..27d53903d6 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -73,22 +73,7 @@ public: PspCondition() : _mutex(true), _waitingThreads(0), _signaledThreads(0), _waitSem(0), _doneSem(0) {} void wait(PspMutex &externalMutex); - void releaseAll(); -}; - - -class PspRtc { -private: - uint32 _startMillis; - uint32 _startMicros; - uint32 _lastMillis; - uint32 _milliOffset; // to prevent looping around of millis - bool _looped; // make sure we only loop once -public: - PspRtc() : _startMillis(0), _startMicros(0), _lastMillis(0), _milliOffset(0), _looped(false) { init(); } - void init(); - uint32 getMillis(); - uint32 getMicros(); + void releaseAll(); }; enum ThreadPriority { -- cgit v1.2.3 From 9ecbffe11aee736c0a3783358fb2640b0d6f5237 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 21 Jun 2010 15:51:04 +0000 Subject: Add a workaround for a MUMG script bug, MUMG now works again. svn-id: r50117 --- engines/sci/engine/vm.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 706d2ceb22..7f2ed436e8 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -161,6 +161,11 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in error("%s. [VM] Access would be outside even of the stack (%d); access denied", txt.c_str(), total_offset); return false; } else { + // WORKAROUND: Mixed-Up Mother Goose tries to use an invalid parameter in Event::new(). + // Just skip around it here so we don't error out in validate_arithmetic. + if (g_sci->getGameId() == "mothergoose" && getSciVersion() <= SCI_VERSION_1_1 && type == VAR_PARAM && index == 1) + return false; + debugC(2, kDebugLevelVM, "%s", txt.c_str()); debugC(2, kDebugLevelVM, "[VM] Access within stack boundaries; access granted."); return true; -- cgit v1.2.3 From 0ab7a16e452f5244d37dc0426f62b5b05d12f032 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 21 Jun 2010 19:07:41 +0000 Subject: Fix the Hoyle 4 (Hoyle Classic) demo's top offset. It currently errors out later from lacking a selector (static selector problem). svn-id: r50118 --- engines/sci/detection_tables.h | 8 ++++++++ engines/sci/graphics/ports.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 2ac76578fe..bad7ccc5c3 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -752,8 +752,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Hoyle 4 - English DOS Demo + {"hoyle4", "Demo", { + {"resource.map", 0, "60f764020a6b788bbbe415dbc2ccb9f3", 931}, + {"resource.000", 0, "5fe3670e3ddcd4f85c10013b5453141a", 615522}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + // Hoyle 4 - English DOS Demo // SCI interpreter version 1.001.200 (just a guess) + // Does anyone have this version? -clone2727 {"hoyle4", "Demo", { {"resource.map", 0, "662087cb383e52e3cc4ae7ecb10e20aa", 938}, {"resource.000", 0, "24c10844792c54d476d272213cbac300", 675252}, diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index a3135e7177..8ba7c57b62 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -88,7 +88,7 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te // Mother Goose (SCI1) uses -Nw 0 0 159 262. The game will later use SetPort so we don't need to set the other fields. // This actually meant not skipping the first 10 pixellines in windowMgrPort Common::String gameId = g_sci->getGameId(); - if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) + if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; openPort(_wmgrPort); -- cgit v1.2.3 From 38b172e8e5339c867fe66c69d9ef70d26c20ebf3 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 21 Jun 2010 19:32:25 +0000 Subject: Fixed some Cppcheck warnings. (There are plenty left, if anyone's wondering.) svn-id: r50120 --- common/macresman.cpp | 10 +++------- common/translation.cpp | 3 +-- engines/cruise/decompiler.cpp | 2 -- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/common/macresman.cpp b/common/macresman.cpp index 6a6a818083..df7351d55a 100644 --- a/common/macresman.cpp +++ b/common/macresman.cpp @@ -525,12 +525,10 @@ void MacResManager::convertCrsrCursor(byte *data, int datasize, byte **cursor, i int i, b; byte imageByte; byte *iconData; - int numBytes; int pixelsPerByte, bpp; int ctSize; byte bitmask; int iconRowBytes, iconBounds[4]; - int ignored; int iconDataSize; dis.readUint16BE(); // type @@ -616,21 +614,19 @@ void MacResManager::convertCrsrCursor(byte *data, int datasize, byte **cursor, i dis.readUint16BE(); // colorID[c] palette[0][c * 4 + 0] = dis.readByte(); - ignored = dis.readByte(); + dis.readByte(); palette[0][c * 4 + 1] = dis.readByte(); - ignored = dis.readByte(); + dis.readByte(); palette[0][c * 4 + 2] = dis.readByte(); - ignored = dis.readByte(); + dis.readByte(); palette[0][c * 4 + 3] = 0; } *palSize = ctSize; - numBytes = (iconBounds[2] - iconBounds[0]) * (iconBounds[3] - iconBounds[1]); - pixelsPerByte = (iconBounds[2] - iconBounds[0]) / iconRowBytes; bpp = 8 / pixelsPerByte; diff --git a/common/translation.cpp b/common/translation.cpp index 1d8295f5a2..bb86b3b7ac 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -90,8 +90,7 @@ TranslationManager::TranslationManager() { TranslationManager::~TranslationManager() { #ifdef USE_TERMCONV iconv_close(_conversion); - if (_convmsg) - delete[] _convmsg; + delete[] _convmsg; #endif // USE_TERMCONV } diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp index ba4ade56a7..31d9dcef9b 100644 --- a/engines/cruise/decompiler.cpp +++ b/engines/cruise/decompiler.cpp @@ -760,8 +760,6 @@ int decompFunction() { char *var1; char *objIdxStr; char *ovlStr; - char varName[256]; - int i; var1 = popDecomp(); objIdxStr = popDecomp(); -- cgit v1.2.3 From 97dd94019cc668342ea52603891d706f3fbab5e3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 21 Jun 2010 20:17:59 +0000 Subject: When loading or restarting, stop script processing if the game is being loaded or is restarting and the stack position has changed (it's always changed when loading) - fixes the case where the VM is trying to parse an invalid script svn-id: r50121 --- engines/sci/engine/vm.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 7f2ed436e8..cc7f1a1be6 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -773,6 +773,9 @@ void run_vm(EngineState *s, bool restoring) { g_debugState.old_pc_offset = s->xs->addr.pc.offset; g_debugState.old_sp = s->xs->sp; + if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) + return; // Stop processing + if (s->_executionStackPosChanged) { Script *scr; s->xs = &(s->_executionStack.back()); @@ -829,7 +832,7 @@ void run_vm(EngineState *s, bool restoring) { } if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) - return; // Emergency + return; // Stop processing // Debug if this has been requested: // TODO: re-implement sci_debug_flags -- cgit v1.2.3 From 9d5d9e13aea2e5c34ec237e735152427dd40b65c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 21 Jun 2010 21:25:13 +0000 Subject: Fixed the demo of Hoyle 4 by adding two selectors it needs "syncTime" and "syncCue". Usually, games that need them are CD talkie versions which have a selector vocabulary, but Hoyle 4 is an exception svn-id: r50122 --- engines/sci/engine/static_selectors.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 0f558f2dc8..eca18f67fb 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -149,6 +149,19 @@ Common::StringArray Kernel::checkStaticSelectorNames() { names[slot] = selectorRemap->name; } } + + if (g_sci->getGameId() == "hoyle4") { + // The demo of Hoyle 4 is one of the few demos with lip syncing and no selector vocabulary. + // This needs two selectors, "syncTime" and "syncCue", which keep changing positions in each + // game. Usually, games with speech and lip sync have a selector vocabulary, so we don't need + // to set these two selectors, but we need for Hoyle... + if (names.size() < 276) + names.resize(276); + + names[274] = "syncTime"; + names[275] = "syncCue"; + } + #ifdef ENABLE_SCI32 } else { // SCI2+ -- cgit v1.2.3 From df569a6c822f3893c9daeee649fde7a974ee1cd2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:32:56 +0000 Subject: AGI: Change AGI commands/opcodes to member methods svn-id: r50124 --- engines/agi/agi.cpp | 2 + engines/agi/agi.h | 191 ++++++++++++ engines/agi/op_cmd.cpp | 772 +++++++++++++++++++++++++------------------------ 3 files changed, 582 insertions(+), 383 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 0875646148..0f5d3ee2f0 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -569,6 +569,8 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _game.lastController = 0; for (int i = 0; i < MAX_DIRS; i++) _game.controllerOccured[i] = false; + + setupOpcodes(); } void AgiEngine::initialize() { diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 18f291d62c..02d3526f16 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -119,6 +119,7 @@ enum AgiGameID { GID_XMASCARD, GID_FANMADE, GID_GETOUTTASQ, // Fanmade + GID_SQ0, // Fanmade GID_MICKEY, // PreAGI GID_WINNIE, // PreAGI GID_TROLL // PreAGI @@ -1041,6 +1042,196 @@ private: bool _predictiveDialogRunning; public: char _predictiveResult[40]; + +private: + typedef void (AgiEngine::*AgiCommand)(uint8 *); + + AgiCommand _agiCommands[183]; + + void setupOpcodes(); + + void cmd_increment(uint8 *p); + void cmd_decrement(uint8 *p); + void cmd_assignn(uint8 *p); + void cmd_assignv(uint8 *p); + void cmd_addn(uint8 *p); + void cmd_addv(uint8 *p); + void cmd_subn(uint8 *p); + void cmd_subv(uint8 *p); // 0x08 + void cmd_lindirectv(uint8 *p); + void cmd_rindirect(uint8 *p); + void cmd_lindirectn(uint8 *p); + void cmd_set(uint8 *p); + void cmd_reset(uint8 *p); + void cmd_toggle(uint8 *p); + void cmd_set_v(uint8 *p); + void cmd_reset_v(uint8 *p); // 0x10 + void cmd_toggle_v(uint8 *p); + void cmd_new_room(uint8 *p); + void cmd_new_room_f(uint8 *p); + void cmd_load_logic(uint8 *p); + void cmd_load_logic_f(uint8 *p); + void cmd_call(uint8 *p); + void cmd_call_f(uint8 *p); + void cmd_load_pic(uint8 *p); // 0x18 + void cmd_draw_pic(uint8 *p); + void cmd_show_pic(uint8 *p); + void cmd_discard_pic(uint8 *p); + void cmd_overlay_pic(uint8 *p); + void cmd_show_pri_screen(uint8 *p); + void cmd_load_view(uint8 *p); + void cmd_load_view_f(uint8 *p); + void cmd_discard_view(uint8 *p); // 0x20 + void cmd_animate_obj(uint8 *p); + void cmd_unanimate_all(uint8 *p); + void cmd_draw(uint8 *p); + void cmd_erase(uint8 *p); + void cmd_position(uint8 *p); + void cmd_position_f(uint8 *p); + void cmd_get_posn(uint8 *p); + void cmd_reposition(uint8 *p); // 0x28 + void cmd_set_view(uint8 *p); + void cmd_set_view_f(uint8 *p); + void cmd_set_loop(uint8 *p); + void cmd_set_loop_f(uint8 *p); + void cmd_fix_loop(uint8 *p); + void cmd_release_loop(uint8 *p); + void cmd_set_cel(uint8 *p); + void cmd_set_cel_f(uint8 *p); // 0x30 + void cmd_last_cel(uint8 *p); + void cmd_current_cel(uint8 *p); + void cmd_current_loop(uint8 *p); + void cmd_current_view(uint8 *p); + void cmd_number_of_loops(uint8 *p); + void cmd_set_priority(uint8 *p); + void cmd_set_priority_f(uint8 *p); + void cmd_release_priority(uint8 *p); // 0x38 + void cmd_get_priority(uint8 *p); + void cmd_stop_update(uint8 *p); + void cmd_start_update(uint8 *p); + void cmd_force_update(uint8 *p); + void cmd_ignore_horizon(uint8 *p); + void cmd_observe_horizon(uint8 *p); + void cmd_set_horizon(uint8 *p); + void cmd_object_on_water(uint8 *p); // 0x40 + void cmd_object_on_land(uint8 *p); + void cmd_object_on_anything(uint8 *p); + void cmd_ignore_objs(uint8 *p); + void cmd_observe_objs(uint8 *p); + void cmd_distance(uint8 *p); + void cmd_stop_cycling(uint8 *p); + void cmd_start_cycling(uint8 *p); + void cmd_normal_cycle(uint8 *p); // 0x48 + void cmd_end_of_loop(uint8 *p); + void cmd_reverse_cycle(uint8 *p); + void cmd_reverse_loop(uint8 *p); + void cmd_cycle_time(uint8 *p); + void cmd_stop_motion(uint8 *p); + void cmd_start_motion(uint8 *p); + void cmd_step_size(uint8 *p); + void cmd_step_time(uint8 *p); // 0x50 + void cmd_move_obj(uint8 *p); + void cmd_move_obj_f(uint8 *p); + void cmd_follow_ego(uint8 *p); + void cmd_wander(uint8 *p); + void cmd_normal_motion(uint8 *p); + void cmd_set_dir(uint8 *p); + void cmd_get_dir(uint8 *p); + void cmd_ignore_blocks(uint8 *p); // 0x58 + void cmd_observe_blocks(uint8 *p); + void cmd_block(uint8 *p); + void cmd_unblock(uint8 *p); + void cmd_get(uint8 *p); + void cmd_get_f(uint8 *p); + void cmd_drop(uint8 *p); + void cmd_put(uint8 *p); + void cmd_put_f(uint8 *p); // 0x60 + void cmd_get_room_f(uint8 *p); + void cmd_load_sound(uint8 *p); + void cmd_sound(uint8 *p); + void cmd_stop_sound(uint8 *p); + void cmd_print(uint8 *p); + void cmd_print_f(uint8 *p); + void cmd_display(uint8 *p); + void cmd_display_f(uint8 *p); // 0x68 + void cmd_clear_lines(uint8 *p); + void cmd_text_screen(uint8 *p); + void cmd_graphics(uint8 *p); + void cmd_set_cursor_char(uint8 *p); + void cmd_set_text_attribute(uint8 *p); + void cmd_shake_screen(uint8 *p); + void cmd_configure_screen(uint8 *p); + void cmd_status_line_on(uint8 *p); // 0x70 + void cmd_status_line_off(uint8 *p); + void cmd_set_string(uint8 *p); + void cmd_get_string(uint8 *p); + void cmd_word_to_string(uint8 *p); + void cmd_parse(uint8 *p); + void cmd_get_num(uint8 *p); + void cmd_prevent_input(uint8 *p); + void cmd_accept_input(uint8 *p); // 0x78 + void cmd_set_key(uint8 *p); + void cmd_add_to_pic(uint8 *p); + void cmd_add_to_pic_f(uint8 *p); + void cmd_status(uint8 *p); + void cmd_save_game(uint8 *p); + void cmd_load_game(uint8 *p); + void cmd_init_disk(uint8 *p); + void cmd_restart_game(uint8 *p); // 0x80 + void cmd_show_obj(uint8 *p); + void cmd_random(uint8 *p); + void cmd_program_control(uint8 *p); + void cmd_player_control(uint8 *p); + void cmd_obj_status_f(uint8 *p); + void cmd_quit(uint8 *p); + void cmd_show_mem(uint8 *p); + void cmd_pause(uint8 *p); // 0x88 + void cmd_echo_line(uint8 *p); + void cmd_cancel_line(uint8 *p); + void cmd_init_joy(uint8 *p); + void cmd_toggle_monitor(uint8 *p); + void cmd_version(uint8 *p); + void cmd_script_size(uint8 *p); + void cmd_set_game_id(uint8 *p); + void cmd_log(uint8 *p); // 0x90 + void cmd_set_scan_start(uint8 *p); + void cmd_reset_scan_start(uint8 *p); + void cmd_reposition_to(uint8 *p); + void cmd_reposition_to_f(uint8 *p); + void cmd_trace_on(uint8 *p); + void cmd_trace_info(uint8 *p); + void cmd_print_at(uint8 *p); + void cmd_print_at_v(uint8 *p); // 0x98 + //void cmd_discard_view(uint8 *p); // Opcode repeated from 0x20 ? + void cmd_clear_text_rect(uint8 *p); + void cmd_set_upper_left(uint8 *p); + void cmd_set_menu(uint8 *p); + void cmd_set_menu_item(uint8 *p); + void cmd_submit_menu(uint8 *p); + void cmd_enable_item(uint8 *p); + void cmd_disable_item(uint8 *p); // 0xa0 + void cmd_menu_input(uint8 *p); + void cmd_show_obj_v(uint8 *p); + void cmd_open_dialogue(uint8 *p); + void cmd_close_dialogue(uint8 *p); + void cmd_mul_n(uint8 *p); + void cmd_mul_v(uint8 *p); + void cmd_div_n(uint8 *p); + void cmd_div_v(uint8 *p); // 0xa8 + void cmd_close_window(uint8 *p); + void cmd_set_simple(uint8 *p); + void cmd_push_script(uint8 *p); + void cmd_pop_script(uint8 *p); + void cmd_hold_key(uint8 *p); + void cmd_set_pri_base(uint8 *p); + void cmd_discard_sound(uint8 *p); + void cmd_hide_mouse(uint8 *p); // 0xb0 + void cmd_allow_menu(uint8 *p); + void cmd_show_mouse(uint8 *p); + void cmd_fence_mouse(uint8 *p); + void cmd_mouse_posn(uint8 *p); + void cmd_release_key(uint8 *p); + void cmd_adj_ego_move_to_x_y(uint8 *p); }; } // End of namespace Agi diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 9728ed9b42..e18b35d35d 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -35,6 +35,8 @@ namespace Agi { +#define g_agi this + #define p0 (p[0]) #define p1 (p[1]) #define p2 (p[2]) @@ -43,34 +45,33 @@ namespace Agi { #define p5 (p[5]) #define p6 (p[6]) -#define game g_agi->_game -#define g_sprites g_agi->_sprites -#define g_sound g_agi->_sound -#define g_gfx g_agi->_gfx -#define g_picture g_agi->_picture +#define game _game +#define g_sprites _sprites +#define g_sound _sound +#define g_gfx _gfx +#define g_picture _picture #define ip curLogic->cIP -#define vt game.viewTable[p0] -#define vt_v game.viewTable[game.vars[p0]] +#define vt _game.viewTable[p0] +#define vt_v _game.viewTable[_game.vars[p0]] static struct AgiLogic *curLogic; int timerHack; // Workaround for timer loop in MH1 -#define _v game.vars -#define cmd(x) static void cmd_##x (AgiEngine *g_agi, uint8 *p) +#define _v _game.vars -cmd(increment) { +void AgiEngine::cmd_increment(uint8 *p) { if (_v[p0] != 0xff) ++_v[p0]; } -cmd(decrement) { +void AgiEngine::cmd_decrement(uint8 *p) { if (_v[p0] != 0) --_v[p0]; } -cmd(assignn) { +void AgiEngine::cmd_assignn(uint8 *p) { _v[p0] = p1; // WORKAROUND for a bug in fan game "Get outta SQ" @@ -84,83 +85,83 @@ cmd(assignn) { _v[p0] = 8; } -cmd(addn) { +void AgiEngine::cmd_addn(uint8 *p) { _v[p0] += p1; } -cmd(subn) { +void AgiEngine::cmd_subn(uint8 *p) { _v[p0] -= p1; } -cmd(assignv) { +void AgiEngine::cmd_assignv(uint8 *p) { _v[p0] = _v[p1]; } -cmd(addv) { +void AgiEngine::cmd_addv(uint8 *p) { _v[p0] += _v[p1]; } -cmd(subv) { +void AgiEngine::cmd_subv(uint8 *p) { _v[p0] -= _v[p1]; } -cmd(mul_n) { +void AgiEngine::cmd_mul_n(uint8 *p) { _v[p0] *= p1; } -cmd(mul_v) { +void AgiEngine::cmd_mul_v(uint8 *p) { _v[p0] *= _v[p1]; } -cmd(div_n) { +void AgiEngine::cmd_div_n(uint8 *p) { _v[p0] /= p1; } -cmd(div_v) { +void AgiEngine::cmd_div_v(uint8 *p) { _v[p0] /= _v[p1]; } -cmd(random) { +void AgiEngine::cmd_random(uint8 *p) { _v[p2] = g_agi->_rnd->getRandomNumber(p1 - p0) + p0; } -cmd(lindirectn) { +void AgiEngine::cmd_lindirectn(uint8 *p) { _v[_v[p0]] = p1; } -cmd(lindirectv) { +void AgiEngine::cmd_lindirectv(uint8 *p) { _v[_v[p0]] = _v[p1]; } -cmd(rindirect) { +void AgiEngine::cmd_rindirect(uint8 *p) { _v[p0] = _v[_v[p1]]; } -cmd(set) { +void AgiEngine::cmd_set(uint8 *p) { g_agi->setflag(*p, true); } -cmd(reset) { +void AgiEngine::cmd_reset(uint8 *p) { g_agi->setflag(*p, false); } -cmd(toggle) { +void AgiEngine::cmd_toggle(uint8 *p) { g_agi->setflag(*p, !g_agi->getflag(*p)); } -cmd(set_v) { +void AgiEngine::cmd_set_v(uint8 *p) { g_agi->setflag(_v[p0], true); } -cmd(reset_v) { +void AgiEngine::cmd_reset_v(uint8 *p) { g_agi->setflag(_v[p0], false); } -cmd(toggle_v) { +void AgiEngine::cmd_toggle_v(uint8 *p) { g_agi->setflag(_v[p0], !g_agi->getflag(_v[p0])); } -cmd(new_room) { +void AgiEngine::cmd_new_room(uint8 *p) { g_agi->newRoom(p0); // WORKAROUND: Works around intro skipping bug (#1737343) in Gold Rush. @@ -176,79 +177,79 @@ cmd(new_room) { game.keypress = 0; } -cmd(new_room_f) { +void AgiEngine::cmd_new_room_f(uint8 *p) { g_agi->newRoom(_v[p0]); } -cmd(load_view) { +void AgiEngine::cmd_load_view(uint8 *p) { g_agi->agiLoadResource(rVIEW, p0); } -cmd(load_logic) { +void AgiEngine::cmd_load_logic(uint8 *p) { g_agi->agiLoadResource(rLOGIC, p0); } -cmd(load_sound) { +void AgiEngine::cmd_load_sound(uint8 *p) { g_agi->agiLoadResource(rSOUND, p0); } -cmd(load_view_f) { +void AgiEngine::cmd_load_view_f(uint8 *p) { g_agi->agiLoadResource(rVIEW, _v[p0]); } -cmd(load_logic_f) { +void AgiEngine::cmd_load_logic_f(uint8 *p) { g_agi->agiLoadResource(rLOGIC, _v[p0]); } -cmd(discard_view) { +void AgiEngine::cmd_discard_view(uint8 *p) { g_agi->agiUnloadResource(rVIEW, p0); } -cmd(object_on_anything) { +void AgiEngine::cmd_object_on_anything(uint8 *p) { vt.flags &= ~(ON_WATER | ON_LAND); } -cmd(object_on_land) { +void AgiEngine::cmd_object_on_land(uint8 *p) { vt.flags |= ON_LAND; } -cmd(object_on_water) { +void AgiEngine::cmd_object_on_water(uint8 *p) { vt.flags |= ON_WATER; } -cmd(observe_horizon) { +void AgiEngine::cmd_observe_horizon(uint8 *p) { vt.flags &= ~IGNORE_HORIZON; } -cmd(ignore_horizon) { +void AgiEngine::cmd_ignore_horizon(uint8 *p) { vt.flags |= IGNORE_HORIZON; } -cmd(observe_objs) { +void AgiEngine::cmd_observe_objs(uint8 *p) { vt.flags &= ~IGNORE_OBJECTS; } -cmd(ignore_objs) { +void AgiEngine::cmd_ignore_objs(uint8 *p) { vt.flags |= IGNORE_OBJECTS; } -cmd(observe_blocks) { +void AgiEngine::cmd_observe_blocks(uint8 *p) { vt.flags &= ~IGNORE_BLOCKS; } -cmd(ignore_blocks) { +void AgiEngine::cmd_ignore_blocks(uint8 *p) { vt.flags |= IGNORE_BLOCKS; } -cmd(set_horizon) { +void AgiEngine::cmd_set_horizon(uint8 *p) { game.horizon = p0; } -cmd(get_priority) { +void AgiEngine::cmd_get_priority(uint8 *p) { _v[p1] = vt.priority; } -cmd(set_priority) { +void AgiEngine::cmd_set_priority(uint8 *p) { vt.flags |= FIXED_PRIORITY; vt.priority = p1; @@ -271,242 +272,242 @@ cmd(set_priority) { } } -cmd(set_priority_f) { +void AgiEngine::cmd_set_priority_f(uint8 *p) { vt.flags |= FIXED_PRIORITY; vt.priority = _v[p1]; } -cmd(release_priority) { +void AgiEngine::cmd_release_priority(uint8 *p) { vt.flags &= ~FIXED_PRIORITY; } -cmd(set_upper_left) { // do nothing (AGI 2.917) +void AgiEngine::cmd_set_upper_left(uint8 *p) { // do nothing (AGI 2.917) } -cmd(start_update) { +void AgiEngine::cmd_start_update(uint8 *p) { g_agi->startUpdate(&vt); } -cmd(stop_update) { +void AgiEngine::cmd_stop_update(uint8 *p) { g_agi->stopUpdate(&vt); } -cmd(current_view) { +void AgiEngine::cmd_current_view(uint8 *p) { _v[p1] = vt.currentView; } -cmd(current_cel) { +void AgiEngine::cmd_current_cel(uint8 *p) { _v[p1] = vt.currentCel; debugC(4, kDebugLevelScripts, "v%d=%d", p1, _v[p1]); } -cmd(current_loop) { +void AgiEngine::cmd_current_loop(uint8 *p) { _v[p1] = vt.currentLoop; } -cmd(last_cel) { +void AgiEngine::cmd_last_cel(uint8 *p) { _v[p1] = vt.loopData->numCels - 1; } -cmd(set_cel) { +void AgiEngine::cmd_set_cel(uint8 *p) { g_agi->setCel(&vt, p1); vt.flags &= ~DONTUPDATE; } -cmd(set_cel_f) { +void AgiEngine::cmd_set_cel_f(uint8 *p) { g_agi->setCel(&vt, _v[p1]); vt.flags &= ~DONTUPDATE; } -cmd(set_view) { +void AgiEngine::cmd_set_view(uint8 *p) { g_agi->setView(&vt, p1); } -cmd(set_view_f) { +void AgiEngine::cmd_set_view_f(uint8 *p) { g_agi->setView(&vt, _v[p1]); } -cmd(set_loop) { +void AgiEngine::cmd_set_loop(uint8 *p) { g_agi->setLoop(&vt, p1); } -cmd(set_loop_f) { +void AgiEngine::cmd_set_loop_f(uint8 *p) { g_agi->setLoop(&vt, _v[p1]); } -cmd(number_of_loops) { +void AgiEngine::cmd_number_of_loops(uint8 *p) { _v[p1] = vt.numLoops; } -cmd(fix_loop) { +void AgiEngine::cmd_fix_loop(uint8 *p) { vt.flags |= FIX_LOOP; } -cmd(release_loop) { +void AgiEngine::cmd_release_loop(uint8 *p) { vt.flags &= ~FIX_LOOP; } -cmd(step_size) { +void AgiEngine::cmd_step_size(uint8 *p) { vt.stepSize = _v[p1]; } -cmd(step_time) { +void AgiEngine::cmd_step_time(uint8 *p) { vt.stepTime = vt.stepTimeCount = _v[p1]; } -cmd(cycle_time) { +void AgiEngine::cmd_cycle_time(uint8 *p) { vt.cycleTime = vt.cycleTimeCount = _v[p1]; } -cmd(stop_cycling) { +void AgiEngine::cmd_stop_cycling(uint8 *p) { vt.flags &= ~CYCLING; } -cmd(start_cycling) { +void AgiEngine::cmd_start_cycling(uint8 *p) { vt.flags |= CYCLING; } -cmd(normal_cycle) { +void AgiEngine::cmd_normal_cycle(uint8 *p) { vt.cycle = CYCLE_NORMAL; vt.flags |= CYCLING; } -cmd(reverse_cycle) { +void AgiEngine::cmd_reverse_cycle(uint8 *p) { vt.cycle = CYCLE_REVERSE; vt.flags |= CYCLING; } -cmd(set_dir) { +void AgiEngine::cmd_set_dir(uint8 *p) { vt.direction = _v[p1]; } -cmd(get_dir) { +void AgiEngine::cmd_get_dir(uint8 *p) { _v[p1] = vt.direction; } -cmd(get_room_f) { +void AgiEngine::cmd_get_room_f(uint8 *p) { _v[p1] = g_agi->objectGetLocation(_v[p0]); } -cmd(put) { +void AgiEngine::cmd_put(uint8 *p) { g_agi->objectSetLocation(p0, _v[p1]); } -cmd(put_f) { +void AgiEngine::cmd_put_f(uint8 *p) { g_agi->objectSetLocation(_v[p0], _v[p1]); } -cmd(drop) { +void AgiEngine::cmd_drop(uint8 *p) { g_agi->objectSetLocation(p0, 0); } -cmd(get) { +void AgiEngine::cmd_get(uint8 *p) { g_agi->objectSetLocation(p0, EGO_OWNED); } -cmd(get_f) { +void AgiEngine::cmd_get_f(uint8 *p) { g_agi->objectSetLocation(_v[p0], EGO_OWNED); } -cmd(word_to_string) { +void AgiEngine::cmd_word_to_string(uint8 *p) { strcpy(game.strings[p0], game.egoWords[p1].word); } -cmd(open_dialogue) { +void AgiEngine::cmd_open_dialogue(uint8 *p) { game.hasWindow = true; } -cmd(close_dialogue) { +void AgiEngine::cmd_close_dialogue(uint8 *p) { game.hasWindow = false; } -cmd(close_window) { +void AgiEngine::cmd_close_window(uint8 *p) { g_agi->closeWindow(); } -cmd(status_line_on) { +void AgiEngine::cmd_status_line_on(uint8 *p) { game.statusLine = true; g_agi->writeStatus(); } -cmd(status_line_off) { +void AgiEngine::cmd_status_line_off(uint8 *p) { game.statusLine = false; g_agi->writeStatus(); } -cmd(show_obj) { +void AgiEngine::cmd_show_obj(uint8 *p) { g_sprites->showObj(p0); } -cmd(show_obj_v) { +void AgiEngine::cmd_show_obj_v(uint8 *p) { g_sprites->showObj(_v[p0]); } -cmd(sound) { +void AgiEngine::cmd_sound(uint8 *p) { g_sound->startSound(p0, p1); } -cmd(stop_sound) { +void AgiEngine::cmd_stop_sound(uint8 *p) { g_sound->stopSound(); } -cmd(menu_input) { +void AgiEngine::cmd_menu_input(uint8 *p) { g_agi->newInputMode(INPUT_MENU); } -cmd(enable_item) { +void AgiEngine::cmd_enable_item(uint8 *p) { g_agi->_menu->setItem(p0, true); } -cmd(disable_item) { +void AgiEngine::cmd_disable_item(uint8 *p) { g_agi->_menu->setItem(p0, false); } -cmd(submit_menu) { +void AgiEngine::cmd_submit_menu(uint8 *p) { g_agi->_menu->submit(); } -cmd(set_scan_start) { +void AgiEngine::cmd_set_scan_start(uint8 *p) { curLogic->sIP = curLogic->cIP; } -cmd(reset_scan_start) { +void AgiEngine::cmd_reset_scan_start(uint8 *p) { curLogic->sIP = 2; } -cmd(save_game) { +void AgiEngine::cmd_save_game(uint8 *p) { game.simpleSave ? g_agi->saveGameSimple() : g_agi->saveGameDialog(); } -cmd(load_game) { +void AgiEngine::cmd_load_game(uint8 *p) { assert(1); game.simpleSave ? g_agi->loadGameSimple() : g_agi->loadGameDialog(); } -cmd(init_disk) { // do nothing +void AgiEngine::cmd_init_disk(uint8 *p) { // do nothing } -cmd(log) { // do nothing +void AgiEngine::cmd_log(uint8 *p) { // do nothing } -cmd(trace_on) { // do nothing +void AgiEngine::cmd_trace_on(uint8 *p) { // do nothing } -cmd(trace_info) { // do nothing +void AgiEngine::cmd_trace_info(uint8 *p) { // do nothing } -cmd(show_mem) { +void AgiEngine::cmd_show_mem(uint8 *p) { g_agi->messageBox("Enough memory"); } -cmd(init_joy) { // do nothing +void AgiEngine::cmd_init_joy(uint8 *p) { // do nothing } -cmd(script_size) { +void AgiEngine::cmd_script_size(uint8 *p) { report("script.size(%d)\n", p0); } -cmd(cancel_line) { +void AgiEngine::cmd_cancel_line(uint8 *p) { g_agi->_game.inputBuffer[0] = 0; g_agi->writePrompt(); } @@ -521,7 +522,7 @@ cmd(cancel_line) { // 4051 (When ego is stationary), // 471 (When walking on the first screen's bridge), // 71 (When walking around, using the mouse or the keyboard). -cmd(obj_status_f) { +void AgiEngine::cmd_obj_status_f(uint8 *p) { const char *cycleDesc; // Object's cycle description line const char *motionDesc; // Object's motion description line char msg[256]; // The whole object status message @@ -593,22 +594,22 @@ cmd(obj_status_f) { // unk_174: Change priority table (used in KQ4) -- j5 // unk_177: Disable menus completely -- j5 // unk_181: Deactivate keypressed control (default control of ego) -cmd(set_simple) { +void AgiEngine::cmd_set_simple(uint8 *p) { if (!(g_agi->getFeatures() & (GF_AGI256 | GF_AGI256_2))) { game.simpleSave = true; } else { // AGI256 and AGI256-2 use this unknown170 command to load 256 color pictures. - // Load the picture. Similar to cmd(load_pic). + // Load the picture. Similar to void AgiEngine::cmd_load_pic(uint8 *p). g_sprites->eraseBoth(); g_agi->agiLoadResource(rPICTURE, _v[p0]); - // Draw the picture. Similar to cmd(draw_pic). + // Draw the picture. Similar to void AgiEngine::cmd_draw_pic(uint8 *p). g_picture->decodePicture(_v[p0], false, true); g_sprites->blitBoth(); game.pictureShown = 0; - // Show the picture. Similar to cmd(show_pic). + // Show the picture. Similar to void AgiEngine::cmd_show_pic(uint8 *p). g_agi->setflag(fOutputMode, false); - cmd_close_window(g_agi, NULL); + g_agi->closeWindow(); g_picture->showPic(); game.pictureShown = 1; @@ -617,25 +618,25 @@ cmd(set_simple) { } } -cmd(pop_script) { +void AgiEngine::cmd_pop_script(uint8 *p) { if (g_agi->getVersion() >= 0x2915) { report("pop.script\n"); } } -cmd(hold_key) { +void AgiEngine::cmd_hold_key(uint8 *p) { if (g_agi->getVersion() >= 0x3098) { g_agi->_egoHoldKey = true; } } -cmd(discard_sound) { +void AgiEngine::cmd_discard_sound(uint8 *p) { if (g_agi->getVersion() >= 0x2936) { report("discard.sound\n"); } } -cmd(hide_mouse) { +void AgiEngine::cmd_hide_mouse(uint8 *p) { // WORKAROUND: Turns off current movement that's being caused with the mouse. // This fixes problems with too many popup boxes appearing in the Amiga // Gold Rush's copy protection failure scene (i.e. the hanging scene, logic.192). @@ -648,29 +649,29 @@ cmd(hide_mouse) { g_system->showMouse(false); } -cmd(allow_menu) { +void AgiEngine::cmd_allow_menu(uint8 *p) { if (g_agi->getVersion() >= 0x3098) { g_agi->setflag(fMenusWork, ((p0 != 0) ? true : false)); } } -cmd(show_mouse) { +void AgiEngine::cmd_show_mouse(uint8 *p) { g_system->showMouse(true); } -cmd(fence_mouse) { +void AgiEngine::cmd_fence_mouse(uint8 *p) { g_agi->_game.mouseFence.moveTo(p0, p1); g_agi->_game.mouseFence.setWidth(p2 - p0); g_agi->_game.mouseFence.setHeight(p3 - p1); } -cmd(release_key) { +void AgiEngine::cmd_release_key(uint8 *p) { if (g_agi->getVersion() >= 0x3098) { g_agi->_egoHoldKey = false; } } -cmd(adj_ego_move_to_x_y) { +void AgiEngine::cmd_adj_ego_move_to_x_y(uint8 *p) { int8 x, y; switch (logicNamesCmd[182].numArgs) { @@ -708,7 +709,7 @@ cmd(adj_ego_move_to_x_y) { } } -cmd(parse) { +void AgiEngine::cmd_parse(uint8 *p) { _v[vWordNotFound] = 0; g_agi->setflag(fEnteredCli, false); g_agi->setflag(fSaidAcceptedInput, false); @@ -716,7 +717,7 @@ cmd(parse) { g_agi->dictionaryWords(g_agi->agiSprintf(game.strings[p0])); } -cmd(call) { +void AgiEngine::cmd_call(uint8 *p) { int oldCIP; int oldLognum; @@ -732,11 +733,11 @@ cmd(call) { curLogic->cIP = oldCIP; } -cmd(call_f) { - cmd_call(g_agi, &_v[p0]); +void AgiEngine::cmd_call_f(uint8 *p) { + cmd_call(&_v[p0]); } -cmd(draw_pic) { +void AgiEngine::cmd_draw_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "=== draw pic %d ===", _v[p0]); g_sprites->eraseBoth(); g_picture->decodePicture(_v[p0], true); @@ -764,30 +765,30 @@ cmd(draw_pic) { g_agi->pause(kPausePicture); } -cmd(show_pic) { +void AgiEngine::cmd_show_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "=== show pic ==="); g_agi->setflag(fOutputMode, false); - cmd_close_window(g_agi, NULL); + g_agi->closeWindow(); g_picture->showPic(); game.pictureShown = 1; debugC(6, kDebugLevelScripts, "--- end of show pic ---"); } -cmd(load_pic) { +void AgiEngine::cmd_load_pic(uint8 *p) { g_sprites->eraseBoth(); g_agi->agiLoadResource(rPICTURE, _v[p0]); g_sprites->blitBoth(); g_sprites->commitBoth(); } -cmd(discard_pic) { +void AgiEngine::cmd_discard_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "--- discard pic ---"); // do nothing } -cmd(overlay_pic) { +void AgiEngine::cmd_overlay_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "--- overlay pic ---"); g_sprites->eraseBoth(); @@ -800,7 +801,7 @@ cmd(overlay_pic) { g_agi->pause(kPausePicture); } -cmd(show_pri_screen) { +void AgiEngine::cmd_show_pri_screen(uint8 *p) { g_agi->_debug.priority = 1; g_sprites->eraseBoth(); g_picture->showPic(); @@ -814,7 +815,7 @@ cmd(show_pri_screen) { g_sprites->blitBoth(); } -cmd(animate_obj) { +void AgiEngine::cmd_animate_obj(uint8 *p) { if (vt.flags & ANIMATED) return; @@ -825,14 +826,14 @@ cmd(animate_obj) { vt.direction = 0; } -cmd(unanimate_all) { +void AgiEngine::cmd_unanimate_all(uint8 *p) { int i; for (i = 0; i < MAX_VIEWTABLE; i++) game.viewTable[i].flags &= ~(ANIMATED | DRAWN); } -cmd(draw) { +void AgiEngine::cmd_draw(uint8 *p) { if (vt.flags & DRAWN) return; @@ -876,7 +877,7 @@ cmd(draw) { debugC(4, kDebugLevelScripts, "vt entry #%d flags = %02x", p0, vt.flags); } -cmd(erase) { +void AgiEngine::cmd_erase(uint8 *p) { if (~vt.flags & DRAWN) return; @@ -901,7 +902,7 @@ cmd(erase) { g_sprites->commitBlock(x1, y1, x2, y2, true); } -cmd(position) { +void AgiEngine::cmd_position(uint8 *p) { vt.xPos = vt.xPos2 = p1; vt.yPos = vt.yPos2 = p2; @@ -922,7 +923,7 @@ cmd(position) { g_agi->clipViewCoordinates(&vt); } -cmd(position_f) { +void AgiEngine::cmd_position_f(uint8 *p) { vt.xPos = vt.xPos2 = _v[p1]; vt.yPos = vt.yPos2 = _v[p2]; @@ -933,12 +934,12 @@ cmd(position_f) { g_agi->clipViewCoordinates(&vt); } -cmd(get_posn) { +void AgiEngine::cmd_get_posn(uint8 *p) { game.vars[p1] = (unsigned char)vt.xPos; game.vars[p2] = (unsigned char)vt.yPos; } -cmd(reposition) { +void AgiEngine::cmd_reposition(uint8 *p) { int dx = (int8) _v[p1], dy = (int8) _v[p2]; debugC(4, kDebugLevelScripts, "dx=%d, dy=%d", dx, dy); @@ -957,35 +958,35 @@ cmd(reposition) { g_agi->fixPosition(p0); } -cmd(reposition_to) { +void AgiEngine::cmd_reposition_to(uint8 *p) { vt.xPos = p1; vt.yPos = p2; vt.flags |= UPDATE_POS; g_agi->fixPosition(p0); } -cmd(reposition_to_f) { +void AgiEngine::cmd_reposition_to_f(uint8 *p) { vt.xPos = _v[p1]; vt.yPos = _v[p2]; vt.flags |= UPDATE_POS; g_agi->fixPosition(p0); } -cmd(add_to_pic) { +void AgiEngine::cmd_add_to_pic(uint8 *p) { g_sprites->addToPic(p0, p1, p2, p3, p4, p5, p6); } -cmd(add_to_pic_f) { +void AgiEngine::cmd_add_to_pic_f(uint8 *p) { g_sprites->addToPic(_v[p0], _v[p1], _v[p2], _v[p3], _v[p4], _v[p5], _v[p6]); } -cmd(force_update) { +void AgiEngine::cmd_force_update(uint8 *p) { g_sprites->eraseBoth(); g_sprites->blitBoth(); g_sprites->commitBoth(); } -cmd(reverse_loop) { +void AgiEngine::cmd_reverse_loop(uint8 *p) { debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1); vt.cycle = CYCLE_REV_LOOP; vt.flags |= (DONTUPDATE | UPDATE | CYCLING); @@ -993,7 +994,7 @@ cmd(reverse_loop) { g_agi->setflag(p1, false); } -cmd(end_of_loop) { +void AgiEngine::cmd_end_of_loop(uint8 *p) { debugC(4, kDebugLevelScripts, "o%d, f%d", p0, p1); vt.cycle = CYCLE_END_OF_LOOP; vt.flags |= (DONTUPDATE | UPDATE | CYCLING); @@ -1001,7 +1002,7 @@ cmd(end_of_loop) { g_agi->setflag(p1, false); } -cmd(block) { +void AgiEngine::cmd_block(uint8 *p) { debugC(4, kDebugLevelScripts, "x1=%d, y1=%d, x2=%d, y2=%d", p0, p1, p2, p3); game.block.active = true; game.block.x1 = p0; @@ -1010,15 +1011,15 @@ cmd(block) { game.block.y2 = p3; } -cmd(unblock) { +void AgiEngine::cmd_unblock(uint8 *p) { game.block.active = false; } -cmd(normal_motion) { +void AgiEngine::cmd_normal_motion(uint8 *p) { vt.motion = MOTION_NORMAL; } -cmd(stop_motion) { +void AgiEngine::cmd_stop_motion(uint8 *p) { vt.direction = 0; vt.motion = MOTION_NORMAL; if (p0 == 0) { // ego only @@ -1027,7 +1028,7 @@ cmd(stop_motion) { } } -cmd(start_motion) { +void AgiEngine::cmd_start_motion(uint8 *p) { vt.motion = MOTION_NORMAL; if (p0 == 0) { // ego only _v[vEgoDir] = 0; @@ -1035,16 +1036,16 @@ cmd(start_motion) { } } -cmd(player_control) { +void AgiEngine::cmd_player_control(uint8 *p) { game.playerControl = true; game.viewTable[0].motion = MOTION_NORMAL; } -cmd(program_control) { +void AgiEngine::cmd_program_control(uint8 *p) { game.playerControl = false; } -cmd(follow_ego) { +void AgiEngine::cmd_follow_ego(uint8 *p) { vt.motion = MOTION_FOLLOW_EGO; vt.parm1 = p1 > vt.stepSize ? p1 : vt.stepSize; vt.parm2 = p2; @@ -1053,7 +1054,7 @@ cmd(follow_ego) { vt.flags |= UPDATE; } -cmd(move_obj) { +void AgiEngine::cmd_move_obj(uint8 *p) { // _D (_D_WARN "o=%d, x=%d, y=%d, s=%d, f=%d", p0, p1, p2, p3, p4); vt.motion = MOTION_MOVE_OBJ; @@ -1076,7 +1077,7 @@ cmd(move_obj) { g_agi->moveObj(&vt); } -cmd(move_obj_f) { +void AgiEngine::cmd_move_obj_f(uint8 *p) { vt.motion = MOTION_MOVE_OBJ; vt.parm1 = _v[p1]; vt.parm2 = _v[p2]; @@ -1097,7 +1098,7 @@ cmd(move_obj_f) { g_agi->moveObj(&vt); } -cmd(wander) { +void AgiEngine::cmd_wander(uint8 *p) { if (p0 == 0) game.playerControl = false; @@ -1105,7 +1106,7 @@ cmd(wander) { vt.flags |= UPDATE; } -cmd(set_game_id) { +void AgiEngine::cmd_set_game_id(uint8 *p) { if (curLogic->texts && (p0 - 1) <= curLogic->numTexts) strncpy(game.id, curLogic->texts[p0 - 1], 8); else @@ -1114,7 +1115,7 @@ cmd(set_game_id) { report("Game ID: \"%s\"\n", game.id); } -cmd(pause) { +void AgiEngine::cmd_pause(uint8 *p) { int tmp = game.clockEnabled; const char *b[] = { "Continue", NULL }; const char *b_ru[] = { "\x8f\xe0\xae\xa4\xae\xab\xa6\xa8\xe2\xec", NULL }; @@ -1132,21 +1133,21 @@ cmd(pause) { game.clockEnabled = tmp; } -cmd(set_menu) { +void AgiEngine::cmd_set_menu(uint8 *p) { debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, curLogic->numTexts); if (curLogic->texts != NULL && p0 <= curLogic->numTexts) g_agi->_menu->add(curLogic->texts[p0 - 1]); } -cmd(set_menu_item) { +void AgiEngine::cmd_set_menu_item(uint8 *p) { debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, curLogic->numTexts); if (curLogic->texts != NULL && p0 <= curLogic->numTexts) g_agi->_menu->addItem(curLogic->texts[p0 - 1], p1); } -cmd(version) { +void AgiEngine::cmd_version(uint8 *p) { char verMsg[64]; char ver2Msg[] = "\n" @@ -1186,13 +1187,13 @@ cmd(version) { g_agi->messageBox(msg); } -cmd(configure_screen) { +void AgiEngine::cmd_configure_screen(uint8 *p) { game.lineMinPrint = p0; game.lineUserInput = p1; game.lineStatus = p2; } -cmd(text_screen) { +void AgiEngine::cmd_text_screen(uint8 *p) { debugC(4, kDebugLevelScripts, "switching to text mode"); game.gfxMode = false; @@ -1204,7 +1205,7 @@ cmd(text_screen) { g_gfx->clearScreen(game.colorBg); } -cmd(graphics) { +void AgiEngine::cmd_graphics(uint8 *p) { debugC(4, kDebugLevelScripts, "switching to graphics mode"); if (!game.gfxMode) { @@ -1216,7 +1217,7 @@ cmd(graphics) { } } -cmd(set_text_attribute) { +void AgiEngine::cmd_set_text_attribute(uint8 *p) { game.colorFg = p0; game.colorBg = p1; @@ -1228,11 +1229,11 @@ cmd(set_text_attribute) { } } -cmd(status) { +void AgiEngine::cmd_status(uint8 *p) { g_agi->inventory(); } -cmd(quit) { +void AgiEngine::cmd_quit(uint8 *p) { const char *buttons[] = { "Quit", "Continue", NULL }; g_sound->stopSound(); @@ -1246,7 +1247,7 @@ cmd(quit) { } } -cmd(restart_game) { +void AgiEngine::cmd_restart_game(uint8 *p) { const char *buttons[] = { "Restart", "Continue", NULL }; int sel; @@ -1261,7 +1262,7 @@ cmd(restart_game) { } } -cmd(distance) { +void AgiEngine::cmd_distance(uint8 *p) { int16 x1, y1, x2, y2, d; VtEntry *v0 = &game.viewTable[p0]; VtEntry *v1 = &game.viewTable[p1]; @@ -1312,7 +1313,7 @@ cmd(distance) { _v[p2] = (unsigned char)d; } -cmd(accept_input) { +void AgiEngine::cmd_accept_input(uint8 *p) { debugC(4, kDebugLevelScripts | kDebugLevelInput, "input normal"); g_agi->newInputMode(INPUT_NORMAL); @@ -1320,7 +1321,7 @@ cmd(accept_input) { g_agi->writePrompt(); } -cmd(prevent_input) { +void AgiEngine::cmd_prevent_input(uint8 *p) { debugC(4, kDebugLevelScripts | kDebugLevelInput, "no input"); g_agi->newInputMode(INPUT_NONE); @@ -1329,7 +1330,7 @@ cmd(prevent_input) { g_agi->clearPrompt(); } -cmd(get_string) { +void AgiEngine::cmd_get_string(uint8 *p) { int tex, row, col; debugC(4, kDebugLevelScripts, "%d %d %d %d %d", p0, p1, p2, p3, p4); @@ -1362,7 +1363,7 @@ cmd(get_string) { } while (game.inputMode == INPUT_GETSTRING && !(g_agi->shouldQuit() || g_agi->_restartGame)); } -cmd(get_num) { +void AgiEngine::cmd_get_num(uint8 *p) { debugC(4, kDebugLevelScripts, "%d %d", p0, p1); g_agi->newInputMode(INPUT_GETSTRING); @@ -1389,7 +1390,7 @@ cmd(get_num) { g_agi->flushLines(22, 22); } -cmd(set_cursor_char) { +void AgiEngine::cmd_set_cursor_char(uint8 *p) { if (curLogic->texts != NULL && (p0 - 1) <= curLogic->numTexts) { game.cursorChar = *curLogic->texts[p0 - 1]; } else { @@ -1398,7 +1399,7 @@ cmd(set_cursor_char) { } } -cmd(set_key) { +void AgiEngine::cmd_set_key(uint8 *p) { int key; if (game.lastController >= MAX_CONTROLLERS) { @@ -1417,14 +1418,14 @@ cmd(set_key) { game.controllerOccured[p2] = false; } -cmd(set_string) { +void AgiEngine::cmd_set_string(uint8 *p) { // CM: to avoid crash in Groza (str = 150) if (p0 > MAX_STRINGS) return; strcpy(game.strings[p0], curLogic->texts[p1 - 1]); } -cmd(display) { +void AgiEngine::cmd_display(uint8 *p) { int len = 40; char *s = g_agi->wordWrapString(curLogic->texts[p2 - 1], &len); @@ -1434,11 +1435,11 @@ cmd(display) { free(s); } -cmd(display_f) { +void AgiEngine::cmd_display_f(uint8 *p) { g_agi->printText(curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, game.colorFg, game.colorBg); } -cmd(clear_text_rect) { +void AgiEngine::cmd_clear_text_rect(uint8 *p) { int c, x1, y1, x2, y2; if ((c = p4) != 0) @@ -1463,17 +1464,17 @@ cmd(clear_text_rect) { g_gfx->flushBlock(x1, y1, x2, y2); } -cmd(toggle_monitor) { +void AgiEngine::cmd_toggle_monitor(uint8 *p) { report("toggle.monitor\n"); } -cmd(echo_line) { +void AgiEngine::cmd_echo_line(uint8 *p) { strcpy((char *)game.inputBuffer, (const char *)game.echoBuffer); game.cursorPos = strlen((char *)game.inputBuffer); game.hasPrompt = 0; } -cmd(clear_lines) { +void AgiEngine::cmd_clear_lines(uint8 *p) { uint8 l; // Residence 44 calls clear.lines(24,0,0), see Sarien bug #558423 @@ -1487,19 +1488,19 @@ cmd(clear_lines) { g_agi->flushLines(p0, l); } -cmd(print) { +void AgiEngine::cmd_print(uint8 *p) { int n = p0 < 1 ? 1 : p0; g_agi->print(curLogic->texts[n - 1], 0, 0, 0); } -cmd(print_f) { +void AgiEngine::cmd_print_f(uint8 *p) { int n = _v[p0] < 1 ? 1 : _v[p0]; g_agi->print(curLogic->texts[n - 1], 0, 0, 0); } -cmd(print_at) { +void AgiEngine::cmd_print_at(uint8 *p) { int n = p0 < 1 ? 1 : p0; debugC(4, kDebugLevelScripts, "%d %d %d %d", p0, p1, p2, p3); @@ -1507,13 +1508,13 @@ cmd(print_at) { g_agi->print(curLogic->texts[n - 1], p1, p2, p3); } -cmd(print_at_v) { +void AgiEngine::cmd_print_at_v(uint8 *p) { int n = _v[p0] < 1 ? 1 : _v[p0]; g_agi->print(curLogic->texts[n - 1], p1, p2, p3); } -cmd(push_script) { +void AgiEngine::cmd_push_script(uint8 *p) { // We run AGIMOUSE always as a side effect if (g_agi->getFeatures() & GF_AGIMOUSE || 1) { game.vars[27] = g_agi->_mouse.button; @@ -1526,7 +1527,7 @@ cmd(push_script) { } } -cmd(set_pri_base) { +void AgiEngine::cmd_set_pri_base(uint8 *p) { int i, x, pri; report("Priority base set to %d\n", p0); @@ -1542,12 +1543,12 @@ cmd(set_pri_base) { } } -cmd(mouse_posn) { +void AgiEngine::cmd_mouse_posn(uint8 *p) { _v[p0] = WIN_TO_PIC_X(g_agi->_mouse.x); _v[p1] = WIN_TO_PIC_Y(g_agi->_mouse.y); } -cmd(shake_screen) { +void AgiEngine::cmd_shake_screen(uint8 *p) { int i; // AGIPAL uses shake.screen values between 100 and 109 to set the palette @@ -1580,191 +1581,196 @@ cmd(shake_screen) { game.inputEnabled = originalValue; } -static void (*agiCommand[183])(AgiEngine *, uint8 *) = { - NULL, // 0x00 - cmd_increment, - cmd_decrement, - cmd_assignn, - cmd_assignv, - cmd_addn, - cmd_addv, - cmd_subn, - cmd_subv, // 0x08 - cmd_lindirectv, - cmd_rindirect, - cmd_lindirectn, - cmd_set, - cmd_reset, - cmd_toggle, - cmd_set_v, - cmd_reset_v, // 0x10 - cmd_toggle_v, - cmd_new_room, - cmd_new_room_f, - cmd_load_logic, - cmd_load_logic_f, - cmd_call, - cmd_call_f, - cmd_load_pic, // 0x18 - cmd_draw_pic, - cmd_show_pic, - cmd_discard_pic, - cmd_overlay_pic, - cmd_show_pri_screen, - cmd_load_view, - cmd_load_view_f, - cmd_discard_view, // 0x20 - cmd_animate_obj, - cmd_unanimate_all, - cmd_draw, - cmd_erase, - cmd_position, - cmd_position_f, - cmd_get_posn, - cmd_reposition, // 0x28 - cmd_set_view, - cmd_set_view_f, - cmd_set_loop, - cmd_set_loop_f, - cmd_fix_loop, - cmd_release_loop, - cmd_set_cel, - cmd_set_cel_f, // 0x30 - cmd_last_cel, - cmd_current_cel, - cmd_current_loop, - cmd_current_view, - cmd_number_of_loops, - cmd_set_priority, - cmd_set_priority_f, - cmd_release_priority, // 0x38 - cmd_get_priority, - cmd_stop_update, - cmd_start_update, - cmd_force_update, - cmd_ignore_horizon, - cmd_observe_horizon, - cmd_set_horizon, - cmd_object_on_water, // 0x40 - cmd_object_on_land, - cmd_object_on_anything, - cmd_ignore_objs, - cmd_observe_objs, - cmd_distance, - cmd_stop_cycling, - cmd_start_cycling, - cmd_normal_cycle, // 0x48 - cmd_end_of_loop, - cmd_reverse_cycle, - cmd_reverse_loop, - cmd_cycle_time, - cmd_stop_motion, - cmd_start_motion, - cmd_step_size, - cmd_step_time, // 0x50 - cmd_move_obj, - cmd_move_obj_f, - cmd_follow_ego, - cmd_wander, - cmd_normal_motion, - cmd_set_dir, - cmd_get_dir, - cmd_ignore_blocks, // 0x58 - cmd_observe_blocks, - cmd_block, - cmd_unblock, - cmd_get, - cmd_get_f, - cmd_drop, - cmd_put, - cmd_put_f, // 0x60 - cmd_get_room_f, - cmd_load_sound, - cmd_sound, - cmd_stop_sound, - cmd_print, - cmd_print_f, - cmd_display, - cmd_display_f, // 0x68 - cmd_clear_lines, - cmd_text_screen, - cmd_graphics, - cmd_set_cursor_char, - cmd_set_text_attribute, - cmd_shake_screen, - cmd_configure_screen, - cmd_status_line_on, // 0x70 - cmd_status_line_off, - cmd_set_string, - cmd_get_string, - cmd_word_to_string, - cmd_parse, - cmd_get_num, - cmd_prevent_input, - cmd_accept_input, // 0x78 - cmd_set_key, - cmd_add_to_pic, - cmd_add_to_pic_f, - cmd_status, - cmd_save_game, - cmd_load_game, - cmd_init_disk, - cmd_restart_game, // 0x80 - cmd_show_obj, - cmd_random, - cmd_program_control, - cmd_player_control, - cmd_obj_status_f, - cmd_quit, - cmd_show_mem, - cmd_pause, // 0x88 - cmd_echo_line, - cmd_cancel_line, - cmd_init_joy, - cmd_toggle_monitor, - cmd_version, - cmd_script_size, - cmd_set_game_id, - cmd_log, // 0x90 - cmd_set_scan_start, - cmd_reset_scan_start, - cmd_reposition_to, - cmd_reposition_to_f, - cmd_trace_on, - cmd_trace_info, - cmd_print_at, - cmd_print_at_v, // 0x98 - cmd_discard_view, - cmd_clear_text_rect, - cmd_set_upper_left, - cmd_set_menu, - cmd_set_menu_item, - cmd_submit_menu, - cmd_enable_item, - cmd_disable_item, // 0xa0 - cmd_menu_input, - cmd_show_obj_v, - cmd_open_dialogue, - cmd_close_dialogue, - cmd_mul_n, - cmd_mul_v, - cmd_div_n, - cmd_div_v, // 0xa8 - cmd_close_window, - cmd_set_simple, - cmd_push_script, - cmd_pop_script, - cmd_hold_key, - cmd_set_pri_base, - cmd_discard_sound, - cmd_hide_mouse, // 0xb0 - cmd_allow_menu, - cmd_show_mouse, - cmd_fence_mouse, - cmd_mouse_posn, - cmd_release_key, - cmd_adj_ego_move_to_x_y -}; +void AgiEngine::setupOpcodes() { + AgiCommand tmp[] = { + NULL, // 0x00 + &AgiEngine::cmd_increment, + &AgiEngine::cmd_decrement, + &AgiEngine::cmd_assignn, + &AgiEngine::cmd_assignv, + &AgiEngine::cmd_addn, + &AgiEngine::cmd_addv, + &AgiEngine::cmd_subn, + &AgiEngine::cmd_subv, // 0x08 + &AgiEngine::cmd_lindirectv, + &AgiEngine::cmd_rindirect, + &AgiEngine::cmd_lindirectn, + &AgiEngine::cmd_set, + &AgiEngine::cmd_reset, + &AgiEngine::cmd_toggle, + &AgiEngine::cmd_set_v, + &AgiEngine::cmd_reset_v, // 0x10 + &AgiEngine::cmd_toggle_v, + &AgiEngine::cmd_new_room, + &AgiEngine::cmd_new_room_f, + &AgiEngine::cmd_load_logic, + &AgiEngine::cmd_load_logic_f, + &AgiEngine::cmd_call, + &AgiEngine::cmd_call_f, + &AgiEngine::cmd_load_pic, // 0x18 + &AgiEngine::cmd_draw_pic, + &AgiEngine::cmd_show_pic, + &AgiEngine::cmd_discard_pic, + &AgiEngine::cmd_overlay_pic, + &AgiEngine::cmd_show_pri_screen, + &AgiEngine::cmd_load_view, + &AgiEngine::cmd_load_view_f, + &AgiEngine::cmd_discard_view, // 0x20 + &AgiEngine::cmd_animate_obj, + &AgiEngine::cmd_unanimate_all, + &AgiEngine::cmd_draw, + &AgiEngine::cmd_erase, + &AgiEngine::cmd_position, + &AgiEngine::cmd_position_f, + &AgiEngine::cmd_get_posn, + &AgiEngine::cmd_reposition, // 0x28 + &AgiEngine::cmd_set_view, + &AgiEngine::cmd_set_view_f, + &AgiEngine::cmd_set_loop, + &AgiEngine::cmd_set_loop_f, + &AgiEngine::cmd_fix_loop, + &AgiEngine::cmd_release_loop, + &AgiEngine::cmd_set_cel, + &AgiEngine::cmd_set_cel_f, // 0x30 + &AgiEngine::cmd_last_cel, + &AgiEngine::cmd_current_cel, + &AgiEngine::cmd_current_loop, + &AgiEngine::cmd_current_view, + &AgiEngine::cmd_number_of_loops, + &AgiEngine::cmd_set_priority, + &AgiEngine::cmd_set_priority_f, + &AgiEngine::cmd_release_priority, // 0x38 + &AgiEngine::cmd_get_priority, + &AgiEngine::cmd_stop_update, + &AgiEngine::cmd_start_update, + &AgiEngine::cmd_force_update, + &AgiEngine::cmd_ignore_horizon, + &AgiEngine::cmd_observe_horizon, + &AgiEngine::cmd_set_horizon, + &AgiEngine::cmd_object_on_water, // 0x40 + &AgiEngine::cmd_object_on_land, + &AgiEngine::cmd_object_on_anything, + &AgiEngine::cmd_ignore_objs, + &AgiEngine::cmd_observe_objs, + &AgiEngine::cmd_distance, + &AgiEngine::cmd_stop_cycling, + &AgiEngine::cmd_start_cycling, + &AgiEngine::cmd_normal_cycle, // 0x48 + &AgiEngine::cmd_end_of_loop, + &AgiEngine::cmd_reverse_cycle, + &AgiEngine::cmd_reverse_loop, + &AgiEngine::cmd_cycle_time, + &AgiEngine::cmd_stop_motion, + &AgiEngine::cmd_start_motion, + &AgiEngine::cmd_step_size, + &AgiEngine::cmd_step_time, // 0x50 + &AgiEngine::cmd_move_obj, + &AgiEngine::cmd_move_obj_f, + &AgiEngine::cmd_follow_ego, + &AgiEngine::cmd_wander, + &AgiEngine::cmd_normal_motion, + &AgiEngine::cmd_set_dir, + &AgiEngine::cmd_get_dir, + &AgiEngine::cmd_ignore_blocks, // 0x58 + &AgiEngine::cmd_observe_blocks, + &AgiEngine::cmd_block, + &AgiEngine::cmd_unblock, + &AgiEngine::cmd_get, + &AgiEngine::cmd_get_f, + &AgiEngine::cmd_drop, + &AgiEngine::cmd_put, + &AgiEngine::cmd_put_f, // 0x60 + &AgiEngine::cmd_get_room_f, + &AgiEngine::cmd_load_sound, + &AgiEngine::cmd_sound, + &AgiEngine::cmd_stop_sound, + &AgiEngine::cmd_print, + &AgiEngine::cmd_print_f, + &AgiEngine::cmd_display, + &AgiEngine::cmd_display_f, // 0x68 + &AgiEngine::cmd_clear_lines, + &AgiEngine::cmd_text_screen, + &AgiEngine::cmd_graphics, + &AgiEngine::cmd_set_cursor_char, + &AgiEngine::cmd_set_text_attribute, + &AgiEngine::cmd_shake_screen, + &AgiEngine::cmd_configure_screen, + &AgiEngine::cmd_status_line_on, // 0x70 + &AgiEngine::cmd_status_line_off, + &AgiEngine::cmd_set_string, + &AgiEngine::cmd_get_string, + &AgiEngine::cmd_word_to_string, + &AgiEngine::cmd_parse, + &AgiEngine::cmd_get_num, + &AgiEngine::cmd_prevent_input, + &AgiEngine::cmd_accept_input, // 0x78 + &AgiEngine::cmd_set_key, + &AgiEngine::cmd_add_to_pic, + &AgiEngine::cmd_add_to_pic_f, + &AgiEngine::cmd_status, + &AgiEngine::cmd_save_game, + &AgiEngine::cmd_load_game, + &AgiEngine::cmd_init_disk, + &AgiEngine::cmd_restart_game, // 0x80 + &AgiEngine::cmd_show_obj, + &AgiEngine::cmd_random, + &AgiEngine::cmd_program_control, + &AgiEngine::cmd_player_control, + &AgiEngine::cmd_obj_status_f, + &AgiEngine::cmd_quit, + &AgiEngine::cmd_show_mem, + &AgiEngine::cmd_pause, // 0x88 + &AgiEngine::cmd_echo_line, + &AgiEngine::cmd_cancel_line, + &AgiEngine::cmd_init_joy, + &AgiEngine::cmd_toggle_monitor, + &AgiEngine::cmd_version, + &AgiEngine::cmd_script_size, + &AgiEngine::cmd_set_game_id, + &AgiEngine::cmd_log, // 0x90 + &AgiEngine::cmd_set_scan_start, + &AgiEngine::cmd_reset_scan_start, + &AgiEngine::cmd_reposition_to, + &AgiEngine::cmd_reposition_to_f, + &AgiEngine::cmd_trace_on, + &AgiEngine::cmd_trace_info, + &AgiEngine::cmd_print_at, + &AgiEngine::cmd_print_at_v, // 0x98 + &AgiEngine::cmd_discard_view, // Opcode repeated from 0x20 ? + &AgiEngine::cmd_clear_text_rect, + &AgiEngine::cmd_set_upper_left, + &AgiEngine::cmd_set_menu, + &AgiEngine::cmd_set_menu_item, + &AgiEngine::cmd_submit_menu, + &AgiEngine::cmd_enable_item, + &AgiEngine::cmd_disable_item, // 0xa0 + &AgiEngine::cmd_menu_input, + &AgiEngine::cmd_show_obj_v, + &AgiEngine::cmd_open_dialogue, + &AgiEngine::cmd_close_dialogue, + &AgiEngine::cmd_mul_n, + &AgiEngine::cmd_mul_v, + &AgiEngine::cmd_div_n, + &AgiEngine::cmd_div_v, // 0xa8 + &AgiEngine::cmd_close_window, + &AgiEngine::cmd_set_simple, + &AgiEngine::cmd_push_script, + &AgiEngine::cmd_pop_script, + &AgiEngine::cmd_hold_key, + &AgiEngine::cmd_set_pri_base, + &AgiEngine::cmd_discard_sound, + &AgiEngine::cmd_hide_mouse, // 0xb0 + &AgiEngine::cmd_allow_menu, + &AgiEngine::cmd_show_mouse, + &AgiEngine::cmd_fence_mouse, + &AgiEngine::cmd_mouse_posn, + &AgiEngine::cmd_release_key, + &AgiEngine::cmd_adj_ego_move_to_x_y + }; + assert(ARRAYSIZE(_agiCommands) == ARRAYSIZE(tmp)); + for (int i = 0; i < ARRAYSIZE(tmp); ++i) + _agiCommands[i] = tmp[i]; +} /** * Execute a logic script @@ -1850,7 +1856,7 @@ int AgiEngine::runLogic(int n) { debugC(2, kDebugLevelScripts, "%s%s(%d %d %d)", st, logicNamesCmd[op].name, p[0], p[1], p[2]); - agiCommand[op](this, p); + (this->*_agiCommands[op])(p); ip += num; } @@ -1866,7 +1872,7 @@ int AgiEngine::runLogic(int n) { void AgiEngine::executeAgiCommand(uint8 op, uint8 *p) { debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]); - agiCommand[op] (this, p); + (this->*_agiCommands[op])(p); } } // End of namespace Agi -- cgit v1.2.3 From e7da62763ecb26a35b2a4624226a8ee2bf79a853 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:33:22 +0000 Subject: AGI: Turn timerHack and curLogic into AgiEngine members; get rid of some #defines svn-id: r50125 --- engines/agi/agi.cpp | 2 + engines/agi/agi.h | 2 + engines/agi/op_cmd.cpp | 642 ++++++++++++++++++++++++------------------------ engines/agi/op_test.cpp | 14 +- 4 files changed, 325 insertions(+), 335 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 0f5d3ee2f0..333b674379 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -571,6 +571,8 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _game.controllerOccured[i] = false; setupOpcodes(); + _curLogic = NULL; + _timerHack = 0; } void AgiEngine::initialize() { diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 02d3526f16..a67775cec6 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -1047,6 +1047,8 @@ private: typedef void (AgiEngine::*AgiCommand)(uint8 *); AgiCommand _agiCommands[183]; + AgiLogic *_curLogic; + int _timerHack; // Workaround for timer loop in MH1 logic 153 void setupOpcodes(); diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index e18b35d35d..072ab0114f 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -35,8 +35,6 @@ namespace Agi { -#define g_agi this - #define p0 (p[0]) #define p1 (p[1]) #define p2 (p[2]) @@ -45,20 +43,10 @@ namespace Agi { #define p5 (p[5]) #define p6 (p[6]) -#define game _game -#define g_sprites _sprites -#define g_sound _sound -#define g_gfx _gfx -#define g_picture _picture - -#define ip curLogic->cIP +#define ip _curLogic->cIP #define vt _game.viewTable[p0] #define vt_v _game.viewTable[_game.vars[p0]] -static struct AgiLogic *curLogic; - -int timerHack; // Workaround for timer loop in MH1 - #define _v _game.vars void AgiEngine::cmd_increment(uint8 *p) { @@ -74,14 +62,14 @@ void AgiEngine::cmd_decrement(uint8 *p) { void AgiEngine::cmd_assignn(uint8 *p) { _v[p0] = p1; - // WORKAROUND for a bug in fan game "Get outta SQ" + // WORKAROUND for a bug in fan _game "Get outta SQ" // Total number of points is stored in variable 7, which - // is then incorrectly assigned to 0. Thus, when the game + // is then incorrectly assigned to 0. Thus, when the _game // is restarted, "Points 0 of 0" is shown. We set the // variable to the correct value here // Fixes bug #1942476 - "AGI: Fan(Get Outta SQ) - Score // is lost on restart" - if (g_agi->getGameID() == GID_GETOUTTASQ && p0 == 7) + if (getGameID() == GID_GETOUTTASQ && p0 == 7) _v[p0] = 8; } @@ -122,7 +110,7 @@ void AgiEngine::cmd_div_v(uint8 *p) { } void AgiEngine::cmd_random(uint8 *p) { - _v[p2] = g_agi->_rnd->getRandomNumber(p1 - p0) + p0; + _v[p2] = _rnd->getRandomNumber(p1 - p0) + p0; } void AgiEngine::cmd_lindirectn(uint8 *p) { @@ -138,71 +126,71 @@ void AgiEngine::cmd_rindirect(uint8 *p) { } void AgiEngine::cmd_set(uint8 *p) { - g_agi->setflag(*p, true); + setflag(*p, true); } void AgiEngine::cmd_reset(uint8 *p) { - g_agi->setflag(*p, false); + setflag(*p, false); } void AgiEngine::cmd_toggle(uint8 *p) { - g_agi->setflag(*p, !g_agi->getflag(*p)); + setflag(*p, !getflag(*p)); } void AgiEngine::cmd_set_v(uint8 *p) { - g_agi->setflag(_v[p0], true); + setflag(_v[p0], true); } void AgiEngine::cmd_reset_v(uint8 *p) { - g_agi->setflag(_v[p0], false); + setflag(_v[p0], false); } void AgiEngine::cmd_toggle_v(uint8 *p) { - g_agi->setflag(_v[p0], !g_agi->getflag(_v[p0])); + setflag(_v[p0], !getflag(_v[p0])); } void AgiEngine::cmd_new_room(uint8 *p) { - g_agi->newRoom(p0); + newRoom(p0); // WORKAROUND: Works around intro skipping bug (#1737343) in Gold Rush. // Intro was skipped because the enter-keypress finalizing the entering // of the copy protection string (Copy protection is in logic.128) was // left over to the intro scene (Starts with room 73 i.e. logic.073). // The intro scene checks for any keys pressed and if it finds any it - // jumps to the game's start (Room 1 i.e. logic.001). We clear the + // jumps to the _game's start (Room 1 i.e. logic.001). We clear the // keyboard buffer when the intro sequence's first room (Room 73) is // loaded so that no keys from the copy protection scene can be left - // over to cause the intro to skip to the game's start. - if (g_agi->getGameID() == GID_GOLDRUSH && p0 == 73) - game.keypress = 0; + // over to cause the intro to skip to the _game's start. + if (getGameID() == GID_GOLDRUSH && p0 == 73) + _game.keypress = 0; } void AgiEngine::cmd_new_room_f(uint8 *p) { - g_agi->newRoom(_v[p0]); + newRoom(_v[p0]); } void AgiEngine::cmd_load_view(uint8 *p) { - g_agi->agiLoadResource(rVIEW, p0); + agiLoadResource(rVIEW, p0); } void AgiEngine::cmd_load_logic(uint8 *p) { - g_agi->agiLoadResource(rLOGIC, p0); + agiLoadResource(rLOGIC, p0); } void AgiEngine::cmd_load_sound(uint8 *p) { - g_agi->agiLoadResource(rSOUND, p0); + agiLoadResource(rSOUND, p0); } void AgiEngine::cmd_load_view_f(uint8 *p) { - g_agi->agiLoadResource(rVIEW, _v[p0]); + agiLoadResource(rVIEW, _v[p0]); } void AgiEngine::cmd_load_logic_f(uint8 *p) { - g_agi->agiLoadResource(rLOGIC, _v[p0]); + agiLoadResource(rLOGIC, _v[p0]); } void AgiEngine::cmd_discard_view(uint8 *p) { - g_agi->agiUnloadResource(rVIEW, p0); + agiUnloadResource(rVIEW, p0); } void AgiEngine::cmd_object_on_anything(uint8 *p) { @@ -242,7 +230,7 @@ void AgiEngine::cmd_ignore_blocks(uint8 *p) { } void AgiEngine::cmd_set_horizon(uint8 *p) { - game.horizon = p0; + _game.horizon = p0; } void AgiEngine::cmd_get_priority(uint8 *p) { @@ -260,15 +248,15 @@ void AgiEngine::cmd_set_priority(uint8 *p) { // It seems that in this scene, ego's priority is set to 8, but the priority of // the last dwarf with the soup bowls (view 152) is also set to 8, which causes // the dwarf to be drawn behind ego - // With this workaround, when the game scripts set the priority of view 152 + // With this workaround, when the _game scripts set the priority of view 152 // (seventh dwarf with soup bowls), ego's priority is set to 7 - // The game script itself sets priotity 8 for ego before she starts walking, + // The _game script itself sets priotity 8 for ego before she starts walking, // and then releases the fixed priority set on ego after ego is seated // Therefore, this workaround only affects that specific part of this scene // Ego is set to object 19 by script 54 - if (g_agi->getGameID() == GID_KQ4 && vt.currentView == 152) { - game.viewTable[19].flags |= FIXED_PRIORITY; - game.viewTable[19].priority = 7; + if (getGameID() == GID_KQ4 && vt.currentView == 152) { + _game.viewTable[19].flags |= FIXED_PRIORITY; + _game.viewTable[19].priority = 7; } } @@ -285,11 +273,11 @@ void AgiEngine::cmd_set_upper_left(uint8 *p) { // do nothing (AGI 2.917) } void AgiEngine::cmd_start_update(uint8 *p) { - g_agi->startUpdate(&vt); + startUpdate(&vt); } void AgiEngine::cmd_stop_update(uint8 *p) { - g_agi->stopUpdate(&vt); + stopUpdate(&vt); } void AgiEngine::cmd_current_view(uint8 *p) { @@ -310,29 +298,29 @@ void AgiEngine::cmd_last_cel(uint8 *p) { } void AgiEngine::cmd_set_cel(uint8 *p) { - g_agi->setCel(&vt, p1); + setCel(&vt, p1); vt.flags &= ~DONTUPDATE; } void AgiEngine::cmd_set_cel_f(uint8 *p) { - g_agi->setCel(&vt, _v[p1]); + setCel(&vt, _v[p1]); vt.flags &= ~DONTUPDATE; } void AgiEngine::cmd_set_view(uint8 *p) { - g_agi->setView(&vt, p1); + setView(&vt, p1); } void AgiEngine::cmd_set_view_f(uint8 *p) { - g_agi->setView(&vt, _v[p1]); + setView(&vt, _v[p1]); } void AgiEngine::cmd_set_loop(uint8 *p) { - g_agi->setLoop(&vt, p1); + setLoop(&vt, p1); } void AgiEngine::cmd_set_loop_f(uint8 *p) { - g_agi->setLoop(&vt, _v[p1]); + setLoop(&vt, _v[p1]); } void AgiEngine::cmd_number_of_loops(uint8 *p) { @@ -386,102 +374,102 @@ void AgiEngine::cmd_get_dir(uint8 *p) { } void AgiEngine::cmd_get_room_f(uint8 *p) { - _v[p1] = g_agi->objectGetLocation(_v[p0]); + _v[p1] = objectGetLocation(_v[p0]); } void AgiEngine::cmd_put(uint8 *p) { - g_agi->objectSetLocation(p0, _v[p1]); + objectSetLocation(p0, _v[p1]); } void AgiEngine::cmd_put_f(uint8 *p) { - g_agi->objectSetLocation(_v[p0], _v[p1]); + objectSetLocation(_v[p0], _v[p1]); } void AgiEngine::cmd_drop(uint8 *p) { - g_agi->objectSetLocation(p0, 0); + objectSetLocation(p0, 0); } void AgiEngine::cmd_get(uint8 *p) { - g_agi->objectSetLocation(p0, EGO_OWNED); + objectSetLocation(p0, EGO_OWNED); } void AgiEngine::cmd_get_f(uint8 *p) { - g_agi->objectSetLocation(_v[p0], EGO_OWNED); + objectSetLocation(_v[p0], EGO_OWNED); } void AgiEngine::cmd_word_to_string(uint8 *p) { - strcpy(game.strings[p0], game.egoWords[p1].word); + strcpy(_game.strings[p0], _game.egoWords[p1].word); } void AgiEngine::cmd_open_dialogue(uint8 *p) { - game.hasWindow = true; + _game.hasWindow = true; } void AgiEngine::cmd_close_dialogue(uint8 *p) { - game.hasWindow = false; + _game.hasWindow = false; } void AgiEngine::cmd_close_window(uint8 *p) { - g_agi->closeWindow(); + closeWindow(); } void AgiEngine::cmd_status_line_on(uint8 *p) { - game.statusLine = true; - g_agi->writeStatus(); + _game.statusLine = true; + writeStatus(); } void AgiEngine::cmd_status_line_off(uint8 *p) { - game.statusLine = false; - g_agi->writeStatus(); + _game.statusLine = false; + writeStatus(); } void AgiEngine::cmd_show_obj(uint8 *p) { - g_sprites->showObj(p0); + _sprites->showObj(p0); } void AgiEngine::cmd_show_obj_v(uint8 *p) { - g_sprites->showObj(_v[p0]); + _sprites->showObj(_v[p0]); } void AgiEngine::cmd_sound(uint8 *p) { - g_sound->startSound(p0, p1); + _sound->startSound(p0, p1); } void AgiEngine::cmd_stop_sound(uint8 *p) { - g_sound->stopSound(); + _sound->stopSound(); } void AgiEngine::cmd_menu_input(uint8 *p) { - g_agi->newInputMode(INPUT_MENU); + newInputMode(INPUT_MENU); } void AgiEngine::cmd_enable_item(uint8 *p) { - g_agi->_menu->setItem(p0, true); + _menu->setItem(p0, true); } void AgiEngine::cmd_disable_item(uint8 *p) { - g_agi->_menu->setItem(p0, false); + _menu->setItem(p0, false); } void AgiEngine::cmd_submit_menu(uint8 *p) { - g_agi->_menu->submit(); + _menu->submit(); } void AgiEngine::cmd_set_scan_start(uint8 *p) { - curLogic->sIP = curLogic->cIP; + _curLogic->sIP = _curLogic->cIP; } void AgiEngine::cmd_reset_scan_start(uint8 *p) { - curLogic->sIP = 2; + _curLogic->sIP = 2; } void AgiEngine::cmd_save_game(uint8 *p) { - game.simpleSave ? g_agi->saveGameSimple() : g_agi->saveGameDialog(); + _game.simpleSave ? saveGameSimple() : saveGameDialog(); } void AgiEngine::cmd_load_game(uint8 *p) { assert(1); - game.simpleSave ? g_agi->loadGameSimple() : g_agi->loadGameDialog(); + _game.simpleSave ? loadGameSimple() : loadGameDialog(); } void AgiEngine::cmd_init_disk(uint8 *p) { // do nothing @@ -497,7 +485,7 @@ void AgiEngine::cmd_trace_info(uint8 *p) { // do nothing } void AgiEngine::cmd_show_mem(uint8 *p) { - g_agi->messageBox("Enough memory"); + messageBox("Enough memory"); } void AgiEngine::cmd_init_joy(uint8 *p) { // do nothing @@ -508,8 +496,8 @@ void AgiEngine::cmd_script_size(uint8 *p) { } void AgiEngine::cmd_cancel_line(uint8 *p) { - g_agi->_game.inputBuffer[0] = 0; - g_agi->writePrompt(); + _game.inputBuffer[0] = 0; + writePrompt(); } // This implementation is based on observations of Amiga's Gold Rush. @@ -583,7 +571,7 @@ void AgiEngine::cmd_obj_status_f(uint8 *p) { vt_v.stepSize, cycleDesc, motionDesc); - g_agi->messageBox(msg); + messageBox(msg); } // unknown commands: @@ -595,43 +583,43 @@ void AgiEngine::cmd_obj_status_f(uint8 *p) { // unk_177: Disable menus completely -- j5 // unk_181: Deactivate keypressed control (default control of ego) void AgiEngine::cmd_set_simple(uint8 *p) { - if (!(g_agi->getFeatures() & (GF_AGI256 | GF_AGI256_2))) { - game.simpleSave = true; + if (!(getFeatures() & (GF_AGI256 | GF_AGI256_2))) { + _game.simpleSave = true; } else { // AGI256 and AGI256-2 use this unknown170 command to load 256 color pictures. // Load the picture. Similar to void AgiEngine::cmd_load_pic(uint8 *p). - g_sprites->eraseBoth(); - g_agi->agiLoadResource(rPICTURE, _v[p0]); + _sprites->eraseBoth(); + agiLoadResource(rPICTURE, _v[p0]); // Draw the picture. Similar to void AgiEngine::cmd_draw_pic(uint8 *p). - g_picture->decodePicture(_v[p0], false, true); - g_sprites->blitBoth(); - game.pictureShown = 0; + _picture->decodePicture(_v[p0], false, true); + _sprites->blitBoth(); + _game.pictureShown = 0; // Show the picture. Similar to void AgiEngine::cmd_show_pic(uint8 *p). - g_agi->setflag(fOutputMode, false); - g_agi->closeWindow(); - g_picture->showPic(); - game.pictureShown = 1; + setflag(fOutputMode, false); + closeWindow(); + _picture->showPic(); + _game.pictureShown = 1; // Simulate slowww computer. Many effects rely on this - g_agi->pause(kPausePicture); + pause(kPausePicture); } } void AgiEngine::cmd_pop_script(uint8 *p) { - if (g_agi->getVersion() >= 0x2915) { + if (getVersion() >= 0x2915) { report("pop.script\n"); } } void AgiEngine::cmd_hold_key(uint8 *p) { - if (g_agi->getVersion() >= 0x3098) { - g_agi->_egoHoldKey = true; + if (getVersion() >= 0x3098) { + _egoHoldKey = true; } } void AgiEngine::cmd_discard_sound(uint8 *p) { - if (g_agi->getVersion() >= 0x2936) { + if (getVersion() >= 0x2936) { report("discard.sound\n"); } } @@ -644,14 +632,14 @@ void AgiEngine::cmd_hide_mouse(uint8 *p) { // to walk somewhere else than to the right using the mouse. // FIXME: Write a proper implementation using disassembly and // apply it to other games as well if applicable. - game.viewTable[0].flags &= ~ADJ_EGO_XY; + _game.viewTable[0].flags &= ~ADJ_EGO_XY; g_system->showMouse(false); } void AgiEngine::cmd_allow_menu(uint8 *p) { - if (g_agi->getVersion() >= 0x3098) { - g_agi->setflag(fMenusWork, ((p0 != 0) ? true : false)); + if (getVersion() >= 0x3098) { + setflag(fMenusWork, ((p0 != 0) ? true : false)); } } @@ -660,14 +648,14 @@ void AgiEngine::cmd_show_mouse(uint8 *p) { } void AgiEngine::cmd_fence_mouse(uint8 *p) { - g_agi->_game.mouseFence.moveTo(p0, p1); - g_agi->_game.mouseFence.setWidth(p2 - p0); - g_agi->_game.mouseFence.setHeight(p3 - p1); + _game.mouseFence.moveTo(p0, p1); + _game.mouseFence.setWidth(p2 - p0); + _game.mouseFence.setHeight(p3 - p1); } void AgiEngine::cmd_release_key(uint8 *p) { - if (g_agi->getVersion() >= 0x3098) { - g_agi->_egoHoldKey = false; + if (getVersion() >= 0x3098) { + _egoHoldKey = false; } } @@ -693,28 +681,28 @@ void AgiEngine::cmd_adj_ego_move_to_x_y(uint8 *p) { // onto the ladder so this is more like it (Although that may be caused // by something else because this command doesn't do any flag manipulations // in the Amiga version - checked it with disassembly). - if (x != game.adjMouseX || y != game.adjMouseY) - game.viewTable[EGO_VIEW_TABLE].flags &= ~ADJ_EGO_XY; + if (x != _game.adjMouseX || y != _game.adjMouseY) + _game.viewTable[EGO_VIEW_TABLE].flags &= ~ADJ_EGO_XY; - game.adjMouseX = x; - game.adjMouseY = y; + _game.adjMouseX = x; + _game.adjMouseY = y; debugC(4, kDebugLevelScripts, "adj.ego.move.to.x.y(%d, %d)", x, y); break; // TODO: Check where (if anywhere) the 0 arguments version is used case 0: default: - game.viewTable[0].flags |= ADJ_EGO_XY; + _game.viewTable[0].flags |= ADJ_EGO_XY; break; } } void AgiEngine::cmd_parse(uint8 *p) { _v[vWordNotFound] = 0; - g_agi->setflag(fEnteredCli, false); - g_agi->setflag(fSaidAcceptedInput, false); + setflag(fEnteredCli, false); + setflag(fSaidAcceptedInput, false); - g_agi->dictionaryWords(g_agi->agiSprintf(game.strings[p0])); + dictionaryWords(agiSprintf(_game.strings[p0])); } void AgiEngine::cmd_call(uint8 *p) { @@ -723,14 +711,14 @@ void AgiEngine::cmd_call(uint8 *p) { // CM: we don't save sIP because set.scan.start can be // used in a called script (fixes xmas demo) - oldCIP = curLogic->cIP; - oldLognum = game.lognum; + oldCIP = _curLogic->cIP; + oldLognum = _game.lognum; - g_agi->runLogic(p0); + runLogic(p0); - game.lognum = oldLognum; - curLogic = &game.logics[game.lognum]; - curLogic->cIP = oldCIP; + _game.lognum = oldLognum; + _curLogic = &_game.logics[_game.lognum]; + _curLogic->cIP = oldCIP; } void AgiEngine::cmd_call_f(uint8 *p) { @@ -739,11 +727,11 @@ void AgiEngine::cmd_call_f(uint8 *p) { void AgiEngine::cmd_draw_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "=== draw pic %d ===", _v[p0]); - g_sprites->eraseBoth(); - g_picture->decodePicture(_v[p0], true); - g_sprites->blitBoth(); - g_sprites->commitBoth(); - game.pictureShown = 0; + _sprites->eraseBoth(); + _picture->decodePicture(_v[p0], true); + _sprites->blitBoth(); + _sprites->commitBoth(); + _game.pictureShown = 0; debugC(6, kDebugLevelScripts, "--- end of draw pic %d ---", _v[p0]); // WORKAROUND for a script bug which exists in SQ1, logic scripts @@ -758,29 +746,29 @@ void AgiEngine::cmd_draw_pic(uint8 *p) { // above the ground), flag 103 is reset, thereby fixing this issue. Note // that this is a script bug and occurs in the original interpreter as well. // Fixes bug #1658514: AGI: SQ1 (2.2 DOS ENG) bizzare exploding roger - if (g_agi->getGameID() == GID_SQ1 && _v[p0] == 20) - g_agi->setflag(103, false); + if (getGameID() == GID_SQ1 && _v[p0] == 20) + setflag(103, false); // Simulate slowww computer. Many effects rely on this - g_agi->pause(kPausePicture); + pause(kPausePicture); } void AgiEngine::cmd_show_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "=== show pic ==="); - g_agi->setflag(fOutputMode, false); - g_agi->closeWindow(); - g_picture->showPic(); - game.pictureShown = 1; + setflag(fOutputMode, false); + closeWindow(); + _picture->showPic(); + _game.pictureShown = 1; debugC(6, kDebugLevelScripts, "--- end of show pic ---"); } void AgiEngine::cmd_load_pic(uint8 *p) { - g_sprites->eraseBoth(); - g_agi->agiLoadResource(rPICTURE, _v[p0]); - g_sprites->blitBoth(); - g_sprites->commitBoth(); + _sprites->eraseBoth(); + agiLoadResource(rPICTURE, _v[p0]); + _sprites->blitBoth(); + _sprites->commitBoth(); } void AgiEngine::cmd_discard_pic(uint8 *p) { @@ -791,28 +779,28 @@ void AgiEngine::cmd_discard_pic(uint8 *p) { void AgiEngine::cmd_overlay_pic(uint8 *p) { debugC(6, kDebugLevelScripts, "--- overlay pic ---"); - g_sprites->eraseBoth(); - g_picture->decodePicture(_v[p0], false); - g_sprites->blitBoth(); - game.pictureShown = 0; - g_sprites->commitBoth(); + _sprites->eraseBoth(); + _picture->decodePicture(_v[p0], false); + _sprites->blitBoth(); + _game.pictureShown = 0; + _sprites->commitBoth(); // Simulate slowww computer. Many effects rely on this - g_agi->pause(kPausePicture); + pause(kPausePicture); } void AgiEngine::cmd_show_pri_screen(uint8 *p) { - g_agi->_debug.priority = 1; - g_sprites->eraseBoth(); - g_picture->showPic(); - g_sprites->blitBoth(); + _debug.priority = 1; + _sprites->eraseBoth(); + _picture->showPic(); + _sprites->blitBoth(); - g_agi->waitKey(); + waitKey(); - g_agi->_debug.priority = 0; - g_sprites->eraseBoth(); - g_picture->showPic(); - g_sprites->blitBoth(); + _debug.priority = 0; + _sprites->eraseBoth(); + _picture->showPic(); + _sprites->blitBoth(); } void AgiEngine::cmd_animate_obj(uint8 *p) { @@ -830,7 +818,7 @@ void AgiEngine::cmd_unanimate_all(uint8 *p) { int i; for (i = 0; i < MAX_VIEWTABLE; i++) - game.viewTable[i].flags &= ~(ANIMATED | DRAWN); + _game.viewTable[i].flags &= ~(ANIMATED | DRAWN); } void AgiEngine::cmd_draw(uint8 *p) { @@ -843,19 +831,19 @@ void AgiEngine::cmd_draw(uint8 *p) { debugC(4, kDebugLevelScripts, "draw entry %d", vt.entry); vt.flags |= UPDATE; - if (g_agi->getVersion() >= 0x3000) { - g_agi->setLoop(&vt, vt.currentLoop); - g_agi->setCel(&vt, vt.currentCel); + if (getVersion() >= 0x3000) { + setLoop(&vt, vt.currentLoop); + setCel(&vt, vt.currentCel); } - g_agi->fixPosition(p0); + fixPosition(p0); vt.xPos2 = vt.xPos; vt.yPos2 = vt.yPos; vt.celData2 = vt.celData; - g_sprites->eraseUpdSprites(); + _sprites->eraseUpdSprites(); vt.flags |= DRAWN; - // WORKAROUND: This fixes a bug with AGI Fanmade game Space Trek. + // WORKAROUND: This fixes a bug with AGI Fanmade _game Space Trek. // The original workaround checked if AGI version was <= 2.440, which could // cause regressions with some AGI games. The original workaround no longer // works for Space Trek in ScummVM, as all fanmade games are set to use @@ -866,13 +854,13 @@ void AgiEngine::cmd_draw(uint8 *p) { // TODO: Investigate this further and check if any other fanmade AGI // games are affected. If yes, then it'd be best to set this for Space // Trek only - if (g_agi->getFeatures() & GF_FANMADE) // See Sarien bug #546562 + if (getFeatures() & GF_FANMADE) // See Sarien bug #546562 vt.flags |= ANIMATED; - g_sprites->blitUpdSprites(); + _sprites->blitUpdSprites(); vt.flags &= ~DONTUPDATE; - g_sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos, true); + _sprites->commitBlock(vt.xPos, vt.yPos - vt.ySize + 1, vt.xPos + vt.xSize - 1, vt.yPos, true); debugC(4, kDebugLevelScripts, "vt entry #%d flags = %02x", p0, vt.flags); } @@ -881,16 +869,16 @@ void AgiEngine::cmd_erase(uint8 *p) { if (~vt.flags & DRAWN) return; - g_sprites->eraseUpdSprites(); + _sprites->eraseUpdSprites(); if (vt.flags & UPDATE) { vt.flags &= ~DRAWN; } else { - g_sprites->eraseNonupdSprites(); + _sprites->eraseNonupdSprites(); vt.flags &= ~DRAWN; - g_sprites->blitNonupdSprites(); + _sprites->blitNonupdSprites(); } - g_sprites->blitUpdSprites(); + _sprites->blitUpdSprites(); int x1, y1, x2, y2; @@ -899,7 +887,7 @@ void AgiEngine::cmd_erase(uint8 *p) { y1 = MIN((int)MIN(vt.yPos, vt.yPos2), MIN(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); y2 = MAX((int)MAX(vt.yPos, vt.yPos2), MAX(vt.yPos - vt.celData->height, vt.yPos2 - vt.celData2->height)); - g_sprites->commitBlock(x1, y1, x2, y2, true); + _sprites->commitBlock(x1, y1, x2, y2, true); } void AgiEngine::cmd_position(uint8 *p) { @@ -919,8 +907,8 @@ void AgiEngine::cmd_position(uint8 *p) { // I haven't checked but if Space Trek solely abuses the position-command we wouldn't // strictly need the identical workaround in the position.v-command but it does make // for a nice symmetry. - if (g_agi->getFeatures() & GF_CLIPCOORDS) - g_agi->clipViewCoordinates(&vt); + if (getFeatures() & GF_CLIPCOORDS) + clipViewCoordinates(&vt); } void AgiEngine::cmd_position_f(uint8 *p) { @@ -930,13 +918,13 @@ void AgiEngine::cmd_position_f(uint8 *p) { // WORKAROUND: Part of the fix for bug #1659209 "AGI: Space Trek sprite duplication" // with an accompanying identical workaround in position-command (i.e. command 0x25). // See that workaround's comment for more in-depth information. - if (g_agi->getFeatures() & GF_CLIPCOORDS) - g_agi->clipViewCoordinates(&vt); + if (getFeatures() & GF_CLIPCOORDS) + clipViewCoordinates(&vt); } void AgiEngine::cmd_get_posn(uint8 *p) { - game.vars[p1] = (unsigned char)vt.xPos; - game.vars[p2] = (unsigned char)vt.yPos; + _game.vars[p1] = (unsigned char)vt.xPos; + _game.vars[p2] = (unsigned char)vt.yPos; } void AgiEngine::cmd_reposition(uint8 *p) { @@ -955,35 +943,35 @@ void AgiEngine::cmd_reposition(uint8 *p) { else vt.yPos += dy; - g_agi->fixPosition(p0); + fixPosition(p0); } void AgiEngine::cmd_reposition_to(uint8 *p) { vt.xPos = p1; vt.yPos = p2; vt.flags |= UPDATE_POS; - g_agi->fixPosition(p0); + fixPosition(p0); } void AgiEngine::cmd_reposition_to_f(uint8 *p) { vt.xPos = _v[p1]; vt.yPos = _v[p2]; vt.flags |= UPDATE_POS; - g_agi->fixPosition(p0); + fixPosition(p0); } void AgiEngine::cmd_add_to_pic(uint8 *p) { - g_sprites->addToPic(p0, p1, p2, p3, p4, p5, p6); + _sprites->addToPic(p0, p1, p2, p3, p4, p5, p6); } void AgiEngine::cmd_add_to_pic_f(uint8 *p) { - g_sprites->addToPic(_v[p0], _v[p1], _v[p2], _v[p3], _v[p4], _v[p5], _v[p6]); + _sprites->addToPic(_v[p0], _v[p1], _v[p2], _v[p3], _v[p4], _v[p5], _v[p6]); } void AgiEngine::cmd_force_update(uint8 *p) { - g_sprites->eraseBoth(); - g_sprites->blitBoth(); - g_sprites->commitBoth(); + _sprites->eraseBoth(); + _sprites->blitBoth(); + _sprites->commitBoth(); } void AgiEngine::cmd_reverse_loop(uint8 *p) { @@ -991,7 +979,7 @@ void AgiEngine::cmd_reverse_loop(uint8 *p) { vt.cycle = CYCLE_REV_LOOP; vt.flags |= (DONTUPDATE | UPDATE | CYCLING); vt.parm1 = p1; - g_agi->setflag(p1, false); + setflag(p1, false); } void AgiEngine::cmd_end_of_loop(uint8 *p) { @@ -999,20 +987,20 @@ void AgiEngine::cmd_end_of_loop(uint8 *p) { vt.cycle = CYCLE_END_OF_LOOP; vt.flags |= (DONTUPDATE | UPDATE | CYCLING); vt.parm1 = p1; - g_agi->setflag(p1, false); + setflag(p1, false); } void AgiEngine::cmd_block(uint8 *p) { debugC(4, kDebugLevelScripts, "x1=%d, y1=%d, x2=%d, y2=%d", p0, p1, p2, p3); - game.block.active = true; - game.block.x1 = p0; - game.block.y1 = p1; - game.block.x2 = p2; - game.block.y2 = p3; + _game.block.active = true; + _game.block.x1 = p0; + _game.block.y1 = p1; + _game.block.x2 = p2; + _game.block.y2 = p3; } void AgiEngine::cmd_unblock(uint8 *p) { - game.block.active = false; + _game.block.active = false; } void AgiEngine::cmd_normal_motion(uint8 *p) { @@ -1024,7 +1012,7 @@ void AgiEngine::cmd_stop_motion(uint8 *p) { vt.motion = MOTION_NORMAL; if (p0 == 0) { // ego only _v[vEgoDir] = 0; - game.playerControl = false; + _game.playerControl = false; } } @@ -1032,17 +1020,17 @@ void AgiEngine::cmd_start_motion(uint8 *p) { vt.motion = MOTION_NORMAL; if (p0 == 0) { // ego only _v[vEgoDir] = 0; - game.playerControl = true; + _game.playerControl = true; } } void AgiEngine::cmd_player_control(uint8 *p) { - game.playerControl = true; - game.viewTable[0].motion = MOTION_NORMAL; + _game.playerControl = true; + _game.viewTable[0].motion = MOTION_NORMAL; } void AgiEngine::cmd_program_control(uint8 *p) { - game.playerControl = false; + _game.playerControl = false; } void AgiEngine::cmd_follow_ego(uint8 *p) { @@ -1050,7 +1038,7 @@ void AgiEngine::cmd_follow_ego(uint8 *p) { vt.parm1 = p1 > vt.stepSize ? p1 : vt.stepSize; vt.parm2 = p2; vt.parm3 = 0xff; - g_agi->setflag(p2, false); + setflag(p2, false); vt.flags |= UPDATE; } @@ -1066,15 +1054,15 @@ void AgiEngine::cmd_move_obj(uint8 *p) { if (p3 != 0) vt.stepSize = p3; - g_agi->setflag(p4, false); + setflag(p4, false); vt.flags |= UPDATE; if (p0 == 0) - game.playerControl = false; + _game.playerControl = false; // AGI 2.272 (ddp, xmas) doesn't call move_obj! - if (g_agi->getVersion() > 0x2272) - g_agi->moveObj(&vt); + if (getVersion() > 0x2272) + moveObj(&vt); } void AgiEngine::cmd_move_obj_f(uint8 *p) { @@ -1087,64 +1075,64 @@ void AgiEngine::cmd_move_obj_f(uint8 *p) { if (_v[p3] != 0) vt.stepSize = _v[p3]; - g_agi->setflag(p4, false); + setflag(p4, false); vt.flags |= UPDATE; if (p0 == 0) - game.playerControl = false; + _game.playerControl = false; // AGI 2.272 (ddp, xmas) doesn't call move_obj! - if (g_agi->getVersion() > 0x2272) - g_agi->moveObj(&vt); + if (getVersion() > 0x2272) + moveObj(&vt); } void AgiEngine::cmd_wander(uint8 *p) { if (p0 == 0) - game.playerControl = false; + _game.playerControl = false; vt.motion = MOTION_WANDER; vt.flags |= UPDATE; } void AgiEngine::cmd_set_game_id(uint8 *p) { - if (curLogic->texts && (p0 - 1) <= curLogic->numTexts) - strncpy(game.id, curLogic->texts[p0 - 1], 8); + if (_curLogic->texts && (p0 - 1) <= _curLogic->numTexts) + strncpy(_game.id, _curLogic->texts[p0 - 1], 8); else - game.id[0] = 0; + _game.id[0] = 0; - report("Game ID: \"%s\"\n", game.id); + report("Game ID: \"%s\"\n", _game.id); } void AgiEngine::cmd_pause(uint8 *p) { - int tmp = game.clockEnabled; + int tmp = _game.clockEnabled; const char *b[] = { "Continue", NULL }; const char *b_ru[] = { "\x8f\xe0\xae\xa4\xae\xab\xa6\xa8\xe2\xec", NULL }; - game.clockEnabled = false; + _game.clockEnabled = false; - switch (g_agi->getLanguage()) { + switch (getLanguage()) { case Common::RU_RUS: - g_agi->selectionBox(" \x88\xa3\xe0\xa0 \xae\xe1\xe2\xa0\xad\xae\xa2\xab\xa5\xad\xa0. \n\n\n", b_ru); + selectionBox(" \x88\xa3\xe0\xa0 \xae\xe1\xe2\xa0\xad\xae\xa2\xab\xa5\xad\xa0. \n\n\n", b_ru); break; default: - g_agi->selectionBox(" Game is paused. \n\n\n", b); + selectionBox(" Game is paused. \n\n\n", b); break; } - game.clockEnabled = tmp; + _game.clockEnabled = tmp; } void AgiEngine::cmd_set_menu(uint8 *p) { - debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, curLogic->numTexts); + debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, _curLogic->numTexts); - if (curLogic->texts != NULL && p0 <= curLogic->numTexts) - g_agi->_menu->add(curLogic->texts[p0 - 1]); + if (_curLogic->texts != NULL && p0 <= _curLogic->numTexts) + _menu->add(_curLogic->texts[p0 - 1]); } void AgiEngine::cmd_set_menu_item(uint8 *p) { - debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, curLogic->numTexts); + debugC(4, kDebugLevelScripts, "text %02x of %02x", p0, _curLogic->numTexts); - if (curLogic->texts != NULL && p0 <= curLogic->numTexts) - g_agi->_menu->addItem(curLogic->texts[p0 - 1], p1); + if (_curLogic->texts != NULL && p0 <= _curLogic->numTexts) + _menu->addItem(_curLogic->texts[p0 - 1], p1); } void AgiEngine::cmd_version(uint8 *p) { @@ -1166,7 +1154,7 @@ void AgiEngine::cmd_version(uint8 *p) { sprintf(verMsg, TITLE " v%s", gScummVMVersion); - ver = g_agi->getVersion(); + ver = getVersion(); maj = (ver >> 12) & 0xf; min = ver & 0xfff; @@ -1184,65 +1172,65 @@ void AgiEngine::cmd_version(uint8 *p) { strncpy(q + 1 + gap, verMsg, strlen(verMsg)); sprintf(msg, q, maj, min); - g_agi->messageBox(msg); + messageBox(msg); } void AgiEngine::cmd_configure_screen(uint8 *p) { - game.lineMinPrint = p0; - game.lineUserInput = p1; - game.lineStatus = p2; + _game.lineMinPrint = p0; + _game.lineUserInput = p1; + _game.lineStatus = p2; } void AgiEngine::cmd_text_screen(uint8 *p) { debugC(4, kDebugLevelScripts, "switching to text mode"); - game.gfxMode = false; + _game.gfxMode = false; // Simulates the "bright background bit" of the PC video // controller. - if (game.colorBg) - game.colorBg |= 0x08; + if (_game.colorBg) + _game.colorBg |= 0x08; - g_gfx->clearScreen(game.colorBg); + _gfx->clearScreen(_game.colorBg); } void AgiEngine::cmd_graphics(uint8 *p) { debugC(4, kDebugLevelScripts, "switching to graphics mode"); - if (!game.gfxMode) { - game.gfxMode = true; - g_gfx->clearScreen(0); - g_picture->showPic(); - g_agi->writeStatus(); - g_agi->writePrompt(); + if (!_game.gfxMode) { + _game.gfxMode = true; + _gfx->clearScreen(0); + _picture->showPic(); + writeStatus(); + writePrompt(); } } void AgiEngine::cmd_set_text_attribute(uint8 *p) { - game.colorFg = p0; - game.colorBg = p1; + _game.colorFg = p0; + _game.colorBg = p1; - if (game.gfxMode) { - if (game.colorBg != 0) { - game.colorFg = 0; - game.colorBg = 15; + if (_game.gfxMode) { + if (_game.colorBg != 0) { + _game.colorFg = 0; + _game.colorBg = 15; } } } void AgiEngine::cmd_status(uint8 *p) { - g_agi->inventory(); + inventory(); } void AgiEngine::cmd_quit(uint8 *p) { const char *buttons[] = { "Quit", "Continue", NULL }; - g_sound->stopSound(); + _sound->stopSound(); if (p0) { - g_agi->quitGame(); + quitGame(); } else { - if (g_agi->selectionBox - (" Quit the game, or continue? \n\n\n", buttons) == 0) { - g_agi->quitGame(); + if (selectionBox + (" Quit the _game, or continue? \n\n\n", buttons) == 0) { + quitGame(); } } } @@ -1251,21 +1239,21 @@ void AgiEngine::cmd_restart_game(uint8 *p) { const char *buttons[] = { "Restart", "Continue", NULL }; int sel; - g_sound->stopSound(); - sel = g_agi->getflag(fAutoRestart) ? 0 : - g_agi->selectionBox(" Restart game, or continue? \n\n\n", buttons); + _sound->stopSound(); + sel = getflag(fAutoRestart) ? 0 : + selectionBox(" Restart _game, or continue? \n\n\n", buttons); if (sel == 0) { - g_agi->_restartGame = true; - g_agi->setflag(fRestartGame, true); - g_agi->_menu->enableAll(); + _restartGame = true; + setflag(fRestartGame, true); + _menu->enableAll(); } } void AgiEngine::cmd_distance(uint8 *p) { int16 x1, y1, x2, y2, d; - VtEntry *v0 = &game.viewTable[p0]; - VtEntry *v1 = &game.viewTable[p1]; + VtEntry *v0 = &_game.viewTable[p0]; + VtEntry *v1 = &_game.viewTable[p1]; if (v0->flags & DRAWN && v1->flags & DRAWN) { x1 = v0->xPos + v0->xSize / 2; @@ -1288,7 +1276,7 @@ void AgiEngine::cmd_distance(uint8 *p) { // wouldn't chase Rosella around anymore. If it had worked correctly the zombie // wouldn't have come up at all or it would have come up and gone back down // immediately. The latter approach is the one implemented here. - if (g_agi->getGameID() == GID_KQ4 && (_v[vCurRoom] == 16 || _v[vCurRoom] == 18) && p2 >= 221 && p2 <= 223) { + if (getGameID() == GID_KQ4 && (_v[vCurRoom] == 16 || _v[vCurRoom] == 18) && p2 >= 221 && p2 <= 223) { // Rooms 16 and 18 are graveyards where three zombies come up at night. They use logics 16 and 18. // Variables 221-223 are used to save the distance between each zombie and Rosella. // Variables 155, 156 and 162 are used to save the state of each zombie in room 16. @@ -1316,18 +1304,18 @@ void AgiEngine::cmd_distance(uint8 *p) { void AgiEngine::cmd_accept_input(uint8 *p) { debugC(4, kDebugLevelScripts | kDebugLevelInput, "input normal"); - g_agi->newInputMode(INPUT_NORMAL); - game.inputEnabled = true; - g_agi->writePrompt(); + newInputMode(INPUT_NORMAL); + _game.inputEnabled = true; + writePrompt(); } void AgiEngine::cmd_prevent_input(uint8 *p) { debugC(4, kDebugLevelScripts | kDebugLevelInput, "no input"); - g_agi->newInputMode(INPUT_NONE); - game.inputEnabled = false; + newInputMode(INPUT_NONE); + _game.inputEnabled = false; - g_agi->clearPrompt(); + clearPrompt(); } void AgiEngine::cmd_get_string(uint8 *p) { @@ -1346,63 +1334,63 @@ void AgiEngine::cmd_get_string(uint8 *p) { if (col > 39) col = 39; - g_agi->newInputMode(INPUT_GETSTRING); + newInputMode(INPUT_GETSTRING); - if (curLogic->texts != NULL && curLogic->numTexts >= tex) { - int len = strlen(curLogic->texts[tex]); + if (_curLogic->texts != NULL && _curLogic->numTexts >= tex) { + int len = strlen(_curLogic->texts[tex]); - g_agi->printText(curLogic->texts[tex], 0, col, row, len, game.colorFg, game.colorBg); - g_agi->getString(col + len - 1, row, p4, p0); + printText(_curLogic->texts[tex], 0, col, row, len, _game.colorFg, _game.colorBg); + getString(col + len - 1, row, p4, p0); // SGEO: display input char - g_gfx->printCharacter((col + len), row, game.cursorChar, game.colorFg, game.colorBg); + _gfx->printCharacter((col + len), row, _game.cursorChar, _game.colorFg, _game.colorBg); } do { - g_agi->mainCycle(); - } while (game.inputMode == INPUT_GETSTRING && !(g_agi->shouldQuit() || g_agi->_restartGame)); + mainCycle(); + } while (_game.inputMode == INPUT_GETSTRING && !(shouldQuit() || _restartGame)); } void AgiEngine::cmd_get_num(uint8 *p) { debugC(4, kDebugLevelScripts, "%d %d", p0, p1); - g_agi->newInputMode(INPUT_GETSTRING); + newInputMode(INPUT_GETSTRING); - if (curLogic->texts != NULL && curLogic->numTexts >= (p0 - 1)) { - int len = strlen(curLogic->texts[p0 - 1]); + if (_curLogic->texts != NULL && _curLogic->numTexts >= (p0 - 1)) { + int len = strlen(_curLogic->texts[p0 - 1]); - g_agi->printText(curLogic->texts[p0 - 1], 0, 0, 22, len, game.colorFg, game.colorBg); - g_agi->getString(len - 1, 22, 3, MAX_STRINGS); + printText(_curLogic->texts[p0 - 1], 0, 0, 22, len, _game.colorFg, _game.colorBg); + getString(len - 1, 22, 3, MAX_STRINGS); // CM: display input char - g_gfx->printCharacter((p3 + len), 22, game.cursorChar, game.colorFg, game.colorBg); + _gfx->printCharacter((p3 + len), 22, _game.cursorChar, _game.colorFg, _game.colorBg); } do { - g_agi->mainCycle(); - } while (game.inputMode == INPUT_GETSTRING && !(g_agi->shouldQuit() || g_agi->_restartGame)); + mainCycle(); + } while (_game.inputMode == INPUT_GETSTRING && !(shouldQuit() || _restartGame)); - _v[p1] = atoi(game.strings[MAX_STRINGS]); + _v[p1] = atoi(_game.strings[MAX_STRINGS]); - debugC(4, kDebugLevelScripts, "[%s] -> %d", game.strings[MAX_STRINGS], _v[p1]); + debugC(4, kDebugLevelScripts, "[%s] -> %d", _game.strings[MAX_STRINGS], _v[p1]); - g_agi->clearLines(22, 22, game.colorBg); - g_agi->flushLines(22, 22); + clearLines(22, 22, _game.colorBg); + flushLines(22, 22); } void AgiEngine::cmd_set_cursor_char(uint8 *p) { - if (curLogic->texts != NULL && (p0 - 1) <= curLogic->numTexts) { - game.cursorChar = *curLogic->texts[p0 - 1]; + if (_curLogic->texts != NULL && (p0 - 1) <= _curLogic->numTexts) { + _game.cursorChar = *_curLogic->texts[p0 - 1]; } else { // default - game.cursorChar = '_'; + _game.cursorChar = '_'; } } void AgiEngine::cmd_set_key(uint8 *p) { int key; - if (game.lastController >= MAX_CONTROLLERS) { + if (_game.lastController >= MAX_CONTROLLERS) { warning("Number of set.keys exceeded %d", MAX_CONTROLLERS); return; } @@ -1411,32 +1399,32 @@ void AgiEngine::cmd_set_key(uint8 *p) { key = 256 * p1 + p0; - game.controllers[game.lastController].keycode = key; - game.controllers[game.lastController].controller = p2; - game.lastController++; + _game.controllers[_game.lastController].keycode = key; + _game.controllers[_game.lastController].controller = p2; + _game.lastController++; - game.controllerOccured[p2] = false; + _game.controllerOccured[p2] = false; } void AgiEngine::cmd_set_string(uint8 *p) { // CM: to avoid crash in Groza (str = 150) if (p0 > MAX_STRINGS) return; - strcpy(game.strings[p0], curLogic->texts[p1 - 1]); + strcpy(_game.strings[p0], _curLogic->texts[p1 - 1]); } void AgiEngine::cmd_display(uint8 *p) { int len = 40; - char *s = g_agi->wordWrapString(curLogic->texts[p2 - 1], &len); + char *s = wordWrapString(_curLogic->texts[p2 - 1], &len); - g_agi->printText(s, p1, 0, p0, 40, game.colorFg, game.colorBg); + printText(s, p1, 0, p0, 40, _game.colorFg, _game.colorBg); free(s); } void AgiEngine::cmd_display_f(uint8 *p) { - g_agi->printText(curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, game.colorFg, game.colorBg); + printText(_curLogic->texts[_v[p2] - 1], _v[p1], 0, _v[p0], 40, _game.colorFg, _game.colorBg); } void AgiEngine::cmd_clear_text_rect(uint8 *p) { @@ -1460,8 +1448,8 @@ void AgiEngine::cmd_clear_text_rect(uint8 *p) { if (y2 > GFX_HEIGHT) y2 = GFX_HEIGHT - 1; - g_gfx->drawRectangle(x1, y1, x2, y2, c); - g_gfx->flushBlock(x1, y1, x2, y2); + _gfx->drawRectangle(x1, y1, x2, y2, c); + _gfx->flushBlock(x1, y1, x2, y2); } void AgiEngine::cmd_toggle_monitor(uint8 *p) { @@ -1469,9 +1457,9 @@ void AgiEngine::cmd_toggle_monitor(uint8 *p) { } void AgiEngine::cmd_echo_line(uint8 *p) { - strcpy((char *)game.inputBuffer, (const char *)game.echoBuffer); - game.cursorPos = strlen((char *)game.inputBuffer); - game.hasPrompt = 0; + strcpy((char *)_game.inputBuffer, (const char *)_game.echoBuffer); + _game.cursorPos = strlen((char *)_game.inputBuffer); + _game.hasPrompt = 0; } void AgiEngine::cmd_clear_lines(uint8 *p) { @@ -1484,20 +1472,20 @@ void AgiEngine::cmd_clear_lines(uint8 *p) { // #1935838 and #1935842 l = (l <= 24) ? l : 24; - g_agi->clearLines(p0, l, p2); - g_agi->flushLines(p0, l); + clearLines(p0, l, p2); + flushLines(p0, l); } void AgiEngine::cmd_print(uint8 *p) { int n = p0 < 1 ? 1 : p0; - g_agi->print(curLogic->texts[n - 1], 0, 0, 0); + print(_curLogic->texts[n - 1], 0, 0, 0); } void AgiEngine::cmd_print_f(uint8 *p) { int n = _v[p0] < 1 ? 1 : _v[p0]; - g_agi->print(curLogic->texts[n - 1], 0, 0, 0); + print(_curLogic->texts[n - 1], 0, 0, 0); } void AgiEngine::cmd_print_at(uint8 *p) { @@ -1505,23 +1493,23 @@ void AgiEngine::cmd_print_at(uint8 *p) { debugC(4, kDebugLevelScripts, "%d %d %d %d", p0, p1, p2, p3); - g_agi->print(curLogic->texts[n - 1], p1, p2, p3); + print(_curLogic->texts[n - 1], p1, p2, p3); } void AgiEngine::cmd_print_at_v(uint8 *p) { int n = _v[p0] < 1 ? 1 : _v[p0]; - g_agi->print(curLogic->texts[n - 1], p1, p2, p3); + print(_curLogic->texts[n - 1], p1, p2, p3); } void AgiEngine::cmd_push_script(uint8 *p) { // We run AGIMOUSE always as a side effect - if (g_agi->getFeatures() & GF_AGIMOUSE || 1) { - game.vars[27] = g_agi->_mouse.button; - game.vars[28] = g_agi->_mouse.x / 2; - game.vars[29] = g_agi->_mouse.y; + if (getFeatures() & GF_AGIMOUSE || 1) { + _game.vars[27] = _mouse.button; + _game.vars[28] = _mouse.x / 2; + _game.vars[29] = _mouse.y; } else { - if (g_agi->getVersion() >= 0x2915) { + if (getVersion() >= 0x2915) { report("push.script\n"); } } @@ -1532,20 +1520,20 @@ void AgiEngine::cmd_set_pri_base(uint8 *p) { report("Priority base set to %d\n", p0); - // game.alt_pri = true; + // _game.alt_pri = true; x = (_HEIGHT - p0) * _HEIGHT / 10; for (i = 0; i < _HEIGHT; i++) { pri = (i - p0) < 0 ? 4 : (i - p0) * _HEIGHT / x + 5; if (pri > 15) pri = 15; - game.priTable[i] = pri; + _game.priTable[i] = pri; } } void AgiEngine::cmd_mouse_posn(uint8 *p) { - _v[p0] = WIN_TO_PIC_X(g_agi->_mouse.x); - _v[p1] = WIN_TO_PIC_Y(g_agi->_mouse.y); + _v[p0] = WIN_TO_PIC_X(_mouse.x); + _v[p1] = WIN_TO_PIC_Y(_mouse.y); } void AgiEngine::cmd_shake_screen(uint8 *p) { @@ -1554,8 +1542,8 @@ void AgiEngine::cmd_shake_screen(uint8 *p) { // AGIPAL uses shake.screen values between 100 and 109 to set the palette // (Checked the original AGIPAL-hack's shake.screen-routine's disassembly). if (p0 >= 100 && p0 < 110) { - if (g_agi->getFeatures() & GF_AGIPAL) { - g_gfx->setAGIPal(p0); + if (getFeatures() & GF_AGIPAL) { + _gfx->setAGIPal(p0); return; } else { warning("It looks like GF_AGIPAL flag is missing"); @@ -1564,21 +1552,21 @@ void AgiEngine::cmd_shake_screen(uint8 *p) { // Disables input while shaking to prevent bug // #1678230: AGI: Entering text while screen is shaking - bool originalValue = game.inputEnabled; - game.inputEnabled = false; + bool originalValue = _game.inputEnabled; + _game.inputEnabled = false; - g_gfx->shakeStart(); + _gfx->shakeStart(); - g_sprites->commitBoth(); // Fixes SQ1 demo + _sprites->commitBoth(); // Fixes SQ1 demo for (i = 4 * p0; i; i--) { - g_gfx->shakeScreen(i & 1); - g_gfx->flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); - g_agi->mainCycle(); + _gfx->shakeScreen(i & 1); + _gfx->flushBlock(0, 0, GFX_WIDTH - 1, GFX_HEIGHT - 1); + mainCycle(); } - g_gfx->shakeEnd(); + _gfx->shakeEnd(); // Sets input back to what it was - game.inputEnabled = originalValue; + _game.inputEnabled = originalValue; } void AgiEngine::setupOpcodes() { @@ -1797,12 +1785,12 @@ int AgiEngine::runLogic(int n) { } _game.lognum = n; - curLogic = &_game.logics[_game.lognum]; + _curLogic = &_game.logics[_game.lognum]; - code = curLogic->data; - curLogic->cIP = curLogic->sIP; + code = _curLogic->data; + _curLogic->cIP = _curLogic->sIP; - timerHack = 0; + _timerHack = 0; while (ip < _game.logics[n].size && !(shouldQuit() || _restartGame)) { if (_debug.enabled) { if (_debug.steps > 0) { @@ -1837,10 +1825,10 @@ int AgiEngine::runLogic(int n) { // timer must keep running even in goto loops, // but AGI engine can't do that :( - if (timerHack > 20) { + if (_timerHack > 20) { pollTimer(); updateTimer(); - timerHack = 0; + _timerHack = 0; } break; case 0x00: // return diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp index f10cdd3f17..6967f6c665 100644 --- a/engines/agi/op_test.cpp +++ b/engines/agi/op_test.cpp @@ -51,8 +51,6 @@ static AgiEngine *g_agi; #define testHas(obj) (g_agi->objectGetLocation(obj) == EGO_OWNED) #define testObjInRoom(obj, v) (g_agi->objectGetLocation(obj) == g_agi->getvar(v)) -extern int timerHack; // For the timer loop in MH1 logic 153 - static uint8 testCompareStrings(uint8 s1, uint8 s2) { char ms1[MAX_STRINGLEN]; char ms2[MAX_STRINGLEN]; @@ -263,32 +261,32 @@ int AgiEngine::testIfCode(int lognum) { case 0x01: ec = testEqual(p[0], p[1]); if (p[0] == 11) - timerHack++; + _timerHack++; break; case 0x02: ec = testEqual(p[0], getvar(p[1])); if (p[0] == 11 || p[1] == 11) - timerHack++; + _timerHack++; break; case 0x03: ec = testLess(p[0], p[1]); if (p[0] == 11) - timerHack++; + _timerHack++; break; case 0x04: ec = testLess(p[0], getvar(p[1])); if (p[0] == 11 || p[1] == 11) - timerHack++; + _timerHack++; break; case 0x05: ec = testGreater(p[0], p[1]); if (p[0] == 11) - timerHack++; + _timerHack++; break; case 0x06: ec = testGreater(p[0], getvar(p[1])); if (p[0] == 11 || p[1] == 11) - timerHack++; + _timerHack++; break; case 0x07: ec = testIsSet(p[0]); -- cgit v1.2.3 From c7a9865a73eae69e73fb8a67bffbbe2286074a8c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:33:45 +0000 Subject: AGI: Change a static var to member var AgiEngine::_lastTickTimer svn-id: r50126 --- engines/agi/agi.cpp | 10 +++++----- engines/agi/agi.h | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 333b674379..6a359944e1 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -272,20 +272,19 @@ void AgiEngine::processEvents() { } void AgiEngine::pollTimer() { - static uint32 m = 0; uint32 dm; - if (_tickTimer < m) - m = 0; + if (_tickTimer < _lastTickTimer) + _lastTickTimer = 0; - while ((dm = _tickTimer - m) < 5) { + while ((dm = _tickTimer - _lastTickTimer) < 5) { processEvents(); if (_console->isAttached()) _console->onFrame(); _system->delayMillis(10); _system->updateScreen(); } - m = _tickTimer; + _lastTickTimer = _tickTimer; } void AgiEngine::agiTimerFunctionLow(void *refCon) { @@ -543,6 +542,7 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _allowSynthetic = false; _tickTimer = 0; + _lastTickTimer = 0; _intobj = NULL; diff --git a/engines/agi/agi.h b/engines/agi/agi.h index a67775cec6..301ffa1b6c 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -816,6 +816,7 @@ public: private: uint32 _tickTimer; + uint32 _lastTickTimer; int _keyQueue[KEY_QUEUE_SIZE]; int _keyQueueStart; -- cgit v1.2.3 From 49448af6cb2613460fe37caf79bdb1ed4c206715 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:34:06 +0000 Subject: AGI: Turn some more AGI static functions into AgiEngine methods svn-id: r50127 --- engines/agi/agi.h | 11 +++++++ engines/agi/op_test.cpp | 87 +++++++++++++++++++++---------------------------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 301ffa1b6c..166470e6e4 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -939,6 +939,17 @@ public: int testIfCode(int); void executeAgiCommand(uint8, uint8 *); +private: + // Some submethods of testIfCode + uint8 testObjRight(uint8, uint8, uint8, uint8, uint8); + uint8 testObjCentre(uint8, uint8, uint8, uint8, uint8); + uint8 testObjInBox(uint8, uint8, uint8, uint8, uint8); + uint8 testPosn(uint8, uint8, uint8, uint8, uint8); + uint8 testSaid(uint8, uint8 *); + uint8 testController(uint8); + uint8 testKeypressed(); + uint8 testCompareStrings(uint8, uint8); + // View private: diff --git a/engines/agi/op_test.cpp b/engines/agi/op_test.cpp index 6967f6c665..ab4f6cadc5 100644 --- a/engines/agi/op_test.cpp +++ b/engines/agi/op_test.cpp @@ -29,35 +29,23 @@ namespace Agi { -static uint8 testObjRight(uint8, uint8, uint8, uint8, uint8); -static uint8 testObjCentre(uint8, uint8, uint8, uint8, uint8); -static uint8 testObjInBox(uint8, uint8, uint8, uint8, uint8); -static uint8 testPosn(uint8, uint8, uint8, uint8, uint8); -static uint8 testSaid(uint8, uint8 *); -static uint8 testController(uint8); -static uint8 testKeypressed(); -static uint8 testCompareStrings(uint8, uint8); - -static AgiEngine *g_agi; -#define game g_agi->_game - -#define ip (game.logics[lognum].cIP) -#define code (game.logics[lognum].data) - -#define testEqual(v1, v2) (g_agi->getvar(v1) == (v2)) -#define testLess(v1, v2) (g_agi->getvar(v1) < (v2)) -#define testGreater(v1, v2) (g_agi->getvar(v1) > (v2)) -#define testIsSet(flag) (g_agi->getflag(flag)) -#define testHas(obj) (g_agi->objectGetLocation(obj) == EGO_OWNED) -#define testObjInRoom(obj, v) (g_agi->objectGetLocation(obj) == g_agi->getvar(v)) - -static uint8 testCompareStrings(uint8 s1, uint8 s2) { +#define ip (_game.logics[lognum].cIP) +#define code (_game.logics[lognum].data) + +#define testEqual(v1, v2) (getvar(v1) == (v2)) +#define testLess(v1, v2) (getvar(v1) < (v2)) +#define testGreater(v1, v2) (getvar(v1) > (v2)) +#define testIsSet(flag) (getflag(flag)) +#define testHas(obj) (objectGetLocation(obj) == EGO_OWNED) +#define testObjInRoom(obj, v) (objectGetLocation(obj) == getvar(v)) + +uint8 AgiEngine::testCompareStrings(uint8 s1, uint8 s2) { char ms1[MAX_STRINGLEN]; char ms2[MAX_STRINGLEN]; int j, k, l; - strcpy(ms1, game.strings[s1]); - strcpy(ms2, game.strings[s2]); + strcpy(ms1, _game.strings[s1]); + strcpy(ms2, _game.strings[s2]); l = strlen(ms1); for (k = 0, j = 0; k < l; k++) { @@ -104,16 +92,16 @@ static uint8 testCompareStrings(uint8 s1, uint8 s2) { return !strcmp(ms1, ms2); } -static uint8 testKeypressed() { - int x = game.keypress; +uint8 AgiEngine::testKeypressed() { + int x = _game.keypress; - game.keypress = 0; + _game.keypress = 0; if (!x) { - InputMode mode = game.inputMode; + InputMode mode = _game.inputMode; - game.inputMode = INPUT_NONE; - g_agi->mainCycle(); - game.inputMode = mode; + _game.inputMode = INPUT_NONE; + mainCycle(); + _game.inputMode = mode; } if (x) @@ -122,12 +110,12 @@ static uint8 testKeypressed() { return x; } -static uint8 testController(uint8 cont) { - return (game.controllerOccured[cont] ? 1 : 0); +uint8 AgiEngine::testController(uint8 cont) { + return (_game.controllerOccured[cont] ? 1 : 0); } -static uint8 testPosn(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { - VtEntry *v = &game.viewTable[n]; +uint8 AgiEngine::testPosn(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { + VtEntry *v = &_game.viewTable[n]; uint8 r; r = v->xPos >= x1 && v->yPos >= y1 && v->xPos <= x2 && v->yPos <= y2; @@ -137,35 +125,35 @@ static uint8 testPosn(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { return r; } -static uint8 testObjInBox(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { - VtEntry *v = &game.viewTable[n]; +uint8 AgiEngine::testObjInBox(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { + VtEntry *v = &_game.viewTable[n]; return v->xPos >= x1 && v->yPos >= y1 && v->xPos + v->xSize - 1 <= x2 && v->yPos <= y2; } // if n is in centre of box -static uint8 testObjCentre(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { - VtEntry *v = &game.viewTable[n]; +uint8 AgiEngine::testObjCentre(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { + VtEntry *v = &_game.viewTable[n]; return v->xPos + v->xSize / 2 >= x1 && v->xPos + v->xSize / 2 <= x2 && v->yPos >= y1 && v->yPos <= y2; } // if nect N is in right corner -static uint8 testObjRight(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { - VtEntry *v = &game.viewTable[n]; +uint8 AgiEngine::testObjRight(uint8 n, uint8 x1, uint8 y1, uint8 x2, uint8 y2) { + VtEntry *v = &_game.viewTable[n]; return v->xPos + v->xSize - 1 >= x1 && v->xPos + v->xSize - 1 <= x2 && v->yPos >= y1 && v->yPos <= y2; } // When player has entered something, it is parsed elsewhere -static uint8 testSaid(uint8 nwords, uint8 *cc) { - int c, n = game.numEgoWords; +uint8 AgiEngine::testSaid(uint8 nwords, uint8 *cc) { + int c, n = _game.numEgoWords; int z = 0; - if (g_agi->getflag(fSaidAcceptedInput) || !g_agi->getflag(fEnteredCli)) + if (getflag(fSaidAcceptedInput) || !getflag(fEnteredCli)) return false; // FR: @@ -196,7 +184,7 @@ static uint8 testSaid(uint8 nwords, uint8 *cc) { case 1: // any word break; default: - if (game.egoWords[c].id != z) + if (_game.egoWords[c].id != z) return false; break; } @@ -211,13 +199,12 @@ static uint8 testSaid(uint8 nwords, uint8 *cc) { if (nwords != 0 && READ_LE_UINT16(cc) != 9999) return false; - g_agi->setflag(fSaidAcceptedInput, true); + setflag(fSaidAcceptedInput, true); return true; } int AgiEngine::testIfCode(int lognum) { - g_agi = this; int ec = true; int retval = true; uint8 op = 0; @@ -317,7 +304,7 @@ int AgiEngine::testIfCode(int lognum) { ip++; // skip num_words opcode break; case 0x0F: - debugC(7, kDebugLevelScripts, "comparing [%s], [%s]", game.strings[p[0]], game.strings[p[1]]); + debugC(7, kDebugLevelScripts, "comparing [%s], [%s]", _game.strings[p[0]], _game.strings[p[1]]); ec = testCompareStrings(p[0], p[1]); break; case 0x10: @@ -336,7 +323,7 @@ int AgiEngine::testIfCode(int lognum) { // This command is used at least in the Amiga version of Gold Rush! v2.05 1989-03-09 // (AGI 2.316) in logics 1, 3, 5, 6, 137 and 192 (Logic.192 revealed this command's nature). // TODO: Check this command's implementation using disassembly just to be sure. - ec = game.viewTable[0].flags & ADJ_EGO_XY; + ec = _game.viewTable[0].flags & ADJ_EGO_XY; debugC(7, kDebugLevelScripts, "op_test: in.motion.using.mouse = %s (Amiga-specific testcase 19)", ec ? "true" : "false"); break; default: -- cgit v1.2.3 From bbad3f333a9227ccb1de633a0fe92d9e01ad7bb3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:36:36 +0000 Subject: Patch #1956501: "GUI/LAUNCHER: Midi device selection" svn-id: r50128 --- backends/midi/alsa.cpp | 13 +- backends/midi/camd.cpp | 13 +- backends/midi/coreaudio.cpp | 13 +- backends/midi/coremidi.cpp | 13 +- backends/midi/dmedia.cpp | 13 +- backends/midi/seq.cpp | 13 +- backends/midi/stmidi.cpp | 14 +- backends/midi/timidity.cpp | 13 +- backends/midi/windows.cpp | 47 ++- backends/midi/ypa1.cpp | 13 +- backends/midi/zodiac.cpp | 13 +- base/commandLine.cpp | 2 +- base/plugins.cpp | 1 + common/util.cpp | 3 +- common/util.h | 5 +- engines/agi/agi.cpp | 8 +- engines/agi/preagi.cpp | 4 +- engines/agi/sound_midi.cpp | 4 +- engines/agos/agos.cpp | 6 +- engines/draci/draci.cpp | 8 +- engines/gob/gob.cpp | 4 +- engines/groovie/music.cpp | 20 +- engines/groovie/script.cpp | 6 +- engines/kyra/kyra_v1.cpp | 12 +- engines/lure/sound.cpp | 8 +- engines/m4/m4.cpp | 6 +- engines/made/made.cpp | 8 +- engines/mohawk/sound.cpp | 4 +- engines/parallaction/parallaction_br.cpp | 4 +- engines/parallaction/parallaction_ns.cpp | 5 +- engines/queen/music.cpp | 9 +- engines/saga/music.cpp | 4 +- engines/saga/music.h | 6 +- engines/sci/sound/drivers/fb01.cpp | 4 +- engines/sci/sound/drivers/midi.cpp | 6 +- engines/sci/sound/iterator/core.cpp | 2 +- engines/sci/sound/music.cpp | 16 +- engines/scumm/detection.cpp | 2 +- engines/scumm/detection_tables.h | 20 +- engines/scumm/scumm.cpp | 32 +- engines/sky/sky.cpp | 10 +- engines/tinsel/tinsel.cpp | 8 +- engines/touche/midi.cpp | 6 +- gui/options.cpp | 159 +++++++-- gui/options.h | 12 + gui/themes/default.inc | 32 ++ gui/themes/scummclassic.zip | Bin 55657 -> 56607 bytes gui/themes/scummclassic/classic_layout.stx | 16 + gui/themes/scummclassic/classic_layout_lowres.stx | 16 + gui/themes/scummmodern.zip | Bin 162946 -> 163899 bytes gui/themes/scummmodern/scummmodern_layout.stx | 16 + .../scummmodern/scummmodern_layout_lowres.stx | 16 + po/POTFILES | 6 +- sound/mididrv.cpp | 393 +++++++++------------ sound/mididrv.h | 131 +++---- sound/musicplugin.cpp | 22 +- sound/musicplugin.h | 32 +- sound/null.cpp | 39 +- sound/softsynth/adlib.cpp | 16 +- sound/softsynth/fluidsynth.cpp | 13 +- sound/softsynth/mt32.cpp | 23 +- sound/softsynth/ym2612.cpp | 16 +- 62 files changed, 693 insertions(+), 686 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index c38537248c..a82fffdf0d 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -269,7 +269,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; #define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) @@ -315,21 +315,12 @@ MusicDevices AlsaMusicPlugin::getDevices() const { return devices; } -Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_ALSA(); return Common::kNoError; } -MidiDriver *MidiDriver_ALSA_create() { - MidiDriver *mididriver; - - AlsaMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(ALSA) //REGISTER_PLUGIN_DYNAMIC(ALSA, PLUGIN_TYPE_MUSIC, AlsaMusicPlugin); //#else diff --git a/backends/midi/camd.cpp b/backends/midi/camd.cpp index e4ca3569f2..3486532549 100644 --- a/backends/midi/camd.cpp +++ b/backends/midi/camd.cpp @@ -177,7 +177,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CamdMusicPlugin::getDevices() const { @@ -188,21 +188,12 @@ MusicDevices CamdMusicPlugin::getDevices() const { return devices; } -Common::Error CamdMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CamdMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CAMD(); return Common::kNoError; } -MidiDriver *MidiDriver_CAMD_create() { - MidiDriver *mididriver; - - CamdMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(CAMD) //REGISTER_PLUGIN_DYNAMIC(CAMD, PLUGIN_TYPE_MUSIC, CamdMusicPlugin); //#else diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp index d52547c997..aa0ad75f0a 100644 --- a/backends/midi/coreaudio.cpp +++ b/backends/midi/coreaudio.cpp @@ -218,7 +218,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CoreAudioMusicPlugin::getDevices() const { @@ -229,21 +229,12 @@ MusicDevices CoreAudioMusicPlugin::getDevices() const { return devices; } -Common::Error CoreAudioMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CoreAudioMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CORE(); return Common::kNoError; } -MidiDriver *MidiDriver_CORE_create() { - MidiDriver *mididriver; - - CoreAudioMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(COREAUDIO) //REGISTER_PLUGIN_DYNAMIC(COREAUDIO, PLUGIN_TYPE_MUSIC, CoreAudioMusicPlugin); //#else diff --git a/backends/midi/coremidi.cpp b/backends/midi/coremidi.cpp index e48b98a807..08f36a8b0f 100644 --- a/backends/midi/coremidi.cpp +++ b/backends/midi/coremidi.cpp @@ -190,7 +190,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CoreMIDIMusicPlugin::getDevices() const { @@ -201,21 +201,12 @@ MusicDevices CoreMIDIMusicPlugin::getDevices() const { return devices; } -Common::Error CoreMIDIMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CoreMIDIMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CoreMIDI(); return Common::kNoError; } -MidiDriver *MidiDriver_CoreMIDI_create() { - MidiDriver *mididriver; - - CoreMIDIMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(COREMIDI) //REGISTER_PLUGIN_DYNAMIC(COREMIDI, PLUGIN_TYPE_MUSIC, CoreMIDIMusicPlugin); //#else diff --git a/backends/midi/dmedia.cpp b/backends/midi/dmedia.cpp index 1ec79d8513..8c006b2cd9 100644 --- a/backends/midi/dmedia.cpp +++ b/backends/midi/dmedia.cpp @@ -199,7 +199,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices DMediaMusicPlugin::getDevices() const { @@ -224,21 +224,12 @@ MusicDevices DMediaMusicPlugin::getDevices() const { return devices; } -Common::Error DMediaMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error DMediaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_DMEDIA(); return Common::kNoError; } -MidiDriver *MidiDriver_DMEDIA_create() { - MidiDriver *mididriver; - - DMediaMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(DMEDIA) //REGISTER_PLUGIN_DYNAMIC(DMEDIA, PLUGIN_TYPE_MUSIC, DMediaMusicPlugin); //#else diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 55c8239562..216c5802b7 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -184,7 +184,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices SeqMusicPlugin::getDevices() const { @@ -195,21 +195,12 @@ MusicDevices SeqMusicPlugin::getDevices() const { return devices; } -Common::Error SeqMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error SeqMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_SEQ(); return Common::kNoError; } -MidiDriver *MidiDriver_SEQ_create() { - MidiDriver *mididriver; - - SeqMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(SEQ) //REGISTER_PLUGIN_DYNAMIC(SEQ, PLUGIN_TYPE_MUSIC, SeqMusicPlugin); //#else diff --git a/backends/midi/stmidi.cpp b/backends/midi/stmidi.cpp index f99f8f74dd..b00188dfea 100644 --- a/backends/midi/stmidi.cpp +++ b/backends/midi/stmidi.cpp @@ -127,8 +127,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) - const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices StMidiMusicPlugin::getDevices() const { @@ -139,21 +138,12 @@ MusicDevices StMidiMusicPlugin::getDevices() const { return devices; } -Common::Error StMidiMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error StMidiMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_STMIDI(); return Common::kNoError; } -MidiDriver *MidiDriver_STMIDI_create() { - MidiDriver *mididriver; - - StMidiMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(STMIDI) //REGISTER_PLUGIN_DYNAMIC(STMIDI, PLUGIN_TYPE_MUSIC, StMidiMusicPlugin); //#else diff --git a/backends/midi/timidity.cpp b/backends/midi/timidity.cpp index 1a44e62b16..f507f1e00a 100644 --- a/backends/midi/timidity.cpp +++ b/backends/midi/timidity.cpp @@ -530,7 +530,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices TimidityMusicPlugin::getDevices() const { @@ -539,21 +539,12 @@ MusicDevices TimidityMusicPlugin::getDevices() const { return devices; } -Common::Error TimidityMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error TimidityMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_TIMIDITY(); return Common::kNoError; } -MidiDriver *MidiDriver_TIMIDITY_create() { - MidiDriver *mididriver; - - TimidityMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(TIMIDITY) //REGISTER_PLUGIN_DYNAMIC(TIMIDITY, PLUGIN_TYPE_MUSIC, TimidityMusicPlugin); //#else diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp index 036029644e..d030d9827d 100644 --- a/backends/midi/windows.cpp +++ b/backends/midi/windows.cpp @@ -30,6 +30,7 @@ #include "sound/musicplugin.h" #include "sound/mpu401.h" +#include "common/config-manager.h" #include @@ -46,11 +47,12 @@ private: HANDLE _streamEvent; HMIDIOUT _mo; bool _isOpen; + int _device; void check_error(MMRESULT result); public: - MidiDriver_WIN() : _isOpen(false) { } + MidiDriver_WIN(int deviceIndex) : _isOpen(false), _device(deviceIndex) { } int open(); void close(); void send(uint32 b); @@ -62,7 +64,7 @@ int MidiDriver_WIN::open() { return MERR_ALREADY_OPEN; _streamEvent = CreateEvent(NULL, true, true, NULL); - MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, MIDI_MAPPER, (DWORD_PTR)_streamEvent, 0, CALLBACK_EVENT); + MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, _device, (DWORD_PTR)_streamEvent, 0, CALLBACK_EVENT); if (res != MMSYSERR_NOERROR) { check_error(res); CloseHandle(_streamEvent); @@ -158,32 +160,43 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices WindowsMusicPlugin::getDevices() const { MusicDevices devices; - // TODO: Return a different music type depending on the configuration - // TODO: List the available devices - devices.push_back(MusicDevice(this, "", MT_GM)); + int numDevs = midiOutGetNumDevs(); + MIDIOUTCAPS tmp; + + for (int i = 0; i < numDevs; i++) { + if (midiOutGetDevCaps(i, &tmp, sizeof(MIDIOUTCAPS)) != MMSYSERR_NOERROR) + break; + // There is no way to detect the "MusicType" so I just set it to MT_GM + // The user will have to manually select his MT32 type device and his GM type device. + devices.push_back(MusicDevice(this, tmp.szPname, MT_GM)); + } return devices; } -Common::Error WindowsMusicPlugin::createInstance(MidiDriver **mididriver) const { - *mididriver = new MidiDriver_WIN(); +Common::Error WindowsMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle dev) const { + int devIndex = 0; + bool found = false; + + if (dev) { + MusicDevices i = getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (d->getCompleteId().equals(MidiDriver::getDeviceString(dev, MidiDriver::kDeviceId))) { + found = true; + break; + } + devIndex++; + } + } + *mididriver = new MidiDriver_WIN(found ? devIndex : 0); return Common::kNoError; } -MidiDriver *MidiDriver_WIN_create() { - MidiDriver *mididriver; - - WindowsMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(WINDOWS) //REGISTER_PLUGIN_DYNAMIC(WINDOWS, PLUGIN_TYPE_MUSIC, WindowsMusicPlugin); //#else diff --git a/backends/midi/ypa1.cpp b/backends/midi/ypa1.cpp index fe65d02c10..fb114d625c 100644 --- a/backends/midi/ypa1.cpp +++ b/backends/midi/ypa1.cpp @@ -117,7 +117,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices YamahaPa1MusicPlugin::getDevices() const { @@ -128,21 +128,12 @@ MusicDevices YamahaPa1MusicPlugin::getDevices() const { return devices; } -Common::Error YamahaPa1MusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error YamahaPa1MusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_YamahaPa1(); return Common::kNoError; } -MidiDriver *MidiDriver_YamahaPa1_create() { - MidiDriver *mididriver; - - YamahaPa1MusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(YPA1) //REGISTER_PLUGIN_DYNAMIC(YPA1, PLUGIN_TYPE_MUSIC, YamahaPa1MusicPlugin); //#else diff --git a/backends/midi/zodiac.cpp b/backends/midi/zodiac.cpp index b9cb46912a..e848315ca4 100644 --- a/backends/midi/zodiac.cpp +++ b/backends/midi/zodiac.cpp @@ -135,7 +135,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices ZodiacMusicPlugin::getDevices() const { @@ -146,21 +146,12 @@ MusicDevices ZodiacMusicPlugin::getDevices() const { return devices; } -Common::Error ZodiacMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error ZodiacMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_Zodiac(); return Common::kNoError; } -MidiDriver *MidiDriver_Zodiac_create() { - MidiDriver *mididriver; - - ZodiacMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(ZODIAC) //REGISTER_PLUGIN_DYNAMIC(ZODIAC, PLUGIN_TYPE_MUSIC, ZodiacMusicPlugin); //#else diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 1c548d3f50..8b0decf695 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -364,7 +364,7 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha END_OPTION DO_OPTION('e', "music-driver") - if (MidiDriver::findMusicDriver(option) == 0) + if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(option)) == MT_NULL) usage("Unrecognized music driver '%s'", option); END_OPTION diff --git a/base/plugins.cpp b/base/plugins.cpp index 6c80da65d4..199344087c 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -167,6 +167,7 @@ public: // Music plugins // TODO: Use defines to disable or enable each MIDI driver as a // static/dynamic plugin, like it's done for the engines + LINK_PLUGIN(AUTO) LINK_PLUGIN(NULL) #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) LINK_PLUGIN(WINDOWS) diff --git a/common/util.cpp b/common/util.cpp index b8bd327a0a..70499a984f 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -305,7 +305,8 @@ const struct GameOpt { { GUIO_MIDIPCJR, "midiPCJr" }, { GUIO_MIDIADLIB, "midiAdLib" }, { GUIO_MIDITOWNS, "midiTowns" }, - { GUIO_MIDI, "midiMidi" }, + { GUIO_MIDIMT32, "midiMt32" }, + { GUIO_MIDIGM, "midiGM" }, { GUIO_NONE, 0 } }; diff --git a/common/util.h b/common/util.h index 71456353c7..d7d68cc1ca 100644 --- a/common/util.h +++ b/common/util.h @@ -223,8 +223,9 @@ enum GameGUIOption { GUIO_MIDICMS = (1 << 7), GUIO_MIDIPCJR = (1 << 8), GUIO_MIDIADLIB = (1 << 9), - GUIO_MIDITOWNS = (1 << 10), - GUIO_MIDI = (1 << 11) + GUIO_MIDITOWNS = (1 << 10), + GUIO_MIDIMT32 = (1 << 11), + GUIO_MIDIGM = (1 << 12) }; bool checkGameGUIOption(GameGUIOption option, const String &str); diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 6a359944e1..a39725a973 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -587,14 +587,14 @@ void AgiEngine::initialize() { } else if (getPlatform() == Common::kPlatformCoCo3) { _soundemu = SOUND_EMU_COCO3; } else { - switch (MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI)) { - case MD_PCSPK: + switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK))) { + case MT_PCSPK: _soundemu = SOUND_EMU_PC; break; - case MD_PCJR: + case MT_PCJR: _soundemu = SOUND_EMU_PCJR; break; - case MD_ADLIB: + case MT_ADLIB: _soundemu = SOUND_EMU_NONE; break; default: diff --git a/engines/agi/preagi.cpp b/engines/agi/preagi.cpp index 35285798d4..1a5698dffc 100644 --- a/engines/agi/preagi.cpp +++ b/engines/agi/preagi.cpp @@ -68,8 +68,8 @@ void PreAgiEngine::initialize() { // drivers, and I'm not sure what they are. For now, they might // as well be called "PC Speaker" and "Not PC Speaker". - switch (MidiDriver::detectMusicDriver(MDT_PCSPK)) { - case MD_PCSPK: + switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK))) { + case MT_PCSPK: _soundemu = SOUND_EMU_PC; break; default: diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp index 551df527cc..57c5d54b27 100644 --- a/engines/agi/sound_midi.cpp +++ b/engines/agi/sound_midi.cpp @@ -71,8 +71,8 @@ MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : A } SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _parser(0), _isPlaying(false), _passThrough(false), _isGM(false) { - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB); - _driver = MidiDriver::createMidi(midiDriver); + DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB); + _driver = MidiDriver::createMidi(dev); memset(_channel, 0, sizeof(_channel)); memset(_channelVolume, 255, sizeof(_channelVolume)); diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 926b3a8972..481c73dc5c 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -557,10 +557,10 @@ Common::Error AGOSEngine::init() { (getPlatform() == Common::kPlatformPC)) { // Setup midi driver - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_ADLIB | MDT_MIDI); - _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | (getGameType() == GType_SIMON1 ? MDT_PREFER_MT32 : MDT_PREFER_GM)); + _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); - _driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(dev); if (_nativeMT32) { _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index cbf878279b..9e1e7033bb 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -127,11 +127,11 @@ int DraciEngine::init() { _dubbingArchive = new SoundArchive(dubbingPath, kDubbingFrequency); _sound = new Sound(_mixer); - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - //bool adlib = (midiDriver == MD_ADLIB); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); + //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); - _midiDriver = MidiDriver::createMidi(midiDriver); + _midiDriver = MidiDriver::createMidi(dev); if (native_mt32) _midiDriver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index e3472e9fe1..fba616b166 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -345,8 +345,8 @@ void GobEngine::pauseGame() { } bool GobEngine::initGameParts() { - _noMusic = MidiDriver::parseMusicDriver(ConfMan.get("music_driver")) == MD_NULL; - + // just detect some devices some of which will be always there if the music is not disabled + _noMusic = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB) ? false : true; _saveLoad = 0; _global = new Global(this); diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 2ea7454256..7166432e02 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -386,8 +386,8 @@ MusicPlayerXMI::MusicPlayerXMI(GroovieEngine *vm, const Common::String >lName) _midiParser = MidiParser::createParser_XMIDI(); // Create the driver - MidiDriverType driver = detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _driver = createMidi(driver); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _driver = createMidi(dev); this->open(); // Set the parser's driver @@ -402,9 +402,9 @@ MusicPlayerXMI::MusicPlayerXMI(GroovieEngine *vm, const Common::String >lName) } // Load the Global Timbre Library - if (driver == MD_ADLIB) { + if (MidiDriver::getMusicType(dev) == MT_ADLIB) { // MIDI through AdLib - _musicType = MD_ADLIB; + _musicType = MT_ADLIB; loadTimbres(gtlName + ".ad"); // Setup the percussion channel @@ -412,9 +412,9 @@ MusicPlayerXMI::MusicPlayerXMI(GroovieEngine *vm, const Common::String >lName) if (_timbres[i].bank == 0x7F) setTimbreAD(9, _timbres[i]); } - } else if ((driver == MD_MT32) || ConfMan.getBool("native_mt32")) { + } else if ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")) { // MT-32 - _musicType = MD_MT32; + _musicType = MT_MT32; loadTimbres(gtlName + ".mt"); } else { // GM @@ -455,9 +455,9 @@ void MusicPlayerXMI::send(uint32 b) { for (int i = 0; i < numTimbres; i++) { if ((_timbres[i].bank == _chanBanks[chan]) && (_timbres[i].patch == patch)) { - if (_musicType == MD_ADLIB) { + if (_musicType == MT_ADLIB) { setTimbreAD(chan, _timbres[i]); - } else if (_musicType == MD_MT32) { + } else if (_musicType == MT_MT32) { setTimbreMT(chan, _timbres[i]); } return; @@ -682,8 +682,8 @@ MusicPlayerMac::MusicPlayerMac(GroovieEngine *vm) : MusicPlayerMidi(vm) { _midiParser = MidiParser::createParser_SMF(); // Create the driver - MidiDriverType driver = detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _driver = createMidi(driver); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _driver = createMidi(dev); this->open(); // Set the parser's driver diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 297da6ccc2..08df5e7a83 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -86,11 +86,11 @@ Script::Script(GroovieEngine *vm, EngineVersion version) : } // Initialize the music type variable - int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - if (midiDriver == MD_ADLIB) { + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + if (MidiDriver::getMusicType(dev) == MT_ADLIB) { // MIDI through AdLib setVariable(0x100, 0); - } else if ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")) { + } else if ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")) { // MT-32 setVariable(0x100, 2); } else { diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 00b32425c2..970851c127 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -106,7 +106,7 @@ Common::Error KyraEngine_v1::init() { if (!_flags.useDigSound) { // We prefer AdLib over MIDI, since generally AdLib is better supported - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_MIDI | MDT_ADLIB); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI | MDT_PREFER_MT32); if (_flags.platform == Common::kPlatformFMTowns) { if (_flags.gameID == GI_KYRA1) @@ -120,24 +120,24 @@ Common::Error KyraEngine_v1::init() { _sound = new SoundTownsPC98_v2(this, _mixer); } else if (_flags.platform == Common::kPlatformAmiga) { _sound = new SoundAmiga(this, _mixer); - } else if (midiDriver == MD_ADLIB) { + } else if (MidiDriver::getMusicType(dev) == MT_ADLIB) { _sound = new SoundAdLibPC(this, _mixer); } else { Sound::kType type; - if (midiDriver == MD_PCSPK) + if (MidiDriver::getMusicType(dev) == MT_PCSPK) type = Sound::kPCSpkr; - else if (midiDriver == MD_MT32 || ConfMan.getBool("native_mt32")) + else if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32")) type = Sound::kMidiMT32; else type = Sound::kMidiGM; MidiDriver *driver = 0; - if (midiDriver == MD_PCSPK) { + if (MidiDriver::getMusicType(dev) == MT_PCSPK) { driver = new MidiDriver_PCSpeaker(_mixer); } else { - driver = MidiDriver::createMidi(midiDriver); + driver = MidiDriver::createMidi(dev); if (type == Sound::kMidiMT32) driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); } diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp index e725b7c31a..1b306b5021 100644 --- a/engines/lure/sound.cpp +++ b/engines/lure/sound.cpp @@ -50,13 +50,13 @@ SoundManager::SoundManager() { _soundData = NULL; _paused = false; - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _isRoland = midiDriver != MD_ADLIB; - _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _isRoland = MidiDriver::getMusicType(dev) != MT_ADLIB; + _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); Common::set_to(_channelsInUse, _channelsInUse + NUM_CHANNELS, false); - _driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(dev); int statusCode = _driver->open(); if (statusCode) { warning("Sound driver returned error code %d", statusCode); diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index 446f2bf974..8063044205 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -156,10 +156,10 @@ Common::Error MadsM4Engine::run() { // Initialize backend _screen = new M4Surface(true); // Special form for creating screen reference - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); - _driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(dev); if (native_mt32) _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/made/made.cpp b/engines/made/made.cpp index 54e2189471..b983e87cc2 100644 --- a/engines/made/made.cpp +++ b/engines/made/made.cpp @@ -97,11 +97,11 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng _script = new ScriptInterpreter(this); - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - //bool adlib = (midiDriver == MD_ADLIB); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); + //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); - MidiDriver *driver = MidiDriver::createMidi(midiDriver); + MidiDriver *driver = MidiDriver::createMidi(dev); if (native_mt32) driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index b84573f011..5e1ea8cdb2 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -27,12 +27,12 @@ #include "common/util.h" +#include "sound/musicplugin.h" #include "sound/audiostream.h" #include "sound/decoders/mp3.h" #include "sound/decoders/raw.h" #include "sound/decoders/wave.h" - namespace Mohawk { Sound::Sound(MohawkEngine* vm) : _vm(vm) { @@ -79,7 +79,7 @@ void Sound::initMidi() { // Let's get our MIDI parser/driver _midiParser = MidiParser::createParser_SMF(); - _midiDriver = MidiDriver::createMidi(MidiDriver::detectMusicDriver(MDT_ADLIB|MDT_MIDI)); + _midiDriver = MidiDriver::createMidi(MidiDriver::detectDevice(MDT_ADLIB|MDT_MIDI)); // Set up everything! _midiDriver->open(); diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 153ea1541d..6dbf526c96 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -61,8 +61,8 @@ Common::Error Parallaction_br::init() { _disk = new DosDisk_br(this); } _disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters. - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - MidiDriver *driver = MidiDriver::createMidi(midiDriver); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver *driver = MidiDriver::createMidi(dev); _soundManI = new DosSoundMan_br(this, driver); } else { _disk = new AmigaDisk_br(this); diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index c1d6c9367a..7e06aaa5ab 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -24,7 +24,6 @@ */ #include "common/system.h" - #include "common/config-manager.h" #include "parallaction/parallaction.h" @@ -167,8 +166,8 @@ Common::Error Parallaction_ns::init() { _disk->init(); if (getPlatform() == Common::kPlatformPC) { - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - MidiDriver *driver = MidiDriver::createMidi(midiDriver); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver *driver = MidiDriver::createMidi(dev); _soundManI = new DosSoundMan_ns(this, driver); _soundManI->setMusicVolume(ConfMan.getInt("music_volume")); } else { diff --git a/engines/queen/music.cpp b/engines/queen/music.cpp index b4b9210616..2bbbd53568 100644 --- a/engines/queen/music.cpp +++ b/engines/queen/music.cpp @@ -34,6 +34,7 @@ #include "sound/midiparser.h" + namespace Queen { extern MidiDriver *C_Player_CreateAdLibMidiDriver(Audio::Mixer *); @@ -45,9 +46,9 @@ MidiMusic::MidiMusic(QueenEngine *vm) _queuePos = _lastSong = _currentSong = 0; queueClear(); - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _adlib = (midiDriver == MD_ADLIB); - _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI | MDT_PREFER_MT32); + _adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); + _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); const char *musicDataFile; if (vm->resource()->isDemo()) { @@ -72,7 +73,7 @@ MidiMusic::MidiMusic(QueenEngine *vm) // } _driver = C_Player_CreateAdLibMidiDriver(vm->_mixer); } else { - _driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(dev); if (_nativeMT32) { _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); } diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index 8b8f26d5a0..dbe79a3e72 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -47,8 +47,8 @@ MusicDriver::MusicDriver() : _isGM(false) { _masterVolume = 0; _nativeMT32 = ConfMan.getBool("native_mt32"); - _driverType = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _driver = MidiDriver::createMidi(_driverType); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _driver = MidiDriver::createMidi(dev); if (isMT32()) _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/saga/music.h b/engines/saga/music.h index cb068cd835..5cce3d4c04 100644 --- a/engines/saga/music.h +++ b/engines/saga/music.h @@ -52,8 +52,8 @@ public: void setVolume(int volume); int getVolume() { return _masterVolume; } - bool isAdlib() { return _driverType == MD_ADLIB; } - bool isMT32() { return _driverType == MD_MT32 || _nativeMT32; } + bool isAdlib() { return _driverType == MT_ADLIB; } + bool isMT32() { return _driverType == MT_MT32 || _nativeMT32; } void setGM(bool isGM) { _isGM = isGM; } //MidiDriver interface implementation @@ -78,7 +78,7 @@ protected: MidiChannel *_channel[16]; MidiDriver *_driver; - MidiDriverType _driverType; + MusicType _driverType; byte _channelVolume[16]; bool _isGM; bool _nativeMT32; diff --git a/engines/sci/sound/drivers/fb01.cpp b/engines/sci/sound/drivers/fb01.cpp index 7e9fbd51a1..ab9b2e3df5 100644 --- a/engines/sci/sound/drivers/fb01.cpp +++ b/engines/sci/sound/drivers/fb01.cpp @@ -128,8 +128,8 @@ private: }; MidiPlayer_Fb01::MidiPlayer_Fb01(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _timerParam(NULL), _timerProc(NULL) { - MidiDriverType midiType = MidiDriver::detectMusicDriver(MDT_MIDI); - _driver = createMidi(midiType); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); + _driver = createMidi(dev); _sysExBuf[0] = 0x43; _sysExBuf[1] = 0x75; diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index 625874eea1..1ef0781906 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -120,10 +120,10 @@ private: }; MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _isOldPatchFormat(true) { - MidiDriverType midiType = MidiDriver::detectMusicDriver(MDT_MIDI); - _driver = createMidi(midiType); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); + _driver = createMidi(dev); - if (midiType == MD_MT32 || ConfMan.getBool("native_mt32")) + if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32")) _isMt32 = true; _sysExBuf[0] = 0x41; diff --git a/engines/sci/sound/iterator/core.cpp b/engines/sci/sound/iterator/core.cpp index 7cd730b3e2..e2e62c83b7 100644 --- a/engines/sci/sound/iterator/core.cpp +++ b/engines/sci/sound/iterator/core.cpp @@ -223,7 +223,7 @@ void SfxPlayer::player_timer_callback(void *refCon) { /* API implementation */ Common::Error SfxPlayer::init(ResourceManager *resMan, int expected_latency) { - MidiDriverType musicDriver = MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB); + MidiDriverType musicDriver = MidiDriver::detectDevice(MDT_PCSPK | MDT_ADLIB); switch (musicDriver) { case MD_ADLIB: diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index fbf37a78b1..6c697c86e5 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -61,31 +61,25 @@ void SciMusic::init() { // SCI sound init _dwTempo = 0; - MidiDriverType midiType; - // Default to MIDI in SCI32 games, as many don't have AdLib support. // WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support those patches yet. // We also don't yet support the 7.pat file of SCI1+ Mac games or SCI0 Mac patches, so we // default to MIDI in those games to let them run. Common::Platform platform = g_sci->getPlatform(); + uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); - if (getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) - midiType = MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI); - else - midiType = MidiDriver::detectMusicDriver(MDT_PCSPK | MDT_ADLIB | MDT_MIDI); - - switch (midiType) { - case MD_ADLIB: + switch (MidiDriver::getMusicType(dev)) { + case MT_ADLIB: // FIXME: There's no Amiga sound option, so we hook it up to AdLib if (g_sci->getPlatform() == Common::kPlatformAmiga) _pMidiDrv = MidiPlayer_Amiga_create(_soundVersion); else _pMidiDrv = MidiPlayer_AdLib_create(_soundVersion); break; - case MD_PCJR: + case MT_PCJR: _pMidiDrv = MidiPlayer_PCJr_create(_soundVersion); break; - case MD_PCSPK: + case MT_PCSPK: _pMidiDrv = MidiPlayer_PCSpeaker_create(_soundVersion); break; default: diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 551e4c70a7..f509cabb2c 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -896,7 +896,7 @@ GameList ScummMetaEngine::detectGames(const Common::FSList &fslist) const { } } - dg.setGUIOptions(x->game.guioptions | MidiDriver::midiDriverFlags2GUIO(x->game.midi)); + dg.setGUIOptions(x->game.guioptions | MidiDriver::musicType2GUIO(x->game.midi)); dg.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(x->language)); detectedGames.push_back(dg); diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index db6d04b785..e9dfce8057 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -224,7 +224,7 @@ static const GameSettings gameVariantsTable[] = { {"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, {"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI, 0, UNK, GUIO_NOSPEECH}, + {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, {"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI}, #ifdef USE_RGB_COLOR {"loom", "PC-Engine", 0, GID_LOOM, 3, 0, MDT_NONE, GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO_NOSPEECH | GUIO_NOMIDI}, @@ -234,24 +234,24 @@ static const GameSettings gameVariantsTable[] = { {"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI, 0, UNK, GUIO_NOSPEECH}, - {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH}, + {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, + {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH}, {"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK, GF_16COLOR, Common::kPlatformAtariST, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "Demo", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "CD", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, UNK, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "FM-TOWNS", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "SEGA", 0, GID_MONKEY, 5, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"monkey2", 0, 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI, 0, UNK, GUIO_NOSPEECH}, + {"monkey2", 0, 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, - {"atlantis", "" , 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI, 0, UNK, GUIO_NONE}, - {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI, 0, UNK, GUIO_NOSPEECH}, + {"atlantis", "" , 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NONE}, + {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, - {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NONE}, - {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOSPEECH}, + {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, + {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, - {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NONE}, - {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI, GF_USE_KEY, UNK, GUIO_NOSPEECH}, + {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, + {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, #ifdef ENABLE_SCUMM_7_8 {"ft", 0, 0, GID_FT, 7, 0, MDT_NONE, 0, UNK, GUIO_NOMIDI}, diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 862353bf95..7c3b8a4a1d 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1634,28 +1634,28 @@ void ScummEngine_v100he::resetScumm() { #endif void ScummEngine::setupMusic(int midi) { - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(midi); - _native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(midi); + _native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); - switch (midiDriver) { - case MD_NULL: + switch (MidiDriver::getMusicType(dev)) { + case MT_NULL: _musicType = MDT_NONE; break; - case MD_PCSPK: - case MD_PCJR: + case MT_PCSPK: + case MT_PCJR: _musicType = MDT_PCSPK; break; - case MD_CMS: + //case MT_CMS: #if 1 _musicType = MDT_ADLIB; #else _musicType = MDT_CMS; // Still has number of bugs, disable by default #endif break; - case MD_TOWNS: + case MT_TOWNS: _musicType = MDT_TOWNS; break; - case MD_ADLIB: + case MT_ADLIB: _musicType = MDT_ADLIB; break; default: @@ -1707,7 +1707,7 @@ void ScummEngine::setupMusic(int midi) { if (!_mixer->isReady()) { warning("Sound mixer initialization failed"); if (_musicType == MDT_ADLIB || _musicType == MDT_PCSPK || _musicType == MDT_CMS) { - midiDriver = MD_NULL; + dev = 0; _musicType = MDT_NONE; warning("MIDI driver depends on sound mixer, switching to null MIDI driver"); } @@ -1735,11 +1735,11 @@ void ScummEngine::setupMusic(int midi) { } else if (_game.platform == Common::kPlatformAmiga && _game.version <= 4) { _musicEngine = new Player_V4A(this, _mixer); } else if (_game.id == GID_MANIAC && _game.version == 1) { - _musicEngine = new Player_V1(this, _mixer, midiDriver != MD_PCSPK); + _musicEngine = new Player_V1(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK); } else if (_game.version <= 2) { - _musicEngine = new Player_V2(this, _mixer, midiDriver != MD_PCSPK); + _musicEngine = new Player_V2(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK); } else if ((_musicType == MDT_PCSPK) && (_game.version > 2 && _game.version <= 4)) { - _musicEngine = new Player_V2(this, _mixer, midiDriver != MD_PCSPK); + _musicEngine = new Player_V2(this, _mixer, MidiDriver::getMusicType(dev) != MT_PCSPK); } else if (_musicType == MDT_CMS) { _musicEngine = new Player_V2CMS(this, _mixer); } else if (_game.platform == Common::kPlatform3DO && _game.heversion <= 62) { @@ -1749,12 +1749,12 @@ void ScummEngine::setupMusic(int midi) { MidiDriver *adlibMidiDriver = 0; if (_musicType != MDT_ADLIB) - nativeMidiDriver = MidiDriver::createMidi(midiDriver); + nativeMidiDriver = MidiDriver::createMidi(dev); if (nativeMidiDriver != NULL && _native_mt32) nativeMidiDriver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); bool multi_midi = ConfMan.getBool("multi_midi") && _musicType != MDT_NONE && (midi & MDT_ADLIB); if (_musicType == MDT_ADLIB || multi_midi) { - adlibMidiDriver = MidiDriver_ADLIB_create(); + adlibMidiDriver = MidiDriver::createMidi(MidiDriver::detectDevice(MDT_ADLIB)); adlibMidiDriver->property(MidiDriver::PROP_OLD_ADLIB, (_game.features & GF_SMALL_HEADER) ? 1 : 0); } @@ -1769,7 +1769,7 @@ void ScummEngine::setupMusic(int midi) { // YM2162 driver can't handle midi->getPercussionChannel(), NULL shouldn't init MT-32/GM/GS if ((midi != MDT_TOWNS) && (midi != MDT_NONE)) { _imuse->property(IMuse::PROP_NATIVE_MT32, _native_mt32); - if (midiDriver != MD_MT32) // MT-32 Emulation shouldn't be GM/GS initialized + if (MidiDriver::getMusicType(dev) != MT_MT32) // MT-32 Emulation shouldn't be GM/GS initialized _imuse->property(IMuse::PROP_GS, _enable_gs); } if (_game.heversion >= 60 || midi == MDT_TOWNS) { diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp index 9ea20aafc6..58e3f5be2c 100644 --- a/engines/sky/sky.cpp +++ b/engines/sky/sky.cpp @@ -259,16 +259,16 @@ Common::Error SkyEngine::init() { _systemVars.gameVersion = _skyDisk->determineGameVersion(); - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI); - if (midiDriver == MD_ADLIB) { + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32); + if (MidiDriver::getMusicType(dev) == MT_ADLIB) { _systemVars.systemFlags |= SF_SBLASTER; _skyMusic = new AdLibMusic(_mixer, _skyDisk); } else { _systemVars.systemFlags |= SF_ROLAND; - if ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")) - _skyMusic = new MT32Music(MidiDriver::createMidi(midiDriver), _skyDisk); + if ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")) + _skyMusic = new MT32Music(MidiDriver::createMidi(dev), _skyDisk); else - _skyMusic = new GmMusic(MidiDriver::createMidi(midiDriver), _skyDisk); + _skyMusic = new GmMusic(MidiDriver::createMidi(dev), _skyDisk); } if (isCDVersion()) { diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 8d11efef3c..e5a39308da 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -856,11 +856,11 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc) if (cd_num >= 0) _system->openCD(cd_num); - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - //bool adlib = (midiDriver == MD_ADLIB); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); + //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); - _driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(dev); if (native_mt32) _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp index 9dbef4d76f..5c1d687827 100644 --- a/engines/touche/midi.cpp +++ b/engines/touche/midi.cpp @@ -92,9 +92,9 @@ void MidiPlayer::setVolume(int volume) { } int MidiPlayer::open() { - MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - _driver = MidiDriver::createMidi(midiDriver); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); + _driver = MidiDriver::createMidi(dev); int ret = _driver->open(); if (ret == 0) { _parser = MidiParser::createParser_SMF(); diff --git a/gui/options.cpp b/gui/options.cpp index 7a69c6a25f..41a82ca89c 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -40,6 +40,7 @@ #include "graphics/scaler.h" #include "sound/mididrv.h" +#include "sound/musicplugin.h" #include "sound/mixer.h" #include "sound/fmopl.h" @@ -99,6 +100,8 @@ void OptionsDialog::init() { _aspectCheckbox = 0; _enableAudioSettings = false; _midiPopUp = 0; + _mt32DevicePopUp = 0; + _gmDevicePopUp = 0; _oplPopUp = 0; _outputRatePopUp = 0; _enableMIDISettings = false; @@ -133,6 +136,20 @@ void OptionsDialog::init() { } } +template bool prdEqualsDeviceProperty(MusicDevices::iterator d, T lookupProp, Common::MemFunc0 devicePropFunc) { + return lookupProp == devicePropFunc(&*d); +} + +bool prdMidiDefault(MusicDevices::iterator d, Common::String dom, bool, MusicPlugin::List::const_iterator&) { + return !(dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() == MT_TOWNS) ? true : false; +} + +bool prdMidiSpec(MusicDevices::iterator d, Common::String, bool isAutoPlugin, MusicPlugin::List::const_iterator &m) { + if (isAutoPlugin) + m++; + return ((d->getMusicType() >= MT_GM) || isAutoPlugin) ? true : false; +} + void OptionsDialog::open() { Dialog::open(); @@ -191,10 +208,25 @@ void OptionsDialog::open() { } // Audio options - if (_midiPopUp) { - // Music driver - MidiDriverType id = MidiDriver::parseMusicDriver(ConfMan.get("music_driver", _domain)); - _midiPopUp->setSelectedTag(id); + if (!loadMusicDeviceSetting(_midiPopUp, "music_driver", prdMidiDefault)) + _midiPopUp->setSelected(0); + + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", prdMidiSpec)) { + if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "", prdMidiSpec, MT_MT32)) + _mt32DevicePopUp->setSelected(0); + } else { + _mt32DevicePopUp->setSelected(0); + } + } + + if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device", prdMidiSpec)) { + if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { + if (!loadMusicDeviceSetting(_gmDevicePopUp, "", prdMidiSpec, MT_GM)) + _gmDevicePopUp->setSelected(0); + } else { + _gmDevicePopUp->setSelected(0); + } } if (_oplPopUp) { @@ -332,19 +364,9 @@ void OptionsDialog::close() { } // Audio options - if (_midiPopUp) { - if (_enableAudioSettings) { - const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); - while (md->name && md->id != (int)_midiPopUp->getSelectedTag()) - md++; - if (md->name) - ConfMan.set("music_driver", md->name, _domain); - else - ConfMan.removeKey("music_driver", _domain); - } else { - ConfMan.removeKey("music_driver", _domain); - } - } + saveMusicDeviceSetting(_midiPopUp, "music_driver", prdMidiDefault); + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", prdMidiSpec); + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", prdMidiSpec); if (_oplPopUp) { if (_enableAudioSettings) { @@ -495,14 +517,17 @@ void OptionsDialog::setGraphicSettingsState(bool enabled) { void OptionsDialog::setAudioSettingsState(bool enabled) { _enableAudioSettings = enabled; - _midiPopUpDesc->setEnabled(enabled); _midiPopUp->setEnabled(enabled); + _mt32DevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _mt32DevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _gmDevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _gmDevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); - uint32 allFlags = MidiDriver::midiDriverFlags2GUIO((uint32)-1); + uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1); if (_domain != Common::ConfigManager::kApplicationDomain && // global dialog - (_guioptions & allFlags) && // No flags are specified + (_guioptions & allFlags) && // No flags are specified !(_guioptions & Common::GUIO_MIDIADLIB)) { _oplPopUpDesc->setEnabled(false); _oplPopUp->setEnabled(false); @@ -623,19 +648,39 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:"), _("Specifies output sound device or sound card emulator")); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _(_domain == Common::ConfigManager::kApplicationDomain ? "Preferred Device:" : "Music Device:"), _(_domain == Common::ConfigManager::kApplicationDomain ? "Specifies preferred sound device or sound card emulator" : "Specifies output sound device or sound card emulator")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator")); + _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); + _mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup"); + _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General Midi output")); + _gmDevicePopUp = new PopUpWidget(boss, prefix + "auPrefGmPopup"); + // Populate it - const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); - uint32 allFlags = MidiDriver::midiDriverFlags2GUIO((uint32)-1); - - while (md->name) { - if (_domain == Common::ConfigManager::kApplicationDomain || // global dialog - !(_guioptions & allFlags) || // No flags are specified - _guioptions & (MidiDriver::midiDriverFlags2GUIO(md->flags))) // flag is present - _midiPopUp->appendEntry(_(md->description), md->id); - md++; + uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1); + + const MusicPlugin::List p = MusicMan.getPlugins(); + int musicId = 0; + int midiId = 0; + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || // global dialog - skip useless FM-Towns option there + (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) || // No flags are specified + _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType()))) // flag is present + _midiPopUp->appendEntry(d->getCompleteName(), musicId++); + if (d->getMusicType() >= MT_GM || m == p.begin()) { + _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); + _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId++); + } + } + } + + if (!_domain.equals(Common::ConfigManager::kApplicationDomain)) { + _mt32DevicePopUpDesc->setEnabled(false); + _mt32DevicePopUp->setEnabled(false); + _gmDevicePopUpDesc->setEnabled(false); + _gmDevicePopUp->setEnabled(false); } // The OPL emulator popup & a label @@ -745,6 +790,60 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _enableVolumeSettings = true; } +bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred, MusicType preferredType) { + if (!popup || !popup->isEnabled()) + return true; + + if (ConfMan.hasKey(setting, _domain) || preferredType) { + const Common::String drv = ConfMan.get(setting, _domain); + const MusicPlugin::List p = MusicMan.getPlugins(); + int id = 0; + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if ((setting.empty() && preferredType) ? prdEqualsDeviceProperty(d, preferredType, Common::mem_fun(&MusicDevice::getMusicType)) : prdEqualsDeviceProperty(d, drv, Common::mem_fun(&MusicDevice::getCompleteId))) { + popup->setSelected(id); + id = -1; + break; + } else if (pred(d, _domain, m == p.begin(), m)) { + id++; + } + } + } + if (id != -1) + // midi device turned off or whatever + return false; + } else { + return false; + } + + return true; +} + +void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred) { + if (!popup || !_enableAudioSettings) + return; + + const MusicPlugin::List p = MusicMan.getPlugins(); + uint32 id = 0; + bool found = false; + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && !found; m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (id == popup->getSelectedTag()) { + ConfMan.set(setting, d->getCompleteId(), _domain); + found = true; + break; + } else if (pred(d, _domain, m == p.begin(), m)) { + id++; + } + } + } + + if (!found) + ConfMan.removeKey(setting, _domain); +} + int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { if (_guioptions & Common::GUIO_NOSUBTITLES) return kSubtitlesSpeech; // Speech only diff --git a/gui/options.h b/gui/options.h index cc62a309b4..268b535e8a 100644 --- a/gui/options.h +++ b/gui/options.h @@ -28,6 +28,7 @@ #include "gui/dialog.h" #include "gui/TabWidget.h" #include "common/str.h" +#include "sound/musicplugin.h" #ifdef SMALL_SCREEN_DEVICE #include "gui/KeysDialog.h" @@ -78,6 +79,10 @@ protected: void setVolumeSettingsState(bool enabled); void setSubtitleSettingsState(bool enabled); + typedef bool (MidiSettingsExtraPred)(MusicDevices::iterator, Common::String, bool, MusicPlugin::List::const_iterator&); + bool loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred, MusicType preferredType = MT_NULL); + void saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred); + TabWidget *_tabWidget; int _graphicsTabId; @@ -104,6 +109,13 @@ private: StaticTextWidget *_outputRatePopUpDesc; PopUpWidget *_outputRatePopUp; + StaticTextWidget *_mt32DevicePopUpDesc; + PopUpWidget *_mt32DevicePopUp; + StaticTextWidget *_gmDevicePopUpDesc; + PopUpWidget *_gmDevicePopUp; + + + // // MIDI controls // diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 7d80884073..9554bdf799 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -615,6 +615,22 @@ "/> " " " " " +" " +" " +" " +" " +" " +" " +" " +" " " " @@ -1370,6 +1386,22 @@ "/> " " " " " +" " +" " +" " +" " +" " +" " +" " +" " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 080bed0612..67b3d7c041 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 56fa793797..80bc4bf41e 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -231,6 +231,22 @@ type = 'PopUp' /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "), MD_AUTO, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, - {"null", _s("No music"), MD_NULL, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, - -#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - {"windows", _s("Windows MIDI"), MD_WINDOWS, MDT_MIDI}, -#endif - -#if defined(UNIX) && defined(USE_ALSA) - {"alsa", _s("ALSA"), MD_ALSA, MDT_MIDI}, -#endif - -#if defined(__MINT__) - {"stmidi", _s("Atari ST MIDI"), MD_STMIDI, MDT_MIDI}, -#endif - -#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) && !defined(__MINT__) - {"seq", _s("SEQ"), MD_SEQ, MDT_MIDI}, -#endif - -#if defined(IRIX) - {"dmedia", _s("DMedia"), MD_DMEDIA, MDT_MIDI}, -#endif - -#if defined(__amigaos4__) - {"camd", _s("CAMD"), MD_CAMD, MDT_MIDI}, -#endif - -#if defined(MACOSX) - {"core", _s("CoreAudio"), MD_COREAUDIO, MDT_MIDI}, -// {"coreaudio", "CoreAudio", MD_COREAUDIO, MDT_MIDI}, - {"coremidi", _s("CoreMIDI"), MD_COREMIDI, MDT_MIDI}, -#endif - -#if defined(PALMOS_MODE) -# if defined(COMPILE_CLIE) - {"ypa1", _s("Yamaha Pa1"), MD_YPA1, MDT_MIDI}, -# elif defined(COMPILE_ZODIAC) && (!defined(ENABLE_SCUMM) || !defined(PALMOS_ARM)) - {"zodiac", _s("Tapwave Zodiac"), MD_ZODIAC, MDT_MIDI}, -# endif -#endif - -#ifdef USE_FLUIDSYNTH - {"fluidsynth", _s("FluidSynth"), MD_FLUIDSYNTH, MDT_MIDI}, -#endif -#ifdef USE_MT32EMU - {"mt32", _s("MT-32 Emulation"), MD_MT32, MDT_MIDI}, -#endif - - // The flags for the "adlib" driver indicates that it can do AdLib and MIDI. - {"adlib", _s("AdLib"), MD_ADLIB, MDT_ADLIB}, - {"pcspk", _s("PC Speaker"), MD_PCSPK, MDT_PCSPK}, - {"pcjr", _s("IBM PCjr"), MD_PCJR, MDT_PCSPK | MDT_PCJR}, - {"cms", _s("Creative Music System"), MD_CMS, MDT_CMS}, - {"towns", _s("FM Towns"), MD_TOWNS, MDT_TOWNS}, -#if defined(UNIX) - {"timidity", _s("TiMidity"), MD_TIMIDITY, MDT_MIDI}, -#endif - - {0, 0, MD_NULL, MDT_NONE} -}; +#include "sound/musicplugin.h" +#include "common/translation.h" const byte MidiDriver::_mt32ToGm[128] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F @@ -142,169 +56,190 @@ const byte MidiDriver::_gmToMt32[128] = { 101, 103, 100, 120, 117, 113, 99, 128, 128, 128, 128, 124, 123, 128, 128, 128, // 7x }; -const MidiDriverDescription *MidiDriver::getAvailableMidiDrivers() { - return s_musicDrivers; -} +static const uint32 GUIOMapping[] = { + MT_PCSPK, Common::GUIO_MIDIPCSPK, + /*MDT_CMS, Common::GUIO_MIDICMS,*/ + MT_PCJR, Common::GUIO_MIDIPCJR, + MT_ADLIB, Common::GUIO_MIDIADLIB, + MT_TOWNS, Common::GUIO_MIDITOWNS, + MT_GM, Common::GUIO_MIDIGM, + MT_MT32, Common::GUIO_MIDIMT32, + 0, 0 +}; + +uint32 MidiDriver::musicType2GUIO(uint32 musicType) { + uint32 res = 0; -const MidiDriverDescription *MidiDriver::findMusicDriver(const Common::String &str) { - if (str.empty()) - return 0; + for (int i = 0; GUIOMapping[i] || GUIOMapping[i + 1]; i += 2) { + if (musicType == GUIOMapping[i] || musicType == (uint32)-1) + res |= GUIOMapping[i + 1]; + } - const char *s = str.c_str(); - int len = 0; - const MidiDriverDescription *md = s_musicDrivers; + return res; +} - // Scan for string end or a colon - while (s[len] != 0 && s[len] != ':') - len++; +bool MidiDriver::_forceTypeMT32 = false; - while (md->name) { - // Compare the string passed to us with the current table entry. - // We ignore any characters following an (optional) colon ':' - // contained in str. - if (!scumm_strnicmp(md->name, s, len)) { - return md; +MusicType MidiDriver::getMusicType(MidiDriver::DeviceHandle handle) { + if (_forceTypeMT32) + return MT_MT32; + + if (handle) { + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (handle == d->getHandle()) + return d->getMusicType(); + } } - md++; } - - return 0; + + return MT_NULL; } -static MidiDriverType getDefaultMIDIDriver() { -#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - return MD_WINDOWS; -#elif defined(MACOSX) - return MD_COREAUDIO; -#elif defined(PALMOS_MODE) - #if defined(COMPILE_CLIE) - return MD_YPA1; - #elif defined(COMPILE_ZODIAC) - return MD_ZODIAC; - #else - return MD_NULL; - #endif -#else - return MD_NULL; -#endif -} +Common::String MidiDriver::getDeviceString(DeviceHandle handle, DeviceStringType type) { + if (handle) { + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (handle == d->getHandle()) { + if (type == kDriverName) + return d->getMusicDriverName(); + else if (type == kDriverId) + return d->getMusicDriverId(); + else if (type == kDeviceId) + return d->getCompleteId(); + else + return Common::String("auto"); + } + } + } + } -MidiDriverType MidiDriver::parseMusicDriver(const Common::String &str) { - const MidiDriverDescription *md = findMusicDriver(str); - if (md) - return md->id; - return MD_AUTO; + return Common::String("auto"); } -MidiDriverType MidiDriver::detectMusicDriver(int flags) { - MidiDriverType musicDriver; +MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { + // Query the selected music device (defaults to MT_AUTO device). + DeviceHandle hdl = getDeviceHandle(ConfMan.get("music_driver")); - // Query the selected music driver (defaults to MD_AUTO). - const MidiDriverDescription *md = findMusicDriver(ConfMan.get("music_driver")); + _forceTypeMT32 = false; // Check whether the selected music driver is compatible with the // given flags. - if (!md || !(md->flags & flags)) - musicDriver = MD_AUTO; - else - musicDriver = md->id; - - // If the selected driver is MD_AUTO, we try to determine - // a suitable and "optimal" music driver. - if (musicDriver == MD_AUTO) { - - if (flags & MDT_PREFER_MIDI) { - // A MIDI music driver is preferred. Of course this implies - // that MIDI is actually listed in flags, so we verify that. - assert(flags & MDT_MIDI); + switch (getMusicType(hdl)) { + case MT_PCSPK: + case MT_PCJR: + if (flags & MDT_PCSPK) + return hdl; + break; + + case MT_ADLIB: + if (flags & MDT_ADLIB) + return hdl; + break; + + case MT_TOWNS: + if (flags & MDT_TOWNS) + return hdl; + break; + + case MT_GM: + case MT_GS: + case MT_MT32: + if (flags & MDT_MIDI) + return hdl; + case MT_NULL: + if (getDeviceString(hdl, MidiDriver::kDriverId).equals("null")) + return 0; - // Query the default MIDI driver. It's possible that there - // is none, in which case we revert to AUTO mode. - musicDriver = getDefaultMIDIDriver(); - if (musicDriver == MD_NULL) - musicDriver = MD_AUTO; - } - - if (musicDriver == MD_AUTO) { - // MIDI is not preferred, or no default MIDI device is available. - // In this case we first try the alternate drivers before checking - // for a 'real' MIDI driver. + default: + break; + } - if (flags & MDT_TOWNS) - musicDriver = MD_TOWNS; - else if (flags & MDT_ADLIB) - musicDriver = MD_ADLIB; - else if (flags & MDT_PCSPK) - musicDriver = MD_PCJR; - else if (flags & MDT_MIDI) - musicDriver = getDefaultMIDIDriver(); - else - musicDriver = MD_NULL; + // If the selected driver did not match the flags setting, + // we try to determine a suitable and "optimal" music driver. + const MusicPlugin::List p = MusicMan.getPlugins(); + // If only MDT_MIDI but not MDT_PREFER_MIDI is set we prefer the other devices (which will always be + // detected since they are hard coded and cannot be disabled. + for (int l = (flags & MDT_PREFER_MIDI) ? 1 : 0; l < 2; l++) { + if ((flags & MDT_MIDI) && (l == 1)) { + // If a preferred MT32 or GM device has been selected that device gets returned + hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"), Common::ConfigManager::kApplicationDomain)); + if (getMusicType(hdl) != MT_NULL) { + if (flags & MDT_PREFER_MT32) + // If we have a preferred MT32 device we disable the gm/mt32 mapping (more about this in mididrv.h) + _forceTypeMT32 = true; + + return hdl; + } + + // If we have no specific device selected (neither in the scummvm nor in the game domain) + // and no preferred MT32 or GM device selected we arrive here. + // If MT32 is preferred we try for the first available device with music type 'MT_MT32' (usually the mt32 emulator) + if (flags & MDT_PREFER_MT32) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (getMusicType(hdl) == MT_MT32) + return hdl; + } + } + } + + // Now we default to the first available device with music type 'MT_GM' + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (getMusicType(hdl) == MT_GM || getMusicType(hdl) == MT_GS) + return hdl; + } + } + } + + MusicType tp = MT_NULL; + if (flags & MDT_TOWNS) + tp = MT_TOWNS; + else if (flags & MDT_ADLIB) + tp = MT_ADLIB; + else if (flags & MDT_PCSPK) + tp = MT_PCSPK; + else + tp = MT_NULL; + + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (d->getMusicType() == tp) + return d->getHandle(); + } } } - return musicDriver; + return hdl; } -MidiDriver *MidiDriver::createMidi(MidiDriverType midiDriver) { - switch (midiDriver) { - case MD_NULL: return MidiDriver_NULL_create(); - - case MD_ADLIB: return MidiDriver_ADLIB_create(); - - case MD_TOWNS: return MidiDriver_YM2612_create(); - - // Right now PC Speaker and PCjr are handled - // outside the MidiDriver architecture, so - // don't create anything for now. - case MD_PCSPK: - case MD_CMS: - case MD_PCJR: return NULL; - -#ifdef USE_FLUIDSYNTH - case MD_FLUIDSYNTH: return MidiDriver_FluidSynth_create(); -#endif - -#ifdef USE_MT32EMU - case MD_MT32: return MidiDriver_MT32_create(); -#endif - -#if defined(PALMOS_MODE) -#if defined(COMPILE_CLIE) - case MD_YPA1: return MidiDriver_YamahaPa1_create(); -#elif defined(COMPILE_ZODIAC) && (!defined(ENABLE_SCUMM) || !defined(PALMOS_ARM)) - case MD_ZODIAC: return MidiDriver_Zodiac_create(); -#endif -#endif - -#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - case MD_WINDOWS: return MidiDriver_WIN_create(); -#endif -#if defined(__MINT__) - case MD_STMIDI: return MidiDriver_STMIDI_create(); -#endif -#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) && !defined(__MINT__) - case MD_SEQ: return MidiDriver_SEQ_create(); -#endif -#if defined(UNIX) - case MD_TIMIDITY: return MidiDriver_TIMIDITY_create(); -#endif -#if defined(IRIX) - case MD_DMEDIA: return MidiDriver_DMEDIA_create(); -#endif -#if defined(MACOSX) - case MD_COREAUDIO: return MidiDriver_CORE_create(); - case MD_COREMIDI: return MidiDriver_CoreMIDI_create(); -#endif -#if defined(UNIX) && defined(USE_ALSA) - case MD_ALSA: return MidiDriver_ALSA_create(); -#endif -#if defined(__amigaos4__) - case MD_CAMD: return MidiDriver_CAMD_create(); -#endif - default: - error("Invalid midi driver selected"); +MidiDriver *MidiDriver::createMidi(MidiDriver::DeviceHandle handle) { + MidiDriver *driver = 0; + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + if (getDeviceString(handle, MidiDriver::kDriverId).equals((**m)->getId())) + (**m)->createInstance(&driver, handle); } + return driver; +} + +MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &identifier) { + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) + return d->getHandle(); + } + } - return NULL; + return getDeviceHandle("auto"); } diff --git a/sound/mididrv.h b/sound/mididrv.h index 2931e2571e..ee8ef449f0 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -30,6 +30,8 @@ #include "common/timer.h" class MidiChannel; +class MusicDevice; + namespace Audio { class Mixer; } @@ -43,56 +45,28 @@ namespace Common { class String; } * * @todo Rename MidiDriverType to MusicDriverType */ -enum MidiDriverType { - // Pseudo drivers - MD_AUTO, - MD_NULL, - - // Windows - MD_WINDOWS, - - // Atari ST - MD_STMIDI, - - // Linux - MD_ALSA, - MD_SEQ, - - // Mac OS X - MD_QTMUSIC, - MD_COREAUDIO, - MD_COREMIDI, - - // PalmOS - MD_YPA1, - MD_ZODIAC, - - // IRIX - MD_DMEDIA, - - // AMIGAOS4 - MD_CAMD, - - // MIDI softsynths - MD_FLUIDSYNTH, - MD_MT32, - - // "Fake" MIDI devices - MD_ADLIB, - MD_PCSPK, - MD_CMS, - MD_PCJR, - MD_TOWNS, - MD_TIMIDITY + +/** + * Music types that music drivers can implement and engines can rely on. + */ +enum MusicType { + MT_NULL = 0, // Null / Auto + MT_PCSPK = 1, // PC Speaker + MT_PCJR = 2, // PCjr + MT_ADLIB = 3, // AdLib + MT_TOWNS = 4, // FM-TOWNS + MT_GM = 5, // General MIDI + MT_MT32 = 6, // MT-32 + MT_GS = 7 // Roland GS }; /** - * A set of flags to be passed to detectMusicDriver() which can be used to + * A set of flags to be passed to detectDevice() which can be used to * specify what kind of music driver is preferred / accepted. * * The flags (except for MDT_PREFER_MIDI) indicate whether a given driver * type is acceptable. E.g. the TOWNS music driver could be returned by - * detectMusicDriver if and only if MDT_TOWNS is specified. + * detectDevice if and only if MDT_TOWNS is specified. * * @todo Rename MidiDriverFlags to MusicDriverFlags */ @@ -104,7 +78,9 @@ enum MidiDriverFlags { MDT_ADLIB = 1 << 3, // AdLib: Maps to MD_ADLIB MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MD_TOWNS MDT_MIDI = 1 << 5, // Real MIDI - MDT_PREFER_MIDI = 1 << 6 // Real MIDI output is preferred + MDT_PREFER_MIDI = 1 << 6, // Real MIDI output is preferred + MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred + MDT_PREFER_GM = 1 << 8 // GM output is preferred }; /** @@ -114,12 +90,6 @@ enum MidiDriverFlags { * * @todo Rename MidiDriverType to MusicDriverType */ -struct MidiDriverDescription { - const char *name; - const char *description; - MidiDriverType id; // A unique ID for each driver - int flags; // Capabilities of this driver -}; /** * Abstract MIDI Driver Class @@ -128,24 +98,41 @@ struct MidiDriverDescription { */ class MidiDriver { public: - /** Find the music driver matching the given driver name/description. */ - static const MidiDriverDescription *findMusicDriver(const Common::String &str); + typedef uint32 DeviceHandle; - /** Get the id of the music driver matching the given driver name, or MD_AUTO if there is no match. */ - static MidiDriverType parseMusicDriver(const Common::String &str); + enum DeviceStringType { + kDriverName, + kDriverId, + kDeviceId + }; - static uint32 midiDriverFlags2GUIO(uint32 flags); + static uint32 musicType2GUIO(uint32 musicType); + /** Create music driver matching the given device handle, or MT_AUTO if there is no match. */ + static MidiDriver *createMidi(DeviceHandle handle); + + /** Returnd device handle based on the present devices and the flags parameter. + / * Returns NULl if the matching device is the null or auto device. */ + static DeviceHandle detectDevice(int flags); + /** - * Get a list of all available MidiDriver types. - * @return list of all available midi drivers, terminated by a zero entry + * Find the music driver matching the given driver name/description. */ - static const MidiDriverDescription *getAvailableMidiDrivers(); + static DeviceHandle getDeviceHandle(const Common::String &identifier); - static MidiDriver *createMidi(MidiDriverType midiDriver); + /** Get the music type matching the given device handle, or MT_AUTO if there is no match. */ + static MusicType getMusicType(DeviceHandle handle); - static MidiDriverType detectMusicDriver(int flags); + /** Get the device string matching the given device handle and the given type. */ + static Common::String getDeviceString(DeviceHandle handle, DeviceStringType type); +private: + // If detectDevice() detects MT32 and we have a preferred MT32 device + // we use this to force getMusicType() to return MT_MT32 so that we don't + // have to rely on the 'True Roland MT-32' config manager setting (since nobody + // would possibly think about activating 'True Roland MT-32' when he has set + // 'Music Driver' to '>default>') + static bool _forceTypeMT32; public: virtual ~MidiDriver() { } @@ -274,28 +261,4 @@ public: virtual void sysEx_customInstrument(uint32 type, const byte *instr) = 0; }; - -// Factory functions, for faster compile -extern MidiDriver *MidiDriver_NULL_create(); -extern MidiDriver *MidiDriver_ADLIB_create(); -extern MidiDriver *MidiDriver_WIN_create(); -extern MidiDriver *MidiDriver_STMIDI_create(); -extern MidiDriver *MidiDriver_SEQ_create(); -extern MidiDriver *MidiDriver_TIMIDITY_create(); -extern MidiDriver *MidiDriver_QT_create(); -extern MidiDriver *MidiDriver_CORE_create(); -extern MidiDriver *MidiDriver_CoreMIDI_create(); -extern MidiDriver *MidiDriver_ALSA_create(); -extern MidiDriver *MidiDriver_DMEDIA_create(); -extern MidiDriver *MidiDriver_CAMD_create(); -extern MidiDriver *MidiDriver_YM2612_create(); -#ifdef USE_FLUIDSYNTH -extern MidiDriver *MidiDriver_FluidSynth_create(); -#endif -#ifdef USE_MT32EMU -extern MidiDriver *MidiDriver_MT32_create(); -#endif -extern MidiDriver *MidiDriver_YamahaPa1_create(); -extern MidiDriver *MidiDriver_Zodiac_create(); - #endif diff --git a/sound/musicplugin.cpp b/sound/musicplugin.cpp index b4754230da..7b5b6608ea 100644 --- a/sound/musicplugin.cpp +++ b/sound/musicplugin.cpp @@ -24,10 +24,12 @@ */ #include "sound/musicplugin.h" +#include "common/hash-str.h" +#include "common/translation.h" MusicDevice::MusicDevice(MusicPluginObject const *musicPlugin, Common::String name, MusicType mt) : - _musicDriverName(musicPlugin->getName()), _musicDriverId(musicPlugin->getId()), - _name(name), _type(mt) { + _musicDriverName(_(musicPlugin->getName())), _musicDriverId(musicPlugin->getId()), + _name(_(name)), _type(mt) { } Common::String MusicDevice::getCompleteName() { @@ -46,3 +48,19 @@ Common::String MusicDevice::getCompleteName() { return name; } + +Common::String MusicDevice::getCompleteId() { + Common::String id = _musicDriverId; + if (!_name.empty()) { + id += "_"; + id += _name; + } + + return id; +} + +MidiDriver::DeviceHandle MusicDevice::getHandle() { + if (_musicDriverId.equals("auto") || _musicDriverId.equals("null")) + return 0; + return (MidiDriver::DeviceHandle)Common::hashit(getCompleteId().c_str()); +} diff --git a/sound/musicplugin.h b/sound/musicplugin.h index df97494a90..3823f2fd3d 100644 --- a/sound/musicplugin.h +++ b/sound/musicplugin.h @@ -29,19 +29,6 @@ #include "sound/mididrv.h" #include "common/list.h" -/** - * Music types that music drivers can implement and engines can rely on. - */ -enum MusicType { - MT_PCSPK = 1, // PC Speaker - MT_PCJR = 2, // PCjr - MT_ADLIB = 3, // AdLib - MT_TOWNS = 4, // FM-TOWNS - MT_GM = 5, // General MIDI - MT_MT32 = 6, // MT-32 - MT_GS = 7 // Roland GS -}; - class MusicPluginObject; /** @@ -63,6 +50,14 @@ public: * device name (if it isn't the default one) and the name of the driver. */ Common::String getCompleteName(); + + /** + * Returns a user readable string that contains the name of the current + * device name (if it isn't the default one) and the id of the driver. + */ + Common::String getCompleteId(); + + MidiDriver::DeviceHandle getHandle(); private: Common::String _name; @@ -94,15 +89,18 @@ public: virtual MusicDevices getDevices() const = 0; /** - * Tries to instantiate a MIDI Driver instance based on the settings of - * the currently active ConfMan target. That is, the MusicPluginObject - * should query the ConfMan singleton for the device name, port, etc. + * Tries to instantiate a MIDI Driver instance based on the device + * previously detected via MidiDriver::detectDevice() * * @param mididriver Pointer to a pointer which the MusicPluginObject sets * to the newly create MidiDriver, or 0 in case of an error + * + * @param dev Pointer to a device to be used then creating the driver instance. + * Default value of zero for driver types without devices. + * * @return a Common::Error describing the error which occurred, or kNoError */ - virtual Common::Error createInstance(MidiDriver **mididriver) const = 0; + virtual Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const = 0; }; diff --git a/sound/null.cpp b/sound/null.cpp index 00a5f5e488..775a0e2fcb 100644 --- a/sound/null.cpp +++ b/sound/null.cpp @@ -24,6 +24,7 @@ #include "sound/musicplugin.h" #include "sound/mpu401.h" +#include "common/translation.h" /* NULL driver */ class MidiDriver_NULL : public MidiDriver_MPU401 { @@ -37,19 +38,19 @@ public: class NullMusicPlugin : public MusicPluginObject { public: - const char *getName() const { - return "No music"; + virtual const char *getName() const { + return _s("No music"); } - const char *getId() const { + virtual const char *getId() const { return "null"; } - MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + virtual MusicDevices getDevices() const; + virtual Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; -Common::Error NullMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error NullMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_NULL(); return Common::kNoError; @@ -57,28 +58,24 @@ Common::Error NullMusicPlugin::createInstance(MidiDriver **mididriver) const { MusicDevices NullMusicPlugin::getDevices() const { MusicDevices devices; - // TODO: return a different music type? - devices.push_back(MusicDevice(this, "", MT_GM)); + devices.push_back(MusicDevice(this, _s(""), MT_NULL)); return devices; } -MidiDriver *MidiDriver_NULL_create() { - MidiDriver *mididriver; - - NullMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} +class AutoMusicPlugin : public NullMusicPlugin { +public: + const char *getName() const { + return _s(""); + } -#ifdef DISABLE_ADLIB -MidiDriver *MidiDriver_ADLIB_create() { - return MidiDriver_NULL_create(); -} -#endif + const char *getId() const { + return "auto"; + } +}; //#if PLUGIN_ENABLED_DYNAMIC(NULL) //REGISTER_PLUGIN_DYNAMIC(NULL, PLUGIN_TYPE_MUSIC, NullMusicPlugin); //#else + REGISTER_PLUGIN_STATIC(AUTO, PLUGIN_TYPE_MUSIC, AutoMusicPlugin); REGISTER_PLUGIN_STATIC(NULL, PLUGIN_TYPE_MUSIC, NullMusicPlugin); //#endif diff --git a/sound/softsynth/adlib.cpp b/sound/softsynth/adlib.cpp index 6697cef646..ffb359e816 100644 --- a/sound/softsynth/adlib.cpp +++ b/sound/softsynth/adlib.cpp @@ -27,6 +27,7 @@ #include "common/util.h" #include "sound/fmopl.h" #include "sound/musicplugin.h" +#include "common/translation.h" #ifdef DEBUG_ADLIB static int tick; @@ -1586,7 +1587,7 @@ void MidiDriver_ADLIB::adlib_note_on(int chan, byte note, int mod) { class AdLibEmuMusicPlugin : public MusicPluginObject { public: const char *getName() const { - return "AdLib Emulator"; + return _s("AdLib Emulator"); } const char *getId() const { @@ -1594,7 +1595,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices AdLibEmuMusicPlugin::getDevices() const { @@ -1603,21 +1604,12 @@ MusicDevices AdLibEmuMusicPlugin::getDevices() const { return devices; } -Common::Error AdLibEmuMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error AdLibEmuMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_ADLIB(g_system->getMixer()); return Common::kNoError; } -MidiDriver *MidiDriver_ADLIB_create() { - MidiDriver *mididriver; - - AdLibEmuMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(ADLIB) //REGISTER_PLUGIN_DYNAMIC(ADLIB, PLUGIN_TYPE_MUSIC, AdLibEmuMusicPlugin); //#else diff --git a/sound/softsynth/fluidsynth.cpp b/sound/softsynth/fluidsynth.cpp index c3bd782cc1..fcb4591a20 100644 --- a/sound/softsynth/fluidsynth.cpp +++ b/sound/softsynth/fluidsynth.cpp @@ -230,7 +230,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices FluidSynthMusicPlugin::getDevices() const { @@ -239,21 +239,12 @@ MusicDevices FluidSynthMusicPlugin::getDevices() const { return devices; } -Common::Error FluidSynthMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error FluidSynthMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_FluidSynth(g_system->getMixer()); return Common::kNoError; } -MidiDriver *MidiDriver_FluidSynth_create() { - MidiDriver *mididriver; - - FluidSynthMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(FLUIDSYNTH) //REGISTER_PLUGIN_DYNAMIC(FLUIDSYNTH, PLUGIN_TYPE_MUSIC, FluidSynthMusicPlugin); //#else diff --git a/sound/softsynth/mt32.cpp b/sound/softsynth/mt32.cpp index 612dce06b0..95263a040d 100644 --- a/sound/softsynth/mt32.cpp +++ b/sound/softsynth/mt32.cpp @@ -39,6 +39,7 @@ #include "common/system.h" #include "common/util.h" #include "common/archive.h" +#include "common/translation.h" #include "graphics/fontman.h" #include "graphics/surface.h" @@ -323,7 +324,7 @@ int MidiDriver_MT32::open() { } _initialising = true; - drawMessage(-1, "Initialising MT-32 Emulator"); + drawMessage(-1, _s("Initialising MT-32 Emulator")); if (!_synth->open(prop)) return MERR_DEVICE_NOT_AVAILABLE; _initialising = false; @@ -537,7 +538,7 @@ void MidiDriver_ThreadedMT32::onTimer() { class MT32EmuMusicPlugin : public MusicPluginObject { public: const char *getName() const { - return "MT-32 Emulator"; + return _s("MT-32 Emulator"); } const char *getId() const { @@ -545,7 +546,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices MT32EmuMusicPlugin::getDevices() const { @@ -554,23 +555,13 @@ MusicDevices MT32EmuMusicPlugin::getDevices() const { return devices; } -Common::Error MT32EmuMusicPlugin::createInstance(MidiDriver **mididriver) const { - *mididriver = new MidiDriver_MT32(g_system->getMixer()); - - return Common::kNoError; -} - -MidiDriver *MidiDriver_MT32_create() { - // HACK: It will stay here until engine plugin loader overhaul +Common::Error MT32EmuMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { if (ConfMan.hasKey("extrapath")) SearchMan.addDirectory("extrapath", ConfMan.get("extrapath")); - MidiDriver *mididriver; - - MT32EmuMusicPlugin p; - p.createInstance(&mididriver); + *mididriver = new MidiDriver_MT32(g_system->getMixer()); - return mididriver; + return Common::kNoError; } //#if PLUGIN_ENABLED_DYNAMIC(MT32) diff --git a/sound/softsynth/ym2612.cpp b/sound/softsynth/ym2612.cpp index e337bc4ab9..08331c6244 100644 --- a/sound/softsynth/ym2612.cpp +++ b/sound/softsynth/ym2612.cpp @@ -27,6 +27,7 @@ #include "sound/softsynth/ym2612.h" #include "common/util.h" #include "sound/musicplugin.h" +#include "common/translation.h" //////////////////////////////////////// // @@ -758,7 +759,7 @@ void MidiDriver_YM2612::removeLookupTables() { class TownsEmuMusicPlugin : public MusicPluginObject { public: const char *getName() const { - return "FM Towns Emulator"; + return _s("FM Towns Emulator"); } const char *getId() const { @@ -766,7 +767,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices TownsEmuMusicPlugin::getDevices() const { @@ -775,21 +776,12 @@ MusicDevices TownsEmuMusicPlugin::getDevices() const { return devices; } -Common::Error TownsEmuMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error TownsEmuMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_YM2612(g_system->getMixer()); return Common::kNoError; } -MidiDriver *MidiDriver_YM2612_create() { - MidiDriver *mididriver; - - TownsEmuMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(TOWNS) //REGISTER_PLUGIN_DYNAMIC(TOWNS, PLUGIN_TYPE_MUSIC, TownsEmuMusicPlugin); //#else -- cgit v1.2.3 From 6c854f30da2579c8e7059948c700fd0bcc72366d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 21 Jun 2010 21:37:00 +0000 Subject: PSP: Whitespace fix (and rewrap overlong line for readability) svn-id: r50129 --- backends/platform/psp/rtc.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backends/platform/psp/rtc.h b/backends/platform/psp/rtc.h index 3f2d52ff16..7c1a28474d 100644 --- a/backends/platform/psp/rtc.h +++ b/backends/platform/psp/rtc.h @@ -28,7 +28,7 @@ #include "common/singleton.h" -class PspRtc : public Common::Singleton{ +class PspRtc : public Common::Singleton { private: uint32 _startMillis; uint32 _startMicros; @@ -36,7 +36,12 @@ private: uint32 _milliOffset; // to prevent looping around of millis bool _looped; // make sure we only loop once - for threading public: - PspRtc() : _startMillis(0), _startMicros(0), _lastMillis(0), _milliOffset(0), _looped(false) { init(); } + PspRtc() + : _startMillis(0), _startMicros(0), + _lastMillis(0), _milliOffset(0), + _looped(false) { + init(); + } void init(); uint32 getMillis(); uint32 getMicros(); -- cgit v1.2.3 From 1041067a0c1ca2ac528338d99eaa1df677538265 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 22:07:03 +0000 Subject: SCI: instead of queueing inside midiparser, we are queueing now globally in SciMusic, also some little cleanup svn-id: r50130 --- engines/sci/sound/midiparser_sci.cpp | 60 +++++++++++------------ engines/sci/sound/midiparser_sci.h | 19 ++++---- engines/sci/sound/music.cpp | 94 ++++++++++++++++++++++++++---------- engines/sci/sound/music.h | 14 +++++- 4 files changed, 117 insertions(+), 70 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 9a6be1e1df..4766118f52 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -61,14 +61,20 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : _dataincToAdd = 0; _resetOnPause = false; _pSnd = 0; - - _manualCommandCount = 0; } MidiParser_SCI::~MidiParser_SCI() { unloadMusic(); } +void MidiParser_SCI::mainThreadBegin() { + _mainThreadCalled = true; +} + +void MidiParser_SCI::mainThreadEnd() { + _mainThreadCalled = false; +} + bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, int channelFilterMask, SciVersion soundVersion) { unloadMusic(); _track = track; @@ -107,7 +113,7 @@ void MidiParser_SCI::sendInitCommands() { byte voiceCount = 0; if (_channelUsed[i]) { voiceCount = _pSnd->soundRes->getInitialVoiceCount(i); - sendToDriverQueue(0xB0 | i, 0x4B, voiceCount); + sendToDriver(0xB0 | i, 0x4B, voiceCount); } } } @@ -115,7 +121,8 @@ void MidiParser_SCI::sendInitCommands() { // Send a velocity off signal to all channels for (int i = 0; i < 15; ++i) { - sendToDriverQueue(0xB0 | i, 0x4E, 0); // Reset velocity + if (_channelUsed[i]) + sendToDriver(0xB0 | i, 0x4E, 0); // Reset velocity } } @@ -145,44 +152,27 @@ void MidiParser_SCI::unloadMusic() { } } -// this is used for scripts sending direct midi commands to us. we verify in that case that the channel is actually -// used and actually store the command for getting really sent when being onTimer() -void MidiParser_SCI::sendToDriverQueue(uint32 b) { - byte midiChannel = b & 0xf; +// this is used for scripts sending midi commands to us. we verify in that case that the channel is actually +// used, so that channel remapping will work as well and then send them on +void MidiParser_SCI::sendFromScriptToDriver(uint32 midi) { + byte midiChannel = midi & 0xf; if (!_channelUsed[midiChannel]) { // trying to send to an unused channel // this happens for cmdSendMidi at least in sq1vga right at the start, it's a script issue return; } - - if (_manualCommandCount >= 200) - error("driver queue is full"); - _manualCommands[_manualCommandCount] = b; - _manualCommandCount++; + sendToDriver(midi); } -// This sends the stored commands from queue to driver (is supposed to get called only during onTimer()) -// at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get -// a crash during piano scene in lsl5) -void MidiParser_SCI::sendQueueToDriver() { - int curCommand = 0; +void MidiParser_SCI::sendToDriver(uint32 midi) { + byte midiChannel = midi & 0xf; - while (curCommand < _manualCommandCount) { - sendToDriver(_manualCommands[curCommand]); - curCommand++; - } - _manualCommandCount = 0; -} - -void MidiParser_SCI::sendToDriver(uint32 b) { - byte midiChannel = b & 0xf; - - if ((b & 0xFFF0) == 0x4EB0) { + if ((midi & 0xFFF0) == 0x4EB0) { // this is channel mute only for sci1 // it's velocity control for sci0 if (_soundVersion >= SCI_VERSION_1_EARLY) { - _channelMuted[midiChannel] = b & 0xFF0000 ? true : false; + _channelMuted[midiChannel] = midi & 0xFF0000 ? true : false; return; // don't send this to driver at all } } @@ -194,8 +184,11 @@ void MidiParser_SCI::sendToDriver(uint32 b) { int16 realChannel = _channelRemap[midiChannel]; assert(realChannel != -1); - b = (b & 0xFFFFFFF0) | realChannel; - _driver->send(b); + midi = (midi & 0xFFFFFFF0) | realChannel; + if (_mainThreadCalled) + _music->putMidiCommandInQueue(midi); + else + _driver->send(midi); } void MidiParser_SCI::parseNextEvent(EventInfo &info) { @@ -681,7 +674,8 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_LATE: // sending volume change to all used channels for (int i = 0; i < 15; i++) - sendToDriverQueue(0xB0 + i, 7, _volume); + if (_channelUsed[i]) + sendToDriver(0xB0 + i, 7, _volume); break; default: diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 5abffdb3a1..dbd37018b1 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -55,6 +55,10 @@ class MidiParser_SCI : public MidiParser { public: MidiParser_SCI(SciVersion soundVersion, SciMusic *music); ~MidiParser_SCI(); + + void mainThreadBegin(); + void mainThreadEnd(); + bool loadMusic(SoundResource::Track *track, MusicEntry *psnd, int channelFilterMask, SciVersion soundVersion); bool loadMusic(byte *, uint32) { return false; @@ -77,16 +81,11 @@ public: const byte *getMixedData() const { return _mixedData; } void tryToOwnChannels(); - void sendToDriver(uint32 b); + void sendFromScriptToDriver(uint32 midi); + void sendToDriver(uint32 midi); void sendToDriver(byte status, byte firstOp, byte secondOp) { sendToDriver(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); } - void sendToDriverQueue(uint32 b); - void sendToDriverQueue(byte status, byte firstOp, byte secondOp) { - sendToDriverQueue(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); - } - - void sendQueueToDriver(); protected: void parseNextEvent(EventInfo &info); @@ -96,6 +95,9 @@ protected: SciMusic *_music; + // this is set, when main thread calls us -> we send commands to queue instead to driver + bool _mainThreadCalled; + SciVersion _soundVersion; byte *_mixedData; SoundResource::Track *_track; @@ -112,9 +114,6 @@ protected: bool _channelUsed[16]; int16 _channelRemap[16]; bool _channelMuted[16]; - - int _manualCommandCount; - uint32 _manualCommands[200]; }; } // End of namespace Sci diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 6c697c86e5..b6ab7f9f70 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -46,6 +46,8 @@ SciMusic::SciMusic(SciVersion soundVersion) for (int i = 0; i < 16; i++) _usedChannel[i] = 0; + + _queuedCommandCount = 0; } SciMusic::~SciMusic() { @@ -102,6 +104,49 @@ void SciMusic::init() { _driverFirstChannel = _pMidiDrv->getFirstChannel(); } +void SciMusic::miditimerCallback(void *p) { + SciMusic *sciMusic = (SciMusic *)p; + + Common::StackLock lock(sciMusic->_mutex); + sciMusic->onTimer(); +} + +void SciMusic::onTimer() { + const MusicList::iterator end = _playList.end(); + // sending out queued commands that were "sent" via main thread + sendMidiCommandsFromQueue(); + + for (MusicList::iterator i = _playList.begin(); i != end; ++i) + (*i)->onTimer(); + + // for sending out fade commands immediately + sendMidiCommandsFromQueue(); +} + +void SciMusic::putMidiCommandInQueue(byte status, byte firstOp, byte secondOp) { + putMidiCommandInQueue(status | ((uint32)firstOp << 8) | ((uint32)secondOp << 16)); +} + +void SciMusic::putMidiCommandInQueue(uint32 midi) { + if (_queuedCommandCount >= 1000) + error("driver queue is full"); + _queuedCommands[_queuedCommandCount] = midi; + _queuedCommandCount++; +} + +// This sends the stored commands from queue to driver (is supposed to get called only during onTimer()) +// at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get +// a crash during piano scene in lsl5) +void SciMusic::sendMidiCommandsFromQueue() { + int curCommand = 0; + + while (curCommand < _queuedCommandCount) { + _pMidiDrv->send(_queuedCommands[curCommand]); + curCommand++; + } + _queuedCommandCount = 0; +} + void SciMusic::clearPlayList() { Common::StackLock lock(_mutex); @@ -127,14 +172,6 @@ void SciMusic::stopAll() { } } - -void SciMusic::miditimerCallback(void *p) { - SciMusic *aud = (SciMusic *)p; - - Common::StackLock lock(aud->_mutex); - aud->onTimer(); -} - void SciMusic::soundSetSoundOn(bool soundOnFlag) { Common::StackLock lock(_mutex); @@ -219,8 +256,10 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { // Find out what channels to filter for SCI0 channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayId(), _pMidiDrv->hasRhythmChannel()); - pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion); + pSnd->pMidiParser->mainThreadBegin(); + pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion); + pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } } @@ -255,12 +294,6 @@ void SciMusic::freeChannels(MusicEntry *caller) { } } -void SciMusic::onTimer() { - const MusicList::iterator end = _playList.end(); - for (MusicList::iterator i = _playList.begin(); i != end; ++i) - (*i)->onTimer(); -} - void SciMusic::soundPlay(MusicEntry *pSnd) { _mutex.lock(); @@ -316,18 +349,21 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { DisposeAfterUse::NO); } } else { - _mutex.lock(); if (pSnd->pMidiParser) { + _mutex.lock(); + pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->tryToOwnChannels(); pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSoundStopped) { pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->jumpToTick(0); - } else + } else { // Fast forward to the last position and perform associated events when loading pSnd->pMidiParser->jumpToTick(pSnd->ticker, true); + } + pSnd->pMidiParser->mainThreadEnd(); + _mutex.unlock(); } - _mutex.unlock(); } pSnd->status = kSoundPlaying; @@ -342,8 +378,10 @@ void SciMusic::soundStop(MusicEntry *pSnd) { if (pSnd->pMidiParser) { _mutex.lock(); + pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->stop(); freeChannels(pSnd); + pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } } @@ -354,7 +392,9 @@ void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) { _pMixer->setChannelVolume(pSnd->hCurrentAud, volume * 2); // Mixer is 0-255, SCI is 0-127 } else if (pSnd->pMidiParser) { _mutex.lock(); + pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->setVolume(volume); + pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } } @@ -369,13 +409,15 @@ void SciMusic::soundSetPriority(MusicEntry *pSnd, byte prio) { void SciMusic::soundKill(MusicEntry *pSnd) { pSnd->status = kSoundStopped; - _mutex.lock(); if (pSnd->pMidiParser) { + _mutex.lock(); + pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->unloadMusic(); + pSnd->pMidiParser->mainThreadEnd(); delete pSnd->pMidiParser; pSnd->pMidiParser = NULL; + _mutex.unlock(); } - _mutex.unlock(); if (pSnd->pStreamAud) { _pMixer->stopHandle(pSnd->hCurrentAud); @@ -409,8 +451,10 @@ void SciMusic::soundPause(MusicEntry *pSnd) { } else { if (pSnd->pMidiParser) { _mutex.lock(); + pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->pause(); freeChannels(pSnd); + pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } } @@ -458,10 +502,12 @@ void SciMusic::sendMidiCommand(uint32 cmd) { void SciMusic::sendMidiCommand(MusicEntry *pSnd, uint32 cmd) { Common::StackLock lock(_mutex); - if (pSnd->pMidiParser) - pSnd->pMidiParser->sendToDriverQueue(cmd); - else + if (!pSnd->pMidiParser) error("tried to cmdSendMidi on non midi slot (%04x:%04x)", PRINT_REG(pSnd->soundObj)); + + pSnd->pMidiParser->mainThreadBegin(); + pSnd->pMidiParser->sendFromScriptToDriver(cmd); + pSnd->pMidiParser->mainThreadEnd(); } void SciMusic::printPlayList(Console *con) { @@ -567,8 +613,6 @@ void MusicEntry::onTimer() { // Only process MIDI streams in this thread, not digital sound effects if (pMidiParser) { - // Process manual commands first - pMidiParser->sendQueueToDriver(); pMidiParser->onTimer(); ticker = (uint16)pMidiParser->getTick(); } diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 36db9a04bf..0a461cf76e 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -132,7 +132,15 @@ public: ~SciMusic(); void init(); + void onTimer(); + void putMidiCommandInQueue(byte status, byte firstOp, byte secondOp); + void putMidiCommandInQueue(uint32 midi); +private: + static void miditimerCallback(void *p); + void sendMidiCommandsFromQueue(); + +public: void clearPlayList(); void pauseAll(bool pause); void stopAll(); @@ -209,14 +217,16 @@ protected: // Mixed AdLib/MIDI mode: when enabled from the ScummVM sound options screen, // and a sound has a digital track, the sound from the AdLib track is played bool _bMultiMidi; -private: - static void miditimerCallback(void *p); +private: MusicList _playList; bool _soundOn; byte _masterVolume; MusicEntry *_usedChannel[16]; + int _queuedCommandCount; + uint32 _queuedCommands[1000]; + int _driverFirstChannel; }; -- cgit v1.2.3 From b5dffc5aa33466bdaf5bd06c4a24d7b1b4194ff3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 21 Jun 2010 22:15:33 +0000 Subject: SCI: fades already send out commands directly svn-id: r50131 --- engines/sci/sound/music.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index b6ab7f9f70..38d4968fee 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -118,9 +118,6 @@ void SciMusic::onTimer() { for (MusicList::iterator i = _playList.begin(); i != end; ++i) (*i)->onTimer(); - - // for sending out fade commands immediately - sendMidiCommandsFromQueue(); } void SciMusic::putMidiCommandInQueue(byte status, byte firstOp, byte secondOp) { -- cgit v1.2.3 From 727841ef913bbf61d035847b705ba47e488c57aa Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 21 Jun 2010 22:58:33 +0000 Subject: In SCI32, kDoAudio subop 10 is no longer CD audio. Just stub it off for now. svn-id: r50134 --- engines/sci/engine/ksound.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 0d08cc2e06..46f9aa95d8 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -174,21 +174,30 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { } break; case kSciAudioCD: - debugC(2, kDebugLevelSound, "kDoAudio: CD audio subop"); - return kDoCdAudio(s, argc - 1, argv + 1); + + if (getSciVersion() <= SCI_VERSION_1_1) { + debugC(2, kDebugLevelSound, "kDoAudio: CD audio subop"); + return kDoCdAudio(s, argc - 1, argv + 1); +#ifdef ENABLE_SCI32 + } else { + // TODO: This isn't CD Audio in SCI32 anymore + warning("kDoAudio: Unhandled case 10, %d extra arguments passed", argc - 1); + break; +#endif + } // 3 new subops in Pharkas. kDoAudio in Pharkas sits at seg026:038C case 11: - warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + warning("kDoAudio: Unhandled case 11, %d extra arguments passed", argc - 1); break; case 12: // Seems to be audio sync, used in Pharkas. Silenced the warning due to // the high level of spam it produces. - //warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + //warning("kDoAudio: Unhandled case 12, %d extra arguments passed", argc - 1); break; case 13: // Used in Pharkas whenever a speech sample starts - warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); + warning("kDoAudio: Unhandled case 13, %d extra arguments passed", argc - 1); break; default: warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); -- cgit v1.2.3 From e3b3641db22ba38177a66d2ff73f342075f0687b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 22 Jun 2010 05:10:43 +0000 Subject: Finish implementation of the jspit elevator logic. svn-id: r50136 --- engines/mohawk/riven_external.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 4e6bba1c2a..8ba4361f3f 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -1043,8 +1043,10 @@ int RivenExternal::jspitElevatorLoop() { void RivenExternal::xhandlecontrolup(uint16 argc, uint16 *argv) { int changeLevel = jspitElevatorLoop(); + // If we've moved the handle down, go down a floor if (changeLevel == -1) { - // TODO: Run movie + _vm->_video->playMovieBlocking(1); + _vm->_video->playMovieBlocking(2); _vm->changeToCard(_vm->matchRMAPToCard(0x1e374)); } } @@ -1052,8 +1054,10 @@ void RivenExternal::xhandlecontrolup(uint16 argc, uint16 *argv) { void RivenExternal::xhandlecontroldown(uint16 argc, uint16 *argv) { int changeLevel = jspitElevatorLoop(); + // If we've moved the handle up, go up a floor if (changeLevel == 1) { - // TODO: Run movie + _vm->_video->playMovieBlocking(1); + _vm->_video->playMovieBlocking(2); _vm->changeToCard(_vm->matchRMAPToCard(0x1e374)); } } @@ -1061,11 +1065,29 @@ void RivenExternal::xhandlecontroldown(uint16 argc, uint16 *argv) { void RivenExternal::xhandlecontrolmid(uint16 argc, uint16 *argv) { int changeLevel = jspitElevatorLoop(); + if (changeLevel == 0) + return; + + // Play the handle moving video + if (changeLevel == 1) + _vm->_video->playMovieBlocking(7); + else + _vm->_video->playMovieBlocking(6); + + // If the whark's mouth is open, close it + uint32 *mouthVar = _vm->matchVarToString("jwmouth"); + if (*mouthVar == 1) { + _vm->_video->playMovieBlocking(3); + _vm->_video->playMovieBlocking(8); + *mouthVar = 0; + } + + // Play the elevator video and then change the card if (changeLevel == 1) { - // TODO: Run movie + _vm->_video->playMovieBlocking(5); _vm->changeToCard(_vm->matchRMAPToCard(0x1e597)); - } else if (changeLevel == -1) { - // TODO: Run movie + } else { + _vm->_video->playMovieBlocking(4); _vm->changeToCard(_vm->matchRMAPToCard(0x1e29c)); } } -- cgit v1.2.3 From 53b82298e8236938d8724f904d2baba1f67b9eb1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 22 Jun 2010 08:57:25 +0000 Subject: Stop saving the buffer, script and heap sizes of each script in saved games svn-id: r50137 --- engines/sci/engine/savegame.cpp | 17 +++++++++++------ engines/sci/engine/savegame.h | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index fb79056e0c..d6cbd32eae 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -520,9 +520,12 @@ void HunkTable::saveLoadWithSerializer(Common::Serializer &s) { void Script::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_nr); - s.syncAsUint32LE(_bufSize); - s.syncAsUint32LE(_scriptSize); - s.syncAsUint32LE(_heapSize); + + if (s.isLoading()) + init(_nr, g_sci->getResMan()); + s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _bufSize + s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _scriptSize + s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _heapSize if (s.getVersion() <= 10) { assert((s.isLoading())); @@ -775,9 +778,11 @@ void SegManager::reconstructScripts(EngineState *s) { Object *obj = scr->scriptObjInit(addr, false); if (getSciVersion() < SCI_VERSION_1_1) { - if (!obj->initBaseObject(this, addr, false)) { - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - //scr->scriptObjRemove(addr); + if (!obj->isFreed()) { + if (!obj->initBaseObject(this, addr, false)) { + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + //scr->scriptObjRemove(addr); + } } } } diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index aa22d42135..29f716d48d 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -36,7 +36,7 @@ namespace Sci { struct EngineState; enum { - CURRENT_SAVEGAME_VERSION = 22, + CURRENT_SAVEGAME_VERSION = 23, MINIMUM_SAVEGAME_VERSION = 9 }; -- cgit v1.2.3 From 019657fcd6278906a4c96425c438cc98808fd172 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 22 Jun 2010 14:03:55 +0000 Subject: Fully implement xvga1300_carriage, the gallow's carriage is now fully usable. svn-id: r50139 --- engines/mohawk/riven_external.cpp | 81 ++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 8ba4361f3f..89e10c7deb 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -960,33 +960,60 @@ void RivenExternal::xjtunnel106_pictfix(uint16 argc, uint16 *argv) { } void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) { - // TODO: This function is supposed to do a lot more, something like this (pseudocode): - - // Show level pull movie - // Set transition up - // Change to up card - // Show movie of carriage coming down - // Set transition down - // Change back to card 276 - // Show movie of carriage coming down - // if jgallows == 0 - // Set up timer - // Enter new input loop - // if you click within the time - // move forward - // set transition right - // change to card right - // show movie of ascending - // change to card 263 - // else - // show movie of carriage ascending only - // else - // show movie of carriage ascending only - - - // For now, if the gallows base is closed, assume ascension and move to that card. - if (*_vm->matchVarToString("jgallows") == 0) - _vm->changeToCard(_vm->matchRMAPToCard(0x17167)); + // Run the gallows's carriage + + _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor + _vm->_video->playMovieBlocking(1); // Play handle movie + _vm->_gfx->scheduleTransition(15); // Set pan down transition + _vm->changeToCard(_vm->matchRMAPToCard(0x18e77)); // Change to card facing up + _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor (again) + _vm->_video->playMovieBlocking(4); // Play carriage beginning to drop + _vm->_gfx->scheduleTransition(14); // Set pan up transition + _vm->changeToCard(_vm->matchRMAPToCard(0x183a9)); // Change to card looking straight again + _vm->_video->playMovieBlocking(2); + + uint32 *gallows = _vm->matchVarToString("jgallows"); + if (*gallows == 1) { + // If the gallows is open, play the up movie and return + _vm->_video->playMovieBlocking(3); + return; + } + + // Give the player 5 seconds to click (anywhere) + uint32 startTime = _vm->_system->getMillis(); + bool gotClick = false; + while (_vm->_system->getMillis() - startTime <= 5000 && !gotClick) { + Common::Event event; + while (_vm->_system->getEventManager()->pollEvent(event)) { + switch (event.type) { + case Common::EVENT_MOUSEMOVE: + _vm->_system->updateScreen(); + break; + case Common::EVENT_LBUTTONUP: + gotClick = true; + break; + default: + break; + } + } + + _vm->_system->delayMillis(10); + } + + _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor + + if (gotClick) { + _vm->_gfx->scheduleTransition(16); // Schedule dissolve transition + _vm->changeToCard(_vm->matchRMAPToCard(0x18d4d)); // Move forward + _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor + _vm->_system->delayMillis(500); // Delay a half second before changing again + _vm->_gfx->scheduleTransition(12); // Schedule pan left transition + _vm->changeToCard(_vm->matchRMAPToCard(0x18ab5)); // Turn right + _vm->_gfx->changeCursor(kRivenHideCursor); // Hide the cursor + _vm->_video->playMovieBlocking(1); // Play carriage ride movie + _vm->changeToCard(_vm->matchRMAPToCard(0x17167)); // We have arrived at the top + } else + _vm->_video->playMovieBlocking(3); // Too slow! } void RivenExternal::xjdome25_resetsliders(uint16 argc, uint16 *argv) { -- cgit v1.2.3 From 5855cd7127c9c7b40a67dd9d8aecbd065fc231b9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 22 Jun 2010 15:01:45 +0000 Subject: The volume subop of kDoAudio returns the previous volume in SCI2.1, but not in earlier versions svn-id: r50141 --- engines/sci/engine/ksound.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 46f9aa95d8..0172b005ac 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -152,8 +152,15 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { int16 volume = argv[1].toUint16(); volume = CLIP(volume, 0, AUDIO_VOLUME_MAX); debugC(2, kDebugLevelSound, "kDoAudio: set volume to %d", volume); +#ifdef ENABLE_SCI32 + if (getSciVersion() >= SCI_VERSION_2_1) { + int16 volumePrev = mixer->getVolumeForSoundType(Audio::Mixer::kSpeechSoundType) / 2; + volumePrev = CLIP(volumePrev, 0, AUDIO_VOLUME_MAX); + mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume * 2); + return make_reg(0, volumePrev); + } else +#endif mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume * 2); - return make_reg(0, volume); } case kSciAudioLanguage: // In SCI1.1: tests for digital audio support -- cgit v1.2.3 From c28fa2cf196eec983ad2b33b4f5ca9e607a9652d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 22 Jun 2010 15:03:19 +0000 Subject: Reverted the code which handles objects without a base object when loading, for now. This possibly indicates an issue related to the garbage collector svn-id: r50142 --- engines/sci/engine/savegame.cpp | 10 +++++----- engines/sci/engine/segment.cpp | 2 -- engines/sci/engine/segment.h | 2 -- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index d6cbd32eae..351e7c6a7b 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -778,11 +778,11 @@ void SegManager::reconstructScripts(EngineState *s) { Object *obj = scr->scriptObjInit(addr, false); if (getSciVersion() < SCI_VERSION_1_1) { - if (!obj->isFreed()) { - if (!obj->initBaseObject(this, addr, false)) { - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - //scr->scriptObjRemove(addr); - } + if (!obj->initBaseObject(this, addr, false)) { + // TODO/FIXME: This should not be happening at all. It might indicate a possible issue + // with the garbage collector. It happens for example in LSL5 (German, perhaps English too). + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + scr->scriptObjRemove(addr); } } } diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index c2f72ecdbd..98f03ff18a 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -268,14 +268,12 @@ Object *Script::scriptObjInit(reg_t obj_pos, bool fullObjectInit) { return obj; } -#if 0 void Script::scriptObjRemove(reg_t obj_pos) { if (getSciVersion() < SCI_VERSION_1_1) obj_pos.offset += 8; _objects.erase(obj_pos.toUint16()); } -#endif // This helper function is used by Script::relocateLocal and Object::relocate static bool relocateBlock(Common::Array &block, int block_location, SegmentId segment, int location, size_t scriptSize) { diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 141576cb67..253d94cc53 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -406,13 +406,11 @@ public: */ Object *scriptObjInit(reg_t obj_pos, bool fullObjectInit = true); -#if 0 /** * Removes a script object * @param obj_pos Location (segment, offset) of the object. */ void scriptObjRemove(reg_t obj_pos); -#endif /** * Processes a relocation block witin a script -- cgit v1.2.3 From a82ca9de5cd207e9c00b41277e8a3e1e3869e254 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 15:05:09 +0000 Subject: SCI: change midi queue to Common::Array and make it resize itself if needed instead of error() svn-id: r50143 --- engines/sci/sound/music.cpp | 20 ++++++++++++-------- engines/sci/sound/music.h | 5 +++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 38d4968fee..8ee43fea64 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -47,7 +47,8 @@ SciMusic::SciMusic(SciVersion soundVersion) for (int i = 0; i < 16; i++) _usedChannel[i] = 0; - _queuedCommandCount = 0; + _queuedCommandCapacity = 1000; + _queuedCommands.reserve(_queuedCommandCapacity); } SciMusic::~SciMusic() { @@ -125,23 +126,26 @@ void SciMusic::putMidiCommandInQueue(byte status, byte firstOp, byte secondOp) { } void SciMusic::putMidiCommandInQueue(uint32 midi) { - if (_queuedCommandCount >= 1000) - error("driver queue is full"); - _queuedCommands[_queuedCommandCount] = midi; - _queuedCommandCount++; + if (_queuedCommands.size() == _queuedCommandCapacity) { + // We need more space + _queuedCommandCapacity *= 2; + _queuedCommands.reserve(_queuedCommandCapacity); + } + _queuedCommands.push_back(midi); } // This sends the stored commands from queue to driver (is supposed to get called only during onTimer()) // at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get // a crash during piano scene in lsl5) void SciMusic::sendMidiCommandsFromQueue() { - int curCommand = 0; + uint curCommand = 0; + uint commandCount = _queuedCommands.size(); - while (curCommand < _queuedCommandCount) { + while (curCommand < commandCount) { _pMidiDrv->send(_queuedCommands[curCommand]); curCommand++; } - _queuedCommandCount = 0; + _queuedCommands.clear(); } void SciMusic::clearPlayList() { diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 0a461cf76e..0a6662a7ce 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -120,6 +120,7 @@ public: }; typedef Common::Array MusicList; +typedef Common::Array MidiCommandQueue; class SciMusic #ifndef USE_OLD_MUSIC_FUNCTIONS @@ -224,8 +225,8 @@ private: byte _masterVolume; MusicEntry *_usedChannel[16]; - int _queuedCommandCount; - uint32 _queuedCommands[1000]; + uint _queuedCommandCapacity; + MidiCommandQueue _queuedCommands; int _driverFirstChannel; }; -- cgit v1.2.3 From bb9f556c363718959a43c7a65cec1944b626d358 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 22 Jun 2010 15:18:55 +0000 Subject: Add support for the QFG3 demo audio map and audio resources. Based on a patch by Walter. svn-id: r50144 --- engines/sci/resource_audio.cpp | 51 +++++++++++++++++++++++++++++------------- engines/sci/sound/audio.cpp | 21 ++++++++++++----- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 72fd8f4594..909f1d6480 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -110,17 +110,19 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { _headerSize = file->readByte(); if (type == kResourceTypeAudio) { - if (_headerSize != 11 && _headerSize != 12) { + if (_headerSize != 7 && _headerSize != 11 && _headerSize != 12) { warning("Unsupported audio header"); unalloc(); return false; } - // Load sample size - file->seek(7, SEEK_CUR); - size = file->readUint32LE(); - // Adjust offset to point at the header data again - file->seek(-11, SEEK_CUR); + if (_headerSize != 7) { // Size is defined already from the map + // Load sample size + file->seek(7, SEEK_CUR); + size = file->readUint32LE(); + // Adjust offset to point at the header data again + file->seek(-11, SEEK_CUR); + } } return loadPatch(file); @@ -247,7 +249,6 @@ void ResourceManager::removeAudioResource(ResourceId resId) { // w syncAscSize (iff seq has bit 6 set) int ResourceManager::readAudioMapSCI11(ResourceSource *map) { - bool isEarly = true; uint32 offset = 0; Resource *mapRes = findResource(ResourceId(kResourceTypeMap, map->_volumeNumber), false); @@ -263,11 +264,16 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { byte *ptr = mapRes->data; - if (map->_volumeNumber == 65535) { - // Heuristic to detect late SCI1.1 map format - if ((mapRes->size >= 6) && (ptr[mapRes->size - 6] != 0xff)) - isEarly = false; + // Heuristic to detect entry size + uint32 entrySize = 0; + for (int i = mapRes->size - 1; i >= 0; --i) { + if (ptr[i] == 0xff) + entrySize++; + else + break; + } + if (map->_volumeNumber == 65535) { while (ptr < mapRes->data + mapRes->size) { uint16 n = READ_LE_UINT16(ptr); ptr += 2; @@ -275,7 +281,7 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { if (n == 0xffff) break; - if (isEarly) { + if (entrySize == 6) { offset = READ_LE_UINT32(ptr); ptr += 4; } else { @@ -285,10 +291,25 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { addResource(ResourceId(kResourceTypeAudio, n), src, offset); } + } else if (map->_volumeNumber == 0 && entrySize == 10 && ptr[3] == 0) { + // QFG3 demo format + // ptr[3] would be 'seq' in the normal format and cannot possibly be 0 + while (ptr < mapRes->data + mapRes->size) { + uint16 n = READ_BE_UINT16(ptr); + ptr += 2; + + if (n == 0xffff) + break; + + offset = READ_LE_UINT32(ptr); + ptr += 4; + uint32 size = READ_LE_UINT32(ptr); + ptr += 4; + + addResource(ResourceId(kResourceTypeAudio, n), src, offset, size); + } } else { - // Heuristic to detect late SCI1.1 map format - if ((mapRes->size >= 11) && (ptr[mapRes->size - 11] == 0xff)) - isEarly = false; + bool isEarly = (entrySize != 11); if (!isEarly) { offset = READ_LE_UINT32(ptr); diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 0e235ee400..336218eaec 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -182,17 +182,28 @@ static void deDPCM8(byte *soundBuf, Common::SeekableReadStream &audioStream, uin // Sierra SOL audio file reader // Check here for more info: http://wiki.multimedia.cx/index.php?title=Sierra_Audio -static bool readSOLHeader(Common::SeekableReadStream *audioStream, int headerSize, uint32 &size, uint16 &audioRate, byte &audioFlags) { - if (headerSize != 11 && headerSize != 12) { +static bool readSOLHeader(Common::SeekableReadStream *audioStream, int headerSize, uint32 &size, uint16 &audioRate, byte &audioFlags, uint32 resSize) { + if (headerSize != 7 && headerSize != 11 && headerSize != 12) { warning("SOL audio header of size %i not supported", headerSize); return false; } - audioStream->readUint32LE(); // skip "SOL" + 0 (4 bytes) + uint32 tag = audioStream->readUint32BE(); + + if (tag != MKID_BE('SOL\0')) { + warning("No 'SOL' FourCC found"); + return false; + } + audioRate = audioStream->readUint16LE(); audioFlags = audioStream->readByte(); - size = audioStream->readUint32LE(); + // For the QFG3 demo format, just use the resource size + // Otherwise, load it from the header + if (headerSize == 7) + size = resSize; + else + size = audioStream->readUint32LE(); return true; } @@ -294,7 +305,7 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 // SCI1.1 Common::MemoryReadStream headerStream(audioRes->_header, audioRes->_headerSize, DisposeAfterUse::NO); - if (readSOLHeader(&headerStream, audioRes->_headerSize, size, _audioRate, audioFlags)) { + if (readSOLHeader(&headerStream, audioRes->_headerSize, size, _audioRate, audioFlags, audioRes->size)) { Common::MemoryReadStream dataStream(audioRes->data, audioRes->size, DisposeAfterUse::NO); data = readSOLAudio(&dataStream, size, audioFlags, flags); } -- cgit v1.2.3 From 46ec88f74d9b7596cee2e6a167b1ccf361771601 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 22 Jun 2010 15:30:41 +0000 Subject: GUI/LAUNCHER: This should fix the regression concerning pc speaker / pcjr support caused by patch #1956501 svn-id: r50145 --- base/plugins.cpp | 2 ++ po/POTFILES | 1 + sound/mididrv.cpp | 6 ++++- sound/null.cpp | 28 +---------------------- sound/null.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++ sound/softsynth/pcspk.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 28 deletions(-) create mode 100644 sound/null.h diff --git a/base/plugins.cpp b/base/plugins.cpp index 199344087c..39ee10c2cb 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -205,6 +205,8 @@ public: LINK_PLUGIN(MT32) #endif LINK_PLUGIN(ADLIB) + LINK_PLUGIN(PCSPK) + LINK_PLUGIN(PCJR) LINK_PLUGIN(TOWNS) #if defined (UNIX) LINK_PLUGIN(TIMIDITY) diff --git a/po/POTFILES b/po/POTFILES index 6e42829523..6f23ac6c51 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -22,6 +22,7 @@ engines/scumm/dialogs.cpp engines/mohawk/dialogs.cpp sound/musicplugin.cpp +sound/null.h sound/null.cpp sound/softsynth/mt32.cpp sound/softsynth/adlib.cpp diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 51abed3aa1..15da0f3106 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -131,11 +131,15 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // given flags. switch (getMusicType(hdl)) { case MT_PCSPK: - case MT_PCJR: if (flags & MDT_PCSPK) return hdl; break; + case MT_PCJR: + if (flags & MDT_PCJR) + return hdl; + break; + case MT_ADLIB: if (flags & MDT_ADLIB) return hdl; diff --git a/sound/null.cpp b/sound/null.cpp index 775a0e2fcb..c61add2c02 100644 --- a/sound/null.cpp +++ b/sound/null.cpp @@ -22,33 +22,7 @@ * $Id$ */ -#include "sound/musicplugin.h" -#include "sound/mpu401.h" -#include "common/translation.h" - -/* NULL driver */ -class MidiDriver_NULL : public MidiDriver_MPU401 { -public: - int open() { return 0; } - void send(uint32 b) { } -}; - - -// Plugin interface - -class NullMusicPlugin : public MusicPluginObject { -public: - virtual const char *getName() const { - return _s("No music"); - } - - virtual const char *getId() const { - return "null"; - } - - virtual MusicDevices getDevices() const; - virtual Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; -}; +#include "sound/null.h" Common::Error NullMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_NULL(); diff --git a/sound/null.h b/sound/null.h new file mode 100644 index 0000000000..f8d0a91e2d --- /dev/null +++ b/sound/null.h @@ -0,0 +1,56 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef SOUND_NULL_H +#define SOUND_NULL_H + +#include "sound/musicplugin.h" +#include "sound/mpu401.h" +#include "common/translation.h" + +/* NULL driver */ +class MidiDriver_NULL : public MidiDriver_MPU401 { +public: + int open() { return 0; } + void send(uint32 b) { } +}; + + +// Plugin interface + +class NullMusicPlugin : public MusicPluginObject { +public: + virtual const char *getName() const { + return _s("No music"); + } + + virtual const char *getId() const { + return "null"; + } + + virtual MusicDevices getDevices() const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; +}; + +#endif \ No newline at end of file diff --git a/sound/softsynth/pcspk.cpp b/sound/softsynth/pcspk.cpp index 396d9328f1..8f66578a0b 100644 --- a/sound/softsynth/pcspk.cpp +++ b/sound/softsynth/pcspk.cpp @@ -24,6 +24,7 @@ */ #include "sound/softsynth/pcspk.h" +#include "sound/null.h" namespace Audio { @@ -128,3 +129,59 @@ int8 PCSpeaker::generateTriangle(uint32 x, uint32 oscLength) { } } // End of namespace Audio + + +// Plugin interface +// (This can only create a null driver since pc speaker support is not part of the +// midi driver architecture. But we need the plugin for the options menu in the launcher +// and for MidiDriver::detectDevice() which is more or less used by all engines.) + +class PCSpeakerMusicPlugin : public NullMusicPlugin { +public: + const char *getName() const { + return _s("PC Speaker Emulator"); + } + + const char *getId() const { + return "pcspk"; + } + + MusicDevices getDevices() const; +}; + +MusicDevices PCSpeakerMusicPlugin::getDevices() const { + MusicDevices devices; + devices.push_back(MusicDevice(this, _s(""), MT_PCSPK)); + return devices; +} + +class PCjrMusicPlugin : public NullMusicPlugin { +public: + const char *getName() const { + return _s("IBM PCjr Emulator"); + } + + const char *getId() const { + return "pcjr"; + } + + MusicDevices getDevices() const; +}; + +MusicDevices PCjrMusicPlugin::getDevices() const { + MusicDevices devices; + devices.push_back(MusicDevice(this, _s(""), MT_PCJR)); + return devices; +} + +//#if PLUGIN_ENABLED_DYNAMIC(PCSPK) + //REGISTER_PLUGIN_DYNAMIC(PCSPK, PLUGIN_TYPE_MUSIC, PCSpeakerMusicPlugin); +//#else + REGISTER_PLUGIN_STATIC(PCSPK, PLUGIN_TYPE_MUSIC, PCSpeakerMusicPlugin); +//#endif + +//#if PLUGIN_ENABLED_DYNAMIC(PCJR) + //REGISTER_PLUGIN_DYNAMIC(PCJR, PLUGIN_TYPE_MUSIC, PCjrMusicPlugin); +//#else + REGISTER_PLUGIN_STATIC(PCJR, PLUGIN_TYPE_MUSIC, PCjrMusicPlugin); +//#endif \ No newline at end of file -- cgit v1.2.3 From 66c286d096503bf54cce16a1920fa96b9a46228e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 15:33:46 +0000 Subject: SCI: kPalVary(setTarget) now triggers an error svn-id: r50146 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 0b2f37f690..82a565c6d2 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -696,7 +696,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { } case 4: { // Change Target // seems to be 1 parameter, we should find a game that is using this feature before implementing it - warning("kPalVary(changeTarget) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + error("kPalVary(changeTarget) called with parameter %d (argc %d)", argv[1].toUint16(), argc); break; } case 5: { // Change ticks -- cgit v1.2.3 From 3c4bfa6caccb8beeb5c603865879da7f6b31c556 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 15:45:59 +0000 Subject: SCI: removing unneeded capacity uint from r50143 svn-id: r50147 --- engines/sci/sound/music.cpp | 8 +------- engines/sci/sound/music.h | 1 - 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 8ee43fea64..0d1f0f4db9 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -47,8 +47,7 @@ SciMusic::SciMusic(SciVersion soundVersion) for (int i = 0; i < 16; i++) _usedChannel[i] = 0; - _queuedCommandCapacity = 1000; - _queuedCommands.reserve(_queuedCommandCapacity); + _queuedCommands.reserve(1000); } SciMusic::~SciMusic() { @@ -126,11 +125,6 @@ void SciMusic::putMidiCommandInQueue(byte status, byte firstOp, byte secondOp) { } void SciMusic::putMidiCommandInQueue(uint32 midi) { - if (_queuedCommands.size() == _queuedCommandCapacity) { - // We need more space - _queuedCommandCapacity *= 2; - _queuedCommands.reserve(_queuedCommandCapacity); - } _queuedCommands.push_back(midi); } diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 0a6662a7ce..a29b6edee2 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -225,7 +225,6 @@ private: byte _masterVolume; MusicEntry *_usedChannel[16]; - uint _queuedCommandCapacity; MidiCommandQueue _queuedCommands; int _driverFirstChannel; -- cgit v1.2.3 From 3a2cd87c454924c45edf671bc3b118a9599bee8c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 22 Jun 2010 16:08:57 +0000 Subject: Add '2gs' to tools/md5table.c (this is used in tools/scumm-md5.txt, but was not added to the tool) svn-id: r50148 --- tools/md5table.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/md5table.c b/tools/md5table.c index 6823607b27..7d76b7541d 100644 --- a/tools/md5table.c +++ b/tools/md5table.c @@ -77,6 +77,7 @@ typedef struct { * common/util.h). */ static const StringMap platformMap[] = { + { "2gs", "kPlatformApple2GS" }, { "3DO", "kPlatform3DO" }, { "Amiga", "kPlatformAmiga" }, { "Atari", "kPlatformAtariST" }, -- cgit v1.2.3 From 90a1d7c609760830fb9c94c574c2f7c6aa694321 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 22 Jun 2010 16:09:27 +0000 Subject: SCUMM: Add Japanese FOA CD version from tracker #3017219 svn-id: r50149 --- engines/scumm/scumm-md5.h | 5 +++-- tools/scumm-md5.txt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index cc382d9621..73553cf72a 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Mon May 24 13:24:24 2010 + This file was generated by the md5table tool on Tue Jun 22 15:59:56 2010 DO NOT EDIT MANUALLY! */ @@ -130,7 +130,7 @@ static const MD5Table md5table[] = { { "2d388339d6050d8ccaa757b64633954e", "zak", "FM-TOWNS", "Demo", 7520, Common::EN_ANY, Common::kPlatformFMTowns }, { "2d4536a56e01da4b02eb021e7770afa2", "zak", "FM-TOWNS", "", 7520, Common::EN_ANY, Common::kPlatformFMTowns }, { "2d4acbdcfd8e374c9da8c2e7303a5cd0", "BluesBirthday", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, - { "2d624d1b214f7faf0094daea65c6d1a6", "maniac", "Apple II", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, + { "2d624d1b214f7faf0094daea65c6d1a6", "maniac", "Apple II", "", -1, Common::EN_ANY, Common::kPlatformApple2GS }, { "2d9d46f23cb07bbc90b8ad464d3e4ff8", "atlantis", "", "CD", -1, Common::EN_ANY, Common::kPlatformMacintosh }, { "2e85f7aa054930c692a5b1bed1dfc295", "football2002", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "2e8a1f76ea33bc5e04347646feee173d", "pajama3", "", "", -1, Common::DE_DEU, Common::kPlatformUnknown }, @@ -576,6 +576,7 @@ static const MD5Table md5table[] = { { "e6cd81b25ab1453a8a6d3482118c391e", "pass", "", "", 7857, Common::EN_ANY, Common::kPlatformPC }, { "e72bb4c2b613db2cf50f89ff6350e70a", "ft", "", "", -1, Common::ES_ESP, Common::kPlatformUnknown }, { "e781230da44a44e2f0770edb2b3b3633", "maniac", "V2", "V2", -1, Common::EN_ANY, Common::kPlatformAmiga }, + { "e8d0697906e53fee8b7e9f5652696da8", "atlantis", "", "CD", 11915, Common::JA_JPN, Common::kPlatformPC }, { "e94c7cc3686fce406d3c91b5eae5a72d", "zak", "V2", "V2", -1, Common::EN_ANY, Common::kPlatformAmiga }, { "e95cf980719c0be078fb68a67af97b4a", "funpack", "", "", -1, Common::JA_JPN, Common::kPlatform3DO }, { "e98b982ceaf9d253d730bde8903233d6", "monkey", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformPC }, diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt index 0637c386d7..a20713e40c 100644 --- a/tools/scumm-md5.txt +++ b/tools/scumm-md5.txt @@ -279,6 +279,7 @@ atlantis Indiana Jones and the Fate of Atlantis 1a6e5ae2777a6a33f06ffc0226210934 -1 en Mac - CD - Scott Summers 2d9d46f23cb07bbc90b8ad464d3e4ff8 -1 en Mac - CD Mac bundle Joachim Eberhard 8e9417564f33790815445b2136efa667 11915 jp Mac - CD - Petr Maruska + e8d0697906e53fee8b7e9f5652696da8 11915 jp DOS - CD - Petr Maruska, tracker #3017219 c7be10f775404fd9785a8b92a06d240c -1 en FM-TOWNS - - - dhewg, Andrea Petrucci 4d34042713958b971cb139fba4658586 -1 jp FM-TOWNS - - - Andrea Petrucci -- cgit v1.2.3 From 33347e12bd94552a0c100351747b6c693d144f68 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 22 Jun 2010 16:09:50 +0000 Subject: SCUMM: Add a debug message to detectGames() to help find filesizes of detection files svn-id: r50150 --- engines/scumm/detection.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index f509cabb2c..dbd86505a8 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -488,6 +488,12 @@ static void detectGames(const Common::FSList &fslist, Common::Listsize(); + if (d.md5Entry->filesize != filesize) + debug(1, "SCUMM detector found matching file '%s' with MD5 %s, size %d\n", + file.c_str(), md5str, filesize); + // Sanity check: We *should* have found a matching gameid / variant at this point. // If not, then there's a bug in our data tables... assert(dr.game.gameid != 0); -- cgit v1.2.3 From 5b24d39cdd94889e223d41acfea395414b608040 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 22 Jun 2010 16:10:16 +0000 Subject: SCUMM: Specify various file sizes of detection files svn-id: r50151 --- engines/scumm/scumm-md5.h | 30 +++++++++++++++--------------- tools/scumm-md5.txt | 28 ++++++++++++++-------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index 73553cf72a..8570f0c6a3 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Tue Jun 22 15:59:56 2010 + This file was generated by the md5table tool on Tue Jun 22 16:01:03 2010 DO NOT EDIT MANUALLY! */ @@ -47,7 +47,7 @@ static const MD5Table md5table[] = { { "0be88565f734b1e9e77ccaaf3bb14b29", "loom", "EGA", "EGA", -1, Common::ES_ESP, Common::kPlatformPC }, { "0bf1a3eb198ca1bd2ebe104825cec770", "puttrace", "HE 99", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows }, { "0c331637580950aea2346e012ef2a868", "maniac", "V2", "V2", 1988, Common::EN_ANY, Common::kPlatformAtariST }, - { "0c45eb4baff0c12c3d9dfa889c8070ab", "pajama3", "", "Demo", -1, Common::DE_DEU, Common::kPlatformUnknown }, + { "0c45eb4baff0c12c3d9dfa889c8070ab", "pajama3", "", "Demo", 13884, Common::DE_DEU, Common::kPlatformUnknown }, { "0cccfa5223099a60e76cfcca57a1a141", "freddi3", "", "", -1, Common::NL_NLD, Common::kPlatformUnknown }, { "0d1b69471605201ef2fa9cec1f5f02d2", "maniac", "V2", "V2", -1, Common::ES_ESP, Common::kPlatformPC }, { "0e4c5d54a0ad4b26132e78b5ea76642a", "samnmax", "Floppy", "Demo", 6485, Common::EN_ANY, Common::kPlatformPC }, @@ -79,7 +79,7 @@ static const MD5Table md5table[] = { { "16effd200aa6b8abe9c569c3e578814d", "freddi4", "HE 99", "Demo", -1, Common::NL_NLD, Common::kPlatformWindows }, { "179879b6e35c1ead0d93aab26db0951b", "fbear", "HE 70", "", 13381, Common::EN_ANY, Common::kPlatformWindows }, { "17b5d5e6af4ae89d62631641d66d5a05", "indy3", "VGA", "VGA", -1, Common::IT_ITA, Common::kPlatformPC }, - { "17f7296f63c78642724f057fd8e736a7", "maniac", "NES", "", -1, Common::EN_GRB, Common::kPlatformNES }, + { "17f7296f63c78642724f057fd8e736a7", "maniac", "NES", "", 2082, Common::EN_GRB, Common::kPlatformNES }, { "17fa250eb72dae2dad511ba79c0b6b0a", "tentacle", "", "Demo", -1, Common::FR_FRA, Common::kPlatformPC }, { "182344899c2e2998fca0bebcd82aa81a", "atlantis", "", "CD", 12035, Common::EN_ANY, Common::kPlatformPC }, { "183d7464902d40d00800e8ee1f04117c", "maniac", "V2", "V2", 1988, Common::DE_DEU, Common::kPlatformPC }, @@ -145,7 +145,7 @@ static const MD5Table md5table[] = { { "330f631502e381a4e199a3f7cb483c20", "indy3", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformAmiga }, { "33e989f85da700e2014d00f345cab3d7", "puttrace", "HE 98.5", "", -1, Common::FR_FRA, Common::kPlatformWindows }, { "3433be9866ca4261b2d5d25374e3f243", "monkey", "VGA", "VGA", -1, Common::FR_FRA, Common::kPlatformAmiga }, - { "3486ede0f904789267d4bcc5537a46d4", "puttzoo", "", "Demo", -1, Common::EN_ANY, Common::kPlatformMacintosh }, + { "3486ede0f904789267d4bcc5537a46d4", "puttzoo", "", "Demo", 14337, Common::EN_ANY, Common::kPlatformMacintosh }, { "356fb5f680b68251333016175935d126", "BluesABCTime", "HE CUP", "Preview", 4133436, Common::UNK_LANG, Common::kPlatformUnknown }, { "35a2d3040fa512f8232d9e443319d84d", "dig", "", "", 659335495, Common::EN_ANY, Common::kPlatformMacintosh }, { "362c1d281fb9899254cda66ad246c66a", "dig", "Demo", "Demo", 3472, Common::EN_ANY, Common::kPlatformUnknown }, @@ -183,7 +183,7 @@ static const MD5Table md5table[] = { { "425205754fa749f4f0b0dd9d09fa45fd", "football", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "430bc518017b6fac046f58bab6baad5d", "monkey2", "", "", -1, Common::JA_JPN, Common::kPlatformFMTowns }, { "439a7f4adf510489981ac52308e7d7a2", "maniac", "C64", "", -1, Common::DE_DEU, Common::kPlatformC64 }, - { "45082a5c9f42ba14dacfe1fdeeba819d", "freddicove", "HE 100", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, + { "45082a5c9f42ba14dacfe1fdeeba819d", "freddicove", "HE 100", "Demo", 18422, Common::EN_ANY, Common::kPlatformUnknown }, { "45152f7cf2ba8f43cf8a8ea2e740ae09", "monkey", "VGA", "VGA", 8357, Common::ES_ESP, Common::kPlatformPC }, { "4521138d15d1fd7649c31fb981746231", "pajama2", "HE 98.5", "Demo", -1, Common::DE_DEU, Common::kPlatformUnknown }, { "46b53fd430adcfbed791b48a0d4b079f", "funpack", "", "", -1, Common::EN_ANY, Common::kPlatformPC }, @@ -225,7 +225,7 @@ static const MD5Table md5table[] = { { "5262a27afcaee04e5c4900220bd463e7", "PuttsFunShop", "", "", -1, Common::EN_USA, Common::kPlatformUnknown }, { "52a4bae0746a11d7b1e8554e91a6645c", "zak", "V2", "V2", -1, Common::FR_FRA, Common::kPlatformPC }, { "53e94115b55dd51d4b8ff0871aa1df1e", "spyfox", "", "Demo", 20103, Common::EN_ANY, Common::kPlatformUnknown }, - { "54a936ad06161ff7bfefcb96200f7bff", "monkey", "VGA", "VGA Demo", -1, Common::EN_ANY, Common::kPlatformAmiga }, + { "54a936ad06161ff7bfefcb96200f7bff", "monkey", "VGA", "VGA Demo", 7617, Common::EN_ANY, Common::kPlatformAmiga }, { "55518cd73cf9c6d23ea29c51ee06bdfe", "ft", "", "", -1, Common::IT_ITA, Common::kPlatformUnknown }, { "55e4cc866ff9046824e1c638ba2b8c7f", "ft", "", "", -1, Common::RU_RUS, Common::kPlatformUnknown }, { "55f4e9402bec2bded383843123f37c5c", "pajama2", "HE 98.5", "", -1, Common::DE_DEU, Common::kPlatformWindows }, @@ -242,7 +242,7 @@ static const MD5Table md5table[] = { { "59d5cfcc5e672a6e07baae01328b918b", "PuttTime", "HE 90", "Demo", -1, Common::FR_FRA, Common::kPlatformUnknown }, { "5a35e36fd777e9c37a49c5b2faca52f9", "loom", "EGA", "EGA Demo", 6108, Common::EN_ANY, Common::kPlatformPC }, { "5b08000a9c47b2887df6506ac767ca68", "fbear", "HE 62", "", -1, Common::EN_ANY, Common::kPlatform3DO }, - { "5bd335265a61caa3d78956ad9f88ba23", "football", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, + { "5bd335265a61caa3d78956ad9f88ba23", "football", "", "Demo", 23135, Common::EN_ANY, Common::kPlatformUnknown }, { "5c21fc49aee8f46e58fef21579e614a1", "thinker1", "", "", -1, Common::EN_USA, Common::kPlatformUnknown }, { "5d88b9d6a88e6f8e90cded9d01b7f082", "loom", "VGA", "VGA", 8307, Common::EN_ANY, Common::kPlatformPC }, { "5dda73606533d66a4c3f4f9ea6e842af", "farm", "", "", 87061, Common::RU_RUS, Common::kPlatformWindows }, @@ -366,13 +366,13 @@ static const MD5Table md5table[] = { { "8aed489aba45d2b9fb8a04079c9c6e6a", "baseball", "HE CUP", "Preview", 12876596, Common::UNK_LANG, Common::kPlatformUnknown }, { "8afb3cf9f95abf208358e984f0c9e738", "funpack", "", "", -1, Common::EN_ANY, Common::kPlatform3DO }, { "8bdb0bf87b5e303dd35693afb9351215", "ft", "", "", -1, Common::DE_DEU, Common::kPlatformUnknown }, - { "8d479e36f35e80257dfc102cf4b8a912", "farm", "HE 72", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows }, + { "8d479e36f35e80257dfc102cf4b8a912", "farm", "HE 72", "Demo", 34333, Common::EN_ANY, Common::kPlatformWindows }, { "8de13897f0121c79d29a2377159f9ad0", "socks", "HE 99", "Updated", -1, Common::EN_ANY, Common::kPlatformWindows }, { "8e3241ddd6c8dadf64305e8740d45e13", "balloon", "HE 100", "Updated", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "8e4ee4db46954bfe2912e259a16fad82", "monkey2", "", "", -1, Common::FR_FRA, Common::kPlatformPC }, { "8e9417564f33790815445b2136efa667", "atlantis", "", "CD", 11915, Common::JA_JPN, Common::kPlatformMacintosh }, { "8e9830a6f2702be5b22c8fa0a6aaf977", "freddi2", "HE 80", "", -1, Common::NL_NLD, Common::kPlatformMacintosh }, - { "8eb84cee9b429314c7f0bdcf560723eb", "monkey", "FM-TOWNS", "", -1, Common::EN_ANY, Common::kPlatformFMTowns }, + { "8eb84cee9b429314c7f0bdcf560723eb", "monkey", "FM-TOWNS", "", 9925, Common::EN_ANY, Common::kPlatformFMTowns }, { "8ee63cafb1fe9d62aa0d5a23117e70e7", "freddi2", "HE 100", "Updated", -1, Common::EN_USA, Common::kPlatformUnknown }, { "8f3758ff98c9c5d78e5d635222cad026", "atlantis", "Floppy", "Floppy", -1, Common::IT_ITA, Common::kPlatformPC }, { "8fec68383202d38c0d25e9e3b757c5df", "comi", "Demo", "Demo", 18041, Common::UNK_LANG, Common::kPlatformWindows }, @@ -489,13 +489,13 @@ static const MD5Table md5table[] = { { "c4787c3e8b5e2dfda90850ee800af00f", "zak", "V2", "V2", -1, Common::FR_FRA, Common::kPlatformPC }, { "c4ffae9fac495475d6bc3343ccc8faf9", "Soccer2004", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "c5cc7cba02a2fbd539c4439e775b0536", "puttzoo", "HE 99", "Updated", 43470, Common::DE_DEU, Common::kPlatformWindows }, - { "c5d10e190d4b4d59114b824f2fdbd00e", "loom", "FM-TOWNS", "", -1, Common::EN_ANY, Common::kPlatformFMTowns }, + { "c5d10e190d4b4d59114b824f2fdbd00e", "loom", "FM-TOWNS", "", 7540, Common::EN_ANY, Common::kPlatformFMTowns }, { "c63ee46143ba65f9ce14cf539ca51bd7", "atlantis", "Floppy", "Floppy", -1, Common::EN_ANY, Common::kPlatformPC }, { "c666a998af90d81db447eccba9f72c8d", "monkey", "No AdLib", "EGA", -1, Common::EN_ANY, Common::kPlatformAtariST }, { "c6907d44f1166941d982864cd42cdc89", "pajama2", "HE 99", "", -1, Common::DE_DEU, Common::kPlatformUnknown }, { "c782fbbe74a987c3df8ac73cd3e289ed", "freddi", "HE 73", "", -1, Common::SE_SWE, Common::kPlatformMacintosh }, { "c7890e038806df2bb5c0c8c6f1986ea2", "monkey", "VGA", "VGA", -1, Common::EN_ANY, Common::kPlatformPC }, - { "c7be10f775404fd9785a8b92a06d240c", "atlantis", "", "", -1, Common::EN_ANY, Common::kPlatformFMTowns }, + { "c7be10f775404fd9785a8b92a06d240c", "atlantis", "", "", 12030, Common::EN_ANY, Common::kPlatformFMTowns }, { "c7c492a107ec520d7a7943037d0ca54a", "freddi", "HE 71", "Demo", -1, Common::NL_NLD, Common::kPlatformWindows }, { "c83079157ec765a28de445aec9768d60", "tentacle", "", "Demo", 7477, Common::EN_ANY, Common::kPlatformUnknown }, { "c8575e0b973ff1723aba6cd92c642db2", "puttrace", "HE 99", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows }, @@ -519,7 +519,7 @@ static const MD5Table md5table[] = { { "cf4ef315214c7d8cdab6302cdb7e50db", "freddi", "HE 73", "Demo", -1, Common::DE_DEU, Common::kPlatformWindows }, { "cf8d13446ec6cb6222287a925fd47c1d", "baseball", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "cf8ef3a1fb483c5c4b1c584d1167b2c4", "freddi", "HE 73", "", -1, Common::DE_DEU, Common::kPlatformWindows }, - { "cf90b4db5486ef798db78fe6fbf897e5", "pajama3", "", "Demo", -1, Common::EN_USA, Common::kPlatformWindows }, + { "cf90b4db5486ef798db78fe6fbf897e5", "pajama3", "", "Demo", 13902, Common::EN_USA, Common::kPlatformWindows }, { "d00ffc8c32d17e575fd985d435d2eb88", "arttime", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "d0549508a06bbb9f99ed19c9e97891f3", "football2002", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "d06fbe28818fef7bfc45c2cdf0c0849d", "zak", "V2", "V2", -1, Common::DE_DEU, Common::kPlatformPC }, @@ -561,7 +561,7 @@ static const MD5Table md5table[] = { { "df047cc4792150f601290357566d36a6", "freddi", "HE 90", "Updated", -1, Common::EN_USA, Common::kPlatformUnknown }, { "e01acc8c12ef44e8f778fe87e5f90f4e", "fbpack", "", "", -1, Common::EN_ANY, Common::kPlatform3DO }, { "e03ed1474ec14de78359970e0457a820", "freddi4", "HE 99", "Demo", -1, Common::EN_GRB, Common::kPlatformWindows }, - { "e144f5f49d9241d2a9dee2576b3d09cb", "airport", "", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows }, + { "e144f5f49d9241d2a9dee2576b3d09cb", "airport", "", "Demo", 51152, Common::EN_ANY, Common::kPlatformWindows }, { "e17db1ddf91b39ca6bbc8ad3ed19e883", "monkey", "FM-TOWNS", "", -1, Common::JA_JPN, Common::kPlatformFMTowns }, { "e246e02db9630533a40d99c9f54a8e01", "monkey2", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh }, { "e361a7058ed8e8ebb462663c0a3ae8d6", "puttputt", "HE 62", "", -1, Common::HE_ISR, Common::kPlatformPC }, @@ -582,7 +582,7 @@ static const MD5Table md5table[] = { { "e98b982ceaf9d253d730bde8903233d6", "monkey", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformPC }, { "eae95b2b3546d8ba86ae1d397c383253", "dog", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "eb700bb73ca1cc44a1ad5e4b1a4bdeaf", "indy3", "EGA", "EGA", 5361, Common::DE_DEU, Common::kPlatformPC }, - { "ebd0b2c8a387f18887282afe6cad894a", "spyozon", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, + { "ebd0b2c8a387f18887282afe6cad894a", "spyozon", "", "Demo", 15317, Common::EN_ANY, Common::kPlatformUnknown }, { "ebd324dcf06a4c49e1ba5c231eee1060", "freddi4", "HE 99", "Demo", -1, Common::EN_USA, Common::kPlatformUnknown }, { "ecc4340c2b801f5af8da4e00c0e432d9", "puttcircus", "", "", -1, Common::NL_NLD, Common::kPlatformUnknown }, { "ed2b074bc3166087a747acb2a3c6abb0", "freddi3", "HE 98.5", "Demo", -1, Common::DE_DEU, Common::kPlatformUnknown }, @@ -618,7 +618,7 @@ static const MD5Table md5table[] = { { "fbbbb38a81fc9d6a61d509278390a290", "farm", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh }, { "fbdd947d21e8f5bac6d6f7a316af1c5a", "spyfox", "", "Demo", 15693, Common::EN_ANY, Common::kPlatformUnknown }, { "fc53ce0e5f6562b1c1e1b4b8203acafb", "samnmax", "Floppy", "Floppy", -1, Common::ES_ESP, Common::kPlatformPC }, - { "fc6b6148e80d67939d9a18697c0f626a", "monkey", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformPC }, + { "fc6b6148e80d67939d9a18697c0f626a", "monkey", "EGA", "EGA", 8367, Common::DE_DEU, Common::kPlatformPC }, { "fc8d197a22146e74766e9cb0cfcaf1da", "freddi2", "HE 80", "Demo", 27298, Common::EN_ANY, Common::kPlatformUnknown }, { "fcb78ebecab2757264c590890c319cc5", "PuttTime", "HE 85", "", -1, Common::NL_NLD, Common::kPlatformUnknown }, { "fce4b8010704b103acfeea9413788f32", "freddi2", "HE 80", "", -1, Common::DE_DEU, Common::kPlatformUnknown }, diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt index a20713e40c..57294d2e61 100644 --- a/tools/scumm-md5.txt +++ b/tools/scumm-md5.txt @@ -60,7 +60,7 @@ maniac Maniac Mansion 7f45ddd6dbfbf8f80c0c0efea4c295bc 1972 en DOS V1 V1 - Fingolfin - 17f7296f63c78642724f057fd8e736a7 -1 gb NES NES - + 17f7296f63c78642724f057fd8e736a7 2082 gb NES NES - 91d5db93187fab54d823f73bd6441cb6 -1 us NES NES - 1c7e7db2cfab1ad62746ab680a634204 -1 fr NES NES - 3a5ec90d556d4920976c5578bfbfaf79 -1 de NES NES - @@ -172,7 +172,7 @@ loom Loom 5d88b9d6a88e6f8e90cded9d01b7f082 8307 en DOS VGA VGA CD Version v1.0 from 10. Feb 92 (Talkie) Peter Eckerlein, Fingolfin - c5d10e190d4b4d59114b824f2fdbd00e -1 en FM-TOWNS FM-TOWNS - - dhewg, Andrea Petrucci + c5d10e190d4b4d59114b824f2fdbd00e 7540 en FM-TOWNS FM-TOWNS - - dhewg, Andrea Petrucci 31b8fda4c8c7413fa6b39997e776eba4 -1 jp FM-TOWNS FM-TOWNS - - khalek, Andrea Petrucci 0aa050f4ad79402fbe9c4f78fb8ac494 -1 en PC-Engine PC-Engine - - Kirben @@ -189,7 +189,7 @@ monkey The Secret of Monkey Island 49210e124e4c2b30f1290a9ef6306301 8357 en DOS EGA EGA 8 disk v1.0, 9/18/90 Fingolfin 1dd3c11ea4439adfe681e4e405b624e1 -1 fr DOS EGA EGA 8 disk Andrea Petrucci - fc6b6148e80d67939d9a18697c0f626a -1 de DOS EGA EGA 8 disk ghoostkilla + fc6b6148e80d67939d9a18697c0f626a 8367 de DOS EGA EGA 8 disk ghoostkilla 910e31cffb28226bd68c569668a0d6b4 -1 es DOS EGA EGA 8 disk Andrea Petrucci 1d05cd189e4908f79b57e78a4402f292 -1 en DOS EGA EGA 4 disk Andrea Petrucci ce6a4cef315b20fef58a95bc40a2d8d3 -1 fr DOS EGA EGA 4 disk Matthieu Milan @@ -225,12 +225,12 @@ monkey The Secret of Monkey Island c13225cb1bbd3bc9fe578301696d8021 -1 en SEGA SEGA - - 057c9b456dedcc4d71b991a3072a20b3 9465 jp SEGA SEGA - - GloKidd - 8eb84cee9b429314c7f0bdcf560723eb -1 en FM-TOWNS FM-TOWNS - - Paul Priest, Andrea Petrucci + 8eb84cee9b429314c7f0bdcf560723eb 9925 en FM-TOWNS FM-TOWNS - - Paul Priest, Andrea Petrucci e17db1ddf91b39ca6bbc8ad3ed19e883 -1 jp FM-TOWNS FM-TOWNS - - Paul Priest, Andrea Petrucci 71523b539491527d9860f4407faf0411 7607 en DOS Demo EGA Demo - Fingolfin 771bc18ec6f93837b839c992b211904b -1 de DOS Demo EGA Demo - khalek - 54a936ad06161ff7bfefcb96200f7bff -1 en Amiga VGA VGA Demo - khalek + 54a936ad06161ff7bfefcb96200f7bff 7617 en Amiga VGA VGA Demo - khalek pass Passport to Adventure e6cd81b25ab1453a8a6d3482118c391e 7857 en DOS - - v1.0 9/14/90 Fingolfin @@ -281,7 +281,7 @@ atlantis Indiana Jones and the Fate of Atlantis 8e9417564f33790815445b2136efa667 11915 jp Mac - CD - Petr Maruska e8d0697906e53fee8b7e9f5652696da8 11915 jp DOS - CD - Petr Maruska, tracker #3017219 - c7be10f775404fd9785a8b92a06d240c -1 en FM-TOWNS - - - dhewg, Andrea Petrucci + c7be10f775404fd9785a8b92a06d240c 12030 en FM-TOWNS - - - dhewg, Andrea Petrucci 4d34042713958b971cb139fba4658586 -1 jp FM-TOWNS - - - Andrea Petrucci 035deab53b47bc43abc763560d0f8d4b -1 en DOS Floppy Demo - @@ -387,7 +387,7 @@ football Backyard Football 7fc6cdb46b4c9d384c52327f4bca6416 -1 en All - - - sev 425205754fa749f4f0b0dd9d09fa45fd -1 en All - Demo - Joachim Eberhard - 5bd335265a61caa3d78956ad9f88ba23 -1 en All - Demo - sev + 5bd335265a61caa3d78956ad9f88ba23 23135 en All - Demo - sev football2002 Backyard Football 2002 a095616d2d23ccf43b8e257711202cba -1 en All - - - clone2727 @@ -558,7 +558,7 @@ freddicove Freddi Fish 5: The Case of the Creature of Coral Cove 4ce2d5b355964bbcb5e5ce73236ef868 -1 ru Windows HE 100 - - sev 6b257bb2827dd894b8109a50a1a18b5a -1 nl All HE 100 Demo - Kirben, sev - 45082a5c9f42ba14dacfe1fdeeba819d -1 en All HE 100 Demo - sev + 45082a5c9f42ba14dacfe1fdeeba819d 18422 en All HE 100 Demo - sev maze Freddi Fish and Luther's Maze Madness 4f04b321a95d4315ce6d65f8e1dd0368 -1 us All HE 80 - - Kirben @@ -589,7 +589,7 @@ airport Let's Explore the Airport with Buzzy 7ea2da67ebabea4ac20cee9f4f9d2934 -1 en Mac - Demo - khalek 8ffd618a776a4c0d8922bb28b09f8ce8 -1 en Windows - Demo - khalek - e144f5f49d9241d2a9dee2576b3d09cb -1 en Windows - Demo - khalek + e144f5f49d9241d2a9dee2576b3d09cb 51152 en Windows - Demo - khalek 86c9902b7bec1a17926d4dae85beaa45 -1 en Windows HE 71 Demo - khalek farm Let's Explore the Farm with Buzzy @@ -602,7 +602,7 @@ farm Let's Explore the Farm with Buzzy 39fd6db10d0222d817025c4d3346e3b4 -1 en Mac - Demo - Joachim Eberhard bf8b52fdd9a69c67f34e8e9fec72661c -1 en Windows HE 71 Demo - khalek, sev 0557df19f046a84c2fdc63507c6616cb -1 nl Windows HE 72 Demo - adutchguy - 8d479e36f35e80257dfc102cf4b8a912 -1 en Windows HE 72 Demo - khalek, sev + 8d479e36f35e80257dfc102cf4b8a912 34333 en Windows HE 72 Demo - khalek, sev jungle Let's Explore the Jungle with Buzzy 659942b9a6b519f123a13cca3c333a13 -1 en Mac - - - Joachim Eberhard @@ -655,13 +655,13 @@ pajama3 Pajama Sam 3: You Are What You Eat From Your Head to Your Feet f08145577e4f13584cc90b3d6e9caa55 -1 nl All - Demo - joostp a654fb60c3b67d6317a7894ffd9f25c5 -1 us All - Demo - sev a9f2f04b1ecaab9495b59befffe9bf88 -1 us All - Demo - sev - 0c45eb4baff0c12c3d9dfa889c8070ab -1 de All - Demo - Joachim Eberhard + 0c45eb4baff0c12c3d9dfa889c8070ab 13884 de All - Demo - Joachim Eberhard 4fe6a2e8df3c4536b278fdd2fbcb181e -1 en Windows - Mini Game - Trekky 679855cf61932f9bf995c8f3677380ed -1 fr Windows - Demo - Mevi c8c5baadcbfc8d0372ed4335abace8a7 -1 fr Windows - Demo - Mevi 784b499c98d07260a30952685758636b 13911 de Windows - Demo - George Kormendi 3e48298920fab9b7aec5a971e1bd1fab -1 gb Windows - Demo - eriktorbjorn - cf90b4db5486ef798db78fe6fbf897e5 -1 us Windows - Demo - khalek + cf90b4db5486ef798db78fe6fbf897e5 13902 us Windows - Demo - khalek pjgames Pajama Sam: Games to Play on Any Day 8a484262363a8e18be87112454f1456b -1 us All - - - Kirben @@ -753,7 +753,7 @@ puttzoo Putt-Putt Saves the Zoo 3a3e592b074f595489f7f11e150c398d -1 us Windows HE 99 Updated - Adrian c5cc7cba02a2fbd539c4439e775b0536 43470 de Windows HE 99 Updated - Lightkey - 3486ede0f904789267d4bcc5537a46d4 -1 en Mac - Demo - khalek + 3486ede0f904789267d4bcc5537a46d4 14337 en Mac - Demo - khalek d220d154aafbfa12bd6f3ab1b2dae420 -1 de Mac - Demo - Joachim Eberhard aa81aa6d5545ce172fdba81f2e2f9d36 -1 nl Windows - Demo - DarthBo de4efb910210736813c9a1185384bace -1 en Windows HE 72 Demo - khalek @@ -854,7 +854,7 @@ spyozon SPY Fox 3: Operation Ozone 7015b059ab72cff3a0ef9fb4d5e9889d -1 de Windows - - - andy482 be39a5d4db60e8aa736b9086778cb45c -1 gb Windows - - - - ebd0b2c8a387f18887282afe6cad894a -1 en All - Demo - Kirben + ebd0b2c8a387f18887282afe6cad894a 15317 en All - Demo - Kirben a99c39ba65b6086be28aef576da69595 -1 fr Windows - Demo - Mevi 65563295c3a06493351870f20a1630cf 5235008 All All HE CUP Preview - sev -- cgit v1.2.3 From 0a757c185fc513a5f846545ab3055ec4fcfe4b78 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 22 Jun 2010 16:42:49 +0000 Subject: Remove some trailing tabs. svn-id: r50152 --- sound/mididrv.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 15da0f3106..4faff04d9c 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -63,7 +63,7 @@ static const uint32 GUIOMapping[] = { MT_ADLIB, Common::GUIO_MIDIADLIB, MT_TOWNS, Common::GUIO_MIDITOWNS, MT_GM, Common::GUIO_MIDIGM, - MT_MT32, Common::GUIO_MIDIMT32, + MT_MT32, Common::GUIO_MIDIMT32, 0, 0 }; @@ -135,7 +135,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { return hdl; break; - case MT_PCJR: + case MT_PCJR: if (flags & MDT_PCJR) return hdl; break; @@ -179,7 +179,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { return hdl; } - + // If we have no specific device selected (neither in the scummvm nor in the game domain) // and no preferred MT32 or GM device selected we arrive here. // If MT32 is preferred we try for the first available device with music type 'MT_MT32' (usually the mt32 emulator) @@ -192,7 +192,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { } } } - + // Now we default to the first available device with music type 'MT_GM' for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); @@ -202,8 +202,8 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { } } } - - MusicType tp = MT_NULL; + + MusicType tp = MT_NULL; if (flags & MDT_TOWNS) tp = MT_TOWNS; else if (flags & MDT_ADLIB) @@ -232,6 +232,7 @@ MidiDriver *MidiDriver::createMidi(MidiDriver::DeviceHandle handle) { if (getDeviceString(handle, MidiDriver::kDriverId).equals((**m)->getId())) (**m)->createInstance(&driver, handle); } + return driver; } @@ -243,7 +244,7 @@ MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &ident if (identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) return d->getHandle(); } - } + } return getDeviceHandle("auto"); } -- cgit v1.2.3 From 9ca43423b478561d17716ae2537f6b232f625c74 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 17:05:00 +0000 Subject: SCI: kPalVary(SetTarget) implemented svn-id: r50153 --- engines/sci/engine/kgraphics.cpp | 15 ++++++++++----- engines/sci/graphics/palette.cpp | 15 +++++++++++++++ engines/sci/graphics/palette.h | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 82a565c6d2..bc278a2bb1 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -673,7 +673,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { warning("kPalVary(reverse) called with ticks = %d, stop = %d, direction = %d", ticks, stepStop, direction); return make_reg(0, result); } else { - warning("kPalVary(reverse) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + warning("kPalVary(reverse) called with unsupported argc %d", argc); } } case 2: { // Get Current Step @@ -681,7 +681,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { int16 currentStep = g_sci->_gfxPalette->kernelPalVaryGetCurrentStep(); return make_reg(0, currentStep); } else { - warning("kPalVary(GetCurrentStep) called with unsupported argc %d", argc); + warning("kPalVary(getCurrentStep) called with unsupported argc %d", argc); } break; } @@ -695,8 +695,13 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { break; } case 4: { // Change Target - // seems to be 1 parameter, we should find a game that is using this feature before implementing it - error("kPalVary(changeTarget) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + if (argc == 2) { + GuiResourceId paletteId = argv[1].toUint16(); + int16 currentStep = g_sci->_gfxPalette->kernelPalVaryChangeTarget(paletteId); + return make_reg(0, currentStep); + } else { + warning("kPalVary(changeTarget) called with unsupported argc %d", argc); + } break; } case 5: { // Change ticks @@ -704,7 +709,7 @@ reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { uint16 ticks = argv[1].toUint16(); g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks); } else { - warning("kPalVary(changeTicks) called with parameter %d (argc %d)", argv[1].toUint16(), argc); + warning("kPalVary(changeTicks) called with unsupported argc %d", argc); } break; } diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index d256227ea8..339cac8e15 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -572,6 +572,21 @@ int16 GfxPalette::kernelPalVaryGetCurrentStep() { return -_palVaryStep; } +int16 GfxPalette::kernelPalVaryChangeTarget(GuiResourceId resourceId) { + if (_palVaryResourceId != -1) { + Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); + if (palResource) { + Palette insertPalette; + createFromData(palResource->data, &insertPalette); + // insert new palette into target + insert(&insertPalette, &_palVaryTargetPalette); + // update palette and set on screen + palVaryProcess(0, true); + } + } + return kernelPalVaryGetCurrentStep(); +} + void GfxPalette::kernelPalVaryChangeTicks(uint16 ticks) { _palVaryTicks = ticks; if (_palVaryStep - _palVaryStepStop) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 021096873b..ce9888c7db 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -66,6 +66,7 @@ public: bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction); int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction); int16 kernelPalVaryGetCurrentStep(); + int16 kernelPalVaryChangeTarget(GuiResourceId resourceId); void kernelPalVaryChangeTicks(uint16 ticks); void kernelPalVaryPause(bool pause); void kernelPalVaryDeinit(); -- cgit v1.2.3 From 079e5c3135aea031a23401c39110cc883c421112 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 17:13:44 +0000 Subject: SCI: fixed typo svn-id: r50154 --- engines/sci/graphics/palette.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index ce9888c7db..29120daa7d 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -45,7 +45,7 @@ public: void modifyAmigaPalette(byte *data); void setEGA(); void set(Palette *sciPal, bool force, bool forceRealMerge = false); - bool insert(Palette *newPaette, Palette *destPalette); + bool insert(Palette *newPalette, Palette *destPalette); bool merge(Palette *pFrom, bool force, bool forceRealMerge); uint16 matchColor(byte r, byte g, byte b); void getSys(Palette *pal); -- cgit v1.2.3 From 3a394793b6ef84d3bf200c7aac276ac39f8dc36f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 22 Jun 2010 18:25:15 +0000 Subject: Fixed 2 crashes in QFG1VGA, when dying: - Ignoring a non-game breaking script bug (modifying the "longSong" object with argc = 2) - Don't pop the callk stack frame if the stack is empty - fixes a crash when restoring from the death screen svn-id: r50157 --- engines/sci/engine/vm.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index cc7f1a1be6..350734f8fc 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -417,6 +417,9 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (!strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the // returnVal selector, which doesn't affect gameplay, thus don't diplay it + } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == "qfg1") { + // QFG1VGA has a script bug in the longSong object when invoking the + // loop selector, which doesn't affect gameplay, thus don't diplay it } else { // Unknown script bug, show it reg_t oldReg = *varp.getPointer(s->_segMan); @@ -636,8 +639,9 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { #endif } - // Remove callk stack frame again - s->_executionStack.pop_back(); + // Remove callk stack frame again, if there's still an execution stack + if (s->_executionStack.begin() != s->_executionStack.end()) + s->_executionStack.pop_back(); } else { Common::String warningMsg = "Dummy function " + kernelFunc.origName + Common::String::printf("[0x%x]", kernelFuncNum) + -- cgit v1.2.3 From 78fb62bcdf8c54a4c6024aa160641f6a196ebcf4 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 22 Jun 2010 18:27:00 +0000 Subject: LAUNCHER: hopefully fixed music driver selection via command line svn-id: r50158 --- base/commandLine.cpp | 4 ---- base/main.cpp | 11 +++++++++++ sound/mididrv.cpp | 4 ++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 8b0decf695..ee35bcf4c3 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -32,8 +32,6 @@ #include "common/system.h" #include "common/fs.h" -#include "sound/mididrv.h" - #include "gui/ThemeEngine.h" #define DETECTOR_TESTING_HACK @@ -364,8 +362,6 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha END_OPTION DO_OPTION('e', "music-driver") - if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(option)) == MT_NULL) - usage("Unrecognized music driver '%s'", option); END_OPTION DO_LONG_OPTION_INT("output-rate") diff --git a/base/main.cpp b/base/main.cpp index 0360c89502..1e3edb1534 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -54,6 +54,7 @@ #include "gui/error.h" #include "sound/audiocd.h" +#include "sound/mididrv.h" #include "backends/keymapper/keymapper.h" @@ -341,6 +342,16 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Load the plugins. PluginManager::instance().loadPlugins(); + // If we received an invalid music parameter via command line we check this here. + // We can't check this before loading the music plugins. + // On the other hand we cannot load the plugins before we know the file paths (in case of external plugins). + if (!settings["music-driver"].empty()) { + if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(settings["music-driver"])) == MT_NULL) { + warning("Unrecognized music driver '%s'\nSwitching to default device.", settings["music-driver"].c_str()); + settings["music-driver"] = "auto"; + } + } + // Process the remaining command line settings. Must be done after the // config file and the plugins have been loaded. Common::Error res; diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 4faff04d9c..d185626f62 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -238,6 +238,10 @@ MidiDriver *MidiDriver::createMidi(MidiDriver::DeviceHandle handle) { MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &identifier) { const MusicPlugin::List p = MusicMan.getPlugins(); + + if (p.begin() == p.end()) + error("Music plugins must be loaded prior to calling this method."); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { -- cgit v1.2.3 From 56bf0c0e635383929704ba12df3808f39aeb697e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 22 Jun 2010 18:33:19 +0000 Subject: Fixed kMergePoly after discussing with waltervn so that it correctly returns a pointer to an empty (for now) polygon array. This means that you can walk over enemy bodies after killing them in QFG1VGA, but at least it fixes the crashes after killing monsters svn-id: r50160 --- engines/sci/engine/kpathing.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 8988aa5734..ba6fb9bb6e 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1739,14 +1739,9 @@ reg_t kIntersections(EngineState *s, int argc, reg_t *argv) { * is in QFG1VGA, after killing any monster. */ reg_t kMergePoly(EngineState *s, int argc, reg_t *argv) { +#if 0 // 3 parameters: raw polygon data, polygon list, list size reg_t polygonData = argv[0]; - - // TODO: actually merge the polygon - // In QFG1VGA, there are no immediately visible side-effects - // of this being a stub. - -#if 0 List *list = s->_segMan->lookupList(argv[1]); Node *node = s->_segMan->lookupNode(list->first); // List size is not needed @@ -1765,9 +1760,14 @@ reg_t kMergePoly(EngineState *s, int argc, reg_t *argv) { } #endif + // TODO: actually merge the polygon. We return an empty polygon for now. + // In QFG1VGA, you can walk over enemy bodies after killing them, since + // this is a stub. + reg_t output = allocateOutputArray(s->_segMan, 1); + SegmentRef arrayRef = s->_segMan->dereference(output); + writePoint(arrayRef, 0, Common::Point(POLY_LAST_POINT, POLY_LAST_POINT)); warning("Stub: kMergePoly"); - - return polygonData; + return output; } } // End of namespace Sci -- cgit v1.2.3 From 38cf6aa3e4c0415f507f5ec514834440bfbf90ca Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 19:01:43 +0000 Subject: SCI: implemented kAssertPalette and a palvary fix for ::set, fixes erana's place in qfg1vga nighttime svn-id: r50162 --- engines/sci/graphics/palette.cpp | 20 ++++++++++++++++---- engines/sci/graphics/view.cpp | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 339cac8e15..b0969ceb74 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -30,9 +30,11 @@ #include "sci/sci.h" #include "sci/engine/state.h" +#include "sci/graphics/cache.h" #include "sci/graphics/maciconbar.h" #include "sci/graphics/palette.h" #include "sci/graphics/screen.h" +#include "sci/graphics/view.h" namespace Sci { @@ -216,15 +218,16 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); newPalette->timestamp = _sysPalette.timestamp; + bool updatePalette = _sysPaletteChanged && _screen->_picNotValid == 0; + if (_palVaryResourceId != -1) { // Pal-vary currently active, we don't set at any time, but also insert into origin palette insert(newPalette, &_palVaryOriginPalette); + palVaryProcess(0, updatePalette); return; } - if (_sysPaletteChanged && _screen->_picNotValid == 0) { // && systime != _sysPalette.timestamp) { - // Removed timestamp checking, because this shouldnt be needed anymore. I'm leaving it commented just in - // case this causes regressions + if (updatePalette) { setOnScreen(); _sysPaletteChanged = false; } @@ -467,7 +470,16 @@ void GfxPalette::kernelAnimateSet() { } void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { - warning("kAssertPalette %d", resourceId); + // Sometimes invalid viewIds are asked for, ignore those (e.g. qfg1vga) + if (!_resMan->testResource(ResourceId(kResourceTypeView, resourceId))) + return; + + GfxView *view = g_sci->_gfxCache->getView(resourceId); + Palette *viewPalette = view->getPalette(); + if (viewPalette) { + // merge/insert this palette + set(viewPalette, true); + } } // palVary diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 7c33f87a14..40e2a4fb30 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -653,7 +653,7 @@ uint16 GfxView::getCelCount(int16 loopNo) { } Palette *GfxView::getPalette() { - return _embeddedPal ? &_viewPalette : &_palette->_sysPalette; + return _embeddedPal ? &_viewPalette : NULL; } } // End of namespace Sci -- cgit v1.2.3 From 33b991ee9d987acf013606341a60c8e3ff95ca77 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Tue, 22 Jun 2010 19:21:05 +0000 Subject: Groovie: Add support for the compressed MIDI files of T7G Mac. svn-id: r50163 --- engines/groovie/music.cpp | 63 ++++++++++++++++++++++++++++++++++++++++------- engines/groovie/music.h | 3 +++ 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 7166432e02..7e8f21bbbc 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -703,20 +703,65 @@ bool MusicPlayerMac::load(uint32 fileref, bool loop) { Common::SeekableReadStream *file = _vm->_macResFork->getResource(MKID_BE('cmid'), fileref & 0x3FF); if (file) { - // TODO: A form of LZSS, not supported by the current Groovie decoder. - // The offset/length uint16 is BE, but not sure the amount of length bits - // nor whether the offset is absolute/relative. - warning("TODO: Mac Compressed MIDI: cmid 0x%04x", fileref & 0x3FF); + // Found the resource, decompress it + Common::SeekableReadStream *tmp = decompressMidi(file); delete file; + file = tmp; + } else { + // Otherwise, it's uncompressed + file = _vm->_macResFork->getResource(MKID_BE('Midi'), fileref & 0x3FF); + if (!file) + error("Groovie::Music: Couldn't find resource 0x%04X", fileref); return false; } - // Otherwise, it's uncompressed - file = _vm->_macResFork->getResource(MKID_BE('Midi'), fileref & 0x3FF); - if (!file) - error("Groovie::Music: Couldn't find resource 0x%04X", fileref); - return loadParser(file, loop); } +Common::SeekableReadStream *MusicPlayerMac::decompressMidi(Common::SeekableReadStream *stream) { + // Initialize an output buffer of the given size + uint32 size = stream->readUint32BE(); + byte *output = (byte *)malloc(size); + + byte *current = output; + uint32 decompBytes = 0; + while ((decompBytes < size) && !stream->eos()) { + // 8 flags + byte flags = stream->readByte(); + + for (byte i = 0; (i < 8) && !stream->eos(); i++) { + if (flags & 1) { + // 1: Next byte is a literal + *(current++) = stream->readByte(); + if (stream->eos()) + continue; + decompBytes++; + } else { + // 0: It's a reference to part of the history + uint16 args = stream->readUint16BE(); + if (stream->eos()) + continue; + + // Length = 4bit unsigned (3 minimal) + uint8 length = (args >> 12) + 3; + + // Offset = 12bit signed (all values are negative) + int16 offset = (args & 0xFFF) | 0xF000; + + // Copy from the past decompressed bytes + decompBytes += length; + while (length > 0) { + *(current) = *(current + offset); + current++; + length--; + } + } + flags = flags >> 1; + } + } + + // Return the output buffer wrapped in a MemoryReadStream + return new Common::MemoryReadStream(output, size, DisposeAfterUse::YES); +} + } // End of Groovie namespace diff --git a/engines/groovie/music.h b/engines/groovie/music.h index 2feef9cbf7..5b5f5bd346 100644 --- a/engines/groovie/music.h +++ b/engines/groovie/music.h @@ -161,6 +161,9 @@ public: protected: bool load(uint32 fileref, bool loop); + +private: + Common::SeekableReadStream *decompressMidi(Common::SeekableReadStream *stream); }; } // End of Groovie namespace -- cgit v1.2.3 From 99807b88945082ac029710c4ab9be5322c04e0ea Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 22 Jun 2010 19:39:30 +0000 Subject: Fix uncompressed MIDI in T7G Mac. svn-id: r50165 --- engines/groovie/music.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 7e8f21bbbc..9b46af1483 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -712,7 +712,6 @@ bool MusicPlayerMac::load(uint32 fileref, bool loop) { file = _vm->_macResFork->getResource(MKID_BE('Midi'), fileref & 0x3FF); if (!file) error("Groovie::Music: Couldn't find resource 0x%04X", fileref); - return false; } return loadParser(file, loop); -- cgit v1.2.3 From a836f965f8c313fad8d3f36b94ccec4bf5c0c00b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 20:40:41 +0000 Subject: SCI: set offTop to 26 for mixed up fairy tales to fix all sorts of non-fully-removed windows svn-id: r50166 --- engines/sci/graphics/ports.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 8ba7c57b62..9f0edb290f 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -90,6 +90,9 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te Common::String gameId = g_sci->getGameId(); if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; + // Mixed-Up Fairy Tales uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere + if (gameId == "fairytales") + offTop = 26; openPort(_wmgrPort); setPort(_wmgrPort); -- cgit v1.2.3 From 93b2336aa2ed65bcc1cca1db878dc0d07dc0fc2f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 21:01:34 +0000 Subject: SCI: demo of fairy tales uses regular offTop svn-id: r50168 --- engines/sci/graphics/ports.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 9f0edb290f..571687a05f 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -91,7 +91,7 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; // Mixed-Up Fairy Tales uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere - if (gameId == "fairytales") + if ((gameId == "fairytales") && (!g_sci->isDemo())) offTop = 26; openPort(_wmgrPort); -- cgit v1.2.3 From d8968ee5b95d62fd357dfec163436f7f164e5244 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 21:05:34 +0000 Subject: SCI: reversing r50168, demo is using the same offTop as well (demo.bat) svn-id: r50169 --- engines/sci/graphics/ports.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 571687a05f..b8e3ec9c9d 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -90,8 +90,8 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te Common::String gameId = g_sci->getGameId(); if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; - // Mixed-Up Fairy Tales uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere - if ((gameId == "fairytales") && (!g_sci->isDemo())) + // Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere + if (gameId == "fairytales") offTop = 26; openPort(_wmgrPort); -- cgit v1.2.3 From 04c04ff01ee4e6288d8600661c67aebee8b959b3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 21:24:52 +0000 Subject: SCI: eco quest 1 demo also uses inbetween sci1.1 interpreter, fixing graphics svn-id: r50170 --- engines/sci/graphics/palette.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index b0969ceb74..385c3f4e3e 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -66,14 +66,16 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case - // Quest for Glory 3 demo and police quest 1 vga behave the same interpreter wise and all have glitches, if we don't - // switch back - if (g_sci->getGameId() == "laurabow2" && (g_sci->isDemo())) - _alwaysForceRealMerge = true; - else if (g_sci->getGameId() == "qfg3" && (g_sci->isDemo())) - _alwaysForceRealMerge = true; - else if (g_sci->getGameId() == "pq1sci") - _alwaysForceRealMerge = true; + // Quest for Glory 3 demo, Eco Quest 1 demo and police quest 1 vga behave the same interpreter wise and all have glitches, + // if we don't switch back + Common::String gameId = g_sci->getGameId(); + if (g_sci->isDemo()) { + if (gameId == "laurabow2" || gameId == "qfg3" || gameId == "ecoquest") + _alwaysForceRealMerge = true; + } else { + if (gameId == "pq1sci") + _alwaysForceRealMerge = true; + } palVaryInit(); } -- cgit v1.2.3 From b68180efe525c37f48a81ce7946d9e6f2045cf07 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 22 Jun 2010 21:58:55 +0000 Subject: SCI: added nicks picks sq to the sci1.1 interpreter games, the other ones may also use the same interpreter, but we currently can not verify svn-id: r50172 --- engines/sci/graphics/palette.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 385c3f4e3e..208bc6751b 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -62,18 +62,19 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _alwaysForceRealMerge = false; // Pseudo-WORKAROUND - // Laura Bow 2 demo uses an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 + // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest 1 vga and Nick's Picks Space Quest + // all use an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case - // Quest for Glory 3 demo, Eco Quest 1 demo and police quest 1 vga behave the same interpreter wise and all have glitches, - // if we don't switch back + // FIXME: the other nick's Picks may also use the same interpreter, but we can not verify + // if the other games also get reported having palette issues, add them here Common::String gameId = g_sci->getGameId(); if (g_sci->isDemo()) { if (gameId == "laurabow2" || gameId == "qfg3" || gameId == "ecoquest") _alwaysForceRealMerge = true; } else { - if (gameId == "pq1sci") + if (gameId == "pq1sci" || gameId == "cnick-sq") _alwaysForceRealMerge = true; } -- cgit v1.2.3 From 717005bf25b6e74f22418324845f363eb4a1068d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 23 Jun 2010 10:11:01 +0000 Subject: Rewrote the MADS animation frame decoder to better guard against invalid data causing memory overruns svn-id: r50174 --- engines/m4/sprite.cpp | 94 +++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index da043c695f..553b27dd9a 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -121,56 +121,70 @@ void M4Sprite::loadDeltaRle(Common::SeekableReadStream* rleData, int destX, int // TODO: The sprite outlines (pixel value 0xFD) are not shown void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { - byte *outp, *lineStart; - bool newLine = false; - - outp = getBasePtr(); - lineStart = getBasePtr(); - - while (1) { - byte cmd1, cmd2, count, pixel; - - if (newLine) { - if (outp < (lineStart + w)) - Common::set_to(outp, lineStart + w, TRANSPARENT_COLOUR_INDEX); - - outp = lineStart + w; - lineStart = outp; - newLine = false; - } - - cmd1 = source->readByte(); - - if (cmd1 == 0xFC) - break; - else if (cmd1 == 0xFF) + // Set entire sprite contents to transparent pixels + fillRect(bounds(), TRANSPARENT_COLOUR_INDEX); + + // Major line loop + for (int y = 0; y < h; ++y) { + byte *destP = getBasePtr(0, y); + bool newLine = false; + byte cmd = source->readByte(); + int x = 0; + + if (cmd == 0xff) + // The entire line is empty newLine = true; - else if (cmd1 == 0xFD) { - while (!newLine) { - count = source->readByte(); - if (count == 0xFF) { + else if (cmd == 0xFD) { + // Lines contains only run lenghs of pixels + while (x < w) { + byte cmd = source->readByte(); + if (cmd == 0xff) { + // End of line reached newLine = true; - } else { - pixel = source->readByte(); - while (count--) - *outp++ = (pixel == 0xFD) ? TRANSPARENT_COLOUR_INDEX : pixel; + break; + } + + byte v = source->readByte(); + while (cmd-- > 0) { + if (x < w) + *destP++ = (v == 0xFD) ? TRANSPARENT_COLOUR_INDEX : v; + ++x; } } } else { - while (!newLine) { - cmd2 = source->readByte(); - if (cmd2 == 0xFF) { + // Line intermixes run lengths with individual pixels + while (x < w) { + cmd = source->readByte(); + if (cmd == 0xff) { + // End of line reached newLine = true; - } else if (cmd2 == 0xFE) { - count = source->readByte(); - pixel = source->readByte(); - while (count--) - *outp++ = (pixel == 0xFD) ? TRANSPARENT_COLOUR_INDEX : pixel; + break; + } + + if (cmd == 0xFE) { + // Handle repeated sequence + cmd = source->readByte(); + byte v = source->readByte(); + while (cmd-- > 0) { + if (x < w) { + *destP++ = (v == 0xFD) ? TRANSPARENT_COLOUR_INDEX : v; + } + ++x; + } } else { - *outp++ = (cmd2 == 0xFD) ? TRANSPARENT_COLOUR_INDEX : cmd2; + // Handle writing out single pixel + *destP++ = (cmd == 0xFD) ? TRANSPARENT_COLOUR_INDEX : cmd; + ++x; } } } + + // Check if we need to scan forward to find the end of the line + if (!newLine) { + do { + assert(!source->eos()); + } while (source->readByte() != 0xff); + } } } -- cgit v1.2.3 From 3569b496622a61eb7d82c3033b188c4cd0426ae6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 23 Jun 2010 11:22:44 +0000 Subject: Changed some asserts to warnings svn-id: r50175 --- engines/m4/assets.cpp | 7 ++++++- engines/m4/graphics.cpp | 6 ++++-- engines/m4/sprite.cpp | 5 ++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index 1f3cf278ae..c329373add 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -320,7 +320,12 @@ void SpriteAsset::loadFrameHeader(SpriteAssetFrame &frameHeader, bool isBigEndia } M4Sprite *SpriteAsset::getFrame(int frameIndex) { - return _frames[frameIndex].frame; + if ((uint)frameIndex < _frames.size()) { + return _frames[frameIndex].frame; + } else { + warning("SpriteAsset::getFrame: Invalid frame %d, out of %d", frameIndex, _frames.size()); + return _frames[_frames.size() - 1].frame; + } } void SpriteAsset::loadStreamingFrame(M4Sprite *frame, int frameIndex, int destX, int destY) { diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index b0bc8bbc0c..85d138328d 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -920,8 +920,10 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { for (int i = 0; i < width() * height(); ++i, ++p) { if (!isTransparent || (*p != TRANSPARENT_COLOUR_INDEX)) { - assert(*p < list->size()); - *p = palIndexes[*p]; + if (*p < list->size()) { + warning("Pal pointer exceeds list size"); + *p = palIndexes[*p]; + } } } diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 553b27dd9a..55de6714d1 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -182,7 +182,10 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { // Check if we need to scan forward to find the end of the line if (!newLine) { do { - assert(!source->eos()); + if (source->eos()) { + warning("M4Sprite::loadMadsSprite: unexpected end of data"); + break; + } } while (source->readByte() != 0xff); } } -- cgit v1.2.3 From fedc06060594c4f9fbd1db4511c513eb3926d135 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 23 Jun 2010 11:28:53 +0000 Subject: Corrected newly added palette conversion warning svn-id: r50176 --- engines/m4/graphics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 85d138328d..b1d590c114 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -920,10 +920,10 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { for (int i = 0; i < width() * height(); ++i, ++p) { if (!isTransparent || (*p != TRANSPARENT_COLOUR_INDEX)) { - if (*p < list->size()) { - warning("Pal pointer exceeds list size"); + if (*p < list->size()) *p = palIndexes[*p]; - } + else + warning("Pal pointer exceeds list size"); } } -- cgit v1.2.3 From 3cdd841192d840be6094aefa3b89eee582375946 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 23 Jun 2010 11:32:36 +0000 Subject: Made a warning more verbose svn-id: r50177 --- engines/m4/graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index b1d590c114..55c16cb9e7 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -923,7 +923,7 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { if (*p < list->size()) *p = palIndexes[*p]; else - warning("Pal pointer exceeds list size"); + warning("Pal index %d exceeds list size %d", *p, list->size()); } } -- cgit v1.2.3 From f0145e6dcd3f96225be7fc6c5b8aebce9ee545d8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 11:47:14 +0000 Subject: SCI: implementing boundary checking for GfxPalette::createFromData(), sq5 has a broken picture 0 resource, which would result in either crash or at least bad read from memory depending on whats read there svn-id: r50178 --- engines/sci/graphics/palette.cpp | 25 ++++++++++++++++++++----- engines/sci/graphics/palette.h | 2 +- engines/sci/graphics/picture.cpp | 4 ++-- engines/sci/graphics/view.cpp | 5 +++-- engines/sci/graphics/view.h | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 208bc6751b..ef20aafc82 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -97,7 +97,7 @@ void GfxPalette::setDefault() { #define SCI_PAL_FORMAT_CONSTANT 1 #define SCI_PAL_FORMAT_VARIABLE 0 -void GfxPalette::createFromData(byte *data, Palette *paletteOut) { +void GfxPalette::createFromData(byte *data, int bytesLeft, Palette *paletteOut) { int palFormat = 0; int palOffset = 0; int palColorStart = 0; @@ -105,10 +105,16 @@ void GfxPalette::createFromData(byte *data, Palette *paletteOut) { int colorNo = 0; memset(paletteOut, 0, sizeof(Palette)); - // Setup default mapping + // Setup 1:1 mapping for (colorNo = 0; colorNo < 256; colorNo++) { paletteOut->mapping[colorNo] = colorNo; } + if (bytesLeft < 37) { + // This happens when loading palette of picture 0 in sq5 - the resource is broken and doesn't contain a full + // palette + warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette header"); + return; + } if ((data[0] == 0 && data[1] == 1) || (data[0] == 0 && data[1] == 0 && READ_LE_UINT16(data + 29) == 0)) { // SCI0/SCI1 palette palFormat = SCI_PAL_FORMAT_VARIABLE; // CONSTANT; @@ -123,6 +129,11 @@ void GfxPalette::createFromData(byte *data, Palette *paletteOut) { } switch (palFormat) { case SCI_PAL_FORMAT_CONSTANT: + // Check, if enough bytes left + if (bytesLeft < palOffset + (3 * palColorCount)) { + warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette colors"); + return; + } for (colorNo = palColorStart; colorNo < palColorStart + palColorCount; colorNo++) { paletteOut->colors[colorNo].used = 1; paletteOut->colors[colorNo].r = data[palOffset++]; @@ -131,6 +142,10 @@ void GfxPalette::createFromData(byte *data, Palette *paletteOut) { } break; case SCI_PAL_FORMAT_VARIABLE: + if (bytesLeft < palOffset + (4 * palColorCount)) { + warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette colors"); + return; + } for (colorNo = palColorStart; colorNo < palColorStart + palColorCount; colorNo++) { paletteOut->colors[colorNo].used = data[palOffset++]; paletteOut->colors[colorNo].r = data[palOffset++]; @@ -378,7 +393,7 @@ bool GfxPalette::kernelSetFromResource(GuiResourceId resourceId, bool force) { Palette palette; if (palResource) { - createFromData(palResource->data, &palette); + createFromData(palResource->data, palResource->size, &palette); set(&palette, force); return true; } @@ -526,7 +541,7 @@ bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) { Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); if (palResource) { // Load and initialize destination palette - createFromData(palResource->data, &_palVaryTargetPalette); + createFromData(palResource->data, palResource->size, &_palVaryTargetPalette); return true; } return false; @@ -592,7 +607,7 @@ int16 GfxPalette::kernelPalVaryChangeTarget(GuiResourceId resourceId) { Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); if (palResource) { Palette insertPalette; - createFromData(palResource->data, &insertPalette); + createFromData(palResource->data, palResource->size, &insertPalette); // insert new palette into target insert(&insertPalette, &_palVaryTargetPalette); // update palette and set on screen diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 29120daa7d..e640d9b39d 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -40,7 +40,7 @@ public: ~GfxPalette(); void setDefault(); - void createFromData(byte *data, Palette *paletteOut); + void createFromData(byte *data, int bytesLeft, Palette *paletteOut); bool setAmiga(); void modifyAmigaPalette(byte *data); void setEGA(); diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 0b62a558ca..b410fc47f1 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -109,7 +109,7 @@ void GfxPicture::drawSci11Vga() { Palette palette; // Create palette and set it - _palette->createFromData(inbuffer + palette_data_ptr, &palette); + _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette); _palette->set(&palette, true); // display Cel-data @@ -147,7 +147,7 @@ void GfxPicture::drawSci32Vga(int16 celNo) { if ((celNo == -1) || (celNo == 0)) { // Create palette and set it - _palette->createFromData(inbuffer + palette_data_ptr, &palette); + _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette); _palette->set(&palette, true); } if (celNo != -1) { diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 40e2a4fb30..f00d6a652d 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -62,6 +62,7 @@ void GfxView::initData(GuiResourceId resourceId) { error("view resource %d not found", resourceId); } _resourceData = _resource->data; + _resourceSize = _resource->size; byte *celData, *loopData; uint16 celOffset; @@ -114,7 +115,7 @@ void GfxView::initData(GuiResourceId resourceId) { // On the other side: vga sci1 games have this pointing to a VGA palette // and ega sci1 games have this pointing to a 8x16 byte mapping table that needs to get applied then if (!isEGA) { - _palette->createFromData(&_resourceData[palOffset], &_viewPalette); + _palette->createFromData(&_resourceData[palOffset], _resourceSize - palOffset, &_viewPalette); _embeddedPal = true; } else { // Only use the EGA-mapping, when being SCI1 @@ -197,7 +198,7 @@ void GfxView::initData(GuiResourceId resourceId) { assert(celSize >= 32); if (palOffset) { - _palette->createFromData(&_resourceData[palOffset], &_viewPalette); + _palette->createFromData(&_resourceData[palOffset], _resourceSize - palOffset, &_viewPalette); _embeddedPal = true; } diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index a2050dc9d5..fe033dfe23 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -86,6 +86,7 @@ private: GuiResourceId _resourceId; Resource *_resource; byte *_resourceData; + int _resourceSize; uint16 _loopCount; LoopInfo *_loop; -- cgit v1.2.3 From 3bc011357bba0104de2e7f910cde6a7d62d7581f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 12:58:14 +0000 Subject: SCI: some initial work on global scaling svn-id: r50179 --- engines/sci/engine/selector.cpp | 1 + engines/sci/engine/static_selectors.cpp | 1 + engines/sci/engine/vm.h | 3 ++- engines/sci/graphics/animate.cpp | 20 ++++++++++++++------ engines/sci/graphics/animate.h | 6 +++--- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 08e2ba5e99..cc2adeb62b 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -157,6 +157,7 @@ void Kernel::mapSelectors() { FIND_SELECTOR(scaleSignal); FIND_SELECTOR(scaleX); FIND_SELECTOR(scaleY); + FIND_SELECTOR(maxScale); FIND_SELECTOR(iconIndex); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index eca18f67fb..c7ee7b854a 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -107,6 +107,7 @@ static const SelectorRemap sciSelectorRemap[] = { { SCI_VERSION_1_1, SCI_VERSION_1_1,"scaleSignal", 103 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleX", 104 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleY", 105 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "maxScale", 106 }, { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, 0 } }; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index fa57a1151c..d4be76dd40 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -152,8 +152,9 @@ struct SelectorCache { Selector syncTime; // SCI1.1 specific selectors - Selector scaleSignal; // < Used by Animate() for cel scaling (SCI1.1+) + Selector scaleSignal; //< Used by kAnimate() for cel scaling (SCI1.1+) Selector scaleX, scaleY; ///< SCI1.1 view scaling + Selector maxScale; ///< SCI1.1 view scaling, limit for cel, when using global scaling // Used for auto detection purposes Selector overlay; ///< Used to determine if a game is using old gfx functions or not diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 339132a76c..57879b6653 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -185,12 +185,6 @@ void GfxAnimate::makeSortedList(List *list) { listEntry->scaleX = 128; listEntry->scaleY = 128; } - // TODO - // On scaleSignal bit 1 sierra sci does some stuff with global var 2, current Port - // and some other stuff and sets scaleX/Y accordingly. It seems this functionality is needed in at - // least sq5 right when starting the game before wilco exists the room. Currently we dont get scaling - // but sierra sci does scaling there. I dont fully understand the code yet, that's why i didnt implement - // anything. } else { listEntry->scaleSignal = 0; listEntry->scaleX = 128; @@ -236,6 +230,20 @@ void GfxAnimate::fill(byte &old_picNotValid) { writeSelectorValue(_s->_segMan, curObject, SELECTOR(cel), listEntry->celNo); } + // Process global scaling, if needed + if (listEntry->scaleSignal & kScaleSignalDoScaling) { + if (listEntry->scaleSignal & kScaleSignalGlobalScaling) { + // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY + int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale)); + int16 maxCelHeight = (maxScale * view->getHeight(listEntry->loopNo, listEntry->celNo)) >> 7; + // TODO! + + // and set objects scale selectors + //writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), listEntry->scaleX); + //writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), listEntry->scaleY); + } + } + // Create rect according to coordinates and given cel if (listEntry->scaleSignal & kScaleSignalDoScaling) { view->getCelScaledRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->scaleX, listEntry->scaleY, &listEntry->celRect); diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h index 324ca0d700..a7d925c6e0 100644 --- a/engines/sci/graphics/animate.h +++ b/engines/sci/graphics/animate.h @@ -51,9 +51,9 @@ enum ViewSignals { }; enum ViewScaleSignals { - kScaleSignalDoScaling = 0x0001, // enables scaling when drawing that cel (involves scaleX and scaleY) - kScaleSignalUnknown1 = 0x0002, // seems to do something with globalvar 2, sets scaleX/scaleY - kScaleSignalUnknown2 = 0x0004 // really unknown + kScaleSignalDoScaling = 0x0001, // enables scaling when drawing that cel (involves scaleX and scaleY) + kScaleSignalGlobalScaling = 0x0002, // means that global scaling shall get applied on that cel (sets scaleX/scaleY) + kScaleSignalUnknown2 = 0x0004 // really unknown }; struct AnimateEntry { -- cgit v1.2.3 From eeba2812c1a950380ea3ea8766704ced11afaffd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 13:42:09 +0000 Subject: SCI: adding some more global scaling code, adding vanishingY and vanishingX as selectors svn-id: r50180 --- engines/sci/engine/selector.cpp | 2 ++ engines/sci/engine/static_selectors.cpp | 2 ++ engines/sci/engine/vm.h | 2 ++ engines/sci/graphics/animate.cpp | 4 ++++ 4 files changed, 10 insertions(+) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index cc2adeb62b..65024742c7 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -158,6 +158,8 @@ void Kernel::mapSelectors() { FIND_SELECTOR(scaleX); FIND_SELECTOR(scaleY); FIND_SELECTOR(maxScale); + FIND_SELECTOR(vanishingX); + FIND_SELECTOR(vanishingY); FIND_SELECTOR(iconIndex); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index c7ee7b854a..6f44788fd7 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -108,6 +108,8 @@ static const SelectorRemap sciSelectorRemap[] = { { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleX", 104 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleY", 105 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "maxScale", 106 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "vanishingX", 107 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "vanishingY", 108 }, { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, 0 } }; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index d4be76dd40..9de7cc587c 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -155,6 +155,8 @@ struct SelectorCache { Selector scaleSignal; //< Used by kAnimate() for cel scaling (SCI1.1+) Selector scaleX, scaleY; ///< SCI1.1 view scaling Selector maxScale; ///< SCI1.1 view scaling, limit for cel, when using global scaling + Selector vanishingX; ///< SCI1.1 view scaling, used by global scaling + Selector vanishingY; ///< SCI1.1 view scaling, used by global scaling // Used for auto detection purposes Selector overlay; ///< Used to determine if a game is using old gfx functions or not diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 57879b6653..f96a1646ef 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -233,9 +233,13 @@ void GfxAnimate::fill(byte &old_picNotValid) { // Process global scaling, if needed if (listEntry->scaleSignal & kScaleSignalDoScaling) { if (listEntry->scaleSignal & kScaleSignalGlobalScaling) { + warning("%lx:%lx", PRINT_REG(curObject)); // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale)); int16 maxCelHeight = (maxScale * view->getHeight(listEntry->loopNo, listEntry->celNo)) >> 7; + reg_t globalVar2 = _s->variables[VAR_GLOBAL][1]; // current room + int16 vanishingY = readSelectorValue(_s->_segMan, globalVar2, SELECTOR(vanishingY)); + //warning("vanishingY %d maxScale %d", vanishingY, maxScale); // TODO! // and set objects scale selectors -- cgit v1.2.3 From c1d3fd670c34b751c5e7a4236c14cb72ca973548 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 14:06:31 +0000 Subject: SCI: global scaling implemented (hopefully, i'm not sure if it works 100% :P) thx to waltervn for telling me the vocab 994 stuff used for disassembly svn-id: r50181 --- engines/sci/graphics/animate.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index f96a1646ef..9051111d2d 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -233,18 +233,29 @@ void GfxAnimate::fill(byte &old_picNotValid) { // Process global scaling, if needed if (listEntry->scaleSignal & kScaleSignalDoScaling) { if (listEntry->scaleSignal & kScaleSignalGlobalScaling) { - warning("%lx:%lx", PRINT_REG(curObject)); // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale)); - int16 maxCelHeight = (maxScale * view->getHeight(listEntry->loopNo, listEntry->celNo)) >> 7; - reg_t globalVar2 = _s->variables[VAR_GLOBAL][1]; // current room + int16 celHeight = view->getHeight(listEntry->loopNo, listEntry->celNo); + int16 maxCelHeight = (maxScale * celHeight) >> 7; + reg_t globalVar2 = _s->variables[VAR_GLOBAL][2]; // current room object int16 vanishingY = readSelectorValue(_s->_segMan, globalVar2, SELECTOR(vanishingY)); - //warning("vanishingY %d maxScale %d", vanishingY, maxScale); - // TODO! + + int16 fixedPortY = _ports->getPort()->rect.bottom - vanishingY; + int16 fixedEntryY = listEntry->y - vanishingY; + if (!fixedEntryY) + fixedEntryY = 1; + + if ((celHeight == 0) || (fixedPortY == 0)) + error("global scaling panic"); + + listEntry->scaleY = ( maxCelHeight * fixedEntryY ) / fixedPortY; + listEntry->scaleY = (listEntry->scaleY * 128) / celHeight; + + listEntry->scaleX = listEntry->scaleY; // and set objects scale selectors - //writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), listEntry->scaleX); - //writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), listEntry->scaleY); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), listEntry->scaleX); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), listEntry->scaleY); } } -- cgit v1.2.3 From db6c7a3deee4f9e312c8dcead3e7e32baddf4166 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 23 Jun 2010 15:08:23 +0000 Subject: Removed a hack with SCI1.1 static selectors, and set them properly. This fixes scaling in the demo of QFG3 svn-id: r50182 --- engines/sci/engine/static_selectors.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 6f44788fd7..fcef04f6ad 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -100,10 +100,18 @@ static const SelectorRemap sciSelectorRemap[] = { { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "moveDone", 170 }, { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "points", 316 }, { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "flags", 368 }, - { SCI_VERSION_1_EARLY, SCI_VERSION_1_1, "nodePtr", 44 }, - { SCI_VERSION_1_LATE, SCI_VERSION_1_1, "cantBeHere", 57 }, - { SCI_VERSION_1_EARLY, SCI_VERSION_1_1, "topString", 101 }, - { SCI_VERSION_1_EARLY, SCI_VERSION_1_1, "flags", 102 }, + { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "nodePtr", 44 }, + { SCI_VERSION_1_LATE, SCI_VERSION_1_LATE, "cantBeHere", 57 }, + { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "topString", 101 }, + { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "flags", 102 }, + // SCI1.1 + { SCI_VERSION_1_1, SCI_VERSION_1_1, "nodePtr", 41 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "cantBeHere", 54 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "topString", 98 }, + { SCI_VERSION_1_1, SCI_VERSION_1_1, "flags", 99 }, + // quitGame + // restart + // hide { SCI_VERSION_1_1, SCI_VERSION_1_1,"scaleSignal", 103 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleX", 104 }, { SCI_VERSION_1_1, SCI_VERSION_1_1, "scaleY", 105 }, @@ -146,9 +154,6 @@ Common::StringArray Kernel::checkStaticSelectorNames() { if (selectorRemap->slot >= names.size()) names.resize(selectorRemap->slot + 1); if (getSciVersion() >= selectorRemap->minVersion && getSciVersion() <= selectorRemap->maxVersion) { - // The SCI1 selectors we use exist in SCI1.1 too, offset by 3 - if (selectorRemap->minVersion >= SCI_VERSION_1_EARLY && getSciVersion() == SCI_VERSION_1_1) - slot -= 3; names[slot] = selectorRemap->name; } } -- cgit v1.2.3 From 0a102981f004733c9e7956ae58b4d0050db38e2b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 23 Jun 2010 15:23:37 +0000 Subject: Moved the SelectorCache struct inside selector.h, where it belongs, and fixed some header dependencies in the process svn-id: r50183 --- engines/sci/console.cpp | 1 + engines/sci/engine/features.cpp | 1 + engines/sci/engine/kernel.h | 2 + engines/sci/engine/savegame.cpp | 1 + engines/sci/engine/selector.cpp | 1 + engines/sci/engine/selector.h | 112 ++++++++++++++++++++++++++++++++- engines/sci/engine/state.cpp | 1 + engines/sci/engine/vm.h | 111 -------------------------------- engines/sci/graphics/animate.cpp | 1 + engines/sci/graphics/compare.cpp | 1 + engines/sci/graphics/controls.cpp | 1 + engines/sci/graphics/coordadjuster.cpp | 1 + engines/sci/graphics/frameout.cpp | 2 +- engines/sci/graphics/maciconbar.cpp | 1 + engines/sci/graphics/menu.cpp | 1 + engines/sci/sound/soundcmd.cpp | 1 + 16 files changed, 126 insertions(+), 113 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 1fdcd579c0..cf87b34bba 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -31,6 +31,7 @@ #include "sci/event.h" #include "sci/resource.h" #include "sci/engine/state.h" +#include "sci/engine/kernel.h" #include "sci/engine/selector.h" #include "sci/engine/savegame.h" #include "sci/engine/gc.h" diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index e8f2fe326c..75f271f3ad 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -24,6 +24,7 @@ */ #include "sci/engine/features.h" +#include "sci/engine/kernel.h" #include "sci/engine/script.h" #include "sci/engine/selector.h" #include "sci/engine/vm.h" diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 11bc76348d..802a2d5f0b 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -31,6 +31,7 @@ #include "common/rect.h" #include "common/str-array.h" +#include "sci/engine/selector.h" #include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS #include "sci/engine/vm_types.h" // for reg_t #include "sci/engine/vm.h" @@ -39,6 +40,7 @@ namespace Sci { struct Node; // from segment.h struct List; // from segment.h +struct SelectorCache; // from selector.h /** * @defgroup VocabularyResources Vocabulary resources in SCI diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 351e7c6a7b..f6a6afd196 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -33,6 +33,7 @@ #include "sci/event.h" #include "sci/engine/features.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/message.h" #include "sci/engine/savegame.h" diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 65024742c7..00480743cc 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -24,6 +24,7 @@ */ #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 851ff6bc81..acb7912d8d 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -30,10 +30,120 @@ #include "sci/engine/vm_types.h" // for reg_t #include "sci/engine/vm.h" -#include "sci/engine/kernel.h" // for Kernel::_selectorCache namespace Sci { +/** Contains selector IDs for a few selected selectors */ +struct SelectorCache { + SelectorCache() { + memset(this, 0, sizeof(*this)); + } + + // Statically defined selectors, (almost the) same in all SCI versions + Selector y; + Selector x; + Selector view, loop, cel; ///< Description of a specific image + Selector underBits; ///< Used by the graphics subroutines to store backupped BG pic data + Selector nsTop, nsLeft, nsBottom, nsRight; ///< View boundaries ('now seen') + Selector lsTop, lsLeft, lsBottom, lsRight; ///< Used by Animate() subfunctions and scroll list controls + Selector signal; ///< Used by Animate() to control a view's behaviour + Selector illegalBits; ///< Used by CanBeHere + Selector brTop, brLeft, brBottom, brRight; ///< Bounding Rectangle + // name, key, time + Selector text; ///< Used by controls + Selector elements; ///< Used by SetSynonyms() + // color, back + Selector mode; ///< Used by text controls (-> DrawControl()) + // style + Selector state, font, type;///< Used by controls + // window + Selector cursor, max; ///< Used by EditControl + // mark, who + Selector message; ///< Used by GetEvent + // edit + Selector play; ///< Play function (first function to be called) + Selector number; + Selector handle; ///< Replaced by nodePtr in SCI1+ + Selector nodePtr; ///< Replaces handle in SCI1+ + Selector client; ///< The object that wants to be moved + Selector dx, dy; ///< Deltas + Selector b_movCnt, b_i1, b_i2, b_di, b_xAxis, b_incr; ///< Various Bresenham vars + Selector xStep, yStep; ///< BR adjustments + Selector moveSpeed; ///< Used for DoBresen + Selector canBeHere; ///< Funcselector: Checks for movement validity in SCI0 + Selector heading, mover; ///< Used in DoAvoider + Selector doit; ///< Called (!) by the Animate() system call + Selector isBlocked, looper; ///< Used in DoAvoider + Selector priority; + Selector modifiers; ///< Used by GetEvent + Selector replay; ///< Replay function + // setPri, at, next, done, width + Selector wordFail, syntaxFail; ///< Used by Parse() + // semanticFail, pragmaFail + // said + Selector claimed; ///< Used generally by the event mechanism + // value, save, restore, title, button, icon, draw + Selector delete_; ///< Called by Animate() to dispose a view object + Selector z; + + // SCI1+ static selectors + Selector parseLang; + Selector printLang; ///< Used for i18n + Selector subtitleLang; + Selector size; + Selector points; ///< Used by AvoidPath() + Selector palette; + Selector dataInc; + // handle (in SCI1) + Selector min; ///< SMPTE time format + Selector sec; + Selector frame; + Selector vol; + Selector pri; + // perform + Selector moveDone; ///< used for DoBresen + + // SCI1 selectors which have been moved a bit in SCI1.1, but otherwise static + Selector cantBeHere; ///< Checks for movement avoidance in SCI1+. Replaces canBeHere + Selector topString; ///< SCI1 scroll lists use this instead of lsTop + Selector flags; + + // SCI1+ audio sync related selectors, not static. They're used for lip syncing in + // CD talkie games + Selector syncCue; ///< Used by DoSync() + Selector syncTime; + + // SCI1.1 specific selectors + Selector scaleSignal; //< Used by kAnimate() for cel scaling (SCI1.1+) + Selector scaleX, scaleY; ///< SCI1.1 view scaling + Selector maxScale; ///< SCI1.1 view scaling, limit for cel, when using global scaling + Selector vanishingX; ///< SCI1.1 view scaling, used by global scaling + Selector vanishingY; ///< SCI1.1 view scaling, used by global scaling + + // Used for auto detection purposes + Selector overlay; ///< Used to determine if a game is using old gfx functions or not + + // SCI1.1 Mac icon bar selectors + Selector iconIndex; ///< Used to index icon bar objects + +#ifdef ENABLE_SCI32 + Selector data; // Used by Array()/String() + Selector picture; // Used to hold the picture ID for SCI32 pictures + + Selector plane; + Selector top; + Selector left; + Selector bottom; + Selector right; + Selector resX; + Selector resY; + + Selector fore; + Selector back; + Selector dimmed; +#endif +}; + /** * Map a selector name to a selector id. Shortcut for accessing the selector cache. */ diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 129976ce99..4b99097476 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -29,6 +29,7 @@ #include "sci/debug.h" // for g_debug_sleeptime_factor #include "sci/event.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/engine/vm.h" diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 9de7cc587c..88898cdbba 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -71,117 +71,6 @@ struct Class { #define RAW_IS_OBJECT(datablock) (READ_SCI11ENDIAN_UINT16(((byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER) -/** Contains selector IDs for a few selected selectors */ -struct SelectorCache { - SelectorCache() { - memset(this, 0, sizeof(*this)); - } - - // Statically defined selectors, (almost the) same in all SCI versions - Selector y; - Selector x; - Selector view, loop, cel; ///< Description of a specific image - Selector underBits; ///< Used by the graphics subroutines to store backupped BG pic data - Selector nsTop, nsLeft, nsBottom, nsRight; ///< View boundaries ('now seen') - Selector lsTop, lsLeft, lsBottom, lsRight; ///< Used by Animate() subfunctions and scroll list controls - Selector signal; ///< Used by Animate() to control a view's behaviour - Selector illegalBits; ///< Used by CanBeHere - Selector brTop, brLeft, brBottom, brRight; ///< Bounding Rectangle - // name, key, time - Selector text; ///< Used by controls - Selector elements; ///< Used by SetSynonyms() - // color, back - Selector mode; ///< Used by text controls (-> DrawControl()) - // style - Selector state, font, type;///< Used by controls - // window - Selector cursor, max; ///< Used by EditControl - // mark, who - Selector message; ///< Used by GetEvent - // edit - Selector play; ///< Play function (first function to be called) - Selector number; - Selector handle; ///< Replaced by nodePtr in SCI1+ - Selector nodePtr; ///< Replaces handle in SCI1+ - Selector client; ///< The object that wants to be moved - Selector dx, dy; ///< Deltas - Selector b_movCnt, b_i1, b_i2, b_di, b_xAxis, b_incr; ///< Various Bresenham vars - Selector xStep, yStep; ///< BR adjustments - Selector moveSpeed; ///< Used for DoBresen - Selector canBeHere; ///< Funcselector: Checks for movement validity in SCI0 - Selector heading, mover; ///< Used in DoAvoider - Selector doit; ///< Called (!) by the Animate() system call - Selector isBlocked, looper; ///< Used in DoAvoider - Selector priority; - Selector modifiers; ///< Used by GetEvent - Selector replay; ///< Replay function - // setPri, at, next, done, width - Selector wordFail, syntaxFail; ///< Used by Parse() - // semanticFail, pragmaFail - // said - Selector claimed; ///< Used generally by the event mechanism - // value, save, restore, title, button, icon, draw - Selector delete_; ///< Called by Animate() to dispose a view object - Selector z; - - // SCI1+ static selectors - Selector parseLang; - Selector printLang; ///< Used for i18n - Selector subtitleLang; - Selector size; - Selector points; ///< Used by AvoidPath() - Selector palette; - Selector dataInc; - // handle (in SCI1) - Selector min; ///< SMPTE time format - Selector sec; - Selector frame; - Selector vol; - Selector pri; - // perform - Selector moveDone; ///< used for DoBresen - - // SCI1 selectors which have been moved a bit in SCI1.1, but otherwise static - Selector cantBeHere; ///< Checks for movement avoidance in SCI1+. Replaces canBeHere - Selector topString; ///< SCI1 scroll lists use this instead of lsTop - Selector flags; - - // SCI1+ audio sync related selectors, not static. They're used for lip syncing in - // CD talkie games - Selector syncCue; ///< Used by DoSync() - Selector syncTime; - - // SCI1.1 specific selectors - Selector scaleSignal; //< Used by kAnimate() for cel scaling (SCI1.1+) - Selector scaleX, scaleY; ///< SCI1.1 view scaling - Selector maxScale; ///< SCI1.1 view scaling, limit for cel, when using global scaling - Selector vanishingX; ///< SCI1.1 view scaling, used by global scaling - Selector vanishingY; ///< SCI1.1 view scaling, used by global scaling - - // Used for auto detection purposes - Selector overlay; ///< Used to determine if a game is using old gfx functions or not - - // SCI1.1 Mac icon bar selectors - Selector iconIndex; ///< Used to index icon bar objects - -#ifdef ENABLE_SCI32 - Selector data; // Used by Array()/String() - Selector picture; // Used to hold the picture ID for SCI32 pictures - - Selector plane; - Selector top; - Selector left; - Selector bottom; - Selector right; - Selector resX; - Selector resY; - - Selector fore; - Selector back; - Selector dimmed; -#endif -}; - // A reference to an object's variable. // The object is stored as a reg_t, the variable as an index into _variables struct ObjVarRef { diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 9051111d2d..59cbedd7a2 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -28,6 +28,7 @@ #include "graphics/primitives.h" #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/engine/vm.h" diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 47b4f22607..a245eefdda 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -28,6 +28,7 @@ #include "graphics/primitives.h" #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/graphics/compare.h" diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp index 26af9741c2..ff5a91eed4 100644 --- a/engines/sci/graphics/controls.cpp +++ b/engines/sci/graphics/controls.cpp @@ -30,6 +30,7 @@ #include "sci/sci.h" #include "sci/event.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/graphics/ports.h" diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp index 422df52f27..9481a68f13 100644 --- a/engines/sci/graphics/coordadjuster.cpp +++ b/engines/sci/graphics/coordadjuster.cpp @@ -26,6 +26,7 @@ #include "common/util.h" #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/graphics/coordadjuster.h" diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 05c2a1b7ad..4247c4db9e 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -28,6 +28,7 @@ #include "graphics/primitives.h" #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/engine/vm.h" @@ -86,7 +87,6 @@ void GfxFrameout::kernelDeleteScreenItem(reg_t object) { int16 GfxFrameout::kernelGetHighPlanePri() { sortPlanes(); - reg_t object = _planes.back(); return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back(), SELECTOR(priority)); } diff --git a/engines/sci/graphics/maciconbar.cpp b/engines/sci/graphics/maciconbar.cpp index a06e98ccbf..6f2c9596db 100644 --- a/engines/sci/graphics/maciconbar.cpp +++ b/engines/sci/graphics/maciconbar.cpp @@ -24,6 +24,7 @@ */ #include "sci/sci.h" +#include "sci/engine/kernel.h" #include "sci/engine/selector.h" #include "sci/engine/state.h" #include "sci/graphics/maciconbar.h" diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 00eb533b41..323539573b 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -29,6 +29,7 @@ #include "sci/sci.h" #include "sci/event.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/graphics/ports.h" diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 6470b17e83..043f2b8516 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -34,6 +34,7 @@ #include "sci/sound/music.h" #include "sci/sound/soundcmd.h" +#include "sci/engine/kernel.h" #include "sci/engine/selector.h" namespace Sci { -- cgit v1.2.3 From 496905dcc3f0871ef763de133010dc3b996de21d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 16:49:03 +0000 Subject: SCI: dont write palette in reorderView() if there is no palette :P svn-id: r50184 --- engines/sci/decompressor.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/engines/sci/decompressor.cpp b/engines/sci/decompressor.cpp index 84af50b596..96c7f24ef6 100644 --- a/engines/sci/decompressor.cpp +++ b/engines/sci/decompressor.cpp @@ -574,15 +574,17 @@ void DecompressorLZW::reorderView(byte *src, byte *dest) { for (c = 0; c < cel_total; c++) decodeRLE(&rle_ptr, &pix_ptr, cc_pos[c] + 8, cc_lengths[c]); - *writer++ = 'P'; - *writer++ = 'A'; - *writer++ = 'L'; + if (pal_offset) { + *writer++ = 'P'; + *writer++ = 'A'; + *writer++ = 'L'; - for (c = 0; c < 256; c++) - *writer++ = c; + for (c = 0; c < 256; c++) + *writer++ = c; - seeker -= 4; /* The missing four. Don't ask why. */ - memcpy(writer, seeker, 4*256 + 4); + seeker -= 4; /* The missing four. Don't ask why. */ + memcpy(writer, seeker, 4*256 + 4); + } free(cc_pos); free(cc_lengths); -- cgit v1.2.3 From e39f2ae1c19ecc1bf42a20ab1eb430e09e46ef52 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 16:53:56 +0000 Subject: SCI: adding cnick-longbow to inbetween sci1.1 in GfxPalette svn-id: r50185 --- engines/sci/graphics/palette.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index ef20aafc82..759f8979f3 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -74,7 +74,7 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) if (gameId == "laurabow2" || gameId == "qfg3" || gameId == "ecoquest") _alwaysForceRealMerge = true; } else { - if (gameId == "pq1sci" || gameId == "cnick-sq") + if (gameId == "pq1sci" || gameId == "cnick-sq" || gameId == "cnick-longbow") _alwaysForceRealMerge = true; } -- cgit v1.2.3 From e7634ee147323f1c698cc87671d5f49d40a16526 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 16:58:42 +0000 Subject: SCI: it seems that all cnick games are using the inbetween interpreter svn-id: r50186 --- engines/sci/graphics/palette.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 759f8979f3..28edfae24b 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -62,19 +62,17 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _alwaysForceRealMerge = false; // Pseudo-WORKAROUND - // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest 1 vga and Nick's Picks Space Quest + // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest 1 vga and all Nick's Picks // all use an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case - // FIXME: the other nick's Picks may also use the same interpreter, but we can not verify - // if the other games also get reported having palette issues, add them here Common::String gameId = g_sci->getGameId(); if (g_sci->isDemo()) { if (gameId == "laurabow2" || gameId == "qfg3" || gameId == "ecoquest") _alwaysForceRealMerge = true; } else { - if (gameId == "pq1sci" || gameId == "cnick-sq" || gameId == "cnick-longbow") + if (gameId == "pq1sci" || gameId == "cnick-sq" || gameId == "cnick-longbow" || gameId == "cnick-kq" || gameId == "cnick-laurabow" || gameId == "cnick-lsl") _alwaysForceRealMerge = true; } -- cgit v1.2.3 From 72ee20bc4d2aa4326530d1f91f2c5e5b3f6fa5db Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 17:05:54 +0000 Subject: SCI: cnick-laurabow & cnick-kq are called with -Nw 0 0... svn-id: r50187 --- engines/sci/graphics/ports.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index b8e3ec9c9d..a9bf81f013 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -84,11 +84,11 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te else _styleUser = SCI_WINDOWMGR_STYLE_USER | SCI_WINDOWMGR_STYLE_TRANSPARENT; - // Jones, Slater and Hoyle 3 were called with parameter -Nw 0 0 200 320. + // Jones, Slater, Hoyle 3&4 and Crazy Nicks Laura Bow/Kings Quest were called with parameter -Nw 0 0 200 320. // Mother Goose (SCI1) uses -Nw 0 0 159 262. The game will later use SetPort so we don't need to set the other fields. // This actually meant not skipping the first 10 pixellines in windowMgrPort Common::String gameId = g_sci->getGameId(); - if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) + if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || gameId == "cnick-laurabow" || gameId == "cnick-kq" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) offTop = 0; // Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere if (gameId == "fairytales") -- cgit v1.2.3 From 6d1f2d1d26ed1faad4c55aa8b4e71a290f0137fa Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 23 Jun 2010 17:30:18 +0000 Subject: Fixed memory fragmentation warnings in Crazy Nick's games svn-id: r50188 --- engines/sci/engine/kmisc.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 64da511ca8..4dd7df1b52 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -105,7 +105,11 @@ enum kMemoryInfoFunc { }; reg_t kMemoryInfo(EngineState *s, int argc, reg_t *argv) { - const uint16 size = 0x7fff; // Must not be 0xffff, or some memory calculations will overflow + // The free heap size returned must not be 0xffff, or some memory + // calculations will overflow. Crazy Nick's games handle up to 32746 + // bytes (0x7fea), otherwise they throw a warning that the memory is + // fragmented + const uint16 size = 0x7fea; switch (argv[0].offset) { case K_MEMORYINFO_LARGEST_HEAP_BLOCK: -- cgit v1.2.3 From 51ba34df0e7fce4f9760de9c2b3c0da77d605e06 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 23 Jun 2010 20:13:33 +0000 Subject: SCI: we extended the showBits() rect all the way depending on where the object moved, fixed - fixes kq6cd flickering coin and pq1 flickering locker issue svn-id: r50190 --- engines/sci/graphics/animate.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 59cbedd7a2..9018a6f62e 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -472,10 +472,12 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { _paint16->bitsShow(lsRect); workerRect = listEntry->celRect; } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft), workerRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop), workerRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight), workerRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom), workerRect.bottom); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft), listEntry->celRect.left); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop), listEntry->celRect.top); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight), listEntry->celRect.right); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom), listEntry->celRect.bottom); + // may get used for debugging + //_paint16->frameRect(workerRect); _paint16->bitsShow(workerRect); if (signal & kSignalHidden) { -- cgit v1.2.3 From 3838197ac14be050f1b2db5e1f26d82052dbd331 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 24 Jun 2010 01:29:46 +0000 Subject: Silence gcc warnings. svn-id: r50197 --- engines/m4/sprite.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 55de6714d1..48a36ac26e 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -125,19 +125,19 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { fillRect(bounds(), TRANSPARENT_COLOUR_INDEX); // Major line loop - for (int y = 0; y < h; ++y) { + for (int y2 = 0; y2 < h; ++y2) { byte *destP = getBasePtr(0, y); bool newLine = false; byte cmd = source->readByte(); - int x = 0; + int x2 = 0; if (cmd == 0xff) // The entire line is empty newLine = true; else if (cmd == 0xFD) { // Lines contains only run lenghs of pixels - while (x < w) { - byte cmd = source->readByte(); + while (x2 < w) { + cmd = source->readByte(); if (cmd == 0xff) { // End of line reached newLine = true; @@ -146,14 +146,14 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { byte v = source->readByte(); while (cmd-- > 0) { - if (x < w) + if (x2 < w) *destP++ = (v == 0xFD) ? TRANSPARENT_COLOUR_INDEX : v; - ++x; + ++x2; } } } else { // Line intermixes run lengths with individual pixels - while (x < w) { + while (x2 < w) { cmd = source->readByte(); if (cmd == 0xff) { // End of line reached @@ -166,15 +166,15 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { cmd = source->readByte(); byte v = source->readByte(); while (cmd-- > 0) { - if (x < w) { + if (x2 < w) { *destP++ = (v == 0xFD) ? TRANSPARENT_COLOUR_INDEX : v; } - ++x; + ++x2; } } else { // Handle writing out single pixel *destP++ = (cmd == 0xFD) ? TRANSPARENT_COLOUR_INDEX : cmd; - ++x; + ++x2; } } } -- cgit v1.2.3 From 7c9cbf75c0ed6e66b5c7875f5e7657313b943a5c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 24 Jun 2010 05:31:07 +0000 Subject: Implement the rest of xvalvecontrol for the boiler puzzle in Riven, initialize a variable for the boiler platform switch. svn-id: r50200 --- engines/mohawk/riven_external.cpp | 39 ++++++++++++++++++++++++++++++++------- engines/mohawk/riven_vars.cpp | 1 + 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 89e10c7deb..5b5163dbb3 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -662,15 +662,17 @@ void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) { // Get the variable for the valve uint32 *valve = _vm->matchVarToString("bvalve"); - Common::Event event; int changeX = 0; int changeY = 0; + bool done = false; // Set the cursor to the closed position _vm->_gfx->changeCursor(2004); _vm->_system->updateScreen(); - for (;;) { + while (!done) { + Common::Event event; + while (_vm->_system->getEventManager()->pollEvent(event)) { switch (event.type) { case Common::EVENT_MOUSEMOVE: @@ -682,30 +684,53 @@ void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) { // FIXME: These values for changes in x/y could be tweaked. if (*valve == 0 && changeY <= -10) { *valve = 1; - // TODO: Play movie + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_video->playMovieBlocking(2); _vm->refreshCard(); } else if (*valve == 1) { if (changeX >= 0 && changeY >= 10) { *valve = 0; - // TODO: Play movie + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_video->playMovieBlocking(3); _vm->refreshCard(); } else if (changeX <= -10 && changeY <= 10) { *valve = 2; - // TODO: Play movie + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_video->playMovieBlocking(1); _vm->refreshCard(); } } else if (*valve == 2 && changeX >= 10) { *valve = 1; - // TODO: Play movie + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_video->playMovieBlocking(4); _vm->refreshCard(); } - return; + done = true; default: break; } } _vm->_system->delayMillis(10); } + + // If we changed state and the new state is that the valve is flowing to + // the boiler, we need to update the boiler state. + if (*valve == 1) { + if (*_vm->matchVarToString("bidvlv") == 1) { // Check which way the water is going at the boiler + if (*_vm->matchVarToString("bblrarm") == 1) { + // If the pipe is open, make sure the water is drained out + *_vm->matchVarToString("bheat") = 0; + *_vm->matchVarToString("bblrwtr") = 0; + } else { + // If the pipe is closed, fill the boiler again + *_vm->matchVarToString("bheat") = *_vm->matchVarToString("bblrvalve"); + *_vm->matchVarToString("bblrwtr") = 1; + } + } else { + // Have the grating inside the boiler match the switch outside + *_vm->matchVarToString("bblrgrt") = (*_vm->matchVarToString("bblrsw") == 1) ? 0 : 1; + } + } } void RivenExternal::xbchipper(uint16 argc, uint16 *argv) { diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp index 3f7cd5a8b6..163626203a 100644 --- a/engines/mohawk/riven_vars.cpp +++ b/engines/mohawk/riven_vars.cpp @@ -319,6 +319,7 @@ void MohawkEngine_Riven::initVars() { *matchVarToString("bheat") = 1; *matchVarToString("waterenabled") = 1; *matchVarToString("ogehnpage") = 1; + *matchVarToString("bblrsw") = 1; // Randomize the telescope combination uint32 *teleCombo = matchVarToString("tcorrectorder"); -- cgit v1.2.3 From f65c4f988639b1ba5e6b2a95174aef3ec7fd8941 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 07:32:34 +0000 Subject: Changed an error in LocalVariables::dereference() back to a warning, as it occurs in 2 places during the intro of LB2 (called from kMemory(peek)) svn-id: r50202 --- engines/sci/engine/segment.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 98f03ff18a..28cc03d175 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -464,7 +464,10 @@ SegmentRef LocalVariables::dereference(reg_t pointer) { if (ret.maxSize > 0) { ret.reg = &_locals[pointer.offset / 2]; } else { - error("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); + // Happens in two places during the intro of LB2CD, both from kMemory(peek): + // - room 160: Heap 160 has 83 local variables (0-82), and the game asks for variables at indices 83 - 90 too + // - room 220: Heap 220 has 114 local variables (0-113), and the game asks for variables at indices 114-120 too + warning("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); ret.reg = 0; } return ret; -- cgit v1.2.3 From bbb29e2650bf9b51818e710fb177b6b19894c1fe Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 07:54:02 +0000 Subject: Fixed script 140 in the Island of Dr. Brain by adding a workaround for it inside op_link svn-id: r50203 --- engines/sci/engine/vm.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 350734f8fc..de04c49ef7 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -757,6 +757,9 @@ void run_vm(EngineState *s, bool restoring) { int old_executionStackBase = s->executionStackBase; // Used to detect the stack bottom, for "physical" returns const byte *code_buf = NULL; // (Avoid spurious warning) + // Used for a workaround in op_link below, in order to avoid string matching (which can + // be slow if used in the game script interpreter) + bool isIslandOfDrBrain = (g_sci->getGameId() == "islandbrain"); if (!local_script) { error("run_vm(): program counter gone astray (local_script pointer is null)"); @@ -1128,8 +1131,15 @@ void run_vm(EngineState *s, bool restoring) { break; case op_link: // 0x1f (31) - for (int i = 0; i < opparams[0]; i++) - s->xs->sp[i] = NULL_REG; + if (local_script->_nr == 140 && isIslandOfDrBrain) { + // WORKAROUND for The Island of Dr. Brain, room 140. + // Script 140 runs in an endless loop if we set its + // variables to 0 here. + } else { + for (int i = 0; i < opparams[0]; i++) + s->xs->sp[i] = NULL_REG; + } + s->xs->sp += opparams[0]; break; -- cgit v1.2.3 From 70e9df9566007a495f5b77fa6ee4c6d31efdbe15 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 24 Jun 2010 08:15:31 +0000 Subject: Corrected incorrect variable name change svn-id: r50204 --- engines/m4/sprite.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 48a36ac26e..4ce1b75b35 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -125,8 +125,8 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { fillRect(bounds(), TRANSPARENT_COLOUR_INDEX); // Major line loop - for (int y2 = 0; y2 < h; ++y2) { - byte *destP = getBasePtr(0, y); + for (int yp = 0; yp < h; ++yp) { + byte *destP = getBasePtr(0, yp); bool newLine = false; byte cmd = source->readByte(); int x2 = 0; -- cgit v1.2.3 From cd8bec1ae28c89f89fa8e4707a81b2947bd9ebc5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 24 Jun 2010 08:16:40 +0000 Subject: Corrected rendering of sprites into a scene background svn-id: r50205 --- engines/m4/mads_views.cpp | 31 +++++++++++++++++-------------- engines/m4/mads_views.h | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index a644e81d51..1184ab81e7 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -133,20 +133,22 @@ bool sortHelper(const DepthEntry &entry1, const DepthEntry &entry2) { typedef Common::List DepthList; -void MadsSpriteSlots::drawBackground() { +void MadsSpriteSlots::drawBackground(int yOffset) { // Draw all active sprites onto the background surface for (int i = 0; i < startIndex; ++i) { - if (_entries[i].spriteType >= 0) { + MadsSpriteSlot &slot = _entries[i]; + + if (slot.spriteType >= 0) { _owner._dirtyAreas[i].active = false; } else { _owner._dirtyAreas[i].textActive = true; - _owner._dirtyAreas.setSpriteSlot(i, _entries[i]); + _owner._dirtyAreas.setSpriteSlot(i, slot); - if (_entries[i].spriteType == BACKGROUND_SPRITE) { - SpriteAsset &spriteSet = getSprite(_entries[i].spriteListIndex); - M4Sprite *frame = spriteSet.getFrame((_entries[i].frameNumber & 0x7fff) - 1); - int xp = _entries[i].xp; - int yp = _entries[i].yp; + if (slot.spriteType == BACKGROUND_SPRITE) { + SpriteAsset &spriteSet = getSprite(slot.spriteListIndex); + M4Sprite *frame = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); + int xp = slot.xp; + int yp = slot.yp; if (_entries[i].scale != -1) { // Adjust position based on frame size @@ -154,12 +156,13 @@ void MadsSpriteSlots::drawBackground() { yp -= frame->height() / 2; } - if (_entries[i].depth <= 1) { - // No depth, so simply copy the frame onto the background - frame->copyTo(_owner._bgSurface, xp, yp, 0); + if (slot.depth > 1) { + // Draw the frame with depth processing + _owner._bgSurface->copyFrom(frame, xp, yp, Common::Point(0, yOffset), slot.depth, + _owner._depthSurface, 100, frame->getTransparencyIndex()); } else { - // Depth was specified, so draw frame using scene's depth information - frame->copyTo(_owner._bgSurface, xp, yp, _entries[i].depth, _owner._depthSurface, 100, 0); + // No depth, so simply draw the image + frame->copyTo(_owner._bgSurface, xp, yp + yOffset, frame->getTransparencyIndex()); } } } @@ -1201,7 +1204,7 @@ MadsView::~MadsView() { void MadsView::refresh() { // Draw any sprites - _spriteSlots.drawBackground(); + _spriteSlots.drawBackground(_yOffset); // Process dirty areas _textDisplay.setDirtyAreas(); diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index f0ded634b1..843596412e 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -97,7 +97,7 @@ public: void clear(); void deleteTimer(int seqIndex); - void drawBackground(); + void drawBackground(int yOffset); void drawForeground(View *view, int yOffset); void setDirtyAreas(); void fullRefresh(); -- cgit v1.2.3 From aa0c86e7557fbe68d33dec52139015562004742f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 24 Jun 2010 08:17:46 +0000 Subject: Bugfix for correctly decoding 2-bit encoded depth surfaces svn-id: r50206 --- engines/m4/mads_scene.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index a464438981..60fffadc07 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -714,7 +714,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su for (int byteCtr = 0; byteCtr < runLength; ++byteCtr) { byte v = byteVal; for (int bitCtr = 0; bitCtr < 4; ++bitCtr, v >>= 2) - *destP++ = v & 3; + *destP++ = (((v & 1) + 1) << 3) - 1; } } else { // 8-bit depth pixels -- cgit v1.2.3 From 0fb54293181d76d5b84cb7da5ff54c883630bf86 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 09:52:08 +0000 Subject: Initialize the stack with 'S' or 's' characters, like SSCI does (ultimately, we should not change the stack again like we do in op_link - this is what Sierra is doing). Some cleanup svn-id: r50207 --- engines/sci/engine/kgraphics.cpp | 2 +- engines/sci/engine/klists.cpp | 3 +-- engines/sci/engine/seg_manager.cpp | 8 +++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index bc278a2bb1..eaef049951 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -540,7 +540,7 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) { // WORKAROUND for a problem in LSL1VGA. This allows the casino door to be opened, // till the actual problem is found - if (g_sci->getGameId() == "lsl1sci" && s->currentRoomNumber() == 300) { + if (s->currentRoomNumber() == 300 && g_sci->getGameId() == "lsl1sci") { int top = readSelectorValue(s->_segMan, object, SELECTOR(brTop)); writeSelectorValue(s->_segMan, object, SELECTOR(brTop), top + 2); } diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 86d82bd3d1..1fd34849ea 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -115,8 +115,7 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { reg_t kNewList(EngineState *s, int argc, reg_t *argv) { reg_t listbase; - List *l; - l = s->_segMan->allocateList(&listbase); + List *l = s->_segMan->allocateList(&listbase); l->first = l->last = NULL_REG; debugC(2, kDebugLevelNodes, "New listbase at %04x:%04x", PRINT_REG(listbase)); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 5371238304..b464438553 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -402,6 +402,12 @@ DataStack *SegManager::allocateStack(int size, SegmentId *segid) { retval->_entries = (reg_t *)calloc(size, sizeof(reg_t)); retval->_capacity = size; + // SSCI initializes the stack with "S" characters (uppercase S in SCI0-SCI1, + // lowercase s in SCI0 and SCI11) - probably stands for "stack" + byte filler = (getSciVersion() >= SCI_VERSION_01 && getSciVersion() <= SCI_VERSION_1_LATE) ? 'S' : 's'; + for (int i = 0; i < size; i++) + retval->_entries[i] = make_reg(0, filler); + return retval; } @@ -448,7 +454,7 @@ byte *SegManager::getHunkPointer(reg_t addr) { HunkTable *ht = (HunkTable *)getSegment(addr.segment, SEG_TYPE_HUNK); if (!ht || !ht->isValidEntry(addr.offset)) { - warning("getHunkPointer() with invalid handle"); + warning("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr)); return NULL; } -- cgit v1.2.3 From afffcec96ec03a0e39d692080849e2e36722637a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 11:29:26 +0000 Subject: Turned two hacks inside validate_property() into errors till we find out where and why they occur (they shouldn't occur). Also turned an error inside send_selector() when argc > 1 into a warning - these are usually script bugs and aren't fatal svn-id: r50208 --- engines/sci/engine/vm.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index de04c49ef7..53cba93f98 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -103,13 +103,19 @@ static reg_t &validate_property(Object *obj, int index) { // may modify the value of the returned reg_t. static reg_t dummyReg = NULL_REG; + // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead + // to all sorts of issues! Turned it into an error for now... + // If this occurs, it means there's probably something wrong with the garbage + // collector, so don't hide it with fake return values if (!obj) { - debugC(2, kDebugLevelVM, "[VM] Sending to disposed object!"); + error("Sending to disposed object"); return dummyReg; } + // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead + // to all sorts of issues! Turned it into an error for now... if (index < 0 || (uint)index >= obj->getVarCount()) { - debugC(2, kDebugLevelVM, "[VM] Invalid property #%d (out of [0..%d]) requested!", + error("Invalid object property #%d (out of [0..%d]) requested!", index, obj->getVarCount()); return dummyReg; } @@ -421,11 +427,11 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt // QFG1VGA has a script bug in the longSong object when invoking the // loop selector, which doesn't affect gameplay, thus don't diplay it } else { - // Unknown script bug, show it + // Unknown script bug, show it. Usually these aren't fatal. reg_t oldReg = *varp.getPointer(s->_segMan); reg_t newReg = argp[1]; const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); - error("send_selector(): argc = %d while modifying variable selector " + warning("send_selector(): argc = %d while modifying variable selector " "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", argc, selector, selectorName, PRINT_REG(send_obj), objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); -- cgit v1.2.3 From 9a3ef9b8e17151993c9b1a6f79fd97ec058a4cc9 Mon Sep 17 00:00:00 2001 From: Arnaud Boutonné Date: Thu, 24 Jun 2010 11:50:25 +0000 Subject: Initialize properly paramCount in gob1. This fixes several valgrind errors, and the unknown opcodes are now skipped as expected. (related to bug #3018918, only partially solved) svn-id: r50209 --- engines/gob/inter_v1.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 805893d8a7..b35e0b8a82 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -1331,7 +1331,8 @@ bool Inter_v1::o1_goblinFunc(OpFuncParams ¶ms) { gobParams.retVarPtr.set(*_variables, 236); cmd = _vm->_game->_script->readInt16(); - _vm->_game->_script->skip(2); + gobParams.paramCount = _vm->_game->_script->readInt16(); + if ((cmd > 0) && (cmd < 17)) { objDescSet = true; gobParams.extraData = _vm->_game->_script->readInt16(); -- cgit v1.2.3 From 0722d96a3e249a7efe853d77b1432100912499d1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 11:52:08 +0000 Subject: SCI: fix kTextSize to not crash when destination has an invalid rect in it svn-id: r50210 --- engines/sci/graphics/text16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index c9a7f09973..e9adac9572 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -467,7 +467,7 @@ bool GfxText16::SwitchToFont900OnSjis(const char *text) { } void GfxText16::kernelTextSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { - Common::Rect rect(0, 0, *textWidth, *textHeight); + Common::Rect rect(0, 0, 0, 0); Size(rect, text, font, maxWidth); *textWidth = rect.width(); *textHeight = rect.height(); -- cgit v1.2.3 From f93ca1e4242da27079e6ce4cd4d4e8d569984ec4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 11:54:33 +0000 Subject: SCI: implement detection for uninitialized temp variable reads and implement direct fixes for them, i couldnt figure out a valid replacement for island, pharkas and laurabow2 work that way. this should also get changed to a replacement table svn-id: r50211 --- engines/sci/engine/kgraphics.cpp | 4 +++- engines/sci/engine/vm.cpp | 49 +++++++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index eaef049951..3d1bca320b 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -351,7 +351,7 @@ reg_t kTextSize(EngineState *s, int argc, reg_t *argv) { } textWidth = dest[3].toUint16(); textHeight = dest[2].toUint16(); - + #ifdef ENABLE_SCI32 if (!g_sci->_gfxText16) { // TODO: Implement this @@ -1041,6 +1041,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { bool hiresMode = (argc > 7) ? true : false; reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; +#if 0 if (g_sci->getGameId() == "freddypharkas") { // WORKAROUND // Script 24 contains code that draws the game menu on screen. It uses a temp variable for setting priority that @@ -1058,6 +1059,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { if ((viewId == 995) && (priority == 0)) priority = 15; } +#endif g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 53cba93f98..fdd2032ce3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -184,9 +184,28 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in } static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { - if (validate_variable(r, stack_base, type, max, index, line)) + if (validate_variable(r, stack_base, type, max, index, line)) { + if (type == VAR_TEMP && r[index].segment == 0xffff) { + // Uninitialized read on a temp + // We need to find correct replacements for each situation manually + // FIXME: this should use a table which contains workarounds for gameId, scriptnumber and temp index and + // a replacement value + Script *local_script = g_sci->getEngineState()->_segMan->getScriptIfLoaded(g_sci->getEngineState()->xs->local_segment); + int currentScriptNr = local_script->_nr; + warning("uninitialized read for temp %d, script %d", index, currentScriptNr); + Common::String gameId = g_sci->getGameId(); + if ((gameId == "laurabow2") && (currentScriptNr == 24) && (index == 5)) + return make_reg(0, 0xf); // priority replacement for menu + if ((gameId == "freddypharkas") && (currentScriptNr == 24) && (index == 5)) + return make_reg(0, 0xf); // priority replacement for menu + if ((gameId == "islandbrain") && (currentScriptNr == 140) && (index == 3)) { + r[index] = make_reg(0, 255); + return r[index]; + } + error("uninitialized read!"); + } return r[index]; - else + } else return default_value; } @@ -763,9 +782,6 @@ void run_vm(EngineState *s, bool restoring) { int old_executionStackBase = s->executionStackBase; // Used to detect the stack bottom, for "physical" returns const byte *code_buf = NULL; // (Avoid spurious warning) - // Used for a workaround in op_link below, in order to avoid string matching (which can - // be slow if used in the game script interpreter) - bool isIslandOfDrBrain = (g_sci->getGameId() == "islandbrain"); if (!local_script) { error("run_vm(): program counter gone astray (local_script pointer is null)"); @@ -1137,14 +1153,21 @@ void run_vm(EngineState *s, bool restoring) { break; case op_link: // 0x1f (31) - if (local_script->_nr == 140 && isIslandOfDrBrain) { - // WORKAROUND for The Island of Dr. Brain, room 140. - // Script 140 runs in an endless loop if we set its - // variables to 0 here. - } else { - for (int i = 0; i < opparams[0]; i++) - s->xs->sp[i] = NULL_REG; - } + // We shouldn't initialize temp variables at all + // We put special segment 0xFFFF in there, so that uninitialized reads can get detected + for (int i = 0; i < opparams[0]; i++) + s->xs->sp[i] = make_reg(0xffff, 0xffff); +// for (int i = 0; i < opparams[0]; i++) +// s->xs->sp[i] = make_reg(0, 'ss'); + + //if (local_script->_nr == 140 && isIslandOfDrBrain) { + // // WORKAROUND for The Island of Dr. Brain, room 140. + // // Script 140 runs in an endless loop if we set its + // // variables to 0 here. + //} else { + // for (int i = 0; i < opparams[0]; i++) + // s->xs->sp[i] = NULL_REG; + //} s->xs->sp += opparams[0]; break; -- cgit v1.2.3 From e5f22da0510065f1d38cfe745c49873f07de6904 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 12:25:47 +0000 Subject: SCI: added objectname and method name printed out when uninitialized temps are read svn-id: r50212 --- engines/sci/engine/vm.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index fdd2032ce3..6af5783e3b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -190,17 +190,32 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // We need to find correct replacements for each situation manually // FIXME: this should use a table which contains workarounds for gameId, scriptnumber and temp index and // a replacement value - Script *local_script = g_sci->getEngineState()->_segMan->getScriptIfLoaded(g_sci->getEngineState()->xs->local_segment); + EngineState *engine = g_sci->getEngineState(); + Script *local_script = engine->_segMan->getScriptIfLoaded(engine->xs->local_segment); int currentScriptNr = local_script->_nr; - warning("uninitialized read for temp %d, script %d", index, currentScriptNr); + + Common::List::iterator callIterator = engine->_executionStack.begin(); + ExecStack call = *callIterator; + while (callIterator != engine->_executionStack.end()) { + call = *callIterator; + callIterator++; + } + + const char *objName = engine->_segMan->getObjectName(call.sendp); + const char *selectorName = ""; + if (call.type == EXEC_STACK_TYPE_CALL) { + selectorName = g_sci->getKernel()->getSelectorName(call.selector).c_str(); + } + warning("uninitialized read for temp %d from method %s::%s (script %d)", index, objName, selectorName, currentScriptNr); + Common::String gameId = g_sci->getGameId(); if ((gameId == "laurabow2") && (currentScriptNr == 24) && (index == 5)) return make_reg(0, 0xf); // priority replacement for menu if ((gameId == "freddypharkas") && (currentScriptNr == 24) && (index == 5)) return make_reg(0, 0xf); // priority replacement for menu if ((gameId == "islandbrain") && (currentScriptNr == 140) && (index == 3)) { - r[index] = make_reg(0, 255); - return r[index]; + //r[index] = make_reg(0, 255); + //return r[index]; } error("uninitialized read!"); } -- cgit v1.2.3 From 898c9165d9a7f110b674a8bee82d30090a6010bc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 12:32:41 +0000 Subject: SCI: added currently known object/methodnames in comments for uninitialized reads svn-id: r50213 --- engines/sci/engine/vm.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 6af5783e3b..4204131ad3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -210,10 +210,11 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i Common::String gameId = g_sci->getGameId(); if ((gameId == "laurabow2") && (currentScriptNr == 24) && (index == 5)) - return make_reg(0, 0xf); // priority replacement for menu + return make_reg(0, 0xf); // priority replacement for menu - gcWin::open if ((gameId == "freddypharkas") && (currentScriptNr == 24) && (index == 5)) - return make_reg(0, 0xf); // priority replacement for menu + return make_reg(0, 0xf); // priority replacement for menu - gcWin::open if ((gameId == "islandbrain") && (currentScriptNr == 140) && (index == 3)) { + // piece::init //r[index] = make_reg(0, 255); //return r[index]; } -- cgit v1.2.3 From e45ffc68a32a13e81e7d12d3f43750f91e71cf91 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 13:17:45 +0000 Subject: SCI: created a workaround table for uninitialized reads, removing old commented out workarounds for pharkas and laura bow 2 svn-id: r50214 --- engines/sci/engine/kgraphics.cpp | 21 ----------------- engines/sci/engine/vm.cpp | 51 ++++++++++++++++++++++++++-------------- engines/sci/engine/vm.h | 9 +++++++ 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 3d1bca320b..974e034ddb 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -639,7 +639,6 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// This here is needed to make Pharkas work reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); @@ -1041,26 +1040,6 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { bool hiresMode = (argc > 7) ? true : false; reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; -#if 0 - if (g_sci->getGameId() == "freddypharkas") { - // WORKAROUND - // Script 24 contains code that draws the game menu on screen. It uses a temp variable for setting priority that - // is not set. in Sierra sci this happens to be 8250h. In our sci temporary variables are initialized thus we would - // get 0 here resulting in broken menus. - if ((viewId == 995) && (loopNo == 0) && (celNo == 0) && (priority == 0)) // game menu - priority = 15; - if ((viewId == 992) && (loopNo == 0) && (celNo == 0) && (priority == 0)) // quit game - priority = 15; - } - - if (g_sci->getGameId() == "laurabow2") { - // WORKAROUND - // see the one above - if ((viewId == 995) && (priority == 0)) - priority = 15; - } -#endif - g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); return s->r_acc; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4204131ad3..0e0b8308dc 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -183,16 +183,21 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in return true; } +static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { + { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "islandbrain", 140, "piece", "init", 3, 0 }, // currently unknown, new value is not right + { "", -1, "", "", 0, 0 } +}; + static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { if (validate_variable(r, stack_base, type, max, index, line)) { if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually - // FIXME: this should use a table which contains workarounds for gameId, scriptnumber and temp index and - // a replacement value EngineState *engine = g_sci->getEngineState(); Script *local_script = engine->_segMan->getScriptIfLoaded(engine->xs->local_segment); - int currentScriptNr = local_script->_nr; + int curScriptNr = local_script->_nr; Common::List::iterator callIterator = engine->_executionStack.begin(); ExecStack call = *callIterator; @@ -201,24 +206,34 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i callIterator++; } - const char *objName = engine->_segMan->getObjectName(call.sendp); - const char *selectorName = ""; + const char *curObjectName = engine->_segMan->getObjectName(call.sendp); + const char *curMethodName = ""; if (call.type == EXEC_STACK_TYPE_CALL) { - selectorName = g_sci->getKernel()->getSelectorName(call.selector).c_str(); + curMethodName = g_sci->getKernel()->getSelectorName(call.selector).c_str(); } - warning("uninitialized read for temp %d from method %s::%s (script %d)", index, objName, selectorName, currentScriptNr); - - Common::String gameId = g_sci->getGameId(); - if ((gameId == "laurabow2") && (currentScriptNr == 24) && (index == 5)) - return make_reg(0, 0xf); // priority replacement for menu - gcWin::open - if ((gameId == "freddypharkas") && (currentScriptNr == 24) && (index == 5)) - return make_reg(0, 0xf); // priority replacement for menu - gcWin::open - if ((gameId == "islandbrain") && (currentScriptNr == 140) && (index == 3)) { - // piece::init - //r[index] = make_reg(0, 255); - //return r[index]; + warning("uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName, curMethodName, curScriptNr); + + const char *gameId = g_sci->getGameId().c_str(); + + // Search if this is a known uninitialized read + const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; + while (workaround->gameId) { + if (strcmp(workaround->gameId, gameId) == 0) { + if (workaround->scriptNr == curScriptNr) { + if (strcmp(workaround->objectName, curObjectName) == 0) { + if (strcmp(workaround->methodName, curMethodName) == 0) { + if (workaround->index == index) { + // Workaround found + r[index] = make_reg(0, workaround->newValue); + return r[index]; + } + } + } + } + } + workaround++; } - error("uninitialized read!"); + error("unknown uninitialized read!"); } return r[index]; } else diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 88898cdbba..006bed4126 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -109,6 +109,15 @@ struct ExecStack { reg_t* getVarPointer(SegManager *segMan) const; }; +struct UninitializedReadWorkaround { + const char *gameId; + int scriptNr; + const char *objectName; + const char *methodName; + int index; + uint16 newValue; +}; + enum { VAR_GLOBAL = 0, VAR_LOCAL = 1, -- cgit v1.2.3 From 3fcb833148528e7f1e8b5e54668cb9bd99c17afb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 13:20:21 +0000 Subject: SCI: fixed workaround table from r50214 to have a valid terminator, also added another fix for pharkas svn-id: r50215 --- engines/sci/engine/vm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 0e0b8308dc..6e59c89e9d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -186,8 +186,9 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu { "islandbrain", 140, "piece", "init", 3, 0 }, // currently unknown, new value is not right - { "", -1, "", "", 0, 0 } + { NULL, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { -- cgit v1.2.3 From a268d3462b361588f60fba81e37d9bf5f048ccbc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 13:30:20 +0000 Subject: SCI: change fix for island to make it work svn-id: r50216 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 6e59c89e9d..7bf63e27a3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -187,7 +187,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { "islandbrain", 140, "piece", "init", 3, 0 }, // currently unknown, new value is not right + { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable { NULL, -1, NULL, NULL, 0, 0 } }; -- cgit v1.2.3 From 4b2661c06a77d36fe6e22fc9d55ab6a93b946675 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 13:38:24 +0000 Subject: SCI: removing warning for known uninitialized reads svn-id: r50217 --- engines/sci/engine/vm.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 7bf63e27a3..a1e354f092 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -212,8 +212,6 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (call.type == EXEC_STACK_TYPE_CALL) { curMethodName = g_sci->getKernel()->getSelectorName(call.selector).c_str(); } - warning("uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName, curMethodName, curScriptNr); - const char *gameId = g_sci->getGameId().c_str(); // Search if this is a known uninitialized read @@ -234,7 +232,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } workaround++; } - error("unknown uninitialized read!"); + error("uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName, curMethodName, curScriptNr); } return r[index]; } else -- cgit v1.2.3 From 59c908e97d8c2c71e4823cb04059f7bc56e3c414 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 13:44:27 +0000 Subject: Changed a warning which seems like regular SCI behavior into a debugC svn-id: r50218 --- engines/sci/sound/soundcmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 043f2b8516..5e0f45e166 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -678,7 +678,7 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { // If sound is not playing currently, set signal directly if (musicSlot->status != kSoundPlaying) { - warning("cmdFadeSound: fading requested, but sound is currently not playing"); + debugC(2, kDebugLevelSound, "cmdFadeSound: fading requested, but sound is currently not playing"); writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); return; } -- cgit v1.2.3 From 6a811a8ae69332bb181a65777f08a39d6f420abc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 13:45:31 +0000 Subject: Added more information concerning the Dr. Brain uninitialized read svn-id: r50219 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a1e354f092..30c3fd18d4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -187,7 +187,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable + { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 { NULL, -1, NULL, NULL, 0, 0 } }; -- cgit v1.2.3 From 00e88f15e3772eca43c7a8034bc4a31806eeb1dc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 17:02:55 +0000 Subject: SCI: arg5 is map for graph(updateBox), added comment svn-id: r50221 --- engines/sci/engine/kgraphics.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 974e034ddb..83637c61d0 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -301,6 +301,7 @@ reg_t kGraph(EngineState *s, int argc, reg_t *argv) { case K_GRAPH_UPDATE_BOX: { rect = kGraphCreateRect(x, y, x1, y1); bool hiresMode = (argc > 6) ? true : false; + // arg5 is the map (1 for visual, etc.) // argc == 7 on upscaled hires g_sci->_gfxPaint16->kernelGraphUpdateBox(rect, hiresMode); break; -- cgit v1.2.3 From b8e2e8e5ddf21a9b27bbc74e6658b637b092de9f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 17:10:26 +0000 Subject: SCI: added uninitialized read for room 720 in lsl1 svn-id: r50222 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 30c3fd18d4..d870eb96a6 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -187,6 +187,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 { NULL, -1, NULL, NULL, 0, 0 } }; -- cgit v1.2.3 From 7edbcc26f75e9953d3ed8225e351d398cf9099fc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 24 Jun 2010 17:48:15 +0000 Subject: Cleanup uninitialized read workaround(s). svn-id: r50225 --- engines/sci/engine/vm.cpp | 60 +++++++++++++++++++++++------------------------ engines/sci/engine/vm.h | 9 ------- 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d870eb96a6..0b4482e16f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -183,13 +183,20 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in return true; } -static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room - { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { NULL, -1, NULL, NULL, 0, 0 } +struct UninitializedReadWorkaround { + const char *gameId; + int scriptNr; + const char *objectName; + const char *methodName; + int index; + uint16 newValue; +} static const uninitializedReadWorkarounds[] = { + { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room + { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { NULL, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -197,43 +204,36 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually - EngineState *engine = g_sci->getEngineState(); - Script *local_script = engine->_segMan->getScriptIfLoaded(engine->xs->local_segment); + EngineState *state = g_sci->getEngineState(); + Script *local_script = state->_segMan->getScriptIfLoaded(state->xs->local_segment); int curScriptNr = local_script->_nr; - Common::List::iterator callIterator = engine->_executionStack.begin(); + Common::List::iterator callIterator = state->_executionStack.begin(); ExecStack call = *callIterator; - while (callIterator != engine->_executionStack.end()) { + while (callIterator != state->_executionStack.end()) { call = *callIterator; callIterator++; } - const char *curObjectName = engine->_segMan->getObjectName(call.sendp); - const char *curMethodName = ""; - if (call.type == EXEC_STACK_TYPE_CALL) { - curMethodName = g_sci->getKernel()->getSelectorName(call.selector).c_str(); - } - const char *gameId = g_sci->getGameId().c_str(); + Common::String curObjectName = state->_segMan->getObjectName(call.sendp); + Common::String curMethodName; + Common::String gameId = g_sci->getGameId(); + + if (call.type == EXEC_STACK_TYPE_CALL) + curMethodName = g_sci->getKernel()->getSelectorName(call.selector); // Search if this is a known uninitialized read const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; while (workaround->gameId) { - if (strcmp(workaround->gameId, gameId) == 0) { - if (workaround->scriptNr == curScriptNr) { - if (strcmp(workaround->objectName, curObjectName) == 0) { - if (strcmp(workaround->methodName, curMethodName) == 0) { - if (workaround->index == index) { - // Workaround found - r[index] = make_reg(0, workaround->newValue); - return r[index]; - } - } - } - } + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && workaround->objectName == curObjectName + && workaround->methodName == curMethodName && workaround->index == index) { + // Workaround found + r[index] = make_reg(0, workaround->newValue); + return r[index]; } workaround++; } - error("uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName, curMethodName, curScriptNr); + error("Uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); } return r[index]; } else diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 006bed4126..88898cdbba 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -109,15 +109,6 @@ struct ExecStack { reg_t* getVarPointer(SegManager *segMan) const; }; -struct UninitializedReadWorkaround { - const char *gameId; - int scriptNr; - const char *objectName; - const char *methodName; - int index; - uint16 newValue; -}; - enum { VAR_GLOBAL = 0, VAR_LOCAL = 1, -- cgit v1.2.3 From 346c3a3230cf19a3fe9b0306634864f8dfa60faa Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 18:17:36 +0000 Subject: SCI: added uninitialized workaround for sq4cd svn-id: r50226 --- engines/sci/engine/vm.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 0b4482e16f..4c039d72a0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -191,12 +191,13 @@ struct UninitializedReadWorkaround { int index; uint16 newValue; } static const uninitializedReadWorkarounds[] = { - { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room - { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { NULL, -1, NULL, NULL, 0, 0 } + { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room + { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { "sq4", 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller + { NULL, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { -- cgit v1.2.3 From 42ca630f46f0991f58592c7b2195ff41bdd73b04 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 24 Jun 2010 18:48:50 +0000 Subject: Fixed the LSL3 binoculars scene again, by fixing the invalid varselector reference svn-id: r50227 --- engines/sci/engine/vm.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4c039d72a0..b7da805251 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -101,23 +101,29 @@ static reg_t &validate_property(Object *obj, int index) { // A static dummy reg_t, which we return if obj or index turn out to be // invalid. Note that we cannot just return NULL_REG, because client code // may modify the value of the returned reg_t. - static reg_t dummyReg = NULL_REG; + //static reg_t dummyReg = NULL_REG; // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead // to all sorts of issues! Turned it into an error for now... // If this occurs, it means there's probably something wrong with the garbage // collector, so don't hide it with fake return values if (!obj) { - error("Sending to disposed object"); - return dummyReg; + error("validate_property: Sending to disposed object"); + //return dummyReg; } - // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead - // to all sorts of issues! Turned it into an error for now... + // This occurs in LSL3, binoculars scene. This gets called from kDoBresen, so fix + // the relevant invalid selector index. TODO: Why does this occur? This looks like + // a script bug. + EngineState *s = g_sci->getEngineState(); + if (index == 633 && s->currentRoomNumber() == 206 && g_sci->getGameId() == "lsl3") + index = 37; + if (index < 0 || (uint)index >= obj->getVarCount()) { - error("Invalid object property #%d (out of [0..%d]) requested!", - index, obj->getVarCount()); - return dummyReg; + error("Invalid object property #%d (out of [0..%d]) requested! Object: %04x:%04x, %s", + index, obj->getVarCount(), PRINT_REG(obj->getPos()), + s->_segMan->getObjectName(obj->getPos())); + //return dummyReg; } return obj->getVariableRef(index); -- cgit v1.2.3 From 381a862d61aa06c02f90071eeefffb28db3fcb4e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 20:01:31 +0000 Subject: SCI: partly reverting r50208, iceman has script code (fred::canBeHere) that asks for property 380. sierra also returned a zero when going out of bounds (see gregs engine object.cpp, ::getPropertyN - fixes iceman, lsl3 and probably more svn-id: r50229 --- engines/sci/engine/vm.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b7da805251..3ee1256034 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -112,6 +112,7 @@ static reg_t &validate_property(Object *obj, int index) { //return dummyReg; } +<<<<<<< HEAD // This occurs in LSL3, binoculars scene. This gets called from kDoBresen, so fix // the relevant invalid selector index. TODO: Why does this occur? This looks like // a script bug. @@ -124,6 +125,14 @@ static reg_t &validate_property(Object *obj, int index) { index, obj->getVarCount(), PRINT_REG(obj->getPos()), s->_segMan->getObjectName(obj->getPos())); //return dummyReg; +======= + if (index < 0 || (uint)index >= obj->getVarCount()) { + // This is same way sierra does it and there are some games, that contain such scripts like + // iceman script 998 (fred::canBeHere, executed right at the start) + debugC(2, kDebugLevelVM, "[VM] Invalid property #%d (out of [0..%d]) requested!", + index, obj->getVarCount()); + return dummyReg; +>>>>>>> 208309a... SCI: partly reverting r50208, iceman has script code (fred::canBeHere) that asks for property 380. sierra also returned a zero when going out of bounds (see gregs engine object.cpp, ::getPropertyN - fixes iceman, lsl3 and probably more } return obj->getVariableRef(index); @@ -929,6 +938,8 @@ void run_vm(EngineState *s, bool restoring) { s->xs->addr.pc.offset += readPMachineInstruction(code_buf + s->xs->addr.pc.offset, extOpcode, opparams); const byte opcode = extOpcode >> 1; + warning("%lx", opcode); + switch (opcode) { case op_bnot: // 0x00 (00) -- cgit v1.2.3 From b0fde0a1f6009432e1e5af8771176eea327af887 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 20:03:32 +0000 Subject: SCI: removing debug warning to show processes opcodes, accidentaly commited svn-id: r50230 --- engines/sci/engine/vm.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 3ee1256034..47b0d727ad 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -938,8 +938,6 @@ void run_vm(EngineState *s, bool restoring) { s->xs->addr.pc.offset += readPMachineInstruction(code_buf + s->xs->addr.pc.offset, extOpcode, opparams); const byte opcode = extOpcode >> 1; - warning("%lx", opcode); - switch (opcode) { case op_bnot: // 0x00 (00) -- cgit v1.2.3 From e8d31ccc078b4144ae073881b79517bae2b0cb07 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 20:10:51 +0000 Subject: SCI: fixing the tortoisegit commit disaster :P svn-id: r50231 --- engines/sci/engine/vm.cpp | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 47b0d727ad..ba4cb2826e 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -101,7 +101,7 @@ static reg_t &validate_property(Object *obj, int index) { // A static dummy reg_t, which we return if obj or index turn out to be // invalid. Note that we cannot just return NULL_REG, because client code // may modify the value of the returned reg_t. - //static reg_t dummyReg = NULL_REG; + static reg_t dummyReg = NULL_REG; // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead // to all sorts of issues! Turned it into an error for now... @@ -112,27 +112,12 @@ static reg_t &validate_property(Object *obj, int index) { //return dummyReg; } -<<<<<<< HEAD - // This occurs in LSL3, binoculars scene. This gets called from kDoBresen, so fix - // the relevant invalid selector index. TODO: Why does this occur? This looks like - // a script bug. - EngineState *s = g_sci->getEngineState(); - if (index == 633 && s->currentRoomNumber() == 206 && g_sci->getGameId() == "lsl3") - index = 37; - - if (index < 0 || (uint)index >= obj->getVarCount()) { - error("Invalid object property #%d (out of [0..%d]) requested! Object: %04x:%04x, %s", - index, obj->getVarCount(), PRINT_REG(obj->getPos()), - s->_segMan->getObjectName(obj->getPos())); - //return dummyReg; -======= if (index < 0 || (uint)index >= obj->getVarCount()) { // This is same way sierra does it and there are some games, that contain such scripts like // iceman script 998 (fred::canBeHere, executed right at the start) debugC(2, kDebugLevelVM, "[VM] Invalid property #%d (out of [0..%d]) requested!", index, obj->getVarCount()); return dummyReg; ->>>>>>> 208309a... SCI: partly reverting r50208, iceman has script code (fred::canBeHere) that asks for property 380. sierra also returned a zero when going out of bounds (see gregs engine object.cpp, ::getPropertyN - fixes iceman, lsl3 and probably more } return obj->getVariableRef(index); -- cgit v1.2.3 From 893429d092cd10a490d14beff74217a6080d1f5a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 20:40:57 +0000 Subject: SCI: correctly put NUL inside SegManager::strncpy() even when using n = 0xFFFFFFFFU svn-id: r50232 --- engines/sci/engine/seg_manager.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index b464438553..2178b42744 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -649,14 +649,15 @@ void SegManager::strncpy(reg_t dest, const char* src, size_t n) { ::strncpy((char *)dest_r.raw, src, n); } else { // raw -> non-raw - for (uint i = 0; i < n; i++) { + uint i; + for (i = 0; i < n; i++) { setChar(dest_r, i, src[i]); if (!src[i]) break; } // Put an ending NUL to terminate the string - if ((size_t)dest_r.maxSize > n) - setChar(dest_r, n, 0); + if ((size_t)dest_r.maxSize > i) + setChar(dest_r, i, 0); } } -- cgit v1.2.3 From 35b5da7e0fbc2ee3b3b81c2a0371ac57a00dc856 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 20:52:35 +0000 Subject: SCI: reverting r50232, didnt make sense. thx @ wjp for noticing svn-id: r50233 --- engines/sci/engine/seg_manager.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 2178b42744..b464438553 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -649,15 +649,14 @@ void SegManager::strncpy(reg_t dest, const char* src, size_t n) { ::strncpy((char *)dest_r.raw, src, n); } else { // raw -> non-raw - uint i; - for (i = 0; i < n; i++) { + for (uint i = 0; i < n; i++) { setChar(dest_r, i, src[i]); if (!src[i]) break; } // Put an ending NUL to terminate the string - if ((size_t)dest_r.maxSize > i) - setChar(dest_r, i, 0); + if ((size_t)dest_r.maxSize > n) + setChar(dest_r, n, 0); } } -- cgit v1.2.3 From a03afd18985ffef220ffbdce3ea4c66c035609da Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Thu, 24 Jun 2010 21:09:38 +0000 Subject: SCI: Make kStrAt clear segment when writing characters This is necessary since the uninitialized value detection from r50211, and is analogous to seg_manager.cpp's setChar. (Triggered in LSL3 age verification.) svn-id: r50234 --- engines/sci/engine/kstring.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 1927a79eea..f2f9543ad2 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -115,12 +115,14 @@ reg_t kStrAt(EngineState *s, int argc, reg_t *argv) { if (argc > 2) { /* Request to modify this char */ tmp.offset &= 0xff00; tmp.offset |= newvalue; + tmp.segment = 0; } } else { value = tmp.offset >> 8; if (argc > 2) { /* Request to modify this char */ tmp.offset &= 0x00ff; tmp.offset |= newvalue << 8; + tmp.segment = 0; } } } -- cgit v1.2.3 From 06a65d5c331bd009827f9fa711f7cdf5cc7905eb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 21:32:29 +0000 Subject: SCI: better initialize temp variables with FFFF:0 instead. foreign lsl3 uses kFileIO(readraw) and then kReadNumber directly. In that case we would produce many warnings because no terminating 0 is found svn-id: r50235 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ba4cb2826e..87280d1f9b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1188,7 +1188,7 @@ void run_vm(EngineState *s, bool restoring) { // We shouldn't initialize temp variables at all // We put special segment 0xFFFF in there, so that uninitialized reads can get detected for (int i = 0; i < opparams[0]; i++) - s->xs->sp[i] = make_reg(0xffff, 0xffff); + s->xs->sp[i] = make_reg(0xffff, 0); // for (int i = 0; i < opparams[0]; i++) // s->xs->sp[i] = make_reg(0, 'ss'); -- cgit v1.2.3 From f014c9ed7ef5a193ce17ba870698a389a65a985a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 21:42:08 +0000 Subject: SCI: ignore segment 0xFFFF in segmanager getchar, when offset > 1 - so we dont write a warning, if the scripts use some uninitialized temp variable as terminator svn-id: r50236 --- engines/sci/engine/seg_manager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index b464438553..6a03a959b3 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -612,8 +612,12 @@ static inline char getChar(const SegmentRef &ref, uint offset) { reg_t val = ref.reg[offset / 2]; + // segment 0xFFFF means that the scripts are using uninitialized temp-variable space + // we can safely ignore this, if it isn't one of the first 2 chars. + // foreign lsl3 uses kFileIO(readraw) and then immediately uses kReadNumber right at the start if (val.segment != 0) - warning("Attempt to read character from non-raw data"); + if ((offset > 1) && val.segment == 0xFFFF) + warning("Attempt to read character from non-raw data"); return (offset & 1 ? val.offset >> 8 : val.offset & 0xff); } -- cgit v1.2.3 From aa3bfe5489f45f922574265d21a9aa8059e5b208 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 24 Jun 2010 21:46:57 +0000 Subject: SCI: doing the exact opposite of r50236 code-wise now, as it was meant to be svn-id: r50237 --- engines/sci/engine/seg_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 6a03a959b3..e011de67d9 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -616,7 +616,7 @@ static inline char getChar(const SegmentRef &ref, uint offset) { // we can safely ignore this, if it isn't one of the first 2 chars. // foreign lsl3 uses kFileIO(readraw) and then immediately uses kReadNumber right at the start if (val.segment != 0) - if ((offset > 1) && val.segment == 0xFFFF) + if (!((val.segment == 0xFFFF) && (offset > 1))) warning("Attempt to read character from non-raw data"); return (offset & 1 ? val.offset >> 8 : val.offset & 0xff); -- cgit v1.2.3 From c96991d991ed46fe7d79bde67d21808cf03969d1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 21:59:03 +0000 Subject: Added some consts to the output of tools/po2c. svn-id: r50238 --- common/messages.cpp | 1901 +++++++++++++++++++++++++-------------------------- po/fr_FR.po | 591 ++++++++-------- po/hu_HU.po | 313 ++++----- po/ru_RU.po | 363 +++++----- po/scummvm.pot | 297 ++++---- tools/po2c | 14 +- 6 files changed, 1685 insertions(+), 1794 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 970990d56e..7be2a62598 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -3,7 +3,7 @@ #include #include -static const char * _po2c_msgids[] = { +static const char * const _po2c_msgids[] = { /* 0 */ "", /* 1 */ " Are you sure you want to quit ? ", /* 2 */ " Looking for a plugin supporting this gameid... ", @@ -22,310 +22,301 @@ static const char * _po2c_msgids[] = { /* 15 */ "48 kHz", /* 16 */ "8 kHz", /* 17 */ "", - /* 18 */ "ALSA", - /* 19 */ "About ScummVM", - /* 20 */ "AdLib", - /* 21 */ "AdLib emulator:", - /* 22 */ "AdLib is used for music in many games", - /* 23 */ "Add Game...", - /* 24 */ "Antialiased Renderer (16bpp)", - /* 25 */ "Aspect ratio correction", - /* 26 */ "Associated key : %s", - /* 27 */ "Associated key : none", - /* 28 */ "Atari ST MIDI", - /* 29 */ "Audio", - /* 30 */ "Autosave:", - /* 31 */ "A~b~out...", - /* 32 */ "Bind Keys", - /* 33 */ "Both", - /* 34 */ "Brightness:", - /* 35 */ "C1Available engines:", - /* 36 */ "C1Features compiled in:", - /* 37 */ "C2(built on ", - /* 38 */ "CAMD", - /* 39 */ "Cancel", - /* 40 */ "Cannot create file", - /* 41 */ "Change game options", - /* 42 */ "Change global ScummVM options", - /* 43 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", - /* 44 */ "Choose", - /* 45 */ "Choose an action to map", - /* 46 */ "Clear value", - /* 47 */ "Close", - /* 48 */ "CoreAudio", - /* 49 */ "CoreMIDI", - /* 50 */ "Correct aspect ratio for 320x200 games", - /* 51 */ "Could not find any engine capable of running the selected game", - /* 52 */ "Creative Music System", - /* 53 */ "Current video mode:", - /* 54 */ "Cursor Down", - /* 55 */ "Cursor Left", - /* 56 */ "Cursor Right", - /* 57 */ "Cursor Up", - /* 58 */ "DMedia", - /* 59 */ "DVD", - /* 60 */ "DVD Mounted successfully", - /* 61 */ "DVD not mounted", - /* 62 */ "Date: ", - /* 63 */ "Debugger", - /* 64 */ "Default", - /* 65 */ "Delete", - /* 66 */ "Disable power off", - /* 67 */ "Disabled GFX", - /* 68 */ "Discovered %d new games ...", - /* 69 */ "Discovered %d new games.", - /* 70 */ "Display ", - /* 71 */ "Display keyboard", - /* 72 */ "Do you really want to delete this savegame?", - /* 73 */ "Do you really want to remove this game configuration?", - /* 74 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 75 */ "Do you want to load or save the game?", - /* 76 */ "Do you want to perform an automatic scan ?", - /* 77 */ "Do you want to quit ?", - /* 78 */ "Double-strike", - /* 79 */ "Down", - /* 80 */ "Enable Roland GS Mode", - /* 81 */ "Engine does not support debug level '%s'", - /* 82 */ "English", - /* 83 */ "Error running game:", - /* 84 */ "Error while mounting the DVD", - /* 85 */ "Extra Path:", - /* 86 */ "FM Towns", - /* 87 */ "Failed to load any GUI theme, aborting", - /* 88 */ "Fast mode", - /* 89 */ "FluidSynth", - /* 90 */ "Free look", - /* 91 */ "Full title of the game", - /* 92 */ "Fullscreen mode", - /* 93 */ "GC Pad acceleration:", - /* 94 */ "GC Pad sensitivity:", - /* 95 */ "GFX", - /* 96 */ "GUI Language:", - /* 97 */ "GUI Renderer:", - /* 98 */ "Game", - /* 99 */ "Game Data not found", - /* 100 */ "Game Id not supported", - /* 101 */ "Game Path:", - /* 102 */ "Global menu", - /* 103 */ "Go to previous directory level", - /* 104 */ "Go up", - /* 105 */ "Graphics", - /* 106 */ "Graphics mode:", - /* 107 */ "Hardware scale (fast, but low quality)", - /* 108 */ "Hide Toolbar", - /* 109 */ "High quality audio (slower) (reboot)", - /* 110 */ "Higher value specifies better sound quality but may be not supported by your soundcard", - /* 111 */ "Hold Shift for Mass Add", - /* 112 */ "Horizontal underscan:", - /* 113 */ "IBM PCjr", - /* 114 */ "ID:", - /* 115 */ "Init network", - /* 116 */ "Initial top screen scale:", - /* 117 */ "Initialising network", - /* 118 */ "Input", - /* 119 */ "Invalid Path", - /* 120 */ "Key mapper", - /* 121 */ "Keyboard", - /* 122 */ "Keymap:", - /* 123 */ "Keys", - /* 124 */ "Language of ScummVM GUI", - /* 125 */ "Language of the game. This will not turn your Spanish game version into English", - /* 126 */ "Language:", - /* 127 */ "Left", - /* 128 */ "Left Click", - /* 129 */ "Load", - /* 130 */ "Load game:", - /* 131 */ "Load savegame for selected game", - /* 132 */ "MIDI", - /* 133 */ "MIDI gain:", - /* 134 */ "MT-32 Emulation", - /* 135 */ "Main screen scaling:", - /* 136 */ "Map", - /* 137 */ "Mass Add...", - /* 138 */ "Menu", - /* 139 */ "Misc", - /* 140 */ "Mixed AdLib/MIDI mode", - /* 141 */ "Mount DVD", - /* 142 */ "Mount SMB", - /* 143 */ "Mouse click", - /* 144 */ "Multi Function", - /* 145 */ "Music driver:", - /* 146 */ "Music volume:", - /* 147 */ "Mute All", - /* 148 */ "Name:", - /* 149 */ "Network down", - /* 150 */ "Network not initialsed (%d)", - /* 151 */ "Network up", - /* 152 */ "Network up, share mounted", - /* 153 */ "Never", - /* 154 */ "No", - /* 155 */ "No date saved", - /* 156 */ "No music", - /* 157 */ "No playtime saved", - /* 158 */ "No time saved", - /* 159 */ "None", - /* 160 */ "OK", - /* 161 */ "Ok", - /* 162 */ "Output rate:", - /* 163 */ "Override global MIDI settings", - /* 164 */ "Override global audio settings", - /* 165 */ "Override global graphic settings", - /* 166 */ "Override global volume settings", - /* 167 */ "PC Speaker", - /* 168 */ "Password:", - /* 169 */ "Path not a directory", - /* 170 */ "Path not a file", - /* 171 */ "Path not exists", - /* 172 */ "Paths", - /* 173 */ "Pause", - /* 174 */ "Pick the game:", - /* 175 */ "Platform the game was originally designed for", - /* 176 */ "Platform:", - /* 177 */ "Playtime: ", - /* 178 */ "Please select an action", - /* 179 */ "Plugins Path:", - /* 180 */ "Press the key to associate", - /* 181 */ "Quit", - /* 182 */ "Quit ScummVM", - /* 183 */ "Read permission denied", - /* 184 */ "Reading failed", - /* 185 */ "Remap keys", - /* 186 */ "Remove game from the list. The game data files stay intact", - /* 187 */ "Render mode:", - /* 188 */ "Right", - /* 189 */ "Right Click", - /* 190 */ "Right click", - /* 191 */ "Rotate", - /* 192 */ "SEQ", - /* 193 */ "SFX volume:", - /* 194 */ "SMB", - /* 195 */ "Save", - /* 196 */ "Save Path:", - /* 197 */ "Save Path: ", - /* 198 */ "Save game:", - /* 199 */ "Scan complete!", - /* 200 */ "Scanned %d directories ...", - /* 201 */ "ScummVM Main Menu", - /* 202 */ "ScummVM could not find any engine capable of running the selected game!", - /* 203 */ "ScummVM could not find any game in the specified directory!", - /* 204 */ "ScummVM couldn't open the specified directory!", - /* 205 */ "Search in game list", - /* 206 */ "Search:", - /* 207 */ "Select SoundFont", - /* 208 */ "Select a Theme", - /* 209 */ "Select additional game directory", - /* 210 */ "Select an action and click 'Map'", - /* 211 */ "Select directory for GUI themes", - /* 212 */ "Select directory for extra files", - /* 213 */ "Select directory for plugins", - /* 214 */ "Select directory for saved games", - /* 215 */ "Select directory for savegames", - /* 216 */ "Select directory with game data", - /* 217 */ "Sensitivity", - /* 218 */ "Server:", - /* 219 */ "Share:", - /* 220 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 221 */ "Show Keyboard", - /* 222 */ "Show mouse cursor", - /* 223 */ "Show subtitles and play speech", - /* 224 */ "Show/Hide Cursor", - /* 225 */ "Skip", - /* 226 */ "Skip line", - /* 227 */ "Skip text", - /* 228 */ "Snap to edges", - /* 229 */ "Software scale (good quality, but slower)", - /* 230 */ "Sound on/off", - /* 231 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 232 */ "SoundFont:", - /* 233 */ "Spch", - /* 234 */ "Special dithering modes supported by some games", - /* 235 */ "Special sound effects volume", - /* 236 */ "Specifies output sound device or sound card emulator", - /* 237 */ "Specifies path to additional data used by all games or ScummVM", - /* 238 */ "Specifies path to additional data used the game", - /* 239 */ "Specifies where your savegames are put", - /* 240 */ "Speech", - /* 241 */ "Speech volume:", - /* 242 */ "Standard Renderer (16bpp)", - /* 243 */ "Start selected game", - /* 244 */ "Status:", - /* 245 */ "Subs", - /* 246 */ "Subtitle speed:", - /* 247 */ "Subtitles", - /* 248 */ "Swap character", - /* 249 */ "Tap for left click, double tap right click", - /* 250 */ "Tapwave Zodiac", - /* 251 */ "Text and Speech:", - /* 252 */ "The chosen directory cannot be written to. Please select another one.", - /* 253 */ "Theme Path:", - /* 254 */ "Theme:", - /* 255 */ "This game ID is already taken. Please choose another one.", - /* 256 */ "This game does not support loading games from the launcher.", - /* 257 */ "TiMidity", - /* 258 */ "Time: ", - /* 259 */ "Timeout while initialising network", - /* 260 */ "Touch X Offset", - /* 261 */ "Touch Y Offset", - /* 262 */ "Touchpad mode disabled.", - /* 263 */ "Touchpad mode enabled.", - /* 264 */ "True Roland MT-32 (disable GM emulation)", - /* 265 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 266 */ "Unknown", - /* 267 */ "Unknown Error", - /* 268 */ "Unmount DVD", - /* 269 */ "Unmount SMB", - /* 270 */ "Unscaled (you must scroll left and right)", - /* 271 */ "Unsupported Color Mode", - /* 272 */ "Untitled savestate", - /* 273 */ "Up", - /* 274 */ "Use both MIDI and AdLib sound generation", - /* 275 */ "Use laptop trackpad-style cursor control", - /* 276 */ "User picked target '%s' (gameid '%s')...\n", - /* 277 */ "Username:", - /* 278 */ "Using SDL driver ", - /* 279 */ "Vertical underscan:", - /* 280 */ "Video", - /* 281 */ "Virtual keyboard", - /* 282 */ "Volume", - /* 283 */ "Windows MIDI", - /* 284 */ "Write permission denied", - /* 285 */ "Writing data failed", - /* 286 */ "Yamaha Pa1", - /* 287 */ "Yes", - /* 288 */ "You have to restart ScummVM to take the effect.", - /* 289 */ "Zone", - /* 290 */ "Zoom down", - /* 291 */ "Zoom up", - /* 292 */ "every 10 mins", - /* 293 */ "every 15 mins", - /* 294 */ "every 30 mins", - /* 295 */ "every 5 mins", - /* 296 */ "failed\n", - /* 297 */ "~A~bout", - /* 298 */ "~A~dd Game...", - /* 299 */ "~C~ancel", - /* 300 */ "~C~lose", - /* 301 */ "~E~dit Game...", - /* 302 */ "~H~elp", - /* 303 */ "~I~ndy fight controls", - /* 304 */ "~K~eys", - /* 305 */ "~L~eft handed mode", - /* 306 */ "~L~oad", - /* 307 */ "~L~oad...", - /* 308 */ "~N~ext", - /* 309 */ "~O~K", - /* 310 */ "~O~ptions", - /* 311 */ "~O~ptions...", - /* 312 */ "~P~revious", - /* 313 */ "~Q~uit", - /* 314 */ "~R~emove Game", - /* 315 */ "~R~esume", - /* 316 */ "~R~eturn to Launcher", - /* 317 */ "~S~ave", - /* 318 */ "~S~tart", - /* 319 */ "~T~ransitions Enabled", - /* 320 */ "~W~ater Effect Enabled", - /* 321 */ "~Z~ip Mode Activated", + /* 18 */ "About ScummVM", + /* 19 */ "AdLib Emulator", + /* 20 */ "AdLib emulator:", + /* 21 */ "AdLib is used for music in many games", + /* 22 */ "Add Game...", + /* 23 */ "Antialiased Renderer (16bpp)", + /* 24 */ "Aspect ratio correction", + /* 25 */ "Associated key : %s", + /* 26 */ "Associated key : none", + /* 27 */ "Audio", + /* 28 */ "Autosave:", + /* 29 */ "A~b~out...", + /* 30 */ "Bind Keys", + /* 31 */ "Both", + /* 32 */ "Brightness:", + /* 33 */ "C1Available engines:", + /* 34 */ "C1Features compiled in:", + /* 35 */ "C2(built on ", + /* 36 */ "Cancel", + /* 37 */ "Cannot create file", + /* 38 */ "Change game options", + /* 39 */ "Change global ScummVM options", + /* 40 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 41 */ "Choose", + /* 42 */ "Choose an action to map", + /* 43 */ "Clear value", + /* 44 */ "Close", + /* 45 */ "Correct aspect ratio for 320x200 games", + /* 46 */ "Could not find any engine capable of running the selected game", + /* 47 */ "Current video mode:", + /* 48 */ "Cursor Down", + /* 49 */ "Cursor Left", + /* 50 */ "Cursor Right", + /* 51 */ "Cursor Up", + /* 52 */ "DVD", + /* 53 */ "DVD Mounted successfully", + /* 54 */ "DVD not mounted", + /* 55 */ "Date: ", + /* 56 */ "Debugger", + /* 57 */ "Default", + /* 58 */ "Delete", + /* 59 */ "Disable power off", + /* 60 */ "Disabled GFX", + /* 61 */ "Discovered %d new games ...", + /* 62 */ "Discovered %d new games.", + /* 63 */ "Display ", + /* 64 */ "Display keyboard", + /* 65 */ "Do you really want to delete this savegame?", + /* 66 */ "Do you really want to remove this game configuration?", + /* 67 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 68 */ "Do you want to load or save the game?", + /* 69 */ "Do you want to perform an automatic scan ?", + /* 70 */ "Do you want to quit ?", + /* 71 */ "Double-strike", + /* 72 */ "Down", + /* 73 */ "Enable Roland GS Mode", + /* 74 */ "Engine does not support debug level '%s'", + /* 75 */ "English", + /* 76 */ "Error running game:", + /* 77 */ "Error while mounting the DVD", + /* 78 */ "Extra Path:", + /* 79 */ "FM Towns Emulator", + /* 80 */ "Failed to load any GUI theme, aborting", + /* 81 */ "Fast mode", + /* 82 */ "Free look", + /* 83 */ "Full title of the game", + /* 84 */ "Fullscreen mode", + /* 85 */ "GC Pad acceleration:", + /* 86 */ "GC Pad sensitivity:", + /* 87 */ "GFX", + /* 88 */ "GM Device:", + /* 89 */ "GUI Language:", + /* 90 */ "GUI Renderer:", + /* 91 */ "Game", + /* 92 */ "Game Data not found", + /* 93 */ "Game Id not supported", + /* 94 */ "Game Path:", + /* 95 */ "Global menu", + /* 96 */ "Go to previous directory level", + /* 97 */ "Go up", + /* 98 */ "Graphics", + /* 99 */ "Graphics mode:", + /* 100 */ "Hardware scale (fast, but low quality)", + /* 101 */ "Hide Toolbar", + /* 102 */ "High quality audio (slower) (reboot)", + /* 103 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 104 */ "Hold Shift for Mass Add", + /* 105 */ "Horizontal underscan:", + /* 106 */ "ID:", + /* 107 */ "Init network", + /* 108 */ "Initial top screen scale:", + /* 109 */ "Initialising MT-32 Emulator", + /* 110 */ "Initialising network", + /* 111 */ "Input", + /* 112 */ "Invalid Path", + /* 113 */ "Key mapper", + /* 114 */ "Keyboard", + /* 115 */ "Keymap:", + /* 116 */ "Keys", + /* 117 */ "Language of ScummVM GUI", + /* 118 */ "Language of the game. This will not turn your Spanish game version into English", + /* 119 */ "Language:", + /* 120 */ "Left", + /* 121 */ "Left Click", + /* 122 */ "Load", + /* 123 */ "Load game:", + /* 124 */ "Load savegame for selected game", + /* 125 */ "MIDI", + /* 126 */ "MIDI gain:", + /* 127 */ "MT-32 Emulator", + /* 128 */ "MT32 Device:", + /* 129 */ "Main screen scaling:", + /* 130 */ "Map", + /* 131 */ "Mass Add...", + /* 132 */ "Menu", + /* 133 */ "Misc", + /* 134 */ "Mixed AdLib/MIDI mode", + /* 135 */ "Mount DVD", + /* 136 */ "Mount SMB", + /* 137 */ "Mouse click", + /* 138 */ "Multi Function", + /* 139 */ "Music volume:", + /* 140 */ "Mute All", + /* 141 */ "Name:", + /* 142 */ "Network down", + /* 143 */ "Network not initialsed (%d)", + /* 144 */ "Network up", + /* 145 */ "Network up, share mounted", + /* 146 */ "Never", + /* 147 */ "No", + /* 148 */ "No date saved", + /* 149 */ "No music", + /* 150 */ "No playtime saved", + /* 151 */ "No time saved", + /* 152 */ "None", + /* 153 */ "OK", + /* 154 */ "Ok", + /* 155 */ "Output rate:", + /* 156 */ "Override global MIDI settings", + /* 157 */ "Override global audio settings", + /* 158 */ "Override global graphic settings", + /* 159 */ "Override global volume settings", + /* 160 */ "Password:", + /* 161 */ "Path not a directory", + /* 162 */ "Path not a file", + /* 163 */ "Path not exists", + /* 164 */ "Paths", + /* 165 */ "Pause", + /* 166 */ "Pick the game:", + /* 167 */ "Platform the game was originally designed for", + /* 168 */ "Platform:", + /* 169 */ "Playtime: ", + /* 170 */ "Please select an action", + /* 171 */ "Plugins Path:", + /* 172 */ "Preferred Device:", + /* 173 */ "Press the key to associate", + /* 174 */ "Quit", + /* 175 */ "Quit ScummVM", + /* 176 */ "Read permission denied", + /* 177 */ "Reading failed", + /* 178 */ "Remap keys", + /* 179 */ "Remove game from the list. The game data files stay intact", + /* 180 */ "Render mode:", + /* 181 */ "Right", + /* 182 */ "Right Click", + /* 183 */ "Right click", + /* 184 */ "Rotate", + /* 185 */ "SFX volume:", + /* 186 */ "SMB", + /* 187 */ "Save", + /* 188 */ "Save Path:", + /* 189 */ "Save Path: ", + /* 190 */ "Save game:", + /* 191 */ "Scan complete!", + /* 192 */ "Scanned %d directories ...", + /* 193 */ "ScummVM Main Menu", + /* 194 */ "ScummVM could not find any engine capable of running the selected game!", + /* 195 */ "ScummVM could not find any game in the specified directory!", + /* 196 */ "ScummVM couldn't open the specified directory!", + /* 197 */ "Search in game list", + /* 198 */ "Search:", + /* 199 */ "Select SoundFont", + /* 200 */ "Select a Theme", + /* 201 */ "Select additional game directory", + /* 202 */ "Select an action and click 'Map'", + /* 203 */ "Select directory for GUI themes", + /* 204 */ "Select directory for extra files", + /* 205 */ "Select directory for plugins", + /* 206 */ "Select directory for saved games", + /* 207 */ "Select directory for savegames", + /* 208 */ "Select directory with game data", + /* 209 */ "Sensitivity", + /* 210 */ "Server:", + /* 211 */ "Share:", + /* 212 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 213 */ "Show Keyboard", + /* 214 */ "Show mouse cursor", + /* 215 */ "Show subtitles and play speech", + /* 216 */ "Show/Hide Cursor", + /* 217 */ "Skip", + /* 218 */ "Skip line", + /* 219 */ "Skip text", + /* 220 */ "Snap to edges", + /* 221 */ "Software scale (good quality, but slower)", + /* 222 */ "Sound on/off", + /* 223 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 224 */ "SoundFont:", + /* 225 */ "Spch", + /* 226 */ "Special dithering modes supported by some games", + /* 227 */ "Special sound effects volume", + /* 228 */ "Specifies default sound device for General Midi output", + /* 229 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", + /* 230 */ "Specifies output sound device or sound card emulator", + /* 231 */ "Specifies path to additional data used by all games or ScummVM", + /* 232 */ "Specifies path to additional data used the game", + /* 233 */ "Specifies preferred sound device or sound card emulator", + /* 234 */ "Specifies where your savegames are put", + /* 235 */ "Speech", + /* 236 */ "Speech volume:", + /* 237 */ "Standard Renderer (16bpp)", + /* 238 */ "Start selected game", + /* 239 */ "Status:", + /* 240 */ "Subs", + /* 241 */ "Subtitle speed:", + /* 242 */ "Subtitles", + /* 243 */ "Swap character", + /* 244 */ "Tap for left click, double tap right click", + /* 245 */ "Text and Speech:", + /* 246 */ "The chosen directory cannot be written to. Please select another one.", + /* 247 */ "Theme Path:", + /* 248 */ "Theme:", + /* 249 */ "This game ID is already taken. Please choose another one.", + /* 250 */ "This game does not support loading games from the launcher.", + /* 251 */ "Time: ", + /* 252 */ "Timeout while initialising network", + /* 253 */ "Touch X Offset", + /* 254 */ "Touch Y Offset", + /* 255 */ "Touchpad mode disabled.", + /* 256 */ "Touchpad mode enabled.", + /* 257 */ "True Roland MT-32 (disable GM emulation)", + /* 258 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 259 */ "Unknown", + /* 260 */ "Unknown Error", + /* 261 */ "Unmount DVD", + /* 262 */ "Unmount SMB", + /* 263 */ "Unscaled (you must scroll left and right)", + /* 264 */ "Unsupported Color Mode", + /* 265 */ "Untitled savestate", + /* 266 */ "Up", + /* 267 */ "Use both MIDI and AdLib sound generation", + /* 268 */ "Use laptop trackpad-style cursor control", + /* 269 */ "User picked target '%s' (gameid '%s')...\n", + /* 270 */ "Username:", + /* 271 */ "Using SDL driver ", + /* 272 */ "Vertical underscan:", + /* 273 */ "Video", + /* 274 */ "Virtual keyboard", + /* 275 */ "Volume", + /* 276 */ "Write permission denied", + /* 277 */ "Writing data failed", + /* 278 */ "Yes", + /* 279 */ "You have to restart ScummVM to take the effect.", + /* 280 */ "Zone", + /* 281 */ "Zoom down", + /* 282 */ "Zoom up", + /* 283 */ "every 10 mins", + /* 284 */ "every 15 mins", + /* 285 */ "every 30 mins", + /* 286 */ "every 5 mins", + /* 287 */ "failed\n", + /* 288 */ "~A~bout", + /* 289 */ "~A~dd Game...", + /* 290 */ "~C~ancel", + /* 291 */ "~C~lose", + /* 292 */ "~E~dit Game...", + /* 293 */ "~H~elp", + /* 294 */ "~I~ndy fight controls", + /* 295 */ "~K~eys", + /* 296 */ "~L~eft handed mode", + /* 297 */ "~L~oad", + /* 298 */ "~L~oad...", + /* 299 */ "~N~ext", + /* 300 */ "~O~K", + /* 301 */ "~O~ptions", + /* 302 */ "~O~ptions...", + /* 303 */ "~P~revious", + /* 304 */ "~Q~uit", + /* 305 */ "~R~emove Game", + /* 306 */ "~R~esume", + /* 307 */ "~R~eturn to Launcher", + /* 308 */ "~S~ave", + /* 309 */ "~S~tart", + /* 310 */ "~T~ransitions Enabled", + /* 311 */ "~W~ater Effect Enabled", + /* 312 */ "~Z~ip Mode Activated", NULL }; @@ -334,8 +325,8 @@ struct _po2c_msg { const char * msgstr; }; -static struct _po2c_msg _po2c_lang_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, +static const struct _po2c_msg _po2c_lang_ru_RU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, @@ -353,315 +344,302 @@ static struct _po2c_msg _po2c_lang_ru_RU[] = { { 15, "48 \352\303\366" }, { 16, "8 \352\303\366" }, { 17, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, - { 18, "ALSA" }, - { 19, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 20, "AdLib" }, - { 21, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 22, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 23, "\315\356\342. \350\343\360\340..." }, - { 24, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 25, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 27, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 28, "Atars ST MIDI" }, - { 29, "\300\363\344\350\356" }, - { 30, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 31, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 32, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 33, "\302\361\270" }, - { 34, "\337\360\352\356\361\362\374:" }, - { 35, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 36, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 37, "C2(\361\356\341\360\340\355 " }, - { 38, "CAMD" }, - { 39, "\316\362\354\345\355\340" }, - { 40, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 41, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 42, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 43, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 44, "\302\373\341\360\340\362\374" }, - { 45, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 46, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 47, "\307\340\352\360\373\362\374" }, - { 48, "CoreAudio" }, - { 49, "CoreMIDI" }, - { 50, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 51, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 52, "Creative Music System" }, - { 53, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, - { 54, "\312\363\360\361\356\360 \342\355\350\347" }, - { 55, "\312\363\360\361\356\360 \342\353\345\342\356" }, - { 56, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, - { 57, "\312\363\360\361\356\360 \342\342\345\360\365" }, - { 58, "DMedia" }, - { 59, "DVD" }, - { 60, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, - { 61, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, - { 62, "\304\340\362\340: " }, - { 63, "\316\362\353\340\344\367\350\352" }, - { 64, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 65, "\323\344\340\353\350\362\374" }, - { 66, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, - { 67, "\301\345\347 \343\360\340\364\350\352\350" }, - { 68, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 69, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 70, "\317\356\352\340\347\340\362\374 " }, - { 71, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 72, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 73, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 74, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 75, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, - { 76, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, - { 77, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, - { 78, "\304\342\356\351\355\356\351 \363\344\340\360" }, - { 79, "\302\355\350\347" }, - { 80, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 81, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 82, "English" }, - { 83, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 84, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, - { 85, "\304\356\357. \357\363\362\374:" }, - { 86, "FM Towns" }, - { 87, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 88, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, - { 89, "FluidSynth" }, - { 90, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, - { 91, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 92, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 93, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, - { 94, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, - { 95, "\303\360\364" }, - { 96, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 97, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 98, "\310\343\360\340" }, - { 99, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 100, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 101, "\317\363\362\374 \352 \350\343\360\345: " }, - { 102, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, - { 103, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 104, "\302\342\345\360\365" }, - { 105, "\303\360\340\364\350\352\340" }, - { 106, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 107, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, - { 108, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, - { 109, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, - { 110, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 111, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 112, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, - { 113, "IBM PCjr" }, - { 114, "ID:" }, - { 115, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, - { 116, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, - { 117, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 118, "\302\342\356\344" }, - { 119, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 120, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, - { 121, "\312\353\340\342\350\340\362\363\360\340" }, - { 122, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, - { 123, "\312\353\340\342\350\370\350" }, - { 124, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 125, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 126, "\337\347\373\352:" }, - { 127, "\302\353\345\342\356" }, - { 128, "\313\345\342\373\351 \371\345\353\367\356\352" }, - { 129, "\307\340\343\360\363\347\350\362\374" }, - { 130, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 131, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 132, "MIDI" }, - { 133, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 134, "\335\354\363\353\377\366\350\377 MT-32" }, - { 135, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, - { 136, "\315\340\347\355\340\367\350\362\374" }, - { 137, "\304\356\341. \354\355\356\343\356..." }, - { 138, "\314\345\355\376" }, - { 139, "\320\340\347\355\356\345" }, - { 140, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 141, "\317\356\344\352\353\376\367\350\362\374 DVD" }, - { 142, "\317\356\344\352\353\376\367\350\362\374 SMB" }, - { 143, "\312\353\350\352 \354\373\370\374\376" }, - { 144, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, - { 145, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, - { 146, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 147, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 148, "\315\340\347\342\340\355\350\345:" }, - { 149, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, - { 150, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, - { 151, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, - { 152, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, - { 153, "\315\350\352\356\343\344\340" }, - { 154, "\315\345\362" }, - { 155, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 156, "\301\345\347 \354\363\347\373\352\350" }, - { 157, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 158, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 159, "\315\345 \347\340\344\340\355" }, - { 160, "OK" }, - { 161, "Ok" }, - { 162, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 163, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 164, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 165, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 166, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 167, "PC \361\357\350\352\345\360" }, - { 168, "\317\340\360\356\353\374:" }, - { 169, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 170, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 171, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 172, "\317\363\362\350" }, - { 173, "\317\340\363\347\340" }, - { 174, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 175, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 176, "\317\353\340\362\364\356\360\354\340:" }, - { 177, "\302\360\345\354\377 \350\343\360\373: " }, - { 178, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 179, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 180, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 181, "\302\373\365\356\344" }, - { 182, "\302\373\365\356\344 \350\347 ScummVM" }, - { 183, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 184, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 185, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 186, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 187, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 188, "\302\357\360\340\342\356" }, - { 189, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 190, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 191, "\317\356\342\345\360\355\363\362\374" }, - { 192, "SEQ" }, - { 193, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 194, "SMB" }, - { 195, "\307\340\357\350\361\340\362\374" }, - { 196, "\317\363\362\374 \361\356\365\360.: " }, - { 197, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 198, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 199, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 200, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 201, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, - { 202, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 203, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 204, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 205, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 206, "\317\356\350\361\352:" }, - { 207, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 208, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 209, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 210, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 211, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 212, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 213, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 214, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 215, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 216, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 217, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, - { 218, "\321\345\360\342\345\360:" }, - { 219, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, - { 220, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 221, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 222, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, - { 223, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, - { 224, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, - { 225, "\317\360\356\357\363\361\362\350\362\374" }, - { 226, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 227, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, - { 228, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, - { 229, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, - { 230, "\307\342\363\352 \342\352\353/\342\373\352\353" }, - { 231, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, - { 232, "SoundFont:" }, - { 233, "\316\347\342" }, - { 234, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 235, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 236, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 237, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 238, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 239, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 240, "\316\347\342\363\367\352\340" }, - { 241, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 242, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 243, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 244, "\321\356\361\362\356\377\355\350\345:" }, - { 245, "\321\363\341" }, - { 246, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 247, "\321\363\341\362\350\362\360\373" }, - { 248, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, - { 249, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, - { 250, "Tapware Zodiac" }, - { 251, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 252, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 253, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 254, "\322\345\354\340:" }, - { 255, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 256, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 257, "TiMidity" }, - { 258, "\302\360\345\354\377: " }, - { 259, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, - { 260, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, - { 261, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, - { 262, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, - { 263, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, - { 264, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 265, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 266, "\315\345\350\347\342\345\361\362\355\356" }, - { 267, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 268, "\316\362\352\353\376\367\350\362\374 DVD" }, - { 269, "\316\362\352\353\376\367\362\374 SMB" }, - { 270, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, - { 271, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 272, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 273, "\302\342\345\360\365" }, - { 274, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 275, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, - { 276, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 277, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, - { 278, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, - { 279, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, - { 280, "\302\350\344\345\356" }, - { 281, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, - { 282, "\303\360\356\354\352\356\361\362\374" }, - { 283, "Windows MIDI" }, - { 284, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 285, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 286, "Yamaha Pa1" }, - { 287, "\304\340" }, - { 288, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 289, "\307\356\355\340" }, - { 290, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, - { 291, "\323\342\345\353. \354\340\361\370\362\340\341" }, - { 292, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 293, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 294, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 295, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 296, "\355\345 \363\344\340\353\356\361\374\n" }, - { 297, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 298, "~\304~\356\341. \350\343\360\363..." }, - { 299, "\316~\362~\354\345\355\340" }, - { 300, "~\307~\340\352\360\373\362\374" }, - { 301, "\310\347~\354~. \350\343\360\363..." }, - { 302, "~\317~\356\354\356\371\374" }, - { 303, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, - { 304, "~\312~\353\340\342\350\370\350" }, - { 305, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, - { 306, "~\307~\340\343\360\363\347\350\362\374" }, - { 307, "~\307~\340\343\360...." }, - { 308, "~\321~\353\345\344" }, - { 309, "~O~K" }, - { 310, "~\316~\357\366\350\350" }, - { 311, "~\316~\357\366\350\350..." }, - { 312, "~\317~\360\345\344" }, - { 313, "~\302~\373\365\356\344" }, - { 314, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 315, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 316, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 317, "~\307~\340\357\350\361\340\362\374" }, - { 318, "\317~\363~\361\352" }, - { 319, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, - { 320, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, - { 321, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, + { 18, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, + { 19, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 20, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 21, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 22, "\315\356\342. \350\343\360\340..." }, + { 23, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 24, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 25, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 27, "\300\363\344\350\356" }, + { 28, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 29, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 30, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 31, "\302\361\270" }, + { 32, "\337\360\352\356\361\362\374:" }, + { 33, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 34, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 35, "C2(\361\356\341\360\340\355 " }, + { 36, "\316\362\354\345\355\340" }, + { 37, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 38, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 39, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 40, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 41, "\302\373\341\360\340\362\374" }, + { 42, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 43, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 44, "\307\340\352\360\373\362\374" }, + { 45, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 46, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 47, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, + { 48, "\312\363\360\361\356\360 \342\355\350\347" }, + { 49, "\312\363\360\361\356\360 \342\353\345\342\356" }, + { 50, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, + { 51, "\312\363\360\361\356\360 \342\342\345\360\365" }, + { 52, "DVD" }, + { 53, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, + { 54, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, + { 55, "\304\340\362\340: " }, + { 56, "\316\362\353\340\344\367\350\352" }, + { 57, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 58, "\323\344\340\353\350\362\374" }, + { 59, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, + { 60, "\301\345\347 \343\360\340\364\350\352\350" }, + { 61, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 62, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 63, "\317\356\352\340\347\340\362\374 " }, + { 64, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 65, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 66, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 67, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 68, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, + { 69, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, + { 70, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, + { 71, "\304\342\356\351\355\356\351 \363\344\340\360" }, + { 72, "\302\355\350\347" }, + { 73, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 74, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 75, "English" }, + { 76, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 77, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, + { 78, "\304\356\357. \357\363\362\374:" }, + { 79, "FM Towns" }, + { 80, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 81, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, + { 82, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, + { 83, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 84, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 85, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, + { 86, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, + { 87, "\303\360\364" }, + { 89, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 90, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 91, "\310\343\360\340" }, + { 92, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 93, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 94, "\317\363\362\374 \352 \350\343\360\345: " }, + { 95, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, + { 96, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 97, "\302\342\345\360\365" }, + { 98, "\303\360\340\364\350\352\340" }, + { 99, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 100, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, + { 101, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, + { 102, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, + { 103, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 104, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 105, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, + { 106, "ID:" }, + { 107, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, + { 108, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, + { 109, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 110, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 111, "\302\342\356\344" }, + { 112, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 113, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, + { 114, "\312\353\340\342\350\340\362\363\360\340" }, + { 115, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, + { 116, "\312\353\340\342\350\370\350" }, + { 117, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 118, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 119, "\337\347\373\352:" }, + { 120, "\302\353\345\342\356" }, + { 121, "\313\345\342\373\351 \371\345\353\367\356\352" }, + { 122, "\307\340\343\360\363\347\350\362\374" }, + { 123, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 124, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 125, "MIDI" }, + { 126, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 127, "\335\354\363\353\377\366\350\377 MT-32" }, + { 129, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, + { 130, "\315\340\347\355\340\367\350\362\374" }, + { 131, "\304\356\341. \354\355\356\343\356..." }, + { 132, "\314\345\355\376" }, + { 133, "\320\340\347\355\356\345" }, + { 134, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 135, "\317\356\344\352\353\376\367\350\362\374 DVD" }, + { 136, "\317\356\344\352\353\376\367\350\362\374 SMB" }, + { 137, "\312\353\350\352 \354\373\370\374\376" }, + { 138, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, + { 139, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 140, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 141, "\315\340\347\342\340\355\350\345:" }, + { 142, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, + { 143, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, + { 144, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, + { 145, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, + { 146, "\315\350\352\356\343\344\340" }, + { 147, "\315\345\362" }, + { 148, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 149, "\301\345\347 \354\363\347\373\352\350" }, + { 150, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 151, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 152, "\315\345 \347\340\344\340\355" }, + { 153, "OK" }, + { 154, "Ok" }, + { 155, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 156, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 157, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 158, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 159, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 160, "\317\340\360\356\353\374:" }, + { 161, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 162, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 163, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 164, "\317\363\362\350" }, + { 165, "\317\340\363\347\340" }, + { 166, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 167, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 168, "\317\353\340\362\364\356\360\354\340:" }, + { 169, "\302\360\345\354\377 \350\343\360\373: " }, + { 170, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 171, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 173, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 174, "\302\373\365\356\344" }, + { 175, "\302\373\365\356\344 \350\347 ScummVM" }, + { 176, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 177, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 178, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 179, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 180, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 181, "\302\357\360\340\342\356" }, + { 182, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 183, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 184, "\317\356\342\345\360\355\363\362\374" }, + { 185, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 186, "SMB" }, + { 187, "\307\340\357\350\361\340\362\374" }, + { 188, "\317\363\362\374 \361\356\365\360.: " }, + { 189, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 190, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 191, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 192, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 193, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, + { 194, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 195, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 196, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 197, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 198, "\317\356\350\361\352:" }, + { 199, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 200, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 201, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 202, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 203, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 204, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 205, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 206, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 207, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 208, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 209, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, + { 210, "\321\345\360\342\345\360:" }, + { 211, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, + { 212, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 213, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 214, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, + { 215, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, + { 216, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, + { 217, "\317\360\356\357\363\361\362\350\362\374" }, + { 218, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 219, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, + { 220, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, + { 221, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, + { 222, "\307\342\363\352 \342\352\353/\342\373\352\353" }, + { 223, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 224, "SoundFont:" }, + { 225, "\316\347\342" }, + { 226, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 227, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 228, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 230, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 231, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 232, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 233, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 234, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 235, "\316\347\342\363\367\352\340" }, + { 236, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 237, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 238, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 239, "\321\356\361\362\356\377\355\350\345:" }, + { 240, "\321\363\341" }, + { 241, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 242, "\321\363\341\362\350\362\360\373" }, + { 243, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, + { 244, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, + { 245, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 246, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 247, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 248, "\322\345\354\340:" }, + { 249, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 250, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 251, "\302\360\345\354\377: " }, + { 252, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, + { 253, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, + { 254, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, + { 255, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, + { 256, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, + { 257, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 258, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 259, "\315\345\350\347\342\345\361\362\355\356" }, + { 260, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 261, "\316\362\352\353\376\367\350\362\374 DVD" }, + { 262, "\316\362\352\353\376\367\362\374 SMB" }, + { 263, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, + { 264, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 265, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 266, "\302\342\345\360\365" }, + { 267, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 268, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, + { 269, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 270, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, + { 271, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, + { 272, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, + { 273, "\302\350\344\345\356" }, + { 274, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, + { 275, "\303\360\356\354\352\356\361\362\374" }, + { 276, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 277, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 278, "\304\340" }, + { 279, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 280, "\307\356\355\340" }, + { 281, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, + { 282, "\323\342\345\353. \354\340\361\370\362\340\341" }, + { 283, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 284, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 285, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 286, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 287, "\355\345 \363\344\340\353\356\361\374\n" }, + { 288, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 289, "~\304~\356\341. \350\343\360\363..." }, + { 290, "\316~\362~\354\345\355\340" }, + { 291, "~\307~\340\352\360\373\362\374" }, + { 292, "\310\347~\354~. \350\343\360\363..." }, + { 293, "~\317~\356\354\356\371\374" }, + { 294, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, + { 295, "~\312~\353\340\342\350\370\350" }, + { 296, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, + { 297, "~\307~\340\343\360\363\347\350\362\374" }, + { 298, "~\307~\340\343\360...." }, + { 299, "~\321~\353\345\344" }, + { 300, "~O~K" }, + { 301, "~\316~\357\366\350\350" }, + { 302, "~\316~\357\366\350\350..." }, + { 303, "~\317~\360\345\344" }, + { 304, "~\302~\373\365\356\344" }, + { 305, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 306, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 307, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 308, "~\307~\340\357\350\361\340\362\374" }, + { 309, "\317~\363~\361\352" }, + { 310, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, + { 311, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, + { 312, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, { -1, NULL } }; -static struct _po2c_msg _po2c_lang_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, +static const struct _po2c_msg _po2c_lang_fr_FR[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: fr\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "Recherche d'un plugin supportant cet ID..." }, { 3, "D\351marrage de '%s'\n" }, @@ -679,368 +657,353 @@ static struct _po2c_msg _po2c_lang_fr_FR[] = { { 15, "48 kHz" }, { 16, "8 kHz" }, { 17, "" }, - { 18, "ALSA" }, - { 19, "\300 propos de ScummVM" }, - { 20, "AdLib" }, - { 21, "\311mulateur AdLib:" }, - { 22, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, - { 23, "Ajouter..." }, - { 24, "Anti-cr\351nel\351 (16 bpp)" }, - { 25, "Correction du rapport d'aspect" }, - { 26, "Touche associ\351e: %s" }, - { 27, "Touche associ\351e: aucune" }, - { 28, "MIDI Atari ST" }, - { 29, "Audio" }, - { 30, "Sauvegarde auto:" }, - { 31, "\300 ~P~ropos..." }, - { 32, "Affecter les touches" }, - { 33, "Les deux" }, - { 34, "Luminosit\351:" }, - { 35, "C1Moteurs disponibles:" }, - { 36, "C1Options incluses:" }, - { 37, "C2(compil\351 sur" }, - { 38, "CAMD" }, - { 39, "Annuler" }, - { 40, "Impossible de cr\351er le fichier" }, - { 41, "Change les options du jeu" }, - { 42, "Change les options globales de ScummVM" }, - { 43, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, - { 44, "Choisir" }, - { 45, "S\351lectionnez une action \340 affecter" }, - { 46, "Effacer la valeur" }, - { 47, "Fermer" }, - { 48, "CoreAudio" }, - { 49, "CoreMIDI" }, - { 50, "Corrige le rapport d'aspect pour les jeu 320x200" }, - { 51, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, - { 52, "Creative Music System" }, - { 53, "Mode vid\351o actuel" }, - { 54, "Bas" }, - { 55, "Gauche" }, - { 56, "Droit" }, - { 57, "Haut" }, - { 58, "DMedia" }, - { 59, "DVD" }, - { 60, "DVD mont\351 avec succ\350s" }, - { 61, "DVD non mont\351" }, - { 62, "Date:" }, - { 63, "Debugger" }, - { 64, "D\351faut" }, - { 65, "Supprimer" }, - { 66, "D\351sactiv\351 l'extinction" }, - { 67, "GFX d\351sactiv\351" }, - { 68, "%d nouveaux jeux trouv\351s ..." }, - { 69, "%d nouveaux jeux trouv\351s." }, - { 70, "Affichage" }, - { 71, "Afficher le clavier" }, - { 72, "Voulez-vous vraiment supprimer cette sauvegarde?" }, - { 73, "Voulez-vous vraiment supprimer ce jeu?" }, - { 74, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, - { 75, "Voulez-vous charger ou sauver le jeu?" }, - { 76, "Voulez-vous ex\351cuter une recherche automatique?" }, - { 77, "Voulez-vous quitter?" }, - { 78, "Coup double" }, - { 79, "Bas" }, - { 80, "Activer le mode Roland GS" }, - { 81, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, - { 82, "Anglais" }, - { 83, "Erreur lors de l'\351x\351cution du jeu:" }, - { 84, "\311chec du montage du DVD" }, - { 85, "Extra:" }, - { 86, "FM Towns" }, - { 87, "Aucun th\350me GUI n'a pu \352tre charg\351; abandon" }, - { 88, "Mode rapide" }, - { 89, "FluidSynth" }, - { 91, "Nom complet du jeu" }, - { 92, "Plein \351cran" }, - { 93, "Acceleration du pad GC:" }, - { 94, "Sensibilit\351 du pad GC:" }, - { 95, "GFX" }, - { 96, "Langue:" }, - { 97, "Interface:" }, - { 98, "Jeu" }, - { 99, "Fichier de don\351es introuvable" }, - { 100, "ID de jeu non support\351" }, - { 101, "Chemin du Jeu:" }, - { 102, "Menu global" }, - { 103, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, - { 104, "Remonter" }, - { 105, "Graphique" }, - { 106, "Mode graphique:" }, - { 107, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, - { 108, "Cach\351 la barre d'outils" }, - { 109, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, - { 110, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, - { 111, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, - { 113, "IBM PCjr" }, - { 114, "ID:" }, - { 115, "Initialiser le r\351seau" }, - { 116, "\311chelle initiale de l'\351cran du haut" }, - { 117, "Initialisation du r\351seau" }, - { 118, "Entr\351e" }, - { 119, "Chemin Invalide" }, - { 120, "Affectation des touches" }, - { 121, "Clavier" }, - { 122, "Affectation des touches:" }, - { 123, "Touches" }, - { 124, "Langue de l'interface graphique de ScummVM" }, - { 125, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, - { 126, "Langue:" }, - { 127, "Gauche" }, - { 128, "Clic Gauche" }, - { 129, "Charger" }, - { 130, "Charger le jeu:" }, - { 131, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, - { 132, "MIDI" }, - { 133, "Gain MIDI:" }, - { 134, "\311mulation MT-32" }, - { 135, "\311chelle de l'\351cran principal" }, - { 136, "Affecter" }, - { 137, "Ajout Massif..." }, - { 138, "Menu" }, - { 139, "Divers" }, - { 140, "Mode mixe AdLib/MIDI" }, - { 141, "Monter le DVD" }, - { 142, "Monter SMB" }, - { 143, "Clic de souris" }, - { 145, "Pilote audio:" }, - { 146, "Volume Musique:" }, - { 147, "Silence" }, - { 148, "Nom:" }, - { 149, "R\351seau d\351connect\351" }, - { 150, "R\351seau non initialis\351 (%d)" }, - { 151, "R\351seau connect\351" }, - { 152, "R\351seau connect\351, disque partag\351 mont\351" }, - { 153, "Jamais" }, - { 154, "Non" }, - { 155, "Date non sauv\351e" }, - { 156, "Pas de musique" }, - { 157, "Dur\351e de jeu non sauv\351e" }, - { 158, "Heure non sauv\351e" }, - { 159, "Aucun" }, - { 160, "OK" }, - { 161, "Ok" }, - { 162, "Fr\351quence:" }, - { 163, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, - { 164, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, - { 165, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, - { 166, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, - { 167, "Haut Parleur PC" }, - { 168, "Mot de passe:" }, - { 169, "Chemin n'est pas un r\351pertoire" }, - { 170, "Chemin n'est pas un fichier" }, - { 171, "Chemin inexistant" }, - { 172, "Chemins" }, - { 173, "Mettre en pause" }, - { 174, "Choisissez le jeu:" }, - { 175, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 176, "Plateforme:" }, - { 177, "Dur\351e de jeu:" }, - { 178, "Selectionnez une action" }, - { 179, "Plugins:" }, - { 180, "Appuyez sur la touche \340 associer" }, - { 181, "Quitter" }, - { 182, "Quitter ScummVM" }, - { 183, "V\351roulli\351 en lecture" }, - { 184, "Echec de la lecture" }, - { 185, "Changer l'affectation des touches" }, - { 186, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 187, "Mode de rendu:" }, - { 188, "Droite" }, - { 189, "Clic Droit" }, - { 190, "Clic droit" }, - { 191, "Pivoter" }, - { 192, "SEQ" }, - { 193, "Volume Bruitage:" }, - { 194, "SMB" }, - { 195, "Sauver" }, - { 196, "Sauvegardes:" }, - { 197, "Sauvegardes:" }, - { 198, "Sauvegarde:" }, - { 199, "Examen termin\351!" }, - { 200, "%d r\351pertoires examin\351s ..." }, - { 201, "Menu Principal ScummVM" }, - { 202, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 203, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 204, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 205, "Recherche dans la liste de jeux" }, - { 206, "Filtre:" }, - { 207, "Choisir une banque de sons" }, - { 208, "S\351lectionnez un Th\350me" }, - { 209, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 210, "Selectionez une action et cliquez 'Affecter'" }, - { 211, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 212, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 213, "S\351lectionner le r\351pertoire des plugins" }, - { 214, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 215, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 216, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 217, "Sensibilit\351" }, - { 218, "Serveur:" }, - { 219, "Disque partag\351:" }, - { 220, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 221, "Afficher le clavier" }, - { 222, "Afficher le curseur de la souris" }, - { 223, "Affiche les sous-titres et joue les dialogues audio" }, - { 224, "Afficher/Cacher le curseur" }, - { 225, "Passer" }, - { 226, "Passer la phrase" }, - { 227, "Sauter le texte" }, - { 228, "Aligner sur les bords" }, - { 229, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 230, "Audio marche/arr\352t" }, - { 231, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 232, "Banque de sons:" }, - { 233, "Audio" }, - { 234, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 235, "Volume des effets sp\351ciaux sonores" }, - { 236, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 237, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 238, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 239, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 240, "Audio" }, - { 241, "Volume Dialogues:" }, - { 242, "Standard (16bpp)" }, - { 243, "D\351marre le jeu s\351lectionn\351" }, - { 244, "Status:" }, - { 245, "Subs" }, - { 246, "Vitesse des ST:" }, - { 247, "Sous-titres" }, - { 249, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 250, "Tapwave Zodiac" }, - { 251, "Dialogue:" }, - { 252, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 253, "Th\350mes:" }, - { 254, "Th\350me:" }, - { 255, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 256, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 257, "TiMidity" }, - { 258, "Heure:" }, - { 259, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 260, "D\351calage X du toucher" }, - { 261, "D\351callage Y du toucher" }, - { 262, "Mode touchpad d\351sactiv\351" }, - { 263, "Mode touchpad activ\351" }, - { 264, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 265, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 266, "Inconue" }, - { 267, "Erreur inconnue" }, - { 268, "D\351monter le DVD" }, - { 269, "D\351monter SMB" }, - { 270, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 271, "Mode de couleurs non support\351" }, - { 272, "Sauvegarde sans nom" }, - { 273, "Haut" }, - { 274, "Utiliser \340 la fois MIDI et AdLib" }, - { 275, "Activer le contr\364le du curseur de type trackpad" }, - { 276, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, - { 277, "Nom d'utilisateur:" }, - { 278, "Utilise le pilote SDL" }, - { 280, "Vid\351o" }, - { 281, "Clavier virtuel" }, - { 282, "Volume" }, - { 283, "MIDI Windows" }, - { 284, "Verrouill\351 en \351criture" }, - { 285, "Echec de l'\351criture des donn\351es" }, - { 286, "Yamaha Pa1" }, - { 287, "Oui" }, - { 288, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 289, "Zone" }, - { 292, "Toutes les 10 mins" }, - { 293, "Toutes les 15 mins" }, - { 294, "Toutes les 30 mins" }, - { 295, "Toutes les 5 mins" }, - { 296, "Echec\n" }, - { 297, "\300 ~P~ropos" }, - { 298, "~A~jouter..." }, - { 299, "~A~nnuler" }, - { 300, "~F~ermer" }, - { 301, "~E~diter..." }, - { 302, "~A~ide" }, - { 303, "Contr\364le des combats d'~I~ndy" }, - { 304, "~T~ouches" }, - { 305, "Mode ~G~aucher" }, - { 306, "~C~harger" }, - { 307, "~C~harger" }, - { 308, "~S~uivant" }, - { 309, "~O~K" }, - { 310, "~O~ptions" }, - { 311, "~O~ptions..." }, - { 312, "~P~r\351c\351dent" }, - { 313, "~Q~uitter" }, - { 314, "~S~upprimer" }, - { 315, "~R~eprendre" }, - { 316, "Retour au ~L~anceur" }, - { 317, "~S~auver" }, - { 318, "~D~\351marrer" }, - { 319, "T~r~ansitions activ\351" }, - { 320, "~E~ffets de l'Eau activ\351s" }, - { 321, "Mode ~Z~ip Activ\351" }, + { 18, "\300 propos de ScummVM" }, + { 19, "\311mulateur AdLib:" }, + { 20, "\311mulateur AdLib:" }, + { 21, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, + { 22, "Ajouter..." }, + { 23, "Anti-cr\351nel\351 (16 bpp)" }, + { 24, "Correction du rapport d'aspect" }, + { 25, "Touche associ\351e: %s" }, + { 26, "Touche associ\351e: aucune" }, + { 27, "Audio" }, + { 28, "Sauvegarde auto:" }, + { 29, "\300 ~P~ropos..." }, + { 30, "Affecter les touches" }, + { 31, "Les deux" }, + { 32, "Luminosit\351:" }, + { 33, "C1Moteurs disponibles:" }, + { 34, "C1Options incluses:" }, + { 35, "C2(compil\351 sur" }, + { 36, "Annuler" }, + { 37, "Impossible de cr\351er le fichier" }, + { 38, "Change les options du jeu" }, + { 39, "Change les options globales de ScummVM" }, + { 40, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, + { 41, "Choisir" }, + { 42, "S\351lectionnez une action \340 affecter" }, + { 43, "Effacer la valeur" }, + { 44, "Fermer" }, + { 45, "Corrige le rapport d'aspect pour les jeu 320x200" }, + { 46, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, + { 47, "Mode vid\351o actuel" }, + { 48, "Bas" }, + { 49, "Gauche" }, + { 50, "Droit" }, + { 51, "Haut" }, + { 52, "DVD" }, + { 53, "DVD mont\351 avec succ\350s" }, + { 54, "DVD non mont\351" }, + { 55, "Date:" }, + { 56, "Debugger" }, + { 57, "D\351faut" }, + { 58, "Supprimer" }, + { 59, "D\351sactiv\351 l'extinction" }, + { 60, "GFX d\351sactiv\351" }, + { 61, "%d nouveaux jeux trouv\351s ..." }, + { 62, "%d nouveaux jeux trouv\351s." }, + { 63, "Affichage" }, + { 64, "Afficher le clavier" }, + { 65, "Voulez-vous vraiment supprimer cette sauvegarde?" }, + { 66, "Voulez-vous vraiment supprimer ce jeu?" }, + { 67, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, + { 68, "Voulez-vous charger ou sauver le jeu?" }, + { 69, "Voulez-vous ex\351cuter une recherche automatique?" }, + { 70, "Voulez-vous quitter?" }, + { 71, "Coup double" }, + { 72, "Bas" }, + { 73, "Activer le mode Roland GS" }, + { 74, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, + { 75, "Anglais" }, + { 76, "Erreur lors de l'\351x\351cution du jeu:" }, + { 77, "\311chec du montage du DVD" }, + { 78, "Extra:" }, + { 79, "FM Towns" }, + { 80, "Aucun th\350me GUI n'a pu \352tre charg\351; abandon" }, + { 81, "Mode rapide" }, + { 83, "Nom complet du jeu" }, + { 84, "Plein \351cran" }, + { 85, "Acceleration du pad GC:" }, + { 86, "Sensibilit\351 du pad GC:" }, + { 87, "GFX" }, + { 89, "Langue:" }, + { 90, "Interface:" }, + { 91, "Jeu" }, + { 92, "Fichier de don\351es introuvable" }, + { 93, "ID de jeu non support\351" }, + { 94, "Chemin du Jeu:" }, + { 95, "Menu global" }, + { 96, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, + { 97, "Remonter" }, + { 98, "Graphique" }, + { 99, "Mode graphique:" }, + { 100, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 101, "Cach\351 la barre d'outils" }, + { 102, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, + { 103, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, + { 104, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, + { 106, "ID:" }, + { 107, "Initialiser le r\351seau" }, + { 108, "\311chelle initiale de l'\351cran du haut" }, + { 109, "Initialisation du r\351seau" }, + { 110, "Initialisation du r\351seau" }, + { 111, "Entr\351e" }, + { 112, "Chemin Invalide" }, + { 113, "Affectation des touches" }, + { 114, "Clavier" }, + { 115, "Affectation des touches:" }, + { 116, "Touches" }, + { 117, "Langue de l'interface graphique de ScummVM" }, + { 118, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, + { 119, "Langue:" }, + { 120, "Gauche" }, + { 121, "Clic Gauche" }, + { 122, "Charger" }, + { 123, "Charger le jeu:" }, + { 124, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, + { 125, "MIDI" }, + { 126, "Gain MIDI:" }, + { 127, "\311mulation MT-32" }, + { 129, "\311chelle de l'\351cran principal" }, + { 130, "Affecter" }, + { 131, "Ajout Massif..." }, + { 132, "Menu" }, + { 133, "Divers" }, + { 134, "Mode mixe AdLib/MIDI" }, + { 135, "Monter le DVD" }, + { 136, "Monter SMB" }, + { 137, "Clic de souris" }, + { 139, "Volume Musique:" }, + { 140, "Silence" }, + { 141, "Nom:" }, + { 142, "R\351seau d\351connect\351" }, + { 143, "R\351seau non initialis\351 (%d)" }, + { 144, "R\351seau connect\351" }, + { 145, "R\351seau connect\351, disque partag\351 mont\351" }, + { 146, "Jamais" }, + { 147, "Non" }, + { 148, "Date non sauv\351e" }, + { 149, "Pas de musique" }, + { 150, "Dur\351e de jeu non sauv\351e" }, + { 151, "Heure non sauv\351e" }, + { 152, "Aucun" }, + { 153, "OK" }, + { 154, "Ok" }, + { 155, "Fr\351quence:" }, + { 156, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, + { 157, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, + { 158, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, + { 159, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, + { 160, "Mot de passe:" }, + { 161, "Chemin n'est pas un r\351pertoire" }, + { 162, "Chemin n'est pas un fichier" }, + { 163, "Chemin inexistant" }, + { 164, "Chemins" }, + { 165, "Mettre en pause" }, + { 166, "Choisissez le jeu:" }, + { 167, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 168, "Plateforme:" }, + { 169, "Dur\351e de jeu:" }, + { 170, "Selectionnez une action" }, + { 171, "Plugins:" }, + { 173, "Appuyez sur la touche \340 associer" }, + { 174, "Quitter" }, + { 175, "Quitter ScummVM" }, + { 176, "V\351roulli\351 en lecture" }, + { 177, "Echec de la lecture" }, + { 178, "Changer l'affectation des touches" }, + { 179, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 180, "Mode de rendu:" }, + { 181, "Droite" }, + { 182, "Clic Droit" }, + { 183, "Clic droit" }, + { 184, "Pivoter" }, + { 185, "Volume Bruitage:" }, + { 186, "SMB" }, + { 187, "Sauver" }, + { 188, "Sauvegardes:" }, + { 189, "Sauvegardes:" }, + { 190, "Sauvegarde:" }, + { 191, "Examen termin\351!" }, + { 192, "%d r\351pertoires examin\351s ..." }, + { 193, "Menu Principal ScummVM" }, + { 194, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 195, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 196, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 197, "Recherche dans la liste de jeux" }, + { 198, "Filtre:" }, + { 199, "Choisir une banque de sons" }, + { 200, "S\351lectionnez un Th\350me" }, + { 201, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 202, "Selectionez une action et cliquez 'Affecter'" }, + { 203, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 204, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 205, "S\351lectionner le r\351pertoire des plugins" }, + { 206, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 207, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 208, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 209, "Sensibilit\351" }, + { 210, "Serveur:" }, + { 211, "Disque partag\351:" }, + { 212, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 213, "Afficher le clavier" }, + { 214, "Afficher le curseur de la souris" }, + { 215, "Affiche les sous-titres et joue les dialogues audio" }, + { 216, "Afficher/Cacher le curseur" }, + { 217, "Passer" }, + { 218, "Passer la phrase" }, + { 219, "Sauter le texte" }, + { 220, "Aligner sur les bords" }, + { 221, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 222, "Audio marche/arr\352t" }, + { 223, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 224, "Banque de sons:" }, + { 225, "Audio" }, + { 226, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 227, "Volume des effets sp\351ciaux sonores" }, + { 228, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 230, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 231, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 232, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 233, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 234, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 235, "Audio" }, + { 236, "Volume Dialogues:" }, + { 237, "Standard (16bpp)" }, + { 238, "D\351marre le jeu s\351lectionn\351" }, + { 239, "Status:" }, + { 240, "Subs" }, + { 241, "Vitesse des ST:" }, + { 242, "Sous-titres" }, + { 244, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 245, "Dialogue:" }, + { 246, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 247, "Th\350mes:" }, + { 248, "Th\350me:" }, + { 249, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 250, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 251, "Heure:" }, + { 252, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 253, "D\351calage X du toucher" }, + { 254, "D\351callage Y du toucher" }, + { 255, "Mode touchpad d\351sactiv\351" }, + { 256, "Mode touchpad activ\351" }, + { 257, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 258, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 259, "Inconue" }, + { 260, "Erreur inconnue" }, + { 261, "D\351monter le DVD" }, + { 262, "D\351monter SMB" }, + { 263, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 264, "Mode de couleurs non support\351" }, + { 265, "Sauvegarde sans nom" }, + { 266, "Haut" }, + { 267, "Utiliser \340 la fois MIDI et AdLib" }, + { 268, "Activer le contr\364le du curseur de type trackpad" }, + { 269, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, + { 270, "Nom d'utilisateur:" }, + { 271, "Utilise le pilote SDL" }, + { 273, "Vid\351o" }, + { 274, "Clavier virtuel" }, + { 275, "Volume" }, + { 276, "Verrouill\351 en \351criture" }, + { 277, "Echec de l'\351criture des donn\351es" }, + { 278, "Oui" }, + { 279, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 280, "Zone" }, + { 283, "Toutes les 10 mins" }, + { 284, "Toutes les 15 mins" }, + { 285, "Toutes les 30 mins" }, + { 286, "Toutes les 5 mins" }, + { 287, "Echec\n" }, + { 288, "\300 ~P~ropos" }, + { 289, "~A~jouter..." }, + { 290, "~A~nnuler" }, + { 291, "~F~ermer" }, + { 292, "~E~diter..." }, + { 293, "~A~ide" }, + { 294, "Contr\364le des combats d'~I~ndy" }, + { 295, "~T~ouches" }, + { 296, "Mode ~G~aucher" }, + { 297, "~C~harger" }, + { 298, "~C~harger" }, + { 299, "~S~uivant" }, + { 300, "~O~K" }, + { 301, "~O~ptions" }, + { 302, "~O~ptions..." }, + { 303, "~P~r\351c\351dent" }, + { 304, "~Q~uitter" }, + { 305, "~S~upprimer" }, + { 306, "~R~eprendre" }, + { 307, "Retour au ~L~anceur" }, + { 308, "~S~auver" }, + { 309, "~D~\351marrer" }, + { 310, "T~r~ansitions activ\351" }, + { 311, "~E~ffets de l'Eau activ\351s" }, + { 312, "Mode ~Z~ip Activ\351" }, { -1, NULL } }; -static struct _po2c_msg _po2c_lang_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-19 22:36+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, +static const struct _po2c_msg _po2c_lang_hu_HU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, - { 20, "Hang" }, - { 21, "AdLib vezet :" }, - { 25, "Aspect adag korrekci\363" }, - { 29, "Hang" }, - { 30, "Automatikus ment\351s:" }, - { 32, "Kulcsok" }, - { 48, "Hang" }, - { 53, "Renderel\351si m\363d:" }, - { 64, "" }, - { 80, "K\351pess\351 Roland GS Mode" }, - { 85, "Extra \332tvonal:" }, - { 88, "Grafikus m\363d:" }, - { 92, "Teljes k\351perny s m\363d:" }, - { 97, "Lek\351pez eszk\366z GUI:" }, - { 101, "Extra \332tvonal:" }, - { 105, "Grafik\341val" }, - { 106, "Grafikus m\363d:" }, - { 123, "Kulcsok" }, - { 133, "MIDI nyeres\351g:" }, - { 140, "Vegyes AdLib/MIDI m\363d" }, - { 145, "Zenei vezet :" }, - { 146, "Zene mennyis\351g:" }, - { 147, "Muta \326sszes" }, - { 153, "Soha" }, - { 154, "Semmi" }, - { 159, "Semmi" }, - { 160, "Igen" }, - { 162, "Kimeneti teljes\355tm\351ny:" }, - { 172, "\326sv\351nyek" }, - { 173, "\326sv\351nyek" }, - { 187, "Renderel\351si m\363d:" }, - { 193, "SFX mennyis\351ge" }, - { 196, "Extra \332tvonal:" }, - { 218, "Soha" }, - { 240, "Csak a besz\351d" }, - { 241, "Besz\351d mennyis\351g:" }, - { 246, "Felirat sebess\351g:" }, - { 247, "Csak feliratok" }, - { 251, "Sz\366veg \351s besz\351d:" }, - { 254, "T\351ma:" }, - { 258, "T\351ma:" }, - { 264, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 278, "Zenei vezet :" }, - { 282, "Volumene" }, - { 289, "Semmi" }, - { 292, "10 percenk\351nt" }, - { 293, "15 percenk\351nt" }, - { 294, "30 percenk\351nt" }, - { 295, "5 percenk\351nt" }, - { 304, "Kulcsok" }, - { 305, "Renderel\351si m\363d:" }, - { 309, "Igen" }, + { 19, "AdLib vezet :" }, + { 20, "AdLib vezet :" }, + { 24, "Aspect adag korrekci\363" }, + { 27, "Hang" }, + { 28, "Automatikus ment\351s:" }, + { 30, "Kulcsok" }, + { 47, "Renderel\351si m\363d:" }, + { 57, "" }, + { 73, "K\351pess\351 Roland GS Mode" }, + { 78, "Extra \332tvonal:" }, + { 81, "Grafikus m\363d:" }, + { 84, "Teljes k\351perny s m\363d:" }, + { 90, "Lek\351pez eszk\366z GUI:" }, + { 94, "Extra \332tvonal:" }, + { 98, "Grafik\341val" }, + { 99, "Grafikus m\363d:" }, + { 116, "Kulcsok" }, + { 126, "MIDI nyeres\351g:" }, + { 134, "Vegyes AdLib/MIDI m\363d" }, + { 139, "Zene mennyis\351g:" }, + { 140, "Muta \326sszes" }, + { 146, "Soha" }, + { 147, "Semmi" }, + { 152, "Semmi" }, + { 153, "Igen" }, + { 155, "Kimeneti teljes\355tm\351ny:" }, + { 164, "\326sv\351nyek" }, + { 165, "\326sv\351nyek" }, + { 180, "Renderel\351si m\363d:" }, + { 185, "SFX mennyis\351ge" }, + { 188, "Extra \332tvonal:" }, + { 210, "Soha" }, + { 235, "Csak a besz\351d" }, + { 236, "Besz\351d mennyis\351g:" }, + { 241, "Felirat sebess\351g:" }, + { 242, "Csak feliratok" }, + { 245, "Sz\366veg \351s besz\351d:" }, + { 248, "T\351ma:" }, + { 251, "T\351ma:" }, + { 257, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 271, "Zenei vezet :" }, + { 275, "Volumene" }, + { 280, "Semmi" }, + { 283, "10 percenk\351nt" }, + { 284, "15 percenk\351nt" }, + { 285, "30 percenk\351nt" }, + { 286, "5 percenk\351nt" }, + { 295, "Kulcsok" }, + { 296, "Renderel\351si m\363d:" }, + { 300, "Igen" }, { -1, NULL } }; -static struct { +static const struct { const char * lang; const char * charset; - struct _po2c_msg * msgs; + const struct _po2c_msg * msgs; } _po2c_langs[] = { { "ru_RU", "cp1251", _po2c_lang_ru_RU }, { "fr_FR", "iso-8859-1", _po2c_lang_fr_FR }, @@ -1050,7 +1013,7 @@ static struct { /* code */ -static struct _po2c_msg * _po2c_lang=NULL; +static const struct _po2c_msg * _po2c_lang=NULL; static int _po2c_lang_size=0; static const char * _po2c_charset=NULL; @@ -1087,7 +1050,7 @@ void po2c_setlang(const char * lang) /* if found, count entries */ if(_po2c_lang != NULL) { - struct _po2c_msg * m; + const struct _po2c_msg * m; for(m=_po2c_lang;m->msgid != -1;m++) _po2c_lang_size++; @@ -1096,7 +1059,7 @@ void po2c_setlang(const char * lang) const char * po2c_gettext(const char * msgid) { - struct _po2c_msg * m; + const struct _po2c_msg * m; int b, t, n, c; /* if no language is set or msgid is empty, return msgid as is */ diff --git a/po/fr_FR.po b/po/fr_FR.po index 8a771a69c0..3dcf2c6e81 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-19 22:36+0100\n" +"POT-Creation-Date: 2010-06-24 23:22+0200\n" "PO-Revision-Date: 2010-06-19 23:43+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,22 +41,14 @@ msgstr "Remonter" msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" -#: gui/browser.cpp:70 -#: gui/chooser.cpp:49 -#: gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 -#: gui/massadd.cpp:95 -#: gui/options.cpp:879 -#: gui/saveload.cpp:65 -#: gui/saveload.cpp:157 -#: gui/themebrowser.cpp:56 +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Annuler" -#: gui/browser.cpp:71 -#: gui/chooser.cpp:50 -#: gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" msgstr "Choisir" @@ -62,8 +56,7 @@ msgstr "Choisir" msgid "Failed to load any GUI theme, aborting" msgstr "Aucun thème GUI n'a pu être chargé; abandon" -#: gui/GuiManager.cpp:102 -#: backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Fermer" @@ -71,13 +64,11 @@ msgstr "Fermer" msgid "Mouse click" msgstr "Clic de souris" -#: gui/GuiManager.cpp:108 -#: base/main.cpp:284 +#: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" msgstr "Afficher le clavier" -#: gui/GuiManager.cpp:111 -#: base/main.cpp:287 +#: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" msgstr "Changer l'affectation des touches" @@ -85,12 +76,8 @@ msgstr "Changer l'affectation des touches" msgid "Map" msgstr "Affecter" -#: gui/KeysDialog.cpp:45 -#: gui/launcher.cpp:267 -#: gui/launcher.cpp:873 -#: gui/launcher.cpp:877 -#: gui/massadd.cpp:92 -#: gui/options.cpp:880 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -99,16 +86,12 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Selectionez une action et cliquez 'Affecter'" -#: gui/KeysDialog.cpp:83 -#: gui/KeysDialog.cpp:105 -#: gui/KeysDialog.cpp:144 +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "Touche associée: %s" -#: gui/KeysDialog.cpp:85 -#: gui/KeysDialog.cpp:107 -#: gui/KeysDialog.cpp:146 +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "Touche associée: aucune" @@ -133,17 +116,19 @@ msgstr "Jeu" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 -#: gui/launcher.cpp:174 -msgid "Short game identifier used for referring to savegames and running the game from the command line" -msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande" +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu " +"depuis la ligne de commande" #: gui/launcher.cpp:177 msgid "Name:" msgstr "Nom:" -#: gui/launcher.cpp:177 -#: gui/launcher.cpp:178 +#: gui/launcher.cpp:177 gui/launcher.cpp:178 msgid "Full title of the game" msgstr "Nom complet du jeu" @@ -151,18 +136,17 @@ msgstr "Nom complet du jeu" msgid "Language:" msgstr "Langue:" -#: gui/launcher.cpp:181 -#: gui/launcher.cpp:182 -msgid "Language of the game. This will not turn your Spanish game version into English" -msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." - -#: gui/launcher.cpp:183 -#: gui/launcher.cpp:194 -#: gui/options.cpp:79 -#: gui/options.cpp:598 -#: gui/options.cpp:608 -#: gui/options.cpp:860 -#: sound/mididrv.cpp:60 +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Langue du jeu. Cela ne traduira pas en anglais par magie votre version " +"espagnole du jeu." + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: sound/null.cpp:42 msgid "" msgstr "" @@ -170,20 +154,15 @@ msgstr "" msgid "Platform:" msgstr "Plateforme:" -#: gui/launcher.cpp:192 -#: gui/launcher.cpp:193 +#: gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 -#: gui/options.cpp:767 -#: gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 -#: gui/options.cpp:767 -#: gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "GFX" msgstr "GFX" @@ -191,8 +170,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifique à ce jeux" -#: gui/launcher.cpp:213 -#: gui/options.cpp:790 +#: gui/launcher.cpp:213 gui/options.cpp:889 msgid "Audio" msgstr "Audio" @@ -200,8 +178,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifique à ce jeux" -#: gui/launcher.cpp:223 -#: gui/options.cpp:794 +#: gui/launcher.cpp:223 gui/options.cpp:893 msgid "Volume" msgstr "Volume" @@ -209,8 +186,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifique à ce jeux" -#: gui/launcher.cpp:232 -#: gui/options.cpp:802 +#: gui/launcher.cpp:232 gui/options.cpp:901 msgid "MIDI" msgstr "MIDI" @@ -218,8 +194,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifique à ce jeux" -#: gui/launcher.cpp:244 -#: gui/options.cpp:808 +#: gui/launcher.cpp:244 gui/options.cpp:907 msgid "Paths" msgstr "Chemins" @@ -227,13 +202,11 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 -#: gui/options.cpp:821 +#: gui/launcher.cpp:254 gui/options.cpp:920 msgid "Extra Path:" msgstr "Extra:" -#: gui/launcher.cpp:254 -#: gui/launcher.cpp:255 +#: gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu" @@ -241,49 +214,31 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 -#: gui/launcher.cpp:259 -#: gui/options.cpp:815 -#: gui/options.cpp:816 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" -#: gui/launcher.cpp:275 -#: gui/launcher.cpp:353 -#: gui/launcher.cpp:398 -#: gui/options.cpp:227 -#: gui/options.cpp:384 -#: gui/options.cpp:470 -#: gui/options.cpp:526 -#: gui/options.cpp:666 -#: gui/options.cpp:819 -#: gui/options.cpp:822 -#: gui/options.cpp:826 -#: gui/options.cpp:903 -#: gui/options.cpp:909 -#: gui/options.cpp:915 -#: gui/options.cpp:923 -#: gui/options.cpp:947 -#: gui/options.cpp:951 -#: gui/options.cpp:957 -#: gui/options.cpp:964 -#: gui/options.cpp:1063 +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 +#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 +#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 +#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 +#: gui/options.cpp:1063 gui/options.cpp:1162 msgid "None" msgstr "Aucun" -#: gui/launcher.cpp:280 -#: gui/launcher.cpp:357 +#: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 -#: gui/options.cpp:1057 +#: gui/launcher.cpp:391 gui/options.cpp:1156 msgid "Select SoundFont" msgstr "Choisir une banque de sons" -#: gui/launcher.cpp:410 -#: gui/launcher.cpp:548 +#: gui/launcher.cpp:410 gui/launcher.cpp:548 msgid "Select directory with game data" msgstr "Sélectionner le répertoire contenant les données du jeu" @@ -299,8 +254,7 @@ msgstr "S msgid "This game ID is already taken. Please choose another one." msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." -#: gui/launcher.cpp:500 -#: engines/dialogs.cpp:113 +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~Q~uitter" @@ -346,7 +300,8 @@ msgstr "~A~jouter..." #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" -msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" +msgstr "" +"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" #: gui/launcher.cpp:513 msgid "~E~dit Game..." @@ -368,34 +323,33 @@ msgstr "Supprime le jeu de la liste. Les fichiers sont conserv msgid "Search in game list" msgstr "Recherche dans la liste de jeux" -#: gui/launcher.cpp:526 -#: gui/launcher.cpp:1037 +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 -#: gui/options.cpp:667 +#: gui/launcher.cpp:529 gui/options.cpp:712 msgid "Clear value" msgstr "Effacer la valeur" -#: gui/launcher.cpp:551 -#: engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Charger le jeu:" -#: gui/launcher.cpp:551 -#: engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Charger" #: gui/launcher.cpp:660 -msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." -msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut " +"potentiellement ajouter un grand nombre de jeux." -#: gui/launcher.cpp:661 -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -403,8 +357,7 @@ msgstr "Voulez-vous vraiment lancer la d msgid "Yes" msgstr "Oui" -#: gui/launcher.cpp:661 -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -430,7 +383,8 @@ msgstr "Voulez-vous vraiment supprimer ce jeu?" #: gui/launcher.cpp:873 msgid "This game does not support loading games from the launcher." -msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." +msgstr "" +"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." #: gui/launcher.cpp:877 msgid "ScummVM could not find any engine capable of running the selected game!" @@ -444,8 +398,7 @@ msgstr "Ajout Massif..." msgid "Add Game..." msgstr "Ajouter..." -#: gui/massadd.cpp:79 -#: gui/massadd.cpp:82 +#: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." msgstr "... en cours ..." @@ -468,281 +421,304 @@ msgstr "%d r msgid "Discovered %d new games ..." msgstr "%d nouveaux jeux trouvés ..." -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "Never" msgstr "Jamais" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 5 mins" msgstr "Toutes les 5 mins" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 10 mins" msgstr "Toutes les 10 mins" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 15 mins" msgstr "Toutes les 15 mins" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 30 mins" msgstr "Toutes les 30 mins" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "8 kHz" msgstr "8 kHz" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "11kHz" msgstr "11 kHz" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "22 kHz" msgstr "22 kHz" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "44 kHz" msgstr "44 kHz" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:595 +#: gui/options.cpp:620 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:606 +#: gui/options.cpp:631 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:606 -#: gui/options.cpp:607 +#: gui/options.cpp:631 gui/options.cpp:632 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:616 +#: gui/options.cpp:641 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:626 -msgid "Music driver:" -msgstr "Pilote audio:" +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "" + +#: gui/options.cpp:651 +#, fuzzy +msgid "Specifies preferred sound device or sound card emulator" +msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:626 -#: gui/options.cpp:627 +#: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:642 +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:656 +#, fuzzy +msgid "Specifies default sound device for General Midi output" +msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" + +#: gui/options.cpp:687 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:642 -#: gui/options.cpp:643 +#: gui/options.cpp:687 gui/options.cpp:688 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:653 +#: gui/options.cpp:698 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:653 -#: gui/options.cpp:654 -msgid "Higher value specifies better sound quality but may be not supported by your soundcard" -msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son" +#: gui/options.cpp:698 gui/options.cpp:699 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " +"être supporté par votre carte son" -#: gui/options.cpp:665 +#: gui/options.cpp:710 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:665 -#: gui/options.cpp:666 +#: gui/options.cpp:710 gui/options.cpp:711 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" -msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity" +msgstr "" +"La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " +"Timidity" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:673 -msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" -msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur" +#: gui/options.cpp:718 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Vérifie si vous voulez utiliser un périphérique audio compatible Roland " +"connecté à l'ordinateur" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:679 +#: gui/options.cpp:724 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:692 +#: gui/options.cpp:737 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:697 -#: gui/options.cpp:703 +#: gui/options.cpp:742 gui/options.cpp:748 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:698 -#: gui/options.cpp:704 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:699 -#: gui/options.cpp:705 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:703 +#: gui/options.cpp:748 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:704 +#: gui/options.cpp:749 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:705 +#: gui/options.cpp:750 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:709 +#: gui/options.cpp:754 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:721 +#: gui/options.cpp:766 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:728 +#: gui/options.cpp:773 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:731 +#: gui/options.cpp:776 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:731 -#: gui/options.cpp:732 +#: gui/options.cpp:776 gui/options.cpp:777 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:738 +#: gui/options.cpp:783 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:815 +#: gui/options.cpp:914 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:818 +#: gui/options.cpp:917 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:821 -#: gui/options.cpp:822 +#: gui/options.cpp:920 gui/options.cpp:921 msgid "Specifies path to additional data used by all games or ScummVM" -msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM" +msgstr "" +"Spécifie un chemin vers des données supplémentaires utilisées par tous les " +"jeux ou ScummVM" -#: gui/options.cpp:825 +#: gui/options.cpp:924 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:830 +#: gui/options.cpp:929 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:832 +#: gui/options.cpp:931 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:836 +#: gui/options.cpp:935 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:842 +#: gui/options.cpp:941 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:850 +#: gui/options.cpp:949 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:862 +#: gui/options.cpp:961 msgid "English" msgstr "Anglais" -#: gui/options.cpp:996 +#: gui/options.cpp:1095 msgid "You have to restart ScummVM to take the effect." -msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte." +msgstr "" +"Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1009 +#: gui/options.cpp:1108 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1016 +#: gui/options.cpp:1115 msgid "The chosen directory cannot be written to. Please select another one." -msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire." +msgstr "" +"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " +"répertoire." -#: gui/options.cpp:1025 +#: gui/options.cpp:1124 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1035 +#: gui/options.cpp:1134 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1046 +#: gui/options.cpp:1145 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" -#: gui/saveload.cpp:60 -#: gui/saveload.cpp:241 +#: gui/saveload.cpp:60 gui/saveload.cpp:241 msgid "No date saved" msgstr "Date non sauvée" -#: gui/saveload.cpp:61 -#: gui/saveload.cpp:242 +#: gui/saveload.cpp:61 gui/saveload.cpp:242 msgid "No time saved" msgstr "Heure non sauvée" -#: gui/saveload.cpp:62 -#: gui/saveload.cpp:243 +#: gui/saveload.cpp:62 gui/saveload.cpp:243 msgid "No playtime saved" msgstr "Durée de jeu non sauvée" -#: gui/saveload.cpp:69 -#: gui/saveload.cpp:157 +#: gui/saveload.cpp:69 gui/saveload.cpp:157 msgid "Delete" msgstr "Supprimer" @@ -762,8 +738,7 @@ msgstr "Heure:" msgid "Playtime: " msgstr "Durée de jeu:" -#: gui/saveload.cpp:286 -#: gui/saveload.cpp:353 +#: gui/saveload.cpp:286 gui/saveload.cpp:353 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" @@ -783,66 +758,68 @@ msgstr "Standard (16bpp)" msgid "Antialiased Renderer (16bpp)" msgstr "Anti-crénelé (16 bpp)" -#: base/main.cpp:105 +#: base/main.cpp:106 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" msgstr "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" -#: base/main.cpp:106 +#: base/main.cpp:107 msgid " Looking for a plugin supporting this gameid... " msgstr "Recherche d'un plugin supportant cet ID..." -#: base/main.cpp:110 +#: base/main.cpp:111 msgid "failed\n" msgstr "Echec\n" -#: base/main.cpp:111 +#: base/main.cpp:112 #, c-format -msgid "%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour obtenir la liste des ID reconnus" +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" +"%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour " +"obtenir la liste des ID reconnus" -#: base/main.cpp:118 +#: base/main.cpp:119 #, c-format msgid " Starting '%s'\n" msgstr "Démarrage de '%s'\n" -#: base/main.cpp:147 +#: base/main.cpp:148 #, c-format msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%s', chemin '%s')" +msgstr "" +"Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%s', " +"chemin '%s')" -#: base/main.cpp:204 +#: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Le niveau de debug '%s' n'est pas supporté par ce moteur de jeu" -#: base/main.cpp:272 +#: base/main.cpp:273 msgid "Menu" msgstr "Menu" -#: base/main.cpp:275 -#: backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Passer" -#: base/main.cpp:278 -#: backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Mettre en pause" -#: base/main.cpp:281 +#: base/main.cpp:282 msgid "Skip line" msgstr "Passer la phrase" -#: base/main.cpp:393 +#: base/main.cpp:404 msgid "Error running game:" msgstr "Erreur lors de l'éxécution du jeu:" -#: base/main.cpp:419 -#: base/main.cpp:420 +#: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné" @@ -894,8 +871,7 @@ msgstr "Echec de la lecture" msgid "Writing data failed" msgstr "Echec de l'écriture des données" -#: common/error.cpp:60 -#: common/error.cpp:71 +#: common/error.cpp:60 common/error.cpp:71 msgid "Unknown Error" msgstr "Erreur inconnue" @@ -931,8 +907,7 @@ msgstr "Retour au ~L~anceur" msgid "Save game:" msgstr "Sauvegarde:" -#: engines/dialogs.cpp:119 -#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 #: backends/platform/wince/CEActionsPocket.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:44 @@ -940,14 +915,12 @@ msgstr "Sauvegarde:" msgid "Save" msgstr "Sauver" -#: engines/dialogs.cpp:301 -#: engines/mohawk/dialogs.cpp:84 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 -#: engines/mohawk/dialogs.cpp:85 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 #: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "~A~nnuler" @@ -969,8 +942,7 @@ msgstr "~S~uivant" msgid "~C~lose" msgstr "~F~ermer" -#: engines/mohawk/dialogs.cpp:81 -#: engines/mohawk/dialogs.cpp:115 +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip Activé" @@ -983,82 +955,30 @@ msgstr "T~r~ansitions activ msgid "~W~ater Effect Enabled" msgstr "~E~ffets de l'Eau activés" -#: sound/mididrv.cpp:61 +#: sound/null.h:45 msgid "No music" msgstr "Pas de musique" -#: sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "MIDI Windows" - -#: sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "ALSA" - -#: sound/mididrv.cpp:72 -msgid "Atari ST MIDI" -msgstr "MIDI Atari ST" - -#: sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "SEQ" - -#: sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "DMedia" - -#: sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "CAMD" - -#: sound/mididrv.cpp:88 -msgid "CoreAudio" -msgstr "CoreAudio" - -#: sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "CoreMIDI" - -#: sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "Yamaha Pa1" - -#: sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "Tapwave Zodiac" - -#: sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "FluidSynth" +#: sound/softsynth/mt32.cpp:327 +#, fuzzy +msgid "Initialising MT-32 Emulator" +msgstr "Initialisation du réseau" -#: sound/mididrv.cpp:105 -msgid "MT-32 Emulation" +#: sound/softsynth/mt32.cpp:541 +#, fuzzy +msgid "MT-32 Emulator" msgstr "Émulation MT-32" -#: sound/mididrv.cpp:109 -msgid "AdLib" -msgstr "AdLib" - -#: sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "Haut Parleur PC" - -#: sound/mididrv.cpp:111 -msgid "IBM PCjr" -msgstr "IBM PCjr" - -#: sound/mididrv.cpp:112 -msgid "Creative Music System" -msgstr "Creative Music System" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "Émulateur AdLib:" -#: sound/mididrv.cpp:113 -msgid "FM Towns" +#: sound/softsynth/ym2612.cpp:762 +#, fuzzy +msgid "FM Towns Emulator" msgstr "FM Towns" -#: sound/mididrv.cpp:115 -msgid "TiMidity" -msgstr "TiMidity" - #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" msgstr "Affectation des touches:" @@ -1277,13 +1197,11 @@ msgstr "Acceleration du pad GC:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 -#: backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 -#: backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Inconue" @@ -1466,6 +1384,57 @@ msgstr "Affichage" msgid "Do you want to perform an automatic scan ?" msgstr "Voulez-vous exécuter une recherche automatique?" +#~ msgid "Music driver:" +#~ msgstr "Pilote audio:" + +#~ msgid "Windows MIDI" +#~ msgstr "MIDI Windows" + +#~ msgid "ALSA" +#~ msgstr "ALSA" + +#~ msgid "Atari ST MIDI" +#~ msgstr "MIDI Atari ST" + +#~ msgid "SEQ" +#~ msgstr "SEQ" + +#~ msgid "DMedia" +#~ msgstr "DMedia" + +#~ msgid "CAMD" +#~ msgstr "CAMD" + +#~ msgid "CoreAudio" +#~ msgstr "CoreAudio" + +#~ msgid "CoreMIDI" +#~ msgstr "CoreMIDI" + +#~ msgid "Yamaha Pa1" +#~ msgstr "Yamaha Pa1" + +#~ msgid "Tapwave Zodiac" +#~ msgstr "Tapwave Zodiac" + +#~ msgid "FluidSynth" +#~ msgstr "FluidSynth" + +#~ msgid "AdLib" +#~ msgstr "AdLib" + +#~ msgid "PC Speaker" +#~ msgstr "Haut Parleur PC" + +#~ msgid "IBM PCjr" +#~ msgstr "IBM PCjr" + +#~ msgid "Creative Music System" +#~ msgstr "Creative Music System" + +#~ msgid "TiMidity" +#~ msgstr "TiMidity" + #~ msgid "About..." #~ msgstr "A propos..." diff --git a/po/hu_HU.po b/po/hu_HU.po index 196754d1fe..f0ec87897a 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -3,11 +3,12 @@ # This file is distributed under the same license as the ScummVM package. # Alex Bevilacqua , 2009. # +#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-17 20:57+0200\n" +"POT-Creation-Date: 2010-06-24 23:22+0200\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -38,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -60,11 +61,11 @@ msgstr "" msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:108 base/main.cpp:284 +#: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:111 base/main.cpp:287 +#: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" msgstr "" @@ -73,7 +74,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "Igen" @@ -136,9 +137,9 @@ msgid "" "English" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 -#: sound/mididrv.cpp:60 +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: sound/null.cpp:42 msgid "" msgstr "" @@ -150,11 +151,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "GFX" msgstr "" @@ -162,7 +163,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:790 +#: gui/launcher.cpp:213 gui/options.cpp:889 msgid "Audio" msgstr "Hang" @@ -170,7 +171,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:794 +#: gui/launcher.cpp:223 gui/options.cpp:893 msgid "Volume" msgstr "Volumene" @@ -178,7 +179,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:802 +#: gui/launcher.cpp:232 gui/options.cpp:901 msgid "MIDI" msgstr "" @@ -186,7 +187,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:808 +#: gui/launcher.cpp:244 gui/options.cpp:907 msgid "Paths" msgstr "Ösvények" @@ -195,7 +196,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:821 +#: gui/launcher.cpp:254 gui/options.cpp:920 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -208,18 +209,18 @@ msgstr "" msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 -#: gui/options.cpp:816 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 -#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 -#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 -#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 -#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 -#: gui/options.cpp:964 gui/options.cpp:1063 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 +#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 +#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 +#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 +#: gui/options.cpp:1063 gui/options.cpp:1162 msgid "None" msgstr "Semmi" @@ -229,7 +230,7 @@ msgstr "Semmi" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1057 +#: gui/launcher.cpp:391 gui/options.cpp:1156 msgid "Select SoundFont" msgstr "" @@ -321,7 +322,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:667 +#: gui/launcher.cpp:529 gui/options.cpp:712 msgid "Clear value" msgstr "" @@ -413,257 +414,277 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "Never" msgstr "Soha" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 5 mins" msgstr "5 percenként" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 10 mins" msgstr "10 percenként" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 15 mins" msgstr "15 percenként" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 30 mins" msgstr "30 percenként" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "8 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "11kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "22 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "44 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "48 kHz" msgstr "" -#: gui/options.cpp:595 +#: gui/options.cpp:620 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:606 +#: gui/options.cpp:631 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:606 gui/options.cpp:607 +#: gui/options.cpp:631 gui/options.cpp:632 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:616 +#: gui/options.cpp:641 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:626 -msgid "Music driver:" -msgstr "Zenei vezet :" +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "" + +#: gui/options.cpp:651 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "" -#: gui/options.cpp:626 gui/options.cpp:627 +#: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:642 +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:656 +msgid "Specifies default sound device for General Midi output" +msgstr "" + +#: gui/options.cpp:687 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:642 gui/options.cpp:643 +#: gui/options.cpp:687 gui/options.cpp:688 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:653 +#: gui/options.cpp:698 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:653 gui/options.cpp:654 +#: gui/options.cpp:698 gui/options.cpp:699 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:665 +#: gui/options.cpp:710 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:666 +#: gui/options.cpp:710 gui/options.cpp:711 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:679 +#: gui/options.cpp:724 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:692 +#: gui/options.cpp:737 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:697 gui/options.cpp:703 +#: gui/options.cpp:742 gui/options.cpp:748 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:698 gui/options.cpp:704 +#: gui/options.cpp:743 gui/options.cpp:749 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:699 gui/options.cpp:705 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Both" msgstr "" -#: gui/options.cpp:703 +#: gui/options.cpp:748 msgid "Spch" msgstr "" -#: gui/options.cpp:704 +#: gui/options.cpp:749 msgid "Subs" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:750 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:709 +#: gui/options.cpp:754 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:721 +#: gui/options.cpp:766 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:728 +#: gui/options.cpp:773 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:731 +#: gui/options.cpp:776 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:731 gui/options.cpp:732 +#: gui/options.cpp:776 gui/options.cpp:777 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:738 +#: gui/options.cpp:783 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:815 +#: gui/options.cpp:914 msgid "Save Path: " msgstr "" -#: gui/options.cpp:818 +#: gui/options.cpp:917 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:821 gui/options.cpp:822 +#: gui/options.cpp:920 gui/options.cpp:921 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:825 +#: gui/options.cpp:924 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:830 +#: gui/options.cpp:929 msgid "Misc" msgstr "" -#: gui/options.cpp:832 +#: gui/options.cpp:931 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:836 +#: gui/options.cpp:935 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:842 +#: gui/options.cpp:941 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:850 +#: gui/options.cpp:949 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:862 +#: gui/options.cpp:961 msgid "English" msgstr "" -#: gui/options.cpp:996 +#: gui/options.cpp:1095 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1009 +#: gui/options.cpp:1108 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1016 +#: gui/options.cpp:1115 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1025 +#: gui/options.cpp:1124 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1035 +#: gui/options.cpp:1134 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1046 +#: gui/options.cpp:1145 msgid "Select directory for plugins" msgstr "" @@ -720,65 +741,65 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: base/main.cpp:105 +#: base/main.cpp:106 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" msgstr "" -#: base/main.cpp:106 +#: base/main.cpp:107 msgid " Looking for a plugin supporting this gameid... " msgstr "" -#: base/main.cpp:110 +#: base/main.cpp:111 msgid "failed\n" msgstr "" -#: base/main.cpp:111 +#: base/main.cpp:112 #, c-format msgid "" "%s is an invalid gameid. Use the --list-games option to list supported gameid" msgstr "" -#: base/main.cpp:118 +#: base/main.cpp:119 #, c-format msgid " Starting '%s'\n" msgstr "" -#: base/main.cpp:147 +#: base/main.cpp:148 #, c-format msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" msgstr "" -#: base/main.cpp:204 +#: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" msgstr "" -#: base/main.cpp:272 +#: base/main.cpp:273 msgid "Menu" msgstr "" -#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "" -#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 #, fuzzy msgid "Pause" msgstr "Ösvények" -#: base/main.cpp:281 +#: base/main.cpp:282 msgid "Skip line" msgstr "" -#: base/main.cpp:393 +#: base/main.cpp:404 msgid "Error running game:" msgstr "" -#: base/main.cpp:419 base/main.cpp:420 +#: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "" @@ -915,82 +936,25 @@ msgstr "" msgid "~W~ater Effect Enabled" msgstr "" -#: sound/mididrv.cpp:61 +#: sound/null.h:45 msgid "No music" msgstr "" -#: sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "" - -#: sound/mididrv.cpp:68 -msgid "ALSA" +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" msgstr "" -#: sound/mididrv.cpp:72 -msgid "Atari ST MIDI" +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" msgstr "" -#: sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "" - -#: sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "" - -#: sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "" - -#: sound/mididrv.cpp:88 +#: sound/softsynth/adlib.cpp:1590 #, fuzzy -msgid "CoreAudio" -msgstr "Hang" - -#: sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "" - -#: sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "" - -#: sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "" - -#: sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "" - -#: sound/mididrv.cpp:105 -msgid "MT-32 Emulation" -msgstr "" - -#: sound/mididrv.cpp:109 -#, fuzzy -msgid "AdLib" -msgstr "Hang" - -#: sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "" - -#: sound/mididrv.cpp:111 -msgid "IBM PCjr" -msgstr "" - -#: sound/mididrv.cpp:112 -msgid "Creative Music System" -msgstr "" - -#: sound/mididrv.cpp:113 -msgid "FM Towns" -msgstr "" +msgid "AdLib Emulator" +msgstr "AdLib vezet :" -#: sound/mididrv.cpp:115 -msgid "TiMidity" +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" msgstr "" #: backends/keymapper/remap-dialog.cpp:49 @@ -1392,6 +1356,17 @@ msgstr "" msgid "Do you want to perform an automatic scan ?" msgstr "" +#~ msgid "Music driver:" +#~ msgstr "Zenei vezet :" + +#, fuzzy +#~ msgid "CoreAudio" +#~ msgstr "Hang" + +#, fuzzy +#~ msgid "AdLib" +#~ msgstr "Hang" + #~ msgid "Speech Only" #~ msgstr "Csak a beszéd" diff --git a/po/ru_RU.po b/po/ru_RU.po index ab11755975..727af8219b 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -3,11 +3,12 @@ # This file is distributed under the same license as the ScummVM package. # Eugene Sandulenko , 2010. # +#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-17 20:57+0200\n" +"POT-Creation-Date: 2010-06-24 23:22+0200\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -39,7 +40,7 @@ msgid "Go to previous directory level" msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -61,11 +62,11 @@ msgstr " msgid "Mouse click" msgstr "Êëèê ìûøüþ" -#: gui/GuiManager.cpp:108 base/main.cpp:284 +#: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" msgstr "Ïîêàçàòü êëàâèàòóðó" -#: gui/GuiManager.cpp:111 base/main.cpp:287 +#: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" msgstr "Ïåðåíàçíà÷èòü êëàâèøè" @@ -74,7 +75,7 @@ msgid "Map" msgstr "Íàçíà÷èòü" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -141,9 +142,9 @@ msgstr "" "ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " "ðóññêóþ" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 -#: sound/mididrv.cpp:60 +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: sound/null.cpp:42 msgid "" msgstr "<ïî óìîë÷àíèþ>" @@ -155,11 +156,11 @@ msgstr " msgid "Platform the game was originally designed for" msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "Graphics" msgstr "Ãðàôèêà" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "GFX" msgstr "Ãðô" @@ -167,7 +168,7 @@ msgstr " msgid "Override global graphic settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" -#: gui/launcher.cpp:213 gui/options.cpp:790 +#: gui/launcher.cpp:213 gui/options.cpp:889 msgid "Audio" msgstr "Àóäèî" @@ -175,7 +176,7 @@ msgstr " msgid "Override global audio settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" -#: gui/launcher.cpp:223 gui/options.cpp:794 +#: gui/launcher.cpp:223 gui/options.cpp:893 msgid "Volume" msgstr "Ãðîìêîñòü" @@ -183,7 +184,7 @@ msgstr " msgid "Override global volume settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" -#: gui/launcher.cpp:232 gui/options.cpp:802 +#: gui/launcher.cpp:232 gui/options.cpp:901 msgid "MIDI" msgstr "MIDI" @@ -191,7 +192,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:808 +#: gui/launcher.cpp:244 gui/options.cpp:907 msgid "Paths" msgstr "Ïóòè" @@ -199,7 +200,7 @@ msgstr " msgid "Game Path:" msgstr "Ïóòü ê èãðå: " -#: gui/launcher.cpp:254 gui/options.cpp:821 +#: gui/launcher.cpp:254 gui/options.cpp:920 msgid "Extra Path:" msgstr "Äîï. ïóòü:" @@ -211,18 +212,18 @@ msgstr " msgid "Save Path:" msgstr "Ïóòü ñîõð.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 -#: gui/options.cpp:816 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Specifies where your savegames are put" msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 -#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 -#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 -#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 -#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 -#: gui/options.cpp:964 gui/options.cpp:1063 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 +#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 +#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 +#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 +#: gui/options.cpp:1063 gui/options.cpp:1162 msgid "None" msgstr "Íå çàäàí" @@ -231,7 +232,7 @@ msgstr " msgid "Default" msgstr "Ïî óìîë÷àíèþ" -#: gui/launcher.cpp:391 gui/options.cpp:1057 +#: gui/launcher.cpp:391 gui/options.cpp:1156 msgid "Select SoundFont" msgstr "Âûáåðèòå SoundFont" @@ -323,7 +324,7 @@ msgstr " msgid "Search:" msgstr "Ïîèñê:" -#: gui/launcher.cpp:529 gui/options.cpp:667 +#: gui/launcher.cpp:529 gui/options.cpp:712 msgid "Clear value" msgstr "Î÷èñòèòü çíà÷åíèå" @@ -416,91 +417,113 @@ msgstr " msgid "Discovered %d new games ..." msgstr "Íàéäåíî %d íîâûõ èãð ..." -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "Never" msgstr "Íèêîãäà" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 5 mins" msgstr "êàæäûå 5 ìèíóò" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 10 mins" msgstr "êàæäûå 10 ìèíóò" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 15 mins" msgstr "êàæäûå 15 ìèíóò" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 30 mins" msgstr "êàæäûå 30 ìèíóò" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "8 kHz" msgstr "8 êÃö" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "11kHz" msgstr "11 êÃö" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "22 kHz" msgstr "22 êÃö" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "44 kHz" msgstr "44 êÃö" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "48 kHz" msgstr "48 êÃö" -#: gui/options.cpp:595 +#: gui/options.cpp:620 msgid "Graphics mode:" msgstr "Ãðàôè÷åñêèé ðåæèì:" -#: gui/options.cpp:606 +#: gui/options.cpp:631 msgid "Render mode:" msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" -#: gui/options.cpp:606 gui/options.cpp:607 +#: gui/options.cpp:631 gui/options.cpp:632 msgid "Special dithering modes supported by some games" msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" -#: gui/options.cpp:616 +#: gui/options.cpp:641 msgid "Fullscreen mode" msgstr "Ïîëíîýêðàííûé ðåæèì" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Aspect ratio correction" msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Correct aspect ratio for 320x200 games" msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" -#: gui/options.cpp:626 -msgid "Music driver:" -msgstr "Äðàéâåð ìóçûêè:" +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "" + +#: gui/options.cpp:651 +#, fuzzy +msgid "Specifies preferred sound device or sound card emulator" +msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" -#: gui/options.cpp:626 gui/options.cpp:627 +#: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" -#: gui/options.cpp:642 +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:656 +#, fuzzy +msgid "Specifies default sound device for General Midi output" +msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" + +#: gui/options.cpp:687 msgid "AdLib emulator:" msgstr "Ýìóëÿòîð AdLib:" -#: gui/options.cpp:642 gui/options.cpp:643 +#: gui/options.cpp:687 gui/options.cpp:688 msgid "AdLib is used for music in many games" msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" -#: gui/options.cpp:653 +#: gui/options.cpp:698 msgid "Output rate:" msgstr "Âûõîäíàÿ ÷àñòîòà:" -#: gui/options.cpp:653 gui/options.cpp:654 +#: gui/options.cpp:698 gui/options.cpp:699 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -508,29 +531,29 @@ msgstr "" "ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " "ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" -#: gui/options.cpp:665 +#: gui/options.cpp:710 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:665 gui/options.cpp:666 +#: gui/options.cpp:710 gui/options.cpp:711 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " "Timidity" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Mixed AdLib/MIDI mode" msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Use both MIDI and AdLib sound generation" msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -538,142 +561,142 @@ msgstr "" "Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " "õîòèòå åãî èñïîëüçîâàòü" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Enable Roland GS Mode" msgstr "Âêëþ÷èòü ðåæèì Roland GS" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" -#: gui/options.cpp:679 +#: gui/options.cpp:724 msgid "MIDI gain:" msgstr "Óñèëåíèå MIDI:" -#: gui/options.cpp:692 +#: gui/options.cpp:737 msgid "Text and Speech:" msgstr "Òåêñò è îçâó÷êà:" -#: gui/options.cpp:697 gui/options.cpp:703 +#: gui/options.cpp:742 gui/options.cpp:748 msgid "Speech" msgstr "Îçâó÷êà" -#: gui/options.cpp:698 gui/options.cpp:704 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Subtitles" msgstr "Ñóáòèòðû" -#: gui/options.cpp:699 gui/options.cpp:705 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Both" msgstr "Âñ¸" -#: gui/options.cpp:703 +#: gui/options.cpp:748 msgid "Spch" msgstr "Îçâ" -#: gui/options.cpp:704 +#: gui/options.cpp:749 msgid "Subs" msgstr "Ñóá" -#: gui/options.cpp:705 +#: gui/options.cpp:750 msgid "Show subtitles and play speech" msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" -#: gui/options.cpp:709 +#: gui/options.cpp:754 msgid "Subtitle speed:" msgstr "Ñêîðîñòü ñóáòèòðîâ:" -#: gui/options.cpp:721 +#: gui/options.cpp:766 msgid "Music volume:" msgstr "Ãðîìêîñòü ìóçûêè:" -#: gui/options.cpp:728 +#: gui/options.cpp:773 msgid "Mute All" msgstr "Âûêëþ÷èòü âñ¸" -#: gui/options.cpp:731 +#: gui/options.cpp:776 msgid "SFX volume:" msgstr "Ãðîìêîñòü ýôôåêòîâ:" -#: gui/options.cpp:731 gui/options.cpp:732 +#: gui/options.cpp:776 gui/options.cpp:777 msgid "Special sound effects volume" msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" -#: gui/options.cpp:738 +#: gui/options.cpp:783 msgid "Speech volume:" msgstr "Ãðîìêîñòü îçâó÷êè:" -#: gui/options.cpp:815 +#: gui/options.cpp:914 msgid "Save Path: " msgstr "Ïóòü äëÿ ñîõðàíåíèé: " -#: gui/options.cpp:818 +#: gui/options.cpp:917 msgid "Theme Path:" msgstr "Ïóòü ê òåìàì:" -#: gui/options.cpp:821 gui/options.cpp:822 +#: gui/options.cpp:920 gui/options.cpp:921 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " "ëèáî ScummVM" -#: gui/options.cpp:825 +#: gui/options.cpp:924 msgid "Plugins Path:" msgstr "Ïóòü ê ïëàãèíàì:" -#: gui/options.cpp:830 +#: gui/options.cpp:929 msgid "Misc" msgstr "Ðàçíîå" -#: gui/options.cpp:832 +#: gui/options.cpp:931 msgid "Theme:" msgstr "Òåìà:" -#: gui/options.cpp:836 +#: gui/options.cpp:935 msgid "GUI Renderer:" msgstr "Ðàñòåðèçàòîð GUI:" -#: gui/options.cpp:842 +#: gui/options.cpp:941 msgid "Autosave:" msgstr "Àâòîñîõðàíåíèå:" -#: gui/options.cpp:850 +#: gui/options.cpp:949 msgid "Keys" msgstr "Êëàâèøè" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "GUI Language:" msgstr "ßçûê èíòåðôåéñà:" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "Language of ScummVM GUI" msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" -#: gui/options.cpp:862 +#: gui/options.cpp:961 msgid "English" msgstr "English" -#: gui/options.cpp:996 +#: gui/options.cpp:1095 msgid "You have to restart ScummVM to take the effect." msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." -#: gui/options.cpp:1009 +#: gui/options.cpp:1108 msgid "Select directory for savegames" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" -#: gui/options.cpp:1016 +#: gui/options.cpp:1115 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." -#: gui/options.cpp:1025 +#: gui/options.cpp:1124 msgid "Select directory for GUI themes" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" -#: gui/options.cpp:1035 +#: gui/options.cpp:1134 msgid "Select directory for extra files" msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" -#: gui/options.cpp:1046 +#: gui/options.cpp:1145 msgid "Select directory for plugins" msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" @@ -729,20 +752,20 @@ msgstr " msgid "Antialiased Renderer (16bpp)" msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" -#: base/main.cpp:105 +#: base/main.cpp:106 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" msgstr "Ïîëüçîâàòåëü âûáðàë öåëü'%s' (gameid '%s')...\n" -#: base/main.cpp:106 +#: base/main.cpp:107 msgid " Looking for a plugin supporting this gameid... " msgstr " Èùó ïëàãèí ñ ïîääåðæêîé ýòîãî gameid... " -#: base/main.cpp:110 +#: base/main.cpp:111 msgid "failed\n" msgstr "íå óäàëîñü\n" -#: base/main.cpp:111 +#: base/main.cpp:112 #, c-format msgid "" "%s is an invalid gameid. Use the --list-games option to list supported gameid" @@ -750,45 +773,45 @@ msgstr "" "Íåâåðíûé gameid %s. Èñïîëüçóéòå îïöèþ --list-games äëÿ ïðîñìîòðà ñïèñêà " "ïîääåðæèâàåìûõ gameid" -#: base/main.cpp:118 +#: base/main.cpp:119 #, c-format msgid " Starting '%s'\n" msgstr " Çàïóñêàþ '%s'\n" -#: base/main.cpp:147 +#: base/main.cpp:148 #, c-format msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" msgstr "%s íå ñìîã çàïóñòèòü äâèæîê: %s (öåëü '%s', ïóòü '%s')" -#: base/main.cpp:204 +#: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" msgstr "Äâèæîê íå ïîääåðæèâàåò óðîâåíü îòëàäêè '%s'" -#: base/main.cpp:272 +#: base/main.cpp:273 msgid "Menu" msgstr "Ìåíþ" -#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Ïðîïóñòèòü" -#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Ïàóçà" -#: base/main.cpp:281 +#: base/main.cpp:282 msgid "Skip line" msgstr "Ïðîïóñòèòü ñòðîêó" -#: base/main.cpp:393 +#: base/main.cpp:404 msgid "Error running game:" msgstr "Îøèáêà çàïóñêà èãðû:" -#: base/main.cpp:419 base/main.cpp:420 +#: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "Íå ìîãó íàéòè äâèæîê äëÿ çàïóñêà âûáðàííîé èãðû" @@ -923,82 +946,30 @@ msgstr " msgid "~W~ater Effect Enabled" msgstr "Ýôôåêòû âîäû âêëþ÷åíû" -#: sound/mididrv.cpp:61 +#: sound/null.h:45 msgid "No music" msgstr "Áåç ìóçûêè" -#: sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "Windows MIDI" - -#: sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "ALSA" - -#: sound/mididrv.cpp:72 -msgid "Atari ST MIDI" -msgstr "Atars ST MIDI" - -#: sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "SEQ" - -#: sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "DMedia" - -#: sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "CAMD" - -#: sound/mididrv.cpp:88 -msgid "CoreAudio" -msgstr "CoreAudio" - -#: sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "CoreMIDI" - -#: sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "Yamaha Pa1" - -#: sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "Tapware Zodiac" - -#: sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "FluidSynth" +#: sound/softsynth/mt32.cpp:327 +#, fuzzy +msgid "Initialising MT-32 Emulator" +msgstr "Íàñòðàèâàþ ñåòü" -#: sound/mididrv.cpp:105 -msgid "MT-32 Emulation" +#: sound/softsynth/mt32.cpp:541 +#, fuzzy +msgid "MT-32 Emulator" msgstr "Ýìóëÿöèÿ MT-32" -#: sound/mididrv.cpp:109 -msgid "AdLib" -msgstr "AdLib" - -#: sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "PC ñïèêåð" - -#: sound/mididrv.cpp:111 -msgid "IBM PCjr" -msgstr "IBM PCjr" - -#: sound/mididrv.cpp:112 -msgid "Creative Music System" -msgstr "Creative Music System" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "Ýìóëÿòîð AdLib:" -#: sound/mididrv.cpp:113 -msgid "FM Towns" +#: sound/softsynth/ym2612.cpp:762 +#, fuzzy +msgid "FM Towns Emulator" msgstr "FM Towns" -#: sound/mididrv.cpp:115 -msgid "TiMidity" -msgstr "TiMidity" - #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" msgstr "Òàáëèöà êëàâèø:" @@ -1391,6 +1362,57 @@ msgstr " msgid "Do you want to perform an automatic scan ?" msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" +#~ msgid "Music driver:" +#~ msgstr "Äðàéâåð ìóçûêè:" + +#~ msgid "Windows MIDI" +#~ msgstr "Windows MIDI" + +#~ msgid "ALSA" +#~ msgstr "ALSA" + +#~ msgid "Atari ST MIDI" +#~ msgstr "Atars ST MIDI" + +#~ msgid "SEQ" +#~ msgstr "SEQ" + +#~ msgid "DMedia" +#~ msgstr "DMedia" + +#~ msgid "CAMD" +#~ msgstr "CAMD" + +#~ msgid "CoreAudio" +#~ msgstr "CoreAudio" + +#~ msgid "CoreMIDI" +#~ msgstr "CoreMIDI" + +#~ msgid "Yamaha Pa1" +#~ msgstr "Yamaha Pa1" + +#~ msgid "Tapwave Zodiac" +#~ msgstr "Tapware Zodiac" + +#~ msgid "FluidSynth" +#~ msgstr "FluidSynth" + +#~ msgid "AdLib" +#~ msgstr "AdLib" + +#~ msgid "PC Speaker" +#~ msgstr "PC ñïèêåð" + +#~ msgid "IBM PCjr" +#~ msgstr "IBM PCjr" + +#~ msgid "Creative Music System" +#~ msgstr "Creative Music System" + +#~ msgid "TiMidity" +#~ msgstr "TiMidity" + #~ msgid "About..." #~ msgstr "Î ïðîãðàììå..." @@ -1435,6 +1457,3 @@ msgstr " #~ msgid "Return to Launcher" #~ msgstr "Âåðíóòüñÿ â ãëàâíîå ìåíþ" - -#~ msgid "Specifies output sound device or sound emulator" -#~ msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" diff --git a/po/scummvm.pot b/po/scummvm.pot index 5ec8c93c63..b796a7d384 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -3,12 +3,13 @@ # This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR , YEAR. # +#: sound/null.cpp:35 #, fuzzy msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-17 20:57+0200\n" +"POT-Creation-Date: 2010-06-24 23:22+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:879 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -60,11 +61,11 @@ msgstr "" msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:108 base/main.cpp:284 +#: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:111 base/main.cpp:287 +#: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" msgstr "" @@ -73,7 +74,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:880 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "" @@ -136,9 +137,9 @@ msgid "" "English" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:79 -#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:860 -#: sound/mididrv.cpp:60 +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: sound/null.cpp:42 msgid "" msgstr "" @@ -150,11 +151,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:767 gui/options.cpp:784 +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 msgid "GFX" msgstr "" @@ -162,7 +163,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:790 +#: gui/launcher.cpp:213 gui/options.cpp:889 msgid "Audio" msgstr "" @@ -170,7 +171,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:794 +#: gui/launcher.cpp:223 gui/options.cpp:893 msgid "Volume" msgstr "" @@ -178,7 +179,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:802 +#: gui/launcher.cpp:232 gui/options.cpp:901 msgid "MIDI" msgstr "" @@ -186,7 +187,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:808 +#: gui/launcher.cpp:244 gui/options.cpp:907 msgid "Paths" msgstr "" @@ -194,7 +195,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:821 +#: gui/launcher.cpp:254 gui/options.cpp:920 msgid "Extra Path:" msgstr "" @@ -206,18 +207,18 @@ msgstr "" msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:815 -#: gui/options.cpp:816 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:227 gui/options.cpp:384 gui/options.cpp:470 -#: gui/options.cpp:526 gui/options.cpp:666 gui/options.cpp:819 -#: gui/options.cpp:822 gui/options.cpp:826 gui/options.cpp:903 -#: gui/options.cpp:909 gui/options.cpp:915 gui/options.cpp:923 -#: gui/options.cpp:947 gui/options.cpp:951 gui/options.cpp:957 -#: gui/options.cpp:964 gui/options.cpp:1063 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 +#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 +#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 +#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 +#: gui/options.cpp:1063 gui/options.cpp:1162 msgid "None" msgstr "" @@ -226,7 +227,7 @@ msgstr "" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1057 +#: gui/launcher.cpp:391 gui/options.cpp:1156 msgid "Select SoundFont" msgstr "" @@ -318,7 +319,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:667 +#: gui/launcher.cpp:529 gui/options.cpp:712 msgid "Clear value" msgstr "" @@ -409,255 +410,275 @@ msgstr "" msgid "Discovered %d new games ..." msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "Never" msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 5 mins" msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 10 mins" msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 15 mins" msgstr "" -#: gui/options.cpp:77 +#: gui/options.cpp:78 msgid "every 30 mins" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "8 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "11kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "22 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "44 kHz" msgstr "" -#: gui/options.cpp:79 +#: gui/options.cpp:80 msgid "48 kHz" msgstr "" -#: gui/options.cpp:595 +#: gui/options.cpp:620 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:606 +#: gui/options.cpp:631 msgid "Render mode:" msgstr "" -#: gui/options.cpp:606 gui/options.cpp:607 +#: gui/options.cpp:631 gui/options.cpp:632 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:616 +#: gui/options.cpp:641 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:619 +#: gui/options.cpp:644 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:626 -msgid "Music driver:" +#: gui/options.cpp:651 +msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:626 gui/options.cpp:627 +#: gui/options.cpp:651 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "" + +#: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:642 +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:656 +msgid "Specifies default sound device for General Midi output" +msgstr "" + +#: gui/options.cpp:687 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:642 gui/options.cpp:643 +#: gui/options.cpp:687 gui/options.cpp:688 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:653 +#: gui/options.cpp:698 msgid "Output rate:" msgstr "" -#: gui/options.cpp:653 gui/options.cpp:654 +#: gui/options.cpp:698 gui/options.cpp:699 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:665 +#: gui/options.cpp:710 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:665 gui/options.cpp:666 +#: gui/options.cpp:710 gui/options.cpp:711 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:670 +#: gui/options.cpp:715 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:673 +#: gui/options.cpp:718 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:676 +#: gui/options.cpp:721 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:679 +#: gui/options.cpp:724 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:692 +#: gui/options.cpp:737 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:697 gui/options.cpp:703 +#: gui/options.cpp:742 gui/options.cpp:748 msgid "Speech" msgstr "" -#: gui/options.cpp:698 gui/options.cpp:704 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Subtitles" msgstr "" -#: gui/options.cpp:699 gui/options.cpp:705 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Both" msgstr "" -#: gui/options.cpp:703 +#: gui/options.cpp:748 msgid "Spch" msgstr "" -#: gui/options.cpp:704 +#: gui/options.cpp:749 msgid "Subs" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:750 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:709 +#: gui/options.cpp:754 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:721 +#: gui/options.cpp:766 msgid "Music volume:" msgstr "" -#: gui/options.cpp:728 +#: gui/options.cpp:773 msgid "Mute All" msgstr "" -#: gui/options.cpp:731 +#: gui/options.cpp:776 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:731 gui/options.cpp:732 +#: gui/options.cpp:776 gui/options.cpp:777 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:738 +#: gui/options.cpp:783 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:815 +#: gui/options.cpp:914 msgid "Save Path: " msgstr "" -#: gui/options.cpp:818 +#: gui/options.cpp:917 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:821 gui/options.cpp:822 +#: gui/options.cpp:920 gui/options.cpp:921 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:825 +#: gui/options.cpp:924 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:830 +#: gui/options.cpp:929 msgid "Misc" msgstr "" -#: gui/options.cpp:832 +#: gui/options.cpp:931 msgid "Theme:" msgstr "" -#: gui/options.cpp:836 +#: gui/options.cpp:935 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:842 +#: gui/options.cpp:941 msgid "Autosave:" msgstr "" -#: gui/options.cpp:850 +#: gui/options.cpp:949 msgid "Keys" msgstr "" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:857 +#: gui/options.cpp:956 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:862 +#: gui/options.cpp:961 msgid "English" msgstr "" -#: gui/options.cpp:996 +#: gui/options.cpp:1095 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1009 +#: gui/options.cpp:1108 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1016 +#: gui/options.cpp:1115 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1025 +#: gui/options.cpp:1124 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1035 +#: gui/options.cpp:1134 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1046 +#: gui/options.cpp:1145 msgid "Select directory for plugins" msgstr "" @@ -713,64 +734,64 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: base/main.cpp:105 +#: base/main.cpp:106 #, c-format msgid "User picked target '%s' (gameid '%s')...\n" msgstr "" -#: base/main.cpp:106 +#: base/main.cpp:107 msgid " Looking for a plugin supporting this gameid... " msgstr "" -#: base/main.cpp:110 +#: base/main.cpp:111 msgid "failed\n" msgstr "" -#: base/main.cpp:111 +#: base/main.cpp:112 #, c-format msgid "" "%s is an invalid gameid. Use the --list-games option to list supported gameid" msgstr "" -#: base/main.cpp:118 +#: base/main.cpp:119 #, c-format msgid " Starting '%s'\n" msgstr "" -#: base/main.cpp:147 +#: base/main.cpp:148 #, c-format msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" msgstr "" -#: base/main.cpp:204 +#: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" msgstr "" -#: base/main.cpp:272 +#: base/main.cpp:273 msgid "Menu" msgstr "" -#: base/main.cpp:275 backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "" -#: base/main.cpp:278 backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "" -#: base/main.cpp:281 +#: base/main.cpp:282 msgid "Skip line" msgstr "" -#: base/main.cpp:393 +#: base/main.cpp:404 msgid "Error running game:" msgstr "" -#: base/main.cpp:419 base/main.cpp:420 +#: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "" @@ -905,80 +926,24 @@ msgstr "" msgid "~W~ater Effect Enabled" msgstr "" -#: sound/mididrv.cpp:61 +#: sound/null.h:45 msgid "No music" msgstr "" -#: sound/mididrv.cpp:64 -msgid "Windows MIDI" -msgstr "" - -#: sound/mididrv.cpp:68 -msgid "ALSA" -msgstr "" - -#: sound/mididrv.cpp:72 -msgid "Atari ST MIDI" -msgstr "" - -#: sound/mididrv.cpp:76 -msgid "SEQ" -msgstr "" - -#: sound/mididrv.cpp:80 -msgid "DMedia" -msgstr "" - -#: sound/mididrv.cpp:84 -msgid "CAMD" -msgstr "" - -#: sound/mididrv.cpp:88 -msgid "CoreAudio" -msgstr "" - -#: sound/mididrv.cpp:90 -msgid "CoreMIDI" -msgstr "" - -#: sound/mididrv.cpp:95 -msgid "Yamaha Pa1" -msgstr "" - -#: sound/mididrv.cpp:97 -msgid "Tapwave Zodiac" -msgstr "" - -#: sound/mididrv.cpp:102 -msgid "FluidSynth" -msgstr "" - -#: sound/mididrv.cpp:105 -msgid "MT-32 Emulation" -msgstr "" - -#: sound/mididrv.cpp:109 -msgid "AdLib" -msgstr "" - -#: sound/mididrv.cpp:110 -msgid "PC Speaker" -msgstr "" - -#: sound/mididrv.cpp:111 -msgid "IBM PCjr" +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" msgstr "" -#: sound/mididrv.cpp:112 -msgid "Creative Music System" +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" msgstr "" -#: sound/mididrv.cpp:113 -msgid "FM Towns" +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" msgstr "" -#: sound/mididrv.cpp:115 -msgid "TiMidity" +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" msgstr "" #: backends/keymapper/remap-dialog.cpp:49 diff --git a/tools/po2c b/tools/po2c index ac1744aa2c..f6aff97404 100755 --- a/tools/po2c +++ b/tools/po2c @@ -113,7 +113,7 @@ print "#include \n"; print "#include \n\n"; # dump first the msgid array -print "static const char * _po2c_msgids[] = {\n"; +print "static const char * const _po2c_msgids[] = {\n"; for(my $n = 0;$n < scalar(@msgids);$n++) { @@ -132,7 +132,7 @@ print "};\n\n"; foreach my $l (keys(%msgs)) { - print "static struct _po2c_msg _po2c_lang_${l}\[\] = {\n"; + print "static const struct _po2c_msg _po2c_lang_${l}\[\] = {\n"; # get the translation table for the language $l my ($m) = $msgs{$l}; @@ -160,10 +160,10 @@ foreach my $l (keys(%msgs)) # finally, dump the languages -print "static struct {\n"; +print "static const struct {\n"; print "\tconst char * lang;\n"; print "\tconst char * charset;\n"; -print "\tstruct _po2c_msg * msgs;\n"; +print "\tconst struct _po2c_msg * msgs;\n"; print "} _po2c_langs[] = {\n"; foreach my $l (keys(%msgs)) @@ -179,7 +179,7 @@ print "\t{ NULL, NULL, NULL }\n};\n\n"; print "/* code */\n"; print << 'EOF'; -static struct _po2c_msg * _po2c_lang=NULL; +static const struct _po2c_msg * _po2c_lang=NULL; static int _po2c_lang_size=0; static const char * _po2c_charset=NULL; @@ -216,7 +216,7 @@ void po2c_setlang(const char * lang) /* if found, count entries */ if(_po2c_lang != NULL) { - struct _po2c_msg * m; + const struct _po2c_msg * m; for(m=_po2c_lang;m->msgid != -1;m++) _po2c_lang_size++; @@ -225,7 +225,7 @@ void po2c_setlang(const char * lang) const char * po2c_gettext(const char * msgid) { - struct _po2c_msg * m; + const struct _po2c_msg * m; int b, t, n, c; /* if no language is set or msgid is empty, return msgid as is */ -- cgit v1.2.3 From 63cab52b854bedb33d5b2ef478c7f2568440a589 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 21:59:27 +0000 Subject: Adapt po2c's output to better mach our code formatting conventions. Along with it I added a suffix "-scummvm" to the version variable, since we also feature some custom extensions like the charset specification. svn-id: r50239 --- common/messages.cpp | 129 +++++++++++++++++++++++----------------------------- tools/po2c | 128 +++++++++++++++++++++++---------------------------- 2 files changed, 115 insertions(+), 142 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 7be2a62598..ec79ae7476 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -1,4 +1,4 @@ -/* generated by po2c 1.0.2 - Do not modify */ +// generated by po2c 1.0.2-scummvm - Do not modify #include #include @@ -320,12 +320,12 @@ static const char * const _po2c_msgids[] = { NULL }; -struct _po2c_msg { +struct PoMessageEntry { int msgid; - const char * msgstr; + const char *msgstr; }; -static const struct _po2c_msg _po2c_lang_ru_RU[] = { +static const PoMessageEntry _po2c_lang_ru_RU[] = { { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, @@ -638,7 +638,7 @@ static const struct _po2c_msg _po2c_lang_ru_RU[] = { { -1, NULL } }; -static const struct _po2c_msg _po2c_lang_fr_FR[] = { +static const PoMessageEntry _po2c_lang_fr_FR[] = { { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: fr\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "Recherche d'un plugin supportant cet ID..." }, @@ -944,7 +944,7 @@ static const struct _po2c_msg _po2c_lang_fr_FR[] = { { -1, NULL } }; -static const struct _po2c_msg _po2c_lang_hu_HU[] = { +static const PoMessageEntry _po2c_lang_hu_HU[] = { { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, { 19, "AdLib vezet :" }, @@ -1000,112 +1000,99 @@ static const struct _po2c_msg _po2c_lang_hu_HU[] = { { -1, NULL } }; -static const struct { - const char * lang; - const char * charset; - const struct _po2c_msg * msgs; -} _po2c_langs[] = { +struct PoLangEntry { + const char *lang; + const char *charset; + const PoMessageEntry *msgs; +}; + +const PoLangEntry _po2c_langs[] = { { "ru_RU", "cp1251", _po2c_lang_ru_RU }, { "fr_FR", "iso-8859-1", _po2c_lang_fr_FR }, { "hu_HU", "cp1250", _po2c_lang_hu_HU }, { NULL, NULL, NULL } }; -/* code */ +// code -static const struct _po2c_msg * _po2c_lang=NULL; -static int _po2c_lang_size=0; -static const char * _po2c_charset=NULL; +static const struct PoMessageEntry *_po2c_lang = NULL; +static int _po2c_lang_size = 0; +static const char * _po2c_charset = NULL; -void po2c_setlang(const char * lang) -{ - int n; +void po2c_setlang(const char *lang) { + _po2c_lang = NULL; + _po2c_lang_size = 0; + _po2c_charset = NULL; - _po2c_lang=NULL; - _po2c_lang_size=0; - _po2c_charset=NULL; - - /* if lang is NULL or "", deactivate it */ - if(lang == NULL || *lang == '\0') + // if lang is NULL or "", deactivate it + if (lang == NULL || *lang == '\0') return; - /* searches for a valid language array */ - for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) - { - if(strcmp(lang, _po2c_langs[n].lang) == 0) { - _po2c_lang=_po2c_langs[n].msgs; - _po2c_charset=_po2c_langs[n].charset; + // searches for a valid language array + for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { + if (strcmp(lang, _po2c_langs[i].lang) == 0) { + _po2c_lang = _po2c_langs[i].msgs; + _po2c_charset = _po2c_langs[i].charset; } } - /* try partial searches */ - for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) - { - if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { - _po2c_lang=_po2c_langs[n].msgs; - _po2c_charset=_po2c_langs[n].charset; + // try partial searches + for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { + if (strncmp(lang, _po2c_langs[i].lang, 2) == 0) { + _po2c_lang = _po2c_langs[i].msgs; + _po2c_charset = _po2c_langs[i].charset; } } - /* if found, count entries */ - if(_po2c_lang != NULL) - { - const struct _po2c_msg * m; - - for(m=_po2c_lang;m->msgid != -1;m++) - _po2c_lang_size++; + // if found, count entries + if (_po2c_lang != NULL) { + for (const PoMessageEntry *m = _po2c_lang; m->msgid != -1; ++m) + ++_po2c_lang_size; } } -const char * po2c_gettext(const char * msgid) -{ - const struct _po2c_msg * m; - int b, t, n, c; +const char *po2c_gettext(const char *msgid) { + // if no language is set or msgid is empty, return msgid as is + if (_po2c_lang == NULL || *msgid == '\0') + return msgid; - /* if no language is set or msgid is empty, return msgid as is */ - if(_po2c_lang == NULL || *msgid == '\0') - return(msgid); + // binary-search for the msgid + int leftIndex = 0; + int rightIndex = _po2c_lang_size - 1; - /* binary-search for the msgid */ - b=0; t=_po2c_lang_size - 1; + while (rightIndex >= leftIndex) { + const int midIndex = (leftIndex + rightIndex) / 2; + const struct PoMessageEntry * const m = &_po2c_lang[midIndex]; - while(t >= b) - { - n=(b + t) / 2; - m=&_po2c_lang[n]; + const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); - c=strcmp(msgid, _po2c_msgids[m->msgid]); - - if(c == 0) - return(m->msgstr); - else - if(c < 0) - t=n - 1; + if (compareResult == 0) + return m->msgstr; + else if (compareResult < 0) + rightIndex = midIndex - 1; else - b=n + 1; + leftIndex = midIndex + 1; } - return(msgid); + return msgid; } -const char * po2c_getcharset(void) -{ +const char *po2c_getcharset(void) { if (_po2c_charset) return _po2c_charset; else return "ASCII"; } -int po2c_getnumlangs(void) -{ +int po2c_getnumlangs(void) { int n = 0; + while (_po2c_langs[n].lang) n++; return n; } -const char * po2c_getlang(int num) -{ +const char *po2c_getlang(int num) { return _po2c_langs[num].lang; } diff --git a/tools/po2c b/tools/po2c index f6aff97404..a2b006cd6b 100755 --- a/tools/po2c +++ b/tools/po2c @@ -22,7 +22,7 @@ # http://www.triptico.com # -$VERSION = "1.0.2"; +$VERSION = "1.0.2-scummvm"; if(scalar(@ARGV) == 0) { @@ -106,9 +106,9 @@ for(my $n = 0;$n < scalar(@msgids);$n++) $msgids{$msgids[$n]} = $n; } -# stage 3: dump as C code +# stage 3: dump as C++ code -print "/* generated by po2c $VERSION - Do not modify */\n\n"; +print "// generated by po2c $VERSION - Do not modify\n\n"; print "#include \n"; print "#include \n\n"; @@ -123,16 +123,16 @@ for(my $n = 0;$n < scalar(@msgids);$n++) print "\tNULL\n};\n\n"; # dump the lang structure -print "struct _po2c_msg {\n"; +print "struct PoMessageEntry {\n"; print "\tint msgid;\n"; -print "\tconst char * msgstr;\n"; +print "\tconst char *msgstr;\n"; print "};\n\n"; # dump now each language foreach my $l (keys(%msgs)) { - print "static const struct _po2c_msg _po2c_lang_${l}\[\] = {\n"; + print "static const PoMessageEntry _po2c_lang_${l}\[\] = {\n"; # get the translation table for the language $l my ($m) = $msgs{$l}; @@ -160,11 +160,12 @@ foreach my $l (keys(%msgs)) # finally, dump the languages -print "static const struct {\n"; -print "\tconst char * lang;\n"; -print "\tconst char * charset;\n"; -print "\tconst struct _po2c_msg * msgs;\n"; -print "} _po2c_langs[] = {\n"; +print "struct PoLangEntry {\n"; +print "\tconst char *lang;\n"; +print "\tconst char *charset;\n"; +print "\tconst PoMessageEntry *msgs;\n"; +print "};\n\n"; +print "const PoLangEntry _po2c_langs[] = {\n"; foreach my $l (keys(%msgs)) { @@ -176,103 +177,88 @@ foreach my $l (keys(%msgs)) print "\t{ NULL, NULL, NULL }\n};\n\n"; -print "/* code */\n"; +print "// code\n"; print << 'EOF'; -static const struct _po2c_msg * _po2c_lang=NULL; -static int _po2c_lang_size=0; -static const char * _po2c_charset=NULL; - -void po2c_setlang(const char * lang) -{ - int n; +static const struct PoMessageEntry *_po2c_lang = NULL; +static int _po2c_lang_size = 0; +static const char * _po2c_charset = NULL; - _po2c_lang=NULL; - _po2c_lang_size=0; - _po2c_charset=NULL; +void po2c_setlang(const char *lang) { + _po2c_lang = NULL; + _po2c_lang_size = 0; + _po2c_charset = NULL; - /* if lang is NULL or "", deactivate it */ - if(lang == NULL || *lang == '\0') + // if lang is NULL or "", deactivate it + if (lang == NULL || *lang == '\0') return; - /* searches for a valid language array */ - for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) - { - if(strcmp(lang, _po2c_langs[n].lang) == 0) { - _po2c_lang=_po2c_langs[n].msgs; - _po2c_charset=_po2c_langs[n].charset; + // searches for a valid language array + for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { + if (strcmp(lang, _po2c_langs[i].lang) == 0) { + _po2c_lang = _po2c_langs[i].msgs; + _po2c_charset = _po2c_langs[i].charset; } } - /* try partial searches */ - for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) - { - if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { - _po2c_lang=_po2c_langs[n].msgs; - _po2c_charset=_po2c_langs[n].charset; + // try partial searches + for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { + if (strncmp(lang, _po2c_langs[i].lang, 2) == 0) { + _po2c_lang = _po2c_langs[i].msgs; + _po2c_charset = _po2c_langs[i].charset; } } - /* if found, count entries */ - if(_po2c_lang != NULL) - { - const struct _po2c_msg * m; - - for(m=_po2c_lang;m->msgid != -1;m++) - _po2c_lang_size++; + // if found, count entries + if (_po2c_lang != NULL) { + for (const PoMessageEntry *m = _po2c_lang; m->msgid != -1; ++m) + ++_po2c_lang_size; } } -const char * po2c_gettext(const char * msgid) -{ - const struct _po2c_msg * m; - int b, t, n, c; +const char *po2c_gettext(const char *msgid) { + // if no language is set or msgid is empty, return msgid as is + if (_po2c_lang == NULL || *msgid == '\0') + return msgid; - /* if no language is set or msgid is empty, return msgid as is */ - if(_po2c_lang == NULL || *msgid == '\0') - return(msgid); + // binary-search for the msgid + int leftIndex = 0; + int rightIndex = _po2c_lang_size - 1; - /* binary-search for the msgid */ - b=0; t=_po2c_lang_size - 1; + while (rightIndex >= leftIndex) { + const int midIndex = (leftIndex + rightIndex) / 2; + const struct PoMessageEntry * const m = &_po2c_lang[midIndex]; - while(t >= b) - { - n=(b + t) / 2; - m=&_po2c_lang[n]; - - c=strcmp(msgid, _po2c_msgids[m->msgid]); + const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); - if(c == 0) - return(m->msgstr); + if (compareResult == 0) + return m->msgstr; + else if (compareResult < 0) + rightIndex = midIndex - 1; else - if(c < 0) - t=n - 1; - else - b=n + 1; + leftIndex = midIndex + 1; } - return(msgid); + return msgid; } -const char * po2c_getcharset(void) -{ +const char *po2c_getcharset(void) { if (_po2c_charset) return _po2c_charset; else return "ASCII"; } -int po2c_getnumlangs(void) -{ +int po2c_getnumlangs(void) { int n = 0; + while (_po2c_langs[n].lang) n++; return n; } -const char * po2c_getlang(int num) -{ +const char *po2c_getlang(int num) { return _po2c_langs[num].lang; } EOF -- cgit v1.2.3 From a5fb4fec2e71f252d5f7aa2b8d09165ce46fa3fa Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 21:59:50 +0000 Subject: Some more cleanup of po2c's output. svn-id: r50240 --- common/messages.cpp | 70 +++++++++++++++++++++++++---------------------------- tools/po2c | 62 ++++++++++++++++++++++------------------------- 2 files changed, 62 insertions(+), 70 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index ec79ae7476..bd37656417 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -325,7 +325,7 @@ struct PoMessageEntry { const char *msgstr; }; -static const PoMessageEntry _po2c_lang_ru_RU[] = { +static const PoMessageEntry _translation_ru_RU[] = { { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, @@ -638,7 +638,7 @@ static const PoMessageEntry _po2c_lang_ru_RU[] = { { -1, NULL } }; -static const PoMessageEntry _po2c_lang_fr_FR[] = { +static const PoMessageEntry _translation_fr_FR[] = { { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: fr\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "Recherche d'un plugin supportant cet ID..." }, @@ -944,7 +944,7 @@ static const PoMessageEntry _po2c_lang_fr_FR[] = { { -1, NULL } }; -static const PoMessageEntry _po2c_lang_hu_HU[] = { +static const PoMessageEntry _translation_hu_HU[] = { { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, { 19, "AdLib vezet :" }, @@ -1006,63 +1006,63 @@ struct PoLangEntry { const PoMessageEntry *msgs; }; -const PoLangEntry _po2c_langs[] = { - { "ru_RU", "cp1251", _po2c_lang_ru_RU }, - { "fr_FR", "iso-8859-1", _po2c_lang_fr_FR }, - { "hu_HU", "cp1250", _po2c_lang_hu_HU }, +const PoLangEntry _translations[] = { + { "ru_RU", "cp1251", _translation_ru_RU }, + { "fr_FR", "iso-8859-1", _translation_fr_FR }, + { "hu_HU", "cp1250", _translation_hu_HU }, { NULL, NULL, NULL } }; // code -static const struct PoMessageEntry *_po2c_lang = NULL; -static int _po2c_lang_size = 0; -static const char * _po2c_charset = NULL; +static const struct PoMessageEntry *_currentTranslation = NULL; +static int _currentTranslationMessageEntries = 0; +static const char *_currentTranslationCharset = NULL; void po2c_setlang(const char *lang) { - _po2c_lang = NULL; - _po2c_lang_size = 0; - _po2c_charset = NULL; + _currentTranslation = NULL; + _currentTranslationMessageEntries = 0; + _currentTranslationCharset = NULL; // if lang is NULL or "", deactivate it if (lang == NULL || *lang == '\0') return; // searches for a valid language array - for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { - if (strcmp(lang, _po2c_langs[i].lang) == 0) { - _po2c_lang = _po2c_langs[i].msgs; - _po2c_charset = _po2c_langs[i].charset; + for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) { + if (strcmp(lang, _translations[i].lang) == 0) { + _currentTranslation = _translations[i].msgs; + _currentTranslationCharset = _translations[i].charset; } } // try partial searches - for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { - if (strncmp(lang, _po2c_langs[i].lang, 2) == 0) { - _po2c_lang = _po2c_langs[i].msgs; - _po2c_charset = _po2c_langs[i].charset; + for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) { + if (strncmp(lang, _translations[i].lang, 2) == 0) { + _currentTranslation = _translations[i].msgs; + _currentTranslationCharset = _translations[i].charset; } } // if found, count entries - if (_po2c_lang != NULL) { - for (const PoMessageEntry *m = _po2c_lang; m->msgid != -1; ++m) - ++_po2c_lang_size; + if (_currentTranslation != NULL) { + for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m) + ++_currentTranslationMessageEntries; } } const char *po2c_gettext(const char *msgid) { // if no language is set or msgid is empty, return msgid as is - if (_po2c_lang == NULL || *msgid == '\0') + if (_currentTranslation == NULL || *msgid == '\0') return msgid; // binary-search for the msgid int leftIndex = 0; - int rightIndex = _po2c_lang_size - 1; + int rightIndex = _currentTranslationMessageEntries - 1; while (rightIndex >= leftIndex) { const int midIndex = (leftIndex + rightIndex) / 2; - const struct PoMessageEntry * const m = &_po2c_lang[midIndex]; + const struct PoMessageEntry * const m = &_currentTranslation[midIndex]; const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); @@ -1078,21 +1078,17 @@ const char *po2c_gettext(const char *msgid) { } const char *po2c_getcharset(void) { - if (_po2c_charset) - return _po2c_charset; + if (_currentTranslationCharset) + return _currentTranslationCharset; else return "ASCII"; } int po2c_getnumlangs(void) { - int n = 0; - - while (_po2c_langs[n].lang) - n++; - - return n; + return ARRAYSIZE(_translations) - 1; } -const char *po2c_getlang(int num) { - return _po2c_langs[num].lang; +const char *po2c_getlang(const int num) { + assert(num < ARRAYSIZE(_translations)); + return _translations[num].lang; } diff --git a/tools/po2c b/tools/po2c index a2b006cd6b..ae55b28bfa 100755 --- a/tools/po2c +++ b/tools/po2c @@ -132,7 +132,7 @@ print "};\n\n"; foreach my $l (keys(%msgs)) { - print "static const PoMessageEntry _po2c_lang_${l}\[\] = {\n"; + print "static const PoMessageEntry _translation_${l}\[\] = {\n"; # get the translation table for the language $l my ($m) = $msgs{$l}; @@ -165,14 +165,14 @@ print "\tconst char *lang;\n"; print "\tconst char *charset;\n"; print "\tconst PoMessageEntry *msgs;\n"; print "};\n\n"; -print "const PoLangEntry _po2c_langs[] = {\n"; +print "const PoLangEntry _translations[] = {\n"; foreach my $l (keys(%msgs)) { $header = $msgs{$l}->{""}; $header =~ /charset=([^\\]+)/; $charset = $1; - print "\t{ \"" . $l . "\", \"" . $charset . "\", _po2c_lang_${l} },\n"; + print "\t{ \"" . $l . "\", \"" . $charset . "\", _translation_${l} },\n"; } print "\t{ NULL, NULL, NULL }\n};\n\n"; @@ -180,54 +180,54 @@ print "\t{ NULL, NULL, NULL }\n};\n\n"; print "// code\n"; print << 'EOF'; -static const struct PoMessageEntry *_po2c_lang = NULL; -static int _po2c_lang_size = 0; -static const char * _po2c_charset = NULL; +static const struct PoMessageEntry *_currentTranslation = NULL; +static int _currentTranslationMessageEntries = 0; +static const char *_currentTranslationCharset = NULL; void po2c_setlang(const char *lang) { - _po2c_lang = NULL; - _po2c_lang_size = 0; - _po2c_charset = NULL; + _currentTranslation = NULL; + _currentTranslationMessageEntries = 0; + _currentTranslationCharset = NULL; // if lang is NULL or "", deactivate it if (lang == NULL || *lang == '\0') return; // searches for a valid language array - for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { - if (strcmp(lang, _po2c_langs[i].lang) == 0) { - _po2c_lang = _po2c_langs[i].msgs; - _po2c_charset = _po2c_langs[i].charset; + for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) { + if (strcmp(lang, _translations[i].lang) == 0) { + _currentTranslation = _translations[i].msgs; + _currentTranslationCharset = _translations[i].charset; } } // try partial searches - for (int i = 0; _po2c_lang == NULL && _po2c_langs[i].lang != NULL; ++i) { - if (strncmp(lang, _po2c_langs[i].lang, 2) == 0) { - _po2c_lang = _po2c_langs[i].msgs; - _po2c_charset = _po2c_langs[i].charset; + for (int i = 0; _currentTranslation == NULL && _translations[i].lang != NULL; ++i) { + if (strncmp(lang, _translations[i].lang, 2) == 0) { + _currentTranslation = _translations[i].msgs; + _currentTranslationCharset = _translations[i].charset; } } // if found, count entries - if (_po2c_lang != NULL) { - for (const PoMessageEntry *m = _po2c_lang; m->msgid != -1; ++m) - ++_po2c_lang_size; + if (_currentTranslation != NULL) { + for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m) + ++_currentTranslationMessageEntries; } } const char *po2c_gettext(const char *msgid) { // if no language is set or msgid is empty, return msgid as is - if (_po2c_lang == NULL || *msgid == '\0') + if (_currentTranslation == NULL || *msgid == '\0') return msgid; // binary-search for the msgid int leftIndex = 0; - int rightIndex = _po2c_lang_size - 1; + int rightIndex = _currentTranslationMessageEntries - 1; while (rightIndex >= leftIndex) { const int midIndex = (leftIndex + rightIndex) / 2; - const struct PoMessageEntry * const m = &_po2c_lang[midIndex]; + const struct PoMessageEntry * const m = &_currentTranslation[midIndex]; const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); @@ -243,23 +243,19 @@ const char *po2c_gettext(const char *msgid) { } const char *po2c_getcharset(void) { - if (_po2c_charset) - return _po2c_charset; + if (_currentTranslationCharset) + return _currentTranslationCharset; else return "ASCII"; } int po2c_getnumlangs(void) { - int n = 0; - - while (_po2c_langs[n].lang) - n++; - - return n; + return ARRAYSIZE(_translations) - 1; } -const char *po2c_getlang(int num) { - return _po2c_langs[num].lang; +const char *po2c_getlang(const int num) { + assert(num < ARRAYSIZE(_translations)); + return _translations[num].lang; } EOF -- cgit v1.2.3 From 968e10795ffdf2e17a7ca678ca5e303b0d265795 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 22:00:20 +0000 Subject: Do not include any headers from common/messages.cpp, since that file might be included into an namespace. svn-id: r50241 --- common/messages.cpp | 3 --- tools/po2c | 2 -- 2 files changed, 5 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index bd37656417..dde7f1504c 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -1,8 +1,5 @@ // generated by po2c 1.0.2-scummvm - Do not modify -#include -#include - static const char * const _po2c_msgids[] = { /* 0 */ "", /* 1 */ " Are you sure you want to quit ? ", diff --git a/tools/po2c b/tools/po2c index ae55b28bfa..dddd4541c0 100755 --- a/tools/po2c +++ b/tools/po2c @@ -109,8 +109,6 @@ for(my $n = 0;$n < scalar(@msgids);$n++) # stage 3: dump as C++ code print "// generated by po2c $VERSION - Do not modify\n\n"; -print "#include \n"; -print "#include \n\n"; # dump first the msgid array print "static const char * const _po2c_msgids[] = {\n"; -- cgit v1.2.3 From 17a96b3bd2f0c24fdf581aac8cffabb575fd8c82 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 22:00:45 +0000 Subject: Yet another slight variable renaming to match our conventions. svn-id: r50242 --- common/messages.cpp | 16 ++++++++-------- tools/po2c | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index dde7f1504c..b33e2ab115 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -1,6 +1,6 @@ // generated by po2c 1.0.2-scummvm - Do not modify -static const char * const _po2c_msgids[] = { +static const char * const _messageIds[] = { /* 0 */ "", /* 1 */ " Are you sure you want to quit ? ", /* 2 */ " Looking for a plugin supporting this gameid... ", @@ -1012,13 +1012,13 @@ const PoLangEntry _translations[] = { // code -static const struct PoMessageEntry *_currentTranslation = NULL; -static int _currentTranslationMessageEntries = 0; +static const PoMessageEntry *_currentTranslation = NULL; +static int _currentTranslationMessageEntryCount = 0; static const char *_currentTranslationCharset = NULL; void po2c_setlang(const char *lang) { _currentTranslation = NULL; - _currentTranslationMessageEntries = 0; + _currentTranslationMessageEntryCount = 0; _currentTranslationCharset = NULL; // if lang is NULL or "", deactivate it @@ -1044,7 +1044,7 @@ void po2c_setlang(const char *lang) { // if found, count entries if (_currentTranslation != NULL) { for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m) - ++_currentTranslationMessageEntries; + ++_currentTranslationMessageEntryCount; } } @@ -1055,13 +1055,13 @@ const char *po2c_gettext(const char *msgid) { // binary-search for the msgid int leftIndex = 0; - int rightIndex = _currentTranslationMessageEntries - 1; + int rightIndex = _currentTranslationMessageEntryCount - 1; while (rightIndex >= leftIndex) { const int midIndex = (leftIndex + rightIndex) / 2; - const struct PoMessageEntry * const m = &_currentTranslation[midIndex]; + const PoMessageEntry * const m = &_currentTranslation[midIndex]; - const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); + const int compareResult = strcmp(msgid, _messageIds[m->msgid]); if (compareResult == 0) return m->msgstr; diff --git a/tools/po2c b/tools/po2c index dddd4541c0..9dbc5e0fb7 100755 --- a/tools/po2c +++ b/tools/po2c @@ -111,7 +111,7 @@ for(my $n = 0;$n < scalar(@msgids);$n++) print "// generated by po2c $VERSION - Do not modify\n\n"; # dump first the msgid array -print "static const char * const _po2c_msgids[] = {\n"; +print "static const char * const _messageIds[] = {\n"; for(my $n = 0;$n < scalar(@msgids);$n++) { @@ -178,13 +178,13 @@ print "\t{ NULL, NULL, NULL }\n};\n\n"; print "// code\n"; print << 'EOF'; -static const struct PoMessageEntry *_currentTranslation = NULL; -static int _currentTranslationMessageEntries = 0; +static const PoMessageEntry *_currentTranslation = NULL; +static int _currentTranslationMessageEntryCount = 0; static const char *_currentTranslationCharset = NULL; void po2c_setlang(const char *lang) { _currentTranslation = NULL; - _currentTranslationMessageEntries = 0; + _currentTranslationMessageEntryCount = 0; _currentTranslationCharset = NULL; // if lang is NULL or "", deactivate it @@ -210,7 +210,7 @@ void po2c_setlang(const char *lang) { // if found, count entries if (_currentTranslation != NULL) { for (const PoMessageEntry *m = _currentTranslation; m->msgid != -1; ++m) - ++_currentTranslationMessageEntries; + ++_currentTranslationMessageEntryCount; } } @@ -221,13 +221,13 @@ const char *po2c_gettext(const char *msgid) { // binary-search for the msgid int leftIndex = 0; - int rightIndex = _currentTranslationMessageEntries - 1; + int rightIndex = _currentTranslationMessageEntryCount - 1; while (rightIndex >= leftIndex) { const int midIndex = (leftIndex + rightIndex) / 2; - const struct PoMessageEntry * const m = &_currentTranslation[midIndex]; + const PoMessageEntry * const m = &_currentTranslation[midIndex]; - const int compareResult = strcmp(msgid, _po2c_msgids[m->msgid]); + const int compareResult = strcmp(msgid, _messageIds[m->msgid]); if (compareResult == 0) return m->msgstr; -- cgit v1.2.3 From e7f3ddf2dbb379ee41d82347f928d5f8d6f0e60d Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 24 Jun 2010 22:32:52 +0000 Subject: Cleaning the header of the french translation file. svn-id: r50245 --- po/fr_FR.po | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/po/fr_FR.po b/po/fr_FR.po index 3dcf2c6e81..4ae04d05f0 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -8,18 +8,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:22+0200\n" +"POT-Creation-Date: 2010-06-24 23:30+0100\n" "PO-Revision-Date: 2010-06-19 23:43+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" -"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" -"X-Poedit-Language: French\n" -"X-Poedit-Country: FRANCE\n" -"X-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" #: gui/about.cpp:96 msgid "C2(built on " -- cgit v1.2.3 From d783ca972abee9702e6abf31f13188fc59d7d32d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 22:33:49 +0000 Subject: Disable addition of "SCUMMVM_SVN_REVISION" to the version string, in case --enable-release was specified on configure run. svn-id: r50246 --- base/internal_version.h | 4 ++++ base/internal_version.h.in | 4 ++++ configure | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/base/internal_version.h b/base/internal_version.h index bdd0474c2b..533348ace4 100644 --- a/base/internal_version.h +++ b/base/internal_version.h @@ -2,4 +2,8 @@ #define SCUMMVM_SVN_REVISION #endif +#ifdef RELEASE_BUILD +#undef SCUMMVM_SVN_REVISION +#endif + #define SCUMMVM_VERSION "1.2.0svn" SCUMMVM_SVN_REVISION diff --git a/base/internal_version.h.in b/base/internal_version.h.in index 1b7e5ed147..0199b67d5c 100644 --- a/base/internal_version.h.in +++ b/base/internal_version.h.in @@ -2,4 +2,8 @@ #define SCUMMVM_SVN_REVISION #endif +#ifdef RELEASE_BUILD +#undef SCUMMVM_SVN_REVISION +#endif + #define SCUMMVM_VERSION "@VERSION@" SCUMMVM_SVN_REVISION diff --git a/configure b/configure index eeec7df204..d8d7ef8591 100755 --- a/configure +++ b/configure @@ -1042,7 +1042,9 @@ fi if test "$_release_build" = yes; then # Release mode enabled: enable optimizations. This also # makes it possible to use -Wuninitialized, so let's do that. - CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized" + # We will also add a define, which indicates we are doing + # an build for a release version. + CXXFLAGS="$CXXFLAGS -O2 -Wuninitialized -DRELEASE_BUILD" fi -- cgit v1.2.3 From 04ae0bcf585a397719f6b9e66e38f5efc17c2b0e Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 24 Jun 2010 22:36:21 +0000 Subject: Add German translation from patch tracker (patch #3020282). svn-id: r50247 --- common/messages.cpp | 320 +++++++++++- po/de_DE.po | 1420 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1737 insertions(+), 3 deletions(-) create mode 100644 po/de_DE.po diff --git a/common/messages.cpp b/common/messages.cpp index b33e2ab115..2d6aa510a3 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,7 +323,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, @@ -636,7 +636,7 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: fr\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\nX-Poedit-Language: French\nX-Poedit-Country: FRANCE\nX-Poedit-Basepath: /Users/criezy/Dev/scummvm/scummvm/trunk\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "Recherche d'un plugin supportant cet ID..." }, { 3, "D\351marrage de '%s'\n" }, @@ -942,7 +942,7 @@ static const PoMessageEntry _translation_fr_FR[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:22+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 17, "" }, { 19, "AdLib vezet :" }, { 20, "AdLib vezet :" }, @@ -997,6 +997,319 @@ static const PoMessageEntry _translation_hu_HU[] = { { -1, NULL } }; +static const PoMessageEntry _translation_de_DE[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 1, " M\366chten Sie wirklich beenden? " }, + { 2, " Suche nach einer Erweiterung, die diese Spielkennung unterst\374tzt..." }, + { 3, " Starte \"%s\"\n" }, + { 4, " (Aktiv)" }, + { 5, " (Spiel)" }, + { 6, " (Global)" }, + { 7, "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" }, + { 8, "%s ist eine ung\374ltige Spielkennung. Benutzen Sie die Option --list-games zum Anzeigen der unterst\374tzten Spielkennungen." }, + { 9, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, + { 10, ", \366ffentliches Verzeichnis nicht eingebunden" }, + { 11, "... l\344uft..." }, + { 12, "11 kHz" }, + { 13, "22 kHz" }, + { 14, "44 kHz" }, + { 15, "48 kHz" }, + { 16, "8 kHz" }, + { 17, "" }, + { 18, "\334ber ScummVM" }, + { 19, "AdLib-Emulator" }, + { 20, "AdLib-Emulator" }, + { 21, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, + { 22, "Spiel hinzuf\374gen..." }, + { 23, "Kantengl\344ttung (16bpp)" }, + { 24, "Seitenverh\344ltnis korrigieren" }, + { 25, "Zugewiesene Taste : %s" }, + { 26, "Zugewiesene Taste : keine" }, + { 27, "Audio" }, + { 28, "Autom. Speichern:" }, + { 29, "\334be~r~" }, + { 30, "Tasten zuweisen" }, + { 31, "Beides" }, + { 32, "Helligkeit:" }, + { 33, "C1Verf\374gbare Spiele-Engines:" }, + { 34, "C1Verwendete Funktionen:" }, + { 35, "C2(erstellt am" }, + { 36, "Abbrechen" }, + { 37, "Kann Datei nicht erstellen." }, + { 38, "Spieloptionen \344ndern" }, + { 39, "Globale ScummVM-Einstellungen bearbeiten" }, + { 40, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." }, + { 41, "Ausw\344hlen" }, + { 42, "Eine Aktion zum Zuweisen ausw\344hlen" }, + { 43, "Wert l\366schen" }, + { 44, "Schlie\337en" }, + { 45, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" }, + { 46, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." }, + { 47, "Aktueller Videomodus:" }, + { 48, "Zeiger runter" }, + { 49, "Zeiger nach links" }, + { 50, "Zeiger nach rechts" }, + { 51, "Zeiger hoch" }, + { 52, "DVD" }, + { 53, "DVD erfolgreich eingebunden" }, + { 54, "DVD nicht eingebunden" }, + { 55, "Datum: " }, + { 56, "Debugger" }, + { 57, "" }, + { 58, "L\366schen" }, + { 59, "Stromsparmodus abschalten" }, + { 60, "GFX ausgeschalten" }, + { 61, "%d neue Spiele gefunden..." }, + { 62, "%d neue Spiele gefunden." }, + { 63, "Anzeige" }, + { 64, "Tastatur anzeigen" }, + { 65, "Diesen Spielstand wirklich l\366schen?" }, + { 66, "M\366chten Sie wirklich diese Spielkonfiguration entfernen?" }, + { 67, "M\366chten Sie wirklich den PC nach Spielen durchsuchen? M\366glicherweise wird dabei eine gr\366\337ere Menge an Spielen hinzugef\374gt." }, + { 68, "M\366chten Sie ein Spiel laden oder speichern?" }, + { 69, "M\366chten Sie eine automatische Durchsuchung vornehmen?" }, + { 70, "M\366chten Sie beenden?" }, + { 71, "Doppelzeilen (kein Zeilensprungverfahren)" }, + { 72, "Runter" }, + { 73, "Roland-GS-Modus" }, + { 74, "Engine unterst\374tzt den Debug-Level \"%s\" nicht" }, + { 75, "English" }, + { 76, "Fehler beim Ausf\374hren des Spiels:" }, + { 77, "Fehler beim Einbinden der DVD" }, + { 78, "Extrapfad:" }, + { 79, "FM Towns" }, + { 80, "Fehler: Konnte kein Benutzeroberfl\344chen-Thema laden. Abbruch..." }, + { 81, "Schneller Modus" }, + { 82, "Freie Ansicht" }, + { 83, "Voller Name des Spiels" }, + { 84, "Vollbildmodus" }, + { 85, "GC-Pad-Beschleunigung:" }, + { 86, "GC-Pad-Empfindlichkeit:" }, + { 87, "GFX" }, + { 89, "GUI-Sprache:" }, + { 90, "GUI-Renderer:" }, + { 91, "Spiel" }, + { 92, "Spieldaten nicht gefunden" }, + { 93, "Spielkennung nicht unterst\374tzt" }, + { 94, "Spielpfad:" }, + { 95, "Hauptmen\374" }, + { 96, "Zu h\366herer Pfadebene wechseln" }, + { 97, "Pfad hoch" }, + { 98, "Grafik" }, + { 99, "Grafikmodus:" }, + { 100, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, + { 101, "Werkzeugleiste verbergen" }, + { 102, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, + { 103, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, + { 104, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, + { 105, "Horizontale Bildverkleinerung:" }, + { 106, "Kennung:" }, + { 107, "Netzwerk starten" }, + { 108, "Verg\366\337erung des oberen Bildschirms:" }, + { 109, "Netzwerk wird gestartet..." }, + { 110, "Netzwerk wird gestartet..." }, + { 111, "Eingabe" }, + { 112, "Ung\374ltiges Verzeichnis" }, + { 113, "Tasten zuordnen" }, + { 114, "Tastatur" }, + { 115, "Tasten-Layout:" }, + { 116, "Tasten" }, + { 117, "Sprache der ScummVM-Oberfl\344che" }, + { 118, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." }, + { 119, "Sprache:" }, + { 120, "Links" }, + { 121, "Linksklick" }, + { 122, "Laden" }, + { 123, "Spiel laden:" }, + { 124, "Spielstand f\374r ausgew\344hltes Spiel laden" }, + { 125, "MIDI" }, + { 126, "MIDI-Lautst\344rke:" }, + { 127, "MT-32-Emulation" }, + { 129, "Hauptbildschirm-Skalierung:" }, + { 130, "Zuweisen" }, + { 131, "Durchsuchen..." }, + { 132, "Men\374" }, + { 133, "Verschiedenes" }, + { 134, "AdLib-/MIDI-Modus" }, + { 135, "DVD einbinden" }, + { 136, "SMB einbinden" }, + { 137, "Mausklick" }, + { 138, "Multi-Funktion" }, + { 139, "Musiklautst\344rke:" }, + { 140, "Alles aus" }, + { 141, "Name:" }, + { 142, "Netzwerk ist aus." }, + { 143, "Netzwerk nicht gestartet (%d)" }, + { 144, "Netzwerk gestartet" }, + { 145, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, + { 146, "Niemals" }, + { 147, "Nein" }, + { 148, "Kein Datum gespeichert" }, + { 149, "Keine Musik" }, + { 150, "Keine Spielzeit gespeichert" }, + { 151, "Keine Zeit gespeichert" }, + { 152, "Keine" }, + { 153, "OK" }, + { 154, "OK" }, + { 155, "Ausgabefrequenz:" }, + { 156, "Globale MIDI-Einstellungen \374bergehen" }, + { 157, "Globale Audioeinstellungen \374bergehen" }, + { 158, "Globale Grafikeinstellungen \374bergehen" }, + { 159, "Globale Lautst\344rke-Einstellungen \374bergehen" }, + { 160, "Passwort:" }, + { 161, "Ung\374ltiges Verzeichnis" }, + { 162, "Pfad ist keine Datei." }, + { 163, "Verzeichnis existiert nicht." }, + { 164, "Pfade" }, + { 165, "Pause" }, + { 166, "Spiel ausw\344hlen:" }, + { 167, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, + { 168, "Plattform:" }, + { 169, "Spieldauer: " }, + { 170, "Bitte eine Aktion ausw\344hlen" }, + { 171, "Plugin-Pfad:" }, + { 173, "Taste dr\374cken, um sie zuzuweisen" }, + { 174, "Beenden" }, + { 175, "ScummVM beenden" }, + { 176, "Lese-Berechtigung nicht vorhanden" }, + { 177, "Lesefehler aufgetreten" }, + { 178, "Tasten neu zuweisen" }, + { 179, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, + { 180, "Rendermodus:" }, + { 181, "Rechts" }, + { 182, "Rechtsklick" }, + { 183, "Rechtsklick" }, + { 184, "Drehen" }, + { 185, "Effektlautst\344rke:" }, + { 186, "SMB" }, + { 187, "Speichern" }, + { 188, "Spielst\344nde:" }, + { 189, "Speicherpfad: " }, + { 190, "Speichern:" }, + { 191, "Suchlauf abgeschlossen!" }, + { 192, "%d Ordner durchsucht..." }, + { 193, "ScummVM-Hauptmen\374" }, + { 194, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, + { 195, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, + { 196, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, + { 197, "In Spieleliste suchen" }, + { 198, "Suchen:" }, + { 199, "SoundFont ausw\344hlen" }, + { 200, "Thema ausw\344hlen" }, + { 201, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, + { 202, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, + { 203, "Verzeichnis f\374r Oberfl\344chen-Themen" }, + { 204, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, + { 205, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, + { 206, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 207, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 208, "Verzeichnis mit Spieldateien ausw\344hlen" }, + { 209, "Empfindlichkeit" }, + { 210, "Server:" }, + { 211, "\326ffentliches Verzeichnis:" }, + { 212, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, + { 213, "Tastatur zeigen" }, + { 214, "Mauszeiger anzeigen" }, + { 215, "Untertitel anzeigen und Sprachausgabe aktivieren" }, + { 216, "Cursor zeigen/verbergen" }, + { 217, "\334berspringen" }, + { 218, "Zeile \374berspringen" }, + { 219, "Text \374berspringen" }, + { 220, "An Ecken anheften" }, + { 221, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, + { 222, "Ton ein/aus" }, + { 223, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, + { 224, "SoundFont:" }, + { 225, "Spr." }, + { 226, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, + { 227, "Lautst\344rke spezieller Soundeffekte" }, + { 228, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 230, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 231, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, + { 232, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, + { 233, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 234, "Legt fest, wo die Spielst\344nde abgelegt werden." }, + { 235, "Sprache" }, + { 236, "Sprachlautst\344rke:" }, + { 237, "Standard-Renderer (16bpp)" }, + { 238, "Ausgew\344hltes Spiel starten" }, + { 239, "Status:" }, + { 240, "Untert." }, + { 241, "Untertitel-Tempo:" }, + { 242, "Untertitel" }, + { 243, "Figur wechseln" }, + { 244, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, + { 245, "Text und Sprache:" }, + { 246, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, + { 247, "Themenpfad:" }, + { 248, "Thema:" }, + { 249, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, + { 250, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, + { 251, "Zeit: " }, + { 252, "Zeit\374berschreitung beim Starten des Netzwerks" }, + { 253, "Gehe zu X-Position" }, + { 254, "Gehe zu Y-Position" }, + { 255, "Touchpad-Modus ausgeschaltet." }, + { 256, "Touchpad-Modus aktiviert." }, + { 257, "Echte Roland-MT-32-Emulation" }, + { 258, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, + { 259, "Unbekannt" }, + { 260, "Unbekannter Fehler" }, + { 261, "DVD aush\344ngen" }, + { 262, "SMB aush\344ngen" }, + { 263, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, + { 264, "Farbmodus nicht unterst\374tzt" }, + { 265, "Unbenannt" }, + { 266, "Hoch" }, + { 267, "Benutzt MIDI und AdLib zur Sounderzeugung." }, + { 268, "Benutze den Trackpad-Style f\374r Maussteuerung" }, + { 269, "Gew\344hltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" }, + { 270, "Benutzername:" }, + { 271, "SDL-Treiber verwenden" }, + { 272, "Vertikale Bildverkleinerung:" }, + { 273, "Video" }, + { 274, "Virtuelle Tastatur" }, + { 275, "Lautst\344rke" }, + { 276, "Schreib-Berechtigung nicht vorhanden" }, + { 277, "Daten konnten nicht geschrieben werden." }, + { 278, "Ja" }, + { 279, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, + { 280, "Zone" }, + { 281, "Hineinzoomen" }, + { 282, "Herauszoomen" }, + { 283, "alle 10 Minuten" }, + { 284, "alle 15 Minuten" }, + { 285, "alle 30 Minuten" }, + { 286, "alle 5 Minuten" }, + { 287, "fehlgeschlagen\n" }, + { 288, "\334be~r~" }, + { 289, "Spiel ~h~inzuf\374gen..." }, + { 290, "~A~bbrechen" }, + { 291, "~S~chlie\337en" }, + { 292, "Spielo~p~tionen..." }, + { 293, "~H~ilfe" }, + { 294, "~K~ampfsteuerung f\374r Indiana Jones" }, + { 295, "~T~asten" }, + { 296, "~L~inke-Hand-Modus" }, + { 297, "~L~aden" }, + { 298, "~L~aden..." }, + { 299, "~W~eiter" }, + { 300, "~O~K" }, + { 301, "~O~ptionen" }, + { 302, "~O~ptionen" }, + { 303, "~Z~ur\374ck" }, + { 304, "~B~eenden" }, + { 305, "Spiel ~e~ntfernen" }, + { 306, "~F~ortsetzen" }, + { 307, "Zur Spiele~l~iste zur\374ckkehren" }, + { 308, "~S~peichern" }, + { 309, "~S~tarten" }, + { 310, "\334ber~g~\344nge aktiviert" }, + { 311, "~W~assereffekte aktiviert" }, + { 312, "~Z~ip-Modus aktiviert" }, + { -1, NULL } +}; + struct PoLangEntry { const char *lang; const char *charset; @@ -1007,6 +1320,7 @@ const PoLangEntry _translations[] = { { "ru_RU", "cp1251", _translation_ru_RU }, { "fr_FR", "iso-8859-1", _translation_fr_FR }, { "hu_HU", "cp1250", _translation_hu_HU }, + { "de_DE", "iso-8859-1", _translation_de_DE }, { NULL, NULL, NULL } }; diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100644 index 0000000000..283e3fa134 --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,1420 @@ +# LANGUAGE translation for ScummVM. +# Copyright (C) 2010 ScummVM Team +# This file is distributed under the same license as the ScummVM package. +# FIRST AUTHOR , 2010. +# +#: sound/null.cpp:35 +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-24 23:30+0100\n" +"PO-Revision-Date: 2010-06-23 19:30+0100\n" +"Last-Translator: \n" +"Language-Team: Lothar Serra Mari & Simon Sawatzki " +"\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: Deutsch\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: gui/about.cpp:96 +msgid "C2(built on " +msgstr "C2(erstellt am" + +#: gui/about.cpp:104 +msgid "C1Features compiled in:" +msgstr "C1Verwendete Funktionen:" + +#: gui/about.cpp:111 +msgid "C1Available engines:" +msgstr "C1Verfügbare Spiele-Engines:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Pfad hoch" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Zu höherer Pfadebene wechseln" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "Abbrechen" + +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Auswählen" + +#: gui/GuiManager.cpp:76 +msgid "Failed to load any GUI theme, aborting" +msgstr "Fehler: Konnte kein Benutzeroberflächen-Thema laden. Abbruch..." + +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "Schließen" + +#: gui/GuiManager.cpp:105 +msgid "Mouse click" +msgstr "Mausklick" + +#: gui/GuiManager.cpp:108 base/main.cpp:285 +msgid "Display keyboard" +msgstr "Tastatur anzeigen" + +#: gui/GuiManager.cpp:111 base/main.cpp:288 +msgid "Remap keys" +msgstr "Tasten neu zuweisen" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "Zuweisen" + +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "Aktion auswählen und \"Zuweisen\" klicken" + +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "Zugewiesene Taste : %s" + +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "Zugewiesene Taste : keine" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "Bitte eine Aktion auswählen" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "Taste drücken, um sie zuzuweisen" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "Eine Aktion zum Zuweisen auswählen" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Spiel" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "Kennung:" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Kurzer Spielname, um die Spielstände zuzuordnen und das Spiel von der " +"Kommandozeile aus starten zu können" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Name:" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Voller Name des Spiels" + +#: gui/launcher.cpp:181 +msgid "Language:" +msgstr "Sprache:" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des " +"Spiels in eine deutsche verwandeln." + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: sound/null.cpp:42 +msgid "" +msgstr "" + +#: gui/launcher.cpp:192 +msgid "Platform:" +msgstr "Plattform:" + +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" + +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +msgid "Graphics" +msgstr "Grafik" + +#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +msgid "GFX" +msgstr "GFX" + +#: gui/launcher.cpp:206 +msgid "Override global graphic settings" +msgstr "Globale Grafikeinstellungen übergehen" + +#: gui/launcher.cpp:213 gui/options.cpp:889 +msgid "Audio" +msgstr "Audio" + +#: gui/launcher.cpp:215 +msgid "Override global audio settings" +msgstr "Globale Audioeinstellungen übergehen" + +#: gui/launcher.cpp:223 gui/options.cpp:893 +msgid "Volume" +msgstr "Lautstärke" + +#: gui/launcher.cpp:225 +msgid "Override global volume settings" +msgstr "Globale Lautstärke-Einstellungen übergehen" + +#: gui/launcher.cpp:232 gui/options.cpp:901 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:234 +msgid "Override global MIDI settings" +msgstr "Globale MIDI-Einstellungen übergehen" + +#: gui/launcher.cpp:244 gui/options.cpp:907 +msgid "Paths" +msgstr "Pfade" + +#: gui/launcher.cpp:250 +msgid "Game Path:" +msgstr "Spielpfad:" + +#: gui/launcher.cpp:254 gui/options.cpp:920 +msgid "Extra Path:" +msgstr "Extrapfad:" + +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "Legt das Verzeichnis für zusätzliche Spieldateien fest." + +#: gui/launcher.cpp:258 +msgid "Save Path:" +msgstr "Spielstände:" + +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 +#: gui/options.cpp:915 +msgid "Specifies where your savegames are put" +msgstr "Legt fest, wo die Spielstände abgelegt werden." + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 +#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 +#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 +#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 +#: gui/options.cpp:1063 gui/options.cpp:1162 +msgid "None" +msgstr "Keine" + +#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "" + +#: gui/launcher.cpp:391 gui/options.cpp:1156 +msgid "Select SoundFont" +msgstr "SoundFont auswählen" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Verzeichnis mit Spieldateien auswählen" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Verzeichnis mit zusätzlichen Dateien auswählen" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Verzeichnis für Spielstände auswählen" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen." + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~B~eenden" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "ScummVM beenden" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "Übe~r~" + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "Über ScummVM" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~O~ptionen" + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "Globale ScummVM-Einstellungen bearbeiten" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "~S~tarten" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Ausgewähltes Spiel starten" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~L~aden..." + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "Spielstand für ausgewähltes Spiel laden" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "Spiel ~h~inzufügen..." + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "" +"Shift (Umschalttaste) gedrückt halten, um Verzeichnisse nach Spielen zu " +"durchsuchen" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "Spielo~p~tionen..." + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "Spieloptionen ändern" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "Spiel ~e~ntfernen" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "In Spieleliste suchen" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Suchen:" + +#: gui/launcher.cpp:529 gui/options.cpp:712 +msgid "Clear value" +msgstr "Wert löschen" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Spiel laden:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "Laden" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Möchten Sie wirklich den PC nach Spielen durchsuchen? Möglicherweise wird " +"dabei eine größere Menge an Spielen hinzugefügt." + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "Ja" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "Nein" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM kann das gewählte Verzeichnis nicht öffnen!" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM kann in dem gewählten Verzeichnis kein Spiel finden!" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Spiel auswählen:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Möchten Sie wirklich diese Spielkonfiguration entfernen?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "" +"Für dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterstützt." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM konnte keine Engine finden, um das Spiel zu starten!" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Durchsuchen..." + +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Spiel hinzufügen..." + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... läuft..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "Suchlauf abgeschlossen!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "%d neue Spiele gefunden." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "%d Ordner durchsucht..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "%d neue Spiele gefunden..." + +#: gui/options.cpp:78 +msgid "Never" +msgstr "Niemals" + +#: gui/options.cpp:78 +msgid "every 5 mins" +msgstr "alle 5 Minuten" + +#: gui/options.cpp:78 +msgid "every 10 mins" +msgstr "alle 10 Minuten" + +#: gui/options.cpp:78 +msgid "every 15 mins" +msgstr "alle 15 Minuten" + +#: gui/options.cpp:78 +msgid "every 30 mins" +msgstr "alle 30 Minuten" + +#: gui/options.cpp:80 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:80 +msgid "11kHz" +msgstr "11 kHz" + +#: gui/options.cpp:80 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:80 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:80 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:620 +msgid "Graphics mode:" +msgstr "Grafikmodus:" + +#: gui/options.cpp:631 +msgid "Render mode:" +msgstr "Rendermodus:" + +#: gui/options.cpp:631 gui/options.cpp:632 +msgid "Special dithering modes supported by some games" +msgstr "" +"Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." + +#: gui/options.cpp:641 +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +#: gui/options.cpp:644 +msgid "Aspect ratio correction" +msgstr "Seitenverhältnis korrigieren" + +#: gui/options.cpp:644 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" + +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "" + +#: gui/options.cpp:651 +#, fuzzy +msgid "Specifies preferred sound device or sound card emulator" +msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." + +#: gui/options.cpp:652 +msgid "Specifies output sound device or sound card emulator" +msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." + +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:656 +#, fuzzy +msgid "Specifies default sound device for General Midi output" +msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." + +#: gui/options.cpp:687 +msgid "AdLib emulator:" +msgstr "AdLib-Emulator" + +#: gui/options.cpp:687 gui/options.cpp:688 +msgid "AdLib is used for music in many games" +msgstr "AdLib wird für die Musik in vielen Spielen verwendet." + +#: gui/options.cpp:698 +msgid "Output rate:" +msgstr "Ausgabefrequenz:" + +#: gui/options.cpp:698 gui/options.cpp:699 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " +"nicht von jeder Soundkarte unterstützt." + +#: gui/options.cpp:710 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:710 gui/options.cpp:711 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "" +"SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." + +#: gui/options.cpp:715 +msgid "Mixed AdLib/MIDI mode" +msgstr "AdLib-/MIDI-Modus" + +#: gui/options.cpp:715 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." + +#: gui/options.cpp:718 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Echte Roland-MT-32-Emulation" + +#: gui/options.cpp:718 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" +"kompatiblen Soundkarte verbunden ist, verwenden möchten." + +#: gui/options.cpp:721 +msgid "Enable Roland GS Mode" +msgstr "Roland-GS-Modus" + +#: gui/options.cpp:721 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " +"aus." + +#: gui/options.cpp:724 +msgid "MIDI gain:" +msgstr "MIDI-Lautstärke:" + +#: gui/options.cpp:737 +msgid "Text and Speech:" +msgstr "Text und Sprache:" + +#: gui/options.cpp:742 gui/options.cpp:748 +msgid "Speech" +msgstr "Sprache" + +#: gui/options.cpp:743 gui/options.cpp:749 +msgid "Subtitles" +msgstr "Untertitel" + +#: gui/options.cpp:744 gui/options.cpp:750 +msgid "Both" +msgstr "Beides" + +#: gui/options.cpp:748 +msgid "Spch" +msgstr "Spr." + +#: gui/options.cpp:749 +msgid "Subs" +msgstr "Untert." + +#: gui/options.cpp:750 +msgid "Show subtitles and play speech" +msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" + +#: gui/options.cpp:754 +msgid "Subtitle speed:" +msgstr "Untertitel-Tempo:" + +#: gui/options.cpp:766 +msgid "Music volume:" +msgstr "Musiklautstärke:" + +#: gui/options.cpp:773 +msgid "Mute All" +msgstr "Alles aus" + +#: gui/options.cpp:776 +msgid "SFX volume:" +msgstr "Effektlautstärke:" + +#: gui/options.cpp:776 gui/options.cpp:777 +msgid "Special sound effects volume" +msgstr "Lautstärke spezieller Soundeffekte" + +#: gui/options.cpp:783 +msgid "Speech volume:" +msgstr "Sprachlautstärke:" + +#: gui/options.cpp:914 +msgid "Save Path: " +msgstr "Speicherpfad: " + +#: gui/options.cpp:917 +msgid "Theme Path:" +msgstr "Themenpfad:" + +#: gui/options.cpp:920 gui/options.cpp:921 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " +"fest." + +#: gui/options.cpp:924 +msgid "Plugins Path:" +msgstr "Plugin-Pfad:" + +#: gui/options.cpp:929 +msgid "Misc" +msgstr "Verschiedenes" + +#: gui/options.cpp:931 +msgid "Theme:" +msgstr "Thema:" + +#: gui/options.cpp:935 +msgid "GUI Renderer:" +msgstr "GUI-Renderer:" + +#: gui/options.cpp:941 +msgid "Autosave:" +msgstr "Autom. Speichern:" + +#: gui/options.cpp:949 +msgid "Keys" +msgstr "Tasten" + +#: gui/options.cpp:956 +msgid "GUI Language:" +msgstr "GUI-Sprache:" + +#: gui/options.cpp:956 +msgid "Language of ScummVM GUI" +msgstr "Sprache der ScummVM-Oberfläche" + +#: gui/options.cpp:961 +msgid "English" +msgstr "English" + +#: gui/options.cpp:1095 +msgid "You have to restart ScummVM to take the effect." +msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." + +#: gui/options.cpp:1108 +msgid "Select directory for savegames" +msgstr "Verzeichnis für Spielstände auswählen" + +#: gui/options.cpp:1115 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" +"In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " +"auswählen." + +#: gui/options.cpp:1124 +msgid "Select directory for GUI themes" +msgstr "Verzeichnis für Oberflächen-Themen" + +#: gui/options.cpp:1134 +msgid "Select directory for extra files" +msgstr "Verzeichnis für zusätzliche Dateien auswählen" + +#: gui/options.cpp:1145 +msgid "Select directory for plugins" +msgstr "Verzeichnis für Erweiterungen auswählen" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "Kein Datum gespeichert" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "Keine Zeit gespeichert" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "Keine Spielzeit gespeichert" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "Löschen" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Diesen Spielstand wirklich löschen?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Datum: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Zeit: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Spieldauer: " + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Unbenannt" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Thema auswählen" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "GFX ausgeschalten" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Standard-Renderer (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Kantenglättung (16bpp)" + +#: base/main.cpp:106 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "Gewähltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" + +#: base/main.cpp:107 +msgid " Looking for a plugin supporting this gameid... " +msgstr " Suche nach einer Erweiterung, die diese Spielkennung unterstützt..." + +#: base/main.cpp:111 +msgid "failed\n" +msgstr "fehlgeschlagen\n" + +#: base/main.cpp:112 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" +"%s ist eine ungültige Spielkennung. Benutzen Sie die Option --list-games zum " +"Anzeigen der unterstützten Spielkennungen." + +#: base/main.cpp:119 +#, c-format +msgid " Starting '%s'\n" +msgstr " Starte \"%s\"\n" + +#: base/main.cpp:148 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" + +#: base/main.cpp:205 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Engine unterstützt den Debug-Level \"%s\" nicht" + +#: base/main.cpp:273 +msgid "Menu" +msgstr "Menü" + +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "Überspringen" + +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "Pause" + +#: base/main.cpp:282 +msgid "Skip line" +msgstr "Zeile überspringen" + +#: base/main.cpp:404 +msgid "Error running game:" +msgstr "Fehler beim Ausführen des Spiels:" + +#: base/main.cpp:430 base/main.cpp:431 +msgid "Could not find any engine capable of running the selected game" +msgstr "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Ungültiges Verzeichnis" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "Spieldaten nicht gefunden" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "Spielkennung nicht unterstützt" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Farbmodus nicht unterstützt" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Lese-Berechtigung nicht vorhanden" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Schreib-Berechtigung nicht vorhanden" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "Verzeichnis existiert nicht." + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "Ungültiges Verzeichnis" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "Pfad ist keine Datei." + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Kann Datei nicht erstellen." + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Lesefehler aufgetreten" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Daten konnten nicht geschrieben werden." + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "Unbekannter Fehler" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "~F~ortsetzen" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~L~aden" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~S~peichern" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~O~ptionen" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~H~ilfe" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "Übe~r~" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "Zur Spiele~l~iste zurückkehren" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Speichern:" + +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Speichern" + +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~O~K" + +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "~A~bbrechen" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~T~asten" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~Z~urück" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~W~eiter" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~S~chließen" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "~Z~ip-Modus aktiviert" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "Über~g~änge aktiviert" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "~W~assereffekte aktiviert" + +#: sound/null.h:45 +msgid "No music" +msgstr "Keine Musik" + +#: sound/softsynth/mt32.cpp:327 +#, fuzzy +msgid "Initialising MT-32 Emulator" +msgstr "Netzwerk wird gestartet..." + +#: sound/softsynth/mt32.cpp:541 +#, fuzzy +msgid "MT-32 Emulator" +msgstr "MT-32-Emulation" + +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "AdLib-Emulator" + +#: sound/softsynth/ym2612.cpp:762 +#, fuzzy +msgid "FM Towns Emulator" +msgstr "FM Towns" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "Tasten-Layout:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr " (Aktiv)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr " (Global)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr " (Spiel)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "ScummVM-Hauptmenü" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "~L~inke-Hand-Modus" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "~K~ampfsteuerung für Indiana Jones" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "Mauszeiger anzeigen" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "An Ecken anheften" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "Gehe zu X-Position" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "Gehe zu Y-Position" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "Benutze den Trackpad-Style für Maussteuerung" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "Tippen für Linksklick, Doppeltippen für Rechtsklick" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "Empfindlichkeit" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "Vergößerung des oberen Bildschirms:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "Hauptbildschirm-Skalierung:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "Hardware-Skalierung (schnell, aber schlechte Qualität)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "Software-Skalierung (gute Qualität, aber langsamer)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "Nicht skalieren (Sie müssen nach links und nach rechts scrollen)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "Helligkeit:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "Hohe Audioqualität (lansamer) (erfordert Neustart)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "Stromsparmodus abschalten" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "Touchpad-Modus aktiviert." + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "Touchpad-Modus ausgeschaltet." + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "Hoch" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "Runter" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "Links" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "Rechts" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "Linksklick" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "Rechtsklick" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "Zone" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "Multi-Funktion" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "Figur wechseln" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "Text überspringen" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "Schneller Modus" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Beenden" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "Debugger" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "Hauptmenü" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "Virtuelle Tastatur" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "Tasten zuordnen" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "Möchten Sie beenden?" + +#: backends/platform/wii/options.cpp:47 +msgid "Ok" +msgstr "OK" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Video" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Aktueller Videomodus:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "Doppelzeilen (kein Zeilensprungverfahren)" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "Horizontale Bildverkleinerung:" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "Vertikale Bildverkleinerung:" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Eingabe" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "GC-Pad-Empfindlichkeit:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "GC-Pad-Beschleunigung:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "Status:" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Unbekannt" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "DVD einbinden" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "DVD aushängen" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Server:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "Öffentliches Verzeichnis:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Benutzername:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Passwort:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Netzwerk starten" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "SMB einbinden" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "SMB aushängen" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "DVD erfolgreich eingebunden" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "Fehler beim Einbinden der DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "DVD nicht eingebunden" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "Netzwerk gestartet, öffentliches Verzeichnis eingebunden" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "Netzwerk gestartet" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr ", Fehler beim Einbinden des öffentlichen Verzeichnisses" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr ", öffentliches Verzeichnis nicht eingebunden" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "Netzwerk ist aus." + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "Netzwerk wird gestartet..." + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "Zeitüberschreitung beim Starten des Netzwerks" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "Netzwerk nicht gestartet (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "Werkzeugleiste verbergen" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "Tastatur zeigen" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "Ton ein/aus" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "Rechtsklick" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "Cursor zeigen/verbergen" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "Freie Ansicht" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "Herauszoomen" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "Hineinzoomen" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "Tasten zuweisen" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "Zeiger hoch" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "Zeiger runter" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "Zeiger nach links" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "Zeiger nach rechts" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "Möchten Sie ein Spiel laden oder speichern?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr " Möchten Sie wirklich beenden? " + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "Tastatur" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "Drehen" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "SDL-Treiber verwenden" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "Anzeige" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "Möchten Sie eine automatische Durchsuchung vornehmen?" + +#~ msgid "Music driver:" +#~ msgstr "Musiktreiber" + +#~ msgid "Windows MIDI" +#~ msgstr "Windows MIDI" + +#~ msgid "ALSA" +#~ msgstr "ALSA" + +#~ msgid "Atari ST MIDI" +#~ msgstr "Atari ST MIDI" + +#~ msgid "SEQ" +#~ msgstr "SEQ" + +#~ msgid "DMedia" +#~ msgstr "DMedia" + +#~ msgid "CAMD" +#~ msgstr "CAMD" + +#~ msgid "CoreAudio" +#~ msgstr "CoreAudio" + +#~ msgid "CoreMIDI" +#~ msgstr "CoreMIDI" + +#~ msgid "Yamaha Pa1" +#~ msgstr "Yamaha Pa1" + +#~ msgid "Tapwave Zodiac" +#~ msgstr "Tapwave Zodiac" + +#~ msgid "FluidSynth" +#~ msgstr "FluidSynth" + +#~ msgid "AdLib" +#~ msgstr "AdLib" + +#~ msgid "PC Speaker" +#~ msgstr "PC-Lautsprecher" + +#~ msgid "IBM PCjr" +#~ msgstr "IBM PCjr" + +#~ msgid "Creative Music System" +#~ msgstr "Creative-Musik-System" + +#~ msgid "TiMidity" +#~ msgstr "TiMidity" -- cgit v1.2.3 From ff47de5cd1a3323466973a2fbff1815ec687754f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 24 Jun 2010 22:37:30 +0000 Subject: Add credits for the translations. svn-id: r50248 --- AUTHORS | 17 +++++++++++++++++ gui/credits.h | 17 +++++++++++++++++ tools/credits.pl | 19 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/AUTHORS b/AUTHORS index 28d71b3698..b6d0d62ec0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -318,6 +318,23 @@ Other contributions Chris Gray - (retired) Johannes Schickel + Translations + ------------ + Thierry Crozat - Translation Lead + + French: + Thierry Crozat + + German: + Simon Sawatzki + Lothar Serra Mari + + Hungarian: + Eugene Sandulenko + + Russian: + Eugene Sandulenko + Websites (design) ----------------- Dobo Balazs - Website design diff --git a/gui/credits.h b/gui/credits.h index 0df894a642..32709f7530 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -363,6 +363,23 @@ static const char *credits[] = { "C0""Johannes Schickel", "", "", +"C1""Translations", +"C0""Thierry Crozat", +"C2""Translation Lead", +"C1""French", +"C0""Thierry Crozat", +"", +"C1""German", +"C0""Simon Sawatzki", +"C0""Lothar Serra Mari", +"", +"C1""Hungarian", +"C0""Eugene Sandulenko", +"", +"C1""Russian", +"C0""Eugene Sandulenko", +"", +"", "C1""Websites (design)", "C0""Dob\363 Bal\341zs", "C2""Website design", diff --git a/tools/credits.pl b/tools/credits.pl index bff1251f7a..208602911e 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -854,6 +854,25 @@ begin_credits("Credits"); add_person("Johannes Schickel", "LordHoto", ""); end_section(); end_section(); + + begin_section("Translations"); + begin_persons(); + add_person("Thierry Crozat", "criezy", "Translation Lead"); + end_persons(); + begin_section("French"); + add_person("Thierry Crozat", "criezy", ""); + end_section(); + begin_section("German"); + add_person("Simon Sawatzki", "SimSaw", ""); + add_person("Lothar Serra Mari", "Lothar93", ""); + end_section(); + begin_section("Hungarian"); + add_person("Eugene Sandulenko", "sev", ""); + end_section(); + begin_section("Russian"); + add_person("Eugene Sandulenko", "sev", ""); + end_section(); + end_section(); begin_section("Websites (design)"); begin_persons(); -- cgit v1.2.3 From ff33acb132c3d7f15060e528c7ac4bf34321807e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 22:55:24 +0000 Subject: Fix build with --enable-release. svn-id: r50249 --- base/internal_version.h | 1 + base/internal_version.h.in | 1 + 2 files changed, 2 insertions(+) diff --git a/base/internal_version.h b/base/internal_version.h index 533348ace4..2e6b7a24ad 100644 --- a/base/internal_version.h +++ b/base/internal_version.h @@ -4,6 +4,7 @@ #ifdef RELEASE_BUILD #undef SCUMMVM_SVN_REVISION +#define SCUMMVM_SVN_REVISION #endif #define SCUMMVM_VERSION "1.2.0svn" SCUMMVM_SVN_REVISION diff --git a/base/internal_version.h.in b/base/internal_version.h.in index 0199b67d5c..4eecf90d87 100644 --- a/base/internal_version.h.in +++ b/base/internal_version.h.in @@ -4,6 +4,7 @@ #ifdef RELEASE_BUILD #undef SCUMMVM_SVN_REVISION +#define SCUMMVM_SVN_REVISION #endif #define SCUMMVM_VERSION "@VERSION@" SCUMMVM_SVN_REVISION -- cgit v1.2.3 From 1e29dc3641919ecca4589ba40df7789e6758c037 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 24 Jun 2010 22:55:44 +0000 Subject: Fixed use of uninitialized variable. svn-id: r50250 --- engines/cine/gfx.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index aa0330df84..1f747c5a01 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -837,14 +837,11 @@ void OSRenderer::savePalette(Common::OutSaveFile &fHandle) { */ void OSRenderer::restorePalette(Common::SeekableReadStream &fHandle, int version) { byte buf[kHighPalNumBytes]; - uint colorCount; - - if (version > 0) - colorCount = fHandle.readUint16LE(); + uint colorCount = (version > 0) ? fHandle.readUint16LE() : kHighPalNumBytes; fHandle.read(buf, kHighPalNumBytes); - if (colorCount == kHighPalNumBytes || version == 0) { + if (colorCount == kHighPalNumBytes) { // Load the active 256 color palette from file _activePal.load(buf, sizeof(buf), kHighPalFormat, kHighPalNumColors, CINE_LITTLE_ENDIAN); } else { -- cgit v1.2.3 From dfd8ecc55c143963612467e599f57b96cfc5b62f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 24 Jun 2010 22:56:32 +0000 Subject: Gives proper credits for the Hungarian translation. Also remembered to update the website credits this time (it was also missing the Android credits by the way). svn-id: r50251 --- AUTHORS | 2 +- gui/credits.h | 2 +- tools/credits.pl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index b6d0d62ec0..0278ff1050 100644 --- a/AUTHORS +++ b/AUTHORS @@ -330,7 +330,7 @@ Other contributions Lothar Serra Mari Hungarian: - Eugene Sandulenko + Alex Bevilacqua Russian: Eugene Sandulenko diff --git a/gui/credits.h b/gui/credits.h index 32709f7530..d5607f621e 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -374,7 +374,7 @@ static const char *credits[] = { "C0""Lothar Serra Mari", "", "C1""Hungarian", -"C0""Eugene Sandulenko", +"C0""Alex Bevilacqua", "", "C1""Russian", "C0""Eugene Sandulenko", diff --git a/tools/credits.pl b/tools/credits.pl index 208602911e..49b526c66b 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -867,7 +867,7 @@ begin_credits("Credits"); add_person("Lothar Serra Mari", "Lothar93", ""); end_section(); begin_section("Hungarian"); - add_person("Eugene Sandulenko", "sev", ""); + add_person("Alex Bevilacqua", "", ""); end_section(); begin_section("Russian"); add_person("Eugene Sandulenko", "sev", ""); -- cgit v1.2.3 From 550209d1e6468a575fa980144389eda64eddb730 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 09:57:37 +0000 Subject: Removed the game ID check for embedded priority in icon controls, and replaced it with a check for priority existence svn-id: r50260 --- engines/sci/engine/kgraphics.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 83637c61d0..756ac6ffcb 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -853,11 +853,8 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { loopNo = (l & 0x80) ? l - 256 : l; int c = readSelectorValue(s->_segMan, controlObject, SELECTOR(cel)); celNo = (c & 0x80) ? c - 256 : c; - // Game-specific: *ONLY* the jones EGA/VGA sierra interpreter contain code using priority selector - // ALL other games use a hardcoded -1 (madness!) - // We are detecting jones/talkie as "jones" as well, but the sierra interpreter of talkie doesnt have this - // "hack". Hopefully it wont cause regressions (the code causes regressions if used against kq5/floppy) - if (g_sci->getGameId() == "jones") + // Check if the control object specifies a priority selector (like in Jones) + if (lookupSelector(s->_segMan, controlObject, SELECTOR(priority), NULL, NULL) == kSelectorVariable) priority = readSelectorValue(s->_segMan, controlObject, SELECTOR(priority)); else priority = -1; -- cgit v1.2.3 From c6b0a5e8962297cfd808c708ff3e1022a875fd18 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 10:04:31 +0000 Subject: SCI: detect, if SCI1.1 game is merging or copying palette instead of using gameIds. Also prints method used, when using debug command "version" svn-id: r50261 --- engines/sci/console.cpp | 1 + engines/sci/graphics/palette.cpp | 121 +++++++++++++++++++-------------------- engines/sci/graphics/palette.h | 6 +- engines/sci/resource.cpp | 15 +++++ engines/sci/resource.h | 2 + engines/sci/sci.cpp | 11 +++- 6 files changed, 90 insertions(+), 66 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index cf87b34bba..b987450d3a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -436,6 +436,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) { DebugPrintf("Move count type: %s\n", (_engine->_features->handleMoveCount()) ? "increment" : "ignore"); DebugPrintf("SetCursor type: %s\n", getSciVersionDesc(_engine->_features->detectSetCursorType())); DebugPrintf("View type: %s\n", viewTypeDesc[g_sci->getResMan()->getViewType()]); + DebugPrintf("Uses palette merging: %s\n", g_sci->_gfxPalette->isMerging() ? "yes" : "no"); DebugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc()); DebugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc()); DebugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no"); diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 28edfae24b..9c64c21743 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -38,7 +38,7 @@ namespace Sci { -GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) +GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMerging) : _resMan(resMan), _screen(screen) { int16 color; @@ -59,7 +59,6 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) _sysPalette.colors[255].b = 255; _sysPaletteChanged = false; - _alwaysForceRealMerge = false; // Pseudo-WORKAROUND // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest 1 vga and all Nick's Picks @@ -67,14 +66,7 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging // If we use the copying over, we will get issues because some views have marked all colors as being used // and those will overwrite the current palette in that case - Common::String gameId = g_sci->getGameId(); - if (g_sci->isDemo()) { - if (gameId == "laurabow2" || gameId == "qfg3" || gameId == "ecoquest") - _alwaysForceRealMerge = true; - } else { - if (gameId == "pq1sci" || gameId == "cnick-sq" || gameId == "cnick-longbow" || gameId == "cnick-kq" || gameId == "cnick-laurabow" || gameId == "cnick-lsl") - _alwaysForceRealMerge = true; - } + _useMerging = useMerging; palVaryInit(); } @@ -82,6 +74,10 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) GfxPalette::~GfxPalette() { } +bool GfxPalette::isMerging() { + return _useMerging; +} + // meant to get called only once during init of engine void GfxPalette::setDefault() { if (_resMan->getViewType() == kViewEga) @@ -231,7 +227,14 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { uint32 systime = _sysPalette.timestamp; if (force || newPalette->timestamp != systime) { - _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); + // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes + // There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo) + if ((forceRealMerge) || (_useMerging)) + _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); + else + _sysPaletteChanged |= insert(newPalette, &_sysPalette); + + // Adjust timestamp on newPalette, so it wont get merged/inserted w/o need newPalette->timestamp = _sysPalette.timestamp; bool updatePalette = _sysPaletteChanged && _screen->_picNotValid == 0; @@ -265,6 +268,7 @@ bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { newPalette->mapping[i] = i; } } + // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls return paletteChanged; } @@ -273,59 +277,50 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { int i,j; bool paletteChanged = false; - if ((!forceRealMerge) && (!_alwaysForceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) { - // SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes - // There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo) - - // We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls - return insert(newPalette, &_sysPalette); - - } else { - // colors 0 (black) and 255 (white) are not affected by merging - for (i = 1 ; i < 255; i++) { - if (!newPalette->colors[i].used)// color is not used - so skip it - continue; - // forced palette merging or dest color is not used yet - if (force || (!_sysPalette.colors[i].used)) { - _sysPalette.colors[i].used = newPalette->colors[i].used; - if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { - _sysPalette.colors[i].r = newPalette->colors[i].r; - _sysPalette.colors[i].g = newPalette->colors[i].g; - _sysPalette.colors[i].b = newPalette->colors[i].b; - paletteChanged = true; - } - newPalette->mapping[i] = i; - continue; - } - // is the same color already at the same position? -> match it directly w/o lookup - // this fixes games like lsl1demo/sq5 where the same rgb color exists multiple times and where we would - // otherwise match the wrong one (which would result into the pixels affected (or not) by palette changes) - if ((_sysPalette.colors[i].r == newPalette->colors[i].r) && (_sysPalette.colors[i].g == newPalette->colors[i].g) && (_sysPalette.colors[i].b == newPalette->colors[i].b)) { - newPalette->mapping[i] = i; - continue; - } - // check if exact color could be matched - res = matchColor(newPalette->colors[i].r, newPalette->colors[i].g, newPalette->colors[i].b); - if (res & 0x8000) { // exact match was found - newPalette->mapping[i] = res & 0xFF; - continue; + // colors 0 (black) and 255 (white) are not affected by merging + for (i = 1 ; i < 255; i++) { + if (!newPalette->colors[i].used)// color is not used - so skip it + continue; + // forced palette merging or dest color is not used yet + if (force || (!_sysPalette.colors[i].used)) { + _sysPalette.colors[i].used = newPalette->colors[i].used; + if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) { + _sysPalette.colors[i].r = newPalette->colors[i].r; + _sysPalette.colors[i].g = newPalette->colors[i].g; + _sysPalette.colors[i].b = newPalette->colors[i].b; + paletteChanged = true; } - // no exact match - see if there is an unused color - for (j = 1; j < 256; j++) - if (!_sysPalette.colors[j].used) { - _sysPalette.colors[j].used = newPalette->colors[i].used; - _sysPalette.colors[j].r = newPalette->colors[i].r; - _sysPalette.colors[j].g = newPalette->colors[i].g; - _sysPalette.colors[j].b = newPalette->colors[i].b; - newPalette->mapping[i] = j; - paletteChanged = true; - break; - } - // if still no luck - set an approximate color - if (j == 256) { - newPalette->mapping[i] = res & 0xFF; - _sysPalette.colors[res & 0xFF].used |= 0x10; + newPalette->mapping[i] = i; + continue; + } + // is the same color already at the same position? -> match it directly w/o lookup + // this fixes games like lsl1demo/sq5 where the same rgb color exists multiple times and where we would + // otherwise match the wrong one (which would result into the pixels affected (or not) by palette changes) + if ((_sysPalette.colors[i].r == newPalette->colors[i].r) && (_sysPalette.colors[i].g == newPalette->colors[i].g) && (_sysPalette.colors[i].b == newPalette->colors[i].b)) { + newPalette->mapping[i] = i; + continue; + } + // check if exact color could be matched + res = matchColor(newPalette->colors[i].r, newPalette->colors[i].g, newPalette->colors[i].b); + if (res & 0x8000) { // exact match was found + newPalette->mapping[i] = res & 0xFF; + continue; + } + // no exact match - see if there is an unused color + for (j = 1; j < 256; j++) + if (!_sysPalette.colors[j].used) { + _sysPalette.colors[j].used = newPalette->colors[i].used; + _sysPalette.colors[j].r = newPalette->colors[i].r; + _sysPalette.colors[j].g = newPalette->colors[i].g; + _sysPalette.colors[j].b = newPalette->colors[i].b; + newPalette->mapping[i] = j; + paletteChanged = true; + break; } + // if still no luck - set an approximate color + if (j == 256) { + newPalette->mapping[i] = res & 0xFF; + _sysPalette.colors[res & 0xFF].used |= 0x10; } } @@ -337,7 +332,7 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { // This is called for SCI1.1, when kDrawPic got done. We update sysPalette timestamp this way for SCI1.1 and also load // target-palette, if palvary is active void GfxPalette::drewPicture(GuiResourceId pictureId) { - if (!_alwaysForceRealMerge) // Don't do this on inbetween SCI1.1 games + if (!_useMerging) // Don't do this on inbetween SCI1.1 games _sysPalette.timestamp++; if (_palVaryResourceId != -1) { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index e640d9b39d..1fa8c16d26 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -36,9 +36,11 @@ class Screen; */ class GfxPalette { public: - GfxPalette(ResourceManager *resMan, GfxScreen *screen); + GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMerging); ~GfxPalette(); + bool isMerging(); + void setDefault(); void createFromData(byte *data, int bytesLeft, Palette *paletteOut); bool setAmiga(); @@ -88,7 +90,7 @@ private: ResourceManager *_resMan; bool _sysPaletteChanged; - bool _alwaysForceRealMerge; + bool _useMerging; Common::Array _schedules; diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 718c675db1..2958ca1e3b 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1949,6 +1949,21 @@ bool ResourceManager::detectFontExtended() { return false; } +// detects, if SCI1.1 game uses palette merging or copying - this is supposed to only get used on SCI1.1 games +bool ResourceManager::detectForPaletteMergingForSci11() { + // Load palette 999 (default palette) + Resource *res = findResource(ResourceId(kResourceTypePalette, 999), false); + + if ((res) && (res->size > 30)) { + byte *data = res->data; + // Old palette format used in palette resource? -> it's merging + if ((data[0] == 0 && data[1] == 1) || (data[0] == 0 && data[1] == 0 && READ_LE_UINT16(data + 29) == 0)) + return true; + return false; + } + return false; +} + // Functions below are based on PD code by Brian Provinciano (SCI Studio) bool ResourceManager::hasOldScriptHeader() { Resource *res = findResource(ResourceId(kResourceTypeScript, 0), 0); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 591273b252..00197876d8 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -328,6 +328,8 @@ public: bool detectHires(); // Detects, if standard font of current game includes extended characters (>0x80) bool detectFontExtended(); + // Detects, if SCI1.1 game uses palette merging + bool detectForPaletteMergingForSci11(); /** * Finds the internal Sierra ID of the current game from script 0. diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index b8c541fc03..f2ea0e67af 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -224,7 +224,16 @@ Common::Error SciEngine::run() { if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) _gfxMacIconBar = new GfxMacIconBar(); - _gfxPalette = new GfxPalette(_resMan, _gfxScreen); + bool paletteMerging = true; + if (getSciVersion() >= SCI_VERSION_1_1) { + // there are some games that use inbetween SCI1.1 interpreter, so we have to detect if it's merging or copying + if (getSciVersion() == SCI_VERSION_1_1) + paletteMerging = _resMan->detectForPaletteMergingForSci11(); + else + paletteMerging = false; + } + + _gfxPalette = new GfxPalette(_resMan, _gfxScreen, paletteMerging); _gfxCache = new GfxCache(_resMan, _gfxScreen, _gfxPalette); _gfxCursor = new GfxCursor(_resMan, _gfxPalette, _gfxScreen); -- cgit v1.2.3 From 279da6ac48c1d68d724cbb46e560a7439be8a4d8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 12:15:36 +0000 Subject: Added workarounds for two issues which appear when throwing the water at Orat in SQ1, room 28 svn-id: r50262 --- engines/sci/engine/vm.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 87280d1f9b..5f59e5c547 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -931,6 +931,14 @@ void run_vm(EngineState *s, bool restoring) { case op_add: // 0x01 (01) r_temp = POP32(); + + // Happens in SQ1, room 28, when throwing the water at Orat + if (s->r_acc.segment == 0xFFFF) { + // WORKAROUND: init uninitialized variable to 0 + warning("op_add: attempt to write to uninitialized variable"); + s->r_acc = NULL_REG; + } + if (r_temp.segment || s->r_acc.segment) { reg_t r_ptr = NULL_REG; int offset; @@ -1051,6 +1059,11 @@ void run_vm(EngineState *s, bool restoring) { if (r_temp.segment != s->r_acc.segment) warning("[VM] Comparing pointers in different segments (%04x:%04x vs. %04x:%04x)", PRINT_REG(r_temp), PRINT_REG(s->r_acc)); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); + } else if (r_temp.segment && !s->r_acc.segment) { + // Happens in SQ1, room 28, when throwing the water at Orat + // WORKAROUND: return false + warning("[VM] op_gt_: comparison between a pointer and a number"); + s->r_acc = NULL_REG; } else s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) > (int16)/*acc*/); break; -- cgit v1.2.3 From 494a7fa8abc41915b70f37047149e23fa1980e25 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 12:43:43 +0000 Subject: Extended validate_read_var to check for parameters too, and fixed the uninitialized variable in SQ1 there svn-id: r50263 --- engines/sci/engine/vm.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 5f59e5c547..d9758650ea 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -197,12 +197,13 @@ struct UninitializedReadWorkaround { { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 { "sq4", 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller + { "sq1sci", 992, "CT", "init", 3, 0 }, // is used as cel number { NULL, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { if (validate_variable(r, stack_base, type, max, index, line)) { - if (type == VAR_TEMP && r[index].segment == 0xffff) { + if ((type == VAR_TEMP || type == VAR_PARAM) && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually EngineState *state = g_sci->getEngineState(); @@ -234,7 +235,8 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } workaround++; } - error("Uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); + Common::String varType = (type == VAR_TEMP) ? "temp" : "param"; + error("Uninitialized read for %s %d from method %s::%s (script %d)", varType.c_str(), index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); } return r[index]; } else @@ -931,14 +933,6 @@ void run_vm(EngineState *s, bool restoring) { case op_add: // 0x01 (01) r_temp = POP32(); - - // Happens in SQ1, room 28, when throwing the water at Orat - if (s->r_acc.segment == 0xFFFF) { - // WORKAROUND: init uninitialized variable to 0 - warning("op_add: attempt to write to uninitialized variable"); - s->r_acc = NULL_REG; - } - if (r_temp.segment || s->r_acc.segment) { reg_t r_ptr = NULL_REG; int offset; -- cgit v1.2.3 From df37aff35756e03e02b47ce3483b06679a662ce6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 14:50:10 +0000 Subject: Added the SCI2.1 kText kernel function (subop 0, kTextSize for now) svn-id: r50265 --- engines/sci/engine/kernel.cpp | 7 +++---- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel32.cpp | 13 +++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index c9b547e6f8..41a2d2dd2b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -357,6 +357,8 @@ static SciKernelFunction s_kernelFuncMap[] = { { "TextColors", kTextColors, ".*" }, { "TextFonts", kTextFonts, ".*" }, { "Portrait", kPortrait, ".*" }, + { "PalVary", kPalVary, "ii*" }, + { "AssertPalette", kAssertPalette, "i" }, { "Empty", kEmpty, ".*" }, #ifdef ENABLE_SCI32 @@ -389,13 +391,10 @@ static SciKernelFunction s_kernelFuncMap[] = { { "PlayVMD", kPlayVMD, ".*" }, { "IsOnMe", kIsOnMe, "iio.*" }, { "MulDiv", kMulDiv, "iii" }, + { "Text", kText, ".*" }, #endif - // its a stub, but its needed for Pharkas to work - { "PalVary", kPalVary, "ii*" }, - { "AssertPalette", kAssertPalette, "i" }, - #if 0 // Stub functions /*09*/ { "Show", kShow, "i" }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 802a2d5f0b..4333f6ef77 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -439,6 +439,7 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv); reg_t kInPolygon(EngineState *s, int argc, reg_t *argv); // SCI2.1 Kernel Functions +reg_t kText(EngineState *s, int argc, reg_t *argv); reg_t kSave(EngineState *s, int argc, reg_t *argv); reg_t kList(EngineState *s, int argc, reg_t *argv); reg_t kRobot(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index b317719252..93191947ba 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -511,6 +511,19 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } +reg_t kText(EngineState *s, int argc, reg_t *argv) { + switch (argv[0].toUint16()) { + case 0: + return kTextSize(s, argc - 1, argv + 1); + break; + default: + warning("kText(%d)", argv[0].toUint16()); + break; + } + + return s->r_acc; +} + reg_t kString(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 0: { // New -- cgit v1.2.3 From 2b43c3a668485a0a382d7c627b2fb281865e0cd4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 14:50:27 +0000 Subject: SCI: changes to the op GT workaround svn-id: r50266 --- engines/sci/engine/vm.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d9758650ea..a5cacf40b3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1054,10 +1054,11 @@ void run_vm(EngineState *s, bool restoring) { warning("[VM] Comparing pointers in different segments (%04x:%04x vs. %04x:%04x)", PRINT_REG(r_temp), PRINT_REG(s->r_acc)); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); } else if (r_temp.segment && !s->r_acc.segment) { + if (s->r_acc.offset >= 1000) + error("[VM] op_gt: comparsion between a pointer and number"); + // Pseudo-WORKAROUND: sierra allows any pointer <-> value comparsion // Happens in SQ1, room 28, when throwing the water at Orat - // WORKAROUND: return false - warning("[VM] op_gt_: comparison between a pointer and a number"); - s->r_acc = NULL_REG; + s->r_acc = SIGNAL_REG; } else s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) > (int16)/*acc*/); break; @@ -1110,7 +1111,7 @@ void run_vm(EngineState *s, bool restoring) { // It works because in those games, the maximum resource number is 999, // so any parameter value above that threshold must be a pointer. if (r_temp.segment && (s->r_acc == make_reg(0, 1000))) - s->r_acc = make_reg(0, 1); + s->r_acc = SIGNAL_REG; else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); else -- cgit v1.2.3 From 159958fbe233c1b58b4df4cd3fcacffd9d40f7c2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 15:06:00 +0000 Subject: Some more info on kText(), removed dead code svn-id: r50267 --- engines/sci/engine/kernel32.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 93191947ba..1773046308 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -515,8 +515,8 @@ reg_t kText(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 0: return kTextSize(s, argc - 1, argv + 1); - break; default: + // TODO: Other subops here too, perhaps kTextColors and kTextFonts warning("kText(%d)", argv[0].toUint16()); break; } -- cgit v1.2.3 From e55686590e2ca6a6e7eeca7a73def9dd3a0722c9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 15:28:24 +0000 Subject: Removed the checking of parameters again (it's wrong, as it happens after, instead of before) and restored the workaround for SQ1 in op_add again svn-id: r50268 --- engines/sci/engine/vm.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a5cacf40b3..fa97dcf718 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -197,13 +197,12 @@ struct UninitializedReadWorkaround { { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 { "sq4", 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller - { "sq1sci", 992, "CT", "init", 3, 0 }, // is used as cel number { NULL, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { if (validate_variable(r, stack_base, type, max, index, line)) { - if ((type == VAR_TEMP || type == VAR_PARAM) && r[index].segment == 0xffff) { + if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually EngineState *state = g_sci->getEngineState(); @@ -235,8 +234,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } workaround++; } - Common::String varType = (type == VAR_TEMP) ? "temp" : "param"; - error("Uninitialized read for %s %d from method %s::%s (script %d)", varType.c_str(), index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); + error("Uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); } return r[index]; } else @@ -933,6 +931,14 @@ void run_vm(EngineState *s, bool restoring) { case op_add: // 0x01 (01) r_temp = POP32(); + + // Happens in SQ1, room 28, when throwing the water at Orat + if (s->r_acc.segment == 0xFFFF) { + // WORKAROUND: init uninitialized variable to 0 + warning("op_add: attempt to write to uninitialized variable"); + s->r_acc = NULL_REG; + } + if (r_temp.segment || s->r_acc.segment) { reg_t r_ptr = NULL_REG; int offset; -- cgit v1.2.3 From 8ff6a709fbe72bbd2d1ac53623558a2ed0e6c2a6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 16:04:37 +0000 Subject: SCI: when writing to a temp, check for segment 0xFFFF and remove it. This fixes a false-positive uninitialized read error in room 44 sq1 svn-id: r50269 --- engines/sci/engine/vm.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index fa97dcf718..3295406745 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -273,6 +273,13 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i } } + // If we are writing an uninitialized value into a temp, we remove the uninitialized segment + // this happens at least in sq1/room 44 (slot-machine), because a send is missing parameters, then + // those parameters are taken from uninitialized stack and afterwards they are copied back into temps + // if we don't remove the segment, we would get false-positive uninitialized reads later + if (type == VAR_TEMP && value.segment == 0xffff) + value.segment = 0; + r[index] = value; } } -- cgit v1.2.3 From 7d4d58bab41249e9a29c42c0f2715ff5e1c1d6cc Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 25 Jun 2010 16:08:34 +0000 Subject: SCUMM: Set some more detection file sizes svn-id: r50270 --- engines/scumm/scumm-md5.h | 10 +++++----- tools/scumm-md5.txt | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index 8570f0c6a3..76045f42a2 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Tue Jun 22 16:01:03 2010 + This file was generated by the md5table tool on Tue Jun 22 19:42:27 2010 DO NOT EDIT MANUALLY! */ @@ -40,7 +40,7 @@ static const MD5Table md5table[] = { { "0a295b80f9a9edf818e8e161a0e83830", "freddi2", "HE 80", "", -1, Common::FR_FRA, Common::kPlatformUnknown }, { "0a41311d462b6639fc45297b9044bf16", "monkey", "No AdLib", "EGA", -1, Common::ES_ESP, Common::kPlatformAtariST }, { "0a6d7b81b850ed4a77811c60c9b5c555", "PuttTime", "HE 99", "Mini Game", -1, Common::EN_USA, Common::kPlatformWindows }, - { "0aa050f4ad79402fbe9c4f78fb8ac494", "loom", "PC-Engine", "", -1, Common::EN_ANY, Common::kPlatformPCEngine }, + { "0aa050f4ad79402fbe9c4f78fb8ac494", "loom", "PC-Engine", "", 6532, Common::EN_ANY, Common::kPlatformPCEngine }, { "0ab19be9e2a3f6938226638b2a3744fe", "PuttTime", "HE 100", "Demo", -1, Common::EN_USA, Common::kPlatformUnknown }, { "0ac41e2e3d2174e5a042a6b565328dba", "puttrace", "HE 98", "Demo", 13110, Common::EN_USA, Common::kPlatformUnknown }, { "0b3222aaa7efcf283eb621e0cefd26cc", "puttputt", "HE 60", "", -1, Common::RU_RUS, Common::kPlatformPC }, @@ -75,7 +75,7 @@ static const MD5Table md5table[] = { { "15e03ffbfeddb9c2aebc13dcb2a4a8f4", "monkey", "VGA", "VGA", 8357, Common::EN_ANY, Common::kPlatformPC }, { "15f588e887e857e8c56fe6ade4956168", "atlantis", "Floppy", "Floppy", -1, Common::ES_ESP, Common::kPlatformAmiga }, { "16542a7342a918bfe4ba512007d36c47", "FreddisFunShop", "HE 99L", "", -1, Common::EN_USA, Common::kPlatformUnknown }, - { "166553538ff320c69edafeee29525419", "samnmax", "", "CD", -1, Common::EN_ANY, Common::kPlatformMacintosh }, + { "166553538ff320c69edafeee29525419", "samnmax", "", "CD", 199195304, Common::EN_ANY, Common::kPlatformMacintosh }, { "16effd200aa6b8abe9c569c3e578814d", "freddi4", "HE 99", "Demo", -1, Common::NL_NLD, Common::kPlatformWindows }, { "179879b6e35c1ead0d93aab26db0951b", "fbear", "HE 70", "", 13381, Common::EN_ANY, Common::kPlatformWindows }, { "17b5d5e6af4ae89d62631641d66d5a05", "indy3", "VGA", "VGA", -1, Common::IT_ITA, Common::kPlatformPC }, @@ -413,7 +413,7 @@ static const MD5Table md5table[] = { { "9d7b67be003fea60be4dcbd193611936", "ft", "Demo", "Demo", 11164, Common::EN_ANY, Common::kPlatformMacintosh }, { "9dc02577bf50d4cfaf3de3fbac06fbe2", "puttmoon", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh }, { "9e5e0fb43bd22f4628719b7501adb717", "monkey", "No AdLib", "EGA", -1, Common::FR_FRA, Common::kPlatformAtariST }, - { "9fd66fb3b04703bd50da4356e4202558", "spyfox2", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh }, + { "9fd66fb3b04703bd50da4356e4202558", "spyfox2", "", "", 51295, Common::EN_ANY, Common::kPlatformMacintosh }, { "a00554c31d623fdb9fcb0f924b89b42b", "loom", "EGA", "EGA Demo", -1, Common::EN_ANY, Common::kPlatformPC }, { "a01fab4a64d47b96e2e58e6b0f825cc7", "monkey", "VGA", "VGA", 8347, Common::FR_FRA, Common::kPlatformPC }, { "a095616d2d23ccf43b8e257711202cba", "football2002", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, @@ -554,7 +554,7 @@ static const MD5Table md5table[] = { { "dbf4d59d70b826733f379f998354d350", "BluesBirthday", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "dcf0119a90451a7d6e0f1920931ba130", "freddi4", "HE 99", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows }, { "dd30a53035393baa5a5e222e716559af", "maniac", "V2", "V2", -1, Common::FR_FRA, Common::kPlatformAtariST }, - { "de4efb910210736813c9a1185384bace", "puttzoo", "HE 72", "Demo", -1, Common::EN_ANY, Common::kPlatformWindows }, + { "de4efb910210736813c9a1185384bace", "puttzoo", "HE 72", "Demo", 14337, Common::EN_ANY, Common::kPlatformWindows }, { "debe337f73d660e951ece7c1f1c81add", "zak", "V2", "V2", -1, Common::EN_ANY, Common::kPlatformPC }, { "defb8cb9ec4b0f91acfb6b61c6129ad9", "PuttTime", "HE 99", "", -1, Common::RU_RUS, Common::kPlatformWindows }, { "df03ee021aa9b81d90cab9c26da07614", "indy3", "EGA", "EGA", -1, Common::IT_ITA, Common::kPlatformAmiga }, diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt index 57294d2e61..3b97380638 100644 --- a/tools/scumm-md5.txt +++ b/tools/scumm-md5.txt @@ -175,7 +175,7 @@ loom Loom c5d10e190d4b4d59114b824f2fdbd00e 7540 en FM-TOWNS FM-TOWNS - - dhewg, Andrea Petrucci 31b8fda4c8c7413fa6b39997e776eba4 -1 jp FM-TOWNS FM-TOWNS - - khalek, Andrea Petrucci - 0aa050f4ad79402fbe9c4f78fb8ac494 -1 en PC-Engine PC-Engine - - Kirben + 0aa050f4ad79402fbe9c4f78fb8ac494 6532 en PC-Engine PC-Engine - - Kirben 79b05f628586837e7166e82b2279bb50 -1 jp PC-Engine PC-Engine - - clone2727 5a35e36fd777e9c37a49c5b2faca52f9 6108 en DOS EGA EGA Demo non-interactive Fingolfin @@ -326,7 +326,7 @@ samnmax Sam & Max Hit the Road 0f6f2e716ba896a44e5059bba1de7ca9 -1 it All? - CD - Andrea Petrucci 4ba7fb331296c283e73d8f5b2096e551 -1 es All? - CD - Andrea Petrucci d43352a805d78b5f4936c6d7779bf575 -1 ru DOS - CD - - 166553538ff320c69edafeee29525419 -1 en Mac - CD Mac bundle Joachim Eberhard + 166553538ff320c69edafeee29525419 199195304 en Mac - CD Mac bundle Joachim Eberhard 3a5d13675e9a23aedac0bac7730f0ac1 -1 fr Mac - CD Mac bundle ThierryFR c3196c5349e53e387aaff1533d95e53a -1 en DOS Floppy Demo - @@ -756,7 +756,7 @@ puttzoo Putt-Putt Saves the Zoo 3486ede0f904789267d4bcc5537a46d4 14337 en Mac - Demo - khalek d220d154aafbfa12bd6f3ab1b2dae420 -1 de Mac - Demo - Joachim Eberhard aa81aa6d5545ce172fdba81f2e2f9d36 -1 nl Windows - Demo - DarthBo - de4efb910210736813c9a1185384bace -1 en Windows HE 72 Demo - khalek + de4efb910210736813c9a1185384bace 14337 en Windows HE 72 Demo - khalek f3d55aea441e260e9e9c7d2a187097e0 14337 en Windows - Demo - khalek 65fa23d6884e8ca23d5d2406d70de7e8 -1 fr Windows - Demo - gist974 2a446817ffcabfef8716e0c456ecaf81 -1 de Windows - Demo - Joachim Eberhard @@ -835,7 +835,7 @@ spyfox2 SPY Fox 2: Some Assembly Required 90e2f0af4f779629695c6394a65bb702 -1 fr All - - - gist974, ThierryFR bc4700bc0e12879f6d25d14d6be6cfdd -1 de All - - - Joachim Eberhard cea91e3dd47f2518ea418e41611aa77f -1 ru All - - - sev - 9fd66fb3b04703bd50da4356e4202558 -1 en Mac - - - pix_climber + 9fd66fb3b04703bd50da4356e4202558 51295 en Mac - - - pix_climber 71fe97c3108678cf604f14abe342341b -1 nl Windows - - - adutchguy 1c792d28376d45e145cb916bca0400a2 -1 nl All - Demo - joostp -- cgit v1.2.3 From 1e9977a725ca24a2d31cac56b0587bae09ab5b3a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 25 Jun 2010 16:11:00 +0000 Subject: SCI: Restrict some 'error' exceptions to the places they occur; cleanup svn-id: r50271 --- engines/sci/engine/segment.cpp | 21 +++++++++++++++------ engines/sci/engine/static_selectors.cpp | 6 +++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 28cc03d175..6a564fcc57 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -464,10 +464,16 @@ SegmentRef LocalVariables::dereference(reg_t pointer) { if (ret.maxSize > 0) { ret.reg = &_locals[pointer.offset / 2]; } else { - // Happens in two places during the intro of LB2CD, both from kMemory(peek): - // - room 160: Heap 160 has 83 local variables (0-82), and the game asks for variables at indices 83 - 90 too - // - room 220: Heap 220 has 114 local variables (0-113), and the game asks for variables at indices 114-120 too - warning("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); + if ((g_sci->getEngineState()->currentRoomNumber() == 660 || g_sci->getEngineState()->currentRoomNumber() == 660) + && g_sci->getGameId() == "laurabow2") { + // Happens in two places during the intro of LB2CD, both from kMemory(peek): + // - room 160: Heap 160 has 83 local variables (0-82), and the game + // asks for variables at indices 83 - 90 too. + // - room 220: Heap 220 has 114 local variables (0-113), and the + // game asks for variables at indices 114-120 too. + } else { + error("LocalVariables::dereference: Offset at end or out of bounds %04x:%04x", PRINT_REG(pointer)); + } ret.reg = 0; } return ret; @@ -514,8 +520,11 @@ SegmentRef SystemStrings::dereference(reg_t pointer) { if (isValidOffset(pointer.offset)) ret.raw = (byte *)(_strings[pointer.offset]._value); else { - // This occurs in KQ5CD when interacting with certain objects - warning("SystemStrings::dereference(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(pointer)); + if (g_sci->getGameId() == "kq5") { + // This occurs in KQ5CD when interacting with certain objects + } else { + error("SystemStrings::dereference(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(pointer)); + } } return ret; diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index fcef04f6ad..12d61ed24a 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -150,10 +150,10 @@ Common::StringArray Kernel::checkStaticSelectorNames() { } for (const SelectorRemap *selectorRemap = sciSelectorRemap; selectorRemap->slot; ++selectorRemap) { - uint32 slot = selectorRemap->slot; - if (selectorRemap->slot >= names.size()) - names.resize(selectorRemap->slot + 1); if (getSciVersion() >= selectorRemap->minVersion && getSciVersion() <= selectorRemap->maxVersion) { + const uint32 slot = selectorRemap->slot; + if (slot >= names.size()) + names.resize(slot + 1); names[slot] = selectorRemap->name; } } -- cgit v1.2.3 From 23d384e6b88f4023b9150401a70a4efdf9bae018 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 25 Jun 2010 16:12:38 +0000 Subject: SCI: Remove SciEngine::getFlags() svn-id: r50272 --- engines/sci/sci.cpp | 6 +----- engines/sci/sci.h | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index f2ea0e67af..527c2d24ba 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -511,12 +511,8 @@ Common::Platform SciEngine::getPlatform() const { return _gameDescription->platform; } -uint32 SciEngine::getFlags() const { - return _gameDescription->flags; -} - bool SciEngine::isDemo() const { - return getFlags() & ADGF_DEMO; + return _gameDescription->flags & ADGF_DEMO; } Common::String SciEngine::getSavegameName(int nr) const { diff --git a/engines/sci/sci.h b/engines/sci/sci.h index ee51147a4e..68a62c5fcc 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -155,7 +155,6 @@ public: int getResourceVersion() const; Common::Language getLanguage() const; Common::Platform getPlatform() const; - uint32 getFlags() const; bool isDemo() const; inline ResourceManager *getResMan() const { return _resMan; } -- cgit v1.2.3 From 6ee82a20276d213a06d43ff731d197f5a92a09d7 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 25 Jun 2010 16:16:29 +0000 Subject: SCI: Introduce SciGameId enum svn-id: r50273 --- engines/sci/console.cpp | 2 +- engines/sci/detection.cpp | 92 ++++++++++++++++++++++++++++++--- engines/sci/engine/kernel.cpp | 4 +- engines/sci/engine/kgraphics.cpp | 2 +- engines/sci/engine/kmisc.cpp | 4 +- engines/sci/engine/kpathing.cpp | 4 +- engines/sci/engine/segment.cpp | 4 +- engines/sci/engine/static_selectors.cpp | 2 +- engines/sci/engine/vm.cpp | 28 +++++----- engines/sci/graphics/paint16.cpp | 2 +- engines/sci/graphics/picture.cpp | 4 +- engines/sci/graphics/ports.cpp | 32 +++++++++--- engines/sci/graphics/screen.cpp | 4 +- engines/sci/resource.h | 2 +- engines/sci/resource_audio.cpp | 32 ++++++++---- engines/sci/sci.cpp | 18 ++++--- engines/sci/sci.h | 76 +++++++++++++++++++++++++-- 17 files changed, 247 insertions(+), 65 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b987450d3a..e8cbb6cf0e 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -425,7 +425,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) { bool hasVocab997 = g_sci->getResMan()->testResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SELECTORS)) ? true : false; - DebugPrintf("Game ID: %s\n", _engine->getGameId().c_str()); + DebugPrintf("Game ID: %s\n", _engine->getGameIdStr()); DebugPrintf("Emulated interpreter version: %s\n", getSciVersionDesc(getSciVersion())); DebugPrintf("\n"); DebugPrintf("Detected features:\n"); diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 3b153d3dd1..0932cb3fdc 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -40,7 +40,7 @@ namespace Sci { // Titles of the games -static const PlainGameDescriptor SciGameTitles[] = { +static const PlainGameDescriptor s_sciGameTitles[] = { {"sci", "Sierra SCI Game"}, {"sci-fanmade", "Fanmade SCI Game"}, // === SCI0 games ========================================================= @@ -119,6 +119,80 @@ static const PlainGameDescriptor SciGameTitles[] = { {0, 0} }; +struct GameIdStrToEnum { + const char *gameidStr; + SciGameId gameidEnum; +}; + +static const GameIdStrToEnum s_gameIdStrToEnum[] = { + { "astrochicken", GID_ASTROCHICKEN }, + { "camelot", GID_CAMELOT }, + { "castlebrain", GID_CASTLEBRAIN }, + { "christmas1988", GID_CHRISTMAS1988 }, + { "christmas1990", GID_CHRISTMAS1990 }, + { "christmas1992", GID_CHRISTMAS1992 }, + { "cnick-kq", GID_CNICK_KQ }, + { "cnick-laurabow", GID_CNICK_LAURABOW }, + { "cnick-longbow", GID_CNICK_LONGBOW }, + { "cnick-lsl", GID_CNICK_LSL }, + { "cnick-sq", GID_CNICK_SQ }, + { "ecoquest", GID_ECOQUEST }, + { "ecoquest2", GID_ECOQUEST2 }, + { "fairytales", GID_FAIRYTALES }, + { "freddypharkas", GID_FREDDYPHARKAS }, + { "funseeker", GID_FUNSEEKER }, + { "gk1", GID_GK1 }, + { "gk2", GID_GK2 }, + { "hoyle1", GID_HOYLE1 }, + { "hoyle2", GID_HOYLE2 }, + { "hoyle3", GID_HOYLE3 }, + { "hoyle4", GID_HOYLE4 }, + { "iceman", GID_ICEMAN }, + { "islandbrain", GID_ISLANDBRAIN }, + { "jones", GID_JONES }, + { "kq1sci", GID_KQ1 }, + { "kq4sci", GID_KQ4 }, + { "kq5", GID_KQ5 }, + { "kq6", GID_KQ6 }, + { "kq7", GID_KQ7 }, + { "laurabow", GID_LAURABOW }, + { "laurabow2", GID_LAURABOW2 }, + { "lighthouse", GID_LIGHTHOUSE }, + { "longbow", GID_LONGBOW }, + { "lsl1sci", GID_LSL1 }, + { "lsl2", GID_LSL2 }, + { "lsl3", GID_LSL3 }, + { "lsl5", GID_LSL5 }, + { "lsl6", GID_LSL6 }, + { "lsl7", GID_LSL7 }, + { "mothergoose", GID_MOTHERGOOSE }, + { "msastrochicken", GID_MSASTROCHICKEN }, + { "pepper", GID_PEPPER }, + { "phantasmagoria", GID_PHANTASMAGORIA }, + { "phantasmagoria2", GID_PHANTASMAGORIA2 }, + { "pq1sci", GID_PQ1 }, + { "pq2", GID_PQ2 }, + { "pq3", GID_PQ3 }, + { "pq4", GID_PQ4 }, + { "pqswat", GID_PQSWAT }, + { "qfg1", GID_QFG1 }, + { "qfg2", GID_QFG2 }, + { "qfg3", GID_QFG3 }, + { "qfg4", GID_QFG4 }, + { "rama", GID_RAMA }, + { "sci-fanmade", GID_FANMADE }, // FIXME: Do we really need/want this? + { "shivers", GID_SHIVERS }, + { "shivers2", GID_SHIVERS2 }, + { "slater", GID_SLATER }, + { "sq1sci", GID_SQ1 }, + { "sq3", GID_SQ3 }, + { "sq4", GID_SQ4 }, + { "sq5", GID_SQ5 }, + { "sq6", GID_SQ6 }, + { "torin", GID_TORIN }, + { NULL, (SciGameId)-1 } +}; + struct OldNewIdTableEntry { const char *oldId; const char *newId; @@ -300,7 +374,7 @@ static const ADParams detectionParams = { // Number of bytes to compute MD5 sum for 5000, // List of all engine targets - SciGameTitles, + s_sciGameTitles, // Structure for autoupgrading obsolete targets 0, // Name of single gameid (optional) @@ -523,12 +597,16 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl return (const ADGameDescription *)&s_fallbackDesc; } -bool SciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const { - const ADGameDescription *desc = (const ADGameDescription *)gd; - - *engine = new SciEngine(syst, desc); +bool SciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { + const GameIdStrToEnum *g = s_gameIdStrToEnum; + for (; g->gameidStr; ++g) { + if (0 == strcmp(desc->gameid, g->gameidStr)) { + *engine = new SciEngine(syst, desc, g->gameidEnum); + return true; + } + } - return true; + return false; } bool SciMetaEngine::hasFeature(MetaEngineFeature f) const { diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 41a2d2dd2b..d6dcf650bc 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -745,7 +745,7 @@ void Kernel::setDefaultKernelNames() { // In SCI1.1, kSetSynonyms is an empty function _kernelNames[0x26] = "Empty"; - if (g_sci->getGameId() == "kq6") { + if (g_sci->getGameId() == GID_KQ6) { // In the Windows version of KQ6 CD, the empty kSetSynonyms // function has been replaced with kPortrait. In KQ6 Mac, // kPlayBack has been replaced by kShowMovie. @@ -753,7 +753,7 @@ void Kernel::setDefaultKernelNames() { _kernelNames[0x26] = "Portrait"; else if (g_sci->getPlatform() == Common::kPlatformMacintosh) _kernelNames[0x84] = "ShowMovie"; - } else if (g_sci->getGameId() == "qfg4" && g_sci->isDemo()) { + } else if (g_sci->getGameId() == GID_QFG4 && g_sci->isDemo()) { _kernelNames[0x7b] = "RemapColors"; // QFG4 Demo has this SCI2 function instead of StrSplit } diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 756ac6ffcb..b1cd1451d1 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -541,7 +541,7 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) { // WORKAROUND for a problem in LSL1VGA. This allows the casino door to be opened, // till the actual problem is found - if (s->currentRoomNumber() == 300 && g_sci->getGameId() == "lsl1sci") { + if (s->currentRoomNumber() == 300 && g_sci->getGameId() == GID_LSL1) { int top = readSelectorValue(s->_segMan, object, SELECTOR(brTop)); writeSelectorValue(s->_segMan, object, SELECTOR(brTop), top + 2); } diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 4dd7df1b52..f742734ad7 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -60,9 +60,9 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { // throttling resulting in having to do 1000 pushups or something. Another // way of handling this would be delaying incrementing of "machineSpeed" // selector. - if (g_sci->getGameId() == "lsl3" && s->currentRoomNumber() == 290) + if (g_sci->getGameId() == GID_LSL3 && s->currentRoomNumber() == 290) s->_throttleTrigger = true; - else if (g_sci->getGameId() == "iceman" && s->currentRoomNumber() == 27) { + else if (g_sci->getGameId() == GID_ICEMAN && s->currentRoomNumber() == 27) { s->_throttleTrigger = true; neededSleep = 60; } diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index ba6fb9bb6e..fdaae3e121 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1090,7 +1090,7 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) { // WORKAROUND: broken polygon in lsl1sci, room 350, after opening elevator // Polygon has 17 points but size is set to 19 - if ((size == 19) && g_sci->getGameId() == "lsl1sci") { + if ((size == 19) && g_sci->getGameId() == GID_LSL1) { if ((s->currentRoomNumber() == 350) && (read_point(segMan, points, 18) == Common::Point(108, 137))) { debug(1, "Applying fix for broken polygon in lsl1sci, room 350"); @@ -1212,7 +1212,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co // WORKAROUND LSL5 room 660. Priority glitch due to us choosing a different path // than SSCI. Happens when Patti walks to the control room. - if (g_sci->getGameId() == "lsl5" && (s->currentRoomNumber() == 660) && (Common::Point(67, 131) == *new_start) && (Common::Point(229, 101) == *new_end)) { + if (g_sci->getGameId() == GID_LSL5 && (s->currentRoomNumber() == 660) && (Common::Point(67, 131) == *new_start) && (Common::Point(229, 101) == *new_end)) { debug(1, "[avoidpath] Applying fix for priority problem in LSL5, room 660"); pf_s->_prependPoint = new_start; new_start = new Common::Point(77, 107); diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 6a564fcc57..0a39d950b0 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -465,7 +465,7 @@ SegmentRef LocalVariables::dereference(reg_t pointer) { ret.reg = &_locals[pointer.offset / 2]; } else { if ((g_sci->getEngineState()->currentRoomNumber() == 660 || g_sci->getEngineState()->currentRoomNumber() == 660) - && g_sci->getGameId() == "laurabow2") { + && g_sci->getGameId() == GID_LAURABOW2) { // Happens in two places during the intro of LB2CD, both from kMemory(peek): // - room 160: Heap 160 has 83 local variables (0-82), and the game // asks for variables at indices 83 - 90 too. @@ -520,7 +520,7 @@ SegmentRef SystemStrings::dereference(reg_t pointer) { if (isValidOffset(pointer.offset)) ret.raw = (byte *)(_strings[pointer.offset]._value); else { - if (g_sci->getGameId() == "kq5") { + if (g_sci->getGameId() == GID_KQ5) { // This occurs in KQ5CD when interacting with certain objects } else { error("SystemStrings::dereference(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(pointer)); diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 12d61ed24a..85089e74c8 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -158,7 +158,7 @@ Common::StringArray Kernel::checkStaticSelectorNames() { } } - if (g_sci->getGameId() == "hoyle4") { + if (g_sci->getGameId() == GID_HOYLE4) { // The demo of Hoyle 4 is one of the few demos with lip syncing and no selector vocabulary. // This needs two selectors, "syncTime" and "syncCue", which keep changing positions in each // game. Usually, games with speech and lip sync have a selector vocabulary, so we don't need diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 3295406745..3dad005bb2 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -169,7 +169,7 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in } else { // WORKAROUND: Mixed-Up Mother Goose tries to use an invalid parameter in Event::new(). // Just skip around it here so we don't error out in validate_arithmetic. - if (g_sci->getGameId() == "mothergoose" && getSciVersion() <= SCI_VERSION_1_1 && type == VAR_PARAM && index == 1) + if (g_sci->getGameId() == GID_MOTHERGOOSE && getSciVersion() <= SCI_VERSION_1_1 && type == VAR_PARAM && index == 1) return false; debugC(2, kDebugLevelVM, "%s", txt.c_str()); @@ -184,20 +184,22 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in } struct UninitializedReadWorkaround { - const char *gameId; + SciGameId gameId; int scriptNr; const char *objectName; const char *methodName; int index; uint16 newValue; -} static const uninitializedReadWorkarounds[] = { - { "laurabow2", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { "freddypharkas", 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { "lsl1sci", 720, "rm720", "init", 0, 0 }, // age check room - { "islandbrain", 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { "sq4", 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller - { NULL, -1, NULL, NULL, 0, 0 } +}; + +static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { + { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room + { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller + { (SciGameId)0, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -218,14 +220,14 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i Common::String curObjectName = state->_segMan->getObjectName(call.sendp); Common::String curMethodName; - Common::String gameId = g_sci->getGameId(); + const SciGameId gameId = g_sci->getGameId(); if (call.type == EXEC_STACK_TYPE_CALL) curMethodName = g_sci->getKernel()->getSelectorName(call.selector); // Search if this is a known uninitialized read const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; - while (workaround->gameId) { + while (workaround->objectName) { if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && workaround->objectName == curObjectName && workaround->methodName == curMethodName && workaround->index == index) { // Workaround found @@ -481,7 +483,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (!strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the // returnVal selector, which doesn't affect gameplay, thus don't diplay it - } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == "qfg1") { + } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == GID_QFG1) { // QFG1VGA has a script bug in the longSong object when invoking the // loop selector, which doesn't affect gameplay, thus don't diplay it } else { diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 4cf3cc16e5..c5b97ad216 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -524,7 +524,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { // 2 Dummy functions, longbow-demo is using those several times but sierra sci doesn't support them at all case SCI_DISPLAY_DUMMY1: case SCI_DISPLAY_DUMMY2: - if (!((g_sci->getGameId() == "longbow") && (g_sci->isDemo()))) + if (!((g_sci->getGameId() == GID_LONGBOW) && (g_sci->isDemo()))) error("Unknown kDisplay argument %X", displayArg); if (displayArg == SCI_DISPLAY_DUMMY2) { if (argc) { diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index b410fc47f1..7cd37b6f46 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -437,7 +437,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { memcpy(&EGApalettes[i], &vector_defaultEGApalette, sizeof(vector_defaultEGApalette)); memcpy(&EGApriority, &vector_defaultEGApriority, sizeof(vector_defaultEGApriority)); - if (g_sci->getGameId() == "iceman") { + if (g_sci->getGameId() == GID_ICEMAN) { // WORKAROUND: we remove certain visual&priority lines in underwater rooms of iceman, when not dithering the // picture. Normally those lines aren't shown, because they share the same color as the dithered // fill color combination. When not dithering, those lines would appear and get distracting. @@ -532,7 +532,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { // inside picture data for such games case PIC_OP_SET_PATTERN: if (_resourceType >= SCI_PICTURE_TYPE_SCI11) { - if (g_sci->getGameId() == "sq4") { + if (g_sci->getGameId() == GID_SQ4) { // WORKAROUND: For SQ4 / for some pictures handle this like a terminator // This picture includes garbage data, first a set pattern w/o parameter and then short pattern // I guess that garbage is a left over from the sq4-floppy (sci1) to sq4-cd (sci1.1) conversion diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index a9bf81f013..6e53ef44c4 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -55,7 +55,7 @@ GfxPorts::~GfxPorts() { } void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16) { - int16 offTop = 10; + int16 offTop; _usesOldGfxFunctions = usesOldGfxFunctions; _paint16 = paint16; @@ -84,15 +84,33 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te else _styleUser = SCI_WINDOWMGR_STYLE_USER | SCI_WINDOWMGR_STYLE_TRANSPARENT; - // Jones, Slater, Hoyle 3&4 and Crazy Nicks Laura Bow/Kings Quest were called with parameter -Nw 0 0 200 320. - // Mother Goose (SCI1) uses -Nw 0 0 159 262. The game will later use SetPort so we don't need to set the other fields. + // Jones, Slater, Hoyle 3&4 and Crazy Nicks Laura Bow/Kings Quest were + // called with parameter -Nw 0 0 200 320. + // Mother Goose (SCI1) uses -Nw 0 0 159 262. The game will later use + // SetPort so we don't need to set the other fields. // This actually meant not skipping the first 10 pixellines in windowMgrPort - Common::String gameId = g_sci->getGameId(); - if (gameId == "jones" || gameId == "slater" || gameId == "hoyle3" || gameId == "hoyle4" || gameId == "cnick-laurabow" || gameId == "cnick-kq" || (gameId == "mothergoose" && getSciVersion() == SCI_VERSION_1_EARLY)) + switch (g_sci->getGameId()) { + case GID_JONES: + case GID_SLATER: + case GID_HOYLE3: + case GID_HOYLE4: + case GID_CNICK_LAURABOW: + case GID_CNICK_KQ: offTop = 0; - // Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't also do this we will get not-fully-removed windows everywhere - if (gameId == "fairytales") + break; + case GID_MOTHERGOOSE: + if (getSciVersion() == SCI_VERSION_1_EARLY) + offTop = 0; + break; + case GID_FAIRYTALES: + // Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't + // also do this we will get not-fully-removed windows everywhere. offTop = 26; + break; + default: + offTop = 10; + break; + } openPort(_wmgrPort); setPort(_wmgrPort); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 82ff478da2..bcb86e2d6f 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -97,9 +97,9 @@ GfxScreen::GfxScreen(ResourceManager *resMan, int16 width, int16 height, int ups if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) { // For SCI1.1 Mac, we need to expand the screen to accommodate for // the icon bar. Of course, both KQ6 and QFG1 VGA differ in size. - if (g_sci->getGameId() == "kq6") + if (g_sci->getGameId() == GID_KQ6) initGraphics(_displayWidth, _displayHeight + 26, _displayWidth > 320); - else if (g_sci->getGameId() == "qfg1") + else if (g_sci->getGameId() == GID_QFG1) initGraphics(_displayWidth, _displayHeight + 20, _displayWidth > 320); else error("Unknown SCI1.1 Mac game"); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 00197876d8..584c61dbd6 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -323,7 +323,7 @@ public: * archive can be extracted in the extras directory, and the GM patches can be * applied per game, if applicable. */ - void addNewGMPatch(const Common::String &gameId); + void addNewGMPatch(SciGameId gameId); bool detectHires(); // Detects, if standard font of current game includes extended characters (>0x80) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 909f1d6480..8629fecfa7 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -143,27 +143,37 @@ bool Resource::loadFromAudioVolumeSCI1(Common::SeekableReadStream *file) { return true; } -void ResourceManager::addNewGMPatch(const Common::String &gameId) { +void ResourceManager::addNewGMPatch(SciGameId gameId) { Common::String gmPatchFile; - if (gameId == "ecoquest") + switch (gameId) { + case GID_ECOQUEST: gmPatchFile = "ECO1GM.PAT"; - else if (gameId == "hoyle3") - gmPatchFile = "HOY3GM.PAT"; - else if (gameId == "hoyle3") + break; + case GID_HOYLE3: gmPatchFile = "HOY3GM.PAT"; - else if (gameId == "lsl1sci") + break; + case GID_LSL1: gmPatchFile = "LL1_GM.PAT"; - else if (gameId == "lsl5") + break; + case GID_LSL5: gmPatchFile = "LL5_GM.PAT"; - else if (gameId == "longbow") + break; + case GID_LONGBOW: gmPatchFile = "ROBNGM.PAT"; - else if (gameId == "sq1sci") + break; + case GID_SQ1: gmPatchFile = "SQ1_GM.PAT"; - else if (gameId == "sq4") + break; + case GID_SQ4: gmPatchFile = "SQ4_GM.PAT"; - else if (gameId == "fairytales") + break; + case GID_FAIRYTALES: gmPatchFile = "TALEGM.PAT"; + break; + default: + break; + } if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { ResourceSource *psrcPatch = new PatchResourceSource(gmPatchFile); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 527c2d24ba..6decfc7c27 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -71,8 +71,8 @@ SciEngine *g_sci = 0; class GfxDriver; -SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) - : Engine(syst), _gameDescription(desc), _gameId(_gameDescription->gameid) { +SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gameId) + : Engine(syst), _gameDescription(desc), _gameId(gameId) { assert(g_sci == 0); g_sci = this; @@ -128,7 +128,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc) // Add the patches directory, except for KQ6CD; The patches folder in some versions of KQ6CD // is for the demo of Phantasmagoria, included in the disk - if (_gameId != "kq6") + if (_gameId != GID_KQ6) SearchMan.addSubDirectoryMatching(gameDataDir, "patches"); // resource patches } @@ -179,10 +179,10 @@ Common::Error SciEngine::run() { // gk1/floppy does support upscaled hires scriptswise, but doesn't actually have the hires content we need to limit // it to platform windows. if (getPlatform() == Common::kPlatformWindows) { - if (_gameId == "kq6") + if (_gameId == GID_KQ6) upscaledHires = GFX_SCREEN_UPSCALED_640x440; #ifdef ENABLE_SCI32 - if (_gameId == "gk1") + if (_gameId == GID_GK1) upscaledHires = GFX_SCREEN_UPSCALED_640x480; #endif } @@ -503,6 +503,10 @@ Console *SciEngine::getSciDebugger() { return _console; } +const char *SciEngine::getGameIdStr() const { + return _gameDescription->gameid; +} + Common::Language SciEngine::getLanguage() const { return _gameDescription->language; } @@ -524,12 +528,12 @@ Common::String SciEngine::getSavegamePattern() const { } Common::String SciEngine::getFilePrefix() const { - if (_gameId == "qfg2") { + if (_gameId == GID_QFG2) { // Quest for Glory 2 wants to read files from Quest for Glory 1 (EGA/VGA) to import character data if (_gamestate->currentRoomNumber() == 805) return "qfg1"; // TODO: Include import-room for qfg1vga - } else if (_gameId == "qfg3") { + } else if (_gameId == GID_QFG3) { // Quest for Glory 3 wants to read files from Quest for Glory 2 to import character data if (_gamestate->currentRoomNumber() == 54) return "qfg2"; diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 68a62c5fcc..f60aad67a7 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -104,6 +104,75 @@ enum kDebugLevels { kDebugLevelOnStartup = 1 << 23 }; +enum SciGameId { + GID_ASTROCHICKEN, + GID_CAMELOT, + GID_CASTLEBRAIN, + GID_CHRISTMAS1988, + GID_CHRISTMAS1990, + GID_CHRISTMAS1992, + GID_CNICK_KQ, + GID_CNICK_LAURABOW, + GID_CNICK_LONGBOW, + GID_CNICK_LSL, + GID_CNICK_SQ, + GID_ECOQUEST, + GID_ECOQUEST2, + GID_FAIRYTALES, + GID_FREDDYPHARKAS, + GID_FUNSEEKER, + GID_GK1, + GID_GK2, + GID_HOYLE1, + GID_HOYLE2, + GID_HOYLE3, + GID_HOYLE4, + GID_ICEMAN, + GID_ISLANDBRAIN, + GID_JONES, + GID_KQ1, + GID_KQ4, + GID_KQ5, + GID_KQ6, + GID_KQ7, + GID_LAURABOW, + GID_LAURABOW2, + GID_LIGHTHOUSE, + GID_LONGBOW, + GID_LSL1, + GID_LSL2, + GID_LSL3, + GID_LSL5, + GID_LSL6, + GID_LSL7, + GID_MOTHERGOOSE, + GID_MSASTROCHICKEN, + GID_PEPPER, + GID_PHANTASMAGORIA, + GID_PHANTASMAGORIA2, + GID_PQ1, + GID_PQ2, + GID_PQ3, + GID_PQ4, + GID_PQSWAT, + GID_QFG1, + GID_QFG2, + GID_QFG3, + GID_QFG4, + GID_RAMA, + GID_SHIVERS, + GID_SHIVERS2, + GID_SLATER, + GID_SQ1, + GID_SQ3, + GID_SQ4, + GID_SQ5, + GID_SQ6, + GID_TORIN, + + GID_FANMADE // FIXME: Do we really need/want this? +}; + /** SCI versions */ enum SciVersion { SCI_VERSION_NONE, @@ -136,7 +205,7 @@ enum kLanguage { class SciEngine : public Engine { friend class Console; public: - SciEngine(OSystem *syst, const ADGameDescription *desc); + SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gameId); ~SciEngine(); // Engine APIs @@ -151,7 +220,8 @@ public: bool canSaveGameStateCurrently(); void syncSoundSettings(); - const Common::String &getGameId() const { return _gameId; } + const SciGameId &getGameId() const { return _gameId; } + const char *getGameIdStr() const; int getResourceVersion() const; Common::Language getLanguage() const; Common::Platform getPlatform() const; @@ -264,7 +334,7 @@ private: void initStackBaseWithSelector(Selector selector); const ADGameDescription *_gameDescription; - const Common::String _gameId; + const SciGameId _gameId; ResourceManager *_resMan; /**< The resource manager */ EngineState *_gamestate; Kernel *_kernel; -- cgit v1.2.3 From b188fc14a2591e480c0fb4a16558ef0a2aacd3a3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 16:43:09 +0000 Subject: SCI: only send new volume to currently mapped channels, fixes assert in sq1 because setVolume is called on an object that's currently not playing. added fixme svn-id: r50274 --- engines/sci/sound/midiparser_sci.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 4766118f52..cb43f6c3a1 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -672,9 +672,11 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: - // sending volume change to all used channels + // sending volume change to all currently mapped channels + // FIXME?: maybe we should better store new volume if music isn't playing currently and adjust volume + // when playing for (int i = 0; i < 15; i++) - if (_channelUsed[i]) + if (_channelRemap[i] != -1) sendToDriver(0xB0 + i, 7, _volume); break; -- cgit v1.2.3 From ab19e874147da865aab63ee89c50ef21bb687613 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 16:54:03 +0000 Subject: Removed all of the non-validating code - there's no real point in removing script validations svn-id: r50275 --- engines/sci/engine/kernel.h | 1 - engines/sci/engine/vm.cpp | 37 ------------------------------------- 2 files changed, 38 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 4333f6ef77..a347e90d1a 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -94,7 +94,6 @@ struct SelectorCache; // from selector.h //@{ //#define DEBUG_PARSER // enable for parser debugging -//#define DISABLE_VALIDATIONS // enable to stop validation checks // ---- Kernel signatures ----------------------------------------------------- diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 3dad005bb2..2da414c9f9 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -95,8 +95,6 @@ static ExecStack *add_exec_stack_varselector(Common::List &execStack, // validation functionality -#ifndef DISABLE_VALIDATIONS - static reg_t &validate_property(Object *obj, int index) { // A static dummy reg_t, which we return if obj or index turn out to be // invalid. Note that we cannot just return NULL_REG, because client code @@ -286,19 +284,6 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i } } -#else -// Non-validating alternatives - -# define validate_stack_addr(s, sp) sp -# define validate_arithmetic(r) ((r).offset) -# define signed_validate_arithmetic(r) ((int16)(r).offset) -# define validate_variable(r, sb, t, m, i, l) -# define validate_read_var(r, sb, t, m, i, l, dv) ((r)[i]) -# define validate_write_var(r, sb, t, m, i, l, v, sm, k) ((r)[i] = (v)) -# define validate_property(o, p) ((o)->_variables[p]) - -#endif - #define READ_VAR(type, index, def) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, def) #define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); @@ -607,10 +592,6 @@ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t return &(execStack.back()); } -#ifdef DISABLE_VALIDATIONS -# define kernel_matches_signature(a, b, c, d) 1 -#endif - static reg_t pointer_add(EngineState *s, reg_t base, int offset) { SegmentObj *mobj = s->_segMan->getSegmentObj(base.segment); @@ -804,9 +785,7 @@ int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4]) void run_vm(EngineState *s, bool restoring) { assert(s); -#ifndef DISABLE_VALIDATIONS unsigned int code_buf_size = 0 ; // (Avoid spurious warning) -#endif int temp; int16 aux_acc; // Auxiliary 16 bit accumulator reg_t r_temp; // Temporary register @@ -857,9 +836,7 @@ void run_vm(EngineState *s, bool restoring) { // FIXME: Why does this happen? Are there leftover calls in the call stack? warning("Running on non-existant script in segment %x", s->xs->addr.pc.segment); code_buf = _fake_return_buffer; -#ifndef DISABLE_VALIDATIONS code_buf_size = 2; -#endif s->xs->addr.pc.offset = 1; scr = NULL; @@ -867,18 +844,14 @@ void run_vm(EngineState *s, bool restoring) { } else { obj = s->_segMan->getObject(s->xs->objp); code_buf = scr->_buf; -#ifndef DISABLE_VALIDATIONS code_buf_size = scr->getBufSize(); -#endif local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { // FIXME: Why does this happen? Is the script not loaded yet at this point? warning("Could not find local script from segment %x", s->xs->local_segment); local_script = NULL; s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; -#ifndef DISABLE_VALIDATIONS s->variablesMax[VAR_LOCAL] = 0; -#endif } else { s->variablesSegment[VAR_LOCAL] = local_script->_localsSegment; @@ -886,14 +859,12 @@ void run_vm(EngineState *s, bool restoring) { s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); else s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; -#ifndef DISABLE_VALIDATIONS if (local_script->_localsBlock) s->variablesMax[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); else s->variablesMax[VAR_LOCAL] = 0; s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; s->variablesMax[VAR_PARAM] = s->xs->argc + 1; -#endif } s->variables[VAR_TEMP] = s->xs->fp; s->variables[VAR_PARAM] = s->xs->variables_argp; @@ -915,7 +886,6 @@ void run_vm(EngineState *s, bool restoring) { con->onFrame(); } -#ifndef DISABLE_VALIDATIONS if (s->xs->sp < s->xs->fp) error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", PRINT_REG(*s->xs->sp), PRINT_REG(*s->xs->fp)); @@ -925,7 +895,6 @@ void run_vm(EngineState *s, bool restoring) { if (s->xs->addr.pc.offset >= code_buf_size) error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", s->xs->addr.pc.offset, code_buf_size); -#endif // Get opcode byte extOpcode; @@ -1517,12 +1486,10 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc.offset = s->xs->addr.pc.offset + opparams[0]; } -#ifndef DISABLE_VALIDATIONS if (s->r_acc.offset >= code_buf_size) { error("VM: lofsa operation overflowed: %04x:%04x beyond end" " of script (at %04x)\n", PRINT_REG(s->r_acc), code_buf_size); } -#endif break; case op_lofss: // 0x3a (58) @@ -1539,12 +1506,10 @@ void run_vm(EngineState *s, bool restoring) { r_temp.offset = s->xs->addr.pc.offset + opparams[0]; } -#ifndef DISABLE_VALIDATIONS if (r_temp.offset >= code_buf_size) { error("VM: lofss operation overflowed: %04x:%04x beyond end" " of script (at %04x)", PRINT_REG(r_temp), code_buf_size); } -#endif PUSH32(r_temp); break; @@ -1781,13 +1746,11 @@ void run_vm(EngineState *s, bool restoring) { if (s->_executionStackPosChanged) // Force initialization s->xs = xs_new; -//#ifndef DISABLE_VALIDATIONS if (s->xs != &(s->_executionStack.back())) { error("xs is stale (%p vs %p); last command was %02x", (void *)s->xs, (void *)&(s->_executionStack.back()), opcode); } -//#endif ++s->scriptStepCounter; } } -- cgit v1.2.3 From b6d1b3bc0b2c4e3edbc49a73cb629313eb84c889 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 17:13:47 +0000 Subject: Do not allow the VM to run on non-existent scripts (which shouldn't be happening anymore) svn-id: r50276 --- engines/sci/engine/vm.cpp | 61 +++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 2da414c9f9..068259224d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -826,50 +826,37 @@ void run_vm(EngineState *s, bool restoring) { return; // Stop processing if (s->_executionStackPosChanged) { - Script *scr; + Script *scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); + if (!scr) + error("No script in segment %d", s->xs->addr.pc.segment); s->xs = &(s->_executionStack.back()); s->_executionStackPosChanged = false; - scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); - if (!scr) { - // No script? Implicit return via fake instruction buffer - // FIXME: Why does this happen? Are there leftover calls in the call stack? - warning("Running on non-existant script in segment %x", s->xs->addr.pc.segment); - code_buf = _fake_return_buffer; - code_buf_size = 2; - s->xs->addr.pc.offset = 1; - - scr = NULL; - obj = NULL; + obj = s->_segMan->getObject(s->xs->objp); + code_buf = scr->_buf; + code_buf_size = scr->getBufSize(); + local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); + if (!local_script) { + // FIXME: Why does this happen? Is the script not loaded yet at this point? + warning("Could not find local script from segment %x", s->xs->local_segment); + local_script = NULL; + s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; + s->variablesMax[VAR_LOCAL] = 0; } else { - obj = s->_segMan->getObject(s->xs->objp); - code_buf = scr->_buf; - code_buf_size = scr->getBufSize(); - local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); - if (!local_script) { - // FIXME: Why does this happen? Is the script not loaded yet at this point? - warning("Could not find local script from segment %x", s->xs->local_segment); - local_script = NULL; + s->variablesSegment[VAR_LOCAL] = local_script->_localsSegment; + if (local_script->_localsBlock) + s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); + else s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; + if (local_script->_localsBlock) + s->variablesMax[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); + else s->variablesMax[VAR_LOCAL] = 0; - } else { - - s->variablesSegment[VAR_LOCAL] = local_script->_localsSegment; - if (local_script->_localsBlock) - s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = local_script->_localsBlock->_locals.begin(); - else - s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; - if (local_script->_localsBlock) - s->variablesMax[VAR_LOCAL] = local_script->_localsBlock->_locals.size(); - else - s->variablesMax[VAR_LOCAL] = 0; - s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; - s->variablesMax[VAR_PARAM] = s->xs->argc + 1; - } - s->variables[VAR_TEMP] = s->xs->fp; - s->variables[VAR_PARAM] = s->xs->variables_argp; + s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; + s->variablesMax[VAR_PARAM] = s->xs->argc + 1; } - + s->variables[VAR_TEMP] = s->xs->fp; + s->variables[VAR_PARAM] = s->xs->variables_argp; } if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) -- cgit v1.2.3 From aedc77f0bddcfcd11e465ee29c5fc66973ef9f9b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 17:25:00 +0000 Subject: When loading a game, stop all running VMs recursively, and also stop kAnimate's current recursion. This fixes the invalid execution stack frame in SQ1, when loading from the death screen after dying from the acid drops in Kerona. This should also fix the invalid hunk pointers, thus the warning about invalid hunk pointers has been turned into an error, as it shouldn't occur anymore svn-id: r50277 --- engines/sci/engine/seg_manager.cpp | 2 +- engines/sci/engine/vm.cpp | 5 +++++ engines/sci/graphics/animate.cpp | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index e011de67d9..d356c9a3fc 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -454,7 +454,7 @@ byte *SegManager::getHunkPointer(reg_t addr) { HunkTable *ht = (HunkTable *)getSegment(addr.segment, SEG_TYPE_HUNK); if (!ht || !ht->isValidEntry(addr.offset)) { - warning("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr)); + error("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr)); return NULL; } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 068259224d..f54cddc253 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1226,6 +1226,11 @@ void run_vm(EngineState *s, bool restoring) { xs_new = &(s->_executionStack.back()); s->_executionStackPosChanged = true; + + // If a game is being loaded, stop processing + if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) + return; // Stop processing + break; } diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 9018a6f62e..08ff3bfc80 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -98,6 +98,11 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { if (!(signal & kSignalFrozen)) { // Call .doit method of that object invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0); + + // If a game is being loaded, stop processing + if (_s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) + return true; // Stop processing + // Lookup node again, since the nodetable it was in may have been reallocated curNode = _s->_segMan->lookupNode(curAddress); } -- cgit v1.2.3 From 69694f361977d8ae1908957e5fb9d4ad242bbf98 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 17:59:48 +0000 Subject: SCI: changing workaround results for opcodes from signal_reg to make_reg(0, 1) svn-id: r50278 --- engines/sci/engine/vm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f54cddc253..9ebf8ca53d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1029,7 +1029,7 @@ void run_vm(EngineState *s, bool restoring) { error("[VM] op_gt: comparsion between a pointer and number"); // Pseudo-WORKAROUND: sierra allows any pointer <-> value comparsion // Happens in SQ1, room 28, when throwing the water at Orat - s->r_acc = SIGNAL_REG; + s->r_acc = make_reg(0, 1); } else s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) > (int16)/*acc*/); break; @@ -1082,7 +1082,7 @@ void run_vm(EngineState *s, bool restoring) { // It works because in those games, the maximum resource number is 999, // so any parameter value above that threshold must be a pointer. if (r_temp.segment && (s->r_acc == make_reg(0, 1000))) - s->r_acc = SIGNAL_REG; + s->r_acc = make_reg(0, 1); else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); else -- cgit v1.2.3 From 784f52a677aed3877b47371f6bbcb3e3ffa97393 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 17:59:49 +0000 Subject: Removed the getHunkPointer error - it's valid SCI behavior (e.g. when loading/quitting sometimes, since hunks are not saved). We check for valid hunk pointers anyway, so there's no reason for the warning/error svn-id: r50279 --- engines/sci/engine/seg_manager.cpp | 2 +- engines/sci/graphics/paint16.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index d356c9a3fc..3740e53339 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -454,7 +454,7 @@ byte *SegManager::getHunkPointer(reg_t addr) { HunkTable *ht = (HunkTable *)getSegment(addr.segment, SEG_TYPE_HUNK); if (!ht || !ht->isValidEntry(addr.offset)) { - error("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr)); + // Valid SCI behavior, e.g. when loading/quitting return NULL; } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index c5b97ad216..88fa467b3a 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -330,7 +330,8 @@ reg_t GfxPaint16::bitsSave(const Common::Rect &rect, byte screenMask) { memoryId = _segMan->allocateHunkEntry("SaveBits()", size); memoryPtr = _segMan->getHunkPointer(memoryId); - _screen->bitsSave(workerRect, screenMask, memoryPtr); + if (memoryPtr) + _screen->bitsSave(workerRect, screenMask, memoryPtr); return memoryId; } -- cgit v1.2.3 From be8a59666894364c04b127b7b97bfd6efdd08b35 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 25 Jun 2010 18:20:31 +0000 Subject: Add support for the third inventory case in Riven: you have the two journals but not the trap book (happens at the end of the game). svn-id: r50280 --- engines/mohawk/graphics.cpp | 22 +++++++++++-------- engines/mohawk/riven.cpp | 51 ++++++++++++++++++++++++++++++--------------- engines/mohawk/riven.h | 10 +++++---- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index 2ddfb47575..00de6dba11 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -607,19 +607,23 @@ void RivenGraphics::showInventory() { if (_vm->getFeatures() & GF_DEMO || _vm->getCurStack() == aspit) return; - // There are three books and three vars. However, there's only - // a possible two combinations. Either you have only Atrus' - // journal or you have all three books. - // bool hasAtrusBook = *_vm->matchVarToString("aatrusbook") != 0; + // There are three books and three vars. We have three different + // combinations. At the start you have just Atrus' journal. Later, + // you get Catherine's journal and the trap book. Near the end, + // you lose the trap book and have just the two journals. + bool hasCathBook = *_vm->matchVarToString("acathbook") != 0; - // bool hasTrapBook = *_vm->matchVarToString("atrapbook") != 0; + bool hasTrapBook = *_vm->matchVarToString("atrapbook") != 0; if (!hasCathBook) { - drawInventoryImage(101, g_atrusJournalRectSolo); + drawInventoryImage(101, g_atrusJournalRect1); + } else if (!hasTrapBook) { + drawInventoryImage(101, g_atrusJournalRect2); + drawInventoryImage(102, g_cathJournalRect2); } else { - drawInventoryImage(101, g_atrusJournalRect); - drawInventoryImage(102, g_cathJournalRect); - drawInventoryImage(100, g_trapBookRect); + drawInventoryImage(101, g_atrusJournalRect3); + drawInventoryImage(102, g_cathJournalRect3); + drawInventoryImage(100, g_trapBookRect3); } _vm->_system->updateScreen(); diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index fa7ffd7c45..1e7f006be1 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -37,10 +37,12 @@ namespace Mohawk { -Common::Rect *g_atrusJournalRectSolo; -Common::Rect *g_atrusJournalRect; -Common::Rect *g_cathJournalRect; -Common::Rect *g_trapBookRect; +Common::Rect *g_atrusJournalRect1; +Common::Rect *g_atrusJournalRect2; +Common::Rect *g_cathJournalRect2; +Common::Rect *g_atrusJournalRect3; +Common::Rect *g_cathJournalRect3; +Common::Rect *g_trapBookRect3; MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescription *gamedesc) : MohawkEngine(syst, gamedesc) { _showHotspots = false; @@ -58,10 +60,12 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio SearchMan.addSubDirectoryMatching(gameDataDir, "exe"); SearchMan.addSubDirectoryMatching(gameDataDir, "assets1"); - g_atrusJournalRectSolo = new Common::Rect(295, 402, 313, 426); - g_atrusJournalRect = new Common::Rect(222, 402, 240, 426); - g_cathJournalRect = new Common::Rect(291, 408, 311, 419); - g_trapBookRect = new Common::Rect(363, 396, 386, 432); + g_atrusJournalRect1 = new Common::Rect(295, 402, 313, 426); + g_atrusJournalRect2 = new Common::Rect(259, 402, 278, 426); + g_cathJournalRect2 = new Common::Rect(328, 408, 348, 419); + g_atrusJournalRect3 = new Common::Rect(222, 402, 240, 426); + g_cathJournalRect3 = new Common::Rect(291, 408, 311, 419); + g_trapBookRect3 = new Common::Rect(363, 396, 386, 432); } MohawkEngine_Riven::~MohawkEngine_Riven() { @@ -74,10 +78,12 @@ MohawkEngine_Riven::~MohawkEngine_Riven() { delete _loadDialog; delete _optionsDialog; delete _rnd; - delete g_atrusJournalRectSolo; - delete g_atrusJournalRect; - delete g_cathJournalRect; - delete g_trapBookRect; + delete g_atrusJournalRect1; + delete g_atrusJournalRect2; + delete g_cathJournalRect2; + delete g_atrusJournalRect3; + delete g_cathJournalRect3; + delete g_trapBookRect3; _cardData.scripts.clear(); } @@ -479,26 +485,37 @@ void MohawkEngine_Riven::checkInventoryClick() { *matchVarToString("returncardid") = _curCard; // See RivenGraphics::showInventory() for an explanation - // of why only this variable is used. + // of the variables' meanings. bool hasCathBook = *matchVarToString("acathbook") != 0; + bool hasTrapBook = *matchVarToString("atrapbook") != 0; // Go to the book if a hotspot contains the mouse if (!hasCathBook) { - if (g_atrusJournalRectSolo->contains(_mousePos)) { + if (g_atrusJournalRect1->contains(_mousePos)) { _gfx->hideInventory(); changeToStack(aspit); changeToCard(5); } + } else if (!hasTrapBook) { + if (g_atrusJournalRect2->contains(_mousePos)) { + _gfx->hideInventory(); + changeToStack(aspit); + changeToCard(5); + } else if (g_cathJournalRect2->contains(_mousePos)) { + _gfx->hideInventory(); + changeToStack(aspit); + changeToCard(6); + } } else { - if (g_atrusJournalRect->contains(_mousePos)) { + if (g_atrusJournalRect3->contains(_mousePos)) { _gfx->hideInventory(); changeToStack(aspit); changeToCard(5); - } else if (g_cathJournalRect->contains(_mousePos)) { + } else if (g_cathJournalRect3->contains(_mousePos)) { _gfx->hideInventory(); changeToStack(aspit); changeToCard(6); - } else if (g_trapBookRect->contains(_mousePos)) { + } else if (g_trapBookRect3->contains(_mousePos)) { _gfx->hideInventory(); changeToStack(aspit); changeToCard(7); diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index 11c3a4c0cb..5fe0de00e9 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -68,10 +68,12 @@ enum { // Rects for the inventory object positions (initialized in // MohawkEngine_Riven's constructor). -extern Common::Rect *g_atrusJournalRectSolo; -extern Common::Rect *g_atrusJournalRect; -extern Common::Rect *g_cathJournalRect; -extern Common::Rect *g_trapBookRect; +extern Common::Rect *g_atrusJournalRect1; +extern Common::Rect *g_atrusJournalRect2; +extern Common::Rect *g_cathJournalRect2; +extern Common::Rect *g_atrusJournalRect3; +extern Common::Rect *g_cathJournalRect3; +extern Common::Rect *g_trapBookRect3; struct RivenHotspot { uint16 blstID; -- cgit v1.2.3 From 3962f8ba59925ea3ffa5e27e738c2edc9434b74c Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 18:47:52 +0000 Subject: AUDIO: some fixes in the audio device code (no sound option, new GUIO flags) svn-id: r50281 --- common/util.cpp | 1 + common/util.h | 5 +++-- engines/gob/gob.cpp | 2 +- gui/options.cpp | 41 +++++++++++++++++++++-------------------- gui/options.h | 6 +++--- sound/mididrv.cpp | 23 +++++++++++++++++------ sound/mididrv.h | 32 ++++++++++++++++++-------------- sound/musicplugin.cpp | 2 -- sound/null.cpp | 7 +++++++ sound/null.h | 2 +- sound/softsynth/pcspk.cpp | 2 +- 11 files changed, 73 insertions(+), 50 deletions(-) diff --git a/common/util.cpp b/common/util.cpp index 70499a984f..b6f7bcd58f 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -305,6 +305,7 @@ const struct GameOpt { { GUIO_MIDIPCJR, "midiPCJr" }, { GUIO_MIDIADLIB, "midiAdLib" }, { GUIO_MIDITOWNS, "midiTowns" }, + { GUIO_MIDIPC98, "midiPC98" }, { GUIO_MIDIMT32, "midiMt32" }, { GUIO_MIDIGM, "midiGM" }, diff --git a/common/util.h b/common/util.h index d7d68cc1ca..823788ca04 100644 --- a/common/util.h +++ b/common/util.h @@ -224,8 +224,9 @@ enum GameGUIOption { GUIO_MIDIPCJR = (1 << 8), GUIO_MIDIADLIB = (1 << 9), GUIO_MIDITOWNS = (1 << 10), - GUIO_MIDIMT32 = (1 << 11), - GUIO_MIDIGM = (1 << 12) + GUIO_MIDIPC98 = (1 << 11), + GUIO_MIDIMT32 = (1 << 12), + GUIO_MIDIGM = (1 << 13) }; bool checkGameGUIOption(GameGUIOption option, const String &str); diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index fba616b166..ddeac25baa 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -346,7 +346,7 @@ void GobEngine::pauseGame() { bool GobEngine::initGameParts() { // just detect some devices some of which will be always there if the music is not disabled - _noMusic = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB) ? false : true; + _noMusic = MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB)) == MT_NULL ? true : false; _saveLoad = 0; _global = new Global(this); diff --git a/gui/options.cpp b/gui/options.cpp index 41a82ca89c..cd6eb73adb 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -136,18 +136,18 @@ void OptionsDialog::init() { } } -template bool prdEqualsDeviceProperty(MusicDevices::iterator d, T lookupProp, Common::MemFunc0 devicePropFunc) { +template bool equalsDeviceProperty(MusicDevices::iterator d, T lookupProp, Common::MemFunc0 devicePropFunc) { return lookupProp == devicePropFunc(&*d); } -bool prdMidiDefault(MusicDevices::iterator d, Common::String dom, bool, MusicPlugin::List::const_iterator&) { - return !(dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() == MT_TOWNS) ? true : false; +bool musicDeviceSkipSettingDefault(MusicDevices::iterator d, Common::String dom, MusicPlugin::List::const_iterator &m, uint32 guio) { + return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || (dom != Common::ConfigManager::kApplicationDomain && (!guio || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null" ? true : false; } -bool prdMidiSpec(MusicDevices::iterator d, Common::String, bool isAutoPlugin, MusicPlugin::List::const_iterator &m) { - if (isAutoPlugin) +bool musicDeviceSkipSettingSpec(MusicDevices::iterator d, Common::String, MusicPlugin::List::const_iterator &m, uint32) { + if (d->getMusicDriverId() == "auto") m++; - return ((d->getMusicType() >= MT_GM) || isAutoPlugin) ? true : false; + return ((d->getMusicType() >= MT_GM) || d->getMusicDriverId() == "auto") ? true : false; } void OptionsDialog::open() { @@ -208,21 +208,21 @@ void OptionsDialog::open() { } // Audio options - if (!loadMusicDeviceSetting(_midiPopUp, "music_driver", prdMidiDefault)) + if (!loadMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault)) _midiPopUp->setSelected(0); - if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", prdMidiSpec)) { + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec)) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_mt32DevicePopUp, "", prdMidiSpec, MT_MT32)) + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "", musicDeviceSkipSettingSpec, MT_MT32)) _mt32DevicePopUp->setSelected(0); } else { _mt32DevicePopUp->setSelected(0); } } - if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device", prdMidiSpec)) { + if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec)) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_gmDevicePopUp, "", prdMidiSpec, MT_GM)) + if (!loadMusicDeviceSetting(_gmDevicePopUp, "", musicDeviceSkipSettingSpec, MT_GM)) _gmDevicePopUp->setSelected(0); } else { _gmDevicePopUp->setSelected(0); @@ -364,9 +364,9 @@ void OptionsDialog::close() { } // Audio options - saveMusicDeviceSetting(_midiPopUp, "music_driver", prdMidiDefault); - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", prdMidiSpec); - saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", prdMidiSpec); + saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); if (_oplPopUp) { if (_enableAudioSettings) { @@ -667,7 +667,8 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || // global dialog - skip useless FM-Towns option there (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) || // No flags are specified - _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType()))) // flag is present + _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType())) // flag is present + || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device _midiPopUp->appendEntry(d->getCompleteName(), musicId++); if (d->getMusicType() >= MT_GM || m == p.begin()) { _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); @@ -790,7 +791,7 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _enableVolumeSettings = true; } -bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred, MusicType preferredType) { +bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc, MusicType preferredType) { if (!popup || !popup->isEnabled()) return true; @@ -801,11 +802,11 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; m++) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if ((setting.empty() && preferredType) ? prdEqualsDeviceProperty(d, preferredType, Common::mem_fun(&MusicDevice::getMusicType)) : prdEqualsDeviceProperty(d, drv, Common::mem_fun(&MusicDevice::getCompleteId))) { + if ((setting.empty()) ? equalsDeviceProperty(d, preferredType, Common::mem_fun(&MusicDevice::getMusicType)) : equalsDeviceProperty(d, drv, Common::mem_fun(&MusicDevice::getCompleteId))) { popup->setSelected(id); id = -1; break; - } else if (pred(d, _domain, m == p.begin(), m)) { + } else if (skipfunc(d, _domain, m, _guioptions)) { id++; } } @@ -820,7 +821,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se return true; } -void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred) { +void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc) { if (!popup || !_enableAudioSettings) return; @@ -834,7 +835,7 @@ void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String se ConfMan.set(setting, d->getCompleteId(), _domain); found = true; break; - } else if (pred(d, _domain, m == p.begin(), m)) { + } else if (skipfunc(d, _domain, m, _guioptions)) { id++; } } diff --git a/gui/options.h b/gui/options.h index 268b535e8a..baaf6471c9 100644 --- a/gui/options.h +++ b/gui/options.h @@ -79,9 +79,9 @@ protected: void setVolumeSettingsState(bool enabled); void setSubtitleSettingsState(bool enabled); - typedef bool (MidiSettingsExtraPred)(MusicDevices::iterator, Common::String, bool, MusicPlugin::List::const_iterator&); - bool loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred, MusicType preferredType = MT_NULL); - void saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MidiSettingsExtraPred pred); + typedef bool (MusicDeviceSkipFunc)(MusicDevices::iterator, Common::String, MusicPlugin::List::const_iterator&, uint32); + bool loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc, MusicType preferredType = MT_AUTO); + void saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc); TabWidget *_tabWidget; int _graphicsTabId; diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index d185626f62..0fa64e8b03 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -95,7 +95,7 @@ MusicType MidiDriver::getMusicType(MidiDriver::DeviceHandle handle) { } } - return MT_NULL; + return MT_AUTO; } Common::String MidiDriver::getDeviceString(DeviceHandle handle, DeviceStringType type) { @@ -139,6 +139,11 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { if (flags & MDT_PCJR) return hdl; break; + + case MT_CMS: + if (flags & MDT_CMS) + return hdl; + break; case MT_ADLIB: if (flags & MDT_ADLIB) @@ -150,14 +155,20 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { return hdl; break; + case MT_PC98: + if (flags & MDT_PC98) + return hdl; + break; + case MT_GM: case MT_GS: case MT_MT32: if (flags & MDT_MIDI) return hdl; + break; + case MT_NULL: - if (getDeviceString(hdl, MidiDriver::kDriverId).equals("null")) - return 0; + return hdl; default: break; @@ -172,7 +183,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { if ((flags & MDT_MIDI) && (l == 1)) { // If a preferred MT32 or GM device has been selected that device gets returned hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"), Common::ConfigManager::kApplicationDomain)); - if (getMusicType(hdl) != MT_NULL) { + if (getMusicType(hdl) != MT_AUTO) { if (flags & MDT_PREFER_MT32) // If we have a preferred MT32 device we disable the gm/mt32 mapping (more about this in mididrv.h) _forceTypeMT32 = true; @@ -203,7 +214,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { } } - MusicType tp = MT_NULL; + MusicType tp = MT_AUTO; if (flags & MDT_TOWNS) tp = MT_TOWNS; else if (flags & MDT_ADLIB) @@ -211,7 +222,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { else if (flags & MDT_PCSPK) tp = MT_PCSPK; else - tp = MT_NULL; + tp = MT_AUTO; for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); diff --git a/sound/mididrv.h b/sound/mididrv.h index ee8ef449f0..de3a38f87d 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -50,14 +50,17 @@ namespace Common { class String; } * Music types that music drivers can implement and engines can rely on. */ enum MusicType { - MT_NULL = 0, // Null / Auto - MT_PCSPK = 1, // PC Speaker - MT_PCJR = 2, // PCjr - MT_ADLIB = 3, // AdLib - MT_TOWNS = 4, // FM-TOWNS - MT_GM = 5, // General MIDI - MT_MT32 = 6, // MT-32 - MT_GS = 7 // Roland GS + MT_AUTO = 0, // Auto + MT_NULL, // Null + MT_PCSPK, // PC Speaker + MT_PCJR, // PCjr + MT_CMS, // CMS + MT_ADLIB, // AdLib + MT_TOWNS, // FM-TOWNS + MT_PC98, // PC98 + MT_GM, // General MIDI + MT_MT32, // MT-32 + MT_GS // Roland GS }; /** @@ -75,12 +78,13 @@ enum MidiDriverFlags { MDT_PCSPK = 1 << 0, // PC Speaker: Maps to MD_PCSPK and MD_PCJR MDT_CMS = 1 << 1, // Creative Music System / Gameblaster: Maps to MD_CMS MDT_PCJR = 1 << 2, // Tandy/PC Junior driver - MDT_ADLIB = 1 << 3, // AdLib: Maps to MD_ADLIB - MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MD_TOWNS - MDT_MIDI = 1 << 5, // Real MIDI - MDT_PREFER_MIDI = 1 << 6, // Real MIDI output is preferred - MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred - MDT_PREFER_GM = 1 << 8 // GM output is preferred + MDT_ADLIB = 1 << 3, // AdLib: Maps to MT_ADLIB + MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MT_TOWNS + MDT_PC98 = 1 << 5, // FM-TOWNS: Maps to MT_PC98 + MDT_MIDI = 1 << 6, // Real MIDI + MDT_PREFER_MIDI = 1 << 7, // Real MIDI output is preferred + MDT_PREFER_MT32 = 1 << 8, // MT-32 output is preferred + MDT_PREFER_GM = 1 << 9 // GM output is preferred }; /** diff --git a/sound/musicplugin.cpp b/sound/musicplugin.cpp index 7b5b6608ea..8078094616 100644 --- a/sound/musicplugin.cpp +++ b/sound/musicplugin.cpp @@ -60,7 +60,5 @@ Common::String MusicDevice::getCompleteId() { } MidiDriver::DeviceHandle MusicDevice::getHandle() { - if (_musicDriverId.equals("auto") || _musicDriverId.equals("null")) - return 0; return (MidiDriver::DeviceHandle)Common::hashit(getCompleteId().c_str()); } diff --git a/sound/null.cpp b/sound/null.cpp index c61add2c02..9be545ab76 100644 --- a/sound/null.cpp +++ b/sound/null.cpp @@ -45,8 +45,15 @@ public: const char *getId() const { return "auto"; } + MusicDevices getDevices() const; }; +MusicDevices AutoMusicPlugin::getDevices() const { + MusicDevices devices; + devices.push_back(MusicDevice(this, _s(""), MT_AUTO)); + return devices; +} + //#if PLUGIN_ENABLED_DYNAMIC(NULL) //REGISTER_PLUGIN_DYNAMIC(NULL, PLUGIN_TYPE_MUSIC, NullMusicPlugin); //#else diff --git a/sound/null.h b/sound/null.h index f8d0a91e2d..d9343701fa 100644 --- a/sound/null.h +++ b/sound/null.h @@ -53,4 +53,4 @@ public: Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; -#endif \ No newline at end of file +#endif diff --git a/sound/softsynth/pcspk.cpp b/sound/softsynth/pcspk.cpp index 8f66578a0b..fae2b7eef3 100644 --- a/sound/softsynth/pcspk.cpp +++ b/sound/softsynth/pcspk.cpp @@ -184,4 +184,4 @@ MusicDevices PCjrMusicPlugin::getDevices() const { //REGISTER_PLUGIN_DYNAMIC(PCJR, PLUGIN_TYPE_MUSIC, PCjrMusicPlugin); //#else REGISTER_PLUGIN_STATIC(PCJR, PLUGIN_TYPE_MUSIC, PCjrMusicPlugin); -//#endif \ No newline at end of file +//#endif -- cgit v1.2.3 From e34d7342f54ff5d23273eeec15fe5d4934492749 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 18:57:50 +0000 Subject: KYRA: implement new gui option flags svn-id: r50282 --- engines/kyra/detection_tables.h | 113 +++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 55 deletions(-) diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index 9f40cc3b1f..b73b4c09dc 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -56,6 +56,9 @@ namespace { #define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL) #define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) +#define EOB_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_EOB1) +#define EOB2_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_EOB2) + const KYRAGameDescription adGameDescs[] = { /* disable these targets until they get supported { @@ -66,7 +69,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_CMP_FLAGS }, @@ -79,7 +82,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_CMP_FLAGS }, @@ -93,7 +96,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -105,7 +108,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -117,7 +120,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -129,7 +132,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -141,7 +144,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -153,7 +156,7 @@ const KYRAGameDescription adGameDescs[] = { Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -165,7 +168,7 @@ const KYRAGameDescription adGameDescs[] = { Common::ES_ESP, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -177,7 +180,7 @@ const KYRAGameDescription adGameDescs[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_FLOPPY_FLAGS }, @@ -245,7 +248,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformFMTowns, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS }, KYRA1_TOWNS_FLAGS }, @@ -261,7 +264,7 @@ const KYRAGameDescription adGameDescs[] = { Common::JA_JPN, Common::kPlatformFMTowns, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS }, KYRA1_TOWNS_SJIS_FLAGS }, @@ -280,7 +283,7 @@ const KYRAGameDescription adGameDescs[] = { Common::JA_JPN, Common::kPlatformPC98, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98 }, KYRA1_TOWNS_SJIS_FLAGS }, @@ -293,7 +296,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_CD_FLAGS }, @@ -305,7 +308,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_CD_FLAGS }, @@ -317,7 +320,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_CD_FLAGS }, @@ -330,7 +333,7 @@ const KYRAGameDescription adGameDescs[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_CD_FLAGS }, @@ -392,7 +395,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_DEMO_FLAGS }, @@ -405,7 +408,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK }, KYRA1_DEMO_CD_FLAGS }, @@ -418,7 +421,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_CMP_FLAGS }, @@ -431,7 +434,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_CMP_FLAGS }, @@ -444,7 +447,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_FLAGS }, @@ -457,7 +460,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_FLAGS }, @@ -470,7 +473,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_FLAGS }, @@ -483,7 +486,7 @@ const KYRAGameDescription adGameDescs[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_FLOPPY_FLAGS }, @@ -496,7 +499,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FLAGS }, @@ -508,7 +511,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FLAGS }, @@ -520,7 +523,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FLAGS }, @@ -534,7 +537,7 @@ const KYRAGameDescription adGameDescs[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -546,7 +549,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -558,7 +561,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -571,7 +574,7 @@ const KYRAGameDescription adGameDescs[] = { Common::IT_ITA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -584,7 +587,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -597,7 +600,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_FAN_FLAGS(Common::IT_ITA, Common::EN_ANY) }, @@ -610,7 +613,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_DEMO_FLAGS }, @@ -623,7 +626,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_DEMO_FLAGS }, @@ -636,7 +639,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD | ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_CD_DEMO_FLAGS }, @@ -649,7 +652,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, KYRA2_DEMO_FLAGS }, @@ -662,7 +665,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformFMTowns, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS }, KYRA2_TOWNS_FLAGS }, @@ -674,7 +677,7 @@ const KYRAGameDescription adGameDescs[] = { Common::JA_JPN, Common::kPlatformFMTowns, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDITOWNS }, KYRA2_TOWNS_SJIS_FLAGS }, @@ -686,7 +689,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC98, ADGF_CD, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98 }, KYRA2_TOWNS_FLAGS }, @@ -698,7 +701,7 @@ const KYRAGameDescription adGameDescs[] = { Common::JA_JPN, Common::kPlatformPC98, ADGF_CD, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98 }, KYRA2_TOWNS_SJIS_FLAGS }, @@ -969,7 +972,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -986,7 +989,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -1003,7 +1006,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -1020,7 +1023,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -1037,7 +1040,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -1054,7 +1057,7 @@ const KYRAGameDescription adGameDescs[] = { Common::FR_FRA, Common::kPlatformPC, ADGF_DROPLANGUAGE | ADGF_CD, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_CD_FLAGS }, @@ -1070,7 +1073,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_FLOPPY_CMP_FLAGS }, @@ -1086,7 +1089,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_FLOPPY_CMP_FLAGS }, @@ -1103,7 +1106,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_FLOPPY_FLAGS }, @@ -1120,7 +1123,7 @@ const KYRAGameDescription adGameDescs[] = { Common::DE_DEU, Common::kPlatformPC, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_FLOPPY_FLAGS }, @@ -1137,7 +1140,7 @@ const KYRAGameDescription adGameDescs[] = { Common::JA_JPN, Common::kPlatformPC98, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIPC98 }, LOL_PC98_SJIS_FLAGS }, @@ -1154,7 +1157,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NONE + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_DEMO_FLAGS }, @@ -1170,7 +1173,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH + Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK }, LOL_KYRA2_DEMO_FLAGS }, -- cgit v1.2.3 From 6561b93f1e15e4b78bbf62044ea145e866978eeb Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 19:06:10 +0000 Subject: KYRA: fixed typo svn-id: r50283 --- engines/kyra/detection_tables.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index b73b4c09dc..390281c356 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -56,9 +56,6 @@ namespace { #define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL) #define LOL_KYRA2_DEMO_FLAGS FLAGS(true, false, false, false, false, false, false, Kyra::GI_KYRA2) -#define EOB_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_EOB1) -#define EOB2_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_EOB2) - const KYRAGameDescription adGameDescs[] = { /* disable these targets until they get supported { -- cgit v1.2.3 From 4785e1fd3ffe2dbe862e9aafcf18eb2a10602bc4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 25 Jun 2010 19:09:19 +0000 Subject: Renamed some variables svn-id: r50284 --- engines/sci/console.cpp | 14 ++--- engines/sci/console.h | 2 +- engines/sci/engine/klists.cpp | 122 ++++++++++++++++++------------------- engines/sci/engine/seg_manager.cpp | 6 +- 4 files changed, 72 insertions(+), 72 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e8cbb6cf0e..e50ae171c1 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2173,12 +2173,12 @@ bool Console::cmdViewReference(int argc, const char **argv) { case 0: break; case KSIG_LIST: { - List *l = _engine->_gamestate->_segMan->lookupList(reg); + List *list = _engine->_gamestate->_segMan->lookupList(reg); DebugPrintf("list\n"); - if (l) - printList(l); + if (list) + printList(list); else DebugPrintf("Invalid list.\n"); } @@ -3173,8 +3173,8 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV return 0; } -void Console::printList(List *l) { - reg_t pos = l->first; +void Console::printList(List *list) { + reg_t pos = list->first; reg_t my_prev = NULL_REG; DebugPrintf("\t<\n"); @@ -3201,9 +3201,9 @@ void Console::printList(List *l) { pos = node->succ; } - if (my_prev != l->last) + if (my_prev != list->last) DebugPrintf(" WARNING: Last node was expected to be %04x:%04x, was %04x:%04x!\n", - PRINT_REG(l->last), PRINT_REG(my_prev)); + PRINT_REG(list->last), PRINT_REG(my_prev)); DebugPrintf("\t>\n"); } diff --git a/engines/sci/console.h b/engines/sci/console.h index 5f3b0e3951..e353958a0d 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -147,7 +147,7 @@ private: bool cmdViewAccumulatorObject(int argc, const char **argv); bool segmentInfo(int nr); - void printList(List *l); + void printList(List *list); int printNode(reg_t addr); private: diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 1fd34849ea..eb5334c3b9 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -58,20 +58,20 @@ static bool isSaneNodePointer(SegManager *segMan, reg_t addr) { } static void checkListPointer(SegManager *segMan, reg_t addr) { - List *l = segMan->lookupList(addr); + List *list = segMan->lookupList(addr); - if (!l) { + if (!list) { warning("isSaneListPointer (list %04x:%04x): The requested list wasn't found", PRINT_REG(addr)); return; } - if (l->first.isNull() && l->last.isNull()) { + if (list->first.isNull() && list->last.isNull()) { // Empty list is fine - } else if (!l->first.isNull() && !l->last.isNull()) { + } else if (!list->first.isNull() && !list->last.isNull()) { // Normal list - Node *node_a = segMan->lookupNode(l->first); - Node *node_z = segMan->lookupNode(l->last); + Node *node_a = segMan->lookupNode(list->first); + Node *node_z = segMan->lookupNode(list->last); if (!node_a) { warning("isSaneListPointer (list %04x:%04x): missing first node", PRINT_REG(addr)); @@ -101,25 +101,25 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { return; } - isSaneNodePointer(segMan, l->first); + isSaneNodePointer(segMan, list->first); } else { // Not sane list... it's missing pointers to the first or last element - if (l->first.isNull()) + if (list->first.isNull()) warning("isSaneListPointer (list %04x:%04x): missing pointer to first element", PRINT_REG(addr)); - if (l->last.isNull()) + if (list->last.isNull()) warning("isSaneListPointer (list %04x:%04x): missing pointer to last element", PRINT_REG(addr)); } } reg_t kNewList(EngineState *s, int argc, reg_t *argv) { - reg_t listbase; - List *l = s->_segMan->allocateList(&listbase); - l->first = l->last = NULL_REG; - debugC(2, kDebugLevelNodes, "New listbase at %04x:%04x", PRINT_REG(listbase)); + reg_t listRef; + List *list = s->_segMan->allocateList(&listRef); + list->first = list->last = NULL_REG; + debugC(2, kDebugLevelNodes, "New listRef at %04x:%04x", PRINT_REG(listRef)); - return listbase; // Return list base address + return listRef; // Return list base address } reg_t kDisposeList(EngineState *s, int argc, reg_t *argv) { @@ -136,7 +136,7 @@ reg_t kNewNode(EngineState *s, int argc, reg_t *argv) { reg_t nodeKey = (argc == 2) ? argv[1] : argv[0]; s->r_acc = s->_segMan->newNode(nodeValue, nodeKey); - debugC(2, kDebugLevelNodes, "New nodebase at %04x:%04x", PRINT_REG(s->r_acc)); + debugC(2, kDebugLevelNodes, "New nodeRef at %04x:%04x", PRINT_REG(s->r_acc)); return s->r_acc; } @@ -145,11 +145,11 @@ reg_t kFirstNode(EngineState *s, int argc, reg_t *argv) { if (argv[0].isNull()) return NULL_REG; - List *l = s->_segMan->lookupList(argv[0]); + List *list = s->_segMan->lookupList(argv[0]); - if (l) { + if (list) { checkListPointer(s->_segMan, argv[0]); - return l->first; + return list->first; } else { return NULL_REG; } @@ -159,11 +159,11 @@ reg_t kLastNode(EngineState *s, int argc, reg_t *argv) { if (argv[0].isNull()) return NULL_REG; - List *l = s->_segMan->lookupList(argv[0]); + List *list = s->_segMan->lookupList(argv[0]); - if (l) { + if (list) { checkListPointer(s->_segMan, argv[0]); - return l->last; + return list->last; } else { return NULL_REG; } @@ -173,54 +173,56 @@ reg_t kEmptyList(EngineState *s, int argc, reg_t *argv) { if (argv[0].isNull()) return NULL_REG; - List *l = s->_segMan->lookupList(argv[0]); + List *list = s->_segMan->lookupList(argv[0]); checkListPointer(s->_segMan, argv[0]); - return make_reg(0, ((l) ? l->first.isNull() : 0)); + return make_reg(0, ((list) ? list->first.isNull() : 0)); } -static void _k_add_to_front(EngineState *s, reg_t listbase, reg_t nodebase) { - List *l = s->_segMan->lookupList(listbase); - Node *new_n = s->_segMan->lookupNode(nodebase); +static void _k_add_to_front(EngineState *s, reg_t listRef, reg_t nodeRef) { + List *list = s->_segMan->lookupList(listRef); + Node *newNode = s->_segMan->lookupNode(nodeRef); + + debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodeRef), PRINT_REG(listRef)); - debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); + if (!newNode) + error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodeRef), PRINT_REG(listRef)); + checkListPointer(s->_segMan, listRef); - if (!new_n) - error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); - checkListPointer(s->_segMan, listbase); + newNode->pred = NULL_REG; + newNode->succ = list->first; - new_n->succ = l->first; - new_n->pred = NULL_REG; // Set node to be the first and last node if it's the only node of the list - if (l->first.isNull()) - l->last = nodebase; + if (list->first.isNull()) + list->last = nodeRef; else { - Node *old_n = s->_segMan->lookupNode(l->first); - old_n->pred = nodebase; + Node *oldNode = s->_segMan->lookupNode(list->first); + oldNode->pred = nodeRef; } - l->first = nodebase; + list->first = nodeRef; } -static void _k_add_to_end(EngineState *s, reg_t listbase, reg_t nodebase) { - List *l = s->_segMan->lookupList(listbase); - Node *new_n = s->_segMan->lookupNode(nodebase); +static void _k_add_to_end(EngineState *s, reg_t listRef, reg_t nodeRef) { + List *list = s->_segMan->lookupList(listRef); + Node *newNode = s->_segMan->lookupNode(nodeRef); - debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); + debugC(2, kDebugLevelNodes, "Adding node %04x:%04x to end of list %04x:%04x", PRINT_REG(nodeRef), PRINT_REG(listRef)); - if (!new_n) - error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodebase), PRINT_REG(listbase)); - checkListPointer(s->_segMan, listbase); + if (!newNode) + error("Attempt to add non-node (%04x:%04x) to list at %04x:%04x", PRINT_REG(nodeRef), PRINT_REG(listRef)); + checkListPointer(s->_segMan, listRef); + + newNode->pred = list->last; + newNode->succ = NULL_REG; - new_n->succ = NULL_REG; - new_n->pred = l->last; // Set node to be the first and last node if it's the only node of the list - if (l->last.isNull()) - l->first = nodebase; + if (list->last.isNull()) + list->first = nodeRef; else { - Node *old_n = s->_segMan->lookupNode(l->last); - old_n->succ = nodebase; + Node *old_n = s->_segMan->lookupNode(list->last); + old_n->succ = nodeRef; } - l->last = nodebase; + list->last = nodeRef; } reg_t kNextNode(EngineState *s, int argc, reg_t *argv) { @@ -253,7 +255,7 @@ reg_t kAddToFront(EngineState *s, int argc, reg_t *argv) { } reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { - List *l = s->_segMan->lookupList(argv[0]); + List *list = s->_segMan->lookupList(argv[0]); Node *firstnode = argv[1].isNull() ? NULL : s->_segMan->lookupNode(argv[1]); Node *newnode = s->_segMan->lookupNode(argv[2]); @@ -281,7 +283,7 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { if (oldnext.isNull()) // Appended after last node? // Set new node as last list node - l->last = argv[2]; + list->last = argv[2]; else s->_segMan->lookupNode(oldnext)->pred = argv[2]; @@ -328,16 +330,16 @@ reg_t kFindKey(EngineState *s, int argc, reg_t *argv) { reg_t kDeleteKey(EngineState *s, int argc, reg_t *argv) { reg_t node_pos = kFindKey(s, 2, argv); Node *n; - List *l = s->_segMan->lookupList(argv[0]); + List *list = s->_segMan->lookupList(argv[0]); if (node_pos.isNull()) return NULL_REG; // Signal failure n = s->_segMan->lookupNode(node_pos); - if (l->first == node_pos) - l->first = n->succ; - if (l->last == node_pos) - l->last = n->pred; + if (list->first == node_pos) + list->first = n->succ; + if (list->last == node_pos) + list->last = n->pred; if (!n->pred.isNull()) s->_segMan->lookupNode(n->pred)->succ = n->succ; @@ -374,8 +376,6 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) { reg_t order_func = argv[2]; int input_size = (int16)readSelectorValue(segMan, source, SELECTOR(size)); - int i; - reg_t input_data = readSelector(segMan, source, SELECTOR(elements)); reg_t output_data = readSelector(segMan, dest, SELECTOR(elements)); @@ -398,7 +398,7 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) { sort_temp_t *temp_array = (sort_temp_t *)malloc(sizeof(sort_temp_t) * input_size); - i = 0; + int i = 0; while (node) { reg_t params[1] = { node->value }; invokeSelector(s, order_func, SELECTOR(doit), argc, argv, 1, params); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 3740e53339..9394e717ec 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -505,13 +505,13 @@ Node *SegManager::allocateNode(reg_t *addr) { } reg_t SegManager::newNode(reg_t value, reg_t key) { - reg_t nodebase; - Node *n = allocateNode(&nodebase); + reg_t nodeRef; + Node *n = allocateNode(&nodeRef); n->pred = n->succ = NULL_REG; n->key = key; n->value = value; - return nodebase; + return nodeRef; } List *SegManager::lookupList(reg_t addr) { -- cgit v1.2.3 From 784c655e82f2e1f80bda0a40005ed91754dff844 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 25 Jun 2010 19:30:01 +0000 Subject: Formatting fixes. svn-id: r50285 --- sound/mididrv.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/sound/mididrv.h b/sound/mididrv.h index de3a38f87d..4a52d2530c 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -50,17 +50,17 @@ namespace Common { class String; } * Music types that music drivers can implement and engines can rely on. */ enum MusicType { - MT_AUTO = 0, // Auto - MT_NULL, // Null - MT_PCSPK, // PC Speaker - MT_PCJR, // PCjr - MT_CMS, // CMS - MT_ADLIB, // AdLib - MT_TOWNS, // FM-TOWNS - MT_PC98, // PC98 - MT_GM, // General MIDI - MT_MT32, // MT-32 - MT_GS // Roland GS + MT_AUTO = 0, // Auto + MT_NULL, // Null + MT_PCSPK, // PC Speaker + MT_PCJR, // PCjr + MT_CMS, // CMS + MT_ADLIB, // AdLib + MT_TOWNS, // FM-TOWNS + MT_PC98, // PC98 + MT_GM, // General MIDI + MT_MT32, // MT-32 + MT_GS // Roland GS }; /** @@ -82,9 +82,9 @@ enum MidiDriverFlags { MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MT_TOWNS MDT_PC98 = 1 << 5, // FM-TOWNS: Maps to MT_PC98 MDT_MIDI = 1 << 6, // Real MIDI - MDT_PREFER_MIDI = 1 << 7, // Real MIDI output is preferred - MDT_PREFER_MT32 = 1 << 8, // MT-32 output is preferred - MDT_PREFER_GM = 1 << 9 // GM output is preferred + MDT_PREFER_MIDI = 1 << 7, // Real MIDI output is preferred + MDT_PREFER_MT32 = 1 << 8, // MT-32 output is preferred + MDT_PREFER_GM = 1 << 9 // GM output is preferred }; /** -- cgit v1.2.3 From 683d54a74660745d6bd408788170b19adb08581e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 20:46:08 +0000 Subject: SCI: adding workaround for uninitialized read in sq1 svn-id: r50287 --- engines/sci/engine/vm.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9ebf8ca53d..29def1765b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -191,13 +191,14 @@ struct UninitializedReadWorkaround { }; static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room - { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller - { (SciGameId)0, -1, NULL, NULL, 0, 0 } + { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room + { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { GID_SQ1, 703, "fromAirlock", "", 0, 0 }, // sub that's called from fromAirlock::changeState + { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller + { (SciGameId)0, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { -- cgit v1.2.3 From c35e3505319977e56d1c413b39133dfedf6c1105 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 20:51:57 +0000 Subject: AUDIO: get rid of MDT_PREFER_MIDI since it should be sufficient to either select MDT_PREFER_MT32 or MDT_PREFER_GM svn-id: r50288 --- engines/agos/agos.cpp | 2 +- engines/draci/draci.cpp | 2 +- engines/groovie/music.cpp | 4 ++-- engines/groovie/script.cpp | 2 +- engines/kyra/kyra_v1.cpp | 2 +- engines/lure/sound.cpp | 2 +- engines/m4/m4.cpp | 2 +- engines/made/made.cpp | 2 +- engines/parallaction/parallaction_br.cpp | 2 +- engines/parallaction/parallaction_ns.cpp | 2 +- engines/queen/music.cpp | 2 +- engines/saga/music.cpp | 2 +- engines/sci/engine/vm.cpp | 6 ++++++ engines/sci/sound/music.cpp | 2 +- engines/scumm/detection_tables.h | 20 ++++++++++---------- engines/sky/sky.cpp | 2 +- engines/tinsel/tinsel.cpp | 2 +- engines/touche/midi.cpp | 2 +- sound/mididrv.cpp | 4 ++-- sound/mididrv.h | 9 ++++----- 20 files changed, 39 insertions(+), 34 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 481c73dc5c..3ccf6fc18f 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -557,7 +557,7 @@ Common::Error AGOSEngine::init() { (getPlatform() == Common::kPlatformPC)) { // Setup midi driver - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | (getGameType() == GType_SIMON1 ? MDT_PREFER_MT32 : MDT_PREFER_GM)); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | (getGameType() == GType_SIMON1 ? MDT_PREFER_MT32 : MDT_PREFER_GM)); _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); _driver = MidiDriver::createMidi(dev); diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index 9e1e7033bb..a87e9a476d 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -127,7 +127,7 @@ int DraciEngine::init() { _dubbingArchive = new SoundArchive(dubbingPath, kDubbingFrequency); _sound = new Sound(_mixer); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 9b46af1483..f226ef3397 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -386,7 +386,7 @@ MusicPlayerXMI::MusicPlayerXMI(GroovieEngine *vm, const Common::String >lName) _midiParser = MidiParser::createParser_XMIDI(); // Create the driver - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = createMidi(dev); this->open(); @@ -682,7 +682,7 @@ MusicPlayerMac::MusicPlayerMac(GroovieEngine *vm) : MusicPlayerMidi(vm) { _midiParser = MidiParser::createParser_SMF(); // Create the driver - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = createMidi(dev); this->open(); diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 08df5e7a83..9fd7fa7d63 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -86,7 +86,7 @@ Script::Script(GroovieEngine *vm, EngineVersion version) : } // Initialize the music type variable - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); if (MidiDriver::getMusicType(dev) == MT_ADLIB) { // MIDI through AdLib setVariable(0x100, 0); diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 970851c127..be8f976053 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -106,7 +106,7 @@ Common::Error KyraEngine_v1::init() { if (!_flags.useDigSound) { // We prefer AdLib over MIDI, since generally AdLib is better supported - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI | MDT_PREFER_MT32); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32); if (_flags.platform == Common::kPlatformFMTowns) { if (_flags.gameID == GI_KYRA1) diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp index 1b306b5021..cd539dfab4 100644 --- a/engines/lure/sound.cpp +++ b/engines/lure/sound.cpp @@ -50,7 +50,7 @@ SoundManager::SoundManager() { _soundData = NULL; _paused = false; - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32); _isRoland = MidiDriver::getMusicType(dev) != MT_ADLIB; _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index 8063044205..f1506598d2 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -156,7 +156,7 @@ Common::Error MadsM4Engine::run() { // Initialize backend _screen = new M4Surface(true); // Special form for creating screen reference - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); _driver = MidiDriver::createMidi(dev); diff --git a/engines/made/made.cpp b/engines/made/made.cpp index b983e87cc2..94926014d3 100644 --- a/engines/made/made.cpp +++ b/engines/made/made.cpp @@ -97,7 +97,7 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng _script = new ScriptInterpreter(this); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 6dbf526c96..470c698a21 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -61,7 +61,7 @@ Common::Error Parallaction_br::init() { _disk = new DosDisk_br(this); } _disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters. - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); MidiDriver *driver = MidiDriver::createMidi(dev); _soundManI = new DosSoundMan_br(this, driver); } else { diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 7e06aaa5ab..f1e7b14583 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -166,7 +166,7 @@ Common::Error Parallaction_ns::init() { _disk->init(); if (getPlatform() == Common::kPlatformPC) { - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); MidiDriver *driver = MidiDriver::createMidi(dev); _soundManI = new DosSoundMan_ns(this, driver); _soundManI->setMusicVolume(ConfMan.getInt("music_volume")); diff --git a/engines/queen/music.cpp b/engines/queen/music.cpp index 2bbbd53568..3d859c8335 100644 --- a/engines/queen/music.cpp +++ b/engines/queen/music.cpp @@ -46,7 +46,7 @@ MidiMusic::MidiMusic(QueenEngine *vm) _queuePos = _lastSong = _currentSong = 0; queueClear(); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI | MDT_PREFER_MT32); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32); _adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index dbe79a3e72..8b7654d689 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -47,7 +47,7 @@ MusicDriver::MusicDriver() : _isGM(false) { _masterVolume = 0; _nativeMT32 = ConfMan.getBool("native_mt32"); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = MidiDriver::createMidi(dev); if (isMT32()) _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 29def1765b..452ccde2da 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -386,6 +386,12 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt // Returns a pointer to the TOS exec_stack element assert(s); + //if (send_obj.segment == 27 && send_obj.offset == 190 && s->resmgr->_protectionCountSpec > 20) { + //if (s->resmgr->_protectionCountSpec == 21) + // s->resmgr->_protectionCountSpec--; + //send_obj.offset = 1388; + //} + reg_t funcp; int selector; int argc; diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 0d1f0f4db9..400189ee2e 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -68,7 +68,7 @@ void SciMusic::init() { // We also don't yet support the 7.pat file of SCI1+ Mac games or SCI0 Mac patches, so we // default to MIDI in those games to let them run. Common::Platform platform = g_sci->getPlatform(); - uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); + uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); switch (MidiDriver::getMusicType(dev)) { case MT_ADLIB: diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index e9dfce8057..d8987c816f 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -224,7 +224,7 @@ static const GameSettings gameVariantsTable[] = { {"indy3", "VGA", "vga", GID_INDY3, 3, 0, MDT_PCSPK | MDT_ADLIB, GF_OLD256 | GF_FEW_LOCALS, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, {"indy3", "FM-TOWNS", 0, GID_INDY3, 3, 0, MDT_TOWNS, GF_OLD256 | GF_FEW_LOCALS | GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, + {"loom", "EGA", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, {"loom", "No AdLib", "ega", GID_LOOM, 3, 0, MDT_PCSPK | MDT_CMS, 0, UNK, GUIO_NOSPEECH | GUIO_NOMIDI}, #ifdef USE_RGB_COLOR {"loom", "PC-Engine", 0, GID_LOOM, 3, 0, MDT_NONE, GF_AUDIOTRACKS | GF_OLD256 | GF_16BIT_COLOR, Common::kPlatformPCEngine, GUIO_NOSPEECH | GUIO_NOMIDI}, @@ -234,24 +234,24 @@ static const GameSettings gameVariantsTable[] = { {"pass", 0, 0, GID_PASS, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, - {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH}, + {"monkey", "VGA", "vga", GID_MONKEY_VGA, 4, 0, MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, + {"monkey", "EGA", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_CMS | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH}, {"monkey", "No AdLib", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK, GF_16COLOR, Common::kPlatformAtariST, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "Demo", "ega", GID_MONKEY_EGA, 4, 0, MDT_PCSPK | MDT_ADLIB, GF_16COLOR, Common::kPlatformPC, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "CD", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, UNK, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "FM-TOWNS", 0, GID_MONKEY, 5, 0, MDT_ADLIB, GF_AUDIOTRACKS, Common::kPlatformFMTowns, GUIO_NOSPEECH | GUIO_NOMIDI}, {"monkey", "SEGA", 0, GID_MONKEY, 5, 0, MDT_NONE, GF_AUDIOTRACKS, Common::kPlatformSegaCD, GUIO_NOSPEECH | GUIO_NOMIDI}, - {"monkey2", 0, 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, + {"monkey2", 0, 0, GID_MONKEY2, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, - {"atlantis", "" , 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NONE}, - {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, + {"atlantis", "" , 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NONE}, + {"atlantis", "Floppy", 0, GID_INDY4, 5, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32, 0, UNK, GUIO_NOSPEECH}, - {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, - {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, + {"tentacle", "", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, + {"tentacle", "Floppy", 0, GID_TENTACLE, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, - {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, - {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, + {"samnmax", "", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NONE}, + {"samnmax", "Floppy", 0, GID_SAMNMAX, 6, 0, MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM, GF_USE_KEY, UNK, GUIO_NOSPEECH}, #ifdef ENABLE_SCUMM_7_8 {"ft", 0, 0, GID_FT, 7, 0, MDT_NONE, 0, UNK, GUIO_NOMIDI}, diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp index 58e3f5be2c..45b3cab947 100644 --- a/engines/sky/sky.cpp +++ b/engines/sky/sky.cpp @@ -259,7 +259,7 @@ Common::Error SkyEngine::init() { _systemVars.gameVersion = _skyDisk->determineGameVersion(); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MIDI | MDT_PREFER_MT32); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32); if (MidiDriver::getMusicType(dev) == MT_ADLIB) { _systemVars.systemFlags |= SF_SBLASTER; _skyMusic = new AdLibMusic(_mixer, _skyDisk); diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index e5a39308da..195066cac1 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -856,7 +856,7 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc) if (cd_num >= 0) _system->openCD(cd_num); - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); //bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB); diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp index 5c1d687827..439d3b9ac2 100644 --- a/engines/touche/midi.cpp +++ b/engines/touche/midi.cpp @@ -92,7 +92,7 @@ void MidiPlayer::setVolume(int volume) { } int MidiPlayer::open() { - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")); _driver = MidiDriver::createMidi(dev); int ret = _driver->open(); diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 0fa64e8b03..80c8ae9c22 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -177,9 +177,9 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // If the selected driver did not match the flags setting, // we try to determine a suitable and "optimal" music driver. const MusicPlugin::List p = MusicMan.getPlugins(); - // If only MDT_MIDI but not MDT_PREFER_MIDI is set we prefer the other devices (which will always be + // If only MDT_MIDI but not MDT_PREFER_MT32 or MDT_PREFER_GM is set we prefer the other devices (which will always be // detected since they are hard coded and cannot be disabled. - for (int l = (flags & MDT_PREFER_MIDI) ? 1 : 0; l < 2; l++) { + for (int l = (flags & (MDT_PREFER_GM | MDT_PREFER_MT32)) ? 1 : 0; l < 2; l++) { if ((flags & MDT_MIDI) && (l == 1)) { // If a preferred MT32 or GM device has been selected that device gets returned hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"), Common::ConfigManager::kApplicationDomain)); diff --git a/sound/mididrv.h b/sound/mididrv.h index 4a52d2530c..de17ebed4c 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -58,7 +58,7 @@ enum MusicType { MT_ADLIB, // AdLib MT_TOWNS, // FM-TOWNS MT_PC98, // PC98 - MT_GM, // General MIDI + MT_GM, // General MIDI MT_MT32, // MT-32 MT_GS // Roland GS }; @@ -67,7 +67,7 @@ enum MusicType { * A set of flags to be passed to detectDevice() which can be used to * specify what kind of music driver is preferred / accepted. * - * The flags (except for MDT_PREFER_MIDI) indicate whether a given driver + * The flags (except for MDT_PREFER_MT32 and MDT_PREFER_GM) indicate whether a given driver * type is acceptable. E.g. the TOWNS music driver could be returned by * detectDevice if and only if MDT_TOWNS is specified. * @@ -82,9 +82,8 @@ enum MidiDriverFlags { MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MT_TOWNS MDT_PC98 = 1 << 5, // FM-TOWNS: Maps to MT_PC98 MDT_MIDI = 1 << 6, // Real MIDI - MDT_PREFER_MIDI = 1 << 7, // Real MIDI output is preferred - MDT_PREFER_MT32 = 1 << 8, // MT-32 output is preferred - MDT_PREFER_GM = 1 << 9 // GM output is preferred + MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred + MDT_PREFER_GM = 1 << 8 // GM output is preferred }; /** -- cgit v1.2.3 From e1a333570eb127fd9d16c1272cc9772d6f6b9559 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 20:58:52 +0000 Subject: SCI: set MDT_PREFER_GM instead od MDT_PREFER_MT32 svn-id: r50289 --- engines/sci/sound/music.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 400189ee2e..32f1869e33 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -68,7 +68,7 @@ void SciMusic::init() { // We also don't yet support the 7.pat file of SCI1+ Mac games or SCI0 Mac patches, so we // default to MIDI in those games to let them run. Common::Platform platform = g_sci->getPlatform(); - uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); + uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); switch (MidiDriver::getMusicType(dev)) { case MT_ADLIB: -- cgit v1.2.3 From b96c0a1f0797812e45d1ee135d291556f9c60866 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 21:04:22 +0000 Subject: SCI: fix typo svn-id: r50291 --- engines/sci/engine/vm.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 452ccde2da..29def1765b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -386,12 +386,6 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt // Returns a pointer to the TOS exec_stack element assert(s); - //if (send_obj.segment == 27 && send_obj.offset == 190 && s->resmgr->_protectionCountSpec > 20) { - //if (s->resmgr->_protectionCountSpec == 21) - // s->resmgr->_protectionCountSpec--; - //send_obj.offset = 1388; - //} - reg_t funcp; int selector; int argc; -- cgit v1.2.3 From fc4fa25ec4272f6117ca32e3c3998b15de30eca3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 22:34:53 +0000 Subject: SCI: adding capability for detecting export-calls into valgrind-sci, adding workaround for export 1 of script 703 in sq1 (gets called from various objects) svn-id: r50292 --- engines/sci/engine/vm.cpp | 55 +++++++++++++++++++++++++---------------------- engines/sci/engine/vm.h | 1 + 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 29def1765b..f7c38e0e2b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -60,6 +60,8 @@ const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; * @param[in] argp Heap pointer to the first parameter * @param[in] selector The selector by which it was called or * NULL_SELECTOR if n.a. For debugging. + * @param[in] exportId The exportId by which it was called or + * -1 if n.a. For debugging. * @param[in] sendp Pointer to the object which the message was * sent to. Equal to objp for anything but super. * @param[in] origin Number of the execution stack element this @@ -70,7 +72,7 @@ const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; * @return A pointer to the new exec stack TOS entry */ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t pc, StackPtr sp, - reg_t objp, int argc, StackPtr argp, Selector selector, + reg_t objp, int argc, StackPtr argp, Selector selector, int exportId, reg_t sendp, int origin, SegmentId local_segment); @@ -191,14 +193,14 @@ struct UninitializedReadWorkaround { }; static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room - { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { GID_SQ1, 703, "fromAirlock", "", 0, 0 }, // sub that's called from fromAirlock::changeState - { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller - { (SciGameId)0, -1, NULL, NULL, 0, 0 } + { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu + { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room + { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { GID_SQ1, 703, "", "export 1", 0, 0 }, // sub that's called from several objects + { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller + { (SciGameId)0, -1, NULL, NULL, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -207,22 +209,22 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // Uninitialized read on a temp // We need to find correct replacements for each situation manually EngineState *state = g_sci->getEngineState(); - Script *local_script = state->_segMan->getScriptIfLoaded(state->xs->local_segment); + ExecStack *call = state->xs; + Script *local_script = state->_segMan->getScriptIfLoaded(call->local_segment); int curScriptNr = local_script->_nr; - Common::List::iterator callIterator = state->_executionStack.begin(); - ExecStack call = *callIterator; - while (callIterator != state->_executionStack.end()) { - call = *callIterator; - callIterator++; - } - - Common::String curObjectName = state->_segMan->getObjectName(call.sendp); + Common::String curObjectName = state->_segMan->getObjectName(call->sendp); Common::String curMethodName; const SciGameId gameId = g_sci->getGameId(); - if (call.type == EXEC_STACK_TYPE_CALL) - curMethodName = g_sci->getKernel()->getSelectorName(call.selector); + if (call->type == EXEC_STACK_TYPE_CALL) { + if (call->selector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(call->selector); + } else if (call->exportId != -1) { + curObjectName = ""; + curMethodName = curMethodName.printf("export %d", call->exportId); + } + } // Search if this is a known uninitialized read const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; @@ -343,7 +345,7 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP } } - return add_exec_stack_entry(s->_executionStack, make_reg(seg, temp), sp, calling_obj, argc, argp, -1, calling_obj, s->_executionStack.size()-1, seg); + return add_exec_stack_entry(s->_executionStack, make_reg(seg, temp), sp, calling_obj, argc, argp, -1, pubfunct, calling_obj, s->_executionStack.size()-1, seg); } @@ -541,7 +543,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt else add_exec_stack_entry(s->_executionStack, call.address.func, call.sp, work_obj, call.argc, call.argp, - call.selector, send_obj, origin, SCI_XS_CALLEE_LOCALS); + call.selector, -1, send_obj, origin, SCI_XS_CALLEE_LOCALS); } _exec_varselectors(s); @@ -550,7 +552,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } static ExecStack *add_exec_stack_varselector(Common::List &execStack, reg_t objp, int argc, StackPtr argp, Selector selector, const ObjVarRef& address, int origin) { - ExecStack *xstack = add_exec_stack_entry(execStack, NULL_REG, 0, objp, argc, argp, selector, objp, origin, SCI_XS_CALLEE_LOCALS); + ExecStack *xstack = add_exec_stack_entry(execStack, NULL_REG, 0, objp, argc, argp, selector, -1, objp, origin, SCI_XS_CALLEE_LOCALS); // Store selector address in sp xstack->addr.varp = address; @@ -560,7 +562,7 @@ static ExecStack *add_exec_stack_varselector(Common::List &execStack, } static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t pc, StackPtr sp, reg_t objp, int argc, - StackPtr argp, Selector selector, reg_t sendp, int origin, SegmentId _localsSegment) { + StackPtr argp, Selector selector, int exportId, reg_t sendp, int origin, SegmentId _localsSegment) { // Returns new TOS element for the execution stack // _localsSegment may be -1 if derived from the called object @@ -585,6 +587,7 @@ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t // Additional debug information xstack.selector = selector; + xstack.exportId = exportId; xstack.origin = origin; xstack.type = EXEC_STACK_TYPE_CALL; // Normal call @@ -639,7 +642,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { // This is useful in debugger backtraces if this // kernel function calls a script itself. ExecStack *xstack; - xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, NULL_REG, + xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, NULL_REG, s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); xstack->selector = kernelFuncNum; xstack->type = EXEC_STACK_TYPE_KERNEL; @@ -1194,7 +1197,7 @@ void run_vm(EngineState *s, bool restoring) { s->xs->addr.pc.offset + opparams[0]), s->xs->sp, s->xs->objp, (validate_arithmetic(*call_base)) + s->restAdjust, - call_base, NULL_SELECTOR, s->xs->objp, + call_base, NULL_SELECTOR, -1, s->xs->objp, s->_executionStack.size()-1, s->xs->local_segment); s->restAdjust = 0; // Used up the &rest adjustment s->xs->sp = call_base; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 88898cdbba..ed3d5483b6 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -103,6 +103,7 @@ struct ExecStack { SegmentId local_segment; // local variables etc Selector selector; // The selector which was used to call or -1 if not applicable + int exportId; // The exportId which was called or -1 if not applicable int origin; // The stack frame position the call was made from, or -1 if it was the initial call ExecStackType type; -- cgit v1.2.3 From 56c6907477095d404523303330d4ceff9889a3be Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 25 Jun 2010 22:37:19 +0000 Subject: AUDIO: fix comments svn-id: r50293 --- sound/mididrv.h | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/sound/mididrv.h b/sound/mididrv.h index de17ebed4c..67a2972f17 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -111,22 +111,19 @@ public: static uint32 musicType2GUIO(uint32 musicType); - /** Create music driver matching the given device handle, or MT_AUTO if there is no match. */ + /** Create music driver matching the given device handle, or NULL if there is no match. */ static MidiDriver *createMidi(DeviceHandle handle); - /** Returnd device handle based on the present devices and the flags parameter. - / * Returns NULl if the matching device is the null or auto device. */ + /** Returns device handle based on the present devices and the flags parameter. */ static DeviceHandle detectDevice(int flags); - /** - * Find the music driver matching the given driver name/description. - */ + /** Find the music driver matching the given driver name/description. */ static DeviceHandle getDeviceHandle(const Common::String &identifier); /** Get the music type matching the given device handle, or MT_AUTO if there is no match. */ static MusicType getMusicType(DeviceHandle handle); - /** Get the device string matching the given device handle and the given type. */ + /** Get the device description string matching the given device handle and the given type. */ static Common::String getDeviceString(DeviceHandle handle, DeviceStringType type); private: @@ -134,7 +131,7 @@ private: // we use this to force getMusicType() to return MT_MT32 so that we don't // have to rely on the 'True Roland MT-32' config manager setting (since nobody // would possibly think about activating 'True Roland MT-32' when he has set - // 'Music Driver' to '>default>') + // 'Music Driver' to '') static bool _forceTypeMT32; public: -- cgit v1.2.3 From 56d9acad90588453837710775ab8fbb7649884a5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 25 Jun 2010 22:48:55 +0000 Subject: SCI: implementing workaround for issue in room 58 sq1 (operation lt, doing comparsion against pointer) svn-id: r50294 --- engines/sci/engine/vm.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f7c38e0e2b..70c4f3d996 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1056,6 +1056,12 @@ void run_vm(EngineState *s, bool restoring) { if (r_temp.segment != s->r_acc.segment) warning("[VM] Comparing pointers in different segments (%04x:%04x vs. %04x:%04x)", PRINT_REG(r_temp), PRINT_REG(s->r_acc)); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset); + } else if (r_temp.segment && !s->r_acc.segment) { + if (s->r_acc.offset >= 1000) + error("[VM] op_lt: comparsion between a pointer and number"); + // Pseudo-WORKAROUND: sierra allows any pointer <-> value comparsion + // Happens in SQ1, room 58, when giving id-card to robot + s->r_acc = make_reg(0, 1); } else s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) < (int16)/*acc*/); break; -- cgit v1.2.3 From e328bd8f7f95ae18be4ec6796baf14c1c8b17728 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 25 Jun 2010 23:43:07 +0000 Subject: Added support for Fab compressed sprite sets svn-id: r50295 --- engines/m4/assets.cpp | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index c329373add..0c0bf330a7 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -234,12 +234,15 @@ void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStre spriteStream = sprite.getItemStream(1); Common::SeekableReadStream *spriteDataStream = sprite.getItemStream(3); SpriteAssetFrame frame; + Common::Array frameSizes; for (curFrame = 0; curFrame < _frameCount; curFrame++) { frame.stream = 0; frame.comp = 0; frameOffset = spriteStream->readUint32LE(); _frameOffsets.push_back(frameOffset); - spriteStream->readUint32LE(); // frame size + uint32 frameSize = spriteStream->readUint32LE(); + frameSizes.push_back(frameSize); + frame.x = spriteStream->readUint16LE(); frame.y = spriteStream->readUint16LE(); frame.w = spriteStream->readUint16LE(); @@ -247,9 +250,44 @@ void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStre if (curFrame == 0) debugC(1, kDebugGraphics, "%i frames, x = %i, y = %i, w = %i, h = %i\n", _frameCount, frame.x, frame.y, frame.w, frame.h); - frame.frame = new M4Sprite(spriteDataStream, frame.x, frame.y, frame.w, frame.h, false); + if (_mode == 0) { + // Create a frame and decompress the raw pixel data + uint32 currPos = (uint32)spriteDataStream->pos(); + frame.frame = new M4Sprite(spriteDataStream, frame.x, frame.y, frame.w, frame.h, false); + assert((uint32)spriteDataStream->pos() == (currPos + frameSize)); + } + _frames.push_back(frame); } + + if (_mode != 0) { + // Handle decompressing Fab encoded data + for (curFrame = 0; curFrame < _frameCount; curFrame++) { + FabDecompressor fab; + + int srcSize = (curFrame == (_frameCount - 1)) ? spriteDataStream->size() - _frameOffsets[curFrame] : + _frameOffsets[curFrame + 1] - _frameOffsets[curFrame]; + byte *srcData = (byte *)malloc(srcSize); + assert(srcData); + spriteDataStream->read(srcData, srcSize); + + byte *destData = (byte *)malloc(frameSizes[curFrame]); + assert(destData); + + fab.decompress(srcData, srcSize, destData, frameSizes[curFrame]); + + // Load the frame + Common::MemoryReadStream *rs = new Common::MemoryReadStream(destData, frameSizes[curFrame]); + _frames[curFrame].frame = new M4Sprite(rs, _frames[curFrame].x, _frames[curFrame].y, + _frames[curFrame].w, _frames[curFrame].h, false); + delete rs; + + free(srcData); + free(destData); + } + } + + delete spriteStream; delete spriteDataStream; } -- cgit v1.2.3 From 5ba7be88b8641e8cc8b4760b44d87ddc7b1ed0f7 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 00:28:29 +0000 Subject: Fix formatting again. svn-id: r50296 --- sound/mididrv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sound/mididrv.h b/sound/mididrv.h index 67a2972f17..ff6ce01295 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -58,7 +58,7 @@ enum MusicType { MT_ADLIB, // AdLib MT_TOWNS, // FM-TOWNS MT_PC98, // PC98 - MT_GM, // General MIDI + MT_GM, // General MIDI MT_MT32, // MT-32 MT_GS // Roland GS }; @@ -82,8 +82,8 @@ enum MidiDriverFlags { MDT_TOWNS = 1 << 4, // FM-TOWNS: Maps to MT_TOWNS MDT_PC98 = 1 << 5, // FM-TOWNS: Maps to MT_PC98 MDT_MIDI = 1 << 6, // Real MIDI - MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred - MDT_PREFER_GM = 1 << 8 // GM output is preferred + MDT_PREFER_MT32 = 1 << 7, // MT-32 output is preferred + MDT_PREFER_GM = 1 << 8 // GM output is preferred }; /** -- cgit v1.2.3 From ab261facee90ede5dd7dd5bf38262745eef3e946 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 26 Jun 2010 00:36:43 +0000 Subject: Added extra validation for sprite decoding svn-id: r50297 --- engines/m4/sprite.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 4ce1b75b35..641b93baea 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -121,6 +121,8 @@ void M4Sprite::loadDeltaRle(Common::SeekableReadStream* rleData, int destX, int // TODO: The sprite outlines (pixel value 0xFD) are not shown void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { + bool spriteEnd = false; + // Set entire sprite contents to transparent pixels fillRect(bounds(), TRANSPARENT_COLOUR_INDEX); @@ -131,10 +133,14 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { byte cmd = source->readByte(); int x2 = 0; - if (cmd == 0xff) + if (cmd == 0xfc) { + // End of entire sprite + spriteEnd = true; + break; + } else if (cmd == 0xff) { // The entire line is empty newLine = true; - else if (cmd == 0xFD) { + } else if (cmd == 0xFD) { // Lines contains only run lenghs of pixels while (x2 < w) { cmd = source->readByte(); @@ -189,6 +195,11 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { } while (source->readByte() != 0xff); } } + + if (!spriteEnd) { + byte v = source->readByte(); + assert(v == 0xFC); + } } byte M4Sprite::getTransparencyIndex() const { -- cgit v1.2.3 From 70e4a8605b85abf3edb83afe2df0ca8992e79f20 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 26 Jun 2010 00:37:44 +0000 Subject: Minor bugfix for correctly positioning where background sprites are drawn svn-id: r50298 --- engines/m4/mads_views.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 1184ab81e7..dd5eb7a266 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -158,11 +158,11 @@ void MadsSpriteSlots::drawBackground(int yOffset) { if (slot.depth > 1) { // Draw the frame with depth processing - _owner._bgSurface->copyFrom(frame, xp, yp, Common::Point(0, yOffset), slot.depth, + _owner._bgSurface->copyFrom(frame, xp, yp, Common::Point(), slot.depth, _owner._depthSurface, 100, frame->getTransparencyIndex()); } else { // No depth, so simply draw the image - frame->copyTo(_owner._bgSurface, xp, yp + yOffset, frame->getTransparencyIndex()); + frame->copyTo(_owner._bgSurface, xp, yp, frame->getTransparencyIndex()); } } } -- cgit v1.2.3 From 258494f03694362e2d0e63b6803dcb7eaabfaa21 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 08:29:55 +0000 Subject: SCI: adding capability to resolve local calls as well for valgrind-sci, adding another workaround for a script bug in sq1 (this time export 1 gets called locally) svn-id: r50308 --- engines/sci/engine/vm.cpp | 72 ++++++++++++++++++++++++++++++----------------- engines/sci/engine/vm.h | 1 + 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 70c4f3d996..d1fcbbd1f9 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -72,7 +72,7 @@ const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; * @return A pointer to the new exec stack TOS entry */ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t pc, StackPtr sp, - reg_t objp, int argc, StackPtr argp, Selector selector, int exportId, + reg_t objp, int argc, StackPtr argp, Selector selector, int exportId, int localCallOffset, reg_t sendp, int origin, SegmentId local_segment); @@ -188,19 +188,22 @@ struct UninitializedReadWorkaround { int scriptNr; const char *objectName; const char *methodName; + int localCallOffset; int index; uint16 newValue; }; static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, "gcWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, "quitWin", "open", 5, 0xf }, // is used as priority for game menu - { GID_LSL1, 720, "rm720", "init", 0, 0 }, // age check room - { GID_ISLANDBRAIN, 140, "piece", "init", 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 - { GID_SQ1, 703, "", "export 1", 0, 0 }, // sub that's called from several objects - { GID_SQ4, 928, "Narrator", "startText", 1000, 1 }, // sq4cd: method returns this to the caller - { (SciGameId)0, -1, NULL, NULL, 0, 0 } + { GID_LAURABOW2, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room + { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects + { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally + { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // export 1 sub, but called locally + { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller + { (SciGameId)0, -1, NULL, NULL, -1, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -209,20 +212,34 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // Uninitialized read on a temp // We need to find correct replacements for each situation manually EngineState *state = g_sci->getEngineState(); - ExecStack *call = state->xs; - Script *local_script = state->_segMan->getScriptIfLoaded(call->local_segment); + ExecStack *lastCall = state->xs; + Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); int curScriptNr = local_script->_nr; - Common::String curObjectName = state->_segMan->getObjectName(call->sendp); + if (lastCall->localCallOffset != -1) { + // if lastcall was actually a local call search back for a real call + Common::List::iterator callIterator = state->_executionStack.end(); + while (callIterator != state->_executionStack.begin()) { + callIterator--; + ExecStack loopCall = *callIterator; + if ((loopCall.selector != -1) || (loopCall.exportId != -1)) { + lastCall->selector = loopCall.selector; + lastCall->exportId = loopCall.exportId; + break; + } + } + } + + Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); Common::String curMethodName; const SciGameId gameId = g_sci->getGameId(); - if (call->type == EXEC_STACK_TYPE_CALL) { - if (call->selector != -1) { - curMethodName = g_sci->getKernel()->getSelectorName(call->selector); - } else if (call->exportId != -1) { + if (lastCall->type == EXEC_STACK_TYPE_CALL) { + if (lastCall->selector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(lastCall->selector); + } else if (lastCall->exportId != -1) { curObjectName = ""; - curMethodName = curMethodName.printf("export %d", call->exportId); + curMethodName = curMethodName.printf("export %d", lastCall->exportId); } } @@ -230,14 +247,14 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; while (workaround->objectName) { if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && workaround->objectName == curObjectName - && workaround->methodName == curMethodName && workaround->index == index) { + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { // Workaround found r[index] = make_reg(0, workaround->newValue); return r[index]; } workaround++; } - error("Uninitialized read for temp %d from method %s::%s (script %d)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr); + error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %lx)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); } return r[index]; } else @@ -345,7 +362,7 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP } } - return add_exec_stack_entry(s->_executionStack, make_reg(seg, temp), sp, calling_obj, argc, argp, -1, pubfunct, calling_obj, s->_executionStack.size()-1, seg); + return add_exec_stack_entry(s->_executionStack, make_reg(seg, temp), sp, calling_obj, argc, argp, -1, pubfunct, -1, calling_obj, s->_executionStack.size()-1, seg); } @@ -543,7 +560,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt else add_exec_stack_entry(s->_executionStack, call.address.func, call.sp, work_obj, call.argc, call.argp, - call.selector, -1, send_obj, origin, SCI_XS_CALLEE_LOCALS); + call.selector, -1, -1, send_obj, origin, SCI_XS_CALLEE_LOCALS); } _exec_varselectors(s); @@ -552,7 +569,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } static ExecStack *add_exec_stack_varselector(Common::List &execStack, reg_t objp, int argc, StackPtr argp, Selector selector, const ObjVarRef& address, int origin) { - ExecStack *xstack = add_exec_stack_entry(execStack, NULL_REG, 0, objp, argc, argp, selector, -1, objp, origin, SCI_XS_CALLEE_LOCALS); + ExecStack *xstack = add_exec_stack_entry(execStack, NULL_REG, 0, objp, argc, argp, selector, -1, -1, objp, origin, SCI_XS_CALLEE_LOCALS); // Store selector address in sp xstack->addr.varp = address; @@ -562,7 +579,7 @@ static ExecStack *add_exec_stack_varselector(Common::List &execStack, } static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t pc, StackPtr sp, reg_t objp, int argc, - StackPtr argp, Selector selector, int exportId, reg_t sendp, int origin, SegmentId _localsSegment) { + StackPtr argp, Selector selector, int exportId, int localCallOffset, reg_t sendp, int origin, SegmentId _localsSegment) { // Returns new TOS element for the execution stack // _localsSegment may be -1 if derived from the called object @@ -588,6 +605,7 @@ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t // Additional debug information xstack.selector = selector; xstack.exportId = exportId; + xstack.localCallOffset = localCallOffset; xstack.origin = origin; xstack.type = EXEC_STACK_TYPE_CALL; // Normal call @@ -642,7 +660,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { // This is useful in debugger backtraces if this // kernel function calls a script itself. ExecStack *xstack; - xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, NULL_REG, + xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); xstack->selector = kernelFuncNum; xstack->type = EXEC_STACK_TYPE_KERNEL; @@ -1199,11 +1217,13 @@ void run_vm(EngineState *s, bool restoring) { StackPtr call_base = s->xs->sp - argc; s->xs->sp[1].offset += s->restAdjust; + uint16 localCallOffset = s->xs->addr.pc.offset + opparams[0]; + xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment, - s->xs->addr.pc.offset + opparams[0]), + localCallOffset), s->xs->sp, s->xs->objp, (validate_arithmetic(*call_base)) + s->restAdjust, - call_base, NULL_SELECTOR, -1, s->xs->objp, + call_base, NULL_SELECTOR, -1, localCallOffset, s->xs->objp, s->_executionStack.size()-1, s->xs->local_segment); s->restAdjust = 0; // Used up the &rest adjustment s->xs->sp = call_base; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index ed3d5483b6..d747ddd113 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -104,6 +104,7 @@ struct ExecStack { Selector selector; // The selector which was used to call or -1 if not applicable int exportId; // The exportId which was called or -1 if not applicable + int localCallOffset; // Local call offset or -1 if not applicable int origin; // The stack frame position the call was made from, or -1 if it was the initial call ExecStackType type; -- cgit v1.2.3 From cf3a37585cfd333a10acfd5d2eae853c6c47ed6d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 09:34:14 +0000 Subject: SCI: making hack inside kAbs hoyle1 specific, added fixme svn-id: r50309 --- engines/sci/engine/kmath.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 6d4b9a2a04..3c0ab814f1 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -36,9 +36,12 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) { } reg_t kAbs(EngineState *s, int argc, reg_t *argv) { - // This is a hack, but so is the code in Hoyle1 that needs it. - if (argv[0].segment) - return make_reg(0, 0x3e9); // Yes people, this is an object + if (g_sci->getGameId() == GID_HOYLE1) { + // This is a hack, but so is the code in Hoyle1 that needs it. + // FIXME: where is this exactly needed? + if (argv[0].segment) + return make_reg(0, 0x3e9); // Yes people, this is an object + } return make_reg(0, abs(argv[0].toSint16())); } -- cgit v1.2.3 From 16f854ba644aff930236d4f3ed5c8e6be35a970b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 10:47:38 +0000 Subject: SCI: dont call midiparser->stop() if paused sound gets stopped svn-id: r50310 --- engines/sci/sound/music.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 32f1869e33..d1555ca7a6 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -365,6 +365,7 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { } void SciMusic::soundStop(MusicEntry *pSnd) { + SoundStatus previousStatus = pSnd->status; pSnd->status = kSoundStopped; if (_soundVersion <= SCI_VERSION_0_LATE) pSnd->isQueued = false; @@ -374,7 +375,9 @@ void SciMusic::soundStop(MusicEntry *pSnd) { if (pSnd->pMidiParser) { _mutex.lock(); pSnd->pMidiParser->mainThreadBegin(); - pSnd->pMidiParser->stop(); + // We shouldn't call stop in case it's paused, otherwise we would send allNotesOff() again + if (previousStatus == kSoundPlaying) + pSnd->pMidiParser->stop(); freeChannels(pSnd); pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); -- cgit v1.2.3 From 906b3221f58d71c0c73a9c60f9fd3feb7fcafaab Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 10:51:38 +0000 Subject: SCI: removing fixme (issue got already solved) svn-id: r50311 --- engines/sci/sound/midiparser_sci.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index cb43f6c3a1..0bcafc8075 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -382,12 +382,6 @@ void MidiParser_SCI::allNotesOff() { int i, j; - // Note: we send to driver here directly, because in this case we would free previously mapped channels - // and onTimer() wouldn't send them to driver anymore afterwards anyway - - // FIXME: the common midiparser/driver code doesn't really like getting called from various threads - // but we don't have an option here... i guess midiparser/driver code should be made thread-safe - // Turn off all active notes for (i = 0; i < 128; ++i) { for (j = 0; j < 16; ++j) { -- cgit v1.2.3 From d7fe98825154ede7beb0987ee3177ed46f1a3fa4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 26 Jun 2010 11:14:38 +0000 Subject: Bugfix to dirty area handling to prevent creation of invalid rects svn-id: r50312 --- engines/m4/mads_views.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index dd5eb7a266..08b579cfb0 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -738,9 +738,12 @@ void MadsDirtyArea::setArea(int width, int height, int maxWidth, int maxHeight) --bounds.left; ++width; } - int right = bounds.left + width; + if (bounds.left < 0) bounds.left = 0; + else if (bounds.left > maxWidth) + bounds.left = maxWidth; + int right = bounds.left + width; if (right < 0) right = 0; if (right > maxWidth) @@ -752,6 +755,8 @@ void MadsDirtyArea::setArea(int width, int height, int maxWidth, int maxHeight) if (bounds.top < 0) bounds.top = 0; + else if (bounds.top > maxHeight) + bounds.top = maxHeight; int bottom = bounds.top + height; if (bottom < 0) bottom = 0; -- cgit v1.2.3 From 18d9f917a0be68327ed3b06da588a5804f42e54f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 11:16:25 +0000 Subject: SCI: set _driver to 0 in MidiParser_SCI destructor to stop the MidiParser destructor call allNotesOff() which would affect all channels all the time - fixes sq1 ship flying away sound getting stopped when ladder falls down svn-id: r50313 --- engines/sci/sound/midiparser_sci.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 0bcafc8075..ebb2a172cc 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -65,6 +65,9 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : MidiParser_SCI::~MidiParser_SCI() { unloadMusic(); + // we do this, so that MidiParser won't be able to call his own ::allNotesOff() + // this one would affect all channels and we can't let that happen + _driver = 0; } void MidiParser_SCI::mainThreadBegin() { -- cgit v1.2.3 From 8eb206b6b97d172617902f92ea241af89dd22b5f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 26 Jun 2010 11:31:04 +0000 Subject: Bugfix to correctly handle transparency when rendering scaled sprites svn-id: r50314 --- engines/m4/graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 55c16cb9e7..43df6e1b5f 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -547,7 +547,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, Common::Point des // Not a display pixel continue; - if (depth <= *depthP) + if ((*srcP != transparentColour) && (depth <= *depthP)) *destP = *srcP; ++destP; -- cgit v1.2.3 From be75870100e7e411b35f70cd96a851d7e50c20da Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 11:43:14 +0000 Subject: SCI: fixing deadlock possiblity on samples (sq3 deadlocked on door opening/where am i on me) svn-id: r50315 --- engines/sci/sound/music.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index a29b6edee2..ec9cbd8506 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -164,11 +164,13 @@ public: uint32 soundGetTempo() const { return _dwTempo; } bool soundIsActive(MusicEntry *pSnd) { + Common::StackLock lock(_mutex); assert(pSnd->pStreamAud != 0); return _pMixer->isSoundHandleActive(pSnd->hCurrentAud); } void updateAudioStreamTicker(MusicEntry *pSnd) { + Common::StackLock lock(_mutex); assert(pSnd->pStreamAud != 0); pSnd->ticker = (uint16)(_pMixer->getSoundElapsedTime(pSnd->hCurrentAud) * 0.06); } -- cgit v1.2.3 From e4153044d42ec976699389956441020cc52d9005 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 11:48:42 +0000 Subject: SCI: reverting r50315 - had the deadlock just again... svn-id: r50316 --- engines/sci/sound/music.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index ec9cbd8506..a29b6edee2 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -164,13 +164,11 @@ public: uint32 soundGetTempo() const { return _dwTempo; } bool soundIsActive(MusicEntry *pSnd) { - Common::StackLock lock(_mutex); assert(pSnd->pStreamAud != 0); return _pMixer->isSoundHandleActive(pSnd->hCurrentAud); } void updateAudioStreamTicker(MusicEntry *pSnd) { - Common::StackLock lock(_mutex); assert(pSnd->pStreamAud != 0); pSnd->ticker = (uint16)(_pMixer->getSoundElapsedTime(pSnd->hCurrentAud) * 0.06); } -- cgit v1.2.3 From cb5d9f6af5f2c44907215490dff0ace4b2b134c6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 12:04:15 +0000 Subject: SCI: added workaround for island of dr. brain elements puzzle svn-id: r50317 --- engines/sci/engine/vm.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d1fcbbd1f9..9565c82f16 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -198,10 +198,11 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room - { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally - { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // export 1 sub, but called locally + { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // export 1 sub, but called locally (when shooting at aliens) { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller { (SciGameId)0, -1, NULL, NULL, -1, 0, 0 } }; -- cgit v1.2.3 From a4f139c4d23845b622a2df427a375ca2953bbf66 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 12:20:40 +0000 Subject: SCI: adding more comment for export workaround (sq1) svn-id: r50318 --- engines/sci/engine/vm.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9565c82f16..485319a564 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -200,9 +200,8 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon - { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects - { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally - { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // export 1 sub, but called locally (when shooting at aliens) + { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller { (SciGameId)0, -1, NULL, NULL, -1, 0, 0 } }; -- cgit v1.2.3 From 783b71d58562c5a9a8eac23690e658931b086f1a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 13:28:22 +0000 Subject: Load the correct speech file pack for the intro of Rex Nebular svn-id: r50321 --- engines/m4/mads_menus.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index d7d9cf4150..0addfc57cb 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -309,6 +309,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) { return; case SHOW_INTRO: + vm->_sound->loadDSRFile("act002.dsr"); vm->_viewManager->showAnimView("@rexopen"); break; -- cgit v1.2.3 From 21831b61832060855017d5b30dc277eaa333aef8 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Sat, 26 Jun 2010 15:25:47 +0000 Subject: GUI: If no language is explicitly selected and autodetection is available, select "" (which is already in use) instead of English. svn-id: r50323 --- gui/options.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index cd6eb73adb..a22ceacf2d 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -967,7 +967,17 @@ GlobalOptionsDialog::GlobalOptionsDialog() _guiLanguagePopUp->appendEntry(lang->name, lang->id); lang++; } - _guiLanguagePopUp->setSelectedTag(TransMan.parseLanguage(ConfMan.get("gui_language").c_str())); + + // Select the currently configured language or default/English if + // nothing is specified. + if (ConfMan.hasKey("gui_language")) + _guiLanguagePopUp->setSelectedTag(TransMan.parseLanguage(ConfMan.get("gui_language"))); + else +#ifdef USE_DETECTLANG + _guiLanguagePopUp->setSelectedTag(Common::kTranslationAutodetectId); +#else // !USE_DETECTLANG + _guiLanguagePopUp->setSelectedTag(Common::kTranslationBuiltinId); +#endif // USE_DETECTLANG #endif // USE_TRANSLATION -- cgit v1.2.3 From 063cef0c284cda74f6ad366182818ac4d3dfca83 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Sat, 26 Jun 2010 15:48:03 +0000 Subject: GUI: Add and improve some messages to translate svn-id: r50324 --- backends/midi/windows.cpp | 3 ++- backends/platform/sdl/graphics.cpp | 5 +++-- backends/platform/wii/options.cpp | 2 +- backends/platform/wince/wince-sdl.cpp | 5 +++-- common/util.cpp | 7 ++++--- gui/about.cpp | 19 +++++++++++-------- gui/options.cpp | 2 +- sound/fmopl.cpp | 4 ++-- sound/null.cpp | 4 ++-- sound/softsynth/pcspk.cpp | 4 ++-- 10 files changed, 31 insertions(+), 24 deletions(-) diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp index d030d9827d..08587a6b80 100644 --- a/backends/midi/windows.cpp +++ b/backends/midi/windows.cpp @@ -31,6 +31,7 @@ #include "sound/musicplugin.h" #include "sound/mpu401.h" #include "common/config-manager.h" +#include "common/translation.h" #include @@ -152,7 +153,7 @@ void MidiDriver_WIN::check_error(MMRESULT result) { class WindowsMusicPlugin : public MusicPluginObject { public: const char *getName() const { - return "Windows MIDI"; + return _s("Windows MIDI"); } const char *getId() const { diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 721cc54c90..05870015cb 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -25,6 +25,7 @@ #include "backends/platform/sdl/sdl.h" #include "common/mutex.h" +#include "common/translation.h" #include "common/util.h" #ifdef USE_RGB_COLOR #include "common/list.h" @@ -36,7 +37,7 @@ #include "graphics/surface.h" static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, #ifdef USE_SCALERS {"2x", "2x", GFX_DOUBLESIZE}, {"3x", "3x", GFX_TRIPLESIZE}, @@ -1378,7 +1379,7 @@ void OSystem_SDL::warpMouse(int x, int y) { int y1 = y; // Don't change mouse position, when mouse is outside of our window (in case of windowed mode) - if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS)) + if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS)) return; if (_videoMode.aspectRatioCorrection && !_overlayVisible) diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp index 402782a58d..295856d564 100644 --- a/backends/platform/wii/options.cpp +++ b/backends/platform/wii/options.cpp @@ -44,7 +44,7 @@ WiiOptionsDialog::WiiOptionsDialog(bool doubleStrike) : _strUnderscanY = "wii_video_default_underscan_y"; } - new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, _("Ok"), 0, 'k'); + new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, _("OK"), 0, 'k'); new ButtonWidget(this, _w - 216 - 32, _h - 24 - 16, 108, 24, _("Cancel"), 0, 'c'); _tab = new TabWidget(this, 0, 0, _w, _h - 54); diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index 970c9dce90..aef2117bd7 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -30,6 +30,7 @@ #include "common/events.h" #include "common/util.h" #include "common/timer.h" +#include "common/translation.h" #include "engines/engine.h" @@ -107,14 +108,14 @@ bool _hasSmartphoneResolution = false; // Low end devices 240x320 static const OSystem::GraphicsMode s_supportedGraphicsModesLow[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, {0, 0, 0} }; // High end device 480x640 static const OSystem::GraphicsMode s_supportedGraphicsModesHigh[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, {"2x", "2x", GFX_DOUBLESIZE}, #ifndef _MSC_VER // EVC breaks template functions, and I'm tired of fixing them :) {"2xsai", "2xSAI", GFX_2XSAI}, diff --git a/common/util.cpp b/common/util.cpp index b6f7bcd58f..53630fc6f3 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -24,6 +24,7 @@ #include "common/util.h" #include "common/system.h" +#include "common/translation.h" #include "common/config-manager.h" namespace Common { @@ -31,7 +32,7 @@ namespace Common { // // Print hexdump of the data passed in // -void hexdump(const byte * data, int len, int bytesPerLine, int startOffset) { +void hexdump(const byte *data, int len, int bytesPerLine, int startOffset) { assert(1 <= bytesPerLine && bytesPerLine <= 32); int i; byte c; @@ -250,8 +251,8 @@ const char *getPlatformDescription(Platform id) { const RenderModeDescription g_renderModes[] = { - {"hercGreen", "Hercules Green", kRenderHercG}, - {"hercAmber", "Hercules Amber", kRenderHercA}, + {"hercGreen", _s("Hercules Green"), kRenderHercG}, + {"hercAmber", _s("Hercules Amber"), kRenderHercA}, {"cga", "CGA", kRenderCGA}, {"ega", "EGA", kRenderEGA}, {"amiga", "Amiga", kRenderAmiga}, diff --git a/gui/about.cpp b/gui/about.cpp index a999674751..3caab084ca 100644 --- a/gui/about.cpp +++ b/gui/about.cpp @@ -93,22 +93,25 @@ AboutDialog::AboutDialog() version += gScummVMVersion; _lines.push_back(version); - Common::String date(_s("C2""(built on ")); - date += gScummVMBuildDate; - date += ')'; - _lines.push_back(date); + Common::String date = Common::String::printf(_("(built on %s)"), gScummVMBuildDate); + _lines.push_back("C2" + date); for (i = 0; i < ARRAYSIZE(copyright_text); i++) addLine(copyright_text[i]); - addLine(_s("C1""Features compiled in:")); - Common::String features("C0"); - features += gScummVMFeatures; + Common::String features("C1"); + features += _("Features compiled in:"); addLine(features.c_str()); + Common::String featureList("C0"); + featureList += gScummVMFeatures; + addLine(featureList.c_str()); _lines.push_back(""); - addLine(_s("C1""Available engines:")); + Common::String engines("C1"); + engines += _("Available engines:"); + addLine(engines.c_str()); + const EnginePlugin::List &plugins = EngineMan.getPlugins(); EnginePlugin::List::const_iterator iter = plugins.begin(); for (; iter != plugins.end(); ++iter) { diff --git a/gui/options.cpp b/gui/options.cpp index a22ceacf2d..9857d8b8d6 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -653,7 +653,7 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); _mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup"); - _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General Midi output")); + _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General MIDI output")); _gmDevicePopUp = new PopUpWidget(boss, prefix + "auPrefGmPopup"); // Populate it diff --git a/sound/fmopl.cpp b/sound/fmopl.cpp index 8fdddc20f8..dea8c5429b 100644 --- a/sound/fmopl.cpp +++ b/sound/fmopl.cpp @@ -47,9 +47,9 @@ OPL::OPL() { const Config::EmulatorDescription Config::_drivers[] = { { "auto", "", kAuto, kFlagOpl2 | kFlagDualOpl2 | kFlagOpl3 }, - { "mame", "MAME OPL emulator", kMame, kFlagOpl2 }, + { "mame", _s("MAME OPL emulator"), kMame, kFlagOpl2 }, #ifndef DISABLE_DOSBOX_OPL - { "db", "DOSBox OPL emulator", kDOSBox, kFlagOpl2 | kFlagDualOpl2 | kFlagOpl3 }, + { "db", _s("DOSBox OPL emulator"), kDOSBox, kFlagOpl2 | kFlagDualOpl2 | kFlagOpl3 }, #endif { 0, 0, 0, 0 } }; diff --git a/sound/null.cpp b/sound/null.cpp index 9be545ab76..556b96c14c 100644 --- a/sound/null.cpp +++ b/sound/null.cpp @@ -32,7 +32,7 @@ Common::Error NullMusicPlugin::createInstance(MidiDriver **mididriver, MidiDrive MusicDevices NullMusicPlugin::getDevices() const { MusicDevices devices; - devices.push_back(MusicDevice(this, _s(""), MT_NULL)); + devices.push_back(MusicDevice(this, "", MT_NULL)); return devices; } @@ -50,7 +50,7 @@ public: MusicDevices AutoMusicPlugin::getDevices() const { MusicDevices devices; - devices.push_back(MusicDevice(this, _s(""), MT_AUTO)); + devices.push_back(MusicDevice(this, "", MT_AUTO)); return devices; } diff --git a/sound/softsynth/pcspk.cpp b/sound/softsynth/pcspk.cpp index fae2b7eef3..bdf9f112e8 100644 --- a/sound/softsynth/pcspk.cpp +++ b/sound/softsynth/pcspk.cpp @@ -151,7 +151,7 @@ public: MusicDevices PCSpeakerMusicPlugin::getDevices() const { MusicDevices devices; - devices.push_back(MusicDevice(this, _s(""), MT_PCSPK)); + devices.push_back(MusicDevice(this, "", MT_PCSPK)); return devices; } @@ -170,7 +170,7 @@ public: MusicDevices PCjrMusicPlugin::getDevices() const { MusicDevices devices; - devices.push_back(MusicDevice(this, _s(""), MT_PCJR)); + devices.push_back(MusicDevice(this, "", MT_PCJR)); return devices; } -- cgit v1.2.3 From 691323f16e9661b50e0178046bd3b423bb79dc22 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 26 Jun 2010 15:55:40 +0000 Subject: Fix format string warning svn-id: r50325 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 485319a564..3d43ae3eb2 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -254,7 +254,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } workaround++; } - error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %lx)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); + error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); } return r[index]; } else -- cgit v1.2.3 From 0eb128ee471159cab8e8e4658bcbe98fa0a6b3ad Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 26 Jun 2010 15:55:53 +0000 Subject: Add missing include for translations svn-id: r50326 --- sound/fmopl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/fmopl.cpp b/sound/fmopl.cpp index dea8c5429b..16dc3986d6 100644 --- a/sound/fmopl.cpp +++ b/sound/fmopl.cpp @@ -28,6 +28,7 @@ #include "sound/softsynth/opl/mame.h" #include "common/config-manager.h" +#include "common/translation.h" namespace OPL { -- cgit v1.2.3 From 4102b4a682967d4753cf13e72b30842452988246 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Sat, 26 Jun 2010 15:59:06 +0000 Subject: GUI: Add the catalan translation svn-id: r50327 --- AUTHORS | 3 + gui/credits.h | 3 + po/ca_ES.po | 1449 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/credits.pl | 3 + 4 files changed, 1458 insertions(+) create mode 100644 po/ca_ES.po diff --git a/AUTHORS b/AUTHORS index 0278ff1050..d99651229a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -322,6 +322,9 @@ Other contributions ------------ Thierry Crozat - Translation Lead + Catalan: + Jordi Vilalta Prat + French: Thierry Crozat diff --git a/gui/credits.h b/gui/credits.h index d5607f621e..2f19a4ee9b 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -366,6 +366,9 @@ static const char *credits[] = { "C1""Translations", "C0""Thierry Crozat", "C2""Translation Lead", +"C1""Catalan", +"C0""Jordi Vilalta Prat", +"", "C1""French", "C0""Thierry Crozat", "", diff --git a/po/ca_ES.po b/po/ca_ES.po new file mode 100644 index 0000000000..ba2e4be096 --- /dev/null +++ b/po/ca_ES.po @@ -0,0 +1,1449 @@ +# Catalan translation for ScummVM. +# Copyright (C) 2007-2010 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Jordi Vilalta Prat , 2007-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-26 18:03+0200\n" +"PO-Revision-Date: 2010-06-26 16:45+0100\n" +"Last-Translator: Jordi Vilalta Prat \n" +"Language-Team: Catalan \n" +"Language: Catalan\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gui/about.cpp:96 +#, c-format +msgid "(built on %s)" +msgstr "(compilat el %s)" + +#: gui/about.cpp:103 +msgid "Features compiled in:" +msgstr "Característiques compilades:" + +#: gui/about.cpp:112 +msgid "Available engines:" +msgstr "Motors disponibles:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Amunt" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Torna al nivell de directoris anterior" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "Cancel·la" + +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Escull" + +#: gui/GuiManager.cpp:76 +msgid "Failed to load any GUI theme, aborting" +msgstr "No s'ha pogut carregar cap tema de la interfície d'usuari, avortant" + +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "Tanca" + +#: gui/GuiManager.cpp:105 +msgid "Mouse click" +msgstr "Clic del ratolí" + +#: gui/GuiManager.cpp:108 base/main.cpp:285 +msgid "Display keyboard" +msgstr "Mostra el teclat" + +#: gui/GuiManager.cpp:111 base/main.cpp:288 +msgid "Remap keys" +msgstr "Remapeja les tecles" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "Mapeja" + +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "D'acord" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "Seleccioneu una acció i cliqueu 'Mapeja'" + +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "Tecla associada : %s" + +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "Tecla associada : cap" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "Seleccioneu una acció" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "Premeu la tecla a associar" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "Sel·leccioneu una acció per mapejar" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Joc" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "Identificador:" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Identificador de joc curt utilitzat per referir-se a les partides i per " +"executar el joc des de la línia de comandes" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Nom:" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Títol complet del joc" + +#: gui/launcher.cpp:181 +msgid "Language:" +msgstr "Idioma:" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Idioma del joc. Això no convertirà la vostra versió Espanyola del joc a " +"Anglès" + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: sound/null.cpp:42 +msgid "" +msgstr "" + +#: gui/launcher.cpp:192 +msgid "Platform:" +msgstr "Plataforma:" + +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "Plataforma per la que el joc es va dissenyar originalment" + +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +msgid "Graphics" +msgstr "Gràfics" + +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +msgid "GFX" +msgstr "GFX" + +#: gui/launcher.cpp:206 +msgid "Override global graphic settings" +msgstr "Fer canvis sobre les opcions globals de gràfics" + +#: gui/launcher.cpp:213 gui/options.cpp:890 +msgid "Audio" +msgstr "Àudio" + +#: gui/launcher.cpp:215 +msgid "Override global audio settings" +msgstr "Fer canvis sobre les opcions globals d'àudio" + +#: gui/launcher.cpp:223 gui/options.cpp:894 +msgid "Volume" +msgstr "Volum" + +#: gui/launcher.cpp:225 +msgid "Override global volume settings" +msgstr "Fer canvis sobre les opcions globals de volum" + +#: gui/launcher.cpp:232 gui/options.cpp:902 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:234 +msgid "Override global MIDI settings" +msgstr "Fer canvis sobre les opcions globals de MIDI" + +#: gui/launcher.cpp:244 gui/options.cpp:908 +msgid "Paths" +msgstr "Camins" + +#: gui/launcher.cpp:250 +msgid "Game Path:" +msgstr "Camí del Joc:" + +#: gui/launcher.cpp:254 gui/options.cpp:921 +msgid "Extra Path:" +msgstr "Camí Extra:" + +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "Especifica el camí de dades addicionals utilitzades pel joc" + +#: gui/launcher.cpp:258 +msgid "Save Path:" +msgstr "Camí de les Partides:" + +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 +msgid "Specifies where your savegames are put" +msgstr "Especifica on es desaran les partides" + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 +msgid "None" +msgstr "Cap" + +#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "Per defecte" + +#: gui/launcher.cpp:391 gui/options.cpp:1167 +msgid "Select SoundFont" +msgstr "Seleccioneu el fitxer SoundFont" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Seleccioneu el directori amb les dades del joc" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Seleccioneu el directori addicional del joc" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Seleccioneu el directori de les partides desades" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "" +"Aquest identificador de joc ja està usat. Si us plau, trieu-ne un altre." + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~T~anca" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "Surt de ScummVM" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "~Q~uant a..." + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "Quant a ScummVM" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~O~pcions..." + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "Canvia les opcions globals de ScummVM" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "~I~nicia" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Iniciant el joc seleccionat" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~C~arrega..." + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "Carrega una partida pel joc seleccionat" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "~A~fegeix Joc..." + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "Mantingueu premut Shift per a l'Addició Massiva" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "~E~dita Joc..." + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "Canvia les opcions del joc" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "~S~uprimeix Joc" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "" +"Elimina un joc de la llista. Els fitxers de dades del joc es mantenen " +"intactes" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "Cerca a la llista de jocs" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Cerca:" + +#: gui/launcher.cpp:529 gui/options.cpp:713 +msgid "Clear value" +msgstr "Neteja el valor" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Carrega partida:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "Carrega" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Esteu segur que voleu executar el detector massiu de jocs? Això pot afegir " +"una gran quantitat de jocs." + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "Sí" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "No" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM no ha pogut obrir el directori especificat!" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM no ha pogut trobar cap joc al directori especificat!" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Seleccioneu el joc:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Realment voleu suprimir la configuració d'aquest joc?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "Aquest joc no suporta la càrrega de partides des del llançador." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "" +"ScummVM no ha pogut trobar cap motor capaç d'executar el joc seleccionat!" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Addició Massiva..." + +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Afegeix Joc..." + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... progrés ..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "S'ha acabat la cerca!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "S'han descobert %d jocs nous." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "S'han cercat %d directoris ..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "S'han descobert %d jocs nous ..." + +#: gui/options.cpp:78 +msgid "Never" +msgstr "Mai" + +#: gui/options.cpp:78 +msgid "every 5 mins" +msgstr "cada 5 minuts" + +#: gui/options.cpp:78 +msgid "every 10 mins" +msgstr "cada 10 minuts" + +#: gui/options.cpp:78 +msgid "every 15 mins" +msgstr "cada 15 minuts" + +#: gui/options.cpp:78 +msgid "every 30 mins" +msgstr "cada 30 minuts" + +#: gui/options.cpp:80 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:80 +msgid "11kHz" +msgstr "11kHz" + +#: gui/options.cpp:80 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:80 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:80 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:620 +msgid "Graphics mode:" +msgstr "Mode gràfic:" + +#: gui/options.cpp:631 +msgid "Render mode:" +msgstr "Mode de pintat:" + +#: gui/options.cpp:631 gui/options.cpp:632 +msgid "Special dithering modes supported by some games" +msgstr "Modes de dispersió especials suportats per alguns jocs" + +#: gui/options.cpp:641 +msgid "Fullscreen mode" +msgstr "Mode pantalla completa" + +#: gui/options.cpp:644 +msgid "Aspect ratio correction" +msgstr "Correcció del rati d'aspecte" + +#: gui/options.cpp:644 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Corregeix la relació d'aspecte per jocs de 320x200" + +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "Dispositiu Preferit:" + +#: gui/options.cpp:651 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit" + +#: gui/options.cpp:652 +msgid "Specifies output sound device or sound card emulator" +msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" + +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "Dispositiu MT32:" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" +"LAPC1/CM32l/CM64" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "Dispositiu GM:" + +#: gui/options.cpp:656 +msgid "Specifies default sound device for General MIDI output" +msgstr "" +"Especifica el dispositiu de so per defecte per a la sortida General MIDI" + +#: gui/options.cpp:688 +msgid "AdLib emulator:" +msgstr "Emulador d'AdLib:" + +#: gui/options.cpp:688 gui/options.cpp:689 +msgid "AdLib is used for music in many games" +msgstr "AdLib s'utilitza per la música de molts jocs" + +#: gui/options.cpp:699 +msgid "Output rate:" +msgstr "Freqüència de sortida:" + +#: gui/options.cpp:699 gui/options.cpp:700 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Valors més alts especifiquen millor qualitat de so però pot ser que la " +"vostra tarja de so no ho suporti" + +#: gui/options.cpp:711 +msgid "SoundFont:" +msgstr "Fitxer SoundFont:" + +#: gui/options.cpp:711 gui/options.cpp:712 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" + +#: gui/options.cpp:716 +msgid "Mixed AdLib/MIDI mode" +msgstr "Mode combinat AdLib/MIDI" + +#: gui/options.cpp:716 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Utilitza MIDI i la generació de so AdLib alhora" + +#: gui/options.cpp:719 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Roland MT-32 real (desactiva l'emulació GM)" + +#: gui/options.cpp:719 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " +"compatible amb Roland connectat al vostre ordinador" + +#: gui/options.cpp:722 +msgid "Enable Roland GS Mode" +msgstr "Activa el Mode Roland GS" + +#: gui/options.cpp:722 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a " +"Roland MT-32" + +#: gui/options.cpp:725 +msgid "MIDI gain:" +msgstr "Guany MIDI:" + +#: gui/options.cpp:738 +msgid "Text and Speech:" +msgstr "Text i Veus:" + +#: gui/options.cpp:743 gui/options.cpp:749 +msgid "Speech" +msgstr "Veus" + +#: gui/options.cpp:744 gui/options.cpp:750 +msgid "Subtitles" +msgstr "Subtítols" + +#: gui/options.cpp:745 gui/options.cpp:751 +msgid "Both" +msgstr "Ambdós" + +#: gui/options.cpp:749 +msgid "Spch" +msgstr "Veus" + +#: gui/options.cpp:750 +msgid "Subs" +msgstr "Subt" + +#: gui/options.cpp:751 +msgid "Show subtitles and play speech" +msgstr "Mostra els subtítols i reprodueix la veu" + +#: gui/options.cpp:755 +msgid "Subtitle speed:" +msgstr "Velocitat dels subtítols:" + +#: gui/options.cpp:767 +msgid "Music volume:" +msgstr "Volum de la música:" + +#: gui/options.cpp:774 +msgid "Mute All" +msgstr "Silenciar tot" + +#: gui/options.cpp:777 +msgid "SFX volume:" +msgstr "Volum dels efectes:" + +#: gui/options.cpp:777 gui/options.cpp:778 +msgid "Special sound effects volume" +msgstr "Volum dels sons d'efectes especials" + +#: gui/options.cpp:784 +msgid "Speech volume:" +msgstr "Volum de la veu:" + +#: gui/options.cpp:915 +msgid "Save Path: " +msgstr "Camí de les Partides: " + +#: gui/options.cpp:918 +msgid "Theme Path:" +msgstr "Camí dels Temes:" + +#: gui/options.cpp:921 gui/options.cpp:922 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "" +"Especifica el camí de les dades addicionals utilitzades per tots els jocs o " +"pel ScummVM" + +#: gui/options.cpp:925 +msgid "Plugins Path:" +msgstr "Camí dels connectors:" + +#: gui/options.cpp:930 +msgid "Misc" +msgstr "Misc" + +#: gui/options.cpp:932 +msgid "Theme:" +msgstr "Tema:" + +#: gui/options.cpp:936 +msgid "GUI Renderer:" +msgstr "Mode de pintat de la interfície d'usuari:" + +#: gui/options.cpp:942 +msgid "Autosave:" +msgstr "Desat automàtic:" + +#: gui/options.cpp:950 +msgid "Keys" +msgstr "Tecles" + +#: gui/options.cpp:957 +msgid "GUI Language:" +msgstr "Idioma de la interfície d'usuari:" + +#: gui/options.cpp:957 +msgid "Language of ScummVM GUI" +msgstr "Idioma de la interfície d'usuari de ScummVM" + +#: gui/options.cpp:962 +msgid "English" +msgstr "Anglès" + +#: gui/options.cpp:1106 +msgid "You have to restart ScummVM to take the effect." +msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte." + +#: gui/options.cpp:1119 +msgid "Select directory for savegames" +msgstr "Seleccioneu el directori de les partides desades" + +#: gui/options.cpp:1126 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" +"No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un " +"altre." + +#: gui/options.cpp:1135 +msgid "Select directory for GUI themes" +msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari" + +#: gui/options.cpp:1145 +msgid "Select directory for extra files" +msgstr "Seleccioneu el directori dels fitxers extra" + +#: gui/options.cpp:1156 +msgid "Select directory for plugins" +msgstr "Seleccioneu el directori dels connectors" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "No hi ha data desada" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "No hi ha hora desada" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "No hi ha temps de joc desat" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "Suprimeix" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Realment voleu suprimir aquesta partida?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Data: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Hora: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Temps de joc: " + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Partida sense títol" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Seleccioneu un Tema" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "GFX desactivats" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Pintat estàndard (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Pintat amb antialias (16bpp)" + +#: base/main.cpp:106 +#, fuzzy, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "" +"L'usuari ha seleccionat el target '%s' (identificador de joc '%s')...\n" + +#: base/main.cpp:107 +msgid " Looking for a plugin supporting this gameid... " +msgstr " Cercant un connector que suporti aquest identificador de joc... " + +#: base/main.cpp:111 +msgid "failed\n" +msgstr "ha fallat\n" + +#: base/main.cpp:112 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" +"%s és un identificador de joc invàlid. Utilitzeu l'opció --list-games per " +"llistar els identificadors de joc suportats" + +#: base/main.cpp:119 +#, c-format +msgid " Starting '%s'\n" +msgstr " Iniciant '%s'\n" + +#: base/main.cpp:148 +#, fuzzy, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "%s ha fallat l'iniciat del motor: %s (target '%s', camí '%s')" + +#: base/main.cpp:205 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "El motor no suporta el nivell de depuració '%s'" + +#: base/main.cpp:273 +msgid "Menu" +msgstr "Menú" + +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "Salta" + +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "Pausa" + +#: base/main.cpp:282 +msgid "Skip line" +msgstr "Salta la línia" + +#: base/main.cpp:404 +msgid "Error running game:" +msgstr "Error al executar el joc:" + +#: base/main.cpp:430 base/main.cpp:431 +msgid "Could not find any engine capable of running the selected game" +msgstr "No s'ha pogut trobar cap motor capaç d'executar el joc seleccionat" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Camí incorrecte" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "No s'han trobat les dades del joc" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "Identificador de joc no suportat" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Mode de color no suportat" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "S'ha denegat el permís de lectura" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "S'ha denegat el permís d'escriptura" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "El camí no existeix" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "El camí no és un directori" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "El camí no és un fitxer" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "No s'ha pogut crear el fitxer" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Ha fallat la lectura" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Ha fallat l'escriptura de dades" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "Error desconegut" + +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "Hercules Verd" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "Hercules Àmbar" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "~C~ontinua" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "C~a~rrega" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~D~esa" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~O~pcions" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~A~juda" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "~Q~uant a" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "~R~etorna al Llançador" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Desa la partida:" + +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Desa" + +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~D~'acord" + +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "~C~ancel·la" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~T~ecles" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~A~nterior" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~S~egüent" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~T~anca" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "Mode ~Z~ip activat" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "~T~ransicions activades" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "~E~fecte de l'aigua activat" + +#: sound/fmopl.cpp:50 +msgid "MAME OPL emulator" +msgstr "Emulador OPL de MAME" + +#: sound/fmopl.cpp:52 +msgid "DOSBox OPL emulator" +msgstr "Emulador OPL de DOSBox" + +#: sound/null.h:45 +msgid "No music" +msgstr "Sense música" + +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" +msgstr "Emulador d'AdLib" + +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" +msgstr "Iniciant l'Emulador de MT-32" + +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" +msgstr "Emulador de MT-32" + +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "Emulador d'Altaveu de PC" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" +msgstr "Emulador d'IBM PCjr" + +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" +msgstr "Emulador de FM Towns" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "Mapa de teclat:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr " (Actiu)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr " (Global)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr " (Joc)" + +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "MIDI de Windows" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "Menú Principal de ScummVM" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "Mode ~e~squerrà" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "Controls de lluita de l'~I~ndy" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "Mostra el cursor del ratolí" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "Desplaçament X del toc" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "Desplaçament Y del toc" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "Utilitza el control del cursor a l'estil del trackpad dels portàtils" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "Toc per a clic esquerre, doble toc per a clic dret" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "Sensibilitat" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "Escalat inicial de la pantalla superior:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "Escalat de la pantalla principal:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "Escalat per hardware (ràpid, però de baixa qualitat)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "Escalat per software (bona qualitat, però més lent)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "Sense escalar (haureu de desplaçar-vos a esquerra i dreta)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "Brillantor:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "Alta qualitat d'àudio (més lent) (reiniciar)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "Desactiva l'apagat automàtic" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "Mode Touchpad activat." + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "Mode Touchpad desactivat." + +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "Normal (sense escalar)" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "Amunt" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "Avall" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "Esquerra" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "Dreta" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "Clic esquerre" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "Clic dret" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "Zona" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "Funció Múltiple" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "Commuta el personatge" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "Salta el text" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "Mode ràpid" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Surt" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "Depurador" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "Menú global" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "Teclat virtual" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "Mapejador de tecles" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "Vols sortir?" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Vídeo" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Mode de vídeo actual:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Entrada" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "Sensibilitat del Pad GC:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "Acceleració del Pad GC:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "Estat:" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Desconegut" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "Munta el DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "Desmunta el DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Servidor:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "Compartició:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Nom d'usuari:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Contrasenya:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Inicia la xarxa" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "Munta SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "Desmunta SMB" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "El DVD s'ha muntat satisfactòriament" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "Error al muntar el DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "El DVD no està muntat" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "Xarxa activa, compartició muntada" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "Xarxa activa" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr ", error al muntar la compartició" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr ", compartició no muntada" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "Xarxa inactiva" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "Iniciant la xarxa" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "Xarxa no iniciada (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "Oculta la barra d'eines" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "Mostra el teclat" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "So engegat/parat" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "Clic dret" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "Mostra/Oculta el cursor" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "Vista lliure" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "Amplia" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "Redueix" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "Mapeja tecles" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "Cursor Amunt" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "Cursor Avall" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "Cursor Esquerra" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "Cursor Dreta" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "Voleu carregar o desar el joc?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "Teclat" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "Rotar" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "Utilitzant el controlador SDL " + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "Pantalla" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "Voleu fer una cerca automàtica?" + +#~ msgid "Chinese (Taiwan)" +#~ msgstr "Xinès (Taiwan)" + +#~ msgid "Czech" +#~ msgstr "Txec" + +#~ msgid "Dutch" +#~ msgstr "Danès" + +#~ msgid "English (GB)" +#~ msgstr "Anglès (GB)" + +#~ msgid "English (US)" +#~ msgstr "Anglès (EUA)" + +#~ msgid "French" +#~ msgstr "Francès" + +#~ msgid "German" +#~ msgstr "Alemany" + +#~ msgid "Hebrew" +#~ msgstr "Hebreu" + +#~ msgid "Italian" +#~ msgstr "Italià" + +#~ msgid "Japanese" +#~ msgstr "Japonès" + +#~ msgid "Korean" +#~ msgstr "Coreà" + +#~ msgid "Polish" +#~ msgstr "Polac" + +#~ msgid "Portuguese" +#~ msgstr "Portuguès" + +#~ msgid "Russian" +#~ msgstr "Rus" + +#~ msgid "Spanish" +#~ msgstr "Espanyol" + +#~ msgid "Swedish" +#~ msgstr "Suís" + +#~ msgid "Failed to load MT32_CONTROL.ROM" +#~ msgstr "No s'ha pogut carregar el fitxer MT32_CONTROL.ROM" + +#~ msgid "Failed to load MT32_PCM.ROM" +#~ msgstr "No s'ha pogut carregar el fitxer MT32_PCM.ROM" diff --git a/tools/credits.pl b/tools/credits.pl index 49b526c66b..6109969834 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -859,6 +859,9 @@ begin_credits("Credits"); begin_persons(); add_person("Thierry Crozat", "criezy", "Translation Lead"); end_persons(); + begin_section("Catalan"); + add_person("Jordi Vilalta Prat", "jvprat", ""); + end_section(); begin_section("French"); add_person("Thierry Crozat", "criezy", ""); end_section(); -- cgit v1.2.3 From 8008e09ea39e650e533fe49928ba7d75d16dafab Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Sat, 26 Jun 2010 16:02:40 +0000 Subject: GUI: Update translations after the last message changes svn-id: r50328 --- common/messages.cpp | 2582 +++++++++++++++++++++++++++++---------------------- po/POTFILES | 8 +- po/ca_ES.po | 8 +- po/de_DE.po | 201 ++-- po/fr_FR.po | 201 ++-- po/hu_HU.po | 192 ++-- po/ru_RU.po | 207 +++-- po/scummvm.pot | 186 ++-- 8 files changed, 2044 insertions(+), 1541 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 2d6aa510a3..4b31776db7 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -10,49 +10,49 @@ static const char * const _messageIds[] = { /* 6 */ " (Global)", /* 7 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", /* 8 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", - /* 9 */ ", error while mounting the share", - /* 10 */ ", share not mounted", - /* 11 */ "... progress ...", - /* 12 */ "11kHz", - /* 13 */ "22 kHz", - /* 14 */ "44 kHz", - /* 15 */ "48 kHz", - /* 16 */ "8 kHz", - /* 17 */ "", - /* 18 */ "About ScummVM", - /* 19 */ "AdLib Emulator", - /* 20 */ "AdLib emulator:", - /* 21 */ "AdLib is used for music in many games", - /* 22 */ "Add Game...", - /* 23 */ "Antialiased Renderer (16bpp)", - /* 24 */ "Aspect ratio correction", - /* 25 */ "Associated key : %s", - /* 26 */ "Associated key : none", - /* 27 */ "Audio", - /* 28 */ "Autosave:", - /* 29 */ "A~b~out...", - /* 30 */ "Bind Keys", - /* 31 */ "Both", - /* 32 */ "Brightness:", - /* 33 */ "C1Available engines:", - /* 34 */ "C1Features compiled in:", - /* 35 */ "C2(built on ", - /* 36 */ "Cancel", - /* 37 */ "Cannot create file", - /* 38 */ "Change game options", - /* 39 */ "Change global ScummVM options", - /* 40 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", - /* 41 */ "Choose", - /* 42 */ "Choose an action to map", - /* 43 */ "Clear value", - /* 44 */ "Close", - /* 45 */ "Correct aspect ratio for 320x200 games", - /* 46 */ "Could not find any engine capable of running the selected game", - /* 47 */ "Current video mode:", - /* 48 */ "Cursor Down", - /* 49 */ "Cursor Left", - /* 50 */ "Cursor Right", - /* 51 */ "Cursor Up", + /* 9 */ "(built on %s)", + /* 10 */ ", error while mounting the share", + /* 11 */ ", share not mounted", + /* 12 */ "... progress ...", + /* 13 */ "11kHz", + /* 14 */ "22 kHz", + /* 15 */ "44 kHz", + /* 16 */ "48 kHz", + /* 17 */ "8 kHz", + /* 18 */ "", + /* 19 */ "About ScummVM", + /* 20 */ "AdLib Emulator", + /* 21 */ "AdLib emulator:", + /* 22 */ "AdLib is used for music in many games", + /* 23 */ "Add Game...", + /* 24 */ "Antialiased Renderer (16bpp)", + /* 25 */ "Aspect ratio correction", + /* 26 */ "Associated key : %s", + /* 27 */ "Associated key : none", + /* 28 */ "Audio", + /* 29 */ "Autosave:", + /* 30 */ "Available engines:", + /* 31 */ "A~b~out...", + /* 32 */ "Bind Keys", + /* 33 */ "Both", + /* 34 */ "Brightness:", + /* 35 */ "Cancel", + /* 36 */ "Cannot create file", + /* 37 */ "Change game options", + /* 38 */ "Change global ScummVM options", + /* 39 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 40 */ "Choose", + /* 41 */ "Choose an action to map", + /* 42 */ "Clear value", + /* 43 */ "Close", + /* 44 */ "Correct aspect ratio for 320x200 games", + /* 45 */ "Could not find any engine capable of running the selected game", + /* 46 */ "Current video mode:", + /* 47 */ "Cursor Down", + /* 48 */ "Cursor Left", + /* 49 */ "Cursor Right", + /* 50 */ "Cursor Up", + /* 51 */ "DOSBox OPL emulator", /* 52 */ "DVD", /* 53 */ "DVD Mounted successfully", /* 54 */ "DVD not mounted", @@ -83,237 +83,244 @@ static const char * const _messageIds[] = { /* 79 */ "FM Towns Emulator", /* 80 */ "Failed to load any GUI theme, aborting", /* 81 */ "Fast mode", - /* 82 */ "Free look", - /* 83 */ "Full title of the game", - /* 84 */ "Fullscreen mode", - /* 85 */ "GC Pad acceleration:", - /* 86 */ "GC Pad sensitivity:", - /* 87 */ "GFX", - /* 88 */ "GM Device:", - /* 89 */ "GUI Language:", - /* 90 */ "GUI Renderer:", - /* 91 */ "Game", - /* 92 */ "Game Data not found", - /* 93 */ "Game Id not supported", - /* 94 */ "Game Path:", - /* 95 */ "Global menu", - /* 96 */ "Go to previous directory level", - /* 97 */ "Go up", - /* 98 */ "Graphics", - /* 99 */ "Graphics mode:", - /* 100 */ "Hardware scale (fast, but low quality)", - /* 101 */ "Hide Toolbar", - /* 102 */ "High quality audio (slower) (reboot)", - /* 103 */ "Higher value specifies better sound quality but may be not supported by your soundcard", - /* 104 */ "Hold Shift for Mass Add", - /* 105 */ "Horizontal underscan:", - /* 106 */ "ID:", - /* 107 */ "Init network", - /* 108 */ "Initial top screen scale:", - /* 109 */ "Initialising MT-32 Emulator", - /* 110 */ "Initialising network", - /* 111 */ "Input", - /* 112 */ "Invalid Path", - /* 113 */ "Key mapper", - /* 114 */ "Keyboard", - /* 115 */ "Keymap:", - /* 116 */ "Keys", - /* 117 */ "Language of ScummVM GUI", - /* 118 */ "Language of the game. This will not turn your Spanish game version into English", - /* 119 */ "Language:", - /* 120 */ "Left", - /* 121 */ "Left Click", - /* 122 */ "Load", - /* 123 */ "Load game:", - /* 124 */ "Load savegame for selected game", - /* 125 */ "MIDI", - /* 126 */ "MIDI gain:", - /* 127 */ "MT-32 Emulator", - /* 128 */ "MT32 Device:", - /* 129 */ "Main screen scaling:", - /* 130 */ "Map", - /* 131 */ "Mass Add...", - /* 132 */ "Menu", - /* 133 */ "Misc", - /* 134 */ "Mixed AdLib/MIDI mode", - /* 135 */ "Mount DVD", - /* 136 */ "Mount SMB", - /* 137 */ "Mouse click", - /* 138 */ "Multi Function", - /* 139 */ "Music volume:", - /* 140 */ "Mute All", - /* 141 */ "Name:", - /* 142 */ "Network down", - /* 143 */ "Network not initialsed (%d)", - /* 144 */ "Network up", - /* 145 */ "Network up, share mounted", - /* 146 */ "Never", - /* 147 */ "No", - /* 148 */ "No date saved", - /* 149 */ "No music", - /* 150 */ "No playtime saved", - /* 151 */ "No time saved", - /* 152 */ "None", - /* 153 */ "OK", - /* 154 */ "Ok", - /* 155 */ "Output rate:", - /* 156 */ "Override global MIDI settings", - /* 157 */ "Override global audio settings", - /* 158 */ "Override global graphic settings", - /* 159 */ "Override global volume settings", - /* 160 */ "Password:", - /* 161 */ "Path not a directory", - /* 162 */ "Path not a file", - /* 163 */ "Path not exists", - /* 164 */ "Paths", - /* 165 */ "Pause", - /* 166 */ "Pick the game:", - /* 167 */ "Platform the game was originally designed for", - /* 168 */ "Platform:", - /* 169 */ "Playtime: ", - /* 170 */ "Please select an action", - /* 171 */ "Plugins Path:", - /* 172 */ "Preferred Device:", - /* 173 */ "Press the key to associate", - /* 174 */ "Quit", - /* 175 */ "Quit ScummVM", - /* 176 */ "Read permission denied", - /* 177 */ "Reading failed", - /* 178 */ "Remap keys", - /* 179 */ "Remove game from the list. The game data files stay intact", - /* 180 */ "Render mode:", - /* 181 */ "Right", - /* 182 */ "Right Click", - /* 183 */ "Right click", - /* 184 */ "Rotate", - /* 185 */ "SFX volume:", - /* 186 */ "SMB", - /* 187 */ "Save", - /* 188 */ "Save Path:", - /* 189 */ "Save Path: ", - /* 190 */ "Save game:", - /* 191 */ "Scan complete!", - /* 192 */ "Scanned %d directories ...", - /* 193 */ "ScummVM Main Menu", - /* 194 */ "ScummVM could not find any engine capable of running the selected game!", - /* 195 */ "ScummVM could not find any game in the specified directory!", - /* 196 */ "ScummVM couldn't open the specified directory!", - /* 197 */ "Search in game list", - /* 198 */ "Search:", - /* 199 */ "Select SoundFont", - /* 200 */ "Select a Theme", - /* 201 */ "Select additional game directory", - /* 202 */ "Select an action and click 'Map'", - /* 203 */ "Select directory for GUI themes", - /* 204 */ "Select directory for extra files", - /* 205 */ "Select directory for plugins", - /* 206 */ "Select directory for saved games", - /* 207 */ "Select directory for savegames", - /* 208 */ "Select directory with game data", - /* 209 */ "Sensitivity", - /* 210 */ "Server:", - /* 211 */ "Share:", - /* 212 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 213 */ "Show Keyboard", - /* 214 */ "Show mouse cursor", - /* 215 */ "Show subtitles and play speech", - /* 216 */ "Show/Hide Cursor", - /* 217 */ "Skip", - /* 218 */ "Skip line", - /* 219 */ "Skip text", - /* 220 */ "Snap to edges", - /* 221 */ "Software scale (good quality, but slower)", - /* 222 */ "Sound on/off", - /* 223 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 224 */ "SoundFont:", - /* 225 */ "Spch", - /* 226 */ "Special dithering modes supported by some games", - /* 227 */ "Special sound effects volume", - /* 228 */ "Specifies default sound device for General Midi output", - /* 229 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", - /* 230 */ "Specifies output sound device or sound card emulator", - /* 231 */ "Specifies path to additional data used by all games or ScummVM", - /* 232 */ "Specifies path to additional data used the game", - /* 233 */ "Specifies preferred sound device or sound card emulator", - /* 234 */ "Specifies where your savegames are put", - /* 235 */ "Speech", - /* 236 */ "Speech volume:", - /* 237 */ "Standard Renderer (16bpp)", - /* 238 */ "Start selected game", - /* 239 */ "Status:", - /* 240 */ "Subs", - /* 241 */ "Subtitle speed:", - /* 242 */ "Subtitles", - /* 243 */ "Swap character", - /* 244 */ "Tap for left click, double tap right click", - /* 245 */ "Text and Speech:", - /* 246 */ "The chosen directory cannot be written to. Please select another one.", - /* 247 */ "Theme Path:", - /* 248 */ "Theme:", - /* 249 */ "This game ID is already taken. Please choose another one.", - /* 250 */ "This game does not support loading games from the launcher.", - /* 251 */ "Time: ", - /* 252 */ "Timeout while initialising network", - /* 253 */ "Touch X Offset", - /* 254 */ "Touch Y Offset", - /* 255 */ "Touchpad mode disabled.", - /* 256 */ "Touchpad mode enabled.", - /* 257 */ "True Roland MT-32 (disable GM emulation)", - /* 258 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 259 */ "Unknown", - /* 260 */ "Unknown Error", - /* 261 */ "Unmount DVD", - /* 262 */ "Unmount SMB", - /* 263 */ "Unscaled (you must scroll left and right)", - /* 264 */ "Unsupported Color Mode", - /* 265 */ "Untitled savestate", - /* 266 */ "Up", - /* 267 */ "Use both MIDI and AdLib sound generation", - /* 268 */ "Use laptop trackpad-style cursor control", - /* 269 */ "User picked target '%s' (gameid '%s')...\n", - /* 270 */ "Username:", - /* 271 */ "Using SDL driver ", - /* 272 */ "Vertical underscan:", - /* 273 */ "Video", - /* 274 */ "Virtual keyboard", - /* 275 */ "Volume", - /* 276 */ "Write permission denied", - /* 277 */ "Writing data failed", - /* 278 */ "Yes", - /* 279 */ "You have to restart ScummVM to take the effect.", - /* 280 */ "Zone", - /* 281 */ "Zoom down", - /* 282 */ "Zoom up", - /* 283 */ "every 10 mins", - /* 284 */ "every 15 mins", - /* 285 */ "every 30 mins", - /* 286 */ "every 5 mins", - /* 287 */ "failed\n", - /* 288 */ "~A~bout", - /* 289 */ "~A~dd Game...", - /* 290 */ "~C~ancel", - /* 291 */ "~C~lose", - /* 292 */ "~E~dit Game...", - /* 293 */ "~H~elp", - /* 294 */ "~I~ndy fight controls", - /* 295 */ "~K~eys", - /* 296 */ "~L~eft handed mode", - /* 297 */ "~L~oad", - /* 298 */ "~L~oad...", - /* 299 */ "~N~ext", - /* 300 */ "~O~K", - /* 301 */ "~O~ptions", - /* 302 */ "~O~ptions...", - /* 303 */ "~P~revious", - /* 304 */ "~Q~uit", - /* 305 */ "~R~emove Game", - /* 306 */ "~R~esume", - /* 307 */ "~R~eturn to Launcher", - /* 308 */ "~S~ave", - /* 309 */ "~S~tart", - /* 310 */ "~T~ransitions Enabled", - /* 311 */ "~W~ater Effect Enabled", - /* 312 */ "~Z~ip Mode Activated", + /* 82 */ "Features compiled in:", + /* 83 */ "Free look", + /* 84 */ "Full title of the game", + /* 85 */ "Fullscreen mode", + /* 86 */ "GC Pad acceleration:", + /* 87 */ "GC Pad sensitivity:", + /* 88 */ "GFX", + /* 89 */ "GM Device:", + /* 90 */ "GUI Language:", + /* 91 */ "GUI Renderer:", + /* 92 */ "Game", + /* 93 */ "Game Data not found", + /* 94 */ "Game Id not supported", + /* 95 */ "Game Path:", + /* 96 */ "Global menu", + /* 97 */ "Go to previous directory level", + /* 98 */ "Go up", + /* 99 */ "Graphics", + /* 100 */ "Graphics mode:", + /* 101 */ "Hardware scale (fast, but low quality)", + /* 102 */ "Hercules Amber", + /* 103 */ "Hercules Green", + /* 104 */ "Hide Toolbar", + /* 105 */ "High quality audio (slower) (reboot)", + /* 106 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 107 */ "Hold Shift for Mass Add", + /* 108 */ "Horizontal underscan:", + /* 109 */ "IBM PCjr Emulator", + /* 110 */ "ID:", + /* 111 */ "Init network", + /* 112 */ "Initial top screen scale:", + /* 113 */ "Initialising MT-32 Emulator", + /* 114 */ "Initialising network", + /* 115 */ "Input", + /* 116 */ "Invalid Path", + /* 117 */ "Key mapper", + /* 118 */ "Keyboard", + /* 119 */ "Keymap:", + /* 120 */ "Keys", + /* 121 */ "Language of ScummVM GUI", + /* 122 */ "Language of the game. This will not turn your Spanish game version into English", + /* 123 */ "Language:", + /* 124 */ "Left", + /* 125 */ "Left Click", + /* 126 */ "Load", + /* 127 */ "Load game:", + /* 128 */ "Load savegame for selected game", + /* 129 */ "MAME OPL emulator", + /* 130 */ "MIDI", + /* 131 */ "MIDI gain:", + /* 132 */ "MT-32 Emulator", + /* 133 */ "MT32 Device:", + /* 134 */ "Main screen scaling:", + /* 135 */ "Map", + /* 136 */ "Mass Add...", + /* 137 */ "Menu", + /* 138 */ "Misc", + /* 139 */ "Mixed AdLib/MIDI mode", + /* 140 */ "Mount DVD", + /* 141 */ "Mount SMB", + /* 142 */ "Mouse click", + /* 143 */ "Multi Function", + /* 144 */ "Music volume:", + /* 145 */ "Mute All", + /* 146 */ "Name:", + /* 147 */ "Network down", + /* 148 */ "Network not initialsed (%d)", + /* 149 */ "Network up", + /* 150 */ "Network up, share mounted", + /* 151 */ "Never", + /* 152 */ "No", + /* 153 */ "No date saved", + /* 154 */ "No music", + /* 155 */ "No playtime saved", + /* 156 */ "No time saved", + /* 157 */ "None", + /* 158 */ "Normal (no scaling)", + /* 159 */ "OK", + /* 160 */ "Output rate:", + /* 161 */ "Override global MIDI settings", + /* 162 */ "Override global audio settings", + /* 163 */ "Override global graphic settings", + /* 164 */ "Override global volume settings", + /* 165 */ "PC Speaker Emulator", + /* 166 */ "Password:", + /* 167 */ "Path not a directory", + /* 168 */ "Path not a file", + /* 169 */ "Path not exists", + /* 170 */ "Paths", + /* 171 */ "Pause", + /* 172 */ "Pick the game:", + /* 173 */ "Platform the game was originally designed for", + /* 174 */ "Platform:", + /* 175 */ "Playtime: ", + /* 176 */ "Please select an action", + /* 177 */ "Plugins Path:", + /* 178 */ "Preferred Device:", + /* 179 */ "Press the key to associate", + /* 180 */ "Quit", + /* 181 */ "Quit ScummVM", + /* 182 */ "Read permission denied", + /* 183 */ "Reading failed", + /* 184 */ "Remap keys", + /* 185 */ "Remove game from the list. The game data files stay intact", + /* 186 */ "Render mode:", + /* 187 */ "Right", + /* 188 */ "Right Click", + /* 189 */ "Right click", + /* 190 */ "Rotate", + /* 191 */ "SFX volume:", + /* 192 */ "SMB", + /* 193 */ "Save", + /* 194 */ "Save Path:", + /* 195 */ "Save Path: ", + /* 196 */ "Save game:", + /* 197 */ "Scan complete!", + /* 198 */ "Scanned %d directories ...", + /* 199 */ "ScummVM Main Menu", + /* 200 */ "ScummVM could not find any engine capable of running the selected game!", + /* 201 */ "ScummVM could not find any game in the specified directory!", + /* 202 */ "ScummVM couldn't open the specified directory!", + /* 203 */ "Search in game list", + /* 204 */ "Search:", + /* 205 */ "Select SoundFont", + /* 206 */ "Select a Theme", + /* 207 */ "Select additional game directory", + /* 208 */ "Select an action and click 'Map'", + /* 209 */ "Select directory for GUI themes", + /* 210 */ "Select directory for extra files", + /* 211 */ "Select directory for plugins", + /* 212 */ "Select directory for saved games", + /* 213 */ "Select directory for savegames", + /* 214 */ "Select directory with game data", + /* 215 */ "Sensitivity", + /* 216 */ "Server:", + /* 217 */ "Share:", + /* 218 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 219 */ "Show Keyboard", + /* 220 */ "Show mouse cursor", + /* 221 */ "Show subtitles and play speech", + /* 222 */ "Show/Hide Cursor", + /* 223 */ "Skip", + /* 224 */ "Skip line", + /* 225 */ "Skip text", + /* 226 */ "Snap to edges", + /* 227 */ "Software scale (good quality, but slower)", + /* 228 */ "Sound on/off", + /* 229 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 230 */ "SoundFont:", + /* 231 */ "Spch", + /* 232 */ "Special dithering modes supported by some games", + /* 233 */ "Special sound effects volume", + /* 234 */ "Specifies default sound device for General MIDI output", + /* 235 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", + /* 236 */ "Specifies output sound device or sound card emulator", + /* 237 */ "Specifies path to additional data used by all games or ScummVM", + /* 238 */ "Specifies path to additional data used the game", + /* 239 */ "Specifies preferred sound device or sound card emulator", + /* 240 */ "Specifies where your savegames are put", + /* 241 */ "Speech", + /* 242 */ "Speech volume:", + /* 243 */ "Standard Renderer (16bpp)", + /* 244 */ "Start selected game", + /* 245 */ "Status:", + /* 246 */ "Subs", + /* 247 */ "Subtitle speed:", + /* 248 */ "Subtitles", + /* 249 */ "Swap character", + /* 250 */ "Tap for left click, double tap right click", + /* 251 */ "Text and Speech:", + /* 252 */ "The chosen directory cannot be written to. Please select another one.", + /* 253 */ "Theme Path:", + /* 254 */ "Theme:", + /* 255 */ "This game ID is already taken. Please choose another one.", + /* 256 */ "This game does not support loading games from the launcher.", + /* 257 */ "Time: ", + /* 258 */ "Timeout while initialising network", + /* 259 */ "Touch X Offset", + /* 260 */ "Touch Y Offset", + /* 261 */ "Touchpad mode disabled.", + /* 262 */ "Touchpad mode enabled.", + /* 263 */ "True Roland MT-32 (disable GM emulation)", + /* 264 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 265 */ "Unknown", + /* 266 */ "Unknown Error", + /* 267 */ "Unmount DVD", + /* 268 */ "Unmount SMB", + /* 269 */ "Unscaled (you must scroll left and right)", + /* 270 */ "Unsupported Color Mode", + /* 271 */ "Untitled savestate", + /* 272 */ "Up", + /* 273 */ "Use both MIDI and AdLib sound generation", + /* 274 */ "Use laptop trackpad-style cursor control", + /* 275 */ "User picked target '%s' (gameid '%s')...\n", + /* 276 */ "Username:", + /* 277 */ "Using SDL driver ", + /* 278 */ "Vertical underscan:", + /* 279 */ "Video", + /* 280 */ "Virtual keyboard", + /* 281 */ "Volume", + /* 282 */ "Windows MIDI", + /* 283 */ "Write permission denied", + /* 284 */ "Writing data failed", + /* 285 */ "Yes", + /* 286 */ "You have to restart ScummVM to take the effect.", + /* 287 */ "Zone", + /* 288 */ "Zoom down", + /* 289 */ "Zoom up", + /* 290 */ "every 10 mins", + /* 291 */ "every 15 mins", + /* 292 */ "every 30 mins", + /* 293 */ "every 5 mins", + /* 294 */ "failed\n", + /* 295 */ "~A~bout", + /* 296 */ "~A~dd Game...", + /* 297 */ "~C~ancel", + /* 298 */ "~C~lose", + /* 299 */ "~E~dit Game...", + /* 300 */ "~H~elp", + /* 301 */ "~I~ndy fight controls", + /* 302 */ "~K~eys", + /* 303 */ "~L~eft handed mode", + /* 304 */ "~L~oad", + /* 305 */ "~L~oad...", + /* 306 */ "~N~ext", + /* 307 */ "~O~K", + /* 308 */ "~O~ptions", + /* 309 */ "~O~ptions...", + /* 310 */ "~P~revious", + /* 311 */ "~Q~uit", + /* 312 */ "~R~emove Game", + /* 313 */ "~R~esume", + /* 314 */ "~R~eturn to Launcher", + /* 315 */ "~S~ave", + /* 316 */ "~S~tart", + /* 317 */ "~T~ransitions Enabled", + /* 318 */ "~W~ater Effect Enabled", + /* 319 */ "~Z~ip Mode Activated", NULL }; @@ -323,7 +330,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, @@ -332,49 +339,48 @@ static const PoMessageEntry _translation_ru_RU[] = { { 6, " (\303\353\356\341\340\353\374\355\340\377)" }, { 7, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, { 8, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, - { 9, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, - { 10, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, - { 11, "... \350\371\363 ..." }, - { 12, "11 \352\303\366" }, - { 13, "22 \352\303\366" }, - { 14, "44 \352\303\366" }, - { 15, "48 \352\303\366" }, - { 16, "8 \352\303\366" }, - { 17, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, - { 18, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 19, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 9, "C2(\361\356\341\360\340\355 " }, + { 10, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, + { 11, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, + { 12, "... \350\371\363 ..." }, + { 13, "11 \352\303\366" }, + { 14, "22 \352\303\366" }, + { 15, "44 \352\303\366" }, + { 16, "48 \352\303\366" }, + { 17, "8 \352\303\366" }, + { 18, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, + { 19, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, { 20, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 21, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 22, "\315\356\342. \350\343\360\340..." }, - { 23, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 24, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 25, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 27, "\300\363\344\350\356" }, - { 28, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 29, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 30, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 31, "\302\361\270" }, - { 32, "\337\360\352\356\361\362\374:" }, - { 33, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 34, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 35, "C2(\361\356\341\360\340\355 " }, - { 36, "\316\362\354\345\355\340" }, - { 37, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 38, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 39, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 40, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 41, "\302\373\341\360\340\362\374" }, - { 42, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 43, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 44, "\307\340\352\360\373\362\374" }, - { 45, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 46, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 47, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, - { 48, "\312\363\360\361\356\360 \342\355\350\347" }, - { 49, "\312\363\360\361\356\360 \342\353\345\342\356" }, - { 50, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, - { 51, "\312\363\360\361\356\360 \342\342\345\360\365" }, + { 21, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 22, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 23, "\315\356\342. \350\343\360\340..." }, + { 24, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 25, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 27, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 28, "\300\363\344\350\356" }, + { 29, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 30, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 31, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 32, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 33, "\302\361\270" }, + { 34, "\337\360\352\356\361\362\374:" }, + { 35, "\316\362\354\345\355\340" }, + { 36, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 37, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 38, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 39, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 40, "\302\373\341\360\340\362\374" }, + { 41, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 42, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 43, "\307\340\352\360\373\362\374" }, + { 44, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 45, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 46, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, + { 47, "\312\363\360\361\356\360 \342\355\350\347" }, + { 48, "\312\363\360\361\356\360 \342\353\345\342\356" }, + { 49, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, + { 50, "\312\363\360\361\356\360 \342\342\345\360\365" }, { 52, "DVD" }, { 53, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, { 54, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, @@ -405,238 +411,242 @@ static const PoMessageEntry _translation_ru_RU[] = { { 79, "FM Towns" }, { 80, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, { 81, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, - { 82, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, - { 83, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 84, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 85, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, - { 86, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, - { 87, "\303\360\364" }, - { 89, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 90, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 91, "\310\343\360\340" }, - { 92, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 93, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 94, "\317\363\362\374 \352 \350\343\360\345: " }, - { 95, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, - { 96, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 97, "\302\342\345\360\365" }, - { 98, "\303\360\340\364\350\352\340" }, - { 99, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 100, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, - { 101, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, - { 102, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, - { 103, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 104, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 105, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, - { 106, "ID:" }, - { 107, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, - { 108, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, - { 109, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 110, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 111, "\302\342\356\344" }, - { 112, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 113, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, - { 114, "\312\353\340\342\350\340\362\363\360\340" }, - { 115, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, - { 116, "\312\353\340\342\350\370\350" }, - { 117, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 118, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 119, "\337\347\373\352:" }, - { 120, "\302\353\345\342\356" }, - { 121, "\313\345\342\373\351 \371\345\353\367\356\352" }, - { 122, "\307\340\343\360\363\347\350\362\374" }, - { 123, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 124, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 125, "MIDI" }, - { 126, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 127, "\335\354\363\353\377\366\350\377 MT-32" }, - { 129, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, - { 130, "\315\340\347\355\340\367\350\362\374" }, - { 131, "\304\356\341. \354\355\356\343\356..." }, - { 132, "\314\345\355\376" }, - { 133, "\320\340\347\355\356\345" }, - { 134, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 135, "\317\356\344\352\353\376\367\350\362\374 DVD" }, - { 136, "\317\356\344\352\353\376\367\350\362\374 SMB" }, - { 137, "\312\353\350\352 \354\373\370\374\376" }, - { 138, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, - { 139, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 140, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 141, "\315\340\347\342\340\355\350\345:" }, - { 142, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, - { 143, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, - { 144, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, - { 145, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, - { 146, "\315\350\352\356\343\344\340" }, - { 147, "\315\345\362" }, - { 148, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 149, "\301\345\347 \354\363\347\373\352\350" }, - { 150, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 151, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 152, "\315\345 \347\340\344\340\355" }, - { 153, "OK" }, - { 154, "Ok" }, - { 155, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 156, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 157, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 158, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 159, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 160, "\317\340\360\356\353\374:" }, - { 161, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 162, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 163, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 164, "\317\363\362\350" }, - { 165, "\317\340\363\347\340" }, - { 166, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 167, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 168, "\317\353\340\362\364\356\360\354\340:" }, - { 169, "\302\360\345\354\377 \350\343\360\373: " }, - { 170, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 171, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 173, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 174, "\302\373\365\356\344" }, - { 175, "\302\373\365\356\344 \350\347 ScummVM" }, - { 176, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 177, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 178, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 179, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 180, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 181, "\302\357\360\340\342\356" }, - { 182, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 183, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 184, "\317\356\342\345\360\355\363\362\374" }, - { 185, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 186, "SMB" }, - { 187, "\307\340\357\350\361\340\362\374" }, - { 188, "\317\363\362\374 \361\356\365\360.: " }, - { 189, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 190, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 191, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 192, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 193, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, - { 194, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 195, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 196, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 197, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 198, "\317\356\350\361\352:" }, - { 199, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 200, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 201, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 202, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 203, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 204, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 205, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 206, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 207, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 208, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 209, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, - { 210, "\321\345\360\342\345\360:" }, - { 211, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, - { 212, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 213, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 214, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, - { 215, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, - { 216, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, - { 217, "\317\360\356\357\363\361\362\350\362\374" }, - { 218, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 219, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, - { 220, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, - { 221, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, - { 222, "\307\342\363\352 \342\352\353/\342\373\352\353" }, - { 223, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, - { 224, "SoundFont:" }, - { 225, "\316\347\342" }, - { 226, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 227, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 228, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 230, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 231, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 232, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 233, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 234, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 235, "\316\347\342\363\367\352\340" }, - { 236, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 237, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 238, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 239, "\321\356\361\362\356\377\355\350\345:" }, - { 240, "\321\363\341" }, - { 241, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 242, "\321\363\341\362\350\362\360\373" }, - { 243, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, - { 244, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, - { 245, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 246, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 247, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 248, "\322\345\354\340:" }, - { 249, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 250, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 251, "\302\360\345\354\377: " }, - { 252, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, - { 253, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, - { 254, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, - { 255, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, - { 256, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, - { 257, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 258, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 259, "\315\345\350\347\342\345\361\362\355\356" }, - { 260, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 261, "\316\362\352\353\376\367\350\362\374 DVD" }, - { 262, "\316\362\352\353\376\367\362\374 SMB" }, - { 263, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, - { 264, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 265, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 266, "\302\342\345\360\365" }, - { 267, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 268, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, - { 269, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 270, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, - { 271, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, - { 272, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, - { 273, "\302\350\344\345\356" }, - { 274, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, - { 275, "\303\360\356\354\352\356\361\362\374" }, - { 276, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 277, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 278, "\304\340" }, - { 279, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 280, "\307\356\355\340" }, - { 281, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, - { 282, "\323\342\345\353. \354\340\361\370\362\340\341" }, - { 283, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 284, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 285, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 286, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 287, "\355\345 \363\344\340\353\356\361\374\n" }, - { 288, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 289, "~\304~\356\341. \350\343\360\363..." }, - { 290, "\316~\362~\354\345\355\340" }, - { 291, "~\307~\340\352\360\373\362\374" }, - { 292, "\310\347~\354~. \350\343\360\363..." }, - { 293, "~\317~\356\354\356\371\374" }, - { 294, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, - { 295, "~\312~\353\340\342\350\370\350" }, - { 296, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, - { 297, "~\307~\340\343\360\363\347\350\362\374" }, - { 298, "~\307~\340\343\360...." }, - { 299, "~\321~\353\345\344" }, - { 300, "~O~K" }, - { 301, "~\316~\357\366\350\350" }, - { 302, "~\316~\357\366\350\350..." }, - { 303, "~\317~\360\345\344" }, - { 304, "~\302~\373\365\356\344" }, - { 305, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 306, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 307, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 308, "~\307~\340\357\350\361\340\362\374" }, - { 309, "\317~\363~\361\352" }, - { 310, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, - { 311, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, - { 312, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, + { 82, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 83, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, + { 84, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 85, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 86, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, + { 87, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, + { 88, "\303\360\364" }, + { 90, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 91, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 92, "\310\343\360\340" }, + { 93, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 94, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 95, "\317\363\362\374 \352 \350\343\360\345: " }, + { 96, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, + { 97, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 98, "\302\342\345\360\365" }, + { 99, "\303\360\340\364\350\352\340" }, + { 100, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 101, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, + { 104, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, + { 105, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, + { 106, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 107, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 108, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, + { 109, "FM Towns" }, + { 110, "ID:" }, + { 111, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, + { 112, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, + { 113, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 114, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 115, "\302\342\356\344" }, + { 116, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 117, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, + { 118, "\312\353\340\342\350\340\362\363\360\340" }, + { 119, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, + { 120, "\312\353\340\342\350\370\350" }, + { 121, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 122, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 123, "\337\347\373\352:" }, + { 124, "\302\353\345\342\356" }, + { 125, "\313\345\342\373\351 \371\345\353\367\356\352" }, + { 126, "\307\340\343\360\363\347\350\362\374" }, + { 127, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 128, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 129, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 130, "MIDI" }, + { 131, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 132, "\335\354\363\353\377\366\350\377 MT-32" }, + { 134, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, + { 135, "\315\340\347\355\340\367\350\362\374" }, + { 136, "\304\356\341. \354\355\356\343\356..." }, + { 137, "\314\345\355\376" }, + { 138, "\320\340\347\355\356\345" }, + { 139, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 140, "\317\356\344\352\353\376\367\350\362\374 DVD" }, + { 141, "\317\356\344\352\353\376\367\350\362\374 SMB" }, + { 142, "\312\353\350\352 \354\373\370\374\376" }, + { 143, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, + { 144, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 145, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 146, "\315\340\347\342\340\355\350\345:" }, + { 147, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, + { 148, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, + { 149, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, + { 150, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, + { 151, "\315\350\352\356\343\344\340" }, + { 152, "\315\345\362" }, + { 153, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 154, "\301\345\347 \354\363\347\373\352\350" }, + { 155, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 156, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 157, "\315\345 \347\340\344\340\355" }, + { 159, "OK" }, + { 160, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 161, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 162, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 163, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 164, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 165, "PC \361\357\350\352\345\360" }, + { 166, "\317\340\360\356\353\374:" }, + { 167, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 168, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 169, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 170, "\317\363\362\350" }, + { 171, "\317\340\363\347\340" }, + { 172, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 173, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 174, "\317\353\340\362\364\356\360\354\340:" }, + { 175, "\302\360\345\354\377 \350\343\360\373: " }, + { 176, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 177, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 179, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 180, "\302\373\365\356\344" }, + { 181, "\302\373\365\356\344 \350\347 ScummVM" }, + { 182, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 183, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 184, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 185, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 186, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 187, "\302\357\360\340\342\356" }, + { 188, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 189, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 190, "\317\356\342\345\360\355\363\362\374" }, + { 191, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 192, "SMB" }, + { 193, "\307\340\357\350\361\340\362\374" }, + { 194, "\317\363\362\374 \361\356\365\360.: " }, + { 195, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 196, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 197, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 198, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 199, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, + { 200, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 201, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 202, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 203, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 204, "\317\356\350\361\352:" }, + { 205, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 206, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 207, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 208, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 209, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 210, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 211, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 212, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 213, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 214, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 215, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, + { 216, "\321\345\360\342\345\360:" }, + { 217, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, + { 218, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 219, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 220, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, + { 221, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, + { 222, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, + { 223, "\317\360\356\357\363\361\362\350\362\374" }, + { 224, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 225, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, + { 226, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, + { 227, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, + { 228, "\307\342\363\352 \342\352\353/\342\373\352\353" }, + { 229, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 230, "SoundFont:" }, + { 231, "\316\347\342" }, + { 232, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 233, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 234, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 236, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 237, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 238, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 239, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 240, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 241, "\316\347\342\363\367\352\340" }, + { 242, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 243, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 244, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 245, "\321\356\361\362\356\377\355\350\345:" }, + { 246, "\321\363\341" }, + { 247, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 248, "\321\363\341\362\350\362\360\373" }, + { 249, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, + { 250, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, + { 251, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 252, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 253, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 254, "\322\345\354\340:" }, + { 255, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 256, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 257, "\302\360\345\354\377: " }, + { 258, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, + { 259, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, + { 260, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, + { 261, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, + { 262, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, + { 263, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 264, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 265, "\315\345\350\347\342\345\361\362\355\356" }, + { 266, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 267, "\316\362\352\353\376\367\350\362\374 DVD" }, + { 268, "\316\362\352\353\376\367\362\374 SMB" }, + { 269, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, + { 270, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 271, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 272, "\302\342\345\360\365" }, + { 273, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 274, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, + { 275, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 276, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, + { 277, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, + { 278, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, + { 279, "\302\350\344\345\356" }, + { 280, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, + { 281, "\303\360\356\354\352\356\361\362\374" }, + { 282, "Windows MIDI" }, + { 283, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 284, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 285, "\304\340" }, + { 286, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 287, "\307\356\355\340" }, + { 288, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, + { 289, "\323\342\345\353. \354\340\361\370\362\340\341" }, + { 290, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 291, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 292, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 293, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 294, "\355\345 \363\344\340\353\356\361\374\n" }, + { 295, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 296, "~\304~\356\341. \350\343\360\363..." }, + { 297, "\316~\362~\354\345\355\340" }, + { 298, "~\307~\340\352\360\373\362\374" }, + { 299, "\310\347~\354~. \350\343\360\363..." }, + { 300, "~\317~\356\354\356\371\374" }, + { 301, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, + { 302, "~\312~\353\340\342\350\370\350" }, + { 303, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, + { 304, "~\307~\340\343\360\363\347\350\362\374" }, + { 305, "~\307~\340\343\360...." }, + { 306, "~\321~\353\345\344" }, + { 307, "~O~K" }, + { 308, "~\316~\357\366\350\350" }, + { 309, "~\316~\357\366\350\350..." }, + { 310, "~\317~\360\345\344" }, + { 311, "~\302~\373\365\356\344" }, + { 312, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 313, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 314, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 315, "~\307~\340\357\350\361\340\362\374" }, + { 316, "\317~\363~\361\352" }, + { 317, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, + { 318, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, + { 319, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, { -1, NULL } }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "Recherche d'un plugin supportant cet ID..." }, { 3, "D\351marrage de '%s'\n" }, @@ -645,49 +655,48 @@ static const PoMessageEntry _translation_fr_FR[] = { { 6, "(Global)" }, { 7, "Le plugin %s a \351chou\351 dans l'instanciation du moteur de jeu: %s (cible '%s', chemin '%s')" }, { 8, "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour obtenir la liste des ID reconnus" }, - { 9, ", \351chec du montage du disque partag\351" }, - { 10, ", disque partag\351 non mont\351" }, - { 11, "... en cours ..." }, - { 12, "11 kHz" }, - { 13, "22 kHz" }, - { 14, "44 kHz" }, - { 15, "48 kHz" }, - { 16, "8 kHz" }, - { 17, "" }, - { 18, "\300 propos de ScummVM" }, - { 19, "\311mulateur AdLib:" }, + { 9, "C2(compil\351 sur" }, + { 10, ", \351chec du montage du disque partag\351" }, + { 11, ", disque partag\351 non mont\351" }, + { 12, "... en cours ..." }, + { 13, "11 kHz" }, + { 14, "22 kHz" }, + { 15, "44 kHz" }, + { 16, "48 kHz" }, + { 17, "8 kHz" }, + { 18, "" }, + { 19, "\300 propos de ScummVM" }, { 20, "\311mulateur AdLib:" }, - { 21, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, - { 22, "Ajouter..." }, - { 23, "Anti-cr\351nel\351 (16 bpp)" }, - { 24, "Correction du rapport d'aspect" }, - { 25, "Touche associ\351e: %s" }, - { 26, "Touche associ\351e: aucune" }, - { 27, "Audio" }, - { 28, "Sauvegarde auto:" }, - { 29, "\300 ~P~ropos..." }, - { 30, "Affecter les touches" }, - { 31, "Les deux" }, - { 32, "Luminosit\351:" }, - { 33, "C1Moteurs disponibles:" }, - { 34, "C1Options incluses:" }, - { 35, "C2(compil\351 sur" }, - { 36, "Annuler" }, - { 37, "Impossible de cr\351er le fichier" }, - { 38, "Change les options du jeu" }, - { 39, "Change les options globales de ScummVM" }, - { 40, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, - { 41, "Choisir" }, - { 42, "S\351lectionnez une action \340 affecter" }, - { 43, "Effacer la valeur" }, - { 44, "Fermer" }, - { 45, "Corrige le rapport d'aspect pour les jeu 320x200" }, - { 46, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, - { 47, "Mode vid\351o actuel" }, - { 48, "Bas" }, - { 49, "Gauche" }, - { 50, "Droit" }, - { 51, "Haut" }, + { 21, "\311mulateur AdLib:" }, + { 22, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, + { 23, "Ajouter..." }, + { 24, "Anti-cr\351nel\351 (16 bpp)" }, + { 25, "Correction du rapport d'aspect" }, + { 26, "Touche associ\351e: %s" }, + { 27, "Touche associ\351e: aucune" }, + { 28, "Audio" }, + { 29, "Sauvegarde auto:" }, + { 30, "C1Moteurs disponibles:" }, + { 31, "\300 ~P~ropos..." }, + { 32, "Affecter les touches" }, + { 33, "Les deux" }, + { 34, "Luminosit\351:" }, + { 35, "Annuler" }, + { 36, "Impossible de cr\351er le fichier" }, + { 37, "Change les options du jeu" }, + { 38, "Change les options globales de ScummVM" }, + { 39, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, + { 40, "Choisir" }, + { 41, "S\351lectionnez une action \340 affecter" }, + { 42, "Effacer la valeur" }, + { 43, "Fermer" }, + { 44, "Corrige le rapport d'aspect pour les jeu 320x200" }, + { 45, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, + { 46, "Mode vid\351o actuel" }, + { 47, "Bas" }, + { 48, "Gauche" }, + { 49, "Droit" }, + { 50, "Haut" }, { 52, "DVD" }, { 53, "DVD mont\351 avec succ\350s" }, { 54, "DVD non mont\351" }, @@ -718,287 +727,610 @@ static const PoMessageEntry _translation_fr_FR[] = { { 79, "FM Towns" }, { 80, "Aucun th\350me GUI n'a pu \352tre charg\351; abandon" }, { 81, "Mode rapide" }, - { 83, "Nom complet du jeu" }, - { 84, "Plein \351cran" }, - { 85, "Acceleration du pad GC:" }, - { 86, "Sensibilit\351 du pad GC:" }, - { 87, "GFX" }, - { 89, "Langue:" }, - { 90, "Interface:" }, - { 91, "Jeu" }, - { 92, "Fichier de don\351es introuvable" }, - { 93, "ID de jeu non support\351" }, - { 94, "Chemin du Jeu:" }, - { 95, "Menu global" }, - { 96, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, - { 97, "Remonter" }, - { 98, "Graphique" }, - { 99, "Mode graphique:" }, - { 100, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, - { 101, "Cach\351 la barre d'outils" }, - { 102, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, - { 103, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, - { 104, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, - { 106, "ID:" }, - { 107, "Initialiser le r\351seau" }, - { 108, "\311chelle initiale de l'\351cran du haut" }, - { 109, "Initialisation du r\351seau" }, - { 110, "Initialisation du r\351seau" }, - { 111, "Entr\351e" }, - { 112, "Chemin Invalide" }, - { 113, "Affectation des touches" }, - { 114, "Clavier" }, - { 115, "Affectation des touches:" }, - { 116, "Touches" }, - { 117, "Langue de l'interface graphique de ScummVM" }, - { 118, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, - { 119, "Langue:" }, - { 120, "Gauche" }, - { 121, "Clic Gauche" }, - { 122, "Charger" }, - { 123, "Charger le jeu:" }, - { 124, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, - { 125, "MIDI" }, - { 126, "Gain MIDI:" }, - { 127, "\311mulation MT-32" }, - { 129, "\311chelle de l'\351cran principal" }, - { 130, "Affecter" }, - { 131, "Ajout Massif..." }, - { 132, "Menu" }, - { 133, "Divers" }, - { 134, "Mode mixe AdLib/MIDI" }, - { 135, "Monter le DVD" }, - { 136, "Monter SMB" }, - { 137, "Clic de souris" }, - { 139, "Volume Musique:" }, - { 140, "Silence" }, - { 141, "Nom:" }, - { 142, "R\351seau d\351connect\351" }, - { 143, "R\351seau non initialis\351 (%d)" }, - { 144, "R\351seau connect\351" }, - { 145, "R\351seau connect\351, disque partag\351 mont\351" }, - { 146, "Jamais" }, - { 147, "Non" }, - { 148, "Date non sauv\351e" }, - { 149, "Pas de musique" }, - { 150, "Dur\351e de jeu non sauv\351e" }, - { 151, "Heure non sauv\351e" }, - { 152, "Aucun" }, - { 153, "OK" }, - { 154, "Ok" }, - { 155, "Fr\351quence:" }, - { 156, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, - { 157, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, - { 158, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, - { 159, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, - { 160, "Mot de passe:" }, - { 161, "Chemin n'est pas un r\351pertoire" }, - { 162, "Chemin n'est pas un fichier" }, - { 163, "Chemin inexistant" }, - { 164, "Chemins" }, - { 165, "Mettre en pause" }, - { 166, "Choisissez le jeu:" }, - { 167, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 168, "Plateforme:" }, - { 169, "Dur\351e de jeu:" }, - { 170, "Selectionnez une action" }, - { 171, "Plugins:" }, - { 173, "Appuyez sur la touche \340 associer" }, - { 174, "Quitter" }, - { 175, "Quitter ScummVM" }, - { 176, "V\351roulli\351 en lecture" }, - { 177, "Echec de la lecture" }, - { 178, "Changer l'affectation des touches" }, - { 179, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 180, "Mode de rendu:" }, - { 181, "Droite" }, - { 182, "Clic Droit" }, - { 183, "Clic droit" }, - { 184, "Pivoter" }, - { 185, "Volume Bruitage:" }, - { 186, "SMB" }, - { 187, "Sauver" }, - { 188, "Sauvegardes:" }, - { 189, "Sauvegardes:" }, - { 190, "Sauvegarde:" }, - { 191, "Examen termin\351!" }, - { 192, "%d r\351pertoires examin\351s ..." }, - { 193, "Menu Principal ScummVM" }, - { 194, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 195, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 196, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 197, "Recherche dans la liste de jeux" }, - { 198, "Filtre:" }, - { 199, "Choisir une banque de sons" }, - { 200, "S\351lectionnez un Th\350me" }, - { 201, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 202, "Selectionez une action et cliquez 'Affecter'" }, - { 203, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 204, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 205, "S\351lectionner le r\351pertoire des plugins" }, - { 206, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 207, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 208, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 209, "Sensibilit\351" }, - { 210, "Serveur:" }, - { 211, "Disque partag\351:" }, - { 212, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 213, "Afficher le clavier" }, - { 214, "Afficher le curseur de la souris" }, - { 215, "Affiche les sous-titres et joue les dialogues audio" }, - { 216, "Afficher/Cacher le curseur" }, - { 217, "Passer" }, - { 218, "Passer la phrase" }, - { 219, "Sauter le texte" }, - { 220, "Aligner sur les bords" }, - { 221, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 222, "Audio marche/arr\352t" }, - { 223, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 224, "Banque de sons:" }, - { 225, "Audio" }, - { 226, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 227, "Volume des effets sp\351ciaux sonores" }, - { 228, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 230, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 231, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 232, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 233, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 234, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 235, "Audio" }, - { 236, "Volume Dialogues:" }, - { 237, "Standard (16bpp)" }, - { 238, "D\351marre le jeu s\351lectionn\351" }, - { 239, "Status:" }, - { 240, "Subs" }, - { 241, "Vitesse des ST:" }, - { 242, "Sous-titres" }, - { 244, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 245, "Dialogue:" }, - { 246, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 247, "Th\350mes:" }, - { 248, "Th\350me:" }, - { 249, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 250, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 251, "Heure:" }, - { 252, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 253, "D\351calage X du toucher" }, - { 254, "D\351callage Y du toucher" }, - { 255, "Mode touchpad d\351sactiv\351" }, - { 256, "Mode touchpad activ\351" }, - { 257, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 258, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 259, "Inconue" }, - { 260, "Erreur inconnue" }, - { 261, "D\351monter le DVD" }, - { 262, "D\351monter SMB" }, - { 263, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 264, "Mode de couleurs non support\351" }, - { 265, "Sauvegarde sans nom" }, - { 266, "Haut" }, - { 267, "Utiliser \340 la fois MIDI et AdLib" }, - { 268, "Activer le contr\364le du curseur de type trackpad" }, - { 269, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, - { 270, "Nom d'utilisateur:" }, - { 271, "Utilise le pilote SDL" }, - { 273, "Vid\351o" }, - { 274, "Clavier virtuel" }, - { 275, "Volume" }, - { 276, "Verrouill\351 en \351criture" }, - { 277, "Echec de l'\351criture des donn\351es" }, - { 278, "Oui" }, - { 279, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 280, "Zone" }, - { 283, "Toutes les 10 mins" }, - { 284, "Toutes les 15 mins" }, - { 285, "Toutes les 30 mins" }, - { 286, "Toutes les 5 mins" }, - { 287, "Echec\n" }, - { 288, "\300 ~P~ropos" }, - { 289, "~A~jouter..." }, - { 290, "~A~nnuler" }, - { 291, "~F~ermer" }, - { 292, "~E~diter..." }, - { 293, "~A~ide" }, - { 294, "Contr\364le des combats d'~I~ndy" }, - { 295, "~T~ouches" }, - { 296, "Mode ~G~aucher" }, - { 297, "~C~harger" }, - { 298, "~C~harger" }, - { 299, "~S~uivant" }, - { 300, "~O~K" }, - { 301, "~O~ptions" }, - { 302, "~O~ptions..." }, - { 303, "~P~r\351c\351dent" }, - { 304, "~Q~uitter" }, - { 305, "~S~upprimer" }, - { 306, "~R~eprendre" }, - { 307, "Retour au ~L~anceur" }, - { 308, "~S~auver" }, - { 309, "~D~\351marrer" }, - { 310, "T~r~ansitions activ\351" }, - { 311, "~E~ffets de l'Eau activ\351s" }, - { 312, "Mode ~Z~ip Activ\351" }, + { 82, "C1Options incluses:" }, + { 84, "Nom complet du jeu" }, + { 85, "Plein \351cran" }, + { 86, "Acceleration du pad GC:" }, + { 87, "Sensibilit\351 du pad GC:" }, + { 88, "GFX" }, + { 90, "Langue:" }, + { 91, "Interface:" }, + { 92, "Jeu" }, + { 93, "Fichier de don\351es introuvable" }, + { 94, "ID de jeu non support\351" }, + { 95, "Chemin du Jeu:" }, + { 96, "Menu global" }, + { 97, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, + { 98, "Remonter" }, + { 99, "Graphique" }, + { 100, "Mode graphique:" }, + { 101, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 104, "Cach\351 la barre d'outils" }, + { 105, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, + { 106, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, + { 107, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, + { 109, "FM Towns" }, + { 110, "ID:" }, + { 111, "Initialiser le r\351seau" }, + { 112, "\311chelle initiale de l'\351cran du haut" }, + { 113, "Initialisation du r\351seau" }, + { 114, "Initialisation du r\351seau" }, + { 115, "Entr\351e" }, + { 116, "Chemin Invalide" }, + { 117, "Affectation des touches" }, + { 118, "Clavier" }, + { 119, "Affectation des touches:" }, + { 120, "Touches" }, + { 121, "Langue de l'interface graphique de ScummVM" }, + { 122, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, + { 123, "Langue:" }, + { 124, "Gauche" }, + { 125, "Clic Gauche" }, + { 126, "Charger" }, + { 127, "Charger le jeu:" }, + { 128, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, + { 129, "\311mulateur AdLib:" }, + { 130, "MIDI" }, + { 131, "Gain MIDI:" }, + { 132, "\311mulation MT-32" }, + { 134, "\311chelle de l'\351cran principal" }, + { 135, "Affecter" }, + { 136, "Ajout Massif..." }, + { 137, "Menu" }, + { 138, "Divers" }, + { 139, "Mode mixe AdLib/MIDI" }, + { 140, "Monter le DVD" }, + { 141, "Monter SMB" }, + { 142, "Clic de souris" }, + { 144, "Volume Musique:" }, + { 145, "Silence" }, + { 146, "Nom:" }, + { 147, "R\351seau d\351connect\351" }, + { 148, "R\351seau non initialis\351 (%d)" }, + { 149, "R\351seau connect\351" }, + { 150, "R\351seau connect\351, disque partag\351 mont\351" }, + { 151, "Jamais" }, + { 152, "Non" }, + { 153, "Date non sauv\351e" }, + { 154, "Pas de musique" }, + { 155, "Dur\351e de jeu non sauv\351e" }, + { 156, "Heure non sauv\351e" }, + { 157, "Aucun" }, + { 159, "OK" }, + { 160, "Fr\351quence:" }, + { 161, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, + { 162, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, + { 163, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, + { 164, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, + { 165, "Haut Parleur PC" }, + { 166, "Mot de passe:" }, + { 167, "Chemin n'est pas un r\351pertoire" }, + { 168, "Chemin n'est pas un fichier" }, + { 169, "Chemin inexistant" }, + { 170, "Chemins" }, + { 171, "Mettre en pause" }, + { 172, "Choisissez le jeu:" }, + { 173, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 174, "Plateforme:" }, + { 175, "Dur\351e de jeu:" }, + { 176, "Selectionnez une action" }, + { 177, "Plugins:" }, + { 179, "Appuyez sur la touche \340 associer" }, + { 180, "Quitter" }, + { 181, "Quitter ScummVM" }, + { 182, "V\351roulli\351 en lecture" }, + { 183, "Echec de la lecture" }, + { 184, "Changer l'affectation des touches" }, + { 185, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 186, "Mode de rendu:" }, + { 187, "Droite" }, + { 188, "Clic Droit" }, + { 189, "Clic droit" }, + { 190, "Pivoter" }, + { 191, "Volume Bruitage:" }, + { 192, "SMB" }, + { 193, "Sauver" }, + { 194, "Sauvegardes:" }, + { 195, "Sauvegardes:" }, + { 196, "Sauvegarde:" }, + { 197, "Examen termin\351!" }, + { 198, "%d r\351pertoires examin\351s ..." }, + { 199, "Menu Principal ScummVM" }, + { 200, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 201, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 202, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 203, "Recherche dans la liste de jeux" }, + { 204, "Filtre:" }, + { 205, "Choisir une banque de sons" }, + { 206, "S\351lectionnez un Th\350me" }, + { 207, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 208, "Selectionez une action et cliquez 'Affecter'" }, + { 209, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 210, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 211, "S\351lectionner le r\351pertoire des plugins" }, + { 212, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 213, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 214, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 215, "Sensibilit\351" }, + { 216, "Serveur:" }, + { 217, "Disque partag\351:" }, + { 218, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 219, "Afficher le clavier" }, + { 220, "Afficher le curseur de la souris" }, + { 221, "Affiche les sous-titres et joue les dialogues audio" }, + { 222, "Afficher/Cacher le curseur" }, + { 223, "Passer" }, + { 224, "Passer la phrase" }, + { 225, "Sauter le texte" }, + { 226, "Aligner sur les bords" }, + { 227, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 228, "Audio marche/arr\352t" }, + { 229, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 230, "Banque de sons:" }, + { 231, "Audio" }, + { 232, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 233, "Volume des effets sp\351ciaux sonores" }, + { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 236, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 237, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 238, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 239, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 240, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 241, "Audio" }, + { 242, "Volume Dialogues:" }, + { 243, "Standard (16bpp)" }, + { 244, "D\351marre le jeu s\351lectionn\351" }, + { 245, "Status:" }, + { 246, "Subs" }, + { 247, "Vitesse des ST:" }, + { 248, "Sous-titres" }, + { 250, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 251, "Dialogue:" }, + { 252, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 253, "Th\350mes:" }, + { 254, "Th\350me:" }, + { 255, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 256, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 257, "Heure:" }, + { 258, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 259, "D\351calage X du toucher" }, + { 260, "D\351callage Y du toucher" }, + { 261, "Mode touchpad d\351sactiv\351" }, + { 262, "Mode touchpad activ\351" }, + { 263, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 264, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 265, "Inconue" }, + { 266, "Erreur inconnue" }, + { 267, "D\351monter le DVD" }, + { 268, "D\351monter SMB" }, + { 269, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 270, "Mode de couleurs non support\351" }, + { 271, "Sauvegarde sans nom" }, + { 272, "Haut" }, + { 273, "Utiliser \340 la fois MIDI et AdLib" }, + { 274, "Activer le contr\364le du curseur de type trackpad" }, + { 275, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, + { 276, "Nom d'utilisateur:" }, + { 277, "Utilise le pilote SDL" }, + { 279, "Vid\351o" }, + { 280, "Clavier virtuel" }, + { 281, "Volume" }, + { 282, "MIDI Windows" }, + { 283, "Verrouill\351 en \351criture" }, + { 284, "Echec de l'\351criture des donn\351es" }, + { 285, "Oui" }, + { 286, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 287, "Zone" }, + { 290, "Toutes les 10 mins" }, + { 291, "Toutes les 15 mins" }, + { 292, "Toutes les 30 mins" }, + { 293, "Toutes les 5 mins" }, + { 294, "Echec\n" }, + { 295, "\300 ~P~ropos" }, + { 296, "~A~jouter..." }, + { 297, "~A~nnuler" }, + { 298, "~F~ermer" }, + { 299, "~E~diter..." }, + { 300, "~A~ide" }, + { 301, "Contr\364le des combats d'~I~ndy" }, + { 302, "~T~ouches" }, + { 303, "Mode ~G~aucher" }, + { 304, "~C~harger" }, + { 305, "~C~harger" }, + { 306, "~S~uivant" }, + { 307, "~O~K" }, + { 308, "~O~ptions" }, + { 309, "~O~ptions..." }, + { 310, "~P~r\351c\351dent" }, + { 311, "~Q~uitter" }, + { 312, "~S~upprimer" }, + { 313, "~R~eprendre" }, + { 314, "Retour au ~L~anceur" }, + { 315, "~S~auver" }, + { 316, "~D~\351marrer" }, + { 317, "T~r~ansitions activ\351" }, + { 318, "~E~ffets de l'Eau activ\351s" }, + { 319, "Mode ~Z~ip Activ\351" }, + { -1, NULL } +}; + +static const PoMessageEntry _translation_ca_ES[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 2, " Cercant un connector que suporti aquest identificador de joc... " }, + { 3, " Iniciant '%s'\n" }, + { 4, " (Actiu)" }, + { 5, " (Joc)" }, + { 6, " (Global)" }, + { 7, "%s ha fallat l'iniciat del motor: %s (target '%s', cam\355 '%s')" }, + { 8, "%s \351s un identificador de joc inv\340lid. Utilitzeu l'opci\363 --list-games per llistar els identificadors de joc suportats" }, + { 9, "(compilat el %s)" }, + { 10, ", error al muntar la compartici\363" }, + { 11, ", compartici\363 no muntada" }, + { 12, "... progr\351s ..." }, + { 13, "11kHz" }, + { 14, "22 kHz" }, + { 15, "44 kHz" }, + { 16, "48 kHz" }, + { 17, "8 kHz" }, + { 18, "" }, + { 19, "Quant a ScummVM" }, + { 20, "Emulador d'AdLib" }, + { 21, "Emulador d'AdLib:" }, + { 22, "AdLib s'utilitza per la m\372sica de molts jocs" }, + { 23, "Afegeix Joc..." }, + { 24, "Pintat amb antialias (16bpp)" }, + { 25, "Correcci\363 del rati d'aspecte" }, + { 26, "Tecla associada : %s" }, + { 27, "Tecla associada : cap" }, + { 28, "\300udio" }, + { 29, "Desat autom\340tic:" }, + { 30, "Motors disponibles:" }, + { 31, "~Q~uant a..." }, + { 32, "Mapeja tecles" }, + { 33, "Ambd\363s" }, + { 34, "Brillantor:" }, + { 35, "Cancel\267la" }, + { 36, "No s'ha pogut crear el fitxer" }, + { 37, "Canvia les opcions del joc" }, + { 38, "Canvia les opcions globals de ScummVM" }, + { 39, "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so compatible amb Roland connectat al vostre ordinador" }, + { 40, "Escull" }, + { 41, "Sel\267leccioneu una acci\363 per mapejar" }, + { 42, "Neteja el valor" }, + { 43, "Tanca" }, + { 44, "Corregeix la relaci\363 d'aspecte per jocs de 320x200" }, + { 45, "No s'ha pogut trobar cap motor capa\347 d'executar el joc seleccionat" }, + { 46, "Mode de v\355deo actual:" }, + { 47, "Cursor Avall" }, + { 48, "Cursor Esquerra" }, + { 49, "Cursor Dreta" }, + { 50, "Cursor Amunt" }, + { 51, "Emulador OPL de DOSBox" }, + { 52, "DVD" }, + { 53, "El DVD s'ha muntat satisfact\362riament" }, + { 54, "El DVD no est\340 muntat" }, + { 55, "Data: " }, + { 56, "Depurador" }, + { 57, "Per defecte" }, + { 58, "Suprimeix" }, + { 59, "Desactiva l'apagat autom\340tic" }, + { 60, "GFX desactivats" }, + { 61, "S'han descobert %d jocs nous ..." }, + { 62, "S'han descobert %d jocs nous." }, + { 63, "Pantalla" }, + { 64, "Mostra el teclat" }, + { 65, "Realment voleu suprimir aquesta partida?" }, + { 66, "Realment voleu suprimir la configuraci\363 d'aquest joc?" }, + { 67, "Esteu segur que voleu executar el detector massiu de jocs? Aix\362 pot afegir una gran quantitat de jocs." }, + { 68, "Voleu carregar o desar el joc?" }, + { 69, "Voleu fer una cerca autom\340tica?" }, + { 70, "Vols sortir?" }, + { 72, "Avall" }, + { 73, "Activa el Mode Roland GS" }, + { 74, "El motor no suporta el nivell de depuraci\363 '%s'" }, + { 75, "Angl\350s" }, + { 76, "Error al executar el joc:" }, + { 77, "Error al muntar el DVD" }, + { 78, "Cam\355 Extra:" }, + { 79, "Emulador de FM Towns" }, + { 80, "No s'ha pogut carregar cap tema de la interf\355cie d'usuari, avortant" }, + { 81, "Mode r\340pid" }, + { 82, "Caracter\355stiques compilades:" }, + { 83, "Vista lliure" }, + { 84, "T\355tol complet del joc" }, + { 85, "Mode pantalla completa" }, + { 86, "Acceleraci\363 del Pad GC:" }, + { 87, "Sensibilitat del Pad GC:" }, + { 88, "GFX" }, + { 89, "Dispositiu GM:" }, + { 90, "Idioma de la interf\355cie d'usuari:" }, + { 91, "Mode de pintat de la interf\355cie d'usuari:" }, + { 92, "Joc" }, + { 93, "No s'han trobat les dades del joc" }, + { 94, "Identificador de joc no suportat" }, + { 95, "Cam\355 del Joc:" }, + { 96, "Men\372 global" }, + { 97, "Torna al nivell de directoris anterior" }, + { 98, "Amunt" }, + { 99, "Gr\340fics" }, + { 100, "Mode gr\340fic:" }, + { 101, "Escalat per hardware (r\340pid, per\362 de baixa qualitat)" }, + { 102, "Hercules \300mbar" }, + { 103, "Hercules Verd" }, + { 104, "Oculta la barra d'eines" }, + { 105, "Alta qualitat d'\340udio (m\351s lent) (reiniciar)" }, + { 106, "Valors m\351s alts especifiquen millor qualitat de so per\362 pot ser que la vostra tarja de so no ho suporti" }, + { 107, "Mantingueu premut Shift per a l'Addici\363 Massiva" }, + { 109, "Emulador d'IBM PCjr" }, + { 110, "Identificador:" }, + { 111, "Inicia la xarxa" }, + { 112, "Escalat inicial de la pantalla superior:" }, + { 113, "Iniciant l'Emulador de MT-32" }, + { 114, "Iniciant la xarxa" }, + { 115, "Entrada" }, + { 116, "Cam\355 incorrecte" }, + { 117, "Mapejador de tecles" }, + { 118, "Teclat" }, + { 119, "Mapa de teclat:" }, + { 120, "Tecles" }, + { 121, "Idioma de la interf\355cie d'usuari de ScummVM" }, + { 122, "Idioma del joc. Aix\362 no convertir\340 la vostra versi\363 Espanyola del joc a Angl\350s" }, + { 123, "Idioma:" }, + { 124, "Esquerra" }, + { 125, "Clic esquerre" }, + { 126, "Carrega" }, + { 127, "Carrega partida:" }, + { 128, "Carrega una partida pel joc seleccionat" }, + { 129, "Emulador OPL de MAME" }, + { 130, "MIDI" }, + { 131, "Guany MIDI:" }, + { 132, "Emulador de MT-32" }, + { 133, "Dispositiu MT32:" }, + { 134, "Escalat de la pantalla principal:" }, + { 135, "Mapeja" }, + { 136, "Addici\363 Massiva..." }, + { 137, "Men\372" }, + { 138, "Misc" }, + { 139, "Mode combinat AdLib/MIDI" }, + { 140, "Munta el DVD" }, + { 141, "Munta SMB" }, + { 142, "Clic del ratol\355" }, + { 143, "Funci\363 M\372ltiple" }, + { 144, "Volum de la m\372sica:" }, + { 145, "Silenciar tot" }, + { 146, "Nom:" }, + { 147, "Xarxa inactiva" }, + { 148, "Xarxa no iniciada (%d)" }, + { 149, "Xarxa activa" }, + { 150, "Xarxa activa, compartici\363 muntada" }, + { 151, "Mai" }, + { 152, "No" }, + { 153, "No hi ha data desada" }, + { 154, "Sense m\372sica" }, + { 155, "No hi ha temps de joc desat" }, + { 156, "No hi ha hora desada" }, + { 157, "Cap" }, + { 158, "Normal (sense escalar)" }, + { 159, "D'acord" }, + { 160, "Freq\374\350ncia de sortida:" }, + { 161, "Fer canvis sobre les opcions globals de MIDI" }, + { 162, "Fer canvis sobre les opcions globals d'\340udio" }, + { 163, "Fer canvis sobre les opcions globals de gr\340fics" }, + { 164, "Fer canvis sobre les opcions globals de volum" }, + { 165, "Emulador d'Altaveu de PC" }, + { 166, "Contrasenya:" }, + { 167, "El cam\355 no \351s un directori" }, + { 168, "El cam\355 no \351s un fitxer" }, + { 169, "El cam\355 no existeix" }, + { 170, "Camins" }, + { 171, "Pausa" }, + { 172, "Seleccioneu el joc:" }, + { 173, "Plataforma per la que el joc es va dissenyar originalment" }, + { 174, "Plataforma:" }, + { 175, "Temps de joc: " }, + { 176, "Seleccioneu una acci\363" }, + { 177, "Cam\355 dels connectors:" }, + { 178, "Dispositiu Preferit:" }, + { 179, "Premeu la tecla a associar" }, + { 180, "Surt" }, + { 181, "Surt de ScummVM" }, + { 182, "S'ha denegat el perm\355s de lectura" }, + { 183, "Ha fallat la lectura" }, + { 184, "Remapeja les tecles" }, + { 185, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, + { 186, "Mode de pintat:" }, + { 187, "Dreta" }, + { 188, "Clic dret" }, + { 189, "Clic dret" }, + { 190, "Rotar" }, + { 191, "Volum dels efectes:" }, + { 192, "SMB" }, + { 193, "Desa" }, + { 194, "Cam\355 de les Partides:" }, + { 195, "Cam\355 de les Partides: " }, + { 196, "Desa la partida:" }, + { 197, "S'ha acabat la cerca!" }, + { 198, "S'han cercat %d directoris ..." }, + { 199, "Men\372 Principal de ScummVM" }, + { 200, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, + { 201, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, + { 202, "ScummVM no ha pogut obrir el directori especificat!" }, + { 203, "Cerca a la llista de jocs" }, + { 204, "Cerca:" }, + { 205, "Seleccioneu el fitxer SoundFont" }, + { 206, "Seleccioneu un Tema" }, + { 207, "Seleccioneu el directori addicional del joc" }, + { 208, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, + { 209, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, + { 210, "Seleccioneu el directori dels fitxers extra" }, + { 211, "Seleccioneu el directori dels connectors" }, + { 212, "Seleccioneu el directori de les partides desades" }, + { 213, "Seleccioneu el directori de les partides desades" }, + { 214, "Seleccioneu el directori amb les dades del joc" }, + { 215, "Sensibilitat" }, + { 216, "Servidor:" }, + { 217, "Compartici\363:" }, + { 218, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, + { 219, "Mostra el teclat" }, + { 220, "Mostra el cursor del ratol\355" }, + { 221, "Mostra els subt\355tols i reprodueix la veu" }, + { 222, "Mostra/Oculta el cursor" }, + { 223, "Salta" }, + { 224, "Salta la l\355nia" }, + { 225, "Salta el text" }, + { 227, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, + { 228, "So engegat/parat" }, + { 229, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, + { 230, "Fitxer SoundFont:" }, + { 231, "Veus" }, + { 232, "Modes de dispersi\363 especials suportats per alguns jocs" }, + { 233, "Volum dels sons d'efectes especials" }, + { 234, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, + { 235, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, + { 236, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, + { 237, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, + { 238, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, + { 239, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, + { 240, "Especifica on es desaran les partides" }, + { 241, "Veus" }, + { 242, "Volum de la veu:" }, + { 243, "Pintat est\340ndard (16bpp)" }, + { 244, "Iniciant el joc seleccionat" }, + { 245, "Estat:" }, + { 246, "Subt" }, + { 247, "Velocitat dels subt\355tols:" }, + { 248, "Subt\355tols" }, + { 249, "Commuta el personatge" }, + { 250, "Toc per a clic esquerre, doble toc per a clic dret" }, + { 251, "Text i Veus:" }, + { 252, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, + { 253, "Cam\355 dels Temes:" }, + { 254, "Tema:" }, + { 255, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, + { 256, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, + { 257, "Hora: " }, + { 259, "Despla\347ament X del toc" }, + { 260, "Despla\347ament Y del toc" }, + { 261, "Mode Touchpad desactivat." }, + { 262, "Mode Touchpad activat." }, + { 263, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, + { 264, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, + { 265, "Desconegut" }, + { 266, "Error desconegut" }, + { 267, "Desmunta el DVD" }, + { 268, "Desmunta SMB" }, + { 269, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, + { 270, "Mode de color no suportat" }, + { 271, "Partida sense t\355tol" }, + { 272, "Amunt" }, + { 273, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, + { 274, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, + { 275, "L'usuari ha seleccionat el target '%s' (identificador de joc '%s')...\n" }, + { 276, "Nom d'usuari:" }, + { 277, "Utilitzant el controlador SDL " }, + { 279, "V\355deo" }, + { 280, "Teclat virtual" }, + { 281, "Volum" }, + { 282, "MIDI de Windows" }, + { 283, "S'ha denegat el perm\355s d'escriptura" }, + { 284, "Ha fallat l'escriptura de dades" }, + { 285, "S\355" }, + { 286, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, + { 287, "Zona" }, + { 288, "Redueix" }, + { 289, "Amplia" }, + { 290, "cada 10 minuts" }, + { 291, "cada 15 minuts" }, + { 292, "cada 30 minuts" }, + { 293, "cada 5 minuts" }, + { 294, "ha fallat\n" }, + { 295, "~Q~uant a" }, + { 296, "~A~fegeix Joc..." }, + { 297, "~C~ancel\267la" }, + { 298, "~T~anca" }, + { 299, "~E~dita Joc..." }, + { 300, "~A~juda" }, + { 301, "Controls de lluita de l'~I~ndy" }, + { 302, "~T~ecles" }, + { 303, "Mode ~e~squerr\340" }, + { 304, "C~a~rrega" }, + { 305, "~C~arrega..." }, + { 306, "~S~eg\374ent" }, + { 307, "~D~'acord" }, + { 308, "~O~pcions" }, + { 309, "~O~pcions..." }, + { 310, "~A~nterior" }, + { 311, "~T~anca" }, + { 312, "~S~uprimeix Joc" }, + { 313, "~C~ontinua" }, + { 314, "~R~etorna al Llan\347ador" }, + { 315, "~D~esa" }, + { 316, "~I~nicia" }, + { 317, "~T~ransicions activades" }, + { 318, "~E~fecte de l'aigua activat" }, + { 319, "Mode ~Z~ip activat" }, { -1, NULL } }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, - { 17, "" }, - { 19, "AdLib vezet :" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 18, "" }, { 20, "AdLib vezet :" }, - { 24, "Aspect adag korrekci\363" }, - { 27, "Hang" }, - { 28, "Automatikus ment\351s:" }, - { 30, "Kulcsok" }, - { 47, "Renderel\351si m\363d:" }, + { 21, "AdLib vezet :" }, + { 25, "Aspect adag korrekci\363" }, + { 28, "Hang" }, + { 29, "Automatikus ment\351s:" }, + { 32, "Kulcsok" }, + { 46, "Renderel\351si m\363d:" }, { 57, "" }, { 73, "K\351pess\351 Roland GS Mode" }, { 78, "Extra \332tvonal:" }, { 81, "Grafikus m\363d:" }, - { 84, "Teljes k\351perny s m\363d:" }, - { 90, "Lek\351pez eszk\366z GUI:" }, - { 94, "Extra \332tvonal:" }, - { 98, "Grafik\341val" }, - { 99, "Grafikus m\363d:" }, - { 116, "Kulcsok" }, - { 126, "MIDI nyeres\351g:" }, - { 134, "Vegyes AdLib/MIDI m\363d" }, - { 139, "Zene mennyis\351g:" }, - { 140, "Muta \326sszes" }, - { 146, "Soha" }, - { 147, "Semmi" }, + { 85, "Teljes k\351perny s m\363d:" }, + { 91, "Lek\351pez eszk\366z GUI:" }, + { 95, "Extra \332tvonal:" }, + { 99, "Grafik\341val" }, + { 100, "Grafikus m\363d:" }, + { 120, "Kulcsok" }, + { 129, "AdLib vezet :" }, + { 131, "MIDI nyeres\351g:" }, + { 139, "Vegyes AdLib/MIDI m\363d" }, + { 144, "Zene mennyis\351g:" }, + { 145, "Muta \326sszes" }, + { 151, "Soha" }, { 152, "Semmi" }, - { 153, "Igen" }, - { 155, "Kimeneti teljes\355tm\351ny:" }, - { 164, "\326sv\351nyek" }, - { 165, "\326sv\351nyek" }, - { 180, "Renderel\351si m\363d:" }, - { 185, "SFX mennyis\351ge" }, - { 188, "Extra \332tvonal:" }, - { 210, "Soha" }, - { 235, "Csak a besz\351d" }, - { 236, "Besz\351d mennyis\351g:" }, - { 241, "Felirat sebess\351g:" }, - { 242, "Csak feliratok" }, - { 245, "Sz\366veg \351s besz\351d:" }, - { 248, "T\351ma:" }, - { 251, "T\351ma:" }, - { 257, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 271, "Zenei vezet :" }, - { 275, "Volumene" }, - { 280, "Semmi" }, - { 283, "10 percenk\351nt" }, - { 284, "15 percenk\351nt" }, - { 285, "30 percenk\351nt" }, - { 286, "5 percenk\351nt" }, - { 295, "Kulcsok" }, - { 296, "Renderel\351si m\363d:" }, - { 300, "Igen" }, + { 157, "Semmi" }, + { 159, "Igen" }, + { 160, "Kimeneti teljes\355tm\351ny:" }, + { 170, "\326sv\351nyek" }, + { 171, "\326sv\351nyek" }, + { 186, "Renderel\351si m\363d:" }, + { 191, "SFX mennyis\351ge" }, + { 194, "Extra \332tvonal:" }, + { 216, "Soha" }, + { 241, "Csak a besz\351d" }, + { 242, "Besz\351d mennyis\351g:" }, + { 247, "Felirat sebess\351g:" }, + { 248, "Csak feliratok" }, + { 251, "Sz\366veg \351s besz\351d:" }, + { 254, "T\351ma:" }, + { 257, "T\351ma:" }, + { 263, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 277, "Zenei vezet :" }, + { 281, "Volumene" }, + { 287, "Semmi" }, + { 290, "10 percenk\351nt" }, + { 291, "15 percenk\351nt" }, + { 292, "30 percenk\351nt" }, + { 293, "5 percenk\351nt" }, + { 302, "Kulcsok" }, + { 303, "Renderel\351si m\363d:" }, + { 307, "Igen" }, { -1, NULL } }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-24 23:30+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " Suche nach einer Erweiterung, die diese Spielkennung unterst\374tzt..." }, { 3, " Starte \"%s\"\n" }, @@ -1007,49 +1339,48 @@ static const PoMessageEntry _translation_de_DE[] = { { 6, " (Global)" }, { 7, "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" }, { 8, "%s ist eine ung\374ltige Spielkennung. Benutzen Sie die Option --list-games zum Anzeigen der unterst\374tzten Spielkennungen." }, - { 9, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, - { 10, ", \366ffentliches Verzeichnis nicht eingebunden" }, - { 11, "... l\344uft..." }, - { 12, "11 kHz" }, - { 13, "22 kHz" }, - { 14, "44 kHz" }, - { 15, "48 kHz" }, - { 16, "8 kHz" }, - { 17, "" }, - { 18, "\334ber ScummVM" }, - { 19, "AdLib-Emulator" }, + { 9, "C2(erstellt am" }, + { 10, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, + { 11, ", \366ffentliches Verzeichnis nicht eingebunden" }, + { 12, "... l\344uft..." }, + { 13, "11 kHz" }, + { 14, "22 kHz" }, + { 15, "44 kHz" }, + { 16, "48 kHz" }, + { 17, "8 kHz" }, + { 18, "" }, + { 19, "\334ber ScummVM" }, { 20, "AdLib-Emulator" }, - { 21, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, - { 22, "Spiel hinzuf\374gen..." }, - { 23, "Kantengl\344ttung (16bpp)" }, - { 24, "Seitenverh\344ltnis korrigieren" }, - { 25, "Zugewiesene Taste : %s" }, - { 26, "Zugewiesene Taste : keine" }, - { 27, "Audio" }, - { 28, "Autom. Speichern:" }, - { 29, "\334be~r~" }, - { 30, "Tasten zuweisen" }, - { 31, "Beides" }, - { 32, "Helligkeit:" }, - { 33, "C1Verf\374gbare Spiele-Engines:" }, - { 34, "C1Verwendete Funktionen:" }, - { 35, "C2(erstellt am" }, - { 36, "Abbrechen" }, - { 37, "Kann Datei nicht erstellen." }, - { 38, "Spieloptionen \344ndern" }, - { 39, "Globale ScummVM-Einstellungen bearbeiten" }, - { 40, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." }, - { 41, "Ausw\344hlen" }, - { 42, "Eine Aktion zum Zuweisen ausw\344hlen" }, - { 43, "Wert l\366schen" }, - { 44, "Schlie\337en" }, - { 45, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" }, - { 46, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." }, - { 47, "Aktueller Videomodus:" }, - { 48, "Zeiger runter" }, - { 49, "Zeiger nach links" }, - { 50, "Zeiger nach rechts" }, - { 51, "Zeiger hoch" }, + { 21, "AdLib-Emulator" }, + { 22, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, + { 23, "Spiel hinzuf\374gen..." }, + { 24, "Kantengl\344ttung (16bpp)" }, + { 25, "Seitenverh\344ltnis korrigieren" }, + { 26, "Zugewiesene Taste : %s" }, + { 27, "Zugewiesene Taste : keine" }, + { 28, "Audio" }, + { 29, "Autom. Speichern:" }, + { 30, "C1Verf\374gbare Spiele-Engines:" }, + { 31, "\334be~r~" }, + { 32, "Tasten zuweisen" }, + { 33, "Beides" }, + { 34, "Helligkeit:" }, + { 35, "Abbrechen" }, + { 36, "Kann Datei nicht erstellen." }, + { 37, "Spieloptionen \344ndern" }, + { 38, "Globale ScummVM-Einstellungen bearbeiten" }, + { 39, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." }, + { 40, "Ausw\344hlen" }, + { 41, "Eine Aktion zum Zuweisen ausw\344hlen" }, + { 42, "Wert l\366schen" }, + { 43, "Schlie\337en" }, + { 44, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" }, + { 45, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." }, + { 46, "Aktueller Videomodus:" }, + { 47, "Zeiger runter" }, + { 48, "Zeiger nach links" }, + { 49, "Zeiger nach rechts" }, + { 50, "Zeiger hoch" }, { 52, "DVD" }, { 53, "DVD erfolgreich eingebunden" }, { 54, "DVD nicht eingebunden" }, @@ -1080,233 +1411,237 @@ static const PoMessageEntry _translation_de_DE[] = { { 79, "FM Towns" }, { 80, "Fehler: Konnte kein Benutzeroberfl\344chen-Thema laden. Abbruch..." }, { 81, "Schneller Modus" }, - { 82, "Freie Ansicht" }, - { 83, "Voller Name des Spiels" }, - { 84, "Vollbildmodus" }, - { 85, "GC-Pad-Beschleunigung:" }, - { 86, "GC-Pad-Empfindlichkeit:" }, - { 87, "GFX" }, - { 89, "GUI-Sprache:" }, - { 90, "GUI-Renderer:" }, - { 91, "Spiel" }, - { 92, "Spieldaten nicht gefunden" }, - { 93, "Spielkennung nicht unterst\374tzt" }, - { 94, "Spielpfad:" }, - { 95, "Hauptmen\374" }, - { 96, "Zu h\366herer Pfadebene wechseln" }, - { 97, "Pfad hoch" }, - { 98, "Grafik" }, - { 99, "Grafikmodus:" }, - { 100, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, - { 101, "Werkzeugleiste verbergen" }, - { 102, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, - { 103, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, - { 104, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, - { 105, "Horizontale Bildverkleinerung:" }, - { 106, "Kennung:" }, - { 107, "Netzwerk starten" }, - { 108, "Verg\366\337erung des oberen Bildschirms:" }, - { 109, "Netzwerk wird gestartet..." }, - { 110, "Netzwerk wird gestartet..." }, - { 111, "Eingabe" }, - { 112, "Ung\374ltiges Verzeichnis" }, - { 113, "Tasten zuordnen" }, - { 114, "Tastatur" }, - { 115, "Tasten-Layout:" }, - { 116, "Tasten" }, - { 117, "Sprache der ScummVM-Oberfl\344che" }, - { 118, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." }, - { 119, "Sprache:" }, - { 120, "Links" }, - { 121, "Linksklick" }, - { 122, "Laden" }, - { 123, "Spiel laden:" }, - { 124, "Spielstand f\374r ausgew\344hltes Spiel laden" }, - { 125, "MIDI" }, - { 126, "MIDI-Lautst\344rke:" }, - { 127, "MT-32-Emulation" }, - { 129, "Hauptbildschirm-Skalierung:" }, - { 130, "Zuweisen" }, - { 131, "Durchsuchen..." }, - { 132, "Men\374" }, - { 133, "Verschiedenes" }, - { 134, "AdLib-/MIDI-Modus" }, - { 135, "DVD einbinden" }, - { 136, "SMB einbinden" }, - { 137, "Mausklick" }, - { 138, "Multi-Funktion" }, - { 139, "Musiklautst\344rke:" }, - { 140, "Alles aus" }, - { 141, "Name:" }, - { 142, "Netzwerk ist aus." }, - { 143, "Netzwerk nicht gestartet (%d)" }, - { 144, "Netzwerk gestartet" }, - { 145, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, - { 146, "Niemals" }, - { 147, "Nein" }, - { 148, "Kein Datum gespeichert" }, - { 149, "Keine Musik" }, - { 150, "Keine Spielzeit gespeichert" }, - { 151, "Keine Zeit gespeichert" }, - { 152, "Keine" }, - { 153, "OK" }, - { 154, "OK" }, - { 155, "Ausgabefrequenz:" }, - { 156, "Globale MIDI-Einstellungen \374bergehen" }, - { 157, "Globale Audioeinstellungen \374bergehen" }, - { 158, "Globale Grafikeinstellungen \374bergehen" }, - { 159, "Globale Lautst\344rke-Einstellungen \374bergehen" }, - { 160, "Passwort:" }, - { 161, "Ung\374ltiges Verzeichnis" }, - { 162, "Pfad ist keine Datei." }, - { 163, "Verzeichnis existiert nicht." }, - { 164, "Pfade" }, - { 165, "Pause" }, - { 166, "Spiel ausw\344hlen:" }, - { 167, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, - { 168, "Plattform:" }, - { 169, "Spieldauer: " }, - { 170, "Bitte eine Aktion ausw\344hlen" }, - { 171, "Plugin-Pfad:" }, - { 173, "Taste dr\374cken, um sie zuzuweisen" }, - { 174, "Beenden" }, - { 175, "ScummVM beenden" }, - { 176, "Lese-Berechtigung nicht vorhanden" }, - { 177, "Lesefehler aufgetreten" }, - { 178, "Tasten neu zuweisen" }, - { 179, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, - { 180, "Rendermodus:" }, - { 181, "Rechts" }, - { 182, "Rechtsklick" }, - { 183, "Rechtsklick" }, - { 184, "Drehen" }, - { 185, "Effektlautst\344rke:" }, - { 186, "SMB" }, - { 187, "Speichern" }, - { 188, "Spielst\344nde:" }, - { 189, "Speicherpfad: " }, - { 190, "Speichern:" }, - { 191, "Suchlauf abgeschlossen!" }, - { 192, "%d Ordner durchsucht..." }, - { 193, "ScummVM-Hauptmen\374" }, - { 194, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, - { 195, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, - { 196, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, - { 197, "In Spieleliste suchen" }, - { 198, "Suchen:" }, - { 199, "SoundFont ausw\344hlen" }, - { 200, "Thema ausw\344hlen" }, - { 201, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, - { 202, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, - { 203, "Verzeichnis f\374r Oberfl\344chen-Themen" }, - { 204, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, - { 205, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, - { 206, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 207, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 208, "Verzeichnis mit Spieldateien ausw\344hlen" }, - { 209, "Empfindlichkeit" }, - { 210, "Server:" }, - { 211, "\326ffentliches Verzeichnis:" }, - { 212, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, - { 213, "Tastatur zeigen" }, - { 214, "Mauszeiger anzeigen" }, - { 215, "Untertitel anzeigen und Sprachausgabe aktivieren" }, - { 216, "Cursor zeigen/verbergen" }, - { 217, "\334berspringen" }, - { 218, "Zeile \374berspringen" }, - { 219, "Text \374berspringen" }, - { 220, "An Ecken anheften" }, - { 221, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, - { 222, "Ton ein/aus" }, - { 223, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, - { 224, "SoundFont:" }, - { 225, "Spr." }, - { 226, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, - { 227, "Lautst\344rke spezieller Soundeffekte" }, - { 228, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 230, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 231, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, - { 232, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, - { 233, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 234, "Legt fest, wo die Spielst\344nde abgelegt werden." }, - { 235, "Sprache" }, - { 236, "Sprachlautst\344rke:" }, - { 237, "Standard-Renderer (16bpp)" }, - { 238, "Ausgew\344hltes Spiel starten" }, - { 239, "Status:" }, - { 240, "Untert." }, - { 241, "Untertitel-Tempo:" }, - { 242, "Untertitel" }, - { 243, "Figur wechseln" }, - { 244, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, - { 245, "Text und Sprache:" }, - { 246, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, - { 247, "Themenpfad:" }, - { 248, "Thema:" }, - { 249, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, - { 250, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, - { 251, "Zeit: " }, - { 252, "Zeit\374berschreitung beim Starten des Netzwerks" }, - { 253, "Gehe zu X-Position" }, - { 254, "Gehe zu Y-Position" }, - { 255, "Touchpad-Modus ausgeschaltet." }, - { 256, "Touchpad-Modus aktiviert." }, - { 257, "Echte Roland-MT-32-Emulation" }, - { 258, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, - { 259, "Unbekannt" }, - { 260, "Unbekannter Fehler" }, - { 261, "DVD aush\344ngen" }, - { 262, "SMB aush\344ngen" }, - { 263, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, - { 264, "Farbmodus nicht unterst\374tzt" }, - { 265, "Unbenannt" }, - { 266, "Hoch" }, - { 267, "Benutzt MIDI und AdLib zur Sounderzeugung." }, - { 268, "Benutze den Trackpad-Style f\374r Maussteuerung" }, - { 269, "Gew\344hltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" }, - { 270, "Benutzername:" }, - { 271, "SDL-Treiber verwenden" }, - { 272, "Vertikale Bildverkleinerung:" }, - { 273, "Video" }, - { 274, "Virtuelle Tastatur" }, - { 275, "Lautst\344rke" }, - { 276, "Schreib-Berechtigung nicht vorhanden" }, - { 277, "Daten konnten nicht geschrieben werden." }, - { 278, "Ja" }, - { 279, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, - { 280, "Zone" }, - { 281, "Hineinzoomen" }, - { 282, "Herauszoomen" }, - { 283, "alle 10 Minuten" }, - { 284, "alle 15 Minuten" }, - { 285, "alle 30 Minuten" }, - { 286, "alle 5 Minuten" }, - { 287, "fehlgeschlagen\n" }, - { 288, "\334be~r~" }, - { 289, "Spiel ~h~inzuf\374gen..." }, - { 290, "~A~bbrechen" }, - { 291, "~S~chlie\337en" }, - { 292, "Spielo~p~tionen..." }, - { 293, "~H~ilfe" }, - { 294, "~K~ampfsteuerung f\374r Indiana Jones" }, - { 295, "~T~asten" }, - { 296, "~L~inke-Hand-Modus" }, - { 297, "~L~aden" }, - { 298, "~L~aden..." }, - { 299, "~W~eiter" }, - { 300, "~O~K" }, - { 301, "~O~ptionen" }, - { 302, "~O~ptionen" }, - { 303, "~Z~ur\374ck" }, - { 304, "~B~eenden" }, - { 305, "Spiel ~e~ntfernen" }, - { 306, "~F~ortsetzen" }, - { 307, "Zur Spiele~l~iste zur\374ckkehren" }, - { 308, "~S~peichern" }, - { 309, "~S~tarten" }, - { 310, "\334ber~g~\344nge aktiviert" }, - { 311, "~W~assereffekte aktiviert" }, - { 312, "~Z~ip-Modus aktiviert" }, + { 82, "C1Verwendete Funktionen:" }, + { 83, "Freie Ansicht" }, + { 84, "Voller Name des Spiels" }, + { 85, "Vollbildmodus" }, + { 86, "GC-Pad-Beschleunigung:" }, + { 87, "GC-Pad-Empfindlichkeit:" }, + { 88, "GFX" }, + { 90, "GUI-Sprache:" }, + { 91, "GUI-Renderer:" }, + { 92, "Spiel" }, + { 93, "Spieldaten nicht gefunden" }, + { 94, "Spielkennung nicht unterst\374tzt" }, + { 95, "Spielpfad:" }, + { 96, "Hauptmen\374" }, + { 97, "Zu h\366herer Pfadebene wechseln" }, + { 98, "Pfad hoch" }, + { 99, "Grafik" }, + { 100, "Grafikmodus:" }, + { 101, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, + { 104, "Werkzeugleiste verbergen" }, + { 105, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, + { 106, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, + { 107, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, + { 108, "Horizontale Bildverkleinerung:" }, + { 109, "FM Towns" }, + { 110, "Kennung:" }, + { 111, "Netzwerk starten" }, + { 112, "Verg\366\337erung des oberen Bildschirms:" }, + { 113, "Netzwerk wird gestartet..." }, + { 114, "Netzwerk wird gestartet..." }, + { 115, "Eingabe" }, + { 116, "Ung\374ltiges Verzeichnis" }, + { 117, "Tasten zuordnen" }, + { 118, "Tastatur" }, + { 119, "Tasten-Layout:" }, + { 120, "Tasten" }, + { 121, "Sprache der ScummVM-Oberfl\344che" }, + { 122, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." }, + { 123, "Sprache:" }, + { 124, "Links" }, + { 125, "Linksklick" }, + { 126, "Laden" }, + { 127, "Spiel laden:" }, + { 128, "Spielstand f\374r ausgew\344hltes Spiel laden" }, + { 129, "AdLib-Emulator" }, + { 130, "MIDI" }, + { 131, "MIDI-Lautst\344rke:" }, + { 132, "MT-32-Emulation" }, + { 134, "Hauptbildschirm-Skalierung:" }, + { 135, "Zuweisen" }, + { 136, "Durchsuchen..." }, + { 137, "Men\374" }, + { 138, "Verschiedenes" }, + { 139, "AdLib-/MIDI-Modus" }, + { 140, "DVD einbinden" }, + { 141, "SMB einbinden" }, + { 142, "Mausklick" }, + { 143, "Multi-Funktion" }, + { 144, "Musiklautst\344rke:" }, + { 145, "Alles aus" }, + { 146, "Name:" }, + { 147, "Netzwerk ist aus." }, + { 148, "Netzwerk nicht gestartet (%d)" }, + { 149, "Netzwerk gestartet" }, + { 150, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, + { 151, "Niemals" }, + { 152, "Nein" }, + { 153, "Kein Datum gespeichert" }, + { 154, "Keine Musik" }, + { 155, "Keine Spielzeit gespeichert" }, + { 156, "Keine Zeit gespeichert" }, + { 157, "Keine" }, + { 159, "OK" }, + { 160, "Ausgabefrequenz:" }, + { 161, "Globale MIDI-Einstellungen \374bergehen" }, + { 162, "Globale Audioeinstellungen \374bergehen" }, + { 163, "Globale Grafikeinstellungen \374bergehen" }, + { 164, "Globale Lautst\344rke-Einstellungen \374bergehen" }, + { 165, "PC-Lautsprecher" }, + { 166, "Passwort:" }, + { 167, "Ung\374ltiges Verzeichnis" }, + { 168, "Pfad ist keine Datei." }, + { 169, "Verzeichnis existiert nicht." }, + { 170, "Pfade" }, + { 171, "Pause" }, + { 172, "Spiel ausw\344hlen:" }, + { 173, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, + { 174, "Plattform:" }, + { 175, "Spieldauer: " }, + { 176, "Bitte eine Aktion ausw\344hlen" }, + { 177, "Plugin-Pfad:" }, + { 179, "Taste dr\374cken, um sie zuzuweisen" }, + { 180, "Beenden" }, + { 181, "ScummVM beenden" }, + { 182, "Lese-Berechtigung nicht vorhanden" }, + { 183, "Lesefehler aufgetreten" }, + { 184, "Tasten neu zuweisen" }, + { 185, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, + { 186, "Rendermodus:" }, + { 187, "Rechts" }, + { 188, "Rechtsklick" }, + { 189, "Rechtsklick" }, + { 190, "Drehen" }, + { 191, "Effektlautst\344rke:" }, + { 192, "SMB" }, + { 193, "Speichern" }, + { 194, "Spielst\344nde:" }, + { 195, "Speicherpfad: " }, + { 196, "Speichern:" }, + { 197, "Suchlauf abgeschlossen!" }, + { 198, "%d Ordner durchsucht..." }, + { 199, "ScummVM-Hauptmen\374" }, + { 200, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, + { 201, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, + { 202, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, + { 203, "In Spieleliste suchen" }, + { 204, "Suchen:" }, + { 205, "SoundFont ausw\344hlen" }, + { 206, "Thema ausw\344hlen" }, + { 207, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, + { 208, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, + { 209, "Verzeichnis f\374r Oberfl\344chen-Themen" }, + { 210, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, + { 211, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, + { 212, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 213, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 214, "Verzeichnis mit Spieldateien ausw\344hlen" }, + { 215, "Empfindlichkeit" }, + { 216, "Server:" }, + { 217, "\326ffentliches Verzeichnis:" }, + { 218, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, + { 219, "Tastatur zeigen" }, + { 220, "Mauszeiger anzeigen" }, + { 221, "Untertitel anzeigen und Sprachausgabe aktivieren" }, + { 222, "Cursor zeigen/verbergen" }, + { 223, "\334berspringen" }, + { 224, "Zeile \374berspringen" }, + { 225, "Text \374berspringen" }, + { 226, "An Ecken anheften" }, + { 227, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, + { 228, "Ton ein/aus" }, + { 229, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, + { 230, "SoundFont:" }, + { 231, "Spr." }, + { 232, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, + { 233, "Lautst\344rke spezieller Soundeffekte" }, + { 234, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 236, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 237, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, + { 238, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, + { 239, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 240, "Legt fest, wo die Spielst\344nde abgelegt werden." }, + { 241, "Sprache" }, + { 242, "Sprachlautst\344rke:" }, + { 243, "Standard-Renderer (16bpp)" }, + { 244, "Ausgew\344hltes Spiel starten" }, + { 245, "Status:" }, + { 246, "Untert." }, + { 247, "Untertitel-Tempo:" }, + { 248, "Untertitel" }, + { 249, "Figur wechseln" }, + { 250, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, + { 251, "Text und Sprache:" }, + { 252, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, + { 253, "Themenpfad:" }, + { 254, "Thema:" }, + { 255, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, + { 256, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, + { 257, "Zeit: " }, + { 258, "Zeit\374berschreitung beim Starten des Netzwerks" }, + { 259, "Gehe zu X-Position" }, + { 260, "Gehe zu Y-Position" }, + { 261, "Touchpad-Modus ausgeschaltet." }, + { 262, "Touchpad-Modus aktiviert." }, + { 263, "Echte Roland-MT-32-Emulation" }, + { 264, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, + { 265, "Unbekannt" }, + { 266, "Unbekannter Fehler" }, + { 267, "DVD aush\344ngen" }, + { 268, "SMB aush\344ngen" }, + { 269, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, + { 270, "Farbmodus nicht unterst\374tzt" }, + { 271, "Unbenannt" }, + { 272, "Hoch" }, + { 273, "Benutzt MIDI und AdLib zur Sounderzeugung." }, + { 274, "Benutze den Trackpad-Style f\374r Maussteuerung" }, + { 275, "Gew\344hltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" }, + { 276, "Benutzername:" }, + { 277, "SDL-Treiber verwenden" }, + { 278, "Vertikale Bildverkleinerung:" }, + { 279, "Video" }, + { 280, "Virtuelle Tastatur" }, + { 281, "Lautst\344rke" }, + { 282, "Windows MIDI" }, + { 283, "Schreib-Berechtigung nicht vorhanden" }, + { 284, "Daten konnten nicht geschrieben werden." }, + { 285, "Ja" }, + { 286, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, + { 287, "Zone" }, + { 288, "Hineinzoomen" }, + { 289, "Herauszoomen" }, + { 290, "alle 10 Minuten" }, + { 291, "alle 15 Minuten" }, + { 292, "alle 30 Minuten" }, + { 293, "alle 5 Minuten" }, + { 294, "fehlgeschlagen\n" }, + { 295, "\334be~r~" }, + { 296, "Spiel ~h~inzuf\374gen..." }, + { 297, "~A~bbrechen" }, + { 298, "~S~chlie\337en" }, + { 299, "Spielo~p~tionen..." }, + { 300, "~H~ilfe" }, + { 301, "~K~ampfsteuerung f\374r Indiana Jones" }, + { 302, "~T~asten" }, + { 303, "~L~inke-Hand-Modus" }, + { 304, "~L~aden" }, + { 305, "~L~aden..." }, + { 306, "~W~eiter" }, + { 307, "~O~K" }, + { 308, "~O~ptionen" }, + { 309, "~O~ptionen" }, + { 310, "~Z~ur\374ck" }, + { 311, "~B~eenden" }, + { 312, "Spiel ~e~ntfernen" }, + { 313, "~F~ortsetzen" }, + { 314, "Zur Spiele~l~iste zur\374ckkehren" }, + { 315, "~S~peichern" }, + { 316, "~S~tarten" }, + { 317, "\334ber~g~\344nge aktiviert" }, + { 318, "~W~assereffekte aktiviert" }, + { 319, "~Z~ip-Modus aktiviert" }, { -1, NULL } }; @@ -1319,6 +1654,7 @@ struct PoLangEntry { const PoLangEntry _translations[] = { { "ru_RU", "cp1251", _translation_ru_RU }, { "fr_FR", "iso-8859-1", _translation_fr_FR }, + { "ca_ES", "iso-8859-1", _translation_ca_ES }, { "hu_HU", "cp1250", _translation_hu_HU }, { "de_DE", "iso-8859-1", _translation_de_DE }, { NULL, NULL, NULL } diff --git a/po/POTFILES b/po/POTFILES index 6f23ac6c51..28ca60d31b 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -16,24 +16,30 @@ gui/ThemeEngine.cpp base/main.cpp common/error.cpp +common/util.cpp engines/dialogs.cpp engines/scumm/dialogs.cpp engines/mohawk/dialogs.cpp +sound/fmopl.cpp sound/musicplugin.cpp sound/null.h sound/null.cpp -sound/softsynth/mt32.cpp sound/softsynth/adlib.cpp +sound/softsynth/mt32.cpp +sound/softsynth/pcspk.cpp sound/softsynth/ym2612.cpp backends/keymapper/remap-dialog.cpp +backends/midi/windows.cpp backends/platform/ds/arm9/source/dsoptions.cpp backends/platform/iphone/osys_events.cpp +backends/platform/sdl/graphics.cpp backends/platform/symbian/src/SymbianActions.cpp backends/platform/symbian/src/SymbianOS.cpp backends/platform/wii/options.cpp backends/platform/wince/CEActionsPocket.cpp backends/platform/wince/CEActionsSmartphone.cpp backends/platform/wince/CELauncherDialog.cpp +backends/platform/wince/wince-sdl.cpp diff --git a/po/ca_ES.po b/po/ca_ES.po index ba2e4be096..edaf59cb46 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:03+0200\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" -"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Catalan\n" #: gui/about.cpp:96 #, c-format @@ -960,11 +960,11 @@ msgstr "~T~ransicions activades" msgid "~W~ater Effect Enabled" msgstr "~E~fecte de l'aigua activat" -#: sound/fmopl.cpp:50 +#: sound/fmopl.cpp:51 msgid "MAME OPL emulator" msgstr "Emulador OPL de MAME" -#: sound/fmopl.cpp:52 +#: sound/fmopl.cpp:53 msgid "DOSBox OPL emulator" msgstr "Emulador OPL de DOSBox" diff --git a/po/de_DE.po b/po/de_DE.po index 283e3fa134..ef0a7b9baa 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -3,12 +3,11 @@ # This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR , 2010. # -#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:30+0100\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: 2010-06-23 19:30+0100\n" "Last-Translator: \n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " @@ -20,15 +19,18 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 -msgid "C2(built on " +#, fuzzy, c-format +msgid "(built on %s)" msgstr "C2(erstellt am" -#: gui/about.cpp:104 -msgid "C1Features compiled in:" +#: gui/about.cpp:103 +#, fuzzy +msgid "Features compiled in:" msgstr "C1Verwendete Funktionen:" -#: gui/about.cpp:111 -msgid "C1Available engines:" +#: gui/about.cpp:112 +#, fuzzy +msgid "Available engines:" msgstr "C1Verfügbare Spiele-Engines:" #: gui/browser.cpp:69 @@ -40,7 +42,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -75,7 +77,8 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -143,7 +146,7 @@ msgstr "" "Spiels in eine deutsche verwandeln." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "" @@ -156,11 +159,11 @@ msgstr "Plattform:" msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "GFX" @@ -168,7 +171,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:889 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "Audio" @@ -176,7 +179,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:893 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "Lautstärke" @@ -184,7 +187,7 @@ msgstr "Lautst msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:901 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "MIDI" @@ -192,7 +195,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:907 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "Pfade" @@ -200,7 +203,7 @@ msgstr "Pfade" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:920 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "Extrapfad:" @@ -212,18 +215,18 @@ msgstr "Legt das Verzeichnis f msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 -#: gui/options.cpp:915 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 #: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 -#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 -#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 -#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 -#: gui/options.cpp:1063 gui/options.cpp:1162 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" msgstr "Keine" @@ -232,7 +235,7 @@ msgstr "Keine" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1156 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -326,7 +329,7 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:712 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "Wert löschen" @@ -512,22 +515,22 @@ msgstr "" #: gui/options.cpp:656 #, fuzzy -msgid "Specifies default sound device for General Midi output" +msgid "Specifies default sound device for General MIDI output" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:687 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:687 gui/options.cpp:688 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:698 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:698 gui/options.cpp:699 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -535,28 +538,28 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:710 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:710 gui/options.cpp:711 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -564,145 +567,145 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:724 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:737 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:742 gui/options.cpp:748 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "Beides" -#: gui/options.cpp:748 +#: gui/options.cpp:749 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:749 +#: gui/options.cpp:750 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:750 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:754 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:773 +#: gui/options.cpp:774 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:776 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:776 gui/options.cpp:777 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:783 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Save Path: " msgstr "Speicherpfad: " -#: gui/options.cpp:917 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:920 gui/options.cpp:921 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:924 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:929 +#: gui/options.cpp:930 msgid "Misc" msgstr "Verschiedenes" -#: gui/options.cpp:931 +#: gui/options.cpp:932 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:935 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:941 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:949 +#: gui/options.cpp:950 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:961 +#: gui/options.cpp:962 msgid "English" msgstr "English" -#: gui/options.cpp:1095 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1108 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1115 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1124 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1134 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1145 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -873,6 +876,14 @@ msgstr "Daten konnten nicht geschrieben werden." msgid "Unknown Error" msgstr "Unbekannter Fehler" +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "" + #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "~F~ortsetzen" @@ -952,10 +963,24 @@ msgstr " msgid "~W~ater Effect Enabled" msgstr "~W~assereffekte aktiviert" +#: sound/fmopl.cpp:51 +#, fuzzy +msgid "MAME OPL emulator" +msgstr "AdLib-Emulator" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "" + #: sound/null.h:45 msgid "No music" msgstr "Keine Musik" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "AdLib-Emulator" + #: sound/softsynth/mt32.cpp:327 #, fuzzy msgid "Initialising MT-32 Emulator" @@ -966,10 +991,15 @@ msgstr "Netzwerk wird gestartet..." msgid "MT-32 Emulator" msgstr "MT-32-Emulation" -#: sound/softsynth/adlib.cpp:1590 +#: sound/softsynth/pcspk.cpp:142 #, fuzzy -msgid "AdLib Emulator" -msgstr "AdLib-Emulator" +msgid "PC Speaker Emulator" +msgstr "PC-Lautsprecher" + +#: sound/softsynth/pcspk.cpp:161 +#, fuzzy +msgid "IBM PCjr Emulator" +msgstr "FM Towns" #: sound/softsynth/ym2612.cpp:762 #, fuzzy @@ -992,6 +1022,10 @@ msgstr " (Global)" msgid " (Game)" msgstr " (Spiel)" +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "Windows MIDI" + #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" msgstr "ScummVM-Hauptmenü" @@ -1072,6 +1106,12 @@ msgstr "Touchpad-Modus aktiviert." msgid "Touchpad mode disabled." msgstr "Touchpad-Modus ausgeschaltet." +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" @@ -1152,10 +1192,6 @@ msgstr "Tasten zuordnen" msgid "Do you want to quit ?" msgstr "Möchten Sie beenden?" -#: backends/platform/wii/options.cpp:47 -msgid "Ok" -msgstr "OK" - #: backends/platform/wii/options.cpp:51 msgid "Video" msgstr "Video" @@ -1368,12 +1404,12 @@ msgstr "Anzeige" msgid "Do you want to perform an automatic scan ?" msgstr "Möchten Sie eine automatische Durchsuchung vornehmen?" +#~ msgid "Ok" +#~ msgstr "OK" + #~ msgid "Music driver:" #~ msgstr "Musiktreiber" -#~ msgid "Windows MIDI" -#~ msgstr "Windows MIDI" - #~ msgid "ALSA" #~ msgstr "ALSA" @@ -1407,9 +1443,6 @@ msgstr "M #~ msgid "AdLib" #~ msgstr "AdLib" -#~ msgid "PC Speaker" -#~ msgstr "PC-Lautsprecher" - #~ msgid "IBM PCjr" #~ msgstr "IBM PCjr" diff --git a/po/fr_FR.po b/po/fr_FR.po index 4ae04d05f0..70a22bb0f3 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -3,12 +3,11 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:30+0100\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: 2010-06-19 23:43+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" @@ -19,15 +18,18 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:96 -msgid "C2(built on " +#, fuzzy, c-format +msgid "(built on %s)" msgstr "C2(compilé sur" -#: gui/about.cpp:104 -msgid "C1Features compiled in:" +#: gui/about.cpp:103 +#, fuzzy +msgid "Features compiled in:" msgstr "C1Options incluses:" -#: gui/about.cpp:111 -msgid "C1Available engines:" +#: gui/about.cpp:112 +#, fuzzy +msgid "Available engines:" msgstr "C1Moteurs disponibles:" #: gui/browser.cpp:69 @@ -39,7 +41,7 @@ msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -74,7 +76,8 @@ msgid "Map" msgstr "Affecter" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -142,7 +145,7 @@ msgstr "" "espagnole du jeu." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "" @@ -155,11 +158,11 @@ msgstr "Plateforme:" msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "GFX" @@ -167,7 +170,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifique à ce jeux" -#: gui/launcher.cpp:213 gui/options.cpp:889 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "Audio" @@ -175,7 +178,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifique à ce jeux" -#: gui/launcher.cpp:223 gui/options.cpp:893 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "Volume" @@ -183,7 +186,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifique à ce jeux" -#: gui/launcher.cpp:232 gui/options.cpp:901 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "MIDI" @@ -191,7 +194,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifique à ce jeux" -#: gui/launcher.cpp:244 gui/options.cpp:907 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "Chemins" @@ -199,7 +202,7 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 gui/options.cpp:920 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "Extra:" @@ -211,18 +214,18 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 -#: gui/options.cpp:915 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 #: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 -#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 -#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 -#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 -#: gui/options.cpp:1063 gui/options.cpp:1162 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" msgstr "Aucun" @@ -231,7 +234,7 @@ msgstr "Aucun" msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 gui/options.cpp:1156 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "Choisir une banque de sons" @@ -324,7 +327,7 @@ msgstr "Recherche dans la liste de jeux" msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 gui/options.cpp:712 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "Effacer la valeur" @@ -509,22 +512,22 @@ msgstr "" #: gui/options.cpp:656 #, fuzzy -msgid "Specifies default sound device for General Midi output" +msgid "Specifies default sound device for General MIDI output" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:687 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:687 gui/options.cpp:688 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:698 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:698 gui/options.cpp:699 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -532,29 +535,29 @@ msgstr "" "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " "être supporté par votre carte son" -#: gui/options.cpp:710 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:710 gui/options.cpp:711 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " "Timidity" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -562,144 +565,144 @@ msgstr "" "Vérifie si vous voulez utiliser un périphérique audio compatible Roland " "connecté à l'ordinateur" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:724 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:737 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:742 gui/options.cpp:748 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:748 +#: gui/options.cpp:749 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:749 +#: gui/options.cpp:750 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:750 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:754 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:773 +#: gui/options.cpp:774 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:776 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:776 gui/options.cpp:777 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:783 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:917 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:920 gui/options.cpp:921 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Spécifie un chemin vers des données supplémentaires utilisées par tous les " "jeux ou ScummVM" -#: gui/options.cpp:924 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:929 +#: gui/options.cpp:930 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:931 +#: gui/options.cpp:932 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:935 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:941 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:949 +#: gui/options.cpp:950 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:961 +#: gui/options.cpp:962 msgid "English" msgstr "Anglais" -#: gui/options.cpp:1095 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "" "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1108 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1115 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " "répertoire." -#: gui/options.cpp:1124 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1134 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1145 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" @@ -872,6 +875,14 @@ msgstr "Echec de l' msgid "Unknown Error" msgstr "Erreur inconnue" +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "" + #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "~R~eprendre" @@ -952,10 +963,24 @@ msgstr "T~r~ansitions activ msgid "~W~ater Effect Enabled" msgstr "~E~ffets de l'Eau activés" +#: sound/fmopl.cpp:51 +#, fuzzy +msgid "MAME OPL emulator" +msgstr "Émulateur AdLib:" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "" + #: sound/null.h:45 msgid "No music" msgstr "Pas de musique" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "Émulateur AdLib:" + #: sound/softsynth/mt32.cpp:327 #, fuzzy msgid "Initialising MT-32 Emulator" @@ -966,10 +991,15 @@ msgstr "Initialisation du r msgid "MT-32 Emulator" msgstr "Émulation MT-32" -#: sound/softsynth/adlib.cpp:1590 +#: sound/softsynth/pcspk.cpp:142 #, fuzzy -msgid "AdLib Emulator" -msgstr "Émulateur AdLib:" +msgid "PC Speaker Emulator" +msgstr "Haut Parleur PC" + +#: sound/softsynth/pcspk.cpp:161 +#, fuzzy +msgid "IBM PCjr Emulator" +msgstr "FM Towns" #: sound/softsynth/ym2612.cpp:762 #, fuzzy @@ -992,6 +1022,10 @@ msgstr "(Global)" msgid " (Game)" msgstr "(Jeu)" +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "MIDI Windows" + #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" msgstr "Menu Principal ScummVM" @@ -1072,6 +1106,12 @@ msgstr "Mode touchpad activ msgid "Touchpad mode disabled." msgstr "Mode touchpad désactivé" +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" @@ -1153,10 +1193,6 @@ msgstr "Affectation des touches" msgid "Do you want to quit ?" msgstr "Voulez-vous quitter?" -#: backends/platform/wii/options.cpp:47 -msgid "Ok" -msgstr "Ok" - #: backends/platform/wii/options.cpp:51 msgid "Video" msgstr "Vidéo" @@ -1381,12 +1417,12 @@ msgstr "Affichage" msgid "Do you want to perform an automatic scan ?" msgstr "Voulez-vous exécuter une recherche automatique?" +#~ msgid "Ok" +#~ msgstr "Ok" + #~ msgid "Music driver:" #~ msgstr "Pilote audio:" -#~ msgid "Windows MIDI" -#~ msgstr "MIDI Windows" - #~ msgid "ALSA" #~ msgstr "ALSA" @@ -1420,9 +1456,6 @@ msgstr "Voulez-vous ex #~ msgid "AdLib" #~ msgstr "AdLib" -#~ msgid "PC Speaker" -#~ msgstr "Haut Parleur PC" - #~ msgid "IBM PCjr" #~ msgstr "IBM PCjr" diff --git a/po/hu_HU.po b/po/hu_HU.po index f0ec87897a..62e18f3ae0 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -3,31 +3,31 @@ # This file is distributed under the same license as the ScummVM package. # Alex Bevilacqua , 2009. # -#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:22+0200\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" +"Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gui/about.cpp:96 -msgid "C2(built on " +#, c-format +msgid "(built on %s)" msgstr "" -#: gui/about.cpp:104 -msgid "C1Features compiled in:" +#: gui/about.cpp:103 +msgid "Features compiled in:" msgstr "" -#: gui/about.cpp:111 -msgid "C1Available engines:" +#: gui/about.cpp:112 +msgid "Available engines:" msgstr "" #: gui/browser.cpp:69 @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -74,7 +74,8 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "Igen" @@ -138,7 +139,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "" @@ -151,11 +152,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "" @@ -163,7 +164,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:889 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "Hang" @@ -171,7 +172,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:893 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "Volumene" @@ -179,7 +180,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:901 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "" @@ -187,7 +188,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:907 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "Ösvények" @@ -196,7 +197,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:920 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -209,18 +210,18 @@ msgstr "" msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 -#: gui/options.cpp:915 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 #: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 -#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 -#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 -#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 -#: gui/options.cpp:1063 gui/options.cpp:1162 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" msgstr "Semmi" @@ -230,7 +231,7 @@ msgstr "Semmi" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1156 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "" @@ -322,7 +323,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:712 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "" @@ -503,188 +504,188 @@ msgid "GM Device:" msgstr "" #: gui/options.cpp:656 -msgid "Specifies default sound device for General Midi output" +msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:687 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:687 gui/options.cpp:688 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:698 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:698 gui/options.cpp:699 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:710 gui/options.cpp:711 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:724 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:737 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:742 gui/options.cpp:748 +#: gui/options.cpp:743 gui/options.cpp:749 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:744 gui/options.cpp:750 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "" -#: gui/options.cpp:748 +#: gui/options.cpp:749 msgid "Spch" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:750 msgid "Subs" msgstr "" -#: gui/options.cpp:750 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:754 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:773 +#: gui/options.cpp:774 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:776 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:776 gui/options.cpp:777 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:783 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Save Path: " msgstr "" -#: gui/options.cpp:917 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:920 gui/options.cpp:921 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:924 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:929 +#: gui/options.cpp:930 msgid "Misc" msgstr "" -#: gui/options.cpp:931 +#: gui/options.cpp:932 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:935 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:941 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:949 +#: gui/options.cpp:950 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:961 +#: gui/options.cpp:962 msgid "English" msgstr "" -#: gui/options.cpp:1095 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1108 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1115 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1124 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1134 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1145 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "" @@ -855,6 +856,14 @@ msgstr "" msgid "Unknown Error" msgstr "" +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "" + #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "" @@ -936,10 +945,24 @@ msgstr "" msgid "~W~ater Effect Enabled" msgstr "" +#: sound/fmopl.cpp:51 +#, fuzzy +msgid "MAME OPL emulator" +msgstr "AdLib vezet :" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "" + #: sound/null.h:45 msgid "No music" msgstr "" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "AdLib vezet :" + #: sound/softsynth/mt32.cpp:327 msgid "Initialising MT-32 Emulator" msgstr "" @@ -948,10 +971,13 @@ msgstr "" msgid "MT-32 Emulator" msgstr "" -#: sound/softsynth/adlib.cpp:1590 -#, fuzzy -msgid "AdLib Emulator" -msgstr "AdLib vezet :" +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" +msgstr "" #: sound/softsynth/ym2612.cpp:762 msgid "FM Towns Emulator" @@ -973,6 +999,10 @@ msgstr "" msgid " (Game)" msgstr "" +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "" + #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" msgstr "" @@ -1054,6 +1084,12 @@ msgstr "" msgid "Touchpad mode disabled." msgstr "" +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" @@ -1136,10 +1172,6 @@ msgstr "" msgid "Do you want to quit ?" msgstr "" -#: backends/platform/wii/options.cpp:47 -msgid "Ok" -msgstr "" - #: backends/platform/wii/options.cpp:51 msgid "Video" msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po index 727af8219b..31284b45df 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -3,32 +3,34 @@ # This file is distributed under the same license as the ScummVM package. # Eugene Sandulenko , 2010. # -#: sound/null.cpp:35 msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:22+0200\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1251\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" -"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Language: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" +"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:96 -msgid "C2(built on " +#, fuzzy, c-format +msgid "(built on %s)" msgstr "C2(ñîáðàí " -#: gui/about.cpp:104 -msgid "C1Features compiled in:" +#: gui/about.cpp:103 +#, fuzzy +msgid "Features compiled in:" msgstr "C1Âêëþ÷åííûå â áèëä îïöèè:" -#: gui/about.cpp:111 -msgid "C1Available engines:" +#: gui/about.cpp:112 +#, fuzzy +msgid "Available engines:" msgstr "C1Äîñòóïíûå äâèæêè:" #: gui/browser.cpp:69 @@ -40,7 +42,7 @@ msgid "Go to previous directory level" msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -75,7 +77,8 @@ msgid "Map" msgstr "Íàçíà÷èòü" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "OK" @@ -143,7 +146,7 @@ msgstr "" "ðóññêóþ" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "<ïî óìîë÷àíèþ>" @@ -156,11 +159,11 @@ msgstr " msgid "Platform the game was originally designed for" msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "Ãðàôèêà" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "Ãðô" @@ -168,7 +171,7 @@ msgstr " msgid "Override global graphic settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" -#: gui/launcher.cpp:213 gui/options.cpp:889 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "Àóäèî" @@ -176,7 +179,7 @@ msgstr " msgid "Override global audio settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" -#: gui/launcher.cpp:223 gui/options.cpp:893 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "Ãðîìêîñòü" @@ -184,7 +187,7 @@ msgstr " msgid "Override global volume settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" -#: gui/launcher.cpp:232 gui/options.cpp:901 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "MIDI" @@ -192,7 +195,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:907 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "Ïóòè" @@ -200,7 +203,7 @@ msgstr " msgid "Game Path:" msgstr "Ïóòü ê èãðå: " -#: gui/launcher.cpp:254 gui/options.cpp:920 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "Äîï. ïóòü:" @@ -212,18 +215,18 @@ msgstr " msgid "Save Path:" msgstr "Ïóòü ñîõð.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 -#: gui/options.cpp:915 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 #: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 -#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 -#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 -#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 -#: gui/options.cpp:1063 gui/options.cpp:1162 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" msgstr "Íå çàäàí" @@ -232,7 +235,7 @@ msgstr " msgid "Default" msgstr "Ïî óìîë÷àíèþ" -#: gui/launcher.cpp:391 gui/options.cpp:1156 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "Âûáåðèòå SoundFont" @@ -324,7 +327,7 @@ msgstr " msgid "Search:" msgstr "Ïîèñê:" -#: gui/launcher.cpp:529 gui/options.cpp:712 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "Î÷èñòèòü çíà÷åíèå" @@ -508,22 +511,22 @@ msgstr "" #: gui/options.cpp:656 #, fuzzy -msgid "Specifies default sound device for General Midi output" +msgid "Specifies default sound device for General MIDI output" msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" -#: gui/options.cpp:687 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "Ýìóëÿòîð AdLib:" -#: gui/options.cpp:687 gui/options.cpp:688 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" -#: gui/options.cpp:698 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Âûõîäíàÿ ÷àñòîòà:" -#: gui/options.cpp:698 gui/options.cpp:699 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,29 +534,29 @@ msgstr "" "ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " "ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" -#: gui/options.cpp:710 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:710 gui/options.cpp:711 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " "Timidity" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -561,142 +564,142 @@ msgstr "" "Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " "õîòèòå åãî èñïîëüçîâàòü" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "Âêëþ÷èòü ðåæèì Roland GS" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" -#: gui/options.cpp:724 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "Óñèëåíèå MIDI:" -#: gui/options.cpp:737 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "Òåêñò è îçâó÷êà:" -#: gui/options.cpp:742 gui/options.cpp:748 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Speech" msgstr "Îçâó÷êà" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Subtitles" msgstr "Ñóáòèòðû" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "Âñ¸" -#: gui/options.cpp:748 +#: gui/options.cpp:749 msgid "Spch" msgstr "Îçâ" -#: gui/options.cpp:749 +#: gui/options.cpp:750 msgid "Subs" msgstr "Ñóá" -#: gui/options.cpp:750 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" -#: gui/options.cpp:754 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "Ñêîðîñòü ñóáòèòðîâ:" -#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "Ãðîìêîñòü ìóçûêè:" -#: gui/options.cpp:773 +#: gui/options.cpp:774 msgid "Mute All" msgstr "Âûêëþ÷èòü âñ¸" -#: gui/options.cpp:776 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "Ãðîìêîñòü ýôôåêòîâ:" -#: gui/options.cpp:776 gui/options.cpp:777 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" -#: gui/options.cpp:783 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "Ãðîìêîñòü îçâó÷êè:" -#: gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Save Path: " msgstr "Ïóòü äëÿ ñîõðàíåíèé: " -#: gui/options.cpp:917 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "Ïóòü ê òåìàì:" -#: gui/options.cpp:920 gui/options.cpp:921 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " "ëèáî ScummVM" -#: gui/options.cpp:924 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "Ïóòü ê ïëàãèíàì:" -#: gui/options.cpp:929 +#: gui/options.cpp:930 msgid "Misc" msgstr "Ðàçíîå" -#: gui/options.cpp:931 +#: gui/options.cpp:932 msgid "Theme:" msgstr "Òåìà:" -#: gui/options.cpp:935 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "Ðàñòåðèçàòîð GUI:" -#: gui/options.cpp:941 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "Àâòîñîõðàíåíèå:" -#: gui/options.cpp:949 +#: gui/options.cpp:950 msgid "Keys" msgstr "Êëàâèøè" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "ßçûê èíòåðôåéñà:" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" -#: gui/options.cpp:961 +#: gui/options.cpp:962 msgid "English" msgstr "English" -#: gui/options.cpp:1095 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." -#: gui/options.cpp:1108 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" -#: gui/options.cpp:1115 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." -#: gui/options.cpp:1124 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" -#: gui/options.cpp:1134 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" -#: gui/options.cpp:1145 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" @@ -867,6 +870,14 @@ msgstr " msgid "Unknown Error" msgstr "Íåèçâåñòíàÿ îøèáêà" +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "" + #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "Ïðîäîë~æ~èòü" @@ -946,10 +957,24 @@ msgstr " msgid "~W~ater Effect Enabled" msgstr "Ýôôåêòû âîäû âêëþ÷åíû" +#: sound/fmopl.cpp:51 +#, fuzzy +msgid "MAME OPL emulator" +msgstr "Ýìóëÿòîð AdLib:" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "" + #: sound/null.h:45 msgid "No music" msgstr "Áåç ìóçûêè" +#: sound/softsynth/adlib.cpp:1590 +#, fuzzy +msgid "AdLib Emulator" +msgstr "Ýìóëÿòîð AdLib:" + #: sound/softsynth/mt32.cpp:327 #, fuzzy msgid "Initialising MT-32 Emulator" @@ -960,10 +985,15 @@ msgstr " msgid "MT-32 Emulator" msgstr "Ýìóëÿöèÿ MT-32" -#: sound/softsynth/adlib.cpp:1590 +#: sound/softsynth/pcspk.cpp:142 #, fuzzy -msgid "AdLib Emulator" -msgstr "Ýìóëÿòîð AdLib:" +msgid "PC Speaker Emulator" +msgstr "PC ñïèêåð" + +#: sound/softsynth/pcspk.cpp:161 +#, fuzzy +msgid "IBM PCjr Emulator" +msgstr "FM Towns" #: sound/softsynth/ym2612.cpp:762 #, fuzzy @@ -986,6 +1016,10 @@ msgstr " ( msgid " (Game)" msgstr " (Èãðû)" +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "Windows MIDI" + #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" msgstr "Ãëàâíîå ìåíþ ScummVM" @@ -1066,6 +1100,12 @@ msgstr " msgid "Touchpad mode disabled." msgstr "Ðåæèì òà÷ïàäà âûêëþ÷åí." +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" @@ -1146,10 +1186,6 @@ msgstr " msgid "Do you want to quit ?" msgstr "Âû õîòèòå âûéòè?" -#: backends/platform/wii/options.cpp:47 -msgid "Ok" -msgstr "Ok" - #: backends/platform/wii/options.cpp:51 msgid "Video" msgstr "Âèäåî" @@ -1362,12 +1398,12 @@ msgstr " msgid "Do you want to perform an automatic scan ?" msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" +#~ msgid "Ok" +#~ msgstr "Ok" + #~ msgid "Music driver:" #~ msgstr "Äðàéâåð ìóçûêè:" -#~ msgid "Windows MIDI" -#~ msgstr "Windows MIDI" - #~ msgid "ALSA" #~ msgstr "ALSA" @@ -1401,9 +1437,6 @@ msgstr " #~ msgid "AdLib" #~ msgstr "AdLib" -#~ msgid "PC Speaker" -#~ msgstr "PC ñïèêåð" - #~ msgid "IBM PCjr" #~ msgstr "IBM PCjr" diff --git a/po/scummvm.pot b/po/scummvm.pot index b796a7d384..b8f164e1ba 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -3,31 +3,30 @@ # This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR , YEAR. # -#: sound/null.cpp:35 #, fuzzy msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-24 23:22+0200\n" +"POT-Creation-Date: 2010-06-26 18:15+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: gui/about.cpp:96 -msgid "C2(built on " +#, c-format +msgid "(built on %s)" msgstr "" -#: gui/about.cpp:104 -msgid "C1Features compiled in:" +#: gui/about.cpp:103 +msgid "Features compiled in:" msgstr "" -#: gui/about.cpp:111 -msgid "C1Available engines:" +#: gui/about.cpp:112 +msgid "Available engines:" msgstr "" #: gui/browser.cpp:69 @@ -39,7 +38,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:978 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -74,7 +73,8 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:979 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" msgstr "" @@ -138,7 +138,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:959 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "" @@ -151,11 +151,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:866 gui/options.cpp:883 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "" @@ -163,7 +163,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:889 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "" @@ -171,7 +171,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:893 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "" @@ -179,7 +179,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:901 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "" @@ -187,7 +187,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:907 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "" @@ -195,7 +195,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:920 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "" @@ -207,18 +207,18 @@ msgstr "" msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:914 -#: gui/options.cpp:915 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 #: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:711 gui/options.cpp:918 -#: gui/options.cpp:921 gui/options.cpp:925 gui/options.cpp:1002 -#: gui/options.cpp:1008 gui/options.cpp:1014 gui/options.cpp:1022 -#: gui/options.cpp:1046 gui/options.cpp:1050 gui/options.cpp:1056 -#: gui/options.cpp:1063 gui/options.cpp:1162 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1156 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "" @@ -319,7 +319,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:712 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "" @@ -499,186 +499,186 @@ msgid "GM Device:" msgstr "" #: gui/options.cpp:656 -msgid "Specifies default sound device for General Midi output" +msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:687 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:687 gui/options.cpp:688 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:698 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "" -#: gui/options.cpp:698 gui/options.cpp:699 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:710 gui/options.cpp:711 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:715 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:718 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:721 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:724 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:737 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:742 gui/options.cpp:748 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Speech" msgstr "" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Subtitles" msgstr "" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "" -#: gui/options.cpp:748 +#: gui/options.cpp:749 msgid "Spch" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:750 msgid "Subs" msgstr "" -#: gui/options.cpp:750 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:754 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:766 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "" -#: gui/options.cpp:773 +#: gui/options.cpp:774 msgid "Mute All" msgstr "" -#: gui/options.cpp:776 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:776 gui/options.cpp:777 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:783 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:914 +#: gui/options.cpp:915 msgid "Save Path: " msgstr "" -#: gui/options.cpp:917 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:920 gui/options.cpp:921 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:924 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:929 +#: gui/options.cpp:930 msgid "Misc" msgstr "" -#: gui/options.cpp:931 +#: gui/options.cpp:932 msgid "Theme:" msgstr "" -#: gui/options.cpp:935 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:941 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "" -#: gui/options.cpp:949 +#: gui/options.cpp:950 msgid "Keys" msgstr "" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:956 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:961 +#: gui/options.cpp:962 msgid "English" msgstr "" -#: gui/options.cpp:1095 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1108 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1115 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1124 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1134 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1145 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "" @@ -847,6 +847,14 @@ msgstr "" msgid "Unknown Error" msgstr "" +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "" + #: engines/dialogs.cpp:89 msgid "~R~esume" msgstr "" @@ -926,10 +934,22 @@ msgstr "" msgid "~W~ater Effect Enabled" msgstr "" +#: sound/fmopl.cpp:51 +msgid "MAME OPL emulator" +msgstr "" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "" + #: sound/null.h:45 msgid "No music" msgstr "" +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" +msgstr "" + #: sound/softsynth/mt32.cpp:327 msgid "Initialising MT-32 Emulator" msgstr "" @@ -938,8 +958,12 @@ msgstr "" msgid "MT-32 Emulator" msgstr "" -#: sound/softsynth/adlib.cpp:1590 -msgid "AdLib Emulator" +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" msgstr "" #: sound/softsynth/ym2612.cpp:762 @@ -962,6 +986,10 @@ msgstr "" msgid " (Game)" msgstr "" +#: backends/midi/windows.cpp:156 +msgid "Windows MIDI" +msgstr "" + #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" msgstr "" @@ -1042,6 +1070,12 @@ msgstr "" msgid "Touchpad mode disabled." msgstr "" +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "" + #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" @@ -1122,10 +1156,6 @@ msgstr "" msgid "Do you want to quit ?" msgstr "" -#: backends/platform/wii/options.cpp:47 -msgid "Ok" -msgstr "" - #: backends/platform/wii/options.cpp:51 msgid "Video" msgstr "" -- cgit v1.2.3 From 79b5e7d77e26da5b27a2dd6d8527ca47fd873b09 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 16:21:28 +0000 Subject: SCI: fixing stupid torturegit conflict merge svn-id: r50329 --- engines/sci/engine/vm.cpp | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 3d43ae3eb2..46aeca1a68 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -200,6 +200,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon + { GID_KQ5, 25, "rm025", "doit", -1, 0, 0 }, // inside witch forest { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller @@ -218,17 +219,17 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (lastCall->localCallOffset != -1) { // if lastcall was actually a local call search back for a real call - Common::List::iterator callIterator = state->_executionStack.end(); - while (callIterator != state->_executionStack.begin()) { - callIterator--; - ExecStack loopCall = *callIterator; - if ((loopCall.selector != -1) || (loopCall.exportId != -1)) { - lastCall->selector = loopCall.selector; - lastCall->exportId = loopCall.exportId; - break; - } - } - } + Common::List::iterator callIterator = state->_executionStack.end(); + while (callIterator != state->_executionStack.begin()) { + callIterator--; + ExecStack loopCall = *callIterator; + if ((loopCall.selector != -1) || (loopCall.exportId != -1)) { + lastCall->selector = loopCall.selector; + lastCall->exportId = loopCall.exportId; + break; + } + } + } Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); Common::String curMethodName; @@ -497,7 +498,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt reg_t newReg = argp[1]; const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); warning("send_selector(): argc = %d while modifying variable selector " - "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", + "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", argc, selector, selectorName, PRINT_REG(send_obj), objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); } @@ -695,7 +696,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { // Used for debugging Common::String debugMsg = kernelFunc.origName + Common::String::printf("[0x%x]", kernelFuncNum) + - Common::String::printf(", %d params: ", argc) + + Common::String::printf(", %d params: ", argc) + " ("; for (int i = 0; i < argc; i++) { @@ -896,13 +897,13 @@ void run_vm(EngineState *s, bool restoring) { } if (s->xs->sp < s->xs->fp) - error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", + error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", PRINT_REG(*s->xs->sp), PRINT_REG(*s->xs->fp)); s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; if (s->xs->addr.pc.offset >= code_buf_size) - error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", + error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", s->xs->addr.pc.offset, code_buf_size); // Get opcode @@ -1107,8 +1108,8 @@ void run_vm(EngineState *s, bool restoring) { // (Print "foo") // Pointer to a string // (Print 420 5) // Reference to the fifth message in text resource 420 - // It works because in those games, the maximum resource number is 999, - // so any parameter value above that threshold must be a pointer. + // It works because in those games, the maximum resource number is 999, + // so any parameter value above that threshold must be a pointer. if (r_temp.segment && (s->r_acc == make_reg(0, 1000))) s->r_acc = make_reg(0, 1); else if (r_temp.segment && s->r_acc.segment) -- cgit v1.2.3 From 41aca44b037c129d837021eb0d0e91990e41856a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 16:27:01 +0000 Subject: SCI: another commit for adding a workaround for islang room 300 again (although i already commited it already, stupid torturegit) svn-id: r50330 --- engines/sci/graphics/paint16.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 88fa467b3a..c2e8d2c5d0 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -536,6 +536,8 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { } break; default: + if ((g_sci->getGameId() == GID_ISLANDBRAIN) && (g_sci->getEngineState()->currentRoomNumber() == 300)) + break; // WORKAROUND: we are called there with an forwarded 0 as additional parameter (script bug) error("Unknown kDisplay argument %X", displayArg); break; } -- cgit v1.2.3 From 61295bcc4ef0426e772211fc0a5212796acab83f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 16:54:09 +0000 Subject: SCI: pseudo-adding workaround for kq5 room 25 witch forest svn-id: r50332 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 46aeca1a68..1778d6e339 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -200,7 +200,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon - { GID_KQ5, 25, "rm025", "doit", -1, 0, 0 }, // inside witch forest + { GID_KQ5, 25, "rm025", "doit", -1, 0, 0 }, // inside witch forest, where the walking rock is { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller -- cgit v1.2.3 From 554640ee8a41fdfd29bbb4a710b7eae4255a2d8e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 26 Jun 2010 17:21:50 +0000 Subject: Fix saving while viewing the inventory in Riven and cleanup the save/load code. svn-id: r50333 --- engines/mohawk/resource.cpp | 2 +- engines/mohawk/riven.cpp | 1 + engines/mohawk/riven_saveload.cpp | 67 +++++++++++++++++++++++---------------- engines/mohawk/riven_saveload.h | 3 -- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp index 62a857b90b..74efd6770f 100644 --- a/engines/mohawk/resource.cpp +++ b/engines/mohawk/resource.cpp @@ -103,7 +103,7 @@ void MohawkArchive::open(Common::SeekableReadStream *stream) { else debug (3, "Type[%02d]: Tag = \'%s\' ResTable Offset = %04x NameTable Offset = %04x", i, tag2str(_types[i].tag), _types[i].resource_table_offset, _types[i].name_table_offset); - //Resource Table + // Resource Table _mhk->seek(_rsrc.abs_offset + _types[i].resource_table_offset); _types[i].resTable.resources = _mhk->readUint16BE(); diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 1e7f006be1..44b7868373 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -29,6 +29,7 @@ #include "common/keyboard.h" #include "mohawk/graphics.h" +#include "mohawk/resource.h" #include "mohawk/riven.h" #include "mohawk/riven_external.h" #include "mohawk/riven_saveload.h" diff --git a/engines/mohawk/riven_saveload.cpp b/engines/mohawk/riven_saveload.cpp index 3c989838da..d73b4ec0dc 100644 --- a/engines/mohawk/riven_saveload.cpp +++ b/engines/mohawk/riven_saveload.cpp @@ -23,6 +23,7 @@ * */ +#include "mohawk/resource.h" #include "mohawk/riven.h" #include "mohawk/riven_saveload.h" @@ -31,11 +32,9 @@ namespace Mohawk { RivenSaveLoad::RivenSaveLoad(MohawkEngine_Riven *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) { - _loadFile = new MohawkArchive(); } RivenSaveLoad::~RivenSaveLoad() { - delete _loadFile; } Common::StringArray RivenSaveLoad::generateSaveGameList() { @@ -63,7 +62,8 @@ static uint16 mapOldStackIDToNew(uint16 oldID) { case 8: return aspit; } - error ("Unknown old stack ID %d", oldID); + + error("Unknown old stack ID %d", oldID); return 0; } @@ -86,7 +86,8 @@ static uint16 mapNewStackIDToOld(uint16 newID) { case tspit: return 4; } - error ("Unknown new stack ID %d", newID); + + error("Unknown new stack ID %d", newID); return 0; } @@ -94,26 +95,28 @@ bool RivenSaveLoad::loadGame(Common::String filename) { if (_vm->getFeatures() & GF_DEMO) // Don't load games in the demo return false; - Common::InSaveFile *loadFile; - if (!(loadFile = _saveFileMan->openForLoading(filename.c_str()))) + Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filename); + if (!loadFile) return false; - debug (0, "Loading game from \'%s\'", filename.c_str()); - _loadFile->open(loadFile); + debug(0, "Loading game from \'%s\'", filename.c_str()); + + MohawkArchive *mhk = new MohawkArchive(); + mhk->open(loadFile); // First, let's make sure we're using a saved game file from this version of Riven by checking the VERS resource - Common::SeekableReadStream *vers = _loadFile->getRawData(ID_VERS, 1); + Common::SeekableReadStream *vers = mhk->getRawData(ID_VERS, 1); uint32 saveGameVersion = vers->readUint32BE(); delete vers; if ((saveGameVersion == kCDSaveGameVersion && (_vm->getFeatures() & GF_DVD)) || (saveGameVersion == kDVDSaveGameVersion && !(_vm->getFeatures() & GF_DVD))) { - warning ("Incompatible saved game versions. No support for this yet."); - delete _loadFile; + warning("Incompatible saved game versions. No support for this yet."); + delete mhk; return false; } // Now, we'll read in the variable values. - Common::SeekableReadStream *vars = _loadFile->getRawData(ID_VARS, 1); + Common::SeekableReadStream *vars = mhk->getRawData(ID_VARS, 1); Common::Array rawVariables; while (!vars->eos()) { @@ -126,7 +129,7 @@ bool RivenSaveLoad::loadGame(Common::String filename) { // Next, we set the variables based on the name found by the index in the VARS resource. // TODO: Merge with code in mohawk.cpp for loading names? - Common::SeekableReadStream *names = _loadFile->getRawData(ID_NAME, 1); + Common::SeekableReadStream *names = mhk->getRawData(ID_NAME, 1); uint16 namesCount = names->readUint16BE(); uint16 *stringOffsets = new uint16[namesCount]; @@ -151,9 +154,10 @@ bool RivenSaveLoad::loadGame(Common::String filename) { c = (char)names->readByte(); } - // WORKAROUND: Some versions have two extra variables. However, the saves are - // still compatible with other saves of the same version. Are these used in the - // original interpreter anywhere? (They come from DVD v1.1) + // TODO: Some versions have two extra variables. However, the saves are + // still compatible with other saves of the same version (they come from DVD v1.1). + // There are used in the whark number puzzle. I thought jleftpos and jrightpos were + // for this purpose. if (name == "dropLeftStart" || name == "dropRightStart") continue; @@ -161,11 +165,11 @@ bool RivenSaveLoad::loadGame(Common::String filename) { *var = rawVariables[i]; - if (!scumm_stricmp(name.c_str(), "CurrentStackID")) + if (name.equalsIgnoreCase("CurrentStackID")) stackID = mapOldStackIDToNew(rawVariables[i]); - else if (!scumm_stricmp(name.c_str(), "CurrentCardID")) + else if (name.equalsIgnoreCase("CurrentCardID")) cardID = rawVariables[i]; - else if (!scumm_stricmp(name.c_str(), "ReturnStackID")) + else if (name.equalsIgnoreCase("ReturnStackID")) *var = mapOldStackIDToNew(rawVariables[i]); } @@ -179,7 +183,7 @@ bool RivenSaveLoad::loadGame(Common::String filename) { _vm->_zipModeData.clear(); // Finally, we load in zip mode data. - Common::SeekableReadStream *zips = _loadFile->getRawData(ID_ZIPS, 1); + Common::SeekableReadStream *zips = mhk->getRawData(ID_ZIPS, 1); uint16 zipsRecordCount = zips->readUint16BE(); for (uint16 i = 0; i < zipsRecordCount; i++) { ZipMode zip; @@ -189,10 +193,10 @@ bool RivenSaveLoad::loadGame(Common::String filename) { zip.id = zips->readUint16BE(); _vm->_zipModeData.push_back(zip); } + delete zips; + delete mhk; - delete _loadFile; - _loadFile = NULL; return true; } @@ -211,7 +215,14 @@ Common::MemoryWriteStreamDynamic *RivenSaveLoad::genVARSSection() { for (uint32 i = 0; i < _vm->getVarCount(); i++) { stream->writeUint32BE(0); // Unknown stream->writeUint32BE(0); // Unknown - stream->writeUint32BE(_vm->getGlobalVar(i)); + + // Remap returnstackid here because we don't actually want to change + // our internal returnstackid. + uint32 variable = _vm->getGlobalVar(i); + if (_vm->getGlobalVarName(i) == "returnstackid") + variable = mapNewStackIDToOld(variable); + + stream->writeUint32BE(variable); } return stream; @@ -257,17 +268,17 @@ bool RivenSaveLoad::saveGame(Common::String filename) { // Note, this code is still WIP. It works quite well for now. // Make sure we have the right extension - if (!filename.hasSuffix(".rvn") && !filename.hasSuffix(".RVN")) + if (!filename.matchString("*.rvn", true)) filename += ".rvn"; // Convert class variables to variable numbers *_vm->matchVarToString("currentstackid") = mapNewStackIDToOld(_vm->getCurStack()); *_vm->matchVarToString("currentcardid") = _vm->getCurCard(); - *_vm->matchVarToString("returnstackid") = mapNewStackIDToOld(*_vm->matchVarToString("returnstackid")); - Common::OutSaveFile *saveFile; - if (!(saveFile = _saveFileMan->openForSaving(filename.c_str()))) + Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename); + if (!saveFile) return false; + debug (0, "Saving game to \'%s\'", filename.c_str()); Common::MemoryWriteStreamDynamic *versSection = genVERSSection(); @@ -392,7 +403,7 @@ bool RivenSaveLoad::saveGame(Common::String filename) { void RivenSaveLoad::deleteSave(Common::String saveName) { debug (0, "Deleting save file \'%s\'", saveName.c_str()); - _saveFileMan->removeSavefile(saveName.c_str()); + _saveFileMan->removeSavefile(saveName); } } // End of namespace Mohawk diff --git a/engines/mohawk/riven_saveload.h b/engines/mohawk/riven_saveload.h index c708f9d35d..9cc9bc3737 100644 --- a/engines/mohawk/riven_saveload.h +++ b/engines/mohawk/riven_saveload.h @@ -29,8 +29,6 @@ #include "common/savefile.h" #include "common/str.h" -#include "mohawk/resource.h" - namespace Mohawk { class MohawkEngine_Riven; @@ -53,7 +51,6 @@ public: private: MohawkEngine_Riven *_vm; Common::SaveFileManager *_saveFileMan; - MohawkArchive *_loadFile; Common::MemoryWriteStreamDynamic *genVERSSection(); Common::MemoryWriteStreamDynamic *genNAMESection(); -- cgit v1.2.3 From 9a0e2e9c461547b1a2d8bf32a3e7ba52853358f5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 17:37:28 +0000 Subject: SCI: add another unint temp workaround for kq5 - when playing harp for the harpies svn-id: r50334 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1778d6e339..e69048dbc4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -200,6 +200,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon + { GID_KQ5, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio { GID_KQ5, 25, "rm025", "doit", -1, 0, 0 }, // inside witch forest, where the walking rock is { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 58fcda82f33e3ba8f813eeac412612ae09a34c9f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 18:07:41 +0000 Subject: Remove support for translation of console messages. In recent discussions on -devel it turned out, that this feature is rather superfluous and instead we should rather implement a proper error reporting in our GUI. I also removed the dependency on iconv along with this. svn-id: r50335 --- base/main.cpp | 12 +- common/messages.cpp | 3181 ++++++++++++++++++++++++------------------------ common/translation.cpp | 90 -- common/translation.h | 28 +- configure | 31 +- gui/GuiManager.cpp | 2 +- po/ca_ES.po | 68 +- po/de_DE.po | 65 +- po/fr_FR.po | 68 +- po/hu_HU.po | 37 +- po/module.mk | 2 +- po/ru_RU.po | 68 +- po/scummvm.pot | 36 +- 13 files changed, 1706 insertions(+), 1982 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index 1e3edb1534..7ea5344ba2 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -103,20 +103,20 @@ static const EnginePlugin *detectPlugin() { ConfMan.set("gameid", gameid); // Query the plugins and find one that will handle the specified gameid - printf(_t("User picked target '%s' (gameid '%s')...\n"), ConfMan.getActiveDomainName().c_str(), gameid.c_str()); - printf("%s", _t(" Looking for a plugin supporting this gameid... ")); + printf("User picked target '%s' (gameid '%s')...\n", ConfMan.getActiveDomainName().c_str(), gameid.c_str()); + printf("%s", " Looking for a plugin supporting this gameid... "); GameDescriptor game = EngineMan.findGame(gameid, &plugin); if (plugin == 0) { - printf("%s", _t("failed\n")); - warning(_t("%s is an invalid gameid. Use the --list-games option to list supported gameid"), gameid.c_str()); + printf("failed\n"); + warning("%s is an invalid gameid. Use the --list-games option to list supported gameid", gameid.c_str()); return 0; } else { printf("%s\n", plugin->getName()); } // FIXME: Do we really need this one? - printf(_t(" Starting '%s'\n"), game.description().c_str()); + printf(" Starting '%s'\n", game.description().c_str()); return plugin; } @@ -145,7 +145,7 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const //GUI::displayErrorDialog("ScummVM could not find any game in the specified directory!"); const char *errMsg = _(Common::errorToString(err)); - warning(_t("%s failed to instantiate engine: %s (target '%s', path '%s')"), + warning("%s failed to instantiate engine: %s (target '%s', path '%s')", plugin->getName(), errMsg, ConfMan.getActiveDomainName().c_str(), diff --git a/common/messages.cpp b/common/messages.cpp index 4b31776db7..0cf0b8ce92 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -3,324 +3,317 @@ static const char * const _messageIds[] = { /* 0 */ "", /* 1 */ " Are you sure you want to quit ? ", - /* 2 */ " Looking for a plugin supporting this gameid... ", - /* 3 */ " Starting '%s'\n", - /* 4 */ " (Active)", - /* 5 */ " (Game)", - /* 6 */ " (Global)", - /* 7 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", - /* 8 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", - /* 9 */ "(built on %s)", - /* 10 */ ", error while mounting the share", - /* 11 */ ", share not mounted", - /* 12 */ "... progress ...", - /* 13 */ "11kHz", - /* 14 */ "22 kHz", - /* 15 */ "44 kHz", - /* 16 */ "48 kHz", - /* 17 */ "8 kHz", - /* 18 */ "", - /* 19 */ "About ScummVM", - /* 20 */ "AdLib Emulator", - /* 21 */ "AdLib emulator:", - /* 22 */ "AdLib is used for music in many games", - /* 23 */ "Add Game...", - /* 24 */ "Antialiased Renderer (16bpp)", - /* 25 */ "Aspect ratio correction", - /* 26 */ "Associated key : %s", - /* 27 */ "Associated key : none", - /* 28 */ "Audio", - /* 29 */ "Autosave:", - /* 30 */ "Available engines:", - /* 31 */ "A~b~out...", - /* 32 */ "Bind Keys", - /* 33 */ "Both", - /* 34 */ "Brightness:", - /* 35 */ "Cancel", - /* 36 */ "Cannot create file", - /* 37 */ "Change game options", - /* 38 */ "Change global ScummVM options", - /* 39 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", - /* 40 */ "Choose", - /* 41 */ "Choose an action to map", - /* 42 */ "Clear value", - /* 43 */ "Close", - /* 44 */ "Correct aspect ratio for 320x200 games", - /* 45 */ "Could not find any engine capable of running the selected game", - /* 46 */ "Current video mode:", - /* 47 */ "Cursor Down", - /* 48 */ "Cursor Left", - /* 49 */ "Cursor Right", - /* 50 */ "Cursor Up", - /* 51 */ "DOSBox OPL emulator", - /* 52 */ "DVD", - /* 53 */ "DVD Mounted successfully", - /* 54 */ "DVD not mounted", - /* 55 */ "Date: ", - /* 56 */ "Debugger", - /* 57 */ "Default", - /* 58 */ "Delete", - /* 59 */ "Disable power off", - /* 60 */ "Disabled GFX", - /* 61 */ "Discovered %d new games ...", - /* 62 */ "Discovered %d new games.", - /* 63 */ "Display ", - /* 64 */ "Display keyboard", - /* 65 */ "Do you really want to delete this savegame?", - /* 66 */ "Do you really want to remove this game configuration?", - /* 67 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", - /* 68 */ "Do you want to load or save the game?", - /* 69 */ "Do you want to perform an automatic scan ?", - /* 70 */ "Do you want to quit ?", - /* 71 */ "Double-strike", - /* 72 */ "Down", - /* 73 */ "Enable Roland GS Mode", - /* 74 */ "Engine does not support debug level '%s'", - /* 75 */ "English", - /* 76 */ "Error running game:", - /* 77 */ "Error while mounting the DVD", - /* 78 */ "Extra Path:", - /* 79 */ "FM Towns Emulator", - /* 80 */ "Failed to load any GUI theme, aborting", - /* 81 */ "Fast mode", - /* 82 */ "Features compiled in:", - /* 83 */ "Free look", - /* 84 */ "Full title of the game", - /* 85 */ "Fullscreen mode", - /* 86 */ "GC Pad acceleration:", - /* 87 */ "GC Pad sensitivity:", - /* 88 */ "GFX", - /* 89 */ "GM Device:", - /* 90 */ "GUI Language:", - /* 91 */ "GUI Renderer:", - /* 92 */ "Game", - /* 93 */ "Game Data not found", - /* 94 */ "Game Id not supported", - /* 95 */ "Game Path:", - /* 96 */ "Global menu", - /* 97 */ "Go to previous directory level", - /* 98 */ "Go up", - /* 99 */ "Graphics", - /* 100 */ "Graphics mode:", - /* 101 */ "Hardware scale (fast, but low quality)", - /* 102 */ "Hercules Amber", - /* 103 */ "Hercules Green", - /* 104 */ "Hide Toolbar", - /* 105 */ "High quality audio (slower) (reboot)", - /* 106 */ "Higher value specifies better sound quality but may be not supported by your soundcard", - /* 107 */ "Hold Shift for Mass Add", - /* 108 */ "Horizontal underscan:", - /* 109 */ "IBM PCjr Emulator", - /* 110 */ "ID:", - /* 111 */ "Init network", - /* 112 */ "Initial top screen scale:", - /* 113 */ "Initialising MT-32 Emulator", - /* 114 */ "Initialising network", - /* 115 */ "Input", - /* 116 */ "Invalid Path", - /* 117 */ "Key mapper", - /* 118 */ "Keyboard", - /* 119 */ "Keymap:", - /* 120 */ "Keys", - /* 121 */ "Language of ScummVM GUI", - /* 122 */ "Language of the game. This will not turn your Spanish game version into English", - /* 123 */ "Language:", - /* 124 */ "Left", - /* 125 */ "Left Click", - /* 126 */ "Load", - /* 127 */ "Load game:", - /* 128 */ "Load savegame for selected game", - /* 129 */ "MAME OPL emulator", - /* 130 */ "MIDI", - /* 131 */ "MIDI gain:", - /* 132 */ "MT-32 Emulator", - /* 133 */ "MT32 Device:", - /* 134 */ "Main screen scaling:", - /* 135 */ "Map", - /* 136 */ "Mass Add...", - /* 137 */ "Menu", - /* 138 */ "Misc", - /* 139 */ "Mixed AdLib/MIDI mode", - /* 140 */ "Mount DVD", - /* 141 */ "Mount SMB", - /* 142 */ "Mouse click", - /* 143 */ "Multi Function", - /* 144 */ "Music volume:", - /* 145 */ "Mute All", - /* 146 */ "Name:", - /* 147 */ "Network down", - /* 148 */ "Network not initialsed (%d)", - /* 149 */ "Network up", - /* 150 */ "Network up, share mounted", - /* 151 */ "Never", - /* 152 */ "No", - /* 153 */ "No date saved", - /* 154 */ "No music", - /* 155 */ "No playtime saved", - /* 156 */ "No time saved", - /* 157 */ "None", - /* 158 */ "Normal (no scaling)", - /* 159 */ "OK", - /* 160 */ "Output rate:", - /* 161 */ "Override global MIDI settings", - /* 162 */ "Override global audio settings", - /* 163 */ "Override global graphic settings", - /* 164 */ "Override global volume settings", - /* 165 */ "PC Speaker Emulator", - /* 166 */ "Password:", - /* 167 */ "Path not a directory", - /* 168 */ "Path not a file", - /* 169 */ "Path not exists", - /* 170 */ "Paths", - /* 171 */ "Pause", - /* 172 */ "Pick the game:", - /* 173 */ "Platform the game was originally designed for", - /* 174 */ "Platform:", - /* 175 */ "Playtime: ", - /* 176 */ "Please select an action", - /* 177 */ "Plugins Path:", - /* 178 */ "Preferred Device:", - /* 179 */ "Press the key to associate", - /* 180 */ "Quit", - /* 181 */ "Quit ScummVM", - /* 182 */ "Read permission denied", - /* 183 */ "Reading failed", - /* 184 */ "Remap keys", - /* 185 */ "Remove game from the list. The game data files stay intact", - /* 186 */ "Render mode:", - /* 187 */ "Right", - /* 188 */ "Right Click", - /* 189 */ "Right click", - /* 190 */ "Rotate", - /* 191 */ "SFX volume:", - /* 192 */ "SMB", - /* 193 */ "Save", - /* 194 */ "Save Path:", - /* 195 */ "Save Path: ", - /* 196 */ "Save game:", - /* 197 */ "Scan complete!", - /* 198 */ "Scanned %d directories ...", - /* 199 */ "ScummVM Main Menu", - /* 200 */ "ScummVM could not find any engine capable of running the selected game!", - /* 201 */ "ScummVM could not find any game in the specified directory!", - /* 202 */ "ScummVM couldn't open the specified directory!", - /* 203 */ "Search in game list", - /* 204 */ "Search:", - /* 205 */ "Select SoundFont", - /* 206 */ "Select a Theme", - /* 207 */ "Select additional game directory", - /* 208 */ "Select an action and click 'Map'", - /* 209 */ "Select directory for GUI themes", - /* 210 */ "Select directory for extra files", - /* 211 */ "Select directory for plugins", - /* 212 */ "Select directory for saved games", - /* 213 */ "Select directory for savegames", - /* 214 */ "Select directory with game data", - /* 215 */ "Sensitivity", - /* 216 */ "Server:", - /* 217 */ "Share:", - /* 218 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 219 */ "Show Keyboard", - /* 220 */ "Show mouse cursor", - /* 221 */ "Show subtitles and play speech", - /* 222 */ "Show/Hide Cursor", - /* 223 */ "Skip", - /* 224 */ "Skip line", - /* 225 */ "Skip text", - /* 226 */ "Snap to edges", - /* 227 */ "Software scale (good quality, but slower)", - /* 228 */ "Sound on/off", - /* 229 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 230 */ "SoundFont:", - /* 231 */ "Spch", - /* 232 */ "Special dithering modes supported by some games", - /* 233 */ "Special sound effects volume", - /* 234 */ "Specifies default sound device for General MIDI output", - /* 235 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", - /* 236 */ "Specifies output sound device or sound card emulator", - /* 237 */ "Specifies path to additional data used by all games or ScummVM", - /* 238 */ "Specifies path to additional data used the game", - /* 239 */ "Specifies preferred sound device or sound card emulator", - /* 240 */ "Specifies where your savegames are put", - /* 241 */ "Speech", - /* 242 */ "Speech volume:", - /* 243 */ "Standard Renderer (16bpp)", - /* 244 */ "Start selected game", - /* 245 */ "Status:", - /* 246 */ "Subs", - /* 247 */ "Subtitle speed:", - /* 248 */ "Subtitles", - /* 249 */ "Swap character", - /* 250 */ "Tap for left click, double tap right click", - /* 251 */ "Text and Speech:", - /* 252 */ "The chosen directory cannot be written to. Please select another one.", - /* 253 */ "Theme Path:", - /* 254 */ "Theme:", - /* 255 */ "This game ID is already taken. Please choose another one.", - /* 256 */ "This game does not support loading games from the launcher.", - /* 257 */ "Time: ", - /* 258 */ "Timeout while initialising network", - /* 259 */ "Touch X Offset", - /* 260 */ "Touch Y Offset", - /* 261 */ "Touchpad mode disabled.", - /* 262 */ "Touchpad mode enabled.", - /* 263 */ "True Roland MT-32 (disable GM emulation)", - /* 264 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 265 */ "Unknown", - /* 266 */ "Unknown Error", - /* 267 */ "Unmount DVD", - /* 268 */ "Unmount SMB", - /* 269 */ "Unscaled (you must scroll left and right)", - /* 270 */ "Unsupported Color Mode", - /* 271 */ "Untitled savestate", - /* 272 */ "Up", - /* 273 */ "Use both MIDI and AdLib sound generation", - /* 274 */ "Use laptop trackpad-style cursor control", - /* 275 */ "User picked target '%s' (gameid '%s')...\n", - /* 276 */ "Username:", - /* 277 */ "Using SDL driver ", - /* 278 */ "Vertical underscan:", - /* 279 */ "Video", - /* 280 */ "Virtual keyboard", - /* 281 */ "Volume", - /* 282 */ "Windows MIDI", - /* 283 */ "Write permission denied", - /* 284 */ "Writing data failed", - /* 285 */ "Yes", - /* 286 */ "You have to restart ScummVM to take the effect.", - /* 287 */ "Zone", - /* 288 */ "Zoom down", - /* 289 */ "Zoom up", - /* 290 */ "every 10 mins", - /* 291 */ "every 15 mins", - /* 292 */ "every 30 mins", - /* 293 */ "every 5 mins", - /* 294 */ "failed\n", - /* 295 */ "~A~bout", - /* 296 */ "~A~dd Game...", - /* 297 */ "~C~ancel", - /* 298 */ "~C~lose", - /* 299 */ "~E~dit Game...", - /* 300 */ "~H~elp", - /* 301 */ "~I~ndy fight controls", - /* 302 */ "~K~eys", - /* 303 */ "~L~eft handed mode", - /* 304 */ "~L~oad", - /* 305 */ "~L~oad...", - /* 306 */ "~N~ext", - /* 307 */ "~O~K", - /* 308 */ "~O~ptions", - /* 309 */ "~O~ptions...", - /* 310 */ "~P~revious", - /* 311 */ "~Q~uit", - /* 312 */ "~R~emove Game", - /* 313 */ "~R~esume", - /* 314 */ "~R~eturn to Launcher", - /* 315 */ "~S~ave", - /* 316 */ "~S~tart", - /* 317 */ "~T~ransitions Enabled", - /* 318 */ "~W~ater Effect Enabled", - /* 319 */ "~Z~ip Mode Activated", + /* 2 */ " (Active)", + /* 3 */ " (Game)", + /* 4 */ " (Global)", + /* 5 */ "(built on %s)", + /* 6 */ ", error while mounting the share", + /* 7 */ ", share not mounted", + /* 8 */ "... progress ...", + /* 9 */ "11kHz", + /* 10 */ "22 kHz", + /* 11 */ "44 kHz", + /* 12 */ "48 kHz", + /* 13 */ "8 kHz", + /* 14 */ "", + /* 15 */ "About ScummVM", + /* 16 */ "AdLib Emulator", + /* 17 */ "AdLib emulator:", + /* 18 */ "AdLib is used for music in many games", + /* 19 */ "Add Game...", + /* 20 */ "Antialiased Renderer (16bpp)", + /* 21 */ "Aspect ratio correction", + /* 22 */ "Associated key : %s", + /* 23 */ "Associated key : none", + /* 24 */ "Audio", + /* 25 */ "Autosave:", + /* 26 */ "Available engines:", + /* 27 */ "A~b~out...", + /* 28 */ "Bind Keys", + /* 29 */ "Both", + /* 30 */ "Brightness:", + /* 31 */ "Cancel", + /* 32 */ "Cannot create file", + /* 33 */ "Change game options", + /* 34 */ "Change global ScummVM options", + /* 35 */ "Check if you want to use your real hardware Roland-compatible sound device connected to your computer", + /* 36 */ "Choose", + /* 37 */ "Choose an action to map", + /* 38 */ "Clear value", + /* 39 */ "Close", + /* 40 */ "Correct aspect ratio for 320x200 games", + /* 41 */ "Could not find any engine capable of running the selected game", + /* 42 */ "Current video mode:", + /* 43 */ "Cursor Down", + /* 44 */ "Cursor Left", + /* 45 */ "Cursor Right", + /* 46 */ "Cursor Up", + /* 47 */ "DOSBox OPL emulator", + /* 48 */ "DVD", + /* 49 */ "DVD Mounted successfully", + /* 50 */ "DVD not mounted", + /* 51 */ "Date: ", + /* 52 */ "Debugger", + /* 53 */ "Default", + /* 54 */ "Delete", + /* 55 */ "Disable power off", + /* 56 */ "Disabled GFX", + /* 57 */ "Discovered %d new games ...", + /* 58 */ "Discovered %d new games.", + /* 59 */ "Display ", + /* 60 */ "Display keyboard", + /* 61 */ "Do you really want to delete this savegame?", + /* 62 */ "Do you really want to remove this game configuration?", + /* 63 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 64 */ "Do you want to load or save the game?", + /* 65 */ "Do you want to perform an automatic scan ?", + /* 66 */ "Do you want to quit ?", + /* 67 */ "Double-strike", + /* 68 */ "Down", + /* 69 */ "Enable Roland GS Mode", + /* 70 */ "Engine does not support debug level '%s'", + /* 71 */ "English", + /* 72 */ "Error running game:", + /* 73 */ "Error while mounting the DVD", + /* 74 */ "Extra Path:", + /* 75 */ "FM Towns Emulator", + /* 76 */ "Fast mode", + /* 77 */ "Features compiled in:", + /* 78 */ "Free look", + /* 79 */ "Full title of the game", + /* 80 */ "Fullscreen mode", + /* 81 */ "GC Pad acceleration:", + /* 82 */ "GC Pad sensitivity:", + /* 83 */ "GFX", + /* 84 */ "GM Device:", + /* 85 */ "GUI Language:", + /* 86 */ "GUI Renderer:", + /* 87 */ "Game", + /* 88 */ "Game Data not found", + /* 89 */ "Game Id not supported", + /* 90 */ "Game Path:", + /* 91 */ "Global menu", + /* 92 */ "Go to previous directory level", + /* 93 */ "Go up", + /* 94 */ "Graphics", + /* 95 */ "Graphics mode:", + /* 96 */ "Hardware scale (fast, but low quality)", + /* 97 */ "Hercules Amber", + /* 98 */ "Hercules Green", + /* 99 */ "Hide Toolbar", + /* 100 */ "High quality audio (slower) (reboot)", + /* 101 */ "Higher value specifies better sound quality but may be not supported by your soundcard", + /* 102 */ "Hold Shift for Mass Add", + /* 103 */ "Horizontal underscan:", + /* 104 */ "IBM PCjr Emulator", + /* 105 */ "ID:", + /* 106 */ "Init network", + /* 107 */ "Initial top screen scale:", + /* 108 */ "Initialising MT-32 Emulator", + /* 109 */ "Initialising network", + /* 110 */ "Input", + /* 111 */ "Invalid Path", + /* 112 */ "Key mapper", + /* 113 */ "Keyboard", + /* 114 */ "Keymap:", + /* 115 */ "Keys", + /* 116 */ "Language of ScummVM GUI", + /* 117 */ "Language of the game. This will not turn your Spanish game version into English", + /* 118 */ "Language:", + /* 119 */ "Left", + /* 120 */ "Left Click", + /* 121 */ "Load", + /* 122 */ "Load game:", + /* 123 */ "Load savegame for selected game", + /* 124 */ "MAME OPL emulator", + /* 125 */ "MIDI", + /* 126 */ "MIDI gain:", + /* 127 */ "MT-32 Emulator", + /* 128 */ "MT32 Device:", + /* 129 */ "Main screen scaling:", + /* 130 */ "Map", + /* 131 */ "Mass Add...", + /* 132 */ "Menu", + /* 133 */ "Misc", + /* 134 */ "Mixed AdLib/MIDI mode", + /* 135 */ "Mount DVD", + /* 136 */ "Mount SMB", + /* 137 */ "Mouse click", + /* 138 */ "Multi Function", + /* 139 */ "Music volume:", + /* 140 */ "Mute All", + /* 141 */ "Name:", + /* 142 */ "Network down", + /* 143 */ "Network not initialsed (%d)", + /* 144 */ "Network up", + /* 145 */ "Network up, share mounted", + /* 146 */ "Never", + /* 147 */ "No", + /* 148 */ "No date saved", + /* 149 */ "No music", + /* 150 */ "No playtime saved", + /* 151 */ "No time saved", + /* 152 */ "None", + /* 153 */ "Normal (no scaling)", + /* 154 */ "OK", + /* 155 */ "Output rate:", + /* 156 */ "Override global MIDI settings", + /* 157 */ "Override global audio settings", + /* 158 */ "Override global graphic settings", + /* 159 */ "Override global volume settings", + /* 160 */ "PC Speaker Emulator", + /* 161 */ "Password:", + /* 162 */ "Path not a directory", + /* 163 */ "Path not a file", + /* 164 */ "Path not exists", + /* 165 */ "Paths", + /* 166 */ "Pause", + /* 167 */ "Pick the game:", + /* 168 */ "Platform the game was originally designed for", + /* 169 */ "Platform:", + /* 170 */ "Playtime: ", + /* 171 */ "Please select an action", + /* 172 */ "Plugins Path:", + /* 173 */ "Preferred Device:", + /* 174 */ "Press the key to associate", + /* 175 */ "Quit", + /* 176 */ "Quit ScummVM", + /* 177 */ "Read permission denied", + /* 178 */ "Reading failed", + /* 179 */ "Remap keys", + /* 180 */ "Remove game from the list. The game data files stay intact", + /* 181 */ "Render mode:", + /* 182 */ "Right", + /* 183 */ "Right Click", + /* 184 */ "Right click", + /* 185 */ "Rotate", + /* 186 */ "SFX volume:", + /* 187 */ "SMB", + /* 188 */ "Save", + /* 189 */ "Save Path:", + /* 190 */ "Save Path: ", + /* 191 */ "Save game:", + /* 192 */ "Scan complete!", + /* 193 */ "Scanned %d directories ...", + /* 194 */ "ScummVM Main Menu", + /* 195 */ "ScummVM could not find any engine capable of running the selected game!", + /* 196 */ "ScummVM could not find any game in the specified directory!", + /* 197 */ "ScummVM couldn't open the specified directory!", + /* 198 */ "Search in game list", + /* 199 */ "Search:", + /* 200 */ "Select SoundFont", + /* 201 */ "Select a Theme", + /* 202 */ "Select additional game directory", + /* 203 */ "Select an action and click 'Map'", + /* 204 */ "Select directory for GUI themes", + /* 205 */ "Select directory for extra files", + /* 206 */ "Select directory for plugins", + /* 207 */ "Select directory for saved games", + /* 208 */ "Select directory for savegames", + /* 209 */ "Select directory with game data", + /* 210 */ "Sensitivity", + /* 211 */ "Server:", + /* 212 */ "Share:", + /* 213 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 214 */ "Show Keyboard", + /* 215 */ "Show mouse cursor", + /* 216 */ "Show subtitles and play speech", + /* 217 */ "Show/Hide Cursor", + /* 218 */ "Skip", + /* 219 */ "Skip line", + /* 220 */ "Skip text", + /* 221 */ "Snap to edges", + /* 222 */ "Software scale (good quality, but slower)", + /* 223 */ "Sound on/off", + /* 224 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 225 */ "SoundFont:", + /* 226 */ "Spch", + /* 227 */ "Special dithering modes supported by some games", + /* 228 */ "Special sound effects volume", + /* 229 */ "Specifies default sound device for General MIDI output", + /* 230 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", + /* 231 */ "Specifies output sound device or sound card emulator", + /* 232 */ "Specifies path to additional data used by all games or ScummVM", + /* 233 */ "Specifies path to additional data used the game", + /* 234 */ "Specifies preferred sound device or sound card emulator", + /* 235 */ "Specifies where your savegames are put", + /* 236 */ "Speech", + /* 237 */ "Speech volume:", + /* 238 */ "Standard Renderer (16bpp)", + /* 239 */ "Start selected game", + /* 240 */ "Status:", + /* 241 */ "Subs", + /* 242 */ "Subtitle speed:", + /* 243 */ "Subtitles", + /* 244 */ "Swap character", + /* 245 */ "Tap for left click, double tap right click", + /* 246 */ "Text and Speech:", + /* 247 */ "The chosen directory cannot be written to. Please select another one.", + /* 248 */ "Theme Path:", + /* 249 */ "Theme:", + /* 250 */ "This game ID is already taken. Please choose another one.", + /* 251 */ "This game does not support loading games from the launcher.", + /* 252 */ "Time: ", + /* 253 */ "Timeout while initialising network", + /* 254 */ "Touch X Offset", + /* 255 */ "Touch Y Offset", + /* 256 */ "Touchpad mode disabled.", + /* 257 */ "Touchpad mode enabled.", + /* 258 */ "True Roland MT-32 (disable GM emulation)", + /* 259 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 260 */ "Unknown", + /* 261 */ "Unknown Error", + /* 262 */ "Unmount DVD", + /* 263 */ "Unmount SMB", + /* 264 */ "Unscaled (you must scroll left and right)", + /* 265 */ "Unsupported Color Mode", + /* 266 */ "Untitled savestate", + /* 267 */ "Up", + /* 268 */ "Use both MIDI and AdLib sound generation", + /* 269 */ "Use laptop trackpad-style cursor control", + /* 270 */ "Username:", + /* 271 */ "Using SDL driver ", + /* 272 */ "Vertical underscan:", + /* 273 */ "Video", + /* 274 */ "Virtual keyboard", + /* 275 */ "Volume", + /* 276 */ "Windows MIDI", + /* 277 */ "Write permission denied", + /* 278 */ "Writing data failed", + /* 279 */ "Yes", + /* 280 */ "You have to restart ScummVM to take the effect.", + /* 281 */ "Zone", + /* 282 */ "Zoom down", + /* 283 */ "Zoom up", + /* 284 */ "every 10 mins", + /* 285 */ "every 15 mins", + /* 286 */ "every 30 mins", + /* 287 */ "every 5 mins", + /* 288 */ "~A~bout", + /* 289 */ "~A~dd Game...", + /* 290 */ "~C~ancel", + /* 291 */ "~C~lose", + /* 292 */ "~E~dit Game...", + /* 293 */ "~H~elp", + /* 294 */ "~I~ndy fight controls", + /* 295 */ "~K~eys", + /* 296 */ "~L~eft handed mode", + /* 297 */ "~L~oad", + /* 298 */ "~L~oad...", + /* 299 */ "~N~ext", + /* 300 */ "~O~K", + /* 301 */ "~O~ptions", + /* 302 */ "~O~ptions...", + /* 303 */ "~P~revious", + /* 304 */ "~Q~uit", + /* 305 */ "~R~emove Game", + /* 306 */ "~R~esume", + /* 307 */ "~R~eturn to Launcher", + /* 308 */ "~S~ave", + /* 309 */ "~S~tart", + /* 310 */ "~T~ransitions Enabled", + /* 311 */ "~W~ater Effect Enabled", + /* 312 */ "~Z~ip Mode Activated", NULL }; @@ -330,1318 +323,1290 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, - { 2, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, - { 3, " \307\340\357\363\361\352\340\376 '%s'\n" }, - { 4, " (\300\352\362\350\342\355\340\377)" }, - { 5, " (\310\343\360\373)" }, - { 6, " (\303\353\356\341\340\353\374\355\340\377)" }, - { 7, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, - { 8, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, - { 9, "C2(\361\356\341\360\340\355 " }, - { 10, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, - { 11, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, - { 12, "... \350\371\363 ..." }, - { 13, "11 \352\303\366" }, - { 14, "22 \352\303\366" }, - { 15, "44 \352\303\366" }, - { 16, "48 \352\303\366" }, - { 17, "8 \352\303\366" }, - { 18, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, - { 19, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 20, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 21, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 22, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 23, "\315\356\342. \350\343\360\340..." }, - { 24, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 25, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 26, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 27, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 28, "\300\363\344\350\356" }, - { 29, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 30, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 31, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 32, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 33, "\302\361\270" }, - { 34, "\337\360\352\356\361\362\374:" }, - { 35, "\316\362\354\345\355\340" }, - { 36, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 37, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 38, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 39, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 40, "\302\373\341\360\340\362\374" }, - { 41, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 42, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 43, "\307\340\352\360\373\362\374" }, - { 44, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 45, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 46, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, - { 47, "\312\363\360\361\356\360 \342\355\350\347" }, - { 48, "\312\363\360\361\356\360 \342\353\345\342\356" }, - { 49, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, - { 50, "\312\363\360\361\356\360 \342\342\345\360\365" }, - { 52, "DVD" }, - { 53, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, - { 54, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, - { 55, "\304\340\362\340: " }, - { 56, "\316\362\353\340\344\367\350\352" }, - { 57, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 58, "\323\344\340\353\350\362\374" }, - { 59, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, - { 60, "\301\345\347 \343\360\340\364\350\352\350" }, - { 61, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 62, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 63, "\317\356\352\340\347\340\362\374 " }, - { 64, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 65, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 66, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 67, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 68, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, - { 69, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, - { 70, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, - { 71, "\304\342\356\351\355\356\351 \363\344\340\360" }, - { 72, "\302\355\350\347" }, - { 73, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 74, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, - { 75, "English" }, - { 76, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 77, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, - { 78, "\304\356\357. \357\363\362\374:" }, - { 79, "FM Towns" }, - { 80, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, - { 81, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, - { 82, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 83, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, - { 84, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 85, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 86, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, - { 87, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, - { 88, "\303\360\364" }, - { 90, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 91, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 92, "\310\343\360\340" }, - { 93, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 94, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 95, "\317\363\362\374 \352 \350\343\360\345: " }, - { 96, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, - { 97, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 98, "\302\342\345\360\365" }, - { 99, "\303\360\340\364\350\352\340" }, - { 100, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 101, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, - { 104, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, - { 105, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, - { 106, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 107, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 108, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, - { 109, "FM Towns" }, - { 110, "ID:" }, - { 111, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, - { 112, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, - { 113, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 114, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 115, "\302\342\356\344" }, - { 116, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 117, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, - { 118, "\312\353\340\342\350\340\362\363\360\340" }, - { 119, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, - { 120, "\312\353\340\342\350\370\350" }, - { 121, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 122, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 123, "\337\347\373\352:" }, - { 124, "\302\353\345\342\356" }, - { 125, "\313\345\342\373\351 \371\345\353\367\356\352" }, - { 126, "\307\340\343\360\363\347\350\362\374" }, - { 127, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 128, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 129, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 130, "MIDI" }, - { 131, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 132, "\335\354\363\353\377\366\350\377 MT-32" }, - { 134, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, - { 135, "\315\340\347\355\340\367\350\362\374" }, - { 136, "\304\356\341. \354\355\356\343\356..." }, - { 137, "\314\345\355\376" }, - { 138, "\320\340\347\355\356\345" }, - { 139, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 140, "\317\356\344\352\353\376\367\350\362\374 DVD" }, - { 141, "\317\356\344\352\353\376\367\350\362\374 SMB" }, - { 142, "\312\353\350\352 \354\373\370\374\376" }, - { 143, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, - { 144, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 145, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 146, "\315\340\347\342\340\355\350\345:" }, - { 147, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, - { 148, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, - { 149, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, - { 150, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, - { 151, "\315\350\352\356\343\344\340" }, - { 152, "\315\345\362" }, - { 153, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 154, "\301\345\347 \354\363\347\373\352\350" }, - { 155, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 156, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 157, "\315\345 \347\340\344\340\355" }, - { 159, "OK" }, - { 160, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 161, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 162, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 163, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 164, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 165, "PC \361\357\350\352\345\360" }, - { 166, "\317\340\360\356\353\374:" }, - { 167, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 168, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 169, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 170, "\317\363\362\350" }, - { 171, "\317\340\363\347\340" }, - { 172, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 173, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 174, "\317\353\340\362\364\356\360\354\340:" }, - { 175, "\302\360\345\354\377 \350\343\360\373: " }, - { 176, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 177, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 179, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 180, "\302\373\365\356\344" }, - { 181, "\302\373\365\356\344 \350\347 ScummVM" }, - { 182, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 183, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 184, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 185, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 186, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 187, "\302\357\360\340\342\356" }, - { 188, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 189, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 190, "\317\356\342\345\360\355\363\362\374" }, - { 191, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, - { 192, "SMB" }, - { 193, "\307\340\357\350\361\340\362\374" }, - { 194, "\317\363\362\374 \361\356\365\360.: " }, - { 195, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 196, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 197, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 198, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 199, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, - { 200, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 201, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 202, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 203, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 204, "\317\356\350\361\352:" }, - { 205, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 206, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 207, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 208, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 209, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 210, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 211, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 212, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 213, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 214, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 215, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, - { 216, "\321\345\360\342\345\360:" }, - { 217, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, - { 218, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 219, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 220, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, - { 221, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, - { 222, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, - { 223, "\317\360\356\357\363\361\362\350\362\374" }, - { 224, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 225, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, - { 226, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, - { 227, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, - { 228, "\307\342\363\352 \342\352\353/\342\373\352\353" }, - { 229, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, - { 230, "SoundFont:" }, - { 231, "\316\347\342" }, - { 232, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 233, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 234, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 236, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 237, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 238, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 239, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 240, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 241, "\316\347\342\363\367\352\340" }, - { 242, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 243, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 244, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 245, "\321\356\361\362\356\377\355\350\345:" }, - { 246, "\321\363\341" }, - { 247, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 248, "\321\363\341\362\350\362\360\373" }, - { 249, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, - { 250, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, - { 251, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 252, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 253, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 254, "\322\345\354\340:" }, - { 255, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 256, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 257, "\302\360\345\354\377: " }, - { 258, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, - { 259, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, - { 260, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, - { 261, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, - { 262, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, - { 263, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 264, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 265, "\315\345\350\347\342\345\361\362\355\356" }, - { 266, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 267, "\316\362\352\353\376\367\350\362\374 DVD" }, - { 268, "\316\362\352\353\376\367\362\374 SMB" }, - { 269, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, - { 270, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 271, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 272, "\302\342\345\360\365" }, - { 273, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 274, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, - { 275, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, - { 276, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, - { 277, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, - { 278, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, - { 279, "\302\350\344\345\356" }, - { 280, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, - { 281, "\303\360\356\354\352\356\361\362\374" }, - { 282, "Windows MIDI" }, - { 283, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 284, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 285, "\304\340" }, - { 286, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 287, "\307\356\355\340" }, - { 288, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, - { 289, "\323\342\345\353. \354\340\361\370\362\340\341" }, - { 290, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 291, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 292, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 293, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 294, "\355\345 \363\344\340\353\356\361\374\n" }, - { 295, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 296, "~\304~\356\341. \350\343\360\363..." }, - { 297, "\316~\362~\354\345\355\340" }, - { 298, "~\307~\340\352\360\373\362\374" }, - { 299, "\310\347~\354~. \350\343\360\363..." }, - { 300, "~\317~\356\354\356\371\374" }, - { 301, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, - { 302, "~\312~\353\340\342\350\370\350" }, - { 303, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, - { 304, "~\307~\340\343\360\363\347\350\362\374" }, - { 305, "~\307~\340\343\360...." }, - { 306, "~\321~\353\345\344" }, - { 307, "~O~K" }, - { 308, "~\316~\357\366\350\350" }, - { 309, "~\316~\357\366\350\350..." }, - { 310, "~\317~\360\345\344" }, - { 311, "~\302~\373\365\356\344" }, - { 312, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 313, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 314, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 315, "~\307~\340\357\350\361\340\362\374" }, - { 316, "\317~\363~\361\352" }, - { 317, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, - { 318, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, - { 319, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, + { 2, " (\300\352\362\350\342\355\340\377)" }, + { 3, " (\310\343\360\373)" }, + { 4, " (\303\353\356\341\340\353\374\355\340\377)" }, + { 5, "C2(\361\356\341\360\340\355 " }, + { 6, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, + { 7, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, + { 8, "... \350\371\363 ..." }, + { 9, "11 \352\303\366" }, + { 10, "22 \352\303\366" }, + { 11, "44 \352\303\366" }, + { 12, "48 \352\303\366" }, + { 13, "8 \352\303\366" }, + { 14, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, + { 15, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, + { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 17, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 18, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, + { 19, "\315\356\342. \350\343\360\340..." }, + { 20, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 21, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 23, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 24, "\300\363\344\350\356" }, + { 25, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 27, "\316 \357~\360~\356\343\360\340\354\354\345..." }, + { 28, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 29, "\302\361\270" }, + { 30, "\337\360\352\356\361\362\374:" }, + { 31, "\316\362\354\345\355\340" }, + { 32, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 33, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, + { 34, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, + { 35, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, + { 36, "\302\373\341\360\340\362\374" }, + { 37, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 38, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, + { 39, "\307\340\352\360\373\362\374" }, + { 40, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, + { 41, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 42, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, + { 43, "\312\363\360\361\356\360 \342\355\350\347" }, + { 44, "\312\363\360\361\356\360 \342\353\345\342\356" }, + { 45, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, + { 46, "\312\363\360\361\356\360 \342\342\345\360\365" }, + { 48, "DVD" }, + { 49, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, + { 50, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, + { 51, "\304\340\362\340: " }, + { 52, "\316\362\353\340\344\367\350\352" }, + { 53, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 54, "\323\344\340\353\350\362\374" }, + { 55, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, + { 56, "\301\345\347 \343\360\340\364\350\352\350" }, + { 57, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 58, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 59, "\317\356\352\340\347\340\362\374 " }, + { 60, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 61, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 62, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 63, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 64, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, + { 65, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, + { 66, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, + { 67, "\304\342\356\351\355\356\351 \363\344\340\360" }, + { 68, "\302\355\350\347" }, + { 69, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 70, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 71, "English" }, + { 72, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 73, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, + { 74, "\304\356\357. \357\363\362\374:" }, + { 75, "FM Towns" }, + { 76, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, + { 77, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 78, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, + { 79, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, + { 80, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 81, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, + { 82, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, + { 83, "\303\360\364" }, + { 85, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, + { 86, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 87, "\310\343\360\340" }, + { 88, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 89, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 90, "\317\363\362\374 \352 \350\343\360\345: " }, + { 91, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, + { 92, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, + { 93, "\302\342\345\360\365" }, + { 94, "\303\360\340\364\350\352\340" }, + { 95, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 96, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, + { 99, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, + { 100, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, + { 101, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, + { 102, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, + { 103, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, + { 104, "FM Towns" }, + { 105, "ID:" }, + { 106, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, + { 107, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, + { 108, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 109, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, + { 110, "\302\342\356\344" }, + { 111, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 112, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, + { 113, "\312\353\340\342\350\340\362\363\360\340" }, + { 114, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, + { 115, "\312\353\340\342\350\370\350" }, + { 116, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, + { 117, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, + { 118, "\337\347\373\352:" }, + { 119, "\302\353\345\342\356" }, + { 120, "\313\345\342\373\351 \371\345\353\367\356\352" }, + { 121, "\307\340\343\360\363\347\350\362\374" }, + { 122, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 123, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 124, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 125, "MIDI" }, + { 126, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 127, "\335\354\363\353\377\366\350\377 MT-32" }, + { 129, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, + { 130, "\315\340\347\355\340\367\350\362\374" }, + { 131, "\304\356\341. \354\355\356\343\356..." }, + { 132, "\314\345\355\376" }, + { 133, "\320\340\347\355\356\345" }, + { 134, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 135, "\317\356\344\352\353\376\367\350\362\374 DVD" }, + { 136, "\317\356\344\352\353\376\367\350\362\374 SMB" }, + { 137, "\312\353\350\352 \354\373\370\374\376" }, + { 138, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, + { 139, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 140, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 141, "\315\340\347\342\340\355\350\345:" }, + { 142, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, + { 143, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, + { 144, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, + { 145, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, + { 146, "\315\350\352\356\343\344\340" }, + { 147, "\315\345\362" }, + { 148, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 149, "\301\345\347 \354\363\347\373\352\350" }, + { 150, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 151, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 152, "\315\345 \347\340\344\340\355" }, + { 154, "OK" }, + { 155, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 156, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 157, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 158, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 159, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 160, "PC \361\357\350\352\345\360" }, + { 161, "\317\340\360\356\353\374:" }, + { 162, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 163, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 164, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 165, "\317\363\362\350" }, + { 166, "\317\340\363\347\340" }, + { 167, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 168, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, + { 169, "\317\353\340\362\364\356\360\354\340:" }, + { 170, "\302\360\345\354\377 \350\343\360\373: " }, + { 171, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 172, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 174, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 175, "\302\373\365\356\344" }, + { 176, "\302\373\365\356\344 \350\347 ScummVM" }, + { 177, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 178, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 179, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 180, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, + { 181, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 182, "\302\357\360\340\342\356" }, + { 183, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 184, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, + { 185, "\317\356\342\345\360\355\363\362\374" }, + { 186, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 187, "SMB" }, + { 188, "\307\340\357\350\361\340\362\374" }, + { 189, "\317\363\362\374 \361\356\365\360.: " }, + { 190, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 191, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 192, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 193, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 194, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, + { 195, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 196, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 197, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 198, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, + { 199, "\317\356\350\361\352:" }, + { 200, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 201, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 202, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 203, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 204, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 205, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 206, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 207, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 208, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 209, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 210, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, + { 211, "\321\345\360\342\345\360:" }, + { 212, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, + { 213, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, + { 214, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 215, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, + { 216, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, + { 217, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, + { 218, "\317\360\356\357\363\361\362\350\362\374" }, + { 219, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 220, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, + { 221, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, + { 222, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, + { 223, "\307\342\363\352 \342\352\353/\342\373\352\353" }, + { 224, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 225, "SoundFont:" }, + { 226, "\316\347\342" }, + { 227, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, + { 228, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, + { 229, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 231, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 232, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, + { 233, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, + { 234, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, + { 235, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, + { 236, "\316\347\342\363\367\352\340" }, + { 237, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 238, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 239, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, + { 240, "\321\356\361\362\356\377\355\350\345:" }, + { 241, "\321\363\341" }, + { 242, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 243, "\321\363\341\362\350\362\360\373" }, + { 244, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, + { 245, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, + { 246, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 247, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 248, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 249, "\322\345\354\340:" }, + { 250, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 251, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 252, "\302\360\345\354\377: " }, + { 253, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, + { 254, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, + { 255, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, + { 256, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, + { 257, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, + { 258, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 259, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, + { 260, "\315\345\350\347\342\345\361\362\355\356" }, + { 261, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 262, "\316\362\352\353\376\367\350\362\374 DVD" }, + { 263, "\316\362\352\353\376\367\362\374 SMB" }, + { 264, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, + { 265, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 266, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 267, "\302\342\345\360\365" }, + { 268, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, + { 269, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, + { 270, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, + { 271, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, + { 272, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, + { 273, "\302\350\344\345\356" }, + { 274, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, + { 275, "\303\360\356\354\352\356\361\362\374" }, + { 276, "Windows MIDI" }, + { 277, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 278, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 279, "\304\340" }, + { 280, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 281, "\307\356\355\340" }, + { 282, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, + { 283, "\323\342\345\353. \354\340\361\370\362\340\341" }, + { 284, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 285, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 286, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 287, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 288, "\316 \357\360\356~\343~\360\340\354\354\345" }, + { 289, "~\304~\356\341. \350\343\360\363..." }, + { 290, "\316~\362~\354\345\355\340" }, + { 291, "~\307~\340\352\360\373\362\374" }, + { 292, "\310\347~\354~. \350\343\360\363..." }, + { 293, "~\317~\356\354\356\371\374" }, + { 294, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, + { 295, "~\312~\353\340\342\350\370\350" }, + { 296, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, + { 297, "~\307~\340\343\360\363\347\350\362\374" }, + { 298, "~\307~\340\343\360...." }, + { 299, "~\321~\353\345\344" }, + { 300, "~O~K" }, + { 301, "~\316~\357\366\350\350" }, + { 302, "~\316~\357\366\350\350..." }, + { 303, "~\317~\360\345\344" }, + { 304, "~\302~\373\365\356\344" }, + { 305, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, + { 306, "\317\360\356\344\356\353~\346~\350\362\374" }, + { 307, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 308, "~\307~\340\357\350\361\340\362\374" }, + { 309, "\317~\363~\361\352" }, + { 310, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, + { 311, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, + { 312, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, { -1, NULL } }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: Francais\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, - { 2, "Recherche d'un plugin supportant cet ID..." }, - { 3, "D\351marrage de '%s'\n" }, - { 4, "(Actif)" }, - { 5, "(Jeu)" }, - { 6, "(Global)" }, - { 7, "Le plugin %s a \351chou\351 dans l'instanciation du moteur de jeu: %s (cible '%s', chemin '%s')" }, - { 8, "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour obtenir la liste des ID reconnus" }, - { 9, "C2(compil\351 sur" }, - { 10, ", \351chec du montage du disque partag\351" }, - { 11, ", disque partag\351 non mont\351" }, - { 12, "... en cours ..." }, - { 13, "11 kHz" }, - { 14, "22 kHz" }, - { 15, "44 kHz" }, - { 16, "48 kHz" }, - { 17, "8 kHz" }, - { 18, "" }, - { 19, "\300 propos de ScummVM" }, - { 20, "\311mulateur AdLib:" }, - { 21, "\311mulateur AdLib:" }, - { 22, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, - { 23, "Ajouter..." }, - { 24, "Anti-cr\351nel\351 (16 bpp)" }, - { 25, "Correction du rapport d'aspect" }, - { 26, "Touche associ\351e: %s" }, - { 27, "Touche associ\351e: aucune" }, - { 28, "Audio" }, - { 29, "Sauvegarde auto:" }, - { 30, "C1Moteurs disponibles:" }, - { 31, "\300 ~P~ropos..." }, - { 32, "Affecter les touches" }, - { 33, "Les deux" }, - { 34, "Luminosit\351:" }, - { 35, "Annuler" }, - { 36, "Impossible de cr\351er le fichier" }, - { 37, "Change les options du jeu" }, - { 38, "Change les options globales de ScummVM" }, - { 39, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, - { 40, "Choisir" }, - { 41, "S\351lectionnez une action \340 affecter" }, - { 42, "Effacer la valeur" }, - { 43, "Fermer" }, - { 44, "Corrige le rapport d'aspect pour les jeu 320x200" }, - { 45, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, - { 46, "Mode vid\351o actuel" }, - { 47, "Bas" }, - { 48, "Gauche" }, - { 49, "Droit" }, - { 50, "Haut" }, - { 52, "DVD" }, - { 53, "DVD mont\351 avec succ\350s" }, - { 54, "DVD non mont\351" }, - { 55, "Date:" }, - { 56, "Debugger" }, - { 57, "D\351faut" }, - { 58, "Supprimer" }, - { 59, "D\351sactiv\351 l'extinction" }, - { 60, "GFX d\351sactiv\351" }, - { 61, "%d nouveaux jeux trouv\351s ..." }, - { 62, "%d nouveaux jeux trouv\351s." }, - { 63, "Affichage" }, - { 64, "Afficher le clavier" }, - { 65, "Voulez-vous vraiment supprimer cette sauvegarde?" }, - { 66, "Voulez-vous vraiment supprimer ce jeu?" }, - { 67, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, - { 68, "Voulez-vous charger ou sauver le jeu?" }, - { 69, "Voulez-vous ex\351cuter une recherche automatique?" }, - { 70, "Voulez-vous quitter?" }, - { 71, "Coup double" }, - { 72, "Bas" }, - { 73, "Activer le mode Roland GS" }, - { 74, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, - { 75, "Anglais" }, - { 76, "Erreur lors de l'\351x\351cution du jeu:" }, - { 77, "\311chec du montage du DVD" }, - { 78, "Extra:" }, - { 79, "FM Towns" }, - { 80, "Aucun th\350me GUI n'a pu \352tre charg\351; abandon" }, - { 81, "Mode rapide" }, - { 82, "C1Options incluses:" }, - { 84, "Nom complet du jeu" }, - { 85, "Plein \351cran" }, - { 86, "Acceleration du pad GC:" }, - { 87, "Sensibilit\351 du pad GC:" }, - { 88, "GFX" }, - { 90, "Langue:" }, - { 91, "Interface:" }, - { 92, "Jeu" }, - { 93, "Fichier de don\351es introuvable" }, - { 94, "ID de jeu non support\351" }, - { 95, "Chemin du Jeu:" }, - { 96, "Menu global" }, - { 97, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, - { 98, "Remonter" }, - { 99, "Graphique" }, - { 100, "Mode graphique:" }, - { 101, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, - { 104, "Cach\351 la barre d'outils" }, - { 105, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, - { 106, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, - { 107, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, - { 109, "FM Towns" }, - { 110, "ID:" }, - { 111, "Initialiser le r\351seau" }, - { 112, "\311chelle initiale de l'\351cran du haut" }, - { 113, "Initialisation du r\351seau" }, - { 114, "Initialisation du r\351seau" }, - { 115, "Entr\351e" }, - { 116, "Chemin Invalide" }, - { 117, "Affectation des touches" }, - { 118, "Clavier" }, - { 119, "Affectation des touches:" }, - { 120, "Touches" }, - { 121, "Langue de l'interface graphique de ScummVM" }, - { 122, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, - { 123, "Langue:" }, - { 124, "Gauche" }, - { 125, "Clic Gauche" }, - { 126, "Charger" }, - { 127, "Charger le jeu:" }, - { 128, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, - { 129, "\311mulateur AdLib:" }, - { 130, "MIDI" }, - { 131, "Gain MIDI:" }, - { 132, "\311mulation MT-32" }, - { 134, "\311chelle de l'\351cran principal" }, - { 135, "Affecter" }, - { 136, "Ajout Massif..." }, - { 137, "Menu" }, - { 138, "Divers" }, - { 139, "Mode mixe AdLib/MIDI" }, - { 140, "Monter le DVD" }, - { 141, "Monter SMB" }, - { 142, "Clic de souris" }, - { 144, "Volume Musique:" }, - { 145, "Silence" }, - { 146, "Nom:" }, - { 147, "R\351seau d\351connect\351" }, - { 148, "R\351seau non initialis\351 (%d)" }, - { 149, "R\351seau connect\351" }, - { 150, "R\351seau connect\351, disque partag\351 mont\351" }, - { 151, "Jamais" }, - { 152, "Non" }, - { 153, "Date non sauv\351e" }, - { 154, "Pas de musique" }, - { 155, "Dur\351e de jeu non sauv\351e" }, - { 156, "Heure non sauv\351e" }, - { 157, "Aucun" }, - { 159, "OK" }, - { 160, "Fr\351quence:" }, - { 161, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, - { 162, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, - { 163, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, - { 164, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, - { 165, "Haut Parleur PC" }, - { 166, "Mot de passe:" }, - { 167, "Chemin n'est pas un r\351pertoire" }, - { 168, "Chemin n'est pas un fichier" }, - { 169, "Chemin inexistant" }, - { 170, "Chemins" }, - { 171, "Mettre en pause" }, - { 172, "Choisissez le jeu:" }, - { 173, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 174, "Plateforme:" }, - { 175, "Dur\351e de jeu:" }, - { 176, "Selectionnez une action" }, - { 177, "Plugins:" }, - { 179, "Appuyez sur la touche \340 associer" }, - { 180, "Quitter" }, - { 181, "Quitter ScummVM" }, - { 182, "V\351roulli\351 en lecture" }, - { 183, "Echec de la lecture" }, - { 184, "Changer l'affectation des touches" }, - { 185, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 186, "Mode de rendu:" }, - { 187, "Droite" }, - { 188, "Clic Droit" }, - { 189, "Clic droit" }, - { 190, "Pivoter" }, - { 191, "Volume Bruitage:" }, - { 192, "SMB" }, - { 193, "Sauver" }, - { 194, "Sauvegardes:" }, - { 195, "Sauvegardes:" }, - { 196, "Sauvegarde:" }, - { 197, "Examen termin\351!" }, - { 198, "%d r\351pertoires examin\351s ..." }, - { 199, "Menu Principal ScummVM" }, - { 200, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 201, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 202, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 203, "Recherche dans la liste de jeux" }, - { 204, "Filtre:" }, - { 205, "Choisir une banque de sons" }, - { 206, "S\351lectionnez un Th\350me" }, - { 207, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 208, "Selectionez une action et cliquez 'Affecter'" }, - { 209, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 210, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 211, "S\351lectionner le r\351pertoire des plugins" }, - { 212, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 213, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 214, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 215, "Sensibilit\351" }, - { 216, "Serveur:" }, - { 217, "Disque partag\351:" }, - { 218, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 219, "Afficher le clavier" }, - { 220, "Afficher le curseur de la souris" }, - { 221, "Affiche les sous-titres et joue les dialogues audio" }, - { 222, "Afficher/Cacher le curseur" }, - { 223, "Passer" }, - { 224, "Passer la phrase" }, - { 225, "Sauter le texte" }, - { 226, "Aligner sur les bords" }, - { 227, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 228, "Audio marche/arr\352t" }, - { 229, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 230, "Banque de sons:" }, - { 231, "Audio" }, - { 232, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 233, "Volume des effets sp\351ciaux sonores" }, + { 2, "(Actif)" }, + { 3, "(Jeu)" }, + { 4, "(Global)" }, + { 5, "C2(compil\351 sur" }, + { 6, ", \351chec du montage du disque partag\351" }, + { 7, ", disque partag\351 non mont\351" }, + { 8, "... en cours ..." }, + { 9, "11 kHz" }, + { 10, "22 kHz" }, + { 11, "44 kHz" }, + { 12, "48 kHz" }, + { 13, "8 kHz" }, + { 14, "" }, + { 15, "\300 propos de ScummVM" }, + { 16, "\311mulateur AdLib:" }, + { 17, "\311mulateur AdLib:" }, + { 18, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, + { 19, "Ajouter..." }, + { 20, "Anti-cr\351nel\351 (16 bpp)" }, + { 21, "Correction du rapport d'aspect" }, + { 22, "Touche associ\351e: %s" }, + { 23, "Touche associ\351e: aucune" }, + { 24, "Audio" }, + { 25, "Sauvegarde auto:" }, + { 26, "C1Moteurs disponibles:" }, + { 27, "\300 ~P~ropos..." }, + { 28, "Affecter les touches" }, + { 29, "Les deux" }, + { 30, "Luminosit\351:" }, + { 31, "Annuler" }, + { 32, "Impossible de cr\351er le fichier" }, + { 33, "Change les options du jeu" }, + { 34, "Change les options globales de ScummVM" }, + { 35, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, + { 36, "Choisir" }, + { 37, "S\351lectionnez une action \340 affecter" }, + { 38, "Effacer la valeur" }, + { 39, "Fermer" }, + { 40, "Corrige le rapport d'aspect pour les jeu 320x200" }, + { 41, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, + { 42, "Mode vid\351o actuel" }, + { 43, "Bas" }, + { 44, "Gauche" }, + { 45, "Droit" }, + { 46, "Haut" }, + { 48, "DVD" }, + { 49, "DVD mont\351 avec succ\350s" }, + { 50, "DVD non mont\351" }, + { 51, "Date:" }, + { 52, "Debugger" }, + { 53, "D\351faut" }, + { 54, "Supprimer" }, + { 55, "D\351sactiv\351 l'extinction" }, + { 56, "GFX d\351sactiv\351" }, + { 57, "%d nouveaux jeux trouv\351s ..." }, + { 58, "%d nouveaux jeux trouv\351s." }, + { 59, "Affichage" }, + { 60, "Afficher le clavier" }, + { 61, "Voulez-vous vraiment supprimer cette sauvegarde?" }, + { 62, "Voulez-vous vraiment supprimer ce jeu?" }, + { 63, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, + { 64, "Voulez-vous charger ou sauver le jeu?" }, + { 65, "Voulez-vous ex\351cuter une recherche automatique?" }, + { 66, "Voulez-vous quitter?" }, + { 67, "Coup double" }, + { 68, "Bas" }, + { 69, "Activer le mode Roland GS" }, + { 70, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, + { 71, "Anglais" }, + { 72, "Erreur lors de l'\351x\351cution du jeu:" }, + { 73, "\311chec du montage du DVD" }, + { 74, "Extra:" }, + { 75, "FM Towns" }, + { 76, "Mode rapide" }, + { 77, "C1Options incluses:" }, + { 79, "Nom complet du jeu" }, + { 80, "Plein \351cran" }, + { 81, "Acceleration du pad GC:" }, + { 82, "Sensibilit\351 du pad GC:" }, + { 83, "GFX" }, + { 85, "Langue:" }, + { 86, "Interface:" }, + { 87, "Jeu" }, + { 88, "Fichier de don\351es introuvable" }, + { 89, "ID de jeu non support\351" }, + { 90, "Chemin du Jeu:" }, + { 91, "Menu global" }, + { 92, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, + { 93, "Remonter" }, + { 94, "Graphique" }, + { 95, "Mode graphique:" }, + { 96, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 99, "Cach\351 la barre d'outils" }, + { 100, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, + { 101, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, + { 102, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, + { 104, "FM Towns" }, + { 105, "ID:" }, + { 106, "Initialiser le r\351seau" }, + { 107, "\311chelle initiale de l'\351cran du haut" }, + { 108, "Initialisation du r\351seau" }, + { 109, "Initialisation du r\351seau" }, + { 110, "Entr\351e" }, + { 111, "Chemin Invalide" }, + { 112, "Affectation des touches" }, + { 113, "Clavier" }, + { 114, "Affectation des touches:" }, + { 115, "Touches" }, + { 116, "Langue de l'interface graphique de ScummVM" }, + { 117, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, + { 118, "Langue:" }, + { 119, "Gauche" }, + { 120, "Clic Gauche" }, + { 121, "Charger" }, + { 122, "Charger le jeu:" }, + { 123, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, + { 124, "\311mulateur AdLib:" }, + { 125, "MIDI" }, + { 126, "Gain MIDI:" }, + { 127, "\311mulation MT-32" }, + { 129, "\311chelle de l'\351cran principal" }, + { 130, "Affecter" }, + { 131, "Ajout Massif..." }, + { 132, "Menu" }, + { 133, "Divers" }, + { 134, "Mode mixe AdLib/MIDI" }, + { 135, "Monter le DVD" }, + { 136, "Monter SMB" }, + { 137, "Clic de souris" }, + { 139, "Volume Musique:" }, + { 140, "Silence" }, + { 141, "Nom:" }, + { 142, "R\351seau d\351connect\351" }, + { 143, "R\351seau non initialis\351 (%d)" }, + { 144, "R\351seau connect\351" }, + { 145, "R\351seau connect\351, disque partag\351 mont\351" }, + { 146, "Jamais" }, + { 147, "Non" }, + { 148, "Date non sauv\351e" }, + { 149, "Pas de musique" }, + { 150, "Dur\351e de jeu non sauv\351e" }, + { 151, "Heure non sauv\351e" }, + { 152, "Aucun" }, + { 154, "OK" }, + { 155, "Fr\351quence:" }, + { 156, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, + { 157, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, + { 158, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, + { 159, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, + { 160, "Haut Parleur PC" }, + { 161, "Mot de passe:" }, + { 162, "Chemin n'est pas un r\351pertoire" }, + { 163, "Chemin n'est pas un fichier" }, + { 164, "Chemin inexistant" }, + { 165, "Chemins" }, + { 166, "Mettre en pause" }, + { 167, "Choisissez le jeu:" }, + { 168, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 169, "Plateforme:" }, + { 170, "Dur\351e de jeu:" }, + { 171, "Selectionnez une action" }, + { 172, "Plugins:" }, + { 174, "Appuyez sur la touche \340 associer" }, + { 175, "Quitter" }, + { 176, "Quitter ScummVM" }, + { 177, "V\351roulli\351 en lecture" }, + { 178, "Echec de la lecture" }, + { 179, "Changer l'affectation des touches" }, + { 180, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 181, "Mode de rendu:" }, + { 182, "Droite" }, + { 183, "Clic Droit" }, + { 184, "Clic droit" }, + { 185, "Pivoter" }, + { 186, "Volume Bruitage:" }, + { 187, "SMB" }, + { 188, "Sauver" }, + { 189, "Sauvegardes:" }, + { 190, "Sauvegardes:" }, + { 191, "Sauvegarde:" }, + { 192, "Examen termin\351!" }, + { 193, "%d r\351pertoires examin\351s ..." }, + { 194, "Menu Principal ScummVM" }, + { 195, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 196, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 197, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 198, "Recherche dans la liste de jeux" }, + { 199, "Filtre:" }, + { 200, "Choisir une banque de sons" }, + { 201, "S\351lectionnez un Th\350me" }, + { 202, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 203, "Selectionez une action et cliquez 'Affecter'" }, + { 204, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 205, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 206, "S\351lectionner le r\351pertoire des plugins" }, + { 207, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 208, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 209, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 210, "Sensibilit\351" }, + { 211, "Serveur:" }, + { 212, "Disque partag\351:" }, + { 213, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 214, "Afficher le clavier" }, + { 215, "Afficher le curseur de la souris" }, + { 216, "Affiche les sous-titres et joue les dialogues audio" }, + { 217, "Afficher/Cacher le curseur" }, + { 218, "Passer" }, + { 219, "Passer la phrase" }, + { 220, "Sauter le texte" }, + { 221, "Aligner sur les bords" }, + { 222, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 223, "Audio marche/arr\352t" }, + { 224, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 225, "Banque de sons:" }, + { 226, "Audio" }, + { 227, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 228, "Volume des effets sp\351ciaux sonores" }, + { 229, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 231, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 232, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 233, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 236, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 237, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 238, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 239, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 240, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 241, "Audio" }, - { 242, "Volume Dialogues:" }, - { 243, "Standard (16bpp)" }, - { 244, "D\351marre le jeu s\351lectionn\351" }, - { 245, "Status:" }, - { 246, "Subs" }, - { 247, "Vitesse des ST:" }, - { 248, "Sous-titres" }, - { 250, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 251, "Dialogue:" }, - { 252, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 253, "Th\350mes:" }, - { 254, "Th\350me:" }, - { 255, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 256, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 257, "Heure:" }, - { 258, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 259, "D\351calage X du toucher" }, - { 260, "D\351callage Y du toucher" }, - { 261, "Mode touchpad d\351sactiv\351" }, - { 262, "Mode touchpad activ\351" }, - { 263, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 264, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 265, "Inconue" }, - { 266, "Erreur inconnue" }, - { 267, "D\351monter le DVD" }, - { 268, "D\351monter SMB" }, - { 269, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 270, "Mode de couleurs non support\351" }, - { 271, "Sauvegarde sans nom" }, - { 272, "Haut" }, - { 273, "Utiliser \340 la fois MIDI et AdLib" }, - { 274, "Activer le contr\364le du curseur de type trackpad" }, - { 275, "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" }, - { 276, "Nom d'utilisateur:" }, - { 277, "Utilise le pilote SDL" }, - { 279, "Vid\351o" }, - { 280, "Clavier virtuel" }, - { 281, "Volume" }, - { 282, "MIDI Windows" }, - { 283, "Verrouill\351 en \351criture" }, - { 284, "Echec de l'\351criture des donn\351es" }, - { 285, "Oui" }, - { 286, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 287, "Zone" }, - { 290, "Toutes les 10 mins" }, - { 291, "Toutes les 15 mins" }, - { 292, "Toutes les 30 mins" }, - { 293, "Toutes les 5 mins" }, - { 294, "Echec\n" }, - { 295, "\300 ~P~ropos" }, - { 296, "~A~jouter..." }, - { 297, "~A~nnuler" }, - { 298, "~F~ermer" }, - { 299, "~E~diter..." }, - { 300, "~A~ide" }, - { 301, "Contr\364le des combats d'~I~ndy" }, - { 302, "~T~ouches" }, - { 303, "Mode ~G~aucher" }, - { 304, "~C~harger" }, - { 305, "~C~harger" }, - { 306, "~S~uivant" }, - { 307, "~O~K" }, - { 308, "~O~ptions" }, - { 309, "~O~ptions..." }, - { 310, "~P~r\351c\351dent" }, - { 311, "~Q~uitter" }, - { 312, "~S~upprimer" }, - { 313, "~R~eprendre" }, - { 314, "Retour au ~L~anceur" }, - { 315, "~S~auver" }, - { 316, "~D~\351marrer" }, - { 317, "T~r~ansitions activ\351" }, - { 318, "~E~ffets de l'Eau activ\351s" }, - { 319, "Mode ~Z~ip Activ\351" }, + { 235, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 236, "Audio" }, + { 237, "Volume Dialogues:" }, + { 238, "Standard (16bpp)" }, + { 239, "D\351marre le jeu s\351lectionn\351" }, + { 240, "Status:" }, + { 241, "Subs" }, + { 242, "Vitesse des ST:" }, + { 243, "Sous-titres" }, + { 245, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 246, "Dialogue:" }, + { 247, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 248, "Th\350mes:" }, + { 249, "Th\350me:" }, + { 250, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 251, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 252, "Heure:" }, + { 253, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 254, "D\351calage X du toucher" }, + { 255, "D\351callage Y du toucher" }, + { 256, "Mode touchpad d\351sactiv\351" }, + { 257, "Mode touchpad activ\351" }, + { 258, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 259, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 260, "Inconue" }, + { 261, "Erreur inconnue" }, + { 262, "D\351monter le DVD" }, + { 263, "D\351monter SMB" }, + { 264, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 265, "Mode de couleurs non support\351" }, + { 266, "Sauvegarde sans nom" }, + { 267, "Haut" }, + { 268, "Utiliser \340 la fois MIDI et AdLib" }, + { 269, "Activer le contr\364le du curseur de type trackpad" }, + { 270, "Nom d'utilisateur:" }, + { 271, "Utilise le pilote SDL" }, + { 273, "Vid\351o" }, + { 274, "Clavier virtuel" }, + { 275, "Volume" }, + { 276, "MIDI Windows" }, + { 277, "Verrouill\351 en \351criture" }, + { 278, "Echec de l'\351criture des donn\351es" }, + { 279, "Oui" }, + { 280, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 281, "Zone" }, + { 284, "Toutes les 10 mins" }, + { 285, "Toutes les 15 mins" }, + { 286, "Toutes les 30 mins" }, + { 287, "Toutes les 5 mins" }, + { 288, "\300 ~P~ropos" }, + { 289, "~A~jouter..." }, + { 290, "~A~nnuler" }, + { 291, "~F~ermer" }, + { 292, "~E~diter..." }, + { 293, "~A~ide" }, + { 294, "Contr\364le des combats d'~I~ndy" }, + { 295, "~T~ouches" }, + { 296, "Mode ~G~aucher" }, + { 297, "~C~harger" }, + { 298, "~C~harger" }, + { 299, "~S~uivant" }, + { 300, "~O~K" }, + { 301, "~O~ptions" }, + { 302, "~O~ptions..." }, + { 303, "~P~r\351c\351dent" }, + { 304, "~Q~uitter" }, + { 305, "~S~upprimer" }, + { 306, "~R~eprendre" }, + { 307, "Retour au ~L~anceur" }, + { 308, "~S~auver" }, + { 309, "~D~\351marrer" }, + { 310, "T~r~ansitions activ\351" }, + { 311, "~E~ffets de l'Eau activ\351s" }, + { 312, "Mode ~Z~ip Activ\351" }, { -1, NULL } }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, - { 2, " Cercant un connector que suporti aquest identificador de joc... " }, - { 3, " Iniciant '%s'\n" }, - { 4, " (Actiu)" }, - { 5, " (Joc)" }, - { 6, " (Global)" }, - { 7, "%s ha fallat l'iniciat del motor: %s (target '%s', cam\355 '%s')" }, - { 8, "%s \351s un identificador de joc inv\340lid. Utilitzeu l'opci\363 --list-games per llistar els identificadors de joc suportats" }, - { 9, "(compilat el %s)" }, - { 10, ", error al muntar la compartici\363" }, - { 11, ", compartici\363 no muntada" }, - { 12, "... progr\351s ..." }, - { 13, "11kHz" }, - { 14, "22 kHz" }, - { 15, "44 kHz" }, - { 16, "48 kHz" }, - { 17, "8 kHz" }, - { 18, "" }, - { 19, "Quant a ScummVM" }, - { 20, "Emulador d'AdLib" }, - { 21, "Emulador d'AdLib:" }, - { 22, "AdLib s'utilitza per la m\372sica de molts jocs" }, - { 23, "Afegeix Joc..." }, - { 24, "Pintat amb antialias (16bpp)" }, - { 25, "Correcci\363 del rati d'aspecte" }, - { 26, "Tecla associada : %s" }, - { 27, "Tecla associada : cap" }, - { 28, "\300udio" }, - { 29, "Desat autom\340tic:" }, - { 30, "Motors disponibles:" }, - { 31, "~Q~uant a..." }, - { 32, "Mapeja tecles" }, - { 33, "Ambd\363s" }, - { 34, "Brillantor:" }, - { 35, "Cancel\267la" }, - { 36, "No s'ha pogut crear el fitxer" }, - { 37, "Canvia les opcions del joc" }, - { 38, "Canvia les opcions globals de ScummVM" }, - { 39, "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so compatible amb Roland connectat al vostre ordinador" }, - { 40, "Escull" }, - { 41, "Sel\267leccioneu una acci\363 per mapejar" }, - { 42, "Neteja el valor" }, - { 43, "Tanca" }, - { 44, "Corregeix la relaci\363 d'aspecte per jocs de 320x200" }, - { 45, "No s'ha pogut trobar cap motor capa\347 d'executar el joc seleccionat" }, - { 46, "Mode de v\355deo actual:" }, - { 47, "Cursor Avall" }, - { 48, "Cursor Esquerra" }, - { 49, "Cursor Dreta" }, - { 50, "Cursor Amunt" }, - { 51, "Emulador OPL de DOSBox" }, - { 52, "DVD" }, - { 53, "El DVD s'ha muntat satisfact\362riament" }, - { 54, "El DVD no est\340 muntat" }, - { 55, "Data: " }, - { 56, "Depurador" }, - { 57, "Per defecte" }, - { 58, "Suprimeix" }, - { 59, "Desactiva l'apagat autom\340tic" }, - { 60, "GFX desactivats" }, - { 61, "S'han descobert %d jocs nous ..." }, - { 62, "S'han descobert %d jocs nous." }, - { 63, "Pantalla" }, - { 64, "Mostra el teclat" }, - { 65, "Realment voleu suprimir aquesta partida?" }, - { 66, "Realment voleu suprimir la configuraci\363 d'aquest joc?" }, - { 67, "Esteu segur que voleu executar el detector massiu de jocs? Aix\362 pot afegir una gran quantitat de jocs." }, - { 68, "Voleu carregar o desar el joc?" }, - { 69, "Voleu fer una cerca autom\340tica?" }, - { 70, "Vols sortir?" }, - { 72, "Avall" }, - { 73, "Activa el Mode Roland GS" }, - { 74, "El motor no suporta el nivell de depuraci\363 '%s'" }, - { 75, "Angl\350s" }, - { 76, "Error al executar el joc:" }, - { 77, "Error al muntar el DVD" }, - { 78, "Cam\355 Extra:" }, - { 79, "Emulador de FM Towns" }, - { 80, "No s'ha pogut carregar cap tema de la interf\355cie d'usuari, avortant" }, - { 81, "Mode r\340pid" }, - { 82, "Caracter\355stiques compilades:" }, - { 83, "Vista lliure" }, - { 84, "T\355tol complet del joc" }, - { 85, "Mode pantalla completa" }, - { 86, "Acceleraci\363 del Pad GC:" }, - { 87, "Sensibilitat del Pad GC:" }, - { 88, "GFX" }, - { 89, "Dispositiu GM:" }, - { 90, "Idioma de la interf\355cie d'usuari:" }, - { 91, "Mode de pintat de la interf\355cie d'usuari:" }, - { 92, "Joc" }, - { 93, "No s'han trobat les dades del joc" }, - { 94, "Identificador de joc no suportat" }, - { 95, "Cam\355 del Joc:" }, - { 96, "Men\372 global" }, - { 97, "Torna al nivell de directoris anterior" }, - { 98, "Amunt" }, - { 99, "Gr\340fics" }, - { 100, "Mode gr\340fic:" }, - { 101, "Escalat per hardware (r\340pid, per\362 de baixa qualitat)" }, - { 102, "Hercules \300mbar" }, - { 103, "Hercules Verd" }, - { 104, "Oculta la barra d'eines" }, - { 105, "Alta qualitat d'\340udio (m\351s lent) (reiniciar)" }, - { 106, "Valors m\351s alts especifiquen millor qualitat de so per\362 pot ser que la vostra tarja de so no ho suporti" }, - { 107, "Mantingueu premut Shift per a l'Addici\363 Massiva" }, - { 109, "Emulador d'IBM PCjr" }, - { 110, "Identificador:" }, - { 111, "Inicia la xarxa" }, - { 112, "Escalat inicial de la pantalla superior:" }, - { 113, "Iniciant l'Emulador de MT-32" }, - { 114, "Iniciant la xarxa" }, - { 115, "Entrada" }, - { 116, "Cam\355 incorrecte" }, - { 117, "Mapejador de tecles" }, - { 118, "Teclat" }, - { 119, "Mapa de teclat:" }, - { 120, "Tecles" }, - { 121, "Idioma de la interf\355cie d'usuari de ScummVM" }, - { 122, "Idioma del joc. Aix\362 no convertir\340 la vostra versi\363 Espanyola del joc a Angl\350s" }, - { 123, "Idioma:" }, - { 124, "Esquerra" }, - { 125, "Clic esquerre" }, - { 126, "Carrega" }, - { 127, "Carrega partida:" }, - { 128, "Carrega una partida pel joc seleccionat" }, - { 129, "Emulador OPL de MAME" }, - { 130, "MIDI" }, - { 131, "Guany MIDI:" }, - { 132, "Emulador de MT-32" }, - { 133, "Dispositiu MT32:" }, - { 134, "Escalat de la pantalla principal:" }, - { 135, "Mapeja" }, - { 136, "Addici\363 Massiva..." }, - { 137, "Men\372" }, - { 138, "Misc" }, - { 139, "Mode combinat AdLib/MIDI" }, - { 140, "Munta el DVD" }, - { 141, "Munta SMB" }, - { 142, "Clic del ratol\355" }, - { 143, "Funci\363 M\372ltiple" }, - { 144, "Volum de la m\372sica:" }, - { 145, "Silenciar tot" }, - { 146, "Nom:" }, - { 147, "Xarxa inactiva" }, - { 148, "Xarxa no iniciada (%d)" }, - { 149, "Xarxa activa" }, - { 150, "Xarxa activa, compartici\363 muntada" }, - { 151, "Mai" }, - { 152, "No" }, - { 153, "No hi ha data desada" }, - { 154, "Sense m\372sica" }, - { 155, "No hi ha temps de joc desat" }, - { 156, "No hi ha hora desada" }, - { 157, "Cap" }, - { 158, "Normal (sense escalar)" }, - { 159, "D'acord" }, - { 160, "Freq\374\350ncia de sortida:" }, - { 161, "Fer canvis sobre les opcions globals de MIDI" }, - { 162, "Fer canvis sobre les opcions globals d'\340udio" }, - { 163, "Fer canvis sobre les opcions globals de gr\340fics" }, - { 164, "Fer canvis sobre les opcions globals de volum" }, - { 165, "Emulador d'Altaveu de PC" }, - { 166, "Contrasenya:" }, - { 167, "El cam\355 no \351s un directori" }, - { 168, "El cam\355 no \351s un fitxer" }, - { 169, "El cam\355 no existeix" }, - { 170, "Camins" }, - { 171, "Pausa" }, - { 172, "Seleccioneu el joc:" }, - { 173, "Plataforma per la que el joc es va dissenyar originalment" }, - { 174, "Plataforma:" }, - { 175, "Temps de joc: " }, - { 176, "Seleccioneu una acci\363" }, - { 177, "Cam\355 dels connectors:" }, - { 178, "Dispositiu Preferit:" }, - { 179, "Premeu la tecla a associar" }, - { 180, "Surt" }, - { 181, "Surt de ScummVM" }, - { 182, "S'ha denegat el perm\355s de lectura" }, - { 183, "Ha fallat la lectura" }, - { 184, "Remapeja les tecles" }, - { 185, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, - { 186, "Mode de pintat:" }, - { 187, "Dreta" }, - { 188, "Clic dret" }, - { 189, "Clic dret" }, - { 190, "Rotar" }, - { 191, "Volum dels efectes:" }, - { 192, "SMB" }, - { 193, "Desa" }, - { 194, "Cam\355 de les Partides:" }, - { 195, "Cam\355 de les Partides: " }, - { 196, "Desa la partida:" }, - { 197, "S'ha acabat la cerca!" }, - { 198, "S'han cercat %d directoris ..." }, - { 199, "Men\372 Principal de ScummVM" }, - { 200, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, - { 201, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, - { 202, "ScummVM no ha pogut obrir el directori especificat!" }, - { 203, "Cerca a la llista de jocs" }, - { 204, "Cerca:" }, - { 205, "Seleccioneu el fitxer SoundFont" }, - { 206, "Seleccioneu un Tema" }, - { 207, "Seleccioneu el directori addicional del joc" }, - { 208, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, - { 209, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, - { 210, "Seleccioneu el directori dels fitxers extra" }, - { 211, "Seleccioneu el directori dels connectors" }, - { 212, "Seleccioneu el directori de les partides desades" }, - { 213, "Seleccioneu el directori de les partides desades" }, - { 214, "Seleccioneu el directori amb les dades del joc" }, - { 215, "Sensibilitat" }, - { 216, "Servidor:" }, - { 217, "Compartici\363:" }, - { 218, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, - { 219, "Mostra el teclat" }, - { 220, "Mostra el cursor del ratol\355" }, - { 221, "Mostra els subt\355tols i reprodueix la veu" }, - { 222, "Mostra/Oculta el cursor" }, - { 223, "Salta" }, - { 224, "Salta la l\355nia" }, - { 225, "Salta el text" }, - { 227, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, - { 228, "So engegat/parat" }, - { 229, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, - { 230, "Fitxer SoundFont:" }, - { 231, "Veus" }, - { 232, "Modes de dispersi\363 especials suportats per alguns jocs" }, - { 233, "Volum dels sons d'efectes especials" }, - { 234, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, - { 235, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, - { 236, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, - { 237, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, - { 238, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, - { 239, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, - { 240, "Especifica on es desaran les partides" }, - { 241, "Veus" }, - { 242, "Volum de la veu:" }, - { 243, "Pintat est\340ndard (16bpp)" }, - { 244, "Iniciant el joc seleccionat" }, - { 245, "Estat:" }, - { 246, "Subt" }, - { 247, "Velocitat dels subt\355tols:" }, - { 248, "Subt\355tols" }, - { 249, "Commuta el personatge" }, - { 250, "Toc per a clic esquerre, doble toc per a clic dret" }, - { 251, "Text i Veus:" }, - { 252, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, - { 253, "Cam\355 dels Temes:" }, - { 254, "Tema:" }, - { 255, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, - { 256, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, - { 257, "Hora: " }, - { 259, "Despla\347ament X del toc" }, - { 260, "Despla\347ament Y del toc" }, - { 261, "Mode Touchpad desactivat." }, - { 262, "Mode Touchpad activat." }, - { 263, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, - { 264, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, - { 265, "Desconegut" }, - { 266, "Error desconegut" }, - { 267, "Desmunta el DVD" }, - { 268, "Desmunta SMB" }, - { 269, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, - { 270, "Mode de color no suportat" }, - { 271, "Partida sense t\355tol" }, - { 272, "Amunt" }, - { 273, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, - { 274, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, - { 275, "L'usuari ha seleccionat el target '%s' (identificador de joc '%s')...\n" }, - { 276, "Nom d'usuari:" }, - { 277, "Utilitzant el controlador SDL " }, - { 279, "V\355deo" }, - { 280, "Teclat virtual" }, - { 281, "Volum" }, - { 282, "MIDI de Windows" }, - { 283, "S'ha denegat el perm\355s d'escriptura" }, - { 284, "Ha fallat l'escriptura de dades" }, - { 285, "S\355" }, - { 286, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, - { 287, "Zona" }, - { 288, "Redueix" }, - { 289, "Amplia" }, - { 290, "cada 10 minuts" }, - { 291, "cada 15 minuts" }, - { 292, "cada 30 minuts" }, - { 293, "cada 5 minuts" }, - { 294, "ha fallat\n" }, - { 295, "~Q~uant a" }, - { 296, "~A~fegeix Joc..." }, - { 297, "~C~ancel\267la" }, - { 298, "~T~anca" }, - { 299, "~E~dita Joc..." }, - { 300, "~A~juda" }, - { 301, "Controls de lluita de l'~I~ndy" }, - { 302, "~T~ecles" }, - { 303, "Mode ~e~squerr\340" }, - { 304, "C~a~rrega" }, - { 305, "~C~arrega..." }, - { 306, "~S~eg\374ent" }, - { 307, "~D~'acord" }, - { 308, "~O~pcions" }, - { 309, "~O~pcions..." }, - { 310, "~A~nterior" }, - { 311, "~T~anca" }, - { 312, "~S~uprimeix Joc" }, - { 313, "~C~ontinua" }, - { 314, "~R~etorna al Llan\347ador" }, - { 315, "~D~esa" }, - { 316, "~I~nicia" }, - { 317, "~T~ransicions activades" }, - { 318, "~E~fecte de l'aigua activat" }, - { 319, "Mode ~Z~ip activat" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nLanguage: Catalan\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, + { 2, " (Actiu)" }, + { 3, " (Joc)" }, + { 4, " (Global)" }, + { 5, "(compilat el %s)" }, + { 6, ", error al muntar la compartici\363" }, + { 7, ", compartici\363 no muntada" }, + { 8, "... progr\351s ..." }, + { 9, "11kHz" }, + { 10, "22 kHz" }, + { 11, "44 kHz" }, + { 12, "48 kHz" }, + { 13, "8 kHz" }, + { 14, "" }, + { 15, "Quant a ScummVM" }, + { 16, "Emulador d'AdLib" }, + { 17, "Emulador d'AdLib:" }, + { 18, "AdLib s'utilitza per la m\372sica de molts jocs" }, + { 19, "Afegeix Joc..." }, + { 20, "Pintat amb antialias (16bpp)" }, + { 21, "Correcci\363 del rati d'aspecte" }, + { 22, "Tecla associada : %s" }, + { 23, "Tecla associada : cap" }, + { 24, "\300udio" }, + { 25, "Desat autom\340tic:" }, + { 26, "Motors disponibles:" }, + { 27, "~Q~uant a..." }, + { 28, "Mapeja tecles" }, + { 29, "Ambd\363s" }, + { 30, "Brillantor:" }, + { 31, "Cancel\267la" }, + { 32, "No s'ha pogut crear el fitxer" }, + { 33, "Canvia les opcions del joc" }, + { 34, "Canvia les opcions globals de ScummVM" }, + { 35, "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so compatible amb Roland connectat al vostre ordinador" }, + { 36, "Escull" }, + { 37, "Sel\267leccioneu una acci\363 per mapejar" }, + { 38, "Neteja el valor" }, + { 39, "Tanca" }, + { 40, "Corregeix la relaci\363 d'aspecte per jocs de 320x200" }, + { 41, "No s'ha pogut trobar cap motor capa\347 d'executar el joc seleccionat" }, + { 42, "Mode de v\355deo actual:" }, + { 43, "Cursor Avall" }, + { 44, "Cursor Esquerra" }, + { 45, "Cursor Dreta" }, + { 46, "Cursor Amunt" }, + { 47, "Emulador OPL de DOSBox" }, + { 48, "DVD" }, + { 49, "El DVD s'ha muntat satisfact\362riament" }, + { 50, "El DVD no est\340 muntat" }, + { 51, "Data: " }, + { 52, "Depurador" }, + { 53, "Per defecte" }, + { 54, "Suprimeix" }, + { 55, "Desactiva l'apagat autom\340tic" }, + { 56, "GFX desactivats" }, + { 57, "S'han descobert %d jocs nous ..." }, + { 58, "S'han descobert %d jocs nous." }, + { 59, "Pantalla" }, + { 60, "Mostra el teclat" }, + { 61, "Realment voleu suprimir aquesta partida?" }, + { 62, "Realment voleu suprimir la configuraci\363 d'aquest joc?" }, + { 63, "Esteu segur que voleu executar el detector massiu de jocs? Aix\362 pot afegir una gran quantitat de jocs." }, + { 64, "Voleu carregar o desar el joc?" }, + { 65, "Voleu fer una cerca autom\340tica?" }, + { 66, "Vols sortir?" }, + { 68, "Avall" }, + { 69, "Activa el Mode Roland GS" }, + { 70, "El motor no suporta el nivell de depuraci\363 '%s'" }, + { 71, "Angl\350s" }, + { 72, "Error al executar el joc:" }, + { 73, "Error al muntar el DVD" }, + { 74, "Cam\355 Extra:" }, + { 75, "Emulador de FM Towns" }, + { 76, "Mode r\340pid" }, + { 77, "Caracter\355stiques compilades:" }, + { 78, "Vista lliure" }, + { 79, "T\355tol complet del joc" }, + { 80, "Mode pantalla completa" }, + { 81, "Acceleraci\363 del Pad GC:" }, + { 82, "Sensibilitat del Pad GC:" }, + { 83, "GFX" }, + { 84, "Dispositiu GM:" }, + { 85, "Idioma de la interf\355cie d'usuari:" }, + { 86, "Mode de pintat de la interf\355cie d'usuari:" }, + { 87, "Joc" }, + { 88, "No s'han trobat les dades del joc" }, + { 89, "Identificador de joc no suportat" }, + { 90, "Cam\355 del Joc:" }, + { 91, "Men\372 global" }, + { 92, "Torna al nivell de directoris anterior" }, + { 93, "Amunt" }, + { 94, "Gr\340fics" }, + { 95, "Mode gr\340fic:" }, + { 96, "Escalat per hardware (r\340pid, per\362 de baixa qualitat)" }, + { 97, "Hercules \300mbar" }, + { 98, "Hercules Verd" }, + { 99, "Oculta la barra d'eines" }, + { 100, "Alta qualitat d'\340udio (m\351s lent) (reiniciar)" }, + { 101, "Valors m\351s alts especifiquen millor qualitat de so per\362 pot ser que la vostra tarja de so no ho suporti" }, + { 102, "Mantingueu premut Shift per a l'Addici\363 Massiva" }, + { 104, "Emulador d'IBM PCjr" }, + { 105, "Identificador:" }, + { 106, "Inicia la xarxa" }, + { 107, "Escalat inicial de la pantalla superior:" }, + { 108, "Iniciant l'Emulador de MT-32" }, + { 109, "Iniciant la xarxa" }, + { 110, "Entrada" }, + { 111, "Cam\355 incorrecte" }, + { 112, "Mapejador de tecles" }, + { 113, "Teclat" }, + { 114, "Mapa de teclat:" }, + { 115, "Tecles" }, + { 116, "Idioma de la interf\355cie d'usuari de ScummVM" }, + { 117, "Idioma del joc. Aix\362 no convertir\340 la vostra versi\363 Espanyola del joc a Angl\350s" }, + { 118, "Idioma:" }, + { 119, "Esquerra" }, + { 120, "Clic esquerre" }, + { 121, "Carrega" }, + { 122, "Carrega partida:" }, + { 123, "Carrega una partida pel joc seleccionat" }, + { 124, "Emulador OPL de MAME" }, + { 125, "MIDI" }, + { 126, "Guany MIDI:" }, + { 127, "Emulador de MT-32" }, + { 128, "Dispositiu MT32:" }, + { 129, "Escalat de la pantalla principal:" }, + { 130, "Mapeja" }, + { 131, "Addici\363 Massiva..." }, + { 132, "Men\372" }, + { 133, "Misc" }, + { 134, "Mode combinat AdLib/MIDI" }, + { 135, "Munta el DVD" }, + { 136, "Munta SMB" }, + { 137, "Clic del ratol\355" }, + { 138, "Funci\363 M\372ltiple" }, + { 139, "Volum de la m\372sica:" }, + { 140, "Silenciar tot" }, + { 141, "Nom:" }, + { 142, "Xarxa inactiva" }, + { 143, "Xarxa no iniciada (%d)" }, + { 144, "Xarxa activa" }, + { 145, "Xarxa activa, compartici\363 muntada" }, + { 146, "Mai" }, + { 147, "No" }, + { 148, "No hi ha data desada" }, + { 149, "Sense m\372sica" }, + { 150, "No hi ha temps de joc desat" }, + { 151, "No hi ha hora desada" }, + { 152, "Cap" }, + { 153, "Normal (sense escalar)" }, + { 154, "D'acord" }, + { 155, "Freq\374\350ncia de sortida:" }, + { 156, "Fer canvis sobre les opcions globals de MIDI" }, + { 157, "Fer canvis sobre les opcions globals d'\340udio" }, + { 158, "Fer canvis sobre les opcions globals de gr\340fics" }, + { 159, "Fer canvis sobre les opcions globals de volum" }, + { 160, "Emulador d'Altaveu de PC" }, + { 161, "Contrasenya:" }, + { 162, "El cam\355 no \351s un directori" }, + { 163, "El cam\355 no \351s un fitxer" }, + { 164, "El cam\355 no existeix" }, + { 165, "Camins" }, + { 166, "Pausa" }, + { 167, "Seleccioneu el joc:" }, + { 168, "Plataforma per la que el joc es va dissenyar originalment" }, + { 169, "Plataforma:" }, + { 170, "Temps de joc: " }, + { 171, "Seleccioneu una acci\363" }, + { 172, "Cam\355 dels connectors:" }, + { 173, "Dispositiu Preferit:" }, + { 174, "Premeu la tecla a associar" }, + { 175, "Surt" }, + { 176, "Surt de ScummVM" }, + { 177, "S'ha denegat el perm\355s de lectura" }, + { 178, "Ha fallat la lectura" }, + { 179, "Remapeja les tecles" }, + { 180, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, + { 181, "Mode de pintat:" }, + { 182, "Dreta" }, + { 183, "Clic dret" }, + { 184, "Clic dret" }, + { 185, "Rotar" }, + { 186, "Volum dels efectes:" }, + { 187, "SMB" }, + { 188, "Desa" }, + { 189, "Cam\355 de les Partides:" }, + { 190, "Cam\355 de les Partides: " }, + { 191, "Desa la partida:" }, + { 192, "S'ha acabat la cerca!" }, + { 193, "S'han cercat %d directoris ..." }, + { 194, "Men\372 Principal de ScummVM" }, + { 195, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, + { 196, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, + { 197, "ScummVM no ha pogut obrir el directori especificat!" }, + { 198, "Cerca a la llista de jocs" }, + { 199, "Cerca:" }, + { 200, "Seleccioneu el fitxer SoundFont" }, + { 201, "Seleccioneu un Tema" }, + { 202, "Seleccioneu el directori addicional del joc" }, + { 203, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, + { 204, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, + { 205, "Seleccioneu el directori dels fitxers extra" }, + { 206, "Seleccioneu el directori dels connectors" }, + { 207, "Seleccioneu el directori de les partides desades" }, + { 208, "Seleccioneu el directori de les partides desades" }, + { 209, "Seleccioneu el directori amb les dades del joc" }, + { 210, "Sensibilitat" }, + { 211, "Servidor:" }, + { 212, "Compartici\363:" }, + { 213, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, + { 214, "Mostra el teclat" }, + { 215, "Mostra el cursor del ratol\355" }, + { 216, "Mostra els subt\355tols i reprodueix la veu" }, + { 217, "Mostra/Oculta el cursor" }, + { 218, "Salta" }, + { 219, "Salta la l\355nia" }, + { 220, "Salta el text" }, + { 222, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, + { 223, "So engegat/parat" }, + { 224, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, + { 225, "Fitxer SoundFont:" }, + { 226, "Veus" }, + { 227, "Modes de dispersi\363 especials suportats per alguns jocs" }, + { 228, "Volum dels sons d'efectes especials" }, + { 229, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, + { 230, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, + { 231, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, + { 232, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, + { 233, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, + { 234, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, + { 235, "Especifica on es desaran les partides" }, + { 236, "Veus" }, + { 237, "Volum de la veu:" }, + { 238, "Pintat est\340ndard (16bpp)" }, + { 239, "Iniciant el joc seleccionat" }, + { 240, "Estat:" }, + { 241, "Subt" }, + { 242, "Velocitat dels subt\355tols:" }, + { 243, "Subt\355tols" }, + { 244, "Commuta el personatge" }, + { 245, "Toc per a clic esquerre, doble toc per a clic dret" }, + { 246, "Text i Veus:" }, + { 247, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, + { 248, "Cam\355 dels Temes:" }, + { 249, "Tema:" }, + { 250, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, + { 251, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, + { 252, "Hora: " }, + { 254, "Despla\347ament X del toc" }, + { 255, "Despla\347ament Y del toc" }, + { 256, "Mode Touchpad desactivat." }, + { 257, "Mode Touchpad activat." }, + { 258, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, + { 259, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, + { 260, "Desconegut" }, + { 261, "Error desconegut" }, + { 262, "Desmunta el DVD" }, + { 263, "Desmunta SMB" }, + { 264, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, + { 265, "Mode de color no suportat" }, + { 266, "Partida sense t\355tol" }, + { 267, "Amunt" }, + { 268, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, + { 269, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, + { 270, "Nom d'usuari:" }, + { 271, "Utilitzant el controlador SDL " }, + { 273, "V\355deo" }, + { 274, "Teclat virtual" }, + { 275, "Volum" }, + { 276, "MIDI de Windows" }, + { 277, "S'ha denegat el perm\355s d'escriptura" }, + { 278, "Ha fallat l'escriptura de dades" }, + { 279, "S\355" }, + { 280, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, + { 281, "Zona" }, + { 282, "Redueix" }, + { 283, "Amplia" }, + { 284, "cada 10 minuts" }, + { 285, "cada 15 minuts" }, + { 286, "cada 30 minuts" }, + { 287, "cada 5 minuts" }, + { 288, "~Q~uant a" }, + { 289, "~A~fegeix Joc..." }, + { 290, "~C~ancel\267la" }, + { 291, "~T~anca" }, + { 292, "~E~dita Joc..." }, + { 293, "~A~juda" }, + { 294, "Controls de lluita de l'~I~ndy" }, + { 295, "~T~ecles" }, + { 296, "Mode ~e~squerr\340" }, + { 297, "C~a~rrega" }, + { 298, "~C~arrega..." }, + { 299, "~S~eg\374ent" }, + { 300, "~D~'acord" }, + { 301, "~O~pcions" }, + { 302, "~O~pcions..." }, + { 303, "~A~nterior" }, + { 304, "~T~anca" }, + { 305, "~S~uprimeix Joc" }, + { 306, "~C~ontinua" }, + { 307, "~R~etorna al Llan\347ador" }, + { 308, "~D~esa" }, + { 309, "~I~nicia" }, + { 310, "~T~ransicions activades" }, + { 311, "~E~fecte de l'aigua activat" }, + { 312, "Mode ~Z~ip activat" }, { -1, NULL } }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, - { 18, "" }, - { 20, "AdLib vezet :" }, - { 21, "AdLib vezet :" }, - { 25, "Aspect adag korrekci\363" }, - { 28, "Hang" }, - { 29, "Automatikus ment\351s:" }, - { 32, "Kulcsok" }, - { 46, "Renderel\351si m\363d:" }, - { 57, "" }, - { 73, "K\351pess\351 Roland GS Mode" }, - { 78, "Extra \332tvonal:" }, - { 81, "Grafikus m\363d:" }, - { 85, "Teljes k\351perny s m\363d:" }, - { 91, "Lek\351pez eszk\366z GUI:" }, - { 95, "Extra \332tvonal:" }, - { 99, "Grafik\341val" }, - { 100, "Grafikus m\363d:" }, - { 120, "Kulcsok" }, - { 129, "AdLib vezet :" }, - { 131, "MIDI nyeres\351g:" }, - { 139, "Vegyes AdLib/MIDI m\363d" }, - { 144, "Zene mennyis\351g:" }, - { 145, "Muta \326sszes" }, - { 151, "Soha" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 14, "" }, + { 16, "AdLib vezet :" }, + { 17, "AdLib vezet :" }, + { 21, "Aspect adag korrekci\363" }, + { 24, "Hang" }, + { 25, "Automatikus ment\351s:" }, + { 28, "Kulcsok" }, + { 42, "Renderel\351si m\363d:" }, + { 53, "" }, + { 69, "K\351pess\351 Roland GS Mode" }, + { 74, "Extra \332tvonal:" }, + { 76, "Grafikus m\363d:" }, + { 80, "Teljes k\351perny s m\363d:" }, + { 86, "Lek\351pez eszk\366z GUI:" }, + { 90, "Extra \332tvonal:" }, + { 94, "Grafik\341val" }, + { 95, "Grafikus m\363d:" }, + { 115, "Kulcsok" }, + { 124, "AdLib vezet :" }, + { 126, "MIDI nyeres\351g:" }, + { 134, "Vegyes AdLib/MIDI m\363d" }, + { 139, "Zene mennyis\351g:" }, + { 140, "Muta \326sszes" }, + { 146, "Soha" }, + { 147, "Semmi" }, { 152, "Semmi" }, - { 157, "Semmi" }, - { 159, "Igen" }, - { 160, "Kimeneti teljes\355tm\351ny:" }, - { 170, "\326sv\351nyek" }, - { 171, "\326sv\351nyek" }, - { 186, "Renderel\351si m\363d:" }, - { 191, "SFX mennyis\351ge" }, - { 194, "Extra \332tvonal:" }, - { 216, "Soha" }, - { 241, "Csak a besz\351d" }, - { 242, "Besz\351d mennyis\351g:" }, - { 247, "Felirat sebess\351g:" }, - { 248, "Csak feliratok" }, - { 251, "Sz\366veg \351s besz\351d:" }, - { 254, "T\351ma:" }, - { 257, "T\351ma:" }, - { 263, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 277, "Zenei vezet :" }, - { 281, "Volumene" }, - { 287, "Semmi" }, - { 290, "10 percenk\351nt" }, - { 291, "15 percenk\351nt" }, - { 292, "30 percenk\351nt" }, - { 293, "5 percenk\351nt" }, - { 302, "Kulcsok" }, - { 303, "Renderel\351si m\363d:" }, - { 307, "Igen" }, + { 154, "Igen" }, + { 155, "Kimeneti teljes\355tm\351ny:" }, + { 165, "\326sv\351nyek" }, + { 166, "\326sv\351nyek" }, + { 181, "Renderel\351si m\363d:" }, + { 186, "SFX mennyis\351ge" }, + { 189, "Extra \332tvonal:" }, + { 211, "Soha" }, + { 236, "Csak a besz\351d" }, + { 237, "Besz\351d mennyis\351g:" }, + { 242, "Felirat sebess\351g:" }, + { 243, "Csak feliratok" }, + { 246, "Sz\366veg \351s besz\351d:" }, + { 249, "T\351ma:" }, + { 252, "T\351ma:" }, + { 258, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 271, "Zenei vezet :" }, + { 275, "Volumene" }, + { 281, "Semmi" }, + { 284, "10 percenk\351nt" }, + { 285, "15 percenk\351nt" }, + { 286, "30 percenk\351nt" }, + { 287, "5 percenk\351nt" }, + { 295, "Kulcsok" }, + { 296, "Renderel\351si m\363d:" }, + { 300, "Igen" }, { -1, NULL } }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 18:15+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, - { 2, " Suche nach einer Erweiterung, die diese Spielkennung unterst\374tzt..." }, - { 3, " Starte \"%s\"\n" }, - { 4, " (Aktiv)" }, - { 5, " (Spiel)" }, - { 6, " (Global)" }, - { 7, "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" }, - { 8, "%s ist eine ung\374ltige Spielkennung. Benutzen Sie die Option --list-games zum Anzeigen der unterst\374tzten Spielkennungen." }, - { 9, "C2(erstellt am" }, - { 10, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, - { 11, ", \366ffentliches Verzeichnis nicht eingebunden" }, - { 12, "... l\344uft..." }, - { 13, "11 kHz" }, - { 14, "22 kHz" }, - { 15, "44 kHz" }, - { 16, "48 kHz" }, - { 17, "8 kHz" }, - { 18, "" }, - { 19, "\334ber ScummVM" }, - { 20, "AdLib-Emulator" }, - { 21, "AdLib-Emulator" }, - { 22, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, - { 23, "Spiel hinzuf\374gen..." }, - { 24, "Kantengl\344ttung (16bpp)" }, - { 25, "Seitenverh\344ltnis korrigieren" }, - { 26, "Zugewiesene Taste : %s" }, - { 27, "Zugewiesene Taste : keine" }, - { 28, "Audio" }, - { 29, "Autom. Speichern:" }, - { 30, "C1Verf\374gbare Spiele-Engines:" }, - { 31, "\334be~r~" }, - { 32, "Tasten zuweisen" }, - { 33, "Beides" }, - { 34, "Helligkeit:" }, - { 35, "Abbrechen" }, - { 36, "Kann Datei nicht erstellen." }, - { 37, "Spieloptionen \344ndern" }, - { 38, "Globale ScummVM-Einstellungen bearbeiten" }, - { 39, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." }, - { 40, "Ausw\344hlen" }, - { 41, "Eine Aktion zum Zuweisen ausw\344hlen" }, - { 42, "Wert l\366schen" }, - { 43, "Schlie\337en" }, - { 44, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" }, - { 45, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." }, - { 46, "Aktueller Videomodus:" }, - { 47, "Zeiger runter" }, - { 48, "Zeiger nach links" }, - { 49, "Zeiger nach rechts" }, - { 50, "Zeiger hoch" }, - { 52, "DVD" }, - { 53, "DVD erfolgreich eingebunden" }, - { 54, "DVD nicht eingebunden" }, - { 55, "Datum: " }, - { 56, "Debugger" }, - { 57, "" }, - { 58, "L\366schen" }, - { 59, "Stromsparmodus abschalten" }, - { 60, "GFX ausgeschalten" }, - { 61, "%d neue Spiele gefunden..." }, - { 62, "%d neue Spiele gefunden." }, - { 63, "Anzeige" }, - { 64, "Tastatur anzeigen" }, - { 65, "Diesen Spielstand wirklich l\366schen?" }, - { 66, "M\366chten Sie wirklich diese Spielkonfiguration entfernen?" }, - { 67, "M\366chten Sie wirklich den PC nach Spielen durchsuchen? M\366glicherweise wird dabei eine gr\366\337ere Menge an Spielen hinzugef\374gt." }, - { 68, "M\366chten Sie ein Spiel laden oder speichern?" }, - { 69, "M\366chten Sie eine automatische Durchsuchung vornehmen?" }, - { 70, "M\366chten Sie beenden?" }, - { 71, "Doppelzeilen (kein Zeilensprungverfahren)" }, - { 72, "Runter" }, - { 73, "Roland-GS-Modus" }, - { 74, "Engine unterst\374tzt den Debug-Level \"%s\" nicht" }, - { 75, "English" }, - { 76, "Fehler beim Ausf\374hren des Spiels:" }, - { 77, "Fehler beim Einbinden der DVD" }, - { 78, "Extrapfad:" }, - { 79, "FM Towns" }, - { 80, "Fehler: Konnte kein Benutzeroberfl\344chen-Thema laden. Abbruch..." }, - { 81, "Schneller Modus" }, - { 82, "C1Verwendete Funktionen:" }, - { 83, "Freie Ansicht" }, - { 84, "Voller Name des Spiels" }, - { 85, "Vollbildmodus" }, - { 86, "GC-Pad-Beschleunigung:" }, - { 87, "GC-Pad-Empfindlichkeit:" }, - { 88, "GFX" }, - { 90, "GUI-Sprache:" }, - { 91, "GUI-Renderer:" }, - { 92, "Spiel" }, - { 93, "Spieldaten nicht gefunden" }, - { 94, "Spielkennung nicht unterst\374tzt" }, - { 95, "Spielpfad:" }, - { 96, "Hauptmen\374" }, - { 97, "Zu h\366herer Pfadebene wechseln" }, - { 98, "Pfad hoch" }, - { 99, "Grafik" }, - { 100, "Grafikmodus:" }, - { 101, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, - { 104, "Werkzeugleiste verbergen" }, - { 105, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, - { 106, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, - { 107, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, - { 108, "Horizontale Bildverkleinerung:" }, - { 109, "FM Towns" }, - { 110, "Kennung:" }, - { 111, "Netzwerk starten" }, - { 112, "Verg\366\337erung des oberen Bildschirms:" }, - { 113, "Netzwerk wird gestartet..." }, - { 114, "Netzwerk wird gestartet..." }, - { 115, "Eingabe" }, - { 116, "Ung\374ltiges Verzeichnis" }, - { 117, "Tasten zuordnen" }, - { 118, "Tastatur" }, - { 119, "Tasten-Layout:" }, - { 120, "Tasten" }, - { 121, "Sprache der ScummVM-Oberfl\344che" }, - { 122, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." }, - { 123, "Sprache:" }, - { 124, "Links" }, - { 125, "Linksklick" }, - { 126, "Laden" }, - { 127, "Spiel laden:" }, - { 128, "Spielstand f\374r ausgew\344hltes Spiel laden" }, - { 129, "AdLib-Emulator" }, - { 130, "MIDI" }, - { 131, "MIDI-Lautst\344rke:" }, - { 132, "MT-32-Emulation" }, - { 134, "Hauptbildschirm-Skalierung:" }, - { 135, "Zuweisen" }, - { 136, "Durchsuchen..." }, - { 137, "Men\374" }, - { 138, "Verschiedenes" }, - { 139, "AdLib-/MIDI-Modus" }, - { 140, "DVD einbinden" }, - { 141, "SMB einbinden" }, - { 142, "Mausklick" }, - { 143, "Multi-Funktion" }, - { 144, "Musiklautst\344rke:" }, - { 145, "Alles aus" }, - { 146, "Name:" }, - { 147, "Netzwerk ist aus." }, - { 148, "Netzwerk nicht gestartet (%d)" }, - { 149, "Netzwerk gestartet" }, - { 150, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, - { 151, "Niemals" }, - { 152, "Nein" }, - { 153, "Kein Datum gespeichert" }, - { 154, "Keine Musik" }, - { 155, "Keine Spielzeit gespeichert" }, - { 156, "Keine Zeit gespeichert" }, - { 157, "Keine" }, - { 159, "OK" }, - { 160, "Ausgabefrequenz:" }, - { 161, "Globale MIDI-Einstellungen \374bergehen" }, - { 162, "Globale Audioeinstellungen \374bergehen" }, - { 163, "Globale Grafikeinstellungen \374bergehen" }, - { 164, "Globale Lautst\344rke-Einstellungen \374bergehen" }, - { 165, "PC-Lautsprecher" }, - { 166, "Passwort:" }, - { 167, "Ung\374ltiges Verzeichnis" }, - { 168, "Pfad ist keine Datei." }, - { 169, "Verzeichnis existiert nicht." }, - { 170, "Pfade" }, - { 171, "Pause" }, - { 172, "Spiel ausw\344hlen:" }, - { 173, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, - { 174, "Plattform:" }, - { 175, "Spieldauer: " }, - { 176, "Bitte eine Aktion ausw\344hlen" }, - { 177, "Plugin-Pfad:" }, - { 179, "Taste dr\374cken, um sie zuzuweisen" }, - { 180, "Beenden" }, - { 181, "ScummVM beenden" }, - { 182, "Lese-Berechtigung nicht vorhanden" }, - { 183, "Lesefehler aufgetreten" }, - { 184, "Tasten neu zuweisen" }, - { 185, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, - { 186, "Rendermodus:" }, - { 187, "Rechts" }, - { 188, "Rechtsklick" }, - { 189, "Rechtsklick" }, - { 190, "Drehen" }, - { 191, "Effektlautst\344rke:" }, - { 192, "SMB" }, - { 193, "Speichern" }, - { 194, "Spielst\344nde:" }, - { 195, "Speicherpfad: " }, - { 196, "Speichern:" }, - { 197, "Suchlauf abgeschlossen!" }, - { 198, "%d Ordner durchsucht..." }, - { 199, "ScummVM-Hauptmen\374" }, - { 200, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, - { 201, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, - { 202, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, - { 203, "In Spieleliste suchen" }, - { 204, "Suchen:" }, - { 205, "SoundFont ausw\344hlen" }, - { 206, "Thema ausw\344hlen" }, - { 207, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, - { 208, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, - { 209, "Verzeichnis f\374r Oberfl\344chen-Themen" }, - { 210, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, - { 211, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, - { 212, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 213, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 214, "Verzeichnis mit Spieldateien ausw\344hlen" }, - { 215, "Empfindlichkeit" }, - { 216, "Server:" }, - { 217, "\326ffentliches Verzeichnis:" }, - { 218, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, - { 219, "Tastatur zeigen" }, - { 220, "Mauszeiger anzeigen" }, - { 221, "Untertitel anzeigen und Sprachausgabe aktivieren" }, - { 222, "Cursor zeigen/verbergen" }, - { 223, "\334berspringen" }, - { 224, "Zeile \374berspringen" }, - { 225, "Text \374berspringen" }, - { 226, "An Ecken anheften" }, - { 227, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, - { 228, "Ton ein/aus" }, - { 229, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, - { 230, "SoundFont:" }, - { 231, "Spr." }, - { 232, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, - { 233, "Lautst\344rke spezieller Soundeffekte" }, + { 2, " (Aktiv)" }, + { 3, " (Spiel)" }, + { 4, " (Global)" }, + { 5, "C2(erstellt am" }, + { 6, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, + { 7, ", \366ffentliches Verzeichnis nicht eingebunden" }, + { 8, "... l\344uft..." }, + { 9, "11 kHz" }, + { 10, "22 kHz" }, + { 11, "44 kHz" }, + { 12, "48 kHz" }, + { 13, "8 kHz" }, + { 14, "" }, + { 15, "\334ber ScummVM" }, + { 16, "AdLib-Emulator" }, + { 17, "AdLib-Emulator" }, + { 18, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, + { 19, "Spiel hinzuf\374gen..." }, + { 20, "Kantengl\344ttung (16bpp)" }, + { 21, "Seitenverh\344ltnis korrigieren" }, + { 22, "Zugewiesene Taste : %s" }, + { 23, "Zugewiesene Taste : keine" }, + { 24, "Audio" }, + { 25, "Autom. Speichern:" }, + { 26, "C1Verf\374gbare Spiele-Engines:" }, + { 27, "\334be~r~" }, + { 28, "Tasten zuweisen" }, + { 29, "Beides" }, + { 30, "Helligkeit:" }, + { 31, "Abbrechen" }, + { 32, "Kann Datei nicht erstellen." }, + { 33, "Spieloptionen \344ndern" }, + { 34, "Globale ScummVM-Einstellungen bearbeiten" }, + { 35, "W\344hlen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-kompatiblen Soundkarte verbunden ist, verwenden m\366chten." }, + { 36, "Ausw\344hlen" }, + { 37, "Eine Aktion zum Zuweisen ausw\344hlen" }, + { 38, "Wert l\366schen" }, + { 39, "Schlie\337en" }, + { 40, "Seitenverh\344ltnis f\374r Spiele mit der Aufl\366sung 320x200 korrigieren" }, + { 41, "Kann keine Spiel-Engine finden, die dieses Spiel starten kann." }, + { 42, "Aktueller Videomodus:" }, + { 43, "Zeiger runter" }, + { 44, "Zeiger nach links" }, + { 45, "Zeiger nach rechts" }, + { 46, "Zeiger hoch" }, + { 48, "DVD" }, + { 49, "DVD erfolgreich eingebunden" }, + { 50, "DVD nicht eingebunden" }, + { 51, "Datum: " }, + { 52, "Debugger" }, + { 53, "" }, + { 54, "L\366schen" }, + { 55, "Stromsparmodus abschalten" }, + { 56, "GFX ausgeschalten" }, + { 57, "%d neue Spiele gefunden..." }, + { 58, "%d neue Spiele gefunden." }, + { 59, "Anzeige" }, + { 60, "Tastatur anzeigen" }, + { 61, "Diesen Spielstand wirklich l\366schen?" }, + { 62, "M\366chten Sie wirklich diese Spielkonfiguration entfernen?" }, + { 63, "M\366chten Sie wirklich den PC nach Spielen durchsuchen? M\366glicherweise wird dabei eine gr\366\337ere Menge an Spielen hinzugef\374gt." }, + { 64, "M\366chten Sie ein Spiel laden oder speichern?" }, + { 65, "M\366chten Sie eine automatische Durchsuchung vornehmen?" }, + { 66, "M\366chten Sie beenden?" }, + { 67, "Doppelzeilen (kein Zeilensprungverfahren)" }, + { 68, "Runter" }, + { 69, "Roland-GS-Modus" }, + { 70, "Engine unterst\374tzt den Debug-Level \"%s\" nicht" }, + { 71, "English" }, + { 72, "Fehler beim Ausf\374hren des Spiels:" }, + { 73, "Fehler beim Einbinden der DVD" }, + { 74, "Extrapfad:" }, + { 75, "FM Towns" }, + { 76, "Schneller Modus" }, + { 77, "C1Verwendete Funktionen:" }, + { 78, "Freie Ansicht" }, + { 79, "Voller Name des Spiels" }, + { 80, "Vollbildmodus" }, + { 81, "GC-Pad-Beschleunigung:" }, + { 82, "GC-Pad-Empfindlichkeit:" }, + { 83, "GFX" }, + { 85, "GUI-Sprache:" }, + { 86, "GUI-Renderer:" }, + { 87, "Spiel" }, + { 88, "Spieldaten nicht gefunden" }, + { 89, "Spielkennung nicht unterst\374tzt" }, + { 90, "Spielpfad:" }, + { 91, "Hauptmen\374" }, + { 92, "Zu h\366herer Pfadebene wechseln" }, + { 93, "Pfad hoch" }, + { 94, "Grafik" }, + { 95, "Grafikmodus:" }, + { 96, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, + { 99, "Werkzeugleiste verbergen" }, + { 100, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, + { 101, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, + { 102, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, + { 103, "Horizontale Bildverkleinerung:" }, + { 104, "FM Towns" }, + { 105, "Kennung:" }, + { 106, "Netzwerk starten" }, + { 107, "Verg\366\337erung des oberen Bildschirms:" }, + { 108, "Netzwerk wird gestartet..." }, + { 109, "Netzwerk wird gestartet..." }, + { 110, "Eingabe" }, + { 111, "Ung\374ltiges Verzeichnis" }, + { 112, "Tasten zuordnen" }, + { 113, "Tastatur" }, + { 114, "Tasten-Layout:" }, + { 115, "Tasten" }, + { 116, "Sprache der ScummVM-Oberfl\344che" }, + { 117, "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des Spiels in eine deutsche verwandeln." }, + { 118, "Sprache:" }, + { 119, "Links" }, + { 120, "Linksklick" }, + { 121, "Laden" }, + { 122, "Spiel laden:" }, + { 123, "Spielstand f\374r ausgew\344hltes Spiel laden" }, + { 124, "AdLib-Emulator" }, + { 125, "MIDI" }, + { 126, "MIDI-Lautst\344rke:" }, + { 127, "MT-32-Emulation" }, + { 129, "Hauptbildschirm-Skalierung:" }, + { 130, "Zuweisen" }, + { 131, "Durchsuchen..." }, + { 132, "Men\374" }, + { 133, "Verschiedenes" }, + { 134, "AdLib-/MIDI-Modus" }, + { 135, "DVD einbinden" }, + { 136, "SMB einbinden" }, + { 137, "Mausklick" }, + { 138, "Multi-Funktion" }, + { 139, "Musiklautst\344rke:" }, + { 140, "Alles aus" }, + { 141, "Name:" }, + { 142, "Netzwerk ist aus." }, + { 143, "Netzwerk nicht gestartet (%d)" }, + { 144, "Netzwerk gestartet" }, + { 145, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, + { 146, "Niemals" }, + { 147, "Nein" }, + { 148, "Kein Datum gespeichert" }, + { 149, "Keine Musik" }, + { 150, "Keine Spielzeit gespeichert" }, + { 151, "Keine Zeit gespeichert" }, + { 152, "Keine" }, + { 154, "OK" }, + { 155, "Ausgabefrequenz:" }, + { 156, "Globale MIDI-Einstellungen \374bergehen" }, + { 157, "Globale Audioeinstellungen \374bergehen" }, + { 158, "Globale Grafikeinstellungen \374bergehen" }, + { 159, "Globale Lautst\344rke-Einstellungen \374bergehen" }, + { 160, "PC-Lautsprecher" }, + { 161, "Passwort:" }, + { 162, "Ung\374ltiges Verzeichnis" }, + { 163, "Pfad ist keine Datei." }, + { 164, "Verzeichnis existiert nicht." }, + { 165, "Pfade" }, + { 166, "Pause" }, + { 167, "Spiel ausw\344hlen:" }, + { 168, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, + { 169, "Plattform:" }, + { 170, "Spieldauer: " }, + { 171, "Bitte eine Aktion ausw\344hlen" }, + { 172, "Plugin-Pfad:" }, + { 174, "Taste dr\374cken, um sie zuzuweisen" }, + { 175, "Beenden" }, + { 176, "ScummVM beenden" }, + { 177, "Lese-Berechtigung nicht vorhanden" }, + { 178, "Lesefehler aufgetreten" }, + { 179, "Tasten neu zuweisen" }, + { 180, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, + { 181, "Rendermodus:" }, + { 182, "Rechts" }, + { 183, "Rechtsklick" }, + { 184, "Rechtsklick" }, + { 185, "Drehen" }, + { 186, "Effektlautst\344rke:" }, + { 187, "SMB" }, + { 188, "Speichern" }, + { 189, "Spielst\344nde:" }, + { 190, "Speicherpfad: " }, + { 191, "Speichern:" }, + { 192, "Suchlauf abgeschlossen!" }, + { 193, "%d Ordner durchsucht..." }, + { 194, "ScummVM-Hauptmen\374" }, + { 195, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, + { 196, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, + { 197, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, + { 198, "In Spieleliste suchen" }, + { 199, "Suchen:" }, + { 200, "SoundFont ausw\344hlen" }, + { 201, "Thema ausw\344hlen" }, + { 202, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, + { 203, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, + { 204, "Verzeichnis f\374r Oberfl\344chen-Themen" }, + { 205, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, + { 206, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, + { 207, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 208, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 209, "Verzeichnis mit Spieldateien ausw\344hlen" }, + { 210, "Empfindlichkeit" }, + { 211, "Server:" }, + { 212, "\326ffentliches Verzeichnis:" }, + { 213, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, + { 214, "Tastatur zeigen" }, + { 215, "Mauszeiger anzeigen" }, + { 216, "Untertitel anzeigen und Sprachausgabe aktivieren" }, + { 217, "Cursor zeigen/verbergen" }, + { 218, "\334berspringen" }, + { 219, "Zeile \374berspringen" }, + { 220, "Text \374berspringen" }, + { 221, "An Ecken anheften" }, + { 222, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, + { 223, "Ton ein/aus" }, + { 224, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, + { 225, "SoundFont:" }, + { 226, "Spr." }, + { 227, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, + { 228, "Lautst\344rke spezieller Soundeffekte" }, + { 229, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 231, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 232, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, + { 233, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, { 234, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 236, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 237, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, - { 238, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, - { 239, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 240, "Legt fest, wo die Spielst\344nde abgelegt werden." }, - { 241, "Sprache" }, - { 242, "Sprachlautst\344rke:" }, - { 243, "Standard-Renderer (16bpp)" }, - { 244, "Ausgew\344hltes Spiel starten" }, - { 245, "Status:" }, - { 246, "Untert." }, - { 247, "Untertitel-Tempo:" }, - { 248, "Untertitel" }, - { 249, "Figur wechseln" }, - { 250, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, - { 251, "Text und Sprache:" }, - { 252, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, - { 253, "Themenpfad:" }, - { 254, "Thema:" }, - { 255, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, - { 256, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, - { 257, "Zeit: " }, - { 258, "Zeit\374berschreitung beim Starten des Netzwerks" }, - { 259, "Gehe zu X-Position" }, - { 260, "Gehe zu Y-Position" }, - { 261, "Touchpad-Modus ausgeschaltet." }, - { 262, "Touchpad-Modus aktiviert." }, - { 263, "Echte Roland-MT-32-Emulation" }, - { 264, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, - { 265, "Unbekannt" }, - { 266, "Unbekannter Fehler" }, - { 267, "DVD aush\344ngen" }, - { 268, "SMB aush\344ngen" }, - { 269, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, - { 270, "Farbmodus nicht unterst\374tzt" }, - { 271, "Unbenannt" }, - { 272, "Hoch" }, - { 273, "Benutzt MIDI und AdLib zur Sounderzeugung." }, - { 274, "Benutze den Trackpad-Style f\374r Maussteuerung" }, - { 275, "Gew\344hltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" }, - { 276, "Benutzername:" }, - { 277, "SDL-Treiber verwenden" }, - { 278, "Vertikale Bildverkleinerung:" }, - { 279, "Video" }, - { 280, "Virtuelle Tastatur" }, - { 281, "Lautst\344rke" }, - { 282, "Windows MIDI" }, - { 283, "Schreib-Berechtigung nicht vorhanden" }, - { 284, "Daten konnten nicht geschrieben werden." }, - { 285, "Ja" }, - { 286, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, - { 287, "Zone" }, - { 288, "Hineinzoomen" }, - { 289, "Herauszoomen" }, - { 290, "alle 10 Minuten" }, - { 291, "alle 15 Minuten" }, - { 292, "alle 30 Minuten" }, - { 293, "alle 5 Minuten" }, - { 294, "fehlgeschlagen\n" }, - { 295, "\334be~r~" }, - { 296, "Spiel ~h~inzuf\374gen..." }, - { 297, "~A~bbrechen" }, - { 298, "~S~chlie\337en" }, - { 299, "Spielo~p~tionen..." }, - { 300, "~H~ilfe" }, - { 301, "~K~ampfsteuerung f\374r Indiana Jones" }, - { 302, "~T~asten" }, - { 303, "~L~inke-Hand-Modus" }, - { 304, "~L~aden" }, - { 305, "~L~aden..." }, - { 306, "~W~eiter" }, - { 307, "~O~K" }, - { 308, "~O~ptionen" }, - { 309, "~O~ptionen" }, - { 310, "~Z~ur\374ck" }, - { 311, "~B~eenden" }, - { 312, "Spiel ~e~ntfernen" }, - { 313, "~F~ortsetzen" }, - { 314, "Zur Spiele~l~iste zur\374ckkehren" }, - { 315, "~S~peichern" }, - { 316, "~S~tarten" }, - { 317, "\334ber~g~\344nge aktiviert" }, - { 318, "~W~assereffekte aktiviert" }, - { 319, "~Z~ip-Modus aktiviert" }, + { 235, "Legt fest, wo die Spielst\344nde abgelegt werden." }, + { 236, "Sprache" }, + { 237, "Sprachlautst\344rke:" }, + { 238, "Standard-Renderer (16bpp)" }, + { 239, "Ausgew\344hltes Spiel starten" }, + { 240, "Status:" }, + { 241, "Untert." }, + { 242, "Untertitel-Tempo:" }, + { 243, "Untertitel" }, + { 244, "Figur wechseln" }, + { 245, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, + { 246, "Text und Sprache:" }, + { 247, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, + { 248, "Themenpfad:" }, + { 249, "Thema:" }, + { 250, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, + { 251, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, + { 252, "Zeit: " }, + { 253, "Zeit\374berschreitung beim Starten des Netzwerks" }, + { 254, "Gehe zu X-Position" }, + { 255, "Gehe zu Y-Position" }, + { 256, "Touchpad-Modus ausgeschaltet." }, + { 257, "Touchpad-Modus aktiviert." }, + { 258, "Echte Roland-MT-32-Emulation" }, + { 259, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, + { 260, "Unbekannt" }, + { 261, "Unbekannter Fehler" }, + { 262, "DVD aush\344ngen" }, + { 263, "SMB aush\344ngen" }, + { 264, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, + { 265, "Farbmodus nicht unterst\374tzt" }, + { 266, "Unbenannt" }, + { 267, "Hoch" }, + { 268, "Benutzt MIDI und AdLib zur Sounderzeugung." }, + { 269, "Benutze den Trackpad-Style f\374r Maussteuerung" }, + { 270, "Benutzername:" }, + { 271, "SDL-Treiber verwenden" }, + { 272, "Vertikale Bildverkleinerung:" }, + { 273, "Video" }, + { 274, "Virtuelle Tastatur" }, + { 275, "Lautst\344rke" }, + { 276, "Windows MIDI" }, + { 277, "Schreib-Berechtigung nicht vorhanden" }, + { 278, "Daten konnten nicht geschrieben werden." }, + { 279, "Ja" }, + { 280, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, + { 281, "Zone" }, + { 282, "Hineinzoomen" }, + { 283, "Herauszoomen" }, + { 284, "alle 10 Minuten" }, + { 285, "alle 15 Minuten" }, + { 286, "alle 30 Minuten" }, + { 287, "alle 5 Minuten" }, + { 288, "\334be~r~" }, + { 289, "Spiel ~h~inzuf\374gen..." }, + { 290, "~A~bbrechen" }, + { 291, "~S~chlie\337en" }, + { 292, "Spielo~p~tionen..." }, + { 293, "~H~ilfe" }, + { 294, "~K~ampfsteuerung f\374r Indiana Jones" }, + { 295, "~T~asten" }, + { 296, "~L~inke-Hand-Modus" }, + { 297, "~L~aden" }, + { 298, "~L~aden..." }, + { 299, "~W~eiter" }, + { 300, "~O~K" }, + { 301, "~O~ptionen" }, + { 302, "~O~ptionen" }, + { 303, "~Z~ur\374ck" }, + { 304, "~B~eenden" }, + { 305, "Spiel ~e~ntfernen" }, + { 306, "~F~ortsetzen" }, + { 307, "Zur Spiele~l~iste zur\374ckkehren" }, + { 308, "~S~peichern" }, + { 309, "~S~tarten" }, + { 310, "\334ber~g~\344nge aktiviert" }, + { 311, "~W~assereffekte aktiviert" }, + { 312, "~Z~ip-Modus aktiviert" }, { -1, NULL } }; diff --git a/common/translation.cpp b/common/translation.cpp index bb86b3b7ac..6ef4be8e3a 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -30,10 +30,6 @@ DECLARE_SINGLETON(Common::TranslationManager) #include #endif -#ifdef USE_TERMCONV -#include -#endif - #ifdef USE_TRANSLATION #include "messages.cpp" #endif @@ -45,7 +41,6 @@ namespace Common { // Translation enabled - TranslationManager::TranslationManager() { #ifdef USE_DETECTLANG // Activating current locale settings @@ -78,20 +73,11 @@ TranslationManager::TranslationManager() { _syslang = "C"; #endif // USE_DETECTLANG -#ifdef USE_TERMCONV - _convmsg = NULL; - _conversion = NULL; -#endif // USE_TERMCONV - // Set the default language setLanguage(""); } TranslationManager::~TranslationManager() { -#ifdef USE_TERMCONV - iconv_close(_conversion); - delete[] _convmsg; -#endif // USE_TERMCONV } void TranslationManager::setLanguage(const char *lang) { @@ -99,21 +85,6 @@ void TranslationManager::setLanguage(const char *lang) { po2c_setlang(_syslang.c_str()); else po2c_setlang(lang); - -#ifdef USE_TERMCONV - // Get the locale character set (for terminal output) - const char *charset_term = nl_langinfo(CODESET); - - // Get the messages character set - const char *charset_po = po2c_getcharset(); - - // Delete previous conversion - if (_conversion) - iconv_close(_conversion); - - // Initialize the conversion - _conversion = iconv_open(charset_term, charset_po); -#endif // USE_TERMCONV } const char *TranslationManager::getTranslation(const char *message) { @@ -124,63 +95,6 @@ String TranslationManager::getTranslation(const String &message) { return po2c_gettext(message.c_str()); } -#ifdef USE_TERMCONV -bool TranslationManager::convert(const char *message) { - // Preparing conversion origin - size_t len = strlen(message) + 1; -#ifdef ICONV_USES_CONST - const char **pmsg = &message; -#else - char *msgcpy = new char[len]; - strcpy(msgcpy, message); - char *msg = msgcpy; - char **pmsg = &msg; -#endif - - // Preparing conversion destination - size_t len2 = _sizeconv; - char *conv = _convmsg; - - // Clean previous conversions - iconv(_conversion, NULL, NULL, &conv, &len2); - - // Do the real conversion - size_t result = iconv(_conversion, pmsg, &len, &conv, &len2); - -#ifndef ICONV_USES_CONST - delete[] msgcpy; -#endif - - return result != ((size_t)-1); -} -#endif // USE_TERMCONV - -const char *TranslationManager::convertTerm(const char *message) { -#ifdef USE_TERMCONV - size_t len = strlen(message) + 1; - if (!_convmsg) { - _sizeconv = len * 2; - _convmsg = new char[_sizeconv]; - } - - if (!convert(message)) { - // Resizing the buffer - delete[] _convmsg; - _sizeconv = len * 2; - _convmsg = new char[_sizeconv]; - - if (!convert(message)) { - printf("Error while converting character sets\n"); - return "Error while converting character sets"; - } - } - - return _convmsg; -#else // USE_TERMCONV - return message; -#endif // USE_TERMCONV -} - const TLangArray TranslationManager::getSupportedLanguages() const { TLangArray languages; @@ -251,10 +165,6 @@ String TranslationManager::getTranslation(const String &message) { return message; } -const char *TranslationManager::convertTerm(const char *message) { - return message; -} - const TLangArray TranslationManager::getSupportedLanguages() const { return TLangArray(); } diff --git a/common/translation.h b/common/translation.h index c264eadfd9..0722ae44ae 100644 --- a/common/translation.h +++ b/common/translation.h @@ -28,10 +28,6 @@ #include "common/singleton.h" #include "common/str-array.h" -#ifdef USE_TERMCONV -#include -#endif - namespace Common { enum TranslationIDs { @@ -60,17 +56,6 @@ typedef Array TLangArray; * Message translation manager. */ class TranslationManager : public Singleton { -private: - Common::String _syslang; - -#ifdef USE_TERMCONV - iconv_t _conversion; - char *_convmsg; - int _sizeconv; - - bool convert(const char *message); -#endif // USE_TERMCONV - public: /** * The constructor detects the system language and sets default @@ -129,30 +114,25 @@ public: */ String getTranslation(const String &message); - /** - * Converts the message into the terminal character set (which may be - * different than the GUI's "native" one). - */ - const char *convertTerm(const char *message); - /** * Returns a list of supported languages. * * @return The list of supported languages. */ const TLangArray getSupportedLanguages() const; + +private: + Common::String _syslang; }; -} // End of namespace Common +} // End of namespace Common #define TransMan Common::TranslationManager::instance() #ifdef USE_TRANSLATION #define _(str) TransMan.getTranslation(str) -#define _t(str) TransMan.convertTerm(_(str)) #else #define _(str) str -#define _t(str) str #endif #define _s(str) str diff --git a/configure b/configure index d8d7ef8591..a8432fc8b8 100755 --- a/configure +++ b/configure @@ -2342,36 +2342,7 @@ EOF add_to_config_h_if_yes $_detectlang '#define USE_DETECTLANG' if test "$_detectlang" = yes ; then - echo_n "with runtime language detection, " - - cat > $TMPC << EOF -#include -#include -int main(void) { nl_langinfo(CODESET); iconv_open(0, 0); return 0; } -EOF - _termconv=no - cc_check_no_clean $LDFLAGS $CXXFLAGS && _termconv=yes - cc_check $LDFLAGS $CXXFLAGS -liconv && LIBS="$LIBS -liconv" && _termconv=yes - - add_to_config_mk_if_yes $_termconv 'USE_TERMCONV = 1' - add_to_config_h_if_yes $_termconv '#define USE_TERMCONV' - if test "$_termconv" = yes ; then - uses_const=no - cat > $TMPC << EOF -#include -int main(int argc, char **argv) { - iconv_t iconvP; - const char **inbuf = 0; - iconv(iconvP, inbuf, 0, 0, 0); - return 0; -} -EOF - cc_check $LDFLAGS $LIBS $CXXFLAGS && uses_const=yes - add_to_config_h_if_yes $uses_const '#define ICONV_USES_CONST' - echo "with terminal conversion)" - else - echo "without terminal conversion)" - fi + echo_n "with runtime language detection)" else echo "without runtime language detection)" fi diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index fbcacf2d16..ff747c6e92 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -73,7 +73,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), // Loading the theme failed, try to load the built-in theme if (!loadNewTheme("builtin", gfxMode)) { // Loading the built-in theme failed as well. Bail out - error("%s", _t("Failed to load any GUI theme, aborting")); + error("Failed to load any GUI theme, aborting"); } } diff --git a/po/ca_ES.po b/po/ca_ES.po index edaf59cb46..4ebc1192d1 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" +"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Catalan\n" #: gui/about.cpp:96 #, c-format @@ -48,10 +48,6 @@ msgstr "Cancel msgid "Choose" msgstr "Escull" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "No s'ha pogut carregar cap tema de la interfície d'usuari, avortant" - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Tanca" @@ -757,38 +753,6 @@ msgstr "Pintat est msgid "Antialiased Renderer (16bpp)" msgstr "Pintat amb antialias (16bpp)" -#: base/main.cpp:106 -#, fuzzy, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "" -"L'usuari ha seleccionat el target '%s' (identificador de joc '%s')...\n" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr " Cercant un connector que suporti aquest identificador de joc... " - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "ha fallat\n" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" -"%s és un identificador de joc invàlid. Utilitzeu l'opció --list-games per " -"llistar els identificadors de joc suportats" - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr " Iniciant '%s'\n" - -#: base/main.cpp:148 -#, fuzzy, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "%s ha fallat l'iniciat del motor: %s (target '%s', camí '%s')" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" @@ -1394,6 +1358,34 @@ msgstr "Pantalla" msgid "Do you want to perform an automatic scan ?" msgstr "Voleu fer una cerca automàtica?" +#~ msgid "Failed to load any GUI theme, aborting" +#~ msgstr "No s'ha pogut carregar cap tema de la interfície d'usuari, avortant" + +#, fuzzy +#~ msgid "User picked target '%s' (gameid '%s')...\n" +#~ msgstr "" +#~ "L'usuari ha seleccionat el target '%s' (identificador de joc '%s')...\n" + +#~ msgid " Looking for a plugin supporting this gameid... " +#~ msgstr " Cercant un connector que suporti aquest identificador de joc... " + +#~ msgid "failed\n" +#~ msgstr "ha fallat\n" + +#~ msgid "" +#~ "%s is an invalid gameid. Use the --list-games option to list supported " +#~ "gameid" +#~ msgstr "" +#~ "%s és un identificador de joc invàlid. Utilitzeu l'opció --list-games per " +#~ "llistar els identificadors de joc suportats" + +#~ msgid " Starting '%s'\n" +#~ msgstr " Iniciant '%s'\n" + +#, fuzzy +#~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +#~ msgstr "%s ha fallat l'iniciat del motor: %s (target '%s', camí '%s')" + #~ msgid "Chinese (Taiwan)" #~ msgstr "Xinès (Taiwan)" diff --git a/po/de_DE.po b/po/de_DE.po index ef0a7b9baa..191b3fb068 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2010-06-23 19:30+0100\n" "Last-Translator: \n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" +"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 @@ -52,10 +52,6 @@ msgstr "Abbrechen" msgid "Choose" msgstr "Auswählen" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "Fehler: Konnte kein Benutzeroberflächen-Thema laden. Abbruch..." - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Schließen" @@ -761,37 +757,6 @@ msgstr "Standard-Renderer (16bpp)" msgid "Antialiased Renderer (16bpp)" msgstr "Kantenglättung (16bpp)" -#: base/main.cpp:106 -#, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "Gewähltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr " Suche nach einer Erweiterung, die diese Spielkennung unterstützt..." - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "fehlgeschlagen\n" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" -"%s ist eine ungültige Spielkennung. Benutzen Sie die Option --list-games zum " -"Anzeigen der unterstützten Spielkennungen." - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr " Starte \"%s\"\n" - -#: base/main.cpp:148 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" @@ -1404,6 +1369,32 @@ msgstr "Anzeige" msgid "Do you want to perform an automatic scan ?" msgstr "Möchten Sie eine automatische Durchsuchung vornehmen?" +#~ msgid "Failed to load any GUI theme, aborting" +#~ msgstr "Fehler: Konnte kein Benutzeroberflächen-Thema laden. Abbruch..." + +#~ msgid "User picked target '%s' (gameid '%s')...\n" +#~ msgstr "Gewähltes Ziel: \"%s\" (Spielkennung \"%s\")...\n" + +#~ msgid " Looking for a plugin supporting this gameid... " +#~ msgstr "" +#~ " Suche nach einer Erweiterung, die diese Spielkennung unterstützt..." + +#~ msgid "failed\n" +#~ msgstr "fehlgeschlagen\n" + +#~ msgid "" +#~ "%s is an invalid gameid. Use the --list-games option to list supported " +#~ "gameid" +#~ msgstr "" +#~ "%s ist eine ungültige Spielkennung. Benutzen Sie die Option --list-games " +#~ "zum Anzeigen der unterstützten Spielkennungen." + +#~ msgid " Starting '%s'\n" +#~ msgstr " Starte \"%s\"\n" + +#~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +#~ msgstr "%s konnte Engine nicht starten: %s (Ziel \"%s\", Pfad \"%s\")" + #~ msgid "Ok" #~ msgstr "OK" diff --git a/po/fr_FR.po b/po/fr_FR.po index 70a22bb0f3..fc103ed756 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2010-06-19 23:43+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" +"Language: Francais\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:96 @@ -51,10 +51,6 @@ msgstr "Annuler" msgid "Choose" msgstr "Choisir" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "Aucun thème GUI n'a pu être chargé; abandon" - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Fermer" @@ -758,39 +754,6 @@ msgstr "Standard (16bpp)" msgid "Antialiased Renderer (16bpp)" msgstr "Anti-crénelé (16 bpp)" -#: base/main.cpp:106 -#, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr "Recherche d'un plugin supportant cet ID..." - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "Echec\n" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" -"%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour " -"obtenir la liste des ID reconnus" - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr "Démarrage de '%s'\n" - -#: base/main.cpp:148 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "" -"Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%s', " -"chemin '%s')" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" @@ -1417,6 +1380,33 @@ msgstr "Affichage" msgid "Do you want to perform an automatic scan ?" msgstr "Voulez-vous exécuter une recherche automatique?" +#~ msgid "Failed to load any GUI theme, aborting" +#~ msgstr "Aucun thème GUI n'a pu être chargé; abandon" + +#~ msgid "User picked target '%s' (gameid '%s')...\n" +#~ msgstr "L'utilisateur a choisi la cible '%s' (ID '%s')...\n" + +#~ msgid " Looking for a plugin supporting this gameid... " +#~ msgstr "Recherche d'un plugin supportant cet ID..." + +#~ msgid "failed\n" +#~ msgstr "Echec\n" + +#~ msgid "" +#~ "%s is an invalid gameid. Use the --list-games option to list supported " +#~ "gameid" +#~ msgstr "" +#~ "%s n'est pas un ID de jeu valide. Utilisez l'option --list-games pour " +#~ "obtenir la liste des ID reconnus" + +#~ msgid " Starting '%s'\n" +#~ msgstr "Démarrage de '%s'\n" + +#~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +#~ msgstr "" +#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible " +#~ "'%s', chemin '%s')" + #~ msgid "Ok" #~ msgstr "Ok" diff --git a/po/hu_HU.po b/po/hu_HU.po index 62e18f3ae0..cefe1aeb90 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gui/about.cpp:96 @@ -49,10 +49,6 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "" - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" @@ -742,35 +738,6 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: base/main.cpp:106 -#, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr "" - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr "" - -#: base/main.cpp:148 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" diff --git a/po/module.mk b/po/module.mk index 7ed9499593..eb9a85e4e3 100644 --- a/po/module.mk +++ b/po/module.mk @@ -2,7 +2,7 @@ POTFILE := $(srcdir)/po/scummvm.pot POFILES := $(wildcard $(srcdir)/po/*.po) updatepot: - xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_t -k_s -o $(POTFILE) \ + xgettext -f $(srcdir)/po/POTFILES -D $(srcdir) -d scummvm --c++ -k_ -k_s -o $(POTFILE) \ "--copyright-holder=ScummVM Team" --package-name=ScummVM \ --package-version=$(VERSION) --msgid-bugs-address=scummvm-devel@lists.sf.net -o $(POTFILE)_ diff --git a/po/ru_RU.po b/po/ru_RU.po index 31284b45df..7e21e4f4a2 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,16 +7,16 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1251\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" -"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:96 #, fuzzy, c-format @@ -52,10 +52,6 @@ msgstr " msgid "Choose" msgstr "Âûáðàòü" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Çàêðûòü" @@ -755,37 +751,6 @@ msgstr " msgid "Antialiased Renderer (16bpp)" msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" -#: base/main.cpp:106 -#, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "Ïîëüçîâàòåëü âûáðàë öåëü'%s' (gameid '%s')...\n" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr " Èùó ïëàãèí ñ ïîääåðæêîé ýòîãî gameid... " - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "íå óäàëîñü\n" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" -"Íåâåðíûé gameid %s. Èñïîëüçóéòå îïöèþ --list-games äëÿ ïðîñìîòðà ñïèñêà " -"ïîääåðæèâàåìûõ gameid" - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr " Çàïóñêàþ '%s'\n" - -#: base/main.cpp:148 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "%s íå ñìîã çàïóñòèòü äâèæîê: %s (öåëü '%s', ïóòü '%s')" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" @@ -1398,6 +1363,31 @@ msgstr " msgid "Do you want to perform an automatic scan ?" msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" +#~ msgid "Failed to load any GUI theme, aborting" +#~ msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" + +#~ msgid "User picked target '%s' (gameid '%s')...\n" +#~ msgstr "Ïîëüçîâàòåëü âûáðàë öåëü'%s' (gameid '%s')...\n" + +#~ msgid " Looking for a plugin supporting this gameid... " +#~ msgstr " Èùó ïëàãèí ñ ïîääåðæêîé ýòîãî gameid... " + +#~ msgid "failed\n" +#~ msgstr "íå óäàëîñü\n" + +#~ msgid "" +#~ "%s is an invalid gameid. Use the --list-games option to list supported " +#~ "gameid" +#~ msgstr "" +#~ "Íåâåðíûé gameid %s. Èñïîëüçóéòå îïöèþ --list-games äëÿ ïðîñìîòðà ñïèñêà " +#~ "ïîääåðæèâàåìûõ gameid" + +#~ msgid " Starting '%s'\n" +#~ msgstr " Çàïóñêàþ '%s'\n" + +#~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +#~ msgstr "%s íå ñìîã çàïóñòèòü äâèæîê: %s (öåëü '%s', ïóòü '%s')" + #~ msgid "Ok" #~ msgstr "Ok" diff --git a/po/scummvm.pot b/po/scummvm.pot index b8f164e1ba..cef3caf6cd 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 18:15+0200\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,10 +49,6 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:76 -msgid "Failed to load any GUI theme, aborting" -msgstr "" - #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" @@ -734,35 +731,6 @@ msgstr "" msgid "Antialiased Renderer (16bpp)" msgstr "" -#: base/main.cpp:106 -#, c-format -msgid "User picked target '%s' (gameid '%s')...\n" -msgstr "" - -#: base/main.cpp:107 -msgid " Looking for a plugin supporting this gameid... " -msgstr "" - -#: base/main.cpp:111 -msgid "failed\n" -msgstr "" - -#: base/main.cpp:112 -#, c-format -msgid "" -"%s is an invalid gameid. Use the --list-games option to list supported gameid" -msgstr "" - -#: base/main.cpp:119 -#, c-format -msgid " Starting '%s'\n" -msgstr "" - -#: base/main.cpp:148 -#, c-format -msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -msgstr "" - #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" -- cgit v1.2.3 From c2cb3bb79917c8a2993a3895deadae590107a1ec Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 26 Jun 2010 18:27:18 +0000 Subject: Add the page turning sound for the Riven journals and stub off the swipe transition used when turning pages. svn-id: r50336 --- engines/mohawk/graphics.cpp | 19 ++++++---------- engines/mohawk/riven_external.cpp | 46 ++++++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index 00de6dba11..1974aec9c2 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -466,27 +466,22 @@ void RivenGraphics::runScheduledTransition() { // transitions were found by hacking scripts. switch (_scheduledTransition) { + case 0: // Swipe Left + case 1: // Swipe Right + case 2: // Swipe Up + case 3: // Swipe Down case 12: // Pan Left - warning ("STUB: Pan left"); - break; case 13: // Pan Right - warning ("STUB: Pan right"); - break; case 14: // Pan Up - warning ("STUB: Pan up"); - break; case 15: // Pan Down - warning ("STUB: Pan down"); - break; case 16: // Dissolve case 17: // Dissolve (tspit CARD 155) - warning ("STUB: Dissolve"); break; default: - if (_scheduledTransition < 12) - error ("Found unused transition %d", _scheduledTransition); + if (_scheduledTransition >= 4 && _scheduledTransition <= 11) + error("Found unused transition %d", _scheduledTransition); else - error ("Found unknown transition %d", _scheduledTransition); + error("Found unknown transition %d", _scheduledTransition); } // For now, just copy the image to screen without doing any transition. diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 5b5163dbb3..24466305fe 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -284,9 +284,14 @@ void RivenExternal::xaatrusbookprevpage(uint16 argc, uint16 *argv) { return; (*page)--; - // TODO: Play the page turning sound + // Play the page turning sound + if (_vm->getFeatures() & GF_DEMO) + _vm->_sound->playSound(4, false); + else + _vm->_sound->playSound(3, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(1); _vm->_gfx->updateScreen(); } @@ -299,9 +304,14 @@ void RivenExternal::xaatrusbooknextpage(uint16 argc, uint16 *argv) { return; (*page)++; - // TODO: Play the page turning sound + // Play the page turning sound + if (_vm->getFeatures() & GF_DEMO) + _vm->_sound->playSound(5, false); + else + _vm->_sound->playSound(4, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(0); _vm->_gfx->updateScreen(); } @@ -349,9 +359,11 @@ void RivenExternal::xacathbookprevpage(uint16 argc, uint16 *argv) { return; (*page)--; - // TODO: Play the page turning sound + // Play the page turning sound + _vm->_sound->playSound(5, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(3); _vm->_gfx->updateScreen(); } @@ -364,9 +376,11 @@ void RivenExternal::xacathbooknextpage(uint16 argc, uint16 *argv) { return; (*page)++; - // TODO: Play the page turning sound + // Play the page turning sound + _vm->_sound->playSound(6, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(2); _vm->_gfx->updateScreen(); } @@ -380,12 +394,20 @@ void RivenExternal::xtrapbookback(uint16 argc, uint16 *argv) { void RivenExternal::xatrapbookclose(uint16 argc, uint16 *argv) { // Close the trap book *_vm->matchVarToString("atrap") = 0; + + // Play the page turning sound + _vm->_sound->playSound(8, false); + _vm->refreshCard(); } void RivenExternal::xatrapbookopen(uint16 argc, uint16 *argv) { // Open the trap book *_vm->matchVarToString("atrap") = 1; + + // Play the page turning sound + _vm->_sound->playSound(9, false); + _vm->refreshCard(); } @@ -437,7 +459,11 @@ void RivenExternal::xblabbookprevpage(uint16 argc, uint16 *argv) { return; (*page)--; + // Play the page turning sound + _vm->_sound->playSound(22, false); + // Now update the screen :) + _vm->_gfx->scheduleTransition(1); _vm->_gfx->updateScreen(); } @@ -450,7 +476,11 @@ void RivenExternal::xblabbooknextpage(uint16 argc, uint16 *argv) { return; (*page)++; + // Play the page turning sound + _vm->_sound->playSound(23, false); + // Now update the screen :) + _vm->_gfx->scheduleTransition(0); _vm->_gfx->updateScreen(); } @@ -1270,9 +1300,11 @@ void RivenExternal::xogehnbookprevpage(uint16 argc, uint16 *argv) { return; (*page)--; - // TODO: Play the page turning sound + // Play the page turning sound + _vm->_sound->playSound(12, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(1); _vm->_gfx->updateScreen(); } @@ -1285,9 +1317,11 @@ void RivenExternal::xogehnbooknextpage(uint16 argc, uint16 *argv) { return; (*page)++; - // TODO: Play the page turning sound + // Play the page turning sound + _vm->_sound->playSound(13, false); // Now update the screen :) + _vm->_gfx->scheduleTransition(0); _vm->_gfx->updateScreen(); } -- cgit v1.2.3 From 2b9f4e5068081b3b172ac859648555f1f9bdecdb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 26 Jun 2010 18:44:32 +0000 Subject: Gehn's cage should be closed initially, so initialize ocage to 1. svn-id: r50337 --- engines/mohawk/riven_vars.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp index 163626203a..b6d2dff315 100644 --- a/engines/mohawk/riven_vars.cpp +++ b/engines/mohawk/riven_vars.cpp @@ -320,6 +320,7 @@ void MohawkEngine_Riven::initVars() { *matchVarToString("waterenabled") = 1; *matchVarToString("ogehnpage") = 1; *matchVarToString("bblrsw") = 1; + *matchVarToString("ocage") = 1; // Randomize the telescope combination uint32 *teleCombo = matchVarToString("tcorrectorder"); -- cgit v1.2.3 From e5e90eb8a8078d108d9985e6303b3975f1b6da55 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 26 Jun 2010 19:09:45 +0000 Subject: Add a debug console command to Riven for displaying combinations to puzzles. svn-id: r50338 --- engines/mohawk/console.cpp | 29 +++++++++++++++++++++++++++++ engines/mohawk/console.h | 1 + engines/mohawk/riven_external.cpp | 2 +- engines/mohawk/riven_external.h | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index 149b6b6eba..abdcf42dc0 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -28,6 +28,7 @@ #include "mohawk/myst_scripts.h" #include "mohawk/graphics.h" #include "mohawk/riven.h" +#include "mohawk/riven_external.h" #include "mohawk/livingbooks.h" #include "mohawk/sound.h" #include "mohawk/video.h" @@ -307,6 +308,7 @@ RivenConsole::RivenConsole(MohawkEngine_Riven *vm) : GUI::Debugger(), _vm(vm) { DCmd_Register("dumpScript", WRAP_METHOD(RivenConsole, Cmd_DumpScript)); DCmd_Register("listZipCards", WRAP_METHOD(RivenConsole, Cmd_ListZipCards)); DCmd_Register("getRMAP", WRAP_METHOD(RivenConsole, Cmd_GetRMAP)); + DCmd_Register("combos", WRAP_METHOD(RivenConsole, Cmd_Combos)); } RivenConsole::~RivenConsole() { @@ -608,6 +610,33 @@ bool RivenConsole::Cmd_GetRMAP(int argc, const char **argv) { return true; } +bool RivenConsole::Cmd_Combos(int argc, const char **argv) { + // In the vain of SCUMM's 'drafts' command, this command will list + // out all combinations needed in Riven, decoded from the variables. + // You'll need to look up the Rebel Tunnel puzzle on your own; the + // solution is constant. + + uint32 teleCombo = *_vm->matchVarToString("tcorrectorder"); + uint32 prisonCombo = *_vm->matchVarToString("pcorrectorder"); + uint32 domeCombo = *_vm->matchVarToString("adomecombo"); + + DebugPrintf("Telescope Combo:\n "); + for (int i = 0; i < 5; i++) + DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i)); + + DebugPrintf("\nPrison Combo:\n "); + for (int i = 0; i < 5; i++) + DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(prisonCombo, i)); + + DebugPrintf("\nDome Combo:\n "); + for (int i = 1; i <= 25; i++) + if (domeCombo & (1 << (25 - i))) + DebugPrintf("%d ", i); + + DebugPrintf("\n"); + return true; +} + LivingBooksConsole::LivingBooksConsole(MohawkEngine_LivingBooks *vm) : GUI::Debugger(), _vm(vm) { DCmd_Register("playSound", WRAP_METHOD(LivingBooksConsole, Cmd_PlaySound)); DCmd_Register("stopSound", WRAP_METHOD(LivingBooksConsole, Cmd_StopSound)); diff --git a/engines/mohawk/console.h b/engines/mohawk/console.h index 9a30d46225..1806c61027 100644 --- a/engines/mohawk/console.h +++ b/engines/mohawk/console.h @@ -88,6 +88,7 @@ private: bool Cmd_DumpScript(int argc, const char **argv); bool Cmd_ListZipCards(int argc, const char **argv); bool Cmd_GetRMAP(int argc, const char **argv); + bool Cmd_Combos(int argc, const char **argv); }; class LivingBooksConsole : public GUI::Debugger { diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 24466305fe..67d621a54c 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -1325,7 +1325,7 @@ void RivenExternal::xogehnbooknextpage(uint16 argc, uint16 *argv) { _vm->_gfx->updateScreen(); } -static uint16 getComboDigit(uint32 correctCombo, uint32 digit) { +uint16 RivenExternal::getComboDigit(uint32 correctCombo, uint32 digit) { static const uint32 powers[] = { 100000, 10000, 1000, 100, 10, 1 }; return (correctCombo % powers[digit]) / powers[digit + 1]; } diff --git a/engines/mohawk/riven_external.h b/engines/mohawk/riven_external.h index 14bb51340c..bdf3fa01bc 100644 --- a/engines/mohawk/riven_external.h +++ b/engines/mohawk/riven_external.h @@ -38,6 +38,7 @@ public: ~RivenExternal(); void runCommand(uint16 argc, uint16 *argv); + uint16 getComboDigit(uint32 correctCombo, uint32 digit); private: MohawkEngine_Riven *_vm; -- cgit v1.2.3 From 710fc6c71e21bb0b3b9f7f89cdaf9445450df2e2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 19:55:49 +0000 Subject: SCI: do boundary checking when loading sci1 sounds and mixing them together. The final end credits song (resource 699) in kq5 has some channels with invalid offsets, crashing ScummVM before svn-id: r50339 --- engines/sci/resource.h | 1 + engines/sci/resource_audio.cpp | 52 +++++++++++++++++++++++------------- engines/sci/sound/midiparser_sci.cpp | 21 ++++++++------- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 584c61dbd6..a13781b157 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -492,6 +492,7 @@ public: uint16 prio; uint16 size; byte *data; + uint16 curPos; long time; byte prev; }; diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 8629fecfa7..13aa81cb24 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -480,8 +480,8 @@ int ResourceManager::getAudioLanguage() const { return (_audioMapSCI1 ? _audioMapSCI1->_volumeNumber : 0); } -SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersion soundVersion) : _resMan(resMan), _soundVersion(soundVersion) { - Resource *resource = _resMan->findResource(ResourceId(kResourceTypeSound, resNumber), true); +SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVersion soundVersion) : _resMan(resMan), _soundVersion(soundVersion) { + Resource *resource = _resMan->findResource(ResourceId(kResourceTypeSound, resourceNr), true); int trackNr, channelNr; if (!resource) return; @@ -554,6 +554,9 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi } _tracks = new Track[_trackCount]; data = resource->data; + + byte channelCount; + for (trackNr = 0; trackNr < _trackCount; trackNr++) { // Track info starts with track type:BYTE // Then the channel information gets appended Unknown:WORD, ChannelOffset:WORD, ChannelSize:WORD @@ -563,34 +566,47 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi _tracks[trackNr].type = *data++; // Counting # of channels used data2 = data; - _tracks[trackNr].channelCount = 0; + channelCount = 0; while (*data2 != 0xFF) { data2 += 6; + channelCount++; _tracks[trackNr].channelCount++; } - _tracks[trackNr].channels = new Channel[_tracks[trackNr].channelCount]; + _tracks[trackNr].channels = new Channel[channelCount]; + _tracks[trackNr].channelCount = 0; _tracks[trackNr].digitalChannelNr = -1; // No digital sound associated _tracks[trackNr].digitalSampleRate = 0; _tracks[trackNr].digitalSampleSize = 0; _tracks[trackNr].digitalSampleStart = 0; _tracks[trackNr].digitalSampleEnd = 0; if (_tracks[trackNr].type != 0xF0) { // Digital track marker - not supported currently - for (channelNr = 0; channelNr < _tracks[trackNr].channelCount; channelNr++) { + channelNr = 0; + while (channelCount--) { channel = &_tracks[trackNr].channels[channelNr]; channel->prio = READ_LE_UINT16(data); - channel->data = resource->data + READ_LE_UINT16(data + 2) + 2; - channel->size = READ_LE_UINT16(data + 4) - 2; // Not counting channel header - channel->number = *(channel->data - 2); - channel->poly = *(channel->data - 1); - channel->time = channel->prev = 0; - if (channel->number == 0xFE) { // Digital channel - _tracks[trackNr].digitalChannelNr = channelNr; - _tracks[trackNr].digitalSampleRate = READ_LE_UINT16(channel->data); - _tracks[trackNr].digitalSampleSize = READ_LE_UINT16(channel->data + 2); - _tracks[trackNr].digitalSampleStart = READ_LE_UINT16(channel->data + 4); - _tracks[trackNr].digitalSampleEnd = READ_LE_UINT16(channel->data + 6); - channel->data += 8; // Skip over header - channel->size -= 8; + uint dataOffset = READ_LE_UINT16(data + 2); + if (dataOffset < resource->size) { + channel->data = resource->data + dataOffset; + channel->size = READ_LE_UINT16(data + 4); + channel->curPos = 0; + channel->number = *channel->data; + channel->poly = *(channel->data + 1); + channel->time = channel->prev = 0; + channel->data += 2; // skip over header + channel->size -= 2; // remove header size + if (channel->number == 0xFE) { // Digital channel + _tracks[trackNr].digitalChannelNr = channelNr; + _tracks[trackNr].digitalSampleRate = READ_LE_UINT16(channel->data); + _tracks[trackNr].digitalSampleSize = READ_LE_UINT16(channel->data + 2); + _tracks[trackNr].digitalSampleStart = READ_LE_UINT16(channel->data + 4); + _tracks[trackNr].digitalSampleEnd = READ_LE_UINT16(channel->data + 6); + channel->data += 8; // Skip over header + channel->size -= 8; + } + _tracks[trackNr].channelCount++; + channelNr++; + } else { + warning("Invalid offset inside sound resource %d: track %d, channel %d", resourceNr, trackNr, channelNr); } data += 6; } diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index ebb2a172cc..5f361c02ec 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -422,7 +422,10 @@ byte MidiParser_SCI::midiGetNextChannel(long ticker) { for (int i = 0; i < _track->channelCount; i++) { if (_track->channels[i].time == -1) // channel ended continue; - next = *_track->channels[i].data; // when the next event should occur + SoundResource::Channel *curChannel = &_track->channels[i]; + if (curChannel->curPos >= curChannel->size) + continue; + next = curChannel->data[curChannel->curPos]; // when the next event should occur if (next == 0xF8) // 0xF8 means 240 ticks delay next = 240; next += _track->channels[i].time; @@ -449,21 +452,21 @@ byte *MidiParser_SCI::midiMixChannels() { byte *outData = new byte[totalSize * 2]; // FIXME: creates overhead and still may be not enough to hold all data _mixedData = outData; long ticker = 0; - byte curr, curDelta; + byte channelNr, curDelta; byte command = 0, par1, global_prev = 0; long new_delta; SoundResource::Channel *channel; - while ((curr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel - channel = &_track->channels[curr]; - curDelta = *channel->data++; + while ((channelNr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel + channel = &_track->channels[channelNr]; + curDelta = channel->data[channel->curPos++]; channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the command is supposed to occur if (curDelta == 0xF8) continue; new_delta = channel->time - ticker; ticker += new_delta; - command = *channel->data++; + command = channel->data[channel->curPos++]; if (command != kEndOfTrack) { debugC(4, kDebugLevelSound, "\nDELTA "); // Write delta @@ -481,7 +484,7 @@ byte *MidiParser_SCI::midiMixChannels() { *outData++ = command; debugC(4, kDebugLevelSound, "%02X ", command); do { - par1 = *channel->data++; + par1 = channel->data[channel->curPos++]; *outData++ = par1; // out } while (par1 != 0xF7); break; @@ -492,7 +495,7 @@ byte *MidiParser_SCI::midiMixChannels() { break; default: // MIDI command if (command & 0x80) { - par1 = *channel->data++; + par1 = channel->data[channel->curPos++]; } else {// running status par1 = command; command = channel->prev; @@ -506,7 +509,7 @@ byte *MidiParser_SCI::midiMixChannels() { *outData++ = command; // out command *outData++ = par1;// pout par1 if (nMidiParams[(command >> 4) - 8] == 2) - *outData++ = *channel->data++; // out par2 + *outData++ = channel->data[channel->curPos++]; // out par2 channel->prev = command; global_prev = command; }// switch(command) -- cgit v1.2.3 From caded4f892905eb8821ba9431ec2119aab6facd9 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 26 Jun 2010 20:28:42 +0000 Subject: Improve readability svn-id: r50340 --- engines/sci/graphics/animate.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 08ff3bfc80..2f1e1e726c 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -331,7 +331,8 @@ void GfxAnimate::update() { writeSelectorValue(_s->_segMan, curObject, SELECTOR(underBits), 0); } signal &= 0xFFFF ^ kSignalForceUpdate; - signal &= signal & kSignalViewUpdated ? 0xFFFF ^ (kSignalViewUpdated | kSignalNoUpdate) : 0xFFFF; + if (signal & kSignalViewUpdated) + signal &= ~(kSignalViewUpdated | kSignalNoUpdate); } else if (signal & kSignalStopUpdate) { signal = (signal & (0xFFFF ^ kSignalStopUpdate)) | kSignalNoUpdate; } -- cgit v1.2.3 From 1ca0cdc8b105d4b6f033e1c0b8b0cdee996903fd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 20:47:28 +0000 Subject: SCI: fix warning svn-id: r50341 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 5f361c02ec..46459522a3 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -522,7 +522,7 @@ byte *MidiParser_SCI::midiMixChannels() { *outData++ = 0x00; *outData++ = 0x00; - for (int channelNr = 0; channelNr < _track->channelCount; channelNr++) + for (channelNr = 0; channelNr < _track->channelCount; channelNr++) _track->channels[channelNr].data = dataPtr[channelNr]; delete[] dataPtr; -- cgit v1.2.3 From af755b0b3d732a0976b4c008b849ca907421d6eb Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 26 Jun 2010 21:36:25 +0000 Subject: Further improve readability svn-id: r50345 --- engines/sci/graphics/animate.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 2f1e1e726c..491553cebe 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -290,11 +290,11 @@ void GfxAnimate::fill(byte &old_picNotValid) { || (!(signal & kSignalHidden) && signal & kSignalRemoveView) || (signal & kSignalAlwaysUpdate)) old_picNotValid++; - signal &= 0xFFFF ^ kSignalStopUpdate; + signal &= ~kSignalStopUpdate; } else { if (signal & kSignalStopUpdate || signal & kSignalAlwaysUpdate) old_picNotValid++; - signal &= 0xFFFF ^ kSignalForceUpdate; + signal &= ~kSignalForceUpdate; } listEntry->signal = signal; @@ -330,11 +330,12 @@ void GfxAnimate::update() { } writeSelectorValue(_s->_segMan, curObject, SELECTOR(underBits), 0); } - signal &= 0xFFFF ^ kSignalForceUpdate; + signal &= ~kSignalForceUpdate; if (signal & kSignalViewUpdated) signal &= ~(kSignalViewUpdated | kSignalNoUpdate); } else if (signal & kSignalStopUpdate) { - signal = (signal & (0xFFFF ^ kSignalStopUpdate)) | kSignalNoUpdate; + signal &= ~kSignalStopUpdate; + signal |= kSignalNoUpdate; } listEntry->signal = signal; listIterator--; @@ -352,7 +353,7 @@ void GfxAnimate::update() { _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); listEntry->showBitsFlag = true; - signal &= 0xFFFF ^ (kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); + signal &= ~(kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); if ((signal & kSignalIgnoreActor) == 0) { rect = listEntry->celRect; rect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); @@ -374,7 +375,7 @@ void GfxAnimate::update() { if (signal & kSignalHidden) { signal |= kSignalRemoveView; } else { - signal &= 0xFFFF ^ kSignalRemoveView; + signal &= ~kSignalRemoveView; if (signal & kSignalIgnoreActor) bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); else @@ -398,7 +399,7 @@ void GfxAnimate::update() { _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); listEntry->showBitsFlag = true; - if ((signal & kSignalIgnoreActor) == 0) { + if (!(signal & kSignalIgnoreActor)) { rect = listEntry->celRect; rect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); _paint16->fillRect(rect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); @@ -434,7 +435,7 @@ void GfxAnimate::drawCels() { listEntry->showBitsFlag = true; if (signal & kSignalRemoveView) { - signal &= 0xFFFF ^ kSignalRemoveView; + signal &= ~kSignalRemoveView; } listEntry->signal = signal; -- cgit v1.2.3 From 09b4f7cbed4f258a00822f2b135df475f6e1b398 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 21:55:52 +0000 Subject: Define WIN32_LEAN_AND_MEAN before including windows.h. This will cause our code to include less functionality, but might on the other hand fasten up the compilation. svn-id: r50346 --- backends/midi/windows.cpp | 1 + backends/platform/sdl/main.cpp | 1 + backends/platform/sdl/sdl.cpp | 1 + backends/plugins/win32/win32-provider.cpp | 1 + engines/engine.cpp | 1 + 5 files changed, 5 insertions(+) diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp index 08587a6b80..da44c40978 100644 --- a/backends/midi/windows.cpp +++ b/backends/midi/windows.cpp @@ -24,6 +24,7 @@ #if defined(WIN32) && !defined(_WIN32_WCE) +#define WIN32_LEAN_AND_MEAN #include // winnt.h defines ARRAYSIZE, but we want our own one... #undef ARRAYSIZE diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 13e614a4a2..52bbb59165 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -28,6 +28,7 @@ // otherwise we will get errors about the windows headers redefining // "ARRAYSIZE" for example. #if defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32_LEAN_AND_MEAN #include // winnt.h defines ARRAYSIZE, but we want our own one... #undef ARRAYSIZE diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index f8ae824acf..18c529092d 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -24,6 +24,7 @@ */ #if defined(WIN32) +#define WIN32_LEAN_AND_MEAN #include // winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h #undef ARRAYSIZE diff --git a/backends/plugins/win32/win32-provider.cpp b/backends/plugins/win32/win32-provider.cpp index a39bdfe76a..65586249e8 100644 --- a/backends/plugins/win32/win32-provider.cpp +++ b/backends/plugins/win32/win32-provider.cpp @@ -30,6 +30,7 @@ #include "common/debug.h" #include "common/fs.h" +#define WIN32_LEAN_AND_MEAN #include diff --git a/engines/engine.cpp b/engines/engine.cpp index 0f42cd493d..84fc0bbe4e 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -23,6 +23,7 @@ */ #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) +#define WIN32_LEAN_AND_MEAN #include #include // winnt.h defines ARRAYSIZE, but we want our own one... -- cgit v1.2.3 From 25cb3092f4f2ee84fa26e0f31f81bccb861efe39 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 26 Jun 2010 21:57:13 +0000 Subject: SCI: added comment to vm-workaround table svn-id: r50347 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e69048dbc4..c4c77e16de 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -193,6 +193,7 @@ struct UninitializedReadWorkaround { uint16 newValue; }; +// gameID, scriptNr, object-name, method-name, call,index,replace static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu -- cgit v1.2.3 From 578cdb2aeb0beff80eb57b4d9fcc504a69593d42 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 22:32:51 +0000 Subject: Implement support for auto detection of the users preferred locale on Windows. Note that this might break support for Windows versions older than Win2k, at least according to the MSVC docs GetLocaleInfo is only supported by Win2k+. I added a comment about that though. svn-id: r50348 --- common/translation.cpp | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 6ef4be8e3a..c5e41b2ad3 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -22,14 +22,21 @@ * $Id$ */ -#include "translation.h" - -DECLARE_SINGLETON(Common::TranslationManager) - #ifdef USE_DETECTLANG +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include +// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h +#undef ARRAYSIZE +#else #include +#endif // WIN32 #endif +#include "translation.h" + +DECLARE_SINGLETON(Common::TranslationManager) + #ifdef USE_TRANSLATION #include "messages.cpp" #endif @@ -43,6 +50,32 @@ namespace Common { TranslationManager::TranslationManager() { #ifdef USE_DETECTLANG +#ifdef WIN32 + char langName[9]; + char ctryName[9]; + + const LCID languageIdentifier = GetThreadLocale(); + + // GetLocalInfo is only supported starting from Windows 2000, according to this: + // http://msdn.microsoft.com/en-us/library/dd318101%28VS.85%29.aspx + // On the other hand the locale constants used, seem to exist on Windows 98 too, + // check this for that: http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx + // + // I am not exactly sure what is the truth now, it might be very well that this breaks + // support for systems older than Windows 2000.... + // + // TODO: Check whether this (or ScummVM at all ;-) works on a system with Windows 98 for + // example and if it does not and we still want Windows 9x support, we should definitly + // think of another solution. + if (GetLocaleInfo(languageIdentifier, LOCALE_SISO639LANGNAME, langName, ARRAYSIZE(langName)) != 0 && + GetLocaleInfo(languageIdentifier, LOCALE_SISO3166CTRYNAME, ctryName, ARRAYSIZE(ctryName)) != 0) { + _syslang = langName; + _syslang += "_"; + _syslang += ctryName; + } else { + _syslang = "en_US"; + } +#else // WIN32 // Activating current locale settings const char *locale = setlocale(LC_ALL, ""); @@ -69,6 +102,7 @@ TranslationManager::TranslationManager() { _syslang = String(locale, length); } +#endif // WIN32 #else // USE_DETECTLANG _syslang = "C"; #endif // USE_DETECTLANG -- cgit v1.2.3 From 14fdd11c04c587f5fe2abe446c49d178957f53db Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 22:44:43 +0000 Subject: Fix compilation with our default build system when USE_DETECTLANG is specified. svn-id: r50349 --- common/translation.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index c5e41b2ad3..1983c7652c 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -22,21 +22,23 @@ * $Id$ */ -#ifdef USE_DETECTLANG #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include // winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h #undef ARRAYSIZE -#else -#include -#endif // WIN32 #endif #include "translation.h" DECLARE_SINGLETON(Common::TranslationManager) +#ifdef USE_DETECTLANG +#ifndef WIN32 +#include +#endif // !WIN32 +#endif + #ifdef USE_TRANSLATION #include "messages.cpp" #endif @@ -67,8 +69,8 @@ TranslationManager::TranslationManager() { // TODO: Check whether this (or ScummVM at all ;-) works on a system with Windows 98 for // example and if it does not and we still want Windows 9x support, we should definitly // think of another solution. - if (GetLocaleInfo(languageIdentifier, LOCALE_SISO639LANGNAME, langName, ARRAYSIZE(langName)) != 0 && - GetLocaleInfo(languageIdentifier, LOCALE_SISO3166CTRYNAME, ctryName, ARRAYSIZE(ctryName)) != 0) { + if (GetLocaleInfo(languageIdentifier, LOCALE_SISO639LANGNAME, langName, sizeof(langName)) != 0 && + GetLocaleInfo(languageIdentifier, LOCALE_SISO3166CTRYNAME, ctryName, sizeof(ctryName)) != 0) { _syslang = langName; _syslang += "_"; _syslang += ctryName; -- cgit v1.2.3 From ce111a39df155f379ec829f66a39498bee303720 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 22:45:53 +0000 Subject: Add flag to set USE_DETECTLANG in create_msvc. svn-id: r50350 --- tools/create_msvc/create_msvc.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/create_msvc/create_msvc.cpp b/tools/create_msvc/create_msvc.cpp index dee91defdb..3019e219e4 100644 --- a/tools/create_msvc/create_msvc.cpp +++ b/tools/create_msvc/create_msvc.cpp @@ -840,7 +840,9 @@ const Feature s_features[] = { { "16bit", "USE_RGB_COLOR", "", true, "16bit color support" }, { "mt32emu", "USE_MT32EMU", "", true, "integrated MT-32 emulator" }, { "nasm", "USE_NASM", "", true, "IA-32 assembly support" }, // This feature is special in the regard, that it needs additional handling. - { "translation", "USE_TRANSLATION", "", true, "Translation support" } + { "translation", "USE_TRANSLATION", "", true, "Translation support" }, + { "langdetect", "USE_DETECTLANG", "", true, "System language detection support" } // This feature actually depends on "translation", there + // is just no current way of properly detecting this... }; } // End of anonymous namespace -- cgit v1.2.3 From e2026f4a26c648482b1823938c2d4a496ed56375 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 22:48:47 +0000 Subject: Zero out the memory pointer of a hunk when freeing it svn-id: r50351 --- engines/sci/engine/segment.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 253d94cc53..58f016a654 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -669,7 +669,10 @@ struct HunkTable : public Table { virtual void freeEntry(int idx) { Table::freeEntry(idx); + if (!_table[idx].mem) + warning("Attempt to free an already freed hunk"); free(_table[idx].mem); + _table[idx].mem = 0; } virtual void saveLoadWithSerializer(Common::Serializer &ser); -- cgit v1.2.3 From b2f2c48c7e31d322399997f30d4e32369806f60e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 22:50:39 +0000 Subject: Added a workaround for broken script 377 in Castle of Dr. Brain, room 320. It constantly tries to free the saved area rectangle (underbits) underneath the popup window svn-id: r50352 --- engines/sci/engine/kscripts.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index de8710bd83..ed2ce6ed9e 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -80,6 +80,14 @@ reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); reg_t resnr = argv[1]; + // WORKAROUND for a broken script in room 320 in Castle of Dr. Brain. + // Script 377 tries to free the hunk memory allocated for the saved area + // (underbits) beneath the pop up window, which results in having the + // window stay on screen even when it's closed. Ignore this request here. + if (restype == kResourceTypeMemory && g_sci->getGameId() == GID_CASTLEBRAIN && + s->currentRoomNumber() == 320) + return s->r_acc; + if (restype == kResourceTypeMemory) s->_segMan->freeHunkEntry(resnr); -- cgit v1.2.3 From b7ab6ca3f16b4371b1a99caf041d0998e1c10fa3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 22:51:13 +0000 Subject: Use "C" on Win32 as syslang in case the locale could not be determined. svn-id: r50353 --- common/translation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/translation.cpp b/common/translation.cpp index 1983c7652c..bf37cbd953 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -75,7 +75,7 @@ TranslationManager::TranslationManager() { _syslang += "_"; _syslang += ctryName; } else { - _syslang = "en_US"; + _syslang = "C"; } #else // WIN32 // Activating current locale settings -- cgit v1.2.3 From 4ec0827551a9448a2020ae9112b5b000ffd0d009 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 26 Jun 2010 23:01:12 +0000 Subject: Add some explanation why we can not just use setlocale on Win32. svn-id: r50354 --- common/translation.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/translation.cpp b/common/translation.cpp index bf37cbd953..3c5ff4d3c7 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -53,6 +53,9 @@ namespace Common { TranslationManager::TranslationManager() { #ifdef USE_DETECTLANG #ifdef WIN32 + // We can not use "setlocale" (at least not for MSVC builds), since it + // will return locales like: "English_USA.1252", thus we need a special + // way to determine the locale string for Win32. char langName[9]; char ctryName[9]; -- cgit v1.2.3 From 3dcebcb1bcf69bafc61ca4466b01237000533656 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 23:01:22 +0000 Subject: Shuffled some functions around. Also, the filename in kResCheck can never be bigger than 9 characters, when dealing with VMD videos svn-id: r50355 --- engines/sci/engine/kscripts.cpp | 54 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index ed2ce6ed9e..4e6be15760 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -46,6 +46,32 @@ reg_t kLoad(EngineState *s, int argc, reg_t *argv) { return make_reg(0, ((restype << 11) | resnr)); // Return the resource identifier as handle } +// Unloads an arbitrary resource of type 'restype' with resource numbber 'resnr' +reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { + if (argc >= 2) { + ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); + reg_t resnr = argv[1]; + + // WORKAROUND for a broken script in room 320 in Castle of Dr. Brain. + // Script 377 tries to free the hunk memory allocated for the saved area + // (underbits) beneath the pop up window, which results in having the + // window stay on screen even when it's closed. Ignore this request here. + if (restype == kResourceTypeMemory && g_sci->getGameId() == GID_CASTLEBRAIN && + s->currentRoomNumber() == 320) + return s->r_acc; + + if (restype == kResourceTypeMemory) + s->_segMan->freeHunkEntry(resnr); + + if (argc > 2) + warning("kUnload called with more than 2 parameters (%d)", argc); + } else { + warning("kUnload called with less than 2 parameters (%d) - ignoring", argc); + } + + return s->r_acc; +} + reg_t kLock(EngineState *s, int argc, reg_t *argv) { int state = argc > 2 ? argv[2].toUint16() : 1; ResourceType type = (ResourceType)(argv[0].toUint16() & 0x7f); @@ -74,38 +100,12 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// Unloads an arbitrary resource of type 'restype' with resource numbber 'resnr' -reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { - if (argc >= 2) { - ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); - reg_t resnr = argv[1]; - - // WORKAROUND for a broken script in room 320 in Castle of Dr. Brain. - // Script 377 tries to free the hunk memory allocated for the saved area - // (underbits) beneath the pop up window, which results in having the - // window stay on screen even when it's closed. Ignore this request here. - if (restype == kResourceTypeMemory && g_sci->getGameId() == GID_CASTLEBRAIN && - s->currentRoomNumber() == 320) - return s->r_acc; - - if (restype == kResourceTypeMemory) - s->_segMan->freeHunkEntry(resnr); - - if (argc > 2) - warning("kUnload called with more than 2 parameters (%d)", argc); - } else { - warning("kUnload called with less than 2 parameters (%d) - ignoring", argc); - } - - return s->r_acc; -} - reg_t kResCheck(EngineState *s, int argc, reg_t *argv) { Resource *res = NULL; ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); if (restype == kResourceTypeVMD) { - char fileName[50]; + char fileName[10]; sprintf(fileName, "%d.vmd", argv[1].toUint16()); return make_reg(0, Common::File::exists(fileName)); } -- cgit v1.2.3 From 3cf0114164aa07cdd2ae557ea49cf59a31ea5f67 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 23:13:05 +0000 Subject: Moved script_instantiate_sci0() inside the segment manager, and renamed it to scriptInitialiseObjectsSci0() svn-id: r50357 --- engines/sci/engine/script.cpp | 128 +++++++++++++++++++-------------------- engines/sci/engine/seg_manager.h | 1 + 2 files changed, 65 insertions(+), 64 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 8f3792552f..5916428432 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -176,61 +176,8 @@ void SegManager::scriptInitialiseLocals(SegmentId segmentId) { } } -void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { +void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { Script *scr = getScript(seg); - const byte *seeker = scr->_heapStart;; - uint16 entrySize = READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; - seeker += entrySize; // skip first entry - seeker += 4; // skip header - - while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { - if (READ_SCI11ENDIAN_UINT16(seeker + 14) & kInfoFlagClass) { // -info- selector - int classpos = seeker - scr->_buf; - int species = READ_SCI11ENDIAN_UINT16(seeker + 10); - - if (species < 0 || species >= (int)_classTable.size()) { - error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d", - species, species, _classTable.size(), scr->_nr); - return; - } - - setClassOffset(species, make_reg(seg, classpos)); - } - seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; - } - - seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; - while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { - reg_t reg = make_reg(seg, seeker - scr->_buf); - Object *obj = scr->scriptObjInit(reg); - - // Copy base from species class, as we need its selector IDs - obj->setSuperClassSelector( - getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); - - // If object is instance, get -propDict- from class and set it for this object - // This is needed for ::isMemberOf() to work. - // Example testcase - room 381 of sq4cd - if isMemberOf() doesn't work, talk-clicks on the robot will act like - // clicking on ego - if (!obj->isClass()) { - reg_t classObject = obj->getSuperClassSelector(); - Object *classObj = getObject(classObject); - obj->setPropDictSelector(classObj->getPropDictSelector()); - } - - // Set the -classScript- selector to the script number. - // FIXME: As this selector is filled in at run-time, it is likely - // that it is supposed to hold a pointer. The Obj::isKindOf method - // uses this selector together with -propDict- to compare classes. - // For the purpose of Obj::isKindOf, using the script number appears - // to be sufficient. - obj->setClassScriptSelector(make_reg(0, scr->_nr)); - - seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; - } -} - -void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { int objType; reg_t addr; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); @@ -250,7 +197,7 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { objLength = scr->getHeap(curOffset + 2); curOffset += 4; // skip header - addr = make_reg(segmentId, curOffset);; + addr = make_reg(seg, curOffset);; switch (objType) { case SCI_OBJ_OBJECT: @@ -259,24 +206,24 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { int classpos = curOffset + 8; // SCRIPT_OBJECT_MAGIC_OFFSET int species = scr->getHeap(classpos); - if (species == (int)segMan->classTableSize()) { + if (species == (int)classTableSize()) { // Happens in the LSL2 demo warning("Applying workaround for an off-by-one invalid species access"); - segMan->resizeClassTable(segMan->classTableSize() + 1); - } else if (species < 0 || species > (int)segMan->classTableSize()) { + resizeClassTable(classTableSize() + 1); + } else if (species < 0 || species > (int)classTableSize()) { error("Invalid species %d(0x%x) not in interval " "[0,%d) while instantiating script at segment %d\n", - species, species, segMan->classTableSize(), - segmentId); + species, species, classTableSize(), + seg); return; } - segMan->setClassOffset(species, make_reg(segmentId, classpos)); + setClassOffset(species, make_reg(seg, classpos)); } else if (pass == 1) { Object *obj = scr->scriptObjInit(addr); - obj->initSpecies(segMan, addr); + obj->initSpecies(this, addr); - if (!obj->initBaseObject(segMan, addr)) { + if (!obj->initBaseObject(this, addr)) { error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); //scr->scriptObjRemove(addr); } @@ -290,7 +237,60 @@ void script_instantiate_sci0(Script *scr, int segmentId, SegManager *segMan) { curOffset += objLength - 4; } while (objType != 0 && curOffset < scr->getScriptSize() - 2); } // for +} + +void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { + Script *scr = getScript(seg); + const byte *seeker = scr->_heapStart;; + uint16 entrySize = READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; + seeker += entrySize; // skip first entry + seeker += 4; // skip header + while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { + if (READ_SCI11ENDIAN_UINT16(seeker + 14) & kInfoFlagClass) { // -info- selector + int classpos = seeker - scr->_buf; + int species = READ_SCI11ENDIAN_UINT16(seeker + 10); + + if (species < 0 || species >= (int)_classTable.size()) { + error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d", + species, species, _classTable.size(), scr->_nr); + return; + } + + setClassOffset(species, make_reg(seg, classpos)); + } + seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; + } + + seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { + reg_t reg = make_reg(seg, seeker - scr->_buf); + Object *obj = scr->scriptObjInit(reg); + + // Copy base from species class, as we need its selector IDs + obj->setSuperClassSelector( + getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); + + // If object is instance, get -propDict- from class and set it for this object + // This is needed for ::isMemberOf() to work. + // Example testcase - room 381 of sq4cd - if isMemberOf() doesn't work, talk-clicks on the robot will act like + // clicking on ego + if (!obj->isClass()) { + reg_t classObject = obj->getSuperClassSelector(); + Object *classObj = getObject(classObject); + obj->setPropDictSelector(classObj->getPropDictSelector()); + } + + // Set the -classScript- selector to the script number. + // FIXME: As this selector is filled in at run-time, it is likely + // that it is supposed to hold a pointer. The Obj::isKindOf method + // uses this selector together with -propDict- to compare classes. + // For the purpose of Obj::isKindOf, using the script number appears + // to be sufficient. + obj->setClassScriptSelector(make_reg(0, scr->_nr)); + + seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; + } } int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNum) { @@ -315,7 +315,7 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNu segMan->scriptInitialiseObjectsSci11(segmentId); scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); } else { - script_instantiate_sci0(scr, segmentId, segMan); + segMan->scriptInitialiseObjectsSci0(segmentId); byte *relocationBlock = scr->findBlock(SCI_OBJ_POINTERS); if (relocationBlock) scr->relocate(make_reg(segmentId, relocationBlock - scr->_buf + 4)); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 990836992c..037f3f0819 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -426,6 +426,7 @@ public: */ reg_t findObjectByName(const Common::String &name, int index = -1); + void scriptInitialiseObjectsSci0(SegmentId seg); void scriptInitialiseObjectsSci11(SegmentId seg); uint32 classTableSize() { return _classTable.size(); } -- cgit v1.2.3 From 7a14846bdd99dc81a70baa43836282af47205e16 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 26 Jun 2010 23:48:27 +0000 Subject: Removed the misleading getHeap() function (only valid for SCI0-SCI1), plus removed some unused defines svn-id: r50358 --- engines/sci/engine/script.cpp | 17 +++++++---------- engines/sci/engine/segment.cpp | 6 ------ engines/sci/engine/segment.h | 8 -------- engines/sci/engine/vm.h | 5 ----- 4 files changed, 7 insertions(+), 29 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 5916428432..c548ce5cdc 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -191,11 +191,11 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { uint16 curOffset = oldScriptHeader ? 2 : 0; do { - objType = scr->getHeap(curOffset); + objType = READ_SCI11ENDIAN_UINT16(scr->_buf + curOffset); if (!objType) break; - objLength = scr->getHeap(curOffset + 2); + objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + curOffset + 2); curOffset += 4; // skip header addr = make_reg(seg, curOffset);; @@ -204,7 +204,7 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { case SCI_OBJ_CLASS: if (pass == 0 && objType == SCI_OBJ_CLASS) { int classpos = curOffset + 8; // SCRIPT_OBJECT_MAGIC_OFFSET - int species = scr->getHeap(classpos); + int species = READ_SCI11ENDIAN_UINT16(scr->_buf + classpos); if (species == (int)classTableSize()) { // Happens in the LSL2 demo @@ -335,19 +335,16 @@ void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg) do { reg.offset += objLength; // Step over the last checked object - objType = scr->getHeap(reg.offset); + objType = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset); if (!objType) break; - objLength = scr->getHeap(reg.offset + 2); // use SEG_UGET_HEAP ?? + objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); reg.offset += 4; // Step over header if ((objType == SCI_OBJ_OBJECT) || (objType == SCI_OBJ_CLASS)) { // object or class? - int superclass; - - reg.offset -= SCRIPT_OBJECT_MAGIC_OFFSET; - - superclass = scr->getHeap(reg.offset + SCRIPT_SUPERCLASS_OFFSET); // Get superclass... + reg.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) + int superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); if (superclass >= 0) { int superclass_script = segMan->getClass(superclass).script; diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 0a39d950b0..4524241110 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -417,12 +417,6 @@ void Script::mcpyInOut(int dst, const void *src, size_t n) { } } -int16 Script::getHeap(uint16 offset) const { - assert(offset + 1 < (int)_bufSize); - return READ_SCI11ENDIAN_UINT16(_buf + offset); -// return (_buf[offset] | (_buf[offset+1]) << 8); -} - SegmentRef SegmentObj::dereference(reg_t pointer) { error("Error: Trying to dereference pointer %04x:%04x to inappropriate segment", PRINT_REG(pointer)); diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 58f016a654..24d27e367f 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -501,14 +501,6 @@ public: */ void mcpyInOut(int dst, const void *src, size_t n); - - /** - * Retrieves a 16 bit value from within a script's heap representation. - * @param offset offset to read from - * @return the value read from the specified location - */ - int16 getHeap(uint16 offset) const; - /** * Finds the pointer where a block of a specific type starts from */ diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index d747ddd113..0938520525 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -49,11 +49,6 @@ class ResourceManager; /** Offset of this identifier */ #define SCRIPT_OBJECT_MAGIC_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? -8 : 0) -/** Script-relative offset of the species ID */ -#define SCRIPT_SPECIES_OFFSET 8 -8 - -#define SCRIPT_SUPERCLASS_OFFSET (getSciVersion() < SCI_VERSION_1_1 ? 10 -8 : 12) - /** Stack pointer value: Use predecessor's value */ #define CALL_SP_CARRY NULL -- cgit v1.2.3 From daab502028761f8da7a4f75a7bbd265f8127892d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 00:08:00 +0000 Subject: Cleanup svn-id: r50359 --- engines/sci/engine/script.cpp | 24 ++++++++++++------------ engines/sci/engine/segment.cpp | 6 ++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index c548ce5cdc..f26a2e53af 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -178,9 +178,10 @@ void SegManager::scriptInitialiseLocals(SegmentId segmentId) { void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { Script *scr = getScript(seg); + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); + const byte *seeker = 0; int objType; reg_t addr; - bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); // The script is initialized in 2 passes. // Pass 1: creates a lookup table of all used classes @@ -188,23 +189,22 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { for (uint16 pass = 0; pass <= 1; pass++) { uint16 objLength = 0; - uint16 curOffset = oldScriptHeader ? 2 : 0; + seeker = scr->_buf + (oldScriptHeader ? 2 : 0); do { - objType = READ_SCI11ENDIAN_UINT16(scr->_buf + curOffset); + objType = READ_SCI11ENDIAN_UINT16(seeker); if (!objType) break; - objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + curOffset + 2); - curOffset += 4; // skip header - addr = make_reg(seg, curOffset);; + objLength = READ_SCI11ENDIAN_UINT16(seeker + 2); + seeker += 4; // skip header + addr = make_reg(seg, seeker - scr->_buf); switch (objType) { case SCI_OBJ_OBJECT: case SCI_OBJ_CLASS: if (pass == 0 && objType == SCI_OBJ_CLASS) { - int classpos = curOffset + 8; // SCRIPT_OBJECT_MAGIC_OFFSET - int species = READ_SCI11ENDIAN_UINT16(scr->_buf + classpos); + int species = READ_SCI11ENDIAN_UINT16(seeker + 8); // SCRIPT_OBJECT_MAGIC_OFFSET if (species == (int)classTableSize()) { // Happens in the LSL2 demo @@ -218,7 +218,7 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { return; } - setClassOffset(species, make_reg(seg, classpos)); + setClassOffset(species, make_reg(seg, seeker - scr->_buf + 8)); } else if (pass == 1) { Object *obj = scr->scriptObjInit(addr); obj->initSpecies(this, addr); @@ -234,14 +234,14 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { break; } - curOffset += objLength - 4; - } while (objType != 0 && curOffset < scr->getScriptSize() - 2); + seeker += objLength - 4; + } while (objType != 0 && (uint32)(seeker - scr->_buf) < scr->getScriptSize() - 2); } // for } void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { Script *scr = getScript(seg); - const byte *seeker = scr->_heapStart;; + const byte *seeker = scr->_heapStart; uint16 entrySize = READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; seeker += entrySize; // skip first entry seeker += 4; // skip header diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 4524241110..13c7904726 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -588,11 +588,9 @@ void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback void CloneTable::freeAtAddress(SegManager *segMan, reg_t addr) { #ifdef GC_DEBUG - Object *victim_obj; + // assert(addr.segment == _segId); -// assert(addr.segment == _segId); - - victim_obj = &(_table[addr.offset]); + Object *victim_obj = &(_table[addr.offset]); if (!(victim_obj->_flags & OBJECT_FLAG_FREED)) warning("[GC] Clone %04x:%04x not reachable and not freed (freeing now)", PRINT_REG(addr)); -- cgit v1.2.3 From b161310193713f262dec017e11997ef77eac20c6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 01:06:51 +0000 Subject: Script workaround fix for bug #2917661 - Crash when interacting with D'Blah svn-id: r50360 --- engines/tinsel/pcode.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp index c472a770d2..98fb078459 100644 --- a/engines/tinsel/pcode.cpp +++ b/engines/tinsel/pcode.cpp @@ -148,6 +148,7 @@ static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491), OP_ONE, OP_LIBCALL | OPSIZE8, 14, // Re-show the cursor OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46, // Give back the whistle OP_JUMP | OPSIZE16, FRAGMENT_WORD(1568)}; +static const byte fragment13[] = {OP_ZERO, OP_GSTORE | OPSIZE16, FRAGMENT_WORD(306)}; #undef FRAGMENT_WORD @@ -207,6 +208,12 @@ const WorkaroundEntry workaroundList[] = { // See bug report #2934211. {TINSEL_V1, true, 352601285, 1569, sizeof(fragment11), fragment11}, {TINSEL_V1, false, 352602304, 1488, sizeof(fragment12), fragment12}, + + // DW2: Corrects a bug with global 306 not being cleared if you leave + // the marketplace scene whilst D'Blah is talking (even if it's not + // actually audible); returning to the scene and clicking on him multiple + // times would cause the game to crash + {TINSEL_V2, true, 1109294728, 0, sizeof(fragment13), fragment13}, {TINSEL_V0, false, 0, 0, 0, NULL} }; -- cgit v1.2.3 From ae332b620e13d554563a3a6f9b435ebde6761f7a Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Sun, 27 Jun 2010 04:19:55 +0000 Subject: Run possible cut-scenes before each location change. This is the behavior of the original player. It is not necessary to click on the hero. svn-id: r50361 --- engines/draci/game.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 0e4b3386ec..23cb4700c1 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -174,8 +174,17 @@ void Game::start() { // Call the outer loop doing all the hard job. loop(kOuterLoop, false); - } + if (!isReloaded()) { + // We are changing location. Run the hero's LOOK + // program to trigger a possible cut-scene. This is + // the behavior of the original game player, whose + // intention was to run the cut sequences after the + // certain location change. + const GameObject *dragon = getObject(kDragonObject); + _vm->_script->run(dragon->_program, dragon->_look); + } + } } void Game::init() { -- cgit v1.2.3 From 6a6091f6d7547d750985f6ee757d5b7c9c2d78b3 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 27 Jun 2010 04:58:48 +0000 Subject: Prevent execution of the STOP script command when its Zone does not exist. Patch #3021744 by fuzzie with some comments. svn-id: r50363 --- engines/parallaction/exec_br.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 76e6f0dfe0..1d8724e2d8 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -527,6 +527,11 @@ DECLARE_INSTRUCTION_OPCODE(endif) { DECLARE_INSTRUCTION_OPCODE(stop) { ZonePtr z = ctxt._inst->_z; + + // Prevent execution if zone is missing. The known case is "PART2/insegui.scr", which has + // "STOP insegui", which doesn't exist (see ticket #3021744 for the gory details) + if (!z) return; + if (ACTIONTYPE(z) == kZoneHear) { warning("Parallaction_br::instOp_stop not yet implemented for HEAR zones"); // TODO: stop music or sound effects generated by a zone. -- cgit v1.2.3 From c922af06c2d209de13349d9938388242238fc744 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 05:17:40 +0000 Subject: Centralised the update logic for the various system lists into the MadsView class svn-id: r50365 --- engines/m4/mads_anim.cpp | 2 +- engines/m4/mads_scene.cpp | 3 +-- engines/m4/mads_views.cpp | 5 +++++ engines/m4/mads_views.h | 5 +++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index fb565a927c..c2e9ea4eee 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -547,7 +547,7 @@ void AnimviewView::updateState() { } void AnimviewView::readNextCommand() { -static bool tempFlag = false;//****DEBUG - Temporarily allow me to skip several intro scenes **** +static bool tempFlag = true;//****DEBUG - Temporarily allow me to skip several intro scenes **** while (!_script->eos() && !_script->err()) { if (!tempFlag) { diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 60fffadc07..73388a2325 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -297,7 +297,6 @@ void MadsScene::update() { void MadsScene::updateState() { _sceneLogic.sceneStep(); - _sequenceList.tick(); if ((_activeAnimation) && !_abortTimers) { _activeAnimation->update(); @@ -307,7 +306,7 @@ void MadsScene::updateState() { } } - _kernelMessages.update(); + MadsView::update(); } int MadsScene::loadSceneSpriteSet(const char *setName) { diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 08b579cfb0..7b0b1443a8 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -1238,6 +1238,11 @@ void MadsView::refresh() { _textDisplay.cleanUp(); } +void MadsView::update() { + _sequenceList.tick(); + _kernelMessages.update(); +} + void MadsView::clearLists() { _textDisplay.clear(); _kernelMessages.clear(); diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 843596412e..fc001740d3 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -170,6 +170,10 @@ public: AbortTimerMode abortMode; uint16 actionNouns[3]; char msg[100]; + + MadsKernelMessageEntry() { + flags = 0; + } }; class MadsKernelMessageList { @@ -404,6 +408,7 @@ public: ~MadsView(); void refresh(); + void update(); void clearLists(); }; -- cgit v1.2.3 From 965cdb6fbf1d7db6ca839a9cb75be1821975d8b7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 05:18:21 +0000 Subject: Several bugfixes to the loading, display, and digital sound playing of messages during cutscenes svn-id: r50366 --- engines/m4/animation.cpp | 31 +++++++++++++++++-------------- engines/m4/animation.h | 6 +++--- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 6b32bdca17..fae21db072 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -132,23 +132,24 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S for (int i = 0; i < messagesCount; ++i) { AnimMessage rec; - rec.soundId = animStream->readUint16LE(); - animStream->read(rec.msg, 70); - animStream->readUint16LE(); - animStream->readUint16LE(); + rec.soundId = animStream->readSint16LE(); + animStream->read(rec.msg, 64); + animStream->skip(4); + rec.pos.x = animStream->readSint16LE(); + rec.pos.y = animStream->readSint16LE(); + rec.flags = animStream->readUint16LE(); rec.rgb1.r = animStream->readByte(); rec.rgb1.g = animStream->readByte(); rec.rgb1.b = animStream->readByte(); rec.rgb2.r = animStream->readByte(); rec.rgb2.g = animStream->readByte(); rec.rgb2.b = animStream->readByte(); - animStream->readUint16LE(); - animStream->readUint16LE(); - rec.kernelMsgIndex = animStream->readUint16LE(); - rec.pos.x = animStream->readUint16LE(); - rec.pos.y = animStream->readUint16LE(); + animStream->skip(2); // Space for kernelMsgIndex + rec.kernelMsgIndex = -1; + animStream->skip(6); rec.startFrame = animStream->readUint16LE(); rec.endFrame = animStream->readUint16LE(); + animStream->skip(2); _messages.push_back(rec); } @@ -166,8 +167,8 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S rec.seqIndex = animStream->readByte(); rec.spriteSlot.spriteListIndex = animStream->readByte(); rec.spriteSlot.frameNumber = animStream->readUint16LE(); - rec.spriteSlot.xp = animStream->readUint16LE(); - rec.spriteSlot.yp = animStream->readUint16LE(); + rec.spriteSlot.xp = animStream->readSint16LE(); + rec.spriteSlot.yp = animStream->readSint16LE(); rec.spriteSlot.depth = animStream->readByte(); rec.spriteSlot.scale = (int8)animStream->readByte(); @@ -425,10 +426,12 @@ void MadsAnimation::update() { _vm->_palette->setEntry(colIndex + 1, me.rgb2.r, me.rgb2.g, me.rgb2.b); // Add a kernel message to display the given text - me.kernelMsgIndex = _view->_kernelMessages.add(me.pos, colIndex * 101, 0, 0, INDEFINITE_TIMEOUT, me.msg); + me.kernelMsgIndex = _view->_kernelMessages.add(me.pos, colIndex * 0x101, 0, 0, INDEFINITE_TIMEOUT, me.msg); + assert(me.kernelMsgIndex >= 0); + // Play the associated sound, if it exists - if (me.soundId >= 0) - _vm->_sound->playDSRSound(me.soundId, 255, false); + if (me.soundId > 0) + _vm->_sound->playDSRSound(me.soundId - 1, 255, false); ++_messageCtr; } } diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 89c3cbbfaf..135618d7e2 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -40,12 +40,12 @@ class SpriteSlotSubset; class AnimMessage { public: int16 soundId; - char msg[70]; + char msg[64]; Common::Point pos; RGB8 rgb1, rgb2; - int kernelMsgIndex; - + uint16 flags; int startFrame, endFrame; + int kernelMsgIndex; }; class AnimFrameEntry { -- cgit v1.2.3 From be399485cde37b84fa660b6f83c4adf29f6312c7 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sun, 27 Jun 2010 05:30:18 +0000 Subject: Add Nintendo Wii (PAL) versions of Freddi Fish: Kelp Seed Mystery. svn-id: r50367 --- engines/scumm/scumm-md5.h | 8 +++++++- tools/scumm-md5.txt | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index 76045f42a2..a25fac1a88 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Tue Jun 22 19:42:27 2010 + This file was generated by the md5table tool on Sun Jun 27 05:23:26 2010 DO NOT EDIT MANUALLY! */ @@ -137,6 +137,7 @@ static const MD5Table md5table[] = { { "2fe369ad70f52a8cf7ad6077ee64f81a", "loom", "EGA", "EGA", -1, Common::DE_DEU, Common::kPlatformAmiga }, { "305d3dd57c96c65b017bc70c8c7cfb5e", "monkey", "CD", "CD", 8955, Common::DE_DEU, Common::kPlatformPC }, { "30ba1e825d4ad2b448143ae8df18482a", "pajama2", "HE 98.5", "Demo", -1, Common::NL_NLD, Common::kPlatformUnknown }, + { "30d1903b0715759af064be2127381cd0", "freddi", "HE 100", "", 34837, Common::DE_DEU, Common::kPlatformWii }, { "319a4dde52c7960b5aae8a1ec348d918", "monkey", "VGA", "VGA", -1, Common::DE_DEU, Common::kPlatformAmiga }, { "31aa57f460a3d12429f0552a46a90b39", "puttputt", "Demo", "Demo", 6150, Common::EN_ANY, Common::kPlatformPC }, { "31b8fda4c8c7413fa6b39997e776eba4", "loom", "FM-TOWNS", "", -1, Common::JA_JPN, Common::kPlatformFMTowns }, @@ -167,6 +168,7 @@ static const MD5Table md5table[] = { { "3a3e592b074f595489f7f11e150c398d", "puttzoo", "HE 99", "Updated", -1, Common::EN_USA, Common::kPlatformWindows }, { "3a5d13675e9a23aedac0bac7730f0ac1", "samnmax", "", "CD", -1, Common::FR_FRA, Common::kPlatformMacintosh }, { "3a5ec90d556d4920976c5578bfbfaf79", "maniac", "NES", "", -1, Common::DE_DEU, Common::kPlatformNES }, + { "3ae7f002d9256b8bdf76aaf8a3a069f8", "freddi", "HE 100", "", 34837, Common::EN_GRB, Common::kPlatformWii }, { "3af61c5edf8e15b43dbafd285b2e9777", "puttcircus", "", "Demo", -1, Common::HE_ISR, Common::kPlatformWindows }, { "3b301b7892f883ce42ab4be6a274fea6", "samnmax", "Floppy", "Floppy", -1, Common::EN_ANY, Common::kPlatformPC }, { "3b832f4a90740bf22e9b8ed42ca0128c", "freddi4", "HE 99", "", -1, Common::EN_GRB, Common::kPlatformWindows }, @@ -196,6 +198,7 @@ static const MD5Table md5table[] = { { "49a1739981a89066b1121fac04b710f4", "spyfox2", "HE CUP", "Preview", 5756234, Common::UNK_LANG, Common::kPlatformUnknown }, { "4aa93cb30e485b728504ba3a693f12bf", "pajama", "HE 100", "", -1, Common::RU_RUS, Common::kPlatformWindows }, { "4af4a6b248103c1fe9edef619677f540", "puttmoon", "", "Demo", -1, Common::EN_ANY, Common::kPlatformMacintosh }, + { "4afb734df8315ee412669c812d4cf0a1", "freddi", "HE 100", "", 34837, Common::FR_FRA, Common::kPlatformWii }, { "4ba37f835be11a59d969f90f272f575b", "water", "HE 80", "", -1, Common::EN_USA, Common::kPlatformUnknown }, { "4ba7fb331296c283e73d8f5b2096e551", "samnmax", "", "CD", -1, Common::ES_ESP, Common::kPlatformUnknown }, { "4bedb49943df95a9c900a5a82ccbe9de", "ft", "", "", -1, Common::FR_FRA, Common::kPlatformUnknown }, @@ -230,6 +233,7 @@ static const MD5Table md5table[] = { { "55e4cc866ff9046824e1c638ba2b8c7f", "ft", "", "", -1, Common::RU_RUS, Common::kPlatformUnknown }, { "55f4e9402bec2bded383843123f37c5c", "pajama2", "HE 98.5", "", -1, Common::DE_DEU, Common::kPlatformWindows }, { "566165a7338fa11029e7c14d94fa70d0", "freddi", "HE 73", "Demo", 9800, Common::EN_ANY, Common::kPlatformWindows }, + { "56b5922751be7ffd771b38dda56b028b", "freddi", "HE 100", "", 34837, Common::NL_NLD, Common::kPlatformWii }, { "5719fc8a13b4638b78d9d8d12f091f94", "puttrace", "HE 99", "", -1, Common::FR_FRA, Common::kPlatformWindows }, { "5798972220cd458be2626d54c80f71d7", "atlantis", "Floppy", "Floppy", -1, Common::IT_ITA, Common::kPlatformAmiga }, { "57a17febe2183f521250e55d55b83e60", "PuttTime", "HE 99", "", -1, Common::FR_FRA, Common::kPlatformWindows }, @@ -357,6 +361,7 @@ static const MD5Table md5table[] = { { "87df3e0074624040407764b7c5e710b9", "pajama", "", "Demo", 18354, Common::NL_NLD, Common::kPlatformWindows }, { "87f6e8037b7cc996e13474b491a7a98e", "maniac", "V2", "V2", -1, Common::IT_ITA, Common::kPlatformPC }, { "8801fb4a1200b347f7a38523339526dd", "jungle", "", "", -1, Common::EN_ANY, Common::kPlatformWindows }, + { "880c5ca5b944648b3f8b03feb41705a8", "freddi", "HE 100", "", 34837, Common::SE_SWE, Common::kPlatformWii }, { "883af4b0af4f77a92f1dcf1d0a283140", "tentacle", "", "CD", -1, Common::ES_ESP, Common::kPlatformUnknown }, { "898ce8eb1234a955ef75e87141902bb3", "freddi3", "", "", -1, Common::RU_RUS, Common::kPlatformWindows }, { "898eaa21f79cf8d4f08db856244689ff", "pajama", "HE 99", "Updated", 66505, Common::EN_ANY, Common::kPlatformWindows }, @@ -430,6 +435,7 @@ static const MD5Table md5table[] = { { "a561d2e2413cc1c71d5a1bf87bf493ea", "lost", "HE 100", "Updated", -1, Common::EN_USA, Common::kPlatformUnknown }, { "a56e8d9d4281c53c3f63c9bd22a59e21", "catalog", "HE CUP", "Preview", 10978342, Common::EN_ANY, Common::kPlatformUnknown }, { "a570381b028972d891052ee1e51dc011", "maniac", "V2", "V2", 1988, Common::EN_ANY, Common::kPlatformAtariST }, + { "a59a438cb182124c30c4447d8ed469e9", "freddi", "HE 100", "", 34837, Common::NB_NOR, Common::kPlatformWii }, { "a5c5388da9bf0e6662fdca8813a79d13", "farm", "", "", 86962, Common::EN_ANY, Common::kPlatformWindows }, { "a654fb60c3b67d6317a7894ffd9f25c5", "pajama3", "", "Demo", -1, Common::EN_USA, Common::kPlatformUnknown }, { "a7cacad9c40c4dc9e1812abf6c8af9d5", "puttcircus", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt index 3b97380638..c3e48d6c5a 100644 --- a/tools/scumm-md5.txt +++ b/tools/scumm-md5.txt @@ -485,6 +485,12 @@ freddi Freddi Fish 1: The Case of the Missing Kelp Seeds a197a87ae77f3b3333f09a7a2c448fe2 -1 en Windows HE 99 Updated - Jonathan af2bd1a43b50b55915d87994e093203d 34829 de Windows HE 99 Updated - Lightkey 57a5cfec9ef231a007043cc1917e8988 -1 en Wii HE 100 - - sanguinehearts + 56b5922751be7ffd771b38dda56b028b 34837 nl Wii HE 100 - - George Kormendi + 3ae7f002d9256b8bdf76aaf8a3a069f8 34837 gb Wii HE 100 - - George Kormendi + 30d1903b0715759af064be2127381cd0 34837 de Wii HE 100 - - George Kormendi + 4afb734df8315ee412669c812d4cf0a1 34837 fr Wii HE 100 - - George Kormendi + a59a438cb182124c30c4447d8ed469e9 34837 nb Wii HE 100 - - George Kormendi + 880c5ca5b944648b3f8b03feb41705a8 34837 se Wii HE 100 - - George Kormendi c7c492a107ec520d7a7943037d0ca54a -1 nl Windows HE 71 Demo - DarthBo 084ed0fa98a6d1e9368d67fe9cfbd417 -1 en Windows HE 71 Demo - khalek -- cgit v1.2.3 From 9a8683ac656e37a62ecf483f635424cc559d397a Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 05:58:11 +0000 Subject: Added accidentally deleted line svn-id: r50369 --- engines/m4/mads_anim.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index c2e9ea4eee..d8976241e1 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -513,6 +513,8 @@ bool AnimviewView::onEvent(M4EventType eventType, int32 param, int x, int y, boo } void AnimviewView::updateState() { + MadsView::update(); + if (!_script) return; -- cgit v1.2.3 From c7682f5117c5286247fbaf50497c4b35e5f6817f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 06:35:32 +0000 Subject: Added proper conversion of message RGB colour values svn-id: r50371 --- engines/m4/animation.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index fae21db072..4dc645991e 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -138,12 +138,12 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S rec.pos.x = animStream->readSint16LE(); rec.pos.y = animStream->readSint16LE(); rec.flags = animStream->readUint16LE(); - rec.rgb1.r = animStream->readByte(); - rec.rgb1.g = animStream->readByte(); - rec.rgb1.b = animStream->readByte(); - rec.rgb2.r = animStream->readByte(); - rec.rgb2.g = animStream->readByte(); - rec.rgb2.b = animStream->readByte(); + rec.rgb1.r = animStream->readByte() << 2; + rec.rgb1.g = animStream->readByte() << 2; + rec.rgb1.b = animStream->readByte() << 2; + rec.rgb2.r = animStream->readByte() << 2; + rec.rgb2.g = animStream->readByte() << 2; + rec.rgb2.b = animStream->readByte() << 2; animStream->skip(2); // Space for kernelMsgIndex rec.kernelMsgIndex = -1; animStream->skip(6); -- cgit v1.2.3 From b6b4247335c5cc0f82cdaf590b2bd93e22eb62af Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 27 Jun 2010 11:16:49 +0000 Subject: Workaround that corrects some bad frame data in the Russian version that was causing the several game crashes svn-id: r50372 --- engines/tinsel/graphics.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/engines/tinsel/graphics.cpp b/engines/tinsel/graphics.cpp index 9700e8947f..3423f1054a 100644 --- a/engines/tinsel/graphics.cpp +++ b/engines/tinsel/graphics.cpp @@ -443,6 +443,12 @@ static void t2WrtNonZero(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, bool apply int numBytes; int clipAmount; + // WORKAROUND: One of the mortician frames has several corrupt bytes in the Russian version + if ((pObj->hBits == 2517583660) && (_vm->getLanguage() == Common::RU_RUS)) { + uint8 correctBytes[5] = {0xA3, 0x00, 0x89, 0xC0, 0xA6}; + Common::copy(&correctBytes[0], &correctBytes[5], srcP); + } + for (int y = 0; y < pObj->height; ++y) { // Get the position to start writing out from uint8 *tempP = !horizFlipped ? destP : @@ -596,6 +602,23 @@ static void PackedWrtNonZero(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, int numBytes, colour; int v; + if (_vm->getLanguage() == Common::RU_RUS) { + // WORKAROUND: One of the mortician frames has several corrupt bytes in the Russian version + if (pObj->hBits == 2517583393) { + uint8 correctBytes[5] = {0x00, 0x00, 0x17, 0x01, 0x00}; + Common::copy(&correctBytes[0], &correctBytes[5], srcP + 267); + } + // WORKAROUND: One of Dibbler's frames in the end sequence has corrupt bytes in the Russian version + if (pObj->hBits == 33651742) { + uint8 correctBytes[40] = { + 0x06, 0xc0, 0xd6, 0xc1, 0x09, 0xce, 0x0d, 0x24, 0x02, 0x12, 0x01, 0x00, 0x00, 0x23, 0x21, 0x32, + 0x12, 0x00, 0x00, 0x20, 0x01, 0x11, 0x32, 0x12, 0x01, 0x00, 0x00, 0x1b, 0x02, 0x11, 0x34, 0x11, + 0x00, 0x00, 0x18, 0x01, 0x11, 0x35, 0x21, 0x01 + }; + Common::copy(&correctBytes[0], &correctBytes[40], srcP); + } + } + if (applyClipping) { pObj->height -= pObj->botClip; topClip = pObj->topClip; -- cgit v1.2.3 From 0b6bd84aba372076c450dfefa89752a3c7778bae Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 11:19:23 +0000 Subject: SCI: adding uninit workaround for lsl6 (Narrator::startText) svn-id: r50373 --- engines/sci/engine/vm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c4c77e16de..a6caa1e251 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -199,6 +199,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room + { GID_LSL6, 928, "*", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions (actually Narrator::startText) { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio @@ -249,7 +250,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // Search if this is a known uninitialized read const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && workaround->objectName == curObjectName + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && ((workaround->objectName == curObjectName) || (*workaround->objectName == '*')) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { // Workaround found r[index] = make_reg(0, workaround->newValue); -- cgit v1.2.3 From 32ee0338f8309bddfe61cc23db934bfb4447cdc2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 11:51:44 +0000 Subject: SCI: better solution for the lsl6 uninit issue, we now go through all the parents till we find a working workaround - we can use Narrator::startText that way inside the workaround table svn-id: r50374 --- engines/sci/engine/vm.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a6caa1e251..c4552e591d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -199,7 +199,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room - { GID_LSL6, 928, "*", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions (actually Narrator::startText) + { GID_LSL6, 928, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio @@ -248,16 +248,25 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } // Search if this is a known uninitialized read - const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; - while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && ((workaround->objectName == curObjectName) || (*workaround->objectName == '*')) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { - // Workaround found - r[index] = make_reg(0, workaround->newValue); - return r[index]; + const UninitializedReadWorkaround *workaround; + Common::String searchObjectName = curObjectName; + reg_t searchObject = lastCall->sendp; + do { + workaround = uninitializedReadWorkarounds; + while (workaround->objectName) { + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->objectName == searchObjectName) + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { + // Workaround found + r[index] = make_reg(0, workaround->newValue); + return r[index]; + } + workaround++; } - workaround++; - } + // Go back to the parent + searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); + if (!searchObject.isNull()) + searchObjectName = state->_segMan->getObjectName(searchObject); + } while (!searchObject.isNull()); // no parent left? error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); } return r[index]; -- cgit v1.2.3 From 25ca058fa841f29b0e2999f446b9d6f8198d78e5 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 27 Jun 2010 13:06:22 +0000 Subject: Add support for Chinese The DIG. svn-id: r50375 --- engines/scumm/charset.cpp | 7 +++---- engines/scumm/detection.cpp | 4 +++- engines/scumm/string.cpp | 2 ++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp index 0e0c0e129e..fa4804ce7d 100644 --- a/engines/scumm/charset.cpp +++ b/engines/scumm/charset.cpp @@ -109,10 +109,9 @@ void ScummEngine::loadCJKFont() { numChar = 8192; break; case Common::ZH_TWN: - if (_game.id == GID_CMI) { - fontFile = "chinese.fnt"; - numChar = 13630; - } + // Both The DIG and COMI use same font + fontFile = "chinese.fnt"; + numChar = 13630; break; case Common::ZH_CNA: if (_game.id == GID_FT || _game.id == GID_LOOM || _game.id == GID_INDY3 || diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index dbd86505a8..407b139c7e 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -314,7 +314,7 @@ static Common::Language detectLanguage(const Common::FSList &fslist, byte id) { case 449787: // 64f3fe479d45b52902cf88145c41d172 return Common::ES_ESP; } - } else { + } else { // The DIG switch (size) { case 248627: // 1fd585ac849d57305878c77b2f6c74ff return Common::DE_DEU; @@ -328,6 +328,8 @@ static Common::Language detectLanguage(const Common::FSList &fslist, byte id) { return Common::ES_ESP; case 223107: // 64f3fe479d45b52902cf88145c41d172 return Common::JA_JPN; + case 180730: // 424fdd60822722cdc75356d921dad9bf + return Common::ZH_TWN; } } } diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index 480e18e514..62fdf48440 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -1351,6 +1351,8 @@ void ScummEngine_v7::loadLanguageBundle() { // File contains Korean text (Hangul). just ignore it } else if (*ptr == 'j') { // File contains Japanese text. just ignore it + } else if (*ptr == 'c') { + // File contains Chinese text. just ignore it } else if (*ptr == 'e') { // File is encoded! enc = 0x13; -- cgit v1.2.3 From 6864d09d68b8e31f94ac802dd791a188523322d9 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Sun, 27 Jun 2010 13:15:01 +0000 Subject: SCI: Fix for large views in GK2. At least it does not segfault now. svn-id: r50376 --- engines/sci/graphics/view.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index f00d6a652d..5436e426ff 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -579,8 +579,8 @@ void GfxView::drawScaled(Common::Rect rect, Common::Rect clipRect, Common::Rect byte color; byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY; int x, y; - uint16 scalingX[320]; - uint16 scalingY[200]; + uint16 scalingX[640]; + uint16 scalingY[480]; int16 scaledWidth, scaledHeight; int16 pixelNo, scaledPixel, scaledPixelNo, prevScaledPixelNo; uint16 offsetX, offsetY; -- cgit v1.2.3 From d5bff2f5d40a756c48b29a3984e80231f312f41f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 27 Jun 2010 13:25:06 +0000 Subject: GUI: Copy over fonts from the vendor branch, so they will lay next to the GUI. It will be used for future support of locale-dependent fonts. svn-id: r50377 --- gui/themes/fonts/5x8-L1.bdf | 3380 +++++++++ gui/themes/fonts/Arial.bdf | 1537 ++++ gui/themes/fonts/Arial12.bdf | 7119 ++++++++++++++++++ gui/themes/fonts/ArialBold.bdf | 1538 ++++ gui/themes/fonts/README | 3 + gui/themes/fonts/clR6x12-L1.bdf | 4290 +++++++++++ gui/themes/fonts/courr12-l1.bdf | 2926 ++++++++ gui/themes/fonts/helvB12-L1.bdf | 3059 ++++++++ gui/themes/fonts/helvB12.bdf | 12708 ++++++++++++++++++++++++++++++++ gui/themes/fonts/helvBO12-L1.bdf | 3058 ++++++++ gui/themes/fonts/helvBO12.bdf | 12195 ++++++++++++++++++++++++++++++ gui/themes/fonts/helvR12-L1.bdf | 3048 ++++++++ gui/themes/fonts/helvR12.bdf | 12688 +++++++++++++++++++++++++++++++ gui/themes/fonts/topaz/README.ScummVM | 6 + gui/themes/fonts/topaz/topazLT.font | Bin 0 -> 264 bytes gui/themes/fonts/topaz/topazLT.readme | 63 + gui/themes/fonts/topaz/topazlt/8 | Bin 0 -> 2600 bytes 17 files changed, 67618 insertions(+) create mode 100644 gui/themes/fonts/5x8-L1.bdf create mode 100644 gui/themes/fonts/Arial.bdf create mode 100644 gui/themes/fonts/Arial12.bdf create mode 100644 gui/themes/fonts/ArialBold.bdf create mode 100644 gui/themes/fonts/README create mode 100644 gui/themes/fonts/clR6x12-L1.bdf create mode 100644 gui/themes/fonts/courr12-l1.bdf create mode 100644 gui/themes/fonts/helvB12-L1.bdf create mode 100644 gui/themes/fonts/helvB12.bdf create mode 100644 gui/themes/fonts/helvBO12-L1.bdf create mode 100644 gui/themes/fonts/helvBO12.bdf create mode 100644 gui/themes/fonts/helvR12-L1.bdf create mode 100644 gui/themes/fonts/helvR12.bdf create mode 100644 gui/themes/fonts/topaz/README.ScummVM create mode 100644 gui/themes/fonts/topaz/topazLT.font create mode 100644 gui/themes/fonts/topaz/topazLT.readme create mode 100644 gui/themes/fonts/topaz/topazlt/8 diff --git a/gui/themes/fonts/5x8-L1.bdf b/gui/themes/fonts/5x8-L1.bdf new file mode 100644 index 0000000000..80ea041db5 --- /dev/null +++ b/gui/themes/fonts/5x8-L1.bdf @@ -0,0 +1,3380 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl 5x8.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT Id: 5x8.bdf,v 1.28 2001-04-03 13:37:48+01 mgk25 Exp mgk25 $ +COMMENT Send bug reports to Markus Kuhn +FONT -Misc-Fixed-Medium-R-Normal--8-80-75-75-C-50-ISO8859-1 +SIZE 11 75 75 +FONTBOUNDINGBOX 5 8 0 -1 +STARTPROPERTIES 21 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +FONT_DESCENT 1 +FONT_ASCENT 7 +COPYRIGHT "Public domain font. Share and enjoy." +DEFAULT_CHAR 0 +CAP_HEIGHT 6 +X_HEIGHT 4 +ENDPROPERTIES +CHARS 223 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +A0 +10 +80 +10 +80 +50 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +F8 +70 +20 +00 +ENDCHAR +STARTCHAR shade +ENCODING 2 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A8 +50 +A8 +50 +A8 +50 +A8 +ENDCHAR +STARTCHAR uni2409 +ENCODING 3 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +A0 +E0 +A0 +A0 +70 +20 +20 +ENDCHAR +STARTCHAR uni240C +ENCODING 4 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 5 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +80 +80 +60 +30 +28 +30 +28 +ENDCHAR +STARTCHAR uni240A +ENCODING 6 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +80 +E0 +38 +20 +30 +20 +ENDCHAR +STARTCHAR degree +ENCODING 7 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 8 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +70 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +D0 +B0 +90 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni240B +ENCODING 10 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +A0 +A0 +40 +38 +10 +10 +10 +ENDCHAR +STARTCHAR SF040000 +ENCODING 11 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +E0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF030000 +ENCODING 12 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF010000 +ENCODING 13 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF020000 +ENCODING 14 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 15 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23BA +ENCODING 16 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 17 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 18 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 19 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 20 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR SF080000 +ENCODING 21 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF090000 +ENCODING 22 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF070000 +ENCODING 23 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF060000 +ENCODING 24 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF110000 +ENCODING 25 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR lessequal +ENCODING 26 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +20 +40 +20 +10 +70 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 27 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +10 +20 +40 +70 +00 +ENDCHAR +STARTCHAR pi +ENCODING 28 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 29 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +F0 +60 +F0 +40 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 30 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +E0 +40 +50 +A0 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 31 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +20 +00 +20 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A0 +70 +28 +70 +20 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +50 +20 +50 +10 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +A0 +40 +A0 +A0 +50 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +40 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +90 +60 +F0 +60 +90 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +70 +20 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +10 +20 +40 +80 +80 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +60 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +10 +60 +80 +F0 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +20 +60 +10 +90 +60 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +60 +A0 +F0 +20 +20 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +10 +90 +60 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +80 +E0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +10 +20 +20 +40 +40 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +70 +10 +60 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +60 +60 +00 +60 +60 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +30 +30 +00 +30 +20 +40 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +20 +40 +40 +20 +10 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +00 +F0 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +10 +20 +00 +20 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +48 +98 +A8 +A8 +90 +40 +30 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +B0 +90 +60 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +A0 +40 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +A0 +C0 +A0 +A0 +90 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +D0 +F0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +D0 +B0 +60 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +90 +60 +60 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +60 +60 +90 +90 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +88 +88 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +40 +20 +10 +10 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +40 +40 +30 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +10 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +40 +E0 +40 +40 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +90 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +D0 +A8 +A8 +A8 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +90 +70 +10 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +A0 +D0 +80 +80 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +60 +10 +60 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +40 +E0 +40 +50 +20 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +88 +A8 +A8 +50 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +60 +60 +90 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +40 +20 +C0 +20 +40 +30 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +40 +20 +C0 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +E0 +40 +50 +A0 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +88 +70 +50 +70 +88 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +88 +50 +F8 +20 +F8 +20 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +00 +20 +20 +20 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +70 +80 +E0 +90 +70 +10 +E0 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +A8 +C8 +C8 +A8 +70 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +30 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +50 +A0 +50 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +70 +10 +10 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +E8 +D8 +E8 +D8 +70 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +70 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +10 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +10 +60 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +78 +E8 +E8 +68 +28 +28 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +20 +40 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +60 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +20 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +A0 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +80 +A0 +60 +F0 +20 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +A0 +D0 +10 +20 +70 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +40 +80 +60 +A0 +F0 +20 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +20 +40 +50 +20 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +A0 +A0 +F0 +A0 +B0 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +80 +90 +60 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +00 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +48 +E8 +48 +48 +70 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +90 +D0 +B0 +90 +90 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +50 +20 +50 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +B0 +B0 +D0 +D0 +E0 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +88 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +E0 +90 +90 +E0 +80 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +A0 +A0 +90 +A0 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +68 +B0 +78 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +40 +40 +30 +20 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +40 +A0 +10 +70 +90 +60 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +00 +70 +00 +20 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +B0 +D0 +E0 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +90 +90 +70 +90 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/Arial.bdf b/gui/themes/fonts/Arial.bdf new file mode 100644 index 0000000000..8c2d2f264a --- /dev/null +++ b/gui/themes/fonts/Arial.bdf @@ -0,0 +1,1537 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from TrueType font "arial.ttf" by "ttf2bdf 2.8". +COMMENT +FONT -FreeType-Arial-Medium-R-Normal--12-120-75-75-P-57-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 14 13 -1 -3 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 57 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 11 +FONT_DESCENT 2 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_TTF_FONTFILE "arial.ttf" +_TTF_PSNAME "ArialMT" +ENDPROPERTIES +CHARS 96 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 10 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +12 +12 +14 +FF +24 +24 +FF +48 +48 +48 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +70 +A8 +A0 +A0 +E0 +38 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +6100 +9200 +9200 +9400 +6400 +0980 +0A40 +1240 +1240 +2180 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +30 +48 +48 +48 +30 +60 +92 +8A +8C +73 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 160 0 +DWIDTH 2 0 +BBX 1 3 1 7 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 0 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 4 0 6 +BITMAP +20 +F8 +20 +50 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 7 1 1 +BITMAP +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 3 2 -2 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 3 10 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +04 +04 +04 +08 +10 +20 +40 +FC +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +04 +04 +38 +04 +04 +04 +84 +78 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +08 +18 +18 +28 +28 +48 +48 +FC +08 +08 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +7C +40 +40 +80 +F8 +84 +04 +04 +84 +78 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +80 +80 +B8 +C4 +84 +84 +84 +78 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +FC +08 +08 +10 +10 +20 +20 +40 +40 +40 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +84 +84 +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +84 +84 +84 +8C +74 +04 +04 +88 +70 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 7 1 0 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 9 1 -2 +BITMAP +80 +00 +00 +00 +00 +00 +80 +80 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +04 +18 +60 +80 +60 +18 +04 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 4 0 3 +BITMAP +FE +00 +00 +FE +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +80 +60 +18 +04 +18 +60 +80 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +88 +08 +10 +20 +40 +40 +00 +40 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 12 13 0 -3 +BITMAP +0F80 +3040 +4020 +4E90 +9190 +A090 +A110 +A120 +A320 +9DC0 +4010 +2060 +1F80 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1400 +1400 +3600 +2200 +2200 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FC +82 +82 +82 +FC +82 +82 +82 +82 +FC +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +38 +44 +82 +80 +80 +80 +80 +82 +44 +38 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +80 +80 +80 +FE +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +42 +81 +80 +80 +8F +81 +81 +42 +3C +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 10 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +81 +82 +84 +88 +90 +B0 +C8 +84 +82 +81 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +8080 +C180 +C180 +A280 +A280 +9680 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +C2 +A2 +A2 +92 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FC +82 +82 +82 +82 +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +8D +42 +3D +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FC +82 +82 +82 +82 +FC +88 +84 +84 +82 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +82 +82 +80 +70 +0C +02 +82 +82 +7C +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +8080 +8080 +4100 +4100 +2200 +2200 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +8208 +8508 +4510 +4510 +4510 +28A0 +28A0 +28A0 +1040 +1040 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +82 +44 +24 +28 +10 +10 +28 +28 +44 +82 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7E +04 +08 +08 +10 +10 +20 +20 +40 +FE +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 13 1 -3 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 13 1 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 5 0 4 +BITMAP +20 +50 +50 +50 +88 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +08 +78 +88 +98 +68 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +08 +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +30 +40 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 10 1 0 +BITMAP +80 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 3 13 -1 -3 +BITMAP +20 +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +80 +80 +80 +88 +90 +A0 +E0 +90 +90 +88 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 10 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +B300 +CC80 +8880 +8880 +8880 +8880 +8880 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +08 +08 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +8880 +8C80 +5500 +5500 +5500 +2200 +2200 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +50 +50 +20 +50 +50 +88 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +50 +50 +50 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +10 +10 +20 +40 +40 +F8 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 0 -3 +BITMAP +20 +40 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 1 -3 +BITMAP +80 +40 +40 +40 +40 +40 +20 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 2 0 4 +BITMAP +72 +9C +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/Arial12.bdf b/gui/themes/fonts/Arial12.bdf new file mode 100644 index 0000000000..ddca587007 --- /dev/null +++ b/gui/themes/fonts/Arial12.bdf @@ -0,0 +1,7119 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from TrueType font "arialbd.ttf" by "ttf2bdf 2.8". +COMMENT +FONT -FreeType-Arial-Bold-R-Normal--104-750-100-100-P-481-ISO10646-1 +SIZE 75 100 100 +FONTBOUNDINGBOX 105 104 -5 -24 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 104 +POINT_SIZE 750 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 481 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 94 +FONT_DESCENT 22 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_TTF_FONTFILE "arialbd.ttf" +_TTF_PSNAME "Arial-BoldMT" +ENDPROPERTIES +CHARS 96 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 268 0 +DWIDTH 28 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 307 0 +DWIDTH 32 0 +BBX 14 75 9 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +7FFC +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +3FF8 +3FF8 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +3FF0 +1FF0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +1FE0 +0000 +0000 +0000 +0000 +0000 +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 470 0 +DWIDTH 49 0 +BBX 38 27 5 48 +BITMAP +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +FFFC00FFFC +7FF8007FF8 +7FF8007FF8 +7FF8007FF8 +7FF8007FF8 +7FF8007FF8 +7FF8007FF8 +3FF8003FF8 +3FF0003FF0 +3FF0003FF0 +3FF0003FF0 +3FF0003FF0 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 56 75 1 0 +BITMAP +00001FFC003FF8 +00001FFC003FF8 +00003FFC007FF8 +00003FFC007FF8 +00003FF8007FF0 +00003FF8007FF0 +00003FF8007FF0 +00007FF800FFF0 +00007FF000FFE0 +00007FF000FFE0 +00007FF000FFE0 +00007FF000FFE0 +0000FFF001FFE0 +0000FFE001FFC0 +0000FFE001FFC0 +0000FFE001FFC0 +0001FFE003FFC0 +0001FFE003FFC0 +0001FFC003FF80 +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +000FFF001FFE00 +000FFF001FFE00 +000FFE001FFC00 +000FFE001FFC00 +000FFE001FFC00 +001FFE003FFC00 +001FFC003FF800 +001FFC003FF800 +001FFC003FF800 +001FFC003FF800 +003FFC007FF800 +003FF8007FF000 +003FF8007FF000 +003FF8007FF000 +007FF800FFF000 +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +01FFC003FF8000 +01FFC003FF8000 +01FFC003FF8000 +03FFC007FF8000 +03FF8007FF0000 +03FF8007FF0000 +03FF8007FF0000 +07FF800FFF0000 +07FF000FFE0000 +07FF000FFE0000 +07FF000FFE0000 +07FF000FFE0000 +0FFF001FFE0000 +0FFE001FFC0000 +0FFE001FFC0000 +0FFE001FFC0000 +0FFE001FFC0000 +1FFE003FFC0000 +1FFC003FF80000 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 50 90 3 -10 +BITMAP +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +00003FFE000000 +0001FFFFE00000 +000FFFFFF80000 +001FFFFFFE0000 +007FFFFFFF0000 +00FFFFFFFFC000 +01FFFFFFFFE000 +03FFFFFFFFF000 +07FFFFFFFFF000 +07FFFFFFFFF800 +0FFFFFFFFFFC00 +0FFFF7F7FFFC00 +1FFFC7F1FFFE00 +1FFF87F0FFFE00 +1FFF07F07FFE00 +3FFF07F07FFF00 +3FFE07F03FFF00 +3FFE07F03FF800 +3FFE07F01C0000 +3FFE07F0000000 +3FFE07F0000000 +3FFE07F0000000 +3FFE07F0000000 +3FFF07F0000000 +3FFF07F0000000 +1FFF87F0000000 +1FFFC7F0000000 +1FFFF7F0000000 +1FFFFFF0000000 +0FFFFFF0000000 +0FFFFFF0000000 +07FFFFFF000000 +03FFFFFFE00000 +03FFFFFFF80000 +01FFFFFFFE0000 +00FFFFFFFF8000 +007FFFFFFFE000 +001FFFFFFFF000 +000FFFFFFFF800 +0003FFFFFFFC00 +0000FFFFFFFE00 +00001FFFFFFE00 +000007FFFFFF00 +000007FFFFFF00 +000007F7FFFF80 +000007F1FFFF80 +000007F07FFF80 +000007F03FFFC0 +000007F01FFFC0 +000007F00FFFC0 +000007F00FFFC0 +000007F007FFC0 +003807F007FFC0 +1FF807F007FFC0 +FFFC07F007FFC0 +FFFC07F007FFC0 +FFFE07F007FFC0 +7FFE07F00FFF80 +7FFF07F00FFF80 +7FFF87F01FFF80 +3FFF87F03FFF80 +3FFFE7F07FFF00 +3FFFF7F1FFFF00 +1FFFFFFFFFFE00 +1FFFFFFFFFFE00 +0FFFFFFFFFFC00 +07FFFFFFFFF800 +07FFFFFFFFF800 +03FFFFFFFFF000 +01FFFFFFFFE000 +00FFFFFFFF8000 +007FFFFFFF0000 +001FFFFFFC0000 +0007FFFFF00000 +0001FFFFC00000 +00003FFC000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +000007F0000000 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 864 0 +DWIDTH 90 0 +BBX 81 79 4 -3 +BITMAP +000FF000000001FFC00000 +007FFE00000003FF800000 +01FFFF80000003FF800000 +03FFFFC0000007FF000000 +07FFFFE0000007FF000000 +0FFFFFF000000FFE000000 +1FFFFFF800000FFE000000 +3FFFFFFC00001FFC000000 +3FFC3FFC00001FFC000000 +7FF81FFC00003FF8000000 +7FF00FFE00003FF8000000 +7FF00FFE00007FF0000000 +7FF00FFE00007FF0000000 +FFE007FE0000FFE0000000 +FFE007FF0000FFE0000000 +FFE007FF0001FFC0000000 +FFE007FF0001FFC0000000 +FFE007FF0003FF80000000 +FFE007FF0003FF80000000 +FFE007FF0007FF00000000 +FFE007FF0007FF00000000 +FFE007FF000FFE00000000 +FFE007FF000FFE00000000 +FFE007FF001FFC00000000 +FFE007FF001FFC00000000 +FFE007FE003FFC00000000 +7FF00FFE003FF800000000 +7FF00FFE007FF800000000 +7FF00FFE007FF000000000 +7FF81FFC007FF000000000 +3FFC3FFC00FFE000000000 +3FFFFFFC00FFE000000000 +1FFFFFF801FFC000000000 +0FFFFFF001FFC000000000 +0FFFFFE003FF8000000000 +03FFFFC003FF8000000000 +01FFFF8007FF0000000000 +007FFE0007FF0000000000 +000FF0000FFE0000000000 +000000000FFE0000000000 +000000001FFC0007F80000 +000000001FFC003FFF0000 +000000003FF800FFFFC000 +000000003FF801FFFFE000 +000000007FF003FFFFF000 +000000007FF007FFFFF800 +00000000FFE00FFFFFFC00 +00000000FFE01FFFFFFE00 +00000001FFC01FFE1FFE00 +00000001FFC03FFC0FFE00 +00000003FF803FF807FF00 +00000003FF803FF807FF00 +00000007FF003FF807FF00 +00000007FF007FF003FF00 +0000000FFE007FF003FF80 +0000000FFE007FF003FF80 +0000001FFC007FF003FF80 +0000001FFC007FF003FF80 +0000003FF8007FF003FF80 +0000003FF8007FF003FF80 +0000007FF0007FF003FF80 +0000007FF0007FF003FF80 +000000FFE0007FF003FF80 +000000FFE0007FF003FF80 +000001FFC0007FF003FF80 +000001FFC0007FF003FF00 +000003FF80003FF807FF00 +000003FF80003FF807FF00 +000007FF00003FF807FF00 +000007FF00003FFC0FFE00 +00000FFE00001FFE1FFE00 +00000FFE00001FFFFFFE00 +00001FFE00000FFFFFFC00 +00001FFC000007FFFFF800 +00003FFC000003FFFFF000 +00003FF8000001FFFFE000 +00003FF8000000FFFFC000 +00007FF00000003FFF0000 +00007FF000000007F80000 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 69 77 4 -1 +BITMAP +000001FFE000000000 +00001FFFFE00000000 +00007FFFFFC0000000 +0001FFFFFFE0000000 +0003FFFFFFF8000000 +0007FFFFFFFC000000 +000FFFFFFFFE000000 +001FFFFFFFFF000000 +003FFFFFFFFF800000 +003FFFFFFFFF800000 +007FFFC07FFFC00000 +007FFF003FFFC00000 +00FFFE001FFFC00000 +00FFFC000FFFE00000 +00FFFC0007FFE00000 +00FFFC0007FFE00000 +00FFFC0007FFE00000 +00FFFC0007FFE00000 +00FFFE0007FFE00000 +00FFFE000FFFE00000 +007FFF001FFFC00000 +007FFF803FFFC00000 +003FFFC07FFFC00000 +003FFFE0FFFF800000 +001FFFF3FFFF000000 +001FFFFFFFFF000000 +000FFFFFFFFE000000 +0007FFFFFFFC000000 +0007FFFFFFF8000000 +0003FFFFFFE0000000 +0001FFFFFFC0000000 +0000FFFFFF00000000 +0001FFFFFE00000000 +0003FFFFF800000000 +000FFFFFF800000000 +001FFFFFFC00000000 +007FFFFFFC00000000 +00FFFFFFFE00000000 +01FFFFFFFF00000000 +03FFFFFFFF80100000 +07FFFFFFFFC01F0000 +0FFFFCFFFFC03FF800 +0FFFF07FFFE03FFF00 +1FFFE03FFFF07FFE00 +1FFFC03FFFF87FFE00 +3FFF801FFFFC7FFE00 +3FFF000FFFFEFFFC00 +7FFF0007FFFFFFFC00 +7FFE0003FFFFFFFC00 +7FFE0001FFFFFFF800 +FFFC0001FFFFFFF800 +FFFC0000FFFFFFF800 +FFFC00007FFFFFF000 +FFFC00003FFFFFF000 +FFFC00001FFFFFE000 +FFFC00000FFFFFE000 +FFFC00000FFFFFC000 +FFFE000007FFFFC000 +FFFE000003FFFFE000 +FFFF000007FFFFF000 +7FFF00001FFFFFF800 +7FFF80003FFFFFFE00 +7FFFE000FFFFFFFF00 +3FFFF807FFFFFFFFC0 +3FFFFFFFFFFFFFFFE0 +1FFFFFFFFFFFFFFFF8 +1FFFFFFFFFFFFFFFF0 +0FFFFFFFFFFFFFFFF0 +07FFFFFFFFFFFFFFE0 +03FFFFFFFFFE7FFFC0 +01FFFFFFFFFC1FFF80 +00FFFFFFFFF00FFF80 +007FFFFFFFE007FF00 +001FFFFFFF8003FE00 +0007FFFFFE0000FC00 +0001FFFFF800003C00 +00000FFF8000001800 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 240 0 +DWIDTH 25 0 +BBX 14 27 5 48 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +7FF8 +3FF8 +3FF0 +3FF0 +3FF0 +3FF0 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 25 96 5 -21 +BITMAP +0000FF80 +0001FF00 +0003FF00 +0003FF00 +0007FE00 +000FFE00 +000FFC00 +001FFC00 +001FFC00 +003FF800 +003FF800 +007FF800 +007FF000 +00FFF000 +00FFF000 +01FFE000 +01FFE000 +03FFE000 +03FFC000 +07FFC000 +07FFC000 +07FF8000 +0FFF8000 +0FFF8000 +0FFF8000 +1FFF0000 +1FFF0000 +1FFF0000 +3FFF0000 +3FFF0000 +3FFE0000 +3FFE0000 +3FFE0000 +7FFE0000 +7FFE0000 +7FFE0000 +7FFE0000 +7FFC0000 +7FFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +7FFC0000 +7FFC0000 +7FFE0000 +7FFE0000 +7FFE0000 +7FFE0000 +7FFE0000 +3FFE0000 +3FFE0000 +3FFE0000 +3FFF0000 +1FFF0000 +1FFF0000 +1FFF0000 +0FFF0000 +0FFF8000 +0FFF8000 +07FF8000 +07FF8000 +07FFC000 +03FFC000 +03FFC000 +03FFC000 +01FFE000 +01FFE000 +00FFE000 +00FFF000 +007FF000 +007FF000 +003FF800 +003FF800 +001FF800 +001FFC00 +000FFC00 +000FFE00 +0007FE00 +0003FE00 +0003FF00 +0001FF00 +0000FF80 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 25 96 5 -21 +BITMAP +FF800000 +7FC00000 +7FE00000 +7FE00000 +3FF00000 +3FF80000 +1FF80000 +1FFC0000 +1FFC0000 +0FFE0000 +0FFE0000 +0FFF0000 +07FF0000 +07FF8000 +07FF8000 +03FFC000 +03FFC000 +03FFE000 +01FFE000 +01FFF000 +01FFF000 +00FFF000 +00FFF800 +00FFF800 +00FFF800 +007FFC00 +007FFC00 +007FFC00 +007FFE00 +007FFE00 +003FFE00 +003FFE00 +003FFE00 +003FFF00 +003FFF00 +003FFF00 +003FFF00 +003FFF00 +001FFF00 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF80 +001FFF00 +001FFF00 +001FFF00 +003FFF00 +003FFF00 +003FFF00 +003FFF00 +003FFE00 +003FFE00 +003FFE00 +007FFE00 +007FFC00 +007FFC00 +007FFC00 +007FFC00 +007FF800 +00FFF800 +00FFF800 +00FFF000 +00FFF000 +01FFF000 +01FFE000 +01FFE000 +01FFC000 +03FFC000 +03FFC000 +03FF8000 +07FF8000 +07FF0000 +07FF0000 +0FFE0000 +0FFE0000 +0FFC0000 +1FFC0000 +1FF80000 +3FF00000 +3FF00000 +7FE00000 +7FE00000 +7FC00000 +FF800000 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 384 0 +DWIDTH 40 0 +BBX 37 35 1 40 +BITMAP +0003FE0000 +0003FE0000 +0003FE0000 +0003FE0000 +0003FE0000 +0003FE0000 +0003FE0000 +0003FC0000 +1801FC00C0 +1E01FC03C0 +1F81FC0FC0 +3FE1FC3FE0 +3FF9FCFFE0 +7FFFFFFFF0 +7FFFFFFFF0 +7FFFFFFFF0 +FFFFFFFFF8 +3FFFFFFFE0 +00FFFFFC00 +0007FF0000 +000FFF8000 +001FFFC000 +003FFFE000 +007FFFF000 +00FFDFF800 +01FF8FFC00 +03FF07FE00 +07FF07FF00 +0FFE03FF80 +1FFC01FFC0 +0FFC01FF80 +03F800FE00 +01F0007C00 +00F0007800 +0020002000 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 51 51 4 11 +BITMAP +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +00001FFF000000 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 15 31 6 -17 +BITMAP +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +00FE +00FE +00FE +00FE +01FC +01FC +03FC +03F8 +07F8 +1FF0 +7FF0 +FFE0 +7FC0 +7F80 +3F00 +3C00 +1000 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 29 13 5 20 +BITMAP +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +FFFFFFF8 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 14 14 7 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 29 75 0 0 +BITMAP +00003FF8 +00007FF8 +00007FF0 +00007FF0 +00007FF0 +0000FFF0 +0000FFE0 +0000FFE0 +0000FFE0 +0001FFE0 +0001FFE0 +0001FFC0 +0001FFC0 +0003FFC0 +0003FFC0 +0003FF80 +0003FF80 +0007FF80 +0007FF80 +0007FF00 +0007FF00 +0007FF00 +000FFF00 +000FFE00 +000FFE00 +000FFE00 +001FFE00 +001FFC00 +001FFC00 +001FFC00 +003FFC00 +003FF800 +003FF800 +003FF800 +007FF800 +007FF800 +007FF000 +007FF000 +00FFF000 +00FFF000 +00FFE000 +00FFE000 +01FFE000 +01FFE000 +01FFC000 +01FFC000 +01FFC000 +03FFC000 +03FF8000 +03FF8000 +03FF8000 +07FF8000 +07FF0000 +07FF0000 +07FF0000 +0FFF0000 +0FFE0000 +0FFE0000 +0FFE0000 +1FFE0000 +1FFE0000 +1FFC0000 +1FFC0000 +3FFC0000 +3FFC0000 +3FF80000 +3FF80000 +7FF80000 +7FF80000 +7FF00000 +7FF00000 +7FF00000 +FFF00000 +FFE00000 +FFE00000 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 76 4 -1 +BITMAP +00001FFC000000 +0000FFFF800000 +0003FFFFE00000 +000FFFFFF80000 +003FFFFFFC0000 +007FFFFFFF0000 +00FFFFFFFF8000 +01FFFFFFFF8000 +01FFFFFFFFC000 +03FFFFFFFFE000 +07FFFFFFFFE000 +07FFFFFFFFF000 +0FFFFFFFFFF800 +0FFFF80FFFF800 +1FFFE003FFF800 +1FFFC001FFFC00 +1FFF8000FFFC00 +3FFF8000FFFC00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +7FFE00003FFE00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFC00001FFF00 +7FFC00001FFF00 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF00 +7FFC00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF8000FFFC00 +1FFF8000FFFC00 +1FFFC001FFFC00 +1FFFE003FFF800 +0FFFF80FFFF800 +0FFFFFFFFFF800 +07FFFFFFFFF000 +07FFFFFFFFF000 +03FFFFFFFFE000 +01FFFFFFFFC000 +01FFFFFFFFC000 +00FFFFFFFF8000 +007FFFFFFF0000 +001FFFFFFE0000 +000FFFFFF80000 +0003FFFFE00000 +0000FFFF800000 +00001FFC000000 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 32 75 8 0 +BITMAP +00000FFF +00000FFF +00000FFF +00001FFF +00001FFF +00003FFF +00007FFF +0000FFFF +0000FFFF +0001FFFF +0003FFFF +000FFFFF +001FFFFF +003FFFFF +007FFFFF +01FFFFFF +07FFFFFF +0FFFFFFF +7FFFFFFF +FFFFFFFF +FFFFFFFF +FFFFFFFF +FFFFBFFF +FFFF3FFF +FFFE3FFF +FFF83FFF +FFF03FFF +FFE03FFF +FF803FFF +FF003FFF +FC003FFF +F0003FFF +80003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +00003FFF +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 75 4 0 +BITMAP +000007FF000000 +00007FFFF00000 +0003FFFFFC0000 +000FFFFFFF0000 +001FFFFFFF8000 +007FFFFFFFC000 +00FFFFFFFFE000 +01FFFFFFFFF000 +01FFFFFFFFF800 +03FFFFFFFFFC00 +07FFFFFFFFFC00 +07FFFFFFFFFE00 +0FFFFFFFFFFE00 +0FFFFC07FFFF00 +0FFFF001FFFF00 +1FFFE000FFFF00 +1FFFC0007FFF80 +1FFFC0003FFF80 +1FFF80003FFF80 +3FFF80001FFF80 +3FFF00001FFF80 +3FFF00001FFF80 +3FFF00001FFF80 +001F00001FFF80 +000000001FFF80 +000000001FFF80 +000000003FFF00 +000000003FFF00 +000000003FFF00 +000000007FFE00 +000000007FFE00 +00000000FFFE00 +00000001FFFC00 +00000003FFFC00 +00000007FFF800 +00000007FFF800 +0000000FFFF000 +0000001FFFE000 +0000003FFFC000 +0000007FFFC000 +000000FFFF8000 +000001FFFF0000 +000007FFFE0000 +00000FFFFC0000 +00001FFFF80000 +00003FFFF00000 +00007FFFE00000 +0000FFFFC00000 +0001FFFF800000 +0003FFFF000000 +0007FFFE000000 +000FFFFC000000 +001FFFF8000000 +003FFFF0000000 +003FFFE0000000 +007FFF80000000 +00FFFF80000000 +01FFFF00000000 +03FFFE00000000 +03FFFC00000000 +07FFF800000000 +0FFFFFFFFFFF80 +0FFFFFFFFFFF80 +1FFFFFFFFFFF80 +1FFFFFFFFFFF80 +3FFFFFFFFFFF80 +3FFFFFFFFFFF80 +3FFFFFFFFFFF80 +7FFFFFFFFFFF80 +7FFFFFFFFFFF80 +7FFFFFFFFFFF80 +7FFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 76 4 -1 +BITMAP +00001FFC000000 +0000FFFF800000 +0007FFFFE00000 +000FFFFFF80000 +003FFFFFFE0000 +007FFFFFFF0000 +00FFFFFFFF8000 +01FFFFFFFFC000 +03FFFFFFFFC000 +03FFFFFFFFE000 +07FFFFFFFFF000 +07FFFFFFFFF000 +0FFFFFFFFFF800 +0FFFFC0FFFF800 +1FFFF007FFF800 +1FFFE003FFFC00 +1FFFC001FFFC00 +1FFF8000FFFC00 +3FFF8000FFFC00 +3FFF0000FFFC00 +03FF0000FFFC00 +00070000FFFC00 +00000000FFFC00 +00000001FFF800 +00000001FFF800 +00000003FFF800 +00000003FFF000 +0000000FFFE000 +0000003FFFE000 +000007FFFFC000 +000007FFFF8000 +000007FFFF0000 +000007FFFE0000 +000007FFF80000 +000007FFF00000 +000007FFFE0000 +000007FFFF8000 +00000FFFFFC000 +00000FFFFFE000 +00000FFFFFF000 +00000C07FFF800 +00000001FFFC00 +00000000FFFE00 +000000007FFE00 +000000007FFF00 +000000003FFF00 +000000003FFF00 +000000001FFF00 +000000001FFF80 +000000001FFF80 +000000001FFF80 +000000001FFF80 +003C00001FFF80 +3FFC00001FFF80 +FFFC00001FFF80 +FFFE00003FFF80 +FFFE00003FFF80 +7FFF00003FFF00 +7FFF00007FFF00 +7FFF8000FFFF00 +7FFFC001FFFF00 +3FFFE003FFFE00 +3FFFF80FFFFE00 +1FFFFFFFFFFC00 +1FFFFFFFFFFC00 +0FFFFFFFFFF800 +07FFFFFFFFF000 +07FFFFFFFFE000 +03FFFFFFFFC000 +01FFFFFFFF8000 +00FFFFFFFF0000 +003FFFFFFE0000 +001FFFFFFC0000 +0007FFFFF00000 +0001FFFF800000 +00001FFC000000 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 54 74 2 0 +BITMAP +00000000FFF800 +00000000FFF800 +00000001FFF800 +00000003FFF800 +00000003FFF800 +00000007FFF800 +0000000FFFF800 +0000001FFFF800 +0000001FFFF800 +0000003FFFF800 +0000007FFFF800 +0000007FFFF800 +000000FFFFF800 +000001FFFFF800 +000003FFFFF800 +000003FFFFF800 +000007FFFFF800 +00000FFFFFF800 +00000FFFFFF800 +00001FFFFFF800 +00003FFFFFF800 +00007FFFFFF800 +00007FFDFFF800 +0000FFF9FFF800 +0001FFF9FFF800 +0001FFF1FFF800 +0003FFE1FFF800 +0007FFE1FFF800 +0007FFC1FFF800 +000FFF81FFF800 +001FFF01FFF800 +003FFF01FFF800 +003FFE01FFF800 +007FFC01FFF800 +00FFFC01FFF800 +00FFF801FFF800 +01FFF001FFF800 +03FFE001FFF800 +07FFE001FFF800 +07FFC001FFF800 +0FFF8001FFF800 +1FFF8001FFF800 +1FFF0001FFF800 +3FFE0001FFF800 +7FFC0001FFF800 +FFFC0001FFF800 +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +00000001FFF800 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 50 75 4 -1 +BITMAP +003FFFFFFFFE00 +003FFFFFFFFE00 +007FFFFFFFFE00 +007FFFFFFFFE00 +007FFFFFFFFE00 +007FFFFFFFFE00 +007FFFFFFFFE00 +007FFFFFFFFE00 +00FFFFFFFFFE00 +00FFFFFFFFFE00 +00FFFFFFFFFE00 +00FFFFFFFFFE00 +00FFFFFFFFFE00 +01FFFFFFFFFE00 +01FFF800000000 +01FFF800000000 +01FFF800000000 +01FFF800000000 +03FFF800000000 +03FFF000000000 +03FFF000000000 +03FFF000000000 +03FFF000000000 +07FFF000000000 +07FFE0FF800000 +07FFE7FFF00000 +07FFFFFFFC0000 +07FFFFFFFF0000 +0FFFFFFFFF8000 +0FFFFFFFFFC000 +0FFFFFFFFFE000 +0FFFFFFFFFF000 +0FFFFFFFFFF800 +1FFFFFFFFFFC00 +1FFFFFFFFFFC00 +1FFFFFFFFFFE00 +1FFFFFFFFFFE00 +1FFFF807FFFF00 +3FFFE001FFFF00 +3FFF8000FFFF80 +3FFF00007FFF80 +003E00003FFF80 +000000001FFF80 +000000001FFFC0 +000000001FFFC0 +000000000FFFC0 +000000000FFFC0 +000000000FFFC0 +000000000FFFC0 +000000000FFFC0 +000000000FFFC0 +007800000FFFC0 +7FF800000FFFC0 +FFFC00000FFFC0 +FFFC00001FFF80 +FFFC00001FFF80 +7FFE00003FFF80 +7FFE00003FFF80 +7FFF00007FFF00 +3FFF8000FFFF00 +3FFFE003FFFE00 +3FFFF80FFFFE00 +1FFFFFFFFFFC00 +1FFFFFFFFFFC00 +0FFFFFFFFFF800 +07FFFFFFFFF000 +07FFFFFFFFF000 +03FFFFFFFFE000 +01FFFFFFFFC000 +00FFFFFFFF8000 +003FFFFFFE0000 +001FFFFFFC0000 +0007FFFFF00000 +0001FFFFC00000 +00001FFC000000 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 76 4 -1 +BITMAP +000007FE000000 +00003FFFE00000 +0001FFFFF80000 +0003FFFFFC0000 +000FFFFFFE0000 +001FFFFFFF8000 +003FFFFFFFC000 +007FFFFFFFC000 +00FFFFFFFFE000 +01FFFFFFFFF000 +03FFFFFFFFF000 +03FFFFFFFFF800 +07FFFFFFFFF800 +0FFFFC0FFFF800 +0FFFF003FFFC00 +0FFFC001FFFC00 +1FFF8000FFFC00 +1FFF8000FFFE00 +3FFF0000FFFE00 +3FFF00007FFE00 +3FFE00007C0000 +3FFE0000000000 +7FFE0000000000 +7FFC0000000000 +7FFC0000000000 +7FFC0000000000 +7FFC0000000000 +7FFC0000000000 +FFF803FE000000 +FFF81FFFE00000 +FFF87FFFF80000 +FFF8FFFFFE0000 +FFF9FFFFFF0000 +FFFBFFFFFF8000 +FFFFFFFFFFC000 +FFFFFFFFFFE000 +FFFFFFFFFFF000 +FFFFFFFFFFF800 +FFFFFFFFFFF800 +FFFFFFFFFFFC00 +FFFFFFFFFFFE00 +FFFFF80FFFFE00 +FFFFE003FFFE00 +FFFF8000FFFF00 +FFFF00007FFF00 +FFFE00007FFF00 +FFFE00003FFF80 +FFFE00003FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +7FFC00001FFF80 +3FFE00001FFF80 +3FFE00003FFF80 +3FFE00003FFF00 +1FFF00003FFF00 +1FFF80007FFF00 +1FFFC000FFFF00 +0FFFE001FFFE00 +0FFFFC07FFFE00 +07FFFFFFFFFE00 +07FFFFFFFFFC00 +03FFFFFFFFF800 +01FFFFFFFFF800 +01FFFFFFFFF000 +00FFFFFFFFE000 +007FFFFFFFC000 +003FFFFFFF8000 +001FFFFFFF0000 +0007FFFFFC0000 +0001FFFFF80000 +00007FFFC00000 +00000FFE000000 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 74 4 0 +BITMAP +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF00 +FFFFFFFFFFFE00 +00000000FFFC00 +00000001FFF800 +00000001FFF000 +00000003FFE000 +00000007FFE000 +00000007FFC000 +0000000FFF8000 +0000001FFF8000 +0000001FFF0000 +0000003FFE0000 +0000007FFE0000 +0000007FFC0000 +000000FFFC0000 +000001FFF80000 +000001FFF00000 +000003FFF00000 +000003FFE00000 +000007FFE00000 +000007FFC00000 +00000FFFC00000 +00000FFF800000 +00001FFF800000 +00001FFF800000 +00003FFF000000 +00003FFF000000 +00003FFE000000 +00007FFE000000 +00007FFC000000 +0000FFFC000000 +0000FFFC000000 +0000FFF8000000 +0001FFF8000000 +0001FFF8000000 +0001FFF0000000 +0003FFF0000000 +0003FFF0000000 +0003FFF0000000 +0007FFE0000000 +0007FFE0000000 +0007FFE0000000 +0007FFE0000000 +000FFFC0000000 +000FFFC0000000 +000FFFC0000000 +000FFFC0000000 +000FFF80000000 +001FFF80000000 +001FFF80000000 +001FFF80000000 +001FFF80000000 +001FFF80000000 +001FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +003FFF00000000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 76 4 -1 +BITMAP +00001FFC000000 +0003FFFFC00000 +000FFFFFF80000 +003FFFFFFE0000 +007FFFFFFF0000 +00FFFFFFFF8000 +01FFFFFFFFC000 +03FFFFFFFFE000 +07FFFFFFFFF000 +0FFFFFFFFFF000 +0FFFFFFFFFF800 +1FFFFC0FFFFC00 +1FFFE003FFFC00 +1FFFC001FFFC00 +3FFF8000FFFE00 +3FFF8000FFFE00 +3FFF80007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +3FFF00007FFE00 +1FFF0000FFFC00 +1FFF8000FFFC00 +1FFF8000FFFC00 +0FFFC001FFF800 +0FFFE003FFF800 +07FFF80FFFF000 +03FFFFFFFFE000 +01FFFFFFFFC000 +00FFFFFFFF8000 +007FFFFFFF0000 +001FFFFFFC0000 +000FFFFFF80000 +003FFFFFFE0000 +00FFFFFFFF8000 +01FFFFFFFFC000 +03FFFFFFFFE000 +07FFFFFFFFF000 +0FFFF80FFFF800 +1FFFE003FFFC00 +1FFFC001FFFC00 +3FFF8000FFFE00 +3FFF00007FFE00 +7FFF00003FFF00 +7FFE00003FFF00 +7FFE00003FFF00 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFC00001FFF80 +FFFE00003FFF80 +7FFE00003FFF00 +7FFF00003FFF00 +7FFF00007FFF00 +7FFF8000FFFF00 +3FFFC001FFFE00 +3FFFE003FFFE00 +1FFFF80FFFFC00 +1FFFFFFFFFFC00 +0FFFFFFFFFF800 +07FFFFFFFFF000 +03FFFFFFFFE000 +01FFFFFFFFC000 +00FFFFFFFF8000 +007FFFFFFF0000 +001FFFFFFE0000 +0007FFFFF80000 +0001FFFFC00000 +00001FFE000000 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 76 4 -1 +BITMAP +00003FF8000000 +0001FFFF000000 +000FFFFFC00000 +001FFFFFF00000 +007FFFFFF80000 +00FFFFFFFE0000 +01FFFFFFFF0000 +03FFFFFFFF8000 +07FFFFFFFFC000 +0FFFFFFFFFC000 +0FFFFFFFFFE000 +1FFFFFFFFFF000 +3FFFFFFFFFF000 +3FFFF01FFFF800 +3FFFC007FFF800 +7FFF8001FFFC00 +7FFF0000FFFC00 +7FFE00007FFC00 +7FFE00003FFE00 +FFFE00003FFE00 +FFFC00003FFE00 +FFFC00001FFE00 +FFFC00001FFF00 +FFFC00001FFF00 +FFFC00001FFF00 +FFFC00001FFF00 +FFFC00001FFF00 +FFFC00001FFF00 +FFFE00003FFF80 +FFFE00003FFF80 +7FFF00003FFF80 +7FFF00007FFF80 +7FFF8000FFFF80 +7FFFE003FFFF80 +3FFFF80FFFFF80 +3FFFFFFFFFFF80 +1FFFFFFFFFFF80 +1FFFFFFFFFFF80 +0FFFFFFFFFFF80 +07FFFFFFFFFF80 +03FFFFFFFFFF80 +01FFFFFFFFFF80 +00FFFFFFEFFF80 +007FFFFFCFFF80 +003FFFFF8FFF80 +000FFFFF0FFF80 +0003FFFC0FFF80 +00007FE00FFF00 +000000001FFF00 +000000001FFF00 +000000001FFF00 +000000001FFF00 +000000001FFF00 +000000003FFF00 +000000003FFE00 +001F00003FFE00 +3FFF00007FFE00 +3FFF80007FFC00 +3FFF8000FFFC00 +1FFF8000FFFC00 +1FFFC001FFF800 +1FFFE007FFF800 +1FFFF81FFFF000 +0FFFFFFFFFF000 +0FFFFFFFFFE000 +07FFFFFFFFE000 +07FFFFFFFFC000 +03FFFFFFFF8000 +03FFFFFFFF0000 +01FFFFFFFE0000 +00FFFFFFFC0000 +007FFFFFF80000 +003FFFFFE00000 +000FFFFFC00000 +0003FFFE000000 +00007FF0000000 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 326 0 +DWIDTH 34 0 +BBX 14 55 10 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 326 0 +DWIDTH 34 0 +BBX 15 72 9 -17 +BITMAP +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +7FFE +00FE +00FE +00FE +00FE +01FC +01FC +03FC +03F8 +07F8 +1FF0 +7FF0 +FFE0 +7FC0 +7F80 +3F00 +3C00 +1000 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 51 57 4 8 +BITMAP +00000000000020 +000000000000E0 +000000000007E0 +00000000001FE0 +00000000007FE0 +0000000003FFE0 +000000000FFFE0 +000000003FFFE0 +00000000FFFFE0 +00000007FFFFE0 +0000001FFFFFE0 +0000007FFFFFE0 +000003FFFFFFE0 +00000FFFFFFFC0 +00003FFFFFFE00 +0001FFFFFFF800 +0007FFFFFFE000 +001FFFFFFF0000 +007FFFFFFC0000 +03FFFFFFE00000 +0FFFFFFF800000 +3FFFFFFE000000 +FFFFFFF0000000 +FFFFFFC0000000 +FFFFFE00000000 +FFFFF800000000 +FFFFE000000000 +FFFF0000000000 +FFFE0000000000 +FFFF8000000000 +FFFFF000000000 +FFFFFC00000000 +FFFFFF00000000 +FFFFFFE0000000 +FFFFFFF8000000 +3FFFFFFE000000 +0FFFFFFFC00000 +01FFFFFFF00000 +007FFFFFFC0000 +001FFFFFFF8000 +0007FFFFFFE000 +0000FFFFFFF800 +00003FFFFFFF00 +00000FFFFFFFC0 +000003FFFFFFE0 +0000007FFFFFE0 +0000001FFFFFE0 +00000007FFFFE0 +00000000FFFFE0 +000000003FFFE0 +000000000FFFE0 +0000000003FFE0 +00000000007FE0 +00000000001FE0 +000000000007E0 +000000000000E0 +00000000000020 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 52 35 4 20 +BITMAP +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 51 57 4 8 +BITMAP +80000000000000 +E0000000000000 +FC000000000000 +FF000000000000 +FFC00000000000 +FFF80000000000 +FFFE0000000000 +FFFF8000000000 +FFFFE000000000 +FFFFFC00000000 +FFFFFF00000000 +FFFFFFC0000000 +FFFFFFF8000000 +7FFFFFFE000000 +0FFFFFFF800000 +03FFFFFFE00000 +00FFFFFFFC0000 +001FFFFFFF0000 +0007FFFFFFC000 +0001FFFFFFF800 +00003FFFFFFE00 +00000FFFFFFF80 +000003FFFFFFE0 +0000007FFFFFE0 +0000001FFFFFE0 +00000003FFFFE0 +00000000FFFFE0 +000000003FFFE0 +000000000FFFE0 +000000003FFFE0 +00000000FFFFE0 +00000007FFFFE0 +0000001FFFFFE0 +0000007FFFFFE0 +000003FFFFFFE0 +00000FFFFFFF80 +00003FFFFFFE00 +0001FFFFFFF000 +0007FFFFFFC000 +001FFFFFFF0000 +00FFFFFFFC0000 +03FFFFFFE00000 +1FFFFFFF800000 +7FFFFFFE000000 +FFFFFFF0000000 +FFFFFFC0000000 +FFFFFF00000000 +FFFFFC00000000 +FFFFE000000000 +FFFF8000000000 +FFFE0000000000 +FFF80000000000 +FFC00000000000 +FF000000000000 +FC000000000000 +E0000000000000 +80000000000000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 54 76 5 0 +BITMAP +000007FF800000 +0000FFFFFC0000 +0003FFFFFF0000 +000FFFFFFFC000 +003FFFFFFFF000 +007FFFFFFFF800 +01FFFFFFFFFE00 +03FFFFFFFFFF00 +07FFFFFFFFFF80 +0FFFFFFFFFFF80 +0FFFFFFFFFFFC0 +1FFFFF00FFFFE0 +3FFFF8001FFFF0 +3FFFE0000FFFF0 +7FFFC00007FFF8 +7FFF800003FFF8 +7FFF000001FFF8 +FFFF000001FFFC +FFFE000000FFFC +FFFE000000FFFC +FFFC000000FFFC +01FC000000FFFC +0000000000FFFC +0000000000FFFC +0000000001FFFC +0000000001FFFC +0000000003FFF8 +0000000007FFF8 +000000000FFFF8 +000000001FFFF0 +000000003FFFF0 +000000007FFFE0 +00000000FFFFC0 +00000003FFFF80 +00000007FFFF00 +0000000FFFFE00 +0000001FFFFC00 +0000003FFFF800 +0000007FFFF000 +000000FFFFE000 +000001FFFFC000 +000003FFFF8000 +000007FFFF0000 +000007FFFE0000 +00000FFFF80000 +00000FFFF00000 +00000FFFF00000 +00000FFFE00000 +00001FFFC00000 +00001FFFC00000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00000000000000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +00001FFF800000 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 969 0 +DWIDTH 101 0 +BBX 97 100 3 -24 +BITMAP +00000000001FFFE00000000000 +0000000003FFFFFF0000000000 +000000003FFFFFFFF000000000 +00000001FFFFFFFFFC00000000 +00000007FFFFFFFFFF80000000 +0000001FFFFFFFFFFFE0000000 +0000007FFFFFFFFFFFF0000000 +000001FFFFFFFFFFFFFC000000 +000007FFFFFFFFFFFFFE000000 +00000FFFFFFFFFFFFFFF800000 +00001FFFFFF0003FFFFFC00000 +00007FFFFE000001FFFFE00000 +0000FFFFE00000003FFFF00000 +0001FFFF800000000FFFF80000 +0003FFFE0000000003FFFC0000 +0007FFF80000000000FFFC0000 +000FFFE000000000007FFE0000 +000FFFC000000000003FFF0000 +001FFF8000000000000FFF0000 +003FFE00000000000007FF8000 +007FFC00007FC0000007FF8000 +007FF80003FFF80FFF83FFC000 +00FFF8001FFFFE0FFF81FFC000 +00FFF0003FFFFF1FFF80FFE000 +01FFE000FFFFFF9FFF00FFE000 +01FFC001FFFFFFDFFF007FF000 +03FF8003FFFFFFFFFF007FF000 +03FF8007FFFFFFFFFF003FF000 +07FF000FFFFFFFFFFF003FF800 +07FF001FFFF03FFFFE001FF800 +0FFE001FFFC00FFFFE001FF800 +0FFE003FFF0007FFFE001FF800 +1FFC007FFE0003FFFE001FF800 +1FFC007FFC0003FFFE000FFC00 +1FF800FFF80001FFFC000FFC00 +3FF800FFF80001FFFC000FFC00 +3FF801FFF00001FFFC000FFC00 +3FF001FFF00000FFFC000FFC00 +3FF003FFE00000FFFC000FFC00 +7FF003FFE00000FFF8000FFC00 +7FF007FFC00000FFF8000FFC00 +7FE007FFC00000FFF8000FFC00 +7FE007FFC00000FFF8000FFC00 +7FE00FFFC00000FFF8000FFC00 +FFE00FFF800000FFF0001FFC00 +FFE00FFF800000FFF0001FFC00 +FFC00FFF800000FFF0001FF800 +FFC00FFF800001FFF0001FF800 +FFC01FFF000001FFF0003FF800 +FFC01FFF000001FFE0003FF800 +FFC01FFF000001FFE0003FF000 +FFC01FFF000003FFE0007FF000 +FFC01FFF000003FFE0007FF000 +FFC01FFF000003FFE000FFE000 +FFC01FFF000003FFC000FFE000 +FFC01FFF000007FFC001FFC000 +FFC01FFF000007FFC003FFC000 +FFC01FFF00000FFFC003FF8000 +FFC01FFF00000FFFC007FF8000 +FFC01FFF80001FFF800FFF0000 +7FE00FFF80001FFF801FFF0000 +7FE00FFF80003FFF803FFE0000 +7FE00FFFC0007FFF80FFFC0000 +7FE00FFFC000FFFF81FFFC0000 +7FF007FFE001FFFFC7FFF80000 +3FF007FFF003FFFFFFFFF00000 +3FF003FFFC0FFFFFFFFFE00000 +3FF803FFFFFFFFFFFFFFC00000 +3FF801FFFFFFFFFFFFFF800000 +1FF800FFFFFFFFFFFFFF000000 +1FFC007FFFFFFFFFFFFC000000 +1FFC003FFFFFEFFFFFF8000000 +0FFE001FFFFF8FFFFFE0000000 +0FFF000FFFFF07FFFF80000000 +07FF0003FFFC03FFFC00000000 +07FF80003FE000FFC000000000 +03FFC00000000000000007FF80 +03FFC0000000000000000FFF00 +01FFE0000000000000001FFF00 +01FFF0000000000000003FFE00 +00FFF8000000000000007FFE00 +007FFC00000000000000FFFC00 +007FFF00000000000001FFF800 +003FFF80000000000007FFF000 +001FFFE000000000000FFFF000 +000FFFF800000000003FFFE000 +0007FFFE0000000000FFFFC000 +0003FFFFC000000007FFFF8000 +0001FFFFFC0000007FFFFF0000 +0000FFFFFFE0000FFFFFFE0000 +00007FFFFFFFFFFFFFFFF80000 +00001FFFFFFFFFFFFFFFF00000 +000007FFFFFFFFFFFFFFC00000 +000003FFFFFFFFFFFFFF800000 +000000FFFFFFFFFFFFFE000000 +0000001FFFFFFFFFFFF8000000 +00000007FFFFFFFFFFC0000000 +000000007FFFFFFFFE00000000 +0000000007FFFFFFE000000000 +00000000001FFFF80000000000 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 681 0 +DWIDTH 71 0 +BBX 71 75 0 0 +BITMAP +0000000FFFE0000000 +0000000FFFE0000000 +0000001FFFF0000000 +0000001FFFF0000000 +0000003FFFF0000000 +0000003FFFF8000000 +0000003FFFF8000000 +0000007FFFF8000000 +0000007FFFFC000000 +0000007FFFFC000000 +000000FFFFFE000000 +000000FFFFFE000000 +000001FFFFFE000000 +000001FFFFFF000000 +000001FFFFFF000000 +000003FFFFFF800000 +000003FFFFFF800000 +000003FFFFFF800000 +000007FFEFFFC00000 +000007FFEFFFC00000 +00000FFFEFFFC00000 +00000FFFC7FFE00000 +00000FFFC7FFE00000 +00001FFFC3FFF00000 +00001FFF83FFF00000 +00001FFF83FFF00000 +00003FFF01FFF80000 +00003FFF01FFF80000 +00007FFF01FFF80000 +00007FFE00FFFC0000 +00007FFE00FFFC0000 +0000FFFE00FFFE0000 +0000FFFC007FFE0000 +0000FFFC007FFE0000 +0001FFFC003FFF0000 +0001FFF8003FFF0000 +0003FFF8003FFF0000 +0003FFF0001FFF8000 +0003FFF0001FFF8000 +0007FFF0001FFFC000 +0007FFE0000FFFC000 +0007FFE0000FFFC000 +000FFFE0000FFFE000 +000FFFC00007FFE000 +001FFFC00007FFE000 +001FFFFFFFFFFFF000 +001FFFFFFFFFFFF000 +003FFFFFFFFFFFF800 +003FFFFFFFFFFFF800 +003FFFFFFFFFFFF800 +007FFFFFFFFFFFFC00 +007FFFFFFFFFFFFC00 +00FFFFFFFFFFFFFC00 +00FFFFFFFFFFFFFE00 +00FFFFFFFFFFFFFE00 +01FFFFFFFFFFFFFF00 +01FFFFFFFFFFFFFF00 +01FFFFFFFFFFFFFF00 +03FFF80000003FFF80 +03FFF80000001FFF80 +07FFF00000001FFFC0 +07FFF00000001FFFC0 +07FFE00000000FFFC0 +0FFFE00000000FFFE0 +0FFFE00000000FFFE0 +0FFFC000000007FFE0 +1FFFC000000007FFF0 +1FFFC000000003FFF0 +3FFF8000000003FFF8 +3FFF8000000003FFF8 +3FFF8000000001FFF8 +7FFF0000000001FFFC +7FFF0000000001FFFC +7FFF0000000000FFFC +FFFE0000000000FFFE +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 62 75 8 0 +BITMAP +FFFFFFFFFF800000 +FFFFFFFFFFFC0000 +FFFFFFFFFFFF8000 +FFFFFFFFFFFFC000 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFF800 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFF00 +FFFFFFFFFFFFFF00 +FFFFFFFFFFFFFF80 +FFFFFFFFFFFFFF80 +FFFFFFFFFFFFFFC0 +FFFC000003FFFFC0 +FFFC0000007FFFC0 +FFFC0000001FFFE0 +FFFC0000000FFFE0 +FFFC0000000FFFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC0000000FFFC0 +FFFC0000000FFFC0 +FFFC0000001FFFC0 +FFFC0000003FFF80 +FFFC0000007FFF80 +FFFC000003FFFF00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFE000 +FFFFFFFFFFFF8000 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFF00 +FFFFFFFFFFFFFF80 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFE0 +FFFC000003FFFFE0 +FFFC0000003FFFF0 +FFFC0000000FFFF0 +FFFC00000003FFF8 +FFFC00000003FFF8 +FFFC00000001FFF8 +FFFC00000001FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000001FFFC +FFFC00000001FFFC +FFFC00000003FFF8 +FFFC00000007FFF8 +FFFC0000001FFFF8 +FFFC000000FFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFF80 +FFFFFFFFFFFFFF00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFE000 +FFFFFFFFFFFF0000 +FFFFFFFFFFE00000 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 65 76 5 0 +BITMAP +0000000FFF80000000 +000000FFFFF8000000 +000007FFFFFF000000 +00003FFFFFFFC00000 +00007FFFFFFFE00000 +0001FFFFFFFFF80000 +0003FFFFFFFFFC0000 +000FFFFFFFFFFE0000 +001FFFFFFFFFFF0000 +003FFFFFFFFFFF8000 +007FFFFFFFFFFFC000 +00FFFFFFFFFFFFE000 +00FFFFFFFFFFFFF000 +01FFFFF803FFFFF000 +03FFFFC0007FFFF800 +07FFFF00001FFFF800 +07FFFC00000FFFFC00 +0FFFF8000007FFFC00 +0FFFF0000003FFFE00 +1FFFE0000001FFFE00 +1FFFC0000000FFFE00 +1FFF80000000FFFF00 +3FFF800000007FFF00 +3FFF000000007FFC00 +3FFF000000003F8000 +7FFF00000000300000 +7FFE00000000000000 +7FFE00000000000000 +7FFE00000000000000 +7FFE00000000000000 +7FFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFE00000000000000 +7FFE00000000000000 +7FFE00000000100000 +7FFE000000001E0000 +7FFE000000003FC000 +7FFF000000003FF800 +3FFF000000003FFF00 +3FFF000000007FFF80 +3FFF800000007FFF80 +3FFF80000000FFFF00 +1FFFC0000000FFFF00 +1FFFE0000001FFFF00 +0FFFF0000003FFFE00 +0FFFF8000007FFFE00 +07FFFC00000FFFFC00 +07FFFE00001FFFFC00 +03FFFF80007FFFF800 +01FFFFF803FFFFF800 +01FFFFFFFFFFFFF000 +00FFFFFFFFFFFFE000 +007FFFFFFFFFFFC000 +003FFFFFFFFFFFC000 +001FFFFFFFFFFF8000 +000FFFFFFFFFFF0000 +0007FFFFFFFFFE0000 +0001FFFFFFFFF80000 +0000FFFFFFFFF00000 +00003FFFFFFFC00000 +00000FFFFFFF000000 +000001FFFFF8000000 +0000000FFF80000000 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 62 75 8 0 +BITMAP +FFFFFFFFF0000000 +FFFFFFFFFFC00000 +FFFFFFFFFFF00000 +FFFFFFFFFFFC0000 +FFFFFFFFFFFF0000 +FFFFFFFFFFFF8000 +FFFFFFFFFFFFE000 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFF800 +FFFFFFFFFFFFF800 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFF00 +FFFC00007FFFFF00 +FFFC000007FFFF80 +FFFC000001FFFF80 +FFFC0000007FFFC0 +FFFC0000003FFFC0 +FFFC0000001FFFE0 +FFFC0000000FFFE0 +FFFC00000007FFF0 +FFFC00000007FFF0 +FFFC00000003FFF0 +FFFC00000003FFF0 +FFFC00000003FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000000FFF8 +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000000FFFC +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000001FFF8 +FFFC00000003FFF8 +FFFC00000003FFF0 +FFFC00000007FFF0 +FFFC00000007FFF0 +FFFC0000000FFFE0 +FFFC0000000FFFE0 +FFFC0000001FFFC0 +FFFC0000003FFFC0 +FFFC000000FFFF80 +FFFC000003FFFF80 +FFFC00001FFFFF00 +FFFFFFFFFFFFFF00 +FFFFFFFFFFFFFE00 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFFC00 +FFFFFFFFFFFFF800 +FFFFFFFFFFFFF000 +FFFFFFFFFFFFE000 +FFFFFFFFFFFF8000 +FFFFFFFFFFFF0000 +FFFFFFFFFFFC0000 +FFFFFFFFFFF00000 +FFFFFFFFFF800000 +FFFFFFFFF0000000 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 662 0 +DWIDTH 69 0 +BBX 56 75 8 0 +BITMAP +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFFFFFFFFFFFE +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +FFFFFFFFFFFFFF +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 51 75 8 0 +BITMAP +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFFFFFFFFFC00 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 777 0 +DWIDTH 81 0 +BBX 69 77 5 -1 +BITMAP +00000007FFF0000000 +0000007FFFFF800000 +000003FFFFFFF00000 +00001FFFFFFFFC0000 +00003FFFFFFFFF0000 +0000FFFFFFFFFF8000 +0003FFFFFFFFFFC000 +0007FFFFFFFFFFF000 +000FFFFFFFFFFFF800 +001FFFFFFFFFFFFC00 +003FFFFFFFFFFFFC00 +007FFFFFFFFFFFFE00 +00FFFFFFFFFFFFFF00 +01FFFFFE007FFFFF00 +01FFFFE0000FFFFF80 +03FFFF800003FFFFC0 +07FFFE000000FFFFC0 +07FFFC0000007FFFC0 +0FFFF80000003FFFE0 +0FFFF00000001FFFE0 +1FFFE00000000FFFE0 +1FFFC00000000FFFF0 +1FFFC000000007FFF0 +3FFF8000000007FFC0 +3FFF0000000003F800 +3FFF00000000030000 +7FFF00000000000000 +7FFE00000000000000 +7FFE00000000000000 +7FFE00000000000000 +7FFE00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC00000000000000 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +FFFC000007FFFFFFF8 +7FFE000007FFFFFFF8 +7FFE000007FFFFFFF8 +7FFE000007FFFFFFF8 +7FFE000007FFFFFFF8 +7FFF0000000001FFF8 +3FFF0000000001FFF8 +3FFF0000000001FFF8 +3FFF8000000001FFF8 +3FFF8000000001FFF8 +1FFFC000000001FFF8 +1FFFE000000001FFF8 +0FFFE000000001FFF8 +0FFFF000000001FFF8 +07FFF800000003FFF8 +07FFFC00000007FFF8 +03FFFF0000001FFFF8 +03FFFF800000FFFFF8 +01FFFFF00003FFFFF8 +00FFFFFE003FFFFFF8 +00FFFFFFFFFFFFFFF8 +007FFFFFFFFFFFFFF8 +003FFFFFFFFFFFFFF0 +001FFFFFFFFFFFFFE0 +000FFFFFFFFFFFFF80 +0007FFFFFFFFFFFF00 +0001FFFFFFFFFFFC00 +0000FFFFFFFFFFF000 +00003FFFFFFFFFC000 +00000FFFFFFFFE0000 +000003FFFFFFF80000 +0000007FFFFF800000 +00000003FFF0000000 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 59 75 8 0 +BITMAP +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFFFFFFFFFFFFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 14 75 7 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 48 76 2 -1 +BITMAP +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +000000003FFF +01FC00003FFF +FFFC00003FFF +FFFC00003FFF +FFFC00003FFF +FFFC00003FFF +FFFE00007FFF +FFFE00007FFE +7FFE00007FFE +7FFF00007FFE +7FFF0000FFFE +7FFF8001FFFE +7FFFC003FFFC +3FFFF80FFFFC +3FFFFFFFFFFC +1FFFFFFFFFF8 +1FFFFFFFFFF8 +0FFFFFFFFFF0 +0FFFFFFFFFE0 +07FFFFFFFFC0 +03FFFFFFFF80 +01FFFFFFFF00 +00FFFFFFFE00 +007FFFFFFC00 +001FFFFFF000 +0003FFFF8000 +00007FF80000 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 66 75 8 0 +BITMAP +FFFC00000003FFFF80 +FFFC00000007FFFF00 +FFFC0000000FFFFE00 +FFFC0000001FFFFC00 +FFFC0000003FFFF800 +FFFC0000007FFFF000 +FFFC000000FFFFE000 +FFFC000001FFFFC000 +FFFC000003FFFF8000 +FFFC000007FFFF0000 +FFFC00000FFFFE0000 +FFFC00001FFFFC0000 +FFFC00003FFFF80000 +FFFC00003FFFF00000 +FFFC00007FFFE00000 +FFFC0000FFFFC00000 +FFFC0001FFFF800000 +FFFC0003FFFF000000 +FFFC0007FFFE000000 +FFFC000FFFFC000000 +FFFC001FFFF8000000 +FFFC003FFFF0000000 +FFFC007FFFE0000000 +FFFC00FFFFC0000000 +FFFC01FFFF80000000 +FFFC03FFFF80000000 +FFFC07FFFF00000000 +FFFC0FFFFE00000000 +FFFC1FFFFC00000000 +FFFC1FFFF800000000 +FFFC3FFFFC00000000 +FFFC7FFFFE00000000 +FFFCFFFFFE00000000 +FFFDFFFFFF00000000 +FFFFFFFFFF80000000 +FFFFFFFFFF80000000 +FFFFFFFFFFC0000000 +FFFFFFFFFFC0000000 +FFFFFFFFFFE0000000 +FFFFFFFFFFF0000000 +FFFFFFFFFFF0000000 +FFFFFFBFFFF8000000 +FFFFFF1FFFFC000000 +FFFFFE1FFFFC000000 +FFFFFC0FFFFE000000 +FFFFF807FFFF000000 +FFFFF007FFFF000000 +FFFFE003FFFF800000 +FFFFC003FFFFC00000 +FFFF8001FFFFC00000 +FFFF0000FFFFE00000 +FFFE0000FFFFE00000 +FFFC00007FFFF00000 +FFFC00007FFFF80000 +FFFC00003FFFF80000 +FFFC00001FFFFC0000 +FFFC00001FFFFE0000 +FFFC00000FFFFE0000 +FFFC00000FFFFF0000 +FFFC000007FFFF8000 +FFFC000003FFFF8000 +FFFC000003FFFFC000 +FFFC000001FFFFC000 +FFFC000000FFFFE000 +FFFC000000FFFFF000 +FFFC0000007FFFF000 +FFFC0000007FFFF800 +FFFC0000003FFFFC00 +FFFC0000001FFFFC00 +FFFC0000001FFFFE00 +FFFC0000000FFFFF00 +FFFC0000000FFFFF00 +FFFC00000007FFFF80 +FFFC00000003FFFFC0 +FFFC00000003FFFFC0 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 75 8 0 +BITMAP +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 835 0 +DWIDTH 87 0 +BBX 73 75 7 0 +BITMAP +FFFFFF0000007FFFFF80 +FFFFFF0000007FFFFF80 +FFFFFF800000FFFFFF80 +FFFFFF800000FFFFFF80 +FFFFFF800000FFFFFF80 +FFFFFF800000FFFFFF80 +FFFFFFC00001FFFFFF80 +FFFFFFC00001FFFFFF80 +FFFFFFC00001FFFFFF80 +FFFFFFC00001FFFFFF80 +FFFFFFE00003FFFFFF80 +FFFFFFE00003FFFFFF80 +FFFFFFE00003FFFFFF80 +FFFFFFE00003FFFFFF80 +FFFFFFF00007FFFFFF80 +FFFFFFF00007FFFFFF80 +FFFFFFF00007FFDFFF80 +FFFFFFF00007FFDFFF80 +FFFDFFF8000FFFDFFF80 +FFFDFFF8000FFFDFFF80 +FFFCFFF8000FFF9FFF80 +FFFCFFF8000FFF9FFF80 +FFFCFFFC001FFF9FFF80 +FFFCFFFC001FFF9FFF80 +FFFC7FFC001FFF9FFF80 +FFFC7FFC001FFF1FFF80 +FFFC7FFE003FFF1FFF80 +FFFC7FFE003FFF1FFF80 +FFFC7FFE003FFF1FFF80 +FFFC3FFE003FFE1FFF80 +FFFC3FFE003FFE1FFF80 +FFFC3FFF007FFE1FFF80 +FFFC3FFF007FFE1FFF80 +FFFC1FFF007FFC1FFF80 +FFFC1FFF007FFC1FFF80 +FFFC1FFF80FFFC1FFF80 +FFFC1FFF80FFFC1FFF80 +FFFC0FFF80FFF81FFF80 +FFFC0FFF80FFF81FFF80 +FFFC0FFFC1FFF81FFF80 +FFFC0FFFC1FFF81FFF80 +FFFC0FFFC1FFF81FFF80 +FFFC07FFC1FFF01FFF80 +FFFC07FFE3FFF01FFF80 +FFFC07FFE3FFF01FFF80 +FFFC07FFE3FFF01FFF80 +FFFC03FFE3FFE01FFF80 +FFFC03FFF7FFE01FFF80 +FFFC03FFF7FFE01FFF80 +FFFC03FFF7FFE01FFF80 +FFFC01FFF7FFC01FFF80 +FFFC01FFFFFFC01FFF80 +FFFC01FFFFFFC01FFF80 +FFFC01FFFFFFC01FFF80 +FFFC00FFFFFF801FFF80 +FFFC00FFFFFF801FFF80 +FFFC00FFFFFF801FFF80 +FFFC00FFFFFF801FFF80 +FFFC00FFFFFF801FFF80 +FFFC007FFFFF001FFF80 +FFFC007FFFFF001FFF80 +FFFC007FFFFF001FFF80 +FFFC007FFFFF001FFF80 +FFFC003FFFFE001FFF80 +FFFC003FFFFE001FFF80 +FFFC003FFFFE001FFF80 +FFFC003FFFFE001FFF80 +FFFC001FFFFC001FFF80 +FFFC001FFFFC001FFF80 +FFFC001FFFFC001FFF80 +FFFC001FFFFC001FFF80 +FFFC000FFFF8001FFF80 +FFFC000FFFF8001FFF80 +FFFC000FFFF8001FFF80 +FFFC000FFFF8001FFF80 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 59 75 8 0 +BITMAP +FFFE00000007FFE0 +FFFF00000007FFE0 +FFFF00000007FFE0 +FFFF80000007FFE0 +FFFF80000007FFE0 +FFFFC0000007FFE0 +FFFFE0000007FFE0 +FFFFE0000007FFE0 +FFFFF0000007FFE0 +FFFFF0000007FFE0 +FFFFF8000007FFE0 +FFFFFC000007FFE0 +FFFFFC000007FFE0 +FFFFFE000007FFE0 +FFFFFE000007FFE0 +FFFFFF000007FFE0 +FFFFFF800007FFE0 +FFFFFF800007FFE0 +FFFFFFC00007FFE0 +FFFFFFC00007FFE0 +FFFFFFE00007FFE0 +FFFFFFF00007FFE0 +FFFFFFF00007FFE0 +FFFFFFF80007FFE0 +FFFFFFF80007FFE0 +FFFFFFFC0007FFE0 +FFFDFFFE0007FFE0 +FFFDFFFE0007FFE0 +FFFCFFFF0007FFE0 +FFFCFFFF0007FFE0 +FFFC7FFF8007FFE0 +FFFC3FFFC007FFE0 +FFFC3FFFC007FFE0 +FFFC1FFFE007FFE0 +FFFC1FFFE007FFE0 +FFFC0FFFF007FFE0 +FFFC07FFF807FFE0 +FFFC07FFF807FFE0 +FFFC03FFFC07FFE0 +FFFC03FFFE07FFE0 +FFFC01FFFE07FFE0 +FFFC00FFFF07FFE0 +FFFC00FFFF07FFE0 +FFFC007FFF87FFE0 +FFFC007FFFC7FFE0 +FFFC003FFFC7FFE0 +FFFC001FFFE7FFE0 +FFFC001FFFE7FFE0 +FFFC000FFFF7FFE0 +FFFC000FFFFFFFE0 +FFFC0007FFFFFFE0 +FFFC0003FFFFFFE0 +FFFC0003FFFFFFE0 +FFFC0001FFFFFFE0 +FFFC0000FFFFFFE0 +FFFC0000FFFFFFE0 +FFFC00007FFFFFE0 +FFFC00007FFFFFE0 +FFFC00003FFFFFE0 +FFFC00001FFFFFE0 +FFFC00001FFFFFE0 +FFFC00000FFFFFE0 +FFFC00000FFFFFE0 +FFFC000007FFFFE0 +FFFC000003FFFFE0 +FFFC000003FFFFE0 +FFFC000001FFFFE0 +FFFC000001FFFFE0 +FFFC000000FFFFE0 +FFFC0000007FFFE0 +FFFC0000007FFFE0 +FFFC0000003FFFE0 +FFFC0000003FFFE0 +FFFC0000001FFFE0 +FFFC0000000FFFE0 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 777 0 +DWIDTH 81 0 +BBX 71 77 5 -1 +BITMAP +0000000FFFC0000000 +000000FFFFFE000000 +000007FFFFFFC00000 +00003FFFFFFFF00000 +00007FFFFFFFFC0000 +0001FFFFFFFFFF0000 +0003FFFFFFFFFF8000 +000FFFFFFFFFFFC000 +001FFFFFFFFFFFE000 +003FFFFFFFFFFFF800 +007FFFFFFFFFFFFC00 +007FFFFFFFFFFFFC00 +00FFFFFFFFFFFFFE00 +01FFFFFE007FFFFF00 +03FFFFE0000FFFFF80 +03FFFF800003FFFF80 +07FFFE000000FFFFC0 +0FFFFC0000007FFFC0 +0FFFF80000003FFFE0 +1FFFF00000001FFFE0 +1FFFE00000000FFFF0 +1FFFC000000007FFF0 +3FFFC000000007FFF8 +3FFF8000000003FFF8 +3FFF8000000001FFF8 +7FFF0000000001FFF8 +7FFF0000000001FFFC +7FFE0000000000FFFC +7FFE0000000000FFFC +7FFE0000000000FFFC +7FFE0000000000FFFC +FFFE0000000000FFFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFC00000000007FFE +FFFE0000000000FFFE +FFFE0000000000FFFC +7FFE0000000000FFFC +7FFE0000000000FFFC +7FFF0000000001FFFC +7FFF0000000001FFFC +7FFF0000000001FFFC +3FFF8000000003FFF8 +3FFF8000000003FFF8 +3FFFC000000007FFF8 +1FFFC000000007FFF0 +1FFFE00000000FFFF0 +1FFFF00000001FFFE0 +0FFFF80000003FFFE0 +0FFFFC0000007FFFE0 +07FFFF000000FFFFC0 +07FFFF800003FFFF80 +03FFFFE0000FFFFF80 +01FFFFFE007FFFFF00 +00FFFFFFFFFFFFFE00 +00FFFFFFFFFFFFFE00 +007FFFFFFFFFFFFC00 +003FFFFFFFFFFFF800 +001FFFFFFFFFFFF000 +000FFFFFFFFFFFE000 +0003FFFFFFFFFF8000 +0001FFFFFFFFFF0000 +00007FFFFFFFFC0000 +00001FFFFFFFF00000 +000007FFFFFFC00000 +000000FFFFFE000000 +00000007FFC0000000 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 662 0 +DWIDTH 69 0 +BBX 56 75 8 0 +BITMAP +FFFFFFFFF80000 +FFFFFFFFFFC000 +FFFFFFFFFFF800 +FFFFFFFFFFFC00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF80 +FFFFFFFFFFFFC0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFC00007FFFFC +FFFC00000FFFFE +FFFC000003FFFE +FFFC000001FFFE +FFFC000000FFFE +FFFC0000007FFF +FFFC0000007FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000007FFF +FFFC0000007FFF +FFFC000000FFFE +FFFC000001FFFE +FFFC000003FFFE +FFFC00000FFFFE +FFFC0000FFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF8 +FFFFFFFFFFFFF0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFC0 +FFFFFFFFFFFF80 +FFFFFFFFFFFF00 +FFFFFFFFFFFE00 +FFFFFFFFFFF800 +FFFFFFFFFFE000 +FFFFFFFFFF8000 +FFFFFFFFE00000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 777 0 +DWIDTH 81 0 +BBX 74 83 5 -7 +BITMAP +00000007FFC000000000 +000000FFFFFE00000000 +000007FFFFFFC0000000 +00001FFFFFFFF0000000 +00007FFFFFFFFC000000 +0001FFFFFFFFFF000000 +0003FFFFFFFFFF800000 +000FFFFFFFFFFFE00000 +001FFFFFFFFFFFF00000 +003FFFFFFFFFFFF80000 +007FFFFFFFFFFFFC0000 +00FFFFFFFFFFFFFE0000 +00FFFFFFFFFFFFFE0000 +01FFFFFE007FFFFF0000 +03FFFFE0000FFFFF8000 +03FFFF800003FFFFC000 +07FFFE000000FFFFC000 +0FFFFC0000007FFFE000 +0FFFF80000003FFFE000 +1FFFF00000001FFFF000 +1FFFE00000000FFFF000 +1FFFC000000007FFF000 +3FFFC000000007FFF800 +3FFF8000000003FFF800 +3FFF8000000003FFF800 +7FFF0000000001FFFC00 +7FFF0000000001FFFC00 +7FFE0000000000FFFC00 +7FFE0000000000FFFC00 +7FFE0000000000FFFC00 +FFFE0000000000FFFC00 +FFFC0000000000FFFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC00000000007FFE00 +FFFC0000000000FFFE00 +FFFE0000000000FFFE00 +7FFE0000000000FFFC00 +7FFE0000000000FFFC00 +7FFE0000000000FFFC00 +7FFE0000000001FFFC00 +7FFF00000C0001FFFC00 +7FFF00001F0003FFF800 +3FFF80001FC003FFF800 +3FFF80001FF007FFF800 +3FFFC0003FFC07FFF800 +1FFFC0003FFE0FFFF000 +1FFFE0007FFF9FFFF000 +1FFFF0007FFFFFFFE000 +0FFFF800FFFFFFFFE000 +0FFFFC007FFFFFFFC000 +07FFFE000FFFFFFFC000 +07FFFF8003FFFFFF8000 +03FFFFE000FFFFFF8000 +01FFFFFC01FFFFFF0000 +01FFFFFFFFFFFFFE0000 +00FFFFFFFFFFFFFC0000 +007FFFFFFFFFFFFE0000 +003FFFFFFFFFFFFF8000 +001FFFFFFFFFFFFFC000 +000FFFFFFFFFFFFFF000 +0003FFFFFFFFFFFFFC00 +0001FFFFFFFFFFFFFF80 +00007FFFFFFFFFFFFFC0 +00001FFFFFFFFFFFFF80 +000007FFFFFFC7FFFF80 +000000FFFFFE01FFFF00 +00000007FFE000FFFF00 +000000000000003FFE00 +000000000000001FFE00 +0000000000000007FC00 +0000000000000003FC00 +0000000000000000F800 +00000000000000001800 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 66 75 8 0 +BITMAP +FFFFFFFFFF80000000 +FFFFFFFFFFFE000000 +FFFFFFFFFFFF800000 +FFFFFFFFFFFFE00000 +FFFFFFFFFFFFF80000 +FFFFFFFFFFFFFC0000 +FFFFFFFFFFFFFE0000 +FFFFFFFFFFFFFF0000 +FFFFFFFFFFFFFF0000 +FFFFFFFFFFFFFF8000 +FFFFFFFFFFFFFF8000 +FFFFFFFFFFFFFFC000 +FFFFFFFFFFFFFFC000 +FFFC000001FFFFE000 +FFFC0000003FFFE000 +FFFC0000001FFFE000 +FFFC0000000FFFF000 +FFFC00000007FFF000 +FFFC00000007FFF000 +FFFC00000003FFF000 +FFFC00000003FFF000 +FFFC00000003FFF000 +FFFC00000003FFF000 +FFFC00000003FFF000 +FFFC00000003FFF000 +FFFC00000007FFF000 +FFFC00000007FFE000 +FFFC0000000FFFE000 +FFFC0000001FFFE000 +FFFC0000003FFFE000 +FFFC000003FFFFC000 +FFFFFFFFFFFFFFC000 +FFFFFFFFFFFFFF8000 +FFFFFFFFFFFFFF8000 +FFFFFFFFFFFFFF0000 +FFFFFFFFFFFFFE0000 +FFFFFFFFFFFFFC0000 +FFFFFFFFFFFFF80000 +FFFFFFFFFFFFF00000 +FFFFFFFFFFFFC00000 +FFFFFFFFFFFF000000 +FFFFFFFFFFF0000000 +FFFFFFFFFFC0000000 +FFFFFFFFFFF0000000 +FFFC00FFFFF8000000 +FFFC001FFFFC000000 +FFFC0007FFFE000000 +FFFC0003FFFF000000 +FFFC0001FFFF800000 +FFFC0000FFFFC00000 +FFFC00007FFFE00000 +FFFC00003FFFE00000 +FFFC00001FFFF00000 +FFFC00001FFFF80000 +FFFC00000FFFF80000 +FFFC000007FFFC0000 +FFFC000003FFFE0000 +FFFC000001FFFE0000 +FFFC000001FFFF0000 +FFFC000000FFFF0000 +FFFC0000007FFF8000 +FFFC0000007FFFC000 +FFFC0000003FFFC000 +FFFC0000003FFFE000 +FFFC0000001FFFE000 +FFFC0000000FFFF000 +FFFC0000000FFFF800 +FFFC00000007FFF800 +FFFC00000003FFFC00 +FFFC00000003FFFE00 +FFFC00000001FFFE00 +FFFC00000001FFFF00 +FFFC00000000FFFF00 +FFFC000000007FFF80 +FFFC000000007FFFC0 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 662 0 +DWIDTH 69 0 +BBX 60 77 4 -1 +BITMAP +000001FFF0000000 +00003FFFFF800000 +0001FFFFFFF00000 +0007FFFFFFFC0000 +000FFFFFFFFE0000 +003FFFFFFFFF8000 +007FFFFFFFFFC000 +00FFFFFFFFFFE000 +01FFFFFFFFFFF000 +01FFFFFFFFFFF800 +03FFFFFFFFFFF800 +07FFFFFFFFFFFC00 +07FFFFFFFFFFFC00 +0FFFFF803FFFFE00 +0FFFF80007FFFE00 +0FFFF00001FFFF00 +1FFFE00000FFFF00 +1FFFC000007FFF00 +1FFF8000007FFF00 +1FFF8000003FFF80 +1FFF8000003FFF80 +1FFF8000003FFF80 +1FFF8000001FFF80 +1FFFC000001FC000 +1FFFE00000000000 +1FFFF00000000000 +0FFFFC0000000000 +0FFFFF0000000000 +0FFFFFE000000000 +07FFFFFE00000000 +07FFFFFFE0000000 +03FFFFFFFE000000 +01FFFFFFFFE00000 +01FFFFFFFFF80000 +00FFFFFFFFFF0000 +007FFFFFFFFFC000 +003FFFFFFFFFE000 +000FFFFFFFFFF800 +0007FFFFFFFFFC00 +0001FFFFFFFFFE00 +00003FFFFFFFFF00 +000007FFFFFFFF00 +000000FFFFFFFF80 +0000000FFFFFFFC0 +00000000FFFFFFC0 +000000000FFFFFC0 +0000000001FFFFE0 +00000000003FFFE0 +00000000001FFFE0 +00000000000FFFF0 +01FC00000007FFF0 +FFFC00000003FFF0 +FFFE00000003FFF0 +FFFE00000003FFF0 +7FFE00000003FFF0 +7FFF00000003FFF0 +7FFF00000003FFF0 +7FFF80000007FFF0 +3FFF80000007FFF0 +3FFFC000000FFFE0 +3FFFE000001FFFE0 +1FFFF800007FFFE0 +1FFFFE0000FFFFC0 +0FFFFFC00FFFFFC0 +0FFFFFFFFFFFFF80 +07FFFFFFFFFFFF80 +07FFFFFFFFFFFF00 +03FFFFFFFFFFFF00 +01FFFFFFFFFFFE00 +00FFFFFFFFFFFC00 +007FFFFFFFFFF800 +003FFFFFFFFFE000 +000FFFFFFFFFC000 +0003FFFFFFFF0000 +0000FFFFFFFC0000 +00001FFFFFE00000 +000001FFFC000000 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 604 0 +DWIDTH 63 0 +BBX 58 75 3 0 +BITMAP +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +FFFFFFFFFFFFFFC0 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +000003FFF0000000 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 75 0 +BBX 59 76 8 -1 +BITMAP +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC00000007FFE0 +FFFC0000000FFFE0 +7FFE0000000FFFC0 +7FFE0000000FFFC0 +7FFE0000000FFFC0 +7FFF0000001FFFC0 +7FFF8000001FFFC0 +7FFF8000003FFFC0 +3FFFC000007FFF80 +3FFFF00000FFFF80 +3FFFFC0003FFFF80 +1FFFFF801FFFFF00 +1FFFFFFFFFFFFF00 +0FFFFFFFFFFFFE00 +0FFFFFFFFFFFFE00 +07FFFFFFFFFFFC00 +03FFFFFFFFFFF800 +01FFFFFFFFFFF800 +00FFFFFFFFFFF000 +007FFFFFFFFFC000 +001FFFFFFFFF8000 +000FFFFFFFFE0000 +0003FFFFFFF80000 +00007FFFFFC00000 +000003FFFC000000 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 662 0 +DWIDTH 69 0 +BBX 69 75 0 0 +BITMAP +FFFE0000000003FFF8 +7FFE0000000003FFF0 +7FFF0000000007FFF0 +7FFF0000000007FFF0 +3FFF0000000007FFE0 +3FFF800000000FFFE0 +3FFF800000000FFFE0 +1FFF800000000FFFC0 +1FFFC00000001FFFC0 +1FFFC00000001FFFC0 +0FFFC00000003FFF80 +0FFFE00000003FFF80 +07FFE00000003FFF00 +07FFF00000007FFF00 +07FFF00000007FFF00 +03FFF00000007FFE00 +03FFF8000000FFFE00 +03FFF8000000FFFE00 +01FFF8000000FFFC00 +01FFFC000001FFFC00 +01FFFC000001FFFC00 +00FFFC000001FFF800 +00FFFE000003FFF800 +007FFE000003FFF000 +007FFE000003FFF000 +007FFF000007FFF000 +003FFF000007FFE000 +003FFF000007FFE000 +003FFF80000FFFE000 +001FFF80000FFFC000 +001FFFC0001FFFC000 +000FFFC0001FFF8000 +000FFFC0001FFF8000 +000FFFE0003FFF8000 +0007FFE0003FFF0000 +0007FFE0003FFF0000 +0007FFF0007FFF0000 +0003FFF0007FFE0000 +0003FFF0007FFE0000 +0003FFF800FFFE0000 +0001FFF800FFFC0000 +0001FFF800FFFC0000 +0000FFFC01FFF80000 +0000FFFC01FFF80000 +0000FFFC01FFF80000 +00007FFE03FFF00000 +00007FFE03FFF00000 +00007FFF07FFF00000 +00003FFF07FFE00000 +00003FFF07FFE00000 +00003FFF8FFFE00000 +00001FFF8FFFC00000 +00001FFF8FFFC00000 +00000FFFDFFF800000 +00000FFFDFFF800000 +00000FFFDFFF800000 +000007FFFFFF000000 +000007FFFFFF000000 +000007FFFFFF000000 +000003FFFFFE000000 +000003FFFFFE000000 +000001FFFFFE000000 +000001FFFFFC000000 +000001FFFFFC000000 +000000FFFFF8000000 +000000FFFFF8000000 +000000FFFFF8000000 +0000007FFFF0000000 +0000007FFFF0000000 +0000007FFFF0000000 +0000003FFFE0000000 +0000003FFFE0000000 +0000001FFFC0000000 +0000001FFFC0000000 +0000001FFFC0000000 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 950 0 +DWIDTH 99 0 +BBX 99 75 0 0 +BITMAP +FFFC000000FFFFE000000FFFE0 +FFFE000000FFFFE000000FFFE0 +7FFE000000FFFFE000000FFFC0 +7FFE000001FFFFF000000FFFC0 +7FFE000001FFFFF000000FFFC0 +7FFF000001FFFFF000001FFFC0 +3FFF000003FFFFF800001FFF80 +3FFF000003FFFFF800001FFF80 +3FFF000003FFFFF800001FFF80 +3FFF800003FFFFF800003FFF80 +1FFF800007FFFFFC00003FFF00 +1FFF800007FFFFFC00003FFF00 +1FFF800007FFFFFC00003FFF00 +1FFFC00007FFFFFC00007FFF00 +0FFFC0000FFFFFFE00007FFE00 +0FFFC0000FFFFFFE00007FFE00 +0FFFC0000FFFFFFE00007FFE00 +0FFFC0000FFFFFFE00007FFE00 +07FFE0001FFFFFFF0000FFFC00 +07FFE0001FFFBFFF0000FFFC00 +07FFE0001FFFBFFF0000FFFC00 +07FFE0003FFFBFFF0000FFFC00 +03FFF0003FFFBFFF8001FFFC00 +03FFF0003FFF1FFF8001FFF800 +03FFF0003FFF1FFF8001FFF800 +03FFF0007FFF1FFF8001FFF800 +01FFF8007FFF1FFFC003FFF800 +01FFF8007FFE0FFFC003FFF000 +01FFF8007FFE0FFFC003FFF000 +01FFF800FFFE0FFFE003FFF000 +00FFFC00FFFC07FFE003FFF000 +00FFFC00FFFC07FFE007FFE000 +00FFFC00FFFC07FFE007FFE000 +00FFFC01FFFC07FFF007FFE000 +007FFC01FFF803FFF007FFE000 +007FFE01FFF803FFF00FFFC000 +007FFE03FFF803FFF00FFFC000 +007FFE03FFF803FFF80FFFC000 +003FFE03FFF001FFF80FFFC000 +003FFF03FFF001FFF81FFF8000 +003FFF07FFF001FFF81FFF8000 +003FFF07FFF001FFFC1FFF8000 +001FFF07FFE000FFFC1FFF8000 +001FFF87FFE000FFFC1FFF0000 +001FFF8FFFE000FFFC3FFF0000 +001FFF8FFFC000FFFE3FFF0000 +000FFF8FFFC0007FFE3FFF0000 +000FFFCFFFC0007FFE3FFE0000 +000FFFDFFFC0007FFE7FFE0000 +000FFFDFFF80003FFF7FFE0000 +0007FFDFFF80003FFF7FFE0000 +0007FFFFFF80003FFF7FFC0000 +0007FFFFFF80003FFFFFFC0000 +0007FFFFFF00001FFFFFFC0000 +0003FFFFFF00001FFFFFFC0000 +0003FFFFFF00001FFFFFF80000 +0003FFFFFF00001FFFFFF80000 +0003FFFFFE00000FFFFFF80000 +0001FFFFFE00000FFFFFF80000 +0001FFFFFE00000FFFFFF00000 +0001FFFFFC00000FFFFFF00000 +0001FFFFFC000007FFFFF00000 +0000FFFFFC000007FFFFF00000 +0000FFFFFC000007FFFFE00000 +0000FFFFF8000007FFFFE00000 +0000FFFFF8000003FFFFE00000 +00007FFFF8000003FFFFE00000 +00007FFFF8000003FFFFC00000 +00007FFFF0000003FFFFC00000 +00007FFFF0000001FFFFC00000 +00003FFFF0000001FFFFC00000 +00003FFFF0000001FFFF800000 +00003FFFE0000000FFFF800000 +00003FFFE0000000FFFF800000 +00001FFFE0000000FFFF800000 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 662 0 +DWIDTH 69 0 +BBX 67 75 1 0 +BITMAP +1FFFE0000000FFFF00 +1FFFF0000001FFFF00 +0FFFF0000001FFFE00 +07FFF8000003FFFC00 +07FFFC000007FFFC00 +03FFFC000007FFF800 +01FFFE00000FFFF000 +01FFFF00001FFFF000 +00FFFF00001FFFE000 +007FFF80003FFFC000 +007FFFC0007FFFC000 +003FFFC0007FFF8000 +001FFFE000FFFF0000 +001FFFF001FFFF0000 +000FFFF001FFFE0000 +0007FFF803FFFC0000 +0007FFFC07FFFC0000 +0003FFFC07FFF80000 +0001FFFE0FFFF80000 +0001FFFE1FFFF00000 +0000FFFF1FFFE00000 +0000FFFFBFFFE00000 +00007FFFBFFFC00000 +00003FFFFFFF800000 +00003FFFFFFF800000 +00001FFFFFFF000000 +00000FFFFFFE000000 +00000FFFFFFE000000 +000007FFFFFC000000 +000003FFFFF8000000 +000003FFFFF8000000 +000001FFFFF0000000 +000000FFFFE0000000 +000000FFFFE0000000 +0000007FFFC0000000 +0000007FFFC0000000 +000000FFFFE0000000 +000000FFFFE0000000 +000001FFFFF0000000 +000001FFFFF0000000 +000003FFFFF8000000 +000007FFFFFC000000 +000007FFFFFC000000 +00000FFFFFFE000000 +00001FFFFFFF000000 +00001FFFFFFF000000 +00003FFFFFFF800000 +00007FFFFFFFC00000 +00007FFFBFFFC00000 +0000FFFF1FFFE00000 +0001FFFF1FFFF00000 +0001FFFE0FFFF00000 +0003FFFC07FFF80000 +0007FFFC07FFFC0000 +0007FFF803FFFC0000 +000FFFF803FFFE0000 +001FFFF001FFFE0000 +001FFFE000FFFF0000 +003FFFE000FFFF8000 +003FFFC0007FFF8000 +007FFF80003FFFC000 +00FFFF80003FFFE000 +00FFFF00001FFFE000 +01FFFE00000FFFF000 +03FFFE00000FFFF800 +03FFFC000007FFF800 +07FFF8000003FFFC00 +0FFFF8000003FFFE00 +0FFFF0000001FFFE00 +1FFFE0000000FFFF00 +3FFFE0000000FFFF80 +3FFFC00000007FFF80 +7FFF800000003FFFC0 +FFFF800000003FFFE0 +FFFF000000001FFFE0 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 652 0 +DWIDTH 68 0 +BBX 68 75 0 0 +BITMAP +FFFF000000000FFFF0 +FFFF800000001FFFF0 +7FFF800000001FFFE0 +3FFFC00000003FFFC0 +3FFFC00000007FFFC0 +1FFFE00000007FFF80 +0FFFF0000000FFFF00 +0FFFF0000000FFFF00 +07FFF8000001FFFE00 +03FFF8000001FFFE00 +03FFFC000003FFFC00 +01FFFE000007FFF800 +01FFFE000007FFF800 +00FFFF00000FFFF000 +007FFF00000FFFE000 +007FFF80001FFFE000 +003FFF80001FFFC000 +001FFFC0003FFF8000 +001FFFE0007FFF8000 +000FFFE0007FFF0000 +000FFFF000FFFF0000 +0007FFF000FFFE0000 +0003FFF801FFFC0000 +0003FFF801FFFC0000 +0001FFFC03FFF80000 +0000FFFE07FFF00000 +0000FFFE07FFF00000 +00007FFF0FFFE00000 +00003FFF0FFFE00000 +00003FFF9FFFC00000 +00001FFFBFFF800000 +00001FFFFFFF800000 +00000FFFFFFF000000 +000007FFFFFE000000 +000007FFFFFE000000 +000003FFFFFC000000 +000001FFFFF8000000 +000001FFFFF8000000 +000000FFFFF0000000 +0000007FFFF0000000 +0000007FFFE0000000 +0000003FFFC0000000 +0000003FFFC0000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +0000001FFF80000000 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 61 75 1 0 +BITMAP +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +07FFFFFFFFFFFFF0 +00000000003FFFF0 +00000000007FFFE0 +0000000000FFFFC0 +0000000001FFFF80 +0000000003FFFF00 +0000000007FFFE00 +000000000FFFFC00 +000000000FFFF800 +000000001FFFF800 +000000003FFFF000 +000000007FFFE000 +00000000FFFFC000 +00000001FFFF8000 +00000003FFFF0000 +00000007FFFE0000 +0000000FFFFC0000 +0000000FFFFC0000 +0000001FFFF80000 +0000003FFFF00000 +0000007FFFE00000 +000000FFFFC00000 +000001FFFF800000 +000003FFFF000000 +000007FFFE000000 +000007FFFE000000 +00000FFFFC000000 +00001FFFF8000000 +00003FFFF0000000 +00007FFFE0000000 +0000FFFFC0000000 +0001FFFF80000000 +0003FFFF00000000 +0003FFFF00000000 +0007FFFE00000000 +000FFFFC00000000 +001FFFF800000000 +003FFFF000000000 +007FFFE000000000 +00FFFFC000000000 +01FFFF8000000000 +01FFFF0000000000 +03FFFF0000000000 +07FFFE0000000000 +0FFFFC0000000000 +1FFFF80000000000 +3FFFF00000000000 +7FFFE00000000000 +FFFFC00000000000 +FFFF800000000000 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +FFFFFFFFFFFFFFF8 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 27 96 8 -21 +BITMAP +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFC0000 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 29 75 0 0 +BITMAP +FFE00000 +FFE00000 +FFF00000 +7FF00000 +7FF00000 +7FF00000 +7FF80000 +7FF80000 +3FF80000 +3FF80000 +3FFC0000 +3FFC0000 +1FFC0000 +1FFC0000 +1FFC0000 +1FFE0000 +0FFE0000 +0FFE0000 +0FFE0000 +0FFF0000 +07FF0000 +07FF0000 +07FF0000 +07FF8000 +03FF8000 +03FF8000 +03FF8000 +03FFC000 +01FFC000 +01FFC000 +01FFC000 +01FFE000 +01FFE000 +00FFE000 +00FFE000 +00FFF000 +00FFF000 +007FF000 +007FF000 +007FF000 +007FF800 +003FF800 +003FF800 +003FF800 +003FFC00 +001FFC00 +001FFC00 +001FFC00 +001FFE00 +000FFE00 +000FFE00 +000FFE00 +000FFF00 +0007FF00 +0007FF00 +0007FF00 +0007FF80 +0007FF80 +0003FF80 +0003FF80 +0003FFC0 +0003FFC0 +0001FFC0 +0001FFC0 +0001FFC0 +0001FFE0 +0000FFE0 +0000FFE0 +0000FFE0 +0000FFF0 +00007FF0 +00007FF0 +00007FF0 +00007FF8 +00003FF8 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 27 96 0 -21 +BITMAP +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +FFFFFFE0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 48 40 5 36 +BITMAP +00003FFC0000 +00003FFC0000 +00003FFE0000 +00007FFE0000 +00007FFF0000 +0000FFFF0000 +0000FFFF8000 +0001FFFF8000 +0001FFFFC000 +0003FFFFC000 +0003FFFFE000 +0007FFFFE000 +0007FFFFE000 +000FFFFFF000 +000FFFFFF000 +001FFFFFF800 +001FFFFFF800 +001FFE7FFC00 +003FFE7FFC00 +003FFC3FFE00 +007FFC3FFE00 +007FFC3FFF00 +00FFF81FFF00 +00FFF81FFF00 +01FFF00FFF80 +01FFF00FFF80 +03FFF00FFFC0 +03FFE007FFC0 +07FFE007FFE0 +07FFC003FFE0 +0FFFC003FFF0 +0FFF8001FFF0 +1FFF8001FFF8 +1FFF8001FFF8 +1FFF0000FFF8 +3FFF0000FFFC +3FFE00007FFC +7FFE00007FFE +7FFE00007FFE +FFFC00003FFF +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 60 9 -1 -21 +BITMAP +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFF0 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 23 15 2 60 +BITMAP +FFFF00 +7FFF80 +3FFF80 +1FFFC0 +0FFFC0 +07FFE0 +03FFE0 +01FFE0 +00FFF0 +007FF0 +003FF8 +001FF8 +000FFC +0007FC +0003FE +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 51 57 3 -1 +BITMAP +00003FFF000000 +0003FFFFF80000 +000FFFFFFE0000 +003FFFFFFF8000 +007FFFFFFFC000 +00FFFFFFFFE000 +01FFFFFFFFF000 +03FFFFFFFFF800 +07FFFFFFFFF800 +07FFFFFFFFFC00 +0FFFFFFFFFFC00 +0FFFF007FFFC00 +1FFFC001FFFC00 +1FFF8000FFFE00 +3FFF8000FFFE00 +3FFF00007FFE00 +07FF00007FFE00 +000E00007FFE00 +000000007FFE00 +000000007FFE00 +00000000FFFE00 +0000000FFFFE00 +000000FFFFFE00 +00000FFFFFFE00 +0001FFFFFFFE00 +000FFFFFFFFE00 +007FFFFFFFFE00 +01FFFFFFFFFE00 +03FFFFFFFFFE00 +07FFFFFFFFFE00 +0FFFFFFFFFFE00 +1FFFFFFE7FFE00 +3FFFFFE07FFE00 +3FFFFC007FFE00 +7FFFC0007FFE00 +7FFF00007FFE00 +7FFE00007FFE00 +FFFC00007FFE00 +FFFC00007FFE00 +FFFC0000FFFE00 +FFFC0000FFFE00 +FFFC0001FFFE00 +FFFE0001FFFE00 +FFFF0007FFFE00 +FFFF800FFFFE00 +7FFFE07FFFFE00 +7FFFFFFFFFFE00 +7FFFFFFFFFFF00 +3FFFFFFFFFFF00 +3FFFFFFFFFFF00 +1FFFFFFFDFFF00 +0FFFFFFF8FFF80 +07FFFFFF0FFF80 +03FFFFFC0FFFC0 +00FFFFF00FFFC0 +003FFFC007FFE0 +0007FE00000000 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 76 7 -1 +BITMAP +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC007FE00000 +FFFC03FFFC0000 +FFFC0FFFFF0000 +FFFC1FFFFFC000 +FFFC7FFFFFE000 +FFFCFFFFFFF800 +FFFDFFFFFFFC00 +FFFFFFFFFFFE00 +FFFFFFFFFFFE00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF80 +FFFFFE03FFFF80 +FFFFF800FFFFC0 +FFFFE0003FFFC0 +FFFFC0001FFFE0 +FFFF80000FFFE0 +FFFF80000FFFE0 +FFFF000007FFF0 +FFFE000007FFF0 +FFFE000003FFF0 +FFFE000003FFF0 +FFFE000003FFF8 +FFFC000003FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFE000001FFF8 +FFFE000003FFF0 +FFFE000003FFF0 +FFFE000003FFF0 +FFFF000007FFF0 +FFFF000007FFF0 +FFFF80000FFFE0 +FFFFC0000FFFE0 +FFFFE0001FFFE0 +FFFFF0003FFFC0 +FFFFF800FFFFC0 +FFFFFF03FFFF80 +FFFFFFFFFFFF80 +FFFFFFFFFFFF00 +FFFFFFFFFFFE00 +FFFDFFFFFFFC00 +FFFCFFFFFFFC00 +FFFC7FFFFFF800 +FFFC3FFFFFE000 +FFFC1FFFFFC000 +FFFC07FFFF8000 +FFFC01FFFC0000 +0000003FE00000 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 50 57 4 -1 +BITMAP +00000FFF000000 +0000FFFFF00000 +0003FFFFFC0000 +000FFFFFFF0000 +003FFFFFFF8000 +007FFFFFFFC000 +00FFFFFFFFE000 +01FFFFFFFFF000 +03FFFFFFFFF800 +07FFFFFFFFFC00 +07FFFFFFFFFC00 +0FFFFC07FFFE00 +1FFFF001FFFE00 +1FFFC000FFFF00 +3FFF80007FFF00 +3FFF80003FFF80 +3FFF00003FFF80 +7FFF00001FFC00 +7FFE00001E0000 +7FFE0000000000 +7FFE0000000000 +7FFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +7FFE0000000000 +7FFE00000F0000 +7FFE00000FFE00 +7FFE00001FFFC0 +7FFF00001FFFC0 +3FFF00001FFF80 +3FFF80003FFF80 +3FFFC0007FFF80 +1FFFE0007FFF00 +1FFFF001FFFF00 +0FFFFC07FFFE00 +07FFFFFFFFFE00 +07FFFFFFFFFC00 +03FFFFFFFFF800 +01FFFFFFFFF800 +00FFFFFFFFF000 +007FFFFFFFE000 +003FFFFFFF8000 +000FFFFFFF0000 +0003FFFFFC0000 +0000FFFFF00000 +00000FFF000000 +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 76 4 -1 +BITMAP +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +00003FF001FFF8 +0001FFFE01FFF8 +0007FFFF81FFF8 +001FFFFFC1FFF8 +007FFFFFF1FFF8 +00FFFFFFF9FFF8 +01FFFFFFFDFFF8 +03FFFFFFFFFFF8 +07FFFFFFFFFFF8 +07FFFFFFFFFFF8 +0FFFFFFFFFFFF8 +0FFFFE03FFFFF8 +1FFFF800FFFFF8 +1FFFE0003FFFF8 +3FFFC0001FFFF8 +3FFF80000FFFF8 +7FFF80000FFFF8 +7FFF000007FFF8 +7FFF000007FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +FFFE000003FFF8 +FFFC000003FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +7FFF000007FFF8 +7FFF000007FFF8 +3FFF80000FFFF8 +3FFF80000FFFF8 +3FFFC0001FFFF8 +1FFFE0003FFFF8 +1FFFF800FFFFF8 +0FFFFE03FFFFF8 +0FFFFFFFFFFFF8 +07FFFFFFFFFFF8 +03FFFFFFFFFFF8 +01FFFFFFFDFFF8 +01FFFFFFF9FFF8 +00FFFFFFF1FFF8 +003FFFFFE1FFF8 +001FFFFFC1FFF8 +0007FFFF01FFF8 +0001FFFC01FFF8 +00003FE0000000 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 51 57 3 -1 +BITMAP +00000FFE000000 +0000FFFFC00000 +0003FFFFF80000 +000FFFFFFE0000 +001FFFFFFF0000 +007FFFFFFFC000 +00FFFFFFFFE000 +01FFFFFFFFF000 +03FFFFFFFFF800 +03FFFFFFFFF800 +07FFFFFFFFFC00 +0FFFFC07FFFE00 +0FFFF001FFFE00 +1FFFE0007FFF00 +1FFF80003FFF00 +3FFF80001FFF80 +3FFF00001FFF80 +3FFE00000FFF80 +7FFE00000FFF80 +7FFE00000FFFC0 +7FFE000007FFC0 +7FFC000007FFC0 +FFFC000007FFC0 +FFFC000007FFC0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFFFFFFFFFFE0 +FFFC0000000000 +FFFC0000000000 +7FFC0000000000 +7FFC0000000000 +7FFE0000000000 +7FFE0000000000 +7FFE00000F0000 +3FFF00001FFE00 +3FFF80001FFFC0 +3FFFC0003FFF80 +1FFFE0007FFF80 +1FFFF000FFFF80 +0FFFFE03FFFF00 +07FFFFFFFFFE00 +07FFFFFFFFFE00 +03FFFFFFFFFC00 +01FFFFFFFFF800 +00FFFFFFFFF000 +007FFFFFFFE000 +003FFFFFFFC000 +000FFFFFFF0000 +0003FFFFFE0000 +0000FFFFF00000 +00000FFF000000 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 35 76 2 0 +BITMAP +00003FF800 +0001FFFFC0 +0007FFFFE0 +001FFFFFE0 +003FFFFFE0 +007FFFFFC0 +007FFFFFC0 +00FFFFFFC0 +00FFFFFFC0 +00FFFFFFC0 +01FFFFFFC0 +01FFFF00C0 +01FFFC0000 +01FFFC0000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +FFFFFFFE00 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +01FFF80000 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 78 4 -22 +BITMAP +00003FE0000000 +0003FFFC01FFF8 +000FFFFF01FFF8 +001FFFFFC1FFF8 +007FFFFFE1FFF8 +00FFFFFFF1FFF8 +01FFFFFFF9FFF8 +03FFFFFFFDFFF8 +07FFFFFFFFFFF8 +07FFFFFFFFFFF8 +0FFFFFFFFFFFF8 +0FFFFE03FFFFF8 +1FFFF800FFFFF8 +1FFFE0003FFFF8 +3FFFC0001FFFF8 +3FFF80000FFFF8 +7FFF80000FFFF8 +7FFF000007FFF8 +7FFF000007FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +FFFE000003FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000003FFF8 +FFFE000003FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +7FFE000007FFF8 +7FFF000007FFF8 +3FFF00000FFFF8 +3FFF80001FFFF8 +3FFFC0001FFFF8 +1FFFE0007FFFF8 +1FFFF000FFFFF8 +0FFFFE07FFFFF8 +0FFFFFFFFFFFF8 +07FFFFFFFFFFF8 +07FFFFFFFDFFF8 +03FFFFFFF9FFF8 +01FFFFFFF1FFF8 +00FFFFFFE1FFF8 +007FFFFFC1FFF8 +003FFFFF81FFF8 +000FFFFE01FFF8 +0003FFF801FFF8 +00007FC001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF0 +3C00000001FFF0 +3FFE000003FFF0 +3FFFE00003FFF0 +3FFFE00007FFF0 +3FFFF0000FFFE0 +3FFFF8001FFFE0 +1FFFFE00FFFFE0 +1FFFFFFFFFFFC0 +0FFFFFFFFFFFC0 +0FFFFFFFFFFF80 +07FFFFFFFFFF00 +03FFFFFFFFFF00 +01FFFFFFFFFE00 +00FFFFFFFFF800 +007FFFFFFFF000 +001FFFFFFFC000 +0003FFFFFE0000 +00001FFFE00000 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 50 75 7 0 +BITMAP +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC001FF00000 +FFFC01FFFE0000 +FFFC07FFFF8000 +FFFC0FFFFFE000 +FFFC3FFFFFF000 +FFFC7FFFFFF800 +FFFCFFFFFFFC00 +FFFDFFFFFFFE00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF00 +FFFFFE03FFFF80 +FFFFF000FFFF80 +FFFFE0007FFF80 +FFFFC0003FFF80 +FFFF80001FFFC0 +FFFF00001FFFC0 +FFFF00001FFFC0 +FFFE00000FFFC0 +FFFE00000FFFC0 +FFFE00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 14 75 7 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 27 97 -5 -22 +BITMAP +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +0007FFE0 +000FFFE0 +000FFFE0 +001FFFE0 +007FFFC0 +7FFFFFC0 +7FFFFFC0 +7FFFFFC0 +7FFFFFC0 +7FFFFF80 +7FFFFF80 +7FFFFF00 +FFFFFF00 +FFFFFE00 +FFFFFC00 +FFFFF000 +FFFFE000 +07FE0000 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 49 75 7 0 +BITMAP +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0001FFFF00 +FFFC0003FFFE00 +FFFC0007FFFC00 +FFFC000FFFF800 +FFFC001FFFF000 +FFFC001FFFE000 +FFFC003FFFE000 +FFFC007FFFC000 +FFFC00FFFF8000 +FFFC01FFFF0000 +FFFC03FFFE0000 +FFFC07FFFC0000 +FFFC0FFFF80000 +FFFC1FFFF00000 +FFFC3FFFE00000 +FFFC7FFFC00000 +FFFC7FFF800000 +FFFCFFFF000000 +FFFDFFFE000000 +FFFFFFFE000000 +FFFFFFFC000000 +FFFFFFFE000000 +FFFFFFFE000000 +FFFFFFFF000000 +FFFFFFFF800000 +FFFFFFFF800000 +FFFFFFFFC00000 +FFFFFFFFC00000 +FFFFFFFFE00000 +FFFFFFFFE00000 +FFFFF7FFF00000 +FFFFE3FFF00000 +FFFFE3FFF80000 +FFFFC1FFFC0000 +FFFF81FFFC0000 +FFFF00FFFE0000 +FFFE007FFE0000 +FFFC007FFF0000 +FFFC003FFF0000 +FFFC003FFF8000 +FFFC001FFF8000 +FFFC000FFFC000 +FFFC000FFFE000 +FFFC0007FFE000 +FFFC0007FFF000 +FFFC0003FFF000 +FFFC0003FFF800 +FFFC0001FFF800 +FFFC0000FFFC00 +FFFC0000FFFC00 +FFFC00007FFE00 +FFFC00007FFF00 +FFFC00003FFF00 +FFFC00001FFF80 +FFFC00001FFF80 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 14 75 7 0 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 883 0 +DWIDTH 92 0 +BBX 78 56 6 0 +BITMAP +0000003FC00000FF8000 +FFFC01FFF80007FFF800 +FFFC07FFFE001FFFFE00 +FFFC1FFFFF003FFFFF00 +FFFC3FFFFF80FFFFFF80 +FFFC7FFFFFC1FFFFFFC0 +FFFCFFFFFFE3FFFFFFE0 +FFFDFFFFFFF7FFFFFFE0 +FFFFFFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFFFFFF0 +FFFFFFFFFFFFFFFFFFF8 +FFFFF80FFFFFFC1FFFF8 +FFFFE007FFFFE007FFF8 +FFFFC003FFFFC003FFFC +FFFF8001FFFF8001FFFC +FFFF0001FFFF0001FFFC +FFFF0001FFFF0001FFFC +FFFE0000FFFE0000FFFC +FFFE0000FFFE0000FFFC +FFFE0000FFFE0000FFFC +FFFE0000FFFE0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +FFFC0000FFFC0000FFFC +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 50 56 7 0 +BITMAP +0000001FF80000 +FFFC00FFFF0000 +FFFC07FFFFC000 +FFFC0FFFFFF000 +FFFC3FFFFFF800 +FFFC7FFFFFFC00 +FFFCFFFFFFFE00 +FFFDFFFFFFFE00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF80 +FFFFFE03FFFF80 +FFFFF000FFFF80 +FFFFE0007FFF80 +FFFFC0003FFFC0 +FFFF80001FFFC0 +FFFF00001FFFC0 +FFFF00001FFFC0 +FFFE00001FFFC0 +FFFE00000FFFC0 +FFFE00000FFFC0 +FFFE00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 56 57 4 -1 +BITMAP +000003FFC00000 +00003FFFFC0000 +0000FFFFFF0000 +0003FFFFFFC000 +000FFFFFFFF000 +003FFFFFFFF800 +007FFFFFFFFC00 +00FFFFFFFFFF00 +01FFFFFFFFFF80 +03FFFFFFFFFF80 +03FFFFFFFFFFC0 +07FFFF00FFFFE0 +0FFFFC003FFFF0 +0FFFF0000FFFF0 +1FFFE00007FFF8 +1FFFC00003FFF8 +3FFF800001FFFC +3FFF800001FFFC +7FFF000000FFFC +7FFF000000FFFE +7FFE0000007FFE +7FFE0000007FFE +FFFE0000007FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +FFFC0000003FFF +7FFE0000007FFE +7FFE0000007FFE +7FFE0000007FFE +7FFF000000FFFE +7FFF000000FFFC +3FFF800001FFFC +3FFF800001FFFC +3FFFC00003FFF8 +1FFFE00007FFF8 +1FFFF0000FFFF0 +0FFFFC003FFFF0 +07FFFF00FFFFE0 +07FFFFFFFFFFC0 +03FFFFFFFFFF80 +01FFFFFFFFFF00 +00FFFFFFFFFE00 +007FFFFFFFFC00 +003FFFFFFFF800 +000FFFFFFFF000 +0003FFFFFFC000 +0000FFFFFF0000 +00003FFFFC0000 +000003FFC00000 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 77 7 -21 +BITMAP +0000003FE00000 +FFFC01FFFC0000 +FFFC07FFFF0000 +FFFC1FFFFFC000 +FFFC3FFFFFE000 +FFFC7FFFFFF800 +FFFCFFFFFFFC00 +FFFDFFFFFFFE00 +FFFFFFFFFFFE00 +FFFFFFFFFFFF00 +FFFFFFFFFFFF80 +FFFFFE03FFFF80 +FFFFF800FFFFC0 +FFFFE0003FFFC0 +FFFFC0001FFFE0 +FFFF80000FFFE0 +FFFF80000FFFE0 +FFFF000007FFF0 +FFFF000007FFF0 +FFFE000003FFF0 +FFFE000003FFF0 +FFFE000003FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFE000001FFF8 +FFFE000003FFF0 +FFFE000003FFF0 +FFFE000003FFF0 +FFFF000007FFF0 +FFFF000007FFF0 +FFFF80000FFFE0 +FFFFC0000FFFE0 +FFFFE0001FFFE0 +FFFFF0003FFFC0 +FFFFF8007FFFC0 +FFFFFF03FFFF80 +FFFFFFFFFFFF00 +FFFFFFFFFFFF00 +FFFFFFFFFFFE00 +FFFFFFFFFFFC00 +FFFDFFFFFFF800 +FFFCFFFFFFF000 +FFFC3FFFFFE000 +FFFC1FFFFFC000 +FFFC0FFFFF0000 +FFFC03FFFC0000 +FFFC007FE00000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +FFFC0000000000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 53 77 4 -21 +BITMAP +00003FE0000000 +0001FFFE01FFF8 +0007FFFF81FFF8 +001FFFFFC1FFF8 +003FFFFFE1FFF8 +00FFFFFFF1FFF8 +01FFFFFFF9FFF8 +03FFFFFFFDFFF8 +03FFFFFFFFFFF8 +07FFFFFFFFFFF8 +0FFFFFFFFFFFF8 +0FFFFE03FFFFF8 +1FFFF800FFFFF8 +1FFFE0003FFFF8 +3FFFC0001FFFF8 +3FFF80000FFFF8 +3FFF80000FFFF8 +7FFF000007FFF8 +7FFF000007FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +FFFE000003FFF8 +FFFE000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000003FFF8 +7FFE000003FFF8 +7FFE000003FFF8 +7FFE000007FFF8 +7FFE000007FFF8 +7FFF00000FFFF8 +3FFF00000FFFF8 +3FFF80001FFFF8 +1FFFC0003FFFF8 +1FFFE0007FFFF8 +1FFFF000FFFFF8 +0FFFFE07FFFFF8 +07FFFFFFFFFFF8 +07FFFFFFFFFFF8 +03FFFFFFFFFFF8 +01FFFFFFFFFFF8 +00FFFFFFFDFFF8 +007FFFFFF9FFF8 +003FFFFFF1FFF8 +001FFFFFC1FFF8 +0007FFFF81FFF8 +0001FFFE01FFF8 +00003FE001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +0000000001FFF8 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 384 0 +DWIDTH 40 0 +BBX 34 56 7 0 +BITMAP +000003F800 +FFFC0FFE00 +FFFC1FFF80 +FFFC3FFFC0 +FFFC7FFFC0 +FFFCFFFF80 +FFFDFFFF80 +FFFDFFFF80 +FFFFFFFF80 +FFFFFFFF00 +FFFFFFFF00 +FFFFFFFF00 +FFFFFFFF00 +FFFFFFFE00 +FFFFF81E00 +FFFFE00600 +FFFFC00000 +FFFF800000 +FFFF000000 +FFFF000000 +FFFF000000 +FFFE000000 +FFFE000000 +FFFE000000 +FFFE000000 +FFFE000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +FFFC000000 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 51 57 2 -1 +BITMAP +00003FFF000000 +0003FFFFF00000 +001FFFFFFE0000 +007FFFFFFF8000 +00FFFFFFFFC000 +01FFFFFFFFE000 +03FFFFFFFFF000 +07FFFFFFFFF800 +0FFFFFFFFFFC00 +0FFFFFFFFFFC00 +1FFFFFFFFFFE00 +1FFFF007FFFE00 +1FFFC001FFFF00 +3FFF80007FFF00 +3FFF00007FFF80 +3FFF00003FFF80 +3FFF00001FFC00 +3FFF80001E0000 +3FFFE000000000 +3FFFF800000000 +3FFFFF80000000 +1FFFFFF8000000 +1FFFFFFF800000 +0FFFFFFFF80000 +0FFFFFFFFF0000 +07FFFFFFFFC000 +03FFFFFFFFF000 +01FFFFFFFFFC00 +00FFFFFFFFFE00 +003FFFFFFFFF00 +000FFFFFFFFF80 +0003FFFFFFFF80 +00007FFFFFFFC0 +000007FFFFFFC0 +0000007FFFFFC0 +00000007FFFFE0 +000000007FFFE0 +000000000FFFE0 +003C000007FFE0 +1FFC000007FFE0 +FFFE000007FFE0 +FFFE000007FFE0 +7FFF00000FFFE0 +7FFF80000FFFC0 +3FFFE0003FFFC0 +3FFFF801FFFFC0 +1FFFFFFFFFFF80 +1FFFFFFFFFFF00 +0FFFFFFFFFFF00 +07FFFFFFFFFE00 +03FFFFFFFFFC00 +01FFFFFFFFF800 +007FFFFFFFF000 +003FFFFFFFC000 +000FFFFFFF0000 +0001FFFFFC0000 +00001FFF800000 +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 336 0 +DWIDTH 35 0 +BBX 32 74 2 -1 +BITMAP +00000800 +00003800 +00007800 +0001F800 +0007F800 +001FF800 +003FF800 +00FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +FFFFFFFE +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFF800 +01FFFC00 +01FFFE0E +01FFFFFE +00FFFFFE +00FFFFFE +00FFFFFE +00FFFFFE +007FFFFE +003FFFFF +001FFFFF +000FFFFF +0003FFFE +0000FFE0 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 614 0 +DWIDTH 64 0 +BBX 50 56 7 -1 +BITMAP +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00000FFFC0 +FFFC00001FFFC0 +FFFC00001FFFC0 +FFFC00001FFFC0 +FFFE00001FFFC0 +FFFE00003FFFC0 +FFFE00007FFFC0 +FFFF0000FFFFC0 +7FFF8001FFFFC0 +7FFFC003FFFFC0 +7FFFF01FFFFFC0 +7FFFFFFFFFFFC0 +3FFFFFFFFFFFC0 +3FFFFFFFFFFFC0 +1FFFFFFFEFFFC0 +1FFFFFFFCFFFC0 +0FFFFFFF8FFFC0 +07FFFFFF0FFFC0 +01FFFFFC0FFFC0 +00FFFFF00FFFC0 +003FFFC00FFFC0 +0007FE00000000 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 537 0 +DWIDTH 56 0 +BBX 53 55 1 0 +BITMAP +FFFC000001FFF8 +FFFC000001FFF8 +FFFC000001FFF8 +7FFE000003FFF0 +7FFE000003FFF0 +3FFE000007FFE0 +3FFF000007FFE0 +3FFF000007FFE0 +1FFF80000FFFC0 +1FFF80000FFFC0 +0FFF80000FFFC0 +0FFFC0001FFF80 +0FFFC0001FFF80 +07FFC0001FFF00 +07FFE0003FFF00 +07FFE0003FFF00 +03FFE0003FFE00 +03FFF0007FFE00 +01FFF0007FFE00 +01FFF000FFFC00 +01FFF800FFFC00 +00FFF800FFF800 +00FFFC01FFF800 +00FFFC01FFF800 +007FFC01FFF000 +007FFE03FFF000 +003FFE03FFF000 +003FFE03FFE000 +003FFF07FFE000 +001FFF07FFC000 +001FFF07FFC000 +000FFF8FFFC000 +000FFF8FFF8000 +000FFF8FFF8000 +0007FFDFFF8000 +0007FFDFFF0000 +0007FFDFFF0000 +0003FFFFFE0000 +0003FFFFFE0000 +0001FFFFFE0000 +0001FFFFFC0000 +0001FFFFFC0000 +0000FFFFFC0000 +0000FFFFF80000 +0000FFFFF80000 +00007FFFF00000 +00007FFFF00000 +00003FFFF00000 +00003FFFE00000 +00003FFFE00000 +00001FFFE00000 +00001FFFC00000 +00000FFFC00000 +00000FFF800000 +00000FFF800000 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 806 0 +DWIDTH 84 0 +BBX 83 55 0 0 +BITMAP +FFFC00003FFF800007FFE0 +FFFE00003FFF80000FFFE0 +7FFE00003FFFC0000FFFC0 +7FFE00007FFFC0000FFFC0 +7FFE00007FFFC0000FFFC0 +3FFF00007FFFC0001FFF80 +3FFF00007FFFE0001FFF80 +3FFF0000FFFFE0001FFF80 +1FFF8000FFFFE0003FFF00 +1FFF8000FFFFE0003FFF00 +1FFF8001FFFFF0003FFF00 +0FFF8001FFFFF0003FFE00 +0FFFC001FFFFF0007FFE00 +0FFFC001FFFFF8007FFE00 +07FFC003FFFFF8007FFC00 +07FFE003FFFFF800FFFC00 +07FFE003FFFFF800FFFC00 +03FFE003FFFFFC00FFF800 +03FFE007FFFFFC00FFF800 +03FFF007FFFFFC01FFF800 +01FFF007FFBFFC01FFF800 +01FFF00FFFBFFE01FFF000 +01FFF80FFFBFFE03FFF000 +01FFF80FFF1FFE03FFF000 +00FFF80FFF1FFE03FFE000 +00FFF81FFF1FFF03FFE000 +00FFFC1FFF1FFF07FFE000 +007FFC1FFE0FFF07FFC000 +007FFC1FFE0FFF07FFC000 +007FFE3FFE0FFF8FFFC000 +003FFE3FFE07FF8FFF8000 +003FFE3FFC07FF8FFF8000 +003FFE7FFC07FFCFFF8000 +001FFF7FFC07FFDFFF0000 +001FFF7FF803FFDFFF0000 +001FFF7FF803FFDFFF0000 +000FFFFFF803FFFFFE0000 +000FFFFFF801FFFFFE0000 +000FFFFFF001FFFFFE0000 +0007FFFFF001FFFFFE0000 +0007FFFFF001FFFFFC0000 +0007FFFFF000FFFFFC0000 +0007FFFFE000FFFFFC0000 +0003FFFFE000FFFFF80000 +0003FFFFE000FFFFF80000 +0003FFFFC0007FFFF80000 +0001FFFFC0007FFFF00000 +0001FFFFC0007FFFF00000 +0001FFFFC0003FFFF00000 +0000FFFF80003FFFE00000 +0000FFFF80003FFFE00000 +0000FFFF80003FFFE00000 +00007FFF80001FFFC00000 +00007FFF00001FFFC00000 +00007FFF00001FFFC00000 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 556 0 +DWIDTH 58 0 +BBX 54 55 2 0 +BITMAP +3FFFC0000FFFF0 +3FFFE0001FFFF0 +1FFFE0003FFFE0 +0FFFF0003FFFC0 +0FFFF8007FFFC0 +07FFF8007FFF80 +03FFFC00FFFF00 +03FFFC01FFFE00 +01FFFE01FFFE00 +00FFFE03FFFC00 +00FFFF07FFF800 +007FFF87FFF800 +007FFF8FFFF000 +003FFFCFFFE000 +001FFFDFFFE000 +001FFFFFFFC000 +000FFFFFFF8000 +0007FFFFFF8000 +0007FFFFFF0000 +0003FFFFFE0000 +0001FFFFFE0000 +0001FFFFFC0000 +0000FFFFF80000 +0000FFFFF80000 +00007FFFF00000 +00003FFFE00000 +00003FFFE00000 +00003FFFF00000 +00007FFFF80000 +00007FFFF80000 +0000FFFFFC0000 +0001FFFFFE0000 +0001FFFFFE0000 +0003FFFFFF0000 +0007FFFFFF8000 +0007FFFFFF8000 +000FFFFFFFC000 +001FFFFFFFE000 +001FFFDFFFE000 +003FFFCFFFF000 +007FFF8FFFF800 +007FFF07FFF800 +00FFFF03FFFC00 +01FFFE03FFFE00 +01FFFE01FFFE00 +03FFFC00FFFF00 +07FFF800FFFF80 +07FFF8007FFF80 +0FFFF0003FFFC0 +1FFFE0003FFFE0 +3FFFE0001FFFE0 +3FFFC0000FFFF0 +7FFFC0000FFFF8 +FFFF800007FFF8 +FFFF000003FFFC +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 528 0 +DWIDTH 55 0 +BBX 53 77 1 -22 +BITMAP +FFFC000001FFF8 +7FFC000003FFF0 +7FFE000003FFF0 +7FFE000003FFF0 +3FFE000003FFE0 +3FFF000007FFE0 +3FFF000007FFE0 +1FFF000007FFC0 +1FFF80000FFFC0 +1FFF80000FFFC0 +0FFF80000FFF80 +0FFFC0001FFF80 +0FFFC0001FFF80 +07FFC0001FFF00 +07FFE0003FFF00 +07FFE0003FFF00 +03FFE0003FFE00 +03FFF0007FFE00 +01FFF0007FFE00 +01FFF0007FFC00 +01FFF800FFFC00 +00FFF800FFFC00 +00FFF800FFF800 +00FFFC01FFF800 +007FFC01FFF800 +007FFC01FFF000 +007FFE03FFF000 +003FFE03FFE000 +003FFE03FFE000 +003FFE07FFE000 +001FFF07FFC000 +001FFF07FFC000 +001FFF07FFC000 +000FFF8FFF8000 +000FFF8FFF8000 +000FFF8FFF8000 +0007FFDFFF0000 +0007FFDFFF0000 +0003FFDFFF0000 +0003FFFFFE0000 +0003FFFFFE0000 +0001FFFFFE0000 +0001FFFFFC0000 +0001FFFFFC0000 +0000FFFFFC0000 +0000FFFFF80000 +0000FFFFF80000 +00007FFFF80000 +00007FFFF00000 +00007FFFF00000 +00003FFFF00000 +00003FFFE00000 +00003FFFE00000 +00001FFFC00000 +00001FFFC00000 +00001FFFC00000 +00001FFF800000 +00001FFF800000 +00003FFF800000 +00003FFF000000 +00007FFF000000 +00007FFF000000 +0000FFFE000000 +0000FFFE000000 +0001FFFE000000 +0807FFFC000000 +0FFFFFFC000000 +0FFFFFF8000000 +0FFFFFF8000000 +0FFFFFF0000000 +0FFFFFE0000000 +07FFFFE0000000 +07FFFFC0000000 +07FFFF80000000 +07FFFE00000000 +07FFF800000000 +01FFC000000000 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 499 0 +DWIDTH 52 0 +BBX 48 55 2 0 +BITMAP +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +3FFFFFFFFFFC +0000000FFFF8 +0000001FFFF0 +0000003FFFE0 +0000007FFFC0 +000000FFFFC0 +000001FFFF80 +000003FFFF00 +000003FFFE00 +000007FFFC00 +00000FFFFC00 +00001FFFF800 +00003FFFF000 +00007FFFE000 +00007FFFC000 +0000FFFF8000 +0001FFFF8000 +0003FFFF0000 +0007FFFE0000 +0007FFFC0000 +000FFFF80000 +001FFFF80000 +003FFFF00000 +007FFFE00000 +007FFFC00000 +00FFFF800000 +01FFFF000000 +03FFFF000000 +07FFFE000000 +0FFFFC000000 +0FFFF8000000 +1FFFF0000000 +3FFFE0000000 +7FFFC0000000 +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +FFFFFFFFFFFF +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 384 0 +DWIDTH 40 0 +BBX 34 98 3 -22 +BITMAP +000001FFC0 +00000FFFC0 +00007FFFC0 +0000FFFFC0 +0003FFFFC0 +0007FFFFC0 +0007FFFFC0 +000FFFFFC0 +000FFFFFC0 +001FFFFFC0 +001FFFFFC0 +001FFFFFC0 +001FFFFFC0 +003FFFE000 +003FFF8000 +003FFF0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +007FFE0000 +007FFE0000 +007FFE0000 +007FFC0000 +00FFFC0000 +00FFFC0000 +01FFFC0000 +03FFF80000 +1FFFF80000 +FFFFF00000 +FFFFF00000 +FFFFE00000 +FFFFC00000 +FFFF800000 +FFFE000000 +FFFC000000 +FFFE000000 +FFFF800000 +FFFFC00000 +FFFFE00000 +FFFFE00000 +FFFFF00000 +1FFFF80000 +07FFF80000 +01FFF80000 +01FFFC0000 +00FFFC0000 +00FFFC0000 +007FFC0000 +007FFE0000 +007FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFE0000 +003FFF0000 +003FFF8000 +003FFFE000 +001FFFFFC0 +001FFFFFC0 +001FFFFFC0 +001FFFFFC0 +000FFFFFC0 +000FFFFFC0 +0007FFFFC0 +0003FFFFC0 +0001FFFFC0 +0000FFFFC0 +00007FFFC0 +00001FFFC0 +000001FFC0 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 278 0 +DWIDTH 29 0 +BBX 11 98 9 -23 +BITMAP +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 384 0 +DWIDTH 40 0 +BBX 34 98 3 -22 +BITMAP +FFE0000000 +FFFE000000 +FFFF800000 +FFFFC00000 +FFFFF00000 +FFFFF00000 +FFFFF80000 +FFFFFC0000 +FFFFFC0000 +FFFFFE0000 +FFFFFE0000 +FFFFFE0000 +FFFFFE0000 +01FFFF0000 +007FFF0000 +003FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF8000 +000FFF8000 +000FFF8000 +000FFFC000 +000FFFC000 +000FFFE000 +0007FFF000 +0007FFFE00 +0003FFFFC0 +0003FFFFC0 +0001FFFFC0 +0000FFFFC0 +00007FFFC0 +00001FFFC0 +00000FFFC0 +00001FFFC0 +00007FFFC0 +0000FFFFC0 +0001FFFFC0 +0001FFFFC0 +0003FFFFC0 +0007FFFE00 +0007FFF000 +000FFFE000 +000FFFE000 +000FFFC000 +000FFF8000 +001FFF8000 +001FFF8000 +001FFF8000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +001FFF0000 +003FFF0000 +007FFF0000 +01FFFF0000 +FFFFFE0000 +FFFFFE0000 +FFFFFE0000 +FFFFFE0000 +FFFFFC0000 +FFFFFC0000 +FFFFF80000 +FFFFF80000 +FFFFF00000 +FFFFC00000 +FFFF800000 +FFFC000000 +FFE0000000 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 585 0 +DWIDTH 61 0 +BBX 54 20 3 26 +BITMAP +001FF000000004 +00FFFF0000000C +03FFFFC000001C +0FFFFFF800003C +1FFFFFFE0000FC +7FFFFFFFC003FC +FFFFFFFFF80FFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFFFFFFFFFFFFC +FFC03FFFFFFFFC +FE0007FFFFFFF0 +FC0000FFFFFFE0 +F000003FFFFFC0 +E0000007FFFF00 +C0000001FFFC00 +800000003FE000 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 268 0 +DWIDTH 28 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/ArialBold.bdf b/gui/themes/fonts/ArialBold.bdf new file mode 100644 index 0000000000..65869e0e7b --- /dev/null +++ b/gui/themes/fonts/ArialBold.bdf @@ -0,0 +1,1538 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from TrueType font "arialbd.ttf" by "ttf2bdf 2.8". +COMMENT +FONT -FreeType-Arial-Bold-R-Normal--12-120-75-75-P-62-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 14 14 -1 -3 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 62 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 11 +FONT_DESCENT 2 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_TTF_FONTFILE "arialbd.ttf" +_TTF_PSNAME "Arial-BoldMT" +ENDPROPERTIES +CHARS 96 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 7 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +24 +24 +24 +FC +48 +48 +FC +90 +90 +90 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 12 1 -1 +BITMAP +20 +70 +A8 +A0 +E0 +F0 +78 +38 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +E4 +A4 +A4 +A8 +E8 +17 +15 +15 +25 +27 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +38 +6C +6C +3C +30 +7A +DA +CE +CE +7B +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 2 3 1 7 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 1 -3 +BITMAP +20 +60 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +20 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 0 -3 +BITMAP +80 +C0 +40 +60 +60 +60 +60 +60 +60 +60 +40 +C0 +80 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 4 0 6 +BITMAP +20 +F8 +20 +D8 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 1 1 2 +BITMAP +E0 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +30 +70 +F0 +B0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +0C +0C +18 +38 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +0C +0C +30 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +18 +38 +38 +58 +58 +98 +FC +18 +18 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +7C +60 +C0 +F8 +CC +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +4C +C0 +C0 +F8 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +70 +60 +60 +60 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +CC +CC +CC +7C +0C +0C +C8 +70 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 0 1 +BITMAP +04 +1C +F0 +C0 +70 +1C +04 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 3 0 3 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +80 +E0 +38 +0C +38 +E0 +80 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7C +C6 +06 +06 +0C +18 +30 +00 +30 +30 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 13 13 0 -3 +BITMAP +0FC0 +3020 +6010 +4EC8 +9FC8 +B9C8 +B188 +B390 +BFB0 +5DC0 +4008 +3030 +0FC0 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1C00 +1C00 +3600 +3600 +3600 +6300 +6300 +7F00 +C180 +C180 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +FC +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3E +63 +C0 +C0 +C0 +CF +C3 +C3 +63 +3E +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +CC +D8 +D8 +F8 +EC +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E380 +E380 +F780 +F780 +D780 +D580 +D580 +DD80 +DD80 +C980 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 11 1 -1 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +CB +66 +3E +01 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +CC +CE +C6 +C7 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +C180 +E180 +6300 +6300 +6300 +3600 +3600 +3600 +1C00 +1C00 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +C718 +C718 +6730 +6DB0 +6DB0 +6DB0 +6DB0 +38E0 +38E0 +38E0 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +6C +38 +38 +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +C3 +C3 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +FE +06 +0C +18 +18 +30 +30 +60 +E0 +FE +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 13 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 5 0 4 +BITMAP +30 +30 +78 +48 +CC +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +8C +3C +6C +CC +CC +7C +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +C0 +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +0C +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 5 10 0 0 +BITMAP +38 +60 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +8C +78 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +C0 +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 13 -1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +C0 +C0 +C0 +CC +D8 +F0 +F0 +D8 +D8 +CC +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 10 7 1 0 +BITMAP +DD80 +EEC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +78 +1C +CC +78 +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +20 +60 +F0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +6C +38 +38 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 11 7 0 0 +BITMAP +C460 +CE60 +6EC0 +6AC0 +7BC0 +3B80 +3980 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +6C +38 +38 +38 +30 +F0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +18 +30 +60 +60 +C0 +F8 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 13 0 -3 +BITMAP +38 +60 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 240 0 +DWIDTH 3 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 13 0 -3 +BITMAP +E0 +30 +30 +30 +30 +30 +18 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 2 0 3 +BITMAP +72 +9C +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 320 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/README b/gui/themes/fonts/README new file mode 100644 index 0000000000..594bfc3ea4 --- /dev/null +++ b/gui/themes/fonts/README @@ -0,0 +1,3 @@ +These are fonts used in ScummVM. Most of them come from Xorg. + +Also other potentially usable fonts are stored here as well. diff --git a/gui/themes/fonts/clR6x12-L1.bdf b/gui/themes/fonts/clR6x12-L1.bdf new file mode 100644 index 0000000000..3e77859d72 --- /dev/null +++ b/gui/themes/fonts/clR6x12-L1.bdf @@ -0,0 +1,4290 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl clR6x12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT $Xorg: clR6x12.bdf,v 1.3 2000/08/18 15:17:40 xorgcvs Exp $ +COMMENT +COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org +COMMENT 399 Beacon Ave. +COMMENT St. Paul, MN 55104-3527 +COMMENT +COMMENT Permission to use, copy, modify, and distribute this software and +COMMENT its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notice appear in all +COMMENT copies and that both that copyright notice and this permission +COMMENT notice appear in supporting documentation, and that the name of +COMMENT Dale Schumacher not be used in advertising or publicity pertaining to +COMMENT distribution of the software without specific, written prior +COMMENT permission. Dale Schumacher makes no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT +COMMENT +COMMENT Modified by Robert Brady, +COMMENT +FONT -Schumacher-Clean-Medium-R-Normal--12-120-75-75-C-60-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -3 +STARTPROPERTIES 21 +FONTNAME_REGISTRY "" +FOUNDRY "Schumacher" +FAMILY_NAME "Clean" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +FONT_ASCENT 9 +FONT_DESCENT 3 +DEFAULT_CHAR 0 +COPYRIGHT "Copyright 1989 Dale Schumacher, 1999 Robert Brady." +CAP_HEIGHT 8 +X_HEIGHT 5 +ENDPROPERTIES +CHARS 223 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +00 +88 +00 +88 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR shade +ENCODING 2 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR uni2409 +ENCODING 3 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +E0 +A0 +BC +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 4 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +80 +C0 +9C +90 +1C +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 5 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +80 +80 +98 +74 +18 +14 +14 +00 +00 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 6 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +9C +F0 +18 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 7 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 8 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A0 +E0 +E0 +E0 +B0 +10 +10 +10 +1C +00 +00 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 10 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +5C +48 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 11 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF030000 +ENCODING 12 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF010000 +ENCODING 13 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF020000 +ENCODING 14 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 15 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23BA +ENCODING 16 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 17 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 18 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 19 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 20 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR SF080000 +ENCODING 21 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF090000 +ENCODING 22 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF070000 +ENCODING 23 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF060000 +ENCODING 24 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF110000 +ENCODING 25 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR lessequal +ENCODING 26 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 27 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR pi +ENCODING 28 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 29 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +10 +10 +F8 +20 +F8 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 30 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 31 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +F8 +50 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +78 +A0 +70 +28 +F0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +C8 +10 +20 +40 +98 +18 +00 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +80 +40 +A8 +90 +68 +00 +00 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +20 +20 +20 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +A8 +70 +A8 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +98 +A8 +C8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +30 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +30 +50 +50 +F8 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +80 +80 +F0 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +40 +80 +F0 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +88 +08 +08 +10 +10 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +88 +78 +08 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +0C +30 +C0 +30 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +C0 +30 +0C +30 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +B8 +B8 +B0 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +90 +88 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +18 +00 +00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +38 +40 +40 +F0 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D0 +A8 +A8 +A8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +70 +20 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +10 +10 +20 +10 +10 +10 +10 +08 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +20 +20 +10 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +A8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +70 +A8 +A0 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +70 +50 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +50 +20 +70 +20 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +00 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +40 +30 +48 +48 +48 +30 +08 +48 +30 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +A4 +A4 +B4 +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +08 +38 +48 +38 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +28 +50 +A0 +50 +28 +00 +00 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +AC +B4 +AC +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +40 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +E8 +E8 +68 +28 +28 +28 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +00 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +60 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +48 +48 +30 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +A0 +50 +28 +50 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +70 +08 +10 +20 +38 +00 +00 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +C0 +40 +20 +C8 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +40 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +A0 +A0 +B8 +E0 +A0 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +20 +40 +00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +44 +E4 +44 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +88 +C8 +A8 +98 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +78 +98 +A8 +A8 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +F0 +88 +88 +88 +F0 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +D0 +50 +48 +48 +50 +00 +00 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +28 +70 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +20 +40 +00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +40 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +10 +28 +08 +78 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +00 +F8 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +08 +78 +98 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +B0 +C8 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/courr12-l1.bdf b/gui/themes/fonts/courr12-l1.bdf new file mode 100644 index 0000000000..fdd7cbacab --- /dev/null +++ b/gui/themes/fonts/courr12-l1.bdf @@ -0,0 +1,2926 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl courR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Courier-Medium-R-Normal--12-120-75-75-M-70-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 8 14 0 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Courier" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "M" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 3 +FACE_NAME "Courier" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "No mark" +_DEC_DEVICE_FONTNAMES "PS=Courier" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +FULL_NAME "Courier" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 3 2 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +88 +80 +60 +30 +88 +88 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +60 +90 +64 +18 +60 +98 +24 +18 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +48 +40 +22 +74 +88 +8C +72 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 3 3 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 11 3 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 3 1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +10 +20 +40 +88 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +08 +30 +08 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +1C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +40 +40 +40 +78 +04 +04 +84 +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +80 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +10 +10 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 5 3 0 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 6 2 -1 +BITMAP +40 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 7 2 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +08 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +70 +88 +98 +A8 +A8 +9C +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +78 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +80 +80 +88 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +44 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +44 +50 +70 +50 +40 +44 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +44 +54 +70 +50 +40 +40 +F0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +7C +44 +44 +44 +EE +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +78 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EC +48 +50 +60 +70 +48 +44 +E6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +E0 +40 +40 +40 +40 +44 +44 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +C6 +6C +6C +54 +54 +54 +44 +EE +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +CE +64 +64 +54 +54 +4C +4C +E4 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +4C +44 +4C +78 +40 +40 +F0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +18 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +F8 +44 +44 +78 +48 +44 +44 +E6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +78 +88 +80 +E0 +38 +08 +88 +F0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +FE +92 +92 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +6C +28 +28 +38 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +54 +54 +54 +6C +28 +28 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +10 +28 +28 +44 +EE +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +28 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +88 +90 +20 +20 +48 +88 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 11 3 -2 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 2 1 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +40 +40 +78 +44 +44 +44 +44 +B8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +08 +08 +78 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +40 +F8 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 -3 +BITMAP +74 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +40 +40 +58 +64 +44 +44 +44 +EE +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 12 1 -3 +BITMAP +10 +00 +00 +F0 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +40 +40 +4C +50 +60 +50 +48 +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +E8 +54 +54 +54 +54 +D6 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +B8 +64 +44 +44 +44 +E6 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 -3 +BITMAP +B8 +44 +44 +44 +44 +78 +40 +40 +E0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 -3 +BITMAP +74 +88 +88 +88 +88 +78 +08 +08 +1C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +B8 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +40 +40 +F8 +40 +40 +40 +44 +38 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +44 +44 +28 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +44 +54 +54 +28 +28 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +28 +10 +28 +44 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 -3 +BITMAP +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +F8 +90 +20 +40 +88 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 10 2 -2 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 10 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 10 2 -2 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 9 3 -3 +BITMAP +80 +00 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +20 +20 +70 +A8 +A0 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +30 +48 +40 +F8 +20 +20 +44 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +7C +10 +7C +10 +38 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 10 3 -2 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +78 +48 +60 +90 +88 +48 +30 +90 +90 +F0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 1 2 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +44 +9A +A2 +A2 +9A +44 +38 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 6 1 2 +BITMAP +60 +10 +70 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +24 +48 +90 +48 +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +44 +BA +AA +B2 +AA +44 +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 4 1 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +F8 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +90 +60 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 2 3 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 -3 +BITMAP +CC +44 +44 +44 +44 +7A +40 +40 +40 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +7C +A8 +A8 +A8 +68 +28 +28 +28 +28 +6C +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 3 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 3 2 -3 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 5 2 3 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 6 1 2 +BITMAP +60 +90 +90 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +40 +C1 +42 +44 +E8 +12 +26 +4A +8F +02 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +40 +C1 +42 +44 +E8 +16 +29 +42 +84 +0F +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +60 +91 +22 +94 +68 +12 +26 +4A +8F +02 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 -2 +BITMAP +20 +00 +20 +20 +40 +80 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +28 +50 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +28 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +10 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +7C +30 +50 +5C +50 +F0 +90 +9C +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 -3 +BITMAP +70 +88 +88 +80 +80 +88 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +10 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +10 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +10 +28 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +28 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +E4 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +EE +64 +54 +54 +4C +4C +44 +E4 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +28 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +EE +44 +28 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +E0 +40 +78 +44 +44 +78 +40 +E0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +48 +48 +48 +50 +48 +44 +54 +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +40 +20 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +10 +20 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +20 +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +28 +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +20 +50 +20 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +6C +12 +7E +90 +92 +6C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +70 +88 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +38 +60 +90 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +28 +50 +00 +B8 +64 +44 +44 +44 +E6 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +40 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +A0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 -1 +BITMAP +08 +70 +98 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +20 +10 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +20 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +28 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +08 +10 +00 +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +40 +40 +78 +44 +44 +44 +44 +78 +40 +40 +E0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +28 +00 +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvB12-L1.bdf b/gui/themes/fonts/helvB12-L1.bdf new file mode 100644 index 0000000000..1eabe21c57 --- /dev/null +++ b/gui/themes/fonts/helvB12-L1.bdf @@ -0,0 +1,3059 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvB12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 13 15 -1 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +78 +D4 +D0 +78 +1C +94 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +0400 +09C0 +0B60 +1B60 +11C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3800 +6C00 +6C00 +3800 +7900 +CF00 +C600 +CF00 +7980 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +F8 +70 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +30 +30 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +30 +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +38 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1C +2C +2C +4C +8C +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +70 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +C0 +70 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4040 +8D40 +9240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +CB +CF +66 +3F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +C0 +C0 +40 +60 +60 +20 +20 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 4 0 5 +BITMAP +10 +38 +6C +C6 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +74 +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +30 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +76 +DC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 10 1 -3 +BITMAP +C0 +C0 +00 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +10 +78 +DC +90 +A0 +A0 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +60 +60 +F8 +60 +60 +EC +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +78 +48 +48 +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +48 +FC +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +CC +E0 +70 +D8 +CC +CC +6C +38 +1C +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +E0 +30 +F0 +B0 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +EC +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +3E +74 +F4 +F4 +F4 +74 +34 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +30 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 4 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +60 +D0 +D0 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0AC0 +1980 +3300 +33C0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +B300 +6600 +3600 +ED80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +60 +CC +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +30 +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 -3 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +18 +18 +70 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +60 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +18 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +E6 +E6 +F6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +30 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +66 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3D +66 +CF +CB +DB +D3 +F3 +66 +7C +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +C0 +C0 +FC +C6 +C6 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +CC +D8 +CC +CC +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +34 +58 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +30 +48 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +10 +18 +70 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 -1 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +90 +18 +7C +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 -1 0 +BITMAP +3D +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +0C +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +6C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvB12.bdf b/gui/themes/fonts/helvB12.bdf new file mode 100644 index 0000000000..76f5dbc552 --- /dev/null +++ b/gui/themes/fonts/helvB12.bdf @@ -0,0 +1,12708 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 15 20 -2 -5 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 756 +STARTCHAR char0 +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +78 +D4 +D0 +78 +1C +94 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +0400 +09C0 +0B60 +1B60 +11C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3800 +6C00 +6C00 +3800 +7900 +CF00 +C600 +CF00 +7980 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +F8 +70 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +30 +30 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +30 +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +38 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1C +2C +2C +4C +8C +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +70 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +C0 +70 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4040 +8D40 +9240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +CB +CF +66 +3F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +C0 +C0 +40 +60 +60 +20 +20 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 4 0 5 +BITMAP +10 +38 +6C +C6 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +74 +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +30 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +76 +DC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 10 1 -3 +BITMAP +C0 +C0 +00 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +10 +78 +DC +90 +A0 +A0 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +60 +60 +F8 +60 +60 +EC +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +78 +48 +48 +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +48 +FC +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +CC +E0 +70 +D8 +CC +CC +6C +38 +1C +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +E0 +30 +F0 +B0 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +EC +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +3E +74 +F4 +F4 +F4 +74 +34 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +30 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 4 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +60 +D0 +D0 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0AC0 +1980 +3300 +33C0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +B300 +6600 +3600 +ED80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +60 +CC +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +30 +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 -3 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +18 +18 +70 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +60 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +18 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +E6 +E6 +F6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +30 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +66 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3D +66 +CF +CB +DB +D3 +F3 +66 +7C +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +C0 +C0 +FC +C6 +C6 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +CC +D8 +CC +CC +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +34 +58 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +30 +48 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +10 +18 +70 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 -1 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +90 +18 +7C +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 -1 0 +BITMAP +3D +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +0C +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +6C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +3C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +22 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +44 +38 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 -3 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +DB +30 +30 +1C +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 -3 +BITMAP +78 +CC +0C +7C +CC +CC +7E +30 +30 +1C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +18 +30 +00 +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +30 +00 +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +38 +00 +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +0CC0 +0C40 +6C80 +DC00 +CC00 +CC00 +CC00 +DC00 +6C00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +3E +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +F0 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +88 +70 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +44 +38 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +60 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +60 +60 +38 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +60 +60 +38 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +D8 +70 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +38 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +38 +6C +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +38 +6C +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +44 +38 +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +44 +38 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +30 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 -5 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 14 0 -3 +BITMAP +10 +20 +30 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +70 +D8 +00 +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +FE +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +F8 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +68 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +68 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 -1 0 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +88 +70 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +88 +70 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 7 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 820 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +C180 +C180 +C180 +C180 +D980 +D980 +CF00 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 542 0 +DWIDTH 6 0 +BBX 5 12 0 -3 +BITMAP +D8 +00 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +18 +18 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +1C +36 +00 +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 13 -2 -3 +BITMAP +70 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 14 1 -5 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 14 0 -5 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +30 +60 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 14 1 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 14 0 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C080 +C100 +C000 +C000 +C000 +C000 +C000 +FC00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 542 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +C4 +C8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C000 +C000 +C000 +C000 +C180 +C180 +C000 +C000 +FC00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 542 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +CC +CC +C0 +C0 +C0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +60 +60 +78 +70 +E0 +60 +60 +60 +7E +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 -1 0 +BITMAP +60 +60 +70 +60 +E0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +30 +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 14 1 -5 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -5 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 875 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C000 +4000 +9B00 +1D80 +1980 +1980 +1980 +1980 +1980 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +06 +06 +0C +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +0C +0C +18 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +22 +1C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +44 +38 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +3FE0 +6600 +C600 +C600 +C7E0 +C600 +C600 +6600 +3FE0 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +7780 +CCC0 +CCC0 +CFC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +30 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +30 +60 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 14 1 -5 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 12 0 -5 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +D8 +70 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +30 +00 +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +18 +18 +70 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +18 +18 +70 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +6C +38 +00 +78 +CC +E0 +78 +1C +CE +7C +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 12 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +0C +0C +38 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 12 0 -3 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +70 +30 +30 +E0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +36 +1C +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +63 +61 +F2 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +3E +18 +18 +18 +18 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +F8 +60 +68 +30 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +44 +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +44 +38 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +38 +6C +38 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +30 +30 +1C +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +7C +30 +30 +1C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 12 0 0 +BITMAP +0E00 +1B00 +0000 +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0E00 +1B00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +36 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +38 +6C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +6C +00 +C3 +66 +24 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +0C +18 +00 +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +18 +30 +00 +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +18 +00 +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +00 +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +6C +38 +00 +FC +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D8 +70 +00 +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +78 +CC +06 +06 +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +0C +0C +0C +FC +0C +0C +0C +FC +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +0E +18 +18 +7C +30 +30 +30 +30 +30 +E0 +C0 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 9 0 0 +BITMAP +60 +60 +60 +60 +F8 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +60 +60 +60 +60 +F8 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +63 +73 +73 +6B +6B +67 +67 +63 +63 +60 +60 +C0 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +FF +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +3CC0 +6640 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +7B +CD +CE +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +1C +70 +E0 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +1C +70 +E0 +CC +78 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 12 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +0C +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +C780 +C680 +C700 +C600 +C600 +C600 +C600 +6C00 +7C00 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +CF +CD +CE +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +7C +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +F8 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +FC +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +30 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +36 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +6C +38 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +D8 +70 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +D8 +70 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +36 +1C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +38 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +38 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +3C +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +18 +30 +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +18 +30 +00 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +6C +38 +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +6C +38 +00 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +30 +18 +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +60 +30 +00 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 0 +BITMAP +3C +00 +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +78 +00 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 0 +BITMAP +3C +00 +18 +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +78 +00 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0F00 +0000 +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1E00 +0000 +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +3E00 +6300 +C000 +C000 +CF00 +CF80 +C300 +6300 +3D00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +FC +CC +78 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +6C +38 +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +6C +38 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 12 1 0 +BITMAP +6C +38 +00 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +D8 +70 +00 +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +30 +30 +1C +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +CC +CC +CC +CC +78 +60 +60 +38 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +3C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +30 +30 +1C +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +78 +60 +60 +38 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 13 -2 -3 +BITMAP +D8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +18 +30 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +18 +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +0C +18 +00 +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +18 +30 +00 +30 +48 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +0300 +0600 +0000 +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0600 +0C00 +0000 +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 13 1 -1 +BITMAP +0C +18 +00 +3D +66 +CF +CB +DB +D3 +F3 +66 +7C +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 -1 0 +BITMAP +0C +18 +00 +3D +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +58 +34 +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +B0 +68 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +22 +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +38 +44 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +B0 +68 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +B0 +68 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +70 +88 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +44 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 -1 0 +BITMAP +B0 +68 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -2 0 +BITMAP +B0 +68 +00 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +70 +88 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +70 +88 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +58 +34 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +B0 +68 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1C +22 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +44 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +58 +34 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +B0 +68 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +44 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +58 +34 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +B0 +68 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +44 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +44 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 -5 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -5 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 14 0 -5 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 14 0 -5 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +D8 +70 +00 +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +18 +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +30 +30 +E0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +66 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +3C +00 +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +78 +00 +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +3C +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +3C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +DC +66 +66 +7C +60 +66 +3C +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +0C +CC +78 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +78 +30 +E0 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +DC +6C +0C +0C +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +18 +18 +18 +18 +38 +F8 +D8 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +B0 +30 +30 +30 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +FC +CC +DC +6C +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +10 +38 +38 +6C +6C +C6 +C6 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +3300 +3300 +6D80 +6D80 +6D80 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +0C +18 +10 +30 +38 +38 +6C +6C +C6 +C6 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +C6 +66 +36 +1E +1E +36 +66 +06 +06 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 0 8 +BITMAP +70 +D8 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 0 8 +BITMAP +D8 +70 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 -2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 -3 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 -3 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 1 1 8 +BITMAP +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 7 +BITMAP +70 +D8 +70 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 1 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 6 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 4 0 8 +BITMAP +30 +60 +00 +D8 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +EC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 -4 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +00 +1C +36 +1C +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 -4 +BITMAP +78 +CC +0C +7C +CC +CC +76 +00 +38 +6C +38 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +00 +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +00 +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +00 +30 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +00 +30 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +00 +78 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 15 1 -3 +BITMAP +18 +30 +00 +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +18 +18 +70 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +18 +30 +00 +78 +CC +C0 +C0 +C0 +CC +78 +10 +18 +70 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +00 +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +00 +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +00 +30 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +00 +30 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +00 +78 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +18 +18 +70 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +7C +18 +18 +70 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +00 +38 +6C +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +00 +38 +6C +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +60 +30 +00 +F0 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +60 +30 +00 +78 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +18 +30 +00 +F0 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +18 +30 +00 +78 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +00 +70 +D8 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +00 +38 +6C +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 -3 +BITMAP +88 +70 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +30 +30 +E0 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +44 +38 +00 +78 +CC +CC +FC +C0 +CC +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +60 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 0 +BITMAP +30 +00 +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +00 +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +00 +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +00 +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +18 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +00 +30 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +00 +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +F6 +18 +18 +70 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +FC +18 +18 +70 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +00 +44 +38 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +00 +44 +38 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 -1 -3 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 12 -2 -3 +BITMAP +30 +00 +30 +30 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +30 +60 +00 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 12 -1 0 +BITMAP +30 +60 +00 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 12 1 0 +BITMAP +18 +30 +00 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +30 +60 +00 +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 11 1 -2 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +30 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 11 1 -2 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +00 +3C +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +78 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 1 -2 +BITMAP +F0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 13 -1 -2 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +60 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +F0 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 -1 -2 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +70 +D8 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 12 -1 -3 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +70 +D8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0C00 +1800 +0000 +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0600 +0C00 +0000 +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +0C00 +0000 +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 11 1 -2 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 9 0 -2 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +00 +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +18 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +00 +30 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +3C +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +00 +78 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +00 +38 +6C +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +00 +38 +6C +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +0C +18 +00 +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +18 +30 +00 +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +36 +00 +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +6C +00 +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +30 +18 +00 +3C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +60 +30 +00 +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +18 +00 +3C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +18 +30 +00 +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +18 +30 +00 +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 -3 +BITMAP +18 +30 +00 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +30 +00 +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +30 +00 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +30 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +00 +18 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 9 0 -2 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +78 +00 +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +00 +18 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 11 0 -2 +BITMAP +F0 +00 +D8 +F8 +E0 +C0 +C0 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +00 +3C +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 9 0 -2 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +00 +F0 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +00 +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +00 +18 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +18 +00 +18 +30 +00 +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +30 +00 +18 +30 +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +00 +6C +38 +00 +78 +CC +E0 +78 +1C +CE +7C +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 0 +BITMAP +30 +00 +D8 +70 +00 +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +18 +00 +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +00 +18 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +00 +78 +CC +E0 +38 +1C +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +18 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 0 +BITMAP +60 +00 +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 -2 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +00 +30 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +00 +3C +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 -2 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +00 +78 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 12 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +00 +1C +36 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 12 0 -3 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +00 +70 +D8 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +00 +6C +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +DC +6C +00 +6C +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +00 +34 +58 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +6C +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +00 +38 +6C +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +6C +00 +38 +6C +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +18 +30 +00 +34 +58 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +18 +30 +00 +34 +58 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +3C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +34 +58 +00 +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +00 +18 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 9 0 -2 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +00 +18 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 12 0 0 +BITMAP +1800 +0C00 +0000 +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +1800 +0C00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 12 0 0 +BITMAP +0600 +0C00 +0000 +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0600 +0C00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +1B00 +0000 +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1B00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +0C00 +0000 +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +0C00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 9 0 -2 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +18 +00 +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +36 +00 +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +18 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +38 +6C +00 +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +D8 +00 +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +00 +30 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +00 +60 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +00 +78 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +00 +F0 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +00 +78 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 11 0 0 +BITMAP +0E00 +1B00 +0E00 +0000 +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 14 0 -3 +BITMAP +38 +6C +38 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +78 +CC +0C +7C +CC +CC +76 +00 +18 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +0C +18 +00 +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +18 +30 +00 +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +30 +18 +00 +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +30 +18 +00 +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +1A +2C +00 +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +34 +58 +00 +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +1C +36 +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +00 +18 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +0C +18 +00 +22 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +18 +30 +00 +44 +38 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +30 +18 +00 +22 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +30 +18 +00 +44 +38 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +1A +2C +00 +22 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 13 0 0 +BITMAP +34 +58 +00 +44 +38 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +22 +1C +00 +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +44 +38 +00 +78 +CC +0C +7C +CC +CC +76 +00 +18 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +00 +60 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +68 +B0 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +18 +30 +00 +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +18 +30 +00 +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +60 +30 +00 +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +30 +18 +00 +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +34 +58 +00 +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +34 +58 +00 +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +70 +D8 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +00 +60 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 -2 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +0C +18 +00 +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +18 +30 +00 +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +30 +18 +00 +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +30 +18 +00 +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +1A +2C +00 +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 0 0 +BITMAP +34 +58 +00 +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 -2 +BITMAP +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0600 +0C00 +0000 +3CC0 +6640 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0C +18 +00 +7B +CD +CE +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +1800 +0C00 +0000 +3CC0 +6640 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +30 +18 +00 +7B +CD +CE +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0D00 +1600 +0000 +3CC0 +6640 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1A +2C +00 +7B +CD +CE +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 1 -2 +BITMAP +3CC0 +6640 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +0000 +1800 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +7B +CD +CE +CC +CC +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +00 +18 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +DC +6C +00 +30 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0C00 +1800 +0000 +C780 +C680 +C700 +C600 +C600 +C600 +C600 +6C00 +7C00 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0C +18 +00 +CF +CD +CE +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +1800 +0C00 +0000 +C780 +C680 +C700 +C600 +C600 +C600 +C600 +6C00 +7C00 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +30 +18 +00 +CF +CD +CE +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +1A00 +2C00 +0000 +C780 +C680 +C700 +C600 +C600 +C600 +C600 +6C00 +7C00 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1A +2C +00 +CF +CD +CE +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +C780 +C680 +C700 +C600 +C600 +C600 +C600 +6C00 +7C00 +0000 +1800 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +CF +CD +CE +CC +CC +DC +6C +00 +18 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +30 +18 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +30 +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +00 +18 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -5 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +00 +30 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +34 +58 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 250 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 167 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 200 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 100 0 +DWIDTH 1 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200B +ENCODING 8203 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 0 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 0 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 -2 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 6 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 6 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 -2 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 6 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +FC +30 +30 +30 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 350 0 +DWIDTH 4 0 +BBX 4 3 0 2 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 1 1 0 +BITMAP +CCC0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 13 8 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +05B0 +0B68 +1B68 +11B0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 5 1 1 +BITMAP +20 +60 +C0 +60 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +60 +C0 +80 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 167 0 +DWIDTH 4 0 +BBX 5 8 -1 0 +BITMAP +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 -3 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 -3 +BITMAP +60 +B0 +60 +C0 +F0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 -3 +BITMAP +60 +B0 +60 +30 +E0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 9 0 -1 +BITMAP +0600 +BF80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +DCC0 +1800 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +FE +D6 +FE +CE +C6 +C6 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +7F80 +6D80 +7F80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 -1 0 +BITMAP +0F00 +1980 +3000 +FC00 +3000 +FC00 +3000 +1980 +0F00 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +FF +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 1102 0 +DWIDTH 13 0 +BBX 13 9 0 0 +BITMAP +00F0 +6198 +9300 +9300 +6300 +0300 +0300 +0198 +00F0 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 991 0 +DWIDTH 12 0 +BBX 12 9 0 0 +BITMAP +03F0 +6300 +9300 +9300 +63E0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 5 1 3 +BITMAP +E880 +4D80 +4A80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +0C +0C +0C +0C +7C +0C +0C +0C +FC +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +C3 +7E +66 +66 +24 +3C +18 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +0C +0C +0C +FC +0C +0C +0C +FC +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +1C +1C +3C +FC +2C +2C +6C +FC +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 167 0 +DWIDTH 4 0 +BBX 5 8 -1 0 +BITMAP +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +38 +6C +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +6C +38 +00 +FC +00 +FC +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +18 +18 +10 +FC +30 +FC +20 +60 +60 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +18 +18 +FC +30 +FC +20 +FC +60 +60 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +18 +70 +C0 +70 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +C0 +70 +18 +70 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +18 +18 +18 +70 +F0 +70 +38 +60 +60 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +18 +18 +D0 +70 +38 +70 +E0 +60 +60 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +18 +18 +70 +F0 +70 +38 +20 +F8 +60 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +18 +D8 +70 +38 +70 +E0 +20 +F8 +60 +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +36 +60 +F6 +66 +66 +66 +66 +66 +66 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +36 +66 +F6 +66 +66 +66 +66 +66 +66 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvBO12-L1.bdf b/gui/themes/fonts/helvBO12-L1.bdf new file mode 100644 index 0000000000..9073827992 --- /dev/null +++ b/gui/themes/fonts/helvBO12-L1.bdf @@ -0,0 +1,3058 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvBO12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Bold-O-Normal--12-120-75-75-P-69-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 16 15 -2 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 69 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +AA80 +0000 +8080 +0000 +8080 +0000 +8080 +0000 +AA80 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 6 0 +BBX 7 3 2 6 +BITMAP +36 +6C +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -1 +BITMAP +08 +3C +6E +70 +38 +1C +2C +EC +78 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 9 2 0 +BITMAP +70C0 +D980 +DB00 +7600 +0600 +0DC0 +1B60 +3360 +61C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +1C +36 +36 +1C +39 +6F +C6 +CE +7B +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 4 0 +BBX 4 3 2 6 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +0C +18 +30 +30 +60 +60 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +30 +18 +18 +0C +0C +0C +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 4 4 3 5 +BITMAP +50 +60 +F0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +18 +FE +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 2 0 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 9 0 0 +BITMAP +02 +06 +0C +18 +10 +30 +60 +C0 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +46 +C6 +C4 +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 2 0 +BITMAP +18 +F8 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +0C +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +06 +3C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +06 +0E +16 +26 +4C +CC +FE +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +30 +60 +78 +0C +0C +0C +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +36 +60 +78 +EC +CC +C4 +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +7E +06 +0C +0C +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +2C +78 +CC +CC +DC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +46 +66 +6E +3C +0C +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 1 -2 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 2 1 +BITMAP +1C +70 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 1 2 +BITMAP +7C +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +30 +18 +0C +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +78 +CC +9C +38 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 11 10 1 -1 +BITMAP +0F80 +3040 +6020 +46A0 +8920 +9120 +9240 +4D80 +6000 +1E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +0300 +0300 +0600 +0600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 9 1 0 +BITMAP +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +DE00 +CE00 +7B00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 2 0 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 9 3 0 +BITMAP +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 2 0 +BITMAP +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 9 2 0 +BITMAP +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -1 -3 +BITMAP +0F +0C +18 +18 +30 +30 +30 +60 +60 +60 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 9 2 0 +BITMAP +C0 +C0 +C0 +40 +40 +40 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -2 -3 +BITMAP +0F +03 +06 +06 +0C +0C +0C +18 +18 +18 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 6 1 3 +BITMAP +18 +38 +6C +6C +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 -1 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 9 1 0 +BITMAP +0E +18 +7C +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 12 -2 -3 +BITMAP +06 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 7 0 0 +BITMAP +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1D +37 +63 +66 +C6 +CC +7C +0C +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 7 0 0 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 2 0 +BITMAP +CC +CC +D8 +D8 +F0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 7 1 0 +BITMAP +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 -3 +BITMAP +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 1 -3 +BITMAP +0E +18 +30 +30 +60 +C0 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +18 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 -1 -3 +BITMAP +1C +06 +06 +0C +0C +06 +0C +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 1 3 +BITMAP +74 +B8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 10 -1 -3 +BITMAP +18 +18 +00 +10 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +04 +3C +6E +D0 +D0 +E6 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +19 +10 +7C +30 +30 +60 +E6 +DC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 6 0 1 +BITMAP +33 +1E +34 +2C +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +66 +66 +6C +38 +FC +30 +F8 +60 +60 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +18 +18 +00 +00 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +0E +1B +19 +38 +6C +66 +66 +36 +1C +98 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +5140 +A040 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +08 +78 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +1980 +7700 +CC00 +6600 +3300 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 2 1 +BITMAP +FC +04 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +4A40 +9C40 +9480 +9280 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 2 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 8 7 0 0 +BITMAP +0C +0C +7F +18 +18 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +60 +B0 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +70 +30 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 10 10 -2 -3 +BITMAP +0CC0 +0CC0 +18C0 +1980 +3180 +3300 +6D00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 2 -3 +BITMAP +3E +74 +F4 +F4 +E8 +E8 +68 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +90 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 1 4 +BITMAP +20 +E0 +20 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +68 +58 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +6600 +3300 +1980 +7700 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 2 0 +BITMAP +2000 +E300 +2600 +4C00 +5900 +1300 +3500 +6F80 +C200 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2000 +E300 +2600 +4C00 +5B00 +1580 +3100 +6200 +C780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +7000 +3180 +6300 +3600 +EC80 +0980 +1A80 +37C0 +6100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +0C +0C +00 +08 +18 +70 +E4 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +03 +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0680 +0B00 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 9 0 0 +BITMAP +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 12 1 0 +BITMAP +30 +18 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +06 +0C +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +1C +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0340 +0580 +0000 +18C0 +18C0 +38C0 +3980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0180 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +66 +3C +38 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 9 0 0 +BITMAP +07A0 +1CC0 +19C0 +32C0 +3580 +6980 +7300 +6700 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +6C +6C +38 +30 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +18 +18 +3E +33 +23 +66 +7C +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +1B +33 +36 +6C +66 +66 +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +06 +0C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1A +2C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +0C +12 +0C +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 7 0 0 +BITMAP +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +60 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +18 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 9 0 0 +BITMAP +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +32 +1C +26 +1F +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +00 +FE +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 8 -1 0 +BITMAP +0080 +0F00 +1B80 +3580 +3B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +18 +30 +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0C00 +1B00 +1D80 +1180 +3300 +3300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +6C +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvBO12.bdf b/gui/themes/fonts/helvBO12.bdf new file mode 100644 index 0000000000..728796dc26 --- /dev/null +++ b/gui/themes/fonts/helvBO12.bdf @@ -0,0 +1,12195 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--12-120-75-75-P-69-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 17 20 -2 -5 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 69 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 723 +STARTCHAR char0 +ENCODING 0 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +AA80 +0000 +8080 +0000 +8080 +0000 +8080 +0000 +AA80 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 6 0 +BBX 7 3 2 6 +BITMAP +36 +6C +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -1 +BITMAP +08 +3C +6E +70 +38 +1C +2C +EC +78 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 9 2 0 +BITMAP +70C0 +D980 +DB00 +7600 +0600 +0DC0 +1B60 +3360 +61C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +1C +36 +36 +1C +39 +6F +C6 +CE +7B +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 4 0 +BBX 4 3 2 6 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +0C +18 +30 +30 +60 +60 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +30 +18 +18 +0C +0C +0C +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 4 4 3 5 +BITMAP +50 +60 +F0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +18 +FE +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 2 0 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 9 0 0 +BITMAP +02 +06 +0C +18 +10 +30 +60 +C0 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +46 +C6 +C4 +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 2 0 +BITMAP +18 +F8 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +0C +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +06 +3C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +06 +0E +16 +26 +4C +CC +FE +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +30 +60 +78 +0C +0C +0C +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +36 +60 +78 +EC +CC +C4 +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +7E +06 +0C +0C +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +2C +78 +CC +CC +DC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +46 +66 +6E +3C +0C +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 1 -2 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 2 1 +BITMAP +1C +70 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 1 2 +BITMAP +7C +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +30 +18 +0C +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +78 +CC +9C +38 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 11 10 1 -1 +BITMAP +0F80 +3040 +6020 +46A0 +8920 +9120 +9240 +4D80 +6000 +1E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +0300 +0300 +0600 +0600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 9 1 0 +BITMAP +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +DE00 +CE00 +7B00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 2 0 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 9 3 0 +BITMAP +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 2 0 +BITMAP +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 9 2 0 +BITMAP +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -1 -3 +BITMAP +0F +0C +18 +18 +30 +30 +30 +60 +60 +60 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 9 2 0 +BITMAP +C0 +C0 +C0 +40 +40 +40 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -2 -3 +BITMAP +0F +03 +06 +06 +0C +0C +0C +18 +18 +18 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 6 1 3 +BITMAP +18 +38 +6C +6C +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 -1 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 9 1 0 +BITMAP +0E +18 +7C +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 12 -2 -3 +BITMAP +06 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 7 0 0 +BITMAP +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1D +37 +63 +66 +C6 +CC +7C +0C +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 7 0 0 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 2 0 +BITMAP +CC +CC +D8 +D8 +F0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 7 1 0 +BITMAP +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 -3 +BITMAP +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 1 -3 +BITMAP +0E +18 +30 +30 +60 +C0 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +18 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 -1 -3 +BITMAP +1C +06 +06 +0C +0C +06 +0C +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 1 3 +BITMAP +74 +B8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 10 -1 -3 +BITMAP +18 +18 +00 +10 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +04 +3C +6E +D0 +D0 +E6 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +19 +10 +7C +30 +30 +60 +E6 +DC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 6 0 1 +BITMAP +33 +1E +34 +2C +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +66 +66 +6C +38 +FC +30 +F8 +60 +60 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +18 +18 +00 +00 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +0E +1B +19 +38 +6C +66 +66 +36 +1C +98 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +5140 +A040 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +08 +78 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +1980 +7700 +CC00 +6600 +3300 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 2 1 +BITMAP +FC +04 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +4A40 +9C40 +9480 +9280 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 2 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 8 7 0 0 +BITMAP +0C +0C +7F +18 +18 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +60 +B0 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +70 +30 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 10 10 -2 -3 +BITMAP +0CC0 +0CC0 +18C0 +1980 +3180 +3300 +6D00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 2 -3 +BITMAP +3E +74 +F4 +F4 +E8 +E8 +68 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +90 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 1 4 +BITMAP +20 +E0 +20 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +68 +58 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +6600 +3300 +1980 +7700 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 2 0 +BITMAP +2000 +E300 +2600 +4C00 +5900 +1300 +3500 +6F80 +C200 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2000 +E300 +2600 +4C00 +5B00 +1580 +3100 +6200 +C780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +7000 +3180 +6300 +3600 +EC80 +0980 +1A80 +37C0 +6100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +0C +0C +00 +08 +18 +70 +E4 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +03 +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0680 +0B00 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 9 0 0 +BITMAP +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 12 1 0 +BITMAP +30 +18 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +06 +0C +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +1C +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0340 +0580 +0000 +18C0 +18C0 +38C0 +3980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0180 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +66 +3C +38 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 9 0 0 +BITMAP +07A0 +1CC0 +19C0 +32C0 +3580 +6980 +7300 +6700 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +6C +6C +38 +30 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +18 +18 +3E +33 +23 +66 +7C +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +1B +33 +36 +6C +66 +66 +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +06 +0C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1A +2C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +0C +12 +0C +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 7 0 0 +BITMAP +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +60 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +18 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 9 0 0 +BITMAP +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +32 +1C +26 +1F +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +00 +FE +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 8 -1 0 +BITMAP +0080 +0F00 +1B80 +3580 +3B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +18 +30 +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0C00 +1B00 +1D80 +1180 +3300 +3300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +6C +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +1E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +3C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1B +0E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +6C +38 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 -3 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +CF +18 +10 +1C +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 -3 +BITMAP +3C +66 +06 +7C +CC +98 +FC +30 +20 +38 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 1 0 +BITMAP +08 +1C +36 +00 +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +08 +1C +36 +00 +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0C +00 +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0C +00 +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 1 0 +BITMAP +36 +1C +08 +00 +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +1C +08 +00 +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 13 9 0 0 +BITMAP +0198 +0198 +1B30 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0F80 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1E00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1E +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +3600 +1C00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +36 +1C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 -3 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +3000 +2000 +3800 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +30 +20 +38 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 13 1 0 +BITMAP +3600 +1C00 +0800 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +1C +08 +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +0400 +0E00 +1B00 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 14 -1 -3 +BITMAP +0400 +0E00 +1B00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +1B00 +0E00 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 13 -1 -3 +BITMAP +1B00 +0E00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 -5 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +0000 +1800 +1800 +0800 +1000 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 14 -1 -3 +BITMAP +0600 +0C00 +0C00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0400 +0E00 +1B00 +0000 +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +08 +1C +36 +00 +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +FFC0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +F8 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 12 1 0 +BITMAP +34 +58 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 11 1 0 +BITMAP +78 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +78 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 12 1 0 +BITMAP +6C +38 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +D8 +70 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 12 1 -3 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +E0 +C0 +80 +E0 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 12 0 -3 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +E0 +C0 +80 +E0 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 11 1 0 +BITMAP +30 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 7 0 0 +BITMAP +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 820 0 +DWIDTH 12 0 +BBX 13 9 1 0 +BITMAP +1818 +1818 +3030 +3030 +6060 +6060 +6C60 +CCC0 +C780 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 542 0 +DWIDTH 6 0 +BBX 8 12 0 -3 +BITMAP +1B +00 +36 +36 +6C +6C +6C +D8 +D8 +18 +30 +60 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 13 0 0 +BITMAP +0200 +0700 +0D80 +0000 +0180 +0180 +0300 +0300 +0600 +0600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 14 -2 -3 +BITMAP +08 +1C +36 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 1 -5 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +0000 +1800 +1800 +0800 +1000 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 14 0 -5 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +18 +30 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 12 0 0 +BITMAP +18 +30 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 14 1 -5 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 14 0 -5 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 12 9 1 0 +BITMAP +1830 +1830 +3060 +3000 +6000 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 542 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +1980 +1980 +3300 +3000 +6000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 858 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1800 +1800 +3000 +3000 +60C0 +60C0 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 542 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +18 +18 +30 +30 +66 +66 +60 +C0 +C0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +18 +30 +38 +E0 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +38 +E0 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0300 +0600 +0000 +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0C +18 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 1 -5 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +0000 +1800 +1800 +0800 +1000 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 -5 +BITMAP +36 +3B +63 +66 +66 +CC +CC +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +1C +08 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 875 0 +DWIDTH 11 0 +BBX 9 9 3 0 +BITMAP +6000 +6000 +DB00 +1D80 +3180 +3300 +3300 +6600 +6600 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 -3 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +0600 +0C00 +1800 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +36 +3B +63 +66 +66 +CC +CC +0C +18 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1E00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1E +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +1B00 +0E00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +36 +1C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0D80 +1B00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1B +36 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 13 9 1 0 +BITMAP +0FF8 +3980 +3300 +6300 +67E0 +C600 +C600 +CC00 +7FC0 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 12 7 0 0 +BITMAP +1DE0 +3330 +6230 +67E0 +C600 +CCC0 +7F80 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0C00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 10 0 0 +BITMAP +0C +18 +00 +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 14 1 -5 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +0000 +1800 +1800 +0800 +1000 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 0 -5 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 11 0 0 +BITMAP +36 +1C +08 +00 +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 13 1 0 +BITMAP +08 +1C +36 +00 +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +08 +1C +36 +00 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +18 +48 +70 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +38 +1C +0C +CC +78 +18 +48 +70 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1B +0E +04 +1E +33 +31 +1C +86 +C6 +7C +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1B +0E +04 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 2 -3 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +E0 +30 +90 +E0 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 1 -3 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +30 +90 +E0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 2 0 +BITMAP +6C +38 +10 +00 +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +7D80 +3000 +6000 +6000 +6000 +C000 +E000 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 2 0 +BITMAP +FF +18 +30 +30 +7E +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +18 +18 +7C +30 +60 +7C +60 +C0 +E0 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0D00 +1600 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1A +2C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1E00 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1E +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +3600 +1C00 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +36 +1C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 1 0 +BITMAP +1C00 +3600 +1C00 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +1C +36 +1C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +1B00 +3600 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1B +36 +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 -3 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +3000 +2000 +3800 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +33 +33 +63 +66 +C6 +CC +7C +30 +20 +38 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 13 2 0 +BITMAP +0800 +1C00 +3600 +0000 +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0400 +0E00 +1B00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 13 2 0 +BITMAP +10 +38 +6C +00 +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 14 1 -3 +BITMAP +10 +38 +6C +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 3 0 +BITMAP +6C +00 +C6 +CC +D8 +70 +60 +C0 +C0 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 0 0 +BITMAP +0600 +0C00 +0000 +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +0C +18 +00 +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 0 +BITMAP +0C00 +0000 +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +18 +00 +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 0 0 +BITMAP +1B00 +0E00 +0400 +3F80 +0300 +0600 +1C00 +3000 +6000 +FE00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +36 +1C +08 +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +03 +03 +06 +C6 +CC +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +0180 +0300 +0300 +3F00 +0600 +0600 +0C00 +FC00 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 11 0 -3 +BITMAP +0E +18 +18 +7C +30 +30 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +F8 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +30 +F8 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 12 12 -1 -3 +BITMAP +0630 +0630 +0E60 +0A60 +1A60 +1940 +19C0 +3080 +3080 +3000 +6000 +C000 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +FF80 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 9 1 0 +BITMAP +0F60 +39E0 +31C0 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 7 0 0 +BITMAP +1E60 +3360 +63C0 +6600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 11 9 1 0 +BITMAP +31E0 +31E0 +63C0 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 7 0 0 +BITMAP +3360 +3360 +63C0 +6600 +C600 +CC00 +7400 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +3F80 +0300 +0600 +0C00 +3E00 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3E +06 +0C +7C +60 +C0 +F8 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +0C +FE +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +30 +60 +78 +0C +0C +0C +D8 +70 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +18 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 12 1 -2 +BITMAP +0C +0C +0C +08 +18 +7C +10 +F8 +30 +20 +60 +60 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 0 +BITMAP +1B +0E +04 +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +6C +38 +10 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 13 1 0 +BITMAP +6C +38 +10 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 0 +BITMAP +D8 +70 +20 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +1C +08 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 1 0 +BITMAP +3600 +1C00 +0800 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +1C +08 +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 1 0 +BITMAP +1E00 +0000 +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +1E +00 +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 14 1 0 +BITMAP +0600 +0C00 +0000 +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +06 +0C +00 +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +36 +1C +08 +00 +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0000 +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +18 +0C +00 +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +03 +7E +C6 +CC +78 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 0 0 +BITMAP +0F00 +0000 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +3C +00 +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 0 +BITMAP +1E +00 +0C +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +3C +00 +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 11 0 0 +BITMAP +03C0 +0000 +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 9 0 0 +BITMAP +0F00 +0000 +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C7C0 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +FF80 +CC00 +7800 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 14 -1 -3 +BITMAP +1B00 +0E00 +0400 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +36 +1C +08 +00 +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 -3 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +3000 +2000 +3800 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +30 +20 +38 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 -3 +BITMAP +1E00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +3000 +2000 +3800 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +1E +00 +1E +33 +63 +66 +C6 +CC +78 +30 +20 +38 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 14 -2 -3 +BITMAP +36 +1C +08 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0C00 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 13 -1 -3 +BITMAP +0600 +0C00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0C00 +0600 +0000 +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 0 0 +BITMAP +0300 +0600 +0000 +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +0C +18 +00 +0C +12 +0C +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 12 0 0 +BITMAP +00C0 +0180 +0000 +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 10 0 0 +BITMAP +0300 +0600 +0000 +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 12 0 0 +BITMAP +0300 +0600 +0000 +07A0 +1CC0 +19C0 +32C0 +3580 +6980 +7300 +6700 +BC00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 -1 0 +BITMAP +0300 +0600 +0000 +0080 +0F00 +1B80 +3580 +3B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 14 1 -5 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -5 +BITMAP +1E +33 +38 +1C +0C +CC +78 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 14 2 -5 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 14 1 -5 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +1B00 +0E00 +0400 +0000 +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +36 +1C +08 +00 +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +0C +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 -3 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +1800 +4800 +7000 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +18 +48 +70 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +0F00 +0000 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +1E +00 +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +0F00 +0000 +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +1E +00 +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1E00 +0000 +0C00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +1E +00 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 2 0 +BITMAP +3C +00 +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +78 +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +6E +32 +66 +7C +C0 +CC +78 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +03 +7E +C6 +CC +78 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 9 1 -2 +BITMAP +06 +06 +0C +0C +18 +18 +7C +30 +E0 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +33 +33 +66 +66 +C6 +DC +6C +18 +18 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +FF +C6 +CC +78 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 7 0 0 +BITMAP +06 +06 +0C +0C +1C +78 +D8 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +1C +0C +18 +18 +18 +30 +F8 +60 +60 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +33 +63 +FF +C6 +CC +74 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 2 0 +BITMAP +08 +18 +3C +6C +6C +CC +CC +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 7 1 0 +BITMAP +1980 +3B80 +2A80 +6EC0 +6EC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +0C +18 +18 +38 +28 +6C +CC +CC +CC +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +63 +33 +36 +1E +3E +6C +CC +18 +18 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +C0 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +C0 +C0 +60 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 2 7 +BITMAP +20 +70 +D8 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 3 6 +BITMAP +D8 +70 +20 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 238 0 +DWIDTH 4 0 +BBX 4 3 2 6 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 -2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 -3 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 -3 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 2 2 7 +BITMAP +D8 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 1 3 8 +BITMAP +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 2 6 +BITMAP +70 +D8 +70 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 4 0 -3 +BITMAP +60 +C0 +80 +E0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 3 7 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 2 2 7 +BITMAP +6C +D8 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 2 6 +BITMAP +6C +6C +D8 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 1 -2 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 4 3 8 +BITMAP +30 +60 +00 +D8 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 10 10 -2 -3 +BITMAP +0CC0 +0CC0 +18C0 +1980 +3180 +3300 +6D00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 13 0 -4 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +00 +1C +36 +1C +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 11 0 -4 +BITMAP +3C +66 +06 +7C +CC +98 +EC +00 +38 +6C +38 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +18 +00 +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +0000 +1800 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +00 +30 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 1 -3 +BITMAP +0C +18 +00 +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 -3 +BITMAP +0C +18 +00 +1E +33 +60 +60 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 0 +BITMAP +0600 +0000 +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +0000 +1800 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 -2 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +0000 +1800 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 -2 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 -3 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +0C00 +2400 +3800 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 0 -3 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +1800 +4800 +7000 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 13 1 -4 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +0000 +1000 +3800 +6C00 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 13 0 -4 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +0000 +1000 +3800 +6C00 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0000 +1E00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +18 +0C +00 +1E +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 14 1 0 +BITMAP +0600 +0C00 +0000 +1E00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +06 +0C +00 +1E +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 13 1 -4 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +0000 +1000 +3800 +6C00 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 -4 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +00 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 -3 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +0000 +6800 +B000 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +00 +34 +58 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 15 1 -3 +BITMAP +3600 +1C00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +1800 +4800 +7000 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 -3 +BITMAP +36 +1C +00 +1E +33 +63 +7E +C0 +CC +78 +18 +48 +70 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +18 +00 +0E +18 +7C +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1E00 +0000 +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +1E00 +0000 +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0600 +0000 +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +18 +00 +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 -2 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +0000 +1800 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +00 +18 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +1B00 +0000 +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +00 +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 -3 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +DE00 +0C00 +2400 +3800 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +FC +18 +48 +70 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 -3 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +0000 +3600 +1C00 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +00 +6C +38 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +0C +0C +18 +18 +30 +30 +30 +60 +60 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 12 -1 -3 +BITMAP +0C +00 +18 +18 +30 +30 +30 +60 +60 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 1 0 +BITMAP +0C +18 +00 +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 12 0 0 +BITMAP +18 +30 +00 +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 12 1 0 +BITMAP +0600 +0C00 +0000 +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 11 1 -2 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +0000 +1800 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +00 +18 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 11 1 -2 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +00 +3C +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +00 +30 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 1 -2 +BITMAP +78 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +FC +00 +30 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 13 0 -2 +BITMAP +78 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 13 1 -4 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +00 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 13 -1 -4 +BITMAP +0C +0C +18 +18 +30 +30 +30 +60 +60 +00 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 12 1 0 +BITMAP +0180 +0300 +0000 +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 10 0 0 +BITMAP +0300 +0600 +0000 +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 11 1 0 +BITMAP +0300 +0000 +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 9 0 0 +BITMAP +0300 +0000 +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 11 1 -2 +BITMAP +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 9 0 -2 +BITMAP +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0600 +0000 +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 -2 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +0000 +1800 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +36 +3B +63 +66 +66 +CC +CC +00 +30 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 -2 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +36 +3B +63 +66 +66 +CC +CC +00 +78 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 13 1 -4 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +0000 +0800 +1C00 +3600 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -4 +BITMAP +36 +3B +63 +66 +66 +CC +CC +00 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 15 1 0 +BITMAP +0300 +0600 +0000 +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +06 +0C +00 +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +1B00 +0000 +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +1B +00 +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0000 +1E00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +18 +0C +00 +1E +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +0600 +0C00 +0000 +1E00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +06 +0C +00 +1E +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0600 +0C00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 13 -1 -3 +BITMAP +0600 +0C00 +0000 +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0000 +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 9 0 0 +BITMAP +18 +00 +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +0000 +1800 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 9 0 -2 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 13 1 -2 +BITMAP +1E00 +0000 +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +0000 +1800 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 11 0 -2 +BITMAP +3C +00 +36 +3C +70 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 9 0 -2 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +00 +F0 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0C +00 +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0C +00 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 1 -2 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +1E +33 +38 +1C +0C +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 14 1 0 +BITMAP +0C +00 +0C +18 +00 +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +0C +00 +06 +0C +00 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +0C +00 +1B +0E +04 +1E +33 +31 +1C +86 +C6 +7C +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 0 +BITMAP +0C +00 +1B +0E +04 +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 13 1 -2 +BITMAP +0C +00 +1E +33 +63 +70 +3C +0E +C6 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +00 +1E +33 +38 +1C +0C +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 2 0 +BITMAP +18 +00 +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 11 1 0 +BITMAP +30 +00 +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 2 -2 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 11 1 -2 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +00 +60 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 2 -2 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +F0 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 11 1 -2 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +00 +F0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 2 -4 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 13 1 -4 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +00 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 -2 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +0000 +6C00 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +00 +6C +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 -3 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +0000 +3400 +5800 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +00 +34 +58 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 1 -4 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +0000 +1000 +3800 +6C00 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -4 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +00 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 1 0 +BITMAP +0600 +0C00 +0000 +0D00 +1600 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +0C +18 +00 +1A +2C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 13 1 0 +BITMAP +1B00 +0000 +1E00 +0000 +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +36 +00 +1E +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 12 3 0 +BITMAP +1A +2C +00 +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 2 0 +BITMAP +34 +58 +00 +CC +CC +D8 +D8 +F0 +60 +40 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 11 3 -2 +BITMAP +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +00 +30 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 2 -2 +BITMAP +CC +CC +D8 +D8 +F0 +60 +40 +00 +60 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 12 2 0 +BITMAP +1800 +0C00 +0000 +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +1800 +0C00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 12 2 0 +BITMAP +0600 +0C00 +0000 +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +0600 +0C00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 2 0 +BITMAP +3600 +0000 +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +1B00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 2 0 +BITMAP +0C00 +0000 +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +0C00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 11 2 -2 +BITMAP +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +0000 +1800 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 9 1 -2 +BITMAP +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +0000 +0C00 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +0C00 +0000 +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0C +00 +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +1B00 +0000 +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +36 +00 +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 2 0 +BITMAP +18 +00 +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +30 +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 13 0 0 +BITMAP +0400 +0E00 +1B00 +0000 +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +08 +1C +36 +00 +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 -2 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +0000 +3000 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 9 0 -2 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +00 +30 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 11 0 -2 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +0000 +7800 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 9 0 -2 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 11 0 -2 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +00 +3C +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 11 1 0 +BITMAP +6C +00 +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0E00 +1B00 +0E00 +0000 +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 14 1 -3 +BITMAP +38 +6C +38 +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 -2 +BITMAP +3C +66 +06 +7C +CC +98 +EC +00 +30 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 0 0 +BITMAP +0300 +0600 +0000 +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +0C +18 +00 +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 0 0 +BITMAP +0C00 +0600 +0000 +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +30 +18 +00 +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 15 0 0 +BITMAP +0D00 +1600 +0000 +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +1A +2C +00 +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 -2 +BITMAP +04 +0E +1B +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 -2 +BITMAP +08 +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +00 +30 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +06 +0C +00 +1B +0E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +18 +30 +00 +6C +38 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +18 +0C +00 +1B +0E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +30 +18 +00 +6C +38 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 15 0 0 +BITMAP +0D +16 +00 +1B +0E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +34 +58 +00 +6C +38 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +1B +0E +00 +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +00 +18 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 12 0 -2 +BITMAP +36 +1C +00 +3C +66 +06 +7C +CC +98 +EC +00 +30 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 -2 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +0000 +3000 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0D00 +1600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +1A +2C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 15 1 0 +BITMAP +0300 +0600 +0000 +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +06 +0C +00 +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 15 1 0 +BITMAP +0C00 +0600 +0000 +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +18 +0C +00 +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 15 1 0 +BITMAP +0D00 +1600 +0000 +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +0D +16 +00 +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 15 1 -2 +BITMAP +0800 +1C00 +3600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +0000 +3000 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 13 0 -2 +BITMAP +08 +1C +36 +00 +1E +33 +63 +7E +C0 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 11 1 -2 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 -2 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +C0 +00 +60 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 -2 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 15 1 0 +BITMAP +0300 +0600 +0000 +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +06 +0C +00 +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 15 1 0 +BITMAP +0C00 +0600 +0000 +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +18 +0C +00 +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 15 1 0 +BITMAP +0D00 +1600 +0000 +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 0 +BITMAP +0D +16 +00 +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 15 1 -2 +BITMAP +0400 +0E00 +1B00 +0000 +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 13 0 -2 +BITMAP +08 +1C +36 +00 +1E +33 +63 +66 +C6 +CC +78 +00 +30 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 12 1 0 +BITMAP +0300 +0600 +0000 +0F60 +39E0 +31C0 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0300 +0600 +0000 +1E60 +3360 +63C0 +6600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 12 1 0 +BITMAP +0600 +0300 +0000 +0F60 +39E0 +31C0 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0C00 +0600 +0000 +1E60 +3360 +63C0 +6600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 12 1 0 +BITMAP +0680 +0B00 +0000 +0F60 +39E0 +31C0 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0680 +0B00 +0000 +1E60 +3360 +63C0 +6600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 11 1 -2 +BITMAP +0F60 +39E0 +31C0 +6180 +6300 +C300 +C600 +CE00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 9 0 -2 +BITMAP +1E60 +3360 +63C0 +6600 +C600 +CC00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 -2 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 -2 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +00 +30 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 11 12 1 0 +BITMAP +0300 +0600 +0000 +31E0 +31E0 +63C0 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0300 +0600 +0000 +3360 +3360 +63C0 +6600 +C600 +CC00 +7400 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 11 12 1 0 +BITMAP +0C00 +0600 +0000 +31E0 +31E0 +63C0 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0C00 +0600 +0000 +3360 +3360 +63C0 +6600 +C600 +CC00 +7400 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 11 12 1 0 +BITMAP +0680 +0B00 +0000 +31E0 +31E0 +63C0 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 10 0 0 +BITMAP +0680 +0B00 +0000 +3360 +3360 +63C0 +6600 +C600 +CC00 +7400 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 11 11 1 -2 +BITMAP +31E0 +31E0 +63C0 +6300 +6300 +C600 +C600 +CC00 +7800 +0000 +1800 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 11 9 0 -2 +BITMAP +3360 +3360 +63C0 +6600 +C600 +CC00 +7400 +0000 +1800 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +30 +18 +00 +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +60 +30 +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 2 -2 +BITMAP +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +00 +30 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -5 +BITMAP +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +00 +60 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +34 +58 +00 +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +34 +58 +00 +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 250 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 167 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 200 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 100 0 +DWIDTH 1 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200B +ENCODING 8203 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 1 3 +BITMAP +FE +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 1 3 +BITMAP +FE +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 1 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 1 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 3 -1 -1 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +C0 +C0 +60 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 2 6 +BITMAP +6C +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 2 6 +BITMAP +6C +6C +D8 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 6 3 -1 -1 +BITMAP +6C +6C +D8 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 2 6 +BITMAP +D8 +D8 +6C +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 1 -3 +BITMAP +0C +0C +18 +7E +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +06 +06 +0C +3F +0C +18 +18 +30 +FC +30 +60 +60 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 350 0 +DWIDTH 6 0 +BBX 4 3 1 2 +BITMAP +70 +F0 +E0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 1 1 0 +BITMAP +CCC0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 1000 0 +DWIDTH 14 0 +BBX 13 8 1 0 +BITMAP +3180 +6B00 +3600 +0C00 +1800 +3630 +6D68 +C630 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +60 +30 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 5 1 1 +BITMAP +60 +30 +18 +70 +C0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 167 0 +DWIDTH 5 0 +BBX 8 8 -1 0 +BITMAP +03 +06 +0C +18 +10 +30 +60 +C0 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 1 -3 +BITMAP +20 +E0 +20 +40 +40 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 -3 +BITMAP +60 +B0 +20 +40 +F0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 -3 +BITMAP +70 +30 +60 +30 +E0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 9 0 -1 +BITMAP +0040 +2EE0 +33B0 +3330 +6660 +6660 +CCC0 +DCC0 +1000 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3980 +3F80 +6980 +7F00 +6700 +C600 +C600 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 2 0 +BITMAP +CCC0 +CCC0 +CD80 +DF80 +DD00 +FF00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 0 0 +BITMAP +0F00 +1980 +3180 +7C00 +6000 +F800 +6300 +6600 +3C00 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +FFC0 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 1102 0 +DWIDTH 13 0 +BBX 12 9 2 0 +BITMAP +01E0 +6330 +9630 +9600 +6C00 +0C00 +0C60 +0CC0 +0780 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 991 0 +DWIDTH 12 0 +BBX 13 9 2 0 +BITMAP +01F8 +6180 +9300 +9300 +67E0 +0600 +0600 +0C00 +0C00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 5 3 3 +BITMAP +E880 +4D80 +4A80 +9500 +9500 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 1 0 +BITMAP +0180 +0180 +0300 +0300 +3F00 +0600 +0600 +0C00 +FC00 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 1 2 3 +BITMAP +FC +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 167 0 +DWIDTH 5 0 +BBX 8 8 -1 0 +BITMAP +03 +06 +0C +18 +10 +30 +60 +C0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 1 2 +BITMAP +10 +38 +6C +00 +7C +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 1 2 +BITMAP +6C +38 +10 +00 +7C +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +02 +06 +0C +7C +10 +F8 +60 +C0 +80 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 0 -1 +BITMAP +02 +06 +FC +18 +FC +30 +FC +C0 +80 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 2 -1 +BITMAP +1C +70 +C0 +60 +30 +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 1 -1 +BITMAP +30 +18 +0C +38 +E0 +00 +FC +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 2 -1 +BITMAP +02 +06 +1C +78 +D0 +70 +70 +C0 +80 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +02 +06 +3C +18 +1C +38 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 2 -2 +BITMAP +02 +1E +7C +D8 +70 +30 +60 +FC +80 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 9 1 -2 +BITMAP +02 +36 +1C +1C +38 +F0 +60 +FC +80 +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 10 9 0 0 +BITMAP +0EC0 +1800 +7D80 +3300 +3300 +6600 +6600 +CC00 +CC00 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 10 9 0 0 +BITMAP +0EC0 +1980 +7D80 +3300 +3300 +6600 +6600 +CC00 +CC00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvR12-L1.bdf b/gui/themes/fonts/helvR12-L1.bdf new file mode 100644 index 0000000000..1f27c247db --- /dev/null +++ b/gui/themes/fonts/helvR12-L1.bdf @@ -0,0 +1,3048 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Medium-R-Normal--12-120-75-75-P-67-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 11 15 0 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 67 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +28 +28 +FC +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +6200 +9400 +9400 +6800 +0800 +1300 +1480 +1480 +2300 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +30 +48 +48 +30 +50 +8A +84 +8C +72 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 191 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +80 +B0 +C8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +10 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +89 +85 +42 +3D +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 -3 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +30 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +30 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +C0 +20 +20 +20 +20 +10 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 10 1 -3 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +70 +A8 +A0 +A0 +A0 +C8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +48 +40 +40 +F0 +20 +20 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 12 0 -3 +BITMAP +70 +88 +80 +60 +90 +88 +88 +48 +30 +08 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 8 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +3C +68 +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 -3 +BITMAP +40 +20 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 1 3 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4400 +4900 +1300 +1500 +2780 +4100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4800 +4B00 +1480 +1100 +2200 +4780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +E100 +2200 +4400 +2400 +C900 +0B00 +1500 +1780 +2100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +20 +00 +20 +20 +40 +40 +88 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +08 +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +10 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +04 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 0 -1 +BITMAP +0040 +1E80 +2100 +4280 +4480 +4480 +4880 +5080 +2100 +5E00 +8000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +80 +80 +F8 +84 +84 +84 +F8 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +B0 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +10 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +28 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +30 +48 +30 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +80 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +68 +30 +50 +08 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +3A +44 +4C +54 +64 +44 +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +50 +00 +88 +88 +48 +50 +50 +30 +20 +20 +20 +C0 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvR12.bdf b/gui/themes/fonts/helvR12.bdf new file mode 100644 index 0000000000..2e7abc680b --- /dev/null +++ b/gui/themes/fonts/helvR12.bdf @@ -0,0 +1,12688 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--12-120-75-75-P-67-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 14 20 -1 -5 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 67 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 756 +STARTCHAR char0 +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +28 +28 +FC +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +6200 +9400 +9400 +6800 +0800 +1300 +1480 +1480 +2300 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +30 +48 +48 +30 +50 +8A +84 +8C +72 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 191 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +80 +B0 +C8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +10 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +89 +85 +42 +3D +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 -3 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +30 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +30 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +C0 +20 +20 +20 +20 +10 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 10 1 -3 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +70 +A8 +A0 +A0 +A0 +C8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +48 +40 +40 +F0 +20 +20 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 12 0 -3 +BITMAP +70 +88 +80 +60 +90 +88 +88 +48 +30 +08 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 8 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +3C +68 +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 -3 +BITMAP +40 +20 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 1 3 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4400 +4900 +1300 +1500 +2780 +4100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4800 +4B00 +1480 +1100 +2200 +4780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +E100 +2200 +4400 +2400 +C900 +0B00 +1500 +1780 +2100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +20 +00 +20 +20 +40 +40 +88 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +08 +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +10 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +04 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 0 -1 +BITMAP +0040 +1E80 +2100 +4280 +4480 +4480 +4880 +5080 +2100 +5E00 +8000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +80 +80 +F8 +84 +84 +84 +F8 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +B0 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +10 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +28 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +30 +48 +30 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +80 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +68 +30 +50 +08 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +3A +44 +4C +54 +64 +44 +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +50 +00 +88 +88 +48 +50 +50 +30 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +78 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +24 +18 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +48 +30 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +92 +20 +20 +18 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 -3 +BITMAP +70 +88 +08 +78 +88 +88 +74 +20 +20 +18 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 750 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +0980 +0880 +6900 +9800 +8800 +8800 +8800 +9800 +6800 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +38 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +78 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +48 +30 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +48 +30 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +40 +40 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +40 +40 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +20 +50 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +24 +18 +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +48 +30 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +20 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 13 1 -4 +BITMAP +3C +42 +80 +80 +8E +82 +82 +46 +3A +00 +08 +08 +10 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 14 1 -3 +BITMAP +10 +20 +30 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +40 +A0 +00 +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +FE +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +E0 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 0 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +F0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +F0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 0 0 +BITMAP +90 +60 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +90 +60 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +80 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +40 +80 +80 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 11 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 7 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 764 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +81 +81 +81 +81 +81 +81 +91 +91 +8E +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 433 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +90 +00 +90 +90 +90 +90 +90 +90 +90 +10 +10 +20 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +10 +28 +00 +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 13 0 -3 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 13 1 -4 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +00 +10 +10 +20 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 13 1 -4 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +00 +20 +20 +40 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +20 +40 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 12 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 13 0 -4 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +40 +40 +80 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 750 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8180 +8080 +8100 +8000 +8000 +8000 +8000 +8000 +F800 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 433 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +98 +88 +90 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 806 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +80 +80 +80 +80 +80 +81 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 489 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +80 +80 +80 +90 +80 +80 +80 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +50 +60 +C0 +40 +40 +40 +7C +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 13 1 -4 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +00 +10 +10 +20 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -4 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +00 +20 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 767 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +C0 +40 +96 +19 +11 +11 +11 +11 +11 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +02 +02 +04 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +08 +10 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +24 +18 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +48 +30 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +3FC0 +4400 +8400 +8400 +87C0 +8400 +8400 +4400 +3FC0 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +7700 +8880 +8880 +8F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +20 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 13 1 -4 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +00 +10 +10 +20 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 11 1 -4 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +00 +40 +40 +80 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +20 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +50 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +10 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -3 +BITMAP +60 +90 +80 +60 +10 +90 +60 +20 +20 +C0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +28 +10 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +A0 +40 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +08 +08 +30 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +20 +20 +C0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 0 +BITMAP +28 +10 +00 +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 486 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +4C +44 +E8 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +10 +10 +10 +38 +10 +10 +10 +10 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +E0 +40 +40 +60 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +28 +50 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +78 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +48 +30 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 13 1 0 +BITMAP +30 +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +30 +48 +30 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +28 +50 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +20 +20 +18 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +78 +20 +20 +18 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0800 +1400 +0000 +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1400 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +20 +50 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +10 +20 +00 +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +00 +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +78 +84 +02 +02 +02 +02 +02 +84 +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +04 +04 +04 +FC +04 +04 +04 +FC +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +30 +40 +40 +E0 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +40 +40 +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +40 +40 +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +41 +61 +51 +51 +49 +45 +45 +43 +41 +40 +40 +80 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +FF +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +3CC0 +4240 +8180 +8100 +8100 +8100 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 1 0 +BITMAP +76 +8A +8C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +84 +04 +18 +60 +80 +84 +84 +78 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +60 +80 +90 +60 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +08 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +87 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 1 0 +BITMAP +8E +8A +8C +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +02 +04 +08 +38 +20 +40 +80 +FE +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +10 +20 +70 +40 +80 +F0 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +F8 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +20 +20 +20 +20 +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +50 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +28 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 13 1 0 +BITMAP +78 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +78 +00 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +10 +20 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +28 +10 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +20 +10 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +3C +00 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +78 +00 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +3C +00 +10 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +78 +00 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1E00 +0000 +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1E00 +0000 +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +8E +8E +82 +46 +3A +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +F8 +88 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +50 +20 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +50 +20 +00 +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 0 +BITMAP +A0 +40 +00 +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +10 +10 +0C +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +3C +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +10 +10 +0C +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +78 +00 +70 +88 +88 +88 +88 +88 +70 +40 +40 +30 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 13 0 -3 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +08 +10 +00 +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +30 +48 +30 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0400 +0800 +0000 +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +0400 +0800 +0000 +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 14 0 -1 +BITMAP +0200 +0400 +0000 +0040 +1E80 +2100 +4280 +4480 +4480 +4880 +5080 +2100 +5E00 +8000 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +08 +10 +00 +3A +44 +4C +54 +64 +44 +B8 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +50 +28 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +A0 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +24 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +30 +48 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +A0 +50 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +A0 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +30 +48 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +30 +48 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 -1 0 +BITMAP +A0 +50 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 -1 0 +BITMAP +A0 +50 +00 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 0 0 +BITMAP +60 +90 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +60 +90 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +28 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +A0 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +18 +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +30 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +A0 +50 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +A0 +50 +00 +50 +60 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +30 +48 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +60 +90 +00 +50 +60 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +50 +28 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +A0 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +30 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +30 +48 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 13 1 -4 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +00 +10 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 1 -4 +BITMAP +60 +90 +80 +60 +10 +90 +60 +00 +20 +20 +40 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 13 0 -4 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 13 0 -4 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +00 +40 +40 +80 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +10 +00 +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +A0 +40 +00 +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +10 +10 +60 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +10 +10 +60 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +78 +00 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +3C +00 +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +78 +00 +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +78 +00 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +78 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +B8 +44 +44 +78 +40 +44 +38 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +08 +88 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +70 +20 +C0 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +2200 +2200 +5500 +4900 +4900 +8880 +8880 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +08 +10 +20 +20 +50 +50 +48 +88 +88 +88 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 -2 +BITMAP +88 +48 +28 +18 +18 +28 +48 +08 +08 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 0 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 6 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 2 0 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 2 0 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 191 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 -2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 -3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 -3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 2 0 8 +BITMAP +90 +60 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 1 1 8 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 3 0 7 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 -3 +BITMAP +40 +80 +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 2 0 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 2 0 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 6 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 8 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 13 1 -4 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +00 +18 +24 +18 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 1 -4 +BITMAP +70 +88 +08 +78 +88 +88 +74 +00 +30 +48 +30 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +00 +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +00 +F0 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +08 +10 +00 +3C +42 +80 +80 +80 +80 +80 +42 +3C +08 +08 +30 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +00 +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +00 +10 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +00 +78 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +10 +10 +60 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +10 +10 +60 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +00 +10 +28 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +20 +10 +00 +78 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +40 +20 +00 +78 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +10 +20 +00 +78 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +10 +20 +00 +78 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +00 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +00 +50 +A0 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +00 +50 +A0 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 -3 +BITMAP +90 +60 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +10 +10 +60 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +48 +30 +00 +70 +88 +88 +F8 +80 +88 +70 +10 +10 +60 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +20 +00 +30 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +00 +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +78 +00 +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +00 +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +00 +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +92 +08 +08 +30 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +A8 +10 +10 +60 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +00 +24 +18 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +00 +48 +30 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 12 -1 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +50 +A0 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 12 -1 -3 +BITMAP +20 +00 +20 +20 +20 +20 +20 +20 +20 +00 +50 +A0 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 14 0 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +10 +20 +00 +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 0 +BITMAP +20 +40 +00 +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 11 1 -2 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +00 +10 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 11 1 -2 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +00 +78 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +00 +F0 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +F0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +7C +00 +10 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 13 0 -2 +BITMAP +F0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +F0 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 11 0 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0400 +0800 +0000 +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +08 +10 +00 +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0800 +0000 +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +00 +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 11 1 -2 +BITMAP +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +0000 +0800 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 9 1 -2 +BITMAP +A4 +DA +92 +92 +92 +92 +92 +00 +10 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +00 +10 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +00 +3C +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +00 +78 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +00 +10 +28 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +08 +10 +00 +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +14 +00 +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +50 +00 +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +10 +08 +00 +3C +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +40 +20 +00 +78 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +08 +10 +00 +3C +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 0 +BITMAP +10 +20 +00 +78 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +20 +00 +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +20 +00 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 9 1 0 +BITMAP +40 +00 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +00 +10 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 9 1 -2 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 13 1 -2 +BITMAP +78 +00 +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +00 +10 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 11 0 -2 +BITMAP +F0 +00 +50 +60 +40 +40 +40 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 0 -2 +BITMAP +50 +60 +40 +40 +40 +40 +40 +00 +F0 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +00 +10 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +60 +90 +80 +60 +10 +90 +60 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +10 +00 +10 +20 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 1 0 +BITMAP +20 +00 +20 +40 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +10 +00 +28 +10 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 1 0 +BITMAP +40 +00 +A0 +40 +00 +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 13 1 -2 +BITMAP +20 +00 +78 +84 +80 +60 +18 +04 +84 +84 +78 +00 +10 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +40 +00 +60 +90 +80 +60 +10 +90 +60 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +00 +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +00 +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 -2 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +00 +40 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +00 +3C +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 -2 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +00 +F0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +28 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 -3 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +28 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +98 +68 +00 +50 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +68 +00 +50 +A0 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +10 +28 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +68 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +10 +20 +00 +28 +50 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +28 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 13 1 0 +BITMAP +28 +00 +78 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +78 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +82 +44 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +50 +50 +20 +20 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +1000 +0800 +0000 +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1000 +0800 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +0400 +0800 +0000 +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0400 +0800 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1400 +0000 +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +1400 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0800 +0000 +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +0800 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 11 1 -2 +BITMAP +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +0000 +0800 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 -2 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +0000 +0800 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +00 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +28 +00 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +50 +00 +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +00 +10 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +00 +40 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +00 +78 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +00 +F0 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +00 +78 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +A0 +00 +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0C00 +1200 +0C00 +0000 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 14 1 -3 +BITMAP +30 +48 +30 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +70 +88 +08 +78 +88 +88 +74 +00 +10 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +08 +10 +00 +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +20 +10 +00 +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +14 +28 +00 +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +28 +50 +00 +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +10 +28 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -2 +BITMAP +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +00 +10 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +08 +10 +00 +24 +18 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +48 +30 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +20 +10 +00 +24 +18 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +20 +10 +00 +48 +30 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +14 +28 +00 +24 +18 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 0 +BITMAP +28 +50 +00 +48 +30 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +24 +18 +00 +10 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -2 +BITMAP +48 +30 +00 +70 +88 +08 +78 +88 +88 +74 +00 +10 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +28 +50 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +10 +20 +00 +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +20 +10 +00 +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +40 +20 +00 +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 15 1 0 +BITMAP +28 +50 +00 +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +28 +50 +00 +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +20 +50 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +00 +08 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +08 +10 +00 +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +10 +08 +00 +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +40 +20 +00 +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +14 +28 +00 +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +28 +50 +00 +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 14 1 -2 +BITMAP +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +00 +08 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0200 +0400 +0000 +3CC0 +4240 +8180 +8100 +8100 +8100 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +08 +10 +00 +76 +8A +8C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0800 +0400 +0000 +3CC0 +4240 +8180 +8100 +8100 +8100 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +20 +10 +00 +76 +8A +8C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0500 +0A00 +0000 +3CC0 +4240 +8180 +8100 +8100 +8100 +8100 +4200 +3C00 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +14 +28 +00 +76 +8A +8C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 1 -2 +BITMAP +3CC0 +4240 +8180 +8100 +8100 +8100 +8100 +4200 +3C00 +0000 +0800 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -2 +BITMAP +76 +8A +8C +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +10 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +04 +08 +00 +87 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +08 +10 +00 +8E +8A +8C +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +10 +08 +00 +87 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +10 +08 +00 +8E +8A +8C +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +0A +14 +00 +87 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +14 +28 +00 +8E +8A +8C +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 1 -2 +BITMAP +87 +85 +86 +84 +84 +84 +84 +84 +78 +00 +10 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -2 +BITMAP +8E +8A +8C +88 +88 +98 +68 +00 +10 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +40 +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +82 +82 +44 +44 +28 +10 +10 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -5 +BITMAP +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +00 +40 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +28 +50 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 250 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 167 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 200 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 100 0 +DWIDTH 1 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200B +ENCODING 8203 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 0 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 1 0 3 +BITMAP +FFF0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 0 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 -2 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 6 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 6 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 6 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 -2 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 6 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 350 0 +DWIDTH 5 0 +BBX 3 3 1 3 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 1 1 0 +BITMAP +8880 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 1000 0 +DWIDTH 14 0 +BBX 13 8 0 0 +BITMAP +6200 +9400 +9400 +6800 +0B30 +14C8 +14C8 +2330 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 167 0 +DWIDTH 4 0 +BBX 5 8 -1 0 +BITMAP +08 +10 +10 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 1 -3 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 -3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 -3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +04 +A4 +DA +9A +92 +92 +92 +B2 +20 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +C2 +A2 +FE +92 +FE +8A +86 +82 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8880 +8880 +8880 +7F00 +5500 +7F00 +2200 +2200 +2200 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +1E +21 +40 +F8 +40 +F8 +40 +21 +1E +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +FE +90 +88 +84 +82 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 1102 0 +DWIDTH 14 0 +BBX 13 9 0 0 +BITMAP +00F0 +6108 +9200 +9200 +6200 +0200 +0200 +0108 +00F0 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 991 0 +DWIDTH 13 0 +BBX 12 9 0 0 +BITMAP +03F0 +6200 +9200 +9200 +63E0 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 5 1 4 +BITMAP +E880 +4D80 +4D80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +04 +04 +04 +04 +7C +04 +04 +04 +FC +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +82 +7C +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +04 +04 +04 +FC +04 +04 +04 +FC +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +0C +14 +14 +FC +24 +24 +44 +FC +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 167 0 +DWIDTH 4 0 +BBX 5 8 -1 0 +BITMAP +08 +10 +10 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 6 1 2 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 6 1 2 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +08 +08 +10 +F8 +20 +F8 +20 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 9 0 -1 +BITMAP +08 +08 +F8 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 1 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +08 +08 +1C +30 +E0 +30 +2C +40 +40 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 1 -1 +BITMAP +08 +08 +D0 +30 +2C +30 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +08 +0C +30 +D0 +30 +2C +20 +FC +40 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +08 +C8 +30 +1C +30 +E0 +20 +FC +40 +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +38 +40 +E8 +48 +48 +48 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +38 +48 +E8 +48 +48 +48 +48 +48 +48 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/topaz/README.ScummVM b/gui/themes/fonts/topaz/README.ScummVM new file mode 100644 index 0000000000..3beea8a048 --- /dev/null +++ b/gui/themes/fonts/topaz/README.ScummVM @@ -0,0 +1,6 @@ +This package is a remake of Amiga built-in Topaz font for use with Lithuanian keyboards. +You will find detailed information in topazLT.readme. + +The Parallaction engine in ScummVM uses this font's bitmap, namely file topazlt/8. +Data has been extracted and placed in the array named _amigaTopazFont which can be found in engines/parallaction/staticres.cpp. + diff --git a/gui/themes/fonts/topaz/topazLT.font b/gui/themes/fonts/topaz/topazLT.font new file mode 100644 index 0000000000..e60de8600d Binary files /dev/null and b/gui/themes/fonts/topaz/topazLT.font differ diff --git a/gui/themes/fonts/topaz/topazLT.readme b/gui/themes/fonts/topaz/topazLT.readme new file mode 100644 index 0000000000..3c3553d6ec --- /dev/null +++ b/gui/themes/fonts/topaz/topazLT.readme @@ -0,0 +1,63 @@ +Short: Topaz with Lithuanian characters +Uploader: r.ulozas@kaunas.omnitel.net (Ricardas Ulozas) +Author: r.ulozas@kaunas.omnitel.net (Ricardas Ulozas) +Type: text/font +Version: 1.0 + +WHAT IS IT? +This font has BalticRim layout standard for Lithuanian, Latvian, +Estonian, Finnish, Polish, Czech and other Central European +countries. It is very useful when browsing through different +Lithuanian or Latvian Web sites as you may see the special +diacritic signs, or when typing in the aforementioned languages. + +WHAT DO YOU NEED? +To type in Lithuanian, please download BalticRimLT.lha on +Aminet. + +HOW TO RUN IT? +First, extract: lha x topazLT.lha fonts: +Second, select it on your famous text editor or DTP program. + +WHOM I WANT TO THANK? +Commodore-Amiga,Inc. - Steve Beats and Andy Finkel for FED +CygnusSoft for CED +Phase5 for PPC card (when will I get it?...) +Duckman, Smartie, Beavis and others for being so smart. + +HOW YOU MAY DISTRIBUTE IT? +Anyone, anywhere, anytime, anyway, anywise, etc. as long as you +don't make money on it (if you do, write me, I'd like to know +how ;) ) + +WHAT IF YOU WANT TO KEEP IT? +If you liked it I ask you to send me a postcard with your city +sights. Those lazy-bones, tramps and other poor creatures may +write me an e-mail. + +WHAT IF YOU WANT TO CONTACT ME? +OK, for bug reports, excited or disappointed letters, requests +for other versions (Hmm..), ideas please write to: + + r.ulozas@kaunas.omnitel.net + +If you are a female, have sexy voice and want to have a good +chat with a guy thousand miles away, make a call: + + 370-7-223859 + +And if you want to send me a postcard, money, a PPC board, a +monitor or a stone brick, better try the slow medieval way: + + Ricardas Ulozas + POB 2133 + LT-3000 Kaunas + Lithuania + +WHAT IS IN THE FUTURE? +Some new characters to make it fully BalticRim-compatible. +Sizes 9 and 11 - fixed width. +Vector font - huge MAYBE. +Improved documentation. + +That's it. Enjoy the font and support Amiga! diff --git a/gui/themes/fonts/topaz/topazlt/8 b/gui/themes/fonts/topaz/topazlt/8 new file mode 100644 index 0000000000..e74eeb94ef Binary files /dev/null and b/gui/themes/fonts/topaz/topazlt/8 differ -- cgit v1.2.3 From 01bfcf98cc2bb5e135549b3e0cbdc4f3fe57e5ee Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 15:50:51 +0000 Subject: SCI: debug command vmvars - adding acc support svn-id: r50378 --- engines/sci/console.cpp | 115 +++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 41 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e50ae171c1..8ea4315c24 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1958,76 +1958,109 @@ bool Console::cmdVMVarlist(int argc, const char **argv) { } bool Console::cmdVMVars(int argc, const char **argv) { - if (argc < 3) { + if (argc < 2) { DebugPrintf("Displays or changes variables in the VM\n"); DebugPrintf("Usage: %s []\n", argv[0]); - DebugPrintf("First parameter is either g(lobal), l(ocal), t(emp) or p(aram).\n"); - DebugPrintf("Second parameter is the var number\n"); + DebugPrintf("First parameter is either g(lobal), l(ocal), t(emp), p(aram) or a(cc).\n"); + DebugPrintf("Second parameter is the var number (not specified on acc)\n"); DebugPrintf("Third parameter (if specified) is the value to set the variable to, in address form\n"); DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); return true; } EngineState *s = _engine->_gamestate; - const char *varnames[] = {"global", "local", "temp", "param"}; - const char *varabbrev = "gltp"; - const char *vartype_pre = strchr(varabbrev, *argv[1]); - int vartype; - int idx; - - if (!vartype_pre) { + const char *varNames[] = {"global", "local", "temp", "param", "acc"}; + const char *varAbbrev = "gltpa"; + const char *varType_pre = strchr(varAbbrev, *argv[1]); + int varType; + int varIndex = 0; + reg_t *curValue = NULL; + const char *setValue = NULL; + + if (!varType_pre) { DebugPrintf("Invalid variable type '%c'\n", *argv[1]); return true; } - vartype = vartype_pre - varabbrev; + varType = varType_pre - varAbbrev; - char *endPtr = 0; - int idxLen = strlen(argv[2]); - const char *lastChar = argv[2] + idxLen - (idxLen == 0 ? 0 : 1); + switch (varType) { + case 0: + case 1: + case 2: + case 3: { + // for global, local, temp and param, we need an index + if (argc < 3) { + DebugPrintf("Variable number must be specified for requested type\n"); + return true; + } + if (argc > 4) { + DebugPrintf("Too many arguments\n"); + return true; + } + + char *endPtr = 0; + int idxLen = strlen(argv[2]); + const char *lastChar = argv[2] + idxLen - (idxLen == 0 ? 0 : 1); - if ((strncmp(argv[2], "0x", 2) == 0) || (*lastChar == 'h')) { - // hexadecimal number - idx = strtol(argv[2], &endPtr, 16); - if ((*endPtr != 0) && (*endPtr != 'h')) { - DebugPrintf("Invalid hexadecimal index '%s'\n", argv[2]); + if ((strncmp(argv[2], "0x", 2) == 0) || (*lastChar == 'h')) { + // hexadecimal number + varIndex = strtol(argv[2], &endPtr, 16); + if ((*endPtr != 0) && (*endPtr != 'h')) { + DebugPrintf("Invalid hexadecimal number '%s'\n", argv[2]); + return true; + } + } else { + // decimal number + varIndex = strtol(argv[2], &endPtr, 10); + if (*endPtr != 0) { + DebugPrintf("Invalid decimal number '%s'\n", argv[2]); + return true; + } + } + if (varIndex < 0) { + DebugPrintf("Variable number may not be negative\n"); return true; } - } else { - // decimal number - idx = strtol(argv[2], &endPtr, 10); - if (*endPtr != 0) { - DebugPrintf("Invalid decimal index '%s'\n", argv[2]); + + if ((s->variablesMax) && (s->variablesMax[varType] <= varIndex)) { + DebugPrintf("Maximum variable number for this type is %d (0x%x)\n", s->variablesMax[varType], s->variablesMax[varType]); return true; } + curValue = &s->variables[varType][varIndex]; + if (argc == 4) + setValue = argv[3]; + break; } - if (idx < 0) { - DebugPrintf("Invalid: negative index\n"); - return true; - } + case 4: + // acc + if (argc > 3) { + DebugPrintf("Too many arguments\n"); + return true; + } + curValue = &s->r_acc; + if (argc == 3) + setValue = argv[2]; + break; - if ((s->variablesMax) && (s->variablesMax[vartype] <= idx)) { - DebugPrintf("Max. index is %d (0x%x)\n", s->variablesMax[vartype], s->variablesMax[vartype]); - return true; + default: + break; } - switch (argc) { - case 3: - DebugPrintf("%s var %d == %04x:%04x\n", varnames[vartype], idx, PRINT_REG(s->variables[vartype][idx])); - break; - case 4: - if (parse_reg_t(_engine->_gamestate, argv[3], &s->variables[vartype][idx], true)) { + if (!setValue) { + if (varType == 4) + DebugPrintf("%s == %04x:%04x\n", varNames[varType], PRINT_REG(*curValue)); + else + DebugPrintf("%s var %d == %04x:%04x\n", varNames[varType], varIndex, PRINT_REG(*curValue)); + } else { + if (parse_reg_t(s, setValue, curValue, true)) { DebugPrintf("Invalid value/address passed.\n"); DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); DebugPrintf("Or pass a decimal or hexadecimal value directly (e.g. 12, 1Ah)\n"); return true; } - break; - default: - DebugPrintf("Too many arguments\n"); } - return true; } -- cgit v1.2.3 From d7f212647a115b011db7c37f5bcdd6a5eae62235 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 16:02:03 +0000 Subject: Turned the error when failing to locate an invalid object back to a warning (KQ5 French has an invalid object in script 202) svn-id: r50379 --- engines/sci/engine/script.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index f26a2e53af..b3fbafb355 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -224,8 +224,9 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { obj->initSpecies(this, addr); if (!obj->initBaseObject(this, addr)) { - error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - //scr->scriptObjRemove(addr); + // Script 202 of KQ5 French has an invalid object + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + scr->scriptObjRemove(addr); } } break; -- cgit v1.2.3 From a2cdc475300c7f8e56cd26146f513715ecfa05e0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 16:09:17 +0000 Subject: SCI: now showing kernel call name when argument signature check fails svn-id: r50380 --- engines/sci/engine/vm.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c4552e591d..841d4ede64 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -654,16 +654,16 @@ static reg_t pointer_add(EngineState *s, reg_t base, int offset) { } } -static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { +static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { - if (kernelFuncNum >= (int)g_sci->getKernel()->_kernelFuncs.size()) - error("Invalid kernel function 0x%x requested", kernelFuncNum); + if (kernelFuncNr >= (int)g_sci->getKernel()->_kernelFuncs.size()) + error("Invalid kernel function 0x%x requested", kernelFuncNr); - const KernelFuncWithSignature &kernelFunc = g_sci->getKernel()->_kernelFuncs[kernelFuncNum]; + const KernelFuncWithSignature &kernelFunc = g_sci->getKernel()->_kernelFuncs[kernelFuncNr]; if (kernelFunc.signature && !g_sci->getKernel()->signatureMatch(kernelFunc.signature, argc, s->xs->sp + 1)) { - error("[VM] Invalid arguments to kernel call %x", kernelFuncNum); + error("[VM] Invalid arguments to kernel call k%s (funcNr %x)", g_sci->getKernel()->getKernelName(kernelFuncNr).c_str(), kernelFuncNr); } reg_t *argv = s->xs->sp + 1; @@ -675,15 +675,15 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { ExecStack *xstack; xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->selector = kernelFuncNum; + xstack->selector = kernelFuncNr; xstack->type = EXEC_STACK_TYPE_KERNEL; //warning("callk %s", kernelFunc.origName.c_str()); // TODO: SCI2.1 equivalent if (s->loadFromLauncher >= 0 && ( - (kernelFuncNum == 0x8 && getSciVersion() <= SCI_VERSION_1_1) || // DrawPic - (kernelFuncNum == 0x3d && getSciVersion() == SCI_VERSION_2) // GetSaveDir + (kernelFuncNr == 0x8 && getSciVersion() <= SCI_VERSION_1_1) || // DrawPic + (kernelFuncNr == 0x3d && getSciVersion() == SCI_VERSION_2) // GetSaveDir //(kernelFuncNum == 0x28 && getSciVersion() == SCI_VERSION_2_1) // AddPlane )) { @@ -726,7 +726,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { s->_executionStack.pop_back(); } else { Common::String warningMsg = "Dummy function " + kernelFunc.origName + - Common::String::printf("[0x%x]", kernelFuncNum) + + Common::String::printf("[0x%x]", kernelFuncNr) + " invoked - ignoring. Params: " + Common::String::printf("%d", argc) + " ("; -- cgit v1.2.3 From 006197e5bdb7962e3529557f37f269ef6c3bdef0 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 27 Jun 2010 16:53:08 +0000 Subject: Update the french translation. svn-id: r50381 --- common/messages.cpp | 59 ++++++++++++++++++++------------- po/fr_FR.po | 95 +++++++++++++++++++++++++---------------------------- 2 files changed, 82 insertions(+), 72 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 0cf0b8ce92..d3f111838c 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,7 +323,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " (\300\352\362\350\342\355\340\377)" }, { 3, " (\310\343\360\373)" }, @@ -632,12 +632,12 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-19 23:43+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: Francais\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, { 4, "(Global)" }, - { 5, "C2(compil\351 sur" }, + { 5, "(compil\351 sur %s)" }, { 6, ", \351chec du montage du disque partag\351" }, { 7, ", disque partag\351 non mont\351" }, { 8, "... en cours ..." }, @@ -648,7 +648,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 13, "8 kHz" }, { 14, "" }, { 15, "\300 propos de ScummVM" }, - { 16, "\311mulateur AdLib:" }, + { 16, "\311mulateur AdLib" }, { 17, "\311mulateur AdLib:" }, { 18, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, { 19, "Ajouter..." }, @@ -658,7 +658,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 23, "Touche associ\351e: aucune" }, { 24, "Audio" }, { 25, "Sauvegarde auto:" }, - { 26, "C1Moteurs disponibles:" }, + { 26, "Moteurs disponibles:" }, { 27, "\300 ~P~ropos..." }, { 28, "Affecter les touches" }, { 29, "Les deux" }, @@ -679,6 +679,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 44, "Gauche" }, { 45, "Droit" }, { 46, "Haut" }, + { 47, "\311mulateur DOSBox OPL" }, { 48, "DVD" }, { 49, "DVD mont\351 avec succ\350s" }, { 50, "DVD non mont\351" }, @@ -706,14 +707,16 @@ static const PoMessageEntry _translation_fr_FR[] = { { 72, "Erreur lors de l'\351x\351cution du jeu:" }, { 73, "\311chec du montage du DVD" }, { 74, "Extra:" }, - { 75, "FM Towns" }, + { 75, "\311mulateur FM Towns" }, { 76, "Mode rapide" }, - { 77, "C1Options incluses:" }, + { 77, "Options incluses:" }, + { 78, "Regarder autour" }, { 79, "Nom complet du jeu" }, { 80, "Plein \351cran" }, { 81, "Acceleration du pad GC:" }, { 82, "Sensibilit\351 du pad GC:" }, { 83, "GFX" }, + { 84, "P\351riph\351rique GM:" }, { 85, "Langue:" }, { 86, "Interface:" }, { 87, "Jeu" }, @@ -726,15 +729,18 @@ static const PoMessageEntry _translation_fr_FR[] = { { 94, "Graphique" }, { 95, "Mode graphique:" }, { 96, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 97, "Hercules Ambre" }, + { 98, "Hercules Vert" }, { 99, "Cach\351 la barre d'outils" }, { 100, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, { 101, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, { 102, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, - { 104, "FM Towns" }, + { 103, "Underscan horizontal:" }, + { 104, "\311mulateur IBM PCjr" }, { 105, "ID:" }, { 106, "Initialiser le r\351seau" }, { 107, "\311chelle initiale de l'\351cran du haut" }, - { 108, "Initialisation du r\351seau" }, + { 108, "Initialisation de l'\311mulateur MT-32" }, { 109, "Initialisation du r\351seau" }, { 110, "Entr\351e" }, { 111, "Chemin Invalide" }, @@ -750,10 +756,11 @@ static const PoMessageEntry _translation_fr_FR[] = { { 121, "Charger" }, { 122, "Charger le jeu:" }, { 123, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, - { 124, "\311mulateur AdLib:" }, + { 124, "\311mulateur MAME OPL" }, { 125, "MIDI" }, { 126, "Gain MIDI:" }, - { 127, "\311mulation MT-32" }, + { 127, "\311mulateur MT-32" }, + { 128, "P\351riph\351rique MT32:" }, { 129, "\311chelle de l'\351cran principal" }, { 130, "Affecter" }, { 131, "Ajout Massif..." }, @@ -763,6 +770,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 135, "Monter le DVD" }, { 136, "Monter SMB" }, { 137, "Clic de souris" }, + { 138, "Fonction Multiple" }, { 139, "Volume Musique:" }, { 140, "Silence" }, { 141, "Nom:" }, @@ -777,13 +785,14 @@ static const PoMessageEntry _translation_fr_FR[] = { { 150, "Dur\351e de jeu non sauv\351e" }, { 151, "Heure non sauv\351e" }, { 152, "Aucun" }, + { 153, "Normal (\351chelle d'origine)" }, { 154, "OK" }, { 155, "Fr\351quence:" }, - { 156, "Utiliser des r\351glages MIDI sp\351cifique \340 ce jeux" }, - { 157, "Utiliser des r\351glages audio sp\351cifique \340 ce jeux" }, - { 158, "Utiliser des r\351glages graphiques sp\351cifique \340 ce jeux" }, - { 159, "Utiliser des r\351glages de volume sonore sp\351cifique \340 ce jeux" }, - { 160, "Haut Parleur PC" }, + { 156, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, + { 157, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, + { 158, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, + { 159, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, + { 160, "\311mulateur Haut Parleur PC" }, { 161, "Mot de passe:" }, { 162, "Chemin n'est pas un r\351pertoire" }, { 163, "Chemin n'est pas un fichier" }, @@ -796,6 +805,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 170, "Dur\351e de jeu:" }, { 171, "Selectionnez une action" }, { 172, "Plugins:" }, + { 173, "P\351riph\351rique Pr\351f\351r\351:" }, { 174, "Appuyez sur la touche \340 associer" }, { 175, "Quitter" }, { 176, "Quitter ScummVM" }, @@ -851,11 +861,12 @@ static const PoMessageEntry _translation_fr_FR[] = { { 226, "Audio" }, { 227, "Mode sp\351cial de tramage support\351 par certains jeux" }, { 228, "Volume des effets sp\351ciaux sonores" }, - { 229, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 229, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, + { 230, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, { 231, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, { 232, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, { 233, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, { 235, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, { 236, "Audio" }, { 237, "Volume Dialogues:" }, @@ -865,6 +876,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 241, "Subs" }, { 242, "Vitesse des ST:" }, { 243, "Sous-titres" }, + { 244, "Changement de personnage" }, { 245, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, { 246, "Dialogue:" }, { 247, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, @@ -892,6 +904,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 269, "Activer le contr\364le du curseur de type trackpad" }, { 270, "Nom d'utilisateur:" }, { 271, "Utilise le pilote SDL" }, + { 272, "Underscan vertical:" }, { 273, "Vid\351o" }, { 274, "Clavier virtuel" }, { 275, "Volume" }, @@ -901,6 +914,8 @@ static const PoMessageEntry _translation_fr_FR[] = { { 279, "Oui" }, { 280, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, { 281, "Zone" }, + { 282, "Zoomer" }, + { 283, "D\351zoomer" }, { 284, "Toutes les 10 mins" }, { 285, "Toutes les 15 mins" }, { 286, "Toutes les 30 mins" }, @@ -928,13 +943,13 @@ static const PoMessageEntry _translation_fr_FR[] = { { 308, "~S~auver" }, { 309, "~D~\351marrer" }, { 310, "T~r~ansitions activ\351" }, - { 311, "~E~ffets de l'Eau activ\351s" }, + { 311, "~E~ffets de l'Eau Activ\351s" }, { 312, "Mode ~Z~ip Activ\351" }, { -1, NULL } }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nLanguage: Catalan\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1245,7 +1260,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1302,7 +1317,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, diff --git a/po/fr_FR.po b/po/fr_FR.po index fc103ed756..c79456e98e 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,30 +7,28 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" -"PO-Revision-Date: 2010-06-19 23:43+0100\n" +"POT-Creation-Date: 2010-06-27 17:48+0100\n" +"PO-Revision-Date: 2010-06-27 17:47+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" -"Language: Francais\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:96 -#, fuzzy, c-format +#, c-format msgid "(built on %s)" -msgstr "C2(compilé sur" +msgstr "(compilé sur %s)" #: gui/about.cpp:103 -#, fuzzy msgid "Features compiled in:" -msgstr "C1Options incluses:" +msgstr "Options incluses:" #: gui/about.cpp:112 -#, fuzzy msgid "Available engines:" -msgstr "C1Moteurs disponibles:" +msgstr "Moteurs disponibles:" #: gui/browser.cpp:69 msgid "Go up" @@ -164,7 +162,7 @@ msgstr "GFX" #: gui/launcher.cpp:206 msgid "Override global graphic settings" -msgstr "Utiliser des réglages graphiques spécifique à ce jeux" +msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" #: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" @@ -172,7 +170,7 @@ msgstr "Audio" #: gui/launcher.cpp:215 msgid "Override global audio settings" -msgstr "Utiliser des réglages audio spécifique à ce jeux" +msgstr "Utiliser des réglages audio spécifiques à ce jeux" #: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" @@ -180,7 +178,7 @@ msgstr "Volume" #: gui/launcher.cpp:225 msgid "Override global volume settings" -msgstr "Utiliser des réglages de volume sonore spécifique à ce jeux" +msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" #: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" @@ -188,7 +186,7 @@ msgstr "MIDI" #: gui/launcher.cpp:234 msgid "Override global MIDI settings" -msgstr "Utiliser des réglages MIDI spécifique à ce jeux" +msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" #: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" @@ -483,12 +481,13 @@ msgstr "Corrige le rapport d'aspect pour les jeu 320x200" #: gui/options.cpp:651 msgid "Preferred Device:" -msgstr "" +msgstr "Périphérique Préféré:" #: gui/options.cpp:651 -#, fuzzy msgid "Specifies preferred sound device or sound card emulator" -msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" +msgstr "" +"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " +"préféré" #: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" @@ -496,20 +495,21 @@ msgstr "Sp #: gui/options.cpp:654 msgid "MT32 Device:" -msgstr "" +msgstr "Périphérique MT32:" #: gui/options.cpp:654 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" +"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" +"CM32l/CM64" #: gui/options.cpp:656 msgid "GM Device:" -msgstr "" +msgstr "Périphérique GM:" #: gui/options.cpp:656 -#, fuzzy msgid "Specifies default sound device for General MIDI output" -msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" +msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" #: gui/options.cpp:688 msgid "AdLib emulator:" @@ -840,11 +840,11 @@ msgstr "Erreur inconnue" #: common/util.cpp:254 msgid "Hercules Green" -msgstr "" +msgstr "Hercules Vert" #: common/util.cpp:255 msgid "Hercules Amber" -msgstr "" +msgstr "Hercules Ambre" #: engines/dialogs.cpp:89 msgid "~R~esume" @@ -922,52 +922,44 @@ msgid "~T~ransitions Enabled" msgstr "T~r~ansitions activé" #: engines/mohawk/dialogs.cpp:116 -#, fuzzy msgid "~W~ater Effect Enabled" -msgstr "~E~ffets de l'Eau activés" +msgstr "~E~ffets de l'Eau Activés" #: sound/fmopl.cpp:51 -#, fuzzy msgid "MAME OPL emulator" -msgstr "Émulateur AdLib:" +msgstr "Émulateur MAME OPL" #: sound/fmopl.cpp:53 msgid "DOSBox OPL emulator" -msgstr "" +msgstr "Émulateur DOSBox OPL" #: sound/null.h:45 msgid "No music" msgstr "Pas de musique" #: sound/softsynth/adlib.cpp:1590 -#, fuzzy msgid "AdLib Emulator" -msgstr "Émulateur AdLib:" +msgstr "Émulateur AdLib" #: sound/softsynth/mt32.cpp:327 -#, fuzzy msgid "Initialising MT-32 Emulator" -msgstr "Initialisation du réseau" +msgstr "Initialisation de l'Émulateur MT-32" #: sound/softsynth/mt32.cpp:541 -#, fuzzy msgid "MT-32 Emulator" -msgstr "Émulation MT-32" +msgstr "Émulateur MT-32" #: sound/softsynth/pcspk.cpp:142 -#, fuzzy msgid "PC Speaker Emulator" -msgstr "Haut Parleur PC" +msgstr "Émulateur Haut Parleur PC" #: sound/softsynth/pcspk.cpp:161 -#, fuzzy msgid "IBM PCjr Emulator" -msgstr "FM Towns" +msgstr "Émulateur IBM PCjr" #: sound/softsynth/ym2612.cpp:762 -#, fuzzy msgid "FM Towns Emulator" -msgstr "FM Towns" +msgstr "Émulateur FM Towns" #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" @@ -985,7 +977,7 @@ msgstr "(Global)" msgid " (Game)" msgstr "(Jeu)" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "MIDI Windows" @@ -1073,7 +1065,7 @@ msgstr "Mode touchpad d #: backends/platform/wince/wince-sdl.cpp:111 #: backends/platform/wince/wince-sdl.cpp:118 msgid "Normal (no scaling)" -msgstr "" +msgstr "Normal (échelle d'origine)" #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 @@ -1115,11 +1107,11 @@ msgstr "Zone" #: backends/platform/wince/CEActionsPocket.cpp:53 #: backends/platform/wince/CEActionsSmartphone.cpp:47 msgid "Multi Function" -msgstr "" +msgstr "Fonction Multiple" #: backends/platform/symbian/src/SymbianActions.cpp:51 msgid "Swap character" -msgstr "" +msgstr "Changement de personnage" #: backends/platform/symbian/src/SymbianActions.cpp:52 msgid "Skip text" @@ -1171,11 +1163,11 @@ msgstr "Coup double" #: backends/platform/wii/options.cpp:60 msgid "Horizontal underscan:" -msgstr "" +msgstr "Underscan horizontal:" #: backends/platform/wii/options.cpp:66 msgid "Vertical underscan:" -msgstr "" +msgstr "Underscan vertical:" #: backends/platform/wii/options.cpp:71 msgid "Input" @@ -1313,16 +1305,19 @@ msgid "Show/Hide Cursor" msgstr "Afficher/Cacher le curseur" #: backends/platform/wince/CEActionsPocket.cpp:50 +#, fuzzy msgid "Free look" -msgstr "" +msgstr "Regarder autour" #: backends/platform/wince/CEActionsPocket.cpp:51 +#, fuzzy msgid "Zoom up" -msgstr "" +msgstr "Dézoomer" #: backends/platform/wince/CEActionsPocket.cpp:52 +#, fuzzy msgid "Zoom down" -msgstr "" +msgstr "Zoomer" #: backends/platform/wince/CEActionsPocket.cpp:54 #: backends/platform/wince/CEActionsSmartphone.cpp:48 @@ -1404,8 +1399,8 @@ msgstr "Voulez-vous ex #~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" #~ msgstr "" -#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible " -#~ "'%s', chemin '%s')" +#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%" +#~ "s', chemin '%s')" #~ msgid "Ok" #~ msgstr "Ok" -- cgit v1.2.3 From 72f65f8204d599c1a29a63377accd8d538ef1e88 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sun, 27 Jun 2010 16:58:06 +0000 Subject: GUI: fix music device popup (thanks to clone2727 for reporting) svn-id: r50382 --- gui/options.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 9857d8b8d6..7f132f32f1 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -364,9 +364,15 @@ void OptionsDialog::close() { } // Audio options - saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); - saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); + if (_enableAudioSettings) { + saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); + } else { + ConfMan.removeKey("music_driver", _domain); + ConfMan.removeKey("mt32_device", _domain); + ConfMan.removeKey("gm_device", _domain); + } if (_oplPopUp) { if (_enableAudioSettings) { -- cgit v1.2.3 From 5997307081db72c002a9a131d0eefc1a190e1ced Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sun, 27 Jun 2010 17:06:26 +0000 Subject: Fixed GCC warnings. (Same warning twice, actually.) svn-id: r50383 --- engines/tinsel/graphics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/tinsel/graphics.cpp b/engines/tinsel/graphics.cpp index 3423f1054a..48270d94e3 100644 --- a/engines/tinsel/graphics.cpp +++ b/engines/tinsel/graphics.cpp @@ -444,7 +444,7 @@ static void t2WrtNonZero(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, bool apply int clipAmount; // WORKAROUND: One of the mortician frames has several corrupt bytes in the Russian version - if ((pObj->hBits == 2517583660) && (_vm->getLanguage() == Common::RU_RUS)) { + if ((pObj->hBits == 2517583660UL) && (_vm->getLanguage() == Common::RU_RUS)) { uint8 correctBytes[5] = {0xA3, 0x00, 0x89, 0xC0, 0xA6}; Common::copy(&correctBytes[0], &correctBytes[5], srcP); } @@ -604,7 +604,7 @@ static void PackedWrtNonZero(DRAWOBJECT *pObj, uint8 *srcP, uint8 *destP, if (_vm->getLanguage() == Common::RU_RUS) { // WORKAROUND: One of the mortician frames has several corrupt bytes in the Russian version - if (pObj->hBits == 2517583393) { + if (pObj->hBits == 2517583393UL) { uint8 correctBytes[5] = {0x00, 0x00, 0x17, 0x01, 0x00}; Common::copy(&correctBytes[0], &correctBytes[5], srcP + 267); } -- cgit v1.2.3 From 7e05376ebe3f82420e26941b4b74883c95060d00 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sun, 27 Jun 2010 17:37:35 +0000 Subject: GUI: and another fix for the music device popup svn-id: r50384 --- gui/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index 7f132f32f1..74eda9bdfc 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -141,7 +141,7 @@ template bool equalsDeviceProperty(MusicDevices::iterator d, T lookupPr } bool musicDeviceSkipSettingDefault(MusicDevices::iterator d, Common::String dom, MusicPlugin::List::const_iterator &m, uint32 guio) { - return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || (dom != Common::ConfigManager::kApplicationDomain && (!guio || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null" ? true : false; + return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || (dom != Common::ConfigManager::kApplicationDomain && (!(guio & MidiDriver::musicType2GUIO((uint32)-1)) || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null" ? true : false; } bool musicDeviceSkipSettingSpec(MusicDevices::iterator d, Common::String, MusicPlugin::List::const_iterator &m, uint32) { -- cgit v1.2.3 From 777794d11d8d26e0c2cc87d7e039548a723ef474 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 17:58:26 +0000 Subject: SCI: filter out set signal commands from midi streams, if they happen at ticker 0. fixes castle daventry getting removed immediately in kq5 french/mac svn-id: r50385 --- engines/sci/sound/midiparser_sci.cpp | 82 +++++++++++++++++------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 46459522a3..1d25a518e1 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -440,10 +440,8 @@ byte MidiParser_SCI::midiGetNextChannel(long ticker) { byte *MidiParser_SCI::midiMixChannels() { int totalSize = 0; - byte **dataPtr = new byte *[_track->channelCount]; for (int i = 0; i < _track->channelCount; i++) { - dataPtr[i] = _track->channels[i].data; _track->channels[i].time = 0; _track->channels[i].prev = 0; totalSize += _track->channels[i].size; @@ -453,8 +451,8 @@ byte *MidiParser_SCI::midiMixChannels() { _mixedData = outData; long ticker = 0; byte channelNr, curDelta; - byte command = 0, par1, global_prev = 0; - long new_delta; + byte midiCommand = 0, midiParam, global_prev = 0; + long newDelta; SoundResource::Channel *channel; while ((channelNr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel @@ -463,57 +461,60 @@ byte *MidiParser_SCI::midiMixChannels() { channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the command is supposed to occur if (curDelta == 0xF8) continue; - new_delta = channel->time - ticker; - ticker += new_delta; - - command = channel->data[channel->curPos++]; - if (command != kEndOfTrack) { - debugC(4, kDebugLevelSound, "\nDELTA "); + newDelta = channel->time - ticker; + ticker += newDelta; + + midiCommand = channel->data[channel->curPos++]; + if ((midiCommand == 0xCF) && (!ticker)) { + // set signal command at tick 0? + channel->curPos++; + continue; // filter it + // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately + // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to + // get immediately removed, so we currently filter it. + // TODO: find out what exactly happens in sierra sci + } + if (midiCommand != kEndOfTrack) { // Write delta - while (new_delta > 240) { + while (newDelta > 240) { *outData++ = 0xF8; - debugC(4, kDebugLevelSound, "F8 "); - new_delta -= 240; + newDelta -= 240; } - *outData++ = (byte)new_delta; - debugC(4, kDebugLevelSound, "%02X ", (uint32)new_delta); + *outData++ = (byte)newDelta; } // Write command - switch (command) { + switch (midiCommand) { case 0xF0: // sysEx - *outData++ = command; - debugC(4, kDebugLevelSound, "%02X ", command); + *outData++ = midiCommand; do { - par1 = channel->data[channel->curPos++]; - *outData++ = par1; // out - } while (par1 != 0xF7); + midiParam = channel->data[channel->curPos++]; + *outData++ = midiParam; + } while (midiParam != 0xF7); break; case kEndOfTrack: // end of channel - // FIXME: Why does this need to be fixed? There's no - // additional information available - channel->time = -1; // FIXME + channel->time = -1; break; default: // MIDI command - if (command & 0x80) { - par1 = channel->data[channel->curPos++]; + if (midiCommand & 0x80) { + midiParam = channel->data[channel->curPos++]; } else {// running status - par1 = command; - command = channel->prev; + midiParam = midiCommand; + midiCommand = channel->prev; } // remember which channel got used for channel remapping - byte midiChannel = command & 0xF; + byte midiChannel = midiCommand & 0xF; _channelUsed[midiChannel] = true; - if (command != global_prev) - *outData++ = command; // out command - *outData++ = par1;// pout par1 - if (nMidiParams[(command >> 4) - 8] == 2) - *outData++ = channel->data[channel->curPos++]; // out par2 - channel->prev = command; - global_prev = command; - }// switch(command) - }// while (curr) + if (midiCommand != global_prev) + *outData++ = midiCommand; + *outData++ = midiParam; + if (nMidiParams[(midiCommand >> 4) - 8] == 2) + *outData++ = channel->data[channel->curPos++]; + channel->prev = midiCommand; + global_prev = midiCommand; + } + } // Insert stop event *outData++ = 0; // Delta @@ -521,11 +522,6 @@ byte *MidiParser_SCI::midiMixChannels() { *outData++ = 0x2F; // End of track (EOT) *outData++ = 0x00; *outData++ = 0x00; - - for (channelNr = 0; channelNr < _track->channelCount; channelNr++) - _track->channels[channelNr].data = dataPtr[channelNr]; - - delete[] dataPtr; return _mixedData; } -- cgit v1.2.3 From 945297a599c8e3274d5f4faf64379049e60520b0 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 27 Jun 2010 18:19:37 +0000 Subject: Add italian translation from the patch tracker (#3022046) and update credits. svn-id: r50386 --- AUTHORS | 3 + common/messages.cpp | 328 ++++++++++++- gui/credits.h | 3 + po/it_IT.po | 1356 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1685 insertions(+), 5 deletions(-) create mode 100644 po/it_IT.po diff --git a/AUTHORS b/AUTHORS index d99651229a..4ce92a42e1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -335,6 +335,9 @@ Other contributions Hungarian: Alex Bevilacqua + Italian: + Matteo Angelino + Russian: Eugene Sandulenko diff --git a/common/messages.cpp b/common/messages.cpp index d3f111838c..fddca0f548 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,7 +323,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, { 2, " (\300\352\362\350\342\355\340\377)" }, { 3, " (\310\343\360\373)" }, @@ -632,7 +632,7 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -948,8 +948,325 @@ static const PoMessageEntry _translation_fr_FR[] = { { -1, NULL } }; +static const PoMessageEntry _translation_it_IT[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 1, " Sei sicuro di voler uscire? " }, + { 2, " (Attivo)" }, + { 3, " (Gioco)" }, + { 4, " (Globale)" }, + { 5, "(build creata il %s)" }, + { 6, ", errore nel montare la condivisione" }, + { 7, ", condivisione non montata" }, + { 8, "... progresso ..." }, + { 9, "11kHz" }, + { 10, "22 kHz" }, + { 11, "44 kHz" }, + { 12, "48 kHz" }, + { 13, "8 kHz" }, + { 14, "" }, + { 15, "Informazioni su ScummVM" }, + { 16, "Emulatore AdLib" }, + { 17, "Emulatore AdLib:" }, + { 18, "AdLib \350 utilizzato per la musica in molti giochi" }, + { 19, "Aggiungi gioco..." }, + { 20, "Renderer con antialiasing (16bpp)" }, + { 21, "Correzione proporzioni" }, + { 22, "Tasto associato: %s" }, + { 23, "Tasto associato: nessuno" }, + { 24, "Audio" }, + { 25, "Salvataggio automatico:" }, + { 26, "Motori disponibili:" }, + { 27, "~I~nfo..." }, + { 28, "Associa tasti" }, + { 29, "Entrambi" }, + { 30, "Luminosit\340:" }, + { 31, "Annulla" }, + { 32, "Impossibile creare il file" }, + { 33, "Modifica le opzioni di gioco" }, + { 34, "Modifica le opzioni globali di ScummVM" }, + { 35, "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland che \350 connesso al tuo computer" }, + { 36, "Scegli" }, + { 37, "Scegli un'azione da mappare" }, + { 38, "Cancella" }, + { 39, "Chiudi" }, + { 40, "Corregge le proporzioni dei giochi 320x200" }, + { 41, "Impossibile trovare un motore in grado di eseguire il gioco selezionato" }, + { 42, "Modalit\340 video attuale:" }, + { 43, "Cursore gi\371" }, + { 44, "Cursore a sinistra" }, + { 45, "Cursore a destra" }, + { 46, "Cursore su" }, + { 47, "Emulatore OPL DOSBox" }, + { 48, "DVD" }, + { 49, "DVD montato con successo" }, + { 50, "DVD non montato" }, + { 51, "Data: " }, + { 52, "Debugger" }, + { 53, "Predefinito" }, + { 54, "Elimina" }, + { 55, "Disattiva spegnimento in chiusura" }, + { 56, "Grafica disattivata" }, + { 57, "Rilevati %d nuovi giochi..." }, + { 58, "Rilevati %d nuovi giochi." }, + { 59, "Visualizza " }, + { 60, "Mostra tastiera" }, + { 61, "Sei sicuro di voler eliminare questo salvataggio?" }, + { 62, "Sei sicuro di voler rimuovere questa configurazione di gioco?" }, + { 63, "Voui davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." }, + { 64, "Vuoi caricare o salvare il gioco?" }, + { 65, "Vuoi eseguire una scansione automatica?" }, + { 66, "Sei sicuro di voler uscire?" }, + { 67, "Double-strike" }, + { 68, "Gi\371" }, + { 69, "Attiva la modalit\340 Roland GS" }, + { 70, "Il motore non supporta il livello di debug '%s'" }, + { 71, "Inglese" }, + { 72, "Errore nell'esecuzione del gioco:" }, + { 73, "Errore nel montare il DVD" }, + { 74, "Percorso aggiuntivo:" }, + { 75, "Emulatore FM Towns" }, + { 76, "Modalit\340 veloce" }, + { 77, "Funzionalit\340 compilate in:" }, + { 78, "Osservazione libera" }, + { 79, "Titolo completo del gioco" }, + { 80, "Modalit\340 a schermo intero" }, + { 81, "Accelerazione pad GC:" }, + { 82, "Sensibilit\340 pad GC:" }, + { 83, "Grafica" }, + { 84, "Dispositivo GM:" }, + { 85, "Lingua dell'interfaccia:" }, + { 86, "Renderer interfaccia grafica:" }, + { 87, "Gioco" }, + { 88, "Dati di gioco non trovati" }, + { 89, "ID di gioco non supportato" }, + { 90, "Percorso del gioco:" }, + { 91, "Menu globale" }, + { 92, "Vai alla cartella superiore" }, + { 93, "Cartella superiore" }, + { 94, "Grafica" }, + { 95, "Modalit\340 grafica:" }, + { 96, "Ridimensionamento hardware (veloce, ma di bassa qualit\340)" }, + { 97, "Hercules ambra" }, + { 98, "Hercules verde" }, + { 99, "Nascondi la barra degli strumenti" }, + { 100, "Audio ad alta qualit\340 (pi\371 lento) (riavviare)" }, + { 101, "Valori pi\371 alti restituiscono un suono di maggior qualit\340, ma potrebbero non essere supportati dalla tua scheda audio" }, + { 102, "Tieni premuto Shift per l'aggiunta in massa" }, + { 103, "Underscan orizzontale:" }, + { 104, "Emulatore IBM PCjr" }, + { 105, "ID:" }, + { 106, "Avvia rete" }, + { 107, "Ridimensiona schermo in primo piano:" }, + { 108, "Avvio in corso dell'emulatore MT-32" }, + { 109, "Avvio rete in corso" }, + { 110, "Input" }, + { 111, "Percorso non valido" }, + { 112, "Programmatore tasti" }, + { 113, "Tastiera" }, + { 114, "Mappa tasti:" }, + { 115, "Tasti" }, + { 116, "Lingua dell'interfaccia grafica di ScummVM" }, + { 117, "Lingua del gioco. Un gioco inglese non potr\340 risultare tradotto in italiano" }, + { 118, "Lingua:" }, + { 119, "Sinistra" }, + { 120, "Clic sinistro" }, + { 121, "Carica" }, + { 122, "Carica gioco:" }, + { 123, "Carica un salvataggio del gioco selezionato" }, + { 124, "Emulatore OPL MAME" }, + { 125, "MIDI" }, + { 126, "Guadagno MIDI:" }, + { 127, "Emulatore MT-32" }, + { 128, "Dispositivo MT32:" }, + { 129, "Ridimensiona schermo principale:" }, + { 130, "Mappa" }, + { 131, "Aggiungi in massa..." }, + { 132, "Menu" }, + { 133, "Varie" }, + { 134, "Modalit\340 mista AdLib/MIDI" }, + { 135, "Monta DVD" }, + { 136, "Monta SMB" }, + { 137, "Clic del mouse" }, + { 138, "Multifunzione" }, + { 139, "Volume musica:" }, + { 140, "Disattiva audio" }, + { 141, "Nome:" }, + { 142, "Rete disattivata" }, + { 143, "Rete non avviata (%d)" }, + { 144, "Rete attiva" }, + { 145, "Rete attiva, condivisione montata" }, + { 146, "Mai" }, + { 147, "No" }, + { 148, "Nessuna data salvata" }, + { 149, "Nessuna musica" }, + { 150, "Nessun tempo di gioco salvato" }, + { 151, "Nessun orario salvato" }, + { 152, "Nessuno" }, + { 153, "Normale (nessun ridimensionamento)" }, + { 154, "OK" }, + { 155, "Frequenza output:" }, + { 156, "Ignora le impostazioni MIDI globali" }, + { 157, "Ignora le impostazioni audio globali" }, + { 158, "Ignora le impostazioni grafiche globali" }, + { 159, "Ignora le impostazioni globali di volume" }, + { 160, "Emulatore PC Speaker" }, + { 161, "Password:" }, + { 162, "Il percorso non \350 una cartella" }, + { 163, "Il percorso non \350 un file" }, + { 164, "Il percorso non esiste" }, + { 165, "Percorsi" }, + { 166, "Pausa" }, + { 167, "Scegli il gioco:" }, + { 168, "La piattaforma per la quale il gioco \350 stato concepito" }, + { 169, "Piattaforma:" }, + { 170, "Tempo di gioco: " }, + { 171, "Seleziona un'azione" }, + { 172, "Percorso dei plugin:" }, + { 173, "Dispositivo preferito:" }, + { 174, "Premi il tasto da associare" }, + { 175, "Esci" }, + { 176, "Chiudi ScummVM" }, + { 177, "Autorizzazione di lettura negata" }, + { 178, "Lettura fallita" }, + { 179, "Riprogramma tasti" }, + { 180, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, + { 181, "Modalit\340 resa grafica:" }, + { 182, "Destra" }, + { 183, "Clic destro" }, + { 184, "Clic destro" }, + { 185, "Rotazione" }, + { 186, "Volume effetti:" }, + { 187, "SMB" }, + { 188, "Salva" }, + { 189, "Percorso di salvataggio:" }, + { 190, "Percorso di salvataggio: " }, + { 191, "Salva gioco:" }, + { 192, "Scansione completa!" }, + { 193, "%d cartelle analizzate..." }, + { 194, "Menu principale di ScummVM" }, + { 195, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, + { 196, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, + { 197, "ScummVM non ha potuto aprire la cartella specificata!" }, + { 198, "Cerca nella lista dei giochi" }, + { 199, "Cerca:" }, + { 200, "Seleziona SoundFont" }, + { 201, "Seleziona un tema" }, + { 202, "Seleziona la cartella di gioco aggiuntiva" }, + { 203, "Seleziona un'azione e clicca 'Mappa'" }, + { 204, "Seleziona la cartella dei temi dell'interfaccia" }, + { 205, "Seleziona la cartella dei file aggiuntivi" }, + { 206, "Seleziona la cartella dei plugin" }, + { 207, "Seleziona la cartella dei salvataggi" }, + { 208, "Seleziona la cartella per i salvataggi" }, + { 209, "Seleziona la cartella contenente i file di gioco" }, + { 210, "Sensibilit\340" }, + { 211, "Server:" }, + { 212, "Condivisione:" }, + { 213, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, + { 214, "Mostra tastiera" }, + { 215, "Mostra cursore del mouse" }, + { 216, "Mostra i sottotitoli e attiva le voci" }, + { 217, "Mostra/nascondi cursore" }, + { 218, "Salta" }, + { 219, "Salta battuta" }, + { 220, "Salta testo" }, + { 221, "Aggancia ai bordi" }, + { 222, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, + { 223, "Suono on/off" }, + { 224, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, + { 225, "SoundFont:" }, + { 226, "Voci" }, + { 227, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, + { 228, "Volume degli effetti sonori" }, + { 229, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, + { 230, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, + { 231, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, + { 232, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, + { 233, "Specifica il percorso di ulteriori dati usati dal gioco" }, + { 234, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, + { 235, "Specifica dove archiviare i salvataggi" }, + { 236, "Voci" }, + { 237, "Volume voci:" }, + { 238, "Renderer standard (16bpp)" }, + { 239, "Esegue il gioco selezionato" }, + { 240, "Stato:" }, + { 241, "Sub" }, + { 242, "Velocit\340 sottotitoli:" }, + { 243, "Sottotitoli" }, + { 244, "Cambia personaggio" }, + { 245, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, + { 246, "Testo e voci:" }, + { 247, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, + { 248, "Percorso del tema:" }, + { 249, "Tema:" }, + { 250, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, + { 251, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, + { 252, "Ora: " }, + { 253, "Attesa per l'avvio della rete" }, + { 254, "Compensa X del tocco" }, + { 255, "Compensa Y del tocco" }, + { 256, "Modalit\340 touchpad disattivata." }, + { 257, "Modalit\340 touchpad attivata." }, + { 258, "Roland MT-32 effettivo (disattiva emulazione GM)" }, + { 259, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, + { 260, "Sconosciuto" }, + { 261, "Errore sconosciuto" }, + { 262, "Smonta DVD" }, + { 263, "Smonta SMB" }, + { 264, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, + { 265, "Modalit\340 colore non supportata" }, + { 266, "Salvataggio senza titolo" }, + { 267, "Su" }, + { 268, "Utilizza generazione di suono sia MIDI che AdLib" }, + { 269, "Utilizza il controllo del cursore stile trackpad del portatile" }, + { 270, "Nome utente:" }, + { 271, "Utilizzo del driver SDL " }, + { 272, "Underscan verticale:" }, + { 273, "Video" }, + { 274, "Tastiera virtuale" }, + { 275, "Volume" }, + { 276, "MIDI Windows" }, + { 277, "Autorizzazione di scrittura negata" }, + { 278, "Scrittura dati fallita" }, + { 279, "S\354" }, + { 280, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, + { 281, "Zona" }, + { 282, "Zoom indietro" }, + { 283, "Zoom avanti" }, + { 284, "ogni 10 minuti" }, + { 285, "ogni 15 minuti" }, + { 286, "ogni 30 minuti" }, + { 287, "ogni 5 minuti" }, + { 288, "~I~nfo" }, + { 289, "~A~ggiungi gioco..." }, + { 290, "~A~nnulla" }, + { 291, "~C~hiudi" }, + { 292, "~M~odifica gioco..." }, + { 293, "~A~iuto" }, + { 294, "Controlli combattimento di ~I~ndy" }, + { 295, "~T~asti" }, + { 296, "~M~odalit\340 mancini" }, + { 297, "~C~arica" }, + { 298, "~C~arica..." }, + { 299, "~S~uccessivi" }, + { 300, "~O~K" }, + { 301, "~O~pzioni" }, + { 302, "~O~pzioni..." }, + { 303, "~P~recedenti" }, + { 304, "C~h~iudi" }, + { 305, "~R~imuovi gioco" }, + { 306, "~R~ipristina" }, + { 307, "Ri~t~orna alla schermata di avvio" }, + { 308, "~S~alva" }, + { 309, "~G~ioca" }, + { 310, "~T~ransizioni attive" }, + { 311, "~E~ffetto acqua attivo" }, + { 312, "Modalit\340 ~Z~ip attivata" }, + { -1, NULL } +}; + static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1260,7 +1577,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1317,7 +1634,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 17:48+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1634,6 +1951,7 @@ struct PoLangEntry { const PoLangEntry _translations[] = { { "ru_RU", "cp1251", _translation_ru_RU }, { "fr_FR", "iso-8859-1", _translation_fr_FR }, + { "it_IT", "iso-8859-1", _translation_it_IT }, { "ca_ES", "iso-8859-1", _translation_ca_ES }, { "hu_HU", "cp1250", _translation_hu_HU }, { "de_DE", "iso-8859-1", _translation_de_DE }, diff --git a/gui/credits.h b/gui/credits.h index 2f19a4ee9b..cf34150864 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -379,6 +379,9 @@ static const char *credits[] = { "C1""Hungarian", "C0""Alex Bevilacqua", "", +"C1""Italian", +"C0""Matteo Angelino", +"", "C1""Russian", "C0""Eugene Sandulenko", "", diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100644 index 0000000000..ad521dfd56 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,1356 @@ +# LANGUAGE translation for ScummVM. +# Copyright (C) YEAR ScummVM Team +# This file is distributed under the same license as the ScummVM package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-27 18:21+0100\n" +"PO-Revision-Date: 2010-06-27 18:20+0100\n" +"Last-Translator: Maff \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: Italiano\n" + +#: gui/about.cpp:96 +#, c-format +msgid "(built on %s)" +msgstr "(build creata il %s)" + +#: gui/about.cpp:103 +msgid "Features compiled in:" +msgstr "Funzionalità compilate in:" + +#: gui/about.cpp:112 +msgid "Available engines:" +msgstr "Motori disponibili:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Cartella superiore" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Vai alla cartella superiore" + +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "Annulla" + +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Scegli" + +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "Chiudi" + +#: gui/GuiManager.cpp:105 +msgid "Mouse click" +msgstr "Clic del mouse" + +#: gui/GuiManager.cpp:108 base/main.cpp:285 +msgid "Display keyboard" +msgstr "Mostra tastiera" + +#: gui/GuiManager.cpp:111 base/main.cpp:288 +msgid "Remap keys" +msgstr "Riprogramma tasti" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "Mappa" + +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "Seleziona un'azione e clicca 'Mappa'" + +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "Tasto associato: %s" + +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "Tasto associato: nessuno" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "Seleziona un'azione" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "Premi il tasto da associare" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "Scegli un'azione da mappare" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Gioco" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"Breve identificatore di gioco utilizzato per il riferimento a salvataggi e " +"per l'esecuzione del gioco dalla riga di comando" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Nome:" + +#: gui/launcher.cpp:177 gui/launcher.cpp:178 +msgid "Full title of the game" +msgstr "Titolo completo del gioco" + +#: gui/launcher.cpp:181 +msgid "Language:" +msgstr "Lingua:" + +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" + +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: sound/null.cpp:42 +msgid "" +msgstr "" + +#: gui/launcher.cpp:192 +msgid "Platform:" +msgstr "Piattaforma:" + +#: gui/launcher.cpp:192 gui/launcher.cpp:193 +msgid "Platform the game was originally designed for" +msgstr "La piattaforma per la quale il gioco è stato concepito" + +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +msgid "Graphics" +msgstr "Grafica" + +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +msgid "GFX" +msgstr "Grafica" + +#: gui/launcher.cpp:206 +msgid "Override global graphic settings" +msgstr "Ignora le impostazioni grafiche globali" + +#: gui/launcher.cpp:213 gui/options.cpp:890 +msgid "Audio" +msgstr "Audio" + +#: gui/launcher.cpp:215 +msgid "Override global audio settings" +msgstr "Ignora le impostazioni audio globali" + +#: gui/launcher.cpp:223 gui/options.cpp:894 +msgid "Volume" +msgstr "Volume" + +#: gui/launcher.cpp:225 +msgid "Override global volume settings" +msgstr "Ignora le impostazioni globali di volume" + +#: gui/launcher.cpp:232 gui/options.cpp:902 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:234 +msgid "Override global MIDI settings" +msgstr "Ignora le impostazioni MIDI globali" + +#: gui/launcher.cpp:244 gui/options.cpp:908 +msgid "Paths" +msgstr "Percorsi" + +#: gui/launcher.cpp:250 +msgid "Game Path:" +msgstr "Percorso del gioco:" + +#: gui/launcher.cpp:254 gui/options.cpp:921 +msgid "Extra Path:" +msgstr "Percorso aggiuntivo:" + +#: gui/launcher.cpp:254 gui/launcher.cpp:255 +msgid "Specifies path to additional data used the game" +msgstr "Specifica il percorso di ulteriori dati usati dal gioco" + +#: gui/launcher.cpp:258 +msgid "Save Path:" +msgstr "Percorso di salvataggio:" + +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 +msgid "Specifies where your savegames are put" +msgstr "Specifica dove archiviare i salvataggi" + +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 +msgid "None" +msgstr "Nessuno" + +#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "Predefinito" + +#: gui/launcher.cpp:391 gui/options.cpp:1167 +msgid "Select SoundFont" +msgstr "Seleziona SoundFont" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Seleziona la cartella contenente i file di gioco" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Seleziona la cartella di gioco aggiuntiva" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Seleziona la cartella dei salvataggi" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro." + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "C~h~iudi" + +#: gui/launcher.cpp:500 +msgid "Quit ScummVM" +msgstr "Chiudi ScummVM" + +#: gui/launcher.cpp:501 +msgid "A~b~out..." +msgstr "~I~nfo..." + +#: gui/launcher.cpp:501 +msgid "About ScummVM" +msgstr "Informazioni su ScummVM" + +#: gui/launcher.cpp:502 +msgid "~O~ptions..." +msgstr "~O~pzioni..." + +#: gui/launcher.cpp:502 +msgid "Change global ScummVM options" +msgstr "Modifica le opzioni globali di ScummVM" + +#: gui/launcher.cpp:504 +msgid "~S~tart" +msgstr "~G~ioca" + +#: gui/launcher.cpp:504 +msgid "Start selected game" +msgstr "Esegue il gioco selezionato" + +#: gui/launcher.cpp:507 +msgid "~L~oad..." +msgstr "~C~arica..." + +#: gui/launcher.cpp:507 +msgid "Load savegame for selected game" +msgstr "Carica un salvataggio del gioco selezionato" + +#: gui/launcher.cpp:511 +msgid "~A~dd Game..." +msgstr "~A~ggiungi gioco..." + +#: gui/launcher.cpp:511 +msgid "Hold Shift for Mass Add" +msgstr "Tieni premuto Shift per l'aggiunta in massa" + +#: gui/launcher.cpp:513 +msgid "~E~dit Game..." +msgstr "~M~odifica gioco..." + +#: gui/launcher.cpp:513 +msgid "Change game options" +msgstr "Modifica le opzioni di gioco" + +#: gui/launcher.cpp:515 +msgid "~R~emove Game" +msgstr "~R~imuovi gioco" + +#: gui/launcher.cpp:515 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" + +#: gui/launcher.cpp:522 +msgid "Search in game list" +msgstr "Cerca nella lista dei giochi" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Cerca:" + +#: gui/launcher.cpp:529 gui/options.cpp:713 +msgid "Clear value" +msgstr "Cancella" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Carica gioco:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "Carica" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Voui davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere " +"un numero enorme di giochi." + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "Sì" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "No" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM non ha potuto aprire la cartella specificata!" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Scegli il gioco:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Sei sicuro di voler rimuovere questa configurazione di gioco?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "" +"Questo gioco non supporta il caricamento di salvataggi dalla schermata di " +"avvio." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "" +"ScummVM non ha potuto trovare un motore in grado di eseguire il gioco " +"selezionato!" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Aggiungi in massa..." + +#: gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Aggiungi gioco..." + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... progresso ..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "Scansione completa!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "Rilevati %d nuovi giochi." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "%d cartelle analizzate..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "Rilevati %d nuovi giochi..." + +#: gui/options.cpp:78 +msgid "Never" +msgstr "Mai" + +#: gui/options.cpp:78 +msgid "every 5 mins" +msgstr "ogni 5 minuti" + +#: gui/options.cpp:78 +msgid "every 10 mins" +msgstr "ogni 10 minuti" + +#: gui/options.cpp:78 +msgid "every 15 mins" +msgstr "ogni 15 minuti" + +#: gui/options.cpp:78 +msgid "every 30 mins" +msgstr "ogni 30 minuti" + +#: gui/options.cpp:80 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:80 +msgid "11kHz" +msgstr "11kHz" + +#: gui/options.cpp:80 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:80 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:80 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:620 +msgid "Graphics mode:" +msgstr "Modalità grafica:" + +#: gui/options.cpp:631 +msgid "Render mode:" +msgstr "Modalità resa grafica:" + +#: gui/options.cpp:631 gui/options.cpp:632 +msgid "Special dithering modes supported by some games" +msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" + +#: gui/options.cpp:641 +msgid "Fullscreen mode" +msgstr "Modalità a schermo intero" + +#: gui/options.cpp:644 +msgid "Aspect ratio correction" +msgstr "Correzione proporzioni" + +#: gui/options.cpp:644 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Corregge le proporzioni dei giochi 320x200" + +#: gui/options.cpp:651 +msgid "Preferred Device:" +msgstr "Dispositivo preferito:" + +#: gui/options.cpp:651 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "" +"Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" + +#: gui/options.cpp:652 +msgid "Specifies output sound device or sound card emulator" +msgstr "" +"Specifica il dispositivo di output audio o l'emulatore della scheda audio" + +#: gui/options.cpp:654 +msgid "MT32 Device:" +msgstr "Dispositivo MT32:" + +#: gui/options.cpp:654 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" +"CM32l/CM64" + +#: gui/options.cpp:656 +msgid "GM Device:" +msgstr "Dispositivo GM:" + +#: gui/options.cpp:656 +msgid "Specifies default sound device for General MIDI output" +msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" + +#: gui/options.cpp:688 +msgid "AdLib emulator:" +msgstr "Emulatore AdLib:" + +#: gui/options.cpp:688 gui/options.cpp:689 +msgid "AdLib is used for music in many games" +msgstr "AdLib è utilizzato per la musica in molti giochi" + +#: gui/options.cpp:699 +msgid "Output rate:" +msgstr "Frequenza output:" + +#: gui/options.cpp:699 gui/options.cpp:700 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " +"essere supportati dalla tua scheda audio" + +#: gui/options.cpp:711 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:711 gui/options.cpp:712 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" + +#: gui/options.cpp:716 +msgid "Mixed AdLib/MIDI mode" +msgstr "Modalità mista AdLib/MIDI" + +#: gui/options.cpp:716 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Utilizza generazione di suono sia MIDI che AdLib" + +#: gui/options.cpp:719 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" + +#: gui/options.cpp:719 +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " +"che è connesso al tuo computer" + +#: gui/options.cpp:722 +msgid "Enable Roland GS Mode" +msgstr "Attiva la modalità Roland GS" + +#: gui/options.cpp:722 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "" +"Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland " +"MT-32" + +#: gui/options.cpp:725 +msgid "MIDI gain:" +msgstr "Guadagno MIDI:" + +#: gui/options.cpp:738 +msgid "Text and Speech:" +msgstr "Testo e voci:" + +#: gui/options.cpp:743 gui/options.cpp:749 +msgid "Speech" +msgstr "Voci" + +#: gui/options.cpp:744 gui/options.cpp:750 +msgid "Subtitles" +msgstr "Sottotitoli" + +#: gui/options.cpp:745 gui/options.cpp:751 +msgid "Both" +msgstr "Entrambi" + +#: gui/options.cpp:749 +msgid "Spch" +msgstr "Voci" + +#: gui/options.cpp:750 +msgid "Subs" +msgstr "Sub" + +#: gui/options.cpp:751 +msgid "Show subtitles and play speech" +msgstr "Mostra i sottotitoli e attiva le voci" + +#: gui/options.cpp:755 +msgid "Subtitle speed:" +msgstr "Velocità sottotitoli:" + +#: gui/options.cpp:767 +msgid "Music volume:" +msgstr "Volume musica:" + +#: gui/options.cpp:774 +msgid "Mute All" +msgstr "Disattiva audio" + +#: gui/options.cpp:777 +msgid "SFX volume:" +msgstr "Volume effetti:" + +#: gui/options.cpp:777 gui/options.cpp:778 +msgid "Special sound effects volume" +msgstr "Volume degli effetti sonori" + +#: gui/options.cpp:784 +msgid "Speech volume:" +msgstr "Volume voci:" + +#: gui/options.cpp:915 +msgid "Save Path: " +msgstr "Percorso di salvataggio: " + +#: gui/options.cpp:918 +msgid "Theme Path:" +msgstr "Percorso del tema:" + +#: gui/options.cpp:921 gui/options.cpp:922 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" + +#: gui/options.cpp:925 +msgid "Plugins Path:" +msgstr "Percorso dei plugin:" + +#: gui/options.cpp:930 +msgid "Misc" +msgstr "Varie" + +#: gui/options.cpp:932 +msgid "Theme:" +msgstr "Tema:" + +#: gui/options.cpp:936 +msgid "GUI Renderer:" +msgstr "Renderer interfaccia grafica:" + +#: gui/options.cpp:942 +msgid "Autosave:" +msgstr "Salvataggio automatico:" + +#: gui/options.cpp:950 +msgid "Keys" +msgstr "Tasti" + +#: gui/options.cpp:957 +msgid "GUI Language:" +msgstr "Lingua dell'interfaccia:" + +#: gui/options.cpp:957 +msgid "Language of ScummVM GUI" +msgstr "Lingua dell'interfaccia grafica di ScummVM" + +#: gui/options.cpp:962 +msgid "English" +msgstr "Inglese" + +#: gui/options.cpp:1106 +msgid "You have to restart ScummVM to take the effect." +msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." + +#: gui/options.cpp:1119 +msgid "Select directory for savegames" +msgstr "Seleziona la cartella per i salvataggi" + +#: gui/options.cpp:1126 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra." + +#: gui/options.cpp:1135 +msgid "Select directory for GUI themes" +msgstr "Seleziona la cartella dei temi dell'interfaccia" + +#: gui/options.cpp:1145 +msgid "Select directory for extra files" +msgstr "Seleziona la cartella dei file aggiuntivi" + +#: gui/options.cpp:1156 +msgid "Select directory for plugins" +msgstr "Seleziona la cartella dei plugin" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "Nessuna data salvata" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "Nessun orario salvato" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "Nessun tempo di gioco salvato" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "Elimina" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Sei sicuro di voler eliminare questo salvataggio?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Data: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Ora: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Tempo di gioco: " + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Salvataggio senza titolo" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Seleziona un tema" + +#: gui/ThemeEngine.cpp:337 +msgid "Disabled GFX" +msgstr "Grafica disattivata" + +#: gui/ThemeEngine.cpp:338 +msgid "Standard Renderer (16bpp)" +msgstr "Renderer standard (16bpp)" + +#: gui/ThemeEngine.cpp:340 +msgid "Antialiased Renderer (16bpp)" +msgstr "Renderer con antialiasing (16bpp)" + +#: base/main.cpp:205 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Il motore non supporta il livello di debug '%s'" + +#: base/main.cpp:273 +msgid "Menu" +msgstr "Menu" + +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "Salta" + +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "Pausa" + +#: base/main.cpp:282 +msgid "Skip line" +msgstr "Salta battuta" + +#: base/main.cpp:404 +msgid "Error running game:" +msgstr "Errore nell'esecuzione del gioco:" + +#: base/main.cpp:430 base/main.cpp:431 +msgid "Could not find any engine capable of running the selected game" +msgstr "" +"Impossibile trovare un motore in grado di eseguire il gioco selezionato" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Percorso non valido" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "Dati di gioco non trovati" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "ID di gioco non supportato" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Modalità colore non supportata" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Autorizzazione di lettura negata" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Autorizzazione di scrittura negata" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "Il percorso non esiste" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "Il percorso non è una cartella" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "Il percorso non è un file" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Impossibile creare il file" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Lettura fallita" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Scrittura dati fallita" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "Errore sconosciuto" + +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "Hercules verde" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "Hercules ambra" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "~R~ipristina" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~C~arica" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~S~alva" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~O~pzioni" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~A~iuto" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "~I~nfo" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "Ri~t~orna alla schermata di avvio" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Salva gioco:" + +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Salva" + +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~O~K" + +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "~A~nnulla" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~T~asti" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~P~recedenti" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~S~uccessivi" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +msgid "~C~lose" +msgstr "~C~hiudi" + +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "Modalità ~Z~ip attivata" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "~T~ransizioni attive" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "~E~ffetto acqua attivo" + +#: sound/fmopl.cpp:51 +msgid "MAME OPL emulator" +msgstr "Emulatore OPL MAME" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "Emulatore OPL DOSBox" + +#: sound/null.h:45 +msgid "No music" +msgstr "Nessuna musica" + +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" +msgstr "Emulatore AdLib" + +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" +msgstr "Avvio in corso dell'emulatore MT-32" + +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" +msgstr "Emulatore MT-32" + +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "Emulatore PC Speaker" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" +msgstr "Emulatore IBM PCjr" + +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" +msgstr "Emulatore FM Towns" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "Mappa tasti:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr " (Attivo)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr " (Globale)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr " (Gioco)" + +#: backends/midi/windows.cpp:157 +msgid "Windows MIDI" +msgstr "MIDI Windows" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +msgid "ScummVM Main Menu" +msgstr "Menu principale di ScummVM" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +msgid "~L~eft handed mode" +msgstr "~M~odalità mancini" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +msgid "~I~ndy fight controls" +msgstr "Controlli combattimento di ~I~ndy" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +msgid "Show mouse cursor" +msgstr "Mostra cursore del mouse" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "Snap to edges" +msgstr "Aggancia ai bordi" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Touch X Offset" +msgstr "Compensa X del tocco" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +msgid "Touch Y Offset" +msgstr "Compensa Y del tocco" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +msgid "Use laptop trackpad-style cursor control" +msgstr "Utilizza il controllo del cursore stile trackpad del portatile" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +msgid "Tap for left click, double tap right click" +msgstr "Un tocco per il clic sinistro, doppio tocco per il clic destro" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Sensitivity" +msgstr "Sensibilità" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +msgid "Initial top screen scale:" +msgstr "Ridimensiona schermo in primo piano:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +msgid "Main screen scaling:" +msgstr "Ridimensiona schermo principale:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +msgid "Hardware scale (fast, but low quality)" +msgstr "Ridimensionamento hardware (veloce, ma di bassa qualità)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Software scale (good quality, but slower)" +msgstr "Ridimensionamento software (di buona qualità, ma più lento)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +msgid "Unscaled (you must scroll left and right)" +msgstr "Non ridimensionato (devi scorrere a sinistra e a destra)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Brightness:" +msgstr "Luminosità:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +msgid "High quality audio (slower) (reboot)" +msgstr "Audio ad alta qualità (più lento) (riavviare)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +msgid "Disable power off" +msgstr "Disattiva spegnimento in chiusura" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "Modalità touchpad attivata." + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "Modalità touchpad disattivata." + +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "Normale (nessun ridimensionamento)" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "Su" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "Giù" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "Sinistra" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "Destra" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "Clic sinistro" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "Clic destro" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "Zona" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "Multifunzione" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "Cambia personaggio" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "Salta testo" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "Modalità veloce" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Esci" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "Debugger" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "Menu globale" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "Tastiera virtuale" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "Programmatore tasti" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "Sei sicuro di voler uscire?" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Video" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Modalità video attuale:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "Double-strike" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "Underscan orizzontale:" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "Underscan verticale:" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Input" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "Sensibilità pad GC:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "Accelerazione pad GC:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "Stato:" + +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Sconosciuto" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "Monta DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "Smonta DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Server:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "Condivisione:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Nome utente:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Password:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Avvia rete" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "Monta SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "Smonta SMB" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "DVD montato con successo" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "Errore nel montare il DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "DVD non montato" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "Rete attiva, condivisione montata" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "Rete attiva" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr ", errore nel montare la condivisione" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr ", condivisione non montata" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "Rete disattivata" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "Avvio rete in corso" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "Attesa per l'avvio della rete" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "Rete non avviata (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "Nascondi la barra degli strumenti" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "Mostra tastiera" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "Suono on/off" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "Clic destro" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "Mostra/nascondi cursore" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "Osservazione libera" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "Zoom avanti" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "Zoom indietro" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "Associa tasti" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "Cursore su" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "Cursore giù" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "Cursore a sinistra" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "Cursore a destra" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "Vuoi caricare o salvare il gioco?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr " Sei sicuro di voler uscire? " + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "Tastiera" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "Rotazione" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "Utilizzo del driver SDL " + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "Visualizza " + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "Vuoi eseguire una scansione automatica?" -- cgit v1.2.3 From 303dc063883dab2dfe30b44d9fad9fe8e3948ec5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 18:41:07 +0000 Subject: SCI: fixing regression from one of the merges svn-id: r50387 --- engines/sci/engine/script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index b3fbafb355..03234bea1d 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -345,7 +345,7 @@ void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg) if ((objType == SCI_OBJ_OBJECT) || (objType == SCI_OBJ_CLASS)) { // object or class? reg.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) - int superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); + int16 superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); if (superclass >= 0) { int superclass_script = segMan->getClass(superclass).script; -- cgit v1.2.3 From 4653153910ee2186e914f5f4717e212053adef54 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 19:58:32 +0000 Subject: SCI: added new command "p" / "stepover" to execute one command, but skip send/calls processing. single-step is now "trace" (alias "s" and "t"), stepping till ret is "step_ret" (alias "pret"), removed unused kDebugSeek svn-id: r50388 --- engines/sci/console.cpp | 26 +++++++--- engines/sci/console.h | 3 +- engines/sci/debug.h | 4 +- engines/sci/engine/scriptdebug.cpp | 98 ++++++++++++++++++++------------------ 4 files changed, 74 insertions(+), 57 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 8ea4315c24..b34b4f44ea 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -156,12 +156,15 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DCmd_Register("set_acc", WRAP_METHOD(Console, cmdSetAccumulator)); DCmd_Register("backtrace", WRAP_METHOD(Console, cmdBacktrace)); DCmd_Register("bt", WRAP_METHOD(Console, cmdBacktrace)); // alias - DCmd_Register("step", WRAP_METHOD(Console, cmdStep)); - DCmd_Register("s", WRAP_METHOD(Console, cmdStep)); // alias + DCmd_Register("trace", WRAP_METHOD(Console, cmdTrace)); + DCmd_Register("t", WRAP_METHOD(Console, cmdTrace)); // alias + DCmd_Register("s", WRAP_METHOD(Console, cmdTrace)); // alias + DCmd_Register("stepover", WRAP_METHOD(Console, cmdStepOver)); + DCmd_Register("p", WRAP_METHOD(Console, cmdStepOver)); // alias + DCmd_Register("step_ret", WRAP_METHOD(Console, cmdStepRet)); + DCmd_Register("pret", WRAP_METHOD(Console, cmdStepRet)); // alias DCmd_Register("step_event", WRAP_METHOD(Console, cmdStepEvent)); DCmd_Register("se", WRAP_METHOD(Console, cmdStepEvent)); // alias - DCmd_Register("step_ret", WRAP_METHOD(Console, cmdStepRet)); - DCmd_Register("sret", WRAP_METHOD(Console, cmdStepRet)); // alias DCmd_Register("step_global", WRAP_METHOD(Console, cmdStepGlobal)); DCmd_Register("sg", WRAP_METHOD(Console, cmdStepGlobal)); // alias DCmd_Register("step_callk", WRAP_METHOD(Console, cmdStepCallk)); @@ -378,9 +381,10 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" dissect_script - Examines a script\n"); DebugPrintf(" set_acc - Sets the accumulator\n"); DebugPrintf(" backtrace / bt - Dumps the send/self/super/call/calle/callb stack\n"); - DebugPrintf(" step / s - Executes one operation (no parameters) or several operations (specified as a parameter) \n"); + DebugPrintf(" trace / t / s - Executes one operation (no parameters) or several operations (specified as a parameter) \n"); + DebugPrintf(" stepover / p - Executes one operation, skips over call/send\n"); + DebugPrintf(" step_ret / pret - Steps forward until ret is called on the current execution stack level.\n"); DebugPrintf(" step_event / se - Steps forward until a SCI event is received.\n"); - DebugPrintf(" step_ret / sret - Steps forward until ret is called on the current execution stack level.\n"); DebugPrintf(" step_global / sg - Steps until the global variable with the specified index is modified.\n"); DebugPrintf(" step_callk / snk - Steps forward until it hits the next callk operation, or a specific callk (specified as a parameter)\n"); DebugPrintf(" disasm - Disassembles a method by name\n"); @@ -2405,7 +2409,7 @@ bool Console::cmdBacktrace(int argc, const char **argv) { return true; } -bool Console::cmdStep(int argc, const char **argv) { +bool Console::cmdTrace(int argc, const char **argv) { if (argc == 2 && atoi(argv[1]) > 0) g_debugState.runningStep = atoi(argv[1]) - 1; g_debugState.debugging = true; @@ -2413,6 +2417,14 @@ bool Console::cmdStep(int argc, const char **argv) { return false; } +bool Console::cmdStepOver(int argc, const char **argv) { + g_debugState.seeking = kDebugSeekStepOver; + g_debugState.seekLevel = _engine->_gamestate->_executionStack.size(); + g_debugState.debugging = true; + + return false; +} + bool Console::cmdStepEvent(int argc, const char **argv) { g_debugState.stopOnEvent = true; g_debugState.debugging = true; diff --git a/engines/sci/console.h b/engines/sci/console.h index e353958a0d..f8a2768f35 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -120,7 +120,8 @@ private: bool cmdDissectScript(int argc, const char **argv); bool cmdSetAccumulator(int argc, const char **argv); bool cmdBacktrace(int argc, const char **argv); - bool cmdStep(int argc, const char **argv); + bool cmdTrace(int argc, const char **argv); + bool cmdStepOver(int argc, const char **argv); bool cmdStepEvent(int argc, const char **argv); bool cmdStepRet(int argc, const char **argv); bool cmdStepGlobal(int argc, const char **argv); diff --git a/engines/sci/debug.h b/engines/sci/debug.h index 8383722956..d381e55dc8 100644 --- a/engines/sci/debug.h +++ b/engines/sci/debug.h @@ -57,8 +57,8 @@ enum DebugSeeking { kDebugSeekCallk = 1, // Step forward until callk is found kDebugSeekLevelRet = 2, // Step forward until returned from this level kDebugSeekSpecialCallk = 3, // Step forward until a /special/ callk is found - kDebugSeekSO = 4, // Step forward until specified PC (after the send command) and stack depth - kDebugSeekGlobal = 5 // Step forward until one specified global variable is modified + kDebugSeekGlobal = 4, // Step forward until one specified global variable is modified + kDebugSeekStepOver = 5 // Step forward until we reach same stack-level again }; struct DebugState { diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index d829b01c31..b8a0987865 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -296,55 +296,59 @@ void script_debug(EngineState *s) { #endif if (g_debugState.seeking && !g_debugState.breakpointWasHit) { // Are we looking for something special? - SegmentObj *mobj = s->_segMan->getSegment(s->xs->addr.pc.segment, SEG_TYPE_SCRIPT); - - if (mobj) { - Script *scr = (Script *)mobj; - byte *code_buf = scr->_buf; - int code_buf_size = scr->getBufSize(); - int opcode = s->xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset]; - int op = opcode >> 1; - int paramb1 = s->xs->addr.pc.offset + 1 >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset + 1]; - int paramf1 = (opcode & 1) ? paramb1 : (s->xs->addr.pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + s->xs->addr.pc.offset + 1)); - - switch (g_debugState.seeking) { - case kDebugSeekSpecialCallk: - if (paramb1 != g_debugState.seekSpecial) - return; - - case kDebugSeekCallk: - if (op != op_callk) - return; - break; - - case kDebugSeekLevelRet: - if ((op != op_ret) || (g_debugState.seekLevel < (int)s->_executionStack.size()-1)) - return; - break; - - case kDebugSeekGlobal: - if (op < op_sag) - return; - if ((op & 0x3) > 1) - return; // param or temp - if ((op & 0x3) && s->_executionStack.back().local_segment > 0) - return; // locals and not running in script.000 - if (paramf1 != g_debugState.seekSpecial) - return; // CORRECT global? - break; - - case kDebugSeekSO: - // FIXME: Unhandled? - break; - - case kDebugSeekNothing: - // We seek nothing, so just continue - break; - } - + if (g_debugState.seeking == kDebugSeekStepOver) { + // are we above seek-level? resume then + if (g_debugState.seekLevel < (int)s->_executionStack.size()) + return; g_debugState.seeking = kDebugSeekNothing; - // OK, found whatever we were looking for } + + if (g_debugState.seeking != kDebugSeekNothing) { + SegmentObj *mobj = s->_segMan->getSegment(s->xs->addr.pc.segment, SEG_TYPE_SCRIPT); + + if (mobj) { + Script *scr = (Script *)mobj; + byte *code_buf = scr->_buf; + int code_buf_size = scr->getBufSize(); + int opcode = s->xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset]; + int op = opcode >> 1; + int paramb1 = s->xs->addr.pc.offset + 1 >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset + 1]; + int paramf1 = (opcode & 1) ? paramb1 : (s->xs->addr.pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + s->xs->addr.pc.offset + 1)); + + switch (g_debugState.seeking) { + case kDebugSeekSpecialCallk: + if (paramb1 != g_debugState.seekSpecial) + return; + + case kDebugSeekCallk: + if (op != op_callk) + return; + break; + + case kDebugSeekLevelRet: + if ((op != op_ret) || (g_debugState.seekLevel < (int)s->_executionStack.size()-1)) + return; + break; + + case kDebugSeekGlobal: + if (op < op_sag) + return; + if ((op & 0x3) > 1) + return; // param or temp + if ((op & 0x3) && s->_executionStack.back().local_segment > 0) + return; // locals and not running in script.000 + if (paramf1 != g_debugState.seekSpecial) + return; // CORRECT global? + break; + + default: + break; + } + + g_debugState.seeking = kDebugSeekNothing; + } + } + // OK, found whatever we were looking for } printf("Step #%d\n", s->scriptStepCounter); -- cgit v1.2.3 From 7644631daf8758e50e113f908f9db3b7d7c68a90 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 20:02:58 +0000 Subject: SCI: removing debug command "set_acc", use "vmvars a" instead svn-id: r50389 --- engines/sci/console.cpp | 23 ----------------------- engines/sci/console.h | 1 - 2 files changed, 24 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b34b4f44ea..f5a47db281 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -153,7 +153,6 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DCmd_Register("addresses", WRAP_METHOD(Console, cmdAddresses)); DCmd_Register("registers", WRAP_METHOD(Console, cmdRegisters)); DCmd_Register("dissect_script", WRAP_METHOD(Console, cmdDissectScript)); - DCmd_Register("set_acc", WRAP_METHOD(Console, cmdSetAccumulator)); DCmd_Register("backtrace", WRAP_METHOD(Console, cmdBacktrace)); DCmd_Register("bt", WRAP_METHOD(Console, cmdBacktrace)); // alias DCmd_Register("trace", WRAP_METHOD(Console, cmdTrace)); @@ -379,7 +378,6 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" addresses - Provides information on how to pass addresses\n"); DebugPrintf(" registers - Shows the current register values\n"); DebugPrintf(" dissect_script - Examines a script\n"); - DebugPrintf(" set_acc - Sets the accumulator\n"); DebugPrintf(" backtrace / bt - Dumps the send/self/super/call/calle/callb stack\n"); DebugPrintf(" trace / t / s - Executes one operation (no parameters) or several operations (specified as a parameter) \n"); DebugPrintf(" stepover / p - Executes one operation, skips over call/send\n"); @@ -2322,27 +2320,6 @@ bool Console::cmdScriptSteps(int argc, const char **argv) { return true; } -bool Console::cmdSetAccumulator(int argc, const char **argv) { - if (argc != 2) { - DebugPrintf("Sets the accumulator.\n"); - DebugPrintf("Usage: %s
\n", argv[0]); - DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); - return true; - } - - reg_t val; - - if (parse_reg_t(_engine->_gamestate, argv[1], &val, false)) { - DebugPrintf("Invalid address passed.\n"); - DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); - return true; - } - - _engine->_gamestate->r_acc = val; - - return true; -} - bool Console::cmdBacktrace(int argc, const char **argv) { DebugPrintf("Dumping the send/self/super/call/calle/callb stack:\n"); diff --git a/engines/sci/console.h b/engines/sci/console.h index f8a2768f35..c180875364 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -118,7 +118,6 @@ private: bool cmdAddresses(int argc, const char **argv); bool cmdRegisters(int argc, const char **argv); bool cmdDissectScript(int argc, const char **argv); - bool cmdSetAccumulator(int argc, const char **argv); bool cmdBacktrace(int argc, const char **argv); bool cmdTrace(int argc, const char **argv); bool cmdStepOver(int argc, const char **argv); -- cgit v1.2.3 From aa9b9dd08fb8a56685d30995661773cdc87eb546 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 20:09:51 +0000 Subject: SCI: Separated the code for initializing script classes from the code for initializing script objects svn-id: r50390 --- engines/sci/engine/script.cpp | 154 ++++++++++++++++++++------------------- engines/sci/engine/seg_manager.h | 1 + 2 files changed, 79 insertions(+), 76 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 03234bea1d..800460bfc2 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -176,94 +176,95 @@ void SegManager::scriptInitialiseLocals(SegmentId segmentId) { } } -void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { +void SegManager::scriptInitialiseClasses(SegmentId seg) { Script *scr = getScript(seg); - bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); const byte *seeker = 0; - int objType; - reg_t addr; - - // The script is initialized in 2 passes. - // Pass 1: creates a lookup table of all used classes - // Pass 2: loads classes and objects - - for (uint16 pass = 0; pass <= 1; pass++) { - uint16 objLength = 0; - seeker = scr->_buf + (oldScriptHeader ? 2 : 0); - - do { - objType = READ_SCI11ENDIAN_UINT16(seeker); - if (!objType) - break; - - objLength = READ_SCI11ENDIAN_UINT16(seeker + 2); - seeker += 4; // skip header - addr = make_reg(seg, seeker - scr->_buf); - - switch (objType) { - case SCI_OBJ_OBJECT: - case SCI_OBJ_CLASS: - if (pass == 0 && objType == SCI_OBJ_CLASS) { - int species = READ_SCI11ENDIAN_UINT16(seeker + 8); // SCRIPT_OBJECT_MAGIC_OFFSET - - if (species == (int)classTableSize()) { - // Happens in the LSL2 demo - warning("Applying workaround for an off-by-one invalid species access"); - resizeClassTable(classTableSize() + 1); - } else if (species < 0 || species > (int)classTableSize()) { - error("Invalid species %d(0x%x) not in interval " - "[0,%d) while instantiating script at segment %d\n", - species, species, classTableSize(), - seg); - return; - } - - setClassOffset(species, make_reg(seg, seeker - scr->_buf + 8)); - } else if (pass == 1) { - Object *obj = scr->scriptObjInit(addr); - obj->initSpecies(this, addr); - - if (!obj->initBaseObject(this, addr)) { - // Script 202 of KQ5 French has an invalid object - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - scr->scriptObjRemove(addr); - } - } - break; + uint16 mult = 0; + + if (getSciVersion() >= SCI_VERSION_1_1) { + seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + mult = 2; + } else { + seeker = scr->findBlock(SCI_OBJ_CLASS); + mult = 1; + } - default: - break; - } + if (!seeker) + return; + + while (true) { + // In SCI0-SCI1, this is the segment type. In SCI11, it's a marker (0x1234) + uint16 marker = READ_SCI11ENDIAN_UINT16(seeker); + bool isClass; + uint16 classpos = seeker - scr->_buf; + int16 species; + + if (!marker) + break; + + if (getSciVersion() >= SCI_VERSION_1_1) { + isClass = (READ_SCI11ENDIAN_UINT16(seeker + 14) & kInfoFlagClass); // -info- selector + species = READ_SCI11ENDIAN_UINT16(seeker + 10); + } else { + isClass = (marker == SCI_OBJ_CLASS); + species = READ_SCI11ENDIAN_UINT16(seeker + 12); + classpos += 12; + } + + if (isClass) { + // WORKAROUND for an invalid species access in the demo of LSL2 + if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)classTableSize()) + resizeClassTable(classTableSize() + 1); - seeker += objLength - 4; - } while (objType != 0 && (uint32)(seeker - scr->_buf) < scr->getScriptSize() - 2); - } // for + if (species < 0 || species >= (int)classTableSize()) + error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d\n", + species, species, classTableSize(), scr->_nr); + + setClassOffset(species, make_reg(seg, classpos)); + } + + seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * mult; + } } -void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { +void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { Script *scr = getScript(seg); - const byte *seeker = scr->_heapStart; - uint16 entrySize = READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; - seeker += entrySize; // skip first entry - seeker += 4; // skip header + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); + const byte *seeker = scr->_buf + (oldScriptHeader ? 2 : 0); - while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { - if (READ_SCI11ENDIAN_UINT16(seeker + 14) & kInfoFlagClass) { // -info- selector - int classpos = seeker - scr->_buf; - int species = READ_SCI11ENDIAN_UINT16(seeker + 10); - - if (species < 0 || species >= (int)_classTable.size()) { - error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d", - species, species, _classTable.size(), scr->_nr); - return; + do { + uint16 objType = READ_SCI11ENDIAN_UINT16(seeker); + if (!objType) + break; + + switch (objType) { + case SCI_OBJ_OBJECT: + case SCI_OBJ_CLASS: + { + reg_t addr = make_reg(seg, seeker - scr->_buf + 4); + Object *obj = scr->scriptObjInit(addr); + obj->initSpecies(this, addr); + + if (!obj->initBaseObject(this, addr)) { + // Script 202 of KQ5 French has an invalid object. This is non-fatal. + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + scr->scriptObjRemove(addr); + } } + break; - setClassOffset(species, make_reg(seg, classpos)); + default: + break; } - seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; - } - seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + seeker += READ_SCI11ENDIAN_UINT16(seeker + 2); + } while ((uint32)(seeker - scr->_buf) < scr->getScriptSize() - 2); +} + +void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { + Script *scr = getScript(seg); + const byte *seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { reg_t reg = make_reg(seg, seeker - scr->_buf); Object *obj = scr->scriptObjInit(reg); @@ -311,6 +312,7 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNu scr->init(scriptNum, resMan); scr->load(resMan); segMan->scriptInitialiseLocals(segmentId); + segMan->scriptInitialiseClasses(segmentId); if (getSciVersion() >= SCI_VERSION_1_1) { segMan->scriptInitialiseObjectsSci11(segmentId); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 037f3f0819..1ed01e2c6b 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -426,6 +426,7 @@ public: */ reg_t findObjectByName(const Common::String &name, int index = -1); + void scriptInitialiseClasses(SegmentId seg); void scriptInitialiseObjectsSci0(SegmentId seg); void scriptInitialiseObjectsSci11(SegmentId seg); -- cgit v1.2.3 From 1537d6129964732b03aae5186e9bc3e01c164817 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 20:11:15 +0000 Subject: SCI: added alias for bplist ("bl") and bpdel ("bc"), added capability of deleting all breakpoints by using "bc *" svn-id: r50391 --- engines/sci/console.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f5a47db281..958f43ee6c 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -175,8 +175,10 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { // Breakpoints DCmd_Register("bp_list", WRAP_METHOD(Console, cmdBreakpointList)); DCmd_Register("bplist", WRAP_METHOD(Console, cmdBreakpointList)); // alias + DCmd_Register("bl", WRAP_METHOD(Console, cmdBreakpointList)); // alias DCmd_Register("bp_del", WRAP_METHOD(Console, cmdBreakpointDelete)); DCmd_Register("bpdel", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias + DCmd_Register("bc", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias DCmd_Register("bp_exec_method", WRAP_METHOD(Console, cmdBreakpointExecMethod)); DCmd_Register("bpx", WRAP_METHOD(Console, cmdBreakpointExecMethod)); // alias DCmd_Register("bp_exec_function", WRAP_METHOD(Console, cmdBreakpointExecFunction)); @@ -391,8 +393,8 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" go - Executes the script\n"); DebugPrintf("\n"); DebugPrintf("Breakpoints:\n"); - DebugPrintf(" bp_list / bplist - Lists the current breakpoints\n"); - DebugPrintf(" bp_del / bpdel - Deletes a breakpoint with the specified index\n"); + DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n"); + DebugPrintf(" bp_del / bpdel / bc - Deletes a breakpoint with the specified index\n"); DebugPrintf(" bp_exec_method / bpx - Sets a breakpoint on the execution of the specified method\n"); DebugPrintf(" bp_exec_function / bpe - Sets a breakpoint on the execution of the specified exported function\n"); DebugPrintf("\n"); @@ -2669,6 +2671,9 @@ bool Console::cmdBreakpointList(int argc, const char **argv) { i++; } + if (!i) + DebugPrintf(" No breakpoints defined.\n"); + return true; } @@ -2676,6 +2681,13 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) { if (argc != 2) { DebugPrintf("Deletes a breakpoint with the specified index.\n"); DebugPrintf("Usage: %s \n", argv[0]); + DebugPrintf(" * will remove all breakpoints\n"); + return true; + } + + if (strcmp(argv[1], "*") == 0) { + g_debugState._breakpoints.clear(); + g_debugState._activeBreakpointTypes = 0; return true; } -- cgit v1.2.3 From e6a9a9da823b6c8fef25f2949d21525d8a229b9c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 20:22:09 +0000 Subject: Silenced a false positive in MSVC about a potentially uninitialized variable svn-id: r50392 --- engines/sci/graphics/ports.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 6e53ef44c4..36f84c3582 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -55,7 +55,7 @@ GfxPorts::~GfxPorts() { } void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16) { - int16 offTop; + int16 offTop = 10; _usesOldGfxFunctions = usesOldGfxFunctions; _paint16 = paint16; -- cgit v1.2.3 From f5bc8be952edb58c61459efc526229438bb87c69 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 27 Jun 2010 20:36:39 +0000 Subject: i18n: Update Russian translation svn-id: r50393 --- common/messages.cpp | 612 ++++++++++++++++++----------------- po/ru_RU.po | 915 ++++++++++++++++++++++------------------------------ 2 files changed, 704 insertions(+), 823 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index fddca0f548..ed0cf040b2 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,316 +323,324 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, - { 1, " \302\373 \363\342\345\360\345\355\373, \367\362\356 \365\356\362\350\362\345 \342\373\351\362\350? " }, - { 2, " (\300\352\362\350\342\355\340\377)" }, - { 3, " (\310\343\360\373)" }, - { 4, " (\303\353\356\341\340\353\374\355\340\377)" }, - { 5, "C2(\361\356\341\360\340\355 " }, - { 6, ", \356\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \357\340\357\352\350" }, - { 7, ", \357\340\357\352\340 \355\345 \357\356\344\352\353\376\367\345\355\340" }, - { 8, "... \350\371\363 ..." }, - { 9, "11 \352\303\366" }, - { 10, "22 \352\303\366" }, - { 11, "44 \352\303\366" }, - { 12, "48 \352\303\366" }, - { 13, "8 \352\303\366" }, - { 14, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, - { 15, "\316 \357\360\356\343\360\340\354\354\345 ScummVM" }, - { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 17, "\335\354\363\353\377\362\356\360 AdLib:" }, - { 18, "\307\342\363\352\356\342\340\377 \352\340\360\362\340 AdLib \350\361\357\356\353\374\347\363\345\362\361\377 \354\355\356\343\350\354\350 \350\343\360\340\354\350" }, - { 19, "\315\356\342. \350\343\360\340..." }, - { 20, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, - { 21, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, - { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, - { 23, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, - { 24, "\300\363\344\350\356" }, - { 25, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, - { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, - { 27, "\316 \357~\360~\356\343\360\340\354\354\345..." }, - { 28, "\315\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 29, "\302\361\270" }, - { 30, "\337\360\352\356\361\362\374:" }, - { 31, "\316\362\354\345\355\340" }, - { 32, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, - { 33, "\310\347\354\345\355\350\362\374 \356\357\366\350\350 \350\343\360\373" }, - { 34, "\310\347\354\345\355\350\362\374 \343\353\356\341\340\353\374\355\373\345 \356\357\366\350\350 ScummVM" }, - { 35, "\316\362\354\345\362\374\362\345 \345\361\353\350 \363 \342\340\361 \357\356\344\352\353\376\367\345\355\356 Roland-\361\356\342\354\345\361\362\350\354\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350 \342\373 \365\356\362\350\362\345 \345\343\356 \350\361\357\356\353\374\347\356\342\340\362\374" }, - { 36, "\302\373\341\360\340\362\374" }, - { 37, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 38, "\316\367\350\361\362\350\362\374 \347\355\340\367\345\355\350\345" }, - { 39, "\307\340\352\360\373\362\374" }, - { 40, "\312\356\360\360\345\352\362\350\360\356\342\340\362\374 \361\356\356\362\355\356\370\345\355\350\345 \361\362\356\360\356\355 \344\353\377 \350\343\360 \361 \360\340\347\360\345\370\345\355\350\345\354 320x200" }, - { 41, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 42, "\322\345\352\363\371\350\351 \342\350\344\345\356\360\345\346\350\354:" }, - { 43, "\312\363\360\361\356\360 \342\355\350\347" }, - { 44, "\312\363\360\361\356\360 \342\353\345\342\356" }, - { 45, "\312\363\360\361\356\360 \342\357\360\340\342\356" }, - { 46, "\312\363\360\361\356\360 \342\342\345\360\365" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, + { 2, " (\260\332\342\330\322\335\320\357)" }, + { 3, " (\270\323\340\353)" }, + { 4, " (\263\333\336\321\320\333\354\335\320\357)" }, + { 5, "(\341\336\321\340\320\335 %s)" }, + { 6, ", \336\350\330\321\332\320 \322\336 \322\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \337\320\337\332\330" }, + { 7, ", \337\320\337\332\320 \335\325 \337\336\324\332\333\356\347\325\335\320" }, + { 8, "... \330\351\343 ..." }, + { 9, "11 \332\263\346" }, + { 10, "22 \332\263\346" }, + { 11, "44 \332\263\346" }, + { 12, "48 \332\263\346" }, + { 13, "8 \332\263\346" }, + { 14, "<\337\336 \343\334\336\333\347\320\335\330\356>" }, + { 15, "\276 \337\340\336\323\340\320\334\334\325 ScummVM" }, + { 16, "\315\334\343\333\357\342\336\340 AdLib" }, + { 17, "\315\334\343\333\357\342\336\340 AdLib:" }, + { 18, "\267\322\343\332\336\322\320\357 \332\320\340\342\320 AdLib \330\341\337\336\333\354\327\343\325\342\341\357 \334\335\336\323\330\334\330 \330\323\340\320\334\330" }, + { 19, "\275\336\322. \330\323\340\320..." }, + { 20, "\300\320\341\342\325\340\330\327\320\342\336\340 \341\336 \341\323\333\320\326\330\322\320\335\330\325\334 (16bpp)" }, + { 21, "\272\336\340\340\325\332\346\330\357 \341\336\336\342\335\336\350\325\335\330\357 \341\342\336\340\336\335" }, + { 22, "\275\320\327\335\320\347\325\335\335\320\357 \332\333\320\322\330\350\320 : %s" }, + { 23, "\275\320\327\335\320\347\325\335\335\320\357 \332\333\320\322\330\350\320 : \335\325\342" }, + { 24, "\260\343\324\330\336" }, + { 25, "\260\322\342\336\341\336\345\340\320\335\325\335\330\325:" }, + { 26, "\264\336\341\342\343\337\335\353\325 \324\322\330\326\332\330:" }, + { 27, "\276 \337~\340~\336\323\340\320\334\334\325..." }, + { 28, "\275\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, + { 29, "\262\341\361" }, + { 30, "\317\340\332\336\341\342\354:" }, + { 31, "\276\342\334\325\335\320" }, + { 32, "\275\325 \334\336\323\343 \341\336\327\324\320\342\354 \344\320\331\333" }, + { 33, "\270\327\334\325\335\330\342\354 \336\337\346\330\330 \330\323\340\353" }, + { 34, "\270\327\334\325\335\330\342\354 \323\333\336\321\320\333\354\335\353\325 \336\337\346\330\330 ScummVM" }, + { 35, "\276\342\334\325\342\354\342\325, \325\341\333\330 \343 \322\320\341 \337\336\324\332\333\356\347\325\335\336 Roland-\341\336\322\334\325\341\342\330\334\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330 \322\353 \345\336\342\330\342\325 \325\323\336 \330\341\337\336\333\354\327\336\322\320\342\354" }, + { 36, "\262\353\321\340\320\342\354" }, + { 37, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, + { 38, "\276\347\330\341\342\330\342\354 \327\335\320\347\325\335\330\325" }, + { 39, "\267\320\332\340\353\342\354" }, + { 40, "\272\336\340\340\325\332\342\330\340\336\322\320\342\354 \341\336\336\342\335\336\350\325\335\330\325 \341\342\336\340\336\335 \324\333\357 \330\323\340 \341 \340\320\327\340\325\350\325\335\330\325\334 320x200" }, + { 41, "\275\325 \334\336\323\343 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353" }, + { 42, "\302\325\332\343\351\330\331 \322\330\324\325\336\340\325\326\330\334:" }, + { 43, "\272\343\340\341\336\340 \322\335\330\327" }, + { 44, "\272\343\340\341\336\340 \322\333\325\322\336" }, + { 45, "\272\343\340\341\336\340 \322\337\340\320\322\336" }, + { 46, "\272\343\340\341\336\340 \322\322\325\340\345" }, + { 47, "\315\334\343\333\357\342\336\340 DOSBox OPL" }, { 48, "DVD" }, - { 49, "DVD \357\356\344\352\353\376\367\345\355 \363\361\357\345\370\355\356" }, - { 50, "DVD \355\345 \357\356\344\352\353\376\367\345\355" }, - { 51, "\304\340\362\340: " }, - { 52, "\316\362\353\340\344\367\350\352" }, - { 53, "\317\356 \363\354\356\353\367\340\355\350\376" }, - { 54, "\323\344\340\353\350\362\374" }, - { 55, "\307\340\357\360\345\362\350\362\374 \342\373\352\353\376\367\345\355\350\345" }, - { 56, "\301\345\347 \343\360\340\364\350\352\350" }, - { 57, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, - { 58, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, - { 59, "\317\356\352\340\347\340\362\374 " }, - { 60, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 61, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, - { 62, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, - { 63, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, - { 64, "\302\373 \365\356\362\350\362\345 \347\340\343\360\363\347\350\362\374 \353\350\341\356 \361\356\365\360\340\355\350\362\374 \350\343\360\363?" }, - { 65, "\302\373 \365\356\362\350\362\345 \357\360\356\350\347\342\345\361\362\350 \340\342\362\356\354\340\362\350\367\345\361\352\350\351 \357\356\350\361\352?" }, - { 66, "\302\373 \365\356\362\350\362\345 \342\373\351\362\350?" }, - { 67, "\304\342\356\351\355\356\351 \363\344\340\360" }, - { 68, "\302\355\350\347" }, - { 69, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, - { 70, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 49, "DVD \337\336\324\332\333\356\347\325\335 \343\341\337\325\350\335\336" }, + { 50, "DVD \335\325 \337\336\324\332\333\356\347\325\335" }, + { 51, "\264\320\342\320: " }, + { 52, "\276\342\333\320\324\347\330\332" }, + { 53, "\277\336 \343\334\336\333\347\320\335\330\356" }, + { 54, "\303\324\320\333\330\342\354" }, + { 55, "\267\320\337\340\325\342\330\342\354 \322\353\332\333\356\347\325\335\330\325" }, + { 56, "\261\325\327 \323\340\320\344\330\332\330" }, + { 57, "\275\320\331\324\325\335\336 %d \335\336\322\353\345 \330\323\340 ..." }, + { 58, "\275\320\331\324\325\335\336 %d \335\336\322\353\345 \330\323\340." }, + { 59, "\277\336\332\320\327\320\342\354 " }, + { 60, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, + { 61, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \343\324\320\333\330\342\354 \355\342\336 \341\336\345\340\320\335\325\335\330\325?" }, + { 62, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \343\324\320\333\330\342\354 \343\341\342\320\335\336\322\332\330 \324\333\357 \355\342\336\331 \330\323\340\353?" }, + { 63, "\262\353 \324\325\331\341\342\322\330\342\325\333\354\335\336 \345\336\342\330\342\325 \327\320\337\343\341\342\330\342\354 \324\325\342\325\332\342\336\340 \322\341\325\345 \330\323\340? \315\342\336 \337\336\342\325\335\346\330\320\333\354\335\336 \334\336\326\325\342 \324\336\321\320\322\330\342\354 \321\336\333\354\350\336\325 \332\336\333\330\347\325\341\342\322\336 \330\323\340." }, + { 64, "\262\353 \345\336\342\330\342\325 \327\320\323\340\343\327\330\342\354 \333\330\321\336 \341\336\345\340\320\335\330\342\354 \330\323\340\343?" }, + { 65, "\262\353 \345\336\342\330\342\325 \337\340\336\330\327\322\325\341\342\330 \320\322\342\336\334\320\342\330\347\325\341\332\330\331 \337\336\330\341\332?" }, + { 66, "\262\353 \345\336\342\330\342\325 \322\353\331\342\330?" }, + { 67, "\264\322\336\331\335\336\331 \343\324\320\340" }, + { 68, "\262\335\330\327" }, + { 69, "\262\332\333\356\347\330\342\354 \340\325\326\330\334 Roland GS" }, + { 70, "\264\322\330\326\336\332 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \343\340\336\322\325\335\354 \336\342\333\320\324\332\330 '%s'" }, { 71, "English" }, - { 72, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, - { 73, "\316\370\350\341\352\340 \342\356 \342\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 DVD" }, - { 74, "\304\356\357. \357\363\362\374:" }, - { 75, "FM Towns" }, - { 76, "\301\373\361\362\360\373\351 \360\345\346\350\354" }, - { 77, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, - { 78, "\321\342\356\341\356\344\355\373\351 \356\341\347\356\360" }, - { 79, "\317\356\353\355\356\345 \355\340\347\342\340\355\350\345 \350\343\360\373" }, - { 80, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, - { 81, "\323\361\352\356\360\345\355\350\345 GC \357\340\344\340:" }, - { 82, "\327\363\342\361\362\340\350\362\345\353\374\355\356\361\362\374 GC \357\340\344\340:" }, - { 83, "\303\360\364" }, - { 85, "\337\347\373\352 \350\355\362\345\360\364\345\351\361\340:" }, - { 86, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, - { 87, "\310\343\360\340" }, - { 88, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, - { 89, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, - { 90, "\317\363\362\374 \352 \350\343\360\345: " }, - { 91, "\303\353\356\341\340\353\374\355\356\345 \354\345\355\376" }, - { 92, "\317\345\360\345\351\362\350 \355\340 \344\350\360\345\352\362\356\360\350\376 \363\360\356\342\355\345\354 \342\373\370\345" }, - { 93, "\302\342\345\360\365" }, - { 94, "\303\360\340\364\350\352\340" }, - { 95, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, - { 96, "\325\340\360\344\342\340\360\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\341\373\361\362\360\356, \355\356 \355\350\347\352\356\343\356 \352\340\367\345\361\362\342\340)" }, - { 99, "\321\357\360\377\362\340\362\374 \357\340\355\345\353\374 \350\355\361\362\360\363\354\345\355\362\356\342" }, - { 100, "\302\373\361\356\352\356\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340 (\354\345\344\353\345\355\355\345\345) (\360\345\341\363\362)" }, - { 101, "\301\316\353\374\370\350\345 \347\355\340\367\345\355\350\377 \347\340\344\340\376\362 \353\363\367\370\345\345 \352\340\367\345\361\362\342\356 \347\342\363\352\340, \356\344\355\340\352\356 \356\355\350 \354\356\343\363\362 \355\345 \357\356\344\344\345\360\346\350\342\340\362\374\361\377 \342\340\370\345\351 \347\342\363\352\356\342\356\351 \352\340\360\362\356\351" }, - { 102, "\323\344\345\360\346\350\342\340\351\362\345 \352\353\340\342\350\370\363 Shift \344\353\377 \362\356\343\356, \367\362\356\341\373 \344\356\341\340\342\350\362\374 \355\345\361\352\356\353\374\352\356 \350\343\360" }, - { 103, "\303\356\360\350\347\356\355\362\340\353\374\355\373\351 underscan:" }, - { 104, "FM Towns" }, + { 72, "\276\350\330\321\332\320 \327\320\337\343\341\332\320 \330\323\340\353:" }, + { 73, "\276\350\330\321\332\320 \322\336 \322\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 DVD" }, + { 74, "\264\336\337. \337\343\342\354:" }, + { 75, "\315\334\343\333\357\342\336\340 FM Towns" }, + { 76, "\261\353\341\342\340\353\331 \340\325\326\330\334" }, + { 77, "\262\332\333\356\347\325\335\335\353\325 \322 \321\330\333\324 \336\337\346\330\330:" }, + { 78, "\301\322\336\321\336\324\335\353\331 \336\321\327\336\340" }, + { 79, "\277\336\333\335\336\325 \335\320\327\322\320\335\330\325 \330\323\340\353" }, + { 80, "\277\336\333\335\336\355\332\340\320\335\335\353\331 \340\325\326\330\334" }, + { 81, "\303\341\332\336\340\325\335\330\325 GC \337\320\324\320:" }, + { 82, "\307\343\322\341\342\320\330\342\325\333\354\335\336\341\342\354 GC \337\320\324\320:" }, + { 83, "\263\340\344" }, + { 84, "\303\341\342\340\336\331\342\341\322\336 GM:" }, + { 85, "\317\327\353\332 \330\335\342\325\340\344\325\331\341\320:" }, + { 86, "\300\320\341\342\325\340\330\327\320\342\336\340 GUI:" }, + { 87, "\270\323\340\320" }, + { 88, "\275\325\342 \344\320\331\333\336\322 \330\323\340\353" }, + { 89, "Game Id \335\325 \337\336\324\324\325\340\326\330\322\320\325\342\341\357" }, + { 90, "\277\343\342\354 \332 \330\323\340\325: " }, + { 91, "\263\333\336\321\320\333\354\335\336\325 \334\325\335\356" }, + { 92, "\277\325\340\325\331\342\330 \335\320 \324\330\340\325\332\342\336\340\330\356 \343\340\336\322\335\325\334 \322\353\350\325" }, + { 93, "\262\322\325\340\345" }, + { 94, "\263\340\320\344\330\332\320" }, + { 95, "\263\340\320\344\330\347\325\341\332\330\331 \340\325\326\330\334:" }, + { 96, "\305\320\340\324\322\320\340\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\321\353\341\342\340\336, \335\336 \335\330\327\332\336\323\336 \332\320\347\325\341\342\322\320)" }, + { 97, "Hercules \317\335\342\320\340\335\353\331" }, + { 98, "Hercules \267\325\333\325\335\353\331" }, + { 99, "\301\337\340\357\342\320\342\354 \337\320\335\325\333\354 \330\335\341\342\340\343\334\325\335\342\336\322" }, + { 100, "\262\353\341\336\332\336\325 \332\320\347\325\341\342\322\336 \327\322\343\332\320 (\334\325\324\333\325\335\335\325\325) (\340\325\321\343\342)" }, + { 101, "\261\276\333\354\350\330\325 \327\335\320\347\325\335\330\357 \327\320\324\320\356\342 \333\343\347\350\325\325 \332\320\347\325\341\342\322\336 \327\322\343\332\320, \336\324\335\320\332\336 \336\335\330 \334\336\323\343\342 \335\325 \337\336\324\324\325\340\326\330\322\320\342\354\341\357 \322\320\350\325\331 \327\322\343\332\336\322\336\331 \332\320\340\342\336\331" }, + { 102, "\303\324\325\340\326\330\322\320\331\342\325 \332\333\320\322\330\350\343 Shift \324\333\357 \342\336\323\336, \347\342\336\321\353 \324\336\321\320\322\330\342\354 \335\325\341\332\336\333\354\332\336 \330\323\340" }, + { 103, "\263\336\340\330\327\336\335\342\320\333\354\335\353\331 underscan:" }, + { 104, "\315\334\343\333\357\342\336\340 IBM PCjr" }, { 105, "ID:" }, - { 106, "\310\355\350\366\350\340\353\350\347\340\366\350\377 \361\345\362\350" }, - { 107, "\315\340\367\340\353\374\355\373\351 \354\340\361\370\362\340\341 \342\345\360\365\355\345\343\356 \375\352\360\340\355\340:" }, - { 108, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 109, "\315\340\361\362\360\340\350\342\340\376 \361\345\362\374" }, - { 110, "\302\342\356\344" }, - { 111, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, - { 112, "\315\340\347\355\340\367\345\355\350\345 \352\353\340\342\350\370" }, - { 113, "\312\353\340\342\350\340\362\363\360\340" }, - { 114, "\322\340\341\353\350\366\340 \352\353\340\342\350\370:" }, - { 115, "\312\353\340\342\350\370\350" }, - { 116, "\337\347\373\352 \343\360\340\364\350\367\345\361\352\356\343\356 \350\355\362\345\360\364\345\351\361\340 ScummVM" }, - { 117, "\337\347\373\352 \350\343\360\373. \310\347\354\345\355\345\355\350\345 \375\362\356\343\356 \357\340\360\340\354\345\362\360\340 \355\345 \357\360\345\342\360\340\362\350\362 \350\343\360\363 \355\340 \340\355\343\353\350\351\361\352\356\354 \342 \360\363\361\361\352\363\376" }, - { 118, "\337\347\373\352:" }, - { 119, "\302\353\345\342\356" }, - { 120, "\313\345\342\373\351 \371\345\353\367\356\352" }, - { 121, "\307\340\343\360\363\347\350\362\374" }, - { 122, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, - { 123, "\307\340\343\360\363\347\350\362\374 \361\356\365\360\355\345\355\350\345 \344\353\377 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, - { 124, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 106, "\270\335\330\346\330\320\333\330\327\320\346\330\357 \341\325\342\330" }, + { 107, "\275\320\347\320\333\354\335\353\331 \334\320\341\350\342\320\321 \322\325\340\345\335\325\323\336 \355\332\340\320\335\320:" }, + { 108, "\275\320\341\342\340\320\330\322\320\356 \355\334\343\333\357\342\336\340 MT-32" }, + { 109, "\275\320\341\342\340\320\330\322\320\356 \341\325\342\354" }, + { 110, "\262\322\336\324" }, + { 111, "\275\325\322\325\340\335\353\331 \337\343\342\354" }, + { 112, "\275\320\327\335\320\347\325\335\330\325 \332\333\320\322\330\350" }, + { 113, "\272\333\320\322\330\320\342\343\340\320" }, + { 114, "\302\320\321\333\330\346\320 \332\333\320\322\330\350:" }, + { 115, "\272\333\320\322\330\350\330" }, + { 116, "\317\327\353\332 \323\340\320\344\330\347\325\341\332\336\323\336 \330\335\342\325\340\344\325\331\341\320 ScummVM" }, + { 117, "\317\327\353\332 \330\323\340\353. \270\327\334\325\335\325\335\330\325 \355\342\336\323\336 \337\320\340\320\334\325\342\340\320 \335\325 \337\340\325\322\340\320\342\330\342 \330\323\340\343 \335\320 \320\335\323\333\330\331\341\332\336\334 \322 \340\343\341\341\332\343\356" }, + { 118, "\317\327\353\332:" }, + { 119, "\262\333\325\322\336" }, + { 120, "\273\325\322\353\331 \351\325\333\347\336\332" }, + { 121, "\267\320\323\340\343\327\330\342\354" }, + { 122, "\267\320\323\340\343\327\330\342\354 \330\323\340\343:" }, + { 123, "\267\320\323\340\343\327\330\342\354 \341\336\345\340\335\325\335\330\325 \324\333\357 \322\353\321\340\320\335\335\336\331 \330\323\340\353" }, + { 124, "\315\334\343\333\357\342\336\340 MAME OPL:" }, { 125, "MIDI" }, - { 126, "\323\361\350\353\345\355\350\345 MIDI:" }, - { 127, "\335\354\363\353\377\366\350\377 MT-32" }, - { 129, "\314\340\361\370\362\340\341 \343\353\340\342\355\356\343\356 \375\352\360\340\355\340:" }, - { 130, "\315\340\347\355\340\367\350\362\374" }, - { 131, "\304\356\341. \354\355\356\343\356..." }, - { 132, "\314\345\355\376" }, - { 133, "\320\340\347\355\356\345" }, - { 134, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, - { 135, "\317\356\344\352\353\376\367\350\362\374 DVD" }, - { 136, "\317\356\344\352\353\376\367\350\362\374 SMB" }, - { 137, "\312\353\350\352 \354\373\370\374\376" }, - { 138, "\314\363\353\374\362\350\364\363\355\352\366\350\377" }, - { 139, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, - { 140, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, - { 141, "\315\340\347\342\340\355\350\345:" }, - { 142, "\321\345\362\374 \342\373\352\353\376\367\345\355\340" }, - { 143, "\321\345\362\374 \355\345 \355\340\361\362\360\356\345\355\340 (%d)" }, - { 144, "\321\345\362\374 \360\340\341\356\362\340\345\362" }, - { 145, "\321\345\362\374 \360\340\341\356\362\340\345\362, \357\340\357\352\340 \357\356\344\352\353\376\367\345\355\340" }, - { 146, "\315\350\352\356\343\344\340" }, - { 147, "\315\345\362" }, - { 148, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, - { 149, "\301\345\347 \354\363\347\373\352\350" }, - { 150, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, - { 151, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, - { 152, "\315\345 \347\340\344\340\355" }, + { 126, "\303\341\330\333\325\335\330\325 MIDI:" }, + { 127, "\315\334\343\333\357\342\336\340 MT-32" }, + { 128, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, + { 129, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" }, + { 130, "\275\320\327\335\320\347\330\342\354" }, + { 131, "\264\336\321. \334\335\336\323\336..." }, + { 132, "\274\325\335\356" }, + { 133, "\300\320\327\335\336\325" }, + { 134, "\301\334\325\350\320\335\335\353\331 \340\325\326\330\334 AdLib/MIDI" }, + { 135, "\277\336\324\332\333\356\347\330\342\354 DVD" }, + { 136, "\277\336\324\332\333\356\347\330\342\354 SMB" }, + { 137, "\272\333\330\332 \334\353\350\354\356" }, + { 138, "\274\343\333\354\342\330\344\343\335\332\346\330\357" }, + { 139, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, + { 140, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, + { 141, "\275\320\327\322\320\335\330\325:" }, + { 142, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, + { 143, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, + { 144, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, + { 145, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" }, + { 146, "\275\330\332\336\323\324\320" }, + { 147, "\275\325\342" }, + { 148, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, + { 149, "\261\325\327 \334\343\327\353\332\330" }, + { 150, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" }, + { 151, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" }, + { 152, "\275\325 \327\320\324\320\335" }, + { 153, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, { 154, "OK" }, - { 155, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, - { 156, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, - { 157, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, - { 158, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, - { 159, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, - { 160, "PC \361\357\350\352\345\360" }, - { 161, "\317\340\360\356\353\374:" }, - { 162, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, - { 163, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, - { 164, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, - { 165, "\317\363\362\350" }, - { 166, "\317\340\363\347\340" }, - { 167, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, - { 168, "\317\353\340\362\364\356\360\354\340, \344\353\377 \352\356\362\356\360\356\351 \350\343\360\340 \341\373\353\340 \350\347\355\340\367\340\353\374\355\356 \360\340\347\360\340\341\356\362\340\355\340" }, - { 169, "\317\353\340\362\364\356\360\354\340:" }, - { 170, "\302\360\345\354\377 \350\343\360\373: " }, - { 171, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, - { 172, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, - { 174, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, - { 175, "\302\373\365\356\344" }, - { 176, "\302\373\365\356\344 \350\347 ScummVM" }, - { 177, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, - { 178, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, - { 179, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, - { 180, "\323\344\340\353\350\362\374 \350\343\360\363 \350\347 \361\357\350\361\352\340. \315\345 \363\344\340\353\377\345\362 \350\343\360\363 \361 \346\345\361\362\352\356\343\356 \344\350\361\352\340" }, - { 181, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, - { 182, "\302\357\360\340\342\356" }, - { 183, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 184, "\317\360\340\342\373\351 \371\345\353\367\356\352" }, - { 185, "\317\356\342\345\360\355\363\362\374" }, - { 186, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 155, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, + { 156, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 157, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, + { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, + { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, + { 160, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" }, + { 161, "\277\320\340\336\333\354:" }, + { 162, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" }, + { 163, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" }, + { 164, "\277\343\342\354 \335\325 \335\320\331\324\325\335" }, + { 165, "\277\343\342\330" }, + { 166, "\277\320\343\327\320" }, + { 167, "\262\353\321\325\340\330\342\325 \330\323\340\343:" }, + { 168, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" }, + { 169, "\277\333\320\342\344\336\340\334\320:" }, + { 170, "\262\340\325\334\357 \330\323\340\353: " }, + { 171, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, + { 172, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, + { 173, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, + { 174, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, + { 175, "\262\353\345\336\324" }, + { 176, "\262\353\345\336\324 \330\327 ScummVM" }, + { 177, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" }, + { 178, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, + { 179, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, + { 180, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, + { 181, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, + { 182, "\262\337\340\320\322\336" }, + { 183, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 184, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 185, "\277\336\322\325\340\335\343\342\354" }, + { 186, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, { 187, "SMB" }, - { 188, "\307\340\357\350\361\340\362\374" }, - { 189, "\317\363\362\374 \361\356\365\360.: " }, - { 190, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, - { 191, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, - { 192, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, - { 193, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, - { 194, "\303\353\340\342\355\356\345 \354\345\355\376 ScummVM" }, - { 195, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, - { 196, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, - { 197, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, - { 198, "\317\356\350\361\352 \342 \361\357\350\361\352\345 \350\343\360" }, - { 199, "\317\356\350\361\352:" }, - { 200, "\302\373\341\345\360\350\362\345 SoundFont" }, - { 201, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, - { 202, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, - { 203, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, - { 204, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, - { 205, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, - { 206, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, - { 207, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 208, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, - { 209, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, - { 210, "\327\363\342\361\362\342\350\362\345\353\374\355\356\361\362\374" }, - { 211, "\321\345\360\342\345\360:" }, - { 212, "\321\345\362\345\342\340\377 \357\340\357\352\340:" }, - { 213, "\312\356\360\356\362\352\350\351 \350\344\345\355\362\350\364\350\352\340\362\356\360, \350\361\357\356\353\374\347\363\345\354\373\351 \344\353\377 \350\354\345\355 \361\356\365\360\340\355\345\355\350\351 \350\343\360 \350 \344\353\377 \347\340\357\363\361\352\340 \350\347 \352\356\354\340\355\344\355\356\351 \361\362\360\356\352\350" }, - { 214, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, - { 215, "\317\356\352\340\347\373\342\340\362\374 \352\363\360\361\356\360 \354\373\370\350" }, - { 216, "\317\356\352\340\347\373\342\340\362\374 \361\363\341\362\350\362\360\373 \350 \342\356\361\357\360\356\350\347\342\356\344\350\362\374 \360\345\367\374" }, - { 217, "\317\356\352\340\347\340\362\374/\323\341\360\340\362\374 \352\363\360\361\356\360" }, - { 218, "\317\360\356\357\363\361\362\350\362\374" }, - { 219, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, - { 220, "\317\360\356\357\363\361\362\350\362\374 \362\345\352\361\362" }, - { 221, "\317\360\350\352\360\345\357\350\362\374 \352 \343\360\340\355\350\366\340\354" }, - { 222, "\317\360\356\343\360\340\354\354\355\356\345 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\345 (\365\356\360\356\370\345\345 \352\340\367\345\361\362\342\356, \355\356 \354\345\344\353\345\355\355\345\345)" }, - { 223, "\307\342\363\352 \342\352\353/\342\373\352\353" }, - { 224, "SoundFont\373 \357\356\344\344\345\360\344\346\350\342\340\376\362\361\377 \355\345\352\356\362\356\360\373\354\350 \347\342\363\352\356\342\373\354\350 \352\340\360\362\340\354\350, Fluidsynth \350 Timidity" }, + { 188, "\267\320\337\330\341\320\342\354" }, + { 189, "\277\343\342\354 \341\336\345\340.: " }, + { 190, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, + { 191, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, + { 192, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, + { 193, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, + { 194, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" }, + { 195, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" }, + { 196, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" }, + { 197, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" }, + { 198, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" }, + { 199, "\277\336\330\341\332:" }, + { 200, "\262\353\321\325\340\330\342\325 SoundFont" }, + { 201, "\262\353\321\325\340\330\342\325 \342\325\334\343" }, + { 202, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" }, + { 203, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" }, + { 204, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" }, + { 205, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" }, + { 206, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" }, + { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 208, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" }, + { 210, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" }, + { 211, "\301\325\340\322\325\340:" }, + { 212, "\301\325\342\325\322\320\357 \337\320\337\332\320:" }, + { 213, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" }, + { 214, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, + { 215, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" }, + { 216, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" }, + { 217, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" }, + { 218, "\277\340\336\337\343\341\342\330\342\354" }, + { 219, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" }, + { 220, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" }, + { 221, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" }, + { 222, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" }, + { 223, "\267\322\343\332 \322\332\333/\322\353\332\333" }, + { 224, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" }, { 225, "SoundFont:" }, - { 226, "\316\347\342" }, - { 227, "\321\357\345\366\350\340\353\374\355\373\345 \360\345\346\350\354\373 \360\345\355\344\345\360\350\355\343\340, \357\356\344\344\345\360\346\350\342\340\345\354\373\345 \355\345\352\356\362\356\360\373\354\350 \350\343\360\340\354\350" }, - { 228, "\303\360\356\354\352\356\361\362\374 \361\357\345\366\350\340\353\374\355\373\365 \347\342\363\352\356\342\373\365 \375\364\364\345\352\362\356\342" }, - { 229, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \363\361\362\360\356\351\361\362\342\356 \344\353\377 \347\342\363\352\340 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 231, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 232, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365, \350\361\357\356\353\374\347\363\345\354\373\365 \342\361\345\354\350 \350\343\360\340\354\350, \353\350\341\356 ScummVM" }, - { 233, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \344\356\357\356\353\355\350\362\345\353\374\355\373\354 \364\340\351\353\340\354 \344\340\355\355\373\365 \344\353\377 \350\343\360\373" }, - { 234, "\323\352\340\347\373\342\340\345\362 \342\373\365\356\344\355\356\345 \347\342\363\352\356\342\356\345 \363\361\362\360\356\351\361\362\342\356 \350\353\350 \375\354\363\353\377\362\356\360 \347\342\363\352\356\342\356\351 \352\340\360\362\373" }, - { 235, "\323\352\340\347\373\342\340\345\362 \357\363\362\374 \352 \361\356\365\360\340\355\345\355\350\377\354 \350\343\360\373" }, - { 236, "\316\347\342\363\367\352\340" }, - { 237, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, - { 238, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, - { 239, "\307\340\357\363\361\362\350\362\374 \342\373\341\360\340\355\355\363\376 \350\343\360\363" }, - { 240, "\321\356\361\362\356\377\355\350\345:" }, - { 241, "\321\363\341" }, - { 242, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, - { 243, "\321\363\341\362\350\362\360\373" }, - { 244, "\321\354\345\355\350\362\374 \343\345\360\356\377" }, - { 245, "\322\340\357 \344\353\377 \353\345\342\356\343\356 \371\345\353\367\352\340, \344\342\356\351\355\356\351 \362\340\357 \344\353\377 \357\360\340\342\356\343\356 \371\345\353\367\352\340" }, - { 246, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, - { 247, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, - { 248, "\317\363\362\374 \352 \362\345\354\340\354:" }, - { 249, "\322\345\354\340:" }, - { 250, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, - { 251, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, - { 252, "\302\360\345\354\377: " }, - { 253, "\302\360\345\354\377 \357\356\344\352\353\376\367\345\355\350\377 \352 \361\345\362\350 \350\361\362\345\352\353\356" }, - { 254, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 X" }, - { 255, "\321\354\345\371\345\355\350\345 \352\340\361\340\355\350\351 \357\356 \356\361\350 Y" }, - { 256, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\373\352\353\376\367\345\355." }, - { 257, "\320\345\346\350\354 \362\340\367\357\340\344\340 \342\352\353\376\367\345\355." }, - { 258, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, - { 259, "\302\373\352\353\376\367\340\345\362 \354\340\357\357\350\355\343 General MIDI \344\353\377 \350\343\360 \361 \347\342\363\352\356\342\356\351 \344\356\360\356\346\352\356\351 \344\353\377 Roland MT-32" }, - { 260, "\315\345\350\347\342\345\361\362\355\356" }, - { 261, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, - { 262, "\316\362\352\353\376\367\350\362\374 DVD" }, - { 263, "\316\362\352\353\376\367\362\374 SMB" }, - { 264, "\301\345\347 \354\340\361\370\362\340\341\350\360\356\342\340\355\350\377 (\355\363\346\355\356 \341\363\344\345\362 \357\360\356\352\360\363\367\350\342\340\362\374 \342\353\345\342\356 \350 \342\357\360\340\342\356)" }, - { 265, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, - { 266, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, - { 267, "\302\342\345\360\365" }, - { 268, "\310\361\357\356\353\374\347\356\342\340\362\374 \350 MIDI \350 AdLib \344\353\377 \343\345\355\345\360\340\366\350\350 \347\342\363\352\340" }, - { 269, "\310\361\357\356\353\374\347\356\342\340\362\374 \363\357\360\340\342\353\345\355\350\345 \352\363\360\361\356\360\356\354 \352\340\352 \355\340 \362\360\345\352\357\340\344\345 \353\345\357\362\356\357\356\342" }, - { 270, "\317\356\353\374\347\356\342\340\362\345\353\374:" }, - { 271, "\310\361\357\356\353\374\347\363\376 \344\360\340\351\342\345\360 SDL " }, - { 272, "\302\345\360\362\350\352\340\353\374\355\373\351 underscan:" }, - { 273, "\302\350\344\345\356" }, - { 274, "\302\350\360\362\363\340\353\374\355\340\377 \352\353\340\342\350\340\362\363\360\340" }, - { 275, "\303\360\356\354\352\356\361\362\374" }, + { 226, "\276\327\322" }, + { 227, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" }, + { 228, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" }, + { 229, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" }, + { 230, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, + { 231, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 232, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" }, + { 233, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" }, + { 234, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 235, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, + { 236, "\276\327\322\343\347\332\320" }, + { 237, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, + { 238, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, + { 239, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, + { 240, "\301\336\341\342\336\357\335\330\325:" }, + { 241, "\301\343\321" }, + { 242, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, + { 243, "\301\343\321\342\330\342\340\353" }, + { 244, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, + { 245, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, + { 246, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, + { 247, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, + { 248, "\277\343\342\354 \332 \342\325\334\320\334:" }, + { 249, "\302\325\334\320:" }, + { 250, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, + { 251, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, + { 252, "\262\340\325\334\357: " }, + { 253, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" }, + { 254, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" }, + { 255, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" }, + { 256, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." }, + { 257, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." }, + { 258, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" }, + { 259, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" }, + { 260, "\275\325\330\327\322\325\341\342\335\336" }, + { 261, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" }, + { 262, "\276\342\332\333\356\347\330\342\354 DVD" }, + { 263, "\276\342\332\333\356\347\342\354 SMB" }, + { 264, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" }, + { 265, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" }, + { 266, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" }, + { 267, "\262\322\325\340\345" }, + { 268, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" }, + { 269, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" }, + { 270, "\277\336\333\354\327\336\322\320\342\325\333\354:" }, + { 271, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " }, + { 272, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" }, + { 273, "\262\330\324\325\336" }, + { 274, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" }, + { 275, "\263\340\336\334\332\336\341\342\354" }, { 276, "Windows MIDI" }, - { 277, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, - { 278, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, - { 279, "\304\340" }, - { 280, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, - { 281, "\307\356\355\340" }, - { 282, "\323\354\345\355\374\370. \354\340\361\370\362\340\341" }, - { 283, "\323\342\345\353. \354\340\361\370\362\340\341" }, - { 284, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, - { 285, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, - { 286, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, - { 287, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, - { 288, "\316 \357\360\356~\343~\360\340\354\354\345" }, - { 289, "~\304~\356\341. \350\343\360\363..." }, - { 290, "\316~\362~\354\345\355\340" }, - { 291, "~\307~\340\352\360\373\362\374" }, - { 292, "\310\347~\354~. \350\343\360\363..." }, - { 293, "~\317~\356\354\356\371\374" }, - { 294, "\323\357\360\340\342\353\345\355\350\345 \341\356\377\354\350 \342 Indy" }, - { 295, "~\312~\353\340\342\350\370\350" }, - { 296, "\313\345\342\356\360\363\352\350\351 \360\345\346\350\354" }, - { 297, "~\307~\340\343\360\363\347\350\362\374" }, - { 298, "~\307~\340\343\360...." }, - { 299, "~\321~\353\345\344" }, + { 277, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" }, + { 278, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" }, + { 279, "\264\320" }, + { 280, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." }, + { 281, "\267\336\335\320" }, + { 282, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" }, + { 283, "\303\322\325\333. \334\320\341\350\342\320\321" }, + { 284, "\332\320\326\324\353\325 10 \334\330\335\343\342" }, + { 285, "\332\320\326\324\353\325 15 \334\330\335\343\342" }, + { 286, "\332\320\326\324\353\325 30 \334\330\335\343\342" }, + { 287, "\332\320\326\324\353\325 5 \334\330\335\343\342" }, + { 288, "\276 \337\340\336~\323~\340\320\334\334\325" }, + { 289, "~\264~\336\321. \330\323\340\343..." }, + { 290, "\276~\342~\334\325\335\320" }, + { 291, "~\267~\320\332\340\353\342\354" }, + { 292, "\270\327~\334~. \330\323\340\343..." }, + { 293, "~\277~\336\334\336\351\354" }, + { 294, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, + { 295, "~\272~\333\320\322\330\350\330" }, + { 296, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, + { 297, "~\267~\320\323\340\343\327\330\342\354" }, + { 298, "~\267~\320\323\340...." }, + { 299, "~\301~\333\325\324" }, { 300, "~O~K" }, - { 301, "~\316~\357\366\350\350" }, - { 302, "~\316~\357\366\350\350..." }, - { 303, "~\317~\360\345\344" }, - { 304, "~\302~\373\365\356\344" }, - { 305, "~\323~\344\340\353\350\362\374 \350\343\360\363" }, - { 306, "\317\360\356\344\356\353~\346~\350\362\374" }, - { 307, "~\302~\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, - { 308, "~\307~\340\357\350\361\340\362\374" }, - { 309, "\317~\363~\361\352" }, - { 310, "\317\345\360\345\365\356\344\373 \340\352\362\350\342\350\360\356\342\340\355\373" }, - { 311, "\335\364\364\345\352\362\373 \342\356\344\373 \342\352\353\376\367\345\355\373" }, - { 312, "\320\345\346\350\354 \341\373\361\362\360\356\343\356 \357\345\360\345\365\356\344\340 \340\352\362\350\342\350\360\356\342\340\355" }, + { 301, "~\276~\337\346\330\330" }, + { 302, "~\276~\337\346\330\330..." }, + { 303, "~\277~\340\325\324" }, + { 304, "~\262~\353\345\336\324" }, + { 305, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, + { 306, "\277\340\336\324\336\333~\326~\330\342\354" }, + { 307, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, + { 308, "~\267~\320\337\330\341\320\342\354" }, + { 309, "\277~\343~\341\332" }, + { 310, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, + { 311, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" }, + { 312, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" }, { -1, NULL } }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -949,7 +957,7 @@ static const PoMessageEntry _translation_fr_FR[] = { }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -1266,7 +1274,7 @@ static const PoMessageEntry _translation_it_IT[] = { }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1577,7 +1585,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1634,7 +1642,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 18:21+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1949,7 +1957,7 @@ struct PoLangEntry { }; const PoLangEntry _translations[] = { - { "ru_RU", "cp1251", _translation_ru_RU }, + { "ru_RU", "iso-8859-5", _translation_ru_RU }, { "fr_FR", "iso-8859-1", _translation_fr_FR }, { "it_IT", "iso-8859-1", _translation_it_IT }, { "ca_ES", "iso-8859-1", _translation_ca_ES }, diff --git a/po/ru_RU.po b/po/ru_RU.po index 7e21e4f4a2..7e666dc693 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,73 +7,71 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-27 23:31+0300\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" -"Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=cp1251\n" +"Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" -"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Language: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" +"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:96 -#, fuzzy, c-format +#, c-format msgid "(built on %s)" -msgstr "C2(ñîáðàí " +msgstr "(áÞÑàÐÝ %s)" #: gui/about.cpp:103 -#, fuzzy msgid "Features compiled in:" -msgstr "C1Âêëþ÷åííûå â áèëä îïöèè:" +msgstr "²ÚÛîçÕÝÝëÕ Ò ÑØÛÔ ÞßæØØ:" #: gui/about.cpp:112 -#, fuzzy msgid "Available engines:" -msgstr "C1Äîñòóïíûå äâèæêè:" +msgstr "´ÞáâãßÝëÕ ÔÒØÖÚØ:" #: gui/browser.cpp:69 msgid "Go up" -msgstr "Ââåðõ" +msgstr "²ÒÕàå" #: gui/browser.cpp:69 msgid "Go to previous directory level" -msgstr "Ïåðåéòè íà äèðåêòîðèþ óðîâíåì âûøå" +msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" -msgstr "Îòìåíà" +msgstr "¾âÜÕÝÐ" #: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" -msgstr "Âûáðàòü" +msgstr "²ëÑàÐâì" #: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" -msgstr "Çàêðûòü" +msgstr "·ÐÚàëâì" #: gui/GuiManager.cpp:105 msgid "Mouse click" -msgstr "Êëèê ìûøüþ" +msgstr "ºÛØÚ Üëèìî" #: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" -msgstr "Ïîêàçàòü êëàâèàòóðó" +msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã" #: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" -msgstr "Ïåðåíàçíà÷èòü êëàâèøè" +msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ" #: gui/KeysDialog.cpp:44 msgid "Map" -msgstr "Íàçíà÷èòü" +msgstr "½Ð×ÝÐçØâì" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -81,33 +79,33 @@ msgstr "OK" #: gui/KeysDialog.cpp:52 msgid "Select an action and click 'Map'" -msgstr "Âûáåðèòå äåéñòâèå è êëèêíèòå 'Íàçíà÷èòü'" +msgstr "²ëÑÕàØâÕ ÔÕÙáâÒØÕ Ø ÚÛØÚÝØâÕ '½Ð×ÝÐçØâì'" #: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" -msgstr "Íàçíà÷åííàÿ êëàâèøà : %s" +msgstr "½Ð×ÝÐçÕÝÝÐï ÚÛÐÒØèÐ : %s" #: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" -msgstr "Íàçíà÷åííàÿ êëàâèøà : íåò" +msgstr "½Ð×ÝÐçÕÝÝÐï ÚÛÐÒØèÐ : ÝÕâ" #: gui/KeysDialog.cpp:93 msgid "Please select an action" -msgstr "Ïîæàëóéñòà, âûáåðèòå äåéñòâèå" +msgstr "¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔÕÙáâÒØÕ" #: gui/KeysDialog.cpp:109 msgid "Press the key to associate" -msgstr "Íàæìèòå êëàâèøó äëÿ íàçíà÷åíèÿ" +msgstr "½ÐÖÜØâÕ ÚÛÐÒØèã ÔÛï ÝÐ×ÝÐçÕÝØï" #: gui/KeysDialog.cpp:148 msgid "Choose an action to map" -msgstr "Âûáåðèòå äåéñòâèå äëÿ íàçíà÷åíèÿ" +msgstr "²ëÑÕàØâÕ ÔÕÙáâÒØÕ ÔÛï ÝÐ×ÝÐçÕÝØï" #: gui/launcher.cpp:170 msgid "Game" -msgstr "Èãðà" +msgstr "¸ÓàÐ" #: gui/launcher.cpp:173 msgid "ID:" @@ -118,232 +116,232 @@ msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" msgstr "" -"Êîðîòêèé èäåíòèôèêàòîð, èñïîëüçóåìûé äëÿ èìåí ñîõðàíåíèé èãð è äëÿ çàïóñêà " -"èç êîìàíäíîé ñòðîêè" +"ºÞàÞâÚØÙ ØÔÕÝâØäØÚÐâÞà, ØáßÞÛì×ãÕÜëÙ ÔÛï ØÜÕÝ áÞåàÐÝÕÝØÙ ØÓà Ø ÔÛï ×ÐßãáÚÐ " +"Ø× ÚÞÜÐÝÔÝÞÙ áâàÞÚØ" #: gui/launcher.cpp:177 msgid "Name:" -msgstr "Íàçâàíèå:" +msgstr "½Ð×ÒÐÝØÕ:" #: gui/launcher.cpp:177 gui/launcher.cpp:178 msgid "Full title of the game" -msgstr "Ïîëíîå íàçâàíèå èãðû" +msgstr "¿ÞÛÝÞÕ ÝÐ×ÒÐÝØÕ ØÓàë" #: gui/launcher.cpp:181 msgid "Language:" -msgstr "ßçûê:" +msgstr "Ï×ëÚ:" #: gui/launcher.cpp:181 gui/launcher.cpp:182 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" msgstr "" -"ßçûê èãðû. Èçìåíåíèå ýòîãî ïàðàìåòðà íå ïðåâðàòèò èãðó íà àíãëèéñêîì â " -"ðóññêóþ" +"Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÓÞ ßÐàÐÜÕâàÐ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò " +"àãááÚãî" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" -msgstr "<ïî óìîë÷àíèþ>" +msgstr "<ßÞ ãÜÞÛçÐÝØî>" #: gui/launcher.cpp:192 msgid "Platform:" -msgstr "Ïëàòôîðìà:" +msgstr "¿ÛÐâäÞàÜÐ:" #: gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" -msgstr "Ïëàòôîðìà, äëÿ êîòîðîé èãðà áûëà èçíà÷àëüíî ðàçðàáîòàíà" +msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" -msgstr "Ãðàôèêà" +msgstr "³àÐäØÚÐ" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" -msgstr "Ãðô" +msgstr "³àä" #: gui/launcher.cpp:206 msgid "Override global graphic settings" -msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðàôèêè" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" -msgstr "Àóäèî" +msgstr "°ãÔØÞ" #: gui/launcher.cpp:215 msgid "Override global audio settings" -msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè àóäèî" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" -msgstr "Ãðîìêîñòü" +msgstr "³àÞÜÚÞáâì" #: gui/launcher.cpp:225 msgid "Override global volume settings" -msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè ãðîìêîñòè" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "MIDI" #: gui/launcher.cpp:234 msgid "Override global MIDI settings" -msgstr "Ïåðåêðûòü ãëîáàëüíûå óñòàíîâêè MIDI" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" -msgstr "Ïóòè" +msgstr "¿ãâØ" #: gui/launcher.cpp:250 msgid "Game Path:" -msgstr "Ïóòü ê èãðå: " +msgstr "¿ãâì Ú ØÓàÕ: " -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" -msgstr "Äîï. ïóòü:" +msgstr "´Þß. ßãâì:" #: gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" -msgstr "Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ äëÿ èãðû" +msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå ÔÛï ØÓàë" #: gui/launcher.cpp:258 msgid "Save Path:" -msgstr "Ïóòü ñîõð.: " +msgstr "¿ãâì áÞåà.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" -msgstr "Óêàçûâàåò ïóòü ê ñîõðàíåíèÿì èãðû" +msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" -msgstr "Íå çàäàí" +msgstr "½Õ ×ÐÔÐÝ" #: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" -msgstr "Ïî óìîë÷àíèþ" +msgstr "¿Þ ãÜÞÛçÐÝØî" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" -msgstr "Âûáåðèòå SoundFont" +msgstr "²ëÑÕàØâÕ SoundFont" #: gui/launcher.cpp:410 gui/launcher.cpp:548 msgid "Select directory with game data" -msgstr "Âûáåðèòå äèðåêòîðèþ ñ ôàéëàìè èãðû" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á äÐÙÛÐÜØ ØÓàë" #: gui/launcher.cpp:428 msgid "Select additional game directory" -msgstr "Âûáåðèòå äîïîëíèòåëüíóþ äèðåêòîðèþ èãðû" +msgstr "²ëÑÕàØâÕ ÔÞßÞÛÝØâÕÛìÝãî ÔØàÕÚâÞàØî ØÓàë" #: gui/launcher.cpp:440 msgid "Select directory for saved games" -msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" #: gui/launcher.cpp:459 msgid "This game ID is already taken. Please choose another one." -msgstr "Ýòîò ID èãðû óæå èñïîëüçóåòñÿ. Ïîæàëóéñòà, âûáåðèòå äðóãîé." +msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ." #: gui/launcher.cpp:500 engines/dialogs.cpp:113 msgid "~Q~uit" -msgstr "~Â~ûõîä" +msgstr "~²~ëåÞÔ" #: gui/launcher.cpp:500 msgid "Quit ScummVM" -msgstr "Âûõîä èç ScummVM" +msgstr "²ëåÞÔ Ø× ScummVM" #: gui/launcher.cpp:501 msgid "A~b~out..." -msgstr "Î ï~ð~îãðàììå..." +msgstr "¾ ß~à~ÞÓàÐÜÜÕ..." #: gui/launcher.cpp:501 msgid "About ScummVM" -msgstr "Î ïðîãðàììå ScummVM" +msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM" #: gui/launcher.cpp:502 msgid "~O~ptions..." -msgstr "~Î~ïöèè..." +msgstr "~¾~ßæØØ..." #: gui/launcher.cpp:502 msgid "Change global ScummVM options" -msgstr "Èçìåíèòü ãëîáàëüíûå îïöèè ScummVM" +msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÞßæØØ ScummVM" #: gui/launcher.cpp:504 msgid "~S~tart" -msgstr "Ï~ó~ñê" +msgstr "¿~ã~áÚ" #: gui/launcher.cpp:504 msgid "Start selected game" -msgstr "Çàïóñòèòü âûáðàííóþ èãðó" +msgstr "·ÐßãáâØâì ÒëÑàÐÝÝãî ØÓàã" #: gui/launcher.cpp:507 msgid "~L~oad..." -msgstr "~Ç~àãð...." +msgstr "~·~ÐÓà...." #: gui/launcher.cpp:507 msgid "Load savegame for selected game" -msgstr "Çàãðóçèòü ñîõðíåíèå äëÿ âûáðàííîé èãðû" +msgstr "·ÐÓàãרâì áÞåàÝÕÝØÕ ÔÛï ÒëÑàÐÝÝÞÙ ØÓàë" #: gui/launcher.cpp:511 msgid "~A~dd Game..." -msgstr "~Ä~îá. èãðó..." +msgstr "~´~ÞÑ. ØÓàã..." #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" -msgstr "Óäåðæèâàéòå êëàâèøó Shift äëÿ òîãî, ÷òîáû äîáàâèòü íåñêîëüêî èãð" +msgstr "ÃÔÕàÖØÒÐÙâÕ ÚÛÐÒØèã Shift ÔÛï âÞÓÞ, çâÞÑë ÔÞÑÐÒØâì ÝÕáÚÞÛìÚÞ ØÓà" #: gui/launcher.cpp:513 msgid "~E~dit Game..." -msgstr "Èç~ì~. èãðó..." +msgstr "¸×~Ü~. ØÓàã..." #: gui/launcher.cpp:513 msgid "Change game options" -msgstr "Èçìåíèòü îïöèè èãðû" +msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë" #: gui/launcher.cpp:515 msgid "~R~emove Game" -msgstr "~Ó~äàëèòü èãðó" +msgstr "~Ã~ÔÐÛØâì ØÓàã" #: gui/launcher.cpp:515 msgid "Remove game from the list. The game data files stay intact" -msgstr "Óäàëèòü èãðó èç ñïèñêà. Íå óäàëÿåò èãðó ñ æåñòêîãî äèñêà" +msgstr "ÃÔÐÛØâì ØÓàã Ø× áߨáÚÐ. ½Õ ãÔÐÛïÕâ ØÓàã á ÖÕáâÚÞÓÞ ÔØáÚÐ" #: gui/launcher.cpp:522 msgid "Search in game list" -msgstr "Ïîèñê â ñïèñêå èãð" +msgstr "¿ÞØáÚ Ò áߨáÚÕ ØÓà" #: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" -msgstr "Ïîèñê:" +msgstr "¿ÞØáÚ:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" -msgstr "Î÷èñòèòü çíà÷åíèå" +msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ" #: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" -msgstr "Çàãðóçèòü èãðó:" +msgstr "·ÐÓàãרâì ØÓàã:" #: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" -msgstr "Çàãðóçèòü" +msgstr "·ÐÓàãרâì" #: gui/launcher.cpp:660 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." msgstr "" -"Âû äåéñòâèòåëüíî õîòèòå çàïóñòèòü äåòåêòîð âñåõ èãð? Ýòî ïîòåíöèàëüíî ìîæåò " -"äîáàâèòü áîëüøîå êîëè÷åñòâî èãð." +"²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ×ÐßãáâØâì ÔÕâÕÚâÞà ÒáÕå ØÓà? ÍâÞ ßÞâÕÝæØÐÛìÝÞ ÜÞÖÕâ " +"ÔÞÑÐÒØâì ÑÞÛìèÞÕ ÚÞÛØçÕáâÒÞ ØÓà." #: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 @@ -351,7 +349,7 @@ msgstr "" #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Yes" -msgstr "Äà" +msgstr "´Ð" #: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 @@ -359,521 +357,521 @@ msgstr " #: backends/platform/wince/CEActionsSmartphone.cpp:272 #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "No" -msgstr "Íåò" +msgstr "½Õâ" #: gui/launcher.cpp:708 msgid "ScummVM couldn't open the specified directory!" -msgstr "ScummVM íå ìîæåò îòêðûòü óêàçàííóþ äèðåêòîðèþ!" +msgstr "ScummVM ÝÕ ÜÞÖÕâ ÞâÚàëâì ãÚÐ×ÐÝÝãî ÔØàÕÚâÞàØî!" #: gui/launcher.cpp:720 msgid "ScummVM could not find any game in the specified directory!" -msgstr "ScummVM íå ìîæåò íàéòè èãðó â óêàçàííîé äèðåêòîðèè!" +msgstr "ScummVM ÝÕ ÜÞÖÕâ ÝÐÙâØ ØÓàã Ò ãÚÐ×ÐÝÝÞÙ ÔØàÕÚâÞàØØ!" #: gui/launcher.cpp:734 msgid "Pick the game:" -msgstr "Âûáåðèòå èãðó:" +msgstr "²ëÑÕàØâÕ ØÓàã:" #: gui/launcher.cpp:810 msgid "Do you really want to remove this game configuration?" -msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü óñòàíîâêè äëÿ ýòîé èãðû?" +msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ãáâÐÝÞÒÚØ ÔÛï íâÞÙ ØÓàë?" #: gui/launcher.cpp:873 msgid "This game does not support loading games from the launcher." -msgstr "Ýòà èãðà íå ïîääåðæèâàåò çàãðóçêó ñîõðàíåíèé ÷åðåç ãëàâíîå ìåíþ." +msgstr "ÍâÐ ØÓàÐ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ×ÐÓàã×Úã áÞåàÐÝÕÝØÙ çÕàÕ× ÓÛÐÒÝÞÕ ÜÕÝî." #: gui/launcher.cpp:877 msgid "ScummVM could not find any engine capable of running the selected game!" -msgstr "ScummVM íå ñìîã íàéòè äâèæîê äëÿ çàïóñêà âûáðàííîé èãðû!" +msgstr "ScummVM ÝÕ áÜÞÓ ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë!" #: gui/launcher.cpp:989 msgid "Mass Add..." -msgstr "Äîá. ìíîãî..." +msgstr "´ÞÑ. ÜÝÞÓÞ..." #: gui/launcher.cpp:990 msgid "Add Game..." -msgstr "Íîâ. èãðà..." +msgstr "½ÞÒ. ØÓàÐ..." #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." -msgstr "... èùó ..." +msgstr "... Øéã ..." #: gui/massadd.cpp:244 msgid "Scan complete!" -msgstr "Ïîèñê çàêîí÷åí!" +msgstr "¿ÞØáÚ ×ÐÚÞÝçÕÝ!" #: gui/massadd.cpp:247 #, c-format msgid "Discovered %d new games." -msgstr "Íàéäåíî %d íîâûõ èãð." +msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà." #: gui/massadd.cpp:251 #, c-format msgid "Scanned %d directories ..." -msgstr "Ïðîñìîòðåíî %d äèðåêòîðèé ..." +msgstr "¿àÞáÜÞâàÕÝÞ %d ÔØàÕÚâÞàØÙ ..." #: gui/massadd.cpp:254 #, c-format msgid "Discovered %d new games ..." -msgstr "Íàéäåíî %d íîâûõ èãð ..." +msgstr "½ÐÙÔÕÝÞ %d ÝÞÒëå ØÓà ..." #: gui/options.cpp:78 msgid "Never" -msgstr "Íèêîãäà" +msgstr "½ØÚÞÓÔÐ" #: gui/options.cpp:78 msgid "every 5 mins" -msgstr "êàæäûå 5 ìèíóò" +msgstr "ÚÐÖÔëÕ 5 ÜØÝãâ" #: gui/options.cpp:78 msgid "every 10 mins" -msgstr "êàæäûå 10 ìèíóò" +msgstr "ÚÐÖÔëÕ 10 ÜØÝãâ" #: gui/options.cpp:78 msgid "every 15 mins" -msgstr "êàæäûå 15 ìèíóò" +msgstr "ÚÐÖÔëÕ 15 ÜØÝãâ" #: gui/options.cpp:78 msgid "every 30 mins" -msgstr "êàæäûå 30 ìèíóò" +msgstr "ÚÐÖÔëÕ 30 ÜØÝãâ" #: gui/options.cpp:80 msgid "8 kHz" -msgstr "8 êÃö" +msgstr "8 Ú³æ" #: gui/options.cpp:80 msgid "11kHz" -msgstr "11 êÃö" +msgstr "11 Ú³æ" #: gui/options.cpp:80 msgid "22 kHz" -msgstr "22 êÃö" +msgstr "22 Ú³æ" #: gui/options.cpp:80 msgid "44 kHz" -msgstr "44 êÃö" +msgstr "44 Ú³æ" #: gui/options.cpp:80 msgid "48 kHz" -msgstr "48 êÃö" +msgstr "48 Ú³æ" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" -msgstr "Ãðàôè÷åñêèé ðåæèì:" +msgstr "³àÐäØçÕáÚØÙ àÕÖØÜ:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" -msgstr "Ðåæèì ðàñòðèðîâàíèÿ:" +msgstr "ÀÕÖØÜ àÐáâàØàÞÒÐÝØï:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" -msgstr "Ñïåöèàëüíûå ðåæèìû ðåíäåðèíãà, ïîääåðæèâàåìûå íåêîòîðûìè èãðàìè" +msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" -msgstr "Ïîëíîýêðàííûé ðåæèì" +msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" -msgstr "Êîððåêöèÿ ñîîòíîøåíèÿ ñòîðîí" +msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" -msgstr "Êîððåêòèðîâàòü ñîîòíîøåíèå ñòîðîí äëÿ èãð ñ ðàçðåøåíèåì 320x200" +msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" -msgstr "" +msgstr "¿àÕÔßÞçØâÐÕÜÞÕ ãáâàÞÙáâÒÞ:" -#: gui/options.cpp:651 -#, fuzzy +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" -msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" +msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" -msgstr "Óêàçûâàåò âûõîäíîå çâóêîâîå óñòðîéñòâî èëè ýìóëÿòîð çâóêîâîé êàðòû" +msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" -msgstr "" +msgstr "ÃáâàÞÙáâÒÞ MT32:" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" +"ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" +"CM32l/CM64" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" -msgstr "" +msgstr "ÃáâàÞÙâáÒÞ GM:" -#: gui/options.cpp:656 -#, fuzzy +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" -msgstr "Óêàçûâàåò âûõîäíîå óñòðîéñòâî äëÿ çâóêà èëè ýìóëÿòîð çâóêîâîé êàðòû" +msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" -msgstr "Ýìóëÿòîð AdLib:" +msgstr "ÍÜãÛïâÞà AdLib:" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" -msgstr "Çâóêîâàÿ êàðòà AdLib èñïîëüçóåòñÿ ìíîãèìè èãðàìè" +msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" -msgstr "Âûõîäíàÿ ÷àñòîòà:" +msgstr "²ëåÞÔÝÐï çÐáâÞâÐ:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -"ÁÎëüøèå çíà÷åíèÿ çàäàþò ëó÷øåå êà÷åñòâî çâóêà, îäíàêî îíè ìîãóò íå " -"ïîääåðæèâàòüñÿ âàøåé çâóêîâîé êàðòîé" +"±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ " +"ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -"SoundFontû ïîääåðäæèâàþòñÿ íåêîòîðûìè çâóêîâûìè êàðòàìè, Fluidsynth è " +"SoundFontë ßÞÔÔÕàÔÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø " "Timidity" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" -msgstr "Ñìåøàííûé ðåæèì AdLib/MIDI" +msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" -msgstr "Èñïîëüçîâàòü è MIDI è AdLib äëÿ ãåíåðàöèè çâóêà" +msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" -msgstr "Íàñòîÿùèé Roland MT-32 (çàïðåòèòü ýìóëÿöèþ GM)" +msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -"Îòìåòüòå åñëè ó âàñ ïîäêëþ÷åíî Roland-ñîâìåñòèìîå çâóêîâîå óñòðîéñòâî è âû " -"õîòèòå åãî èñïîëüçîâàòü" +"¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë " +"åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" -msgstr "Âêëþ÷èòü ðåæèì Roland GS" +msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -"Âûêëþ÷àåò ìàïïèíã General MIDI äëÿ èãð ñ çâóêîâîé äîðîæêîé äëÿ Roland MT-32" +"²ëÚÛîçÐÕâ ÜÐßߨÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" -msgstr "Óñèëåíèå MIDI:" +msgstr "ÃáØÛÕÝØÕ MIDI:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" -msgstr "Òåêñò è îçâó÷êà:" +msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" -msgstr "Îçâó÷êà" +msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" -msgstr "Ñóáòèòðû" +msgstr "ÁãÑâØâàë" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" -msgstr "Âñ¸" +msgstr "²áñ" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" -msgstr "Îçâ" +msgstr "¾×Ò" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" -msgstr "Ñóá" +msgstr "ÁãÑ" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" -msgstr "Ïîêàçûâàòü ñóáòèòðû è âîñïðîèçâîäèòü ðå÷ü" +msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" -msgstr "Ñêîðîñòü ñóáòèòðîâ:" +msgstr "ÁÚÞàÞáâì áãÑâØâàÞÒ:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" -msgstr "Ãðîìêîñòü ìóçûêè:" +msgstr "³àÞÜÚÞáâì Üã×ëÚØ:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" -msgstr "Âûêëþ÷èòü âñ¸" +msgstr "²ëÚÛîçØâì Òáñ" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" -msgstr "Ãðîìêîñòü ýôôåêòîâ:" +msgstr "³àÞÜÚÞáâì íääÕÚâÞÒ:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" -msgstr "Ãðîìêîñòü ñïåöèàëüíûõ çâóêîâûõ ýôôåêòîâ" +msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" -msgstr "Ãðîìêîñòü îçâó÷êè:" +msgstr "³àÞÜÚÞáâì Þ×ÒãçÚØ:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " -msgstr "Ïóòü äëÿ ñîõðàíåíèé: " +msgstr "¿ãâì ÔÛï áÞåàÐÝÕÝØÙ: " -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" -msgstr "Ïóòü ê òåìàì:" +msgstr "¿ãâì Ú âÕÜÐÜ:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -"Óêàçûâàåò ïóòü ê äîïîëíèòåëüíûì ôàéëàì äàííûõ, èñïîëüçóåìûõ âñåìè èãðàìè, " -"ëèáî ScummVM" +"ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, " +"ÛØÑÞ ScummVM" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" -msgstr "Ïóòü ê ïëàãèíàì:" +msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" -msgstr "Ðàçíîå" +msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" -msgstr "Òåìà:" +msgstr "ÂÕÜÐ:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" -msgstr "Ðàñòåðèçàòîð GUI:" +msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" -msgstr "Àâòîñîõðàíåíèå:" +msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" -msgstr "Êëàâèøè" +msgstr "ºÛÐÒØèØ" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" -msgstr "ßçûê èíòåðôåéñà:" +msgstr "Ï×ëÚ ØÝâÕàäÕÙáÐ:" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" -msgstr "ßçûê ãðàôè÷åñêîãî èíòåðôåéñà ScummVM" +msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "English" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." -msgstr "Âû äîëæíû ïåðåçàïóñòèòü ScummVM ÷òîáû ïðèìåíèòü èçìåíåíèÿ." +msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï." -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" -msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ ñîõðàíåíèé" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." -msgstr "Íå ìîãó ïèñàòü â âûáðàííóþ äèðåêòîðèþ. Ïîæàëóéñòà, óêàæèòå äðóãóþ." +msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî." -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" -msgstr "Âûáåðèòå äèðåêòîðèþ äëÿ òåì GUI" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" -msgstr "Âûáåðèòå äèðåêòîðèþ ñ äîïîëíèòåëüíûìè ôàéëàìè" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" -msgstr "Âûáåðèòå äèðåêòîðèþ ñ ïëàãèíàìè" +msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ" #: gui/saveload.cpp:60 gui/saveload.cpp:241 msgid "No date saved" -msgstr "Äàòà íå çàïèñàíà" +msgstr "´ÐâÐ ÝÕ ×ÐߨáÐÝÐ" #: gui/saveload.cpp:61 gui/saveload.cpp:242 msgid "No time saved" -msgstr "Âðåìÿ íå çàïèñàíî" +msgstr "²àÕÜï ÝÕ ×ÐߨáÐÝÞ" #: gui/saveload.cpp:62 gui/saveload.cpp:243 msgid "No playtime saved" -msgstr "Âðåìÿ èãðû íå çàïèñàíî" +msgstr "²àÕÜï ØÓàë ÝÕ ×ÐߨáÐÝÞ" #: gui/saveload.cpp:69 gui/saveload.cpp:157 msgid "Delete" -msgstr "Óäàëèòü" +msgstr "ÃÔÐÛØâì" #: gui/saveload.cpp:156 msgid "Do you really want to delete this savegame?" -msgstr "Âû äåéñòâèòåëüíî õîòèòå óäàëèòü ýòî ñîõðàíåíèå?" +msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì íâÞ áÞåàÐÝÕÝØÕ?" #: gui/saveload.cpp:265 msgid "Date: " -msgstr "Äàòà: " +msgstr "´ÐâÐ: " #: gui/saveload.cpp:268 msgid "Time: " -msgstr "Âðåìÿ: " +msgstr "²àÕÜï: " #: gui/saveload.cpp:273 msgid "Playtime: " -msgstr "Âðåìÿ èãðû: " +msgstr "²àÕÜï ØÓàë: " #: gui/saveload.cpp:286 gui/saveload.cpp:353 msgid "Untitled savestate" -msgstr "Ñîõðàíåíèå áåç èìåíè" +msgstr "ÁÞåàÐÝÕÝØÕ ÑÕ× ØÜÕÝØ" #: gui/themebrowser.cpp:46 msgid "Select a Theme" -msgstr "Âûáåðèòå òåìó" +msgstr "²ëÑÕàØâÕ âÕÜã" #: gui/ThemeEngine.cpp:337 msgid "Disabled GFX" -msgstr "Áåç ãðàôèêè" +msgstr "±Õ× ÓàÐäØÚØ" #: gui/ThemeEngine.cpp:338 msgid "Standard Renderer (16bpp)" -msgstr "Ñòàíäàðòíûé ðàñòåðèçàòîð (16bpp)" +msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)" #: gui/ThemeEngine.cpp:340 msgid "Antialiased Renderer (16bpp)" -msgstr "Ðàñòåðèçàòîð ñî ñãëàæèâàíèåì (16bpp)" +msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)" #: base/main.cpp:205 #, c-format msgid "Engine does not support debug level '%s'" -msgstr "Äâèæîê íå ïîääåðæèâàåò óðîâåíü îòëàäêè '%s'" +msgstr "´ÒØÖÞÚ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ãàÞÒÕÝì ÞâÛÐÔÚØ '%s'" #: base/main.cpp:273 msgid "Menu" -msgstr "Ìåíþ" +msgstr "¼ÕÝî" #: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" -msgstr "Ïðîïóñòèòü" +msgstr "¿àÞßãáâØâì" #: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" -msgstr "Ïàóçà" +msgstr "¿Ðã×Ð" #: base/main.cpp:282 msgid "Skip line" -msgstr "Ïðîïóñòèòü ñòðîêó" +msgstr "¿àÞßãáâØâì áâàÞÚã" #: base/main.cpp:404 msgid "Error running game:" -msgstr "Îøèáêà çàïóñêà èãðû:" +msgstr "¾èØÑÚÐ ×ÐßãáÚÐ ØÓàë:" #: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" -msgstr "Íå ìîãó íàéòè äâèæîê äëÿ çàïóñêà âûáðàííîé èãðû" +msgstr "½Õ ÜÞÓã ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë" #: common/error.cpp:43 msgid "Invalid Path" -msgstr "Íåâåðíûé ïóòü" +msgstr "½ÕÒÕàÝëÙ ßãâì" #: common/error.cpp:44 msgid "Game Data not found" -msgstr "Íåò ôàéëîâ èãðû" +msgstr "½Õâ äÐÙÛÞÒ ØÓàë" #: common/error.cpp:45 msgid "Game Id not supported" -msgstr "Game Id íå ïîääåðæèâàåòñÿ" +msgstr "Game Id ÝÕ ßÞÔÔÕàÖØÒÐÕâáï" #: common/error.cpp:46 msgid "Unsupported Color Mode" -msgstr "Íåïîääåðæèâàåìûé ðåæèì öâåòà" +msgstr "½ÕßÞÔÔÕàÖØÒÐÕÜëÙ àÕÖØÜ æÒÕâÐ" #: common/error.cpp:48 msgid "Read permission denied" -msgstr "Íåäîñòàòî÷íî ïðàâ äëÿ ÷òåíèÿ" +msgstr "½ÕÔÞáâÐâÞçÝÞ ßàÐÒ ÔÛï çâÕÝØï" #: common/error.cpp:49 msgid "Write permission denied" -msgstr "Íåäîñòàòî÷íî ïðàâ äëÿ çàïèñè" +msgstr "½ÕÔÞáâÐâÞçÝÞ ßàÐÒ ÔÛï ×ÐߨáØ" #: common/error.cpp:52 msgid "Path not exists" -msgstr "Ïóòü íå íàéäåí" +msgstr "¿ãâì ÝÕ ÝÐÙÔÕÝ" #: common/error.cpp:53 msgid "Path not a directory" -msgstr "Ïóòü íå ÿâëÿåòñÿ äèðåêòîðèåé" +msgstr "¿ãâì ÝÕ ïÒÛïÕâáï ÔØàÕÚâÞàØÕÙ" #: common/error.cpp:54 msgid "Path not a file" -msgstr "Ïóòü íå ÿâëÿåòñÿ ôàéëîì" +msgstr "¿ãâì ÝÕ ïÒÛïÕâáï äÐÙÛÞÜ" #: common/error.cpp:56 msgid "Cannot create file" -msgstr "Íå ìîãó ñîçäàòü ôàéë" +msgstr "½Õ ÜÞÓã áÞ×ÔÐâì äÐÙÛ" #: common/error.cpp:57 msgid "Reading failed" -msgstr "Îøèáêà ÷òåíèÿ" +msgstr "¾èØÑÚÐ çâÕÝØï" #: common/error.cpp:58 msgid "Writing data failed" -msgstr "Îøèáêà çàïèñè äàííûõ" +msgstr "¾èØÑÚÐ ×ÐßØáØ ÔÐÝÝëå" #: common/error.cpp:60 common/error.cpp:71 msgid "Unknown Error" -msgstr "Íåèçâåñòíàÿ îøèáêà" +msgstr "½ÕØ×ÒÕáâÝÐï ÞèØÑÚÐ" #: common/util.cpp:254 msgid "Hercules Green" -msgstr "" +msgstr "Hercules ·ÕÛÕÝëÙ" #: common/util.cpp:255 msgid "Hercules Amber" -msgstr "" +msgstr "Hercules ÏÝâÐàÝëÙ" #: engines/dialogs.cpp:89 msgid "~R~esume" -msgstr "Ïðîäîë~æ~èòü" +msgstr "¿àÞÔÞÛ~Ö~Øâì" #: engines/dialogs.cpp:91 msgid "~L~oad" -msgstr "~Ç~àãðóçèòü" +msgstr "~·~ÐÓàãרâì" #: engines/dialogs.cpp:95 msgid "~S~ave" -msgstr "~Ç~àïèñàòü" +msgstr "~·~ÐߨáÐâì" #: engines/dialogs.cpp:99 msgid "~O~ptions" -msgstr "~Î~ïöèè" +msgstr "~¾~ßæØØ" #: engines/dialogs.cpp:104 msgid "~H~elp" -msgstr "~Ï~îìîùü" +msgstr "~¿~ÞÜÞéì" #: engines/dialogs.cpp:107 msgid "~A~bout" -msgstr "Î ïðî~ã~ðàììå" +msgstr "¾ ßàÞ~Ó~àÐÜÜÕ" #: engines/dialogs.cpp:109 msgid "~R~eturn to Launcher" -msgstr "~Â~åðíóòüñÿ â ãëàâíîå ìåíþ" +msgstr "~²~ÕàÝãâìáï Ò ÓÛÐÒÝÞÕ ÜÕÝî" #: engines/dialogs.cpp:119 msgid "Save game:" -msgstr "Ñîõðàíèòü èãðó: " +msgstr "ÁÞåàÐÝØâì ØÓàã: " #: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 #: backends/platform/wince/CEActionsPocket.cpp:42 @@ -881,7 +879,7 @@ msgstr " #: backends/platform/wince/CEActionsSmartphone.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Save" -msgstr "Çàïèñàòü" +msgstr "·ÐߨáÐâì" #: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 @@ -891,297 +889,290 @@ msgstr "~O~K" #: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 #: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" -msgstr "Î~ò~ìåíà" +msgstr "¾~â~ÜÕÝÐ" #: engines/dialogs.cpp:305 msgid "~K~eys" -msgstr "~Ê~ëàâèøè" +msgstr "~º~ÛÐÒØèØ" #: engines/scumm/dialogs.cpp:287 msgid "~P~revious" -msgstr "~Ï~ðåä" +msgstr "~¿~àÕÔ" #: engines/scumm/dialogs.cpp:288 msgid "~N~ext" -msgstr "~Ñ~ëåä" +msgstr "~Á~ÛÕÔ" #: engines/scumm/dialogs.cpp:289 #: backends/platform/ds/arm9/source/dsoptions.cpp:56 msgid "~C~lose" -msgstr "~Ç~àêðûòü" +msgstr "~·~ÐÚàëâì" #: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" -msgstr "Ðåæèì áûñòðîãî ïåðåõîäà àêòèâèðîâàí" +msgstr "ÀÕÖØÜ ÑëáâàÞÓÞ ßÕàÕåÞÔÐ ÐÚâØÒØàÞÒÐÝ" #: engines/mohawk/dialogs.cpp:82 msgid "~T~ransitions Enabled" -msgstr "Ïåðåõîäû àêòèâèðîâàíû" +msgstr "¿ÕàÕåÞÔë ÐÚâØÒØàÞÒÐÝë" #: engines/mohawk/dialogs.cpp:116 msgid "~W~ater Effect Enabled" -msgstr "Ýôôåêòû âîäû âêëþ÷åíû" +msgstr "ÍääÕÚâë ÒÞÔë ÒÚÛîçÕÝë" #: sound/fmopl.cpp:51 -#, fuzzy msgid "MAME OPL emulator" -msgstr "Ýìóëÿòîð AdLib:" +msgstr "ÍÜãÛïâÞà MAME OPL:" #: sound/fmopl.cpp:53 msgid "DOSBox OPL emulator" -msgstr "" +msgstr "ÍÜãÛïâÞà DOSBox OPL" #: sound/null.h:45 msgid "No music" -msgstr "Áåç ìóçûêè" +msgstr "±Õ× Üã×ëÚØ" #: sound/softsynth/adlib.cpp:1590 -#, fuzzy msgid "AdLib Emulator" -msgstr "Ýìóëÿòîð AdLib:" +msgstr "ÍÜãÛïâÞà AdLib" #: sound/softsynth/mt32.cpp:327 -#, fuzzy msgid "Initialising MT-32 Emulator" -msgstr "Íàñòðàèâàþ ñåòü" +msgstr "½ÐáâàÐØÒÐî íÜãÛïâÞà MT-32" #: sound/softsynth/mt32.cpp:541 -#, fuzzy msgid "MT-32 Emulator" -msgstr "Ýìóëÿöèÿ MT-32" +msgstr "ÍÜãÛïâÞà MT-32" #: sound/softsynth/pcspk.cpp:142 -#, fuzzy msgid "PC Speaker Emulator" -msgstr "PC ñïèêåð" +msgstr "ÍÜãÛïâÞà PC áߨÚÕàÐ" #: sound/softsynth/pcspk.cpp:161 -#, fuzzy msgid "IBM PCjr Emulator" -msgstr "FM Towns" +msgstr "ÍÜãÛïâÞà IBM PCjr" #: sound/softsynth/ym2612.cpp:762 -#, fuzzy msgid "FM Towns Emulator" -msgstr "FM Towns" +msgstr "ÍÜãÛïâÞà FM Towns" #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" -msgstr "Òàáëèöà êëàâèø:" +msgstr "ÂÐÑÛØæÐ ÚÛÐÒØè:" #: backends/keymapper/remap-dialog.cpp:66 msgid " (Active)" -msgstr " (Àêòèâíàÿ)" +msgstr " (°ÚâØÒÝÐï)" #: backends/keymapper/remap-dialog.cpp:100 msgid " (Global)" -msgstr " (Ãëîáàëüíàÿ)" +msgstr " (³ÛÞÑÐÛìÝÐï)" #: backends/keymapper/remap-dialog.cpp:110 msgid " (Game)" -msgstr " (Èãðû)" +msgstr " (¸Óàë)" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "Windows MIDI" #: backends/platform/ds/arm9/source/dsoptions.cpp:57 msgid "ScummVM Main Menu" -msgstr "Ãëàâíîå ìåíþ ScummVM" +msgstr "³ÛÐÒÝÞÕ ÜÕÝî ScummVM" #: backends/platform/ds/arm9/source/dsoptions.cpp:63 msgid "~L~eft handed mode" -msgstr "Ëåâîðóêèé ðåæèì" +msgstr "»ÕÒÞàãÚØÙ àÕÖØÜ" #: backends/platform/ds/arm9/source/dsoptions.cpp:64 msgid "~I~ndy fight controls" -msgstr "Óïðàâëåíèå áîÿìè â Indy" +msgstr "ÃßàÐÒÛÕÝØÕ ÑÞïÜØ Ò Indy" #: backends/platform/ds/arm9/source/dsoptions.cpp:65 msgid "Show mouse cursor" -msgstr "Ïîêàçûâàòü êóðñîð ìûøè" +msgstr "¿ÞÚÐ×ëÒÐâì ÚãàáÞà ÜëèØ" #: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "Snap to edges" -msgstr "Ïðèêðåïèòü ê ãðàíèöàì" +msgstr "¿àØÚàÕߨâì Ú ÓàÐÝØæÐÜ" #: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Touch X Offset" -msgstr "Ñìåùåíèå êàñàíèé ïî îñè X" +msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ X" #: backends/platform/ds/arm9/source/dsoptions.cpp:75 msgid "Touch Y Offset" -msgstr "Ñìåùåíèå êàñàíèé ïî îñè Y" +msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ Y" #: backends/platform/ds/arm9/source/dsoptions.cpp:87 msgid "Use laptop trackpad-style cursor control" -msgstr "Èñïîëüçîâàòü óïðàâëåíèå êóðñîðîì êàê íà òðåêïàäå ëåïòîïîâ" +msgstr "¸áßÞÛì×ÞÒÐâì ãßàÐÒÛÕÝØÕ ÚãàáÞàÞÜ ÚÐÚ ÝÐ âàÕÚßÐÔÕ ÛÕßâÞßÞÒ" #: backends/platform/ds/arm9/source/dsoptions.cpp:88 msgid "Tap for left click, double tap right click" -msgstr "Òàï äëÿ ëåâîãî ùåë÷êà, äâîéíîé òàï äëÿ ïðàâîãî ùåë÷êà" +msgstr "ÂÐß ÔÛï ÛÕÒÞÓÞ éÕÛçÚÐ, ÔÒÞÙÝÞÙ âÐß ÔÛï ßàÐÒÞÓÞ éÕÛçÚÐ" #: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Sensitivity" -msgstr "×óâñòâèòåëüíîñòü" +msgstr "ÇãÒáâÒØâÕÛìÝÞáâì" #: backends/platform/ds/arm9/source/dsoptions.cpp:99 msgid "Initial top screen scale:" -msgstr "Íà÷àëüíûé ìàñøòàá âåðõíåãî ýêðàíà:" +msgstr "½ÐçÐÛìÝëÙ ÜÐáèâÐÑ ÒÕàåÝÕÓÞ íÚàÐÝÐ:" #: backends/platform/ds/arm9/source/dsoptions.cpp:105 msgid "Main screen scaling:" -msgstr "Ìàñøòàá ãëàâíîãî ýêðàíà:" +msgstr "¼ÐáèâÐÑ ÓÛÐÒÝÞÓÞ íÚàÐÝÐ:" #: backends/platform/ds/arm9/source/dsoptions.cpp:107 msgid "Hardware scale (fast, but low quality)" -msgstr "Õàðäâàðíîå ìàñøòàáèðîâàíèå (áûñòðî, íî íèçêîãî êà÷åñòâà)" +msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (ÑëáâàÞ, ÝÞ ÝØ×ÚÞÓÞ ÚÐçÕáâÒÐ)" #: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Software scale (good quality, but slower)" -msgstr "Ïðîãðàììíîå ìàñøòàáèðîâàíèå (õîðîøåå êà÷åñòâî, íî ìåäëåííåå)" +msgstr "¿àÞÓàÐÜÜÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (åÞàÞèÕÕ ÚÐçÕáâÒÞ, ÝÞ ÜÕÔÛÕÝÝÕÕ)" #: backends/platform/ds/arm9/source/dsoptions.cpp:109 msgid "Unscaled (you must scroll left and right)" -msgstr "Áåç ìàñøòàáèðîâàíèÿ (íóæíî áóäåò ïðîêðó÷èâàòü âëåâî è âïðàâî)" +msgstr "±Õ× ÜÐáèâÐÑØàÞÒÐÝØï (ÝãÖÝÞ ÑãÔÕâ ßàÞÚàãçØÒÐâì ÒÛÕÒÞ Ø ÒßàÐÒÞ)" #: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Brightness:" -msgstr "ßðêîñòü:" +msgstr "ÏàÚÞáâì:" #: backends/platform/ds/arm9/source/dsoptions.cpp:121 msgid "High quality audio (slower) (reboot)" -msgstr "Âûñîêîå êà÷åñòâî çâóêà (ìåäëåííåå) (ðåáóò)" +msgstr "²ëáÞÚÞÕ ÚÐçÕáâÒÞ ×ÒãÚÐ (ÜÕÔÛÕÝÝÕÕ) (àÕÑãâ)" #: backends/platform/ds/arm9/source/dsoptions.cpp:122 msgid "Disable power off" -msgstr "Çàïðåòèòü âûêëþ÷åíèå" +msgstr "·ÐßàÕâØâì ÒëÚÛîçÕÝØÕ" #: backends/platform/iphone/osys_events.cpp:339 msgid "Touchpad mode enabled." -msgstr "Ðåæèì òà÷ïàäà âêëþ÷åí." +msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒÚÛîçÕÝ." #: backends/platform/iphone/osys_events.cpp:341 msgid "Touchpad mode disabled." -msgstr "Ðåæèì òà÷ïàäà âûêëþ÷åí." +msgstr "ÀÕÖØÜ âÐçßÐÔÐ ÒëÚÛîçÕÝ." #: backends/platform/sdl/graphics.cpp:40 #: backends/platform/wince/wince-sdl.cpp:111 #: backends/platform/wince/wince-sdl.cpp:118 msgid "Normal (no scaling)" -msgstr "" +msgstr "±Õ× ãÒÕÛØçÕÝØï" #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 msgid "Up" -msgstr "Ââåðõ" +msgstr "²ÒÕàå" #: backends/platform/symbian/src/SymbianActions.cpp:42 #: backends/platform/wince/CEActionsSmartphone.cpp:39 msgid "Down" -msgstr "Âíèç" +msgstr "²ÝØ×" #: backends/platform/symbian/src/SymbianActions.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:40 msgid "Left" -msgstr "Âëåâî" +msgstr "²ÛÕÒÞ" #: backends/platform/symbian/src/SymbianActions.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:41 msgid "Right" -msgstr "Âïðàâî" +msgstr "²ßàÐÒÞ" #: backends/platform/symbian/src/SymbianActions.cpp:45 #: backends/platform/wince/CEActionsPocket.cpp:59 #: backends/platform/wince/CEActionsSmartphone.cpp:42 msgid "Left Click" -msgstr "Ëåâûé ùåë÷îê" +msgstr "»ÕÒëÙ éÕÛçÞÚ" #: backends/platform/symbian/src/SymbianActions.cpp:46 #: backends/platform/wince/CEActionsSmartphone.cpp:43 msgid "Right Click" -msgstr "Ïðàâûé ùåë÷îê" +msgstr "¿àÐÒëÙ éÕÛçÞÚ" #: backends/platform/symbian/src/SymbianActions.cpp:49 #: backends/platform/wince/CEActionsSmartphone.cpp:46 msgid "Zone" -msgstr "Çîíà" +msgstr "·ÞÝÐ" #: backends/platform/symbian/src/SymbianActions.cpp:50 #: backends/platform/wince/CEActionsPocket.cpp:53 #: backends/platform/wince/CEActionsSmartphone.cpp:47 msgid "Multi Function" -msgstr "Ìóëüòèôóíêöèÿ" +msgstr "¼ãÛìâØäãÝÚæØï" #: backends/platform/symbian/src/SymbianActions.cpp:51 msgid "Swap character" -msgstr "Ñìåíèòü ãåðîÿ" +msgstr "ÁÜÕÝØâì ÓÕàÞï" #: backends/platform/symbian/src/SymbianActions.cpp:52 msgid "Skip text" -msgstr "Ïðîïóñòèòü òåêñò" +msgstr "¿àÞßãáâØâì âÕÚáâ" #: backends/platform/symbian/src/SymbianActions.cpp:54 msgid "Fast mode" -msgstr "Áûñòðûé ðåæèì" +msgstr "±ëáâàëÙ àÕÖØÜ" #: backends/platform/symbian/src/SymbianActions.cpp:55 #: backends/platform/wince/CEActionsPocket.cpp:43 #: backends/platform/wince/CEActionsSmartphone.cpp:51 msgid "Quit" -msgstr "Âûõîä" +msgstr "²ëåÞÔ" #: backends/platform/symbian/src/SymbianActions.cpp:56 msgid "Debugger" -msgstr "Îòëàä÷èê" +msgstr "¾âÛÐÔçØÚ" #: backends/platform/symbian/src/SymbianActions.cpp:57 msgid "Global menu" -msgstr "Ãëîáàëüíîå ìåíþ" +msgstr "³ÛÞÑÐÛìÝÞÕ ÜÕÝî" #: backends/platform/symbian/src/SymbianActions.cpp:58 msgid "Virtual keyboard" -msgstr "Âèðòóàëüíàÿ êëàâèàòóðà" +msgstr "²ØàâãÐÛìÝÐï ÚÛÐÒØÐâãàÐ" #: backends/platform/symbian/src/SymbianActions.cpp:59 msgid "Key mapper" -msgstr "Íàçíà÷åíèå êëàâèø" +msgstr "½Ð×ÝÐçÕÝØÕ ÚÛÐÒØè" #: backends/platform/symbian/src/SymbianOS.cpp:446 msgid "Do you want to quit ?" -msgstr "Âû õîòèòå âûéòè?" +msgstr "²ë åÞâØâÕ ÒëÙâØ?" #: backends/platform/wii/options.cpp:51 msgid "Video" -msgstr "Âèäåî" +msgstr "²ØÔÕÞ" #: backends/platform/wii/options.cpp:54 msgid "Current video mode:" -msgstr "Òåêóùèé âèäåîðåæèì:" +msgstr "ÂÕÚãéØÙ ÒØÔÕÞàÕÖØÜ:" #: backends/platform/wii/options.cpp:56 msgid "Double-strike" -msgstr "Äâîéíîé óäàð" +msgstr "´ÒÞÙÝÞÙ ãÔÐà" #: backends/platform/wii/options.cpp:60 msgid "Horizontal underscan:" -msgstr "Ãîðèçîíòàëüíûé underscan:" +msgstr "³ÞàØ×ÞÝâÐÛìÝëÙ underscan:" #: backends/platform/wii/options.cpp:66 msgid "Vertical underscan:" -msgstr "Âåðòèêàëüíûé underscan:" +msgstr "²ÕàâØÚÐÛìÝëÙ underscan:" #: backends/platform/wii/options.cpp:71 msgid "Input" -msgstr "Ââîä" +msgstr "²ÒÞÔ" #: backends/platform/wii/options.cpp:74 msgid "GC Pad sensitivity:" -msgstr "×óâñòàèòåëüíîñòü GC ïàäà:" +msgstr "ÇãÒáâÐØâÕÛìÝÞáâì GC ßÐÔÐ:" #: backends/platform/wii/options.cpp:80 msgid "GC Pad acceleration:" -msgstr "Óñêîðåíèå GC ïàäà:" +msgstr "ÃáÚÞàÕÝØÕ GC ßÐÔÐ:" #: backends/platform/wii/options.cpp:86 msgid "DVD" @@ -1189,19 +1180,19 @@ msgstr "DVD" #: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 msgid "Status:" -msgstr "Ñîñòîÿíèå:" +msgstr "ÁÞáâÞïÝØÕ:" #: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 msgid "Unknown" -msgstr "Íåèçâåñòíî" +msgstr "½ÕØ×ÒÕáâÝÞ" #: backends/platform/wii/options.cpp:93 msgid "Mount DVD" -msgstr "Ïîäêëþ÷èòü DVD" +msgstr "¿ÞÔÚÛîçØâì DVD" #: backends/platform/wii/options.cpp:94 msgid "Unmount DVD" -msgstr "Îòêëþ÷èòü DVD" +msgstr "¾âÚÛîçØâì DVD" #: backends/platform/wii/options.cpp:98 msgid "SMB" @@ -1209,274 +1200,156 @@ msgstr "SMB" #: backends/platform/wii/options.cpp:106 msgid "Server:" -msgstr "Ñåðâåð:" +msgstr "ÁÕàÒÕà:" #: backends/platform/wii/options.cpp:110 msgid "Share:" -msgstr "Ñåòåâàÿ ïàïêà:" +msgstr "ÁÕâÕÒÐï ßÐßÚÐ:" #: backends/platform/wii/options.cpp:114 msgid "Username:" -msgstr "Ïîëüçîâàòåëü:" +msgstr "¿ÞÛì×ÞÒÐâÕÛì:" #: backends/platform/wii/options.cpp:118 msgid "Password:" -msgstr "Ïàðîëü:" +msgstr "¿ÐàÞÛì:" #: backends/platform/wii/options.cpp:121 msgid "Init network" -msgstr "Èíèöèàëèçàöèÿ ñåòè" +msgstr "¸ÝØæØÐÛØ×ÐæØï áÕâØ" #: backends/platform/wii/options.cpp:123 msgid "Mount SMB" -msgstr "Ïîäêëþ÷èòü SMB" +msgstr "¿ÞÔÚÛîçØâì SMB" #: backends/platform/wii/options.cpp:124 msgid "Unmount SMB" -msgstr "Îòêëþ÷òü SMB" +msgstr "¾âÚÛîçâì SMB" #: backends/platform/wii/options.cpp:145 msgid "DVD Mounted successfully" -msgstr "DVD ïîäêëþ÷åí óñïåøíî" +msgstr "DVD ßÞÔÚÛîçÕÝ ãáßÕèÝÞ" #: backends/platform/wii/options.cpp:148 msgid "Error while mounting the DVD" -msgstr "Îøèáêà âî âðåìÿ ïîäêëþ÷åíèÿ DVD" +msgstr "¾èØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï DVD" #: backends/platform/wii/options.cpp:150 msgid "DVD not mounted" -msgstr "DVD íå ïîäêëþ÷åí" +msgstr "DVD ÝÕ ßÞÔÚÛîçÕÝ" #: backends/platform/wii/options.cpp:163 msgid "Network up, share mounted" -msgstr "Ñåòü ðàáîòàåò, ïàïêà ïîäêëþ÷åíà" +msgstr "ÁÕâì àÐÑÞâÐÕâ, ßÐßÚÐ ßÞÔÚÛîçÕÝÐ" #: backends/platform/wii/options.cpp:165 msgid "Network up" -msgstr "Ñåòü ðàáîòàåò" +msgstr "ÁÕâì àÐÑÞâÐÕâ" #: backends/platform/wii/options.cpp:168 msgid ", error while mounting the share" -msgstr ", îøèáêà âî âðåìÿ ïîäêëþ÷åíèÿ ïàïêè" +msgstr ", ÞèØÑÚÐ ÒÞ ÒàÕÜï ßÞÔÚÛîçÕÝØï ßÐßÚØ" #: backends/platform/wii/options.cpp:170 msgid ", share not mounted" -msgstr ", ïàïêà íå ïîäêëþ÷åíà" +msgstr ", ßÐßÚÐ ÝÕ ßÞÔÚÛîçÕÝÐ" #: backends/platform/wii/options.cpp:176 msgid "Network down" -msgstr "Ñåòü âûêëþ÷åíà" +msgstr "ÁÕâì ÒëÚÛîçÕÝÐ" #: backends/platform/wii/options.cpp:180 msgid "Initialising network" -msgstr "Íàñòðàèâàþ ñåòü" +msgstr "½ÐáâàÐØÒÐî áÕâì" #: backends/platform/wii/options.cpp:184 msgid "Timeout while initialising network" -msgstr "Âðåìÿ ïîäêëþ÷åíèÿ ê ñåòè èñòåêëî" +msgstr "²àÕÜï ßÞÔÚÛîçÕÝØï Ú áÕâØ ØáâÕÚÛÞ" #: backends/platform/wii/options.cpp:188 #, c-format msgid "Network not initialsed (%d)" -msgstr "Ñåòü íå íàñòðîåíà (%d)" +msgstr "ÁÕâì ÝÕ ÝÐáâàÞÕÝÐ (%d)" #: backends/platform/wince/CEActionsPocket.cpp:45 msgid "Hide Toolbar" -msgstr "Ñïðÿòàòü ïàíåëü èíñòðóìåíòîâ" +msgstr "ÁßàïâÐâì ßÐÝÕÛì ØÝáâàãÜÕÝâÞÒ" #: backends/platform/wince/CEActionsPocket.cpp:46 msgid "Show Keyboard" -msgstr "Ïîêàçàòü êëàâèàòóðó" +msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã" #: backends/platform/wince/CEActionsPocket.cpp:47 msgid "Sound on/off" -msgstr "Çâóê âêë/âûêë" +msgstr "·ÒãÚ ÒÚÛ/ÒëÚÛ" #: backends/platform/wince/CEActionsPocket.cpp:48 msgid "Right click" -msgstr "Ïðàâûé ùåë÷îê" +msgstr "¿àÐÒëÙ éÕÛçÞÚ" #: backends/platform/wince/CEActionsPocket.cpp:49 msgid "Show/Hide Cursor" -msgstr "Ïîêàçàòü/Óáðàòü êóðñîð" +msgstr "¿ÞÚÐ×Ðâì/ÃÑàÐâì ÚãàáÞà" #: backends/platform/wince/CEActionsPocket.cpp:50 msgid "Free look" -msgstr "Ñâîáîäíûé îáçîð" +msgstr "ÁÒÞÑÞÔÝëÙ ÞÑ×Þà" #: backends/platform/wince/CEActionsPocket.cpp:51 msgid "Zoom up" -msgstr "Óâåë. ìàñøòàá" +msgstr "ÃÒÕÛ. ÜÐáèâÐÑ" #: backends/platform/wince/CEActionsPocket.cpp:52 msgid "Zoom down" -msgstr "Óìåíüø. ìàñøòàá" +msgstr "ÃÜÕÝìè. ÜÐáèâÐÑ" #: backends/platform/wince/CEActionsPocket.cpp:54 #: backends/platform/wince/CEActionsSmartphone.cpp:48 msgid "Bind Keys" -msgstr "Íàçíà÷èòü êëàâèøè" +msgstr "½Ð×ÝÐçØâì ÚÛÐÒØèØ" #: backends/platform/wince/CEActionsPocket.cpp:55 msgid "Cursor Up" -msgstr "Êóðñîð ââåðõ" +msgstr "ºãàáÞà ÒÒÕàå" #: backends/platform/wince/CEActionsPocket.cpp:56 msgid "Cursor Down" -msgstr "Êóðñîð âíèç" +msgstr "ºãàáÞà ÒÝØ×" #: backends/platform/wince/CEActionsPocket.cpp:57 msgid "Cursor Left" -msgstr "Êóðñîð âëåâî" +msgstr "ºãàáÞà ÒÛÕÒÞ" #: backends/platform/wince/CEActionsPocket.cpp:58 msgid "Cursor Right" -msgstr "Êóðñîð âïðàâî" +msgstr "ºãàáÞà ÒßàÐÒÞ" #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Do you want to load or save the game?" -msgstr "Âû õîòèòå çàãðóçèòü ëèáî ñîõðàíèòü èãðó?" +msgstr "²ë åÞâØâÕ ×ÐÓàãרâì ÛØÑÞ áÞåàÐÝØâì ØÓàã?" #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 msgid " Are you sure you want to quit ? " -msgstr " Âû óâåðåíû, ÷òî õîòèòå âûéòè? " +msgstr " ²ë ãÒÕàÕÝë, çâÞ åÞâØâÕ ÒëÙâØ? " #: backends/platform/wince/CEActionsSmartphone.cpp:49 msgid "Keyboard" -msgstr "Êëàâèàòóðà" +msgstr "ºÛÐÒØÐâãàÐ" #: backends/platform/wince/CEActionsSmartphone.cpp:50 msgid "Rotate" -msgstr "Ïîâåðíóòü" +msgstr "¿ÞÒÕàÝãâì" #: backends/platform/wince/CELauncherDialog.cpp:58 msgid "Using SDL driver " -msgstr "Èñïîëüçóþ äðàéâåð SDL " +msgstr "¸áßÞÛì×ãî ÔàÐÙÒÕà SDL " #: backends/platform/wince/CELauncherDialog.cpp:62 msgid "Display " -msgstr "Ïîêàçàòü " +msgstr "¿ÞÚÐ×Ðâì " #: backends/platform/wince/CELauncherDialog.cpp:104 msgid "Do you want to perform an automatic scan ?" -msgstr "Âû õîòèòå ïðîèçâåñòè àâòîìàòè÷åñêèé ïîèñê?" - -#~ msgid "Failed to load any GUI theme, aborting" -#~ msgstr "Íå óäàëîñü çàãðóçèòü òåìó GUI, ïðåêðàùàþ ðàáîòó" - -#~ msgid "User picked target '%s' (gameid '%s')...\n" -#~ msgstr "Ïîëüçîâàòåëü âûáðàë öåëü'%s' (gameid '%s')...\n" - -#~ msgid " Looking for a plugin supporting this gameid... " -#~ msgstr " Èùó ïëàãèí ñ ïîääåðæêîé ýòîãî gameid... " - -#~ msgid "failed\n" -#~ msgstr "íå óäàëîñü\n" - -#~ msgid "" -#~ "%s is an invalid gameid. Use the --list-games option to list supported " -#~ "gameid" -#~ msgstr "" -#~ "Íåâåðíûé gameid %s. Èñïîëüçóéòå îïöèþ --list-games äëÿ ïðîñìîòðà ñïèñêà " -#~ "ïîääåðæèâàåìûõ gameid" - -#~ msgid " Starting '%s'\n" -#~ msgstr " Çàïóñêàþ '%s'\n" - -#~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" -#~ msgstr "%s íå ñìîã çàïóñòèòü äâèæîê: %s (öåëü '%s', ïóòü '%s')" - -#~ msgid "Ok" -#~ msgstr "Ok" - -#~ msgid "Music driver:" -#~ msgstr "Äðàéâåð ìóçûêè:" - -#~ msgid "ALSA" -#~ msgstr "ALSA" - -#~ msgid "Atari ST MIDI" -#~ msgstr "Atars ST MIDI" - -#~ msgid "SEQ" -#~ msgstr "SEQ" - -#~ msgid "DMedia" -#~ msgstr "DMedia" - -#~ msgid "CAMD" -#~ msgstr "CAMD" - -#~ msgid "CoreAudio" -#~ msgstr "CoreAudio" - -#~ msgid "CoreMIDI" -#~ msgstr "CoreMIDI" - -#~ msgid "Yamaha Pa1" -#~ msgstr "Yamaha Pa1" - -#~ msgid "Tapwave Zodiac" -#~ msgstr "Tapware Zodiac" - -#~ msgid "FluidSynth" -#~ msgstr "FluidSynth" - -#~ msgid "AdLib" -#~ msgstr "AdLib" - -#~ msgid "IBM PCjr" -#~ msgstr "IBM PCjr" - -#~ msgid "Creative Music System" -#~ msgstr "Creative Music System" - -#~ msgid "TiMidity" -#~ msgstr "TiMidity" - -#~ msgid "About..." -#~ msgstr "Î ïðîãðàììå..." - -#~ msgid "Options..." -#~ msgstr "Îïöèè..." - -#~ msgid "Start" -#~ msgstr "Ïóñê" - -#~ msgid "Load..." -#~ msgstr "Çàãð...." - -#~ msgid "Edit Game..." -#~ msgstr "Èçì. èãðó..." - -#~ msgid "Remove Game" -#~ msgstr "Óäàëèòü èãðó" - -#~ msgid "Speech Only" -#~ msgstr "Òîëüêî îçâó÷êà" - -#~ msgid "Speech and Subtitles" -#~ msgstr "Îçâó÷êà è ñóáòèòðû" - -#~ msgid "Subtitles Only" -#~ msgstr "Òîëüêî ñóáòèòðû" - -#~ msgid "Speech & Subs" -#~ msgstr "Çâóê è ñóá." - -#~ msgid "Resume" -#~ msgstr "Ïðîäîëæèòü" - -#~ msgid "Options" -#~ msgstr "Îïöèè" - -#~ msgid "Help" -#~ msgstr "Ïîìîùü" - -#~ msgid "About" -#~ msgstr "Î ïðîãðàììå" - -#~ msgid "Return to Launcher" -#~ msgstr "Âåðíóòüñÿ â ãëàâíîå ìåíþ" +msgstr "²ë åÞâØâÕ ßàÞØ×ÒÕáâØ ÐÒâÞÜÐâØçÕáÚØÙ ßÞØáÚ?" -- cgit v1.2.3 From 7078655de0511522dd6baaa7c91977376638f3c5 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 27 Jun 2010 20:38:05 +0000 Subject: i18n: Sync all translation with sources svn-id: r50394 --- common/messages.cpp | 12 ++-- po/ca_ES.po | 160 ++++++++++++++++++++++++++-------------------------- po/de_DE.po | 160 ++++++++++++++++++++++++++-------------------------- po/fr_FR.po | 156 +++++++++++++++++++++++++------------------------- po/hu_HU.po | 160 ++++++++++++++++++++++++++-------------------------- po/it_IT.po | 158 +++++++++++++++++++++++++-------------------------- po/ru_RU.po | 2 +- po/scummvm.pot | 159 ++++++++++++++++++++++++++------------------------- 8 files changed, 483 insertions(+), 484 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index ed0cf040b2..5d861748b2 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,7 +323,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -640,7 +640,7 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -957,7 +957,7 @@ static const PoMessageEntry _translation_fr_FR[] = { }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -1274,7 +1274,7 @@ static const PoMessageEntry _translation_it_IT[] = { }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1585,7 +1585,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1642,7 +1642,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:31+0300\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, diff --git a/po/ca_ES.po b/po/ca_ES.po index 4ebc1192d1..0ae34ca484 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" -"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Catalan\n" #: gui/about.cpp:96 #, c-format @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Torna al nivell de directoris anterior" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mapeja" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -138,7 +138,7 @@ msgstr "" "Anglès" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -151,11 +151,11 @@ msgstr "Plataforma:" msgid "Platform the game was originally designed for" msgstr "Plataforma per la que el joc es va dissenyar originalment" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "Gràfics" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "GFX" @@ -163,7 +163,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Fer canvis sobre les opcions globals de gràfics" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "Àudio" @@ -171,7 +171,7 @@ msgstr " msgid "Override global audio settings" msgstr "Fer canvis sobre les opcions globals d'àudio" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "Volum" @@ -179,7 +179,7 @@ msgstr "Volum" msgid "Override global volume settings" msgstr "Fer canvis sobre les opcions globals de volum" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "MIDI" @@ -187,7 +187,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Fer canvis sobre les opcions globals de MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "Camins" @@ -195,7 +195,7 @@ msgstr "Camins" msgid "Game Path:" msgstr "Camí del Joc:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "Camí Extra:" @@ -207,18 +207,18 @@ msgstr "Especifica el cam msgid "Save Path:" msgstr "Camí de les Partides:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "Especifica on es desaran les partides" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "Cap" @@ -227,7 +227,7 @@ msgstr "Cap" msgid "Default" msgstr "Per defecte" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "Seleccioneu el fitxer SoundFont" @@ -322,7 +322,7 @@ msgstr "Cerca a la llista de jocs" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "Neteja el valor" @@ -456,74 +456,74 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "Mode gràfic:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "Mode de pintat:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "Modes de dispersió especials suportats per alguns jocs" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "Mode pantalla completa" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "Correcció del rati d'aspecte" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregeix la relació d'aspecte per jocs de 320x200" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "Dispositiu Preferit:" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "Dispositiu MT32:" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" "LAPC1/CM32l/CM64" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "Dispositiu GM:" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida General MIDI" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "Emulador d'AdLib:" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "AdLib s'utilitza per la música de molts jocs" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "Freqüència de sortida:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +531,27 @@ msgstr "" "Valors més alts especifiquen millor qualitat de so però pot ser que la " "vostra tarja de so no ho suporti" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "Fitxer SoundFont:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "Mode combinat AdLib/MIDI" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilitza MIDI i la generació de so AdLib alhora" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,145 +559,145 @@ msgstr "" "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " "compatible amb Roland connectat al vostre ordinador" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "Activa el Mode Roland GS" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a " "Roland MT-32" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "Guany MIDI:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" msgstr "Veus" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" msgstr "Subtítols" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "Veus" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "Mostra els subtítols i reprodueix la veu" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "Velocitat dels subtítols:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "Volum de la música:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "Silenciar tot" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "Volum dels efectes:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "Volum dels sons d'efectes especials" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "Volum de la veu:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "Camí de les Partides: " -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "Camí dels Temes:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especifica el camí de les dades addicionals utilitzades per tots els jocs o " "pel ScummVM" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "Camí dels connectors:" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "Misc" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "Mode de pintat de la interfície d'usuari:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "Desat automàtic:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "Tecles" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "Idioma de la interfície d'usuari:" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfície d'usuari de ScummVM" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "Anglès" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte." -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "Seleccioneu el directori de les partides desades" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un " "altre." -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "Seleccioneu el directori dels fitxers extra" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "Seleccioneu el directori dels connectors" @@ -976,7 +976,7 @@ msgstr " (Global)" msgid " (Game)" msgstr " (Joc)" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "MIDI de Windows" diff --git a/po/de_DE.po b/po/de_DE.po index 191b3fb068..21f4ac5ce2 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2010-06-23 19:30+0100\n" "Last-Translator: \n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" -"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 @@ -42,7 +42,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -73,7 +73,7 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -142,7 +142,7 @@ msgstr "" "Spiels in eine deutsche verwandeln." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -155,11 +155,11 @@ msgstr "Plattform:" msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "GFX" @@ -167,7 +167,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "Audio" @@ -175,7 +175,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "Lautstärke" @@ -183,7 +183,7 @@ msgstr "Lautst msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "MIDI" @@ -191,7 +191,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "Pfade" @@ -199,7 +199,7 @@ msgstr "Pfade" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "Extrapfad:" @@ -211,18 +211,18 @@ msgstr "Legt das Verzeichnis f msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "Keine" @@ -231,7 +231,7 @@ msgstr "Keine" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -325,7 +325,7 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "Wert löschen" @@ -459,74 +459,74 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "Rendermodus:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:651 +#: gui/options.cpp:657 #, fuzzy msgid "Specifies preferred sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 #, fuzzy msgid "Specifies default sound device for General MIDI output" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -534,28 +534,28 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -563,145 +563,145 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "Beides" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "Speicherpfad: " -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "Verschiedenes" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "English" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -987,7 +987,7 @@ msgstr " (Global)" msgid " (Game)" msgstr " (Spiel)" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "Windows MIDI" diff --git a/po/fr_FR.po b/po/fr_FR.po index c79456e98e..70d073820d 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 17:48+0100\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2010-06-27 17:47+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +70,7 @@ msgid "Map" msgstr "Affecter" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -139,7 +139,7 @@ msgstr "" "espagnole du jeu." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -152,11 +152,11 @@ msgstr "Plateforme:" msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "GFX" @@ -164,7 +164,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "Audio" @@ -172,7 +172,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifiques à ce jeux" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "Volume" @@ -180,7 +180,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "MIDI" @@ -188,7 +188,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "Chemins" @@ -196,7 +196,7 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "Extra:" @@ -208,18 +208,18 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "Aucun" @@ -228,7 +228,7 @@ msgstr "Aucun" msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "Choisir une banque de sons" @@ -321,7 +321,7 @@ msgstr "Recherche dans la liste de jeux" msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "Effacer la valeur" @@ -455,75 +455,75 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "Périphérique Préféré:" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " "préféré" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "Périphérique MT32:" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "Périphérique GM:" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,29 +531,29 @@ msgstr "" "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " "être supporté par votre carte son" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " "Timidity" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -561,144 +561,144 @@ msgstr "" "Vérifie si vous voulez utiliser un périphérique audio compatible Roland " "connecté à l'ordinateur" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Spécifie un chemin vers des données supplémentaires utilisées par tous les " "jeux ou ScummVM" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "Anglais" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "" "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " "répertoire." -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" diff --git a/po/hu_HU.po b/po/hu_HU.po index cefe1aeb90..6e3d8b4950 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" +"Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gui/about.cpp:96 @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +70,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -135,7 +135,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -148,11 +148,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "" @@ -160,7 +160,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "Hang" @@ -168,7 +168,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "Volumene" @@ -176,7 +176,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "Ösvények" @@ -193,7 +193,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -206,18 +206,18 @@ msgstr "" msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "Semmi" @@ -227,7 +227,7 @@ msgstr "Semmi" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "" @@ -319,7 +319,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "" @@ -451,237 +451,237 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "" -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "" @@ -966,7 +966,7 @@ msgstr "" msgid " (Game)" msgstr "" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po index ad521dfd56..8f27007d89 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR ScummVM Team # This file is distributed under the same license as the ScummVM package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 18:21+0100\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2010-06-27 18:20+0100\n" "Last-Translator: Maff \n" "Language-Team: Italian\n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Vai alla cartella superiore" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mappa" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -137,7 +137,7 @@ msgstr "" "Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -150,11 +150,11 @@ msgstr "Piattaforma:" msgid "Platform the game was originally designed for" msgstr "La piattaforma per la quale il gioco è stato concepito" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "Grafica" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "Grafica" @@ -162,7 +162,7 @@ msgstr "Grafica" msgid "Override global graphic settings" msgstr "Ignora le impostazioni grafiche globali" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "Audio" @@ -170,7 +170,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Ignora le impostazioni audio globali" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "Volume" @@ -178,7 +178,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Ignora le impostazioni globali di volume" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "MIDI" @@ -186,7 +186,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ignora le impostazioni MIDI globali" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "Percorsi" @@ -194,7 +194,7 @@ msgstr "Percorsi" msgid "Game Path:" msgstr "Percorso del gioco:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "Percorso aggiuntivo:" @@ -206,18 +206,18 @@ msgstr "Specifica il percorso di ulteriori dati usati dal gioco" msgid "Save Path:" msgstr "Percorso di salvataggio:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "Specifica dove archiviare i salvataggi" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "Nessuno" @@ -226,7 +226,7 @@ msgstr "Nessuno" msgid "Default" msgstr "Predefinito" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "Seleziona SoundFont" @@ -318,7 +318,7 @@ msgstr "Cerca nella lista dei giochi" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "Cancella" @@ -455,75 +455,75 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "Modalità grafica:" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "Modalità resa grafica:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "Modalità a schermo intero" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "Correzione proporzioni" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregge le proporzioni dei giochi 320x200" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "Dispositivo preferito:" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "" "Specifica il dispositivo di output audio o l'emulatore della scheda audio" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "Dispositivo MT32:" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "Emulatore AdLib:" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "AdLib è utilizzato per la musica in molti giochi" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "Frequenza output:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +531,27 @@ msgstr "" "Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " "essere supportati dalla tua scheda audio" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "Modalità mista AdLib/MIDI" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilizza generazione di suono sia MIDI che AdLib" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,141 +559,141 @@ msgstr "" "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " "che è connesso al tuo computer" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "Attiva la modalità Roland GS" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland " "MT-32" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "Guadagno MIDI:" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" msgstr "Voci" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" msgstr "Sottotitoli" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "Entrambi" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "Voci" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "Sub" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "Mostra i sottotitoli e attiva le voci" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "Velocità sottotitoli:" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "Disattiva audio" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "Volume degli effetti sonori" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "Percorso di salvataggio: " -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "Percorso del tema:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "Percorso dei plugin:" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "Varie" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "Renderer interfaccia grafica:" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "Salvataggio automatico:" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "Tasti" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "Lingua dell'interfaccia:" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "Lingua dell'interfaccia grafica di ScummVM" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "Inglese" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "Seleziona la cartella per i salvataggi" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra." -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "Seleziona la cartella dei temi dell'interfaccia" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "Seleziona la cartella dei file aggiuntivi" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "Seleziona la cartella dei plugin" diff --git a/po/ru_RU.po b/po/ru_RU.po index 7e666dc693..41a0033c60 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:31+0300\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" diff --git a/po/scummvm.pot b/po/scummvm.pot index cef3caf6cd..212910f28f 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,11 +8,10 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-27 23:36+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,7 +38,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +69,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -135,7 +134,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 #: sound/null.cpp:42 msgid "" msgstr "" @@ -148,11 +147,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 msgid "GFX" msgstr "" @@ -160,7 +159,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:896 msgid "Audio" msgstr "" @@ -168,7 +167,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:900 msgid "Volume" msgstr "" @@ -176,7 +175,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:908 msgid "MIDI" msgstr "" @@ -184,7 +183,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:914 msgid "Paths" msgstr "" @@ -192,7 +191,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:927 msgid "Extra Path:" msgstr "" @@ -204,18 +203,18 @@ msgstr "" msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 +#: gui/options.cpp:922 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 +#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 +#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 +#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 +#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 +#: gui/options.cpp:1080 gui/options.cpp:1179 msgid "None" msgstr "" @@ -224,7 +223,7 @@ msgstr "" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1173 msgid "Select SoundFont" msgstr "" @@ -316,7 +315,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:719 msgid "Clear value" msgstr "" @@ -447,235 +446,235 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:620 +#: gui/options.cpp:626 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:631 +#: gui/options.cpp:637 msgid "Render mode:" msgstr "" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:637 gui/options.cpp:638 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:641 +#: gui/options.cpp:647 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:644 +#: gui/options.cpp:650 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:651 +#: gui/options.cpp:657 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:652 +#: gui/options.cpp:658 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:654 +#: gui/options.cpp:660 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "GM Device:" msgstr "" -#: gui/options.cpp:656 +#: gui/options.cpp:662 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:688 +#: gui/options.cpp:694 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:694 gui/options.cpp:695 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:699 +#: gui/options.cpp:705 msgid "Output rate:" msgstr "" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:711 +#: gui/options.cpp:717 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:717 gui/options.cpp:718 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:722 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:719 +#: gui/options.cpp:725 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:728 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:725 +#: gui/options.cpp:731 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:749 gui/options.cpp:755 msgid "Speech" msgstr "" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:750 gui/options.cpp:756 msgid "Subtitles" msgstr "" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Both" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:755 msgid "Spch" msgstr "" -#: gui/options.cpp:750 +#: gui/options.cpp:756 msgid "Subs" msgstr "" -#: gui/options.cpp:751 +#: gui/options.cpp:757 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:755 +#: gui/options.cpp:761 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:767 +#: gui/options.cpp:773 msgid "Music volume:" msgstr "" -#: gui/options.cpp:774 +#: gui/options.cpp:780 msgid "Mute All" msgstr "" -#: gui/options.cpp:777 +#: gui/options.cpp:783 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:783 gui/options.cpp:784 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:784 +#: gui/options.cpp:790 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:915 +#: gui/options.cpp:921 msgid "Save Path: " msgstr "" -#: gui/options.cpp:918 +#: gui/options.cpp:924 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:927 gui/options.cpp:928 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:925 +#: gui/options.cpp:931 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:930 +#: gui/options.cpp:936 msgid "Misc" msgstr "" -#: gui/options.cpp:932 +#: gui/options.cpp:938 msgid "Theme:" msgstr "" -#: gui/options.cpp:936 +#: gui/options.cpp:942 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:942 +#: gui/options.cpp:948 msgid "Autosave:" msgstr "" -#: gui/options.cpp:950 +#: gui/options.cpp:956 msgid "Keys" msgstr "" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:957 +#: gui/options.cpp:963 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:962 +#: gui/options.cpp:968 msgid "English" msgstr "" -#: gui/options.cpp:1106 +#: gui/options.cpp:1112 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1119 +#: gui/options.cpp:1125 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1126 +#: gui/options.cpp:1132 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1135 +#: gui/options.cpp:1141 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1145 +#: gui/options.cpp:1151 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1156 +#: gui/options.cpp:1162 msgid "Select directory for plugins" msgstr "" @@ -954,7 +953,7 @@ msgstr "" msgid " (Game)" msgstr "" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "" -- cgit v1.2.3 From 0436f2823d7c83fa76d68fba3c18a7fcc4a29173 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 20:38:41 +0000 Subject: SCI: added additional output to vmvars command svn-id: r50395 --- engines/sci/console.cpp | 36 ++++++++++++++++++++++++++++++++++-- engines/sci/console.h | 2 ++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 958f43ee6c..37d859cc7c 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2054,9 +2054,11 @@ bool Console::cmdVMVars(int argc, const char **argv) { if (!setValue) { if (varType == 4) - DebugPrintf("%s == %04x:%04x\n", varNames[varType], PRINT_REG(*curValue)); + DebugPrintf("%s == %04x:%04x", varNames[varType], PRINT_REG(*curValue)); else - DebugPrintf("%s var %d == %04x:%04x\n", varNames[varType], varIndex, PRINT_REG(*curValue)); + DebugPrintf("%s var %d == %04x:%04x", varNames[varType], varIndex, PRINT_REG(*curValue)); + printBasicVarInfo(*curValue); + DebugPrintf("\n"); } else { if (parse_reg_t(s, setValue, curValue, true)) { DebugPrintf("Invalid value/address passed.\n"); @@ -3207,6 +3209,36 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV return 0; } +void Console::printBasicVarInfo(reg_t variable) { + int segType = g_sci->getKernel()->findRegType(variable); + SegManager *segMan = g_sci->getEngineState()->_segMan; + + segType &= KSIG_ARITHMETIC | KSIG_OBJECT | KSIG_REF | KSIG_NODE | KSIG_LIST; + + switch (segType) { + case KSIG_ARITHMETIC: { + uint16 content = variable.toUint16(); + if (content >= 10) + DebugPrintf(" (%dd)", content); + break; + } + case KSIG_OBJECT: + DebugPrintf(" (object '%s')", segMan->getObjectName(variable)); + break; + case KSIG_REF: + DebugPrintf(" (reference)"); + break; + case KSIG_NODE: + DebugPrintf(" (node)"); + break; + case KSIG_LIST: + DebugPrintf(" (list)"); + break; + default: + DebugPrintf(" (???)"); + } +} + void Console::printList(List *list) { reg_t pos = list->first; reg_t my_prev = NULL_REG; diff --git a/engines/sci/console.h b/engines/sci/console.h index c180875364..2948e348d8 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -146,6 +146,8 @@ private: bool cmdViewActiveObject(int argc, const char **argv); bool cmdViewAccumulatorObject(int argc, const char **argv); + void printBasicVarInfo(reg_t variable); + bool segmentInfo(int nr); void printList(List *list); int printNode(reg_t addr); -- cgit v1.2.3 From bb992b0b93f3ee9dfad6524fd0721a350f12085a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 20:38:43 +0000 Subject: SCI: Moved all the script-related code inside script.cpp/.h, and all script opcode-related code inside vm.cpp/.h svn-id: r50396 --- engines/sci/engine/kscripts.cpp | 2 + engines/sci/engine/script.cpp | 434 ++++++++++++++++++++++++++++--------- engines/sci/engine/script.h | 346 ++++++++++++++++------------- engines/sci/engine/seg_manager.cpp | 44 +++- engines/sci/engine/seg_manager.h | 5 +- engines/sci/engine/segment.cpp | 326 +--------------------------- engines/sci/engine/segment.h | 176 --------------- engines/sci/engine/vm.cpp | 80 +++++++ engines/sci/engine/vm.h | 178 +++++++++++++-- 9 files changed, 809 insertions(+), 782 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 4e6be15760..8ea0ec2019 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -25,6 +25,8 @@ #include "sci/sci.h" #include "sci/resource.h" +#include "sci/engine/seg_manager.h" +#include "sci/engine/script.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" #include "sci/engine/kernel.h" diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 800460bfc2..748a8f9140 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -35,127 +35,353 @@ namespace Sci { -#define END Script_None - -opcode_format g_opcode_formats[128][4] = { - /*00*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*04*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*08*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*0C*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*10*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*14*/ - {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END}, - /*18*/ - {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None}, - /*1C*/ - {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END}, - /*20*/ - {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END}, - /*24 (24=ret)*/ - {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid}, - /*28*/ - {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END}, - /*2C*/ - {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid}, - /*30*/ - {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, - /*34*/ - {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, - /*38*/ - {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None}, - /*3C*/ - {Script_None}, {Script_None}, {Script_None}, {Script_Word}, - /*40-4F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*50-5F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*60-6F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*70-7F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END} -}; -#undef END - -// TODO: script_adjust_opcode_formats should probably be part of the -// constructor (?) of a VirtualMachine or a ScriptManager class. -void script_adjust_opcode_formats() { - if (g_sci->_features->detectLofsType() != SCI_VERSION_0_EARLY) { - g_opcode_formats[op_lofsa][0] = Script_Offset; - g_opcode_formats[op_lofss][0] = Script_Offset; +Script::Script() : SegmentObj(SEG_TYPE_SCRIPT) { + _nr = 0; + _buf = NULL; + _bufSize = 0; + _scriptSize = 0; + _heapSize = 0; + + _synonyms = NULL; + _heapStart = NULL; + _exportTable = NULL; + + _localsOffset = 0; + _localsSegment = 0; + _localsBlock = NULL; + _localsCount = 0; + + _markedAsDeleted = false; +} + +Script::~Script() { + freeScript(); +} + +void Script::freeScript() { + free(_buf); + _buf = NULL; + _bufSize = 0; + + _objects.clear(); +} + +void Script::init(int script_nr, ResourceManager *resMan) { + Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0); + + _localsOffset = 0; + _localsBlock = NULL; + _localsCount = 0; + + _markedAsDeleted = false; + + _nr = script_nr; + _buf = 0; + _heapStart = 0; + + _scriptSize = script->size; + _bufSize = script->size; + _heapSize = 0; + + _lockers = 1; + + if (getSciVersion() == SCI_VERSION_0_EARLY) { + _bufSize += READ_LE_UINT16(script->data) * 2; + } else if (getSciVersion() >= SCI_VERSION_1_1) { + /** + * In SCI11, the heap was in a separate space from the script. + * We append it to the end of the script, and adjust addressing accordingly. + * However, since we address the heap with a 16-bit pointer, the combined + * size of the stack and the heap must be 64KB. So far this has worked + * for SCI11, SCI2 and SCI21 games. SCI3 games use a different script format, + * and theoretically they can exceed the 64KB boundary using relocation. + */ + Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0); + _bufSize += heap->size; + _heapSize = heap->size; + + // Ensure that the start of the heap resource can be word-aligned. + if (script->size & 2) { + _bufSize++; + _scriptSize++; + } + + // As mentioned above, the script and the heap together should not exceed 64KB + if (script->size + heap->size > 65535) + error("Script and heap sizes combined exceed 64K. This means a fundamental " + "design bug was made regarding SCI1.1 and newer games.\nPlease " + "report this error to the ScummVM team"); + } +} + +void Script::load(ResourceManager *resMan) { + Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, _nr), 0); + assert(script != 0); + + _buf = (byte *)malloc(_bufSize); + assert(_buf); + + assert(_bufSize >= script->size); + memcpy(_buf, script->data, script->size); + + if (getSciVersion() >= SCI_VERSION_1_1) { + Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, _nr), 0); + assert(heap != 0); + + _heapStart = _buf + _scriptSize; + + assert(_bufSize - _scriptSize <= heap->size); + memcpy(_heapStart, heap->data, heap->size); + } + + _exportTable = 0; + _numExports = 0; + _synonyms = 0; + _numSynonyms = 0; + + if (getSciVersion() >= SCI_VERSION_1_1) { + if (READ_LE_UINT16(_buf + 1 + 5) > 0) { // does the script have an export table? + _exportTable = (const uint16 *)(_buf + 1 + 5 + 2); + _numExports = READ_SCI11ENDIAN_UINT16(_exportTable - 1); + } + _localsOffset = _scriptSize + 4; + _localsCount = READ_SCI11ENDIAN_UINT16(_buf + _localsOffset - 2); + } else { + _exportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS); + if (_exportTable) { + _numExports = READ_SCI11ENDIAN_UINT16(_exportTable + 1); + _exportTable += 3; // skip header plus 2 bytes (_exportTable is a uint16 pointer) + } + _synonyms = findBlock(SCI_OBJ_SYNONYMS); + if (_synonyms) { + _numSynonyms = READ_SCI11ENDIAN_UINT16(_synonyms + 2) / 4; + _synonyms += 4; // skip header + } + const byte* localsBlock = findBlock(SCI_OBJ_LOCALVARS); + if (localsBlock) { + _localsOffset = localsBlock - _buf + 4; + _localsCount = (READ_LE_UINT16(_buf + _localsOffset - 2) - 4) >> 1; // half block size + } } -#ifdef ENABLE_SCI32 - // In SCI32, some arguments are now words instead of bytes - if (getSciVersion() >= SCI_VERSION_2) { - g_opcode_formats[op_calle][2] = Script_Word; - g_opcode_formats[op_callk][1] = Script_Word; - g_opcode_formats[op_super][1] = Script_Word; - g_opcode_formats[op_send][0] = Script_Word; - g_opcode_formats[op_self][0] = Script_Word; - g_opcode_formats[op_call][1] = Script_Word; - g_opcode_formats[op_callb][1] = Script_Word; + if (getSciVersion() > SCI_VERSION_0_EARLY) { + // Does the script actually have locals? If not, set the locals offset to 0 + if (!_localsCount) + _localsOffset = 0; + + if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) { + error("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize); + _localsCount = (_bufSize - _localsOffset) >> 1; + } + } else { + // Old script block. There won't be a localvar block in this case. + // Instead, the script starts with a 16 bit int specifying the + // number of locals we need; these are then allocated and zeroed. + _localsCount = READ_LE_UINT16(_buf); + _localsOffset = -_localsCount * 2; // Make sure it's invalid } -#endif } -void SegManager::createClassTable() { - Resource *vocab996 = _resMan->findResource(ResourceId(kResourceTypeVocab, 996), 1); +Object *Script::allocateObject(uint16 offset) { + return &_objects[offset]; +} + +Object *Script::getObject(uint16 offset) { + if (_objects.contains(offset)) + return &_objects[offset]; + else + return 0; +} + +const Object *Script::getObject(uint16 offset) const { + if (_objects.contains(offset)) + return &_objects[offset]; + else + return 0; +} - if (!vocab996) - error("SegManager: failed to open vocab 996"); +Object *Script::scriptObjInit(reg_t obj_pos, bool fullObjectInit) { + Object *obj; + + if (getSciVersion() < SCI_VERSION_1_1 && fullObjectInit) + obj_pos.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) + + VERIFY(obj_pos.offset < _bufSize, "Attempt to initialize object beyond end of script\n"); + + obj = allocateObject(obj_pos.offset); + + VERIFY(obj_pos.offset + kOffsetFunctionArea < (int)_bufSize, "Function area pointer stored beyond end of script\n"); + + obj->init(_buf, obj_pos, fullObjectInit); + + return obj; +} + +void Script::scriptObjRemove(reg_t obj_pos) { + if (getSciVersion() < SCI_VERSION_1_1) + obj_pos.offset += 8; + + _objects.erase(obj_pos.toUint16()); +} - int totalClasses = vocab996->size >> 2; - _classTable.resize(totalClasses); +// This helper function is used by Script::relocateLocal and Object::relocate +// Duplicate in segment.cpp and script.cpp +static bool relocateBlock(Common::Array &block, int block_location, SegmentId segment, int location, size_t scriptSize) { + int rel = location - block_location; - for (uint16 classNr = 0; classNr < totalClasses; classNr++) { - uint16 scriptNr = READ_SCI11ENDIAN_UINT16(vocab996->data + classNr * 4 + 2); + if (rel < 0) + return false; - _classTable[classNr].reg = NULL_REG; - _classTable[classNr].script = scriptNr; + uint idx = rel >> 1; + + if (idx >= block.size()) + return false; + + if (rel & 1) { + error("Attempt to relocate odd variable #%d.5e (relative to %04x)\n", idx, block_location); + return false; } + block[idx].segment = segment; // Perform relocation + if (getSciVersion() >= SCI_VERSION_1_1) + block[idx].offset += scriptSize; - _resMan->unlockResource(vocab996); + return true; } -reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller) { - if (classnr == 0xffff) - return NULL_REG; +bool Script::relocateLocal(SegmentId segment, int location) { + if (_localsBlock) + return relocateBlock(_localsBlock->_locals, _localsOffset, segment, location, _scriptSize); + else + return false; +} - if (classnr < 0 || (int)_classTable.size() <= classnr || _classTable[classnr].script < 0) { - error("[VM] Attempt to dereference class %x, which doesn't exist (max %x)", classnr, _classTable.size()); - return NULL_REG; - } else { - Class *the_class = &_classTable[classnr]; - if (!the_class->reg.segment) { - getScriptSegment(the_class->script, lock); +void Script::relocate(reg_t block) { + byte *heap = _buf; + uint16 heapSize = (uint16)_bufSize; + uint16 heapOffset = 0; - if (!the_class->reg.segment) { - error("[VM] Trying to instantiate class %x by instantiating script 0x%x (%03d) failed;", classnr, the_class->script, the_class->script); - return NULL_REG; - } - } else - if (caller.segment != the_class->reg.segment) - getScript(the_class->reg.segment)->incrementLockers(); + if (getSciVersion() >= SCI_VERSION_1_1) { + heap = _heapStart; + heapSize = (uint16)_heapSize; + heapOffset = _scriptSize; + } + + VERIFY(block.offset < (uint16)heapSize && READ_SCI11ENDIAN_UINT16(heap + block.offset) * 2 + block.offset < (uint16)heapSize, + "Relocation block outside of script\n"); + + int count = READ_SCI11ENDIAN_UINT16(heap + block.offset); + int exportIndex = 0; + int pos = 0; + + for (int i = 0; i < count; i++) { + pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; + // This occurs in SCI01/SCI1 games where usually one export value + // is zero. It seems that in this situation, we should skip the + // export and move to the next one, though the total count of valid + // exports remains the same + if (!pos) { + exportIndex++; + pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; + if (!pos) + error("Script::relocate(): Consecutive zero exports found"); + } + + // In SCI0-SCI1, script local variables, objects and code are relocated. We only relocate + // locals and objects here, and ignore relocation of code blocks. In SCI1.1 and newer + // versions, only locals and objects are relocated. + if (!relocateLocal(block.segment, pos)) { + // Not a local? It's probably an object or code block. If it's an object, relocate it. + const ObjMap::iterator end = _objects.end(); + for (ObjMap::iterator it = _objects.begin(); it != end; ++it) + if (it->_value.relocate(block.segment, pos, _scriptSize)) + break; + } + + exportIndex++; + } +} + +void Script::incrementLockers() { + _lockers++; +} + +void Script::decrementLockers() { + if (_lockers > 0) + _lockers--; +} + +int Script::getLockers() const { + return _lockers; +} + +void Script::setLockers(int lockers) { + _lockers = lockers; +} + +uint16 Script::validateExportFunc(int pubfunct) { + bool exportsAreWide = (g_sci->_features->detectLofsType() == SCI_VERSION_1_MIDDLE); - return the_class->reg; + if (_numExports <= pubfunct) { + error("validateExportFunc(): pubfunct is invalid"); + return 0; } + + if (exportsAreWide) + pubfunct *= 2; + uint16 offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct); + VERIFY(offset < _bufSize, "invalid export function pointer"); + + return offset; +} + +byte *Script::findBlock(int type) { + byte *buf = _buf; + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); + + if (oldScriptHeader) + buf += 2; + + do { + int seekerType = READ_LE_UINT16(buf); + + if (seekerType == 0) + break; + if (seekerType == type) + return buf; + + int seekerSize = READ_LE_UINT16(buf + 2); + assert(seekerSize > 0); + buf += seekerSize; + } while (1); + + return NULL; +} + +// memory operations + +void Script::mcpyInOut(int dst, const void *src, size_t n) { + if (_buf) { + assert(dst + n <= _bufSize); + memcpy(_buf + dst, src, n); + } +} + +bool Script::isValidOffset(uint16 offset) const { + return offset < _bufSize; +} + +SegmentRef Script::dereference(reg_t pointer) { + if (pointer.offset > _bufSize) { + error("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", + PRINT_REG(pointer), (uint)_bufSize); + return SegmentRef(); + } + + SegmentRef ret; + ret.isRaw = true; + ret.maxSize = _bufSize - pointer.offset; + ret.raw = _buf + pointer.offset; + return ret; } void SegManager::scriptInitialiseLocals(SegmentId segmentId) { diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index fe92dabe58..62d2228c9a 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -27,6 +27,7 @@ #define SCI_ENGINE_SCRIPT_H #include "common/str.h" +#include "sci/engine/segment.h" namespace Sci { @@ -49,160 +50,205 @@ enum ScriptObjectTypes { SCI_OBJ_LOCALVARS }; -// Opcode formats -enum opcode_format { - Script_Invalid = -1, - Script_None = 0, - Script_Byte, - Script_SByte, - Script_Word, - Script_SWord, - Script_Variable, - Script_SVariable, - Script_SRelative, - Script_Property, - Script_Global, - Script_Local, - Script_Temp, - Script_Param, - Script_Offset, - Script_End -}; +typedef Common::HashMap ObjMap; + +class Script : public SegmentObj { +public: + int _nr; /**< Script number */ + byte *_buf; /**< Static data buffer, or NULL if not used */ + byte *_heapStart; /**< Start of heap if SCI1.1, NULL otherwise */ + + uint32 getScriptSize() { return _scriptSize; } + uint32 getHeapSize() { return _heapSize; } + uint32 getBufSize() { return _bufSize; } + +protected: + int _lockers; /**< Number of classes and objects that require this script */ + +private: + size_t _scriptSize; + size_t _heapSize; + uint16 _bufSize; + + const uint16 *_exportTable; /**< Abs. offset of the export table or 0 if not present */ + uint16 _numExports; /**< Number of entries in the exports table */ + + const byte *_synonyms; /**< Synonyms block or 0 if not present*/ + uint16 _numSynonyms; /**< Number of entries in the synonyms block */ + + int _localsOffset; + uint16 _localsCount; + +public: + /** + * Table for objects, contains property variables. + * Indexed by the TODO offset. + */ + ObjMap _objects; + + int getLocalsOffset() const { return _localsOffset; } + uint16 getLocalsCount() const { return _localsCount; } + SegmentId _localsSegment; /**< The local variable segment */ + LocalVariables *_localsBlock; + + bool _markedAsDeleted; + +public: + Script(); + ~Script(); + + void freeScript(); + void init(int script_nr, ResourceManager *resMan); + void load(ResourceManager *resMan); + + virtual bool isValidOffset(uint16 offset) const; + virtual SegmentRef dereference(reg_t pointer); + virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; + virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); + virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const; + virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + + virtual void saveLoadWithSerializer(Common::Serializer &ser); + + Object *allocateObject(uint16 offset); + Object *getObject(uint16 offset); + const Object *getObject(uint16 offset) const; + + /** + * Initializes an object within the segment manager + * @param obj_pos Location (segment, offset) of the object. It must + * point to the beginning of the script/class block + * (as opposed to what the VM considers to be the + * object location) + * @returns A newly created Object describing the object, + * stored within the relevant script + */ + Object *scriptObjInit(reg_t obj_pos, bool fullObjectInit = true); + + /** + * Removes a script object + * @param obj_pos Location (segment, offset) of the object. + */ + void scriptObjRemove(reg_t obj_pos); -enum sci_opcodes { - op_bnot = 0x00, // 000 - op_add = 0x01, // 001 - op_sub = 0x02, // 002 - op_mul = 0x03, // 003 - op_div = 0x04, // 004 - op_mod = 0x05, // 005 - op_shr = 0x06, // 006 - op_shl = 0x07, // 007 - op_xor = 0x08, // 008 - op_and = 0x09, // 009 - op_or = 0x0a, // 010 - op_neg = 0x0b, // 011 - op_not = 0x0c, // 012 - op_eq_ = 0x0d, // 013 - op_ne_ = 0x0e, // 014 - op_gt_ = 0x0f, // 015 - op_ge_ = 0x10, // 016 - op_lt_ = 0x11, // 017 - op_le_ = 0x12, // 018 - op_ugt_ = 0x13, // 019 - op_uge_ = 0x14, // 020 - op_ult_ = 0x15, // 021 - op_ule_ = 0x16, // 022 - op_bt = 0x17, // 023 - op_bnt = 0x18, // 024 - op_jmp = 0x19, // 025 - op_ldi = 0x1a, // 026 - op_push = 0x1b, // 027 - op_pushi = 0x1c, // 028 - op_toss = 0x1d, // 029 - op_dup = 0x1e, // 030 - op_link = 0x1f, // 031 - op_call = 0x20, // 032 - op_callk = 0x21, // 033 - op_callb = 0x22, // 034 - op_calle = 0x23, // 035 - op_ret = 0x24, // 036 - op_send = 0x25, // 037 - // dummy 0x26, // 038 - // dummy 0x27, // 039 - op_class = 0x28, // 040 - // dummy 0x29, // 041 - op_self = 0x2a, // 042 - op_super = 0x2b, // 043 - op_rest = 0x2c, // 044 - op_lea = 0x2d, // 045 - op_selfID = 0x2e, // 046 - // dummy 0x2f // 047 - op_pprev = 0x30, // 048 - op_pToa = 0x31, // 049 - op_aTop = 0x32, // 050 - op_pTos = 0x33, // 051 - op_sTop = 0x34, // 052 - op_ipToa = 0x35, // 053 - op_dpToa = 0x36, // 054 - op_ipTos = 0x37, // 055 - op_dpTos = 0x38, // 056 - op_lofsa = 0x39, // 057 - op_lofss = 0x3a, // 058 - op_push0 = 0x3b, // 059 - op_push1 = 0x3c, // 060 - op_push2 = 0x3d, // 061 - op_pushSelf = 0x3e, // 062 - op_line = 0x3f, // 063 - op_lag = 0x40, // 064 - op_lal = 0x41, // 065 - op_lat = 0x42, // 066 - op_lap = 0x43, // 067 - op_lsg = 0x44, // 068 - op_lsl = 0x45, // 069 - op_lst = 0x46, // 070 - op_lsp = 0x47, // 071 - op_lagi = 0x48, // 072 - op_lali = 0x49, // 073 - op_lati = 0x4a, // 074 - op_lapi = 0x4b, // 075 - op_lsgi = 0x4c, // 076 - op_lsli = 0x4d, // 077 - op_lsti = 0x4e, // 078 - op_lspi = 0x4f, // 079 - op_sag = 0x50, // 080 - op_sal = 0x51, // 081 - op_sat = 0x52, // 082 - op_sap = 0x53, // 083 - op_ssg = 0x54, // 084 - op_ssl = 0x55, // 085 - op_sst = 0x56, // 086 - op_ssp = 0x57, // 087 - op_sagi = 0x58, // 088 - op_sali = 0x59, // 089 - op_sati = 0x5a, // 090 - op_sapi = 0x5b, // 091 - op_ssgi = 0x5c, // 092 - op_ssli = 0x5d, // 093 - op_ssti = 0x5e, // 094 - op_sspi = 0x5f, // 095 - op_plusag = 0x60, // 096 - op_plusal = 0x61, // 097 - op_plusat = 0x62, // 098 - op_plusap = 0x63, // 099 - op_plussg = 0x64, // 100 - op_plussl = 0x65, // 101 - op_plusst = 0x66, // 102 - op_plussp = 0x67, // 103 - op_plusagi = 0x68, // 104 - op_plusali = 0x69, // 105 - op_plusati = 0x6a, // 106 - op_plusapi = 0x6b, // 107 - op_plussgi = 0x6c, // 108 - op_plussli = 0x6d, // 109 - op_plussti = 0x6e, // 110 - op_plusspi = 0x6f, // 111 - op_minusag = 0x70, // 112 - op_minusal = 0x71, // 113 - op_minusat = 0x72, // 114 - op_minusap = 0x73, // 115 - op_minussg = 0x74, // 116 - op_minussl = 0x75, // 117 - op_minusst = 0x76, // 118 - op_minussp = 0x77, // 119 - op_minusagi = 0x78, // 120 - op_minusali = 0x79, // 121 - op_minusati = 0x7a, // 122 - op_minusapi = 0x7b, // 123 - op_minussgi = 0x7c, // 124 - op_minussli = 0x7d, // 125 - op_minussti = 0x7e, // 126 - op_minusspi = 0x7f // 127 + /** + * Processes a relocation block witin a script + * This function is idempotent, but it must only be called after all + * objects have been instantiated, or a run-time error will occur. + * @param obj_pos Location (segment, offset) of the block + * @return Location of the relocation block + */ + void relocate(reg_t block); + +private: + bool relocateLocal(SegmentId segment, int location); + +public: + // script lock operations + + /** Increments the number of lockers of this script by one. */ + void incrementLockers(); + + /** Decrements the number of lockers of this script by one. */ + void decrementLockers(); + + /** + * Retrieves the number of locks held on this script. + * @return the number of locks held on the previously identified script + */ + int getLockers() const; + + /** Sets the number of locks held on this script. */ + void setLockers(int lockers); + + /** + * Retrieves a pointer to the exports of this script + * @return pointer to the exports. + */ + const uint16 *getExportTable() const { return _exportTable; } + + /** + * Retrieves the number of exports of script. + * @return the number of exports of this script + */ + uint16 getExportsNr() const { return _numExports; } + + /** + * Retrieves a pointer to the synonyms associated with this script + * @return pointer to the synonyms, in non-parsed format. + */ + const byte *getSynonyms() const { return _synonyms; } + + /** + * Retrieves the number of synonyms associated with this script. + * @return the number of synonyms associated with this script + */ + uint16 getSynonymsNr() const { return _numSynonyms; } + + /** + * Validate whether the specified public function is exported by + * the script in the specified segment. + * @param pubfunct Index of the function to validate + * @return NULL if the public function is invalid, its + * offset into the script's segment otherwise + */ + uint16 validateExportFunc(int pubfunct); + + /** + * Marks the script as deleted. + * This will not actually delete the script. If references remain present on the + * heap or the stack, the script will stay in memory in a quasi-deleted state until + * either unreachable (resulting in its eventual deletion) or reloaded (resulting + * in its data being updated). + */ + void markDeleted() { + _markedAsDeleted = true; + } + + /** + * Determines whether the script is marked as being deleted. + */ + bool isMarkedAsDeleted() const { + return _markedAsDeleted; + } + + /** + * Copies a byte string into a script's heap representation. + * @param dst script-relative offset of the destination area + * @param src pointer to the data source location + * @param n number of bytes to copy + */ + void mcpyInOut(int dst, const void *src, size_t n); + + /** + * Finds the pointer where a block of a specific type starts from + */ + byte *findBlock(int type); }; -extern opcode_format g_opcode_formats[128][4]; +/** + * Makes sure that a script and its superclasses get loaded to the heap. + * If the script already has been loaded, only the number of lockers is + * increased. All scripts containing superclasses of this script are loaded + * recursively as well, unless 'recursive' is set to zero. The + * complementary function is "script_uninstantiate()" below. + * @param[in] resMan The resource manager + * @param[in] segMan The segment manager + * @param[in] script_nr The script number to load + * @return The script's segment ID or 0 if out of heap + */ +int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_nr); -void script_adjust_opcode_formats(); +/** + * Decreases the numer of lockers of a script and unloads it if that number + * reaches zero. + * This function will recursively unload scripts containing its + * superclasses, if those aren't locked by other scripts as well. + * @param[in] segMan The segment manager + * @param[in] version The SCI version to use + * @param[in] script_nr The script number that is requestet to be unloaded + */ +void script_uninstantiate(SegManager *segMan, int script_nr); } // End of namespace Sci diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 9394e717ec..35ac0a5f69 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -26,6 +26,7 @@ #include "sci/sci.h" #include "sci/engine/seg_manager.h" #include "sci/engine/state.h" +#include "sci/engine/script.h" namespace Sci { @@ -837,7 +838,6 @@ Common::String SegManager::getString(reg_t pointer, int entries) { return ret; } - byte *SegManager::allocDynmem(int size, const char *descr, reg_t *addr) { SegmentId seg; SegmentObj *mobj = allocSegment(new DynMem(), &seg); @@ -949,4 +949,46 @@ void SegManager::freeString(reg_t addr) { #endif +void SegManager::createClassTable() { + Resource *vocab996 = _resMan->findResource(ResourceId(kResourceTypeVocab, 996), 1); + + if (!vocab996) + error("SegManager: failed to open vocab 996"); + + int totalClasses = vocab996->size >> 2; + _classTable.resize(totalClasses); + + for (uint16 classNr = 0; classNr < totalClasses; classNr++) { + uint16 scriptNr = READ_SCI11ENDIAN_UINT16(vocab996->data + classNr * 4 + 2); + + _classTable[classNr].reg = NULL_REG; + _classTable[classNr].script = scriptNr; + } + + _resMan->unlockResource(vocab996); +} + +reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller) { + if (classnr == 0xffff) + return NULL_REG; + + if (classnr < 0 || (int)_classTable.size() <= classnr || _classTable[classnr].script < 0) { + error("[VM] Attempt to dereference class %x, which doesn't exist (max %x)", classnr, _classTable.size()); + return NULL_REG; + } else { + Class *the_class = &_classTable[classnr]; + if (!the_class->reg.segment) { + getScriptSegment(the_class->script, lock); + + if (!the_class->reg.segment) { + error("[VM] Trying to instantiate class %x by instantiating script 0x%x (%03d) failed;", classnr, the_class->script, the_class->script); + return NULL_REG; + } + } else + if (caller.segment != the_class->reg.segment) + getScript(the_class->reg.segment)->incrementLockers(); + + return the_class->reg; + } +} } // End of namespace Sci diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 1ed01e2c6b..19fd06f596 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -28,7 +28,9 @@ #include "common/scummsys.h" #include "common/serializer.h" +#include "sci/engine/script.h" #include "sci/engine/vm.h" +#include "sci/engine/vm_types.h" #include "sci/engine/segment.h" namespace Sci { @@ -42,8 +44,6 @@ namespace Sci { error("%s, line, %d, %s", __FILE__, __LINE__, msg); \ } - - /** * Parameters for getScriptSegment(). */ @@ -53,6 +53,7 @@ enum ScriptLoadType { SCRIPT_GET_LOCK = 3 /**< Load, if neccessary, and lock */ }; +class Script; class SegManager : public Common::Serializable { friend class Console; diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 13c7904726..2bbedf2dcf 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -86,196 +86,8 @@ SegmentObj *SegmentObj::createSegmentObj(SegmentType type) { return mem; } -Script::Script() : SegmentObj(SEG_TYPE_SCRIPT) { - _nr = 0; - _buf = NULL; - _bufSize = 0; - _scriptSize = 0; - _heapSize = 0; - - _synonyms = NULL; - _heapStart = NULL; - _exportTable = NULL; - - _localsOffset = 0; - _localsSegment = 0; - _localsBlock = NULL; - _localsCount = 0; - - _markedAsDeleted = false; -} - -Script::~Script() { - freeScript(); -} - -void Script::freeScript() { - free(_buf); - _buf = NULL; - _bufSize = 0; - - _objects.clear(); -} - -void Script::init(int script_nr, ResourceManager *resMan) { - Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, script_nr), 0); - - _localsOffset = 0; - _localsBlock = NULL; - _localsCount = 0; - - _markedAsDeleted = false; - - _nr = script_nr; - _buf = 0; - _heapStart = 0; - - _scriptSize = script->size; - _bufSize = script->size; - _heapSize = 0; - - _lockers = 1; - - if (getSciVersion() == SCI_VERSION_0_EARLY) { - _bufSize += READ_LE_UINT16(script->data) * 2; - } else if (getSciVersion() >= SCI_VERSION_1_1) { - /** - * In SCI11, the heap was in a separate space from the script. - * We append it to the end of the script, and adjust addressing accordingly. - * However, since we address the heap with a 16-bit pointer, the combined - * size of the stack and the heap must be 64KB. So far this has worked - * for SCI11, SCI2 and SCI21 games. SCI3 games use a different script format, - * and theoretically they can exceed the 64KB boundary using relocation. - */ - Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0); - _bufSize += heap->size; - _heapSize = heap->size; - - // Ensure that the start of the heap resource can be word-aligned. - if (script->size & 2) { - _bufSize++; - _scriptSize++; - } - - // As mentioned above, the script and the heap together should not exceed 64KB - if (script->size + heap->size > 65535) - error("Script and heap sizes combined exceed 64K. This means a fundamental " - "design bug was made regarding SCI1.1 and newer games.\nPlease " - "report this error to the ScummVM team"); - } -} - -void Script::load(ResourceManager *resMan) { - Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, _nr), 0); - assert(script != 0); - - _buf = (byte *)malloc(_bufSize); - assert(_buf); - - assert(_bufSize >= script->size); - memcpy(_buf, script->data, script->size); - - if (getSciVersion() >= SCI_VERSION_1_1) { - Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, _nr), 0); - assert(heap != 0); - - _heapStart = _buf + _scriptSize; - - assert(_bufSize - _scriptSize <= heap->size); - memcpy(_heapStart, heap->data, heap->size); - } - - _exportTable = 0; - _numExports = 0; - _synonyms = 0; - _numSynonyms = 0; - - if (getSciVersion() >= SCI_VERSION_1_1) { - if (READ_LE_UINT16(_buf + 1 + 5) > 0) { // does the script have an export table? - _exportTable = (const uint16 *)(_buf + 1 + 5 + 2); - _numExports = READ_SCI11ENDIAN_UINT16(_exportTable - 1); - } - _localsOffset = _scriptSize + 4; - _localsCount = READ_SCI11ENDIAN_UINT16(_buf + _localsOffset - 2); - } else { - _exportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS); - if (_exportTable) { - _numExports = READ_SCI11ENDIAN_UINT16(_exportTable + 1); - _exportTable += 3; // skip header plus 2 bytes (_exportTable is a uint16 pointer) - } - _synonyms = findBlock(SCI_OBJ_SYNONYMS); - if (_synonyms) { - _numSynonyms = READ_SCI11ENDIAN_UINT16(_synonyms + 2) / 4; - _synonyms += 4; // skip header - } - const byte* localsBlock = findBlock(SCI_OBJ_LOCALVARS); - if (localsBlock) { - _localsOffset = localsBlock - _buf + 4; - _localsCount = (READ_LE_UINT16(_buf + _localsOffset - 2) - 4) >> 1; // half block size - } - } - - if (getSciVersion() > SCI_VERSION_0_EARLY) { - // Does the script actually have locals? If not, set the locals offset to 0 - if (!_localsCount) - _localsOffset = 0; - - if (_localsOffset + _localsCount * 2 + 1 >= (int)_bufSize) { - error("Locals extend beyond end of script: offset %04x, count %d vs size %d", _localsOffset, _localsCount, _bufSize); - _localsCount = (_bufSize - _localsOffset) >> 1; - } - } else { - // Old script block. There won't be a localvar block in this case. - // Instead, the script starts with a 16 bit int specifying the - // number of locals we need; these are then allocated and zeroed. - _localsCount = READ_LE_UINT16(_buf); - _localsOffset = -_localsCount * 2; // Make sure it's invalid - } -} - -Object *Script::allocateObject(uint16 offset) { - return &_objects[offset]; -} - -Object *Script::getObject(uint16 offset) { - if (_objects.contains(offset)) - return &_objects[offset]; - else - return 0; -} - -const Object *Script::getObject(uint16 offset) const { - if (_objects.contains(offset)) - return &_objects[offset]; - else - return 0; -} - -Object *Script::scriptObjInit(reg_t obj_pos, bool fullObjectInit) { - Object *obj; - - if (getSciVersion() < SCI_VERSION_1_1 && fullObjectInit) - obj_pos.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) - - VERIFY(obj_pos.offset < _bufSize, "Attempt to initialize object beyond end of script\n"); - - obj = allocateObject(obj_pos.offset); - - VERIFY(obj_pos.offset + kOffsetFunctionArea < (int)_bufSize, "Function area pointer stored beyond end of script\n"); - - obj->init(_buf, obj_pos, fullObjectInit); - - return obj; -} - -void Script::scriptObjRemove(reg_t obj_pos) { - if (getSciVersion() < SCI_VERSION_1_1) - obj_pos.offset += 8; - - _objects.erase(obj_pos.toUint16()); -} - // This helper function is used by Script::relocateLocal and Object::relocate +// Duplicate in segment.cpp and script.cpp static bool relocateBlock(Common::Array &block, int block_location, SegmentId segment, int location, size_t scriptSize) { int rel = location - block_location; @@ -298,148 +110,12 @@ static bool relocateBlock(Common::Array &block, int block_location, Segme return true; } -bool Script::relocateLocal(SegmentId segment, int location) { - if (_localsBlock) - return relocateBlock(_localsBlock->_locals, _localsOffset, segment, location, _scriptSize); - else - return false; -} - -void Script::relocate(reg_t block) { - byte *heap = _buf; - uint16 heapSize = (uint16)_bufSize; - uint16 heapOffset = 0; - - if (getSciVersion() >= SCI_VERSION_1_1) { - heap = _heapStart; - heapSize = (uint16)_heapSize; - heapOffset = _scriptSize; - } - - VERIFY(block.offset < (uint16)heapSize && READ_SCI11ENDIAN_UINT16(heap + block.offset) * 2 + block.offset < (uint16)heapSize, - "Relocation block outside of script\n"); - - int count = READ_SCI11ENDIAN_UINT16(heap + block.offset); - int exportIndex = 0; - int pos = 0; - - for (int i = 0; i < count; i++) { - pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; - // This occurs in SCI01/SCI1 games where usually one export value - // is zero. It seems that in this situation, we should skip the - // export and move to the next one, though the total count of valid - // exports remains the same - if (!pos) { - exportIndex++; - pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; - if (!pos) - error("Script::relocate(): Consecutive zero exports found"); - } - - // In SCI0-SCI1, script local variables, objects and code are relocated. We only relocate - // locals and objects here, and ignore relocation of code blocks. In SCI1.1 and newer - // versions, only locals and objects are relocated. - if (!relocateLocal(block.segment, pos)) { - // Not a local? It's probably an object or code block. If it's an object, relocate it. - const ObjMap::iterator end = _objects.end(); - for (ObjMap::iterator it = _objects.begin(); it != end; ++it) - if (it->_value.relocate(block.segment, pos, _scriptSize)) - break; - } - - exportIndex++; - } -} - -void Script::incrementLockers() { - _lockers++; -} - -void Script::decrementLockers() { - if (_lockers > 0) - _lockers--; -} - -int Script::getLockers() const { - return _lockers; -} - -void Script::setLockers(int lockers) { - _lockers = lockers; -} - -uint16 Script::validateExportFunc(int pubfunct) { - bool exportsAreWide = (g_sci->_features->detectLofsType() == SCI_VERSION_1_MIDDLE); - - if (_numExports <= pubfunct) { - error("validateExportFunc(): pubfunct is invalid"); - return 0; - } - - if (exportsAreWide) - pubfunct *= 2; - uint16 offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct); - VERIFY(offset < _bufSize, "invalid export function pointer"); - - return offset; -} - -byte *Script::findBlock(int type) { - byte *buf = _buf; - bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - - if (oldScriptHeader) - buf += 2; - - do { - int seekerType = READ_LE_UINT16(buf); - - if (seekerType == 0) - break; - if (seekerType == type) - return buf; - - int seekerSize = READ_LE_UINT16(buf + 2); - assert(seekerSize > 0); - buf += seekerSize; - } while (1); - - return NULL; -} - - -// memory operations - -void Script::mcpyInOut(int dst, const void *src, size_t n) { - if (_buf) { - assert(dst + n <= _bufSize); - memcpy(_buf + dst, src, n); - } -} - SegmentRef SegmentObj::dereference(reg_t pointer) { error("Error: Trying to dereference pointer %04x:%04x to inappropriate segment", PRINT_REG(pointer)); return SegmentRef(); } -bool Script::isValidOffset(uint16 offset) const { - return offset < _bufSize; -} - -SegmentRef Script::dereference(reg_t pointer) { - if (pointer.offset > _bufSize) { - error("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", - PRINT_REG(pointer), (uint)_bufSize); - return SegmentRef(); - } - - SegmentRef ret; - ret.isRaw = true; - ret.maxSize = _bufSize - pointer.offset; - ret.raw = _buf + pointer.offset; - return ret; -} bool LocalVariables::isValidOffset(uint16 offset) const { return offset < _locals.size() * 2; diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 24d27e367f..b621e53412 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -331,182 +331,6 @@ private: reg_t _pos; /**< Object offset within its script; for clones, this is their base */ }; -typedef Common::HashMap ObjMap; - -class Script : public SegmentObj { -public: - int _nr; /**< Script number */ - byte *_buf; /**< Static data buffer, or NULL if not used */ - byte *_heapStart; /**< Start of heap if SCI1.1, NULL otherwise */ - - uint32 getScriptSize() { return _scriptSize; } - uint32 getHeapSize() { return _heapSize; } - uint32 getBufSize() { return _bufSize; } - -protected: - int _lockers; /**< Number of classes and objects that require this script */ - -private: - size_t _scriptSize; - size_t _heapSize; - uint16 _bufSize; - - const uint16 *_exportTable; /**< Abs. offset of the export table or 0 if not present */ - uint16 _numExports; /**< Number of entries in the exports table */ - - const byte *_synonyms; /**< Synonyms block or 0 if not present*/ - uint16 _numSynonyms; /**< Number of entries in the synonyms block */ - - int _localsOffset; - uint16 _localsCount; - -public: - /** - * Table for objects, contains property variables. - * Indexed by the TODO offset. - */ - ObjMap _objects; - - int getLocalsOffset() const { return _localsOffset; } - uint16 getLocalsCount() const { return _localsCount; } - SegmentId _localsSegment; /**< The local variable segment */ - LocalVariables *_localsBlock; - - bool _markedAsDeleted; - -public: - Script(); - ~Script(); - - void freeScript(); - void init(int script_nr, ResourceManager *resMan); - void load(ResourceManager *resMan); - - virtual bool isValidOffset(uint16 offset) const; - virtual SegmentRef dereference(reg_t pointer); - virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; - virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const; - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; - - virtual void saveLoadWithSerializer(Common::Serializer &ser); - - Object *allocateObject(uint16 offset); - Object *getObject(uint16 offset); - const Object *getObject(uint16 offset) const; - - /** - * Initializes an object within the segment manager - * @param obj_pos Location (segment, offset) of the object. It must - * point to the beginning of the script/class block - * (as opposed to what the VM considers to be the - * object location) - * @returns A newly created Object describing the object, - * stored within the relevant script - */ - Object *scriptObjInit(reg_t obj_pos, bool fullObjectInit = true); - - /** - * Removes a script object - * @param obj_pos Location (segment, offset) of the object. - */ - void scriptObjRemove(reg_t obj_pos); - - /** - * Processes a relocation block witin a script - * This function is idempotent, but it must only be called after all - * objects have been instantiated, or a run-time error will occur. - * @param obj_pos Location (segment, offset) of the block - * @return Location of the relocation block - */ - void relocate(reg_t block); - -private: - bool relocateLocal(SegmentId segment, int location); - -public: - // script lock operations - - /** Increments the number of lockers of this script by one. */ - void incrementLockers(); - - /** Decrements the number of lockers of this script by one. */ - void decrementLockers(); - - /** - * Retrieves the number of locks held on this script. - * @return the number of locks held on the previously identified script - */ - int getLockers() const; - - /** Sets the number of locks held on this script. */ - void setLockers(int lockers); - - /** - * Retrieves a pointer to the exports of this script - * @return pointer to the exports. - */ - const uint16 *getExportTable() const { return _exportTable; } - - /** - * Retrieves the number of exports of script. - * @return the number of exports of this script - */ - uint16 getExportsNr() const { return _numExports; } - - /** - * Retrieves a pointer to the synonyms associated with this script - * @return pointer to the synonyms, in non-parsed format. - */ - const byte *getSynonyms() const { return _synonyms; } - - /** - * Retrieves the number of synonyms associated with this script. - * @return the number of synonyms associated with this script - */ - uint16 getSynonymsNr() const { return _numSynonyms; } - - /** - * Validate whether the specified public function is exported by - * the script in the specified segment. - * @param pubfunct Index of the function to validate - * @return NULL if the public function is invalid, its - * offset into the script's segment otherwise - */ - uint16 validateExportFunc(int pubfunct); - - /** - * Marks the script as deleted. - * This will not actually delete the script. If references remain present on the - * heap or the stack, the script will stay in memory in a quasi-deleted state until - * either unreachable (resulting in its eventual deletion) or reloaded (resulting - * in its data being updated). - */ - void markDeleted() { - _markedAsDeleted = true; - } - - /** - * Determines whether the script is marked as being deleted. - */ - bool isMarkedAsDeleted() const { - return _markedAsDeleted; - } - - /** - * Copies a byte string into a script's heap representation. - * @param dst script-relative offset of the destination area - * @param src pointer to the data source location - * @param n number of bytes to copy - */ - void mcpyInOut(int dst, const void *src, size_t n); - - /** - * Finds the pointer where a block of a specific type starts from - */ - byte *findBlock(int type); -}; - /** Data stack */ struct DataStack : SegmentObj { int _capacity; /**< Number of stack entries */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 841d4ede64..9ab95c41bb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -49,6 +49,86 @@ const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; #define SCI_XS_CALLEE_LOCALS ((SegmentId)-1) +#define END Script_None + +opcode_format g_opcode_formats[128][4] = { + /*00*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*04*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*08*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*0C*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*10*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*14*/ + {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END}, + /*18*/ + {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None}, + /*1C*/ + {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END}, + /*20*/ + {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END}, + /*24 (24=ret)*/ + {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid}, + /*28*/ + {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END}, + /*2C*/ + {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid}, + /*30*/ + {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, + /*34*/ + {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, + /*38*/ + {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None}, + /*3C*/ + {Script_None}, {Script_None}, {Script_None}, {Script_Word}, + /*40-4F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*50-5F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*60-6F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*70-7F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END} +}; +#undef END + +// TODO: script_adjust_opcode_formats should probably be part of the +// constructor (?) of a VirtualMachine or a ScriptManager class. +void script_adjust_opcode_formats() { + if (g_sci->_features->detectLofsType() != SCI_VERSION_0_EARLY) { + g_opcode_formats[op_lofsa][0] = Script_Offset; + g_opcode_formats[op_lofss][0] = Script_Offset; + } + +#ifdef ENABLE_SCI32 + // In SCI32, some arguments are now words instead of bytes + if (getSciVersion() >= SCI_VERSION_2) { + g_opcode_formats[op_calle][2] = Script_Word; + g_opcode_formats[op_callk][1] = Script_Word; + g_opcode_formats[op_super][1] = Script_Word; + g_opcode_formats[op_send][0] = Script_Word; + g_opcode_formats[op_self][0] = Script_Word; + g_opcode_formats[op_call][1] = Script_Word; + g_opcode_formats[op_callb][1] = Script_Word; + } +#endif +} + /** * Adds an entry to the top of the execution stack. * diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 0938520525..ed4cc4a456 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -118,6 +118,160 @@ enum { GC_INTERVAL = 32768 }; +// Opcode formats +enum opcode_format { + Script_Invalid = -1, + Script_None = 0, + Script_Byte, + Script_SByte, + Script_Word, + Script_SWord, + Script_Variable, + Script_SVariable, + Script_SRelative, + Script_Property, + Script_Global, + Script_Local, + Script_Temp, + Script_Param, + Script_Offset, + Script_End +}; + +enum sci_opcodes { + op_bnot = 0x00, // 000 + op_add = 0x01, // 001 + op_sub = 0x02, // 002 + op_mul = 0x03, // 003 + op_div = 0x04, // 004 + op_mod = 0x05, // 005 + op_shr = 0x06, // 006 + op_shl = 0x07, // 007 + op_xor = 0x08, // 008 + op_and = 0x09, // 009 + op_or = 0x0a, // 010 + op_neg = 0x0b, // 011 + op_not = 0x0c, // 012 + op_eq_ = 0x0d, // 013 + op_ne_ = 0x0e, // 014 + op_gt_ = 0x0f, // 015 + op_ge_ = 0x10, // 016 + op_lt_ = 0x11, // 017 + op_le_ = 0x12, // 018 + op_ugt_ = 0x13, // 019 + op_uge_ = 0x14, // 020 + op_ult_ = 0x15, // 021 + op_ule_ = 0x16, // 022 + op_bt = 0x17, // 023 + op_bnt = 0x18, // 024 + op_jmp = 0x19, // 025 + op_ldi = 0x1a, // 026 + op_push = 0x1b, // 027 + op_pushi = 0x1c, // 028 + op_toss = 0x1d, // 029 + op_dup = 0x1e, // 030 + op_link = 0x1f, // 031 + op_call = 0x20, // 032 + op_callk = 0x21, // 033 + op_callb = 0x22, // 034 + op_calle = 0x23, // 035 + op_ret = 0x24, // 036 + op_send = 0x25, // 037 + // dummy 0x26, // 038 + // dummy 0x27, // 039 + op_class = 0x28, // 040 + // dummy 0x29, // 041 + op_self = 0x2a, // 042 + op_super = 0x2b, // 043 + op_rest = 0x2c, // 044 + op_lea = 0x2d, // 045 + op_selfID = 0x2e, // 046 + // dummy 0x2f // 047 + op_pprev = 0x30, // 048 + op_pToa = 0x31, // 049 + op_aTop = 0x32, // 050 + op_pTos = 0x33, // 051 + op_sTop = 0x34, // 052 + op_ipToa = 0x35, // 053 + op_dpToa = 0x36, // 054 + op_ipTos = 0x37, // 055 + op_dpTos = 0x38, // 056 + op_lofsa = 0x39, // 057 + op_lofss = 0x3a, // 058 + op_push0 = 0x3b, // 059 + op_push1 = 0x3c, // 060 + op_push2 = 0x3d, // 061 + op_pushSelf = 0x3e, // 062 + op_line = 0x3f, // 063 + op_lag = 0x40, // 064 + op_lal = 0x41, // 065 + op_lat = 0x42, // 066 + op_lap = 0x43, // 067 + op_lsg = 0x44, // 068 + op_lsl = 0x45, // 069 + op_lst = 0x46, // 070 + op_lsp = 0x47, // 071 + op_lagi = 0x48, // 072 + op_lali = 0x49, // 073 + op_lati = 0x4a, // 074 + op_lapi = 0x4b, // 075 + op_lsgi = 0x4c, // 076 + op_lsli = 0x4d, // 077 + op_lsti = 0x4e, // 078 + op_lspi = 0x4f, // 079 + op_sag = 0x50, // 080 + op_sal = 0x51, // 081 + op_sat = 0x52, // 082 + op_sap = 0x53, // 083 + op_ssg = 0x54, // 084 + op_ssl = 0x55, // 085 + op_sst = 0x56, // 086 + op_ssp = 0x57, // 087 + op_sagi = 0x58, // 088 + op_sali = 0x59, // 089 + op_sati = 0x5a, // 090 + op_sapi = 0x5b, // 091 + op_ssgi = 0x5c, // 092 + op_ssli = 0x5d, // 093 + op_ssti = 0x5e, // 094 + op_sspi = 0x5f, // 095 + op_plusag = 0x60, // 096 + op_plusal = 0x61, // 097 + op_plusat = 0x62, // 098 + op_plusap = 0x63, // 099 + op_plussg = 0x64, // 100 + op_plussl = 0x65, // 101 + op_plusst = 0x66, // 102 + op_plussp = 0x67, // 103 + op_plusagi = 0x68, // 104 + op_plusali = 0x69, // 105 + op_plusati = 0x6a, // 106 + op_plusapi = 0x6b, // 107 + op_plussgi = 0x6c, // 108 + op_plussli = 0x6d, // 109 + op_plussti = 0x6e, // 110 + op_plusspi = 0x6f, // 111 + op_minusag = 0x70, // 112 + op_minusal = 0x71, // 113 + op_minusat = 0x72, // 114 + op_minusap = 0x73, // 115 + op_minussg = 0x74, // 116 + op_minussl = 0x75, // 117 + op_minusst = 0x76, // 118 + op_minussp = 0x77, // 119 + op_minusagi = 0x78, // 120 + op_minusali = 0x79, // 121 + op_minusati = 0x7a, // 122 + op_minusapi = 0x7b, // 123 + op_minussgi = 0x7c, // 124 + op_minussli = 0x7d, // 125 + op_minussti = 0x7e, // 126 + op_minusspi = 0x7f // 127 +}; + +extern opcode_format g_opcode_formats[128][4]; + +void script_adjust_opcode_formats(); /** * Executes function pubfunct of the specified script. @@ -194,30 +348,6 @@ void script_debug(EngineState *s); SelectorType lookupSelector(SegManager *segMan, reg_t obj, Selector selectorid, ObjVarRef *varp, reg_t *fptr); -/** - * Makes sure that a script and its superclasses get loaded to the heap. - * If the script already has been loaded, only the number of lockers is - * increased. All scripts containing superclasses of this script are loaded - * recursively as well, unless 'recursive' is set to zero. The - * complementary function is "script_uninstantiate()" below. - * @param[in] resMan The resource manager - * @param[in] segMan The segment manager - * @param[in] script_nr The script number to load - * @return The script's segment ID or 0 if out of heap - */ -int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_nr); - -/** - * Decreases the numer of lockers of a script and unloads it if that number - * reaches zero. - * This function will recursively unload scripts containing its - * superclasses, if those aren't locked by other scripts as well. - * @param[in] segMan The segment manager - * @param[in] version The SCI version to use - * @param[in] script_nr The script number that is requestet to be unloaded - */ -void script_uninstantiate(SegManager *segMan, int script_nr); - /** * Read a PMachine instruction from a memory buffer and return its length. * -- cgit v1.2.3 From 5f9cc9e8f8272fd2e07c9b6cce8bcc541772d17f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 20:43:32 +0000 Subject: SCI: adding alias for vmvars ("vv") and vmvarlist ("vl") svn-id: r50397 --- engines/sci/console.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 37d859cc7c..b837c7b92b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -186,16 +186,18 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { // VM DCmd_Register("script_steps", WRAP_METHOD(Console, cmdScriptSteps)); DCmd_Register("vm_varlist", WRAP_METHOD(Console, cmdVMVarlist)); - DCmd_Register("vmvarlist", WRAP_METHOD(Console, cmdVMVarlist)); // alias + DCmd_Register("vmvarlist", WRAP_METHOD(Console, cmdVMVarlist)); // alias + DCmd_Register("vl", WRAP_METHOD(Console, cmdVMVarlist)); // alias DCmd_Register("vm_vars", WRAP_METHOD(Console, cmdVMVars)); - DCmd_Register("vmvars", WRAP_METHOD(Console, cmdVMVars)); // alias + DCmd_Register("vmvars", WRAP_METHOD(Console, cmdVMVars)); // alias + DCmd_Register("vv", WRAP_METHOD(Console, cmdVMVars)); // alias DCmd_Register("stack", WRAP_METHOD(Console, cmdStack)); DCmd_Register("value_type", WRAP_METHOD(Console, cmdValueType)); DCmd_Register("view_listnode", WRAP_METHOD(Console, cmdViewListNode)); DCmd_Register("view_reference", WRAP_METHOD(Console, cmdViewReference)); - DCmd_Register("vr", WRAP_METHOD(Console, cmdViewReference)); // alias + DCmd_Register("vr", WRAP_METHOD(Console, cmdViewReference)); // alias DCmd_Register("view_object", WRAP_METHOD(Console, cmdViewObject)); - DCmd_Register("vo", WRAP_METHOD(Console, cmdViewObject)); // alias + DCmd_Register("vo", WRAP_METHOD(Console, cmdViewObject)); // alias DCmd_Register("active_object", WRAP_METHOD(Console, cmdViewActiveObject)); DCmd_Register("acc_object", WRAP_METHOD(Console, cmdViewAccumulatorObject)); @@ -400,8 +402,8 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf("\n"); DebugPrintf("VM:\n"); DebugPrintf(" script_steps - Shows the number of executed SCI operations\n"); - DebugPrintf(" vm_varlist / vmvarlist - Shows the addresses of variables in the VM\n"); - DebugPrintf(" vm_vars / vmvars - Displays or changes variables in the VM\n"); + DebugPrintf(" vm_varlist / vmvarlist / vl - Shows the addresses of variables in the VM\n"); + DebugPrintf(" vm_vars / vmvars / vv - Displays or changes variables in the VM\n"); DebugPrintf(" stack - Lists the specified number of stack elements\n"); DebugPrintf(" value_type - Determines the type of a value\n"); DebugPrintf(" view_listnode - Examines the list node at the given address\n"); -- cgit v1.2.3 From 2843feeb9a4d031eaacc896da0045877fd048004 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 21:00:34 +0000 Subject: SCI: Made the code for initializing script classes, objects and locals part of the Script class svn-id: r50398 --- engines/sci/engine/script.cpp | 74 +++++++++++++++++++--------------------- engines/sci/engine/script.h | 24 +++++++++++++ engines/sci/engine/seg_manager.h | 21 ++---------- 3 files changed, 63 insertions(+), 56 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 748a8f9140..18244c7906 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -384,34 +384,31 @@ SegmentRef Script::dereference(reg_t pointer) { return ret; } -void SegManager::scriptInitialiseLocals(SegmentId segmentId) { - Script *scr = getScript(segmentId); - - LocalVariables *locals = allocLocalsSegment(scr); +void Script::initialiseLocals(SegManager *segMan) { + LocalVariables *locals = segMan->allocLocalsSegment(this); if (locals) { if (getSciVersion() > SCI_VERSION_0_EARLY) { - const byte *base = (const byte *)(scr->_buf + scr->getLocalsOffset()); + const byte *base = (const byte *)(_buf + getLocalsOffset()); - for (uint16 i = 0; i < scr->getLocalsCount(); i++) + for (uint16 i = 0; i < getLocalsCount(); i++) locals->_locals[i] = make_reg(0, READ_SCI11ENDIAN_UINT16(base + i * 2)); } else { // In SCI0 early, locals are set at run time, thus zero them all here - for (uint16 i = 0; i < scr->getLocalsCount(); i++) + for (uint16 i = 0; i < getLocalsCount(); i++) locals->_locals[i] = NULL_REG; } } } -void SegManager::scriptInitialiseClasses(SegmentId seg) { - Script *scr = getScript(seg); +void Script::initialiseClasses(SegManager *segMan) { const byte *seeker = 0; uint16 mult = 0; if (getSciVersion() >= SCI_VERSION_1_1) { - seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; + seeker = _heapStart + 4 + READ_SCI11ENDIAN_UINT16(_heapStart + 2) * 2; mult = 2; } else { - seeker = scr->findBlock(SCI_OBJ_CLASS); + seeker = findBlock(SCI_OBJ_CLASS); mult = 1; } @@ -422,7 +419,7 @@ void SegManager::scriptInitialiseClasses(SegmentId seg) { // In SCI0-SCI1, this is the segment type. In SCI11, it's a marker (0x1234) uint16 marker = READ_SCI11ENDIAN_UINT16(seeker); bool isClass; - uint16 classpos = seeker - scr->_buf; + uint16 classpos = seeker - _buf; int16 species; if (!marker) @@ -439,24 +436,25 @@ void SegManager::scriptInitialiseClasses(SegmentId seg) { if (isClass) { // WORKAROUND for an invalid species access in the demo of LSL2 - if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)classTableSize()) - resizeClassTable(classTableSize() + 1); + if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)segMan->classTableSize()) + segMan->resizeClassTable(segMan->classTableSize() + 1); - if (species < 0 || species >= (int)classTableSize()) + if (species < 0 || species >= (int)segMan->classTableSize()) error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d\n", - species, species, classTableSize(), scr->_nr); + species, species, segMan->classTableSize(), _nr); - setClassOffset(species, make_reg(seg, classpos)); + SegmentId segmentId = segMan->getScriptSegment(_nr); + segMan->setClassOffset(species, make_reg(segmentId, classpos)); } seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * mult; } } -void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { - Script *scr = getScript(seg); +void Script::initialiseObjectsSci0(SegManager *segMan) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - const byte *seeker = scr->_buf + (oldScriptHeader ? 2 : 0); + const byte *seeker = _buf + (oldScriptHeader ? 2 : 0); + SegmentId segmentId = segMan->getScriptSegment(_nr); do { uint16 objType = READ_SCI11ENDIAN_UINT16(seeker); @@ -467,14 +465,14 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { case SCI_OBJ_OBJECT: case SCI_OBJ_CLASS: { - reg_t addr = make_reg(seg, seeker - scr->_buf + 4); - Object *obj = scr->scriptObjInit(addr); - obj->initSpecies(this, addr); + reg_t addr = make_reg(segmentId, seeker - _buf + 4); + Object *obj = scriptObjInit(addr); + obj->initSpecies(segMan, addr); - if (!obj->initBaseObject(this, addr)) { + if (!obj->initBaseObject(segMan, addr)) { // Script 202 of KQ5 French has an invalid object. This is non-fatal. warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); - scr->scriptObjRemove(addr); + scriptObjRemove(addr); } } break; @@ -484,20 +482,20 @@ void SegManager::scriptInitialiseObjectsSci0(SegmentId seg) { } seeker += READ_SCI11ENDIAN_UINT16(seeker + 2); - } while ((uint32)(seeker - scr->_buf) < scr->getScriptSize() - 2); + } while ((uint32)(seeker - _buf) < getScriptSize() - 2); } -void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { - Script *scr = getScript(seg); - const byte *seeker = scr->_heapStart + 4 + READ_SCI11ENDIAN_UINT16(scr->_heapStart + 2) * 2; +void Script::initialiseObjectsSci11(SegManager *segMan) { + const byte *seeker = _heapStart + 4 + READ_SCI11ENDIAN_UINT16(_heapStart + 2) * 2; + SegmentId segmentId = segMan->getScriptSegment(_nr); while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { - reg_t reg = make_reg(seg, seeker - scr->_buf); - Object *obj = scr->scriptObjInit(reg); + reg_t reg = make_reg(segmentId, seeker - _buf); + Object *obj = scriptObjInit(reg); // Copy base from species class, as we need its selector IDs obj->setSuperClassSelector( - getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); + segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); // If object is instance, get -propDict- from class and set it for this object // This is needed for ::isMemberOf() to work. @@ -505,7 +503,7 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { // clicking on ego if (!obj->isClass()) { reg_t classObject = obj->getSuperClassSelector(); - Object *classObj = getObject(classObject); + Object *classObj = segMan->getObject(classObject); obj->setPropDictSelector(classObj->getPropDictSelector()); } @@ -515,7 +513,7 @@ void SegManager::scriptInitialiseObjectsSci11(SegmentId seg) { // uses this selector together with -propDict- to compare classes. // For the purpose of Obj::isKindOf, using the script number appears // to be sufficient. - obj->setClassScriptSelector(make_reg(0, scr->_nr)); + obj->setClassScriptSelector(make_reg(0, _nr)); seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; } @@ -537,14 +535,14 @@ int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNu scr->init(scriptNum, resMan); scr->load(resMan); - segMan->scriptInitialiseLocals(segmentId); - segMan->scriptInitialiseClasses(segmentId); + scr->initialiseLocals(segMan); + scr->initialiseClasses(segMan); if (getSciVersion() >= SCI_VERSION_1_1) { - segMan->scriptInitialiseObjectsSci11(segmentId); + scr->initialiseObjectsSci11(segMan); scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); } else { - segMan->scriptInitialiseObjectsSci0(segmentId); + scr->initialiseObjectsSci0(segMan); byte *relocationBlock = scr->findBlock(SCI_OBJ_POINTERS); if (relocationBlock) scr->relocate(make_reg(segmentId, relocationBlock - scr->_buf + 4)); diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 62d2228c9a..cc3c0263e8 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -140,6 +140,30 @@ public: */ void relocate(reg_t block); + /** + * Initializes the script's local variables + * @param segMan A reference to the segment manager + */ + void initialiseLocals(SegManager *segMan); + + /** + * Adds the script's classes to the segment manager's class table + * @param segMan A reference to the segment manager + */ + void initialiseClasses(SegManager *segMan); + + /** + * Initializes the script's objects (SCI0) + * @param segMan A reference to the segment manager + */ + void initialiseObjectsSci0(SegManager *segMan); + + /** + * Initializes the script's objects (SCI1.1+) + * @param segMan A reference to the segment manager + */ + void initialiseObjectsSci11(SegManager *segMan); + private: bool relocateLocal(SegmentId segment, int location); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 19fd06f596..324527400b 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -139,19 +139,6 @@ public: */ Script *getScriptIfLoaded(SegmentId seg); - - // 1b. Script Initialisation - - // The set of functions below are intended - // to be used during script instantiation, - // i.e. loading and linking. - - /** - * Initializes a script's local variable block according to a prototype - * @param segmentId Segment containing the script to initialize - */ - void scriptInitialiseLocals(SegmentId segmentId); - // 2. Clones /** @@ -427,10 +414,6 @@ public: */ reg_t findObjectByName(const Common::String &name, int index = -1); - void scriptInitialiseClasses(SegmentId seg); - void scriptInitialiseObjectsSci0(SegmentId seg); - void scriptInitialiseObjectsSci11(SegmentId seg); - uint32 classTableSize() { return _classTable.size(); } Class getClass(int index) { return _classTable[index]; } void setClassOffset(int index, reg_t offset) { _classTable[index].reg = offset; } @@ -481,7 +464,6 @@ private: private: SegmentObj *allocSegment(SegmentObj *mem, SegmentId *segid); - LocalVariables *allocLocalsSegment(Script *scr); int deallocate(SegmentId seg, bool recursive); void createClassTable(); @@ -494,6 +476,9 @@ private: * 'seg' is a valid segment */ bool check(SegmentId seg); + +public: + LocalVariables *allocLocalsSegment(Script *scr); }; } // End of namespace Sci -- cgit v1.2.3 From 819dc92802d330a27066b755854cba7169b8dfad Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 27 Jun 2010 21:04:47 +0000 Subject: Escape a "?" character to prevent "??)" to be interpreted as trigraph and thus becoming "]". svn-id: r50399 --- engines/sci/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b837c7b92b..4bc68fd813 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3237,7 +3237,7 @@ void Console::printBasicVarInfo(reg_t variable) { DebugPrintf(" (list)"); break; default: - DebugPrintf(" (???)"); + DebugPrintf(" (??\?)"); } } -- cgit v1.2.3 From 456265f8fac8c5020e30fa99e0be1c1ff1a02aa8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 21:12:38 +0000 Subject: SCI: resetting curPos as well when mixing sound resources svn-id: r50401 --- engines/sci/sound/midiparser_sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 1d25a518e1..50a2407dde 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -444,6 +444,7 @@ byte *MidiParser_SCI::midiMixChannels() { for (int i = 0; i < _track->channelCount; i++) { _track->channels[i].time = 0; _track->channels[i].prev = 0; + _track->channels[i].curPos = 0; totalSize += _track->channels[i].size; } -- cgit v1.2.3 From 4a60ff409050e8f3da6065f2a44d78d31c4f34b9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 21:18:19 +0000 Subject: Made the script initialization/uninitialization methods part of the segment manager svn-id: r50402 --- engines/sci/engine/kscripts.cpp | 2 +- engines/sci/engine/script.cpp | 105 ------------------------------------ engines/sci/engine/script.h | 24 --------- engines/sci/engine/seg_manager.cpp | 108 ++++++++++++++++++++++++++++++++++++- engines/sci/engine/seg_manager.h | 24 +++++++++ engines/sci/engine/vm.cpp | 2 +- engines/sci/sci.cpp | 2 +- 7 files changed, 134 insertions(+), 133 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 8ea0ec2019..8f41fbad2e 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -239,7 +239,7 @@ reg_t kDisposeScript(EngineState *s, int argc, reg_t *argv) { scr->setLockers(1); } - script_uninstantiate(s->_segMan, script); + s->_segMan->uninstantiateScript(script); if (argc != 2) { return s->r_acc; diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 18244c7906..2bb405372a 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -519,109 +519,4 @@ void Script::initialiseObjectsSci11(SegManager *segMan) { } } -int script_instantiate(ResourceManager *resMan, SegManager *segMan, int scriptNum) { - SegmentId segmentId = segMan->getScriptSegment(scriptNum); - Script *scr = segMan->getScriptIfLoaded(segmentId); - if (scr) { - if (!scr->isMarkedAsDeleted()) { - scr->incrementLockers(); - return segmentId; - } else { - scr->freeScript(); - } - } else { - scr = segMan->allocateScript(scriptNum, &segmentId); - } - - scr->init(scriptNum, resMan); - scr->load(resMan); - scr->initialiseLocals(segMan); - scr->initialiseClasses(segMan); - - if (getSciVersion() >= SCI_VERSION_1_1) { - scr->initialiseObjectsSci11(segMan); - scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); - } else { - scr->initialiseObjectsSci0(segMan); - byte *relocationBlock = scr->findBlock(SCI_OBJ_POINTERS); - if (relocationBlock) - scr->relocate(make_reg(segmentId, relocationBlock - scr->_buf + 4)); - } - - return segmentId; -} - -void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg) { - bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - reg_t reg = make_reg(seg, oldScriptHeader ? 2 : 0); - int objType, objLength = 0; - Script *scr = segMan->getScript(seg); - - // Make a pass over the object in order uninstantiate all superclasses - - do { - reg.offset += objLength; // Step over the last checked object - - objType = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset); - if (!objType) - break; - objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); - - reg.offset += 4; // Step over header - - if ((objType == SCI_OBJ_OBJECT) || (objType == SCI_OBJ_CLASS)) { // object or class? - reg.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) - int16 superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); - - if (superclass >= 0) { - int superclass_script = segMan->getClass(superclass).script; - - if (superclass_script == script_nr) { - if (scr->getLockers()) - scr->decrementLockers(); // Decrease lockers if this is us ourselves - } else - script_uninstantiate(segMan, superclass_script); - // Recurse to assure that the superclass lockers number gets decreased - } - - reg.offset += SCRIPT_OBJECT_MAGIC_OFFSET; - } // if object or class - - reg.offset -= 4; // Step back on header - - } while (objType != 0); -} - -void script_uninstantiate(SegManager *segMan, int script_nr) { - SegmentId segment = segMan->getScriptSegment(script_nr); - Script *scr = segMan->getScriptIfLoaded(segment); - - if (!scr) { // Is it already loaded? - //warning("unloading script 0x%x requested although not loaded", script_nr); - // This is perfectly valid SCI behaviour - return; - } - - scr->decrementLockers(); // One less locker - - if (scr->getLockers() > 0) - return; - - // Free all classtable references to this script - for (uint i = 0; i < segMan->classTableSize(); i++) - if (segMan->getClass(i).reg.segment == segment) - segMan->setClassOffset(i, NULL_REG); - - if (getSciVersion() < SCI_VERSION_1_1) - script_uninstantiate_sci0(segMan, script_nr, segment); - // FIXME: Add proper script uninstantiation for SCI 1.1 - - if (!scr->getLockers()) { - // The actual script deletion seems to be done by SCI scripts themselves - scr->markDeleted(); - debugC(kDebugLevelScripts, "Unloaded script 0x%x.", script_nr); - } -} - - } // End of namespace Sci diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index cc3c0263e8..5396a7432e 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -250,30 +250,6 @@ public: byte *findBlock(int type); }; -/** - * Makes sure that a script and its superclasses get loaded to the heap. - * If the script already has been loaded, only the number of lockers is - * increased. All scripts containing superclasses of this script are loaded - * recursively as well, unless 'recursive' is set to zero. The - * complementary function is "script_uninstantiate()" below. - * @param[in] resMan The resource manager - * @param[in] segMan The segment manager - * @param[in] script_nr The script number to load - * @return The script's segment ID or 0 if out of heap - */ -int script_instantiate(ResourceManager *resMan, SegManager *segMan, int script_nr); - -/** - * Decreases the numer of lockers of a script and unloads it if that number - * reaches zero. - * This function will recursively unload scripts containing its - * superclasses, if those aren't locked by other scripts as well. - * @param[in] segMan The segment manager - * @param[in] version The SCI version to use - * @param[in] script_nr The script number that is requestet to be unloaded - */ -void script_uninstantiate(SegManager *segMan, int script_nr); - } // End of namespace Sci #endif // SCI_ENGINE_SCRIPT_H diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 35ac0a5f69..b56a539c63 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -361,7 +361,7 @@ SegmentId SegManager::getScriptSegment(int script_nr, ScriptLoadType load) { SegmentId segment; if ((load & SCRIPT_GET_LOAD) == SCRIPT_GET_LOAD) - script_instantiate(_resMan, this, script_nr); + instantiateScript(script_nr); segment = getScriptSegment(script_nr); @@ -991,4 +991,110 @@ reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller return the_class->reg; } } + +int SegManager::instantiateScript(int scriptNum) { + SegmentId segmentId = getScriptSegment(scriptNum); + Script *scr = getScriptIfLoaded(segmentId); + if (scr) { + if (!scr->isMarkedAsDeleted()) { + scr->incrementLockers(); + return segmentId; + } else { + scr->freeScript(); + } + } else { + scr = allocateScript(scriptNum, &segmentId); + } + + scr->init(scriptNum, _resMan); + scr->load(_resMan); + scr->initialiseLocals(this); + scr->initialiseClasses(this); + + if (getSciVersion() >= SCI_VERSION_1_1) { + scr->initialiseObjectsSci11(this); + scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); + } else { + scr->initialiseObjectsSci0(this); + byte *relocationBlock = scr->findBlock(SCI_OBJ_POINTERS); + if (relocationBlock) + scr->relocate(make_reg(segmentId, relocationBlock - scr->_buf + 4)); + } + + return segmentId; +} + +void SegManager::uninstantiateScript(int script_nr) { + SegmentId segmentId = getScriptSegment(script_nr); + Script *scr = getScriptIfLoaded(segmentId); + + if (!scr) { // Is it already unloaded? + //warning("unloading script 0x%x requested although not loaded", script_nr); + // This is perfectly valid SCI behaviour + return; + } + + scr->decrementLockers(); // One less locker + + if (scr->getLockers() > 0) + return; + + // Free all classtable references to this script + for (uint i = 0; i < classTableSize(); i++) + if (getClass(i).reg.segment == segmentId) + setClassOffset(i, NULL_REG); + + if (getSciVersion() < SCI_VERSION_1_1) + uninstantiateScriptSci0(script_nr); + // FIXME: Add proper script uninstantiation for SCI 1.1 + + if (!scr->getLockers()) { + // The actual script deletion seems to be done by SCI scripts themselves + scr->markDeleted(); + debugC(kDebugLevelScripts, "Unloaded script 0x%x.", script_nr); + } +} + +void SegManager::uninstantiateScriptSci0(int script_nr) { + bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); + SegmentId segmentId = getScriptSegment(script_nr); + Script *scr = getScript(segmentId); + reg_t reg = make_reg(segmentId, oldScriptHeader ? 2 : 0); + int objType, objLength = 0; + + // Make a pass over the object in order uninstantiate all superclasses + + do { + reg.offset += objLength; // Step over the last checked object + + objType = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset); + if (!objType) + break; + objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); + + reg.offset += 4; // Step over header + + if ((objType == SCI_OBJ_OBJECT) || (objType == SCI_OBJ_CLASS)) { // object or class? + reg.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) + int16 superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); + + if (superclass >= 0) { + int superclass_script = getClass(superclass).script; + + if (superclass_script == script_nr) { + if (scr->getLockers()) + scr->decrementLockers(); // Decrease lockers if this is us ourselves + } else + uninstantiateScript(superclass_script); + // Recurse to assure that the superclass lockers number gets decreased + } + + reg.offset += SCRIPT_OBJECT_MAGIC_OFFSET; + } // if object or class + + reg.offset -= 4; // Step back on header + + } while (objType != 0); +} + } // End of namespace Sci diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 324527400b..4af2965bc7 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -117,6 +117,30 @@ public: */ SegmentId getScriptSegment(int script_nr, ScriptLoadType load); + /** + * Makes sure that a script and its superclasses get loaded to the heap. + * If the script already has been loaded, only the number of lockers is + * increased. All scripts containing superclasses of this script are loaded + * recursively as well, unless 'recursive' is set to zero. The + * complementary function is "uninstantiateScript()" below. + * @param[in] script_nr The script number to load + * @return The script's segment ID or 0 if out of heap + */ + int instantiateScript(int script_nr); + + /** + * Decreases the numer of lockers of a script and unloads it if that number + * reaches zero. + * This function will recursively unload scripts containing its + * superclasses, if those aren't locked by other scripts as well. + * @param[in] script_nr The script number that is requestet to be unloaded + */ + void uninstantiateScript(int script_nr); + +private: + void uninstantiateScriptSci0(int script_nr); + +public: // TODO: document this reg_t getClassAddress(int classnr, ScriptLoadType lock, reg_t caller); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9ab95c41bb..f59cf4a577 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -420,7 +420,7 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP Script *scr = s->_segMan->getScriptIfLoaded(seg); if (!scr || scr->isMarkedAsDeleted()) { // Script not present yet? - seg = script_instantiate(g_sci->getResMan(), s->_segMan, script); + seg = s->_segMan->instantiateScript(script); scr = s->_segMan->getScript(seg); } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 6decfc7c27..8a41d74b7f 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -373,7 +373,7 @@ bool SciEngine::initGame() { _gamestate->stack_base = stack->_entries; _gamestate->stack_top = stack->_entries + stack->_capacity; - if (!script_instantiate(_resMan, _gamestate->_segMan, 0)) { + if (!_gamestate->_segMan->instantiateScript(0)) { error("initGame(): Could not instantiate script 0"); return false; } -- cgit v1.2.3 From 1faebccce25ac422f65ab9616b9a7ecb647894a8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 21:29:35 +0000 Subject: Cleanup, remove unused/obsolete code svn-id: r50403 --- engines/sci/console.cpp | 8 ----- engines/sci/engine/scriptdebug.cpp | 17 ----------- engines/sci/parser/vocabulary.cpp | 53 --------------------------------- engines/sci/sound/iterator/core.cpp | 44 --------------------------- engines/sci/sound/iterator/iterator.cpp | 45 ---------------------------- 5 files changed, 167 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 4bc68fd813..611d1481ad 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -285,14 +285,6 @@ void Console::postEnter() { } } - -#if 0 -// Unused -#define LOOKUP_SPECIES(species) (\ - (species >= 1000) ? species : *(s->_classTable[species].scriptposp) \ - + s->_classTable[species].class_offset) -#endif - bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf("\n"); DebugPrintf("Variables\n"); diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index b8a0987865..d730856332 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -278,23 +278,6 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod void script_debug(EngineState *s) { - // Do we support a separate console? - -#if 0 - if (sci_debug_flags & _DEBUG_FLAG_LOGGING) { - printf("%d: acc=%04x:%04x ", scriptStepCounter, PRINT_REG(s->r_acc)); - disassemble(s, s->xs->addr.pc, 0, 1); - if (s->seeking == kDebugSeekGlobal) - printf("Global %d (0x%x) = %04x:%04x\n", s->seekSpecial, - s->seekSpecial, PRINT_REG(s->script_000->_localsBlock->_locals[s->seekSpecial])); - } -#endif - -#if 0 - if (!g_debugState.debugging) - return; -#endif - if (g_debugState.seeking && !g_debugState.breakpointWasHit) { // Are we looking for something special? if (g_debugState.seeking == kDebugSeekStepOver) { // are we above seek-level? resume then diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 00448f5d51..e48a9cdfda 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -33,59 +33,6 @@ namespace Sci { -#if 0 - -#define VOCAB_RESOURCE_CLASSES 996 -/** - * Vocabulary class names. - * These strange names were taken from an SCI01 interpreter. - */ -const char *class_names[] = {"", - "", - "conj", // conjunction - "ass", // ? - "pos", // preposition ? - "art", // article - "adj", // adjective - "pron", // pronoun - "noun", // noun - "auxv", // auxillary verb - "adv", // adverb - "verb", // verb - "", - "", - "", - "" - }; - -int *vocab_get_classes(ResourceManager *resMan, int* count) { - Resource* r; - int *c; - unsigned int i; - - if ((r = resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_CLASSES), 0)) == NULL) - return 0; - - c = (int *)malloc(sizeof(int) * r->size / 2); - for (i = 2; i < r->size; i += 4) { - c[i/4] = READ_LE_UINT16(r->data + i); - } - *count = r->size / 4; - - return c; -} - -int vocab_get_class_count(ResourceManager *resMan) { - Resource* r; - - if ((r = resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_CLASSES), 0)) == 0) - return 0; - - return r->size / 4; -} - -#endif - Vocabulary::Vocabulary(ResourceManager *resMan) : _resMan(resMan) { _parserRules = NULL; _vocabVersion = kVocabularySCI0; diff --git a/engines/sci/sound/iterator/core.cpp b/engines/sci/sound/iterator/core.cpp index e2e62c83b7..9ecd00f54c 100644 --- a/engines/sci/sound/iterator/core.cpp +++ b/engines/sci/sound/iterator/core.cpp @@ -384,50 +384,6 @@ void SfxState::thawTime() { } } -#if 0 -// Unreferenced - removed -static void _dump_playing_list(SfxState *self, char *msg) { - Song *song = self->_song; - - fprintf(stderr, "[] Song list : [ "); - song = *(self->_songlib.lib); - while (song) { - fprintf(stderr, "%08lx:%d ", song->handle, song->_status); - song = song->_nextPlaying; - } - fprintf(stderr, "]\n"); - - fprintf(stderr, "[] Play list (%s) : [ " , msg); - - while (song) { - fprintf(stderr, "%08lx ", song->handle); - song = song->_nextPlaying; - } - - fprintf(stderr, "]\n"); -} -#endif - -#if 0 -static void _dump_songs(SfxState *self) { - Song *song = self->_song; - - fprintf(stderr, "Cue iterators:\n"); - song = *(self->_songlib.lib); - while (song) { - fprintf(stderr, " **\tHandle %08x (p%d): status %d\n", - song->handle, song->_priority, song->_status); - SIMSG_SEND(song->_it, SIMSG_PRINT(1)); - song = song->_next; - } - - if (self->_player) { - fprintf(stderr, "Audio iterator:\n"); - self->_player->iterator_message(SongIterator::Message(0, SIMSG_PRINT(1))); - } -} -#endif - bool SfxState::isPlaying(Song *song) { Song *playing_song = _song; diff --git a/engines/sci/sound/iterator/iterator.cpp b/engines/sci/sound/iterator/iterator.cpp index 5d9d63e5af..62560b631f 100644 --- a/engines/sci/sound/iterator/iterator.cpp +++ b/engines/sci/sound/iterator/iterator.cpp @@ -187,20 +187,6 @@ int BaseSongIterator::parseMidiCommand(byte *buf, int *result, SongIteratorChann midi_channel = cmd & 0xf; paramsleft = MIDI_cmdlen[midi_op]; -#if 0 - if (1) { - fprintf(stderr, "[IT]: off=%x, cmd=%02x, takes %d args ", - channel->offset - 1, cmd, paramsleft); - fprintf(stderr, "[%02x %02x <%02x> %02x %02x %02x]\n", - _data[channel->offset-3], - _data[channel->offset-2], - _data[channel->offset-1], - _data[channel->offset], - _data[channel->offset+1], - _data[channel->offset+2]); - } -#endif - buf[0] = cmd; @@ -285,25 +271,6 @@ int BaseSongIterator::parseMidiCommand(byte *buf, int *result, SongIteratorChann case SCI_MIDI_SET_POLYPHONY: _polyphony[midi_channel] = buf[2]; - -#if 0 - { - Sci1SongIterator *self1 = (Sci1SongIterator *)this; - int i; - int voices = 0; - for (i = 0; i < self1->_numChannels; i++) { - voices += _polyphony[i]; - } - - printf("SET_POLYPHONY(%d, %d) for a total of %d voices\n", midi_channel, buf[2], voices); - printf("[iterator] DEBUG: Polyphony = [ "); - for (i = 0; i < self1->_numChannels; i++) - printf("%d ", _polyphony[i]); - printf("]\n"); - printf("[iterator] DEBUG: Importance = [ "); - printf("]\n"); - } -#endif break; case SCI_MIDI_SET_REVERB: @@ -359,18 +326,6 @@ int BaseSongIterator::parseMidiCommand(byte *buf, int *result, SongIteratorChann return 0; } else { -#if 0 - /* Perform remapping, if neccessary */ - if (cmd != SCI_MIDI_SET_SIGNAL - && cmd < 0xf0) { /* Not a generic command */ - int chan = cmd & 0xf; - int op = cmd & 0xf0; - - chan = channel_remap[chan]; - buf[0] = chan | op; - } -#endif - /* Process as normal MIDI operation */ return 0; } -- cgit v1.2.3 From 8db94ef9913713185dafebfd040b6f08611f903d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 21:38:45 +0000 Subject: Cleanup svn-id: r50404 --- engines/sci/engine/script.h | 2 -- engines/sci/engine/vm.cpp | 3 --- 2 files changed, 5 deletions(-) diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 5396a7432e..296570c218 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -34,8 +34,6 @@ namespace Sci { struct EngineState; class ResourceManager; -#define SCI_SCRIPTS_NR 1000 - enum ScriptObjectTypes { SCI_OBJ_TERMINATOR, SCI_OBJ_OBJECT, diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f59cf4a577..a69a142e10 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -826,9 +826,6 @@ static void gcCountDown(EngineState *s) { } } -static const byte _fake_return_buffer[2] = {op_ret << 1, op_ret << 1}; - - int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4]) { uint offset = 0; extOpcode = src[offset++]; // Get "extended" opcode (lower bit has special meaning) -- cgit v1.2.3 From a887d4898db9c954f29972e8bfb5155659069e4b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 27 Jun 2010 21:41:30 +0000 Subject: SCI: tell midiparser that he lost ownership of channels in case we take them away svn-id: r50405 --- engines/sci/sound/midiparser_sci.cpp | 6 ++++++ engines/sci/sound/midiparser_sci.h | 1 + engines/sci/sound/music.cpp | 2 ++ 3 files changed, 9 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 50a2407dde..099d4572be 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -648,6 +648,12 @@ void MidiParser_SCI::tryToOwnChannels() { } } +void MidiParser_SCI::lostChannels() { + for (int curChannel = 0; curChannel < 15; curChannel++) + if ((_channelUsed[curChannel]) && (curChannel != 9)) + _channelRemap[curChannel] = -1; +} + void MidiParser_SCI::setVolume(byte volume) { // FIXME: This receives values > 127... throw a warning for now and clip the variable if (volume > MUSIC_VOLUME_MAX) { diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index dbd37018b1..8b796d01fc 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -81,6 +81,7 @@ public: const byte *getMixedData() const { return _mixedData; } void tryToOwnChannels(); + void lostChannels(); void sendFromScriptToDriver(uint32 midi); void sendToDriver(uint32 midi); void sendToDriver(byte status, byte firstOp, byte secondOp) { diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index d1555ca7a6..f10ff6d09a 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -287,6 +287,8 @@ void SciMusic::freeChannels(MusicEntry *caller) { if (_usedChannel[i] == caller) _usedChannel[i] = 0; } + // Also tell midiparser, that he lost ownership + caller->pMidiParser->lostChannels(); } void SciMusic::soundPlay(MusicEntry *pSnd) { -- cgit v1.2.3 From 048ceb73d36e4729cb9c8dde292043c32a554234 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 27 Jun 2010 23:20:08 +0000 Subject: SCI: Removed the hack for loading games from the launcher from run_vm(). This is now done on startup. This should fix loading from the launcher for LSL6 svn-id: r50406 --- engines/sci/engine/selector.cpp | 1 + engines/sci/engine/selector.h | 2 ++ engines/sci/engine/state.cpp | 14 +++++++----- engines/sci/engine/state.h | 2 -- engines/sci/engine/vm.cpp | 50 +++++++++++------------------------------ engines/sci/sci.cpp | 27 +++++++++++++++++++--- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 00480743cc..155aa83883 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -161,6 +161,7 @@ void Kernel::mapSelectors() { FIND_SELECTOR(maxScale); FIND_SELECTOR(vanishingX); FIND_SELECTOR(vanishingY); + FIND_SELECTOR(init); FIND_SELECTOR(iconIndex); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index acb7912d8d..1fff7caac8 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -103,6 +103,8 @@ struct SelectorCache { // perform Selector moveDone; ///< used for DoBresen + Selector init; ///< Used for menu initialization when loading from the launcher + // SCI1 selectors which have been moved a bit in SCI1.1, but otherwise static Selector cantBeHere; ///< Checks for movement avoidance in SCI1+. Replaces canBeHere Selector topString; ///< SCI1 scroll lists use this instead of lsTop diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 4b99097476..9bd8f380a1 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -145,12 +145,14 @@ void EngineState::setRoomNumber(uint16 roomNumber) { } void EngineState::shrinkStackToBase() { - uint size = executionStackBase + 1; - assert(_executionStack.size() >= size); - Common::List::iterator iter = _executionStack.begin(); - for (uint i = 0; i < size; ++i) - ++iter; - _executionStack.erase(iter, _executionStack.end()); + if (_executionStack.size() > 0) { + uint size = executionStackBase + 1; + assert(_executionStack.size() >= size); + Common::List::iterator iter = _executionStack.begin(); + for (uint i = 0; i < size; ++i) + ++iter; + _executionStack.erase(iter, _executionStack.end()); + } } static kLanguage charToLanguage(const char c) { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index b47b739007..2fcad5b2e4 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -152,8 +152,6 @@ public: SegmentId variablesSegment[4]; ///< Same as above, contains segment IDs int variablesMax[4]; ///< Max. values for all variables - int loadFromLauncher; - AbortGameState abortScriptProcessing; bool gameWasRestarted; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a69a142e10..d819db3d08 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -758,48 +758,24 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { xstack->selector = kernelFuncNr; xstack->type = EXEC_STACK_TYPE_KERNEL; - //warning("callk %s", kernelFunc.origName.c_str()); - - // TODO: SCI2.1 equivalent - if (s->loadFromLauncher >= 0 && ( - (kernelFuncNr == 0x8 && getSciVersion() <= SCI_VERSION_1_1) || // DrawPic - (kernelFuncNr == 0x3d && getSciVersion() == SCI_VERSION_2) // GetSaveDir - //(kernelFuncNum == 0x28 && getSciVersion() == SCI_VERSION_2_1) // AddPlane - )) { - - // A game is being loaded from the launcher, and the game is about to draw something on - // screen, hence all initialization has taken place (i.e. menus have been constructed etc). - // Therefore, inject a kRestoreGame call here, instead of the requested function. - // The restore call is injected here mainly for games which have a menu, as the menu is - // constructed when the game starts and is not reconstructed when a saved game is loaded. - int saveSlot = s->loadFromLauncher; - s->loadFromLauncher = -1; // invalidate slot, so that we don't load again - - if (saveSlot < 0) - error("Requested to load invalid save slot"); // should never happen, really - - reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL) - kRestoreGame(s, 2, restoreArgv); - } else { - // Call kernel function - s->r_acc = kernelFunc.func(s, argc, argv); + // Call kernel function + s->r_acc = kernelFunc.func(s, argc, argv); #if 0 - // Used for debugging - Common::String debugMsg = kernelFunc.origName + - Common::String::printf("[0x%x]", kernelFuncNum) + - Common::String::printf(", %d params: ", argc) + - " ("; + // Used for debugging + Common::String debugMsg = kernelFunc.origName + + Common::String::printf("[0x%x]", kernelFuncNum) + + Common::String::printf(", %d params: ", argc) + + " ("; - for (int i = 0; i < argc; i++) { - debugMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - debugMsg += (i == argc - 1 ? ")" : ", "); - } + for (int i = 0; i < argc; i++) { + debugMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + debugMsg += (i == argc - 1 ? ")" : ", "); + } - debugMsg += ", result: " + Common::String::printf("%04x:%04x", PRINT_REG(s->r_acc)); - debug("%s", debugMsg.c_str()); + debugMsg += ", result: " + Common::String::printf("%04x:%04x", PRINT_REG(s->r_acc)); + debug("%s", debugMsg.c_str()); #endif - } // Remove callk stack frame again, if there's still an execution stack if (s->_executionStack.begin() != s->_executionStack.end()) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 8a41d74b7f..9a80420a12 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -306,9 +306,30 @@ Common::Error SciEngine::run() { // Check whether loading a savestate was requested if (ConfMan.hasKey("save_slot")) { - _gamestate->loadFromLauncher = ConfMan.getInt("save_slot"); - } else { - _gamestate->loadFromLauncher = -1; + reg_t restoreArgv[2] = { NULL_REG, make_reg(0, ConfMan.getInt("save_slot")) }; // special call (argv[0] is NULL) + kRestoreGame(_gamestate, 2, restoreArgv); + + // Initialize the game menu, if there is one. + // This is not done when loading, so we must do it manually. + reg_t menuBarObj = _gamestate->_segMan->findObjectByName("MenuBar"); + if (menuBarObj.isNull()) + menuBarObj = _gamestate->_segMan->findObjectByName("menuBar"); // LSL6 + if (!menuBarObj.isNull()) { + // Game menus are found in SCI0-SCI01 games (but not in demos), which had a selector vocabulary, + // thus the following code should always work (at least theoretically). + // The init selector is being moved around in all games, thus adding it to the list of static + // selectors can be tricky. An alternative way would be to call the first method of the + // MenuBar object (which is init), but this will require refactoring. + if (_kernel->_selectorCache.init != -1) { + // Reset abortScriptProcessing before initializing the game menu, so that the + // VM call performed by invokeSelector will actually run. + _gamestate->abortScriptProcessing = kAbortNone; + invokeSelector(_gamestate, menuBarObj, SELECTOR(init), 0, _gamestate->stack_base); + _gamestate->abortScriptProcessing = kAbortLoadGame; + } else { + warning("Game has a menu but not a selector vocabulary, skipping menu initialization"); + } + } } runGame(); -- cgit v1.2.3 From c7554c267e6eaf8457611c44476143a54bbb66c0 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Mon, 28 Jun 2010 04:04:16 +0000 Subject: Implement shortcuts for switching items in the inventory slash: switch between the last held item and normal mouse comma, period: replace the currently held item with the previous/next item in the inventory Also, commented a bit better what happens when ESCAPE is present with respect to map programs and cut-scenes. svn-id: r50407 --- engines/draci/draci.cpp | 31 ++++++++----- engines/draci/game.cpp | 110 ++++++++++++++++++++++++++++++++++++----------- engines/draci/game.h | 8 ++++ engines/draci/script.cpp | 2 + 4 files changed, 115 insertions(+), 36 deletions(-) diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index a87e9a476d..ee883f9881 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -253,19 +253,20 @@ void DraciEngine::handleEvents() { if (escRoom >= 0) { // Schedule room change - // TODO: gate 0 (always present) is not - // always best for returning from the - // map, e.g. in the starting location. - // also, after loading the game, we - // shouldn't run any gate program, but - // rather restore the state of all - // objects. + // TODO: gate 0 (always present) is not always best for + // returning from the map, e.g. in the starting location. + // also, after loading the game, we shouldn't run any gate + // program, but rather restore the state of all objects. _game->scheduleEnteringRoomUsingGate(escRoom, 0); - // Immediately cancel any running animation or dubbing. + // Immediately cancel any running animation or dubbing and + // end any currently running GPL programs. In the intro it + // works as intended---skipping the rest of it. + // + // In the map, this causes that animation on newly + // discovered locations will be re-run next time and + // cut-scenes won't be played. _game->setExitLoop(true); - - // End any currently running GPL programs _script->endCurrentProgram(true); } break; @@ -301,6 +302,16 @@ void DraciEngine::handleEvents() { openMainMenuDialog(); } break; + case Common::KEYCODE_COMMA: + case Common::KEYCODE_PERIOD: + case Common::KEYCODE_SLASH: + if ((_game->getLoopStatus() == kStatusOrdinary || + _game->getLoopStatus() == kStatusInventory) && + _game->getLoopSubstatus() == kOuterLoop && + _game->getRoomNum() != _game->getMapRoom()) { + _game->inventorySwitch(event.kbd.keycode); + } + break; default: break; } diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 23cb4700c1..4ae0b71280 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -23,6 +23,7 @@ * */ +#include "common/keyboard.h" #include "common/serializer.h" #include "common/stream.h" #include "common/system.h" @@ -202,7 +203,8 @@ void Game::init() { _animUnderCursor = NULL; _currentItem = _itemUnderCursor = NULL; - + _previousItemPosition = -1; + _vm->_mouse->setCursorType(kHighlightedCursor); // anything different from kNormalCursor _objUnderCursor = NULL; @@ -272,8 +274,8 @@ void Game::handleOrdinaryLoop(int x, int y) { if (_vm->_mouse->lButtonPressed()) { _vm->_mouse->lButtonSet(false); - if (_currentItem) { - putItem(_currentItem, 0); + if (getCurrentItem()) { + putItem(getCurrentItem(), getPreviousItemPosition()); updateOrdinaryCursor(); } else { if (_objUnderCursor) { @@ -327,6 +329,16 @@ void Game::handleOrdinaryLoop(int x, int y) { } } +int Game::inventoryPositionFromMouse() { + const int column = CLIP(scummvm_lround( + (_vm->_mouse->getPosX() - kInventoryX + kInventoryItemWidth / 2.) / + kInventoryItemWidth) - 1, 0L, (long) kInventoryColumns - 1); + const int line = CLIP(scummvm_lround( + (_vm->_mouse->getPosY() - kInventoryY + kInventoryItemHeight / 2.) / + kInventoryItemHeight) - 1, 0L, (long) kInventoryLines - 1); + return line * kInventoryColumns + column; +} + void Game::handleInventoryLoop() { if (_loopSubstatus != kOuterLoop) { return; @@ -353,19 +365,12 @@ void Game::handleInventoryLoop() { // If there is an inventory item under the cursor and we aren't // holding any item, run its look GPL program - if (_itemUnderCursor && !_currentItem) { + if (_itemUnderCursor && !getCurrentItem()) { _vm->_script->runWrapper(_itemUnderCursor->_program, _itemUnderCursor->_look, true, false); // Otherwise, if we are holding an item, try to place it inside the // inventory - } else if (_currentItem) { - const int column = CLIP(scummvm_lround( - (_vm->_mouse->getPosX() - kInventoryX + kInventoryItemWidth / 2.) / - kInventoryItemWidth) - 1, 0L, (long) kInventoryColumns - 1); - const int line = CLIP(scummvm_lround( - (_vm->_mouse->getPosY() - kInventoryY + kInventoryItemHeight / 2.) / - kInventoryItemHeight) - 1, 0L, (long) kInventoryLines - 1); - const int index = line * kInventoryColumns + column; - putItem(_currentItem, index); + } else if (getCurrentItem()) { + putItem(getCurrentItem(), inventoryPositionFromMouse()); updateInventoryCursor(); } } else if (_vm->_mouse->rButtonPressed()) { @@ -381,8 +386,9 @@ void Game::handleInventoryLoop() { // The first is that there is no item in our hands. // In that case, just take the inventory item from the inventory. - if (!_currentItem) { - _currentItem = _itemUnderCursor; + if (!getCurrentItem()) { + setCurrentItem(_itemUnderCursor); + setPreviousItemPosition(inventoryPositionFromMouse()); removeItem(_itemUnderCursor); // The second is that there *is* an item in our hands. @@ -623,10 +629,10 @@ void Game::updateOrdinaryCursor() { // If there is no game object under the cursor, try using the room itself if (!_objUnderCursor) { if (_vm->_script->testExpression(_currentRoom._program, _currentRoom._canUse)) { - if (!_currentItem) { + if (!getCurrentItem()) { _vm->_mouse->setCursorType(kHighlightedCursor); } else { - _vm->_mouse->loadItemCursor(_currentItem, true); + _vm->_mouse->loadItemCursor(getCurrentItem(), true); } mouseChanged = true; } @@ -637,10 +643,10 @@ void Game::updateOrdinaryCursor() { // update the cursor image (highlight it). if (_objUnderCursor->_walkDir == 0) { if (_vm->_script->testExpression(_objUnderCursor->_program, _objUnderCursor->_canUse)) { - if (!_currentItem) { + if (!getCurrentItem()) { _vm->_mouse->setCursorType(kHighlightedCursor); } else { - _vm->_mouse->loadItemCursor(_currentItem, true); + _vm->_mouse->loadItemCursor(getCurrentItem(), true); } mouseChanged = true; } @@ -654,10 +660,10 @@ void Game::updateOrdinaryCursor() { // Load the appropriate cursor (item image if an item is held or ordinary cursor // if not) if (!mouseChanged) { - if (!_currentItem) { + if (!getCurrentItem()) { _vm->_mouse->setCursorType(kNormalCursor); } else { - _vm->_mouse->loadItemCursor(_currentItem, false); + _vm->_mouse->loadItemCursor(getCurrentItem(), false); } } } @@ -668,19 +674,19 @@ void Game::updateInventoryCursor() { if (_itemUnderCursor) { if (_vm->_script->testExpression(_itemUnderCursor->_program, _itemUnderCursor->_canUse)) { - if (!_currentItem) { + if (!getCurrentItem()) { _vm->_mouse->setCursorType(kHighlightedCursor); } else { - _vm->_mouse->loadItemCursor(_currentItem, true); + _vm->_mouse->loadItemCursor(getCurrentItem(), true); } mouseChanged = true; } } if (!mouseChanged) { - if (!_currentItem) { + if (!getCurrentItem()) { _vm->_mouse->setCursorType(kNormalCursor); } else { - _vm->_mouse->loadItemCursor(_currentItem, false); + _vm->_mouse->loadItemCursor(getCurrentItem(), false); } } } @@ -732,6 +738,8 @@ const GameObject *Game::getObjectWithAnimation(const Animation *anim) const { } void Game::removeItem(GameItem *item) { + if (!item) + return; for (uint i = 0; i < kInventorySlots; ++i) { if (_inventory[i] == item) { _inventory[i] = NULL; @@ -753,7 +761,7 @@ void Game::loadItemAnimation(GameItem *item) { void Game::putItem(GameItem *item, int position) { // Empty our hands - _currentItem = NULL; + setCurrentItem(NULL); if (!item) return; @@ -767,6 +775,7 @@ void Game::putItem(GameItem *item, int position) { break; } } + setPreviousItemPosition(position); const int line = position / kInventoryColumns + 1; const int column = position % kInventoryColumns + 1; @@ -854,6 +863,55 @@ void Game::inventoryReload() { for (uint i = 0; i < kInventorySlots; ++i) { putItem(_inventory[i], i); } + setPreviousItemPosition(0); +} + +void Game::inventorySwitch(int keycode) { + switch (keycode) { + case Common::KEYCODE_SLASH: + // Switch between holding an item and the ordinary mouse cursor. + if (!getCurrentItem()) { + if (getPreviousItemPosition() >= 0) { + GameItem* last_item = _inventory[getPreviousItemPosition()]; + setCurrentItem(last_item); + removeItem(last_item); + } + } else { + putItem(getCurrentItem(), getPreviousItemPosition()); + } + break; + case Common::KEYCODE_COMMA: + case Common::KEYCODE_PERIOD: + // Iterate between the items in the inventory. + if (getCurrentItem()) { + assert(getPreviousItemPosition() >= 0); + int direction = keycode == Common::KEYCODE_PERIOD ? +1 : -1; + // Find the next available item. + int pos = getPreviousItemPosition() + direction; + while (true) { + if (pos < 0) + pos += kInventorySlots; + else if (pos >= kInventorySlots) + pos -= kInventorySlots; + if (pos == getPreviousItemPosition() || _inventory[pos]) { + break; + } + pos += direction; + } + // Swap it with the current item. + putItem(getCurrentItem(), getPreviousItemPosition()); + GameItem* new_item = _inventory[pos]; + setCurrentItem(new_item); + setPreviousItemPosition(pos); + removeItem(new_item); + } + break; + } + if (getRoomNum() != getMapRoom()) { + updateOrdinaryCursor(); + } else { + updateInventoryCursor(); + } } void Game::dialogueMenu(int dialogueID) { diff --git a/engines/draci/game.h b/engines/draci/game.h index 3d02489da7..1c8cc68a35 100644 --- a/engines/draci/game.h +++ b/engines/draci/game.h @@ -255,6 +255,8 @@ public: GameItem *getItem(int id) { return id >= 0 && id < (int) _info._numItems ? &_items[id] : NULL; } GameItem *getCurrentItem() const { return _currentItem; } void setCurrentItem(GameItem *item) { _currentItem = item; } + int getPreviousItemPosition() const { return _previousItemPosition; } + void setPreviousItemPosition(int pos) { _previousItemPosition = pos; } void removeItem(GameItem *item); void loadItemAnimation(GameItem *item); void putItem(GameItem *item, int position); @@ -292,6 +294,7 @@ public: void inventoryDraw(); void inventoryDone(); void inventoryReload(); + void inventorySwitch(int keycode); void dialogueMenu(int dialogueID); int dialogueDraw(); @@ -325,6 +328,7 @@ public: private: void updateOrdinaryCursor(); void updateInventoryCursor(); + int inventoryPositionFromMouse(); void handleOrdinaryLoop(int x, int y); void handleInventoryLoop(); void handleDialogueLoop(); @@ -353,6 +357,10 @@ private: GameItem *_currentItem; GameItem *_itemUnderCursor; + // Last position in the inventory of the item currently in the hands, resp. of the item that + // was last in our hands. + int _previousItemPosition; + GameItem *_inventory[kInventorySlots]; Room _currentRoom; diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index a366740526..f46153ccc5 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -553,6 +553,7 @@ void Script::icoStat(const Common::Array ¶ms) { // arrow leading outside a location), set it to standard. if (_vm->_game->getCurrentItem() == item) { _vm->_game->setCurrentItem(NULL); + _vm->_game->setPreviousItemPosition(-1); if (_vm->_mouse->getCursorType() >= kItemCursor) { _vm->_mouse->setCursorType(kNormalCursor); } @@ -561,6 +562,7 @@ void Script::icoStat(const Common::Array ¶ms) { } else { _vm->_game->loadItemAnimation(item); _vm->_game->setCurrentItem(item); + _vm->_game->setPreviousItemPosition(0); // next time, try to place the item from the beginning _vm->_mouse->loadItemCursor(item, false); } } -- cgit v1.2.3 From d4a0c8a1ad162aaa8d7f207161cbe61abc458d4c Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Mon, 28 Jun 2010 04:16:00 +0000 Subject: bugfix for the item fast-switching commit svn-id: r50408 --- engines/draci/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 4ae0b71280..c39b763987 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -907,7 +907,7 @@ void Game::inventorySwitch(int keycode) { } break; } - if (getRoomNum() != getMapRoom()) { + if (getLoopStatus() == kStatusOrdinary) { updateOrdinaryCursor(); } else { updateInventoryCursor(); -- cgit v1.2.3 From 76b8c33aaf964dab911b00e616e7800110dd780c Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Mon, 28 Jun 2010 04:59:13 +0000 Subject: Fade palette in/out when entering/leaving a location svn-id: r50409 --- engines/draci/game.cpp | 30 +++++++++++++++++++++++++----- engines/draci/game.h | 12 ++++++++++-- engines/draci/script.cpp | 2 +- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index c39b763987..23c50b8f63 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -176,6 +176,9 @@ void Game::start() { // Call the outer loop doing all the hard job. loop(kOuterLoop, false); + // Fade out the palette after leaving the location. + fadePalette(true); + if (!isReloaded()) { // We are changing location. Run the hero's LOOK // program to trigger a possible cut-scene. This is @@ -428,6 +431,22 @@ void Game::handleDialogueLoop() { } } +void Game::fadePalette(bool fading_out) { + const byte *startPal = NULL; + const byte *endPal = _currentRoom._palette >= 0 + ? _vm->_paletteArchive->getFile(_currentRoom._palette)->_data + : NULL; + if (fading_out) { + startPal = endPal; + endPal = NULL; + } + for (int i = 1; i <= kBlackFadingIterations; ++i) { + _vm->_system->delayMillis(kBlackFadingTimeUnit); + _vm->_screen->interpolatePalettes(startPal, endPal, 0, kNumColours, i, kBlackFadingIterations); + _vm->_screen->copyToScreen(); + } +} + void Game::advanceAnimationsAndTestLoopExit() { // Fade the palette if requested if (_fadePhase > 0 && (_vm->_system->getMillis() - _fadeTick) >= kFadingTimeUnit) { @@ -485,7 +504,7 @@ void Game::advanceAnimationsAndTestLoopExit() { // callbacks) and redraw screen _vm->_anims->drawScene(_vm->_screen->getSurface()); _vm->_screen->copyToScreen(); - _vm->_system->delayMillis(20); + _vm->_system->delayMillis(kTimeUnit); // If the hero has arrived at his destination, after even the last // phase was correctly animated, run the callback. @@ -1364,10 +1383,11 @@ void Game::enterNewRoom() { loadRoomObjects(); loadOverlays(); - // Set room palette - const BAFile *f; - f = _vm->_paletteArchive->getFile(_currentRoom._palette); - _vm->_screen->setPalette(f->_data, 0, kNumColours); + // Draw the scene with the black palette and slowly fade into the right palette. + _vm->_screen->setPalette(NULL, 0, kNumColours); + _vm->_anims->drawScene(_vm->_screen->getSurface()); + _vm->_screen->copyToScreen(); + fadePalette(false); // Run the program for the gate the dragon came through debugC(6, kDraciLogicDebugLevel, "Running program for gate %d", _newGate); diff --git a/engines/draci/game.h b/engines/draci/game.h index 1c8cc68a35..275293074e 100644 --- a/engines/draci/game.h +++ b/engines/draci/game.h @@ -65,9 +65,16 @@ enum SpeechConstants { kStandardSpeed = 60 }; -// One fading phase is 50ms. enum FadeConstants { - kFadingTimeUnit = 50 + // One fading phase called from the game scripts is 50ms. + kFadingTimeUnit = 50, + // Fading in/out when entering/leaving a location takes 15 iterations of (at least) 7ms each. + kBlackFadingIterations = 15, + kBlackFadingTimeUnit = 7 +}; + +enum AnimationConstants { + kTimeUnit = 20 }; /** Inventory related magical constants */ @@ -334,6 +341,7 @@ private: void handleDialogueLoop(); void updateTitle(int x, int y); void updateCursor(); + void fadePalette(bool fading_out); void advanceAnimationsAndTestLoopExit(); void handleStatusChangeByMouse(); diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index f46153ccc5..0572eb7a81 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -881,7 +881,7 @@ void Script::setPalette(const Common::Array ¶ms) { } // Immediately update the palette _vm->_screen->copyToScreen(); - _vm->_system->delayMillis(20); + _vm->_system->delayMillis(kTimeUnit); } void Script::quitGame(const Common::Array ¶ms) { -- cgit v1.2.3 From 31af2bfe32429563563d5beaa320a23fc035ad71 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 07:42:16 +0000 Subject: SCI: show arguments on selector invoke breakpoint even when VM_DEBUG_SEND is not used, but in a compressed fashion svn-id: r50410 --- engines/sci/engine/vm.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d819db3d08..35f9baef7b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -620,7 +620,28 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt printf(") at %04x:%04x\n", PRINT_REG(funcp)); #endif // VM_DEBUG_SEND if (printSendActions) { - debug("[invoke selector]\n"); + printf("[invoke selector]"); +#ifndef VM_DEBUG_SEND + int displaySize = 0; + for (int argNr = 1; argNr <= argc; argNr++) { + if (argNr == 1) + printf(" - "); + reg_t curParam = argp[argNr]; + if (curParam.segment) { + printf("[%04x:%04x] ", PRINT_REG(curParam)); + displaySize += 12; + } else { + printf("[%04x] ", curParam.offset); + displaySize += 7; + } + if (displaySize > 50) { + if (argNr < argc) + printf("..."); + break; + } + } +#endif + printf("\n"); printSendActions = false; } -- cgit v1.2.3 From 698f10611ccf82b0941b04f7d2bcebfe0c971b84 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 08:16:20 +0000 Subject: SCI: fix regression of r50405 - sq1vga right at the beginning - scripts are pausing sound and then sending manually commands afterwards svn-id: r50411 --- engines/sci/sound/midiparser_sci.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 099d4572be..9cedb86349 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -165,6 +165,12 @@ void MidiParser_SCI::sendFromScriptToDriver(uint32 midi) { // this happens for cmdSendMidi at least in sq1vga right at the start, it's a script issue return; } + if (_channelRemap[midiChannel] == -1) { + // trying to send to an unmapped channel + // this happens for cmdSendMidi at least in sq1vga right at the start, scripts are pausing the sound + // and then sending manually. it's a script issue + return; + } sendToDriver(midi); } -- cgit v1.2.3 From 52ddc711d0bcea3f447c46d25f8c5c959c5ad558 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 28 Jun 2010 08:18:55 +0000 Subject: SCI: separated the graphics initialization code a bit - Moved all of the graphics initialization code on startup inside initGraphics() - Moved all of the screen initialization (resolution, upscaled graphics etc) code inside GfxScreen() svn-id: r50412 --- engines/sci/graphics/screen.cpp | 30 +++++- engines/sci/graphics/screen.h | 2 +- engines/sci/sci.cpp | 207 ++++++++++++++++++---------------------- 3 files changed, 120 insertions(+), 119 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index bcb86e2d6f..ca8a8880b7 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -35,8 +35,34 @@ namespace Sci { -GfxScreen::GfxScreen(ResourceManager *resMan, int16 width, int16 height, int upscaledHires) : - _resMan(resMan), _width(width), _height(height), _upscaledHires(upscaledHires) { +GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { + + // Scale the screen, if needed + _upscaledHires = GFX_SCREEN_UPSCALED_DISABLED; + + // King's Quest 6 and Gabriel Knight 1 have hires content, gk1/cd was able to provide that under DOS as well, but as + // gk1/floppy does support upscaled hires scriptswise, but doesn't actually have the hires content we need to limit + // it to platform windows. + if (g_sci->getPlatform() == Common::kPlatformWindows) { + if (g_sci->getGameId() == GID_KQ6) + _upscaledHires = GFX_SCREEN_UPSCALED_640x440; +#ifdef ENABLE_SCI32 + if (g_sci->getGameId() == GID_GK1) + _upscaledHires = GFX_SCREEN_UPSCALED_640x480; +#endif + } + + if (_resMan->detectHires()) { + _width = 640; + _height = 480; + } else { + _width = 320; + _height = 200; + } + + // Japanese versions of games use hi-res font on upscaled version of the game + if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) + _upscaledHires = GFX_SCREEN_UPSCALED_640x400; _pixels = _width * _height; diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index b2479e9735..d64c2541ec 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -59,7 +59,7 @@ enum GfxScreenMasks { */ class GfxScreen { public: - GfxScreen(ResourceManager *resMan, int16 width = 320, int16 height = 200, int upscaledHires = GFX_SCREEN_UPSCALED_DISABLED); + GfxScreen(ResourceManager *resMan); ~GfxScreen(); uint16 getWidth() { return _width; } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 9a80420a12..822adb592b 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -136,14 +136,35 @@ SciEngine::~SciEngine() { // Remove all of our debug levels here DebugMan.clearAllDebugChannels(); +#ifdef ENABLE_SCI32 + delete _gfxFrameout; +#endif + delete _gfxMenu; + delete _gfxControls; + delete _gfxText16; + delete _gfxAnimate; + delete _gfxPaint; + delete _gfxTransitions; + delete _gfxCompare; + delete _gfxCoordAdjuster; + delete _gfxPorts; + delete _gfxCache; + delete _gfxPalette; + delete _gfxCursor; + delete _gfxScreen; + delete _audio; delete _kernel; delete _vocabulary; delete _console; - delete _resMan; delete _features; delete _gfxMacIconBar; + delete _eventMan; + delete _gamestate->_soundCmd; + delete _gamestate->_segMan; + delete _gamestate; + delete _resMan; // should be deleted last g_sci = 0; } @@ -172,74 +193,12 @@ Common::Error SciEngine::run() { SegManager *segMan = new SegManager(_resMan); - // Scale the screen, if needed - int upscaledHires = GFX_SCREEN_UPSCALED_DISABLED; - - // King's Quest 6 and Gabriel Knight 1 have hires content, gk1/cd was able to provide that under DOS as well, but as - // gk1/floppy does support upscaled hires scriptswise, but doesn't actually have the hires content we need to limit - // it to platform windows. - if (getPlatform() == Common::kPlatformWindows) { - if (_gameId == GID_KQ6) - upscaledHires = GFX_SCREEN_UPSCALED_640x440; -#ifdef ENABLE_SCI32 - if (_gameId == GID_GK1) - upscaledHires = GFX_SCREEN_UPSCALED_640x480; -#endif - } - - // Japanese versions of games use hi-res font on upscaled version of the game - if ((getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) - upscaledHires = GFX_SCREEN_UPSCALED_640x400; - - // Reset all graphics objects - _gfxAnimate = 0; - _gfxCache = 0; - _gfxCompare = 0; - _gfxControls = 0; - _gfxCoordAdjuster = 0; - _gfxCursor = 0; - _gfxMacIconBar = 0; - _gfxMenu = 0; - _gfxPaint = 0; - _gfxPaint16 = 0; - _gfxPalette = 0; - _gfxPorts = 0; - _gfxScreen = 0; - _gfxText16 = 0; - _gfxTransitions = 0; -#ifdef ENABLE_SCI32 - _gfxFrameout = 0; - _gfxPaint32 = 0; -#endif - - // Initialize graphics-related parts - - if (_resMan->detectHires()) - _gfxScreen = new GfxScreen(_resMan, 640, 480); - else - _gfxScreen = new GfxScreen(_resMan, 320, 200, upscaledHires); - + // Initialize the game screen + _gfxScreen = new GfxScreen(_resMan); _gfxScreen->debugUnditherSetState(ConfMan.getBool("undither")); - if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) - _gfxMacIconBar = new GfxMacIconBar(); - - bool paletteMerging = true; - if (getSciVersion() >= SCI_VERSION_1_1) { - // there are some games that use inbetween SCI1.1 interpreter, so we have to detect if it's merging or copying - if (getSciVersion() == SCI_VERSION_1_1) - paletteMerging = _resMan->detectForPaletteMergingForSci11(); - else - paletteMerging = false; - } - - _gfxPalette = new GfxPalette(_resMan, _gfxScreen, paletteMerging); - _gfxCache = new GfxCache(_resMan, _gfxScreen, _gfxPalette); - _gfxCursor = new GfxCursor(_resMan, _gfxPalette, _gfxScreen); - // Create debugger console. It requires GFX to be initialized _console = new Console(this); - _kernel = new Kernel(_resMan, segMan); _features = new GameFeatures(segMan, _kernel); // Only SCI0 and SCI01 games used a parser @@ -257,35 +216,6 @@ Common::Error SciEngine::run() { return Common::kUnknownError; } -#ifdef ENABLE_SCI32 - if (getSciVersion() >= SCI_VERSION_2) { - // SCI32 graphic objects creation - _gfxCoordAdjuster = new GfxCoordAdjuster32(segMan); - _gfxCursor->init(_gfxCoordAdjuster, _eventMan); - _gfxCompare = new GfxCompare(segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); - _gfxPaint32 = new GfxPaint32(g_sci->getResMan(), segMan, g_sci->getKernel(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette); - _gfxPaint = _gfxPaint32; - _gfxFrameout = new GfxFrameout(segMan, g_sci->getResMan(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32); - } else { -#endif - // SCI0-SCI1.1 graphic objects creation - _gfxPorts = new GfxPorts(segMan, _gfxScreen); - _gfxCoordAdjuster = new GfxCoordAdjuster16(_gfxPorts); - _gfxCursor->init(_gfxCoordAdjuster, g_sci->getEventManager()); - _gfxCompare = new GfxCompare(segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); - _gfxTransitions = new GfxTransitions(_gfxScreen, _gfxPalette, g_sci->getResMan()->isVGA()); - _gfxPaint16 = new GfxPaint16(g_sci->getResMan(), segMan, g_sci->getKernel(), _gfxCache, _gfxPorts, _gfxCoordAdjuster, _gfxScreen, _gfxPalette, _gfxTransitions, _audio); - _gfxPaint = _gfxPaint16; - _gfxAnimate = new GfxAnimate(_gamestate, _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen, _gfxPalette, _gfxCursor, _gfxTransitions); - _gfxText16 = new GfxText16(g_sci->getResMan(), _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen); - _gfxControls = new GfxControls(segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen); - _gfxMenu = new GfxMenu(g_sci->getEventManager(), segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen, _gfxCursor); - - _gfxMenu->reset(); -#ifdef ENABLE_SCI32 - } -#endif - _kernel->loadKernelNames(_features); // Must be called after game_init() script_adjust_opcode_formats(); @@ -300,6 +230,7 @@ Common::Error SciEngine::run() { syncSoundSettings(); + // Initialize all graphics related subsystems initGraphics(); debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion())); @@ -336,28 +267,6 @@ Common::Error SciEngine::run() { ConfMan.flushToDisk(); - delete _gamestate->_soundCmd; -#ifdef ENABLE_SCI32 - delete _gfxFrameout; -#endif - delete _gfxMenu; - delete _gfxControls; - delete _gfxText16; - delete _gfxAnimate; - delete _gfxPaint; - delete _gfxTransitions; - delete _gfxCompare; - delete _gfxCoordAdjuster; - delete _gfxPorts; - delete _gfxCache; - delete _gfxPalette; - delete _gfxCursor; - delete _gfxScreen; - - delete _eventMan; - delete segMan; - delete _gamestate; - return Common::kNoError; } @@ -422,6 +331,72 @@ bool SciEngine::initGame() { } void SciEngine::initGraphics() { + + // Reset all graphics objects + _gfxAnimate = 0; + _gfxCache = 0; + _gfxCompare = 0; + _gfxControls = 0; + _gfxCoordAdjuster = 0; + _gfxCursor = 0; + _gfxMacIconBar = 0; + _gfxMenu = 0; + _gfxPaint = 0; + _gfxPaint16 = 0; + _gfxPalette = 0; + _gfxPorts = 0; + _gfxText16 = 0; + _gfxTransitions = 0; +#ifdef ENABLE_SCI32 + _gfxFrameout = 0; + _gfxPaint32 = 0; +#endif + + if (_resMan->isSci11Mac() && getSciVersion() == SCI_VERSION_1_1) + _gfxMacIconBar = new GfxMacIconBar(); + + bool paletteMerging = true; + if (getSciVersion() >= SCI_VERSION_1_1) { + // there are some games that use inbetween SCI1.1 interpreter, so we have to detect if it's merging or copying + if (getSciVersion() == SCI_VERSION_1_1) + paletteMerging = _resMan->detectForPaletteMergingForSci11(); + else + paletteMerging = false; + } + + _gfxPalette = new GfxPalette(_resMan, _gfxScreen, paletteMerging); + _gfxCache = new GfxCache(_resMan, _gfxScreen, _gfxPalette); + _gfxCursor = new GfxCursor(_resMan, _gfxPalette, _gfxScreen); + +#ifdef ENABLE_SCI32 + if (getSciVersion() >= SCI_VERSION_2) { + // SCI32 graphic objects creation + _gfxCoordAdjuster = new GfxCoordAdjuster32(_gamestate->_segMan); + _gfxCursor->init(_gfxCoordAdjuster, _eventMan); + _gfxCompare = new GfxCompare(_gamestate->_segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxPaint32 = new GfxPaint32(g_sci->getResMan(), _gamestate->_segMan, g_sci->getKernel(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette); + _gfxPaint = _gfxPaint32; + _gfxFrameout = new GfxFrameout(_gamestate->_segMan, g_sci->getResMan(), _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32); + } else { +#endif + // SCI0-SCI1.1 graphic objects creation + _gfxPorts = new GfxPorts(_gamestate->_segMan, _gfxScreen); + _gfxCoordAdjuster = new GfxCoordAdjuster16(_gfxPorts); + _gfxCursor->init(_gfxCoordAdjuster, g_sci->getEventManager()); + _gfxCompare = new GfxCompare(_gamestate->_segMan, g_sci->getKernel(), _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxTransitions = new GfxTransitions(_gfxScreen, _gfxPalette, g_sci->getResMan()->isVGA()); + _gfxPaint16 = new GfxPaint16(g_sci->getResMan(), _gamestate->_segMan, g_sci->getKernel(), _gfxCache, _gfxPorts, _gfxCoordAdjuster, _gfxScreen, _gfxPalette, _gfxTransitions, _audio); + _gfxPaint = _gfxPaint16; + _gfxAnimate = new GfxAnimate(_gamestate, _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen, _gfxPalette, _gfxCursor, _gfxTransitions); + _gfxText16 = new GfxText16(g_sci->getResMan(), _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen); + _gfxControls = new GfxControls(_gamestate->_segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen); + _gfxMenu = new GfxMenu(g_sci->getEventManager(), _gamestate->_segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen, _gfxCursor); + + _gfxMenu->reset(); +#ifdef ENABLE_SCI32 + } +#endif + if (_gfxPorts) { _gfxPorts->init(_features->usesOldGfxFunctions(), _gfxPaint16, _gfxText16); _gfxPaint16->init(_gfxAnimate, _gfxText16); -- cgit v1.2.3 From 253036ec4d76492dde59d52264ade1c5730a9643 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 08:25:45 +0000 Subject: SCI: regression from implementing channel remapping and r50405 - center pitch wheels and hold pedal on init instead of unloadMusic(), fixes lsl5 piano scene svn-id: r50413 --- engines/sci/sound/midiparser_sci.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 9cedb86349..cdc2050f8b 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -127,6 +127,14 @@ void MidiParser_SCI::sendInitCommands() { if (_channelUsed[i]) sendToDriver(0xB0 | i, 0x4E, 0); // Reset velocity } + + // Center the pitch wheels and hold pedal in preparation for the next piece of music + for (int i = 0; i < 16; ++i) { + if (_channelUsed[i]) { + sendToDriver(0xE0 | i, 0, 0x40); // Reset pitch wheel + sendToDriver(0xB0 | i, 0x40, 0); // Reset hold pedal + } + } } void MidiParser_SCI::unloadMusic() { @@ -142,17 +150,6 @@ void MidiParser_SCI::unloadMusic() { delete[] _mixedData; _mixedData = NULL; } - - // Center the pitch wheels and hold pedal in preparation for the next piece of music - if (_driver && _pSnd) { - for (int i = 0; i < 16; ++i) { - int16 realChannel = _channelRemap[i]; - if (realChannel != -1) { - _driver->send(0xE0 | realChannel, 0, 0x40); // Reset pitch wheel - _driver->send(0xB0 | realChannel, 0x40, 0); // Reset hold pedal - } - } - } } // this is used for scripts sending midi commands to us. we verify in that case that the channel is actually -- cgit v1.2.3 From e4cb2703ca654ca11bd067f4c2eef2f4631a507f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 09:22:57 +0000 Subject: SCI: implementing real setVolume() support, fixing some fading in sci1 games (like pq3 intro) svn-id: r50414 --- engines/sci/sound/midiparser_sci.cpp | 32 +++++++++++++++++++++++++++++--- engines/sci/sound/midiparser_sci.h | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index cdc2050f8b..5cc5873a72 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -53,7 +53,7 @@ MidiParser_SCI::MidiParser_SCI(SciVersion soundVersion, SciMusic *music) : _ppqn = 1; setTempo(16667); - _volume = 0; + _volume = 127; _signalSet = false; _signalToSet = 0; @@ -88,6 +88,7 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in _channelUsed[i] = false; _channelRemap[i] = -1; _channelMuted[i] = false; + _channelVolume[i] = 127; } _channelRemap[9] = 9; // never map channel 9, because that's used for percussion _channelRemap[15] = 15; // never map channel 15, because thats used by sierra internally @@ -109,9 +110,14 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in } void MidiParser_SCI::sendInitCommands() { + // reset our "global" volume and channel volumes + _volume = 127; + for (int i = 0; i < 16; i++) + _channelVolume[i] = 127; + + // Set initial voice count if (_pSnd) { if (_soundVersion <= SCI_VERSION_0_LATE) { - // Set initial voice count for (int i = 0; i < 15; ++i) { byte voiceCount = 0; if (_channelUsed[i]) { @@ -186,6 +192,17 @@ void MidiParser_SCI::sendToDriver(uint32 midi) { // Is channel muted? if so, don't send command if (_channelMuted[midiChannel]) return; + + if ((midi & 0xFFF0) == 0x07B0) { + // someone trying to set channel volume? + int channelVolume = (midi >> 16) & 0xFF; + // Remember, if we need to set it ourselves + _channelVolume[midiChannel] = channelVolume; + // Adjust volume accordingly to current "global" volume + channelVolume = channelVolume * _volume / 127; + midi = (midi & 0xFFF0) | ((channelVolume & 0xFF) << 16); + } + // Channel remapping int16 realChannel = _channelRemap[midiChannel]; assert(realChannel != -1); @@ -660,14 +677,23 @@ void MidiParser_SCI::lostChannels() { void MidiParser_SCI::setVolume(byte volume) { // FIXME: This receives values > 127... throw a warning for now and clip the variable if (volume > MUSIC_VOLUME_MAX) { - warning("attempted to set an invalid volume(%d)", volume); + // FIXME: please write where we get an invalid volume, so we can track down the issue + error("attempted to set an invalid volume(%d)", volume); volume = MUSIC_VOLUME_MAX; // reset } assert(volume <= MUSIC_VOLUME_MAX); + _volume = volume; + // Send previous channel volumes again to actually update the volume + for (int i = 0; i < 15; i++) + if (_channelRemap[i] != -1) + sendToDriver(0xB0 + i, 7, _channelVolume[i]); + return; + // TODO: old code, should be left here till we figured out that new code works fine if (_volume != volume) { _volume = volume; + switch (_soundVersion) { case SCI_VERSION_0_EARLY: case SCI_VERSION_0_LATE: { diff --git a/engines/sci/sound/midiparser_sci.h b/engines/sci/sound/midiparser_sci.h index 8b796d01fc..90db06e539 100644 --- a/engines/sci/sound/midiparser_sci.h +++ b/engines/sci/sound/midiparser_sci.h @@ -115,6 +115,7 @@ protected: bool _channelUsed[16]; int16 _channelRemap[16]; bool _channelMuted[16]; + byte _channelVolume[16]; }; } // End of namespace Sci -- cgit v1.2.3 From 92cc16e6a5f3b096868a8fa45b923de38d678e5d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 10:00:12 +0000 Subject: SCI: reordering and cleanup, removing debug code from sci0 mix-code svn-id: r50415 --- engines/sci/sound/midiparser_sci.cpp | 468 +++++++++++++++++------------------ 1 file changed, 229 insertions(+), 239 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 5cc5873a72..4503e97628 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -109,6 +109,235 @@ bool MidiParser_SCI::loadMusic(SoundResource::Track *track, MusicEntry *psnd, in return true; } +byte MidiParser_SCI::midiGetNextChannel(long ticker) { + byte curr = 0xFF; + long closest = ticker + 1000000, next = 0; + + for (int i = 0; i < _track->channelCount; i++) { + if (_track->channels[i].time == -1) // channel ended + continue; + SoundResource::Channel *curChannel = &_track->channels[i]; + if (curChannel->curPos >= curChannel->size) + continue; + next = curChannel->data[curChannel->curPos]; // when the next event should occur + if (next == 0xF8) // 0xF8 means 240 ticks delay + next = 240; + next += _track->channels[i].time; + if (next < closest) { + curr = i; + closest = next; + } + } + + return curr; +} + +byte *MidiParser_SCI::midiMixChannels() { + int totalSize = 0; + + for (int i = 0; i < _track->channelCount; i++) { + _track->channels[i].time = 0; + _track->channels[i].prev = 0; + _track->channels[i].curPos = 0; + totalSize += _track->channels[i].size; + } + + byte *outData = new byte[totalSize * 2]; // FIXME: creates overhead and still may be not enough to hold all data + _mixedData = outData; + long ticker = 0; + byte channelNr, curDelta; + byte midiCommand = 0, midiParam, global_prev = 0; + long newDelta; + SoundResource::Channel *channel; + + while ((channelNr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel + channel = &_track->channels[channelNr]; + curDelta = channel->data[channel->curPos++]; + channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the command is supposed to occur + if (curDelta == 0xF8) + continue; + newDelta = channel->time - ticker; + ticker += newDelta; + + midiCommand = channel->data[channel->curPos++]; + if ((midiCommand == 0xCF) && (!ticker)) { + // set signal command at tick 0? + channel->curPos++; + continue; // filter it + // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately + // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to + // get immediately removed, so we currently filter it. + // TODO: find out what exactly happens in sierra sci + } + if (midiCommand != kEndOfTrack) { + // Write delta + while (newDelta > 240) { + *outData++ = 0xF8; + newDelta -= 240; + } + *outData++ = (byte)newDelta; + } + // Write command + switch (midiCommand) { + case 0xF0: // sysEx + *outData++ = midiCommand; + do { + midiParam = channel->data[channel->curPos++]; + *outData++ = midiParam; + } while (midiParam != 0xF7); + break; + case kEndOfTrack: // end of channel + channel->time = -1; + break; + default: // MIDI command + if (midiCommand & 0x80) { + midiParam = channel->data[channel->curPos++]; + } else {// running status + midiParam = midiCommand; + midiCommand = channel->prev; + } + + // remember which channel got used for channel remapping + byte midiChannel = midiCommand & 0xF; + _channelUsed[midiChannel] = true; + + if (midiCommand != global_prev) + *outData++ = midiCommand; + *outData++ = midiParam; + if (nMidiParams[(midiCommand >> 4) - 8] == 2) + *outData++ = channel->data[channel->curPos++]; + channel->prev = midiCommand; + global_prev = midiCommand; + } + } + + // Insert stop event + *outData++ = 0; // Delta + *outData++ = 0xFF; // Meta event + *outData++ = 0x2F; // End of track (EOT) + *outData++ = 0x00; + *outData++ = 0x00; + return _mixedData; +} + +// This is used for SCI0 sound-data. SCI0 only has one stream that may +// contain several channels and according to output device we remove +// certain channels from that data. +byte *MidiParser_SCI::midiFilterChannels(int channelMask) { + SoundResource::Channel *channel = &_track->channels[0]; + byte *channelData = channel->data; + byte *channelDataEnd = channel->data + channel->size; + byte *outData = new byte[channel->size + 5]; + byte curChannel = 15, curByte, curDelta; + byte command = 0, lastCommand = 0; + int delta = 0; + int midiParamCount = 0; + + _mixedData = outData; + + while (channelData < channelDataEnd) { + curDelta = *channelData++; + if (curDelta == 0xF8) { + delta += 240; + continue; + } + delta += curDelta; + curByte = *channelData++; + + switch (curByte) { + case 0xF0: // sysEx + case kEndOfTrack: // end of channel + command = curByte; + curChannel = 15; + break; + default: + if (curByte & 0x80) { + command = curByte; + curChannel = command & 0x0F; + midiParamCount = nMidiParams[(command >> 4) - 8]; + } + } + if ((1 << curChannel) & channelMask) { + if (command != kEndOfTrack) { + // Write delta + while (delta > 240) { + *outData++ = 0xF8; + delta -= 240; + } + *outData++ = (byte)delta; + delta = 0; + } + // Write command + switch (command) { + case 0xF0: // sysEx + *outData++ = command; + do { + curByte = *channelData++; + *outData++ = curByte; // out + } while (curByte != 0xF7); + lastCommand = command; + break; + + case kEndOfTrack: // end of channel + break; + + default: // MIDI command + // remember which channel got used for channel remapping + byte midiChannel = command & 0xF; + _channelUsed[midiChannel] = true; + + if (lastCommand != command) { + *outData++ = command; + lastCommand = command; + } + if (midiParamCount > 0) { + if (curByte & 0x80) + *outData++ = *channelData++; + else + *outData++ = curByte; + } + if (midiParamCount > 1) { + *outData++ = *channelData++; + } + } + } else { + if (curByte & 0x80) + channelData += midiParamCount; + else + channelData += midiParamCount - 1; + } + } + + // Insert stop event + *outData++ = 0; // Delta + *outData++ = 0xFF; // Meta event + *outData++ = 0x2F; // End of track (EOT) + *outData++ = 0x00; + *outData++ = 0x00; + + return _mixedData; +} + +// This will get called right before actual playing and will try to own the used channels +void MidiParser_SCI::tryToOwnChannels() { + // We don't have SciMusic in case debug command show_instruments is used + if (!_music) + return; + for (int curChannel = 0; curChannel < 15; curChannel++) { + if (_channelUsed[curChannel]) { + if (_channelRemap[curChannel] == -1) { + _channelRemap[curChannel] = _music->tryToOwnChannel(_pSnd, curChannel); + } + } + } +} + +void MidiParser_SCI::lostChannels() { + for (int curChannel = 0; curChannel < 15; curChannel++) + if ((_channelUsed[curChannel]) && (curChannel != 9)) + _channelRemap[curChannel] = -1; +} + void MidiParser_SCI::sendInitCommands() { // reset our "global" volume and channel volumes _volume = 127; @@ -435,245 +664,6 @@ void MidiParser_SCI::allNotesOff() { memset(_active_notes, 0, sizeof(_active_notes)); } -byte MidiParser_SCI::midiGetNextChannel(long ticker) { - byte curr = 0xFF; - long closest = ticker + 1000000, next = 0; - - for (int i = 0; i < _track->channelCount; i++) { - if (_track->channels[i].time == -1) // channel ended - continue; - SoundResource::Channel *curChannel = &_track->channels[i]; - if (curChannel->curPos >= curChannel->size) - continue; - next = curChannel->data[curChannel->curPos]; // when the next event should occur - if (next == 0xF8) // 0xF8 means 240 ticks delay - next = 240; - next += _track->channels[i].time; - if (next < closest) { - curr = i; - closest = next; - } - } - - return curr; -} - -byte *MidiParser_SCI::midiMixChannels() { - int totalSize = 0; - - for (int i = 0; i < _track->channelCount; i++) { - _track->channels[i].time = 0; - _track->channels[i].prev = 0; - _track->channels[i].curPos = 0; - totalSize += _track->channels[i].size; - } - - byte *outData = new byte[totalSize * 2]; // FIXME: creates overhead and still may be not enough to hold all data - _mixedData = outData; - long ticker = 0; - byte channelNr, curDelta; - byte midiCommand = 0, midiParam, global_prev = 0; - long newDelta; - SoundResource::Channel *channel; - - while ((channelNr = midiGetNextChannel(ticker)) != 0xFF) { // there is still an active channel - channel = &_track->channels[channelNr]; - curDelta = channel->data[channel->curPos++]; - channel->time += (curDelta == 0xF8 ? 240 : curDelta); // when the command is supposed to occur - if (curDelta == 0xF8) - continue; - newDelta = channel->time - ticker; - ticker += newDelta; - - midiCommand = channel->data[channel->curPos++]; - if ((midiCommand == 0xCF) && (!ticker)) { - // set signal command at tick 0? - channel->curPos++; - continue; // filter it - // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately - // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to - // get immediately removed, so we currently filter it. - // TODO: find out what exactly happens in sierra sci - } - if (midiCommand != kEndOfTrack) { - // Write delta - while (newDelta > 240) { - *outData++ = 0xF8; - newDelta -= 240; - } - *outData++ = (byte)newDelta; - } - // Write command - switch (midiCommand) { - case 0xF0: // sysEx - *outData++ = midiCommand; - do { - midiParam = channel->data[channel->curPos++]; - *outData++ = midiParam; - } while (midiParam != 0xF7); - break; - case kEndOfTrack: // end of channel - channel->time = -1; - break; - default: // MIDI command - if (midiCommand & 0x80) { - midiParam = channel->data[channel->curPos++]; - } else {// running status - midiParam = midiCommand; - midiCommand = channel->prev; - } - - // remember which channel got used for channel remapping - byte midiChannel = midiCommand & 0xF; - _channelUsed[midiChannel] = true; - - if (midiCommand != global_prev) - *outData++ = midiCommand; - *outData++ = midiParam; - if (nMidiParams[(midiCommand >> 4) - 8] == 2) - *outData++ = channel->data[channel->curPos++]; - channel->prev = midiCommand; - global_prev = midiCommand; - } - } - - // Insert stop event - *outData++ = 0; // Delta - *outData++ = 0xFF; // Meta event - *outData++ = 0x2F; // End of track (EOT) - *outData++ = 0x00; - *outData++ = 0x00; - return _mixedData; -} - -// This is used for SCI0 sound-data. SCI0 only has one stream that may -// contain several channels and according to output device we remove -// certain channels from that data. -byte *MidiParser_SCI::midiFilterChannels(int channelMask) { - SoundResource::Channel *channel = &_track->channels[0]; - byte *channelData = channel->data; - byte *channelDataEnd = channel->data + channel->size; - byte *outData = new byte[channel->size + 5]; - byte curChannel = 15, curByte, curDelta; - byte command = 0, lastCommand = 0; - int delta = 0; - int midiParamCount = 0; - - _mixedData = outData; - - while (channelData < channelDataEnd) { - curDelta = *channelData++; - if (curDelta == 0xF8) { - delta += 240; - continue; - } - delta += curDelta; - curByte = *channelData++; - - switch (curByte) { - case 0xF0: // sysEx - case kEndOfTrack: // end of channel - command = curByte; - curChannel = 15; - break; - default: - if (curByte & 0x80) { - command = curByte; - curChannel = command & 0x0F; - midiParamCount = nMidiParams[(command >> 4) - 8]; - } - } - if ((1 << curChannel) & channelMask) { - if (command != kEndOfTrack) { - debugC(4, kDebugLevelSound, "\nDELTA "); - // Write delta - while (delta > 240) { - *outData++ = 0xF8; - debugC(4, kDebugLevelSound, "F8 "); - delta -= 240; - } - *outData++ = (byte)delta; - debugC(4, kDebugLevelSound, "%02X ", delta); - delta = 0; - } - // Write command - switch (command) { - case 0xF0: // sysEx - *outData++ = command; - debugC(4, kDebugLevelSound, "%02X ", command); - do { - curByte = *channelData++; - *outData++ = curByte; // out - } while (curByte != 0xF7); - lastCommand = command; - break; - - case kEndOfTrack: // end of channel - break; - - default: // MIDI command - // remember which channel got used for channel remapping - byte midiChannel = command & 0xF; - _channelUsed[midiChannel] = true; - - if (lastCommand != command) { - *outData++ = command; - debugC(4, kDebugLevelSound, "%02X ", command); - lastCommand = command; - } - if (midiParamCount > 0) { - if (curByte & 0x80) { - debugC(4, kDebugLevelSound, "%02X ", *channelData); - *outData++ = *channelData++; - } else { - debugC(4, kDebugLevelSound, "%02X ", curByte); - *outData++ = curByte; - } - } - if (midiParamCount > 1) { - debugC(4, kDebugLevelSound, "%02X ", *channelData); - *outData++ = *channelData++; - } - } - } else { - if (curByte & 0x80) { - channelData += midiParamCount; - } else { - channelData += midiParamCount - 1; - } - } - } - - // Insert stop event - *outData++ = 0; // Delta - *outData++ = 0xFF; // Meta event - *outData++ = 0x2F; // End of track (EOT) - *outData++ = 0x00; - *outData++ = 0x00; - - return _mixedData; -} - -// This will get called right before actual playing and will try to own the used channels -void MidiParser_SCI::tryToOwnChannels() { - // We don't have SciMusic in case debug command show_instruments is used - if (!_music) - return; - for (int curChannel = 0; curChannel < 15; curChannel++) { - if (_channelUsed[curChannel]) { - if (_channelRemap[curChannel] == -1) { - _channelRemap[curChannel] = _music->tryToOwnChannel(_pSnd, curChannel); - } - } - } -} - -void MidiParser_SCI::lostChannels() { - for (int curChannel = 0; curChannel < 15; curChannel++) - if ((_channelUsed[curChannel]) && (curChannel != 9)) - _channelRemap[curChannel] = -1; -} - void MidiParser_SCI::setVolume(byte volume) { // FIXME: This receives values > 127... throw a warning for now and clip the variable if (volume > MUSIC_VOLUME_MAX) { -- cgit v1.2.3 From 10a9dfc0d7a521d7f9815fd21edc5e7b82d8344c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 10:15:13 +0000 Subject: SCI: added uninit workaround for lsl3 - when accessing set volume menu the first time sound got muted before (because a uninitialized temp was used to do it, would have been 's' in sierra sci) svn-id: r50416 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 35f9baef7b..d247ce1cfb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -279,6 +279,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room + { GID_LSL3, 997, "TheMenuBar", "handleEvent", -1, 1, 0xf }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 928, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon -- cgit v1.2.3 From caa4479bdf593241e3a93525387f98ba4fd969bf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 10:36:10 +0000 Subject: SCI: changed the way setVolume works for sci0 back to the way it was from r50414, because adlib driver doesn't support channel volume changes for sci0 games, fixes fading in those games svn-id: r50417 --- engines/sci/sound/midiparser_sci.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 4503e97628..4172d05888 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -673,20 +673,14 @@ void MidiParser_SCI::setVolume(byte volume) { } assert(volume <= MUSIC_VOLUME_MAX); - _volume = volume; - // Send previous channel volumes again to actually update the volume - for (int i = 0; i < 15; i++) - if (_channelRemap[i] != -1) - sendToDriver(0xB0 + i, 7, _channelVolume[i]); - return; - // TODO: old code, should be left here till we figured out that new code works fine if (_volume != volume) { _volume = volume; - switch (_soundVersion) { case SCI_VERSION_0_EARLY: case SCI_VERSION_0_LATE: { + // SCI0 adlib driver doesn't support channel volumes, so we need to go this way + // TODO: this should take the actual master volume into account int16 globalVolume = _volume * 15 / 127; ((MidiPlayer *)_driver)->setVolume(globalVolume); break; @@ -694,12 +688,10 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: - // sending volume change to all currently mapped channels - // FIXME?: maybe we should better store new volume if music isn't playing currently and adjust volume - // when playing + // Send previous channel volumes again to actually update the volume for (int i = 0; i < 15; i++) if (_channelRemap[i] != -1) - sendToDriver(0xB0 + i, 7, _volume); + sendToDriver(0xB0 + i, 7, _channelVolume[i]); break; default: -- cgit v1.2.3 From 22a8b2236ee57884929b71eb8cbf1adb5a071b37 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 10:48:09 +0000 Subject: SCI: set volume all the time, fixes volume being 0 after fading in sci0 svn-id: r50418 --- engines/sci/sound/midiparser_sci.cpp | 42 +++++++++++++++++------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 4172d05888..2a86ef8942 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -673,30 +673,28 @@ void MidiParser_SCI::setVolume(byte volume) { } assert(volume <= MUSIC_VOLUME_MAX); - if (_volume != volume) { - _volume = volume; - - switch (_soundVersion) { - case SCI_VERSION_0_EARLY: - case SCI_VERSION_0_LATE: { - // SCI0 adlib driver doesn't support channel volumes, so we need to go this way - // TODO: this should take the actual master volume into account - int16 globalVolume = _volume * 15 / 127; - ((MidiPlayer *)_driver)->setVolume(globalVolume); - break; - } + _volume = volume; + + switch (_soundVersion) { + case SCI_VERSION_0_EARLY: + case SCI_VERSION_0_LATE: { + // SCI0 adlib driver doesn't support channel volumes, so we need to go this way + // TODO: this should take the actual master volume into account + int16 globalVolume = _volume * 15 / 127; + ((MidiPlayer *)_driver)->setVolume(globalVolume); + break; + } - case SCI_VERSION_1_EARLY: - case SCI_VERSION_1_LATE: - // Send previous channel volumes again to actually update the volume - for (int i = 0; i < 15; i++) - if (_channelRemap[i] != -1) - sendToDriver(0xB0 + i, 7, _channelVolume[i]); - break; + case SCI_VERSION_1_EARLY: + case SCI_VERSION_1_LATE: + // Send previous channel volumes again to actually update the volume + for (int i = 0; i < 15; i++) + if (_channelRemap[i] != -1) + sendToDriver(0xB0 + i, 7, _channelVolume[i]); + break; - default: - error("MidiParser_SCI::setVolume: Unsupported soundVersion"); - } + default: + error("MidiParser_SCI::setVolume: Unsupported soundVersion"); } } -- cgit v1.2.3 From 4016bdfd271be8f20d6da5bbfad982d2fb7fa24d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:19:27 +0000 Subject: SCI: cleanup svn-id: r50419 --- engines/sci/engine/kgraphics.cpp | 3 +-- engines/sci/engine/vm.cpp | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index b1cd1451d1..c9d3c92603 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1346,8 +1346,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { int flags = argv[3].offset; Common::String flagspec; - if (argc > 3) - { + if (argc > 3) { if (flags & 1) flagspec += "doubled "; if (flags & 2) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d247ce1cfb..555576f579 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -398,7 +398,7 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i } } -#define READ_VAR(type, index, def) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, def) +#define READ_VAR(type, index) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, s->r_acc) #define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); @@ -1654,7 +1654,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lap: // 0x43 (67) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - s->r_acc = READ_VAR(var_type, var_number, s->r_acc); + s->r_acc = READ_VAR(var_type, var_number); break; case op_lsg: // 0x44 (68) @@ -1663,7 +1663,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lsp: // 0x47 (71) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - PUSH32(READ_VAR(var_type, var_number, s->r_acc)); + PUSH32(READ_VAR(var_type, var_number)); break; case op_lagi: // 0x48 (72) @@ -1672,7 +1672,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lapi: // 0x4b (75) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - s->r_acc = READ_VAR(var_type, var_number, s->r_acc); + s->r_acc = READ_VAR(var_type, var_number); break; case op_lsgi: // 0x4c (76) @@ -1681,7 +1681,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lspi: // 0x4f (79) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - PUSH32(READ_VAR(var_type, var_number, s->r_acc)); + PUSH32(READ_VAR(var_type, var_number)); break; case op_sag: // 0x50 (80) @@ -1730,7 +1730,7 @@ void run_vm(EngineState *s, bool restoring) { case op_plusap: // 0x63 (99) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! s->r_acc = pointer_add(s, r_temp, 1); @@ -1745,7 +1745,7 @@ void run_vm(EngineState *s, bool restoring) { case op_plussp: // 0x67 (103) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! r_temp = pointer_add(s, r_temp, 1); @@ -1761,7 +1761,7 @@ void run_vm(EngineState *s, bool restoring) { case op_plusapi: // 0x6b (107) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! s->r_acc = pointer_add(s, r_temp, 1); @@ -1776,7 +1776,7 @@ void run_vm(EngineState *s, bool restoring) { case op_plusspi: // 0x6f (111) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! r_temp = pointer_add(s, r_temp, 1); @@ -1792,7 +1792,7 @@ void run_vm(EngineState *s, bool restoring) { case op_minusap: // 0x73 (115) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! s->r_acc = pointer_add(s, r_temp, -1); @@ -1807,7 +1807,7 @@ void run_vm(EngineState *s, bool restoring) { case op_minussp: // 0x77 (119) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! r_temp = pointer_add(s, r_temp, -1); @@ -1823,7 +1823,7 @@ void run_vm(EngineState *s, bool restoring) { case op_minusapi: // 0x7b (123) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! s->r_acc = pointer_add(s, r_temp, -1); @@ -1838,7 +1838,7 @@ void run_vm(EngineState *s, bool restoring) { case op_minusspi: // 0x7f (127) var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); - r_temp = READ_VAR(var_type, var_number, s->r_acc); + r_temp = READ_VAR(var_type, var_number); if (r_temp.segment) { // Pointer arithmetics! r_temp = pointer_add(s, r_temp, -1); -- cgit v1.2.3 From db2d41a4332c6c2a468f4460a23189a750fb8616 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:19:45 +0000 Subject: SCI: Make src param of GfxScreen::scale2x const svn-id: r50420 --- engines/sci/graphics/screen.cpp | 4 ++-- engines/sci/graphics/screen.h | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index ca8a8880b7..519020f3a1 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -583,9 +583,9 @@ void GfxScreen::debugShowMap(int mapNo) { copyToScreen(); } -void GfxScreen::scale2x(byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { +void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { int newWidth = srcWidth * 2; - byte *srcPtr = src; + const byte *srcPtr = src; for (int y = 0; y < srcHeight; y++) { for (int x = 0; x < srcWidth; x++) { diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index d64c2541ec..c1e10fabc8 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -50,7 +50,9 @@ enum GfxScreenMasks { GFX_SCREEN_MASK_ALL = GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY|GFX_SCREEN_MASK_CONTROL }; -#define SCI_SCREEN_UNDITHERMEMORIAL_SIZE 256 +enum { + SCI_SCREEN_UNDITHERMEMORIAL_SIZE = 256 +}; /** * Screen class, actually creates 3 (4) screens internally - which is visual/display (for the user), @@ -104,7 +106,7 @@ public: void setVerticalShakePos(uint16 shakePos); - void scale2x(byte *src, byte *dst, int16 srcWidth, int16 srcHeight); + void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight); void adjustToUpscaledCoordinates(int16 &y, int16 &x); -- cgit v1.2.3 From 9f48a37671737229e76cd38cf766d855fd2e7318 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:20:14 +0000 Subject: SCI: Add const qualifiers to many GfxView methods and their return values. This helps to ensure proper data encapsulation. Also reformatted some overlong comments to 80 chars per line, and fixed some other code formatting issues. svn-id: r50421 --- engines/sci/graphics/animate.cpp | 8 +-- engines/sci/graphics/compare.cpp | 8 +-- engines/sci/graphics/cursor.cpp | 18 +++--- engines/sci/graphics/frameout.cpp | 4 +- engines/sci/graphics/view.cpp | 113 +++++++++++++++++++++----------------- engines/sci/graphics/view.h | 22 ++++---- 6 files changed, 91 insertions(+), 82 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 491553cebe..6a5bbff6bb 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -267,9 +267,9 @@ void GfxAnimate::fill(byte &old_picNotValid) { // Create rect according to coordinates and given cel if (listEntry->scaleSignal & kScaleSignalDoScaling) { - view->getCelScaledRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->scaleX, listEntry->scaleY, &listEntry->celRect); + view->getCelScaledRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->scaleX, listEntry->scaleY, listEntry->celRect); } else { - view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, &listEntry->celRect); + view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->celRect); } writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), listEntry->celRect.left); writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), listEntry->celRect.top); @@ -583,7 +583,7 @@ void GfxAnimate::addToPicDrawCels() { view = _cache->getView(listEntry->viewId); // Create rect according to coordinates and given cel - view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, &listEntry->celRect); + view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->celRect); // draw corresponding cel _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); @@ -601,7 +601,7 @@ void GfxAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celN Common::Rect celRect; // Create rect according to coordinates and given cel - view->getCelRect(loopNo, celNo, leftPos, topPos, priority, &celRect); + view->getCelRect(loopNo, celNo, leftPos, topPos, priority, celRect); _paint16->drawCel(view, loopNo, celNo, celRect, priority, 0); } diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index a245eefdda..7cd55b1139 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -132,7 +132,7 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { // now get cel rectangle view = _cache->getView(viewId); - view->getCelRect(loopNo, celNo, x, y, z, &celRect); + view->getCelRect(loopNo, celNo, x, y, z, celRect); if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) { writeSelectorValue(_segMan, objectReference, SELECTOR(nsLeft), celRect.left); @@ -175,10 +175,10 @@ bool GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) { bool GfxCompare::kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position) { GfxView *tmpView = _cache->getView(viewId); - CelInfo *celInfo = tmpView->getCelInfo(loopNo, celNo); + const CelInfo *celInfo = tmpView->getCelInfo(loopNo, celNo); position.x = CLIP(position.x, 0, celInfo->width - 1); position.y = CLIP(position.y, 0, celInfo->height - 1); - byte *celData = tmpView->getBitmap(loopNo, celNo); + const byte *celData = tmpView->getBitmap(loopNo, celNo); bool result = (celData[position.y * celInfo->width + position.x] == celInfo->clearKey); return result; } @@ -200,7 +200,7 @@ void GfxCompare::kernelBaseSetter(reg_t object) { GfxView *tmpView = _cache->getView(viewId); Common::Rect celRect; - tmpView->getCelRect(loopNo, celNo, x, y, z, &celRect); + tmpView->getCelRect(loopNo, celNo, x, y, z, celRect); celRect.bottom = y + 1; celRect.top = celRect.bottom - yStep; diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index db42dac3dd..c5f4de9cf5 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -164,12 +164,11 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co GfxView *cursorView = _cachedCursors[viewNum]; - CelInfo *celInfo = cursorView->getCelInfo(loopNum, celNum); + const CelInfo *celInfo = cursorView->getCelInfo(loopNum, celNum); int16 width = celInfo->width; int16 height = celInfo->height; byte clearKey = celInfo->clearKey; Common::Point *cursorHotspot = hotspot; - byte *cursorBitmap; if (!cursorHotspot) // Compute hotspot from xoffset/yoffset @@ -182,24 +181,21 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co return; } - celInfo->rawBitmap = cursorView->getBitmap(loopNum, celNum); + const byte *rawBitmap = cursorView->getBitmap(loopNum, celNum); if (_upscaledHires) { // Scale cursor by 2x - note: sierra didn't do this, but it looks much better width *= 2; height *= 2; cursorHotspot->x *= 2; cursorHotspot->y *= 2; - cursorBitmap = new byte[width * height]; - _screen->scale2x(celInfo->rawBitmap, cursorBitmap, celInfo->width, celInfo->height); + byte *cursorBitmap = new byte[width * height]; + _screen->scale2x(rawBitmap, cursorBitmap, celInfo->width, celInfo->height); + CursorMan.replaceCursor(cursorBitmap, width, height, cursorHotspot->x, cursorHotspot->y, clearKey); + delete[] cursorBitmap; } else { - cursorBitmap = celInfo->rawBitmap; + CursorMan.replaceCursor(rawBitmap, width, height, cursorHotspot->x, cursorHotspot->y, clearKey); } - CursorMan.replaceCursor(cursorBitmap, width, height, cursorHotspot->x, cursorHotspot->y, clearKey); - - if (_upscaledHires) - delete[] cursorBitmap; - kernelShow(); delete cursorHotspot; diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 4247c4db9e..446db82566 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -229,9 +229,9 @@ void GfxFrameout::kernelFrameout() { GfxView *view = _cache->getView(itemEntry->viewId); if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) - view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, &itemEntry->celRect); + view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); else - view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, &itemEntry->celRect); + view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= _screen->getHeight()) continue; diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 5436e426ff..0749d958a0 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -82,10 +82,11 @@ void GfxView::initData(GuiResourceId resourceId) { _embeddedPal = false; _EGAmapping = NULL; - // If we find a SCI1/SCI1.1 view (not amiga), we switch to that type for EGA - // This could get used to make view patches for EGA games, where the new views include more colors - // Users could manually adjust old views to make them look better (like removing dithered colors that aren't - // caught by our undithering or even improve the graphics overall) + // If we find an SCI1/SCI1.1 view (not amiga), we switch to that type for + // EGA. This could get used to make view patches for EGA games, where the + // new views include more colors. Users could manually adjust old views to + // make them look better (like removing dithered colors that aren't caught + // by our undithering or even improve the graphics overall). if (curViewType == kViewEga) { if (_resourceData[1] == 0x80) { curViewType = kViewVga; @@ -110,10 +111,12 @@ void GfxView::initData(GuiResourceId resourceId) { palOffset = READ_LE_UINT16(_resourceData + 6); if (palOffset && palOffset != 0x100) { - // Some SCI0/SCI01 games also have an offset set. It seems that it points to a 16-byte mapping table - // but on those games using that mapping will actually screw things up. - // On the other side: vga sci1 games have this pointing to a VGA palette - // and ega sci1 games have this pointing to a 8x16 byte mapping table that needs to get applied then + // Some SCI0/SCI01 games also have an offset set. It seems that it + // points to a 16-byte mapping table but on those games using that + // mapping will actually screw things up. On the other side: VGA + // SCI1 games have this pointing to a VGA palette and EGA SCI1 games + // have this pointing to a 8x16 byte mapping table that needs to get + // applied then. if (!isEGA) { _palette->createFromData(&_resourceData[palOffset], _resourceSize - palOffset, &_viewPalette); _embeddedPal = true; @@ -122,7 +125,7 @@ void GfxView::initData(GuiResourceId resourceId) { if (getSciVersion() >= SCI_VERSION_1_EGA) { _EGAmapping = &_resourceData[palOffset]; for (EGAmapNr = 0; EGAmapNr < SCI_VIEW_EGAMAPPING_COUNT; EGAmapNr++) { - if (memcmp(_EGAmapping, EGAmappingStraight, SCI_VIEW_EGAMAPPING_SIZE)!=0) + if (memcmp(_EGAmapping, EGAmappingStraight, SCI_VIEW_EGAMAPPING_SIZE) != 0) break; _EGAmapping += SCI_VIEW_EGAMAPPING_SIZE; } @@ -184,12 +187,13 @@ void GfxView::initData(GuiResourceId resourceId) { case kViewVga11: // View-format SCI1.1+ // HeaderSize:WORD LoopCount:BYTE Unknown:BYTE Version:WORD Unknown:WORD PaletteOffset:WORD - headerSize = READ_SCI11ENDIAN_UINT16(_resourceData + 0) + 2; // headerSize is not part of the header, so its added + headerSize = READ_SCI11ENDIAN_UINT16(_resourceData + 0) + 2; // headerSize is not part of the header, so it's added assert(headerSize >= 16); _loopCount = _resourceData[2]; assert(_loopCount); palOffset = READ_SCI11ENDIAN_UINT32(_resourceData + 8); - // FIXME: After LoopCount there is another byte and its set for view 50 within Laura Bow 2 CD, check what it means + // FIXME: After LoopCount there is another byte and its set for view 50 + // within Laura Bow 2 CD, check what it means. loopData = _resourceData + headerSize; loopSize = _resourceData[12]; @@ -251,47 +255,47 @@ void GfxView::initData(GuiResourceId resourceId) { } } -GuiResourceId GfxView::getResourceId() { +GuiResourceId GfxView::getResourceId() const { return _resourceId; } -int16 GfxView::getWidth(int16 loopNo, int16 celNo) { +int16 GfxView::getWidth(int16 loopNo, int16 celNo) const { loopNo = CLIP(loopNo, 0, _loopCount - 1); celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); return _loopCount ? _loop[loopNo].cel[celNo].width : 0; } -int16 GfxView::getHeight(int16 loopNo, int16 celNo) { - loopNo = CLIP(loopNo, 0, _loopCount -1); +int16 GfxView::getHeight(int16 loopNo, int16 celNo) const { + loopNo = CLIP(loopNo, 0, _loopCount - 1); celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); return _loopCount ? _loop[loopNo].cel[celNo].height : 0; } -CelInfo *GfxView::getCelInfo(int16 loopNo, int16 celNo) { +const CelInfo *GfxView::getCelInfo(int16 loopNo, int16 celNo) const { loopNo = CLIP(loopNo, 0, _loopCount - 1); celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); return _loopCount ? &_loop[loopNo].cel[celNo] : NULL; } -LoopInfo *GfxView::getLoopInfo(int16 loopNo) { +const LoopInfo *GfxView::getLoopInfo(int16 loopNo) const { loopNo = CLIP(loopNo, 0, _loopCount - 1); return _loopCount ? &_loop[loopNo] : NULL; } -void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect *outRect) { - CelInfo *celInfo = getCelInfo(loopNo, celNo); +void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const { + const CelInfo *celInfo = getCelInfo(loopNo, celNo); if (celInfo) { - outRect->left = x + celInfo->displaceX - (celInfo->width >> 1); - outRect->right = outRect->left + celInfo->width; - outRect->bottom = y + celInfo->displaceY - z + 1; - outRect->top = outRect->bottom - celInfo->height; + outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); + outRect.right = outRect.left + celInfo->width; + outRect.bottom = y + celInfo->displaceY - z + 1; + outRect.top = outRect.bottom - celInfo->height; } } -void GfxView::getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect *outRect) { +void GfxView::getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect &outRect) const { int16 scaledDisplaceX, scaledDisplaceY; int16 scaledWidth, scaledHeight; - CelInfo *celInfo = getCelInfo(loopNo, celNo); + const CelInfo *celInfo = getCelInfo(loopNo, celNo); if (celInfo) { // Scaling displaceX/Y, Width/Height scaledDisplaceX = (celInfo->displaceX * scaleX) >> 7; @@ -301,15 +305,15 @@ void GfxView::getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int1 scaledWidth = CLIP(scaledWidth, 0, _screen->getWidth()); scaledHeight = CLIP(scaledHeight, 0, _screen->getHeight()); - outRect->left = x + scaledDisplaceX - (scaledWidth >> 1); - outRect->right = outRect->left + scaledWidth; - outRect->bottom = y + scaledDisplaceY - z + 1; - outRect->top = outRect->bottom - scaledHeight; + outRect.left = x + scaledDisplaceX - (scaledWidth >> 1); + outRect.right = outRect.left + scaledWidth; + outRect.bottom = y + scaledDisplaceY - z + 1; + outRect.top = outRect.bottom - scaledHeight; } } void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCount) { - CelInfo *celInfo = getCelInfo(loopNo, celNo); + const CelInfo *celInfo = getCelInfo(loopNo, celNo); byte *rlePtr; byte *literalPtr; uint32 pixelNo = 0, runLength; @@ -325,9 +329,10 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou pixelNo += runLength; } } else { - // we skip over transparent pixels, so the buffer needs to be already filled with it - // also some RLE compressed cels are possibly ending with the last non-transparent pixel - // (is this even possible with the current code?) + // We skip over transparent pixels, so the buffer needs to be already + // filled with "it". (FIXME: What is "it" supposed to mean here?) + // Also some RLE compressed cels are possibly ending with the last + // non-transparent pixel (is this even possible with the current code?) memset(outPtr, _loop[loopNo].cel[celNo].clearKey, pixelCount); rlePtr = _resourceData + celInfo->offsetRLE; @@ -371,7 +376,7 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou literalPtr = _resourceData + celInfo->offsetLiteral; if (celInfo->offsetRLE) { if (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1) { - // Crazy-Ass compression for SCI1.1+ Mac + // compression for SCI1.1+ Mac while (pixelNo < pixelCount) { uint32 pixelLine = pixelNo; runLength = *rlePtr++; @@ -414,7 +419,7 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou } } -byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { +const byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { loopNo = CLIP(loopNo, 0, _loopCount -1); celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); if (_loop[loopNo].cel[celNo].rawBitmap) @@ -443,8 +448,10 @@ byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { return _loop[loopNo].cel[celNo].rawBitmap; } -// Called after unpacking an EGA cel, this will try to undither (parts) of the cel if the dithering in here -// matches dithering used by the current picture +/** + * Called after unpacking an EGA cel, this will try to undither (parts) of the + * cel if the dithering in here matches dithering used by the current picture. + */ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte clearKey) { int16 *unditherMemorial = _screen->unditherGetMemorial(); @@ -453,7 +460,8 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl return; // Makes no sense to process bitmaps that are 3 pixels wide or less - if (width <= 3) return; + if (width <= 3) + return; // If EGA mapping is used for this view, dont do undithering as well if (_EGAmapping) @@ -490,7 +498,8 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl color1 = color & 0x0F; color2 = color >> 4; if ((color1 != clearKey) && (color2 != clearKey) && (color1 != color2)) { // so set this and the reversed color-combination for undithering - unditherTable[color] = true; unditherTable[(color1 << 4) | color2] = true; + unditherTable[color] = true; + unditherTable[(color1 << 4) | color2] = true; unditherCount++; } } @@ -507,8 +516,9 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl for (x = 1; x < width; x++) { color = (color << 4) | curPtr[1]; if (unditherTable[color]) { - // some color with black? turn colors around otherwise it wont be the right color at all - if ((color & 0xF0)==0) + // Some color with black? Turn colors around, otherwise it won't + // be the right color at all. + if ((color & 0xF0) == 0) color = (color << 4) | (color >> 4); curPtr[0] = color; curPtr[1] = color; } @@ -518,10 +528,10 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl } } -void GfxView::draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires) { +void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires) { Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; - CelInfo *celInfo = getCelInfo(loopNo, celNo); - byte *bitmap = getBitmap(loopNo, celNo); + const CelInfo *celInfo = getCelInfo(loopNo, celNo); + const byte *bitmap = getBitmap(loopNo, celNo); int16 celHeight = celInfo->height, celWidth = celInfo->width; int16 width, height; byte clearKey = celInfo->clearKey; @@ -568,12 +578,15 @@ void GfxView::draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRe } } -// We don't fully follow sierra sci here, I did the scaling algo myself and it's definitely not pixel-perfect -// with the one sierra is using. It shouldn't matter because the scaled cel rect is definitely the same as in sierra sci -void GfxView::drawScaled(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY) { +/** + * We don't fully follow sierra sci here, I did the scaling algo myself and it + * is definitely not pixel-perfect with the one sierra is using. It shouldn't + * matter because the scaled cel rect is definitely the same as in sierra sci. + */ +void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY) { Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; - CelInfo *celInfo = getCelInfo(loopNo, celNo); - byte *bitmap = getBitmap(loopNo, celNo); + const CelInfo *celInfo = getCelInfo(loopNo, celNo); + const byte *bitmap = getBitmap(loopNo, celNo); int16 celHeight = celInfo->height, celWidth = celInfo->width; byte clearKey = celInfo->clearKey; byte color; @@ -647,7 +660,7 @@ void GfxView::drawScaled(Common::Rect rect, Common::Rect clipRect, Common::Rect } } -uint16 GfxView::getCelCount(int16 loopNo) { +uint16 GfxView::getCelCount(int16 loopNo) const { if ((loopNo < 0) || (loopNo >= _loopCount)) return 0; return _loop[loopNo].celCount; diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index fe033dfe23..dd25bde3f2 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -60,18 +60,18 @@ public: GfxView(ResourceManager *resMan, GfxScreen *screen, GfxPalette *palette, GuiResourceId resourceId); ~GfxView(); - GuiResourceId getResourceId(); - int16 getWidth(int16 loopNo, int16 celNo); - int16 getHeight(int16 loopNo, int16 celNo); - CelInfo *getCelInfo(int16 loopNo, int16 celNo); - LoopInfo *getLoopInfo(int16 loopNo); - void getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect *outRect); - void getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect *outRect); - byte *getBitmap(int16 loopNo, int16 celNo); - void draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires); - void drawScaled(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY); + GuiResourceId getResourceId() const; + int16 getWidth(int16 loopNo, int16 celNo) const; + int16 getHeight(int16 loopNo, int16 celNo) const; + const CelInfo *getCelInfo(int16 loopNo, int16 celNo) const; + const LoopInfo *getLoopInfo(int16 loopNo) const; + void getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const; + void getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect &outRect) const; + const byte *getBitmap(int16 loopNo, int16 celNo); + void draw(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires); + void drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY); uint16 getLoopCount() const { return _loopCount; } - uint16 getCelCount(int16 loopNo); + uint16 getCelCount(int16 loopNo) const; Palette *getPalette(); private: -- cgit v1.2.3 From 2c01d10a36f50da6c8bdcfe70558f7d9a2e56324 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:20:33 +0000 Subject: SCI: Remove GfxView::getLoopInfo; add assert to GfxView::getCelInfo The return value of GfxView::getCelInfo was used virtually everywhere without a check for it being non-NULL. Hence instead of returning NULL when the loop count is zero, it makes more sense to assert out (instead of a segfault, or worse, random data being used). svn-id: r50422 --- engines/sci/graphics/cache.cpp | 2 +- engines/sci/graphics/view.cpp | 63 +++++++++++++++++++----------------------- engines/sci/graphics/view.h | 1 - 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/engines/sci/graphics/cache.cpp b/engines/sci/graphics/cache.cpp index 81bdab80ea..8caa28b3a1 100644 --- a/engines/sci/graphics/cache.cpp +++ b/engines/sci/graphics/cache.cpp @@ -102,7 +102,7 @@ int16 GfxCache::kernelViewGetLoopCount(GuiResourceId viewId) { } int16 GfxCache::kernelViewGetCelCount(GuiResourceId viewId, int16 loopNo) { - return getView(viewId)->getLoopInfo(loopNo)->celCount; + return getView(viewId)->getCelCount(loopNo); } } // End of namespace Sci diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 0749d958a0..b255b18adc 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -272,44 +272,49 @@ int16 GfxView::getHeight(int16 loopNo, int16 celNo) const { } const CelInfo *GfxView::getCelInfo(int16 loopNo, int16 celNo) const { + assert(_loopCount); loopNo = CLIP(loopNo, 0, _loopCount - 1); celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); - return _loopCount ? &_loop[loopNo].cel[celNo] : NULL; + return &_loop[loopNo].cel[celNo]; } -const LoopInfo *GfxView::getLoopInfo(int16 loopNo) const { - loopNo = CLIP(loopNo, 0, _loopCount - 1); - return _loopCount ? &_loop[loopNo] : NULL; +uint16 GfxView::getCelCount(int16 loopNo) const { +// assert(_loopCount); +// loopNo = CLIP(loopNo, 0, _loopCount - 1); + if ((loopNo < 0) || (loopNo >= _loopCount)) + return 0; + return _loop[loopNo].celCount; +} + +Palette *GfxView::getPalette() { + return _embeddedPal ? &_viewPalette : NULL; } void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const { const CelInfo *celInfo = getCelInfo(loopNo, celNo); - if (celInfo) { - outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); - outRect.right = outRect.left + celInfo->width; - outRect.bottom = y + celInfo->displaceY - z + 1; - outRect.top = outRect.bottom - celInfo->height; - } + outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); + outRect.right = outRect.left + celInfo->width; + outRect.bottom = y + celInfo->displaceY - z + 1; + outRect.top = outRect.bottom - celInfo->height; } void GfxView::getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect &outRect) const { int16 scaledDisplaceX, scaledDisplaceY; int16 scaledWidth, scaledHeight; const CelInfo *celInfo = getCelInfo(loopNo, celNo); - if (celInfo) { - // Scaling displaceX/Y, Width/Height - scaledDisplaceX = (celInfo->displaceX * scaleX) >> 7; - scaledDisplaceY = (celInfo->displaceY * scaleY) >> 7; - scaledWidth = (celInfo->width * scaleX) >> 7; - scaledHeight = (celInfo->height * scaleY) >> 7; - scaledWidth = CLIP(scaledWidth, 0, _screen->getWidth()); - scaledHeight = CLIP(scaledHeight, 0, _screen->getHeight()); - - outRect.left = x + scaledDisplaceX - (scaledWidth >> 1); - outRect.right = outRect.left + scaledWidth; - outRect.bottom = y + scaledDisplaceY - z + 1; - outRect.top = outRect.bottom - scaledHeight; - } + + // Scaling displaceX/Y, Width/Height + scaledDisplaceX = (celInfo->displaceX * scaleX) >> 7; + scaledDisplaceY = (celInfo->displaceY * scaleY) >> 7; + scaledWidth = (celInfo->width * scaleX) >> 7; + scaledHeight = (celInfo->height * scaleY) >> 7; + scaledWidth = CLIP(scaledWidth, 0, _screen->getWidth()); + scaledHeight = CLIP(scaledHeight, 0, _screen->getHeight()); + + outRect.left = x + scaledDisplaceX - (scaledWidth >> 1); + outRect.right = outRect.left + scaledWidth; + outRect.bottom = y + scaledDisplaceY - z + 1; + outRect.top = outRect.bottom - scaledHeight; } void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCount) { @@ -660,14 +665,4 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, } } -uint16 GfxView::getCelCount(int16 loopNo) const { - if ((loopNo < 0) || (loopNo >= _loopCount)) - return 0; - return _loop[loopNo].celCount; -} - -Palette *GfxView::getPalette() { - return _embeddedPal ? &_viewPalette : NULL; -} - } // End of namespace Sci diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index dd25bde3f2..93239e7586 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -64,7 +64,6 @@ public: int16 getWidth(int16 loopNo, int16 celNo) const; int16 getHeight(int16 loopNo, int16 celNo) const; const CelInfo *getCelInfo(int16 loopNo, int16 celNo) const; - const LoopInfo *getLoopInfo(int16 loopNo) const; void getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const; void getCelScaledRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, int16 scaleX, int16 scaleY, Common::Rect &outRect) const; const byte *getBitmap(int16 loopNo, int16 celNo); -- cgit v1.2.3 From 7e0240ab14d29401877ff0c4d827be859e13ea58 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:20:51 +0000 Subject: SCI: Comment cleanup svn-id: r50423 --- engines/sci/graphics/cursor.cpp | 12 +++++++----- engines/sci/graphics/screen.cpp | 26 ++++++++++++++++++-------- engines/sci/graphics/screen.h | 34 ++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index c5f4de9cf5..20472d14c4 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -205,7 +205,7 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu // See http://developer.apple.com/legacy/mac/library/documentation/mac/QuickDraw/QuickDraw-402.html // for more information. - // View 998 seems to be a fake resource used to call for for the Mac CURS resources + // View 998 seems to be a fake resource used to call for the Mac CURS resources. // For other resources, they're still in the views, so use them. if (viewNum != 998) { kernelSetView(viewNum, loopNum, celNum, hotspot); @@ -255,10 +255,12 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu } void GfxCursor::setPosition(Common::Point pos) { - // Don't set position, when cursor is not visible - // This fixes eco quest 1 (floppy) right at the start, which is setting mouse cursor to 0, 0 all the time during the - // intro. It's escapeable (now) by moving to the left or top, but it's getting on your nerves. - // This could theoretically break some things, although sierra normally sets position only when showing the cursor. + // Don't set position, when cursor is not visible. + // This fixes eco quest 1 (floppy) right at the start, which is setting + // mouse cursor to (0,0) all the time during the intro. It's escapeable + // (now) by moving to the left or top, but it's getting on your nerves. This + // could theoretically break some things, although sierra normally sets + // position only when showing the cursor. if (!_isVisible) return; diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 519020f3a1..fa1f7019fd 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -106,8 +106,8 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { _unditherState = true; if (_resMan->isVGA() || (_resMan->isAmiga32color())) { - // It's not 100% accurate to set white to be 255 for amiga 32-color games - // 255 is defined as white in our sci at all times, so it doesnt matter + // It is not 100% accurate to set white to be 255 for Amiga 32-color games. + // But 255 is defined as white in our SCI at all times, so it doesn't matter. _colorWhite = 255; if (getSciVersion() >= SCI_VERSION_1_1) _colorDefaultVectorData = 255; @@ -167,7 +167,10 @@ void GfxScreen::copyRectToScreen(const Common::Rect &rect) { } } -// This copies a rect to screen w/o scaling adjustment and is only meant to be used on hires graphics used in upscaled hires mode +/** + * This copies a rect to screen w/o scaling adjustment and is only meant to be + * used on hires graphics used in upscaled hires mode. + */ void GfxScreen::copyDisplayRectToScreen(const Common::Rect &rect) { if (!_upscaledHires) error("copyDisplayRectToScreen: not in upscaled hires mode"); @@ -218,15 +221,21 @@ void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority, _controlScreen[offset] = control; } -// This will just change a pixel directly on displayscreen. Its supposed to get only used on upscaled-Hires games where -// hires content needs to get drawn ONTO the upscaled display screen (like japanese fonts, hires portraits, etc.) +/** + * This will just change a pixel directly on displayscreen. It is supposed to be + * only used on upscaled-Hires games where hires content needs to get drawn ONTO + * the upscaled display screen (like japanese fonts, hires portraits, etc.). + */ void GfxScreen::putPixelOnDisplay(int x, int y, byte color) { int offset = y * _displayWidth + x; _displayScreen[offset] = color; } -// Sierra's Bresenham line drawing -// WARNING: Do not just blindly replace this with Graphics::drawLine(), as it seems to create issues with flood fill +/** + * Sierra's Bresenham line drawing. + * WARNING: Do not replace this with Graphics::drawLine(), as this causes issues + * with flood fill, due to small difference in the Bresenham logic. + */ void GfxScreen::drawLine(Common::Point startPoint, Common::Point endPoint, byte color, byte priority, byte control) { int16 left = startPoint.x; int16 top = startPoint.y; @@ -289,7 +298,8 @@ void GfxScreen::drawLine(Common::Point startPoint, Common::Point endPoint, byte } } -// We put hires kanji chars onto upscaled background, so we need to adjust coordinates. Caller gives use low-res ones +// We put hires kanji chars onto upscaled background, so we need to adjust +// coordinates. Caller gives use low-res ones. void GfxScreen::putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, uint16 chr, byte color) { byte *displayPtr = _displayScreen + y * _displayWidth * 2 + x * 2; // we don't use outline, so color 0 is actually not used diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index c1e10fabc8..03dfd3529c 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -55,9 +55,12 @@ enum { }; /** - * Screen class, actually creates 3 (4) screens internally - which is visual/display (for the user), - * priority (contains priority information) and control (contains control information). Handles all operations to it - * and copies parts of visual/display screen to the actual screen, so the user can really see it. + * Screen class, actually creates 3 (4) screens internally: + * - visual/display (for the user), + * - priority (contains priority information) and + * - control (contains control information). + * Handles all operations to it and copies parts of visual/display screen to + * the actual screen, so the user can really see it. */ class GfxScreen { public: @@ -85,10 +88,10 @@ public: void drawLine(int16 left, int16 top, int16 right, int16 bottom, byte color, byte prio, byte control) { drawLine(Common::Point(left, top), Common::Point(right, bottom), color, prio, control); } - int getUpscaledHires() { + int getUpscaledHires() const { return _upscaledHires; } - bool getUnditherState() { + bool getUnditherState() const { return _unditherState; } void putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, uint16 chr, byte color); @@ -140,27 +143,34 @@ private: bool _unditherState; int16 _unditherMemorial[SCI_SCREEN_UNDITHERMEMORIAL_SIZE]; - // these screens have the real resolution of the game engine (320x200 for SCI0/SCI1/SCI11 games, 640x480 for SCI2 games) - // SCI0 games will be dithered in here at any time + // These screens have the real resolution of the game engine (320x200 for + // SCI0/SCI1/SCI11 games, 640x480 for SCI2 games). SCI0 games will be + // dithered in here at any time. byte *_visualScreen; byte *_priorityScreen; byte *_controlScreen; - // this screen is the one that is actually displayed to the user. It may be 640x400 for japanese SCI1 games - // SCI0 games may be undithered in here. Only read from this buffer for Save/ShowBits usage. + // This screen is the one that is actually displayed to the user. It may be + // 640x400 for japanese SCI1 games. SCI0 games may be undithered in here. + // Only read from this buffer for Save/ShowBits usage. byte *_displayScreen; Common::Rect getScaledRect(Common::Rect rect); ResourceManager *_resMan; - // this is a pointer to the currently active screen (changing it only required for debug purposes) + /** + * Pointer to the currently active screen (changing it only required for + * debug purposes). + */ byte *_activeScreen; - // this variable defines, if upscaled hires is active and what upscaled mode is used + // This variable defines, if upscaled hires is active and what upscaled mode + // is used. int _upscaledHires; - // this here holds a translation for vertical coordinates between native (visual) and actual (display) screen + // This here holds a translation for vertical coordinates between native + // (visual) and actual (display) screen. int _upscaledMapping[SCI_SCREEN_UPSCALEDMAXHEIGHT + 1]; }; -- cgit v1.2.3 From 793d482f4fccd8999d71c9a0dbed518216cbb6ac Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:21:07 +0000 Subject: SCI: Optimized GfxScreen::scale2x a bit svn-id: r50424 --- engines/sci/graphics/screen.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index fa1f7019fd..a86f64c44f 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -594,18 +594,19 @@ void GfxScreen::debugShowMap(int mapNo) { } void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { - int newWidth = srcWidth * 2; + const int newWidth = srcWidth * 2; const byte *srcPtr = src; for (int y = 0; y < srcHeight; y++) { for (int x = 0; x < srcWidth; x++) { - int destOffset = y * 2 * newWidth + x * 2; - dst[destOffset] = *srcPtr; - dst[destOffset + 1] = *srcPtr; - dst[destOffset + newWidth] = *srcPtr; - dst[destOffset + newWidth + 1] = *srcPtr; - srcPtr++; + const byte color = *srcPtr++; + dst[0] = color; + dst[1] = color; + dst[newWidth] = color; + dst[newWidth + 1] = color; + dst += 2; } + dst += srcWidth; } } -- cgit v1.2.3 From 14530933919cfcfb86c0542ed2408b8e47675036 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:21:23 +0000 Subject: SCI: Cleanup GfxView code (formatting etc.); also insert some asserts to protect scalingX/Y arrays svn-id: r50425 --- engines/sci/graphics/view.cpp | 92 +++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index b255b18adc..71261490e4 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -460,7 +460,8 @@ const byte *GfxView::getBitmap(int16 loopNo, int16 celNo) { void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte clearKey) { int16 *unditherMemorial = _screen->unditherGetMemorial(); - // It makes no sense to go further, if no memorial data from current picture is available + // It makes no sense to go further, if no memorial data from current picture + // is available if (!unditherMemorial) return; @@ -480,7 +481,8 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl memset(&bitmapMemorial, 0, sizeof(bitmapMemorial)); - // Count all seemingly dithered pixel-combinations as soon as at least 4 pixels are adjacent + // Count all seemingly dithered pixel-combinations as soon as at least 4 + // pixels are adjacent curPtr = bitmapPtr; for (y = 0; y < height; y++) { color1 = curPtr[0]; color2 = (curPtr[1] << 4) | curPtr[2]; @@ -493,13 +495,15 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl } } - // Now compare both memorial tables to find out matching dithering-combinations + // Now compare both memorial tables to find out matching + // dithering-combinations bool unditherTable[SCI_SCREEN_UNDITHERMEMORIAL_SIZE]; byte color, unditherCount = 0; memset(&unditherTable, false, sizeof(unditherTable)); for (color = 0; color < 255; color++) { if ((bitmapMemorial[color] > 5) && (unditherMemorial[color] > 200)) { - // match found, check if colorKey is contained -> if so, we ignore of course + // match found, check if colorKey is contained -> if so, we ignore + // of course color1 = color & 0x0F; color2 = color >> 4; if ((color1 != clearKey) && (color2 != clearKey) && (color1 != color2)) { // so set this and the reversed color-combination for undithering @@ -533,15 +537,15 @@ void GfxView::unditherBitmap(byte *bitmapPtr, int16 width, int16 height, byte cl } } -void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires) { - Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; +void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, + int16 loopNo, int16 celNo, byte priority, uint16 EGAmappingNr, bool upscaledHires) { + const Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; const CelInfo *celInfo = getCelInfo(loopNo, celNo); const byte *bitmap = getBitmap(loopNo, celNo); - int16 celHeight = celInfo->height, celWidth = celInfo->width; - int16 width, height; - byte clearKey = celInfo->clearKey; - byte color; - byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY; + const int16 celHeight = celInfo->height; + const int16 celWidth = celInfo->width; + const byte clearKey = celInfo->clearKey; + const byte drawMask = (priority == 255) ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY; int x, y; if (_embeddedPal) { @@ -549,24 +553,27 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const _palette->set(&_viewPalette, false); } - width = MIN(clipRect.width(), celWidth); - height = MIN(clipRect.height(), celHeight); + const int16 width = MIN(clipRect.width(), celWidth); + const int16 height = MIN(clipRect.height(), celHeight); bitmap += (clipRect.top - rect.top) * celWidth + (clipRect.left - rect.left); if (!_EGAmapping) { for (y = 0; y < height; y++, bitmap += celWidth) { for (x = 0; x < width; x++) { - color = bitmap[x]; + const byte color = bitmap[x]; if (color != clearKey) { + const int x2 = clipRectTranslated.left + x; + const int y2 = clipRectTranslated.top + y; if (!upscaledHires) { - if (priority >= _screen->getPriority(clipRectTranslated.left + x, clipRectTranslated.top + y)) - _screen->putPixel(clipRectTranslated.left + x, clipRectTranslated.top + y, drawMask, palette->mapping[color], priority, 0); + if (priority >= _screen->getPriority(x2, y2)) + _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); } else { - // UpscaledHires means view is hires and is supposed to get drawn onto lowres screen - // FIXME(?): we can't read priority directly with the hires coordinates. may not be needed at all - // in kq6 - _screen->putPixelOnDisplay(clipRectTranslated.left + x, clipRectTranslated.top + y, palette->mapping[color]); + // UpscaledHires means view is hires and is supposed to + // get drawn onto lowres screen. + // FIXME(?): we can't read priority directly with the + // hires coordinates. may not be needed at all in kq6 + _screen->putPixelOnDisplay(x2, y2, palette->mapping[color]); } } } @@ -575,9 +582,11 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const byte *EGAmapping = _EGAmapping + (EGAmappingNr * SCI_VIEW_EGAMAPPING_SIZE); for (y = 0; y < height; y++, bitmap += celWidth) { for (x = 0; x < width; x++) { - color = EGAmapping[bitmap[x]]; - if (color != clearKey && priority >= _screen->getPriority(clipRectTranslated.left + x, clipRectTranslated.top + y)) - _screen->putPixel(clipRectTranslated.left + x, clipRectTranslated.top + y, drawMask, color, priority, 0); + const byte color = EGAmapping[bitmap[x]]; + const int x2 = clipRectTranslated.left + x; + const int y2 = clipRectTranslated.top + y; + if (color != clearKey && priority >= _screen->getPriority(x2, y2)) + _screen->putPixel(x2, y2, drawMask, color, priority, 0); } } } @@ -588,20 +597,19 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const * is definitely not pixel-perfect with the one sierra is using. It shouldn't * matter because the scaled cel rect is definitely the same as in sierra sci. */ -void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY) { - Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; +void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, const Common::Rect &clipRectTranslated, + int16 loopNo, int16 celNo, byte priority, int16 scaleX, int16 scaleY) { + const Palette *palette = _embeddedPal ? &_viewPalette : &_palette->_sysPalette; const CelInfo *celInfo = getCelInfo(loopNo, celNo); const byte *bitmap = getBitmap(loopNo, celNo); - int16 celHeight = celInfo->height, celWidth = celInfo->width; - byte clearKey = celInfo->clearKey; - byte color; - byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY; - int x, y; + const int16 celHeight = celInfo->height; + const int16 celWidth = celInfo->width; + const byte clearKey = celInfo->clearKey; + const byte drawMask = (priority == 255) ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY; uint16 scalingX[640]; uint16 scalingY[480]; int16 scaledWidth, scaledHeight; int16 pixelNo, scaledPixel, scaledPixelNo, prevScaledPixelNo; - uint16 offsetX, offsetY; if (_embeddedPal) { // Merge view palette in... @@ -622,6 +630,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, scaledPixel = scaledPixelNo = prevScaledPixelNo = 0; while (pixelNo < celHeight) { scaledPixelNo = scaledPixel >> 7; + assert(scaledPixelNo < ARRAYSIZE(scalingY)); if (prevScaledPixelNo < scaledPixelNo) memset(&scalingY[prevScaledPixelNo], pixelNo, scaledPixelNo - prevScaledPixelNo); scalingY[scaledPixelNo] = pixelNo; @@ -638,6 +647,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, scaledPixel = scaledPixelNo = prevScaledPixelNo = 0; while (pixelNo < celWidth) { scaledPixelNo = scaledPixel >> 7; + assert(scaledPixelNo < ARRAYSIZE(scalingX)); if (prevScaledPixelNo < scaledPixelNo) memset(&scalingX[prevScaledPixelNo], pixelNo, scaledPixelNo - prevScaledPixelNo); scalingX[scaledPixelNo] = pixelNo; @@ -652,14 +662,18 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, scaledWidth = MIN(clipRect.width(), scaledWidth); scaledHeight = MIN(clipRect.height(), scaledHeight); - offsetY = clipRect.top - rect.top; - offsetX = clipRect.left - rect.left; - - for (y = 0; y < scaledHeight; y++) { - for (x = 0; x < scaledWidth; x++) { - color = bitmap[scalingY[y + offsetY] * celWidth + scalingX[x + offsetX]]; - if (color != clearKey && priority >= _screen->getPriority(clipRectTranslated.left + x, clipRectTranslated.top + y)) { - _screen->putPixel(clipRectTranslated.left + x, clipRectTranslated.top + y, drawMask, palette->mapping[color], priority, 0); + const uint16 offsetY = clipRect.top - rect.top; + const uint16 offsetX = clipRect.left - rect.left; + + assert(scaledHeight + offsetY <= ARRAYSIZE(scalingY)); + assert(scaledWidth + offsetX <= ARRAYSIZE(scalingX)); + for (int y = 0; y < scaledHeight; y++) { + for (int x = 0; x < scaledWidth; x++) { + const byte color = bitmap[scalingY[y + offsetY] * celWidth + scalingX[x + offsetX]]; + const int x2 = clipRectTranslated.left + x; + const int y2 = clipRectTranslated.top + y; + if (color != clearKey && priority >= _screen->getPriority(x2, y2)) { + _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); } } } -- cgit v1.2.3 From 12099176f712c65b9822a5874f705d63d82228ce Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:21:39 +0000 Subject: SCI: More formatting cleanup svn-id: r50426 --- engines/sci/engine/script.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 2bb405372a..b6bcbb7646 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -275,10 +275,10 @@ void Script::relocate(reg_t block) { for (int i = 0; i < count; i++) { pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; - // This occurs in SCI01/SCI1 games where usually one export value - // is zero. It seems that in this situation, we should skip the - // export and move to the next one, though the total count of valid - // exports remains the same + // This occurs in SCI01/SCI1 games where usually one export value is + // zero. It seems that in this situation, we should skip the export and + // move to the next one, though the total count of valid exports remains + // the same if (!pos) { exportIndex++; pos = READ_SCI11ENDIAN_UINT16(heap + block.offset + 2 + (exportIndex * 2)) + heapOffset; @@ -286,9 +286,10 @@ void Script::relocate(reg_t block) { error("Script::relocate(): Consecutive zero exports found"); } - // In SCI0-SCI1, script local variables, objects and code are relocated. We only relocate - // locals and objects here, and ignore relocation of code blocks. In SCI1.1 and newer - // versions, only locals and objects are relocated. + // In SCI0-SCI1, script local variables, objects and code are relocated. + // We only relocate locals and objects here, and ignore relocation of + // code blocks. In SCI1.1 and newer versions, only locals and objects + // are relocated. if (!relocateLocal(block.segment, pos)) { // Not a local? It's probably an object or code block. If it's an object, relocate it. const ObjMap::iterator end = _objects.end(); @@ -497,10 +498,10 @@ void Script::initialiseObjectsSci11(SegManager *segMan) { obj->setSuperClassSelector( segMan->getClassAddress(obj->getSuperClassSelector().offset, SCRIPT_GET_LOCK, NULL_REG)); - // If object is instance, get -propDict- from class and set it for this object - // This is needed for ::isMemberOf() to work. - // Example testcase - room 381 of sq4cd - if isMemberOf() doesn't work, talk-clicks on the robot will act like - // clicking on ego + // If object is instance, get -propDict- from class and set it for this + // object. This is needed for ::isMemberOf() to work. + // Example testcase - room 381 of sq4cd - if isMemberOf() doesn't work, + // talk-clicks on the robot will act like clicking on ego if (!obj->isClass()) { reg_t classObject = obj->getSuperClassSelector(); Object *classObj = segMan->getObject(classObject); -- cgit v1.2.3 From 85038e7d6c272555c54d9f4b87665392bfa96aaf Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:21:55 +0000 Subject: SCI: Change warning back to error in Script::initialiseObjectsSci0 Instead of turning the error into a warning globally, we now have code which ignores the error in Script 202 of KQ5 French, but will keep reporting if it turns up in other places. svn-id: r50427 --- engines/sci/engine/script.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index b6bcbb7646..f9584a2897 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -471,8 +471,11 @@ void Script::initialiseObjectsSci0(SegManager *segMan) { obj->initSpecies(segMan, addr); if (!obj->initBaseObject(segMan, addr)) { - // Script 202 of KQ5 French has an invalid object. This is non-fatal. - warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + if (_nr == 202 && g_sci->getGameId() == GID_KQ5 && g_sci->getSciLanguage() == K_LANG_FRENCH) { + // Script 202 of KQ5 French has an invalid object. This is non-fatal. + } else { + error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + } scriptObjRemove(addr); } } -- cgit v1.2.3 From 30218a2c324bc67f724100051ab9884a351928fb Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:22:20 +0000 Subject: SCI: Make Script member vars private; add const qualifiers Only three Script members remain public (for now) svn-id: r50428 --- engines/sci/console.cpp | 10 +++---- engines/sci/engine/features.cpp | 10 +++---- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/savegame.cpp | 4 +-- engines/sci/engine/script.cpp | 33 ++++++++++++----------- engines/sci/engine/script.h | 54 ++++++++++++++++++++------------------ engines/sci/engine/scriptdebug.cpp | 6 ++--- engines/sci/engine/seg_manager.cpp | 24 +++++++---------- engines/sci/engine/vm.cpp | 6 ++--- engines/sci/engine/vm.h | 2 +- 10 files changed, 76 insertions(+), 75 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 611d1481ad..f682e0e524 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1381,7 +1381,7 @@ bool Console::cmdPrintSegmentTable(int argc, const char **argv) { switch (mobj->getType()) { case SEG_TYPE_SCRIPT: - DebugPrintf("S script.%03d l:%d ", (*(Script *)mobj)._nr, (*(Script *)mobj).getLockers()); + DebugPrintf("S script.%03d l:%d ", (*(Script *)mobj).getScriptNumber(), (*(Script *)mobj).getLockers()); break; case SEG_TYPE_CLONES: @@ -1455,9 +1455,9 @@ bool Console::segmentInfo(int nr) { case SEG_TYPE_SCRIPT: { Script *scr = (Script *)mobj; - DebugPrintf("script.%03d locked by %d, bufsize=%d (%x)\n", scr->_nr, scr->getLockers(), (uint)scr->getBufSize(), (uint)scr->getBufSize()); + DebugPrintf("script.%03d locked by %d, bufsize=%d (%x)\n", scr->getScriptNumber(), scr->getLockers(), (uint)scr->getBufSize(), (uint)scr->getBufSize()); if (scr->getExportTable()) - DebugPrintf(" Exports: %4d at %d\n", scr->getExportsNr(), (int)(((const byte *)scr->getExportTable()) - ((const byte *)scr->_buf))); + DebugPrintf(" Exports: %4d at %d\n", scr->getExportsNr(), (int)(((const byte *)scr->getExportTable()) - ((const byte *)scr->getBuf()))); else DebugPrintf(" Exports: none\n"); @@ -2377,7 +2377,7 @@ bool Console::cmdBacktrace(int argc, const char **argv) { DebugPrintf(" argp:ST:%04x", (unsigned)(call.variables_argp - _engine->_gamestate->stack_base)); if (call.type == EXEC_STACK_TYPE_CALL) - DebugPrintf(" script: %d", (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.segment])._nr); + DebugPrintf(" script: %d", (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.segment]).getScriptNumber()); DebugPrintf("\n"); } @@ -3351,7 +3351,7 @@ int Console::printObject(reg_t pos) { DebugPrintf(" [%03x] %s = %04x:%04x\n", obj->getFuncSelector(i), _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), PRINT_REG(fptr)); } if (s->_segMan->_heap[pos.segment]->getType() == SEG_TYPE_SCRIPT) - DebugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.segment)->_nr); + DebugPrintf("\nOwner script: %d\n", s->_segMan->getScript(pos.segment)->getScriptNumber()); return 0; } diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 75f271f3ad..2ad494b37f 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -84,7 +84,7 @@ bool GameFeatures::autoDetectSoundType() { int16 opparams[4]; byte extOpcode; byte opcode; - offset += readPMachineInstruction(script->_buf + offset, extOpcode, opparams); + offset += readPMachineInstruction(script->getBuf(offset), extOpcode, opparams); opcode = extOpcode >> 1; // Check for end of script @@ -220,7 +220,7 @@ bool GameFeatures::autoDetectLofsType(int methodNum) { int16 opparams[4]; byte extOpcode; byte opcode; - offset += readPMachineInstruction(script->_buf + offset, extOpcode, opparams); + offset += readPMachineInstruction(script->getBuf(offset), extOpcode, opparams); opcode = extOpcode >> 1; // Check for end of script @@ -306,7 +306,7 @@ bool GameFeatures::autoDetectGfxFunctionsType(int methodNum) { int16 opparams[4]; byte extOpcode; byte opcode; - offset += readPMachineInstruction(script->_buf + offset, extOpcode, opparams); + offset += readPMachineInstruction(script->getBuf(offset), extOpcode, opparams); opcode = extOpcode >> 1; // Check for end of script @@ -409,7 +409,7 @@ bool GameFeatures::autoDetectSci21KernelType() { int16 opparams[4]; byte extOpcode; byte opcode; - offset += readPMachineInstruction(script->_buf + offset, extOpcode, opparams); + offset += readPMachineInstruction(script->getBuf(offset), extOpcode, opparams); opcode = extOpcode >> 1; // Check for end of script @@ -462,7 +462,7 @@ bool GameFeatures::autoDetectMoveCountType() { int16 opparams[4]; byte extOpcode; byte opcode; - offset += readPMachineInstruction(script->_buf + offset, extOpcode, opparams); + offset += readPMachineInstruction(script->getBuf(offset), extOpcode, opparams); opcode = extOpcode >> 1; // Check for end of script diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d6dcf650bc..9bf0371a7a 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -644,7 +644,7 @@ int Kernel::findRegType(reg_t reg) { case SEG_TYPE_SCRIPT: if (reg.offset <= (*(Script *)mobj).getBufSize() && reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && - RAW_IS_OBJECT((*(Script *)mobj)._buf + reg.offset)) { + RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) { return ((Script *)mobj)->getObject(reg.offset) ? KSIG_OBJECT : KSIG_REF; } else return KSIG_REF; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index f6a6afd196..c0ed515981 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -278,7 +278,7 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { // If we are loading a script, hook it up in the script->segment map. if (s.isLoading() && type == SEG_TYPE_SCRIPT) { - _scriptSegMap[((Script *)mobj)->_nr] = i; + _scriptSegMap[((Script *)mobj)->getScriptNumber()] = i; } } @@ -765,7 +765,7 @@ void SegManager::reconstructScripts(EngineState *s) { scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(_heap[scr->_localsSegment]); for (ObjMap::iterator it = scr->_objects.begin(); it != scr->_objects.end(); ++it) - it->_value._baseObj = scr->_buf + it->_value.getPos().offset; + it->_value._baseObj = scr->getBuf(it->_value.getPos().offset); } for (i = 0; i < _heap.size(); i++) { diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index f9584a2897..ac6fb6f26d 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -88,14 +88,13 @@ void Script::init(int script_nr, ResourceManager *resMan) { if (getSciVersion() == SCI_VERSION_0_EARLY) { _bufSize += READ_LE_UINT16(script->data) * 2; } else if (getSciVersion() >= SCI_VERSION_1_1) { - /** - * In SCI11, the heap was in a separate space from the script. - * We append it to the end of the script, and adjust addressing accordingly. - * However, since we address the heap with a 16-bit pointer, the combined - * size of the stack and the heap must be 64KB. So far this has worked - * for SCI11, SCI2 and SCI21 games. SCI3 games use a different script format, - * and theoretically they can exceed the 64KB boundary using relocation. - */ + // In SCI11, the heap was in a separate space from the script. We append + // it to the end of the script, and adjust addressing accordingly. + // However, since we address the heap with a 16-bit pointer, the + // combined size of the stack and the heap must be 64KB. So far this has + // worked for SCI11, SCI2 and SCI21 games. SCI3 games use a different + // script format, and theoretically they can exceed the 64KB boundary + // using relocation. Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, script_nr), 0); _bufSize += heap->size; _heapSize = heap->size; @@ -109,8 +108,8 @@ void Script::init(int script_nr, ResourceManager *resMan) { // As mentioned above, the script and the heap together should not exceed 64KB if (script->size + heap->size > 65535) error("Script and heap sizes combined exceed 64K. This means a fundamental " - "design bug was made regarding SCI1.1 and newer games.\nPlease " - "report this error to the ScummVM team"); + "design bug was made regarding SCI1.1 and newer games.\n" + "Please report this error to the ScummVM team"); } } @@ -256,7 +255,7 @@ bool Script::relocateLocal(SegmentId segment, int location) { } void Script::relocate(reg_t block) { - byte *heap = _buf; + const byte *heap = _buf; uint16 heapSize = (uint16)_bufSize; uint16 heapOffset = 0; @@ -452,10 +451,9 @@ void Script::initialiseClasses(SegManager *segMan) { } } -void Script::initialiseObjectsSci0(SegManager *segMan) { +void Script::initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); const byte *seeker = _buf + (oldScriptHeader ? 2 : 0); - SegmentId segmentId = segMan->getScriptSegment(_nr); do { uint16 objType = READ_SCI11ENDIAN_UINT16(seeker); @@ -487,11 +485,14 @@ void Script::initialiseObjectsSci0(SegManager *segMan) { seeker += READ_SCI11ENDIAN_UINT16(seeker + 2); } while ((uint32)(seeker - _buf) < getScriptSize() - 2); + + byte *relocationBlock = findBlock(SCI_OBJ_POINTERS); + if (relocationBlock) + relocate(make_reg(segmentId, relocationBlock - getBuf() + 4)); } -void Script::initialiseObjectsSci11(SegManager *segMan) { +void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) { const byte *seeker = _heapStart + 4 + READ_SCI11ENDIAN_UINT16(_heapStart + 2) * 2; - SegmentId segmentId = segMan->getScriptSegment(_nr); while (READ_SCI11ENDIAN_UINT16(seeker) == SCRIPT_OBJECT_MAGIC_NUMBER) { reg_t reg = make_reg(segmentId, seeker - _buf); @@ -521,6 +522,8 @@ void Script::initialiseObjectsSci11(SegManager *segMan) { seeker += READ_SCI11ENDIAN_UINT16(seeker + 2) * 2; } + + relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(_heapStart))); } } // End of namespace Sci diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 296570c218..aab073f3a1 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -51,19 +51,12 @@ enum ScriptObjectTypes { typedef Common::HashMap ObjMap; class Script : public SegmentObj { -public: +private: int _nr; /**< Script number */ byte *_buf; /**< Static data buffer, or NULL if not used */ byte *_heapStart; /**< Start of heap if SCI1.1, NULL otherwise */ - uint32 getScriptSize() { return _scriptSize; } - uint32 getHeapSize() { return _heapSize; } - uint32 getBufSize() { return _bufSize; } - -protected: int _lockers; /**< Number of classes and objects that require this script */ - -private: size_t _scriptSize; size_t _heapSize; uint16 _bufSize; @@ -77,19 +70,27 @@ private: int _localsOffset; uint16 _localsCount; + bool _markedAsDeleted; + public: /** * Table for objects, contains property variables. * Indexed by the TODO offset. */ ObjMap _objects; + SegmentId _localsSegment; /**< The local variable segment */ + LocalVariables *_localsBlock; +public: int getLocalsOffset() const { return _localsOffset; } uint16 getLocalsCount() const { return _localsCount; } - SegmentId _localsSegment; /**< The local variable segment */ - LocalVariables *_localsBlock; - bool _markedAsDeleted; + uint32 getScriptSize() const { return _scriptSize; } + uint32 getHeapSize() const { return _heapSize; } + uint32 getBufSize() const { return _bufSize; } + const byte *getBuf(uint offset = 0) const { return _buf + offset; } + + int getScriptNumber() const { return _nr; } public: Script(); @@ -129,15 +130,6 @@ public: */ void scriptObjRemove(reg_t obj_pos); - /** - * Processes a relocation block witin a script - * This function is idempotent, but it must only be called after all - * objects have been instantiated, or a run-time error will occur. - * @param obj_pos Location (segment, offset) of the block - * @return Location of the relocation block - */ - void relocate(reg_t block); - /** * Initializes the script's local variables * @param segMan A reference to the segment manager @@ -153,19 +145,17 @@ public: /** * Initializes the script's objects (SCI0) * @param segMan A reference to the segment manager + * @param segmentId The script's segment id */ - void initialiseObjectsSci0(SegManager *segMan); + void initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId); /** * Initializes the script's objects (SCI1.1+) * @param segMan A reference to the segment manager + * @param segmentId The script's segment id */ - void initialiseObjectsSci11(SegManager *segMan); - -private: - bool relocateLocal(SegmentId segment, int location); + void initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId); -public: // script lock operations /** Increments the number of lockers of this script by one. */ @@ -246,6 +236,18 @@ public: * Finds the pointer where a block of a specific type starts from */ byte *findBlock(int type); + +private: + /** + * Processes a relocation block witin a script + * This function is idempotent, but it must only be called after all + * objects have been instantiated, or a run-time error will occur. + * @param obj_pos Location (segment, offset) of the block + * @return Location of the relocation block + */ + void relocate(reg_t block); + + bool relocateLocal(SegmentId segment, int location); }; } // End of namespace Sci diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index d730856332..4813e083fd 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -69,7 +69,7 @@ DebugState g_debugState; // FIXME: Avoid non-const global vars reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecode) { SegmentObj *mobj = s->_segMan->getSegment(pos.segment, SEG_TYPE_SCRIPT); Script *script_entity = NULL; - byte *scr; + const byte *scr; int scr_size; reg_t retval = make_reg(pos.segment, pos.offset + 1); uint16 param_value; @@ -82,7 +82,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod } else script_entity = (Script *)mobj; - scr = script_entity->_buf; + scr = script_entity->getBuf(); scr_size = script_entity->getBufSize(); if (pos.offset >= scr_size) { @@ -291,7 +291,7 @@ void script_debug(EngineState *s) { if (mobj) { Script *scr = (Script *)mobj; - byte *code_buf = scr->_buf; + const byte *code_buf = scr->getBuf(); int code_buf_size = scr->getBufSize(); int opcode = s->xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset]; int op = opcode >> 1; diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index b56a539c63..56591c4726 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -157,7 +157,7 @@ int SegManager::deallocate(SegmentId seg, bool recursive) { if (mobj->getType() == SEG_TYPE_SCRIPT) { Script *scr = (Script *)mobj; - _scriptSegMap.erase(scr->_nr); + _scriptSegMap.erase(scr->getScriptNumber()); if (recursive && scr->_localsSegment) deallocate(scr->_localsSegment, recursive); } @@ -173,7 +173,7 @@ bool SegManager::isHeapObject(reg_t pos) { if (obj == NULL || (obj && obj->isFreed())) return false; Script *scr = getScriptIfLoaded(pos.segment); - return !(scr && scr->_markedAsDeleted); + return !(scr && scr->isMarkedAsDeleted()); } void SegManager::deallocateScript(int script_nr) { @@ -237,7 +237,7 @@ Object *SegManager::getObject(reg_t pos) { } else if (mobj->getType() == SEG_TYPE_SCRIPT) { Script *scr = (Script *)mobj; if (pos.offset <= scr->getBufSize() && pos.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET - && RAW_IS_OBJECT(scr->_buf + pos.offset)) { + && RAW_IS_OBJECT(scr->getBuf(pos.offset))) { obj = scr->getObject(pos.offset); } } @@ -384,12 +384,12 @@ LocalVariables *SegManager::allocLocalsSegment(Script *scr) { locals = (LocalVariables *)_heap[scr->_localsSegment]; VERIFY(locals != NULL, "Re-used locals segment was NULL'd out"); VERIFY(locals->getType() == SEG_TYPE_LOCALS, "Re-used locals segment did not consist of local variables"); - VERIFY(locals->script_id == scr->_nr, "Re-used locals segment belonged to other script"); + VERIFY(locals->script_id == scr->getScriptNumber(), "Re-used locals segment belonged to other script"); } else locals = (LocalVariables *)allocSegment(new LocalVariables(), &scr->_localsSegment); scr->_localsBlock = locals; - locals->script_id = scr->_nr; + locals->script_id = scr->getScriptNumber(); locals->_locals.resize(scr->getLocalsCount()); return locals; @@ -1012,13 +1012,9 @@ int SegManager::instantiateScript(int scriptNum) { scr->initialiseClasses(this); if (getSciVersion() >= SCI_VERSION_1_1) { - scr->initialiseObjectsSci11(this); - scr->relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(scr->_heapStart))); + scr->initialiseObjectsSci11(this, segmentId); } else { - scr->initialiseObjectsSci0(this); - byte *relocationBlock = scr->findBlock(SCI_OBJ_POINTERS); - if (relocationBlock) - scr->relocate(make_reg(segmentId, relocationBlock - scr->_buf + 4)); + scr->initialiseObjectsSci0(this, segmentId); } return segmentId; @@ -1067,16 +1063,16 @@ void SegManager::uninstantiateScriptSci0(int script_nr) { do { reg.offset += objLength; // Step over the last checked object - objType = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset); + objType = READ_SCI11ENDIAN_UINT16(scr->getBuf(reg.offset)); if (!objType) break; - objLength = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); + objLength = READ_SCI11ENDIAN_UINT16(scr->getBuf(reg.offset + 2)); reg.offset += 4; // Step over header if ((objType == SCI_OBJ_OBJECT) || (objType == SCI_OBJ_CLASS)) { // object or class? reg.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) - int16 superclass = READ_SCI11ENDIAN_UINT16(scr->_buf + reg.offset + 2); + int16 superclass = READ_SCI11ENDIAN_UINT16(scr->getBuf(reg.offset + 2)); if (superclass >= 0) { int superclass_script = getClass(superclass).script; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 555576f579..686603ae21 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -299,7 +299,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i EngineState *state = g_sci->getEngineState(); ExecStack *lastCall = state->xs; Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); - int curScriptNr = local_script->_nr; + int curScriptNr = local_script->getScriptNumber(); if (lastCall->localCallOffset != -1) { // if lastcall was actually a local call search back for a real call @@ -943,7 +943,7 @@ void run_vm(EngineState *s, bool restoring) { s->_executionStackPosChanged = false; obj = s->_segMan->getObject(s->xs->objp); - code_buf = scr->_buf; + code_buf = scr->getBuf(); code_buf_size = scr->getBufSize(); local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { @@ -1287,7 +1287,7 @@ void run_vm(EngineState *s, bool restoring) { // for (int i = 0; i < opparams[0]; i++) // s->xs->sp[i] = make_reg(0, 'ss'); - //if (local_script->_nr == 140 && isIslandOfDrBrain) { + //if (local_script->getScriptNumber() == 140 && isIslandOfDrBrain) { // // WORKAROUND for The Island of Dr. Brain, room 140. // // Script 140 runs in an endless loop if we set its // // variables to 0 here. diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index ed4cc4a456..49169a456c 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -64,7 +64,7 @@ struct Class { reg_t reg; ///< offset; script-relative offset, segment: 0 if not instantiated }; -#define RAW_IS_OBJECT(datablock) (READ_SCI11ENDIAN_UINT16(((byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER) +#define RAW_IS_OBJECT(datablock) (READ_SCI11ENDIAN_UINT16(((const byte *) datablock) + SCRIPT_OBJECT_MAGIC_OFFSET) == SCRIPT_OBJECT_MAGIC_NUMBER) // A reference to an object's variable. // The object is stored as a reg_t, the variable as an index into _variables -- cgit v1.2.3 From 31b29027144e3a76ab6e8c71a0014ca6121218c0 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:22:41 +0000 Subject: SCI: Revise GC interface: use Common::Array instead of callbacks This means a little bit more overhead but makes the code much more readable and understandable. svn-id: r50429 --- engines/sci/console.cpp | 15 +++---- engines/sci/engine/gc.cpp | 35 ++++++++--------- engines/sci/engine/script.h | 6 ++- engines/sci/engine/segment.cpp | 89 +++++++++++++++++++++++++++++------------- engines/sci/engine/segment.h | 35 +++++++++-------- 5 files changed, 109 insertions(+), 71 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f682e0e524..8ea7daa7c6 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1847,11 +1847,6 @@ bool Console::cmdGCObjects(int argc, const char **argv) { return true; } -void _print_address(void * _, reg_t addr) { - if (addr.segment) - g_sci->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(addr)); -} - bool Console::cmdGCShowReachable(int argc, const char **argv) { if (argc != 2) { DebugPrintf("Prints all addresses directly reachable from the memory object specified as parameter.\n"); @@ -1875,7 +1870,10 @@ bool Console::cmdGCShowReachable(int argc, const char **argv) { } DebugPrintf("Reachable from %04x:%04x:\n", PRINT_REG(addr)); - mobj->listAllOutgoingReferences(addr, NULL, _print_address); + const Common::Array tmp = mobj->listAllOutgoingReferences(addr); + for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) + if (it->segment) + g_sci->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(*it)); return true; } @@ -1904,7 +1902,10 @@ bool Console::cmdGCShowFreeable(int argc, const char **argv) { } DebugPrintf("Freeable in segment %04x:\n", addr.segment); - mobj->listAllDeallocatable(addr.segment, NULL, _print_address); + const Common::Array tmp = mobj->listAllDeallocatable(addr.segment); + for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) + if (it->segment) + g_sci->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(*it)); return true; } diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index c2f1c15776..59f62c8996 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -46,6 +46,11 @@ struct WorklistManager { _map.setVal(reg, true); _worklist.push_back(reg); } + + void push(const Common::Array &tmp) { + for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) + push(*it); + } }; static reg_t_hash_map *normalise_hashmap_ptrs(SegManager *segMan, reg_t_hash_map &nonnormal_map) { @@ -65,11 +70,6 @@ static reg_t_hash_map *normalise_hashmap_ptrs(SegManager *segMan, reg_t_hash_map } -void add_outgoing_refs(void *refcon, reg_t addr) { - WorklistManager *wm = (WorklistManager *)refcon; - wm->push(addr); -} - reg_t_hash_map *find_all_used_references(EngineState *s) { SegManager *segMan = s->_segMan; reg_t_hash_map *normal_map = NULL; @@ -125,15 +125,7 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { Script *script = (Script *)segMan->_heap[i]; if (script->getLockers()) { // Explicitly loaded? - // Locals, if present - wm.push(make_reg(script->_localsSegment, 0)); - - // All objects (may be classes, may be indirectly reachable) - ObjMap::iterator it; - const ObjMap::iterator end = script->_objects.end(); - for (it = script->_objects.begin(); it != end; ++it) { - wm.push(it->_value.getPos()); - } + wm.push(script->listObjectReferences()); } } @@ -146,8 +138,10 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { wm._worklist.pop_back(); if (reg.segment != stack_seg) { // No need to repeat this one debugC(2, kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); - if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment]) - segMan->_heap[reg.segment]->listAllOutgoingReferences(reg, &wm, add_outgoing_refs); + if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment]) { + // Valid heap object? Find its outgoing references! + wm.push(segMan->_heap[reg.segment]->listAllOutgoingReferences(reg)); + } } } @@ -167,8 +161,7 @@ struct deallocator_t { reg_t_hash_map *use_map; }; -void free_unless_used(void *refcon, reg_t addr) { - deallocator_t *deallocator = (deallocator_t *)refcon; +static void free_unless_used(deallocator_t *deallocator, reg_t addr) { reg_t_hash_map *use_map = deallocator->use_map; if (!use_map->contains(addr)) { @@ -201,7 +194,11 @@ void run_gc(EngineState *s) { #ifdef DEBUG_GC deallocator.segnames[deallocator.mobj->getType()] = deallocator.mobj->type; // FIXME: add a segment "name" #endif - deallocator.mobj->listAllDeallocatable(seg_nr, &deallocator, free_unless_used); + const Common::Array tmp = deallocator.mobj->listAllDeallocatable(seg_nr); + for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { + free_unless_used(&deallocator, *it); + } + } } diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index aab073f3a1..490a7a81a3 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -104,8 +104,10 @@ public: virtual SegmentRef dereference(reg_t pointer); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const; - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllDeallocatable(SegmentId segId) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; + + Common::Array listObjectReferences() const; virtual void saveLoadWithSerializer(Common::Serializer &ser); diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 2bbedf2dcf..f8a941fa7a 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -218,20 +218,22 @@ void Script::freeAtAddress(SegManager *segMan, reg_t addr) { segMan->deallocateScript(_nr); } -void Script::listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const { - (*note)(param, make_reg(segId, 0)); +Common::Array Script::listAllDeallocatable(SegmentId segId) const { + const reg_t r = make_reg(segId, 0); + return Common::Array(&r, 1); } -void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array Script::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) { const Object *obj = getObject(addr.offset); if (obj) { // Note all local variables, if we have a local variable environment if (_localsSegment) - (*note)(param, make_reg(_localsSegment, 0)); + tmp.push_back(make_reg(_localsSegment, 0)); for (uint i = 0; i < obj->getVarCount(); i++) - (*note)(param, obj->getVariable(i)); + tmp.push_back(obj->getVariable(i)); } else { error("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr)); } @@ -239,12 +241,30 @@ void Script::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback not /* warning("Unexpected request for outgoing script-object references at %04x:%04x", PRINT_REG(addr));*/ /* Happens e.g. when we're looking into strings */ } + return tmp; } +Common::Array Script::listObjectReferences() const { + Common::Array tmp; + + // Locals, if present + if (_localsSegment) + tmp.push_back(make_reg(_localsSegment, 0)); + + // All objects (may be classes, may be indirectly reachable) + ObjMap::iterator it; + const ObjMap::iterator end = _objects.end(); + for (it = _objects.begin(); it != end; ++it) { + tmp.push_back(it->_value.getPos()); + } + + return tmp; +} //-------------------- clones -------------------- -void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array CloneTable::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; // assert(addr.segment == _segId); if (!isValidEntry(addr.offset)) { @@ -255,11 +275,13 @@ void CloneTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback // Emit all member variables (including references to the 'super' delegate) for (uint i = 0; i < clone->getVarCount(); i++) - (*note)(param, clone->getVariable(i)); + tmp.push_back(clone->getVariable(i)); // Note that this also includes the 'base' object, which is part of the script and therefore also emits the locals. - (*note)(param, clone->getPos()); + tmp.push_back(clone->getPos()); //debugC(2, kDebugLevelGC, "[GC] Reporting clone-pos %04x:%04x", PRINT_REG(clone->pos)); + + return tmp; } void CloneTable::freeAtAddress(SegManager *segMan, reg_t addr) { @@ -293,11 +315,14 @@ reg_t LocalVariables::findCanonicAddress(SegManager *segMan, reg_t addr) const { return make_reg(owner_seg, 0); } -void LocalVariables::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array LocalVariables::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; // assert(addr.segment == _segId); for (uint i = 0; i < _locals.size(); i++) - (*note)(param, _locals[i]); + tmp.push_back(_locals[i]); + + return tmp; } @@ -307,11 +332,14 @@ reg_t DataStack::findCanonicAddress(SegManager *segMan, reg_t addr) const { return addr; } -void DataStack::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array DataStack::listAllOutgoingReferences(reg_t object) const { + Common::Array tmp; fprintf(stderr, "Emitting %d stack entries\n", _capacity); for (int i = 0; i < _capacity; i++) - (*note)(param, _entries[i]); + tmp.push_back(_entries[i]); fprintf(stderr, "DONE"); + + return tmp; } @@ -320,18 +348,20 @@ void ListTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { freeEntry(sub_addr.offset); } -void ListTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array ListTable::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; if (!isValidEntry(addr.offset)) { error("Invalid list referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); - return; } const List *list = &(_table[addr.offset]); - note(param, list->first); - note(param, list->last); + tmp.push_back(list->first); + tmp.push_back(list->last); // We could probably get away with just one of them, but // let's be conservative here. + + return tmp; } @@ -340,19 +370,21 @@ void NodeTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { freeEntry(sub_addr.offset); } -void NodeTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array NodeTable::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; if (!isValidEntry(addr.offset)) { error("Invalid node referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); - return; } const Node *node = &(_table[addr.offset]); // We need all four here. Can't just stick with 'pred' OR 'succ' because node operations allow us // to walk around from any given node - note(param, node->pred); - note(param, node->succ); - note(param, node->key); - note(param, node->value); + tmp.push_back(node->pred); + tmp.push_back(node->succ); + tmp.push_back(node->key); + tmp.push_back(node->value); + + return tmp; } @@ -473,8 +505,9 @@ reg_t DynMem::findCanonicAddress(SegManager *segMan, reg_t addr) const { return addr; } -void DynMem::listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const { - (*note)(param, make_reg(segId, 0)); +Common::Array DynMem::listAllDeallocatable(SegmentId segId) const { + const reg_t r = make_reg(segId, 0); + return Common::Array(&r, 1); } #ifdef ENABLE_SCI32 @@ -492,10 +525,10 @@ void ArrayTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { freeEntry(sub_addr.offset); } -void ArrayTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback note) const { +Common::Array ArrayTable::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; if (!isValidEntry(addr.offset)) { error("Invalid array referenced for outgoing references: %04x:%04x", PRINT_REG(addr)); - return; } const SciArray *array = &(_table[addr.offset]); @@ -503,8 +536,10 @@ void ArrayTable::listAllOutgoingReferences(reg_t addr, void *param, NoteCallback for (uint32 i = 0; i < array->getSize(); i++) { reg_t value = array->getValue(i); if (value.segment != 0) - note(param, value); + tmp.push_back(value); } + + return tmp; } Common::String SciString::toString() const { diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index b621e53412..c12efecf1c 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -80,8 +80,6 @@ enum SegmentType { struct SegmentObj : public Common::Serializable { SegmentType _type; - typedef void (*NoteCallback)(void *param, reg_t addr); // FIXME: Bad choice of name - public: static SegmentObj *createSegmentObj(SegmentType type); @@ -125,16 +123,19 @@ public: * @param note Invoked for each address on which free_at_address() makes sense * @param param parameter passed to 'note' */ - virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const {} + virtual Common::Array listAllDeallocatable(SegmentId segId) const { + return Common::Array(); + } /** * Iterates over all references reachable from the specified object. - * @param object object (within the current segment) to analyse - * @param param parameter passed to 'note' - * @param note Invoked for each outgoing reference within the object + * @param object object (within the current segment) to analyse + * @return refs a list of outgoing references within the object * Note: This function may also choose to report numbers (segment 0) as adresses */ - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const {} + virtual Common::Array listAllOutgoingReferences(reg_t object) const { + return Common::Array(); + } }; @@ -195,7 +196,7 @@ public: virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -349,7 +350,7 @@ public: virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -437,10 +438,12 @@ public: entries_used--; } - virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const { + virtual Common::Array listAllDeallocatable(SegmentId segId) const { + Common::Array tmp; for (uint i = 0; i < _table.size(); i++) if (isValidEntry(i)) - (*note)(param, make_reg(segId, i)); + tmp.push_back(make_reg(segId, i)); + return tmp; } }; @@ -450,7 +453,7 @@ struct CloneTable : public Table { CloneTable() : Table(SEG_TYPE_CLONES) {} virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -461,7 +464,7 @@ struct NodeTable : public Table { NodeTable() : Table(SEG_TYPE_NODES) {} virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -472,7 +475,7 @@ struct ListTable : public Table { ListTable() : Table(SEG_TYPE_LISTS) {} virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -511,7 +514,7 @@ public: virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; - virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note) const; + virtual Common::Array listAllDeallocatable(SegmentId segId) const; virtual void saveLoadWithSerializer(Common::Serializer &ser); }; @@ -645,7 +648,7 @@ struct ArrayTable : public Table > { ArrayTable() : Table >(SEG_TYPE_ARRAY) {} virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr); - virtual void listAllOutgoingReferences(reg_t object, void *param, NoteCallback note) const; + virtual Common::Array listAllOutgoingReferences(reg_t object) const; void saveLoadWithSerializer(Common::Serializer &ser); SegmentRef dereference(reg_t pointer); -- cgit v1.2.3 From 6c0205b104e30a60b2c5f9ff5c5e417fde497808 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:23:00 +0000 Subject: SCI: Fix DEBUG_GC mode and permanently enable it svn-id: r50430 --- engines/sci/engine/gc.cpp | 67 ++++++++++++------------------------------ engines/sci/engine/segment.cpp | 44 +++++++++++++++++++++++++++ engines/sci/engine/segment.h | 1 + 3 files changed, 64 insertions(+), 48 deletions(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 59f62c8996..a306045cb7 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -28,8 +28,6 @@ namespace Sci { -//#define DEBUG_GC - struct WorklistManager { Common::Array _worklist; reg_t_hash_map _map; @@ -151,68 +149,41 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { return normal_map; } -struct deallocator_t { - SegManager *segMan; - SegmentObj *mobj; -#ifdef DEBUG_GC - char *segnames[SEG_TYPE_MAX + 1]; - int segcount[SEG_TYPE_MAX + 1]; -#endif - reg_t_hash_map *use_map; -}; - -static void free_unless_used(deallocator_t *deallocator, reg_t addr) { - reg_t_hash_map *use_map = deallocator->use_map; - - if (!use_map->contains(addr)) { - // Not found -> we can free it - deallocator->mobj->freeAtAddress(deallocator->segMan, addr); -#ifdef DEBUG_GC - debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr)); - deallocator->segcount[deallocator->mobj->getType()]++; -#endif - } - -} - void run_gc(EngineState *s) { uint seg_nr; - deallocator_t deallocator; SegManager *segMan = s->_segMan; -#ifdef DEBUG_GC + const char *segnames[SEG_TYPE_MAX + 1]; + int segcount[SEG_TYPE_MAX + 1]; debugC(2, kDebugLevelGC, "[GC] Running..."); - memset(&(deallocator.segcount), 0, sizeof(int) * (SEG_TYPE_MAX + 1)); -#endif + memset(segcount, 0, sizeof(segcount)); - deallocator.segMan = segMan; - deallocator.use_map = find_all_used_references(s); + reg_t_hash_map *use_map = find_all_used_references(s); for (seg_nr = 1; seg_nr < segMan->_heap.size(); seg_nr++) { if (segMan->_heap[seg_nr] != NULL) { - deallocator.mobj = segMan->_heap[seg_nr]; -#ifdef DEBUG_GC - deallocator.segnames[deallocator.mobj->getType()] = deallocator.mobj->type; // FIXME: add a segment "name" -#endif - const Common::Array tmp = deallocator.mobj->listAllDeallocatable(seg_nr); + SegmentObj *mobj = segMan->_heap[seg_nr]; + segnames[mobj->getType()] = SegmentObj::getSegmentTypeName(mobj->getType()); + const Common::Array tmp = mobj->listAllDeallocatable(seg_nr); for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { - free_unless_used(&deallocator, *it); + const reg_t addr = *it; + if (!use_map->contains(addr)) { + // Not found -> we can free it + mobj->freeAtAddress(segMan, addr); + debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr)); + segcount[mobj->getType()]++; + } } } } - delete deallocator.use_map; + delete use_map; -#ifdef DEBUG_GC - { - int i; - debugC(2, kDebugLevelGC, "[GC] Summary:"); - for (i = 0; i <= SEG_TYPE_MAX; i++) - if (deallocator.segcount[i]) - debugC(2, kDebugLevelGC, "\t%d\t* %s", deallocator.segcount[i], deallocator.segnames[i]); - } -#endif + debugC(2, kDebugLevelGC, "[GC] Summary:"); + for (int i = 0; i <= SEG_TYPE_MAX; i++) + if (segcount[i]) + debugC(2, kDebugLevelGC, "\t%d\t* %s", segcount[i], segnames[i]); } } // End of namespace Sci diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index f8a941fa7a..21ca1fe9b4 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -86,6 +86,50 @@ SegmentObj *SegmentObj::createSegmentObj(SegmentType type) { return mem; } +const char *SegmentObj::getSegmentTypeName(SegmentType type) { + switch (type) { + case SEG_TYPE_SCRIPT: + return "script"; + break; + case SEG_TYPE_CLONES: + return "clones"; + break; + case SEG_TYPE_LOCALS: + return "locals"; + break; + case SEG_TYPE_SYS_STRINGS: + return "strings"; + break; + case SEG_TYPE_STACK: + return "stack"; + break; + case SEG_TYPE_HUNK: + return "hunk"; + break; + case SEG_TYPE_LISTS: + return "lists"; + break; + case SEG_TYPE_NODES: + return "nodes"; + break; + case SEG_TYPE_DYNMEM: + return "dynmem"; + break; +#ifdef ENABLE_SCI32 + case SEG_TYPE_ARRAY: + return "array"; + break; + case SEG_TYPE_STRING: + return "string"; + break; +#endif + default: + error("Unknown SegmentObj type %d", type); + break; + } + return NULL; +} + // This helper function is used by Script::relocateLocal and Object::relocate // Duplicate in segment.cpp and script.cpp static bool relocateBlock(Common::Array &block, int block_location, SegmentId segment, int location, size_t scriptSize) { diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index c12efecf1c..d290475593 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -82,6 +82,7 @@ struct SegmentObj : public Common::Serializable { public: static SegmentObj *createSegmentObj(SegmentType type); + static const char *getSegmentTypeName(SegmentType type); public: SegmentObj(SegmentType type) : _type(type) {} -- cgit v1.2.3 From e5509d38b609b23c6fa65f0c511baa6895162ec1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 11:23:16 +0000 Subject: SCI: More comment rewrapping svn-id: r50431 --- engines/sci/engine/features.cpp | 73 ++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 2ad494b37f..f0abdde694 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -91,10 +91,10 @@ bool GameFeatures::autoDetectSoundType() { if (opcode == op_ret || offset >= script->getBufSize()) break; - // The play method of the Sound object pushes the DoSound command - // that it'll use just before it calls DoSound. We intercept that here - // in order to check what sound semantics are used, cause the position - // of the sound commands has changed at some point during SCI1 middle + // The play method of the Sound object pushes the DoSound command that + // it will use just before it calls DoSound. We intercept that here in + // order to check what sound semantics are used, cause the position of + // the sound commands has changed at some point during SCI1 middle. if (opcode == op_pushi) { // Load the pushi parameter intParam = opparams[0]; @@ -105,8 +105,8 @@ bool GameFeatures::autoDetectSoundType() { if (kFuncNum == 6) { // kIsObject (SCI0-SCI11) foundTarget = true; } else if (kFuncNum == 45) { // kDoSound (SCI1) - // First, check which DoSound function is called by the play method of - // the Sound object + // First, check which DoSound function is called by the play + // method of the Sound object switch (intParam) { case 1: _doSoundType = SCI_VERSION_0_EARLY; @@ -119,8 +119,8 @@ bool GameFeatures::autoDetectSoundType() { break; default: // Unknown case... should never happen. We fall back to - // alternative detection here, which works in general, apart from - // some transitive games like Jones CD + // alternative detection here, which works in general, apart + // from some transitive games like Jones CD _doSoundType = foundTarget ? SCI_VERSION_1_LATE : SCI_VERSION_1_EARLY; break; } @@ -137,7 +137,8 @@ bool GameFeatures::autoDetectSoundType() { SciVersion GameFeatures::detectDoSoundType() { if (_doSoundType == SCI_VERSION_NONE) { if (getSciVersion() == SCI_VERSION_0_EARLY) { - // This game is using early SCI0 sound code (different headers than SCI0 late) + // This game is using early SCI0 sound code (different headers than + // SCI0 late) _doSoundType = SCI_VERSION_0_EARLY; } else if (SELECTOR(nodePtr) == -1) { // No nodePtr selector, so this game is definitely using newer @@ -172,14 +173,16 @@ SciVersion GameFeatures::detectSetCursorType() { // SCI1.1 games always use cursor views _setCursorType = SCI_VERSION_1_1; } else { // SCI1 late game, detect cursor semantics - // If the Cursor object doesn't exist, we're using the SCI0 early kSetCursor semantics. + // If the Cursor object doesn't exist, we're using the SCI0 early + // kSetCursor semantics. if (_segMan->findObjectByName("Cursor") == NULL_REG) { _setCursorType = SCI_VERSION_0_EARLY; debugC(1, kDebugLevelGraphics, "Detected SetCursor type: %s", getSciVersionDesc(_setCursorType)); return _setCursorType; } - // Check for the existence of the handCursor object (first found). This is based on KQ5. + // Check for the existence of the handCursor object (first found). + // This is based on KQ5. reg_t objAddr = _segMan->findObjectByName("handCursor", 0); // If that doesn't exist, we assume it uses SCI1.1 kSetCursor semantics @@ -189,11 +192,13 @@ SciVersion GameFeatures::detectSetCursorType() { return _setCursorType; } - // Now we check what the number variable holds in the handCursor object. + // Now we check what the number variable holds in the handCursor + // object. uint16 number = readSelectorValue(_segMan, objAddr, SELECTOR(number)); - // If the number is 0, it uses views and therefore the SCI1.1 kSetCursor semantics, - // otherwise it uses the SCI0 early kSetCursor semantics. + // If the number is 0, it uses views and therefore the SCI1.1 + // kSetCursor semantics, otherwise it uses the SCI0 early kSetCursor + // semantics. if (number == 0) _setCursorType = SCI_VERSION_1_1; else @@ -318,10 +323,10 @@ bool GameFeatures::autoDetectGfxFunctionsType(int methodNum) { uint16 argc = opparams[1]; if (kFuncNum == 8) { // kDrawPic (SCI0 - SCI11) - // If kDrawPic is called with 6 parameters from the - // overlay selector, the game is using old graphics functions. + // If kDrawPic is called with 6 parameters from the overlay + // selector, the game is using old graphics functions. // Otherwise, if it's called with 8 parameters, it's using new - // graphics functions + // graphics functions. _gfxFunctionsType = (argc == 8) ? SCI_VERSION_0_LATE : SCI_VERSION_0_EARLY; return true; } @@ -345,32 +350,35 @@ SciVersion GameFeatures::detectGfxFunctionsType() { reg_t rmObjAddr = _segMan->findObjectByName("Rm"); if (SELECTOR(overlay) != -1) { - // The game has an overlay selector, check how it calls kDrawPicto determine - // the graphics functions type used + // The game has an overlay selector, check how it calls kDrawPic + // to determine the graphics functions type used if (lookupSelector(_segMan, rmObjAddr, SELECTOR(overlay), NULL, NULL) == kSelectorMethod) { if (!autoDetectGfxFunctionsType()) { warning("Graphics functions detection failed, taking an educated guess"); - // Try detecting the graphics function types from the existence of the motionCue - // selector (which is a bit of a hack) + // Try detecting the graphics function types from the + // existence of the motionCue selector (which is a bit + // of a hack) if (_kernel->findSelector("motionCue") != -1) _gfxFunctionsType = SCI_VERSION_0_LATE; else _gfxFunctionsType = SCI_VERSION_0_EARLY; } } else { - // The game has an overlay selector, but it's not a method of the Rm object - // (like in Hoyle 1 and 2), so search for other methods + // The game has an overlay selector, but it's not a method + // of the Rm object (like in Hoyle 1 and 2), so search for + // other methods searchRoomObj = true; } } else { - // The game doesn't have an overlay selector, so search for it manually + // The game doesn't have an overlay selector, so search for it + // manually searchRoomObj = true; } if (searchRoomObj) { - // If requested, check if any method of the Rm object is calling kDrawPic, - // as the overlay selector might be missing in demos + // If requested, check if any method of the Rm object is calling + // kDrawPic, as the overlay selector might be missing in demos bool found = false; const Object *obj = _segMan->getObject(rmObjAddr); @@ -381,8 +389,9 @@ SciVersion GameFeatures::detectGfxFunctionsType() { } if (!found) { - // No method of the Rm object is calling kDrawPic, thus the game - // doesn't have overlays and is using older graphics functions + // No method of the Rm object is calling kDrawPic, thus the + // game doesn't have overlays and is using older graphics + // functions _gfxFunctionsType = SCI_VERSION_0_EARLY; } } @@ -420,9 +429,11 @@ bool GameFeatures::autoDetectSci21KernelType() { uint16 kFuncNum = opparams[0]; // Here we check for the kDoSound opcode that's used in SCI2.1. - // Finding 0x40 as kDoSound in the Sound::play() function means the game is using - // the modified SCI2 kernel table found in some older SCI2.1 games (GK2 demo, KQ7 v1.4). - // Finding 0x75 as kDoSound means the game is using the regular SCI2.1 kernel table. + // Finding 0x40 as kDoSound in the Sound::play() function means the + // game is using the modified SCI2 kernel table found in some older + // SCI2.1 games (GK2 demo, KQ7 v1.4). + // Finding 0x75 as kDoSound means the game is using the regular + // SCI2.1 kernel table. if (kFuncNum == 0x40) { _sci21KernelType = SCI_VERSION_2; return true; -- cgit v1.2.3 From 6063a9cba32443234be31d77e3a7a57870c88007 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 28 Jun 2010 11:40:39 +0000 Subject: Bugfix to properly erase text messages when they expire svn-id: r50432 --- engines/m4/mads_views.cpp | 17 ++++++++--------- engines/m4/mads_views.h | 1 + 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 7b0b1443a8..1766603dc8 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -313,7 +313,7 @@ int MadsTextDisplay::add(int xp, int yp, uint fontColour, int charSpacing, const void MadsTextDisplay::setDirtyAreas() { // Determine dirty areas for active text areas for (uint idx = 0, dirtyIdx = DIRTY_AREAS_TEXT_DISPLAY_IDX; dirtyIdx < DIRTY_AREAS_SIZE; ++idx, ++dirtyIdx) { - if ((_entries[idx].expire < 0) || !_entries[idx].active) + if ((_entries[idx].expire >= 0) || !_entries[idx].active) _owner._dirtyAreas[dirtyIdx].active = false; else { _owner._dirtyAreas[dirtyIdx].textActive = true; @@ -341,14 +341,6 @@ void MadsTextDisplay::draw(View *view, int yOffset) { _entries[idx].spacing); } } - - // Clear up any now text display entries that are to be expired - for (uint idx = 0; idx < _entries.size(); ++idx) { - if (_entries[idx].expire < 0) { - _entries[idx].active = false; - _entries[idx].expire = 0; - } - } } /** @@ -827,6 +819,7 @@ void MadsDirtyAreas::setTextDisplay(int dirtyIdx, const MadsTextDisplayEntry &te * @param count Number of entries to process */ void MadsDirtyAreas::merge(int startIndex, int count) { +return;//***DEBUG*** if (startIndex >= count) return; @@ -878,6 +871,11 @@ void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset, const Co } } +void MadsDirtyAreas::clear() { + for (uint i = 0; i < _entries.size(); ++i) + _entries[i].active = false; +} + /*--------------------------------------------------------------------------*/ MadsSequenceList::MadsSequenceList(MadsView &owner): _owner(owner) { @@ -1209,6 +1207,7 @@ MadsView::~MadsView() { void MadsView::refresh() { // Draw any sprites + _dirtyAreas.clear(); _spriteSlots.drawBackground(_yOffset); // Process dirty areas diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index fc001740d3..8bc507f20b 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -294,6 +294,7 @@ public: bool intersects(int idx1, int idx2); void mergeAreas(int idx1, int idx2); void copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust); + void clear(); }; enum SpriteAnimType {ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2}; -- cgit v1.2.3 From 6981b943b51f4ae1348e06992e8f7333824d05c5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 12:04:35 +0000 Subject: SCI: fix regression of r50424, 2x scaling svn-id: r50433 --- engines/sci/graphics/screen.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index a86f64c44f..f991f4b8a8 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -594,9 +594,9 @@ void GfxScreen::debugShowMap(int mapNo) { } void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { - const int newWidth = srcWidth * 2; - const byte *srcPtr = src; - + int newWidth = srcWidth * 2; + const byte *srcPtr = src; + for (int y = 0; y < srcHeight; y++) { for (int x = 0; x < srcWidth; x++) { const byte color = *srcPtr++; @@ -606,7 +606,7 @@ void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHei dst[newWidth + 1] = color; dst += 2; } - dst += srcWidth; + dst += newWidth; } } -- cgit v1.2.3 From 445bfee08c6d78457514701aaa4701d7883eea15 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 12:09:48 +0000 Subject: SCI: add const again to newWidth svn-id: r50434 --- engines/sci/graphics/screen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index f991f4b8a8..8cda42e9aa 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -594,7 +594,7 @@ void GfxScreen::debugShowMap(int mapNo) { } void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { - int newWidth = srcWidth * 2; + const int newWidth = srcWidth * 2; const byte *srcPtr = src; for (int y = 0; y < srcHeight; y++) { -- cgit v1.2.3 From 0f0977535c0fa07ca28ed696c906279153b1c9d8 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 28 Jun 2010 12:13:04 +0000 Subject: Remove CRs svn-id: r50435 --- engines/sci/graphics/screen.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 8cda42e9aa..eee6898a23 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -594,9 +594,9 @@ void GfxScreen::debugShowMap(int mapNo) { } void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { - const int newWidth = srcWidth * 2; - const byte *srcPtr = src; - + const int newWidth = srcWidth * 2; + const byte *srcPtr = src; + for (int y = 0; y < srcHeight; y++) { for (int x = 0; x < srcWidth; x++) { const byte color = *srcPtr++; -- cgit v1.2.3 From 84d43b9ab4b753195b84143513f32a1f3c4b3355 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 28 Jun 2010 12:16:53 +0000 Subject: Fonts: Add Russian codepage fonts, renamed existing ones svn-id: r50436 --- gui/themes/fonts/5x8-L1.bdf | 3380 ----- gui/themes/fonts/clR6x12-L1.bdf | 4290 ------ gui/themes/fonts/clR6x12-iso-8859-1.bdf | 4290 ++++++ gui/themes/fonts/clR6x12-iso-8859-5.bdf | 4291 ++++++ gui/themes/fonts/clR6x12.bdf | 22736 +++++++++++++++++++++++++++++ gui/themes/fonts/fixed5x8-iso-8859-1.bdf | 3380 +++++ gui/themes/fonts/fixed5x8-iso-8859-5.bdf | 2309 +++ gui/themes/fonts/helvB12-L1.bdf | 3059 ---- gui/themes/fonts/helvB12-iso-8859-1.bdf | 3059 ++++ gui/themes/fonts/helvB12-iso-8859-5.bdf | 2763 ++++ 10 files changed, 42828 insertions(+), 10729 deletions(-) delete mode 100644 gui/themes/fonts/5x8-L1.bdf delete mode 100644 gui/themes/fonts/clR6x12-L1.bdf create mode 100644 gui/themes/fonts/clR6x12-iso-8859-1.bdf create mode 100644 gui/themes/fonts/clR6x12-iso-8859-5.bdf create mode 100644 gui/themes/fonts/clR6x12.bdf create mode 100644 gui/themes/fonts/fixed5x8-iso-8859-1.bdf create mode 100644 gui/themes/fonts/fixed5x8-iso-8859-5.bdf delete mode 100644 gui/themes/fonts/helvB12-L1.bdf create mode 100644 gui/themes/fonts/helvB12-iso-8859-1.bdf create mode 100644 gui/themes/fonts/helvB12-iso-8859-5.bdf diff --git a/gui/themes/fonts/5x8-L1.bdf b/gui/themes/fonts/5x8-L1.bdf deleted file mode 100644 index 80ea041db5..0000000000 --- a/gui/themes/fonts/5x8-L1.bdf +++ /dev/null @@ -1,3380 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl 5x8.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -COMMENT Id: 5x8.bdf,v 1.28 2001-04-03 13:37:48+01 mgk25 Exp mgk25 $ -COMMENT Send bug reports to Markus Kuhn -FONT -Misc-Fixed-Medium-R-Normal--8-80-75-75-C-50-ISO8859-1 -SIZE 11 75 75 -FONTBOUNDINGBOX 5 8 0 -1 -STARTPROPERTIES 21 -FONTNAME_REGISTRY "" -FOUNDRY "Misc" -FAMILY_NAME "Fixed" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 8 -POINT_SIZE 80 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "C" -AVERAGE_WIDTH 50 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -FONT_DESCENT 1 -FONT_ASCENT 7 -COPYRIGHT "Public domain font. Share and enjoy." -DEFAULT_CHAR 0 -CAP_HEIGHT 6 -X_HEIGHT 4 -ENDPROPERTIES -CHARS 223 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -A0 -10 -80 -10 -80 -50 -00 -ENDCHAR -STARTCHAR uni25C6 -ENCODING 1 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -70 -F8 -70 -20 -00 -ENDCHAR -STARTCHAR shade -ENCODING 2 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A8 -50 -A8 -50 -A8 -50 -A8 -ENDCHAR -STARTCHAR uni2409 -ENCODING 3 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -A0 -A0 -E0 -A0 -A0 -70 -20 -20 -ENDCHAR -STARTCHAR uni240C -ENCODING 4 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -E0 -80 -C0 -B8 -A0 -30 -20 -20 -ENDCHAR -STARTCHAR uni240D -ENCODING 5 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -80 -80 -60 -30 -28 -30 -28 -ENDCHAR -STARTCHAR uni240A -ENCODING 6 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -80 -80 -80 -E0 -38 -20 -30 -20 -ENDCHAR -STARTCHAR degree -ENCODING 7 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 8 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -70 -20 -00 -70 -00 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -90 -D0 -B0 -90 -20 -20 -20 -38 -ENDCHAR -STARTCHAR uni240B -ENCODING 10 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -A0 -A0 -A0 -40 -38 -10 -10 -10 -ENDCHAR -STARTCHAR SF040000 -ENCODING 11 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -E0 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF030000 -ENCODING 12 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -E0 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF010000 -ENCODING 13 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -38 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF020000 -ENCODING 14 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -38 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF050000 -ENCODING 15 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23BA -ENCODING 16 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -F8 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BB -ENCODING 17 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F8 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF100000 -ENCODING 18 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BC -ENCODING 19 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -F8 -00 -ENDCHAR -STARTCHAR uni23BD -ENCODING 20 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -00 -F8 -ENDCHAR -STARTCHAR SF080000 -ENCODING 21 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -38 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF090000 -ENCODING 22 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -E0 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF070000 -ENCODING 23 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -F8 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF060000 -ENCODING 24 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF110000 -ENCODING 25 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR lessequal -ENCODING 26 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -10 -20 -40 -20 -10 -70 -00 -ENDCHAR -STARTCHAR greaterequal -ENCODING 27 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -20 -10 -20 -40 -70 -00 -ENDCHAR -STARTCHAR pi -ENCODING 28 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F8 -50 -50 -50 -00 -ENDCHAR -STARTCHAR notequal -ENCODING 29 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -F0 -60 -F0 -40 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 30 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -E0 -40 -50 -A0 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 31 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -20 -00 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -20 -20 -20 -00 -20 -00 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -50 -F8 -50 -F8 -50 -50 -00 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -70 -A0 -70 -28 -70 -20 -00 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -50 -20 -50 -10 -00 -00 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -A0 -A0 -40 -A0 -A0 -50 -00 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -40 -40 -40 -40 -20 -00 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -20 -20 -20 -20 -40 -00 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -90 -60 -F0 -60 -90 -00 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -20 -F8 -20 -20 -00 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -30 -20 -40 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -20 -70 -20 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -10 -10 -20 -40 -80 -80 -00 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -50 -50 -50 -20 -00 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -60 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -10 -60 -80 -F0 -00 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -20 -60 -10 -90 -60 -00 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -60 -A0 -F0 -20 -20 -00 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -80 -E0 -10 -90 -60 -00 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -80 -E0 -90 -90 -60 -00 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -10 -20 -20 -40 -40 -00 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -90 -70 -10 -60 -00 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -60 -60 -00 -60 -60 -00 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -30 -30 -00 -30 -20 -40 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -10 -20 -40 -40 -20 -10 -00 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F0 -00 -F0 -00 -00 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -20 -10 -10 -20 -40 -00 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -10 -20 -00 -20 -00 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -30 -48 -98 -A8 -A8 -90 -40 -30 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -E0 -90 -E0 -90 -90 -E0 -00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -80 -80 -90 -60 -00 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -E0 -90 -90 -90 -90 -E0 -00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -80 -E0 -80 -80 -F0 -00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -80 -E0 -80 -80 -80 -00 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -80 -B0 -90 -60 -00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -90 -F0 -90 -90 -90 -00 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -20 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -20 -20 -20 -A0 -40 -00 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -A0 -C0 -A0 -A0 -90 -00 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -80 -80 -80 -F0 -00 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -F0 -F0 -90 -90 -90 -00 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -D0 -F0 -B0 -B0 -90 -00 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -E0 -90 -90 -E0 -80 -80 -00 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -90 -D0 -B0 -60 -10 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -E0 -90 -90 -E0 -90 -90 -00 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -40 -20 -90 -60 -00 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -20 -20 -20 -20 -20 -00 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -90 -90 -90 -60 -60 -00 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -90 -90 -F0 -F0 -90 -00 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -90 -60 -60 -90 -90 -00 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -88 -88 -50 -20 -20 -20 -00 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -F0 -10 -20 -40 -80 -F0 -00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -40 -40 -40 -40 -70 -00 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -40 -20 -10 -10 -00 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -10 -10 -10 -10 -70 -00 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -00 -F0 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -20 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -E0 -90 -90 -E0 -00 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -30 -40 -40 -30 -00 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -10 -10 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -60 -B0 -C0 -60 -00 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -40 -E0 -40 -40 -00 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -60 -90 -70 -10 -60 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -E0 -90 -90 -90 -00 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -00 -60 -20 -20 -70 -00 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -10 -00 -10 -10 -10 -50 -20 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -90 -E0 -90 -90 -00 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -20 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -D0 -A8 -A8 -A8 -00 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -E0 -90 -90 -90 -00 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -E0 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -70 -90 -70 -10 -10 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -A0 -D0 -80 -80 -00 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -30 -60 -10 -60 -00 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -40 -40 -E0 -40 -50 -20 -00 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -90 -90 -90 -70 -00 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -50 -50 -50 -20 -00 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -88 -A8 -A8 -50 -00 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -90 -60 -60 -90 -00 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F0 -20 -40 -F0 -00 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -30 -40 -20 -C0 -20 -40 -30 -00 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -20 -20 -20 -20 -20 -00 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -C0 -20 -40 -30 -40 -20 -C0 -00 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -A0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -00 -20 -20 -20 -20 -00 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -70 -A0 -A0 -70 -20 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -E0 -40 -50 -A0 -00 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -88 -70 -50 -70 -88 -00 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -88 -50 -F8 -20 -F8 -20 -00 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -20 -00 -20 -20 -20 -00 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -70 -80 -E0 -90 -70 -10 -E0 -00 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -A8 -C8 -C8 -A8 -70 -00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -30 -50 -30 -00 -70 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -50 -A0 -50 -00 -00 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -70 -10 -10 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -70 -00 -00 -00 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -E8 -D8 -E8 -D8 -70 -00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -50 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -70 -20 -00 -70 -00 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -50 -10 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -10 -60 -10 -60 -00 -00 -00 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -40 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -90 -90 -90 -E0 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -78 -E8 -E8 -68 -28 -28 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -20 -00 -00 -00 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -00 -00 -20 -40 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -60 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -50 -20 -00 -70 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -A0 -50 -A0 -00 -00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -80 -80 -80 -A0 -60 -F0 -20 -00 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -80 -80 -A0 -D0 -10 -20 -70 -00 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -80 -40 -80 -60 -A0 -F0 -20 -00 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -20 -00 -20 -40 -50 -20 -00 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -90 -00 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -60 -90 -F0 -90 -90 -00 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -A0 -A0 -F0 -A0 -B0 -00 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -80 -80 -90 -60 -40 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -F0 -80 -E0 -80 -F0 -00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -F0 -80 -E0 -80 -F0 -00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -F0 -80 -E0 -80 -F0 -00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -90 -00 -F0 -80 -E0 -80 -F0 -00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -70 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -10 -20 -70 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -50 -70 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -00 -70 -20 -20 -20 -70 -00 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -48 -E8 -48 -48 -70 -00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -90 -D0 -B0 -90 -90 -00 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -60 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -60 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -60 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -60 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -90 -00 -60 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -00 -50 -20 -50 -00 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -70 -B0 -B0 -D0 -D0 -E0 -00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -90 -00 -90 -90 -90 -90 -60 -00 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -10 -20 -88 -50 -20 -20 -20 -00 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -E0 -90 -90 -E0 -80 -00 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -60 -90 -A0 -A0 -90 -A0 -00 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -50 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -00 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -60 -70 -90 -90 -70 -00 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -F0 -68 -B0 -78 -00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -30 -40 -40 -30 -20 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -00 -60 -B0 -C0 -60 -00 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -00 -60 -B0 -C0 -60 -00 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -00 -60 -B0 -C0 -60 -00 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -00 -60 -B0 -C0 -60 -00 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -00 -60 -20 -20 -70 -00 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -10 -20 -00 -60 -20 -20 -70 -00 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -50 -00 -60 -20 -20 -70 -00 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -50 -00 -60 -20 -20 -70 -00 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -A0 -40 -A0 -10 -70 -90 -60 -00 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -00 -E0 -90 -90 -90 -00 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -50 -A0 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -00 -60 -90 -90 -60 -00 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -20 -00 -70 -00 -20 -00 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -00 -00 -70 -B0 -D0 -E0 -00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -40 -20 -00 -90 -90 -90 -70 -00 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -00 -90 -90 -90 -70 -00 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -60 -90 -00 -90 -90 -90 -70 -00 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -00 -90 -90 -90 -70 -00 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -40 -00 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -80 -80 -E0 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 436 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -00 -90 -00 -90 -90 -70 -90 -60 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/clR6x12-L1.bdf b/gui/themes/fonts/clR6x12-L1.bdf deleted file mode 100644 index 3e77859d72..0000000000 --- a/gui/themes/fonts/clR6x12-L1.bdf +++ /dev/null @@ -1,4290 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl clR6x12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -COMMENT $Xorg: clR6x12.bdf,v 1.3 2000/08/18 15:17:40 xorgcvs Exp $ -COMMENT -COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org -COMMENT 399 Beacon Ave. -COMMENT St. Paul, MN 55104-3527 -COMMENT -COMMENT Permission to use, copy, modify, and distribute this software and -COMMENT its documentation for any purpose and without fee is hereby -COMMENT granted, provided that the above copyright notice appear in all -COMMENT copies and that both that copyright notice and this permission -COMMENT notice appear in supporting documentation, and that the name of -COMMENT Dale Schumacher not be used in advertising or publicity pertaining to -COMMENT distribution of the software without specific, written prior -COMMENT permission. Dale Schumacher makes no representations about the -COMMENT suitability of this software for any purpose. It is provided "as -COMMENT is" without express or implied warranty. -COMMENT -COMMENT -COMMENT Modified by Robert Brady, -COMMENT -FONT -Schumacher-Clean-Medium-R-Normal--12-120-75-75-C-60-ISO8859-1 -SIZE 12 75 75 -FONTBOUNDINGBOX 6 12 0 -3 -STARTPROPERTIES 21 -FONTNAME_REGISTRY "" -FOUNDRY "Schumacher" -FAMILY_NAME "Clean" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "C" -AVERAGE_WIDTH 60 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -FONT_ASCENT 9 -FONT_DESCENT 3 -DEFAULT_CHAR 0 -COPYRIGHT "Copyright 1989 Dale Schumacher, 1999 Robert Brady." -CAP_HEIGHT 8 -X_HEIGHT 5 -ENDPROPERTIES -CHARS 223 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -A8 -00 -88 -00 -88 -00 -A8 -00 -00 -00 -ENDCHAR -STARTCHAR uni25C6 -ENCODING 1 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -20 -70 -F8 -70 -20 -00 -00 -00 -ENDCHAR -STARTCHAR shade -ENCODING 2 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -ENDCHAR -STARTCHAR uni2409 -ENCODING 3 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -A0 -A0 -E0 -A0 -BC -08 -08 -08 -08 -00 -00 -ENDCHAR -STARTCHAR uni240C -ENCODING 4 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -E0 -80 -C0 -9C -90 -1C -10 -10 -00 -00 -00 -ENDCHAR -STARTCHAR uni240D -ENCODING 5 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -60 -80 -80 -98 -74 -18 -14 -14 -00 -00 -00 -ENDCHAR -STARTCHAR uni240A -ENCODING 6 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -80 -80 -80 -9C -F0 -18 -10 -10 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 7 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -48 -48 -30 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 8 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -20 -20 -F8 -20 -20 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -A0 -E0 -E0 -E0 -B0 -10 -10 -10 -1C -00 -00 -00 -ENDCHAR -STARTCHAR uni240B -ENCODING 10 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -A0 -A0 -A0 -5C -48 -08 -08 -08 -00 -00 -00 -ENDCHAR -STARTCHAR SF040000 -ENCODING 11 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -E0 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF030000 -ENCODING 12 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF010000 -ENCODING 13 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -3F -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF020000 -ENCODING 14 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -3F -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF050000 -ENCODING 15 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -FF -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni23BA -ENCODING 16 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -FC -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BB -ENCODING 17 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -FC -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF100000 -ENCODING 18 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -FC -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR uni23BC -ENCODING 19 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -FC -00 -00 -00 -ENDCHAR -STARTCHAR uni23BD -ENCODING 20 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -ENDCHAR -STARTCHAR SF080000 -ENCODING 21 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -3F -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF090000 -ENCODING 22 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF070000 -ENCODING 23 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -FF -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR SF060000 -ENCODING 24 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -FF -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR SF110000 -ENCODING 25 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR lessequal -ENCODING 26 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -18 -60 -80 -60 -18 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR greaterequal -ENCODING 27 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -C0 -30 -08 -30 -C0 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR pi -ENCODING 28 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -F8 -88 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR notequal -ENCODING 29 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -10 -10 -F8 -20 -F8 -40 -40 -00 -00 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 30 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -48 -40 -E0 -40 -40 -48 -B0 -00 -00 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 31 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -30 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -20 -20 -20 -20 -20 -00 -20 -00 -00 -00 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -50 -F8 -50 -F8 -50 -50 -00 -00 -00 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -20 -78 -A0 -70 -28 -F0 -20 -00 -00 -00 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -C0 -C8 -10 -20 -40 -98 -18 -00 -00 -00 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -80 -80 -40 -A8 -90 -68 -00 -00 -00 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -08 -10 -10 -20 -20 -20 -20 -20 -10 -10 -08 -00 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -20 -10 -10 -10 -10 -10 -20 -20 -40 -00 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -20 -A8 -70 -A8 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -20 -20 -F8 -20 -20 -00 -00 -00 -00 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -30 -30 -20 -40 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -F8 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -30 -30 -00 -00 -00 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -08 -08 -10 -10 -20 -20 -40 -40 -80 -80 -00 -00 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -98 -A8 -C8 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -30 -10 -10 -10 -10 -10 -10 -00 -00 -00 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -08 -10 -20 -40 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -08 -30 -08 -08 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -30 -30 -50 -50 -F8 -10 -38 -00 -00 -00 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -F8 -80 -80 -F0 -08 -08 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -40 -80 -F0 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -F8 -88 -08 -08 -10 -10 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -88 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -88 -88 -78 -08 -10 -60 -00 -00 -00 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -30 -30 -00 -00 -30 -30 -00 -00 -00 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -30 -30 -00 -00 -30 -30 -20 -40 -00 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -0C -30 -C0 -30 -0C -00 -00 -00 -00 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -F8 -00 -F8 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -C0 -30 -0C -30 -C0 -00 -00 -00 -00 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -70 -88 -08 -10 -20 -20 -00 -20 -00 -00 -00 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -B8 -B8 -B0 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -20 -50 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F0 -88 -88 -F0 -88 -88 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -80 -80 -80 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -E0 -90 -88 -88 -88 -90 -E0 -00 -00 -00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -80 -80 -F0 -80 -80 -80 -00 -00 -00 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -80 -98 -88 -88 -78 -00 -00 -00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -88 -F8 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -38 -08 -08 -08 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -90 -A0 -C0 -A0 -90 -88 -00 -00 -00 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -80 -80 -80 -80 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -D8 -A8 -A8 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -C8 -C8 -A8 -98 -98 -88 -00 -00 -00 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F0 -88 -88 -F0 -80 -80 -80 -00 -00 -00 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -88 -88 -88 -88 -70 -18 -00 -00 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F0 -88 -88 -F0 -A0 -90 -88 -00 -00 -00 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -80 -70 -08 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -20 -20 -20 -20 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -88 -50 -50 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -88 -A8 -A8 -D8 -88 -00 -00 -00 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -50 -20 -50 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -88 -50 -20 -20 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -08 -10 -20 -40 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -38 -20 -20 -20 -20 -20 -20 -20 -20 -20 -38 -00 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -80 -80 -40 -40 -20 -20 -10 -10 -08 -08 -00 -00 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -70 -10 -10 -10 -10 -10 -10 -10 -10 -10 -70 -00 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -88 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -FC -00 -00 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -10 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -80 -80 -80 -F0 -88 -88 -88 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -80 -80 -80 -78 -00 -00 -00 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -08 -08 -08 -78 -88 -88 -88 -78 -00 -00 -00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -70 -88 -F8 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -38 -40 -40 -F0 -40 -40 -40 -40 -00 -00 -00 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -78 -08 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -80 -80 -80 -F0 -88 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -20 -00 -60 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -08 -08 -00 -38 -08 -08 -08 -08 -08 -08 -70 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -40 -40 -48 -50 -60 -50 -48 -00 -00 -00 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -60 -20 -20 -20 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -D0 -A8 -A8 -A8 -88 -00 -00 -00 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -B0 -C8 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -F0 -88 -88 -88 -F0 -80 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -88 -88 -88 -78 -08 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -58 -60 -40 -40 -40 -00 -00 -00 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -80 -70 -08 -F0 -00 -00 -00 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -20 -20 -70 -20 -20 -20 -18 -00 -00 -00 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -D8 -50 -50 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -A8 -A8 -A8 -50 -00 -00 -00 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -00 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -88 -88 -88 -78 -08 -08 -70 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -F8 -10 -20 -40 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -08 -10 -10 -10 -10 -20 -10 -10 -10 -10 -08 -00 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -20 -00 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -20 -20 -20 -10 -20 -20 -20 -20 -40 -00 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -40 -A8 -10 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -00 -20 -20 -20 -20 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -20 -70 -A8 -A0 -A8 -70 -20 -00 -00 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -48 -40 -E0 -40 -40 -48 -B0 -00 -00 -00 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -70 -50 -70 -88 -00 -00 -00 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -88 -50 -20 -70 -20 -70 -20 -00 -00 -00 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -20 -20 -20 -00 -20 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -30 -48 -40 -30 -48 -48 -48 -30 -08 -48 -30 -00 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -50 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -78 -84 -B4 -A4 -A4 -B4 -84 -78 -00 -00 -00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -30 -08 -38 -48 -38 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -28 -50 -A0 -50 -28 -00 -00 -00 -00 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -78 -08 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -78 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -78 -84 -B4 -AC -B4 -AC -84 -78 -00 -00 -00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -F8 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -48 -48 -30 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -20 -20 -F8 -20 -20 -00 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -60 -10 -20 -40 -70 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -60 -10 -20 -10 -60 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -00 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -88 -88 -C8 -B0 -80 -80 -00 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -78 -E8 -E8 -68 -28 -28 -28 -00 -00 -00 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -30 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -00 -00 -00 -00 -00 -10 -20 -00 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -60 -20 -20 -20 -00 -00 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -30 -48 -48 -48 -30 -00 -78 -00 -00 -00 -00 -00 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -A0 -50 -28 -50 -A0 -00 -00 -00 -00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -40 -40 -48 -10 -28 -38 -08 -00 -00 -00 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -40 -40 -70 -08 -10 -20 -38 -00 -00 -00 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -C0 -40 -20 -C8 -10 -28 -38 -08 -00 -00 -00 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -00 -20 -20 -40 -80 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -00 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -00 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -28 -50 -00 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -00 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -20 -70 -88 -88 -F8 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -78 -A0 -A0 -B8 -E0 -A0 -B8 -00 -00 -00 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -88 -80 -80 -80 -88 -70 -20 -40 -00 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -00 -F8 -80 -F0 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -F8 -80 -F0 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -00 -F8 -80 -F0 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -00 -F8 -80 -F0 -80 -80 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -00 -F8 -20 -20 -20 -20 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -F8 -20 -20 -20 -20 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -00 -F8 -20 -20 -20 -20 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -00 -F8 -20 -20 -20 -20 -F8 -00 -00 -00 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -70 -48 -44 -E4 -44 -48 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -28 -50 -00 -88 -C8 -A8 -98 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -00 -70 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -70 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -00 -70 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -28 -50 -00 -70 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -00 -70 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -88 -50 -20 -50 -88 -00 -00 -00 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -08 -78 -98 -A8 -A8 -A8 -C8 -F0 -80 -00 -00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -40 -20 -00 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -00 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -50 -00 -88 -88 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -10 -20 -00 -88 -50 -20 -20 -20 -20 -00 -00 -00 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -80 -F0 -88 -88 -88 -F0 -80 -80 -00 -00 -00 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -30 -48 -48 -D0 -50 -48 -48 -50 -00 -00 -00 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -20 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -28 -50 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -20 -50 -20 -00 -78 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -70 -28 -70 -A0 -78 -00 -00 -00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -78 -80 -80 -80 -78 -20 -40 -00 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -20 -00 -70 -88 -F8 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -70 -88 -F8 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -00 -70 -88 -F8 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -70 -88 -F8 -80 -70 -00 -00 -00 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -20 -00 -60 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -40 -00 -60 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -00 -60 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -60 -20 -20 -20 -70 -00 -00 -00 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -28 -10 -28 -08 -78 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -28 -50 -00 -B0 -C8 -88 -88 -88 -00 -00 -00 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -20 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -28 -50 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -70 -88 -88 -88 -70 -00 -00 -00 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -00 -20 -00 -F8 -00 -20 -00 -00 -00 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -00 -08 -78 -98 -A8 -C8 -F0 -80 -00 -00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -40 -20 -00 -88 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -88 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -20 -50 -00 -88 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -88 -88 -88 -98 -68 -00 -00 -00 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -10 -20 -00 -88 -88 -88 -88 -78 -08 -08 -70 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -80 -80 -80 -B0 -C8 -88 -C8 -B0 -80 -80 -00 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 480 0 -DWIDTH 6 0 -BBX 6 12 0 -3 -BITMAP -00 -00 -50 -00 -88 -88 -88 -88 -78 -08 -08 -70 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/clR6x12-iso-8859-1.bdf b/gui/themes/fonts/clR6x12-iso-8859-1.bdf new file mode 100644 index 0000000000..3e77859d72 --- /dev/null +++ b/gui/themes/fonts/clR6x12-iso-8859-1.bdf @@ -0,0 +1,4290 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl clR6x12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT $Xorg: clR6x12.bdf,v 1.3 2000/08/18 15:17:40 xorgcvs Exp $ +COMMENT +COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org +COMMENT 399 Beacon Ave. +COMMENT St. Paul, MN 55104-3527 +COMMENT +COMMENT Permission to use, copy, modify, and distribute this software and +COMMENT its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notice appear in all +COMMENT copies and that both that copyright notice and this permission +COMMENT notice appear in supporting documentation, and that the name of +COMMENT Dale Schumacher not be used in advertising or publicity pertaining to +COMMENT distribution of the software without specific, written prior +COMMENT permission. Dale Schumacher makes no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT +COMMENT +COMMENT Modified by Robert Brady, +COMMENT +FONT -Schumacher-Clean-Medium-R-Normal--12-120-75-75-C-60-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -3 +STARTPROPERTIES 21 +FONTNAME_REGISTRY "" +FOUNDRY "Schumacher" +FAMILY_NAME "Clean" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +FONT_ASCENT 9 +FONT_DESCENT 3 +DEFAULT_CHAR 0 +COPYRIGHT "Copyright 1989 Dale Schumacher, 1999 Robert Brady." +CAP_HEIGHT 8 +X_HEIGHT 5 +ENDPROPERTIES +CHARS 223 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +00 +88 +00 +88 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR shade +ENCODING 2 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR uni2409 +ENCODING 3 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +E0 +A0 +BC +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 4 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +80 +C0 +9C +90 +1C +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 5 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +80 +80 +98 +74 +18 +14 +14 +00 +00 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 6 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +9C +F0 +18 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 7 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 8 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A0 +E0 +E0 +E0 +B0 +10 +10 +10 +1C +00 +00 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 10 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +5C +48 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 11 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF030000 +ENCODING 12 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF010000 +ENCODING 13 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF020000 +ENCODING 14 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 15 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23BA +ENCODING 16 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 17 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 18 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 19 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 20 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR SF080000 +ENCODING 21 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF090000 +ENCODING 22 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF070000 +ENCODING 23 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF060000 +ENCODING 24 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF110000 +ENCODING 25 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR lessequal +ENCODING 26 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 27 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR pi +ENCODING 28 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 29 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +10 +10 +F8 +20 +F8 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 30 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 31 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +F8 +50 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +78 +A0 +70 +28 +F0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +C8 +10 +20 +40 +98 +18 +00 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +80 +40 +A8 +90 +68 +00 +00 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +20 +20 +20 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +A8 +70 +A8 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +98 +A8 +C8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +30 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +30 +50 +50 +F8 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +80 +80 +F0 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +40 +80 +F0 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +88 +08 +08 +10 +10 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +88 +78 +08 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +0C +30 +C0 +30 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +C0 +30 +0C +30 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +B8 +B8 +B0 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +90 +88 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +18 +00 +00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +38 +40 +40 +F0 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D0 +A8 +A8 +A8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +70 +20 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +10 +10 +20 +10 +10 +10 +10 +08 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +20 +20 +10 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +A8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +70 +A8 +A0 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +70 +50 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +50 +20 +70 +20 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +00 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +40 +30 +48 +48 +48 +30 +08 +48 +30 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +A4 +A4 +B4 +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +08 +38 +48 +38 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +28 +50 +A0 +50 +28 +00 +00 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +AC +B4 +AC +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +40 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +E8 +E8 +68 +28 +28 +28 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +00 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +60 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +48 +48 +30 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +A0 +50 +28 +50 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +70 +08 +10 +20 +38 +00 +00 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +C0 +40 +20 +C8 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +40 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +A0 +A0 +B8 +E0 +A0 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +20 +40 +00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +44 +E4 +44 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +88 +C8 +A8 +98 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +78 +98 +A8 +A8 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +F0 +88 +88 +88 +F0 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +D0 +50 +48 +48 +50 +00 +00 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +28 +70 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +20 +40 +00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +40 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +10 +28 +08 +78 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +00 +F8 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +08 +78 +98 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +B0 +C8 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/clR6x12-iso-8859-5.bdf b/gui/themes/fonts/clR6x12-iso-8859-5.bdf new file mode 100644 index 0000000000..4a4a674235 --- /dev/null +++ b/gui/themes/fonts/clR6x12-iso-8859-5.bdf @@ -0,0 +1,4291 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any clR6x12.bdf /usr/share/fonts/X11/util/map-ISO8859-5 ISO8859-5' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any by Ben Collver , 2003, based on +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT $XConsortium: clR6x12.bdf,v 1.2 94/04/11 12:08:30 gildea Exp $ +COMMENT +COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org +COMMENT 399 Beacon Ave. +COMMENT St. Paul, MN 55104-3527 +COMMENT +COMMENT Permission to use, copy, modify, and distribute this software and +COMMENT its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notice appear in all +COMMENT copies and that both that copyright notice and this permission +COMMENT notice appear in supporting documentation, and that the name of +COMMENT Dale Schumacher not be used in advertising or publicity pertaining to +COMMENT distribution of the software without specific, written prior +COMMENT permission. Dale Schumacher makes no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT +COMMENT +COMMENT Modified by Robert Brady, +COMMENT +FONT -Schumacher-Clean-Medium-R-Normal--12-120-75-75-C-60-ISO8859-5 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -3 +STARTPROPERTIES 21 +FONTNAME_REGISTRY "" +FOUNDRY "Schumacher" +FAMILY_NAME "Clean" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "5" +FONT_ASCENT 9 +FONT_DESCENT 3 +DEFAULT_CHAR 0 +COPYRIGHT "Copyright 1989 Dale Schumacher, 1999 Robert Brady." +CAP_HEIGHT 8 +X_HEIGHT 5 +ENDPROPERTIES +CHARS 223 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +00 +88 +00 +88 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR shade +ENCODING 2 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR uni2409 +ENCODING 3 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +E0 +A0 +BC +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 4 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +80 +C0 +9C +90 +1C +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 5 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +80 +80 +98 +74 +18 +14 +14 +00 +00 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 6 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +9C +F0 +18 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 7 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 8 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A0 +E0 +E0 +E0 +B0 +10 +10 +10 +1C +00 +00 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 10 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +5C +48 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 11 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF030000 +ENCODING 12 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF010000 +ENCODING 13 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF020000 +ENCODING 14 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 15 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23BA +ENCODING 16 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 17 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 18 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 19 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 20 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR SF080000 +ENCODING 21 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF090000 +ENCODING 22 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF070000 +ENCODING 23 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF060000 +ENCODING 24 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF110000 +ENCODING 25 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR lessequal +ENCODING 26 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 27 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR pi +ENCODING 28 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 29 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +10 +10 +F8 +20 +F8 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 30 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 31 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +F8 +50 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +78 +A0 +70 +28 +F0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +C8 +10 +20 +40 +98 +18 +00 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +80 +40 +A8 +90 +68 +00 +00 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +20 +20 +20 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +A8 +70 +A8 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +98 +A8 +C8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +30 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +30 +50 +50 +F8 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +80 +80 +F0 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +40 +80 +F0 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +88 +08 +08 +10 +10 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +88 +78 +08 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +0C +30 +C0 +30 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +C0 +30 +0C +30 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +B8 +B8 +B0 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +90 +88 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +18 +00 +00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +38 +40 +40 +F0 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D0 +A8 +A8 +A8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +70 +20 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +10 +10 +20 +10 +10 +10 +10 +08 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +20 +20 +10 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +A8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii10023 +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10051 +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +40 +40 +70 +48 +48 +48 +08 +30 +00 +ENDCHAR +STARTCHAR afii10052 +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +78 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10053 +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +F0 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10054 +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10055 +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10056 +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10057 +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10058 +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +A0 +A0 +B0 +A8 +A8 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10059 +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +F0 +A8 +A8 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10060 +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +40 +40 +70 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR afii10061 +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +90 +E0 +90 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii10062 +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +88 +88 +88 +78 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10145 +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR afii10017 +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10018 +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +80 +80 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10019 +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10020 +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +40 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10021 +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +50 +50 +50 +50 +50 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10022 +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10024 +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10025 +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10026 +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10027 +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10028 +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10029 +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +48 +48 +48 +48 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10030 +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10031 +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10032 +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10033 +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +88 +88 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10034 +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR afii10035 +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10036 +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10037 +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +78 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10038 +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +20 +70 +A8 +A8 +70 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10039 +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10040 +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +90 +90 +90 +90 +90 +F8 +08 +00 +00 +ENDCHAR +STARTCHAR afii10041 +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +78 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR afii10042 +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10043 +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +00 +ENDCHAR +STARTCHAR afii10044 +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +40 +40 +70 +48 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10045 +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +E8 +98 +98 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10046 +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10047 +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +08 +78 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10048 +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +A8 +A8 +E8 +A8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR afii10049 +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +88 +88 +78 +28 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10065 +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +08 +78 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR afii10066 +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10067 +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +F0 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10068 +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10069 +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +50 +50 +50 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10070 +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10072 +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +70 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10073 +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +30 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10074 +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +98 +A8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10075 +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +88 +98 +A8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10076 +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +90 +E0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10077 +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +38 +48 +48 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10078 +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +D8 +A8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10079 +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10080 +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10081 +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10082 +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR afii10084 +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10085 +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +00 +ENDCHAR +STARTCHAR afii10087 +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10088 +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +90 +90 +90 +90 +F8 +08 +00 +00 +ENDCHAR +STARTCHAR afii10089 +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +78 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR afii10090 +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10091 +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +F8 +08 +08 +00 +ENDCHAR +STARTCHAR afii10092 +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +40 +70 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10093 +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +E8 +98 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10094 +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +80 +80 +F0 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10095 +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +38 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10096 +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +90 +A8 +E8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR afii10097 +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +78 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii61352 +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A0 +A0 +E0 +E8 +F4 +B4 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10071 +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10099 +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +F0 +40 +78 +44 +44 +44 +44 +04 +18 +00 +ENDCHAR +STARTCHAR afii10100 +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10101 +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +E0 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10102 +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10103 +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10104 +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10105 +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR afii10106 +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +60 +A0 +B0 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10107 +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A0 +A0 +F0 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10108 +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +F0 +40 +78 +44 +44 +44 +44 +00 +00 +00 +ENDCHAR +STARTCHAR afii10109 +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +90 +E0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR section +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +40 +30 +48 +48 +48 +30 +08 +48 +30 +00 +ENDCHAR +STARTCHAR afii10110 +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +F8 +20 +20 +00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/clR6x12.bdf b/gui/themes/fonts/clR6x12.bdf new file mode 100644 index 0000000000..0e0924f857 --- /dev/null +++ b/gui/themes/fonts/clR6x12.bdf @@ -0,0 +1,22736 @@ +STARTFONT 2.1 +COMMENT $XConsortium: clR6x12.bdf,v 1.2 94/04/11 12:08:30 gildea Exp $ +COMMENT +COMMENT Copyright 1989 Dale Schumacher, dal@syntel.mn.org +COMMENT 399 Beacon Ave. +COMMENT St. Paul, MN 55104-3527 +COMMENT +COMMENT Permission to use, copy, modify, and distribute this software and +COMMENT its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notice appear in all +COMMENT copies and that both that copyright notice and this permission +COMMENT notice appear in supporting documentation, and that the name of +COMMENT Dale Schumacher not be used in advertising or publicity pertaining to +COMMENT distribution of the software without specific, written prior +COMMENT permission. Dale Schumacher makes no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT +COMMENT +COMMENT Modified by Robert Brady, +COMMENT +FONT -Schumacher-Clean-Medium-R-Normal--12-120-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -3 +STARTPROPERTIES 22 +FONTNAME_REGISTRY "" +FOUNDRY "Schumacher" +FAMILY_NAME "Clean" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 9 +FONT_DESCENT 3 +DEFAULT_CHAR 0 +COPYRIGHT "Copyright 1989 Dale Schumacher, 1999 Robert Brady." +_XMBDFED_INFO "Edited with xmbdfed 4.5." +CAP_HEIGHT 8 +X_HEIGHT 5 +ENDPROPERTIES +CHARS 1194 +STARTCHAR char0 +ENCODING 0 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +00 +88 +00 +88 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +F8 +50 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +78 +A0 +70 +28 +F0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +C8 +10 +20 +40 +98 +18 +00 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +80 +40 +A8 +90 +68 +00 +00 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +20 +20 +20 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +A8 +70 +A8 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +98 +A8 +C8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +30 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +30 +30 +50 +50 +F8 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +80 +80 +F0 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +40 +80 +F0 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +88 +08 +08 +10 +10 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +88 +88 +78 +08 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +0C +30 +C0 +30 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +C0 +30 +0C +30 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +B8 +B8 +B0 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +90 +88 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +18 +00 +00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +38 +40 +40 +F0 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +F0 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D0 +A8 +A8 +A8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +70 +20 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +10 +10 +10 +10 +20 +10 +10 +10 +10 +08 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +20 +20 +20 +10 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +A8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +70 +A8 +A0 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +70 +50 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +50 +20 +70 +20 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +00 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +40 +30 +48 +48 +48 +30 +08 +48 +30 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +A4 +A4 +B4 +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +08 +38 +48 +38 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +28 +50 +A0 +50 +28 +00 +00 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +84 +B4 +AC +B4 +AC +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +40 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +E8 +E8 +68 +28 +28 +28 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +00 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +60 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +48 +48 +30 +00 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +A0 +50 +28 +50 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +48 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +40 +40 +70 +08 +10 +20 +38 +00 +00 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +C0 +40 +20 +C8 +10 +28 +38 +08 +00 +00 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +40 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +A0 +A0 +B8 +E0 +A0 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +20 +40 +00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +44 +E4 +44 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +88 +C8 +A8 +98 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +78 +98 +A8 +A8 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +F0 +88 +88 +88 +F0 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +48 +D0 +50 +48 +48 +50 +00 +00 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +28 +70 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +20 +40 +00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +40 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +10 +28 +08 +78 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +00 +F8 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +08 +78 +98 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +B0 +C8 +88 +C8 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +10 +18 +00 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +88 +98 +68 +10 +08 +00 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +88 +88 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +88 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +70 +88 +88 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +70 +88 +88 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +E0 +90 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +44 +E4 +44 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +38 +10 +70 +90 +90 +90 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +80 +F0 +80 +80 +F8 +20 +10 +00 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +40 +20 +00 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +88 +80 +98 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +70 +88 +80 +98 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +70 +88 +80 +98 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +78 +20 +40 +00 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +30 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +48 +FC +48 +78 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +F8 +40 +78 +44 +44 +44 +44 +00 +00 +00 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +30 +10 +10 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +20 +10 +00 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +60 +20 +20 +20 +70 +20 +10 +00 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +88 +88 +88 +A8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +48 +00 +D8 +48 +48 +48 +E8 +08 +48 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +28 +00 +38 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +28 +00 +70 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +40 +C0 +00 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +40 +48 +50 +60 +50 +48 +20 +60 +00 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +90 +E0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +40 +00 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +20 +20 +20 +20 +20 +10 +00 +00 +00 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +F8 +20 +40 +00 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +20 +20 +20 +20 +70 +20 +40 +00 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +20 +20 +20 +20 +20 +10 +00 +00 +00 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +90 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +C0 +40 +40 +40 +48 +40 +40 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +40 +60 +C0 +40 +40 +7C +00 +00 +00 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +30 +60 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +40 +C0 +00 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +40 +C0 +00 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +88 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +C0 +40 +80 +00 +B0 +C8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +08 +30 +00 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +08 +30 +00 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +90 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +A0 +A0 +B0 +A0 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +A8 +B8 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F0 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +A0 +90 +88 +40 +C0 +00 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +58 +60 +40 +40 +40 +20 +60 +00 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +F0 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +10 +00 +58 +60 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +70 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +20 +60 +00 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +20 +60 +00 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +70 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +10 +30 +00 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +F8 +20 +20 +20 +18 +10 +30 +00 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +70 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +F8 +20 +70 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +20 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +90 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +88 +88 +88 +88 +88 +70 +40 +20 +00 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +68 +10 +08 +00 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +F8 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +18 +20 +20 +60 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +E0 +40 +78 +44 +44 +44 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +48 +48 +70 +48 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +40 +40 +70 +48 +48 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +80 +80 +F0 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +60 +E0 +78 +24 +24 +24 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +C0 +C0 +70 +48 +48 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +08 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +18 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +10 +68 +80 +80 +80 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +44 +E4 +44 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +50 +48 +48 +48 +50 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +50 +20 +00 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +08 +78 +08 +08 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +08 +F8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +60 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +40 +40 +70 +40 +40 +40 +40 +80 +00 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +38 +40 +40 +F0 +40 +40 +40 +40 +40 +80 +00 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +70 +90 +80 +98 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +50 +50 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +C8 +A8 +A8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +60 +20 +20 +20 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +70 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +A8 +A8 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +20 +20 +F8 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +68 +30 +60 +A0 +50 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +A8 +A8 +A8 +58 +00 +00 +00 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +44 +64 +64 +54 +4C +4C +44 +40 +80 +00 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +08 +08 +00 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +F8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +18 +08 +10 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +18 +08 +10 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +B0 +A8 +A8 +A8 +A8 +48 +08 +08 +00 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +50 +A8 +A8 +A8 +48 +08 +08 +00 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +48 +48 +70 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +10 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +F0 +88 +F0 +A0 +90 +88 +08 +00 +00 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +08 +70 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +08 +70 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +40 +20 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +30 +10 +10 +10 +10 +10 +10 +10 +08 +00 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +F8 +20 +20 +20 +18 +10 +60 +00 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +A0 +A0 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E0 +40 +40 +40 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +18 +00 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +18 +08 +10 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +18 +08 +10 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +88 +88 +88 +90 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +44 +A8 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +08 +90 +90 +90 +90 +70 +10 +10 +60 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +F8 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +10 +F8 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +70 +08 +08 +90 +60 +00 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +40 +20 +70 +80 +80 +48 +30 +00 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +40 +20 +70 +80 +80 +78 +00 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +40 +20 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +F8 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +48 +20 +10 +08 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +40 +30 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +70 +20 +30 +08 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +10 +28 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +20 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +70 +70 +20 +20 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +14 +08 +DC +A4 +A4 +A8 +B0 +B0 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +14 +C8 +A0 +BC +A4 +A8 +B0 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +14 +28 +20 +7C +A4 +A8 +B0 +7C +00 +00 +00 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +84 +84 +84 +84 +84 +94 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +84 +80 +84 +84 +84 +84 +E4 +04 +24 +18 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +48 +40 +48 +48 +48 +48 +28 +08 +30 +00 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +94 +94 +D4 +B4 +94 +94 +94 +04 +18 +00 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +94 +90 +D4 +B4 +94 +94 +94 +04 +18 +00 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +00 +C8 +A8 +A8 +A8 +A8 +08 +30 +00 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +30 +10 +10 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +90 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +50 +00 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +50 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +08 +F8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +50 +00 +70 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +50 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +20 +00 +70 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +20 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +78 +A0 +A0 +B8 +E0 +A0 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +00 +70 +28 +70 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +90 +90 +B8 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +90 +B8 +90 +70 +10 +10 +60 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +70 +88 +80 +98 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +10 +40 +40 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +40 +60 +00 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +40 +60 +00 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +70 +88 +88 +88 +88 +70 +40 +60 +00 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +70 +88 +88 +88 +70 +40 +60 +00 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +08 +90 +60 +00 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +F8 +10 +20 +70 +08 +08 +F0 +00 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +10 +00 +70 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +DC +A4 +A4 +A8 +B0 +B0 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +04 +C0 +A0 +BC +A4 +A8 +B0 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +7C +A4 +A8 +B0 +7C +00 +00 +00 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +70 +80 +80 +98 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +20 +50 +20 +00 +78 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +78 +A0 +B8 +E0 +A0 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +70 +28 +70 +A0 +78 +00 +00 +00 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +08 +78 +98 +A8 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +08 +78 +98 +A8 +C8 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +78 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +F0 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +B0 +C0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +F0 +88 +F0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +B0 +C0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +48 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +00 +88 +88 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +60 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +60 +20 +40 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +30 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +F8 +20 +20 +20 +18 +30 +10 +20 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +08 +F8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +30 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +10 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +70 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +40 +30 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +90 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +10 +10 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +00 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +30 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +30 +00 +00 +30 +30 +20 +40 +00 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +90 +28 +44 +44 +7C +44 +44 +00 +00 +00 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +BC +20 +20 +38 +20 +20 +3C +00 +00 +00 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +A4 +24 +24 +3C +24 +24 +24 +00 +00 +00 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +B8 +10 +10 +10 +10 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +98 +24 +24 +24 +24 +24 +18 +00 +00 +00 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +A8 +28 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +90 +28 +44 +44 +44 +28 +6C +00 +00 +00 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +50 +00 +60 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +40 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +A8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +50 +50 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +00 +70 +00 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +88 +88 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +40 +20 +10 +20 +40 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +20 +70 +A8 +A8 +70 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +70 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +50 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +F8 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +68 +98 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +70 +88 +60 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +00 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +60 +20 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +88 +00 +90 +88 +88 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +68 +98 +88 +98 +68 +00 +00 +00 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +F0 +88 +88 +C8 +B0 +80 +00 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +44 +A8 +28 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +48 +20 +10 +30 +48 +48 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +60 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +38 +20 +40 +40 +40 +40 +38 +08 +30 +00 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +08 +08 +00 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +48 +48 +78 +48 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +60 +20 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +48 +50 +60 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +A0 +20 +20 +50 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +98 +E8 +80 +80 +00 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +D8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +70 +80 +80 +70 +80 +80 +70 +08 +30 +00 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +90 +90 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +20 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +90 +88 +88 +88 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +A8 +A8 +A8 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +50 +88 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +90 +88 +88 +88 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +00 +90 +88 +88 +88 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +00 +50 +88 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +90 +90 +78 +10 +90 +90 +60 +00 +00 +00 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +00 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +FC +44 +54 +54 +28 +00 +00 +00 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +48 +48 +48 +70 +40 +38 +00 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +40 +40 +70 +48 +48 +48 +08 +30 +00 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +78 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +F0 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +08 +08 +08 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +A0 +A0 +B0 +A8 +A8 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +F0 +A8 +A8 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +E0 +40 +40 +70 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +90 +E0 +90 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +00 +88 +88 +88 +78 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +80 +80 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +40 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +50 +50 +50 +50 +50 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +88 +08 +10 +08 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +70 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +48 +48 +48 +48 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +88 +88 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +78 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +20 +70 +A8 +A8 +70 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +90 +90 +90 +90 +90 +F8 +08 +00 +00 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +78 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +00 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +40 +40 +70 +48 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +E8 +98 +98 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +08 +78 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +90 +A8 +A8 +E8 +A8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +88 +88 +78 +28 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +08 +78 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +80 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +F0 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +50 +50 +50 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +70 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +30 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +98 +A8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +88 +98 +A8 +C8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +90 +E0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +38 +48 +48 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +D8 +A8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +F8 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +00 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +90 +90 +90 +90 +F8 +08 +00 +00 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +78 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +F8 +08 +08 +00 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +40 +70 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +E8 +98 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +80 +80 +F0 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +38 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +90 +A8 +E8 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +88 +78 +48 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +70 +88 +F8 +80 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +F0 +40 +78 +44 +44 +44 +44 +04 +18 +00 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +78 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +E0 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +60 +20 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +00 +38 +08 +08 +08 +08 +08 +08 +70 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +60 +A0 +B0 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A0 +A0 +F0 +A8 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +F0 +40 +78 +44 +44 +44 +44 +00 +00 +00 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +90 +E0 +90 +88 +00 +00 +00 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +70 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +88 +88 +88 +88 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +E0 +40 +40 +70 +48 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +40 +E0 +40 +70 +48 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A8 +A8 +A8 +70 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +A8 +A8 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +F8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +98 +90 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +80 +98 +50 +60 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A0 +50 +80 +98 +90 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A0 +50 +80 +98 +50 +60 +20 +00 +00 +00 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +78 +40 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +08 +78 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +88 +48 +70 +A0 +90 +C8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F0 +10 +10 +10 +10 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +10 +10 +10 +28 +48 +00 +00 +00 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +10 +90 +90 +90 +90 +00 +00 +00 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +20 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +98 +A8 +A8 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +10 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +F8 +08 +08 +10 +20 +40 +00 +00 +00 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +48 +48 +78 +00 +00 +00 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +98 +A8 +48 +88 +88 +B8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +18 +08 +08 +08 +08 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +48 +50 +60 +00 +00 +00 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +D8 +48 +48 +48 +50 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +08 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +90 +48 +50 +60 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +90 +48 +28 +10 +08 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +08 +88 +88 +88 +B0 +80 +80 +00 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F0 +08 +08 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +A8 +A8 +A8 +E8 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +48 +48 +48 +48 +C8 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F0 +88 +F0 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +E0 +90 +88 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +08 +08 +78 +88 +88 +88 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F8 +80 +F0 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +38 +40 +40 +F0 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +88 +D8 +A8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +D0 +A8 +A8 +A8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F0 +88 +88 +F0 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +70 +80 +70 +08 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +78 +80 +70 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +F8 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +20 +20 +F8 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +00 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +00 +88 +88 +A8 +A8 +D8 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +88 +A8 +A8 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +20 +00 +88 +50 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +20 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +20 +30 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +30 +10 +20 +00 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +90 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +D8 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +D8 +48 +90 +00 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +D8 +90 +48 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +70 +20 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +30 +78 +78 +78 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +60 +70 +78 +70 +60 +40 +00 +00 +00 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +50 +00 +00 +00 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +D0 +20 +58 +98 +60 +60 +00 +00 +00 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +48 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +54 +54 +A8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +90 +90 +48 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A8 +A8 +54 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +10 +20 +40 +20 +10 +00 +00 +00 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +20 +10 +20 +40 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +50 +50 +50 +50 +50 +50 +00 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +50 +50 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +00 +60 +20 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +40 +60 +70 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +40 +60 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +40 +60 +50 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +30 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +70 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +00 +70 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +40 +40 +40 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +10 +10 +10 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +60 +20 +20 +20 +00 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +10 +20 +70 +00 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +20 +10 +60 +00 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +60 +70 +20 +00 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +70 +40 +60 +10 +60 +00 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +40 +60 +50 +20 +00 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +70 +10 +20 +20 +20 +00 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +20 +50 +20 +00 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +30 +10 +60 +00 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +70 +00 +70 +00 +00 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +10 +10 +10 +20 +00 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +80 +D8 +A0 +A0 +A0 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +E0 +40 +E0 +40 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +48 +FC +48 +70 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +48 +E0 +40 +E0 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +E0 +50 +48 +48 +48 +E8 +D0 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +B0 +C8 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +68 +98 +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +F8 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +F8 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +A8 +A0 +A0 +A0 +A8 +70 +00 +00 +00 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +60 +80 +80 +60 +00 +30 +48 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +28 +28 +28 +30 +30 +20 +58 +00 +00 +00 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +C8 +C8 +E8 +D8 +D8 +C8 +00 +00 +00 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A0 +A0 +E0 +E8 +F4 +B4 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +A8 +A8 +A8 +A8 +A8 +70 +18 +00 +00 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F0 +A8 +A8 +B0 +B0 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F4 +5C +54 +54 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +28 +50 +50 +A0 +A0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +50 +50 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +D8 +50 +50 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +D8 +F8 +C0 +70 +00 +00 +00 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +90 +A8 +10 +28 +10 +00 +00 +00 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +40 +A0 +40 +28 +D4 +08 +14 +08 +00 +00 +00 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +80 +C0 +28 +D4 +08 +14 +08 +00 +00 +00 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +20 +40 +48 +54 +08 +14 +08 +00 +00 +00 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +40 +F8 +40 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +10 +F8 +10 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +20 +A8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +48 +FC +48 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +24 +44 +FC +44 +24 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +90 +88 +FC +88 +90 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +20 +20 +20 +A8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +70 +A8 +20 +A8 +70 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +00 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +00 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +40 +F8 +00 +F8 +10 +20 +00 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +10 +F8 +00 +F8 +40 +20 +00 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +10 +20 +7C +C0 +7C +20 +10 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +10 +F8 +0C +F8 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +50 +50 +D8 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +48 +FC +84 +FC +48 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +D8 +50 +50 +50 +50 +D8 +50 +20 +00 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +F8 +88 +50 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +50 +40 +40 +40 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +30 +48 +08 +38 +48 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +08 +08 +78 +08 +08 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +10 +F8 +28 +28 +78 +28 +28 +F8 +40 +40 +00 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +34 +48 +94 +A4 +48 +B0 +00 +00 +00 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +88 +88 +50 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +78 +80 +F0 +80 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +10 +78 +A0 +F0 +A0 +78 +40 +40 +00 +00 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F0 +08 +78 +08 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +10 +10 +F0 +28 +78 +28 +F0 +40 +40 +00 +00 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +50 +50 +50 +F8 +00 +00 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +80 +40 +20 +10 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +48 +48 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +78 +78 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +04 +04 +08 +08 +90 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +28 +50 +28 +00 +00 +00 +00 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +80 +80 +80 +80 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +10 +10 +F0 +28 +48 +7C +08 +08 +00 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +28 +30 +20 +60 +A0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +50 +58 +70 +D0 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +20 +50 +50 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +88 +88 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +40 +A8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +40 +A8 +10 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +A8 +10 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +40 +A8 +50 +A8 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +60 +A8 +70 +A8 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +50 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +10 +10 +F8 +20 +F8 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +F8 +20 +F8 +20 +F8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +00 +F8 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +24 +48 +90 +48 +24 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +90 +48 +24 +48 +90 +00 +00 +00 +00 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +78 +80 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F0 +08 +08 +08 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +78 +A0 +A0 +A0 +A0 +78 +20 +00 +00 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +F0 +28 +28 +28 +28 +F0 +20 +00 +00 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +80 +80 +80 +80 +78 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F0 +08 +08 +08 +08 +F0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +78 +A0 +A0 +A0 +A0 +78 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +F0 +28 +28 +28 +28 +F0 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +80 +80 +80 +80 +78 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F0 +08 +08 +08 +08 +F0 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +A8 +F8 +A8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +88 +F8 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +D8 +A8 +D8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +98 +A8 +C8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +70 +88 +A8 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +A8 +F8 +A8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +88 +F8 +88 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +D8 +A8 +D8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +F8 +88 +A8 +88 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +80 +F8 +80 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +08 +08 +F8 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +F8 +20 +20 +20 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +40 +40 +70 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +40 +70 +40 +70 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +F8 +80 +F8 +80 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +88 +88 +50 +50 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +00 +00 +20 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +A8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +00 +00 +20 +00 +00 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +00 +00 +20 +00 +00 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +98 +A8 +C8 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +20 +50 +88 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +78 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +14 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +50 +20 +00 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +E0 +A0 +BC +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +80 +80 +80 +9C +F0 +18 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +A0 +A0 +A0 +5C +48 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +E0 +80 +C0 +9C +90 +1C +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +80 +80 +98 +74 +18 +14 +14 +00 +00 +00 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +80 +40 +38 +D4 +18 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A0 +E0 +E0 +E0 +B0 +10 +10 +10 +1C +00 +00 +00 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +38 +28 +28 +20 +A0 +A0 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +08 +08 +08 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +88 +88 +88 +F8 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +20 +20 +F8 +88 +88 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +F8 +A8 +20 +20 +20 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +88 +D8 +A8 +D8 +88 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +B4 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +B4 +B4 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +00 +20 +20 +20 +20 +00 +20 +20 +20 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +00 +30 +30 +30 +30 +00 +30 +30 +30 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +B4 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +B4 +B4 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +00 +20 +20 +00 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +00 +30 +30 +00 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +3F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +3F +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FF +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FF +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +FF +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +FF +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +FF +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3F +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +FF +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +FF +FF +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +F0 +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +3F +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +FF +FF +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +EC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +EC +EC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +00 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +00 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +00 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +20 +3F +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +7F +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +7C +40 +5C +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3C +20 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +5C +40 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +3C +20 +3C +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +5C +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +5C +40 +5C +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +0C +10 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +10 +0C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +3F +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +20 +20 +20 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +E0 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +00 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +00 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +F8 +F8 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +F8 +88 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +78 +78 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +78 +48 +48 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +FC +FC +FC +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +FC +84 +84 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +78 +78 +78 +78 +78 +78 +00 +00 +00 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +70 +70 +70 +F8 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +F0 +F8 +F0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +B0 +88 +B0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +60 +78 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +60 +58 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +F0 +FC +F0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +C0 +B0 +8C +B0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +F8 +F8 +70 +70 +70 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +F8 +88 +88 +50 +50 +50 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +18 +78 +F8 +78 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +18 +68 +88 +68 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +18 +78 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +00 +18 +68 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +0C +3C +FC +3C +0C +00 +00 +00 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +0C +34 +C4 +34 +0C +00 +00 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +00 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +F8 +F8 +F8 +70 +00 +00 +00 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +FC +FC +FC +FC +CC +B4 +B4 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +30 +48 +48 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +48 +00 +30 +48 +00 +00 +00 +00 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +48 +00 +48 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +78 +FC +B4 +FC +B4 +CC +78 +00 +00 +00 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +20 +A8 +70 +D8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +20 +70 +20 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +1C +0C +74 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +78 +FC +FC +FC +78 +30 +78 +00 +00 +00 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +30 +78 +30 +B4 +FC +FC +B4 +30 +78 +00 +00 +00 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +50 +F8 +F8 +F8 +70 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +08 +08 +08 +08 +08 +38 +78 +30 +00 +00 +00 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +28 +20 +20 +20 +60 +E0 +40 +00 +00 +00 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +60 +58 +48 +48 +48 +C8 +D8 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +78 +48 +78 +48 +48 +C8 +D8 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +80 +80 +B0 +C8 +88 +90 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +00 +40 +48 +58 +68 +48 +58 +68 +48 +08 +00 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +10 +10 +20 +20 +40 +20 +20 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +40 +40 +20 +20 +10 +20 +20 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +48 +40 +E8 +48 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +30 +50 +50 +F0 +50 +50 +50 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -3 +BITMAP +00 +70 +D8 +A8 +E8 +D8 +F8 +D8 +70 +00 +00 +00 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/fixed5x8-iso-8859-1.bdf b/gui/themes/fonts/fixed5x8-iso-8859-1.bdf new file mode 100644 index 0000000000..80ea041db5 --- /dev/null +++ b/gui/themes/fonts/fixed5x8-iso-8859-1.bdf @@ -0,0 +1,3380 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl 5x8.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT Id: 5x8.bdf,v 1.28 2001-04-03 13:37:48+01 mgk25 Exp mgk25 $ +COMMENT Send bug reports to Markus Kuhn +FONT -Misc-Fixed-Medium-R-Normal--8-80-75-75-C-50-ISO8859-1 +SIZE 11 75 75 +FONTBOUNDINGBOX 5 8 0 -1 +STARTPROPERTIES 21 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +FONT_DESCENT 1 +FONT_ASCENT 7 +COPYRIGHT "Public domain font. Share and enjoy." +DEFAULT_CHAR 0 +CAP_HEIGHT 6 +X_HEIGHT 4 +ENDPROPERTIES +CHARS 223 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +A0 +10 +80 +10 +80 +50 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +F8 +70 +20 +00 +ENDCHAR +STARTCHAR shade +ENCODING 2 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A8 +50 +A8 +50 +A8 +50 +A8 +ENDCHAR +STARTCHAR uni2409 +ENCODING 3 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +A0 +E0 +A0 +A0 +70 +20 +20 +ENDCHAR +STARTCHAR uni240C +ENCODING 4 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 5 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +80 +80 +60 +30 +28 +30 +28 +ENDCHAR +STARTCHAR uni240A +ENCODING 6 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +80 +E0 +38 +20 +30 +20 +ENDCHAR +STARTCHAR degree +ENCODING 7 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 8 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +70 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +D0 +B0 +90 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni240B +ENCODING 10 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +A0 +A0 +40 +38 +10 +10 +10 +ENDCHAR +STARTCHAR SF040000 +ENCODING 11 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +E0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF030000 +ENCODING 12 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF010000 +ENCODING 13 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF020000 +ENCODING 14 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 15 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23BA +ENCODING 16 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BB +ENCODING 17 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 18 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni23BC +ENCODING 19 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR uni23BD +ENCODING 20 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR SF080000 +ENCODING 21 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF090000 +ENCODING 22 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF070000 +ENCODING 23 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF060000 +ENCODING 24 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF110000 +ENCODING 25 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR lessequal +ENCODING 26 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +20 +40 +20 +10 +70 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 27 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +10 +20 +40 +70 +00 +ENDCHAR +STARTCHAR pi +ENCODING 28 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 29 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +F0 +60 +F0 +40 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 30 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +E0 +40 +50 +A0 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 31 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +20 +00 +20 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A0 +70 +28 +70 +20 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +50 +20 +50 +10 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +A0 +40 +A0 +A0 +50 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +40 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +90 +60 +F0 +60 +90 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +70 +20 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +10 +20 +40 +80 +80 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +60 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +10 +60 +80 +F0 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +20 +60 +10 +90 +60 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +60 +A0 +F0 +20 +20 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +10 +90 +60 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +80 +E0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +10 +20 +20 +40 +40 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +70 +10 +60 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +60 +60 +00 +60 +60 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +30 +30 +00 +30 +20 +40 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +20 +40 +40 +20 +10 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +00 +F0 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +10 +20 +00 +20 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +48 +98 +A8 +A8 +90 +40 +30 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +80 +E0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +B0 +90 +60 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +A0 +40 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +A0 +C0 +A0 +A0 +90 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +D0 +F0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +90 +D0 +B0 +60 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +E0 +90 +90 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +90 +60 +60 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +90 +60 +60 +90 +90 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +88 +88 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +40 +20 +10 +10 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +40 +40 +30 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +10 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +40 +E0 +40 +40 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +90 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +D0 +A8 +A8 +A8 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +90 +70 +10 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +A0 +D0 +80 +80 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +60 +10 +60 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +40 +40 +E0 +40 +50 +20 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +88 +A8 +A8 +50 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +60 +60 +90 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +40 +20 +C0 +20 +40 +30 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +40 +20 +C0 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +E0 +40 +50 +A0 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +88 +70 +50 +70 +88 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +88 +50 +F8 +20 +F8 +20 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +00 +20 +20 +20 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +70 +80 +E0 +90 +70 +10 +E0 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +A8 +C8 +C8 +A8 +70 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +30 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +50 +A0 +50 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +70 +10 +10 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +E8 +D8 +E8 +D8 +70 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +70 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +10 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +10 +60 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +78 +E8 +E8 +68 +28 +28 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +20 +40 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +60 +20 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +20 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +A0 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +80 +A0 +60 +F0 +20 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +A0 +D0 +10 +20 +70 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +80 +40 +80 +60 +A0 +F0 +20 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +20 +00 +20 +40 +50 +20 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +A0 +A0 +F0 +A0 +B0 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +80 +80 +90 +60 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +F0 +80 +E0 +80 +F0 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +00 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +48 +E8 +48 +48 +70 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +90 +D0 +B0 +90 +90 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +00 +50 +20 +50 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +70 +B0 +B0 +D0 +D0 +E0 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +90 +00 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +88 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +E0 +90 +90 +E0 +80 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +60 +90 +A0 +A0 +90 +A0 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +60 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +F0 +68 +B0 +78 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +30 +40 +40 +30 +20 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +A0 +40 +A0 +10 +70 +90 +60 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A0 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +20 +00 +70 +00 +20 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +00 +00 +70 +B0 +D0 +E0 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +40 +20 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +60 +90 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +40 +00 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +80 +80 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +00 +90 +00 +90 +90 +70 +90 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/fixed5x8-iso-8859-5.bdf b/gui/themes/fonts/fixed5x8-iso-8859-5.bdf new file mode 100644 index 0000000000..7d0a93cb39 --- /dev/null +++ b/gui/themes/fonts/fixed5x8-iso-8859-5.bdf @@ -0,0 +1,2309 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any koi5x8-ucs.bdf /usr/share/fonts/X11/util/map-ISO8859-5 ISO8859-5' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any by Ben Collver , 2003, based on +COMMENT ucs2any.pl by Markus Kuhn , 2000. +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl 5x8.bdf ../xcyr-2.3/tryfont/KOI8-C.TXT KOI8-C' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 1999. +COMMENT $Id$ +COMMENT Send bug reports to Markus Kuhn +COMMENT Changes 1999 by Serge Winitzki. +COMMENT $XFree86$ +FONT -Misc-Fixed-Medium-R-Normal--8-80-75-75-C-50-ISO8859-5 +SIZE 11 75 75 +FONTBOUNDINGBOX 5 8 0 -1 +STARTPROPERTIES 22 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "5" +FONT_DESCENT 1 +FONT_ASCENT 7 +COPYRIGHT "Public domain font. Share and enjoy." +DEFAULT_CHAR 0 +CAP_HEIGHT 6 +X_HEIGHT 4 +_XFREE86_GLYPH_RANGES "0_126 149 152_154 156_158 163 179 191_255" +ENDPROPERTIES +CHARS 185 +STARTCHAR uni25C6 +ENCODING 1 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2592 +ENCODING 2 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +50 +A8 +50 +A8 +50 +A8 +50 +A8 +ENDCHAR +STARTCHAR uni00B1 +ENCODING 8 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +20 +70 +20 +00 +70 +ENDCHAR +STARTCHAR uni2518 +ENCODING 11 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 3 +BITMAP +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2510 +ENCODING 12 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni250C +ENCODING 13 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2514 +ENCODING 14 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 3 +BITMAP +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni253C +ENCODING 15 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2500 +ENCODING 18 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni251C +ENCODING 21 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2524 +ENCODING 22 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2534 +ENCODING 23 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 3 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni252C +ENCODING 24 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2502 +ENCODING 25 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2264 +ENCODING 26 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +20 +40 +20 +10 +70 +ENDCHAR +STARTCHAR uni2265 +ENCODING 27 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +20 +10 +20 +40 +70 +ENDCHAR +STARTCHAR uni03C0 +ENCODING 28 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2260 +ENCODING 29 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +20 +F0 +60 +F0 +40 +ENDCHAR +STARTCHAR uni00A3 +ENCODING 30 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +20 +40 +20 +10 +70 +ENDCHAR +STARTCHAR uni00B7 +ENCODING 31 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +20 +10 +20 +40 +70 +ENDCHAR +STARTCHAR uni0020 +ENCODING 32 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR uni0021 +ENCODING 33 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni0022 +ENCODING 34 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 3 +BITMAP +50 +50 +50 +ENDCHAR +STARTCHAR uni0023 +ENCODING 35 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni0024 +ENCODING 36 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A0 +70 +28 +70 +20 +ENDCHAR +STARTCHAR uni0025 +ENCODING 37 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 1 +BITMAP +40 +50 +20 +50 +10 +ENDCHAR +STARTCHAR uni0026 +ENCODING 38 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A0 +A0 +50 +ENDCHAR +STARTCHAR uni0027 +ENCODING 39 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 3 +BITMAP +20 +20 +20 +ENDCHAR +STARTCHAR uni0028 +ENCODING 40 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0029 +ENCODING 41 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni002A +ENCODING 42 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +90 +60 +F0 +60 +90 +ENDCHAR +STARTCHAR uni002B +ENCODING 43 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni002C +ENCODING 44 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 -1 +BITMAP +30 +20 +40 +ENDCHAR +STARTCHAR uni002D +ENCODING 45 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 1 0 2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni002E +ENCODING 46 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 -1 +BITMAP +20 +70 +20 +ENDCHAR +STARTCHAR uni002F +ENCODING 47 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR uni0030 +ENCODING 48 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0031 +ENCODING 49 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0032 +ENCODING 50 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +10 +60 +80 +F0 +ENDCHAR +STARTCHAR uni0033 +ENCODING 51 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +20 +60 +10 +90 +60 +ENDCHAR +STARTCHAR uni0034 +ENCODING 52 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +60 +A0 +F0 +20 +20 +ENDCHAR +STARTCHAR uni0035 +ENCODING 53 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +E0 +10 +90 +60 +ENDCHAR +STARTCHAR uni0036 +ENCODING 54 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR uni0037 +ENCODING 55 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR uni0038 +ENCODING 56 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0039 +ENCODING 57 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni003A +ENCODING 58 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR uni003B +ENCODING 59 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +30 +30 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni003C +ENCODING 60 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +20 +40 +40 +20 +10 +ENDCHAR +STARTCHAR uni003D +ENCODING 61 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 1 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni003E +ENCODING 62 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +20 +10 +10 +20 +40 +ENDCHAR +STARTCHAR uni003F +ENCODING 63 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +ENDCHAR +STARTCHAR uni0040 +ENCODING 64 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +30 +48 +98 +A8 +A8 +90 +40 +30 +ENDCHAR +STARTCHAR uni0041 +ENCODING 65 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni0042 +ENCODING 66 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni0043 +ENCODING 67 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR uni0044 +ENCODING 68 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR uni0045 +ENCODING 69 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni0046 +ENCODING 70 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0047 +ENCODING 71 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR uni0048 +ENCODING 72 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni0049 +ENCODING 73 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni004A +ENCODING 74 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni004B +ENCODING 75 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +A0 +C0 +A0 +A0 +90 +ENDCHAR +STARTCHAR uni004C +ENCODING 76 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni004D +ENCODING 77 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +F0 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni004E +ENCODING 78 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +D0 +F0 +B0 +B0 +90 +ENDCHAR +STARTCHAR uni004F +ENCODING 79 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni0050 +ENCODING 80 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni0051 +ENCODING 81 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +D0 +B0 +60 +10 +ENDCHAR +STARTCHAR uni0052 +ENCODING 82 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +90 +E0 +90 +90 +ENDCHAR +STARTCHAR uni0053 +ENCODING 83 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +40 +20 +90 +60 +ENDCHAR +STARTCHAR uni0054 +ENCODING 84 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0055 +ENCODING 85 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni0056 +ENCODING 86 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +90 +90 +60 +60 +ENDCHAR +STARTCHAR uni0057 +ENCODING 87 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +90 +F0 +F0 +90 +ENDCHAR +STARTCHAR uni0058 +ENCODING 88 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +60 +60 +90 +90 +ENDCHAR +STARTCHAR uni0059 +ENCODING 89 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni005A +ENCODING 90 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR uni005B +ENCODING 91 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +40 +40 +40 +40 +70 +ENDCHAR +STARTCHAR uni005C +ENCODING 92 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +80 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR uni005D +ENCODING 93 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +10 +10 +10 +10 +70 +ENDCHAR +STARTCHAR uni005E +ENCODING 94 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 2 0 4 +BITMAP +20 +50 +ENDCHAR +STARTCHAR uni005F +ENCODING 95 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 1 0 -1 +BITMAP +F0 +ENDCHAR +STARTCHAR uni0060 +ENCODING 96 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 2 0 4 +BITMAP +40 +20 +ENDCHAR +STARTCHAR uni0061 +ENCODING 97 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni0062 +ENCODING 98 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni0063 +ENCODING 99 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +30 +40 +40 +30 +ENDCHAR +STARTCHAR uni0064 +ENCODING 100 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni0065 +ENCODING 101 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +60 +B0 +C0 +60 +ENDCHAR +STARTCHAR uni0066 +ENCODING 102 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +50 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni0067 +ENCODING 103 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0068 +ENCODING 104 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni0069 +ENCODING 105 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +00 +60 +20 +20 +70 +ENDCHAR +STARTCHAR uni006A +ENCODING 106 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni006B +ENCODING 107 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +80 +80 +90 +E0 +90 +90 +ENDCHAR +STARTCHAR uni006C +ENCODING 108 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni006D +ENCODING 109 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +D0 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni006E +ENCODING 110 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni006F +ENCODING 111 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0070 +ENCODING 112 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni0071 +ENCODING 113 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +70 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni0072 +ENCODING 114 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR uni0073 +ENCODING 115 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +30 +60 +10 +60 +ENDCHAR +STARTCHAR uni0074 +ENCODING 116 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR uni0075 +ENCODING 117 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0076 +ENCODING 118 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0077 +ENCODING 119 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0078 +ENCODING 120 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR uni0079 +ENCODING 121 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR uni007A +ENCODING 122 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR uni007B +ENCODING 123 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +30 +40 +20 +C0 +20 +40 +30 +ENDCHAR +STARTCHAR uni007C +ENCODING 124 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni007D +ENCODING 125 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +40 +30 +40 +20 +C0 +ENDCHAR +STARTCHAR uni007E +ENCODING 126 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 2 0 4 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0401 +ENCODING 161 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni0410 +ENCODING 176 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni0411 +ENCODING 177 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni0412 +ENCODING 178 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni0413 +ENCODING 179 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0414 +ENCODING 180 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +A0 +A0 +A0 +A0 +F0 +90 +ENDCHAR +STARTCHAR uni0415 +ENCODING 181 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni0416 +ENCODING 182 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni0417 +ENCODING 183 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +20 +10 +90 +60 +ENDCHAR +STARTCHAR uni0418 +ENCODING 184 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +B0 +D0 +90 +90 +ENDCHAR +STARTCHAR uni0419 +ENCODING 185 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +D0 +90 +90 +ENDCHAR +STARTCHAR uni041A +ENCODING 186 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR uni041B +ENCODING 187 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +50 +50 +50 +50 +90 +ENDCHAR +STARTCHAR uni041C +ENCODING 188 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +F0 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni041D +ENCODING 189 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni041E +ENCODING 190 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni041F +ENCODING 191 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +F0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni0420 +ENCODING 192 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni0421 +ENCODING 193 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR uni0422 +ENCODING 194 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0423 +ENCODING 195 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +90 +90 +70 +10 +E0 +ENDCHAR +STARTCHAR uni0424 +ENCODING 196 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0425 +ENCODING 197 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +50 +50 +20 +20 +50 +50 +ENDCHAR +STARTCHAR uni0426 +ENCODING 198 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +F0 +10 +ENDCHAR +STARTCHAR uni0427 +ENCODING 199 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +50 +50 +50 +30 +10 +10 +ENDCHAR +STARTCHAR uni0428 +ENCODING 200 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni0429 +ENCODING 201 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +08 +ENDCHAR +STARTCHAR uni042A +ENCODING 202 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni042B +ENCODING 203 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni042C +ENCODING 204 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +40 +40 +60 +50 +50 +60 +ENDCHAR +STARTCHAR uni042D +ENCODING 205 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +10 +70 +10 +10 +E0 +ENDCHAR +STARTCHAR uni042E +ENCODING 206 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni042F +ENCODING 207 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +90 +90 +70 +90 +90 +ENDCHAR +STARTCHAR uni0430 +ENCODING 208 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni0431 +ENCODING 209 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +10 +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR uni0432 +ENCODING 210 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +E0 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni0433 +ENCODING 211 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni0434 +ENCODING 212 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +70 +50 +90 +F0 +90 +ENDCHAR +STARTCHAR uni0435 +ENCODING 213 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +60 +B0 +C0 +60 +ENDCHAR +STARTCHAR uni0436 +ENCODING 214 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni0437 +ENCODING 215 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +70 +30 +10 +60 +ENDCHAR +STARTCHAR uni0438 +ENCODING 216 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +B0 +D0 +90 +ENDCHAR +STARTCHAR uni0439 +ENCODING 217 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +00 +90 +B0 +D0 +90 +ENDCHAR +STARTCHAR uni043A +ENCODING 218 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +E0 +A0 +90 +ENDCHAR +STARTCHAR uni043B +ENCODING 219 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +30 +50 +50 +90 +ENDCHAR +STARTCHAR uni043C +ENCODING 220 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +88 +D8 +A8 +A8 +ENDCHAR +STARTCHAR uni043D +ENCODING 221 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni043E +ENCODING 222 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni043F +ENCODING 223 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni0440 +ENCODING 224 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni0441 +ENCODING 225 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +30 +40 +40 +30 +ENDCHAR +STARTCHAR uni0442 +ENCODING 226 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0443 +ENCODING 227 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +90 +90 +50 +20 +40 +ENDCHAR +STARTCHAR uni0444 +ENCODING 228 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +70 +50 +50 +70 +20 +ENDCHAR +STARTCHAR uni0445 +ENCODING 229 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR uni0446 +ENCODING 230 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +90 +90 +90 +F0 +10 +ENDCHAR +STARTCHAR uni0447 +ENCODING 231 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +90 +70 +10 +ENDCHAR +STARTCHAR uni0448 +ENCODING 232 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni0449 +ENCODING 233 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 -1 +BITMAP +A8 +A8 +A8 +F8 +08 +ENDCHAR +STARTCHAR uni044A +ENCODING 234 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +C0 +60 +50 +60 +ENDCHAR +STARTCHAR uni044B +ENCODING 235 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +90 +D0 +B0 +D0 +ENDCHAR +STARTCHAR uni044C +ENCODING 236 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni044D +ENCODING 237 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +60 +30 +10 +60 +ENDCHAR +STARTCHAR uni044E +ENCODING 238 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +A0 +D0 +D0 +A0 +ENDCHAR +STARTCHAR uni044F +ENCODING 239 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 4 0 0 +BITMAP +30 +50 +30 +50 +ENDCHAR +STARTCHAR uni0451 +ENCODING 241 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +A0 +00 +60 +B0 +C0 +60 +ENDCHAR +STARTCHAR uni0459 +ENCODING 249 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR uni045A +ENCODING 250 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 3 0 3 +BITMAP +20 +50 +20 +ENDCHAR +STARTCHAR uni045B +ENCODING 251 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 1 0 2 +BITMAP +20 +ENDCHAR +STARTCHAR uni045C +ENCODING 252 +SWIDTH 436 0 +DWIDTH 5 0 +BBX 5 5 0 2 +BITMAP +20 +50 +10 +20 +70 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvB12-L1.bdf b/gui/themes/fonts/helvB12-L1.bdf deleted file mode 100644 index 1eabe21c57..0000000000 --- a/gui/themes/fonts/helvB12-L1.bdf +++ /dev/null @@ -1,3059 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl helvB12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO8859-1 -SIZE 12 75 75 -FONTBOUNDINGBOX 13 15 -1 -3 -COMMENT $Xorg: $ -COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 -COMMENT -COMMENT + -COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. -COMMENT Copyright 1988, 1994 Digital Equipment Corporation. -COMMENT -COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be -COMMENT registered in certain jurisdictions. -COMMENT Permission to use these trademarks is hereby granted only in -COMMENT association with the images described in this file. -COMMENT -COMMENT Permission to use, copy, modify, distribute and sell this software -COMMENT and its documentation for any purpose and without fee is hereby -COMMENT granted, provided that the above copyright notices appear in all -COMMENT copies and that both those copyright notices and this permission -COMMENT notice appear in supporting documentation, and that the names of -COMMENT Adobe Systems and Digital Equipment Corporation not be used in -COMMENT advertising or publicity pertaining to distribution of the software -COMMENT without specific, written prior permission. Adobe Systems and -COMMENT Digital Equipment Corporation make no representations about the -COMMENT suitability of this software for any purpose. It is provided "as -COMMENT is" without express or implied warranty. -COMMENT - -STARTPROPERTIES 26 -FOUNDRY "Adobe" -FAMILY_NAME "Helvetica" -WEIGHT_NAME "Bold" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "P" -AVERAGE_WIDTH 70 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -CAP_HEIGHT 9 -X_HEIGHT 7 -FONT_ASCENT 11 -FONT_DESCENT 3 -FACE_NAME "Helvetica Bold" -COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." -NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " -_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" -DEFAULT_CHAR 0 -RELATIVE_SETWIDTH 50 -RELATIVE_WEIGHT 70 -FULL_NAME "Helvetica Bold" -ENDPROPERTIES -CHARS 192 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -AA -00 -82 -00 -82 -00 -82 -00 -AA -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 2 9 1 0 -BITMAP -C0 -C0 -C0 -C0 -C0 -80 -00 -C0 -C0 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 474 0 -DWIDTH 5 0 -BBX 3 3 1 6 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 7 8 0 0 -BITMAP -14 -14 -7E -28 -28 -FC -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 11 0 -2 -BITMAP -10 -78 -D4 -D0 -78 -1C -94 -D4 -78 -10 -10 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 889 0 -DWIDTH 12 0 -BBX 11 9 0 0 -BITMAP -7100 -DB00 -DA00 -7400 -0400 -09C0 -0B60 -1B60 -11C0 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 9 0 0 -BITMAP -3800 -6C00 -6C00 -3800 -7900 -CF00 -C600 -CF00 -7980 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 238 0 -DWIDTH 3 0 -BBX 1 3 1 6 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 333 0 -DWIDTH 6 0 -BBX 4 12 1 -3 -BITMAP -30 -60 -60 -C0 -C0 -C0 -C0 -C0 -C0 -60 -60 -30 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 333 0 -DWIDTH 6 0 -BBX 4 12 1 -3 -BITMAP -C0 -60 -60 -30 -30 -30 -30 -30 -30 -60 -60 -C0 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 389 0 -DWIDTH 6 0 -BBX 5 4 0 5 -BITMAP -20 -F8 -70 -50 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 0 1 -BITMAP -30 -30 -FC -30 -30 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 4 1 -2 -BITMAP -C0 -C0 -40 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 0 3 -BITMAP -F0 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 2 1 0 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 4 9 0 0 -BITMAP -30 -30 -20 -60 -60 -40 -40 -C0 -C0 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -CC -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 4 9 0 0 -BITMAP -30 -F0 -30 -30 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -0C -18 -30 -60 -C0 -C0 -FC -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -0C -38 -0C -0C -0C -CC -78 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -0C -1C -2C -2C -4C -8C -FE -0C -0C -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -7C -60 -C0 -F8 -0C -0C -CC -CC -78 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -C0 -C0 -F8 -CC -CC -CC -78 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -FC -0C -18 -18 -30 -30 -30 -60 -60 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -CC -78 -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -78 -CC -CC -CC -7C -0C -0C -CC -78 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 2 7 1 0 -BITMAP -C0 -C0 -00 -00 -00 -C0 -C0 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 2 9 1 -2 -BITMAP -C0 -C0 -00 -00 -00 -C0 -C0 -40 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -18 -70 -C0 -70 -18 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 3 0 2 -BITMAP -FC -00 -FC -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -C0 -70 -18 -70 -C0 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -78 -CC -CC -18 -30 -30 -00 -30 -30 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 975 0 -DWIDTH 12 0 -BBX 10 10 1 -1 -BITMAP -1F00 -6080 -4040 -8D40 -9240 -A240 -A680 -9B00 -4000 -3E00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -18 -3C -24 -66 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -FC -C6 -C6 -C6 -FC -C6 -C6 -C6 -FC -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 7 9 1 0 -BITMAP -3C -66 -C0 -C0 -C0 -C0 -C0 -66 -3C -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -F8 -CC -C6 -C6 -C6 -C6 -C6 -CC -F8 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -FC -C0 -C0 -C0 -FC -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -FC -C0 -C0 -C0 -F8 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -3E -63 -C0 -C0 -CF -C3 -C3 -63 -3D -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -C6 -C6 -C6 -C6 -FE -C6 -C6 -C6 -C6 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 9 1 0 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -0C -0C -0C -0C -0C -0C -CC -CC -78 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 8 9 1 0 -BITMAP -C6 -CC -D8 -F0 -F0 -D8 -CC -C6 -C3 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 833 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -C180 -C180 -E380 -E380 -F780 -D580 -DD80 -C980 -C980 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -C6 -E6 -E6 -D6 -D6 -CE -CE -C6 -C6 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 7 9 1 0 -BITMAP -FC -C6 -C6 -C6 -FC -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -3C -66 -C3 -C3 -C3 -CB -CF -66 -3F -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -FC -C6 -C6 -C6 -FC -CC -C6 -C6 -C6 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -7C -C6 -C6 -70 -1C -0E -C6 -C6 -7C -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -FF -18 -18 -18 -18 -18 -18 -18 -18 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -C6 -C6 -C6 -C6 -C6 -C6 -C6 -6C -7C -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -C3 -C3 -66 -66 -66 -24 -3C -18 -18 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 944 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -CCC0 -CCC0 -CCC0 -4C80 -6D80 -6D80 -3300 -3300 -3300 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -C3 -C3 -66 -3C -18 -3C -66 -C3 -C3 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -C3 -C3 -66 -66 -3C -18 -18 -18 -18 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -FE -06 -0C -18 -30 -30 -60 -C0 -FE -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 12 1 -3 -BITMAP -E0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -E0 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 4 9 0 0 -BITMAP -C0 -C0 -40 -60 -60 -20 -20 -30 -30 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 12 0 -3 -BITMAP -E0 -60 -60 -60 -60 -60 -60 -60 -60 -60 -60 -E0 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 7 4 0 5 -BITMAP -10 -38 -6C -C6 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 1 0 -3 -BITMAP -FE -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 2 0 8 -BITMAP -C0 -60 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 7 0 0 -BITMAP -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -C0 -C0 -D8 -EC -CC -CC -CC -EC -D8 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -78 -CC -C0 -C0 -C0 -CC -78 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -0C -0C -6C -DC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -78 -CC -CC -FC -C0 -CC -78 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 5 9 0 0 -BITMAP -38 -60 -F0 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 -3 -BITMAP -6C -DC -CC -CC -CC -DC -6C -0C -CC -78 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -C0 -C0 -D8 -EC -CC -CC -CC -CC -CC -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 9 0 0 -BITMAP -C0 -00 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 12 -1 -3 -BITMAP -60 -00 -60 -60 -60 -60 -60 -60 -60 -60 -60 -C0 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -C0 -C0 -CC -D8 -F0 -F0 -D8 -CC -C6 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 9 0 0 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 889 0 -DWIDTH 11 0 -BBX 10 7 0 0 -BITMAP -BB80 -CCC0 -CCC0 -CCC0 -CCC0 -CCC0 -CCC0 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -D8 -EC -CC -CC -CC -CC -CC -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 -3 -BITMAP -D8 -EC -CC -CC -CC -EC -D8 -C0 -C0 -C0 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 -3 -BITMAP -74 -DC -CC -CC -CC -DC -6C -0C -0C -0C -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 5 7 0 0 -BITMAP -D8 -F8 -E0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -78 -CC -E0 -38 -1C -CC -78 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 5 9 0 0 -BITMAP -60 -60 -F0 -60 -60 -60 -60 -68 -30 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -CC -CC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 7 7 0 0 -BITMAP -C6 -C6 -6C -6C -38 -38 -10 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 778 0 -DWIDTH 11 0 -BBX 10 7 0 0 -BITMAP -CCC0 -CCC0 -6D80 -6D80 -6D80 -3300 -3300 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -CC -CC -78 -30 -78 -CC -CC -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 7 10 0 -3 -BITMAP -C6 -C6 -6C -6C -38 -38 -18 -10 -30 -60 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -F8 -18 -30 -20 -60 -C0 -F8 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 4 12 0 -3 -BITMAP -30 -60 -60 -60 -60 -C0 -60 -60 -60 -60 -60 -30 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 280 0 -DWIDTH 4 0 -BBX 2 12 1 -3 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 4 12 0 -3 -BITMAP -C0 -60 -60 -60 -60 -30 -60 -60 -60 -60 -60 -C0 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 7 2 0 3 -BITMAP -76 -DC -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 2 10 1 -3 -BITMAP -C0 -C0 -00 -40 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 -1 -BITMAP -10 -78 -DC -90 -A0 -A0 -EC -78 -40 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -38 -6C -60 -60 -F8 -60 -60 -EC -D8 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 6 0 1 -BITMAP -CC -78 -48 -48 -78 -CC -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -CC -CC -48 -FC -30 -FC -30 -30 -30 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 280 0 -DWIDTH 4 0 -BBX 2 11 1 -2 -BITMAP -C0 -C0 -C0 -C0 -00 -00 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 12 0 -3 -BITMAP -78 -CC -E0 -70 -D8 -CC -CC -6C -38 -1C -CC -78 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 5 1 0 8 -BITMAP -D8 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -3E00 -4100 -9C80 -A280 -A080 -A280 -9C80 -4100 -3E00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 370 0 -DWIDTH 6 0 -BBX 4 6 1 3 -BITMAP -E0 -30 -F0 -B0 -00 -F0 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 6 5 1 1 -BITMAP -24 -6C -D8 -6C -24 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 6 4 1 2 -BITMAP -FC -04 -04 -04 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 0 3 -BITMAP -F0 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -3E00 -4100 -9C80 -9480 -9880 -9480 -9480 -4100 -3E00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 1 0 8 -BITMAP -F0 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 400 0 -DWIDTH 5 0 -BBX 4 4 0 4 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -30 -30 -FC -30 -30 -00 -FC -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 5 0 4 -BITMAP -60 -B0 -60 -C0 -F0 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 5 0 4 -BITMAP -60 -B0 -60 -30 -E0 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 2 0 8 -BITMAP -60 -C0 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 -3 -BITMAP -CC -CC -CC -CC -CC -DC -EC -C0 -C0 -C0 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 12 0 -3 -BITMAP -3E -74 -F4 -F4 -F4 -74 -34 -14 -14 -14 -14 -14 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 2 1 3 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 4 0 -3 -BITMAP -60 -30 -30 -E0 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 5 0 4 -BITMAP -60 -E0 -60 -60 -60 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 365 0 -DWIDTH 6 0 -BBX 4 6 1 3 -BITMAP -60 -D0 -D0 -60 -00 -F0 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 6 5 1 1 -BITMAP -90 -D8 -6C -D8 -90 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6300 -E600 -6600 -6C00 -6D80 -0B80 -1A80 -37C0 -3180 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6300 -E600 -6600 -6C00 -6D80 -0AC0 -1980 -3300 -33C0 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6300 -B300 -6600 -3600 -ED80 -0B80 -1A80 -37C0 -3180 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 6 10 1 -3 -BITMAP -30 -30 -00 -30 -30 -30 -60 -CC -CC -78 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -30 -18 -00 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -0C -18 -00 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -1C -36 -00 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -1A -2C -00 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 11 0 0 -BITMAP -36 -00 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -18 -24 -18 -18 -18 -3C -24 -66 -7E -C3 -C3 -C3 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 1000 0 -DWIDTH 13 0 -BBX 11 9 1 0 -BITMAP -1FE0 -3600 -2600 -6600 -67E0 -7E00 -C600 -C600 -C7E0 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 7 12 1 -3 -BITMAP -3C -66 -C0 -C0 -C0 -C0 -C0 -66 -3C -18 -18 -70 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -60 -30 -00 -FC -C0 -C0 -C0 -FC -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -18 -30 -00 -FC -C0 -C0 -C0 -FC -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -38 -6C -00 -FC -C0 -C0 -C0 -FC -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 11 1 0 -BITMAP -6C -00 -FC -C0 -C0 -C0 -FC -C0 -C0 -C0 -FC -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 3 12 0 0 -BITMAP -C0 -60 -00 -60 -60 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 3 12 1 0 -BITMAP -60 -C0 -00 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 5 12 0 0 -BITMAP -70 -D8 -00 -60 -60 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 5 11 0 0 -BITMAP -D8 -00 -60 -60 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 8 9 0 0 -BITMAP -7C -66 -63 -63 -F3 -63 -63 -66 -7C -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -34 -58 -00 -C6 -C6 -E6 -E6 -F6 -CE -CE -C6 -C6 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -30 -18 -00 -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -0C -18 -00 -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -1C -36 -00 -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -1A -2C -00 -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 11 1 0 -BITMAP -66 -00 -3C -66 -C3 -C3 -C3 -C3 -C3 -66 -3C -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 0 1 -BITMAP -CC -78 -30 -78 -CC -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3D -66 -CF -CB -DB -D3 -F3 -66 -7C -80 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -30 -18 -00 -C6 -C6 -C6 -C6 -C6 -C6 -C6 -6C -7C -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -0C -18 -00 -C6 -C6 -C6 -C6 -C6 -C6 -C6 -6C -7C -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -38 -6C -00 -C6 -C6 -C6 -C6 -C6 -C6 -C6 -6C -7C -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 11 1 0 -BITMAP -6C -00 -C6 -C6 -C6 -C6 -C6 -C6 -C6 -6C -7C -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -0C -18 -00 -C3 -C3 -66 -66 -24 -3C -18 -18 -18 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 7 9 1 0 -BITMAP -C0 -C0 -FC -C6 -C6 -C6 -FC -C0 -C0 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -78 -CC -CC -CC -D8 -CC -CC -CC -D8 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -30 -18 -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -18 -30 -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -38 -6C -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -34 -58 -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -6C -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -30 -48 -30 -00 -78 -CC -0C -7C -CC -CC -76 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 889 0 -DWIDTH 11 0 -BBX 10 7 0 0 -BITMAP -7780 -CCC0 -0CC0 -7FC0 -CC00 -CCC0 -7780 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 0 -3 -BITMAP -78 -CC -C0 -C0 -C0 -CC -78 -10 -18 -70 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -60 -30 -00 -78 -CC -CC -FC -C0 -CC -78 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -18 -30 -00 -78 -CC -CC -FC -C0 -CC -78 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -38 -6C -00 -78 -CC -CC -FC -C0 -CC -78 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -6C -00 -78 -CC -CC -FC -C0 -CC -78 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 10 -1 0 -BITMAP -C0 -60 -00 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 10 0 0 -BITMAP -60 -C0 -00 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 5 10 -1 0 -BITMAP -70 -D8 -00 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 5 9 -1 0 -BITMAP -D8 -00 -60 -60 -60 -60 -60 -60 -60 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -D8 -70 -90 -18 -7C -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -34 -58 -00 -D8 -EC -CC -CC -CC -CC -CC -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -60 -30 -00 -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -18 -30 -00 -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -38 -6C -00 -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -34 -58 -00 -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -6C -00 -78 -CC -CC -CC -CC -CC -78 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 0 1 -BITMAP -30 -00 -FC -00 -30 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 7 -1 0 -BITMAP -3D -66 -6E -76 -66 -66 -BC -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -60 -30 -00 -CC -CC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -18 -30 -00 -CC -CC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -38 -6C -00 -CC -CC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -6C -00 -CC -CC -CC -CC -CC -DC -6C -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 7 13 0 -3 -BITMAP -0C -18 -00 -C6 -C6 -6C -6C -38 -38 -18 -10 -30 -60 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 12 0 -3 -BITMAP -C0 -C0 -D8 -EC -CC -CC -CC -EC -D8 -C0 -C0 -C0 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 556 0 -DWIDTH 8 0 -BBX 7 12 0 -3 -BITMAP -6C -00 -C6 -C6 -6C -6C -38 -38 -18 -10 -30 -60 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/helvB12-iso-8859-1.bdf b/gui/themes/fonts/helvB12-iso-8859-1.bdf new file mode 100644 index 0000000000..1eabe21c57 --- /dev/null +++ b/gui/themes/fonts/helvB12-iso-8859-1.bdf @@ -0,0 +1,3059 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvB12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 13 15 -1 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +78 +D4 +D0 +78 +1C +94 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +0400 +09C0 +0B60 +1B60 +11C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3800 +6C00 +6C00 +3800 +7900 +CF00 +C600 +CF00 +7980 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +F8 +70 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +30 +30 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +30 +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +38 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1C +2C +2C +4C +8C +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +70 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +C0 +70 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4040 +8D40 +9240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +CB +CF +66 +3F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +C0 +C0 +40 +60 +60 +20 +20 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 4 0 5 +BITMAP +10 +38 +6C +C6 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +74 +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +30 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +76 +DC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 10 1 -3 +BITMAP +C0 +C0 +00 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +10 +78 +DC +90 +A0 +A0 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +60 +60 +F8 +60 +60 +EC +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +78 +48 +48 +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +48 +FC +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +CC +E0 +70 +D8 +CC +CC +6C +38 +1C +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +E0 +30 +F0 +B0 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +EC +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +3E +74 +F4 +F4 +F4 +74 +34 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +30 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 4 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +60 +D0 +D0 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0AC0 +1980 +3300 +33C0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +B300 +6600 +3600 +ED80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +60 +CC +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +30 +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 -3 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +18 +18 +70 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +60 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +18 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +E6 +E6 +F6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +30 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +66 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3D +66 +CF +CB +DB +D3 +F3 +66 +7C +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +C0 +C0 +FC +C6 +C6 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +CC +D8 +CC +CC +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +34 +58 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +30 +48 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +10 +18 +70 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 -1 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +90 +18 +7C +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 -1 0 +BITMAP +3D +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +0C +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +6C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvB12-iso-8859-5.bdf b/gui/themes/fonts/helvB12-iso-8859-5.bdf new file mode 100644 index 0000000000..dcfd6f0105 --- /dev/null +++ b/gui/themes/fonts/helvB12-iso-8859-5.bdf @@ -0,0 +1,2763 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any helvB12c.bdf /usr/share/fonts/X11/util/map-ISO8859-5 ISO8859-5' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any by Ben Collver , 2003, based on +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO8859-5 +SIZE 12 75 75 +FONTBOUNDINGBOX 13 15 -1 -3 +COMMENT $XConsortium: helvB12.bdf,v 1.13 95/01/26 18:01:34 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 32 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "5" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO8859-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +COPYRIGHT2 "Cyrillic glyphs copyright 2000 Dmitry Yu. Bolkhovityanov, bolkhov@inp.nsk.su" +SOURCEDATE "Sun Jan 23 14:44:29 2000" +PKGVERSION "1.1" +ASSEMBLER "cvtbdf.pl (Linux)" +ENDPROPERTIES +CHARS 177 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR defaultchar +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +78 +D4 +D0 +78 +1C +94 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +0400 +09C0 +0B60 +1B60 +11C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3800 +6C00 +6C00 +3800 +7900 +CF00 +C600 +CF00 +7980 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +F8 +70 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +30 +30 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +30 +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +38 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1C +2C +2C +4C +8C +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +70 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +C0 +70 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4040 +8D40 +9240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +CB +CF +66 +3F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +C0 +C0 +40 +60 +60 +20 +20 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 4 0 5 +BITMAP +10 +38 +6C +C6 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +74 +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +30 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +76 +DC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR afii10023 +ENCODING 161 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR afii10053 +ENCODING 164 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +F8 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR afii10054 +ENCODING 165 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10055 +ENCODING 166 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 167 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii10057 +ENCODING 168 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR afii10062 +ENCODING 174 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +66 +3C +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +70 +ENDCHAR +STARTCHAR afii10017 +ENCODING 176 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR afii10018 +ENCODING 177 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +C0 +C0 +C0 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10019 +ENCODING 178 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10020 +ENCODING 179 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10021 +ENCODING 180 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 9 11 0 -2 +BITMAP +3F00 +3300 +3300 +3300 +3300 +3300 +6300 +6300 +FF80 +C180 +C180 +ENDCHAR +STARTCHAR afii10022 +ENCODING 181 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR afii10024 +ENCODING 182 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 12 9 0 0 +BITMAP +C630 +6660 +36C0 +1F80 +0F00 +1F80 +36C0 +6660 +C630 +ENDCHAR +STARTCHAR afii10025 +ENCODING 183 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +06 +06 +3C +06 +06 +C6 +7C +ENDCHAR +STARTCHAR afii10026 +ENCODING 184 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +CE +CE +D6 +D6 +E6 +E6 +C6 +ENDCHAR +STARTCHAR afii10027 +ENCODING 185 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +00 +C6 +C6 +CE +CE +D6 +D6 +E6 +E6 +C6 +ENDCHAR +STARTCHAR afii10028 +ENCODING 186 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR afii10029 +ENCODING 187 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3F +33 +33 +33 +33 +33 +33 +33 +E3 +ENDCHAR +STARTCHAR afii10030 +ENCODING 188 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR afii10031 +ENCODING 189 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10032 +ENCODING 190 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR afii10033 +ENCODING 191 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10034 +ENCODING 192 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10035 +ENCODING 193 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR afii10036 +ENCODING 194 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR afii10037 +ENCODING 195 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +24 +3C +18 +18 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 196 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0C00 +3F00 +6D80 +CCC0 +CCC0 +CCC0 +6D80 +3F00 +0C00 +ENDCHAR +STARTCHAR afii10039 +ENCODING 197 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR afii10040 +ENCODING 198 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 11 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FF +03 +03 +ENDCHAR +STARTCHAR afii10041 +ENCODING 199 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +ENDCHAR +STARTCHAR afii10042 +ENCODING 200 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +FFC0 +ENDCHAR +STARTCHAR afii10043 +ENCODING 201 +SWIDTH 960 0 +DWIDTH 12 0 +BBX 11 11 1 -2 +BITMAP +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +FFE0 +0060 +0060 +ENDCHAR +STARTCHAR afii10044 +ENCODING 202 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +F000 +3000 +3000 +3000 +3F00 +3180 +3180 +3180 +3F00 +ENDCHAR +STARTCHAR afii10045 +ENCODING 203 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +C060 +C060 +C060 +C060 +FC60 +C660 +C660 +C660 +FC60 +ENDCHAR +STARTCHAR afii10046 +ENCODING 204 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10047 +ENCODING 205 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +78 +CC +06 +06 +3E +06 +06 +CC +78 +ENDCHAR +STARTCHAR afii10048 +ENCODING 206 +SWIDTH 1040 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +C780 +CCC0 +D860 +D860 +F860 +D860 +D860 +CCC0 +C780 +ENDCHAR +STARTCHAR afii10049 +ENCODING 207 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7E +C6 +C6 +C6 +7E +66 +66 +C6 +C6 +ENDCHAR +STARTCHAR afii10065 +ENCODING 208 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR afii10066 +ENCODING 209 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +0C +78 +C0 +D8 +EC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10067 +ENCODING 210 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +F8 +CC +CC +F8 +ENDCHAR +STARTCHAR afii10068 +ENCODING 211 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10069 +ENCODING 212 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 8 0 -1 +BITMAP +3E +36 +36 +36 +66 +66 +FF +C3 +ENDCHAR +STARTCHAR afii10070 +ENCODING 213 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR afii10072 +ENCODING 214 +SWIDTH 720 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +DB +DB +7E +3C +7E +DB +DB +ENDCHAR +STARTCHAR afii10073 +ENCODING 215 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +0C +38 +0C +CC +78 +ENDCHAR +STARTCHAR afii10074 +ENCODING 216 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR afii10075 +ENCODING 217 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +48 +78 +00 +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR afii10076 +ENCODING 218 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR afii10077 +ENCODING 219 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 7 -1 0 +BITMAP +3F +33 +33 +33 +33 +33 +E3 +ENDCHAR +STARTCHAR afii10078 +ENCODING 220 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 9 7 0 0 +BITMAP +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +ENDCHAR +STARTCHAR afii10079 +ENCODING 221 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR afii10080 +ENCODING 222 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10081 +ENCODING 223 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10082 +ENCODING 224 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10083 +ENCODING 225 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10085 +ENCODING 227 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR afii10086 +ENCODING 228 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 10 12 0 -3 +BITMAP +0C00 +0C00 +7F80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +7F80 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR afii10087 +ENCODING 229 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR afii10088 +ENCODING 230 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 7 8 0 -1 +BITMAP +CC +CC +CC +CC +CC +CC +FE +06 +ENDCHAR +STARTCHAR afii10089 +ENCODING 231 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +7C +0C +0C +0C +ENDCHAR +STARTCHAR afii10090 +ENCODING 232 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +FFC0 +ENDCHAR +STARTCHAR afii10091 +ENCODING 233 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 11 8 0 -1 +BITMAP +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +FFE0 +0060 +ENDCHAR +STARTCHAR afii10092 +ENCODING 234 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 8 7 -1 0 +BITMAP +F0 +30 +30 +3E +33 +33 +3E +ENDCHAR +STARTCHAR afii10093 +ENCODING 235 +SWIDTH 800 0 +DWIDTH 10 0 +BBX 9 7 0 0 +BITMAP +C180 +C180 +C180 +F980 +CD80 +CD80 +F980 +ENDCHAR +STARTCHAR afii10094 +ENCODING 236 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +C0 +C0 +F8 +CC +CC +F8 +ENDCHAR +STARTCHAR afii10095 +ENCODING 237 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +0C +3C +0C +CC +78 +ENDCHAR +STARTCHAR afii10096 +ENCODING 238 +SWIDTH 880 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +C780 +CCC0 +CCC0 +FCC0 +CCC0 +CCC0 +C780 +ENDCHAR +STARTCHAR afii10097 +ENCODING 239 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +CC +CC +7C +6C +CC +CC +ENDCHAR +STARTCHAR afii10071 +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR afii10101 +ENCODING 244 +SWIDTH 560 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +F0 +C0 +CC +78 +ENDCHAR +STARTCHAR afii10102 +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR afii10103 +ENCODING 246 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 247 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii10105 +ENCODING 248 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR section +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +CC +E0 +70 +D8 +CC +CC +6C +38 +1C +CC +78 +ENDCHAR +STARTCHAR afii10110 +ENCODING 254 +SWIDTH 640 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +44 +38 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +ENDFONT -- cgit v1.2.3 From 0d6efb2334aeed7f63ab68538d74021d0491f423 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 28 Jun 2010 12:20:15 +0000 Subject: Fonts: More BDF font renames svn-id: r50437 --- gui/themes/fonts/courr12-iso-8859-1.bdf | 2926 ++++++++++++++++++++++++++++ gui/themes/fonts/courr12-l1.bdf | 2926 ---------------------------- gui/themes/fonts/helvBO12-L1.bdf | 3058 ------------------------------ gui/themes/fonts/helvBO12-iso-8859-1.bdf | 3058 ++++++++++++++++++++++++++++++ gui/themes/fonts/helvR12-L1.bdf | 3048 ----------------------------- gui/themes/fonts/helvR12-iso-8859-1.bdf | 3048 +++++++++++++++++++++++++++++ 6 files changed, 9032 insertions(+), 9032 deletions(-) create mode 100644 gui/themes/fonts/courr12-iso-8859-1.bdf delete mode 100644 gui/themes/fonts/courr12-l1.bdf delete mode 100644 gui/themes/fonts/helvBO12-L1.bdf create mode 100644 gui/themes/fonts/helvBO12-iso-8859-1.bdf delete mode 100644 gui/themes/fonts/helvR12-L1.bdf create mode 100644 gui/themes/fonts/helvR12-iso-8859-1.bdf diff --git a/gui/themes/fonts/courr12-iso-8859-1.bdf b/gui/themes/fonts/courr12-iso-8859-1.bdf new file mode 100644 index 0000000000..fdd7cbacab --- /dev/null +++ b/gui/themes/fonts/courr12-iso-8859-1.bdf @@ -0,0 +1,2926 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl courR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Courier-Medium-R-Normal--12-120-75-75-M-70-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 8 14 0 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Courier" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "M" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 3 +FACE_NAME "Courier" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "No mark" +_DEC_DEVICE_FONTNAMES "PS=Courier" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +FULL_NAME "Courier" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 3 2 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +88 +80 +60 +30 +88 +88 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +60 +90 +64 +18 +60 +98 +24 +18 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +48 +40 +22 +74 +88 +8C +72 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 3 3 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 11 3 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 3 1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +10 +20 +40 +88 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +08 +30 +08 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +1C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +40 +40 +40 +78 +04 +04 +84 +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +80 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +10 +10 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 5 3 0 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 6 2 -1 +BITMAP +40 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 7 2 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +08 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +70 +88 +98 +A8 +A8 +9C +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +78 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +80 +80 +88 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +44 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +44 +50 +70 +50 +40 +44 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +44 +54 +70 +50 +40 +40 +F0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +7C +44 +44 +44 +EE +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +78 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EC +48 +50 +60 +70 +48 +44 +E6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +E0 +40 +40 +40 +40 +44 +44 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +C6 +6C +6C +54 +54 +54 +44 +EE +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +CE +64 +64 +54 +54 +4C +4C +E4 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +4C +44 +4C +78 +40 +40 +F0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +18 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +F8 +44 +44 +78 +48 +44 +44 +E6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +78 +88 +80 +E0 +38 +08 +88 +F0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +FE +92 +92 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +44 +6C +28 +28 +38 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +54 +54 +54 +6C +28 +28 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +10 +28 +28 +44 +EE +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +28 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +88 +90 +20 +20 +48 +88 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 11 3 -2 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 2 1 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +40 +40 +78 +44 +44 +44 +44 +B8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +08 +08 +78 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +40 +F8 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 -3 +BITMAP +74 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +40 +40 +58 +64 +44 +44 +44 +EE +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 12 1 -3 +BITMAP +10 +00 +00 +F0 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +40 +40 +4C +50 +60 +50 +48 +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +E8 +54 +54 +54 +54 +D6 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +B8 +64 +44 +44 +44 +E6 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 -3 +BITMAP +B8 +44 +44 +44 +44 +78 +40 +40 +E0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 -3 +BITMAP +74 +88 +88 +88 +88 +78 +08 +08 +1C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +B8 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +70 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +40 +40 +F8 +40 +40 +40 +44 +38 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +44 +44 +28 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +44 +54 +54 +28 +28 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +EE +28 +10 +28 +44 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 -3 +BITMAP +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +F8 +90 +20 +40 +88 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 10 2 -2 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 10 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 10 2 -2 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 9 3 -3 +BITMAP +80 +00 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +20 +20 +70 +A8 +A0 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +30 +48 +40 +F8 +20 +20 +44 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +EE +44 +28 +7C +10 +7C +10 +38 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 10 3 -2 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +78 +48 +60 +90 +88 +48 +30 +90 +90 +F0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 1 2 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +44 +9A +A2 +A2 +9A +44 +38 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 6 1 2 +BITMAP +60 +10 +70 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +24 +48 +90 +48 +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +44 +BA +AA +B2 +AA +44 +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 1 1 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 4 1 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +F8 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +90 +60 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 2 2 3 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 -3 +BITMAP +CC +44 +44 +44 +44 +7A +40 +40 +40 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +7C +A8 +A8 +A8 +68 +28 +28 +28 +28 +6C +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 1 1 3 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 3 2 -3 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 3 5 2 3 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 4 6 1 2 +BITMAP +60 +90 +90 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +40 +C1 +42 +44 +E8 +12 +26 +4A +8F +02 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +40 +C1 +42 +44 +E8 +16 +29 +42 +84 +0F +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 8 10 0 -1 +BITMAP +60 +91 +22 +94 +68 +12 +26 +4A +8F +02 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 -2 +BITMAP +20 +00 +20 +20 +40 +80 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +28 +50 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +28 +00 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +10 +70 +10 +28 +28 +7C +44 +44 +EE +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +7C +30 +50 +5C +50 +F0 +90 +9C +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 -3 +BITMAP +70 +88 +88 +80 +80 +88 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +10 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +10 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +10 +28 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +28 +00 +FC +44 +48 +78 +48 +44 +44 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +44 +44 +E4 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +EE +64 +54 +54 +4C +4C +44 +E4 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +28 +00 +EE +44 +44 +44 +44 +44 +6C +38 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +EE +44 +28 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +E0 +40 +78 +44 +44 +78 +40 +E0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +48 +48 +48 +50 +48 +44 +54 +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +40 +20 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +10 +20 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +20 +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +28 +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +50 +00 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +20 +50 +20 +F0 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 6 0 0 +BITMAP +6C +12 +7E +90 +92 +6C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +70 +88 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +70 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +E0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +38 +60 +90 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +28 +50 +00 +B8 +64 +44 +44 +44 +E6 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +40 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +A0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 5 8 1 -1 +BITMAP +08 +70 +98 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +20 +10 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +20 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +28 +00 +CC +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +08 +10 +00 +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +40 +40 +78 +44 +44 +44 +44 +78 +40 +40 +E0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 600 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +28 +00 +EE +44 +44 +28 +38 +10 +10 +10 +60 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/courr12-l1.bdf b/gui/themes/fonts/courr12-l1.bdf deleted file mode 100644 index fdd7cbacab..0000000000 --- a/gui/themes/fonts/courr12-l1.bdf +++ /dev/null @@ -1,2926 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl courR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -FONT -Adobe-Courier-Medium-R-Normal--12-120-75-75-M-70-ISO8859-1 -SIZE 12 75 75 -FONTBOUNDINGBOX 8 14 0 -3 -COMMENT $Xorg: $ -COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 -COMMENT -COMMENT + -COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. -COMMENT Copyright 1988, 1994 Digital Equipment Corporation. -COMMENT -COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be -COMMENT registered in certain jurisdictions. -COMMENT Permission to use these trademarks is hereby granted only in -COMMENT association with the images described in this file. -COMMENT -COMMENT Permission to use, copy, modify, distribute and sell this software -COMMENT and its documentation for any purpose and without fee is hereby -COMMENT granted, provided that the above copyright notices appear in all -COMMENT copies and that both those copyright notices and this permission -COMMENT notice appear in supporting documentation, and that the names of -COMMENT Adobe Systems and Digital Equipment Corporation not be used in -COMMENT advertising or publicity pertaining to distribution of the software -COMMENT without specific, written prior permission. Adobe Systems and -COMMENT Digital Equipment Corporation make no representations about the -COMMENT suitability of this software for any purpose. It is provided "as -COMMENT is" without express or implied warranty. -COMMENT - -STARTPROPERTIES 26 -FOUNDRY "Adobe" -FAMILY_NAME "Courier" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "M" -AVERAGE_WIDTH 70 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -CAP_HEIGHT 8 -X_HEIGHT 6 -FONT_ASCENT 10 -FONT_DESCENT 3 -FACE_NAME "Courier" -COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." -NOTICE "No mark" -_DEC_DEVICE_FONTNAMES "PS=Courier" -DEFAULT_CHAR 0 -RELATIVE_SETWIDTH 50 -RELATIVE_WEIGHT 50 -FULL_NAME "Courier" -ENDPROPERTIES -CHARS 192 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 7 0 0 -BITMAP -AA -00 -82 -00 -82 -00 -AA -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 9 3 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -00 -80 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 3 2 5 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -14 -14 -7E -28 -28 -FC -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -20 -70 -88 -80 -60 -30 -88 -88 -70 -20 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 1 0 -BITMAP -60 -90 -64 -18 -60 -98 -24 -18 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -38 -48 -40 -22 -74 -88 -8C -72 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 3 3 5 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 11 3 -2 -BITMAP -20 -40 -40 -80 -80 -80 -80 -80 -40 -40 -20 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 11 1 -2 -BITMAP -80 -40 -40 -20 -20 -20 -20 -20 -40 -40 -80 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 5 1 3 -BITMAP -20 -20 -F8 -20 -50 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -20 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 3 1 -1 -BITMAP -40 -40 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 1 1 3 -BITMAP -F8 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 1 2 0 -BITMAP -80 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -04 -08 -08 -10 -10 -20 -20 -40 -40 -80 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -E0 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -10 -20 -40 -88 -F8 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -08 -08 -30 -08 -08 -88 -70 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -08 -18 -28 -28 -48 -88 -FC -08 -1C -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -7C -40 -40 -40 -78 -04 -04 -84 -78 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -38 -40 -80 -80 -F0 -88 -88 -88 -70 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -F8 -88 -10 -10 -10 -10 -20 -20 -20 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -88 -78 -08 -10 -E0 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 5 3 0 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 6 2 -1 -BITMAP -40 -00 -00 -40 -40 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 7 1 0 -BITMAP -10 -20 -40 -80 -40 -20 -10 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 3 1 2 -BITMAP -F8 -00 -F8 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 7 2 0 -BITMAP -80 -40 -20 -10 -20 -40 -80 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -08 -10 -20 -20 -00 -20 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 1 0 -BITMAP -70 -88 -98 -A8 -A8 -9C -80 -70 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -F8 -44 -44 -78 -44 -44 -44 -F8 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -88 -80 -80 -88 -88 -70 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -F8 -44 -44 -44 -44 -44 -44 -F8 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -FC -44 -50 -70 -50 -40 -44 -FC -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -FC -44 -54 -70 -50 -40 -40 -F0 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -88 -80 -98 -88 -88 -70 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -44 -7C -44 -44 -44 -EE -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -F8 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -78 -10 -10 -10 -10 -90 -90 -60 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EC -48 -50 -60 -70 -48 -44 -E6 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -E0 -40 -40 -40 -40 -44 -44 -FC -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -C6 -6C -6C -54 -54 -54 -44 -EE -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -CE -64 -64 -54 -54 -4C -4C -E4 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -F8 -4C -44 -4C -78 -40 -40 -F0 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -88 -88 -88 -88 -88 -88 -70 -18 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -F8 -44 -44 -78 -48 -44 -44 -E6 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -78 -88 -80 -E0 -38 -08 -88 -F0 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -FE -92 -92 -10 -10 -10 -10 -7C -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -44 -44 -44 -44 -6C -38 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -44 -6C -28 -28 -38 -10 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -54 -54 -54 -6C -28 -28 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -28 -10 -28 -28 -44 -EE -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -28 -28 -10 -10 -10 -38 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -F8 -88 -90 -20 -20 -48 -88 -F8 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 11 3 -2 -BITMAP -C0 -80 -80 -80 -80 -80 -80 -80 -80 -80 -C0 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -80 -40 -40 -20 -20 -10 -10 -08 -08 -04 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 11 2 -2 -BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 3 1 5 -BITMAP -20 -50 -88 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 1 0 -3 -BITMAP -FE -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 2 1 7 -BITMAP -80 -40 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 6 1 0 -BITMAP -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -C0 -40 -40 -78 -44 -44 -44 -44 -B8 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -70 -88 -80 -80 -88 -70 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -18 -08 -08 -78 -88 -88 -88 -88 -74 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -70 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -38 -40 -40 -F8 -40 -40 -40 -40 -F0 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 -3 -BITMAP -74 -88 -88 -88 -88 -78 -08 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -C0 -40 -40 -58 -64 -44 -44 -44 -EE -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -00 -00 -E0 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 12 1 -3 -BITMAP -10 -00 -00 -F0 -10 -10 -10 -10 -10 -10 -10 -E0 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -C0 -40 -40 -4C -50 -60 -50 -48 -C6 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -E0 -20 -20 -20 -20 -20 -20 -20 -FC -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -E8 -54 -54 -54 -54 -D6 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -B8 -64 -44 -44 -44 -E6 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 0 -3 -BITMAP -B8 -44 -44 -44 -44 -78 -40 -40 -E0 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 -3 -BITMAP -74 -88 -88 -88 -88 -78 -08 -08 -1C -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -B8 -40 -40 -40 -40 -F0 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -70 -88 -70 -08 -88 -70 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 1 0 -BITMAP -40 -40 -F8 -40 -40 -40 -44 -38 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -CC -44 -44 -44 -44 -3A -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -EE -44 -44 -28 -38 -10 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -EE -44 -54 -54 -28 -28 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -EE -28 -10 -28 -44 -C6 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 -3 -BITMAP -EE -44 -44 -28 -38 -10 -10 -10 -60 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 6 1 0 -BITMAP -F8 -90 -20 -40 -88 -F8 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 10 2 -2 -BITMAP -20 -40 -40 -40 -80 -40 -40 -40 -40 -20 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 10 3 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 10 2 -2 -BITMAP -80 -40 -40 -40 -20 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 3 1 2 -BITMAP -48 -A8 -90 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 9 3 -3 -BITMAP -80 -00 -00 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -20 -20 -70 -A8 -A0 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 1 0 -BITMAP -30 -48 -40 -F8 -20 -20 -44 -F8 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 6 0 1 -BITMAP -84 -78 -48 -48 -78 -84 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -EE -44 -28 -7C -10 -7C -10 -38 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 10 3 -2 -BITMAP -80 -80 -80 -80 -00 -00 -80 -80 -80 -80 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -78 -48 -60 -90 -88 -48 -30 -90 -90 -F0 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 1 2 7 -BITMAP -A0 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -38 -44 -9A -A2 -A2 -9A -44 -38 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 6 1 2 -BITMAP -60 -10 -70 -50 -00 -F0 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 5 0 1 -BITMAP -24 -48 -90 -48 -24 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 3 1 2 -BITMAP -F8 -08 -08 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 1 1 3 -BITMAP -F8 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -38 -44 -BA -AA -B2 -AA -44 -38 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 1 1 7 -BITMAP -F8 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 4 1 4 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -20 -F8 -20 -00 -F8 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 5 1 3 -BITMAP -60 -90 -20 -40 -F0 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 5 1 3 -BITMAP -60 -90 -20 -90 -60 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 2 2 3 7 -BITMAP -40 -80 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 -3 -BITMAP -CC -44 -44 -44 -44 -7A -40 -40 -40 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 10 0 -1 -BITMAP -7C -A8 -A8 -A8 -68 -28 -28 -28 -28 -6C -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 1 1 3 3 -BITMAP -80 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 3 2 -3 -BITMAP -40 -20 -C0 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 3 5 2 3 -BITMAP -40 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 4 6 1 2 -BITMAP -60 -90 -90 -60 -00 -F0 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 5 1 1 -BITMAP -90 -48 -24 -48 -90 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 8 10 0 -1 -BITMAP -40 -C1 -42 -44 -E8 -12 -26 -4A -8F -02 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 8 10 0 -1 -BITMAP -40 -C1 -42 -44 -E8 -16 -29 -42 -84 -0F -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 8 10 0 -1 -BITMAP -60 -91 -22 -94 -68 -12 -26 -4A -8F -02 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 -2 -BITMAP -20 -00 -20 -20 -40 -80 -88 -70 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -20 -10 -00 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -08 -10 -00 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -10 -28 -00 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -28 -50 -00 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -28 -00 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -10 -28 -10 -70 -10 -28 -28 -7C -44 -44 -EE -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -7C -30 -50 -5C -50 -F0 -90 -9C -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 -3 -BITMAP -70 -88 -88 -80 -80 -88 -88 -70 -20 -10 -60 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -20 -10 -00 -FC -44 -48 -78 -48 -44 -44 -FC -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -08 -10 -00 -FC -44 -48 -78 -48 -44 -44 -FC -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -10 -28 -00 -FC -44 -48 -78 -48 -44 -44 -FC -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -28 -00 -FC -44 -48 -78 -48 -44 -44 -FC -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -40 -20 -00 -F8 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -10 -20 -00 -F8 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -20 -50 -00 -F8 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -50 -00 -F8 -20 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -F8 -44 -44 -E4 -44 -44 -44 -F8 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -14 -28 -00 -EE -64 -54 -54 -4C -4C -44 -E4 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -40 -20 -00 -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -10 -20 -00 -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -20 -50 -00 -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 11 1 0 -BITMAP -28 -50 -00 -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -50 -00 -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -88 -50 -20 -50 -88 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -08 -70 -98 -A8 -A8 -A8 -A8 -C8 -70 -80 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -20 -10 -00 -EE -44 -44 -44 -44 -44 -6C -38 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -08 -10 -00 -EE -44 -44 -44 -44 -44 -6C -38 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -10 -28 -00 -EE -44 -44 -44 -44 -44 -6C -38 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -28 -00 -EE -44 -44 -44 -44 -44 -6C -38 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -08 -10 -00 -EE -44 -28 -10 -10 -10 -10 -38 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -E0 -40 -78 -44 -44 -78 -40 -E0 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -30 -48 -48 -48 -50 -48 -44 -54 -D8 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -40 -20 -00 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -10 -20 -00 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -20 -50 -00 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -28 -50 -00 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 8 1 0 -BITMAP -50 -00 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -20 -50 -20 -F0 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 6 0 0 -BITMAP -6C -12 -7E -90 -92 -6C -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 -3 -BITMAP -70 -88 -80 -80 -88 -70 -20 -10 -60 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -40 -20 -00 -70 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -10 -20 -00 -70 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -50 -00 -70 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -50 -00 -70 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -40 -20 -00 -E0 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -10 -20 -00 -E0 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -50 -00 -E0 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -50 -00 -E0 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -C0 -38 -60 -90 -78 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -28 -50 -00 -B8 -64 -44 -44 -44 -E6 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -40 -20 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -40 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -20 -50 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -50 -A0 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -50 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -20 -00 -F8 -00 -20 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 5 8 1 -1 -BITMAP -08 -70 -98 -A8 -A8 -C8 -70 -80 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -20 -10 -00 -CC -44 -44 -44 -44 -3A -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -10 -20 -00 -CC -44 -44 -44 -44 -3A -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -10 -28 -00 -CC -44 -44 -44 -44 -3A -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 8 0 0 -BITMAP -28 -00 -CC -44 -44 -44 -44 -3A -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 12 0 -3 -BITMAP -08 -10 -00 -EE -44 -44 -28 -38 -10 -10 -10 -60 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 6 12 0 -3 -BITMAP -C0 -40 -40 -78 -44 -44 -44 -44 -78 -40 -40 -E0 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 600 0 -DWIDTH 7 0 -BBX 7 11 0 -3 -BITMAP -28 -00 -EE -44 -44 -28 -38 -10 -10 -10 -60 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/helvBO12-L1.bdf b/gui/themes/fonts/helvBO12-L1.bdf deleted file mode 100644 index 9073827992..0000000000 --- a/gui/themes/fonts/helvBO12-L1.bdf +++ /dev/null @@ -1,3058 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl helvBO12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -FONT -Adobe-Helvetica-Bold-O-Normal--12-120-75-75-P-69-ISO8859-1 -SIZE 12 75 75 -FONTBOUNDINGBOX 16 15 -2 -3 -COMMENT $Xorg: $ -COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 -COMMENT -COMMENT + -COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. -COMMENT Copyright 1988, 1994 Digital Equipment Corporation. -COMMENT -COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be -COMMENT registered in certain jurisdictions. -COMMENT Permission to use these trademarks is hereby granted only in -COMMENT association with the images described in this file. -COMMENT -COMMENT Permission to use, copy, modify, distribute and sell this software -COMMENT and its documentation for any purpose and without fee is hereby -COMMENT granted, provided that the above copyright notices appear in all -COMMENT copies and that both those copyright notices and this permission -COMMENT notice appear in supporting documentation, and that the names of -COMMENT Adobe Systems and Digital Equipment Corporation not be used in -COMMENT advertising or publicity pertaining to distribution of the software -COMMENT without specific, written prior permission. Adobe Systems and -COMMENT Digital Equipment Corporation make no representations about the -COMMENT suitability of this software for any purpose. It is provided "as -COMMENT is" without express or implied warranty. -COMMENT - -STARTPROPERTIES 26 -FOUNDRY "Adobe" -FAMILY_NAME "Helvetica" -WEIGHT_NAME "Bold" -SLANT "O" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "P" -AVERAGE_WIDTH 69 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -CAP_HEIGHT 9 -X_HEIGHT 7 -FONT_ASCENT 11 -FONT_DESCENT 3 -FACE_NAME "Helvetica Bold Oblique" -COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." -NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " -_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" -DEFAULT_CHAR 0 -RELATIVE_SETWIDTH 50 -RELATIVE_WEIGHT 70 -FULL_NAME "Helvetica Bold Oblique" -ENDPROPERTIES -CHARS 192 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 722 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -AA80 -0000 -8080 -0000 -8080 -0000 -8080 -0000 -AA80 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 5 9 1 0 -BITMAP -18 -18 -30 -30 -60 -40 -00 -C0 -C0 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 474 0 -DWIDTH 6 0 -BBX 7 3 2 6 -BITMAP -36 -6C -D8 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 8 1 0 -BITMAP -14 -14 -7E -28 -28 -FC -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 10 1 -1 -BITMAP -08 -3C -6E -70 -38 -1C -2C -EC -78 -40 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 889 0 -DWIDTH 13 0 -BBX 11 9 2 0 -BITMAP -70C0 -D980 -DB00 -7600 -0600 -0DC0 -1B60 -3360 -61C0 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 8 9 1 0 -BITMAP -1C -36 -36 -1C -39 -6F -C6 -CE -7B -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 238 0 -DWIDTH 4 0 -BBX 4 3 2 6 -BITMAP -30 -60 -C0 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 6 12 0 -3 -BITMAP -0C -18 -30 -30 -60 -60 -C0 -C0 -C0 -60 -60 -30 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 6 12 0 -3 -BITMAP -30 -18 -18 -0C -0C -0C -18 -18 -30 -30 -60 -C0 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 389 0 -DWIDTH 6 0 -BBX 4 4 3 5 -BITMAP -50 -60 -F0 -40 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 7 5 1 1 -BITMAP -18 -18 -FE -30 -30 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 4 0 -2 -BITMAP -C0 -C0 -40 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 1 3 -BITMAP -F0 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 2 0 0 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 7 9 0 0 -BITMAP -02 -06 -0C -18 -10 -30 -60 -C0 -80 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -3C -66 -66 -46 -C6 -C4 -CC -CC -78 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 2 0 -BITMAP -18 -F8 -30 -60 -60 -60 -C0 -C0 -C0 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -3C -66 -06 -0C -18 -30 -60 -C0 -F8 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -3C -66 -06 -06 -3C -0C -0C -CC -78 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -06 -0E -16 -26 -4C -CC -FE -18 -18 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -1E -30 -60 -78 -0C -0C -0C -D8 -70 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -1C -36 -60 -78 -EC -CC -C4 -CC -78 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -7E -06 -0C -0C -18 -30 -30 -60 -C0 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -3C -66 -66 -2C -78 -CC -CC -DC -78 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -3C -66 -46 -66 -6E -3C -0C -D8 -70 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 7 1 0 -BITMAP -30 -30 -00 -00 -00 -C0 -C0 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 9 1 -2 -BITMAP -30 -30 -00 -00 -00 -C0 -C0 -40 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 2 1 -BITMAP -1C -70 -C0 -60 -30 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 3 1 2 -BITMAP -7C -00 -F8 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 1 1 -BITMAP -30 -18 -0C -38 -E0 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 6 9 3 0 -BITMAP -78 -CC -9C -38 -60 -40 -00 -C0 -C0 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 975 0 -DWIDTH 11 0 -BBX 11 10 1 -1 -BITMAP -0F80 -3040 -6020 -46A0 -8920 -9120 -9240 -4D80 -6000 -1E00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 9 0 0 -BITMAP -06 -0E -0B -1B -33 -3F -63 -C3 -C3 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -1F00 -1980 -3180 -3300 -7E00 -6300 -6300 -C600 -FC00 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 9 1 0 -BITMAP -1E -33 -63 -60 -C0 -C0 -C6 -CC -78 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -1F00 -1980 -3180 -3180 -6180 -6300 -6300 -C600 -FC00 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 9 1 0 -BITMAP -1F80 -1800 -3000 -3000 -7E00 -6000 -6000 -C000 -FC00 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 9 1 0 -BITMAP -1F80 -1800 -3000 -3000 -7E00 -6000 -6000 -C000 -C000 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -0F00 -3980 -3180 -6000 -6700 -C300 -C600 -CE00 -7A00 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 722 0 -DWIDTH 10 0 -BBX 10 9 1 0 -BITMAP -18C0 -18C0 -3180 -3180 -7F00 -6300 -6300 -C600 -C600 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 5 9 1 0 -BITMAP -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 9 9 0 0 -BITMAP -0180 -0180 -0300 -0300 -0600 -0600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 10 9 1 0 -BITMAP -18C0 -1980 -3300 -3600 -3C00 -6600 -6600 -C300 -C300 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -18 -18 -30 -30 -60 -60 -60 -C0 -FC -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 833 0 -DWIDTH 12 0 -BBX 12 9 1 0 -BITMAP -1830 -1870 -38E0 -38E0 -6940 -6AC0 -6EC0 -CD80 -C980 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 722 0 -DWIDTH 10 0 -BBX 10 9 1 0 -BITMAP -18C0 -18C0 -3980 -2980 -6980 -6500 -6700 -C600 -C600 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -0F00 -3980 -3180 -6180 -6300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 9 1 0 -BITMAP -1F00 -1980 -3180 -3300 -7E00 -6000 -6000 -C000 -C000 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -0F00 -3980 -3180 -6180 -6300 -C300 -DE00 -CE00 -7B00 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -1F00 -1980 -3180 -3300 -7E00 -6300 -6300 -C600 -C600 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 9 1 0 -BITMAP -1E -33 -63 -70 -3C -0E -C6 -CC -78 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 2 0 -BITMAP -FF -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 9 1 0 -BITMAP -3180 -3180 -6300 -6300 -6300 -C600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 8 9 3 0 -BITMAP -C3 -C3 -C6 -C6 -CC -CC -58 -70 -60 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 944 0 -DWIDTH 10 0 -BBX 10 9 2 0 -BITMAP -CCC0 -CCC0 -CD80 -DD80 -DD00 -ED00 -EE00 -4400 -4400 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 10 9 1 0 -BITMAP -30C0 -3180 -1B00 -1E00 -0C00 -1E00 -3600 -6300 -C300 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 667 0 -DWIDTH 7 0 -BBX 7 9 2 0 -BITMAP -C6 -C6 -6C -6C -38 -30 -30 -60 -60 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 9 0 0 -BITMAP -3F80 -0300 -0600 -0C00 -1800 -3000 -6000 -C000 -FE00 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 8 12 -1 -3 -BITMAP -0F -0C -18 -18 -30 -30 -30 -60 -60 -60 -C0 -F0 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 3 9 2 0 -BITMAP -C0 -C0 -C0 -40 -40 -40 -60 -60 -60 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 8 12 -2 -3 -BITMAP -0F -03 -06 -06 -0C -0C -0C -18 -18 -18 -30 -F0 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 584 0 -DWIDTH 6 0 -BBX 6 6 1 3 -BITMAP -18 -38 -6C -6C -CC -CC -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 1 -1 -3 -BITMAP -FE -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 2 3 7 -BITMAP -C0 -60 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 7 0 0 -BITMAP -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -18 -18 -36 -3B -63 -66 -C6 -CC -F8 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -1E -33 -60 -60 -C6 -CC -78 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 9 0 0 -BITMAP -0180 -0180 -1B00 -3700 -6300 -6600 -C600 -CC00 -7C00 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -1E -33 -63 -7E -C0 -CC -78 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 7 9 1 0 -BITMAP -0E -18 -7C -30 -30 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 10 -1 -3 -BITMAP -0E80 -1B80 -3180 -3300 -6300 -6600 -3E00 -0600 -CC00 -7800 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -18 -18 -36 -3B -63 -66 -66 -CC -CC -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 5 9 0 0 -BITMAP -18 -00 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 7 12 -2 -3 -BITMAP -06 -00 -0C -0C -18 -18 -18 -30 -30 -30 -60 -C0 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -18 -18 -33 -36 -7C -78 -6C -CC -C6 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 5 9 0 0 -BITMAP -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 889 0 -DWIDTH 11 0 -BBX 12 7 0 0 -BITMAP -2EE0 -3330 -3330 -6660 -6660 -CCC0 -CCC0 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -36 -3B -63 -66 -66 -CC -CC -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 10 -1 -3 -BITMAP -1B00 -1D80 -3180 -3300 -6300 -6600 -7C00 -6000 -C000 -C000 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 -3 -BITMAP -1D -37 -63 -66 -C6 -CC -7C -0C -18 -18 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 7 7 0 0 -BITMAP -36 -3C -70 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -1E -33 -38 -1C -0C -CC -78 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 6 9 1 0 -BITMAP -18 -18 -7C -30 -60 -60 -60 -C0 -E0 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -33 -33 -63 -66 -C6 -CC -74 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 2 0 -BITMAP -CC -CC -D8 -D8 -F0 -60 -40 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 10 7 1 0 -BITMAP -CCC0 -CCC0 -DD80 -DD80 -5500 -7700 -6600 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 7 0 0 -BITMAP -33 -36 -1C -18 -38 -6C -CC -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 -3 -BITMAP -CC -CC -CC -D8 -50 -70 -60 -60 -C0 -80 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 7 7 0 0 -BITMAP -3E -06 -0C -38 -60 -C0 -F8 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 7 12 1 -3 -BITMAP -0E -18 -30 -30 -60 -C0 -60 -60 -60 -C0 -C0 -70 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 280 0 -DWIDTH 4 0 -BBX 5 12 0 -3 -BITMAP -18 -18 -18 -10 -30 -30 -20 -60 -60 -40 -C0 -C0 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 7 12 -1 -3 -BITMAP -1C -06 -06 -0C -0C -06 -0C -18 -18 -18 -30 -E0 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 2 1 3 -BITMAP -74 -B8 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 5 10 -1 -3 -BITMAP -18 -18 -00 -10 -30 -30 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 -1 -BITMAP -04 -3C -6E -D0 -D0 -E6 -EC -78 -40 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -0E -19 -10 -7C -30 -30 -60 -E6 -DC -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 6 0 1 -BITMAP -33 -1E -34 -2C -78 -CC -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 9 1 0 -BITMAP -66 -66 -6C -38 -FC -30 -F8 -60 -60 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 280 0 -DWIDTH 4 0 -BBX 6 11 0 -2 -BITMAP -0C -0C -18 -18 -00 -00 -60 -60 -40 -C0 -C0 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 12 0 -3 -BITMAP -0E -1B -19 -38 -6C -66 -66 -36 -1C -98 -D8 -70 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 5 1 3 8 -BITMAP -D8 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 10 9 1 0 -BITMAP -1F00 -2080 -4E40 -5140 -A040 -A280 -9C80 -4100 -3E00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 370 0 -DWIDTH 6 0 -BBX 5 6 2 3 -BITMAP -38 -08 -78 -50 -00 -F0 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 556 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -1980 -7700 -CC00 -6600 -3300 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 6 4 2 1 -BITMAP -FC -04 -08 -08 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 1 3 -BITMAP -F0 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 10 9 1 0 -BITMAP -1F00 -2080 -4E40 -4A40 -9C40 -9480 -9280 -4100 -3E00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 1 3 8 -BITMAP -F0 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 400 0 -DWIDTH 5 0 -BBX 4 4 2 4 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 8 7 0 0 -BITMAP -0C -0C -7F -18 -18 -00 -FE -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 5 1 4 -BITMAP -60 -B0 -20 -40 -F0 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 5 1 4 -BITMAP -70 -30 -60 -30 -E0 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 2 3 7 -BITMAP -60 -C0 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 10 10 -2 -3 -BITMAP -0CC0 -0CC0 -18C0 -1980 -3180 -3300 -6D00 -6000 -C000 -C000 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 12 2 -3 -BITMAP -3E -74 -F4 -F4 -E8 -E8 -68 -50 -50 -A0 -A0 -A0 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 2 2 3 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 4 0 -3 -BITMAP -60 -30 -90 -E0 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 5 1 4 -BITMAP -20 -E0 -20 -40 -40 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 365 0 -DWIDTH 6 0 -BBX 5 6 2 3 -BITMAP -38 -68 -58 -70 -00 -F0 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 556 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -6600 -3300 -1980 -7700 -CC00 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 9 9 2 0 -BITMAP -2000 -E300 -2600 -4C00 -5900 -1300 -3500 -6F80 -C200 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -2000 -E300 -2600 -4C00 -5B00 -1580 -3100 -6200 -C780 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 10 9 1 0 -BITMAP -7000 -3180 -6300 -3600 -EC80 -0980 -1A80 -37C0 -6100 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 6 9 0 -2 -BITMAP -0C -0C -00 -08 -18 -70 -E4 -CC -78 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -0C -06 -00 -06 -06 -0F -1B -33 -3F -63 -C3 -C3 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 0 0 -BITMAP -03 -06 -00 -06 -06 -0F -1B -33 -3F -63 -C3 -C3 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 0 0 -BITMAP -0700 -0D80 -0000 -0600 -0600 -0F00 -1B00 -3300 -3F00 -6300 -C300 -C300 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 0 0 -BITMAP -0680 -0B00 -0000 -0600 -0600 -0F00 -1B00 -3300 -3F00 -6300 -C300 -C300 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 11 0 0 -BITMAP -0D80 -0000 -0600 -0600 -0F00 -1B00 -3300 -3F00 -6300 -C300 -C300 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 0 0 -BITMAP -0300 -0480 -0300 -0300 -0700 -0F00 -1B00 -3300 -3F00 -6300 -C300 -C300 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 1000 0 -DWIDTH 11 0 -BBX 14 9 0 0 -BITMAP -07FC -0DC0 -0980 -1980 -33F0 -3F00 -6300 -C600 -C7E0 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 8 12 1 -3 -BITMAP -1E -33 -63 -60 -C0 -C0 -C6 -CC -78 -30 -90 -E0 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0C00 -0600 -0000 -1F80 -1800 -3000 -3000 -7E00 -6000 -6000 -C000 -FC00 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0300 -0600 -0000 -1F80 -1800 -3000 -3000 -7E00 -6000 -6000 -C000 -FC00 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0700 -0D80 -0000 -1F80 -1000 -3000 -3000 -7E00 -6000 -6000 -C000 -FC00 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 9 11 1 0 -BITMAP -0D80 -0000 -1F80 -1800 -3000 -3000 -7E00 -6000 -6000 -C000 -FC00 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 5 12 1 0 -BITMAP -30 -18 -00 -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 7 12 1 0 -BITMAP -06 -0C -00 -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 7 12 1 0 -BITMAP -1C -36 -00 -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 278 0 -DWIDTH 5 0 -BBX 7 11 1 0 -BITMAP -36 -00 -18 -18 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 9 1 0 -BITMAP -1F00 -1980 -3180 -3180 -F980 -6300 -6300 -C600 -FC00 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 722 0 -DWIDTH 10 0 -BBX 10 12 1 0 -BITMAP -0340 -0580 -0000 -18C0 -18C0 -38C0 -3980 -6980 -6500 -6700 -C600 -C600 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 12 1 0 -BITMAP -0600 -0300 -0000 -0F00 -3980 -3180 -6180 -C300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 12 1 0 -BITMAP -0180 -0300 -0000 -0F00 -3980 -3180 -6180 -C300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 12 1 0 -BITMAP -0700 -0D80 -0000 -0F00 -3980 -3180 -6180 -C300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 12 1 0 -BITMAP -0680 -0B00 -0000 -0F00 -3980 -3180 -6180 -C300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 9 11 1 0 -BITMAP -0D80 -0000 -0F00 -3980 -3180 -6180 -C300 -C300 -C600 -CE00 -7800 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 7 5 1 1 -BITMAP -66 -3C -38 -78 -CC -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 11 9 0 0 -BITMAP -07A0 -1CC0 -19C0 -32C0 -3580 -6980 -7300 -6700 -BC00 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0C00 -0600 -0000 -3180 -3180 -3180 -6300 -6300 -C600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0300 -0600 -0000 -3180 -3180 -3180 -6300 -6300 -C600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 12 1 0 -BITMAP -0700 -0D80 -0000 -3180 -3180 -3180 -6300 -6300 -C600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 9 11 1 0 -BITMAP -1B00 -0000 -3180 -3180 -3180 -6300 -6300 -C600 -C600 -CC00 -7800 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 667 0 -DWIDTH 7 0 -BBX 7 12 2 0 -BITMAP -0C -18 -00 -C6 -C6 -C6 -6C -6C -38 -30 -60 -60 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 8 9 1 0 -BITMAP -18 -18 -3E -33 -23 -66 -7C -C0 -C0 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -0E -1B -33 -36 -6C -66 -66 -CC -D8 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 10 0 0 -BITMAP -30 -18 -00 -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 10 0 0 -BITMAP -06 -0C -00 -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 10 0 0 -BITMAP -1C -36 -00 -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 10 0 0 -BITMAP -1A -2C -00 -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 9 0 0 -BITMAP -36 -00 -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 7 10 0 0 -BITMAP -0C -12 -0C -3C -66 -06 -7C -CC -98 -EC -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 889 0 -DWIDTH 10 0 -BBX 11 7 0 0 -BITMAP -3BC0 -6660 -0460 -7FC0 -CC00 -9980 -EF00 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 10 0 -3 -BITMAP -1E -33 -60 -60 -C6 -CC -78 -30 -90 -E0 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -18 -0C -00 -1E -33 -63 -7E -C0 -CC -78 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -06 -0C -00 -1E -33 -63 -7E -C0 -CC -78 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -0E -1B -00 -1E -33 -63 -7E -C0 -CC -78 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -1B -00 -1E -33 -63 -7E -C0 -CC -78 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 4 10 0 0 -BITMAP -60 -30 -00 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 5 10 0 0 -BITMAP -18 -30 -00 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 6 10 0 0 -BITMAP -38 -6C -00 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 6 9 0 0 -BITMAP -6C -00 -30 -30 -60 -60 -60 -C0 -C0 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -32 -1C -26 -1F -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -0D -16 -00 -36 -3B -63 -66 -66 -CC -CC -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -18 -0C -00 -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -06 -0C -00 -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -0E -1B -00 -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -0D -16 -00 -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -1B -00 -1E -33 -63 -66 -C6 -CC -78 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 7 5 1 1 -BITMAP -18 -00 -FE -00 -30 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 8 -1 0 -BITMAP -0080 -0F00 -1B80 -3580 -3B00 -7300 -6600 -BC00 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -18 -0C -00 -33 -33 -63 -66 -C6 -CC -74 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -06 -0C -00 -33 -33 -63 -66 -C6 -CC -74 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 10 0 0 -BITMAP -0E -1B -00 -33 -33 -63 -66 -C6 -CC -74 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 8 9 0 0 -BITMAP -1B -00 -33 -33 -63 -66 -C6 -CC -74 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 13 1 -3 -BITMAP -18 -30 -00 -CC -CC -D8 -D8 -50 -70 -60 -60 -C0 -80 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 9 12 -1 -3 -BITMAP -0C00 -0C00 -1B00 -1D80 -1180 -3300 -3300 -6600 -7C00 -6000 -C000 -C000 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 12 1 -3 -BITMAP -6C -00 -CC -CC -D8 -D8 -50 -70 -60 -60 -C0 -80 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/helvBO12-iso-8859-1.bdf b/gui/themes/fonts/helvBO12-iso-8859-1.bdf new file mode 100644 index 0000000000..9073827992 --- /dev/null +++ b/gui/themes/fonts/helvBO12-iso-8859-1.bdf @@ -0,0 +1,3058 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvBO12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Bold-O-Normal--12-120-75-75-P-69-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 16 15 -2 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 69 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +AA80 +0000 +8080 +0000 +8080 +0000 +8080 +0000 +AA80 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 6 0 +BBX 7 3 2 6 +BITMAP +36 +6C +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -1 +BITMAP +08 +3C +6E +70 +38 +1C +2C +EC +78 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 9 2 0 +BITMAP +70C0 +D980 +DB00 +7600 +0600 +0DC0 +1B60 +3360 +61C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +1C +36 +36 +1C +39 +6F +C6 +CE +7B +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 238 0 +DWIDTH 4 0 +BBX 4 3 2 6 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +0C +18 +30 +30 +60 +60 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +30 +18 +18 +0C +0C +0C +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 4 4 3 5 +BITMAP +50 +60 +F0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +18 +FE +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 2 0 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 9 0 0 +BITMAP +02 +06 +0C +18 +10 +30 +60 +C0 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +46 +C6 +C4 +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 2 0 +BITMAP +18 +F8 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +0C +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +06 +3C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +06 +0E +16 +26 +4C +CC +FE +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +30 +60 +78 +0C +0C +0C +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +36 +60 +78 +EC +CC +C4 +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +7E +06 +0C +0C +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +2C +78 +CC +CC +DC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +46 +66 +6E +3C +0C +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 1 -2 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 2 1 +BITMAP +1C +70 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 1 2 +BITMAP +7C +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +30 +18 +0C +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +78 +CC +9C +38 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 11 10 1 -1 +BITMAP +0F80 +3040 +6020 +46A0 +8920 +9120 +9240 +4D80 +6000 +1E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +0300 +0300 +0600 +0600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 9 1 0 +BITMAP +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +DE00 +CE00 +7B00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 2 0 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 9 3 0 +BITMAP +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 2 0 +BITMAP +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 9 2 0 +BITMAP +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -1 -3 +BITMAP +0F +0C +18 +18 +30 +30 +30 +60 +60 +60 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 9 2 0 +BITMAP +C0 +C0 +C0 +40 +40 +40 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -2 -3 +BITMAP +0F +03 +06 +06 +0C +0C +0C +18 +18 +18 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 6 1 3 +BITMAP +18 +38 +6C +6C +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 -1 -3 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 9 1 0 +BITMAP +0E +18 +7C +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 12 -2 -3 +BITMAP +06 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 7 0 0 +BITMAP +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1D +37 +63 +66 +C6 +CC +7C +0C +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 7 0 0 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 2 0 +BITMAP +CC +CC +D8 +D8 +F0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 7 1 0 +BITMAP +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 -3 +BITMAP +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 1 -3 +BITMAP +0E +18 +30 +30 +60 +C0 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +18 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 -1 -3 +BITMAP +1C +06 +06 +0C +0C +06 +0C +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 1 3 +BITMAP +74 +B8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 10 -1 -3 +BITMAP +18 +18 +00 +10 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +04 +3C +6E +D0 +D0 +E6 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +19 +10 +7C +30 +30 +60 +E6 +DC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 6 0 1 +BITMAP +33 +1E +34 +2C +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +66 +66 +6C +38 +FC +30 +F8 +60 +60 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +18 +18 +00 +00 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +0E +1B +19 +38 +6C +66 +66 +36 +1C +98 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +5140 +A040 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +08 +78 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +1980 +7700 +CC00 +6600 +3300 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 2 1 +BITMAP +FC +04 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +4A40 +9C40 +9480 +9280 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 2 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 8 7 0 0 +BITMAP +0C +0C +7F +18 +18 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +60 +B0 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +70 +30 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 10 10 -2 -3 +BITMAP +0CC0 +0CC0 +18C0 +1980 +3180 +3300 +6D00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 2 -3 +BITMAP +3E +74 +F4 +F4 +E8 +E8 +68 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +90 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 1 4 +BITMAP +20 +E0 +20 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +68 +58 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +6600 +3300 +1980 +7700 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 2 0 +BITMAP +2000 +E300 +2600 +4C00 +5900 +1300 +3500 +6F80 +C200 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2000 +E300 +2600 +4C00 +5B00 +1580 +3100 +6200 +C780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +7000 +3180 +6300 +3600 +EC80 +0980 +1A80 +37C0 +6100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +0C +0C +00 +08 +18 +70 +E4 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +03 +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0680 +0B00 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 9 0 0 +BITMAP +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 12 1 0 +BITMAP +30 +18 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +06 +0C +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +1C +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0340 +0580 +0000 +18C0 +18C0 +38C0 +3980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0180 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +66 +3C +38 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 9 0 0 +BITMAP +07A0 +1CC0 +19C0 +32C0 +3580 +6980 +7300 +6700 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +6C +6C +38 +30 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +18 +18 +3E +33 +23 +66 +7C +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +1B +33 +36 +6C +66 +66 +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +06 +0C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1A +2C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +0C +12 +0C +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 7 0 0 +BITMAP +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +60 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +18 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 9 0 0 +BITMAP +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +32 +1C +26 +1F +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +00 +FE +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 8 -1 0 +BITMAP +0080 +0F00 +1B80 +3580 +3B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +18 +30 +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0C00 +1B00 +1D80 +1180 +3300 +3300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +6C +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +ENDFONT diff --git a/gui/themes/fonts/helvR12-L1.bdf b/gui/themes/fonts/helvR12-L1.bdf deleted file mode 100644 index 1f27c247db..0000000000 --- a/gui/themes/fonts/helvR12-L1.bdf +++ /dev/null @@ -1,3048 +0,0 @@ -STARTFONT 2.1 -COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! -COMMENT Generated with 'ucs2any.pl helvR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' -COMMENT from an ISO10646-1 encoded source BDF font. -COMMENT ucs2any.pl by Markus Kuhn , 2000. -FONT -Adobe-Helvetica-Medium-R-Normal--12-120-75-75-P-67-ISO8859-1 -SIZE 12 75 75 -FONTBOUNDINGBOX 11 15 0 -3 -COMMENT $Xorg: $ -COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 -COMMENT -COMMENT + -COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. -COMMENT Copyright 1988, 1994 Digital Equipment Corporation. -COMMENT -COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be -COMMENT registered in certain jurisdictions. -COMMENT Permission to use these trademarks is hereby granted only in -COMMENT association with the images described in this file. -COMMENT -COMMENT Permission to use, copy, modify, distribute and sell this software -COMMENT and its documentation for any purpose and without fee is hereby -COMMENT granted, provided that the above copyright notices appear in all -COMMENT copies and that both those copyright notices and this permission -COMMENT notice appear in supporting documentation, and that the names of -COMMENT Adobe Systems and Digital Equipment Corporation not be used in -COMMENT advertising or publicity pertaining to distribution of the software -COMMENT without specific, written prior permission. Adobe Systems and -COMMENT Digital Equipment Corporation make no representations about the -COMMENT suitability of this software for any purpose. It is provided "as -COMMENT is" without express or implied warranty. -COMMENT - -STARTPROPERTIES 26 -FOUNDRY "Adobe" -FAMILY_NAME "Helvetica" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 12 -POINT_SIZE 120 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "P" -AVERAGE_WIDTH 67 -CHARSET_REGISTRY "ISO8859" -CHARSET_ENCODING "1" -CAP_HEIGHT 9 -X_HEIGHT 7 -FONT_ASCENT 11 -FONT_DESCENT 3 -FACE_NAME "Helvetica" -COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." -NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " -_DEC_DEVICE_FONTNAMES "PS=Helvetica" -DEFAULT_CHAR 0 -RELATIVE_SETWIDTH 50 -RELATIVE_WEIGHT 50 -FULL_NAME "Helvetica" -ENDPROPERTIES -CHARS 192 -STARTCHAR defaultchar -ENCODING 0 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -AA -00 -82 -00 -82 -00 -82 -00 -AA -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 1 9 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -00 -80 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 355 0 -DWIDTH 5 0 -BBX 3 3 1 6 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -28 -28 -FC -28 -FC -50 -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -20 -70 -A8 -A0 -70 -28 -A8 -A8 -70 -20 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 889 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -6200 -9400 -9400 -6800 -0800 -1300 -1480 -1480 -2300 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -30 -48 -48 -30 -50 -8A -84 -8C -72 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 191 0 -DWIDTH 3 0 -BBX 1 3 1 6 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 12 1 -3 -BITMAP -20 -40 -40 -80 -80 -80 -80 -80 -80 -40 -40 -20 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 12 0 -3 -BITMAP -80 -40 -40 -20 -20 -20 -20 -20 -20 -40 -40 -80 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 389 0 -DWIDTH 5 0 -BBX 3 3 1 6 -BITMAP -A0 -40 -A0 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -20 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 2 3 1 -2 -BITMAP -40 -40 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 0 3 -BITMAP -F0 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 1 1 1 0 -BITMAP -80 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 4 9 0 0 -BITMAP -10 -10 -20 -20 -40 -40 -40 -80 -80 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 3 9 1 0 -BITMAP -20 -E0 -20 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -08 -10 -20 -40 -80 -80 -F8 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -08 -30 -08 -08 -88 -88 -70 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -08 -18 -28 -28 -48 -88 -FC -08 -08 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -F8 -80 -80 -F0 -08 -08 -88 -88 -70 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -80 -B0 -C8 -88 -88 -88 -70 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -F8 -08 -10 -10 -20 -20 -20 -40 -40 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -78 -08 -08 -88 -70 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 1 6 1 0 -BITMAP -80 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 8 0 -2 -BITMAP -40 -00 -00 -00 -00 -40 -40 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 0 1 -BITMAP -0C -30 -C0 -30 -0C -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 3 1 2 -BITMAP -F8 -00 -F8 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 5 1 1 -BITMAP -C0 -30 -0C -30 -C0 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -10 -10 -20 -20 -00 -20 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 1015 0 -DWIDTH 12 0 -BBX 10 10 1 -1 -BITMAP -1F00 -6080 -4D40 -9240 -A240 -A240 -A680 -9B00 -4000 -3E00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -10 -28 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -F8 -84 -84 -84 -F8 -84 -84 -84 -F8 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -3C -42 -80 -80 -80 -80 -80 -42 -3C -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -F8 -84 -82 -82 -82 -82 -82 -84 -F8 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -FC -80 -80 -80 -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 611 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -FC -80 -80 -80 -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 778 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -3C -42 -80 -80 -8E -82 -82 -46 -3A -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -82 -82 -82 -82 -FE -82 -82 -82 -82 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 1 9 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -08 -08 -08 -08 -08 -08 -88 -88 -70 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 7 9 1 0 -BITMAP -84 -88 -90 -A0 -E0 -90 -88 -84 -82 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 833 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -8080 -C180 -C180 -A280 -A280 -9480 -9480 -8880 -8880 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -82 -C2 -A2 -A2 -92 -8A -8A -86 -82 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -F8 -84 -84 -84 -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -3C -42 -81 -81 -81 -89 -85 -42 -3D -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -F8 -84 -84 -84 -F8 -88 -84 -84 -84 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -78 -84 -80 -60 -18 -04 -84 -84 -78 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -FE -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -84 -84 -84 -84 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -82 -82 -44 -44 -44 -28 -28 -10 -10 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 944 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -8880 -8880 -8880 -4900 -5500 -5500 -2200 -2200 -2200 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -82 -44 -44 -28 -10 -28 -44 -44 -82 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -82 -82 -44 -44 -28 -10 -10 -10 -10 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 611 0 -DWIDTH 9 0 -BBX 7 9 1 0 -BITMAP -FE -02 -04 -08 -10 -20 -40 -80 -FE -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 12 1 -3 -BITMAP -C0 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -C0 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 4 9 0 0 -BITMAP -80 -80 -40 -40 -20 -20 -20 -10 -10 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 12 0 -3 -BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 469 0 -DWIDTH 6 0 -BBX 5 3 0 5 -BITMAP -20 -50 -88 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 7 1 0 -2 -BITMAP -FE -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 333 0 -DWIDTH 2 0 -BBX 2 2 0 8 -BITMAP -80 -40 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -80 -80 -B0 -C8 -88 -88 -88 -C8 -B0 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -70 -88 -80 -80 -80 -88 -70 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -08 -08 -68 -98 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -70 -88 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 4 9 0 0 -BITMAP -30 -40 -E0 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -68 -98 -88 -88 -88 -98 -68 -08 -88 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -80 -80 -B0 -C8 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 222 0 -DWIDTH 3 0 -BBX 1 9 1 0 -BITMAP -80 -00 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 222 0 -DWIDTH 3 0 -BBX 2 12 0 -3 -BITMAP -40 -00 -40 -40 -40 -40 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 5 9 1 0 -BITMAP -80 -80 -90 -A0 -C0 -C0 -A0 -90 -88 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 222 0 -DWIDTH 3 0 -BBX 1 9 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 833 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -A4 -DA -92 -92 -92 -92 -92 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -B0 -C8 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -B0 -C8 -88 -88 -88 -C8 -B0 -80 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -68 -98 -88 -88 -88 -98 -68 -08 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 7 1 0 -BITMAP -A0 -C0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -90 -80 -60 -10 -90 -60 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 9 0 0 -BITMAP -40 -40 -E0 -40 -40 -40 -40 -40 -60 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -88 -88 -50 -50 -20 -20 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 9 7 0 0 -BITMAP -8880 -8880 -4900 -4900 -5500 -2200 -2200 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -84 -48 -30 -30 -48 -84 -84 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -88 -88 -88 -90 -50 -50 -20 -20 -40 -80 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -10 -20 -40 -40 -80 -F0 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 334 0 -DWIDTH 4 0 -BBX 4 12 0 -3 -BITMAP -30 -40 -40 -40 -40 -80 -40 -40 -40 -40 -40 -30 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 260 0 -DWIDTH 3 0 -BBX 1 12 1 -3 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 334 0 -DWIDTH 4 0 -BBX 4 12 0 -3 -BITMAP -C0 -20 -20 -20 -20 -10 -20 -20 -20 -20 -20 -C0 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 6 2 0 3 -BITMAP -64 -98 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 278 0 -DWIDTH 4 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 333 0 -DWIDTH 3 0 -BBX 1 10 1 -3 -BITMAP -80 -00 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -10 -70 -A8 -A0 -A0 -A0 -C8 -70 -40 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -30 -48 -40 -40 -F0 -20 -20 -48 -B0 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 6 0 1 -BITMAP -84 -78 -48 -48 -78 -84 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -88 -88 -50 -20 -F8 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 260 0 -DWIDTH 3 0 -BBX 1 11 1 -2 -BITMAP -80 -80 -80 -80 -00 -00 -00 -80 -80 -80 -80 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 556 0 -DWIDTH 6 0 -BBX 5 12 0 -3 -BITMAP -70 -88 -80 -60 -90 -88 -88 -48 -30 -08 -88 -70 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 333 0 -DWIDTH 3 0 -BBX 3 1 0 8 -BITMAP -A0 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -3E00 -4100 -9C80 -A280 -A080 -A280 -9C80 -4100 -3E00 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 370 0 -DWIDTH 5 0 -BBX 3 5 1 4 -BITMAP -E0 -20 -A0 -00 -E0 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -28 -50 -A0 -50 -28 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 584 0 -DWIDTH 8 0 -BBX 6 4 1 2 -BITMAP -FC -04 -04 -04 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 333 0 -DWIDTH 5 0 -BBX 4 1 0 3 -BITMAP -F0 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 737 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -3E00 -4100 -9C80 -9480 -9880 -9480 -9480 -4100 -3E00 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 1 0 8 -BITMAP -F0 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 400 0 -DWIDTH 5 0 -BBX 4 4 0 4 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -20 -20 -F8 -20 -20 -00 -F8 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 4 5 0 3 -BITMAP -60 -90 -20 -40 -F0 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 3 5 0 3 -BITMAP -E0 -20 -40 -20 -C0 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 333 0 -DWIDTH 2 0 -BBX 2 2 0 8 -BITMAP -40 -80 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -88 -88 -88 -88 -88 -98 -E8 -80 -80 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 537 0 -DWIDTH 7 0 -BBX 6 12 0 -3 -BITMAP -3C -68 -E8 -E8 -E8 -68 -28 -28 -28 -28 -28 -28 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 333 0 -DWIDTH 3 0 -BBX 3 4 0 -3 -BITMAP -40 -20 -20 -C0 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 333 0 -DWIDTH 4 0 -BBX 2 5 1 3 -BITMAP -40 -C0 -40 -40 -40 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 365 0 -DWIDTH 5 0 -BBX 3 5 1 4 -BITMAP -E0 -A0 -E0 -00 -E0 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -A0 -50 -28 -50 -A0 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 9 9 0 0 -BITMAP -4100 -C200 -4400 -4400 -4900 -1300 -1500 -2780 -4100 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 9 9 0 0 -BITMAP -4100 -C200 -4400 -4800 -4B00 -1480 -1100 -2200 -4780 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 834 0 -DWIDTH 10 0 -BBX 9 9 0 0 -BITMAP -E100 -2200 -4400 -2400 -C900 -0B00 -1500 -1780 -2100 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 5 9 1 -3 -BITMAP -20 -00 -20 -20 -40 -40 -88 -88 -70 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -20 -10 -00 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -08 -10 -00 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -10 -28 -00 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -14 -28 -00 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 11 1 0 -BITMAP -28 -00 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -10 -28 -10 -10 -10 -28 -44 -44 -7C -82 -82 -82 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 1000 0 -DWIDTH 11 0 -BBX 9 9 1 0 -BITMAP -1F80 -2800 -2800 -4800 -4F80 -7800 -8800 -8800 -8F80 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 -3 -BITMAP -3C -42 -80 -80 -80 -80 -80 -42 -3C -08 -08 -30 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -20 -10 -00 -FC -80 -80 -80 -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -08 -10 -00 -FC -80 -80 -80 -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -10 -28 -00 -FC -80 -80 -80 -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 11 1 0 -BITMAP -28 -00 -FC -80 -80 -80 -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 12 0 0 -BITMAP -80 -40 -00 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 12 1 0 -BITMAP -40 -80 -00 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 12 0 0 -BITMAP -40 -A0 -00 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 11 0 0 -BITMAP -A0 -00 -40 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 8 9 0 0 -BITMAP -7C -42 -41 -41 -F1 -41 -41 -42 -7C -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 722 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -14 -28 -00 -82 -C2 -A2 -A2 -92 -8A -8A -86 -82 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -10 -08 -00 -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -04 -08 -00 -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -08 -14 -00 -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 12 1 0 -BITMAP -14 -28 -00 -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 8 11 1 0 -BITMAP -24 -00 -3C -42 -81 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -88 -50 -20 -50 -88 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 778 0 -DWIDTH 10 0 -BBX 10 11 0 -1 -BITMAP -0040 -1E80 -2100 -4280 -4480 -4480 -4880 -5080 -2100 -5E00 -8000 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -20 -10 -00 -84 -84 -84 -84 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -08 -10 -00 -84 -84 -84 -84 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 12 1 0 -BITMAP -10 -28 -00 -84 -84 -84 -84 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 722 0 -DWIDTH 8 0 -BBX 6 11 1 0 -BITMAP -48 -00 -84 -84 -84 -84 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 667 0 -DWIDTH 9 0 -BBX 7 12 1 0 -BITMAP -08 -10 -00 -82 -82 -44 -44 -28 -10 -10 -10 -10 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 667 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -80 -80 -F8 -84 -84 -84 -F8 -80 -80 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -70 -88 -88 -88 -B0 -88 -88 -88 -B0 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -20 -10 -00 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -10 -20 -00 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -20 -50 -00 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -28 -50 -00 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 9 1 0 -BITMAP -50 -00 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 6 10 1 0 -BITMAP -30 -48 -30 -70 -88 -08 -78 -88 -88 -74 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 889 0 -DWIDTH 11 0 -BBX 9 7 1 0 -BITMAP -7700 -8880 -0880 -7F80 -8800 -8880 -7700 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 10 1 -3 -BITMAP -70 -88 -80 -80 -80 -88 -70 -20 -10 -60 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -40 -20 -00 -70 -88 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -10 -20 -00 -70 -88 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -20 -50 -00 -70 -88 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -50 -00 -70 -88 -88 -F8 -80 -88 -70 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 10 0 0 -BITMAP -80 -40 -00 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 2 10 1 0 -BITMAP -40 -80 -00 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 10 0 0 -BITMAP -40 -A0 -00 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 278 0 -DWIDTH 3 0 -BBX 3 9 0 0 -BITMAP -A0 -00 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -68 -30 -50 -08 -78 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -28 -50 -00 -B0 -C8 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -40 -20 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -10 -20 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -20 -50 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -28 -50 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -50 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 584 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -20 -00 -F8 -00 -20 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 611 0 -DWIDTH 7 0 -BBX 7 7 0 0 -BITMAP -3A -44 -4C -54 -64 -44 -B8 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -40 -20 -00 -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -10 -20 -00 -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 10 1 0 -BITMAP -20 -50 -00 -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -50 -00 -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 13 1 -3 -BITMAP -10 -20 -00 -88 -88 -88 -90 -50 -50 -20 -20 -40 -80 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 556 0 -DWIDTH 7 0 -BBX 5 12 1 -3 -BITMAP -80 -80 -B0 -C8 -88 -88 -88 -C8 -B0 -80 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 500 0 -DWIDTH 7 0 -BBX 5 12 1 -3 -BITMAP -50 -00 -88 -88 -48 -50 -50 -30 -20 -20 -20 -C0 -ENDCHAR -ENDFONT diff --git a/gui/themes/fonts/helvR12-iso-8859-1.bdf b/gui/themes/fonts/helvR12-iso-8859-1.bdf new file mode 100644 index 0000000000..1f27c247db --- /dev/null +++ b/gui/themes/fonts/helvR12-iso-8859-1.bdf @@ -0,0 +1,3048 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT Generated with 'ucs2any.pl helvR12.bdf ../../../fonts/util/map-ISO8859-1 ISO8859-1' +COMMENT from an ISO10646-1 encoded source BDF font. +COMMENT ucs2any.pl by Markus Kuhn , 2000. +FONT -Adobe-Helvetica-Medium-R-Normal--12-120-75-75-P-67-ISO8859-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 11 15 0 -3 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 67 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 192 +STARTCHAR defaultchar +ENCODING 0 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +28 +28 +FC +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +6200 +9400 +9400 +6800 +0800 +1300 +1480 +1480 +2300 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +30 +48 +48 +30 +50 +8A +84 +8C +72 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 191 0 +DWIDTH 3 0 +BBX 1 3 1 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +80 +B0 +C8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +10 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +89 +85 +42 +3D +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 -3 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +30 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +30 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +C0 +20 +20 +20 +20 +10 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 10 1 -3 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +70 +A8 +A0 +A0 +A0 +C8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +48 +40 +40 +F0 +20 +20 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 12 0 -3 +BITMAP +70 +88 +80 +60 +90 +88 +88 +48 +30 +08 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 8 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +3C +68 +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 -3 +BITMAP +40 +20 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 1 3 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4400 +4900 +1300 +1500 +2780 +4100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4800 +4B00 +1480 +1100 +2200 +4780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +E100 +2200 +4400 +2400 +C900 +0B00 +1500 +1780 +2100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +20 +00 +20 +20 +40 +40 +88 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +08 +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +10 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +04 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 0 -1 +BITMAP +0040 +1E80 +2100 +4280 +4480 +4480 +4880 +5080 +2100 +5E00 +8000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +80 +80 +F8 +84 +84 +84 +F8 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +B0 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +10 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +28 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +30 +48 +30 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +80 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +68 +30 +50 +08 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +3A +44 +4C +54 +64 +44 +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +50 +00 +88 +88 +48 +50 +50 +30 +20 +20 +20 +C0 +ENDCHAR +ENDFONT -- cgit v1.2.3 From a278c07aa61fb6790b0f0eb57c8b8b0df4ab1b90 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:27:48 +0000 Subject: SCI: get rid of Script::allocateObject svn-id: r50438 --- engines/sci/engine/script.cpp | 13 ++++--------- engines/sci/engine/script.h | 1 - 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index ac6fb6f26d..2c2325a730 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -181,10 +181,6 @@ void Script::load(ResourceManager *resMan) { } } -Object *Script::allocateObject(uint16 offset) { - return &_objects[offset]; -} - Object *Script::getObject(uint16 offset) { if (_objects.contains(offset)) return &_objects[offset]; @@ -200,17 +196,16 @@ const Object *Script::getObject(uint16 offset) const { } Object *Script::scriptObjInit(reg_t obj_pos, bool fullObjectInit) { - Object *obj; - if (getSciVersion() < SCI_VERSION_1_1 && fullObjectInit) obj_pos.offset += 8; // magic offset (SCRIPT_OBJECT_MAGIC_OFFSET) VERIFY(obj_pos.offset < _bufSize, "Attempt to initialize object beyond end of script\n"); - obj = allocateObject(obj_pos.offset); - VERIFY(obj_pos.offset + kOffsetFunctionArea < (int)_bufSize, "Function area pointer stored beyond end of script\n"); + // Get the object at the specified position and init it. This will + // automatically "allocate" space for it in the _objects map if necessary. + Object *obj = &_objects[obj_pos.offset]; obj->init(_buf, obj_pos, fullObjectInit); return obj; @@ -508,7 +503,7 @@ void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) { // talk-clicks on the robot will act like clicking on ego if (!obj->isClass()) { reg_t classObject = obj->getSuperClassSelector(); - Object *classObj = segMan->getObject(classObject); + const Object *classObj = segMan->getObject(classObject); obj->setPropDictSelector(classObj->getPropDictSelector()); } diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 490a7a81a3..d1e6a4509e 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -111,7 +111,6 @@ public: virtual void saveLoadWithSerializer(Common::Serializer &ser); - Object *allocateObject(uint16 offset); Object *getObject(uint16 offset); const Object *getObject(uint16 offset) const; -- cgit v1.2.3 From b3011faaef07e607dc3b7a9813d3bd788179a225 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:28:12 +0000 Subject: SCI: Make various SegManager const svn-id: r50439 --- engines/sci/engine/seg_manager.cpp | 14 +++++++------- engines/sci/engine/seg_manager.h | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 56591c4726..ea1fc389cd 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -168,7 +168,7 @@ int SegManager::deallocate(SegmentId seg, bool recursive) { return 1; } -bool SegManager::isHeapObject(reg_t pos) { +bool SegManager::isHeapObject(reg_t pos) const { const Object *obj = getObject(pos); if (obj == NULL || (obj && obj->isFreed())) return false; @@ -194,36 +194,36 @@ Script *SegManager::getScript(const SegmentId seg) { return (Script *)_heap[seg]; } -Script *SegManager::getScriptIfLoaded(const SegmentId seg) { +Script *SegManager::getScriptIfLoaded(const SegmentId seg) const { if (seg < 1 || (uint)seg >= _heap.size() || !_heap[seg] || _heap[seg]->getType() != SEG_TYPE_SCRIPT) return 0; return (Script *)_heap[seg]; } -SegmentId SegManager::findSegmentByType(int type) { +SegmentId SegManager::findSegmentByType(int type) const { for (uint i = 0; i < _heap.size(); i++) if (_heap[i] && _heap[i]->getType() == type) return i; return 0; } -SegmentObj *SegManager::getSegmentObj(SegmentId seg) { +SegmentObj *SegManager::getSegmentObj(SegmentId seg) const { if (seg < 1 || (uint)seg >= _heap.size() || !_heap[seg]) return 0; return _heap[seg]; } -SegmentType SegManager::getSegmentType(SegmentId seg) { +SegmentType SegManager::getSegmentType(SegmentId seg) const { if (seg < 1 || (uint)seg >= _heap.size() || !_heap[seg]) return SEG_TYPE_INVALID; return _heap[seg]->getType(); } -SegmentObj *SegManager::getSegment(SegmentId seg, SegmentType type) { +SegmentObj *SegManager::getSegment(SegmentId seg, SegmentType type) const { return getSegmentType(seg) == type ? _heap[seg] : NULL; } -Object *SegManager::getObject(reg_t pos) { +Object *SegManager::getObject(reg_t pos) const { SegmentObj *mobj = getSegmentObj(pos.segment); Object *obj = NULL; diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 4af2965bc7..0ef904618b 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -161,7 +161,7 @@ public: * @param seg ID of the script segment to check for * @return A pointer to the Script object, or NULL */ - Script *getScriptIfLoaded(SegmentId seg); + Script *getScriptIfLoaded(SegmentId seg) const; // 2. Clones @@ -387,33 +387,33 @@ public: * @param type The type of the segment to find * @return The segment number, or -1 if the segment wasn't found */ - SegmentId findSegmentByType(int type); + SegmentId findSegmentByType(int type) const; // TODO: document this - SegmentObj *getSegmentObj(SegmentId seg); + SegmentObj *getSegmentObj(SegmentId seg) const; // TODO: document this - SegmentType getSegmentType(SegmentId seg); + SegmentType getSegmentType(SegmentId seg) const; // TODO: document this - SegmentObj *getSegment(SegmentId seg, SegmentType type); + SegmentObj *getSegment(SegmentId seg, SegmentType type) const; /** * Retrieves an object from the specified location * @param[in] offset Location (segment, offset) of the object * @return The object in question, or NULL if there is none */ - Object *getObject(reg_t pos); + Object *getObject(reg_t pos) const; /** * Checks whether a heap address contains an object * @parm obj The address to check * @return True if it is an object, false otherwise */ - bool isObject(reg_t obj) { return getObject(obj) != NULL; } + bool isObject(reg_t obj) const { return getObject(obj) != NULL; } // TODO: document this - bool isHeapObject(reg_t pos); + bool isHeapObject(reg_t pos) const; /** * Determines the name of an object -- cgit v1.2.3 From 4f606cc10df1253cb035e3828f974c03f92e631f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:28:29 +0000 Subject: SCI: Clarify docs of GC related SegmentObj methods svn-id: r50440 --- engines/sci/engine/script.h | 6 ++++++ engines/sci/engine/segment.h | 14 +++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index d1e6a4509e..3817f8aae1 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -107,6 +107,12 @@ public: virtual Common::Array listAllDeallocatable(SegmentId segId) const; virtual Common::Array listAllOutgoingReferences(reg_t object) const; + /** + * Return a list of all references to objects in this script + * (and also to the locals segment, if any). + * Used by the garbage collector. + * @return a list of outgoing references within the object + */ Common::Array listObjectReferences() const; virtual void saveLoadWithSerializer(Common::Serializer &ser); diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index d290475593..b1e89e6357 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -105,6 +105,7 @@ public: /** * Finds the canonic address associated with sub_reg. + * Used by the garbage collector. * * For each valid address a, there exists a canonic address c(a) such that c(a) = c(c(a)). * This address "governs" a in the sense that deallocating c(a) will deallocate a. @@ -115,14 +116,15 @@ public: /** * Deallocates all memory associated with the specified address. + * Used by the garbage collector. * @param sub_addr address (within the given segment) to deallocate */ virtual void freeAtAddress(SegManager *segMan, reg_t sub_addr) {} /** - * Iterates over and reports all addresses within the current segment. - * @param note Invoked for each address on which free_at_address() makes sense - * @param param parameter passed to 'note' + * Iterates over and reports all addresses within the segment. + * Used by the garbage collector. + * @return a list of addresses within the segment */ virtual Common::Array listAllDeallocatable(SegmentId segId) const { return Common::Array(); @@ -130,9 +132,11 @@ public: /** * Iterates over all references reachable from the specified object. + * Used by the garbage collector. * @param object object (within the current segment) to analyse - * @return refs a list of outgoing references within the object - * Note: This function may also choose to report numbers (segment 0) as adresses + * @return a list of outgoing references within the object + * + * @note This function may also choose to report numbers (segment 0) as adresses */ virtual Common::Array listAllOutgoingReferences(reg_t object) const { return Common::Array(); -- cgit v1.2.3 From 4fdbd14a60afc72c3b936b02dffd39935594e8e5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:28:46 +0000 Subject: SCI: Move a few remaining Script methods to engine/script.cpp svn-id: r50441 --- engines/sci/engine/script.cpp | 59 +++++++++++++++++++++++++++++++++++++++++ engines/sci/engine/segment.cpp | 60 ------------------------------------------ 2 files changed, 59 insertions(+), 60 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 2c2325a730..bc63afece5 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -521,4 +521,63 @@ void Script::initialiseObjectsSci11(SegManager *segMan, SegmentId segmentId) { relocate(make_reg(segmentId, READ_SCI11ENDIAN_UINT16(_heapStart))); } +reg_t Script::findCanonicAddress(SegManager *segMan, reg_t addr) const { + addr.offset = 0; + return addr; +} + +void Script::freeAtAddress(SegManager *segMan, reg_t addr) { + /* + debugC(2, kDebugLevelGC, "[GC] Freeing script %04x:%04x", PRINT_REG(addr)); + if (_localsSegment) + debugC(2, kDebugLevelGC, "[GC] Freeing locals %04x:0000", _localsSegment); + */ + + if (_markedAsDeleted) + segMan->deallocateScript(_nr); +} + +Common::Array Script::listAllDeallocatable(SegmentId segId) const { + const reg_t r = make_reg(segId, 0); + return Common::Array(&r, 1); +} + +Common::Array Script::listAllOutgoingReferences(reg_t addr) const { + Common::Array tmp; + if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) { + const Object *obj = getObject(addr.offset); + if (obj) { + // Note all local variables, if we have a local variable environment + if (_localsSegment) + tmp.push_back(make_reg(_localsSegment, 0)); + + for (uint i = 0; i < obj->getVarCount(); i++) + tmp.push_back(obj->getVariable(i)); + } else { + error("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr)); + } + } else { + /* warning("Unexpected request for outgoing script-object references at %04x:%04x", PRINT_REG(addr));*/ + /* Happens e.g. when we're looking into strings */ + } + return tmp; +} + +Common::Array Script::listObjectReferences() const { + Common::Array tmp; + + // Locals, if present + if (_localsSegment) + tmp.push_back(make_reg(_localsSegment, 0)); + + // All objects (may be classes, may be indirectly reachable) + ObjMap::iterator it; + const ObjMap::iterator end = _objects.end(); + for (it = _objects.begin(); it != end; ++it) { + tmp.push_back(it->_value.getPos()); + } + + return tmp; +} + } // End of namespace Sci diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 21ca1fe9b4..cb908979a3 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -245,66 +245,6 @@ SegmentRef SystemStrings::dereference(reg_t pointer) { } -//-------------------- script -------------------- -reg_t Script::findCanonicAddress(SegManager *segMan, reg_t addr) const { - addr.offset = 0; - return addr; -} - -void Script::freeAtAddress(SegManager *segMan, reg_t addr) { - /* - debugC(2, kDebugLevelGC, "[GC] Freeing script %04x:%04x", PRINT_REG(addr)); - if (_localsSegment) - debugC(2, kDebugLevelGC, "[GC] Freeing locals %04x:0000", _localsSegment); - */ - - if (_markedAsDeleted) - segMan->deallocateScript(_nr); -} - -Common::Array Script::listAllDeallocatable(SegmentId segId) const { - const reg_t r = make_reg(segId, 0); - return Common::Array(&r, 1); -} - -Common::Array Script::listAllOutgoingReferences(reg_t addr) const { - Common::Array tmp; - if (addr.offset <= _bufSize && addr.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT(_buf + addr.offset)) { - const Object *obj = getObject(addr.offset); - if (obj) { - // Note all local variables, if we have a local variable environment - if (_localsSegment) - tmp.push_back(make_reg(_localsSegment, 0)); - - for (uint i = 0; i < obj->getVarCount(); i++) - tmp.push_back(obj->getVariable(i)); - } else { - error("Request for outgoing script-object reference at %04x:%04x failed", PRINT_REG(addr)); - } - } else { - /* warning("Unexpected request for outgoing script-object references at %04x:%04x", PRINT_REG(addr));*/ - /* Happens e.g. when we're looking into strings */ - } - return tmp; -} - -Common::Array Script::listObjectReferences() const { - Common::Array tmp; - - // Locals, if present - if (_localsSegment) - tmp.push_back(make_reg(_localsSegment, 0)); - - // All objects (may be classes, may be indirectly reachable) - ObjMap::iterator it; - const ObjMap::iterator end = _objects.end(); - for (it = _objects.begin(); it != end; ++it) { - tmp.push_back(it->_value.getPos()); - } - - return tmp; -} - //-------------------- clones -------------------- Common::Array CloneTable::listAllOutgoingReferences(reg_t addr) const { -- cgit v1.2.3 From 8ae9774a009a2c12123d4bc9070a3d8f043a1c34 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:29:06 +0000 Subject: SCI: Turn more warnings into errors. If one of these is triggered for you, you can add an exception to the error, together with a comment explaining why this exception is necessary. Ideally after verifying that the cause is a script bug and not a bug in our code... svn-id: r50442 --- engines/sci/engine/klists.cpp | 40 ++++++++++++++++++++-------------------- engines/sci/engine/kmath.cpp | 10 +++++----- engines/sci/engine/kmisc.cpp | 12 ++++++------ 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index eb5334c3b9..eff0e725b8 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -37,12 +37,12 @@ static bool isSaneNodePointer(SegManager *segMan, reg_t addr) { Node *node = segMan->lookupNode(addr); if (!node) { - warning("isSaneNodePointer: Node at %04x:%04x wasn't found", PRINT_REG(addr)); + error("isSaneNodePointer: Node at %04x:%04x wasn't found", PRINT_REG(addr)); return false; } if (havePrev && node->pred != prev) { - warning("isSaneNodePointer: Node at %04x:%04x points to invalid predecessor %04x:%04x (should be %04x:%04x)", + error("isSaneNodePointer: Node at %04x:%04x points to invalid predecessor %04x:%04x (should be %04x:%04x)", PRINT_REG(addr), PRINT_REG(node->pred), PRINT_REG(prev)); //node->pred = prev; // fix the problem in the node @@ -61,7 +61,7 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { List *list = segMan->lookupList(addr); if (!list) { - warning("isSaneListPointer (list %04x:%04x): The requested list wasn't found", + error("checkListPointer (list %04x:%04x): The requested list wasn't found", PRINT_REG(addr)); return; } @@ -74,17 +74,17 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { Node *node_z = segMan->lookupNode(list->last); if (!node_a) { - warning("isSaneListPointer (list %04x:%04x): missing first node", PRINT_REG(addr)); + error("checkListPointer (list %04x:%04x): missing first node", PRINT_REG(addr)); return; } if (!node_z) { - warning("isSaneListPointer (list %04x:%04x): missing last node", PRINT_REG(addr)); + error("checkListPointer (list %04x:%04x): missing last node", PRINT_REG(addr)); return; } if (!node_a->pred.isNull()) { - warning("isSaneListPointer (list %04x:%04x): First node of the list points to a predecessor node", + error("checkListPointer (list %04x:%04x): First node of the list points to a predecessor node", PRINT_REG(addr)); //node_a->pred = NULL_REG; // fix the problem in the node @@ -93,7 +93,7 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { } if (!node_z->succ.isNull()) { - warning("isSaneListPointer (list %04x:%04x): Last node of the list points to a successor node", + error("checkListPointer (list %04x:%04x): Last node of the list points to a successor node", PRINT_REG(addr)); //node_z->succ = NULL_REG; // fix the problem in the node @@ -105,10 +105,10 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { } else { // Not sane list... it's missing pointers to the first or last element if (list->first.isNull()) - warning("isSaneListPointer (list %04x:%04x): missing pointer to first element", + error("checkListPointer (list %04x:%04x): missing pointer to first element", PRINT_REG(addr)); if (list->last.isNull()) - warning("isSaneListPointer (list %04x:%04x): missing pointer to last element", + error("checkListPointer (list %04x:%04x): missing pointer to last element", PRINT_REG(addr)); } } @@ -267,12 +267,12 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { } if (argc != 3 && argc != 4) { - warning("kAddAfter: Haven't got 3 or 4 arguments, aborting"); + error("kAddAfter: Haven't got 3 or 4 arguments, aborting"); return NULL_REG; } if (argc == 4) // Torin's Passage - warning("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); + error("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); if (firstnode) { // We're really appending after reg_t oldnext = firstnode->succ; @@ -426,14 +426,14 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) { reg_t kListAt(EngineState *s, int argc, reg_t *argv) { if (argc != 2) { - warning("kListAt called with %d parameters", argc); + error("kListAt called with %d parameters", argc); return NULL_REG; } List *list = s->_segMan->lookupList(argv[0]); reg_t curAddress = list->first; if (list->first.isNull()) { - warning("kListAt tried to reference empty list (%04x:%04x)", PRINT_REG(argv[0])); + error("kListAt tried to reference empty list (%04x:%04x)", PRINT_REG(argv[0])); return NULL_REG; } Node *curNode = s->_segMan->lookupNode(curAddress); @@ -495,7 +495,7 @@ reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv) { if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) { // This can only happen with 3 params (list, target selector, variable) if (argc != 3) { - warning("kListEachElementDo: Attempted to modify a variable selector with %d params", argc); + error("kListEachElementDo: Attempted to modify a variable selector with %d params", argc); } else { writeSelector(s->_segMan, curObject, slc, argv[2]); } @@ -527,7 +527,7 @@ reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) { // First, check if the target selector is a variable if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) { // Can this happen with variable selectors? - warning("kListFirstTrue: Attempted to access a variable selector"); + error("kListFirstTrue: Attempted to access a variable selector"); } else { invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2); @@ -561,7 +561,7 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) { // First, check if the target selector is a variable if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) { // Can this happen with variable selectors? - warning("kListAllTrue: Attempted to access a variable selector"); + error("kListAllTrue: Attempted to access a variable selector"); } else { invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2); @@ -604,15 +604,15 @@ reg_t kList(EngineState *s, int argc, reg_t *argv) { case 11: return kAddToEnd(s, argc - 1, argv + 1); case 12: - warning("kList: unimplemented subfunction kAddBefore"); + error("kList: unimplemented subfunction kAddBefore"); //return kAddBefore(s, argc - 1, argv + 1); return NULL_REG; case 13: - warning("kList: unimplemented subfunction kMoveToFront"); + error("kList: unimplemented subfunction kMoveToFront"); //return kMoveToFront(s, argc - 1, argv + 1); return NULL_REG; case 14: - warning("kList: unimplemented subfunction kMoveToEnd"); + error("kList: unimplemented subfunction kMoveToEnd"); //return kMoveToEnd(s, argc - 1, argv + 1); return NULL_REG; case 15: @@ -632,7 +632,7 @@ reg_t kList(EngineState *s, int argc, reg_t *argv) { case 22: return kSort(s, argc - 1, argv + 1); default: - warning("kList: Unhandled case %d", argv[0].toUint16()); + error("kList: Unhandled case %d", argv[0].toUint16()); return NULL_REG; } } diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 3c0ab814f1..a7baf72b65 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -115,7 +115,7 @@ reg_t kCosDiv(EngineState *s, int argc, reg_t *argv) { double cosval = cos(angle * PI / 180.0); if ((cosval < 0.0001) && (cosval > -0.0001)) { - warning("kCosDiv: Attempted division by zero"); + error("kCosDiv: Attempted division by zero"); return SIGNAL_REG; } else return make_reg(0, (int16)(value / cosval)); @@ -127,7 +127,7 @@ reg_t kSinDiv(EngineState *s, int argc, reg_t *argv) { double sinval = sin(angle * PI / 180.0); if ((sinval < 0.0001) && (sinval > -0.0001)) { - warning("kSinDiv: Attempted division by zero"); + error("kSinDiv: Attempted division by zero"); return SIGNAL_REG; } else return make_reg(0, (int16)(value / sinval)); @@ -139,7 +139,7 @@ reg_t kTimesTan(EngineState *s, int argc, reg_t *argv) { param -= 90; if ((param % 90) == 0) { - warning("kTimesTan: Attempted tan(pi/2)"); + error("kTimesTan: Attempted tan(pi/2)"); return SIGNAL_REG; } else return make_reg(0, (int16) - (tan(param * PI / 180.0) * scale)); @@ -150,7 +150,7 @@ reg_t kTimesCot(EngineState *s, int argc, reg_t *argv) { int scale = (argc > 1) ? argv[1].toSint16() : 1; if ((param % 90) == 0) { - warning("kTimesCot: Attempted tan(pi/2)"); + error("kTimesCot: Attempted tan(pi/2)"); return SIGNAL_REG; } else return make_reg(0, (int16)(tan(param * PI / 180.0) * scale)); @@ -165,7 +165,7 @@ reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) { // Sanity check... if (!denominator) { - warning("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator); + error("kMulDiv: attempt to divide by zero (%d * %d / %d", multiplicant, multiplier, denominator); return NULL_REG; } diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index f742734ad7..3d206d0358 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -123,7 +123,7 @@ reg_t kMemoryInfo(EngineState *s, int argc, reg_t *argv) { return make_reg(0, size); default: - warning("Unknown MemoryInfo operation: %04x", argv[0].offset); + error("Unknown MemoryInfo operation: %04x", argv[0].offset); } return NULL_REG; @@ -198,7 +198,7 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { int mode = (argc > 0) ? argv[0].toUint16() : 0; if (getSciVersion() <= SCI_VERSION_0_LATE && mode > 1) - warning("kGetTime called in SCI0 with mode %d (expected 0 or 1)", mode); + error("kGetTime called in SCI0 with mode %d (expected 0 or 1)", mode); switch (mode) { case K_NEW_GETTIME_TICKS : @@ -218,7 +218,7 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelTime, "GetTime(date) returns %d", retval); break; default: - warning("Attempt to use unknown GetTime mode %d", mode); + error("Attempt to use unknown GetTime mode %d", mode); break; } @@ -264,7 +264,7 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { SegmentRef ref = s->_segMan->dereference(argv[1]); if (!ref.isValid() || ref.maxSize < 2) { - warning("Attempt to peek invalid memory at %04x:%04x", PRINT_REG(argv[1])); + error("Attempt to peek invalid memory at %04x:%04x", PRINT_REG(argv[1])); return s->r_acc; } if (ref.isRaw) @@ -280,7 +280,7 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { SegmentRef ref = s->_segMan->dereference(argv[1]); if (!ref.isValid() || ref.maxSize < 2) { - warning("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1])); + error("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1])); return s->r_acc; } @@ -375,7 +375,7 @@ reg_t kPlatform(EngineState *s, int argc, reg_t *argv) { case kPlatformIsItWindows: return make_reg(0, isWindows); default: - warning("Unsupported kPlatform operation %d", operation); + error("Unsupported kPlatform operation %d", operation); } return NULL_REG; -- cgit v1.2.3 From 9b4406fd350458e1fe194dadd76a0cb97c2ca324 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 28 Jun 2010 12:55:47 +0000 Subject: SCI: Some more GC cleanup svn-id: r50443 --- engines/sci/engine/gc.cpp | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index a306045cb7..3c8c1f17a8 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -150,36 +150,45 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { } void run_gc(EngineState *s) { - uint seg_nr; SegManager *segMan = s->_segMan; + // Some debug stuff + debugC(2, kDebugLevelGC, "[GC] Running..."); const char *segnames[SEG_TYPE_MAX + 1]; int segcount[SEG_TYPE_MAX + 1]; - debugC(2, kDebugLevelGC, "[GC] Running..."); + memset(segnames, 0, sizeof(segnames)); memset(segcount, 0, sizeof(segcount)); - reg_t_hash_map *use_map = find_all_used_references(s); - - for (seg_nr = 1; seg_nr < segMan->_heap.size(); seg_nr++) { - if (segMan->_heap[seg_nr] != NULL) { - SegmentObj *mobj = segMan->_heap[seg_nr]; - segnames[mobj->getType()] = SegmentObj::getSegmentTypeName(mobj->getType()); - const Common::Array tmp = mobj->listAllDeallocatable(seg_nr); + // Compute the set of all segments references currently in use. + reg_t_hash_map *activeRefs = find_all_used_references(s); + + // Iterate over all segments, and check for each whether it + // contains stuff that can be collected. + for (uint seg = 1; seg < segMan->_heap.size(); seg++) { + SegmentObj *mobj = segMan->_heap[seg]; + if (mobj != NULL) { + const SegmentType type = mobj->getType(); + segnames[type] = SegmentObj::getSegmentTypeName(type); + + // Get a list of all deallocatable objects in this segment, + // then free any which are not referenced from somewhere. + const Common::Array tmp = mobj->listAllDeallocatable(seg); for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { const reg_t addr = *it; - if (!use_map->contains(addr)) { + if (!activeRefs->contains(addr)) { // Not found -> we can free it mobj->freeAtAddress(segMan, addr); debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr)); - segcount[mobj->getType()]++; + segcount[type]++; } } } } - delete use_map; + delete activeRefs; + // Output debug summary of garbage collection debugC(2, kDebugLevelGC, "[GC] Summary:"); for (int i = 0; i <= SEG_TYPE_MAX; i++) if (segcount[i]) -- cgit v1.2.3 From 6402d644199e17cbf7770c98ebf8c1edca7c4cca Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 14:21:56 +0000 Subject: SCI: cleanup of execstack, output of backtrace slightly modified, is now also displaying local calls and exports svn-id: r50445 --- engines/sci/console.cpp | 27 ++++++++++++++++----------- engines/sci/engine/vm.cpp | 30 +++++++++++++++--------------- engines/sci/engine/vm.h | 8 ++++---- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 8ea7daa7c6..b30349dd5a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2320,8 +2320,6 @@ bool Console::cmdScriptSteps(int argc, const char **argv) { } bool Console::cmdBacktrace(int argc, const char **argv) { - DebugPrintf("Dumping the send/self/super/call/calle/callb stack:\n"); - DebugPrintf("Call stack (current base: 0x%x):\n", _engine->_gamestate->executionStackBase); Common::List::iterator iter; uint i = 0; @@ -2333,19 +2331,25 @@ bool Console::cmdBacktrace(int argc, const char **argv) { int paramc, totalparamc; switch (call.type) { - case EXEC_STACK_TYPE_CALL: // Normal function - DebugPrintf(" %x:[%x] %s::%s(", i, call.origin, objname, (call.selector == -1) ? "" : - _engine->getKernel()->getSelectorName(call.selector).c_str()); + if (call.type == EXEC_STACK_TYPE_CALL) + DebugPrintf(" %x: script %d - ", i, (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.segment]).getScriptNumber()); + if (call.debugSelector != -1) { + DebugPrintf("%s::%s(", objname, _engine->getKernel()->getSelectorName(call.debugSelector).c_str()); + } else if (call.debugExportId != -1) { + DebugPrintf("export %d (", call.debugExportId); + } else if (call.debugLocalCallOffset != -1) { + DebugPrintf("call %x (", call.debugLocalCallOffset); + } break; case EXEC_STACK_TYPE_KERNEL: // Kernel function - DebugPrintf(" %x:[%x] k%s(", i, call.origin, _engine->getKernel()->getKernelName(call.selector).c_str()); + DebugPrintf(" %x:[%x] k%s(", i, call.debugOrigin, _engine->getKernel()->getKernelName(call.debugSelector).c_str()); break; case EXEC_STACK_TYPE_VARSELECTOR: - DebugPrintf(" %x:[%x] vs%s %s::%s (", i, call.origin, (call.argc) ? "write" : "read", - objname, _engine->getKernel()->getSelectorName(call.selector).c_str()); + DebugPrintf(" %x:[%x] vs%s %s::%s (", i, call.debugOrigin, (call.argc) ? "write" : "read", + objname, _engine->getKernel()->getSelectorName(call.debugSelector).c_str()); break; } @@ -2364,7 +2368,10 @@ bool Console::cmdBacktrace(int argc, const char **argv) { if (call.argc > 16) DebugPrintf("..."); - DebugPrintf(")\n obj@%04x:%04x", PRINT_REG(call.objp)); + DebugPrintf(")\n "); + if (call.debugOrigin != -1) + DebugPrintf("by %x ", call.debugOrigin); + DebugPrintf("obj@%04x:%04x", PRINT_REG(call.objp)); if (call.type == EXEC_STACK_TYPE_CALL) { DebugPrintf(" pc=%04x:%04x", PRINT_REG(call.addr.pc)); if (call.sp == CALL_SP_CARRY) @@ -2377,8 +2384,6 @@ bool Console::cmdBacktrace(int argc, const char **argv) { DebugPrintf(" pc:none"); DebugPrintf(" argp:ST:%04x", (unsigned)(call.variables_argp - _engine->_gamestate->stack_base)); - if (call.type == EXEC_STACK_TYPE_CALL) - DebugPrintf(" script: %d", (*(Script *)_engine->_gamestate->_segMan->_heap[call.addr.pc.segment]).getScriptNumber()); DebugPrintf("\n"); } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 686603ae21..2047482bac 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -301,15 +301,15 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); int curScriptNr = local_script->getScriptNumber(); - if (lastCall->localCallOffset != -1) { + if (lastCall->debugLocalCallOffset != -1) { // if lastcall was actually a local call search back for a real call Common::List::iterator callIterator = state->_executionStack.end(); while (callIterator != state->_executionStack.begin()) { callIterator--; ExecStack loopCall = *callIterator; - if ((loopCall.selector != -1) || (loopCall.exportId != -1)) { - lastCall->selector = loopCall.selector; - lastCall->exportId = loopCall.exportId; + if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { + lastCall->debugSelector = loopCall.debugSelector; + lastCall->debugExportId = loopCall.debugExportId; break; } } @@ -320,11 +320,11 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i const SciGameId gameId = g_sci->getGameId(); if (lastCall->type == EXEC_STACK_TYPE_CALL) { - if (lastCall->selector != -1) { - curMethodName = g_sci->getKernel()->getSelectorName(lastCall->selector); - } else if (lastCall->exportId != -1) { + if (lastCall->debugSelector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(lastCall->debugSelector); + } else if (lastCall->debugExportId != -1) { curObjectName = ""; - curMethodName = curMethodName.printf("export %d", lastCall->exportId); + curMethodName = curMethodName.printf("export %d", lastCall->debugExportId); } } @@ -336,7 +336,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i workaround = uninitializedReadWorkarounds; while (workaround->objectName) { if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->objectName == searchObjectName) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { // Workaround found r[index] = make_reg(0, workaround->newValue); return r[index]; @@ -348,7 +348,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (!searchObject.isNull()) searchObjectName = state->_segMan->getObjectName(searchObject); } while (!searchObject.isNull()); // no parent left? - error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); + error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->debugLocalCallOffset); } return r[index]; } else @@ -718,10 +718,10 @@ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t *argp = make_reg(0, argc); // SCI code relies on the zeroeth argument to equal argc // Additional debug information - xstack.selector = selector; - xstack.exportId = exportId; - xstack.localCallOffset = localCallOffset; - xstack.origin = origin; + xstack.debugSelector = selector; + xstack.debugExportId = exportId; + xstack.debugLocalCallOffset = localCallOffset; + xstack.debugOrigin = origin; xstack.type = EXEC_STACK_TYPE_CALL; // Normal call @@ -777,7 +777,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { ExecStack *xstack; xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->selector = kernelFuncNr; + xstack->debugSelector = kernelFuncNr; xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 49169a456c..81ec4f1c61 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -97,10 +97,10 @@ struct ExecStack { StackPtr variables_argp; // Argument pointer SegmentId local_segment; // local variables etc - Selector selector; // The selector which was used to call or -1 if not applicable - int exportId; // The exportId which was called or -1 if not applicable - int localCallOffset; // Local call offset or -1 if not applicable - int origin; // The stack frame position the call was made from, or -1 if it was the initial call + Selector debugSelector; // The selector which was used to call or -1 if not applicable + int debugExportId; // The exportId which was called or -1 if not applicable + int debugLocalCallOffset; // Local call offset or -1 if not applicable + int debugOrigin; // The stack frame position the call was made from, or -1 if it was the initial call ExecStackType type; reg_t* getVarPointer(SegManager *segMan) const; -- cgit v1.2.3 From 66fb9e7a90874e27486db98f0eb8d6f0512a00c5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 14:46:28 +0000 Subject: SCI: fixing valgrind issue in Script::initialiseClasses thx to wjp for valgrind testing svn-id: r50446 --- engines/sci/engine/script.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index bc63afece5..4100ca6448 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -410,12 +410,14 @@ void Script::initialiseClasses(SegManager *segMan) { if (!seeker) return; + uint16 marker; + bool isClass; + uint16 classpos = seeker - _buf; + int16 species = 0; + while (true) { // In SCI0-SCI1, this is the segment type. In SCI11, it's a marker (0x1234) - uint16 marker = READ_SCI11ENDIAN_UINT16(seeker); - bool isClass; - uint16 classpos = seeker - _buf; - int16 species; + marker = READ_SCI11ENDIAN_UINT16(seeker); if (!marker) break; @@ -425,7 +427,8 @@ void Script::initialiseClasses(SegManager *segMan) { species = READ_SCI11ENDIAN_UINT16(seeker + 10); } else { isClass = (marker == SCI_OBJ_CLASS); - species = READ_SCI11ENDIAN_UINT16(seeker + 12); + if (isClass) + species = READ_SCI11ENDIAN_UINT16(seeker + 12); classpos += 12; } -- cgit v1.2.3 From 8410dbab539a8c278b29e9047bd5c192a3048e32 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 14:49:54 +0000 Subject: SCI: stupid oversight fix r50446, too hot here :P svn-id: r50447 --- engines/sci/engine/script.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 4100ca6448..a293f81d2f 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -412,12 +412,13 @@ void Script::initialiseClasses(SegManager *segMan) { uint16 marker; bool isClass; - uint16 classpos = seeker - _buf; + uint16 classpos; int16 species = 0; while (true) { // In SCI0-SCI1, this is the segment type. In SCI11, it's a marker (0x1234) marker = READ_SCI11ENDIAN_UINT16(seeker); + classpos = seeker - _buf; if (!marker) break; -- cgit v1.2.3 From 0e7ccb896dafb69664fb313c63bdb8fbe0ea82d1 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 28 Jun 2010 15:17:10 +0000 Subject: i18n: Add support for locale-dependent fonts Currently it ws not decided where to put fonts, but if you put BDF files into themepath, they will get picked up. The font name has to contain same codepage specification as in the .po file, i.e. fixed5x8-iso-8859-5.bdf for Cyrillic codepage. In case the font does not exist, default will be used. All built in fonts get proper names. TODO: Currently there is a bug with our font cacher. Font clR6x12-iso-8859-5 is empty after loading from FCC file. Reason is unknown. svn-id: r50448 --- common/translation.cpp | 4 + common/translation.h | 5 + graphics/fontman.cpp | 28 +- gui/ThemeEngine.cpp | 39 +- gui/ThemeEngine.h | 1 + gui/themes/default.inc | 2108 ++++++++++++++-------------- gui/themes/scummclassic.zip | Bin 56607 -> 57409 bytes gui/themes/scummclassic/classic_gfx.stx | 20 +- gui/themes/scummmodern.zip | Bin 163899 -> 158996 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 20 +- 10 files changed, 1158 insertions(+), 1067 deletions(-) diff --git a/common/translation.cpp b/common/translation.cpp index 3c5ff4d3c7..093f26510f 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -130,6 +130,10 @@ const char *TranslationManager::getTranslation(const char *message) { return po2c_gettext(message); } +const char *TranslationManager::getCurrentCharset() { + return po2c_getcharset(); +} + String TranslationManager::getTranslation(const String &message) { return po2c_gettext(message.c_str()); } diff --git a/common/translation.h b/common/translation.h index 0722ae44ae..277ac6f5c4 100644 --- a/common/translation.h +++ b/common/translation.h @@ -121,6 +121,11 @@ public: */ const TLangArray getSupportedLanguages() const; + /** + * Returns charset specified by selected translation language + */ + const char *getCurrentCharset(); + private: Common::String _syslang; }; diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp index 808dbafa1a..c6972cfaab 100644 --- a/graphics/fontman.cpp +++ b/graphics/fontman.cpp @@ -57,18 +57,28 @@ FontManager::~FontManager() { g_consolefont = 0; } -const char *builtinFontNames[] = { - "builtinOSD", - "builtinConsole", - "builtinGUI", - "builtinBigGUI", - 0 +const struct { + const char *name; + FontManager::FontUsage id; +} builtinFontNames[] = { + { "builtinOSD", FontManager::kOSDFont }, + { "builtinConsole", FontManager::kConsoleFont }, + { "fixed5x8.bdf", FontManager::kConsoleFont }, + { "fixed5x8-iso-8859-1.bdf", FontManager::kConsoleFont }, + { "fixed5x8-ascii.bdf", FontManager::kConsoleFont }, + { "clR6x12.bdf", FontManager::kGUIFont }, + { "clR6x12-iso-8859-1.bdf", FontManager::kGUIFont }, + { "clR6x12-ascii.bdf", FontManager::kGUIFont }, + { "helvB12.bdf", FontManager::kBigGUIFont }, + { "helvB12-iso-8859-1.bdf", FontManager::kBigGUIFont }, + { "helvB12-ascii.bdf", FontManager::kBigGUIFont }, + { 0, FontManager::kOSDFont } }; const Font *FontManager::getFontByName(const Common::String &name) const { - for (int i = 0; builtinFontNames[i]; i++) - if (!strcmp(name.c_str(), builtinFontNames[i])) - return getFontByUsage((FontUsage)i); + for (int i = 0; builtinFontNames[i].name; i++) + if (!scumm_stricmp(name.c_str(), builtinFontNames[i].name)) + return getFontByUsage(builtinFontNames[i].id); if (!_fontMap.contains(name)) return 0; diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 8f4f767a94..0691f8351d 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -568,10 +568,17 @@ bool ThemeEngine::addFont(TextData textId, const Common::String &file) { if (file == "default") { _texts[textId]->_fontPtr = _font; } else { - _texts[textId]->_fontPtr = FontMan.getFontByName(file); + Common::String localized = genLocalizedFontFilename(file.c_str()); + // Try built-in fonts + _texts[textId]->_fontPtr = FontMan.getFontByName(localized); if (!_texts[textId]->_fontPtr) { - _texts[textId]->_fontPtr = loadFont(file); + // First try to load localized font + _texts[textId]->_fontPtr = loadFont(localized); + + // Fallback to non-localized font + if (!_texts[textId]->_fontPtr) + _texts[textId]->_fontPtr = loadFont(file); if (!_texts[textId]->_fontPtr) error("Couldn't load font '%s'", file.c_str()); @@ -1495,6 +1502,34 @@ Common::String ThemeEngine::genCacheFilename(const char *filename) { return Common::String(); } +Common::String ThemeEngine::genLocalizedFontFilename(const char *filename) { +#ifndef USE_TRANSLATION + return Common::String(filename); +#else + + Common::String result; + bool pointPassed = false; + + for (const char *p = filename; *p != 0; p++) { + if (!pointPassed) { + if (*p != '.') { + result += *p; + } else { + result += "-"; + result += TransMan.getCurrentCharset(); + result += *p; + + pointPassed = true; + } + } else { + result += *p; + } + } + + return result; +#endif +} + /********************************************************** * Static Theme XML functions diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 5f474f1a88..f0d4e2585d 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -539,6 +539,7 @@ protected: const Graphics::Font *loadFont(const Common::String &filename); const Graphics::Font *loadFontFromArchive(const Common::String &filename); Common::String genCacheFilename(const char *filename); + Common::String genLocalizedFontFilename(const char *filename); /** * Actual Dirty Screen handling function. diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 9554bdf799..086fecc123 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1,573 +1,442 @@ "" -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " +" " -" " -" " -" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +"
" +" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " -" " -" " -" " +" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " " " -" " -" " -" " -" " -" " +" " -" " " " -" " -" " -" " -" " -" " +" " -" " " " +" " " " " " -" " -" " -" " +" " +" " -" " +" " -" " -" " -" " +" " +" " " " " " -" " " " " " " " -" " -" " -" " -" " +" " +" " +" " +" " " " " " " " " " -" " -" " -" " -" " -" " +" " +" " +" " " " -" " -" " -" " +" " +" " +" " +" " " " -" " +" " +" " +" " -" " +" " +" " +" " +" " +" " +" " " " " " -" " -" " -" " -" " +" " +" " +" " -" " " " -" " -" " +" " -" " " " -" " -" " +" " +" " -" " " " -" " -" " +" " -" " " " -" " -" " +" " +" " +" " +" " +" " -" " " " -" " -" " +" " -" " -" " +" " +" " -" " " " -" " -" " +" " +" " +" " +" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " -" " " " " " -" " -" " -" " -" " +" " +" " +" " " " @@ -687,7 +612,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -698,7 +623,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -709,532 +634,624 @@ "type='SmallLabel' " "/> " " " -" " -" " +" " +" " " " " " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " +" " -" " -" " -" " -" " +" " +" " +" " +" " -" " -" " " " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " +" " -" " " " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " +" " -" " " " " " " " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " -" " -" " -" " +" " " " +" " " " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " " " -" " -" " -" " -" " -" " -" " -" " -" " " " -" " " " " " " " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " " " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " " " " " -" " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " -" " +" " +" " -" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " +" " +" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " -" " -" " -"
" -" " +" " +" " +" " +" " +" " +" " " " -" " -" " -" " -" " +" " +" " +" " +" " " " " " " " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " " " " " +" " +" " +" " " " " " " " " " " " " " " " " " " " " " " " -" " +" " " " -" " +" " " " @@ -1282,38 +1299,39 @@ " " " " " " -" " +" " " " " " " " " " " " -" " +" " +" " " " " " " " " " " " " " " " -" " -" " +" " +" " " " @@ -1321,7 +1339,7 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " @@ -1335,10 +1353,10 @@ " " " " " " -" " +" " " " " " -" " +" " " " " " " " " " -" " +" " " " @@ -1359,7 +1377,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1377,7 +1395,7 @@ " " " " " " -" " +" " " " @@ -1385,7 +1403,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1393,7 +1411,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1401,7 +1419,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1409,7 +1427,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1417,7 +1435,7 @@ "type='PopUp' " "/> " " " -" " +" " " " @@ -1431,7 +1449,7 @@ "type='Radiobutton' " "/> " " " -" " +" " " " @@ -1445,8 +1463,9 @@ " " " " " " -" " -" " +" " +" " +" " " " @@ -1457,7 +1476,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1468,7 +1487,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1479,8 +1498,8 @@ "type='SmallLabel' " "/> " " " -" " -" " +" " +" " " " @@ -1489,7 +1508,7 @@ " " " " " " -" " +" " " " @@ -1510,7 +1529,7 @@ " " -" " +" " " " @@ -1526,7 +1545,7 @@ " " " " " " -" " +" " " " @@ -1534,7 +1553,7 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " @@ -1542,7 +1561,7 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " @@ -1562,7 +1581,7 @@ " " " " " " -" " +" " " " @@ -1570,31 +1589,25 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " " " " " -" " +" " " " " " " " -" " +" " " " " " " " " " -" " +" " " " " " -" " +" " " " " " " " " " -" " +" " " " @@ -1652,7 +1665,7 @@ " " " " " " -" " +" " " " @@ -1660,7 +1673,7 @@ " " " " " " -" " +" " " " @@ -1668,7 +1681,7 @@ " " " " " " -" " +" " " " @@ -1676,43 +1689,34 @@ " " " " " " -" " -" " +" " +" " " " " " " " -" " +" " " " " " " " -" " -" " +" " " " " " " " -" " +" " " " " " " " " " -" " -" " +" " +" " " " @@ -1730,7 +1734,7 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " @@ -1738,7 +1742,7 @@ "height='Globals.Line.Height' " "/> " " " -" " +" " " " @@ -1749,55 +1753,57 @@ " " " " " " -" " +" " " " " " -" " +" " +" " " " " " -" " +" " " " " " " " -" " -" " +" " " " " " " " " " " " " " -" " +" " +" " +" " " " @@ -1808,7 +1814,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1819,7 +1825,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1830,35 +1836,33 @@ "type='SmallLabel' " "/> " " " -" " -" " +" " +" " " " " " -" " -" " +" " +" " +" " " " -" " " " " " " " " " -" " -" " -" " +" " " " @@ -1869,8 +1873,8 @@ "type='SmallLabel' " "/> " " " -" " -" " +" " +" " " " @@ -1885,15 +1889,23 @@ " " " " " " -" " -" " +" " +" " +" " " " -" " +" " +" " +" " " " " " -" " +" " " " @@ -1903,16 +1915,16 @@ " " " " " " -" " -" " +" " +" " " " " " -" " +" " " " @@ -1927,20 +1939,20 @@ " " " " " " -" " +" " " " " " " " -" " +" " " " @@ -1951,20 +1963,20 @@ " " " " " " -" " +" " " " " " " " " " " " " + + + + + + _promptEndPos)) { + // we print a prompt, if this is the first time we are called or if the + // engine wrote onto us since the last call print(PROMPT); _promptStartPos = _promptEndPos = _currentPos; } -- cgit v1.2.3 From e857cc623e86211ae0c59630342cbeea65214e6e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 16:35:20 +0000 Subject: SCI: added comment - lsl5 also has too large windows svn-id: r50450 --- engines/sci/graphics/ports.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 36f84c3582..611db1061a 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -251,6 +251,7 @@ Window *GfxPorts::newWindow(const Common::Rect &dims, const Common::Rect *restor r = dims; if (r.width() > _screen->getWidth()) { // We get invalid dimensions at least at the end of sq3 (script bug!) + // same happens very often in lsl5, sierra sci didnt fix it but it looked awful warning("fixing too large window, given left&right was %d, %d", dims.left, dims.right); r.left = 0; r.right = _screen->getWidth() - 1; -- cgit v1.2.3 From 06648cb186608e845c4dc214249b863632bbbb3c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 16:56:15 +0000 Subject: SCI: fix regression of r50422, please no refactoring without proper testing - fixes animations in all sorts of games svn-id: r50451 --- engines/sci/graphics/view.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 71261490e4..b3bc733383 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -279,10 +279,8 @@ const CelInfo *GfxView::getCelInfo(int16 loopNo, int16 celNo) const { } uint16 GfxView::getCelCount(int16 loopNo) const { -// assert(_loopCount); -// loopNo = CLIP(loopNo, 0, _loopCount - 1); - if ((loopNo < 0) || (loopNo >= _loopCount)) - return 0; + assert(_loopCount); + loopNo = CLIP(loopNo, 0, _loopCount - 1); return _loop[loopNo].celCount; } -- cgit v1.2.3 From a0f42b07ceb836226521fbf90feb50fb470d8ad8 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 28 Jun 2010 17:03:04 +0000 Subject: KYRA: change audio detection flags setting (since most users don't own a real mt-32/lapc1/cm32l/cm64 device and our emulator is incomplete) svn-id: r50452 --- engines/kyra/kyra_v1.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index be8f976053..abe13cec2b 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -105,8 +105,11 @@ Common::Error KyraEngine_v1::init() { _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume")); if (!_flags.useDigSound) { - // We prefer AdLib over MIDI, since generally AdLib is better supported - MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32); + // We prefer AdLib over MIDI in Kyra 1, since it offers MT-32 support only, most users don't have a real + // MT-32/LAPC1/CM32L/CM64 device and AdLib sounds better than our incomplete MT-32 emulator and also better than + // MT-32/GM mapping. For Kyra 2 and LoL which have real GM tracks which sound better than AdLib tracks we prefer GM + // since most users have a GM compatible device. + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_PCSPK | MDT_MIDI | MDT_ADLIB | ((_flags.gameID == GI_KYRA2 || _flags.gameID == GI_LOL) ? MDT_PREFER_GM : 0)); if (_flags.platform == Common::kPlatformFMTowns) { if (_flags.gameID == GI_KYRA1) -- cgit v1.2.3 From bc777403066e7a14b3b25d1ef4cf038723b85a02 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 18:07:40 +0000 Subject: SCI: kAnimate resetting _lastCastCount all the time svn-id: r50453 --- engines/sci/graphics/animate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 6a5bbff6bb..25c0fe6432 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -159,8 +159,8 @@ void GfxAnimate::makeSortedList(List *list) { _lastCastData = (AnimateEntry *)malloc(listCount * sizeof(AnimateEntry)); if (!_lastCastData) error("Could not allocate memory for _lastCastData"); - _lastCastCount = 0; } + _lastCastCount = 0; // Fill the list curAddress = list->first; -- cgit v1.2.3 From 473c429b5cb7f96112f752a99fc62c7d4d4d55ee Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 18:10:21 +0000 Subject: SCI: updated comment about transparent pixels in views svn-id: r50454 --- engines/sci/graphics/view.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index b3bc733383..ee9611b046 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -332,8 +332,8 @@ void GfxView::unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCou pixelNo += runLength; } } else { - // We skip over transparent pixels, so the buffer needs to be already - // filled with "it". (FIXME: What is "it" supposed to mean here?) + // We fill the buffer with transparent pixels, so that we can later skip + // over pixels to automatically have them transparent // Also some RLE compressed cels are possibly ending with the last // non-transparent pixel (is this even possible with the current code?) memset(outPtr, _loop[loopNo].cel[celNo].clearKey, pixelCount); -- cgit v1.2.3 From d8e4160f34787cb239e8073946249fcbfd8e8a34 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 20:17:43 +0000 Subject: SCI: remove clipping of volume inside SciMidiParser::setvolume svn-id: r50456 --- engines/sci/sound/midiparser_sci.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 2a86ef8942..3c2c0cb3ce 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -665,13 +665,6 @@ void MidiParser_SCI::allNotesOff() { } void MidiParser_SCI::setVolume(byte volume) { - // FIXME: This receives values > 127... throw a warning for now and clip the variable - if (volume > MUSIC_VOLUME_MAX) { - // FIXME: please write where we get an invalid volume, so we can track down the issue - error("attempted to set an invalid volume(%d)", volume); - volume = MUSIC_VOLUME_MAX; // reset - } - assert(volume <= MUSIC_VOLUME_MAX); _volume = volume; -- cgit v1.2.3 From 438e670166768df06025f50c68e2d8fbe0f93407 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 28 Jun 2010 20:31:30 +0000 Subject: Applied patch #3022511 - "qfg4 detection cleanup" svn-id: r50457 --- engines/sci/detection_tables.h | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index bad7ccc5c3..d2136666a7 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2398,7 +2398,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { }, // Quest for Glory 4 1.1 Floppy - German DOS (supplied by markcool in bug report #2723850) - // SCI interpreter version 2.000.000 (a guess?) + // Executable scanning reports "2.000.000", VERSION file reports "1.1" {"qfg4", "", { {"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301}, {"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197}, @@ -2415,27 +2415,6 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, -#if 0 - // NOTE: This version looks to be exactly the same as the English one - // Perhaps it's the English one? - - // Quest for Glory 4 - German DOS/Windows (from PCJoker 2/98) - {"qfg4", "", { - {"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246}, - {"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, -#endif - - // Quest for Glory 4 - German DOS/Windows Disk V1.1 (from PCJoker 2/89) - // SCI interpreter version 2.000.000 (a guess?) - {"qfg4", "", { - {"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301}, - {"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, #endif // Slater & Charlie go camping -- cgit v1.2.3 From 0b33cc0dab3c71d631d38742c3125bd88f4e759a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 28 Jun 2010 20:58:32 +0000 Subject: Fixed loading of saved games from the launcher svn-id: r50460 --- engines/sci/sci.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 822adb592b..fd4c4e9137 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -236,8 +236,9 @@ Common::Error SciEngine::run() { debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion())); // Check whether loading a savestate was requested - if (ConfMan.hasKey("save_slot")) { - reg_t restoreArgv[2] = { NULL_REG, make_reg(0, ConfMan.getInt("save_slot")) }; // special call (argv[0] is NULL) + int saveSlot = ConfMan.getInt("save_slot"); + if (saveSlot >= 0) { + reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL) kRestoreGame(_gamestate, 2, restoreArgv); // Initialize the game menu, if there is one. -- cgit v1.2.3 From 32a192b79ab8ed37cf0bf6fca5bcaf9ef55b21a5 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Mon, 28 Jun 2010 21:56:25 +0000 Subject: Update German translation. svn-id: r50461 --- common/messages.cpp | 60 ++++++++------ po/de_DE.po | 228 ++++++++++++++++++++++++++-------------------------- 2 files changed, 148 insertions(+), 140 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 5d861748b2..15d8356873 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -1642,12 +1642,12 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: \nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, { 4, " (Global)" }, - { 5, "C2(erstellt am" }, + { 5, "(erstellt am %s)" }, { 6, ", Fehler beim Einbinden des \366ffentlichen Verzeichnisses" }, { 7, ", \366ffentliches Verzeichnis nicht eingebunden" }, { 8, "... l\344uft..." }, @@ -1661,14 +1661,14 @@ static const PoMessageEntry _translation_de_DE[] = { { 16, "AdLib-Emulator" }, { 17, "AdLib-Emulator" }, { 18, "AdLib wird f\374r die Musik in vielen Spielen verwendet." }, - { 19, "Spiel hinzuf\374gen..." }, + { 19, "Spiel hinzuf\374gen" }, { 20, "Kantengl\344ttung (16bpp)" }, { 21, "Seitenverh\344ltnis korrigieren" }, - { 22, "Zugewiesene Taste : %s" }, - { 23, "Zugewiesene Taste : keine" }, + { 22, "Zugewiesene Taste: %s" }, + { 23, "Zugewiesene Taste: keine" }, { 24, "Audio" }, { 25, "Autom. Speichern:" }, - { 26, "C1Verf\374gbare Spiele-Engines:" }, + { 26, "Verf\374gbare Spiele-Engines:" }, { 27, "\334be~r~" }, { 28, "Tasten zuweisen" }, { 29, "Beides" }, @@ -1689,12 +1689,13 @@ static const PoMessageEntry _translation_de_DE[] = { { 44, "Zeiger nach links" }, { 45, "Zeiger nach rechts" }, { 46, "Zeiger hoch" }, + { 47, "DOSBox-OPL-Emulator" }, { 48, "DVD" }, { 49, "DVD erfolgreich eingebunden" }, { 50, "DVD nicht eingebunden" }, { 51, "Datum: " }, { 52, "Debugger" }, - { 53, "" }, + { 53, "Standard" }, { 54, "L\366schen" }, { 55, "Stromsparmodus abschalten" }, { 56, "GFX ausgeschalten" }, @@ -1716,15 +1717,16 @@ static const PoMessageEntry _translation_de_DE[] = { { 72, "Fehler beim Ausf\374hren des Spiels:" }, { 73, "Fehler beim Einbinden der DVD" }, { 74, "Extrapfad:" }, - { 75, "FM Towns" }, + { 75, "FM-Towns-Emulator" }, { 76, "Schneller Modus" }, - { 77, "C1Verwendete Funktionen:" }, + { 77, "Verwendete Funktionen:" }, { 78, "Freie Ansicht" }, { 79, "Voller Name des Spiels" }, { 80, "Vollbildmodus" }, { 81, "GC-Pad-Beschleunigung:" }, { 82, "GC-Pad-Empfindlichkeit:" }, { 83, "GFX" }, + { 84, "GM-Ger\344t:" }, { 85, "GUI-Sprache:" }, { 86, "GUI-Renderer:" }, { 87, "Spiel" }, @@ -1737,12 +1739,14 @@ static const PoMessageEntry _translation_de_DE[] = { { 94, "Grafik" }, { 95, "Grafikmodus:" }, { 96, "Hardware-Skalierung (schnell, aber schlechte Qualit\344t)" }, + { 97, "Hercules Bernsteingelb" }, + { 98, "Hercules-Gr\374n" }, { 99, "Werkzeugleiste verbergen" }, { 100, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, { 101, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, { 102, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, { 103, "Horizontale Bildverkleinerung:" }, - { 104, "FM Towns" }, + { 104, "IBM-PCjr-Emulator" }, { 105, "Kennung:" }, { 106, "Netzwerk starten" }, { 107, "Verg\366\337erung des oberen Bildschirms:" }, @@ -1762,20 +1766,21 @@ static const PoMessageEntry _translation_de_DE[] = { { 121, "Laden" }, { 122, "Spiel laden:" }, { 123, "Spielstand f\374r ausgew\344hltes Spiel laden" }, - { 124, "AdLib-Emulator" }, + { 124, "MAME-OPL-Emulator" }, { 125, "MIDI" }, { 126, "MIDI-Lautst\344rke:" }, { 127, "MT-32-Emulation" }, + { 128, "MT32-Ger\344t:" }, { 129, "Hauptbildschirm-Skalierung:" }, { 130, "Zuweisen" }, - { 131, "Durchsuchen..." }, + { 131, "Durchsuchen" }, { 132, "Men\374" }, - { 133, "Verschiedenes" }, + { 133, "Sonstiges" }, { 134, "AdLib-/MIDI-Modus" }, { 135, "DVD einbinden" }, { 136, "SMB einbinden" }, { 137, "Mausklick" }, - { 138, "Multi-Funktion" }, + { 138, "Multifunktion" }, { 139, "Musiklautst\344rke:" }, { 140, "Alles aus" }, { 141, "Name:" }, @@ -1789,7 +1794,8 @@ static const PoMessageEntry _translation_de_DE[] = { { 149, "Keine Musik" }, { 150, "Keine Spielzeit gespeichert" }, { 151, "Keine Zeit gespeichert" }, - { 152, "Keine" }, + { 152, "-" }, + { 153, "Normal (keine Skalierung)" }, { 154, "OK" }, { 155, "Ausgabefrequenz:" }, { 156, "Globale MIDI-Einstellungen \374bergehen" }, @@ -1809,6 +1815,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 170, "Spieldauer: " }, { 171, "Bitte eine Aktion ausw\344hlen" }, { 172, "Plugin-Pfad:" }, + { 173, "Bevorzugtes Ger\344t:" }, { 174, "Taste dr\374cken, um sie zuzuweisen" }, { 175, "Beenden" }, { 176, "ScummVM beenden" }, @@ -1816,7 +1823,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 178, "Lesefehler aufgetreten" }, { 179, "Tasten neu zuweisen" }, { 180, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, - { 181, "Rendermodus:" }, + { 181, "Render-Modus:" }, { 182, "Rechts" }, { 183, "Rechtsklick" }, { 184, "Rechtsklick" }, @@ -1825,7 +1832,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 187, "SMB" }, { 188, "Speichern" }, { 189, "Spielst\344nde:" }, - { 190, "Speicherpfad: " }, + { 190, "Spielst\344nde: " }, { 191, "Speichern:" }, { 192, "Suchlauf abgeschlossen!" }, { 193, "%d Ordner durchsucht..." }, @@ -1864,11 +1871,12 @@ static const PoMessageEntry _translation_de_DE[] = { { 226, "Spr." }, { 227, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, { 228, "Lautst\344rke spezieller Soundeffekte" }, - { 229, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 229, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." }, + { 230, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." }, { 231, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, { 232, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, { 233, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, - { 234, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 234, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, { 235, "Legt fest, wo die Spielst\344nde abgelegt werden." }, { 236, "Sprache" }, { 237, "Sprachlautst\344rke:" }, @@ -1888,11 +1896,11 @@ static const PoMessageEntry _translation_de_DE[] = { { 251, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, { 252, "Zeit: " }, { 253, "Zeit\374berschreitung beim Starten des Netzwerks" }, - { 254, "Gehe zu X-Position" }, - { 255, "Gehe zu Y-Position" }, + { 254, "Zu X-Position gehen" }, + { 255, "Zu Y-Position gehen" }, { 256, "Touchpad-Modus ausgeschaltet." }, { 257, "Touchpad-Modus aktiviert." }, - { 258, "Echte Roland-MT-32-Emulation" }, + { 258, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" }, { 259, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, { 260, "Unbekannt" }, { 261, "Unbekannter Fehler" }, @@ -1903,7 +1911,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 266, "Unbenannt" }, { 267, "Hoch" }, { 268, "Benutzt MIDI und AdLib zur Sounderzeugung." }, - { 269, "Benutze den Trackpad-Style f\374r Maussteuerung" }, + { 269, "Den Trackpad-Style f\374r Maussteuerung benutzen" }, { 270, "Benutzername:" }, { 271, "SDL-Treiber verwenden" }, { 272, "Vertikale Bildverkleinerung:" }, @@ -1923,10 +1931,10 @@ static const PoMessageEntry _translation_de_DE[] = { { 286, "alle 30 Minuten" }, { 287, "alle 5 Minuten" }, { 288, "\334be~r~" }, - { 289, "Spiel ~h~inzuf\374gen..." }, + { 289, "Spiel ~h~inzuf\374gen" }, { 290, "~A~bbrechen" }, { 291, "~S~chlie\337en" }, - { 292, "Spielo~p~tionen..." }, + { 292, "Spielo~p~tionen" }, { 293, "~H~ilfe" }, { 294, "~K~ampfsteuerung f\374r Indiana Jones" }, { 295, "~T~asten" }, @@ -1945,7 +1953,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 308, "~S~peichern" }, { 309, "~S~tarten" }, { 310, "\334ber~g~\344nge aktiviert" }, - { 311, "~W~assereffekte aktiviert" }, + { 311, "~W~assereffekt aktiviert" }, { 312, "~Z~ip-Modus aktiviert" }, { -1, NULL } }; diff --git a/po/de_DE.po b/po/de_DE.po index 21f4ac5ce2..a17db689cf 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,31 +7,31 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-26 20:02+0200\n" "PO-Revision-Date: 2010-06-23 19:30+0100\n" -"Last-Translator: \n" +"Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" +"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 #, fuzzy, c-format msgid "(built on %s)" -msgstr "C2(erstellt am" +msgstr "(erstellt am %s)" #: gui/about.cpp:103 #, fuzzy msgid "Features compiled in:" -msgstr "C1Verwendete Funktionen:" +msgstr "Verwendete Funktionen:" #: gui/about.cpp:112 #, fuzzy msgid "Available engines:" -msgstr "C1Verfügbare Spiele-Engines:" +msgstr "Verfügbare Spiele-Engines:" #: gui/browser.cpp:69 msgid "Go up" @@ -42,7 +42,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -73,7 +73,7 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -86,12 +86,12 @@ msgstr "Aktion ausw #: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" -msgstr "Zugewiesene Taste : %s" +msgstr "Zugewiesene Taste: %s" #: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" -msgstr "Zugewiesene Taste : keine" +msgstr "Zugewiesene Taste: keine" #: gui/KeysDialog.cpp:93 msgid "Please select an action" @@ -142,7 +142,7 @@ msgstr "" "Spiels in eine deutsche verwandeln." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 #: sound/null.cpp:42 msgid "" msgstr "" @@ -155,11 +155,11 @@ msgstr "Plattform:" msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 msgid "GFX" msgstr "GFX" @@ -167,7 +167,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:890 msgid "Audio" msgstr "Audio" @@ -175,7 +175,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:894 msgid "Volume" msgstr "Lautstärke" @@ -183,7 +183,7 @@ msgstr "Lautst msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:902 msgid "MIDI" msgstr "MIDI" @@ -191,7 +191,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:908 msgid "Paths" msgstr "Pfade" @@ -199,7 +199,7 @@ msgstr "Pfade" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:921 msgid "Extra Path:" msgstr "Extrapfad:" @@ -211,27 +211,27 @@ msgstr "Legt das Verzeichnis f msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 +#: gui/options.cpp:916 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 +#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 +#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 +#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 +#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 +#: gui/options.cpp:1074 gui/options.cpp:1173 msgid "None" -msgstr "Keine" +msgstr "-" #: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" -msgstr "" +msgstr "Standard" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1167 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -293,7 +293,7 @@ msgstr "Spielstand f #: gui/launcher.cpp:511 msgid "~A~dd Game..." -msgstr "Spiel ~h~inzufügen..." +msgstr "Spiel ~h~inzufügen" #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" @@ -303,7 +303,7 @@ msgstr "" #: gui/launcher.cpp:513 msgid "~E~dit Game..." -msgstr "Spielo~p~tionen..." +msgstr "Spielo~p~tionen" #: gui/launcher.cpp:513 msgid "Change game options" @@ -325,7 +325,7 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:713 msgid "Clear value" msgstr "Wert löschen" @@ -390,11 +390,11 @@ msgstr "ScummVM konnte keine Engine finden, um das Spiel zu starten!" #: gui/launcher.cpp:989 msgid "Mass Add..." -msgstr "Durchsuchen..." +msgstr "Durchsuchen" #: gui/launcher.cpp:990 msgid "Add Game..." -msgstr "Spiel hinzufügen..." +msgstr "Spiel hinzufügen" #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." @@ -459,74 +459,74 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:626 +#: gui/options.cpp:620 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:637 +#: gui/options.cpp:631 msgid "Render mode:" -msgstr "Rendermodus:" +msgstr "Render-Modus:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:631 gui/options.cpp:632 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:647 +#: gui/options.cpp:641 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:650 +#: gui/options.cpp:644 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:650 +#: gui/options.cpp:644 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:657 +#: gui/options.cpp:651 msgid "Preferred Device:" -msgstr "" +msgstr "Bevorzugtes Gerät:" -#: gui/options.cpp:657 +#: gui/options.cpp:651 #, fuzzy msgid "Specifies preferred sound device or sound card emulator" -msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." +msgstr "Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:658 +#: gui/options.cpp:652 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:660 +#: gui/options.cpp:654 msgid "MT32 Device:" -msgstr "" +msgstr "MT32-Gerät:" -#: gui/options.cpp:660 +#: gui/options.cpp:654 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" +msgstr "Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." -#: gui/options.cpp:662 +#: gui/options.cpp:656 msgid "GM Device:" -msgstr "" +msgstr "GM-Gerät:" -#: gui/options.cpp:662 +#: gui/options.cpp:656 #, fuzzy msgid "Specifies default sound device for General MIDI output" -msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." +msgstr "Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." -#: gui/options.cpp:694 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:705 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -534,28 +534,28 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:717 +#: gui/options.cpp:711 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:711 gui/options.cpp:712 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:722 +#: gui/options.cpp:716 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:722 +#: gui/options.cpp:716 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:725 +#: gui/options.cpp:719 msgid "True Roland MT-32 (disable GM emulation)" -msgstr "Echte Roland-MT-32-Emulation" +msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:725 +#: gui/options.cpp:719 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -563,145 +563,145 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:728 +#: gui/options.cpp:722 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:728 +#: gui/options.cpp:722 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:731 +#: gui/options.cpp:725 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:744 +#: gui/options.cpp:738 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:743 gui/options.cpp:749 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:744 gui/options.cpp:750 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:745 gui/options.cpp:751 msgid "Both" msgstr "Beides" -#: gui/options.cpp:755 +#: gui/options.cpp:749 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:756 +#: gui/options.cpp:750 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:757 +#: gui/options.cpp:751 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:761 +#: gui/options.cpp:755 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:773 +#: gui/options.cpp:767 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:780 +#: gui/options.cpp:774 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:783 +#: gui/options.cpp:777 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:777 gui/options.cpp:778 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:790 +#: gui/options.cpp:784 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:921 +#: gui/options.cpp:915 msgid "Save Path: " -msgstr "Speicherpfad: " +msgstr "Spielstände: " -#: gui/options.cpp:924 +#: gui/options.cpp:918 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:921 gui/options.cpp:922 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:931 +#: gui/options.cpp:925 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:936 +#: gui/options.cpp:930 msgid "Misc" -msgstr "Verschiedenes" +msgstr "Sonstiges" -#: gui/options.cpp:938 +#: gui/options.cpp:932 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:942 +#: gui/options.cpp:936 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:948 +#: gui/options.cpp:942 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:956 +#: gui/options.cpp:950 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:963 +#: gui/options.cpp:957 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:963 +#: gui/options.cpp:957 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:968 +#: gui/options.cpp:962 msgid "English" msgstr "English" -#: gui/options.cpp:1112 +#: gui/options.cpp:1106 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1125 +#: gui/options.cpp:1119 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1132 +#: gui/options.cpp:1126 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1141 +#: gui/options.cpp:1135 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1151 +#: gui/options.cpp:1145 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1162 +#: gui/options.cpp:1156 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -843,11 +843,11 @@ msgstr "Unbekannter Fehler" #: common/util.cpp:254 msgid "Hercules Green" -msgstr "" +msgstr "Hercules-Grün" #: common/util.cpp:255 msgid "Hercules Amber" -msgstr "" +msgstr "Hercules Bernsteingelb" #: engines/dialogs.cpp:89 msgid "~R~esume" @@ -926,16 +926,16 @@ msgstr " #: engines/mohawk/dialogs.cpp:116 msgid "~W~ater Effect Enabled" -msgstr "~W~assereffekte aktiviert" +msgstr "~W~assereffekt aktiviert" #: sound/fmopl.cpp:51 #, fuzzy msgid "MAME OPL emulator" -msgstr "AdLib-Emulator" +msgstr "MAME-OPL-Emulator" #: sound/fmopl.cpp:53 msgid "DOSBox OPL emulator" -msgstr "" +msgstr "DOSBox-OPL-Emulator" #: sound/null.h:45 msgid "No music" @@ -964,12 +964,12 @@ msgstr "PC-Lautsprecher" #: sound/softsynth/pcspk.cpp:161 #, fuzzy msgid "IBM PCjr Emulator" -msgstr "FM Towns" +msgstr "IBM-PCjr-Emulator" #: sound/softsynth/ym2612.cpp:762 #, fuzzy msgid "FM Towns Emulator" -msgstr "FM Towns" +msgstr "FM-Towns-Emulator" #: backends/keymapper/remap-dialog.cpp:49 msgid "Keymap:" @@ -987,7 +987,7 @@ msgstr " (Global)" msgid " (Game)" msgstr " (Spiel)" -#: backends/midi/windows.cpp:157 +#: backends/midi/windows.cpp:156 msgid "Windows MIDI" msgstr "Windows MIDI" @@ -1013,15 +1013,15 @@ msgstr "An Ecken anheften" #: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Touch X Offset" -msgstr "Gehe zu X-Position" +msgstr "Zu X-Position gehen" #: backends/platform/ds/arm9/source/dsoptions.cpp:75 msgid "Touch Y Offset" -msgstr "Gehe zu Y-Position" +msgstr "Zu Y-Position gehen" #: backends/platform/ds/arm9/source/dsoptions.cpp:87 msgid "Use laptop trackpad-style cursor control" -msgstr "Benutze den Trackpad-Style für Maussteuerung" +msgstr "Den Trackpad-Style für Maussteuerung benutzen" #: backends/platform/ds/arm9/source/dsoptions.cpp:88 msgid "Tap for left click, double tap right click" @@ -1075,7 +1075,7 @@ msgstr "Touchpad-Modus ausgeschaltet." #: backends/platform/wince/wince-sdl.cpp:111 #: backends/platform/wince/wince-sdl.cpp:118 msgid "Normal (no scaling)" -msgstr "" +msgstr "Normal (keine Skalierung)" #: backends/platform/symbian/src/SymbianActions.cpp:41 #: backends/platform/wince/CEActionsSmartphone.cpp:38 @@ -1117,7 +1117,7 @@ msgstr "Zone" #: backends/platform/wince/CEActionsPocket.cpp:53 #: backends/platform/wince/CEActionsSmartphone.cpp:47 msgid "Multi Function" -msgstr "Multi-Funktion" +msgstr "Multifunktion" #: backends/platform/symbian/src/SymbianActions.cpp:51 msgid "Swap character" -- cgit v1.2.3 From 58732b9df1f0451f03c2ca01e0cab48314a360d3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 28 Jun 2010 22:01:26 +0000 Subject: SCI: More changes to the code for loading from the launcher - Added support for the LSL2 menu bar object - We no longer need a reference to the init() selector - it's always the first method of the menu bar object svn-id: r50462 --- engines/sci/engine/selector.cpp | 1 - engines/sci/engine/selector.h | 2 -- engines/sci/sci.cpp | 23 +++++++++-------------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 155aa83883..00480743cc 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -161,7 +161,6 @@ void Kernel::mapSelectors() { FIND_SELECTOR(maxScale); FIND_SELECTOR(vanishingX); FIND_SELECTOR(vanishingY); - FIND_SELECTOR(init); FIND_SELECTOR(iconIndex); #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 1fff7caac8..acb7912d8d 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -103,8 +103,6 @@ struct SelectorCache { // perform Selector moveDone; ///< used for DoBresen - Selector init; ///< Used for menu initialization when loading from the launcher - // SCI1 selectors which have been moved a bit in SCI1.1, but otherwise static Selector cantBeHere; ///< Checks for movement avoidance in SCI1+. Replaces canBeHere Selector topString; ///< SCI1 scroll lists use this instead of lsTop diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index fd4c4e9137..46d33eda78 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -244,23 +244,18 @@ Common::Error SciEngine::run() { // Initialize the game menu, if there is one. // This is not done when loading, so we must do it manually. reg_t menuBarObj = _gamestate->_segMan->findObjectByName("MenuBar"); + if (menuBarObj.isNull()) + menuBarObj = _gamestate->_segMan->findObjectByName("TheMenuBar"); // LSL2 if (menuBarObj.isNull()) menuBarObj = _gamestate->_segMan->findObjectByName("menuBar"); // LSL6 if (!menuBarObj.isNull()) { - // Game menus are found in SCI0-SCI01 games (but not in demos), which had a selector vocabulary, - // thus the following code should always work (at least theoretically). - // The init selector is being moved around in all games, thus adding it to the list of static - // selectors can be tricky. An alternative way would be to call the first method of the - // MenuBar object (which is init), but this will require refactoring. - if (_kernel->_selectorCache.init != -1) { - // Reset abortScriptProcessing before initializing the game menu, so that the - // VM call performed by invokeSelector will actually run. - _gamestate->abortScriptProcessing = kAbortNone; - invokeSelector(_gamestate, menuBarObj, SELECTOR(init), 0, _gamestate->stack_base); - _gamestate->abortScriptProcessing = kAbortLoadGame; - } else { - warning("Game has a menu but not a selector vocabulary, skipping menu initialization"); - } + // Reset abortScriptProcessing before initializing the game menu, so that the + // VM call performed by invokeSelector will actually run. + _gamestate->abortScriptProcessing = kAbortNone; + Object *menuBar = _gamestate->_segMan->getObject(menuBarObj); + // Invoke the first method (init) of the menuBar object + invokeSelector(_gamestate, menuBarObj, menuBar->getFuncSelector(0), 0, _gamestate->stack_base); + _gamestate->abortScriptProcessing = kAbortLoadGame; } } -- cgit v1.2.3 From 805374ff4eadb42e78dfbda64ad6d308b372fbbc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 22:06:19 +0000 Subject: SCI: ignoring set signal on tick 0 directly in parseNextEvent instead of filtering, also now ignoring channel volume changes on tick 0 (fixes lsl5 fading of sound 274, almost at the end), fixing also fading in gk1 and enabling fading in sci32 again svn-id: r50463 --- engines/sci/sound/midiparser_sci.cpp | 29 ++++++++++++++++------------- engines/sci/sound/music.cpp | 8 -------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 3c2c0cb3ce..241405cb1e 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -160,15 +160,6 @@ byte *MidiParser_SCI::midiMixChannels() { ticker += newDelta; midiCommand = channel->data[channel->curPos++]; - if ((midiCommand == 0xCF) && (!ticker)) { - // set signal command at tick 0? - channel->curPos++; - continue; // filter it - // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately - // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to - // get immediately removed, so we currently filter it. - // TODO: find out what exactly happens in sierra sci - } if (midiCommand != kEndOfTrack) { // Write delta while (newDelta > 240) { @@ -480,8 +471,14 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { info.basic.param2 = 0; if (info.channel() == 0xF) {// SCI special case if (info.basic.param1 != kSetSignalLoop) { - _signalSet = true; - _signalToSet = info.basic.param1; + // at least in kq5/french&mac the first scene in the intro has a song that sets signal to 4 immediately + // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to + // get immediately removed, so we currently filter it. + // Sierra SCI ignores them as well at that time + if (_position._play_tick) { + _signalSet = true; + _signalToSet = info.basic.param1; + } } else { _loopTick = _position._play_tick + info.delta; } @@ -556,8 +553,14 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { } } switch (info.basic.param1) { - case 7: // channel volume change -scale it - info.basic.param2 = info.basic.param2 * _volume / MUSIC_VOLUME_MAX; + case 7: // channel volume change + if (!_position._play_tick) { + // if this is tried on tick 0, ignore the command + // this is needed for lsl5 sound resource 274, it sets channel volume to very low at the start + // sierra sci ignores those + parseNextEvent(_next_event); + return; + } break; } info.length = 0; diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index f10ff6d09a..ba103ee746 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -629,14 +629,6 @@ void MusicEntry::doFade() { fadeStep = 0; fadeCompleted = true; } -#ifdef ENABLE_SCI32 - // Disable fading for SCI32 - sound drivers have issues when fading in (gabriel knight 1 sierra title) - if (getSciVersion() >= SCI_VERSION_2) { - volume = fadeTo; - fadeStep = 0; - fadeCompleted = true; - } -#endif // Only process MIDI streams in this thread, not digital sound effects if (pMidiParser) { -- cgit v1.2.3 From ee6aebc78022008ba31a8a24441eeaeed804fd78 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 28 Jun 2010 22:08:46 +0000 Subject: Don't initialize graphics again when loading svn-id: r50464 --- engines/sci/engine/savegame.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c0ed515981..7804265d0d 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -984,8 +984,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // Message state: s->_msgState = new MessageState(s->_segMan); - g_sci->initGraphics(); - s->abortScriptProcessing = kAbortLoadGame; s->shrinkStackToBase(); } -- cgit v1.2.3 From 668d820afd77ed8efd309f1d380005ab828f9cb8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 22:14:03 +0000 Subject: SCI: its lsl5 sound resource 294, not 274 (changed comment only) svn-id: r50465 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 241405cb1e..d6c0b2080f 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -556,7 +556,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { case 7: // channel volume change if (!_position._play_tick) { // if this is tried on tick 0, ignore the command - // this is needed for lsl5 sound resource 274, it sets channel volume to very low at the start + // this is needed for lsl5 sound resource 294, it sets channel volume to very low at the start // sierra sci ignores those parseNextEvent(_next_event); return; -- cgit v1.2.3 From 15f9f37d4d15e8c8972fa0ecdbbdaf138ea2a8da Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 28 Jun 2010 22:26:28 +0000 Subject: SCI: removing ignoring of channel volume change code from r50463, the lsl5 issue was actually caused by the old volume adjust code that was also causing the issues in gk1 svn-id: r50466 --- engines/sci/sound/midiparser_sci.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index d6c0b2080f..cc09ba79f0 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -552,17 +552,6 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { break; } } - switch (info.basic.param1) { - case 7: // channel volume change - if (!_position._play_tick) { - // if this is tried on tick 0, ignore the command - // this is needed for lsl5 sound resource 294, it sets channel volume to very low at the start - // sierra sci ignores those - parseNextEvent(_next_event); - return; - } - break; - } info.length = 0; break; -- cgit v1.2.3 From 23fa2296c3a3bc009b21684538e73e0520096e68 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 28 Jun 2010 23:41:43 +0000 Subject: Fix regression from r50382, which triggered an assert when clicking "OK" in the GMM's options dialog. The problem here is that our ConfigDialog uses "" as domain name, this will result in the assert in common/config-manager.cpp:323 getting triggered, when using ConfMan.removeKey. Since setting the domain to the game's domain does not seem save according to the FIXME in gui/dialogs.cpp about this domain hackery, I decided to adapt the OptionsDialog to only call ConfMan.removeKey for "music_driver" etc., when the music driver widgets are present. This is consistent with the over uses of removeKey in OptionsDialog::close too. svn-id: r50468 --- gui/options.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 74eda9bdfc..5dba2bafd5 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -364,14 +364,16 @@ void OptionsDialog::close() { } // Audio options - if (_enableAudioSettings) { - saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); - saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); - } else { - ConfMan.removeKey("music_driver", _domain); - ConfMan.removeKey("mt32_device", _domain); - ConfMan.removeKey("gm_device", _domain); + if (_midiPopUp) { + if (_enableAudioSettings) { + saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); + } else { + ConfMan.removeKey("music_driver", _domain); + ConfMan.removeKey("mt32_device", _domain); + ConfMan.removeKey("gm_device", _domain); + } } if (_oplPopUp) { -- cgit v1.2.3 From 876b6a50060bee23b4b05205a729014a8e5455b1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 28 Jun 2010 23:59:43 +0000 Subject: Prevent "music-driver" to be set to "" on startup. This is a regression from r50158: "LAUNCHER: hopefully fixed music driver selection via command line". The problem here was that the code used operator[] of HashMap to check whether "music-driver" was specified on command line, but that on the other hand inserted a (key, value) pair with a default constructed Common::String as value. svn-id: r50469 --- base/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/main.cpp b/base/main.cpp index 7ea5344ba2..a668c453d4 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -345,7 +345,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // If we received an invalid music parameter via command line we check this here. // We can't check this before loading the music plugins. // On the other hand we cannot load the plugins before we know the file paths (in case of external plugins). - if (!settings["music-driver"].empty()) { + if (settings.contains("music-driver")) { if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(settings["music-driver"])) == MT_NULL) { warning("Unrecognized music driver '%s'\nSwitching to default device.", settings["music-driver"].c_str()); settings["music-driver"] = "auto"; -- cgit v1.2.3 From 5c424cfb41d439db5a0b3c00b7081473aa384ca6 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 29 Jun 2010 00:29:35 +0000 Subject: Fix detection of invalid music drivers specified via command line. Along with it documented that "0" is a special device handle for the invalid device. Now getDeviceHandle returns 0, when the identified device could not be found. Also getMusicType now returns MT_INVALID (newly introduced), when a non existing device was specified. svn-id: r50470 --- base/main.cpp | 6 +++--- sound/mididrv.cpp | 7 ++++--- sound/mididrv.h | 8 ++++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index a668c453d4..d40c912bf8 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -346,9 +346,9 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // We can't check this before loading the music plugins. // On the other hand we cannot load the plugins before we know the file paths (in case of external plugins). if (settings.contains("music-driver")) { - if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(settings["music-driver"])) == MT_NULL) { - warning("Unrecognized music driver '%s'\nSwitching to default device.", settings["music-driver"].c_str()); - settings["music-driver"] = "auto"; + if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(settings["music-driver"])) == MT_INVALID) { + warning("Unrecognized music driver '%s'. Switching to default device.", settings["music-driver"].c_str()); + settings["music-driver"] = "auto"; } } diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 80c8ae9c22..26d43ebfe1 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -95,7 +95,7 @@ MusicType MidiDriver::getMusicType(MidiDriver::DeviceHandle handle) { } } - return MT_AUTO; + return MT_INVALID; } Common::String MidiDriver::getDeviceString(DeviceHandle handle, DeviceStringType type) { @@ -256,10 +256,11 @@ MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &ident for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if (identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) + if (identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) { return d->getHandle(); + } } } - return getDeviceHandle("auto"); + return 0; } diff --git a/sound/mididrv.h b/sound/mididrv.h index ff6ce01295..5fffd430fb 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -50,6 +50,7 @@ namespace Common { class String; } * Music types that music drivers can implement and engines can rely on. */ enum MusicType { + MT_INVALID = -1, // Invalid output MT_AUTO = 0, // Auto MT_NULL, // Null MT_PCSPK, // PC Speaker @@ -101,6 +102,13 @@ enum MidiDriverFlags { */ class MidiDriver { public: + /** + * The device handle. + * + * The value 0 is reserved for an invalid device for now. + * TODO: Maybe we should use -1 (i.e. 0xFFFFFFFF) as + * invalid device? + */ typedef uint32 DeviceHandle; enum DeviceStringType { -- cgit v1.2.3 From 19abacc77a5e7e00f9315926a19ef2870e87a5d9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 29 Jun 2010 00:29:57 +0000 Subject: Fix fallback detection code in MidiDriver::detectDevice. It formerly only used the global "mt32_device" and "gm_device" values, but we also allow game specific values, thus we take that into account now. Also formerly the the check for the first available MT32/GM device only used the device handle of the mt32_device/gm_device instead of the list of devices it iterates over. Fixed that too. Last but not least that whole detection code looks strange to me, it seems we only use mt32_device and gm_device for fallback detection, at least when the music_driver matches it will always be used. So I wonder why we have those at all? svn-id: r50471 --- sound/mididrv.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 26d43ebfe1..c1b2331b74 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -179,11 +179,13 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { const MusicPlugin::List p = MusicMan.getPlugins(); // If only MDT_MIDI but not MDT_PREFER_MT32 or MDT_PREFER_GM is set we prefer the other devices (which will always be // detected since they are hard coded and cannot be disabled. - for (int l = (flags & (MDT_PREFER_GM | MDT_PREFER_MT32)) ? 1 : 0; l < 2; l++) { + for (int l = (flags & (MDT_PREFER_GM | MDT_PREFER_MT32)) ? 1 : 0; l < 2; ++l) { if ((flags & MDT_MIDI) && (l == 1)) { // If a preferred MT32 or GM device has been selected that device gets returned - hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"), Common::ConfigManager::kApplicationDomain)); - if (getMusicType(hdl) != MT_AUTO) { + hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"))); + + const MusicType type = getMusicType(hdl); + if (type != MT_AUTO && type != MT_INVALID) { if (flags & MDT_PREFER_MT32) // If we have a preferred MT32 device we disable the gm/mt32 mapping (more about this in mididrv.h) _forceTypeMT32 = true; @@ -195,24 +197,24 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { // and no preferred MT32 or GM device selected we arrive here. // If MT32 is preferred we try for the first available device with music type 'MT_MT32' (usually the mt32 emulator) if (flags & MDT_PREFER_MT32) { - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if (getMusicType(hdl) == MT_MT32) - return hdl; + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + if (d->getMusicType() == MT_MT32) + return d->getHandle(); } } } // Now we default to the first available device with music type 'MT_GM' - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if (getMusicType(hdl) == MT_GM || getMusicType(hdl) == MT_GS) - return hdl; + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + if (d->getMusicType() == MT_GM || d->getMusicType() == MT_GS) + return d->getHandle(); } } - } + } MusicType tp = MT_AUTO; if (flags & MDT_TOWNS) @@ -224,9 +226,9 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { else tp = MT_AUTO; - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { if (d->getMusicType() == tp) return d->getHandle(); } -- cgit v1.2.3 From a254d29741681500fffa5609c0a2f6f10339352b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 29 Jun 2010 00:30:16 +0000 Subject: Yet another slight fix for the fallback detection. Before in case MDT_PREFER_MT32 nor MDT_PREFER_GM was specified the code used "auto" as key name for ConfMan.get, instead of passing "auto" directly to getDeviceHandle. svn-id: r50472 --- sound/mididrv.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index c1b2331b74..0a2dbb4447 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -182,7 +182,12 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { for (int l = (flags & (MDT_PREFER_GM | MDT_PREFER_MT32)) ? 1 : 0; l < 2; ++l) { if ((flags & MDT_MIDI) && (l == 1)) { // If a preferred MT32 or GM device has been selected that device gets returned - hdl = getDeviceHandle(ConfMan.get((flags & MDT_PREFER_MT32) ? "mt32_device" : ((flags & MDT_PREFER_GM) ? "gm_device" : "auto"))); + if (flags & MDT_PREFER_MT32) + hdl = getDeviceHandle(ConfMan.get("mt32_device")); + else if (flags & MDT_PREFER_GM) + hdl = getDeviceHandle(ConfMan.get("gm_device")); + else + hdl = getDeviceHandle("auto"); const MusicType type = getMusicType(hdl); if (type != MT_AUTO && type != MT_INVALID) { -- cgit v1.2.3 From 36e583944fad8658948522566014b79833fc3bfc Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 29 Jun 2010 00:38:06 +0000 Subject: Return "0" in case no device was detected in MidiDriver::detectDevice. svn-id: r50473 --- sound/mididrv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 0a2dbb4447..d164864fc2 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -240,7 +240,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { } } - return hdl; + return 0; } MidiDriver *MidiDriver::createMidi(MidiDriver::DeviceHandle handle) { -- cgit v1.2.3 From 79aa49a509fd82bd3e4a97056efdc1e26913edd5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 29 Jun 2010 02:55:31 +0000 Subject: Fix the load game dialog in Riven DVD's menu, borrowed from Parallaction. svn-id: r50477 --- engines/mohawk/riven.cpp | 17 +++++++++++++---- engines/mohawk/riven.h | 1 - 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 44b7868373..77559b67e4 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -76,7 +76,6 @@ MohawkEngine_Riven::~MohawkEngine_Riven() { delete _extrasFile; delete _saveLoad; delete[] _vars; - delete _loadDialog; delete _optionsDialog; delete _rnd; delete g_atrusJournalRect1; @@ -100,8 +99,6 @@ Common::Error MohawkEngine_Riven::run() { _console = new RivenConsole(this); _saveLoad = new RivenSaveLoad(this, _saveFileMan); _externalScriptHandler = new RivenExternal(this); - _loadDialog = new GUI::SaveLoadChooser("Load Game:", "Load"); - _loadDialog->setSaveMode(false); _optionsDialog = new RivenOptionsDialog(this); _rnd = new Common::RandomSource(); @@ -600,7 +597,19 @@ void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) { } void MohawkEngine_Riven::runLoadDialog() { - runDialog(*_loadDialog); + GUI::SaveLoadChooser slc("Load Game:", "Load"); + slc.setSaveMode(false); + + Common::String gameId = ConfMan.get("gameid"); + + const EnginePlugin *plugin = 0; + EngineMan.findGame(gameId, &plugin); + + int slot = slc.runModal(plugin, ConfMan.getActiveDomainName()); + if (slot >= 0) + loadGameState(slot); + + slc.close(); } Common::Error MohawkEngine_Riven::loadGameState(int slot) { diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index 5fe0de00e9..3e2ab59597 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -128,7 +128,6 @@ private: MohawkArchive *_extrasFile; // We need a separate handle for the extra data RivenConsole *_console; RivenSaveLoad *_saveLoad; - GUI::SaveLoadChooser *_loadDialog; RivenOptionsDialog *_optionsDialog; // Stack/Card-related functions and variables -- cgit v1.2.3 From 146cc7cb3c3d00ce3d235c877d8e9e1e19434d9d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 29 Jun 2010 03:00:53 +0000 Subject: Silence a valgrind warning. svn-id: r50478 --- engines/mohawk/riven.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 77559b67e4..82be6b291b 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -52,6 +52,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _activatedSLST = false; _ignoreNextMouseUp = false; _extrasFile = NULL; + _curStack = aspit; // TODO: Add support for CD swapping -- cgit v1.2.3 From 48a107b821c21867a3627ac0cb2d072041ddcc56 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 29 Jun 2010 03:04:08 +0000 Subject: Update comment on CD swapping in Riven. svn-id: r50479 --- engines/mohawk/riven.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 82be6b291b..81e33d6513 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -54,7 +54,11 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _extrasFile = NULL; _curStack = aspit; - // TODO: Add support for CD swapping + // NOTE: We can never really support CD swapping. All of the music files + // (*_Sounds.mhk) are stored on disc 1. They are copied to the hard drive + // during install and used from there. The same goes for the extras.mhk + // file. The following directories allow Riven to be played directly + // from the DVD. const Common::FSNode gameDataDir(ConfMan.get("path")); SearchMan.addSubDirectoryMatching(gameDataDir, "all"); -- cgit v1.2.3 From 59f4c903a6fab1c60e925ce315fc077e1721eab0 Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 29 Jun 2010 03:53:06 +0000 Subject: GOB : Adding workaround for Bug #3018918 UOTODDV Reload Goblin Stuck Issue. This was present in the original interpreter. svn-id: r50480 --- engines/gob/inter_v1.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index b35e0b8a82..9e841e7e68 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -813,6 +813,14 @@ bool Inter_v1::o1_if(OpFuncParams ¶ms) { byte cmd; bool boolRes; + // WORKAROUND: Windows Gob1 OUTODDV reload goblin stuck bug present in original + if ((_vm->getGameType() == kGameTypeGob1) && (_vm->_game->_script->pos() == 11294) && + !scumm_stricmp(_vm->_game->_curTotFile, "avt00.tot") && VAR(59) == 1) { + warning("Workaround for Win Gob1 OUTODDV Reload Goblin Stuck Bug..."); + WRITE_VAR(285, 0); + WRITE_VAR(59, 0); + } + boolRes = _vm->_game->_script->evalBoolResult(); if (boolRes) { if ((params.counter == params.cmdCount) && (params.retFlag == 2)) -- cgit v1.2.3 From 02fb3f88e22b8d11a080bbf3a4db624d97d4bd37 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Tue, 29 Jun 2010 06:33:31 +0000 Subject: unzip.cpp can read uncompressed ZIP archives even when zlib is not linked in svn-id: r50482 --- common/unzip.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++------ common/unzip.h | 4 ---- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/common/unzip.cpp b/common/unzip.cpp index e46106025e..a29518a796 100644 --- a/common/unzip.cpp +++ b/common/unzip.cpp @@ -79,6 +79,30 @@ #include #endif +#else // !USE_ZLIB + +// Even when zlib is not linked in, we can still open ZIP archives and read +// uncompressed files from them. Attempted decompression of compressed files +// will result in an error. +// +// Define the constants and types used by zlib. +#define Z_ERRNO -1 +#define Z_OK 0 +#define Z_DEFLATED 8 +typedef void *voidp; +typedef unsigned int uInt; +typedef unsigned long uLong; +typedef long z_off_t; +typedef unsigned char Byte; +typedef Byte Bytef; +typedef struct { + Bytef *next_in, *next_out; + uInt avail_in, avail_out; + uLong total_out; +} z_stream; + +#endif // !USE_ZLIB + #include "common/fs.h" #include "common/unzip.h" #include "common/file.h" @@ -1044,6 +1068,7 @@ int unzOpenCurrentFile (unzFile file) { pfile_in_zip_read_info->stream.total_out = 0; if (!Store) { +#ifdef USE_ZLIB pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; @@ -1058,6 +1083,9 @@ int unzOpenCurrentFile (unzFile file) { * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ +#else + err=UNZ_BADZIPFILE; +#endif } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size; @@ -1068,9 +1096,8 @@ int unzOpenCurrentFile (unzFile file) { pfile_in_zip_read_info->stream.avail_in = (uInt)0; - s->pfile_in_zip_read = pfile_in_zip_read_info; - return UNZ_OK; + return err; } @@ -1143,9 +1170,11 @@ int unzReadCurrentFile(unzFile file, voidp buf, unsigned len) { for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); +#ifdef USE_ZLIB pfile_in_zip_read_info->crc32_data = crc32(pfile_in_zip_read_info->crc32_data, pfile_in_zip_read_info->stream.next_out, uDoCopy); +#endif // otherwise leave crc32_data as is and it won't be verified at the end pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; @@ -1154,6 +1183,7 @@ int unzReadCurrentFile(unzFile file, voidp buf, unsigned len) { pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { +#ifdef USE_ZLIB uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; @@ -1184,6 +1214,11 @@ int unzReadCurrentFile(unzFile file, voidp buf, unsigned len) { return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; +#else + // Cannot decompress the file without zlib. + err = UNZ_BADZIPFILE; + break; +#endif } } @@ -1302,16 +1337,20 @@ int unzCloseCurrentFile(unzFile file) { return UNZ_PARAMERROR; +#ifdef USE_ZLIB + // Only verify crc32_data when zlib is linked in, because otherwise crc32() is + // not defined. if (pfile_in_zip_read_info->rest_read_uncompressed == 0) { if (pfile_in_zip_read_info->crc32_data != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); +#endif free(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; free(pfile_in_zip_read_info); @@ -1466,5 +1505,3 @@ Archive *makeZipArchive(SeekableReadStream *stream) { } } // End of namespace Common - -#endif diff --git a/common/unzip.h b/common/unzip.h index 2f87a96d2b..c460840f12 100644 --- a/common/unzip.h +++ b/common/unzip.h @@ -25,8 +25,6 @@ #ifndef COMMON_UNZIP_H #define COMMON_UNZIP_H -#ifdef USE_ZLIB - namespace Common { class Archive; @@ -62,6 +60,4 @@ Archive *makeZipArchive(SeekableReadStream *stream); } // End of namespace Common -#endif // USE_ZLIB - #endif -- cgit v1.2.3 From 5e030bebcc8e1a1cf918559c729039fc50a470e7 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Tue, 29 Jun 2010 06:38:00 +0000 Subject: enable reading ZIP archives even without USE_ZLIB our module unzip.cpp can read uncompressed ZIP archives even without zlib. if some of the files inside are compressed and zlib is not linked in, an error is returned. svn-id: r50483 --- backends/vkeybd/virtual-keyboard.cpp | 2 -- gui/ThemeEngine.cpp | 9 --------- 2 files changed, 11 deletions(-) diff --git a/backends/vkeybd/virtual-keyboard.cpp b/backends/vkeybd/virtual-keyboard.cpp index bd512fe3ad..2c88322191 100644 --- a/backends/vkeybd/virtual-keyboard.cpp +++ b/backends/vkeybd/virtual-keyboard.cpp @@ -90,7 +90,6 @@ bool VirtualKeyboard::openPack(const String &packName, const FSNode &node) { return true; } -#ifdef USE_ZLIB if (node.getChild(packName + ".zip").exists()) { // compressed keyboard pack _fileArchive = makeZipArchive(node.getChild(packName + ".zip")); @@ -109,7 +108,6 @@ bool VirtualKeyboard::openPack(const String &packName, const FSNode &node) { return true; } -#endif return false; } diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 0691f8351d..30bacbb617 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -397,17 +397,12 @@ bool ThemeEngine::init() { if (!_themeArchive && !_themeFile.empty()) { Common::FSNode node(_themeFile); if (node.getName().hasSuffix(".zip") && !node.isDirectory()) { -#ifdef USE_ZLIB Common::Archive *zipArchive = Common::makeZipArchive(node); if (!zipArchive) { warning("Failed to open Zip archive '%s'.", node.getPath().c_str()); } _themeArchive = zipArchive; -#else - warning("Trying to load theme '%s' in a Zip archive without zLib support", _themeFile.c_str()); - return false; -#endif } else if (node.isDirectory()) { _themeArchive = new Common::FSDirectory(node); } @@ -1563,7 +1558,6 @@ bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String & bool foundHeader = false; if (node.getName().hasSuffix(".zip") && !node.isDirectory()) { -#ifdef USE_ZLIB Common::Archive *zipArchive = Common::makeZipArchive(node); if (zipArchive && zipArchive->hasFile("THEMERC")) { // Open THEMERC from the ZIP file. @@ -1576,7 +1570,6 @@ bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String & // reference to zipArchive anywhere. This could change if we // ever modify ZipArchive::createReadStreamForMember. delete zipArchive; -#endif } else if (node.isDirectory()) { Common::FSNode headerfile = node.getChild("THEMERC"); if (!headerfile.exists() || !headerfile.isReadable() || headerfile.isDirectory()) @@ -1672,7 +1665,6 @@ void ThemeEngine::listUsableThemes(const Common::FSNode &node, Common::List_gamestate) _engine->_gamestate->_sound.sfx_suspend(true); #endif - if (_engine->_gamestate && _engine->_gamestate->_soundCmd) - _engine->_gamestate->_soundCmd->pauseAll(true); + if (g_sci && g_sci->_soundCmd) + g_sci->_soundCmd->pauseAll(true); } void Console::postEnter() { @@ -228,8 +228,8 @@ void Console::postEnter() { if (_engine->_gamestate) _engine->_gamestate->_sound.sfx_suspend(false); #endif - if (_engine->_gamestate && _engine->_gamestate->_soundCmd) - _engine->_gamestate->_soundCmd->pauseAll(false); + if (g_sci && g_sci->_soundCmd) + g_sci->_soundCmd->pauseAll(false); if (!_videoFile.empty()) { _engine->_gfxCursor->kernelHide(); @@ -1662,7 +1662,7 @@ bool Console::cmdSongLib(int argc, const char **argv) { } while (seeker); DebugPrintf("\n"); #else - _engine->_gamestate->_soundCmd->printPlayList(this); + g_sci->_soundCmd->printPlayList(this); #endif return true; @@ -1683,7 +1683,7 @@ bool Console::cmdSongInfo(int argc, const char **argv) { return true; } - _engine->_gamestate->_soundCmd->printSongInfo(addr, this); + g_sci->_soundCmd->printSongInfo(addr, this); return true; } @@ -1702,7 +1702,7 @@ bool Console::cmdStartSound(int argc, const char **argv) { return true; } - _engine->_gamestate->_soundCmd->startNewSound(number); + g_sci->_soundCmd->startNewSound(number); return false; } @@ -1743,9 +1743,9 @@ bool Console::cmdToggleSound(int argc, const char **argv) { newState.toLowercase(); if (newState == "play") - _engine->_gamestate->_soundCmd->playSound(id); + g_sci->_soundCmd->playSound(id); else if (newState == "stop") - _engine->_gamestate->_soundCmd->stopSound(id); + g_sci->_soundCmd->stopSound(id); else DebugPrintf("New state can either be 'play' or 'stop'"); #endif @@ -1755,7 +1755,7 @@ bool Console::cmdToggleSound(int argc, const char **argv) { bool Console::cmdStopAllSounds(int argc, const char **argv) { #ifndef USE_OLD_MUSIC_FUNCTIONS - _engine->_gamestate->_soundCmd->stopAllSounds(); + g_sci->_soundCmd->stopAllSounds(); #endif DebugPrintf("All sounds have been stopped\n"); diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index e38550adee..bc8ddc34fc 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -156,7 +156,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { // like SCI01 and later do with cmdUpdateSoundCues. kGetEvent is called // quite often, so emulate the SCI01 behavior of cmdUpdateSoundCues with // this call - s->_soundCmd->updateSci0Cues(); + g_sci->_soundCmd->updateSci0Cues(); } #endif diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 0172b005ac..3d8869e89e 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -39,7 +39,7 @@ namespace Sci { * Used for synthesized music playback */ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { - return s->_soundCmd->parseCommand(argc, argv, s->r_acc); + return g_sci->_soundCmd->parseCommand(argc, argv, s->r_acc); } reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 7804265d0d..bf7b88b699 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -385,7 +385,7 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { #ifdef USE_OLD_MUSIC_FUNCTIONS sync_songlib(s, _sound._songlib); #else - _soundCmd->syncPlayList(s); + g_sci->_soundCmd->syncPlayList(s); #endif } @@ -978,7 +978,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_sound._suspended = s->_sound._suspended; reconstruct_sounds(s); #else - s->_soundCmd->reconstructPlayList(meta.savegame_version); + g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); #endif // Message state: diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 9bd8f380a1..f13a44e704 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -87,7 +87,6 @@ void EngineState::reset(bool isRestoring) { if (!isRestoring) { _memorySegmentSize = 0; - _soundCmd = 0; _fileHandles.resize(5); diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 2fcad5b2e4..07843a68e3 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -109,7 +109,6 @@ public: SfxState _sound; /**< sound subsystem */ int sfx_init_flags; /**< flags the sfx subsystem was initialised with */ #endif - SoundCommandParser *_soundCmd; uint32 gameStartTime; /**< The time at which the interpreter was started */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 46d33eda78..e90ca9de5d 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -154,6 +154,7 @@ SciEngine::~SciEngine() { delete _gfxScreen; delete _audio; + delete _soundCmd; delete _kernel; delete _vocabulary; delete _console; @@ -161,7 +162,6 @@ SciEngine::~SciEngine() { delete _gfxMacIconBar; delete _eventMan; - delete _gamestate->_soundCmd; delete _gamestate->_segMan; delete _gamestate; delete _resMan; // should be deleted last @@ -216,16 +216,14 @@ Common::Error SciEngine::run() { return Common::kUnknownError; } - _kernel->loadKernelNames(_features); // Must be called after game_init() - script_adjust_opcode_formats(); - SciVersion soundVersion = _features->detectDoSoundType(); - - _gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, soundVersion); + // Must be called after game_init(), as they use _features + _kernel->loadKernelNames(_features); + _soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, _features->detectDoSoundType()); #ifdef USE_OLD_MUSIC_FUNCTIONS - initGameSound(0, soundVersion); + initGameSound(0, _features->detectDoSoundType()); #endif syncSoundSettings(); @@ -463,7 +461,7 @@ void SciEngine::exitGame() { initGameSound(SFX_STATE_FLAG_NOSOUND, _features->detectDoSoundType()); #else _audio->stopAllAudio(); - _gamestate->_soundCmd->clearPlayList(); + g_sci->_soundCmd->clearPlayList(); #endif } @@ -562,9 +560,9 @@ void SciEngine::syncSoundSettings() { int soundVolumeMusic = (mute ? 0 : ConfMan.getInt("music_volume")); - if (_gamestate && _gamestate->_soundCmd) { + if (_gamestate && g_sci->_soundCmd) { int vol = (soundVolumeMusic + 1) * SoundCommandParser::kMaxSciVolume / Audio::Mixer::kMaxMixerVolume; - _gamestate->_soundCmd->setMasterVolume(vol); + g_sci->_soundCmd->setMasterVolume(vol); } #endif } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index f60aad67a7..d7ca1345bf 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -52,6 +52,7 @@ class Kernel; class GameFeatures; class Console; class AudioPlayer; +class SoundCommandParser; class EventManager; class GfxAnimate; @@ -291,6 +292,7 @@ public: #endif AudioPlayer *_audio; + SoundCommandParser *_soundCmd; GameFeatures *_features; private: -- cgit v1.2.3 From 316e96df2b48b1986488bfd57db37b9708f3e4ca Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 29 Jun 2010 09:01:17 +0000 Subject: SCI: Removed reg_t_EqualTo, since reg_t already defines an equals operator svn-id: r50485 --- engines/sci/engine/gc.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/engines/sci/engine/gc.h b/engines/sci/engine/gc.h index 9f9347ca18..cfae517790 100644 --- a/engines/sci/engine/gc.h +++ b/engines/sci/engine/gc.h @@ -33,12 +33,6 @@ namespace Sci { -struct reg_t_EqualTo { - bool operator()(const reg_t& x, const reg_t& y) const { - return (x.segment == y.segment) && (x.offset == y.offset); - } -}; - struct reg_t_Hash { uint operator()(const reg_t& x) const { return (x.segment << 3) | x.offset; @@ -48,7 +42,7 @@ struct reg_t_Hash { /* * The reg_t_hash_map is actually really a hashset */ -typedef Common::HashMap reg_t_hash_map; +typedef Common::HashMap reg_t_hash_map; /** * Finds all used references and normalises them to their memory addresses -- cgit v1.2.3 From 0b470dde636f4706a9f56c13364d87a76dd9ec86 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 29 Jun 2010 09:02:59 +0000 Subject: SCI: Some cleanup of the GC code. The version of push() that pushes arrays inside WorklistManager has been renamed to pushArray(), so that it's more apparent where arrays are pushed. svn-id: r50486 --- engines/sci/engine/gc.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 3c8c1f17a8..3dd7acfa1c 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -45,7 +45,7 @@ struct WorklistManager { _worklist.push_back(reg); } - void push(const Common::Array &tmp) { + void pushArray(const Common::Array &tmp) { for (Common::Array::const_iterator it = tmp.begin(); it != tmp.end(); ++it) push(*it); } @@ -82,22 +82,19 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { wm.push(s->r_prev); // Init: Value Stack // We do this one by hand since the stack doesn't know the current execution stack - Common::List::iterator iter; - { - iter = s->_executionStack.reverse_begin(); + Common::List::iterator iter = s->_executionStack.reverse_begin(); - // Skip fake kernel stack frame if it's on top - if (((*iter).type == EXEC_STACK_TYPE_KERNEL)) - --iter; + // Skip fake kernel stack frame if it's on top + if (((*iter).type == EXEC_STACK_TYPE_KERNEL)) + --iter; - assert((iter != s->_executionStack.end()) && ((*iter).type != EXEC_STACK_TYPE_KERNEL)); + assert((iter != s->_executionStack.end()) && ((*iter).type != EXEC_STACK_TYPE_KERNEL)); - ExecStack &xs = *iter; - reg_t *pos; + ExecStack &xs = *iter; + reg_t *pos; - for (pos = s->stack_base; pos < xs.sp; pos++) - wm.push(*pos); - } + for (pos = s->stack_base; pos < xs.sp; pos++) + wm.push(*pos); debugC(2, kDebugLevelGC, "[GC] -- Finished adding value stack"); @@ -117,15 +114,16 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { debugC(2, kDebugLevelGC, "[GC] -- Finished adding execution stack"); // Init: Explicitly loaded scripts - for (i = 1; i < segMan->_heap.size(); i++) + for (i = 1; i < segMan->_heap.size(); i++) { if (segMan->_heap[i] && segMan->_heap[i]->getType() == SEG_TYPE_SCRIPT) { Script *script = (Script *)segMan->_heap[i]; if (script->getLockers()) { // Explicitly loaded? - wm.push(script->listObjectReferences()); + wm.pushArray(script->listObjectReferences()); } } + } debugC(2, kDebugLevelGC, "[GC] -- Finished explicitly loaded scripts, done with root set"); @@ -138,7 +136,7 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { debugC(2, kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment]) { // Valid heap object? Find its outgoing references! - wm.push(segMan->_heap[reg.segment]->listAllOutgoingReferences(reg)); + wm.pushArray(segMan->_heap[reg.segment]->listAllOutgoingReferences(reg)); } } } -- cgit v1.2.3 From f75a6a6f479dbde58fc0e9778d4811ca9a05419f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 10:39:13 +0000 Subject: SCI: print out actual and supposed parameter types when having a kernel call signature mismatch svn-id: r50487 --- engines/sci/engine/kernel.cpp | 96 ++++++++++++++++++++++++++++++++++++------- engines/sci/engine/kernel.h | 3 ++ 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9bf0371a7a..75eadb9a64 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -669,40 +669,108 @@ int Kernel::findRegType(reg_t reg) { } } +struct SignatureDebugType { + char typeCheck; + const char *text; +}; + +static const SignatureDebugType signatureDebugTypeList[] = { + { KSIG_NULL, "null" }, + { KSIG_ARITHMETIC, "value" }, + { KSIG_OBJECT, "object" }, + { KSIG_REF, "reference" }, + { KSIG_LIST, "list" }, + { KSIG_NODE, "node" }, + { 0, NULL } +}; + +static void kernelSignatureDebugType(const char type) { + bool firstPrint = true; + + const SignatureDebugType *list = signatureDebugTypeList; + while (list->typeCheck) { + if (type & list->typeCheck) { + if (!firstPrint) + printf(", "); + printf("%s", list->text); + firstPrint = false; + } + list++; + } +} + +// Shows kernel call signature and current arguments for debugging purposes +void Kernel::signatureDebug(const char *sig, int argc, const reg_t *argv) { + int argnr = 0; + while (*sig || argc) { + printf("parameter %d: ", argnr++); + if (argc) { + reg_t parameter = *argv; + printf("%04x:%04x (", PRINT_REG(parameter)); + kernelSignatureDebugType(findRegType(parameter)); + printf(")"); + argv++; + argc--; + } else { + printf("not passed"); + } + if (*sig) { + const char signature = *sig; + if ((signature & KSIG_ANY) == KSIG_ANY) { + printf(", may be any"); + } else { + printf(", should be "); + kernelSignatureDebugType(signature); + } + if (signature & KSIG_ELLIPSIS) + printf(" (optional)"); + sig++; + } + printf("\n"); + } +} + bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { + const char *checkSig = sig; + const reg_t *checkParam = argv; + int checkCount = argc; // Always "match" if no signature is given if (!sig) return true; - while (*sig && argc) { - if ((*sig & KSIG_ANY) != KSIG_ANY) { - int type = findRegType(*argv); + while (*checkSig && checkCount) { + if ((*checkSig & KSIG_ANY) != KSIG_ANY) { + int type = findRegType(*checkParam); if (!type) { - warning("[KERN] Could not determine type of ref %04x:%04x; failing signature check", PRINT_REG(*argv)); + warning("[KERNEL] call signature: couldn't determine type of ref %04x:%04x", PRINT_REG(*argv)); + signatureDebug(sig, argc, argv); return false; } - if (!(type & *sig)) { - warning("kernel_matches_signature: %d args left, is %d, should be %d", argc, type, *sig); + if (!(type & *checkSig)) { + warning("[KERNEL] call signature: %d args left, is %d, should be %d", argc, type, *sig); + signatureDebug(sig, argc, argv); return false; } } - if (!(*sig & KSIG_ELLIPSIS)) - ++sig; - ++argv; - --argc; + if (!(*checkSig & KSIG_ELLIPSIS)) + ++checkSig; + ++checkParam; + --checkCount; } - if (argc) { - warning("kernel_matches_signature: too many arguments"); + if (checkCount) { + warning("[KERNEL] call signature: too many arguments"); + signatureDebug(sig, argc, argv); return false; // Too many arguments } - if (*sig == 0 || (*sig & KSIG_ELLIPSIS)) + if (*checkSig == 0 || (*checkSig & KSIG_ELLIPSIS)) return true; - warning("kernel_matches_signature: too few arguments"); + warning("[KERNEL] call signature: too few arguments"); + signatureDebug(sig, argc, argv); return false; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index a347e90d1a..6f7b0d569d 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -169,6 +169,9 @@ public: */ bool signatureMatch(const char *sig, int argc, const reg_t *argv); + // Prints out debug information in case a signature check fails + void signatureDebug(const char *sig, int argc, const reg_t *argv); + /** * Determines the type of the object indicated by reg. * @param reg register to check -- cgit v1.2.3 From b91ba9c56ea0bad8ae194149bfb2b370c8f01a95 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 10:40:24 +0000 Subject: Bugfixes to reading in the animation font name correctly, as well as converted some Common::String usage to char buffers to fix incorrect String usage svn-id: r50488 --- engines/m4/animation.cpp | 40 +++++++++++++++++++++++++--------------- engines/m4/font.cpp | 25 ++++++++++++++++--------- engines/m4/font.h | 8 ++++---- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 4dc645991e..192c096640 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -57,10 +57,10 @@ MadsAnimation::~MadsAnimation() { if (_field12) { _view->_spriteSlots.deleteSprites(_spriteListIndexes[_spriteListIndex]); } - - delete _font; } +#define FILENAME_SIZE 13 + /** * Initialises and loads the data of an animation */ @@ -93,25 +93,35 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S _scrollTicks = animStream->readUint16LE(); animStream->skip(8); - animStream->read(buffer, 13); - _interfaceFile = Common::String(buffer, 13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _interfaceFile = Common::String(buffer); for (int i = 0; i < 10; ++i) { - animStream->read(buffer, 13); - _spriteSetNames[i] = Common::String(buffer, 13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _spriteSetNames[i] = Common::String(buffer); } animStream->skip(81); - animStream->read(buffer, 13); - _lbmFilename = Common::String(buffer, 13); - animStream->read(buffer, 13); - _spritesFilename = Common::String(buffer, 13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _lbmFilename = Common::String(buffer); + + animStream->skip(365); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _spritesFilename = Common::String(buffer); + animStream->skip(48); - animStream->read(buffer, 13); - _soundName = Common::String(buffer, 13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _soundName = Common::String(buffer); + animStream->skip(26); - animStream->read(buffer, 13); - Common::String fontResource(buffer, 13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + Common::String fontResource(buffer); if (_animMode == 4) flags |= 0x4000; @@ -205,7 +215,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S fontName += fontResource; if (fontName != "") - _font = _vm->_font->getFont(fontName); + _font = _vm->_font->getFont(fontName.c_str()); else warning("Attempted to set a font with an empty name"); } diff --git a/engines/m4/font.cpp b/engines/m4/font.cpp index 4afa158976..b5965732e5 100644 --- a/engines/m4/font.cpp +++ b/engines/m4/font.cpp @@ -35,27 +35,34 @@ FontManager::~FontManager() { _entries.clear(); } -Font *FontManager::getFont(const Common::String &filename) { +Font *FontManager::getFont(const char *filename) { + // Append an extension if the filename doesn't already have one + char buffer[20]; + strncpy(buffer, filename, 19); + if (!strchr(buffer, '.')) + strcat(buffer, ".ff"); + // Check if the font is already loaded - for (uint i = 0; i < _entries.size(); ++i) - { - if (_entries[i]->_filename.equals(filename)) + for (uint i = 0; i < _entries.size(); ++i) { + if (!strcmp(_entries[i]->_filename, buffer)) return _entries[i]; } - Font *f = new Font(_vm, filename); + Font *f = new Font(_vm, buffer); _entries.push_back(f); return f; } -void FontManager::setFont(const Common::String &filename) { +void FontManager::setFont(const char *filename) { _currentFont = getFont(filename); } //-------------------------------------------------------------------------- -Font::Font(MadsM4Engine *vm, const Common::String &filename) : _vm(vm), _filename(filename) { +Font::Font(MadsM4Engine *vm, const char *filename) : _vm(vm) { _sysFont = true; + strncpy(_filename, filename, 19); + _filename[19] = '\0'; //TODO: System font _fontColors[0] = _vm->_palette->BLACK; @@ -66,9 +73,9 @@ Font::Font(MadsM4Engine *vm, const Common::String &filename) : _vm(vm), _filenam _sysFont = false; if (_vm->isM4()) - setFontM4(filename.c_str()); + setFontM4(filename); else - setFontMads(filename.c_str()); + setFontMads(filename); } void Font::setFontM4(const char *filename) { diff --git a/engines/m4/font.h b/engines/m4/font.h index ca47848c61..19d15faa1e 100644 --- a/engines/m4/font.h +++ b/engines/m4/font.h @@ -59,7 +59,7 @@ namespace M4 { class Font { public: - Font(MadsM4Engine *vm, const Common::String &filename); + Font(MadsM4Engine *vm, const char *filename); ~Font(); void setColour(uint8 colour); @@ -73,7 +73,7 @@ public: return write(surface, text, x, y, width, spaceWidth, _fontColors); } public: - const Common::String _filename; + char _filename[20]; private: void setFontM4(const char *filename); void setFontMads(const char *filename); @@ -108,8 +108,8 @@ public: FontManager(MadsM4Engine *vm): _vm(vm) { _currentFont = NULL; } ~FontManager(); - Font *getFont(const Common::String &filename); - void setFont(const Common::String &filename); + Font *getFont(const char *filename); + void setFont(const char *filename); Font *current() { assert(_currentFont); -- cgit v1.2.3 From eb4a48bfd99e97540d553ffd51eb5b24d9c05486 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 10:52:59 +0000 Subject: Reserved palette ranges used by on-screen messages svn-id: r50489 --- engines/m4/mads_anim.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index d8976241e1..b7aa8eefb5 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -466,6 +466,10 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): // Set up system palette colors _vm->_palette->setMadsSystemPalette(); + // Block reserved palette ranges + _vm->_palette->blockRange(16, 2); + _vm->_palette->blockRange(250, 4); + clear(); _backgroundSurface.clear(); -- cgit v1.2.3 From 841356ac80a869b199b65e169ee3aa361d657d37 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 11:09:33 +0000 Subject: Added loading of the correct DSR file at the start of each animation scene svn-id: r50490 --- engines/m4/animation.cpp | 10 +++++++++- engines/m4/animation.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 192c096640..28853938ae 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -118,7 +118,11 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S buffer[FILENAME_SIZE] = '\0'; _soundName = Common::String(buffer); - animStream->skip(26); + animStream->skip(13); + animStream->read(buffer, FILENAME_SIZE); + buffer[FILENAME_SIZE] = '\0'; + _dsrName = Common::String(buffer); + animStream->read(buffer, FILENAME_SIZE); buffer[FILENAME_SIZE] = '\0'; Common::String fontResource(buffer); @@ -220,6 +224,10 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S warning("Attempted to set a font with an empty name"); } + // If a speech file is specified, then load it + if (!_dsrName.empty()) + _vm->_sound->loadDSRFile(_dsrName.c_str()); + // Load all the sprite sets for the animation for (int i = 0; i < spriteListCount; ++i) { if (_field12 && (i == _spriteListIndex)) diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 135618d7e2..21fa411426 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -90,6 +90,7 @@ private: Common::String _lbmFilename; Common::String _spritesFilename; Common::String _soundName; + Common::String _dsrName; Common::Array _spriteListIndexes; int _currentFrame, _oldFrameEntry; -- cgit v1.2.3 From c1176498f146f01832bc4d98b477f4479302cd4f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 11:15:21 +0000 Subject: Removed the old hardcoded calls to loadDSRFile svn-id: r50491 --- engines/m4/m4.cpp | 9 --------- engines/m4/mads_menus.cpp | 1 - 2 files changed, 10 deletions(-) diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index f1506598d2..fc1caec883 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -568,15 +568,6 @@ Common::Error MadsEngine::run() { _viewManager->systemHotkeys().add(Common::KEYCODE_ESCAPE, &escapeHotkeyHandler); _viewManager->systemHotkeys().add(Common::KEYCODE_KP_MULTIPLY, &textviewHotkeyHandler); - // Load the general game SFX/voices - if (getGameType() == GType_RexNebular) { - _sound->loadDSRFile("rex009.dsr"); - } else if (getGameType() == GType_Phantom) { - _sound->loadDSRFile("phan009.dsr"); - } else if (getGameType() == GType_DragonSphere) { - _sound->loadDSRFile("drag009.dsr"); - } - uint32 nextFrame = g_system->getMillis(); while (!_events->quitFlag) { eventHandler(); diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index 0addfc57cb..d7d9cf4150 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -309,7 +309,6 @@ void RexMainMenuView::handleAction(MadsGameAction action) { return; case SHOW_INTRO: - vm->_sound->loadDSRFile("act002.dsr"); vm->_viewManager->showAnimView("@rexopen"); break; -- cgit v1.2.3 From 5f2c184e4ef2e5519645b699b5dafa27148c59f4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 11:26:48 +0000 Subject: Changed reading of sprite frame depths to signed bytes - this fixes the problem with the Slippery Pig not showing up in the landing scene in the intro sequence svn-id: r50492 --- engines/m4/animation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 28853938ae..51d3970e12 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -183,7 +183,7 @@ void MadsAnimation::initialise(const Common::String &filename, uint16 flags, M4S rec.spriteSlot.frameNumber = animStream->readUint16LE(); rec.spriteSlot.xp = animStream->readSint16LE(); rec.spriteSlot.yp = animStream->readSint16LE(); - rec.spriteSlot.depth = animStream->readByte(); + rec.spriteSlot.depth = animStream->readSByte(); rec.spriteSlot.scale = (int8)animStream->readByte(); _frameEntries.push_back(rec); -- cgit v1.2.3 From c96d44d928a2cb47e70e428b4e61bcf80ceda42b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 29 Jun 2010 11:51:05 +0000 Subject: Added code to properly detect when an animation sequence is complete svn-id: r50493 --- engines/m4/mads_anim.cpp | 21 ++++++++++++++------- engines/m4/mads_anim.h | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index b7aa8eefb5..ebc684bec4 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -460,6 +460,7 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): _activeAnimation = NULL; _bgLoadFlag = true; _startFrame = -1; + _scriptDone = false; reset(); @@ -519,7 +520,7 @@ bool AnimviewView::onEvent(M4EventType eventType, int32 param, int x, int y, boo void AnimviewView::updateState() { MadsView::update(); - if (!_script) + if (!_script || _scriptDone) return; if (!_activeAnimation) { @@ -537,16 +538,16 @@ void AnimviewView::updateState() { _backgroundSurface.reset(); clearLists(); - // Check if script is finished - if (_script->eos() || _script->err()) { - scriptDone(); - return; - } - // Reset flags _startFrame = -1; readNextCommand(); + + // Check if script is finished + if (_scriptDone) { + scriptDone(); + return; + } } refresh(); @@ -589,6 +590,12 @@ static bool tempFlag = true;//****DEBUG - Temporarily allow me to skip several i break; } + if (!_currentLine[0]) { + // A blank line at this point means that the end of the animation has been reached + _scriptDone = true; + return; + } + if (strchr(_currentLine, '.') == NULL) strcat(_currentLine, ".aa"); diff --git a/engines/m4/mads_anim.h b/engines/m4/mads_anim.h index 78cc8727f8..b33ea24071 100644 --- a/engines/m4/mads_anim.h +++ b/engines/m4/mads_anim.h @@ -81,6 +81,7 @@ class AnimviewView : public View, MadsView { private: char _resourceName[80]; Common::SeekableReadStream *_script; + bool _scriptDone; uint32 _previousUpdate; char _currentLine[80]; M4Surface _backgroundSurface; -- cgit v1.2.3 From a3a1499444654ed30aa13c0ab753b0916245f865 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 29 Jun 2010 12:56:22 +0000 Subject: Replace some code with constructs that work on Android pre-1.6. Add a boolean for disabling the "no plugins found" warning. svn-id: r50494 --- .../org/inodes/gus/scummvm/ScummVMActivity.java | 21 +++++++++++++++++---- .../android/org/inodes/gus/scummvm/Unpacker.java | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java index ba3c058ae4..b37b2b8a52 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java @@ -32,14 +32,27 @@ public class ScummVMActivity extends Activity { private class MyScummVM extends ScummVM { private boolean scummvmRunning = false; + private boolean usingSmallScreen() { + // Multiple screen sizes came in with Android 1.6. Have + // to use reflection in order to continue supporting 1.5 + // devices :( + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + try { + // This 'density' term is very confusing. + int DENSITY_LOW = metrics.getClass().getField("DENSITY_LOW").getInt(null); + int densityDpi = metrics.getClass().getField("densityDpi").getInt(metrics); + return densityDpi <= DENSITY_LOW; + } catch (Exception e) { + return false; + } + } + public MyScummVM() { super(ScummVMActivity.this); // Enable ScummVM zoning on 'small' screens. - // This 'density' term is very confusing. - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(metrics); - enableZoning(metrics.densityDpi <= DisplayMetrics.DENSITY_LOW); + enableZoning(usingSmallScreen()); } @Override diff --git a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java index efa3e1d2ef..7280aac7d4 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java +++ b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java @@ -34,6 +34,7 @@ import java.util.zip.ZipFile; import java.util.zip.ZipEntry; public class Unpacker extends Activity { + private final static boolean PLUGINS_ENABLED = true; private final static String META_NEXT_ACTIVITY = "org.inodes.gus.unpacker.nextActivity"; private ProgressBar mProgress; @@ -79,7 +80,6 @@ public class Unpacker extends Activity { if (cn != null) { final Intent origIntent = getIntent(); Intent intent = new Intent(); - intent.setPackage(origIntent.getPackage()); intent.setComponent(cn); if (origIntent.getExtras() != null) intent.putExtras(origIntent.getExtras()); @@ -294,7 +294,7 @@ public class Unpacker extends Activity { Intent intent = new Intent(ScummVMApplication.ACTION_PLUGIN_QUERY); List plugins = getPackageManager() .queryBroadcastReceivers(intent, 0); - if (plugins.isEmpty()) { + if (PLUGINS_ENABLED && plugins.isEmpty()) { // No plugins installed AlertDialog.Builder alert = new AlertDialog.Builder(this) .setTitle(R.string.no_plugins_title) -- cgit v1.2.3 From 82d0ee7f779ec6db537030e8a5cfe83abc6974e0 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 29 Jun 2010 13:16:07 +0000 Subject: Update icons to versions with much softer anti-aliasing. fingolfin++ for his good eyes. svn-id: r50495 --- dists/android/res/drawable/scummvm.png | Bin 4390 -> 6502 bytes dists/android/res/drawable/scummvm_big.png | Bin 26098 -> 33931 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dists/android/res/drawable/scummvm.png b/dists/android/res/drawable/scummvm.png index 9944876864..d48cf7f6e8 100644 Binary files a/dists/android/res/drawable/scummvm.png and b/dists/android/res/drawable/scummvm.png differ diff --git a/dists/android/res/drawable/scummvm_big.png b/dists/android/res/drawable/scummvm_big.png index b0db57ea0b..2c7a8c932d 100644 Binary files a/dists/android/res/drawable/scummvm_big.png and b/dists/android/res/drawable/scummvm_big.png differ -- cgit v1.2.3 From 32b69ccd9dc76f5d0750d23150fac5f5783134ca Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 14:54:15 +0000 Subject: SCI: Simplify GfxAnimate code, get rid of _listData svn-id: r50496 --- engines/sci/graphics/animate.cpp | 158 ++++++++++++++------------------------- engines/sci/graphics/animate.h | 11 +-- 2 files changed, 61 insertions(+), 108 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 25c0fe6432..d0103c9752 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -50,15 +50,10 @@ GfxAnimate::GfxAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, Gfx } GfxAnimate::~GfxAnimate() { - free(_listData); - free(_lastCastData); } void GfxAnimate::init() { - _listData = NULL; - _listCount = 0; - _lastCastData = NULL; - _lastCastCount = 0; + _lastCastData.clear(); _ignoreFastCast = false; // fastCast object is not found in any SCI games prior SCI1 @@ -73,7 +68,7 @@ void GfxAnimate::init() { } void GfxAnimate::disposeLastCast() { - _lastCastCount = 0; + _lastCastData.clear(); } bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { @@ -115,93 +110,64 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { return true; } -bool sortHelper(const AnimateEntry* entry1, const AnimateEntry* entry2) { - if (entry1->y == entry2->y) { +bool sortHelper(const AnimateEntry &entry1, const AnimateEntry &entry2) { + if (entry1.y == entry2.y) { // if both y and z are the same, use the order we were given originally // this is needed for special cases like iceman room 35 - if (entry1->z == entry2->z) - return entry1->givenOrderNo < entry2->givenOrderNo; + if (entry1.z == entry2.z) + return entry1.givenOrderNo < entry2.givenOrderNo; else - return entry1->z < entry2->z; + return entry1.z < entry2.z; } - return entry1->y < entry2->y; + return entry1.y < entry2.y; } void GfxAnimate::makeSortedList(List *list) { reg_t curAddress = list->first; Node *curNode = _s->_segMan->lookupNode(curAddress); - reg_t curObject; - AnimateEntry *listEntry; - int16 listNr, listCount = 0; - - // Count the list entries - while (curNode) { - listCount++; - curAddress = curNode->succ; - curNode = _s->_segMan->lookupNode(curAddress); - } + int16 listNr; + // Clear lists _list.clear(); - - // No entries -> exit immediately - if (listCount == 0) - return; - - // Adjust list size, if needed - if ((_listData == NULL) || (_listCount < listCount)) { - free(_listData); - _listData = (AnimateEntry *)malloc(listCount * sizeof(AnimateEntry)); - if (!_listData) - error("Could not allocate memory for _listData"); - _listCount = listCount; - - free(_lastCastData); - _lastCastData = (AnimateEntry *)malloc(listCount * sizeof(AnimateEntry)); - if (!_lastCastData) - error("Could not allocate memory for _lastCastData"); - } - _lastCastCount = 0; + _lastCastData.clear(); // Fill the list - curAddress = list->first; - curNode = _s->_segMan->lookupNode(curAddress); - listEntry = _listData; - for (listNr = 0; listNr < listCount; listNr++) { - curObject = curNode->value; - listEntry->object = curObject; + for (listNr = 0; curNode != 0; listNr++) { + AnimateEntry listEntry; + const reg_t curObject = curNode->value; + listEntry.object = curObject; // Get data from current object - listEntry->givenOrderNo = listNr; - listEntry->viewId = readSelectorValue(_s->_segMan, curObject, SELECTOR(view)); - listEntry->loopNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(loop)); - listEntry->celNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(cel)); - listEntry->paletteNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(palette)); - listEntry->x = readSelectorValue(_s->_segMan, curObject, SELECTOR(x)); - listEntry->y = readSelectorValue(_s->_segMan, curObject, SELECTOR(y)); - listEntry->z = readSelectorValue(_s->_segMan, curObject, SELECTOR(z)); - listEntry->priority = readSelectorValue(_s->_segMan, curObject, SELECTOR(priority)); - listEntry->signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); + listEntry.givenOrderNo = listNr; + listEntry.viewId = readSelectorValue(_s->_segMan, curObject, SELECTOR(view)); + listEntry.loopNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(loop)); + listEntry.celNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(cel)); + listEntry.paletteNo = readSelectorValue(_s->_segMan, curObject, SELECTOR(palette)); + listEntry.x = readSelectorValue(_s->_segMan, curObject, SELECTOR(x)); + listEntry.y = readSelectorValue(_s->_segMan, curObject, SELECTOR(y)); + listEntry.z = readSelectorValue(_s->_segMan, curObject, SELECTOR(z)); + listEntry.priority = readSelectorValue(_s->_segMan, curObject, SELECTOR(priority)); + listEntry.signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); if (getSciVersion() >= SCI_VERSION_1_1) { // Cel scaling - listEntry->scaleSignal = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleSignal)); - if (listEntry->scaleSignal & kScaleSignalDoScaling) { - listEntry->scaleX = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX)); - listEntry->scaleY = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY)); + listEntry.scaleSignal = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleSignal)); + if (listEntry.scaleSignal & kScaleSignalDoScaling) { + listEntry.scaleX = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX)); + listEntry.scaleY = readSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY)); } else { - listEntry->scaleX = 128; - listEntry->scaleY = 128; + listEntry.scaleX = 128; + listEntry.scaleY = 128; } } else { - listEntry->scaleSignal = 0; - listEntry->scaleX = 128; - listEntry->scaleY = 128; + listEntry.scaleSignal = 0; + listEntry.scaleX = 128; + listEntry.scaleY = 128; } - // listEntry->celRect is filled in AnimateFill() - listEntry->showBitsFlag = false; + // listEntry.celRect is filled in AnimateFill() + listEntry.showBitsFlag = false; _list.push_back(listEntry); - listEntry++; curAddress = curNode->succ; curNode = _s->_segMan->lookupNode(curAddress); } @@ -220,7 +186,7 @@ void GfxAnimate::fill(byte &old_picNotValid) { listIterator = _list.begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; // Get the corresponding view @@ -315,7 +281,7 @@ void GfxAnimate::update() { // Remove all no-update cels, if requested listIterator = _list.reverse_begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -344,7 +310,7 @@ void GfxAnimate::update() { // Draw always-update cels listIterator = listBegin; while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -367,7 +333,7 @@ void GfxAnimate::update() { // Saving background for all NoUpdate-cels listIterator = listBegin; while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -390,7 +356,7 @@ void GfxAnimate::update() { // Draw NoUpdate cels listIterator = listBegin; while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -412,16 +378,15 @@ void GfxAnimate::update() { void GfxAnimate::drawCels() { reg_t curObject; AnimateEntry *listEntry; - AnimateEntry *lastCastEntry = _lastCastData; uint16 signal; reg_t bitsHandle; AnimateList::iterator listIterator; AnimateList::iterator listEnd = _list.end(); - _lastCastCount = 0; + _lastCastData.clear(); listIterator = _list.begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -440,8 +405,7 @@ void GfxAnimate::drawCels() { listEntry->signal = signal; // Remember that entry in lastCast - memcpy(lastCastEntry, listEntry, sizeof(AnimateEntry)); - lastCastEntry++; _lastCastCount++; + _lastCastData.push_back(*listEntry); } listIterator++; } @@ -458,7 +422,7 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { listIterator = _list.begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -510,7 +474,7 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { // another object. In that case we would overwrite the new signal with our version of the old signal listIterator = _list.begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; signal = listEntry->signal; @@ -521,7 +485,7 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { listIterator = _list.reverse_begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; // We read out signal here again, this is not by accident but to ensure that we got an up-to-date signal signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); @@ -540,24 +504,18 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { } void GfxAnimate::reAnimate(Common::Rect rect) { - AnimateEntry *lastCastEntry; - uint16 lastCastCount; - - if (_lastCastCount > 0) { - lastCastEntry = _lastCastData; - lastCastCount = _lastCastCount; - while (lastCastCount > 0) { - lastCastEntry->castHandle = _paint16->bitsSave(lastCastEntry->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); - _paint16->drawCel(lastCastEntry->viewId, lastCastEntry->loopNo, lastCastEntry->celNo, lastCastEntry->celRect, lastCastEntry->priority, lastCastEntry->paletteNo, lastCastEntry->scaleX, lastCastEntry->scaleY); - lastCastEntry++; lastCastCount--; + if (!_lastCastData.empty()) { + AnimateArray::iterator it; + AnimateArray::iterator end = _lastCastData.end(); + for (it = _lastCastData.begin(); it != end; ++it) { + it->castHandle = _paint16->bitsSave(it->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); + _paint16->drawCel(it->viewId, it->loopNo, it->celNo, it->celRect, it->priority, it->paletteNo, it->scaleX, it->scaleY); } _paint16->bitsShow(rect); // restoring - lastCastCount = _lastCastCount; - while (lastCastCount > 0) { - lastCastEntry--; - _paint16->bitsRestore(lastCastEntry->castHandle); - lastCastCount--; + while (it != _lastCastData.begin()) { // FIXME: HACK, this iterator use is not very safe + it--; + _paint16->bitsRestore(it->castHandle); } } else { _paint16->bitsShow(rect); @@ -573,7 +531,7 @@ void GfxAnimate::addToPicDrawCels() { listIterator = _list.begin(); while (listIterator != listEnd) { - listEntry = *listIterator; + listEntry = &*listIterator; curObject = listEntry->object; if (listEntry->priority == -1) @@ -673,7 +631,7 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t updateScreen(old_picNotValid); restoreAndDelete(argc, argv); - if (getLastCastCount() > 1) + if (_lastCastData.size() > 1) _s->_throttleTrigger = true; _ports->setPort(oldPort); diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h index a7d925c6e0..7e82187eed 100644 --- a/engines/sci/graphics/animate.h +++ b/engines/sci/graphics/animate.h @@ -73,7 +73,8 @@ struct AnimateEntry { bool showBitsFlag; reg_t castHandle; }; -typedef Common::List AnimateList; +typedef Common::List AnimateList; +typedef Common::Array AnimateArray; class GfxCache; class GfxCursor; @@ -102,8 +103,6 @@ public: void addToPicDrawCels(); void addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control); - uint16 getLastCastCount() { return _lastCastCount; } - virtual void kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t *argv); virtual void kernelAddToPicList(reg_t listReference, int argc, reg_t *argv); virtual void kernelAddToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control); @@ -123,12 +122,8 @@ private: GfxCursor *_cursor; GfxTransitions *_transitions; - uint16 _listCount; - AnimateEntry *_listData; AnimateList _list; - - uint16 _lastCastCount; - AnimateEntry *_lastCastData; + AnimateArray _lastCastData; bool _ignoreFastCast; }; -- cgit v1.2.3 From c8dca083d825779eaecb3eccd04eaa4e2a914d0d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 14:54:31 +0000 Subject: SCI: Simplify List::iterator usage in GfxAnimate svn-id: r50497 --- engines/sci/graphics/animate.cpp | 92 ++++++++++++---------------------------- 1 file changed, 27 insertions(+), 65 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index d0103c9752..9f8e9ce7b9 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -178,15 +178,12 @@ void GfxAnimate::makeSortedList(List *list) { void GfxAnimate::fill(byte &old_picNotValid) { reg_t curObject; - AnimateEntry *listEntry; uint16 signal; GfxView *view = NULL; - AnimateList::iterator listIterator; - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); - listIterator = _list.begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; // Get the corresponding view @@ -263,25 +260,19 @@ void GfxAnimate::fill(byte &old_picNotValid) { signal &= ~kSignalForceUpdate; } listEntry->signal = signal; - - listIterator++; } } void GfxAnimate::update() { reg_t curObject; - AnimateEntry *listEntry; uint16 signal; reg_t bitsHandle; Common::Rect rect; - AnimateList::iterator listIterator; - AnimateList::iterator listBegin = _list.begin(); - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); // Remove all no-update cels, if requested - listIterator = _list.reverse_begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.reverse_begin(); listEntry != end; --listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -304,13 +295,10 @@ void GfxAnimate::update() { signal |= kSignalNoUpdate; } listEntry->signal = signal; - listIterator--; } // Draw always-update cels - listIterator = listBegin; - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -327,13 +315,10 @@ void GfxAnimate::update() { } listEntry->signal = signal; } - listIterator++; } // Saving background for all NoUpdate-cels - listIterator = listBegin; - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -350,13 +335,10 @@ void GfxAnimate::update() { } listEntry->signal = signal; } - listIterator++; } // Draw NoUpdate cels - listIterator = listBegin; - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -371,22 +353,18 @@ void GfxAnimate::update() { _paint16->fillRect(rect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); } } - listIterator++; } } void GfxAnimate::drawCels() { reg_t curObject; - AnimateEntry *listEntry; uint16 signal; reg_t bitsHandle; - AnimateList::iterator listIterator; - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); _lastCastData.clear(); - listIterator = _list.begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -407,22 +385,18 @@ void GfxAnimate::drawCels() { // Remember that entry in lastCast _lastCastData.push_back(*listEntry); } - listIterator++; } } void GfxAnimate::updateScreen(byte oldPicNotValid) { reg_t curObject; - AnimateEntry *listEntry; uint16 signal; - AnimateList::iterator listIterator; - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); Common::Rect lsRect; Common::Rect workerRect; - listIterator = _list.begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; @@ -455,8 +429,6 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { listEntry->signal |= kSignalRemoveView; } } - - listIterator++; } // use this for debug purposes // _screen->copyToScreen(); @@ -464,30 +436,26 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { reg_t curObject; - AnimateEntry *listEntry; uint16 signal; - AnimateList::iterator listIterator; - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); - // This has to be done in a separate loop. At least in sq1 some .dispose modifies FIXEDLOOP flag in signal for - // another object. In that case we would overwrite the new signal with our version of the old signal - listIterator = _list.begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + // This has to be done in a separate loop. At least in sq1 some .dispose + // modifies FIXEDLOOP flag in signal for another object. In that case we + // would overwrite the new signal with our version of the old signal. + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; signal = listEntry->signal; // Finally update signal writeSelectorValue(_s->_segMan, curObject, SELECTOR(signal), signal); - listIterator++; } - listIterator = _list.reverse_begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.reverse_begin(); listEntry != end; --listEntry) { curObject = listEntry->object; - // We read out signal here again, this is not by accident but to ensure that we got an up-to-date signal + // We read out signal here again, this is not by accident but to ensure + // that we got an up-to-date signal signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); if ((signal & (kSignalNoUpdate | kSignalRemoveView)) == 0) { @@ -499,7 +467,6 @@ void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { // Call .delete_ method of that object invokeSelector(_s, curObject, SELECTOR(delete_), argc, argv, 0); } - listIterator--; } } @@ -524,14 +491,11 @@ void GfxAnimate::reAnimate(Common::Rect rect) { void GfxAnimate::addToPicDrawCels() { reg_t curObject; - AnimateEntry *listEntry; GfxView *view = NULL; - AnimateList::iterator listIterator; - AnimateList::iterator listEnd = _list.end(); + AnimateList::iterator listEntry; + const AnimateList::iterator end = _list.end(); - listIterator = _list.begin(); - while (listIterator != listEnd) { - listEntry = &*listIterator; + for (listEntry = _list.begin(); listEntry != end; ++listEntry) { curObject = listEntry->object; if (listEntry->priority == -1) @@ -549,8 +513,6 @@ void GfxAnimate::addToPicDrawCels() { listEntry->celRect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, listEntry->celRect.top, listEntry->celRect.bottom - 1); _paint16->fillRect(listEntry->celRect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); } - - listIterator++; } } -- cgit v1.2.3 From b743fcc9f5f7e6428ecfe9fea69dbcc70c523529 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 14:54:47 +0000 Subject: SCI: Rename listEntry -> 'it' for better readability svn-id: r50498 --- engines/sci/graphics/animate.cpp | 198 +++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 9f8e9ce7b9..6fb427500d 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -180,71 +180,71 @@ void GfxAnimate::fill(byte &old_picNotValid) { reg_t curObject; uint16 signal; GfxView *view = NULL; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; // Get the corresponding view - view = _cache->getView(listEntry->viewId); + view = _cache->getView(it->viewId); // adjust loop and cel, if any of those is invalid - if (listEntry->loopNo >= view->getLoopCount()) { - listEntry->loopNo = 0; - writeSelectorValue(_s->_segMan, curObject, SELECTOR(loop), listEntry->loopNo); + if (it->loopNo >= view->getLoopCount()) { + it->loopNo = 0; + writeSelectorValue(_s->_segMan, curObject, SELECTOR(loop), it->loopNo); } - if (listEntry->celNo >= view->getCelCount(listEntry->loopNo)) { - listEntry->celNo = 0; - writeSelectorValue(_s->_segMan, curObject, SELECTOR(cel), listEntry->celNo); + if (it->celNo >= view->getCelCount(it->loopNo)) { + it->celNo = 0; + writeSelectorValue(_s->_segMan, curObject, SELECTOR(cel), it->celNo); } // Process global scaling, if needed - if (listEntry->scaleSignal & kScaleSignalDoScaling) { - if (listEntry->scaleSignal & kScaleSignalGlobalScaling) { + if (it->scaleSignal & kScaleSignalDoScaling) { + if (it->scaleSignal & kScaleSignalGlobalScaling) { // Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY int16 maxScale = readSelectorValue(_s->_segMan, curObject, SELECTOR(maxScale)); - int16 celHeight = view->getHeight(listEntry->loopNo, listEntry->celNo); + int16 celHeight = view->getHeight(it->loopNo, it->celNo); int16 maxCelHeight = (maxScale * celHeight) >> 7; reg_t globalVar2 = _s->variables[VAR_GLOBAL][2]; // current room object int16 vanishingY = readSelectorValue(_s->_segMan, globalVar2, SELECTOR(vanishingY)); int16 fixedPortY = _ports->getPort()->rect.bottom - vanishingY; - int16 fixedEntryY = listEntry->y - vanishingY; + int16 fixedEntryY = it->y - vanishingY; if (!fixedEntryY) fixedEntryY = 1; if ((celHeight == 0) || (fixedPortY == 0)) error("global scaling panic"); - listEntry->scaleY = ( maxCelHeight * fixedEntryY ) / fixedPortY; - listEntry->scaleY = (listEntry->scaleY * 128) / celHeight; + it->scaleY = ( maxCelHeight * fixedEntryY ) / fixedPortY; + it->scaleY = (it->scaleY * 128) / celHeight; - listEntry->scaleX = listEntry->scaleY; + it->scaleX = it->scaleY; // and set objects scale selectors - writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), listEntry->scaleX); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), listEntry->scaleY); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleX), it->scaleX); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(scaleY), it->scaleY); } } // Create rect according to coordinates and given cel - if (listEntry->scaleSignal & kScaleSignalDoScaling) { - view->getCelScaledRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->scaleX, listEntry->scaleY, listEntry->celRect); + if (it->scaleSignal & kScaleSignalDoScaling) { + view->getCelScaledRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->scaleX, it->scaleY, it->celRect); } else { - view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->celRect); + view->getCelRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->celRect); } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), listEntry->celRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), listEntry->celRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), listEntry->celRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), listEntry->celRect.bottom); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), it->celRect.left); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), it->celRect.top); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), it->celRect.right); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), it->celRect.bottom); - signal = listEntry->signal; + signal = it->signal; // Calculate current priority according to y-coordinate if (!(signal & kSignalFixedPriority)) { - listEntry->priority = _ports->kernelCoordinateToPriority(listEntry->y); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(priority), listEntry->priority); + it->priority = _ports->kernelCoordinateToPriority(it->y); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(priority), it->priority); } if (signal & kSignalNoUpdate) { @@ -259,7 +259,7 @@ void GfxAnimate::fill(byte &old_picNotValid) { old_picNotValid++; signal &= ~kSignalForceUpdate; } - listEntry->signal = signal; + it->signal = signal; } } @@ -268,20 +268,20 @@ void GfxAnimate::update() { uint16 signal; reg_t bitsHandle; Common::Rect rect; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); // Remove all no-update cels, if requested - for (listEntry = _list.reverse_begin(); listEntry != end; --listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.reverse_begin(); it != end; --it) { + curObject = it->object; + signal = it->signal; if (signal & kSignalNoUpdate) { if (!(signal & kSignalRemoveView)) { bitsHandle = readSelector(_s->_segMan, curObject, SELECTOR(underBits)); if (_screen->_picNotValid != 1) { _paint16->bitsRestore(bitsHandle); - listEntry->showBitsFlag = true; + it->showBitsFlag = true; } else { _paint16->bitsFree(bitsHandle); } @@ -294,33 +294,33 @@ void GfxAnimate::update() { signal &= ~kSignalStopUpdate; signal |= kSignalNoUpdate; } - listEntry->signal = signal; + it->signal = signal; } // Draw always-update cels - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; if (signal & kSignalAlwaysUpdate) { // draw corresponding cel - _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); - listEntry->showBitsFlag = true; + _paint16->drawCel(it->viewId, it->loopNo, it->celNo, it->celRect, it->priority, it->paletteNo, it->scaleX, it->scaleY); + it->showBitsFlag = true; signal &= ~(kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); if ((signal & kSignalIgnoreActor) == 0) { - rect = listEntry->celRect; - rect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); + rect = it->celRect; + rect.top = CLIP(_ports->kernelPriorityToCoordinate(it->priority) - 1, rect.top, rect.bottom - 1); _paint16->fillRect(rect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); } - listEntry->signal = signal; + it->signal = signal; } } // Saving background for all NoUpdate-cels - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; if (signal & kSignalNoUpdate) { if (signal & kSignalHidden) { @@ -328,28 +328,28 @@ void GfxAnimate::update() { } else { signal &= ~kSignalRemoveView; if (signal & kSignalIgnoreActor) - bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); + bitsHandle = _paint16->bitsSave(it->celRect, GFX_SCREEN_MASK_VISUAL|GFX_SCREEN_MASK_PRIORITY); else - bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_ALL); + bitsHandle = _paint16->bitsSave(it->celRect, GFX_SCREEN_MASK_ALL); writeSelector(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); } - listEntry->signal = signal; + it->signal = signal; } } // Draw NoUpdate cels - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; if (signal & kSignalNoUpdate && !(signal & kSignalHidden)) { // draw corresponding cel - _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); - listEntry->showBitsFlag = true; + _paint16->drawCel(it->viewId, it->loopNo, it->celNo, it->celRect, it->priority, it->paletteNo, it->scaleX, it->scaleY); + it->showBitsFlag = true; if (!(signal & kSignalIgnoreActor)) { - rect = listEntry->celRect; - rect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); + rect = it->celRect; + rect.top = CLIP(_ports->kernelPriorityToCoordinate(it->priority) - 1, rect.top, rect.bottom - 1); _paint16->fillRect(rect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); } } @@ -360,30 +360,30 @@ void GfxAnimate::drawCels() { reg_t curObject; uint16 signal; reg_t bitsHandle; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); _lastCastData.clear(); - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; if (!(signal & (kSignalNoUpdate | kSignalHidden | kSignalAlwaysUpdate))) { // Save background - bitsHandle = _paint16->bitsSave(listEntry->celRect, GFX_SCREEN_MASK_ALL); + bitsHandle = _paint16->bitsSave(it->celRect, GFX_SCREEN_MASK_ALL); writeSelector(_s->_segMan, curObject, SELECTOR(underBits), bitsHandle); // draw corresponding cel - _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo, listEntry->scaleX, listEntry->scaleY); - listEntry->showBitsFlag = true; + _paint16->drawCel(it->viewId, it->loopNo, it->celNo, it->celRect, it->priority, it->paletteNo, it->scaleX, it->scaleY); + it->showBitsFlag = true; if (signal & kSignalRemoveView) { signal &= ~kSignalRemoveView; } - listEntry->signal = signal; + it->signal = signal; // Remember that entry in lastCast - _lastCastData.push_back(*listEntry); + _lastCastData.push_back(*it); } } } @@ -391,16 +391,16 @@ void GfxAnimate::drawCels() { void GfxAnimate::updateScreen(byte oldPicNotValid) { reg_t curObject; uint16 signal; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); Common::Rect lsRect; Common::Rect workerRect; - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; - if (listEntry->showBitsFlag || !(signal & (kSignalRemoveView | kSignalNoUpdate) || + if (it->showBitsFlag || !(signal & (kSignalRemoveView | kSignalNoUpdate) || (!(signal & kSignalRemoveView) && (signal & kSignalNoUpdate) && oldPicNotValid))) { lsRect.left = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft)); lsRect.top = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop)); @@ -408,25 +408,25 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { lsRect.bottom = readSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom)); workerRect = lsRect; - workerRect.clip(listEntry->celRect); + workerRect.clip(it->celRect); if (!workerRect.isEmpty()) { workerRect = lsRect; - workerRect.extend(listEntry->celRect); + workerRect.extend(it->celRect); } else { _paint16->bitsShow(lsRect); - workerRect = listEntry->celRect; + workerRect = it->celRect; } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft), listEntry->celRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop), listEntry->celRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight), listEntry->celRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom), listEntry->celRect.bottom); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsLeft), it->celRect.left); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsTop), it->celRect.top); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsRight), it->celRect.right); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(lsBottom), it->celRect.bottom); // may get used for debugging //_paint16->frameRect(workerRect); _paint16->bitsShow(workerRect); if (signal & kSignalHidden) { - listEntry->signal |= kSignalRemoveView; + it->signal |= kSignalRemoveView; } } } @@ -437,23 +437,23 @@ void GfxAnimate::updateScreen(byte oldPicNotValid) { void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) { reg_t curObject; uint16 signal; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); // This has to be done in a separate loop. At least in sq1 some .dispose // modifies FIXEDLOOP flag in signal for another object. In that case we // would overwrite the new signal with our version of the old signal. - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; - signal = listEntry->signal; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; + signal = it->signal; // Finally update signal writeSelectorValue(_s->_segMan, curObject, SELECTOR(signal), signal); } - for (listEntry = _list.reverse_begin(); listEntry != end; --listEntry) { - curObject = listEntry->object; + for (it = _list.reverse_begin(); it != end; --it) { + curObject = it->object; // We read out signal here again, this is not by accident but to ensure // that we got an up-to-date signal signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); @@ -492,26 +492,26 @@ void GfxAnimate::reAnimate(Common::Rect rect) { void GfxAnimate::addToPicDrawCels() { reg_t curObject; GfxView *view = NULL; - AnimateList::iterator listEntry; + AnimateList::iterator it; const AnimateList::iterator end = _list.end(); - for (listEntry = _list.begin(); listEntry != end; ++listEntry) { - curObject = listEntry->object; + for (it = _list.begin(); it != end; ++it) { + curObject = it->object; - if (listEntry->priority == -1) - listEntry->priority = _ports->kernelCoordinateToPriority(listEntry->y); + if (it->priority == -1) + it->priority = _ports->kernelCoordinateToPriority(it->y); // Get the corresponding view - view = _cache->getView(listEntry->viewId); + view = _cache->getView(it->viewId); // Create rect according to coordinates and given cel - view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->z, listEntry->celRect); + view->getCelRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->celRect); // draw corresponding cel - _paint16->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); - if ((listEntry->signal & kSignalIgnoreActor) == 0) { - listEntry->celRect.top = CLIP(_ports->kernelPriorityToCoordinate(listEntry->priority) - 1, listEntry->celRect.top, listEntry->celRect.bottom - 1); - _paint16->fillRect(listEntry->celRect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); + _paint16->drawCel(it->viewId, it->loopNo, it->celNo, it->celRect, it->priority, it->paletteNo); + if ((it->signal & kSignalIgnoreActor) == 0) { + it->celRect.top = CLIP(_ports->kernelPriorityToCoordinate(it->priority) - 1, it->celRect.top, it->celRect.bottom - 1); + _paint16->fillRect(it->celRect, GFX_SCREEN_MASK_CONTROL, 0, 0, 15); } } } @@ -575,9 +575,9 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t fill(old_picNotValid); if (old_picNotValid) { - // beginUpdate()/endUpdate() were introduced SCI1 - // calling those for SCI0 will work most of the time but breaks minor stuff like percentage bar of qfg1ega - // at the character skill screen + // beginUpdate()/endUpdate() were introduced SCI1. + // Calling those for SCI0 will work most of the time but breaks minor + // stuff like percentage bar of qfg1ega at the character skill screen. if (getSciVersion() >= SCI_VERSION_1_EGA) _ports->beginUpdate(_ports->_picWind); update(); -- cgit v1.2.3 From 1027f870a6d78bfbbf151ca0e65cd915676792b2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 14:55:09 +0000 Subject: SCI: Add some const qualifiers svn-id: r50499 --- engines/sci/graphics/paint16.cpp | 22 +++++++++++----------- engines/sci/graphics/paint16.h | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index c2e8d2c5d0..9f286b1fda 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -107,12 +107,12 @@ void GfxPaint16::drawCelAndShow(GuiResourceId viewId, int16 loopNo, int16 celNo, } // This version of drawCel is not supposed to call BitsShow()! -void GfxPaint16::drawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Rect celRect, byte priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY) { +void GfxPaint16::drawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, const Common::Rect &celRect, byte priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY) { drawCel(_cache->getView(viewId), loopNo, celNo, celRect, priority, paletteNo, scaleX, scaleY); } // This version of drawCel is not supposed to call BitsShow()! -void GfxPaint16::drawCel(GfxView *view, int16 loopNo, int16 celNo, Common::Rect celRect, byte priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY) { +void GfxPaint16::drawCel(GfxView *view, int16 loopNo, int16 celNo, const Common::Rect &celRect, byte priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY) { Common::Rect clipRect = celRect; clipRect.clip(_ports->_curPort->rect); if (clipRect.isEmpty()) // nothing to draw @@ -389,19 +389,19 @@ void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, } } -void GfxPaint16::kernelGraphFillBoxForeground(Common::Rect rect) { +void GfxPaint16::kernelGraphFillBoxForeground(const Common::Rect &rect) { paintRect(rect); } -void GfxPaint16::kernelGraphFillBoxBackground(Common::Rect rect) { +void GfxPaint16::kernelGraphFillBoxBackground(const Common::Rect &rect) { eraseRect(rect); } -void GfxPaint16::kernelGraphFillBox(Common::Rect rect, uint16 colorMask, int16 color, int16 priority, int16 control) { +void GfxPaint16::kernelGraphFillBox(const Common::Rect &rect, uint16 colorMask, int16 color, int16 priority, int16 control) { fillRect(rect, colorMask, color, priority, control); } -void GfxPaint16::kernelGraphFrameBox(Common::Rect rect, int16 color) { +void GfxPaint16::kernelGraphFrameBox(const Common::Rect &rect, int16 color) { int16 oldColor = _ports->getPort()->penClr; _ports->penColor(color); frameRect(rect); @@ -413,11 +413,11 @@ void GfxPaint16::kernelGraphDrawLine(Common::Point startPoint, Common::Point end _screen->drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, color, priority, control); } -reg_t GfxPaint16::kernelGraphSaveBox(Common::Rect rect, uint16 screenMask) { +reg_t GfxPaint16::kernelGraphSaveBox(const Common::Rect &rect, uint16 screenMask) { return bitsSave(rect, screenMask); } -reg_t GfxPaint16::kernelGraphSaveUpscaledHiresBox(Common::Rect rect) { +reg_t GfxPaint16::kernelGraphSaveUpscaledHiresBox(const Common::Rect &rect) { return bitsSave(rect, GFX_SCREEN_MASK_DISPLAY); } @@ -425,7 +425,7 @@ void GfxPaint16::kernelGraphRestoreBox(reg_t handle) { bitsRestore(handle); } -void GfxPaint16::kernelGraphUpdateBox(Common::Rect rect, bool hiresMode) { +void GfxPaint16::kernelGraphUpdateBox(const Common::Rect &rect, bool hiresMode) { // some calls are hiresMode even under kq6 DOS, that's why we check for upscaled hires here if ((!hiresMode) || (!_screen->getUpscaledHires())) bitsShow(rect); @@ -597,12 +597,12 @@ void GfxPaint16::kernelShakeScreen(uint16 shakeCount, uint16 directions) { } } -reg_t GfxPaint16::kernelPortraitLoad(Common::String resourceName) { +reg_t GfxPaint16::kernelPortraitLoad(const Common::String &resourceName) { //Portrait *myPortrait = new Portrait(g_sci->getResMan(), _screen, _palette, resourceName); return NULL_REG; } -void GfxPaint16::kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { +void GfxPaint16::kernelPortraitShow(const Common::String &resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { Portrait *myPortrait = new Portrait(g_sci->getResMan(), g_sci->getEventManager(), _screen, _palette, _audio, resourceName); // TODO: cache portraits // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index f54b8059c1..4c3ac255c4 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -53,8 +53,8 @@ public: void drawPicture(GuiResourceId pictureId, int16 animationNr, bool mirroredFlag, bool addToFlag, GuiResourceId paletteId); void drawCelAndShow(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, byte priority, uint16 paletteNo, uint16 scaleX = 128, uint16 scaleY = 128); - void drawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Rect celRect, byte priority, uint16 paletteNo, uint16 scaleX = 128, uint16 scaleY = 128); - void drawCel(GfxView *view, int16 loopNo, int16 celNo, Common::Rect celRect, byte priority, uint16 paletteNo, uint16 scaleX = 128, uint16 scaleY = 128); + void drawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, const Common::Rect &celRect, byte priority, uint16 paletteNo, uint16 scaleX = 128, uint16 scaleY = 128); + void drawCel(GfxView *view, int16 loopNo, int16 celNo, const Common::Rect &celRect, byte priority, uint16 paletteNo, uint16 scaleX = 128, uint16 scaleY = 128); void drawHiresCelAndShow(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, byte priority, uint16 paletteNo, reg_t upscaledHiresHandle, uint16 scaleX = 128, uint16 scaleY = 128); void clearScreen(byte color = 255); @@ -75,23 +75,23 @@ public: void kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, bool animationBlackoutFlag, bool mirroredFlag, bool addToFlag, int16 EGApaletteNo); void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle); - void kernelGraphFillBoxForeground(Common::Rect rect); - void kernelGraphFillBoxBackground(Common::Rect rect); - void kernelGraphFillBox(Common::Rect rect, uint16 colorMask, int16 color, int16 priority, int16 control); - void kernelGraphFrameBox(Common::Rect rect, int16 color); + void kernelGraphFillBoxForeground(const Common::Rect &rect); + void kernelGraphFillBoxBackground(const Common::Rect &rect); + void kernelGraphFillBox(const Common::Rect &rect, uint16 colorMask, int16 color, int16 priority, int16 control); + void kernelGraphFrameBox(const Common::Rect &rect, int16 color); void kernelGraphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control); - reg_t kernelGraphSaveBox(Common::Rect rect, uint16 flags); - reg_t kernelGraphSaveUpscaledHiresBox(Common::Rect rect); + reg_t kernelGraphSaveBox(const Common::Rect &rect, uint16 flags); + reg_t kernelGraphSaveUpscaledHiresBox(const Common::Rect &rect); void kernelGraphRestoreBox(reg_t handle); - void kernelGraphUpdateBox(Common::Rect rect, bool hiresMode); + void kernelGraphUpdateBox(const Common::Rect &rect, bool hiresMode); void kernelGraphRedrawBox(Common::Rect rect); reg_t kernelDisplay(const char *text, int argc, reg_t *argv); void kernelShakeScreen(uint16 shakeCount, uint16 directions); - reg_t kernelPortraitLoad(Common::String resourceName); - void kernelPortraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); + reg_t kernelPortraitLoad(const Common::String &resourceName); + void kernelPortraitShow(const Common::String &resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); void kernelPortraitUnload(uint16 portraitId); private: -- cgit v1.2.3 From 8db0f726c0253300faf8b9691607715fdaa45920 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 14:55:32 +0000 Subject: SCI: Rewrap more comments svn-id: r50500 --- engines/sci/graphics/cursor.cpp | 3 ++- engines/sci/graphics/menu.cpp | 48 ++++++++++++++++++++++-------------- engines/sci/graphics/paint16.cpp | 42 +++++++++++++++++++------------ engines/sci/graphics/screen.cpp | 14 ++++++----- engines/sci/graphics/text16.cpp | 37 ++++++++++++++++----------- engines/sci/graphics/transitions.cpp | 48 ++++++++++++++++++++++-------------- 6 files changed, 116 insertions(+), 76 deletions(-) diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 20472d14c4..23c41c4c87 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -174,7 +174,8 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co // Compute hotspot from xoffset/yoffset cursorHotspot = new Common::Point((celInfo->width >> 1) - celInfo->displaceX, celInfo->height - celInfo->displaceY - 1); - // Eco Quest 1 uses a 1x1 transparent cursor to hide the cursor from the user. Some scalers don't seem to support this + // Eco Quest 1 uses a 1x1 transparent cursor to hide the cursor from the + // user. Some scalers don't seem to support this if (width < 2 || height < 2) { kernelHide(); delete cursorHotspot; diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 323539573b..d85d4456fc 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -63,8 +63,9 @@ void GfxMenu::reset() { _itemList.clear(); _listCount = 0; - // We actually set active item in here and remember last selection of the user - // sierra sci always defaulted to first item every time menu was called via ESC, we dont follow that logic + // We actually set active item in here and remember last selection of the + // user. Sierra SCI always defaulted to first item every time menu was + // called via ESC, we don't follow that logic. _curMenuId = 1; _curItemId = 1; } @@ -92,15 +93,16 @@ void GfxMenu::kernelAddEntry(Common::String title, Common::String content, reg_t beginPos = curPos; - // Now go through the content till we find end-marker and collect data about it - // ':' is an end-marker for each item + // Now go through the content till we find end-marker and collect data about it. + // ':' is an end-marker for each item. tagPos = 0; rightAlignedPos = 0; controlPos = 0; altPos = 0; functionPos = 0; while ((curPos < contentSize) && (content[curPos] != ':')) { switch (content[curPos]) { case '=': // Set tag - // Special case for normal animation speed - they use right aligned "=" for that one, so we ignore it - // as being recognized as tag marker + // Special case for normal animation speed - they use right + // aligned "=" for that one, so we ignore it as being recognized + // as tag marker. if (rightAlignedPos == curPos - 1) break; if (tagPos) @@ -199,8 +201,9 @@ void GfxMenu::kernelAddEntry(Common::String title, Common::String content, reg_t if (separatorCount == tempPos - beginPos) { itemEntry->separatorLine = true; } else { - // we don't strSplit here, because multilingual SCI01 support language switching on the fly, so we have to do - // this everytime the menu is called + // We don't strSplit here, because multilingual SCI01 support + // language switching on the fly, so we have to do this everytime + // the menu is called. itemEntry->text = Common::String(content.c_str() + beginPos, tempPos - beginPos); // LSL6 uses "Ctrl-" prefix string instead of ^ like all the other games do @@ -222,10 +225,12 @@ void GfxMenu::kernelAddEntry(Common::String title, Common::String content, reg_t if (tagPos && tagPos >= rightAlignedPos) tempPos = tagPos; itemEntry->textRightAligned = Common::String(content.c_str() + rightAlignedPos, tempPos - rightAlignedPos); - // Remove ending space, if there is one. Strangely sometimes there are lone spaces at the end in some games + // Remove ending space, if there is one. Strangely sometimes there + // are lone spaces at the end in some games if (itemEntry->textRightAligned.hasSuffix(" ")) itemEntry->textRightAligned.deleteLastChar(); - // - and + are used sometimes for volume control/animation speed, = sometimes for animation speed + // - and + are used sometimes for volume control/animation speed, + // = sometimes for animation speed if (itemEntry->textRightAligned == "-") { itemEntry->keyPress = '-'; } else if (itemEntry->textRightAligned == "+") { @@ -392,7 +397,8 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject) { case SCI_EVENT_KEYBOARD: keyPress = readSelectorValue(_segMan, eventObject, SELECTOR(message)); keyModifier = readSelectorValue(_segMan, eventObject, SELECTOR(modifiers)); - // If tab got pressed, handle it here as if it was Ctrl-I - at least sci0 also did it that way + // If tab got pressed, handle it here as if it was Ctrl-I - at least + // sci0 also did it that way if (keyPress == SCI_KEY_TAB) { keyModifier = SCI_KEYMOD_CTRL; keyPress = 'i'; @@ -562,7 +568,8 @@ void GfxMenu::drawMenu(uint16 oldMenuId, uint16 newMenuId) { if (!maxTextRightAlignedWidth) _menuRect.right -= 5; - // if part of menu window is outside the screen, move it into the screen (this happens in multilingual sq3 and lsl3) + // If part of menu window is outside the screen, move it into the screen + // (this happens in multilingual sq3 and lsl3). if (_menuRect.right > _screen->getWidth()) { _menuRect.translate(-(_menuRect.right - _screen->getWidth()), 0); } @@ -689,8 +696,9 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { GuiMenuItemEntry *newItemEntry = curItemEntry; Common::Point mousePosition; - // We don't 100% follow sierra here: we select last item instead of selecting first item of first menu everytime - // Also sierra sci didnt allow mouse interaction, when menu was activated via keyboard + // We don't 100% follow Sierra here: we select last item instead of + // selecting first item of first menu every time. Also sierra sci didn't + // allow mouse interaction, when menu was activated via keyboard. calculateMenuAndItemWidth(); _oldPort = _ports->setPort(_ports->_menuPort); @@ -710,8 +718,9 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { switch (curEvent.type) { case SCI_EVENT_KEYBOARD: - // We don't 100% follow sierra here: - sierra didn't wrap around when changing item id - // - sierra allowed item id to be 0, which didnt make any sense + // We don't 100% follow sierra here: + // - sierra didn't wrap around when changing item id + // - sierra allowed item id to be 0, which didn't make any sense do { switch (curEvent.data) { case SCI_KEY_ESC: @@ -802,9 +811,10 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { } } -// Mouse button is currently pressed - we are now interpreting mouse coordinates till mouse button is released -// The menu item that is selected at that time is chosen. If no menu item is selected we cancel -// No keyboard interaction is allowed, cause that wouldnt make any sense at all +// Mouse button is currently pressed - we are now interpreting mouse coordinates +// till mouse button is released. The menu item that is selected at that time is +// chosen. If no menu item is selected we cancel. No keyboard interaction is +// allowed, cause that wouldnt make any sense at all. GuiMenuItemEntry *GfxMenu::interactiveWithMouse() { SciEvent curEvent; uint16 newMenuId = 0, newItemId = 0; diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 9f286b1fda..48967c6888 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -127,8 +127,8 @@ void GfxPaint16::drawCel(GfxView *view, int16 loopNo, int16 celNo, const Common: } } -// This is used as replacement for drawCelAndShow() when hires-cels are drawn to screen -// Hires-cels are available only SCI 1.1+ +// This is used as replacement for drawCelAndShow() when hires-cels are drawn to +// screen. Hires-cels are available only SCI 1.1+. void GfxPaint16::drawHiresCelAndShow(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, byte priority, uint16 paletteNo, reg_t upscaledHiresHandle, uint16 scaleX, uint16 scaleY) { GfxView *view = _cache->getView(viewId); Common::Rect celRect, curPortRect, clipRect, clipRectTranslated; @@ -137,9 +137,10 @@ void GfxPaint16::drawHiresCelAndShow(GuiResourceId viewId, int16 loopNo, int16 c if (view) { if ((leftPos == 0) && (topPos == 0)) { - // HACK: in kq6, we get leftPos&topPos == 0 SOMETIMES, that's why we need to get coordinates from upscaledHiresHandle - // I'm not sure if this is what we are supposed to do or if there is some other bug that actually makes - // coordinates to be 0 in the first place + // HACK: in kq6, we get leftPos&topPos == 0 SOMETIMES, that's why we + // need to get coordinates from upscaledHiresHandle. I'm not sure if + // this is what we are supposed to do or if there is some other bug + // that actually makes coordinates to be 0 in the first place. byte *memoryPtr = NULL; memoryPtr = _segMan->getHunkPointer(upscaledHiresHandle); if (memoryPtr) { @@ -381,7 +382,8 @@ void GfxPaint16::kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, b } void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle) { - // some calls are hiresMode even under kq6 DOS, that's why we check for upscaled hires here + // some calls are hiresMode even under kq6 DOS, that's why we check for + // upscaled hires here if ((!hiresMode) || (!_screen->getUpscaledHires())) { drawCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo); } else { @@ -426,7 +428,8 @@ void GfxPaint16::kernelGraphRestoreBox(reg_t handle) { } void GfxPaint16::kernelGraphUpdateBox(const Common::Rect &rect, bool hiresMode) { - // some calls are hiresMode even under kq6 DOS, that's why we check for upscaled hires here + // some calls are hiresMode even under kq6 DOS, that's why we check for + // upscaled hires here if ((!hiresMode) || (!_screen->getUpscaledHires())) bitsShow(rect); else @@ -466,7 +469,8 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { Common::Rect rect; reg_t result = NULL_REG; - // Make a "backup" of the port settings (required for some SCI0LATE and SCI01+ only) + // Make a "backup" of the port settings (required for some SCI0LATE and + // SCI01+ only) Port oldPort = *_ports->getPort(); // setting defaults @@ -565,14 +569,20 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { uint16 tTop = currport->curTop; uint16 tLeft = currport->curLeft; if (!g_sci->_features->usesOldGfxFunctions()) { - // Restore port settings for some SCI0LATE and SCI01+ only - // the change actually happened inbetween .530 (hoyle1) and .566 (heros quest). We don't have any detection for - // that currently, so we are using oldGfxFunctions (.502). The only games that could get regressions because of - // this are hoyle1, kq4 and funseeker. If there are regressions, we should use interpreter version (which would - // require exe version detection) - // If we restore the port for whole SCI0LATE, at least sq3old will get an issue - font 0 will get used when - // scanning for planets instead of font 600 - a setfont parameter is missing in one of the kDisplay calls in - // script 19. I assume this is a script bug, because it was added in sq3new. + // Restore port settings for some SCI0LATE and SCI01+ only. + // + // The change actually happened inbetween .530 (hoyle1) and .566 (heros + // quest). We don't have any detection for that currently, so we are + // using oldGfxFunctions (.502). The only games that could get + // regressions because of this are hoyle1, kq4 and funseeker. If there + // are regressions, we should use interpreter version (which would + // require exe version detection). + // + // If we restore the port for whole SCI0LATE, at least sq3old will get + // an issue - font 0 will get used when scanning for planets instead of + // font 600 - a setfont parameter is missing in one of the kDisplay + // calls in script 19. I assume this is a script bug, because it was + // added in sq3new. *currport = oldPort; } currport->curTop = tTop; diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index eee6898a23..053372bdac 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -40,9 +40,10 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { // Scale the screen, if needed _upscaledHires = GFX_SCREEN_UPSCALED_DISABLED; - // King's Quest 6 and Gabriel Knight 1 have hires content, gk1/cd was able to provide that under DOS as well, but as - // gk1/floppy does support upscaled hires scriptswise, but doesn't actually have the hires content we need to limit - // it to platform windows. + // King's Quest 6 and Gabriel Knight 1 have hires content, gk1/cd was able + // to provide that under DOS as well, but as gk1/floppy does support + // upscaled hires scriptswise, but doesn't actually have the hires content + // we need to limit it to platform windows. if (g_sci->getPlatform() == Common::kPlatformWindows) { if (g_sci->getGameId() == GID_KQ6) _upscaledHires = GFX_SCREEN_UPSCALED_640x440; @@ -60,7 +61,7 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { _height = 200; } - // Japanese versions of games use hi-res font on upscaled version of the game + // Japanese versions of games use hi-res font on upscaled version of the game. if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) _upscaledHires = GFX_SCREEN_UPSCALED_640x400; @@ -106,8 +107,9 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { _unditherState = true; if (_resMan->isVGA() || (_resMan->isAmiga32color())) { - // It is not 100% accurate to set white to be 255 for Amiga 32-color games. - // But 255 is defined as white in our SCI at all times, so it doesn't matter. + // It is not 100% accurate to set white to be 255 for Amiga 32-color + // games. But 255 is defined as white in our SCI at all times, so it + // doesn't matter. _colorWhite = 255; if (getSciVersion() >= SCI_VERSION_1_1) _colorDefaultVectorData = 255; diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index e9adac9572..4aa2346aed 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -84,10 +84,10 @@ void GfxText16::ClearChar(int16 chr) { _paint16->eraseRect(rect); } -// This internal function gets called as soon as a '|' is found in a text -// It will process the encountered code and set new font/set color -// We only support one-digit codes currently, don't know if multi-digit codes are possible -// Returns textcode character count +// This internal function gets called as soon as a '|' is found in a text. It +// will process the encountered code and set new font/set color. We only support +// one-digit codes currently, don't know if multi-digit codes are possible. +// Returns textcode character count. int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int16 orgPenColor) { const char *textCode = text; int16 textCodeSize = 0; @@ -133,9 +133,11 @@ int16 GfxText16::CodeProcessing(const char *&text, GuiResourceId orgFontId, int1 static const uint16 text16_punctuationSjis[] = { 0x9F82, 0xA182, 0xA382, 0xA582, 0xA782, 0xC182, 0xA782, 0xC182, 0xE182, 0xE382, 0xE582, 0xEC82, 0x4083, 0x4283, 0x4483, 0x4683, 0x4883, 0x6283, 0x8383, 0x8583, 0x8783, 0x8E83, 0x9583, 0x9683, - 0x5B81, 0x4181, 0x4281, 0x7681, 0x7881, 0x4981, 0x4881, 0 }; + 0x5B81, 0x4181, 0x4281, 0x7681, 0x7881, 0x4981, 0x4881, 0 +}; -// return max # of chars to fit maxwidth with full words, does not include breaking space +// return max # of chars to fit maxwidth with full words, does not include +// breaking space int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgFontId) { uint16 curChar = 0; int16 maxChars = 0, curCharCount = 0; @@ -195,9 +197,10 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF uint16 nextChar; - // we remove the last char only, if maxWidth was actually equal width before adding the last char - // otherwise we won't get the same cutting as in sierra pc98 sci - // note: changing the while() instead will NOT WORK. it would break all sorts of regular sci games + // We remove the last char only, if maxWidth was actually equal width + // before adding the last char. Otherwise we won't get the same cutting + // as in sierra pc98 sci. Note: changing the while() instead will NOT + // WORK. it would break all sorts of regular sci games. if (maxWidth == (width - _font->getCharWidth(curChar))) { maxChars--; if (curChar > 0xFF) @@ -431,11 +434,14 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex _ports->penColor(orgPenColor); if (doubleByteMode) { - // kanji is written by pc98 rom to screen directly. Because of GetLongest() behaviour (not cutting off the last - // char, that causes a new line), results in the script thinking that the text would need less space. The coordinate - // adjustment in fontsjis.cpp handles the incorrect centering because of that and this code actually shows all of - // the chars - if we don't do this, the scripts will only show most of the chars, but the last few pixels won't get - // shown most of the time. + // Kanji is written by pc98 rom to screen directly. Because of + // GetLongest() behaviour (not cutting off the last char, that causes a + // new line), results in the script thinking that the text would need + // less space. The coordinate adjustment in fontsjis.cpp handles the + // incorrect centering because of that and this code actually shows all + // of the chars - if we don't do this, the scripts will only show most + // of the chars, but the last few pixels won't get shown most of the + // time. Common::Rect kanjiRect = rect; _ports->offsetRect(kanjiRect); kanjiRect.left &= 0xFFC; @@ -456,7 +462,8 @@ void GfxText16::Draw_String(const char *text) { _ports->penColor(orgPenColor); } -// Sierra did this in their PC98 interpreter only, they identify a text as being sjis and then switch to font 900 +// Sierra did this in their PC98 interpreter only, they identify a text as being +// sjis and then switch to font 900 bool GfxText16::SwitchToFont900OnSjis(const char *text) { byte firstChar = (*(const byte *)text++); if (((firstChar >= 0x81) && (firstChar <= 0x9F)) || ((firstChar >= 0xE0) && (firstChar <= 0xEF))) { diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 27cda249d0..c1f626449f 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -158,7 +158,8 @@ void GfxTransitions::doit(Common::Rect picRect) { } if (_blackoutFlag) { - // We need to find out what transition we are supposed to use for blackout + // We need to find out what transition we are supposed to use for + // blackout translationEntry = translateNumber(_number, blackoutTransitionIDs); if (translationEntry) { doTransition(translationEntry->newId, true); @@ -174,7 +175,8 @@ void GfxTransitions::doit(Common::Rect picRect) { if (picRect.bottom != _screen->getHeight()) { // TODO: this is a workaround for lsl6 not showing menubar when playing - // There is some new code in the sierra sci in ShowPic that seems to do something similar to this + // There is some new code in the sierra sci in ShowPic that seems to do + // something similar to this _screen->copyToScreen(); g_system->updateScreen(); } @@ -182,8 +184,8 @@ void GfxTransitions::doit(Common::Rect picRect) { _screen->_picNotValid = 0; } -// This may get called twice, if blackoutFlag is set. It will get once called with blackoutFlag set and another time -// with no blackoutFlag. +// This may get called twice, if blackoutFlag is set. It will get once called +// with blackoutFlag set and another time with no blackoutFlag. void GfxTransitions::doTransition(int16 number, bool blackoutFlag) { if (number != SCI_TRANSITIONS_FADEPALETTE) { setNewPalette(blackoutFlag); @@ -278,7 +280,8 @@ void GfxTransitions::copyRectToScreen(const Common::Rect rect, bool blackoutFlag } } -// Note: dont do too many steps in here, otherwise cpu will crap out because of the load +// Note: don't do too many steps in here, otherwise cpu will crap out because of +// the load void GfxTransitions::fadeOut() { byte oldPalette[4 * 256], workPalette[4 * 256]; int16 stepNr, colorNr; @@ -296,7 +299,8 @@ void GfxTransitions::fadeOut() { } } -// Note: dont do too many steps in here, otherwise cpu will crap out because of the load +// Note: don't do too many steps in here, otherwise cpu will crap out because of +// the load void GfxTransitions::fadeIn() { int16 stepNr; @@ -306,9 +310,9 @@ void GfxTransitions::fadeIn() { } } -// pixelates the new picture over the old one - works against the whole screen +// Pixelates the new picture over the old one - works against the whole screen. // TODO: it seems this needs to get applied on _picRect only if possible -void GfxTransitions::pixelation (bool blackoutFlag) { +void GfxTransitions::pixelation(bool blackoutFlag) { uint16 mask = 0x40, stepNr = 0; Common::Rect pixelRect; @@ -328,7 +332,7 @@ void GfxTransitions::pixelation (bool blackoutFlag) { } while (mask != 0x40); } -// like pixelation but uses 8x8 blocks - works against the whole screen +// Like pixelation but uses 8x8 blocks - works against the whole screen. // TODO: it seems this needs to get applied on _picRect only if possible void GfxTransitions::blocks(bool blackoutFlag) { uint16 mask = 0x40, stepNr = 0; @@ -350,7 +354,8 @@ void GfxTransitions::blocks(bool blackoutFlag) { } while (mask != 0x40); } -// directly shows new screen starting up/down/left/right and going to the opposite direction - works on _picRect area only +// Directly shows new screen starting up/down/left/right and going to the +// opposite direction - works on _picRect area only void GfxTransitions::straight(int16 number, bool blackoutFlag) { int16 stepNr = 0; Common::Rect newScreenRect = _picRect; @@ -402,7 +407,8 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) { } } -// scroll old screen (up/down/left/right) and insert new screen that way - works on _picRect area only +// Scroll old screen (up/down/left/right) and insert new screen that way - works +// on _picRect area only. void GfxTransitions::scroll(int16 number) { int16 screenWidth, screenHeight; byte *oldScreenPtr; @@ -512,7 +518,8 @@ void GfxTransitions::scroll(int16 number) { } } -// vertically displays new screen starting from center - works on _picRect area only +// Vertically displays new screen starting from center - works on _picRect area +// only void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) { Common::Rect leftRect = Common::Rect(_picRect.left + (_picRect.width() / 2) -1, _picRect.top, _picRect.left + (_picRect.width() / 2), _picRect.bottom); Common::Rect rightRect = Common::Rect(leftRect.right, _picRect.top, leftRect.right + 1, _picRect.bottom); @@ -528,7 +535,8 @@ void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) { } } -// vertically displays new screen starting from edges - works on _picRect area only +// Vertically displays new screen starting from edges - works on _picRect area +// only void GfxTransitions::verticalRollToCenter(bool blackoutFlag) { Common::Rect leftRect = Common::Rect(_picRect.left, _picRect.top, _picRect.left + 1, _picRect.bottom); Common::Rect rightRect = Common::Rect(leftRect.right - 1, _picRect.top, leftRect.right, _picRect.bottom); @@ -540,7 +548,8 @@ void GfxTransitions::verticalRollToCenter(bool blackoutFlag) { } } -// horizontally displays new screen starting from center - works on _picRect area only +// Horizontally displays new screen starting from center - works on _picRect +// area only void GfxTransitions::horizontalRollFromCenter(bool blackoutFlag) { Common::Rect upperRect = Common::Rect(_picRect.left, _picRect.top + (_picRect.height() / 2) - 1, _picRect.right, _picRect.top + (_picRect.height() / 2)); Common::Rect lowerRect = Common::Rect(upperRect.left, upperRect.bottom, upperRect.right, upperRect.bottom + 1); @@ -556,7 +565,8 @@ void GfxTransitions::horizontalRollFromCenter(bool blackoutFlag) { } } -// horizontally displays new screen starting from upper and lower edge - works on _picRect area only +// Horizontally displays new screen starting from upper and lower edge - works +// on _picRect area only void GfxTransitions::horizontalRollToCenter(bool blackoutFlag) { Common::Rect upperRect = Common::Rect(_picRect.left, _picRect.top, _picRect.right, _picRect.top + 1); Common::Rect lowerRect = Common::Rect(upperRect.left, _picRect.bottom - 1, upperRect.right, _picRect.bottom); @@ -568,8 +578,8 @@ void GfxTransitions::horizontalRollToCenter(bool blackoutFlag) { } } -// diagonally displays new screen starting from center - works on _picRect area only -// assumes that height of rect is larger than width +// Diagonally displays new screen starting from center - works on _picRect area +// only. Assumes that height of rect is larger than width. void GfxTransitions::diagonalRollFromCenter(bool blackoutFlag) { int16 halfHeight = _picRect.height() / 2; Common::Rect upperRect(_picRect.left + halfHeight - 2, _picRect.top + halfHeight, _picRect.right - halfHeight + 1, _picRect.top + halfHeight + 1); @@ -598,8 +608,8 @@ void GfxTransitions::diagonalRollFromCenter(bool blackoutFlag) { } } -// diagonally displays new screen starting from edges - works on _picRect area only -// assumes that height of rect is larger than width +// Diagonally displays new screen starting from edges - works on _picRect area +// only. Assumes that height of rect is larger than width. void GfxTransitions::diagonalRollToCenter(bool blackoutFlag) { Common::Rect upperRect(_picRect.left, _picRect.top, _picRect.right, _picRect.top + 1); Common::Rect lowerRect(_picRect.left, _picRect.bottom - 1, _picRect.right, _picRect.bottom); -- cgit v1.2.3 From bf2b059a63ff68d2688d48e24f5bdcf97de46335 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 29 Jun 2010 18:20:10 +0000 Subject: Silence possible use of uninitialized variable warning in g++. svn-id: r50501 --- engines/tinsel/tinlib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index 677392a35d..766d4ed54a 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -5557,7 +5557,7 @@ int CallLibraryRoutine(CORO_PARAM, int operand, int32 *pp, const INT_CONTEXT *pi case WALKED: { // Common to both DW1 & DW2 pp -= 3; // 4 parameters - bool tmp; + bool tmp = false; Walked(coroParam, pp[0], pp[1], pp[2], pp[3], pic->escOn, pic->myEscape, tmp); if (!coroParam) { // Only write the result to the stack if walked actually completed running. -- cgit v1.2.3 From 42351265f16779569cf170ff0e85658db26e7ee7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 29 Jun 2010 20:12:42 +0000 Subject: Fixed 2 uninitialized reads in SQ6 svn-id: r50502 --- engines/sci/engine/vm.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 2047482bac..fe37f09f31 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -288,6 +288,8 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller + { GID_SQ6, 0, "Game", "init", -1, 2, 0 }, + { GID_SQ6, 64950, "View", "handleEvent", -1, 0, 0 }, { (SciGameId)0, -1, NULL, NULL, -1, 0, 0 } }; -- cgit v1.2.3 From 3a2ac994d4565beff844aa802211099a4785a3e0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 29 Jun 2010 20:13:57 +0000 Subject: Handle empty clip rectangles in GfxView::drawScaled(). Fixes an assert in the first room of the game svn-id: r50503 --- engines/sci/graphics/view.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index ee9611b046..244114e866 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -660,8 +660,12 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, scaledWidth = MIN(clipRect.width(), scaledWidth); scaledHeight = MIN(clipRect.height(), scaledHeight); - const uint16 offsetY = clipRect.top - rect.top; - const uint16 offsetX = clipRect.left - rect.left; + const int16 offsetY = clipRect.top - rect.top; + const int16 offsetX = clipRect.left - rect.left; + + // Happens in SQ6, first room + if (offsetX < 0 || offsetY < 0) + return; assert(scaledHeight + offsetY <= ARRAYSIZE(scalingY)); assert(scaledWidth + offsetX <= ARRAYSIZE(scalingX)); -- cgit v1.2.3 From 7951e3ddcf1053686882b6fe4881a4607bcbea05 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 20:44:19 +0000 Subject: SCI: kernelMap cleanup and making it possible to have version (not implemented yet) or platform specific entries - changing signature for kNewWindow - using old dummy-signature for mac-only svn-id: r50504 --- engines/sci/engine/kernel.cpp | 489 +++++++++++++++++++++++------------------- 1 file changed, 270 insertions(+), 219 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 75eadb9a64..f804ce0426 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -199,201 +199,227 @@ static const char *s_defaultKernelNames[] = { /*0x88*/ "Dummy" // DbugStr }; -struct SciKernelFunction { +// [io] -> either integer or object +// (io) -> optionally integer AND an object +// (i) -> optional integer +// . -> any type +// i* -> optional multiple integers +// .* -> any parameters afterwards (or none) + +struct SciKernelMapEntry { const char *name; - KernelFunc *func; /* The actual function */ - const char *signature; /* kfunct signature */ + KernelFunc *function; + + SciVersion fromVersion; + SciVersion toVersion; + byte forPlatform; + + const char *signature; + const char *subSignature; // placeholder }; -static SciKernelFunction s_kernelFuncMap[] = { - /*00*/ { "Load", kLoad, "iii*" }, - /*01*/ { "UnLoad", kUnLoad, "i.*" }, // Work around SQ1 bug, when exiting the Ulence flats bar - /*02*/ { "ScriptID", kScriptID, "Ioi*" }, - /*03*/ { "DisposeScript", kDisposeScript, "Oii*" }, // Work around QfG1 bug - /*04*/ { "Clone", kClone, "o" }, - /*05*/ { "DisposeClone", kDisposeClone, "o" }, - /*06*/ { "IsObject", kIsObject, "." }, - /*07*/ { "RespondsTo", kRespondsTo, ".i" }, - /*08*/ { "DrawPic", kDrawPic, "i*" }, - - /*0a*/ { "PicNotValid", kPicNotValid, "i*" }, - /*0b*/ { "Animate", kAnimate, "LI*" }, // More like (li?)? - /*0c*/ { "SetNowSeen", kSetNowSeen, "oi*" }, // The second parameter is ignored - /*0d*/ { "NumLoops", kNumLoops, "o" }, - /*0e*/ { "NumCels", kNumCels, "o" }, - /*0f*/ { "CelWide", kCelWide, "iOi*" }, - /*10*/ { "CelHigh", kCelHigh, "iOi*" }, - /*11*/ { "DrawCel", kDrawCel, "iiiiii*i*r*" }, - /*12*/ { "AddToPic", kAddToPic, "Il*" }, - // FIXME: signature check removed (set to .*) as kNewWindow is different in Mac versions - /*13*/ { "NewWindow", kNewWindow, "*." }, - ///*13*/ { "NewWindow", kNewWindow, "iiiiZRi*" }, - /*14*/ { "GetPort", kGetPort, "" }, - /*15*/ { "SetPort", kSetPort, "ii*" }, - /*16*/ { "DisposeWindow", kDisposeWindow, "ii*" }, - /*17*/ { "DrawControl", kDrawControl, "o" }, - /*18*/ { "HiliteControl", kHiliteControl, "o" }, - /*19*/ { "EditControl", kEditControl, "ZoZo" }, - /*1a*/ { "TextSize", kTextSize, "rZrii*r*" }, - /*1b*/ { "Display", kDisplay, ".*" }, - /*1c*/ { "GetEvent", kGetEvent, "ioi*" }, // Mac versions pass an extra 3rd parameter (ignored - always 0?) - /*1d*/ { "GlobalToLocal", kGlobalToLocal, "oo*" }, - /*1e*/ { "LocalToGlobal", kLocalToGlobal, "oo*" }, - /*1f*/ { "MapKeyToDir", kMapKeyToDir, "o" }, - /*20*/ { "DrawMenuBar", kDrawMenuBar, "i" }, - /*21*/ { "MenuSelect", kMenuSelect, "oi*" }, - /*22*/ { "AddMenu", kAddMenu, "rr" }, - /*23*/ { "DrawStatus", kDrawStatus, "Zri*" }, - /*24*/ { "Parse", kParse, "ro" }, - /*25*/ { "Said", kSaid, "Zr" }, - /*26*/ { "SetSynonyms", kSetSynonyms, "o" }, - /*27*/ { "HaveMouse", kHaveMouse, "" }, - /*28*/ { "SetCursor", kSetCursor, "i*" }, - // FIXME: The number 0x28 occurs twice :-) - /*28*/ { "MoveCursor", kMoveCursor, "ii" }, - /*29*/ { "FOpen", kFOpen, "ri" }, - /*2a*/ { "FPuts", kFPuts, "ir" }, - /*2b*/ { "FGets", kFGets, "rii" }, - /*2c*/ { "FClose", kFClose, "i" }, - /*2d*/ { "SaveGame", kSaveGame, "rirr*" }, - /*2e*/ { "RestoreGame", kRestoreGame, "rir*" }, - /*2f*/ { "RestartGame", kRestartGame, "" }, - /*30*/ { "GameIsRestarting", kGameIsRestarting, "i*" }, - /*31*/ { "DoSound", kDoSound, "iIo*" }, - /*32*/ { "NewList", kNewList, "" }, - /*33*/ { "DisposeList", kDisposeList, "l" }, - /*34*/ { "NewNode", kNewNode, ".." }, - /*35*/ { "FirstNode", kFirstNode, "Zl" }, - /*36*/ { "LastNode", kLastNode, "l" }, - /*37*/ { "EmptyList", kEmptyList, "l" }, - /*38*/ { "NextNode", kNextNode, "n" }, - /*39*/ { "PrevNode", kPrevNode, "n" }, - /*3a*/ { "NodeValue", kNodeValue, "Zn" }, - /*3b*/ { "AddAfter", kAddAfter, "lnn" }, - /*3c*/ { "AddToFront", kAddToFront, "ln" }, - /*3d*/ { "AddToEnd", kAddToEnd, "ln" }, - /*3e*/ { "FindKey", kFindKey, "l." }, - /*3f*/ { "DeleteKey", kDeleteKey, "l." }, - /*40*/ { "Random", kRandom, "i*" }, - /*41*/ { "Abs", kAbs, "Oi" }, - /*42*/ { "Sqrt", kSqrt, "i" }, - /*43*/ { "GetAngle", kGetAngle, "iiiii*" }, // occasionally KQ6 passes a 5th argument by mistake - /*44*/ { "GetDistance", kGetDistance, "iiiii*" }, - /*45*/ { "Wait", kWait, "i" }, - /*46*/ { "GetTime", kGetTime, "i*" }, - /*47*/ { "StrEnd", kStrEnd, "r" }, - /*48*/ { "StrCat", kStrCat, "rr" }, - /*49*/ { "StrCmp", kStrCmp, "rri*" }, - /*4a*/ { "StrLen", kStrLen, "Zr" }, - /*4b*/ { "StrCpy", kStrCpy, "rZri*" }, - /*4c*/ { "Format", kFormat, "r.*" }, - /*4d*/ { "GetFarText", kGetFarText, "iiZr" }, - /*4e*/ { "ReadNumber", kReadNumber, "r" }, - /*4f*/ { "BaseSetter", kBaseSetter, "o" }, - /*50*/ { "DirLoop", kDirLoop, "oi" }, - // Opcode 51 is defined twice for a reason: In older SCI versions - // it is CanBeHere, whereas in newer version it is CantBeHere - /*51*/ { "CanBeHere", kCanBeHere, "ol*" }, - /*51*/ { "CantBeHere", kCantBeHere, "ol*" }, - /*52*/ { "OnControl", kOnControl, "i*" }, - /*53*/ { "InitBresen", kInitBresen, "oi*" }, - /*54*/ { "DoBresen", kDoBresen, "o" }, - /*55*/ { "DoAvoider", kDoAvoider, "o" }, - /*56*/ { "SetJump", kSetJump, "oiii" }, - /*57*/ { "SetDebug", kSetDebug, "i*" }, - /*5c*/ { "MemoryInfo", kMemoryInfo, "i" }, - /*5f*/ { "GetMenu", kGetMenu, "i." }, - /*60*/ { "SetMenu", kSetMenu, "i.*" }, - /*61*/ { "GetSaveFiles", kGetSaveFiles, "rrr" }, - /*62*/ { "GetCWD", kGetCWD, "r" }, - /*63*/ { "CheckFreeSpace", kCheckFreeSpace, "r.*" }, - /*64*/ { "ValidPath", kValidPath, "r" }, - /*65*/ { "CoordPri", kCoordPri, "ii*" }, - /*66*/ { "StrAt", kStrAt, "rii*" }, - /*67*/ { "DeviceInfo", kDeviceInfo, "i.*" }, - /*68*/ { "GetSaveDir", kGetSaveDir, ".*" }, // accepts a parameter in SCI2+ games - /*69*/ { "CheckSaveGame", kCheckSaveGame, ".*" }, - /*6a*/ { "ShakeScreen", kShakeScreen, "ii*" }, - /*6b*/ { "FlushResources", kFlushResources, "i" }, - /*6c*/ { "TimesSin", kTimesSin, "ii" }, - /*6d*/ { "TimesCos", kTimesCos, "ii" }, - /*6e*/ { "6e", kTimesSin, "ii" }, - /*6f*/ { "6f", kTimesCos, "ii" }, - /*70*/ { "Graph", kGraph, ".*" }, - /*71*/ { "Joystick", kJoystick, ".*" }, - - // Experimental functions - /*74*/ { "FileIO", kFileIO, "i.*" }, - /*(?)*/ { "Memory", kMemory, "i.*" }, - /*(?)*/ { "Sort", kSort, "ooo" }, - /*(?)*/ { "AvoidPath", kAvoidPath, "ii.*" }, - /*(?)*/ { "Lock", kLock, "iii*" }, - /*(?)*/ { "Palette", kPalette, "i.*" }, - /*(?)*/ { "IsItSkip", kIsItSkip, "iiiii" }, - /*7b*/ { "StrSplit", kStrSplit, "rrZr" }, - - // Non-experimental functions without a fixed ID - { "CosMult", kTimesCos, "ii" }, - { "SinMult", kTimesSin, "ii" }, - - // Misc functions - /*(?)*/ { "CosDiv", kCosDiv, "ii" }, - /*(?)*/ { "PriCoord", kPriCoord, "i" }, - /*(?)*/ { "SinDiv", kSinDiv, "ii" }, - /*(?)*/ { "TimesCot", kTimesCot, "ii" }, - /*(?)*/ { "TimesTan", kTimesTan, "ii" }, - { "Message", kMessage, ".*" }, - { "GetMessage", kGetMessage, "iiir" }, - { "DoAudio", kDoAudio, ".*" }, - { "DoSync", kDoSync, ".*" }, - { "MemorySegment", kMemorySegment, "iri*" }, - { "Intersections", kIntersections, "iiiiriiiri" }, - { "MergePoly", kMergePoly, "rli" }, - { "ResCheck", kResCheck, "iii*" }, - { "SetQuitStr", kSetQuitStr, "r" }, - { "ShowMovie", kShowMovie, ".*" }, - { "SetVideoMode", kSetVideoMode, "i" }, - { "Platform", kPlatform, ".*" }, - { "TextColors", kTextColors, ".*" }, - { "TextFonts", kTextFonts, ".*" }, - { "Portrait", kPortrait, ".*" }, - { "PalVary", kPalVary, "ii*" }, - { "AssertPalette", kAssertPalette, "i" }, - { "Empty", kEmpty, ".*" }, +#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE +#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 +#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE + +#define SIGFOR_ALL 0x4f +#define SIGFOR_PC 1 << 0 +#define SIGFOR_PC98 1 << 1 +#define SIGFOR_WIN 1 << 2 +#define SIGFOR_MAC 1 << 3 +#define SIGFOR_AMIGA 1 << 4 +#define SIGFOR_ATARI 1 << 5 + +#define SIG_EVERYWHERE SIG_SCI32, SIGFOR_ALL + +#define MAP_CALL(_name_) #_name_, k##_name_ + +// name, version, platf., function, signature, subfunction-signatures +static SciKernelMapEntry s_kernelMap[] = { + { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL }, + // ^^ FIXME - Work around SQ1 bug, when exiting the Ulence flats bar + { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "Oii*", NULL }, + // ^^ FIXME - Work around QfG1 bug + { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL }, + { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL }, + { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(Animate), SIG_EVERYWHERE, "LI*", NULL }, + // ^^ FIXME - More like (li?)? + { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "oi*", NULL }, + // ^^ FIXME - The second parameter is ignored + { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL }, + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*r*", NULL }, + { MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL }, + { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL }, + { MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL }, + { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "ii*", NULL }, + { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "ii*", NULL }, + { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL }, + { MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL }, + { MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(GetEvent), SIG_EVERYWHERE, "ioi*", NULL }, + // ^^ FIXME Mac versions pass an extra 3rd parameter (ignored - always 0?) + { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL }, + { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL }, + { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "oi*", NULL }, + { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL }, + { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "Zri*", NULL }, + { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL }, + { MAP_CALL(Said), SIG_EVERYWHERE, "Zr", NULL }, + { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL }, + { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL }, + { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL }, + { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rirr*", NULL }, + { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir*", NULL }, + { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "iIo*", NULL }, + { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL }, + { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL }, + { MAP_CALL(FirstNode), SIG_EVERYWHERE, "Zl", NULL }, + { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL }, + { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL }, + { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL }, + { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL }, + { MAP_CALL(NodeValue), SIG_EVERYWHERE, "Zn", NULL }, + { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL }, + { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL }, + { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL }, + { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL }, + { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(Abs), SIG_EVERYWHERE, "Oi", NULL }, + { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiiii*", NULL }, + // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake + { MAP_CALL(GetDistance), SIG_EVERYWHERE, "iiiii*", NULL }, + { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(GetTime), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL }, + { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL }, + { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rri*", NULL }, + { MAP_CALL(StrLen), SIG_EVERYWHERE, "Zr", NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "rZri*", NULL }, + { MAP_CALL(Format), SIG_EVERYWHERE, "r.*", NULL }, + { MAP_CALL(GetFarText), SIG_EVERYWHERE, "iiZr", NULL }, + { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL }, + { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL }, + { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "ol*", NULL }, + { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "ol*", NULL }, + { MAP_CALL(OnControl), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(InitBresen), SIG_EVERYWHERE, "oi*", NULL }, + { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL }, + { MAP_CALL(SetDebug), SIG_EVERYWHERE, "i*", NULL }, + { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL }, + { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL }, + { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL }, + { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r.*", NULL }, + { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL }, + { MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL }, + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, ".*", NULL }, + // ^^ FIXME accepts a parameter in SCI2+ games + { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL }, + { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(Joystick), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(Memory), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL }, + { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii.*", NULL }, + { MAP_CALL(Lock), SIG_EVERYWHERE, "iii*", NULL }, + { MAP_CALL(Palette), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL }, + { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rrZr", NULL }, + { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL }, + { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL }, + { MAP_CALL(Message), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL }, + { MAP_CALL(DoAudio), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(DoSync), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "iri*", NULL }, + { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL }, + { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL }, + { MAP_CALL(ResCheck), SIG_EVERYWHERE, "iii*", NULL }, + { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL }, + { MAP_CALL(ShowMovie), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(Platform), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(TextColors), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(TextFonts), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(Portrait), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(PalVary), SIG_EVERYWHERE, "ii*", NULL }, + { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL }, + { MAP_CALL(Empty), SIG_EVERYWHERE, ".*", NULL }, #ifdef ENABLE_SCI32 - // SCI2 Kernel Functions - { "IsHiRes", kIsHiRes, "" }, - { "Array", kArray, ".*" }, - { "ListAt", kListAt, "li" }, - { "String", kString, ".*" }, - { "AddScreenItem", kAddScreenItem, "o" }, - { "UpdateScreenItem", kUpdateScreenItem, "o" }, - { "DeleteScreenItem", kDeleteScreenItem, "o" }, - { "AddPlane", kAddPlane, "o" }, - { "DeletePlane", kDeletePlane, "o" }, - { "UpdatePlane", kUpdatePlane, "o" }, - { "RepaintPlane", kRepaintPlane, "o" }, - { "GetHighPlanePri", kGetHighPlanePri, "" }, - { "FrameOut", kFrameOut, "" }, - { "ListEachElementDo", kListEachElementDo, "li.*" }, - { "ListFirstTrue", kListFirstTrue, "li.*" }, - { "ListAllTrue", kListAllTrue, "li.*" }, - { "ListIndexOf", kListIndexOf, "lZo" }, - { "OnMe", kOnMe, "iio.*" }, - { "InPolygon", kInPolygon, "iio" }, - { "CreateTextBitmap", kCreateTextBitmap, "i.*" }, - - // SCI2.1 Kernel Functions - { "Save", kSave, ".*" }, - { "List", kList, ".*" }, - { "Robot", kRobot, ".*" }, - { "PlayVMD", kPlayVMD, ".*" }, - { "IsOnMe", kIsOnMe, "iio.*" }, - { "MulDiv", kMulDiv, "iii" }, - { "Text", kText, ".*" }, - + // SCI2 Kernel Functions + { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(Array), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL }, + { MAP_CALL(String), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL }, + { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL }, + { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li.*", NULL }, + { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li.*", NULL }, + { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li.*", NULL }, + { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "lZo", NULL }, + { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio.*", NULL }, + { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL }, + { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i.*", NULL }, + + // SCI2.1 Kernel Functions + { MAP_CALL(Save), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(List), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(Robot), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(PlayVMD), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL }, + { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL }, + { MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL }, + { NULL, NULL, SIG_EVERYWHERE, NULL, NULL } #endif +}; #if 0 // Stub functions @@ -406,9 +432,6 @@ static SciKernelFunction s_kernelFuncMap[] = { { "DbugStr", kDbugStr, ".*" }, #endif - {NULL, NULL, NULL} // Terminator -}; - Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan), _invalid("") { loadSelectorNames(); @@ -569,55 +592,83 @@ static char *compileKernelSignature(const char *s) { void Kernel::mapFunctions() { int mapped = 0; int ignored = 0; - uint functions_nr = _kernelNames.size(); + uint functionCount = _kernelNames.size(); + byte platformMask = 0; - _kernelFuncs.resize(functions_nr); + switch (g_sci->getPlatform()) { + case Common::kPlatformPC: + platformMask = SIGFOR_PC; + break; + case Common::kPlatformPC98: + platformMask = SIGFOR_PC98; + break; + case Common::kPlatformWindows: + platformMask = SIGFOR_WIN; + break; + case Common::kPlatformMacintosh: + platformMask = SIGFOR_MAC; + break; + case Common::kPlatformAmiga: + platformMask = SIGFOR_AMIGA; + break; + case Common::kPlatformAtariST: + platformMask = SIGFOR_ATARI; + break; + default: + break; + } - for (uint functnr = 0; functnr < functions_nr; functnr++) { - int found = -1; + _kernelFuncs.resize(functionCount); + for (uint functNr = 0; functNr < functionCount; functNr++) { // First, get the name, if known, of the kernel function with number functnr - Common::String sought_name = _kernelNames[functnr]; + Common::String sought_name = _kernelNames[functNr]; // Reset the table entry - _kernelFuncs[functnr].func = NULL; - _kernelFuncs[functnr].signature = NULL; - _kernelFuncs[functnr].origName = sought_name; + _kernelFuncs[functNr].func = NULL; + _kernelFuncs[functNr].signature = NULL; + _kernelFuncs[functNr].origName = sought_name; + _kernelFuncs[functNr].isDummy = true; if (sought_name.empty()) { // No name was given -> must be an unknown opcode - warning("Kernel function %x unknown", functnr); - _kernelFuncs[functnr].isDummy = true; + warning("Kernel function %x unknown", functNr); continue; } // Don't map dummy functions - they will never be called - if (sought_name == "Dummy") { - _kernelFuncs[functnr].isDummy = true; + if (sought_name == "Dummy") continue; - } - // If the name is known, look it up in s_kernelFuncMap. This table + // If the name is known, look it up in s_kernelMap. This table // maps kernel func names to actual function (pointers). - for (uint seeker = 0; (found == -1) && s_kernelFuncMap[seeker].name; seeker++) - if (sought_name == s_kernelFuncMap[seeker].name) - found = seeker; // Found a kernel function with the correct name! + SciKernelMapEntry *kernelMap = s_kernelMap; + bool nameMatch = false; + while (kernelMap->name) { + if (sought_name == kernelMap->name) { + if (platformMask & kernelMap->forPlatform) + break; + nameMatch = true; + } + kernelMap++; + } - if (found == -1) { - // No match but a name was given -> stub - warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functnr); - _kernelFuncs[functnr].isDummy = true; - } else { - // A match in s_kernelFuncMap was found - if (s_kernelFuncMap[found].func) { - _kernelFuncs[functnr].func = s_kernelFuncMap[found].func; - _kernelFuncs[functnr].signature = compileKernelSignature(s_kernelFuncMap[found].signature); - _kernelFuncs[functnr].isDummy = false; + if (kernelMap->name) { + // A match was found + if (kernelMap->function) { + _kernelFuncs[functNr].func = kernelMap->function; + _kernelFuncs[functNr].signature = compileKernelSignature(kernelMap->signature); + _kernelFuncs[functNr].isDummy = false; ++mapped; } else { //warning("Ignoring function %s\n", s_kernelFuncMap[found].name); ++ignored; } + } else { + if (nameMatch) + error("kernel function %s[%x] not found for this version/platform", sought_name.c_str(), functNr); + // No match but a name was given -> stub + warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functNr); } } // for all functions requesting to be mapped -- cgit v1.2.3 From b09996cb5cea63482c16faafb55d83bd50c04c90 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 29 Jun 2010 20:50:52 +0000 Subject: SCI: Rewrap yet more comments svn-id: r50505 --- engines/sci/sound/audio.cpp | 16 ++++++----- engines/sci/sound/music.cpp | 43 ++++++++++++++++++------------ engines/sci/sound/soundcmd.cpp | 60 ++++++++++++++++++++++++------------------ 3 files changed, 69 insertions(+), 50 deletions(-) diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 336218eaec..ed9061ab81 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -77,9 +77,10 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { } int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { - // Get the audio sample length and set the wPlay flag so we return 0 on position. - // SSCI pre-loads the audio here, but it's much easier for us to just get the - // sample length and return that. wPlayAudio should *not* actually start the sample. + // Get the audio sample length and set the wPlay flag so we return 0 on + // position. SSCI pre-loads the audio here, but it's much easier for us to + // just get the sample length and return that. wPlayAudio should *not* + // actually start the sample. int sampleLen = 0; Audio::AudioStream *audioStream = getAudioStream(tuple, module, &sampleLen); @@ -272,8 +273,8 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 byte *compressedData = (byte *)malloc(audioRes->size); assert(compressedData); // We copy over the compressed data in our own buffer. We have to do - // this, because ResourceManager may free the original data late. - // All other compression types already decompress completely into an + // this, because ResourceManager may free the original data late. All + // other compression types already decompress completely into an // additional buffer here. MP3/OGG/FLAC decompression works on-the-fly // instead. memcpy(compressedData, audioRes->data, audioRes->size); @@ -367,8 +368,9 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 *sampleLen = (audioSeekStream->getLength().msecs() * 60) / 1000; // we translate msecs to ticks audioStream = audioSeekStream; } - // We have to make sure that we don't depend on resource manager pointers after this point, because the actual - // audio resource may get unloaded by resource manager at any time + // We have to make sure that we don't depend on resource manager pointers + // after this point, because the actual audio resource may get unloaded by + // resource manager at any time. if (audioStream) return audioStream; diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index ba103ee746..874f0a381e 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -64,11 +64,16 @@ void SciMusic::init() { _dwTempo = 0; // Default to MIDI in SCI32 games, as many don't have AdLib support. - // WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support those patches yet. - // We also don't yet support the 7.pat file of SCI1+ Mac games or SCI0 Mac patches, so we - // default to MIDI in those games to let them run. + // WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support + // those patches yet. We also don't yet support the 7.pat file of SCI1+ Mac + // games or SCI0 Mac patches, so we default to MIDI in those games to let + // them run. Common::Platform platform = g_sci->getPlatform(); - uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); + uint32 dev = MidiDriver::detectDevice( + (getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || + (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) + ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) + : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); switch (MidiDriver::getMusicType(dev)) { case MT_ADLIB: @@ -100,7 +105,8 @@ void SciMusic::init() { _bMultiMidi = ConfMan.getBool("multi_midi"); - // Find out what the first possible channel is (used, when doing channel remapping) + // Find out what the first possible channel is (used, when doing channel + // remapping). _driverFirstChannel = _pMidiDrv->getFirstChannel(); } @@ -128,9 +134,10 @@ void SciMusic::putMidiCommandInQueue(uint32 midi) { _queuedCommands.push_back(midi); } -// This sends the stored commands from queue to driver (is supposed to get called only during onTimer()) -// at least mt32 emulation doesn't like getting note-on commands from main thread (if we directly send, we would get -// a crash during piano scene in lsl5) +// This sends the stored commands from queue to driver (is supposed to get +// called only during onTimer()). At least mt32 emulation doesn't like getting +// note-on commands from main thread (if we directly send, we would get a crash +// during piano scene in lsl5). void SciMusic::sendMidiCommandsFromQueue() { uint curCommand = 0; uint commandCount = _queuedCommands.size(); @@ -210,10 +217,10 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { int channelFilterMask = 0; SoundResource::Track *track = pSnd->soundRes->getTrackByType(_pMidiDrv->getPlayId()); - // If MIDI device is selected but there is no digital track in sound resource - // try to use adlib's digital sample if possible - // Also, if the track couldn't be found, load the digital track, as some games - // depend on this (e.g. the Longbow demo) + // If MIDI device is selected but there is no digital track in sound + // resource try to use adlib's digital sample if possible. Also, if the + // track couldn't be found, load the digital track, as some games depend on + // this (e.g. the Longbow demo). if (!track || (_bMultiMidi && track->digitalChannelNr == -1)) { SoundResource::Track *digital = pSnd->soundRes->getDigitalTrack(); if (digital) @@ -260,8 +267,8 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { } } -// This one checks, if requested channel is available -> in that case give caller that channel -// Otherwise look for an unused one +// This one checks, if requested channel is available -> in that case give +// caller that channel. Otherwise look for an unused one int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { // Don't even try this for SCI0 if (_soundVersion <= SCI_VERSION_0_LATE) @@ -316,7 +323,7 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { if ((_soundVersion <= SCI_VERSION_0_LATE) && (alreadyPlaying)) { // Music already playing in SCI0? if (pSnd->priority > alreadyPlaying->priority) { - // And new priority higher? pause previous music and play new one immediately + // And new priority higher? pause previous music and play new one immediately. // Example of such case: lsl3, when getting points (jingle is played then) soundPause(alreadyPlaying); alreadyPlaying->isQueued = true; @@ -339,7 +346,8 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { pSnd->pLoopStream, -1, pSnd->volume, 0, DisposeAfterUse::NO); } else { - // Rewind in case we play the same sample multiple times (non-looped) like in pharkas right at the start + // Rewind in case we play the same sample multiple times + // (non-looped) like in pharkas right at the start pSnd->pStreamAud->rewind(); _pMixer->playStream(pSnd->soundType, &pSnd->hCurrentAud, pSnd->pStreamAud, -1, pSnd->volume, 0, @@ -377,7 +385,8 @@ void SciMusic::soundStop(MusicEntry *pSnd) { if (pSnd->pMidiParser) { _mutex.lock(); pSnd->pMidiParser->mainThreadBegin(); - // We shouldn't call stop in case it's paused, otherwise we would send allNotesOff() again + // We shouldn't call stop in case it's paused, otherwise we would send + // allNotesOff() again if (previousStatus == kSoundPlaying) pSnd->pMidiParser->stop(); freeChannels(pSnd); diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 5e0f45e166..7cdb3e08bf 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -134,7 +134,8 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM _resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) { #ifdef USE_OLD_MUSIC_FUNCTIONS - // The following hack is needed to ease the change from old to new sound code (because the new sound code does not use SfxState) + // The following hack is needed to ease the change from old to new sound + // code (because the new sound code does not use SfxState) _state = &g_sci->getEngineState()->_sound; // HACK #endif @@ -378,22 +379,24 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { } if (!readSelectorValue(_segMan, obj, SELECTOR(nodePtr)) && obj.segment) { - // In SCI1.1 games, sound effects are started from here. If we can find - // a relevant audio resource, play it, otherwise switch to synthesized - // effects. If the resource exists, play it using map 65535 (sound - // effects map) + // In SCI1.1 games, sound effects are started from here. If we can + // find a relevant audio resource, play it, otherwise switch to + // synthesized effects. If the resource exists, play it using map + // 65535 (sound effects map). if (_resMan->testResource(ResourceId(kResourceTypeAudio, songNumber)) && getSciVersion() >= SCI_VERSION_1_1) { // Found a relevant audio resource, play it _audio->stopAudio(); warning("Initializing audio resource instead of requested sound resource %d", songNumber); sampleLen = _audio->startAudio(65535, songNumber); - // Also create iterator, that will fire SI_FINISHED event, when the sound is done playing + // Also create iterator, that will fire SI_FINISHED event, when + // the sound is done playing. _state->sfx_add_song(new_timer_iterator(sampleLen), 0, handle, songNumber); } else { if (!_resMan->testResource(ResourceId(kResourceTypeSound, songNumber))) { warning("Could not open song number %d", songNumber); - // Send a "stop handle" event so that the engine won't wait forever here + // Send a "stop handle" event so that the engine won't wait + // forever here. _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); return; @@ -533,12 +536,13 @@ void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFin writeSelectorValue(_segMan, obj, SELECTOR(handle), 0); } - // Set signal selector in sound SCI0 games only, when the sample has finished playing - // If we don't set it at all, we get a problem when using vaporizer on the 2 guys - // If we set it all the time, we get no music in sq3new and kq1 - // FIXME: this *may* be wrong, it's impossible to find out in sierra DOS sci, because SCI0 under DOS didn't have - // sfx drivers included - // We need to set signal in sound SCI1+ games all the time + // Set signal selector in sound SCI0 games only, when the sample has + // finished playing. If we don't set it at all, we get a problem when using + // vaporizer on the 2 guys. If we set it all the time, we get no music in + // sq3new and kq1. + // FIXME: This *may* be wrong, it's impossible to find out in Sierra DOS + // SCI, because SCI0 under DOS didn't have sfx drivers included. + // We need to set signal in sound SCI1+ games all the time. if ((_soundVersion > SCI_VERSION_0_LATE) || sampleFinishedPlaying) writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); @@ -560,8 +564,8 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) { #else if (!obj.segment) { // pause the whole playlist - // Pausing/Resuming the whole playlist was introduced - // in the SCI1 late sound scheme + // Pausing/Resuming the whole playlist was introduced in the SCI1 late + // sound scheme. if (_soundVersion <= SCI_VERSION_1_EARLY) return; @@ -685,7 +689,8 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { switch (_argc) { case 2: // SCI0 - // SCI0 fades out all the time and when fadeout is done it will also stop the music from playing + // SCI0 fades out all the time and when fadeout is done it will also + // stop the music from playing musicSlot->fadeTo = 0; musicSlot->fadeStep = -5; musicSlot->fadeTickerStep = 10 * 16667 / _music->soundGetTempo(); @@ -864,10 +869,12 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { cmdStopSound(obj, 0); } } else { - // Slot actually has no data (which would mean that a sound-resource w/ unsupported data is used + // Slot actually has no data (which would mean that a sound-resource w/ + // unsupported data is used. // (example lsl5 - sound resource 744 - it's roland exclusive writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - // If we don't set signal here, at least the switch to the mud wrestling room in lsl5 will not work + // If we don't set signal here, at least the switch to the mud wrestling + // room in lsl5 will not work. } if (musicSlot->fadeCompleted) { @@ -968,9 +975,9 @@ void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // Do not throw a warning if the sound can't be found, as in some games - // this is called before the actual sound is loaded (e.g. SQ4CD, with the - // drum sounds of the energizer bunny at the beginning), so this is normal - // behavior + // this is called before the actual sound is loaded (e.g. SQ4CD, with + // the drum sounds of the energizer bunny at the beginning), so this is + // normal behavior. //warning("cmdSetSoundVolume: Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } @@ -1036,7 +1043,7 @@ void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { // before actually initializing the sound and adding it to the playlist // with cmdInitSound. Usually, it doesn't matter if the game doesn't // request to loop the sound, so in this case, don't throw any warning, - // otherwise do, because the sound won't be looped + // otherwise do, because the sound won't be looped. if (value == -1) { warning("cmdSetSoundLoop: Slot not found (%04x:%04x) and the song was requested to be looped", PRINT_REG(obj)); } else { @@ -1070,12 +1077,13 @@ void SoundCommandParser::updateSci0Cues() { const MusicList::iterator end = _music->getPlayListEnd(); for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) { // Is the sound stopped, and the sound object updated too? If yes, skip - // this sound, as SCI0 only allows one active song + // this sound, as SCI0 only allows one active song. if ((*i)->isQueued) { pWaitingForPlay = (*i); - // FIXME (?) - in iceman 2 songs are queued when playing the door sound - if we use the first song for resuming - // then it's the wrong one. Both songs have same priority. Maybe the new sound function in sci0 - // is somehow responsible + // FIXME(?): In iceman 2 songs are queued when playing the door + // sound - if we use the first song for resuming then it's the wrong + // one. Both songs have same priority. Maybe the new sound function + // in sci0 is somehow responsible. continue; } if ((*i)->signal == 0 && (*i)->status != kSoundPlaying) -- cgit v1.2.3 From c536630648ea7232508a477c3e503a0d867e25d9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 21:13:19 +0000 Subject: SCI: adding space in kernelmap for workaround table svn-id: r50506 --- engines/sci/engine/kernel.cpp | 343 +++++++++++++++++++++--------------------- 1 file changed, 172 insertions(+), 171 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index f804ce0426..40ee003cde 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -215,7 +215,8 @@ struct SciKernelMapEntry { byte forPlatform; const char *signature; - const char *subSignature; // placeholder + const char *subSignatures; // placeholder + const char *workarounds; // placeholder }; #define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE @@ -235,189 +236,189 @@ struct SciKernelMapEntry { #define MAP_CALL(_name_) #_name_, k##_name_ -// name, version, platf., function, signature, subfunction-signatures +// name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { - { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL, NULL }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL, NULL }, // ^^ FIXME - Work around SQ1 bug, when exiting the Ulence flats bar - { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL }, - { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "Oii*", NULL }, + { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "Oii*", NULL, NULL }, // ^^ FIXME - Work around QfG1 bug - { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL }, - { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL }, - { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(Animate), SIG_EVERYWHERE, "LI*", NULL }, + { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, + { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, + { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(Animate), SIG_EVERYWHERE, "LI*", NULL, NULL }, // ^^ FIXME - More like (li?)? - { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "oi*", NULL }, + { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "oi*", NULL, NULL }, // ^^ FIXME - The second parameter is ignored - { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL }, - { MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL }, - { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*r*", NULL }, - { MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL }, - { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL }, - { MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL }, - { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(SetPort), SIG_EVERYWHERE, "ii*", NULL }, - { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "ii*", NULL }, - { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL }, - { MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL }, - { MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(GetEvent), SIG_EVERYWHERE, "ioi*", NULL }, + { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL, NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*r*", NULL, NULL }, + { MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL, NULL }, + { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL, NULL }, + { MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL, NULL }, + { MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_EVERYWHERE, "ioi*", NULL, NULL }, // ^^ FIXME Mac versions pass an extra 3rd parameter (ignored - always 0?) - { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL }, - { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL }, - { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "oi*", NULL }, - { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL }, - { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "Zri*", NULL }, - { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL }, - { MAP_CALL(Said), SIG_EVERYWHERE, "Zr", NULL }, - { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL }, - { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL }, - { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL }, - { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rirr*", NULL }, - { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir*", NULL }, - { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "iIo*", NULL }, - { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL }, - { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL }, - { MAP_CALL(FirstNode), SIG_EVERYWHERE, "Zl", NULL }, - { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL }, - { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL }, - { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL }, - { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL }, - { MAP_CALL(NodeValue), SIG_EVERYWHERE, "Zn", NULL }, - { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL }, - { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL }, - { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL }, - { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL }, - { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL }, - { MAP_CALL(Random), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(Abs), SIG_EVERYWHERE, "Oi", NULL }, - { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiiii*", NULL }, + { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL, NULL }, + { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "oi*", NULL, NULL }, + { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "Zri*", NULL, NULL }, + { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, + { MAP_CALL(Said), SIG_EVERYWHERE, "Zr", NULL, NULL }, + { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, + { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, + { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, + { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rirr*", NULL, NULL }, + { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir*", NULL, NULL }, + { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "iIo*", NULL, NULL }, + { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, + { MAP_CALL(FirstNode), SIG_EVERYWHERE, "Zl", NULL, NULL }, + { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(NodeValue), SIG_EVERYWHERE, "Zn", NULL, NULL }, + { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, + { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(Abs), SIG_EVERYWHERE, "Oi", NULL, NULL }, + { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiiii*", NULL, NULL }, // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake - { MAP_CALL(GetDistance), SIG_EVERYWHERE, "iiiii*", NULL }, - { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(GetTime), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL }, - { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL }, - { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rri*", NULL }, - { MAP_CALL(StrLen), SIG_EVERYWHERE, "Zr", NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "rZri*", NULL }, - { MAP_CALL(Format), SIG_EVERYWHERE, "r.*", NULL }, - { MAP_CALL(GetFarText), SIG_EVERYWHERE, "iiZr", NULL }, - { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL }, - { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL }, - { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "ol*", NULL }, - { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "ol*", NULL }, - { MAP_CALL(OnControl), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(InitBresen), SIG_EVERYWHERE, "oi*", NULL }, - { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL }, - { MAP_CALL(SetDebug), SIG_EVERYWHERE, "i*", NULL }, - { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL }, - { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i.*", NULL }, - { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL }, - { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL }, - { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r.*", NULL }, - { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL }, - { MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL }, - { MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL }, - { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL }, - { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(GetDistance), SIG_EVERYWHERE, "iiiii*", NULL, NULL }, + { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(GetTime), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rri*", NULL, NULL }, + { MAP_CALL(StrLen), SIG_EVERYWHERE, "Zr", NULL, NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "rZri*", NULL, NULL }, + { MAP_CALL(Format), SIG_EVERYWHERE, "r.*", NULL, NULL }, + { MAP_CALL(GetFarText), SIG_EVERYWHERE, "iiZr", NULL, NULL }, + { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, + { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "ol*", NULL, NULL }, + { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "ol*", NULL, NULL }, + { MAP_CALL(OnControl), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(InitBresen), SIG_EVERYWHERE, "oi*", NULL, NULL }, + { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, + { MAP_CALL(SetDebug), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, + { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, + { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r.*", NULL, NULL }, + { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL, NULL }, + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, ".*", NULL, NULL }, // ^^ FIXME accepts a parameter in SCI2+ games - { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL }, - { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(Joystick), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(FileIO), SIG_EVERYWHERE, "i.*", NULL }, - { MAP_CALL(Memory), SIG_EVERYWHERE, "i.*", NULL }, - { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL }, - { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii.*", NULL }, - { MAP_CALL(Lock), SIG_EVERYWHERE, "iii*", NULL }, - { MAP_CALL(Palette), SIG_EVERYWHERE, "i.*", NULL }, - { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL }, - { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rrZr", NULL }, - { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL }, - { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL }, - { MAP_CALL(Message), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL }, - { MAP_CALL(DoAudio), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(DoSync), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "iri*", NULL }, - { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL }, - { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL }, - { MAP_CALL(ResCheck), SIG_EVERYWHERE, "iii*", NULL }, - { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL }, - { MAP_CALL(ShowMovie), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(Platform), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(TextColors), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(TextFonts), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(Portrait), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(PalVary), SIG_EVERYWHERE, "ii*", NULL }, - { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL }, - { MAP_CALL(Empty), SIG_EVERYWHERE, ".*", NULL }, + { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Joystick), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(Memory), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, + { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii.*", NULL, NULL }, + { MAP_CALL(Lock), SIG_EVERYWHERE, "iii*", NULL, NULL }, + { MAP_CALL(Palette), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, + { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rrZr", NULL, NULL }, + { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, + { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Message), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, + { MAP_CALL(DoAudio), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(DoSync), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "iri*", NULL, NULL }, + { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, + { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, + { MAP_CALL(ResCheck), SIG_EVERYWHERE, "iii*", NULL, NULL }, + { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(ShowMovie), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Platform), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(TextColors), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(TextFonts), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Portrait), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(PalVary), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Empty), SIG_EVERYWHERE, ".*", NULL, NULL }, #ifdef ENABLE_SCI32 // SCI2 Kernel Functions - { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(Array), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL }, - { MAP_CALL(String), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL }, - { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL }, - { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li.*", NULL }, - { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li.*", NULL }, - { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li.*", NULL }, - { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "lZo", NULL }, - { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio.*", NULL }, - { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL }, - { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i.*", NULL }, + { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(Array), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, + { MAP_CALL(String), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li.*", NULL, NULL }, + { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li.*", NULL, NULL }, + { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li.*", NULL, NULL }, + { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "lZo", NULL, NULL }, + { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio.*", NULL, NULL }, + { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, + { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i.*", NULL, NULL }, // SCI2.1 Kernel Functions - { MAP_CALL(Save), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(List), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(Robot), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(PlayVMD), SIG_EVERYWHERE, ".*", NULL }, - { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL }, - { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL }, - { MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL }, - { NULL, NULL, SIG_EVERYWHERE, NULL, NULL } + { MAP_CALL(Save), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(List), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Robot), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(PlayVMD), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL, NULL }, + { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, + { MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL, NULL }, + { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } #endif }; -- cgit v1.2.3 From 2e58bdc20237ce328ded894d19f3c27dfa475035 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 21:41:36 +0000 Subject: SCI: implemented version specific signatures, added special kDrawCel signature for SCI1.1 (PC)/kq6 svn-id: r50507 --- engines/sci/engine/kernel.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 40ee003cde..f251613991 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -225,14 +225,15 @@ struct SciKernelMapEntry { #define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE #define SIGFOR_ALL 0x4f -#define SIGFOR_PC 1 << 0 +#define SIGFOR_DOS 1 << 0 #define SIGFOR_PC98 1 << 1 #define SIGFOR_WIN 1 << 2 #define SIGFOR_MAC 1 << 3 #define SIGFOR_AMIGA 1 << 4 #define SIGFOR_ATARI 1 << 5 +#define SIGFOR_PC SIGFOR_DOS|SIGFOR_WIN -#define SIG_EVERYWHERE SIG_SCI32, SIGFOR_ALL +#define SIG_EVERYWHERE SIG_SCIALL, SIGFOR_ALL #define MAP_CALL(_name_) #_name_, k##_name_ @@ -258,7 +259,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL, NULL }, - { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*r*", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiiii*i*r*", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*", NULL, NULL }, { MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL, NULL }, { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL, NULL }, { MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL, NULL }, @@ -595,10 +597,11 @@ void Kernel::mapFunctions() { int ignored = 0; uint functionCount = _kernelNames.size(); byte platformMask = 0; + SciVersion myVersion = getSciVersion(); switch (g_sci->getPlatform()) { case Common::kPlatformPC: - platformMask = SIGFOR_PC; + platformMask = SIGFOR_DOS; break; case Common::kPlatformPC98: platformMask = SIGFOR_PC98; @@ -647,8 +650,10 @@ void Kernel::mapFunctions() { bool nameMatch = false; while (kernelMap->name) { if (sought_name == kernelMap->name) { - if (platformMask & kernelMap->forPlatform) - break; + if ((kernelMap->fromVersion == SCI_VERSION_NONE) || (kernelMap->fromVersion >= myVersion)) + if ((kernelMap->toVersion == SCI_VERSION_NONE) || (kernelMap->toVersion <= myVersion)) + if (platformMask & kernelMap->forPlatform) + break; nameMatch = true; } kernelMap++; -- cgit v1.2.3 From 0f28c799f013372c88dd420d084645b5275edb62 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 21:47:34 +0000 Subject: SCI: added mac-specific signature for kGetEvent svn-id: r50508 --- engines/sci/engine/kernel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index f251613991..9b492535d2 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -272,8 +272,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL, NULL }, { MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL, NULL }, { MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(GetEvent), SIG_EVERYWHERE, "ioi*", NULL, NULL }, - // ^^ FIXME Mac versions pass an extra 3rd parameter (ignored - always 0?) + { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "ioi*", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL, NULL }, { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL, NULL }, { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, -- cgit v1.2.3 From 97186bd5b03e012776bd3894e417a25118444ca9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 29 Jun 2010 21:53:27 +0000 Subject: SCI: added sci32-specific signature for kGetSaveDir svn-id: r50509 --- engines/sci/engine/kernel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9b492535d2..7a2e34a207 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -346,8 +346,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL, NULL }, { MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL, NULL }, { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, ".*", NULL, NULL }, - // ^^ FIXME accepts a parameter in SCI2+ games + { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "r*", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL, NULL }, { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, -- cgit v1.2.3 From 7455c3ec3954e068090004369600c03b6ede43a2 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 29 Jun 2010 21:56:04 +0000 Subject: AUDIO: fixed bug when device was set to default and only MDT_MIDI flags were passed to detectDevice() svn-id: r50510 --- sound/mididrv.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index d164864fc2..aaff78bf92 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -228,6 +228,9 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { tp = MT_ADLIB; else if (flags & MDT_PCSPK) tp = MT_PCSPK; + else if (l == 0) + // if we haven't tried to find a MIDI device yet we do this now. + continue; else tp = MT_AUTO; -- cgit v1.2.3 From 9f1413b338da98139efb68434f7f875e2abbd745 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 07:18:43 +0000 Subject: When deleting a list node, erase its references to predecessor and successor nodes. Fixes cases where game scripts could reference a list node after it was deleted (e.g. QFG1 intro, Longbow when exiting the cave). Some slight cleanup svn-id: r50515 --- engines/sci/engine/klists.cpp | 4 +++- engines/sci/engine/savegame.cpp | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index eff0e725b8..ef2f40e235 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -346,7 +346,9 @@ reg_t kDeleteKey(EngineState *s, int argc, reg_t *argv) { if (!n->succ.isNull()) s->_segMan->lookupNode(n->succ)->pred = n->pred; - //s->_segMan->free_Node(node_pos); // TODO + // Erase references to the predecessor and successor nodes + n->pred = NULL_REG; + n->succ = NULL_REG; return make_reg(0, 1); // Signal success } diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index bf7b88b699..b2528fe210 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -74,9 +74,7 @@ SongIterator *build_iterator(ResourceManager *resMan, int song_nr, SongIteratorT #ifdef USE_OLD_MUSIC_FUNCTIONS static void sync_songlib(Common::Serializer &s, SongLibrary &obj); -#endif -#ifdef USE_OLD_MUSIC_FUNCTIONS static void syncSong(Common::Serializer &s, Song &obj) { s.syncAsSint32LE(obj._handle); s.syncAsSint32LE(obj._resourceNum); -- cgit v1.2.3 From 7c5b31eb6d6e53a91efb9e0575f07055ea626ed0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 07:28:30 +0000 Subject: Also erase the value of the list node itself when deleting it inside kDeleteKey, as it might be referenced again before the GC is invoked svn-id: r50516 --- engines/sci/engine/klists.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index ef2f40e235..6e01768958 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -346,9 +346,11 @@ reg_t kDeleteKey(EngineState *s, int argc, reg_t *argv) { if (!n->succ.isNull()) s->_segMan->lookupNode(n->succ)->pred = n->pred; - // Erase references to the predecessor and successor nodes + // Erase the node itself, as the game might reference it + // again before the GC is invoked n->pred = NULL_REG; n->succ = NULL_REG; + n->value = NULL_REG; return make_reg(0, 1); // Signal success } -- cgit v1.2.3 From 1e8b74f9de0e3a6cf265376a1c4d2c9859f68c61 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 07:34:37 +0000 Subject: Updated incorrect comment svn-id: r50517 --- engines/sci/engine/klists.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 6e01768958..25df4bb563 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -346,8 +346,9 @@ reg_t kDeleteKey(EngineState *s, int argc, reg_t *argv) { if (!n->succ.isNull()) s->_segMan->lookupNode(n->succ)->pred = n->pred; - // Erase the node itself, as the game might reference it - // again before the GC is invoked + // Erase the node itself, as the game might reference it again. + // Happens in the intro of QFG1 and in Longbow, when exiting the + // cave. n->pred = NULL_REG; n->succ = NULL_REG; n->value = NULL_REG; -- cgit v1.2.3 From 764aa1a125e913fb6d9800f97136adcd13fff9ae Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 08:01:19 +0000 Subject: SCI: adding inheritancelevel to uninit workarounds to make them safer svn-id: r50518 --- engines/sci/engine/vm.cpp | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index fe37f09f31..a16e048713 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -266,6 +266,7 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in struct UninitializedReadWorkaround { SciGameId gameId; int scriptNr; + int16 inheritanceLevel; const char *objectName; const char *methodName; int localCallOffset; @@ -273,24 +274,24 @@ struct UninitializedReadWorkaround { uint16 newValue; }; -// gameID, scriptNr, object-name, method-name, call,index,replace +// gameID, scriptNr,lvl, object-name, method-name, call,index,replace static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room - { GID_LSL3, 997, "TheMenuBar", "handleEvent", -1, 1, 0xf }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 928, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon - { GID_KQ5, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, "rm025", "doit", -1, 0, 0 }, // inside witch forest, where the walking rock is - { GID_SQ1, 703, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, 703, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, 928, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller - { GID_SQ6, 0, "Game", "init", -1, 2, 0 }, - { GID_SQ6, 64950, "View", "handleEvent", -1, 0, 0 }, - { (SciGameId)0, -1, NULL, NULL, -1, 0, 0 } + { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu + { GID_LSL1, 720, 0, "rm720", "init", -1, 0, 0 }, // age check room + { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, 0xf }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon + { GID_KQ5, 0, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, 0 }, // inside witch forest, where the walking rock is + { GID_SQ1, 703, 0, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller + { GID_SQ6, 0, 0, "Game", "init", -1, 2, 0 }, + { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, 0 }, + { (SciGameId)0, -1, 0, NULL, NULL, -1, 0, 0 } }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -332,12 +333,13 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // Search if this is a known uninitialized read const UninitializedReadWorkaround *workaround; + int16 inheritanceLevel = 0; Common::String searchObjectName = curObjectName; reg_t searchObject = lastCall->sendp; do { workaround = uninitializedReadWorkarounds; while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->objectName == searchObjectName) + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->inheritanceLevel == inheritanceLevel) && (workaround->objectName == searchObjectName) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { // Workaround found r[index] = make_reg(0, workaround->newValue); @@ -346,6 +348,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i workaround++; } // Go back to the parent + inheritanceLevel++; searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); if (!searchObject.isNull()) searchObjectName = state->_segMan->getObjectName(searchObject); -- cgit v1.2.3 From c7f6a5b286bad600c987922396b7328079890342 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Wed, 30 Jun 2010 08:27:09 +0000 Subject: Generalize the sound archive framework to be able to open new formats svn-id: r50519 --- engines/draci/draci.cpp | 4 ++-- engines/draci/game.cpp | 2 +- engines/draci/game.h | 2 +- engines/draci/sound.cpp | 10 ++++----- engines/draci/sound.h | 55 +++++++++++++++++++++++++++++++++++++++---------- 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index ee883f9881..202bf6d187 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -123,8 +123,8 @@ int DraciEngine::init() { _itemImagesArchive = new BArchive(itemImagesPath); _stringsArchive = new BArchive(stringsPath); - _soundsArchive = new SoundArchive(soundsPath, kSoundsFrequency); - _dubbingArchive = new SoundArchive(dubbingPath, kDubbingFrequency); + _soundsArchive = new LegacySoundArchive(soundsPath, kSoundsFrequency); + _dubbingArchive = new LegacySoundArchive(dubbingPath, kDubbingFrequency); _sound = new Sound(_mixer); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index 23c50b8f63..8f3ad12cfd 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -332,7 +332,7 @@ void Game::handleOrdinaryLoop(int x, int y) { } } -int Game::inventoryPositionFromMouse() { +int Game::inventoryPositionFromMouse() const { const int column = CLIP(scummvm_lround( (_vm->_mouse->getPosX() - kInventoryX + kInventoryItemWidth / 2.) / kInventoryItemWidth) - 1, 0L, (long) kInventoryColumns - 1); diff --git a/engines/draci/game.h b/engines/draci/game.h index 275293074e..21baaed5cc 100644 --- a/engines/draci/game.h +++ b/engines/draci/game.h @@ -335,7 +335,7 @@ public: private: void updateOrdinaryCursor(); void updateInventoryCursor(); - int inventoryPositionFromMouse(); + int inventoryPositionFromMouse() const; void handleOrdinaryLoop(int x, int y); void handleInventoryLoop(); void handleDialogueLoop(); diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index 4fb2fd6309..65e7e41ac4 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -39,7 +39,7 @@ namespace Draci { -void SoundArchive::openArchive(const Common::String &path) { +void LegacySoundArchive::openArchive(const Common::String &path) { // Close previously opened archive (if any) closeArchive(); @@ -103,12 +103,12 @@ void SoundArchive::openArchive(const Common::String &path) { } /** - * @brief SoundArchive close method + * @brief LegacySoundArchive close method * * Closes the currently opened archive. It can be called explicitly to * free up memory. */ -void SoundArchive::closeArchive() { +void LegacySoundArchive::closeArchive() { clearCache(); delete _f; _f = NULL; @@ -123,7 +123,7 @@ void SoundArchive::closeArchive() { * Clears the cache of the open files inside the archive without closing it. * If the files are subsequently accessed, they are read from the disk. */ -void SoundArchive::clearCache() { +void LegacySoundArchive::clearCache() { // Delete all cached data for (uint i = 0; i < _sampleCount; ++i) { _samples[i].close(); @@ -137,7 +137,7 @@ void SoundArchive::clearCache() { * * Loads individual samples from an archive to memory on demand. */ -SoundSample *SoundArchive::getSample(int i, uint freq) { +SoundSample *LegacySoundArchive::getSample(int i, uint freq) { // Check whether requested file exists if (i < 0 || i >= (int) _sampleCount) { return NULL; diff --git a/engines/draci/sound.h b/engines/draci/sound.h index 28379b5429..e4cf7efdec 100644 --- a/engines/draci/sound.h +++ b/engines/draci/sound.h @@ -47,28 +47,61 @@ struct SoundSample { } }; +/** + * An abstract wrapper around archives of sound samples or dubbing. + */ class SoundArchive { public: - SoundArchive(const Common::String &path, uint defaultFreq) : + SoundArchive() { } + virtual ~SoundArchive() { } + + /** + * Returns the number of sound samples in the archive. Zero means that + * a fake empty archive has been opened and the caller may consider + * opening a different one, for example with compressed music. + */ + virtual uint size() const = 0; + + /** + * Checks whether there is an archive opened. Should be called before reading + * from the archive to check whether opening of the archive has succeeded. + */ + virtual bool isOpen() const = 0; + + /** + * Removes cached samples from memory. + */ + virtual void clearCache() = 0; + + /** + * Caches a given sample into memory and returns a pointer into it. We + * own the pointer. If freq is nonzero, then the sample is played at a + * different frequency (only used for uncompressed samples). + */ + virtual SoundSample *getSample(int i, uint freq) = 0; +}; + +/** + * Reads CD.SAM (with dubbing) and CD2.SAM (with sound samples) from the + * original game. + */ +class LegacySoundArchive : public SoundArchive { +public: + LegacySoundArchive(const Common::String &path, uint defaultFreq) : _path(), _samples(NULL), _sampleCount(0), _defaultFreq(defaultFreq), _opened(false), _f(NULL) { openArchive(path); } - ~SoundArchive() { closeArchive(); } + virtual ~LegacySoundArchive() { closeArchive(); } void closeArchive(); void openArchive(const Common::String &path); - uint size() const { return _sampleCount; } - - /** - * Checks whether there is an archive opened. Should be called before reading - * from the archive to check whether openArchive() succeeded. - */ - bool isOpen() const { return _opened; } - void clearCache(); + virtual uint size() const { return _sampleCount; } + virtual bool isOpen() const { return _opened; } - SoundSample *getSample(int i, uint freq); + virtual void clearCache(); + virtual SoundSample *getSample(int i, uint freq); private: Common::String _path; ///< Path to file -- cgit v1.2.3 From 7595e7c1bec5e56e9ddaabea4b6af43423e8e002 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 09:47:04 +0000 Subject: SCI: implementing workarounds for kernel calls, removing original code workaround for kDisposeScript / qfg1 room 64 and adding it to workaround table svn-id: r50520 --- engines/sci/engine/kernel.cpp | 11 ++- engines/sci/engine/kernel.h | 16 +++- engines/sci/engine/kscripts.cpp | 4 - engines/sci/engine/vm.cpp | 186 +++++++++++++++++++++++----------------- 4 files changed, 129 insertions(+), 88 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7a2e34a207..586c552770 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -206,6 +206,12 @@ static const char *s_defaultKernelNames[] = { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) +// gameID, scriptNr,lvl, object-name, method-name, call,index,replace +static const SciWorkaroundEntry kDisposeScript_workarounds[] = { + { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard + SCI_WORKAROUNDENTRY_TERMINATOR +}; + struct SciKernelMapEntry { const char *name; KernelFunc *function; @@ -216,7 +222,7 @@ struct SciKernelMapEntry { const char *signature; const char *subSignatures; // placeholder - const char *workarounds; // placeholder + const SciWorkaroundEntry *workarounds; }; #define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE @@ -243,7 +249,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL, NULL }, // ^^ FIXME - Work around SQ1 bug, when exiting the Ulence flats bar { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, - { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "Oii*", NULL, NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "ii*", NULL, kDisposeScript_workarounds }, // ^^ FIXME - Work around QfG1 bug { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -664,6 +670,7 @@ void Kernel::mapFunctions() { if (kernelMap->function) { _kernelFuncs[functNr].func = kernelMap->function; _kernelFuncs[functNr].signature = compileKernelSignature(kernelMap->signature); + _kernelFuncs[functNr].workarounds = kernelMap->workarounds; _kernelFuncs[functNr].isDummy = false; ++mapped; } else { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 6f7b0d569d..b7cd9058e5 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -115,11 +115,25 @@ enum { /* Generic description: */ typedef reg_t KernelFunc(EngineState *s, int argc, reg_t *argv); +struct SciWorkaroundEntry { + SciGameId gameId; + int scriptNr; + int16 inheritanceLevel; + const char *objectName; + const char *methodName; + int localCallOffset; + int index; + reg_t newValue; +}; + +#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, 0, NULL, NULL, -1, 0, { 0, 0 } } + struct KernelFuncWithSignature { KernelFunc *func; /**< The actual function */ - char *signature; /**< KernelFunc signature */ Common::String origName; /**< Original name, in case we couldn't map it */ bool isDummy; + char *signature; + const SciWorkaroundEntry *workarounds; }; enum AutoDetectedFeatures { diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 8f41fbad2e..4f4df7d875 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -228,10 +228,6 @@ reg_t kScriptID(EngineState *s, int argc, reg_t *argv) { reg_t kDisposeScript(EngineState *s, int argc, reg_t *argv) { int script = argv[0].offset; - // Work around QfG1 graveyard bug - if (argv[0].segment) - return s->r_acc; - SegmentId id = s->_segMan->getScriptSegment(script); Script *scr = s->_segMan->getScriptIfLoaded(id); if (scr) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a16e048713..46fc46da63 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -263,35 +263,100 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in return true; } -struct UninitializedReadWorkaround { - SciGameId gameId; +struct SciTrackOriginReply { int scriptNr; - int16 inheritanceLevel; - const char *objectName; - const char *methodName; + Common::String objectName; + Common::String methodName; int localCallOffset; - int index; - uint16 newValue; }; -// gameID, scriptNr,lvl, object-name, method-name, call,index,replace -static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu - { GID_LSL1, 720, 0, "rm720", "init", -1, 0, 0 }, // age check room - { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, 0xf }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon - { GID_KQ5, 0, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, 0 }, // inside witch forest, where the walking rock is - { GID_SQ1, 703, 0, "", "export 1", -1, 0, 0 }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, 0 }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, 1 }, // sq4cd: method returns this to the caller - { GID_SQ6, 0, 0, "Game", "init", -1, 2, 0 }, - { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, 0 }, - { (SciGameId)0, -1, 0, NULL, NULL, -1, 0, 0 } +static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, bool &workaroundFound, SciTrackOriginReply *trackOrigin) { + EngineState *state = g_sci->getEngineState(); + ExecStack *lastCall = state->xs; + Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); + int curScriptNr = local_script->getScriptNumber(); + + if (lastCall->debugLocalCallOffset != -1) { + // if lastcall was actually a local call search back for a real call + Common::List::iterator callIterator = state->_executionStack.end(); + while (callIterator != state->_executionStack.begin()) { + callIterator--; + ExecStack loopCall = *callIterator; + if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { + lastCall->debugSelector = loopCall.debugSelector; + lastCall->debugExportId = loopCall.debugExportId; + break; + } + } + } + + Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); + Common::String curMethodName; + const SciGameId gameId = g_sci->getGameId(); + + if (lastCall->type == EXEC_STACK_TYPE_CALL) { + if (lastCall->debugSelector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(lastCall->debugSelector); + } else if (lastCall->debugExportId != -1) { + curObjectName = ""; + curMethodName = curMethodName.printf("export %d", lastCall->debugExportId); + } + } + + if (workaroundList) { + // Search if there is a workaround for this one + const SciWorkaroundEntry *workaround; + int16 inheritanceLevel = 0; + Common::String searchObjectName = curObjectName; + reg_t searchObject = lastCall->sendp; + do { + workaround = workaroundList; + while (workaround->objectName) { + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->inheritanceLevel == inheritanceLevel) && (workaround->objectName == searchObjectName) + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { + // Workaround found + workaroundFound = true; + return workaround->newValue; + } + workaround++; + } + + // Go back to the parent + inheritanceLevel++; + searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); + if (!searchObject.isNull()) + searchObjectName = state->_segMan->getObjectName(searchObject); + } while (!searchObject.isNull()); // no parent left? + } + + // give caller origin data + trackOrigin->objectName = curObjectName; + trackOrigin->methodName = curMethodName; + trackOrigin->scriptNr = curScriptNr; + trackOrigin->localCallOffset = lastCall->debugLocalCallOffset; + + workaroundFound = false; + return make_reg(0xFFFF, 0xFFFF); +} + +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { + { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room + { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is + { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, + { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, + SCI_WORKAROUNDENTRY_TERMINATOR }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { @@ -299,61 +364,11 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually - EngineState *state = g_sci->getEngineState(); - ExecStack *lastCall = state->xs; - Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); - int curScriptNr = local_script->getScriptNumber(); - - if (lastCall->debugLocalCallOffset != -1) { - // if lastcall was actually a local call search back for a real call - Common::List::iterator callIterator = state->_executionStack.end(); - while (callIterator != state->_executionStack.begin()) { - callIterator--; - ExecStack loopCall = *callIterator; - if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { - lastCall->debugSelector = loopCall.debugSelector; - lastCall->debugExportId = loopCall.debugExportId; - break; - } - } - } - - Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); - Common::String curMethodName; - const SciGameId gameId = g_sci->getGameId(); - - if (lastCall->type == EXEC_STACK_TYPE_CALL) { - if (lastCall->debugSelector != -1) { - curMethodName = g_sci->getKernel()->getSelectorName(lastCall->debugSelector); - } else if (lastCall->debugExportId != -1) { - curObjectName = ""; - curMethodName = curMethodName.printf("export %d", lastCall->debugExportId); - } - } - - // Search if this is a known uninitialized read - const UninitializedReadWorkaround *workaround; - int16 inheritanceLevel = 0; - Common::String searchObjectName = curObjectName; - reg_t searchObject = lastCall->sendp; - do { - workaround = uninitializedReadWorkarounds; - while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->inheritanceLevel == inheritanceLevel) && (workaround->objectName == searchObjectName) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { - // Workaround found - r[index] = make_reg(0, workaround->newValue); - return r[index]; - } - workaround++; - } - // Go back to the parent - inheritanceLevel++; - searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); - if (!searchObject.isNull()) - searchObjectName = state->_segMan->getObjectName(searchObject); - } while (!searchObject.isNull()); // no parent left? - error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->debugLocalCallOffset); + bool workaroundFound; + SciTrackOriginReply originReply; + r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, workaroundFound, &originReply); + if (!workaroundFound) + error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } return r[index]; } else @@ -770,7 +785,16 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { if (kernelFunc.signature && !g_sci->getKernel()->signatureMatch(kernelFunc.signature, argc, s->xs->sp + 1)) { - error("[VM] Invalid arguments to kernel call k%s (funcNr %x)", g_sci->getKernel()->getKernelName(kernelFuncNr).c_str(), kernelFuncNr); + // signature mismatch, check if a workaround is available + bool workaroundFound; + SciTrackOriginReply originReply; + reg_t workaround; + workaround = trackOriginAndFindWorkaround(0, kernelFunc.workarounds, workaroundFound, &originReply); + if (!workaroundFound) + error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", g_sci->getKernel()->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + // FIXME: implement some real workaround type logic - ignore call, still do call etc. + if (!workaround.segment) + return; } reg_t *argv = s->xs->sp + 1; -- cgit v1.2.3 From 8752eed8f241ae2c405a2818b3e30ef735019662 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 09:51:21 +0000 Subject: SCI: Reverting r50516, SSCI didn't reset the node value when deleting the node. Also, a slight fix in VM debug code. svn-id: r50521 --- engines/sci/engine/klists.cpp | 7 +++---- engines/sci/engine/vm.cpp | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 25df4bb563..6842c9b1d8 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -346,12 +346,11 @@ reg_t kDeleteKey(EngineState *s, int argc, reg_t *argv) { if (!n->succ.isNull()) s->_segMan->lookupNode(n->succ)->pred = n->pred; - // Erase the node itself, as the game might reference it again. - // Happens in the intro of QFG1 and in Longbow, when exiting the - // cave. + // Erase references to the predecessor and successor nodes, as the game + // scripts could reference the node itself again. + // Happens in the intro of QFG1 and in Longbow, when exiting the cave. n->pred = NULL_REG; n->succ = NULL_REG; - n->value = NULL_REG; return make_reg(0, 1); // Signal success } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 46fc46da63..4e0c2710c1 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -815,7 +815,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { #if 0 // Used for debugging Common::String debugMsg = kernelFunc.origName + - Common::String::printf("[0x%x]", kernelFuncNum) + + Common::String::printf("[0x%x]", kernelFuncNr) + Common::String::printf(", %d params: ", argc) + " ("; -- cgit v1.2.3 From 915b9fa318435df1dc8a9865f5784cb8a9e8e12f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 10:09:07 +0000 Subject: SCI: removing full debug output when signature fails to the point where we didnt find a workaround for a signature mismatch svn-id: r50522 --- engines/sci/engine/kernel.cpp | 27 ++++++++++----------------- engines/sci/engine/vm.cpp | 23 +++++++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 586c552770..c7a7b4e843 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -795,46 +795,39 @@ void Kernel::signatureDebug(const char *sig, int argc, const reg_t *argv) { } bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { - const char *checkSig = sig; - const reg_t *checkParam = argv; - int checkCount = argc; // Always "match" if no signature is given if (!sig) return true; - while (*checkSig && checkCount) { - if ((*checkSig & KSIG_ANY) != KSIG_ANY) { - int type = findRegType(*checkParam); + while (*sig && argc) { + if ((*sig & KSIG_ANY) != KSIG_ANY) { + int type = findRegType(*argv); if (!type) { warning("[KERNEL] call signature: couldn't determine type of ref %04x:%04x", PRINT_REG(*argv)); - signatureDebug(sig, argc, argv); return false; } - if (!(type & *checkSig)) { + if (!(type & *sig)) { warning("[KERNEL] call signature: %d args left, is %d, should be %d", argc, type, *sig); - signatureDebug(sig, argc, argv); return false; } } - if (!(*checkSig & KSIG_ELLIPSIS)) - ++checkSig; - ++checkParam; - --checkCount; + if (!(*sig & KSIG_ELLIPSIS)) + ++sig; + ++argv; + --argc; } - if (checkCount) { + if (argc) { warning("[KERNEL] call signature: too many arguments"); - signatureDebug(sig, argc, argv); return false; // Too many arguments } - if (*checkSig == 0 || (*checkSig & KSIG_ELLIPSIS)) + if (*sig == 0 || (*sig & KSIG_ELLIPSIS)) return true; warning("[KERNEL] call signature: too few arguments"); - signatureDebug(sig, argc, argv); return false; } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4e0c2710c1..a7db23b5ec 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -777,21 +777,24 @@ static reg_t pointer_add(EngineState *s, reg_t base, int offset) { } static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { + Kernel *kernel = g_sci->getKernel(); - if (kernelFuncNr >= (int)g_sci->getKernel()->_kernelFuncs.size()) + if (kernelFuncNr >= (int)kernel->_kernelFuncs.size()) error("Invalid kernel function 0x%x requested", kernelFuncNr); - const KernelFuncWithSignature &kernelFunc = g_sci->getKernel()->_kernelFuncs[kernelFuncNr]; + const KernelFuncWithSignature &kernelCall = kernel->_kernelFuncs[kernelFuncNr]; - if (kernelFunc.signature - && !g_sci->getKernel()->signatureMatch(kernelFunc.signature, argc, s->xs->sp + 1)) { + if (kernelCall.signature + && !kernel->signatureMatch(kernelCall.signature, argc, s->xs->sp + 1)) { // signature mismatch, check if a workaround is available bool workaroundFound; SciTrackOriginReply originReply; reg_t workaround; - workaround = trackOriginAndFindWorkaround(0, kernelFunc.workarounds, workaroundFound, &originReply); - if (!workaroundFound) - error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", g_sci->getKernel()->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, workaroundFound, &originReply); + if (!workaroundFound) { + kernel->signatureDebug(kernelCall.signature, argc, s->xs->sp + 1); + error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernel->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + } // FIXME: implement some real workaround type logic - ignore call, still do call etc. if (!workaround.segment) return; @@ -799,7 +802,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { reg_t *argv = s->xs->sp + 1; - if (!kernelFunc.isDummy) { + if (!kernelCall.isDummy) { // Add stack frame to indicate we're executing a callk. // This is useful in debugger backtraces if this // kernel function calls a script itself. @@ -810,7 +813,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function - s->r_acc = kernelFunc.func(s, argc, argv); + s->r_acc = kernelCall.func(s, argc, argv); #if 0 // Used for debugging @@ -832,7 +835,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { if (s->_executionStack.begin() != s->_executionStack.end()) s->_executionStack.pop_back(); } else { - Common::String warningMsg = "Dummy function " + kernelFunc.origName + + Common::String warningMsg = "Dummy function " + kernelCall.origName + Common::String::printf("[0x%x]", kernelFuncNr) + " invoked - ignoring. Params: " + Common::String::printf("%d", argc) + " ("; -- cgit v1.2.3 From 0c283ed197d839cb81e5957424833700ada1c4ae Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 30 Jun 2010 10:13:20 +0000 Subject: Replaced Y offset from various drawing routines in favour of a viewport sub-surface - this will make it easier to clip sprites to within the drawable area svn-id: r50523 --- engines/m4/graphics.cpp | 3 ++- engines/m4/graphics.h | 14 ++++++++++++++ engines/m4/mads_anim.cpp | 2 +- engines/m4/mads_views.cpp | 38 ++++++++++++++++++++++++-------------- engines/m4/mads_views.h | 11 ++++++----- 5 files changed, 47 insertions(+), 21 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 43df6e1b5f..56c40a7402 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -74,7 +74,8 @@ M4Surface::~M4Surface() { _madsVm->_palette->deleteRange(_rgbList); delete _rgbList; } - free(); + if (_ownsData) + free(); } void M4Surface::loadCodesM4(Common::SeekableReadStream *source) { diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 96cd039e27..5e97d4f09b 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -97,6 +97,7 @@ private: byte _color; bool _isScreen; RGBList *_rgbList; + bool _ownsData; void rexLoadBackground(Common::SeekableReadStream *source, RGBList **palData = NULL); void madsLoadBackground(int roomNumber, RGBList **palData = NULL); @@ -106,12 +107,24 @@ public: create(g_system->getWidth(), isScreen ? g_system->getHeight() : MADS_SURFACE_HEIGHT, 1); _isScreen = isScreen; _rgbList = NULL; + _ownsData = true; } M4Surface(int width_, int height_) { create(width_, height_, 1); _isScreen = false; _rgbList = NULL; + _ownsData = true; } + M4Surface(int width_, int height_, byte *srcPixels, int pitch_) { + bytesPerPixel = 1; + w = width_; + h = height_; + pitch = pitch_; + pixels = srcPixels; + _rgbList = NULL; + _ownsData = false; + } + virtual ~M4Surface(); // loads a .COD file into the M4Surface @@ -143,6 +156,7 @@ public: inline Common::Rect bounds() const { return Common::Rect(0, 0, width(), height()); } inline int width() const { return w; } inline int height() const { return h; } + inline int getPitch() const { return pitch; } void setSize(int sizeX, int sizeY) { create(sizeX, sizeY, 1); } inline byte *getBasePtr() { return (byte *)pixels; diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index ebc684bec4..ca53bdca75 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -446,7 +446,7 @@ AnimviewView::AnimviewView(MadsM4Engine *vm): MadsView::_bgSurface = &_backgroundSurface; MadsView::_depthSurface = &_codeSurface; - MadsView::_yOffset = MADS_Y_OFFSET; + MadsView::setViewport(Common::Rect(0, MADS_Y_OFFSET, MADS_SURFACE_WIDTH, MADS_Y_OFFSET + MADS_SURFACE_HEIGHT)); _screenType = VIEWID_ANIMVIEW; _screenFlags.layer = LAYER_BACKGROUND; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 1766603dc8..c9aacbad4e 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -133,7 +133,7 @@ bool sortHelper(const DepthEntry &entry1, const DepthEntry &entry2) { typedef Common::List DepthList; -void MadsSpriteSlots::drawBackground(int yOffset) { +void MadsSpriteSlots::drawBackground() { // Draw all active sprites onto the background surface for (int i = 0; i < startIndex; ++i) { MadsSpriteSlot &slot = _entries[i]; @@ -173,7 +173,7 @@ void MadsSpriteSlots::drawBackground(int yOffset) { _owner._dirtyAreas[i].active = false; } -void MadsSpriteSlots::drawForeground(View *view, int yOffset) { +void MadsSpriteSlots::drawForeground(M4Surface *viewport) { DepthList depthList; // Get a list of sprite object depths for active objects @@ -199,7 +199,7 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); - view->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, + viewport->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, 0), slot.depth, _owner._depthSurface, slot.scale, spr->getTransparencyIndex()); } else { int xp, yp; @@ -215,11 +215,11 @@ void MadsSpriteSlots::drawForeground(View *view, int yOffset) { if (slot.depth > 1) { // Draw the frame with depth processing - view->copyFrom(spr, xp, yp, Common::Point(0, yOffset), slot.depth, _owner._depthSurface, 100, + viewport->copyFrom(spr, xp, yp, Common::Point(0, 0), slot.depth, _owner._depthSurface, 100, spr->getTransparencyIndex()); } else { // No depth, so simply draw the image - spr->copyTo(view, xp, yp + yOffset, spr->getTransparencyIndex()); + spr->copyTo(viewport, xp, yp, spr->getTransparencyIndex()); } } } @@ -332,12 +332,12 @@ void MadsTextDisplay::setDirtyAreas2() { } } -void MadsTextDisplay::draw(View *view, int yOffset) { +void MadsTextDisplay::draw(M4Surface *view) { for (uint idx = 0; idx < _entries.size(); ++idx) { if (_entries[idx].active && (_entries[idx].expire >= 0)) { _entries[idx].font->setColours(_entries[idx].colour1, _entries[idx].colour2, 0); _entries[idx].font->writeString(view, _entries[idx].msg, - _entries[idx].bounds.left, _entries[idx].bounds.top + yOffset, _entries[idx].bounds.width(), + _entries[idx].bounds.left, _entries[idx].bounds.top, _entries[idx].bounds.width(), _entries[idx].spacing); } } @@ -859,7 +859,7 @@ void MadsDirtyAreas::mergeAreas(int idx1, int idx2) { da1.textActive = true; } -void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust) { +void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, const Common::Point &posAdjust) { for (uint i = 0; i < _entries.size(); ++i) { const Common::Rect &srcBounds = _entries[i].bounds; @@ -867,7 +867,7 @@ void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset, const Co srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y); if (_entries[i].active && _entries[i].bounds.isValidRect()) - src->copyTo(dest, bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset); + src->copyTo(dest, bounds, _entries[i].bounds.left, _entries[i].bounds.top); } } @@ -1195,20 +1195,24 @@ MadsView::MadsView(View *view): _view(view), _dynamicHotspots(*this), _sequenceL _abortTimersMode = ABORTMODE_0; _abortTimersMode2 = ABORTMODE_0; - _yOffset = 0; _depthSurface = NULL; _bgSurface = NULL; + _viewport = NULL; _sceneAnimation = new MadsAnimation(_vm, this); } MadsView::~MadsView() { delete _sceneAnimation; + delete _viewport; } void MadsView::refresh() { + if (!_viewport) + setViewport(_view->bounds()); + // Draw any sprites _dirtyAreas.clear(); - _spriteSlots.drawBackground(_yOffset); + _spriteSlots.drawBackground(); // Process dirty areas _textDisplay.setDirtyAreas(); @@ -1217,7 +1221,7 @@ void MadsView::refresh() { _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); // Copy dirty areas to the main display surface - _dirtyAreas.copy(_view, _bgSurface, _yOffset, _posAdjust); + _dirtyAreas.copy(_viewport, _bgSurface, _posAdjust); // Handle dirty areas for foreground objects _spriteSlots.setDirtyAreas(); @@ -1225,10 +1229,10 @@ void MadsView::refresh() { _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); // Draw foreground sprites - _spriteSlots.drawForeground(_view, _yOffset); + _spriteSlots.drawForeground(_viewport); // Draw text elements onto the view - _textDisplay.draw(_view, _yOffset); + _textDisplay.draw(_viewport); // Remove any sprite slots that are no longer needed _spriteSlots.cleanUp(); @@ -1248,4 +1252,10 @@ void MadsView::clearLists() { _spriteSlots.clear(); } +void MadsView::setViewport(const Common::Rect &bounds) { + delete _viewport; + _viewport = new M4Surface(bounds.width(), bounds.height(), _view->getBasePtr(bounds.left, bounds.top), + _view->getPitch()); +} + } // End of namespace M4 diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 8bc507f20b..2fbe6a6dc7 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -97,8 +97,8 @@ public: void clear(); void deleteTimer(int seqIndex); - void drawBackground(int yOffset); - void drawForeground(View *view, int yOffset); + void drawBackground(); + void drawForeground(M4Surface *viewport); void setDirtyAreas(); void fullRefresh(); void cleanUp(); @@ -139,7 +139,7 @@ public: int add(int xp, int yp, uint fontColour, int charSpacing, const char *msg, Font *font); void clear(); - void draw(View *view, int yOffset); + void draw(M4Surface *view); void setDirtyAreas(); void setDirtyAreas2(); void cleanUp(); @@ -293,7 +293,7 @@ public: void merge(int startIndex, int count); bool intersects(int idx1, int idx2); void mergeAreas(int idx1, int idx2); - void copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust); + void copy(M4Surface *dest, M4Surface *src, const Common::Point &posAdjust); void clear(); }; @@ -403,7 +403,7 @@ public: M4Surface *_depthSurface; M4Surface *_bgSurface; - int _yOffset; + M4Surface *_viewport; public: MadsView(View *view); ~MadsView(); @@ -411,6 +411,7 @@ public: void refresh(); void update(); void clearLists(); + void setViewport(const Common::Rect &bounds); }; } -- cgit v1.2.3 From 8de571556012eae3cff13b3b86f8554b5ba070b4 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 30 Jun 2010 10:17:54 +0000 Subject: Removed deprecated destAdjust parameters from the frame drawing code svn-id: r50524 --- engines/m4/graphics.cpp | 8 ++++---- engines/m4/graphics.h | 4 ++-- engines/m4/mads_views.cpp | 11 +++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 56c40a7402..107bcbc6f9 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -401,8 +401,8 @@ void M4Surface::copyFrom(M4Surface *src, const Common::Rect &srcBounds, int dest * Copies a given image onto a destination surface with scaling, transferring only pixels that meet * the specified depth requirement on a secondary surface contain depth information */ -void M4Surface::copyFrom(M4Surface *src, int destX, int destY, Common::Point destAdjust, - int depth, M4Surface *depthsSurface, int scale, int transparentColour) { +void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, + M4Surface *depthsSurface, int scale, int transparentColour) { if (scale == 100) { // Copy the specified area @@ -428,7 +428,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, Common::Point des byte *srcPtr = data + (src->width() * copyRect.top + copyRect.left); byte *depthsData = depthsSurface->getBasePtr(); byte *depthsPtr = depthsData + (depthsSurface->pitch * destY) + destX; - byte *destPtr = (byte *)pixels + ((destY + destAdjust.y) * pitch) + destX + destAdjust.x; + byte *destPtr = (byte *)pixels + (destY * pitch) + destX; // 100% scaling variation for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) { @@ -521,7 +521,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, Common::Point des if (spriteHeight <= 0) return; - byte *destPixelsP = this->getBasePtr(destX + spriteLeft + destAdjust.x, destY + spriteTop + destAdjust.y); + byte *destPixelsP = this->getBasePtr(destX + spriteLeft, destY + spriteTop); const byte *depthPixelsP = depthsSurface->getBasePtr(destX + spriteLeft, destY + spriteTop); spriteLeft = (spriteLeft * (normalFrame ? 1 : -1)); diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 5e97d4f09b..c2eb11c575 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -173,7 +173,7 @@ public: void frameRect(const Common::Rect &r, uint8 color); void fillRect(const Common::Rect &r, uint8 color); void copyFrom(M4Surface *src, const Common::Rect &srcBounds, int destX, int destY, int transparentColour = -1); - void copyFrom(M4Surface *src, int destX, int destY, Common::Point destAdjust, int depth, M4Surface *depthSurface, + void copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthSurface, int scale, int transparentColour = -1); void update() { @@ -196,7 +196,7 @@ public: } inline void copyTo(M4Surface *dest, int destX, int destY, int depth, M4Surface *depthsSurface, int scale, int transparentColour = -1) { - dest->copyFrom(this, destX, destY, Common::Point(0, 0), depth, depthsSurface, scale, transparentColour); + dest->copyFrom(this, destX, destY, depth, depthsSurface, scale, transparentColour); } void scrollX(int xAmount); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index c9aacbad4e..21ea3a75cb 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -158,8 +158,8 @@ void MadsSpriteSlots::drawBackground() { if (slot.depth > 1) { // Draw the frame with depth processing - _owner._bgSurface->copyFrom(frame, xp, yp, Common::Point(), slot.depth, - _owner._depthSurface, 100, frame->getTransparencyIndex()); + _owner._bgSurface->copyFrom(frame, xp, yp, slot.depth, _owner._depthSurface, 100, + frame->getTransparencyIndex()); } else { // No depth, so simply draw the image frame->copyTo(_owner._bgSurface, xp, yp, frame->getTransparencyIndex()); @@ -199,8 +199,8 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { // Minimalised drawing assert(slot.spriteListIndex < (int)_sprites.size()); M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); - viewport->copyFrom(spr, slot.xp, slot.yp, Common::Point(0, 0), slot.depth, _owner._depthSurface, - slot.scale, spr->getTransparencyIndex()); + viewport->copyFrom(spr, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, + spr->getTransparencyIndex()); } else { int xp, yp; M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); @@ -215,8 +215,7 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { if (slot.depth > 1) { // Draw the frame with depth processing - viewport->copyFrom(spr, xp, yp, Common::Point(0, 0), slot.depth, _owner._depthSurface, 100, - spr->getTransparencyIndex()); + viewport->copyFrom(spr, xp, yp, slot.depth, _owner._depthSurface, 100, spr->getTransparencyIndex()); } else { // No depth, so simply draw the image spr->copyTo(viewport, xp, yp, spr->getTransparencyIndex()); -- cgit v1.2.3 From c6695b1d6aa778575f4cefc1942253cbb8a65fbf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 10:31:23 +0000 Subject: SCI: removing all the remaining debug output from signature matching svn-id: r50525 --- engines/sci/engine/kernel.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index c7a7b4e843..2eeefe83d9 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -771,7 +771,11 @@ void Kernel::signatureDebug(const char *sig, int argc, const reg_t *argv) { if (argc) { reg_t parameter = *argv; printf("%04x:%04x (", PRINT_REG(parameter)); - kernelSignatureDebugType(findRegType(parameter)); + int regType = findRegType(parameter); + if (regType) + kernelSignatureDebugType(regType); + else + printf("unknown type of %04x:%04x", PRINT_REG(parameter)); printf(")"); argv++; argc--; @@ -803,15 +807,11 @@ bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { if ((*sig & KSIG_ANY) != KSIG_ANY) { int type = findRegType(*argv); - if (!type) { - warning("[KERNEL] call signature: couldn't determine type of ref %04x:%04x", PRINT_REG(*argv)); - return false; - } + if (!type) + return false; // couldn't determine type - if (!(type & *sig)) { - warning("[KERNEL] call signature: %d args left, is %d, should be %d", argc, type, *sig); - return false; - } + if (!(type & *sig)) + return false; // type mismatch } if (!(*sig & KSIG_ELLIPSIS)) @@ -820,15 +820,12 @@ bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { --argc; } - if (argc) { - warning("[KERNEL] call signature: too many arguments"); + if (argc) return false; // Too many arguments - } if (*sig == 0 || (*sig & KSIG_ELLIPSIS)) return true; - warning("[KERNEL] call signature: too few arguments"); - return false; + return false; // Too few arguments } void Kernel::setDefaultKernelNames() { -- cgit v1.2.3 From dcba035912fb876f1db8da998405a659b9c87d04 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 30 Jun 2010 10:42:34 +0000 Subject: Corrected font display to properly use both colour indexes svn-id: r50526 --- engines/m4/animation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 51d3970e12..f9dd8287ae 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -444,7 +444,7 @@ void MadsAnimation::update() { _vm->_palette->setEntry(colIndex + 1, me.rgb2.r, me.rgb2.g, me.rgb2.b); // Add a kernel message to display the given text - me.kernelMsgIndex = _view->_kernelMessages.add(me.pos, colIndex * 0x101, 0, 0, INDEFINITE_TIMEOUT, me.msg); + me.kernelMsgIndex = _view->_kernelMessages.add(me.pos, colIndex * 0x101 + 0x100, 0, 0, INDEFINITE_TIMEOUT, me.msg); assert(me.kernelMsgIndex >= 0); // Play the associated sound, if it exists -- cgit v1.2.3 From cf5c60ed4f0628496ad97db3c274b7f0325e2440 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 11:05:29 +0000 Subject: SCI: changing signature of kUnLoad, adding workaround for sq1 ulence flats bug svn-id: r50527 --- engines/sci/engine/kernel.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2eeefe83d9..29b6a9bf9e 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -206,6 +206,12 @@ static const char *s_defaultKernelNames[] = { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) +// gameID, scriptNr,lvl, object-name, method-name, call,index,replace +static const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_SQ1, 998, 0, "View", "delete", -1, 0, { 1, 0 } }, // exiting ulence flats bar - slotGuyBody::dispose calls view::delete resulting in parameter 1 to be a reference + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call,index,replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard @@ -246,11 +252,9 @@ struct SciKernelMapEntry { // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i.*", NULL, NULL }, - // ^^ FIXME - Work around SQ1 bug, when exiting the Ulence flats bar + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "ii*", NULL, kUnLoad_workarounds }, { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "ii*", NULL, kDisposeScript_workarounds }, - // ^^ FIXME - Work around QfG1 bug { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, -- cgit v1.2.3 From cb897a1a15bb178f1fdb55378852fb6da707e444 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 11:08:23 +0000 Subject: Changed an error back to a warning - Torin's Passage calls kAddAfter with 4 parameters, and we don't know what the 4th parameter is yet svn-id: r50528 --- engines/sci/engine/klists.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 6842c9b1d8..4f8087539b 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -272,7 +272,8 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { } if (argc == 4) // Torin's Passage - error("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); + // TODO: Find out what the 4th parameter is + warning("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); if (firstnode) { // We're really appending after reg_t oldnext = firstnode->succ; -- cgit v1.2.3 From bf6acef9a9accb1753f87d34c3d5dddd56e36642 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 11:09:49 +0000 Subject: SCI: fixed a typo, so that workarounds really trigger an ignore kernel call for now svn-id: r50529 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a7db23b5ec..48f17d34de 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -796,7 +796,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernel->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. - if (!workaround.segment) + if (workaround.segment) return; } -- cgit v1.2.3 From a14c6d7815e27e76846a2a0feedcbf90785e07c9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 13:31:47 +0000 Subject: Fixed the signature for kUnload (thanks m_kiewitz) svn-id: r50530 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 29b6a9bf9e..ec3cdc5106 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -252,7 +252,7 @@ struct SciKernelMapEntry { // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "ii*", NULL, kUnLoad_workarounds }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "iRi*", NULL, kUnLoad_workarounds }, { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "ii*", NULL, kDisposeScript_workarounds }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, -- cgit v1.2.3 From bff3e89e48a6f819d5b23ba4cc848cbcf35aa965 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 13:49:05 +0000 Subject: SCI: Removed the FreeSCI music code svn-id: r50532 --- engines/sci/console.cpp | 78 -- engines/sci/engine/kernel.h | 12 - engines/sci/engine/kevent.cpp | 2 - engines/sci/engine/kgraphics.cpp | 4 - engines/sci/engine/savegame.cpp | 130 -- engines/sci/engine/state.cpp | 4 - engines/sci/engine/state.h | 8 - engines/sci/module.mk | 3 - engines/sci/sci.cpp | 35 - engines/sci/sci.h | 15 - engines/sci/sound/iterator/core.cpp | 969 -------------- engines/sci/sound/iterator/core.h | 209 --- engines/sci/sound/iterator/iterator.cpp | 1641 ------------------------ engines/sci/sound/iterator/iterator.h | 326 ----- engines/sci/sound/iterator/iterator_internal.h | 276 ---- engines/sci/sound/iterator/songlib.cpp | 189 --- engines/sci/sound/iterator/songlib.h | 171 --- engines/sci/sound/iterator/test-iterator.cpp | 423 ------ engines/sci/sound/music.h | 23 +- engines/sci/sound/soundcmd.cpp | 435 +------ engines/sci/sound/soundcmd.h | 17 - 21 files changed, 4 insertions(+), 4966 deletions(-) delete mode 100644 engines/sci/sound/iterator/core.cpp delete mode 100644 engines/sci/sound/iterator/core.h delete mode 100644 engines/sci/sound/iterator/iterator.cpp delete mode 100644 engines/sci/sound/iterator/iterator.h delete mode 100644 engines/sci/sound/iterator/iterator_internal.h delete mode 100644 engines/sci/sound/iterator/songlib.cpp delete mode 100644 engines/sci/sound/iterator/songlib.h delete mode 100644 engines/sci/sound/iterator/test-iterator.cpp diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f9d2ac5090..b5fc903108 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -36,13 +36,8 @@ #include "sci/engine/savegame.h" #include "sci/engine/gc.h" #include "sci/engine/features.h" -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/songlib.h" // for SongLibrary -#include "sci/sound/iterator/iterator.h" // for SCI_SONG_ITERATOR_TYPE_SCI0 -#else #include "sci/sound/midiparser_sci.h" #include "sci/sound/music.h" -#endif #include "sci/sound/drivers/mididriver.h" #include "sci/graphics/cursor.h" #include "sci/graphics/screen.h" @@ -215,19 +210,11 @@ Console::~Console() { } void Console::preEnter() { -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (_engine->_gamestate) - _engine->_gamestate->_sound.sfx_suspend(true); -#endif if (g_sci && g_sci->_soundCmd) g_sci->_soundCmd->pauseAll(true); } void Console::postEnter() { -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (_engine->_gamestate) - _engine->_gamestate->_sound.sfx_suspend(false); -#endif if (g_sci && g_sci->_soundCmd) g_sci->_soundCmd->pauseAll(false); @@ -846,7 +833,6 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { } bool Console::cmdShowInstruments(int argc, const char **argv) { -#ifndef USE_OLD_MUSIC_FUNCTIONS int songNumber = -1; if (argc == 2) @@ -1004,7 +990,6 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf("\n\n"); } -#endif return true; } @@ -1647,23 +1632,7 @@ bool Console::cmdShowMap(int argc, const char **argv) { bool Console::cmdSongLib(int argc, const char **argv) { DebugPrintf("Song library:\n"); - -#ifdef USE_OLD_MUSIC_FUNCTIONS - Song *seeker = _engine->_gamestate->_sound._songlib._lib; - - do { - DebugPrintf(" %p", (void *)seeker); - - if (seeker) { - DebugPrintf("[%04lx,p=%d,s=%d]->", seeker->_handle, seeker->_priority, seeker->_status); - seeker = seeker->_next; - } - DebugPrintf("\n"); - } while (seeker); - DebugPrintf("\n"); -#else g_sci->_soundCmd->printPlayList(this); -#endif return true; } @@ -1726,19 +1695,6 @@ bool Console::cmdToggleSound(int argc, const char **argv) { return true; } -#ifdef USE_OLD_MUSIC_FUNCTIONS - int handle = id.segment << 16 | id.offset; // frobnicate handle - - if (id.segment) { - SegManager *segMan = _engine->_gamestate->_segMan; // for writeSelectorValue - _engine->_gamestate->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - _engine->_gamestate->_sound.sfx_remove_song(handle); - writeSelectorValue(segMan, id, SELECTOR(signal), SIGNAL_OFFSET); - writeSelectorValue(segMan, id, SELECTOR(nodePtr), 0); - writeSelectorValue(segMan, id, SELECTOR(handle), 0); - } -#else - Common::String newState = argv[2]; newState.toLowercase(); @@ -1748,15 +1704,12 @@ bool Console::cmdToggleSound(int argc, const char **argv) { g_sci->_soundCmd->stopSound(id); else DebugPrintf("New state can either be 'play' or 'stop'"); -#endif return true; } bool Console::cmdStopAllSounds(int argc, const char **argv) { -#ifndef USE_OLD_MUSIC_FUNCTIONS g_sci->_soundCmd->stopAllSounds(); -#endif DebugPrintf("All sounds have been stopped\n"); return true; @@ -1770,36 +1723,6 @@ bool Console::cmdIsSample(int argc, const char **argv) { return true; } -#ifdef USE_OLD_MUSIC_FUNCTIONS - Resource *song = _engine->getResMan()->findResource(ResourceId(kResourceTypeSound, atoi(argv[1])), 0); - SongIterator *songit; - Audio::AudioStream *data; - - if (!song) { - DebugPrintf("Not a sound resource!\n"); - return true; - } - - songit = songit_new(song->data, song->size, SCI_SONG_ITERATOR_TYPE_SCI0, 0xcaffe /* What do I care about the ID? */); - - if (!songit) { - DebugPrintf("Could not convert to song iterator!\n"); - return true; - } - - data = songit->getAudioStream(); - if (data) { - // TODO -/* - DebugPrintf("\nIs sample (encoding %dHz/%s/%04x)", data->conf.rate, (data->conf.stereo) ? - ((data->conf.stereo == SFX_PCM_STEREO_LR) ? "stereo-LR" : "stereo-RL") : "mono", data->conf.format); -*/ - delete data; - } else - DebugPrintf("Valid song, but not a sample.\n"); - - delete songit; -#else int16 number = atoi(argv[1]); if (!_engine->getResMan()->testResource(ResourceId(kResourceTypeSound, number))) { @@ -1823,7 +1746,6 @@ bool Console::cmdIsSample(int argc, const char **argv) { DebugPrintf("Sample size: %d, sample rate: %d, channels: %d, digital channel number: %d\n", track->digitalSampleSize, track->digitalSampleRate, track->channelCount, track->digitalChannelNr); -#endif return true; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index b7cd9058e5..a3cf7b5f91 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -32,7 +32,6 @@ #include "common/str-array.h" #include "sci/engine/selector.h" -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS #include "sci/engine/vm_types.h" // for reg_t #include "sci/engine/vm.h" @@ -268,17 +267,6 @@ private: const Common::String _invalid; }; -#ifdef USE_OLD_MUSIC_FUNCTIONS -/******************** Misc functions ********************/ - -/** - * Get all sound events, apply their changes to the heap. - */ -void process_sound_events(EngineState *s); - -/******************** Constants ********************/ -#endif - /* Maximum length of a savegame name (including terminator character). */ #define SCI_MAX_SAVENAME_LENGTH 0x24 diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index bc8ddc34fc..4086d14a25 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -149,7 +149,6 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { con->onFrame(); } -#ifndef USE_OLD_MUSIC_FUNCTIONS if (g_sci->_features->detectDoSoundType() <= SCI_VERSION_0_LATE) { // If we're running a SCI0 game, update the sound cues, to compensate // for the fact that SCI0 does not poll to update the sound cues itself, @@ -158,7 +157,6 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { // this call g_sci->_soundCmd->updateSci0Cues(); } -#endif return s->r_acc; } diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index c9d3c92603..bacba674d7 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1080,10 +1080,6 @@ reg_t kAnimate(EngineState *s, int argc, reg_t *argv) { reg_t castListReference = (argc > 0) ? argv[0] : NULL_REG; bool cycle = (argc > 1) ? ((argv[1].toUint16()) ? true : false) : false; -#ifdef USE_OLD_MUSIC_FUNCTIONS - // Take care of incoming events (kAnimate is called semi-regularly) - process_sound_events(s); -#endif g_sci->_gfxAnimate->kernelAnimate(castListReference, cycle, argc, argv); return s->r_acc; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index b2528fe210..7a6496fe63 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -42,12 +42,7 @@ #include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS #include "sci/graphics/ports.h" #include "sci/sound/audio.h" -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/core.h" -#include "sci/sound/iterator/iterator.h" -#else #include "sci/sound/music.h" -#endif #include "gui/message.h" @@ -61,40 +56,11 @@ namespace Sci { const uint32 INTMAPPER_MAGIC_KEY = 0xDEADBEEF; -#ifdef USE_OLD_MUSIC_FUNCTIONS -// from ksound.cpp: -SongIterator *build_iterator(ResourceManager *resMan, int song_nr, SongIteratorType type, songit_id_t id); -#endif - - #pragma mark - // TODO: Many of the following sync_*() methods should be turned into member funcs // of the classes they are syncing. -#ifdef USE_OLD_MUSIC_FUNCTIONS -static void sync_songlib(Common::Serializer &s, SongLibrary &obj); - -static void syncSong(Common::Serializer &s, Song &obj) { - s.syncAsSint32LE(obj._handle); - s.syncAsSint32LE(obj._resourceNum); - s.syncAsSint32LE(obj._priority); - s.syncAsSint32LE(obj._status); - s.syncAsSint32LE(obj._restoreBehavior); - s.syncAsSint32LE(obj._restoreTime); - s.syncAsSint32LE(obj._loops); - s.syncAsSint32LE(obj._hold); - - if (s.isLoading()) { - obj._it = 0; - obj._delay = 0; - obj._next = 0; - obj._nextPlaying = 0; - obj._nextStopping = 0; - } -} -#else - #define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle & 0xffff)) void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { @@ -148,7 +114,6 @@ void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { pStreamAud = 0; } } -#endif // Experimental hack: Use syncWithSerializer to sync. By default, this assume // the object to be synced is a subclass of Serializable and thus tries to invoke @@ -380,11 +345,7 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { syncArray(s, _segMan->_classTable); -#ifdef USE_OLD_MUSIC_FUNCTIONS - sync_songlib(s, _sound._songlib); -#else g_sci->_soundCmd->syncPlayList(s); -#endif } void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { @@ -620,30 +581,6 @@ void DataStack::saveLoadWithSerializer(Common::Serializer &s) { #pragma mark - -#ifdef USE_OLD_MUSIC_FUNCTIONS -static void sync_songlib(Common::Serializer &s, SongLibrary &obj) { - int songcount = 0; - if (s.isSaving()) - songcount = obj.countSongs(); - s.syncAsUint32LE(songcount); - - if (s.isLoading()) { - obj._lib = 0; - while (songcount--) { - Song *newsong = new Song; - syncSong(s, *newsong); - obj.addSong(newsong); - } - } else { - Song *seeker = obj._lib; - while (seeker) { - seeker->_restoreTime = seeker->_it->getTimepos(); - syncSong(s, *seeker); - seeker = seeker->_next; - } - } -} -#else void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { // Sync song lib data. When loading, the actual song lib will be initialized // afterwards in gamestate_restore() @@ -692,16 +629,12 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { } } } -#endif void SoundCommandParser::syncPlayList(Common::Serializer &s) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->saveLoadWithSerializer(s); -#endif } void SoundCommandParser::reconstructPlayList(int savegame_version) { -#ifndef USE_OLD_MUSIC_FUNCTIONS Common::StackLock lock(_music->_mutex); const MusicList::iterator end = _music->getPlayListEnd(); @@ -724,8 +657,6 @@ void SoundCommandParser::reconstructPlayList(int savegame_version) { cmdPlaySound((*i)->soundObj, 0); } } - -#endif } #ifdef ENABLE_SCI32 @@ -819,42 +750,6 @@ void SegManager::reconstructClones() { } // end for } -#ifdef USE_OLD_MUSIC_FUNCTIONS -static void reconstruct_sounds(EngineState *s) { - Song *seeker; - SongIteratorType it_type; - - if (getSciVersion() > SCI_VERSION_01) - it_type = SCI_SONG_ITERATOR_TYPE_SCI1; - else - it_type = SCI_SONG_ITERATOR_TYPE_SCI0; - - seeker = s->_sound._songlib._lib; - - while (seeker) { - SongIterator *base, *ff = 0; - int oldstatus; - SongIterator::Message msg; - - base = ff = build_iterator(g_sci->getResMan(), seeker->_resourceNum, it_type, seeker->_handle); - if (seeker->_restoreBehavior == RESTORE_BEHAVIOR_CONTINUE) - ff = new_fast_forward_iterator(base, seeker->_restoreTime); - ff->init(); - - msg = SongIterator::Message(seeker->_handle, SIMSG_SET_LOOPS(seeker->_loops)); - songit_handle_message(&ff, msg); - msg = SongIterator::Message(seeker->_handle, SIMSG_SET_HOLD(seeker->_hold)); - songit_handle_message(&ff, msg); - - oldstatus = seeker->_status; - seeker->_status = SOUND_STATUS_STOPPED; - seeker->_it = ff; - s->_sound.sfx_song_set_status(seeker->_handle, oldstatus); - seeker = seeker->_next; - } -} -#endif - #pragma mark - @@ -888,10 +783,6 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam } void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongLibrary temp; -#endif - SavegameMetadata meta; Common::Serializer ser(fh, 0); @@ -943,21 +834,8 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->reset(true); s->saveLoadWithSerializer(ser); // FIXME: Error handling? -#ifdef USE_OLD_MUSIC_FUNCTIONS - s->_sound.sfx_exit(); -#endif - // Now copy all current state information -#ifdef USE_OLD_MUSIC_FUNCTIONS - temp = s->_sound._songlib; - s->_sound.sfx_init(g_sci->getResMan(), s->sfx_init_flags, g_sci->_features->detectDoSoundType()); - s->sfx_init_flags = s->sfx_init_flags; - s->_sound._songlib.freeSounds(); - s->_sound._songlib = temp; - s->_soundCmd->updateSfxState(&s->_sound); -#endif - s->_segMan->reconstructStack(s); s->_segMan->reconstructScripts(s); s->_segMan->reconstructClones(); @@ -969,15 +847,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->gameStartTime = g_system->getMillis(); s->_screenUpdateTime = g_system->getMillis(); -#ifdef USE_OLD_MUSIC_FUNCTIONS - s->_sound._it = NULL; - s->_sound._flags = s->_sound._flags; - s->_sound._song = NULL; - s->_sound._suspended = s->_sound._suspended; - reconstruct_sounds(s); -#else g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); -#endif // Message state: s->_msgState = new MessageState(s->_segMan); diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index f13a44e704..6f54a3c199 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -81,10 +81,6 @@ EngineState::~EngineState() { } void EngineState::reset(bool isRestoring) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - sfx_init_flags = 0; -#endif - if (!isRestoring) { _memorySegmentSize = 0; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 07843a68e3..885c8a871c 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -41,9 +41,6 @@ namespace Common { #include "sci/parser/vocabulary.h" -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/core.h" -#endif #include "sci/sound/soundcmd.h" namespace Sci { @@ -105,11 +102,6 @@ public: /* Non-VM information */ -#ifdef USE_OLD_MUSIC_FUNCTIONS - SfxState _sound; /**< sound subsystem */ - int sfx_init_flags; /**< flags the sfx subsystem was initialised with */ -#endif - uint32 gameStartTime; /**< The time at which the interpreter was started */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */ uint32 _screenUpdateTime; /**< The last time the game updated the screen */ diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 792522f153..85988b8f1b 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -67,9 +67,6 @@ MODULE_OBJS := \ sound/drivers/fb01.o \ sound/drivers/midi.o \ sound/drivers/pcjr.o \ - sound/iterator/core.o \ - sound/iterator/iterator.o \ - sound/iterator/songlib.o \ video/seq_decoder.o diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index e90ca9de5d..e9e16c8262 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -222,10 +222,6 @@ Common::Error SciEngine::run() { _kernel->loadKernelNames(_features); _soundCmd = new SoundCommandParser(_resMan, segMan, _kernel, _audio, _features->detectDoSoundType()); -#ifdef USE_OLD_MUSIC_FUNCTIONS - initGameSound(0, _features->detectDoSoundType()); -#endif - syncSoundSettings(); // Initialize all graphics related subsystems @@ -313,11 +309,6 @@ bool SciEngine::initGame() { srand(g_system->getMillis()); // Initialize random number generator -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (_gamestate->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) - initGameSound(0, _features->detectDoSoundType()); -#endif - // Load game language into printLang property of game object setSciLanguage(); @@ -399,18 +390,6 @@ void SciEngine::initGraphics() { _gfxPalette->setDefault(); } -#ifdef USE_OLD_MUSIC_FUNCTIONS - -void SciEngine::initGameSound(int sound_flags, SciVersion soundVersion) { - if (getSciVersion() > SCI_VERSION_0_LATE) - sound_flags |= SFX_STATE_FLAG_MULTIPLAY; - - _gamestate->sfx_init_flags = sound_flags; - _gamestate->_sound.sfx_init(_resMan, sound_flags, soundVersion); -} - -#endif - void SciEngine::initStackBaseWithSelector(Selector selector) { _gamestate->stack_base[0] = make_reg(0, (uint16)selector); _gamestate->stack_base[1] = NULL_REG; @@ -438,9 +417,6 @@ void SciEngine::runGame() { if (_gamestate->abortScriptProcessing == kAbortRestartGame) { _gamestate->_segMan->resetSegMan(); initGame(); -#ifdef USE_OLD_MUSIC_FUNCTIONS - _gamestate->_sound.sfx_reset_player(); -#endif initStackBaseWithSelector(SELECTOR(play)); _gamestate->gameWasRestarted = true; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { @@ -455,14 +431,8 @@ void SciEngine::runGame() { void SciEngine::exitGame() { if (_gamestate->abortScriptProcessing != kAbortLoadGame) { _gamestate->_executionStack.clear(); -#ifdef USE_OLD_MUSIC_FUNCTIONS - _gamestate->_sound.sfx_exit(); - // Reinit because some other code depends on having a valid state - initGameSound(SFX_STATE_FLAG_NOSOUND, _features->detectDoSoundType()); -#else _audio->stopAllAudio(); g_sci->_soundCmd->clearPlayList(); -#endif } // TODO Free parser segment here @@ -544,16 +514,12 @@ Common::String SciEngine::unwrapFilename(const Common::String &name) const { } void SciEngine::pauseEngineIntern(bool pause) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - _gamestate->_sound.sfx_suspend(pause); -#endif _mixer->pauseAll(pause); } void SciEngine::syncSoundSettings() { Engine::syncSoundSettings(); -#ifndef USE_OLD_MUSIC_FUNCTIONS bool mute = false; if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); @@ -564,7 +530,6 @@ void SciEngine::syncSoundSettings() { int vol = (soundVolumeMusic + 1) * SoundCommandParser::kMaxSciVolume / Audio::Mixer::kMaxMixerVolume; g_sci->_soundCmd->setMasterVolume(vol); } -#endif } } // End of namespace Sci diff --git a/engines/sci/sci.h b/engines/sci/sci.h index d7ca1345bf..c09342f749 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -42,9 +42,6 @@ struct ADGameDescription; */ namespace Sci { -// Uncomment this to use old music functions -//#define USE_OLD_MUSIC_FUNCTIONS - struct EngineState; class Vocabulary; class ResourceManager; @@ -321,18 +318,6 @@ private: */ void exitGame(); -#ifdef USE_OLD_MUSIC_FUNCTIONS - /** - * Initializes the sound part of a SCI game - * This function may only be called if game_init() did not initialize - * the sound data. - * @param[in] s The state to initialize the sound in - * @param[in] sound_flags Flags to pass to the sound subsystem - * @param[in] soundVersion sound-version that got detected during game init - */ - void initGameSound(int sound_flags, SciVersion soundVersion); -#endif - void initStackBaseWithSelector(Selector selector); const ADGameDescription *_gameDescription; diff --git a/engines/sci/sound/iterator/core.cpp b/engines/sci/sound/iterator/core.cpp deleted file mode 100644 index 9ecd00f54c..0000000000 --- a/engines/sci/sound/iterator/core.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Sound subsystem core: Event handler, sound player dispatching */ - -#include "sci/sci.h" -#ifdef USE_OLD_MUSIC_FUNCTIONS - -#include "sci/sound/iterator/core.h" -#include "sci/sound/iterator/iterator.h" -#include "sci/sound/drivers/mididriver.h" - -#include "common/system.h" -#include "common/timer.h" - -#include "sound/mixer.h" - -namespace Sci { - -/* Plays a song iterator that found a PCM through a PCM device, if possible -** Parameters: (SongIterator *) it: The iterator to play -** (SongHandle) handle: Debug handle -** Returns : (int) 0 if the effect will not be played, nonzero if it will -** This assumes that the last call to 'it->next()' returned SI_PCM. -*/ -static int sfx_play_iterator_pcm(SongIterator *it, SongHandle handle); - - -#pragma mark - - - -class SfxPlayer { -public: - /** Number of voices that can play simultaneously */ - int _polyphony; - -protected: - SciVersion _soundVersion; - MidiPlayer *_mididrv; - - SongIterator *_iterator; - Audio::Timestamp _wakeupTime; - Audio::Timestamp _currentTime; - uint32 _pauseTimeDiff; - - bool _paused; - bool _iteratorIsDone; - uint32 _tempo; - - Common::Mutex _mutex; - int _volume; - - void play_song(SongIterator *it); - static void player_timer_callback(void *refCon); - -public: - SfxPlayer(SciVersion soundVersion); - ~SfxPlayer(); - - /** - * Initializes the player. - * @param resMan a resource manager for driver initialization - * @param expected_latency expected delay in between calls to 'maintenance' (in microseconds) - * @return Common::kNoError on success, Common::kUnknownError on failure - */ - Common::Error init(ResourceManager *resMan, int expected_latency); - - /** - * Adds an iterator to the song player - * @param it The iterator to play - * @param start_time The time to assume as the time the first MIDI command executes at - * @return Common::kNoError on success, Common::kUnknownError on failure - * - * The iterator should not be cloned (to avoid memory leaks) and - * may be modified according to the needs of the player. - * Implementors may use the 'sfx_iterator_combine()' function - * to add iterators onto their already existing iterators. - */ - Common::Error add_iterator(SongIterator *it, uint32 start_time); - - /** - * Stops the currently playing song and deletes the associated iterator. - * @return Common::kNoError on success, Common::kUnknownError on failure - */ - Common::Error stop(); - - /** - * Transmits a song iterator message to the active song. - * @param msg the message to transmit - * @return Common::kNoError on success, Common::kUnknownError on failure - */ - Common::Error iterator_message(const SongIterator::Message &msg); - - /** - * Pauses song playing. - * @return Common::kNoError on success, Common::kUnknownError on failure - */ - Common::Error pause(); - - /** - * Resumes song playing after a pause. - * @return Common::kNoError on success, Common::kUnknownError on failure - */ - Common::Error resume(); - - /** - * Pass a raw MIDI event to the synth. - * @param argc length of buffer holding the midi event - * @param argv the buffer itself - */ - void tell_synth(int buf_nr, byte *buf); - - void setVolume(int vol); - - int getVolume(); -}; - -SfxPlayer::SfxPlayer(SciVersion soundVersion) - : _soundVersion(soundVersion), _wakeupTime(0, SFX_TICKS_PER_SEC), _currentTime(0, 1) { - _polyphony = 0; - - _mididrv = 0; - - _iterator = NULL; - _pauseTimeDiff = 0; - - _paused = false; - _iteratorIsDone = false; - _tempo = 0; - - _volume = 15; -} - -SfxPlayer::~SfxPlayer() { - if (_mididrv) { - _mididrv->close(); - delete _mididrv; - } - delete _iterator; - _iterator = NULL; -} - -void SfxPlayer::play_song(SongIterator *it) { - while (_iterator && _wakeupTime.msecsDiff(_currentTime) <= 0) { - int delay; - byte buf[8]; - int result; - - switch ((delay = songit_next(&(_iterator), - buf, &result, - IT_READER_MASK_ALL - | IT_READER_MAY_FREE - | IT_READER_MAY_CLEAN))) { - - case SI_FINISHED: - delete _iterator; - _iterator = NULL; - _iteratorIsDone = true; - return; - - case SI_IGNORE: - case SI_LOOP: - case SI_RELATIVE_CUE: - case SI_ABSOLUTE_CUE: - break; - - case SI_PCM: - sfx_play_iterator_pcm(_iterator, 0); - break; - - case 0: - static_cast(_mididrv)->send(buf[0], buf[1], buf[2]); - - break; - - default: - _wakeupTime = _wakeupTime.addFrames(delay); - } - } -} - -void SfxPlayer::tell_synth(int buf_nr, byte *buf) { - byte op1 = (buf_nr < 2 ? 0 : buf[1]); - byte op2 = (buf_nr < 3 ? 0 : buf[2]); - - static_cast(_mididrv)->send(buf[0], op1, op2); -} - -void SfxPlayer::player_timer_callback(void *refCon) { - SfxPlayer *thePlayer = (SfxPlayer *)refCon; - assert(refCon); - Common::StackLock lock(thePlayer->_mutex); - - if (thePlayer->_iterator && !thePlayer->_iteratorIsDone && !thePlayer->_paused) { - thePlayer->play_song(thePlayer->_iterator); - } - - thePlayer->_currentTime = thePlayer->_currentTime.addFrames(1); -} - -/* API implementation */ - -Common::Error SfxPlayer::init(ResourceManager *resMan, int expected_latency) { - MidiDriverType musicDriver = MidiDriver::detectDevice(MDT_PCSPK | MDT_ADLIB); - - switch (musicDriver) { - case MD_ADLIB: - // FIXME: There's no Amiga sound option, so we hook it up to AdLib - if (g_sci->getPlatform() == Common::kPlatformAmiga) - _mididrv = MidiPlayer_Amiga_create(_soundVersion); - else - _mididrv = MidiPlayer_AdLib_create(_soundVersion); - break; - case MD_PCJR: - _mididrv = MidiPlayer_PCJr_create(_soundVersion); - break; - case MD_PCSPK: - _mididrv = MidiPlayer_PCSpeaker_create(_soundVersion); - break; - default: - break; - } - - assert(_mididrv); - - _polyphony = _mididrv->getPolyphony(); - - _tempo = _mididrv->getBaseTempo(); - uint32 time = g_system->getMillis(); - _currentTime = Audio::Timestamp(time, 1000000 / _tempo); - _wakeupTime = Audio::Timestamp(time, SFX_TICKS_PER_SEC); - - _mididrv->setTimerCallback(this, player_timer_callback); - _mididrv->open(resMan); - _mididrv->setVolume(_volume); - - return Common::kNoError; -} - -Common::Error SfxPlayer::add_iterator(SongIterator *it, uint32 start_time) { - Common::StackLock lock(_mutex); - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(_mididrv->getPlayId())); - SIMSG_SEND(it, SIMSG_SET_RHYTHM(_mididrv->hasRhythmChannel())); - - if (_iterator == NULL) { - // Resync with clock - _currentTime = Audio::Timestamp(g_system->getMillis(), 1000000 / _tempo); - _wakeupTime = Audio::Timestamp(start_time, SFX_TICKS_PER_SEC); - } - - _iterator = sfx_iterator_combine(_iterator, it); - _iteratorIsDone = false; - - return Common::kNoError; -} - -Common::Error SfxPlayer::stop() { - debug(3, "Player: Stopping song iterator %p", (void *)_iterator); - Common::StackLock lock(_mutex); - delete _iterator; - _iterator = NULL; - for (int i = 0; i < MIDI_CHANNELS; i++) - static_cast(_mididrv)->send(0xb0 + i, SCI_MIDI_CHANNEL_NOTES_OFF, 0); - - return Common::kNoError; -} - -Common::Error SfxPlayer::iterator_message(const SongIterator::Message &msg) { - Common::StackLock lock(_mutex); - if (!_iterator) { - return Common::kUnknownError; - } - - songit_handle_message(&_iterator, msg); - - return Common::kNoError; -} - -Common::Error SfxPlayer::pause() { - Common::StackLock lock(_mutex); - - _paused = true; - _pauseTimeDiff = _wakeupTime.msecsDiff(_currentTime); - - _mididrv->playSwitch(false); - - return Common::kNoError; -} - -Common::Error SfxPlayer::resume() { - Common::StackLock lock(_mutex); - - _wakeupTime = Audio::Timestamp(_currentTime.msecs() + _pauseTimeDiff, SFX_TICKS_PER_SEC); - _mididrv->playSwitch(true); - _paused = false; - - return Common::kNoError; -} - -void SfxPlayer::setVolume(int vol) { - _mididrv->setVolume(vol); -} - -int SfxPlayer::getVolume() { - return _mididrv->getVolume(); -} - -#pragma mark - - -void SfxState::sfx_reset_player() { - if (_player) - _player->stop(); -} - -void SfxState::sfx_player_tell_synth(int buf_nr, byte *buf) { - if (_player) - _player->tell_synth(buf_nr, buf); -} - -int SfxState::sfx_get_player_polyphony() { - if (_player) - return _player->_polyphony; - else - return 0; -} - -SfxState::SfxState() { - _player = NULL; - _it = NULL; - _flags = 0; - _song = NULL; - _suspended = 0; -} - -SfxState::~SfxState() { -} - - -void SfxState::freezeTime() { - /* Freezes the top song delay time */ - const Audio::Timestamp ctime = Audio::Timestamp(g_system->getMillis(), SFX_TICKS_PER_SEC); - Song *song = _song; - - while (song) { - song->_delay = song->_wakeupTime.frameDiff(ctime); - if (song->_delay < 0) - song->_delay = 0; - - song = song->_nextPlaying; - } -} - -void SfxState::thawTime() { - /* inverse of freezeTime() */ - const Audio::Timestamp ctime = Audio::Timestamp(g_system->getMillis(), SFX_TICKS_PER_SEC); - Song *song = _song; - - while (song) { - song->_wakeupTime = ctime.addFrames(song->_delay); - - song = song->_nextPlaying; - } -} - -bool SfxState::isPlaying(Song *song) { - Song *playing_song = _song; - - /* _dump_playing_list(this, "is-playing");*/ - - while (playing_song) { - if (playing_song == song) - return true; - playing_song = playing_song->_nextPlaying; - } - return false; -} - -void SfxState::setSongStatus(Song *song, int status) { - const Audio::Timestamp ctime = Audio::Timestamp(g_system->getMillis(), SFX_TICKS_PER_SEC); - - switch (status) { - - case SOUND_STATUS_STOPPED: - // Reset - song->_it->init(); - break; - - case SOUND_STATUS_SUSPENDED: - case SOUND_STATUS_WAITING: - if (song->_status == SOUND_STATUS_PLAYING) { - // Update delay, set wakeup_time - song->_delay += song->_wakeupTime.frameDiff(ctime); - song->_wakeupTime = ctime; - } - if (status == SOUND_STATUS_SUSPENDED) - break; - - /* otherwise... */ - - case SOUND_STATUS_PLAYING: - if (song->_status == SOUND_STATUS_STOPPED) { - // Starting anew - song->_wakeupTime = ctime; - } - - if (isPlaying(song)) - status = SOUND_STATUS_PLAYING; - else - status = SOUND_STATUS_WAITING; - break; - - default: - fprintf(stderr, "%s L%d: Attempt to set invalid song" - " state %d!\n", __FILE__, __LINE__, status); - return; - - } - song->_status = status; -} - -/* Update internal state iff only one song may be played */ -void SfxState::updateSingleSong() { - Song *newsong = _songlib.findFirstActive(); - - if (newsong != _song) { - freezeTime(); /* Store song delay time */ - - if (_player) - _player->stop(); - - if (newsong) { - if (!newsong->_it) - return; /* Restore in progress and not ready for this yet */ - - /* Change song */ - if (newsong->_status == SOUND_STATUS_WAITING) - setSongStatus(newsong, SOUND_STATUS_PLAYING); - - /* Change instrument mappings */ - } else { - /* Turn off sound */ - } - if (_song) { - if (_song->_status == SOUND_STATUS_PLAYING) - setSongStatus(newsong, SOUND_STATUS_WAITING); - } - - Common::String debugMessage = "[SFX] Changing active song:"; - if (!_song) { - debugMessage += " New song:"; - } else { - char tmp[50]; - sprintf(tmp, " pausing %08lx, now playing ", _song->_handle); - debugMessage += tmp; - } - - if (newsong) { - char tmp[20]; - sprintf(tmp, "%08lx\n", newsong->_handle); - debugMessage += tmp; - } else { - debugMessage += " none\n"; - } - - debugC(2, kDebugLevelSound, "%s", debugMessage.c_str()); - - _song = newsong; - thawTime(); /* Recover song delay time */ - - if (newsong && _player) { - SongIterator *clonesong = newsong->_it->clone(newsong->_delay); - - _player->add_iterator(clonesong, newsong->_wakeupTime.msecs()); - } - } -} - - -void SfxState::updateMultiSong() { - Song *oldfirst = _song; - Song *oldseeker; - Song *newsong = _songlib.findFirstActive(); - Song *newseeker; - Song not_playing_anymore; /* Dummy object, referenced by - ** songs which are no longer - ** active. */ - - /* _dump_playing_list(this, "before");*/ - freezeTime(); /* Store song delay time */ - - // WORKAROUND: sometimes, newsong can be NULL (e.g. in SQ4). - // Handle this here, so that we avoid a crash - if (!newsong) { - // Iterators should get freed when there's only one song left playing - if(oldfirst && oldfirst->_status == SOUND_STATUS_STOPPED) { - debugC(2, kDebugLevelSound, "[SFX] Stopping song %lx", oldfirst->_handle); - if (_player && oldfirst->_it) - _player->iterator_message(SongIterator::Message(oldfirst->_it->ID, SIMSG_STOP)); - } - return; - } - - for (newseeker = newsong; newseeker; - newseeker = newseeker->_nextPlaying) { - if (!newseeker || !newseeker->_it) - return; /* Restore in progress and not ready for this yet */ - } - - /* First, put all old songs into the 'stopping' list and - ** mark their 'next-playing' as not_playing_anymore. */ - for (oldseeker = oldfirst; oldseeker; - oldseeker = oldseeker->_nextStopping) { - oldseeker->_nextStopping = oldseeker->_nextPlaying; - oldseeker->_nextPlaying = ¬_playing_anymore; - - if (oldseeker == oldseeker->_nextPlaying) { - error("updateMultiSong() failed. Breakpoint in %s, line %d", __FILE__, __LINE__); - } - } - - /* Second, re-generate the new song queue. */ - for (newseeker = newsong; newseeker; newseeker = newseeker->_nextPlaying) { - newseeker->_nextPlaying = _songlib.findNextActive(newseeker); - - if (newseeker == newseeker->_nextPlaying) { - error("updateMultiSong() failed. Breakpoint in %s, line %d", __FILE__, __LINE__); - } - } - /* We now need to update the currently playing song list, because we're - ** going to use some functions that require this list to be in a sane - ** state (particularly isPlaying(), indirectly */ - _song = newsong; - - /* Third, stop all old songs */ - for (oldseeker = oldfirst; oldseeker; - oldseeker = oldseeker->_nextStopping) - if (oldseeker->_nextPlaying == ¬_playing_anymore) { - setSongStatus(oldseeker, SOUND_STATUS_SUSPENDED); - debugC(2, kDebugLevelSound, "[SFX] Stopping song %lx", oldseeker->_handle); - - if (_player && oldseeker->_it) - _player->iterator_message(SongIterator::Message(oldseeker->_it->ID, SIMSG_STOP)); - oldseeker->_nextPlaying = NULL; /* Clear this pointer; we don't need the tag anymore */ - } - - for (newseeker = newsong; newseeker; newseeker = newseeker->_nextPlaying) { - if (newseeker->_status != SOUND_STATUS_PLAYING && _player) { - debugC(2, kDebugLevelSound, "[SFX] Adding song %lx", newseeker->_it->ID); - - SongIterator *clonesong = newseeker->_it->clone(newseeker->_delay); - _player->add_iterator(clonesong, g_system->getMillis()); - } - setSongStatus(newseeker, SOUND_STATUS_PLAYING); - } - - _song = newsong; - thawTime(); - /* _dump_playing_list(this, "after");*/ -} - -/* Update internal state */ -void SfxState::update() { - if (_flags & SFX_STATE_FLAG_MULTIPLAY) - updateMultiSong(); - else - updateSingleSong(); -} - -static int sfx_play_iterator_pcm(SongIterator *it, SongHandle handle) { -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Playing PCM: %08lx\n", handle); -#endif - if (g_system->getMixer()->isReady()) { - Audio::AudioStream *newfeed = it->getAudioStream(); - if (newfeed) { - g_system->getMixer()->playStream(Audio::Mixer::kSFXSoundType, 0, newfeed); - return 1; - } - } - return 0; -} - -#define DELAY (1000000 / SFX_TICKS_PER_SEC) - -void SfxState::sfx_init(ResourceManager *resMan, int flags, SciVersion soundVersion) { - _songlib._lib = 0; - _song = NULL; - _flags = flags; - - _player = NULL; - - if (flags & SFX_STATE_FLAG_NOSOUND) { - warning("[SFX] Sound disabled"); - return; - } - -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Initialising: flags=%x\n", flags); -#endif - - /*-------------------*/ - /* Initialise player */ - /*-------------------*/ - - if (!resMan) { - warning("[SFX] Warning: No resource manager present, cannot initialise player"); - return; - } - - _player = new SfxPlayer(soundVersion); - - if (!_player) { - warning("[SFX] No song player found"); - return; - } - - if (_player->init(resMan, DELAY / 1000)) { - warning("[SFX] Song player reported error, disabled"); - delete _player; - _player = NULL; - } - - _resMan = resMan; -} - -void SfxState::sfx_exit() { -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Uninitialising\n"); -#endif - - delete _player; - _player = 0; - - g_system->getMixer()->stopAll(); - - _songlib.freeSounds(); -} - -void SfxState::sfx_suspend(bool suspend) { -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Suspending? = %d\n", suspend); -#endif - if (suspend && (!_suspended)) { - /* suspend */ - - freezeTime(); - if (_player) - _player->pause(); - /* Suspend song player */ - - } else if (!suspend && (_suspended)) { - /* unsuspend */ - - thawTime(); - if (_player) - _player->resume(); - - /* Unsuspend song player */ - } - - _suspended = suspend; -} - -int SfxState::sfx_poll(SongHandle *handle, int *cue) { - if (!_song) - return 0; /* No milk today */ - - *handle = _song->_handle; - -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Polling any (%08lx)\n", *handle); -#endif - return sfx_poll_specific(*handle, cue); -} - -int SfxState::sfx_poll_specific(SongHandle handle, int *cue) { - const Audio::Timestamp ctime = Audio::Timestamp(g_system->getMillis(), SFX_TICKS_PER_SEC); - Song *song = _song; - - while (song && song->_handle != handle) - song = song->_nextPlaying; - - if (!song) - return 0; /* Song not playing */ - - debugC(2, kDebugLevelSound, "[SFX:CUE] Polled song %08lx ", handle); - - while (1) { - if (song->_wakeupTime.frameDiff(ctime) > 0) - return 0; /* Patience, young hacker! */ - - byte buf[8]; - int result = songit_next(&(song->_it), buf, cue, IT_READER_MASK_ALL); - - switch (result) { - - case SI_FINISHED: - setSongStatus(song, SOUND_STATUS_STOPPED); - update(); - /* ...fall through... */ - case SI_LOOP: - case SI_RELATIVE_CUE: - case SI_ABSOLUTE_CUE: - if (result == SI_FINISHED) - debugC(2, kDebugLevelSound, " => finished"); - else { - if (result == SI_LOOP) - debugC(2, kDebugLevelSound, " => Loop: %d (0x%x)", *cue, *cue); - else - debugC(2, kDebugLevelSound, " => Cue: %d (0x%x)", *cue, *cue); - - } - return result; - - default: - if (result > 0) - song->_wakeupTime = song->_wakeupTime.addFrames(result); - - /* Delay */ - break; - } - } - -} - - -/*****************/ -/* Song basics */ -/*****************/ - -void SfxState::sfx_add_song(SongIterator *it, int priority, SongHandle handle, int number) { - Song *song = _songlib.findSong(handle); - -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Adding song: %08lx at %d, it=%p\n", handle, priority, it); -#endif - if (!it) { - error("[SFX] Attempt to add empty song with handle %08lx", handle); - return; - } - - it->init(); - - /* If we're already playing this, stop it */ - /* Tell player to shut up */ -// _dump_songs(this); - - if (_player) - _player->iterator_message(SongIterator::Message(handle, SIMSG_STOP)); - - if (song) { - setSongStatus( song, SOUND_STATUS_STOPPED); - - fprintf(stderr, "Overwriting old song (%08lx) ...\n", handle); - if (song->_status == SOUND_STATUS_PLAYING || song->_status == SOUND_STATUS_SUSPENDED) { - delete it; - error("Unexpected (error): Song %ld still playing/suspended (%d)", - handle, song->_status); - return; - } else { - _songlib.removeSong(handle); /* No duplicates */ - } - - } - - song = new Song(handle, it, priority); - song->_resourceNum = number; - song->_hold = 0; - song->_loops = 0; - song->_wakeupTime = Audio::Timestamp(g_system->getMillis(), SFX_TICKS_PER_SEC); - _songlib.addSong(song); - _song = NULL; /* As above */ - update(); - - return; -} - -void SfxState::sfx_remove_song(SongHandle handle) { -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Removing song: %08lx\n", handle); -#endif - if (_song && _song->_handle == handle) - _song = NULL; - - _songlib.removeSong(handle); - update(); -} - - - -/**********************/ -/* Song modifications */ -/**********************/ - -#define ASSERT_SONG(s) if (!(s)) { warning("Looking up song handle %08lx failed in %s, L%d", handle, __FILE__, __LINE__); return; } - -void SfxState::sfx_song_set_status(SongHandle handle, int status) { - Song *song = _songlib.findSong(handle); - ASSERT_SONG(song); -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Setting song status to %d" - " (0:stop, 1:play, 2:susp, 3:wait): %08lx\n", status, handle); -#endif - - setSongStatus(song, status); - - update(); -} - -void SfxState::sfx_song_set_fade(SongHandle handle, fade_params_t *params) { -#ifdef DEBUG_SONG_API - static const char *stopmsg[] = {"??? Should not happen", "Do not stop afterwards", "Stop afterwards"}; -#endif - Song *song = _songlib.findSong(handle); - - ASSERT_SONG(song); - -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Setting fade params of %08lx to " - "final volume %d in steps of %d per %d ticks. %s.", - handle, fade->final_volume, fade->step_size, fade->ticks_per_step, - stopmsg[fade->action]); -#endif - - SIMSG_SEND_FADE(song->_it, params); - - update(); -} - -void SfxState::sfx_song_renice(SongHandle handle, int priority) { - Song *song = _songlib.findSong(handle); - ASSERT_SONG(song); -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Renicing song %08lx to %d\n", - handle, priority); -#endif - - song->_priority = priority; - - update(); -} - -void SfxState::sfx_song_set_loops(SongHandle handle, int loops) { - Song *song = _songlib.findSong(handle); - SongIterator::Message msg = SongIterator::Message(handle, SIMSG_SET_LOOPS(loops)); - ASSERT_SONG(song); - - song->_loops = loops; -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Setting loops on %08lx to %d\n", - handle, loops); -#endif - songit_handle_message(&(song->_it), msg); - - if (_player/* && _player->send_iterator_message*/) - /* FIXME: The above should be optional! */ - _player->iterator_message(msg); -} - -void SfxState::sfx_song_set_hold(SongHandle handle, int hold) { - Song *song = _songlib.findSong(handle); - SongIterator::Message msg = SongIterator::Message(handle, SIMSG_SET_HOLD(hold)); - ASSERT_SONG(song); - - song->_hold = hold; -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] Setting hold on %08lx to %d\n", - handle, hold); -#endif - songit_handle_message(&(song->_it), msg); - - if (_player/* && _player->send_iterator_message*/) - /* FIXME: The above should be optional! */ - _player->iterator_message(msg); -} - -/* Different from the one in iterator.c */ -static const int MIDI_cmdlen[16] = {0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 0, 3, 2, 0, 3, 0 - }; - -static const SongHandle midi_send_base = 0xffff0000; - -Common::Error SfxState::sfx_send_midi(SongHandle handle, int channel, - int command, int arg1, int arg2) { - byte buffer[5]; - - /* Yes, in that order. SCI channel mutes are actually done via - a counting semaphore. 0 means to decrement the counter, 1 - to increment it. */ - static const char *channel_state[] = {"ON", "OFF"}; - - if (command == 0xb0 && - arg1 == SCI_MIDI_CHANNEL_MUTE) { - warning("TODO: channel mute (channel %d %s)", channel, channel_state[arg2]); - /* We need to have a GET_PLAYMASK interface to use - here. SET_PLAYMASK we've got. - */ - return Common::kNoError; - } - - buffer[0] = channel | command; /* No channel remapping yet */ - - switch (command) { - case 0x80 : - case 0x90 : - case 0xb0 : - buffer[1] = arg1 & 0xff; - buffer[2] = arg2 & 0xff; - break; - case 0xc0 : - buffer[1] = arg1 & 0xff; - break; - case 0xe0 : - buffer[1] = (arg1 & 0x7f) | 0x80; - buffer[2] = (arg1 & 0xff00) >> 7; - break; - default: - warning("Unexpected explicit MIDI command %02x", command); - return Common::kUnknownError; - } - - if (_player) - _player->tell_synth(MIDI_cmdlen[command >> 4], buffer); - return Common::kNoError; -} - -int SfxState::sfx_getVolume() { - return _player->getVolume(); -} - -void SfxState::sfx_setVolume(int volume) { - _player->setVolume(volume); -} - -void SfxState::sfx_all_stop() { -#ifdef DEBUG_SONG_API - fprintf(stderr, "[sfx-core] All stop\n"); -#endif - - _songlib.freeSounds(); - update(); -} - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/sound/iterator/core.h b/engines/sci/sound/iterator/core.h deleted file mode 100644 index a44fe2ecae..0000000000 --- a/engines/sci/sound/iterator/core.h +++ /dev/null @@ -1,209 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Sound engine */ -#ifndef SCI_SFX_CORE_H -#define SCI_SFX_CORE_H - -#include "common/error.h" - -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/songlib.h" -#include "sci/resource.h" - -namespace Sci { - -class SfxPlayer; -class SongIterator; -struct fade_params_t; - -#define SFX_TICKS_PER_SEC 60 /* MIDI ticks per second */ - - -#define SFX_STATE_FLAG_MULTIPLAY (1 << 0) /* More than one song playable -** simultaneously ? */ -#define SFX_STATE_FLAG_NOSOUND (1 << 1) /* Completely disable sound playing */ - -class SfxState { -private: - SfxPlayer *_player; - -public: // FIXME, make private - SongIterator *_it; /**< The song iterator at the heart of things */ - uint _flags; /**< SFX_STATE_FLAG_* */ - SongLibrary _songlib; /**< Song library */ - Song *_song; /**< Active song, or start of active song chain */ - bool _suspended; /**< Whether we are suspended */ - ResourceManager *_resMan; - -public: - SfxState(); - ~SfxState(); - - /***********/ - /* General */ - /***********/ - - /* Initializes the sound engine - ** Parameters: (ResourceManager *) resMan: Resource manager for initialization - ** (int) flags: SFX_STATE_FLAG_* - */ - void sfx_init(ResourceManager *resMan, int flags, SciVersion soundVersion); - - /** Deinitializes the sound subsystem. */ - void sfx_exit(); - - /* Suspends/unsuspends the sound sybsystem - ** Parameters: (int) suspend: Whether to suspend (non-null) or to unsuspend - */ - void sfx_suspend(bool suspend); - - /* Polls the sound server for cues etc. - ** Returns : (int) 0 if the cue queue is empty, SI_LOOP, SI_CUE, or SI_FINISHED otherwise - ** (SongHandle) *handle: The affected handle - ** (int) *cue: The sound cue number (if SI_CUE), or the loop number (if SI_LOOP) - */ - int sfx_poll(SongHandle *handle, int *cue); - - /* Polls the sound server for cues etc. - ** Parameters: (SongHandle) handle: The handle to poll - ** Returns : (int) 0 if the cue queue is empty, SI_LOOP, SI_CUE, or SI_FINISHED otherwise - ** (int) *cue: The sound cue number (if SI_CUE), or the loop number (if SI_LOOP) - */ - int sfx_poll_specific(SongHandle handle, int *cue); - - /* Determines the current global volume settings - ** Returns : (int) The global volume, between 0 (silent) and 127 (max. volume) - */ - int sfx_getVolume(); - - /* Determines the current global volume settings - ** Parameters: (int) volume: The new global volume, between 0 and 127 (see above) - */ - void sfx_setVolume(int volume); - - /* Stops all songs currently playing, purges song library - */ - void sfx_all_stop(); - - - /*****************/ - /* Song basics */ - /*****************/ - - /* Adds a song to the internal sound library - ** Parameters: (SongIterator *) it: The iterator describing the song - ** (int) priority: Initial song priority (higher <-> more important) - ** (SongHandle) handle: The handle to associate with the song - */ - void sfx_add_song(SongIterator *it, int priority, SongHandle handle, int resnum); - - - /* Deletes a song and its associated song iterator from the song queue - ** Parameters: (SongHandle) handle: The song to remove - */ - void sfx_remove_song(SongHandle handle); - - - /**********************/ - /* Song modifications */ - /**********************/ - - - /* Sets the song status, i.e. whether it is playing, suspended, or stopped. - ** Parameters: (SongHandle) handle: Handle of the song to modify - ** (int) status: The song status the song should assume - ** WAITING and PLAYING are set implicitly and essentially describe the same state - ** as far as this function is concerned. - */ - void sfx_song_set_status(SongHandle handle, int status); - - /* Sets the new song priority - ** Parameters: (SongHandle) handle: The handle to modify - ** (int) priority: The priority to set - */ - void sfx_song_renice(SongHandle handle, int priority); - - /* Sets the number of loops for the specified song - ** Parameters: (SongHandle) handle: The song handle to reference - ** (int) loops: Number of loops to set - */ - void sfx_song_set_loops(SongHandle handle, int loops); - - /* Sets the number of loops for the specified song - ** Parameters: (SongHandle) handle: The song handle to reference - ** (int) hold: Number of loops to setn - */ - void sfx_song_set_hold(SongHandle handle, int hold); - - /* Instructs a song to be faded out - ** Parameters: (SongHandle) handle: The song handle to reference - ** (fade_params_t *) fade_setup: The precise fade-out configuration to use - */ - void sfx_song_set_fade(SongHandle handle, fade_params_t *fade_setup); - - - // Previously undocumented: - Common::Error sfx_send_midi(SongHandle handle, int channel, - int command, int arg1, int arg2); - - // misc - - /** - * Determines the polyphony of the player in use. - * @return Number of voices the active player can emit - */ - int sfx_get_player_polyphony(); - - /** - * Tells the player to stop its internal iterator. - */ - void sfx_reset_player(); - - /** - * Pass a raw MIDI event to the synth of the player. - * @param argc Length of buffer holding the midi event - * @param argv The buffer itself - */ - void sfx_player_tell_synth(int buf_nr, byte *buf); - -protected: - void freezeTime(); - void thawTime(); - - bool isPlaying(Song *song); - void setSongStatus(Song *song, int status); - void updateSingleSong(); - void updateMultiSong(); - void update(); -}; - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS - -#endif // SCI_SFX_CORE_H diff --git a/engines/sci/sound/iterator/iterator.cpp b/engines/sci/sound/iterator/iterator.cpp deleted file mode 100644 index 62560b631f..0000000000 --- a/engines/sci/sound/iterator/iterator.cpp +++ /dev/null @@ -1,1641 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Song iterators */ - -#include "common/util.h" - -#include "sci/sci.h" -#ifdef USE_OLD_MUSIC_FUNCTIONS - -#include "sci/sound/iterator/iterator_internal.h" -#include "sci/engine/state.h" // for sfx_player_tell_synth :/ -#include "sci/sound/iterator/core.h" // for sfx_player_tell_synth - -#include "sound/audiostream.h" -#include "sound/mixer.h" -#include "sound/decoders/raw.h" - -namespace Sci { - - -static const int MIDI_cmdlen[16] = {0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 1, 1, 2, 0 - }; - -/*#define DEBUG_DECODING*/ -/*#define DEBUG_VERBOSE*/ - -/** Find first set bit in bits and return its index. Returns 0 if bits is 0. */ -static int sci_ffs(int bits) { - if (!bits) - return 0; - - int retval = 1; - - while (!(bits & 1)) { - retval++; - bits >>= 1; - } - - return retval; -} - -static void print_tabs_id(int nr, songit_id_t id) { - while (nr-- > 0) - fprintf(stderr, "\t"); - - fprintf(stderr, "[%08lx] ", id); -} - -BaseSongIterator::BaseSongIterator(byte *data, uint size, songit_id_t id) - : _data(data, size) { - ID = id; -} - -/************************************/ -/*-- SCI0 iterator implementation --*/ -/************************************/ - -#define SCI0_MIDI_OFFSET 33 -#define SCI0_END_OF_SONG 0xfc /* proprietary MIDI command */ - -#define SCI0_PCM_SAMPLE_RATE_OFFSET 0x0e -#define SCI0_PCM_SIZE_OFFSET 0x20 -#define SCI0_PCM_DATA_OFFSET 0x2c - -#define CHECK_FOR_END_ABSOLUTE(offset) \ - if (offset > _data.size()) { \ - warning("Reached end of song without terminator (%x/%x) at %d", offset, _data.size(), __LINE__); \ - return SI_FINISHED; \ - } - -#define CHECK_FOR_END(offset_augment) \ - if ((channel->offset + (offset_augment)) > channel->end) { \ - channel->state = SI_STATE_FINISHED; \ - warning("Reached end of track %d without terminator (%x+%x/%x) at %d", channel->id, channel->offset, offset_augment, channel->end, __LINE__); \ - return SI_FINISHED; \ - } - - -static int _parse_ticks(byte *data, int *offset_p, int size) { - int ticks = 0; - int tempticks; - int offset = 0; - - do { - tempticks = data[offset++]; - ticks += (tempticks == SCI_MIDI_TIME_EXPANSION_PREFIX) ? - SCI_MIDI_TIME_EXPANSION_LENGTH : tempticks; - } while (tempticks == SCI_MIDI_TIME_EXPANSION_PREFIX - && offset < size); - - if (offset_p) - *offset_p = offset; - - return ticks; -} - - -static int _sci0_get_pcm_data(Sci0SongIterator *self, int *rate, int *xoffset, uint *xsize); - - -#define PARSE_FLAG_LOOPS_UNLIMITED (1 << 0) /* Unlimited # of loops? */ -#define PARSE_FLAG_PARAMETRIC_CUE (1 << 1) /* Assume that cues take an additional "cue value" argument */ -/* This implements a difference between SCI0 and SCI1 cues. */ - -void SongIteratorChannel::init(int id_, int offset_, int end_) { - playmask = PLAYMASK_NONE; /* Disable all channels */ - id = id_; - state = SI_STATE_DELTA_TIME; - loop_timepos = 0; - total_timepos = 0; - timepos_increment = 0; - delay = 0; /* Only used for more than one channel */ - last_cmd = 0xfe; - - offset = loop_offset = initial_offset = offset_; - end = end_; -} - -void SongIteratorChannel::resetSynthChannels() { - byte buf[5]; - - // FIXME: Evil hack - SfxState &sound = g_sci->getEngineState()->_sound; - - for (int i = 0; i < MIDI_CHANNELS; i++) { - if (playmask & (1 << i)) { - buf[0] = 0xe0 | i; /* Pitch bend */ - buf[1] = 0x80; /* Wheel center */ - buf[2] = 0x40; - sound.sfx_player_tell_synth(3, buf); - - buf[0] = 0xb0 | i; // Set control - buf[1] = 0x40; // Hold pedal - buf[2] = 0x00; // Off - sound.sfx_player_tell_synth(3, buf); - /* TODO: Reset other controls? */ - } - } -} - -int BaseSongIterator::parseMidiCommand(byte *buf, int *result, SongIteratorChannel *channel, int flags) { - byte cmd; - int paramsleft; - int midi_op; - int midi_channel; - - channel->state = SI_STATE_DELTA_TIME; - - cmd = _data[channel->offset++]; - - if (!(cmd & 0x80)) { - /* 'Running status' mode */ - channel->offset--; - cmd = channel->last_cmd; - } - - if (cmd == 0xfe) { - warning("song iterator subsystem: Corrupted sound resource detected."); - return SI_FINISHED; - } - - midi_op = cmd >> 4; - midi_channel = cmd & 0xf; - paramsleft = MIDI_cmdlen[midi_op]; - - buf[0] = cmd; - - - CHECK_FOR_END(paramsleft); - memcpy(buf + 1, _data.begin() + channel->offset, paramsleft); - *result = 1 + paramsleft; - - channel->offset += paramsleft; - - channel->last_cmd = cmd; - - /* Are we supposed to play this channel? */ - if ( - /* First, exclude "global" properties-- such as cues-- from consideration */ - (midi_op < 0xf - && !(cmd == SCI_MIDI_SET_SIGNAL) - && !(SCI_MIDI_CONTROLLER(cmd) - && buf[1] == SCI_MIDI_CUMULATIVE_CUE)) - - /* Next, check if the channel is allowed */ - && (!((1 << midi_channel) & channel->playmask))) - return /* Execute next command */ - nextCommand(buf, result); - - - if (cmd == SCI_MIDI_EOT) { - /* End of track? */ - channel->resetSynthChannels(); - if (_loops > 1) { - /* If allowed, decrement the number of loops */ - if (!(flags & PARSE_FLAG_LOOPS_UNLIMITED)) - *result = --_loops; - -#ifdef DEBUG_DECODING - fprintf(stderr, "%s L%d: (%p):%d Looping ", __FILE__, __LINE__, this, channel->id); - if (flags & PARSE_FLAG_LOOPS_UNLIMITED) - fprintf(stderr, "(indef.)"); - else - fprintf(stderr, "(%d)", _loops); - fprintf(stderr, " %x -> %x\n", - channel->offset, channel->loop_offset); -#endif - channel->offset = channel->loop_offset; - channel->state = SI_STATE_DELTA_TIME; - channel->total_timepos = channel->loop_timepos; - channel->last_cmd = 0xfe; - debugC(2, kDebugLevelSound, "Looping song iterator %08lx.", ID); - return SI_LOOP; - } else { - channel->state = SI_STATE_FINISHED; - return SI_FINISHED; - } - - } else if (cmd == SCI_MIDI_SET_SIGNAL) { - if (buf[1] == SCI_MIDI_SET_SIGNAL_LOOP) { - channel->loop_offset = channel->offset; - channel->loop_timepos = channel->total_timepos; - - return /* Execute next command */ - nextCommand(buf, result); - } else { - /* Used to be conditional <= 127 */ - *result = buf[1]; /* Absolute cue */ - return SI_ABSOLUTE_CUE; - } - } else if (SCI_MIDI_CONTROLLER(cmd)) { - switch (buf[1]) { - - case SCI_MIDI_CUMULATIVE_CUE: - if (flags & PARSE_FLAG_PARAMETRIC_CUE) - _ccc += buf[2]; - else { /* No parameter to CC */ - _ccc++; - /* channel->offset--; */ - } - *result = _ccc; - return SI_RELATIVE_CUE; - - case SCI_MIDI_RESET_ON_SUSPEND: - _resetflag = buf[2]; - break; - - case SCI_MIDI_SET_POLYPHONY: - _polyphony[midi_channel] = buf[2]; - break; - - case SCI_MIDI_SET_REVERB: - break; - - case SCI_MIDI_CHANNEL_MUTE: - warning("CHANNEL_MUTE(%d, %d)", midi_channel, buf[2]); - break; - - case SCI_MIDI_HOLD: { - // Safe cast: This controller is only used in SCI1 - Sci1SongIterator *self1 = (Sci1SongIterator *)this; - - if (buf[2] == self1->_hold) { - channel->offset = channel->initial_offset; - channel->state = SI_STATE_COMMAND; - channel->total_timepos = 0; - - self1->_numLoopedChannels = self1->_numActiveChannels - 1; - - // FIXME: - // This implementation of hold breaks getting out of the - // limo when visiting the airport near the start of LSL5. - // It seems like all channels should be reset here somehow, - // but not sure how. - // Forcing all channel offsets to 0 seems to fix the hang, - // but somehow slows the exit sequence down to take 20 seconds - // instead of about 3. - - return SI_LOOP; - } - - break; - } - case 0x04: /* UNKNOWN NYI (happens in LSL2 gameshow) */ - case 0x46: /* UNKNOWN NYI (happens in LSL3 binoculars) */ - case 0x61: /* UNKNOWN NYI (special for AdLib? Iceman) */ - case 0x73: /* UNKNOWN NYI (happens in Hoyle) */ - case 0xd1: /* UNKNOWN NYI (happens in KQ4 when riding the unicorn) */ - return /* Execute next command */ - nextCommand(buf, result); - - case 0x01: /* modulation */ - case 0x07: /* volume */ - case 0x0a: /* panpot */ - case 0x0b: /* expression */ - case 0x40: /* hold */ - case 0x79: /* reset all */ - /* No special treatment neccessary */ - break; - - } - return 0; - - } else { - /* Process as normal MIDI operation */ - return 0; - } -} - -int BaseSongIterator::processMidi(byte *buf, int *result, - SongIteratorChannel *channel, int flags) { - CHECK_FOR_END(0); - - switch (channel->state) { - - case SI_STATE_PCM: { - if (_data[channel->offset] == 0 - && _data[channel->offset + 1] == SCI_MIDI_EOT) - /* Fake one extra tick to trick the interpreter into not killing the song iterator right away */ - channel->state = SI_STATE_PCM_MAGIC_DELTA; - else - channel->state = SI_STATE_DELTA_TIME; - return SI_PCM; - } - - case SI_STATE_PCM_MAGIC_DELTA: { - int rate; - int offset; - uint size; - int delay; - if (_sci0_get_pcm_data((Sci0SongIterator *)this, &rate, &offset, &size)) - return SI_FINISHED; /* 'tis broken */ - channel->state = SI_STATE_FINISHED; - delay = (size * 50 + rate - 1) / rate; /* number of ticks to completion*/ - - debugC(2, kDebugLevelSound, "delaying %d ticks", delay); - return delay; - } - - case SI_STATE_UNINITIALISED: - warning("Attempt to read command from uninitialized iterator"); - init(); - return nextCommand(buf, result); - - case SI_STATE_FINISHED: - return SI_FINISHED; - - case SI_STATE_DELTA_TIME: { - int offset; - int ticks = _parse_ticks(_data.begin() + channel->offset, - &offset, - _data.size() - channel->offset); - - channel->offset += offset; - channel->delay += ticks; - channel->timepos_increment = ticks; - - CHECK_FOR_END(0); - - channel->state = SI_STATE_COMMAND; - - if (ticks) - return ticks; - } - - /* continute otherwise... */ - - case SI_STATE_COMMAND: { - int retval; - channel->total_timepos += channel->timepos_increment; - channel->timepos_increment = 0; - - retval = parseMidiCommand(buf, result, channel, flags); - - if (retval == SI_FINISHED) { - if (_numActiveChannels) - --(_numActiveChannels); -#ifdef DEBUG_DECODING - fprintf(stderr, "%s L%d: (%p):%d Finished channel, %d channels left\n", - __FILE__, __LINE__, this, channel->id, - _numActiveChannels); -#endif - /* If we still have channels left... */ - if (_numActiveChannels) { - return nextCommand(buf, result); - } - - /* Otherwise, we have reached the end */ - _loops = 0; - } - - return retval; - } - - default: - error("Invalid iterator state %d", channel->state); - return SI_FINISHED; - } -} - -int Sci0SongIterator::nextCommand(byte *buf, int *result) { - return processMidi(buf, result, &_channel, PARSE_FLAG_PARAMETRIC_CUE); -} - -static int _sci0_header_magic_p(byte *data, int offset, int size) { - if (offset + 0x10 > size) - return 0; - return (data[offset] == 0x1a) - && (data[offset + 1] == 0x00) - && (data[offset + 2] == 0x01) - && (data[offset + 3] == 0x00); -} - - -static int _sci0_get_pcm_data(Sci0SongIterator *self, - int *rate, int *xoffset, uint *xsize) { - int tries = 2; - bool found_it = false; - byte *pcm_data; - int size; - uint offset = SCI0_MIDI_OFFSET; - - if (self->_data[0] != 2) - return 1; - /* No such luck */ - - while ((tries--) && (offset < self->_data.size()) && (!found_it)) { - // Search through the garbage manually - // FIXME: Replace offset by an iterator - Common::Array::iterator iter = Common::find(self->_data.begin() + offset, self->_data.end(), SCI0_END_OF_SONG); - - if (iter == self->_data.end()) { - warning("Playing unterminated song"); - return 1; - } - - // add one to move it past the END_OF_SONG marker - iter++; - offset = iter - self->_data.begin(); // FIXME - - - if (_sci0_header_magic_p(self->_data.begin(), offset, self->_data.size())) - found_it = true; - } - - if (!found_it) { - warning("Song indicates presence of PCM, but" - " none found (finally at offset %04x)", offset); - - return 1; - } - - pcm_data = self->_data.begin() + offset; - - size = READ_LE_UINT16(pcm_data + SCI0_PCM_SIZE_OFFSET); - - /* Two of the format parameters are fixed by design: */ - *rate = READ_LE_UINT16(pcm_data + SCI0_PCM_SAMPLE_RATE_OFFSET); - - if (offset + SCI0_PCM_DATA_OFFSET + size != self->_data.size()) { - int d = offset + SCI0_PCM_DATA_OFFSET + size - self->_data.size(); - - warning("PCM advertizes %d bytes of data, but %d" - " bytes are trailing in the resource", - size, self->_data.size() - (offset + SCI0_PCM_DATA_OFFSET)); - - if (d > 0) - size -= d; /* Fix this */ - } - - *xoffset = offset; - *xsize = size; - - return 0; -} - -static Audio::AudioStream *makeStream(byte *data, int size, int rate) { - debugC(2, kDebugLevelSound, "Playing PCM data of size %d, rate %d", size, rate); - - // Duplicate the data - byte *sound = (byte *)malloc(size); - memcpy(sound, data, size); - - // Convert stream format flags - int flags = Audio::FLAG_UNSIGNED; - return Audio::makeRawStream(sound, size, rate, flags); -} - -Audio::AudioStream *Sci0SongIterator::getAudioStream() { - int rate; - int offset; - uint size; - if (_sci0_get_pcm_data(this, &rate, &offset, &size)) - return NULL; - - _channel.state = SI_STATE_FINISHED; /* Don't play both PCM and music */ - - return makeStream(_data.begin() + offset + SCI0_PCM_DATA_OFFSET, size, rate); -} - -SongIterator *Sci0SongIterator::handleMessage(Message msg) { - if (msg._class == _SIMSG_BASE) { - switch (msg._type) { - - case _SIMSG_BASEMSG_PRINT: - print_tabs_id(msg._arg.i, ID); - debugC(2, kDebugLevelSound, "SCI0: dev=%d, active-chan=%d, size=%d, loops=%d", - _deviceId, _numActiveChannels, _data.size(), _loops); - break; - - case _SIMSG_BASEMSG_SET_LOOPS: - _loops = msg._arg.i; - break; - - case _SIMSG_BASEMSG_STOP: { - songit_id_t sought_id = msg.ID; - - if (sought_id == ID) - _channel.state = SI_STATE_FINISHED; - break; - } - - case _SIMSG_BASEMSG_SET_PLAYMASK: { - int i; - _deviceId = msg._arg.i; - - /* Set all but the rhytm channel mask bits */ - _channel.playmask &= ~(1 << MIDI_RHYTHM_CHANNEL); - - for (i = 0; i < MIDI_CHANNELS; i++) - if (_data[2 + (i << 1)] & _deviceId - && i != MIDI_RHYTHM_CHANNEL) - _channel.playmask |= (1 << i); - } - break; - - case _SIMSG_BASEMSG_SET_RHYTHM: - _channel.playmask &= ~(1 << MIDI_RHYTHM_CHANNEL); - if (msg._arg.i) - _channel.playmask |= (1 << MIDI_RHYTHM_CHANNEL); - break; - - case _SIMSG_BASEMSG_SET_FADE: { - fade_params_t *fp = (fade_params_t *) msg._arg.p; - fade.action = fp->action; - fade.final_volume = fp->final_volume; - fade.ticks_per_step = fp->ticks_per_step; - fade.step_size = fp->step_size; - break; - } - - default: - return NULL; - } - - return this; - } - return NULL; -} - -int Sci0SongIterator::getTimepos() { - return _channel.total_timepos; -} - -Sci0SongIterator::Sci0SongIterator(byte *data, uint size, songit_id_t id) - : BaseSongIterator(data, size, id) { - channel_mask = 0xffff; // Allocate all channels by default - _channel.state = SI_STATE_UNINITIALISED; - - for (int i = 0; i < MIDI_CHANNELS; i++) - _polyphony[i] = data[1 + (i << 1)]; - - init(); -} - -void Sci0SongIterator::init() { - fade.action = FADE_ACTION_NONE; - _resetflag = 0; - _loops = 0; - priority = 0; - - _ccc = 0; /* Reset cumulative cue counter */ - _numActiveChannels = 1; - _channel.init(0, SCI0_MIDI_OFFSET, _data.size()); - _channel.resetSynthChannels(); - - if (_data[0] == 2) /* Do we have an embedded PCM? */ - _channel.state = SI_STATE_PCM; -} - -SongIterator *Sci0SongIterator::clone(int delta) { - Sci0SongIterator *newit = new Sci0SongIterator(*this); - return newit; -} - - -/***************************/ -/*-- SCI1 song iterators --*/ -/***************************/ - -int Sci1SongIterator::initSample(const int offset) { - Sci1Sample sample; - int rate; - int length; - int begin; - int end; - - CHECK_FOR_END_ABSOLUTE((uint)offset + 10); - if (_data[offset + 1] != 0) - warning("[iterator-1] In sample at offset 0x04x: Byte #1 is %02x instead of zero", - _data[offset + 1]); - - rate = (int16)READ_LE_UINT16(_data.begin() + offset + 2); - length = READ_LE_UINT16(_data.begin() + offset + 4); - begin = (int16)READ_LE_UINT16(_data.begin() + offset + 6); - end = (int16)READ_LE_UINT16(_data.begin() + offset + 8); - - CHECK_FOR_END_ABSOLUTE((uint)(offset + 10 + length)); - - sample.delta = begin; - sample.size = length; - sample._data = _data.begin() + offset + 10; - -#ifdef DEBUG_VERBOSE - fprintf(stderr, "[SAMPLE] %x/%x/%x/%x l=%x\n", - offset + 10, begin, end, _data.size(), length); -#endif - - sample.rate = rate; - - sample.announced = false; - - /* Insert into the sample list at the right spot, keeping it sorted by delta */ - Common::List::iterator seeker = _samples.begin(); - while (seeker != _samples.end() && seeker->delta < begin) - ++seeker; - _samples.insert(seeker, sample); - - return 0; /* Everything's fine */ -} - -int Sci1SongIterator::initSong() { - int last_time; - uint offset = 0; - _numChannels = 0; - _samples.clear(); -// _deviceId = 0x0c; - - if (_data[offset] == 0xf0) { - priority = _data[offset + 1]; - - offset += 8; - } - - while (_data[offset] != 0xff - && _data[offset] != _deviceId) { - offset++; - CHECK_FOR_END_ABSOLUTE(offset + 1); - while (_data[offset] != 0xff) { - CHECK_FOR_END_ABSOLUTE(offset + 7); - offset += 6; - } - offset++; - } - - if (_data[offset] == 0xff) { - warning("[iterator] Song does not support hardware 0x%02x", _deviceId); - return 1; - } - - offset++; - - while (_data[offset] != 0xff) { /* End of list? */ - uint track_offset; - int end; - offset += 2; - - CHECK_FOR_END_ABSOLUTE(offset + 4); - - track_offset = READ_LE_UINT16(_data.begin() + offset); - end = READ_LE_UINT16(_data.begin() + offset + 2); - - CHECK_FOR_END_ABSOLUTE(track_offset - 1); - - if (_data[track_offset] == 0xfe) { - if (initSample(track_offset)) - return 1; /* Error */ - } else { - /* Regular MIDI channel */ - if (_numChannels >= MIDI_CHANNELS) { - warning("[iterator] Song has more than %d channels, cutting them off", - MIDI_CHANNELS); - break; /* Scan for remaining samples */ - } else { - int channel_nr = _data[track_offset] & 0xf; - SongIteratorChannel &channel = _channels[_numChannels++]; - - /* - if (_data[track_offset] & 0xf0) - printf("Channel %d has mapping bits %02x\n", - channel_nr, _data[track_offset] & 0xf0); - */ - - // Add 2 to skip over header bytes */ - channel.init(channel_nr, track_offset + 2, track_offset + end); - channel.resetSynthChannels(); - - _polyphony[_numChannels - 1] = _data[channel.offset - 1] & 15; - - channel.playmask = ~0; /* Enable all */ - channel_mask |= (1 << channel_nr); - - CHECK_FOR_END_ABSOLUTE(offset + end); - } - } - offset += 4; - CHECK_FOR_END_ABSOLUTE(offset); - } - - /* Now ensure that sample deltas are relative to the previous sample */ - last_time = 0; - _numActiveChannels = _numChannels; - _numLoopedChannels = 0; - - for (Common::List::iterator seeker = _samples.begin(); - seeker != _samples.end(); ++seeker) { - int prev_last_time = last_time; - //printf("[iterator] Detected sample: %d Hz, %d bytes at time %d\n", - // seeker->format.rate, seeker->size, seeker->delta); - last_time = seeker->delta; - seeker->delta -= prev_last_time; - } - - return 0; /* Success */ -} - -int Sci1SongIterator::getSmallestDelta() const { - int d = -1; - for (int i = 0; i < _numChannels; i++) - if (_channels[i].state == SI_STATE_COMMAND - && (d == -1 || _channels[i].delay < d)) - d = _channels[i].delay; - - if (!_samples.empty() && _samples.begin()->delta < d) - return _samples.begin()->delta; - else - return d; -} - -void Sci1SongIterator::updateDelta(int delta) { - if (!_samples.empty()) - _samples.begin()->delta -= delta; - - for (int i = 0; i < _numChannels; i++) - if (_channels[i].state == SI_STATE_COMMAND) - _channels[i].delay -= delta; -} - -bool Sci1SongIterator::noDeltaTime() const { - for (int i = 0; i < _numChannels; i++) - if (_channels[i].state == SI_STATE_DELTA_TIME) - return false; - return true; -} - -#define COMMAND_INDEX_NONE -1 -#define COMMAND_INDEX_PCM -2 - -int Sci1SongIterator::getCommandIndex() const { - /* Determine the channel # of the next active event, or -1 */ - int i; - int base_delay = 0x7ffffff; - int best_chan = COMMAND_INDEX_NONE; - - for (i = 0; i < _numChannels; i++) - if ((_channels[i].state != SI_STATE_PENDING) - && (_channels[i].state != SI_STATE_FINISHED)) { - - if ((_channels[i].state == SI_STATE_DELTA_TIME) - && (_channels[i].delay == 0)) - return i; - /* First, read all unknown delta times */ - - if (_channels[i].delay < base_delay) { - best_chan = i; - base_delay = _channels[i].delay; - } - } - - if (!_samples.empty() && base_delay >= _samples.begin()->delta) - return COMMAND_INDEX_PCM; - - return best_chan; -} - - -Audio::AudioStream *Sci1SongIterator::getAudioStream() { - Common::List::iterator sample = _samples.begin(); - if (sample != _samples.end() && sample->delta <= 0) { - Audio::AudioStream *feed = makeStream(sample->_data, sample->size, sample->rate); - _samples.erase(sample); - - return feed; - } else - return NULL; -} - -int Sci1SongIterator::nextCommand(byte *buf, int *result) { - - if (!_initialised) { - //printf("[iterator] DEBUG: Initialising for %d\n", _deviceId); - _initialised = true; - if (initSong()) - return SI_FINISHED; - } - - - if (_delayRemaining) { - int delay = _delayRemaining; - _delayRemaining = 0; - return delay; - } - - int retval = 0; - do { /* All delays must be processed separately */ - int chan = getCommandIndex(); - - if (chan == COMMAND_INDEX_NONE) { - return SI_FINISHED; - } - - if (chan == COMMAND_INDEX_PCM) { - - if (_samples.begin()->announced) { - /* Already announced; let's discard it */ - Audio::AudioStream *feed = getAudioStream(); - delete feed; - } else { - int delay = _samples.begin()->delta; - - if (delay) { - updateDelta(delay); - return delay; - } - /* otherwise we're touching a PCM */ - _samples.begin()->announced = true; - return SI_PCM; - } - } else { /* Not a PCM */ - - retval = processMidi(buf, result, - &(_channels[chan]), - PARSE_FLAG_LOOPS_UNLIMITED); - - if (retval == SI_LOOP) { - _numLoopedChannels++; - _channels[chan].state = SI_STATE_PENDING; - _channels[chan].delay = 0; - - if (_numLoopedChannels == _numActiveChannels) { - int i; - - /* Everyone's ready: Let's loop */ - for (i = 0; i < _numChannels; i++) - if (_channels[i].state == SI_STATE_PENDING) - _channels[i].state = SI_STATE_DELTA_TIME; - - _numLoopedChannels = 0; - return SI_LOOP; - } - } else if (retval == SI_FINISHED) { -#ifdef DEBUG - fprintf(stderr, "FINISHED some channel\n"); -#endif - } else if (retval > 0) { - int sd ; - sd = getSmallestDelta(); - - if (noDeltaTime() && sd) { - /* No other channel is ready */ - updateDelta(sd); - - /* Only from here do we return delta times */ - return sd; - } - } - - } /* Not a PCM */ - - } while (retval > 0); - - return retval; -} - -SongIterator *Sci1SongIterator::handleMessage(Message msg) { - if (msg._class == _SIMSG_BASE) { /* May extend this in the future */ - switch (msg._type) { - - case _SIMSG_BASEMSG_PRINT: { - int playmask = 0; - int i; - - for (i = 0; i < _numChannels; i++) - playmask |= _channels[i].playmask; - - print_tabs_id(msg._arg.i, ID); - debugC(2, kDebugLevelSound, "SCI1: chan-nr=%d, playmask=%04x", - _numChannels, playmask); - } - break; - - case _SIMSG_BASEMSG_STOP: { - songit_id_t sought_id = msg.ID; - int i; - - if (sought_id == ID) { - ID = 0; - - for (i = 0; i < _numChannels; i++) - _channels[i].state = SI_STATE_FINISHED; - } - break; - } - - case _SIMSG_BASEMSG_SET_PLAYMASK: - if (msg.ID == ID) { - channel_mask = 0; - - _deviceId = msg._arg.i; - - if (_initialised) { - int i; - int toffset = -1; - - for (i = 0; i < _numChannels; i++) - if (_channels[i].state != SI_STATE_FINISHED - && _channels[i].total_timepos > toffset) { - toffset = _channels[i].total_timepos - + _channels[i].timepos_increment - - _channels[i].delay; - } - - /* Find an active channel so that we can - ** get the correct time offset */ - - initSong(); - - toffset -= _delayRemaining; - _delayRemaining = 0; - - if (toffset > 0) - return new_fast_forward_iterator(this, toffset); - } else { - initSong(); - _initialised = true; - } - - break; - - } - - case _SIMSG_BASEMSG_SET_LOOPS: - if (msg.ID == ID) - _loops = (msg._arg.i > 32767) ? 99 : 0; - /* 99 is arbitrary, but we can't use '1' because of - ** the way we're testing in the decoding section. */ - break; - - case _SIMSG_BASEMSG_SET_HOLD: - _hold = msg._arg.i; - break; - case _SIMSG_BASEMSG_SET_RHYTHM: - /* Ignore */ - break; - - case _SIMSG_BASEMSG_SET_FADE: { - fade_params_t *fp = (fade_params_t *) msg._arg.p; - fade.action = fp->action; - fade.final_volume = fp->final_volume; - fade.ticks_per_step = fp->ticks_per_step; - fade.step_size = fp->step_size; - break; - } - - default: - warning("Unsupported command %d to SCI1 iterator", msg._type); - } - return this; - } - return NULL; -} - -Sci1SongIterator::Sci1SongIterator(byte *data, uint size, songit_id_t id) - : BaseSongIterator(data, size, id) { - channel_mask = 0; // Defer channel allocation - - for (int i = 0; i < MIDI_CHANNELS; i++) - _polyphony[i] = 0; // Unknown - - init(); -} - -void Sci1SongIterator::init() { - fade.action = FADE_ACTION_NONE; - _resetflag = 0; - _loops = 0; - priority = 0; - - _ccc = 0; - _deviceId = 0x00; // Default to Sound Blaster/AdLib for purposes of cue computation - _numChannels = 0; - _initialised = false; - _delayRemaining = 0; - _loops = 0; - _hold = 0; - memset(_polyphony, 0, sizeof(_polyphony)); -} - -Sci1SongIterator::~Sci1SongIterator() { -} - - -SongIterator *Sci1SongIterator::clone(int delta) { - Sci1SongIterator *newit = new Sci1SongIterator(*this); - newit->_delayRemaining = delta; - return newit; -} - -int Sci1SongIterator::getTimepos() { - int max = 0; - int i; - - for (i = 0; i < _numChannels; i++) - if (_channels[i].total_timepos > max) - max = _channels[i].total_timepos; - - return max; -} - -/** - * A song iterator with the purpose of sending notes-off channel commands. - */ -class CleanupSongIterator : public SongIterator { -public: - CleanupSongIterator(uint channels) { - channel_mask = channels; - ID = 17; - } - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream() { return NULL; } - SongIterator *handleMessage(Message msg); - int getTimepos() { return 0; } - SongIterator *clone(int delta) { return new CleanupSongIterator(*this); } -}; - -SongIterator *CleanupSongIterator::handleMessage(Message msg) { - if (msg._class == _SIMSG_BASEMSG_PRINT && msg._type == _SIMSG_BASEMSG_PRINT) { - print_tabs_id(msg._arg.i, ID); - debugC(2, kDebugLevelSound, "CLEANUP"); - } - - return NULL; -} - -int CleanupSongIterator::nextCommand(byte *buf, int *result) { - /* Task: Return channel-notes-off for each channel */ - if (channel_mask) { - int bs = sci_ffs(channel_mask) - 1; - - channel_mask &= ~(1 << bs); - buf[0] = 0xb0 | bs; /* Controller */ - buf[1] = SCI_MIDI_CHANNEL_NOTES_OFF; - buf[2] = 0; /* Hmm... */ - *result = 3; - return 0; - } else - return SI_FINISHED; -} - -/**********************/ -/*-- Timer iterator --*/ -/**********************/ -int TimerSongIterator::nextCommand(byte *buf, int *result) { - if (_delta) { - int d = _delta; - _delta = 0; - return d; - } - return SI_FINISHED; -} - -SongIterator *new_timer_iterator(int delta) { - return new TimerSongIterator(delta); -} - -/**********************************/ -/*-- Fast-forward song iterator --*/ -/**********************************/ - -int FastForwardSongIterator::nextCommand(byte *buf, int *result) { - if (_delta <= 0) - return SI_MORPH; /* Did our duty */ - - while (1) { - int rv = _delegate->nextCommand(buf, result); - - if (rv > 0) { - /* Subtract from the delta we want to wait */ - _delta -= rv; - - /* Done */ - if (_delta < 0) - return -_delta; - } - - if (rv <= 0) - return rv; - } -} - -Audio::AudioStream *FastForwardSongIterator::getAudioStream() { - return _delegate->getAudioStream(); -} - -SongIterator *FastForwardSongIterator::handleMessage(Message msg) { - if (msg._class == _SIMSG_PLASTICWRAP) { - assert(msg._type == _SIMSG_PLASTICWRAP_ACK_MORPH); - - if (_delta <= 0) { - SongIterator *it = _delegate; - delete this; - return it; - } - - warning("[ff-iterator] Morphing without need"); - return this; - } - - if (msg._class == _SIMSG_BASE && msg._type == _SIMSG_BASEMSG_PRINT) { - print_tabs_id(msg._arg.i, ID); - debugC(2, kDebugLevelSound, "FASTFORWARD:"); - msg._arg.i++; - } - - // And continue with the delegate - songit_handle_message(&_delegate, msg); - - return NULL; -} - - -int FastForwardSongIterator::getTimepos() { - return _delegate->getTimepos(); -} - -FastForwardSongIterator::FastForwardSongIterator(SongIterator *capsit, int delta) - : _delegate(capsit), _delta(delta) { - - channel_mask = capsit->channel_mask; -} - -SongIterator *FastForwardSongIterator::clone(int delta) { - FastForwardSongIterator *newit = new FastForwardSongIterator(*this); - newit->_delegate = _delegate->clone(delta); - return newit; -} - -SongIterator *new_fast_forward_iterator(SongIterator *capsit, int delta) { - if (capsit == NULL) - return NULL; - - FastForwardSongIterator *it = new FastForwardSongIterator(capsit, delta); - return it; -} - - -/********************/ -/*-- Tee iterator --*/ -/********************/ - - -static void song_iterator_add_death_listener(SongIterator *it, TeeSongIterator *client) { - for (int i = 0; i < SONGIT_MAX_LISTENERS; ++i) { - if (it->_deathListeners[i] == 0) { - it->_deathListeners[i] = client; - return; - } - } - error("FATAL: Too many death listeners for song iterator"); -} - -static void song_iterator_remove_death_listener(SongIterator *it, TeeSongIterator *client) { - for (int i = 0; i < SONGIT_MAX_LISTENERS; ++i) { - if (it->_deathListeners[i] == client) { - it->_deathListeners[i] = 0; - return; - } - } -} - -static void song_iterator_transfer_death_listeners(SongIterator *it, SongIterator *it_from) { - for (int i = 0; i < SONGIT_MAX_LISTENERS; ++i) { - if (it_from->_deathListeners[i]) - song_iterator_add_death_listener(it, it_from->_deathListeners[i]); - it_from->_deathListeners[i] = 0; - } -} - -static void songit_tee_death_notification(TeeSongIterator *self, SongIterator *corpse) { - if (corpse == self->_children[TEE_LEFT].it) { - self->_status &= ~TEE_LEFT_ACTIVE; - self->_children[TEE_LEFT].it = NULL; - } else if (corpse == self->_children[TEE_RIGHT].it) { - self->_status &= ~TEE_RIGHT_ACTIVE; - self->_children[TEE_RIGHT].it = NULL; - } else { - error("songit_tee_death_notification() failed: Breakpoint in %s, line %d", __FILE__, __LINE__); - } -} - -TeeSongIterator::TeeSongIterator(SongIterator *left, SongIterator *right) { - int i; - int firstfree = 1; /* First free channel */ - int incomplete_map = 0; - - _readyToMorph = false; - _status = TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE; - - _children[TEE_LEFT].it = left; - _children[TEE_RIGHT].it = right; - - /* Default to lhs channels */ - channel_mask = left->channel_mask; - for (i = 0; i < 16; i++) - if (channel_mask & (1 << i) & right->channel_mask - && (i != MIDI_RHYTHM_CHANNEL) /* Share rhythm */) { /*conflict*/ - while ((firstfree == MIDI_RHYTHM_CHANNEL) - /* Either if it's the rhythm channel or if it's taken */ - || (firstfree < MIDI_CHANNELS - && ((1 << firstfree) & channel_mask))) - ++firstfree; - - if (firstfree == MIDI_CHANNELS) { - incomplete_map = 1; - //warning("[songit-tee <%08lx,%08lx>] Could not remap right channel #%d: Out of channels", - // left->ID, right->ID, i); - } else { - _children[TEE_RIGHT].it->channel_remap[i] = firstfree; - - channel_mask |= (1 << firstfree); - } - } -#ifdef DEBUG_TEE_ITERATOR - if (incomplete_map) { - int c; - fprintf(stderr, "[songit-tee <%08lx,%08lx>] Channels:" - " %04x <- %04x | %04x\n", - left->ID, right->ID, - channel_mask, - left->channel_mask, right->channel_mask); - for (c = 0 ; c < 2; c++) - for (i = 0 ; i < 16; i++) - fprintf(stderr, " map [%d][%d] -> %d\n", - c, i, _children[c].it->channel_remap[i]); - } -#endif - - - song_iterator_add_death_listener(left, this); - song_iterator_add_death_listener(right, this); -} - -TeeSongIterator::~TeeSongIterator() { - // When we die, remove any listeners from our children - if (_children[TEE_LEFT].it) { - song_iterator_remove_death_listener(_children[TEE_LEFT].it, this); - } - - if (_children[TEE_RIGHT].it) { - song_iterator_remove_death_listener(_children[TEE_RIGHT].it, this); - } -} - - -int TeeSongIterator::nextCommand(byte *buf, int *result) { - static const int ready_masks[2] = {TEE_LEFT_READY, TEE_RIGHT_READY}; - static const int active_masks[2] = {TEE_LEFT_ACTIVE, TEE_RIGHT_ACTIVE}; - static const int pcm_masks[2] = {TEE_LEFT_PCM, TEE_RIGHT_PCM}; - int i; - int retid; - -#ifdef DEBUG_TEE_ITERATOR - fprintf(stderr, "[Tee] %02x\n", _status); -#endif - - if (!(_status & (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE))) - /* None is active? */ - return SI_FINISHED; - - if (_readyToMorph) - return SI_MORPH; - - if ((_status & (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE)) - != (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE)) { - /* Not all are is active? */ - int which = 0; -#ifdef DEBUG_TEE_ITERATOR - fprintf(stderr, "\tRequesting transformation...\n"); -#endif - if (_status & TEE_LEFT_ACTIVE) - which = TEE_LEFT; - else if (_status & TEE_RIGHT_ACTIVE) - which = TEE_RIGHT; - memcpy(buf, _children[which].buf, sizeof(buf)); - *result = _children[which].result; - _readyToMorph = true; - return _children[which].retval; - } - - /* First, check for unreported PCMs */ - for (i = TEE_LEFT; i <= TEE_RIGHT; i++) - if ((_status & (ready_masks[i] | pcm_masks[i])) - == (ready_masks[i] | pcm_masks[i])) { - _status &= ~ready_masks[i]; - return SI_PCM; - } - - for (i = TEE_LEFT; i <= TEE_RIGHT; i++) - if (!(_status & ready_masks[i])) { - - /* Buffers aren't ready yet */ - _children[i].retval = - songit_next(&(_children[i].it), - _children[i].buf, - &(_children[i].result), - IT_READER_MASK_ALL - | IT_READER_MAY_FREE - | IT_READER_MAY_CLEAN); - - _status |= ready_masks[i]; -#ifdef DEBUG_TEE_ITERATOR - fprintf(stderr, "\t Must check %d: %d\n", i, _children[i].retval); -#endif - - if (_children[i].retval == SI_ABSOLUTE_CUE || - _children[i].retval == SI_RELATIVE_CUE) - return _children[i].retval; - if (_children[i].retval == SI_FINISHED) { - _status &= ~active_masks[i]; - /* Recurse to complete */ -#ifdef DEBUG_TEE_ITERATOR - fprintf(stderr, "\t Child %d signalled completion, recursing w/ status %02x\n", i, _status); -#endif - return nextCommand(buf, result); - } else if (_children[i].retval == SI_PCM) { - _status |= pcm_masks[i]; - _status &= ~ready_masks[i]; - return SI_PCM; - } - } - - - /* We've already handled PCM, MORPH and FINISHED, CUEs & LOOP remain */ - - retid = TEE_LEFT; - if ((_children[TEE_LEFT].retval > 0) - /* Asked to delay */ - && (_children[TEE_RIGHT].retval <= _children[TEE_LEFT].retval)) - /* Is not delaying or not delaying as much */ - retid = TEE_RIGHT; - -#ifdef DEBUG_TEE_ITERATOR - fprintf(stderr, "\tl:%d / r:%d / chose %d\n", - _children[TEE_LEFT].retval, _children[TEE_RIGHT].retval, retid); -#endif - - /* Adjust delta times */ - if (_children[retid].retval > 0 - && _children[1-retid].retval > 0) { - if (_children[1-retid].retval - == _children[retid].retval) - /* If both _children wait the same amount of time, - ** we have to re-fetch commands from both */ - _status &= ~ready_masks[1-retid]; - else - /* If they don't, we can/must re-use the other - ** child's delay time */ - _children[1-retid].retval - -= _children[retid].retval; - } - - _status &= ~ready_masks[retid]; - memcpy(buf, _children[retid].buf, sizeof(buf)); - *result = _children[retid].result; - - return _children[retid].retval; -} - -Audio::AudioStream *TeeSongIterator::getAudioStream() { - static const int pcm_masks[2] = {TEE_LEFT_PCM, TEE_RIGHT_PCM}; - int i; - - for (i = TEE_LEFT; i <= TEE_RIGHT; i++) - if (_status & pcm_masks[i]) { - _status &= ~pcm_masks[i]; - return _children[i].it->getAudioStream(); - } - - return NULL; // No iterator -} - -SongIterator *TeeSongIterator::handleMessage(Message msg) { - if (msg._class == _SIMSG_PLASTICWRAP) { - assert(msg._type == _SIMSG_PLASTICWRAP_ACK_MORPH); - - SongIterator *old_it; - if (!(_status & (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE))) { - delete this; - return NULL; - } else if (!(_status & TEE_LEFT_ACTIVE)) { - delete _children[TEE_LEFT].it; - _children[TEE_LEFT].it = 0; - old_it = _children[TEE_RIGHT].it; - song_iterator_remove_death_listener(old_it, this); - song_iterator_transfer_death_listeners(old_it, this); - delete this; - return old_it; - } else if (!(_status & TEE_RIGHT_ACTIVE)) { - delete _children[TEE_RIGHT].it; - _children[TEE_RIGHT].it = 0; - old_it = _children[TEE_LEFT].it; - song_iterator_remove_death_listener(old_it, this); - song_iterator_transfer_death_listeners(old_it, this); - delete this; - return old_it; - } - - warning("[tee-iterator] Morphing without need"); - return this; - } - - if (msg._class == _SIMSG_BASE && msg._type == _SIMSG_BASEMSG_PRINT) { - print_tabs_id(msg._arg.i, ID); - debugC(2, kDebugLevelSound, "TEE:"); - msg._arg.i++; - } - - // And continue with the children - if (_children[TEE_LEFT].it) - songit_handle_message(&(_children[TEE_LEFT].it), msg); - if (_children[TEE_RIGHT].it) - songit_handle_message(&(_children[TEE_RIGHT].it), msg); - - return NULL; -} - -void TeeSongIterator::init() { - _status = TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE; - _children[TEE_LEFT].it->init(); - _children[TEE_RIGHT].it->init(); -} - -SongIterator *TeeSongIterator::clone(int delta) { - TeeSongIterator *newit = new TeeSongIterator(*this); - - if (_children[TEE_LEFT].it) - newit->_children[TEE_LEFT].it = _children[TEE_LEFT].it->clone(delta); - if (_children[TEE_RIGHT].it) - newit->_children[TEE_RIGHT].it = _children[TEE_RIGHT].it->clone(delta); - - return newit; -} - - -/*************************************/ -/*-- General purpose functionality --*/ -/*************************************/ - -int songit_next(SongIterator **it, byte *buf, int *result, int mask) { - int retval; - - if (!*it) - return SI_FINISHED; - - do { - retval = (*it)->nextCommand(buf, result); - if (retval == SI_MORPH) { - debugC(2, kDebugLevelSound, " Morphing %p (stored at %p)", (void *)*it, (void *)it); - if (!SIMSG_SEND((*it), SIMSG_ACK_MORPH)) { - error("SI_MORPH failed. Breakpoint in %s, line %d", __FILE__, __LINE__); - } else - debugC(2, kDebugLevelSound, "SI_MORPH successful"); - } - - if (retval == SI_FINISHED) - debugC(2, kDebugLevelSound, "[song-iterator] Song finished. mask = %04x, cm=%04x", - mask, (*it)->channel_mask); - if (retval == SI_FINISHED - && (mask & IT_READER_MAY_CLEAN) - && (*it)->channel_mask) { /* This last test will fail - ** with a terminated - ** cleanup iterator */ - int channel_mask = (*it)->channel_mask; - - SongIterator *old_it = *it; - *it = new CleanupSongIterator(channel_mask); - for(uint i = 0; i < MIDI_CHANNELS; i++) - (*it)->channel_remap[i] = old_it->channel_remap[i]; - song_iterator_transfer_death_listeners(*it, old_it); - if (mask & IT_READER_MAY_FREE) - delete old_it; - retval = -9999; /* Continue */ - } - } while (!( /* Until one of the following holds */ - (retval > 0 && (mask & IT_READER_MASK_DELAY)) - || (retval == 0 && (mask & IT_READER_MASK_MIDI)) - || (retval == SI_LOOP && (mask & IT_READER_MASK_LOOP)) - || (retval == SI_ABSOLUTE_CUE && - (mask & IT_READER_MASK_CUE)) - || (retval == SI_RELATIVE_CUE && - (mask & IT_READER_MASK_CUE)) - || (retval == SI_PCM && (mask & IT_READER_MASK_PCM)) - || (retval == SI_FINISHED) - )); - - if (retval == SI_FINISHED && (mask & IT_READER_MAY_FREE)) { - delete *it; - *it = NULL; - } - - return retval; -} - -SongIterator::SongIterator() { - ID = 0; - channel_mask = 0; - fade.action = FADE_ACTION_NONE; - priority = 0; - memset(_deathListeners, 0, sizeof(_deathListeners)); - - // By default, don't remap - for (uint i = 0; i < 16; i++) - channel_remap[i] = i; -} - -SongIterator::SongIterator(const SongIterator &si) { - ID = si.ID; - channel_mask = si.channel_mask; - fade = si.fade; - priority = si.priority; - memset(_deathListeners, 0, sizeof(_deathListeners)); - - for (uint i = 0; i < 16; i++) - channel_remap[i] = si.channel_remap[i]; -} - - -SongIterator::~SongIterator() { - for (int i = 0; i < SONGIT_MAX_LISTENERS; ++i) - if (_deathListeners[i]) - songit_tee_death_notification(_deathListeners[i], this); -} - -SongIterator *songit_new(byte *data, uint size, SongIteratorType type, songit_id_t id) { - BaseSongIterator *it; - - if (!data || size < 22) { - warning("Attempt to instantiate song iterator for null song data"); - return NULL; - } - - - switch (type) { - case SCI_SONG_ITERATOR_TYPE_SCI0: - it = new Sci0SongIterator(data, size, id); - break; - - case SCI_SONG_ITERATOR_TYPE_SCI1: - it = new Sci1SongIterator(data, size, id); - break; - - default: - /**-- Invalid/unsupported sound resources --**/ - warning("Attempt to instantiate invalid/unknown song iterator type %d", type); - return NULL; - } - - return it; -} - -int songit_handle_message(SongIterator **it_reg_p, SongIterator::Message msg) { - SongIterator *it = *it_reg_p; - SongIterator *newit; - - newit = it->handleMessage(msg); - - if (!newit) - return 0; /* Couldn't handle */ - - *it_reg_p = newit; /* Might have self-morphed */ - return 1; -} - -SongIterator *sfx_iterator_combine(SongIterator *it1, SongIterator *it2) { - if (it1 == NULL) - return it2; - if (it2 == NULL) - return it1; - - /* Both are non-NULL: */ - return new TeeSongIterator(it1, it2); -} - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/sound/iterator/iterator.h b/engines/sci/sound/iterator/iterator.h deleted file mode 100644 index e5c8f50702..0000000000 --- a/engines/sci/sound/iterator/iterator.h +++ /dev/null @@ -1,326 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Song iterator declarations */ - -#ifndef SCI_SFX_SFX_ITERATOR_H -#define SCI_SFX_SFX_ITERATOR_H - -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/drivers/mididriver.h" - -namespace Audio { - class AudioStream; -} - -namespace Sci { - -enum SongIteratorStatus { - SI_FINISHED = -1, /**< Song finished playing */ - SI_LOOP = -2, /**< Song just looped */ - SI_ABSOLUTE_CUE = -3, /**< Found a song cue (absolute) */ - SI_RELATIVE_CUE = -4, /**< Found a song cue (relative) */ - SI_PCM = -5, /**< Found a PCM */ - SI_IGNORE = -6, /**< This event got edited out by the remapper */ - SI_MORPH = -255 /**< Song iterator requested self-morph. */ -}; - -#define FADE_ACTION_NONE 0 -#define FADE_ACTION_FADE_AND_STOP 1 -#define FADE_ACTION_FADE_AND_CONT 2 - -struct fade_params_t { - int ticks_per_step; - int final_volume; - int step_size; - int action; -}; - -/* Helper defs for messages */ -enum { - _SIMSG_BASE, /* Any base decoder */ - _SIMSG_PLASTICWRAP /* Any "Plastic" (discardable) wrapper decoder */ -}; - -/* Base messages */ -enum { - _SIMSG_BASEMSG_SET_LOOPS, /* Set loops */ - _SIMSG_BASEMSG_SET_PLAYMASK, /* Set the current playmask for filtering */ - _SIMSG_BASEMSG_SET_RHYTHM, /* Activate/deactivate rhythm channel */ - _SIMSG_BASEMSG_ACK_MORPH, /* Acknowledge self-morph */ - _SIMSG_BASEMSG_STOP, /* Stop iterator */ - _SIMSG_BASEMSG_PRINT, /* Print self to stderr, after printing param1 tabs */ - _SIMSG_BASEMSG_SET_HOLD, /* Set value of hold parameter to expect */ - _SIMSG_BASEMSG_SET_FADE /* Set fade parameters */ -}; - -/* "Plastic" (discardable) wrapper messages */ -enum { - _SIMSG_PLASTICWRAP_ACK_MORPH = _SIMSG_BASEMSG_ACK_MORPH /* Acknowledge self-morph */ -}; - -/* Messages */ -#define SIMSG_SET_LOOPS(x) _SIMSG_BASE,_SIMSG_BASEMSG_SET_LOOPS,(x) -#define SIMSG_SET_PLAYMASK(x) _SIMSG_BASE,_SIMSG_BASEMSG_SET_PLAYMASK,(x) -#define SIMSG_SET_RHYTHM(x) _SIMSG_BASE,_SIMSG_BASEMSG_SET_RHYTHM,(x) -#define SIMSG_ACK_MORPH _SIMSG_PLASTICWRAP,_SIMSG_PLASTICWRAP_ACK_MORPH,0 -#define SIMSG_STOP _SIMSG_BASE,_SIMSG_BASEMSG_STOP,0 -#define SIMSG_PRINT(indentation) _SIMSG_BASE,_SIMSG_BASEMSG_PRINT,(indentation) -#define SIMSG_SET_HOLD(x) _SIMSG_BASE,_SIMSG_BASEMSG_SET_HOLD,(x) - -/* Message transmission macro: Takes song reference, message reference */ -#define SIMSG_SEND(o, m) songit_handle_message(&(o), SongIterator::Message((o)->ID, m)) -#define SIMSG_SEND_FADE(o, m) songit_handle_message(&(o), SongIterator::Message((o)->ID, _SIMSG_BASE, _SIMSG_BASEMSG_SET_FADE, m)) - -typedef unsigned long songit_id_t; - - -#define SONGIT_MAX_LISTENERS 2 - -class TeeSongIterator; - -class SongIterator { -public: - struct Message { - songit_id_t ID; - uint _class; /* Type of iterator supposed to receive this */ - uint _type; - union { - uint i; - void *p; - } _arg; - - Message() : ID(0), _class(0xFFFF), _type(0xFFFF) {} - - /** - * Create a song iterator message. - * - * @param id: song ID the message is targeted to - * @param recipient_class: Message recipient class - * @param type message type - * @param a argument - * - * @note You should only use this with the SIMSG_* macros - */ - Message(songit_id_t id, int recipient_class, int type, int a) - : ID(id), _class(recipient_class), _type(type) { - _arg.i = a; - } - - /** - * Create a song iterator message, wherein the first parameter is a pointer. - * - * @param id: song ID the message is targeted to - * @param recipient_class: Message recipient class - * @param type message type - * @param a argument - * - * @note You should only use this with the SIMSG_* macros - */ - Message(songit_id_t id, int recipient_class, int type, void *a) - : ID(id), _class(recipient_class), _type(type) { - _arg.p = a; - } - }; - -public: - songit_id_t ID; - uint16 channel_mask; /* Bitmask of all channels this iterator will use */ - fade_params_t fade; - int priority; - - /* Death listeners */ - /* These are not reset during initialisation */ - TeeSongIterator *_deathListeners[SONGIT_MAX_LISTENERS]; - - /* See songit_* for the constructor and non-virtual member functions */ - - byte channel_remap[MIDI_CHANNELS]; ///< Remapping for channels - -public: - SongIterator(); - SongIterator(const SongIterator &); - virtual ~SongIterator(); - - /** - * Resets/initializes the sound iterator. - */ - virtual void init() {} - - /** - * Reads the next MIDI operation _or_ delta time. - * @param buf The buffer to write to (needs to be able to store at least 4 bytes) - * @param result Number of bytes written to the buffer - * (equals the number of bytes that need to be passed - * to the lower layers) for 0, the cue value for SI_CUE, - * or the number of loops remaining for SI_LOOP. - * @return zero if a MIDI operation was written, SI_FINISHED - * if the song has finished playing, SI_LOOP if looping - * (after updating the loop variable), SI_CUE if we found - * a cue, SI_PCM if a PCM was found, or the number of ticks - * to wait before this function should be called next. - * - * @note If SI_PCM is returned, get_pcm() may be used to retrieve the associated - * PCM, but this must be done before any subsequent calls to next(). - * - * @todo The actual buffer size should either be specified or passed in, so that - * we can detect buffer overruns. - */ - virtual int nextCommand(byte *buf, int *result) = 0; - - /** - Checks for the presence of a pcm sample. - * @return NULL if no PCM data was found, an AudioStream otherwise. - */ - virtual Audio::AudioStream *getAudioStream() = 0; - - /** - * Handles a message to the song iterator. - * @param msg the message to handle - * @return NULL if the message was not understood, - * this if the message could be handled, or a new song iterator - * if the current iterator had to be morphed (but the message could - * still be handled) - * - * @note This function is not supposed to be called directly; use - * songit_handle_message() instead. It should not recurse, since songit_handle_message() - * takes care of that and makes sure that its delegate received the message (and - * was morphed) before self. - */ - virtual SongIterator *handleMessage(Message msg) = 0; - - /** - * Gets the song position to store in a savegame. - */ - virtual int getTimepos() = 0; - - /** - * Clone this song iterator. - * @param delta number of ticks that still need to elapse until the - * next item should be read from the song iterator - */ - virtual SongIterator *clone(int delta) = 0; - - -private: - // Make the assignment operator unreachable, just in case... - SongIterator& operator=(const SongIterator&); -}; - - -/********************************/ -/*-- Song iterator operations --*/ -/********************************/ - -enum SongIteratorType { - SCI_SONG_ITERATOR_TYPE_SCI0 = 0, - SCI_SONG_ITERATOR_TYPE_SCI1 = 1 -}; - -#define IT_READER_MASK_MIDI (1 << 0) -#define IT_READER_MASK_DELAY (1 << 1) -#define IT_READER_MASK_LOOP (1 << 2) -#define IT_READER_MASK_CUE (1 << 3) -#define IT_READER_MASK_PCM (1 << 4) -#define IT_READER_MAY_FREE (1 << 10) /* Free SI_FINISHED iterators */ -#define IT_READER_MAY_CLEAN (1 << 11) -/* MAY_CLEAN: May instantiate cleanup iterators -** (use for players; this closes open channels at the end of a song) */ - -#define IT_READER_MASK_ALL ( IT_READER_MASK_MIDI \ - | IT_READER_MASK_DELAY \ - | IT_READER_MASK_LOOP \ - | IT_READER_MASK_CUE \ - | IT_READER_MASK_PCM ) - -/* Convenience wrapper around it->next -** Parameters: (SongIterator **it) Reference to the iterator to access -** (byte *) buf: The buffer to write to (needs to be able to -** store at least 4 bytes) -** (int) mask: IT_READER_MASK options specifying the events to -** listen for -** Returns : (int) zero if a MIDI operation was written, SI_FINISHED -** if the song has finished playing, SI_LOOP if looping -** (after updating the loop variable), SI_CUE if we found -** a cue, SI_PCM if a PCM was found, or the number of ticks -** to wait before this function should be called next. -** (int) *result: Number of bytes written to the buffer -** (equals the number of bytes that need to be passed -** to the lower layers) for 0, the cue value for SI_CUE, -** or the number of loops remaining for SI_LOOP. -*/ -int songit_next(SongIterator **it, byte *buf, int *result, int mask); - -/* Constructs a new song iterator object -** Parameters: (byte *) data: The song data to iterate over -** (uint) size: Number of bytes in the song -** (int) type: One of the SCI_SONG_ITERATOR_TYPEs -** (songit_id_t) id: An ID for addressing the song iterator -** Returns : (SongIterator *) A newly allocated but uninitialized song -** iterator, or NULL if 'type' was invalid or unsupported -*/ -SongIterator *songit_new(byte *data, uint size, SongIteratorType type, songit_id_t id); - -/* Constructs a new song timer iterator object -** Parameters: (int) delta: The delta after which to fire SI_FINISHED -** Returns : (SongIterator *) A newly allocated but uninitialized song -** iterator -*/ -SongIterator *new_timer_iterator(int delta); - -/* Handles a message to the song iterator -** Parameters: (SongIterator **): A reference to the variable storing the song iterator -** Returns : (int) Non-zero if the message was understood -** The song iterator may polymorph as result of msg, so a writeable reference is required. -*/ -int songit_handle_message(SongIterator **it_reg, SongIterator::Message msg); - - -/* Creates a new song iterator which fast-forwards -** Parameters: (SongIterator *) it: The iterator to wrap -** (int) delta: The number of ticks to skip -** Returns : (SongIterator) A newly created song iterator -** which skips all delta times -** until 'delta' has been used up -*/ -SongIterator *new_fast_forward_iterator(SongIterator *it, int delta); - -/* Combines two song iterators into one -** Parameters: (sfx_iterator_t *) it1: One of the two iterators, or NULL -** (sfx_iterator_t *) it2: The other iterator, or NULL -** Returns : (sfx_iterator_t *) A combined iterator -** If a combined iterator is returned, it will be flagged to be allowed to -** dispose of 'it1' and 'it2', where applicable. This means that this -** call should be used by song players, but not by the core sound system -*/ -SongIterator *sfx_iterator_combine(SongIterator *it1, SongIterator *it2); - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS - -#endif // SCI_SFX_SFX_ITERATOR_H diff --git a/engines/sci/sound/iterator/iterator_internal.h b/engines/sci/sound/iterator/iterator_internal.h deleted file mode 100644 index 5a0f0d3ec9..0000000000 --- a/engines/sci/sound/iterator/iterator_internal.h +++ /dev/null @@ -1,276 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_SFX_SFX_ITERATOR_INTERNAL -#define SCI_SFX_SFX_ITERATOR_INTERNAL - -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/iterator.h" -#include "sci/sound/drivers/mididriver.h" - -#include "common/array.h" -#include "common/list.h" - -namespace Sci { - -/* Iterator types */ - -enum { - SI_STATE_UNINITIALISED = -1, - SI_STATE_DELTA_TIME = 0, ///< Now at a delta time - SI_STATE_COMMAND = 1, ///< Now at a MIDI operation - SI_STATE_PENDING = 2, ///< Pending for loop - SI_STATE_FINISHED = 3, ///< End of song - SI_STATE_PCM = 4, ///< Should report a PCM next (-> DELTA_TIME) - SI_STATE_PCM_MAGIC_DELTA = 5 ///< Should report a ``magic'' one tick delta time next (goes on to FINISHED) -}; - -struct SongIteratorChannel { - - int state; ///< State of this song iterator channel - int offset; ///< Offset into the data chunk */ - int end; ///< Last allowed byte in track */ - int id; ///< Some channel ID */ - - /** - * Number of ticks before the specified channel is next used, or - * CHANNEL_DELAY_MISSING to indicate that the delay has not yet - * been read. - */ - int delay; - - /* Two additional offsets for recovering: */ - int loop_offset; - int initial_offset; - - int playmask; ///< Active playmask (MIDI channels to play in here) */ - int loop_timepos; ///< Total delay for this channel's loop marker */ - int total_timepos; ///< Number of ticks since the beginning, ignoring loops */ - int timepos_increment; ///< Number of ticks until the next command (to add) */ - - byte last_cmd; ///< Last operation executed, for running status */ - -public: - void init(int id, int offset, int end); - void resetSynthChannels(); -}; - -class BaseSongIterator : public SongIterator { -public: - int _polyphony[MIDI_CHANNELS]; ///< # of simultaneous notes on each - - int _ccc; ///< Cumulative cue counter, for those who need it - byte _resetflag; ///< for 0x4C -- on DoSound StopSound, do we return to start? - int _deviceId; ///< ID of the device we generating events for - int _numActiveChannels; ///< Number of active channels - Common::Array _data; ///< Song data - - int _loops; ///< Number of loops remaining - -public: - BaseSongIterator(byte *data, uint size, songit_id_t id); - -protected: - int parseMidiCommand(byte *buf, int *result, SongIteratorChannel *channel, int flags); - int processMidi(byte *buf, int *result, SongIteratorChannel *channel, int flags); -}; - -/********************************/ -/*--------- SCI 0 --------------*/ -/********************************/ - -class Sci0SongIterator : public BaseSongIterator { -public: - SongIteratorChannel _channel; - -public: - Sci0SongIterator(byte *data, uint size, songit_id_t id); - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream(); - SongIterator *handleMessage(Message msg); - void init(); - int getTimepos(); - SongIterator *clone(int delta); -}; - - -/********************************/ -/*--------- SCI 1 --------------*/ -/********************************/ - - -struct Sci1Sample { - /** - * Time left-- initially, this is 'Sample point 1'. - * After initialisation, it is 'sample point 1 minus the sample - * point of the previous sample' - */ - int delta; - int size; - bool announced; /* Announced for download (SI_PCM) */ - int rate; - byte *_data; -}; - -class Sci1SongIterator : public BaseSongIterator { -public: - SongIteratorChannel _channels[MIDI_CHANNELS]; - - /* Invariant: Whenever channels[i].delay == CHANNEL_DELAY_MISSING, - ** channel_offset[i] points to a delta time object. */ - - bool _initialised; /**!< Whether the MIDI channel setup has been initialised */ - int _numChannels; /**!< Number of channels actually used */ - Common::List _samples; - int _numLoopedChannels; /**!< Number of channels that are ready to loop */ - - int _delayRemaining; /**!< Number of ticks that haven't been polled yet */ - int _hold; - -public: - Sci1SongIterator(byte *data, uint size, songit_id_t id); - ~Sci1SongIterator(); - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream(); - SongIterator *handleMessage(Message msg); - void init(); - int getTimepos(); - SongIterator *clone(int delta); - -private: - int initSample(const int offset); - int initSong(); - - int getSmallestDelta() const; - - void updateDelta(int delta); - - /** Checks that none of the channels is waiting for its delta to be read */ - bool noDeltaTime() const; - - /** Determine the channel # of the next active event, or -1 */ - int getCommandIndex() const; -}; - -#define PLAYMASK_NONE 0x0 - -/***************************/ -/*--------- Timer ---------*/ -/***************************/ - -/** - * A song iterator which waits a specified time and then fires - * SI_FINISHED. Used by DoSound, where audio resources are played (SCI1) - */ -class TimerSongIterator : public SongIterator { -protected: - int _delta; /**!< Remaining time */ - -public: - TimerSongIterator(int delta) : _delta(delta) {} - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream() { return NULL; } - SongIterator *handleMessage(Message msg) { return NULL; } - int getTimepos() { return 0; } - SongIterator *clone(int delta) { return new TimerSongIterator(*this); } -}; - -/**********************************/ -/*--------- Fast Forward ---------*/ -/**********************************/ - -/** - * A song iterator which fast-forwards another iterator. - * Skips all delta times until a specified 'delta' has been used up. - */ -class FastForwardSongIterator : public SongIterator { -protected: - SongIterator *_delegate; - int _delta; /**!< Remaining time */ - -public: - FastForwardSongIterator(SongIterator *capsit, int delta); - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream(); - SongIterator *handleMessage(Message msg); - int getTimepos(); - SongIterator *clone(int delta); -}; - - -/**********************************/ -/*--------- Tee iterator ---------*/ -/**********************************/ - -enum { - TEE_LEFT = 0, - TEE_RIGHT = 1, - TEE_LEFT_ACTIVE = (1<<0), - TEE_RIGHT_ACTIVE = (1<<1), - TEE_LEFT_READY = (1<<2), /**!< left result is ready */ - TEE_RIGHT_READY = (1<<3), /**!< right result is ready */ - TEE_LEFT_PCM = (1<<4), - TEE_RIGHT_PCM = (1<<5) -}; - -/** - * This iterator combines two iterators, returns the next event available from either. - */ -class TeeSongIterator : public SongIterator { -public: - int _status; - - bool _readyToMorph; /**!< One of TEE_MORPH_* above */ - - struct { - SongIterator *it; - byte buf[4]; - int result; - int retval; - } _children[2]; - -public: - TeeSongIterator(SongIterator *left, SongIterator *right); - ~TeeSongIterator(); - - int nextCommand(byte *buf, int *result); - Audio::AudioStream *getAudioStream(); - SongIterator *handleMessage(Message msg); - void init(); - int getTimepos() { return 0; } - SongIterator *clone(int delta); -}; - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS - -#endif // SCI_SFX_SFX_ITERATOR_INTERNAL diff --git a/engines/sci/sound/iterator/songlib.cpp b/engines/sci/sound/iterator/songlib.cpp deleted file mode 100644 index 8bc2e8f476..0000000000 --- a/engines/sci/sound/iterator/songlib.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/core.h" -#include "sci/sound/iterator/iterator.h" - -namespace Sci { - -#define debug_stream stderr - -Song::Song() : _wakeupTime(0, SFX_TICKS_PER_SEC) { - _handle = 0; - _resourceNum = 0; - _priority = 0; - _status = SOUND_STATUS_STOPPED; - - _restoreBehavior = RESTORE_BEHAVIOR_CONTINUE; - _restoreTime = 0; - - _loops = 0; - _hold = 0; - - _it = 0; - _delay = 0; - - _next = NULL; - _nextPlaying = NULL; - _nextStopping = NULL; -} - -Song::Song(SongHandle handle, SongIterator *it, int priority) : _wakeupTime(0, SFX_TICKS_PER_SEC) { - _handle = handle; - _resourceNum = 0; - _priority = priority; - _status = SOUND_STATUS_STOPPED; - - _restoreBehavior = RESTORE_BEHAVIOR_CONTINUE; - _restoreTime = 0; - - _loops = 0; - _hold = 0; - - _it = it; - _delay = 0; - - _next = NULL; - _nextPlaying = NULL; - _nextStopping = NULL; -} - -void SongLibrary::addSong(Song *song) { - Song **seeker = NULL; - int pri = song->_priority; - - if (NULL == song) { - warning("addSong(): NULL passed for song"); - return; - } - - seeker = &_lib; - while (*seeker && ((*seeker)->_priority > pri)) - seeker = &((*seeker)->_next); - - song->_next = *seeker; - *seeker = song; -} - -void SongLibrary::freeSounds() { - Song *next = _lib; - while (next) { - Song *song = next; - delete song->_it; - song->_it = NULL; - next = song->_next; - delete song; - } - _lib = NULL; -} - - -Song *SongLibrary::findSong(SongHandle handle) { - Song *seeker = _lib; - - while (seeker) { - if (seeker->_handle == handle) - break; - seeker = seeker->_next; - } - - return seeker; -} - -Song *SongLibrary::findNextActive(Song *other) { - Song *seeker = other ? other->_next : _lib; - - while (seeker) { - if ((seeker->_status == SOUND_STATUS_WAITING) || - (seeker->_status == SOUND_STATUS_PLAYING)) - break; - seeker = seeker->_next; - } - - /* Only return songs that have equal priority */ - if (other && seeker && other->_priority > seeker->_priority) - return NULL; - - return seeker; -} - -Song *SongLibrary::findFirstActive() { - return findNextActive(NULL); -} - -int SongLibrary::removeSong(SongHandle handle) { - int retval; - Song *goner = _lib; - - if (!goner) - return -1; - - if (goner->_handle == handle) - _lib = goner->_next; - - else { - while ((goner->_next) && (goner->_next->_handle != handle)) - goner = goner->_next; - - if (goner->_next) { /* Found him? */ - Song *oldnext = goner->_next; - - goner->_next = goner->_next->_next; - goner = oldnext; - } else return -1; /* No. */ - } - - retval = goner->_status; - - delete goner->_it; - delete goner; - - return retval; -} - -int SongLibrary::countSongs() { - Song *seeker = _lib; - int retval = 0; - - while (seeker) { - retval++; - seeker = seeker->_next; - } - - return retval; -} - -void SongLibrary::setSongRestoreBehavior(SongHandle handle, RESTORE_BEHAVIOR action) { - Song *seeker = findSong(handle); - - seeker->_restoreBehavior = action; -} - -} // End of namespace Sci - -#endif // USE_OLD_MUSIC_FUNCTIONS diff --git a/engines/sci/sound/iterator/songlib.h b/engines/sci/sound/iterator/songlib.h deleted file mode 100644 index acb704edaa..0000000000 --- a/engines/sci/sound/iterator/songlib.h +++ /dev/null @@ -1,171 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Song library */ - -#ifndef SCI_SFX_SFX_SONGLIB_H -#define SCI_SFX_SFX_SONGLIB_H - -#include "common/scummsys.h" -#include "sound/timestamp.h" - -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS -#ifdef USE_OLD_MUSIC_FUNCTIONS - -namespace Sci { - -class SongIterator; - -#define SOUND_STATUS_STOPPED 0 -#define SOUND_STATUS_PLAYING 1 -#define SOUND_STATUS_SUSPENDED 2 -/* suspended: only if ordered from kernel space */ -#define SOUND_STATUS_WAITING 3 -/* "waiting" means "tagged for playing, but not active right now" */ - -typedef unsigned long SongHandle; - -enum RESTORE_BEHAVIOR { - RESTORE_BEHAVIOR_CONTINUE, /* restart a song when restored from - a saved game */ - RESTORE_BEHAVIOR_RESTART /* continue it from where it was */ -}; - -class Song { -public: - SongHandle _handle; - int _resourceNum; /** -#include - -using namespace Sci; - -#define ASSERT_S(x) if (!(x)) { error("Failed assertion in L%d: " #x, __LINE__); return; } -#define ASSERT(x) ASSERT_S(x) - -/* Tests the song iterators */ - -int errors = 0; - -void error(char *fmt, ...) { - va_list ap; - - fprintf(stderr, "[ERROR] "); - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - ++errors; -} - - -/* The simple iterator will finish after a fixed amount of time. Before that, -** it emits (absolute) cues in ascending order. */ -struct simple_iterator : public SongIterator { - int lifetime_remaining; - char *cues; - int cue_counter; - int cue_progress; - int cues_nr; -}; - -int simple_it_next(SongIterator *_self, unsigned char *buf, int *result) { - simple_iterator *self = (simple_iterator *)_self; - - if (self->lifetime_remaining == -1) { - error("Song iterator called post mortem"); - return SI_FINISHED; - } - - if (self->lifetime_remaining) { - - if (self->cue_counter < self->cues_nr) { - int time_to_cue = self->cues[self->cue_counter]; - - if (self->cue_progress == time_to_cue) { - ++self->cue_counter; - self->cue_progress = 0; - *result = self->cue_counter; - return SI_ABSOLUTE_CUE; - } else { - int retval = time_to_cue - self->cue_progress; - self->cue_progress = time_to_cue; - - if (retval > self->lifetime_remaining) { - retval = self->lifetime_remaining; - self->lifetime_remaining = 0; - self->cue_progress = retval; - return retval; - } - - self->lifetime_remaining -= retval; - return retval; - } - } else { - int retval = self->lifetime_remaining; - self->lifetime_remaining = 0; - return retval; - } - - } else { - self->lifetime_remaining = -1; - return SI_FINISHED; - } -} - -Audio::AudioStream *simple_it_pcm_feed(SongIterator *_self) { - error("No PCM feed"); - return NULL; -} - -void simple_it_init(SongIterator *_self) { -} - -SongIterator *simple_it_handle_message(SongIterator *_self, SongIterator::Message msg) { - return NULL; -} - -void simple_it_cleanup(SongIterator *_self) { -} - -/* Initialises the simple iterator. -** Parameters: (int) delay: Number of ticks until the iterator finishes -** (int *) cues: An array of cue delays (cue values are [1,2...]) -** (int) cues_nr: Number of cues in ``cues'' -** The first cue is emitted after cues[0] ticks, and it is 1. After cues[1] additional ticks -** the next cue is emitted, and so on. */ -SongIterator *setup_simple_iterator(int delay, char *cues, int cues_nr) { - simple_iterator.lifetime_remaining = delay; - simple_iterator.cues = cues; - simple_iterator.cue_counter = 0; - simple_iterator.cues_nr = cues_nr; - simple_iterator.cue_progress = 0; - - simple_iterator.ID = 42; - simple_iterator.channel_mask = 0x004f; - simple_iterator.flags = 0; - simple_iterator.priority = 1; - - simple_iterator.death_listeners_nr = 0; - - simple_iterator.cleanup = simple_it_cleanup; - simple_iterator.init = simple_it_init; - simple_iterator.handle_message = simple_it_handle_message; - simple_iterator.get_pcm_feed = simple_it_pcm_feed; - simple_iterator.next = simple_it_next; - - return (SongIterator *) &simple_iterator; -} - -#define ASSERT_SIT ASSERT(it == simple_it) -#define ASSERT_FFIT ASSERT(it == ff_it) -#define ASSERT_NEXT(n) ASSERT(songit_next(&it, data, &result, IT_READER_MASK_ALL) == n) -#define ASSERT_RESULT(n) ASSERT(result == n) -#define ASSERT_CUE(n) ASSERT_NEXT(SI_ABSOLUTE_CUE); ASSERT_RESULT(n) - -void test_simple_it() { - SongIterator *it; - SongIterator *simple_it = (SongIterator *) & simple_iterator; - unsigned char data[4]; - int result; - puts("[TEST] simple iterator (test artifact)"); - - it = setup_simple_iterator(42, NULL, 0); - - ASSERT_SIT; - ASSERT_NEXT(42); - ASSERT_SIT; - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, "\003\004", 2); - ASSERT_SIT; - ASSERT_NEXT(3); - ASSERT_CUE(1); - ASSERT_SIT; - ASSERT_NEXT(4); - ASSERT_CUE(2); - ASSERT_SIT; -// warning("XXX => %d", songit_next(&it, data, &result, IT_READER_MASK_ALL)); - ASSERT_NEXT(35); - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - puts("[TEST] Test OK."); -} - -void test_fastforward() { - SongIterator *it; - SongIterator *simple_it = (SongIterator *) & simple_iterator; - SongIterator *ff_it; - unsigned char data[4]; - int result; - puts("[TEST] fast-forward iterator"); - - it = setup_simple_iterator(42, NULL, 0); - ff_it = it = new_fast_forward_iterator(it, 0); - ASSERT_FFIT; - ASSERT_NEXT(42); - ASSERT_SIT; /* Must have morphed back */ - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, NULL, 0); - ff_it = it = new_fast_forward_iterator(it, 1); - ASSERT_FFIT; - ASSERT_NEXT(41); - /* May or may not have morphed back here */ - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, NULL, 0); - ff_it = it = new_fast_forward_iterator(it, 41); - ASSERT_FFIT; - ASSERT_NEXT(1); - /* May or may not have morphed back here */ - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, NULL, 0); - ff_it = it = new_fast_forward_iterator(it, 42); - ASSERT_NEXT(SI_FINISHED); - /* May or may not have morphed back here */ - - it = setup_simple_iterator(42, NULL, 0); - ff_it = it = new_fast_forward_iterator(it, 10000); - ASSERT_NEXT(SI_FINISHED); - /* May or may not have morphed back here */ - - it = setup_simple_iterator(42, "\003\004", 2); - ff_it = it = new_fast_forward_iterator(it, 2); - ASSERT_FFIT; - ASSERT_NEXT(1); - ASSERT_CUE(1); - ASSERT_SIT; - ASSERT_NEXT(4); - ASSERT_CUE(2); - ASSERT_SIT; - ASSERT_NEXT(35); - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, "\003\004", 2); - ff_it = it = new_fast_forward_iterator(it, 5); - ASSERT_FFIT; - ASSERT_CUE(1); - ASSERT_FFIT; - ASSERT_NEXT(2); - ASSERT_CUE(2); - ASSERT_SIT; - ASSERT_NEXT(35); - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - it = setup_simple_iterator(42, "\003\004", 2); - ff_it = it = new_fast_forward_iterator(it, 41); - ASSERT_FFIT; - ASSERT_CUE(1); - ASSERT_FFIT; - ASSERT_CUE(2); - ASSERT_FFIT; - ASSERT_NEXT(1); - ASSERT_NEXT(SI_FINISHED); - ASSERT_SIT; - - puts("[TEST] Test OK."); -} - -#define SIMPLE_SONG_SIZE 50 - -static unsigned char simple_song[SIMPLE_SONG_SIZE] = { - 0x00, /* Regular song */ - /* Only use channel 0 for all devices */ - 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* Song begins here */ - 42, 0x90, 60, 0x7f, /* Play C after 42 ticks */ - 02, 64, 0x42, /* Play E after 2 more ticks, using running status mode */ - 0xf8, 10, 0x80, 60, 0x02, /* Stop C after 250 ticks */ - 0, 64, 0x00, /* Stop E immediately */ - 00, 0xfc /* Stop song */ -}; - -#define ASSERT_MIDI3(cmd, arg0, arg1) \ - ASSERT(data[0] == cmd); \ - ASSERT(data[1] == arg0); \ - ASSERT(data[2] == arg1); - -void test_iterator_sci0() { - SongIterator *it = songit_new(simple_song, SIMPLE_SONG_SIZE, SCI_SONG_ITERATOR_TYPE_SCI0, 0l); - unsigned char data[4]; - int result; - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(0x0001)); /* Initialise song, enabling channel 0 */ - - puts("[TEST] SCI0-style song"); - ASSERT_NEXT(42); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 60, 0x7f); - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(250); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 60, 0x02); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - ASSERT_NEXT(SI_FINISHED); - puts("[TEST] Test OK."); -} - - - -void test_iterator_sci0_loop() { - SongIterator *it = songit_new(simple_song, SIMPLE_SONG_SIZE, SCI_SONG_ITERATOR_TYPE_SCI0, 0l); - unsigned char data[4]; - int result; - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(0x0001)); /* Initialise song, enabling channel 0 */ - SIMSG_SEND(it, SIMSG_SET_LOOPS(2)); /* Loop one additional time */ - - puts("[TEST] SCI0-style song with looping"); - ASSERT_NEXT(42); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 60, 0x7f); - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(250); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 60, 0x02); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - ASSERT_NEXT(SI_LOOP); - ASSERT_NEXT(42); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 60, 0x7f); - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(250); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 60, 0x02); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - ASSERT_NEXT(SI_FINISHED); - puts("[TEST] Test OK."); -} - - - -#define LOOP_SONG_SIZE 54 - -unsigned char loop_song[LOOP_SONG_SIZE] = { - 0x00, /* Regular song song */ - /* Only use channel 0 for all devices */ - 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* Song begins here */ - 42, 0x90, 60, 0x7f, /* Play C after 42 ticks */ - 13, 0x80, 60, 0x00, /* Stop C after 13 ticks */ - 00, 0xCF, 0x7f, /* Set loop point */ - 02, 0x90, 64, 0x42, /* Play E after 2 more ticks, using running status mode */ - 03, 0x80, 64, 0x00, /* Stop E after 3 ticks */ - 00, 0xfc /* Stop song/loop */ -}; - - -void test_iterator_sci0_mark_loop() { - SongIterator *it = songit_new(loop_song, LOOP_SONG_SIZE, SCI_SONG_ITERATOR_TYPE_SCI0, 0l); - unsigned char data[4]; - int result; - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(0x0001)); /* Initialise song, enabling channel 0 */ - SIMSG_SEND(it, SIMSG_SET_LOOPS(3)); /* Loop once more */ - - puts("[TEST] SCI0-style song with loop mark, looping"); - ASSERT_NEXT(42); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 60, 0x7f); - ASSERT_NEXT(13); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 60, 0x00); - /* Loop point here: we don't observe that in the iterator interface yet, though */ - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(3); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - /* Now we loop back to the loop pont */ - ASSERT_NEXT(SI_LOOP); - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(3); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - /* ...and one final time */ - ASSERT_NEXT(SI_LOOP); - ASSERT_NEXT(2); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x90, 64, 0x42); - ASSERT_NEXT(3); - ASSERT_NEXT(0); - ASSERT_MIDI3(0x80, 64, 0x00); - - ASSERT_NEXT(SI_FINISHED); - puts("[TEST] Test OK."); -} - - - -int main(int argc, char **argv) { - test_simple_it(); - test_fastforward(); - test_iterator_sci0(); - test_iterator_sci0_loop(); - test_iterator_sci0_mark_loop(); - if (errors != 0) - warning("[ERROR] %d errors total", errors); - return (errors != 0); -} diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index a29b6edee2..486848b48f 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -26,15 +26,11 @@ #ifndef SCI_MUSIC_H #define SCI_MUSIC_H -#ifndef USE_OLD_MUSIC_FUNCTIONS #include "common/serializer.h" -#endif #include "common/mutex.h" #include "sound/mixer.h" #include "sound/audiostream.h" -//#include "sound/mididrv.h" -//#include "sound/midiparser.h" #include "sci/sci.h" #include "sci/resource.h" @@ -55,11 +51,7 @@ enum SoundStatus { class MidiParser_SCI; class SegManager; -class MusicEntry -#ifndef USE_OLD_MUSIC_FUNCTIONS - : public Common::Serializable -#endif -{ +class MusicEntry : public Common::Serializable { public: // Do not get these directly for the sound objects! // It's a bad idea, as the sound code (i.e. the SciMusic @@ -96,9 +88,6 @@ public: Audio::Mixer::SoundType soundType; -#ifndef USE_OLD_MUSIC_FUNCTIONS -//protected: -#endif MidiParser_SCI *pMidiParser; // TODO: We need to revise how we store the different @@ -114,19 +103,13 @@ public: void doFade(); void onTimer(); -#ifndef USE_OLD_MUSIC_FUNCTIONS virtual void saveLoadWithSerializer(Common::Serializer &ser); -#endif }; typedef Common::Array MusicList; typedef Common::Array MidiCommandQueue; -class SciMusic -#ifndef USE_OLD_MUSIC_FUNCTIONS - : public Common::Serializable -#endif -{ +class SciMusic : public Common::Serializable { public: SciMusic(SciVersion soundVersion); @@ -193,9 +176,7 @@ public: void setReverb(byte reverb); -#ifndef USE_OLD_MUSIC_FUNCTIONS virtual void saveLoadWithSerializer(Common::Serializer &ser); -#endif // Mutex for music code. Used to guard access to the song playlist, to the // MIDI parser and to the MIDI driver/player. Note that guarded code must NOT diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 7cdb3e08bf..d318b1ced0 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -23,12 +23,6 @@ * */ -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - -#ifdef USE_OLD_MUSIC_FUNCTIONS -#include "sci/sound/iterator/iterator.h" // for SongIteratorStatus -#endif - #include "common/config-manager.h" #include "sci/sound/audio.h" #include "sci/sound/music.h" @@ -42,107 +36,13 @@ namespace Sci { #define SCI1_SOUND_FLAG_MAY_PAUSE 1 /* Only here for completeness; The interpreter doesn't touch this bit */ #define SCI1_SOUND_FLAG_SCRIPTED_PRI 2 /* but does touch this */ -#ifdef USE_OLD_MUSIC_FUNCTIONS -#define FROBNICATE_HANDLE(reg) ((reg).segment << 16 | (reg).offset) -#define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle & 0xffff)) -#endif - #define SOUNDCOMMAND(x) _soundCommands.push_back(new MusicEntryCommand(#x, &SoundCommandParser::x)) -#ifdef USE_OLD_MUSIC_FUNCTIONS -static void script_set_priority(ResourceManager *resMan, SegManager *segMan, SfxState *state, reg_t obj, int priority) { - int song_nr = readSelectorValue(segMan, obj, SELECTOR(number)); - Resource *song = resMan->findResource(ResourceId(kResourceTypeSound, song_nr), 0); - int flags = readSelectorValue(segMan, obj, SELECTOR(flags)); - - if (priority == -1) { - if (song->data[0] == 0xf0) - priority = song->data[1]; - else - warning("Attempt to unset song priority when there is no built-in value"); - - flags &= ~SCI1_SOUND_FLAG_SCRIPTED_PRI; - } else flags |= SCI1_SOUND_FLAG_SCRIPTED_PRI; - - state->sfx_song_renice(FROBNICATE_HANDLE(obj), priority); - writeSelectorValue(segMan, obj, SELECTOR(flags), flags); -} - -SongIterator *build_iterator(ResourceManager *resMan, int song_nr, SongIteratorType type, songit_id_t id) { - Resource *song = resMan->findResource(ResourceId(kResourceTypeSound, song_nr), 0); - - if (!song) - return NULL; - - return songit_new(song->data, song->size, type, id); -} - -void process_sound_events(EngineState *s) { /* Get all sound events, apply their changes to the heap */ - int result; - SongHandle handle; - int cue; - SegManager *segMan = s->_segMan; - - if (getSciVersion() > SCI_VERSION_01) - return; - // SCI1 and later explicitly poll for everything - - while ((result = s->_sound.sfx_poll(&handle, &cue))) { - reg_t obj = DEFROBNICATE_HANDLE(handle); - if (!s->_segMan->isObject(obj)) { - warning("Non-object %04x:%04x received sound signal (%d/%d)", PRINT_REG(obj), result, cue); - return; - } - - switch (result) { - - case SI_LOOP: - debugC(2, kDebugLevelSound, "[process-sound] Song %04x:%04x looped (to %d)", - PRINT_REG(obj), cue); - /* writeSelectorValue(segMan, obj, SELECTOR(loops), readSelectorValue(segMan, obj, SELECTOR(loop));; - 1);*/ - writeSelectorValue(segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - break; - - case SI_RELATIVE_CUE: - debugC(2, kDebugLevelSound, "[process-sound] Song %04x:%04x received relative cue %d", - PRINT_REG(obj), cue); - writeSelectorValue(segMan, obj, SELECTOR(signal), cue + 0x7f); - break; - - case SI_ABSOLUTE_CUE: - debugC(2, kDebugLevelSound, "[process-sound] Song %04x:%04x received absolute cue %d", - PRINT_REG(obj), cue); - writeSelectorValue(segMan, obj, SELECTOR(signal), cue); - break; - - case SI_FINISHED: - debugC(2, kDebugLevelSound, "[process-sound] Song %04x:%04x finished", - PRINT_REG(obj)); - writeSelectorValue(segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - writeSelectorValue(segMan, obj, SELECTOR(state), kSoundStopped); - break; - - default: - warning("Unexpected result from sfx_poll: %d", result); - break; - } - } -} - -#endif SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion) : _resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - // The following hack is needed to ease the change from old to new sound - // code (because the new sound code does not use SfxState) - _state = &g_sci->getEngineState()->_sound; // HACK -#endif - - #ifndef USE_OLD_MUSIC_FUNCTIONS - _music = new SciMusic(_soundVersion); - _music->init(); - #endif + _music = new SciMusic(_soundVersion); + _music->init(); switch (_soundVersion) { case SCI_VERSION_0_EARLY: @@ -215,9 +115,7 @@ SoundCommandParser::~SoundCommandParser() { for (SoundCommandContainer::iterator i = _soundCommands.begin(); i != _soundCommands.end(); ++i) delete *i; -#ifndef USE_OLD_MUSIC_FUNCTIONS delete _music; -#endif } reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { @@ -261,40 +159,6 @@ void SoundCommandParser::cmdInitSound(reg_t obj, int16 value) { int resourceId = readSelectorValue(_segMan, obj, SELECTOR(number)); -#ifdef USE_OLD_MUSIC_FUNCTIONS - - SongHandle handle = FROBNICATE_HANDLE(obj); - - if (_soundVersion != SCI_VERSION_1_LATE) { - if (!obj.segment) - return; - } - - SongIteratorType type = (_soundVersion <= SCI_VERSION_0_LATE) ? SCI_SONG_ITERATOR_TYPE_SCI0 : SCI_SONG_ITERATOR_TYPE_SCI1; - - if (_soundVersion <= SCI_VERSION_0_LATE) { - if (readSelectorValue(_segMan, obj, SELECTOR(nodePtr))) { - _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - _state->sfx_remove_song(handle); - } - } - - if (!obj.segment || !_resMan->testResource(ResourceId(kResourceTypeSound, resourceId))) - return; - - _state->sfx_add_song(build_iterator(_resMan, resourceId, type, handle), 0, handle, resourceId); - - - // Notify the engine - if (_soundVersion <= SCI_VERSION_0_LATE) - writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundInitialized); - else - writeSelector(_segMan, obj, SELECTOR(nodePtr), obj); - - writeSelector(_segMan, obj, SELECTOR(handle), obj); - -#else - // Check if a track with the same sound object is already playing MusicEntry *oldSound = _music->getSlot(obj); if (oldSound) @@ -342,84 +206,12 @@ void SoundCommandParser::cmdInitSound(reg_t obj, int16 value) { writeSelector(_segMan, obj, SELECTOR(handle), obj); } -#endif - } void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - - if (_soundVersion <= SCI_VERSION_0_LATE) { - _state->sfx_song_set_status(handle, SOUND_STATUS_PLAYING); - _state->sfx_song_set_loops(handle, readSelectorValue(_segMan, obj, SELECTOR(loop))); - writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundPlaying); - } else if (_soundVersion == SCI_VERSION_1_EARLY) { - _state->sfx_song_set_status(handle, SOUND_STATUS_PLAYING); - _state->sfx_song_set_loops(handle, readSelectorValue(_segMan, obj, SELECTOR(loop))); - _state->sfx_song_renice(handle, readSelectorValue(_segMan, obj, SELECTOR(pri))); - RESTORE_BEHAVIOR rb = (RESTORE_BEHAVIOR) value; /* Too lazy to look up a default value for this */ - _state->_songlib.setSongRestoreBehavior(handle, rb); - writeSelectorValue(_segMan, obj, SELECTOR(signal), 0); - } else if (_soundVersion == SCI_VERSION_1_LATE) { - int looping = readSelectorValue(_segMan, obj, SELECTOR(loop)); - //int vol = readSelectorValue(_segMan, obj, SELECTOR(vol)); - int pri = readSelectorValue(_segMan, obj, SELECTOR(pri)); - int sampleLen = 0; - Song *song = _state->_songlib.findSong(handle); - int songNumber = readSelectorValue(_segMan, obj, SELECTOR(number)); - - if (readSelectorValue(_segMan, obj, SELECTOR(nodePtr)) && (song && songNumber != song->_resourceNum)) { - _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - _state->sfx_remove_song(handle); - writeSelector(_segMan, obj, SELECTOR(nodePtr), NULL_REG); - } - - if (!readSelectorValue(_segMan, obj, SELECTOR(nodePtr)) && obj.segment) { - // In SCI1.1 games, sound effects are started from here. If we can - // find a relevant audio resource, play it, otherwise switch to - // synthesized effects. If the resource exists, play it using map - // 65535 (sound effects map). - if (_resMan->testResource(ResourceId(kResourceTypeAudio, songNumber)) && - getSciVersion() >= SCI_VERSION_1_1) { - // Found a relevant audio resource, play it - _audio->stopAudio(); - warning("Initializing audio resource instead of requested sound resource %d", songNumber); - sampleLen = _audio->startAudio(65535, songNumber); - // Also create iterator, that will fire SI_FINISHED event, when - // the sound is done playing. - _state->sfx_add_song(new_timer_iterator(sampleLen), 0, handle, songNumber); - } else { - if (!_resMan->testResource(ResourceId(kResourceTypeSound, songNumber))) { - warning("Could not open song number %d", songNumber); - // Send a "stop handle" event so that the engine won't wait - // forever here. - _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - return; - } - debugC(2, kDebugLevelSound, "Initializing song number %d", songNumber); - _state->sfx_add_song(build_iterator(_resMan, songNumber, SCI_SONG_ITERATOR_TYPE_SCI1, - handle), 0, handle, songNumber); - } - - writeSelector(_segMan, obj, SELECTOR(nodePtr), obj); - writeSelector(_segMan, obj, SELECTOR(handle), obj); - } - - if (obj.segment) { - _state->sfx_song_set_status(handle, SOUND_STATUS_PLAYING); - _state->sfx_song_set_loops(handle, looping); - _state->sfx_song_renice(handle, pri); - writeSelectorValue(_segMan, obj, SELECTOR(signal), 0); - } - } - -#else - MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdPlaySound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -456,43 +248,16 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { musicSlot->loop, musicSlot->priority, musicSlot->volume); _music->soundPlay(musicSlot); - -#endif - } void SoundCommandParser::cmdDummy(reg_t obj, int16 value) { warning("cmdDummy invoked"); // not supposed to occur } -#ifdef USE_OLD_MUSIC_FUNCTIONS -void SoundCommandParser::changeSoundStatus(reg_t obj, int newStatus) { - SongHandle handle = FROBNICATE_HANDLE(obj); - if (obj.segment) { - _state->sfx_song_set_status(handle, newStatus); - if (_soundVersion <= SCI_VERSION_0_LATE) - writeSelectorValue(_segMan, obj, SELECTOR(state), newStatus); - } -} -#endif - void SoundCommandParser::cmdDisposeSound(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - changeSoundStatus(obj, SOUND_STATUS_STOPPED); - - if (obj.segment) { - _state->sfx_remove_song(handle); - - if (_soundVersion <= SCI_VERSION_0_LATE) - writeSelectorValue(_segMan, obj, SELECTOR(handle), 0x0000); - } - -#else - MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdDisposeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -507,7 +272,6 @@ void SoundCommandParser::cmdDisposeSound(reg_t obj, int16 value) { writeSelector(_segMan, obj, SELECTOR(nodePtr), NULL_REG); else writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundStopped); -#endif } void SoundCommandParser::cmdStopSound(reg_t obj, int16 value) { @@ -518,12 +282,6 @@ void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFin if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - changeSoundStatus(obj, SOUND_STATUS_STOPPED); - - if (_soundVersion >= SCI_VERSION_1_EARLY) - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdStopSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -549,20 +307,9 @@ void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFin musicSlot->dataInc = 0; musicSlot->signal = 0; _music->soundStop(musicSlot); -#endif } void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (!obj.segment) - return; - - if (_soundVersion <= SCI_VERSION_0_LATE) - changeSoundStatus(obj, SOUND_STATUS_SUSPENDED); - else - changeSoundStatus(obj, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING); -#else - if (!obj.segment) { // pause the whole playlist // Pausing/Resuming the whole playlist was introduced in the SCI1 late // sound scheme. @@ -585,8 +332,6 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) { _music->soundToggle(musicSlot, value); } } - -#endif } void SoundCommandParser::cmdResumeSound(reg_t obj, int16 value) { @@ -595,9 +340,6 @@ void SoundCommandParser::cmdResumeSound(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - changeSoundStatus(obj, SOUND_STATUS_PLAYING); -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdResumeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -606,24 +348,15 @@ void SoundCommandParser::cmdResumeSound(reg_t obj, int16 value) { writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPlaying); _music->soundResume(musicSlot); -#endif } void SoundCommandParser::cmdMuteSound(reg_t obj, int16 value) { -#ifndef USE_OLD_MUSIC_FUNCTIONS if (_argc > 1) // the first parameter is the sound command _music->soundSetSoundOn(obj.toUint16()); _acc = make_reg(0, _music->soundGetSoundOn()); -#endif } void SoundCommandParser::cmdMasterVolume(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - _acc = make_reg(0, _state->sfx_getVolume()); - - if (obj != SIGNAL_REG) - _state->sfx_setVolume(obj.toSint16()); -#else debugC(2, kDebugLevelSound, "cmdMasterVolume: %d", value); _acc = make_reg(0, _music->soundGetMasterVolume()); @@ -634,44 +367,12 @@ void SoundCommandParser::cmdMasterVolume(reg_t obj, int16 value) { ConfMan.setInt("sfx_volume", vol); g_engine->syncSoundSettings(); } -#endif } void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - if (_soundVersion != SCI_VERSION_1_LATE) { - /* FIXME: The next couple of lines actually STOP the handle, rather - ** than fading it! */ - _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - if (_soundVersion <= SCI_VERSION_0_LATE) - writeSelectorValue(_segMan, obj, SELECTOR(state), SOUND_STATUS_STOPPED); - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - } else { - fade_params_t fade; - fade.final_volume = _argv[2].toUint16(); - fade.ticks_per_step = _argv[3].toUint16(); - fade.step_size = _argv[4].toUint16(); - fade.action = _argv[5].toUint16() ? - FADE_ACTION_FADE_AND_STOP : - FADE_ACTION_FADE_AND_CONT; - - _state->sfx_song_set_fade(handle, &fade); - - /* FIXME: The next couple of lines actually STOP the handle, rather - ** than fading it! */ - if (_argv[5].toUint16()) { - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - _state->sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - } else { - // FIXME: Support fade-and-continue. For now, send signal right away. - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - } - } -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdFadeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -711,28 +412,16 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { } debugC(2, kDebugLevelSound, "cmdFadeSound: to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); -#endif } void SoundCommandParser::cmdGetPolyphony(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - _acc = make_reg(0, _state->sfx_get_player_polyphony()); -#else _acc = make_reg(0, _music->soundGetVoices()); // Get the number of voices -#endif } void SoundCommandParser::cmdUpdateSound(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - if (_soundVersion <= SCI_VERSION_0_LATE && obj.segment) { - _state->sfx_song_set_loops(handle, readSelectorValue(_segMan, obj, SELECTOR(loop))); - script_set_priority(_resMan, _segMan, _state, obj, readSelectorValue(_segMan, obj, SELECTOR(pri))); - } -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdUpdateSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -746,85 +435,12 @@ void SoundCommandParser::cmdUpdateSound(reg_t obj, int16 value) { uint32 objPrio = readSelectorValue(_segMan, obj, SELECTOR(pri)); if (objPrio != musicSlot->priority) _music->soundSetPriority(musicSlot, objPrio); - -#endif } void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - int signal = 0; - int min = 0; - int sec = 0; - int frame = 0; - int result = SI_LOOP; // small hack - SongHandle handle = FROBNICATE_HANDLE(obj); - - while (result == SI_LOOP) - result = _state->sfx_poll_specific(handle, &signal); - - switch (result) { - case SI_ABSOLUTE_CUE: - debugC(2, kDebugLevelSound, "--- [CUE] %04x:%04x Absolute Cue: %d", - PRINT_REG(obj), signal); - debugC(2, kDebugLevelSound, "abs-signal %04X", signal); - writeSelectorValue(_segMan, obj, SELECTOR(signal), signal); - break; - - case SI_RELATIVE_CUE: - debugC(2, kDebugLevelSound, "--- [CUE] %04x:%04x Relative Cue: %d", - PRINT_REG(obj), signal); - - /* FIXME to match commented-out semantics - * below, with proper storage of dataInc and - * signal in the iterator code. */ - writeSelectorValue(_segMan, obj, SELECTOR(dataInc), signal); - debugC(2, kDebugLevelSound, "rel-signal %04X", signal); - if (_soundVersion == SCI_VERSION_1_EARLY) - writeSelectorValue(_segMan, obj, SELECTOR(signal), signal); - else - writeSelectorValue(_segMan, obj, SELECTOR(signal), signal + 127); - break; - - case SI_FINISHED: - debugC(2, kDebugLevelSound, "--- [FINISHED] %04x:%04x", PRINT_REG(obj)); - writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - break; - - case SI_LOOP: - break; // Doesn't happen - } - - //switch (signal) { - //case 0x00: - // if (dataInc != readSelectorValue(segMan, obj, SELECTOR(dataInc))) { - // writeSelectorValue(segMan, obj, SELECTOR(dataInc), dataInc); - // writeSelectorValue(segMan, obj, SELECTOR(signal), dataInc+0x7f); - // } else { - // writeSelectorValue(segMan, obj, SELECTOR(signal), signal); - // } - // break; - //case 0xFF: // May be unnecessary - // s->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED); - // break; - //default : - // if (dataInc != readSelectorValue(segMan, obj, SELECTOR(dataInc))) { - // writeSelectorValue(segMan, obj, SELECTOR(dataInc), dataInc); - // writeSelectorValue(segMan, obj, SELECTOR(signal), dataInc + 0x7f); - // } else { - // writeSelectorValue(segMan, obj, SELECTOR(signal), signal); - // } - // break; - //} - - if (_soundVersion == SCI_VERSION_1_EARLY) { - writeSelectorValue(_segMan, obj, SELECTOR(min), min); - writeSelectorValue(_segMan, obj, SELECTOR(sec), sec); - writeSelectorValue(_segMan, obj, SELECTOR(frame), frame); - } -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdUpdateCues: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -900,15 +516,9 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { writeSelectorValue(_segMan, obj, SELECTOR(sec), musicSlot->ticker % 3600 / 60); writeSelectorValue(_segMan, obj, SELECTOR(frame), musicSlot->ticker); } - -#endif } void SoundCommandParser::cmdSendMidi(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - //SongHandle handle = FROBNICATE_HANDLE(obj); - //_state->sfx_send_midi(handle, value, _midiCmd, _controller, _param); -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // TODO: maybe it's possible to call this with obj == 0:0 and send directly?! @@ -918,20 +528,13 @@ void SoundCommandParser::cmdSendMidi(reg_t obj, int16 value) { return; } _music->sendMidiCommand(musicSlot, _midiCommand); -#endif } void SoundCommandParser::cmdReverb(reg_t obj, int16 value) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->setReverb(obj.toUint16() & 0xF); -#endif } void SoundCommandParser::cmdSetSoundHold(reg_t obj, int16 value) { -#ifdef USE_OLD_MUSIC_FUNCTIONS - SongHandle handle = FROBNICATE_HANDLE(obj); - _state->sfx_song_set_hold(handle, value); -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdSetSoundHold: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -940,7 +543,6 @@ void SoundCommandParser::cmdSetSoundHold(reg_t obj, int16 value) { // Set the special hold marker ID where the song should be looped at. musicSlot->hold = value; -#endif } void SoundCommandParser::cmdGetAudioCapability(reg_t obj, int16 value) { @@ -949,7 +551,6 @@ void SoundCommandParser::cmdGetAudioCapability(reg_t obj, int16 value) { } void SoundCommandParser::cmdStopAllSounds(reg_t obj, int16 value) { -#ifndef USE_OLD_MUSIC_FUNCTIONS Common::StackLock(_music->_mutex); const MusicList::iterator end = _music->getPlayListEnd(); @@ -964,14 +565,12 @@ void SoundCommandParser::cmdStopAllSounds(reg_t obj, int16 value) { (*i)->dataInc = 0; _music->soundStop(*i); } -#endif } void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { if (!obj.segment) return; -#ifndef USE_OLD_MUSIC_FUNCTIONS MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // Do not throw a warning if the sound can't be found, as in some games @@ -991,16 +590,12 @@ void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { _music->soundSetVolume(musicSlot, value); writeSelectorValue(_segMan, obj, SELECTOR(vol), value); } -#endif } void SoundCommandParser::cmdSetSoundPriority(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - script_set_priority(_resMan, _segMan, _state, obj, value); -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdSetSoundPriority: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -1024,19 +619,12 @@ void SoundCommandParser::cmdSetSoundPriority(reg_t obj, int16 value) { writeSelectorValue(_segMan, obj, SELECTOR(flags), readSelectorValue(_segMan, obj, SELECTOR(flags)) | 2); //DoSOund(0xF,hobj,w) } -#endif } void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { if (!obj.segment) return; -#ifdef USE_OLD_MUSIC_FUNCTIONS - if (!readSelector(_segMan, obj, SELECTOR(nodePtr)).isNull()) { - SongHandle handle = FROBNICATE_HANDLE(obj); - _state->sfx_song_set_loops(handle, value); - } -#else MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // Apparently, it's perfectly normal for a game to call cmdSetSoundLoop @@ -1058,7 +646,6 @@ void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { } writeSelectorValue(_segMan, obj, SELECTOR(loop), musicSlot->loop); -#endif } void SoundCommandParser::cmdSuspendSound(reg_t obj, int16 value) { @@ -1066,8 +653,6 @@ void SoundCommandParser::cmdSuspendSound(reg_t obj, int16 value) { warning("STUB: cmdSuspendSound"); } -#ifndef USE_OLD_MUSIC_FUNCTIONS - void SoundCommandParser::updateSci0Cues() { bool noOnePlaying = true; MusicEntry *pWaitingForPlay = NULL; @@ -1101,34 +686,23 @@ void SoundCommandParser::updateSci0Cues() { } } -#endif - void SoundCommandParser::clearPlayList() { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->clearPlayList(); -#endif } void SoundCommandParser::printPlayList(Console *con) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->printPlayList(con); -#endif } void SoundCommandParser::printSongInfo(reg_t obj, Console *con) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->printSongInfo(obj, con); -#endif } void SoundCommandParser::stopAllSounds() { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->stopAll(); -#endif } void SoundCommandParser::startNewSound(int number) { -#ifndef USE_OLD_MUSIC_FUNCTIONS Common::StackLock lock(_music->_mutex); // Overwrite the first sound in the playlist @@ -1138,19 +712,14 @@ void SoundCommandParser::startNewSound(int number) { writeSelectorValue(_segMan, soundObj, SELECTOR(number), number); cmdInitSound(soundObj, 0); cmdPlaySound(soundObj, 0); -#endif } void SoundCommandParser::setMasterVolume(int vol) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->soundSetMasterVolume(vol); -#endif } void SoundCommandParser::pauseAll(bool pause) { -#ifndef USE_OLD_MUSIC_FUNCTIONS _music->pauseAll(pause); -#endif } } // End of namespace Sci diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h index 09cca23450..d1a81462fe 100644 --- a/engines/sci/sound/soundcmd.h +++ b/engines/sci/sound/soundcmd.h @@ -26,8 +26,6 @@ #ifndef SCI_SOUNDCMD_H #define SCI_SOUNDCMD_H -#include "sci/sci.h" // for USE_OLD_MUSIC_FUNCTIONS - #include "common/list.h" #include "sci/engine/state.h" @@ -53,10 +51,6 @@ public: kMaxSciVolume = 15 }; -#ifdef USE_OLD_MUSIC_FUNCTIONS - void updateSfxState(SfxState *newState) { _state = newState; } -#endif - reg_t parseCommand(int argc, reg_t *argv, reg_t acc); // Functions used for game state loading @@ -76,7 +70,6 @@ public: void printPlayList(Console *con); void printSongInfo(reg_t obj, Console *con); -#ifndef USE_OLD_MUSIC_FUNCTIONS /** * Synchronizes the current state of the music list to the rest of the engine, so that * the changes that the sound thread makes to the music are registered with the engine @@ -85,7 +78,6 @@ public: * by the engine scripts themselves, so the engine itself polls for changes to the music */ void updateSci0Cues(); -#endif private: typedef Common::Array SoundCommandContainer; @@ -93,12 +85,7 @@ private: ResourceManager *_resMan; SegManager *_segMan; Kernel *_kernel; -#ifdef USE_OLD_MUSIC_FUNCTIONS - SfxState *_state; - int _midiCmd, _controller, _param; -#else SciMusic *_music; -#endif AudioPlayer *_audio; SciVersion _soundVersion; int _argc; @@ -131,10 +118,6 @@ private: void cmdSuspendSound(reg_t obj, int16 value); void processStopSound(reg_t obj, int16 value, bool sampleFinishedPlaying); - -#ifdef USE_OLD_MUSIC_FUNCTIONS - void changeSoundStatus(reg_t obj, int newStatus); -#endif }; } // End of namespace Sci -- cgit v1.2.3 From 4e999c8295adeade2317d9c486b943d3fd290c2c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 14:26:47 +0000 Subject: SCI: support for hires views in gk1 svn-id: r50533 --- engines/sci/graphics/frameout.cpp | 35 +++++++++++++++++++++++++++++++---- engines/sci/graphics/view.cpp | 9 +++++++++ engines/sci/graphics/view.h | 5 +++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 446db82566..48a7742f14 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -128,6 +128,8 @@ void GfxFrameout::kernelFrameout() { // Allocate enough space for all screen items FrameoutEntry *itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); + const SciGameId gameId = g_sci->getGameId(); + for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { reg_t planeObject = *it; uint16 planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); @@ -189,6 +191,14 @@ void GfxFrameout::kernelFrameout() { itemEntry->y = readSelectorValue(_segMan, itemObject, SELECTOR(y)); itemEntry->z = readSelectorValue(_segMan, itemObject, SELECTOR(z)); itemEntry->priority = readSelectorValue(_segMan, itemObject, SELECTOR(priority)); + if (gameId == GID_GK1) { + if ((itemEntry->viewId == 11000) && (itemEntry->loopNo == 0) && (itemEntry->celNo == 0) && (itemEntry->priority == 1)) { + itemEntry->priority = 0; // HACK for gk1 hires main menu + } + if ((itemEntry->viewId == 10100) && (itemEntry->priority == 0)) { + itemEntry->priority = 1; // HACK for gk1 hires main menu + } + } itemEntry->signal = readSelectorValue(_segMan, itemObject, SELECTOR(signal)); itemEntry->scaleX = readSelectorValue(_segMan, itemObject, SELECTOR(scaleX)); itemEntry->scaleY = readSelectorValue(_segMan, itemObject, SELECTOR(scaleY)); @@ -228,23 +238,40 @@ void GfxFrameout::kernelFrameout() { if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); else view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); - if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= _screen->getHeight()) + int16 screenHeight = _screen->getHeight(); + int16 screenWidth = _screen->getWidth(); + if (view->isSci2Hires()) { + screenHeight = _screen->getDisplayHeight(); + screenWidth = _screen->getDisplayWidth(); + } + + if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= screenHeight) continue; - if (itemEntry->celRect.left < 0 || itemEntry->celRect.left >= _screen->getWidth()) + if (itemEntry->celRect.left < 0 || itemEntry->celRect.left >= screenWidth) continue; Common::Rect clipRect; clipRect = itemEntry->celRect; - clipRect.clip(planeRect); + if (view->isSci2Hires()) { + Common::Rect upscaledPlaneRect = planeRect; + _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.top, upscaledPlaneRect.left); + _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.bottom, upscaledPlaneRect.right); + clipRect.clip(upscaledPlaneRect); + } else { + clipRect.clip(planeRect); + } if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) - view->draw(itemEntry->celRect, clipRect, clipRect, itemEntry->loopNo, itemEntry->celNo, 255, 0, false); + view->draw(itemEntry->celRect, clipRect, clipRect, itemEntry->loopNo, itemEntry->celNo, 255, 0, view->isSci2Hires()); else view->drawScaled(itemEntry->celRect, clipRect, clipRect, itemEntry->loopNo, itemEntry->celNo, 255, itemEntry->scaleX, itemEntry->scaleY); } else { diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 244114e866..816dad0cbb 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -81,6 +81,7 @@ void GfxView::initData(GuiResourceId resourceId) { _loopCount = 0; _embeddedPal = false; _EGAmapping = NULL; + _isSci2Hires = false; // If we find an SCI1/SCI1.1 view (not amiga), we switch to that type for // EGA. This could get used to make view patches for EGA games, where the @@ -191,6 +192,7 @@ void GfxView::initData(GuiResourceId resourceId) { assert(headerSize >= 16); _loopCount = _resourceData[2]; assert(_loopCount); + _isSci2Hires = _resourceData[5] == 1 ? true : false; palOffset = READ_SCI11ENDIAN_UINT32(_resourceData + 8); // FIXME: After LoopCount there is another byte and its set for view 50 // within Laura Bow 2 CD, check what it means. @@ -240,6 +242,9 @@ void GfxView::initData(GuiResourceId resourceId) { cel->offsetEGA = 0; cel->offsetRLE = READ_SCI11ENDIAN_UINT32(celData + 24); cel->offsetLiteral = READ_SCI11ENDIAN_UINT32(celData + 28); + // GK1-hires content is actually uncompressed, we need to swap both so that we process it as such + if ((cel->offsetRLE) && (!cel->offsetLiteral)) + SWAP(cel->offsetRLE, cel->offsetLiteral); cel->rawBitmap = 0; if (_loop[loopNo].mirrorFlag) @@ -288,6 +293,10 @@ Palette *GfxView::getPalette() { return _embeddedPal ? &_viewPalette : NULL; } +bool GfxView::isSci2Hires() { + return _isSci2Hires; +} + void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const { const CelInfo *celInfo = getCelInfo(loopNo, celNo); outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index 93239e7586..6eb1830b99 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -73,6 +73,8 @@ public: uint16 getCelCount(int16 loopNo) const; Palette *getPalette(); + bool isSci2Hires(); + private: void initData(GuiResourceId resourceId); void unpackCel(int16 loopNo, int16 celNo, byte *outPtr, uint32 pixelCount); @@ -92,6 +94,9 @@ private: bool _embeddedPal; Palette _viewPalette; + // set for SCI2 views in gk1/windows, means that views are hires and should be handled accordingly + bool _isSci2Hires; + byte *_EGAmapping; }; -- cgit v1.2.3 From 04d8ac41142de7f1a3a732073d1e236c0192f533 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 14:39:03 +0000 Subject: SCI: removing sq1 workaround for kUnLoad for now, maybe it was originally meant for calling kUnLoad with just 1 argument svn-id: r50534 --- engines/sci/engine/kernel.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ec3cdc5106..b0c369605e 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -206,12 +206,6 @@ static const char *s_defaultKernelNames[] = { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) -// gameID, scriptNr,lvl, object-name, method-name, call,index,replace -static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_SQ1, 998, 0, "View", "delete", -1, 0, { 1, 0 } }, // exiting ulence flats bar - slotGuyBody::dispose calls view::delete resulting in parameter 1 to be a reference - SCI_WORKAROUNDENTRY_TERMINATOR -}; - // gameID, scriptNr,lvl, object-name, method-name, call,index,replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard @@ -252,7 +246,8 @@ struct SciKernelMapEntry { // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "iRi*", NULL, kUnLoad_workarounds }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "iRi*", NULL, NULL }, + // ^^ - in SQ1 when leaving ulence flats bar, kUnLoad is called with just one argument (FIXME?) { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "ii*", NULL, kDisposeScript_workarounds }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, -- cgit v1.2.3 From bcc010a56e6e58baf1f19f829802e1dbaad83f60 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 15:26:45 +0000 Subject: SCI: remove some duplicate code svn-id: r50535 --- engines/sci/graphics/view.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 816dad0cbb..93df45820c 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -265,15 +265,11 @@ GuiResourceId GfxView::getResourceId() const { } int16 GfxView::getWidth(int16 loopNo, int16 celNo) const { - loopNo = CLIP(loopNo, 0, _loopCount - 1); - celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); - return _loopCount ? _loop[loopNo].cel[celNo].width : 0; + return _loopCount ? getCelInfo(loopNo, celNo)->width : 0; } int16 GfxView::getHeight(int16 loopNo, int16 celNo) const { - loopNo = CLIP(loopNo, 0, _loopCount - 1); - celNo = CLIP(celNo, 0, _loop[loopNo].celCount - 1); - return _loopCount ? _loop[loopNo].cel[celNo].height : 0; + return _loopCount ? getCelInfo(loopNo, celNo)->height : 0; } const CelInfo *GfxView::getCelInfo(int16 loopNo, int16 celNo) const { -- cgit v1.2.3 From 1287e6f252296d4c3fef58b080c4ae2fdef40a73 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 30 Jun 2010 15:44:26 +0000 Subject: SCI: adjust brRect and nsRect, if sci2 hires views are used, fixes hotspots in gk1 svn-id: r50536 --- engines/sci/graphics/compare.cpp | 19 ++++++++++++++++++- engines/sci/graphics/cursor.cpp | 17 ++--------------- engines/sci/graphics/screen.cpp | 18 ++++++++++++++++++ engines/sci/graphics/screen.h | 1 + 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 7cd55b1139..31c2b210ce 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -130,10 +130,18 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { if (SELECTOR(z) > -1) z = (int16)readSelectorValue(_segMan, objectReference, SELECTOR(z)); - // now get cel rectangle view = _cache->getView(viewId); + + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(y, x); + view->getCelRect(loopNo, celNo, x, y, z, celRect); + if (view->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); + _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + } + if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) { writeSelectorValue(_segMan, objectReference, SELECTOR(nsLeft), celRect.left); writeSelectorValue(_segMan, objectReference, SELECTOR(nsRight), celRect.right); @@ -200,7 +208,16 @@ void GfxCompare::kernelBaseSetter(reg_t object) { GfxView *tmpView = _cache->getView(viewId); Common::Rect celRect; + if (tmpView->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(y, x); + tmpView->getCelRect(loopNo, celNo, x, y, z, celRect); + + if (tmpView->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); + _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + } + celRect.bottom = y + 1; celRect.top = celRect.bottom - yStep; diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index 23c41c4c87..e1c05c97da 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -276,21 +276,8 @@ void GfxCursor::setPosition(Common::Point pos) { Common::Point GfxCursor::getPosition() { Common::Point mousePos = g_system->getEventManager()->getMousePos(); - switch (_upscaledHires) { - case GFX_SCREEN_UPSCALED_640x400: - mousePos.x /= 2; - mousePos.y /= 2; - break; - case GFX_SCREEN_UPSCALED_640x440: - mousePos.x /= 2; - mousePos.y = (mousePos.y * 5) / 11; - break; - case GFX_SCREEN_UPSCALED_640x480: - mousePos.x /= 2; - mousePos.y = (mousePos.y * 5) / 12; - default: - break; - } + if (_upscaledHires) + _screen->adjustBackUpscaledCoordinates(mousePos.y, mousePos.x); return mousePos; } diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 053372bdac..c446a98768 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -617,6 +617,24 @@ void GfxScreen::adjustToUpscaledCoordinates(int16 &y, int16 &x) { y = _upscaledMapping[y]; } +void GfxScreen::adjustBackUpscaledCoordinates(int16 &y, int16 &x) { + switch (_upscaledHires) { + case GFX_SCREEN_UPSCALED_640x400: + x /= 2; + y /= 2; + break; + case GFX_SCREEN_UPSCALED_640x440: + x /= 2; + y = (y * 5) / 11; + break; + case GFX_SCREEN_UPSCALED_640x480: + x /= 2; + y = (y * 5) / 12; + default: + break; + } +} + int16 GfxScreen::kernelPicNotValid(int16 newPicNotValid) { int16 oldPicNotValid; diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 03dfd3529c..113cf911a6 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -112,6 +112,7 @@ public: void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight); void adjustToUpscaledCoordinates(int16 &y, int16 &x); + void adjustBackUpscaledCoordinates(int16 &y, int16 &x); void dither(bool addToFlag); void debugUnditherSetState(bool flag); -- cgit v1.2.3 From b85fd471a6f64f7f291c7b52e6061b99a26714e9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 17:36:52 +0000 Subject: Added support for kAddAfter with 4 parameters (used in Torin's Passage, for example) svn-id: r50537 --- engines/sci/engine/klists.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 4f8087539b..8e9ec6dccd 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -271,9 +271,8 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - if (argc == 4) // Torin's Passage - // TODO: Find out what the 4th parameter is - warning("kAddAfter with 4 params called, 4th param is %04x:%04x", PRINT_REG(argv[3])); + if (argc == 4) + newnode->key = argv[3]; if (firstnode) { // We're really appending after reg_t oldnext = firstnode->succ; -- cgit v1.2.3 From 3cd5821085817cece98365a28d24aa35a5749689 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 30 Jun 2010 17:47:44 +0000 Subject: SCI: Silenced a warning about a non game breaking script bug in Castle of Dr. Brain, room 360 svn-id: r50538 --- engines/sci/engine/vm.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 48f17d34de..87ff985461 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -605,6 +605,9 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == GID_QFG1) { // QFG1VGA has a script bug in the longSong object when invoking the // loop selector, which doesn't affect gameplay, thus don't diplay it + } else if (!strcmp(objectName, "PuzPiece") && selector == 77 && g_sci->getGameId() == GID_CASTLEBRAIN) { + // Castle of Dr. Brain has a script bug in the PuzPiece object when invoking + // the value selector, which doesn't affect gameplay, thus don't display it } else { // Unknown script bug, show it. Usually these aren't fatal. reg_t oldReg = *varp.getPointer(s->_segMan); -- cgit v1.2.3 From 31df21be75532e44c7b616eaecc4300b07dfec0e Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 30 Jun 2010 22:27:34 +0000 Subject: Commit improved italian translation. Also update the template file and all the other translation files (there is quite a lot of line numbers that have changed). svn-id: r50540 --- common/messages.cpp | 54 +++++++------- po/ca_ES.po | 156 ++++++++++++++++++++-------------------- po/de_DE.po | 170 ++++++++++++++++++++++---------------------- po/fr_FR.po | 156 ++++++++++++++++++++-------------------- po/hu_HU.po | 156 ++++++++++++++++++++-------------------- po/it_IT.po | 200 ++++++++++++++++++++++++++-------------------------- po/ru_RU.po | 156 ++++++++++++++++++++-------------------- po/scummvm.pot | 156 ++++++++++++++++++++-------------------- 8 files changed, 604 insertions(+), 600 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 15d8356873..758cc71ae9 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -323,7 +323,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -640,7 +640,7 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -957,7 +957,7 @@ static const PoMessageEntry _translation_fr_FR[] = { }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-27 18:20+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -982,7 +982,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 22, "Tasto associato: %s" }, { 23, "Tasto associato: nessuno" }, { 24, "Audio" }, - { 25, "Salvataggio automatico:" }, + { 25, "Autosalva:" }, { 26, "Motori disponibili:" }, { 27, "~I~nfo..." }, { 28, "Associa tasti" }, @@ -1020,7 +1020,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 60, "Mostra tastiera" }, { 61, "Sei sicuro di voler eliminare questo salvataggio?" }, { 62, "Sei sicuro di voler rimuovere questa configurazione di gioco?" }, - { 63, "Voui davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." }, + { 63, "Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." }, { 64, "Vuoi caricare o salvare il gioco?" }, { 65, "Vuoi eseguire una scansione automatica?" }, { 66, "Sei sicuro di voler uscire?" }, @@ -1031,7 +1031,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 71, "Inglese" }, { 72, "Errore nell'esecuzione del gioco:" }, { 73, "Errore nel montare il DVD" }, - { 74, "Percorso aggiuntivo:" }, + { 74, "Percorso extra:" }, { 75, "Emulatore FM Towns" }, { 76, "Modalit\340 veloce" }, { 77, "Funzionalit\340 compilate in:" }, @@ -1042,17 +1042,17 @@ static const PoMessageEntry _translation_it_IT[] = { { 82, "Sensibilit\340 pad GC:" }, { 83, "Grafica" }, { 84, "Dispositivo GM:" }, - { 85, "Lingua dell'interfaccia:" }, - { 86, "Renderer interfaccia grafica:" }, + { 85, "Lingua GUI:" }, + { 86, "Renderer GUI:" }, { 87, "Gioco" }, { 88, "Dati di gioco non trovati" }, { 89, "ID di gioco non supportato" }, - { 90, "Percorso del gioco:" }, + { 90, "Percorso gioco:" }, { 91, "Menu globale" }, { 92, "Vai alla cartella superiore" }, { 93, "Cartella superiore" }, { 94, "Grafica" }, - { 95, "Modalit\340 grafica:" }, + { 95, "Modalit\340:" }, { 96, "Ridimensionamento hardware (veloce, ma di bassa qualit\340)" }, { 97, "Hercules ambra" }, { 98, "Hercules verde" }, @@ -1064,7 +1064,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 104, "Emulatore IBM PCjr" }, { 105, "ID:" }, { 106, "Avvia rete" }, - { 107, "Ridimensiona schermo in primo piano:" }, + { 107, "Schermo in primo piano:" }, { 108, "Avvio in corso dell'emulatore MT-32" }, { 109, "Avvio rete in corso" }, { 110, "Input" }, @@ -1085,10 +1085,10 @@ static const PoMessageEntry _translation_it_IT[] = { { 125, "MIDI" }, { 126, "Guadagno MIDI:" }, { 127, "Emulatore MT-32" }, - { 128, "Dispositivo MT32:" }, - { 129, "Ridimensiona schermo principale:" }, + { 128, "Disposit. MT32:" }, + { 129, "Schermo principale:" }, { 130, "Mappa" }, - { 131, "Aggiungi in massa..." }, + { 131, "Agg. in massa..." }, { 132, "Menu" }, { 133, "Varie" }, { 134, "Modalit\340 mista AdLib/MIDI" }, @@ -1107,12 +1107,12 @@ static const PoMessageEntry _translation_it_IT[] = { { 147, "No" }, { 148, "Nessuna data salvata" }, { 149, "Nessuna musica" }, - { 150, "Nessun tempo di gioco salvato" }, + { 150, "Nessun tempo salvato" }, { 151, "Nessun orario salvato" }, { 152, "Nessuno" }, { 153, "Normale (nessun ridimensionamento)" }, { 154, "OK" }, - { 155, "Frequenza output:" }, + { 155, "Frequenza:" }, { 156, "Ignora le impostazioni MIDI globali" }, { 157, "Ignora le impostazioni audio globali" }, { 158, "Ignora le impostazioni grafiche globali" }, @@ -1129,8 +1129,8 @@ static const PoMessageEntry _translation_it_IT[] = { { 169, "Piattaforma:" }, { 170, "Tempo di gioco: " }, { 171, "Seleziona un'azione" }, - { 172, "Percorso dei plugin:" }, - { 173, "Dispositivo preferito:" }, + { 172, "Percorso plugin:" }, + { 173, "Disp. preferito:" }, { 174, "Premi il tasto da associare" }, { 175, "Esci" }, { 176, "Chiudi ScummVM" }, @@ -1138,7 +1138,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 178, "Lettura fallita" }, { 179, "Riprogramma tasti" }, { 180, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, - { 181, "Modalit\340 resa grafica:" }, + { 181, "Resa grafica:" }, { 182, "Destra" }, { 183, "Clic destro" }, { 184, "Clic destro" }, @@ -1146,8 +1146,8 @@ static const PoMessageEntry _translation_it_IT[] = { { 186, "Volume effetti:" }, { 187, "SMB" }, { 188, "Salva" }, - { 189, "Percorso di salvataggio:" }, - { 190, "Percorso di salvataggio: " }, + { 189, "Salvataggi:" }, + { 190, "Salvataggi:" }, { 191, "Salva gioco:" }, { 192, "Scansione completa!" }, { 193, "%d cartelle analizzate..." }, @@ -1199,13 +1199,13 @@ static const PoMessageEntry _translation_it_IT[] = { { 239, "Esegue il gioco selezionato" }, { 240, "Stato:" }, { 241, "Sub" }, - { 242, "Velocit\340 sottotitoli:" }, + { 242, "Velocit\340 testo:" }, { 243, "Sottotitoli" }, { 244, "Cambia personaggio" }, { 245, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, { 246, "Testo e voci:" }, { 247, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, - { 248, "Percorso del tema:" }, + { 248, "Percorso tema:" }, { 249, "Tema:" }, { 250, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, { 251, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, @@ -1264,7 +1264,7 @@ static const PoMessageEntry _translation_it_IT[] = { { 304, "C~h~iudi" }, { 305, "~R~imuovi gioco" }, { 306, "~R~ipristina" }, - { 307, "Ri~t~orna alla schermata di avvio" }, + { 307, "~V~ai a schermata di avvio" }, { 308, "~S~alva" }, { 309, "~G~ioca" }, { 310, "~T~ransizioni attive" }, @@ -1274,7 +1274,7 @@ static const PoMessageEntry _translation_it_IT[] = { }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1585,7 +1585,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-27 23:36+0300\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1642,7 +1642,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-26 20:02+0200\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, diff --git a/po/ca_ES.po b/po/ca_ES.po index 0ae34ca484..c158163ced 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Torna al nivell de directoris anterior" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mapeja" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -138,7 +138,7 @@ msgstr "" "Anglès" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -151,11 +151,11 @@ msgstr "Plataforma:" msgid "Platform the game was originally designed for" msgstr "Plataforma per la que el joc es va dissenyar originalment" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "Gràfics" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "GFX" @@ -163,7 +163,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Fer canvis sobre les opcions globals de gràfics" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "Àudio" @@ -171,7 +171,7 @@ msgstr " msgid "Override global audio settings" msgstr "Fer canvis sobre les opcions globals d'àudio" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "Volum" @@ -179,7 +179,7 @@ msgstr "Volum" msgid "Override global volume settings" msgstr "Fer canvis sobre les opcions globals de volum" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "MIDI" @@ -187,7 +187,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Fer canvis sobre les opcions globals de MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "Camins" @@ -195,7 +195,7 @@ msgstr "Camins" msgid "Game Path:" msgstr "Camí del Joc:" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "Camí Extra:" @@ -207,18 +207,18 @@ msgstr "Especifica el cam msgid "Save Path:" msgstr "Camí de les Partides:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "Especifica on es desaran les partides" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "Cap" @@ -227,7 +227,7 @@ msgstr "Cap" msgid "Default" msgstr "Per defecte" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "Seleccioneu el fitxer SoundFont" @@ -322,7 +322,7 @@ msgstr "Cerca a la llista de jocs" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "Neteja el valor" @@ -456,74 +456,74 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "Mode gràfic:" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "Mode de pintat:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "Modes de dispersió especials suportats per alguns jocs" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "Mode pantalla completa" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "Correcció del rati d'aspecte" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregeix la relació d'aspecte per jocs de 320x200" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "Dispositiu Preferit:" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "Dispositiu MT32:" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" "LAPC1/CM32l/CM64" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "Dispositiu GM:" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida General MIDI" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "Emulador d'AdLib:" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "AdLib s'utilitza per la música de molts jocs" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "Freqüència de sortida:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +531,27 @@ msgstr "" "Valors més alts especifiquen millor qualitat de so però pot ser que la " "vostra tarja de so no ho suporti" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "Fitxer SoundFont:" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "Mode combinat AdLib/MIDI" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilitza MIDI i la generació de so AdLib alhora" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,145 +559,145 @@ msgstr "" "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " "compatible amb Roland connectat al vostre ordinador" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "Activa el Mode Roland GS" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a " "Roland MT-32" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "Guany MIDI:" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "Veus" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "Subtítols" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "Veus" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "Mostra els subtítols i reprodueix la veu" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "Velocitat dels subtítols:" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "Volum de la música:" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "Silenciar tot" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "Volum dels efectes:" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "Volum dels sons d'efectes especials" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "Volum de la veu:" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "Camí de les Partides: " -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "Camí dels Temes:" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especifica el camí de les dades addicionals utilitzades per tots els jocs o " "pel ScummVM" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "Camí dels connectors:" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "Misc" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "Mode de pintat de la interfície d'usuari:" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "Desat automàtic:" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "Tecles" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "Idioma de la interfície d'usuari:" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfície d'usuari de ScummVM" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "Anglès" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte." -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "Seleccioneu el directori de les partides desades" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un " "altre." -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "Seleccioneu el directori dels fitxers extra" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "Seleccioneu el directori dels connectors" diff --git a/po/de_DE.po b/po/de_DE.po index a17db689cf..ca49b776b0 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-26 20:02+0200\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: 2010-06-23 19:30+0100\n" "Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" -"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 @@ -42,7 +42,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:989 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -73,7 +73,7 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:990 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -142,7 +142,7 @@ msgstr "" "Spiels in eine deutsche verwandeln." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:623 gui/options.cpp:633 gui/options.cpp:960 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -155,11 +155,11 @@ msgstr "Plattform:" msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:867 gui/options.cpp:884 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "GFX" @@ -167,7 +167,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:890 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "Audio" @@ -175,7 +175,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:894 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "Lautstärke" @@ -183,7 +183,7 @@ msgstr "Lautst msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:902 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "MIDI" @@ -191,7 +191,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:908 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "Pfade" @@ -199,7 +199,7 @@ msgstr "Pfade" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:921 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "Extrapfad:" @@ -211,18 +211,18 @@ msgstr "Legt das Verzeichnis f msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:915 -#: gui/options.cpp:916 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:406 gui/options.cpp:492 -#: gui/options.cpp:551 gui/options.cpp:712 gui/options.cpp:919 -#: gui/options.cpp:922 gui/options.cpp:926 gui/options.cpp:1013 -#: gui/options.cpp:1019 gui/options.cpp:1025 gui/options.cpp:1033 -#: gui/options.cpp:1057 gui/options.cpp:1061 gui/options.cpp:1067 -#: gui/options.cpp:1074 gui/options.cpp:1173 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "-" @@ -231,7 +231,7 @@ msgstr "-" msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:391 gui/options.cpp:1167 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -325,7 +325,7 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:713 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "Wert löschen" @@ -459,74 +459,78 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:620 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:631 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "Render-Modus:" -#: gui/options.cpp:631 gui/options.cpp:632 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:641 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:644 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:644 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:651 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "Bevorzugtes Gerät:" -#: gui/options.cpp:651 +#: gui/options.cpp:659 #, fuzzy msgid "Specifies preferred sound device or sound card emulator" -msgstr "Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." +msgstr "" +"Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:652 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:654 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "MT32-Gerät:" -#: gui/options.cpp:654 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." +msgstr "" +"Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/" +"LAPC1/CM32l/CM64 fest." -#: gui/options.cpp:656 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "GM-Gerät:" -#: gui/options.cpp:656 +#: gui/options.cpp:664 #, fuzzy msgid "Specifies default sound device for General MIDI output" -msgstr "Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." +msgstr "" +"Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." -#: gui/options.cpp:688 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:688 gui/options.cpp:689 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:699 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:699 gui/options.cpp:700 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -534,28 +538,28 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:711 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:711 gui/options.cpp:712 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:716 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:716 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:719 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:719 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -563,145 +567,145 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:722 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:722 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:725 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:738 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:743 gui/options.cpp:749 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:744 gui/options.cpp:750 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:745 gui/options.cpp:751 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "Beides" -#: gui/options.cpp:749 +#: gui/options.cpp:757 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:750 +#: gui/options.cpp:758 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:751 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:755 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:767 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:774 +#: gui/options.cpp:782 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:777 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:777 gui/options.cpp:778 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:784 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:915 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "Spielstände: " -#: gui/options.cpp:918 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:921 gui/options.cpp:922 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:925 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:930 +#: gui/options.cpp:938 msgid "Misc" msgstr "Sonstiges" -#: gui/options.cpp:932 +#: gui/options.cpp:940 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:936 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:942 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:950 +#: gui/options.cpp:958 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:957 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:957 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:962 +#: gui/options.cpp:970 msgid "English" msgstr "English" -#: gui/options.cpp:1106 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1119 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1126 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1135 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1145 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1156 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -987,7 +991,7 @@ msgstr " (Global)" msgid " (Game)" msgstr " (Spiel)" -#: backends/midi/windows.cpp:156 +#: backends/midi/windows.cpp:157 msgid "Windows MIDI" msgstr "Windows MIDI" diff --git a/po/fr_FR.po b/po/fr_FR.po index 70d073820d..f2ff18cb3d 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: 2010-06-27 17:47+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +70,7 @@ msgid "Map" msgstr "Affecter" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -139,7 +139,7 @@ msgstr "" "espagnole du jeu." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -152,11 +152,11 @@ msgstr "Plateforme:" msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "GFX" @@ -164,7 +164,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "Audio" @@ -172,7 +172,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifiques à ce jeux" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "Volume" @@ -180,7 +180,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "MIDI" @@ -188,7 +188,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "Chemins" @@ -196,7 +196,7 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "Extra:" @@ -208,18 +208,18 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "Aucun" @@ -228,7 +228,7 @@ msgstr "Aucun" msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "Choisir une banque de sons" @@ -321,7 +321,7 @@ msgstr "Recherche dans la liste de jeux" msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "Effacer la valeur" @@ -455,75 +455,75 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "Périphérique Préféré:" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " "préféré" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "Périphérique MT32:" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "Périphérique GM:" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,29 +531,29 @@ msgstr "" "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " "être supporté par votre carte son" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " "Timidity" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -561,144 +561,144 @@ msgstr "" "Vérifie si vous voulez utiliser un périphérique audio compatible Roland " "connecté à l'ordinateur" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Spécifie un chemin vers des données supplémentaires utilisées par tous les " "jeux ou ScummVM" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "Anglais" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "" "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " "répertoire." -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" diff --git a/po/hu_HU.po b/po/hu_HU.po index 6e3d8b4950..ad2194421c 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +70,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -135,7 +135,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -148,11 +148,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "" @@ -160,7 +160,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "Hang" @@ -168,7 +168,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "Volumene" @@ -176,7 +176,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "Ösvények" @@ -193,7 +193,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -206,18 +206,18 @@ msgstr "" msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "Semmi" @@ -227,7 +227,7 @@ msgstr "Semmi" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "" @@ -319,7 +319,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "" @@ -451,237 +451,237 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "" -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po index 8f27007d89..e6b7f3c299 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" -"PO-Revision-Date: 2010-06-27 18:20+0100\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"PO-Revision-Date: 2010-06-30 23:56+0100\n" "Last-Translator: Maff \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Vai alla cartella superiore" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mappa" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -137,7 +137,7 @@ msgstr "" "Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -150,11 +150,11 @@ msgstr "Piattaforma:" msgid "Platform the game was originally designed for" msgstr "La piattaforma per la quale il gioco è stato concepito" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "Grafica" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "Grafica" @@ -162,7 +162,7 @@ msgstr "Grafica" msgid "Override global graphic settings" msgstr "Ignora le impostazioni grafiche globali" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "Audio" @@ -170,7 +170,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Ignora le impostazioni audio globali" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "Volume" @@ -178,7 +178,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Ignora le impostazioni globali di volume" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "MIDI" @@ -186,17 +186,17 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ignora le impostazioni MIDI globali" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "Percorsi" #: gui/launcher.cpp:250 msgid "Game Path:" -msgstr "Percorso del gioco:" +msgstr "Percorso gioco:" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" -msgstr "Percorso aggiuntivo:" +msgstr "Percorso extra:" #: gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" @@ -204,20 +204,20 @@ msgstr "Specifica il percorso di ulteriori dati usati dal gioco" #: gui/launcher.cpp:258 msgid "Save Path:" -msgstr "Percorso di salvataggio:" +msgstr "Salvataggi:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "Specifica dove archiviare i salvataggi" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "Nessuno" @@ -226,7 +226,7 @@ msgstr "Nessuno" msgid "Default" msgstr "Predefinito" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "Seleziona SoundFont" @@ -318,7 +318,7 @@ msgstr "Cerca nella lista dei giochi" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "Cancella" @@ -337,7 +337,7 @@ msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." msgstr "" -"Voui davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere " +"Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere " "un numero enorme di giochi." #: gui/launcher.cpp:661 gui/launcher.cpp:810 @@ -386,7 +386,7 @@ msgstr "" #: gui/launcher.cpp:989 msgid "Mass Add..." -msgstr "Aggiungi in massa..." +msgstr "Agg. in massa..." #: gui/launcher.cpp:990 msgid "Add Game..." @@ -455,75 +455,75 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" -msgstr "Modalità grafica:" +msgstr "Modalità:" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" -msgstr "Modalità resa grafica:" +msgstr "Resa grafica:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "Modalità a schermo intero" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "Correzione proporzioni" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregge le proporzioni dei giochi 320x200" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" -msgstr "Dispositivo preferito:" +msgstr "Disp. preferito:" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "" "Specifica il dispositivo di output audio o l'emulatore della scheda audio" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" -msgstr "Dispositivo MT32:" +msgstr "Disposit. MT32:" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "Emulatore AdLib:" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "AdLib è utilizzato per la musica in molti giochi" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" -msgstr "Frequenza output:" +msgstr "Frequenza:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +531,27 @@ msgstr "" "Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " "essere supportati dalla tua scheda audio" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "Modalità mista AdLib/MIDI" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilizza generazione di suono sia MIDI che AdLib" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,141 +559,141 @@ msgstr "" "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " "che è connesso al tuo computer" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "Attiva la modalità Roland GS" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland " "MT-32" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "Guadagno MIDI:" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "Voci" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "Sottotitoli" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "Entrambi" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "Voci" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "Sub" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "Mostra i sottotitoli e attiva le voci" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" -msgstr "Velocità sottotitoli:" +msgstr "Velocità testo:" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "Disattiva audio" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "Volume degli effetti sonori" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " -msgstr "Percorso di salvataggio: " +msgstr "Salvataggi:" -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" -msgstr "Percorso del tema:" +msgstr "Percorso tema:" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" -msgstr "Percorso dei plugin:" +msgstr "Percorso plugin:" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "Varie" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" -msgstr "Renderer interfaccia grafica:" +msgstr "Renderer GUI:" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" -msgstr "Salvataggio automatico:" +msgstr "Autosalva:" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "Tasti" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" -msgstr "Lingua dell'interfaccia:" +msgstr "Lingua GUI:" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "Lingua dell'interfaccia grafica di ScummVM" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "Inglese" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "Seleziona la cartella per i salvataggi" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra." -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "Seleziona la cartella dei temi dell'interfaccia" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "Seleziona la cartella dei file aggiuntivi" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "Seleziona la cartella dei plugin" @@ -707,7 +707,7 @@ msgstr "Nessun orario salvato" #: gui/saveload.cpp:62 gui/saveload.cpp:243 msgid "No playtime saved" -msgstr "Nessun tempo di gioco salvato" +msgstr "Nessun tempo salvato" #: gui/saveload.cpp:69 gui/saveload.cpp:157 msgid "Delete" @@ -868,7 +868,7 @@ msgstr "~I~nfo" #: engines/dialogs.cpp:109 msgid "~R~eturn to Launcher" -msgstr "Ri~t~orna alla schermata di avvio" +msgstr "~V~ai a schermata di avvio" #: engines/dialogs.cpp:119 msgid "Save game:" @@ -1019,11 +1019,11 @@ msgstr "Sensibilit #: backends/platform/ds/arm9/source/dsoptions.cpp:99 msgid "Initial top screen scale:" -msgstr "Ridimensiona schermo in primo piano:" +msgstr "Schermo in primo piano:" #: backends/platform/ds/arm9/source/dsoptions.cpp:105 msgid "Main screen scaling:" -msgstr "Ridimensiona schermo principale:" +msgstr "Schermo principale:" #: backends/platform/ds/arm9/source/dsoptions.cpp:107 msgid "Hardware scale (fast, but low quality)" diff --git a/po/ru_RU.po b/po/ru_RU.po index 41a0033c60..d251f6c5b8 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -40,7 +40,7 @@ msgid "Go to previous directory level" msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -71,7 +71,7 @@ msgid "Map" msgstr "½Ð×ÝÐçØâì" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -140,7 +140,7 @@ msgstr "" "àãááÚãî" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "<ßÞ ãÜÞÛçÐÝØî>" @@ -153,11 +153,11 @@ msgstr " msgid "Platform the game was originally designed for" msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "³àÐäØÚÐ" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "³àä" @@ -165,7 +165,7 @@ msgstr " msgid "Override global graphic settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "°ãÔØÞ" @@ -173,7 +173,7 @@ msgstr " msgid "Override global audio settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "³àÞÜÚÞáâì" @@ -181,7 +181,7 @@ msgstr " msgid "Override global volume settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "MIDI" @@ -189,7 +189,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "¿ãâØ" @@ -197,7 +197,7 @@ msgstr " msgid "Game Path:" msgstr "¿ãâì Ú ØÓàÕ: " -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "´Þß. ßãâì:" @@ -209,18 +209,18 @@ msgstr " msgid "Save Path:" msgstr "¿ãâì áÞåà.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "½Õ ×ÐÔÐÝ" @@ -229,7 +229,7 @@ msgstr " msgid "Default" msgstr "¿Þ ãÜÞÛçÐÝØî" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "²ëÑÕàØâÕ SoundFont" @@ -321,7 +321,7 @@ msgstr " msgid "Search:" msgstr "¿ÞØáÚ:" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ" @@ -454,73 +454,73 @@ msgstr "44 Ú³ msgid "48 kHz" msgstr "48 Ú³æ" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "³àÐäØçÕáÚØÙ àÕÖØÜ:" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "ÀÕÖØÜ àÐáâàØàÞÒÐÝØï:" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "¿àÕÔßÞçØâÐÕÜÞÕ ãáâàÞÙáâÒÞ:" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "ÃáâàÞÙáâÒÞ MT32:" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "ÃáâàÞÙâáÒÞ GM:" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "ÍÜãÛïâÞà AdLib:" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "²ëåÞÔÝÐï çÐáâÞâÐ:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -528,29 +528,29 @@ msgstr "" "±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ " "ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontë ßÞÔÔÕàÔÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø " "Timidity" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -558,142 +558,142 @@ msgstr "" "¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë " "åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "²ëÚÛîçÐÕâ ÜÐßߨÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "ÃáØÛÕÝØÕ MIDI:" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "ÁãÑâØâàë" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "²áñ" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "¾×Ò" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "ÁãÑ" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "ÁÚÞàÞáâì áãÑâØâàÞÒ:" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "³àÞÜÚÞáâì Üã×ëÚØ:" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "²ëÚÛîçØâì Òáñ" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "³àÞÜÚÞáâì íääÕÚâÞÒ:" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "³àÞÜÚÞáâì Þ×ÒãçÚØ:" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "¿ãâì ÔÛï áÞåàÐÝÕÝØÙ: " -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "¿ãâì Ú âÕÜÐÜ:" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, " "ÛØÑÞ ScummVM" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "ÂÕÜÐ:" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "ºÛÐÒØèØ" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "Ï×ëÚ ØÝâÕàäÕÙáÐ:" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "English" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï." -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî." -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ" diff --git a/po/scummvm.pot b/po/scummvm.pot index 212910f28f..6fddf25d55 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-27 23:36+0300\n" +"POT-Creation-Date: 2010-06-30 23:20+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:995 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:996 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -134,7 +134,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:629 gui/options.cpp:639 gui/options.cpp:966 +#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 #: sound/null.cpp:42 msgid "" msgstr "" @@ -147,11 +147,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:873 gui/options.cpp:890 +#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 msgid "GFX" msgstr "" @@ -159,7 +159,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:896 +#: gui/launcher.cpp:213 gui/options.cpp:898 msgid "Audio" msgstr "" @@ -167,7 +167,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:900 +#: gui/launcher.cpp:223 gui/options.cpp:902 msgid "Volume" msgstr "" @@ -175,7 +175,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:908 +#: gui/launcher.cpp:232 gui/options.cpp:910 msgid "MIDI" msgstr "" @@ -183,7 +183,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:914 +#: gui/launcher.cpp:244 gui/options.cpp:916 msgid "Paths" msgstr "" @@ -191,7 +191,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:927 +#: gui/launcher.cpp:254 gui/options.cpp:929 msgid "Extra Path:" msgstr "" @@ -203,18 +203,18 @@ msgstr "" msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:921 -#: gui/options.cpp:922 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 +#: gui/options.cpp:924 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:412 gui/options.cpp:498 -#: gui/options.cpp:557 gui/options.cpp:718 gui/options.cpp:925 -#: gui/options.cpp:928 gui/options.cpp:932 gui/options.cpp:1019 -#: gui/options.cpp:1025 gui/options.cpp:1031 gui/options.cpp:1039 -#: gui/options.cpp:1063 gui/options.cpp:1067 gui/options.cpp:1073 -#: gui/options.cpp:1080 gui/options.cpp:1179 +#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 +#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 +#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 +#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 +#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 +#: gui/options.cpp:1082 gui/options.cpp:1181 msgid "None" msgstr "" @@ -223,7 +223,7 @@ msgstr "" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1173 +#: gui/launcher.cpp:391 gui/options.cpp:1175 msgid "Select SoundFont" msgstr "" @@ -315,7 +315,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:719 +#: gui/launcher.cpp:529 gui/options.cpp:721 msgid "Clear value" msgstr "" @@ -446,235 +446,235 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:626 +#: gui/options.cpp:628 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:637 +#: gui/options.cpp:639 msgid "Render mode:" msgstr "" -#: gui/options.cpp:637 gui/options.cpp:638 +#: gui/options.cpp:639 gui/options.cpp:640 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:647 +#: gui/options.cpp:649 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:650 +#: gui/options.cpp:652 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:657 +#: gui/options.cpp:659 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:658 +#: gui/options.cpp:660 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:662 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "GM Device:" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:664 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:694 +#: gui/options.cpp:696 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:694 gui/options.cpp:695 +#: gui/options.cpp:696 gui/options.cpp:697 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:707 msgid "Output rate:" msgstr "" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:707 gui/options.cpp:708 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:717 +#: gui/options.cpp:719 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:717 gui/options.cpp:718 +#: gui/options.cpp:719 gui/options.cpp:720 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:722 +#: gui/options.cpp:724 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:725 +#: gui/options.cpp:727 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:728 +#: gui/options.cpp:730 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:731 +#: gui/options.cpp:733 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:744 +#: gui/options.cpp:746 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:749 gui/options.cpp:755 +#: gui/options.cpp:751 gui/options.cpp:757 msgid "Speech" msgstr "" -#: gui/options.cpp:750 gui/options.cpp:756 +#: gui/options.cpp:752 gui/options.cpp:758 msgid "Subtitles" msgstr "" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:753 gui/options.cpp:759 msgid "Both" msgstr "" -#: gui/options.cpp:755 +#: gui/options.cpp:757 msgid "Spch" msgstr "" -#: gui/options.cpp:756 +#: gui/options.cpp:758 msgid "Subs" msgstr "" -#: gui/options.cpp:757 +#: gui/options.cpp:759 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:761 +#: gui/options.cpp:763 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:773 +#: gui/options.cpp:775 msgid "Music volume:" msgstr "" -#: gui/options.cpp:780 +#: gui/options.cpp:782 msgid "Mute All" msgstr "" -#: gui/options.cpp:783 +#: gui/options.cpp:785 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:783 gui/options.cpp:784 +#: gui/options.cpp:785 gui/options.cpp:786 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:790 +#: gui/options.cpp:792 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:921 +#: gui/options.cpp:923 msgid "Save Path: " msgstr "" -#: gui/options.cpp:924 +#: gui/options.cpp:926 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:927 gui/options.cpp:928 +#: gui/options.cpp:929 gui/options.cpp:930 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:931 +#: gui/options.cpp:933 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:936 +#: gui/options.cpp:938 msgid "Misc" msgstr "" -#: gui/options.cpp:938 +#: gui/options.cpp:940 msgid "Theme:" msgstr "" -#: gui/options.cpp:942 +#: gui/options.cpp:944 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:948 +#: gui/options.cpp:950 msgid "Autosave:" msgstr "" -#: gui/options.cpp:956 +#: gui/options.cpp:958 msgid "Keys" msgstr "" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:963 +#: gui/options.cpp:965 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:968 +#: gui/options.cpp:970 msgid "English" msgstr "" -#: gui/options.cpp:1112 +#: gui/options.cpp:1114 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1125 +#: gui/options.cpp:1127 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1132 +#: gui/options.cpp:1134 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1141 +#: gui/options.cpp:1143 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1151 +#: gui/options.cpp:1153 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1162 +#: gui/options.cpp:1164 msgid "Select directory for plugins" msgstr "" -- cgit v1.2.3 From b0b4f34d276b3451d6d46ac29cab6f5166cea757 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 05:33:51 +0000 Subject: Added a workaround for an uninitialized temp read in KQ6 floppy, when opening the controls window - from bug report #3023602 svn-id: r50541 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 87ff985461..e7e16e5a35 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -351,6 +351,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is + { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller -- cgit v1.2.3 From b45d2cd92b137dc429f12f67b887a193f601afb2 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Thu, 1 Jul 2010 07:10:40 +0000 Subject: Implement playing RAW/MP3/OGG/FLAC dubbing from ZIP archives. Playing works well, but I am not enabling it in the game player yet, because I have not implemented measuring the time duration of compressed dubbing, which is needed in the (exclusively used) blocking mode. svn-id: r50543 --- engines/draci/sound.cpp | 157 +++++++++++++++++++++++++++++++++++++++++++----- engines/draci/sound.h | 78 ++++++++++++++++++++---- 2 files changed, 209 insertions(+), 26 deletions(-) diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index 65e7e41ac4..e430da7bdc 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -23,11 +23,13 @@ * */ +#include "common/archive.h" #include "common/config-manager.h" #include "common/debug.h" #include "common/file.h" #include "common/str.h" #include "common/stream.h" +#include "common/unzip.h" #include "draci/sound.h" #include "draci/draci.h" @@ -36,14 +38,17 @@ #include "sound/audiostream.h" #include "sound/mixer.h" #include "sound/decoders/raw.h" +#include "sound/decoders/mp3.h" +#include "sound/decoders/vorbis.h" +#include "sound/decoders/flac.h" namespace Draci { -void LegacySoundArchive::openArchive(const Common::String &path) { +void LegacySoundArchive::openArchive(const char *path) { // Close previously opened archive (if any) closeArchive(); - debugCN(2, kDraciArchiverDebugLevel, "Loading samples %s: ", path.c_str()); + debugCN(2, kDraciArchiverDebugLevel, "Loading samples %s: ", path); _f = new Common::File(); _f->open(path); @@ -83,7 +88,6 @@ void LegacySoundArchive::openArchive(const Common::String &path) { _samples[i]._offset = sampleStarts[i]; _samples[i]._length = sampleStarts[i+1] - sampleStarts[i]; _samples[i]._frequency = 0; // set in getSample() - _samples[i]._data = NULL; } if (_samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length != totalLength && _samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length - _samples[0]._offset != totalLength) { @@ -144,25 +148,106 @@ SoundSample *LegacySoundArchive::getSample(int i, uint freq) { } debugCN(2, kDraciArchiverDebugLevel, "Accessing sample %d from archive %s... ", - i, _path.c_str()); + i, _path); // Check if file has already been opened and return that if (_samples[i]._data) { - debugC(2, kDraciArchiverDebugLevel, "Success"); + debugC(2, kDraciArchiverDebugLevel, "Cached"); } else { + // It would be nice to unify the approach with ZipSoundArchive + // and allocate a MemoryReadStream with buffer stored inside it + // that playSoundBuffer() would just play. Unfortunately, + // streams are not thread-safe and the same sample couldn't + // thus be played more than once at the same time (this holds + // even if we create a SeekableSubReadStream from it as this + // just uses the parent). The only thread-safe solution is to + // share a read-only buffer and allocate separate + // MemoryReadStream's on top of it. + _samples[i]._data = new byte[_samples[i]._length]; + _samples[i]._format = RAW; + // Read in the file (without the file header) _f->seek(_samples[i]._offset); - _samples[i]._data = new byte[_samples[i]._length]; _f->read(_samples[i]._data, _samples[i]._length); - debugC(3, kDraciArchiverDebugLevel, "Cached sample %d from archive %s", - i, _path.c_str()); + debugC(3, kDraciArchiverDebugLevel, "Read sample %d from archive %s", + i, _path); } _samples[i]._frequency = freq ? freq : _defaultFreq; return _samples + i; } +void ZipSoundArchive::openArchive(const char *path, const char *extension, SoundFormat format, int raw_frequency) { + closeArchive(); + + _archive = Common::makeZipArchive(path); + _path = path; + _extension = extension; + _format = format; + _defaultFreq = raw_frequency; + + if (_archive) { + Common::ArchiveMemberList files; + _archive->listMembers(files); + _sampleCount = files.size(); + } +} + +void ZipSoundArchive::closeArchive() { + clearCache(); + delete _archive; + _archive = NULL; + _path = _extension = NULL; + _sampleCount = _defaultFreq = 0; + _format = RAW; +} + +void ZipSoundArchive::clearCache() { + // Just deallocate the link-list of (very short) headers for each + // dubbed sentence played in the current location. If the callers have + // not called .close() on any of the items, call them now. + for (Common::List::iterator it = _cache.begin(); it != _cache.end(); ++it) { + it->close(); + } + _cache.clear(); +} + +SoundSample *ZipSoundArchive::getSample(int i, uint freq) { + if (i < 0 || i >= (int) _sampleCount) { + return NULL; + } + debugCN(2, kDraciArchiverDebugLevel, "Accessing sample %d.%s from archive %s (format %d@%d, capacity %d): ", + i, _extension, _path, static_cast (_format), _defaultFreq, _sampleCount); + if (freq != 0 && (_format != RAW && _format != RAW80)) { + error("Cannot resample a sound in compressed format"); + return NULL; + } + + // We cannot really cache anything, because createReadStreamForMember() + // returns the data as a ReadStream, which is not thread-safe. We thus + // read it again each time even if it has possibly been already cached + // a while ago. This is not such a problem for dubbing as for regular + // sound samples. + SoundSample sample; + sample._frequency = freq ? freq : _defaultFreq; + sample._format = _format; + // Read in the file (without the file header) + char file_name[20]; + sprintf(file_name, "%d.%s", i+1, _extension); + sample._stream = _archive->createReadStreamForMember(file_name); + if (!sample._stream) { + debugC(2, kDraciArchiverDebugLevel, "Doesn't exist"); + return NULL; + } else { + debugC(2, kDraciArchiverDebugLevel, "Read"); + _cache.push_back(sample); + // Return a pointer that we own and which we will deallocate + // including its contents. + return &_cache.back(); + } +} + Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer), _muteSound(false), _muteVoice(false), _showSubtitles(true), _talkSpeed(kStandardSpeed) { @@ -194,17 +279,59 @@ SndHandle *Sound::getHandle() { void Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffer, int volume, sndHandleType handleType, bool loop) { + if (!buffer._stream && !buffer._data) { + warning("Empty stream"); + return; + } + // Create a new SeekableReadStream which will be automatically disposed + // after the sample stops playing. Do not dispose the original + // data/stream though. + // Beware that if the sample comes from an archive (i.e., is stored in + // buffer._stream), then you must NOT play it more than once at the + // same time, because streams are not thread-safe. Playing it + // repeatedly is OK. Currently this is ensured by that archives are + // only used for dubbing, which is only played from one place in + // script.cpp, which blocks until the dubbed sentence has finished + // playing. + Common::SeekableReadStream* stream; + if (buffer._stream) { + stream = new Common::SeekableSubReadStream(buffer._stream, 0, buffer._stream->size(), DisposeAfterUse::NO); + } else { + stream = new Common::MemoryReadStream(buffer._data, buffer._length, DisposeAfterUse::NO); + } - byte flags = Audio::FLAG_UNSIGNED; + Audio::SeekableAudioStream *reader = NULL; + switch (buffer._format) { + case RAW80: + stream->skip(80); // and fall-thru + case RAW: + reader = Audio::makeRawStream(stream, buffer._frequency, Audio::FLAG_UNSIGNED, DisposeAfterUse::YES); + break; +#ifdef USE_MAD + case MP3: + reader = Audio::makeMP3Stream(stream, DisposeAfterUse::YES); + break; +#endif +#ifdef USE_VORBIS + case OGG: + reader = Audio::makeVorbisStream(stream, DisposeAfterUse::YES); + break; +#endif +#ifdef USE_FLAC + case FLAC: + reader = Audio::makeFLACStream(stream, DisposeAfterUse::YES); + break; +#endif + default: + error("Unsupported compression format %d", static_cast (buffer._format)); + delete stream; + return; + } const Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ? Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType; - - // Don't use DisposeAfterUse::YES, because our caching system deletes samples by itself. - Audio::AudioStream *stream = Audio::makeLoopingAudioStream( - Audio::makeRawStream(buffer._data, buffer._length, buffer._frequency, flags, DisposeAfterUse::NO), - loop ? 0 : 1); - _mixer->playStream(soundType, handle, stream, -1, volume); + Audio::AudioStream *audio_stream = Audio::makeLoopingAudioStream(reader, loop ? 0 : 1); + _mixer->playStream(soundType, handle, audio_stream, -1, volume); } void Sound::playSound(const SoundSample *buffer, int volume, bool loop) { diff --git a/engines/draci/sound.h b/engines/draci/sound.h index e4cf7efdec..b1a91bb55b 100644 --- a/engines/draci/sound.h +++ b/engines/draci/sound.h @@ -28,22 +28,39 @@ #include "common/str.h" #include "common/file.h" +#include "common/list.h" #include "sound/mixer.h" +namespace Common { +class Archive; +class SeekableReadStream; +} + namespace Draci { +enum SoundFormat { RAW, RAW80, MP3, OGG, FLAC }; // RAW80 means skip the first 80 bytes + /** * Represents individual files inside the archive. */ struct SoundSample { - uint _offset; + uint _offset; // For internal use of LegacySoundArchive uint _length; - uint _frequency; - byte* _data; + uint _frequency; // Only when _format == RAW or RAW80 + SoundFormat _format; + + byte *_data; // At most one of these two pointer can be non-NULL + Common::SeekableReadStream* _stream; + + SoundSample() : _offset(0), _length(0), _frequency(0), _format(RAW), _data(NULL), _stream(NULL) { } + // The standard copy constructor is good enough, since we only stored numbers and pointers. + // Don't call close() automaticall in the destructor, otherwise copying causes SIGSEGV. void close() { delete[] _data; + delete _stream; _data = NULL; + _stream = NULL; } }; @@ -75,27 +92,28 @@ public: /** * Caches a given sample into memory and returns a pointer into it. We - * own the pointer. If freq is nonzero, then the sample is played at a - * different frequency (only used for uncompressed samples). + * own the returned pointer, but the user may call .close() on it, + * which deallocates the memory of the actual sample data. If freq is + * nonzero, then the sample is played at a different frequency (only + * works for uncompressed samples). */ virtual SoundSample *getSample(int i, uint freq) = 0; }; /** * Reads CD.SAM (with dubbing) and CD2.SAM (with sound samples) from the - * original game. + * original game. Caches all read samples in a thread-safe manner. */ class LegacySoundArchive : public SoundArchive { public: - LegacySoundArchive(const Common::String &path, uint defaultFreq) : - _path(), _samples(NULL), _sampleCount(0), _defaultFreq(defaultFreq), _opened(false), _f(NULL) { + LegacySoundArchive(const char *path, uint defaultFreq) : + _path(NULL), _samples(NULL), _sampleCount(0), _defaultFreq(defaultFreq), _opened(false), _f(NULL) { openArchive(path); } - virtual ~LegacySoundArchive() { closeArchive(); } + void openArchive(const char *path); void closeArchive(); - void openArchive(const Common::String &path); virtual uint size() const { return _sampleCount; } virtual bool isOpen() const { return _opened; } @@ -104,7 +122,7 @@ public: virtual SoundSample *getSample(int i, uint freq); private: - Common::String _path; ///< Path to file + const char *_path; ///< Path to file SoundSample *_samples; ///< Internal array of files uint _sampleCount; ///< Number of files in archive uint _defaultFreq; ///< The default sampling frequency of the archived samples @@ -112,6 +130,44 @@ private: Common::File *_f; ///< Opened file }; +/** + * Reads ZIP archives with uncompressed files containing lossy-compressed + * samples in arbitrary format. Doesn't do any real caching and is + * thread-safe. + */ +class ZipSoundArchive : public SoundArchive { +public: + ZipSoundArchive() : _archive(NULL), _path(NULL), _extension(NULL), _format(RAW), _sampleCount(0), _defaultFreq(0), _cache() { } + virtual ~ZipSoundArchive() { closeArchive(); } + + void openArchive(const char *path, const char *extension, SoundFormat format, int raw_frequency = 0); + void closeArchive(); + + virtual uint size() const { return _sampleCount; } + virtual bool isOpen() const { return _archive != NULL; } + + virtual void clearCache(); + virtual SoundSample *getSample(int i, uint freq); + +private: + Common::Archive *_archive; + const char *_path; + const char *_extension; + SoundFormat _format; + uint _sampleCount; + uint _defaultFreq; + + // Since we typically play at most 1 dubbing at a time, we could get + // away with having just 1 record allocated and reusing it each time. + // However, that would be thread-unsafe if two samples were played. + // Although the player does not do that, it is nicer to allow for it in + // principle. For each dubbed sentence, we allocate a new record in + // the following link-list, which is cleared during each location + // change. The dubbed samples themselves are manually deallocated + // after they end. + Common::List _cache; +}; + #define SOUND_HANDLES 10 enum sndHandleType { -- cgit v1.2.3 From 6c6d8b3fb39afe4a5866348ca2d34a7b13b566bb Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 1 Jul 2010 12:01:17 +0000 Subject: Introduced a hash for storing all the miscellaneous data values, and used it to more properly implement display of all the wakeup text in the first room svn-id: r50544 --- engines/m4/animation.cpp | 4 ++++ engines/m4/animation.h | 1 + engines/m4/globals.h | 4 ++++ engines/m4/mads_logic.cpp | 54 ++++++++++++++++++++++++++++++++++++++++------- engines/m4/mads_logic.h | 2 ++ engines/m4/mads_scene.h | 1 + engines/m4/mads_views.h | 1 + 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index f9dd8287ae..0ead57aac9 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -482,6 +482,10 @@ void MadsAnimation::setCurrentFrame(int frameNumber) { _nextScrollTimer = _nextFrameTimer = _madsVm->_currentTimer; } +int MadsAnimation::getCurrentFrame() { + return _currentFrame; +} + void MadsAnimation::load1(int frameNumber) { if (_skipLoad) return; diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 21fa411426..583d829066 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -119,6 +119,7 @@ public: virtual void load(const Common::String &filename, int abortTimers); virtual void update(); virtual void setCurrentFrame(int frameNumber); + virtual int getCurrentFrame(); bool freeFlag() const { return _freeFlag; } bool getAnimMode() const { return _animMode; } diff --git a/engines/m4/globals.h b/engines/m4/globals.h index 3a986ee294..0217a96777 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -28,6 +28,7 @@ #include "common/scummsys.h" #include "common/array.h" +#include "common/hashmap.h" #include "common/rect.h" #include "common/file.h" #include "common/list.h" @@ -223,6 +224,8 @@ struct MadsConfigData { int screenFades; }; +typedef Common::HashMap IntStorage; + class MadsGlobals : public Globals { private: struct MessageItem { @@ -250,6 +253,7 @@ public: int sceneNumber; int previousScene; uint16 actionNouns[3]; + IntStorage _dataMap; void loadMadsVocab(); uint32 getVocabSize() { return _madsVocab.size(); } diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index 9cb053a876..72c5fde40b 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -69,6 +69,10 @@ void MadsSceneLogic::getAnimName() { strcpy(_madsVm->scene()->_aaName, newName); } +IntStorage &MadsSceneLogic::dataMap() { + return _madsVm->globals()->_dataMap; +} + /*--------------------------------------------------------------------------*/ uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) { @@ -239,9 +243,13 @@ void MadsSceneLogic::enterScene() { _madsVm->scene()->getSceneResources().playerPos = Common::Point(68, 140); _madsVm->scene()->getSceneResources().playerDir = 4; - // TODO: Flags setting + + dataMap()[0x56FC] = 0; + dataMap()[0x5482] = 0; + dataMap()[0x5484] = 30; } + _madsVm->globals()->_dataMap[0x5486] = 0; lowRoomsEntrySound(); } @@ -250,14 +258,44 @@ void MadsSceneLogic::doAction() { } void MadsSceneLogic::sceneStep() { - // FIXME: Temporary code to display a message on-screen - static bool tempBool = false; - if (!tempBool) { - tempBool = true; + // Wake up message sequence + Animation *anim = _madsVm->scene()->activeAnimation(); + if (anim) { + if ((anim->getCurrentFrame() == 6) && (dataMap()[0x5482] == 0)) { + dataMap()[0x5482]++; + _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]), + 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(49)); + dataMap()[0x5484] += 14; + } - _madsVm->scene()->_kernelMessages.add(Common::Point(63, 100), 0x1110, 0, 0, 240, - _madsVm->globals()->getQuote(49)); - } + if ((anim->getCurrentFrame() == 7) && (dataMap()[0x5482] == 1)) { + dataMap()[0x5482]++; + _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]), + 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(54)); + dataMap()[0x5484] += 14; + } + + if ((anim->getCurrentFrame() == 10) && (dataMap()[0x5482] == 2)) { + dataMap()[0x5482]++; + _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]), + 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(55)); + dataMap()[0x5484] += 14; + } + + if ((anim->getCurrentFrame() == 17) && (dataMap()[0x5482] == 3)) { + dataMap()[0x5482]++; + _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]), + 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(56)); + dataMap()[0x5484] += 14; + } + + if ((anim->getCurrentFrame() == 20) && (dataMap()[0x5482] == 4)) { + dataMap()[0x5482]++; + _madsVm->scene()->_kernelMessages.add(Common::Point(63, dataMap()[0x5484]), + 0x1110, 0, 0, 240, _madsVm->globals()->getQuote(50)); + dataMap()[0x5484] += 14; + } + } } } diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 8c3f41d08b..299464f62b 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -50,6 +50,8 @@ private: const char *formAnimName(char sepChar, int16 suffixNum); void getSceneSpriteSet(); void getAnimName(); + + IntStorage &dataMap(); public: void selectScene(int sceneNum); diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index ef5cd312d7..c5fe6f01cd 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -128,6 +128,7 @@ public: void loadPlayerSprites(const char *prefix); void showMADSV2TextBox(char *text, int x, int y, char *faceName); void loadAnimation(const Common::String &animName, int v0); + Animation *activeAnimation() const { return _activeAnimation; } MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; } MadsSceneResources &getSceneResources() { return _sceneResources; } diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 2fbe6a6dc7..e3344bc8a4 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -376,6 +376,7 @@ public: virtual void load(const Common::String &filename, int v0) = 0; virtual void update() = 0; virtual void setCurrentFrame(int frameNumber) = 0; + virtual int getCurrentFrame() = 0; }; -- cgit v1.2.3 From e309f05162b3b49b3236ebd8faaed124d9c5862a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:04:04 +0000 Subject: SCI: Simplify SegManager::findObjectByName svn-id: r50548 --- engines/sci/engine/seg_manager.cpp | 94 +++++++++++++++----------------------- 1 file changed, 37 insertions(+), 57 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index ea1fc389cd..69ab9fbe22 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -263,78 +263,58 @@ const char *SegManager::getObjectName(reg_t pos) { } reg_t SegManager::findObjectByName(const Common::String &name, int index) { - reg_t retVal = NULL_REG; + Common::Array result; + uint i; // Now all values are available; iterate over all objects. - int timesFound = 0; - for (uint i = 0; i < _heap.size(); i++) { - SegmentObj *mobj = _heap[i]; - int idx = 0; - int max_index = 0; - ObjMap::iterator it; - Script *scr = 0; - CloneTable *ct = 0; - - if (mobj) { - if (mobj->getType() == SEG_TYPE_SCRIPT) { - scr = (Script *)mobj; - max_index = scr->_objects.size(); - it = scr->_objects.begin(); - } else if (mobj->getType() == SEG_TYPE_CLONES) { - ct = (CloneTable *)mobj; - max_index = ct->_table.size(); - } - } + for (i = 0; i < _heap.size(); i++) { + const SegmentObj *mobj = _heap[i]; - // It's a script or a clone table, scan all objects in it - for (; idx < max_index; ++idx) { - const Object *obj = NULL; - reg_t objpos; - objpos.offset = 0; - objpos.segment = i; - - if (mobj->getType() == SEG_TYPE_SCRIPT) { - obj = &(it->_value); - objpos.offset = obj->getPos().offset; - ++it; - } else if (mobj->getType() == SEG_TYPE_CLONES) { + if (!mobj) + continue; + + reg_t objpos = make_reg(i, 0); + + if (mobj->getType() == SEG_TYPE_SCRIPT) { + // It's a script, scan all objects in it + const Script *scr = (const Script *)mobj; + for (ObjMap::const_iterator it = scr->_objects.begin(); it != scr->_objects.end(); ++it) { + objpos.offset = it->_value.getPos().offset; + if (name == getObjectName(objpos)) + result.push_back(objpos); + } + } else if (mobj->getType() == SEG_TYPE_CLONES) { + // It's clone table, scan all objects in it + const CloneTable *ct = (const CloneTable *)mobj; + for (uint idx = 0; idx < ct->_table.size(); ++idx) { if (!ct->isValidEntry(idx)) continue; - obj = &(ct->_table[idx]); - objpos.offset = idx; - } - const char *objname = getObjectName(objpos); - if (name == objname) { - // Found a match! - if ((index < 0) && (timesFound > 0)) { - if (timesFound == 1) { - // First time we realized the ambiguity - printf("Ambiguous:\n"); - printf(" %3x: [%04x:%04x] %s\n", 0, PRINT_REG(retVal), name.c_str()); - } - printf(" %3x: [%04x:%04x] %s\n", timesFound, PRINT_REG(objpos), name.c_str()); - } - if (index < 0 || timesFound == index) - retVal = objpos; - ++timesFound; + objpos.offset = idx; + if (name == getObjectName(objpos)) + result.push_back(objpos); } } - } - if (!timesFound) + if (result.empty()) return NULL_REG; - if (timesFound > 1 && index < 0) { - printf("Ambiguous: Aborting.\n"); - return NULL_REG; // Ambiguous + if (result.size() > 1) { + printf("Ambiguous:\n"); + for (i = 0; i < result.size(); i++) + printf(" %3x: [%04x:%04x] %s\n", i, PRINT_REG(result[i]), name.c_str()); + if (index < 0) { + printf("Ambiguous: Aborting.\n"); + return NULL_REG; // Ambiguous + } } - if (timesFound <= index) + if (index < 0) + return result[0]; + else if (result.size() <= (uint)index) return NULL_REG; // Not found - - return retVal; + return result[index]; } // validate the seg -- cgit v1.2.3 From 3f429d64a2ef826782bf9af8971ba397b0e2743c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:04:29 +0000 Subject: SCI: Rename some variables to match our naming conventions svn-id: r50549 --- engines/sci/engine/kernel32.cpp | 10 +++--- engines/sci/engine/klists.cpp | 12 +++---- engines/sci/engine/savegame.cpp | 6 ++-- engines/sci/engine/seg_manager.cpp | 74 +++++++++++++++++++------------------- engines/sci/engine/seg_manager.h | 20 +++++------ 5 files changed, 61 insertions(+), 61 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 1773046308..5975c7b3bc 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -609,13 +609,13 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { if (argv[1].segment == s->_segMan->getSysStringsSegment()) { // Resize if necessary const uint16 sysStringId = argv[1].toUint16(); - if ((uint32)s->_segMan->sysStrings->_strings[sysStringId]._maxSize < index1 + count) { - free(s->_segMan->sysStrings->_strings[sysStringId]._value); - s->_segMan->sysStrings->_strings[sysStringId]._maxSize = index1 + count; - s->_segMan->sysStrings->_strings[sysStringId]._value = (char *)calloc(index1 + count, sizeof(char)); + if ((uint32)s->_segMan->_sysStrings->_strings[sysStringId]._maxSize < index1 + count) { + free(s->_segMan->_sysStrings->_strings[sysStringId]._value); + s->_segMan->_sysStrings->_strings[sysStringId]._maxSize = index1 + count; + s->_segMan->_sysStrings->_strings[sysStringId]._value = (char *)calloc(index1 + count, sizeof(char)); } - strncpy(s->_segMan->sysStrings->_strings[sysStringId]._value + index1, string2 + index2, count); + strncpy(s->_segMan->_sysStrings->_strings[sysStringId]._value + index1, string2 + index2, count); } else { SciString *string1 = s->_segMan->lookupString(argv[1]); diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 8e9ec6dccd..0701883a9b 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -179,7 +179,7 @@ reg_t kEmptyList(EngineState *s, int argc, reg_t *argv) { return make_reg(0, ((list) ? list->first.isNull() : 0)); } -static void _k_add_to_front(EngineState *s, reg_t listRef, reg_t nodeRef) { +static void addToFront(EngineState *s, reg_t listRef, reg_t nodeRef) { List *list = s->_segMan->lookupList(listRef); Node *newNode = s->_segMan->lookupNode(nodeRef); @@ -202,7 +202,7 @@ static void _k_add_to_front(EngineState *s, reg_t listRef, reg_t nodeRef) { list->first = nodeRef; } -static void _k_add_to_end(EngineState *s, reg_t listRef, reg_t nodeRef) { +static void addToEnd(EngineState *s, reg_t listRef, reg_t nodeRef) { List *list = s->_segMan->lookupList(listRef); Node *newNode = s->_segMan->lookupNode(nodeRef); @@ -250,7 +250,7 @@ reg_t kNodeValue(EngineState *s, int argc, reg_t *argv) { } reg_t kAddToFront(EngineState *s, int argc, reg_t *argv) { - _k_add_to_front(s, argv[0], argv[1]); + addToFront(s, argv[0], argv[1]); return s->r_acc; } @@ -288,14 +288,14 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { s->_segMan->lookupNode(oldnext)->pred = argv[2]; } else { // !firstnode - _k_add_to_front(s, argv[0], argv[2]); // Set as initial list node + addToFront(s, argv[0], argv[2]); // Set as initial list node } return s->r_acc; } reg_t kAddToEnd(EngineState *s, int argc, reg_t *argv) { - _k_add_to_end(s, argv[0], argv[1]); + addToEnd(s, argv[0], argv[1]); return s->r_acc; } @@ -417,7 +417,7 @@ reg_t kSort(EngineState *s, int argc, reg_t *argv) { for (i = 0;i < input_size;i++) { reg_t lNode = s->_segMan->newNode(temp_array[i].value, temp_array[i].key); - _k_add_to_end(s, output_data, lNode); + addToEnd(s, output_data, lNode); } free(temp_array); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 7a6496fe63..6a1cbe4740 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -245,9 +245,9 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { } } - s.syncAsSint32LE(Clones_seg_id); - s.syncAsSint32LE(Lists_seg_id); - s.syncAsSint32LE(Nodes_seg_id); + s.syncAsSint32LE(_clonesSegId); + s.syncAsSint32LE(_listsSegId); + s.syncAsSint32LE(_nodesSegId); } diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 69ab9fbe22..517e723d40 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -40,14 +40,14 @@ enum { SegManager::SegManager(ResourceManager *resMan) { _heap.push_back(0); - Clones_seg_id = 0; - Lists_seg_id = 0; - Nodes_seg_id = 0; - Hunks_seg_id = 0; + _clonesSegId = 0; + _listsSegId = 0; + _nodesSegId = 0; + _hunksSegId = 0; #ifdef ENABLE_SCI32 - Arrays_seg_id = 0; - String_seg_id = 0; + _arraysSegId = 0; + _stringSegId = 0; #endif _resMan = resMan; @@ -71,10 +71,10 @@ void SegManager::resetSegMan() { // And reinitialize _heap.push_back(0); - Clones_seg_id = 0; - Lists_seg_id = 0; - Nodes_seg_id = 0; - Hunks_seg_id = 0; + _clonesSegId = 0; + _listsSegId = 0; + _nodesSegId = 0; + _hunksSegId = 0; // Reinitialize class table _classTable.clear(); @@ -82,10 +82,10 @@ void SegManager::resetSegMan() { } void SegManager::initSysStrings() { - sysStrings = (SystemStrings *)allocSegment(new SystemStrings(), &sysStringsSegment); + _sysStrings = (SystemStrings *)allocSegment(new SystemStrings(), &_sysStringsSegId); // Allocate static buffer for savegame and CWD directories - SystemString *strSaveDir = &sysStrings->_strings[SYS_STRING_SAVEDIR]; + SystemString *strSaveDir = &_sysStrings->_strings[SYS_STRING_SAVEDIR]; strSaveDir->_name = "savedir"; strSaveDir->_maxSize = MAX_SAVE_DIR_SIZE; strSaveDir->_value = (char *)calloc(MAX_SAVE_DIR_SIZE, sizeof(char)); @@ -94,7 +94,7 @@ void SegManager::initSysStrings() { ::strcpy(strSaveDir->_value, ""); // Allocate static buffer for the parser base - SystemString *strParserBase = &sysStrings->_strings[SYS_STRING_PARSER_BASE]; + SystemString *strParserBase = &_sysStrings->_strings[SYS_STRING_PARSER_BASE]; strParserBase->_name = "parser-base"; strParserBase->_maxSize = MAX_PARSER_BASE; strParserBase->_value = (char *)calloc(MAX_PARSER_BASE, sizeof(char)); @@ -412,13 +412,13 @@ reg_t SegManager::allocateHunkEntry(const char *hunk_type, int size) { HunkTable *table; int offset; - if (!Hunks_seg_id) - allocSegment(new HunkTable(), &(Hunks_seg_id)); - table = (HunkTable *)_heap[Hunks_seg_id]; + if (!_hunksSegId) + allocSegment(new HunkTable(), &(_hunksSegId)); + table = (HunkTable *)_heap[_hunksSegId]; offset = table->allocEntry(); - reg_t addr = make_reg(Hunks_seg_id, offset); + reg_t addr = make_reg(_hunksSegId, offset); Hunk *h = &(table->_table[offset]); if (!h) @@ -446,14 +446,14 @@ Clone *SegManager::allocateClone(reg_t *addr) { CloneTable *table; int offset; - if (!Clones_seg_id) - table = (CloneTable *)allocSegment(new CloneTable(), &(Clones_seg_id)); + if (!_clonesSegId) + table = (CloneTable *)allocSegment(new CloneTable(), &(_clonesSegId)); else - table = (CloneTable *)_heap[Clones_seg_id]; + table = (CloneTable *)_heap[_clonesSegId]; offset = table->allocEntry(); - *addr = make_reg(Clones_seg_id, offset); + *addr = make_reg(_clonesSegId, offset); return &(table->_table[offset]); } @@ -461,13 +461,13 @@ List *SegManager::allocateList(reg_t *addr) { ListTable *table; int offset; - if (!Lists_seg_id) - allocSegment(new ListTable(), &(Lists_seg_id)); - table = (ListTable *)_heap[Lists_seg_id]; + if (!_listsSegId) + allocSegment(new ListTable(), &(_listsSegId)); + table = (ListTable *)_heap[_listsSegId]; offset = table->allocEntry(); - *addr = make_reg(Lists_seg_id, offset); + *addr = make_reg(_listsSegId, offset); return &(table->_table[offset]); } @@ -475,13 +475,13 @@ Node *SegManager::allocateNode(reg_t *addr) { NodeTable *table; int offset; - if (!Nodes_seg_id) - allocSegment(new NodeTable(), &(Nodes_seg_id)); - table = (NodeTable *)_heap[Nodes_seg_id]; + if (!_nodesSegId) + allocSegment(new NodeTable(), &(_nodesSegId)); + table = (NodeTable *)_heap[_nodesSegId]; offset = table->allocEntry(); - *addr = make_reg(Nodes_seg_id, offset); + *addr = make_reg(_nodesSegId, offset); return &(table->_table[offset]); } @@ -851,14 +851,14 @@ SciArray *SegManager::allocateArray(reg_t *addr) { ArrayTable *table; int offset; - if (!Arrays_seg_id) { - table = (ArrayTable *)allocSegment(new ArrayTable(), &(Arrays_seg_id)); + if (!_arraysSegId) { + table = (ArrayTable *)allocSegment(new ArrayTable(), &(_arraysSegId)); } else - table = (ArrayTable *)_heap[Arrays_seg_id]; + table = (ArrayTable *)_heap[_arraysSegId]; offset = table->allocEntry(); - *addr = make_reg(Arrays_seg_id, offset); + *addr = make_reg(_arraysSegId, offset); return &(table->_table[offset]); } @@ -891,14 +891,14 @@ SciString *SegManager::allocateString(reg_t *addr) { StringTable *table; int offset; - if (!String_seg_id) { - table = (StringTable *)allocSegment(new StringTable(), &(String_seg_id)); + if (!_stringSegId) { + table = (StringTable *)allocSegment(new StringTable(), &(_stringSegId)); } else - table = (StringTable *)_heap[String_seg_id]; + table = (StringTable *)_heap[_stringSegId]; offset = table->allocEntry(); - *addr = make_reg(String_seg_id, offset); + *addr = make_reg(_stringSegId, offset); return &(table->_table[offset]); } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 0ef904618b..50a0464ee2 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -446,7 +446,7 @@ public: /** * Obtains the system strings segment ID */ - SegmentId getSysStringsSegment() { return sysStringsSegment; } + SegmentId getSysStringsSegment() { return _sysStringsSegId; } public: // TODO: make private Common::Array _heap; @@ -460,7 +460,7 @@ public: // TODO: make private SciString *allocateString(reg_t *addr); SciString *lookupString(reg_t addr); void freeString(reg_t addr); - SegmentId getStringSegmentId() { return String_seg_id; } + SegmentId getStringSegmentId() { return _stringSegId; } #endif private: @@ -469,21 +469,21 @@ private: ResourceManager *_resMan; - SegmentId Clones_seg_id; ///< ID of the (a) clones segment - SegmentId Lists_seg_id; ///< ID of the (a) list segment - SegmentId Nodes_seg_id; ///< ID of the (a) node segment - SegmentId Hunks_seg_id; ///< ID of the (a) hunk segment + SegmentId _clonesSegId; ///< ID of the (a) clones segment + SegmentId _listsSegId; ///< ID of the (a) list segment + SegmentId _nodesSegId; ///< ID of the (a) node segment + SegmentId _hunksSegId; ///< ID of the (a) hunk segment /* System strings */ - SegmentId sysStringsSegment; + SegmentId _sysStringsSegId; public: // TODO: make private. Only kString() needs direct access - SystemStrings *sysStrings; + SystemStrings *_sysStrings; private: #ifdef ENABLE_SCI32 - SegmentId Arrays_seg_id; - SegmentId String_seg_id; + SegmentId _arraysSegId; + SegmentId _stringSegId; #endif private: -- cgit v1.2.3 From 36799dc83f59674de8956ea2ec29029783633f45 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:04:48 +0000 Subject: SCI: Add SegManager::getSystemString() method svn-id: r50550 --- engines/sci/engine/kernel32.cpp | 12 +++++++----- engines/sci/engine/seg_manager.cpp | 4 ++-- engines/sci/engine/seg_manager.h | 15 ++++++++++++--- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 5975c7b3bc..25a822f77d 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -609,13 +609,15 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { if (argv[1].segment == s->_segMan->getSysStringsSegment()) { // Resize if necessary const uint16 sysStringId = argv[1].toUint16(); - if ((uint32)s->_segMan->_sysStrings->_strings[sysStringId]._maxSize < index1 + count) { - free(s->_segMan->_sysStrings->_strings[sysStringId]._value); - s->_segMan->_sysStrings->_strings[sysStringId]._maxSize = index1 + count; - s->_segMan->_sysStrings->_strings[sysStringId]._value = (char *)calloc(index1 + count, sizeof(char)); + SystemString *sysString = s->_segMan->getSystemString(sysStringId); + assert(sysString); + if ((uint32)sysString->_maxSize < index1 + count) { + free(sysString->_value); + sysString->_maxSize = index1 + count; + sysString->_value = (char *)calloc(index1 + count, sizeof(char)); } - strncpy(s->_segMan->_sysStrings->_strings[sysStringId]._value + index1, string2 + index2, count); + strncpy(sysString->_value + index1, string2 + index2, count); } else { SciString *string1 = s->_segMan->lookupString(argv[1]); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 517e723d40..a5cfc5013b 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -85,7 +85,7 @@ void SegManager::initSysStrings() { _sysStrings = (SystemStrings *)allocSegment(new SystemStrings(), &_sysStringsSegId); // Allocate static buffer for savegame and CWD directories - SystemString *strSaveDir = &_sysStrings->_strings[SYS_STRING_SAVEDIR]; + SystemString *strSaveDir = getSystemString(SYS_STRING_SAVEDIR); strSaveDir->_name = "savedir"; strSaveDir->_maxSize = MAX_SAVE_DIR_SIZE; strSaveDir->_value = (char *)calloc(MAX_SAVE_DIR_SIZE, sizeof(char)); @@ -94,7 +94,7 @@ void SegManager::initSysStrings() { ::strcpy(strSaveDir->_value, ""); // Allocate static buffer for the parser base - SystemString *strParserBase = &_sysStrings->_strings[SYS_STRING_PARSER_BASE]; + SystemString *strParserBase = getSystemString(SYS_STRING_PARSER_BASE); strParserBase->_name = "parser-base"; strParserBase->_maxSize = MAX_PARSER_BASE; strParserBase->_value = (char *)calloc(MAX_PARSER_BASE, sizeof(char)); diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 50a0464ee2..6fb1114555 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -448,6 +448,18 @@ public: */ SegmentId getSysStringsSegment() { return _sysStringsSegId; } + /** + * Get a pointer to the system string with the specified index, + * or NULL if that index is invalid. + * + * This method is currently only used by kString(). + */ + SystemString *getSystemString(uint idx) const { + if (idx >= SYS_STRINGS_MAX) + return NULL; + return &_sysStrings->_strings[idx]; + } + public: // TODO: make private Common::Array _heap; // Only accessible from saveLoadWithSerializer() @@ -476,11 +488,8 @@ private: /* System strings */ SegmentId _sysStringsSegId; -public: // TODO: make private. Only kString() needs direct access SystemStrings *_sysStrings; -private: - #ifdef ENABLE_SCI32 SegmentId _arraysSegId; SegmentId _stringSegId; -- cgit v1.2.3 From c822cd67cbebf22999a6b4d95d965ea5873e1b9a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:05:10 +0000 Subject: SCI: Make SegManager::_classTable private. This require a small tweak to the save/load code: I moved the syncing logic for _classtable from EngineState::saveLoadWithSerializer to SegManager::saveLoadWithSerializer, which in theory should have no effect (luckily, _classtable was being synced right after the segment manager). svn-id: r50551 --- engines/sci/engine/savegame.cpp | 4 ++-- engines/sci/engine/seg_manager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 6a1cbe4740..bf29dbb046 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -248,6 +248,8 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_clonesSegId); s.syncAsSint32LE(_listsSegId); s.syncAsSint32LE(_nodesSegId); + + syncArray(s, _classTable); } @@ -343,8 +345,6 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { _segMan->saveLoadWithSerializer(s); - syncArray(s, _segMan->_classTable); - g_sci->_soundCmd->syncPlayList(s); } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 6fb1114555..5bb6f7e524 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -462,8 +462,6 @@ public: public: // TODO: make private Common::Array _heap; - // Only accessible from saveLoadWithSerializer() - Common::Array _classTable; /**< Table of all classes */ #ifdef ENABLE_SCI32 SciArray *allocateArray(reg_t *addr); @@ -476,6 +474,8 @@ public: // TODO: make private #endif private: + // Only accessible from saveLoadWithSerializer() + Common::Array _classTable; /**< Table of all classes */ /** Map script ids to segment ids. */ Common::HashMap _scriptSegMap; -- cgit v1.2.3 From b8904a48ed81d04a2cbe84f78d80aaa75344d16e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:05:29 +0000 Subject: SCI: Make SegManager::_heap private svn-id: r50552 --- engines/sci/engine/gc.cpp | 24 +++++++++++++----------- engines/sci/engine/seg_manager.cpp | 2 +- engines/sci/engine/seg_manager.h | 11 +++++------ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 3dd7acfa1c..75456bcef0 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -51,12 +51,12 @@ struct WorklistManager { } }; -static reg_t_hash_map *normalise_hashmap_ptrs(SegManager *segMan, reg_t_hash_map &nonnormal_map) { +static reg_t_hash_map *normalizeAddresses(SegManager *segMan, reg_t_hash_map &nonnormal_map) { reg_t_hash_map *normal_map = new reg_t_hash_map(); for (reg_t_hash_map::iterator i = nonnormal_map.begin(); i != nonnormal_map.end(); ++i) { reg_t reg = i->_key; - SegmentObj *mobj = (reg.segment < segMan->_heap.size()) ? segMan->_heap[reg.segment] : NULL; + SegmentObj *mobj = segMan->getSegmentObj(reg.segment); if (mobj) { reg = mobj->findCanonicAddress(segMan, reg); @@ -113,11 +113,12 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { debugC(2, kDebugLevelGC, "[GC] -- Finished adding execution stack"); + const Common::Array &heap = segMan->getSegments(); + // Init: Explicitly loaded scripts - for (i = 1; i < segMan->_heap.size(); i++) { - if (segMan->_heap[i] - && segMan->_heap[i]->getType() == SEG_TYPE_SCRIPT) { - Script *script = (Script *)segMan->_heap[i]; + for (i = 1; i < heap.size(); i++) { + if (heap[i] && heap[i]->getType() == SEG_TYPE_SCRIPT) { + Script *script = (Script *)heap[i]; if (script->getLockers()) { // Explicitly loaded? wm.pushArray(script->listObjectReferences()); @@ -134,15 +135,15 @@ reg_t_hash_map *find_all_used_references(EngineState *s) { wm._worklist.pop_back(); if (reg.segment != stack_seg) { // No need to repeat this one debugC(2, kDebugLevelGC, "[GC] Checking %04x:%04x", PRINT_REG(reg)); - if (reg.segment < segMan->_heap.size() && segMan->_heap[reg.segment]) { + if (reg.segment < heap.size() && heap[reg.segment]) { // Valid heap object? Find its outgoing references! - wm.pushArray(segMan->_heap[reg.segment]->listAllOutgoingReferences(reg)); + wm.pushArray(heap[reg.segment]->listAllOutgoingReferences(reg)); } } } // Normalise - normal_map = normalise_hashmap_ptrs(segMan, wm._map); + normal_map = normalizeAddresses(segMan, wm._map); return normal_map; } @@ -162,8 +163,9 @@ void run_gc(EngineState *s) { // Iterate over all segments, and check for each whether it // contains stuff that can be collected. - for (uint seg = 1; seg < segMan->_heap.size(); seg++) { - SegmentObj *mobj = segMan->_heap[seg]; + const Common::Array &heap = segMan->getSegments(); + for (uint seg = 1; seg < heap.size(); seg++) { + SegmentObj *mobj = heap[seg]; if (mobj != NULL) { const SegmentType type = mobj->getType(); segnames[type] = SegmentObj::getSegmentTypeName(type); diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index a5cfc5013b..185a266203 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -553,7 +553,7 @@ static void *derefPtr(SegManager *segMan, reg_t pointer, int entries, bool wantR if (ret.isRaw != wantRaw) { warning("Dereferencing pointer %04x:%04x (type %d) which is %s, but expected %s", PRINT_REG(pointer), - segMan->_heap[pointer.segment]->getType(), + segMan->getSegmentType(pointer.segment), ret.isRaw ? "raw" : "not raw", wantRaw ? "raw" : "not raw"); } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 5bb6f7e524..a7f5f8517f 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -438,8 +438,8 @@ public: */ reg_t findObjectByName(const Common::String &name, int index = -1); - uint32 classTableSize() { return _classTable.size(); } - Class getClass(int index) { return _classTable[index]; } + uint32 classTableSize() const { return _classTable.size(); } + Class getClass(int index) const { return _classTable[index]; } void setClassOffset(int index, reg_t offset) { _classTable[index].reg = offset; } void resizeClassTable(uint32 size) { _classTable.resize(size); } @@ -460,9 +460,6 @@ public: return &_sysStrings->_strings[idx]; } -public: // TODO: make private - Common::Array _heap; - #ifdef ENABLE_SCI32 SciArray *allocateArray(reg_t *addr); SciArray *lookupArray(reg_t addr); @@ -473,8 +470,10 @@ public: // TODO: make private SegmentId getStringSegmentId() { return _stringSegId; } #endif + const Common::Array &getSegments() const { return _heap; } + private: - // Only accessible from saveLoadWithSerializer() + Common::Array _heap; Common::Array _classTable; /**< Table of all classes */ /** Map script ids to segment ids. */ Common::HashMap _scriptSegMap; -- cgit v1.2.3 From 9d47b191f6302ac8960bb4d91d32104c0993a198 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:05:47 +0000 Subject: SCI: Rename some more stuff svn-id: r50553 --- engines/sci/console.cpp | 4 ++-- engines/sci/engine/gc.cpp | 14 +++++++------- engines/sci/engine/gc.h | 9 +++++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b5fc903108..b83ffee0e7 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1757,10 +1757,10 @@ bool Console::cmdGCInvoke(int argc, const char **argv) { } bool Console::cmdGCObjects(int argc, const char **argv) { - reg_t_hash_map *use_map = find_all_used_references(_engine->_gamestate); + AddrSet *use_map = findAllActiveReferences(_engine->_gamestate); DebugPrintf("Reachable object references (normalised):\n"); - for (reg_t_hash_map::iterator i = use_map->begin(); i != use_map->end(); ++i) { + for (AddrSet::iterator i = use_map->begin(); i != use_map->end(); ++i) { DebugPrintf(" - %04x:%04x\n", PRINT_REG(i->_key)); } diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 75456bcef0..936b83d760 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -30,7 +30,7 @@ namespace Sci { struct WorklistManager { Common::Array _worklist; - reg_t_hash_map _map; + AddrSet _map; void push(reg_t reg) { if (!reg.segment) // No numbers @@ -51,10 +51,10 @@ struct WorklistManager { } }; -static reg_t_hash_map *normalizeAddresses(SegManager *segMan, reg_t_hash_map &nonnormal_map) { - reg_t_hash_map *normal_map = new reg_t_hash_map(); +static AddrSet *normalizeAddresses(SegManager *segMan, const AddrSet &nonnormal_map) { + AddrSet *normal_map = new AddrSet(); - for (reg_t_hash_map::iterator i = nonnormal_map.begin(); i != nonnormal_map.end(); ++i) { + for (AddrSet::const_iterator i = nonnormal_map.begin(); i != nonnormal_map.end(); ++i) { reg_t reg = i->_key; SegmentObj *mobj = segMan->getSegmentObj(reg.segment); @@ -68,9 +68,9 @@ static reg_t_hash_map *normalizeAddresses(SegManager *segMan, reg_t_hash_map &no } -reg_t_hash_map *find_all_used_references(EngineState *s) { +AddrSet *findAllActiveReferences(EngineState *s) { SegManager *segMan = s->_segMan; - reg_t_hash_map *normal_map = NULL; + AddrSet *normal_map = NULL; WorklistManager wm; uint i; @@ -159,7 +159,7 @@ void run_gc(EngineState *s) { memset(segcount, 0, sizeof(segcount)); // Compute the set of all segments references currently in use. - reg_t_hash_map *activeRefs = find_all_used_references(s); + AddrSet *activeRefs = findAllActiveReferences(s); // Iterate over all segments, and check for each whether it // contains stuff that can be collected. diff --git a/engines/sci/engine/gc.h b/engines/sci/engine/gc.h index cfae517790..f4318a1453 100644 --- a/engines/sci/engine/gc.h +++ b/engines/sci/engine/gc.h @@ -35,21 +35,22 @@ namespace Sci { struct reg_t_Hash { uint operator()(const reg_t& x) const { - return (x.segment << 3) | x.offset; + return (x.segment << 3) ^ x.offset ^ (x.offset << 16); } }; /* - * The reg_t_hash_map is actually really a hashset + * The AddrSet is a "set" of reg_t values. + * We don't have a HashSet type, so we abuse a HashMap for this. */ -typedef Common::HashMap reg_t_hash_map; +typedef Common::HashMap AddrSet; /** * Finds all used references and normalises them to their memory addresses * @param s The state to gather all information from * @return A hash map containing entries for all used references */ -reg_t_hash_map *find_all_used_references(EngineState *s); +AddrSet *findAllActiveReferences(EngineState *s); /** * Runs garbage collection on the current system state -- cgit v1.2.3 From aa6be750fb6c04c06fd7c423b64e445c515b0154 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:06:04 +0000 Subject: SCI: Invoke resetSegMan from SegManager::saveLoadWithSerializer, not from EngineState::saveLoadWithSerializer svn-id: r50554 --- engines/sci/engine/savegame.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index bf29dbb046..dd8c3ca31d 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -178,6 +178,9 @@ void syncWithSerializer(Common::Serializer &s, reg_t &obj) { } void SegManager::saveLoadWithSerializer(Common::Serializer &s) { + if (s.isLoading()) + resetSegMan(); + s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be reserved_id s.skip(4, VER(9), VER(18)); // OBSOLETE: Used to be _exportsAreWide s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be gc_mark_bits @@ -340,9 +343,6 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not - if (s.isLoading()) - _segMan->resetSegMan(); - _segMan->saveLoadWithSerializer(s); g_sci->_soundCmd->syncPlayList(s); -- cgit v1.2.3 From e3590a60a02114a7254e4955f8d512bcf76b71c4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:06:26 +0000 Subject: NDS: Fix compile errors and a warning svn-id: r50555 --- backends/platform/ds/arm9/source/dsoptions.cpp | 14 +++++++------- backends/platform/ds/arm9/source/touchkeyboard.cpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 300324a1de..44bbad23b2 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -66,14 +66,14 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, _("Snap to edges"), 0, 0, 'T'); new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, _("Touch X Offset"), Graphics::kTextAlignLeft); - _touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, 1); + _touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, "TODO: Add tooltip", 1); _touchX->setMinValue(-8); _touchX->setMaxValue(+8); _touchX->setValue(0); _touchX->setFlags(GUI::WIDGET_CLEARBG); new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, _("Touch Y Offset"), Graphics::kTextAlignLeft); - _touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, 2); + _touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, "TODO: Add tooltip", 2); _touchY->setMinValue(-8); _touchY->setMaxValue(+8); _touchY->setValue(0); @@ -88,7 +88,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, _("Tap for left click, double tap right click"), 0, 0x20000002, 'T'); _sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, _("Sensitivity"), Graphics::kTextAlignLeft); - _sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, 1); + _sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, "TODO: Add tooltip", 1); _sensitivity->setMinValue(4); _sensitivity->setMaxValue(16); _sensitivity->setValue(8); @@ -98,9 +98,9 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { new GUI::StaticTextWidget(_tab, 5, 67, 180, 15, _("Initial top screen scale:"), Graphics::kTextAlignLeft); - _100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 82, 80, 20, "100%", 0x30000001, 'T'); - _150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 97, 80, 20, "150%", 0x30000002, 'T'); - _200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 112, 80, 20, "200%", 0x30000003, 'T'); + _100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 82, 80, 20, "100%", "TODO: Add tooltip", 0x30000001, 'T'); + _150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 97, 80, 20, "150%", "TODO: Add tooltip", 0x30000002, 'T'); + _200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 112, 80, 20, "200%", "TODO: Add tooltip", 0x30000003, 'T'); new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, _("Main screen scaling:"), Graphics::kTextAlignLeft); @@ -109,7 +109,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, _("Unscaled (you must scroll left and right)"), 0, 0x10000003, 'S'); new GUI::StaticTextWidget(_tab, 5, 125, 110, 15, _("Brightness:"), Graphics::kTextAlignLeft); - _gammaCorrection = new GUI::SliderWidget(_tab, 130, 120, 130, 12, 1); + _gammaCorrection = new GUI::SliderWidget(_tab, 130, 120, 130, 12, "TODO: Add tooltip", 1); _gammaCorrection->setMinValue(0); _gammaCorrection->setMaxValue(8); _gammaCorrection->setValue(0); diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 2d4b6a94f4..88bf0ae991 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -160,7 +160,7 @@ int typingTimeout = 0; // Render text onto the tiled screen -void drawText(int tx, int ty, char* string, bool highlight) { +void drawText(int tx, int ty, const char *string, bool highlight) { u16 baseValue = 0; -- cgit v1.2.3 From 78b6e246df844ea7f38d1c879ddc5dbeb767938c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:26:00 +0000 Subject: Fix configure output (missing newline) svn-id: r50556 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index a8432fc8b8..2674c0af18 100755 --- a/configure +++ b/configure @@ -2342,7 +2342,7 @@ EOF add_to_config_h_if_yes $_detectlang '#define USE_DETECTLANG' if test "$_detectlang" = yes ; then - echo_n "with runtime language detection)" + echo "with runtime language detection)" else echo "without runtime language detection)" fi -- cgit v1.2.3 From a905327e65be97824e3faf483d3e535e763586cd Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 16:26:18 +0000 Subject: NDS: Fix typo svn-id: r50557 --- backends/platform/ds/ds.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index aeba1820c6..555e7ece06 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -65,7 +65,7 @@ OBJCOPY := $(DEVKITARM)/bin/arm-eabi-objcopy # ARM7_ARCH := -mthumb-interwork -# note: arm9tdmi isn't the correct CPU arch, but anything newer and LD +# note: arm7tdmi isn't the correct CPU arch, but anything newer and LD # *insists* it has a FPU or VFP, and it won't take no for an answer! ARM7_CFLAGS := -g -Wall -O2\ -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\ -- cgit v1.2.3 From 2d6f912bd10f70ae556af627f2b4ae6565f904ed Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Thu, 1 Jul 2010 17:06:14 +0000 Subject: Fix playing RAW and RAW80 streams svn-id: r50558 --- engines/draci/sound.cpp | 14 ++++++++++---- engines/draci/sound.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index e430da7bdc..eddf10e3ad 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -180,6 +180,10 @@ SoundSample *LegacySoundArchive::getSample(int i, uint freq) { void ZipSoundArchive::openArchive(const char *path, const char *extension, SoundFormat format, int raw_frequency) { closeArchive(); + if ((_format == RAW || _format == RAW80) && !raw_frequency) { + error("openArchive() expects frequency for RAW data"); + return; + } _archive = Common::makeZipArchive(path); _path = path; @@ -294,17 +298,19 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffe // script.cpp, which blocks until the dubbed sentence has finished // playing. Common::SeekableReadStream* stream; + const int skip = buffer._format == RAW80 ? 80 : 0; if (buffer._stream) { - stream = new Common::SeekableSubReadStream(buffer._stream, 0, buffer._stream->size(), DisposeAfterUse::NO); + stream = new Common::SeekableSubReadStream( + buffer._stream, skip, buffer._stream->size() /* end */, DisposeAfterUse::NO); } else { - stream = new Common::MemoryReadStream(buffer._data, buffer._length, DisposeAfterUse::NO); + stream = new Common::MemoryReadStream( + buffer._data + skip, buffer._length - skip /* length */, DisposeAfterUse::NO); } Audio::SeekableAudioStream *reader = NULL; switch (buffer._format) { - case RAW80: - stream->skip(80); // and fall-thru case RAW: + case RAW80: reader = Audio::makeRawStream(stream, buffer._frequency, Audio::FLAG_UNSIGNED, DisposeAfterUse::YES); break; #ifdef USE_MAD diff --git a/engines/draci/sound.h b/engines/draci/sound.h index b1a91bb55b..2fade6de0b 100644 --- a/engines/draci/sound.h +++ b/engines/draci/sound.h @@ -54,7 +54,7 @@ struct SoundSample { Common::SeekableReadStream* _stream; SoundSample() : _offset(0), _length(0), _frequency(0), _format(RAW), _data(NULL), _stream(NULL) { } - // The standard copy constructor is good enough, since we only stored numbers and pointers. + // The standard copy constructor is good enough, since we only store numbers and pointers. // Don't call close() automaticall in the destructor, otherwise copying causes SIGSEGV. void close() { delete[] _data; -- cgit v1.2.3 From 6859a305553ad3d5e88da1bcdd63aee7c8c44824 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Thu, 1 Jul 2010 17:16:06 +0000 Subject: Fix a typo in the RAW format bugfix :-) svn-id: r50559 --- engines/draci/sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index eddf10e3ad..aa696832bb 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -180,7 +180,7 @@ SoundSample *LegacySoundArchive::getSample(int i, uint freq) { void ZipSoundArchive::openArchive(const char *path, const char *extension, SoundFormat format, int raw_frequency) { closeArchive(); - if ((_format == RAW || _format == RAW80) && !raw_frequency) { + if ((format == RAW || format == RAW80) && !raw_frequency) { error("openArchive() expects frequency for RAW data"); return; } -- cgit v1.2.3 From a1dc56429c3d61afe960924abdc4ee241c4c9fe6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 17:42:39 +0000 Subject: SCI: Removed duplicate warning for missing audio samples svn-id: r50560 --- engines/sci/sound/audio.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index ed9061ab81..2e92754cad 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -70,10 +70,11 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_audioHandle, audioStream); return sampleLen; } else { - warning("startAudio: unable to create stream for audio number %d, module %d", number, module); + // Don't throw a warning in this case. getAudioStream() already has. Some games + // do miss audio entries (perhaps because of a typo, or because they were simply + // forgotten). + return 0; } - - return 0; } int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { -- cgit v1.2.3 From cc243bae34c9aab022c113d0c09b7a70cb30f0c8 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Thu, 1 Jul 2010 17:47:46 +0000 Subject: KYRA/PC98: implement proper volume control (which distinguishes between music and sfx) svn-id: r50561 --- engines/kyra/sound_intern.h | 4 ++ engines/kyra/sound_towns.cpp | 129 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 123 insertions(+), 10 deletions(-) diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index f4aab4db29..a229dc310d 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -180,6 +180,8 @@ public: int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx) { return -1; } void playSoundEffect(uint8); + void updateVolumeSettings(); + protected: int _lastTrack; uint8 *_musicTrackData; @@ -207,6 +209,8 @@ public: int32 voicePlay(const char *file, Audio::SoundHandle *handle, uint8 volume, bool isSfx); void playSoundEffect(uint8 track); + void updateVolumeSettings(); + protected: Audio::AudioStream *_currentSFX; int _lastTrack; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index b0d3f994f2..298264c730 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -23,7 +23,9 @@ * */ +#include "common/config-manager.h" #include "common/system.h" + #include "kyra/resource.h" #include "kyra/sound_intern.h" #include "kyra/screen.h" @@ -1491,6 +1493,9 @@ public: void nextTick(int32 *buffer, uint32 bufferSize); + void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + uint8 chanEnable() const { return _chanEnable; } private: void updatesRegs(); @@ -1530,6 +1535,11 @@ private: uint8 **_reg; + uint16 _volumeA; + uint16 _volumeB; + int _volMaskA; + int _volMaskB; + bool _ready; }; @@ -1544,6 +1554,9 @@ public: void nextTick(int32 *buffer, uint32 bufferSize); + void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + private: struct RhtChannel { const uint8 *data; @@ -1579,6 +1592,11 @@ private: uint8 **_reg; + uint16 _volumeA; + uint16 _volumeB; + int _volMaskA; + int _volMaskB; + bool _ready; }; @@ -1605,20 +1623,27 @@ public: int getRate() const { return _mixer->getOutputRate(); } protected: - void generateTables(); - void toggleRegProtection(bool prot) { _regProtectionFlag = prot; } uint8 readSSGStatus() { return _ssg->chanEnable(); } virtual void timerCallbackA() = 0; virtual void timerCallbackB() = 0; + // The audio driver can store and apply two different audio settings + // (usually for music and sound effects). The channel mask will determine + // which channels get effected by the setting. The first bits will be + // the normal opn channels, the next bits the ssg channels and the final + // bit the rhythm channel. + void setVolumeIntern(int volA, int volB); + void setVolumeChannelMasks(int channelMaskA, int channelMaskB); + const int _numChan; const int _numSSG; const bool _hasPercussion; Common::Mutex _mutex; private: + void generateTables(); void nextTick(int32 *buffer, uint32 bufferSize); void generateOutput(int32 &leftSample, int32 &rightSample, int32 *del, int32 *feed); @@ -1671,6 +1696,9 @@ private: OpnTimer _timers[2]; + int _volMaskA, _volMaskB; + uint16 _volumeA, _volumeB; + const float _baserate; uint32 _timerbase; @@ -1710,6 +1738,9 @@ public: bool looping() { return _looping == _updateChannelsFlag ? true : false; } bool musicPlaying() { return _musicPlaying; } + void setMusicVolume(int volume) { _musicVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } + void setSoundEffectVolume(int volume) { _sfxVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } + protected: void startSoundEffect(); @@ -1752,6 +1783,9 @@ protected: uint8 *_sfxData; uint16 _sfxOffsets[2]; + uint16 _musicVolume; + uint16 _sfxVolume; + static const uint8 _drvTables[]; bool _ready; @@ -2558,7 +2592,8 @@ bool TownsPC98_OpnChannelPCM::control_ff_endOfTrack(uint8 para) { TownsPC98_OpnSquareSineSource::TownsPC98_OpnSquareSineSource(const uint32 timerbase) : _tlTable(0), _tleTable(0), _updateRequest(-1), _tickLength(timerbase * 27), _ready(0), _reg(0), _rand(1), _outN(1), _nTick(0), _evpUpdateCnt(0), _evpTimer(0x1f), _pReslt(0x1f), _attack(0), _cont(false), _evpUpdate(true), - _timer(0), _noiseGenerator(0), _chanEnable(0) { + _timer(0), _noiseGenerator(0), _chanEnable(0), + _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { memset(_channels, 0, sizeof(_channels)); memset(_updateRequestBuf, 0, sizeof(_updateRequestBuf)); @@ -2718,6 +2753,13 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { } finOut /= 3; + + if ((1 << i) & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if ((1 << i) & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + buffer[i << 1] += finOut; buffer[(i << 1) + 1] += finOut; } @@ -2733,7 +2775,7 @@ void TownsPC98_OpnSquareSineSource::updatesRegs() { } TownsPC98_OpnPercussionSource::TownsPC98_OpnPercussionSource(const uint32 timerbase) : - _tickLength(timerbase * 2), _timer(0), _ready(false) { + _tickLength(timerbase * 2), _timer(0), _ready(false), _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { memset(_rhChan, 0, sizeof(RhtChannel) * 6); _reg = new uint8 *[40]; @@ -2892,6 +2934,12 @@ void TownsPC98_OpnPercussionSource::nextTick(int32 *buffer, uint32 bufferSize) { finOut <<= 1; + if (1 & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if (1 & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + buffer[i << 1] += finOut; buffer[(i << 1) + 1] += finOut; } @@ -2928,6 +2976,7 @@ TownsPC98_OpnCore::TownsPC98_OpnCore(Audio::Mixer *mixer, OpnType type) : _numChan(type == OD_TYPE26 ? 3 : 6), _numSSG(type == OD_TOWNS ? 0 : 3), _hasPercussion(type == OD_TYPE86 ? true : false), _oprRates(0), _oprRateshift(0), _oprAttackDecay(0), _oprFrq(0), _oprSinTbl(0), _oprLevelOut(0), _oprDetune(0), _baserate(55125.0f / (float)mixer->getOutputRate()), + _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), _regProtectionFlag(false), _ready(false) { memset(&_timers[0], 0, sizeof(OpnTimer)); @@ -2978,7 +3027,7 @@ bool TownsPC98_OpnCore::init() { _prc->init(_percussionData); } - _mixer->playStream(Audio::Mixer::kMusicSoundType, + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); _ready = true; @@ -3229,6 +3278,26 @@ int TownsPC98_OpnCore::readBuffer(int16 *buffer, const int numSamples) { return numSamples; } +void TownsPC98_OpnCore::setVolumeIntern(int volA, int volB) { + Common::StackLock lock(_mutex); + _volumeA = volA; + _volumeB = volB; + if (_ssg) + _ssg->setVolumeIntern(volA, volB); + if (_prc) + _prc->setVolumeIntern(volA, volB); +} + +void TownsPC98_OpnCore::setVolumeChannelMasks(int channelMaskA, int channelMaskB) { + Common::StackLock lock(_mutex); + _volMaskA = channelMaskA; + _volMaskB = channelMaskB; + if (_ssg) + _ssg->setVolumeChannelMasks(_volMaskA >> _numChan, _volMaskB >> _numChan); + if (_prc) + _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); +} + void TownsPC98_OpnCore::generateTables() { delete[] _oprRates; _oprRates = new uint8[128]; @@ -3389,6 +3458,12 @@ void TownsPC98_OpnCore::nextTick(int32 *buffer, uint32 bufferSize) { int32 finOut = (output << 2) / ((_numChan + _numSSG - 3) / 3); + if ((1 << i) & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if ((1 << i) & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + if (_chanInternal[i].enableLeft) *leftSample += finOut; @@ -3409,11 +3484,14 @@ TownsPC98_OpnDriver::TownsPC98_OpnDriver(Audio::Mixer *mixer, OpnType type) : To _updateChannelsFlag(type == OD_TYPE26 ? 0x07 : 0x3F), _finishedChannelsFlag(0), _updateSSGFlag(type == OD_TOWNS ? 0x00 : 0x07), _finishedSSGFlag(0), _updateRhythmFlag(type == OD_TYPE86 ? 0x01 : 0x00), _finishedRhythmFlag(0), - _updateSfxFlag(type == OD_TOWNS ? 0x00 : 0x06), _finishedSfxFlag(0), + _updateSfxFlag(0), _finishedSfxFlag(0), _musicTickCounter(0), + _musicVolume(255), _sfxVolume(255), + _musicPlaying(false), _sfxPlaying(false), _fading(false), _looping(0), _ready(false) { + _sfxOffsets[0] = _sfxOffsets[1] = 0; } @@ -3451,6 +3529,8 @@ bool TownsPC98_OpnDriver::init() { TownsPC98_OpnCore::init(); + setVolumeChannelMasks(-1, 0); + _channels = new TownsPC98_OpnChannel *[_numChan]; for (int i = 0; i < _numChan; i++) { int ii = i * 6; @@ -3665,8 +3745,11 @@ void TownsPC98_OpnDriver::timerCallbackA() { _trackPtr = _musicBuffer; } - if (_finishedSfxFlag == _updateSfxFlag) + if (_updateSfxFlag && _finishedSfxFlag == _updateSfxFlag) { _sfxPlaying = false; + _updateSfxFlag = 0; + setVolumeChannelMasks(-1, 0); + } } void TownsPC98_OpnDriver::setMusicTempo(uint8 tempo) { @@ -3681,14 +3764,21 @@ void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { } void TownsPC98_OpnDriver::startSoundEffect() { - for (int i = 0; i < 2; i++) { + int i = 0; + for (; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); _sfxChannels[i]->reset(); _sfxChannels[i]->loadData(_sfxData + _sfxOffsets[i]); + _updateSfxFlag |= _sfxChannels[i]->_idFlag; } } + int volFlags = 0; + for (i = 0; i < (_numChan + _numSSG - 2); i++) + volFlags |= (1 << i); + setVolumeChannelMasks(volFlags, ~volFlags); + _sfxData = 0; } @@ -4049,7 +4139,9 @@ SoundPC98::~SoundPC98() { bool SoundPC98::init() { _driver = new TownsPC98_OpnDriver(_mixer, TownsPC98_OpnDriver::OD_TYPE26); - return _driver->init(); + bool reslt = _driver->init(); + updateVolumeSettings(); + return reslt; } void SoundPC98::loadSoundFile(uint file) { @@ -4122,6 +4214,13 @@ void SoundPC98::playSoundEffect(uint8 track) { _driver->loadSoundEffectData(_sfxTrackData, track); } +void SoundPC98::updateVolumeSettings() { + if (!_driver) + return; + + _driver->setMusicVolume(ConfMan.getInt("music_volume")); + _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); +} // KYRA 2 @@ -4160,7 +4259,9 @@ bool SoundTownsPC98_v2::init() { _useFmSfx = true; } - return _driver->init(); + bool reslt = _driver->init(); + updateVolumeSettings(); + return reslt; } void SoundTownsPC98_v2::loadSoundFile(Common::String file) { @@ -4315,6 +4416,14 @@ void SoundTownsPC98_v2::playSoundEffect(uint8 track) { _driver->loadSoundEffectData(_sfxTrackData, track); } +void SoundTownsPC98_v2::updateVolumeSettings() { + if (!_driver) + return; + + _driver->setMusicVolume(ConfMan.getInt("music_volume")); + _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); +} + // static resources const uint32 TownsPC98_OpnCore::_adtStat[] = { -- cgit v1.2.3 From 7f3b772938b7b7ab06d764eb47a52d01513f907a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 17:52:50 +0000 Subject: SCI: Added workarounds for 2 uninitialized reads in Jones floppy (EGA and VGA), and added information on the SQ6 uninitialized workarounds svn-id: r50562 --- engines/sci/engine/vm.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e7e16e5a35..32aad38880 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -344,6 +344,8 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // called when the game starts + { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // called when the game starts { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class @@ -355,8 +357,8 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, - { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, + { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts + { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From eb84a130adabde931f025da93c950638fe0316ef Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Thu, 1 Jul 2010 18:34:14 +0000 Subject: KYRA/PC98: minor cleanup svn-id: r50563 --- engines/kyra/sound_towns.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 298264c730..e50981c4c0 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -3764,8 +3764,8 @@ void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { } void TownsPC98_OpnDriver::startSoundEffect() { - int i = 0; - for (; i < 2; i++) { + _updateSfxFlag = 0; + for (int i = 0; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); _sfxChannels[i]->reset(); @@ -3775,7 +3775,7 @@ void TownsPC98_OpnDriver::startSoundEffect() { } int volFlags = 0; - for (i = 0; i < (_numChan + _numSSG - 2); i++) + for (int i = 0; i < (_numChan + _numSSG - 2); i++) volFlags |= (1 << i); setVolumeChannelMasks(volFlags, ~volFlags); -- cgit v1.2.3 From 1a675dcd86d7d3d3cae97c7e7b1bc81555af93f1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 1 Jul 2010 18:47:27 +0000 Subject: Add support for the 'fallback' MIDI in T7G's intro when the CD track cannot be found. The intro music in the Mac version now plays. svn-id: r50564 --- engines/groovie/groovie.cpp | 12 ++++++++---- engines/groovie/groovie.h | 2 ++ engines/groovie/music.cpp | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index e0760e1d41..9da413d362 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -110,7 +110,7 @@ Common::Error GroovieEngine::run() { // Prepare the font too switch (_gameDescription->version) { case kGroovieT7G: - if (_gameDescription->desc.platform == Common::kPlatformMacintosh) { + if (getPlatform() == Common::kPlatformMacintosh) { _macResFork = new Common::MacResManager(); if (!_macResFork->open(_gameDescription->desc.filesDescriptions[0].fileName)) error("Could not open %s as a resource fork", _gameDescription->desc.filesDescriptions[0].fileName); @@ -141,7 +141,7 @@ Common::Error GroovieEngine::run() { } // Create the music player - if (_gameDescription->desc.platform == Common::kPlatformMacintosh) + if (getPlatform() == Common::kPlatformMacintosh) _musicPlayer = new MusicPlayerMac(this); else _musicPlayer = new MusicPlayerXMI(this, _gameDescription->version == kGroovieT7G ? "fat" : "sample"); @@ -154,8 +154,8 @@ Common::Error GroovieEngine::run() { if (_gameDescription->version == kGroovieT7G) { // Run The 7th Guest's demo if requested if (ConfMan.hasKey("demo_mode") && ConfMan.getBool("demo_mode")) - filename = Common::String("demo.grv"); - else if (_gameDescription->desc.platform == Common::kPlatformMacintosh) + filename = "demo.grv"; + else if (getPlatform() == Common::kPlatformMacintosh) filename = "script.grv"; // Stored inside the executable's resource fork } else if (_gameDescription->version == kGroovieV2) { // Open the disk index @@ -307,6 +307,10 @@ Common::Error GroovieEngine::run() { return Common::kNoError; } +Common::Platform GroovieEngine::getPlatform() const { + return _gameDescription->desc.platform; +} + bool GroovieEngine::hasFeature(EngineFeature f) const { return (f == kSupportsRTL) || diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index 437debfd17..8ae5f4157f 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -82,6 +82,8 @@ public: GroovieEngine(OSystem *syst, const GroovieGameDescription *gd); ~GroovieEngine(); + Common::Platform getPlatform() const; + protected: // Engine APIs diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index f226ef3397..6959a6a6f1 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -111,6 +111,20 @@ void MusicPlayer::playCD(uint8 track) { // Play the track starting at the requested offset (1000ms = 75 frames) AudioCD.play(track - 1, 1, startms * 75 / 1000, 0); + + // If the audio is not playing from the CD, play the "fallback" MIDI. + // The Mac version has no CD tracks, so it will always use the MIDI. + if (!AudioCD.isPlaying()) { + if (track == 2) { + // Intro MIDI fallback + if (_vm->getPlatform() == Common::kPlatformMacintosh) + playSong(70); + else + playSong((19 << 10) | 36); // XMI.GJD, file 36 + } else if (track == 3) { + // TODO: Credits MIDI fallback + } + } } void MusicPlayer::startBackground() { -- cgit v1.2.3 From fa014867cfe6bde10467761e1241b646ecb0460f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 20:16:42 +0000 Subject: SCI: Mark the ShiftScreen, ListOps and ATan SCI1 kernel functions as unused (dummy) - we haven't seen them being used anywhere. Added a check and an error in case a kernel function which is considered to be unused is called. svn-id: r50567 --- engines/sci/engine/kernel.cpp | 17 +++-------------- engines/sci/engine/vm.cpp | 5 +++++ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index b0c369605e..58619986cb 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -170,18 +170,18 @@ static const char *s_defaultKernelNames[] = { /*0x6c*/ "Graph", /*0x6d*/ "Joystick", // End of kernel function table for SCI0 - /*0x6e*/ "ShiftScreen", + /*0x6e*/ "Dummy", // ShiftScreen /*0x6f*/ "Palette", /*0x70*/ "MemorySegment", /*0x71*/ "Intersections", // MoveCursor (SCI1 late), PalVary (SCI1.1) /*0x72*/ "Memory", - /*0x73*/ "ListOps", + /*0x73*/ "Dummy", // ListOps /*0x74*/ "FileIO", /*0x75*/ "DoAudio", /*0x76*/ "DoSync", /*0x77*/ "AvoidPath", /*0x78*/ "Sort", // StrSplit (SCI01) - /*0x79*/ "ATan", + /*0x79*/ "Dummy", // ATan /*0x7a*/ "Lock", /*0x7b*/ "StrSplit", /*0x7c*/ "GetMessage", // Message (SCI1.1) @@ -429,17 +429,6 @@ static SciKernelMapEntry s_kernelMap[] = { #endif }; -#if 0 - // Stub functions - /*09*/ { "Show", kShow, "i" }, - { "ShiftScreen", kShiftScreen, ".*" }, - { "ListOps", kListOps, ".*" }, - { "ATan", kATan, ".*" }, - { "Record", kRecord, ".*" }, - { "PlayBack", kPlayBack, ".*" }, - { "DbugStr", kDbugStr, ".*" }, -#endif - Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan), _invalid("") { loadSelectorNames(); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 32aad38880..49049585ee 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -852,6 +852,11 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { } warning("%s", warningMsg.c_str()); + + // Make sure that the game doesn't call a function that is considered unused. If + // that happens, error out. + if (kernelCall.origName == "Dummy") + error("Kernel function %d was called, which was considered to be unused", kernelFuncNr); } } -- cgit v1.2.3 From 0e3f923f78055d0ffe76d5020392653728496f02 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 20:32:41 +0000 Subject: The Shivers demo calls the debug kernel function 0x83 (PrintDebug), thus it isn't unused (thanks to clone2727 for pointing that out) svn-id: r50568 --- engines/sci/engine/kernel32.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 25a822f77d..564e0b76c3 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -336,7 +336,7 @@ static const char *sci21_default_knames[] = { /*0x80*/ "Dummy", /*0x81*/ "Dummy", /*0x82*/ "Dummy", - /*0x83*/ "Dummy", + /*0x83*/ "PrintDebug", // used by the Shivers 2 demo /*0x84*/ "Dummy", /*0x85*/ "Dummy", /*0x86*/ "Dummy", -- cgit v1.2.3 From d5e037e703dfa5ab64bb390e31f817deb85cfb02 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 21:08:38 +0000 Subject: Added some slight fixes for the RAMA demo, which starts now, though it dies horribly when clicking on anything svn-id: r50569 --- engines/sci/engine/features.cpp | 12 ++++++++++++ engines/sci/engine/kernel32.cpp | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index f0abdde694..fee6e69da7 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -405,6 +405,18 @@ SciVersion GameFeatures::detectGfxFunctionsType() { #ifdef ENABLE_SCI32 bool GameFeatures::autoDetectSci21KernelType() { + // First, check if the Sound object is loaded + reg_t soundObjAddr = _segMan->findObjectByName("Sound"); + if (soundObjAddr.isNull()) { + // Usually, this means that the Sound object isn't loaded yet. + // This case doesn't occur in early SCI2.1 games, and we've only + // seen it happen in the RAMA demo, thus we can assume that the + // game is using a SCI2.1 table + warning("autoDetectSci21KernelType(): Sound object not loaded, assuming a SCI2.1 table"); + _sci21KernelType = SCI_VERSION_2_1; + return true; + } + // Look up the script address reg_t addr = getDetectionAddr("Sound", SELECTOR(play)); diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 564e0b76c3..2d492eb3ee 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -463,6 +463,13 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) { return argv[1]; } case 6: { // Cpy + if (s->_segMan->getSegmentObj(argv[1].segment)->getType() != SEG_TYPE_ARRAY || + s->_segMan->getSegmentObj(argv[3].segment)->getType() != SEG_TYPE_ARRAY) { + // Happens in the RAMA demo + warning("kArray(Cpy): Request to copy a segment which isn't an array, ignoring"); + return NULL_REG; + } + SciArray *array1 = s->_segMan->lookupArray(argv[1]); SciArray *array2 = s->_segMan->lookupArray(argv[3]); uint32 index1 = argv[2].toUint16(); -- cgit v1.2.3 From 4c04375c8c39a3be660096d66d9d31dc5dd93a93 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 1 Jul 2010 22:09:19 +0000 Subject: SCI: added another workaround for uninit temps, this time for jones/cd svn-id: r50574 --- engines/sci/engine/vm.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 49049585ee..4e26839d16 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -344,8 +344,9 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // called when the game starts - { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // called when the game starts + { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class -- cgit v1.2.3 From 32dfd0cedce13f00b512d87b3b9bb7c383cc3b45 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 1 Jul 2010 22:23:05 +0000 Subject: SCI: adding jones/ega to detection tables svn-id: r50575 --- engines/sci/detection_tables.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index d2136666a7..e761b64991 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -768,7 +768,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Jones in the Fast Lane - English DOS + // Jones in the Fast Lane EGA - English DOS + // SCI interpreter version 1.000.172 (not 100% sure FIXME) + {"jones", "", { + {"resource.map", 0, "be4cf9e8c1e253623ef35ae3b8a1d998", 1800}, + {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 202105}, + {"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 341771}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + + // Jones in the Fast Lane VGA - English DOS // SCI interpreter version 1.000.172 {"jones", "", { {"resource.map", 0, "65cbe19b36fffc71c8e7b2686bd49ad7", 1800}, -- cgit v1.2.3 From 4dd02d2f4ab05839f86db9102c954ca34bfc1c34 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Thu, 1 Jul 2010 22:38:36 +0000 Subject: Support the CD kernel call (stub) and add the TRUE_REG constant. Would be nice to use this constant in pre-existing code. svn-id: r50577 --- engines/sci/engine/kernel.cpp | 1 + engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel32.cpp | 19 ++++++++++++++++++- engines/sci/engine/vm_types.h | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 58619986cb..47f7ac3bc8 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -425,6 +425,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL, NULL }, { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, { MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(CD), SIG_EVERYWHERE, ".*", NULL, NULL }, { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } #endif }; diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index a3cf7b5f91..cb66aa9f4d 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -449,6 +449,7 @@ reg_t kList(EngineState *s, int argc, reg_t *argv); reg_t kRobot(EngineState *s, int argc, reg_t *argv); reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv); reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); +reg_t kCD(EngineState *s, int argc, reg_t *argv); #endif diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 2d492eb3ee..8b854dbca1 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -898,7 +898,7 @@ reg_t kInPolygon(EngineState *s, int argc, reg_t *argv) { reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { // TODO: argument 0 is usually 0, and arguments 1 and 2 are usually 1 switch (argv[0].toUint16()) { - case 0: + case 0: { if (argc != 4) { warning("kCreateTextBitmap(0): expected 4 arguments, got %i", argc); return NULL_REG; @@ -907,6 +907,23 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); debug("kCreateTextBitmap: %s", text.c_str()); } + default: + warning("CreateTextBitmap(%d)", argv[0].toUint16()); + } + + return NULL_REG; +} + +reg_t kCD(EngineState *s, int argc, reg_t *argv) +{ + // TODO: Stub + switch (argv[0].toUint16()) { + case 0: + // Return whether the contents of disc argv[1] is available. + return TRUE_REG; + default: + warning("CD(%d)", argv[0].toUint16()); + } return NULL_REG; } diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index 614b6f247d..828fba3d7d 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -87,6 +87,7 @@ enum { extern const reg_t NULL_REG; extern const reg_t SIGNAL_REG; +extern const reg_t TRUE_REG; // Selector ID typedef int Selector; -- cgit v1.2.3 From e47dee2faaa04286c39ad5e8d2f066157188cb23 Mon Sep 17 00:00:00 2001 From: Lars Skovlund Date: Thu, 1 Jul 2010 22:44:36 +0000 Subject: Accidentally missed this file in commit 50577 svn-id: r50578 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4e26839d16..cdbdd0beb1 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -44,7 +44,7 @@ namespace Sci { const reg_t NULL_REG = {0, 0}; const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; - +const reg_t TRUE_REG = {0, 1}; //#define VM_DEBUG_SEND #define SCI_XS_CALLEE_LOCALS ((SegmentId)-1) -- cgit v1.2.3 From 21450f1a2e6033c706c7027a255844ae83a51f92 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 1 Jul 2010 22:56:02 +0000 Subject: Added a workaround for an unitialized variable in GK2 svn-id: r50580 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index cdbdd0beb1..45cb117bcf 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -344,6 +344,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts -- cgit v1.2.3 From ac351c175f7201e49f175e80105bdc704a9ea02f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 23:05:13 +0000 Subject: Fix code formatting svn-id: r50581 --- engines/sci/engine/kernel32.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index 8b854dbca1..eab1b90139 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -914,8 +914,7 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } -reg_t kCD(EngineState *s, int argc, reg_t *argv) -{ +reg_t kCD(EngineState *s, int argc, reg_t *argv) { // TODO: Stub switch (argv[0].toUint16()) { case 0: -- cgit v1.2.3 From 762ff57e0dd906e7a256c1d832c67f345faf8883 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 23:12:28 +0000 Subject: NDS: Some tweaks for compiling via std build system svn-id: r50582 --- backends/platform/ds/arm9/source/portdefs.h | 7 +++++++ configure | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 5472b711b8..2590758c86 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -52,10 +52,17 @@ typedef signed int s32; #define CT_NO_TRANSPARENCY +#ifndef DISABLE_TEXT_CONSOLE #define DISABLE_TEXT_CONSOLE +#endif + +#ifndef DISABLE_COMMAND_LINE #define DISABLE_COMMAND_LINE +#endif +#ifndef DISABLE_COMMAND_LINE #define STREAM_AUDIO_FROM_DISK +#endif //#undef assert //#define assert(expr) consolePrintf("Asserted!") diff --git a/configure b/configure index 2674c0af18..4741340e09 100755 --- a/configure +++ b/configure @@ -1138,9 +1138,12 @@ else CXX= for compiler in $compilers; do if test_compiler $compiler; then + echo "success testing compiler: $1" >> "$TMPLOG" CXX=$compiler echo $CXX break + else + echo "failure testing compiler: $1" >> "$TMPLOG" fi done fi @@ -1389,7 +1392,7 @@ case $_host_os in ;; nds) # TODO nds - DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" + DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT -I$DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" ;; os2-emx*) DEFINES="$DEFINES -DUNIX" @@ -1572,7 +1575,7 @@ if test -n "$_host"; then # TODO: Maybe rename nds -> ds (would be more consistent with other backends) DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" _need_memalign=yes _backend="nds" @@ -2444,6 +2447,7 @@ case $_backend in ;; nds) # TODO nds + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source -I$(srcdir)/backends/platform/ds/commoninclude' ;; null) DEFINES="$DEFINES -DUSE_NULL_DRIVER" @@ -2512,7 +2516,7 @@ if test "$have_gcc" = yes ; then case $_host_os in # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ - mingw* | dreamcast | wii | gamecube | psp | wince | amigaos* | android) + mingw* | dreamcast | wii | gamecube | nds | psp | wince | amigaos* | android) CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) -- cgit v1.2.3 From 4fabca98a58c0a11a056195107822dcbdea79d9e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 1 Jul 2010 23:12:45 +0000 Subject: Remove -Wcast-align -- it cause many spurious warnings on several ports svn-id: r50583 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8c3882da32..6b64759ebd 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ ifeq "$(HAVE_GCC)" "1" # Turn off some annoying and not-so-useful warnings CXXFLAGS+= -Wno-long-long -Wno-multichar -Wno-unknown-pragmas -Wno-reorder # Enable even more warnings... - CXXFLAGS+= -Wpointer-arith -Wcast-qual -Wcast-align + CXXFLAGS+= -Wpointer-arith -Wcast-qual CXXFLAGS+= -Wshadow -Wimplicit -Wnon-virtual-dtor -Wwrite-strings # Currently we disable this gcc flag, since it will also warn in cases, -- cgit v1.2.3 From 8b0f49b801afbef5ae2523078e82963c1120b3f5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 1 Jul 2010 23:13:42 +0000 Subject: Only print the ambiguous object notice in findObjectByName if we didn't specify an index. svn-id: r50584 --- engines/sci/engine/seg_manager.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 185a266203..135ad38792 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -300,14 +300,11 @@ reg_t SegManager::findObjectByName(const Common::String &name, int index) { if (result.empty()) return NULL_REG; - if (result.size() > 1) { + if (result.size() > 1 && index < 0) { printf("Ambiguous:\n"); for (i = 0; i < result.size(); i++) printf(" %3x: [%04x:%04x] %s\n", i, PRINT_REG(result[i]), name.c_str()); - if (index < 0) { - printf("Ambiguous: Aborting.\n"); - return NULL_REG; // Ambiguous - } + return NULL_REG; // Ambiguous } if (index < 0) -- cgit v1.2.3 From b252d5f0b97e229e73ed1c63b48d8c2e7896775a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 08:53:51 +0000 Subject: getString() on a NULL pointer is an empty string (verified in SCI2.1) svn-id: r50591 --- engines/sci/engine/seg_manager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 135ad38792..339920936f 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -789,6 +789,9 @@ size_t SegManager::strlen(reg_t str) { Common::String SegManager::getString(reg_t pointer, int entries) { Common::String ret; + if (pointer.isNull()) + return ret; // empty text + SegmentRef src_r = dereference(pointer); if (!src_r.isValid()) { warning("SegManager::getString(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(pointer)); -- cgit v1.2.3 From 91a414dbc9f712484de2e5dac66ae3dafe467e6a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 08:55:12 +0000 Subject: Extended the SCI2 text drawing hack for SCI2.1 too, and added font caching svn-id: r50592 --- engines/sci/graphics/frameout.cpp | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 48a7742f14..9ce4474ee3 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -278,29 +278,23 @@ void GfxFrameout::kernelFrameout() { // Most likely a text entry // This draws text the "SCI0-SCI11" way. In SCI2, text is prerendered in kCreateTextBitmap // TODO: rewrite this the "SCI2" way (i.e. implement the text buffer to draw inside kCreateTextBitmap) - // This doesn't work for SCI2.1 games... - if (getSciVersion() == SCI_VERSION_2) { - Kernel *kernel = g_sci->getKernel(); - if (lookupSelector(_segMan, itemEntry->object, kernel->_selectorCache.text, NULL, NULL) == kSelectorVariable) { - Common::String text = _segMan->getString(readSelector(_segMan, itemEntry->object, SELECTOR(text))); - int16 fontRes = readSelectorValue(_segMan, itemEntry->object, SELECTOR(font)); - GfxFont *font = new GfxFontFromResource(_resMan, _screen, fontRes); - bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); - uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); - uint16 curX = itemEntry->x; - uint16 curY = itemEntry->y; - for (uint32 i = 0; i < text.size(); i++) { - unsigned char curChar = text[i]; - // TODO: proper text splitting... this is a hack - if ((curChar == ' ' && i > 0 && text[i - i] == ' ') || curChar == '\n' || - (curX + font->getCharWidth(curChar) > _screen->getWidth())) { - curY += font->getHeight(); - curX = itemEntry->x; - } - font->draw(curChar, curY, curX, foreColor, dimmed); - curX += font->getCharWidth(curChar); + if (lookupSelector(_segMan, itemEntry->object, SELECTOR(text), NULL, NULL) == kSelectorVariable) { + Common::String text = _segMan->getString(readSelector(_segMan, itemEntry->object, SELECTOR(text))); + GfxFont *font = _cache->getFont(readSelectorValue(_segMan, itemEntry->object, SELECTOR(font))); + bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); + uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); + uint16 curX = itemEntry->x; + uint16 curY = itemEntry->y; + for (uint32 i = 0; i < text.size(); i++) { + unsigned char curChar = text[i]; + // TODO: proper text splitting... this is a hack + if ((curChar == ' ' && i > 0 && text[i - i] == ' ') || curChar == '\n' || + (curX + font->getCharWidth(curChar) > _screen->getWidth())) { + curY += font->getHeight(); + curX = itemEntry->x; } - delete font; + font->draw(curChar, curY, curX, foreColor, dimmed); + curX += font->getCharWidth(curChar); } } } -- cgit v1.2.3 From b8ff75047bdc9dfa591c66ceab6f421cb92ff89f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 2 Jul 2010 09:09:22 +0000 Subject: SCI: changing adjusting of upscaled hires box coordinates svn-id: r50593 --- engines/sci/graphics/paint16.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 48967c6888..90b05c68a6 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -317,11 +317,12 @@ reg_t GfxPaint16::bitsSave(const Common::Rect &rect, byte screenMask) { return NULL_REG; if (screenMask == GFX_SCREEN_MASK_DISPLAY) { + // The coordinates we are given are actually up-to-including right/bottom - we extend accordingly + workerRect.bottom++; + workerRect.right++; // Adjust rect to upscaled hires, but dont adjust according to port _screen->adjustToUpscaledCoordinates(workerRect.top, workerRect.left); _screen->adjustToUpscaledCoordinates(workerRect.bottom, workerRect.right); - workerRect.bottom++; - workerRect.right++; } else { _ports->offsetRect(workerRect); } -- cgit v1.2.3 From 7b6be52f227aeaf2b544b3b35dd872f3643b1ff4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 2 Jul 2010 09:50:33 +0000 Subject: SCI: added possible workaround or final solution for hires portraits not fully removed from screen in kq6 - needs to get investigated further but this will get a little bit difficult svn-id: r50594 --- engines/sci/graphics/screen.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index c446a98768..a314405eb1 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -438,6 +438,11 @@ void GfxScreen::bitsRestore(byte *memoryPtr) { if (!_upscaledHires) error("bitsRestore() called w/o being in upscaled hires mode"); bitsRestoreScreen(rect, memoryPtr, _displayScreen, _displayWidth); + // WORKAROUND - we are not sure what sierra is doing. If we don't do this here, portraits won't get fully removed + // from screen. Some lowres showBits() call is used for that and it's not covering the whole area + // We would need to find out inside the kq6 windows interpreter, but this here works already and seems not to have + // any side-effects. The whole hires is hacked into the interpreter, so maybe this is even right. + copyDisplayRectToScreen(rect); } } -- cgit v1.2.3 From 79768098b13e20bade076b8a36c9d8cd16514b2a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 10:18:11 +0000 Subject: Added handling for kLock called with resource id -1 (unlock all resources of the requested type). Happens e.g. in KQ6 and LSL6 svn-id: r50595 --- engines/sci/engine/kscripts.cpp | 34 ++++++++++++++++++++++++---------- engines/sci/resource.h | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 4f4df7d875..4a50553b34 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -86,16 +86,30 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { g_sci->getResMan()->findResource(id, 1); break; case 0 : - which = g_sci->getResMan()->findResource(id, 0); - - if (which) - g_sci->getResMan()->unlockResource(which); - else { - if (id.getType() == kResourceTypeInvalid) - warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type); - else - // Happens in CD games (e.g. LSL6CD) with the message resource - warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); + if (id.getNumber() == 0xFFFF) { + // Unlock all resources of the requested type + Common::List *resources = g_sci->getResMan()->listResources(type); + Common::List::iterator itr = resources->begin(); + + while (itr != resources->end()) { + Resource *res = g_sci->getResMan()->testResource(*itr); + if (res->isLocked()) + g_sci->getResMan()->unlockResource(res); + ++itr; + } + + } else { + which = g_sci->getResMan()->findResource(id, 0); + + if (which) + g_sci->getResMan()->unlockResource(which); + else { + if (id.getType() == kResourceTypeInvalid) + warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type); + else + // Happens in CD games (e.g. LSL6CD) with the message resource + warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); + } } break; } diff --git a/engines/sci/resource.h b/engines/sci/resource.h index a13781b157..f66b5b3956 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -210,7 +210,7 @@ public: inline ResourceType getType() const { return _id.getType(); } inline uint16 getNumber() const { return _id.getNumber(); } - + bool isLocked() const { return _status == kResStatusLocked; } /** * Write the resource to the specified stream. * This method is used only by the "dump" debugger command. -- cgit v1.2.3 From dcb92c83521794af87fc64f941e7d3bf71818c36 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 10:38:42 +0000 Subject: Add checks for null reference to strncpy() and strlen() - happens for example when trying to talk to inanimate objects in KQ6 svn-id: r50596 --- engines/sci/engine/seg_manager.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 339920936f..ef2279e492 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -643,6 +643,14 @@ void SegManager::strncpy(reg_t dest, const char* src, size_t n) { } void SegManager::strncpy(reg_t dest, reg_t src, size_t n) { + if (src.isNull()) { + // Clear target string instead. + if (n > 0) + strcpy(dest, ""); + + return; // empty text + } + SegmentRef dest_r = dereference(dest); const SegmentRef src_r = dereference(src); if (!src_r.isValid()) { @@ -770,6 +778,9 @@ void SegManager::memcpy(byte *dest, reg_t src, size_t n) { } size_t SegManager::strlen(reg_t str) { + if (str.isNull()) + return 0; // empty text + SegmentRef str_r = dereference(str); if (!str_r.isValid()) { warning("Attempt to call strlen on invalid pointer %04x:%04x", PRINT_REG(str)); -- cgit v1.2.3 From 7fa26648283b1940f952c33251c27eb38d5b89e7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 14:39:13 +0000 Subject: Some slight fixes so that Phantom/Dragon start again svn-id: r50598 --- engines/m4/globals.cpp | 4 +++- engines/m4/m4.cpp | 15 +++++++-------- engines/m4/mads_scene.cpp | 43 ++++++++++++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index b9039e3afd..fb95adf29f 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -528,7 +528,9 @@ void MadsObject::load(Common::SeekableReadStream *stream) { roomNumber = READ_LE_UINT16(&obj[2]); article = (MADSArticles)obj[4]; vocabCount = obj[5] & 0x7f; - assert(vocabCount <= 3); + // Phantom / Dragon + if (vocabCount > 3) + warning("MadsObject::load(), vocab cound > 3 (it's %d)", vocabCount); for (int i = 0; i < vocabCount; ++i) { vocabList[i].flags1 = obj[6 + i * 4]; diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index fc1caec883..f5c6d260a9 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -537,19 +537,18 @@ Common::Error MadsEngine::run() { //for (int i = 0; i < _globals->getMessagesSize(); i++) //printf("%s\n----------\n", _globals->loadMessage(i)); - if ((getGameType() == GType_RexNebular) || (getGameType() == GType_DragonSphere)) { + if (getGameType() == GType_RexNebular) { _scene = NULL; loadMenu(MAIN_MENU); - } else { + // Test code _scene = new MadsScene(this); - if (getGameType() == GType_DragonSphere) { - _scene->loadScene(FIRST_SCENE); - } else if (getGameType() == GType_Phantom) { - //_scene->loadScene(FIRST_SCENE); - _scene->loadScene(106); // a more interesting scene - } + startScene(FIRST_SCENE); + RGBList *_bgPalData; + _scene->loadBackground(FIRST_SCENE, &_bgPalData); + _palette->addRange(_bgPalData); + _scene->translate(_bgPalData); _scene->show(); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 73388a2325..f4581ed629 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -129,11 +129,13 @@ void MadsScene::loadScene(int sceneNumber) { // Add the scene if necessary to the list of scenes that have been visited _vm->globals()->addVisitedScene(sceneNumber); - // Secondary scene load routine - loadScene2("*I0.AA"); + if (_vm->getGameType() == GType_RexNebular) { + // Secondary scene load routine + loadScene2("*I0.AA"); - // Do any scene specific setup - _sceneLogic.enterScene(); + // Do any scene specific setup + _sceneLogic.enterScene(); + } // Purge resources _vm->res()->purge(); @@ -234,12 +236,14 @@ void MadsScene::leftClick(int x, int y) { } void MadsScene::rightClick(int x, int y) { - // ***DEBUG*** - sample dialog display - int idx = 3; //_madsVm->_globals->messageIndexOf(0x277a); - const char *msg = _madsVm->globals()->loadMessage(idx); - Dialog *dlg = new Dialog(_vm, msg, "TEST DIALOG"); - _vm->_viewManager->addView(dlg); - _vm->_viewManager->moveToFront(dlg); + if (_vm->getGameType() == GType_RexNebular) { + // ***DEBUG*** - sample dialog display + int idx = 3; //_madsVm->_globals->messageIndexOf(0x277a); + const char *msg = _madsVm->globals()->loadMessage(idx); + Dialog *dlg = new Dialog(_vm, msg, "TEST DIALOG"); + _vm->_viewManager->addView(dlg); + _vm->_viewManager->moveToFront(dlg); + } } void MadsScene::setAction(int action, int objectId) { @@ -338,7 +342,8 @@ void MadsScene::loadPlayerSprites(const char *prefix) { } } - error("Couldn't find player sprites"); + // Phantom/Dragon + warning("Couldn't find player sprites"); } enum boxSprites { @@ -646,8 +651,20 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su // Basic scene info Common::SeekableReadStream *stream = sceneInfo.getItemStream(0); - int resSceneId = stream->readUint16LE(); - assert(resSceneId == sceneNumber); + if (_vm->getGameType() == GType_RexNebular) { + int resSceneId = stream->readUint16LE(); + assert(resSceneId == sceneNumber); + } else { + char roomFilename[10]; + char roomFilenameExpected[10]; + sprintf(roomFilenameExpected, "*RM%d", sceneNumber); + + stream->read(roomFilename, 6); + roomFilename[6] = 0; + assert(!strcmp(roomFilename, roomFilenameExpected)); + } + + // TODO: The following is wrong for Phantom/Dragon artFileNum = stream->readUint16LE(); depthStyle = stream->readUint16LE(); width = stream->readUint16LE(); -- cgit v1.2.3 From c1aecd0b9b32efb3a90f653eb36102f18543b49e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 2 Jul 2010 15:58:09 +0000 Subject: SCI: change drawing of fonts, so that we never do triple pixel line duplications. sierra didn't do this, but it looks much better - "fixes" gk1, kq6 font rendering when running in hires svn-id: r50599 --- engines/sci/graphics/font.cpp | 4 ++-- engines/sci/graphics/screen.cpp | 21 +++++++++++++++++++++ engines/sci/graphics/screen.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/font.cpp b/engines/sci/graphics/font.cpp index 91cf01c912..ce4c1fafb3 100644 --- a/engines/sci/graphics/font.cpp +++ b/engines/sci/graphics/font.cpp @@ -82,7 +82,7 @@ void GfxFontFromResource::draw(uint16 chr, int16 top, int16 left, byte color, bo int charWidth = MIN(getCharWidth(chr), _screen->getWidth() - left); int charHeight = MIN(getCharHeight(chr), _screen->getHeight() - top); byte b = 0, mask = 0xFF; - int y = top; + int y = 0; byte *pIn = getCharData(chr); for (int i = 0; i < charHeight; i++, y++) { @@ -92,7 +92,7 @@ void GfxFontFromResource::draw(uint16 chr, int16 top, int16 left, byte color, bo if ((done & 7) == 0) // fetching next data byte b = *(pIn++) & mask; if (b & 0x80) // if MSB is set - paint it - _screen->putPixel(left + done, y, 1, color, 0, 0); + _screen->putFontPixel(top, left + done, y, color); b = b << 1; } } diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index a314405eb1..1d3a4ea1f7 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -223,6 +223,27 @@ void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority, _controlScreen[offset] = control; } +/** + * This is used to put font pixels onto the screen - we adjust differently, so that we won't + * do triple pixel lines in any case on upscaled hires. That way the font will not get distorted + * Sierra SCI didn't do this + */ +void GfxScreen::putFontPixel(int startingY, int x, int y, byte color) { + int offset = (startingY + y) * _width + x; + + _visualScreen[offset] = color; + if (!_upscaledHires) { + _displayScreen[offset] = color; + } else { + int displayOffset = (_upscaledMapping[startingY] + y * 2) * _displayWidth + x * 2; + _displayScreen[displayOffset] = color; + _displayScreen[displayOffset + 1] = color; + displayOffset += _displayWidth; + _displayScreen[displayOffset] = color; + _displayScreen[displayOffset + 1] = color; + } +} + /** * This will just change a pixel directly on displayscreen. It is supposed to be * only used on upscaled-Hires games where hires content needs to get drawn ONTO diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 113cf911a6..900c338bb2 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -83,6 +83,7 @@ public: byte getDrawingMask(byte color, byte prio, byte control); void putPixel(int x, int y, byte drawMask, byte color, byte prio, byte control); + void putFontPixel(int startingY, int x, int y, byte color); void putPixelOnDisplay(int x, int y, byte color); void drawLine(Common::Point startPoint, Common::Point endPoint, byte color, byte prio, byte control); void drawLine(int16 left, int16 top, int16 right, int16 bottom, byte color, byte prio, byte control) { -- cgit v1.2.3 From 1beff1a599064d90fd0f1a2accd627e7e780fd68 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 16:52:09 +0000 Subject: Added a special case for KQ6 hires in the thumbnail creation code, which runs at a resolution of 640x440 svn-id: r50600 --- graphics/scaler/thumbnail_intern.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp index 12048249f0..a27b77ccbb 100644 --- a/graphics/scaler/thumbnail_intern.cpp +++ b/graphics/scaler/thumbnail_intern.cpp @@ -71,6 +71,17 @@ void createThumbnail_4(const uint8 *src, uint32 srcPitch, uint8 *dstPtr, uint32 dstPtr += (dstPitch - 2 * width / 4); src += 4 * srcPitch; } + + // Special case for KQ6 Windows, which runs at 640x440: fill the bottom + // with zeroes (a black bar) + if (width == 640 && height == 440) { + for (int y = 440; y < 480; y += 4) { + for (int x = 0; x < width; x += 4, dstPtr += 2) + *((uint16*)dstPtr) = 0; + + dstPtr += (dstPitch - 2 * width / 4); + } + } } static void createThumbnail(const uint8 *src, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -188,6 +199,11 @@ static bool createThumbnail(Graphics::Surface &out, Graphics::Surface &in) { uint16 newHeight = !(inHeight % 240) ? kThumbnailHeight2 : kThumbnailHeight1; + // Special case for KQ6 Windows, which runs at 640x440: expand the + // thumbnail so that it fits + if (width == 640 && inHeight == 440) + newHeight = kThumbnailHeight2; + out.create(kThumbnailWidth, newHeight, sizeof(uint16)); createThumbnail((const uint8 *)in.pixels, width * sizeof(uint16), (uint8 *)out.pixels, out.pitch, width, inHeight); -- cgit v1.2.3 From e22a75de9981876aafc0b07946c23185d823b190 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 19:04:44 +0000 Subject: Rewrote the handling of thumbnail creation for KQ6 Windows in rev #50600, so that it recreates the screen buffer like the other workarounds above it (thanks to LordHoto for pointing this out) svn-id: r50601 --- graphics/scaler/thumbnail_intern.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp index a27b77ccbb..ad8f73305d 100644 --- a/graphics/scaler/thumbnail_intern.cpp +++ b/graphics/scaler/thumbnail_intern.cpp @@ -71,17 +71,6 @@ void createThumbnail_4(const uint8 *src, uint32 srcPitch, uint8 *dstPtr, uint32 dstPtr += (dstPitch - 2 * width / 4); src += 4 * srcPitch; } - - // Special case for KQ6 Windows, which runs at 640x440: fill the bottom - // with zeroes (a black bar) - if (width == 640 && height == 440) { - for (int y = 440; y < 480; y += 4) { - for (int x = 0; x < width; x += 4, dstPtr += 2) - *((uint16*)dstPtr) = 0; - - dstPtr += (dstPitch - 2 * width / 4); - } - } } static void createThumbnail(const uint8 *src, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -193,17 +182,24 @@ static bool createThumbnail(Graphics::Surface &out, Graphics::Surface &in) { src += in.pitch; } + in.free(); + in = newscreen; + } else if (width == 640 && inHeight == 440) { + // Special case to handle KQ6 Windows: resize the screen to 640x480, + // adding a black band in the bottom. + inHeight = 480; + + Graphics::Surface newscreen; + newscreen.create(width, 480, in.bytesPerPixel); + + memcpy(newscreen.getBasePtr(0, 0), in.getBasePtr(0, 0), width * 440 * in.bytesPerPixel); + in.free(); in = newscreen; } uint16 newHeight = !(inHeight % 240) ? kThumbnailHeight2 : kThumbnailHeight1; - // Special case for KQ6 Windows, which runs at 640x440: expand the - // thumbnail so that it fits - if (width == 640 && inHeight == 440) - newHeight = kThumbnailHeight2; - out.create(kThumbnailWidth, newHeight, sizeof(uint16)); createThumbnail((const uint8 *)in.pixels, width * sizeof(uint16), (uint8 *)out.pixels, out.pitch, width, inHeight); -- cgit v1.2.3 From 5625c6d1ee7f270fa8d6e93b3862a3d8dd7514c0 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 2 Jul 2010 19:08:22 +0000 Subject: KYRA/PC98: fix sfx volume control svn-id: r50602 --- engines/kyra/sound_towns.cpp | 70 +++++++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index e50981c4c0..57ed3402c5 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -1858,10 +1858,29 @@ void TownsPC98_OpnChannel::loadData(uint8 *data) { _dataPtr = data; _totalLevel = 0x7F; - uint8 *src_b = _dataPtr; - int loop = 1; + uint8 *tmp = _dataPtr; + for (bool loop = true; loop; ) { + uint8 cmd = *tmp++; + if (cmd < 0xf0) { + tmp++; + } else if (cmd == 0xff) { + if (READ_LE_UINT16(tmp)) + _drv->_looping |= _idFlag; + else + loop = false; + } else if (cmd == 0xf6) { + // reset repeat section countdown + tmp[0] = tmp[1]; + tmp += 4; + } else { + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } + } + + /*uint8 *src_b = _dataPtr; uint8 cmd = 0; - while (loop) { + + for (int loop = 1; loop; ) { if (loop == 1) { cmd = *src_b++; if (cmd < 0xf0) { @@ -1882,11 +1901,12 @@ void TownsPC98_OpnChannel::loadData(uint8 *data) { src_b += _drv->_opnFxCmdLen[cmd - 240]; loop = 1; } else if (loop == 3) { + // reset repeat section countdown src_b[0] = src_b[1]; src_b += 4; loop = 1; } - } + }*/ } void TownsPC98_OpnChannel::processEvents() { @@ -2498,6 +2518,22 @@ void TownsPC98_OpnSfxChannel::loadData(uint8 *data) { _dataPtr = data; _ssgTl = 0xff; _algorithm = 0x80; + + uint8 *tmp = _dataPtr; + for (bool loop = true; loop; ) { + uint8 cmd = *tmp++; + if (cmd < 0xf0) { + tmp++; + } else if (cmd == 0xff && !*tmp) { + loop = false; + } else if (cmd == 0xf6) { + // reset repeat section countdown + tmp[0] = tmp[1]; + tmp += 4; + } else { + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } + } } TownsPC98_OpnChannelPCM::TownsPC98_OpnChannelPCM(TownsPC98_OpnDriver *driver, uint8 regOffs, @@ -2750,15 +2786,15 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { finOut += _tleTable[_channels[ii].out ? _pReslt : 0]; else finOut += _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; - } - finOut /= 3; + if ((1 << ii) & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; - if ((1 << i) & _volMaskA) - finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + if ((1 << ii) & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + } - if ((1 << i) & _volMaskB) - finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + finOut /= 3; buffer[i << 1] += finOut; buffer[(i << 1) + 1] += finOut; @@ -3764,21 +3800,21 @@ void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { } void TownsPC98_OpnDriver::startSoundEffect() { - _updateSfxFlag = 0; + int volFlags = 0; for (int i = 0; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); _sfxChannels[i]->reset(); _sfxChannels[i]->loadData(_sfxData + _sfxOffsets[i]); _updateSfxFlag |= _sfxChannels[i]->_idFlag; + volFlags |= (_sfxChannels[i]->_idFlag << _numChan); + } else { + _ssgChannels[i + 1]->restore(); + _updateSfxFlag &= ~_sfxChannels[i]->_idFlag; } } - - int volFlags = 0; - for (int i = 0; i < (_numChan + _numSSG - 2); i++) - volFlags |= (1 << i); - setVolumeChannelMasks(volFlags, ~volFlags); - + + setVolumeChannelMasks(~volFlags, volFlags); _sfxData = 0; } -- cgit v1.2.3 From 022808fda6ac5419fd16fbd3d47dff16b812c50d Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 2 Jul 2010 19:47:14 +0000 Subject: KYRA/PC98: cleanup svn-id: r50603 --- engines/kyra/sound_towns.cpp | 38 ++++---------------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 57ed3402c5..530a473fcc 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -1498,7 +1498,7 @@ public: uint8 chanEnable() const { return _chanEnable; } private: - void updatesRegs(); + void updateRegs(); uint8 _updateRequestBuf[64]; int _updateRequest; @@ -1876,37 +1876,6 @@ void TownsPC98_OpnChannel::loadData(uint8 *data) { tmp += _drv->_opnFxCmdLen[cmd - 240]; } } - - /*uint8 *src_b = _dataPtr; - uint8 cmd = 0; - - for (int loop = 1; loop; ) { - if (loop == 1) { - cmd = *src_b++; - if (cmd < 0xf0) { - src_b++; - loop = 1; - } else { - if (cmd == 0xff) { - loop = *src_b ? 2 : 0; - if (READ_LE_UINT16(src_b)) - _drv->_looping |= _idFlag; - } else if (cmd == 0xf6) { - loop = 3; - } else { - loop = 2; - } - } - } else if (loop == 2) { - src_b += _drv->_opnFxCmdLen[cmd - 240]; - loop = 1; - } else if (loop == 3) { - // reset repeat section countdown - src_b[0] = src_b[1]; - src_b += 4; - loop = 1; - } - }*/ } void TownsPC98_OpnChannel::processEvents() { @@ -2777,7 +2746,7 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { } } _pReslt = _evpTimer ^ _attack; - updatesRegs(); + updateRegs(); } int32 finOut = 0; @@ -2801,7 +2770,7 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { } } -void TownsPC98_OpnSquareSineSource::updatesRegs() { +void TownsPC98_OpnSquareSineSource::updateRegs() { for (int i = 0; i < _updateRequest;) { uint8 b = _updateRequestBuf[i++]; uint8 a = _updateRequestBuf[i++]; @@ -3801,6 +3770,7 @@ void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { void TownsPC98_OpnDriver::startSoundEffect() { int volFlags = 0; + for (int i = 0; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); -- cgit v1.2.3 From a6e07f01bb7699162be879abae1d01ab6980f768 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 2 Jul 2010 21:27:36 +0000 Subject: KYRA/PC98: fix long standing bug were certain sound effects would bring each other out of tune svn-id: r50604 --- engines/kyra/sound_towns.cpp | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 530a473fcc..e8c8365f85 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -1358,7 +1358,7 @@ public: void setOutputLevel(); virtual void fadeStep(); - void reset(); + virtual void reset(); const uint8 _idFlag; @@ -1435,13 +1435,14 @@ public: void protect(); void restore(); + virtual void reset(); void fadeStep(); protected: void setOutputLevel(uint8 lvl); - bool control_f0_setInstr(uint8 para); + bool control_f0_setPatch(uint8 para); bool control_f1_setTotalLevel(uint8 para); bool control_f4_setAlgorithm(uint8 para); bool control_f9_loadCustomPatch(uint8 para); @@ -1461,6 +1462,7 @@ public: ~TownsPC98_OpnSfxChannel() {} void loadData(uint8 *data); + void reset(); }; class TownsPC98_OpnChannelPCM : public TownsPC98_OpnChannel { @@ -2202,7 +2204,7 @@ void TownsPC98_OpnChannelSSG::init() { #define Control(x) &TownsPC98_OpnChannelSSG::control_##x static const ControlEventFunc ctrlEventsSSG[] = { - Control(f0_setInstr), + Control(f0_setPatch), Control(f1_setTotalLevel), Control(f2_setKeyOffTime), Control(f3_setFreqLSB), @@ -2396,6 +2398,23 @@ void TownsPC98_OpnChannelSSG::setOutputLevel(uint8 lvl) { _drv->writeReg(_part, 8 + _regOffset, _ssgTl); } +void TownsPC98_OpnChannelSSG::reset() { + TownsPC98_OpnChannel::reset(); + + // Unlike the original we restore the default patch data. This fixes a bug + // where certain sound effects would bring each other out of tune (e.g. the + // dragon's fire in Darm's house in Kyra 1 would sound different each time + // you triggered another sfx by dropping an item etc.) + uint8 i = (10 + _regOffset) << 4; + const uint8 *src = &_drv->_drvTables[156]; + _drv->_ssgPatches[i] = src[i]; + _drv->_ssgPatches[i + 3] = src[i + 3]; + _drv->_ssgPatches[i + 4] = src[i + 4]; + _drv->_ssgPatches[i + 6] = src[i + 6]; + _drv->_ssgPatches[i + 8] = src[i + 8]; + _drv->_ssgPatches[i + 12] = src[i + 12]; +} + void TownsPC98_OpnChannelSSG::fadeStep() { _totalLevel--; if ((int8)_totalLevel < 0) @@ -2403,7 +2422,7 @@ void TownsPC98_OpnChannelSSG::fadeStep() { setOutputLevel(_ssgStartLvl); } -bool TownsPC98_OpnChannelSSG::control_f0_setInstr(uint8 para) { +bool TownsPC98_OpnChannelSSG::control_f0_setPatch(uint8 para) { _instr = para << 4; para = (para >> 3) & 0x1e; if (para) @@ -2505,6 +2524,23 @@ void TownsPC98_OpnSfxChannel::loadData(uint8 *data) { } } +void TownsPC98_OpnSfxChannel::reset() { + TownsPC98_OpnChannel::reset(); + + // Unlike the original we restore the default patch data. This fixes a bug + // where certain sound effects would bring each other out of tune (e.g. the + // dragon's fire in Darm's house in Kyra 1 would sound different each time + // you triggered another sfx by dropping an item etc.) + uint8 i = (13 + _regOffset) << 4; + const uint8 *src = &_drv->_drvTables[156]; + _drv->_ssgPatches[i] = src[i]; + _drv->_ssgPatches[i + 3] = src[i + 3]; + _drv->_ssgPatches[i + 4] = src[i + 4]; + _drv->_ssgPatches[i + 6] = src[i + 6]; + _drv->_ssgPatches[i + 8] = src[i + 8]; + _drv->_ssgPatches[i + 12] = src[i + 12]; +} + TownsPC98_OpnChannelPCM::TownsPC98_OpnChannelPCM(TownsPC98_OpnDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : TownsPC98_OpnChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { -- cgit v1.2.3 From 2662d569d9fb8ee899b0124ebb237be9866b6957 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 2 Jul 2010 22:38:42 +0000 Subject: Fix long standing regression (introduced with r34053) in thumbnail scaling code for Hercules graphics. svn-id: r50605 --- graphics/scaler/thumbnail_intern.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp index ad8f73305d..f767c91bd5 100644 --- a/graphics/scaler/thumbnail_intern.cpp +++ b/graphics/scaler/thumbnail_intern.cpp @@ -148,8 +148,8 @@ static bool createThumbnail(Graphics::Surface &out, Graphics::Surface &in) { Graphics::Surface newscreen; newscreen.create(width, in.h, in.bytesPerPixel); - uint8 *dst = (uint8*)newscreen.getBasePtr((320 - in.w) / 2, 0); - const uint8 *src = (uint8*)in.getBasePtr(0, 0); + uint8 *dst = (uint8 *)newscreen.getBasePtr((320 - in.w) / 2, 0); + const uint8 *src = (const uint8 *)in.getBasePtr(0, 0); uint16 height = in.h; while (height--) { @@ -173,8 +173,8 @@ static bool createThumbnail(Graphics::Surface &out, Graphics::Surface &in) { Graphics::Surface newscreen; newscreen.create(width, 400, in.bytesPerPixel); - uint8 *dst = (uint8*)in.getBasePtr(0, (400 - 240) / 2); - const uint8 *src = (uint8*)in.getBasePtr(41, 28); + uint8 *dst = (uint8 *)newscreen.getBasePtr(0, (400 - 240) / 2); + const uint8 *src = (const uint8 *)in.getBasePtr(41, 28); for (int y = 0; y < 240; ++y) { memcpy(dst, src, 640 * in.bytesPerPixel); -- cgit v1.2.3 From 188f8d9a1199f60a1b0ca5a63b45e24813923d92 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 22:55:56 +0000 Subject: AGI: Fixed bug #3017905 - "AGI: GR - Crash on start". A free() was done on an already freed reference svn-id: r50606 --- engines/agi/loader_v3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp index 4ee35d73eb..f145140768 100644 --- a/engines/agi/loader_v3.cpp +++ b/engines/agi/loader_v3.cpp @@ -229,7 +229,7 @@ uint8 *AgiLoader_v3::loadVolRes(AgiDir *agid) { if (x[2] & 0x80) { // compressed pic data = _vm->_picture->convertV3Pic(compBuffer, agid->clen); - free(compBuffer); + // compBuffer has been freed inside convertV3Pic() } else if (agid->len == agid->clen) { // do not decompress data = compBuffer; -- cgit v1.2.3 From 4304a414ab6ab3a46c10ddcd89ff9070caca96d9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 2 Jul 2010 23:12:17 +0000 Subject: AGI: Removed the deprecated (and confusing) getGameId() function inside the AgiEngine class, and fixed a related bug, too svn-id: r50607 --- engines/agi/agi.cpp | 7 ------- engines/agi/agi.h | 5 ----- engines/agi/view.cpp | 2 +- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index a39725a973..4a994b731a 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -505,13 +505,6 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); - const GameSettings *g; - - const char *gameid = ConfMan.get("gameid").c_str(); - for (g = agiSettings; g->gameid; ++g) - if (!scumm_stricmp(g->gameid, gameid)) - _gameId = g->id; - parseFeatures(); _rnd = new Common::RandomSource(); diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 166470e6e4..507e7f7a11 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -792,8 +792,6 @@ public: }; class AgiEngine : public AgiBase { - int _gameId; - protected: // Engine APIs virtual Common::Error go(); @@ -806,9 +804,6 @@ protected: public: AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc); virtual ~AgiEngine(); - int getGameId() { - return _gameId; - } Common::Error loadGameState(int slot); Common::Error saveGameState(int slot, const char *desc); diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index 03509e81f9..45244bb292 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -368,7 +368,7 @@ void AgiEngine::updateViewtable() { break; default: // for KQ4 - if (getVersion() == 0x3086 || getGameId() == GID_KQ4) + if (getVersion() == 0x3086 || getGameID() == GID_KQ4) loop = loopTable4[v->direction]; break; } -- cgit v1.2.3 From aefc42ab0e066b6cd2fa6eaab2471a908d7bb1fb Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sat, 3 Jul 2010 00:06:54 +0000 Subject: KYRA/PC98 Audio: fix invalid mem access svn-id: r50608 --- engines/kyra/sound_towns.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index e8c8365f85..f6d71f8549 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -1866,9 +1866,10 @@ void TownsPC98_OpnChannel::loadData(uint8 *data) { if (cmd < 0xf0) { tmp++; } else if (cmd == 0xff) { - if (READ_LE_UINT16(tmp)) + if (READ_LE_UINT16(tmp)) { _drv->_looping |= _idFlag; - else + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } else loop = false; } else if (cmd == 0xf6) { // reset repeat section countdown @@ -2512,7 +2513,7 @@ void TownsPC98_OpnSfxChannel::loadData(uint8 *data) { uint8 cmd = *tmp++; if (cmd < 0xf0) { tmp++; - } else if (cmd == 0xff && !*tmp) { + } else if (cmd == 0xff) { loop = false; } else if (cmd == 0xf6) { // reset repeat section countdown @@ -3080,7 +3081,7 @@ void TownsPC98_OpnCore::reset() { for (int i = 0; i < _numChan; i++) { for (int ii = 0; ii < 4; ii++) _chanInternal[i].opr[ii]->reset(); - memset(&_chanInternal[i].feedbuf, 0, 3); + memset(_chanInternal[i].feedbuf, 0, 3); _chanInternal[i].algorithm = 0; _chanInternal[i].frqTemp = 0; _chanInternal[i].enableLeft = _chanInternal[i].enableRight = true; -- cgit v1.2.3 From 8d26e7c2d26c0a7c6521631bf861f8613a307dce Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Sat, 3 Jul 2010 03:48:26 +0000 Subject: Dragon History tries uses compressed dubbing when available Timing of speaking is not fixed yet. svn-id: r50614 --- engines/draci/barchive.cpp | 5 ++--- engines/draci/draci.cpp | 37 +++++++++++++++++++++++++++++++++++-- engines/draci/sound.cpp | 20 ++++++++++++-------- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/engines/draci/barchive.cpp b/engines/draci/barchive.cpp index 2ed2a9b591..8f9e836ba3 100644 --- a/engines/draci/barchive.cpp +++ b/engines/draci/barchive.cpp @@ -283,8 +283,7 @@ BAFile *BArchive::loadFileBAR(uint i) { tmp ^= _files[i]._data[j]; } - debugC(3, kDraciArchiverDebugLevel, "Cached file %d from archive %s", - i, _path.c_str()); + debugC(2, kDraciArchiverDebugLevel, "Read %d bytes", _files[i]._length); assert(tmp == _files[i]._crc && "CRC checksum mismatch"); return _files + i; @@ -385,7 +384,7 @@ const BAFile *BArchive::getFile(uint i) { // Check if file has already been opened and return that if (_files[i]._data) { - debugC(2, kDraciArchiverDebugLevel, "Success"); + debugC(2, kDraciArchiverDebugLevel, "Cached"); return _files + i; } diff --git a/engines/draci/draci.cpp b/engines/draci/draci.cpp index 202bf6d187..cd3920b30d 100644 --- a/engines/draci/draci.cpp +++ b/engines/draci/draci.cpp @@ -71,7 +71,7 @@ const char *dubbingPath = "CD.SAM"; const char *musicPathMask = "HUDBA%d.MID"; const uint kSoundsFrequency = 13000; -const uint kDubbingFrequency = 22000; +const uint kDubbingFrequency = 22050; DraciEngine::DraciEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst) { @@ -105,6 +105,39 @@ bool DraciEngine::hasFeature(EngineFeature f) const { (f == kSupportsSavingDuringRuntime); } +static SoundArchive* openAnyPossibleDubbing() { + debugC(1, kDraciGeneralDebugLevel, "Trying to find original dubbing"); + LegacySoundArchive *legacy = new LegacySoundArchive(dubbingPath, kDubbingFrequency); + if (legacy->isOpen() && legacy->size()) { + debugC(1, kDraciGeneralDebugLevel, "Found original dubbing"); + return legacy; + } + delete legacy; + + // The original uncompressed dubbing cannot be found. Try to open the + // newer compressed version. + debugC(1, kDraciGeneralDebugLevel, "Trying to find compressed dubbing"); + ZipSoundArchive *zip = new ZipSoundArchive(); + + zip->openArchive("dub-raw.zzz", "buf", RAW80, kDubbingFrequency); + if (zip->isOpen() && zip->size()) return zip; +#ifdef USE_FLAC + zip->openArchive("dub-flac.zzz", "flac", FLAC); + if (zip->isOpen() && zip->size()) return zip; +#endif +#ifdef USE_VORBIS + zip->openArchive("dub-ogg.zzz", "ogg", OGG); + if (zip->isOpen() && zip->size()) return zip; +#endif +#ifdef USE_MAD + zip->openArchive("dub-mp3.zzz", "mp3", MP3); + if (zip->isOpen() && zip->size()) return zip; +#endif + + // Return an empty (but initialized) archive anyway. + return zip; +} + int DraciEngine::init() { // Initialize graphics using following: initGraphics(kScreenWidth, kScreenHeight, false); @@ -124,7 +157,7 @@ int DraciEngine::init() { _stringsArchive = new BArchive(stringsPath); _soundsArchive = new LegacySoundArchive(soundsPath, kSoundsFrequency); - _dubbingArchive = new LegacySoundArchive(dubbingPath, kDubbingFrequency); + _dubbingArchive = openAnyPossibleDubbing(); _sound = new Sound(_mixer); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index aa696832bb..5000ceac74 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -48,14 +48,14 @@ void LegacySoundArchive::openArchive(const char *path) { // Close previously opened archive (if any) closeArchive(); - debugCN(2, kDraciArchiverDebugLevel, "Loading samples %s: ", path); + debugCN(1, kDraciArchiverDebugLevel, "Loading samples %s: ", path); _f = new Common::File(); _f->open(path); if (_f->isOpen()) { - debugC(2, kDraciArchiverDebugLevel, "Success"); + debugC(1, kDraciArchiverDebugLevel, "Success"); } else { - debugC(2, kDraciArchiverDebugLevel, "Error"); + debugC(1, kDraciArchiverDebugLevel, "Error"); delete _f; _f = NULL; return; @@ -65,7 +65,7 @@ void LegacySoundArchive::openArchive(const char *path) { _path = path; // Read archive header - debugC(2, kDraciArchiverDebugLevel, "Loading header"); + debugC(1, kDraciArchiverDebugLevel, "Loading header"); uint totalLength = _f->readUint32LE(); const uint kMaxSamples = 4095; // The no-sound file is exactly 16K bytes long, so don't fail on short reads @@ -81,7 +81,7 @@ void LegacySoundArchive::openArchive(const char *path) { break; } if (_sampleCount > 0) { - debugC(2, kDraciArchiverDebugLevel, "Archive info: %d samples, %d total length", + debugC(1, kDraciArchiverDebugLevel, "Archive info: %d samples, %d total length", _sampleCount, totalLength); _samples = new SoundSample[_sampleCount]; for (uint i = 0; i < _sampleCount; ++i) { @@ -92,14 +92,14 @@ void LegacySoundArchive::openArchive(const char *path) { if (_samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length != totalLength && _samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length - _samples[0]._offset != totalLength) { // WORKAROUND: the stored length is stored with the header for sounds and without the hader for dubbing. Crazy. - debugC(2, kDraciArchiverDebugLevel, "Broken sound archive: %d != %d", + debugC(1, kDraciArchiverDebugLevel, "Broken sound archive: %d != %d", _samples[_sampleCount-1]._offset + _samples[_sampleCount-1]._length, totalLength); closeArchive(); return; } } else { - debugC(2, kDraciArchiverDebugLevel, "Archive info: empty"); + debugC(1, kDraciArchiverDebugLevel, "Archive info: empty"); } // Indicate that the archive has been successfully opened @@ -170,7 +170,7 @@ SoundSample *LegacySoundArchive::getSample(int i, uint freq) { _f->seek(_samples[i]._offset); _f->read(_samples[i]._data, _samples[i]._length); - debugC(3, kDraciArchiverDebugLevel, "Read sample %d from archive %s", + debugC(2, kDraciArchiverDebugLevel, "Read sample %d from archive %s", i, _path); } _samples[i]._frequency = freq ? freq : _defaultFreq; @@ -185,6 +185,7 @@ void ZipSoundArchive::openArchive(const char *path, const char *extension, Sound return; } + debugCN(1, kDraciArchiverDebugLevel, "Trying to open ZIP archive %s: ", path); _archive = Common::makeZipArchive(path); _path = path; _extension = extension; @@ -195,6 +196,9 @@ void ZipSoundArchive::openArchive(const char *path, const char *extension, Sound Common::ArchiveMemberList files; _archive->listMembers(files); _sampleCount = files.size(); + debugC(1, kDraciArchiverDebugLevel, "Capacity %d", _sampleCount); + } else { + debugC(1, kDraciArchiverDebugLevel, "Failed"); } } -- cgit v1.2.3 From 0fd3558986e7c0a0c08f3df18d6c8ce59da79110 Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Sat, 3 Jul 2010 05:05:28 +0000 Subject: Finish support of compressed dubbing Now even the length of a compressed stream is measured precisely and the dubbing sounds exactly like the original. svn-id: r50618 --- engines/draci/animation.cpp | 6 +++--- engines/draci/script.cpp | 4 ++-- engines/draci/sound.cpp | 20 +++++++++++--------- engines/draci/sound.h | 7 ++++--- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp index e46582487c..2bedbe1801 100644 --- a/engines/draci/animation.cpp +++ b/engines/draci/animation.cpp @@ -166,10 +166,10 @@ void Animation::drawFrame(Surface *surface) { const SoundSample *sample = _samples[_currentFrame]; if (_hasChangedFrame && sample) { + uint duration = _vm->_sound->playSound(sample, Audio::Mixer::kMaxChannelVolume, false); debugC(3, kDraciSoundDebugLevel, - "Playing sample on animation %d, frame %d: %d+%d at %dHz", - _id, _currentFrame, sample->_offset, sample->_length, sample->_frequency); - _vm->_sound->playSound(sample, Audio::Mixer::kMaxChannelVolume, false); + "Playing sample on animation %d, frame %d: %d+%d at %dHz: %dms", + _id, _currentFrame, sample->_offset, sample->_length, sample->_frequency, duration); } _hasChangedFrame = false; } diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index 0572eb7a81..7a6a68618d 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -729,10 +729,10 @@ void Script::talk(const Common::Array ¶ms) { // Speak the dubbing if possible uint dubbingDuration = 0; if (sample) { - dubbingDuration = (uint) (1000.0 * sample->_length / sample->_frequency + 500.0); + dubbingDuration = _vm->_sound->playVoice(sample); debugC(3, kDraciSoundDebugLevel, "Playing sentence %d: %d+%d with duration %dms", sentenceID, sample->_offset, sample->_length, dubbingDuration); - _vm->_sound->playVoice(sample); + dubbingDuration += 500; } // Record time diff --git a/engines/draci/sound.cpp b/engines/draci/sound.cpp index 5000ceac74..c9244d7eac 100644 --- a/engines/draci/sound.cpp +++ b/engines/draci/sound.cpp @@ -285,11 +285,11 @@ SndHandle *Sound::getHandle() { return NULL; // for compilers that don't support NORETURN } -void Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffer, int volume, +uint Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffer, int volume, sndHandleType handleType, bool loop) { if (!buffer._stream && !buffer._data) { warning("Empty stream"); - return; + return 0; } // Create a new SeekableReadStream which will be automatically disposed // after the sample stops playing. Do not dispose the original @@ -335,22 +335,24 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffe default: error("Unsupported compression format %d", static_cast (buffer._format)); delete stream; - return; + return 0; } + const uint length = reader->getLength().msecs(); const Audio::Mixer::SoundType soundType = (handleType == kVoiceHandle) ? Audio::Mixer::kSpeechSoundType : Audio::Mixer::kSFXSoundType; Audio::AudioStream *audio_stream = Audio::makeLoopingAudioStream(reader, loop ? 0 : 1); _mixer->playStream(soundType, handle, audio_stream, -1, volume); + return length; } -void Sound::playSound(const SoundSample *buffer, int volume, bool loop) { +uint Sound::playSound(const SoundSample *buffer, int volume, bool loop) { if (!buffer || _muteSound) - return; + return 0; SndHandle *handle = getHandle(); handle->type = kEffectHandle; - playSoundBuffer(&handle->handle, *buffer, 2 * volume, handle->type, loop); + return playSoundBuffer(&handle->handle, *buffer, 2 * volume, handle->type, loop); } void Sound::pauseSound() { @@ -374,13 +376,13 @@ void Sound::stopSound() { } } -void Sound::playVoice(const SoundSample *buffer) { +uint Sound::playVoice(const SoundSample *buffer) { if (!buffer || _muteVoice) - return; + return 0; SndHandle *handle = getHandle(); handle->type = kVoiceHandle; - playSoundBuffer(&handle->handle, *buffer, Audio::Mixer::kMaxChannelVolume, handle->type, false); + return playSoundBuffer(&handle->handle, *buffer, Audio::Mixer::kMaxChannelVolume, handle->type, false); } void Sound::pauseVoice() { diff --git a/engines/draci/sound.h b/engines/draci/sound.h index 2fade6de0b..6e9aae1b6e 100644 --- a/engines/draci/sound.h +++ b/engines/draci/sound.h @@ -189,13 +189,13 @@ public: Sound(Audio::Mixer *mixer); ~Sound() {} - void playSound(const SoundSample *buffer, int volume, bool loop); + uint playSound(const SoundSample *buffer, int volume, bool loop); void pauseSound(); void resumeSound(); void stopSound(); bool isMutedSound() const { return _muteSound; } - void playVoice(const SoundSample *buffer); + uint playVoice(const SoundSample *buffer); void pauseVoice(); void resumeVoice(); void stopVoice(); @@ -209,7 +209,8 @@ public: int talkSpeed() const { return _talkSpeed; } private: - void playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffer, int volume, + // Returns the length of the sound sample in miliseconds. + uint playSoundBuffer(Audio::SoundHandle *handle, const SoundSample &buffer, int volume, sndHandleType handleType, bool loop); SndHandle *getHandle(); -- cgit v1.2.3 From 42dfdea5df648cbf1a7778ac8848d752d0f144bb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 3 Jul 2010 06:55:10 +0000 Subject: SCI: added resetting of SoundCommandParser, so that error()s before that one got initialized wont crash svn-id: r50619 --- engines/sci/sci.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index e9e16c8262..91eeac3a21 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -187,6 +187,9 @@ Common::Error SciEngine::run() { } */ + // Reset, so that error()s before SoundCommandParser is initialized wont cause a crash + _soundCmd = NULL; + // Add the after market GM patches for the specified game, if they exist _resMan->addNewGMPatch(_gameId); _gameObj = _resMan->findGameObject(); -- cgit v1.2.3 From 99939109d75816e434f51479bafdc48a987fb008 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 3 Jul 2010 11:50:42 +0000 Subject: Adding the beginnings of a player control class, as well as various changes to the other classes to support it svn-id: r50620 --- engines/m4/globals.h | 1 + engines/m4/m4.h | 2 + engines/m4/mads_logic.cpp | 73 +++++++++++++++-- engines/m4/mads_logic.h | 2 + engines/m4/mads_player.cpp | 193 +++++++++++++++++++++++++++++++++++++++++++++ engines/m4/mads_player.h | 66 ++++++++++++++++ engines/m4/mads_scene.cpp | 123 ++++++++++++++++++----------- engines/m4/mads_scene.h | 32 ++++---- engines/m4/mads_views.cpp | 8 +- engines/m4/mads_views.h | 2 +- engines/m4/module.mk | 1 + 11 files changed, 433 insertions(+), 70 deletions(-) create mode 100644 engines/m4/mads_player.cpp create mode 100644 engines/m4/mads_player.h diff --git a/engines/m4/globals.h b/engines/m4/globals.h index 0217a96777..5ab1ccd9a6 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -252,6 +252,7 @@ public: MadsDialogType dialogType; int sceneNumber; int previousScene; + int16 _nextSceneId; uint16 actionNouns[3]; IntStorage _dataMap; diff --git a/engines/m4/m4.h b/engines/m4/m4.h index f5ddcc28be..3174c886d5 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -42,6 +42,7 @@ #include "m4/events.h" #include "m4/font.h" #include "m4/scene.h" +#include "m4/mads_player.h" #include "m4/mads_scene.h" #include "m4/m4_scene.h" #include "m4/actor.h" @@ -213,6 +214,7 @@ private: public: MadsConversation _converse; uint32 _currentTimer; + MadsPlayer _player; public: MadsEngine(OSystem *syst, const M4GameDescription *gameDesc); virtual ~MadsEngine(); diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index 72c5fde40b..2e3198029b 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -54,7 +54,7 @@ void MadsSceneLogic::getSceneSpriteSet() { strcpy(prefix, ""); _madsVm->globals()->playerSpriteChanged = true; - _madsVm->scene()->loadPlayerSprites(prefix); + _madsVm->_player.loadSprites(prefix); // if ((_sceneNumber == 105) ((_sceneNumber == 109) && (word_84800 != 0))) // _madsVm->globals()->playerSpriteChanged = true; @@ -150,6 +150,59 @@ void MadsSceneLogic::lowRoomsEntrySound() { } } +void MadsSceneLogic::getPlayerSpritesPrefix() { + _madsVm->_sound->playSound(5); + + char oldName[80]; + strcpy(oldName, _madsVm->_player._spritesPrefix); + + if ((_madsVm->globals()->_nextSceneId <= 103) || (_madsVm->globals()->_nextSceneId == 111)) + strcpy(_madsVm->_player._spritesPrefix, (_madsVm->globals()->_globals[0] == SEX_FEMALE) ? "ROX" : "RXM"); + else if (_madsVm->globals()->_nextSceneId <= 110) + strcpy(_madsVm->_player._spritesPrefix, "RXSM"); + else if (_madsVm->globals()->_nextSceneId == 112) + strcpy(_madsVm->_player._spritesPrefix, ""); + + if (strcmp(oldName, _madsVm->_player._spritesPrefix) != 0) + _madsVm->_player._spritesChanged = true; + + if ((_madsVm->globals()->_nextSceneId == 105) || + ((_madsVm->globals()->_nextSceneId == 109) && (_madsVm->globals()->_globals[15] != 0))) { + // TODO: unknown flag setting + _madsVm->_player._spritesChanged = true; + } + + _madsVm->_palette->setEntry(16, 40, 255, 255); + _madsVm->_palette->setEntry(17, 40, 180, 180); + +} + +void MadsSceneLogic::getPlayerSpritesPrefix2() { + _madsVm->_sound->playSound(5); + + char oldName[80]; + strcpy(oldName, _madsVm->_player._spritesPrefix); + + if ((_madsVm->globals()->_nextSceneId == 213) || (_madsVm->globals()->_nextSceneId == 216)) + strcpy(_madsVm->_player._spritesPrefix, ""); + else if (_madsVm->globals()->_globals[0] == SEX_MALE) + strcpy(_madsVm->_player._spritesPrefix, "RXM"); + else + strcpy(_madsVm->_player._spritesPrefix, "ROX"); + + // TODO: unknown flag setting for next scene Id > 212 + + if (strcmp(oldName, _madsVm->_player._spritesPrefix) != 0) + _madsVm->_player._spritesChanged = true; + +/* if ((_madsVm->globals()->_nextSceneId == 203) && (_madsVm->globals()->_nextSceneId == 204) && + (_madsVm->globals()->_globals[0x22] == 0)) + // TODO: unknown flag set +*/ + _madsVm->_palette->setEntry(16, 40, 255, 255); + _madsVm->_palette->setEntry(17, 40, 180, 180); +} + /*--------------------------------------------------------------------------*/ @@ -175,7 +228,9 @@ void MadsSceneLogic::setupScene() { // sub_1e754(animName, 3); if ((_sceneNumber >= 101) && (_sceneNumber <= 112)) - getSceneSpriteSet(); + getPlayerSpritesPrefix(); + else + getPlayerSpritesPrefix2(); getAnimName(); } @@ -212,15 +267,15 @@ void MadsSceneLogic::enterScene() { if (_madsVm->globals()->previousScene != -1) _madsVm->globals()->_globals[10] = 0; if (_madsVm->globals()->previousScene != -2) { - _madsVm->scene()->getSceneResources().playerPos = Common::Point(100, 152); + _madsVm->_player._playerPos = Common::Point(100, 152); } if ((_madsVm->globals()->previousScene == 112) || ((_madsVm->globals()->previousScene != -2) && (_spriteIndexes[29] != 0))) { // Returning from probe cutscene? _spriteIndexes[29] = -1; - _madsVm->scene()->getSceneResources().playerPos = Common::Point(161, 123); - _madsVm->scene()->getSceneResources().playerDir = 9; + _madsVm->_player._playerPos = Common::Point(161, 123); + _madsVm->_player._direction = 9; // TODO: Extra flags setting _spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], 0, 3, 0, 0, 0); @@ -241,8 +296,9 @@ void MadsSceneLogic::enterScene() { const char *animName = MADSResourceManager::getResourceName('S', 'e', EXTTYPE_AA, NULL, -1); _madsVm->scene()->loadAnimation(animName, 0x47); - _madsVm->scene()->getSceneResources().playerPos = Common::Point(68, 140); - _madsVm->scene()->getSceneResources().playerDir = 4; + _madsVm->_player._playerPos = Common::Point(68, 140); + _madsVm->_player._direction = 4; + _madsVm->_player._visible = false; dataMap()[0x56FC] = 0; dataMap()[0x5482] = 0; @@ -258,6 +314,9 @@ void MadsSceneLogic::doAction() { } void MadsSceneLogic::sceneStep() { + // TODO: Sound handling + + // Wake up message sequence Animation *anim = _madsVm->scene()->activeAnimation(); if (anim) { diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 299464f62b..3c6cb8edf1 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -42,6 +42,8 @@ private: uint16 startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); void activateHotspot(int idx, bool active); void lowRoomsEntrySound(); + void getPlayerSpritesPrefix(); + void getPlayerSpritesPrefix2(); private: int _sceneNumber; int16 _spriteIndexes[50]; diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp new file mode 100644 index 0000000000..53ee857093 --- /dev/null +++ b/engines/m4/mads_player.cpp @@ -0,0 +1,193 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "m4/m4.h" +#include "m4/mads_player.h" +#include "m4/mads_scene.h" + +namespace M4 { + +MadsPlayer::MadsPlayer() { + _playerPos = Common::Point(160, 78); + _direction = 0; + _direction2 = 0; + _forceRefresh = true; + _visible = true; + _priorVisible = false; + _visible3 = false; + _yScale = 0; + _moving = false; + _spriteListIdx = 0; + _spriteListIdx2 = 0; + _spritesChanged = true; + _currentScale = 0; + strcpy(_spritesPrefix, ""); + for (int idx = 0; idx < 8; ++idx) + _spriteSetIndexes[idx] = 0; + _frameNum = 0; + _frameOffset = 0; +} + +/** + * Loads the sprite set for the player + */ +bool MadsPlayer::loadSprites(const char *prefix) { + const char suffixList[8] = { '8', '9', '6', '3', '2', '7', '4', '1' }; + char setName[80]; + bool result = true; + + if (prefix) + strcpy(_spritesPrefix, prefix); + + _spriteSetCount = 0; + int prefixLen = strlen(_spritesPrefix); + + if (prefixLen == 0) { + // No player sprites at at all + for (int idx = 0; idx < 8; ++idx) + _spriteSetIndexes[idx] = 0; + } else { + strcpy(setName, "*"); + strcat(setName, _spritesPrefix); + strcat(setName, "_0.SS"); + + char *digitP = strchr(setName, '_') + 1; + + for (int idx = 0; idx < 8; ++idx) { + *digitP = suffixList[idx]; + _spriteSetIndexes[idx] = -1; + + int setIndex = _madsVm->scene()->_spriteSlots.addSprites(setName, true); + if (setIndex < 0) { + if (idx < 7) + break; + _spriteSetIndexes[idx] = 0; + } else { + ++_spriteSetCount; + } + + if (idx == 0) + _spriteListIdx = setIndex; + } + + result = 0; + // TODO: Unknown flag + _spritesChanged = false; + } + + return result; +} + +/** + * Called each frame to update the display of the player + */ +void MadsPlayer::update() { + if (_forceRefresh || (_visible != _priorVisible)) { + // If there's an existing player sprite visible, flag it for expiry + int slotIndex = getSpriteSlot(); + if (slotIndex >= 0) + _madsVm->scene()->_spriteSlots[slotIndex].spriteType = EXPIRED_SPRITE; + + // Figure out the depth for the sprite + int newDepth = 1; + int yp = MIN(_playerPos.y, (int16)155); + + for (int idx = 1; idx < 15; ++idx) { + if (_madsVm->scene()->getSceneResources().depthTable[newDepth] >= yp) + newDepth = idx + 1; + } + _currentDepth = newDepth; + + // Get the scale + int newScale = getScale(_playerPos.y); + _currentScale = MIN(newScale, 100); + + if (_visible) { + // Player sprite needs to be rendered + MadsSpriteSlot slot; + slot.spriteType = FOREGROUND_SPRITE; + slot.seqIndex = PLAYER_SEQ_INDEX; + slot.spriteListIndex = _spriteListIdx + _spriteListIdx2; + slot.frameNumber = _frameOffset + _frameNum; + slot.xp = _playerPos.x; + slot.yp = _playerPos.y + (_yScale * newScale) / 100; + slot.depth = newDepth; + slot.scale = newScale; + + if (slotIndex >= 0) { + // Check if the existing player slot has the same details, and can be re-used + MadsSpriteSlot &s2 = _madsVm->scene()->_spriteSlots[slotIndex]; + bool equal = (s2.seqIndex == slot.seqIndex) && (s2.spriteListIndex == slot.spriteListIndex) + && (s2.frameNumber == slot.frameNumber) && (s2.xp == slot.xp) && (s2.yp == slot.yp) + && (s2.depth == slot.depth) && (s2.scale == slot.scale); + + if (equal) + // Undo the prior expiry of the player sprite + slot.spriteType = SPRITE_ZERO; + else + slotIndex = -1; + } + + if (slotIndex < 0) { + // New slot needed, so allocate one and copy the slot data + slotIndex = _madsVm->scene()->_spriteSlots.getIndex(); + _madsVm->scene()->_spriteSlots[slotIndex] = slot; + } + + // TODO: Meaning of word_844c0 block + + } + } + + _visible3 = _priorVisible = _visible; + _forceRefresh = false; +} + +void MadsPlayer::idle() { + +} + +int MadsPlayer::getScale(int yp) { + MadsSceneResources &r = _madsVm->scene()->getSceneResources(); + + int scale = (r.bandsRange() == 0) ? r._maxScale : (yp - r._yBandsStart) * r.scaleRange() / r.bandsRange() + + r._minScale; + + return MIN(scale, 100); +} + +/** + * Scans through the scene's sprite slot list to find any sprite displaying the player + */ +int MadsPlayer::getSpriteSlot() { + MadsSpriteSlots &slots = _madsVm->scene()->_spriteSlots; + for (int i = 0; i < slots.startIndex; ++i) { + if ((slots[i].seqIndex == PLAYER_SEQ_INDEX) && (slots[i].spriteType >= SPRITE_ZERO)) + return i; + } + return -1; +} + +} // End of namespace M4 diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h new file mode 100644 index 0000000000..c84c1d0c60 --- /dev/null +++ b/engines/m4/mads_player.h @@ -0,0 +1,66 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef M4_MADS_PLAYER_H +#define M4_MADS_PLAYER_H + +#include "common/scummsys.h" + +namespace M4 { + +#define PLAYER_SEQ_INDEX -2 + +class MadsPlayer { +private: + int getScale(int yp); + int getSpriteSlot(); +public: + char _spritesPrefix[16]; + int _spriteSetCount; + int _spriteSetIndexes[8]; + Common::Point _playerPos; + Common::Point _destPos; + int16 _direction, _direction2; + bool _visible, _priorVisible; + bool _visible3; + bool _forceRefresh; + int16 _currentScale; + int16 _yScale; + int16 _currentDepth; + int16 _spriteListIdx, _spriteListIdx2; + bool _spritesChanged; + int16 _frameOffset, _frameNum; + bool _moving; +public: + MadsPlayer(); + + bool loadSprites(const char *prefix); + void update(); + void idle(); +}; + +} // End of namespace M4 + +#endif diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index f4581ed629..c34216aa34 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -67,8 +67,10 @@ MadsScene::~MadsScene() { /** * Secondary scene loading code */ -void MadsScene::loadScene2(const char *aaName) { +void MadsScene::loadScene2(const char *aaName, int sceneNumber) { // TODO: Completely finish + _madsVm->globals()->previousScene = _madsVm->globals()->sceneNumber; + _madsVm->globals()->sceneNumber = sceneNumber; _spriteSlots.clear(); _sequenceList.clear(); @@ -115,27 +117,41 @@ void MadsScene::loadScene(int sceneNumber) { // Handle common scene setting Scene::loadScene(sceneNumber); - - _madsVm->globals()->previousScene = _madsVm->globals()->sceneNumber; - _madsVm->globals()->sceneNumber = sceneNumber; + _madsVm->globals()->_nextSceneId = sceneNumber; // Existing ScummVM code that needs to be eventually replaced with MADS code loadSceneTemporary(); + _madsVm->_player._spritesChanged = true; + _madsVm->globals()->clearQuotes(); + _dynamicHotspots.reset(); + // Signal the script engine what scene is to be active _sceneLogic.selectScene(sceneNumber); - _sceneLogic.setupScene(); // Add the scene if necessary to the list of scenes that have been visited _vm->globals()->addVisitedScene(sceneNumber); - if (_vm->getGameType() == GType_RexNebular) { + if (_vm->getGameType() == GType_RexNebular) + _sceneLogic.setupScene(); + + // TODO: Unknown code + + // Secondary scene load routine + if (_vm->getGameType() == GType_RexNebular) // Secondary scene load routine - loadScene2("*I0.AA"); + loadScene2("*I0.AA", sceneNumber); - // Do any scene specific setup + _madsVm->_player.loadSprites(NULL); + + // Do any scene specific setup + if (_vm->getGameType() == GType_RexNebular) _sceneLogic.enterScene(); - } + + // Miscellaneous player setup + _madsVm->_player._destPos = _madsVm->_player._destPos; + _madsVm->_player._direction2 = _madsVm->_player._direction; + _madsVm->_player.idle(); // Purge resources _vm->res()->purge(); @@ -300,6 +316,8 @@ void MadsScene::update() { } void MadsScene::updateState() { + _madsVm->_player.update(); + _sceneLogic.sceneStep(); if ((_activeAnimation) && !_abortTimers) { @@ -311,8 +329,36 @@ void MadsScene::updateState() { } MadsView::update(); + + // Remove the animation if it's been completed + if ((_activeAnimation) && ((MadsAnimation *)_activeAnimation)->freeFlag()) + freeAnimation(); +} + +/** + * Does extra work at cleaning up the animation, and then deletes it + */ +void MadsScene::freeAnimation() { + if (!_activeAnimation) + return; + + MadsAnimation *anim = (MadsAnimation *)_activeAnimation; + if (anim->freeFlag()) { + _madsVm->scene()->_spriteSlots.clear(); + _madsVm->scene()->_spriteSlots.fullRefresh(); + _madsVm->scene()->_sequenceList.scan(); + } + + if (_madsVm->_player._visible) { + _madsVm->_player._forceRefresh = true; + _madsVm->_player.update(); + } + + delete _activeAnimation; + _activeAnimation = NULL; } + int MadsScene::loadSceneSpriteSet(const char *setName) { char resName[100]; strcpy(resName, setName); @@ -324,28 +370,6 @@ int MadsScene::loadSceneSpriteSet(const char *setName) { return _spriteSlots.addSprites(resName); } -void MadsScene::loadPlayerSprites(const char *prefix) { - const char suffixList[8] = { '8', '9', '6', '3', '2', '7', '4', '1' }; - char setName[80]; - - strcpy(setName, "*"); - strcat(setName, prefix); - strcat(setName, "_0.SS"); - char *digitP = strchr(setName, '_') + 1; - - for (int idx = 0; idx < 8; ++idx) { - *digitP = suffixList[idx]; - - if (_vm->res()->resourceExists(setName)) { - loadSceneSpriteSet(setName); - return; - } - } - - // Phantom/Dragon - warning("Couldn't find player sprites"); -} - enum boxSprites { topLeft = 0, topRight = 1, @@ -665,22 +689,27 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su } // TODO: The following is wrong for Phantom/Dragon - artFileNum = stream->readUint16LE(); - depthStyle = stream->readUint16LE(); - width = stream->readUint16LE(); - height = stream->readUint16LE(); + _artFileNum = stream->readUint16LE(); + _depthStyle = stream->readUint16LE(); + _width = stream->readUint16LE(); + _height = stream->readUint16LE(); stream->skip(24); int objectCount = stream->readUint16LE(); - - stream->skip(40); + _yBandsEnd = stream->readUint16LE(); + _yBandsStart = stream->readUint16LE(); + _maxScale = stream->readSint16LE(); + _minScale = stream->readSint16LE(); + for (int i = 0; i < DEPTH_BANDS_SIZE; ++i) + _depthBands[i] = stream->readUint16LE(); + stream->skip(2); // Load in any scene objects for (int i = 0; i < objectCount; ++i) { MadsObject rec; rec.load(stream); - objects.push_back(rec); + _objects.push_back(rec); } for (int i = 0; i < 20 - objectCount; ++i) stream->skip(48); @@ -690,7 +719,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su for (int i = 0; i < setCount; ++i) { char buffer2[64]; Common::String s(buffer2, 64); - setNames.push_back(s); + _setNames.push_back(s); } delete stream; @@ -698,16 +727,16 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su // Initialise a copy of the surfaces if they weren't provided bool dsFlag = false, ssFlag = false; if (!surface) { - surface = new M4Surface(width, height); + surface = new M4Surface(_width, _height); ssFlag = true; - } else if ((width != surface->width()) || (height != surface->height())) - surface->setSize(width, height); + } else if ((_width != surface->width()) || (_height != surface->height())) + surface->setSize(_width, _height); if (!depthSurface) { - depthSurface = new M4Surface(width, height); + depthSurface = new M4Surface(_width, _height); dsFlag = true; - } else if ((width != depthSurface->width()) || (height != depthSurface->height())) - depthSurface->setSize(width, height); + } else if ((_width != depthSurface->width()) || (_height != depthSurface->height())) + depthSurface->setSize(_width, _height); // For Rex Nebular, read in the scene's compressed walk surface information @@ -724,7 +753,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su // Run length encoded depth data while ((runLength = *srcP++) != 0) { - if (depthStyle == 2) { + if (_depthStyle == 2) { // 2-bit depth pixels byte byteVal = *srcP++; for (int byteCtr = 0; byteCtr < runLength; ++byteCtr) { @@ -746,7 +775,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su _vm->_resourceManager->toss(sceneName); // Load the surface artwork - surface->loadBackground(artFileNum); + surface->loadBackground(_artFileNum); // Final cleanup if (ssFlag) diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index c5fe6f01cd..66b50d809f 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -35,22 +35,26 @@ namespace M4 { #define INTERFACE_HEIGHT 106 class MadsInterfaceView; +#define DEPTH_BANDS_SIZE 15 + class MadsSceneResources: public SceneResources { public: - int sceneId; - int artFileNum; - int depthStyle; - int width; - int height; - Common::Array objects; - Common::Array setNames; - - Common::Point playerPos; - int playerDir; - - MadsSceneResources() { playerDir = 0; } + int _sceneId; + int _artFileNum; + int _depthStyle; + int _width; + int _height; + Common::Array _objects; + Common::Array _setNames; + int _yBandsStart, _yBandsEnd; + int _maxScale, _minScale; + int _depthBands[DEPTH_BANDS_SIZE]; + + MadsSceneResources() {} ~MadsSceneResources() {} void load(int sceneId, const char *resName, int v0, M4Surface *depthSurface, M4Surface *surface); + int bandsRange() const { return _yBandsEnd - _yBandsStart; } + int scaleRange() const { return _maxScale - _minScale; } }; enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; @@ -99,7 +103,7 @@ private: SpriteAsset *_playerSprites; void drawElements(); - void loadScene2(const char *aaName); + void loadScene2(const char *aaName, int sceneNumber); void loadSceneTemporary(); void loadSceneHotspots(int sceneNumber); void clearAction(); @@ -125,10 +129,10 @@ public: virtual void updateState(); int loadSceneSpriteSet(const char *setName); - void loadPlayerSprites(const char *prefix); void showMADSV2TextBox(char *text, int x, int y, char *faceName); void loadAnimation(const Common::String &animName, int v0); Animation *activeAnimation() const { return _activeAnimation; } + void freeAnimation(); MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; } MadsSceneResources &getSceneResources() { return _sceneResources; } diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 21ea3a75cb..9241774d16 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -86,7 +86,13 @@ int MadsSpriteSlots::getIndex() { return startIndex++; } -int MadsSpriteSlots::addSprites(const char *resName) { +int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors) { + // If errors are suppressed, first check if the resource exists + if (suppressErrors) { + if (!_vm->res()->resourceExists(resName)) + return -1; + } + // Get the sprite set Common::SeekableReadStream *data = _vm->res()->get(resName); SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName); diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index e3344bc8a4..38c7ed0712 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -92,7 +92,7 @@ public: } int getIndex(); - int addSprites(const char *resName); + int addSprites(const char *resName, bool suppressErrors = false); void deleteSprites(int listIndex); void clear(); void deleteTimer(int seqIndex); diff --git a/engines/m4/module.mk b/engines/m4/module.mk index 1b08ea2188..f60757ba3b 100644 --- a/engines/m4/module.mk +++ b/engines/m4/module.mk @@ -22,6 +22,7 @@ MODULE_OBJS = \ mads_anim.o \ mads_logic.o \ mads_menus.o \ + mads_player.o \ mads_scene.o \ mads_views.o \ midi.o \ -- cgit v1.2.3 From 6b152e803967770d3419642b07fbf3a27333e865 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 3 Jul 2010 12:33:49 +0000 Subject: SCI: fixing #define SIGFOR_ALL, so that amiga games work again :P svn-id: r50621 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 47f7ac3bc8..1fd80d2cf7 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -230,7 +230,7 @@ struct SciKernelMapEntry { #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 #define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE -#define SIGFOR_ALL 0x4f +#define SIGFOR_ALL 0x3f #define SIGFOR_DOS 1 << 0 #define SIGFOR_PC98 1 << 1 #define SIGFOR_WIN 1 << 2 -- cgit v1.2.3 From 88d1155c5e0b265c39466536f572a8aebfef8259 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 3 Jul 2010 12:49:42 +0000 Subject: Implemented necessary logic for the abort timer/action code, which allows the player manager to be correctly activated when the 'getting up' animation finishes svn-id: r50622 --- engines/m4/mads_logic.cpp | 23 +++++++++++++++++++++-- engines/m4/mads_scene.cpp | 23 +++++++++++++++++++++-- engines/m4/mads_scene.h | 2 +- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index 2e3198029b..c90fb11c11 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -251,7 +251,7 @@ void MadsSceneLogic::enterScene() { _spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], 0, 4, 0, 1, 0); _spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], 0, 4, 0, 1, 0); -// _madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70); + _madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70); _spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], 0, 10, 0, 0, 60); _spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], 0, 5, 0, 1, 0); @@ -294,7 +294,7 @@ void MadsSceneLogic::enterScene() { if (_madsVm->globals()->_globals[10]) { const char *animName = MADSResourceManager::getResourceName('S', 'e', EXTTYPE_AA, NULL, -1); - _madsVm->scene()->loadAnimation(animName, 0x47); + _madsVm->scene()->loadAnimation(animName, 71); _madsVm->_player._playerPos = Common::Point(68, 140); _madsVm->_player._direction = 4; @@ -316,6 +316,25 @@ void MadsSceneLogic::doAction() { void MadsSceneLogic::sceneStep() { // TODO: Sound handling + switch (_madsVm->scene()->_abortTimers) { + case 70: + _madsVm->_sound->playSound(9); + break; + case 71: + _madsVm->globals()->_globals[10] = 0; + _madsVm->_player._visible = true; + dataMap()[0x56FC] = 0; + + _madsVm->scene()->_newTimeout = _madsVm->_currentTimer - _madsVm->scene()->_ticksAmount; + break; + case 72: + case 73: + // TODO: Method that should be scripted + break; + + default: + break; + } // Wake up message sequence Animation *anim = _madsVm->scene()->activeAnimation(); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index c34216aa34..d22ca02475 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -144,6 +144,21 @@ void MadsScene::loadScene(int sceneNumber) { _madsVm->_player.loadSprites(NULL); + switch (_madsVm->globals()->_config.screenFades) { + case 0: + _abortTimers2 = 2; + break; + case 2: + _abortTimers2 = 21; + break; + default: + _abortTimers2 = 20; + break; + } + _abortTimers = 0; + _abortTimersMode2 = ABORTMODE_1; + + // Do any scene specific setup if (_vm->getGameType() == GType_RexNebular) _sceneLogic.enterScene(); @@ -318,8 +333,12 @@ void MadsScene::update() { void MadsScene::updateState() { _madsVm->_player.update(); + // Step through the scene _sceneLogic.sceneStep(); + if (_abortTimersMode == ABORTMODE_1) + _abortTimers = 0; + if ((_activeAnimation) && !_abortTimers) { _activeAnimation->update(); if (((MadsAnimation *) _activeAnimation)->freeFlag()) { @@ -468,12 +487,12 @@ void MadsScene::showMADSV2TextBox(char *text, int x, int y, char *faceName) { boxSprites->getFrame(bottomRight)->copyTo(_backgroundSurface, curX, curY + 1); } -void MadsScene::loadAnimation(const Common::String &animName, int v0) { +void MadsScene::loadAnimation(const Common::String &animName, int abortTimers) { if (_activeAnimation) error("Multiple active animations are not allowed"); MadsAnimation *anim = new MadsAnimation(_vm, this); - anim->load(animName.c_str(), 0); + anim->load(animName.c_str(), abortTimers); _activeAnimation = anim; } diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 66b50d809f..e671dfb194 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -130,7 +130,7 @@ public: int loadSceneSpriteSet(const char *setName); void showMADSV2TextBox(char *text, int x, int y, char *faceName); - void loadAnimation(const Common::String &animName, int v0); + void loadAnimation(const Common::String &animName, int abortTimers); Animation *activeAnimation() const { return _activeAnimation; } void freeAnimation(); -- cgit v1.2.3 From 5872f5bb1fac5a8d4b8ddecf777e22ca23ecca39 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 3 Jul 2010 18:44:44 +0000 Subject: SCI: adding support to identify uninitialized values, when doing debug output for kernel signatures svn-id: r50626 --- engines/sci/engine/kernel.cpp | 18 +++++++++++------- engines/sci/engine/kernel.h | 17 +++++++++-------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 1fd80d2cf7..fb2c60cdb6 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -685,6 +685,9 @@ int Kernel::findRegType(reg_t reg) { if (!reg.segment) return reg.offset ? KSIG_ARITHMETIC : KSIG_ARITHMETIC | KSIG_NULL; + if (reg.segment == 0xFFFF) + return KSIG_UNINITIALIZED; + // Otherwise it's an object SegmentObj *mobj = _segMan->getSegmentObj(reg.segment); if (!mobj) @@ -728,13 +731,14 @@ struct SignatureDebugType { }; static const SignatureDebugType signatureDebugTypeList[] = { - { KSIG_NULL, "null" }, - { KSIG_ARITHMETIC, "value" }, - { KSIG_OBJECT, "object" }, - { KSIG_REF, "reference" }, - { KSIG_LIST, "list" }, - { KSIG_NODE, "node" }, - { 0, NULL } + { KSIG_NULL, "null" }, + { KSIG_ARITHMETIC, "value" }, + { KSIG_UNINITIALIZED, "uninitialized" }, + { KSIG_OBJECT, "object" }, + { KSIG_REF, "reference" }, + { KSIG_LIST, "list" }, + { KSIG_NODE, "node" }, + { 0, NULL } }; static void kernelSignatureDebugType(const char type) { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index cb66aa9f4d..9b4a11f132 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -99,14 +99,15 @@ struct SelectorCache; // from selector.h // Compiled signatures enum { - KSIG_LIST = 0x01, - KSIG_NODE = 0x02, - KSIG_OBJECT = 0x04, - KSIG_REF = 0x08, - KSIG_ARITHMETIC = 0x10, - KSIG_NULL = 0x40, - KSIG_ANY = 0x5f, - KSIG_ELLIPSIS = 0x80 + KSIG_LIST = 0x01, + KSIG_NODE = 0x02, + KSIG_OBJECT = 0x04, + KSIG_REF = 0x08, + KSIG_ARITHMETIC = 0x10, + KSIG_UNINITIALIZED = 0x20, + KSIG_NULL = 0x40, + KSIG_ANY = 0x5f, + KSIG_ELLIPSIS = 0x80 }; // ---------------------------------------------------------------------------- -- cgit v1.2.3 From 10e7581fe1a281f69875a6d76c9c1bf5aafa939c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 4 Jul 2010 00:38:16 +0000 Subject: Added support for horizontally flipped foreground sprites, which are indicated by setting the high bit of frame numbers svn-id: r50638 --- engines/m4/graphics.cpp | 24 ++++++++++++++++++++++++ engines/m4/graphics.h | 2 ++ engines/m4/mads_views.cpp | 24 ++++++++++++++++++------ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 107bcbc6f9..c10ea6c9f6 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -65,6 +65,15 @@ void RGBList::setRange(int start, int count, const RGB8 *src) { Common::copy(&src[0], &src[count], &_data[start]); } +/** + * Creates a duplicate of the given rgb list + */ +RGBList *RGBList::clone() const { + RGBList *dest = new RGBList(_size, _data, false); + _madsVm->_palette->addRange(dest); + return dest; +} + //-------------------------------------------------------------------------- #define VGA_COLOR_TRANS(x) (x == 0x3f ? 255 : x << 2) @@ -931,6 +940,21 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { freeData(); } +M4Surface *M4Surface::flipHorizontal() const { + M4Surface *dest = new M4Surface(width(), height()); + dest->_rgbList = (this->_rgbList == NULL) ? NULL : this->_rgbList->clone(); + + byte *destP = dest->getBasePtr(); + + for (int y = 0; y < height(); ++y) { + const byte *srcP = getBasePtr(width() - 1, y); + for (int x = 0; x < width(); ++x) + *destP++ = *srcP--; + } + + return dest; +} + //-------------------------------------------------------------------------- // Palette class // diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index c2eb11c575..ecb5048b26 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -75,6 +75,7 @@ public: int size() { return _size; } RGB8 &operator[](int idx) { return _data[idx]; } void setRange(int start, int count, const RGB8 *src); + RGBList *clone() const; }; // M4Surface @@ -203,6 +204,7 @@ public: void scrollY(int yAmount); void translate(RGBList *list, bool isTransparent = false); + M4Surface *flipHorizontal() const; }; enum FadeType {FT_TO_GREY, FT_TO_COLOR, FT_TO_BLOCK}; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 9241774d16..9845db7203 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -201,15 +201,23 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { assert(slot.spriteListIndex < (int)_sprites.size()); SpriteAsset &spriteSet = *_sprites[slot.spriteListIndex]; + // Get the sprite frame + int frameNumber = slot.frameNumber & 0x7fff; + bool flipped = (slot.frameNumber & 0x8000) != 0; + M4Sprite *sprite = spriteSet.getFrame(frameNumber - 1); + + M4Surface *spr = sprite; + if (flipped) { + // Create a flipped copy of the sprite temporarily + spr = sprite->flipHorizontal(); + } + if ((slot.scale < 100) && (slot.scale != -1)) { // Minimalised drawing - assert(slot.spriteListIndex < (int)_sprites.size()); - M4Sprite *spr = spriteSet.getFrame((slot.frameNumber & 0x7fff) - 1); viewport->copyFrom(spr, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, - spr->getTransparencyIndex()); + sprite->getTransparencyIndex()); } else { int xp, yp; - M4Sprite *spr = spriteSet.getFrame(slot.frameNumber - 1); if (slot.scale == -1) { xp = slot.xp - _owner._posAdjust.x; @@ -221,12 +229,16 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { if (slot.depth > 1) { // Draw the frame with depth processing - viewport->copyFrom(spr, xp, yp, slot.depth, _owner._depthSurface, 100, spr->getTransparencyIndex()); + viewport->copyFrom(spr, xp, yp, slot.depth, _owner._depthSurface, 100, sprite->getTransparencyIndex()); } else { // No depth, so simply draw the image - spr->copyTo(viewport, xp, yp, spr->getTransparencyIndex()); + spr->copyTo(viewport, xp, yp, sprite->getTransparencyIndex()); } } + + // Free sprite if it was a flipped one + if (flipped) + delete spr; } } -- cgit v1.2.3 From acecfcaf6906f6640d8418c14a3aa2c8833f76e3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 01:11:18 +0000 Subject: Center the surface of a GraphicsWidget in case it is smaller than the widget's size. svn-id: r50639 --- gui/widget.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gui/widget.cpp b/gui/widget.cpp index 2d4306d26a..9297cce344 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -596,7 +596,7 @@ void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) { _gfx.free(); _gfx.create(w, h, sizeof(OverlayColor)); - OverlayColor *dst = (OverlayColor*)_gfx.pixels; + OverlayColor *dst = (OverlayColor *)_gfx.pixels; Graphics::PixelFormat overlayFormat = g_system->getOverlayFormat(); OverlayColor fillCol = overlayFormat.RGBToColor(r, g, b); while (h--) { @@ -607,8 +607,12 @@ void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) { } void GraphicsWidget::drawWidget() { - if (sizeof(OverlayColor) == _gfx.bytesPerPixel && _gfx.pixels) - g_gui.theme()->drawSurface(Common::Rect(_x, _y, _x+_w, _y+_h), _gfx, _state, _alpha, _transparency); + if (sizeof(OverlayColor) == _gfx.bytesPerPixel && _gfx.pixels) { + const int x = _x + (_w - _gfx.w) / 2; + const int y = _y + (_h - _gfx.h) / 2; + + g_gui.theme()->drawSurface(Common::Rect(x, y, x + _gfx.w, y + _gfx.h), _gfx, _state, _alpha, _transparency); + } } #pragma mark - -- cgit v1.2.3 From 336cde4b61df758dd438c9633863d50f5442037c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 01:11:37 +0000 Subject: Always use kThumbnailHeight2 (i.e. 120) for the height of the thumbnail widget. This fixes the thumbnails for games with resolutions != n*200 in the launcher. svn-id: r50640 --- gui/saveload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/saveload.cpp b/gui/saveload.cpp index cef7269b95..92cea00f30 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -182,7 +182,7 @@ void SaveLoadChooser::reflowLayout() { error("Error when loading position data for Save/Load Thumbnails."); int thumbW = kThumbnailWidth; - int thumbH = ((g_system->getHeight() % 200 && g_system->getHeight() != 350) ? kThumbnailHeight2 : kThumbnailHeight1); + int thumbH = kThumbnailHeight2; int thumbX = x + (w >> 1) - (thumbW >> 1); int thumbY = y + kLineHeight; -- cgit v1.2.3 From 052d2ab6f17e6ec239f368ee802a659be46098cc Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 01:18:49 +0000 Subject: Prevent GraphicsWidget from being assigned a surface which wouldn't fit in the widget. svn-id: r50641 --- gui/widget.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gui/widget.cpp b/gui/widget.cpp index 9297cce344..14cb61006b 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -583,6 +583,11 @@ void GraphicsWidget::setGfx(const Graphics::Surface *gfx) { if (!gfx || !gfx->pixels) return; + if (gfx->w > _w || gfx->h > _h) { + warning("GraphicsWidget has size %dx%d, but a surface with %dx%d is to be set", _w, _h, gfx->w, gfx->h); + return; + } + // TODO: add conversion to OverlayColor _gfx.copyFrom(*gfx); } -- cgit v1.2.3 From db01417447a38f66503d33f1fd0b0ec20b5299a9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 01:19:16 +0000 Subject: Fix the size of the ScummVM logo in the launcher in the modern theme. svn-id: r50642 --- gui/themes/scummclassic.zip | Bin 57409 -> 56900 bytes gui/themes/scummmodern.zip | Bin 158996 -> 164185 bytes gui/themes/scummmodern/scummmodern_layout.stx | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 27362daf4a..b5866337ad 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 699cbb319a..aba0c944c3 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index bd514acd85..796d4d9a94 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -110,7 +110,7 @@ -- cgit v1.2.3 From dde6dabac9d6ae6f86cec11607ac15cb748aaf73 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sun, 4 Jul 2010 07:32:12 +0000 Subject: Cleanup: Treat booleans as booleans, not integers. (I hope I didn't mess up, because that would cause some nasty regressions...) svn-id: r50643 --- engines/agos/agos.cpp | 32 +++++++++++++++++--------------- engines/agos/agos.h | 2 +- engines/agos/cursor.cpp | 18 +++++++++--------- engines/agos/draw.cpp | 8 ++++---- engines/agos/event.cpp | 8 ++++---- engines/agos/gfx.cpp | 6 +++--- engines/agos/input.cpp | 16 +++++++++------- engines/agos/verb.cpp | 6 +++--- 8 files changed, 50 insertions(+), 46 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 3ccf6fc18f..8f0e69ffdb 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -202,19 +202,19 @@ AGOSEngine::AGOSEngine(OSystem *syst) _scanFlag = false; _scriptVar2 = 0; - _runScriptReturn1 = 0; - _skipVgaWait = 0; - _noParentNotify = 0; - _beardLoaded = 0; - _litBoxFlag = 0; - _mortalFlag = 0; + _runScriptReturn1 = false; + _skipVgaWait = false; + _noParentNotify = false; + _beardLoaded = false; + _litBoxFlag = false; + _mortalFlag = false; _displayFlag = 0; - _syncFlag2 = 0; - _inCallBack = 0; - _cepeFlag = 0; - _fastMode = 0; + _syncFlag2 = false; + _inCallBack = false; + _cepeFlag = false; + _fastMode = false; - _backFlag = 0; + _backFlag = false; _debugMode = 0; _dumpScripts = false; @@ -631,9 +631,11 @@ Common::Error AGOSEngine::init() { if (ConfMan.hasKey("sfx_mute") && ConfMan.getBool("sfx_mute") == 1) { if (getGameId() == GID_SIMON1DOS) - _midi._enable_sfx ^= 1; - else - _sound->effectsPause(_effectsPaused ^= 1); + _midi._enable_sfx = !_midi._enable_sfx; + else { + _effectsPaused = !_effectsPaused; + _sound->effectsPause(_effectsPaused); + } } _copyProtection = ConfMan.getBool("copy_protection"); @@ -648,7 +650,7 @@ Common::Error AGOSEngine::init() { if (getGameType() == GType_SIMON1) { // English and German versions don't have full subtitles - if (_language == Common::EN_ANY || _language == Common::DE_DEU) + if (_language == Common::EN_ANY || _language == Common::DE_DEU) _subtitles = false; // Other versions require speech to be enabled else diff --git a/engines/agos/agos.h b/engines/agos/agos.h index ab1009e02a..b12bf09d62 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -393,7 +393,7 @@ protected: Common::Point _mouseOld; byte *_mouseData; - byte _animatePointer; + bool _animatePointer; byte _maxCursorWidth, _maxCursorHeight; byte _mouseAnim, _mouseAnimMax, _mouseCursor; byte _currentMouseAnim, _currentMouseCursor; diff --git a/engines/agos/cursor.cpp b/engines/agos/cursor.cpp index 109184e9c7..5ff2f014a6 100644 --- a/engines/agos/cursor.cpp +++ b/engines/agos/cursor.cpp @@ -459,7 +459,7 @@ void AGOSEngine_Simon1::handleMouseMoved() { _leftButtonDown = false; x = 1; } else { - if (_litBoxFlag == 0 && _needHitAreaRecalc == 0) + if (!_litBoxFlag && _needHitAreaRecalc == 0) goto get_out; } @@ -473,7 +473,7 @@ get_out: drawMousePointer(); _needHitAreaRecalc = 0; - _litBoxFlag = 0; + _litBoxFlag = false; } void AGOSEngine_PN::handleMouseMoved() { @@ -538,7 +538,7 @@ void AGOSEngine_PN::handleMouseMoved() { drawMousePointer(); _needHitAreaRecalc = 0; - _litBoxFlag = 0; + _litBoxFlag = false; } void AGOSEngine::handleMouseMoved() { @@ -610,7 +610,7 @@ void AGOSEngine::handleMouseMoved() { _oneClick = 0; x = 1; } else { - if (_litBoxFlag == 0 && _needHitAreaRecalc == 0) + if (!_litBoxFlag && _needHitAreaRecalc == 0) goto get_out; } @@ -622,7 +622,7 @@ get_out: drawMousePointer(); _needHitAreaRecalc = 0; - _litBoxFlag = 0; + _litBoxFlag = false; } void AGOSEngine::mouseOff() { @@ -706,10 +706,10 @@ void AGOSEngine_Feeble::drawMousePointer() { uint cursor; int image, offs; - if (_animatePointer != 0) { + if (_animatePointer) { if (getBitFlag(99)) { - _mouseToggle ^= 1; - if (_mouseToggle != 0) + _mouseToggle = !_mouseToggle; + if (_mouseToggle) _mouseAnim++; } else { _mouseAnim++; @@ -720,7 +720,7 @@ void AGOSEngine_Feeble::drawMousePointer() { cursor = _mouseCursor; - if (_animatePointer == 0 && getBitFlag(99)) { + if (!_animatePointer && getBitFlag(99)) { _mouseAnim = 1; cursor = 6; } else if (_mouseCursor != 5 && getBitFlag(72)) { diff --git a/engines/agos/draw.cpp b/engines/agos/draw.cpp index 300ed4c52b..4d32b4521d 100644 --- a/engines/agos/draw.cpp +++ b/engines/agos/draw.cpp @@ -176,9 +176,9 @@ void AGOSEngine::animateSprites() { _windowNum = 4; - _backFlag = 1; + _backFlag = true; drawImage(&state); - _backFlag = 0; + _backFlag = false; _vgaSpriteChanged++; } @@ -451,14 +451,14 @@ void AGOSEngine::restoreBackGround() { state.paletteMod = 0; state.flags = kDFNonTrans; - _backFlag = 1; + _backFlag = true; drawImage(&state); if (getGameType() != GType_SIMON1 && getGameType() != GType_SIMON2) { animTable->srcPtr = 0; } } - _backFlag = 0; + _backFlag = false; if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { AnimTable *animTableTmp; diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp index 1340d85236..ac552ec285 100644 --- a/engines/agos/event.cpp +++ b/engines/agos/event.cpp @@ -481,7 +481,7 @@ void AGOSEngine::delay(uint amount) { _aboutDialog = new GUI::AboutDialog(); _aboutDialog->runModal(); } else if (event.kbd.keycode == Common::KEYCODE_f) { - _fastMode ^= 1; + _fastMode = !_fastMode; } else if (event.kbd.keycode == Common::KEYCODE_d) { _debugger->attach(); } else if (event.kbd.keycode == Common::KEYCODE_s) { @@ -568,7 +568,7 @@ void AGOSEngine_Feeble::timerProc() { _videoLockOut |= 2; if (!(_videoLockOut & 0x10)) { - _syncFlag2 ^= 1; + _syncFlag2 = !_syncFlag2; if (!_syncFlag2) { processVgaEvents(); } else { @@ -637,7 +637,7 @@ void AGOSEngine_PN::timerProc() { processVgaEvents(); processVgaEvents(); - _cepeFlag ^= 1; + _cepeFlag = !_cepeFlag; if (!_cepeFlag) processVgaEvents(); } @@ -663,7 +663,7 @@ void AGOSEngine::timerProc() { if (!(_videoLockOut & 0x10)) { processVgaEvents(); processVgaEvents(); - _cepeFlag ^= 1; + _cepeFlag = !_cepeFlag; if (!_cepeFlag) processVgaEvents(); } diff --git a/engines/agos/gfx.cpp b/engines/agos/gfx.cpp index e2c634007c..82a4cb714b 100644 --- a/engines/agos/gfx.cpp +++ b/engines/agos/gfx.cpp @@ -730,7 +730,7 @@ void AGOSEngine_Simon1::drawImage(VC10_state *state) { state->paletteMod = 208; } - if (_backFlag == 1) { + if (_backFlag) { drawBackGroundImage(state); } else if (state->flags & kDFMasked) { drawMaskedImage(state); @@ -947,7 +947,7 @@ void AGOSEngine::drawImage(VC10_state *state) { if (getGameType() == GType_ELVIRA2 && getPlatform() == Common::kPlatformAtariST && yoffs > 133) state->palette = 208; - if (_backFlag == 1) { + if (_backFlag) { drawBackGroundImage(state); } else { drawVertImage(state); @@ -1351,7 +1351,7 @@ void AGOSEngine::setWindowImage(uint16 mode, uint16 vgaSpriteId, bool specialCas if (getGameType() == GType_FF || getGameType() == GType_PP) { fillBackGroundFromBack(); - _syncFlag2 = 1; + _syncFlag2 = true; } else { _copyScnFlag = 2; _vgaSpriteChanged++; diff --git a/engines/agos/input.cpp b/engines/agos/input.cpp index 35ed045675..5fc2a64416 100644 --- a/engines/agos/input.cpp +++ b/engines/agos/input.cpp @@ -99,7 +99,7 @@ void AGOSEngine::setup_cond_c_helper() { animMax = 9; } - _animatePointer = 0; + _animatePointer = false; _mouseCursor = cursor; _mouseAnimMax = animMax; _mouseAnim = 1; @@ -574,13 +574,13 @@ bool AGOSEngine::processSpecialKeys() { if (getGameType() == GType_FF || (getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE)) || ((getFeatures() & GF_TALKIE) && _language != Common::EN_ANY && _language != Common::DE_DEU)) { if (_speech) - _subtitles ^= 1; + _subtitles = !_subtitles; } break; case 'v': if (getGameType() == GType_FF || (getGameType() == GType_SIMON2 && (getFeatures() & GF_TALKIE))) { if (_subtitles) - _speech ^= 1; + _speech = !_speech; } break; case '+': @@ -598,7 +598,7 @@ bool AGOSEngine::processSpecialKeys() { syncSoundSettings(); break; case 'm': - _musicPaused ^= 1; + _musicPaused = !_musicPaused; if (_midiEnabled) { _midi.pause(_musicPaused); } @@ -606,14 +606,16 @@ bool AGOSEngine::processSpecialKeys() { break; case 's': if (getGameId() == GID_SIMON1DOS) { - _midi._enable_sfx ^= 1; + _midi._enable_sfx = !_midi._enable_sfx; } else { - _sound->effectsPause(_effectsPaused ^= 1); + _effectsPaused = !_effectsPaused; + _sound->effectsPause(_effectsPaused); } break; case 'b': if (getGameType() == GType_SIMON2) { - _sound->ambientPause(_ambientPaused ^= 1); + _ambientPaused = !_ambientPaused; + _sound->ambientPause(_ambientPaused); } break; default: diff --git a/engines/agos/verb.cpp b/engines/agos/verb.cpp index a85c1627bf..b05bac1e57 100644 --- a/engines/agos/verb.cpp +++ b/engines/agos/verb.cpp @@ -207,7 +207,7 @@ static const char *const czech_verb_prep_names[] = { void AGOSEngine_Feeble::clearName() { stopAnimateSimon2(2, 6); _lastNameOn = NULL; - _animatePointer = 0; + _animatePointer = false; _mouseAnim = 1; return; } @@ -898,7 +898,7 @@ void AGOSEngine::displayName(HitArea *ha) { if (getBitFlag(99)) _animatePointer = ((ha->flags & kBFTextBox) == 0); else - _animatePointer = 1; + _animatePointer = true; if (!getBitFlag(73)) return; @@ -933,7 +933,7 @@ void AGOSEngine_Feeble::invertBox(HitArea *ha, bool state) { _mouseCursor = _oldMouseCursor; } else if (_mouseCursor != 18) { _oldMouseCursor = _mouseCursor; - _animatePointer = 0; + _animatePointer = false; _oldMouseAnimMax = _mouseAnimMax; _mouseAnimMax = 2; _mouseCursor = 18; -- cgit v1.2.3 From 587ba8a90ee1d85cab07107293d96311fcc00c50 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 4 Jul 2010 12:45:33 +0000 Subject: Implemented more of the support methods for player display svn-id: r50644 --- engines/m4/assets.cpp | 37 ++++++++++++++--- engines/m4/assets.h | 23 ++++++++++- engines/m4/mads_player.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++++- engines/m4/mads_player.h | 17 +++++++- engines/m4/mads_views.cpp | 10 ++++- engines/m4/mads_views.h | 3 +- 6 files changed, 178 insertions(+), 12 deletions(-) diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index 0c0bf330a7..9cfb7afc4c 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -98,7 +98,8 @@ long *DataAsset::getRow(int index) { return &_data[_recSize * index]; } -SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, bool asStream) : +SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, + bool asStream, int flags) : BaseAsset(vm) { _stream = stream; _palInterface = NULL; @@ -107,7 +108,7 @@ SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, i if (_vm->isM4()) { loadM4SpriteAsset(vm, stream, asStream); } else { - loadMadsSpriteAsset(vm, stream); + loadMadsSpriteAsset(vm, stream, flags); } } @@ -119,7 +120,7 @@ SpriteAsset::SpriteAsset(MadsM4Engine *vm, const char *name): BaseAsset(vm) { if (_vm->isM4()) { loadM4SpriteAsset(vm, _stream, true); } else { - loadMadsSpriteAsset(vm, _stream); + loadMadsSpriteAsset(vm, _stream, 0); } vm->res()->toss(name); @@ -136,6 +137,8 @@ SpriteAsset::~SpriteAsset() { for (Common::Array::iterator it = _frames.begin(); it != _frames.end(); ++it) { delete (*it).frame; } + + delete _charInfo; } void SpriteAsset::loadM4SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, bool asStream) { @@ -200,7 +203,7 @@ void SpriteAsset::loadM4SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream } -void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream) { +void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int flags) { int curFrame = 0; uint32 frameOffset = 0; MadsPack sprite(stream); @@ -217,7 +220,12 @@ void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStre _isBackground = (type1 != 0) && (type2 < 4); spriteStream->skip(32); _frameCount = spriteStream->readUint16LE(); - // we skip the rest of the data + + if (_vm->isM4() || ((flags & SPRITE_SET_CHAR_INFO) == 0)) + _charInfo = NULL; + else + _charInfo = new MadsSpriteSetCharInfo(spriteStream); + delete spriteStream; // Get the palette data @@ -621,4 +629,23 @@ int32 AssetManager::getSpriteFrameCount(int32 hash) { return _CELS[hash]->getCount(); } +//-------------------------------------------------------------------------- + +MadsSpriteSetCharInfo::MadsSpriteSetCharInfo(Common::SeekableReadStream *s) { + _frameNumber = s->readByte(); + s->skip(1); + _hasIdling = s->readUint16LE() != 0; + + for (int i = 0; i < 16; ++i) + _frameList[i] = s->readUint16LE(); + for (int i = 0; i < 16; ++i) + _frameList2[i] = s->readUint16LE(); + for (int i = 0; i < 16; ++i) + _ticksList[i] = s->readUint16LE(); + + _unk1 = s->readUint16LE(); + _ticksAmount = s->readByte(); + _yScale = s->readByte(); +} + } // End of namespace M4 diff --git a/engines/m4/assets.h b/engines/m4/assets.h index e5beffbcae..e9902d8aa6 100644 --- a/engines/m4/assets.h +++ b/engines/m4/assets.h @@ -44,6 +44,8 @@ namespace M4 { #define CELS__PAL MKID_BE(' PAL') //' PAL' #define CELS___SS MKID_BE(' SS') //' SS' +#define SPRITE_SET_CHAR_INFO 4 + class MadsM4Engine; class Palette; @@ -100,13 +102,28 @@ struct SpriteAssetFrame { M4Sprite *frame; }; +class MadsSpriteSetCharInfo { +public: + MadsSpriteSetCharInfo(Common::SeekableReadStream *s); + + int _frameNumber; + int _hasIdling; + int _frameList2[16]; + int _frameList[16]; + int _ticksList[16]; + int _unk1; + int _ticksAmount; + int _yScale; +}; + class SpriteAsset : public BaseAsset { public: - SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, bool asStream = false); + SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, + bool asStream = false, int flags = 0); SpriteAsset(MadsM4Engine *vm, const char *name); ~SpriteAsset(); void loadM4SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, bool asStream); - void loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream); + void loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int flags); int32 getCount() { return _frameCount; } int32 getFrameRate() const { return _frameRate; } int32 getPixelSpeed() const { return _pixelSpeed; } @@ -124,6 +141,8 @@ public: void translate(Palette *palette); int32 getFrameSize(int index); M4Sprite *operator[](int index) { return getFrame(index); } +public: + MadsSpriteSetCharInfo *_charInfo; protected: Common::SeekableReadStream *_stream; RGB8 _palette[256]; diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 53ee857093..2ba009459e 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -29,6 +29,10 @@ namespace M4 { +const int MadsPlayer::_directionListIndexes[32] = { + 0, 7, 4, 3, 6, 0, 2, 5, 0, 1, 9, 4, 1, 2, 7, 9, 3, 8, 9, 6, 7, 2, 3, 6, 1, 7, 9, 4, 7, 8, 0, 0 +}; + MadsPlayer::MadsPlayer() { _playerPos = Common::Point(160, 78); _direction = 0; @@ -48,6 +52,11 @@ MadsPlayer::MadsPlayer() { _spriteSetIndexes[idx] = 0; _frameNum = 0; _frameOffset = 0; + _unk1 = 0; + _newFrame = 0; + _frameListIndex = 0; + _actionIndex = 0; + resetActionList(); } /** @@ -79,7 +88,7 @@ bool MadsPlayer::loadSprites(const char *prefix) { *digitP = suffixList[idx]; _spriteSetIndexes[idx] = -1; - int setIndex = _madsVm->scene()->_spriteSlots.addSprites(setName, true); + int setIndex = _madsVm->scene()->_spriteSlots.addSprites(setName, true, SPRITE_SET_CHAR_INFO); if (setIndex < 0) { if (idx < 7) break; @@ -165,7 +174,66 @@ void MadsPlayer::update() { _forceRefresh = false; } +/** + * Idling animation for player + */ void MadsPlayer::idle() { + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + assert(spriteSet._charInfo); + + if (!spriteSet._charInfo->_hasIdling) { + _frameNum = 1; + } else { + _frameListIndex = _actionList[_actionIndex]; + + if (!_visible) { + _unk2 = 0; + } else { + _unk2 = _actionList2[_actionIndex]; + + if (_actionIndex > 0) + --_actionIndex; + } + + // Set the player frame number + int frameIndex = ABS(_frameListIndex); + _frameNum = (_frameListIndex <= 0) ? spriteSet._charInfo->_frameList[frameIndex] : + spriteSet._charInfo->_frameList2[frameIndex]; + + // Set next waiting period in ticks + if (frameIndex == 0) + setTicksAmount(); + else + _madsVm->scene()->_ticksAmount = spriteSet._charInfo->_ticksList[frameIndex]; + } +} + +void MadsPlayer::setupFrame() { + resetActionList(); + _frameOffset = 0; + _spriteListIdx2 = _directionListIndexes[_direction]; + if (_spriteSetIndexes[_spriteListIdx2] == 0) { + _spriteListIdx2 = 4; + _frameOffset = 0x8000; + } + + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + assert(spriteSet._charInfo); + _unk1 = MAX(spriteSet._charInfo->_unk1, 100); + setTicksAmount(); + + _newFrame = spriteSet._charInfo->_frameNumber; + if (_newFrame == 0) + _newFrame = spriteSet.getCount(); + + _yScale = spriteSet._charInfo->_yScale; + + if ((_frameNum <= 0) || (_frameNum > _newFrame)) + _frameNum = 1; + _forceRefresh = true; +} + +void MadsPlayer::step() { } @@ -190,4 +258,34 @@ int MadsPlayer::getSpriteSlot() { return -1; } +void MadsPlayer::setTicksAmount() { + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + assert(spriteSet._charInfo); + _madsVm->scene()->_ticksAmount = spriteSet._charInfo->_ticksAmount; + if (_madsVm->scene()->_ticksAmount == 0) + _madsVm->scene()->_ticksAmount = 6; +} + +void MadsPlayer::resetActionList() { + _actionList[0] = 0; + _actionList2[0] = 0; + _actionIndex = 0; + _unk2 = 0; + _unk3 = 0; +} + +int MadsPlayer::queueAction(int action1, int action2) { + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + assert(spriteSet._charInfo); + + if ((spriteSet._charInfo->_hasIdling) && (_actionIndex < 11)) { + ++_actionIndex; + _actionList[_actionIndex] = action1; + _actionList2[_actionIndex] = action2; + return false; + } + + return true; +} + } // End of namespace M4 diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index c84c1d0c60..0a746575f1 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -36,6 +36,9 @@ class MadsPlayer { private: int getScale(int yp); int getSpriteSlot(); + void setTicksAmount(); + void resetActionList(); + int queueAction(int v0, int v1); public: char _spritesPrefix[16]; int _spriteSetCount; @@ -51,14 +54,26 @@ public: int16 _currentDepth; int16 _spriteListIdx, _spriteListIdx2; bool _spritesChanged; - int16 _frameOffset, _frameNum; + uint16 _frameOffset, _frameNum; bool _moving; + int _unk1; + int _newFrame; + int _frameListIndex; + int _actionIndex; + int _actionList[12]; + int _actionList2[12]; + int _unk2; + int _unk3; + + static const int _directionListIndexes[32]; public: MadsPlayer(); bool loadSprites(const char *prefix); void update(); void idle(); + void setupFrame(); + void step(); }; } // End of namespace M4 diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 9845db7203..d6d71c8eee 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -86,7 +86,7 @@ int MadsSpriteSlots::getIndex() { return startIndex++; } -int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors) { +int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors, int flags) { // If errors are suppressed, first check if the resource exists if (suppressErrors) { if (!_vm->res()->resourceExists(resName)) @@ -95,7 +95,7 @@ int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors) { // Get the sprite set Common::SeekableReadStream *data = _vm->res()->get(resName); - SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName); + SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName, flags); spriteSet->translate(_madsVm->_palette); assert(spriteSet != NULL); @@ -105,6 +105,12 @@ int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors) { return _sprites.size() - 1; } +int MadsSpriteSlots::addSprites(SpriteAsset *spriteSet) { + _sprites.push_back(spriteSet); + + return _sprites.size() - 1; +} + void MadsSpriteSlots::deleteSprites(int listIndex) { if (listIndex < 0) return; diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 38c7ed0712..ead6ae94bf 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -92,7 +92,8 @@ public: } int getIndex(); - int addSprites(const char *resName, bool suppressErrors = false); + int addSprites(const char *resName, bool suppressErrors = false, int flags = 0); + int addSprites(SpriteAsset *spriteSet); void deleteSprites(int listIndex); void clear(); void deleteTimer(int seqIndex); -- cgit v1.2.3 From 7d64f3e34369ef43d6a9e03d9b8cb3752c300afe Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 4 Jul 2010 14:55:28 +0000 Subject: SCI: Added a short description for all opcodes, so that it's easier to understand what they do without cross referencing the wiki, and removed some obsolete and unused code svn-id: r50645 --- engines/sci/engine/vm.cpp | 101 +++++++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 28 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 45cb117bcf..fa970b88e2 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1046,6 +1046,7 @@ void run_vm(EngineState *s, bool restoring) { switch (opcode) { case op_bnot: // 0x00 (00) + // Binary not s->r_acc = ACC_ARITHMETIC_L(0xffff ^ /*acc*/); break; @@ -1129,10 +1130,12 @@ void run_vm(EngineState *s, bool restoring) { break; case op_shr: // 0x06 (06) + // Shift right logical s->r_acc = ACC_ARITHMETIC_L(((uint16)POP()) >> /*acc*/); break; case op_shl: // 0x07 (07) + // Shift left logical s->r_acc = ACC_ARITHMETIC_L(((uint16)POP()) << /*acc*/); break; @@ -1158,6 +1161,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_eq_: // 0x0d (13) + // == s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, r_temp == s->r_acc); @@ -1165,6 +1169,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ne_: // 0x0e (14) + // != s->r_prev = s->r_acc; r_temp = POP32(); s->r_acc = make_reg(0, r_temp != s->r_acc); @@ -1172,6 +1177,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_gt_: // 0x0f (15) + // > s->r_prev = s->r_acc; r_temp = POP32(); if (r_temp.segment && s->r_acc.segment) { @@ -1190,6 +1196,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ge_: // 0x10 (16) + // >= s->r_prev = s->r_acc; r_temp = POP32(); if (r_temp.segment && s->r_acc.segment) { @@ -1201,6 +1208,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_lt_: // 0x11 (17) + // < s->r_prev = s->r_acc; r_temp = POP32(); if (r_temp.segment && s->r_acc.segment) { @@ -1218,6 +1226,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_le_: // 0x12 (18) + // <= s->r_prev = s->r_acc; r_temp = POP32(); if (r_temp.segment && s->r_acc.segment) { @@ -1229,6 +1238,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ugt_: // 0x13 (19) + // > (unsigned) s->r_prev = s->r_acc; r_temp = POP32(); @@ -1251,6 +1261,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_uge_: // 0x14 (20) + // >= (unsigned) s->r_prev = s->r_acc; r_temp = POP32(); @@ -1264,6 +1275,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ult_: // 0x15 (21) + // < (unsigned) s->r_prev = s->r_acc; r_temp = POP32(); @@ -1277,6 +1289,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ule_: // 0x16 (22) + // <= (unsigned) s->r_prev = s->r_acc; r_temp = POP32(); @@ -1290,11 +1303,13 @@ void run_vm(EngineState *s, bool restoring) { break; case op_bt: // 0x17 (23) + // Branch relative if true if (s->r_acc.offset || s->r_acc.segment) s->xs->addr.pc.offset += opparams[0]; break; case op_bnt: // 0x18 (24) + // Branch relative if not true if (!(s->r_acc.offset || s->r_acc.segment)) s->xs->addr.pc.offset += opparams[0]; break; @@ -1304,22 +1319,27 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ldi: // 0x1a (26) + // Load data immediate s->r_acc = make_reg(0, opparams[0]); break; case op_push: // 0x1b (27) + // Push to stack PUSH32(s->r_acc); break; case op_pushi: // 0x1c (28) + // Push immediate PUSH(opparams[0]); break; case op_toss: // 0x1d (29) + // TOS (Top Of Stack) subtract s->xs->sp--; break; case op_dup: // 0x1e (30) + // Duplicate TOD (Top Of Stack) element r_temp = s->xs->sp[-1]; PUSH32(r_temp); break; @@ -1329,22 +1349,12 @@ void run_vm(EngineState *s, bool restoring) { // We put special segment 0xFFFF in there, so that uninitialized reads can get detected for (int i = 0; i < opparams[0]; i++) s->xs->sp[i] = make_reg(0xffff, 0); -// for (int i = 0; i < opparams[0]; i++) -// s->xs->sp[i] = make_reg(0, 'ss'); - - //if (local_script->getScriptNumber() == 140 && isIslandOfDrBrain) { - // // WORKAROUND for The Island of Dr. Brain, room 140. - // // Script 140 runs in an endless loop if we set its - // // variables to 0 here. - //} else { - // for (int i = 0; i < opparams[0]; i++) - // s->xs->sp[i] = NULL_REG; - //} s->xs->sp += opparams[0]; break; case op_call: { // 0x20 (32) + // Call a script subroutine int argc = (opparams[1] >> 1) // Given as offset, but we need count + 1 + s->restAdjust; StackPtr call_base = s->xs->sp - argc; @@ -1366,6 +1376,7 @@ void run_vm(EngineState *s, bool restoring) { } case op_callk: { // 0x21 (33) + // Call kernel function gcCountDown(s); s->xs->sp -= (opparams[1] >> 1) + 1; @@ -1398,6 +1409,7 @@ void run_vm(EngineState *s, bool restoring) { } case op_callb: // 0x22 (34) + // Call base script temp = ((opparams[1] >> 1) + s->restAdjust + 1); s_temp = s->xs->sp; s->xs->sp -= temp; @@ -1411,6 +1423,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_calle: // 0x23 (35) + // Call external script temp = ((opparams[2] >> 1) + s->restAdjust + 1); s_temp = s->xs->sp; s->xs->sp -= temp; @@ -1425,6 +1438,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_ret: // 0x24 (36) + // Return from an execution loop started by call, calle, callb, send, self or super do { StackPtr old_sp2 = s->xs->sp; StackPtr old_fp = s->xs->fp; @@ -1467,6 +1481,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_send: // 0x25 (37) + // Send for one or more selectors s_temp = s->xs->sp; s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack @@ -1487,6 +1502,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_class: // 0x28 (40) + // Get class address s->r_acc = s->_segMan->getClassAddress((unsigned)opparams[0], SCRIPT_GET_LOCK, s->xs->addr.pc); break; @@ -1496,6 +1512,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_self: // 0x2a (42) + // Send to self s_temp = s->xs->sp; s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack @@ -1511,6 +1528,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_super: // 0x2b (43) + // Send to any class r_temp = s->_segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, s->xs->addr.pc); if (!r_temp.segment) @@ -1533,6 +1551,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_rest: // 0x2c (44) + // Pushes all or part of the parameter variable list on the stack temp = (uint16) opparams[0]; // First argument s->restAdjust = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't @@ -1542,6 +1561,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_lea: // 0x2d (45) + // Load Effective Address temp = (uint16) opparams[0] >> 1; var_number = temp & 0x03; // Get variable type @@ -1560,6 +1580,7 @@ void run_vm(EngineState *s, bool restoring) { case op_selfID: // 0x2e (46) + // Get 'self' identity s->r_acc = s->xs->objp; break; @@ -1568,66 +1589,60 @@ void run_vm(EngineState *s, bool restoring) { break; case op_pprev: // 0x30 (48) + // Pushes the value of the prev register, set by the last comparison + // bytecode (eq?, lt?, etc.), on the stack PUSH32(s->r_prev); break; case op_pToa: // 0x31 (49) + // Property To Accumulator s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); break; case op_aTop: // 0x32 (50) + // Accumulator To Property OBJ_PROPERTY(obj, (opparams[0] >> 1)) = s->r_acc; break; case op_pTos: // 0x33 (51) + // Property To Stack PUSH32(OBJ_PROPERTY(obj, opparams[0] >> 1)); break; case op_sTop: // 0x34 (52) + // Stack To Property OBJ_PROPERTY(obj, (opparams[0] >> 1)) = POP32(); break; case op_ipToa: // 0x35 (53) + // Incement Property and copy To Accumulator s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(1 + /*acc*/); break; case op_dpToa: { // 0x36 (54) + // Decrement Property and copy To Accumulator s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); -#if 0 - // Speed throttling is possible here as well - // although this opens other issues like mud wrestling in lsl5 uses another local variable for delays - Object *var_container = obj; - if (!(obj->getInfoSelector().offset & SCRIPT_INFO_CLASS)) - var_container = s->_segMan->getObject(obj->getSuperClassSelector()); - uint16 varSelector = var_container->getVarSelector(opparams[0] >> 1); -// printf("%X\n", varSelector); -// printf("%s\n", g_sci->getKernel()->getSelectorName(varSelector).c_str()); - if ((varSelector == 0x84) || (varSelector == 0x92))) { - // selectors cycles, cycleCnt from lsl5 hardcoded - uint32 curTime = g_system->getMillis(); - if (s->_lastAnimateTime + 30 > curTime) - break; - s->_lastAnimateTime = curTime; - } -#endif s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(-1 + /*acc*/); break; } case op_ipTos: // 0x37 (55) + // Increment Property and push to Stack validate_arithmetic(OBJ_PROPERTY(obj, (opparams[0] >> 1))); temp = ++OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; case op_dpTos: // 0x38 (56) + // Decrement Property and push to Stack validate_arithmetic(OBJ_PROPERTY(obj, (opparams[0] >> 1))); temp = --OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; case op_lofsa: // 0x39 (57) + // Load Offset to Accumulator s->r_acc.segment = s->xs->addr.pc.segment; switch (g_sci->_features->detectLofsType()) { @@ -1648,6 +1663,7 @@ void run_vm(EngineState *s, bool restoring) { break; case op_lofss: // 0x3a (58) + // Load Offset to Stack r_temp.segment = s->xs->addr.pc.segment; switch (g_sci->_features->detectLofsType()) { @@ -1697,6 +1713,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lal: // 0x41 (65) case op_lat: // 0x42 (66) case op_lap: // 0x43 (67) + // Load global, local, temp or param variable into the accumulator var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; s->r_acc = READ_VAR(var_type, var_number); @@ -1706,6 +1723,7 @@ void run_vm(EngineState *s, bool restoring) { case op_lsl: // 0x45 (69) case op_lst: // 0x46 (70) case op_lsp: // 0x47 (71) + // Load global, local, temp or param variable into the stack var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; PUSH32(READ_VAR(var_type, var_number)); @@ -1715,6 +1733,8 @@ void run_vm(EngineState *s, bool restoring) { case op_lali: // 0x49 (73) case op_lati: // 0x4a (74) case op_lapi: // 0x4b (75) + // Load global, local, temp or param variable into the accumulator, + // using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); s->r_acc = READ_VAR(var_type, var_number); @@ -1724,6 +1744,8 @@ void run_vm(EngineState *s, bool restoring) { case op_lsli: // 0x4d (77) case op_lsti: // 0x4e (78) case op_lspi: // 0x4f (79) + // Load global, local, temp or param variable into the stack, + // using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); PUSH32(READ_VAR(var_type, var_number)); @@ -1733,6 +1755,7 @@ void run_vm(EngineState *s, bool restoring) { case op_sal: // 0x51 (81) case op_sat: // 0x52 (82) case op_sap: // 0x53 (83) + // Save the accumulator into the global, local, temp or param variable var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; WRITE_VAR(var_type, var_number, s->r_acc); @@ -1742,6 +1765,7 @@ void run_vm(EngineState *s, bool restoring) { case op_ssl: // 0x55 (85) case op_sst: // 0x56 (86) case op_ssp: // 0x57 (87) + // Save the stack into the global, local, temp or param variable var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; WRITE_VAR(var_type, var_number, POP32()); @@ -1751,6 +1775,9 @@ void run_vm(EngineState *s, bool restoring) { case op_sali: // 0x59 (89) case op_sati: // 0x5a (90) case op_sapi: // 0x5b (91) + // Save the accumulator into the global, local, temp or param variable, + // using the accumulator as an additional index + // Special semantics because it wouldn't really make a whole lot // of sense otherwise, with acc being used for two things // simultaneously... @@ -1764,6 +1791,8 @@ void run_vm(EngineState *s, bool restoring) { case op_ssli: // 0x5d (93) case op_ssti: // 0x5e (94) case op_sspi: // 0x5f (95) + // Save the stack into the global, local, temp or param variable, + // using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); WRITE_VAR(var_type, var_number, POP32()); @@ -1773,6 +1802,8 @@ void run_vm(EngineState *s, bool restoring) { case op_plusal: // 0x61 (97) case op_plusat: // 0x62 (98) case op_plusap: // 0x63 (99) + // Increment the global, local, temp or param variable and save it + // to the accumulator var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = READ_VAR(var_type, var_number); @@ -1788,6 +1819,8 @@ void run_vm(EngineState *s, bool restoring) { case op_plussl: // 0x65 (101) case op_plusst: // 0x66 (102) case op_plussp: // 0x67 (103) + // Increment the global, local, temp or param variable and save it + // to the stack var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = READ_VAR(var_type, var_number); @@ -1804,6 +1837,8 @@ void run_vm(EngineState *s, bool restoring) { case op_plusali: // 0x69 (105) case op_plusati: // 0x6a (106) case op_plusapi: // 0x6b (107) + // Increment the global, local, temp or param variable and save it + // to the accumulator, using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = READ_VAR(var_type, var_number); @@ -1819,6 +1854,8 @@ void run_vm(EngineState *s, bool restoring) { case op_plussli: // 0x6d (109) case op_plussti: // 0x6e (110) case op_plusspi: // 0x6f (111) + // Increment the global, local, temp or param variable and save it + // to the stack, using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = READ_VAR(var_type, var_number); @@ -1835,6 +1872,8 @@ void run_vm(EngineState *s, bool restoring) { case op_minusal: // 0x71 (113) case op_minusat: // 0x72 (114) case op_minusap: // 0x73 (115) + // Decrement the global, local, temp or param variable and save it + // to the accumulator var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = READ_VAR(var_type, var_number); @@ -1850,6 +1889,8 @@ void run_vm(EngineState *s, bool restoring) { case op_minussl: // 0x75 (117) case op_minusst: // 0x76 (118) case op_minussp: // 0x77 (119) + // Decrement the global, local, temp or param variable and save it + // to the stack var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0]; r_temp = READ_VAR(var_type, var_number); @@ -1866,6 +1907,8 @@ void run_vm(EngineState *s, bool restoring) { case op_minusali: // 0x79 (121) case op_minusati: // 0x7a (122) case op_minusapi: // 0x7b (123) + // Decrement the global, local, temp or param variable and save it + // to the accumulator, using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = READ_VAR(var_type, var_number); @@ -1881,6 +1924,8 @@ void run_vm(EngineState *s, bool restoring) { case op_minussli: // 0x7d (125) case op_minussti: // 0x7e (126) case op_minusspi: // 0x7f (127) + // Decrement the global, local, temp or param variable and save it + // to the stack, using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); r_temp = READ_VAR(var_type, var_number); -- cgit v1.2.3 From 6c9e3b01da554b44bd8d5adac11f95ae3aa52599 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sun, 4 Jul 2010 15:06:42 +0000 Subject: GUI/AUDIO: This change will make individual game audio settings take over the audio device from the global settings if no device config key is found for that game (This should fix the problem reported by LordHoto on devel. It might make sense to implement this behaviour to other settings, like subtitle mode etc.) svn-id: r50646 --- gui/options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 5dba2bafd5..ceb5073576 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -803,8 +803,8 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se if (!popup || !popup->isEnabled()) return true; - if (ConfMan.hasKey(setting, _domain) || preferredType) { - const Common::String drv = ConfMan.get(setting, _domain); + if (_domain != Common::ConfigManager::kApplicationDomain || ConfMan.hasKey(setting, _domain) || preferredType) { + const Common::String drv = ConfMan.get(setting, (_domain != Common::ConfigManager::kApplicationDomain && !ConfMan.hasKey(setting, _domain)) ? Common::ConfigManager::kApplicationDomain : _domain); const MusicPlugin::List p = MusicMan.getPlugins(); int id = 0; for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; m++) { -- cgit v1.2.3 From 8f2c0c2ff0ab33315e04bb49cb98ece01fb4bd7f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 17:40:06 +0000 Subject: Cleanup. svn-id: r50647 --- gui/options.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index ceb5073576..65a79dedb8 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -136,10 +136,6 @@ void OptionsDialog::init() { } } -template bool equalsDeviceProperty(MusicDevices::iterator d, T lookupProp, Common::MemFunc0 devicePropFunc) { - return lookupProp == devicePropFunc(&*d); -} - bool musicDeviceSkipSettingDefault(MusicDevices::iterator d, Common::String dom, MusicPlugin::List::const_iterator &m, uint32 guio) { return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || (dom != Common::ConfigManager::kApplicationDomain && (!(guio & MidiDriver::musicType2GUIO((uint32)-1)) || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null" ? true : false; } @@ -810,9 +806,9 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; m++) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if ((setting.empty()) ? equalsDeviceProperty(d, preferredType, Common::mem_fun(&MusicDevice::getMusicType)) : equalsDeviceProperty(d, drv, Common::mem_fun(&MusicDevice::getCompleteId))) { + if (setting.empty() ? (preferredType == d->getMusicType()) : (drv == d->getCompleteId())) { popup->setSelected(id); - id = -1; + id = -1; break; } else if (skipfunc(d, _domain, m, _guioptions)) { id++; @@ -821,7 +817,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se } if (id != -1) // midi device turned off or whatever - return false; + return false; } else { return false; } -- cgit v1.2.3 From da1a8535b4b06072ca99a253aff55da9287672e1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 18:00:46 +0000 Subject: More cleanup / readability fixes. svn-id: r50648 --- gui/options.cpp | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 65a79dedb8..fea1ba7d29 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -137,12 +137,15 @@ void OptionsDialog::init() { } bool musicDeviceSkipSettingDefault(MusicDevices::iterator d, Common::String dom, MusicPlugin::List::const_iterator &m, uint32 guio) { - return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || (dom != Common::ConfigManager::kApplicationDomain && (!(guio & MidiDriver::musicType2GUIO((uint32)-1)) || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null" ? true : false; + return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) + || (dom != Common::ConfigManager::kApplicationDomain && (!(guio & MidiDriver::musicType2GUIO((uint32)-1)) || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) + || d->getMusicDriverId() == "auto" + || d->getMusicDriverId() == "null"; } bool musicDeviceSkipSettingSpec(MusicDevices::iterator d, Common::String, MusicPlugin::List::const_iterator &m, uint32) { if (d->getMusicDriverId() == "auto") - m++; + ++m; return ((d->getMusicType() >= MT_GM) || d->getMusicDriverId() == "auto") ? true : false; } @@ -209,7 +212,7 @@ void OptionsDialog::open() { if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec)) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_mt32DevicePopUp, "", musicDeviceSkipSettingSpec, MT_MT32)) + if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), musicDeviceSkipSettingSpec, MT_MT32)) _mt32DevicePopUp->setSelected(0); } else { _mt32DevicePopUp->setSelected(0); @@ -218,7 +221,7 @@ void OptionsDialog::open() { if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec)) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_gmDevicePopUp, "", musicDeviceSkipSettingSpec, MT_GM)) + if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), musicDeviceSkipSettingSpec, MT_GM)) _gmDevicePopUp->setSelected(0); } else { _gmDevicePopUp->setSelected(0); @@ -294,7 +297,7 @@ void OptionsDialog::open() { // Subtitle options if (_subToggleGroup) { - int speed; + int speed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); int subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); @@ -666,14 +669,15 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref const MusicPlugin::List p = MusicMan.getPlugins(); int musicId = 0; int midiId = 0; - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) || // global dialog - skip useless FM-Towns option there - (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) || // No flags are specified - _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType())) // flag is present - || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) // global dialog - skip useless FM-Towns option there + || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified + || _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType())) // flag is present + || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device _midiPopUp->appendEntry(d->getCompleteName(), musicId++); + if (d->getMusicType() >= MT_GM || m == p.begin()) { _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId++); @@ -802,10 +806,11 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se if (_domain != Common::ConfigManager::kApplicationDomain || ConfMan.hasKey(setting, _domain) || preferredType) { const Common::String drv = ConfMan.get(setting, (_domain != Common::ConfigManager::kApplicationDomain && !ConfMan.hasKey(setting, _domain)) ? Common::ConfigManager::kApplicationDomain : _domain); const MusicPlugin::List p = MusicMan.getPlugins(); + int id = 0; - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { if (setting.empty() ? (preferredType == d->getMusicType()) : (drv == d->getCompleteId())) { popup->setSelected(id); id = -1; @@ -815,6 +820,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se } } } + if (id != -1) // midi device turned off or whatever return false; @@ -832,15 +838,15 @@ void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String se const MusicPlugin::List p = MusicMan.getPlugins(); uint32 id = 0; bool found = false; - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && !found; m++) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && !found; ++m) { MusicDevices i = (**m)->getDevices(); - for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { if (id == popup->getSelectedTag()) { ConfMan.set(setting, d->getCompleteId(), _domain); found = true; break; } else if (skipfunc(d, _domain, m, _guioptions)) { - id++; + ++id; } } } -- cgit v1.2.3 From 9880017c1120eb7646c1b455a899a0d1498bb05a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 18:03:18 +0000 Subject: Prevent the MT-32 Emulator from being displayed in the "GM Device" pop up. svn-id: r50649 --- gui/options.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index fea1ba7d29..9fd20e0d01 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -678,9 +678,10 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device _midiPopUp->appendEntry(d->getCompleteName(), musicId++); - if (d->getMusicType() >= MT_GM || m == p.begin()) { + if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); - _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId++); + if (d->getMusicType() != MT_MT32) + _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId++); } } } -- cgit v1.2.3 From 9cf1cff5fc72468b1af2fc584c8375f509d6437c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 18:07:34 +0000 Subject: Whoops, always increase midiId, not only when it's added to the GM Device popup. svn-id: r50650 --- gui/options.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index 9fd20e0d01..5fd9243653 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -681,7 +681,8 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); if (d->getMusicType() != MT_MT32) - _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId++); + _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId); + ++midiId; } } } -- cgit v1.2.3 From 2f138f60555b3a2141a582bc561a81108faf6964 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 4 Jul 2010 18:24:13 +0000 Subject: Simplify audio device settings handling by using the device handle as tag instead of newly created id. svn-id: r50651 --- gui/options.cpp | 65 ++++++++++++++++----------------------------------------- gui/options.h | 5 ++--- 2 files changed, 20 insertions(+), 50 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 5fd9243653..74287667c2 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -136,19 +136,6 @@ void OptionsDialog::init() { } } -bool musicDeviceSkipSettingDefault(MusicDevices::iterator d, Common::String dom, MusicPlugin::List::const_iterator &m, uint32 guio) { - return (dom == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) - || (dom != Common::ConfigManager::kApplicationDomain && (!(guio & MidiDriver::musicType2GUIO((uint32)-1)) || (guio & (MidiDriver::musicType2GUIO(d->getMusicType()))))) - || d->getMusicDriverId() == "auto" - || d->getMusicDriverId() == "null"; -} - -bool musicDeviceSkipSettingSpec(MusicDevices::iterator d, Common::String, MusicPlugin::List::const_iterator &m, uint32) { - if (d->getMusicDriverId() == "auto") - ++m; - return ((d->getMusicType() >= MT_GM) || d->getMusicDriverId() == "auto") ? true : false; -} - void OptionsDialog::open() { Dialog::open(); @@ -207,21 +194,21 @@ void OptionsDialog::open() { } // Audio options - if (!loadMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault)) + if (!loadMusicDeviceSetting(_midiPopUp, "music_driver")) _midiPopUp->setSelected(0); - if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec)) { + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device")) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), musicDeviceSkipSettingSpec, MT_MT32)) + if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), MT_MT32)) _mt32DevicePopUp->setSelected(0); } else { _mt32DevicePopUp->setSelected(0); } } - if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec)) { + if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device")) { if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), musicDeviceSkipSettingSpec, MT_GM)) + if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), MT_GM)) _gmDevicePopUp->setSelected(0); } else { _gmDevicePopUp->setSelected(0); @@ -365,9 +352,9 @@ void OptionsDialog::close() { // Audio options if (_midiPopUp) { if (_enableAudioSettings) { - saveMusicDeviceSetting(_midiPopUp, "music_driver", musicDeviceSkipSettingDefault); - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device", musicDeviceSkipSettingSpec); - saveMusicDeviceSetting(_gmDevicePopUp, "gm_device", musicDeviceSkipSettingSpec); + saveMusicDeviceSetting(_midiPopUp, "music_driver"); + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"); + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device"); } else { ConfMan.removeKey("music_driver", _domain); ConfMan.removeKey("mt32_device", _domain); @@ -667,8 +654,6 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1); const MusicPlugin::List p = MusicMan.getPlugins(); - int musicId = 0; - int midiId = 0; for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { @@ -676,13 +661,12 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified || _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType())) // flag is present || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device - _midiPopUp->appendEntry(d->getCompleteName(), musicId++); + _midiPopUp->appendEntry(d->getCompleteName(), d->getHandle()); if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { - _mt32DevicePopUp->appendEntry(d->getCompleteName(), midiId); + _mt32DevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); if (d->getMusicType() != MT_MT32) - _gmDevicePopUp->appendEntry(d->getCompleteName(), midiId); - ++midiId; + _gmDevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); } } } @@ -801,7 +785,7 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _enableVolumeSettings = true; } -bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc, MusicType preferredType) { +bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicType preferredType) { if (!popup || !popup->isEnabled()) return true; @@ -809,46 +793,33 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se const Common::String drv = ConfMan.get(setting, (_domain != Common::ConfigManager::kApplicationDomain && !ConfMan.hasKey(setting, _domain)) ? Common::ConfigManager::kApplicationDomain : _domain); const MusicPlugin::List p = MusicMan.getPlugins(); - int id = 0; - for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && id != -1; ++m) { + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { if (setting.empty() ? (preferredType == d->getMusicType()) : (drv == d->getCompleteId())) { - popup->setSelected(id); - id = -1; - break; - } else if (skipfunc(d, _domain, m, _guioptions)) { - id++; + popup->setSelectedTag(d->getHandle()); + return true; } } } - - if (id != -1) - // midi device turned off or whatever - return false; - } else { - return false; } - return true; + return false; } -void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc) { +void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting) { if (!popup || !_enableAudioSettings) return; const MusicPlugin::List p = MusicMan.getPlugins(); - uint32 id = 0; bool found = false; for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && !found; ++m) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { - if (id == popup->getSelectedTag()) { + if (d->getHandle() == popup->getSelectedTag()) { ConfMan.set(setting, d->getCompleteId(), _domain); found = true; break; - } else if (skipfunc(d, _domain, m, _guioptions)) { - ++id; } } } diff --git a/gui/options.h b/gui/options.h index baaf6471c9..235cb24462 100644 --- a/gui/options.h +++ b/gui/options.h @@ -79,9 +79,8 @@ protected: void setVolumeSettingsState(bool enabled); void setSubtitleSettingsState(bool enabled); - typedef bool (MusicDeviceSkipFunc)(MusicDevices::iterator, Common::String, MusicPlugin::List::const_iterator&, uint32); - bool loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc, MusicType preferredType = MT_AUTO); - void saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicDeviceSkipFunc skipfunc); + bool loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicType preferredType = MT_AUTO); + void saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting); TabWidget *_tabWidget; int _graphicsTabId; -- cgit v1.2.3 From 6219ffe52f2f38dfcdf000227554eaa8d9d3098c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 4 Jul 2010 21:31:09 +0000 Subject: SCI: Removed the unused line number parameter from validate_variable() and related functions svn-id: r50654 --- engines/sci/engine/vm.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index fa970b88e2..83bcae9673 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -228,7 +228,7 @@ static int signed_validate_arithmetic(reg_t reg) { return (int16)validate_arithmetic(reg); } -static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, int index, int line) { +static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, int index) { const char *names[4] = {"global", "local", "temp", "param"}; if (index < 0 || index >= max) { @@ -364,8 +364,8 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t default_value) { - if (validate_variable(r, stack_base, type, max, index, line)) { +static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t default_value) { + if (validate_variable(r, stack_base, type, max, index)) { if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually @@ -380,8 +380,8 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i return default_value; } -static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, int index, int line, reg_t value, SegManager *segMan, Kernel *kernel) { - if (validate_variable(r, stack_base, type, max, index, line)) { +static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t value, SegManager *segMan, Kernel *kernel) { + if (validate_variable(r, stack_base, type, max, index)) { // WORKAROUND: This code is needed to work around a probable script bug, or a // limitation of the original SCI engine, which can be observed in LSL5. @@ -423,8 +423,8 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i } } -#define READ_VAR(type, index) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, s->r_acc) -#define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, __LINE__, value, s->_segMan, g_sci->getKernel()) +#define READ_VAR(type, index) validate_read_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, s->r_acc) +#define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); #define ACC_ARITHMETIC_L(op) make_reg(0, (op validate_arithmetic(s->r_acc))) -- cgit v1.2.3 From 18b449d4fdcf9651f325259fb7ba1d81135143ff Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 4 Jul 2010 23:38:08 +0000 Subject: Add a hexDumpReg function to view references that are not raw and fix SCI32 strings/arrays in segmentInfo. svn-id: r50660 --- engines/sci/console.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- engines/sci/console.h | 1 + 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b83ffee0e7..bb79fc145a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1558,6 +1558,15 @@ bool Console::segmentInfo(int nr) { break; } +#ifdef ENABLE_SCI32 + case SEG_TYPE_STRING: + DebugPrintf("SCI32 strings\n"); + break; + case SEG_TYPE_ARRAY: + DebugPrintf("SCI32 arrays\n"); + break; +#endif + default : DebugPrintf("Invalid type %d\n", mobj->getType()); break; @@ -2112,7 +2121,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { return true; } - if (reg_end.segment != reg.segment) { + if (reg_end.segment != reg.segment && reg_end != NULL_REG) { DebugPrintf("Ending segment different from starting segment. Assuming no bound on dump.\n"); reg_end = NULL_REG; } @@ -2151,13 +2160,15 @@ bool Console::cmdViewReference(int argc, const char **argv) { switch (_engine->_gamestate->_segMan->getSegmentType(reg.segment)) { #ifdef ENABLE_SCI32 case SEG_TYPE_STRING: { + DebugPrintf("SCI32 string\n"); const SciString *str = _engine->_gamestate->_segMan->lookupString(reg); Common::hexdump((const byte *) str->getRawData(), str->getSize(), 16, 0); break; } case SEG_TYPE_ARRAY: { + DebugPrintf("SCI32 array:\n"); const SciArray *array = _engine->_gamestate->_segMan->lookupArray(reg); - Common::hexdump((const byte *) array->getRawData(), array->getSize(), 16, 0); + hexDumpReg(array->getRawData(), array->getSize(), 4, 0, true); break; } #endif @@ -2179,7 +2190,10 @@ bool Console::cmdViewReference(int argc, const char **argv) { if (reg_end.segment != 0) DebugPrintf("Block size less than or equal to %d\n", size); - Common::hexdump(block.raw, size, 16, 0); + if (block.isRaw) + Common::hexdump(block.raw, size, 16, 0); + else + hexDumpReg(block.reg, size / 2, 4, 0); } } break; @@ -3284,4 +3298,58 @@ int Console::printObject(reg_t pos) { return 0; } +void Console::hexDumpReg(const reg_t *data, int len, int regsPerLine, int startOffset, bool isArray) { + // reg_t version of Common::hexdump + assert(1 <= regsPerLine && regsPerLine <= 8); + int i; + byte c; + int offset = startOffset; + while (len >= regsPerLine) { + printf("%06x: ", offset); + for (i = 0; i < regsPerLine; i++) { + printf("%04x:%04x ", PRINT_REG(data[i])); + } + printf(" |"); + for (i = 0; i < regsPerLine; i++) { + c = data[i].toUint16() >> 8; + if (c < 32 || c >= 127) + c = '.'; + printf("%c", c); + c = data[i].toUint16() & 0xff; + if (c < 32 || c >= 127) + c = '.'; + printf("%c", c); + } + printf("|\n"); + data += regsPerLine; + len -= regsPerLine; + offset += regsPerLine * (isArray ? 1 : 2); + } + + if (len <= 0) + return; + + printf("%06x: ", offset); + for (i = 0; i < regsPerLine; i++) { + if (i < len) + printf("%04x:%04x ", PRINT_REG(data[i])); + else + printf(" "); + } + printf(" |"); + for (i = 0; i < len; i++) { + c = data[i].toUint16() >> 8; + if (c < 32 || c >= 127) + c = '.'; + printf("%c", c); + c = data[i].toUint16() & 0xff; + if (c < 32 || c >= 127) + c = '.'; + printf("%c", c); + } + for (; i < regsPerLine; i++) + printf(" "); + printf("|\n"); +} + } // End of namespace Sci diff --git a/engines/sci/console.h b/engines/sci/console.h index 2948e348d8..7e7b30ea58 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -151,6 +151,7 @@ private: bool segmentInfo(int nr); void printList(List *list); int printNode(reg_t addr); + void hexDumpReg(const reg_t *data, int len, int regsPerLine = 4, int startOffset = 0, bool isArray = false); private: SciEngine *_engine; -- cgit v1.2.3 From bb300ec671cfcd6fe7461dfd90615acfede2f1b9 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Mon, 5 Jul 2010 00:09:41 +0000 Subject: Skip /dev/sequencer MIDI on Android. svn-id: r50664 --- backends/midi/seq.cpp | 2 +- base/plugins.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 216c5802b7..b1815adee5 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -28,7 +28,7 @@ * both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html) */ -#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) +#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) #include "common/util.h" #include "sound/musicplugin.h" diff --git a/base/plugins.cpp b/base/plugins.cpp index 39ee10c2cb..a6acd7e449 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -175,7 +175,7 @@ public: #if defined(UNIX) && defined(USE_ALSA) LINK_PLUGIN(ALSA) #endif - #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) + #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) LINK_PLUGIN(SEQ) #endif #if defined(__MINT__) -- cgit v1.2.3 From b8778fc7c382ec401409bbaafcb67355f0c566e3 Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Mon, 5 Jul 2010 01:00:59 +0000 Subject: Switch Android toolchain prefix from arm-android-eabi to arm-*-linux-androideabi, since this is what the upcoming gcc-4.6 change uses. Work around Android 2.0 and newer dynamic linker bug by explicitly linking plugins against the core libscummvm.so. Mark Android packages as preferring to be on external storage. Move -lm from LDFLAGS to LIBS. svn-id: r50665 --- backends/platform/android/README.build | 41 ++++++++++++++++++++++------------ backends/platform/android/android.mk | 9 +++++++- backends/platform/android/module.mk | 22 +++++++++--------- backends/platform/android/video.cpp | 2 +- configure | 31 +++++++++++++++++++++---- dists/android/AndroidManifest.xml | 10 ++++----- dists/android/AndroidManifest.xml.in | 12 +++++----- dists/android/mkmanifest.pl | 1 + 8 files changed, 84 insertions(+), 44 deletions(-) diff --git a/backends/platform/android/README.build b/backends/platform/android/README.build index a834f8431b..0aa5c6eefd 100644 --- a/backends/platform/android/README.build +++ b/backends/platform/android/README.build @@ -4,12 +4,18 @@ Building the ScummVM Android port You will need these things to build: 1. Android EGL headers and library 2. Android SDK -3. An arm-android-eabi GCC toolchain +3. An arm-oe-linux-androideabi GCC toolchain(*) In the example commands, we are going to build against the Android 1.5 native ABI (but using the Android 1.6 SDK tools). Other version combinations might/should be possible with a bit of tweaking. +(*) Any other sane Android toolchain should be easy to use, but this +is the toolchain prefix that is used by default. You can trivially +find and modify the single location where it appears in ./configure if +you have some other prefix variation. + + In detail: 1. Android EGL headers and library @@ -26,17 +32,17 @@ to just download the 3 Android EGL headers from here: Download and install somewhere. -3. arm-android-eabi GCC toolchain +3. arm-*-linux-androideabi GCC toolchain You have several choices for toolchains: -- Use Google arm-eabi prebuilt toolchain. + - Use Google arm-eabi prebuilt toolchain. This is shipped with both the Android source release and Android NDK. The problem is that "arm-eabi-gcc" can't actually link anything successfully without extra command line flags. To use this with the ScummVM configure/build environment you will need to create a family -of shell wrapper scripts that convert "arm-android-eabi-foo" to +of shell wrapper scripts that convert "arm-oe-linux-androideabi-foo" to "arm-eabi-foo -mandroid". For example, I use this script: @@ -44,17 +50,24 @@ For example, I use this script: exec arm-eabi-${0##*-} -mandroid -DANDROID "$@" ... and create a family of symlinks/hardlinks pointing to it called -arm-android-eabi-gcc, arm-android-eabi-g++, etc. For tools that don't -take a "-mandroid" argument - like arm-eabi-strip - I bypass the shell -wrapper and just create an arm-android-eabi-strip symlink to the tool -directly. +arm-oe-android-linuxeabi-gcc, arm-oe-android-linuxeabi-g++, etc. For +tools that don't take a "-mandroid" argument - like arm-eabi-strip - I +bypass the shell wrapper and just create an arm-oe-android-linuxeabi-strip +symlink to the tool directly. + +In practice you will probably need significant linker command line +massaging in order to get the crtbegin/end and libraries all linked in +the right way. It's not hard to do manually, but it is annoying to +script in a general purpose way. -- Build your own arm-android-eabi toolchain from GCC source. + - Build your own arm-*-linux-androideabi toolchain from GCC source. -This is lots of fun. I suggest my Android openembedded patches, see: - http://wiki.github.com/anguslees/openembedded-android/ -(You just need to have lots of disk space and type a few commands) -If you get stuck, ask +This is lots of fun, but will become significantly easier once gcc-4.6 +is released. In the interim, I suggest using my precompiled Android +openembedded-based toolchain: + wget http://commondatastorage.googleapis.com/anr/sdk/android-2.2-i686-linux-armv5te-linux-androideabi-toolchain-android.tar.bz2 + sudo tar jxf android-2.2-i686-linux-armv5te-linux-androideabi-toolchain-android.tar.bz2 -C / + . /usr/local/android/arm/environment-setup Alternatively, do a websearch - there are several other cross-compile toolchains around. @@ -78,7 +91,7 @@ Then build ScummVM: export ANDROID_SDK= PATH=$ANDROID_SDK/platforms/android-1.6/tools:$ANDROID_SDK/tools:$PATH - # You also want to ensure your arm-android-eabi toolchain is in your $PATH + # You also want to ensure your arm-oe-linux-androideabi toolchain is in $PATH export ANDROID_TOP= diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk index 0bc8fa265e..95e848e0d9 100644 --- a/backends/platform/android/android.mk +++ b/backends/platform/android/android.mk @@ -4,7 +4,6 @@ AAPT = aapt DX = dx APKBUILDER = apkbuilder ADB = adb -e -ANDROID_JAR = $(ANDROID_SDK)/platforms/android-1.6/android.jar JAVAC ?= javac JAVACFLAGS = -source 1.5 -target 1.5 @@ -12,6 +11,14 @@ JAVACFLAGS = -source 1.5 -target 1.5 #LDFLAGS += -Wl,--gc-sections #CXXFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden +resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR8) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) + $(INSTALL) -d build.tmp/assets/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/ + $(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR8) -F $@ + +build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR8) + $(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR8) -F $@ + scummvm.apk: build.tmp/libscummvm.so resources.ap_ classes.dex # Package installer won't delete old libscummvm.so on upgrade so # replace it with a zero size file diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk index fdb0ed2ac4..c7b98b996d 100644 --- a/backends/platform/android/module.mk +++ b/backends/platform/android/module.mk @@ -39,14 +39,22 @@ PLUGIN_RESOURCES = \ #ANDROID_VERSIONCODE = 6 Specified in dists/android/AndroidManifest.xml.in ANDROID_PLUGIN_VERSIONCODE = 6 +# This is a bit silly. I want to compile against the 1.6 android.jar, +# to make the compiler check that I don't use something that requires +# a newer Android. However, in order to use android:installLocation, +# we need to give aapt a version >=8 android.jar - even though the +# result will work ok on 1.5+. +ANDROID_JAR = $(ANDROID_SDK)/platforms/android-1.5/android.jar +ANDROID_JAR8 = $(ANDROID_SDK)/platforms/android-8/android.jar + # This library contains scummvm proper build.tmp/libscummvm.so: $(OBJS) @$(MKDIR) -p $(@D) - $(CXX) $(PLUGIN_LDFLAGS) -shared $(LDFLAGS) -Wl,-soname,$(@F) -Wl,--no-undefined -o $@ $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LIBS) + $(QUIET_LINK)$(CXX) -shared $(LDFLAGS) -Wl,-Bsymbolic -Wl,-soname,$(@F) -Wl,--no-undefined -o $@ $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LIBS) -backends/platform/android/org/inodes/gus/scummvm/R.java backends/platform/android/org/inodes/gus/scummvm/Manifest.java: $(srcdir)/dists/android/AndroidManifest.xml $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR) - $(AAPT) package -m -J backends/platform/android -M $< -S $(srcdir)/dists/android/res -I $(ANDROID_JAR) +backends/platform/android/org/inodes/gus/scummvm/R.java backends/platform/android/org/inodes/gus/scummvm/Manifest.java: $(srcdir)/dists/android/AndroidManifest.xml $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR8) + $(AAPT) package -m -J backends/platform/android -M $< -S $(srcdir)/dists/android/res -I $(ANDROID_JAR8) build.tmp/classes/%.class: $(srcdir)/backends/platform/android/%.java $(srcdir)/backends/platform/android/org/inodes/gus/scummvm/R.java @$(MKDIR) -p $(@D) @@ -63,14 +71,6 @@ build.tmp/plugins/classes.dex: $(JAVA_PLUGIN_SRC:backends/platform/android/%.jav @$(MKDIR) -p $(@D) $(DX) --dex --output=$@ build.tmp/classes.plugin -resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) - $(INSTALL) -d build.tmp/assets/ - $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/ - $(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR) -F $@ - -build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR) - $(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR) -F $@ - build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml: dists/android/mkmanifest.pl configure dists/android/AndroidManifest.xml dists/android/mkmanifest.pl --id=$* --configure=configure \ --version-name=$(VERSION) \ diff --git a/backends/platform/android/video.cpp b/backends/platform/android/video.cpp index 5d16410cea..d4c002fbd0 100644 --- a/backends/platform/android/video.cpp +++ b/backends/platform/android/video.cpp @@ -47,7 +47,7 @@ #define ENTER(args...) /**/ #endif -#if 1 +#if 0 #define CHECK_GL_ERROR() checkGlError(__FILE__, __LINE__) static const char* getGlErrStr(GLenum error) { switch (error) { diff --git a/configure b/configure index 4741340e09..f79bc083c2 100755 --- a/configure +++ b/configure @@ -1007,7 +1007,7 @@ wince) android) _host_os=android _host_cpu=arm - _host_alias=arm-android-eabi + _host_alias=arm-oe-linux-androideabi ;; *) if test -n "$_host"; then @@ -1687,7 +1687,6 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' _backend="android" _port_mk="backends/platform/android/android.mk" - _build_hq_scalers="no" ;; *) echo "WARNING: Unknown target, continuing with auto-detected values" @@ -1990,7 +1989,7 @@ add_to_config_mk_if_yes "$_indeo3" 'USE_INDEO3 = 1' cat > $TMPC << EOF int main(void) { return 0; } EOF -cc_check -lm && LDFLAGS="$LDFLAGS -lm" +cc_check -lm && LIBS="$LIBS -lm" # # Check for Ogg Vorbis @@ -2494,12 +2493,36 @@ case $_backend in LIBS="$LIBS -static -lSDL" ;; android) + static_libs='' + system_libs='' + for lib in $LIBS; do + case $lib in + -lz|-lm) + system_libs="$system_libs $lib" + ;; + *) + static_libs="$static_libs $lib" + ;; + esac + done + # -lgcc is carefully placed here - we want to catch # all toolchain symbols in *our* libraries rather # than pick up anything unhygenic from the Android libs. - LIBS="$LIBS -lgcc -lstdc++ -llog -lGLESv1_CM -lEGL" + LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -lstdc++ -llog -lGLESv1_CM -lEGL" DEFINES="$DEFINES -D__ANDROID__ -DANDROID_BACKEND -DREDUCE_MEMORY_USAGE" add_line_to_config_mk 'PLUGIN_LDFLAGS += $(LDFLAGS) -Wl,-shared,-Bsymbolic' + + # Work around an Android 2.0+ run-time linker bug: + # The linker doesn't actually look in previously + # loaded libraries when trying to resolve symbols - + # effectively turning all dlopen(RTLD_GLOBAL) calls + # into dlopen(RTLD_LOCAL). It *does* look in + # DT_NEEDED libraries, so the workaround is to add an + # (otherwise unnecessary) dependency from plugins back + # to the main libscummvm.so. + add_line_to_config_mk 'PLUGIN_LDFLAGS += -Lbuild.tmp -lscummvm' + add_line_to_config_mk 'PLUGIN_EXTRA_DEPS += build.tmp/libscummvm.so' ;; *) echo "support for $_backend backend not implemented in configure script yet" diff --git a/dists/android/AndroidManifest.xml b/dists/android/AndroidManifest.xml index 438703a3cc..55e3bf2f38 100644 --- a/dists/android/AndroidManifest.xml +++ b/dists/android/AndroidManifest.xml @@ -2,16 +2,14 @@ + android:versionCode="6" android:versionName="1.2.0svn" + android:installLocation="preferExternal"> + android:targetSdkVersion="8" /> + android:versionCode="6" android:versionName="@VERSION@" + android:installLocation="preferExternal"> - + android:targetSdkVersion="8" /> "org.inodes.gus.scummvm.plugin.$info->{name}", [ANDROID, 'versionCode'] => $package_versionCode, [ANDROID, 'versionName'] => $package_versionName, + [ANDROID, 'installLocation'] => 'preferExternal', ); $writer->startTag( -- cgit v1.2.3 From 830c7611dc76ea94a0869b4943b541035ee28d1c Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Mon, 5 Jul 2010 01:03:52 +0000 Subject: Revert Android libtremor header to standard path, since we now ship our own statically linked version rather than relying on the system shared lib that happens to be on most Android systems. svn-id: r50666 --- sound/decoders/vorbis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/decoders/vorbis.cpp b/sound/decoders/vorbis.cpp index 64869d7843..7673c53010 100644 --- a/sound/decoders/vorbis.cpp +++ b/sound/decoders/vorbis.cpp @@ -35,7 +35,7 @@ #include "sound/audiocd.h" #ifdef USE_TREMOR -#if defined(ANDROID) || defined(__GP32__) // custom libtremor locations +#if defined(__GP32__) // custom libtremor locations #include #else #include -- cgit v1.2.3 From 660ffc194d217bdeb61479e5b101e7642319ecb5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 5 Jul 2010 09:53:10 +0000 Subject: Bugfixes for new player code - Rex is now correctly positioned when the player manager takes over from the wakeup animation sequence svn-id: r50669 --- engines/m4/mads_player.cpp | 13 +++++++------ engines/m4/mads_player.h | 2 +- engines/m4/mads_scene.cpp | 1 + engines/m4/mads_views.cpp | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 2ba009459e..57cb9eefd3 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -49,7 +49,7 @@ MadsPlayer::MadsPlayer() { _currentScale = 0; strcpy(_spritesPrefix, ""); for (int idx = 0; idx < 8; ++idx) - _spriteSetIndexes[idx] = 0; + _spriteSetsPresent[idx] = false; _frameNum = 0; _frameOffset = 0; _unk1 = 0; @@ -76,7 +76,7 @@ bool MadsPlayer::loadSprites(const char *prefix) { if (prefixLen == 0) { // No player sprites at at all for (int idx = 0; idx < 8; ++idx) - _spriteSetIndexes[idx] = 0; + _spriteSetsPresent[idx] = false; } else { strcpy(setName, "*"); strcat(setName, _spritesPrefix); @@ -86,13 +86,13 @@ bool MadsPlayer::loadSprites(const char *prefix) { for (int idx = 0; idx < 8; ++idx) { *digitP = suffixList[idx]; - _spriteSetIndexes[idx] = -1; + _spriteSetsPresent[idx] = true; int setIndex = _madsVm->scene()->_spriteSlots.addSprites(setName, true, SPRITE_SET_CHAR_INFO); if (setIndex < 0) { if (idx < 7) break; - _spriteSetIndexes[idx] = 0; + _spriteSetsPresent[idx] = false; } else { ++_spriteSetCount; } @@ -212,8 +212,9 @@ void MadsPlayer::setupFrame() { resetActionList(); _frameOffset = 0; _spriteListIdx2 = _directionListIndexes[_direction]; - if (_spriteSetIndexes[_spriteListIdx2] == 0) { - _spriteListIdx2 = 4; + if (!_spriteSetsPresent[_spriteListIdx2]) { + // Direction isn't present, so use alternate direction, with entries flipped + _spriteListIdx2 -= 4; _frameOffset = 0x8000; } diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index 0a746575f1..7285796309 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -42,7 +42,7 @@ private: public: char _spritesPrefix[16]; int _spriteSetCount; - int _spriteSetIndexes[8]; + bool _spriteSetsPresent[8]; Common::Point _playerPos; Common::Point _destPos; int16 _direction, _direction2; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index d22ca02475..66883dd13c 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -166,6 +166,7 @@ void MadsScene::loadScene(int sceneNumber) { // Miscellaneous player setup _madsVm->_player._destPos = _madsVm->_player._destPos; _madsVm->_player._direction2 = _madsVm->_player._direction; + _madsVm->_player.setupFrame(); _madsVm->_player.idle(); // Purge resources diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index d6d71c8eee..580f54b1c0 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -95,7 +95,7 @@ int MadsSpriteSlots::addSprites(const char *resName, bool suppressErrors, int fl // Get the sprite set Common::SeekableReadStream *data = _vm->res()->get(resName); - SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName, flags); + SpriteAsset *spriteSet = new SpriteAsset(_vm, data, data->size(), resName, false, flags); spriteSet->translate(_madsVm->_palette); assert(spriteSet != NULL); -- cgit v1.2.3 From 179a2b4e88842b04eec46aa29c7c4a88123b5a50 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 10:06:38 +0000 Subject: NDS: Rename backend 'nds' to 'ds' in configure svn-id: r50670 --- configure | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/configure b/configure index f79bc083c2..ced19f62bb 100755 --- a/configure +++ b/configure @@ -343,7 +343,7 @@ get_system_exe_extension() { arm-riscos) _exeext=",ff8" ;; - dreamcast | gamecube | nds | ps2 | psp | wii) + dreamcast | gamecube | ds | ps2 | psp | wii) _exeext=".elf" ;; gp2x-linux) @@ -627,7 +627,7 @@ Usage: $0 [OPTIONS]... Configuration: -h, --help display this help and exit --backend=BACKEND backend to build (dc, gp2x, gp2xwiz, iphone, - linuxmoto, nds, null, ps2, psp, sdl, wii, wince) + linuxmoto, ds, null, ps2, psp, sdl, wii, wince) [sdl] Installation directories: @@ -657,7 +657,7 @@ Special configuration feature: gamecube for Nintendo GameCube iphone for Apple iPhone linupy for Yopy PDA - nds for Nintendo DS + ds for Nintendo DS ps2 for PlayStation 2 psp for PlayStation Portable wii for Nintendo Wii @@ -949,8 +949,8 @@ motomagx) _host_cpu=arm _host_alias=arm-linux-gnueabi ;; -nds) - _host_os=nds +ds) + _host_os=ds _host_cpu=arm _host_alias=arm-eabi ;; @@ -1070,7 +1070,7 @@ esac # Platform specific sanity checks # case $_host_os in -gamecube | nds | wii) +gamecube | ds | wii) if test -z "$DEVKITPRO"; then echo "Please set DEVKITPRO in your environment. export DEVKITPRO=" exit 1 @@ -1390,8 +1390,8 @@ case $_host_os in mint*) DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" ;; - nds) - # TODO nds + ds) + # TODO Nintendo DS DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT -I$DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" ;; os2-emx*) @@ -1570,15 +1570,14 @@ if test -n "$_host"; then _vkeybd="yes" _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; - nds) + ds) # TODO: complete this - # TODO: Maybe rename nds -> ds (would be more consistent with other backends) DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" _need_memalign=yes - _backend="nds" + _backend="ds" _build_hq_scalers="no" _mt32emu="no" _port_mk="backends/platform/ds/ds.mk" @@ -2444,8 +2443,8 @@ case $_backend in LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" ;; - nds) - # TODO nds + ds) + # TODO ds INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source -I$(srcdir)/backends/platform/ds/commoninclude' ;; null) @@ -2539,7 +2538,7 @@ if test "$have_gcc" = yes ; then case $_host_os in # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ - mingw* | dreamcast | wii | gamecube | nds | psp | wince | amigaos* | android) + mingw* | dreamcast | wii | gamecube | ds | psp | wince | amigaos* | android) CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) -- cgit v1.2.3 From db1fa71745a6604612f295c4f5a33169bde75a75 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 10:07:06 +0000 Subject: NDS: Enable compilation of backend specific files Also tried to enable the conversion of .raw/.pal/.bin files, but this does not currently work (probably something really silly, but I don't have the time to debug this right now). svn-id: r50671 --- backends/platform/ds/ds.mk | 10 +++++----- backends/platform/ds/module.mk | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 555e7ece06..40a7e14965 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -18,7 +18,7 @@ OPT_SIZE := -Os -mthumb #-mthumb -fno-gcse -fno-schedule-insns2 -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) +#OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) # TODO: Handle files in OPTLIST. @@ -99,10 +99,10 @@ $(ndsdir)/arm7/source/main.o: CXXFLAGS=$(ARM7_CXXFLAGS) $(ndsdir)/arm7/source/main.o: CPPFLAGS= # Rule for creating ARM7 .bin files from .elf files -%.bin: %.elf - @echo ------ - @echo Building $@... - $(OBJCOPY) -O binary $< $@ +#%.bin: %.elf +# @echo ------ +# @echo Building $@... +# $(OBJCOPY) -O binary $< $@ # Rule for creating ARM7 .elf files by linking .o files together with a special linker script %.elf: diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index 16630dc070..676fd20628 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -59,7 +59,38 @@ LIBCARTRESET_OBJS := #arm9/source/libcartreset/cartreset.o -MODULE_OBJS := +#MODULE_OBJS := $(PORT_OBJS) $(DATA_OBJS) $(FAT_OBJS) +MODULE_OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) + + +#--------------------------------------------------------------------------------- +# canned command sequence for binary data +#--------------------------------------------------------------------------------- +define bin2o + bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) + echo "extern const u8" `(echo $( `(echo $(> `(echo $(> `(echo $( `(echo $(> `(echo $(> `(echo $( $@ + echo "extern const u8" `(echo $(> $@ + echo "extern const u32" `(echo $(> $@ +endef -#--------------------------------------------------------------------------------- -%.o : %.raw -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) +vpath %.raw $(srcdir) +vpath %.pal $(srcdir) +vpath %.bin $(srcdir) + +%.o: %.raw + $(bin2o) + +%_raw.h: %.raw + $(bin2h) + +%.o: %.pal + $(bin2o) + +%_raw.h: %.pal + $(bin2h) + +%.o: %.bin + $(bin2o) + +%_raw.h: %.bin + $(bin2h) -#--------------------------------------------------------------------------------- -%.o : %.pal -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) +# Mark files which require the *_raw.h files manually (for now, at least) +$(MODULE)/arm9/source/dsmain.o: \ + $(MODULE)/arm9/data/icons_raw.h \ + $(MODULE)/arm9/data/keyboard_raw.h \ + $(MODULE)/arm9/data/keyboard_pal_raw.h +$(MODULE)/arm9/source/touchkeyboard.o: \ + $(MODULE)/arm9/data/keyboard_raw.h \ + $(MODULE)/arm9/data/keyboard_pal_raw.h \ + $(MODULE)/arm9/data/8x8font_tga_raw.h -# TODO: Should add more dirs to MODULE_DIRS so that "make distclean" can remove .deps dirs. MODULE_DIRS += \ - backends/platform/ds/ + backends/platform/ds \ + backends/platform/ds/arm7/source \ + backends/platform/ds/arm7/source/libcartreset \ + backends/platform/ds/arm9/source \ + backends/platform/ds/arm9/source/fat \ + backends/platform/ds/arm9/source/libcartreset # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) diff --git a/configure b/configure index ced19f62bb..aaa8e1aee4 100755 --- a/configure +++ b/configure @@ -1392,7 +1392,12 @@ case $_host_os in ;; ds) # TODO Nintendo DS - DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT -I$DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" + DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" + CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" + CXXFLAGS="$CXXFLAGS -mthumb-interwork -ffunction-sections -fdata-sections -fno-strict-aliasing" + LDFLAGS="$LDFLAGS -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections" + LDFLAGS="$LDFLAGS -L$DEVKITPRO/libnds/lib" + LIBS="$LIBS -lnds9" ;; os2-emx*) DEFINES="$DEFINES -DUNIX" @@ -1575,18 +1580,18 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" _need_memalign=yes + add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' + add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' + add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' + add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' + add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="ds" _build_hq_scalers="no" _mt32emu="no" _port_mk="backends/platform/ds/ds.mk" - # TODO: Enable more ARM optimizations -- requires testing! - add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' - add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' - #add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' - #add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' - #add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' ;; neuros) DEFINES="$DEFINES -DUNIX -DNEUROS" @@ -2445,7 +2450,9 @@ case $_backend in ;; ds) # TODO ds - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source -I$(srcdir)/backends/platform/ds/commoninclude' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' + INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' ;; null) DEFINES="$DEFINES -DUSE_NULL_DRIVER" -- cgit v1.2.3 From 9a61be13e6638a5fe9b31d1fdf7fff72bb69bf8f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 10:07:54 +0000 Subject: DS: Made some vars static, code formatting, cleanup svn-id: r50673 --- backends/platform/ds/arm9/source/dsmain.cpp | 277 +++++++++++++--------------- backends/platform/ds/arm9/source/dsmain.h | 4 - 2 files changed, 128 insertions(+), 153 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 30ac0a7880..b7f8b8caa3 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -80,8 +80,9 @@ //#include //basic print funcionality #include +#include + #include "dsmain.h" -#include "string.h" #include "osystem_ds.h" #include "icons_raw.h" #include "fat/gba_nds_fat.h" @@ -102,12 +103,14 @@ #ifdef USE_PROFILER #include "profiler/cyg-profile.h" #endif +#include "engine.h" + #include "backends/fs/ds/ds-fs.h" #include "base/version.h" -#include "engine.h" +#include "common/util.h" extern "C" void OurIntrMain(void); -extern "C" u32 getExceptionAddress( u32 opcodeAddress, u32 thumbState); +extern "C" u32 getExceptionAddress(u32 opcodeAddress, u32 thumbState); extern const char __itcm_start[]; static const char *registerNames[] = @@ -118,20 +121,19 @@ static const char *registerNames[] = extern "C" void* __real_malloc(size_t size); -int total = 0; +static int s_total_malloc = 0; -void* operator new (size_t size) -{ +void *operator new (size_t size) { register unsigned int reg asm("lr"); volatile unsigned int poo = reg; - void* res = __real_malloc(size); - total += size; + void *res = __real_malloc(size); + s_total_malloc += size; if (!res) { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc (new) %d (%d)\n", size, total); + consolePrintf("Failed alloc (new) %d (%d)\n", size, s_total_malloc); return NULL; } @@ -139,7 +141,7 @@ void* operator new (size_t size) } -extern "C" void* __wrap_malloc(size_t size) { +extern "C" void *__wrap_malloc(size_t size) { /* u32 addr; asm("mov %0, lr" @@ -151,8 +153,7 @@ extern "C" void* __wrap_malloc(size_t size) { volatile unsigned int poo = reg; - if (size == 0) - { + if (size == 0) { static int zeroSize = 0; consolePrintf("0 size malloc (%d)", zeroSize++); } @@ -162,12 +163,12 @@ extern "C" void* __wrap_malloc(size_t size) { if (size > 50 * 1024) { consolePrintf("Allocated %d (%x)\n", size, poo); } - total += size; + s_total_malloc += size; return res; } else { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc %d (%d)\n", size, total); + consolePrintf("Failed alloc %d (%d)\n", size, s_total_malloc); return NULL; } } @@ -193,112 +194,113 @@ enum MouseMode { #define SCUMM_GAME_HEIGHT 142 #define SCUMM_GAME_WIDTH 227 -int textureID; -u16* texture; +static int textureID; +static u16* texture; -int frameCount; -int currentTimeMillis; +static int frameCount; +static int currentTimeMillis; // Timer Callback -int callbackInterval; -int callbackTimer; -OSystem_DS::TimerProc callback; +static int callbackInterval; +static int callbackTimer; +static OSystem_DS::TimerProc callback; // Scaled -bool scaledMode; -int scX; -int scY; +static bool scaledMode; +static int scX; +static int scY; -int subScX; -int subScY; -int subScTargetX; -int subScTargetY; -int subScreenWidth = SCUMM_GAME_WIDTH; -int subScreenHeight = SCUMM_GAME_HEIGHT; -int subScreenScale = 256; +static int subScX; +static int subScY; +static int subScTargetX; +static int subScTargetY; +static int subScreenWidth = SCUMM_GAME_WIDTH; +static int subScreenHeight = SCUMM_GAME_HEIGHT; +static int subScreenScale = 256; // Sound -int bufferSize; -s16* soundBuffer; -int bufferFrame; -int bufferRate; -int bufferSamples; -bool soundHiPart; -int soundFrequency; +static int bufferSize; +static s16* soundBuffer; +static int bufferFrame; +static int bufferRate; +static int bufferSamples; +static bool soundHiPart; +static int soundFrequency; // Events -int lastEventFrame; -bool indyFightState; -bool indyFightRight; +static int lastEventFrame; +static bool indyFightState; +static bool indyFightRight; -OSystem_DS::SoundProc soundCallback; -void* soundParam; -int lastCallbackFrame; -bool bufferFirstHalf; -bool bufferSecondHalf; +static OSystem_DS::SoundProc soundCallback; +static void *soundParam; +static int lastCallbackFrame; +static bool bufferFirstHalf; +static bool bufferSecondHalf; // Saved buffers -bool highBuffer; -bool displayModeIs8Bit = false; +static bool highBuffer; +static bool displayModeIs8Bit = false; // Game id -u8 gameID; +static u8 gameID; -bool snapToBorder = false; -bool consoleEnable = false; -bool gameScreenSwap = false; +static bool snapToBorder = false; +static bool consoleEnable = false; +static bool gameScreenSwap = false; bool isCpuScalerEnabled(); //#define HEAVY_LOGGING -MouseMode mouseMode = MOUSE_LEFT; +static MouseMode mouseMode = MOUSE_LEFT; -int storedMouseX = 0; -int storedMouseY = 0; +static int storedMouseX = 0; +static int storedMouseY = 0; // Sprites -SpriteEntry sprites[128]; -SpriteEntry spritesMain[128]; -int tweak; +static SpriteEntry sprites[128]; +static SpriteEntry spritesMain[128]; +static int tweak; // Shake -int shakePos = 0; +static int shakePos = 0; // Keyboard -bool keyboardEnable = false; -bool leftHandedMode = false; -bool keyboardIcon = false; +static bool keyboardEnable = false; +static bool leftHandedMode = false; +static bool keyboardIcon = false; // Touch -int touchScX, touchScY, touchX, touchY; -int mouseHotspotX, mouseHotspotY; -bool cursorEnable = false; -bool mouseCursorVisible = true; -bool rightButtonDown = false; -bool touchPadStyle = false; -int touchPadSensitivity = 8; -bool tapScreenClicks = true; - -int tapCount = 0; -int tapTimeout = 0; -int tapComplete = 0; +static int touchScX, touchScY, touchX, touchY; +static int mouseHotspotX, mouseHotspotY; +static bool cursorEnable = false; +static bool mouseCursorVisible = true; +static bool leftButtonDown = false; +static bool rightButtonDown = false; +static bool touchPadStyle = false; +static int touchPadSensitivity = 8; +static bool tapScreenClicks = true; + +static int tapCount = 0; +static int tapTimeout = 0; +static int tapComplete = 0; // Dragging -int dragStartX, dragStartY; -bool dragging = false; -int dragScX, dragScY; +static int dragStartX, dragStartY; +static bool dragging = false; +static int dragScX, dragScY; // Interface styles -char gameName[32]; +static char gameName[32]; // 8-bit surface size -int gameWidth = 320; -int gameHeight = 200; +static int gameWidth = 320; +static int gameHeight = 200; // Scale -bool twoHundredPercentFixedScale = false; -bool cpuScalerEnable = false; +static bool twoHundredPercentFixedScale = false; +static bool cpuScalerEnable = false; // 100 256 // 150 192 @@ -309,14 +311,14 @@ bool cpuScalerEnable = false; #ifdef USE_PROFILER -int hBlankCount = 0; +static int hBlankCount = 0; #endif -u8* scalerBackBuffer = NULL; +static u8 *scalerBackBuffer = NULL; #define NUM_SUPPORTED_GAMES 21 -gameListType gameList[NUM_SUPPORTED_GAMES] = { +static const gameListType gameList[NUM_SUPPORTED_GAMES] = { // Unknown game - use normal SCUMM controls {"unknown", CONT_SCUMM_ORIGINAL}, @@ -345,31 +347,29 @@ gameListType gameList[NUM_SUPPORTED_GAMES] = { {"parallaction", CONT_NIPPON}, }; -gameListType* currentGame = NULL; +static const gameListType *s_currentGame = NULL; // Stylus -#define ABS(x) ((x)>0?(x):-(x)) - -bool penDown = FALSE; -bool penHeld = FALSE; -bool penReleased = FALSE; -bool penDownLastFrame = FALSE; -s32 penX = 0, penY = 0; -s32 penDownX = 0, penDownY = 0; -int keysDownSaved = 0; -int keysReleasedSaved = 0; -int keysChangedSaved = 0; +static bool penDown = FALSE; +static bool penHeld = FALSE; +static bool penReleased = FALSE; +static bool penDownLastFrame = FALSE; +static s32 penX = 0, penY = 0; +static s32 penDownX = 0, penDownY = 0; +static int keysDownSaved = 0; +static int keysReleasedSaved = 0; +static int keysChangedSaved = 0; -bool penDownSaved = FALSE; -bool penReleasedSaved = FALSE; -int penDownFrames = 0; -int touchXOffset = 0; -int touchYOffset = 0; +static bool penDownSaved = FALSE; +static bool penReleasedSaved = FALSE; +static int penDownFrames = 0; +static int touchXOffset = 0; +static int touchYOffset = 0; -int triggeredIcon = 0; -int triggeredIconTimeout = 0; +static int triggeredIcon = 0; +static int triggeredIconTimeout = 0; -u16 savedPalEntry255 = RGB15(31, 31, 31); +static u16 savedPalEntry255 = RGB15(31, 31, 31); extern "C" int scummvm_main(int argc, char *argv[]); @@ -382,7 +382,7 @@ void setIcon(int num, int x, int y, int imageNum, int flags, bool enable); void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable); void uploadSpriteGfx(); -TransferSound soundControl; +static TransferSound soundControl; bool isCpuScalerEnabled() { @@ -430,7 +430,7 @@ void setTopScreenZoom(int percentage) { // return (ConfMan.hasKey("cpu_scaler", "ds") && ConfMan.getBool("cpu_scaler", "ds")); controlType getControlType() { - return currentGame->control; + return s_currentGame->control; } @@ -551,21 +551,8 @@ int getSoundFrequency() { return soundFrequency; } -void setControls(char* gameName) { - - for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) { - if (!stricmp(gameName, gameList[r].gameId)) { - currentGame = &gameList[r]; - consolePrintf("Current game set to: %s\n", gameName); - return; - } - } - - consolePrintf("Failed to set current game to: %s\n", gameName); -} - void exitGame() { - currentGame = NULL; + s_currentGame = NULL; } void initGame() { @@ -580,17 +567,17 @@ void initGame() { setOptions(); //strcpy(gameName, ConfMan.getActiveDomain().c_str()); - if (currentGame == NULL) { + if (s_currentGame == NULL) { strcpy(gameName, ConfMan.get("gameid").c_str()); // consolePrintf("\n\n\n\nCurrent game: '%s' %d\n", gameName, gameName[0]); - currentGame = &gameList[0]; // Default game + s_currentGame = &gameList[0]; // Default game for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) { if (!stricmp(gameName, gameList[r].gameId)) { - currentGame = &gameList[r]; - // consolePrintf("Game list num: %d\n", currentGame); + s_currentGame = &gameList[r]; + // consolePrintf("Game list num: %d\n", s_currentGame); } } } @@ -785,7 +772,7 @@ void checkSleepMode() { } void setShowCursor(bool enable) { - if ((currentGame) && (currentGame->control == CONT_SCUMM_SAMNMAX)) { + if ((s_currentGame) && (s_currentGame->control == CONT_SCUMM_SAMNMAX)) { if (cursorEnable) { sprites[1].attribute[0] = ATTR0_BMP | 150; } else { @@ -833,7 +820,7 @@ void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, } } - if (currentGame->control != CONT_SCUMM_SAMNMAX) + if (s_currentGame->control != CONT_SCUMM_SAMNMAX) return; uint16 border = RGB15(24,24,24) | 0x8000; @@ -1035,7 +1022,7 @@ void setShakePos(int shakePos) { } -u16* get16BitBackBuffer() { +u16 *get16BitBackBuffer() { return BG_GFX + 0x20000; } @@ -1319,8 +1306,7 @@ bool getIsDisplayMode8Bit() { return displayModeIs8Bit; } -void doScreenTapMode(OSystem_DS* system) -{ +void doScreenTapMode(OSystem_DS* system) { Common::Event event; static bool left = false, right = false; @@ -1398,9 +1384,6 @@ void doButtonSelectMode(OSystem_DS* system) //consolePrintf("x=%d y=%d \n", getPenX(), getPenY()); } - static bool leftButtonDown = false; - static bool rightButtonDown = false; - if (getPenReleased() && (leftButtonDown || rightButtonDown)) { if (leftButtonDown) { event.type = Common::EVENT_LBUTTONUP; @@ -1476,14 +1459,14 @@ void doButtonSelectMode(OSystem_DS* system) if (getKeysDown() & KEY_RIGHT) { - if ((currentGame->control != CONT_SCUMM_SAMNMAX) && (currentGame->control != CONT_FUTURE_WARS) && (currentGame->control != CONT_GOBLINS)) { + if ((s_currentGame->control != CONT_SCUMM_SAMNMAX) && (s_currentGame->control != CONT_FUTURE_WARS) && (s_currentGame->control != CONT_GOBLINS)) { mouseMode = MOUSE_RIGHT; } else { // If we're playing sam and max, click and release the right mouse // button to change verb Common::Event event; - if (currentGame->control == CONT_FUTURE_WARS) { + if (s_currentGame->control == CONT_FUTURE_WARS) { event.mouse = Common::Point(320 - 128, 200 - 128); event.type = Common::EVENT_MOUSEMOVE; system->addEvent(event); @@ -1558,7 +1541,7 @@ void addEventsToQueue() { if (!indyFightState) { if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_B)) { - if (currentGame->control == CONT_AGI) { + if (s_currentGame->control == CONT_AGI) { event.kbd.keycode = Common::KEYCODE_RETURN; event.kbd.ascii = 13; event.kbd.flags = 0; @@ -1699,7 +1682,7 @@ void addEventsToQueue() { - if (currentGame->control == CONT_SKY) { + if (s_currentGame->control == CONT_SKY) { // Extra controls for Beneath a Steel Sky if ((getKeysDown() & KEY_DOWN)) { penY = 0; @@ -1707,7 +1690,7 @@ void addEventsToQueue() { } } - if (currentGame->control == CONT_AGI) { + if (s_currentGame->control == CONT_AGI) { // Extra controls for Leisure Suit Larry and KQ4 if ((getKeysHeld() & KEY_UP) && (getKeysHeld() & KEY_START) @@ -1727,7 +1710,7 @@ void addEventsToQueue() { - if (currentGame->control == CONT_SIMON) { + if (s_currentGame->control == CONT_SIMON) { // Extra controls for Simon the Sorcerer if ((getKeysDown() & KEY_DOWN)) { Common::Event event; @@ -1746,7 +1729,7 @@ void addEventsToQueue() { - if (currentGame->control == CONT_SCUMM_ORIGINAL) { + if (s_currentGame->control == CONT_SCUMM_ORIGINAL) { // Extra controls for Scumm v1-5 games if ((getKeysDown() & KEY_DOWN)) { Common::Event event; @@ -1806,14 +1789,14 @@ void addEventsToQueue() { if ((getKeysChanged() & KEY_START)) { event.kbd.flags = 0; event.type = getKeyEvent(KEY_START); - if (currentGame->control == CONT_FUTURE_WARS) { + if (s_currentGame->control == CONT_FUTURE_WARS) { event.kbd.keycode = Common::KEYCODE_F10; event.kbd.ascii = Common::ASCII_F10; - } else if (currentGame->control == CONT_GOBLINS) { + } else if (s_currentGame->control == CONT_GOBLINS) { event.kbd.keycode = Common::KEYCODE_F1; event.kbd.ascii = Common::ASCII_F1; // consolePrintf("!!!!!F1!!!!!"); - } else if (currentGame->control == CONT_AGI) { + } else if (s_currentGame->control == CONT_AGI) { event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = 27; } else { @@ -2060,8 +2043,8 @@ void VBlankHandler(void) { if ((!gameScreenSwap) && (!(getKeysHeld() & KEY_L) && !(getKeysHeld() & KEY_R))) { - if (currentGame) { - if (currentGame->control != CONT_SCUMM_SAMNMAX) { + if (s_currentGame) { + if (s_currentGame->control != CONT_SCUMM_SAMNMAX) { if (getPenHeld() && (getPenY() < SCUMM_GAME_HEIGHT)) { setTopScreenTarget(getPenX(), getPenY()); } @@ -2856,10 +2839,6 @@ bool getIndyFightState() { return indyFightState; } -gameListType* getCurrentGame() { - return currentGame; -} - /////////////////// // Fast Ram /////////////////// diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index beda592ba2..88a7ca2b22 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -68,9 +68,6 @@ int leftHandedSwap(int keys); void setGameScreenSwap(bool enable); void setSensitivity(int sensitivity); -// Controls options -void setControls(char* gameName); - // Video void displayMode8Bit(); // Switch to 8-bit mode5 void displayMode16Bit(); // Switch to 16-bit mode5 @@ -155,7 +152,6 @@ void fastRamReset(); void* fastRamAlloc(int size); void exitGame(); -gameListType* getCurrentGame(); } -- cgit v1.2.3 From cb265ae09ac6282b0a7282f3d3c0d5b5973cac08 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 10:08:13 +0000 Subject: DS: Fix setShakePos svn-id: r50674 --- backends/platform/ds/arm9/source/dsmain.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index b7f8b8caa3..556cfc3f43 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -264,7 +264,7 @@ static SpriteEntry spritesMain[128]; static int tweak; // Shake -static int shakePos = 0; +static int s_shakePos = 0; // Keyboard static bool keyboardEnable = false; @@ -1018,7 +1018,7 @@ void displayMode16BitFlipBuffer() { } void setShakePos(int shakePos) { - shakePos = shakePos; + s_shakePos = shakePos; } @@ -2127,7 +2127,7 @@ void VBlankHandler(void) { SUB_BG3_CX = subScX + 64; } - SUB_BG3_CY = subScY + (shakePos << 8);*/ + SUB_BG3_CY = subScY + (s_shakePos << 8);*/ /*SUB_BG3_XDX = (int) (subScreenWidth / 256.0f * 256); SUB_BG3_XDY = 0; @@ -2267,7 +2267,7 @@ void VBlankHandler(void) { setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8); - setMainScreenScroll(scX << 8, (scY << 8) + (shakePos << 8)); + setMainScreenScroll(scX << 8, (scY << 8) + (s_shakePos << 8)); setMainScreenScale(256, 256); // 1:1 scale } else { @@ -2283,7 +2283,7 @@ void VBlankHandler(void) { setZoomedScreenScroll(subScX, subScY, (subScreenWidth != 256) && (subScreenWidth != 128)); setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8); - setMainScreenScroll(64, (scY << 8) + (shakePos << 8)); + setMainScreenScroll(64, (scY << 8) + (s_shakePos << 8)); setMainScreenScale(320, 256); // 1:1 scale } -- cgit v1.2.3 From fcde7221d55849441844d7a7480cf99696417e88 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 11:07:24 +0000 Subject: DS: Fix typo; change bin2o/bin2h to create taget dir svn-id: r50675 --- backends/platform/ds/ds.mk | 2 +- backends/platform/ds/module.mk | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index ee3a1050b8..0fd8ac7cda 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -3,7 +3,7 @@ # where OPTIONS is... # build A: --enable-scumm # build B: --enable-sky --enable-queen -# build C: --enable-ago +# build C: --enable-agos # build D: --enable-gob --enable-cine --enable-agi # build E: --enable-saga --disable-mad # build F: --enable-kyra --disable-mad diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index c97f24e12a..d70b5b1bab 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -63,10 +63,12 @@ MODULE_OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) # canned command sequence for binary data #--------------------------------------------------------------------------------- define bin2o + $(MKDIR) $(*D) bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) endef define bin2h + $(MKDIR) $(*D) echo "extern const u8" `(echo $( $@ echo "extern const u8" `(echo $(> $@ echo "extern const u32" `(echo $(> $@ -- cgit v1.2.3 From d4ad7b8a6d159e367bfb5f9e8de92140f3f41e06 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 11:53:55 +0000 Subject: DS: Add missing .bin -> .elf rule svn-id: r50676 --- backends/platform/ds/ds.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 0fd8ac7cda..9df0d2ba0d 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -92,6 +92,10 @@ OPT_SIZE := -Os -mthumb all: scummvm.nds scummvm.ds.gba +%.bin: %.elf + $(OBJCOPY) -S $< $( - EGL_INC="-I" - EGL_LIBS="-L" - - CPPFLAGS="$EGL_INC" \ - LDFLAGS="-g $EGL_LIBS" \ ./configure --backend=android --host=android --enable-zlib #and any other flags make scummvm.apk diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 105561e595..f6af0fcff5 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -41,7 +41,6 @@ #include #include -#include #include #include "common/archive.h" @@ -166,12 +165,11 @@ private: jmethodID MID_getPluginDirectories; jmethodID MID_setupScummVMSurface; jmethodID MID_destroyScummVMSurface; + jmethodID MID_swapBuffers; int _screen_changeid; - EGLDisplay _egl_display; - EGLSurface _egl_surface; - EGLint _egl_surface_width; - EGLint _egl_surface_height; + int _egl_surface_width; + int _egl_surface_height; bool _force_redraw; @@ -223,6 +221,10 @@ public: virtual void initBackend(); void addPluginDirectories(Common::FSList &dirs) const; void enableZoning(bool enable) { _enable_zoning = enable; } + void setSurfaceSize(int width, int height) { + _egl_surface_width = width; + _egl_surface_height = height; + } virtual bool hasFeature(Feature f); virtual void setFeatureState(Feature f, bool enable); @@ -303,8 +305,6 @@ public: OSystem_Android::OSystem_Android(jobject am) : _back_ptr(0), - _egl_display(EGL_NO_DISPLAY), - _egl_surface(EGL_NO_SURFACE), _screen_changeid(0), _force_redraw(false), _game_texture(NULL), @@ -369,6 +369,7 @@ bool OSystem_Android::initJavaHooks(JNIEnv* env, jobject self) { FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); FIND_METHOD(setupScummVMSurface, "()V"); FIND_METHOD(destroyScummVMSurface, "()V"); + FIND_METHOD(swapBuffers, "()Z"); #undef FIND_METHOD @@ -581,6 +582,7 @@ int OSystem_Android::getGraphicsMode() const { } void OSystem_Android::setupScummVMSurface() { + ENTER("setupScummVMSurface"); JNIEnv* env = JNU_GetEnv(); env->CallVoidMethod(_back_ptr, MID_setupScummVMSurface); if (env->ExceptionCheck()) @@ -588,37 +590,8 @@ void OSystem_Android::setupScummVMSurface() { // EGL set up with a new surface. Initialise OpenGLES context. - _egl_display = eglGetCurrentDisplay(); - _egl_surface = eglGetCurrentSurface(EGL_DRAW); - - static bool log_version = true; - if (log_version) { - __android_log_print(ANDROID_LOG_INFO, LOG_TAG, - "Using EGL %s (%s); GL %s/%s (%s)", - eglQueryString(_egl_display, EGL_VERSION), - eglQueryString(_egl_display, EGL_VENDOR), - glGetString(GL_VERSION), - glGetString(GL_RENDERER), - glGetString(GL_VENDOR)); - log_version = false; // only log this once - } - GLESTexture::initGLExtensions(); - if (!eglQuerySurface(_egl_display, _egl_surface, - EGL_WIDTH, &_egl_surface_width) || - !eglQuerySurface(_egl_display, _egl_surface, - EGL_HEIGHT, &_egl_surface_height)) { - JNU_ThrowByName(env, "java/lang/RuntimeException", - "Error fetching EGL surface width/height"); - return; - } - __android_log_print(ANDROID_LOG_INFO, LOG_TAG, - "New surface is %dx%d", - _egl_surface_width, _egl_surface_height); - - CHECK_GL_ERROR(); - // Turn off anything that looks like 3D ;) glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); @@ -664,7 +637,6 @@ void OSystem_Android::setupScummVMSurface() { } void OSystem_Android::destroyScummVMSurface() { - _egl_surface = EGL_NO_SURFACE; JNIEnv* env = JNU_GetEnv(); env->CallVoidMethod(_back_ptr, MID_destroyScummVMSurface); // Can't use OpenGLES functions after this @@ -745,8 +717,11 @@ void OSystem_Android::updateScreen() { glPushMatrix(); - if (_shake_offset != 0) { - // This is the only case where _game_texture doesn't + if (_shake_offset != 0 || + (!_focus_rect.isEmpty() && + !Common::Rect(_game_texture->width(), + _game_texture->height()).contains(_focus_rect))) { + // These are the only cases where _game_texture doesn't // cover the entire screen. glClearColorx(0, 0, 0, 1 << 16); glClear(GL_COLOR_BUFFER_BIT); @@ -759,16 +734,6 @@ void OSystem_Android::updateScreen() { _game_texture->drawTexture(0, 0, _egl_surface_width, _egl_surface_height); } else { - // Need to ensure any exposed out-of-bounds region doesn't go - // all hall-of-mirrors. If _shake_offset != 0, we've already - // done this above. - const Common::Rect - screen_bounds(_game_texture->width(), _game_texture->height()); - if (!screen_bounds.contains(_focus_rect) && _shake_offset != 0) { - glClearColorx(0, 0, 0, 1 << 16); - glClear(GL_COLOR_BUFFER_BIT); - } - glPushMatrix(); glScalex(xdiv(_egl_surface_width, _focus_rect.width()), xdiv(_egl_surface_height, _focus_rect.height()), @@ -831,14 +796,11 @@ void OSystem_Android::updateScreen() { CHECK_GL_ERROR(); - if (!eglSwapBuffers(_egl_display, _egl_surface)) { - EGLint error = eglGetError(); - warning("eglSwapBuffers exited with error 0x%x", error); - // Some errors mean we need to reinit GL - if (error == EGL_CONTEXT_LOST) { - destroyScummVMSurface(); - setupScummVMSurface(); - } + JNIEnv* env = JNU_GetEnv(); + if (!env->CallBooleanMethod(_back_ptr, MID_swapBuffers)) { + // Context lost -> need to reinit GL + destroyScummVMSurface(); + setupScummVMSurface(); } } @@ -1365,6 +1327,12 @@ static void ScummVM_enableZoning(JNIEnv* env, jobject self, jboolean enable) { cpp_obj->enableZoning(enable); } +static void ScummVM_setSurfaceSize(JNIEnv* env, jobject self, + jint width, jint height) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + cpp_obj->setSurfaceSize(width, height); +} + const static JNINativeMethod gMethods[] = { { "create", "(Landroid/content/res/AssetManager;)V", (void*)ScummVM_create }, @@ -1381,6 +1349,8 @@ const static JNINativeMethod gMethods[] = { (void*)ScummVM_setConfManString }, { "enableZoning", "(Z)V", (void*)ScummVM_enableZoning }, + { "setSurfaceSize", "(II)V", + (void*)ScummVM_setSurfaceSize }, }; JNIEXPORT jint JNICALL diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java index 4ce8a85f30..d39aa363ef 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -12,7 +12,10 @@ import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; +import javax.microedition.khronos.opengles.GL; +import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGL11; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; @@ -30,11 +33,11 @@ import java.util.concurrent.Semaphore; public class ScummVM implements SurfaceHolder.Callback { private final static String LOG_TAG = "ScummVM.java"; - private final int AUDIO_FRAME_SIZE = 2 * 2; // bytes. 16bit audio * stereo + private final int AUDIO_FRAME_SIZE = 2 * 2; // bytes. 16bit audio * stereo public static class AudioSetupException extends Exception {} private long nativeScummVM; // native code hangs itself here - boolean scummVMRunning = false; + boolean scummVMRunning = false; private native void create(AssetManager am); @@ -54,49 +57,49 @@ public class ScummVM implements SurfaceHolder.Callback { destroy(); } - // Surface creation: - // GUI thread: create surface, release lock - // ScummVM thread: acquire lock (block), read surface - // - // Surface deletion: - // GUI thread: post event, acquire lock (block), return - // ScummVM thread: read event, free surface, release lock - // - // In other words, ScummVM thread does this: - // acquire lock - // setup surface - // when SCREEN_CHANGED arrives: - // destroy surface - // release lock - // back to acquire lock - static final int configSpec[] = { + // Surface creation: + // GUI thread: create surface, release lock + // ScummVM thread: acquire lock (block), read surface + // + // Surface deletion: + // GUI thread: post event, acquire lock (block), return + // ScummVM thread: read event, free surface, release lock + // + // In other words, ScummVM thread does this: + // acquire lock + // setup surface + // when SCREEN_CHANGED arrives: + // destroy surface + // release lock + // back to acquire lock + static final int configSpec[] = { EGL10.EGL_RED_SIZE, 5, EGL10.EGL_GREEN_SIZE, 5, EGL10.EGL_BLUE_SIZE, 5, EGL10.EGL_DEPTH_SIZE, 0, EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, EGL10.EGL_NONE, - }; - EGL10 egl; - EGLDisplay eglDisplay = EGL10.EGL_NO_DISPLAY; - EGLConfig eglConfig; - EGLContext eglContext = EGL10.EGL_NO_CONTEXT; - EGLSurface eglSurface = EGL10.EGL_NO_SURFACE; - Semaphore surfaceLock = new Semaphore(0, true); - SurfaceHolder nativeSurface; - - public void surfaceCreated(SurfaceHolder holder) { + }; + EGL10 egl; + EGLDisplay eglDisplay = EGL10.EGL_NO_DISPLAY; + EGLConfig eglConfig; + EGLContext eglContext = EGL10.EGL_NO_CONTEXT; + EGLSurface eglSurface = EGL10.EGL_NO_SURFACE; + Semaphore surfaceLock = new Semaphore(0, true); + SurfaceHolder nativeSurface; + + public void surfaceCreated(SurfaceHolder holder) { nativeSurface = holder; surfaceLock.release(); - } + } - public void surfaceChanged(SurfaceHolder holder, int format, + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Disabled while I debug GL problems //pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); - } + } - public void surfaceDestroyed(SurfaceHolder holder) { + public void surfaceDestroyed(SurfaceHolder holder) { pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); try { surfaceLock.acquire(); @@ -104,10 +107,10 @@ public class ScummVM implements SurfaceHolder.Callback { Log.e(this.toString(), "Interrupted while waiting for surface lock", e); } - } + } - // Called by ScummVM thread (from initBackend) - private void createScummVMGLContext() { + // Called by ScummVM thread (from initBackend) + private void createScummVMGLContext() { egl = (EGL10)EGLContext.getEGL(); eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); int[] version = new int[2]; @@ -126,10 +129,11 @@ public class ScummVM implements SurfaceHolder.Callback { eglContext = egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, null); - } + } - // Called by ScummVM thread - protected void setupScummVMSurface() { + // Called by ScummVM thread + static private boolean _log_version = true; + protected void setupScummVMSurface() { try { surfaceLock.acquire(); } catch (InterruptedException e) { @@ -140,10 +144,30 @@ public class ScummVM implements SurfaceHolder.Callback { eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeSurface, null); egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); - } - // Called by ScummVM thread - protected void destroyScummVMSurface() { + GL10 gl = (GL10)eglContext.getGL(); + + if (_log_version) { + Log.i(LOG_TAG, String.format("Using EGL %s (%s); GL %s/%s (%s)", + egl.eglQueryString(eglDisplay, EGL10.EGL_VERSION), + egl.eglQueryString(eglDisplay, EGL10.EGL_VENDOR), + gl.glGetString(GL10.GL_VERSION), + gl.glGetString(GL10.GL_RENDERER), + gl.glGetString(GL10.GL_VENDOR))); + _log_version = false; // only log this once + } + + int[] value = new int[1]; + egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_WIDTH, value); + int width = value[0]; + egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_HEIGHT, value); + int height = value[0]; + Log.i(LOG_TAG, String.format("New surface is %dx%d", width, height)); + setSurfaceSize(width, height); + } + + // Called by ScummVM thread + protected void destroyScummVMSurface() { if (eglSurface != null) { egl.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); @@ -152,17 +176,28 @@ public class ScummVM implements SurfaceHolder.Callback { } surfaceLock.release(); - } + } - public void setSurface(SurfaceHolder holder) { + public void setSurface(SurfaceHolder holder) { holder.addCallback(this); - } + } + + final public boolean swapBuffers() { + if (!egl.eglSwapBuffers(eglDisplay, eglSurface)) { + int error = egl.eglGetError(); + Log.w(LOG_TAG, String.format("eglSwapBuffers exited with error 0x%x", error)); + if (error == EGL11.EGL_CONTEXT_LOST) + return false; + } + return true; + } // Set scummvm config options final public native static void loadConfigFile(String path); final public native static void setConfMan(String key, int value); final public native static void setConfMan(String key, String value); final public native void enableZoning(boolean enable); + final public native void setSurfaceSize(int width, int height); // Feed an event to ScummVM. Safe to call from other threads. final public native void pushEvent(Event e); @@ -180,10 +215,10 @@ public class ScummVM implements SurfaceHolder.Callback { protected void showVirtualKeyboard(boolean enable) {} protected String[] getSysArchives() { return new String[0]; } protected String[] getPluginDirectories() { return new String[0]; } - protected void initBackend() throws AudioSetupException { + protected void initBackend() throws AudioSetupException { createScummVMGLContext(); initAudio(); - } + } private static class AudioThread extends Thread { final private int buf_size; @@ -240,7 +275,7 @@ public class ScummVM implements SurfaceHolder.Callback { break; } else if (ret != len) { Log.w(LOG_TAG, String.format( - "Short audio write. Wrote %dB, not %dB", + "Short audio write. Wrote %dB, not %dB", ret, buf.length)); // Buffer is full, so yield cpu for a while Thread.sleep(100); diff --git a/configure b/configure index aaa8e1aee4..08613d2232 100755 --- a/configure +++ b/configure @@ -2515,7 +2515,7 @@ case $_backend in # -lgcc is carefully placed here - we want to catch # all toolchain symbols in *our* libraries rather # than pick up anything unhygenic from the Android libs. - LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -lstdc++ -llog -lGLESv1_CM -lEGL" + LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -lstdc++ -llog -lGLESv1_CM" DEFINES="$DEFINES -D__ANDROID__ -DANDROID_BACKEND -DREDUCE_MEMORY_USAGE" add_line_to_config_mk 'PLUGIN_LDFLAGS += $(LDFLAGS) -Wl,-shared,-Bsymbolic' -- cgit v1.2.3 From 5527882daa02eb98f86f7a9904c588ba93821fe1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 5 Jul 2010 14:36:31 +0000 Subject: SCI: implemented new kernel call signature format svn-id: r50678 --- engines/sci/console.cpp | 37 ++- engines/sci/engine/kernel.cpp | 719 +++++++++++++++++++++++++----------------- engines/sci/engine/kernel.h | 32 +- 3 files changed, 465 insertions(+), 323 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index bb79fc145a..7e5d77d99a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2042,18 +2042,18 @@ bool Console::cmdValueType(int argc, const char **argv) { int t = g_sci->getKernel()->findRegType(val); switch (t) { - case KSIG_LIST: + case SIG_TYPE_LIST: DebugPrintf("List"); break; - case KSIG_OBJECT: + case SIG_TYPE_OBJECT: DebugPrintf("Object"); break; - case KSIG_REF: + case SIG_TYPE_REFERENCE: DebugPrintf("Reference"); break; - case KSIG_ARITHMETIC: - DebugPrintf("Arithmetic"); - case KSIG_ARITHMETIC | KSIG_NULL: + case SIG_TYPE_INTEGER: + DebugPrintf("Integer"); + case SIG_TYPE_INTEGER | SIG_TYPE_NULL: DebugPrintf("Null"); break; default: @@ -2137,7 +2137,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { switch (type) { case 0: break; - case KSIG_LIST: { + case SIG_TYPE_LIST: { List *list = _engine->_gamestate->_segMan->lookupList(reg); DebugPrintf("list\n"); @@ -2148,15 +2148,15 @@ bool Console::cmdViewReference(int argc, const char **argv) { DebugPrintf("Invalid list.\n"); } break; - case KSIG_NODE: + case SIG_TYPE_NODE: DebugPrintf("list node\n"); printNode(reg); break; - case KSIG_OBJECT: + case SIG_TYPE_OBJECT: DebugPrintf("object\n"); printObject(reg); break; - case KSIG_REF: { + case SIG_TYPE_REFERENCE: { switch (_engine->_gamestate->_segMan->getSegmentType(reg.segment)) { #ifdef ENABLE_SCI32 case SEG_TYPE_STRING: { @@ -2198,7 +2198,7 @@ bool Console::cmdViewReference(int argc, const char **argv) { } break; } - case KSIG_ARITHMETIC: + case SIG_TYPE_INTEGER: DebugPrintf("arithmetic value\n %d (%04x)\n", (int16) reg.offset, reg.offset); break; default: @@ -3149,27 +3149,30 @@ void Console::printBasicVarInfo(reg_t variable) { int segType = g_sci->getKernel()->findRegType(variable); SegManager *segMan = g_sci->getEngineState()->_segMan; - segType &= KSIG_ARITHMETIC | KSIG_OBJECT | KSIG_REF | KSIG_NODE | KSIG_LIST; + segType &= SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_NODE | SIG_TYPE_LIST | SIG_TYPE_UNINITIALIZED; switch (segType) { - case KSIG_ARITHMETIC: { + case SIG_TYPE_INTEGER: { uint16 content = variable.toUint16(); if (content >= 10) DebugPrintf(" (%dd)", content); break; } - case KSIG_OBJECT: + case SIG_TYPE_OBJECT: DebugPrintf(" (object '%s')", segMan->getObjectName(variable)); break; - case KSIG_REF: + case SIG_TYPE_REFERENCE: DebugPrintf(" (reference)"); break; - case KSIG_NODE: + case SIG_TYPE_NODE: DebugPrintf(" (node)"); break; - case KSIG_LIST: + case SIG_TYPE_LIST: DebugPrintf(" (list)"); break; + case SIG_TYPE_UNINITIALIZED: + DebugPrintf(" (uninitialized)"); + break; default: DebugPrintf(" (??\?)"); } diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index fb2c60cdb6..4c6fb4cf83 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -206,7 +206,7 @@ static const char *s_defaultKernelNames[] = { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) -// gameID, scriptNr,lvl, object-name, method-name, call,index,replace +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard SCI_WORKAROUNDENTRY_TERMINATOR @@ -226,6 +226,8 @@ struct SciKernelMapEntry { }; #define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE +#define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 +#define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE #define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 #define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE @@ -245,129 +247,133 @@ struct SciKernelMapEntry { // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { - { MAP_CALL(Load), SIG_EVERYWHERE, "iii*", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "iRi*", NULL, NULL }, + { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, NULL }, // ^^ - in SQ1 when leaving ulence flats bar, kUnLoad is called with just one argument (FIXME?) - { MAP_CALL(ScriptID), SIG_EVERYWHERE, "Ioi*", NULL, NULL }, - { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "ii*", NULL, kDisposeScript_workarounds }, + { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, - { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i*", NULL, NULL }, - { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "i*", NULL, NULL }, - { MAP_CALL(Animate), SIG_EVERYWHERE, "LI*", NULL, NULL }, - // ^^ FIXME - More like (li?)? - { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "oi*", NULL, NULL }, - // ^^ FIXME - The second parameter is ignored + { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, + { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(CelWide), SIG_EVERYWHERE, "iOi*", NULL, NULL }, - { MAP_CALL(CelHigh), SIG_EVERYWHERE, "iOi*", NULL, NULL }, - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiiii*i*r*", NULL, NULL }, - { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiiii*i*", NULL, NULL }, - { MAP_CALL(AddToPic), SIG_EVERYWHERE, "Il*", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, "*.", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_EVERYWHERE, "iiiiZRi*", NULL, NULL }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r)", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, + { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(SetPort), SIG_EVERYWHERE, "ii*", NULL, NULL }, - { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iii)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(EditControl), SIG_EVERYWHERE, "ZoZo", NULL, NULL }, - { MAP_CALL(TextSize), SIG_EVERYWHERE, "rZrii*r*", NULL, NULL }, - { MAP_CALL(Display), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "ioi*", NULL, NULL }, + { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, + { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, + { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir]*)", NULL, NULL }, // subop + { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "oo*", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "oo*", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "oi*", NULL, NULL }, + { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "Zri*", NULL, NULL }, + { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, - { MAP_CALL(Said), SIG_EVERYWHERE, "Zr", NULL, NULL }, + { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rirr*", NULL, NULL }, - { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir*", NULL, NULL }, + { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, + { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "i*", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "iIo*", NULL, NULL }, + { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(iii)(i)", NULL, NULL }, // subop { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, - { MAP_CALL(FirstNode), SIG_EVERYWHERE, "Zl", NULL, NULL }, + { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, - { MAP_CALL(NodeValue), SIG_EVERYWHERE, "Zn", NULL, NULL }, + { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(Random), SIG_EVERYWHERE, "i*", NULL, NULL }, - { MAP_CALL(Abs), SIG_EVERYWHERE, "Oi", NULL, NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Abs), SIG_EVERYWHERE, "[io]", NULL, NULL }, + // ^^ FIXME hoyle { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiiii*", NULL, NULL }, + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake - { MAP_CALL(GetDistance), SIG_EVERYWHERE, "iiiii*", NULL, NULL }, + { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(GetTime), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rri*", NULL, NULL }, - { MAP_CALL(StrLen), SIG_EVERYWHERE, "Zr", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "rZri*", NULL, NULL }, - { MAP_CALL(Format), SIG_EVERYWHERE, "r.*", NULL, NULL }, - { MAP_CALL(GetFarText), SIG_EVERYWHERE, "iiZr", NULL, NULL }, + { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, + { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, NULL }, + { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, + { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, - { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "ol*", NULL, NULL }, - { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "ol*", NULL, NULL }, - { MAP_CALL(OnControl), SIG_EVERYWHERE, "i*", NULL, NULL }, - { MAP_CALL(InitBresen), SIG_EVERYWHERE, "oi*", NULL, NULL }, + { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, + { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, - { MAP_CALL(SetDebug), SIG_EVERYWHERE, "i*", NULL, NULL }, + { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, - { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(CoordPri), SIG_EVERYWHERE, "ii*", NULL, NULL }, - { MAP_CALL(StrAt), SIG_EVERYWHERE, "rii*", NULL, NULL }, - { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i.*", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "r*", NULL, NULL }, + { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop + { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL }, { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(Joystick), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(FileIO), SIG_EVERYWHERE, "i.*", NULL, NULL }, - { MAP_CALL(Memory), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, - { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii.*", NULL, NULL }, - { MAP_CALL(Lock), SIG_EVERYWHERE, "iii*", NULL, NULL }, - { MAP_CALL(Palette), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, + { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, - { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rrZr", NULL, NULL }, + { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, @@ -375,31 +381,31 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Message), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, - { MAP_CALL(DoAudio), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(DoSync), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "iri*", NULL, NULL }, + { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, - { MAP_CALL(ResCheck), SIG_EVERYWHERE, "iii*", NULL, NULL }, + { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(ShowMovie), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Platform), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(TextColors), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(TextFonts), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(Portrait), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(PalVary), SIG_EVERYWHERE, "ii*", NULL, NULL }, + { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, // subop { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Empty), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, #ifdef ENABLE_SCI32 // SCI2 Kernel Functions { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(Array), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Array), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, - { MAP_CALL(String), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -409,23 +415,23 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li.*", NULL, NULL }, - { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li.*", NULL, NULL }, - { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li.*", NULL, NULL }, - { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "lZo", NULL, NULL }, - { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio.*", NULL, NULL }, + { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, + { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, - { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i.*", NULL, NULL }, + { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // SCI2.1 Kernel Functions - { MAP_CALL(Save), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(List), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(Robot), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(PlayVMD), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio.*", NULL, NULL }, + { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, - { MAP_CALL(Text), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(CD), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } #endif }; @@ -514,77 +520,349 @@ void Kernel::loadSelectorNames() { } } -static char *compileKernelSignature(const char *s) { - const char *src = s; - char *result; - bool ellipsis = false; - int index = 0; - - if (!src) - return 0; // NULL signature: Nothing to do +// this parses a written kernel signature into an internal memory format +// [io] -> either integer or object +// (io) -> optionally integer AND an object +// (i) -> optional integer +// . -> any type +// i* -> optional multiple integers +// .* -> any parameters afterwards (or none) +static uint16 *parseKernelSignature(const char *kernelName, const char *writtenSig) { + const char *curPos; + char curChar; + uint16 *result = NULL; + uint16 *writePos = NULL; + int size = 0; + bool validType = false; + bool optionalType = false; + bool eitherOr = false; + bool optional = false; + bool hadOptional = false; + + // First, we check how many bytes the result will be + // we also check, if the written signature makes any sense + curPos = writtenSig; + while (*curPos) { + switch (*curPos) { + case '[': // either or + if (eitherOr) + error("signature for k%s: '[' used within '[]'", kernelName); + eitherOr = true; + validType = false; + break; + case ']': // either or end + if (!eitherOr) + error("signature for k%s: ']' used without leading '['", kernelName); + if (!validType) + error("signature for k%s: '[]' does not surround valid type(s)", kernelName); + eitherOr = false; + validType = false; + size++; + break; + case '(': // optional + if (optional) + error("signature for k%s: '(' used within '()' brackets", kernelName); + if (eitherOr) + error("signature for k%s: '(' used within '[]' brackets", kernelName); + optional = true; + validType = false; + optionalType = false; + break; + case ')': // optional end + if (!optional) + error("signature for k%s: ')' used without leading '('", kernelName); + if (!optionalType) + error("signature for k%s: '()' does not to surround valid type(s)", kernelName); + optional = false; + validType = false; + hadOptional = true; + break; + case '0': // allowed types + case 'i': + case 'o': + case 'r': + case 'l': + case 'n': + case '.': + if ((hadOptional) & (!optional)) + error("signature for k%s: non-optional type may not follow optional type", kernelName); + validType = true; + if (optional) + optionalType = true; + if (!eitherOr) + size++; + break; + case '*': // accepts more of the same parameter (must be last char) + if (!validType) { + if ((writtenSig == curPos) || (*(curPos - 1) != ']')) + error("signature for k%s: a valid type must be in front of '*'", kernelName); + } + if (eitherOr) + error("signature for k%s: '*' may not be inside '[]'", kernelName); + if (optional) { + if ((*(curPos + 1) != ')') || (*(curPos + 2) != 0)) + error("signature for k%s: '*' may only be used for last type", kernelName); + } else { + if (*(curPos + 1) != 0) + error("signature for k%s: '*' may only be used for last type", kernelName); + } + break; + default: + error("signature for k%s: '%c' unknown", kernelName, *curPos); + } + curPos++; + } - result = (char *)malloc(strlen(s) + 1); + uint16 signature = 0; + + // Now we allocate buffer with required size and fill it + result = new uint16[size + 1]; + writePos = result; + curPos = writtenSig; + do { + curChar = *curPos; + if (!eitherOr) { + // not within either-or, check if next character forces output + switch (curChar) { + case 0: + case '[': + case '(': + case ')': + case 'i': + case 'o': + case 'r': + case 'l': + case 'n': + case '.': + // and we also got some signature pending? + if (signature) { + if (optional) { + signature |= SIG_IS_OPTIONAL; + if (curChar != ')') + signature |= SIG_NEEDS_MORE; + } + *writePos = signature; + writePos++; + signature = 0; + } + } + } + switch (curChar) { + case '[': // either or + eitherOr = true; + break; + case ']': // either or end + eitherOr = false; + break; + case '(': // optional + optional = true; + break; + case ')': // optional end + optional = false; + break; + case '0': + if (signature & SIG_TYPE_NULL) + error("signature for k%s: NULL specified more than once", kernelName); + signature |= SIG_TYPE_NULL; + break; + case 'i': + if (signature & SIG_TYPE_INTEGER) + error("signature for k%s: integer specified more than once", kernelName); + signature |= SIG_TYPE_INTEGER | SIG_TYPE_NULL; + break; + case 'o': + if (signature & SIG_TYPE_OBJECT) + error("signature for k%s: object specified more than once", kernelName); + signature |= SIG_TYPE_OBJECT; + break; + case 'r': + if (signature & SIG_TYPE_REFERENCE) + error("signature for k%s: reference specified more than once", kernelName); + signature |= SIG_TYPE_REFERENCE; + break; + case 'l': + if (signature & SIG_TYPE_LIST) + error("signature for k%s: list specified more than once", kernelName); + signature |= SIG_TYPE_LIST; + break; + case 'n': + if (signature & SIG_TYPE_NODE) + error("signature for k%s: node specified more than once", kernelName); + signature |= SIG_TYPE_NODE; + break; + case '.': + signature |= SIG_MAYBE_ANY; + break; + case '*': // accepts more of the same parameter + signature |= SIG_MORE_MAY_FOLLOW; + break; + default: + break; + } + curPos++; + } while (curChar); - while (*src) { - char c; - char v = 0; + // Write terminator + *writePos = 0; - if (ellipsis) { - error("Failed compiling kernel function signature '%s': non-terminal ellipsis '%c'", s, *src); - } + return result; +} - do { - char cc; - cc = c = *src++; - if (c >= 'A' || c <= 'Z') - cc = c | KSIG_SPEC_SUM_DONE; +int Kernel::findRegType(reg_t reg) { + // No segment? Must be integer + if (!reg.segment) + return SIG_TYPE_INTEGER | (reg.offset ? 0 : SIG_TYPE_NULL); - switch (cc) { - case KSIG_SPEC_LIST: - v |= KSIG_LIST; - break; + if (reg.segment == 0xFFFF) + return SIG_TYPE_UNINITIALIZED; - case KSIG_SPEC_NODE: - v |= KSIG_NODE; - break; + // Otherwise it's an object + SegmentObj *mobj = _segMan->getSegmentObj(reg.segment); + if (!mobj) + return 0; // Invalid - case KSIG_SPEC_REF: - v |= KSIG_REF; - break; + if (!mobj->isValidOffset(reg.offset)) + error("[KERN] ref %04x:%04x is invalid", PRINT_REG(reg)); - case KSIG_SPEC_OBJECT: - v |= KSIG_OBJECT; - break; + switch (mobj->getType()) { + case SEG_TYPE_SCRIPT: + if (reg.offset <= (*(Script *)mobj).getBufSize() && + reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && + RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) { + return ((Script *)mobj)->getObject(reg.offset) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE; + } else + return SIG_TYPE_REFERENCE; + case SEG_TYPE_CLONES: + return SIG_TYPE_OBJECT; + case SEG_TYPE_LOCALS: + case SEG_TYPE_STACK: + case SEG_TYPE_SYS_STRINGS: + case SEG_TYPE_DYNMEM: + case SEG_TYPE_HUNK: +#ifdef ENABLE_SCI32 + case SEG_TYPE_ARRAY: + case SEG_TYPE_STRING: +#endif + return SIG_TYPE_REFERENCE; + case SEG_TYPE_LISTS: + return SIG_TYPE_LIST; + case SEG_TYPE_NODES: + return SIG_TYPE_NODE; + default: + return 0; + } +} - case KSIG_SPEC_ARITHMETIC: - v |= KSIG_ARITHMETIC; - break; +struct SignatureDebugType { + uint16 typeCheck; + const char *text; +}; - case KSIG_SPEC_NULL: - v |= KSIG_NULL; - break; +static const SignatureDebugType signatureDebugTypeList[] = { + { SIG_TYPE_NULL, "null" }, + { SIG_TYPE_INTEGER, "integer" }, + { SIG_TYPE_UNINITIALIZED, "uninitialized" }, + { SIG_TYPE_OBJECT, "object" }, + { SIG_TYPE_REFERENCE, "reference" }, + { SIG_TYPE_LIST, "list" }, + { SIG_TYPE_NODE, "node" }, + { 0, NULL } +}; - case KSIG_SPEC_ANY: - v |= KSIG_ANY; - break; +static void kernelSignatureDebugType(const uint16 type) { + bool firstPrint = true; - case KSIG_SPEC_ELLIPSIS: - v |= KSIG_ELLIPSIS; - ellipsis = true; - break; + const SignatureDebugType *list = signatureDebugTypeList; + while (list->typeCheck) { + if (type & list->typeCheck) { + if (!firstPrint) + printf(", "); + printf("%s", list->text); + firstPrint = false; + } + list++; + } +} - default: - error("ERROR compiling kernel function signature '%s': (%02x / '%c') not understood", s, c, c); +// Shows kernel call signature and current arguments for debugging purposes +void Kernel::signatureDebug(const uint16 *sig, int argc, const reg_t *argv) { + int argnr = 0; + while (*sig || argc) { + printf("parameter %d: ", argnr++); + if (argc) { + reg_t parameter = *argv; + printf("%04x:%04x (", PRINT_REG(parameter)); + int regType = findRegType(parameter); + if (regType) + kernelSignatureDebugType(regType); + else + printf("unknown type of %04x:%04x", PRINT_REG(parameter)); + printf(")"); + argv++; + argc--; + } else { + printf("not passed"); + } + if (*sig) { + const uint16 signature = *sig; + if ((signature & SIG_MAYBE_ANY) == SIG_MAYBE_ANY) { + printf(", may be any"); + } else { + printf(", should be "); + kernelSignatureDebugType(signature); } - } while (*src && (*src == KSIG_SPEC_ELLIPSIS || (c < 'a' && c != KSIG_SPEC_ANY))); - - // To handle sum types - result[index++] = v; + if (signature & SIG_IS_OPTIONAL) + printf(" (optional)"); + if (signature & SIG_NEEDS_MORE) + printf(" (needs more)"); + if (signature & SIG_MORE_MAY_FOLLOW) + printf(" (more may follow)"); + sig++; + } + printf("\n"); } +} - result[index] = 0; +bool Kernel::signatureMatch(const uint16 *sig, int argc, const reg_t *argv) { + uint16 nextSig = *sig; + uint16 curSig = nextSig; + while (nextSig && argc) { + curSig = nextSig; + int type = findRegType(*argv); + if (!type) + return false; // couldn't determine type - return result; + if (!(type & curSig)) + return false; // type mismatch + + if (!(curSig & SIG_MORE_MAY_FOLLOW)) { + sig++; + nextSig = *sig; + } else { + nextSig |= SIG_IS_OPTIONAL; // more may follow -> assumes followers are optional + } + argv++; + argc--; + } + + // Too many arguments? + if (argc) + return false; + // Signature end reached? + if (nextSig == 0) + return true; + // current parameter is optional? + if (curSig & SIG_IS_OPTIONAL) { + // yes, check if nothing more is required + if (!(curSig & SIG_NEEDS_MORE)) + return true; + } else { + // no, check if next parameter is optional + if (nextSig & SIG_IS_OPTIONAL) + return true; + } + // Too few arguments or more optional arguments required + return false; } void Kernel::mapFunctions() { @@ -645,8 +923,8 @@ void Kernel::mapFunctions() { bool nameMatch = false; while (kernelMap->name) { if (sought_name == kernelMap->name) { - if ((kernelMap->fromVersion == SCI_VERSION_NONE) || (kernelMap->fromVersion >= myVersion)) - if ((kernelMap->toVersion == SCI_VERSION_NONE) || (kernelMap->toVersion <= myVersion)) + if ((kernelMap->fromVersion == SCI_VERSION_NONE) || (kernelMap->fromVersion <= myVersion)) + if ((kernelMap->toVersion == SCI_VERSION_NONE) || (kernelMap->toVersion >= myVersion)) if (platformMask & kernelMap->forPlatform) break; nameMatch = true; @@ -658,7 +936,7 @@ void Kernel::mapFunctions() { // A match was found if (kernelMap->function) { _kernelFuncs[functNr].func = kernelMap->function; - _kernelFuncs[functNr].signature = compileKernelSignature(kernelMap->signature); + _kernelFuncs[functNr].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); _kernelFuncs[functNr].workarounds = kernelMap->workarounds; _kernelFuncs[functNr].isDummy = false; ++mapped; @@ -680,147 +958,6 @@ void Kernel::mapFunctions() { return; } -int Kernel::findRegType(reg_t reg) { - // No segment? Must be arithmetic - if (!reg.segment) - return reg.offset ? KSIG_ARITHMETIC : KSIG_ARITHMETIC | KSIG_NULL; - - if (reg.segment == 0xFFFF) - return KSIG_UNINITIALIZED; - - // Otherwise it's an object - SegmentObj *mobj = _segMan->getSegmentObj(reg.segment); - if (!mobj) - return 0; // Invalid - - if (!mobj->isValidOffset(reg.offset)) - error("[KERN] ref %04x:%04x is invalid", PRINT_REG(reg)); - - switch (mobj->getType()) { - case SEG_TYPE_SCRIPT: - if (reg.offset <= (*(Script *)mobj).getBufSize() && - reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && - RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) { - return ((Script *)mobj)->getObject(reg.offset) ? KSIG_OBJECT : KSIG_REF; - } else - return KSIG_REF; - case SEG_TYPE_CLONES: - return KSIG_OBJECT; - case SEG_TYPE_LOCALS: - case SEG_TYPE_STACK: - case SEG_TYPE_SYS_STRINGS: - case SEG_TYPE_DYNMEM: - case SEG_TYPE_HUNK: -#ifdef ENABLE_SCI32 - case SEG_TYPE_ARRAY: - case SEG_TYPE_STRING: -#endif - return KSIG_REF; - case SEG_TYPE_LISTS: - return KSIG_LIST; - case SEG_TYPE_NODES: - return KSIG_NODE; - default: - return 0; - } -} - -struct SignatureDebugType { - char typeCheck; - const char *text; -}; - -static const SignatureDebugType signatureDebugTypeList[] = { - { KSIG_NULL, "null" }, - { KSIG_ARITHMETIC, "value" }, - { KSIG_UNINITIALIZED, "uninitialized" }, - { KSIG_OBJECT, "object" }, - { KSIG_REF, "reference" }, - { KSIG_LIST, "list" }, - { KSIG_NODE, "node" }, - { 0, NULL } -}; - -static void kernelSignatureDebugType(const char type) { - bool firstPrint = true; - - const SignatureDebugType *list = signatureDebugTypeList; - while (list->typeCheck) { - if (type & list->typeCheck) { - if (!firstPrint) - printf(", "); - printf("%s", list->text); - firstPrint = false; - } - list++; - } -} - -// Shows kernel call signature and current arguments for debugging purposes -void Kernel::signatureDebug(const char *sig, int argc, const reg_t *argv) { - int argnr = 0; - while (*sig || argc) { - printf("parameter %d: ", argnr++); - if (argc) { - reg_t parameter = *argv; - printf("%04x:%04x (", PRINT_REG(parameter)); - int regType = findRegType(parameter); - if (regType) - kernelSignatureDebugType(regType); - else - printf("unknown type of %04x:%04x", PRINT_REG(parameter)); - printf(")"); - argv++; - argc--; - } else { - printf("not passed"); - } - if (*sig) { - const char signature = *sig; - if ((signature & KSIG_ANY) == KSIG_ANY) { - printf(", may be any"); - } else { - printf(", should be "); - kernelSignatureDebugType(signature); - } - if (signature & KSIG_ELLIPSIS) - printf(" (optional)"); - sig++; - } - printf("\n"); - } -} - -bool Kernel::signatureMatch(const char *sig, int argc, const reg_t *argv) { - // Always "match" if no signature is given - if (!sig) - return true; - - while (*sig && argc) { - if ((*sig & KSIG_ANY) != KSIG_ANY) { - int type = findRegType(*argv); - - if (!type) - return false; // couldn't determine type - - if (!(type & *sig)) - return false; // type mismatch - - } - if (!(*sig & KSIG_ELLIPSIS)) - ++sig; - ++argv; - --argc; - } - - if (argc) - return false; // Too many arguments - if (*sig == 0 || (*sig & KSIG_ELLIPSIS)) - return true; - - return false; // Too few arguments -} - void Kernel::setDefaultKernelNames() { _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 9b4a11f132..ef587194d6 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -96,20 +96,23 @@ struct SelectorCache; // from selector.h // ---- Kernel signatures ----------------------------------------------------- - -// Compiled signatures +// internal kernel signature data enum { - KSIG_LIST = 0x01, - KSIG_NODE = 0x02, - KSIG_OBJECT = 0x04, - KSIG_REF = 0x08, - KSIG_ARITHMETIC = 0x10, - KSIG_UNINITIALIZED = 0x20, - KSIG_NULL = 0x40, - KSIG_ANY = 0x5f, - KSIG_ELLIPSIS = 0x80 + SIG_TYPE_NULL = 0x01, // may be 0:0 [0] + SIG_TYPE_INTEGER = 0x02, // may be 0:* [i], automatically also allows null + SIG_TYPE_UNINITIALIZED = 0x04, // may be FFFF:* -> not allowable, only used for comparsion + SIG_TYPE_OBJECT = 0x10, // may be object [o] + SIG_TYPE_REFERENCE = 0x20, // may be reference [r] + SIG_TYPE_LIST = 0x40, // may be list [l] + SIG_TYPE_NODE = 0x80, // may be node [n] + SIG_IS_OPTIONAL = 0x100, // is optional + SIG_NEEDS_MORE = 0x200, // needs at least one additional parameter following + SIG_MORE_MAY_FOLLOW = 0x400, // may have more parameters of the same type following }; +// this does not include SIG_TYPE_UNINITIALIZED, because we can not allow uninitialized values anywhere +#define SIG_MAYBE_ANY (SIG_TYPE_NULL | SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_LIST | SIG_TYPE_NODE) + // ---------------------------------------------------------------------------- /* Generic description: */ @@ -132,7 +135,7 @@ struct KernelFuncWithSignature { KernelFunc *func; /**< The actual function */ Common::String origName; /**< Original name, in case we couldn't map it */ bool isDummy; - char *signature; + uint16 *signature; const SciWorkaroundEntry *workarounds; }; @@ -175,16 +178,15 @@ public: * If no signature is given (i.e., if sig is NULL), this is always * treated as a match. * - * @param segMan pointer to the segment manager * @param sig signature to test against * @param argc number of arguments to test * @param argv argument list * @return true if the signature was matched, false otherwise */ - bool signatureMatch(const char *sig, int argc, const reg_t *argv); + bool signatureMatch(const uint16 *sig, int argc, const reg_t *argv); // Prints out debug information in case a signature check fails - void signatureDebug(const char *sig, int argc, const reg_t *argv); + void signatureDebug(const uint16 *sig, int argc, const reg_t *argv); /** * Determines the type of the object indicated by reg. -- cgit v1.2.3 From 63c439a858b96adbfb439651047b293d66947f19 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 5 Jul 2010 14:46:09 +0000 Subject: SCI: fix compilation issues from r50678 svn-id: r50679 --- engines/sci/engine/kernel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index ef587194d6..a0b91b8601 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -107,7 +107,7 @@ enum { SIG_TYPE_NODE = 0x80, // may be node [n] SIG_IS_OPTIONAL = 0x100, // is optional SIG_NEEDS_MORE = 0x200, // needs at least one additional parameter following - SIG_MORE_MAY_FOLLOW = 0x400, // may have more parameters of the same type following + SIG_MORE_MAY_FOLLOW = 0x400 // may have more parameters of the same type following }; // this does not include SIG_TYPE_UNINITIALIZED, because we can not allow uninitialized values anywhere -- cgit v1.2.3 From 47e59d8cc2d4b04a7d16528985a0b52c2edd8a9f Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 5 Jul 2010 15:53:17 +0000 Subject: GUI/AUDIO: minor fix for the case that after enabling individual audio options for a target the gui tries to select the audio device from global options, but that particular device is unavailable due to GUIO flags settings svn-id: r50684 --- gui/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index 74287667c2..9244edfa75 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -798,7 +798,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { if (setting.empty() ? (preferredType == d->getMusicType()) : (drv == d->getCompleteId())) { popup->setSelectedTag(d->getHandle()); - return true; + return popup->getSelected() == -1 ? false : true; } } } -- cgit v1.2.3 From 00dfb4db2968d46ca8052f2020143254c8926805 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:08:43 +0000 Subject: SAGA: Fix warning on systems where enum's are unsigned svn-id: r50685 --- engines/saga/font.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/saga/font.h b/engines/saga/font.h index f290384e87..d8b1da30b9 100644 --- a/engines/saga/font.h +++ b/engines/saga/font.h @@ -190,7 +190,7 @@ class Font { } } bool valid(FontId fontId) { - return ((fontId >= 0) && (fontId < _loadedFonts)); + return (fontId < _loadedFonts); } int getByteLen(int numBits) const { int byteLength = numBits / 8; -- cgit v1.2.3 From f39f7f3dedbea6543337526607b0b1a477c2e0c3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:08:59 +0000 Subject: DS: Augment 'clean' target, simplify bin->elf conversion rule svn-id: r50686 --- backends/platform/ds/ds.mk | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 9df0d2ba0d..d7c7defa3d 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -92,9 +92,17 @@ OPT_SIZE := -Os -mthumb all: scummvm.nds scummvm.ds.gba +clean: dsclean + +dsclean: + $(RM) scummvm.nds scummvm.ds.gba + +.PHONY: dsclean + +# TODO: Add a 'dsdist' target ? + %.bin: %.elf - $(OBJCOPY) -S $< $( 0) { flush(); } @@ -483,15 +482,17 @@ DSFileStream *DSFileStream::makeFromPath(const Common::String &path, bool writeM // Stdio replacements -#define MAX_FILE_HANDLES 32 +enum { + MAX_FILE_HANDLES = 32 +}; -bool inited = false; -DS::fileHandle handle[MAX_FILE_HANDLES]; +static bool inited = false; +static DS::fileHandle s_handle[MAX_FILE_HANDLES]; FILE* std_fopen(const char* name, const char* mode) { if (!inited) { for (int r = 0; r < MAX_FILE_HANDLES; r++) { - handle[r].used = false; + s_handle[r].used = false; } inited = true; currentDir[0] = '\0'; @@ -538,7 +539,7 @@ FILE* std_fopen(const char* name, const char* mode) { // Allocate a file handle int r = 0; - while (handle[r].used) { + while (s_handle[r].used) { r++; assert(r < MAX_FILE_HANDLES); } @@ -546,20 +547,20 @@ FILE* std_fopen(const char* name, const char* mode) { #ifdef GBA_SRAM_SAVE if (strchr(mode, 'w')) { // consolePrintf("Writing %s\n", realName); - handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, true); + s_handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, true); } else { // consolePrintf("Reading %s\n", realName); - handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false); + s_handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false); } #endif - if (handle[r].sramFile) { - handle[r].used = true; - handle[r].pos = 0; - handle[r].data = NULL; - handle[r].size = handle[r].sramFile->getSize(); + if (s_handle[r].sramFile) { + s_handle[r].used = true; + s_handle[r].pos = 0; + s_handle[r].data = NULL; + s_handle[r].size = s_handle[r].sramFile->getSize(); // consolePrintf("Found it"); - return &handle[r]; + return &s_handle[r]; } // consolePrintf("Not in SRAM!"); @@ -590,16 +591,17 @@ FILE* std_fopen(const char* name, const char* mode) { // Allocate a file handle int r = 0; - while (handle[r].used) r++; + while (s_handle[r].used) + r++; - handle[r].used = true; - handle[r].pos = 0; - handle[r].data = data; - handle[r].size = zip->getFileSize(); + s_handle[r].used = true; + s_handle[r].pos = 0; + s_handle[r].data = data; + s_handle[r].size = zip->getFileSize(); // consolePrintf("Opened file %d: %s (%s) ", r, realName, name); - return &handle[r]; + return &s_handle[r]; } else { zip->setAllFilesVisible(false); // consolePrintf("Not found: %s (%s) ", realName, name); diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 556cfc3f43..4ba0b35472 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -194,9 +194,6 @@ enum MouseMode { #define SCUMM_GAME_HEIGHT 142 #define SCUMM_GAME_WIDTH 227 -static int textureID; -static u16* texture; - static int frameCount; static int currentTimeMillis; @@ -235,7 +232,6 @@ static bool indyFightState; static bool indyFightRight; static OSystem_DS::SoundProc soundCallback; -static void *soundParam; static int lastCallbackFrame; static bool bufferFirstHalf; static bool bufferSecondHalf; @@ -1450,7 +1446,6 @@ void doButtonSelectMode(OSystem_DS* system) } if (rightButtonDown) { - Common::Event event; event.mouse = Common::Point(getPenX(), getPenY()); event.type = Common::EVENT_RBUTTONUP; system->addEvent(event); @@ -1464,7 +1459,6 @@ void doButtonSelectMode(OSystem_DS* system) } else { // If we're playing sam and max, click and release the right mouse // button to change verb - Common::Event event; if (s_currentGame->control == CONT_FUTURE_WARS) { event.mouse = Common::Point(320 - 128, 200 - 128); @@ -1579,8 +1573,7 @@ void addEventsToQueue() { bool release = getKeysReleased() & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN); bool shoulders = getKeysHeld() & (KEY_L | KEY_R); - if ( (down && (!shoulders)) || release) - { + if ( (down && (!shoulders)) || release) { if (getKeysChanged() & KEY_LEFT) { event.kbd.keycode = Common::KEYCODE_LEFT; @@ -1658,8 +1651,6 @@ void addEventsToQueue() { updateStatus(); - Common::Event event; - if ((tapScreenClicks) && (getIsDisplayMode8Bit())) { if ((!keyboardEnable) || (!isInsideKeyboard(penDownX, penDownY))) { @@ -1713,8 +1704,6 @@ void addEventsToQueue() { if (s_currentGame->control == CONT_SIMON) { // Extra controls for Simon the Sorcerer if ((getKeysDown() & KEY_DOWN)) { - Common::Event event; - event.type = Common::EVENT_KEYDOWN; event.kbd.keycode = Common::KEYCODE_F10; // F10 or # - show hotspots event.kbd.ascii = Common::ASCII_F10; @@ -1732,8 +1721,6 @@ void addEventsToQueue() { if (s_currentGame->control == CONT_SCUMM_ORIGINAL) { // Extra controls for Scumm v1-5 games if ((getKeysDown() & KEY_DOWN)) { - Common::Event event; - event.type = Common::EVENT_KEYDOWN; event.kbd.keycode = Common::KEYCODE_PERIOD; // Full stop - skips current dialogue line event.kbd.ascii = '.'; @@ -2371,7 +2358,7 @@ void uploadSpriteGfx() { vramSetBankE(VRAM_E_MAIN_SPRITE); // Convert texture from 24bit 888 to 16bit 1555, remembering to set top bit! - u8* srcTex = (u8 *) ::icons_raw; + const u8* srcTex = (const u8 *) ::icons_raw; for (int r = 32 * 256 ; r >= 0; r--) { SPRITE_GFX_SUB[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); SPRITE_GFX[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); @@ -3361,7 +3348,6 @@ extern "C" void consolePrintf(char * format, ...) __attribute__ ((no_instrument_ extern "C" void consolePrintf(const char * format, ...) { - char buffer[256]; va_list args; va_start(args, format); viprintf(format, args); diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 88a7ca2b22..5669f7feaf 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -38,7 +38,7 @@ enum controlType { CONT_FUTURE_WARS, CONT_AGI, CONT_GOBLINS, - CONT_NIPPON, + CONT_NIPPON }; struct gameListType { diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 9171151fde..5e21a7d78f 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -310,7 +310,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int for (int dy = y; dy < y + h; dy++) { u8* dest = ((u8 *) (bg)) + (dy * stride) + x; - u8* src = (u8 *) buf + (pitch * by); + const u8* src = (const u8 *) buf + (pitch * by); u32 dx; @@ -362,7 +362,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int for (int dy = y; dy < y + h; dy++) { u8* dest = ((u8 *) (bg)) + (dy * stride) + x; u8* destSub = ((u8 *) (bgSub)) + (dy * 512) + x; - u8* src = (u8 *) buf + (pitch * by); + const u8* src = (const u8 *) buf + (pitch * by); u32 dx; @@ -591,7 +591,7 @@ void OSystem_DS::refreshCursor() { DS::setCursorIcon(_cursorImage, _cursorW, _cursorH, _cursorKey, _cursorHotX, _cursorHotY); } -void OSystem_DS::addEvent(Common::Event& e) { +void OSystem_DS::addEvent(const Common::Event& e) { eventQueue[queuePos++] = e; } diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index 10b4c87f66..dc8b65a1c8 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -136,8 +136,8 @@ public: virtual Common::SaveFileManager *getSavefileManager(); - void addEvent(Common::Event& e); - bool isEventQueueEmpty() { return queuePos == 0; } + void addEvent(const Common::Event& e); + bool isEventQueueEmpty() const { return queuePos == 0; } virtual bool grabRawScreen(Graphics::Surface* surf); @@ -161,8 +161,8 @@ public: virtual void clearAutoComplete(); virtual void setCharactersEntered(int count); - u16 getDSPaletteEntry(u32 entry) { return _palette[entry]; } - u16 getDSCursorPaletteEntry(u32 entry) { return !_disableCursorPalette? _cursorPalette[entry]: _palette[entry]; } + u16 getDSPaletteEntry(u32 entry) const { return _palette[entry]; } + u16 getDSCursorPaletteEntry(u32 entry) const { return !_disableCursorPalette? _cursorPalette[entry]: _palette[entry]; } virtual void setCursorPalette(const byte *colors, uint start, uint num); diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 88bf0ae991..ef931899be 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -47,100 +47,100 @@ key_data keys[DS_NUM_KEYS] = { // Key number x y character // Numbers - {28, 3, 0, '1'}, - {29, 5, 0, '2'}, - {30, 7, 0, '3'}, - {31, 9, 0, '4'}, - {32, 11, 0, '5'}, - {33, 13, 0, '6'}, - {34, 15, 0, '7'}, - {35, 17, 0, '8'}, - {36, 19, 0, '9'}, - {27, 21, 0, '0'}, - {45, 23, 0, Common::KEYCODE_MINUS}, - {50, 25, 0, Common::KEYCODE_EQUALS}, - {52, 27, 0, Common::KEYCODE_BACKSPACE}, + {28, 3, 0, '1', false}, + {29, 5, 0, '2', false}, + {30, 7, 0, '3', false}, + {31, 9, 0, '4', false}, + {32, 11, 0, '5', false}, + {33, 13, 0, '6', false}, + {34, 15, 0, '7', false}, + {35, 17, 0, '8', false}, + {36, 19, 0, '9', false}, + {27, 21, 0, '0', false}, + {45, 23, 0, Common::KEYCODE_MINUS, false}, + {50, 25, 0, Common::KEYCODE_EQUALS, false}, + {52, 27, 0, Common::KEYCODE_BACKSPACE, false}, // Top row - {'Q'-'A' + 1, 4, 2, 'Q'}, - {'W'-'A' + 1, 6, 2, 'W'}, - {'E'-'A' + 1, 8, 2, 'E'}, - {'R'-'A' + 1, 10, 2, 'R'}, - {'T'-'A' + 1, 12, 2, 'T'}, - {'Y'-'A' + 1, 14, 2, 'Y'}, - {'U'-'A' + 1, 16, 2, 'U'}, - {'I'-'A' + 1, 18, 2, 'I'}, - {'O'-'A' + 1, 20, 2, 'O'}, - {'P'-'A' + 1, 22, 2, 'P'}, - {43, 24, 2, Common::KEYCODE_LEFTBRACKET}, - {44, 26, 2, Common::KEYCODE_RIGHTBRACKET}, + {'Q'-'A' + 1, 4, 2, 'Q', false}, + {'W'-'A' + 1, 6, 2, 'W', false}, + {'E'-'A' + 1, 8, 2, 'E', false}, + {'R'-'A' + 1, 10, 2, 'R', false}, + {'T'-'A' + 1, 12, 2, 'T', false}, + {'Y'-'A' + 1, 14, 2, 'Y', false}, + {'U'-'A' + 1, 16, 2, 'U', false}, + {'I'-'A' + 1, 18, 2, 'I', false}, + {'O'-'A' + 1, 20, 2, 'O', false}, + {'P'-'A' + 1, 22, 2, 'P', false}, + {43, 24, 2, Common::KEYCODE_LEFTBRACKET, false}, + {44, 26, 2, Common::KEYCODE_RIGHTBRACKET, false}, // Middle row - {55, 3, 4, DS_CAPSLOCK}, - {'A'-'A' + 1, 5, 4, 'A'}, - {'S'-'A' + 1, 7, 4, 'S'}, - {'D'-'A' + 1, 9, 4, 'D'}, - {'F'-'A' + 1, 11, 4, 'F'}, - {'G'-'A' + 1, 13, 4, 'G'}, - {'H'-'A' + 1, 15, 4, 'H'}, - {'J'-'A' + 1, 17, 4, 'J'}, - {'K'-'A' + 1, 19, 4, 'K'}, - {'L'-'A' + 1, 21, 4, 'L'}, - {42, 23, 4, Common::KEYCODE_SEMICOLON}, - {41, 25, 4, Common::KEYCODE_QUOTE}, - {46, 27, 4, Common::KEYCODE_RETURN}, + {55, 3, 4, DS_CAPSLOCK, false}, + {'A'-'A' + 1, 5, 4, 'A', false}, + {'S'-'A' + 1, 7, 4, 'S', false}, + {'D'-'A' + 1, 9, 4, 'D', false}, + {'F'-'A' + 1, 11, 4, 'F', false}, + {'G'-'A' + 1, 13, 4, 'G', false}, + {'H'-'A' + 1, 15, 4, 'H', false}, + {'J'-'A' + 1, 17, 4, 'J', false}, + {'K'-'A' + 1, 19, 4, 'K', false}, + {'L'-'A' + 1, 21, 4, 'L', false}, + {42, 23, 4, Common::KEYCODE_SEMICOLON, false}, + {41, 25, 4, Common::KEYCODE_QUOTE, false}, + {46, 27, 4, Common::KEYCODE_RETURN, false}, // Bottom row - {51, 4, 6, DS_SHIFT}, - {'Z'-'A' + 1, 6, 6, 'Z'}, - {'X'-'A' + 1, 8, 6, 'X'}, - {'C'-'A' + 1, 10, 6, 'C'}, - {'V'-'A' + 1, 12, 6, 'V'}, - {'B'-'A' + 1, 14, 6, 'B'}, - {'N'-'A' + 1, 16, 6, 'N'}, - {'M'-'A' + 1, 18, 6, 'M'}, - {38, 20, 6, Common::KEYCODE_COMMA}, - {39, 22, 6, Common::KEYCODE_PERIOD}, - {40, 24, 6, Common::KEYCODE_SLASH}, + {51, 4, 6, DS_SHIFT, false}, + {'Z'-'A' + 1, 6, 6, 'Z', false}, + {'X'-'A' + 1, 8, 6, 'X', false}, + {'C'-'A' + 1, 10, 6, 'C', false}, + {'V'-'A' + 1, 12, 6, 'V', false}, + {'B'-'A' + 1, 14, 6, 'B', false}, + {'N'-'A' + 1, 16, 6, 'N', false}, + {'M'-'A' + 1, 18, 6, 'M', false}, + {38, 20, 6, Common::KEYCODE_COMMA, false}, + {39, 22, 6, Common::KEYCODE_PERIOD, false}, + {40, 24, 6, Common::KEYCODE_SLASH, false}, // Space bar - {47, 9, 8, Common::KEYCODE_SPACE}, - {48, 11, 8, Common::KEYCODE_SPACE}, - {48, 13, 8, Common::KEYCODE_SPACE}, - {48, 15, 8, Common::KEYCODE_SPACE}, - {48, 17, 8, Common::KEYCODE_SPACE}, - {49, 19, 8, Common::KEYCODE_SPACE}, + {47, 9, 8, Common::KEYCODE_SPACE, false}, + {48, 11, 8, Common::KEYCODE_SPACE, false}, + {48, 13, 8, Common::KEYCODE_SPACE, false}, + {48, 15, 8, Common::KEYCODE_SPACE, false}, + {48, 17, 8, Common::KEYCODE_SPACE, false}, + {49, 19, 8, Common::KEYCODE_SPACE, false}, // Cursor arrows - {52, 27, 8, Common::KEYCODE_LEFT}, - {54, 29, 8, Common::KEYCODE_DOWN}, - {53, 31, 8, Common::KEYCODE_RIGHT}, - {51, 29, 6, Common::KEYCODE_UP}, + {52, 27, 8, Common::KEYCODE_LEFT, false}, + {54, 29, 8, Common::KEYCODE_DOWN, false}, + {53, 31, 8, Common::KEYCODE_RIGHT, false}, + {51, 29, 6, Common::KEYCODE_UP, false}, // Close button - {56, 30, 0, Common::KEYCODE_INVALID}, + {56, 30, 0, Common::KEYCODE_INVALID, false}, // Function keys (needed for AGI) - {57, 4, -2, Common::KEYCODE_F1}, - {58, 6, -2, Common::KEYCODE_F2}, - {59, 8, -2, Common::KEYCODE_F3}, - {60, 10, -2, Common::KEYCODE_F4}, - {61, 14, -2, Common::KEYCODE_F5}, - {62, 16, -2, Common::KEYCODE_F6}, - {63, 18, -2, Common::KEYCODE_F7}, - {64, 20, -2, Common::KEYCODE_F8}, - {65, 24, -2, Common::KEYCODE_F9}, - {66, 26, -2, Common::KEYCODE_F10}, - {67, 28, -2, Common::KEYCODE_F11}, - {68, 30, -2, Common::KEYCODE_F12}, + {57, 4, -2, Common::KEYCODE_F1, false}, + {58, 6, -2, Common::KEYCODE_F2, false}, + {59, 8, -2, Common::KEYCODE_F3, false}, + {60, 10, -2, Common::KEYCODE_F4, false}, + {61, 14, -2, Common::KEYCODE_F5, false}, + {62, 16, -2, Common::KEYCODE_F6, false}, + {63, 18, -2, Common::KEYCODE_F7, false}, + {64, 20, -2, Common::KEYCODE_F8, false}, + {65, 24, -2, Common::KEYCODE_F9, false}, + {66, 26, -2, Common::KEYCODE_F10, false}, + {67, 28, -2, Common::KEYCODE_F11, false}, + {68, 30, -2, Common::KEYCODE_F12, false}, }; int keyboardX; int keyboardY; -int mapBase; -int tileBase; +static int s_mapBase; +static int s_tileBase; u16* baseAddress; @@ -212,7 +212,7 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { for (int tile = 0; tile < 94; tile++) { u16* tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32))); - u8* src = ((u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; + const u8* src = ((const u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; for (int y = 0 ; y < 8; y++) { for (int x = 0; x < 2; x++) { @@ -247,8 +247,8 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { keyboardX = -2; keyboardY = 2; - DS::mapBase = mapBase; - DS::tileBase = tileBase; + DS::s_mapBase = mapBase; + DS::s_tileBase = tileBase; shiftState = false; capsLockState = false; @@ -314,7 +314,7 @@ bool getKeyboardClosed() { } void setKeyHighlight(int key, bool highlight) { - u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::mapBase)); + u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::s_mapBase)); if (highlight) { base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x] |= 0x1000; diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index 6ceb83bfc7..33dab253a9 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -27,9 +27,11 @@ namespace DS { -static const int NUM_WORDS = 12; -static const int KEYBOARD_DATA_SIZE = 4736 * 2; -static const int KEYBOARD_BOTTOM_Y = 105; +enum { + NUM_WORDS = 12, + KEYBOARD_DATA_SIZE = 4736 * 2, + KEYBOARD_BOTTOM_Y = 105 +}; void createKeyEvent(int keyNum, Common::Event& event); -- cgit v1.2.3 From e4ec2e6403211abd52806d19732ac30d9a874f92 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:10:22 +0000 Subject: DS: Code formatting: "char* foo" -> "char *foo" svn-id: r50688 --- backends/fs/ds/ds-fs.cpp | 44 +++++++-------- backends/fs/ds/ds-fs.h | 28 ++++----- backends/platform/ds/arm7/source/main.cpp | 14 ++--- backends/platform/ds/arm9/source/blitters.cpp | 22 ++++---- backends/platform/ds/arm9/source/blitters.h | 16 +++--- backends/platform/ds/arm9/source/cdaudio.cpp | 8 +-- backends/platform/ds/arm9/source/dsmain.cpp | 48 ++++++++-------- backends/platform/ds/arm9/source/dsmain.h | 8 +-- backends/platform/ds/arm9/source/dsoptions.cpp | 2 +- backends/platform/ds/arm9/source/dsoptions.h | 48 ++++++++-------- backends/platform/ds/arm9/source/gbampsave.cpp | 4 +- backends/platform/ds/arm9/source/gbampsave.h | 10 ++-- backends/platform/ds/arm9/source/osystem_ds.cpp | 66 +++++++++++----------- backends/platform/ds/arm9/source/osystem_ds.h | 22 ++++---- backends/platform/ds/arm9/source/portdefs.cpp | 2 +- backends/platform/ds/arm9/source/ramsave.cpp | 24 ++++---- backends/platform/ds/arm9/source/ramsave.h | 26 ++++----- backends/platform/ds/arm9/source/touchkeyboard.cpp | 26 ++++----- backends/platform/ds/arm9/source/touchkeyboard.h | 6 +- .../platform/ds/arm9/source/wordcompletion.cpp | 8 +-- backends/platform/ds/arm9/source/zipreader.cpp | 6 +- backends/platform/ds/arm9/source/zipreader.h | 10 ++-- .../platform/ds/commoninclude/NDS/scummvm_ipc.h | 4 +- 23 files changed, 226 insertions(+), 226 deletions(-) diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 39eaf39ec0..8dc3902216 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -115,7 +115,7 @@ DSFileSystemNode::DSFileSystemNode(const Common::String& path, bool isDir) { // consolePrintf("Found: %d, Dir: %d\n", _isValid, _isDirectory); } -DSFileSystemNode::DSFileSystemNode(const DSFileSystemNode* node) { +DSFileSystemNode::DSFileSystemNode(const DSFileSystemNode *node) { //TODO: not implemented? } @@ -144,7 +144,7 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool _zipFile->changeToRoot(); /* // This is the root dir, so add the RAM folder - DSFileSystemNode* dsfsn = new DSFileSystemNode("ds:/ram"); + DSFileSystemNode *dsfsn = new DSFileSystemNode("ds:/ram"); dsfsn->_isDirectory = true; dirList->push_back(wrap(dsfsn)); */ @@ -162,7 +162,7 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool if ( (_zipFile->isDirectory() && ((mode == Common::FSNode::kListDirectoriesOnly) || (mode == Common::FSNode::kListAll)) ) || (!_zipFile->isDirectory() && ((mode == Common::FSNode::kListFilesOnly) || (mode == Common::FSNode::kListAll)) ) ) { - DSFileSystemNode* dsfsn = new DSFileSystemNode("ds:/" + Common::String(n), _zipFile->isDirectory()); + DSFileSystemNode *dsfsn = new DSFileSystemNode("ds:/" + Common::String(n), _zipFile->isDirectory()); dsfsn->_isDirectory = _zipFile->isDirectory(); dirList.push_back((dsfsn)); } @@ -173,7 +173,7 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool return true; } -AbstractFSNode* DSFileSystemNode::getParent() const { +AbstractFSNode *DSFileSystemNode::getParent() const { // consolePrintf("parent\n"); DSFileSystemNode *p; @@ -276,7 +276,7 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDire } -GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode* node) { +GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode *node) { //TODO: not implemented? } @@ -319,7 +319,7 @@ bool GBAMPFileSystemNode::getChildren(AbstractFSList& dirList, ListMode mode, bo if ( ((entryType == TYPE_DIR) && ((mode == Common::FSNode::kListDirectoriesOnly) || (mode == Common::FSNode::kListAll))) || ((entryType == TYPE_FILE) && ((mode == Common::FSNode::kListFilesOnly) || (mode == Common::FSNode::kListAll))) ) { - GBAMPFileSystemNode* dsfsn; + GBAMPFileSystemNode *dsfsn; //consolePrintf("Fname: %s\n", fname); @@ -348,7 +348,7 @@ bool GBAMPFileSystemNode::getChildren(AbstractFSList& dirList, ListMode mode, bo return true; } -AbstractFSNode* GBAMPFileSystemNode::getParent() const { +AbstractFSNode *GBAMPFileSystemNode::getParent() const { // consolePrintf("parent\n"); GBAMPFileSystemNode *p; @@ -489,7 +489,7 @@ enum { static bool inited = false; static DS::fileHandle s_handle[MAX_FILE_HANDLES]; -FILE* std_fopen(const char* name, const char* mode) { +FILE *std_fopen(const char *name, const char *mode) { if (!inited) { for (int r = 0; r < MAX_FILE_HANDLES; r++) { s_handle[r].used = false; @@ -498,7 +498,7 @@ FILE* std_fopen(const char* name, const char* mode) { currentDir[0] = '\0'; } - char* realName = (char *) name; + char *realName = (char *) name; // Remove file system prefix if ((name[0] == 'd') && (name[1] == 's') && (name[2] == ':') && (name[3] == '/')) { @@ -516,13 +516,13 @@ FILE* std_fopen(const char* name, const char* mode) { FAT_chdir("/"); // Turn all back slashes into forward slashes for gba_nds_fat - char* p = realName; + char *p = realName; while (*p) { if (*p == '\\') *p = '/'; p++; } - FAT_FILE* result = FAT_fopen(realName, mode); + FAT_FILE *result = FAT_fopen(realName, mode); if (result == 0) { // consolePrintf("Error code %d\n", result); @@ -565,9 +565,9 @@ FILE* std_fopen(const char* name, const char* mode) { // consolePrintf("Not in SRAM!"); - char* data; + char *data; - ZipFile* zip = DSFileSystemNode::getZip(); + ZipFile *zip = DSFileSystemNode::getZip(); if (!zip) { // consolePrintf("No zip yet!"); return NULL; @@ -609,7 +609,7 @@ FILE* std_fopen(const char* name, const char* mode) { } } -void std_fclose(FILE* handle) { +void std_fclose(FILE *handle) { if (DS::isGBAMPAvailable()) { FAT_fclose((FAT_FILE *) handle); @@ -623,7 +623,7 @@ void std_fclose(FILE* handle) { } } -size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { +size_t std_fread(const void *ptr, size_t size, size_t numItems, FILE *handle) { // consolePrintf("fread %d,%d %d ", size, numItems, ptr); if (DS::isGBAMPAvailable()) { @@ -668,7 +668,7 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { return numItems; } -size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { +size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle) { if ((handle == stdin)) return 0; if ((handle == stderr) || (handle == stdout)) { @@ -704,7 +704,7 @@ size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { } } -bool std_feof(FILE* handle) { +bool std_feof(FILE *handle) { // consolePrintf("feof "); if (DS::isGBAMPAvailable()) { @@ -719,13 +719,13 @@ bool std_feof(FILE* handle) { return handle->pos >= handle->size; } -int std_fflush(FILE* handle) { +int std_fflush(FILE *handle) { //FIXME: not implemented? // consolePrintf("fflush "); return 0; } -long int std_ftell(FILE* handle) { +long int std_ftell(FILE *handle) { if (DS::isGBAMPAvailable()) { return FAT_ftell((FAT_FILE *) handle); } @@ -733,7 +733,7 @@ long int std_ftell(FILE* handle) { return handle->pos; } -int std_fseek(FILE* handle, long int offset, int whence) { +int std_fseek(FILE *handle, long int offset, int whence) { // consolePrintf("fseek %d %d ", offset, whence); if (DS::isGBAMPAvailable()) { @@ -758,14 +758,14 @@ int std_fseek(FILE* handle, long int offset, int whence) { return 0; } -int std_ferror(FILE* handle) { +int std_ferror(FILE *handle) { //FIXME: not implemented? // consolePrintf("ferror "); return readPastEndOfFile; } -void std_clearerr(FILE* handle) { +void std_clearerr(FILE *handle) { //FIXME: not implemented? readPastEndOfFile = false; // consolePrintf("clearerr "); diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index c8bf7d6cf2..b4c8f7ac12 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -40,7 +40,7 @@ namespace DS { */ class DSFileSystemNode : public AbstractFSNode { protected: - static ZipFile* _zipFile; + static ZipFile *_zipFile; Common::String _displayName; Common::String _path; @@ -96,7 +96,7 @@ public: * Returns the zip file this node points to. * TODO: check this documentation. */ - static ZipFile* getZip() { return _zipFile; } + static ZipFile *getZip() { return _zipFile; } }; /** @@ -161,10 +161,10 @@ public: struct fileHandle { int pos; bool used; - char* data; + char *data; int size; - DSSaveFile* sramFile; + DSSaveFile *sramFile; }; @@ -213,16 +213,16 @@ public: #define FILE DS::fileHandle // Please do not remove any of these prototypes that appear not to be required. -FILE* std_fopen(const char* name, const char* mode); -void std_fclose(FILE* handle); -size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle); -size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle); -bool std_feof(FILE* handle); -long int std_ftell(FILE* handle); -int std_fseek(FILE* handle, long int offset, int whence); -void std_clearerr(FILE* handle); -int std_fflush(FILE* handle); -int std_ferror(FILE* handle); +FILE* std_fopen(const char *name, const char *mode); +void std_fclose(FILE *handle); +size_t std_fread(const void *ptr, size_t size, size_t numItems, FILE *handle); +size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle); +bool std_feof(FILE *handle); +long int std_ftell(FILE *handle); +int std_fseek(FILE *handle, long int offset, int whence); +void std_clearerr(FILE *handle); +int std_fflush(FILE *handle); +int std_ferror(FILE *handle); } //namespace DS diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp index a4cde02ba6..b45b601bda 100644 --- a/backends/platform/ds/arm7/source/main.cpp +++ b/backends/platform/ds/arm7/source/main.cpp @@ -58,10 +58,10 @@ s32 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1; s32 TOUCH_OFFSET_X = ( ((SCREEN_WIDTH -60) * TOUCH_CAL_X1) / TOUCH_WIDTH ) - 28; s32 TOUCH_OFFSET_Y = ( ((SCREEN_HEIGHT-60) * TOUCH_CAL_Y1) / TOUCH_HEIGHT ) - 28; -vu8* soundData; +vu8 *soundData; -vu8* soundBuffer; -vu8* arm9Buffer; +vu8 *soundBuffer; +vu8 *arm9Buffer; bool soundFilled[4]; int playingSection; @@ -81,7 +81,7 @@ int adpcmBufferNum = 0; ////////////////////////////////////////////////////////////////////// /* -void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { +void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate); SCHANNEL_SOURCE(channel) = (uint32)data; SCHANNEL_LENGTH(channel) = bytes; @@ -106,7 +106,7 @@ s8 getFreeSoundChannel() { return -1; } -void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { +void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { // REG_IME = IME_DISABLE; channel = getFreeSoundChannel(); @@ -177,7 +177,7 @@ void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 - soundData = (vu8* ) data; + soundData = (vu8 *) data; SCHANNEL_CR(channel) = flags; SCHANNEL_CR(channel + 2) = flags; @@ -386,7 +386,7 @@ void InterruptTimer1() { //if ((!soundFilled[r]) && (!IPC->fillNeeded[playingSection])) { memcpy((void *) (soundBuffer + (r * 1024)), (void *) (arm9Buffer + (r * 1024)), 1024); - vu16* p = (vu16 *) (soundBuffer); + vu16 *p = (vu16 *) (soundBuffer); //for (int t = 0; t < 2048; t++) { // *(p + t) = (t & 1)? 0xF000: 0x0000; //} diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp index 07c6b3fee1..fa746fa51e 100644 --- a/backends/platform/ds/arm9/source/blitters.cpp +++ b/backends/platform/ds/arm9/source/blitters.cpp @@ -27,7 +27,7 @@ namespace DS { -void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch) { @@ -111,7 +111,7 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s -void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height) { +void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height) { asm("ands r0, %3, #1\n" "addne %3, %3, #1\n" "bne roll2\n" @@ -155,7 +155,7 @@ void ComputeDivBy5TableIFN() #ifdef PERFECT_5_TO_4_RESCALING static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16* dest) + u16 *dest) { u32 bs0 = s0 & 0x1F; u32 bs1 = s1 & 0x1F; @@ -230,7 +230,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 } #else static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16* dest) + u16 *dest) { static const u32 MASK = 0x03E07C1F; @@ -279,7 +279,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 #endif static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3, u32 s4, - u16* dest) + u16 *dest) { u32 d0 = 4*s0 + s1; u32 d1 = 2*s1 + s1 + 2*s2; @@ -317,7 +317,7 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3 // Can't work in place #ifdef PERFECT_5_TO_4_RESCALING -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const u8* src, const u32* palette) +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u32 *palette) { ComputeDivBy5TableIFN(); @@ -333,7 +333,7 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const } } #else -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const u8* src, const u16* palette) +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u16 *palette) { for (size_t i=0; i<64; ++i) { @@ -350,7 +350,7 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const // Can work in place, because it's a contraction -static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16* dest, const u16* src) +static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16 *dest, const u16 *src) { ComputeDivBy5TableIFN(); @@ -367,7 +367,7 @@ static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16* dest, const } #ifdef PERFECT_5_TO_4_RESCALING -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette) +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u32 fastRam[768]; @@ -388,7 +388,7 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStri } } #else -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette) +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u16 fastRam[256]; for (size_t i=0; i<128; ++i) @@ -401,7 +401,7 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStri } #endif -void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride) +void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride) { for (size_t i=0; i<200; ++i) { diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h index 5f541d1bd6..60dc2af133 100644 --- a/backends/platform/ds/arm9/source/blitters.h +++ b/backends/platform/ds/arm9/source/blitters.h @@ -29,11 +29,11 @@ namespace DS { -void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch); -void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height); -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette); -void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride); +void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height); +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette); +void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride); } @@ -41,11 +41,11 @@ void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStr extern "C" { -void ITCM_CODE asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void ITCM_CODE asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch); -void ITCM_CODE asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height); -void ITCM_CODE Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette, u32 numLines); -void ITCM_CODE Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride); +void ITCM_CODE asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height); +void ITCM_CODE Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette, u32 numLines); +void ITCM_CODE Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride); } diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 7756286117..23a276c4cb 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -74,13 +74,13 @@ struct decoderFormat { bool active = false; WaveHeader waveHeader; Header blockHeader; -FILE* file; +FILE *file; int fillPos; bool isPlayingFlag = false; -s16* audioBuffer; +s16 *audioBuffer; u32 sampleNum; -s16* decompressionBuffer; +s16 *decompressionBuffer; int numLoops; int blockCount; int dataChunkStart; @@ -495,7 +495,7 @@ bool trackExists(int num) { } consolePrintf("Looking for %s...", path.c_str()); - FILE* file; + FILE *file; if ((file = DS::std_fopen(path.c_str(), "r"))) { consolePrintf("Success!\n"); setActive(true); diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 4ba0b35472..2f0d5e34ee 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -119,7 +119,7 @@ static const char *registerNames[] = #ifdef WRAP_MALLOC -extern "C" void* __real_malloc(size_t size); +extern "C" void *__real_malloc(size_t size); static int s_total_malloc = 0; @@ -158,7 +158,7 @@ extern "C" void *__wrap_malloc(size_t size) { consolePrintf("0 size malloc (%d)", zeroSize++); } - void* res = __real_malloc(size); + void *res = __real_malloc(size); if (res) { if (size > 50 * 1024) { consolePrintf("Allocated %d (%x)\n", size, poo); @@ -219,7 +219,7 @@ static int subScreenScale = 256; // Sound static int bufferSize; -static s16* soundBuffer; +static s16 *soundBuffer; static int bufferFrame; static int bufferRate; static int bufferSamples; @@ -431,7 +431,7 @@ controlType getControlType() { //plays an 8 bit mono sample at 11025Hz -void playSound(const void* data, u32 length, bool loop, bool adpcm, int rate) { +void playSound(const void *data, u32 length, bool loop, bool adpcm, int rate) { if (!IPC->soundData) { soundControl.count = 0; @@ -784,7 +784,7 @@ void setMouseCursorVisible(bool enable) { mouseCursorVisible = enable; } -void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY) { +void setCursorIcon(const u8 *icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY) { int off; @@ -965,7 +965,7 @@ void displayMode16BitFlipBuffer() { consolePrintf("Flip %s...", displayModeIs8Bit ? "8bpp" : "16bpp"); #endif if (!displayModeIs8Bit) { - u16* back = get16BitBackBuffer(); + u16 *back = get16BitBackBuffer(); // highBuffer = !highBuffer; // BG3_CR = BG_BMP16_512x256 | BG_BMP_RAM(highBuffer? 1: 0); @@ -984,8 +984,8 @@ void displayMode16BitFlipBuffer() { TIMER1_CR = TIMER_ENABLE | TIMER_DIV_1024; u16 t0 = TIMER1_DATA; #endif - const u8* back = (const u8*)get8BitBackBuffer(); - u16* base = BG_GFX + 0x10000; + const u8 *back = (const u8*)get8BitBackBuffer(); + u16 *base = BG_GFX + 0x10000; Rescale_320x256xPAL8_To_256x256x1555( base, back, @@ -1033,11 +1033,11 @@ s32 get8BitBackBufferStride() { } } -u16* getScalerBuffer() { +u16 *getScalerBuffer() { return (u16 *) scalerBackBuffer; } -u16* get8BitBackBuffer() { +u16 *get8BitBackBuffer() { if (isCpuScalerEnabled()) return (u16 *) scalerBackBuffer; else @@ -1107,7 +1107,7 @@ void soundUpdate() { void memoryReport() { int r = 0; - int* p; + int *p; do { p = (int *) malloc(r * 8192); free(p); @@ -1115,7 +1115,7 @@ void memoryReport() { } while ((p) && (r < 512)); int t = -1; - void* block[1024]; + void *block[1024]; do { t++; block[t] = (int *) malloc(4096); @@ -1130,7 +1130,7 @@ void memoryReport() { void addIndyFightingKeys() { - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; event.type = Common::EVENT_KEYDOWN; @@ -1230,7 +1230,7 @@ void addIndyFightingKeys() { void setKeyboardEnable(bool en) { if (en == keyboardEnable) return; keyboardEnable = en; - u16* backupBank = (u16 *) 0x6040000; + u16 *backupBank = (u16 *) 0x6040000; if (keyboardEnable) { @@ -1266,7 +1266,7 @@ void setKeyboardEnable(bool en) { if (displayModeIs8Bit) { // Copy the sub screen VRAM from the top screen - they should always be // the same. - u16* buffer = get8BitBackBuffer(); + u16 *buffer = get8BitBackBuffer(); s32 stride = get8BitBackBufferStride(); for (int y = 0; y < gameHeight; y++) { @@ -1302,7 +1302,7 @@ bool getIsDisplayMode8Bit() { return displayModeIs8Bit; } -void doScreenTapMode(OSystem_DS* system) { +void doScreenTapMode(OSystem_DS *system) { Common::Event event; static bool left = false, right = false; @@ -1368,7 +1368,7 @@ void doScreenTapMode(OSystem_DS* system) { system->addEvent(event); } -void doButtonSelectMode(OSystem_DS* system) +void doButtonSelectMode(OSystem_DS *system) { Common::Event event; @@ -1492,7 +1492,7 @@ void addEventsToQueue() { #ifdef HEAVY_LOGGING consolePrintf("addEventsToQueue\n"); #endif - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; #ifdef USE_PROFILER @@ -2358,7 +2358,7 @@ void uploadSpriteGfx() { vramSetBankE(VRAM_E_MAIN_SPRITE); // Convert texture from 24bit 888 to 16bit 1555, remembering to set top bit! - const u8* srcTex = (const u8 *) ::icons_raw; + const u8 *srcTex = (const u8 *) ::icons_raw; for (int r = 32 * 256 ; r >= 0; r--) { SPRITE_GFX_SUB[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); SPRITE_GFX[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); @@ -2831,11 +2831,11 @@ bool getIndyFightState() { /////////////////// #define FAST_RAM_SIZE (24000) -u8* fastRamPointer; +u8 *fastRamPointer; u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA; -void* fastRamAlloc(int size) { - void* result = (void *) fastRamPointer; +void *fastRamAlloc(int size) { + void *result = (void *) fastRamPointer; fastRamPointer += size; if(fastRamPointer > fastRamData + FAST_RAM_SIZE) { consolePrintf("FastRam (ITCM) allocation failed!\n"); @@ -2892,7 +2892,7 @@ void initDebugger() { // Ensure the function is processed with C linkage -extern "C" void debug_print_stub(char* string); +extern "C" void debug_print_stub(char *string); void debug_print_stub(char *string) { consolePrintf(string); @@ -3252,7 +3252,7 @@ int main(void) { */ // Create a file system node to force search for a zip file in GBA rom space - DSFileSystemNode* node = new DSFileSystemNode(); + DSFileSystemNode *node = new DSFileSystemNode(); if (!node->getZip() || (!node->getZip()->isReady())) { // If not found, init CF/SD driver initGBAMP(mode); diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 5669f7feaf..7cf8313391 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -76,8 +76,8 @@ void displayMode16Bit(); // Switch to 16-bit mode5 void displayMode16BitFlipBuffer(); // Get address of current back buffer -u16* get16BitBackBuffer(); -u16* get8BitBackBuffer(); +u16 * get16BitBackBuffer(); +u16 * get8BitBackBuffer(); s32 get8BitBackBufferStride(); u16* getScalerBuffer(); @@ -96,7 +96,7 @@ void doTimerCallback(); // Call callback function if required void doSoundCallback(); void startSound(int freq, int buffer); // Start sound hardware // Call function if sound buffers need more data -void playSound(const void* data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound +void playSound(const void *data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound void stopSound(int channel); int getSoundFrequency(); @@ -106,7 +106,7 @@ void VBlankHandler(); // Sam and Max Stuff void setGameID(int id); -void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY); +void setCursorIcon(const u8 *icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY); void setShowCursor(bool enable); void setMouseCursorVisible(bool visible); diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 44bbad23b2..d8b2365c4f 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -366,7 +366,7 @@ void showOptionsDialog() { DS::displayMode16Bit(); - DSOptionsDialog* d = new DSOptionsDialog(); + DSOptionsDialog *d = new DSOptionsDialog(); d->runModal(); delete d; diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h index 4b3ac36d45..48eb2c3303 100644 --- a/backends/platform/ds/arm9/source/dsoptions.h +++ b/backends/platform/ds/arm9/source/dsoptions.h @@ -46,30 +46,30 @@ protected: virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); void updateConfigManager(); - GUI::TabWidget* _tab; - - GUI::StaticTextWidget* _sensitivityLabel; - - GUI::SliderWidget* _touchX; - GUI::SliderWidget* _touchY; - GUI::SliderWidget* _sensitivity; - GUI::SliderWidget* _gammaCorrection; - GUI::CheckboxWidget* _leftHandedCheckbox; - GUI::CheckboxWidget* _unscaledCheckbox; - GUI::CheckboxWidget* _100PercentCheckbox; - GUI::CheckboxWidget* _150PercentCheckbox; - GUI::CheckboxWidget* _200PercentCheckbox; - GUI::CheckboxWidget* _indyFightCheckbox; - GUI::CheckboxWidget* _highQualityAudioCheckbox; - GUI::CheckboxWidget* _disablePowerOff; - GUI::CheckboxWidget* _showCursorCheckbox; - GUI::CheckboxWidget* _snapToBorderCheckbox; - - GUI::CheckboxWidget* _hardScaler; - GUI::CheckboxWidget* _cpuScaler; - - GUI::CheckboxWidget* _touchPadStyle; - GUI::CheckboxWidget* _screenTaps; + GUI::TabWidget *_tab; + + GUI::StaticTextWidget *_sensitivityLabel; + + GUI::SliderWidget *_touchX; + GUI::SliderWidget *_touchY; + GUI::SliderWidget *_sensitivity; + GUI::SliderWidget *_gammaCorrection; + GUI::CheckboxWidget *_leftHandedCheckbox; + GUI::CheckboxWidget *_unscaledCheckbox; + GUI::CheckboxWidget *_100PercentCheckbox; + GUI::CheckboxWidget *_150PercentCheckbox; + GUI::CheckboxWidget *_200PercentCheckbox; + GUI::CheckboxWidget *_indyFightCheckbox; + GUI::CheckboxWidget *_highQualityAudioCheckbox; + GUI::CheckboxWidget *_disablePowerOff; + GUI::CheckboxWidget *_showCursorCheckbox; + GUI::CheckboxWidget *_snapToBorderCheckbox; + + GUI::CheckboxWidget *_hardScaler; + GUI::CheckboxWidget *_cpuScaler; + + GUI::CheckboxWidget *_touchPadStyle; + GUI::CheckboxWidget *_screenTaps; bool _radioButtonMode; diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index 820e569555..d07e6c87fa 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -29,7 +29,7 @@ // GBAMP Save File ///////////////////////// -GBAMPSaveFile::GBAMPSaveFile(char* name, bool saveOrLoad) { +GBAMPSaveFile::GBAMPSaveFile(char *name, bool saveOrLoad) { handle = DS::std_fopen(name, saveOrLoad? "w": "r"); // consolePrintf("%s handle is %d\n", name, handle); // consolePrintf("Created %s\n", name); @@ -196,7 +196,7 @@ Common::StringArray GBAMPSaveFileManager::listSavefiles(const Common::String &pa // consolePrintf("Real cwd:%d\n", realName); - char* p = realName; + char *p = realName; while (*p) { if (*p == '\\') *p = '/'; p++; diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index bc4fdaa1a4..19a9a41938 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -29,14 +29,14 @@ #define SAVE_BUFFER_SIZE 100000 class GBAMPSaveFile : public Common::InSaveFile, public Common::OutSaveFile { - DS::fileHandle* handle; + DS::fileHandle *handle; char buffer[SAVE_BUFFER_SIZE]; int bufferPos; int saveSize; int flushed; public: - GBAMPSaveFile(char* name, bool saveOrLoad); + GBAMPSaveFile(char *name, bool saveOrLoad); virtual ~GBAMPSaveFile(); virtual uint32 read(void *buf, uint32 size); @@ -62,12 +62,12 @@ public: GBAMPSaveFileManager(); ~GBAMPSaveFileManager(); -// static GBAMPSaveFileManager* instance() { return instancePtr; } +// static GBAMPSaveFileManager *instance() { return instancePtr; } GBAMPSaveFile *openSavefile(const char *filename, bool saveOrLoad); - virtual Common::OutSaveFile* openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } - virtual Common::InSaveFile* openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } + virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } + virtual Common::InSaveFile *openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } virtual bool removeSavefile(const Common::String &filename) { return false; } // TODO: Implement this virtual Common::StringArray listSavefiles(const Common::String &pattern); diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 5e21a7d78f..418ab9d006 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -73,7 +73,7 @@ #define DEFAULT_CONFIG_FILE "scummvm.ini" #endif -OSystem_DS* OSystem_DS::_instance = NULL; +OSystem_DS *OSystem_DS::_instance = NULL; OSystem_DS::OSystem_DS() : eventNum(0), lastPenFrame(0), queuePos(0), _mixer(NULL), _timer(NULL), _frameBufferExists(false), @@ -133,7 +133,7 @@ bool OSystem_DS::getFeatureState(Feature f) { return false; } -const OSystem::GraphicsMode* OSystem_DS::getSupportedGraphicsModes() const { +const OSystem::GraphicsMode *OSystem_DS::getSupportedGraphicsModes() const { return s_supportedGraphicsModes; } @@ -243,13 +243,13 @@ void OSystem_DS::setCursorPalette(const byte *colors, uint start, uint num) { refreshCursor(); } -bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) { +bool OSystem_DS::grabRawScreen(Graphics::Surface *surf) { surf->create(DS::getGameWidth(), DS::getGameHeight(), 1); // Ensure we copy using 16 bit quantities due to limitation of VRAM addressing - const u16* image = (const u16 *) DS::get8BitBackBuffer(); + const u16 *image = (const u16 *) DS::get8BitBackBuffer(); for (int y = 0; y < DS::getGameHeight(); y++) { DC_FlushRange(image + (y << 8), DS::getGameWidth()); for (int x = 0; x < DS::getGameWidth() >> 1; x++) { @@ -282,9 +282,9 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // consolePrintf("CopyRectToScreen %d\n", w * h); - u16* bg; + u16 *bg; s32 stride; - u16* bgSub = (u16 *)BG_GFX_SUB; + u16 *bgSub = (u16 *)BG_GFX_SUB; // The DS video RAM doesn't support 8-bit writes because Nintendo wanted // to save a few pennies/euro cents on the hardware. @@ -309,8 +309,8 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // the keyboard image uses the same VRAM addresses. for (int dy = y; dy < y + h; dy++) { - u8* dest = ((u8 *) (bg)) + (dy * stride) + x; - const u8* src = (const u8 *) buf + (pitch * by); + u8 *dest = ((u8 *) (bg)) + (dy * stride) + x; + const u8 *src = (const u8 *) buf + (pitch * by); u32 dx; @@ -331,7 +331,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } // We can now assume dest is aligned - u16* dest16 = (u16 *) dest; + u16 *dest16 = (u16 *) dest; for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; @@ -360,9 +360,9 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // When they keyboard is not on screen, update both vram copies for (int dy = y; dy < y + h; dy++) { - u8* dest = ((u8 *) (bg)) + (dy * stride) + x; - u8* destSub = ((u8 *) (bgSub)) + (dy * 512) + x; - const u8* src = (const u8 *) buf + (pitch * by); + u8 *dest = ((u8 *) (bg)) + (dy * stride) + x; + u8 *destSub = ((u8 *) (bgSub)) + (dy * 512) + x; + const u8 *src = (const u8 *) buf + (pitch * by); u32 dx; @@ -385,8 +385,8 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } // We can now assume dest is aligned - u16* dest16 = (u16 *) dest; - u16* destSub16 = (u16 *) destSub; + u16 *dest16 = (u16 *) dest; + u16 *destSub16 = (u16 *) destSub; for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; @@ -422,12 +422,12 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // Stuff is aligned to 16-bit boundaries, so it's safe to do DMA. - u16* src = (u16 *) buf; + u16 *src = (u16 *) buf; if (DS::getKeyboardEnable()) { for (int dy = y; dy < y + h; dy++) { - u16* dest = bg + (dy * (stride >> 1)) + (x >> 1); + u16 *dest = bg + (dy * (stride >> 1)) + (x >> 1); DC_FlushRange(src, w << 1); DC_FlushRange(dest, w << 1); @@ -440,8 +440,8 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } else { for (int dy = y; dy < y + h; dy++) { - u16* dest1 = bg + (dy * (stride >> 1)) + (x >> 1); - u16* dest2 = bgSub + (dy << 8) + (x >> 1); + u16 *dest1 = bg + (dy * (stride >> 1)) + (x >> 1); + u16 *dest2 = bgSub + (dy << 8) + (x >> 1); DC_FlushRange(src, w << 1); DC_FlushRange(dest1, w << 1); @@ -503,13 +503,13 @@ void OSystem_DS::clearOverlay() { // consolePrintf("clearovl\n"); } -void OSystem_DS::grabOverlay(OverlayColor* buf, int pitch) { +void OSystem_DS::grabOverlay(OverlayColor *buf, int pitch) { // consolePrintf("grabovl\n") - u16* start = DS::get16BitBackBuffer(); + u16 *start = DS::get16BitBackBuffer(); for (int y = 0; y < 200; y++) { - u16* src = start + (y * 320); - u16* dest = ((u16 *) (buf)) + (y * pitch); + u16 *src = start + (y * 320); + u16 *dest = ((u16 *) (buf)) + (y * pitch); for (int x = 0; x < 320; x++) { *dest++ = *src++; @@ -519,8 +519,8 @@ void OSystem_DS::grabOverlay(OverlayColor* buf, int pitch) { } void OSystem_DS::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - u16* bg = (u16 *) DS::get16BitBackBuffer(); - const u16* src = (const u16 *) buf; + u16 *bg = (u16 *) DS::get16BitBackBuffer(); + const u16 *src = (const u16 *) buf; // if (x + w > 256) w = 256 - x; //if (x + h > 256) h = 256 - y; @@ -729,7 +729,7 @@ void OSystem_DS::quit() { swiSoftReset();*/ } -Common::SaveFileManager* OSystem_DS::getSavefileManager() { +Common::SaveFileManager *OSystem_DS::getSavefileManager() { bool forceSram; if (ConfMan.hasKey("forcesramsave", "ds")) { @@ -753,7 +753,7 @@ Common::SaveFileManager* OSystem_DS::getSavefileManager() { } -Graphics::Surface* OSystem_DS::createTempFrameBuffer() { +Graphics::Surface *OSystem_DS::createTempFrameBuffer() { // Ensure we copy using 16 bit quantities due to limitation of VRAM addressing @@ -778,13 +778,13 @@ Graphics::Surface* OSystem_DS::createTempFrameBuffer() { s32 width = DS::getGameWidth(); s32 stride = DS::get8BitBackBufferStride(); - u16* src = DS::get8BitBackBuffer(); - u16* dest = DS::getScalerBuffer(); + u16 *src = DS::get8BitBackBuffer(); + u16 *dest = DS::getScalerBuffer(); for (int y = 0; y < height; y++) { - u16* destLine = dest + (y * (width / 2)); - u16* srcLine = src + (y * (stride / 2)); + u16 *destLine = dest + (y * (width / 2)); + u16 *srcLine = src + (y * (stride / 2)); DC_FlushRange(srcLine, width); @@ -805,7 +805,7 @@ Graphics::Surface* OSystem_DS::createTempFrameBuffer() { size_t imageStrideInBytes = DS::get8BitBackBufferStride(); size_t imageStrideInWords = imageStrideInBytes / 2; - u16* image = (u16 *) DS::get8BitBackBuffer(); + u16 *image = (u16 *) DS::get8BitBackBuffer(); for (int y = 0; y < DS::getGameHeight(); y++) { DC_FlushRange(image + (y * imageStrideInWords), DS::getGameWidth()); for (int x = 0; x < DS::getGameWidth() >> 1; x++) { @@ -851,13 +851,13 @@ void OSystem_DS::setCharactersEntered(int count) { DS::setCharactersEntered(count); } -Common::SeekableReadStream* OSystem_DS::createConfigReadStream() { +Common::SeekableReadStream *OSystem_DS::createConfigReadStream() { Common::FSNode file(DEFAULT_CONFIG_FILE); // consolePrintf("R %s", DEFAULT_CONFIG_FILE); return file.createReadStream(); } -Common::WriteStream* OSystem_DS::createConfigWriteStream() { +Common::WriteStream *OSystem_DS::createConfigWriteStream() { Common::FSNode file(DEFAULT_CONFIG_FILE); // consolePrintf("W %s", DEFAULT_CONFIG_FILE); return file.createWriteStream(); diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index dc8b65a1c8..42419b762e 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -48,13 +48,13 @@ protected: DSSaveFileManager saveManager; #endif GBAMPSaveFileManager mpSaveManager; - Audio::MixerImpl* _mixer; - DefaultTimerManager* _timer; + Audio::MixerImpl *_mixer; + DefaultTimerManager *_timer; Graphics::Surface _framebuffer; bool _frameBufferExists; bool _graphicsEnable; - static OSystem_DS* _instance; + static OSystem_DS *_instance; u16 _palette[256]; u16 _cursorPalette[256]; @@ -68,7 +68,7 @@ protected: int _cursorScale; - Graphics::Surface* createTempFrameBuffer(); + Graphics::Surface *createTempFrameBuffer(); bool _disableCursorPalette; int _gammaValue; @@ -94,7 +94,7 @@ public: virtual int16 getHeight(); virtual int16 getWidth(); virtual void setPalette(const byte *colors, uint start, uint num); - virtual void grabPalette(unsigned char* colors, uint start, uint num); + virtual void grabPalette(unsigned char *colors, uint start, uint num); void restoreHardwarePalette(); virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); @@ -139,7 +139,7 @@ public: void addEvent(const Common::Event& e); bool isEventQueueEmpty() const { return queuePos == 0; } - virtual bool grabRawScreen(Graphics::Surface* surf); + virtual bool grabRawScreen(Graphics::Surface *surf); virtual void setFocusRectangle(const Common::Rect& rect); @@ -150,10 +150,10 @@ public: virtual Graphics::Surface *lockScreen(); virtual void unlockScreen(); - virtual Audio::Mixer* getMixer() { return _mixer; } - Audio::MixerImpl* getMixerImpl() { return _mixer; } + virtual Audio::Mixer *getMixer() { return _mixer; } + Audio::MixerImpl *getMixerImpl() { return _mixer; } - virtual Common::TimerManager* getTimerManager() { return _timer; } + virtual Common::TimerManager *getTimerManager() { return _timer; } static int timerHandler(int t); @@ -172,8 +172,8 @@ public: void refreshCursor(); - Common::WriteStream* createConfigWriteStream(); - Common::SeekableReadStream* createConfigReadStream(); + Common::WriteStream *createConfigWriteStream(); + Common::SeekableReadStream *createConfigReadStream(); u16 applyGamma(u16 colour); void setGammaValue(int gamma) { _gammaValue = gamma; } diff --git a/backends/platform/ds/arm9/source/portdefs.cpp b/backends/platform/ds/arm9/source/portdefs.cpp index 0dcdc1d5a3..b75683df3d 100644 --- a/backends/platform/ds/arm9/source/portdefs.cpp +++ b/backends/platform/ds/arm9/source/portdefs.cpp @@ -25,7 +25,7 @@ #include "osystem_ds.h" /* -extern "C" time_t __wrap_time(time_t* t) { +extern "C" time_t __wrap_time(time_t *t) { if (t) { *t = OSystem_DS::instance()->getMillis() / 1000; } diff --git a/backends/platform/ds/arm9/source/ramsave.cpp b/backends/platform/ds/arm9/source/ramsave.cpp index a0f4633988..d8e74d7445 100644 --- a/backends/platform/ds/arm9/source/ramsave.cpp +++ b/backends/platform/ds/arm9/source/ramsave.cpp @@ -38,7 +38,7 @@ DSSaveFile::DSSaveFile() { isTempFile = false; } -DSSaveFile::DSSaveFile(SCUMMSave* s, bool compressed, u8* data) { +DSSaveFile::DSSaveFile(SCUMMSave *s, bool compressed, u8 *data) { save = *s; saveData = data; ptr = 0; @@ -46,7 +46,7 @@ DSSaveFile::DSSaveFile(SCUMMSave* s, bool compressed, u8* data) { isOpenFlag = true; if (saveCompressed) { - u8* uncompressed = new unsigned char[save.size]; + u8 *uncompressed = new unsigned char[save.size]; if (!uncompressed) consolePrintf("Out of memory allocating %d!\n", save.size); LZ_Uncompress(saveData, uncompressed, save.compressedSize); saveData = uncompressed; @@ -79,7 +79,7 @@ DSSaveFile::~DSSaveFile() { } } -bool DSSaveFile::loadFromSaveRAM(vu8* address) { +bool DSSaveFile::loadFromSaveRAM(vu8 *address) { SCUMMSave newSave; @@ -113,7 +113,7 @@ bool DSSaveFile::loadFromSaveRAM(vu8* address) { void DSSaveFile::compress() { if (!saveCompressed) { - unsigned char* compBuffer = new unsigned char[(save.size * 110) / 100]; + unsigned char *compBuffer = new unsigned char[(save.size * 110) / 100]; int compSize = LZ_Compress((u8 *) saveData, compBuffer, save.size); save.compressedSize = compSize; @@ -127,9 +127,9 @@ void DSSaveFile::compress() { } } -int DSSaveFile::saveToSaveRAM(vu8* address) { +int DSSaveFile::saveToSaveRAM(vu8 *address) { - unsigned char* compBuffer; + unsigned char *compBuffer; bool failed; @@ -356,7 +356,7 @@ void DSSaveFileManager::listFiles() { consolePrintf("SRAM free: %d bytes\n", getBytesFree()); } -DSSaveFileManager* DSSaveFileManager::instancePtr = NULL; +DSSaveFileManager *DSSaveFileManager::instancePtr = NULL; DSSaveFile *DSSaveFileManager::openSavefile(const char *filename, bool saveOrLoad) { for (int r = 0; r < 8; r++) { @@ -379,12 +379,12 @@ DSSaveFile *DSSaveFileManager::openSavefile(const char *filename, bool saveOrLoa -DSSaveFile* DSSaveFile::clone() { +DSSaveFile *DSSaveFile::clone() { // consolePrintf("Clone %s %d\n", save.name, save.size); return new DSSaveFile(&save, saveCompressed, saveData); } -void DSSaveFileManager::deleteFile(const char* name) { +void DSSaveFileManager::deleteFile(const char *name) { // consolePrintf("Deleting %s", name); for (int r = 0; r < 8; r++) { if (gbaSave[r].isValid() && (gbaSave[r].matches(name))) { @@ -506,7 +506,7 @@ void DSSaveFileManager::setExtraData(int data) { // Offset of extra data is 31. This overlaps the padding and reserved bytes of the first save entry. // which have not been used up until now. So it should be safe. - vu8* sram = CART_RAM + 31; + vu8 *sram = CART_RAM + 31; *(sram + 0) = 0xF0; // This is an identifier to check *(sram + 1) = 0x0D; // that extra data is present. @@ -518,14 +518,14 @@ void DSSaveFileManager::setExtraData(int data) { } bool DSSaveFileManager::isExtraDataPresent() { - vu8* sram = CART_RAM + 31; + vu8 *sram = CART_RAM + 31; // Check for the identifier return ((*(sram + 0) == 0xF0) && (*(sram + 1) == 0x0D)); } int DSSaveFileManager::getExtraData() { - vu8* sram = CART_RAM + 31; + vu8 *sram = CART_RAM + 31; if (isExtraDataPresent()) { int value = (*(sram + 2) << 24) | (*(sram + 3) << 16) | (*(sram + 4) << 8) | (*(sram + 5)); diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h index e74df94952..7b17acb52a 100644 --- a/backends/platform/ds/arm9/source/ramsave.h +++ b/backends/platform/ds/arm9/source/ramsave.h @@ -48,15 +48,15 @@ class DSSaveFile : public Common::InSaveFile, public Common::OutSaveFile { } __attribute__ ((packed)); SCUMMSave save; - u8* saveData; - SCUMMSave* origHeader; + u8 *saveData; + SCUMMSave *origHeader; bool isOpenFlag; bool isTempFile; bool eosReached; public: DSSaveFile(); - DSSaveFile(SCUMMSave* s, bool saveCompressed, u8* data); + DSSaveFile(SCUMMSave *s, bool saveCompressed, u8 *data); ~DSSaveFile(); void reset(); @@ -74,7 +74,7 @@ public: uint32 write(const void *buf, uint32 size); void setName(char *name); - char* getName() { return save.name; } + char *getName() { return save.name; } bool isValid() { return save.isValid; } bool isTemp() { return isTempFile; } @@ -85,14 +85,14 @@ public: void compress(); int getRamUsage() { return sizeof(save) + save.compressedSize; } - char* getRamImage() { return (char *) &save; } + char *getRamImage() { return (char *) &save; } int getSize() { return save.size; } - DSSaveFile* clone(); + DSSaveFile *clone(); - bool loadFromSaveRAM(vu8* address); - int saveToSaveRAM(vu8* address); + bool loadFromSaveRAM(vu8 *address); + int saveToSaveRAM(vu8 *address); @@ -111,19 +111,19 @@ public: class DSSaveFileManager : public Common::SaveFileManager { DSSaveFile gbaSave[8]; - static DSSaveFileManager* instancePtr; + static DSSaveFileManager *instancePtr; int sramBytesFree; public: DSSaveFileManager(); ~DSSaveFileManager(); - static DSSaveFileManager* instance() { return instancePtr; } + static DSSaveFileManager *instance() { return instancePtr; } DSSaveFile *openSavefile(const char *filename, bool saveOrLoad); - virtual Common::OutSaveFile* openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } - virtual Common::InSaveFile* openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } + virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } + virtual Common::InSaveFile *openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } virtual bool removeSavefile(const Common::String &filename); virtual Common::StringArray listSavefiles(const Common::String &pattern); @@ -133,7 +133,7 @@ public: void addBytesFree(int size) { sramBytesFree += size; } int getBytesFree() { return sramBytesFree; } - void deleteFile(char* name); + void deleteFile(char *name); void listFiles(); void formatSram(); diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index ef931899be..32d7f1aee0 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -142,7 +142,7 @@ int keyboardY; static int s_mapBase; static int s_tileBase; -u16* baseAddress; +u16 *baseAddress; bool shiftState; bool capsLockState; @@ -181,7 +181,7 @@ void drawText(int tx, int ty, const char *string, bool highlight) { -void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) { +void restoreVRAM(int tileBase, int mapBase, u16 *saveSpace) { /* for (int r = 0; r < 32 * 32; r++) { ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++; } @@ -191,7 +191,7 @@ void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) { }*/ } -void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { +void drawKeyboard(int tileBase, int mapBase, u16 *saveSpace) { /* int keyboardDataSize = 4736 * 2; */ for (int r = 0; r < 32 * 32; r++) { @@ -211,8 +211,8 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { // this is the font for (int tile = 0; tile < 94; tile++) { - u16* tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32))); - const u8* src = ((const u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; + u16 *tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32))); + const u8 *src = ((const u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; for (int y = 0 ; y < 8; y++) { for (int x = 0; x < 2; x++) { @@ -256,7 +256,7 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { int x = keyboardX; int y = keyboardY; - u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase)); + u16 *base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase)); baseAddress = base; for (int r = 0; r < DS_NUM_KEYS; r++) { @@ -314,7 +314,7 @@ bool getKeyboardClosed() { } void setKeyHighlight(int key, bool highlight) { - u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::s_mapBase)); + u16 *base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::s_mapBase)); if (highlight) { base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x] |= 0x1000; @@ -329,7 +329,7 @@ void setKeyHighlight(int key, bool highlight) { } } -void addAutoComplete(const char* word) { +void addAutoComplete(const char *word) { if (autoCompleteCount == NUM_WORDS) return; strcpy(&autoCompleteWord[autoCompleteCount++][0], word); drawAutoComplete(); @@ -353,7 +353,7 @@ void clearAutoComplete() { void typeCompletion(int current) { Common::Event event; - /* OSystem_DS* system = OSystem_DS::instance(); */ + /* OSystem_DS *system = OSystem_DS::instance(); */ strcat(autoCompleteBuffer, &autoCompleteWord[current][charactersEntered]); strcat(autoCompleteBuffer, " "); @@ -384,7 +384,7 @@ void typeCompletion(int current) { void updateTypeEvents() { if (autoCompleteBuffer[0] != '\0') { Common::Event event; - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); event.kbd.keycode = (Common::KeyCode) autoCompleteBuffer[0]; event.kbd.ascii = autoCompleteBuffer[0]; @@ -443,7 +443,7 @@ void releaseAllKeys() { if (keys[r].pressed) { DS::setKeyHighlight(r, false); - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; createKeyEvent(r, event); @@ -502,7 +502,7 @@ void addKeyboardEvents() { for (int r = 0; r < DS_NUM_KEYS; r++) { if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) && (ty >= keys[r].y) && (ty <= keys[r].y + 1)) { - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; // consolePrintf("Key: %d\n", r); @@ -551,7 +551,7 @@ void addKeyboardEvents() { if (keys[r].pressed) { DS::setKeyHighlight(r, false); - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; if ((keys[r].character == Common::KEYCODE_INVALID)) { diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index 33dab253a9..0b4495ec39 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -35,13 +35,13 @@ enum { void createKeyEvent(int keyNum, Common::Event& event); -void drawKeyboard(int tileBase, int mapBase, u16* saveSpace); -void restoreVRAM(int tileBase, int mapBase, u16* saveSpace); +void drawKeyboard(int tileBase, int mapBase, u16 *saveSpace); +void restoreVRAM(int tileBase, int mapBase, u16 *saveSpace); void addKeyboardEvents(); bool getKeyboardClosed(); bool isInsideKeyboard(int x, int y); -void addAutoComplete(const char* word); +void addAutoComplete(const char *word); void clearAutoComplete(); void setCharactersEntered(int count); void releaseAllKeys(); diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp index 035f6a631d..bc734f3f85 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.cpp +++ b/backends/platform/ds/arm9/source/wordcompletion.cpp @@ -14,7 +14,7 @@ namespace DS { char wordBuffer[WORD_BUFFER_SIZE]; int wordBufferPos = 0; -char* wordBufferPtr[MAX_WORD_COUNT]; +char *wordBufferPtr[MAX_WORD_COUNT]; int wordBufferPtrPos = 0; void addAutoCompleteLine(const char *line) { @@ -53,7 +53,7 @@ void addAutoCompleteLine(const char *line) { } } -int stringCompare(const void* a, const void* b) { +int stringCompare(const void *a, const void *b) { const char** as = (const char **) a; const char** bs = (const char **) b; @@ -71,7 +71,7 @@ void sortAutoCompleteWordList() { } // Sends the current available words to the virtual keyboard code for display -bool findWordCompletions(const char* input) { +bool findWordCompletions(const char *input) { int min = 0; int max = wordBufferPtrPos - 1; char *word; @@ -82,7 +82,7 @@ bool findWordCompletions(const char* input) { if (wordBufferPtrPos == 0) return false; - OSystem_DS* system = (OSystem_DS *) g_system; + OSystem_DS *system = (OSystem_DS *) g_system; system->clearAutoComplete(); int start = 0; diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index fd6da4e9b9..dd9ac35990 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -28,7 +28,7 @@ ZipFile::ZipFile() { // consolePrintf("ZIP file check..."); - char* p = (char *) ZF_SEARCH_START; + char *p = (char *) ZF_SEARCH_START; bool found = false; _zipFile = NULL; @@ -112,7 +112,7 @@ bool ZipFile::currentFileInFolder() { return false; } -void ZipFile::getFileName(char* name) { +void ZipFile::getFileName(char *name) { strncpy(name, (char *) (_currentFile + 1), _currentFile->nameLength); for (int r = 0; name[r] != 0; r++) { @@ -207,7 +207,7 @@ void ZipFile::changeToRoot() { _directory[0] = 0; } -void ZipFile::changeDirectory(const char* dir) { +void ZipFile::changeDirectory(const char *dir) { // consolePrintf("Current dir now '%s'\n", dir); assert(dir && *dir); diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h index d1f70942ce..5438c3b95d 100644 --- a/backends/platform/ds/arm9/source/zipreader.h +++ b/backends/platform/ds/arm9/source/zipreader.h @@ -43,12 +43,12 @@ class ZipFile { u16 extraLength; // Length of any extra data } __attribute__ ((packed)); - char* _zipFile; + char *_zipFile; char _directory[128]; bool _allFilesVisible; - FileHeader* _currentFile; + FileHeader *_currentFile; public: ZipFile(); @@ -61,13 +61,13 @@ public: bool findFile(const char *search); // These return the file's data and information - char* getFile(); + char *getFile(); int getFileSize(); - void getFileName(char* name); + void getFileName(char *name); bool isDirectory(); // These set the current directory - void changeDirectory(const char* name); + void changeDirectory(const char *name); void changeToRoot(); void setAllFilesVisible(bool state) { _allFilesVisible = state; } diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h index f41548f400..c762d1acd1 100644 --- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h +++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h @@ -58,9 +58,9 @@ typedef struct sTransferSound { typedef struct _adpcmBuffer { - u8* buffer[8]; + u8 *buffer[8]; bool filled[8]; - u8* arm7Buffer[8]; + u8 *arm7Buffer[8]; bool arm7Dirty[8]; bool semaphore; } adpcmBuffer; -- cgit v1.2.3 From 3d44870c8a64999e5464fc3b09c08f9378c4a2d3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:11:11 +0000 Subject: NDS: Update GPL/copyright headers; add namespace DS closing comments svn-id: r50689 --- backends/fs/ds/ds-fs.cpp | 9 ++++--- backends/fs/ds/ds-fs.h | 11 +++++---- backends/platform/ds/arm7/source/main.cpp | 10 ++++---- backends/platform/ds/arm9/source/blitters.cpp | 11 +++++---- backends/platform/ds/arm9/source/blitters.h | 11 +++++---- backends/platform/ds/arm9/source/cdaudio.cpp | 11 +++++---- backends/platform/ds/arm9/source/cdaudio.h | 11 +++++---- backends/platform/ds/arm9/source/dsmain.cpp | 12 ++++++---- backends/platform/ds/arm9/source/dsmain.h | 12 ++++++---- backends/platform/ds/arm9/source/dsoptions.cpp | 12 ++++++---- backends/platform/ds/arm9/source/dsoptions.h | 11 +++++---- backends/platform/ds/arm9/source/gbampsave.cpp | 9 ++++--- backends/platform/ds/arm9/source/gbampsave.h | 9 ++++--- backends/platform/ds/arm9/source/keys.cpp | 3 ++- backends/platform/ds/arm9/source/keys.h | 25 ++++++++++++++++++- backends/platform/ds/arm9/source/osystem_ds.h | 9 ++++--- backends/platform/ds/arm9/source/portdefs.cpp | 9 ++++--- backends/platform/ds/arm9/source/portdefs.h | 9 ++++--- backends/platform/ds/arm9/source/ramsave.h | 9 ++++--- backends/platform/ds/arm9/source/scummhelp.cpp | 12 ++++++---- backends/platform/ds/arm9/source/scummhelp.h | 12 ++++++---- backends/platform/ds/arm9/source/touchkeyboard.cpp | 3 +-- backends/platform/ds/arm9/source/touchkeyboard.h | 11 +++++---- .../platform/ds/arm9/source/wordcompletion.cpp | 28 +++++++++++++++++++++- backends/platform/ds/arm9/source/wordcompletion.h | 27 ++++++++++++++++++++- backends/platform/ds/arm9/source/zipreader.cpp | 9 ++++--- backends/platform/ds/arm9/source/zipreader.h | 9 ++++--- 27 files changed, 229 insertions(+), 85 deletions(-) diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 8dc3902216..600eae1972 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index b4c8f7ac12..b1df3a98eb 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -224,6 +227,6 @@ void std_clearerr(FILE *handle); int std_fflush(FILE *handle); int std_ferror(FILE *handle); -} //namespace DS +} // End of namespace DS #endif //_DS_FS_H diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp index b45b601bda..bcaaf8e936 100644 --- a/backends/platform/ds/arm7/source/main.cpp +++ b/backends/platform/ds/arm7/source/main.cpp @@ -8,17 +8,19 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * - * $Header: /cvsroot/scummvm/scummvm/backends/fs/fs.cpp,v 1.3.2.1 2004/12/18 02:33:52 fingolfin Exp $ */ ////////////////////////////////////////////////////////////////////// diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp index fa746fa51e..559845cb18 100644 --- a/backends/platform/ds/arm9/source/blitters.cpp +++ b/backends/platform/ds/arm9/source/blitters.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -409,4 +412,4 @@ void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStr } } -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h index 60dc2af133..88506a4405 100644 --- a/backends/platform/ds/arm9/source/blitters.h +++ b/backends/platform/ds/arm9/source/blitters.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -35,7 +38,7 @@ void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height); void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette); void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride); -} +} // End of namespace DS #else diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 23a276c4cb..28d9819991 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -548,4 +551,4 @@ bool isPlaying() { } } -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/cdaudio.h b/backends/platform/ds/arm9/source/cdaudio.h index aac303dd5e..6e53ef7bd2 100644 --- a/backends/platform/ds/arm9/source/cdaudio.h +++ b/backends/platform/ds/arm9/source/cdaudio.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -35,6 +38,6 @@ bool isPlaying(); void update(); } -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 2f0d5e34ee..698960bb9f 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -3327,7 +3330,8 @@ int main(void) { return 0; } -} +} // End of namespace DS + int main() { DS::main(); diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 7cf8313391..89b8c708b7 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -154,7 +157,8 @@ void* fastRamAlloc(int size); void exitGame(); -} +} // End of namespace DS + int cygprofile_getHBlanks(); diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index d8b2365c4f..32b37abfbc 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -438,4 +441,5 @@ void setOptions() { firstLoad = false; } -} +} // End of namespace DS + diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h index 48eb2c3303..1bdc7c1f27 100644 --- a/backends/platform/ds/arm9/source/dsoptions.h +++ b/backends/platform/ds/arm9/source/dsoptions.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -78,6 +81,6 @@ protected: extern void showOptionsDialog(); extern void setOptions(); -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index d07e6c87fa..dbcc310fa3 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index 19a9a41938..fd16b72e4c 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp index 63fae866e5..8c97b02716 100644 --- a/backends/platform/ds/arm9/source/keys.cpp +++ b/backends/platform/ds/arm9/source/keys.cpp @@ -148,4 +148,5 @@ uint32 keysUp(void) { } -} // namespace ds +} // End of namespace DS + diff --git a/backends/platform/ds/arm9/source/keys.h b/backends/platform/ds/arm9/source/keys.h index e0f28a12cf..0068dfeeb6 100644 --- a/backends/platform/ds/arm9/source/keys.h +++ b/backends/platform/ds/arm9/source/keys.h @@ -1,4 +1,27 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ namespace DS { @@ -10,4 +33,4 @@ uint32 keysDownRepeat(void); void keysSetRepeat( u8 setDelay, u8 setRepeat ); uint32 keysUp(void); -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index 42419b762e..a899c966fc 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/portdefs.cpp b/backends/platform/ds/arm9/source/portdefs.cpp index b75683df3d..fd7056a260 100644 --- a/backends/platform/ds/arm9/source/portdefs.cpp +++ b/backends/platform/ds/arm9/source/portdefs.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 2590758c86..3b3925abba 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h index 7b17acb52a..066f7c332c 100644 --- a/backends/platform/ds/arm9/source/ramsave.h +++ b/backends/platform/ds/arm9/source/ramsave.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp index e1ddaecc2c..f1e8ba4fb2 100644 --- a/backends/platform/ds/arm9/source/scummhelp.cpp +++ b/backends/platform/ds/arm9/source/scummhelp.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -91,7 +94,8 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, } -} +} // End of namespace DS + #undef ADD_BIND diff --git a/backends/platform/ds/arm9/source/scummhelp.h b/backends/platform/ds/arm9/source/scummhelp.h index 602cb5f788..4be28dca6a 100644 --- a/backends/platform/ds/arm9/source/scummhelp.h +++ b/backends/platform/ds/arm9/source/scummhelp.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -31,6 +34,7 @@ namespace DS { void updateStrings(byte gameId, byte version, Common::Platform platform, int page, Common::String &title, Common::String *&key, Common::String *&dsc); -} +} // End of namespace DS + #endif diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 32d7f1aee0..ce3e2416af 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -586,5 +586,4 @@ void addKeyboardEvents() { } -} - +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index 0b4495ec39..7644e48bff 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -46,6 +49,6 @@ void clearAutoComplete(); void setCharactersEntered(int count); void releaseAllKeys(); -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp index bc734f3f85..43a16486c5 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.cpp +++ b/backends/platform/ds/arm9/source/wordcompletion.cpp @@ -1,3 +1,28 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + #include "wordcompletion.h" #include "osystem_ds.h" #include "engines/agi/agi.h" // Caution for #define for NUM_CHANNELS, causes problems in mixer_intern.h @@ -176,5 +201,6 @@ bool findWordCompletions(const char *input) { } -} +} // End of namespace DS + #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.h b/backends/platform/ds/arm9/source/wordcompletion.h index e50bade37b..55a0bc8b5a 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.h +++ b/backends/platform/ds/arm9/source/wordcompletion.h @@ -1,3 +1,28 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + namespace DS { extern void clearAutoCompleteWordList(); @@ -5,4 +30,4 @@ extern bool findWordCompletions(const char *input); extern void addAutoCompleteLine(const char *line); extern void sortAutoCompleteWordList(); -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index dd9ac35990..24458781af 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h index 5438c3b95d..bfba920401 100644 --- a/backends/platform/ds/arm9/source/zipreader.h +++ b/backends/platform/ds/arm9/source/zipreader.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ -- cgit v1.2.3 From 782e43591a6eb5995036bebf2dcc2c871e4aed95 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:11:34 +0000 Subject: DS: Cleanup NDS portdefs.h a bit * Don't #include "nds/ndstypes.h" everywhere * Don't #define ITCM_DATA globally, it is only need in one place * Fix STREAM_AUDIO_FROM_DISK definition (copy&paste error) * Fix custom assert() implementation by using the do/while(0) trick for macros. Previously, there could be subtle errors caused by statements like if (COND) assert(...) else ... svn-id: r50690 --- backends/platform/ds/arm9/source/dsmain.cpp | 2 ++ backends/platform/ds/arm9/source/portdefs.h | 35 ++++++-------------------- backends/platform/ds/arm9/source/ramsave.h | 2 ++ backends/platform/ds/arm9/source/zipreader.cpp | 1 + backends/platform/ds/arm9/source/zipreader.h | 4 ++- 5 files changed, 16 insertions(+), 28 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 698960bb9f..163ae9518d 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -2834,6 +2834,8 @@ bool getIndyFightState() { /////////////////// #define FAST_RAM_SIZE (24000) +#define ITCM_DATA __attribute__((section(".itcm"))) + u8 *fastRamPointer; u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA; diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 3b3925abba..bdb42993d1 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -26,24 +26,8 @@ #ifndef _PORTDEFS_H_ #define _PORTDEFS_H_ - - -/* -typedef unsigned char u8; -typedef signed char s8; - -typedef unsigned short u16; -typedef signed short s16; - -typedef unsigned int u32; -typedef signed int s32; -*/ - -#include "nds/ndstypes.h" - - -// Somebody removed these from scummsys.h, but they're still required, so I'm adding them here -// in the hope that they'll stay. +// Somebody removed these from scummsys.h, but they're still required, so I'm +// adding them here in the hope that they'll stay. #include #include #include @@ -53,8 +37,6 @@ typedef signed int s32; #define double float -#define CT_NO_TRANSPARENCY - #ifndef DISABLE_TEXT_CONSOLE #define DISABLE_TEXT_CONSOLE #endif @@ -63,15 +45,12 @@ typedef signed int s32; #define DISABLE_COMMAND_LINE #endif -#ifndef DISABLE_COMMAND_LINE +#ifndef STREAM_AUDIO_FROM_DISK #define STREAM_AUDIO_FROM_DISK #endif -//#undef assert -//#define assert(expr) consolePrintf("Asserted!") #define NO_DEBUG_MSGS - // This is defined in dsmain.cpp #ifdef __cplusplus extern "C" { @@ -86,15 +65,17 @@ void consolePrintf(const char *format, ...); #undef assert #endif -#define assert(s) if (!(s)) consolePrintf("Assertion failed: '##s##' at file %s, line %d\n", __FILE__, __LINE__) +#define assert(s) \ + do { \ + if (!(s)) \ + consolePrintf("Assertion failed: '##s##' at file %s, line %d\n", __FILE__, __LINE__); \ + } while (0) //#include "ds-fs.h" //#define debug(fmt, ...) consolePrintf(fmt, ##__VA_ARGS__) //#define debug(fmt, ...) debug(0, fmt, ##__VA_ARGS__) -#define ITCM_DATA __attribute__((section(".itcm"))) - // FIXME: Since I can't change the engine at the moment (post lockdown) this define can go here. // This define changes the mouse-relative motion which doesn't make sense on a touch screen to // a more conventional form of input where the menus can be clicked on. diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h index 066f7c332c..f2cfe0fc0b 100644 --- a/backends/platform/ds/arm9/source/ramsave.h +++ b/backends/platform/ds/arm9/source/ramsave.h @@ -26,9 +26,11 @@ #ifndef _RAMSAVE_H_ #define _RAMSAVE_H_ +#include #include "common/system.h" #include "common/savefile.h" + // SaveFileManager class #define DS_MAX_SAVE_SIZE 150000 diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index 24458781af..0906123436 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -24,6 +24,7 @@ */ +#include "common/scummsys.h" #include "zipreader.h" ZipFile::ZipFile() { diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h index bfba920401..5429954088 100644 --- a/backends/platform/ds/arm9/source/zipreader.h +++ b/backends/platform/ds/arm9/source/zipreader.h @@ -25,7 +25,9 @@ #ifndef _ZIPREADER_H_ #define _ZIPREADER_H_ -#include "portdefs.h" + +#include + #define ZF_SEARCH_START 0x08000000 #define ZF_SEARCH_END 0x09000000 #define ZF_SEARCH_STRIDE 16 -- cgit v1.2.3 From d2a24c0a9535f1e51c25610de806beeb092b1ec5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:11:54 +0000 Subject: DS: Remove unused portdefs.cpp svn-id: r50691 --- backends/platform/ds/arm9/makefile | 5 +--- backends/platform/ds/arm9/source/portdefs.cpp | 38 --------------------------- backends/platform/ds/module.mk | 1 - 3 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 backends/platform/ds/arm9/source/portdefs.cpp diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 295b5f1bf0..d1b1cf55d6 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -247,9 +247,6 @@ endif DEFINES += -DREDUCE_MEMORY_USAGE -# Removed, as these are done in portdefs.h -# -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE - LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections ifdef WRAP_MALLOC @@ -294,7 +291,7 @@ endif PORT_OBJS := $(portdir)/source/blitters_arm.o $(portdir)/source/cdaudio.o $(portdir)/source/dsmain.o \ $(portdir)/../../../fs/ds/ds-fs.o $(portdir)/source/gbampsave.o $(portdir)/source/scummhelp.o\ - $(portdir)/source/osystem_ds.o $(portdir)/source/portdefs.o $(portdir)/source/ramsave.o\ + $(portdir)/source/osystem_ds.o $(portdir)/source/ramsave.o\ $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ $(portdir)/source/dsoptions.o $(portdir)/source/keys.o $(portdir)/source/wordcompletion.o\ $(portdir)/source/interrupt.o diff --git a/backends/platform/ds/arm9/source/portdefs.cpp b/backends/platform/ds/arm9/source/portdefs.cpp deleted file mode 100644 index fd7056a260..0000000000 --- a/backends/platform/ds/arm9/source/portdefs.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include "nds/dma.h" -#include "osystem_ds.h" - -/* -extern "C" time_t __wrap_time(time_t *t) { - if (t) { - *t = OSystem_DS::instance()->getMillis() / 1000; - } - - return OSystem_DS::instance()->getMillis() / 1000; -} -*/ diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index d70b5b1bab..02ae0759d4 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -12,7 +12,6 @@ PORT_OBJS := \ arm9/source/gbampsave.o \ arm9/source/scummhelp.o \ arm9/source/osystem_ds.o \ - arm9/source/portdefs.o \ arm9/source/ramsave.o \ arm9/source/touchkeyboard.o \ arm9/source/zipreader.o \ -- cgit v1.2.3 From edb5210d382d27c31cca0a48a427735044078ba4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:12:10 +0000 Subject: DS: Fix error in std_fopen (warnings are great :) svn-id: r50692 --- backends/fs/ds/ds-fs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 600eae1972..8b921e7cd9 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -582,7 +582,7 @@ FILE *std_fopen(const char *name, const char *mode) { if (currentDir[0] != 0) { char nameWithPath[128]; - sprintf(nameWithPath, "%s\%s", currentDir, realName); + sprintf(nameWithPath, "%s\\%s", currentDir, realName); strcpy(realName, nameWithPath); } -- cgit v1.2.3 From 75529dc4022ec52ffba971d532c397aa951c2d5c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:12:31 +0000 Subject: DS: Fix various warnings and errors in the DS FS code * Do not modify the strings passed to std_fopen anymore * Correct signature of std_fread * Do not cast away constness, nor perform unnecessary casts svn-id: r50693 --- backends/fs/ds/ds-fs.cpp | 48 +++++++++++++++------------- backends/fs/ds/ds-fs.h | 8 ++--- backends/platform/ds/arm9/source/cdaudio.cpp | 8 ++--- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 8b921e7cd9..fafdc8502e 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -181,10 +181,10 @@ AbstractFSNode *DSFileSystemNode::getParent() const { DSFileSystemNode *p; if (_path != "ds:/") { - char *path = (char *) _path.c_str(); + const char *path = (const char *)_path.c_str(); int lastSlash = 4; - for (int r = 4; r < (int) _path.size(); r++) { + for (uint r = 4; r < _path.size(); r++) { if (path[r] == '\\') { lastSlash = r; } @@ -262,7 +262,7 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path) { _path = path; } -GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDirectory) { +GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDir) { //consolePrintf("'%s'",path.c_str()); int lastSlash = 3; @@ -275,7 +275,7 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDire _displayName = Common::String(path.c_str() + lastSlash + 1); _path = path; _isValid = true; - _isDirectory = isDirectory; + _isDirectory = isDir; } @@ -356,10 +356,10 @@ AbstractFSNode *GBAMPFileSystemNode::getParent() const { GBAMPFileSystemNode *p; if (_path != "mp:/") { - char *path = (char *) _path.c_str(); + const char *path = (const char *)_path.c_str(); int lastSlash = 4; - for (int r = 4; r < (int) strlen((char *) path); r++) { + for (uint r = 4; r < strlen(path); r++) { if (path[r] == '/') { lastSlash = r; } @@ -447,7 +447,7 @@ uint32 DSFileStream::read(void *ptr, uint32 len) { if (_writeBufferPos > 0) { flush(); } - return std_fread((byte *)ptr, 1, len, (FILE *)_handle); + return std_fread(ptr, 1, len, (FILE *)_handle); } uint32 DSFileStream::write(const void *ptr, uint32 len) { @@ -501,15 +501,15 @@ FILE *std_fopen(const char *name, const char *mode) { currentDir[0] = '\0'; } - char *realName = (char *) name; + char realName[MAXPATHLEN]; // Remove file system prefix if ((name[0] == 'd') && (name[1] == 's') && (name[2] == ':') && (name[3] == '/')) { - realName += 4; - } - - if ((name[0] == 'm') && (name[1] == 'p') && (name[2] == ':') && (name[3] == '/')) { - realName += 4; + strlcpy(realName, name + 4, MAXPATHLEN); + } else if ((name[0] == 'm') && (name[1] == 'p') && (name[2] == ':') && (name[3] == '/')) { + strlcpy(realName, name + 4, MAXPATHLEN); + } else { + strlcpy(realName, name, MAXPATHLEN); } // consolePrintf("Open file:"); @@ -521,7 +521,8 @@ FILE *std_fopen(const char *name, const char *mode) { // Turn all back slashes into forward slashes for gba_nds_fat char *p = realName; while (*p) { - if (*p == '\\') *p = '/'; + if (*p == '\\') + *p = '/'; p++; } @@ -535,7 +536,7 @@ FILE *std_fopen(const char *name, const char *mode) { } // MT_memoryReport(); - return (FILE *) result; + return (FILE *)result; } // Fail to open file for writing. It's in ROM! @@ -550,10 +551,10 @@ FILE *std_fopen(const char *name, const char *mode) { #ifdef GBA_SRAM_SAVE if (strchr(mode, 'w')) { // consolePrintf("Writing %s\n", realName); - s_handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, true); + s_handle[r].sramFile = DSSaveFileManager::instance()->openSavefile(realName, true); } else { // consolePrintf("Reading %s\n", realName); - s_handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false); + s_handle[r].sramFile = DSSaveFileManager::instance()->openSavefile(realName, false); } #endif @@ -593,7 +594,7 @@ FILE *std_fopen(const char *name, const char *mode) { zip->setAllFilesVisible(false); // Allocate a file handle - int r = 0; + r = 0; while (s_handle[r].used) r++; @@ -626,13 +627,13 @@ void std_fclose(FILE *handle) { } } -size_t std_fread(const void *ptr, size_t size, size_t numItems, FILE *handle) { +size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { // consolePrintf("fread %d,%d %d ", size, numItems, ptr); if (DS::isGBAMPAvailable()) { readPastEndOfFile = false; - int bytes = FAT_fread((void *) ptr, size, numItems, (FAT_FILE *) handle); + int bytes = FAT_fread(ptr, size, numItems, (FAT_FILE *) handle); if (!FAT_feof((FAT_FILE *) handle)) { return numItems; } else { @@ -665,14 +666,15 @@ size_t std_fread(const void *ptr, size_t size, size_t numItems, FILE *handle) { // consolePrintf("read %d ", size * numItems); - memcpy((void *) ptr, handle->data + handle->pos, size * numItems); + memcpy(ptr, handle->data + handle->pos, size * numItems); handle->pos += size * numItems; return numItems; } size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle) { - if ((handle == stdin)) return 0; + if ((handle == stdin)) + return 0; if ((handle == stderr) || (handle == stdout)) { // consolePrintf((char *) ptr); @@ -682,7 +684,7 @@ size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle) { //consolePrintf("fwrite size=%d\n", size * numItems); if (DS::isGBAMPAvailable()) { - FAT_fwrite(((char *) (ptr)), size, numItems, (FAT_FILE *) handle); + FAT_fwrite(ptr, size, numItems, (FAT_FILE *) handle); return numItems; int length = size * numItems; diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index b1df3a98eb..ee4afe60f3 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -209,16 +209,16 @@ public: #undef stdout #undef stdin -#define stdout ((DS::fileHandle*) -1) -#define stderr ((DS::fileHandle*) -2) -#define stdin ((DS::fileHandle*) -3) +#define stdout ((DS::fileHandle *) -1) +#define stderr ((DS::fileHandle *) -2) +#define stdin ((DS::fileHandle *) -3) #define FILE DS::fileHandle // Please do not remove any of these prototypes that appear not to be required. FILE* std_fopen(const char *name, const char *mode); void std_fclose(FILE *handle); -size_t std_fread(const void *ptr, size_t size, size_t numItems, FILE *handle); +size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle); size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle); bool std_feof(FILE *handle); long int std_ftell(FILE *handle); diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 28d9819991..66fbef6cdc 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -162,7 +162,7 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { } - DS::std_fread((const void *) &waveHeader, sizeof(waveHeader), 1, file); + DS::std_fread(&waveHeader, sizeof(waveHeader), 1, file); consolePrintf("File: %s\n", fname.c_str()); @@ -186,11 +186,11 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { // Skip chunks until we reach the data chunk chunkHeader chunk; - DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, file); while (!((chunk.name[0] == 'd') && (chunk.name[1] == 'a') && (chunk.name[2] == 't') && (chunk.name[3] == 'a'))) { DS::std_fseek(file, chunk.size, SEEK_CUR); - DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, file); } dataChunkStart = DS::std_ftell(file); @@ -266,7 +266,7 @@ void decompressBlock() { do { - DS::std_fread((const void *) &blockHeader, sizeof(blockHeader), 1, file); + DS::std_fread(&blockHeader, sizeof(blockHeader), 1, file); DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, file); -- cgit v1.2.3 From 776c3a1d519838910732ab31b81b11cc5d122c88 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 16:12:47 +0000 Subject: DS: Fix MODULE_DIRS value (now dependency tracking works correctly) svn-id: r50694 --- backends/platform/ds/module.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index 02ae0759d4..e3c18c7174 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -109,12 +109,12 @@ $(MODULE)/arm9/source/touchkeyboard.o: \ MODULE_DIRS += \ - backends/platform/ds \ - backends/platform/ds/arm7/source \ - backends/platform/ds/arm7/source/libcartreset \ - backends/platform/ds/arm9/source \ - backends/platform/ds/arm9/source/fat \ - backends/platform/ds/arm9/source/libcartreset + backends/platform/ds/ \ + backends/platform/ds/arm7/source/ \ + backends/platform/ds/arm7/source/libcartreset/ \ + backends/platform/ds/arm9/source/ \ + backends/platform/ds/arm9/source/fat/ \ + backends/platform/ds/arm9/source/libcartreset/ # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) -- cgit v1.2.3 From 68d620ccab1be965c8b0f7373cb1280e11244139 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 19:10:20 +0000 Subject: DS: Fix warnings, make some vars static, cleanup svn-id: r50701 --- backends/fs/ds/ds-fs.cpp | 16 ++--- backends/fs/ds/ds-fs.h | 4 +- backends/platform/ds/arm9/source/cdaudio.cpp | 82 ++++++++++++------------- backends/platform/ds/arm9/source/dsmain.cpp | 3 +- backends/platform/ds/arm9/source/gbampsave.cpp | 54 ++++++++-------- backends/platform/ds/arm9/source/osystem_ds.cpp | 2 +- 6 files changed, 78 insertions(+), 83 deletions(-) diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index fafdc8502e..43203eed54 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -416,18 +416,12 @@ bool DSFileStream::eos() const { } int32 DSFileStream::pos() const { - if (_writeBufferPos > 0) { - // Discard constness. Bad, but I can't see another way. - ((DSFileStream *) (this))->flush(); - } + assert(_writeBufferPos == 0); // This method may only be called when reading! return std_ftell((FILE *)_handle); } int32 DSFileStream::size() const { - if (_writeBufferPos > 0) { - // Discard constness. Bad, but I can't see another way. - ((DSFileStream *) (this))->flush(); - } + assert(_writeBufferPos == 0); // This method may only be called when reading! int32 oldPos = std_ftell((FILE *)_handle); std_fseek((FILE *)_handle, 0, SEEK_END); int32 length = std_ftell((FILE *)_handle); @@ -659,10 +653,10 @@ size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { return bytes / size; } - if ((int)(handle->pos + size * numItems) > handle->size) { + if (handle->pos > handle->size) + numItems = 0; + else if ((int)(handle->pos + size * numItems) > handle->size) numItems = (handle->size - handle->pos) / size; - if (numItems < 0) numItems = 0; - } // consolePrintf("read %d ", size * numItems); diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index ee4afe60f3..fadfb8a40d 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -173,7 +173,9 @@ struct fileHandle { class DSFileStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable { protected: - static const int WRITE_BUFFER_SIZE = 512; + enum { + WRITE_BUFFER_SIZE = 512 + }; /** File handle to the actual file. */ void *_handle; diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 66fbef6cdc..a5d38cb7e4 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -74,25 +74,25 @@ struct decoderFormat { unsigned char sample[1024]; } __attribute__ ((packed)); -bool active = false; -WaveHeader waveHeader; -Header blockHeader; -FILE *file; -int fillPos; -bool isPlayingFlag = false; - -s16 *audioBuffer; -u32 sampleNum; -s16 *decompressionBuffer; -int numLoops; -int blockCount; -int dataChunkStart; -int blocksLeft; -bool trackStartsAt2 = false; +static bool s_active = false; +static WaveHeader waveHeader; +static Header blockHeader; +static FILE *s_file; +static int fillPos; +static bool isPlayingFlag = false; + +static s16 *audioBuffer; +static u32 sampleNum; +static s16 *decompressionBuffer; +static int s_numLoops; +static int blockCount; +static int dataChunkStart; +static int blocksLeft; +static bool trackStartsAt2 = false; // These are from Microsoft's document on DVI ADPCM -const int stepTab[ 89 ] = { +static const int stepTab[ 89 ] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, @@ -106,7 +106,7 @@ const int stepTab[ 89 ] = { 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 }; -const int indexTab[ 16 ] = { -1, -1, -1, -1, 2, 4, 6, 8, +static const int indexTab[ 16 ] = { -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8 }; void playNextBlock(); @@ -118,11 +118,11 @@ void allocBuffers() { } void setActive(bool active) { - DS::CD::active = active; + s_active = active; } bool getActive() { - return active; + return s_active; } void playTrack(int track, int numLoops, int startFrame, int duration) { @@ -148,21 +148,21 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { sprintf(str, "track%d.wav", track); fname = path + str; - file = DS::std_fopen(fname.c_str(), "rb"); + s_file = DS::std_fopen(fname.c_str(), "rb"); - if (!file) { + if (!s_file) { sprintf(str, "track%02d.wav", track); fname = path + str; - file = DS::std_fopen(fname.c_str(), "rb"); + s_file = DS::std_fopen(fname.c_str(), "rb"); } - if (!file) { + if (!s_file) { consolePrintf("Failed to open %s!\n", path.c_str()); return; } - DS::std_fread(&waveHeader, sizeof(waveHeader), 1, file); + DS::std_fread(&waveHeader, sizeof(waveHeader), 1, s_file); consolePrintf("File: %s\n", fname.c_str()); @@ -174,7 +174,7 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { if ((waveHeader.fmtFormatTag != 17) && (waveHeader.fmtFormatTag != 20)) { consolePrintf("Wave file is in the wrong format! You must use IMA-ADPCM 4-bit mono.\n"); - DS::std_fclose(file); + DS::std_fclose(s_file); return; } @@ -186,14 +186,14 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { // Skip chunks until we reach the data chunk chunkHeader chunk; - DS::std_fread(&chunk, sizeof(chunkHeader), 1, file); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, s_file); while (!((chunk.name[0] == 'd') && (chunk.name[1] == 'a') && (chunk.name[2] == 't') && (chunk.name[3] == 'a'))) { - DS::std_fseek(file, chunk.size, SEEK_CUR); - DS::std_fread(&chunk, sizeof(chunkHeader), 1, file); + DS::std_fseek(s_file, chunk.size, SEEK_CUR); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, s_file); } - dataChunkStart = DS::std_ftell(file); + dataChunkStart = DS::std_ftell(s_file); static bool started = false; @@ -237,14 +237,14 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { // No need to seek if we're starting from the beginning if (block != 0) { - DS::std_fseek(file, dataChunkStart + block * waveHeader.fmtBlockAlign, SEEK_SET); + DS::std_fseek(s_file, dataChunkStart + block * waveHeader.fmtBlockAlign, SEEK_SET); // consolePrintf("Startframe: %d msec: %d (%d,%d)\n", startFrame, tenthssec, samples, block); } //decompressBlock(); playNextBlock(); - DS::CD::numLoops = numLoops; + s_numLoops = numLoops; } void update() { @@ -266,20 +266,20 @@ void decompressBlock() { do { - DS::std_fread(&blockHeader, sizeof(blockHeader), 1, file); + DS::std_fread(&blockHeader, sizeof(blockHeader), 1, s_file); - DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, file); + DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, s_file); - if (DS::std_feof(file) ) { + if (DS::std_feof(s_file)) { // Reached end of file, so loop - if ((numLoops == -1) || (numLoops > 1)) { + if ((s_numLoops == -1) || (s_numLoops > 1)) { // Seek file to first packet - if (numLoops != -1) { - numLoops--; + if (s_numLoops != -1) { + s_numLoops--; } - DS::std_fseek(file, dataChunkStart, SEEK_SET); + DS::std_fseek(s_file, dataChunkStart, SEEK_SET); loop = true; } else { // Fill decompression buffer with zeros to prevent glitching @@ -465,7 +465,7 @@ void playNextBlock() { void stopTrack() { if (!isPlayingFlag) return; - DS::std_fclose(file); + DS::std_fclose(s_file); isPlayingFlag = false; @@ -498,8 +498,8 @@ bool trackExists(int num) { } consolePrintf("Looking for %s...", path.c_str()); - FILE *file; - if ((file = DS::std_fopen(path.c_str(), "r"))) { + FILE *file = DS::std_fopen(path.c_str(), "r"); + if (file) { consolePrintf("Success!\n"); setActive(true); DS::std_fclose(file); diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 163ae9518d..7315c25a43 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -133,8 +133,7 @@ void *operator new (size_t size) { void *res = __real_malloc(size); s_total_malloc += size; - if (!res) - { + if (!res) { // *((u8 *) NULL) = 0; consolePrintf("Failed alloc (new) %d (%d)\n", size, s_total_malloc); return NULL; diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index dbcc310fa3..d0fb8fff3b 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -47,10 +47,10 @@ GBAMPSaveFile::~GBAMPSaveFile() { // consolePrintf("Closed file\n"); } -uint32 GBAMPSaveFile::read(void *buf, uint32 size) { - saveSize += size; -// consolePrintf("Read %d %d ", size, saveSize); - return DS::std_fread(buf, 1, size, handle); +uint32 GBAMPSaveFile::read(void *buf, uint32 length) { + saveSize += length; +// consolePrintf("Read %d %d ", length, saveSize); + return DS::std_fread(buf, 1, length, handle); } bool GBAMPSaveFile::eos() const { @@ -77,27 +77,27 @@ int32 GBAMPSaveFile::pos() const { int32 GBAMPSaveFile::size() const { int position = pos(); DS::std_fseek(handle, 0, SEEK_END); - int size = DS::std_ftell(handle); + int length = DS::std_ftell(handle); DS::std_fseek(handle, position, SEEK_SET); - return size; + return length; } -bool GBAMPSaveFile::seek(int32 pos, int whence) { - return DS::std_fseek(handle, pos, whence) == 0; +bool GBAMPSaveFile::seek(int32 newPos, int whence) { + return DS::std_fseek(handle, newPos, whence) == 0; } -uint32 GBAMPSaveFile::write(const void *buf, uint32 size) { - if (bufferPos + size > SAVE_BUFFER_SIZE) { +uint32 GBAMPSaveFile::write(const void *buf, uint32 length) { + if (bufferPos + length > SAVE_BUFFER_SIZE) { flushSaveBuffer(); - saveSize += size; -// consolePrintf("Writing %d bytes from %x", size, buf); -// DS::std_fwrite(buf, 1, size, handle); + saveSize += length; +// consolePrintf("Writing %d bytes from %x", length, buf); +// DS::std_fwrite(buf, 1, length, handle); - memcpy(buffer + bufferPos, buf, size); - bufferPos += size; + memcpy(buffer + bufferPos, buf, length); + bufferPos += length; - saveSize += size; + saveSize += length; /* int pos = 0; @@ -107,31 +107,31 @@ uint32 GBAMPSaveFile::write(const void *buf, uint32 size) { bufferPos = 512; pos += rest; flushSaveBuffer(); - size -= rest; + length -= rest; // consolePrintf("First section: %d\n", rest); - while (size >= 512) { + while (length >= 512) { DS::std_fwrite(((char *) (buf)) + pos, 1, 512, handle); - size -= 512; + length -= 512; pos += 512; -// consolePrintf("Full chunk, %d left ", size); +// consolePrintf("Full chunk, %d left ", length); } bufferPos = 0; - memcpy(buffer + bufferPos, ((char *) (buf)) + pos, size); - bufferPos += size; + memcpy(buffer + bufferPos, ((char *) (buf)) + pos, length); + bufferPos += length; // consolePrintf("%d left in buffer ", bufferPos);*/ } else { - memcpy(buffer + bufferPos, buf, size); - bufferPos += size; + memcpy(buffer + bufferPos, buf, length); + bufferPos += length; - saveSize += size; + saveSize += length; } -// if ((size > 100) || (size <= 0)) consolePrintf("Write %d bytes\n", size); - return size; +// if ((length > 100) || (length <= 0)) consolePrintf("Write %d bytes\n", length); + return length; } diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 418ab9d006..d750dfbc07 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -463,7 +463,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } void OSystem_DS::updateScreen() { - static int cnt = 0; +// static int cnt = 0; // consolePrintf("updatescr %d\n", cnt++); if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit())) { -- cgit v1.2.3 From 5d25d3821a680ba9dd034595638be8c975de3dd2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 19:10:56 +0000 Subject: DS: Only include NDS/scummvm_ipc.h where necessary; minor tweaks svn-id: r50702 --- backends/platform/ds/arm9/source/dsmain.cpp | 1 + backends/platform/ds/arm9/source/dsmain.h | 1 - backends/platform/ds/arm9/source/touchkeyboard.cpp | 1 + .../platform/ds/commoninclude/NDS/scummvm_ipc.h | 36 ++++++++++------------ backends/platform/ds/ds.mk | 2 +- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 7315c25a43..d1e30b93cd 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -85,6 +85,7 @@ #include #include +#include "NDS/scummvm_ipc.h" #include "dsmain.h" #include "osystem_ds.h" #include "icons_raw.h" diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 89b8c708b7..bd627fa620 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -28,7 +28,6 @@ #include #include "osystem_ds.h" -#include "NDS/scummvm_ipc.h" namespace DS { diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index ce3e2416af..7b5e8c2b52 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -20,6 +20,7 @@ * */ #include +#include "NDS/scummvm_ipc.h" #include "touchkeyboard.h" #include "keyboard_raw.h" #include "keyboard_pal_raw.h" diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h index c762d1acd1..e0cda4d972 100644 --- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h +++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h @@ -33,31 +33,29 @@ ////////////////////////////////////////////////////////////////////// -typedef struct sTransferSoundData { -//--------------------------------------------------------------------------------- - const void *data; - u32 len; - u32 rate; - u8 vol; - u8 pan; - u8 format; - u8 PADDING; -} TransferSoundData, * pTransferSoundData; +typedef struct { + const void *data; + u32 len; + u32 rate; + u8 vol; + u8 pan; + u8 format; + u8 PADDING; +} TransferSoundData; //--------------------------------------------------------------------------------- -typedef struct sTransferSound { -//--------------------------------------------------------------------------------- - TransferSoundData data[16]; - u8 count; - u8 PADDING[3]; -} TransferSound, * pTransferSound; +typedef struct { + TransferSoundData data[16]; + u8 count; + u8 PADDING[3]; +} TransferSound; -typedef struct _adpcmBuffer { +typedef struct { u8 *buffer[8]; bool filled[8]; u8 *arm7Buffer[8]; @@ -97,7 +95,7 @@ typedef struct scummvmTransferRegion { uint16 battery; // battery life ?? hopefully. :) uint16 aux; // i have no idea... - pTransferSound soundData; + TransferSound *soundData; adpcmBuffer adpcm; @@ -127,7 +125,7 @@ typedef struct scummvmTransferRegion { // Streaming sound bool streamFillNeeded[4]; int streamPlayingSection; -} scummTransferRegion, * pscummTransferRegion; +} scummTransferRegion; ////////////////////////////////////////////////////////////////////// diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index d7c7defa3d..c8002a6204 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -1,5 +1,5 @@ # To approximate the DS builds A, B, C, ... run our configure like this -# configure --host=ds --disable-all-engines OPTIONS +# configure --host=ds --disable-translation --disable-all-engines OPTIONS # where OPTIONS is... # build A: --enable-scumm # build B: --enable-sky --enable-queen -- cgit v1.2.3 From 0d317c40a2f2354438dff4b8560da24643283dde Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 5 Jul 2010 19:31:32 +0000 Subject: SCI: fixing kDrawCel signature for kq6 svn-id: r50703 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 4c6fb4cf83..88a7e4026b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -264,7 +264,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r)", NULL, NULL }, + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, -- cgit v1.2.3 From d4bc0f9f10c597cd57de1c1f275cb227dd83eb0c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 5 Jul 2010 19:45:48 +0000 Subject: Replace a tab by whitespaces in the help string. svn-id: r50704 --- base/commandLine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index ee35bcf4c3..e795b82d0a 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -59,7 +59,7 @@ static const char HELP_STRING[] = " -h, --help Display a brief help text and exit\n" " -z, --list-games Display list of supported games and exit\n" " -t, --list-targets Display list of configured targets and exit\n" - " --list-saves=TARGET Display a list of savegames for the game (TARGET) specified\n" + " --list-saves=TARGET Display a list of savegames for the game (TARGET) specified\n" "\n" " -c, --config=CONFIG Use alternate configuration file\n" " -p, --path=PATH Path to where the game is installed\n" -- cgit v1.2.3 From 73e51735a4b43a05e3cbd293712b4951c56aaea8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 5 Jul 2010 20:10:28 +0000 Subject: Formatting fixes. svn-id: r50705 --- common/util.cpp | 127 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 63 deletions(-) diff --git a/common/util.cpp b/common/util.cpp index 53630fc6f3..7e1282773d 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -107,29 +107,29 @@ bool parseBool(const Common::String &val, bool &valAsBool) { const LanguageDescription g_languages[] = { - {"zh-cn", "Chinese (China)", ZH_CNA}, - {"zh", "Chinese (Taiwan)", ZH_TWN}, - {"cz", "Czech", CZ_CZE}, - {"nl", "Dutch", NL_NLD}, - {"en", "English", EN_ANY}, // Generic English (when only one game version exist) - {"gb", "English (GB)", EN_GRB}, - {"us", "English (US)", EN_USA}, - {"fr", "French", FR_FRA}, - {"de", "German", DE_DEU}, - {"gr", "Greek", GR_GRE}, - {"he", "Hebrew", HE_ISR}, - {"hb", "Hebrew", HE_ISR}, // Deprecated - {"hu", "Hungarian", HU_HUN}, - {"it", "Italian", IT_ITA}, - {"jp", "Japanese", JA_JPN}, - {"kr", "Korean", KO_KOR}, - {"nb", "Norwegian Bokm\xE5l", NB_NOR}, - {"pl", "Polish", PL_POL}, - {"br", "Portuguese", PT_BRA}, - {"ru", "Russian", RU_RUS}, - {"es", "Spanish", ES_ESP}, - {"se", "Swedish", SE_SWE}, - {0, 0, UNK_LANG} + { "zh-cn", "Chinese (China)", ZH_CNA }, + { "zh", "Chinese (Taiwan)", ZH_TWN }, + { "cz", "Czech", CZ_CZE }, + { "nl", "Dutch", NL_NLD }, + { "en", "English", EN_ANY }, // Generic English (when only one game version exist) + { "gb", "English (GB)", EN_GRB }, + { "us", "English (US)", EN_USA }, + { "fr", "French", FR_FRA }, + { "de", "German", DE_DEU }, + { "gr", "Greek", GR_GRE }, + { "he", "Hebrew", HE_ISR }, + { "hb", "Hebrew", HE_ISR }, // Deprecated + { "hu", "Hungarian", HU_HUN }, + { "it", "Italian", IT_ITA }, + { "jp", "Japanese", JA_JPN }, + { "kr", "Korean", KO_KOR }, + { "nb", "Norwegian Bokm\xE5l", NB_NOR }, + { "pl", "Polish", PL_POL }, + { "br", "Portuguese", PT_BRA }, + { "ru", "Russian", RU_RUS }, + { "es", "Spanish", ES_ESP }, + { "se", "Swedish", SE_SWE }, + { 0, 0, UNK_LANG } }; Language parseLanguage(const String &str) { @@ -168,32 +168,32 @@ const char *getLanguageDescription(Language id) { const PlatformDescription g_platforms[] = { - {"2gs", "2gs", "2gs", "Apple IIgs", kPlatformApple2GS}, - {"3do", "3do", "3do", "3DO", kPlatform3DO}, - {"acorn", "acorn", "acorn", "Acorn", kPlatformAcorn}, - {"amiga", "ami", "amiga", "Amiga", kPlatformAmiga}, - {"atari", "atari-st", "st", "Atari ST", kPlatformAtariST}, - {"c64", "c64", "c64", "Commodore 64", kPlatformC64}, - {"pc", "dos", "ibm", "DOS", kPlatformPC}, - {"pc98", "pc98", "pc98", "PC-98", kPlatformPC98}, - {"wii", "wii", "wii", "Nintendo Wii", kPlatformWii}, - {"coco3", "coco3", "coco3", "CoCo3", kPlatformCoCo3}, + { "2gs", "2gs", "2gs", "Apple IIgs", kPlatformApple2GS }, + { "3do", "3do", "3do", "3DO", kPlatform3DO }, + { "acorn", "acorn", "acorn", "Acorn", kPlatformAcorn }, + { "amiga", "ami", "amiga", "Amiga", kPlatformAmiga }, + { "atari", "atari-st", "st", "Atari ST", kPlatformAtariST }, + { "c64", "c64", "c64", "Commodore 64", kPlatformC64 }, + { "pc", "dos", "ibm", "DOS", kPlatformPC }, + { "pc98", "pc98", "pc98", "PC-98", kPlatformPC98 }, + { "wii", "wii", "wii", "Nintendo Wii", kPlatformWii }, + { "coco3", "coco3", "coco3", "CoCo3", kPlatformCoCo3 }, // The 'official' spelling seems to be "FM-TOWNS" (e.g. in the Indy4 demo). // However, on the net many variations can be seen, like "FMTOWNS", // "FM TOWNS", "FmTowns", etc. - {"fmtowns", "towns", "fm", "FM-TOWNS", kPlatformFMTowns}, - - {"linux", "linux", "linux", "Linux", kPlatformLinux}, - {"macintosh", "mac", "mac", "Macintosh", kPlatformMacintosh}, - {"pce", "pce", "pce", "PC-Engine", kPlatformPCEngine}, - {"nes", "nes", "nes", "NES", kPlatformNES}, - {"segacd", "segacd", "sega", "SegaCD", kPlatformSegaCD}, - {"windows", "win", "win", "Windows", kPlatformWindows}, - {"playstation", "psx", "psx", "Sony PlayStation", kPlatformPSX}, - {"cdi", "cdi", "cdi", "Phillips CD-i", kPlatformCDi}, - - {0, 0, 0, "Default", kPlatformUnknown} + { "fmtowns", "towns", "fm", "FM-TOWNS", kPlatformFMTowns }, + + { "linux", "linux", "linux", "Linux", kPlatformLinux }, + { "macintosh", "mac", "mac", "Macintosh", kPlatformMacintosh }, + { "pce", "pce", "pce", "PC-Engine", kPlatformPCEngine }, + { "nes", "nes", "nes", "NES", kPlatformNES }, + { "segacd", "segacd", "sega", "SegaCD", kPlatformSegaCD }, + { "windows", "win", "win", "Windows", kPlatformWindows }, + { "playstation", "psx", "psx", "Sony PlayStation", kPlatformPSX }, + { "cdi", "cdi", "cdi", "Phillips CD-i", kPlatformCDi }, + + { 0, 0, 0, "Default", kPlatformUnknown } }; Platform parsePlatform(const String &str) { @@ -251,11 +251,11 @@ const char *getPlatformDescription(Platform id) { const RenderModeDescription g_renderModes[] = { - {"hercGreen", _s("Hercules Green"), kRenderHercG}, - {"hercAmber", _s("Hercules Amber"), kRenderHercA}, - {"cga", "CGA", kRenderCGA}, - {"ega", "EGA", kRenderEGA}, - {"amiga", "Amiga", kRenderAmiga}, + { "hercGreen", _s("Hercules Green"), kRenderHercG }, + { "hercAmber", _s("Hercules Amber"), kRenderHercA }, + { "cga", "CGA", kRenderCGA }, + { "ega", "EGA", kRenderEGA }, + { "amiga", "Amiga", kRenderAmiga }, {0, 0, kRenderDefault} }; @@ -294,21 +294,22 @@ const struct GameOpt { uint32 option; const char *desc; } g_gameOptions[] = { - { GUIO_NOSUBTITLES, "sndNoSubs" }, - { GUIO_NOMUSIC, "sndNoMusic" }, - { GUIO_NOSPEECH, "sndNoSpeech" }, - { GUIO_NOSFX, "sndNoSFX" }, - { GUIO_NOMIDI, "sndNoMIDI" }, + { GUIO_NOSUBTITLES, "sndNoSubs" }, + { GUIO_NOMUSIC, "sndNoMusic" }, + { GUIO_NOSPEECH, "sndNoSpeech" }, + { GUIO_NOSFX, "sndNoSFX" }, + { GUIO_NOMIDI, "sndNoMIDI" }, + { GUIO_NOLAUNCHLOAD, "launchNoLoad" }, - { GUIO_MIDIPCSPK, "midiPCSpk" }, - { GUIO_MIDICMS, "midiCMS" }, - { GUIO_MIDIPCJR, "midiPCJr" }, - { GUIO_MIDIADLIB, "midiAdLib" }, - { GUIO_MIDITOWNS, "midiTowns" }, - { GUIO_MIDIPC98, "midiPC98" }, - { GUIO_MIDIMT32, "midiMt32" }, - { GUIO_MIDIGM, "midiGM" }, + { GUIO_MIDIPCSPK, "midiPCSpk" }, + { GUIO_MIDICMS, "midiCMS" }, + { GUIO_MIDIPCJR, "midiPCJr" }, + { GUIO_MIDIADLIB, "midiAdLib" }, + { GUIO_MIDITOWNS, "midiTowns" }, + { GUIO_MIDIPC98, "midiPC98" }, + { GUIO_MIDIMT32, "midiMt32" }, + { GUIO_MIDIGM, "midiGM" }, { GUIO_NONE, 0 } }; -- cgit v1.2.3 From 1443a2721c77e4336dd894e66a377950b4f23273 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 5 Jul 2010 20:10:56 +0000 Subject: Fix update of GUI options, which only differ in the language setting. svn-id: r50706 --- common/util.cpp | 11 +++++++---- common/util.h | 2 +- engines/advancedDetector.cpp | 2 +- engines/scumm/detection.cpp | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/common/util.cpp b/common/util.cpp index 7e1282773d..521a12e4c7 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -365,12 +365,15 @@ const String getGameGUIOptionsDescription(uint32 options) { return res; } -void updateGameGUIOptions(const uint32 options) { +void updateGameGUIOptions(const uint32 options, const String &langOption) { + const String newOptionString = getGameGUIOptionsDescription(options) + " " + langOption; + if ((options && !ConfMan.hasKey("guioptions")) || - (ConfMan.hasKey("guioptions") && options != parseGameGUIOptions(ConfMan.get("guioptions")))) { - ConfMan.set("guioptions", getGameGUIOptionsDescription(options)); + (ConfMan.hasKey("guioptions") && ConfMan.get("guioptions") != newOptionString)) { + ConfMan.set("guioptions", newOptionString); ConfMan.flushToDisk(); } } -} // End of namespace Common +} // End of namespace Common + diff --git a/common/util.h b/common/util.h index 823788ca04..7a9cf4fb2d 100644 --- a/common/util.h +++ b/common/util.h @@ -240,7 +240,7 @@ const String getGameGUIOptionsDescriptionLanguage(Language lang); * domain, when they differ to the ones passed as * parameter. */ -void updateGameGUIOptions(const uint32 options); +void updateGameGUIOptions(const uint32 options, const String &langOption); } // End of namespace Common diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 974970ff0f..315763a6da 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -306,7 +306,7 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) // If the GUI options were updated, we catch this here and update them in the users config // file transparently. - Common::updateGameGUIOptions(agdDesc->guioptions | params.guioptions); + Common::updateGameGUIOptions(agdDesc->guioptions | params.guioptions, getGameGUIOptionsDescriptionLanguage(agdDesc->language)); debug(2, "Running %s", toGameDescriptor(*agdDesc, params.list).description().c_str()); if (!createInstance(syst, engine, agdDesc)) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 407b139c7e..c3a9120093 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -1024,7 +1024,7 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co // If the GUI options were updated, we catch this here and update them in the users config // file transparently. - Common::updateGameGUIOptions(res.game.guioptions); + Common::updateGameGUIOptions(res.game.guioptions, getGameGUIOptionsDescriptionLanguage(res.language)); // Finally, we have massaged the GameDescriptor to our satisfaction, and can // instantiate the appropriate game engine. Hooray! -- cgit v1.2.3 From cffcc3d9360dbbadec4a3e18c3b6ca64dfc27995 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 5 Jul 2010 20:25:33 +0000 Subject: SCI: fixing signature of kDoSound (fading related) thx to Ceriand svn-id: r50707 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 88a7e4026b..0d0b9a30d3 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -304,7 +304,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(iii)(i)", NULL, NULL }, // subop + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", NULL, NULL }, // subop { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, -- cgit v1.2.3 From 429de8f6efc3d3dcbbdfbc9f7eb53d2d096ca925 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 20:36:11 +0000 Subject: DS: More formating, made more vars static svn-id: r50708 --- backends/platform/ds/arm9/source/blitters.cpp | 64 +++++++------------ backends/platform/ds/arm9/source/cdaudio.cpp | 74 +++++++++------------- backends/platform/ds/arm9/source/dsmain.cpp | 61 ++++++------------ backends/platform/ds/arm9/source/dsoptions.cpp | 2 +- backends/platform/ds/arm9/source/keys.cpp | 33 +++------- backends/platform/ds/arm9/source/keys.h | 2 +- backends/platform/ds/arm9/source/osystem_ds.cpp | 3 +- backends/platform/ds/arm9/source/touchkeyboard.cpp | 32 +++++----- backends/platform/ds/arm9/source/zipreader.cpp | 1 - 9 files changed, 98 insertions(+), 174 deletions(-) diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp index 559845cb18..5d29672ef6 100644 --- a/backends/platform/ds/arm9/source/blitters.cpp +++ b/backends/platform/ds/arm9/source/blitters.cpp @@ -33,10 +33,10 @@ namespace DS { void asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch) { - - if (height <= 0) height = 1; - if (width < 4) return; - + if (height <= 0) + height = 1; + if (width < 4) + return; width &= ~4; // src = (const byte *) (((int) (src)) & (~4)); @@ -144,22 +144,19 @@ void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height) { static bool isDivBy5Ready = false; static u32 DIV_BY_5[160]; -void ComputeDivBy5TableIFN() -{ +void ComputeDivBy5TableIFN() { if (isDivBy5Ready) return; isDivBy5Ready = true; - for (int i=0; i<160; ++i) - { + for (int i = 0; i < 160; ++i) { DIV_BY_5[i] = (2*i+5)/10; } } #ifdef PERFECT_5_TO_4_RESCALING static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16 *dest) -{ + u16 *dest) { u32 bs0 = s0 & 0x1F; u32 bs1 = s1 & 0x1F; u32 bs2 = s2 & 0x1F; @@ -233,8 +230,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 } #else static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16 *dest) -{ + u16 *dest) { static const u32 MASK = 0x03E07C1F; u32 argbargbs0 = u32(s0) | (u32(s0) << 16); @@ -282,8 +278,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 #endif static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3, u32 s4, - u16 *dest) -{ + u16 *dest) { u32 d0 = 4*s0 + s1; u32 d1 = 2*s1 + s1 + 2*s2; @@ -320,12 +315,10 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3 // Can't work in place #ifdef PERFECT_5_TO_4_RESCALING -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u32 *palette) -{ +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u32 *palette) { ComputeDivBy5TableIFN(); - for (size_t i=0; i<64; ++i) - { + for (size_t i = 0; i < 64; ++i) { u32 s0 = palette[src[5*i+0]]; u32 s1 = palette[src[5*i+1]]; u32 s2 = palette[src[5*i+2]]; @@ -336,10 +329,8 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const } } #else -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u16 *palette) -{ - for (size_t i=0; i<64; ++i) - { +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u16 *palette) { + for (size_t i = 0; i < 64; ++i) { u16 s0 = palette[src[5*i+0]]; u16 s1 = palette[src[5*i+1]]; u16 s2 = palette[src[5*i+2]]; @@ -353,12 +344,10 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const // Can work in place, because it's a contraction -static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16 *dest, const u16 *src) -{ +static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16 *dest, const u16 *src) { ComputeDivBy5TableIFN(); - for (size_t i=0; i<64; ++i) - { + for (size_t i = 0; i < 64; ++i) { u16 s0 = src[5*i+0]; u16 s1 = src[5*i+1]; u16 s2 = src[5*i+2]; @@ -370,13 +359,11 @@ static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16 *dest, const } #ifdef PERFECT_5_TO_4_RESCALING -void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) -{ +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u32 fastRam[768]; // Palette lookup -> 0_888 - for (size_t i=0; i<256; ++i) - { + for (size_t i = 0; i < 256; ++i) { u32 col = palette[i]; u32 result = col & 0x0000001F; result |= (col << 3) & 0x00001F00; @@ -385,29 +372,24 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStri fastRam[i] = result; } - for (size_t i=0; i<200; ++i) - { + for (size_t i = 0; i < 200; ++i) { Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam); } } #else -void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) -{ +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u16 fastRam[256]; - for (size_t i=0; i<128; ++i) + for (size_t i = 0; i < 128; ++i) ((u32*)fastRam)[i] = ((const u32*)palette)[i]; - for (size_t i=0; i<200; ++i) - { + for (size_t i = 0; i < 200; ++i) { Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam); } } #endif -void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride) -{ - for (size_t i=0; i<200; ++i) - { +void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride) { + for (size_t i = 0; i < 200; ++i) { Rescale_320x1555Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride); } } diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index a5d38cb7e4..5860dea4f2 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -328,45 +328,30 @@ void decompressBlock() { int offset = 0; switch (7 - (r & 0x0007)) { - case 0: { - offset = (word & 0xF0000000) >> 28; - break; - } - - case 1: { - offset = (word & 0x0F000000) >> 24; - break; - } - - case 2: { - offset = (word & 0x00F00000) >> 20; - break; - } - - case 3: { - offset = (word & 0x000F0000) >> 16; - break; - } - - case 4: { - offset = (word & 0x0000F000) >> 12; - break; - } - - case 5: { - offset = (word & 0x00000F00) >> 8; - break; - } - - case 6: { - offset = (word & 0x000000F0) >> 4; - break; - } - - case 7: { - offset = (word & 0x0000000F); - break; - } + case 0: + offset = (word & 0xF0000000) >> 28; + break; + case 1: + offset = (word & 0x0F000000) >> 24; + break; + case 2: + offset = (word & 0x00F00000) >> 20; + break; + case 3: + offset = (word & 0x000F0000) >> 16; + break; + case 4: + offset = (word & 0x0000F000) >> 12; + break; + case 5: + offset = (word & 0x00000F00) >> 8; + break; + case 6: + offset = (word & 0x000000F0) >> 4; + break; + case 7: + offset = (word & 0x0000000F); + break; } int diff = 0; @@ -409,7 +394,8 @@ void decompressBlock() { } void playNextBlock() { - if (!isPlayingFlag) return; + if (!isPlayingFlag) + return; int lastBlockId = -1; while (IPC->adpcm.semaphore); // Wait for buffer to become free if needed @@ -445,9 +431,6 @@ void playNextBlock() { // DC_FlushAll(); } - - - } @@ -463,7 +446,8 @@ void playNextBlock() { } void stopTrack() { - if (!isPlayingFlag) return; + if (!isPlayingFlag) + return; DS::std_fclose(s_file); @@ -473,7 +457,7 @@ void stopTrack() { audioBuffer[r] = 0; } - for (int r= 0; r < waveHeader.fmtExtra; r++) { + for (int r = 0; r < waveHeader.fmtExtra; r++) { decompressionBuffer[r] = 0; } // DS::stopSound(1); diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index d1e30b93cd..dc52038cec 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -1026,8 +1026,9 @@ u16 *get16BitBackBuffer() { } s32 get8BitBackBufferStride() { - // When the CPU scaler is enabled, the back buffer is in system RAM and is 320 pixels wide - // When the CPU scaler is disabled, the back buffer is in video memory and therefore must have a 512 pixel stride + // When the CPU scaler is enabled, the back buffer is in system RAM and is + // 320 pixels wide. When the CPU scaler is disabled, the back buffer is in + // video memory and therefore must have a 512 pixel stride. if (isCpuScalerEnabled()){ return 320; @@ -1371,8 +1372,7 @@ void doScreenTapMode(OSystem_DS *system) { system->addEvent(event); } -void doButtonSelectMode(OSystem_DS *system) -{ +void doButtonSelectMode(OSystem_DS *system) { Common::Event event; @@ -1670,12 +1670,9 @@ void addEventsToQueue() { if (!keyboardEnable) { - if (((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) || (indyFightState)) && (displayModeIs8Bit)) { // Controls specific to the control method - - if (s_currentGame->control == CONT_SKY) { // Extra controls for Beneath a Steel Sky if ((getKeysDown() & KEY_DOWN)) { @@ -1686,7 +1683,6 @@ void addEventsToQueue() { if (s_currentGame->control == CONT_AGI) { // Extra controls for Leisure Suit Larry and KQ4 - if ((getKeysHeld() & KEY_UP) && (getKeysHeld() & KEY_START) /*&& (!strcmp(gameName, "LLLLL"))*/) { consolePrintf("Cheat key!\n"); @@ -1699,11 +1695,8 @@ void addEventsToQueue() { event.type = Common::EVENT_KEYUP; system->addEvent(event); } - } - - if (s_currentGame->control == CONT_SIMON) { // Extra controls for Simon the Sorcerer if ((getKeysDown() & KEY_DOWN)) { @@ -1719,8 +1712,6 @@ void addEventsToQueue() { } } - - if (s_currentGame->control == CONT_SCUMM_ORIGINAL) { // Extra controls for Scumm v1-5 games if ((getKeysDown() & KEY_DOWN)) { @@ -1803,9 +1794,7 @@ void addEventsToQueue() { } consumeKeys(); - consumePenEvents(); - } } @@ -1835,23 +1824,19 @@ void updateStatus() { if (displayModeIs8Bit) { if (!tapScreenClicks) { switch (mouseMode) { - case MOUSE_LEFT: { - offs = 1; - break; - } - case MOUSE_RIGHT: { - offs = 2; - break; - } - case MOUSE_HOVER: { - offs = 0; - break; - } - default: { - // Nothing! - offs = 0; - break; - } + case MOUSE_LEFT: + offs = 1; + break; + case MOUSE_RIGHT: + offs = 2; + break; + case MOUSE_HOVER: + offs = 0; + break; + default: + // Nothing! + offs = 0; + break; } setIcon(0, 208, 150, offs, 0, true); @@ -1935,15 +1920,12 @@ void setMainScreenScale(int x, int y) { SUB_BG3_YDX = 0; SUB_BG3_YDY = y; } else*/ { - if (isCpuScalerEnabled() && (x==320)) - { + if (isCpuScalerEnabled() && (x==320)) { BG3_XDX = 256; BG3_XDY = 0; BG3_YDX = 0; BG3_YDY = y; - } - else - { + } else { BG3_XDX = x; BG3_XDY = 0; BG3_YDX = 0; @@ -2030,8 +2012,6 @@ void VBlankHandler(void) { soundUpdate(); - - if ((!gameScreenSwap) && (!(getKeysHeld() & KEY_L) && !(getKeysHeld() & KEY_R))) { if (s_currentGame) { if (s_currentGame->control != CONT_SCUMM_SAMNMAX) { @@ -2607,9 +2587,6 @@ void penUpdate() { } } - else - { - } } else { penDown = true; diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 32b37abfbc..cc89c41017 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -423,7 +423,7 @@ void setOptions() { DS::setTrackPadStyleEnable(enable); - if ((enable) and (firstLoad)) { + if (enable && firstLoad) { // If we've just booted up, want to swap screens when trackpad mode is in use // but not every time we enter the options dialog. DS::setGameScreenSwap(true); diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp index 8c97b02716..2f8497ab19 100644 --- a/backends/platform/ds/arm9/source/keys.cpp +++ b/backends/platform/ds/arm9/source/keys.cpp @@ -74,7 +74,6 @@ #include #include -//------------------------------------------------------------------------------ #define KEYS_CUR (( ((~REG_KEYINPUT)&0x3ff) | (((~IPC->buttons)&3)<<10) | (((~IPC->buttons)<<6) & (KEY_TOUCH|KEY_LID) ))^KEY_LID) @@ -89,61 +88,47 @@ static u8 delay = 60, repeat = 30, count = 60; static uint16 oldx = 0; static uint16 oldy = 0; -//------------------------------------------------------------------------------ void scanKeys(void) { -//------------------------------------------------------------------------------ keysold = keys; keys = KEYS_CUR; oldx = IPC->touchXpx; oldy = IPC->touchYpx; - if ( delay != 0 ) { - if ( keys != keysold ) { - count = delay ; - keysrepeat = keysDown() ; + if (delay != 0) { + if (keys != keysold) { + count = delay; + keysrepeat = keysDown(); } count--; - if ( count == 0 ) { + if (count == 0) { count = repeat; keysrepeat = keys; } } } -//------------------------------------------------------------------------------ uint32 keysHeld(void) { -//------------------------------------------------------------------------------ return keys; } -//------------------------------------------------------------------------------ uint32 keysDown(void) { -//------------------------------------------------------------------------------ return (keys ^ keysold) & keys; } -//------------------------------------------------------------------------------ uint32 keysDownRepeat(void) { -//------------------------------------------------------------------------------ uint32 tmp = keysrepeat; - keysrepeat = 0; - return tmp; } -//------------------------------------------------------------------------------ void keysSetRepeat( u8 setDelay, u8 setRepeat ) { -//------------------------------------------------------------------------------ - delay = setDelay ; - repeat = setRepeat ; - count = delay ; - keysrepeat = 0 ; + delay = setDelay; + repeat = setRepeat; + count = delay; + keysrepeat = 0; } -//------------------------------------------------------------------------------ uint32 keysUp(void) { -//------------------------------------------------------------------------------ return (keys ^ keysold) & (~keys); } diff --git a/backends/platform/ds/arm9/source/keys.h b/backends/platform/ds/arm9/source/keys.h index 0068dfeeb6..8d08014232 100644 --- a/backends/platform/ds/arm9/source/keys.h +++ b/backends/platform/ds/arm9/source/keys.h @@ -30,7 +30,7 @@ void scanKeys(void); uint32 keysHeld(void); uint32 keysDown(void); uint32 keysDownRepeat(void); -void keysSetRepeat( u8 setDelay, u8 setRepeat ); +void keysSetRepeat(u8 setDelay, u8 setRepeat); uint32 keysUp(void); } // End of namespace DS diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index d750dfbc07..09617c17b0 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -208,8 +208,7 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) { } } -void OSystem_DS::restoreHardwarePalette() -{ +void OSystem_DS::restoreHardwarePalette() { // Set the hardware palette up based on the stored palette for (int r = 0; r < 255; r++) { diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 7b5e8c2b52..71f4f93c27 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -44,7 +44,7 @@ struct key_data { #define DS_CAPSLOCK 1 -key_data keys[DS_NUM_KEYS] = { +static key_data keys[DS_NUM_KEYS] = { // Key number x y character // Numbers @@ -137,27 +137,27 @@ key_data keys[DS_NUM_KEYS] = { }; -int keyboardX; -int keyboardY; +static int keyboardX; +static int keyboardY; static int s_mapBase; static int s_tileBase; -u16 *baseAddress; +static u16 *baseAddress; -bool shiftState; -bool capsLockState; +static bool shiftState; +static bool capsLockState; -bool closed; +static bool closed; -char autoCompleteWord[NUM_WORDS][32]; -int autoCompleteCount; +static char autoCompleteWord[NUM_WORDS][32]; +static int autoCompleteCount; -char autoCompleteBuffer[128]; +static char autoCompleteBuffer[128]; -int selectedCompletion = -1; -int charactersEntered = 0; -int typingTimeout = 0; +static int selectedCompletion = -1; +static int charactersEntered = 0; +static int typingTimeout = 0; // Render text onto the tiled screen @@ -396,8 +396,7 @@ void updateTypeEvents() { event.type = Common::EVENT_KEYUP; system->addEvent(event); - for (int r = 0; r < (int)strlen(autoCompleteBuffer); r++) - { + for (int r = 0; r < (int)strlen(autoCompleteBuffer); r++) { autoCompleteBuffer[r] = autoCompleteBuffer[r + 1]; } @@ -405,8 +404,7 @@ void updateTypeEvents() { } } -void createKeyEvent(int keyNum, Common::Event& event) -{ +void createKeyEvent(int keyNum, Common::Event& event) { event.kbd.flags = 0; if ((keys[keyNum].character >= '0') && (keys[keyNum].character <= '9')) { diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index 0906123436..d4f055ee82 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -79,7 +79,6 @@ bool ZipFile::restartFile() { bool more = true; while (!currentFileInFolder() && more) { - char name[128]; getFileName(name); more = skipFile(); } -- cgit v1.2.3 From edac80ad6bd785e4925764bdd1bea2084aefc143 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 5 Jul 2010 20:36:43 +0000 Subject: DS: Fix warning about anonymous struct svn-id: r50709 --- backends/platform/ds/arm9/source/fat/gba_nds_fat.c | 12 ++++++------ backends/platform/ds/commoninclude/NDS/scummvm_ipc.h | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c index b70d9e7b99..07affd8839 100644 --- a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c +++ b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c @@ -294,9 +294,9 @@ u16 getRTCtoFileTime (void) { #ifdef NDS return ( - ( ( (IPC->rtc_hours > 11 ? IPC->rtc_hours - 40 : IPC->rtc_hours) & 0x1F) << 11) | - ( (IPC->rtc_minutes & 0x3F) << 5) | - ( (IPC->rtc_seconds >> 1) & 0x1F) ); + ( ( (IPC->rtc.hours > 11 ? IPC->rtc.hours - 40 : IPC->rtc.hours) & 0x1F) << 11) | + ( (IPC->rtc.minutes & 0x3F) << 5) | + ( (IPC->rtc.seconds >> 1) & 0x1F) ); #else return 0; #endif @@ -306,9 +306,9 @@ u16 getRTCtoFileDate (void) { #ifdef NDS return ( - ( ((IPC->rtc_year + 20) & 0x7F) <<9) | - ( (IPC->rtc_month & 0xF) << 5) | - (IPC->rtc_day & 0x1F) ); + ( ((IPC->rtc.year + 20) & 0x7F) <<9) | + ( (IPC->rtc.month & 0xF) << 5) | + (IPC->rtc.day & 0x1F) ); #else return 0; #endif diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h index e0cda4d972..cf6436634a 100644 --- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h +++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h @@ -80,16 +80,16 @@ typedef struct scummvmTransferRegion { uint8 curtime[8]; // current time response from RTC struct { - u8 rtc_command; - u8 rtc_year; //add 2000 to get 4 digit year - u8 rtc_month; //1 to 12 - u8 rtc_day; //1 to (days in month) - - u8 rtc_incr; - u8 rtc_hours; //0 to 11 for AM, 52 to 63 for PM - u8 rtc_minutes; //0 to 59 - u8 rtc_seconds; //0 to 59 - }; + u8 command; + u8 year; //add 2000 to get 4 digit year + u8 month; //1 to 12 + u8 day; //1 to (days in month) + + u8 incr; + u8 hours; //0 to 11 for AM, 52 to 63 for PM + u8 minutes; //0 to 59 + u8 seconds; //0 to 59 + } rtc; }; uint16 battery; // battery life ?? hopefully. :) -- cgit v1.2.3 From 0c3cbcbfc57c6c355d7106aa6be3faa7dd2f8590 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 5 Jul 2010 21:18:25 +0000 Subject: Prevent SCUMM from adding gui options based on user flags into the config file (regression from r50706). svn-id: r50710 --- engines/scumm/detection.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index c3a9120093..9721c75677 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -1005,6 +1005,10 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co debug(1, "Using MD5 '%s'", res.md5.c_str()); } + // If the GUI options were updated, we catch this here and update them in the users config + // file transparently. + Common::updateGameGUIOptions(res.game.guioptions, getGameGUIOptionsDescriptionLanguage(res.language)); + // Check for a user override of the platform. We allow the user to override // the platform, to make it possible to add games which are not yet in // our MD5 database but require a specific platform setting. @@ -1021,11 +1025,6 @@ Common::Error ScummMetaEngine::createInstance(OSystem *syst, Engine **engine) co // TODO: Maybe allow the null driver, too? if (res.game.platform == Common::kPlatformFMTowns && res.game.version == 3) res.game.midi = MDT_TOWNS; - - // If the GUI options were updated, we catch this here and update them in the users config - // file transparently. - Common::updateGameGUIOptions(res.game.guioptions, getGameGUIOptionsDescriptionLanguage(res.language)); - // Finally, we have massaged the GameDescriptor to our satisfaction, and can // instantiate the appropriate game engine. Hooray! switch (res.game.version) { -- cgit v1.2.3 From a3202eab7c710b63b1ede3acc54c0d87a7d05b1d Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 5 Jul 2010 21:29:52 +0000 Subject: Note Common::String's behaviour may be undefined with \0 characters. Also make operator=(char) and String(char) behave the same. svn-id: r50712 --- common/str.cpp | 6 +++--- common/str.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/str.cpp b/common/str.cpp index 50b9bdb879..744ba46ec7 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -105,8 +105,6 @@ String::String(char c) _storage[0] = c; _storage[1] = 0; - // TODO/FIXME: There is no reason for the following check -- we *do* - // allow strings to contain 0 bytes! _size = (c == 0) ? 0 : 1; } @@ -256,9 +254,11 @@ String &String::operator=(const String &str) { String &String::operator=(char c) { decRefCount(_extern._refCount); _str = _storage; - _size = 1; + _str[0] = c; _str[1] = 0; + + _size = (c == 0) ? 0 : 1; return *this; } diff --git a/common/str.h b/common/str.h index 189c37adb4..e3dec6cdc2 100644 --- a/common/str.h +++ b/common/str.h @@ -39,6 +39,9 @@ namespace Common { * Instead, small strings are stored 'inside' the string object (i.e. on * the stack, for stack allocated objects), and only for strings exceeding * a certain length do we allocate a buffer on the heap. + * + * The presence of \0 characters in the string will cause undefined + * behaviour in some operations. */ class String { protected: -- cgit v1.2.3 From 0c411d66cef3c79f077df46882518e786ec811f2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 6 Jul 2010 07:42:25 +0000 Subject: SCI: Simplified op_div and op_mod, removed some variables and removed the pointless OBJ_PROPERTY wrapper svn-id: r50719 --- engines/sci/engine/vm.cpp | 75 ++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 43 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 83bcae9673..b1e6eead0e 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -428,10 +428,6 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); #define ACC_ARITHMETIC_L(op) make_reg(0, (op validate_arithmetic(s->r_acc))) -#define ACC_AUX_LOAD() aux_acc = signed_validate_arithmetic(s->r_acc) -#define ACC_AUX_STORE() s->r_acc = make_reg(0, aux_acc) - -#define OBJ_PROPERTY(o, p) (validate_property(o, p)) // Operating on the stack // 16 bit: @@ -940,27 +936,23 @@ int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4]) void run_vm(EngineState *s, bool restoring) { assert(s); - unsigned int code_buf_size = 0 ; // (Avoid spurious warning) int temp; - int16 aux_acc; // Auxiliary 16 bit accumulator reg_t r_temp; // Temporary register StackPtr s_temp; // Temporary stack pointer int16 opparams[4]; // opcode parameters - s->restAdjust = 0; - // &rest adjusts the parameter count by this value + s->restAdjust = 0; // &rest adjusts the parameter count by this value // Current execution data: s->xs = &(s->_executionStack.back()); ExecStack *xs_new = NULL; Object *obj = s->_segMan->getObject(s->xs->objp); + Script *scr = 0; Script *local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); int old_executionStackBase = s->executionStackBase; // Used to detect the stack bottom, for "physical" returns - const byte *code_buf = NULL; // (Avoid spurious warning) - if (!local_script) { + if (!local_script) error("run_vm(): program counter gone astray (local_script pointer is null)"); - } if (!restoring) s->executionStackBase = s->_executionStack.size() - 1; @@ -981,15 +973,13 @@ void run_vm(EngineState *s, bool restoring) { return; // Stop processing if (s->_executionStackPosChanged) { - Script *scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); + scr = s->_segMan->getScriptIfLoaded(s->xs->addr.pc.segment); if (!scr) error("No script in segment %d", s->xs->addr.pc.segment); s->xs = &(s->_executionStack.back()); s->_executionStackPosChanged = false; obj = s->_segMan->getObject(s->xs->objp); - code_buf = scr->getBuf(); - code_buf_size = scr->getBufSize(); local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { // FIXME: Why does this happen? Is the script not loaded yet at this point? @@ -1034,13 +1024,13 @@ void run_vm(EngineState *s, bool restoring) { s->variablesMax[VAR_TEMP] = s->xs->sp - s->xs->fp; - if (s->xs->addr.pc.offset >= code_buf_size) + if (s->xs->addr.pc.offset >= scr->getBufSize()) error("run_vm(): program counter gone astray, addr: %d, code buffer size: %d", - s->xs->addr.pc.offset, code_buf_size); + s->xs->addr.pc.offset, scr->getBufSize()); // Get opcode byte extOpcode; - s->xs->addr.pc.offset += readPMachineInstruction(code_buf + s->xs->addr.pc.offset, extOpcode, opparams); + s->xs->addr.pc.offset += readPMachineInstruction(scr->getBuf() + s->xs->addr.pc.offset, extOpcode, opparams); const byte opcode = extOpcode >> 1; switch (opcode) { @@ -1117,18 +1107,16 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = ACC_ARITHMETIC_L(((int16)POP()) * (int16)/*acc*/); break; - case op_div: // 0x04 (04) - ACC_AUX_LOAD(); - aux_acc = aux_acc != 0 ? ((int16)POP()) / aux_acc : 0; - ACC_AUX_STORE(); + case op_div: { // 0x04 (04) + int16 divisor = signed_validate_arithmetic(s->r_acc); + s->r_acc = make_reg(0, (divisor != 0 ? ((int16)POP()) / divisor : 0)); break; - - case op_mod: // 0x05 (05) - ACC_AUX_LOAD(); - aux_acc = aux_acc != 0 ? ((int16)POP()) % aux_acc : 0; - ACC_AUX_STORE(); + } + case op_mod: { // 0x05 (05) + int16 modulo = signed_validate_arithmetic(s->r_acc); + s->r_acc = make_reg(0, (modulo != 0 ? ((int16)POP()) % modulo : 0)); break; - + } case op_shr: // 0x06 (06) // Shift right logical s->r_acc = ACC_ARITHMETIC_L(((uint16)POP()) >> /*acc*/); @@ -1596,48 +1584,48 @@ void run_vm(EngineState *s, bool restoring) { case op_pToa: // 0x31 (49) // Property To Accumulator - s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); + s->r_acc = validate_property(obj, (opparams[0] >> 1)); break; case op_aTop: // 0x32 (50) // Accumulator To Property - OBJ_PROPERTY(obj, (opparams[0] >> 1)) = s->r_acc; + validate_property(obj, (opparams[0] >> 1)) = s->r_acc; break; case op_pTos: // 0x33 (51) // Property To Stack - PUSH32(OBJ_PROPERTY(obj, opparams[0] >> 1)); + PUSH32(validate_property(obj, opparams[0] >> 1)); break; case op_sTop: // 0x34 (52) // Stack To Property - OBJ_PROPERTY(obj, (opparams[0] >> 1)) = POP32(); + validate_property(obj, (opparams[0] >> 1)) = POP32(); break; case op_ipToa: // 0x35 (53) // Incement Property and copy To Accumulator - s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); - s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(1 + /*acc*/); + s->r_acc = validate_property(obj, (opparams[0] >> 1)); + s->r_acc = validate_property(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(1 + /*acc*/); break; case op_dpToa: { // 0x36 (54) // Decrement Property and copy To Accumulator - s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)); - s->r_acc = OBJ_PROPERTY(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(-1 + /*acc*/); + s->r_acc = validate_property(obj, (opparams[0] >> 1)); + s->r_acc = validate_property(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(-1 + /*acc*/); break; } case op_ipTos: // 0x37 (55) // Increment Property and push to Stack - validate_arithmetic(OBJ_PROPERTY(obj, (opparams[0] >> 1))); - temp = ++OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; + validate_arithmetic(validate_property(obj, (opparams[0] >> 1))); + temp = ++validate_property(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; case op_dpTos: // 0x38 (56) // Decrement Property and push to Stack - validate_arithmetic(OBJ_PROPERTY(obj, (opparams[0] >> 1))); - temp = --OBJ_PROPERTY(obj, (opparams[0] >> 1)).offset; + validate_arithmetic(validate_property(obj, (opparams[0] >> 1))); + temp = --validate_property(obj, (opparams[0] >> 1)).offset; PUSH(temp); break; @@ -1656,9 +1644,9 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc.offset = s->xs->addr.pc.offset + opparams[0]; } - if (s->r_acc.offset >= code_buf_size) { + if (s->r_acc.offset >= scr->getBufSize()) { error("VM: lofsa operation overflowed: %04x:%04x beyond end" - " of script (at %04x)\n", PRINT_REG(s->r_acc), code_buf_size); + " of script (at %04x)\n", PRINT_REG(s->r_acc), scr->getBufSize()); } break; @@ -1677,9 +1665,9 @@ void run_vm(EngineState *s, bool restoring) { r_temp.offset = s->xs->addr.pc.offset + opparams[0]; } - if (r_temp.offset >= code_buf_size) { + if (r_temp.offset >= scr->getBufSize()) { error("VM: lofss operation overflowed: %04x:%04x beyond end" - " of script (at %04x)", PRINT_REG(r_temp), code_buf_size); + " of script (at %04x)", PRINT_REG(r_temp), scr->getBufSize()); } PUSH32(r_temp); break; @@ -1701,6 +1689,7 @@ void run_vm(EngineState *s, bool restoring) { PUSH32(s->xs->objp); } else { // Debug opcode op_file, skip null-terminated string (file name) + const byte *code_buf = scr->getBuf(); while (code_buf[s->xs->addr.pc.offset++]) ; } break; -- cgit v1.2.3 From f3a935351b7977517876e2342471c1330a5db7ff Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 6 Jul 2010 11:03:10 +0000 Subject: SCI: fix regression of r50599 - broken greyed font drawing svn-id: r50720 --- engines/sci/graphics/font.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/font.cpp b/engines/sci/graphics/font.cpp index ce4c1fafb3..852771d081 100644 --- a/engines/sci/graphics/font.cpp +++ b/engines/sci/graphics/font.cpp @@ -83,11 +83,12 @@ void GfxFontFromResource::draw(uint16 chr, int16 top, int16 left, byte color, bo int charHeight = MIN(getCharHeight(chr), _screen->getHeight() - top); byte b = 0, mask = 0xFF; int y = 0; + int16 greyedTop = top; byte *pIn = getCharData(chr); for (int i = 0; i < charHeight; i++, y++) { if (greyedOutput) - mask = top++ % 2 ? 0xAA : 0x55; + mask = greyedTop++ % 2 ? 0xAA : 0x55; for (int done = 0; done < charWidth; done++) { if ((done & 7) == 0) // fetching next data byte b = *(pIn++) & mask; -- cgit v1.2.3 From 2d5dabee30b842a6670f4d6e956c45e37389e344 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 6 Jul 2010 11:16:11 +0000 Subject: SCI: implemented pauseSound inside kMenuSelect svn-id: r50721 --- engines/sci/engine/kmenu.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp index 54543d783f..69ec07559e 100644 --- a/engines/sci/engine/kmenu.cpp +++ b/engines/sci/engine/kmenu.cpp @@ -90,10 +90,17 @@ reg_t kDrawMenuBar(EngineState *s, int argc, reg_t *argv) { reg_t kMenuSelect(EngineState *s, int argc, reg_t *argv) { reg_t eventObject = argv[0]; - //bool pauseSound = argc > 1 ? (argv[1].isNull() ? false : true) : false; + bool pauseSound = argc > 1 ? (argv[1].isNull() ? false : true) : true; + reg_t result; - // TODO: pauseSound implementation - return g_sci->_gfxMenu->kernelSelect(eventObject); + if (pauseSound) + g_sci->_soundCmd->pauseAll(true); + + result = g_sci->_gfxMenu->kernelSelect(eventObject); + + if (pauseSound) + g_sci->_soundCmd->pauseAll(false); + return result; } } // End of namespace Sci -- cgit v1.2.3 From 3f7dc9e0e2e4d043b2234b7b66981e16eb8a84b1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 6 Jul 2010 11:32:10 +0000 Subject: Added extra initialisation code for the game's global variables list svn-id: r50722 --- engines/m4/globals.cpp | 1 + engines/m4/globals.h | 10 +++- engines/m4/mads_logic.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++- engines/m4/mads_logic.h | 5 ++ 4 files changed, 125 insertions(+), 4 deletions(-) diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index fb95adf29f..a96229a0b3 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -284,6 +284,7 @@ MadsGlobals::MadsGlobals(MadsEngine *vm): Globals(vm) { sceneNumber = -1; for (int i = 0; i < 3; ++i) actionNouns[i] = 0; + _difficultyLevel = 0; } MadsGlobals::~MadsGlobals() { diff --git a/engines/m4/globals.h b/engines/m4/globals.h index 5ab1ccd9a6..3fc31b4ec2 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -150,7 +150,7 @@ public: void pauseGame(bool value); }; -#define TOTAL_NUM_VARIABLES 256 +#define TOTAL_NUM_VARIABLES 210 #define PLAYER_INVENTORY 2 @@ -224,6 +224,11 @@ struct MadsConfigData { int screenFades; }; +#define GET_GLOBAL(x) (_madsVm->globals()->_globals[x]) +#define GET_GLOBAL32(x) (((uint32)_madsVm->globals()->_globals[x + 1] << 16) | _madsVm->globals()->_globals[x]) +#define SET_GLOBAL(x,y) _madsVm->globals()->_globals[x] = y +#define SET_GLOBAL32(x,y) { _madsVm->globals()->_globals[x] = (y) & 0xffff; _madsVm->globals()->_globals[(x) + 1] = (y) >> 16; } + typedef Common::HashMap IntStorage; class MadsGlobals : public Globals { @@ -246,7 +251,7 @@ public: ~MadsGlobals(); // MADS variables - int _globals[TOTAL_NUM_VARIABLES]; + uint16 _globals[TOTAL_NUM_VARIABLES]; MadsConfigData _config; bool playerSpriteChanged; MadsDialogType dialogType; @@ -255,6 +260,7 @@ public: int16 _nextSceneId; uint16 actionNouns[3]; IntStorage _dataMap; + int _difficultyLevel; void loadMadsVocab(); uint32 getVocabSize() { return _madsVocab.size(); } diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index c90fb11c11..8561963208 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -29,6 +29,114 @@ namespace M4 { +void MadsGameLogic::initialiseGlobals() { + // Clear the entire globals list + Common::set_to(&_madsVm->globals()->_globals[0], &_madsVm->globals()->_globals[TOTAL_NUM_VARIABLES], 0); + + SET_GLOBAL(4, 8); + SET_GLOBAL(33, 1); + SET_GLOBAL(10, 0xFFFF); + SET_GLOBAL(13, 0xFFFF); + SET_GLOBAL(15, 0xFFFF); + SET_GLOBAL(19, 0xFFFF); + SET_GLOBAL(20, 0xFFFF); + SET_GLOBAL(21, 0xFFFF); + SET_GLOBAL(95, 0xFFFF); + + // TODO: unknown sub call + + // Put the values 0 through 3 in a random ordering in global slots 83 - 86 + for (int idx = 0; idx < 4; ) { + int randVal = _madsVm->_random->getRandomNumber(4); + SET_GLOBAL(83 + idx, randVal); + + // Check whether the given value has already been used + bool flag = false; + for (int idx2 = 0; idx2 < idx; ++idx2) { + if (randVal == GET_GLOBAL(83 + idx2)) + flag = true; + } + + if (!flag) + ++idx; + } + + // Put the values 0 through 3 in a random ordering in global slots 87 - 90 + for (int idx = 0; idx < 4; ) { + int randVal = _madsVm->_random->getRandomNumber(3); + SET_GLOBAL(87 + idx, randVal); + + // Check whether the given value has already been used + bool flag = false; + for (int idx2 = 0; idx2 < idx; ++idx2) { + if (randVal == GET_GLOBAL(87 + idx2)) + flag = true; + } + + if (!flag) + ++idx; + } + + // Miscellaneous global settings + SET_GLOBAL(120, 501); + SET_GLOBAL(121, 0xFFFF); + SET_GLOBAL(110, 0xFFFF); + SET_GLOBAL(119, 1); + SET_GLOBAL(134, 4); + SET_GLOBAL(190, 201); + SET_GLOBAL(191, 301); + SET_GLOBAL(192, 413); + SET_GLOBAL(193, 706); + SET_GLOBAL(194, 801); + SET_GLOBAL(195, 551); + SET_GLOBAL(196, 752); + + // Fill out the globals 200 - 209 with unique random number values less than 10000 + for (int idx = 0; idx < 10; ) { + int randVal = _madsVm->_random->getRandomNumber(9999); + SET_GLOBAL(200 + idx, randVal); + + // Check whether the given value has already been used + bool flag = false; + for (int idx2 = 0; idx2 < idx; ++idx2) { + if (randVal == GET_GLOBAL(87 + idx2)) + flag = true; + } + + if (!flag) + ++idx; + } + + switch (_madsVm->globals()->_difficultyLevel) { + case 1: + // Very hard + SET_GLOBAL(35, 0); + // TODO: object set room + SET_GLOBAL(137, 5); + SET_GLOBAL(136, 0); + break; + + case 2: + // Hard + SET_GLOBAL(35, 0); + // TODO: object set room + SET_GLOBAL(136, 0xFFFF); + SET_GLOBAL(137, 6); + break; + + case 3: + // Easy + SET_GLOBAL(35, 2); + // TODO: object set room + break; + } + + _madsVm->_player._direction = 8; + _madsVm->_player._direction2 = 8; + + // TODO: unknown processing routine getting called for 'RXM' and 'ROX' +} + /*--------------------------------------------------------------------------*/ const char *MadsSceneLogic::formAnimName(char sepChar, int16 suffixNum) { @@ -299,6 +407,7 @@ void MadsSceneLogic::enterScene() { _madsVm->_player._playerPos = Common::Point(68, 140); _madsVm->_player._direction = 4; _madsVm->_player._visible = false; + _madsVm->_player._stepEnabled = false; dataMap()[0x56FC] = 0; dataMap()[0x5482] = 0; @@ -323,9 +432,9 @@ void MadsSceneLogic::sceneStep() { case 71: _madsVm->globals()->_globals[10] = 0; _madsVm->_player._visible = true; - dataMap()[0x56FC] = 0; + _madsVm->_player._stepEnabled = true; - _madsVm->scene()->_newTimeout = _madsVm->_currentTimer - _madsVm->scene()->_ticksAmount; + _madsVm->_player._priorTimer = _madsVm->_currentTimer - _madsVm->_player._ticksAmount; break; case 72: case 73: diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 3c6cb8edf1..98d6df6163 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -63,6 +63,11 @@ public: void sceneStep(); }; +class MadsGameLogic { +public: + static void initialiseGlobals(); +}; + } #endif -- cgit v1.2.3 From c89fe5f6d56b6d6e11b7d642e85633bc86098ce8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 6 Jul 2010 11:33:09 +0000 Subject: Added support for idle character animations svn-id: r50723 --- engines/m4/assets.cpp | 4 +- engines/m4/assets.h | 4 +- engines/m4/m4.cpp | 2 + engines/m4/mads_player.cpp | 190 +++++++++++++++++++++++++++++++++++++++++---- engines/m4/mads_player.h | 11 ++- engines/m4/mads_scene.cpp | 8 +- engines/m4/mads_views.cpp | 13 ++-- engines/m4/mads_views.h | 3 +- 8 files changed, 205 insertions(+), 30 deletions(-) diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index 9cfb7afc4c..23122eb960 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -632,9 +632,9 @@ int32 AssetManager::getSpriteFrameCount(int32 hash) { //-------------------------------------------------------------------------- MadsSpriteSetCharInfo::MadsSpriteSetCharInfo(Common::SeekableReadStream *s) { - _frameNumber = s->readByte(); + _totalFrames = s->readByte(); s->skip(1); - _hasIdling = s->readUint16LE() != 0; + _numEntries = s->readUint16LE(); for (int i = 0; i < 16; ++i) _frameList[i] = s->readUint16LE(); diff --git a/engines/m4/assets.h b/engines/m4/assets.h index e9902d8aa6..3ae7fb2e22 100644 --- a/engines/m4/assets.h +++ b/engines/m4/assets.h @@ -106,8 +106,8 @@ class MadsSpriteSetCharInfo { public: MadsSpriteSetCharInfo(Common::SeekableReadStream *s); - int _frameNumber; - int _hasIdling; + int _totalFrames; + int _numEntries; int _frameList2[16]; int _frameList[16]; int _ticksList[16]; diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index f5c6d260a9..a999a6bd5a 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -538,6 +538,8 @@ Common::Error MadsEngine::run() { //printf("%s\n----------\n", _globals->loadMessage(i)); if (getGameType() == GType_RexNebular) { + MadsGameLogic::initialiseGlobals(); + _scene = NULL; loadMenu(MAIN_MENU); } else { diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 57cb9eefd3..bb7a1b406d 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -38,6 +38,9 @@ MadsPlayer::MadsPlayer() { _direction = 0; _direction2 = 0; _forceRefresh = true; + _stepEnabled = true; + _ticksAmount = 3; + _priorTimer = 0; _visible = true; _priorVisible = false; _visible3 = false; @@ -53,7 +56,7 @@ MadsPlayer::MadsPlayer() { _frameNum = 0; _frameOffset = 0; _unk1 = 0; - _newFrame = 0; + _frameCount = 0; _frameListIndex = 0; _actionIndex = 0; resetActionList(); @@ -154,7 +157,7 @@ void MadsPlayer::update() { if (equal) // Undo the prior expiry of the player sprite - slot.spriteType = SPRITE_ZERO; + s2.spriteType = SPRITE_ZERO; else slotIndex = -1; } @@ -175,13 +178,13 @@ void MadsPlayer::update() { } /** - * Idling animation for player + * Updates the animation frame for the player */ -void MadsPlayer::idle() { +void MadsPlayer::updateFrame() { SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); assert(spriteSet._charInfo); - if (!spriteSet._charInfo->_hasIdling) { + if (!spriteSet._charInfo->_numEntries) { _frameNum = 1; } else { _frameListIndex = _actionList[_actionIndex]; @@ -204,7 +207,7 @@ void MadsPlayer::idle() { if (frameIndex == 0) setTicksAmount(); else - _madsVm->scene()->_ticksAmount = spriteSet._charInfo->_ticksList[frameIndex]; + _madsVm->_player._ticksAmount = spriteSet._charInfo->_ticksList[frameIndex]; } } @@ -223,19 +226,103 @@ void MadsPlayer::setupFrame() { _unk1 = MAX(spriteSet._charInfo->_unk1, 100); setTicksAmount(); - _newFrame = spriteSet._charInfo->_frameNumber; - if (_newFrame == 0) - _newFrame = spriteSet.getCount(); + _frameCount = spriteSet._charInfo->_totalFrames; + if (_frameCount == 0) + _frameCount = spriteSet.getCount(); _yScale = spriteSet._charInfo->_yScale; - if ((_frameNum <= 0) || (_frameNum > _newFrame)) + if ((_frameNum <= 0) || (_frameNum > _frameCount)) _frameNum = 1; _forceRefresh = true; } void MadsPlayer::step() { + if (_visible && _stepEnabled && !_moving && (_direction == _direction2) && (_madsVm->_currentTimer >= GET_GLOBAL32(2))) { + if (_actionIndex == 0) { + int randVal = _vm->_random->getRandomNumber(29999); + + if (GET_GLOBAL(0) == SEX_MALE) { + switch (_direction) { + case 1: + case 3: + case 7: + case 9: + if (randVal < 200) { + queueAction(-1, 0); + queueAction(1, 0); + } + break; + + case 2: + if (randVal < 500) { + for (int i = 0; i < 10; ++i) + queueAction((randVal < 250) ? 1 : 2, 0); + } else if (randVal < 750) { + for (int i = 0; i < 5; ++i) + queueAction(1, 0); + queueAction(0, 0); + for (int i = 0; i < 5; ++i) + queueAction(2, 0); + } + break; + + case 4: + case 6: + if (randVal < 500) { + for (int i = 0; i < 10; ++i) + queueAction(1, 0); + } + break; + + case 5: + case 8: + if (randVal < 200) { + queueAction(-1, 0); + queueAction(1, 0); + } + break; + } + } + } + + SET_GLOBAL32(2, GET_GLOBAL32(2) + 6); + } + + if (GET_GLOBAL(138) == 1) { + uint32 diff = _madsVm->_currentTimer - GET_GLOBAL32(142); + if (diff > 60) { + SET_GLOBAL32(144, GET_GLOBAL32(144) + 1); + } else { + SET_GLOBAL32(144, GET_GLOBAL32(144) + diff); + } + + SET_GLOBAL32(142, _madsVm->_currentTimer); + } +} + +void MadsPlayer::nextFrame() { + if (_madsVm->_currentTimer >= (_priorTimer + _ticksAmount)) { + _priorTimer = _madsVm->_currentTimer; + + if (_moving) + move(); + else + idle(); + + // Post update logic + if (_moving) { + ++_frameNum; + if (_frameNum > _frameCount) + _frameNum = 1; + _forceRefresh = true; + } else if (!_forceRefresh) { + idle(); + } + // Final update + update(); + } } int MadsPlayer::getScale(int yp) { @@ -262,9 +349,9 @@ int MadsPlayer::getSpriteSlot() { void MadsPlayer::setTicksAmount() { SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); assert(spriteSet._charInfo); - _madsVm->scene()->_ticksAmount = spriteSet._charInfo->_ticksAmount; - if (_madsVm->scene()->_ticksAmount == 0) - _madsVm->scene()->_ticksAmount = 6; + _madsVm->_player._ticksAmount = spriteSet._charInfo->_ticksAmount; + if (_madsVm->_player._ticksAmount == 0) + _madsVm->_player._ticksAmount = 6; } void MadsPlayer::resetActionList() { @@ -279,7 +366,7 @@ int MadsPlayer::queueAction(int action1, int action2) { SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); assert(spriteSet._charInfo); - if ((spriteSet._charInfo->_hasIdling) && (_actionIndex < 11)) { + if ((action1 < spriteSet._charInfo->_numEntries) && (_actionIndex < 11)) { ++_actionIndex; _actionList[_actionIndex] = action1; _actionList2[_actionIndex] = action2; @@ -289,4 +376,79 @@ int MadsPlayer::queueAction(int action1, int action2) { return true; } +void MadsPlayer::idle() { + if (_direction != _direction2) { + // The direction has changed, so reset for new direction + dirChanged(); + return; + } + + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + assert(spriteSet._charInfo); + if (spriteSet._charInfo->_numEntries == 0) + // No entries, so exit immediately + return; + + int frameIndex = ABS(_frameListIndex); + int direction = (_frameListIndex < 0) ? -1 : 1; + + if (frameIndex >= spriteSet._charInfo->_numEntries) + // Reset back to the start of the list + _frameListIndex = 0; + else { + _frameNum += direction; + _forceRefresh = true; + + if (spriteSet._charInfo->_frameList2[frameIndex] < _frameNum) { + _unk3 = _unk2; + updateFrame(); + } + if (spriteSet._charInfo->_frameList[frameIndex] < _frameNum) { + _unk3 = _unk2; + updateFrame(); + } + } +} + +void MadsPlayer::move() { + // TODO: Handle player movement +} + +void MadsPlayer::dirChanged() { + int dirIndex = 0, dirIndex2 = 0; + int newDir = 0, newDir2 = 0; + + if (_direction != _direction2) { + // Find the index for the given direction in the player direction list + int tempDir = _direction; + do { + ++dirIndex; + newDir += tempDir; + tempDir = _directionListIndexes[tempDir + 10]; + } while (tempDir != _direction2); + } + + + if (_direction != _direction2) { + // Find the index for the given direction in the player direction list + int tempDir = _direction; + do { + ++dirIndex2; + newDir2 += tempDir; + tempDir = _directionListIndexes[tempDir + 10]; + } while (tempDir != _direction2); + } + + int diff = dirIndex - dirIndex2; + if (diff == 0) + diff = newDir - newDir2; + + _direction = (diff >= 0) ? _directionListIndexes[_direction] : _directionListIndexes[_direction + 10]; + setupFrame(); + if ((_direction == _direction2) && !_moving) + updateFrame(); + + _priorTimer += 1; +} + } // End of namespace M4 diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index 7285796309..7db45cae43 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -39,13 +39,19 @@ private: void setTicksAmount(); void resetActionList(); int queueAction(int v0, int v1); + void idle(); + void move(); + void dirChanged(); public: char _spritesPrefix[16]; int _spriteSetCount; bool _spriteSetsPresent[8]; Common::Point _playerPos; Common::Point _destPos; + uint32 _priorTimer; + uint _ticksAmount; int16 _direction, _direction2; + bool _stepEnabled; bool _visible, _priorVisible; bool _visible3; bool _forceRefresh; @@ -57,7 +63,7 @@ public: uint16 _frameOffset, _frameNum; bool _moving; int _unk1; - int _newFrame; + int _frameCount; int _frameListIndex; int _actionIndex; int _actionList[12]; @@ -71,9 +77,10 @@ public: bool loadSprites(const char *prefix); void update(); - void idle(); + void updateFrame(); void setupFrame(); void step(); + void nextFrame(); }; } // End of namespace M4 diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 66883dd13c..3e838fc1c0 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -167,7 +167,7 @@ void MadsScene::loadScene(int sceneNumber) { _madsVm->_player._destPos = _madsVm->_player._destPos; _madsVm->_player._direction2 = _madsVm->_player._direction; _madsVm->_player.setupFrame(); - _madsVm->_player.idle(); + _madsVm->_player.updateFrame(); // Purge resources _vm->res()->purge(); @@ -337,9 +337,15 @@ void MadsScene::updateState() { // Step through the scene _sceneLogic.sceneStep(); + _madsVm->_player.step(); + _madsVm->_player._unk3 = 0; + if (_abortTimersMode == ABORTMODE_1) _abortTimers = 0; + // Handle updating the player frame + _madsVm->_player.nextFrame(); + if ((_activeAnimation) && !_abortTimers) { _activeAnimation->update(); if (((MadsAnimation *) _activeAnimation)->freeFlag()) { diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 580f54b1c0..d7e6435b14 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -426,15 +426,15 @@ int MadsKernelMessageList::add(const Common::Point &pt, uint fontColour, uint8 f for (int i = 0; i < 3; ++i) rec.actionNouns[i] = _madsVm->globals()->actionNouns[i]; - if (flags & KMSG_OWNER_TIMEOUT) - rec.frameTimer = _owner._ticksAmount + _owner._newTimeout; + if (flags & KMSG_PLAYER_TIMEOUT) + rec.frameTimer = _madsVm->_player._ticksAmount + _madsVm->_player._priorTimer; return idx; } int MadsKernelMessageList::addQuote(int quoteId, int abortTimers, uint32 timeout) { const char *quoteStr = _madsVm->globals()->getQuote(quoteId); - return add(Common::Point(0, 0), 0x1110, KMSG_OWNER_TIMEOUT | KMSG_CENTER_ALIGN, abortTimers, timeout, quoteStr); + return add(Common::Point(0, 0), 0x1110, KMSG_PLAYER_TIMEOUT | KMSG_CENTER_ALIGN, abortTimers, timeout, quoteStr); } void MadsKernelMessageList::scrollMessage(int msgIndex, int numTicks, bool quoted) { @@ -450,8 +450,8 @@ void MadsKernelMessageList::scrollMessage(int msgIndex, int numTicks, bool quote _entries[msgIndex].asciiChar = *msgP; _entries[msgIndex].asciiChar2 = *(msgP + 1); - if (_entries[msgIndex].flags & KMSG_OWNER_TIMEOUT) - _entries[msgIndex].frameTimer2 = _owner._ticksAmount + _owner._newTimeout; + if (_entries[msgIndex].flags & KMSG_PLAYER_TIMEOUT) + _entries[msgIndex].frameTimer2 = _madsVm->_player._ticksAmount + _madsVm->_player._priorTimer; _entries[msgIndex].frameTimer = _entries[msgIndex].frameTimer2; } @@ -545,7 +545,7 @@ void MadsKernelMessageList::processText(int msgIndex) { } } - if (msg.flags & KMSG_OWNER_TIMEOUT) { + if (msg.flags & KMSG_PLAYER_TIMEOUT) { if (word_8469E != 0) { // TODO: Figure out various flags } else { @@ -1211,7 +1211,6 @@ MadsView::MadsView(View *view): _view(view), _dynamicHotspots(*this), _sequenceL _kernelMessages(*this), _spriteSlots(*this), _dirtyAreas(*this), _textDisplay(*this) { _textSpacing = -1; - _ticksAmount = 3; _newTimeout = 0; _abortTimers = 0; _abortTimers2 = 0; diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index ead6ae94bf..0604ae1ee1 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -149,7 +149,7 @@ public: #define TIMED_TEXT_SIZE 10 #define INDEFINITE_TIMEOUT 9999999 -enum KernelMessageFlags {KMSG_QUOTED = 1, KMSG_OWNER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, KMSG_RIGHT_ALIGN = 0x10, +enum KernelMessageFlags {KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, KMSG_RIGHT_ALIGN = 0x10, KMSG_CENTER_ALIGN = 0x20, KMSG_EXPIRE = 0x40, KMSG_ACTIVE = 0x80}; class MadsKernelMessageEntry { @@ -395,7 +395,6 @@ public: MadsDirtyAreas _dirtyAreas; int _textSpacing; - int _ticksAmount; uint32 _newTimeout; int _abortTimers; int8 _abortTimers2; -- cgit v1.2.3 From a7cd1534c6d3a325e36db42314e22ff3d8bdc8dd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 6 Jul 2010 14:10:09 +0000 Subject: SCI: fix regression of r50721 - pausing/resuming only on actual menu usage svn-id: r50724 --- engines/sci/engine/kmenu.cpp | 10 +--------- engines/sci/graphics/menu.cpp | 18 +++++++++++------- engines/sci/graphics/menu.h | 6 +++--- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/engines/sci/engine/kmenu.cpp b/engines/sci/engine/kmenu.cpp index 69ec07559e..c8a6e03556 100644 --- a/engines/sci/engine/kmenu.cpp +++ b/engines/sci/engine/kmenu.cpp @@ -91,16 +91,8 @@ reg_t kDrawMenuBar(EngineState *s, int argc, reg_t *argv) { reg_t kMenuSelect(EngineState *s, int argc, reg_t *argv) { reg_t eventObject = argv[0]; bool pauseSound = argc > 1 ? (argv[1].isNull() ? false : true) : true; - reg_t result; - if (pauseSound) - g_sci->_soundCmd->pauseAll(true); - - result = g_sci->_gfxMenu->kernelSelect(eventObject); - - if (pauseSound) - g_sci->_soundCmd->pauseAll(false); - return result; + return g_sci->_gfxMenu->kernelSelect(eventObject, pauseSound); } } // End of namespace Sci diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index d85d4456fc..f959ffb3a5 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -382,7 +382,7 @@ void GfxMenu::calculateMenuAndItemWidth() { } } -reg_t GfxMenu::kernelSelect(reg_t eventObject) { +reg_t GfxMenu::kernelSelect(reg_t eventObject, bool pauseSound) { int16 eventType = readSelectorValue(_segMan, eventObject, SELECTOR(type)); int16 keyPress, keyModifier; Common::Point mousePosition; @@ -407,9 +407,9 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject) { case 0: break; case SCI_KEY_ESC: - interactiveShowMouse(); + interactiveStart(pauseSound); itemEntry = interactiveWithKeyboard(); - interactiveRestoreMouse(); + interactiveEnd(pauseSound); forceClaimed = true; break; default: @@ -445,9 +445,9 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject) { case SCI_EVENT_MOUSE_PRESS: mousePosition = _cursor->getPosition(); if (mousePosition.y < 10) { - interactiveShowMouse(); + interactiveStart(pauseSound); itemEntry = interactiveWithMouse(); - interactiveRestoreMouse(); + interactiveEnd(pauseSound); forceClaimed = true; } break; @@ -632,12 +632,16 @@ void GfxMenu::invertMenuSelection(uint16 itemId) { _paint16->bitsShow(itemRect); } -void GfxMenu::interactiveShowMouse() { +void GfxMenu::interactiveStart(bool pauseSound) { _mouseOldState = _cursor->isVisible(); _cursor->kernelShow(); + if (pauseSound) + g_sci->_soundCmd->pauseAll(true); } -void GfxMenu::interactiveRestoreMouse() { +void GfxMenu::interactiveEnd(bool pauseSound) { + if (pauseSound) + g_sci->_soundCmd->pauseAll(false); if (!_mouseOldState) _cursor->kernelHide(); } diff --git a/engines/sci/graphics/menu.h b/engines/sci/graphics/menu.h index b72d518977..9a14d4c64a 100644 --- a/engines/sci/graphics/menu.h +++ b/engines/sci/graphics/menu.h @@ -92,7 +92,7 @@ public: reg_t kernelGetAttribute(uint16 menuId, uint16 itemId, uint16 attributeId); void drawBar(); - reg_t kernelSelect(reg_t eventObject); + reg_t kernelSelect(reg_t eventObject, bool pauseSound); void kernelDrawStatus(const char *text, int16 colorPen, int16 colorBack); void kernelDrawMenuBar(bool clear); @@ -103,8 +103,8 @@ private: void calculateMenuAndItemWidth(); void drawMenu(uint16 oldMenuId, uint16 newMenuId); void invertMenuSelection(uint16 itemId); - void interactiveShowMouse(); - void interactiveRestoreMouse(); + void interactiveStart(bool pauseSound); + void interactiveEnd(bool pauseSound); GuiMenuItemEntry *interactiveWithKeyboard(); GuiMenuItemEntry *interactiveWithMouse(); uint16 mouseFindMenuSelection(Common::Point mousePosition); -- cgit v1.2.3 From c349d7130c1716b5b87a5cb9f740f8467c16dde4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 6 Jul 2010 14:26:29 +0000 Subject: SCI: removing invalid reference error from signature checking, instead adding new type "invalid", so that full call parameter debug information is available svn-id: r50725 --- engines/sci/console.cpp | 5 ++++- engines/sci/engine/kernel.cpp | 5 +++-- engines/sci/engine/kernel.h | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 7e5d77d99a..e684532b08 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3149,7 +3149,7 @@ void Console::printBasicVarInfo(reg_t variable) { int segType = g_sci->getKernel()->findRegType(variable); SegManager *segMan = g_sci->getEngineState()->_segMan; - segType &= SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_NODE | SIG_TYPE_LIST | SIG_TYPE_UNINITIALIZED; + segType &= SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_NODE | SIG_TYPE_LIST | SIG_TYPE_UNINITIALIZED | SIG_TYPE_INVALID; switch (segType) { case SIG_TYPE_INTEGER: { @@ -3173,6 +3173,9 @@ void Console::printBasicVarInfo(reg_t variable) { case SIG_TYPE_UNINITIALIZED: DebugPrintf(" (uninitialized)"); break; + case SIG_TYPE_INVALID: + DebugPrintf(" (invalid)"); + break; default: DebugPrintf(" (??\?)"); } diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 0d0b9a30d3..2a378564bb 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -719,10 +719,10 @@ int Kernel::findRegType(reg_t reg) { // Otherwise it's an object SegmentObj *mobj = _segMan->getSegmentObj(reg.segment); if (!mobj) - return 0; // Invalid + return SIG_TYPE_INVALID; if (!mobj->isValidOffset(reg.offset)) - error("[KERN] ref %04x:%04x is invalid", PRINT_REG(reg)); + return SIG_TYPE_INVALID; switch (mobj->getType()) { case SEG_TYPE_SCRIPT: @@ -762,6 +762,7 @@ static const SignatureDebugType signatureDebugTypeList[] = { { SIG_TYPE_NULL, "null" }, { SIG_TYPE_INTEGER, "integer" }, { SIG_TYPE_UNINITIALIZED, "uninitialized" }, + { SIG_TYPE_INVALID, "invalid" }, { SIG_TYPE_OBJECT, "object" }, { SIG_TYPE_REFERENCE, "reference" }, { SIG_TYPE_LIST, "list" }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index a0b91b8601..719db41e8d 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -101,6 +101,7 @@ enum { SIG_TYPE_NULL = 0x01, // may be 0:0 [0] SIG_TYPE_INTEGER = 0x02, // may be 0:* [i], automatically also allows null SIG_TYPE_UNINITIALIZED = 0x04, // may be FFFF:* -> not allowable, only used for comparsion + SIG_TYPE_INVALID = 0x08, // invalid segment or offset -> not allowable, only used for comparsion SIG_TYPE_OBJECT = 0x10, // may be object [o] SIG_TYPE_REFERENCE = 0x20, // may be reference [r] SIG_TYPE_LIST = 0x40, // may be list [l] -- cgit v1.2.3 From 2343f8c60d8291c1cd081339865837c43fe1f55d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 6 Jul 2010 22:13:43 +0000 Subject: DS: Add isScrollingWithDPad() to make code more readable svn-id: r50727 --- backends/platform/ds/arm9/source/dsmain.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index dc52038cec..8d51eff3da 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -383,6 +383,9 @@ void uploadSpriteGfx(); static TransferSound soundControl; +static bool isScrollingWithDPad() { + return (getKeysHeld() & (KEY_L | KEY_R)) != 0; +} bool isCpuScalerEnabled() { return cpuScalerEnable || !displayModeIs8Bit; @@ -1339,7 +1342,7 @@ void doScreenTapMode(OSystem_DS *system) { right = true; } - if (!(getKeysHeld() & (KEY_L | KEY_R))) { + if (!isScrollingWithDPad()) { if (getKeysDown() & KEY_LEFT) { event.type = Common::EVENT_LBUTTONDOWN; @@ -1376,7 +1379,7 @@ void doButtonSelectMode(OSystem_DS *system) { Common::Event event; - if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) { + if (!isScrollingWithDPad()) { event.type = Common::EVENT_MOUSEMOVE; event.mouse = Common::Point(getPenX(), getPenY()); system->addEvent(event); @@ -1399,7 +1402,7 @@ void doButtonSelectMode(OSystem_DS *system) { if ((mouseMode != MOUSE_HOVER) || (!displayModeIs8Bit)) { - if (getPenDown() && (!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) { + if (getPenDown() && !isScrollingWithDPad()) { if (mouseMode == MOUSE_LEFT) { event.type = Common::EVENT_LBUTTONDOWN; leftButtonDown = true; @@ -1441,7 +1444,7 @@ void doButtonSelectMode(OSystem_DS *system) { } } - if (!((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (!getIndyFightState()) && (!getKeyboardEnable())) { + if (!isScrollingWithDPad() && !getIndyFightState() && !getKeyboardEnable()) { if (!getPenHeld() || (mouseMode != MOUSE_HOVER)) { if (getKeysDown() & KEY_LEFT) { @@ -1537,7 +1540,7 @@ void addEventsToQueue() { if (!indyFightState) { - if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_B)) { + if (!isScrollingWithDPad() && (getKeysDown() & KEY_B)) { if (s_currentGame->control == CONT_AGI) { event.kbd.keycode = Common::KEYCODE_RETURN; event.kbd.ascii = 13; @@ -1609,7 +1612,7 @@ void addEventsToQueue() { } - if (!((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (!getIndyFightState()) && (!getKeyboardEnable())) { + if (!isScrollingWithDPad() && !getIndyFightState() && !getKeyboardEnable()) { if ((getKeysDown() & KEY_A) && (!indyFightState)) { gameScreenSwap = !gameScreenSwap; @@ -1648,7 +1651,7 @@ void addEventsToQueue() { } } - if (!getIndyFightState() && !((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_X)) { + if (!getIndyFightState() && !isScrollingWithDPad() && (getKeysDown() & KEY_X)) { setKeyboardEnable(!keyboardEnable); } @@ -1670,7 +1673,7 @@ void addEventsToQueue() { if (!keyboardEnable) { - if (((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) || (indyFightState)) && (displayModeIs8Bit)) { + if ((isScrollingWithDPad() || (indyFightState)) && (displayModeIs8Bit)) { // Controls specific to the control method if (s_currentGame->control == CONT_SKY) { @@ -2012,7 +2015,7 @@ void VBlankHandler(void) { soundUpdate(); - if ((!gameScreenSwap) && (!(getKeysHeld() & KEY_L) && !(getKeysHeld() & KEY_R))) { + if ((!gameScreenSwap) && !isScrollingWithDPad()) { if (s_currentGame) { if (s_currentGame->control != CONT_SCUMM_SAMNMAX) { if (getPenHeld() && (getPenY() < SCUMM_GAME_HEIGHT)) { @@ -2054,7 +2057,7 @@ void VBlankHandler(void) { callbackTimer -= FRAME_TIME; } - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { if ((!dragging) && (getPenHeld()) && (penDownFrames > 5)) { dragging = true; @@ -2108,7 +2111,7 @@ void VBlankHandler(void) { bool zooming = false; - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { if ((getKeysHeld() & KEY_A) && (subScreenScale < ratio)) { subScreenScale += 1; zooming = true; @@ -2185,7 +2188,7 @@ void VBlankHandler(void) { if (displayModeIs8Bit) { - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { int offsX = 0, offsY = 0; -- cgit v1.2.3 From 9b927b414aadf954f3f4fce9a80b86f3e26c154d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 6 Jul 2010 22:14:06 +0000 Subject: DS: Implemented (ugly, but working) support for optimization level overrides svn-id: r50728 --- backends/platform/ds/ds.mk | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index c8002a6204..66afa01a1f 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -61,9 +61,6 @@ LOGO = logoa.bmp # Files in this list will be optimisied for speed, otherwise they will be optimised for space -OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp fmopl.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp -#OPTLIST := - # Compiler options for files which should be optimised for speed OPT_SPEED := -O3 @@ -71,16 +68,32 @@ OPT_SPEED := -O3 OPT_SIZE := -Os -mthumb -#-mthumb -fno-gcse -fno-schedule-insns2 - - -#OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) - - -# TODO: Handle files in OPTLIST. -# For this, the list should be made explicit. So, replace actor.cpp by path/to/actor.cpp -- -# in fact, there are several actor.cpp files, and right now all are "optimized", but -# I think Neil only had the SAGA one in mind. Same for gfx.cpp +# TODO: The original list contained three more files that should be optimized +# for size: actor.cpp gfx.cpp sprite.cpp -- but there are many files with these +# names, which are the "right" ones? +$(ndsdir)/arm9/source/dsmain.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +$(ndsdir)/arm9/source/osystem_ds.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +$(ndsdir)/arm9/source/ds_main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +sound/rate.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/actor_path.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +sound/fmopl.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/saga/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +# TODO: Fingolfin says: optimizing staticres for size would +# save about 30k, so maybe consider that? +#engines/kyra/staticres.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -- cgit v1.2.3 From fe409ea2692db8eb9d95564c03b166fb7baa316e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 6 Jul 2010 22:29:45 +0000 Subject: DS: cleanup arm9/makefile svn-id: r50729 --- backends/platform/ds/arm9/makefile | 38 +++++--------------------------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index d1b1cf55d6..ae5fce531b 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -333,13 +333,11 @@ OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp i # Compiler options for files which should be optimised for speed ifdef DS_BUILD_E -# Another attempt to save some RAM in ITE -OPT_SPEED := -O3 -mthumb + # Another attempt to save some RAM in ITE + OPT_SPEED := -O3 -mthumb else -#OPT_SPEED := -O3 - -OPT_SPEED := -Os -mthumb - + #OPT_SPEED := -O3 + OPT_SPEED := -Os -mthumb endif # Compiler options for files which should be optimised for space @@ -379,14 +377,6 @@ dist : SCUMMVM.BIN plugins plugin_dist #--------------------------------------------------------------------------------- # canned command sequence for binary data #--------------------------------------------------------------------------------- -#define bin2o -# bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) -# echo "extern const u8" `(echo $( `(echo $(> `(echo $(> `(echo $( `(echo $( $(*).h -# echo "extern const u32" $(notdir $(*))_size[]";" >> $(*).h -# -# echo $(*).h -# rm $(*).tmp -#endef - - ############## # Replacement rule for the one in makefile.common ############## @@ -474,10 +448,8 @@ endef padbin 16 $(basename $@).ds.gba #--------------------------------------------------------------------------------- -# FIXME: The following rule hardcodes the input & output filename -- shouldn't it use $< and $@ instead? %.bin: %.elf - $(OBJCOPY) -S scummvm.elf scummvm-stripped.elf - $(OBJCOPY) -O binary scummvm-stripped.elf scummvm.bin + $(OBJCOPY) -S -O binary $< $@ #%.o: %.s # $(MKDIR) $(*D)/$(DEPDIR) -- cgit v1.2.3 From afd285005825926ee4f26b7ca5b20d2450efe211 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 6 Jul 2010 23:24:36 +0000 Subject: SCI: Add version to obsolete string This way, if we ever get rid of support for savegames with version <= 23, we can also get rid of this syncString() call. Without this change, it would have "infected" every new savegame version, forever. svn-id: r50730 --- engines/sci/engine/savegame.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index dd8c3ca31d..5d82786b9a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -286,7 +286,7 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be savegame_version Common::String tmp; - s.syncString(tmp); // OBSOLETE: Used to be game_version + s.syncString(tmp, VER(9), VER(23)); // OBSOLETE: Used to be game_version s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be version // OBSOLETE: Saved menus. Skip all of the saved data @@ -746,7 +746,7 @@ void SegManager::reconstructClones() { if (!baseObj) error("Clone entry without a base class: %d", j); } // end for - } // end if + } // end if } // end for } -- cgit v1.2.3 From dd5f6f13e292e3ca8c63997fb1360fc39b5426e3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 7 Jul 2010 11:02:11 +0000 Subject: Bugfixes and changed field names in the player class to be more explanatory. Implemented Ctrl-T to turn the player - the original game used Ctrl-U, but this is reserved by ScummVM for toggle Mute. svn-id: r50734 --- engines/m4/mads_logic.cpp | 2 +- engines/m4/mads_player.cpp | 44 ++++++++++++++++++++++---------------------- engines/m4/mads_player.h | 4 ++-- engines/m4/mads_scene.cpp | 8 ++++---- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index 8561963208..e451a306ef 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -132,7 +132,7 @@ void MadsGameLogic::initialiseGlobals() { } _madsVm->_player._direction = 8; - _madsVm->_player._direction2 = 8; + _madsVm->_player._newDirection = 8; // TODO: unknown processing routine getting called for 'RXM' and 'ROX' } diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index bb7a1b406d..8531a3ed44 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -36,7 +36,7 @@ const int MadsPlayer::_directionListIndexes[32] = { MadsPlayer::MadsPlayer() { _playerPos = Common::Point(160, 78); _direction = 0; - _direction2 = 0; + _newDirection = 0; _forceRefresh = true; _stepEnabled = true; _ticksAmount = 3; @@ -46,8 +46,8 @@ MadsPlayer::MadsPlayer() { _visible3 = false; _yScale = 0; _moving = false; + _spriteListStart = 0; _spriteListIdx = 0; - _spriteListIdx2 = 0; _spritesChanged = true; _currentScale = 0; strcpy(_spritesPrefix, ""); @@ -93,7 +93,7 @@ bool MadsPlayer::loadSprites(const char *prefix) { int setIndex = _madsVm->scene()->_spriteSlots.addSprites(setName, true, SPRITE_SET_CHAR_INFO); if (setIndex < 0) { - if (idx < 7) + if (idx < 5) break; _spriteSetsPresent[idx] = false; } else { @@ -101,7 +101,7 @@ bool MadsPlayer::loadSprites(const char *prefix) { } if (idx == 0) - _spriteListIdx = setIndex; + _spriteListStart = setIndex; } result = 0; @@ -141,7 +141,7 @@ void MadsPlayer::update() { MadsSpriteSlot slot; slot.spriteType = FOREGROUND_SPRITE; slot.seqIndex = PLAYER_SEQ_INDEX; - slot.spriteListIndex = _spriteListIdx + _spriteListIdx2; + slot.spriteListIndex = _spriteListStart + _spriteListIdx; slot.frameNumber = _frameOffset + _frameNum; slot.xp = _playerPos.x; slot.yp = _playerPos.y + (_yScale * newScale) / 100; @@ -181,7 +181,7 @@ void MadsPlayer::update() { * Updates the animation frame for the player */ void MadsPlayer::updateFrame() { - SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListStart + _spriteListIdx); assert(spriteSet._charInfo); if (!spriteSet._charInfo->_numEntries) { @@ -214,14 +214,14 @@ void MadsPlayer::updateFrame() { void MadsPlayer::setupFrame() { resetActionList(); _frameOffset = 0; - _spriteListIdx2 = _directionListIndexes[_direction]; - if (!_spriteSetsPresent[_spriteListIdx2]) { + _spriteListIdx = _directionListIndexes[_direction]; + if (!_spriteSetsPresent[_spriteListIdx]) { // Direction isn't present, so use alternate direction, with entries flipped - _spriteListIdx2 -= 4; + _spriteListIdx -= 4; _frameOffset = 0x8000; } - SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListStart + _spriteListIdx); assert(spriteSet._charInfo); _unk1 = MAX(spriteSet._charInfo->_unk1, 100); setTicksAmount(); @@ -238,7 +238,7 @@ void MadsPlayer::setupFrame() { } void MadsPlayer::step() { - if (_visible && _stepEnabled && !_moving && (_direction == _direction2) && (_madsVm->_currentTimer >= GET_GLOBAL32(2))) { + if (_visible && _stepEnabled && !_moving && (_direction == _newDirection) && (_madsVm->_currentTimer >= GET_GLOBAL32(2))) { if (_actionIndex == 0) { int randVal = _vm->_random->getRandomNumber(29999); @@ -347,7 +347,7 @@ int MadsPlayer::getSpriteSlot() { } void MadsPlayer::setTicksAmount() { - SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListStart + _spriteListIdx); assert(spriteSet._charInfo); _madsVm->_player._ticksAmount = spriteSet._charInfo->_ticksAmount; if (_madsVm->_player._ticksAmount == 0) @@ -363,7 +363,7 @@ void MadsPlayer::resetActionList() { } int MadsPlayer::queueAction(int action1, int action2) { - SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListStart + _spriteListIdx); assert(spriteSet._charInfo); if ((action1 < spriteSet._charInfo->_numEntries) && (_actionIndex < 11)) { @@ -377,13 +377,13 @@ int MadsPlayer::queueAction(int action1, int action2) { } void MadsPlayer::idle() { - if (_direction != _direction2) { + if (_direction != _newDirection) { // The direction has changed, so reset for new direction dirChanged(); return; } - SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListIdx + _spriteListIdx2); + SpriteAsset &spriteSet = _madsVm->scene()->_spriteSlots.getSprite(_spriteListStart + _spriteListIdx); assert(spriteSet._charInfo); if (spriteSet._charInfo->_numEntries == 0) // No entries, so exit immediately @@ -418,34 +418,34 @@ void MadsPlayer::dirChanged() { int dirIndex = 0, dirIndex2 = 0; int newDir = 0, newDir2 = 0; - if (_direction != _direction2) { + if (_direction != _newDirection) { // Find the index for the given direction in the player direction list int tempDir = _direction; do { ++dirIndex; newDir += tempDir; tempDir = _directionListIndexes[tempDir + 10]; - } while (tempDir != _direction2); + } while (tempDir != _newDirection); } - if (_direction != _direction2) { + if (_direction != _newDirection) { // Find the index for the given direction in the player direction list int tempDir = _direction; do { ++dirIndex2; newDir2 += tempDir; - tempDir = _directionListIndexes[tempDir + 10]; - } while (tempDir != _direction2); + tempDir = _directionListIndexes[tempDir + 20]; + } while (tempDir != _newDirection); } int diff = dirIndex - dirIndex2; if (diff == 0) diff = newDir - newDir2; - _direction = (diff >= 0) ? _directionListIndexes[_direction] : _directionListIndexes[_direction + 10]; + _direction = (diff >= 0) ? _directionListIndexes[_direction + 20] : _directionListIndexes[_direction + 10]; setupFrame(); - if ((_direction == _direction2) && !_moving) + if ((_direction == _newDirection) && !_moving) updateFrame(); _priorTimer += 1; diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index 7db45cae43..65ed9ef89c 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -50,7 +50,7 @@ public: Common::Point _destPos; uint32 _priorTimer; uint _ticksAmount; - int16 _direction, _direction2; + int16 _direction, _newDirection; bool _stepEnabled; bool _visible, _priorVisible; bool _visible3; @@ -58,7 +58,7 @@ public: int16 _currentScale; int16 _yScale; int16 _currentDepth; - int16 _spriteListIdx, _spriteListIdx2; + int16 _spriteListStart, _spriteListIdx; bool _spritesChanged; uint16 _frameOffset, _frameNum; bool _moving; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 3e838fc1c0..e4f84aeb5a 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -165,7 +165,7 @@ void MadsScene::loadScene(int sceneNumber) { // Miscellaneous player setup _madsVm->_player._destPos = _madsVm->_player._destPos; - _madsVm->_player._direction2 = _madsVm->_player._direction; + _madsVm->_player._newDirection = _madsVm->_player._direction; _madsVm->_player.setupFrame(); _madsVm->_player.updateFrame(); @@ -1192,9 +1192,9 @@ bool MadsInterfaceView::handleKeypress(int32 keycode) { warning("TODO: Activate sound"); break; - case Common::KEYCODE_u: - // Rotate player - warning("TODO: Rotate player"); + case Common::KEYCODE_t: + // Rotate player - This was Ctrl-U in the original, but in ScummVM Ctrl-U is a global mute key + _madsVm->_player._newDirection = _madsVm->_player._directionListIndexes[_madsVm->_player._newDirection + 10]; break; case Common::KEYCODE_v: { -- cgit v1.2.3 From 9b14164bfcd9e6fecaecaed3ee5e061d6086bac8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 7 Jul 2010 14:19:36 +0000 Subject: SCI: accepting decimal/hexadecimal input on segment_info & kill_segment debug command, cleanup svn-id: r50735 --- engines/sci/console.cpp | 69 ++++++++++++++++++++++++++++--------------------- engines/sci/console.h | 2 ++ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e684532b08..4465fc6619 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1581,7 +1581,7 @@ bool Console::cmdSegmentInfo(int argc, const char **argv) { DebugPrintf("Provides information on the specified segment(s)\n"); DebugPrintf("Usage: %s \n", argv[0]); DebugPrintf(" can be a number, which shows the information of the segment with\n"); - DebugPrintf("the specified number, or \"all\" to show information on all active segments"); + DebugPrintf("the specified number, or \"all\" to show information on all active segments\n"); return true; } @@ -1589,9 +1589,11 @@ bool Console::cmdSegmentInfo(int argc, const char **argv) { for (uint i = 0; i < _engine->_gamestate->_segMan->_heap.size(); i++) segmentInfo(i); } else { - int nr = atoi(argv[1]); - if (!segmentInfo(nr)) - DebugPrintf("Segment %04x does not exist\n", nr); + int segmentNr; + if (!parseInteger(argv[1], segmentNr)) + return true; + if (!segmentInfo(segmentNr)) + DebugPrintf("Segment %04xh does not exist\n", segmentNr); } return true; @@ -1604,21 +1606,23 @@ bool Console::cmdKillSegment(int argc, const char **argv) { DebugPrintf("Usage: %s \n", argv[0]); return true; } - - _engine->_gamestate->_segMan->getScript(atoi(argv[1]))->setLockers(0); + int segmentNumber; + if (!parseInteger(argv[1], segmentNumber)) + return true; + _engine->_gamestate->_segMan->getScript(segmentNumber)->setLockers(0); return true; } bool Console::cmdShowMap(int argc, const char **argv) { if (argc != 2) { - DebugPrintf("Shows one of the screen maps\n"); + DebugPrintf("Switches to one of the following screen maps\n"); DebugPrintf("Usage: %s \n", argv[0]); DebugPrintf("Screen maps:\n"); - DebugPrintf("- 0: visual map (back buffer)\n"); - DebugPrintf("- 1: priority map (back buffer)\n"); - DebugPrintf("- 2: control map (static buffer)\n"); - DebugPrintf("- 3: display screen (newgui only)\n"); + DebugPrintf("- 0: visual map\n"); + DebugPrintf("- 1: priority map\n"); + DebugPrintf("- 2: control map\n"); + DebugPrintf("- 3: display screen\n"); return true; } @@ -1929,25 +1933,9 @@ bool Console::cmdVMVars(int argc, const char **argv) { return true; } - char *endPtr = 0; - int idxLen = strlen(argv[2]); - const char *lastChar = argv[2] + idxLen - (idxLen == 0 ? 0 : 1); + if (!parseInteger(argv[2], varIndex)) + return true; - if ((strncmp(argv[2], "0x", 2) == 0) || (*lastChar == 'h')) { - // hexadecimal number - varIndex = strtol(argv[2], &endPtr, 16); - if ((*endPtr != 0) && (*endPtr != 'h')) { - DebugPrintf("Invalid hexadecimal number '%s'\n", argv[2]); - return true; - } - } else { - // decimal number - varIndex = strtol(argv[2], &endPtr, 10); - if (*endPtr != 0) { - DebugPrintf("Invalid decimal number '%s'\n", argv[2]); - return true; - } - } if (varIndex < 0) { DebugPrintf("Variable number may not be negative\n"); return true; @@ -3145,6 +3133,29 @@ static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeV return 0; } +bool Console::parseInteger(const char *argument, int &result) { + char *endPtr = 0; + int idxLen = strlen(argument); + const char *lastChar = argument + idxLen - (idxLen == 0 ? 0 : 1); + + if ((strncmp(argument, "0x", 2) == 0) || (*lastChar == 'h')) { + // hexadecimal number + result = strtol(argument, &endPtr, 16); + if ((*endPtr != 0) && (*endPtr != 'h')) { + DebugPrintf("Invalid hexadecimal number '%s'\n", argument); + return false; + } + } else { + // decimal number + result = strtol(argument, &endPtr, 10); + if (*endPtr != 0) { + DebugPrintf("Invalid decimal number '%s'\n", argument); + return false; + } + } + return true; +} + void Console::printBasicVarInfo(reg_t variable) { int segType = g_sci->getKernel()->findRegType(variable); SegManager *segMan = g_sci->getEngineState()->_segMan; diff --git a/engines/sci/console.h b/engines/sci/console.h index 7e7b30ea58..95947a00f3 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -146,6 +146,8 @@ private: bool cmdViewActiveObject(int argc, const char **argv); bool cmdViewAccumulatorObject(int argc, const char **argv); + bool parseInteger(const char *argument, int &result); + void printBasicVarInfo(reg_t variable); bool segmentInfo(int nr); -- cgit v1.2.3 From 61a200dcdd03e8b0c1f35dea50842b6356e13e17 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 16:51:36 +0000 Subject: DS: Remove redundant lines from arm9/makefile svn-id: r50736 --- backends/platform/ds/arm9/makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index ae5fce531b..31be40f680 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -113,9 +113,6 @@ ifdef DS_BUILD_A DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A -DUSE_ARM_GFX_ASM -DUSE_ARM_COSTUME_ASM LOGO = logoa.bmp ENABLE_SCUMM = STATIC_PLUGIN - DEFINES += -DENABLE_SCUMM=STATIC_PLUGIN - MODULES += engines/scumm - USE_ARM_GFX_ASM = 1 BUILD=scummvm-A endif -- cgit v1.2.3 From 322d57a1dd2f72bb9d5fb4e00ddf82acab637e36 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 7 Jul 2010 18:35:07 +0000 Subject: SCI: adding support to kernel signatures that invalid references may also get allowed - doing exactly this for kGraph(restoreBox) - fixes castle of dr. brain when quitting the game - maybe a game specific workaround would be better?!?! svn-id: r50737 --- engines/sci/console.cpp | 12 +++++--- engines/sci/engine/kernel.cpp | 69 +++++++++++++++++++++++++++++-------------- engines/sci/engine/kernel.h | 19 ++++++------ 3 files changed, 65 insertions(+), 35 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 4465fc6619..0775d66681 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3157,10 +3157,11 @@ bool Console::parseInteger(const char *argument, int &result) { } void Console::printBasicVarInfo(reg_t variable) { - int segType = g_sci->getKernel()->findRegType(variable); + int regType = g_sci->getKernel()->findRegType(variable); + int segType = regType; SegManager *segMan = g_sci->getEngineState()->_segMan; - segType &= SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_NODE | SIG_TYPE_LIST | SIG_TYPE_UNINITIALIZED | SIG_TYPE_INVALID; + segType &= SIG_TYPE_INTEGER | SIG_TYPE_OBJECT | SIG_TYPE_REFERENCE | SIG_TYPE_NODE | SIG_TYPE_LIST | SIG_TYPE_UNINITIALIZED | SIG_TYPE_ERROR; switch (segType) { case SIG_TYPE_INTEGER: { @@ -3184,12 +3185,15 @@ void Console::printBasicVarInfo(reg_t variable) { case SIG_TYPE_UNINITIALIZED: DebugPrintf(" (uninitialized)"); break; - case SIG_TYPE_INVALID: - DebugPrintf(" (invalid)"); + case SIG_TYPE_ERROR: + DebugPrintf(" (error)"); break; default: DebugPrintf(" (??\?)"); } + + if (regType & SIG_IS_INVALID) + DebugPrintf(" IS INVALID!"); } void Console::printList(List *list) { diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2a378564bb..236a310f38 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -364,7 +364,9 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", NULL, NULL }, // subop + // ^^ we allow invalid references here, because kGraph(restoreBox) gets called with old non-existant handles often + // this should get limited to this call only as soon as subop signatures are available { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop @@ -543,7 +545,8 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS // we also check, if the written signature makes any sense curPos = writtenSig; while (*curPos) { - switch (*curPos) { + curChar = *curPos; + switch (curChar) { case '[': // either or if (eitherOr) error("signature for k%s: '[' used within '[]'", kernelName); @@ -584,6 +587,7 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS case 'l': case 'n': case '.': + case '!': if ((hadOptional) & (!optional)) error("signature for k%s: non-optional type may not follow optional type", kernelName); validType = true; @@ -634,8 +638,13 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS case 'l': case 'n': case '.': + case '!': // and we also got some signature pending? if (signature) { + if (!(signature & SIG_MAYBE_ANY)) + error("signature for k%s: invalid ('!') may only get used in combination with a real type", kernelName); + if ((signature & SIG_IS_INVALID) && ((signature & SIG_MAYBE_ANY) == (SIG_TYPE_NULL | SIG_TYPE_INTEGER))) + error("signature for k%s: invalid ('!') should not be used on exclusive null/integer type", kernelName); if (optional) { signature |= SIG_IS_OPTIONAL; if (curChar != ')') @@ -662,37 +671,44 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS break; case '0': if (signature & SIG_TYPE_NULL) - error("signature for k%s: NULL specified more than once", kernelName); + error("signature for k%s: NULL ('0') specified more than once", kernelName); signature |= SIG_TYPE_NULL; break; case 'i': if (signature & SIG_TYPE_INTEGER) - error("signature for k%s: integer specified more than once", kernelName); + error("signature for k%s: integer ('i') specified more than once", kernelName); signature |= SIG_TYPE_INTEGER | SIG_TYPE_NULL; break; case 'o': if (signature & SIG_TYPE_OBJECT) - error("signature for k%s: object specified more than once", kernelName); + error("signature for k%s: object ('o') specified more than once", kernelName); signature |= SIG_TYPE_OBJECT; break; case 'r': if (signature & SIG_TYPE_REFERENCE) - error("signature for k%s: reference specified more than once", kernelName); + error("signature for k%s: reference ('r') specified more than once", kernelName); signature |= SIG_TYPE_REFERENCE; break; case 'l': if (signature & SIG_TYPE_LIST) - error("signature for k%s: list specified more than once", kernelName); + error("signature for k%s: list ('l') specified more than once", kernelName); signature |= SIG_TYPE_LIST; break; case 'n': if (signature & SIG_TYPE_NODE) - error("signature for k%s: node specified more than once", kernelName); + error("signature for k%s: node ('n') specified more than once", kernelName); signature |= SIG_TYPE_NODE; break; case '.': + if (signature & SIG_MAYBE_ANY) + error("signature for k%s: maybe-any ('.') shouldn't get specified with other types in front of it", kernelName); signature |= SIG_MAYBE_ANY; break; + case '!': + if (signature & SIG_IS_INVALID) + error("signature for k%s: invalid ('!') specified more than once", kernelName); + signature |= SIG_IS_INVALID; + break; case '*': // accepts more of the same parameter signature |= SIG_MORE_MAY_FOLLOW; break; @@ -708,7 +724,7 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS return result; } -int Kernel::findRegType(reg_t reg) { +uint16 Kernel::findRegType(reg_t reg) { // No segment? Must be integer if (!reg.segment) return SIG_TYPE_INTEGER | (reg.offset ? 0 : SIG_TYPE_NULL); @@ -719,21 +735,24 @@ int Kernel::findRegType(reg_t reg) { // Otherwise it's an object SegmentObj *mobj = _segMan->getSegmentObj(reg.segment); if (!mobj) - return SIG_TYPE_INVALID; + return SIG_TYPE_ERROR; + uint16 result = 0; if (!mobj->isValidOffset(reg.offset)) - return SIG_TYPE_INVALID; + result |= SIG_IS_INVALID; switch (mobj->getType()) { case SEG_TYPE_SCRIPT: if (reg.offset <= (*(Script *)mobj).getBufSize() && reg.offset >= -SCRIPT_OBJECT_MAGIC_OFFSET && RAW_IS_OBJECT((*(Script *)mobj).getBuf(reg.offset)) ) { - return ((Script *)mobj)->getObject(reg.offset) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE; + result |= ((Script *)mobj)->getObject(reg.offset) ? SIG_TYPE_OBJECT : SIG_TYPE_REFERENCE; } else - return SIG_TYPE_REFERENCE; + result |= SIG_TYPE_REFERENCE; + break; case SEG_TYPE_CLONES: - return SIG_TYPE_OBJECT; + result |= SIG_TYPE_OBJECT; + break; case SEG_TYPE_LOCALS: case SEG_TYPE_STACK: case SEG_TYPE_SYS_STRINGS: @@ -743,14 +762,18 @@ int Kernel::findRegType(reg_t reg) { case SEG_TYPE_ARRAY: case SEG_TYPE_STRING: #endif - return SIG_TYPE_REFERENCE; + result |= SIG_TYPE_REFERENCE; + break; case SEG_TYPE_LISTS: - return SIG_TYPE_LIST; + result |= SIG_TYPE_LIST; + break; case SEG_TYPE_NODES: - return SIG_TYPE_NODE; + result |= SIG_TYPE_NODE; + break; default: - return 0; + return SIG_TYPE_ERROR; } + return result; } struct SignatureDebugType { @@ -762,11 +785,12 @@ static const SignatureDebugType signatureDebugTypeList[] = { { SIG_TYPE_NULL, "null" }, { SIG_TYPE_INTEGER, "integer" }, { SIG_TYPE_UNINITIALIZED, "uninitialized" }, - { SIG_TYPE_INVALID, "invalid" }, { SIG_TYPE_OBJECT, "object" }, { SIG_TYPE_REFERENCE, "reference" }, { SIG_TYPE_LIST, "list" }, { SIG_TYPE_NODE, "node" }, + { SIG_TYPE_ERROR, "error" }, + { SIG_IS_INVALID, "invalid" }, { 0, NULL } }; @@ -830,10 +854,11 @@ bool Kernel::signatureMatch(const uint16 *sig, int argc, const reg_t *argv) { while (nextSig && argc) { curSig = nextSig; int type = findRegType(*argv); - if (!type) - return false; // couldn't determine type - if (!(type & curSig)) + if ((type & SIG_IS_INVALID) && (!(curSig & SIG_IS_INVALID))) + return false; // pointer is invalid and signature doesn't allow that? + + if (!((type & ~SIG_IS_INVALID) & curSig)) return false; // type mismatch if (!(curSig & SIG_MORE_MAY_FOLLOW)) { diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 719db41e8d..7aa565fe34 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -101,14 +101,15 @@ enum { SIG_TYPE_NULL = 0x01, // may be 0:0 [0] SIG_TYPE_INTEGER = 0x02, // may be 0:* [i], automatically also allows null SIG_TYPE_UNINITIALIZED = 0x04, // may be FFFF:* -> not allowable, only used for comparsion - SIG_TYPE_INVALID = 0x08, // invalid segment or offset -> not allowable, only used for comparsion - SIG_TYPE_OBJECT = 0x10, // may be object [o] - SIG_TYPE_REFERENCE = 0x20, // may be reference [r] - SIG_TYPE_LIST = 0x40, // may be list [l] - SIG_TYPE_NODE = 0x80, // may be node [n] - SIG_IS_OPTIONAL = 0x100, // is optional - SIG_NEEDS_MORE = 0x200, // needs at least one additional parameter following - SIG_MORE_MAY_FOLLOW = 0x400 // may have more parameters of the same type following + SIG_TYPE_OBJECT = 0x08, // may be object [o] + SIG_TYPE_REFERENCE = 0x10, // may be reference [r] + SIG_TYPE_LIST = 0x20, // may be list [l] + SIG_TYPE_NODE = 0x40, // may be node [n] + SIG_TYPE_ERROR = 0x80, // happens, when there is a identification error - only used for comparsion + SIG_IS_INVALID = 0x100, // ptr is invalid [!] -> invalid offset + SIG_IS_OPTIONAL = 0x200, // is optional + SIG_NEEDS_MORE = 0x400, // needs at least one additional parameter following + SIG_MORE_MAY_FOLLOW = 0x800 // may have more parameters of the same type following }; // this does not include SIG_TYPE_UNINITIALIZED, because we can not allow uninitialized values anywhere @@ -196,7 +197,7 @@ public: * KSIG_INVALID set if the type of reg can be determined, but is invalid. * 0 on error. */ - int findRegType(reg_t reg); + uint16 findRegType(reg_t reg); /******************** Text functionality ********************/ /** -- cgit v1.2.3 From 9add81aaf2aa992252be36d9a2f9f2cec0e41eea Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 7 Jul 2010 20:12:41 +0000 Subject: SCI: Dropped support for the very old saved game versions 9 - 11. Rationale: a lot has changed since then, we're still not stable, and this helps clean up the code, thus we're still in a position to drop support for old saved games svn-id: r50738 --- engines/sci/console.cpp | 9 ----- engines/sci/engine/savegame.cpp | 89 +++++++++-------------------------------- engines/sci/engine/savegame.h | 2 +- engines/sci/engine/segment.h | 2 +- 4 files changed, 22 insertions(+), 80 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 0775d66681..83fa26ea8b 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1401,10 +1401,6 @@ bool Console::cmdPrintSegmentTable(int argc, const char **argv) { DebugPrintf("M dynmem: %d bytes", (*(DynMem *)mobj)._size); break; - case SEG_TYPE_STRING_FRAG: - DebugPrintf("F string fragments"); - break; - #ifdef ENABLE_SCI32 case SEG_TYPE_ARRAY: DebugPrintf("A SCI32 arrays (%d)", (*(ArrayTable *)mobj).entries_used); @@ -1553,11 +1549,6 @@ bool Console::segmentInfo(int nr) { } break; - case SEG_TYPE_STRING_FRAG: { - DebugPrintf("string frags\n"); - break; - } - #ifdef ENABLE_SCI32 case SEG_TYPE_STRING: DebugPrintf("SCI32 strings\n"); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 5d82786b9a..d1159acbfb 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -181,27 +181,11 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { if (s.isLoading()) resetSegMan(); - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be reserved_id - s.skip(4, VER(9), VER(18)); // OBSOLETE: Used to be _exportsAreWide - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be gc_mark_bits + s.skip(4, VER(12), VER(18)); // OBSOLETE: Used to be _exportsAreWide if (s.isLoading()) { // Reset _scriptSegMap, to be restored below _scriptSegMap.clear(); - - if (s.getVersion() <= 9) { - // OBSOLETE: Skip over the old id_seg_map when loading (we now - // regenerate the equivalent data, in _scriptSegMap, from scratch). - - s.skip(4); // base_value - while (true) { - uint32 key = 0; - s.syncAsSint32LE(key); - if (key == INTMAPPER_MAGIC_KEY) - break; - s.skip(4); // idx - } - } } @@ -217,35 +201,24 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { // If we were saving and mobj == 0, or if we are loading and this is an // entry marked as empty -> skip to next - if (type == SEG_TYPE_INVALID) { + if (type == SEG_TYPE_INVALID) continue; - } - - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be _segManagerId // Don't save or load HunkTable segments - if (type == SEG_TYPE_HUNK) { + if (type == SEG_TYPE_HUNK) continue; - } - - // Handle the OBSOLETE type SEG_TYPE_STRING_FRAG -- just ignore it - if (s.isLoading() && type == SEG_TYPE_STRING_FRAG) { - continue; - } - - if (s.isLoading()) { + if (s.isLoading()) mobj = SegmentObj::createSegmentObj(type); - } + assert(mobj); // Let the object sync custom data mobj->saveLoadWithSerializer(s); // If we are loading a script, hook it up in the script->segment map. - if (s.isLoading() && type == SEG_TYPE_SCRIPT) { + if (s.isLoading() && type == SEG_TYPE_SCRIPT) _scriptSegMap[((Script *)mobj)->getScriptNumber()] = i; - } } s.syncAsSint32LE(_clonesSegId); @@ -270,7 +243,6 @@ static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) s.syncVersion(CURRENT_SAVEGAME_VERSION); obj.savegame_version = s.getVersion(); s.syncString(obj.game_version); - s.skip(4, VER(9), VER(9)); // obsolete: used to be game version s.syncAsSint32LE(obj.savegame_date); s.syncAsSint32LE(obj.savegame_time); if (s.getVersion() < 22) { @@ -283,11 +255,8 @@ static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) } void EngineState::saveLoadWithSerializer(Common::Serializer &s) { - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be savegame_version - Common::String tmp; - s.syncString(tmp, VER(9), VER(23)); // OBSOLETE: Used to be game_version - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be version + s.syncString(tmp, VER(12), VER(23)); // OBSOLETE: Used to be game_version // OBSOLETE: Saved menus. Skip all of the saved data if (s.getVersion() < 14) { @@ -306,7 +275,6 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { for (int j = 0; j < menuLength; j++) { s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _type s.syncString(tmp); // OBSOLETE: Used to be _keytext - s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be keytext_size s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _flags s.skip(64, VER(12), VER(12)); // OBSOLETE: Used to be MENU_SAID_SPEC_SIZE @@ -341,8 +309,6 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { g_sci->_gfxPorts->kernelSetPicWindow(picPortRect, picPortTop, picPortLeft, false); } - s.skip(1, VER(9), VER(9)); // obsolete: used to be a flag indicating if we got sci11 or not - _segMan->saveLoadWithSerializer(s); g_sci->_soundCmd->syncPlayList(s); @@ -357,7 +323,7 @@ void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { void Object::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_flags); _pos.saveLoadWithSerializer(s); - s.skip(4, VER(9), VER(12)); // OBSOLETE: Used to be variable_names_nr + s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be variable_names_nr s.syncAsSint32LE(_methodCount); // that's actually a uint16 syncArray(s, _variables); @@ -483,25 +449,12 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { if (s.isLoading()) init(_nr, g_sci->getResMan()); - s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _bufSize - s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _scriptSize - s.skip(4, VER(9), VER(22)); // OBSOLETE: Used to be _heapSize - - if (s.getVersion() <= 10) { - assert((s.isLoading())); - // OBSOLETE: Skip over the old _objIndices data when loading - s.skip(4); // base_value - while (true) { - uint32 key = 0; - s.syncAsSint32LE(key); - if (key == INTMAPPER_MAGIC_KEY) - break; - s.skip(4); // idx - } - } + s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _bufSize + s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _scriptSize + s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _heapSize - s.skip(4, VER(9), VER(19)); // OBSOLETE: Used to be _numExports - s.skip(4, VER(9), VER(19)); // OBSOLETE: Used to be _numSynonyms + s.skip(4, VER(12), VER(19)); // OBSOLETE: Used to be _numExports + s.skip(4, VER(12), VER(19)); // OBSOLETE: Used to be _numSynonyms s.syncAsSint32LE(_lockers); // Sync _objects. This is a hashmap, and we use the following on disk format: @@ -529,7 +482,7 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { } } - s.skip(4, VER(9), VER(20)); // OBSOLETE: Used to be _localsOffset + s.skip(4, VER(12), VER(20)); // OBSOLETE: Used to be _localsOffset s.syncAsSint32LE(_localsSegment); s.syncAsSint32LE(_markedAsDeleted); @@ -822,14 +775,12 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } } - if (meta.savegame_version >= 12) { - // We don't need the thumbnail here, so just read it and discard it - Graphics::Surface *thumbnail = new Graphics::Surface(); - assert(thumbnail); - Graphics::loadThumbnail(*fh, *thumbnail); - delete thumbnail; - thumbnail = 0; - } + // We don't need the thumbnail here, so just read it and discard it + Graphics::Surface *thumbnail = new Graphics::Surface(); + assert(thumbnail); + Graphics::loadThumbnail(*fh, *thumbnail); + delete thumbnail; + thumbnail = 0; s->reset(true); s->saveLoadWithSerializer(ser); // FIXME: Error handling? diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 29f716d48d..9a882f2bf7 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -37,7 +37,7 @@ struct EngineState; enum { CURRENT_SAVEGAME_VERSION = 23, - MINIMUM_SAVEGAME_VERSION = 9 + MINIMUM_SAVEGAME_VERSION = 12 }; // Savegame metadata diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index b1e89e6357..2465576302 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -67,7 +67,7 @@ enum SegmentType { SEG_TYPE_NODES = 7, SEG_TYPE_HUNK = 8, SEG_TYPE_DYNMEM = 9, - SEG_TYPE_STRING_FRAG = 10, // obsolete, we keep it to be able to load old saves + // 10 used to be string fragments, now obsolete #ifdef ENABLE_SCI32 SEG_TYPE_ARRAY = 11, -- cgit v1.2.3 From fe72d5dd7842312606b350785f2fac2b2824fcb6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 23:22:53 +0000 Subject: DS: Fix some quirks in the NDS build system, remove some dead code * remove (S)RAM save code (it has not been in use for quite some time) * remove the lz compressor (was only used by ram save code) * OPT_SPEED was set incorrectly * dsmain.cpp was misspelled as ds_main.cpp * remove unsed arm9 libcartreset (the copy in the arm7 directory still is around, though) svn-id: r50741 --- backends/fs/ds/ds-fs.cpp | 51 +- backends/fs/ds/ds-fs.h | 8 +- backends/platform/ds/arm9/makefile | 76 +-- backends/platform/ds/arm9/source/compressor/lz.cpp | 539 --------------------- backends/platform/ds/arm9/source/compressor/lz.h | 50 -- backends/platform/ds/arm9/source/dsmain.cpp | 109 +---- backends/platform/ds/arm9/source/gbampsave.h | 1 + .../ds/arm9/source/libcartreset/cartreset.c | 107 ---- .../arm9/source/libcartreset/cartreset_nolibfat.h | 57 --- backends/platform/ds/arm9/source/osystem_ds.cpp | 20 +- backends/platform/ds/arm9/source/osystem_ds.h | 4 - backends/platform/ds/arm9/source/ramsave.cpp | 538 -------------------- backends/platform/ds/arm9/source/ramsave.h | 155 ------ backends/platform/ds/module.mk | 15 +- 14 files changed, 64 insertions(+), 1666 deletions(-) delete mode 100644 backends/platform/ds/arm9/source/compressor/lz.cpp delete mode 100644 backends/platform/ds/arm9/source/compressor/lz.h delete mode 100644 backends/platform/ds/arm9/source/libcartreset/cartreset.c delete mode 100644 backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h delete mode 100644 backends/platform/ds/arm9/source/ramsave.cpp delete mode 100644 backends/platform/ds/arm9/source/ramsave.h diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 43203eed54..675084ff56 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -542,27 +542,6 @@ FILE *std_fopen(const char *name, const char *mode) { assert(r < MAX_FILE_HANDLES); } -#ifdef GBA_SRAM_SAVE - if (strchr(mode, 'w')) { -// consolePrintf("Writing %s\n", realName); - s_handle[r].sramFile = DSSaveFileManager::instance()->openSavefile(realName, true); - } else { -// consolePrintf("Reading %s\n", realName); - s_handle[r].sramFile = DSSaveFileManager::instance()->openSavefile(realName, false); - } -#endif - - if (s_handle[r].sramFile) { - s_handle[r].used = true; - s_handle[r].pos = 0; - s_handle[r].data = NULL; - s_handle[r].size = s_handle[r].sramFile->getSize(); -// consolePrintf("Found it"); - return &s_handle[r]; - } - -// consolePrintf("Not in SRAM!"); - char *data; ZipFile *zip = DSFileSystemNode::getZip(); @@ -615,10 +594,6 @@ void std_fclose(FILE *handle) { } handle->used = false; - if (handle->sramFile) { - delete handle->sramFile; - handle->sramFile = NULL; - } } size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { @@ -638,21 +613,6 @@ size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { return numItems; } - if (handle->sramFile) { - int bytes = 0; - int result = 1; - //consolePrintf("fread size=", size * numItems); - for (int r = 0; (r < (s32) size * (s32) numItems) && (result > 0); r++) { - result = handle->sramFile->read((void *) ( ((char *) (ptr)) + r), 1); - bytes += result; - //consolePrintf("'%d',", ((char *) (ptr))[0]); - } - - handle->pos += bytes; - - return bytes / size; - } - if (handle->pos > handle->size) numItems = 0; else if ((int)(handle->pos + size * numItems) > handle->size) @@ -695,12 +655,7 @@ size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle) { return numItems; } - if (handle->sramFile) { - handle->sramFile->write(ptr, size); - return size; - } else { - return 0; - } + return 0; } bool std_feof(FILE *handle) { @@ -710,10 +665,6 @@ bool std_feof(FILE *handle) { return readPastEndOfFile && FAT_feof((FAT_FILE *) handle); } - if (handle->sramFile) { - return handle->sramFile->eos(); - } - // consolePrintf("feof %s", handle->pos >= handle->size? "true": "false"); return handle->pos >= handle->size; } diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index fadfb8a40d..6961022848 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -26,12 +26,12 @@ #ifndef _DS_FS_H #define _DS_FS_H -//#include #include "common/fs.h" +#include "common/stream.h" +#include "backends/fs/abstract-fs.h" + #include "zipreader.h" -#include "ramsave.h" #include "fat/gba_nds_fat.h" -#include "backends/fs/abstract-fs.h" namespace DS { @@ -166,8 +166,6 @@ struct fileHandle { bool used; char *data; int size; - - DSSaveFile *sramFile; }; diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 31be40f680..703d5d69b7 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -253,7 +253,7 @@ endif INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \ -I$(portdir)/data -I$(portdir)/../commoninclude \ - -I$(portdir)/source -I$(portdir)/source/mad -I$(portdir)/source/libcartreset \ + -I$(portdir)/source -I$(portdir)/source/mad \ -I$(libndsdir)/include -include $(srcdir)/common/scummsys.h @@ -286,46 +286,58 @@ PRE_OBJS_FLAGS = -Wl,--whole-archive POST_OBJS_FLAGS = -Wl,--no-whole-archive endif -PORT_OBJS := $(portdir)/source/blitters_arm.o $(portdir)/source/cdaudio.o $(portdir)/source/dsmain.o \ - $(portdir)/../../../fs/ds/ds-fs.o $(portdir)/source/gbampsave.o $(portdir)/source/scummhelp.o\ - $(portdir)/source/osystem_ds.o $(portdir)/source/ramsave.o\ - $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ - $(portdir)/source/dsoptions.o $(portdir)/source/keys.o $(portdir)/source/wordcompletion.o\ - $(portdir)/source/interrupt.o +PORT_OBJS := \ + $(portdir)/source/blitters_arm.o \ + $(portdir)/source/cdaudio.o \ + $(portdir)/source/dsmain.o \ + $(portdir)/../../../fs/ds/ds-fs.o \ + $(portdir)/source/gbampsave.o \ + $(portdir)/source/scummhelp.o \ + $(portdir)/source/osystem_ds.o \ + $(portdir)/source/touchkeyboard.o \ + $(portdir)/source/zipreader.o \ + $(portdir)/source/dsoptions.o \ + $(portdir)/source/keys.o \ + $(portdir)/source/wordcompletion.o \ + $(portdir)/source/interrupt.o ifdef USE_PROFILER PORT_OBJS += $(portdir)/source/profiler/cyg-profile.o endif -DATA_OBJS := $(portdir)/data/icons.o $(portdir)/data/keyboard.o $(portdir)/data/keyboard_pal.o $(portdir)/data/default_font.o $(portdir)/data/8x8font_tga.o - -COMPRESSOR_OBJS := -#$(portdir)/source/compressor/lz.o - -FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o\ - $(portdir)/source/fat/io_fcsr.o $(portdir)/source/fat/io_m3cf.o\ - $(portdir)/source/fat/io_mpcf.o $(portdir)/source/fat/io_sccf.o\ - $(portdir)/source/fat/io_m3sd.o\ - $(portdir)/source/fat/io_nmmc.o $(portdir)/source/fat/io_scsd.o \ - $(portdir)/source/fat/io_scsd_asm.o \ - $(portdir)/source/fat/io_njsd.o \ - $(portdir)/source/fat/io_mmcf.o \ - $(portdir)/source/fat/io_sd_common.o \ - $(portdir)/source/fat/io_m3_common.o \ - $(portdir)/source/fat/io_dldi.o \ - $(portdir)/source/fat/m3sd.o +DATA_OBJS := + $(portdir)/data/icons.o \ + $(portdir)/data/keyboard.o \ + $(portdir)/data/keyboard_pal.o \ + $(portdir)/data/default_font.o \ + $(portdir)/data/8x8font_tga.o + +FAT_OBJS := + $(portdir)/source/fat/disc_io.o \ + $(portdir)/source/fat/gba_nds_fat.o \ + $(portdir)/source/fat/io_fcsr.o \ + $(portdir)/source/fat/io_m3cf.o \ + $(portdir)/source/fat/io_mpcf.o \ + $(portdir)/source/fat/io_sccf.o \ + $(portdir)/source/fat/io_m3sd.o \ + $(portdir)/source/fat/io_nmmc.o \ + $(portdir)/source/fat/io_scsd.o \ + $(portdir)/source/fat/io_scsd_asm.o \ + $(portdir)/source/fat/io_njsd.o \ + $(portdir)/source/fat/io_mmcf.o \ + $(portdir)/source/fat/io_sd_common.o \ + $(portdir)/source/fat/io_m3_common.o \ + $(portdir)/source/fat/io_dldi.o \ + $(portdir)/source/fat/m3sd.o # $(portdir)/source/fat/io_cf_common.o $(portdir)/source/fat/io_m3_common.o\ # $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \ # $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o -LIBCARTRESET_OBJS := -#$(portdir)/source/libcartreset/cartreset.o - # Files in this list will be optimisied for speed, otherwise they will be optimised for space -OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp script.cpp +OPTLIST := actor.cpp dsmain.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp script.cpp #OPTLIST := # Compiler options for files which should be optimised for speed @@ -333,18 +345,14 @@ ifdef DS_BUILD_E # Another attempt to save some RAM in ITE OPT_SPEED := -O3 -mthumb else - #OPT_SPEED := -O3 - OPT_SPEED := -Os -mthumb + OPT_SPEED := -O3 endif # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb -#-mthumb -fno-gcse -fno-schedule-insns2 - - -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) +OBJS := $(DATA_OBJS) $(PORT_OBJS) $(FAT_OBJS) diff --git a/backends/platform/ds/arm9/source/compressor/lz.cpp b/backends/platform/ds/arm9/source/compressor/lz.cpp deleted file mode 100644 index 47a36646c6..0000000000 --- a/backends/platform/ds/arm9/source/compressor/lz.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/************************************************************************* -* Name: lz.c -* Author: Marcus Geelnard -* Description: LZ77 coder/decoder implementation. -* Reentrant: Yes -* $Id$ -* -* The LZ77 compression scheme is a substitutional compression scheme -* proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in -* its design, and uses no fancy bit level compression. -* -* This is my first attempt at an implementation of a LZ77 code/decoder. -* -* The principle of the LZ77 compression algorithm is to store repeated -* occurrences of strings as references to previous occurrences of the same -* string. The point is that the reference consumes less space than the -* string itself, provided that the string is long enough (in this -* implementation, the string has to be at least 4 bytes long, since the -* minimum coded reference is 3 bytes long). Also note that the term -* "string" refers to any kind of byte sequence (it does not have to be -* an ASCII string, for instance). -* -* The coder uses a brute force approach to finding string matches in the -* history buffer (or "sliding window", if you wish), which is very, very -* slow. I recon the complexity is somewhere between O(n^2) and O(n^3), -* depending on the input data. -* -* There is also a faster implementation that uses a large working buffer -* in which a "jump table" is stored, which is used to quickly find -* possible string matches (see the source code for LZ_CompressFast() for -* more information). The faster method is an order of magnitude faster, -* and also does a full string search in the entire input buffer (it does -* not use a sliding window). -* -* The upside is that decompression is very fast, and the compression ratio -* is often very good. -* -* The reference to a string is coded as a (length,offset) pair, where the -* length indicates the length of the string, and the offset gives the -* offset from the current data position. To distinguish between string -* references and literal strings (uncompressed bytes), a string reference -* is preceded by a marker byte, which is chosen as the least common byte -* symbol in the input data stream (this marker byte is stored in the -* output stream as the first byte). -* -* Occurrences of the marker byte in the stream are encoded as the marker -* byte followed by a zero byte, which means that occurrences of the marker -* byte have to be coded with two bytes. -* -* The lengths and offsets are coded in a variable length fashion, allowing -* values of any magnitude (up to 4294967295 in this implementation). -* -* With this compression scheme, the worst case compression result is -* (257/256)*insize + 1. -* -*------------------------------------------------------------------------- -* Copyright (c) 2003-2004 Marcus Geelnard -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would -* be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not -* be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any source -* distribution. -* -* Marcus Geelnard -* marcus.geelnard at home.se -*************************************************************************/ - - -/************************************************************************* -* Constants used for LZ77 coding -*************************************************************************/ - -/* Maximum offset (can be any size < 2^32). Lower values gives faster - compression, while higher values gives better compression. - NOTE: LZ_CompressFast does not use this constant. */ -#define LZ_MAX_OFFSET 512 - - - -/************************************************************************* -* INTERNAL FUNCTIONS * -*************************************************************************/ - - -/************************************************************************* -* _LZ_StringCompare() - Return maximum length string match. -*************************************************************************/ - -inline static unsigned int _LZ_StringCompare( unsigned char * str1, - unsigned char * str2, unsigned int minlen, unsigned int maxlen ) -{ - unsigned int len; - - for ( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len ); - - return len; -} - - -/************************************************************************* -* _LZ_WriteVarSize() - Write unsigned integer with variable number of -* bytes depending on value. -*************************************************************************/ - -inline static int _LZ_WriteVarSize( unsigned int x, unsigned char * buf ) -{ - unsigned int y; - int num_bytes, i, b; - - /* Determine number of bytes needed to store the number x */ - y = x >> 3; - for ( num_bytes = 5; num_bytes >= 2; -- num_bytes ) - { - if ( y & 0xfe000000 ) break; - y <<= 7; - } - - /* Write all bytes, seven bits in each, with 8:th bit set for all */ - /* but the last byte. */ - for ( i = num_bytes-1; i >= 0; -- i ) - { - b = (x >> (i*7)) & 0x0000007f; - if ( i > 0 ) - { - b |= 0x00000080; - } - *buf ++ = (unsigned char) b; - } - - /* Return number of bytes written */ - return num_bytes; -} - - -/************************************************************************* -* _LZ_ReadVarSize() - Read unsigned integer with variable number of -* bytes depending on value. -*************************************************************************/ - -inline static int _LZ_ReadVarSize( unsigned int * x, unsigned char * buf ) -{ - unsigned int y, b, num_bytes; - - /* Read complete value (stop when byte contains zero in 8:th bit) */ - y = 0; - num_bytes = 0; - do - { - b = (unsigned int) (*buf ++); - y = (y << 7) | (b & 0x0000007f); - ++ num_bytes; - } - while ( b & 0x00000080 ); - - /* Store value in x */ - *x = y; - - /* Return number of bytes read */ - return num_bytes; -} - - - -/************************************************************************* -* PUBLIC FUNCTIONS * -*************************************************************************/ - - -/************************************************************************* -* LZ_Compress() - Compress a block of data using an LZ77 coder. -* in - Input (uncompressed) buffer. -* out - Output (compressed) buffer. This buffer must be 0.4% larger -* than the input buffer, plus one byte. -* insize - Number of input bytes. -* The function returns the size of the compressed data. -*************************************************************************/ - -int LZ_Compress( unsigned char *in, unsigned char *out, - unsigned int insize ) -{ - unsigned char marker, symbol; - unsigned int inpos, outpos, bytesleft, i; - unsigned int maxoffset, offset, bestoffset; - unsigned int maxlength, length, bestlength; - unsigned int histogram[ 256 ]; - unsigned char *ptr1, *ptr2; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return 0; - } - - /* Create histogram */ - for ( i = 0; i < 256; ++ i ) - { - histogram[ i ] = 0; - } - for ( i = 0; i < insize; ++ i ) - { - ++ histogram[ in[ i ] ]; - } - - /* Find the least common byte, and use it as the code marker */ - marker = 0; - for ( i = 1; i < 256; ++ i ) - { - if ( histogram[ i ] < histogram[ marker ] ) - { - marker = i; - } - } - - /* Remember the repetition marker for the decoder */ - out[ 0 ] = marker; - - /* Start of compression */ - inpos = 0; - outpos = 1; - - /* Main compression loop */ - bytesleft = insize; - do - { - /* Determine most distant position */ - if ( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET; - else maxoffset = inpos; - - /* Get pointer to current position */ - ptr1 = &in[ inpos ]; - - /* Search history window for maximum length string match */ - bestlength = 3; - bestoffset = 0; - for ( offset = 3; offset <= maxoffset; ++ offset ) - { - /* Get pointer to candidate string */ - ptr2 = &ptr1[ -offset ]; - - /* Quickly determine if this is a candidate (for speed) */ - if ( (ptr1[ 0 ] == ptr2[ 0 ]) && - (ptr1[ bestlength ] == ptr2[ bestlength ]) ) - { - /* Determine maximum length for this offset */ - maxlength = (bytesleft < offset ? bytesleft : offset); - - /* Count maximum length match at this offset */ - length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength ); - - /* Better match than any previous match? */ - if ( length > bestlength ) - { - bestlength = length; - bestoffset = offset; - } - } - } - - /* Was there a good enough match? */ - if ( (bestlength >= 8) || - ((bestlength == 4) && (bestoffset <= 0x0000007f)) || - ((bestlength == 5) && (bestoffset <= 0x00003fff)) || - ((bestlength == 6) && (bestoffset <= 0x001fffff)) || - ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) - { - out[ outpos ++ ] = (unsigned char) marker; - outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); - outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); - inpos += bestlength; - bytesleft -= bestlength; - } - else - { - /* Output single byte (or two bytes if marker byte) */ - symbol = in[ inpos ++ ]; - out[ outpos ++ ] = symbol; - if ( symbol == marker ) - { - out[ outpos ++ ] = 0; - } - -- bytesleft; - } - } - while ( bytesleft > 3 ); - - /* Dump remaining bytes, if any */ - while ( inpos < insize ) - { - if ( in[ inpos ] == marker ) - { - out[ outpos ++ ] = marker; - out[ outpos ++ ] = 0; - } - else - { - out[ outpos ++ ] = in[ inpos ]; - } - ++ inpos; - } - - return outpos; -} - - -/************************************************************************* -* LZ_CompressFast() - Compress a block of data using an LZ77 coder. -* in - Input (uncompressed) buffer. -* out - Output (compressed) buffer. This buffer must be 0.4% larger -* than the input buffer, plus one byte. -* insize - Number of input bytes. -* work - Pointer to a temporary buffer (internal working buffer), which -* must be able to hold (insize+65536) unsigned integers. -* The function returns the size of the compressed data. -*************************************************************************/ - -int LZ_CompressFast( unsigned char *in, unsigned char *out, - unsigned int insize, unsigned int *work ) -{ - unsigned char marker, symbol; - unsigned int inpos, outpos, bytesleft, i, index, symbols; - unsigned int offset, bestoffset; - unsigned int maxlength, length, bestlength; - unsigned int histogram[ 256 ], *lastindex, *jumptable; - unsigned char *ptr1, *ptr2; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return 0; - } - - /* Assign arrays to the working area */ - lastindex = work; - jumptable = &work[ 65536 ]; - - /* Build a "jump table". Here is how the jump table works: - jumptable[i] points to the nearest previous occurrence of the same - symbol pair as in[i]:in[i+1], so in[i] == in[jumptable[i]] and - in[i+1] == in[jumptable[i]+1]. Following the jump table gives a - dramatic boost for the string search'n'match loop compared to doing - a brute force search. */ - for ( i = 0; i < 65536; ++ i ) - { - lastindex[ i ] = 0xffffffff; - } - for ( i = 0; i < insize-1; ++ i ) - { - symbols = (((unsigned int)in[i]) << 8) | ((unsigned int)in[i+1]); - index = lastindex[ symbols ]; - lastindex[ symbols ] = i; - jumptable[ i ] = index; - } - jumptable[ insize-1 ] = 0xffffffff; - - /* Create histogram */ - for ( i = 0; i < 256; ++ i ) - { - histogram[ i ] = 0; - } - for ( i = 0; i < insize; ++ i ) - { - ++ histogram[ in[ i ] ]; - } - - /* Find the least common byte, and use it as the code marker */ - marker = 0; - for ( i = 1; i < 256; ++ i ) - { - if ( histogram[ i ] < histogram[ marker ] ) - { - marker = i; - } - } - - /* Remember the repetition marker for the decoder */ - out[ 0 ] = marker; - - /* Start of compression */ - inpos = 0; - outpos = 1; - - /* Main compression loop */ - bytesleft = insize; - do - { - /* Get pointer to current position */ - ptr1 = &in[ inpos ]; - - /* Search history window for maximum length string match */ - bestlength = 3; - bestoffset = 0; - index = jumptable[ inpos ]; - while ( index != 0xffffffff ) - { - /* Get pointer to candidate string */ - ptr2 = &in[ index ]; - - /* Quickly determine if this is a candidate (for speed) */ - if ( ptr2[ bestlength ] == ptr1[ bestlength ] ) - { - /* Determine maximum length for this offset */ - offset = inpos - index; - maxlength = (bytesleft < offset ? bytesleft : offset); - - /* Count maximum length match at this offset */ - length = _LZ_StringCompare( ptr1, ptr2, 2, maxlength ); - - /* Better match than any previous match? */ - if ( length > bestlength ) - { - bestlength = length; - bestoffset = offset; - } - } - - /* Get next possible index from jump table */ - index = jumptable[ index ]; - } - - /* Was there a good enough match? */ - if ( (bestlength >= 8) || - ((bestlength == 4) && (bestoffset <= 0x0000007f)) || - ((bestlength == 5) && (bestoffset <= 0x00003fff)) || - ((bestlength == 6) && (bestoffset <= 0x001fffff)) || - ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) - { - out[ outpos ++ ] = (unsigned char) marker; - outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); - outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); - inpos += bestlength; - bytesleft -= bestlength; - } - else - { - /* Output single byte (or two bytes if marker byte) */ - symbol = in[ inpos ++ ]; - out[ outpos ++ ] = symbol; - if ( symbol == marker ) - { - out[ outpos ++ ] = 0; - } - -- bytesleft; - } - } - while ( bytesleft > 3 ); - - /* Dump remaining bytes, if any */ - while ( inpos < insize ) - { - if ( in[ inpos ] == marker ) - { - out[ outpos ++ ] = marker; - out[ outpos ++ ] = 0; - } - else - { - out[ outpos ++ ] = in[ inpos ]; - } - ++ inpos; - } - - return outpos; -} - - -/************************************************************************* -* LZ_Uncompress() - Uncompress a block of data using an LZ77 decoder. -* in - Input (compressed) buffer. -* out - Output (uncompressed) buffer. This buffer must be large -* enough to hold the uncompressed data. -* insize - Number of input bytes. -*************************************************************************/ - -void LZ_Uncompress( unsigned char *in, unsigned char *out, - unsigned int insize ) -{ - unsigned char marker, symbol; - unsigned int i, inpos, outpos, length, offset; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return; - } - - /* Get marker symbol from input stream */ - marker = in[ 0 ]; - inpos = 1; - - /* Main decompression loop */ - outpos = 0; - do - { - symbol = in[ inpos ++ ]; - if ( symbol == marker ) - { - /* We had a marker byte */ - if ( in[ inpos ] == 0 ) - { - /* It was a single occurrence of the marker byte */ - out[ outpos ++ ] = marker; - ++ inpos; - } - else - { - /* Extract true length and offset */ - inpos += _LZ_ReadVarSize( &length, &in[ inpos ] ); - inpos += _LZ_ReadVarSize( &offset, &in[ inpos ] ); - - /* Copy corresponding data from history window */ - for ( i = 0; i < length; ++ i ) - { - out[ outpos ] = out[ outpos - offset ]; - ++ outpos; - } - } - } - else - { - /* No marker, plain copy */ - out[ outpos ++ ] = symbol; - } - } - while ( inpos < insize ); -} diff --git a/backends/platform/ds/arm9/source/compressor/lz.h b/backends/platform/ds/arm9/source/compressor/lz.h deleted file mode 100644 index e7ea1567ca..0000000000 --- a/backends/platform/ds/arm9/source/compressor/lz.h +++ /dev/null @@ -1,50 +0,0 @@ -/************************************************************************* -* Name: lz.h -* Author: Marcus Geelnard -* Description: LZ77 coder/decoder interface. -* Reentrant: Yes -* $Id$ -*------------------------------------------------------------------------- -* Copyright (c) 2003-2004 Marcus Geelnard -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would -* be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not -* be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any source -* distribution. -* -* Marcus Geelnard -* marcus.geelnard at home.se -*************************************************************************/ - -#ifndef _lz_h_ -#define _lz_h_ - - - -/************************************************************************* -* Function prototypes -*************************************************************************/ - -int LZ_Compress( unsigned char *in, unsigned char *out, - unsigned int insize ); -int LZ_CompressFast( unsigned char *in, unsigned char *out, - unsigned int insize, unsigned int *work ); -void LZ_Uncompress( unsigned char *in, unsigned char *out, - unsigned int insize ); - - -#endif /* _lz_h_ */ diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 8d51eff3da..95bfdfe40a 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -73,8 +73,6 @@ -//#define USE_LIBCARTRESET - #include #include #include @@ -100,9 +98,7 @@ #ifdef USE_DEBUGGER #include "user_debugger.h" #endif -#include "ramsave.h" #include "blitters.h" -#include "libcartreset/cartreset_nolibfat.h" #include "keys.h" #ifdef USE_PROFILER #include "profiler/cyg-profile.h" @@ -2775,31 +2771,6 @@ GLvector getPenPos() { return v; } -#ifdef GBA_SRAM_SAVE - -void formatSramOption() { - consolePrintf("The following files are present in save RAM:\n"); - DSSaveFileManager::instance()->listFiles(); - - consolePrintf("\nAre you sure you want to\n"); - consolePrintf("DELETE all files?\n"); - consolePrintf("A = Yes, X = No\n"); - - while (true) { - if (keysHeld() & KEY_A) { - DSSaveFileManager::instance()->formatSram(); - consolePrintf("SRAM cleared!\n"); - return; - } - - if (keysHeld() & KEY_X) { - consolePrintf("Whew, that was close!\n"); - return; - } - } -} -#endif - void setIndyFightState(bool st) { indyFightState = st; indyFightRight = true; @@ -2884,61 +2855,6 @@ void debug_print_stub(char *string) { } #endif -#ifdef USE_LIBCARTRESET - -struct cardTranslate { - int cartResetId; - int svmId; - char dldiId[5]; -}; - -cardTranslate cardReaderTable[] = { - {DEVICE_TYPE_M3SD, DEVICE_M3SD, "M3SD"}, - {DEVICE_TYPE_M3CF, DEVICE_M3CF, "M3CF"}, - {DEVICE_TYPE_MPCF, DEVICE_MPCF, "MPCF"}, - {DEVICE_TYPE_SCCF, DEVICE_SCCF, "SCCF"}, - {DEVICE_TYPE_SCSD, DEVICE_SCSD, "SCSD"}, - {DEVICE_TYPE_SCSD, DEVICE_SCSD, "SCLT"}, - {DEVICE_TYPE_NMMC, DEVICE_NMMC, "NMMC"}, -}; - -void reboot() { - int deviceType = -1; - - - if (disc_getDeviceId() == DEVICE_DLDI) { - - char id[6]; - disc_getDldiId(id); - - consolePrintf("DLDI Device ID: %s\n", id); - - for (int r = 0; r < ARRAYSIZE(cardReaderTable); r++) { - if (!stricmp(id, cardReaderTable[r].dldiId)) { - deviceType = cardReaderTable[r].cartResetId; - } - } - } else { - for (int r = 0; r < ARRAYSIZE(cardReaderTable); r++) { - if (disc_getDeviceId() == cardReaderTable[r].svmId) { - deviceType = cardReaderTable[r].cartResetId; - } - } - } - - - consolePrintf("Device number: %x\n", deviceType); - - if (deviceType == -1) { - IPC->reset = true; // Send message to ARM7 to turn power off - } else { - cartSetMenuMode(deviceType); - passmeloopEnter(); - } - - while (true); // Stop the program continuing beyond this point -} -#endif void powerOff() { while (keysHeld() != 0) { // Wait for all keys to be released. @@ -2953,12 +2869,10 @@ void powerOff() { while (true); } else { -#ifdef USE_LIBCARTRESET - reboot(); -#else IPC->reset = true; // Send message to ARM7 to turn power off - while (true); // Stop the program continuing beyond this point -#endif + while (true) { + // Stop the program from continuing beyond this point + } } } @@ -2979,7 +2893,7 @@ void dsExceptionHandler() { int offset = 8; - if ( currentMode == 0x17 ) { + if (currentMode == 0x17) { consolePrintf("\x1b[10Cdata abort!\n\n"); codeAddress = exceptionRegisters[15] - offset; if ( (codeAddress > 0x02000000 && codeAddress < 0x02400000) || @@ -3002,16 +2916,19 @@ void dsExceptionHandler() { int i; - for ( i=0; i < 8; i++ ) { + for (i = 0; i < 8; i++) { consolePrintf(" %s: %08X %s: %08X\n", registerNames[i], exceptionRegisters[i], registerNames[i+8],exceptionRegisters[i+8]); } - while(1); + + while(1) + ; // endles loop + u32 *stack = (u32 *)exceptionRegisters[13]; - for ( i=0; i<10; i++ ) { + for (i = 0; i < 10; i++) { consolePrintf("%08X %08X %08X\n", stack[i*3], stack[i*3+1], stack[(i*3)+2] ); } @@ -3262,12 +3179,6 @@ int main(void) { g_system = new OSystem_DS(); assert(g_system); -#ifdef GBA_SRAM_SAVE - if ((keysHeld() & KEY_L) && (keysHeld() & KEY_R)) { - formatSramOption(); - } -#endif - IPC->adpcm.semaphore = false; // printf("'%s'", Common::ConfigManager::kTransientDomain.c_str()); diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index fd16b72e4c..ad929236cd 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -27,6 +27,7 @@ #define _GBAMPSAVE_H_ #include "common/system.h" +#include "common/savefile.h" #include "backends/fs/ds/ds-fs.h" #define SAVE_BUFFER_SIZE 100000 diff --git a/backends/platform/ds/arm9/source/libcartreset/cartreset.c b/backends/platform/ds/arm9/source/libcartreset/cartreset.c deleted file mode 100644 index 6fb906b86d..0000000000 --- a/backends/platform/ds/arm9/source/libcartreset/cartreset.c +++ /dev/null @@ -1,107 +0,0 @@ -/********************************** - Copyright (C) Rick Wong (Lick) - http://licklick.wordpress.com/ -***********************************/ -#include - - -#ifdef ARM9 - -bool cartSetMenuMode(u32 _deviceType) -{ - *(vu16*)(0x04000204) &= ~0x0880; //sysSetBusOwners(true, true); - u32 deviceType = _deviceType; - - *((vu32*)0x027FFFF8) = 0x080000C0; // ARM7 reset address - - if(deviceType == DEVICE_TYPE_EFA2) - { - *(u16 *)0x9FE0000 = 0xD200; - *(u16 *)0x8000000 = 0x1500; - *(u16 *)0x8020000 = 0xD200; - *(u16 *)0x8040000 = 0x1500; - *(u16 *)0x9880000 = 1 << 15; - *(u16 *)0x9FC0000 = 0x1500; - return true; - } - else if(deviceType == DEVICE_TYPE_MPCF) - { - return true; - } - else if(deviceType == DEVICE_TYPE_EZSD) - { - return true; - } - else if(deviceType == DEVICE_TYPE_M3CF || deviceType == DEVICE_TYPE_M3SD) - { - u32 mode = 0x00400004; - vu16 tmp; - tmp = *(vu16*)(0x08E00002); - tmp = *(vu16*)(0x0800000E); - tmp = *(vu16*)(0x08801FFC); - tmp = *(vu16*)(0x0800104A); - tmp = *(vu16*)(0x08800612); - tmp = *(vu16*)(0x08000000); - tmp = *(vu16*)(0x08801B66); - tmp = *(vu16*)(0x08000000 + (mode << 1)); - tmp = *(vu16*)(0x0800080E); - tmp = *(vu16*)(0x08000000); - - tmp = *(vu16*)(0x080001E4); - tmp = *(vu16*)(0x080001E4); - tmp = *(vu16*)(0x08000188); - tmp = *(vu16*)(0x08000188); - return true; - } - else if(deviceType == DEVICE_TYPE_SCCF || deviceType == DEVICE_TYPE_SCSD) - { - *(vu16*)0x09FFFFFE = 0xA55A; - *(vu16*)0x09FFFFFE = 0xA55A; - *(vu16*)0x09FFFFFE = 0; - *(vu16*)0x09FFFFFE = 0; - *((vu32*)0x027FFFF8) = 0x08000000; // Special ARM7 reset address - return true; - } - - return false; -} - - - -void passmeloopEnter() -{ - *(vu16*)(0x04000208) = 0; //REG_IME = IME_DISABLE; - *(vu16*)(0x04000204) |= 0x0880; //sysSetBusOwners(false, false); - *((vu32*)0x027FFFFC) = 0; - *((vu32*)0x027FFE04) = (u32)0xE59FF018; - *((vu32*)0x027FFE24) = (u32)0x027FFE04; - asm("swi 0x00"); //swiSoftReset(); - asm("bx lr"); -} - -#endif - - -#ifdef ARM7 - -bool passmeloopQuery() -{ - if(*((vu32*)0x027FFE24) == (u32)0x027FFE04) - return true; - return false; -} - - - -void cartExecute() -{ - *(vu16*)(0x04000208) = 0; //REG_IME = IME_DISABLE; - *((vu32*)0x027FFE34) = *((vu32*)0x027FFFF8); - asm("swi 0x00"); //swiSoftReset(); - asm("bx lr"); -} - -#endif - - - diff --git a/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h b/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h deleted file mode 100644 index ddc4b1d4c2..0000000000 --- a/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h +++ /dev/null @@ -1,57 +0,0 @@ -/********************************** - Copyright (C) Rick Wong (Lick) - http://licklick.wordpress.com/ -***********************************/ -#ifndef CARTRESET_H -#define CARTRESET_H - -//#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef ARM9 -// Auto detect: -#define DEVICE_TYPE_AUTO 0x00000000 // doesn't work in libcartreset "nolibfat" version - -// Not supported: -#define DEVICE_TYPE_FCSR 0x52534346 -#define DEVICE_TYPE_MMCF 0x46434D4D -#define DEVICE_TYPE_NJSD 0x44534A4E -#define DEVICE_TYPE_NMMC 0x434D4D4E - -// Supported: -#define DEVICE_TYPE_EFA2 0x32414645 -#define DEVICE_TYPE_MPCF 0x4643504D -#define DEVICE_TYPE_M3CF 0x4643334D -#define DEVICE_TYPE_M3SD 0x4453334D -#define DEVICE_TYPE_SCCF 0x46434353 -#define DEVICE_TYPE_SCSD 0x44534353 - -// Supported, but libfat doesn't detect the device: -#define DEVICE_TYPE_EZSD 0x44535A45 - - -bool cartSetMenuMode(u32 _deviceType); -void passmeloopEnter(); - -#endif - - -#ifdef ARM7 - -bool passmeloopQuery(); -void cartExecute(); - -#endif - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 09617c17b0..55475b0bff 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -729,26 +729,10 @@ void OSystem_DS::quit() { } Common::SaveFileManager *OSystem_DS::getSavefileManager() { - bool forceSram; - - if (ConfMan.hasKey("forcesramsave", "ds")) { - forceSram = ConfMan.getBool("forcesramsave", "ds"); - } else { - forceSram = false; - } - if (forceSram) { - consolePrintf("Using SRAM save method!\n"); - } - - if (DS::isGBAMPAvailable() && (!forceSram)) { + if (DS::isGBAMPAvailable()) { return &mpSaveManager; - } else { -#ifdef GBA_SRAM_SAVE - return &saveManager; -#else - return NULL; -#endif } + return NULL; } diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index a899c966fc..65ac3f4f7e 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -30,7 +30,6 @@ #include "backends/base-backend.h" #include "common/events.h" #include "nds.h" -#include "ramsave.h" #include "gbampsave.h" #include "backends/saves/default/default-saves.h" #include "backends/timer/default/default-timer.h" @@ -47,9 +46,6 @@ protected: Common::Event eventQueue[96]; int queuePos; -#ifdef GBA_SRAM_SAVE - DSSaveFileManager saveManager; -#endif GBAMPSaveFileManager mpSaveManager; Audio::MixerImpl *_mixer; DefaultTimerManager *_timer; diff --git a/backends/platform/ds/arm9/source/ramsave.cpp b/backends/platform/ds/arm9/source/ramsave.cpp deleted file mode 100644 index d8e74d7445..0000000000 --- a/backends/platform/ds/arm9/source/ramsave.cpp +++ /dev/null @@ -1,538 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ -#ifdef GBA_SRAM_SAVE - - -#include "ramsave.h" -#include "nds.h" -#include "compressor/lz.h" - -#define CART_RAM ((vu8 *) (0x0A000000)) -#define SRAM_SAVE_MAX (65533) - -DSSaveFile::DSSaveFile() { - ptr = 0; - saveCompressed = false; - save.isValid = false; - ownsData = false; - isOpenFlag = true; - isTempFile = false; -} - -DSSaveFile::DSSaveFile(SCUMMSave *s, bool compressed, u8 *data) { - save = *s; - saveData = data; - ptr = 0; - saveCompressed = compressed; - isOpenFlag = true; - - if (saveCompressed) { - u8 *uncompressed = new unsigned char[save.size]; - if (!uncompressed) consolePrintf("Out of memory allocating %d!\n", save.size); - LZ_Uncompress(saveData, uncompressed, save.compressedSize); - saveData = uncompressed; - ownsData = true; - saveCompressed = false; -// consolePrintf("Decompressed. name=%s size=%d (%d)", save.name, save.size, save.compressedSize); - - } else { - ownsData = false; - origHeader = s; - } - - if (save.magic == (int) 0xBEEFCAFE) { - save.isValid = true; - } else { - save.isValid = false; - } - - isTempFile = false; - eosReached = false; -} - -DSSaveFile::~DSSaveFile() { - if (!ownsData) { - *origHeader = save; - DSSaveFileManager::instance()->flushToSaveRAM(); - } - if (ownsData) { - delete[] saveData; - } -} - -bool DSSaveFile::loadFromSaveRAM(vu8 *address) { - - SCUMMSave newSave; - - for (int t = 0; t < (int) sizeof(newSave); t++) { - ((char *) (&newSave))[t] = *(address + t); - } - - if (newSave.magic == 0xBEEFCAFE) { - newSave.isValid = true; - - *((u16 *) (0x4000204)) |= 0x3; - - saveData = new unsigned char[newSave.compressedSize]; - - for (int t = 0; t < (int) newSave.compressedSize; t++) { - ((char *) (saveData))[t] = *(address + t + sizeof(newSave)); - } - - if (ownsData) delete[] this->saveData; - save = newSave; - saveCompressed = true; - this->saveData = saveData; - ownsData = true; - ptr = 0; - - return true; - } - - return false; -} - -void DSSaveFile::compress() { - if (!saveCompressed) { - unsigned char *compBuffer = new unsigned char[(save.size * 110) / 100]; - int compSize = LZ_Compress((u8 *) saveData, compBuffer, save.size); - save.compressedSize = compSize; - - - - delete[] saveData; - - // Make the save smaller - saveData = (u8 *) realloc(compBuffer, save.compressedSize); - saveCompressed = true; - } -} - -int DSSaveFile::saveToSaveRAM(vu8 *address) { - - unsigned char *compBuffer; - bool failed; - - - int compSize; - - compress(); - - compSize = save.compressedSize; - compBuffer = saveData; - - if (DSSaveFileManager::instance()->getBytesFree() >= getRamUsage()) { - - DSSaveFileManager::instance()->addBytesFree(-getRamUsage()); - - // Write header - for (int t = 0; t < sizeof(save); t++) { - while (*(address + t) != ((char *) (&save))[t]) { - *(address + t) = ((char *) (&save))[t]; - } - } - - // Write compressed buffer - for (int t = sizeof(save); t < (int) sizeof(save) + compSize; t++) { - while (*(address + t) != compBuffer[t - sizeof(save)]) { - *(address + t) = compBuffer[t - sizeof(save)]; - } - } - - failed = false; - } else { - failed = true; - } - - - return failed? 0: compSize + sizeof(save); - -} - -void DSSaveFile::reset() { - ptr = 0; - eosReached = false; -} - -uint32 DSSaveFile::read(void *buf, uint32 size) { - if (ptr + size > save.size) { - size = save.size - ptr; - eosReached = true; - if (size < 0) size = 0; - } - memcpy(buf, saveData + ptr, size); -// consolePrintf("byte: %d ", ((u8 *) (buf))[0]); - - ptr += size; - return size; -} - -int32 DSSaveFile::pos() const { - return ptr; -} - -int32 DSSaveFile::size() const { - return save.size; -} - -bool DSSaveFile::seek(int32 pos, int whence) { - switch (whence) { - case SEEK_SET: { - ptr = pos; - break; - } - case SEEK_CUR: { - ptr += pos; - break; - } - case SEEK_END: { - ptr = save.size + pos; - break; - } - } - eosReached = false; - return true; -} - -bool DSSaveFile::eos() const { - return eosReached; -} - -void DSSaveFile::clearErr() { - eosReached = false; -} - -bool DSSaveFile::skip(uint32 bytes) { - ptr = ptr + bytes; - if (ptr > (int) save.size) ptr = save.size; - return true; -} - -uint32 DSSaveFile::write(const void *buf, uint32 size) { - - if (ptr + size > DS_MAX_SAVE_SIZE) { - size = DS_MAX_SAVE_SIZE - ptr; - } - - memcpy(saveData + ptr, buf, size); - ptr += size; - save.size += size; - return size; -} - -bool DSSaveFile::matches(const char *prefix, int num) { - char str[16]; - if (isValid()) { - sprintf(str, "%s%02d", prefix, num); - if (!strcmp(str, save.name)) { - return true; - } else { - return false; - } - } else { - return false; - } -} - -bool DSSaveFile::matches(const char *filename) { - if (isValid()) { - return !strcmp(save.name, filename); - } else { - return false; - } -} - -void DSSaveFile::setName(char *name) { - save.isValid = true; - save.magic = 0xBEEFCAFE; - ownsData = true; - save.size = 0; - save.compressedSize = 0; - saveData = new unsigned char[DS_MAX_SAVE_SIZE]; - strcpy(save.name, name); - - if ((strstr(name, ".s99")) || (strstr(name, ".c"))) { - isTempFile = true; - } else { - isTempFile = false; - } -} - -void DSSaveFile::clearData() { - save.size = 0; - - if (saveCompressed) { - if (ownsData) { - delete[] saveData; - DSSaveFileManager::instance()->addBytesFree(getRamUsage()); - } - saveData = new unsigned char[DS_MAX_SAVE_SIZE]; - saveCompressed = false; - ownsData = true; - } - -} - -void DSSaveFile::deleteFile() { - if (isValid()) { - if (ownsData) { - DSSaveFileManager::instance()->addBytesFree(getRamUsage()); - delete[] saveData; - saveData = NULL; - } - ptr = 0; - saveCompressed = false; - save.isValid = false; - ownsData = false; - isOpenFlag = true; - } -} - -DSSaveFileManager::DSSaveFileManager() { - instancePtr = this; - - *((u16 *) (0x4000204)) |= 0x3; - swiWaitForVBlank(); - - loadAllFromSRAM(); -} - -DSSaveFileManager::~DSSaveFileManager() { - instancePtr = NULL; -} - -void DSSaveFileManager::loadAllFromSRAM() { - int addr = 1; - - for (int r = 0; r < 8; r++) { - gbaSave[r].deleteFile(); - } - - sramBytesFree = SRAM_SAVE_MAX; - - // Try to find saves in save RAM - for (int r = 0; r < 8; r++) { - if (gbaSave[r].loadFromSaveRAM(CART_RAM + addr)) { - addr += gbaSave[r].getRamUsage(); - sramBytesFree -= gbaSave[r].getRamUsage(); - } - } - -} - -void DSSaveFileManager::formatSram() { - for (int r = 0; r < SRAM_SAVE_MAX; r++) { - *(CART_RAM + r) = 0; - } - - loadAllFromSRAM(); -} - -void DSSaveFileManager::listFiles() { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid()) { - consolePrintf("'%s': %d bytes\n", gbaSave[r].getName(), gbaSave[r].getRamUsage()); - } - } - consolePrintf("SRAM free: %d bytes\n", getBytesFree()); -} - -DSSaveFileManager *DSSaveFileManager::instancePtr = NULL; - -DSSaveFile *DSSaveFileManager::openSavefile(const char *filename, bool saveOrLoad) { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(filename))) { -// consolePrintf("Matched save %d (%d)\n", r, gbaSave[r].getSize()); - gbaSave[r].reset(); - //consolePrintf("reset "); - if (saveOrLoad) gbaSave[r].clearData(); -// consolePrintf("cleared "); - return gbaSave[r].clone(); - } - } - - if (saveOrLoad) { - return makeSaveFile(filename, saveOrLoad); - } else { - return NULL; - } -} - - - -DSSaveFile *DSSaveFile::clone() { -// consolePrintf("Clone %s %d\n", save.name, save.size); - return new DSSaveFile(&save, saveCompressed, saveData); -} - -void DSSaveFileManager::deleteFile(const char *name) { -// consolePrintf("Deleting %s", name); - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(name))) { - gbaSave[r].deleteFile(); - } - } - flushToSaveRAM(); -} - -bool DSSaveFileManager::removeSavefile(const Common::String &filename) { - consolePrintf("DSSaveFileManager::removeSavefile : Not implemented yet.\n"); - assert(false); - //TODO: Implement this. Most likely, you just have to use the code of deleteFile? - return false; -} - - -Common::StringArray DSSaveFileManager::listSavefiles(const Common::String &pattern) { - consolePrintf("DSSaveFileManager::listSavefiles : Not implemented yet.\n"); - assert(false); - return Common::StringArray(); - /* - TODO: Implement this. If you don't understand what it should do, just ask - (e.g. on scummvm-devel or Fingolfin). It should be pretty simple if you - use Common::matchString from common/util.h and read the Doxygen docs, - then combine this with the old code below... - */ -} - - -/* -void DSSaveFileManager::listSavefiles(const char *prefix, bool *marks, int num) { - memset(marks, true, num * sizeof(bool)); - return; - - memset(marks, false, num*sizeof(bool)); - - for (int saveNum = 0; saveNum < num; saveNum++) { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(prefix, saveNum))) { - marks[saveNum] = true; - } - } - } - -} -*/ - - -DSSaveFile *DSSaveFileManager::makeSaveFile(const char *filename, bool saveOrLoad) { - - // Find a free save slot - int r = 0; - - while ((r < 8) && (gbaSave[r].isValid())) { - r++; - } - - if ((r == 8) && (gbaSave[r].isValid())) { - // No more saves - return NULL; - } else { - // Allocate this save -// consolePrintf("Allocated save %d\n", r); - gbaSave[r].setName((char *) filename); - gbaSave[r].reset(); - return gbaSave[r].clone(); - } -} - -void DSSaveFileManager::flushToSaveRAM() { - int cartAddr = 1; - int s; - int extraData = DSSaveFileManager::getExtraData(); - - *((u16 *) (0x4000204)) |= 0x3; - - swiWaitForVBlank(); - - int size = 0; - for (int r = 0; (r < 8); r++) { - if (gbaSave[r].isValid()) { - gbaSave[r].compress(); - if (!gbaSave[r].isTemp()) size += gbaSave[r].getRamUsage(); - } - } - - if (size <= SRAM_SAVE_MAX) { - - for (int r = 0; r < SRAM_SAVE_MAX; r++) { - *(CART_RAM + r) = 0; - } - - sramBytesFree = SRAM_SAVE_MAX; - - for (int r = 0; (r < 8); r++) { - if (gbaSave[r].isValid() && (!gbaSave[r].isTemp())) { - - cartAddr += s = gbaSave[r].saveToSaveRAM(CART_RAM + cartAddr); - - /* if (s == 0) { - consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again.", gbaSave[r].getName()); - failed = true; - }*/ - } - } - } else { - - consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again."); - loadAllFromSRAM(); - - } - - DSSaveFileManager::setExtraData(extraData); -// consolePrintf("SRAM free: %d bytes\n", getBytesFree()); -} - -void DSSaveFileManager::setExtraData(int data) { - // Offset of extra data is 31. This overlaps the padding and reserved bytes of the first save entry. - // which have not been used up until now. So it should be safe. - - vu8 *sram = CART_RAM + 31; - - *(sram + 0) = 0xF0; // This is an identifier to check - *(sram + 1) = 0x0D; // that extra data is present. - - *(sram + 2) = (data & 0xFF000000) >> 24; // Now write the actual data - *(sram + 3) = (data & 0x00FF0000) >> 16; // taking care to use single - *(sram + 4) = (data & 0x0000FF00) >> 8; // byte writes (it's an 8-bit bus) - *(sram + 5) = (data & 0x000000FF); -} - -bool DSSaveFileManager::isExtraDataPresent() { - vu8 *sram = CART_RAM + 31; - - // Check for the identifier - return ((*(sram + 0) == 0xF0) && (*(sram + 1) == 0x0D)); -} - -int DSSaveFileManager::getExtraData() { - vu8 *sram = CART_RAM + 31; - - if (isExtraDataPresent()) { - int value = (*(sram + 2) << 24) | (*(sram + 3) << 16) | (*(sram + 4) << 8) | (*(sram + 5)); - return value; - } else { - return 0; - } -} - -#endif diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h deleted file mode 100644 index f2cfe0fc0b..0000000000 --- a/backends/platform/ds/arm9/source/ramsave.h +++ /dev/null @@ -1,155 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef _RAMSAVE_H_ -#define _RAMSAVE_H_ - -#include -#include "common/system.h" -#include "common/savefile.h" - - -// SaveFileManager class - -#define DS_MAX_SAVE_SIZE 150000 - -class DSSaveFile : public Common::InSaveFile, public Common::OutSaveFile { - int address; - int ptr; - bool ownsData; - bool saveCompressed; - - struct SCUMMSave { - u32 magic; // 4 - bool isValid; // 5 - bool pad; // 6 - char name[16]; // 22 - u32 size; // 26 - u32 compressedSize; // 30 - u16 extraMagic; // 32 - u32 reserved; // 36 - } __attribute__ ((packed)); - - SCUMMSave save; - u8 *saveData; - SCUMMSave *origHeader; - bool isOpenFlag; - bool isTempFile; - bool eosReached; - -public: - DSSaveFile(); - DSSaveFile(SCUMMSave *s, bool saveCompressed, u8 *data); - ~DSSaveFile(); - - void reset(); - - bool isOpen() const { return isOpenFlag; } - virtual bool eos() const; - virtual void clearErr(); - virtual bool skip(uint32 size); - - virtual int32 pos() const; - virtual int32 size() const; - virtual bool seek(int32 pos, int whence); - - uint32 read(void *buf, uint32 size); - uint32 write(const void *buf, uint32 size); - - void setName(char *name); - char *getName() { return save.name; } - - bool isValid() { return save.isValid; } - bool isTemp() { return isTempFile; } - bool matches(const char *prefix, int num); - bool matches(const char *filename); - - void clearData(); - void compress(); - - int getRamUsage() { return sizeof(save) + save.compressedSize; } - char *getRamImage() { return (char *) &save; } - - int getSize() { return save.size; } - - DSSaveFile *clone(); - - bool loadFromSaveRAM(vu8 *address); - int saveToSaveRAM(vu8 *address); - - - - void deleteFile(); - - void operator delete(void *p) { -// consolePrintf("Finished! size=%d\n", ((DSSaveFile *) (p))->save->size); - } - - - -}; - - - -class DSSaveFileManager : public Common::SaveFileManager { - - DSSaveFile gbaSave[8]; - static DSSaveFileManager *instancePtr; - int sramBytesFree; - -public: - DSSaveFileManager(); - ~DSSaveFileManager(); - - static DSSaveFileManager *instance() { return instancePtr; } - - DSSaveFile *openSavefile(const char *filename, bool saveOrLoad); - - virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } - virtual Common::InSaveFile *openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } - - virtual bool removeSavefile(const Common::String &filename); - virtual Common::StringArray listSavefiles(const Common::String &pattern); - - void flushToSaveRAM(); - - void addBytesFree(int size) { sramBytesFree += size; } - int getBytesFree() { return sramBytesFree; } - - void deleteFile(char *name); - void listFiles(); - void formatSram(); - - void loadAllFromSRAM(); - - static bool isExtraDataPresent(); - static int getExtraData(); - static void setExtraData(int data); - -protected: - DSSaveFile *makeSaveFile(const Common::String &filename, bool saveOrLoad); -}; - -#endif diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index e3c18c7174..44cba006df 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -12,7 +12,6 @@ PORT_OBJS := \ arm9/source/gbampsave.o \ arm9/source/scummhelp.o \ arm9/source/osystem_ds.o \ - arm9/source/ramsave.o \ arm9/source/touchkeyboard.o \ arm9/source/zipreader.o \ arm9/source/dsoptions.o \ @@ -27,9 +26,9 @@ DATA_OBJS := \ arm9/data/default_font.o \ arm9/data/8x8font_tga.o -COMPRESSOR_OBJS := #arm9/source/compressor/lz.o - -FAT_OBJS := arm9/source/fat/disc_io.o arm9/source/fat/gba_nds_fat.o\ +FAT_OBJS := \ + arm9/source/fat/disc_io.o \ + arm9/source/fat/gba_nds_fat.o \ arm9/source/fat/io_fcsr.o \ arm9/source/fat/io_m3cf.o \ arm9/source/fat/io_mpcf.o \ @@ -50,12 +49,9 @@ FAT_OBJS := arm9/source/fat/disc_io.o arm9/source/fat/gba_nds_fat.o\ # arm9/source/fat/io_sd_common.o arm9/source/fat/io_scsd_s.o \ # arm9/source/fat/io_sc_common.o arm9/source/fat/io_sd_common.o -LIBCARTRESET_OBJS := \ -# arm9/source/libcartreset/cartreset.o - #MODULE_OBJS := $(PORT_OBJS) $(DATA_OBJS) $(FAT_OBJS) -MODULE_OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) +MODULE_OBJS := $(DATA_OBJS) $(PORT_OBJS) $(FAT_OBJS) #--------------------------------------------------------------------------------- @@ -113,8 +109,7 @@ MODULE_DIRS += \ backends/platform/ds/arm7/source/ \ backends/platform/ds/arm7/source/libcartreset/ \ backends/platform/ds/arm9/source/ \ - backends/platform/ds/arm9/source/fat/ \ - backends/platform/ds/arm9/source/libcartreset/ + backends/platform/ds/arm9/source/fat/ # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) -- cgit v1.2.3 From c4a626931bda67d909f2d836501c3f409cf9b722 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 23:23:19 +0000 Subject: DS: Code formatting svn-id: r50742 --- backends/platform/ds/arm9/source/osystem_ds.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 55475b0bff..c4ff241de0 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -315,7 +315,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int u32 pixelsLeft = w; - if (MISALIGNED16(dest)) { + if (MISALIGNED16(dest)) { // Read modify write dest--; @@ -332,7 +332,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // We can now assume dest is aligned u16 *dest16 = (u16 *) dest; - for (dx = 0; dx < pixelsLeft; dx+=2) { + for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; mix = *src + (*(src + 1) << 8); @@ -367,7 +367,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int u32 pixelsLeft = w; - if (MISALIGNED16(dest)) { + if (MISALIGNED16(dest)) { // Read modify write dest--; @@ -387,7 +387,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int u16 *dest16 = (u16 *) dest; u16 *destSub16 = (u16 *) destSub; - for (dx = 0; dx < pixelsLeft; dx+=2) { + for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; mix = *src + (*(src + 1) << 8); -- cgit v1.2.3 From 6aa53ba3b8d7bd207aafd1ab4fa2c68b5f3e50b3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 23:23:44 +0000 Subject: DS: Remove cruft from Makefiles svn-id: r50743 --- backends/platform/ds/arm9/makefile | 47 -------------------------------------- backends/platform/ds/module.mk | 6 ----- 2 files changed, 53 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 703d5d69b7..beb55586ac 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -265,12 +265,7 @@ ifdef USE_DEBUGGER LIBS += -ldsdebugger -ldswifi9 endif -#-Lscumm -lscumm -Lbase -lbase -Lcommon -lcommon -Lgraphics -lgraphics -Lgui -lgui -Lsound -lsound EXECUTABLE = scummvm.elf -PLUGIN_PREFIX = -PLUGIN_SUFFIX = .plg -PLUGIN_EXTRA_DEPS = plugin.x plugin.syms scummvm.elf -PLUGIN_LDFLAGS = -nostartfiles -Wl,-q,-Tplugin.x,--just-symbols,scummvm.elf,--retain-symbols-file,plugin.syms -L$(ronindir)/lib MKDIR = mkdir -p RM = rm -f RM_REC = rm -rf @@ -280,12 +275,6 @@ OBJCOPY = arm-eabi-objcopy AS = arm-eabi-as HAVE_GCC3 = true -ifdef DYNAMIC_MODULES -DEFINES += -DDYNAMIC_MODULES -PRE_OBJS_FLAGS = -Wl,--whole-archive -POST_OBJS_FLAGS = -Wl,--no-whole-archive -endif - PORT_OBJS := \ $(portdir)/source/blitters_arm.o \ $(portdir)/source/cdaudio.o \ @@ -332,10 +321,6 @@ FAT_OBJS := $(portdir)/source/fat/m3sd.o -# $(portdir)/source/fat/io_cf_common.o $(portdir)/source/fat/io_m3_common.o\ -# $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \ -# $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o - # Files in this list will be optimisied for speed, otherwise they will be optimised for space OPTLIST := actor.cpp dsmain.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp script.cpp #OPTLIST := @@ -371,11 +356,6 @@ clean: $(RM) $(OBJS) $(EXECUTABLE) rm -fr $(BUILD) -plugin_dist : - find . -name '*.plg' | while read p; do \ - sh-elf-strip -g -o "`basename \"$$p\" | tr '[:lower:]' '[:upper:]'`" "$$p"; \ - done - dist : SCUMMVM.BIN plugins plugin_dist @@ -394,26 +374,12 @@ endef # Replacement rule for the one in makefile.common ############## %.o: %.cpp -# echo !!!!!!!!!!!! $(notdir $<) -# ifeq ( $(notdir $<), $(findstring $(notdir $<), $(OPTLIST)) ) -# OPTFLAG=-O3 -# else -# OPTFLAG=-Os -# endif -# export OPTFLAG = ; -# echo !!!!!!!! $(OPTFLAG) $(MKDIR) $(*D)/$(DEPDIR) $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(if $(findstring $(notdir $<), $(OPTLIST)), $(OPT_SPEED), $(OPT_SIZE)) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o #--------------------------------------------------------------------------------- -#--------------------------------------------------------------------------------- -%.o : %.pcx -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - #--------------------------------------------------------------------------------- %.o : %.bin #--------------------------------------------------------------------------------- @@ -432,21 +398,8 @@ endef @echo $(notdir $<) @$(bin2o) -#--------------------------------------------------------------------------------- -%.o : %.map -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.mdl -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - #--------------------------------------------------------------------------------- %.nds: %.bin - @echo ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM $(VERSION);DS Port" ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM $(VERSION);DS Port" dsbuild $@ -l ../ndsloader.bin diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index 44cba006df..f6b69b3633 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -45,12 +45,6 @@ FAT_OBJS := \ arm9/source/fat/m3sd.o -# arm9/source/fat/io_cf_common.o arm9/source/fat/io_m3_common.o\ -# arm9/source/fat/io_sd_common.o arm9/source/fat/io_scsd_s.o \ -# arm9/source/fat/io_sc_common.o arm9/source/fat/io_sd_common.o - - -#MODULE_OBJS := $(PORT_OBJS) $(DATA_OBJS) $(FAT_OBJS) MODULE_OBJS := $(DATA_OBJS) $(PORT_OBJS) $(FAT_OBJS) -- cgit v1.2.3 From f6afba1f19b3ebf6242940f1f27c063cd34f4995 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 23:24:08 +0000 Subject: DS: Split buildrule for scummvm.nds and scummvm.ds.gba This parallels what I did in ds.mk svn-id: r50744 --- backends/platform/ds/arm9/makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index beb55586ac..079e23aec0 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -345,7 +345,7 @@ MODULE_DIRS += . ndsall: @[ -d $(BUILD) ] || mkdir -p $(BUILD) - make -C ./$(BUILD) -f ../makefile scummvm.nds + make -C ./$(BUILD) -f ../makefile scummvm.nds scummvm.ds.gba include $(srcdir)/Makefile.common @@ -400,10 +400,11 @@ endef #--------------------------------------------------------------------------------- %.nds: %.bin - ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM $(VERSION);DS Port" - dsbuild $@ -l ../ndsloader.bin + ndstool -c $@ -9 $< $(ARM7BIN) -b ../../$(LOGO) "$(@F);ScummVM $(VERSION);DS Port" - padbin 16 $(basename $@).ds.gba +%.ds.gba: %.nds + dsbuild $< -o $@ -l $(portdir)/ndsloader.bin + padbin 16 $@ #--------------------------------------------------------------------------------- %.bin: %.elf -- cgit v1.2.3 From 4237f9a416490137f44928213a4fab090e8438b2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 7 Jul 2010 23:24:29 +0000 Subject: DS: Fix OPT_SPEED and OPT_SIZE usage being reversed; add ARM7 files to 'make clean' svn-id: r50745 --- backends/platform/ds/ds.mk | 52 ++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 66afa01a1f..27309663d1 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -60,40 +60,42 @@ LOGO = logoa.bmp -# Files in this list will be optimisied for speed, otherwise they will be optimised for space # Compiler options for files which should be optimised for speed OPT_SPEED := -O3 # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb +# By default optimize for size +CXXFLAGS += $(OPT_SIZE) -# TODO: The original list contained three more files that should be optimized -# for size: actor.cpp gfx.cpp sprite.cpp -- but there are many files with these +# Files listed below will be optimisied for speed, otherwise they will be optimised for space +# TODO: speed original list contained three more files that should be optimized +# for speed: actor.cpp gfx.cpp sprite.cpp -- but there are many files with these # names, which are the "right" ones? -$(ndsdir)/arm9/source/dsmain.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -$(ndsdir)/arm9/source/osystem_ds.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -$(ndsdir)/arm9/source/ds_main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -sound/rate.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/actor_path.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -sound/fmopl.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/saga/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) -engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +$(ndsdir)/arm9/source/dsmain.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/osystem_ds.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/ds_main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +sound/rate.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor_path.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +sound/fmopl.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) # TODO: Fingolfin says: optimizing staticres for size would # save about 30k, so maybe consider that? -#engines/kyra/staticres.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SIZE) +#engines/kyra/staticres.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) @@ -108,7 +110,7 @@ all: scummvm.nds scummvm.ds.gba clean: dsclean dsclean: - $(RM) scummvm.nds scummvm.ds.gba + $(RM) $(addprefix $(ndsdir)/, $(ARM7_MODULE_OBJS)) scummvm.nds scummvm.ds.gba .PHONY: dsclean -- cgit v1.2.3 From b877f3c7115a187acf0fb9fb5fcdacc28ce36ec3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 8 Jul 2010 18:26:05 +0000 Subject: SCI: sorted kernel map alphabetically svn-id: r50746 --- engines/sci/engine/kernel.cpp | 458 ++++++++++++++++++++++++------------------ engines/sci/engine/kernel.h | 22 ++ engines/sci/engine/ksound.cpp | 24 +++ 3 files changed, 313 insertions(+), 191 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 236a310f38..d8d5736a19 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -212,25 +212,33 @@ static const SciWorkaroundEntry kDisposeScript_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -struct SciKernelMapEntry { - const char *name; - KernelFunc *function; - +struct SciKernelMapSubEntry { SciVersion fromVersion; SciVersion toVersion; - byte forPlatform; + + uint16 subNr; + + const char *name; + KernelFunc *function; const char *signature; - const char *subSignatures; // placeholder const SciWorkaroundEntry *workarounds; }; -#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE -#define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 -#define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE -#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 -#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 -#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE +#define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL } + + +#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE +#define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 +#define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE +#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 +#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE + +// SCI-Sound-Version +#define SIG_SOUNDSCI0 SCI_VERSION_1_EARLY, SCI_VERSION_0_LATE +#define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY +#define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE #define SIGFOR_ALL 0x3f #define SIGFOR_DOS 1 << 0 @@ -245,196 +253,264 @@ struct SciKernelMapEntry { #define MAP_CALL(_name_) #_name_, k##_name_ +static const SciKernelMapSubEntry kDoSound_subops[] = { + { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "(o)", NULL }, + { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "(o)", NULL }, + { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "(o)", NULL }, + { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "(o)", NULL }, + { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(o)", NULL }, + { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "(o)", NULL }, + { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "(o)", NULL }, + { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "(o)", NULL }, + { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(o)", NULL }, + { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "(o)", NULL }, + { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "(o)", NULL }, + { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "(o)", NULL }, + { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStop), "(o)", NULL }, + { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), NULL, NULL }, + // ^^ Longbow demo + { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + +struct SciKernelMapEntry { + const char *name; + KernelFunc *function; + + SciVersion fromVersion; + SciVersion toVersion; + byte forPlatform; + + const char *signature; + const SciKernelMapSubEntry *subSignatures; + const SciWorkaroundEntry *workarounds; +}; + // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { - { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, NULL }, - // ^^ - in SQ1 when leaving ulence flats bar, kUnLoad is called with just one argument (FIXME?) - { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, - { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, - { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, - { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, - { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, - { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires - { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, - { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iii)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, - { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, - { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, - { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir]*)", NULL, NULL }, // subop - { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, - { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, - { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, - { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, - { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, - { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, - { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, - { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, - { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, - { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, - { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", NULL, NULL }, // subop - { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, - { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, - { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, - { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, - { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, - { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, - { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, - { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, - { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Abs), SIG_EVERYWHERE, "[io]", NULL, NULL }, + { MAP_CALL(Abs), SIG_EVERYWHERE, "[io]", NULL, NULL }, // ^^ FIXME hoyle - { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, + { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, + { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, + { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, + { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, + { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, + { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop + { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir]*)", NULL, NULL }, // subop + { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, + { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, + { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, + { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", kDoSound_subops, NULL }, // subop + { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, + { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, + { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, + { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, + { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, + { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, + { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, + { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake - { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, - { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, NULL }, - { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, - { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, - { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, - { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, - { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, - { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, - { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, - { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, - { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, - { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, - { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, - { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, - { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop - { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL }, - { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", NULL, NULL }, // subop + { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, + { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, + { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, + { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, + { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, + { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", NULL, NULL }, // subop // ^^ we allow invalid references here, because kGraph(restoreBox) gets called with old non-existant handles often // this should get limited to this call only as soon as subop signatures are available - { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, - { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, - { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, - { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, - { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, - { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, - { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop - { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, - { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, - { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, - { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, // subop - { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, + { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, + { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, + { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop + { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, + { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, + { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, + { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, // subop + { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, + { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, + { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, + { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, + { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, + { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, + { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, + { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, + { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, + { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iii)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL }, + { MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, + { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, + { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, NULL }, + { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, + { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, + { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, + { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, + { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, + { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, NULL }, + // ^^ - in SQ1 when leaving ulence flats bar, kUnLoad is called with just one argument (FIXME?) + { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, #ifdef ENABLE_SCI32 // SCI2 Kernel Functions - { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(Array), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, - { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, - { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, - { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, + { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Array), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, + { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, + { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, + { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, + { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, + { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, // SCI2.1 Kernel Functions - { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, - { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } + { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, + { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, + { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } #endif }; diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 7aa565fe34..429a7903a1 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -458,6 +458,28 @@ reg_t kCD(EngineState *s, int argc, reg_t *argv); #endif +reg_t kDoSoundInit(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundPlay(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundDummy(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundDispose(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundMute(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundStop(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundPause(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundResume(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundMasterVolume(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundUpdate(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundFade(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundGetPolyphony(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundUpdateCues(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSendMidi(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundReverb(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSetHold(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundGetAudioCapability(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSuspend(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSetVolume(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSetPriority(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundSetLoop(EngineState *s, int argc, reg_t *argv); + //@} } // End of namespace Sci diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 3d8869e89e..d205d250de 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -42,6 +42,30 @@ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { return g_sci->_soundCmd->parseCommand(argc, argv, s->r_acc); } +#define CREATE_FORWARD(_name_, _forward_) reg_t k##_name_(EngineState *s, int argc, reg_t *argv) { return g_sci->##_forward_(argc, argv, s->r_acc); } + +CREATE_FORWARD(DoSoundInit, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundPlay, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundDummy, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundDispose, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundMute, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundStop, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundPause, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundResume, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundMasterVolume, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundUpdate, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundFade, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundGetPolyphony, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundUpdateCues, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSendMidi, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundReverb, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetHold, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundGetAudioCapability, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSuspend, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetVolume, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetPriority, _soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetLoop, _soundCmd->parseCommand) + reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case kSciAudioPlay: { -- cgit v1.2.3 From 07fef4c6e6a385732c508fb8129b70dcc4a43571 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 8 Jul 2010 18:38:15 +0000 Subject: SCI: hopefully fix build :P svn-id: r50747 --- engines/sci/engine/ksound.cpp | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index d205d250de..88b4f6a352 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -42,29 +42,29 @@ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { return g_sci->_soundCmd->parseCommand(argc, argv, s->r_acc); } -#define CREATE_FORWARD(_name_, _forward_) reg_t k##_name_(EngineState *s, int argc, reg_t *argv) { return g_sci->##_forward_(argc, argv, s->r_acc); } - -CREATE_FORWARD(DoSoundInit, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundPlay, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundDummy, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundDispose, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundMute, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundStop, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundPause, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundResume, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundMasterVolume, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundUpdate, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundFade, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundGetPolyphony, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundUpdateCues, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSendMidi, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundReverb, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetHold, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundGetAudioCapability, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSuspend, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetVolume, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetPriority, _soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetLoop, _soundCmd->parseCommand) +#define CREATE_FORWARD(_name_, _forward_) reg_t k##_name_(EngineState *s, int argc, reg_t *argv) { return g_sci->_##_forward_(argc, argv, s->r_acc); } + +CREATE_FORWARD(DoSoundInit, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundPlay, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundDummy, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundDispose, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundMute, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundStop, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundPause, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundResume, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundMasterVolume, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundUpdate, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundFade, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundGetPolyphony, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundUpdateCues, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSendMidi, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundReverb, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetHold, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundGetAudioCapability, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSuspend, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetVolume, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetPriority, soundCmd->parseCommand) +CREATE_FORWARD(DoSoundSetLoop, soundCmd->parseCommand) reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { -- cgit v1.2.3 From 7e05d6e62bd8e887ccea2302ad191a775150ccf8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 8 Jul 2010 21:22:59 +0000 Subject: SCI: part of subfunction signature&mapping implemented, little cleanup svn-id: r50750 --- engines/sci/engine/kernel.cpp | 87 +++++++++++++++++++++++++++++++------------ engines/sci/engine/kernel.h | 19 +++++++--- engines/sci/engine/ksound.cpp | 2 + engines/sci/engine/vm.cpp | 4 +- 4 files changed, 82 insertions(+), 30 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d8d5736a19..7be4c442eb 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -216,10 +216,10 @@ struct SciKernelMapSubEntry { SciVersion fromVersion; SciVersion toVersion; - uint16 subNr; + uint16 id; const char *name; - KernelFunc *function; + KernelFunctionCall *function; const char *signature; const SciWorkaroundEntry *workarounds; @@ -236,7 +236,7 @@ struct SciKernelMapSubEntry { #define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE // SCI-Sound-Version -#define SIG_SOUNDSCI0 SCI_VERSION_1_EARLY, SCI_VERSION_0_LATE +#define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE #define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY #define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE @@ -310,14 +310,14 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { struct SciKernelMapEntry { const char *name; - KernelFunc *function; + KernelFunctionCall *function; SciVersion fromVersion; SciVersion toVersion; byte forPlatform; const char *signature; - const SciKernelMapSubEntry *subSignatures; + const SciKernelMapSubEntry *subFunctions; const SciWorkaroundEntry *workarounds; }; @@ -521,7 +521,7 @@ Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) } Kernel::~Kernel() { - for (KernelFuncsContainer::iterator i = _kernelFuncs.begin(); i != _kernelFuncs.end(); ++i) + for (KernelFunctionArray::iterator i = _kernelFuncs.begin(); i != _kernelFuncs.end(); ++i) free(i->signature); } @@ -999,24 +999,26 @@ void Kernel::mapFunctions() { _kernelFuncs.resize(functionCount); - for (uint functNr = 0; functNr < functionCount; functNr++) { + for (uint id = 0; id < functionCount; id++) { // First, get the name, if known, of the kernel function with number functnr - Common::String sought_name = _kernelNames[functNr]; + Common::String kernelName = _kernelNames[id]; // Reset the table entry - _kernelFuncs[functNr].func = NULL; - _kernelFuncs[functNr].signature = NULL; - _kernelFuncs[functNr].origName = sought_name; - _kernelFuncs[functNr].isDummy = true; - - if (sought_name.empty()) { + _kernelFuncs[id].function = NULL; + _kernelFuncs[id].signature = NULL; + _kernelFuncs[id].origName = kernelName; + _kernelFuncs[id].isDummy = true; + _kernelFuncs[id].workarounds = NULL; + _kernelFuncs[id].subFunctions = NULL; + _kernelFuncs[id].subFunctionCount = 0; + if (kernelName.empty()) { // No name was given -> must be an unknown opcode - warning("Kernel function %x unknown", functNr); + warning("Kernel function %x unknown", id); continue; } // Don't map dummy functions - they will never be called - if (sought_name == "Dummy") + if (kernelName == "Dummy") continue; // If the name is known, look it up in s_kernelMap. This table @@ -1024,7 +1026,7 @@ void Kernel::mapFunctions() { SciKernelMapEntry *kernelMap = s_kernelMap; bool nameMatch = false; while (kernelMap->name) { - if (sought_name == kernelMap->name) { + if (kernelName == kernelMap->name) { if ((kernelMap->fromVersion == SCI_VERSION_NONE) || (kernelMap->fromVersion <= myVersion)) if ((kernelMap->toVersion == SCI_VERSION_NONE) || (kernelMap->toVersion >= myVersion)) if (platformMask & kernelMap->forPlatform) @@ -1037,10 +1039,49 @@ void Kernel::mapFunctions() { if (kernelMap->name) { // A match was found if (kernelMap->function) { - _kernelFuncs[functNr].func = kernelMap->function; - _kernelFuncs[functNr].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); - _kernelFuncs[functNr].workarounds = kernelMap->workarounds; - _kernelFuncs[functNr].isDummy = false; + _kernelFuncs[id].function = kernelMap->function; + _kernelFuncs[id].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); + _kernelFuncs[id].workarounds = kernelMap->workarounds; + _kernelFuncs[id].isDummy = false; + if (kernelMap->subFunctions) { + // Get version for subfunction identification + SciVersion mySubVersion = (SciVersion)kernelMap->function(NULL, 0, NULL).offset; + // Now check whats the highest subfunction-id for this version + const SciKernelMapSubEntry *kernelSubMap = kernelMap->subFunctions; + uint16 subFunctionCount = 0; + while (kernelSubMap->function) { + if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) + if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) + if (subFunctionCount <= kernelSubMap->id) + subFunctionCount = kernelSubMap->id + 1; + kernelSubMap++; + } + if (!subFunctionCount) + error("k%s[%x]: no subfunctions found for requested version", kernelName.c_str(), id); + // Now allocate required memory and go through it again + _kernelFuncs[id].subFunctionCount = subFunctionCount; + KernelSubFunction *subFunctions = new KernelSubFunction[subFunctionCount]; + _kernelFuncs[id].subFunctions = subFunctions; + memset(subFunctions, 0, sizeof(KernelSubFunction) * subFunctionCount); + // And fill this info out + kernelSubMap = kernelMap->subFunctions; + while (kernelSubMap->function) { + if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) + if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) { + uint subId = kernelSubMap->id; + subFunctions[subId].function = kernelSubMap->function; + subFunctions[subId].name = kernelSubMap->name; + if (kernelSubMap->signature) + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); + subFunctions[subId].workarounds = kernelSubMap->workarounds; + } + kernelSubMap++; + } + // Now we check, if all filled out entries got signatures + // If a signature is missing go through the subfunctions table again and use the last signature + // specified before our entry. If no signature is found at all -> bomb out + // TODO + } ++mapped; } else { //warning("Ignoring function %s\n", s_kernelFuncMap[found].name); @@ -1048,9 +1089,9 @@ void Kernel::mapFunctions() { } } else { if (nameMatch) - error("kernel function %s[%x] not found for this version/platform", sought_name.c_str(), functNr); + error("k%s[%x]: not found for this version/platform", kernelName.c_str(), id); // No match but a name was given -> stub - warning("Kernel function %s[%x] unmapped", sought_name.c_str(), functNr); + warning("k%s[%x]: unmapped", kernelName.c_str(), id); } } // for all functions requesting to be mapped diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 429a7903a1..7fa3916b31 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -118,7 +118,7 @@ enum { // ---------------------------------------------------------------------------- /* Generic description: */ -typedef reg_t KernelFunc(EngineState *s, int argc, reg_t *argv); +typedef reg_t KernelFunctionCall(EngineState *s, int argc, reg_t *argv); struct SciWorkaroundEntry { SciGameId gameId; @@ -133,12 +133,21 @@ struct SciWorkaroundEntry { #define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, 0, NULL, NULL, -1, 0, { 0, 0 } } -struct KernelFuncWithSignature { - KernelFunc *func; /**< The actual function */ +struct KernelSubFunction { + KernelFunctionCall *function; + const char *name; + uint16 *signature; + const SciWorkaroundEntry *workarounds; +}; + +struct KernelFunction { + KernelFunctionCall *function; Common::String origName; /**< Original name, in case we couldn't map it */ bool isDummy; uint16 *signature; const SciWorkaroundEntry *workarounds; + const KernelSubFunction *subFunctions; + uint16 subFunctionCount; }; enum AutoDetectedFeatures { @@ -172,8 +181,8 @@ public: void dumpScriptClass(char *data, int seeker, int objsize); SelectorCache _selectorCache; /**< Shortcut list for important selectors. */ - typedef Common::Array KernelFuncsContainer; - KernelFuncsContainer _kernelFuncs; /**< Table of kernel functions. */ + typedef Common::Array KernelFunctionArray; + KernelFunctionArray _kernelFuncs; /**< Table of kernel functions. */ /** * Determines whether a list of registers matches a given signature. diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 88b4f6a352..4ecbc523d5 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -39,6 +39,8 @@ namespace Sci { * Used for synthesized music playback */ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { + if (!s) + return make_reg(0, g_sci->_features->detectDoSoundType()); return g_sci->_soundCmd->parseCommand(argc, argv, s->r_acc); } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b1e6eead0e..6973694ea9 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -786,7 +786,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { if (kernelFuncNr >= (int)kernel->_kernelFuncs.size()) error("Invalid kernel function 0x%x requested", kernelFuncNr); - const KernelFuncWithSignature &kernelCall = kernel->_kernelFuncs[kernelFuncNr]; + const KernelFunction &kernelCall = kernel->_kernelFuncs[kernelFuncNr]; if (kernelCall.signature && !kernel->signatureMatch(kernelCall.signature, argc, s->xs->sp + 1)) { @@ -817,7 +817,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function - s->r_acc = kernelCall.func(s, argc, argv); + s->r_acc = kernelCall.function(s, argc, argv); #if 0 // Used for debugging -- cgit v1.2.3 From 916a0f9cbfa4d133c3e459726d4f4285e177f1fc Mon Sep 17 00:00:00 2001 From: Oystein Eftevaag Date: Fri, 9 Jul 2010 01:08:15 +0000 Subject: Added iPad icon svn-id: r50752 --- dists/iphone/Info.plist | 5 +++++ dists/iphone/icon-72.png | Bin 0 -> 5668 bytes ports.mk | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 dists/iphone/icon-72.png diff --git a/dists/iphone/Info.plist b/dists/iphone/Info.plist index 9618eb00f3..a042504b9f 100644 --- a/dists/iphone/Info.plist +++ b/dists/iphone/Info.plist @@ -24,6 +24,11 @@ svn CFBundleIconFile icon.png + CFBundleIconFiles + + icon.png + icon-72.png + UIPrerenderedIcon UIDeviceFamily diff --git a/dists/iphone/icon-72.png b/dists/iphone/icon-72.png new file mode 100644 index 0000000000..d8820f3397 Binary files /dev/null and b/dists/iphone/icon-72.png differ diff --git a/ports.mk b/ports.mk index a7ad8febfe..0a7f6c4d92 100644 --- a/ports.mk +++ b/ports.mk @@ -65,8 +65,9 @@ endif ldid -S scummvm chmod 755 scummvm cp scummvm $(bundle_name)/ScummVM - cp $(srcdir)/dists/iphone/icon.png $(bundle_name)/icon.png - cp $(srcdir)/dists/iphone/Default.png $(bundle_name)/Default.png + cp $(srcdir)/dists/iphone/icon.png $(bundle_name)/ + cp $(srcdir)/dists/iphone/icon-72.png $(bundle_name)/ + cp $(srcdir)/dists/iphone/Default.png $(bundle_name)/ # Location of static libs for the iPhone ifneq ($(BACKEND), iphone) -- cgit v1.2.3 From 9117eec6a72c9dc4abb72ca45ecebbfb7ee04bfc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 09:26:57 +0000 Subject: SCI: getting signatures for subfunctions from previous entries, if needed svn-id: r50754 --- engines/sci/engine/kernel.cpp | 47 ++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7be4c442eb..c5f5e9e61a 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -278,18 +278,18 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, + { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiiii", NULL }, + { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, + { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, + { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, // ^^ Longbow demo { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, + { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "", NULL }, { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, @@ -298,9 +298,9 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), NULL, NULL }, { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, + { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, + { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, @@ -1065,22 +1065,37 @@ void Kernel::mapFunctions() { memset(subFunctions, 0, sizeof(KernelSubFunction) * subFunctionCount); // And fill this info out kernelSubMap = kernelMap->subFunctions; + uint kernelSubNr = 0; while (kernelSubMap->function) { if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) { uint subId = kernelSubMap->id; subFunctions[subId].function = kernelSubMap->function; subFunctions[subId].name = kernelSubMap->name; - if (kernelSubMap->signature) - subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); subFunctions[subId].workarounds = kernelSubMap->workarounds; + if (kernelSubMap->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); + } else { + // we go back the submap to find the previous signature for that kernel call + const SciKernelMapSubEntry *kernelSubMapBack = kernelSubMap; + uint kernelSubLeft = kernelSubNr; + while (kernelSubLeft) { + kernelSubLeft--; + kernelSubMapBack--; + if (kernelSubMapBack->name == kernelSubMap->name) { + if (kernelSubMapBack->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMapBack->signature); + break; + } + } + } + if (!subFunctions[subId].signature) + error("k%s: no previous signatures", kernelSubMap->name); + } } kernelSubMap++; + kernelSubNr++; } - // Now we check, if all filled out entries got signatures - // If a signature is missing go through the subfunctions table again and use the last signature - // specified before our entry. If no signature is found at all -> bomb out - // TODO } ++mapped; } else { -- cgit v1.2.3 From ba776fb2934c7124e969d54e559c5136f5a2fc73 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 12:06:41 +0000 Subject: SCI: implemented subsignatures for kDoSound svn-id: r50755 --- engines/sci/console.cpp | 4 +- engines/sci/engine/kernel.cpp | 38 ++--- engines/sci/engine/kernel.h | 1 + engines/sci/engine/ksound.cpp | 49 +++--- engines/sci/engine/savegame.cpp | 2 +- engines/sci/engine/vm.cpp | 28 +++- engines/sci/sound/soundcmd.cpp | 325 ++++++++++++++++------------------------ engines/sci/sound/soundcmd.h | 80 +++++----- 8 files changed, 236 insertions(+), 291 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 83fa26ea8b..3151691900 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1703,9 +1703,9 @@ bool Console::cmdToggleSound(int argc, const char **argv) { newState.toLowercase(); if (newState == "play") - g_sci->_soundCmd->playSound(id); + g_sci->_soundCmd->processPlaySound(id); else if (newState == "stop") - g_sci->_soundCmd->stopSound(id); + g_sci->_soundCmd->processStopSound(id, false); else DebugPrintf("New state can either be 'play' or 'stop'"); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index c5f5e9e61a..501ad54dfa 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -254,19 +254,19 @@ struct SciKernelMapSubEntry { #define MAP_CALL(_name_) #_name_, k##_name_ static const SciKernelMapSubEntry kDoSound_subops[] = { - { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "(o)", NULL }, - { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "(o)", NULL }, - { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "(o)", NULL }, - { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "(o)", NULL }, - { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(o)", NULL }, - { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "(o)", NULL }, - { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "(o)", NULL }, - { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "(o)", NULL }, - { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(o)", NULL }, - { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "(o)", NULL }, - { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "(o)", NULL }, - { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "(o)", NULL }, - { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStop), "(o)", NULL }, + { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, + { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, + { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "o", NULL }, + { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, + { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, + { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, + { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "[o0]", NULL }, + { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "o", NULL }, + { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, + { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, + { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", NULL }, + { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "", NULL }, + { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, @@ -274,19 +274,19 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, + { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiiii", NULL }, - { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, + { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, // ^^ Longbow demo { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), "", NULL }, { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "", NULL }, @@ -295,7 +295,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", NULL }, { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 7fa3916b31..a5ea379ba6 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -473,6 +473,7 @@ reg_t kDoSoundDummy(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundDispose(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundMute(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundStop(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundStopAll(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundPause(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundResume(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundMasterVolume(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 4ecbc523d5..69ae68674b 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -41,32 +41,33 @@ namespace Sci { reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { if (!s) return make_reg(0, g_sci->_features->detectDoSoundType()); - return g_sci->_soundCmd->parseCommand(argc, argv, s->r_acc); + error("not supposed to call this"); } -#define CREATE_FORWARD(_name_, _forward_) reg_t k##_name_(EngineState *s, int argc, reg_t *argv) { return g_sci->_##_forward_(argc, argv, s->r_acc); } - -CREATE_FORWARD(DoSoundInit, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundPlay, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundDummy, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundDispose, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundMute, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundStop, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundPause, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundResume, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundMasterVolume, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundUpdate, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundFade, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundGetPolyphony, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundUpdateCues, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSendMidi, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundReverb, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetHold, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundGetAudioCapability, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSuspend, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetVolume, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetPriority, soundCmd->parseCommand) -CREATE_FORWARD(DoSoundSetLoop, soundCmd->parseCommand) +#define CREATE_DOSOUND_FORWARD(_name_) reg_t k##_name_(EngineState *s, int argc, reg_t *argv) { return g_sci->_soundCmd->k##_name_(argc, argv, s->r_acc); } + +CREATE_DOSOUND_FORWARD(DoSoundInit) +CREATE_DOSOUND_FORWARD(DoSoundPlay) +CREATE_DOSOUND_FORWARD(DoSoundDummy) +CREATE_DOSOUND_FORWARD(DoSoundDispose) +CREATE_DOSOUND_FORWARD(DoSoundMute) +CREATE_DOSOUND_FORWARD(DoSoundStop) +CREATE_DOSOUND_FORWARD(DoSoundStopAll) +CREATE_DOSOUND_FORWARD(DoSoundPause) +CREATE_DOSOUND_FORWARD(DoSoundResume) +CREATE_DOSOUND_FORWARD(DoSoundMasterVolume) +CREATE_DOSOUND_FORWARD(DoSoundUpdate) +CREATE_DOSOUND_FORWARD(DoSoundFade) +CREATE_DOSOUND_FORWARD(DoSoundGetPolyphony) +CREATE_DOSOUND_FORWARD(DoSoundUpdateCues) +CREATE_DOSOUND_FORWARD(DoSoundSendMidi) +CREATE_DOSOUND_FORWARD(DoSoundReverb) +CREATE_DOSOUND_FORWARD(DoSoundSetHold) +CREATE_DOSOUND_FORWARD(DoSoundGetAudioCapability) +CREATE_DOSOUND_FORWARD(DoSoundSuspend) +CREATE_DOSOUND_FORWARD(DoSoundSetVolume) +CREATE_DOSOUND_FORWARD(DoSoundSetPriority) +CREATE_DOSOUND_FORWARD(DoSoundSetLoop) reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index d1159acbfb..0fe5f2088a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -607,7 +607,7 @@ void SoundCommandParser::reconstructPlayList(int savegame_version) { (*i)->volume = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(vol)); } - cmdPlaySound((*i)->soundObj, 0); + processPlaySound((*i)->soundObj); } } } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 6973694ea9..a0f38c634c 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -787,16 +787,17 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { error("Invalid kernel function 0x%x requested", kernelFuncNr); const KernelFunction &kernelCall = kernel->_kernelFuncs[kernelFuncNr]; + reg_t *argv = s->xs->sp + 1; if (kernelCall.signature - && !kernel->signatureMatch(kernelCall.signature, argc, s->xs->sp + 1)) { + && !kernel->signatureMatch(kernelCall.signature, argc, argv)) { // signature mismatch, check if a workaround is available bool workaroundFound; SciTrackOriginReply originReply; reg_t workaround; workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, workaroundFound, &originReply); if (!workaroundFound) { - kernel->signatureDebug(kernelCall.signature, argc, s->xs->sp + 1); + kernel->signatureDebug(kernelCall.signature, argc, argv); error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernel->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. @@ -804,8 +805,6 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { return; } - reg_t *argv = s->xs->sp + 1; - if (!kernelCall.isDummy) { // Add stack frame to indicate we're executing a callk. // This is useful in debugger backtraces if this @@ -817,7 +816,26 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function - s->r_acc = kernelCall.function(s, argc, argv); + if (!kernelCall.subFunctionCount) { + s->r_acc = kernelCall.function(s, argc, argv); + } else { + // Sub-functions available, check signature and call that one directly + if (argc < 1) + error("[VM] k%s: no subfunction-id parameter given"); + const uint16 subId = argv[0].toUint16(); + // Skip over subfunction-id + argc--; + argv++; + if (subId >= kernelCall.subFunctionCount) + error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.origName, subId); + const KernelSubFunction &kernelSubCall = kernelCall.subFunctions[subId]; + if (!kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { + // Signature mismatch + kernel->signatureDebug(kernelSubCall.signature, argc, argv); + error("[VM] k%s: subfunction signature mismatch", kernelSubCall.name); + } + s->r_acc = kernelSubCall.function(s, argc, argv); + } #if 0 // Used for debugging diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index d318b1ced0..6732137962 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -36,133 +36,29 @@ namespace Sci { #define SCI1_SOUND_FLAG_MAY_PAUSE 1 /* Only here for completeness; The interpreter doesn't touch this bit */ #define SCI1_SOUND_FLAG_SCRIPTED_PRI 2 /* but does touch this */ -#define SOUNDCOMMAND(x) _soundCommands.push_back(new MusicEntryCommand(#x, &SoundCommandParser::x)) - SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion) : _resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) { _music = new SciMusic(_soundVersion); _music->init(); - - switch (_soundVersion) { - case SCI_VERSION_0_EARLY: - case SCI_VERSION_0_LATE: - SOUNDCOMMAND(cmdInitSound); - SOUNDCOMMAND(cmdPlaySound); - SOUNDCOMMAND(cmdDummy); - SOUNDCOMMAND(cmdDisposeSound); - SOUNDCOMMAND(cmdMuteSound); - SOUNDCOMMAND(cmdStopSound); - SOUNDCOMMAND(cmdPauseSound); - SOUNDCOMMAND(cmdResumeSound); - SOUNDCOMMAND(cmdMasterVolume); - SOUNDCOMMAND(cmdUpdateSound); - SOUNDCOMMAND(cmdFadeSound); - SOUNDCOMMAND(cmdGetPolyphony); - SOUNDCOMMAND(cmdStopAllSounds); - _cmdUpdateCuesIndex = -1; - break; - case SCI_VERSION_1_EARLY: - SOUNDCOMMAND(cmdMasterVolume); - SOUNDCOMMAND(cmdMuteSound); - SOUNDCOMMAND(cmdDummy); - SOUNDCOMMAND(cmdGetPolyphony); - SOUNDCOMMAND(cmdUpdateSound); - SOUNDCOMMAND(cmdInitSound); - SOUNDCOMMAND(cmdDisposeSound); - SOUNDCOMMAND(cmdPlaySound); - SOUNDCOMMAND(cmdStopSound); - SOUNDCOMMAND(cmdPauseSound); - SOUNDCOMMAND(cmdFadeSound); - SOUNDCOMMAND(cmdUpdateCues); - SOUNDCOMMAND(cmdSendMidi); - SOUNDCOMMAND(cmdReverb); - SOUNDCOMMAND(cmdSetSoundHold); - SOUNDCOMMAND(cmdDummy); // Longbow demo - _cmdUpdateCuesIndex = 11; - break; - case SCI_VERSION_1_LATE: - SOUNDCOMMAND(cmdMasterVolume); - SOUNDCOMMAND(cmdMuteSound); - SOUNDCOMMAND(cmdDummy); - SOUNDCOMMAND(cmdGetPolyphony); - SOUNDCOMMAND(cmdGetAudioCapability); - SOUNDCOMMAND(cmdSuspendSound); - SOUNDCOMMAND(cmdInitSound); - SOUNDCOMMAND(cmdDisposeSound); - SOUNDCOMMAND(cmdPlaySound); - SOUNDCOMMAND(cmdStopSound); - SOUNDCOMMAND(cmdPauseSound); - SOUNDCOMMAND(cmdFadeSound); - SOUNDCOMMAND(cmdSetSoundHold); - SOUNDCOMMAND(cmdDummy); - SOUNDCOMMAND(cmdSetSoundVolume); - SOUNDCOMMAND(cmdSetSoundPriority); - SOUNDCOMMAND(cmdSetSoundLoop); - SOUNDCOMMAND(cmdUpdateCues); - SOUNDCOMMAND(cmdSendMidi); - SOUNDCOMMAND(cmdReverb); - SOUNDCOMMAND(cmdUpdateSound); - _cmdUpdateCuesIndex = 17; - break; - default: - error("Sound command parser: unknown sound version %d", _soundVersion); - break; - } } SoundCommandParser::~SoundCommandParser() { - for (SoundCommandContainer::iterator i = _soundCommands.begin(); i != _soundCommands.end(); ++i) - delete *i; - delete _music; } -reg_t SoundCommandParser::parseCommand(int argc, reg_t *argv, reg_t acc) { - uint16 command = argv[0].toUint16(); - reg_t obj = (argc > 1) ? argv[1] : NULL_REG; - int16 value = (argc > 2) ? argv[2].toSint16() : 0; - _acc = acc; - _argc = argc; - _argv = argv; - - if (argc == 6) { // cmdSendMidi - byte channel = argv[2].toUint16() & 0xf; - byte midiCmd = argv[3].toUint16() & 0xff; - - uint16 controller = argv[4].toUint16(); - uint16 param = argv[5].toUint16(); - - if (channel) - channel--; // channel is given 1-based, we are using 0-based - - _midiCommand = (channel | midiCmd) | ((uint32)controller << 8) | ((uint32)param << 16); - } - - if (command < _soundCommands.size()) { - if (command != _cmdUpdateCuesIndex) { - //printf("%s, object %04x:%04x\n", _soundCommands[command]->desc, PRINT_REG(obj)); // debug - debugC(2, kDebugLevelSound, "%s, object %04x:%04x", _soundCommands[command]->desc, PRINT_REG(obj)); - } - - (this->*(_soundCommands[command]->sndCmd))(obj, value); - } else { - error("Invalid sound command requested (%d), valid range is 0-%d", command, _soundCommands.size() - 1); - } - - return _acc; +reg_t SoundCommandParser::kDoSoundInit(int argc, reg_t *argv, reg_t acc) { + processInitSound(argv[0]); + return acc; } -void SoundCommandParser::cmdInitSound(reg_t obj, int16 value) { - if (!obj.segment) - return; - +void SoundCommandParser::processInitSound(reg_t obj) { int resourceId = readSelectorValue(_segMan, obj, SELECTOR(number)); // Check if a track with the same sound object is already playing MusicEntry *oldSound = _music->getSlot(obj); if (oldSound) - cmdDisposeSound(obj, value); + processDisposeSound(obj); MusicEntry *newSound = new MusicEntry(); newSound->resourceId = resourceId; @@ -208,10 +104,12 @@ void SoundCommandParser::cmdInitSound(reg_t obj, int16 value) { } } -void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundPlay(int argc, reg_t *argv, reg_t acc) { + processPlaySound(argv[0]); + return acc; +} +void SoundCommandParser::processPlaySound(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdPlaySound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -221,8 +119,8 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { int resourceId = obj.segment ? readSelectorValue(_segMan, obj, SELECTOR(number)) : -1; if (musicSlot->resourceId != resourceId) { // another sound loaded into struct - cmdDisposeSound(obj, value); - cmdInitSound(obj, value); + processDisposeSound(obj); + processInitSound(obj); // Find slot again :) musicSlot = _music->getSlot(obj); } @@ -250,21 +148,24 @@ void SoundCommandParser::cmdPlaySound(reg_t obj, int16 value) { _music->soundPlay(musicSlot); } -void SoundCommandParser::cmdDummy(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundDummy(int argc, reg_t *argv, reg_t acc) { warning("cmdDummy invoked"); // not supposed to occur + return acc; } -void SoundCommandParser::cmdDisposeSound(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundDispose(int argc, reg_t *argv, reg_t acc) { + processDisposeSound(argv[0]); + return acc; +} +void SoundCommandParser::processDisposeSound(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdDisposeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } - cmdStopSound(obj, value); + processStopSound(obj, false); _music->soundKill(musicSlot); writeSelectorValue(_segMan, obj, SELECTOR(handle), 0); @@ -274,14 +175,12 @@ void SoundCommandParser::cmdDisposeSound(reg_t obj, int16 value) { writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundStopped); } -void SoundCommandParser::cmdStopSound(reg_t obj, int16 value) { - processStopSound(obj, value, false); +reg_t SoundCommandParser::kDoSoundStop(int argc, reg_t *argv, reg_t acc) { + processStopSound(argv[0], false); + return acc; } -void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFinishedPlaying) { - if (!obj.segment) - return; - +void SoundCommandParser::processStopSound(reg_t obj, bool sampleFinishedPlaying) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdStopSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -309,19 +208,22 @@ void SoundCommandParser::processStopSound(reg_t obj, int16 value, bool sampleFin _music->soundStop(musicSlot); } -void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + uint16 value = argc > 1 ? argv[1].toUint16() : 0; + if (!obj.segment) { // pause the whole playlist // Pausing/Resuming the whole playlist was introduced in the SCI1 late // sound scheme. if (_soundVersion <= SCI_VERSION_1_EARLY) - return; + return acc; _music->pauseAll(value); } else { // pause a playlist slot MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdPauseSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } if (_soundVersion <= SCI_VERSION_0_LATE) { @@ -332,51 +234,51 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) { _music->soundToggle(musicSlot, value); } } + return acc; } -void SoundCommandParser::cmdResumeSound(reg_t obj, int16 value) { - // SCI0 only command - - if (!obj.segment) - return; +// SCI0 only command +reg_t SoundCommandParser::kDoSoundResume(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdResumeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPlaying); _music->soundResume(musicSlot); + return acc; } -void SoundCommandParser::cmdMuteSound(reg_t obj, int16 value) { - if (_argc > 1) // the first parameter is the sound command - _music->soundSetSoundOn(obj.toUint16()); - _acc = make_reg(0, _music->soundGetSoundOn()); +reg_t SoundCommandParser::kDoSoundMute(int argc, reg_t *argv, reg_t acc) { + if (argc > 0) + _music->soundSetSoundOn(argv[0].toUint16()); + return make_reg(0, _music->soundGetSoundOn()); } -void SoundCommandParser::cmdMasterVolume(reg_t obj, int16 value) { - debugC(2, kDebugLevelSound, "cmdMasterVolume: %d", value); - _acc = make_reg(0, _music->soundGetMasterVolume()); +reg_t SoundCommandParser::kDoSoundMasterVolume(int argc, reg_t *argv, reg_t acc) { + acc = make_reg(0, _music->soundGetMasterVolume()); - if (_argc > 1) { // the first parameter is the sound command - int vol = CLIP(obj.toSint16(), 0, kMaxSciVolume); + if (argc > 0) { + debugC(2, kDebugLevelSound, "cmdMasterVolume: %d", argv[0].toSint16()); + int vol = CLIP(argv[0].toSint16(), 0, kMaxSciVolume); vol = vol * Audio::Mixer::kMaxMixerVolume / kMaxSciVolume; ConfMan.setInt("music_volume", vol); ConfMan.setInt("sfx_volume", vol); g_engine->syncSoundSettings(); } + return acc; } -void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdFadeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } int volume = musicSlot->volume; @@ -385,11 +287,11 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { if (musicSlot->status != kSoundPlaying) { debugC(2, kDebugLevelSound, "cmdFadeSound: fading requested, but sound is currently not playing"); writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); - return; + return acc; } - switch (_argc) { - case 2: // SCI0 + switch (argc) { + case 1: // SCI0 // SCI0 fades out all the time and when fadeout is done it will also // stop the music from playing musicSlot->fadeTo = 0; @@ -398,34 +300,34 @@ void SoundCommandParser::cmdFadeSound(reg_t obj, int16 value) { musicSlot->fadeTicker = 0; break; - case 5: // SCI01+ - case 6: // SCI1+ (SCI1 late sound scheme), with fade and continue - musicSlot->fadeTo = CLIP(_argv[2].toUint16(), 0, MUSIC_VOLUME_MAX); - musicSlot->fadeStep = volume > _argv[2].toUint16() ? -_argv[4].toUint16() : _argv[4].toUint16(); - musicSlot->fadeTickerStep = _argv[3].toUint16() * 16667 / _music->soundGetTempo(); + case 4: // SCI01+ + case 5: // SCI1+ (SCI1 late sound scheme), with fade and continue + musicSlot->fadeTo = CLIP(argv[1].toUint16(), 0, MUSIC_VOLUME_MAX); + musicSlot->fadeStep = volume > argv[1].toUint16() ? -argv[3].toUint16() : argv[3].toUint16(); + musicSlot->fadeTickerStep = argv[2].toUint16() * 16667 / _music->soundGetTempo(); musicSlot->fadeTicker = 0; - musicSlot->stopAfterFading = (_argc == 6) ? (_argv[5].toUint16() != 0) : false; + musicSlot->stopAfterFading = (argc == 5) ? (argv[4].toUint16() != 0) : false; break; default: - error("cmdFadeSound: unsupported argc %d", _argc); + error("cmdFadeSound: unsupported argc %d", argc); } debugC(2, kDebugLevelSound, "cmdFadeSound: to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); + return acc; } -void SoundCommandParser::cmdGetPolyphony(reg_t obj, int16 value) { - _acc = make_reg(0, _music->soundGetVoices()); // Get the number of voices +reg_t SoundCommandParser::kDoSoundGetPolyphony(int argc, reg_t *argv, reg_t acc) { + return make_reg(0, _music->soundGetVoices()); // Get the number of voices } -void SoundCommandParser::cmdUpdateSound(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundUpdate(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdUpdateSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } musicSlot->loop = readSelectorValue(_segMan, obj, SELECTOR(loop)); @@ -435,12 +337,15 @@ void SoundCommandParser::cmdUpdateSound(reg_t obj, int16 value) { uint32 objPrio = readSelectorValue(_segMan, obj, SELECTOR(pri)); if (objPrio != musicSlot->priority) _music->soundSetPriority(musicSlot, objPrio); + return acc; } -void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundUpdateCues(int argc, reg_t *argv, reg_t acc) { + processUpdateCues(argv[0]); + return acc; +} +void SoundCommandParser::processUpdateCues(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdUpdateCues: Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -460,7 +365,7 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { musicSlot->sampleLoopCounter = currentLoopCounter; } if ((!_music->soundIsActive(musicSlot)) && (musicSlot->status != kSoundPaused)) { - processStopSound(obj, 0, true); + processStopSound(obj, true); } else { _music->updateAudioStreamTicker(musicSlot); } @@ -482,7 +387,7 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { writeSelectorValue(_segMan, obj, SELECTOR(signal), musicSlot->signal); // We need to do this especially because state selector needs to get updated if (musicSlot->signal == SIGNAL_OFFSET) - cmdStopSound(obj, 0); + processStopSound(obj, false); } } else { // Slot actually has no data (which would mean that a sound-resource w/ @@ -498,10 +403,10 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { // We need signal for sci0 at least in iceman as well (room 14, fireworks) writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); if (_soundVersion <= SCI_VERSION_0_LATE) { - cmdStopSound(obj, 0); + processStopSound(obj, false); } else { if (musicSlot->stopAfterFading) - cmdStopSound(obj, 0); + processStopSound(obj, false); } } @@ -518,39 +423,56 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, int16 value) { } } -void SoundCommandParser::cmdSendMidi(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + byte channel = argv[2].toUint16() & 0xf; + byte midiCmd = argv[3].toUint16() & 0xff; + + uint16 controller = argv[4].toUint16(); + uint16 param = argv[5].toUint16(); + + if (channel) + channel--; // channel is given 1-based, we are using 0-based + + uint32 midiCommand = (channel | midiCmd) | ((uint32)controller << 8) | ((uint32)param << 16); + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // TODO: maybe it's possible to call this with obj == 0:0 and send directly?! // if so, allow it //_music->sendMidiCommand(_midiCommand); warning("cmdSendMidi: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } - _music->sendMidiCommand(musicSlot, _midiCommand); + _music->sendMidiCommand(musicSlot, midiCommand); + return acc; } -void SoundCommandParser::cmdReverb(reg_t obj, int16 value) { - _music->setReverb(obj.toUint16() & 0xF); +reg_t SoundCommandParser::kDoSoundReverb(int argc, reg_t *argv, reg_t acc) { + _music->setReverb(argv[0].toUint16() & 0xF); + return acc; } -void SoundCommandParser::cmdSetSoundHold(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundSetHold(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdSetSoundHold: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } // Set the special hold marker ID where the song should be looped at. - musicSlot->hold = value; + musicSlot->hold = argv[1].toSint16(); + return acc; } -void SoundCommandParser::cmdGetAudioCapability(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundGetAudioCapability(int argc, reg_t *argv, reg_t acc) { // Tests for digital audio support - _acc = make_reg(0, 1); + return make_reg(0, 1); } -void SoundCommandParser::cmdStopAllSounds(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundStopAll(int argc, reg_t *argv, reg_t acc) { Common::StackLock(_music->_mutex); const MusicList::iterator end = _music->getPlayListEnd(); @@ -558,18 +480,19 @@ void SoundCommandParser::cmdStopAllSounds(reg_t obj, int16 value) { if (_soundVersion <= SCI_VERSION_0_LATE) { writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(state), kSoundStopped); } else { - writeSelectorValue(_segMan, obj, SELECTOR(handle), 0); + writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(handle), 0); writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(signal), SIGNAL_OFFSET); } (*i)->dataInc = 0; _music->soundStop(*i); } + return acc; } -void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundSetVolume(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + int16 value = argv[1].toSint16(); MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { @@ -578,7 +501,7 @@ void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { // the drum sounds of the energizer bunny at the beginning), so this is // normal behavior. //warning("cmdSetSoundVolume: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } debugC(2, kDebugLevelSound, "cmdSetSoundVolume: %d", value); @@ -590,16 +513,17 @@ void SoundCommandParser::cmdSetSoundVolume(reg_t obj, int16 value) { _music->soundSetVolume(musicSlot, value); writeSelectorValue(_segMan, obj, SELECTOR(vol), value); } + return acc; } -void SoundCommandParser::cmdSetSoundPriority(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + int16 value = argv[1].toSint16(); MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("cmdSetSoundPriority: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return; + return acc; } if (value == -1) { @@ -619,11 +543,12 @@ void SoundCommandParser::cmdSetSoundPriority(reg_t obj, int16 value) { writeSelectorValue(_segMan, obj, SELECTOR(flags), readSelectorValue(_segMan, obj, SELECTOR(flags)) | 2); //DoSOund(0xF,hobj,w) } + return acc; } -void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { - if (!obj.segment) - return; +reg_t SoundCommandParser::kDoSoundSetLoop(int argc, reg_t *argv, reg_t acc) { + reg_t obj = argv[0]; + int16 value = argv[1].toSint16(); MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { @@ -637,7 +562,7 @@ void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { } else { // Doesn't really matter } - return; + return acc; } if (value == -1) { musicSlot->loop = 0xFFFF; @@ -646,11 +571,13 @@ void SoundCommandParser::cmdSetSoundLoop(reg_t obj, int16 value) { } writeSelectorValue(_segMan, obj, SELECTOR(loop), musicSlot->loop); + return acc; } -void SoundCommandParser::cmdSuspendSound(reg_t obj, int16 value) { +reg_t SoundCommandParser::kDoSoundSuspend(int argc, reg_t *argv, reg_t acc) { // TODO warning("STUB: cmdSuspendSound"); + return acc; } void SoundCommandParser::updateSci0Cues() { @@ -674,7 +601,7 @@ void SoundCommandParser::updateSci0Cues() { if ((*i)->signal == 0 && (*i)->status != kSoundPlaying) continue; - cmdUpdateCues((*i)->soundObj, 0); + processUpdateCues((*i)->soundObj); noOnePlaying = false; } _music->_mutex.unlock(); @@ -708,10 +635,10 @@ void SoundCommandParser::startNewSound(int number) { // Overwrite the first sound in the playlist MusicEntry *song = *_music->getPlayListStart(); reg_t soundObj = song->soundObj; - cmdDisposeSound(soundObj, 0); + processDisposeSound(soundObj); writeSelectorValue(_segMan, soundObj, SELECTOR(number), number); - cmdInitSound(soundObj, 0); - cmdPlaySound(soundObj, 0); + processInitSound(soundObj); + processPlaySound(soundObj); } void SoundCommandParser::setMasterVolume(int vol) { diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h index d1a81462fe..a8bc1eb280 100644 --- a/engines/sci/sound/soundcmd.h +++ b/engines/sci/sound/soundcmd.h @@ -34,13 +34,13 @@ namespace Sci { class Console; class SciMusic; class SoundCommandParser; -typedef void (SoundCommandParser::*SoundCommand)(reg_t obj, int16 value); +//typedef void (SoundCommandParser::*SoundCommand)(reg_t obj, int16 value); -struct MusicEntryCommand { - MusicEntryCommand(const char *d, SoundCommand c) : sndCmd(c), desc(d) {} - SoundCommand sndCmd; - const char *desc; -}; +//struct MusicEntryCommand { +// MusicEntryCommand(const char *d, SoundCommand c) : sndCmd(c), desc(d) {} +// SoundCommand sndCmd; +// const char *desc; +//}; class SoundCommandParser { public: @@ -51,7 +51,7 @@ public: kMaxSciVolume = 15 }; - reg_t parseCommand(int argc, reg_t *argv, reg_t acc); + //reg_t parseCommand(int argc, reg_t *argv, reg_t acc); // Functions used for game state loading void clearPlayList(); @@ -63,13 +63,14 @@ public: void pauseAll(bool pause); // Debug console functions - void playSound(reg_t obj) { cmdPlaySound(obj, 0); } - void stopSound(reg_t obj) { cmdStopSound(obj, 0); } void startNewSound(int number); void stopAllSounds(); void printPlayList(Console *con); void printSongInfo(reg_t obj, Console *con); + void processPlaySound(reg_t obj); + void processStopSound(reg_t obj, bool sampleFinishedPlaying); + /** * Synchronizes the current state of the music list to the rest of the engine, so that * the changes that the sound thread makes to the music are registered with the engine @@ -79,45 +80,42 @@ public: */ void updateSci0Cues(); + reg_t kDoSoundInit(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundPlay(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundDummy(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundMute(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundPause(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundResume(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundStop(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundStopAll(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundDispose(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundMasterVolume(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundFade(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundGetPolyphony(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundUpdate(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundUpdateCues(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundReverb(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSetHold(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundGetAudioCapability(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSetVolume(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSetLoop(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundSuspend(int argc, reg_t *argv, reg_t acc); + private: - typedef Common::Array SoundCommandContainer; - SoundCommandContainer _soundCommands; + //typedef Common::Array SoundCommandContainer; + //SoundCommandContainer _soundCommands; ResourceManager *_resMan; SegManager *_segMan; Kernel *_kernel; SciMusic *_music; AudioPlayer *_audio; SciVersion _soundVersion; - int _argc; - reg_t *_argv; // for cmdFadeSound - uint32 _midiCommand; // for cmdSendMidi - reg_t _acc; - int _cmdUpdateCuesIndex; - - void cmdInitSound(reg_t obj, int16 value); - void cmdPlaySound(reg_t obj, int16 value); - void cmdDummy(reg_t obj, int16 value); - void cmdMuteSound(reg_t obj, int16 value); - void cmdPauseSound(reg_t obj, int16 value); - void cmdResumeSound(reg_t obj, int16 value); - void cmdStopSound(reg_t obj, int16 value); - void cmdDisposeSound(reg_t obj, int16 value); - void cmdMasterVolume(reg_t obj, int16 value); - void cmdFadeSound(reg_t obj, int16 value); - void cmdGetPolyphony(reg_t obj, int16 value); - void cmdStopAllSounds(reg_t obj, int16 value); - void cmdUpdateSound(reg_t obj, int16 value); - void cmdUpdateCues(reg_t obj, int16 value); - void cmdSendMidi(reg_t obj, int16 value); - void cmdReverb(reg_t obj, int16 value); - void cmdSetSoundHold(reg_t obj, int16 value); - void cmdGetAudioCapability(reg_t obj, int16 value); - void cmdSetSoundVolume(reg_t obj, int16 value); - void cmdSetSoundPriority(reg_t obj, int16 value); - void cmdSetSoundLoop(reg_t obj, int16 value); - void cmdSuspendSound(reg_t obj, int16 value); - - void processStopSound(reg_t obj, int16 value, bool sampleFinishedPlaying); + + void processInitSound(reg_t obj); + void processDisposeSound(reg_t obj); + void processUpdateCues(reg_t obj); }; } // End of namespace Sci -- cgit v1.2.3 From 125f28c367288ae9fe2992aaa96541ae067d7511 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 12:26:54 +0000 Subject: SCI: fixing signature for kDoSound(suspend) svn-id: r50756 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 501ad54dfa..4af3b4d547 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -289,7 +289,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), "", NULL }, { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, - { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "", NULL }, + { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, -- cgit v1.2.3 From b602e7071be26838288d9b8f162a3dff70b7927f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 12:30:34 +0000 Subject: SCI: fixing regression of r50755 - fixing kDoSoundSendMidi svn-id: r50757 --- engines/sci/sound/soundcmd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 6732137962..e3c78a06cb 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -425,11 +425,11 @@ void SoundCommandParser::processUpdateCues(reg_t obj) { reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { reg_t obj = argv[0]; - byte channel = argv[2].toUint16() & 0xf; - byte midiCmd = argv[3].toUint16() & 0xff; + byte channel = argv[1].toUint16() & 0xf; + byte midiCmd = argv[2].toUint16() & 0xff; - uint16 controller = argv[4].toUint16(); - uint16 param = argv[5].toUint16(); + uint16 controller = argv[3].toUint16(); + uint16 param = argv[4].toUint16(); if (channel) channel--; // channel is given 1-based, we are using 0-based -- cgit v1.2.3 From b8933d7e8f1886cc22b0ef8face8ead4e890c3e6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 13:01:48 +0000 Subject: SCI: removing unneeded mutex locking inside sci0 update cues svn-id: r50758 --- engines/sci/sound/soundcmd.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index e3c78a06cb..b1ad11651f 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -584,8 +584,6 @@ void SoundCommandParser::updateSci0Cues() { bool noOnePlaying = true; MusicEntry *pWaitingForPlay = NULL; - _music->_mutex.lock(); - const MusicList::iterator end = _music->getPlayListEnd(); for (MusicList::iterator i = _music->getPlayListStart(); i != end; ++i) { // Is the sound stopped, and the sound object updated too? If yes, skip @@ -604,7 +602,6 @@ void SoundCommandParser::updateSci0Cues() { processUpdateCues((*i)->soundObj); noOnePlaying = false; } - _music->_mutex.unlock(); if (noOnePlaying && pWaitingForPlay) { // If there is a queued entry, play it now ffs: SciMusic::soundPlay() -- cgit v1.2.3 From aadf2e976555d08b7f8e773cc4d69882fa1c9d3d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 14:11:27 +0000 Subject: SCI: added currently commented-out pauseSound implementation for some sci0 games, allowing integer for that subfunction svn-id: r50759 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/sound/music.cpp | 20 ++++++++++++++++++-- engines/sci/sound/music.h | 1 + engines/sci/sound/soundcmd.cpp | 24 ++++++++++++++++++++++-- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 4af3b4d547..99c2ba1d5d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -260,7 +260,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, - { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "[o0]", NULL }, + { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "[o0i]", NULL }, { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "o", NULL }, { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 874f0a381e..cf084f81eb 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -166,8 +166,6 @@ void SciMusic::pauseAll(bool pause) { } void SciMusic::stopAll() { - Common::StackLock lock(_mutex); - const MusicList::iterator end = _playList.end(); for (MusicList::iterator i = _playList.begin(); i != end; ++i) { soundStop(*i); @@ -199,6 +197,24 @@ MusicEntry *SciMusic::getSlot(reg_t obj) { return NULL; } +// We return the currently active music slot for SCI0 +MusicEntry *SciMusic::getActiveSci0MusicSlot() { + const MusicList::iterator end = _playList.end(); + MusicEntry *highestPrioritySlot = NULL; + for (MusicList::iterator i = _playList.begin(); i != end; ++i) { + MusicEntry *playSlot = *i; + if (playSlot->pMidiParser) { + if (playSlot->status == kSoundPlaying) + return playSlot; + if (playSlot->status == kSoundPaused) { + if ((!highestPrioritySlot) || (highestPrioritySlot->priority < playSlot->priority)) + highestPrioritySlot = playSlot; + } + } + } + return highestPrioritySlot; +} + void SciMusic::setReverb(byte reverb) { Common::StackLock lock(_mutex); _pMidiDrv->setReverb(reverb); diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 486848b48f..943a5bd2a8 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -157,6 +157,7 @@ public: } MusicEntry *getSlot(reg_t obj); + MusicEntry *getActiveSci0MusicSlot(); void pushBackSlot(MusicEntry *slotEntry) { Common::StackLock lock(_mutex); diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index b1ad11651f..b23aed4745 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -213,8 +213,28 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { uint16 value = argc > 1 ? argv[1].toUint16() : 0; if (!obj.segment) { // pause the whole playlist - // Pausing/Resuming the whole playlist was introduced in the SCI1 late - // sound scheme. + // SCI0 games (up to including qfg1) give us 0/1 for either resuming or pausing the current music + // this one doesn't count, so pausing 2 times and resuming once means here that we are supposed to resume + if (_soundVersion <= SCI_VERSION_0_LATE) { + // TODO: this code doesn't work right currently + return make_reg(0, 0); + MusicEntry *musicSlot = _music->getActiveSci0MusicSlot(); + switch (obj.offset) { + case 1: + if ((musicSlot) && (musicSlot->status == kSoundPlaying)) + _music->soundPause(musicSlot); + return make_reg(0, 0); + case 0: + if ((musicSlot) && (musicSlot->status == kSoundPaused)) + _music->soundResume(musicSlot); + return make_reg(0, 1); + return make_reg(0, 0); + default: + error("kDoSoundPause: parameter 0 is invalid for sound-sci0"); + } + } + + // Pausing/Resuming the whole playlist was introduced in the SCI1 late sound scheme. if (_soundVersion <= SCI_VERSION_1_EARLY) return acc; -- cgit v1.2.3 From eddd6d0dba563349b1d3a16bf0251ba9f5f194c1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 16:05:47 +0000 Subject: SCI: actually all sound-sci0 games used a completely different kDoSoundPause logic, implement it - fixes all sorts of games not pausing when going to restore menu and more svn-id: r50760 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/sound/soundcmd.cpp | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 99c2ba1d5d..3e30480b99 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -260,7 +260,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, - { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "[o0i]", NULL }, + { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "o", NULL }, { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index b23aed4745..26fbfb6c7c 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -209,30 +209,30 @@ void SoundCommandParser::processStopSound(reg_t obj, bool sampleFinishedPlaying) } reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { + if (_soundVersion <= SCI_VERSION_0_LATE) { + uint16 value = argv[0].toUint16(); + MusicEntry *musicSlot = _music->getActiveSci0MusicSlot(); + switch (value) { + case 1: + if ((musicSlot) && (musicSlot->status == kSoundPlaying)) + _music->soundPause(musicSlot); + return make_reg(0, 0); + case 0: + if ((musicSlot) && (musicSlot->status == kSoundPaused)) { + _music->soundResume(musicSlot); + return make_reg(0, 1); + } + return make_reg(0, 0); + default: + error("kDoSoundPause: parameter 0 is invalid for sound-sci0"); + } + } + reg_t obj = argv[0]; uint16 value = argc > 1 ? argv[1].toUint16() : 0; - if (!obj.segment) { // pause the whole playlist // SCI0 games (up to including qfg1) give us 0/1 for either resuming or pausing the current music // this one doesn't count, so pausing 2 times and resuming once means here that we are supposed to resume - if (_soundVersion <= SCI_VERSION_0_LATE) { - // TODO: this code doesn't work right currently - return make_reg(0, 0); - MusicEntry *musicSlot = _music->getActiveSci0MusicSlot(); - switch (obj.offset) { - case 1: - if ((musicSlot) && (musicSlot->status == kSoundPlaying)) - _music->soundPause(musicSlot); - return make_reg(0, 0); - case 0: - if ((musicSlot) && (musicSlot->status == kSoundPaused)) - _music->soundResume(musicSlot); - return make_reg(0, 1); - return make_reg(0, 0); - default: - error("kDoSoundPause: parameter 0 is invalid for sound-sci0"); - } - } // Pausing/Resuming the whole playlist was introduced in the SCI1 late sound scheme. if (_soundVersion <= SCI_VERSION_1_EARLY) -- cgit v1.2.3 From 541daf918aa9734692b7a58ec80ba03a975bd8fb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 9 Jul 2010 16:53:20 +0000 Subject: Introduce the RivenScriptManager to keep track of scripts and free them when required. The old way of using SharedPtr was quite hacky and didn't work properly when talking to Gehn in ospit. svn-id: r50761 --- engines/mohawk/console.cpp | 12 +++++--- engines/mohawk/riven.cpp | 18 +++++++---- engines/mohawk/riven.h | 1 + engines/mohawk/riven_scripts.cpp | 66 ++++++++++++++++++++++++++++------------ engines/mohawk/riven_scripts.h | 33 ++++++++++++++------ 5 files changed, 92 insertions(+), 38 deletions(-) diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index abdcf42dc0..5dcfff4f90 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -558,9 +558,11 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) { printf ("==================================\n\n"); Common::SeekableReadStream *cardStream = _vm->getRawData(MKID_BE('CARD'), (uint16)atoi(argv[3])); cardStream->seek(4); - RivenScriptList scriptList = RivenScript::readScripts(_vm, cardStream); - for (uint32 i = 0; i < scriptList.size(); i++) + RivenScriptList scriptList = _vm->_scriptMan->readScripts(cardStream, false); + for (uint32 i = 0; i < scriptList.size(); i++) { scriptList[i]->dumpScript(varNames, xNames, 0); + delete scriptList[i]; + } delete cardStream; } else if (!scumm_stricmp(argv[2], "HSPT")) { printf ("\n\nDumping scripts for %s\'s card %d hotspots!\n", argv[1], (uint16)atoi(argv[3])); @@ -573,9 +575,11 @@ bool RivenConsole::Cmd_DumpScript(int argc, const char **argv) { for (uint16 i = 0; i < hotspotCount; i++) { printf ("Hotspot %d:\n", i); hsptStream->seek(22, SEEK_CUR); // Skip non-script related stuff - RivenScriptList scriptList = RivenScript::readScripts(_vm, hsptStream); - for (uint32 j = 0; j < scriptList.size(); j++) + RivenScriptList scriptList = _vm->_scriptMan->readScripts(hsptStream, false); + for (uint32 j = 0; j < scriptList.size(); j++) { scriptList[j]->dumpScript(varNames, xNames, 1); + delete scriptList[j]; + } } delete hsptStream; diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 81e33d6513..07b08dc220 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -53,6 +53,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _ignoreNextMouseUp = false; _extrasFile = NULL; _curStack = aspit; + _hotspots = NULL; // NOTE: We can never really support CD swapping. All of the music files // (*_Sounds.mhk) are stored on disc 1. They are copied to the hard drive @@ -80,16 +81,17 @@ MohawkEngine_Riven::~MohawkEngine_Riven() { delete _externalScriptHandler; delete _extrasFile; delete _saveLoad; + delete _scriptMan; delete[] _vars; delete _optionsDialog; delete _rnd; + delete[] _hotspots; delete g_atrusJournalRect1; delete g_atrusJournalRect2; delete g_cathJournalRect2; delete g_atrusJournalRect3; delete g_cathJournalRect3; delete g_trapBookRect3; - _cardData.scripts.clear(); } GUI::Debugger *MohawkEngine_Riven::getDebugger() { @@ -105,6 +107,7 @@ Common::Error MohawkEngine_Riven::run() { _saveLoad = new RivenSaveLoad(this, _saveFileMan); _externalScriptHandler = new RivenExternal(this); _optionsDialog = new RivenOptionsDialog(this); + _scriptMan = new RivenScriptManager(this); _rnd = new Common::RandomSource(); g_eventRec.registerRandomSource(*_rnd, "riven"); @@ -347,13 +350,13 @@ void MohawkEngine_Riven::refreshCard() { } void MohawkEngine_Riven::loadCard(uint16 id) { - // NOTE: Do not clear the card scripts because it may delete a currently running script! + // NOTE: The card scripts are cleared by the RivenScriptManager automatically. Common::SeekableReadStream* inStream = getRawData(ID_CARD, id); _cardData.name = inStream->readSint16BE(); _cardData.zipModePlace = inStream->readUint16BE(); - _cardData.scripts = RivenScript::readScripts(this, inStream); + _cardData.scripts = _scriptMan->readScripts(inStream); _cardData.hasData = true; delete inStream; @@ -371,7 +374,10 @@ void MohawkEngine_Riven::loadCard(uint16 id) { } void MohawkEngine_Riven::loadHotspots(uint16 id) { - // NOTE: Do not clear the hotspots because it may delete a currently running script! + // Clear old hotspots + delete[] _hotspots; + + // NOTE: The hotspot scripts are cleared by the RivenScriptManager automatically. Common::SeekableReadStream* inStream = getRawData(ID_HSPT, id); @@ -413,7 +419,7 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) { _hotspots[i].zipModeHotspot = inStream->readUint16BE(); // Read in the scripts now - _hotspots[i].scripts = RivenScript::readScripts(this, inStream); + _hotspots[i].scripts = _scriptMan->readScripts(inStream); } delete inStream; @@ -649,4 +655,4 @@ bool ZipMode::operator== (const ZipMode &z) const { return z.name == name && z.id == id; } -} +} // End of namespace Mohawk diff --git a/engines/mohawk/riven.h b/engines/mohawk/riven.h index 3e2ab59597..631285455e 100644 --- a/engines/mohawk/riven.h +++ b/engines/mohawk/riven.h @@ -113,6 +113,7 @@ public: RivenGraphics *_gfx; RivenExternal *_externalScriptHandler; Common::RandomSource *_rnd; + RivenScriptManager *_scriptMan; Card _cardData; diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index a23fd26b96..1fcaba8ac0 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -35,28 +35,16 @@ namespace Mohawk { -RivenScript::RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType) - : _vm(vm), _stream(stream), _scriptType(scriptType) { +RivenScript::RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType, uint16 parentStack, uint16 parentCard) + : _vm(vm), _stream(stream), _scriptType(scriptType), _parentStack(parentStack), _parentCard(parentCard) { setupOpcodes(); + _isRunning = false; } RivenScript::~RivenScript() { delete _stream; } -RivenScriptList RivenScript::readScripts(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream) { - RivenScriptList scriptList; - - uint16 scriptCount = stream->readUint16BE(); - for (uint16 i = 0; i < scriptCount; i++) { - uint16 scriptType = stream->readUint16BE(); - uint32 scriptSize = calculateScriptSize(stream); - scriptList.push_back(Common::SharedPtr(new RivenScript(vm, stream->readStream(scriptSize), scriptType))); - } - - return scriptList; -} - uint32 RivenScript::calculateCommandSize(Common::SeekableReadStream* script) { uint16 command = script->readUint16BE(); uint32 commandSize = 2; @@ -161,7 +149,7 @@ void RivenScript::setupOpcodes() { OPCODE(activateFLST), OPCODE(zipMode), OPCODE(activateMLST), - OPCODE(activateSLSTWithVolume) + OPCODE(empty) // Activate an SLST with a volume parameter (not used) }; _opcodes = riven_opcodes; @@ -239,10 +227,13 @@ void RivenScript::dumpCommands(Common::StringArray varNames, Common::StringArray } void RivenScript::runScript() { + _isRunning = true; + if (_stream->pos() != 0) _stream->seek(0); processCommands(true); + _isRunning = false; } void RivenScript::processCommands(bool runCommands) { @@ -610,9 +601,46 @@ void RivenScript::activateMLST(uint16 op, uint16 argc, uint16 *argv) { _vm->_video->activateMLST(argv[0], _vm->getCurCard()); } -// Command 47: activate SLST record with a volume argument -void RivenScript::activateSLSTWithVolume(uint16 op, uint16 argc, uint16 *argv) { - warning("STUB: activateSLSTWithVolume()"); +RivenScriptManager::RivenScriptManager(MohawkEngine_Riven *vm) { + _vm = vm; +} + +RivenScriptManager::~RivenScriptManager() { + for (uint32 i = 0; i < _currentScripts.size(); i++) + delete _currentScripts[i]; +} + +RivenScriptList RivenScriptManager::readScripts(Common::SeekableReadStream *stream, bool garbageCollect) { + if (garbageCollect) + unloadUnusedScripts(); // Garbage collect! + + RivenScriptList scriptList; + + uint16 scriptCount = stream->readUint16BE(); + for (uint16 i = 0; i < scriptCount; i++) { + uint16 scriptType = stream->readUint16BE(); + uint32 scriptSize = RivenScript::calculateScriptSize(stream); + RivenScript *script = new RivenScript(_vm, stream->readStream(scriptSize), scriptType, _vm->getCurStack(), _vm->getCurCard()); + scriptList.push_back(script); + + // Only add it to the scripts that we will free later if it is requested. + // (ie. we don't want to store scripts from the dumpScript console command) + if (garbageCollect) + _currentScripts.push_back(script); + } + + return scriptList; +} + +void RivenScriptManager::unloadUnusedScripts() { + // Free any scripts that aren't part of the current card and aren't running + for (uint32 i = 0; i < _currentScripts.size(); i++) { + if ((_vm->getCurStack() != _currentScripts[i]->getParentStack() || _vm->getCurCard() != _currentScripts[i]->getParentCard()) && !_currentScripts[i]->isRunning()) { + delete _currentScripts[i]; + _currentScripts.remove_at(i); + i--; + } + } } } // End of namespace Mohawk diff --git a/engines/mohawk/riven_scripts.h b/engines/mohawk/riven_scripts.h index a1512af697..5187bbde08 100644 --- a/engines/mohawk/riven_scripts.h +++ b/engines/mohawk/riven_scripts.h @@ -50,19 +50,20 @@ enum { }; class RivenScript; -typedef Common::Array > RivenScriptList; class RivenScript { public: - RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType); + RivenScript(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream, uint16 scriptType, uint16 parentStack, uint16 parentCard); ~RivenScript(); void runScript(); void dumpScript(Common::StringArray varNames, Common::StringArray xNames, byte tabs); uint16 getScriptType() { return _scriptType; } + uint16 getParentStack() { return _parentStack; } + uint16 getParentCard() { return _parentCard; } + bool isRunning() { return _isRunning; } - // Read in an array of script objects from a stream - static RivenScriptList readScripts(MohawkEngine_Riven *vm, Common::SeekableReadStream *stream); + static uint32 calculateScriptSize(Common::SeekableReadStream *script); private: typedef void (RivenScript::*OpcodeProcRiven)(uint16 op, uint16 argc, uint16 *argv); @@ -70,18 +71,18 @@ private: OpcodeProcRiven proc; const char *desc; }; - const RivenOpcode* _opcodes; + const RivenOpcode *_opcodes; void setupOpcodes(); MohawkEngine_Riven *_vm; Common::SeekableReadStream *_stream; - uint16 _scriptType; + uint16 _scriptType, _parentStack, _parentCard, _parentHotspot; + bool _isRunning; void dumpCommands(Common::StringArray varNames, Common::StringArray xNames, byte tabs); void processCommands(bool runCommands); - static uint32 calculateCommandSize(Common::SeekableReadStream* script); - static uint32 calculateScriptSize(Common::SeekableReadStream* script); + static uint32 calculateCommandSize(Common::SeekableReadStream *script); DECLARE_OPCODE(empty) { warning ("Unknown Opcode %04x", op); } @@ -120,7 +121,21 @@ private: DECLARE_OPCODE(activateFLST); DECLARE_OPCODE(zipMode); DECLARE_OPCODE(activateMLST); - DECLARE_OPCODE(activateSLSTWithVolume); +}; + +typedef Common::Array RivenScriptList; + +class RivenScriptManager { +public: + RivenScriptManager(MohawkEngine_Riven *vm); + ~RivenScriptManager(); + + RivenScriptList readScripts(Common::SeekableReadStream *stream, bool garbageCollect = true); + +private: + void unloadUnusedScripts(); + RivenScriptList _currentScripts; + MohawkEngine_Riven *_vm; }; } // End of namespace Mohawk -- cgit v1.2.3 From 0e4bf4aff70846b77bac2f39d0f031cede6afa05 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 9 Jul 2010 16:53:50 +0000 Subject: Fix some other valgrind warnings. svn-id: r50762 --- engines/mohawk/sound.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index 5e1ea8cdb2..091bd68021 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -233,6 +233,10 @@ void Sound::playSLST(uint16 index, uint16 card) { if (slstRecord.index == index) { playSLST(slstRecord); + delete[] slstRecord.sound_ids; + delete[] slstRecord.volumes; + delete[] slstRecord.balances; + delete[] slstRecord.u2; delete slstStream; return; } @@ -244,6 +248,7 @@ void Sound::playSLST(uint16 index, uint16 card) { } delete slstStream; + // No matching records, assume we need to stop all SLST's stopAllSLST(); } @@ -277,8 +282,11 @@ void Sound::playSLST(SLSTRecord slstRecord) { } void Sound::stopAllSLST() { - for (uint16 i = 0; i < _currentSLSTSounds.size(); i++) + for (uint16 i = 0; i < _currentSLSTSounds.size(); i++) { _vm->_mixer->stopHandle(*_currentSLSTSounds[i].handle); + delete _currentSLSTSounds[i].handle; + } + _currentSLSTSounds.clear(); } @@ -314,6 +322,7 @@ void Sound::playSLSTSound(uint16 id, bool fade, bool loop, uint16 volume, int16 void Sound::stopSLSTSound(uint16 index, bool fade) { // TODO: Fade out, mixer needs to be extended to get volume on a handle _vm->_mixer->stopHandle(*_currentSLSTSounds[index].handle); + delete _currentSLSTSounds[index].handle; _currentSLSTSounds.remove_at(index); } -- cgit v1.2.3 From 65d6ce41935f6a137869d4e87bc5690950ae315f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Fri, 9 Jul 2010 17:22:02 +0000 Subject: Replace _s(test ? "string1" : "string2") by test ? _("string1") : _("string2") in two places. With the old code the second string was not detected as being translatable. svn-id: r50763 --- gui/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index 9244edfa75..1cdba06cd7 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -642,7 +642,7 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _(_domain == Common::ConfigManager::kApplicationDomain ? "Preferred Device:" : "Music Device:"), _(_domain == Common::ConfigManager::kApplicationDomain ? "Specifies preferred sound device or sound card emulator" : "Specifies output sound device or sound card emulator")); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _("Preferred Device:") : _("Music Device:"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator")); _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); -- cgit v1.2.3 From abd2057408794c1cb9618532a77e738bda6d7a4f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Fri, 9 Jul 2010 17:25:45 +0000 Subject: Update template and all translation files following the addition of a new translatable string. French and German translations also have additional updates. svn-id: r50764 --- common/messages.cpp | 2143 ++++++++++++++++++++++++++------------------------- po/ca_ES.po | 199 ++--- po/de_DE.po | 224 +++--- po/fr_FR.po | 443 ++++++----- po/hu_HU.po | 199 ++--- po/it_IT.po | 199 ++--- po/ru_RU.po | 199 ++--- po/scummvm.pot | 198 ++--- 8 files changed, 1944 insertions(+), 1860 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 758cc71ae9..01d9cc248e 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -140,180 +140,181 @@ static const char * const _messageIds[] = { /* 136 */ "Mount SMB", /* 137 */ "Mouse click", /* 138 */ "Multi Function", - /* 139 */ "Music volume:", - /* 140 */ "Mute All", - /* 141 */ "Name:", - /* 142 */ "Network down", - /* 143 */ "Network not initialsed (%d)", - /* 144 */ "Network up", - /* 145 */ "Network up, share mounted", - /* 146 */ "Never", - /* 147 */ "No", - /* 148 */ "No date saved", - /* 149 */ "No music", - /* 150 */ "No playtime saved", - /* 151 */ "No time saved", - /* 152 */ "None", - /* 153 */ "Normal (no scaling)", - /* 154 */ "OK", - /* 155 */ "Output rate:", - /* 156 */ "Override global MIDI settings", - /* 157 */ "Override global audio settings", - /* 158 */ "Override global graphic settings", - /* 159 */ "Override global volume settings", - /* 160 */ "PC Speaker Emulator", - /* 161 */ "Password:", - /* 162 */ "Path not a directory", - /* 163 */ "Path not a file", - /* 164 */ "Path not exists", - /* 165 */ "Paths", - /* 166 */ "Pause", - /* 167 */ "Pick the game:", - /* 168 */ "Platform the game was originally designed for", - /* 169 */ "Platform:", - /* 170 */ "Playtime: ", - /* 171 */ "Please select an action", - /* 172 */ "Plugins Path:", - /* 173 */ "Preferred Device:", - /* 174 */ "Press the key to associate", - /* 175 */ "Quit", - /* 176 */ "Quit ScummVM", - /* 177 */ "Read permission denied", - /* 178 */ "Reading failed", - /* 179 */ "Remap keys", - /* 180 */ "Remove game from the list. The game data files stay intact", - /* 181 */ "Render mode:", - /* 182 */ "Right", - /* 183 */ "Right Click", - /* 184 */ "Right click", - /* 185 */ "Rotate", - /* 186 */ "SFX volume:", - /* 187 */ "SMB", - /* 188 */ "Save", - /* 189 */ "Save Path:", - /* 190 */ "Save Path: ", - /* 191 */ "Save game:", - /* 192 */ "Scan complete!", - /* 193 */ "Scanned %d directories ...", - /* 194 */ "ScummVM Main Menu", - /* 195 */ "ScummVM could not find any engine capable of running the selected game!", - /* 196 */ "ScummVM could not find any game in the specified directory!", - /* 197 */ "ScummVM couldn't open the specified directory!", - /* 198 */ "Search in game list", - /* 199 */ "Search:", - /* 200 */ "Select SoundFont", - /* 201 */ "Select a Theme", - /* 202 */ "Select additional game directory", - /* 203 */ "Select an action and click 'Map'", - /* 204 */ "Select directory for GUI themes", - /* 205 */ "Select directory for extra files", - /* 206 */ "Select directory for plugins", - /* 207 */ "Select directory for saved games", - /* 208 */ "Select directory for savegames", - /* 209 */ "Select directory with game data", - /* 210 */ "Sensitivity", - /* 211 */ "Server:", - /* 212 */ "Share:", - /* 213 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 214 */ "Show Keyboard", - /* 215 */ "Show mouse cursor", - /* 216 */ "Show subtitles and play speech", - /* 217 */ "Show/Hide Cursor", - /* 218 */ "Skip", - /* 219 */ "Skip line", - /* 220 */ "Skip text", - /* 221 */ "Snap to edges", - /* 222 */ "Software scale (good quality, but slower)", - /* 223 */ "Sound on/off", - /* 224 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 225 */ "SoundFont:", - /* 226 */ "Spch", - /* 227 */ "Special dithering modes supported by some games", - /* 228 */ "Special sound effects volume", - /* 229 */ "Specifies default sound device for General MIDI output", - /* 230 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", - /* 231 */ "Specifies output sound device or sound card emulator", - /* 232 */ "Specifies path to additional data used by all games or ScummVM", - /* 233 */ "Specifies path to additional data used the game", - /* 234 */ "Specifies preferred sound device or sound card emulator", - /* 235 */ "Specifies where your savegames are put", - /* 236 */ "Speech", - /* 237 */ "Speech volume:", - /* 238 */ "Standard Renderer (16bpp)", - /* 239 */ "Start selected game", - /* 240 */ "Status:", - /* 241 */ "Subs", - /* 242 */ "Subtitle speed:", - /* 243 */ "Subtitles", - /* 244 */ "Swap character", - /* 245 */ "Tap for left click, double tap right click", - /* 246 */ "Text and Speech:", - /* 247 */ "The chosen directory cannot be written to. Please select another one.", - /* 248 */ "Theme Path:", - /* 249 */ "Theme:", - /* 250 */ "This game ID is already taken. Please choose another one.", - /* 251 */ "This game does not support loading games from the launcher.", - /* 252 */ "Time: ", - /* 253 */ "Timeout while initialising network", - /* 254 */ "Touch X Offset", - /* 255 */ "Touch Y Offset", - /* 256 */ "Touchpad mode disabled.", - /* 257 */ "Touchpad mode enabled.", - /* 258 */ "True Roland MT-32 (disable GM emulation)", - /* 259 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 260 */ "Unknown", - /* 261 */ "Unknown Error", - /* 262 */ "Unmount DVD", - /* 263 */ "Unmount SMB", - /* 264 */ "Unscaled (you must scroll left and right)", - /* 265 */ "Unsupported Color Mode", - /* 266 */ "Untitled savestate", - /* 267 */ "Up", - /* 268 */ "Use both MIDI and AdLib sound generation", - /* 269 */ "Use laptop trackpad-style cursor control", - /* 270 */ "Username:", - /* 271 */ "Using SDL driver ", - /* 272 */ "Vertical underscan:", - /* 273 */ "Video", - /* 274 */ "Virtual keyboard", - /* 275 */ "Volume", - /* 276 */ "Windows MIDI", - /* 277 */ "Write permission denied", - /* 278 */ "Writing data failed", - /* 279 */ "Yes", - /* 280 */ "You have to restart ScummVM to take the effect.", - /* 281 */ "Zone", - /* 282 */ "Zoom down", - /* 283 */ "Zoom up", - /* 284 */ "every 10 mins", - /* 285 */ "every 15 mins", - /* 286 */ "every 30 mins", - /* 287 */ "every 5 mins", - /* 288 */ "~A~bout", - /* 289 */ "~A~dd Game...", - /* 290 */ "~C~ancel", - /* 291 */ "~C~lose", - /* 292 */ "~E~dit Game...", - /* 293 */ "~H~elp", - /* 294 */ "~I~ndy fight controls", - /* 295 */ "~K~eys", - /* 296 */ "~L~eft handed mode", - /* 297 */ "~L~oad", - /* 298 */ "~L~oad...", - /* 299 */ "~N~ext", - /* 300 */ "~O~K", - /* 301 */ "~O~ptions", - /* 302 */ "~O~ptions...", - /* 303 */ "~P~revious", - /* 304 */ "~Q~uit", - /* 305 */ "~R~emove Game", - /* 306 */ "~R~esume", - /* 307 */ "~R~eturn to Launcher", - /* 308 */ "~S~ave", - /* 309 */ "~S~tart", - /* 310 */ "~T~ransitions Enabled", - /* 311 */ "~W~ater Effect Enabled", - /* 312 */ "~Z~ip Mode Activated", + /* 139 */ "Music Device:", + /* 140 */ "Music volume:", + /* 141 */ "Mute All", + /* 142 */ "Name:", + /* 143 */ "Network down", + /* 144 */ "Network not initialsed (%d)", + /* 145 */ "Network up", + /* 146 */ "Network up, share mounted", + /* 147 */ "Never", + /* 148 */ "No", + /* 149 */ "No date saved", + /* 150 */ "No music", + /* 151 */ "No playtime saved", + /* 152 */ "No time saved", + /* 153 */ "None", + /* 154 */ "Normal (no scaling)", + /* 155 */ "OK", + /* 156 */ "Output rate:", + /* 157 */ "Override global MIDI settings", + /* 158 */ "Override global audio settings", + /* 159 */ "Override global graphic settings", + /* 160 */ "Override global volume settings", + /* 161 */ "PC Speaker Emulator", + /* 162 */ "Password:", + /* 163 */ "Path not a directory", + /* 164 */ "Path not a file", + /* 165 */ "Path not exists", + /* 166 */ "Paths", + /* 167 */ "Pause", + /* 168 */ "Pick the game:", + /* 169 */ "Platform the game was originally designed for", + /* 170 */ "Platform:", + /* 171 */ "Playtime: ", + /* 172 */ "Please select an action", + /* 173 */ "Plugins Path:", + /* 174 */ "Preferred Device:", + /* 175 */ "Press the key to associate", + /* 176 */ "Quit", + /* 177 */ "Quit ScummVM", + /* 178 */ "Read permission denied", + /* 179 */ "Reading failed", + /* 180 */ "Remap keys", + /* 181 */ "Remove game from the list. The game data files stay intact", + /* 182 */ "Render mode:", + /* 183 */ "Right", + /* 184 */ "Right Click", + /* 185 */ "Right click", + /* 186 */ "Rotate", + /* 187 */ "SFX volume:", + /* 188 */ "SMB", + /* 189 */ "Save", + /* 190 */ "Save Path:", + /* 191 */ "Save Path: ", + /* 192 */ "Save game:", + /* 193 */ "Scan complete!", + /* 194 */ "Scanned %d directories ...", + /* 195 */ "ScummVM Main Menu", + /* 196 */ "ScummVM could not find any engine capable of running the selected game!", + /* 197 */ "ScummVM could not find any game in the specified directory!", + /* 198 */ "ScummVM couldn't open the specified directory!", + /* 199 */ "Search in game list", + /* 200 */ "Search:", + /* 201 */ "Select SoundFont", + /* 202 */ "Select a Theme", + /* 203 */ "Select additional game directory", + /* 204 */ "Select an action and click 'Map'", + /* 205 */ "Select directory for GUI themes", + /* 206 */ "Select directory for extra files", + /* 207 */ "Select directory for plugins", + /* 208 */ "Select directory for saved games", + /* 209 */ "Select directory for savegames", + /* 210 */ "Select directory with game data", + /* 211 */ "Sensitivity", + /* 212 */ "Server:", + /* 213 */ "Share:", + /* 214 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 215 */ "Show Keyboard", + /* 216 */ "Show mouse cursor", + /* 217 */ "Show subtitles and play speech", + /* 218 */ "Show/Hide Cursor", + /* 219 */ "Skip", + /* 220 */ "Skip line", + /* 221 */ "Skip text", + /* 222 */ "Snap to edges", + /* 223 */ "Software scale (good quality, but slower)", + /* 224 */ "Sound on/off", + /* 225 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 226 */ "SoundFont:", + /* 227 */ "Spch", + /* 228 */ "Special dithering modes supported by some games", + /* 229 */ "Special sound effects volume", + /* 230 */ "Specifies default sound device for General MIDI output", + /* 231 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", + /* 232 */ "Specifies output sound device or sound card emulator", + /* 233 */ "Specifies path to additional data used by all games or ScummVM", + /* 234 */ "Specifies path to additional data used the game", + /* 235 */ "Specifies preferred sound device or sound card emulator", + /* 236 */ "Specifies where your savegames are put", + /* 237 */ "Speech", + /* 238 */ "Speech volume:", + /* 239 */ "Standard Renderer (16bpp)", + /* 240 */ "Start selected game", + /* 241 */ "Status:", + /* 242 */ "Subs", + /* 243 */ "Subtitle speed:", + /* 244 */ "Subtitles", + /* 245 */ "Swap character", + /* 246 */ "Tap for left click, double tap right click", + /* 247 */ "Text and Speech:", + /* 248 */ "The chosen directory cannot be written to. Please select another one.", + /* 249 */ "Theme Path:", + /* 250 */ "Theme:", + /* 251 */ "This game ID is already taken. Please choose another one.", + /* 252 */ "This game does not support loading games from the launcher.", + /* 253 */ "Time: ", + /* 254 */ "Timeout while initialising network", + /* 255 */ "Touch X Offset", + /* 256 */ "Touch Y Offset", + /* 257 */ "Touchpad mode disabled.", + /* 258 */ "Touchpad mode enabled.", + /* 259 */ "True Roland MT-32 (disable GM emulation)", + /* 260 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 261 */ "Unknown", + /* 262 */ "Unknown Error", + /* 263 */ "Unmount DVD", + /* 264 */ "Unmount SMB", + /* 265 */ "Unscaled (you must scroll left and right)", + /* 266 */ "Unsupported Color Mode", + /* 267 */ "Untitled savestate", + /* 268 */ "Up", + /* 269 */ "Use both MIDI and AdLib sound generation", + /* 270 */ "Use laptop trackpad-style cursor control", + /* 271 */ "Username:", + /* 272 */ "Using SDL driver ", + /* 273 */ "Vertical underscan:", + /* 274 */ "Video", + /* 275 */ "Virtual keyboard", + /* 276 */ "Volume", + /* 277 */ "Windows MIDI", + /* 278 */ "Write permission denied", + /* 279 */ "Writing data failed", + /* 280 */ "Yes", + /* 281 */ "You have to restart ScummVM to take the effect.", + /* 282 */ "Zone", + /* 283 */ "Zoom down", + /* 284 */ "Zoom up", + /* 285 */ "every 10 mins", + /* 286 */ "every 15 mins", + /* 287 */ "every 30 mins", + /* 288 */ "every 5 mins", + /* 289 */ "~A~bout", + /* 290 */ "~A~dd Game...", + /* 291 */ "~C~ancel", + /* 292 */ "~C~lose", + /* 293 */ "~E~dit Game...", + /* 294 */ "~H~elp", + /* 295 */ "~I~ndy fight controls", + /* 296 */ "~K~eys", + /* 297 */ "~L~eft handed mode", + /* 298 */ "~L~oad", + /* 299 */ "~L~oad...", + /* 300 */ "~N~ext", + /* 301 */ "~O~K", + /* 302 */ "~O~ptions", + /* 303 */ "~O~ptions...", + /* 304 */ "~P~revious", + /* 305 */ "~Q~uit", + /* 306 */ "~R~emove Game", + /* 307 */ "~R~esume", + /* 308 */ "~R~eturn to Launcher", + /* 309 */ "~S~ave", + /* 310 */ "~S~tart", + /* 311 */ "~T~ransitions Enabled", + /* 312 */ "~W~ater Effect Enabled", + /* 313 */ "~Z~ip Mode Activated", NULL }; @@ -323,7 +324,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -462,185 +463,186 @@ static const PoMessageEntry _translation_ru_RU[] = { { 136, "\277\336\324\332\333\356\347\330\342\354 SMB" }, { 137, "\272\333\330\332 \334\353\350\354\356" }, { 138, "\274\343\333\354\342\330\344\343\335\332\346\330\357" }, - { 139, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, - { 140, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, - { 141, "\275\320\327\322\320\335\330\325:" }, - { 142, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, - { 143, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, - { 144, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, - { 145, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" }, - { 146, "\275\330\332\336\323\324\320" }, - { 147, "\275\325\342" }, - { 148, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, - { 149, "\261\325\327 \334\343\327\353\332\330" }, - { 150, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" }, - { 151, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" }, - { 152, "\275\325 \327\320\324\320\335" }, - { 153, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, - { 154, "OK" }, - { 155, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, - { 156, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, - { 157, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, - { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, - { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, - { 160, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" }, - { 161, "\277\320\340\336\333\354:" }, - { 162, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" }, - { 163, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" }, - { 164, "\277\343\342\354 \335\325 \335\320\331\324\325\335" }, - { 165, "\277\343\342\330" }, - { 166, "\277\320\343\327\320" }, - { 167, "\262\353\321\325\340\330\342\325 \330\323\340\343:" }, - { 168, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" }, - { 169, "\277\333\320\342\344\336\340\334\320:" }, - { 170, "\262\340\325\334\357 \330\323\340\353: " }, - { 171, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, - { 172, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, - { 173, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, - { 174, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, - { 175, "\262\353\345\336\324" }, - { 176, "\262\353\345\336\324 \330\327 ScummVM" }, - { 177, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" }, - { 178, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, - { 179, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, - { 180, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, - { 181, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, - { 182, "\262\337\340\320\322\336" }, - { 183, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 139, "\303\341\342\340\336\331\342\341\322\336 GM:" }, + { 140, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, + { 141, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, + { 142, "\275\320\327\322\320\335\330\325:" }, + { 143, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, + { 144, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, + { 145, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, + { 146, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" }, + { 147, "\275\330\332\336\323\324\320" }, + { 148, "\275\325\342" }, + { 149, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, + { 150, "\261\325\327 \334\343\327\353\332\330" }, + { 151, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" }, + { 152, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" }, + { 153, "\275\325 \327\320\324\320\335" }, + { 154, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, + { 155, "OK" }, + { 156, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, + { 157, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, + { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, + { 160, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, + { 161, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" }, + { 162, "\277\320\340\336\333\354:" }, + { 163, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" }, + { 164, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" }, + { 165, "\277\343\342\354 \335\325 \335\320\331\324\325\335" }, + { 166, "\277\343\342\330" }, + { 167, "\277\320\343\327\320" }, + { 168, "\262\353\321\325\340\330\342\325 \330\323\340\343:" }, + { 169, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" }, + { 170, "\277\333\320\342\344\336\340\334\320:" }, + { 171, "\262\340\325\334\357 \330\323\340\353: " }, + { 172, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, + { 173, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, + { 174, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, + { 175, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, + { 176, "\262\353\345\336\324" }, + { 177, "\262\353\345\336\324 \330\327 ScummVM" }, + { 178, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" }, + { 179, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, + { 180, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, + { 181, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, + { 182, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, + { 183, "\262\337\340\320\322\336" }, { 184, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, - { 185, "\277\336\322\325\340\335\343\342\354" }, - { 186, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, - { 187, "SMB" }, - { 188, "\267\320\337\330\341\320\342\354" }, - { 189, "\277\343\342\354 \341\336\345\340.: " }, - { 190, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, - { 191, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, - { 192, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, - { 193, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, - { 194, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" }, - { 195, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" }, - { 196, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" }, - { 197, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" }, - { 198, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" }, - { 199, "\277\336\330\341\332:" }, - { 200, "\262\353\321\325\340\330\342\325 SoundFont" }, - { 201, "\262\353\321\325\340\330\342\325 \342\325\334\343" }, - { 202, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" }, - { 203, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" }, - { 204, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" }, - { 205, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" }, - { 206, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" }, - { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 185, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 186, "\277\336\322\325\340\335\343\342\354" }, + { 187, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, + { 188, "SMB" }, + { 189, "\267\320\337\330\341\320\342\354" }, + { 190, "\277\343\342\354 \341\336\345\340.: " }, + { 191, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, + { 192, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, + { 193, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, + { 194, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, + { 195, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" }, + { 196, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" }, + { 197, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" }, + { 198, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" }, + { 199, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" }, + { 200, "\277\336\330\341\332:" }, + { 201, "\262\353\321\325\340\330\342\325 SoundFont" }, + { 202, "\262\353\321\325\340\330\342\325 \342\325\334\343" }, + { 203, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" }, + { 204, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" }, + { 205, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" }, + { 206, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" }, + { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" }, { 208, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, - { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" }, - { 210, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" }, - { 211, "\301\325\340\322\325\340:" }, - { 212, "\301\325\342\325\322\320\357 \337\320\337\332\320:" }, - { 213, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" }, - { 214, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, - { 215, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" }, - { 216, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" }, - { 217, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" }, - { 218, "\277\340\336\337\343\341\342\330\342\354" }, - { 219, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" }, - { 220, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" }, - { 221, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" }, - { 222, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" }, - { 223, "\267\322\343\332 \322\332\333/\322\353\332\333" }, - { 224, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" }, - { 225, "SoundFont:" }, - { 226, "\276\327\322" }, - { 227, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" }, - { 228, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" }, - { 229, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" }, - { 230, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, - { 231, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, - { 232, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" }, - { 233, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" }, - { 234, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, - { 235, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, - { 236, "\276\327\322\343\347\332\320" }, - { 237, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, - { 238, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, - { 239, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, - { 240, "\301\336\341\342\336\357\335\330\325:" }, - { 241, "\301\343\321" }, - { 242, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, - { 243, "\301\343\321\342\330\342\340\353" }, - { 244, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, - { 245, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, - { 246, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, - { 247, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, - { 248, "\277\343\342\354 \332 \342\325\334\320\334:" }, - { 249, "\302\325\334\320:" }, - { 250, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, - { 251, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, - { 252, "\262\340\325\334\357: " }, - { 253, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" }, - { 254, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" }, - { 255, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" }, - { 256, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." }, - { 257, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." }, - { 258, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" }, - { 259, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" }, - { 260, "\275\325\330\327\322\325\341\342\335\336" }, - { 261, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" }, - { 262, "\276\342\332\333\356\347\330\342\354 DVD" }, - { 263, "\276\342\332\333\356\347\342\354 SMB" }, - { 264, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" }, - { 265, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" }, - { 266, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" }, - { 267, "\262\322\325\340\345" }, - { 268, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" }, - { 269, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" }, - { 270, "\277\336\333\354\327\336\322\320\342\325\333\354:" }, - { 271, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " }, - { 272, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" }, - { 273, "\262\330\324\325\336" }, - { 274, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" }, - { 275, "\263\340\336\334\332\336\341\342\354" }, - { 276, "Windows MIDI" }, - { 277, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" }, - { 278, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" }, - { 279, "\264\320" }, - { 280, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." }, - { 281, "\267\336\335\320" }, - { 282, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" }, - { 283, "\303\322\325\333. \334\320\341\350\342\320\321" }, - { 284, "\332\320\326\324\353\325 10 \334\330\335\343\342" }, - { 285, "\332\320\326\324\353\325 15 \334\330\335\343\342" }, - { 286, "\332\320\326\324\353\325 30 \334\330\335\343\342" }, - { 287, "\332\320\326\324\353\325 5 \334\330\335\343\342" }, - { 288, "\276 \337\340\336~\323~\340\320\334\334\325" }, - { 289, "~\264~\336\321. \330\323\340\343..." }, - { 290, "\276~\342~\334\325\335\320" }, - { 291, "~\267~\320\332\340\353\342\354" }, - { 292, "\270\327~\334~. \330\323\340\343..." }, - { 293, "~\277~\336\334\336\351\354" }, - { 294, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, - { 295, "~\272~\333\320\322\330\350\330" }, - { 296, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, - { 297, "~\267~\320\323\340\343\327\330\342\354" }, - { 298, "~\267~\320\323\340...." }, - { 299, "~\301~\333\325\324" }, - { 300, "~O~K" }, - { 301, "~\276~\337\346\330\330" }, - { 302, "~\276~\337\346\330\330..." }, - { 303, "~\277~\340\325\324" }, - { 304, "~\262~\353\345\336\324" }, - { 305, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, - { 306, "\277\340\336\324\336\333~\326~\330\342\354" }, - { 307, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, - { 308, "~\267~\320\337\330\341\320\342\354" }, - { 309, "\277~\343~\341\332" }, - { 310, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, - { 311, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" }, - { 312, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" }, + { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 210, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" }, + { 211, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" }, + { 212, "\301\325\340\322\325\340:" }, + { 213, "\301\325\342\325\322\320\357 \337\320\337\332\320:" }, + { 214, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" }, + { 215, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, + { 216, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" }, + { 217, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" }, + { 218, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" }, + { 219, "\277\340\336\337\343\341\342\330\342\354" }, + { 220, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" }, + { 221, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" }, + { 222, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" }, + { 223, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" }, + { 224, "\267\322\343\332 \322\332\333/\322\353\332\333" }, + { 225, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" }, + { 226, "SoundFont:" }, + { 227, "\276\327\322" }, + { 228, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" }, + { 229, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" }, + { 230, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" }, + { 231, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, + { 232, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 233, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" }, + { 234, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" }, + { 235, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 236, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, + { 237, "\276\327\322\343\347\332\320" }, + { 238, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, + { 239, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, + { 240, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, + { 241, "\301\336\341\342\336\357\335\330\325:" }, + { 242, "\301\343\321" }, + { 243, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, + { 244, "\301\343\321\342\330\342\340\353" }, + { 245, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, + { 246, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, + { 247, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, + { 248, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, + { 249, "\277\343\342\354 \332 \342\325\334\320\334:" }, + { 250, "\302\325\334\320:" }, + { 251, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, + { 252, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, + { 253, "\262\340\325\334\357: " }, + { 254, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" }, + { 255, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" }, + { 256, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" }, + { 257, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." }, + { 258, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." }, + { 259, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" }, + { 260, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" }, + { 261, "\275\325\330\327\322\325\341\342\335\336" }, + { 262, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" }, + { 263, "\276\342\332\333\356\347\330\342\354 DVD" }, + { 264, "\276\342\332\333\356\347\342\354 SMB" }, + { 265, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" }, + { 266, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" }, + { 267, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" }, + { 268, "\262\322\325\340\345" }, + { 269, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" }, + { 270, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" }, + { 271, "\277\336\333\354\327\336\322\320\342\325\333\354:" }, + { 272, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " }, + { 273, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" }, + { 274, "\262\330\324\325\336" }, + { 275, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" }, + { 276, "\263\340\336\334\332\336\341\342\354" }, + { 277, "Windows MIDI" }, + { 278, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" }, + { 279, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" }, + { 280, "\264\320" }, + { 281, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." }, + { 282, "\267\336\335\320" }, + { 283, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" }, + { 284, "\303\322\325\333. \334\320\341\350\342\320\321" }, + { 285, "\332\320\326\324\353\325 10 \334\330\335\343\342" }, + { 286, "\332\320\326\324\353\325 15 \334\330\335\343\342" }, + { 287, "\332\320\326\324\353\325 30 \334\330\335\343\342" }, + { 288, "\332\320\326\324\353\325 5 \334\330\335\343\342" }, + { 289, "\276 \337\340\336~\323~\340\320\334\334\325" }, + { 290, "~\264~\336\321. \330\323\340\343..." }, + { 291, "\276~\342~\334\325\335\320" }, + { 292, "~\267~\320\332\340\353\342\354" }, + { 293, "\270\327~\334~. \330\323\340\343..." }, + { 294, "~\277~\336\334\336\351\354" }, + { 295, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, + { 296, "~\272~\333\320\322\330\350\330" }, + { 297, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, + { 298, "~\267~\320\323\340\343\327\330\342\354" }, + { 299, "~\267~\320\323\340...." }, + { 300, "~\301~\333\325\324" }, + { 301, "~O~K" }, + { 302, "~\276~\337\346\330\330" }, + { 303, "~\276~\337\346\330\330..." }, + { 304, "~\277~\340\325\324" }, + { 305, "~\262~\353\345\336\324" }, + { 306, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, + { 307, "\277\340\336\324\336\333~\326~\330\342\354" }, + { 308, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, + { 309, "~\267~\320\337\330\341\320\342\354" }, + { 310, "\277~\343~\341\332" }, + { 311, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, + { 312, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" }, + { 313, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" }, { -1, NULL } }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-27 17:47+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-09 18:17+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -724,7 +726,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 81, "Acceleration du pad GC:" }, { 82, "Sensibilit\351 du pad GC:" }, { 83, "GFX" }, - { 84, "P\351riph\351rique GM:" }, + { 84, "Sortie GM:" }, { 85, "Langue:" }, { 86, "Interface:" }, { 87, "Jeu" }, @@ -768,7 +770,7 @@ static const PoMessageEntry _translation_fr_FR[] = { { 125, "MIDI" }, { 126, "Gain MIDI:" }, { 127, "\311mulateur MT-32" }, - { 128, "P\351riph\351rique MT32:" }, + { 128, "Sortie MT-32:" }, { 129, "\311chelle de l'\351cran principal" }, { 130, "Affecter" }, { 131, "Ajout Massif..." }, @@ -779,185 +781,186 @@ static const PoMessageEntry _translation_fr_FR[] = { { 136, "Monter SMB" }, { 137, "Clic de souris" }, { 138, "Fonction Multiple" }, - { 139, "Volume Musique:" }, - { 140, "Silence" }, - { 141, "Nom:" }, - { 142, "R\351seau d\351connect\351" }, - { 143, "R\351seau non initialis\351 (%d)" }, - { 144, "R\351seau connect\351" }, - { 145, "R\351seau connect\351, disque partag\351 mont\351" }, - { 146, "Jamais" }, - { 147, "Non" }, - { 148, "Date non sauv\351e" }, - { 149, "Pas de musique" }, - { 150, "Dur\351e de jeu non sauv\351e" }, - { 151, "Heure non sauv\351e" }, - { 152, "Aucun" }, - { 153, "Normal (\351chelle d'origine)" }, - { 154, "OK" }, - { 155, "Fr\351quence:" }, - { 156, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, - { 157, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, - { 158, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, - { 159, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, - { 160, "\311mulateur Haut Parleur PC" }, - { 161, "Mot de passe:" }, - { 162, "Chemin n'est pas un r\351pertoire" }, - { 163, "Chemin n'est pas un fichier" }, - { 164, "Chemin inexistant" }, - { 165, "Chemins" }, - { 166, "Mettre en pause" }, - { 167, "Choisissez le jeu:" }, - { 168, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 169, "Plateforme:" }, - { 170, "Dur\351e de jeu:" }, - { 171, "Selectionnez une action" }, - { 172, "Plugins:" }, - { 173, "P\351riph\351rique Pr\351f\351r\351:" }, - { 174, "Appuyez sur la touche \340 associer" }, - { 175, "Quitter" }, - { 176, "Quitter ScummVM" }, - { 177, "V\351roulli\351 en lecture" }, - { 178, "Echec de la lecture" }, - { 179, "Changer l'affectation des touches" }, - { 180, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 181, "Mode de rendu:" }, - { 182, "Droite" }, - { 183, "Clic Droit" }, - { 184, "Clic droit" }, - { 185, "Pivoter" }, - { 186, "Volume Bruitage:" }, - { 187, "SMB" }, - { 188, "Sauver" }, - { 189, "Sauvegardes:" }, + { 139, "Sortie Audio:" }, + { 140, "Volume Musique:" }, + { 141, "Silence" }, + { 142, "Nom:" }, + { 143, "R\351seau d\351connect\351" }, + { 144, "R\351seau non initialis\351 (%d)" }, + { 145, "R\351seau connect\351" }, + { 146, "R\351seau connect\351, disque partag\351 mont\351" }, + { 147, "Jamais" }, + { 148, "Non" }, + { 149, "Date non sauv\351e" }, + { 150, "Pas de musique" }, + { 151, "Dur\351e de jeu non sauv\351e" }, + { 152, "Heure non sauv\351e" }, + { 153, "Aucun" }, + { 154, "Normal (\351chelle d'origine)" }, + { 155, "OK" }, + { 156, "Fr\351quence:" }, + { 157, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, + { 158, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, + { 159, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, + { 160, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, + { 161, "\311mulateur Haut Parleur PC" }, + { 162, "Mot de passe:" }, + { 163, "Chemin n'est pas un r\351pertoire" }, + { 164, "Chemin n'est pas un fichier" }, + { 165, "Chemin inexistant" }, + { 166, "Chemins" }, + { 167, "Mettre en pause" }, + { 168, "Choisissez le jeu:" }, + { 169, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 170, "Plateforme:" }, + { 171, "Dur\351e de jeu:" }, + { 172, "Selectionnez une action" }, + { 173, "Plugins:" }, + { 174, "Sortie Pr\351f\351r\351:" }, + { 175, "Appuyez sur la touche \340 associer" }, + { 176, "Quitter" }, + { 177, "Quitter ScummVM" }, + { 178, "V\351roulli\351 en lecture" }, + { 179, "Echec de la lecture" }, + { 180, "Changer l'affectation des touches" }, + { 181, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 182, "Mode de rendu:" }, + { 183, "Droite" }, + { 184, "Clic Droit" }, + { 185, "Clic droit" }, + { 186, "Pivoter" }, + { 187, "Volume Bruitage:" }, + { 188, "SMB" }, + { 189, "Sauver" }, { 190, "Sauvegardes:" }, - { 191, "Sauvegarde:" }, - { 192, "Examen termin\351!" }, - { 193, "%d r\351pertoires examin\351s ..." }, - { 194, "Menu Principal ScummVM" }, - { 195, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 196, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 197, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 198, "Recherche dans la liste de jeux" }, - { 199, "Filtre:" }, - { 200, "Choisir une banque de sons" }, - { 201, "S\351lectionnez un Th\350me" }, - { 202, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 203, "Selectionez une action et cliquez 'Affecter'" }, - { 204, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 205, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 206, "S\351lectionner le r\351pertoire des plugins" }, - { 207, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 191, "Sauvegardes:" }, + { 192, "Sauvegarde:" }, + { 193, "Examen termin\351!" }, + { 194, "%d r\351pertoires examin\351s ..." }, + { 195, "Menu Principal ScummVM" }, + { 196, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 197, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 198, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 199, "Recherche dans la liste de jeux" }, + { 200, "Filtre:" }, + { 201, "Choisir une banque de sons" }, + { 202, "S\351lectionnez un Th\350me" }, + { 203, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 204, "Selectionez une action et cliquez 'Affecter'" }, + { 205, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 206, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 207, "S\351lectionner le r\351pertoire des plugins" }, { 208, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 209, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 210, "Sensibilit\351" }, - { 211, "Serveur:" }, - { 212, "Disque partag\351:" }, - { 213, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 214, "Afficher le clavier" }, - { 215, "Afficher le curseur de la souris" }, - { 216, "Affiche les sous-titres et joue les dialogues audio" }, - { 217, "Afficher/Cacher le curseur" }, - { 218, "Passer" }, - { 219, "Passer la phrase" }, - { 220, "Sauter le texte" }, - { 221, "Aligner sur les bords" }, - { 222, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 223, "Audio marche/arr\352t" }, - { 224, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 225, "Banque de sons:" }, - { 226, "Audio" }, - { 227, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 228, "Volume des effets sp\351ciaux sonores" }, - { 229, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, - { 230, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, - { 231, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 232, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 233, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, - { 235, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 236, "Audio" }, - { 237, "Volume Dialogues:" }, - { 238, "Standard (16bpp)" }, - { 239, "D\351marre le jeu s\351lectionn\351" }, - { 240, "Status:" }, - { 241, "Subs" }, - { 242, "Vitesse des ST:" }, - { 243, "Sous-titres" }, - { 244, "Changement de personnage" }, - { 245, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 246, "Dialogue:" }, - { 247, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 248, "Th\350mes:" }, - { 249, "Th\350me:" }, - { 250, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 251, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 252, "Heure:" }, - { 253, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 254, "D\351calage X du toucher" }, - { 255, "D\351callage Y du toucher" }, - { 256, "Mode touchpad d\351sactiv\351" }, - { 257, "Mode touchpad activ\351" }, - { 258, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 259, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 260, "Inconue" }, - { 261, "Erreur inconnue" }, - { 262, "D\351monter le DVD" }, - { 263, "D\351monter SMB" }, - { 264, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 265, "Mode de couleurs non support\351" }, - { 266, "Sauvegarde sans nom" }, - { 267, "Haut" }, - { 268, "Utiliser \340 la fois MIDI et AdLib" }, - { 269, "Activer le contr\364le du curseur de type trackpad" }, - { 270, "Nom d'utilisateur:" }, - { 271, "Utilise le pilote SDL" }, - { 272, "Underscan vertical:" }, - { 273, "Vid\351o" }, - { 274, "Clavier virtuel" }, - { 275, "Volume" }, - { 276, "MIDI Windows" }, - { 277, "Verrouill\351 en \351criture" }, - { 278, "Echec de l'\351criture des donn\351es" }, - { 279, "Oui" }, - { 280, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 281, "Zone" }, - { 282, "Zoomer" }, - { 283, "D\351zoomer" }, - { 284, "Toutes les 10 mins" }, - { 285, "Toutes les 15 mins" }, - { 286, "Toutes les 30 mins" }, - { 287, "Toutes les 5 mins" }, - { 288, "\300 ~P~ropos" }, - { 289, "~A~jouter..." }, - { 290, "~A~nnuler" }, - { 291, "~F~ermer" }, - { 292, "~E~diter..." }, - { 293, "~A~ide" }, - { 294, "Contr\364le des combats d'~I~ndy" }, - { 295, "~T~ouches" }, - { 296, "Mode ~G~aucher" }, - { 297, "~C~harger" }, + { 209, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 210, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 211, "Sensibilit\351" }, + { 212, "Serveur:" }, + { 213, "Disque partag\351:" }, + { 214, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 215, "Afficher le clavier" }, + { 216, "Afficher le curseur de la souris" }, + { 217, "Affiche les sous-titres et joue les dialogues audio" }, + { 218, "Afficher/Cacher le curseur" }, + { 219, "Passer" }, + { 220, "Passer la phrase" }, + { 221, "Sauter le texte" }, + { 222, "Aligner sur les bords" }, + { 223, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 224, "Audio marche/arr\352t" }, + { 225, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 226, "Banque de sons:" }, + { 227, "Audio" }, + { 228, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 229, "Volume des effets sp\351ciaux sonores" }, + { 230, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, + { 231, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, + { 232, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 233, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 234, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 235, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, + { 236, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 237, "Audio" }, + { 238, "Volume Dialogues:" }, + { 239, "Standard (16bpp)" }, + { 240, "D\351marre le jeu s\351lectionn\351" }, + { 241, "Status:" }, + { 242, "Subs" }, + { 243, "Vitesse des ST:" }, + { 244, "Sous-titres" }, + { 245, "Changement de personnage" }, + { 246, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 247, "Dialogue:" }, + { 248, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 249, "Th\350mes:" }, + { 250, "Th\350me:" }, + { 251, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 252, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 253, "Heure:" }, + { 254, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 255, "D\351calage X du toucher" }, + { 256, "D\351callage Y du toucher" }, + { 257, "Mode touchpad d\351sactiv\351" }, + { 258, "Mode touchpad activ\351" }, + { 259, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 260, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 261, "Inconue" }, + { 262, "Erreur inconnue" }, + { 263, "D\351monter le DVD" }, + { 264, "D\351monter SMB" }, + { 265, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 266, "Mode de couleurs non support\351" }, + { 267, "Sauvegarde sans nom" }, + { 268, "Haut" }, + { 269, "Utiliser \340 la fois MIDI et AdLib" }, + { 270, "Activer le contr\364le du curseur de type trackpad" }, + { 271, "Nom d'utilisateur:" }, + { 272, "Utilise le pilote SDL" }, + { 273, "Underscan vertical:" }, + { 274, "Vid\351o" }, + { 275, "Clavier virtuel" }, + { 276, "Volume" }, + { 277, "MIDI Windows" }, + { 278, "Verrouill\351 en \351criture" }, + { 279, "Echec de l'\351criture des donn\351es" }, + { 280, "Oui" }, + { 281, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 282, "Zone" }, + { 283, "Zoomer" }, + { 284, "D\351zoomer" }, + { 285, "Toutes les 10 mins" }, + { 286, "Toutes les 15 mins" }, + { 287, "Toutes les 30 mins" }, + { 288, "Toutes les 5 mins" }, + { 289, "\300 ~P~ropos" }, + { 290, "~A~jouter..." }, + { 291, "~A~nnuler" }, + { 292, "~F~ermer" }, + { 293, "~E~diter..." }, + { 294, "~A~ide" }, + { 295, "Contr\364le des combats d'~I~ndy" }, + { 296, "~T~ouches" }, + { 297, "Mode ~G~aucher" }, { 298, "~C~harger" }, - { 299, "~S~uivant" }, - { 300, "~O~K" }, - { 301, "~O~ptions" }, - { 302, "~O~ptions..." }, - { 303, "~P~r\351c\351dent" }, - { 304, "~Q~uitter" }, - { 305, "~S~upprimer" }, - { 306, "~R~eprendre" }, - { 307, "Retour au ~L~anceur" }, - { 308, "~S~auver" }, - { 309, "~D~\351marrer" }, - { 310, "T~r~ansitions activ\351" }, - { 311, "~E~ffets de l'Eau Activ\351s" }, - { 312, "Mode ~Z~ip Activ\351" }, + { 299, "~C~harger" }, + { 300, "~S~uivant" }, + { 301, "~O~K" }, + { 302, "~O~ptions" }, + { 303, "~O~ptions..." }, + { 304, "~P~r\351c\351dent" }, + { 305, "~Q~uitter" }, + { 306, "~S~upprimer" }, + { 307, "~R~eprendre" }, + { 308, "Retour au ~L~anceur" }, + { 309, "~S~auver" }, + { 310, "~D~\351marrer" }, + { 311, "T~r~ansitions activ\351" }, + { 312, "~E~ffets de l'Eau Activ\351s" }, + { 313, "Mode ~Z~ip Activ\351" }, { -1, NULL } }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -1096,185 +1099,186 @@ static const PoMessageEntry _translation_it_IT[] = { { 136, "Monta SMB" }, { 137, "Clic del mouse" }, { 138, "Multifunzione" }, - { 139, "Volume musica:" }, - { 140, "Disattiva audio" }, - { 141, "Nome:" }, - { 142, "Rete disattivata" }, - { 143, "Rete non avviata (%d)" }, - { 144, "Rete attiva" }, - { 145, "Rete attiva, condivisione montata" }, - { 146, "Mai" }, - { 147, "No" }, - { 148, "Nessuna data salvata" }, - { 149, "Nessuna musica" }, - { 150, "Nessun tempo salvato" }, - { 151, "Nessun orario salvato" }, - { 152, "Nessuno" }, - { 153, "Normale (nessun ridimensionamento)" }, - { 154, "OK" }, - { 155, "Frequenza:" }, - { 156, "Ignora le impostazioni MIDI globali" }, - { 157, "Ignora le impostazioni audio globali" }, - { 158, "Ignora le impostazioni grafiche globali" }, - { 159, "Ignora le impostazioni globali di volume" }, - { 160, "Emulatore PC Speaker" }, - { 161, "Password:" }, - { 162, "Il percorso non \350 una cartella" }, - { 163, "Il percorso non \350 un file" }, - { 164, "Il percorso non esiste" }, - { 165, "Percorsi" }, - { 166, "Pausa" }, - { 167, "Scegli il gioco:" }, - { 168, "La piattaforma per la quale il gioco \350 stato concepito" }, - { 169, "Piattaforma:" }, - { 170, "Tempo di gioco: " }, - { 171, "Seleziona un'azione" }, - { 172, "Percorso plugin:" }, - { 173, "Disp. preferito:" }, - { 174, "Premi il tasto da associare" }, - { 175, "Esci" }, - { 176, "Chiudi ScummVM" }, - { 177, "Autorizzazione di lettura negata" }, - { 178, "Lettura fallita" }, - { 179, "Riprogramma tasti" }, - { 180, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, - { 181, "Resa grafica:" }, - { 182, "Destra" }, - { 183, "Clic destro" }, + { 139, "Dispositivo GM:" }, + { 140, "Volume musica:" }, + { 141, "Disattiva audio" }, + { 142, "Nome:" }, + { 143, "Rete disattivata" }, + { 144, "Rete non avviata (%d)" }, + { 145, "Rete attiva" }, + { 146, "Rete attiva, condivisione montata" }, + { 147, "Mai" }, + { 148, "No" }, + { 149, "Nessuna data salvata" }, + { 150, "Nessuna musica" }, + { 151, "Nessun tempo salvato" }, + { 152, "Nessun orario salvato" }, + { 153, "Nessuno" }, + { 154, "Normale (nessun ridimensionamento)" }, + { 155, "OK" }, + { 156, "Frequenza:" }, + { 157, "Ignora le impostazioni MIDI globali" }, + { 158, "Ignora le impostazioni audio globali" }, + { 159, "Ignora le impostazioni grafiche globali" }, + { 160, "Ignora le impostazioni globali di volume" }, + { 161, "Emulatore PC Speaker" }, + { 162, "Password:" }, + { 163, "Il percorso non \350 una cartella" }, + { 164, "Il percorso non \350 un file" }, + { 165, "Il percorso non esiste" }, + { 166, "Percorsi" }, + { 167, "Pausa" }, + { 168, "Scegli il gioco:" }, + { 169, "La piattaforma per la quale il gioco \350 stato concepito" }, + { 170, "Piattaforma:" }, + { 171, "Tempo di gioco: " }, + { 172, "Seleziona un'azione" }, + { 173, "Percorso plugin:" }, + { 174, "Disp. preferito:" }, + { 175, "Premi il tasto da associare" }, + { 176, "Esci" }, + { 177, "Chiudi ScummVM" }, + { 178, "Autorizzazione di lettura negata" }, + { 179, "Lettura fallita" }, + { 180, "Riprogramma tasti" }, + { 181, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, + { 182, "Resa grafica:" }, + { 183, "Destra" }, { 184, "Clic destro" }, - { 185, "Rotazione" }, - { 186, "Volume effetti:" }, - { 187, "SMB" }, - { 188, "Salva" }, - { 189, "Salvataggi:" }, + { 185, "Clic destro" }, + { 186, "Rotazione" }, + { 187, "Volume effetti:" }, + { 188, "SMB" }, + { 189, "Salva" }, { 190, "Salvataggi:" }, - { 191, "Salva gioco:" }, - { 192, "Scansione completa!" }, - { 193, "%d cartelle analizzate..." }, - { 194, "Menu principale di ScummVM" }, - { 195, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, - { 196, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, - { 197, "ScummVM non ha potuto aprire la cartella specificata!" }, - { 198, "Cerca nella lista dei giochi" }, - { 199, "Cerca:" }, - { 200, "Seleziona SoundFont" }, - { 201, "Seleziona un tema" }, - { 202, "Seleziona la cartella di gioco aggiuntiva" }, - { 203, "Seleziona un'azione e clicca 'Mappa'" }, - { 204, "Seleziona la cartella dei temi dell'interfaccia" }, - { 205, "Seleziona la cartella dei file aggiuntivi" }, - { 206, "Seleziona la cartella dei plugin" }, - { 207, "Seleziona la cartella dei salvataggi" }, - { 208, "Seleziona la cartella per i salvataggi" }, - { 209, "Seleziona la cartella contenente i file di gioco" }, - { 210, "Sensibilit\340" }, - { 211, "Server:" }, - { 212, "Condivisione:" }, - { 213, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, - { 214, "Mostra tastiera" }, - { 215, "Mostra cursore del mouse" }, - { 216, "Mostra i sottotitoli e attiva le voci" }, - { 217, "Mostra/nascondi cursore" }, - { 218, "Salta" }, - { 219, "Salta battuta" }, - { 220, "Salta testo" }, - { 221, "Aggancia ai bordi" }, - { 222, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, - { 223, "Suono on/off" }, - { 224, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, - { 225, "SoundFont:" }, - { 226, "Voci" }, - { 227, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, - { 228, "Volume degli effetti sonori" }, - { 229, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, - { 230, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, - { 231, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, - { 232, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, - { 233, "Specifica il percorso di ulteriori dati usati dal gioco" }, - { 234, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, - { 235, "Specifica dove archiviare i salvataggi" }, - { 236, "Voci" }, - { 237, "Volume voci:" }, - { 238, "Renderer standard (16bpp)" }, - { 239, "Esegue il gioco selezionato" }, - { 240, "Stato:" }, - { 241, "Sub" }, - { 242, "Velocit\340 testo:" }, - { 243, "Sottotitoli" }, - { 244, "Cambia personaggio" }, - { 245, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, - { 246, "Testo e voci:" }, - { 247, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, - { 248, "Percorso tema:" }, - { 249, "Tema:" }, - { 250, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, - { 251, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, - { 252, "Ora: " }, - { 253, "Attesa per l'avvio della rete" }, - { 254, "Compensa X del tocco" }, - { 255, "Compensa Y del tocco" }, - { 256, "Modalit\340 touchpad disattivata." }, - { 257, "Modalit\340 touchpad attivata." }, - { 258, "Roland MT-32 effettivo (disattiva emulazione GM)" }, - { 259, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, - { 260, "Sconosciuto" }, - { 261, "Errore sconosciuto" }, - { 262, "Smonta DVD" }, - { 263, "Smonta SMB" }, - { 264, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, - { 265, "Modalit\340 colore non supportata" }, - { 266, "Salvataggio senza titolo" }, - { 267, "Su" }, - { 268, "Utilizza generazione di suono sia MIDI che AdLib" }, - { 269, "Utilizza il controllo del cursore stile trackpad del portatile" }, - { 270, "Nome utente:" }, - { 271, "Utilizzo del driver SDL " }, - { 272, "Underscan verticale:" }, - { 273, "Video" }, - { 274, "Tastiera virtuale" }, - { 275, "Volume" }, - { 276, "MIDI Windows" }, - { 277, "Autorizzazione di scrittura negata" }, - { 278, "Scrittura dati fallita" }, - { 279, "S\354" }, - { 280, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, - { 281, "Zona" }, - { 282, "Zoom indietro" }, - { 283, "Zoom avanti" }, - { 284, "ogni 10 minuti" }, - { 285, "ogni 15 minuti" }, - { 286, "ogni 30 minuti" }, - { 287, "ogni 5 minuti" }, - { 288, "~I~nfo" }, - { 289, "~A~ggiungi gioco..." }, - { 290, "~A~nnulla" }, - { 291, "~C~hiudi" }, - { 292, "~M~odifica gioco..." }, - { 293, "~A~iuto" }, - { 294, "Controlli combattimento di ~I~ndy" }, - { 295, "~T~asti" }, - { 296, "~M~odalit\340 mancini" }, - { 297, "~C~arica" }, - { 298, "~C~arica..." }, - { 299, "~S~uccessivi" }, - { 300, "~O~K" }, - { 301, "~O~pzioni" }, - { 302, "~O~pzioni..." }, - { 303, "~P~recedenti" }, - { 304, "C~h~iudi" }, - { 305, "~R~imuovi gioco" }, - { 306, "~R~ipristina" }, - { 307, "~V~ai a schermata di avvio" }, - { 308, "~S~alva" }, - { 309, "~G~ioca" }, - { 310, "~T~ransizioni attive" }, - { 311, "~E~ffetto acqua attivo" }, - { 312, "Modalit\340 ~Z~ip attivata" }, + { 191, "Salvataggi:" }, + { 192, "Salva gioco:" }, + { 193, "Scansione completa!" }, + { 194, "%d cartelle analizzate..." }, + { 195, "Menu principale di ScummVM" }, + { 196, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, + { 197, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, + { 198, "ScummVM non ha potuto aprire la cartella specificata!" }, + { 199, "Cerca nella lista dei giochi" }, + { 200, "Cerca:" }, + { 201, "Seleziona SoundFont" }, + { 202, "Seleziona un tema" }, + { 203, "Seleziona la cartella di gioco aggiuntiva" }, + { 204, "Seleziona un'azione e clicca 'Mappa'" }, + { 205, "Seleziona la cartella dei temi dell'interfaccia" }, + { 206, "Seleziona la cartella dei file aggiuntivi" }, + { 207, "Seleziona la cartella dei plugin" }, + { 208, "Seleziona la cartella dei salvataggi" }, + { 209, "Seleziona la cartella per i salvataggi" }, + { 210, "Seleziona la cartella contenente i file di gioco" }, + { 211, "Sensibilit\340" }, + { 212, "Server:" }, + { 213, "Condivisione:" }, + { 214, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, + { 215, "Mostra tastiera" }, + { 216, "Mostra cursore del mouse" }, + { 217, "Mostra i sottotitoli e attiva le voci" }, + { 218, "Mostra/nascondi cursore" }, + { 219, "Salta" }, + { 220, "Salta battuta" }, + { 221, "Salta testo" }, + { 222, "Aggancia ai bordi" }, + { 223, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, + { 224, "Suono on/off" }, + { 225, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, + { 226, "SoundFont:" }, + { 227, "Voci" }, + { 228, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, + { 229, "Volume degli effetti sonori" }, + { 230, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, + { 231, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, + { 232, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, + { 233, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, + { 234, "Specifica il percorso di ulteriori dati usati dal gioco" }, + { 235, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, + { 236, "Specifica dove archiviare i salvataggi" }, + { 237, "Voci" }, + { 238, "Volume voci:" }, + { 239, "Renderer standard (16bpp)" }, + { 240, "Esegue il gioco selezionato" }, + { 241, "Stato:" }, + { 242, "Sub" }, + { 243, "Velocit\340 testo:" }, + { 244, "Sottotitoli" }, + { 245, "Cambia personaggio" }, + { 246, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, + { 247, "Testo e voci:" }, + { 248, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, + { 249, "Percorso tema:" }, + { 250, "Tema:" }, + { 251, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, + { 252, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, + { 253, "Ora: " }, + { 254, "Attesa per l'avvio della rete" }, + { 255, "Compensa X del tocco" }, + { 256, "Compensa Y del tocco" }, + { 257, "Modalit\340 touchpad disattivata." }, + { 258, "Modalit\340 touchpad attivata." }, + { 259, "Roland MT-32 effettivo (disattiva emulazione GM)" }, + { 260, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, + { 261, "Sconosciuto" }, + { 262, "Errore sconosciuto" }, + { 263, "Smonta DVD" }, + { 264, "Smonta SMB" }, + { 265, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, + { 266, "Modalit\340 colore non supportata" }, + { 267, "Salvataggio senza titolo" }, + { 268, "Su" }, + { 269, "Utilizza generazione di suono sia MIDI che AdLib" }, + { 270, "Utilizza il controllo del cursore stile trackpad del portatile" }, + { 271, "Nome utente:" }, + { 272, "Utilizzo del driver SDL " }, + { 273, "Underscan verticale:" }, + { 274, "Video" }, + { 275, "Tastiera virtuale" }, + { 276, "Volume" }, + { 277, "MIDI Windows" }, + { 278, "Autorizzazione di scrittura negata" }, + { 279, "Scrittura dati fallita" }, + { 280, "S\354" }, + { 281, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, + { 282, "Zona" }, + { 283, "Zoom indietro" }, + { 284, "Zoom avanti" }, + { 285, "ogni 10 minuti" }, + { 286, "ogni 15 minuti" }, + { 287, "ogni 30 minuti" }, + { 288, "ogni 5 minuti" }, + { 289, "~I~nfo" }, + { 290, "~A~ggiungi gioco..." }, + { 291, "~A~nnulla" }, + { 292, "~C~hiudi" }, + { 293, "~M~odifica gioco..." }, + { 294, "~A~iuto" }, + { 295, "Controlli combattimento di ~I~ndy" }, + { 296, "~T~asti" }, + { 297, "~M~odalit\340 mancini" }, + { 298, "~C~arica" }, + { 299, "~C~arica..." }, + { 300, "~S~uccessivi" }, + { 301, "~O~K" }, + { 302, "~O~pzioni" }, + { 303, "~O~pzioni..." }, + { 304, "~P~recedenti" }, + { 305, "C~h~iudi" }, + { 306, "~R~imuovi gioco" }, + { 307, "~R~ipristina" }, + { 308, "~V~ai a schermata di avvio" }, + { 309, "~S~alva" }, + { 310, "~G~ioca" }, + { 311, "~T~ransizioni attive" }, + { 312, "~E~ffetto acqua attivo" }, + { 313, "Modalit\340 ~Z~ip attivata" }, { -1, NULL } }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1410,182 +1414,183 @@ static const PoMessageEntry _translation_ca_ES[] = { { 136, "Munta SMB" }, { 137, "Clic del ratol\355" }, { 138, "Funci\363 M\372ltiple" }, - { 139, "Volum de la m\372sica:" }, - { 140, "Silenciar tot" }, - { 141, "Nom:" }, - { 142, "Xarxa inactiva" }, - { 143, "Xarxa no iniciada (%d)" }, - { 144, "Xarxa activa" }, - { 145, "Xarxa activa, compartici\363 muntada" }, - { 146, "Mai" }, - { 147, "No" }, - { 148, "No hi ha data desada" }, - { 149, "Sense m\372sica" }, - { 150, "No hi ha temps de joc desat" }, - { 151, "No hi ha hora desada" }, - { 152, "Cap" }, - { 153, "Normal (sense escalar)" }, - { 154, "D'acord" }, - { 155, "Freq\374\350ncia de sortida:" }, - { 156, "Fer canvis sobre les opcions globals de MIDI" }, - { 157, "Fer canvis sobre les opcions globals d'\340udio" }, - { 158, "Fer canvis sobre les opcions globals de gr\340fics" }, - { 159, "Fer canvis sobre les opcions globals de volum" }, - { 160, "Emulador d'Altaveu de PC" }, - { 161, "Contrasenya:" }, - { 162, "El cam\355 no \351s un directori" }, - { 163, "El cam\355 no \351s un fitxer" }, - { 164, "El cam\355 no existeix" }, - { 165, "Camins" }, - { 166, "Pausa" }, - { 167, "Seleccioneu el joc:" }, - { 168, "Plataforma per la que el joc es va dissenyar originalment" }, - { 169, "Plataforma:" }, - { 170, "Temps de joc: " }, - { 171, "Seleccioneu una acci\363" }, - { 172, "Cam\355 dels connectors:" }, - { 173, "Dispositiu Preferit:" }, - { 174, "Premeu la tecla a associar" }, - { 175, "Surt" }, - { 176, "Surt de ScummVM" }, - { 177, "S'ha denegat el perm\355s de lectura" }, - { 178, "Ha fallat la lectura" }, - { 179, "Remapeja les tecles" }, - { 180, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, - { 181, "Mode de pintat:" }, - { 182, "Dreta" }, - { 183, "Clic dret" }, + { 139, "Dispositiu GM:" }, + { 140, "Volum de la m\372sica:" }, + { 141, "Silenciar tot" }, + { 142, "Nom:" }, + { 143, "Xarxa inactiva" }, + { 144, "Xarxa no iniciada (%d)" }, + { 145, "Xarxa activa" }, + { 146, "Xarxa activa, compartici\363 muntada" }, + { 147, "Mai" }, + { 148, "No" }, + { 149, "No hi ha data desada" }, + { 150, "Sense m\372sica" }, + { 151, "No hi ha temps de joc desat" }, + { 152, "No hi ha hora desada" }, + { 153, "Cap" }, + { 154, "Normal (sense escalar)" }, + { 155, "D'acord" }, + { 156, "Freq\374\350ncia de sortida:" }, + { 157, "Fer canvis sobre les opcions globals de MIDI" }, + { 158, "Fer canvis sobre les opcions globals d'\340udio" }, + { 159, "Fer canvis sobre les opcions globals de gr\340fics" }, + { 160, "Fer canvis sobre les opcions globals de volum" }, + { 161, "Emulador d'Altaveu de PC" }, + { 162, "Contrasenya:" }, + { 163, "El cam\355 no \351s un directori" }, + { 164, "El cam\355 no \351s un fitxer" }, + { 165, "El cam\355 no existeix" }, + { 166, "Camins" }, + { 167, "Pausa" }, + { 168, "Seleccioneu el joc:" }, + { 169, "Plataforma per la que el joc es va dissenyar originalment" }, + { 170, "Plataforma:" }, + { 171, "Temps de joc: " }, + { 172, "Seleccioneu una acci\363" }, + { 173, "Cam\355 dels connectors:" }, + { 174, "Dispositiu Preferit:" }, + { 175, "Premeu la tecla a associar" }, + { 176, "Surt" }, + { 177, "Surt de ScummVM" }, + { 178, "S'ha denegat el perm\355s de lectura" }, + { 179, "Ha fallat la lectura" }, + { 180, "Remapeja les tecles" }, + { 181, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, + { 182, "Mode de pintat:" }, + { 183, "Dreta" }, { 184, "Clic dret" }, - { 185, "Rotar" }, - { 186, "Volum dels efectes:" }, - { 187, "SMB" }, - { 188, "Desa" }, - { 189, "Cam\355 de les Partides:" }, - { 190, "Cam\355 de les Partides: " }, - { 191, "Desa la partida:" }, - { 192, "S'ha acabat la cerca!" }, - { 193, "S'han cercat %d directoris ..." }, - { 194, "Men\372 Principal de ScummVM" }, - { 195, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, - { 196, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, - { 197, "ScummVM no ha pogut obrir el directori especificat!" }, - { 198, "Cerca a la llista de jocs" }, - { 199, "Cerca:" }, - { 200, "Seleccioneu el fitxer SoundFont" }, - { 201, "Seleccioneu un Tema" }, - { 202, "Seleccioneu el directori addicional del joc" }, - { 203, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, - { 204, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, - { 205, "Seleccioneu el directori dels fitxers extra" }, - { 206, "Seleccioneu el directori dels connectors" }, - { 207, "Seleccioneu el directori de les partides desades" }, + { 185, "Clic dret" }, + { 186, "Rotar" }, + { 187, "Volum dels efectes:" }, + { 188, "SMB" }, + { 189, "Desa" }, + { 190, "Cam\355 de les Partides:" }, + { 191, "Cam\355 de les Partides: " }, + { 192, "Desa la partida:" }, + { 193, "S'ha acabat la cerca!" }, + { 194, "S'han cercat %d directoris ..." }, + { 195, "Men\372 Principal de ScummVM" }, + { 196, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, + { 197, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, + { 198, "ScummVM no ha pogut obrir el directori especificat!" }, + { 199, "Cerca a la llista de jocs" }, + { 200, "Cerca:" }, + { 201, "Seleccioneu el fitxer SoundFont" }, + { 202, "Seleccioneu un Tema" }, + { 203, "Seleccioneu el directori addicional del joc" }, + { 204, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, + { 205, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, + { 206, "Seleccioneu el directori dels fitxers extra" }, + { 207, "Seleccioneu el directori dels connectors" }, { 208, "Seleccioneu el directori de les partides desades" }, - { 209, "Seleccioneu el directori amb les dades del joc" }, - { 210, "Sensibilitat" }, - { 211, "Servidor:" }, - { 212, "Compartici\363:" }, - { 213, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, - { 214, "Mostra el teclat" }, - { 215, "Mostra el cursor del ratol\355" }, - { 216, "Mostra els subt\355tols i reprodueix la veu" }, - { 217, "Mostra/Oculta el cursor" }, - { 218, "Salta" }, - { 219, "Salta la l\355nia" }, - { 220, "Salta el text" }, - { 222, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, - { 223, "So engegat/parat" }, - { 224, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, - { 225, "Fitxer SoundFont:" }, - { 226, "Veus" }, - { 227, "Modes de dispersi\363 especials suportats per alguns jocs" }, - { 228, "Volum dels sons d'efectes especials" }, - { 229, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, - { 230, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, - { 231, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, - { 232, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, - { 233, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, - { 234, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, - { 235, "Especifica on es desaran les partides" }, - { 236, "Veus" }, - { 237, "Volum de la veu:" }, - { 238, "Pintat est\340ndard (16bpp)" }, - { 239, "Iniciant el joc seleccionat" }, - { 240, "Estat:" }, - { 241, "Subt" }, - { 242, "Velocitat dels subt\355tols:" }, - { 243, "Subt\355tols" }, - { 244, "Commuta el personatge" }, - { 245, "Toc per a clic esquerre, doble toc per a clic dret" }, - { 246, "Text i Veus:" }, - { 247, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, - { 248, "Cam\355 dels Temes:" }, - { 249, "Tema:" }, - { 250, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, - { 251, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, - { 252, "Hora: " }, - { 254, "Despla\347ament X del toc" }, - { 255, "Despla\347ament Y del toc" }, - { 256, "Mode Touchpad desactivat." }, - { 257, "Mode Touchpad activat." }, - { 258, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, - { 259, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, - { 260, "Desconegut" }, - { 261, "Error desconegut" }, - { 262, "Desmunta el DVD" }, - { 263, "Desmunta SMB" }, - { 264, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, - { 265, "Mode de color no suportat" }, - { 266, "Partida sense t\355tol" }, - { 267, "Amunt" }, - { 268, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, - { 269, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, - { 270, "Nom d'usuari:" }, - { 271, "Utilitzant el controlador SDL " }, - { 273, "V\355deo" }, - { 274, "Teclat virtual" }, - { 275, "Volum" }, - { 276, "MIDI de Windows" }, - { 277, "S'ha denegat el perm\355s d'escriptura" }, - { 278, "Ha fallat l'escriptura de dades" }, - { 279, "S\355" }, - { 280, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, - { 281, "Zona" }, - { 282, "Redueix" }, - { 283, "Amplia" }, - { 284, "cada 10 minuts" }, - { 285, "cada 15 minuts" }, - { 286, "cada 30 minuts" }, - { 287, "cada 5 minuts" }, - { 288, "~Q~uant a" }, - { 289, "~A~fegeix Joc..." }, - { 290, "~C~ancel\267la" }, - { 291, "~T~anca" }, - { 292, "~E~dita Joc..." }, - { 293, "~A~juda" }, - { 294, "Controls de lluita de l'~I~ndy" }, - { 295, "~T~ecles" }, - { 296, "Mode ~e~squerr\340" }, - { 297, "C~a~rrega" }, - { 298, "~C~arrega..." }, - { 299, "~S~eg\374ent" }, - { 300, "~D~'acord" }, - { 301, "~O~pcions" }, - { 302, "~O~pcions..." }, - { 303, "~A~nterior" }, - { 304, "~T~anca" }, - { 305, "~S~uprimeix Joc" }, - { 306, "~C~ontinua" }, - { 307, "~R~etorna al Llan\347ador" }, - { 308, "~D~esa" }, - { 309, "~I~nicia" }, - { 310, "~T~ransicions activades" }, - { 311, "~E~fecte de l'aigua activat" }, - { 312, "Mode ~Z~ip activat" }, + { 209, "Seleccioneu el directori de les partides desades" }, + { 210, "Seleccioneu el directori amb les dades del joc" }, + { 211, "Sensibilitat" }, + { 212, "Servidor:" }, + { 213, "Compartici\363:" }, + { 214, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, + { 215, "Mostra el teclat" }, + { 216, "Mostra el cursor del ratol\355" }, + { 217, "Mostra els subt\355tols i reprodueix la veu" }, + { 218, "Mostra/Oculta el cursor" }, + { 219, "Salta" }, + { 220, "Salta la l\355nia" }, + { 221, "Salta el text" }, + { 223, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, + { 224, "So engegat/parat" }, + { 225, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, + { 226, "Fitxer SoundFont:" }, + { 227, "Veus" }, + { 228, "Modes de dispersi\363 especials suportats per alguns jocs" }, + { 229, "Volum dels sons d'efectes especials" }, + { 230, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, + { 231, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, + { 232, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, + { 233, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, + { 234, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, + { 235, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, + { 236, "Especifica on es desaran les partides" }, + { 237, "Veus" }, + { 238, "Volum de la veu:" }, + { 239, "Pintat est\340ndard (16bpp)" }, + { 240, "Iniciant el joc seleccionat" }, + { 241, "Estat:" }, + { 242, "Subt" }, + { 243, "Velocitat dels subt\355tols:" }, + { 244, "Subt\355tols" }, + { 245, "Commuta el personatge" }, + { 246, "Toc per a clic esquerre, doble toc per a clic dret" }, + { 247, "Text i Veus:" }, + { 248, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, + { 249, "Cam\355 dels Temes:" }, + { 250, "Tema:" }, + { 251, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, + { 252, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, + { 253, "Hora: " }, + { 255, "Despla\347ament X del toc" }, + { 256, "Despla\347ament Y del toc" }, + { 257, "Mode Touchpad desactivat." }, + { 258, "Mode Touchpad activat." }, + { 259, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, + { 260, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, + { 261, "Desconegut" }, + { 262, "Error desconegut" }, + { 263, "Desmunta el DVD" }, + { 264, "Desmunta SMB" }, + { 265, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, + { 266, "Mode de color no suportat" }, + { 267, "Partida sense t\355tol" }, + { 268, "Amunt" }, + { 269, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, + { 270, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, + { 271, "Nom d'usuari:" }, + { 272, "Utilitzant el controlador SDL " }, + { 274, "V\355deo" }, + { 275, "Teclat virtual" }, + { 276, "Volum" }, + { 277, "MIDI de Windows" }, + { 278, "S'ha denegat el perm\355s d'escriptura" }, + { 279, "Ha fallat l'escriptura de dades" }, + { 280, "S\355" }, + { 281, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, + { 282, "Zona" }, + { 283, "Redueix" }, + { 284, "Amplia" }, + { 285, "cada 10 minuts" }, + { 286, "cada 15 minuts" }, + { 287, "cada 30 minuts" }, + { 288, "cada 5 minuts" }, + { 289, "~Q~uant a" }, + { 290, "~A~fegeix Joc..." }, + { 291, "~C~ancel\267la" }, + { 292, "~T~anca" }, + { 293, "~E~dita Joc..." }, + { 294, "~A~juda" }, + { 295, "Controls de lluita de l'~I~ndy" }, + { 296, "~T~ecles" }, + { 297, "Mode ~e~squerr\340" }, + { 298, "C~a~rrega" }, + { 299, "~C~arrega..." }, + { 300, "~S~eg\374ent" }, + { 301, "~D~'acord" }, + { 302, "~O~pcions" }, + { 303, "~O~pcions..." }, + { 304, "~A~nterior" }, + { 305, "~T~anca" }, + { 306, "~S~uprimeix Joc" }, + { 307, "~C~ontinua" }, + { 308, "~R~etorna al Llan\347ador" }, + { 309, "~D~esa" }, + { 310, "~I~nicia" }, + { 311, "~T~ransicions activades" }, + { 312, "~E~fecte de l'aigua activat" }, + { 313, "Mode ~Z~ip activat" }, { -1, NULL } }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1608,41 +1613,42 @@ static const PoMessageEntry _translation_hu_HU[] = { { 126, "MIDI nyeres\351g:" }, { 134, "Vegyes AdLib/MIDI m\363d" }, { 139, "Zene mennyis\351g:" }, - { 140, "Muta \326sszes" }, - { 146, "Soha" }, - { 147, "Semmi" }, - { 152, "Semmi" }, - { 154, "Igen" }, - { 155, "Kimeneti teljes\355tm\351ny:" }, - { 165, "\326sv\351nyek" }, + { 140, "Zene mennyis\351g:" }, + { 141, "Muta \326sszes" }, + { 147, "Soha" }, + { 148, "Semmi" }, + { 153, "Semmi" }, + { 155, "Igen" }, + { 156, "Kimeneti teljes\355tm\351ny:" }, { 166, "\326sv\351nyek" }, - { 181, "Renderel\351si m\363d:" }, - { 186, "SFX mennyis\351ge" }, - { 189, "Extra \332tvonal:" }, - { 211, "Soha" }, - { 236, "Csak a besz\351d" }, - { 237, "Besz\351d mennyis\351g:" }, - { 242, "Felirat sebess\351g:" }, - { 243, "Csak feliratok" }, - { 246, "Sz\366veg \351s besz\351d:" }, - { 249, "T\351ma:" }, - { 252, "T\351ma:" }, - { 258, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 271, "Zenei vezet :" }, - { 275, "Volumene" }, - { 281, "Semmi" }, - { 284, "10 percenk\351nt" }, - { 285, "15 percenk\351nt" }, - { 286, "30 percenk\351nt" }, - { 287, "5 percenk\351nt" }, - { 295, "Kulcsok" }, - { 296, "Renderel\351si m\363d:" }, - { 300, "Igen" }, + { 167, "\326sv\351nyek" }, + { 182, "Renderel\351si m\363d:" }, + { 187, "SFX mennyis\351ge" }, + { 190, "Extra \332tvonal:" }, + { 212, "Soha" }, + { 237, "Csak a besz\351d" }, + { 238, "Besz\351d mennyis\351g:" }, + { 243, "Felirat sebess\351g:" }, + { 244, "Csak feliratok" }, + { 247, "Sz\366veg \351s besz\351d:" }, + { 250, "T\351ma:" }, + { 253, "T\351ma:" }, + { 259, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 272, "Zenei vezet :" }, + { 276, "Volumene" }, + { 282, "Semmi" }, + { 285, "10 percenk\351nt" }, + { 286, "15 percenk\351nt" }, + { 287, "30 percenk\351nt" }, + { 288, "5 percenk\351nt" }, + { 296, "Kulcsok" }, + { 297, "Renderel\351si m\363d:" }, + { 301, "Igen" }, { -1, NULL } }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-30 23:20+0100\nPO-Revision-Date: 2010-06-23 19:30+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-08 19:11+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1744,13 +1750,13 @@ static const PoMessageEntry _translation_de_DE[] = { { 99, "Werkzeugleiste verbergen" }, { 100, "Hohe Audioqualit\344t (lansamer) (erfordert Neustart)" }, { 101, "H\366here Werte bewirken eine bessere Soundqualit\344t, werden aber m\366glicherweise nicht von jeder Soundkarte unterst\374tzt." }, - { 102, "Shift (Umschalttaste) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, + { 102, "Umschalttaste (Shift) gedr\374ckt halten, um Verzeichnisse nach Spielen zu durchsuchen" }, { 103, "Horizontale Bildverkleinerung:" }, { 104, "IBM-PCjr-Emulator" }, { 105, "Kennung:" }, { 106, "Netzwerk starten" }, { 107, "Verg\366\337erung des oberen Bildschirms:" }, - { 108, "Netzwerk wird gestartet..." }, + { 108, "MT-32-Emulator wird gestartet..." }, { 109, "Netzwerk wird gestartet..." }, { 110, "Eingabe" }, { 111, "Ung\374ltiges Verzeichnis" }, @@ -1781,180 +1787,181 @@ static const PoMessageEntry _translation_de_DE[] = { { 136, "SMB einbinden" }, { 137, "Mausklick" }, { 138, "Multifunktion" }, - { 139, "Musiklautst\344rke:" }, - { 140, "Alles aus" }, - { 141, "Name:" }, - { 142, "Netzwerk ist aus." }, - { 143, "Netzwerk nicht gestartet (%d)" }, - { 144, "Netzwerk gestartet" }, - { 145, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, - { 146, "Niemals" }, - { 147, "Nein" }, - { 148, "Kein Datum gespeichert" }, - { 149, "Keine Musik" }, - { 150, "Keine Spielzeit gespeichert" }, - { 151, "Keine Zeit gespeichert" }, - { 152, "-" }, - { 153, "Normal (keine Skalierung)" }, - { 154, "OK" }, - { 155, "Ausgabefrequenz:" }, - { 156, "Globale MIDI-Einstellungen \374bergehen" }, - { 157, "Globale Audioeinstellungen \374bergehen" }, - { 158, "Globale Grafikeinstellungen \374bergehen" }, - { 159, "Globale Lautst\344rke-Einstellungen \374bergehen" }, - { 160, "PC-Lautsprecher" }, - { 161, "Passwort:" }, - { 162, "Ung\374ltiges Verzeichnis" }, - { 163, "Pfad ist keine Datei." }, - { 164, "Verzeichnis existiert nicht." }, - { 165, "Pfade" }, - { 166, "Pause" }, - { 167, "Spiel ausw\344hlen:" }, - { 168, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, - { 169, "Plattform:" }, - { 170, "Spieldauer: " }, - { 171, "Bitte eine Aktion ausw\344hlen" }, - { 172, "Plugin-Pfad:" }, - { 173, "Bevorzugtes Ger\344t:" }, - { 174, "Taste dr\374cken, um sie zuzuweisen" }, - { 175, "Beenden" }, - { 176, "ScummVM beenden" }, - { 177, "Lese-Berechtigung nicht vorhanden" }, - { 178, "Lesefehler aufgetreten" }, - { 179, "Tasten neu zuweisen" }, - { 180, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, - { 181, "Render-Modus:" }, - { 182, "Rechts" }, - { 183, "Rechtsklick" }, + { 139, "GM-Ger\344t:" }, + { 140, "Musiklautst\344rke:" }, + { 141, "Alles aus" }, + { 142, "Name:" }, + { 143, "Netzwerk ist aus." }, + { 144, "Netzwerk nicht gestartet (%d)" }, + { 145, "Netzwerk gestartet" }, + { 146, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, + { 147, "Niemals" }, + { 148, "Nein" }, + { 149, "Kein Datum gespeichert" }, + { 150, "Keine Musik" }, + { 151, "Keine Spielzeit gespeichert" }, + { 152, "Keine Zeit gespeichert" }, + { 153, "-" }, + { 154, "Normal (keine Skalierung)" }, + { 155, "OK" }, + { 156, "Ausgabefrequenz:" }, + { 157, "Globale MIDI-Einstellungen \374bergehen" }, + { 158, "Globale Audioeinstellungen \374bergehen" }, + { 159, "Globale Grafikeinstellungen \374bergehen" }, + { 160, "Globale Lautst\344rke-Einstellungen \374bergehen" }, + { 161, "PC-Lautsprecher-Emulator" }, + { 162, "Passwort:" }, + { 163, "Ung\374ltiges Verzeichnis" }, + { 164, "Pfad ist keine Datei." }, + { 165, "Verzeichnis existiert nicht." }, + { 166, "Pfade" }, + { 167, "Pause" }, + { 168, "Spiel ausw\344hlen:" }, + { 169, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, + { 170, "Plattform:" }, + { 171, "Spieldauer: " }, + { 172, "Bitte eine Aktion ausw\344hlen" }, + { 173, "Plugin-Pfad:" }, + { 174, "Standard-Ger\344t:" }, + { 175, "Taste dr\374cken, um sie zuzuweisen" }, + { 176, "Beenden" }, + { 177, "ScummVM beenden" }, + { 178, "Lese-Berechtigung nicht vorhanden" }, + { 179, "Lesefehler aufgetreten" }, + { 180, "Tasten neu zuweisen" }, + { 181, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, + { 182, "Render-Modus:" }, + { 183, "Rechts" }, { 184, "Rechtsklick" }, - { 185, "Drehen" }, - { 186, "Effektlautst\344rke:" }, - { 187, "SMB" }, - { 188, "Speichern" }, - { 189, "Spielst\344nde:" }, - { 190, "Spielst\344nde: " }, - { 191, "Speichern:" }, - { 192, "Suchlauf abgeschlossen!" }, - { 193, "%d Ordner durchsucht..." }, - { 194, "ScummVM-Hauptmen\374" }, - { 195, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, - { 196, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, - { 197, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, - { 198, "In Spieleliste suchen" }, - { 199, "Suchen:" }, - { 200, "SoundFont ausw\344hlen" }, - { 201, "Thema ausw\344hlen" }, - { 202, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, - { 203, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, - { 204, "Verzeichnis f\374r Oberfl\344chen-Themen" }, - { 205, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, - { 206, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, - { 207, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 185, "Rechtsklick" }, + { 186, "Drehen" }, + { 187, "Effektlautst\344rke:" }, + { 188, "SMB" }, + { 189, "Speichern" }, + { 190, "Spielst\344nde:" }, + { 191, "Spielst\344nde: " }, + { 192, "Speichern:" }, + { 193, "Suchlauf abgeschlossen!" }, + { 194, "%d Ordner durchsucht..." }, + { 195, "ScummVM-Hauptmen\374" }, + { 196, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, + { 197, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, + { 198, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, + { 199, "In Spieleliste suchen" }, + { 200, "Suchen:" }, + { 201, "SoundFont ausw\344hlen" }, + { 202, "Thema ausw\344hlen" }, + { 203, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, + { 204, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, + { 205, "Verzeichnis f\374r Oberfl\344chen-Themen" }, + { 206, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, + { 207, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, { 208, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 209, "Verzeichnis mit Spieldateien ausw\344hlen" }, - { 210, "Empfindlichkeit" }, - { 211, "Server:" }, - { 212, "\326ffentliches Verzeichnis:" }, - { 213, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, - { 214, "Tastatur zeigen" }, - { 215, "Mauszeiger anzeigen" }, - { 216, "Untertitel anzeigen und Sprachausgabe aktivieren" }, - { 217, "Cursor zeigen/verbergen" }, - { 218, "\334berspringen" }, - { 219, "Zeile \374berspringen" }, - { 220, "Text \374berspringen" }, - { 221, "An Ecken anheften" }, - { 222, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, - { 223, "Ton ein/aus" }, - { 224, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, - { 225, "SoundFont:" }, - { 226, "Spr." }, - { 227, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, - { 228, "Lautst\344rke spezieller Soundeffekte" }, - { 229, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." }, - { 230, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." }, - { 231, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 232, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, - { 233, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, - { 234, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 235, "Legt fest, wo die Spielst\344nde abgelegt werden." }, - { 236, "Sprache" }, - { 237, "Sprachlautst\344rke:" }, - { 238, "Standard-Renderer (16bpp)" }, - { 239, "Ausgew\344hltes Spiel starten" }, - { 240, "Status:" }, - { 241, "Untert." }, - { 242, "Untertitel-Tempo:" }, - { 243, "Untertitel" }, - { 244, "Figur wechseln" }, - { 245, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, - { 246, "Text und Sprache:" }, - { 247, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, - { 248, "Themenpfad:" }, - { 249, "Thema:" }, - { 250, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, - { 251, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, - { 252, "Zeit: " }, - { 253, "Zeit\374berschreitung beim Starten des Netzwerks" }, - { 254, "Zu X-Position gehen" }, - { 255, "Zu Y-Position gehen" }, - { 256, "Touchpad-Modus ausgeschaltet." }, - { 257, "Touchpad-Modus aktiviert." }, - { 258, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" }, - { 259, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, - { 260, "Unbekannt" }, - { 261, "Unbekannter Fehler" }, - { 262, "DVD aush\344ngen" }, - { 263, "SMB aush\344ngen" }, - { 264, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, - { 265, "Farbmodus nicht unterst\374tzt" }, - { 266, "Unbenannt" }, - { 267, "Hoch" }, - { 268, "Benutzt MIDI und AdLib zur Sounderzeugung." }, - { 269, "Den Trackpad-Style f\374r Maussteuerung benutzen" }, - { 270, "Benutzername:" }, - { 271, "SDL-Treiber verwenden" }, - { 272, "Vertikale Bildverkleinerung:" }, - { 273, "Video" }, - { 274, "Virtuelle Tastatur" }, - { 275, "Lautst\344rke" }, - { 276, "Windows MIDI" }, - { 277, "Schreib-Berechtigung nicht vorhanden" }, - { 278, "Daten konnten nicht geschrieben werden." }, - { 279, "Ja" }, - { 280, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, - { 281, "Zone" }, - { 282, "Hineinzoomen" }, - { 283, "Herauszoomen" }, - { 284, "alle 10 Minuten" }, - { 285, "alle 15 Minuten" }, - { 286, "alle 30 Minuten" }, - { 287, "alle 5 Minuten" }, - { 288, "\334be~r~" }, - { 289, "Spiel ~h~inzuf\374gen" }, - { 290, "~A~bbrechen" }, - { 291, "~S~chlie\337en" }, - { 292, "Spielo~p~tionen" }, - { 293, "~H~ilfe" }, - { 294, "~K~ampfsteuerung f\374r Indiana Jones" }, - { 295, "~T~asten" }, - { 296, "~L~inke-Hand-Modus" }, - { 297, "~L~aden" }, - { 298, "~L~aden..." }, - { 299, "~W~eiter" }, - { 300, "~O~K" }, - { 301, "~O~ptionen" }, + { 209, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 210, "Verzeichnis mit Spieldateien ausw\344hlen" }, + { 211, "Empfindlichkeit" }, + { 212, "Server:" }, + { 213, "\326ffentliches Verzeichnis:" }, + { 214, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, + { 215, "Tastatur zeigen" }, + { 216, "Mauszeiger anzeigen" }, + { 217, "Untertitel anzeigen und Sprachausgabe aktivieren" }, + { 218, "Cursor zeigen/verbergen" }, + { 219, "\334berspringen" }, + { 220, "Zeile \374berspringen" }, + { 221, "Text \374berspringen" }, + { 222, "An Ecken anheften" }, + { 223, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, + { 224, "Ton ein/aus" }, + { 225, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, + { 226, "SoundFont:" }, + { 227, "Spr." }, + { 228, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, + { 229, "Lautst\344rke spezieller Soundeffekte" }, + { 230, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." }, + { 231, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." }, + { 232, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 233, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, + { 234, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, + { 235, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 236, "Legt fest, wo die Spielst\344nde abgelegt werden." }, + { 237, "Sprache" }, + { 238, "Sprachlautst\344rke:" }, + { 239, "Standard-Renderer (16bpp)" }, + { 240, "Ausgew\344hltes Spiel starten" }, + { 241, "Status:" }, + { 242, "Untert." }, + { 243, "Untertitel-Tempo:" }, + { 244, "Untertitel" }, + { 245, "Figur wechseln" }, + { 246, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, + { 247, "Text und Sprache:" }, + { 248, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, + { 249, "Themenpfad:" }, + { 250, "Thema:" }, + { 251, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, + { 252, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, + { 253, "Zeit: " }, + { 254, "Zeit\374berschreitung beim Starten des Netzwerks" }, + { 255, "Zu X-Position gehen" }, + { 256, "Zu Y-Position gehen" }, + { 257, "Touchpad-Modus ausgeschaltet." }, + { 258, "Touchpad-Modus aktiviert." }, + { 259, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" }, + { 260, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, + { 261, "Unbekannt" }, + { 262, "Unbekannter Fehler" }, + { 263, "DVD aush\344ngen" }, + { 264, "SMB aush\344ngen" }, + { 265, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, + { 266, "Farbmodus nicht unterst\374tzt" }, + { 267, "Unbenannt" }, + { 268, "Hoch" }, + { 269, "Benutzt MIDI und AdLib zur Sounderzeugung." }, + { 270, "Den Trackpad-Style f\374r Maussteuerung benutzen" }, + { 271, "Benutzername:" }, + { 272, "SDL-Treiber verwenden" }, + { 273, "Vertikale Bildverkleinerung:" }, + { 274, "Video" }, + { 275, "Virtuelle Tastatur" }, + { 276, "Lautst\344rke" }, + { 277, "Windows MIDI" }, + { 278, "Schreib-Berechtigung nicht vorhanden" }, + { 279, "Daten konnten nicht geschrieben werden." }, + { 280, "Ja" }, + { 281, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, + { 282, "Zone" }, + { 283, "Hineinzoomen" }, + { 284, "Herauszoomen" }, + { 285, "alle 10 Minuten" }, + { 286, "alle 15 Minuten" }, + { 287, "alle 30 Minuten" }, + { 288, "alle 5 Minuten" }, + { 289, "\334be~r~" }, + { 290, "Spiel ~h~inzuf\374gen" }, + { 291, "~A~bbrechen" }, + { 292, "~S~chlie\337en" }, + { 293, "Spielo~p~tionen" }, + { 294, "~H~ilfe" }, + { 295, "~K~ampfsteuerung f\374r Indiana Jones" }, + { 296, "~T~asten" }, + { 297, "~L~inke-Hand-Modus" }, + { 298, "~L~aden" }, + { 299, "~L~aden..." }, + { 300, "~W~eiter" }, + { 301, "~O~K" }, { 302, "~O~ptionen" }, - { 303, "~Z~ur\374ck" }, - { 304, "~B~eenden" }, - { 305, "Spiel ~e~ntfernen" }, - { 306, "~F~ortsetzen" }, - { 307, "Zur Spiele~l~iste zur\374ckkehren" }, - { 308, "~S~peichern" }, - { 309, "~S~tarten" }, - { 310, "\334ber~g~\344nge aktiviert" }, - { 311, "~W~assereffekt aktiviert" }, - { 312, "~Z~ip-Modus aktiviert" }, + { 303, "~O~ptionen" }, + { 304, "~Z~ur\374ck" }, + { 305, "~B~eenden" }, + { 306, "Spiel ~e~ntfernen" }, + { 307, "~F~ortsetzen" }, + { 308, "Zur Spiele~l~iste zur\374ck" }, + { 309, "~S~peichern" }, + { 310, "~S~tarten" }, + { 311, "\334ber~g~\344nge aktiviert" }, + { 312, "~W~assereffekt aktiviert" }, + { 313, "~Z~ip-Modus aktiviert" }, { -1, NULL } }; diff --git a/po/ca_ES.po b/po/ca_ES.po index c158163ced..8c185ace96 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Torna al nivell de directoris anterior" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mapeja" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -138,7 +138,7 @@ msgstr "" "Anglès" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -151,11 +151,11 @@ msgstr "Plataforma:" msgid "Platform the game was originally designed for" msgstr "Plataforma per la que el joc es va dissenyar originalment" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "Gràfics" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "GFX" @@ -163,7 +163,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Fer canvis sobre les opcions globals de gràfics" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "Àudio" @@ -171,7 +171,7 @@ msgstr " msgid "Override global audio settings" msgstr "Fer canvis sobre les opcions globals d'àudio" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "Volum" @@ -179,7 +179,7 @@ msgstr "Volum" msgid "Override global volume settings" msgstr "Fer canvis sobre les opcions globals de volum" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -187,7 +187,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Fer canvis sobre les opcions globals de MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "Camins" @@ -195,7 +195,7 @@ msgstr "Camins" msgid "Game Path:" msgstr "Camí del Joc:" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "Camí Extra:" @@ -207,18 +207,18 @@ msgstr "Especifica el cam msgid "Save Path:" msgstr "Camí de les Partides:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "Especifica on es desaran les partides" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "Cap" @@ -227,7 +227,7 @@ msgstr "Cap" msgid "Default" msgstr "Per defecte" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "Seleccioneu el fitxer SoundFont" @@ -322,7 +322,7 @@ msgstr "Cerca a la llista de jocs" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "Neteja el valor" @@ -456,74 +456,79 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "Mode gràfic:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "Mode de pintat:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "Modes de dispersió especials suportats per alguns jocs" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "Mode pantalla completa" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "Correcció del rati d'aspecte" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregeix la relació d'aspecte per jocs de 320x200" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" msgstr "Dispositiu Preferit:" -#: gui/options.cpp:659 +#: gui/options.cpp:645 +#, fuzzy +msgid "Music Device:" +msgstr "Dispositiu GM:" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit" -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "Dispositiu MT32:" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" "LAPC1/CM32l/CM64" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "Dispositiu GM:" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "" "Especifica el dispositiu de so per defecte per a la sortida General MIDI" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "Emulador d'AdLib:" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "AdLib s'utilitza per la música de molts jocs" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "Freqüència de sortida:" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +536,27 @@ msgstr "" "Valors més alts especifiquen millor qualitat de so però pot ser que la " "vostra tarja de so no ho suporti" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "Fitxer SoundFont:" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "Mode combinat AdLib/MIDI" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilitza MIDI i la generació de so AdLib alhora" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,145 +564,145 @@ msgstr "" "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " "compatible amb Roland connectat al vostre ordinador" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "Activa el Mode Roland GS" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a " "Roland MT-32" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "Guany MIDI:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "Veus" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "Subtítols" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "Veus" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "Mostra els subtítols i reprodueix la veu" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "Velocitat dels subtítols:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "Volum de la música:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "Silenciar tot" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "Volum dels efectes:" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "Volum dels sons d'efectes especials" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "Volum de la veu:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "Camí de les Partides: " -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "Camí dels Temes:" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especifica el camí de les dades addicionals utilitzades per tots els jocs o " "pel ScummVM" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "Camí dels connectors:" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "Misc" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "Mode de pintat de la interfície d'usuari:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "Desat automàtic:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "Tecles" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "Idioma de la interfície d'usuari:" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfície d'usuari de ScummVM" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "Anglès" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte." -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "Seleccioneu el directori de les partides desades" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un " "altre." -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "Seleccioneu el directori dels fitxers extra" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "Seleccioneu el directori dels connectors" @@ -908,7 +913,7 @@ msgid "~N~ext" msgstr "~S~egüent" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "~T~anca" @@ -980,75 +985,75 @@ msgstr " (Joc)" msgid "Windows MIDI" msgstr "MIDI de Windows" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "Menú Principal de ScummVM" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "Mode ~e~squerrà" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "Controls de lluita de l'~I~ndy" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "Mostra el cursor del ratolí" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "Desplaçament X del toc" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "Desplaçament Y del toc" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "Utilitza el control del cursor a l'estil del trackpad dels portàtils" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "Toc per a clic esquerre, doble toc per a clic dret" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "Sensibilitat" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "Escalat inicial de la pantalla superior:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "Escalat de la pantalla principal:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "Escalat per hardware (ràpid, però de baixa qualitat)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "Escalat per software (bona qualitat, però més lent)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "Sense escalar (haureu de desplaçar-vos a esquerra i dreta)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "Brillantor:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "Alta qualitat d'àudio (més lent) (reiniciar)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "Desactiva l'apagat automàtic" diff --git a/po/de_DE.po b/po/de_DE.po index ca49b776b0..d33dbb6856 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" -"PO-Revision-Date: 2010-06-23 19:30+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"PO-Revision-Date: 2010-07-08 19:11+0100\n" "Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" @@ -19,17 +19,15 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 -#, fuzzy, c-format +#, c-format msgid "(built on %s)" msgstr "(erstellt am %s)" #: gui/about.cpp:103 -#, fuzzy msgid "Features compiled in:" msgstr "Verwendete Funktionen:" #: gui/about.cpp:112 -#, fuzzy msgid "Available engines:" msgstr "Verfügbare Spiele-Engines:" @@ -42,7 +40,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -73,7 +71,7 @@ msgid "Map" msgstr "Zuweisen" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -142,7 +140,7 @@ msgstr "" "Spiels in eine deutsche verwandeln." #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -155,11 +153,11 @@ msgstr "Plattform:" msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "GFX" @@ -167,7 +165,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "Audio" @@ -175,7 +173,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "Lautstärke" @@ -183,7 +181,7 @@ msgstr "Lautst msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -191,7 +189,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "Pfade" @@ -199,7 +197,7 @@ msgstr "Pfade" msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "Extrapfad:" @@ -211,18 +209,18 @@ msgstr "Legt das Verzeichnis f msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "-" @@ -231,7 +229,7 @@ msgstr "-" msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "SoundFont auswählen" @@ -298,7 +296,7 @@ msgstr "Spiel ~h~inzuf #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" msgstr "" -"Shift (Umschalttaste) gedrückt halten, um Verzeichnisse nach Spielen zu " +"Umschalttaste (Shift) gedrückt halten, um Verzeichnisse nach Spielen zu " "durchsuchen" #: gui/launcher.cpp:513 @@ -325,7 +323,7 @@ msgstr "In Spieleliste suchen" msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "Wert löschen" @@ -459,78 +457,81 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "Render-Modus:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" -msgstr "Bevorzugtes Gerät:" +msgstr "Standard-Gerät:" -#: gui/options.cpp:659 +#: gui/options.cpp:645 #, fuzzy +msgid "Music Device:" +msgstr "GM-Gerät:" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "MT32-Gerät:" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/" "LAPC1/CM32l/CM64 fest." -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "GM-Gerät:" -#: gui/options.cpp:664 -#, fuzzy +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "" "Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -538,28 +539,28 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -567,145 +568,145 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "MIDI-Lautstärke:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "Beides" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "Spielstände: " -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "Sonstiges" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "English" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -879,7 +880,7 @@ msgstr " #: engines/dialogs.cpp:109 msgid "~R~eturn to Launcher" -msgstr "Zur Spiele~l~iste zurückkehren" +msgstr "Zur Spiele~l~iste zurück" #: engines/dialogs.cpp:119 msgid "Save game:" @@ -916,7 +917,7 @@ msgid "~N~ext" msgstr "~W~eiter" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "~S~chließen" @@ -933,7 +934,6 @@ msgid "~W~ater Effect Enabled" msgstr "~W~assereffekt aktiviert" #: sound/fmopl.cpp:51 -#, fuzzy msgid "MAME OPL emulator" msgstr "MAME-OPL-Emulator" @@ -946,32 +946,26 @@ msgid "No music" msgstr "Keine Musik" #: sound/softsynth/adlib.cpp:1590 -#, fuzzy msgid "AdLib Emulator" msgstr "AdLib-Emulator" #: sound/softsynth/mt32.cpp:327 -#, fuzzy msgid "Initialising MT-32 Emulator" -msgstr "Netzwerk wird gestartet..." +msgstr "MT-32-Emulator wird gestartet..." #: sound/softsynth/mt32.cpp:541 -#, fuzzy msgid "MT-32 Emulator" msgstr "MT-32-Emulation" #: sound/softsynth/pcspk.cpp:142 -#, fuzzy msgid "PC Speaker Emulator" -msgstr "PC-Lautsprecher" +msgstr "PC-Lautsprecher-Emulator" #: sound/softsynth/pcspk.cpp:161 -#, fuzzy msgid "IBM PCjr Emulator" msgstr "IBM-PCjr-Emulator" #: sound/softsynth/ym2612.cpp:762 -#, fuzzy msgid "FM Towns Emulator" msgstr "FM-Towns-Emulator" @@ -995,75 +989,75 @@ msgstr " (Spiel)" msgid "Windows MIDI" msgstr "Windows MIDI" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "ScummVM-Hauptmenü" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "~L~inke-Hand-Modus" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "~K~ampfsteuerung für Indiana Jones" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "Mauszeiger anzeigen" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "An Ecken anheften" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "Zu X-Position gehen" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "Zu Y-Position gehen" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "Den Trackpad-Style für Maussteuerung benutzen" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "Tippen für Linksklick, Doppeltippen für Rechtsklick" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "Empfindlichkeit" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "Vergößerung des oberen Bildschirms:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "Hauptbildschirm-Skalierung:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "Hardware-Skalierung (schnell, aber schlechte Qualität)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "Software-Skalierung (gute Qualität, aber langsamer)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "Nicht skalieren (Sie müssen nach links und nach rechts scrollen)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "Helligkeit:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "Hohe Audioqualität (lansamer) (erfordert Neustart)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "Stromsparmodus abschalten" @@ -1403,7 +1397,7 @@ msgstr "M #~ msgstr "OK" #~ msgid "Music driver:" -#~ msgstr "Musiktreiber" +#~ msgstr "Musiktreiber:" #~ msgid "ALSA" #~ msgstr "ALSA" diff --git a/po/fr_FR.po b/po/fr_FR.po index f2ff18cb3d..3bc9878d00 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" -"PO-Revision-Date: 2010-06-27 17:47+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"PO-Revision-Date: 2010-07-09 18:17+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" "MIME-Version: 1.0\n" @@ -38,18 +38,27 @@ msgstr "Remonter" msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" -#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 -#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: gui/browser.cpp:70 +#: gui/chooser.cpp:49 +#: gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 +#: gui/massadd.cpp:95 +#: gui/options.cpp:972 +#: gui/saveload.cpp:65 +#: gui/saveload.cpp:157 +#: gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Annuler" -#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 +#: gui/chooser.cpp:50 +#: gui/themebrowser.cpp:57 msgid "Choose" msgstr "Choisir" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 +#: backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Fermer" @@ -57,11 +66,13 @@ msgstr "Fermer" msgid "Mouse click" msgstr "Clic de souris" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:108 +#: base/main.cpp:285 msgid "Display keyboard" msgstr "Afficher le clavier" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:111 +#: base/main.cpp:288 msgid "Remap keys" msgstr "Changer l'affectation des touches" @@ -69,8 +80,12 @@ msgstr "Changer l'affectation des touches" msgid "Map" msgstr "Affecter" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/KeysDialog.cpp:45 +#: gui/launcher.cpp:267 +#: gui/launcher.cpp:873 +#: gui/launcher.cpp:877 +#: gui/massadd.cpp:92 +#: gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -80,12 +95,16 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Selectionez une action et cliquez 'Affecter'" -#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 +#: gui/KeysDialog.cpp:83 +#: gui/KeysDialog.cpp:105 +#: gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "Touche associée: %s" -#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 +#: gui/KeysDialog.cpp:85 +#: gui/KeysDialog.cpp:107 +#: gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "Touche associée: aucune" @@ -110,19 +129,17 @@ msgstr "Jeu" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" -"ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu " -"depuis la ligne de commande" +#: gui/launcher.cpp:173 +#: gui/launcher.cpp:174 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande" #: gui/launcher.cpp:177 msgid "Name:" msgstr "Nom:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:177 +#: gui/launcher.cpp:178 msgid "Full title of the game" msgstr "Nom complet du jeu" @@ -130,16 +147,17 @@ msgstr "Nom complet du jeu" msgid "Language:" msgstr "Langue:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" -"Langue du jeu. Cela ne traduira pas en anglais par magie votre version " -"espagnole du jeu." +#: gui/launcher.cpp:181 +#: gui/launcher.cpp:182 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/launcher.cpp:183 +#: gui/launcher.cpp:194 +#: gui/options.cpp:80 +#: gui/options.cpp:617 +#: gui/options.cpp:627 +#: gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -148,15 +166,20 @@ msgstr "" msgid "Platform:" msgstr "Plateforme:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:192 +#: gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 +#: gui/options.cpp:850 +#: gui/options.cpp:867 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 +#: gui/options.cpp:850 +#: gui/options.cpp:867 msgid "GFX" msgstr "GFX" @@ -164,7 +187,8 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 +#: gui/options.cpp:873 msgid "Audio" msgstr "Audio" @@ -172,7 +196,8 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifiques à ce jeux" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 +#: gui/options.cpp:877 msgid "Volume" msgstr "Volume" @@ -180,7 +205,8 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 +#: gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -188,7 +214,8 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 +#: gui/options.cpp:891 msgid "Paths" msgstr "Chemins" @@ -196,11 +223,13 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 +#: gui/options.cpp:904 msgid "Extra Path:" msgstr "Extra:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:254 +#: gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu" @@ -208,31 +237,49 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 +#: gui/launcher.cpp:259 +#: gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/launcher.cpp:275 +#: gui/launcher.cpp:353 +#: gui/launcher.cpp:398 +#: gui/options.cpp:245 +#: gui/options.cpp:400 +#: gui/options.cpp:486 +#: gui/options.cpp:545 +#: gui/options.cpp:706 +#: gui/options.cpp:902 +#: gui/options.cpp:905 +#: gui/options.cpp:909 +#: gui/options.cpp:996 +#: gui/options.cpp:1002 +#: gui/options.cpp:1008 +#: gui/options.cpp:1016 +#: gui/options.cpp:1040 +#: gui/options.cpp:1044 +#: gui/options.cpp:1050 +#: gui/options.cpp:1057 +#: gui/options.cpp:1156 msgid "None" msgstr "Aucun" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:280 +#: gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 +#: gui/options.cpp:1150 msgid "Select SoundFont" msgstr "Choisir une banque de sons" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:410 +#: gui/launcher.cpp:548 msgid "Select directory with game data" msgstr "Sélectionner le répertoire contenant les données du jeu" @@ -248,7 +295,8 @@ msgstr "S msgid "This game ID is already taken. Please choose another one." msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:500 +#: engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~Q~uitter" @@ -294,8 +342,7 @@ msgstr "~A~jouter..." #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" -msgstr "" -"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" +msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" #: gui/launcher.cpp:513 msgid "~E~dit Game..." @@ -317,33 +364,34 @@ msgstr "Supprime le jeu de la liste. Les fichiers sont conserv msgid "Search in game list" msgstr "Recherche dans la liste de jeux" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:526 +#: gui/launcher.cpp:1037 msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 +#: gui/options.cpp:707 msgid "Clear value" msgstr "Effacer la valeur" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 +#: engines/dialogs.cpp:117 msgid "Load game:" msgstr "Charger le jeu:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 +#: engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Charger" #: gui/launcher.cpp:660 -msgid "" -"Do you really want to run the mass game detector? This could potentially add " -"a huge number of games." -msgstr "" -"Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut " -"potentiellement ajouter un grand nombre de jeux." +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:661 +#: gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -351,7 +399,8 @@ msgstr "" msgid "Yes" msgstr "Oui" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:661 +#: gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -377,8 +426,7 @@ msgstr "Voulez-vous vraiment supprimer ce jeu?" #: gui/launcher.cpp:873 msgid "This game does not support loading games from the launcher." -msgstr "" -"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." +msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." #: gui/launcher.cpp:877 msgid "ScummVM could not find any engine capable of running the selected game!" @@ -392,7 +440,8 @@ msgstr "Ajout Massif..." msgid "Add Game..." msgstr "Ajouter..." -#: gui/massadd.cpp:79 gui/massadd.cpp:82 +#: gui/massadd.cpp:79 +#: gui/massadd.cpp:82 msgid "... progress ..." msgstr "... en cours ..." @@ -455,266 +504,265 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 +#: gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" -msgstr "Périphérique Préféré:" +msgstr "Sortie Préféré:" + +#: gui/options.cpp:645 +msgid "Music Device:" +msgstr "Sortie Audio:" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" -msgstr "" -"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " -"préféré" +msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio préféré" -#: gui/options.cpp:660 +#: gui/options.cpp:645 +#: gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" -msgstr "Périphérique MT32:" +msgstr "Sortie MT-32:" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" -"CM32l/CM64" +msgstr "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" -msgstr "Périphérique GM:" +msgstr "Sortie GM:" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 +#: gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:707 gui/options.cpp:708 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" -msgstr "" -"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " -"être supporté par votre carte son" +#: gui/options.cpp:693 +#: gui/options.cpp:694 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 +#: gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" -msgstr "" -"La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " -"Timidity" +msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:727 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" -msgstr "" -"Vérifie si vous voulez utiliser un périphérique audio compatible Roland " -"connecté à l'ordinateur" +#: gui/options.cpp:713 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "Gain MIDI:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 +#: gui/options.cpp:743 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 +#: gui/options.cpp:744 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 +#: gui/options.cpp:745 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 +#: gui/options.cpp:772 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 +#: gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" -msgstr "" -"Spécifie un chemin vers des données supplémentaires utilisées par tous les " -"jeux ou ScummVM" +msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "Anglais" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." -msgstr "" -"Vous devez relancer ScummVM pour que le changement soit pris en compte." +msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." -msgstr "" -"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " -"répertoire." +msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire." -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:241 msgid "No date saved" msgstr "Date non sauvée" -#: gui/saveload.cpp:61 gui/saveload.cpp:242 +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:242 msgid "No time saved" msgstr "Heure non sauvée" -#: gui/saveload.cpp:62 gui/saveload.cpp:243 +#: gui/saveload.cpp:62 +#: gui/saveload.cpp:243 msgid "No playtime saved" msgstr "Durée de jeu non sauvée" -#: gui/saveload.cpp:69 gui/saveload.cpp:157 +#: gui/saveload.cpp:69 +#: gui/saveload.cpp:157 msgid "Delete" msgstr "Supprimer" @@ -734,7 +782,8 @@ msgstr "Heure:" msgid "Playtime: " msgstr "Durée de jeu:" -#: gui/saveload.cpp:286 gui/saveload.cpp:353 +#: gui/saveload.cpp:286 +#: gui/saveload.cpp:353 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" @@ -763,13 +812,15 @@ msgstr "Le niveau de debug '%s' n'est pas support msgid "Menu" msgstr "Menu" -#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 +#: backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Passer" -#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 +#: backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Mettre en pause" @@ -782,7 +833,8 @@ msgstr "Passer la phrase" msgid "Error running game:" msgstr "Erreur lors de l'éxécution du jeu:" -#: base/main.cpp:430 base/main.cpp:431 +#: base/main.cpp:430 +#: base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné" @@ -834,7 +886,8 @@ msgstr "Echec de la lecture" msgid "Writing data failed" msgstr "Echec de l'écriture des données" -#: common/error.cpp:60 common/error.cpp:71 +#: common/error.cpp:60 +#: common/error.cpp:71 msgid "Unknown Error" msgstr "Erreur inconnue" @@ -878,7 +931,8 @@ msgstr "Retour au ~L~anceur" msgid "Save game:" msgstr "Sauvegarde:" -#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 #: backends/platform/wince/CEActionsPocket.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:44 @@ -886,12 +940,14 @@ msgstr "Sauvegarde:" msgid "Save" msgstr "Sauver" -#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:85 #: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "~A~nnuler" @@ -909,11 +965,12 @@ msgid "~N~ext" msgstr "~S~uivant" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "~F~ermer" -#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +#: engines/mohawk/dialogs.cpp:81 +#: engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip Activé" @@ -981,75 +1038,75 @@ msgstr "(Jeu)" msgid "Windows MIDI" msgstr "MIDI Windows" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "Menu Principal ScummVM" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "Mode ~G~aucher" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "Contrôle des combats d'~I~ndy" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "Afficher le curseur de la souris" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "Aligner sur les bords" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "Décalage X du toucher" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "Décallage Y du toucher" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "Activer le contrôle du curseur de type trackpad" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "Toucher pour un clic gauche, toucher deux fois pour un clic droit" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "Sensibilité" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "Échelle initiale de l'écran du haut" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "Échelle de l'écran principal" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "Mise à l'echelle matérielle (rapide mais qualité faible)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "Mise à l'échelle logicielle (bonne qualité mais plus lent)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "Sans changement d'échelle (vous devez faire défiler l'écran)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "Luminosité:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "Audio haute qualité (plus lent) (redémarrer)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "Désactivé l'extinction" @@ -1185,11 +1242,13 @@ msgstr "Acceleration du pad GC:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Inconue" diff --git a/po/hu_HU.po b/po/hu_HU.po index ad2194421c..90cc469177 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -70,7 +70,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -135,7 +135,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -148,11 +148,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "" @@ -160,7 +160,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "Hang" @@ -168,7 +168,7 @@ msgstr "Hang" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "Volumene" @@ -176,7 +176,7 @@ msgstr "Volumene" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "" @@ -184,7 +184,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "Ösvények" @@ -193,7 +193,7 @@ msgstr " msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "Extra Útvonal:" @@ -206,18 +206,18 @@ msgstr "" msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "Semmi" @@ -227,7 +227,7 @@ msgstr "Semmi" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "" @@ -319,7 +319,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "" @@ -451,237 +451,242 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:659 +#: gui/options.cpp:645 +#, fuzzy +msgid "Music Device:" +msgstr "Zene mennyiség:" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "MIDI nyereség:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "" -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "" @@ -896,7 +901,7 @@ msgid "~N~ext" msgstr "" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "" @@ -970,76 +975,76 @@ msgstr "" msgid "Windows MIDI" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 #, fuzzy msgid "~L~eft handed mode" msgstr "Renderelési mód:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po index e6b7f3c299..a133d7009b 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" "PO-Revision-Date: 2010-06-30 23:56+0100\n" "Last-Translator: Maff \n" "Language-Team: Italian\n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Vai alla cartella superiore" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "Mappa" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -137,7 +137,7 @@ msgstr "" "Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -150,11 +150,11 @@ msgstr "Piattaforma:" msgid "Platform the game was originally designed for" msgstr "La piattaforma per la quale il gioco è stato concepito" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "Grafica" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "Grafica" @@ -162,7 +162,7 @@ msgstr "Grafica" msgid "Override global graphic settings" msgstr "Ignora le impostazioni grafiche globali" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "Audio" @@ -170,7 +170,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Ignora le impostazioni audio globali" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "Volume" @@ -178,7 +178,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Ignora le impostazioni globali di volume" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -186,7 +186,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Ignora le impostazioni MIDI globali" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "Percorsi" @@ -194,7 +194,7 @@ msgstr "Percorsi" msgid "Game Path:" msgstr "Percorso gioco:" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "Percorso extra:" @@ -206,18 +206,18 @@ msgstr "Specifica il percorso di ulteriori dati usati dal gioco" msgid "Save Path:" msgstr "Salvataggi:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "Specifica dove archiviare i salvataggi" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "Nessuno" @@ -226,7 +226,7 @@ msgstr "Nessuno" msgid "Default" msgstr "Predefinito" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "Seleziona SoundFont" @@ -318,7 +318,7 @@ msgstr "Cerca nella lista dei giochi" msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "Cancella" @@ -455,75 +455,80 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "Modalità:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "Resa grafica:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "Modalità a schermo intero" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "Correzione proporzioni" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregge le proporzioni dei giochi 320x200" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" msgstr "Disp. preferito:" -#: gui/options.cpp:659 +#: gui/options.cpp:645 +#, fuzzy +msgid "Music Device:" +msgstr "Dispositivo GM:" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "" "Specifica il dispositivo di output audio o l'emulatore della scheda audio" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "Disposit. MT32:" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "Emulatore AdLib:" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "AdLib è utilizzato per la musica in molti giochi" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "Frequenza:" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -531,27 +536,27 @@ msgstr "" "Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " "essere supportati dalla tua scheda audio" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "Modalità mista AdLib/MIDI" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilizza generazione di suono sia MIDI che AdLib" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -559,141 +564,141 @@ msgstr "" "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " "che è connesso al tuo computer" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "Attiva la modalità Roland GS" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland " "MT-32" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "Guadagno MIDI:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "Voci" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "Sottotitoli" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "Entrambi" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "Voci" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "Sub" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "Mostra i sottotitoli e attiva le voci" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "Velocità testo:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "Disattiva audio" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "Volume degli effetti sonori" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "Salvataggi:" -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "Percorso tema:" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "Percorso plugin:" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "Varie" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "Renderer GUI:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "Autosalva:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "Tasti" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "Lingua GUI:" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "Lingua dell'interfaccia grafica di ScummVM" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "Inglese" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "Seleziona la cartella per i salvataggi" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra." -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "Seleziona la cartella dei temi dell'interfaccia" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "Seleziona la cartella dei file aggiuntivi" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "Seleziona la cartella dei plugin" @@ -905,7 +910,7 @@ msgid "~N~ext" msgstr "~S~uccessivi" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "~C~hiudi" @@ -977,75 +982,75 @@ msgstr " (Gioco)" msgid "Windows MIDI" msgstr "MIDI Windows" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "Menu principale di ScummVM" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "~M~odalità mancini" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "Controlli combattimento di ~I~ndy" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "Mostra cursore del mouse" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "Aggancia ai bordi" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "Compensa X del tocco" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "Compensa Y del tocco" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "Utilizza il controllo del cursore stile trackpad del portatile" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "Un tocco per il clic sinistro, doppio tocco per il clic destro" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "Sensibilità" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "Schermo in primo piano:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "Schermo principale:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "Ridimensionamento hardware (veloce, ma di bassa qualità)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "Ridimensionamento software (di buona qualità, ma più lento)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "Non ridimensionato (devi scorrere a sinistra e a destra)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "Luminosità:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "Audio ad alta qualità (più lento) (riavviare)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "Disattiva spegnimento in chiusura" diff --git a/po/ru_RU.po b/po/ru_RU.po index d251f6c5b8..46d5189e0b 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" @@ -40,7 +40,7 @@ msgid "Go to previous directory level" msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -71,7 +71,7 @@ msgid "Map" msgstr "½Ð×ÝÐçØâì" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -140,7 +140,7 @@ msgstr "" "àãááÚãî" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "<ßÞ ãÜÞÛçÐÝØî>" @@ -153,11 +153,11 @@ msgstr " msgid "Platform the game was originally designed for" msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "³àÐäØÚÐ" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "³àä" @@ -165,7 +165,7 @@ msgstr " msgid "Override global graphic settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "°ãÔØÞ" @@ -173,7 +173,7 @@ msgstr " msgid "Override global audio settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "³àÞÜÚÞáâì" @@ -181,7 +181,7 @@ msgstr " msgid "Override global volume settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -189,7 +189,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "¿ãâØ" @@ -197,7 +197,7 @@ msgstr " msgid "Game Path:" msgstr "¿ãâì Ú ØÓàÕ: " -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "´Þß. ßãâì:" @@ -209,18 +209,18 @@ msgstr " msgid "Save Path:" msgstr "¿ãâì áÞåà.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "½Õ ×ÐÔÐÝ" @@ -229,7 +229,7 @@ msgstr " msgid "Default" msgstr "¿Þ ãÜÞÛçÐÝØî" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "²ëÑÕàØâÕ SoundFont" @@ -321,7 +321,7 @@ msgstr " msgid "Search:" msgstr "¿ÞØáÚ:" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ" @@ -454,73 +454,78 @@ msgstr "44 Ú³ msgid "48 kHz" msgstr "48 Ú³æ" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "³àÐäØçÕáÚØÙ àÕÖØÜ:" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "ÀÕÖØÜ àÐáâàØàÞÒÐÝØï:" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" msgstr "¿àÕÔßÞçØâÐÕÜÞÕ ãáâàÞÙáâÒÞ:" -#: gui/options.cpp:659 +#: gui/options.cpp:645 +#, fuzzy +msgid "Music Device:" +msgstr "ÃáâàÞÙâáÒÞ GM:" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "ÃáâàÞÙáâÒÞ MT32:" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" "ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" "CM32l/CM64" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "ÃáâàÞÙâáÒÞ GM:" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "ÍÜãÛïâÞà AdLib:" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "²ëåÞÔÝÐï çÐáâÞâÐ:" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -528,29 +533,29 @@ msgstr "" "±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ " "ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontë ßÞÔÔÕàÔÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø " "Timidity" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -558,142 +563,142 @@ msgstr "" "¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë " "åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "²ëÚÛîçÐÕâ ÜÐßߨÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "ÃáØÛÕÝØÕ MIDI:" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "ÁãÑâØâàë" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "²áñ" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "¾×Ò" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "ÁãÑ" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "ÁÚÞàÞáâì áãÑâØâàÞÒ:" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "³àÞÜÚÞáâì Üã×ëÚØ:" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "²ëÚÛîçØâì Òáñ" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "³àÞÜÚÞáâì íääÕÚâÞÒ:" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "³àÞÜÚÞáâì Þ×ÒãçÚØ:" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "¿ãâì ÔÛï áÞåàÐÝÕÝØÙ: " -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "¿ãâì Ú âÕÜÐÜ:" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, " "ÛØÑÞ ScummVM" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "ÂÕÜÐ:" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "ºÛÐÒØèØ" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "Ï×ëÚ ØÝâÕàäÕÙáÐ:" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "English" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï." -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî." -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ" @@ -904,7 +909,7 @@ msgid "~N~ext" msgstr "~Á~ÛÕÔ" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "~·~ÐÚàëâì" @@ -976,75 +981,75 @@ msgstr " ( msgid "Windows MIDI" msgstr "Windows MIDI" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "³ÛÐÒÝÞÕ ÜÕÝî ScummVM" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "»ÕÒÞàãÚØÙ àÕÖØÜ" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "ÃßàÐÒÛÕÝØÕ ÑÞïÜØ Ò Indy" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "¿ÞÚÐ×ëÒÐâì ÚãàáÞà ÜëèØ" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "¿àØÚàÕߨâì Ú ÓàÐÝØæÐÜ" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ X" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "ÁÜÕéÕÝØÕ ÚÐáÐÝØÙ ßÞ ÞáØ Y" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "¸áßÞÛì×ÞÒÐâì ãßàÐÒÛÕÝØÕ ÚãàáÞàÞÜ ÚÐÚ ÝÐ âàÕÚßÐÔÕ ÛÕßâÞßÞÒ" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "ÂÐß ÔÛï ÛÕÒÞÓÞ éÕÛçÚÐ, ÔÒÞÙÝÞÙ âÐß ÔÛï ßàÐÒÞÓÞ éÕÛçÚÐ" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "ÇãÒáâÒØâÕÛìÝÞáâì" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "½ÐçÐÛìÝëÙ ÜÐáèâÐÑ ÒÕàåÝÕÓÞ íÚàÐÝÐ:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "¼ÐáèâÐÑ ÓÛÐÒÝÞÓÞ íÚàÐÝÐ:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (ÑëáâàÞ, ÝÞ ÝØ×ÚÞÓÞ ÚÐçÕáâÒÐ)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "¿àÞÓàÐÜÜÝÞÕ ÜÐáèâÐÑØàÞÒÐÝØÕ (åÞàÞèÕÕ ÚÐçÕáâÒÞ, ÝÞ ÜÕÔÛÕÝÝÕÕ)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "±Õ× ÜÐáèâÐÑØàÞÒÐÝØï (ÝãÖÝÞ ÑãÔÕâ ßàÞÚàãçØÒÐâì ÒÛÕÒÞ Ø ÒßàÐÒÞ)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "ÏàÚÞáâì:" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "²ëáÞÚÞÕ ÚÐçÕáâÒÞ ×ÒãÚÐ (ÜÕÔÛÕÝÝÕÕ) (àÕÑãâ)" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "·ÐßàÕâØâì ÒëÚÛîçÕÝØÕ" diff --git a/po/scummvm.pot b/po/scummvm.pot index 6fddf25d55..d150834f60 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-06-30 23:20+0100\n" +"POT-Creation-Date: 2010-07-09 18:10+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:997 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -69,7 +69,7 @@ msgid "Map" msgstr "" #: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:998 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -134,7 +134,7 @@ msgid "" msgstr "" #: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:631 gui/options.cpp:641 gui/options.cpp:968 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -147,11 +147,11 @@ msgstr "" msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:875 gui/options.cpp:892 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "" @@ -159,7 +159,7 @@ msgstr "" msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:898 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "" @@ -167,7 +167,7 @@ msgstr "" msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:902 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "" @@ -175,7 +175,7 @@ msgstr "" msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:910 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "" @@ -183,7 +183,7 @@ msgstr "" msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:916 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "" @@ -191,7 +191,7 @@ msgstr "" msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:929 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "" @@ -203,18 +203,18 @@ msgstr "" msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:923 -#: gui/options.cpp:924 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 +#: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "" #: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:259 gui/options.cpp:414 gui/options.cpp:500 -#: gui/options.cpp:559 gui/options.cpp:720 gui/options.cpp:927 -#: gui/options.cpp:930 gui/options.cpp:934 gui/options.cpp:1021 -#: gui/options.cpp:1027 gui/options.cpp:1033 gui/options.cpp:1041 -#: gui/options.cpp:1065 gui/options.cpp:1069 gui/options.cpp:1075 -#: gui/options.cpp:1082 gui/options.cpp:1181 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "" @@ -223,7 +223,7 @@ msgstr "" msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1175 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "" @@ -315,7 +315,7 @@ msgstr "" msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:721 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "" @@ -446,235 +446,239 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:628 +#: gui/options.cpp:614 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:639 +#: gui/options.cpp:625 msgid "Render mode:" msgstr "" -#: gui/options.cpp:639 gui/options.cpp:640 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:649 +#: gui/options.cpp:635 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:652 +#: gui/options.cpp:638 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:659 +#: gui/options.cpp:645 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:659 +#: gui/options.cpp:645 +msgid "Music Device:" +msgstr "" + +#: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:660 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "MT32 Device:" msgstr "" -#: gui/options.cpp:662 +#: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" msgstr "" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "GM Device:" msgstr "" -#: gui/options.cpp:664 +#: gui/options.cpp:650 msgid "Specifies default sound device for General MIDI output" msgstr "" -#: gui/options.cpp:696 +#: gui/options.cpp:682 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:696 gui/options.cpp:697 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:707 +#: gui/options.cpp:693 msgid "Output rate:" msgstr "" -#: gui/options.cpp:707 gui/options.cpp:708 +#: gui/options.cpp:693 gui/options.cpp:694 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:719 +#: gui/options.cpp:705 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:719 gui/options.cpp:720 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:724 +#: gui/options.cpp:710 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:727 +#: gui/options.cpp:713 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:730 +#: gui/options.cpp:716 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:733 +#: gui/options.cpp:719 msgid "MIDI gain:" msgstr "" -#: gui/options.cpp:746 +#: gui/options.cpp:732 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:751 gui/options.cpp:757 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "" -#: gui/options.cpp:752 gui/options.cpp:758 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "" -#: gui/options.cpp:753 gui/options.cpp:759 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "" -#: gui/options.cpp:757 +#: gui/options.cpp:743 msgid "Spch" msgstr "" -#: gui/options.cpp:758 +#: gui/options.cpp:744 msgid "Subs" msgstr "" -#: gui/options.cpp:759 +#: gui/options.cpp:745 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:763 +#: gui/options.cpp:749 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:775 +#: gui/options.cpp:761 msgid "Music volume:" msgstr "" -#: gui/options.cpp:782 +#: gui/options.cpp:768 msgid "Mute All" msgstr "" -#: gui/options.cpp:785 +#: gui/options.cpp:771 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:785 gui/options.cpp:786 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:792 +#: gui/options.cpp:778 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:923 +#: gui/options.cpp:898 msgid "Save Path: " msgstr "" -#: gui/options.cpp:926 +#: gui/options.cpp:901 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:929 gui/options.cpp:930 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:933 +#: gui/options.cpp:908 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:938 +#: gui/options.cpp:913 msgid "Misc" msgstr "" -#: gui/options.cpp:940 +#: gui/options.cpp:915 msgid "Theme:" msgstr "" -#: gui/options.cpp:944 +#: gui/options.cpp:919 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:950 +#: gui/options.cpp:925 msgid "Autosave:" msgstr "" -#: gui/options.cpp:958 +#: gui/options.cpp:933 msgid "Keys" msgstr "" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:965 +#: gui/options.cpp:940 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:970 +#: gui/options.cpp:945 msgid "English" msgstr "" -#: gui/options.cpp:1114 +#: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1127 +#: gui/options.cpp:1102 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1134 +#: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1143 +#: gui/options.cpp:1118 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1153 +#: gui/options.cpp:1128 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1164 +#: gui/options.cpp:1139 msgid "Select directory for plugins" msgstr "" @@ -885,7 +889,7 @@ msgid "~N~ext" msgstr "" #: engines/scumm/dialogs.cpp:289 -#: backends/platform/ds/arm9/source/dsoptions.cpp:56 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 msgid "~C~lose" msgstr "" @@ -957,75 +961,75 @@ msgstr "" msgid "Windows MIDI" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:57 +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 msgid "ScummVM Main Menu" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:63 +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 msgid "~L~eft handed mode" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:64 +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 msgid "~I~ndy fight controls" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:65 +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 msgid "Show mouse cursor" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 msgid "Snap to edges" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 msgid "Touch X Offset" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:75 +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 msgid "Touch Y Offset" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:87 +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 msgid "Use laptop trackpad-style cursor control" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:88 +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 msgid "Tap for left click, double tap right click" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 msgid "Sensitivity" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:99 +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 msgid "Initial top screen scale:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:105 +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 msgid "Main screen scaling:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:107 +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 msgid "Hardware scale (fast, but low quality)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 msgid "Software scale (good quality, but slower)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:109 +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 msgid "Unscaled (you must scroll left and right)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 msgid "Brightness:" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:121 +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 msgid "High quality audio (slower) (reboot)" msgstr "" -#: backends/platform/ds/arm9/source/dsoptions.cpp:122 +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 msgid "Disable power off" msgstr "" -- cgit v1.2.3 From 18d1ab8c709602d71ad4175c29d4517f1bc5bbab Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 18:11:42 +0000 Subject: SCI: move comments and change selector for sci0 sound in kDoSoundPause, also allow pausing everything even for sci1early (qfg2 is using it) svn-id: r50765 --- engines/sci/sound/soundcmd.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 26fbfb6c7c..5ac8c6b270 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -210,16 +210,21 @@ void SoundCommandParser::processStopSound(reg_t obj, bool sampleFinishedPlaying) reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { if (_soundVersion <= SCI_VERSION_0_LATE) { + // SCI0 games give us 0/1 for either resuming or pausing the current music + // this one doesn't count, so pausing 2 times and resuming once means here that we are supposed to resume uint16 value = argv[0].toUint16(); MusicEntry *musicSlot = _music->getActiveSci0MusicSlot(); switch (value) { case 1: - if ((musicSlot) && (musicSlot->status == kSoundPlaying)) + if ((musicSlot) && (musicSlot->status == kSoundPlaying)) { _music->soundPause(musicSlot); + writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPaused); + } return make_reg(0, 0); case 0: if ((musicSlot) && (musicSlot->status == kSoundPaused)) { _music->soundResume(musicSlot); + writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPlaying); return make_reg(0, 1); } return make_reg(0, 0); @@ -231,13 +236,6 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { reg_t obj = argv[0]; uint16 value = argc > 1 ? argv[1].toUint16() : 0; if (!obj.segment) { // pause the whole playlist - // SCI0 games (up to including qfg1) give us 0/1 for either resuming or pausing the current music - // this one doesn't count, so pausing 2 times and resuming once means here that we are supposed to resume - - // Pausing/Resuming the whole playlist was introduced in the SCI1 late sound scheme. - if (_soundVersion <= SCI_VERSION_1_EARLY) - return acc; - _music->pauseAll(value); } else { // pause a playlist slot MusicEntry *musicSlot = _music->getSlot(obj); @@ -246,13 +244,7 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { return acc; } - if (_soundVersion <= SCI_VERSION_0_LATE) { - // Always pause the sound in SCI0 games. It's resumed in cmdResumeSound() - writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPaused); - _music->soundPause(musicSlot); - } else { - _music->soundToggle(musicSlot, value); - } + _music->soundToggle(musicSlot, value); } return acc; } -- cgit v1.2.3 From 3fe205ba7f376bcc7f4f87226b61918acb9ce925 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 18:35:46 +0000 Subject: SCI: fixing regression of r50414 - we set volume to standard levels inside initCommands since then, so if we set the actual needed volume before calling that it will get ignored - fixes lsl1demo svn-id: r50766 --- engines/sci/sound/music.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index cf084f81eb..55a7e1fdc4 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -374,9 +374,10 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { _mutex.lock(); pSnd->pMidiParser->mainThreadBegin(); pSnd->pMidiParser->tryToOwnChannels(); + if (pSnd->status == kSoundStopped) + pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->setVolume(pSnd->volume); if (pSnd->status == kSoundStopped) { - pSnd->pMidiParser->sendInitCommands(); pSnd->pMidiParser->jumpToTick(0); } else { // Fast forward to the last position and perform associated events when loading -- cgit v1.2.3 From d27e4a475bde10c00e7f7f67ce7f4e14cc634db2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 21:10:14 +0000 Subject: SCI: removing origName from KernelFunction struct, adding debugCalls boolean for later use svn-id: r50769 --- engines/sci/engine/kernel.cpp | 115 ++++++++++++++++++++---------------------- engines/sci/engine/kernel.h | 5 +- engines/sci/engine/vm.cpp | 8 +-- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 3e30480b99..2b8daf03d1 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -1006,11 +1006,12 @@ void Kernel::mapFunctions() { // Reset the table entry _kernelFuncs[id].function = NULL; _kernelFuncs[id].signature = NULL; - _kernelFuncs[id].origName = kernelName; + _kernelFuncs[id].name = NULL; _kernelFuncs[id].isDummy = true; _kernelFuncs[id].workarounds = NULL; _kernelFuncs[id].subFunctions = NULL; _kernelFuncs[id].subFunctionCount = 0; + _kernelFuncs[id].debugCalls = false; if (kernelName.empty()) { // No name was given -> must be an unknown opcode warning("Kernel function %x unknown", id); @@ -1038,70 +1039,66 @@ void Kernel::mapFunctions() { if (kernelMap->name) { // A match was found - if (kernelMap->function) { - _kernelFuncs[id].function = kernelMap->function; - _kernelFuncs[id].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); - _kernelFuncs[id].workarounds = kernelMap->workarounds; - _kernelFuncs[id].isDummy = false; - if (kernelMap->subFunctions) { - // Get version for subfunction identification - SciVersion mySubVersion = (SciVersion)kernelMap->function(NULL, 0, NULL).offset; - // Now check whats the highest subfunction-id for this version - const SciKernelMapSubEntry *kernelSubMap = kernelMap->subFunctions; - uint16 subFunctionCount = 0; - while (kernelSubMap->function) { - if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) - if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) - if (subFunctionCount <= kernelSubMap->id) - subFunctionCount = kernelSubMap->id + 1; - kernelSubMap++; - } - if (!subFunctionCount) - error("k%s[%x]: no subfunctions found for requested version", kernelName.c_str(), id); - // Now allocate required memory and go through it again - _kernelFuncs[id].subFunctionCount = subFunctionCount; - KernelSubFunction *subFunctions = new KernelSubFunction[subFunctionCount]; - _kernelFuncs[id].subFunctions = subFunctions; - memset(subFunctions, 0, sizeof(KernelSubFunction) * subFunctionCount); - // And fill this info out - kernelSubMap = kernelMap->subFunctions; - uint kernelSubNr = 0; - while (kernelSubMap->function) { - if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) - if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) { - uint subId = kernelSubMap->id; - subFunctions[subId].function = kernelSubMap->function; - subFunctions[subId].name = kernelSubMap->name; - subFunctions[subId].workarounds = kernelSubMap->workarounds; - if (kernelSubMap->signature) { - subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); - } else { - // we go back the submap to find the previous signature for that kernel call - const SciKernelMapSubEntry *kernelSubMapBack = kernelSubMap; - uint kernelSubLeft = kernelSubNr; - while (kernelSubLeft) { - kernelSubLeft--; - kernelSubMapBack--; - if (kernelSubMapBack->name == kernelSubMap->name) { - if (kernelSubMapBack->signature) { - subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMapBack->signature); - break; - } + _kernelFuncs[id].function = kernelMap->function; + _kernelFuncs[id].name = kernelMap->name; + _kernelFuncs[id].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); + _kernelFuncs[id].workarounds = kernelMap->workarounds; + _kernelFuncs[id].isDummy = false; + if (kernelMap->subFunctions) { + // Get version for subfunction identification + SciVersion mySubVersion = (SciVersion)kernelMap->function(NULL, 0, NULL).offset; + // Now check whats the highest subfunction-id for this version + const SciKernelMapSubEntry *kernelSubMap = kernelMap->subFunctions; + uint16 subFunctionCount = 0; + while (kernelSubMap->function) { + if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) + if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) + if (subFunctionCount <= kernelSubMap->id) + subFunctionCount = kernelSubMap->id + 1; + kernelSubMap++; + } + if (!subFunctionCount) + error("k%s[%x]: no subfunctions found for requested version", kernelName.c_str(), id); + // Now allocate required memory and go through it again + _kernelFuncs[id].subFunctionCount = subFunctionCount; + KernelSubFunction *subFunctions = new KernelSubFunction[subFunctionCount]; + _kernelFuncs[id].subFunctions = subFunctions; + memset(subFunctions, 0, sizeof(KernelSubFunction) * subFunctionCount); + // And fill this info out + kernelSubMap = kernelMap->subFunctions; + uint kernelSubNr = 0; + while (kernelSubMap->function) { + if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) + if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) { + uint subId = kernelSubMap->id; + subFunctions[subId].function = kernelSubMap->function; + subFunctions[subId].name = kernelSubMap->name; + subFunctions[subId].workarounds = kernelSubMap->workarounds; + if (kernelSubMap->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); + } else { + // we go back the submap to find the previous signature for that kernel call + const SciKernelMapSubEntry *kernelSubMapBack = kernelSubMap; + uint kernelSubLeft = kernelSubNr; + while (kernelSubLeft) { + kernelSubLeft--; + kernelSubMapBack--; + if (kernelSubMapBack->name == kernelSubMap->name) { + if (kernelSubMapBack->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMapBack->signature); + break; } } - if (!subFunctions[subId].signature) - error("k%s: no previous signatures", kernelSubMap->name); } + if (!subFunctions[subId].signature) + error("k%s: no previous signatures", kernelSubMap->name); } - kernelSubMap++; - kernelSubNr++; - } + } + kernelSubMap++; + kernelSubNr++; } - ++mapped; - } else { - //warning("Ignoring function %s\n", s_kernelFuncMap[found].name); - ++ignored; } + ++mapped; } else { if (nameMatch) error("k%s[%x]: not found for this version/platform", kernelName.c_str(), id); diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index a5ea379ba6..b7806ce551 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -141,13 +141,14 @@ struct KernelSubFunction { }; struct KernelFunction { - KernelFunctionCall *function; - Common::String origName; /**< Original name, in case we couldn't map it */ bool isDummy; + KernelFunctionCall *function; + const char *name; uint16 *signature; const SciWorkaroundEntry *workarounds; const KernelSubFunction *subFunctions; uint16 subFunctionCount; + bool debugCalls; }; enum AutoDetectedFeatures { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a0f38c634c..e8a28780fb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -798,7 +798,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, workaroundFound, &originReply); if (!workaroundFound) { kernel->signatureDebug(kernelCall.signature, argc, argv); - error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernel->getKernelName(kernelFuncNr).c_str(), kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. if (workaround.segment) @@ -827,7 +827,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { argc--; argv++; if (subId >= kernelCall.subFunctionCount) - error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.origName, subId); + error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); const KernelSubFunction &kernelSubCall = kernelCall.subFunctions[subId]; if (!kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { // Signature mismatch @@ -857,7 +857,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { if (s->_executionStack.begin() != s->_executionStack.end()) s->_executionStack.pop_back(); } else { - Common::String warningMsg = "Dummy function " + kernelCall.origName + + Common::String warningMsg = "Dummy function " + kernel->getKernelName(kernelFuncNr) + Common::String::printf("[0x%x]", kernelFuncNr) + " invoked - ignoring. Params: " + Common::String::printf("%d", argc) + " ("; @@ -871,7 +871,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { // Make sure that the game doesn't call a function that is considered unused. If // that happens, error out. - if (kernelCall.origName == "Dummy") + if (kernel->getKernelName(kernelFuncNr) == "Dummy") error("Kernel function %d was called, which was considered to be unused", kernelFuncNr); } } -- cgit v1.2.3 From af479a20ae1df5d851a854a1d1906072b50166e3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 21:33:12 +0000 Subject: SCI: adding workaround support for kernel subcalls, cleanup svn-id: r50770 --- engines/sci/engine/vm.cpp | 49 +++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e8a28780fb..0663c18338 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -270,7 +270,7 @@ struct SciTrackOriginReply { int localCallOffset; }; -static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, bool &workaroundFound, SciTrackOriginReply *trackOrigin) { +static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { EngineState *state = g_sci->getEngineState(); ExecStack *lastCall = state->xs; Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); @@ -315,7 +315,6 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->inheritanceLevel == inheritanceLevel) && (workaround->objectName == searchObjectName) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { // Workaround found - workaroundFound = true; return workaround->newValue; } workaround++; @@ -334,8 +333,6 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w trackOrigin->methodName = curMethodName; trackOrigin->scriptNr = curScriptNr; trackOrigin->localCallOffset = lastCall->debugLocalCallOffset; - - workaroundFound = false; return make_reg(0xFFFF, 0xFFFF); } @@ -369,10 +366,9 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i if (type == VAR_TEMP && r[index].segment == 0xffff) { // Uninitialized read on a temp // We need to find correct replacements for each situation manually - bool workaroundFound; SciTrackOriginReply originReply; - r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, workaroundFound, &originReply); - if (!workaroundFound) + r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); + if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF)) error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } return r[index]; @@ -780,25 +776,24 @@ static reg_t pointer_add(EngineState *s, reg_t base, int offset) { } } -static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { +static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { Kernel *kernel = g_sci->getKernel(); - if (kernelFuncNr >= (int)kernel->_kernelFuncs.size()) - error("Invalid kernel function 0x%x requested", kernelFuncNr); + if (kernelCallNr >= (int)kernel->_kernelFuncs.size()) + error("Invalid kernel function 0x%x requested", kernelCallNr); - const KernelFunction &kernelCall = kernel->_kernelFuncs[kernelFuncNr]; + const KernelFunction &kernelCall = kernel->_kernelFuncs[kernelCallNr]; reg_t *argv = s->xs->sp + 1; if (kernelCall.signature && !kernel->signatureMatch(kernelCall.signature, argc, argv)) { // signature mismatch, check if a workaround is available - bool workaroundFound; SciTrackOriginReply originReply; reg_t workaround; - workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, workaroundFound, &originReply); - if (!workaroundFound) { + workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, &originReply); + if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { kernel->signatureDebug(kernelCall.signature, argc, argv); - error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelFuncNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. if (workaround.segment) @@ -812,7 +807,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { ExecStack *xstack; xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->debugSelector = kernelFuncNr; + xstack->debugSelector = kernelCallNr; xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function @@ -821,7 +816,7 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { } else { // Sub-functions available, check signature and call that one directly if (argc < 1) - error("[VM] k%s: no subfunction-id parameter given"); + error("[VM] k%s[%x]: no subfunction-id parameter given", kernelCall.name, kernelCallNr); const uint16 subId = argv[0].toUint16(); // Skip over subfunction-id argc--; @@ -831,8 +826,16 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { const KernelSubFunction &kernelSubCall = kernelCall.subFunctions[subId]; if (!kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { // Signature mismatch - kernel->signatureDebug(kernelSubCall.signature, argc, argv); - error("[VM] k%s: subfunction signature mismatch", kernelSubCall.name); + SciTrackOriginReply originReply; + reg_t workaround; + workaround = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); + if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { + kernel->signatureDebug(kernelSubCall.signature, argc, argv); + error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + } + // FIXME: implement some real workaround type logic - ignore call, still do call etc. + if (workaround.segment) + return; } s->r_acc = kernelSubCall.function(s, argc, argv); } @@ -857,8 +860,8 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { if (s->_executionStack.begin() != s->_executionStack.end()) s->_executionStack.pop_back(); } else { - Common::String warningMsg = "Dummy function " + kernel->getKernelName(kernelFuncNr) + - Common::String::printf("[0x%x]", kernelFuncNr) + + Common::String warningMsg = "Dummy function " + kernel->getKernelName(kernelCallNr) + + Common::String::printf("[0x%x]", kernelCallNr) + " invoked - ignoring. Params: " + Common::String::printf("%d", argc) + " ("; @@ -871,8 +874,8 @@ static void callKernelFunc(EngineState *s, int kernelFuncNr, int argc) { // Make sure that the game doesn't call a function that is considered unused. If // that happens, error out. - if (kernel->getKernelName(kernelFuncNr) == "Dummy") - error("Kernel function %d was called, which was considered to be unused", kernelFuncNr); + if (kernel->getKernelName(kernelCallNr) == "Dummy") + error("Kernel function %d was called, which was considered to be unused", kernelCallNr); } } -- cgit v1.2.3 From 02cac2d5aadaf73385ea979afdf6222a72b026cf Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 9 Jul 2010 21:36:59 +0000 Subject: KYRA/PC98: fix music volume svn-id: r50772 --- engines/kyra/sound_towns.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index f6d71f8549..8003ca25f3 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -2788,16 +2788,15 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { int32 finOut = 0; for (int ii = 0; ii < 3; ii++) { - if ((_channels[ii].vol >> 4) & 1) - finOut += _tleTable[_channels[ii].out ? _pReslt : 0]; - else - finOut += _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; + int32 finOutTemp = ((_channels[ii].vol >> 4) & 1) ? _tleTable[_channels[ii].out ? _pReslt : 0] : _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; if ((1 << ii) & _volMaskA) - finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + finOutTemp = (finOutTemp * _volumeA) / Audio::Mixer::kMaxMixerVolume; if ((1 << ii) & _volMaskB) - finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + finOutTemp = (finOutTemp * _volumeB) / Audio::Mixer::kMaxMixerVolume; + + finOut += finOutTemp; } finOut /= 3; -- cgit v1.2.3 From 0cd97ca5c5394aebf542ad7357d8bb0983b2ea09 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 9 Jul 2010 21:51:20 +0000 Subject: SCI: improve error message on subcall signature mismatch svn-id: r50774 --- engines/sci/engine/vm.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 0663c18338..a354491a83 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -831,7 +831,12 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { workaround = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { kernel->signatureDebug(kernelSubCall.signature, argc, argv); - error("[VM] k%s (%x) signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + int callNameLen = strlen(kernelCall.name); + if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { + const char *subCallName = kernelSubCall.name + callNameLen; + error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + } + error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. if (workaround.segment) -- cgit v1.2.3 From de7108054fe802b0fb283bfc7484988a1344b9e1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 9 Jul 2010 22:10:22 +0000 Subject: Add detection for 'Little Monster at School' and the bunch of demos that came on the CD (on the demo server now too). svn-id: r50776 --- engines/mohawk/detection.cpp | 2 + engines/mohawk/detection_tables.h | 135 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/engines/mohawk/detection.cpp b/engines/mohawk/detection.cpp index c3a0c17251..f04338239f 100644 --- a/engines/mohawk/detection.cpp +++ b/engines/mohawk/detection.cpp @@ -117,6 +117,8 @@ static const PlainGameDescriptor mohawkGames[] = { {"ruff", "Ruff's Bone"}, {"newkid", "The New Kid on the Block"}, {"arthurrace", "Arthur's Reading Race"}, + {"arthurbday", "Arthur's Birthday"}, + {"lilmonster", "Little Monster at School"}, #endif {0, 0} }; diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index ea72574978..7470dbf1dd 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -617,6 +617,21 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + { + { + "tortoise", + "Demo", + AD_ENTRY1("The Tortoise and the Hare Demo", "35d571806838667743c7c15a133e9335"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + { { "arthur", @@ -647,6 +662,21 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + { + { + "arthur", + "Demo v1.1", + AD_ENTRY1("ARTHUR.512", "f19e824e0a2f2745ed698e6aaf44f838"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + { { "arthur", @@ -662,6 +692,21 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + { + { + "arthur", + "Demo", + AD_ENTRY1("Arthur's Teacher Trouble Demo", "dcbd8af6bf25854df8ad36fd13665d08"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + { { "grandma", @@ -707,6 +752,21 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + { + { + "grandma", + "Demo", + AD_ENTRY1("Just Grandma and Me Demo", "552d8729fa77a4a83c88283c7d79bd31"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + { { "ruff", @@ -767,6 +827,21 @@ static const MohawkGameDescription gameDescriptions[] = { 0 }, + { + { + "newkid", + "Demo", + AD_ENTRY1("The New Kid on the Block Demo", "7d33237e0ea452a97f2a3acdfb9e1286"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + { { "arthurrace", @@ -797,6 +872,66 @@ static const MohawkGameDescription gameDescriptions[] = { 0, 0 }, + + { + { + "arthurbday", + "Demo", + AD_ENTRY1("BIRTHDAY.512", "fb73e387cfec65c5c930db068a8f468a"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "arthurbday", + "Demo", + AD_ENTRY1("Arthur's Birthday Demo", "0d974ec635eea615475368e865f1b1c8"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_DEMO, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + GF_DEMO, + 0 + }, + + { + { + "lilmonster", + "", + AD_ENTRY1("MONSTER.512", "e7b24bf8f59106b5c4df51b39eb8c0ef"), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + 0 + }, + + { + { + "lilmonster", + "", + AD_ENTRY1("BookOutline", "970409f9d967d63c05e63113f8e78fe2"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + Common::GUIO_NONE + }, + GType_LIVINGBOOKSV1, + 0, + 0 + }, #endif { AD_TABLE_END_MARKER, 0, 0, 0 } -- cgit v1.2.3 From f687a44d2ad911b22408fee0505aab187607b3ef Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 10:20:23 +0000 Subject: SCI: added kPalVary signatures & mapping, removed debug-warnings svn-id: r50777 --- engines/sci/engine/kernel.cpp | 16 ++++- engines/sci/engine/kernel.h | 9 +++ engines/sci/engine/kgraphics.cpp | 137 ++++++++++++++------------------------- 3 files changed, 72 insertions(+), 90 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2b8daf03d1..ce5d4c9f2b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -308,6 +308,18 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +static const SciKernelMapSubEntry kPalVary_subops[] = { + { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, + { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, + { SIG_SCIALL, 2, MAP_CALL(PalVaryGetCurrentStep), "", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PalVaryDeinit), "", NULL }, + { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, + { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, + { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, + { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + struct SciKernelMapEntry { const char *name; KernelFunctionCall *function; @@ -355,7 +367,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", kDoSound_subops, NULL }, // subop + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, @@ -426,7 +438,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, - { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, // subop + { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", kPalVary_subops, NULL }, { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index b7806ce551..9c7a9bfbe1 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -491,6 +491,15 @@ reg_t kDoSoundSetVolume(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetPriority(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetLoop(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryInit(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryReverse(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryGetCurrentStep(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryDeinit(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryChangeTarget(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv); +reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv); + //@} } // End of namespace Sci diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index bacba674d7..f006c1e0ae 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -641,97 +641,58 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { - uint16 operation = argv[0].toUint16(); + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} - switch (operation) { - case 0: { // Init - GuiResourceId paletteId; - uint16 ticks, stepStop; - uint16 direction; - if ((argc >= 3) && (argc <= 5)) { - paletteId = argv[1].toUint16(); - ticks = argv[2].toUint16(); - stepStop = argc >= 4 ? argv[3].toUint16() : 64; - direction = argc >= 5 ? argv[4].toUint16() : 1; - warning("kPalVary(init) called with paletteId = %d, ticks = %d, stop = %d, direction = %d", paletteId, ticks, stepStop, direction); - if (g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction)) - return SIGNAL_REG; - } else { - warning("kPalVary(init) called with unsupported argc %d", argc); - } - break; - } - case 1: { // Reverse - int16 ticks, stepStop, direction; +reg_t kPalVaryInit(EngineState *s, int argc, reg_t *argv) { + GuiResourceId paletteId = argv[0].toUint16(); + uint16 ticks = argv[1].toUint16(); + uint16 stepStop = argc >= 3 ? argv[2].toUint16() : 64; + uint16 direction = argc >= 4 ? argv[3].toUint16() : 1; + if (g_sci->_gfxPalette->kernelPalVaryInit(paletteId, ticks, stepStop, direction)) + return SIGNAL_REG; + return NULL_REG; +} - if ((argc >= 1) && (argc <= 4)) { - ticks = argc >= 2 ? argv[1].toUint16() : -1; - stepStop = argc >= 3 ? argv[2].toUint16() : 0; - direction = argc >= 4 ? argv[3].toSint16() : -1; +reg_t kPalVaryReverse(EngineState *s, int argc, reg_t *argv) { + int16 ticks = argc >= 1 ? argv[0].toUint16() : -1; + int16 stepStop = argc >= 2 ? argv[1].toUint16() : 0; + int16 direction = argc >= 3 ? argv[2].toSint16() : -1; - int16 result = g_sci->_gfxPalette->kernelPalVaryReverse(ticks, stepStop, direction); - warning("kPalVary(reverse) called with ticks = %d, stop = %d, direction = %d", ticks, stepStop, direction); - return make_reg(0, result); - } else { - warning("kPalVary(reverse) called with unsupported argc %d", argc); - } - } - case 2: { // Get Current Step - if (argc == 1) { - int16 currentStep = g_sci->_gfxPalette->kernelPalVaryGetCurrentStep(); - return make_reg(0, currentStep); - } else { - warning("kPalVary(getCurrentStep) called with unsupported argc %d", argc); - } - break; - } - case 3: { // DeInit - if (argc == 1) { - g_sci->_gfxPalette->kernelPalVaryDeinit(); - warning("kPalVary(deinit)"); - } else { - warning("kPalVary(deinit) called with unsupported argc %d", argc); - } - break; - } - case 4: { // Change Target - if (argc == 2) { - GuiResourceId paletteId = argv[1].toUint16(); - int16 currentStep = g_sci->_gfxPalette->kernelPalVaryChangeTarget(paletteId); - return make_reg(0, currentStep); - } else { - warning("kPalVary(changeTarget) called with unsupported argc %d", argc); - } - break; - } - case 5: { // Change ticks - if (argc == 2) { - uint16 ticks = argv[1].toUint16(); - g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks); - } else { - warning("kPalVary(changeTicks) called with unsupported argc %d", argc); - } - break; - } - case 6: { // Pause/Resume - bool pauseState; - if (argc == 2) { - pauseState = argv[1].isNull() ? false : true; - g_sci->_gfxPalette->kernelPalVaryPause(pauseState); - warning("kPalVary(pause) called with state = %d", pauseState); - } else { - warning("kPalVary(pause) called with unsupported argc %d", argc); - } - break; - } - case 8: { // Unknown (seems to be SCI32 exclusive) - // Called in PQ4 (1 parameter) - warning("kPalVary(8) called with parameter %d (argc %d)", argv[1].toUint16(), argc); - break; - } - default: - error("kPalVary(%d), not implemented (argc = %d)", operation, argc); - } + return make_reg(0, g_sci->_gfxPalette->kernelPalVaryReverse(ticks, stepStop, direction)); +} + +reg_t kPalVaryGetCurrentStep(EngineState *s, int argc, reg_t *argv) { + return make_reg(0, g_sci->_gfxPalette->kernelPalVaryGetCurrentStep()); +} + +reg_t kPalVaryDeinit(EngineState *s, int argc, reg_t *argv) { + g_sci->_gfxPalette->kernelPalVaryDeinit(); + return NULL_REG; +} + +reg_t kPalVaryChangeTarget(EngineState *s, int argc, reg_t *argv) { + GuiResourceId paletteId = argv[1].toUint16(); + int16 currentStep = g_sci->_gfxPalette->kernelPalVaryChangeTarget(paletteId); + return make_reg(0, currentStep); +} + +reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv) { + uint16 ticks = argv[1].toUint16(); + g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks); + return NULL_REG; +} + +reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) { + bool pauseState = pauseState = argv[1].isNull() ? false : true; + g_sci->_gfxPalette->kernelPalVaryPause(pauseState); + return NULL_REG; +} + +reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) { + // Unknown (seems to be SCI32 exclusive) return NULL_REG; } -- cgit v1.2.3 From bab61443ac5b59d20f3846518121286338c5724d Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sat, 10 Jul 2010 11:15:10 +0000 Subject: Fixed warning. svn-id: r50778 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f006c1e0ae..12cac971f0 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -686,7 +686,7 @@ reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) { - bool pauseState = pauseState = argv[1].isNull() ? false : true; + bool pauseState = argv[1].isNull() ? false : true; g_sci->_gfxPalette->kernelPalVaryPause(pauseState); return NULL_REG; } -- cgit v1.2.3 From cfc93a7e4dff46e1bca4656c2976c1f3c1e68a87 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Sat, 10 Jul 2010 11:16:46 +0000 Subject: Simplified the expression. svn-id: r50779 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 12cac971f0..25eb81f65c 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -686,7 +686,7 @@ reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) { - bool pauseState = argv[1].isNull() ? false : true; + bool pauseState = !argv[1].isNull(); g_sci->_gfxPalette->kernelPalVaryPause(pauseState); return NULL_REG; } -- cgit v1.2.3 From f38348b82e3e6781ae2a166e951fc83f11f8d618 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 12:19:32 +0000 Subject: SCI: adding kPalette signatures, fixing 3 kPalVary calls, fixing kAssertPalette (we used the wrong parameter number before, maybe the issues were caused by this) svn-id: r50780 --- engines/sci/engine/kernel.cpp | 14 ++++- engines/sci/engine/kernel.h | 9 +++ engines/sci/engine/kgraphics.cpp | 131 +++++++++++++++++++++------------------ engines/sci/graphics/palette.cpp | 5 +- 4 files changed, 94 insertions(+), 65 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ce5d4c9f2b..2069b8ee80 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -320,6 +320,18 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +static const SciKernelMapSubEntry kPalette_subops[] = { + { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, + { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", NULL }, + { SIG_SCIALL, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, + { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, + { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, + { SIG_SCIALL, 7, MAP_CALL(PaletteSave), "", NULL }, + { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "i", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + struct SciKernelMapEntry { const char *name; KernelFunctionCall *function; @@ -439,7 +451,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", kPalVary_subops, NULL }, - { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", kPalette_subops, NULL }, { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 9c7a9bfbe1..5815fec53b 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -500,6 +500,15 @@ reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv); reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv); reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteSetFromResource(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteSetFlag(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteUnsetFlag(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteSetIntensity(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteFindColor(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteSave(EngineState *s, int argc, reg_t *argv); +reg_t kPaletteRestore(EngineState *s, int argc, reg_t *argv); + //@} } // End of namespace Sci diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 25eb81f65c..9714374ade 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -555,66 +555,72 @@ reg_t kSetNowSeen(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +// we are called on EGA/amiga games as well, this doesnt make sense. +// doing this would actually break the system EGA/amiga palette reg_t kPalette(EngineState *s, int argc, reg_t *argv) { - // we are called on EGA/amiga games as well, this doesnt make sense. - // doing this would actually break the system EGA/amiga palette - if (!g_sci->getResMan()->isVGA()) - return s->r_acc; + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} - switch (argv[0].toUint16()) { - case 1: // Set resource palette - if (argc == 2 || argc == 3) { - GuiResourceId resourceId = argv[1].toUint16(); - bool force = false; - if (argc == 3) - force = argv[2].toUint16() == 2 ? true : false; - g_sci->_gfxPalette->kernelSetFromResource(resourceId, force); - } else { - warning("kPalette(1) called with %d parameters", argc); - } - break; - case 2: { // Set palette-flag(s) - uint16 fromColor = CLIP(argv[1].toUint16(), 1, 255); - uint16 toColor = CLIP(argv[2].toUint16(), 1, 255); - uint16 flags = argv[3].toUint16(); +reg_t kPaletteSetFromResource(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + GuiResourceId resourceId = argv[0].toUint16(); + bool force = false; + if (argc == 2) + force = argv[1].toUint16() == 2 ? true : false; + g_sci->_gfxPalette->kernelSetFromResource(resourceId, force); + } + return s->r_acc; +} + +reg_t kPaletteSetFlag(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + uint16 fromColor = CLIP(argv[0].toUint16(), 1, 255); + uint16 toColor = CLIP(argv[1].toUint16(), 1, 255); + uint16 flags = argv[2].toUint16(); g_sci->_gfxPalette->kernelSetFlag(fromColor, toColor, flags); - break; } - case 3: { // Remove palette-flag(s) - uint16 fromColor = CLIP(argv[1].toUint16(), 1, 255); - uint16 toColor = CLIP(argv[2].toUint16(), 1, 255); - uint16 flags = argv[3].toUint16(); + return s->r_acc; +} + +reg_t kPaletteUnsetFlag(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + uint16 fromColor = CLIP(argv[0].toUint16(), 1, 255); + uint16 toColor = CLIP(argv[1].toUint16(), 1, 255); + uint16 flags = argv[2].toUint16(); g_sci->_gfxPalette->kernelUnsetFlag(fromColor, toColor, flags); - break; } - case 4: { // Set palette intensity - switch (argc) { - case 4: - case 5: { - uint16 fromColor = CLIP(argv[1].toUint16(), 1, 255); - uint16 toColor = CLIP(argv[2].toUint16(), 1, 255); - uint16 intensity = argv[3].toUint16(); - bool setPalette = (argc < 5) ? true : (argv[4].isNull()) ? true : false; - - g_sci->_gfxPalette->kernelSetIntensity(fromColor, toColor, intensity, setPalette); - break; - } - default: - warning("kPalette(4) called with %d parameters", argc); - } - break; + return s->r_acc; +} + +reg_t kPaletteSetIntensity(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + uint16 fromColor = CLIP(argv[0].toUint16(), 1, 255); + uint16 toColor = CLIP(argv[1].toUint16(), 1, 255); + uint16 intensity = argv[2].toUint16(); + bool setPalette = (argc < 4) ? true : (argv[3].isNull()) ? true : false; + + g_sci->_gfxPalette->kernelSetIntensity(fromColor, toColor, intensity, setPalette); } - case 5: { // Find closest color - uint16 r = argv[1].toUint16(); - uint16 g = argv[2].toUint16(); - uint16 b = argv[3].toUint16(); + return s->r_acc; +} +reg_t kPaletteFindColor(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + uint16 r = argv[0].toUint16(); + uint16 g = argv[1].toUint16(); + uint16 b = argv[2].toUint16(); return make_reg(0, g_sci->_gfxPalette->kernelFindColor(r, g, b)); } - case 6: { // Animate + return NULL_REG; +} + +reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { int16 argNr; bool paletteChanged = false; - for (argNr = 1; argNr < argc; argNr += 3) { + for (argNr = 0; argNr < argc; argNr += 3) { uint16 fromColor = argv[argNr].toUint16(); uint16 toColor = argv[argNr + 1].toUint16(); int16 speed = argv[argNr + 2].toSint16(); @@ -623,20 +629,21 @@ reg_t kPalette(EngineState *s, int argc, reg_t *argv) { } if (paletteChanged) g_sci->_gfxPalette->kernelAnimateSet(); - break; } - case 7: { // Save palette to heap + return s->r_acc; +} + +reg_t kPaletteSave(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { warning("kPalette(7), save palette to heap STUB"); - break; - } - case 8: { // Restore palette from heap - warning("kPalette(8), set stored palette STUB"); - break; - } - default: - error("kPalette(%d), not implemented", argv[0].toUint16()); } + return NULL_REG; +} +reg_t kPaletteRestore(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isVGA()) { + warning("kPalette(8), restore palette from heap STUB"); + } return s->r_acc; } @@ -674,19 +681,19 @@ reg_t kPalVaryDeinit(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVaryChangeTarget(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[1].toUint16(); + GuiResourceId paletteId = argv[0].toUint16(); int16 currentStep = g_sci->_gfxPalette->kernelPalVaryChangeTarget(paletteId); return make_reg(0, currentStep); } reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv) { - uint16 ticks = argv[1].toUint16(); + uint16 ticks = argv[0].toUint16(); g_sci->_gfxPalette->kernelPalVaryChangeTicks(ticks); return NULL_REG; } reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) { - bool pauseState = !argv[1].isNull(); + bool pauseState = !argv[0].isNull(); g_sci->_gfxPalette->kernelPalVaryPause(pauseState); return NULL_REG; } @@ -697,7 +704,7 @@ reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) { } reg_t kAssertPalette(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[1].toUint16(); + GuiResourceId paletteId = argv[0].toUint16(); g_sci->_gfxPalette->kernelAssertPalette(paletteId); return s->r_acc; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 9c64c21743..b85281e9c4 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -482,8 +482,9 @@ void GfxPalette::kernelAnimateSet() { void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { // Sometimes invalid viewIds are asked for, ignore those (e.g. qfg1vga) - if (!_resMan->testResource(ResourceId(kResourceTypeView, resourceId))) - return; + //if (!_resMan->testResource(ResourceId(kResourceTypeView, resourceId))) + // return; + // maybe we took the wrong parameter before, if this causes invalid view again, enable to commented out code again GfxView *view = g_sci->_gfxCache->getView(resourceId); Palette *viewPalette = view->getPalette(); -- cgit v1.2.3 From ce6a73adf532045c60f4c4072228b7bfdff87385 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 13:19:20 +0000 Subject: SCI: updated debug output from kDoSound svn-id: r50781 --- engines/sci/sound/soundcmd.cpp | 44 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 5ac8c6b270..11b0215a32 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -73,7 +73,7 @@ void SoundCommandParser::processInitSound(reg_t obj) { if (_soundVersion >= SCI_VERSION_1_EARLY) newSound->volume = CLIP(readSelectorValue(_segMan, obj, SELECTOR(vol)), 0, MUSIC_VOLUME_MAX); - debugC(2, kDebugLevelSound, "cmdInitSound, number %d, loop %d, prio %d, vol %d", resourceId, + debugC(2, kDebugLevelSound, "kDoSound(init): number %d, loop %d, prio %d, vol %d", resourceId, newSound->loop, newSound->priority, newSound->volume); // In SCI1.1 games, sound effects are started from here. If we can find @@ -112,7 +112,7 @@ reg_t SoundCommandParser::kDoSoundPlay(int argc, reg_t *argv, reg_t acc) { void SoundCommandParser::processPlaySound(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdPlaySound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(play): Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } @@ -142,7 +142,7 @@ void SoundCommandParser::processPlaySound(reg_t obj) { if (_soundVersion >= SCI_VERSION_1_EARLY) musicSlot->volume = readSelectorValue(_segMan, obj, SELECTOR(vol)); - debugC(2, kDebugLevelSound, "cmdPlaySound, number %d, loop %d, prio %d, vol %d", resourceId, + debugC(2, kDebugLevelSound, "kDoSound(play): number %d, loop %d, prio %d, vol %d", resourceId, musicSlot->loop, musicSlot->priority, musicSlot->volume); _music->soundPlay(musicSlot); @@ -161,7 +161,7 @@ reg_t SoundCommandParser::kDoSoundDispose(int argc, reg_t *argv, reg_t acc) { void SoundCommandParser::processDisposeSound(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdDisposeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(dispose): Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } @@ -183,7 +183,7 @@ reg_t SoundCommandParser::kDoSoundStop(int argc, reg_t *argv, reg_t acc) { void SoundCommandParser::processStopSound(reg_t obj, bool sampleFinishedPlaying) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdStopSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(stop): Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } @@ -229,7 +229,7 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { } return make_reg(0, 0); default: - error("kDoSoundPause: parameter 0 is invalid for sound-sci0"); + error("kDoSound(pause): parameter 0 is invalid for sound-sci0"); } } @@ -240,7 +240,7 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { } else { // pause a playlist slot MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdPauseSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(pause): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -255,7 +255,7 @@ reg_t SoundCommandParser::kDoSoundResume(int argc, reg_t *argv, reg_t acc) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdResumeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(resume):: Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -274,7 +274,7 @@ reg_t SoundCommandParser::kDoSoundMasterVolume(int argc, reg_t *argv, reg_t acc) acc = make_reg(0, _music->soundGetMasterVolume()); if (argc > 0) { - debugC(2, kDebugLevelSound, "cmdMasterVolume: %d", argv[0].toSint16()); + debugC(2, kDebugLevelSound, "kDoSound(masterVolume): %d", argv[0].toSint16()); int vol = CLIP(argv[0].toSint16(), 0, kMaxSciVolume); vol = vol * Audio::Mixer::kMaxMixerVolume / kMaxSciVolume; ConfMan.setInt("music_volume", vol); @@ -289,7 +289,7 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdFadeSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(fade): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -297,7 +297,7 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { // If sound is not playing currently, set signal directly if (musicSlot->status != kSoundPlaying) { - debugC(2, kDebugLevelSound, "cmdFadeSound: fading requested, but sound is currently not playing"); + debugC(2, kDebugLevelSound, "kDoSound(fade): fading requested, but sound is currently not playing"); writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); return acc; } @@ -322,10 +322,10 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { break; default: - error("cmdFadeSound: unsupported argc %d", argc); + error("kDoSound(fade): unsupported argc %d", argc); } - debugC(2, kDebugLevelSound, "cmdFadeSound: to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); + debugC(2, kDebugLevelSound, "kDoSound(fade): to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); return acc; } @@ -338,7 +338,7 @@ reg_t SoundCommandParser::kDoSoundUpdate(int argc, reg_t *argv, reg_t acc) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdUpdateSound: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(update): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -360,7 +360,7 @@ reg_t SoundCommandParser::kDoSoundUpdateCues(int argc, reg_t *argv, reg_t acc) { void SoundCommandParser::processUpdateCues(reg_t obj) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdUpdateCues: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(updateCues): Slot not found (%04x:%04x)", PRINT_REG(obj)); return; } @@ -453,7 +453,7 @@ reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { // TODO: maybe it's possible to call this with obj == 0:0 and send directly?! // if so, allow it //_music->sendMidiCommand(_midiCommand); - warning("cmdSendMidi: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(sendMidi): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } _music->sendMidiCommand(musicSlot, midiCommand); @@ -470,7 +470,7 @@ reg_t SoundCommandParser::kDoSoundSetHold(int argc, reg_t *argv, reg_t acc) { MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdSetSoundHold: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(setHold): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -516,7 +516,7 @@ reg_t SoundCommandParser::kDoSoundSetVolume(int argc, reg_t *argv, reg_t acc) { return acc; } - debugC(2, kDebugLevelSound, "cmdSetSoundVolume: %d", value); + debugC(2, kDebugLevelSound, "kDoSound(setVolume): %d", value); value = CLIP(value, 0, MUSIC_VOLUME_MAX); @@ -534,7 +534,7 @@ reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc) MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("cmdSetSoundPriority: Slot not found (%04x:%04x)", PRINT_REG(obj)); + warning("kDoSound(setPriority): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } @@ -544,7 +544,7 @@ reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc) if (song->data[0] == 0xf0) _music->soundSetPriority(musicSlot, song->data[1]); else - warning("cmdSetSoundPriority: Attempt to unset song priority when there is no built-in value"); + warning("kDoSound(setPriority): Attempt to unset song priority when there is no built-in value"); //pSnd->prio=0;field_15B=0 writeSelectorValue(_segMan, obj, SELECTOR(flags), readSelectorValue(_segMan, obj, SELECTOR(flags)) & 0xFD); @@ -570,7 +570,7 @@ reg_t SoundCommandParser::kDoSoundSetLoop(int argc, reg_t *argv, reg_t acc) { // request to loop the sound, so in this case, don't throw any warning, // otherwise do, because the sound won't be looped. if (value == -1) { - warning("cmdSetSoundLoop: Slot not found (%04x:%04x) and the song was requested to be looped", PRINT_REG(obj)); + warning("kDoSound(setLoop): Slot not found (%04x:%04x) and the song was requested to be looped", PRINT_REG(obj)); } else { // Doesn't really matter } @@ -588,7 +588,7 @@ reg_t SoundCommandParser::kDoSoundSetLoop(int argc, reg_t *argv, reg_t acc) { reg_t SoundCommandParser::kDoSoundSuspend(int argc, reg_t *argv, reg_t acc) { // TODO - warning("STUB: cmdSuspendSound"); + warning("kDoSound(suspend): STUB"); return acc; } -- cgit v1.2.3 From e807983e8fd742334348f99fcdb72d351b18d2e6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 14:00:43 +0000 Subject: SCI: removed unused debug flags, changed fileio debug prints to only happen on debugflag "file" svn-id: r50782 --- engines/sci/engine/kfile.cpp | 47 +++++++++++++++++++++----------------------- engines/sci/sci.cpp | 3 --- engines/sci/sci.h | 29 ++++++++++++--------------- 3 files changed, 35 insertions(+), 44 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index f371e8a799..69b80ce7ce 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -135,17 +135,17 @@ void file_open(EngineState *s, const char *filename, int mode) { } if (!inFile) - warning("file_open(_K_FILE_MODE_OPEN_OR_FAIL) failed to open file '%s'", englishName.c_str()); + warning(" -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_CREATE) { // Create the file, destroying any content it might have had outFile = saveFileMan->openForSaving(wrappedName); if (!outFile) - warning("file_open(_K_FILE_MODE_CREATE) failed to create file '%s'", englishName.c_str()); + warning(" -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_OPEN_OR_CREATE) { // Try to open file, create it if it doesn't exist outFile = saveFileMan->openForSaving(wrappedName); if (!outFile) - warning("file_open(_K_FILE_MODE_CREATE) failed to create file '%s'", englishName.c_str()); + warning(" -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); // QfG1 opens the character export file with _K_FILE_MODE_CREATE first, // closes it immediately and opens it again with this here. Perhaps // other games use this for read access as well. I guess changing this @@ -156,7 +156,7 @@ void file_open(EngineState *s, const char *filename, int mode) { } if (!inFile && !outFile) { // Failed - debug(3, "file_open() failed"); + debugC(2, kDebugLevelFile, " -> file_open() failed"); s->r_acc = SIGNAL_REG; return; } @@ -177,14 +177,14 @@ void file_open(EngineState *s, const char *filename, int mode) { s->r_acc = make_reg(0, handle); - debug(3, " -> opened file '%s' with handle %d", englishName.c_str(), handle); + debugC(2, kDebugLevelFile, " -> opened file '%s' with handle %d", englishName.c_str(), handle); } reg_t kFOpen(EngineState *s, int argc, reg_t *argv) { Common::String name = s->_segMan->getString(argv[0]); int mode = argv[1].toUint16(); - debug(3, "kFOpen(%s,0x%x)", name.c_str(), mode); + debugC(2, kDebugLevelFile, "kFOpen(%s,0x%x)", name.c_str(), mode); file_open(s, name.c_str(), mode); return s->r_acc; } @@ -204,7 +204,7 @@ static FileHandle *getFileFromHandle(EngineState *s, uint handle) { } reg_t kFClose(EngineState *s, int argc, reg_t *argv) { - debug(3, "kFClose(%d)", argv[0].toUint16()); + debugC(2, kDebugLevelFile, "kFClose(%d)", argv[0].toUint16()); if (argv[0] != SIGNAL_REG) { FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); if (f) @@ -225,8 +225,6 @@ reg_t kFPuts(EngineState *s, int argc, reg_t *argv) { } static void fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) { - debugC(2, kDebugLevelFile, "FGets'ing %d bytes from handle %d", maxsize, handle); - FileHandle *f = getFileFromHandle(s, handle); if (!f) return; @@ -248,7 +246,7 @@ static void fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) { *dest = f->_in->readByte(); } - debugC(2, kDebugLevelFile, "FGets'ed \"%s\"", dest); + debugC(2, kDebugLevelFile, " -> FGets'ed \"%s\"", dest); } static bool _savegame_index_struct_compare(const SavegameDesc &l, const SavegameDesc &r) { @@ -316,7 +314,7 @@ reg_t kFGets(EngineState *s, int argc, reg_t *argv) { char *buf = new char[maxsize]; int handle = argv[2].toUint16(); - debug(3, "kFGets(%d,%d)", handle, maxsize); + debugC(2, kDebugLevelFile, "kFGets(%d, %d)", handle, maxsize); fgets_wrapper(s, buf, maxsize, handle); s->_segMan->memcpy(argv[0], (const byte*)buf, maxsize); return argv[0]; @@ -331,7 +329,7 @@ reg_t kGetCWD(EngineState *s, int argc, reg_t *argv) { // TODO/FIXME: Is "/" a good value? Maybe "" or "." or "C:\" are better? s->_segMan->strcpy(argv[0], "/"); - debug(3, "kGetCWD() -> %s", "/"); + debugC(2, kDebugLevelFile, "kGetCWD() -> %s", "/"); return argv[0]; } @@ -700,12 +698,12 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { warning("Attempted to open a file with an empty filename"); return SIGNAL_REG; } + debugC(2, kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode); file_open(s, name.c_str(), mode); - debug(3, "K_FILEIO_OPEN(%s,0x%x)", name.c_str(), mode); break; } case K_FILEIO_CLOSE : { - debug(3, "K_FILEIO_CLOSE(%d)", argv[1].toUint16()); + debugC(2, kDebugLevelFile, "kFileIO(close): %d", argv[1].toUint16()); FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); if (f) @@ -716,8 +714,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { int handle = argv[1].toUint16(); int size = argv[3].toUint16(); char *buf = new char[size]; - debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size); - + debugC(2, kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size); FileHandle *f = getFileFromHandle(s, handle); if (f) { @@ -733,7 +730,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { int size = argv[3].toUint16(); char *buf = new char[size]; s->_segMan->memcpy((byte*)buf, argv[2], size); - debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size); + debugC(2, kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size); FileHandle *f = getFileFromHandle(s, handle); if (f) @@ -769,7 +766,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { saveFileMan->removeSavefile(wrappedName); } - debug(3, "K_FILEIO_UNLINK(%s)", name.c_str()); + debugC(2, kDebugLevelFile, "kFileIO(unlink): %s", name.c_str()); // TODO/FIXME: Should we return something (like, a bool indicating // whether deleting the save succeeded or failed)? @@ -779,7 +776,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { int size = argv[2].toUint16(); char *buf = new char[size]; int handle = argv[3].toUint16(); - debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size); + debugC(2, kDebugLevelFile, "kFileIO(readString): %d, %d", handle, size); fgets_wrapper(s, buf, size, handle); s->_segMan->memcpy(argv[1], (const byte*)buf, size); @@ -790,7 +787,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { int handle = argv[1].toUint16(); int size = argv[3].toUint16(); Common::String str = s->_segMan->getString(argv[2]); - debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size); + debugC(2, kDebugLevelFile, "kFileIO(writeString): %d, %d", handle, size); // CHECKME: Is the size parameter used at all? // In the LSL5 password protection it is zero, and we should @@ -806,7 +803,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { int handle = argv[1].toUint16(); int offset = argv[2].toUint16(); int whence = argv[3].toUint16(); - debug(3, "K_FILEIO_SEEK(%d,%d,%d)", handle, offset, whence); + debugC(2, kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence); FileHandle *f = getFileFromHandle(s, handle); if (f) @@ -817,7 +814,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { Common::String mask = s->_segMan->getString(argv[1]); reg_t buf = argv[2]; int attr = argv[3].toUint16(); // We won't use this, Win32 might, though... - debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask.c_str(), attr); + debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr); // We remove ".*". mask will get prefixed, so we will return all additional files for that gameid if (mask == "*.*") @@ -835,7 +832,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { break; } case K_FILEIO_FIND_NEXT : { - debug(3, "K_FILEIO_FIND_NEXT()"); + debugC(2, kDebugLevelFile, "kFileIO(findNext)"); s->r_acc = s->_dirseeker.nextFile(s->_segMan); break; } @@ -877,7 +874,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { exists = true; } - debug(3, "K_FILEIO_FILE_EXISTS(%s) -> %d", name.c_str(), exists); + debugC(2, kDebugLevelFile, "kFileIO(fileExists) %s -> %d", name.c_str(), exists); return make_reg(0, exists); } case K_FILEIO_RENAME: { @@ -925,7 +922,7 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { break; #endif default: - error("Unknown FileIO() sub-command: %d", func_nr); + error("kFileIO(): unknown sub-command: %d", func_nr); } return s->r_acc; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 91eeac3a21..ec8f697123 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -97,10 +97,8 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam DebugMan.addDebugChannel(kDebugLevelFuncCheck, "Func", "Function parameter debugging"); DebugMan.addDebugChannel(kDebugLevelBresen, "Bresenham", "Bresenham algorithms debugging"); DebugMan.addDebugChannel(kDebugLevelSound, "Sound", "Sound debugging"); - DebugMan.addDebugChannel(kDebugLevelGfxDriver, "Gfxdriver", "Gfx driver debugging"); DebugMan.addDebugChannel(kDebugLevelBaseSetter, "Base", "Base Setter debugging"); DebugMan.addDebugChannel(kDebugLevelParser, "Parser", "Parser debugging"); - DebugMan.addDebugChannel(kDebugLevelMenu, "Menu", "Menu handling debugging"); DebugMan.addDebugChannel(kDebugLevelSaid, "Said", "Said specs debugging"); DebugMan.addDebugChannel(kDebugLevelFile, "File", "File I/O debugging"); DebugMan.addDebugChannel(kDebugLevelTime, "Time", "Time debugging"); @@ -110,7 +108,6 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam DebugMan.addDebugChannel(kDebugLevelVM, "VM", "VM debugging"); DebugMan.addDebugChannel(kDebugLevelScripts, "Scripts", "Notifies when scripts are unloaded"); DebugMan.addDebugChannel(kDebugLevelGC, "GC", "Garbage Collector debugging"); - DebugMan.addDebugChannel(kDebugLevelSci0Pic, "Sci0Pic", "SCI0 pic drawing debugging"); DebugMan.addDebugChannel(kDebugLevelResMan, "ResMan", "Resource manager debugging"); DebugMan.addDebugChannel(kDebugLevelOnStartup, "OnStartup", "Enter debugger at start of game"); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index c09342f749..8f7205ea7a 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -84,22 +84,19 @@ enum kDebugLevels { kDebugLevelFuncCheck = 1 << 5, kDebugLevelBresen = 1 << 6, kDebugLevelSound = 1 << 7, - kDebugLevelGfxDriver = 1 << 8, - kDebugLevelBaseSetter = 1 << 9, - kDebugLevelParser = 1 << 10, - kDebugLevelMenu = 1 << 11, - kDebugLevelSaid = 1 << 12, - kDebugLevelFile = 1 << 13, - kDebugLevelTime = 1 << 14, - kDebugLevelRoom = 1 << 15, - kDebugLevelAvoidPath = 1 << 16, - kDebugLevelDclInflate = 1 << 17, - kDebugLevelVM = 1 << 18, - kDebugLevelScripts = 1 << 19, - kDebugLevelGC = 1 << 20, - kDebugLevelSci0Pic = 1 << 21, - kDebugLevelResMan = 1 << 22, - kDebugLevelOnStartup = 1 << 23 + kDebugLevelBaseSetter = 1 << 8, + kDebugLevelParser = 1 << 9, + kDebugLevelSaid = 1 << 10, + kDebugLevelFile = 1 << 11, + kDebugLevelTime = 1 << 12, + kDebugLevelRoom = 1 << 13, + kDebugLevelAvoidPath = 1 << 14, + kDebugLevelDclInflate = 1 << 15, + kDebugLevelVM = 1 << 16, + kDebugLevelScripts = 1 << 17, + kDebugLevelGC = 1 << 18, + kDebugLevelResMan = 1 << 19, + kDebugLevelOnStartup = 1 << 20 }; enum SciGameId { -- cgit v1.2.3 From 28d07c7e0a8e2e84aa5bba45105dc4091476f4ee Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 16:22:08 +0000 Subject: SCI: calculate widths for menu after switching to menuport, i guess this was the reason why we sometimes had issues drawing parts of the menu (random issue) svn-id: r50784 --- engines/sci/graphics/menu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index f959ffb3a5..bfe58e03d5 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -704,8 +704,8 @@ GuiMenuItemEntry *GfxMenu::interactiveWithKeyboard() { // selecting first item of first menu every time. Also sierra sci didn't // allow mouse interaction, when menu was activated via keyboard. - calculateMenuAndItemWidth(); _oldPort = _ports->setPort(_ports->_menuPort); + calculateMenuAndItemWidth(); _barSaveHandle = _paint16->bitsSave(_ports->_menuRect, GFX_SCREEN_MASK_VISUAL); _ports->penColor(0); @@ -827,8 +827,8 @@ GuiMenuItemEntry *GfxMenu::interactiveWithMouse() { bool firstMenuChange = true; GuiMenuItemEntry *curItemEntry = NULL; - calculateMenuAndItemWidth(); _oldPort = _ports->setPort(_ports->_menuPort); + calculateMenuAndItemWidth(); _barSaveHandle = _paint16->bitsSave(_ports->_menuRect, GFX_SCREEN_MASK_VISUAL); _ports->penColor(0); -- cgit v1.2.3 From b7906e7feb33cf1b31433f9962bb02b393e1943e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 17:08:42 +0000 Subject: SCI: allow invalid handles in kDisplay calls, fixes pq3 intro signature mismatch svn-id: r50785 --- engines/sci/engine/kernel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2069b8ee80..2fb1452fa2 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -370,7 +370,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop - { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir]*)", NULL, NULL }, // subop + { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, + // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, -- cgit v1.2.3 From 790e9b0351a043d2d5e4c048a081f5f6ab24c9a9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 18:21:09 +0000 Subject: SCI: added signatures for kGraph, removed isDummy boolean from KernelFunction svn-id: r50786 --- engines/sci/engine/kernel.cpp | 67 +++++++++++++-- engines/sci/engine/kernel.h | 13 ++- engines/sci/engine/kgraphics.cpp | 178 +++++++++++++++++---------------------- engines/sci/engine/vm.cpp | 107 ++++++++++------------- 4 files changed, 197 insertions(+), 168 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2fb1452fa2..0fd21671a0 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -199,6 +199,41 @@ static const char *s_defaultKernelNames[] = { /*0x88*/ "Dummy" // DbugStr }; +reg_t kStub(EngineState *s, int argc, reg_t *argv) { + Kernel *kernel = g_sci->getKernel(); + int kernelCallNr = -1; + + Common::List::iterator callIterator = s->_executionStack.end(); + if (callIterator != s->_executionStack.begin()) { + callIterator--; + ExecStack lastCall = *callIterator; + kernelCallNr = lastCall.debugSelector; + } + + Common::String warningMsg = "Dummy function k" + kernel->getKernelName(kernelCallNr) + + Common::String::printf("[%x]", kernelCallNr) + + " invoked. Params: " + + Common::String::printf("%d", argc) + " ("; + + for (int i = 0; i < argc; i++) { + warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + warningMsg += (i == argc - 1 ? ")" : ", "); + } + + warning("%s", warningMsg.c_str()); + return s->r_acc; +} + +reg_t kStubNull(EngineState *s, int argc, reg_t *argv) { + kStub(s, argc, argv); + return NULL_REG; +} + +reg_t kDummy(EngineState *s, int argc, reg_t *argv) { + kStub(s, argc, argv); + error("Kernel function was called, which was considered to be unused - see log for details"); +} + // [io] -> either integer or object // (io) -> optionally integer AND an object // (i) -> optional integer @@ -308,6 +343,26 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +static const SciKernelMapSubEntry kGraph_subops[] = { + { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start + { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, + // 3 - set palette via resource + { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", NULL }, + // 5 - nop + // 6 - draw pattern + { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, + { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", NULL }, + // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same + { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, + { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", NULL }, + { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", NULL }, + { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r)", NULL }, + { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, + { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, + { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires + SCI_SUBOPENTRY_TERMINATOR +}; + static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, @@ -372,6 +427,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro + // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, @@ -417,9 +473,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", NULL, NULL }, // subop - // ^^ we allow invalid references here, because kGraph(restoreBox) gets called with old non-existant handles often - // this should get limited to this call only as soon as subop signatures are available + { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", kGraph_subops, NULL }, { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, @@ -1032,7 +1086,6 @@ void Kernel::mapFunctions() { _kernelFuncs[id].function = NULL; _kernelFuncs[id].signature = NULL; _kernelFuncs[id].name = NULL; - _kernelFuncs[id].isDummy = true; _kernelFuncs[id].workarounds = NULL; _kernelFuncs[id].subFunctions = NULL; _kernelFuncs[id].subFunctionCount = 0; @@ -1044,8 +1097,10 @@ void Kernel::mapFunctions() { } // Don't map dummy functions - they will never be called - if (kernelName == "Dummy") + if (kernelName == "Dummy") { + _kernelFuncs[id].function = kDummy; continue; + } // If the name is known, look it up in s_kernelMap. This table // maps kernel func names to actual function (pointers). @@ -1068,7 +1123,6 @@ void Kernel::mapFunctions() { _kernelFuncs[id].name = kernelMap->name; _kernelFuncs[id].signature = parseKernelSignature(kernelMap->name, kernelMap->signature); _kernelFuncs[id].workarounds = kernelMap->workarounds; - _kernelFuncs[id].isDummy = false; if (kernelMap->subFunctions) { // Get version for subfunction identification SciVersion mySubVersion = (SciVersion)kernelMap->function(NULL, 0, NULL).offset; @@ -1129,6 +1183,7 @@ void Kernel::mapFunctions() { error("k%s[%x]: not found for this version/platform", kernelName.c_str(), id); // No match but a name was given -> stub warning("k%s[%x]: unmapped", kernelName.c_str(), id); + _kernelFuncs[id].function = kStub; } } // for all functions requesting to be mapped diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 5815fec53b..a054aa2b1c 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -141,7 +141,6 @@ struct KernelSubFunction { }; struct KernelFunction { - bool isDummy; KernelFunctionCall *function; const char *name; uint16 *signature; @@ -491,6 +490,18 @@ reg_t kDoSoundSetVolume(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetPriority(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetLoop(EngineState *s, int argc, reg_t *argv); +reg_t kGraphGetColorCount(EngineState *s, int argc, reg_t *argv); +reg_t kGraphDrawLine(EngineState *s, int argc, reg_t *argv); +reg_t kGraphSaveBox(EngineState *s, int argc, reg_t *argv); +reg_t kGraphRestoreBox(EngineState *s, int argc, reg_t *argv); +reg_t kGraphFillBoxBackground(EngineState *s, int argc, reg_t *argv); +reg_t kGraphFillBoxForeground(EngineState *s, int argc, reg_t *argv); +reg_t kGraphFillBoxAny(EngineState *s, int argc, reg_t *argv); +reg_t kGraphUpdateBox(EngineState *s, int argc, reg_t *argv); +reg_t kGraphRedrawBox(EngineState *s, int argc, reg_t *argv); +reg_t kGraphAdjustPriority(EngineState *s, int argc, reg_t *argv); +reg_t kGraphSaveUpscaledHiresBox(EngineState *s, int argc, reg_t *argv); + reg_t kPalVaryInit(EngineState *s, int argc, reg_t *argv); reg_t kPalVaryReverse(EngineState *s, int argc, reg_t *argv); reg_t kPalVaryGetCurrentStep(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 9714374ade..0e7930275a 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -207,128 +207,108 @@ reg_t kPicNotValid(EngineState *s, int argc, reg_t *argv) { return make_reg(0, g_sci->_gfxScreen->kernelPicNotValid(newPicNotValid)); } -Common::Rect kGraphCreateRect(int16 x, int16 y, int16 x1, int16 y1) { +static Common::Rect getGraphRect(reg_t *argv) { + int16 x = argv[1].toSint16(); + int16 y = argv[0].toSint16(); + int16 x1 = argv[3].toSint16(); + int16 y1 = argv[2].toSint16(); if (x > x1) SWAP(x, x1); if (y > y1) SWAP(y, y1); return Common::Rect(x, y, x1, y1); } -// Graph subfunctions -enum { - K_GRAPH_GET_COLORS_NR = 2, - // 3 - SET PALETTE VIA RESOURCE - K_GRAPH_DRAW_LINE = 4, - // 5 - NOP - // 6 - DRAW PATTERN - K_GRAPH_SAVE_BOX = 7, - K_GRAPH_RESTORE_BOX = 8, - K_GRAPH_FILL_BOX_BACKGROUND = 9, - K_GRAPH_FILL_BOX_FOREGROUND = 10, - K_GRAPH_FILL_BOX_ANY = 11, - K_GRAPH_UPDATE_BOX = 12, - K_GRAPH_REDRAW_BOX = 13, - K_GRAPH_ADJUST_PRIORITY = 14, - K_GRAPH_SAVE_UPSCALEDHIRES_BOX = 15 // KQ6CD Windows version -}; +static Common::Point getGraphPoint(reg_t *argv) { + int16 x = argv[1].toSint16(); + int16 y = argv[0].toSint16(); + return Common::Point(x, y); +} reg_t kGraph(EngineState *s, int argc, reg_t *argv) { - int16 x = 0, y = 0, x1 = 0, y1 = 0; - uint16 screenMask; - int16 priority, control, color, colorMask; - Common::Rect rect; - - if (argc >= 5) { - x = argv[2].toSint16(); - y = argv[1].toSint16(); - x1 = argv[4].toSint16(); - y1 = argv[3].toSint16(); - } - - switch (argv[0].toSint16()) { - case 1: - // TODO: Happens in GK1CD, right when it starts - warning("Unsupported kGraph() operation %04x", argv[0].toSint16()); - // Returns an integer - return SIGNAL_REG; - - case K_GRAPH_GET_COLORS_NR: - if (g_sci->getResMan()->isAmiga32color()) - return make_reg(0, 32); - return make_reg(0, !g_sci->getResMan()->isVGA() ? 16 : 256); - - case K_GRAPH_DRAW_LINE: - priority = (argc > 6) ? argv[6].toSint16() : -1; - control = (argc > 7) ? argv[7].toSint16() : -1; - color = argv[5].toSint16(); - - // TODO: Find out why we get >15 for color in EGA - if (!g_sci->getResMan()->isVGA() && !g_sci->getResMan()->isAmiga32color()) - color &= 0x0F; + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} - g_sci->_gfxPaint16->kernelGraphDrawLine(Common::Point(x, y), Common::Point(x1, y1), color, priority, control); - break; +reg_t kGraphGetColorCount(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getResMan()->isAmiga32color()) + return make_reg(0, 32); + return make_reg(0, !g_sci->getResMan()->isVGA() ? 16 : 256); +} - case K_GRAPH_SAVE_BOX: - rect = kGraphCreateRect(x, y, x1, y1); - screenMask = (argc > 5) ? argv[5].toUint16() : 0; - return g_sci->_gfxPaint16->kernelGraphSaveBox(rect, screenMask); +reg_t kGraphDrawLine(EngineState *s, int argc, reg_t *argv) { + int16 color = argv[4].toSint16(); + int16 priority = (argc > 5) ? argv[5].toSint16() : -1; + int16 control = (argc > 6) ? argv[6].toSint16() : -1; - case K_GRAPH_RESTORE_BOX: - // This may be called with a memoryhandle from SAVE_BOX or SAVE_UPSCALEDHIRES_BOX - g_sci->_gfxPaint16->kernelGraphRestoreBox(argv[1]); - break; + // TODO: Find out why we get >15 for color in EGA + if (!g_sci->getResMan()->isVGA() && !g_sci->getResMan()->isAmiga32color()) + color &= 0x0F; - case K_GRAPH_FILL_BOX_BACKGROUND: - rect = kGraphCreateRect(x, y, x1, y1); - g_sci->_gfxPaint16->kernelGraphFillBoxBackground(rect); - break; + g_sci->_gfxPaint16->kernelGraphDrawLine(getGraphPoint(argv), getGraphPoint(argv + 2), color, priority, control); + return s->r_acc; +} - case K_GRAPH_FILL_BOX_FOREGROUND: - rect = kGraphCreateRect(x, y, x1, y1); - g_sci->_gfxPaint16->kernelGraphFillBoxForeground(rect); - break; +reg_t kGraphSaveBox(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + uint16 screenMask = (argc > 4) ? argv[4].toUint16() : 0; + return g_sci->_gfxPaint16->kernelGraphSaveBox(rect, screenMask); +} - case K_GRAPH_FILL_BOX_ANY: - priority = (argc > 7) ? argv[7].toSint16() : -1; - control = (argc > 8) ? argv[8].toSint16() : -1; - color = argv[6].toSint16(); - colorMask = argv[5].toUint16(); +reg_t kGraphRestoreBox(EngineState *s, int argc, reg_t *argv) { + // This may be called with a memoryhandle from SAVE_BOX or SAVE_UPSCALEDHIRES_BOX + g_sci->_gfxPaint16->kernelGraphRestoreBox(argv[0]); + return s->r_acc; +} - rect = kGraphCreateRect(x, y, x1, y1); - g_sci->_gfxPaint16->kernelGraphFillBox(rect, colorMask, color, priority, control); - break; +reg_t kGraphFillBoxBackground(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + g_sci->_gfxPaint16->kernelGraphFillBoxBackground(rect); + return s->r_acc; +} - case K_GRAPH_UPDATE_BOX: { - rect = kGraphCreateRect(x, y, x1, y1); - bool hiresMode = (argc > 6) ? true : false; - // arg5 is the map (1 for visual, etc.) - // argc == 7 on upscaled hires - g_sci->_gfxPaint16->kernelGraphUpdateBox(rect, hiresMode); - break; - } +reg_t kGraphFillBoxForeground(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + g_sci->_gfxPaint16->kernelGraphFillBoxForeground(rect); + return s->r_acc; +} - case K_GRAPH_REDRAW_BOX: - rect = kGraphCreateRect(x, y, x1, y1); - g_sci->_gfxPaint16->kernelGraphRedrawBox(rect); - break; +reg_t kGraphFillBoxAny(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + int16 colorMask = argv[4].toUint16(); + int16 color = argv[5].toSint16(); + int16 priority = (argc > 6) ? argv[6].toSint16() : -1; + int16 control = (argc > 7) ? argv[7].toSint16() : -1; - case K_GRAPH_ADJUST_PRIORITY: - // Seems to be only implemented for SCI0/SCI01 games - debugC(2, kDebugLevelGraphics, "adjust_priority(%d, %d)", argv[1].toUint16(), argv[2].toUint16()); - g_sci->_gfxPorts->kernelGraphAdjustPriority(argv[1].toUint16(), argv[2].toUint16()); - break; + g_sci->_gfxPaint16->kernelGraphFillBox(rect, colorMask, color, priority, control); + return s->r_acc; +} - case K_GRAPH_SAVE_UPSCALEDHIRES_BOX: - rect = kGraphCreateRect(x, y, x1, y1); - return g_sci->_gfxPaint16->kernelGraphSaveUpscaledHiresBox(rect); +reg_t kGraphUpdateBox(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + // argv[4] is the map (1 for visual, etc.) + // argc == 6 on upscaled hires + bool hiresMode = (argc > 5) ? true : false; + g_sci->_gfxPaint16->kernelGraphUpdateBox(rect, hiresMode); + return s->r_acc; +} - default: - error("Unsupported kGraph() operation %04x", argv[0].toSint16()); - } +reg_t kGraphRedrawBox(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + g_sci->_gfxPaint16->kernelGraphRedrawBox(rect); + return s->r_acc; +} +// Seems to be only implemented for SCI0/SCI01 games +reg_t kGraphAdjustPriority(EngineState *s, int argc, reg_t *argv) { + g_sci->_gfxPorts->kernelGraphAdjustPriority(argv[0].toUint16(), argv[1].toUint16()); return s->r_acc; } +reg_t kGraphSaveUpscaledHiresBox(EngineState *s, int argc, reg_t *argv) { + Common::Rect rect = getGraphRect(argv); + return g_sci->_gfxPaint16->kernelGraphSaveUpscaledHiresBox(rect); +} + reg_t kTextSize(EngineState *s, int argc, reg_t *argv) { int16 textWidth, textHeight; Common::String text = s->_segMan->getString(argv[1]); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a354491a83..cbfaf5575f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -800,50 +800,51 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { return; } - if (!kernelCall.isDummy) { - // Add stack frame to indicate we're executing a callk. - // This is useful in debugger backtraces if this - // kernel function calls a script itself. - ExecStack *xstack; - xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, - s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->debugSelector = kernelCallNr; - xstack->type = EXEC_STACK_TYPE_KERNEL; - - // Call kernel function - if (!kernelCall.subFunctionCount) { - s->r_acc = kernelCall.function(s, argc, argv); - } else { - // Sub-functions available, check signature and call that one directly - if (argc < 1) - error("[VM] k%s[%x]: no subfunction-id parameter given", kernelCall.name, kernelCallNr); - const uint16 subId = argv[0].toUint16(); - // Skip over subfunction-id - argc--; - argv++; - if (subId >= kernelCall.subFunctionCount) - error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); - const KernelSubFunction &kernelSubCall = kernelCall.subFunctions[subId]; - if (!kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { - // Signature mismatch - SciTrackOriginReply originReply; - reg_t workaround; - workaround = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); - if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { - kernel->signatureDebug(kernelSubCall.signature, argc, argv); - int callNameLen = strlen(kernelCall.name); - if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { - const char *subCallName = kernelSubCall.name + callNameLen; - error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); - } - error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + // Add stack frame to indicate we're executing a callk. + // This is useful in debugger backtraces if this + // kernel function calls a script itself. + ExecStack *xstack; + xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, + s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); + xstack->debugSelector = kernelCallNr; + xstack->type = EXEC_STACK_TYPE_KERNEL; + + // Call kernel function + if (!kernelCall.subFunctionCount) { + s->r_acc = kernelCall.function(s, argc, argv); + } else { + // Sub-functions available, check signature and call that one directly + if (argc < 1) + error("[VM] k%s[%x]: no subfunction-id parameter given", kernelCall.name, kernelCallNr); + const uint16 subId = argv[0].toUint16(); + // Skip over subfunction-id + argc--; + argv++; + if (subId >= kernelCall.subFunctionCount) + error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); + const KernelSubFunction &kernelSubCall = kernelCall.subFunctions[subId]; + if (kernelSubCall.signature && !kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { + // Signature mismatch + SciTrackOriginReply originReply; + reg_t workaround; + workaround = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); + if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { + kernel->signatureDebug(kernelSubCall.signature, argc, argv); + int callNameLen = strlen(kernelCall.name); + if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { + const char *subCallName = kernelSubCall.name + callNameLen; + error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } - // FIXME: implement some real workaround type logic - ignore call, still do call etc. - if (workaround.segment) - return; + error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } - s->r_acc = kernelSubCall.function(s, argc, argv); + // FIXME: implement some real workaround type logic - ignore call, still do call etc. + if (workaround.segment) + return; } + if (!kernelSubCall.function) + error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); + s->r_acc = kernelSubCall.function(s, argc, argv); + } #if 0 // Used for debugging @@ -861,27 +862,9 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { debug("%s", debugMsg.c_str()); #endif - // Remove callk stack frame again, if there's still an execution stack - if (s->_executionStack.begin() != s->_executionStack.end()) - s->_executionStack.pop_back(); - } else { - Common::String warningMsg = "Dummy function " + kernel->getKernelName(kernelCallNr) + - Common::String::printf("[0x%x]", kernelCallNr) + - " invoked - ignoring. Params: " + - Common::String::printf("%d", argc) + " ("; - - for (int i = 0; i < argc; i++) { - warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - warningMsg += (i == argc - 1 ? ")" : ", "); - } - - warning("%s", warningMsg.c_str()); - - // Make sure that the game doesn't call a function that is considered unused. If - // that happens, error out. - if (kernel->getKernelName(kernelCallNr) == "Dummy") - error("Kernel function %d was called, which was considered to be unused", kernelCallNr); - } + // Remove callk stack frame again, if there's still an execution stack + if (s->_executionStack.begin() != s->_executionStack.end()) + s->_executionStack.pop_back(); } static void gcCountDown(EngineState *s) { -- cgit v1.2.3 From a92a8d3c54f1a90c480bddc12d7f48c826bcd684 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 18:31:11 +0000 Subject: SCI: adding workaround for script error when leaving ulence flats bar in sq1 svn-id: r50787 --- engines/sci/engine/kernel.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 0fd21671a0..bb00f5903b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -247,6 +247,12 @@ static const SciWorkaroundEntry kDisposeScript_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // parameter 1 is not passed, script error when leaving ulence flats bar + SCI_WORKAROUNDENTRY_TERMINATOR +}; + struct SciKernelMapSubEntry { SciVersion fromVersion; SciVersion toVersion; @@ -552,8 +558,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, NULL }, - // ^^ - in SQ1 when leaving ulence flats bar, kUnLoad is called with just one argument (FIXME?) + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, kUnLoad_workarounds }, { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, -- cgit v1.2.3 From 8b112704b2e840c6b0f789d527c6bc79fcc9c7e9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 18:34:38 +0000 Subject: SCI: adding descriptive comments for subop-tables svn-id: r50788 --- engines/sci/engine/kernel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index bb00f5903b..4d5ee4aafe 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -294,6 +294,7 @@ struct SciKernelMapSubEntry { #define MAP_CALL(_name_) #_name_, k##_name_ +// version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, @@ -349,6 +350,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +// version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, @@ -369,6 +371,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +// version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, @@ -381,6 +384,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +// version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kPalette_subops[] = { { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, -- cgit v1.2.3 From 5c2489f1533067dcfe303496055e63e8c8d7c189 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 19:58:25 +0000 Subject: SCI: removing hoyle workaround from kAbs & signature and adding it into workaround table svn-id: r50790 --- engines/sci/engine/kernel.cpp | 11 +++++++++-- engines/sci/engine/kmath.cpp | 6 ------ engines/sci/engine/vm.cpp | 4 ++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 4d5ee4aafe..74b0502af4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -241,6 +241,14 @@ reg_t kDummy(EngineState *s, int argc, reg_t *argv) { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kAbs_workarounds[] = { + { GID_HOYLE1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard @@ -412,8 +420,7 @@ struct SciKernelMapEntry { // name, version/platform, signature, sub-signatures, workarounds static SciKernelMapEntry s_kernelMap[] = { - { MAP_CALL(Abs), SIG_EVERYWHERE, "[io]", NULL, NULL }, - // ^^ FIXME hoyle + { MAP_CALL(Abs), SIG_EVERYWHERE, "i", NULL, kAbs_workarounds }, { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index a7baf72b65..eab964d624 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -36,12 +36,6 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) { } reg_t kAbs(EngineState *s, int argc, reg_t *argv) { - if (g_sci->getGameId() == GID_HOYLE1) { - // This is a hack, but so is the code in Hoyle1 that needs it. - // FIXME: where is this exactly needed? - if (argv[0].segment) - return make_reg(0, 0x3e9); // Yes people, this is an object - } return make_reg(0, abs(argv[0].toSint16())); } diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index cbfaf5575f..4755db3922 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -796,6 +796,8 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. + if (workaround.segment == 2) + s->r_acc = make_reg(0, workaround.offset); if (workaround.segment) return; } @@ -838,6 +840,8 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. + if (workaround.segment == 2) + s->r_acc = make_reg(0, workaround.offset); if (workaround.segment) return; } -- cgit v1.2.3 From 5e4d4fde678e0fda0bd371770046208d7082b8c4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 20:45:59 +0000 Subject: SCI: adding workaround for kGraph(fillBoxAny) in sq4cd when accessing the game menu svn-id: r50791 --- engines/sci/engine/kernel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 74b0502af4..44062d70c0 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -255,6 +255,12 @@ static const SciWorkaroundEntry kDisposeScript_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { + { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // parameter 1 is not passed, script error when leaving ulence flats bar @@ -371,7 +377,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", NULL }, - { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", NULL }, + { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r)", NULL }, { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, -- cgit v1.2.3 From 09fd47236d82c169a0c2886f6baa752beb401a3d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 20:50:52 +0000 Subject: SCI: adding to execstack only right before executing kernel call, otherwise it wouldnt be possible to skip over sub-function kernel calls via workarounds svn-id: r50792 --- engines/sci/engine/vm.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4755db3922..b265170cad 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -776,6 +776,17 @@ static reg_t pointer_add(EngineState *s, reg_t base, int offset) { } } +static void addKernelCallToExecStack(EngineState *s, int kernelCallNr, int argc, reg_t *argv) { + // Add stack frame to indicate we're executing a callk. + // This is useful in debugger backtraces if this + // kernel function calls a script itself. + ExecStack *xstack; + xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, + s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); + xstack->debugSelector = kernelCallNr; + xstack->type = EXEC_STACK_TYPE_KERNEL; +} + static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { Kernel *kernel = g_sci->getKernel(); @@ -802,17 +813,10 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { return; } - // Add stack frame to indicate we're executing a callk. - // This is useful in debugger backtraces if this - // kernel function calls a script itself. - ExecStack *xstack; - xstack = add_exec_stack_entry(s->_executionStack, NULL_REG, NULL, NULL_REG, argc, argv - 1, 0, -1, -1, NULL_REG, - s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->debugSelector = kernelCallNr; - xstack->type = EXEC_STACK_TYPE_KERNEL; // Call kernel function if (!kernelCall.subFunctionCount) { + addKernelCallToExecStack(s, kernelCallNr, argc, argv); s->r_acc = kernelCall.function(s, argc, argv); } else { // Sub-functions available, check signature and call that one directly @@ -847,6 +851,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { } if (!kernelSubCall.function) error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); + addKernelCallToExecStack(s, kernelCallNr, argc, argv); s->r_acc = kernelSubCall.function(s, argc, argv); } -- cgit v1.2.3 From 5721b75205acd15053430f24e92b8f170478ced0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 21:47:37 +0000 Subject: SCI: fixing kGraph(updateBox) signature for kq6 hires/lowres (allowing null reference) svn-id: r50793 --- engines/sci/engine/kernel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 44062d70c0..7796f31047 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -378,7 +378,8 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", NULL }, { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, - { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r)", NULL }, + { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires + { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires -- cgit v1.2.3 From df6ead5f93758aa9871594fc3872930eaf9c9d60 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 10 Jul 2010 22:27:28 +0000 Subject: SCI: calling speed throttler as well from kPalette(setIntensity) if needed - fixes kq6 intro svn-id: r50794 --- engines/sci/engine/kmisc.cpp | 23 +---------------------- engines/sci/engine/state.cpp | 15 +++++++++++++++ engines/sci/engine/state.h | 1 + engines/sci/engine/vm.cpp | 3 +-- engines/sci/graphics/palette.cpp | 6 +++++- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 3d206d0358..1ed12c092e 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -67,28 +67,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { neededSleep = 60; } - if (s->_throttleTrigger) { - // Some games seem to get the duration of main loop initially and then - // switch of animations for the whole game based on that (qfg2, iceman). - // We are now running full speed initially to avoid that. - // It seems like we dont need to do that anymore - //if (s->_throttleCounter < 50) { - // s->_throttleCounter++; - // return s->r_acc; - //} - - uint32 curTime = g_system->getMillis(); - uint32 duration = curTime - s->_throttleLastTime; - - if (duration < neededSleep) { - g_sci->sleep(neededSleep - duration); - s->_throttleLastTime = g_system->getMillis(); - } else { - s->_throttleLastTime = curTime; - } - s->_throttleTrigger = false; - } - + s->speedThrottler(neededSleep); return s->r_acc; } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 6f54a3c199..245a021605 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -111,6 +111,21 @@ void EngineState::reset(bool isRestoring) { scriptGCInterval = GC_INTERVAL; } +void EngineState::speedThrottler(uint32 neededSleep) { + if (_throttleTrigger) { + uint32 curTime = g_system->getMillis(); + uint32 duration = curTime - _throttleLastTime; + + if (duration < neededSleep) { + g_sci->sleep(neededSleep - duration); + _throttleLastTime = g_system->getMillis(); + } else { + _throttleLastTime = curTime; + } + _throttleTrigger = false; + } +} + void EngineState::wait(int16 ticks) { uint32 time = g_system->getMillis(); r_acc = make_reg(0, ((long)time - (long)lastWaitTime) * 60 / 1000); diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 885c8a871c..e304c6d889 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -106,6 +106,7 @@ public: uint32 lastWaitTime; /**< The last time the game invoked Wait() */ uint32 _screenUpdateTime; /**< The last time the game updated the screen */ + void speedThrottler(uint32 neededSleep); void wait(int16 ticks); uint32 _throttleCounter; /**< total times kAnimate was invoked */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b265170cad..0dd82621fe 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -857,8 +857,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { #if 0 // Used for debugging - Common::String debugMsg = kernelFunc.origName + - Common::String::printf("[0x%x]", kernelFuncNr) + + Common::String debugMsg = Common::String::printf("%s [0x%x]", kernelCall.name, kernelCallNr) + Common::String::printf(", %d params: ", argc) + " ("; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index b85281e9c4..7e9dc0ed31 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -411,7 +411,11 @@ void GfxPalette::kernelSetIntensity(uint16 fromColor, uint16 toColor, uint16 int memset(&_sysPalette.intensity[0] + fromColor, intensity, toColor - fromColor); if (setPalette) { setOnScreen(); - g_sci->getEngineState()->_throttleTrigger = true; + EngineState *state = g_sci->getEngineState(); + // Call speed throttler from here as well just in case we need it + // At least in kq6 intro the scripts call us in a tight loop for fadein/fadeout + state->speedThrottler(30); + state->_throttleTrigger = true; } } -- cgit v1.2.3 From c77c84f5c52deb34930ed4e7f627ad672579c74c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 10:11:31 +0000 Subject: SCI: also sync palette after playing movies, fixes kq6 intro svn-id: r50798 --- engines/sci/engine/kgraphics.cpp | 4 +++- engines/sci/graphics/palette.cpp | 4 ++++ engines/sci/graphics/palette.h | 2 ++ engines/sci/graphics/screen.cpp | 14 +++++++++++++- engines/sci/graphics/screen.h | 3 ++- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 0e7930275a..13f2bd4875 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1192,8 +1192,10 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { // We also won't be copying the screen to the SCI screen... if (g_system->getScreenFormat().bytesPerPixel != 1) initGraphics(screenWidth, screenHeight, screenWidth > 320); - else + else { g_sci->_gfxScreen->kernelSyncWithFramebuffer(); + g_sci->_gfxPalette->kernelSyncScreenPalette(); + } } if (reshowCursor) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 7e9dc0ed31..957199f8b9 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -498,6 +498,10 @@ void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { } } +void GfxPalette::kernelSyncScreenPalette() { + _screen->getPalette(&_sysPalette); +} + // palVary // init - only does, if palVaryOn == false // target, start, new palette allocation diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 1fa8c16d26..6af1d5a490 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -65,6 +65,8 @@ public: void kernelAnimateSet(); void kernelAssertPalette(GuiResourceId resourceId); + void kernelSyncScreenPalette(); + bool kernelPalVaryInit(GuiResourceId resourceId, uint16 ticks, uint16 stepStop, uint16 direction); int16 kernelPalVaryReverse(int16 ticks, uint16 stepStop, int16 direction); int16 kernelPalVaryGetCurrentStep(); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 1d3a4ea1f7..488bb83ab3 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -499,7 +499,19 @@ void GfxScreen::bitsRestoreDisplayScreen(Common::Rect rect, byte *&memoryPtr) { } } -void GfxScreen::setPalette(Palette*pal) { +void GfxScreen::getPalette(Palette *pal) { + // just copy palette to system + byte bpal[4 * 256]; + // Get current palette, update it and put back + g_system->grabPalette(bpal, 0, 256); + for (int16 i = 1; i < 255; i++) { + pal->colors[i].r = bpal[i * 4]; + pal->colors[i].g = bpal[i * 4 + 1]; + pal->colors[i].b = bpal[i * 4 + 2]; + } +} + +void GfxScreen::setPalette(Palette *pal) { // just copy palette to system byte bpal[4 * 256]; // Get current palette, update it and put back diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 900c338bb2..f1e3d028a8 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -106,7 +106,8 @@ public: void bitsGetRect(byte *memoryPtr, Common::Rect *destRect); void bitsRestore(byte *memoryPtr); - void setPalette(Palette*pal); + void getPalette(Palette *pal); + void setPalette(Palette *pal); void setVerticalShakePos(uint16 shakePos); -- cgit v1.2.3 From 110d644f492ce624f70c62639b5fb01832022a58 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 11:12:03 +0000 Subject: SCI: adding workaround for signature mismatch for kDoSound(fade) in kq6 floppy/demo svn-id: r50799 --- engines/sci/engine/kernel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7796f31047..f3f0c37391 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -255,6 +255,12 @@ static const SciWorkaroundEntry kDisposeScript_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { + { GID_KQ6, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // parameter 4 is an object during the intro + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack @@ -351,7 +357,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", NULL }, + { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, -- cgit v1.2.3 From 38d79f60e3217debbf99c971a87ea581c00f007f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 11:52:17 +0000 Subject: SCI: changing signature for kDoSound(resume) it seems its called right after restoring to resume music - which we do already automatically svn-id: r50800 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/sound/soundcmd.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index f3f0c37391..9f6bab898f 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -323,7 +323,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, - { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "o", NULL }, + { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "", NULL }, { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", NULL }, diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 11b0215a32..51832af09f 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -251,6 +251,9 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { // SCI0 only command reg_t SoundCommandParser::kDoSoundResume(int argc, reg_t *argv, reg_t acc) { + // this doesn't seem to do what we think it's doing + // it's called with no arguments at all (just restore a game in qfg1) + return acc; reg_t obj = argv[0]; MusicEntry *musicSlot = _music->getSlot(obj); -- cgit v1.2.3 From 30a28ec107dc254d8db0d9361cd0d7d34a089ec2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 16:55:08 +0000 Subject: SCI: remove "a:" from default export hero quest 1 filename "a:hq1_hero.sav" svn-id: r50803 --- engines/sci/engine/kgraphics.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 13f2bd4875..e621e1b85a 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -790,6 +790,11 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { mode = readSelectorValue(s->_segMan, controlObject, SELECTOR(mode)); maxChars = readSelectorValue(s->_segMan, controlObject, SELECTOR(max)); cursorPos = readSelectorValue(s->_segMan, controlObject, SELECTOR(cursor)); + if (cursorPos > text.size()) { + // if cursor is outside of text, adjust accordingly + cursorPos = text.size(); + writeSelectorValue(s->_segMan, controlObject, SELECTOR(cursor), cursorPos); + } debugC(2, kDebugLevelGraphics, "drawing edit control %04x:%04x (text %04x:%04x, '%s') to %d,%d", PRINT_REG(controlObject), PRINT_REG(textReference), text.c_str(), x, y); g_sci->_gfxControls->kernelDrawTextEdit(rect, controlObject, g_sci->strSplit(text.c_str(), NULL).c_str(), fontId, mode, style, cursorPos, maxChars, hilite); return; @@ -880,6 +885,18 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { int state = readSelectorValue(s->_segMan, controlObject, SELECTOR(state)); writeSelectorValue(s->_segMan, controlObject, SELECTOR(state), (state | SCI_CONTROLS_STYLE_DISABLED) & ~SCI_CONTROLS_STYLE_ENABLED); } + if (objName == "DEdit") { + reg_t textReference = readSelector(s->_segMan, controlObject, SELECTOR(text)); + if (!textReference.isNull()) { + Common::String text = s->_segMan->getString(textReference); + if (text == "a:hq1_hero.sav") { + // Remove "a:" from hero quest export default filename + text.deleteChar(0); + text.deleteChar(0); + s->_segMan->strcpy(textReference, text.c_str()); + } + } + } _k_GenericDrawControl(s, controlObject, false); return NULL_REG; -- cgit v1.2.3 From 219a6627c25e4ee931e3afb1b70a0a4fe83c249d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 18:51:28 +0000 Subject: SCI: changing uninitialized workaround for lsl6 narrator svn-id: r50804 --- engines/sci/engine/vm.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 0dd82621fe..f4f8c07d48 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -312,7 +312,9 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w do { workaround = workaroundList; while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->inheritanceLevel == inheritanceLevel) && (workaround->objectName == searchObjectName) + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr + && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) + && (workaround->objectName == searchObjectName) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { // Workaround found return workaround->newValue; @@ -347,7 +349,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 928, 1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio -- cgit v1.2.3 From 737f2c0fa4b44033a1f6343d5ee700228b00d10d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 19:11:48 +0000 Subject: SCI: adding signature workaround for script error in lsl6 during intro, also changing comments of other workarounds svn-id: r50805 --- engines/sci/engine/kernel.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9f6bab898f..9006c6a646 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -243,34 +243,35 @@ reg_t kDummy(EngineState *s, int argc, reg_t *argv) { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_HOYLE1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // parameter 0 is an object when leaving graveyard - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // when leaving graveyard, parameter 0 is an object + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ6, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // parameter 4 is an object during the intro - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_KQ6, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // during intro, parameter 4 is an object + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // parameter 1 is not passed, script error when leaving ulence flats bar - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LSL6, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + SCI_WORKAROUNDENTRY_TERMINATOR }; struct SciKernelMapSubEntry { -- cgit v1.2.3 From a94b25f99cc29700770089982850eab9d11a3d87 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 19:16:16 +0000 Subject: SCI: kUnLoad - removing unneeded warnings (signature mismatch will happen now), added information about parameters svn-id: r50806 --- engines/sci/engine/kscripts.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 4a50553b34..029943b070 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -49,6 +49,8 @@ reg_t kLoad(EngineState *s, int argc, reg_t *argv) { } // Unloads an arbitrary resource of type 'restype' with resource numbber 'resnr' +// behaviour of this call didn't change between sci0->sci1.1 parameter wise, which means getting called with +// 1 or 3+ parameters is not right according to sierra sci reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { if (argc >= 2) { ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); @@ -64,11 +66,6 @@ reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { if (restype == kResourceTypeMemory) s->_segMan->freeHunkEntry(resnr); - - if (argc > 2) - warning("kUnload called with more than 2 parameters (%d)", argc); - } else { - warning("kUnload called with less than 2 parameters (%d) - ignoring", argc); } return s->r_acc; -- cgit v1.2.3 From 115d7d0132bd410f2e1f235740c3ead61de9458d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 11 Jul 2010 21:03:23 +0000 Subject: SCI: fix signature loading for subops, fixes kq6 signature mismatch svn-id: r50807 --- engines/sci/engine/kernel.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9006c6a646..a72c070d33 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -1180,27 +1180,29 @@ void Kernel::mapFunctions() { if ((kernelSubMap->fromVersion == SCI_VERSION_NONE) || (kernelSubMap->fromVersion <= mySubVersion)) if ((kernelSubMap->toVersion == SCI_VERSION_NONE) || (kernelSubMap->toVersion >= mySubVersion)) { uint subId = kernelSubMap->id; - subFunctions[subId].function = kernelSubMap->function; - subFunctions[subId].name = kernelSubMap->name; - subFunctions[subId].workarounds = kernelSubMap->workarounds; - if (kernelSubMap->signature) { - subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); - } else { - // we go back the submap to find the previous signature for that kernel call - const SciKernelMapSubEntry *kernelSubMapBack = kernelSubMap; - uint kernelSubLeft = kernelSubNr; - while (kernelSubLeft) { - kernelSubLeft--; - kernelSubMapBack--; - if (kernelSubMapBack->name == kernelSubMap->name) { - if (kernelSubMapBack->signature) { - subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMapBack->signature); - break; + if (!subFunctions[subId].function) { + subFunctions[subId].function = kernelSubMap->function; + subFunctions[subId].name = kernelSubMap->name; + subFunctions[subId].workarounds = kernelSubMap->workarounds; + if (kernelSubMap->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMap->signature); + } else { + // we go back the submap to find the previous signature for that kernel call + const SciKernelMapSubEntry *kernelSubMapBack = kernelSubMap; + uint kernelSubLeft = kernelSubNr; + while (kernelSubLeft) { + kernelSubLeft--; + kernelSubMapBack--; + if (kernelSubMapBack->name == kernelSubMap->name) { + if (kernelSubMapBack->signature) { + subFunctions[subId].signature = parseKernelSignature(kernelSubMap->name, kernelSubMapBack->signature); + break; + } } } + if (!subFunctions[subId].signature) + error("k%s: no previous signatures", kernelSubMap->name); } - if (!subFunctions[subId].signature) - error("k%s: no previous signatures", kernelSubMap->name); } } kernelSubMap++; -- cgit v1.2.3 From e3d48dc9c23d7cd090f8ba157710379db5a82b1c Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 11 Jul 2010 21:15:24 +0000 Subject: Update German translation. svn-id: r50808 --- common/messages.cpp | 4 ++-- po/de_DE.po | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index 01d9cc248e..82400ca995 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -1648,7 +1648,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-08 19:11+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1787,7 +1787,7 @@ static const PoMessageEntry _translation_de_DE[] = { { 136, "SMB einbinden" }, { 137, "Mausklick" }, { 138, "Multifunktion" }, - { 139, "GM-Ger\344t:" }, + { 139, "Musikger\344t:" }, { 140, "Musiklautst\344rke:" }, { 141, "Alles aus" }, { 142, "Name:" }, diff --git a/po/de_DE.po b/po/de_DE.po index d33dbb6856..1dac444868 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" "POT-Creation-Date: 2010-07-09 18:10+0100\n" -"PO-Revision-Date: 2010-07-08 19:11+0100\n" +"PO-Revision-Date: 2010-07-09 20:37+0100\n" "Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" @@ -487,9 +487,8 @@ msgid "Preferred Device:" msgstr "Standard-Gerät:" #: gui/options.cpp:645 -#, fuzzy msgid "Music Device:" -msgstr "GM-Gerät:" +msgstr "Musikgerät:" #: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" -- cgit v1.2.3 From 4c9ad98dfef2b643d14a6a55615e2a54e5822f70 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 08:38:30 +0000 Subject: SCI: returning 0 when parameter reads go out-of-bounds, onto the stack and hit an uninitialized temp, fixes pq2 .490 svn-id: r50812 --- engines/sci/engine/vm.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f4f8c07d48..ed839654bc 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -365,13 +365,25 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t default_value) { if (validate_variable(r, stack_base, type, max, index)) { - if (type == VAR_TEMP && r[index].segment == 0xffff) { - // Uninitialized read on a temp - // We need to find correct replacements for each situation manually - SciTrackOriginReply originReply; - r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); - if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF)) - error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + if (r[index].segment == 0xffff) { + switch (type) { + case VAR_TEMP: { + // Uninitialized read on a temp + // We need to find correct replacements for each situation manually + SciTrackOriginReply originReply; + r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); + if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF)) + error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + break; + } + case VAR_PARAM: + // Out-of-bounds read for a parameter that goes onto stack and hits an uninitialized temp + // We return 0 currently in that case + warning("Read for a parameter goes out-of-bounds, onto the stack and gets uninitialized temp"); + return NULL_REG; + default: + break; + } } return r[index]; } else -- cgit v1.2.3 From 101498e7701aec9240599122fd161c9b407f28f7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 08:59:43 +0000 Subject: SCI: adding 3 uninitialized temp workarounds for kq6 - found and created by Ceriand, thanx svn-id: r50813 --- engines/sci/engine/vm.cpp | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ed839654bc..1ed3acbace 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -340,27 +340,30 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts - { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room - { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is - { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) - { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts - { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts + { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts + { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room + { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is + { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) + { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast + { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs + { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts + { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu + SCI_WORKAROUNDENTRY_TERMINATOR }; static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t default_value) { -- cgit v1.2.3 From c1e954bdad96b7ae8e518e92aec365c7c26377bb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 09:24:18 +0000 Subject: SCI: add workaround for lsl6 restore issue (needs to get further investigated), hunk segment is used but hunk segment isn't existant at that point when restoring the game svn-id: r50814 --- engines/sci/engine/kernel.cpp | 15 +++++++++++++-- engines/sci/engine/vm.cpp | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index a72c070d33..c505d1916b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -261,6 +261,13 @@ static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { + { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 1, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + // ^^ TODO: check, if this is really a script error or an issue with our restore code + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack @@ -380,7 +387,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { // 5 - nop // 6 - draw pattern { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, - { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", NULL }, + { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", NULL }, @@ -504,7 +511,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, "i([!.]*)", kGraph_subops, NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, NULL, kGraph_subops, NULL }, { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, @@ -726,6 +733,10 @@ static uint16 *parseKernelSignature(const char *kernelName, const char *writtenS bool optional = false; bool hadOptional = false; + // No signature given? no signature out + if (!writtenSig) + return NULL; + // First, we check how many bytes the result will be // we also check, if the written signature makes any sense curPos = writtenSig; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1ed3acbace..32da080e43 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -839,6 +839,8 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { // Sub-functions available, check signature and call that one directly if (argc < 1) error("[VM] k%s[%x]: no subfunction-id parameter given", kernelCall.name, kernelCallNr); + if (argv[0].segment) + error("[VM] k%s[%x]: given subfunction-id is actually a pointer", kernelCall.name, kernelCallNr); const uint16 subId = argv[0].toUint16(); // Skip over subfunction-id argc--; -- cgit v1.2.3 From 21c91066202f58ca50ff26a7c543379c53045fba Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 10:31:32 +0000 Subject: SCI: added another workaround for lsl6 kGraph(restoreBox) svn-id: r50815 --- engines/sci/engine/kernel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index c505d1916b..e9b6787b05 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -263,8 +263,9 @@ static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 1, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code + { GID_LSL6, 86, 0, "LL6Inv", "hide", -1, 0, { 0, 0 } }, // happens during the game, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 698a347da6ceeecf922209709ac68eec9ce0e1d1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 10:47:47 +0000 Subject: SCI: adding another restore workaround for lsl6 svn-id: r50816 --- engines/sci/engine/kernel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index e9b6787b05..be727d6f45 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -263,6 +263,7 @@ static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { + { GID_LSL6, 85, 0, "lScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code { GID_LSL6, 86, 0, "LL6Inv", "hide", -1, 0, { 0, 0 } }, // happens during the game, gets called with 1 extra parameter -- cgit v1.2.3 From e782fec85aa48b8b32f4e1e1d3677411d99899ae Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 11:09:11 +0000 Subject: SCI: Remove dead code svn-id: r50817 --- engines/sci/engine/kernel.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index a054aa2b1c..fa206e8053 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -150,10 +150,6 @@ struct KernelFunction { bool debugCalls; }; -enum AutoDetectedFeatures { - kFeatureOldScriptHeader = 1 << 0 -}; - class Kernel { public: /** -- cgit v1.2.3 From 20ef5c562335e1f3fa45307b3f43065da0c4dfa4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 11:09:29 +0000 Subject: SCI: Fix warning svn-id: r50818 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index e621e1b85a..29f7565ef9 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -790,7 +790,7 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { mode = readSelectorValue(s->_segMan, controlObject, SELECTOR(mode)); maxChars = readSelectorValue(s->_segMan, controlObject, SELECTOR(max)); cursorPos = readSelectorValue(s->_segMan, controlObject, SELECTOR(cursor)); - if (cursorPos > text.size()) { + if (cursorPos > (int)text.size()) { // if cursor is outside of text, adjust accordingly cursorPos = text.size(); writeSelectorValue(s->_segMan, controlObject, SELECTOR(cursor), cursorPos); -- cgit v1.2.3 From ad098addd25891daf876a0ac21122d94920b2fcb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 11:20:42 +0000 Subject: SCI: adding uninitialized workaround for lsl6 svn-id: r50819 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 32da080e43..42f7424bf9 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -358,6 +358,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs + { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller -- cgit v1.2.3 From 8fa759adb3c9bcb3e8948b31d2deaabd9295dff6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 12:31:13 +0000 Subject: SCI: adding workaround for signature mismatch when giving merrily the key to the bungee tower svn-id: r50820 --- engines/sci/engine/kernel.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index be727d6f45..892e64a0e1 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -263,6 +263,7 @@ static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { + { GID_LSL6, 85, 0, "rScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below { GID_LSL6, 85, 0, "lScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code @@ -270,6 +271,12 @@ static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { + { GID_LSL6, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily - gets called with additional 5th parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack @@ -392,7 +399,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, - { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", NULL }, + { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", kGraphFillBoxForeground_workarounds }, { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, -- cgit v1.2.3 From ac268edafbcaec0dac36d895c71ae1d71ce615b4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 12 Jul 2010 15:50:23 +0000 Subject: Consistently use "MT-32" as short name of the Roland MT-32 in our GUI and credits files. svn-id: r50821 --- AUTHORS | 5 +- common/messages.cpp | 37 +++---- gui/credits.h | 5 +- gui/options.cpp | 2 +- po/ca_ES.po | 7 +- po/de_DE.po | 7 +- po/fr_FR.po | 306 ++++++++++++++++++++++------------------------------ po/hu_HU.po | 9 +- po/it_IT.po | 7 +- po/ru_RU.po | 11 +- po/scummvm.pot | 5 +- tools/credits.pl | 6 +- 12 files changed, 177 insertions(+), 230 deletions(-) diff --git a/AUTHORS b/AUTHORS index 4ce92a42e1..d85446a87d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -335,9 +335,6 @@ Other contributions Hungarian: Alex Bevilacqua - Italian: - Matteo Angelino - Russian: Eugene Sandulenko @@ -418,7 +415,7 @@ Other contributions Ravi I. - SCI0 sound resource specification Ruediger Hanke - Port to the MorphOS platform Rune Orsval - Configuration file editor - Rickard Lind - MT32->GM MIDI mapping magic, sound research + Rickard Lind - MT-32->GM MIDI mapping magic, sound research Rink Springer - Port to the DOS platform, several bug fixes Robey Pointer - Bug tracking system hosting Sergey Lapin - Port of Carl's type 2 decompression code diff --git a/common/messages.cpp b/common/messages.cpp index 82400ca995..fe87b5f642 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -128,8 +128,8 @@ static const char * const _messageIds[] = { /* 124 */ "MAME OPL emulator", /* 125 */ "MIDI", /* 126 */ "MIDI gain:", - /* 127 */ "MT-32 Emulator", - /* 128 */ "MT32 Device:", + /* 127 */ "MT-32 Device:", + /* 128 */ "MT-32 Emulator", /* 129 */ "Main screen scaling:", /* 130 */ "Map", /* 131 */ "Mass Add...", @@ -324,7 +324,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -451,8 +451,8 @@ static const PoMessageEntry _translation_ru_RU[] = { { 124, "\315\334\343\333\357\342\336\340 MAME OPL:" }, { 125, "MIDI" }, { 126, "\303\341\330\333\325\335\330\325 MIDI:" }, - { 127, "\315\334\343\333\357\342\336\340 MT-32" }, - { 128, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, + { 127, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, + { 128, "\315\334\343\333\357\342\336\340 MT-32" }, { 129, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" }, { 130, "\275\320\327\335\320\347\330\342\354" }, { 131, "\264\336\321. \334\335\336\323\336..." }, @@ -642,7 +642,7 @@ static const PoMessageEntry _translation_ru_RU[] = { }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-09 18:17+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-07-09 18:17+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: Francais\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -769,8 +769,8 @@ static const PoMessageEntry _translation_fr_FR[] = { { 124, "\311mulateur MAME OPL" }, { 125, "MIDI" }, { 126, "Gain MIDI:" }, - { 127, "\311mulateur MT-32" }, - { 128, "Sortie MT-32:" }, + { 127, "Sortie MT-32:" }, + { 128, "\311mulateur MT-32" }, { 129, "\311chelle de l'\351cran principal" }, { 130, "Affecter" }, { 131, "Ajout Massif..." }, @@ -960,7 +960,7 @@ static const PoMessageEntry _translation_fr_FR[] = { }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nLanguage: Italiano\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -1087,8 +1087,8 @@ static const PoMessageEntry _translation_it_IT[] = { { 124, "Emulatore OPL MAME" }, { 125, "MIDI" }, { 126, "Guadagno MIDI:" }, - { 127, "Emulatore MT-32" }, - { 128, "Disposit. MT32:" }, + { 127, "Disposit. MT32:" }, + { 128, "Emulatore MT-32" }, { 129, "Schermo principale:" }, { 130, "Mappa" }, { 131, "Agg. in massa..." }, @@ -1278,7 +1278,7 @@ static const PoMessageEntry _translation_it_IT[] = { }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nLanguage: Catalan\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1402,8 +1402,8 @@ static const PoMessageEntry _translation_ca_ES[] = { { 124, "Emulador OPL de MAME" }, { 125, "MIDI" }, { 126, "Guany MIDI:" }, - { 127, "Emulador de MT-32" }, - { 128, "Dispositiu MT32:" }, + { 127, "Dispositiu MT32:" }, + { 128, "Emulador de MT-32" }, { 129, "Escalat de la pantalla principal:" }, { 130, "Mapeja" }, { 131, "Addici\363 Massiva..." }, @@ -1590,7 +1590,7 @@ static const PoMessageEntry _translation_ca_ES[] = { }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1611,6 +1611,7 @@ static const PoMessageEntry _translation_hu_HU[] = { { 115, "Kulcsok" }, { 124, "AdLib vezet :" }, { 126, "MIDI nyeres\351g:" }, + { 127, "Zene mennyis\351g:" }, { 134, "Vegyes AdLib/MIDI m\363d" }, { 139, "Zene mennyis\351g:" }, { 140, "Zene mennyis\351g:" }, @@ -1648,7 +1649,7 @@ static const PoMessageEntry _translation_hu_HU[] = { }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-09 18:10+0100\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1775,8 +1776,8 @@ static const PoMessageEntry _translation_de_DE[] = { { 124, "MAME-OPL-Emulator" }, { 125, "MIDI" }, { 126, "MIDI-Lautst\344rke:" }, - { 127, "MT-32-Emulation" }, - { 128, "MT32-Ger\344t:" }, + { 127, "MT32-Ger\344t:" }, + { 128, "MT-32-Emulation" }, { 129, "Hauptbildschirm-Skalierung:" }, { 130, "Zuweisen" }, { 131, "Durchsuchen" }, diff --git a/gui/credits.h b/gui/credits.h index cf34150864..d8639da438 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -379,9 +379,6 @@ static const char *credits[] = { "C1""Hungarian", "C0""Alex Bevilacqua", "", -"C1""Italian", -"C0""Matteo Angelino", -"", "C1""Russian", "C0""Eugene Sandulenko", "", @@ -502,7 +499,7 @@ static const char *credits[] = { "C0""Rune Orsval", "C2""Configuration file editor", "C0""Rickard Lind", -"C2""MT32->GM MIDI mapping magic, sound research", +"C2""MT-32->GM MIDI mapping magic, sound research", "C0""Rink Springer", "C2""Port to the DOS platform, several bug fixes", "C0""Robey Pointer", diff --git a/gui/options.cpp b/gui/options.cpp index 1cdba06cd7..856eb668fa 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -645,7 +645,7 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _("Preferred Device:") : _("Music Device:"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator")); - _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); + _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT-32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); _mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup"); _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General MIDI output")); _gmDevicePopUp = new PopUpWidget(boss, prefix + "auPrefGmPopup"); diff --git a/po/ca_ES.po b/po/ca_ES.po index 8c185ace96..7905fbdf16 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" +"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Catalan\n" #: gui/about.cpp:96 #, c-format @@ -498,7 +498,8 @@ msgid "Specifies output sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" #: gui/options.cpp:648 -msgid "MT32 Device:" +#, fuzzy +msgid "MT-32 Device:" msgstr "Dispositiu MT32:" #: gui/options.cpp:648 diff --git a/po/de_DE.po b/po/de_DE.po index 1dac444868..4b3f493a03 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2010-07-09 20:37+0100\n" "Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" +"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 @@ -500,7 +500,8 @@ msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." #: gui/options.cpp:648 -msgid "MT32 Device:" +#, fuzzy +msgid "MT-32 Device:" msgstr "MT32-Gerät:" #: gui/options.cpp:648 diff --git a/po/fr_FR.po b/po/fr_FR.po index 3bc9878d00..d4e9e9f53c 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2010-07-09 18:17+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" +"Language: Francais\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:96 @@ -38,27 +38,18 @@ msgstr "Remonter" msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" -#: gui/browser.cpp:70 -#: gui/chooser.cpp:49 -#: gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 -#: gui/massadd.cpp:95 -#: gui/options.cpp:972 -#: gui/saveload.cpp:65 -#: gui/saveload.cpp:157 -#: gui/themebrowser.cpp:56 +#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Annuler" -#: gui/browser.cpp:71 -#: gui/chooser.cpp:50 -#: gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 msgid "Choose" msgstr "Choisir" -#: gui/GuiManager.cpp:102 -#: backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Fermer" @@ -66,13 +57,11 @@ msgstr "Fermer" msgid "Mouse click" msgstr "Clic de souris" -#: gui/GuiManager.cpp:108 -#: base/main.cpp:285 +#: gui/GuiManager.cpp:108 base/main.cpp:285 msgid "Display keyboard" msgstr "Afficher le clavier" -#: gui/GuiManager.cpp:111 -#: base/main.cpp:288 +#: gui/GuiManager.cpp:111 base/main.cpp:288 msgid "Remap keys" msgstr "Changer l'affectation des touches" @@ -80,12 +69,8 @@ msgstr "Changer l'affectation des touches" msgid "Map" msgstr "Affecter" -#: gui/KeysDialog.cpp:45 -#: gui/launcher.cpp:267 -#: gui/launcher.cpp:873 -#: gui/launcher.cpp:877 -#: gui/massadd.cpp:92 -#: gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -95,16 +80,12 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Selectionez une action et cliquez 'Affecter'" -#: gui/KeysDialog.cpp:83 -#: gui/KeysDialog.cpp:105 -#: gui/KeysDialog.cpp:144 +#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "Touche associée: %s" -#: gui/KeysDialog.cpp:85 -#: gui/KeysDialog.cpp:107 -#: gui/KeysDialog.cpp:146 +#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "Touche associée: aucune" @@ -129,17 +110,19 @@ msgstr "Jeu" msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 -#: gui/launcher.cpp:174 -msgid "Short game identifier used for referring to savegames and running the game from the command line" -msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande" +#: gui/launcher.cpp:173 gui/launcher.cpp:174 +msgid "" +"Short game identifier used for referring to savegames and running the game " +"from the command line" +msgstr "" +"ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu " +"depuis la ligne de commande" #: gui/launcher.cpp:177 msgid "Name:" msgstr "Nom:" -#: gui/launcher.cpp:177 -#: gui/launcher.cpp:178 +#: gui/launcher.cpp:177 gui/launcher.cpp:178 msgid "Full title of the game" msgstr "Nom complet du jeu" @@ -147,17 +130,16 @@ msgstr "Nom complet du jeu" msgid "Language:" msgstr "Langue:" -#: gui/launcher.cpp:181 -#: gui/launcher.cpp:182 -msgid "Language of the game. This will not turn your Spanish game version into English" -msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." +#: gui/launcher.cpp:181 gui/launcher.cpp:182 +msgid "" +"Language of the game. This will not turn your Spanish game version into " +"English" +msgstr "" +"Langue du jeu. Cela ne traduira pas en anglais par magie votre version " +"espagnole du jeu." -#: gui/launcher.cpp:183 -#: gui/launcher.cpp:194 -#: gui/options.cpp:80 -#: gui/options.cpp:617 -#: gui/options.cpp:627 -#: gui/options.cpp:943 +#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 +#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 #: sound/null.cpp:42 msgid "" msgstr "" @@ -166,20 +148,15 @@ msgstr "" msgid "Platform:" msgstr "Plateforme:" -#: gui/launcher.cpp:192 -#: gui/launcher.cpp:193 +#: gui/launcher.cpp:192 gui/launcher.cpp:193 msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 -#: gui/options.cpp:850 -#: gui/options.cpp:867 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 -#: gui/options.cpp:850 -#: gui/options.cpp:867 +#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 msgid "GFX" msgstr "GFX" @@ -187,8 +164,7 @@ msgstr "GFX" msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" -#: gui/launcher.cpp:213 -#: gui/options.cpp:873 +#: gui/launcher.cpp:213 gui/options.cpp:873 msgid "Audio" msgstr "Audio" @@ -196,8 +172,7 @@ msgstr "Audio" msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifiques à ce jeux" -#: gui/launcher.cpp:223 -#: gui/options.cpp:877 +#: gui/launcher.cpp:223 gui/options.cpp:877 msgid "Volume" msgstr "Volume" @@ -205,8 +180,7 @@ msgstr "Volume" msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" -#: gui/launcher.cpp:232 -#: gui/options.cpp:885 +#: gui/launcher.cpp:232 gui/options.cpp:885 msgid "MIDI" msgstr "MIDI" @@ -214,8 +188,7 @@ msgstr "MIDI" msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" -#: gui/launcher.cpp:244 -#: gui/options.cpp:891 +#: gui/launcher.cpp:244 gui/options.cpp:891 msgid "Paths" msgstr "Chemins" @@ -223,13 +196,11 @@ msgstr "Chemins" msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 -#: gui/options.cpp:904 +#: gui/launcher.cpp:254 gui/options.cpp:904 msgid "Extra Path:" msgstr "Extra:" -#: gui/launcher.cpp:254 -#: gui/launcher.cpp:255 +#: gui/launcher.cpp:254 gui/launcher.cpp:255 msgid "Specifies path to additional data used the game" msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu" @@ -237,49 +208,31 @@ msgstr "D msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 -#: gui/launcher.cpp:259 -#: gui/options.cpp:898 +#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 #: gui/options.cpp:899 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" -#: gui/launcher.cpp:275 -#: gui/launcher.cpp:353 -#: gui/launcher.cpp:398 -#: gui/options.cpp:245 -#: gui/options.cpp:400 -#: gui/options.cpp:486 -#: gui/options.cpp:545 -#: gui/options.cpp:706 -#: gui/options.cpp:902 -#: gui/options.cpp:905 -#: gui/options.cpp:909 -#: gui/options.cpp:996 -#: gui/options.cpp:1002 -#: gui/options.cpp:1008 -#: gui/options.cpp:1016 -#: gui/options.cpp:1040 -#: gui/options.cpp:1044 -#: gui/options.cpp:1050 -#: gui/options.cpp:1057 -#: gui/options.cpp:1156 +#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 +#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 +#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 +#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 +#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 +#: gui/options.cpp:1057 gui/options.cpp:1156 msgid "None" msgstr "Aucun" -#: gui/launcher.cpp:280 -#: gui/launcher.cpp:357 +#: gui/launcher.cpp:280 gui/launcher.cpp:357 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 -#: gui/options.cpp:1150 +#: gui/launcher.cpp:391 gui/options.cpp:1150 msgid "Select SoundFont" msgstr "Choisir une banque de sons" -#: gui/launcher.cpp:410 -#: gui/launcher.cpp:548 +#: gui/launcher.cpp:410 gui/launcher.cpp:548 msgid "Select directory with game data" msgstr "Sélectionner le répertoire contenant les données du jeu" @@ -295,8 +248,7 @@ msgstr "S msgid "This game ID is already taken. Please choose another one." msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." -#: gui/launcher.cpp:500 -#: engines/dialogs.cpp:113 +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~Q~uitter" @@ -342,7 +294,8 @@ msgstr "~A~jouter..." #: gui/launcher.cpp:511 msgid "Hold Shift for Mass Add" -msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" +msgstr "" +"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" #: gui/launcher.cpp:513 msgid "~E~dit Game..." @@ -364,34 +317,33 @@ msgstr "Supprime le jeu de la liste. Les fichiers sont conserv msgid "Search in game list" msgstr "Recherche dans la liste de jeux" -#: gui/launcher.cpp:526 -#: gui/launcher.cpp:1037 +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 -#: gui/options.cpp:707 +#: gui/launcher.cpp:529 gui/options.cpp:707 msgid "Clear value" msgstr "Effacer la valeur" -#: gui/launcher.cpp:551 -#: engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Charger le jeu:" -#: gui/launcher.cpp:551 -#: engines/dialogs.cpp:117 +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Charger" #: gui/launcher.cpp:660 -msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." -msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut " +"potentiellement ajouter un grand nombre de jeux." -#: gui/launcher.cpp:661 -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -399,8 +351,7 @@ msgstr "Voulez-vous vraiment lancer la d msgid "Yes" msgstr "Oui" -#: gui/launcher.cpp:661 -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:661 gui/launcher.cpp:810 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -426,7 +377,8 @@ msgstr "Voulez-vous vraiment supprimer ce jeu?" #: gui/launcher.cpp:873 msgid "This game does not support loading games from the launcher." -msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." +msgstr "" +"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." #: gui/launcher.cpp:877 msgid "ScummVM could not find any engine capable of running the selected game!" @@ -440,8 +392,7 @@ msgstr "Ajout Massif..." msgid "Add Game..." msgstr "Ajouter..." -#: gui/massadd.cpp:79 -#: gui/massadd.cpp:82 +#: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." msgstr "... en cours ..." @@ -512,8 +463,7 @@ msgstr "Mode graphique:" msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:625 -#: gui/options.cpp:626 +#: gui/options.cpp:625 gui/options.cpp:626 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" @@ -539,20 +489,24 @@ msgstr "Sortie Audio:" #: gui/options.cpp:645 msgid "Specifies preferred sound device or sound card emulator" -msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio préféré" +msgstr "" +"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " +"préféré" -#: gui/options.cpp:645 -#: gui/options.cpp:646 +#: gui/options.cpp:645 gui/options.cpp:646 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" #: gui/options.cpp:648 -msgid "MT32 Device:" +#, fuzzy +msgid "MT-32 Device:" msgstr "Sortie MT-32:" #: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" +msgstr "" +"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" +"CM32l/CM64" #: gui/options.cpp:650 msgid "GM Device:" @@ -566,8 +520,7 @@ msgstr "Sp msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:682 -#: gui/options.cpp:683 +#: gui/options.cpp:682 gui/options.cpp:683 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" @@ -575,19 +528,23 @@ msgstr "AdLib est utilis msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:693 -#: gui/options.cpp:694 -msgid "Higher value specifies better sound quality but may be not supported by your soundcard" -msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son" +#: gui/options.cpp:693 gui/options.cpp:694 +msgid "" +"Higher value specifies better sound quality but may be not supported by your " +"soundcard" +msgstr "" +"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " +"être supporté par votre carte son" #: gui/options.cpp:705 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:705 -#: gui/options.cpp:706 +#: gui/options.cpp:705 gui/options.cpp:706 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" -msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity" +msgstr "" +"La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " +"Timidity" #: gui/options.cpp:710 msgid "Mixed AdLib/MIDI mode" @@ -602,8 +559,12 @@ msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" #: gui/options.cpp:713 -msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" -msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur" +msgid "" +"Check if you want to use your real hardware Roland-compatible sound device " +"connected to your computer" +msgstr "" +"Vérifie si vous voulez utiliser un périphérique audio compatible Roland " +"connecté à l'ordinateur" #: gui/options.cpp:716 msgid "Enable Roland GS Mode" @@ -621,18 +582,15 @@ msgstr "Gain MIDI:" msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:737 -#: gui/options.cpp:743 +#: gui/options.cpp:737 gui/options.cpp:743 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:738 -#: gui/options.cpp:744 +#: gui/options.cpp:738 gui/options.cpp:744 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:739 -#: gui/options.cpp:745 +#: gui/options.cpp:739 gui/options.cpp:745 msgid "Both" msgstr "Les deux" @@ -664,8 +622,7 @@ msgstr "Silence" msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:771 -#: gui/options.cpp:772 +#: gui/options.cpp:771 gui/options.cpp:772 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" @@ -681,10 +638,11 @@ msgstr "Sauvegardes:" msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:904 -#: gui/options.cpp:905 +#: gui/options.cpp:904 gui/options.cpp:905 msgid "Specifies path to additional data used by all games or ScummVM" -msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM" +msgstr "" +"Spécifie un chemin vers des données supplémentaires utilisées par tous les " +"jeux ou ScummVM" #: gui/options.cpp:908 msgid "Plugins Path:" @@ -724,7 +682,8 @@ msgstr "Anglais" #: gui/options.cpp:1089 msgid "You have to restart ScummVM to take the effect." -msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte." +msgstr "" +"Vous devez relancer ScummVM pour que le changement soit pris en compte." #: gui/options.cpp:1102 msgid "Select directory for savegames" @@ -732,7 +691,9 @@ msgstr "S #: gui/options.cpp:1109 msgid "The chosen directory cannot be written to. Please select another one." -msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire." +msgstr "" +"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " +"répertoire." #: gui/options.cpp:1118 msgid "Select directory for GUI themes" @@ -746,23 +707,19 @@ msgstr "S msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" -#: gui/saveload.cpp:60 -#: gui/saveload.cpp:241 +#: gui/saveload.cpp:60 gui/saveload.cpp:241 msgid "No date saved" msgstr "Date non sauvée" -#: gui/saveload.cpp:61 -#: gui/saveload.cpp:242 +#: gui/saveload.cpp:61 gui/saveload.cpp:242 msgid "No time saved" msgstr "Heure non sauvée" -#: gui/saveload.cpp:62 -#: gui/saveload.cpp:243 +#: gui/saveload.cpp:62 gui/saveload.cpp:243 msgid "No playtime saved" msgstr "Durée de jeu non sauvée" -#: gui/saveload.cpp:69 -#: gui/saveload.cpp:157 +#: gui/saveload.cpp:69 gui/saveload.cpp:157 msgid "Delete" msgstr "Supprimer" @@ -782,8 +739,7 @@ msgstr "Heure:" msgid "Playtime: " msgstr "Durée de jeu:" -#: gui/saveload.cpp:286 -#: gui/saveload.cpp:353 +#: gui/saveload.cpp:286 gui/saveload.cpp:353 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" @@ -812,15 +768,13 @@ msgstr "Le niveau de debug '%s' n'est pas support msgid "Menu" msgstr "Menu" -#: base/main.cpp:276 -#: backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Passer" -#: base/main.cpp:279 -#: backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Mettre en pause" @@ -833,8 +787,7 @@ msgstr "Passer la phrase" msgid "Error running game:" msgstr "Erreur lors de l'éxécution du jeu:" -#: base/main.cpp:430 -#: base/main.cpp:431 +#: base/main.cpp:430 base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné" @@ -886,8 +839,7 @@ msgstr "Echec de la lecture" msgid "Writing data failed" msgstr "Echec de l'écriture des données" -#: common/error.cpp:60 -#: common/error.cpp:71 +#: common/error.cpp:60 common/error.cpp:71 msgid "Unknown Error" msgstr "Erreur inconnue" @@ -931,8 +883,7 @@ msgstr "Retour au ~L~anceur" msgid "Save game:" msgstr "Sauvegarde:" -#: engines/dialogs.cpp:119 -#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 #: backends/platform/wince/CEActionsPocket.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:44 @@ -940,14 +891,12 @@ msgstr "Sauvegarde:" msgid "Save" msgstr "Sauver" -#: engines/dialogs.cpp:301 -#: engines/mohawk/dialogs.cpp:84 +#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 -#: engines/mohawk/dialogs.cpp:85 +#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 #: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "~A~nnuler" @@ -969,8 +918,7 @@ msgstr "~S~uivant" msgid "~C~lose" msgstr "~F~ermer" -#: engines/mohawk/dialogs.cpp:81 -#: engines/mohawk/dialogs.cpp:115 +#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip Activé" @@ -1242,13 +1190,11 @@ msgstr "Acceleration du pad GC:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 -#: backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 -#: backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Inconue" @@ -1458,8 +1404,8 @@ msgstr "Voulez-vous ex #~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" #~ msgstr "" -#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%" -#~ "s', chemin '%s')" +#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible " +#~ "'%s', chemin '%s')" #~ msgid "Ok" #~ msgstr "Ok" diff --git a/po/hu_HU.po b/po/hu_HU.po index 90cc469177..1d9a6c3268 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gui/about.cpp:96 @@ -493,8 +493,9 @@ msgid "Specifies output sound device or sound card emulator" msgstr "" #: gui/options.cpp:648 -msgid "MT32 Device:" -msgstr "" +#, fuzzy +msgid "MT-32 Device:" +msgstr "Zene mennyiség:" #: gui/options.cpp:648 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" diff --git a/po/it_IT.po b/po/it_IT.po index a133d7009b..bbe6e92e95 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2010-06-30 23:56+0100\n" "Last-Translator: Maff \n" "Language-Team: Italian\n" +"Language: Italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -"Language: Italiano\n" #: gui/about.cpp:96 #, c-format @@ -499,7 +499,8 @@ msgstr "" "Specifica il dispositivo di output audio o l'emulatore della scheda audio" #: gui/options.cpp:648 -msgid "MT32 Device:" +#, fuzzy +msgid "MT-32 Device:" msgstr "Disposit. MT32:" #: gui/options.cpp:648 diff --git a/po/ru_RU.po b/po/ru_RU.po index 46d5189e0b..2d4a96b63c 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,16 +7,16 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" -"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:96 #, c-format @@ -496,7 +496,8 @@ msgid "Specifies output sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" #: gui/options.cpp:648 -msgid "MT32 Device:" +#, fuzzy +msgid "MT-32 Device:" msgstr "ÃáâàÞÙáâÒÞ MT32:" #: gui/options.cpp:648 diff --git a/po/scummvm.pot b/po/scummvm.pot index d150834f60..6fe4989982 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-09 18:10+0100\n" +"POT-Creation-Date: 2010-07-12 17:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -487,7 +488,7 @@ msgid "Specifies output sound device or sound card emulator" msgstr "" #: gui/options.cpp:648 -msgid "MT32 Device:" +msgid "MT-32 Device:" msgstr "" #: gui/options.cpp:648 diff --git a/tools/credits.pl b/tools/credits.pl index 6109969834..0a41d34b10 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -944,7 +944,7 @@ begin_credits("Credits"); add_person("Ravi I.", "", "SCI0 sound resource specification"); add_person("Ruediger Hanke", "", "Port to the MorphOS platform"); add_person("Rune Orsval", "", "Configuration file editor"); - add_person("Rickard Lind", "", "MT32->GM MIDI mapping magic, sound research"); + add_person("Rickard Lind", "", "MT-32->GM MIDI mapping magic, sound research"); add_person("Rink Springer", "", "Port to the DOS platform, several bug fixes"); add_person("Robey Pointer", "", "Bug tracking system hosting"); add_person("Sergey Lapin", "", "Port of Carl's type 2 decompression code"); @@ -955,8 +955,8 @@ begin_credits("Credits"); add_person("Sean Terrell", "", ""); end_persons(); add_paragraph("Special thanks to Prof. Dr. Gary Nutt ". - "for allowing the FreeSCI VM extension as a ". - "course project in his Advanced OS course."); + "for allowing the FreeSCI VM extension as a ". + "course project in his Advanced OS course."); add_paragraph("Special thanks to Bob Heitman and Corey Cole for their support of FreeSCI."); end_section(); -- cgit v1.2.3 From 9644e7fe5f3d152b0f57b18cc5d452094280bdda Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 12 Jul 2010 15:50:48 +0000 Subject: Properly add Matteo Angelino to our credits for his Italian translation. svn-id: r50822 --- AUTHORS | 3 +++ gui/credits.h | 3 +++ tools/credits.pl | 3 +++ 3 files changed, 9 insertions(+) diff --git a/AUTHORS b/AUTHORS index d85446a87d..528674d59f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -335,6 +335,9 @@ Other contributions Hungarian: Alex Bevilacqua + Italian: + Matteo Angelino + Russian: Eugene Sandulenko diff --git a/gui/credits.h b/gui/credits.h index d8639da438..ae658e1196 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -379,6 +379,9 @@ static const char *credits[] = { "C1""Hungarian", "C0""Alex Bevilacqua", "", +"C1""Italian", +"C0""Matteo Angelino", +"", "C1""Russian", "C0""Eugene Sandulenko", "", diff --git a/tools/credits.pl b/tools/credits.pl index 0a41d34b10..0233a33831 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -872,6 +872,9 @@ begin_credits("Credits"); begin_section("Hungarian"); add_person("Alex Bevilacqua", "", ""); end_section(); + begin_section("Italian"); + add_person("Matteo Angelino", "", ""); + end_section(); begin_section("Russian"); add_person("Eugene Sandulenko", "sev", ""); end_section(); -- cgit v1.2.3 From 9522e68f76e707adb397d0dd37b25bdd1f16eff5 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 12 Jul 2010 15:53:24 +0000 Subject: Whops. Also now properly add Matteo's nickname to our credits. svn-id: r50824 --- tools/credits.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/credits.pl b/tools/credits.pl index 0233a33831..02a42c12cc 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -873,7 +873,7 @@ begin_credits("Credits"); add_person("Alex Bevilacqua", "", ""); end_section(); begin_section("Italian"); - add_person("Matteo Angelino", "", ""); + add_person("Matteo Angelino", "Maff", ""); end_section(); begin_section("Russian"); add_person("Eugene Sandulenko", "sev", ""); -- cgit v1.2.3 From 8364b0bd29ddcf68cfc9ee53d09eb326703347e9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 17:50:36 +0000 Subject: SCI: adding kUnLoad workaround for lsl6 (during end kUnLoad is called with additional 4 parameters, someone thought the API would work differently) svn-id: r50826 --- engines/sci/engine/kernel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 892e64a0e1..6eedc06023 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -286,6 +286,7 @@ static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during end, intro, a 4 additional parameters are passed by accident { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 535dbb7f59afe1c0d4576ada41c73cf07632b133 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 18:22:24 +0000 Subject: SCI: fixing typo svn-id: r50827 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 6eedc06023..beb1d3ce35 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -286,7 +286,7 @@ static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during end, intro, a 4 additional parameters are passed by accident + { GID_LSL6, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 0c42441426a6ade7cf659847dbffb24a63780de8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 19:41:26 +0000 Subject: SCI: added TODO for saved games svn-id: r50828 --- engines/sci/engine/kfile.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 69b80ce7ce..1b9b55c5c8 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -438,6 +438,9 @@ reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) { return make_reg(0, 1); } +// TODO: we need NOT to assign our own ids to saved-games, but use the filename-id and pass that to the scripts +// LSL6 is using the last used saved-game-id for quicksaving and this won't match correctly otherwise + reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) { Common::String game_id = s->_segMan->getString(argv[0]); uint16 savedir_nr = argv[1].toUint16(); -- cgit v1.2.3 From d52a872724d779b12385aab2925a6b8b7bfcedb4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 19:55:42 +0000 Subject: SCI: changing gameid of lsl6 sci2.1 into "lsl6hires". We need to keep workarounds etc. separate, scripts are not compatible svn-id: r50829 --- engines/sci/detection.cpp | 2 ++ engines/sci/detection_tables.h | 6 +++--- engines/sci/sci.h | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 0932cb3fdc..eb2c989e0d 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -105,6 +105,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = { // TODO: Inside The Chest/Behind the Developer's Shield {"kq7", "King's Quest VII: The Princeless Bride"}, // TODO: King's Questions + {"lsl6hires", "Leisure Suit Larry 6: Shape Up or Slip Out!"}, {"phantasmagoria", "Phantasmagoria"}, {"pqswat", "Police Quest: SWAT"}, {"shivers", "Shivers"}, @@ -164,6 +165,7 @@ static const GameIdStrToEnum s_gameIdStrToEnum[] = { { "lsl3", GID_LSL3 }, { "lsl5", GID_LSL5 }, { "lsl6", GID_LSL6 }, + { "lsl6hires", GID_LSL6HIRES }, { "lsl7", GID_LSL7 }, { "mothergoose", GID_MOTHERGOOSE }, { "msastrochicken", GID_MSASTROCHICKEN }, diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index e761b64991..aa1e26e0f4 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1684,7 +1684,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { #ifdef ENABLE_SCI32 // Larry 6 - English/German DOS CD - HIRES // SCI interpreter version 2.100.002 - {"lsl6", "", { + {"lsl6hires", "", { {"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872}, {"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872}, {NULL, 0, NULL, 0}}, @@ -1692,7 +1692,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691) // SCI interpreter version 2.100.002 - {"lsl6", "", { + {"lsl6hires", "", { {"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274}, {NULL, 0, NULL, 0}}, @@ -1700,7 +1700,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691) // SCI interpreter version 2.100.002 - {"lsl6", "", { + {"lsl6hires", "", { {"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987}, {NULL, 0, NULL, 0}}, diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 8f7205ea7a..4ba6755967 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -139,6 +139,7 @@ enum SciGameId { GID_LSL3, GID_LSL5, GID_LSL6, + GID_LSL6HIRES, // We have a separate ID for LSL6 SCI32, because it's actually a completely different game GID_LSL7, GID_MOTHERGOOSE, GID_MSASTROCHICKEN, -- cgit v1.2.3 From 8d7bc0eab5b8987829fb78690f0034283e98b549 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 12 Jul 2010 20:17:42 +0000 Subject: Some documentation fixes. svn-id: r50830 --- common/events.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/events.h b/common/events.h index 24c9a23728..3c4f6e8d1c 100644 --- a/common/events.h +++ b/common/events.h @@ -201,13 +201,14 @@ public: * Notifies the observer of an incoming event. * * An observer is supposed to eat the event, with returning true, when - * it might want prevent other observers from preventing to receive - * the event. An usage example here is the keymapper: + * it wants to prevent other observers from receiving the event. + * An usage example here is the keymapper: * If it processes an Event, it should 'eat' it and create a new * event, which the EventDispatcher will then catch. * - * @param event the event, which is incoming. - * @return true if this observer uses this event, false otherwise. + * @param event the event, which is incoming. + * @return true if the event should not be passed to other observers, + * false otherwise. */ virtual bool notifyEvent(const Event &event) = 0; }; -- cgit v1.2.3 From 6ff4dd2d91d5fe05495bec81a91e5c40ccd9b8be Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 12 Jul 2010 22:26:48 +0000 Subject: SCI: changing how savegame ids are handled internally. Using range 0-999 so that scripts are able to signal us to create new slots, using range 1000-1999 for official slots. fixes lsl6 quicksave overwriting wrong save slots svn-id: r50831 --- engines/sci/engine/kfile.cpp | 285 ++++++++++++++++++++++++------------------- engines/sci/engine/state.cpp | 3 + engines/sci/engine/state.h | 14 +++ engines/sci/engine/vm.cpp | 4 +- 4 files changed, 178 insertions(+), 128 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 1b9b55c5c8..807edc63a5 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -36,12 +36,9 @@ namespace Sci { -enum { - MAX_SAVEGAME_NR = 20 /**< Maximum number of savegames */ -}; - struct SavegameDesc { - int id; + uint id; + int virtualId; // straight numbered, according to id but w/o gaps int date; int time; int version; @@ -249,66 +246,6 @@ static void fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) { debugC(2, kDebugLevelFile, " -> FGets'ed \"%s\"", dest); } -static bool _savegame_index_struct_compare(const SavegameDesc &l, const SavegameDesc &r) { - if (l.date != r.date) - return (l.date > r.date); - return (l.time > r.time); -} - -void listSavegames(Common::Array &saves) { - Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); - - // Load all saves - Common::StringArray saveNames = saveFileMan->listSavefiles(g_sci->getSavegamePattern()); - - for (Common::StringArray::const_iterator iter = saveNames.begin(); iter != saveNames.end(); ++iter) { - Common::String filename = *iter; - Common::SeekableReadStream *in; - if ((in = saveFileMan->openForLoading(filename))) { - SavegameMetadata meta; - if (!get_savegame_metadata(in, &meta) || meta.savegame_name.empty()) { - // invalid - delete in; - continue; - } - delete in; - - SavegameDesc desc; - desc.id = strtol(filename.end() - 3, NULL, 10); - desc.date = meta.savegame_date; - // We need to fix date in here, because we save DDMMYYYY instead of - // YYYYMMDD, so sorting wouldn't work - desc.date = ((desc.date & 0xFFFF) << 16) | ((desc.date & 0xFF0000) >> 8) | ((desc.date & 0xFF000000) >> 24); - desc.time = meta.savegame_time; - desc.version = meta.savegame_version; - - if (meta.savegame_name.lastChar() == '\n') - meta.savegame_name.deleteLastChar(); - - Common::strlcpy(desc.name, meta.savegame_name.c_str(), SCI_MAX_SAVENAME_LENGTH); - - debug(3, "Savegame in file %s ok, id %d", filename.c_str(), desc.id); - - saves.push_back(desc); - } - } - - // Sort the list by creation date of the saves - Common::sort(saves.begin(), saves.end(), _savegame_index_struct_compare); -} - -bool Console::cmdListSaves(int argc, const char **argv) { - Common::Array saves; - listSavegames(saves); - - for (uint i = 0; i < saves.size(); i++) { - Common::String filename = g_sci->getSavegameName(saves[i].id); - DebugPrintf("%s: '%s'\n", filename.c_str(), saves[i].name); - } - - return true; -} - reg_t kFGets(EngineState *s, int argc, reg_t *argv) { int maxsize = argv[1].toUint16(); char *buf = new char[maxsize]; @@ -334,6 +271,9 @@ reg_t kGetCWD(EngineState *s, int argc, reg_t *argv) { return argv[0]; } +static void listSavegames(Common::Array &saves); +static int findSavegame(Common::Array &saves, uint saveId); + enum { K_DEVICE_INFO_GET_DEVICE = 0, K_DEVICE_INFO_GET_CURRENT_DEVICE = 1, @@ -392,17 +332,22 @@ reg_t kDeviceInfo(EngineState *s, int argc, reg_t *argv) { break; case K_DEVICE_INFO_GET_SAVEFILE_NAME: { Common::String game_prefix = s->_segMan->getString(argv[2]); - int savegame_id = argv[3].toUint16(); + uint virtualId = argv[3].toUint16(); s->_segMan->strcpy(argv[1], "__throwaway"); - debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix.c_str(), savegame_id, "__throwaway"); + debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix.c_str(), virtualId, "__throwaway"); + if ((virtualId < SAVEGAMEID_OFFICIALRANGE_START) || (virtualId > SAVEGAMEID_OFFICIALRANGE_END)) + error("kDeviceInfo(deleteSave): invalid savegame-id specified"); + uint savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START; Common::Array saves; listSavegames(saves); - int savedir_nr = saves[savegame_id].id; - Common::String filename = g_sci->getSavegameName(savedir_nr); - Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); - saveFileMan->removeSavefile(filename); + if (findSavegame(saves, savegameId) != -1) { + // Confirmed that this id still lives... + Common::String filename = g_sci->getSavegameName(savegameId); + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + saveFileMan->removeSavefile(filename); } break; + } default: error("Unknown DeviceInfo() sub-command: %d", mode); @@ -438,24 +383,102 @@ reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) { return make_reg(0, 1); } -// TODO: we need NOT to assign our own ids to saved-games, but use the filename-id and pass that to the scripts -// LSL6 is using the last used saved-game-id for quicksaving and this won't match correctly otherwise +static bool _savegame_sort_byDate(const SavegameDesc &l, const SavegameDesc &r) { + if (l.date != r.date) + return (l.date > r.date); + return (l.time > r.time); +} + +// Create a sorted array containing all found savedgames +static void listSavegames(Common::Array &saves) { + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + + // Load all saves + Common::StringArray saveNames = saveFileMan->listSavefiles(g_sci->getSavegamePattern()); + + for (Common::StringArray::const_iterator iter = saveNames.begin(); iter != saveNames.end(); ++iter) { + Common::String filename = *iter; + Common::SeekableReadStream *in; + if ((in = saveFileMan->openForLoading(filename))) { + SavegameMetadata meta; + if (!get_savegame_metadata(in, &meta) || meta.savegame_name.empty()) { + // invalid + delete in; + continue; + } + delete in; + + SavegameDesc desc; + desc.id = strtol(filename.end() - 3, NULL, 10); + desc.date = meta.savegame_date; + // We need to fix date in here, because we save DDMMYYYY instead of + // YYYYMMDD, so sorting wouldn't work + desc.date = ((desc.date & 0xFFFF) << 16) | ((desc.date & 0xFF0000) >> 8) | ((desc.date & 0xFF000000) >> 24); + desc.time = meta.savegame_time; + desc.version = meta.savegame_version; + + if (meta.savegame_name.lastChar() == '\n') + meta.savegame_name.deleteLastChar(); + + Common::strlcpy(desc.name, meta.savegame_name.c_str(), SCI_MAX_SAVENAME_LENGTH); + + debug(3, "Savegame in file %s ok, id %d", filename.c_str(), desc.id); + + saves.push_back(desc); + } + } + + // Sort the list by creation date of the saves + Common::sort(saves.begin(), saves.end(), _savegame_sort_byDate); +} + +// Find a savedgame according to virtualId and return the position within our array +static int findSavegame(Common::Array &saves, uint savegameId) { + for (uint saveNr = 0; saveNr < saves.size(); saveNr++) { + if (saves[saveNr].id == savegameId) + return saveNr; + } + return -1; +} + +// The scripts get IDs ranging from 1000->1999, because the scripts require us to assign unique ids THAT EVEN STAY BETWEEN +// SAVES and the scripts also use "saves-count + 1" to create a new savedgame slot. +// SCI1.1 actually recycles ids, in that case we will currently get "0". +// This behaviour is required especially for LSL6. In this game, it's possible to quick save. The scripts will use +// the last-used id for that feature. If we don't assign sticky ids, the feature will overwrite different saves all the +// time. And sadly we can't just use the actual filename ids directly, because of the creation method for new slots. + +bool Console::cmdListSaves(int argc, const char **argv) { + Common::Array saves; + listSavegames(saves); + + for (uint i = 0; i < saves.size(); i++) { + Common::String filename = g_sci->getSavegameName(saves[i].id); + DebugPrintf("%s: '%s'\n", filename.c_str(), saves[i].name); + } + + return true; +} reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) { Common::String game_id = s->_segMan->getString(argv[0]); - uint16 savedir_nr = argv[1].toUint16(); + uint16 virtualId = argv[1].toUint16(); - debug(3, "kCheckSaveGame(%s, %d)", game_id.c_str(), savedir_nr); + debug(3, "kCheckSaveGame(%s, %d)", game_id.c_str(), virtualId); Common::Array saves; listSavegames(saves); - // Check for savegame slot being out of range - if (savedir_nr >= saves.size()) + // Find saved-game + if ((virtualId < SAVEGAMEID_OFFICIALRANGE_START) || (virtualId > SAVEGAMEID_OFFICIALRANGE_END)) + error("kCheckSaveGame: called with invalid savegameId!"); + uint savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START; + int savegameNr = findSavegame(saves, savegameId); + if (savegameNr == -1) return NULL_REG; // Check for compatible savegame version - int ver = saves[savedir_nr].version; + int ver = saves[savegameNr].version; if (ver < MINIMUM_SAVEGAME_VERSION || ver > CURRENT_SAVEGAME_VERSION) return NULL_REG; @@ -468,9 +491,12 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { debug(3, "kGetSaveFiles(%s)", game_id.c_str()); + // Scripts ask for current save files, we can assume that if afterwards they ask us to create a new slot they really + // mean new slot instead of overwriting the old one + s->_lastSaveVirtualId = SAVEGAMEID_OFFICIALRANGE_START; + Common::Array saves; listSavegames(saves); - uint totalSaves = MIN(saves.size(), MAX_SAVEGAME_NR); reg_t *slot = s->_segMan->derefRegPtr(argv[2], totalSaves); @@ -485,7 +511,7 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { char *saveNamePtr = saveNames; for (uint i = 0; i < totalSaves; i++) { - *slot++ = make_reg(0, i); // Store slot + *slot++ = make_reg(0, saves[i].id + SAVEGAMEID_OFFICIALRANGE_START); // Store the virtual savegame-id ffs. see above strcpy(saveNamePtr, saves[i].name); saveNamePtr += SCI_MAX_SAVENAME_LENGTH; } @@ -500,46 +526,51 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { Common::String game_id = s->_segMan->getString(argv[0]); - int savedir_nr = argv[1].toUint16(); - int savedir_id; // Savegame ID, derived from savedir_nr and the savegame ID list + uint virtualId = argv[1].toUint16(); Common::String game_description = s->_segMan->getString(argv[2]); Common::String version; if (argc > 3) version = s->_segMan->getString(argv[3]); - debug(3, "kSaveGame(%s,%d,%s,%s)", game_id.c_str(), savedir_nr, game_description.c_str(), version.c_str()); + debug(3, "kSaveGame(%s,%d,%s,%s)", game_id.c_str(), virtualId, game_description.c_str(), version.c_str()); Common::Array saves; listSavegames(saves); - if (savedir_nr >= 0 && (uint)savedir_nr < saves.size()) { - // Overwrite - savedir_id = saves[savedir_nr].id; - } else if (savedir_nr >= 0 && savedir_nr < MAX_SAVEGAME_NR) { - uint i = 0; - - savedir_id = 0; - - // First, look for holes - while (i < saves.size()) { - if (saves[i].id == savedir_id) { - ++savedir_id; - i = 0; - } else - ++i; - } - if (savedir_id >= MAX_SAVEGAME_NR) { - warning("Internal error: Free savegame ID is %d, shouldn't happen", savedir_id); + uint savegameId; + if ((virtualId >= SAVEGAMEID_OFFICIALRANGE_START) && (virtualId <= SAVEGAMEID_OFFICIALRANGE_END)) { + // savegameId is an actual Id, so search for it just to make sure + savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START; + if (findSavegame(saves, savegameId) != -1) return NULL_REG; + } else if (virtualId < SAVEGAMEID_OFFICIALRANGE_START) { + // virtualId is low, we assume that scripts expect us to create new slot + if (virtualId == s->_lastSaveVirtualId) { + // if last virtual id is the same as this one, we assume that caller wants to overwrite last save + savegameId = s->_lastSaveNewId; + } else { + uint savegameNr; + // savegameId is in lower range, scripts expect us to create a new slot + for (savegameId = 0; savegameId < SAVEGAMEID_OFFICIALRANGE_START; savegameId++) { + for (savegameNr = 0; savegameNr < saves.size(); savegameNr++) { + if (savegameId == saves[savegameNr].id) + break; + } + if (savegameNr == saves.size()) + break; + } + if (savegameId == SAVEGAMEID_OFFICIALRANGE_START) + error("kSavegame: no more savegame slots available"); } - - // This loop terminates when savedir_id is not in [x | ex. n. saves [n].id = x] } else { - warning("Savegame ID %d is not allowed", savedir_nr); - return NULL_REG; + error("kSaveGame: invalid savegameId used"); } - Common::String filename = g_sci->getSavegameName(savedir_id); + // Save in case caller wants to overwrite last newly created save + s->_lastSaveVirtualId = virtualId; + s->_lastSaveNewId = savegameId; + + Common::String filename = g_sci->getSavegameName(savegameId); Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); Common::OutSaveFile *out; if (!(out = saveFileMan->openForSaving(filename))) { @@ -568,35 +599,37 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) { Common::String game_id = !argv[0].isNull() ? s->_segMan->getString(argv[0]) : ""; - int savedir_nr = argv[1].toUint16(); + uint savegameId = argv[1].toUint16(); - debug(3, "kRestoreGame(%s,%d)", game_id.c_str(), savedir_nr); + debug(3, "kRestoreGame(%s,%d)", game_id.c_str(), savegameId); - if (!argv[0].isNull()) { - Common::Array saves; - listSavegames(saves); + if ((savegameId < 1000) || (savegameId > 1999)) { + warning("Savegame ID %d is not allowed", savegameId); + return TRUE_REG; + } + savegameId -= 1000; - savedir_nr = saves[savedir_nr].id; - } else { - // Loading from launcher, no change necessary + Common::Array saves; + listSavegames(saves); + if (findSavegame(saves, savegameId) == -1) { + warning("Savegame ID %d not found", savegameId); + return TRUE_REG; } - if (savedir_nr > -1) { - Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); - Common::String filename = g_sci->getSavegameName(savedir_nr); - Common::SeekableReadStream *in; - if ((in = saveFileMan->openForLoading(filename))) { - // found a savegame file + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + Common::String filename = g_sci->getSavegameName(savegameId); + Common::SeekableReadStream *in; + if ((in = saveFileMan->openForLoading(filename))) { + // found a savegame file - gamestate_restore(s, in); - delete in; + gamestate_restore(s, in); + delete in; - return s->r_acc; - } + return s->r_acc; } - s->r_acc = make_reg(0, 1); - warning("Savegame #%d not found", savedir_nr); + s->r_acc = TRUE_REG; + warning("Savegame #%d not found", savegameId); return s->r_acc; } diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 245a021605..36b03c0ad9 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -107,6 +107,9 @@ void EngineState::reset(bool isRestoring) { _throttleLastTime = 0; _throttleTrigger = false; + _lastSaveVirtualId = SAVEGAMEID_OFFICIALRANGE_START; + _lastSaveNewId = 0; + scriptStepCounter = 0; scriptGCInterval = GC_INTERVAL; } diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index e304c6d889..243a460645 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -76,6 +76,17 @@ enum { MAX_SAVE_DIR_SIZE = MAXPATHLEN }; +enum { + MAX_SAVEGAME_NR = 20 /**< Maximum number of savegames */ +}; + +// We assume that scripts give us savegameId 0->999 for creating a new save slot +// and savegameId 1000->1999 for existing save slots ffs. kfile.cpp +enum { + SAVEGAMEID_OFFICIALRANGE_START = 1000, + SAVEGAMEID_OFFICIALRANGE_END = 1999 +}; + class FileHandle { public: Common::String _name; @@ -119,6 +130,9 @@ public: DirSeeker _dirseeker; + uint _lastSaveVirtualId; // last virtual id fed to kSaveGame, if no kGetSaveFiles was called inbetween + uint _lastSaveNewId; // last newly created filename-id by kSaveGame + public: /* VM Information */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 42f7424bf9..d0dd5b6ad3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -355,8 +355,8 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) - { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast - { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast + { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From 8e9d933658bce3b613879b4679321b1c71cfffd4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:18:44 +0000 Subject: SDL: Overhaul OSystem_SDL::getSupportedFormats * Do not use global constructor for the RGBList and BGRList tables anymore, by moving them inside a function. * Update the list of supported formats if the hardware screen surface changes. Previously, the list of supported pixel formats (and its order) was computed only once and then never changed. svn-id: r50832 --- backends/platform/sdl/graphics.cpp | 100 +++++++++++++++++++++---------------- backends/platform/sdl/sdl.h | 7 +++ 2 files changed, 64 insertions(+), 43 deletions(-) diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 05870015cb..f48800f0d8 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -214,42 +214,54 @@ OSystem::TransactionError OSystem_SDL::endGFXTransaction() { } #ifdef USE_RGB_COLOR -const Graphics::PixelFormat RGBList[] = { + +Common::List OSystem_SDL::getSupportedFormats() const { + assert(!_supportedFormats.empty()); + return _supportedFormats; +} + +void OSystem_SDL::detectSupportedFormats() { + + // Clear old list + _supportedFormats.clear(); + + // Some tables with standard formats that we always list + // as "supported". If frontend code tries to use one of + // these, we will perform the necessary format + // conversion in the background. Of course this incurs a + // performance hit, but on desktop ports this should not + // matter. We still push the currently active format to + // the front, so if frontend code just uses the first + // available format, it will get one that is "cheap" to + // use. + const Graphics::PixelFormat RGBList[] = { #ifdef ENABLE_32BIT - // RGBA8888, ARGB8888, RGB888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), - Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), - Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), + // RGBA8888, ARGB8888, RGB888 + Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), + Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), + Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), #endif - // RGB565, XRGB1555, RGB555, RGBA4444, ARGB4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) -}; -const Graphics::PixelFormat BGRList[] = { + // RGB565, XRGB1555, RGB555, RGBA4444, ARGB4444 + Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), + Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15), + Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) + }; + const Graphics::PixelFormat BGRList[] = { #ifdef ENABLE_32BIT - // ABGR8888, BGRA8888, BGR888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), - Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), - Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), + // ABGR8888, BGRA8888, BGR888 + Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), + Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), + Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), #endif - // BGR565, XBGR1555, BGR555, ABGR4444, BGRA4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 0, 5, 10, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 0, 5, 10, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), - Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) -}; - -// TODO: prioritize matching alpha masks -Common::List OSystem_SDL::getSupportedFormats() const { - static Common::List list; - static bool inited = false; - - if (inited) - return list; + // BGR565, XBGR1555, BGR555, ABGR4444, BGRA4444 + Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), + Graphics::PixelFormat(2, 5, 5, 5, 1, 0, 5, 10, 15), + Graphics::PixelFormat(2, 5, 5, 5, 0, 0, 5, 10, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), + Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) + }; bool BGR = false; int listLength = ARRAYSIZE(RGBList); @@ -268,31 +280,29 @@ Common::List OSystem_SDL::getSupportedFormats() const { format.aLoss = 8; // Push it first, as the prefered format. - list.push_back(format); + _supportedFormats.push_back(format); if (format.bShift > format.rShift) BGR = true; - - // Mark that we don't need to do this any more. - inited = true; } + // TODO: prioritize matching alpha masks for (int i = 0; i < listLength; i++) { - if (inited && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) + if (_hwscreen && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) continue; if (BGR) { if (BGRList[i] != format) - list.push_back(BGRList[i]); - list.push_back(RGBList[i]); + _supportedFormats.push_back(BGRList[i]); + _supportedFormats.push_back(RGBList[i]); } else { if (RGBList[i] != format) - list.push_back(RGBList[i]); - list.push_back(BGRList[i]); + _supportedFormats.push_back(RGBList[i]); + _supportedFormats.push_back(BGRList[i]); } } - list.push_back(Graphics::PixelFormat::createFormatCLUT8()); - return list; + _supportedFormats.push_back(Graphics::PixelFormat::createFormatCLUT8()); } + #endif bool OSystem_SDL::setGraphicsMode(int mode) { @@ -574,6 +584,10 @@ bool OSystem_SDL::loadGFXMode() { _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, _videoMode.fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE ); +#ifdef USE_RGB_COLOR + detectSupportedFormats(); +#endif + if (_hwscreen == NULL) { // DON'T use error(), as this tries to bring up the debug // console, which WON'T WORK now that _hwscreen is hosed. diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 480e0af41b..5c901ba711 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -274,6 +274,13 @@ protected: #ifdef USE_RGB_COLOR Graphics::PixelFormat _screenFormat; Graphics::PixelFormat _cursorFormat; + Common::List _supportedFormats; + + /** + * Update the list of supported pixel formats. + * This method is invoked by loadGFXMode(). + */ + void detectSupportedFormats(); #endif // temporary screen (for scalers) -- cgit v1.2.3 From e2c1ee853a1cd1ce56536a4b4436a8da5277d0cb Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:19:08 +0000 Subject: SDL: Tweak OSystem_SDL::detectSupportedFormats a bit Previously, the code in OSystem_SDL::detectSupportedFormats assumed that the arrays RGBList and BGRList had the exact same length, and that the entries in each mirrored those in the other 100%. Instead of relying on that, the code now simply iterates over both lists separately. This changes the resulting order a bit, but since we never gave any guarantees on that, this should not matter. svn-id: r50833 --- backends/platform/sdl/graphics.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index f48800f0d8..35c5b57db6 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -263,9 +263,6 @@ void OSystem_SDL::detectSupportedFormats() { Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) }; - bool BGR = false; - int listLength = ARRAYSIZE(RGBList); - Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8(); if (_hwscreen) { // Get our currently set hardware format @@ -281,25 +278,28 @@ void OSystem_SDL::detectSupportedFormats() { // Push it first, as the prefered format. _supportedFormats.push_back(format); - - if (format.bShift > format.rShift) - BGR = true; } // TODO: prioritize matching alpha masks - for (int i = 0; i < listLength; i++) { + int i; + + // Push some RGB formats + for (i = 0; i < ARRAYSIZE(RGBList); i++) { if (_hwscreen && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) continue; - if (BGR) { - if (BGRList[i] != format) - _supportedFormats.push_back(BGRList[i]); + if (RGBList[i] != format) _supportedFormats.push_back(RGBList[i]); - } else { - if (RGBList[i] != format) - _supportedFormats.push_back(RGBList[i]); + } + + // Push some BGR formats + for (i = 0; i < ARRAYSIZE(BGRList); i++) { + if (_hwscreen && (BGRList[i].bytesPerPixel > format.bytesPerPixel)) + continue; + if (BGRList[i] != format) _supportedFormats.push_back(BGRList[i]); - } } + + // Finally, we always supposed 8 bit palette graphics _supportedFormats.push_back(Graphics::PixelFormat::createFormatCLUT8()); } -- cgit v1.2.3 From 4f914e7a9f1379f06749b1f01fa83b8464c13d7f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:19:33 +0000 Subject: TINSEL: Replace global object s_rectList by a TinselEngine member var svn-id: r50834 --- engines/tinsel/cliprect.cpp | 12 ++++++------ engines/tinsel/tinsel.h | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/engines/tinsel/cliprect.cpp b/engines/tinsel/cliprect.cpp index 69a71b874f..5f287d3eab 100644 --- a/engines/tinsel/cliprect.cpp +++ b/engines/tinsel/cliprect.cpp @@ -28,17 +28,15 @@ #include "tinsel/graphics.h" // normal object drawing #include "tinsel/object.h" #include "tinsel/palette.h" +#include "tinsel/tinsel.h" // for _vm namespace Tinsel { -/** list of all clip rectangles */ -static RectList s_rectList; - /** * Resets the clipping rectangle allocator. */ void ResetClipRect() { - s_rectList.clear(); + _vm->_clipRects.clear(); } /** @@ -46,11 +44,11 @@ void ResetClipRect() { * @param pClip clip rectangle dimensions to allocate */ void AddClipRect(const Common::Rect &pClip) { - s_rectList.push_back(pClip); + _vm->_clipRects.push_back(pClip); } const RectList &GetClipRects() { - return s_rectList; + return _vm->_clipRects; } /** @@ -175,6 +173,8 @@ void FindMovingObjects(OBJECT *pObjList, Common::Point *pWin, Common::Rect *pCli * the total number of clip rectangles. */ void MergeClipRect() { + RectList &s_rectList = _vm->_clipRects; + if (s_rectList.size() <= 1) return; diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h index 0e1d705815..df27a1e0e1 100644 --- a/engines/tinsel/tinsel.h +++ b/engines/tinsel/tinsel.h @@ -61,6 +61,8 @@ class PCMMusicPlayer; class Scheduler; class SoundManager; +typedef Common::List RectList; + enum TinselGameID { GID_DW1 = 0, GID_DW2 = 1 @@ -203,6 +205,10 @@ public: /** Stack of pending keypresses. */ Common::List _keypresses; + + /** List of all clip rectangles. */ + RectList _clipRects; + private: //MidiMusicPlayer *_midiMusic; int _musicVolume; -- cgit v1.2.3 From dcd520ce310a593e7dbc5ecac60c5f3f3e8363a6 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:19:56 +0000 Subject: Get rid of yet another global object with constructor svn-id: r50835 --- backends/platform/sdl/sdl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 18c529092d..6686249416 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -96,11 +96,11 @@ AspectRatio::AspectRatio(int w, int h) { } #if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) -static const size_t AR_COUNT = 4; -static const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" }; -static const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; - static AspectRatio getDesiredAspectRatio() { + const size_t AR_COUNT = 4; + const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" }; + const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; + //TODO : We could parse an arbitrary string, if we code enough proper validation Common::String desiredAspectRatio = ConfMan.get("desired_screen_aspect_ratio"); -- cgit v1.2.3 From 1d3a0f6decd54b017d2ca55a95048de4afdbd868 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:20:33 +0000 Subject: SCI: Turn global object g_debugState into SciEngine member var svn-id: r50836 --- engines/sci/console.cpp | 86 +++++++++++++++++++------------------- engines/sci/console.h | 1 + engines/sci/debug.h | 3 +- engines/sci/engine/kevent.cpp | 8 ++-- engines/sci/engine/kmisc.cpp | 4 +- engines/sci/engine/scriptdebug.cpp | 43 ++++++++++--------- engines/sci/engine/vm.cpp | 27 ++++++------ engines/sci/sci.cpp | 8 ++-- engines/sci/sci.h | 7 +++- 9 files changed, 95 insertions(+), 92 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 3151691900..33aa5514f2 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -66,8 +66,8 @@ bool g_debug_track_mouse_clicks = false; // Refer to the "addresses" command on how to pass address parameters static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeValue); -Console::Console(SciEngine *engine) : GUI::Debugger() { - _engine = engine; +Console::Console(SciEngine *engine) : GUI::Debugger(), + _engine(engine), _debugState(engine->_debugState) { // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); @@ -196,14 +196,14 @@ Console::Console(SciEngine *engine) : GUI::Debugger() { DCmd_Register("active_object", WRAP_METHOD(Console, cmdViewActiveObject)); DCmd_Register("acc_object", WRAP_METHOD(Console, cmdViewAccumulatorObject)); - g_debugState.seeking = kDebugSeekNothing; - g_debugState.seekLevel = 0; - g_debugState.runningStep = 0; - g_debugState.stopOnEvent = false; - g_debugState.debugging = false; - g_debugState.breakpointWasHit = false; - g_debugState._breakpoints.clear(); // No breakpoints defined - g_debugState._activeBreakpointTypes = 0; + _debugState.seeking = kDebugSeekNothing; + _debugState.seekLevel = 0; + _debugState.runningStep = 0; + _debugState.stopOnEvent = false; + _debugState.debugging = false; + _debugState.breakpointWasHit = false; + _debugState._breakpoints.clear(); // No breakpoints defined + _debugState._activeBreakpointTypes = 0; } Console::~Console() { @@ -2307,31 +2307,31 @@ bool Console::cmdBacktrace(int argc, const char **argv) { bool Console::cmdTrace(int argc, const char **argv) { if (argc == 2 && atoi(argv[1]) > 0) - g_debugState.runningStep = atoi(argv[1]) - 1; - g_debugState.debugging = true; + _debugState.runningStep = atoi(argv[1]) - 1; + _debugState.debugging = true; return false; } bool Console::cmdStepOver(int argc, const char **argv) { - g_debugState.seeking = kDebugSeekStepOver; - g_debugState.seekLevel = _engine->_gamestate->_executionStack.size(); - g_debugState.debugging = true; + _debugState.seeking = kDebugSeekStepOver; + _debugState.seekLevel = _engine->_gamestate->_executionStack.size(); + _debugState.debugging = true; return false; } bool Console::cmdStepEvent(int argc, const char **argv) { - g_debugState.stopOnEvent = true; - g_debugState.debugging = true; + _debugState.stopOnEvent = true; + _debugState.debugging = true; return false; } bool Console::cmdStepRet(int argc, const char **argv) { - g_debugState.seeking = kDebugSeekLevelRet; - g_debugState.seekLevel = _engine->_gamestate->_executionStack.size() - 1; - g_debugState.debugging = true; + _debugState.seeking = kDebugSeekLevelRet; + _debugState.seekLevel = _engine->_gamestate->_executionStack.size() - 1; + _debugState.debugging = true; return false; } @@ -2343,9 +2343,9 @@ bool Console::cmdStepGlobal(int argc, const char **argv) { return true; } - g_debugState.seeking = kDebugSeekGlobal; - g_debugState.seekSpecial = atoi(argv[1]); - g_debugState.debugging = true; + _debugState.seeking = kDebugSeekGlobal; + _debugState.seekSpecial = atoi(argv[1]); + _debugState.debugging = true; return false; } @@ -2373,12 +2373,12 @@ bool Console::cmdStepCallk(int argc, const char **argv) { } } - g_debugState.seeking = kDebugSeekSpecialCallk; - g_debugState.seekSpecial = callk_index; + _debugState.seeking = kDebugSeekSpecialCallk; + _debugState.seekSpecial = callk_index; } else { - g_debugState.seeking = kDebugSeekCallk; + _debugState.seeking = kDebugSeekCallk; } - g_debugState.debugging = true; + _debugState.debugging = true; return false; } @@ -2560,7 +2560,7 @@ bool Console::cmdSend(int argc, const char **argv) { bool Console::cmdGo(int argc, const char **argv) { // CHECKME: is this necessary? - g_debugState.seeking = kDebugSeekNothing; + _debugState.seeking = kDebugSeekNothing; return Cmd_Exit(argc, argv); } @@ -2571,8 +2571,8 @@ bool Console::cmdBreakpointList(int argc, const char **argv) { DebugPrintf("Breakpoint list:\n"); - Common::List::const_iterator bp = g_debugState._breakpoints.begin(); - Common::List::const_iterator end = g_debugState._breakpoints.end(); + Common::List::const_iterator bp = _debugState._breakpoints.begin(); + Common::List::const_iterator end = _debugState._breakpoints.end(); for (; bp != end; ++bp) { DebugPrintf(" #%i: ", i); switch (bp->type) { @@ -2603,16 +2603,16 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) { } if (strcmp(argv[1], "*") == 0) { - g_debugState._breakpoints.clear(); - g_debugState._activeBreakpointTypes = 0; + _debugState._breakpoints.clear(); + _debugState._activeBreakpointTypes = 0; return true; } const int idx = atoi(argv[1]); // Find the breakpoint at index idx. - Common::List::iterator bp = g_debugState._breakpoints.begin(); - const Common::List::iterator end = g_debugState._breakpoints.end(); + Common::List::iterator bp = _debugState._breakpoints.begin(); + const Common::List::iterator end = _debugState._breakpoints.end(); for (int i = 0; bp != end && i < idx; ++bp, ++i) { // do nothing } @@ -2623,15 +2623,15 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) { } // Delete it - g_debugState._breakpoints.erase(bp); + _debugState._breakpoints.erase(bp); // Update EngineState::_activeBreakpointTypes. int type = 0; - for (bp = g_debugState._breakpoints.begin(); bp != end; ++bp) { + for (bp = _debugState._breakpoints.begin(); bp != end; ++bp) { type |= bp->type; } - g_debugState._activeBreakpointTypes = type; + _debugState._activeBreakpointTypes = type; return true; } @@ -2653,8 +2653,8 @@ bool Console::cmdBreakpointExecMethod(int argc, const char **argv) { bp.type = BREAK_SELECTOR; bp.name = argv[1]; - g_debugState._breakpoints.push_back(bp); - g_debugState._activeBreakpointTypes |= BREAK_SELECTOR; + _debugState._breakpoints.push_back(bp); + _debugState._activeBreakpointTypes |= BREAK_SELECTOR; return true; } @@ -2674,8 +2674,8 @@ bool Console::cmdBreakpointExecFunction(int argc, const char **argv) { bp.type = BREAK_EXPORT; bp.address = (atoi(argv[1]) << 16 | atoi(argv[2])); - g_debugState._breakpoints.push_back(bp); - g_debugState._activeBreakpointTypes |= BREAK_EXPORT; + _debugState._breakpoints.push_back(bp); + _debugState._activeBreakpointTypes |= BREAK_EXPORT; return true; } @@ -2876,8 +2876,8 @@ bool Console::cmdQuit(int argc, const char **argv) { if (!scumm_stricmp(argv[1], "game")) { // Quit gracefully _engine->_gamestate->abortScriptProcessing = kAbortQuitGame; // Terminate VM - g_debugState.seeking = kDebugSeekNothing; - g_debugState.runningStep = 0; + _debugState.seeking = kDebugSeekNothing; + _debugState.runningStep = 0; } else if (!scumm_stricmp(argv[1], "now")) { // Quit ungracefully diff --git a/engines/sci/console.h b/engines/sci/console.h index 95947a00f3..51f02d7168 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -157,6 +157,7 @@ private: private: SciEngine *_engine; + DebugState &_debugState; bool _mouseVisible; Common::String _videoFile; int _videoFrameDelay; diff --git a/engines/sci/debug.h b/engines/sci/debug.h index d381e55dc8..5cf0e38fbc 100644 --- a/engines/sci/debug.h +++ b/engines/sci/debug.h @@ -26,8 +26,8 @@ #ifndef SCI_DEBUG_H #define SCI_DEBUG_H +#include "common/list.h" #include "sci/engine/vm_types.h" // for StackPtr -#include "sci/engine/vm.h" // for ExecStack namespace Sci { @@ -79,7 +79,6 @@ struct DebugState { extern int g_debug_sleeptime_factor; extern int g_debug_simulated_key; extern bool g_debug_track_mouse_clicks; -extern DebugState g_debugState; } // End of namespace Sci diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 4086d14a25..7547ad5ab6 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -78,8 +78,8 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { switch (curEvent.type) { case SCI_EVENT_QUIT: s->abortScriptProcessing = kAbortQuitGame; // Terminate VM - g_debugState.seeking = kDebugSeekNothing; - g_debugState.runningStep = 0; + g_sci->_debugState.seeking = kDebugSeekNothing; + g_sci->_debugState.runningStep = 0; break; case SCI_EVENT_KEYBOARD: @@ -124,8 +124,8 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { s->r_acc = NULL_REG; // Unknown or no event } - if ((s->r_acc.offset) && (g_debugState.stopOnEvent)) { - g_debugState.stopOnEvent = false; + if ((s->r_acc.offset) && (g_sci->_debugState.stopOnEvent)) { + g_sci->_debugState.stopOnEvent = false; // A SCI event occurred, and we have been asked to stop, so open the debug console Console *con = g_sci->getSciDebugger(); diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 1ed12c092e..b8c62210f9 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -154,8 +154,8 @@ reg_t kFlushResources(EngineState *s, int argc, reg_t *argv) { reg_t kSetDebug(EngineState *s, int argc, reg_t *argv) { printf("Debug mode activated\n"); - g_debugState.seeking = kDebugSeekNothing; - g_debugState.runningStep = 0; + g_sci->_debugState.seeking = kDebugSeekNothing; + g_sci->_debugState.runningStep = 0; return s->r_acc; } diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 4813e083fd..915a6fa994 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -63,8 +63,6 @@ const char *opcodeNames[] = { "-sli", "-sti", "-spi" }; -DebugState g_debugState; // FIXME: Avoid non-const global vars - // Disassembles one command from the heap, returns address of next command or 0 if a ret was encountered. reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecode) { SegmentObj *mobj = s->_segMan->getSegment(pos.segment, SEG_TYPE_SCRIPT); @@ -277,30 +275,32 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod } -void script_debug(EngineState *s) { - if (g_debugState.seeking && !g_debugState.breakpointWasHit) { // Are we looking for something special? - if (g_debugState.seeking == kDebugSeekStepOver) { +void SciEngine::scriptDebug() { + EngineState *s = _gamestate; + if (_debugState.seeking && !_debugState.breakpointWasHit) { // Are we looking for something special? + if (_debugState.seeking == kDebugSeekStepOver) { // are we above seek-level? resume then - if (g_debugState.seekLevel < (int)s->_executionStack.size()) + if (_debugState.seekLevel < (int)s->_executionStack.size()) return; - g_debugState.seeking = kDebugSeekNothing; + _debugState.seeking = kDebugSeekNothing; } - if (g_debugState.seeking != kDebugSeekNothing) { - SegmentObj *mobj = s->_segMan->getSegment(s->xs->addr.pc.segment, SEG_TYPE_SCRIPT); + if (_debugState.seeking != kDebugSeekNothing) { + const reg_t pc = s->xs->addr.pc; + SegmentObj *mobj = s->_segMan->getSegment(pc.segment, SEG_TYPE_SCRIPT); if (mobj) { Script *scr = (Script *)mobj; const byte *code_buf = scr->getBuf(); int code_buf_size = scr->getBufSize(); - int opcode = s->xs->addr.pc.offset >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset]; + int opcode = pc.offset >= code_buf_size ? 0 : code_buf[pc.offset]; int op = opcode >> 1; - int paramb1 = s->xs->addr.pc.offset + 1 >= code_buf_size ? 0 : code_buf[s->xs->addr.pc.offset + 1]; - int paramf1 = (opcode & 1) ? paramb1 : (s->xs->addr.pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + s->xs->addr.pc.offset + 1)); + int paramb1 = pc.offset + 1 >= code_buf_size ? 0 : code_buf[pc.offset + 1]; + int paramf1 = (opcode & 1) ? paramb1 : (pc.offset + 2 >= code_buf_size ? 0 : (int16)READ_SCI11ENDIAN_UINT16(code_buf + pc.offset + 1)); - switch (g_debugState.seeking) { + switch (_debugState.seeking) { case kDebugSeekSpecialCallk: - if (paramb1 != g_debugState.seekSpecial) + if (paramb1 != _debugState.seekSpecial) return; case kDebugSeekCallk: @@ -309,7 +309,7 @@ void script_debug(EngineState *s) { break; case kDebugSeekLevelRet: - if ((op != op_ret) || (g_debugState.seekLevel < (int)s->_executionStack.size()-1)) + if ((op != op_ret) || (_debugState.seekLevel < (int)s->_executionStack.size()-1)) return; break; @@ -320,7 +320,7 @@ void script_debug(EngineState *s) { return; // param or temp if ((op & 0x3) && s->_executionStack.back().local_segment > 0) return; // locals and not running in script.000 - if (paramf1 != g_debugState.seekSpecial) + if (paramf1 != _debugState.seekSpecial) return; // CORRECT global? break; @@ -328,7 +328,7 @@ void script_debug(EngineState *s) { break; } - g_debugState.seeking = kDebugSeekNothing; + _debugState.seeking = kDebugSeekNothing; } } // OK, found whatever we were looking for @@ -337,15 +337,14 @@ void script_debug(EngineState *s) { printf("Step #%d\n", s->scriptStepCounter); disassemble(s, s->xs->addr.pc, 0, 1); - if (g_debugState.runningStep) { - g_debugState.runningStep--; + if (_debugState.runningStep) { + _debugState.runningStep--; return; } - g_debugState.debugging = false; + _debugState.debugging = false; - Console *con = ((Sci::SciEngine *)g_engine)->getSciDebugger(); - con->attach(); + _console->attach(); } void Kernel::dumpScriptObject(char *data, int seeker, int objsize) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d0dd5b6ad3..57c02f8c36 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -30,7 +30,6 @@ #include "sci/sci.h" #include "sci/console.h" -#include "sci/debug.h" // for g_debugState #include "sci/resource.h" #include "sci/engine/features.h" #include "sci/engine/state.h" @@ -474,18 +473,18 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP } // Check if a breakpoint is set on this method - if (g_debugState._activeBreakpointTypes & BREAK_EXPORT) { + if (g_sci->_debugState._activeBreakpointTypes & BREAK_EXPORT) { uint32 bpaddress; bpaddress = (script << 16 | pubfunct); Common::List::const_iterator bp; - for (bp = g_debugState._breakpoints.begin(); bp != g_debugState._breakpoints.end(); ++bp) { + for (bp = g_sci->_debugState._breakpoints.begin(); bp != g_sci->_debugState._breakpoints.end(); ++bp) { if (bp->type == BREAK_EXPORT && bp->address == bpaddress) { Console *con = g_sci->getSciDebugger(); con->DebugPrintf("Break on script %d, export %d\n", script, pubfunct); - g_debugState.debugging = true; - g_debugState.breakpointWasHit = true; + g_sci->_debugState.debugging = true; + g_sci->_debugState.breakpointWasHit = true; break; } } @@ -553,13 +552,13 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } // Check if a breakpoint is set on this method - if (g_debugState._activeBreakpointTypes & BREAK_SELECTOR) { + if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTOR) { char method_name[256]; sprintf(method_name, "%s::%s", s->_segMan->getObjectName(send_obj), g_sci->getKernel()->getSelectorName(selector).c_str()); Common::List::const_iterator bp; - for (bp = g_debugState._breakpoints.begin(); bp != g_debugState._breakpoints.end(); ++bp) { + for (bp = g_sci->_debugState._breakpoints.begin(); bp != g_sci->_debugState._breakpoints.end(); ++bp) { int cmplen = bp->name.size(); if (bp->name.lastChar() != ':') cmplen = 256; @@ -568,8 +567,8 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt Console *con = g_sci->getSciDebugger(); con->DebugPrintf("Break on %s (in [%04x:%04x])\n", method_name, PRINT_REG(send_obj)); printSendActions = true; - g_debugState.debugging = true; - g_debugState.breakpointWasHit = true; + g_sci->_debugState.debugging = true; + g_sci->_debugState.breakpointWasHit = true; break; } } @@ -1003,8 +1002,8 @@ void run_vm(EngineState *s, bool restoring) { int var_type; // See description below int var_number; - g_debugState.old_pc_offset = s->xs->addr.pc.offset; - g_debugState.old_sp = s->xs->sp; + g_sci->_debugState.old_pc_offset = s->xs->addr.pc.offset; + g_sci->_debugState.old_sp = s->xs->sp; if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) return; // Stop processing @@ -1046,9 +1045,9 @@ void run_vm(EngineState *s, bool restoring) { // Debug if this has been requested: // TODO: re-implement sci_debug_flags - if (g_debugState.debugging /* sci_debug_flags*/) { - script_debug(s); - g_debugState.breakpointWasHit = false; + if (g_sci->_debugState.debugging /* sci_debug_flags*/) { + g_sci->scriptDebug(); + g_sci->_debugState.breakpointWasHit = false; } Console *con = g_sci->getSciDebugger(); if (con->isAttached()) { diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index ec8f697123..1ebc6a2ba3 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -448,12 +448,12 @@ void SciEngine::exitGame() { GUI::Debugger *SciEngine::getDebugger() { if (_gamestate) { ExecStack *xs = &(_gamestate->_executionStack.back()); - xs->addr.pc.offset = g_debugState.old_pc_offset; - xs->sp = g_debugState.old_sp; + xs->addr.pc.offset = _debugState.old_pc_offset; + xs->sp = _debugState.old_sp; } - g_debugState.runningStep = 0; // Stop multiple execution - g_debugState.seeking = kDebugSeekNothing; // Stop special seeks + _debugState.runningStep = 0; // Stop multiple execution + _debugState.seeking = kDebugSeekNothing; // Stop special seeks return _console; } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 4ba6755967..74c48258ef 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -28,7 +28,8 @@ #include "engines/engine.h" #include "common/util.h" -#include "engine/vm_types.h" // for Selector +#include "sci/engine/vm_types.h" // for Selector +#include "sci/debug.h" // for DebugState struct ADGameDescription; @@ -243,6 +244,8 @@ public: void sleep(uint32 msecs); + void scriptDebug(); + public: /** @@ -290,6 +293,8 @@ public: SoundCommandParser *_soundCmd; GameFeatures *_features; + DebugState _debugState; + private: /** * Initializes a SCI game -- cgit v1.2.3 From 03c0faa5d76f547603ee6389cdf958e2a6f0f43d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 12 Jul 2010 23:21:03 +0000 Subject: SCI: Move breakpoint checks into SciEngine methods svn-id: r50837 --- engines/sci/engine/vm.cpp | 83 ++++++++++++++++++++++++++--------------------- engines/sci/sci.h | 2 ++ 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 57c02f8c36..8108440102 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -450,6 +450,26 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #define PUSH32(a) (*(validate_stack_addr(s, (s->xs->sp)++)) = (a)) #define POP32() (*(validate_stack_addr(s, --(s->xs->sp)))) +bool SciEngine::checkExportBreakpoint(uint16 script, uint16 pubfunct) { + if (_debugState._activeBreakpointTypes & BREAK_EXPORT) { + uint32 bpaddress; + + bpaddress = (script << 16 | pubfunct); + + Common::List::const_iterator bp; + for (bp = _debugState._breakpoints.begin(); bp != _debugState._breakpoints.end(); ++bp) { + if (bp->type == BREAK_EXPORT && bp->address == bpaddress) { + _console->DebugPrintf("Break on script %d, export %d\n", script, pubfunct); + _debugState.debugging = true; + _debugState.breakpointWasHit = true; + return true;; + } + } + } + + return false; +} + ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackPtr sp, reg_t calling_obj, uint16 argc, StackPtr argp) { int seg = s->_segMan->getScriptSegment(script); Script *scr = s->_segMan->getScriptIfLoaded(seg); @@ -473,22 +493,7 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP } // Check if a breakpoint is set on this method - if (g_sci->_debugState._activeBreakpointTypes & BREAK_EXPORT) { - uint32 bpaddress; - - bpaddress = (script << 16 | pubfunct); - - Common::List::const_iterator bp; - for (bp = g_sci->_debugState._breakpoints.begin(); bp != g_sci->_debugState._breakpoints.end(); ++bp) { - if (bp->type == BREAK_EXPORT && bp->address == bpaddress) { - Console *con = g_sci->getSciDebugger(); - con->DebugPrintf("Break on script %d, export %d\n", script, pubfunct); - g_sci->_debugState.debugging = true; - g_sci->_debugState.breakpointWasHit = true; - break; - } - } - } + g_sci->checkExportBreakpoint(script, pubfunct); return add_exec_stack_entry(s->_executionStack, make_reg(seg, temp), sp, calling_obj, argc, argp, -1, pubfunct, -1, calling_obj, s->_executionStack.size()-1, seg); } @@ -528,6 +533,30 @@ struct CallsStruct { int type; /**< Same as ExecStack.type */ }; +bool SciEngine::checkSelectorBreakpoint(reg_t send_obj, int selector) { + if (_debugState._activeBreakpointTypes & BREAK_SELECTOR) { + char method_name[256]; + + sprintf(method_name, "%s::%s", _gamestate->_segMan->getObjectName(send_obj), getKernel()->getSelectorName(selector).c_str()); + + Common::List::const_iterator bp; + for (bp = _debugState._breakpoints.begin(); bp != _debugState._breakpoints.end(); ++bp) { + int cmplen = bp->name.size(); + if (bp->name.lastChar() != ':') + cmplen = 256; + + if (bp->type == BREAK_SELECTOR && !strncmp(bp->name.c_str(), method_name, cmplen)) { + _console->DebugPrintf("Break on %s (in [%04x:%04x])\n", method_name, PRINT_REG(send_obj)); + _debugState.debugging = true; + _debugState.breakpointWasHit = true; + return true; + } + } + } + + return false; +} + ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPtr sp, int framesize, StackPtr argp) { // send_obj and work_obj are equal for anything but 'super' // Returns a pointer to the TOS exec_stack element @@ -552,27 +581,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt } // Check if a breakpoint is set on this method - if (g_sci->_debugState._activeBreakpointTypes & BREAK_SELECTOR) { - char method_name[256]; - - sprintf(method_name, "%s::%s", s->_segMan->getObjectName(send_obj), g_sci->getKernel()->getSelectorName(selector).c_str()); - - Common::List::const_iterator bp; - for (bp = g_sci->_debugState._breakpoints.begin(); bp != g_sci->_debugState._breakpoints.end(); ++bp) { - int cmplen = bp->name.size(); - if (bp->name.lastChar() != ':') - cmplen = 256; - - if (bp->type == BREAK_SELECTOR && !strncmp(bp->name.c_str(), method_name, cmplen)) { - Console *con = g_sci->getSciDebugger(); - con->DebugPrintf("Break on %s (in [%04x:%04x])\n", method_name, PRINT_REG(send_obj)); - printSendActions = true; - g_sci->_debugState.debugging = true; - g_sci->_debugState.breakpointWasHit = true; - break; - } - } - } + printSendActions = g_sci->checkSelectorBreakpoint(send_obj, selector); #ifdef VM_DEBUG_SEND printf("Send to %04x:%04x, selector %04x (%s):", PRINT_REG(send_obj), selector, g_sci->getKernel()->getSelectorName(selector).c_str()); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 74c48258ef..c15f87e4e2 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -245,6 +245,8 @@ public: void sleep(uint32 msecs); void scriptDebug(); + bool checkExportBreakpoint(uint16 script, uint16 pubfunct); + bool checkSelectorBreakpoint(reg_t send_obj, int selector); public: -- cgit v1.2.3 From 762c569207f778b5b3efad9414a3cfe943424316 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 13 Jul 2010 08:00:22 +0000 Subject: PSP: Typos in trace.h svn-id: r50844 --- backends/platform/psp/trace.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/psp/trace.h b/backends/platform/psp/trace.h index ade8fd7214..5c0ea86e42 100644 --- a/backends/platform/psp/trace.h +++ b/backends/platform/psp/trace.h @@ -32,9 +32,9 @@ /* Choose to print to file/screen/both */ #ifdef __PSP_PRINT_TO_FILE__ - #define __PSP_PRINT__(format,...) PSPDebugTrace(false, format, ## __VA_ARGS__) + #define __PSP_PRINT__(format,...) PspDebugTrace(false, format, ## __VA_ARGS__) #elif defined __PSP_PRINT_TO_FILE_AND_SCREEN__ - #define __PSP_PRINT__(format,...) PSPDebugTrace(true, format, ## __VA_ARGS__) + #define __PSP_PRINT__(format,...) PspDebugTrace(true, format, ## __VA_ARGS__) #else /* default - print to screen */ #define __PSP_PRINT__(format,...) fprintf(stderr, format, ## __VA_ARGS__) #endif /* PSP_PRINT_TO_FILE/SCREEN */ -- cgit v1.2.3 From d2b47ee775b41779427be111f7a755ee7e796a4b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 15:42:59 +0000 Subject: SCI: change handling of priority in combination with embedded cels inside picture resources, change in r49029 was wrong - fixes pq1 (map not changing when driving car) svn-id: r50845 --- engines/sci/graphics/picture.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 7cd37b6f46..5c3330ab7a 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -307,6 +307,8 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos if (!_addToFlag) clearColor = _screen->getColorWhite(); + byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL | GFX_SCREEN_MASK_PRIORITY; + ptr = celBitmap; if (!_mirroredFlag) { // Draw bitmap to screen @@ -314,7 +316,7 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos while (y < lastY) { curByte = *ptr++; if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) - _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL | GFX_SCREEN_MASK_PRIORITY, curByte, priority, 0); + _screen->putPixel(x, y, drawMask, curByte, priority, 0); x++; @@ -331,7 +333,7 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos while (y < lastY) { curByte = *ptr++; if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) - _screen->putPixel(x, y, GFX_SCREEN_MASK_VISUAL | GFX_SCREEN_MASK_PRIORITY, curByte, priority, 0); + _screen->putPixel(x, y, drawMask, curByte, priority, 0); if (x == leftX) { if (width > rightX - leftX) // Skip extra pixels at the end of the row @@ -658,8 +660,6 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { vectorGetAbsCoordsNoMirror(data, curPos, x, y); size = READ_LE_UINT16(data + curPos); curPos += 2; _priority = pic_priority; // set global priority so the cel gets drawn using current priority as well - if (pic_priority == 255) - _priority = 0; // if priority not set, use priority 0 drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y); curPos += size; break; -- cgit v1.2.3 From b97ef271c7f929fea02a1bd05950a61a9c313198 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 15:46:21 +0000 Subject: SCI: adding comment about GfxPicture::draw() and picture resource formats svn-id: r50846 --- engines/sci/graphics/picture.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 5c3330ab7a..1416412b33 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -56,7 +56,9 @@ GuiResourceId GfxPicture::getResourceId() { return _resourceId; } -// TODO: subclass this +// differentiation between various picture formats can NOT get done using sci-version checks. +// Games like PQ1 use the "old" vector data picture format, but are actually SCI1.1 +// We should leave this that way to decide the format on-the-fly instead of hardcoding it in any way void GfxPicture::draw(int16 animationNr, bool mirroredFlag, bool addToFlag, int16 EGApaletteNo) { uint16 headerSize; -- cgit v1.2.3 From 8171093614c16db6284a53ce00700aeb115419b4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 15:49:13 +0000 Subject: SCI: adding comment about palette formats svn-id: r50847 --- engines/sci/graphics/palette.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 957199f8b9..c1654b4612 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -109,6 +109,8 @@ void GfxPalette::createFromData(byte *data, int bytesLeft, Palette *paletteOut) warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette header"); return; } + // palette formats in here are not really version exclusive, we can not use sci-version to differentiate between them + // they were just called that way, because they started appearing in sci1.1 for example if ((data[0] == 0 && data[1] == 1) || (data[0] == 0 && data[1] == 0 && READ_LE_UINT16(data + 29) == 0)) { // SCI0/SCI1 palette palFormat = SCI_PAL_FORMAT_VARIABLE; // CONSTANT; -- cgit v1.2.3 From 44626efdce1856a0986a223d0ef0e9dda209f180 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 18:11:50 +0000 Subject: SCI: removing old kernel signature stuff svn-id: r50848 --- engines/sci/engine/kernel.cpp | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index beb1d3ce35..296f7556e8 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -33,26 +33,6 @@ namespace Sci { -// Uncompiled kernel signatures are formed from a string of letters. -// each corresponding to a type of a parameter (see below). -// Use small letters to indicate end of sum type. -// Use capital letters for sum types, e.g. -// "LNoLr" for a function which takes two arguments: -// (1) list, node or object -// (2) list or ref -#define KSIG_SPEC_LIST 'l' -#define KSIG_SPEC_NODE 'n' -#define KSIG_SPEC_OBJECT 'o' -#define KSIG_SPEC_REF 'r' // Said Specs and strings -#define KSIG_SPEC_ARITHMETIC 'i' -#define KSIG_SPEC_NULL 'z' -#define KSIG_SPEC_ANY '.' -#define KSIG_SPEC_ELLIPSIS '*' // Arbitrarily more TYPED arguments - -#define KSIG_SPEC_SUM_DONE ('a' - 'A') - - - /** Default kernel name table. */ static const char *s_defaultKernelNames[] = { /*0x00*/ "Load", -- cgit v1.2.3 From 19d4374cbd5c8c7dc6b6b8d59463460fb464ae47 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 18:15:19 +0000 Subject: SCI: erroring out on unsupported soundversion in midiparser svn-id: r50849 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index cc09ba79f0..3321811701 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -519,7 +519,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { _dataincToAdd = 1; break; default: - break; + error("unsupported _soundVersion"); } break; case kResetOnPause: -- cgit v1.2.3 From a18825519677cc783cab9cebc798797d30bb153c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 20:14:42 +0000 Subject: SCI: adding quest for glory 1 export save filename ("a:glory1.sav") for filename fixing svn-id: r50851 --- engines/sci/engine/kgraphics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 29f7565ef9..0476d31f20 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -889,8 +889,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { reg_t textReference = readSelector(s->_segMan, controlObject, SELECTOR(text)); if (!textReference.isNull()) { Common::String text = s->_segMan->getString(textReference); - if (text == "a:hq1_hero.sav") { - // Remove "a:" from hero quest export default filename + if ((text == "a:hq1_hero.sav") || (text == "a:glory1.sav")) { + // Remove "a:" from hero quest / quest for glory 1 export default filename text.deleteChar(0); text.deleteChar(0); s->_segMan->strcpy(textReference, text.c_str()); -- cgit v1.2.3 From 946d69cc5e4877e561fb15069297c187cfa145d4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 20:28:17 +0000 Subject: SCI: adding quest for glory 2&3 export save filenames (same types and object names as qfg1) svn-id: r50853 --- engines/sci/engine/kgraphics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 0476d31f20..5f258f604b 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -889,8 +889,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { reg_t textReference = readSelector(s->_segMan, controlObject, SELECTOR(text)); if (!textReference.isNull()) { Common::String text = s->_segMan->getString(textReference); - if ((text == "a:hq1_hero.sav") || (text == "a:glory1.sav")) { - // Remove "a:" from hero quest / quest for glory 1 export default filename + if ((text == "a:hq1_hero.sav") || (text == "a:glory1.sav") || (text == "a:glory2.sav") || (text == "a:glory3.sav")) { + // Remove "a:" from hero quest / quest for glory export default filenames text.deleteChar(0); text.deleteChar(0); s->_segMan->strcpy(textReference, text.c_str()); -- cgit v1.2.3 From 15f5cc43efed6bbb959b332702d38760c41b8be6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 13 Jul 2010 20:42:42 +0000 Subject: SCI: uninitialized workaround for qfg2 when accessing inventory svn-id: r50854 --- engines/sci/engine/vm.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 8108440102..bef8658438 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -339,25 +339,26 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts + { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room - { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is - { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) + { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs + { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room + { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory + { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_QFG2, 71, 0, "theInvSheet", "doit", -1, 1, { 0, 0 } }, // accessing the inventory { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller -- cgit v1.2.3 From 28fca2dba39000c4ef0b54f0566248784f1ee700 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 13 Jul 2010 23:46:17 +0000 Subject: Fixed the signature check for DoSound (play) for SCI2.1 games, so that they start again svn-id: r50857 --- engines/sci/engine/kernel.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 296f7556e8..9cfa6a2dab 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -334,7 +334,17 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, + // DoSound (play) is called by 2 methods of the Sound object: play and + // playBed. The methods are the same, apart from the second integer + // parameter: it's 0 in play and 1 in playBed, to distinguish the caller. + // In SCI2, the playBed method is removed (thus the second parameter + // is now meaningless), and in SCI2.1 the second parameter is removed + // altogether. Thus, make the second parameter optional and check for + // its existence inside the function itself, so that the signature + // doesn't bomb out in SCI2.1 games. Another way would be to add SCI + // version checking here, but until then this is the only way to prevent + // the signature check from failing in SCI2.1 games. + { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "o(i)", NULL }, { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, -- cgit v1.2.3 From 217af391cdd42b9d97c5836a809fc8585e0ae097 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 00:52:21 +0000 Subject: SCI: Removed a chatty (and unneeded) warning svn-id: r50860 --- engines/sci/graphics/frameout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 9ce4474ee3..37c99e1e83 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -73,7 +73,7 @@ void GfxFrameout::kernelDeletePlane(reg_t object) { void GfxFrameout::kernelAddScreenItem(reg_t object) { _screenItems.push_back(object); - warning("addScreenItem %X:%X (%s)", object.segment, object.offset, _segMan->getObjectName(object)); + //warning("addScreenItem %X:%X (%s)", object.segment, object.offset, _segMan->getObjectName(object)); } void GfxFrameout::kernelDeleteScreenItem(reg_t object) { -- cgit v1.2.3 From 2bfee401d225bb0c456eaf8041f166498b8665c0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 00:57:48 +0000 Subject: SCI: - Split SCI2 from SCI2.1 signature checks - Added signature checking for the subops of the SCI2.1 kernel call kList - Added support for calls to kAddToFront and kAddToEnd with 3 parameters (unimplemented code uncovered by the signature checks) - Added a FIXME for a potential incorrect subop (uncovered by the signature checks), which might be related to the crashes in the demo of Torin's Passage svn-id: r50861 --- engines/sci/engine/kernel.cpp | 52 ++++++++++++++++++++---- engines/sci/engine/kernel.h | 3 ++ engines/sci/engine/klists.cpp | 94 ++++++++++++++----------------------------- 3 files changed, 78 insertions(+), 71 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9cfa6a2dab..1e97671613 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -292,7 +292,8 @@ struct SciKernelMapSubEntry { #define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE #define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 -#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE +#define SIG_SCI2 SCI_VERSION_2, SCI_VERSION_NONE +#define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_NONE // SCI-Sound-Version #define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE @@ -380,7 +381,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kGraph_subops[] = { - { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start + { SIG_SCI2, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, // 3 - set palette via resource { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", NULL }, @@ -409,7 +410,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, - { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, + { SIG_SCI2, 8, MAP_CALL(PalVaryUnknown), "", NULL }, SCI_SUBOPENTRY_TERMINATOR }; @@ -426,6 +427,41 @@ static const SciKernelMapSubEntry kPalette_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +#ifdef ENABLE_SCI32 +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kList_subops[] = { + { SIG_SCI21, 0, MAP_CALL(NewList), "", NULL }, + { SIG_SCI21, 1, MAP_CALL(DisposeList), "l", NULL }, + { SIG_SCI21, 2, MAP_CALL(NewNode), ".", NULL }, + { SIG_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, + { SIG_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, + { SIG_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, + { SIG_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, + { SIG_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, + { SIG_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, + { SIG_SCI21, 9, MAP_CALL(AddAfter), "lnn.", NULL }, + { SIG_SCI21, 10, MAP_CALL(AddToFront), "ln.", NULL }, + { SIG_SCI21, 11, MAP_CALL(AddToEnd), "ln.", NULL }, + { SIG_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, + { SIG_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, + { SIG_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, + { SIG_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, + { SIG_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, + { SIG_SCI21, 17, MAP_CALL(ListAt), "li", NULL }, + // FIXME: This doesn't seem to be ListIndexOf. In Torin demo, an index is + // passed as a second parameter instead of an object. Thus, it seems to + // be something like ListAt instead... If we swap the two subops though, + // Torin demo crashes complaining that it tried to send to a non-object, + // therefore the semantics might be different here + { SIG_SCI21, 18, MAP_CALL(ListIndexOf), "l[o0]", NULL }, + { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, + { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, + { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, + { SIG_SCI21, 22, MAP_CALL(Sort), "ooo", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; +#endif + struct SciKernelMapEntry { const char *name; KernelFunctionCall *function; @@ -455,7 +491,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI2, SIGFOR_ALL, "r.*", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -505,11 +541,11 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_SCI2, SIGFOR_ALL, "(r*)", NULL, NULL }, { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_SCI2, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(Graph), SIG_EVERYWHERE, NULL, kGraph_subops, NULL }, { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, @@ -521,7 +557,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_SCI2, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -620,7 +656,7 @@ static SciKernelMapEntry s_kernelMap[] = { // SCI2.1 Kernel Functions { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", kList_subops, NULL }, { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index fa206e8053..d63eeaa468 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -461,6 +461,9 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv); reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); reg_t kCD(EngineState *s, int argc, reg_t *argv); +reg_t kAddBefore(EngineState *s, int argc, reg_t *argv); +reg_t kMoveToFront(EngineState *s, int argc, reg_t *argv); +reg_t kMoveToEnd(EngineState *s, int argc, reg_t *argv); #endif reg_t kDoSoundInit(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 0701883a9b..06fc68b82b 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -251,6 +251,19 @@ reg_t kNodeValue(EngineState *s, int argc, reg_t *argv) { reg_t kAddToFront(EngineState *s, int argc, reg_t *argv) { addToFront(s, argv[0], argv[1]); + + if (argc == 3) + s->_segMan->lookupNode(argv[1])->key = argv[2]; + + return s->r_acc; +} + +reg_t kAddToEnd(EngineState *s, int argc, reg_t *argv) { + addToEnd(s, argv[0], argv[1]); + + if (argc == 3) + s->_segMan->lookupNode(argv[1])->key = argv[2]; + return s->r_acc; } @@ -294,11 +307,6 @@ reg_t kAddAfter(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -reg_t kAddToEnd(EngineState *s, int argc, reg_t *argv) { - addToEnd(s, argv[0], argv[1]); - return s->r_acc; -} - reg_t kFindKey(EngineState *s, int argc, reg_t *argv) { reg_t node_pos; reg_t key = argv[1]; @@ -580,65 +588,25 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// In SCI2.1, all the list functions were merged in one reg_t kList(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { - case 0: - return kNewList(s, argc - 1, argv + 1); - case 1: - return kDisposeList(s, argc - 1, argv + 1); - case 2: - return kNewNode(s, argc - 1, argv + 1); - case 3: - return kFirstNode(s, argc - 1, argv + 1); - case 4: - return kLastNode(s, argc - 1, argv + 1); - case 5: - return kEmptyList(s, argc - 1, argv + 1); - case 6: - return kNextNode(s, argc - 1, argv + 1); - case 7: - return kPrevNode(s, argc - 1, argv + 1); - case 8: - return kNodeValue(s, argc - 1, argv + 1); - case 9: - return kAddAfter(s, argc - 1, argv + 1); - case 10: - return kAddToFront(s, argc - 1, argv + 1); - case 11: - return kAddToEnd(s, argc - 1, argv + 1); - case 12: - error("kList: unimplemented subfunction kAddBefore"); - //return kAddBefore(s, argc - 1, argv + 1); - return NULL_REG; - case 13: - error("kList: unimplemented subfunction kMoveToFront"); - //return kMoveToFront(s, argc - 1, argv + 1); - return NULL_REG; - case 14: - error("kList: unimplemented subfunction kMoveToEnd"); - //return kMoveToEnd(s, argc - 1, argv + 1); - return NULL_REG; - case 15: - return kFindKey(s, argc - 1, argv + 1); - case 16: - return kDeleteKey(s, argc - 1, argv + 1); - case 17: - return kListAt(s, argc - 1, argv + 1); - case 18: - return kListIndexOf(s, argc - 1, argv + 1); - case 19: - return kListEachElementDo(s, argc - 1, argv + 1); - case 20: - return kListFirstTrue(s, argc - 1, argv + 1); - case 21: - return kListAllTrue(s, argc - 1, argv + 1); - case 22: - return kSort(s, argc - 1, argv + 1); - default: - error("kList: Unhandled case %d", argv[0].toUint16()); - return NULL_REG; - } + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} + +reg_t kAddBefore(EngineState *s, int argc, reg_t *argv) { + error("Unimplemented function kAddBefore called"); + return s->r_acc; +} + +reg_t kMoveToFront(EngineState *s, int argc, reg_t *argv) { + error("Unimplemented function kMoveToFront called"); + return s->r_acc; +} + +reg_t kMoveToEnd(EngineState *s, int argc, reg_t *argv) { + error("Unimplemented function kMoveToEnd called"); + return s->r_acc; } #endif -- cgit v1.2.3 From 20e672e34dc7f4923fe9b107acbab6439c2fef08 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:02:03 +0000 Subject: Typos svn-id: r50862 --- engines/sci/engine/vm.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index bef8658438..08645c1dd0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1221,8 +1221,8 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); } else if (r_temp.segment && !s->r_acc.segment) { if (s->r_acc.offset >= 1000) - error("[VM] op_gt: comparsion between a pointer and number"); - // Pseudo-WORKAROUND: sierra allows any pointer <-> value comparsion + error("[VM] op_gt: comparison between a pointer and number"); + // Pseudo-WORKAROUND: Sierra allows any pointer <-> value comparison // Happens in SQ1, room 28, when throwing the water at Orat s->r_acc = make_reg(0, 1); } else @@ -1251,8 +1251,8 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset); } else if (r_temp.segment && !s->r_acc.segment) { if (s->r_acc.offset >= 1000) - error("[VM] op_lt: comparsion between a pointer and number"); - // Pseudo-WORKAROUND: sierra allows any pointer <-> value comparsion + error("[VM] op_lt: comparison between a pointer and number"); + // Pseudo-WORKAROUND: Sierra allows any pointer <-> value comparison // Happens in SQ1, room 58, when giving id-card to robot s->r_acc = make_reg(0, 1); } else -- cgit v1.2.3 From b5d4056e9c0a30d73c5226857d579464d3c2be5e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:12:03 +0000 Subject: Typos svn-id: r50863 --- engines/sci/engine/kernel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index d63eeaa468..3bb5827d45 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -100,12 +100,12 @@ struct SelectorCache; // from selector.h enum { SIG_TYPE_NULL = 0x01, // may be 0:0 [0] SIG_TYPE_INTEGER = 0x02, // may be 0:* [i], automatically also allows null - SIG_TYPE_UNINITIALIZED = 0x04, // may be FFFF:* -> not allowable, only used for comparsion + SIG_TYPE_UNINITIALIZED = 0x04, // may be FFFF:* -> not allowable, only used for comparison SIG_TYPE_OBJECT = 0x08, // may be object [o] SIG_TYPE_REFERENCE = 0x10, // may be reference [r] SIG_TYPE_LIST = 0x20, // may be list [l] SIG_TYPE_NODE = 0x40, // may be node [n] - SIG_TYPE_ERROR = 0x80, // happens, when there is a identification error - only used for comparsion + SIG_TYPE_ERROR = 0x80, // happens, when there is a identification error - only used for comparison SIG_IS_INVALID = 0x100, // ptr is invalid [!] -> invalid offset SIG_IS_OPTIONAL = 0x200, // is optional SIG_NEEDS_MORE = 0x400, // needs at least one additional parameter following -- cgit v1.2.3 From 1cb53050835e443bad589d035b9a5f91b600e338 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:12:58 +0000 Subject: Fixed loading saved games from the launcher, broken in rev. 50831 svn-id: r50864 --- engines/sci/engine/kfile.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 807edc63a5..9a0827237f 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -603,11 +603,15 @@ reg_t kRestoreGame(EngineState *s, int argc, reg_t *argv) { debug(3, "kRestoreGame(%s,%d)", game_id.c_str(), savegameId); - if ((savegameId < 1000) || (savegameId > 1999)) { - warning("Savegame ID %d is not allowed", savegameId); - return TRUE_REG; + if (argv[0].isNull()) { + // Loading from the launcher, don't adjust the ID of the saved game + } else { + if ((savegameId < 1000) || (savegameId > 1999)) { + warning("Savegame ID %d is not allowed", savegameId); + return TRUE_REG; + } + savegameId -= 1000; } - savegameId -= 1000; Common::Array saves; listSavegames(saves); -- cgit v1.2.3 From ab36bdfd003d51d399e7e0c7fbf16390b6253f24 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:28:17 +0000 Subject: SCI: Fixed script bug (invalid call to kStrCpy) in Island of Dr. Brain, room 260 (Hominy Homonym puzzle) svn-id: r50865 --- engines/sci/engine/kernel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 1e97671613..18439bc7bc 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -271,6 +271,12 @@ static const SciWorkaroundEntry kUnLoad_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kStrCpy_workarounds[] = { + { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + struct SciKernelMapSubEntry { SciVersion fromVersion; SciVersion toVersion; @@ -613,7 +619,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, kStrCpy_workarounds }, { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, -- cgit v1.2.3 From eb617f02db56ae757efc9d7108ee9730003fbd99 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:34:14 +0000 Subject: Whitespace/layout svn-id: r50866 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 18439bc7bc..6a7f61147d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -273,7 +273,7 @@ static const SciWorkaroundEntry kUnLoad_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 + { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 1ae8d1689d116454f1c6c41391b860bab9bdd9e7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 14 Jul 2010 02:36:49 +0000 Subject: Oops... whitespace/layout again (I'm tired...) svn-id: r50867 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 6a7f61147d..56713766aa 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -273,7 +273,7 @@ static const SciWorkaroundEntry kUnLoad_workarounds[] = { // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 + { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From bc0c3061100a87d14a75c72296124b741e713218 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 04:33:35 +0000 Subject: If the ALSA driver hasn't been opened, closing it should do nothing. This keeps ScummVM from crashing if, for instance, someone accidentally closes the driver twice. svn-id: r50870 --- backends/midi/alsa.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index a82fffdf0d..6a1a8e88ae 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -150,10 +150,13 @@ int MidiDriver_ALSA::open() { } void MidiDriver_ALSA::close() { - _isOpen = false; - MidiDriver_MPU401::close(); - if (seq_handle) - snd_seq_close(seq_handle); + if (_isOpen) { + _isOpen = false; + MidiDriver_MPU401::close(); + if (seq_handle) + snd_seq_close(seq_handle); + } else + warning("MidiDriver_ALSA: Closing the driver before opening it"); } void MidiDriver_ALSA::send(uint32 b) { -- cgit v1.2.3 From 3cb59d237e85805eeab377ec8d571a76d83cd029 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 04:34:57 +0000 Subject: Don't close the MIDI driver twice. It's unnecessary, and some of our drivers may crash. (The ALSA one did, until a few minutes ago.) svn-id: r50871 --- engines/saga/music.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index 8b7654d689..fcf27cc845 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -177,7 +177,6 @@ Music::~Music() { _vm->getTimerManager()->removeTimerProc(&musicVolumeGaugeCallback); _mixer->stopHandle(_musicHandle); _driver->setTimerCallback(NULL, NULL); - _driver->close(); delete _driver; _parser->setMidiDriver(NULL); delete _parser; -- cgit v1.2.3 From 67601273002a43134d23202eed759c1691ea16dc Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 04:42:27 +0000 Subject: The new buffer has to be one byte longer than the length of the 'buffer' string. (Error spotted by cppcheck.) Also, there's no need to use sprintf() where a strcpy() will do just as well. (It's tempting, but probably not appropriate, to use strdup(). I'm guessing the buffer *has* to be allocated with 'new'.) svn-id: r50872 --- engines/m4/converse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/m4/converse.cpp b/engines/m4/converse.cpp index 11bc165811..af26a86313 100644 --- a/engines/m4/converse.cpp +++ b/engines/m4/converse.cpp @@ -858,8 +858,8 @@ void Converse::loadConversationMads(const char *convName) { if (buffer[curPos - 1] == '\0') { // end of string //printf("%s\n", buffer); - buf = new char[strlen(buffer)]; - sprintf(buf, "%s", buffer); + buf = new char[strlen(buffer) + 1]; + strcpy(buf, buffer); _convStrings.push_back(buf); curPos = 0; *buffer = 0; -- cgit v1.2.3 From d5ff65bc023c5e68db8a3fed4dc4cf6decc6356e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 14 Jul 2010 05:04:55 +0000 Subject: Fix valgrind warning. svn-id: r50873 --- graphics/video/codecs/cinepak.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/graphics/video/codecs/cinepak.cpp b/graphics/video/codecs/cinepak.cpp index d3448bb8f7..9892f9d966 100644 --- a/graphics/video/codecs/cinepak.cpp +++ b/graphics/video/codecs/cinepak.cpp @@ -53,8 +53,11 @@ CinepakDecoder::CinepakDecoder() : Codec() { } CinepakDecoder::~CinepakDecoder() { - if (_curFrame.surface) + if (_curFrame.surface) { _curFrame.surface->free(); + delete _curFrame.surface; + } + delete[] _curFrame.strips; } -- cgit v1.2.3 From 646ea5828c091ef59c0c97f2cfdc02a67aa99f95 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 09:00:44 +0000 Subject: SCI: moving hack signature for kDoSound(play) to SCI1LATE only, adding comment about this and changing signature for SCI1EARLY back to what it was. svn-id: r50874 --- engines/sci/engine/kernel.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 56713766aa..1be3a63a8f 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -341,17 +341,11 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, - // DoSound (play) is called by 2 methods of the Sound object: play and - // playBed. The methods are the same, apart from the second integer - // parameter: it's 0 in play and 1 in playBed, to distinguish the caller. - // In SCI2, the playBed method is removed (thus the second parameter - // is now meaningless), and in SCI2.1 the second parameter is removed - // altogether. Thus, make the second parameter optional and check for - // its existence inside the function itself, so that the signature - // doesn't bomb out in SCI2.1 games. Another way would be to add SCI - // version checking here, but until then this is the only way to prevent - // the signature check from failing in SCI2.1 games. - { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "o(i)", NULL }, + { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, + // ^^ FIXME: In SCI1-SCI1.1 DoSound (play) is called by 2 methods of the Sound object: play and + // playBed. The methods are the same, apart from the second integer parameter: it's 0 in + // play and 1 in playBed, to distinguish the caller. It's passed on, we should find out what + // it actually does internally { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, @@ -369,7 +363,12 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), "o(i)", NULL }, + // ^^ HACK: In SCI2, the playBed method is removed (thus the second parameter + // is now meaningless, but it's still passed and needed), and in SCI2.1 the second parameter is removed + // altogether. We should actually create a new sound version called SCI21 to change the signature only + // for this version and above. There should be no signature here at all, so that the signature for SCI1LATE + // is taken from SCI1EARLY. { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, -- cgit v1.2.3 From 1ec55288c6bd9f037799446c897240f0b5b88973 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 09:04:41 +0000 Subject: SCI: replacing fixme with todo svn-id: r50875 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 1be3a63a8f..edb3799b70 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -342,7 +342,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, - // ^^ FIXME: In SCI1-SCI1.1 DoSound (play) is called by 2 methods of the Sound object: play and + // ^^ TODO: In SCI1-SCI1.1 DoSound (play) is called by 2 methods of the Sound object: play and // playBed. The methods are the same, apart from the second integer parameter: it's 0 in // play and 1 in playBed, to distinguish the caller. It's passed on, we should find out what // it actually does internally -- cgit v1.2.3 From ef0119498b738193757b8e62f90827c5d92589d0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 10:45:42 +0000 Subject: SCI: changing SIG_SCI2 back to SIG_SCI32, because all those signatures are meant for SCI2+, not SCI2 only. Changing SIG_SCI21 to only mean SCI2.1 instead of SCI2.1+, making main signature and mapping of kList exclusive to SCI2.1 svn-id: r50876 --- engines/sci/engine/kernel.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index edb3799b70..7c877089e0 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -297,9 +297,10 @@ struct SciKernelMapSubEntry { #define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 #define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE #define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 + #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 -#define SIG_SCI2 SCI_VERSION_2, SCI_VERSION_NONE -#define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_NONE +#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE // SCI-Sound-Version #define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE @@ -386,7 +387,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kGraph_subops[] = { - { SIG_SCI2, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start + { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, // 3 - set palette via resource { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", NULL }, @@ -415,7 +416,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, - { SIG_SCI2, 8, MAP_CALL(PalVaryUnknown), "", NULL }, + { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, SCI_SUBOPENTRY_TERMINATOR }; @@ -496,7 +497,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_SCI2, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -546,11 +547,11 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_SCI2, SIGFOR_ALL, "(r*)", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_SCI2, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(Graph), SIG_EVERYWHERE, NULL, kGraph_subops, NULL }, { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, @@ -562,7 +563,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_SCI2, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, @@ -661,7 +662,7 @@ static SciKernelMapEntry s_kernelMap[] = { // SCI2.1 Kernel Functions { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(List), SIG_EVERYWHERE, "(.*)", kList_subops, NULL }, + { MAP_CALL(List), SIG_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL }, { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, -- cgit v1.2.3 From b1f2ea64a7c1b472114831711a6929d2e761a1e0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 11:10:33 +0000 Subject: SCI: replacing some tabs with spaces svn-id: r50877 --- engines/sci/engine/kernel.cpp | 68 +++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7c877089e0..3e1956442a 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -382,7 +382,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, - SCI_SUBOPENTRY_TERMINATOR + SCI_SUBOPENTRY_TERMINATOR }; // version, subId, function-mapping, signature, workarounds @@ -404,7 +404,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires - SCI_SUBOPENTRY_TERMINATOR + SCI_SUBOPENTRY_TERMINATOR }; // version, subId, function-mapping, signature, workarounds @@ -417,7 +417,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, - SCI_SUBOPENTRY_TERMINATOR + SCI_SUBOPENTRY_TERMINATOR }; // version, subId, function-mapping, signature, workarounds @@ -430,7 +430,7 @@ static const SciKernelMapSubEntry kPalette_subops[] = { { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, { SIG_SCIALL, 7, MAP_CALL(PaletteSave), "", NULL }, { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "i", NULL }, - SCI_SUBOPENTRY_TERMINATOR + SCI_SUBOPENTRY_TERMINATOR }; #ifdef ENABLE_SCI32 @@ -438,33 +438,33 @@ static const SciKernelMapSubEntry kPalette_subops[] = { static const SciKernelMapSubEntry kList_subops[] = { { SIG_SCI21, 0, MAP_CALL(NewList), "", NULL }, { SIG_SCI21, 1, MAP_CALL(DisposeList), "l", NULL }, - { SIG_SCI21, 2, MAP_CALL(NewNode), ".", NULL }, - { SIG_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, - { SIG_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, - { SIG_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, - { SIG_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, - { SIG_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, - { SIG_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, - { SIG_SCI21, 9, MAP_CALL(AddAfter), "lnn.", NULL }, - { SIG_SCI21, 10, MAP_CALL(AddToFront), "ln.", NULL }, - { SIG_SCI21, 11, MAP_CALL(AddToEnd), "ln.", NULL }, - { SIG_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, - { SIG_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, - { SIG_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, - { SIG_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, - { SIG_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, - { SIG_SCI21, 17, MAP_CALL(ListAt), "li", NULL }, - // FIXME: This doesn't seem to be ListIndexOf. In Torin demo, an index is - // passed as a second parameter instead of an object. Thus, it seems to - // be something like ListAt instead... If we swap the two subops though, - // Torin demo crashes complaining that it tried to send to a non-object, - // therefore the semantics might be different here - { SIG_SCI21, 18, MAP_CALL(ListIndexOf), "l[o0]", NULL }, - { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, - { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, - { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, - { SIG_SCI21, 22, MAP_CALL(Sort), "ooo", NULL }, - SCI_SUBOPENTRY_TERMINATOR + { SIG_SCI21, 2, MAP_CALL(NewNode), ".", NULL }, + { SIG_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, + { SIG_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, + { SIG_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, + { SIG_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, + { SIG_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, + { SIG_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, + { SIG_SCI21, 9, MAP_CALL(AddAfter), "lnn.", NULL }, + { SIG_SCI21, 10, MAP_CALL(AddToFront), "ln.", NULL }, + { SIG_SCI21, 11, MAP_CALL(AddToEnd), "ln.", NULL }, + { SIG_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, + { SIG_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, + { SIG_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, + { SIG_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, + { SIG_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, + { SIG_SCI21, 17, MAP_CALL(ListAt), "li", NULL }, + // FIXME: This doesn't seem to be ListIndexOf. In Torin demo, an index is + // passed as a second parameter instead of an object. Thus, it seems to + // be something like ListAt instead... If we swap the two subops though, + // Torin demo crashes complaining that it tried to send to a non-object, + // therefore the semantics might be different here + { SIG_SCI21, 18, MAP_CALL(ListIndexOf), "l[o0]", NULL }, + { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, + { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, + { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, + { SIG_SCI21, 22, MAP_CALL(Sort), "ooo", NULL }, + SCI_SUBOPENTRY_TERMINATOR }; #endif @@ -506,8 +506,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, - // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro - // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same + // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro + // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, @@ -538,7 +538,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, - // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake + // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, -- cgit v1.2.3 From 539d10ea11b1335613bbf4901f6952c8d97c07d3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 11:29:55 +0000 Subject: SCI: adding sound version 2.1, to properly add sci2.1 signature for kDoSound(play) svn-id: r50878 --- engines/sci/engine/features.cpp | 4 ++++ engines/sci/engine/kernel.cpp | 32 ++++++++++++++++++++++++++------ engines/sci/sound/midiparser_sci.cpp | 2 ++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index fee6e69da7..71f99dbbf5 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -140,6 +140,10 @@ SciVersion GameFeatures::detectDoSoundType() { // This game is using early SCI0 sound code (different headers than // SCI0 late) _doSoundType = SCI_VERSION_0_EARLY; +#ifdef ENABLE_SCI32 + } else if (getSciVersion() >= SCI_VERSION_2_1) { + _doSoundType = SCI_VERSION_2_1; +#endif } else if (SELECTOR(nodePtr) == -1) { // No nodePtr selector, so this game is definitely using newer // SCI0 sound code (i.e. SCI_VERSION_0_LATE) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 3e1956442a..2a30e783b3 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -306,6 +306,7 @@ struct SciKernelMapSubEntry { #define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE #define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY #define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE +#define SIG_SOUNDSCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 #define SIGFOR_ALL 0x3f #define SIGFOR_DOS 1 << 0 @@ -364,12 +365,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), "o(i)", NULL }, - // ^^ HACK: In SCI2, the playBed method is removed (thus the second parameter - // is now meaningless, but it's still passed and needed), and in SCI2.1 the second parameter is removed - // altogether. We should actually create a new sound version called SCI21 to change the signature only - // for this version and above. There should be no signature here at all, so that the signature for SCI1LATE - // is taken from SCI1EARLY. + { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, @@ -382,6 +378,30 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, + { SIG_SOUNDSCI21, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI21, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI21, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI21, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, + { SIG_SOUNDSCI21, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, + { SIG_SOUNDSCI21, 6, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI21, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI21, 8, MAP_CALL(DoSoundPlay), "o", NULL }, + // ^^ TODO: if this is really the only change between SCI1LATE AND SCI21, we could rename the + // SIG_SOUNDSCI1LATE #define to SIG_SINCE_SOUNDSCI1LATE and make it being SCI1LATE+. Although + // I guess there are many more changes somewhere + { SIG_SOUNDSCI21, 9, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI21, 10, MAP_CALL(DoSoundPause), NULL, NULL }, + { SIG_SOUNDSCI21, 11, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI21, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, + { SIG_SOUNDSCI21, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI21, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, + { SIG_SOUNDSCI21, 15, MAP_CALL(DoSoundSetPriority), NULL, NULL }, + { SIG_SOUNDSCI21, 16, MAP_CALL(DoSoundSetLoop), NULL, NULL }, + { SIG_SOUNDSCI21, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, + { SIG_SOUNDSCI21, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, + { SIG_SOUNDSCI21, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, + { SIG_SOUNDSCI21, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, SCI_SUBOPENTRY_TERMINATOR }; diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 3321811701..1ae0777113 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -516,6 +516,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { break; case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: + case SCI_VERSION_2_1: _dataincToAdd = 1; break; default: @@ -672,6 +673,7 @@ void MidiParser_SCI::setVolume(byte volume) { case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: + case SCI_VERSION_2_1: // Send previous channel volumes again to actually update the volume for (int i = 0; i < 15; i++) if (_channelRemap[i] != -1) -- cgit v1.2.3 From 76f6449431e28b7530c94698467499139ffce860 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 11:34:44 +0000 Subject: SCI: changing signature of kDoSound(play) in SCI2.1 to "o(i)" now, because qfg4 still uses "oi" calling svn-id: r50879 --- engines/sci/engine/kernel.cpp | 4 +++- engines/sci/resource_audio.cpp | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 2a30e783b3..d536682480 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -386,10 +386,12 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI21, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, { SIG_SOUNDSCI21, 6, MAP_CALL(DoSoundInit), NULL, NULL }, { SIG_SOUNDSCI21, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI21, 8, MAP_CALL(DoSoundPlay), "o", NULL }, + { SIG_SOUNDSCI21, 8, MAP_CALL(DoSoundPlay), "o(i)", NULL }, // ^^ TODO: if this is really the only change between SCI1LATE AND SCI21, we could rename the // SIG_SOUNDSCI1LATE #define to SIG_SINCE_SOUNDSCI1LATE and make it being SCI1LATE+. Although // I guess there are many more changes somewhere + // TODO: Quest for Glory 4 (SCI2.1) uses the old scheme, we need to detect it accordingly + // signature for SCI21 should be "o" { SIG_SOUNDSCI21, 9, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI21, 10, MAP_CALL(DoSoundPause), NULL, NULL }, { SIG_SOUNDSCI21, 11, MAP_CALL(DoSoundFade), NULL, NULL }, diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 13aa81cb24..08e05f5ccd 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -543,6 +543,7 @@ SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVers case SCI_VERSION_1_EARLY: case SCI_VERSION_1_LATE: + case SCI_VERSION_2_1: data = resource->data; // Count # of tracks _trackCount = 0; -- cgit v1.2.3 From ede8fead945ea2901d6e812d4d6a8e44b4677c55 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 11:41:24 +0000 Subject: SCI: changing kList(18) into StubNull, so that torin demo works a little more till we figure out what's supposed to be in there svn-id: r50880 --- engines/sci/engine/kernel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d536682480..7d5338531d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -480,8 +480,8 @@ static const SciKernelMapSubEntry kList_subops[] = { // passed as a second parameter instead of an object. Thus, it seems to // be something like ListAt instead... If we swap the two subops though, // Torin demo crashes complaining that it tried to send to a non-object, - // therefore the semantics might be different here - { SIG_SCI21, 18, MAP_CALL(ListIndexOf), "l[o0]", NULL }, + // therefore the semantics might be different here (signature was l[o0]) + { SIG_SCI21, 18, MAP_CALL(StubNull), "li", NULL }, { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, -- cgit v1.2.3 From f456b7cfa242994e156009210102358b66cff9e5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 11:53:12 +0000 Subject: SCI: separating qfg1ega and qfg1vga gameids svn-id: r50881 --- engines/sci/detection.cpp | 8 +++++--- engines/sci/detection_tables.h | 6 +++--- engines/sci/engine/vm.cpp | 2 +- engines/sci/graphics/screen.cpp | 2 +- engines/sci/sci.h | 1 + 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index eb2c989e0d..541b41d012 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -56,7 +56,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = { {"lsl2", "Leisure Suit Larry 2: Goes Looking for Love (in Several Wrong Places)"}, {"lsl3", "Leisure Suit Larry 3: Passionate Patti in Pursuit of the Pulsating Pectorals"}, {"pq2", "Police Quest II: The Vengeance"}, - {"qfg1", "Quest for Glory I: So You Want to Be a Hero"}, // EGA is SCI0, VGA SCI1.1 + {"qfg1", "Quest for Glory I: So You Want to Be a Hero"}, {"sq3", "Space Quest III: The Pirates of Pestulon"}, // === SCI01 games ======================================================== {"qfg2", "Quest for Glory II: Trial by Fire"}, @@ -89,6 +89,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = { {"hoyle4", "Hoyle Classic Card Games"}, {"kq6", "King's Quest VI: Heir Today, Gone Tomorrow"}, {"laurabow2", "Laura Bow 2: The Dagger of Amon Ra"}, + {"qfg1vga", "Quest for Glory I: So You Want to Be a Hero"}, {"qfg3", "Quest for Glory III: Wages of War"}, {"sq5", "Space Quest V: The Next Mutation"}, {"islandbrain", "The Island of Dr. Brain"}, @@ -178,6 +179,7 @@ static const GameIdStrToEnum s_gameIdStrToEnum[] = { { "pq4", GID_PQ4 }, { "pqswat", GID_PQSWAT }, { "qfg1", GID_QFG1 }, + { "qfg1vga", GID_QFG1VGA }, { "qfg2", GID_QFG2 }, { "qfg3", GID_QFG3 }, { "qfg4", GID_QFG4 }, @@ -332,7 +334,7 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R // or qfg4 full (SCI2) // qfg1 VGA doesn't have view 1 if (!resMan->testResource(ResourceId(kResourceTypeView, 1))) - return "qfg1"; + return "qfg1vga"; // qfg4 full is SCI2 if (getSciVersion() == SCI_VERSION_2) @@ -587,7 +589,7 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl !strcmp(s_fallbackDesc.gameid, "sq1sci")) s_fallbackDesc.extra = "VGA Remake"; - if (!strcmp(s_fallbackDesc.gameid, "qfg1") && getSciVersion() == SCI_VERSION_1_1) + if (!strcmp(s_fallbackDesc.gameid, "qfg1vga") && getSciVersion() == SCI_VERSION_1_1) s_fallbackDesc.extra = "VGA Remake"; // Add "demo" to the description for demos diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index aa1e26e0f4..12705f2fa8 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2252,7 +2252,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Quest for Glory 1 VGA Remake - English DOS // Executable scanning reports "2.000.411" - {"qfg1", "VGA Remake", { + {"qfg1vga", "VGA Remake", { {"resource.map", 0, "a731fb6c9c0b282443f7027bc8694d4c", 8469}, {"resource.000", 0, "ecace1a2771846b1a8aa1afdd44111a0", 6570147}, {NULL, 0, NULL, 0}}, @@ -2261,7 +2261,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Quest for Glory 1 VGA Remake - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.001.029 - {"qfg1", "VGA Remake, Demo", { + {"qfg1vga", "VGA Remake, Demo", { {"resource.map", 0, "ac0257051c95a59c0cdc0be24d9b11fa", 729}, {"resource.000", 0, "ec6f5cf369054dd3e5392995e9975b9e", 768218}, {NULL, 0, NULL, 0}}, @@ -2270,7 +2270,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Quest for Glory 1 VGA Remake - English Macintosh Floppy // VERSION file reports "2.0" - {"qfg1", "VGA Remake", { + {"qfg1vga", "VGA Remake", { {"Data1", 0, "14f26bc75f24bb1ecc94532df17b5371", 1768155}, {"Data2", 0, "a7aee8bd46fc9cef7fd3bea93ef173e0", 6586422}, {NULL, 0, NULL, 0}}, diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 08645c1dd0..e645dc0d03 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -626,7 +626,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (!strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the // returnVal selector, which doesn't affect gameplay, thus don't diplay it - } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == GID_QFG1) { + } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == GID_QFG1VGA) { // QFG1VGA has a script bug in the longSong object when invoking the // loop selector, which doesn't affect gameplay, thus don't diplay it } else if (!strcmp(objectName, "PuzPiece") && selector == 77 && g_sci->getGameId() == GID_CASTLEBRAIN) { diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 488bb83ab3..131a3d2eb8 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -127,7 +127,7 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { // the icon bar. Of course, both KQ6 and QFG1 VGA differ in size. if (g_sci->getGameId() == GID_KQ6) initGraphics(_displayWidth, _displayHeight + 26, _displayWidth > 320); - else if (g_sci->getGameId() == GID_QFG1) + else if (g_sci->getGameId() == GID_QFG1VGA) initGraphics(_displayWidth, _displayHeight + 20, _displayWidth > 320); else error("Unknown SCI1.1 Mac game"); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index c15f87e4e2..4768ca11b9 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -153,6 +153,7 @@ enum SciGameId { GID_PQ4, GID_PQSWAT, GID_QFG1, + GID_QFG1VGA, GID_QFG2, GID_QFG3, GID_QFG4, -- cgit v1.2.3 From f796fd6cf39c322b7482faee771be666c217480e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 14 Jul 2010 11:55:15 +0000 Subject: Preliminary implementation of lots of code related to player movement svn-id: r50882 --- engines/m4/mads_player.cpp | 317 +++++++++++++++++++++++++++++++++++++++++++-- engines/m4/mads_player.h | 26 ++++ engines/m4/mads_scene.cpp | 38 +++++- engines/m4/mads_scene.h | 12 +- engines/m4/rails.h | 2 + 5 files changed, 383 insertions(+), 12 deletions(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 8531a3ed44..a671854e88 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -35,20 +35,27 @@ const int MadsPlayer::_directionListIndexes[32] = { MadsPlayer::MadsPlayer() { _playerPos = Common::Point(160, 78); - _direction = 0; - _newDirection = 0; + _ticksAmount = 3; _forceRefresh = true; _stepEnabled = true; - _ticksAmount = 3; - _priorTimer = 0; _visible = true; - _priorVisible = false; - _visible3 = false; _yScale = 0; _moving = false; + _spriteListStart = 0; - _spriteListIdx = 0; + //TODO:unknown vars + _special = 0; + _next = 0; + _unk4 = false; + _spritesChanged = true; + + _direction = 0; + _newDirection = 0; + _priorTimer = 0; + _priorVisible = false; + _visible3 = false; + _spriteListIdx = 0; _currentScale = 0; strcpy(_spritesPrefix, ""); for (int idx = 0; idx < 8; ++idx) @@ -59,6 +66,8 @@ MadsPlayer::MadsPlayer() { _frameCount = 0; _frameListIndex = 0; _actionIndex = 0; + _routeCount = 0; + resetActionList(); } @@ -168,7 +177,7 @@ void MadsPlayer::update() { _madsVm->scene()->_spriteSlots[slotIndex] = slot; } - // TODO: Meaning of word_844c0 block + // TODO: Meaning of _v844c0 block } } @@ -325,6 +334,34 @@ void MadsPlayer::nextFrame() { } } +void MadsPlayer::setDest(int destX, int destY, int facing) { + resetActionList(); + setTicksAmount(); + _moving = true; + _destFacing = facing; + + _madsVm->scene()->getSceneResources().setRouteNode(_madsVm->scene()->getSceneResources()._nodes.size() - 2, + _playerPos, _madsVm->scene()->_depthSurface); + _madsVm->scene()->getSceneResources().setRouteNode(_madsVm->scene()->getSceneResources()._nodes.size() - 1, + Common::Point(destX, destY), _madsVm->scene()->_depthSurface); + + bool v = _madsVm->scene()->getDepthHighBit(Common::Point(destX, destY)); + setupRoute(v); + _next = 0; + + if (_routeCount > 0) { + Common::Point srcPos = _playerPos; + for (int routeCtr = _routeCount - 1; (routeCtr >= 0) && (_next == 0); --routeCtr) { + int idx = _routeIndexes[routeCtr]; + const Common::Point &pt = _madsVm->scene()->getSceneResources()._nodes[idx].pt; + + _next = scanPath(_madsVm->scene()->_depthSurface, srcPos, pt); + srcPos = pt; + } + } +} + + int MadsPlayer::getScale(int yp) { MadsSceneResources &r = _madsVm->scene()->getSceneResources(); @@ -411,7 +448,98 @@ void MadsPlayer::idle() { } void MadsPlayer::move() { - // TODO: Handle player movement + bool routeFlag = false; + + if (_moving) { + int idx = _routeCount; + while (!_v844C0 && (_destPos.x == _playerPos.x) && (_destPos.y == _playerPos.y)) { + if (idx != 0) { + --idx; + SceneNode &node = _madsVm->scene()->getSceneResources()._nodes[_routeIndexes[idx]]; + _destPos = node.pt; + routeFlag = true; + } else if (_v844BE == idx) { + // End of walking path + _routeCount = 0; + _moving = false; + turnToDestFacing(); + routeFlag = true; + idx = _routeCount; + } else { + _v844C0 = _v844BE; + _v844BC = true; + _v844BE = 0; + _stepEnabled = true; + routeFlag = false; + } + + if (!_moving) + break; + } + _routeCount = idx; + } + + if (routeFlag && _moving) + startMovement(); + + if (_newDirection != _direction) + dirChanged(); + else if (!_moving) + updateFrame(); + + int var1 = _unk1; + if (_unk4 && (_hypotenuse > 0)) { + int v1 = -(_currentScale - 100) * (_posDiff.x - 1) / _hypotenuse + _currentScale; + var1 = MAX(1, 10000 / (v1 * _currentScale * var1)); + } + + if (!_moving || (_direction != _newDirection)) + return; + + Common::Point newPos = _playerPos; + + if (_v8452E < var1) { + do { + if (_v8452C < _posDiff.x) + _v8452C += _posDiff.y; + if (_v8452C >= _posDiff.x) { + if ((_posChange.y <= 0) || (_v844C0 != 0)) + newPos.y += _yDirection; + --_posChange.y; + _v8452C -= _posDiff.x; + } + + if (_v8452C < _posDiff.x) { + if ((_posChange.x <= 0) || (_v844C0 != 0)) + newPos.x += _xDirection; + --_posChange.x; + } + + if ((_v844BC == 0) && (_v844C0 == 0) && (_v844BE == 0)) { + routeFlag = _madsVm->scene()->getDepthHighBit(newPos); + + if (_special == 0) + _special = _madsVm->scene()->getDepthHighBits(newPos); + } + + _v8452E += _v84530; + + } while ((_v8452E < var1) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0))); + } + + if (routeFlag) + moveComplete(); + else { + if (!_v844C0) { + // If the move is complete, make sure the position is exactly on the given destination + if (_posChange.x == 0) + newPos.x = _destPos.x; + if (_posChange.y == 0) + newPos.y = _destPos.y; + } + + _playerPos = newPos; + } } void MadsPlayer::dirChanged() { @@ -451,4 +579,175 @@ void MadsPlayer::dirChanged() { _priorTimer += 1; } +void MadsPlayer::moveComplete() { + reset(); + //todo: Unknown flag +} + +void MadsPlayer::reset() { + _destPos = _playerPos; + _destFacing = 5; + _newDirection = _direction; + + _moving = false; + _v844BC = false; + _v844C0 = false; + _v844BE = 0; + _next = 0; + _routeCount = 0; +} + +/** + * Scans along an edge connecting two points within the depths/walk surface, and returns the information of the first + * pixel high nibble encountered with a non-zero value + */ +int MadsPlayer::scanPath(M4Surface *depthSurface, const Common::Point &srcPos, const Common::Point &destPos) { + // For compressed depth surfaces, always return 0 + if (_madsVm->scene()->getSceneResources()._depthStyle != 2) + return 0; + + int yDiff = destPos.y - srcPos.y; + int yAmount = MADS_SURFACE_WIDTH; + + if (yDiff < 0) { + yDiff = -yDiff; + yAmount = -yAmount; + } + + int xDiff = destPos.x - srcPos.y; + int xDirection = 1; + int xAmount = 0; + if (xDiff < 0) { + xDiff = -xDiff; + xDirection = -xDirection; + xAmount = MIN(yDiff, xDiff); + } + + ++xDiff; + ++yDiff; + + const byte *srcP = depthSurface->getBasePtr(srcPos.x, srcPos.y); + int index = xAmount; + + // Outer horizontal movement loop + for (int yIndex = 0; yIndex < yDiff; ++yIndex) { + index += yDiff; + int v = (*srcP && 0x7F) >> 4; + if (v) + return v; + + // Inner loop for handling vertical movement + while (index >= xDiff) { + index -= xDiff; + + int v = (*srcP && 0x7F) >> 4; + if (v) + return v; + + srcP += yAmount; + } + + srcP += xDirection; + } + + return 0; +} + +/** + * Starts a player moving to a given destination + */ +void MadsPlayer::startMovement() { + int xDiff = _destPos.x - _playerPos.x; + int yDiff = _destPos.y - _playerPos.y; + int srcScale = getScale(_playerPos.y); + int destScale = getScale(_destPos.y); + + // Sets the X direction + if (xDiff > 0) + _xDirection = 1; + else if (xDiff < 0) + _xDirection = -1; + else + _xDirection = 0; + + // Sets the Y direction + if (yDiff > 0) + _yDirection = 1; + else if (yDiff < 0) + _yDirection = -1; + else + _yDirection = 0; + + xDiff = ABS(xDiff); + yDiff = ABS(yDiff); + int scaleDiff = ABS(srcScale - destScale); + + int xAmt100 = xDiff * 100; + int yAmt100 = yDiff * 100; + int xAmt33 = xDiff * 33; + + int scaleAmount = (_unk4 ? scaleDiff * 3 : 0) + 100 * yDiff / 100; + int scaleAmount100 = scaleAmount * 100; + + // Figure out direction that will need to be moved in + int majorDir; + if (xDiff == 0) + majorDir = 1; + else if (yDiff == 0) + majorDir = 3; + else { + if ((scaleAmount >= xDiff) && ((xAmt33 / scaleAmount) >= 141)) + majorDir = 3; + else if (yDiff <= xDiff) + majorDir = 2; + else if ((scaleAmount100 / xDiff) >= 141) + majorDir = 1; + else + majorDir = 2; + } + + switch (majorDir) { + case 1: + _newDirection = (_yDirection <= 0) ? 8 : 2; + break; + case 2: { + _newDirection = ((_yDirection <= 0) ? 9 : 3) - ((_xDirection <= 0) ? 2 : 0); + break; + } + case 3: + _newDirection = (_xDirection <= 0) ? 4 : 6; + break; + default: + break; + } + + _hypotenuse = SqrtF16(xAmt100 * xAmt100 + yAmt100 * yAmt100); + _posDiff.x = xDiff + 1; + _posDiff.y = yDiff + 1; + _posChange.x = xDiff; + _posChange.y = yDiff; + + scaleAmount = MAX(xDiff, yDiff); + _v84530 = (scaleAmount == 0) ? 0 : _hypotenuse / scaleAmount; + + if (_playerPos.x > _destPos.x) + _v8452C = MAX(_posChange.x, _posChange.y); + else + _v8452C = 0; + + _hypotenuse /= 100; + _v8452E = -_v84530; +} + +void MadsPlayer::turnToDestFacing() { + if (_destFacing != 5) + _newDirection = _destFacing; +} + +void MadsPlayer::setupRoute(bool bitFlag) { + // TODO: Properly Implement route setup + _routeIndexes[0] = _madsVm->scene()->getSceneResources()._nodes.size() - 1; + _routeCount = 1; +} + } // End of namespace M4 diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index 65ed9ef89c..2fbba70664 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -31,6 +31,7 @@ namespace M4 { #define PLAYER_SEQ_INDEX -2 +#define MAX_ROUTE_NODES 22 class MadsPlayer { private: @@ -42,12 +43,18 @@ private: void idle(); void move(); void dirChanged(); + void reset(); + int scanPath(M4Surface *depthSurface, const Common::Point &srcPos, const Common::Point &destPos); + void startMovement(); public: char _spritesPrefix[16]; int _spriteSetCount; bool _spriteSetsPresent[8]; Common::Point _playerPos; Common::Point _destPos; + Common::Point _posChange; + Common::Point _posDiff; + int _hypotenuse; uint32 _priorTimer; uint _ticksAmount; int16 _direction, _newDirection; @@ -70,6 +77,21 @@ public: int _actionList2[12]; int _unk2; int _unk3; + int _xDirection, _yDirection; + int _destFacing; + int _special; + int _next; + int _routeCount; + int _routeOffset; + int _tempRoute[MAX_ROUTE_NODES]; + int _routeIndexes[MAX_ROUTE_NODES]; + bool _unk4; + bool _v844BC; + int _v844BE; + bool _v844C0; + int _v8452E; + int _v8452C; + int _v84530; static const int _directionListIndexes[32]; public: @@ -81,6 +103,10 @@ public: void setupFrame(); void step(); void nextFrame(); + void setDest(int destX, int destY, int facing); + void turnToDestFacing(); + void setupRoute(bool bitFlag); + void moveComplete(); }; } // End of namespace M4 diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index e4f84aeb5a..ba2bbc07e2 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -48,6 +48,17 @@ static const int SCROLLER_DELAY = 200; //-------------------------------------------------------------------------- +void SceneNode::load(Common::SeekableReadStream *stream) { + // Get the next data block + uint8 obj[0x30]; + stream->read(obj, 0x30); + + pt.x = READ_LE_UINT16(&obj[0]); + pt.y = READ_LE_UINT16(&obj[2]); +} + +//-------------------------------------------------------------------------- + MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResources), MadsView(this) { _vm = vm; _activeAnimation = NULL; @@ -265,6 +276,10 @@ void MadsScene::leftClick(int x, int y) { statusText[0] = toupper(statusText[0]); // capitalize first letter setStatusText(statusText); } + + // **DEBUG** - being used for movement testing + _madsVm->_player.moveComplete(); + _madsVm->_player.setDest(x, y, 2); } void MadsScene::rightClick(int x, int y) { @@ -503,6 +518,22 @@ void MadsScene::loadAnimation(const Common::String &animName, int abortTimers) { _activeAnimation = anim; } +bool MadsScene::getDepthHighBit(const Common::Point &pt) { + const byte *p = _depthSurface->getBasePtr(pt.x, pt.y); + if (_sceneResources._depthStyle == 2) + return ((*p << 4) & 0x80) != 0; + + return (*p & 0x80) != 0; +} + +bool MadsScene::getDepthHighBits(const Common::Point &pt) { + if (_sceneResources._depthStyle == 2) + return 0; + + const byte *p = _depthSurface->getBasePtr(pt.x, pt.y); + return (*p & 0x70) >> 4; +} + /*--------------------------------------------------------------------------*/ MadsAction::MadsAction() { @@ -733,9 +764,9 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su // Load in any scene objects for (int i = 0; i < objectCount; ++i) { - MadsObject rec; + SceneNode rec; rec.load(stream); - _objects.push_back(rec); + _nodes.push_back(rec); } for (int i = 0; i < 20 - objectCount; ++i) stream->skip(48); @@ -810,6 +841,9 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su delete depthSurface; } +void MadsSceneResources::setRouteNode(int nodeIndex, const Common::Point &pt, M4Surface *depthSurface) { + // TODO +} /*--------------------------------------------------------------------------*/ diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index e671dfb194..5a8897802a 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -37,6 +37,13 @@ class MadsInterfaceView; #define DEPTH_BANDS_SIZE 15 +class SceneNode { +public: + Common::Point pt; + + void load(Common::SeekableReadStream *stream); +}; + class MadsSceneResources: public SceneResources { public: int _sceneId; @@ -44,7 +51,7 @@ public: int _depthStyle; int _width; int _height; - Common::Array _objects; + Common::Array _nodes; Common::Array _setNames; int _yBandsStart, _yBandsEnd; int _maxScale, _minScale; @@ -55,6 +62,7 @@ public: void load(int sceneId, const char *resName, int v0, M4Surface *depthSurface, M4Surface *surface); int bandsRange() const { return _yBandsEnd - _yBandsStart; } int scaleRange() const { return _maxScale - _minScale; } + void setRouteNode(int nodeIndex, const Common::Point &pt, M4Surface *depthSurface); }; enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; @@ -138,6 +146,8 @@ public: MadsSceneResources &getSceneResources() { return _sceneResources; } MadsAction &getAction() { return _action; } void setStatusText(const char *text) {}//***DEPRECATED*** + bool getDepthHighBit(const Common::Point &pt); + bool getDepthHighBits(const Common::Point &pt); }; #define CHEAT_SEQUENCE_MAX 8 diff --git a/engines/m4/rails.h b/engines/m4/rails.h index a7add5a8eb..e3183c243f 100644 --- a/engines/m4/rails.h +++ b/engines/m4/rails.h @@ -93,6 +93,8 @@ private: bool isLineWalkable(int x0, int y0, int x1, int y1); }; +long SqrtF16(long n); + } // End of namespace M4 #endif -- cgit v1.2.3 From ec65befa3c2b91188d6f7a45acee43b1a325e09f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 14 Jul 2010 14:05:08 +0000 Subject: Silence gcc warning. svn-id: r50883 --- engines/m4/mads_player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index a671854e88..7a16938248 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -640,7 +640,7 @@ int MadsPlayer::scanPath(M4Surface *depthSurface, const Common::Point &srcPos, c while (index >= xDiff) { index -= xDiff; - int v = (*srcP && 0x7F) >> 4; + v = (*srcP && 0x7F) >> 4; if (v) return v; -- cgit v1.2.3 From df49298f39fad9c57d4b68c1ff6c10351080e2f6 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 14 Jul 2010 14:09:48 +0000 Subject: Update comments about the SCI2/2.1 kernel table. The SCI3 table is also different from both of them. svn-id: r50884 --- engines/sci/engine/kernel32.cpp | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index eab1b90139..f484a8bc45 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -180,7 +180,7 @@ static const char *sci2_default_knames[] = { /*0x89*/ "TextWidth", /*0x8a*/ "PointSize", - // GK2 Demo only kernel functions + // GK2 Demo (and similar) only kernel functions /*0x8b*/ "AddLine", /*0x8c*/ "DeleteLine", /*0x8d*/ "UpdateLine", @@ -291,7 +291,7 @@ static const char *sci21_default_knames[] = { /*0x53*/ "MapKeyToDir", /*0x54*/ "HaveMouse", /*0x55*/ "SetCursor", - /*0x56*/ "VibrateMouse", // NOTE: Not in SCI3, instead replaced by Dummy. + /*0x56*/ "VibrateMouse", /*0x57*/ "Dummy", /*0x58*/ "Dummy", /*0x59*/ "Dummy", @@ -336,7 +336,7 @@ static const char *sci21_default_knames[] = { /*0x80*/ "Dummy", /*0x81*/ "Dummy", /*0x82*/ "Dummy", - /*0x83*/ "PrintDebug", // used by the Shivers 2 demo + /*0x83*/ "PrintDebug", // used by Shivers 2 (demo and full) /*0x84*/ "Dummy", /*0x85*/ "Dummy", /*0x86*/ "Dummy", @@ -359,8 +359,6 @@ static const char *sci21_default_knames[] = { /*0x97*/ "SetWindowsOption", // Windows only /*0x98*/ "GetWindowsOption", // Windows only /*0x99*/ "WinDLL", // Windows only - - // SCI3 /*0x9a*/ "Dummy", /*0x9b*/ "Dummy", /*0x9c*/ "DeletePic" @@ -369,8 +367,7 @@ static const char *sci21_default_knames[] = { enum { kKernelEntriesSci2 = 0x8b, kKernelEntriesGk2Demo = 0xa0, - kKernelEntriesSci21 = 0x9a, - kKernelEntriesSci3 = 0x9d + kKernelEntriesSci21 = 0x9d }; void Kernel::setKernelNamesSci2() { @@ -379,9 +376,9 @@ void Kernel::setKernelNamesSci2() { void Kernel::setKernelNamesSci21(GameFeatures *features) { // Some SCI games use a modified SCI2 kernel table instead of the - // SCI2.1/SCI3 kernel table. The GK2 demo does this as well as at - // least one version of KQ7. We detect which version to use based on - // where kDoSound is called from Sound::play(). + // SCI2.1 kernel table. The GK2 demo does this as well as at least + // one version of KQ7 (1.4). We detect which version to use based on + // how kDoSound is called from Sound::play(). // This is interesting because they all have the same interpreter // version (2.100.002), yet they would not be compatible with other @@ -392,10 +389,8 @@ void Kernel::setKernelNamesSci21(GameFeatures *features) { // OnMe is IsOnMe here, but they should be compatible _kernelNames[0x23] = "Robot"; // Graph in SCI2 _kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2 - } else { - // TODO: Differentiate between SCI2.1/3 - _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci3); - } + } else + _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21); } // SCI2 Kernel Functions -- cgit v1.2.3 From 36fdc68b2bdaea952213460ee1475ddea70cc210 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 14 Jul 2010 14:18:40 +0000 Subject: The LSL7 demo is SCI2.1 so we should detect it even when ENABLE_SCI3_GAMES is not defined. svn-id: r50886 --- engines/sci/detection_tables.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 12705f2fa8..5c2a30f282 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1706,6 +1706,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, + // Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691) + // SCI interpreter version 2.100.002 + {"lsl7", "Demo", { + {"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878}, + {"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + #ifdef ENABLE_SCI3_GAMES // Larry 7 - English DOS CD (from spookypeanut) // SCI interpreter version 3.000.000 @@ -1747,14 +1755,6 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691) - // SCI interpreter version 2.100.002 - {"lsl7", "Demo", { - {"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878}, - {"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Lighthouse - English Windows Demo (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.00" {"lighthouse", "Demo", { -- cgit v1.2.3 From 14e25d138c20060067d0986eeeaf20d912ada0e6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 14:55:22 +0000 Subject: SCI: fix regression of r50831 - we want to abort when unknown savegameIds are used, not the other way round :P svn-id: r50887 --- engines/sci/engine/kfile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 9a0827237f..3848d413f2 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -541,7 +541,7 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { if ((virtualId >= SAVEGAMEID_OFFICIALRANGE_START) && (virtualId <= SAVEGAMEID_OFFICIALRANGE_END)) { // savegameId is an actual Id, so search for it just to make sure savegameId = virtualId - SAVEGAMEID_OFFICIALRANGE_START; - if (findSavegame(saves, savegameId) != -1) + if (findSavegame(saves, savegameId) == -1) return NULL_REG; } else if (virtualId < SAVEGAMEID_OFFICIALRANGE_START) { // virtualId is low, we assume that scripts expect us to create new slot -- cgit v1.2.3 From 25077baf6a665e56806bf6f7d050d6462d39ec5b Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 16:55:32 +0000 Subject: Moved setTileData() into GdiPCEngine since that's the only class that uses it. svn-id: r50888 --- engines/scumm/gfx.cpp | 2 +- engines/scumm/gfx.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 298917477f..44e41feb9f 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -2823,7 +2823,7 @@ void GdiPCEngine::decodePCEngineObject(const byte *ptr, int xpos, int ypos, int free(stripOffsets); } -void setTileData(byte *tile, int index, byte byte0, byte byte1) { +void GdiPCEngine::setTileData(byte *tile, int index, byte byte0, byte byte1) { int row = index % 8; int plane = (index / 8) * 2; int plane02Bit, plane13Bit; diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h index 108fd4555d..cdb473a67c 100644 --- a/engines/scumm/gfx.h +++ b/engines/scumm/gfx.h @@ -322,6 +322,7 @@ protected: protected: void decodePCEngineGfx(const byte *room); void decodeStrip(const byte *ptr, uint16 *tiles, byte *colors, uint16 *masks, int numRows, bool isObject); + void setTileData(byte *tile, int index, byte byte0, byte byte1); void decodePCEngineTileData(const byte *ptr); void decodePCEngineMaskData(const byte *ptr); void decodePCEngineObject(const byte *ptr, int xpos, int ypos, int width, int height); -- cgit v1.2.3 From b91ef128975c6f253bed6c7720f4ead9e1ab0dc6 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 16:57:16 +0000 Subject: Fixed typo in comment. svn-id: r50889 --- engines/scumm/gfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 44e41feb9f..7b0d4909d6 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -1482,7 +1482,7 @@ void GdiV2::prepareDrawBitmap(const byte *ptr, VirtScreen *vs, // Since V3, all graphics data was encoded in strips, which is very efficient // for redrawing only parts of the screen. However, V2 is different: here // the whole graphics are encoded as one big chunk. That makes it rather - // dificult to draw only parts of a room/object. We handle the V2 graphics + // difficult to draw only parts of a room/object. We handle the V2 graphics // differently from all other (newer) graphic formats for this reason. // StripTable *table = (_objectMode ? 0 : _roomStrips); -- cgit v1.2.3 From f98fa72ef38ed2fd0239d59bda07acdb33b831c8 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 14 Jul 2010 17:02:14 +0000 Subject: Changed abs() to ABS() in a few places. svn-id: r50890 --- engines/draci/walking.cpp | 4 ++-- engines/drascula/actors.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/draci/walking.cpp b/engines/draci/walking.cpp index e57972fbc5..02612832d2 100644 --- a/engines/draci/walking.cpp +++ b/engines/draci/walking.cpp @@ -324,7 +324,7 @@ void WalkingMap::drawOverlayRectangle(const Common::Point &p, byte colour, byte } int WalkingMap::pointsBetween(const Common::Point &p1, const Common::Point &p2) { - return MAX(abs(p2.x - p1.x), abs(p2.y - p1.y)); + return MAX(ABS(p2.x - p1.x), ABS(p2.y - p1.y)); } Common::Point WalkingMap::interpolate(const Common::Point &p1, const Common::Point &p2, int i, int n) { @@ -636,7 +636,7 @@ bool WalkingState::walkOnNextEdge() { Movement WalkingState::animationForDirection(const Common::Point &here, const Common::Point &there) { const int dx = there.x - here.x; const int dy = there.y - here.y; - if (abs(dx) >= abs(dy)) { + if (ABS(dx) >= ABS(dy)) { return dx >= 0 ? kMoveRight : kMoveLeft; } else { return dy >= 0 ? kMoveDown : kMoveUp; diff --git a/engines/drascula/actors.cpp b/engines/drascula/actors.cpp index 33cb7fd478..8523b5b158 100644 --- a/engines/drascula/actors.cpp +++ b/engines/drascula/actors.cpp @@ -312,9 +312,9 @@ void DrasculaEngine::quadrant_2() { float distanceX, distanceY; if (currentChapter == 2) - distanceX = abs(curX + curWidth - roomX); + distanceX = ABS(curX + curWidth - roomX); else - distanceX = abs(curX + curWidth / 2 - roomX); + distanceX = ABS(curX + curWidth / 2 - roomX); distanceY = (curY + curHeight) - roomY; @@ -354,9 +354,9 @@ void DrasculaEngine::quadrant_4() { float distanceX, distanceY; if (currentChapter == 2) - distanceX = abs(curX + curWidth - roomX); + distanceX = ABS(curX + curWidth - roomX); else - distanceX = abs(curX + curWidth / 2 - roomX); + distanceX = ABS(curX + curWidth / 2 - roomX); distanceY = roomY - (curY + curHeight); -- cgit v1.2.3 From 6c22d599ecf84c9d3a7fbce9203ab67b3974e465 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 14 Jul 2010 17:04:53 +0000 Subject: Fix non-PCSPK sound types in AGI. svn-id: r50891 --- engines/agi/agi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 4a994b731a..ce8b5931af 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -580,7 +580,7 @@ void AgiEngine::initialize() { } else if (getPlatform() == Common::kPlatformCoCo3) { _soundemu = SOUND_EMU_COCO3; } else { - switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK))) { + switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK|MDT_ADLIB|MDT_PCJR|MDT_MIDI))) { case MT_PCSPK: _soundemu = SOUND_EMU_PC; break; -- cgit v1.2.3 From a694c5ddcf213cea56b0ed81334083edaa129f02 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 19:12:31 +0000 Subject: SCI: adding workaround for qfg1vga script bug (div on object) which occurs when entering inn svn-id: r50892 --- engines/sci/engine/vm.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e645dc0d03..34f47adc4b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -337,6 +337,29 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w return make_reg(0xFFFF, 0xFFFF); } +static bool validate_signedInteger(reg_t reg, int16 &integer) { + if (reg.segment) + return false; + integer = (int16)reg.offset; + return true; +} + +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry opcodeDivWorkarounds[] = { + { GID_QFG1VGA, 928, 0, "Blink", "init", -1, 0, { 0, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +extern const char *opcodeNames[]; // from scriptdebug.cpp + +static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaroundEntry *workaroundList, reg_t value1, reg_t value2) { + SciTrackOriginReply originReply; + reg_t workaroundValue = trackOriginAndFindWorkaround(0, workaroundList, &originReply); + if ((workaroundValue.segment == 0xFFFF) && (workaroundValue.offset == 0xFFFF)) + error("%s on non-integer (%04x:%04x, %04x:%04x) from method %s::%s (script %d, localCall %x)", opcodeNames[opcode], PRINT_REG(value1), PRINT_REG(value2), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + return workaroundValue; +} + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu @@ -1154,8 +1177,13 @@ void run_vm(EngineState *s, bool restoring) { break; case op_div: { // 0x04 (04) - int16 divisor = signed_validate_arithmetic(s->r_acc); - s->r_acc = make_reg(0, (divisor != 0 ? ((int16)POP()) / divisor : 0)); + r_temp = POP32(); + int16 divisor; + int16 dividend; + if (validate_signedInteger(s->r_acc, divisor) && validate_signedInteger(r_temp, dividend)) + s->r_acc = make_reg(0, (divisor != 0 ? dividend / divisor : 0)); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeDivWorkarounds, s->r_acc, r_temp); break; } case op_mod: { // 0x05 (05) -- cgit v1.2.3 From 40ed004b18731c873524b4f3d7d6d6551ca00769 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 21:00:59 +0000 Subject: SCI: removing hardcoded size when drawing list controls - fixes load/save dialog in lsl6 svn-id: r50894 --- engines/sci/graphics/controls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp index ff5a91eed4..126b163e38 100644 --- a/engines/sci/graphics/controls.cpp +++ b/engines/sci/graphics/controls.cpp @@ -89,7 +89,7 @@ void GfxControls::drawListControl(Common::Rect rect, reg_t obj, int16 maxChars, _text16->SetFont(fontId); fontSize = _ports->_curPort->fontHeight; _ports->penColor(_ports->_curPort->penClr); _ports->backColor(_ports->_curPort->backClr); - workerRect.bottom = workerRect.top + 9; + workerRect.bottom = workerRect.top + fontSize; lastYpos = rect.bottom - fontSize; // Write actual text -- cgit v1.2.3 From 5e2758394cbc767ea1a3f30c7812c5f588346e1d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 21:17:56 +0000 Subject: SCI: returning DOS error code on kFileIO(unlink) svn-id: r50895 --- engines/sci/engine/kfile.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 3848d413f2..eab2ece301 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -782,6 +782,8 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { case K_FILEIO_UNLINK : { Common::String name = s->_segMan->getString(argv[1]); Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + bool result; + // SQ4 floppy prepends /\ to the filenames if (name.hasPrefix("/\\")) { name.deleteChar(0); @@ -800,17 +802,16 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { listSavegames(saves); int savedir_nr = saves[slotNum].id; name = g_sci->getSavegameName(savedir_nr); - saveFileMan->removeSavefile(name); + result = saveFileMan->removeSavefile(name); } else { const Common::String wrappedName = g_sci->wrapFilename(name); - saveFileMan->removeSavefile(wrappedName); + result = saveFileMan->removeSavefile(wrappedName); } debugC(2, kDebugLevelFile, "kFileIO(unlink): %s", name.c_str()); - - // TODO/FIXME: Should we return something (like, a bool indicating - // whether deleting the save succeeded or failed)? - break; + if (result) + return NULL_REG; + return make_reg(0, 2); // DOS - file not found error code } case K_FILEIO_READ_STRING : { int size = argv[2].toUint16(); -- cgit v1.2.3 From 3195ab099a10cbe13557064fe58a7cabbb981dfd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 22:07:36 +0000 Subject: SCI: added signatures for kFileIO, some changes to actual kFileIO code, removed some CHECKMEs/TODOs svn-id: r50896 --- engines/sci/engine/kernel.cpp | 29 ++- engines/sci/engine/kernel.h | 19 ++ engines/sci/engine/kfile.cpp | 493 ++++++++++++++++++++---------------------- 3 files changed, 281 insertions(+), 260 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7d5338531d..0b19cf01ad 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -297,6 +297,7 @@ struct SciKernelMapSubEntry { #define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 #define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE #define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SINCE_SCI11 SCI_VERSION_1_1, SCI_VERSION_NONE #define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 #define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 @@ -455,6 +456,32 @@ static const SciKernelMapSubEntry kPalette_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +static const SciKernelMapSubEntry kFileIO_subops[] = { +#ifdef ENABLE_SCI32 + { SIG_SCI32, 0, MAP_CALL(FileIOOpen), "r(i)", NULL }, +#endif + { SIG_SCIALL, 0, MAP_CALL(FileIOOpen), "ri", NULL }, + { SIG_SCIALL, 1, MAP_CALL(FileIOClose), "i", NULL }, + { SIG_SCIALL, 2, MAP_CALL(FileIOReadRaw), "iri", NULL }, + { SIG_SCIALL, 3, MAP_CALL(FileIOWriteRaw), "iri", NULL }, + { SIG_SCIALL, 4, MAP_CALL(FileIOUnlink), "r", NULL }, + { SIG_SCIALL, 5, MAP_CALL(FileIOReadString), "rii", NULL }, + { SIG_SCIALL, 6, MAP_CALL(FileIOWriteString), "ir", NULL }, + { SIG_SCIALL, 7, MAP_CALL(FileIOSeek), "iii", NULL }, + { SIG_SCIALL, 8, MAP_CALL(FileIOFindFirst), "rri", NULL }, + { SIG_SCIALL, 9, MAP_CALL(FileIOFindNext), "r", NULL }, + { SIG_SCIALL, 10, MAP_CALL(FileIOExists), "r", NULL }, + { SIG_SINCE_SCI11, 11, MAP_CALL(FileIORename), "rr", NULL }, +#ifdef ENABLE_SCI32 + { SIG_SCI32, 13, MAP_CALL(FileIOReadByte), "i", NULL }, + { SIG_SCI32, 14, MAP_CALL(FileIOWriteByte), "ii", NULL }, + { SIG_SCI32, 15, MAP_CALL(FileIOReadWord), "i", NULL }, + { SIG_SCI32, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, + { SIG_SCI32, 19, MAP_CALL(Stub), "", NULL }, // for Torin demo +#endif + SCI_SUBOPENTRY_TERMINATOR +}; + #ifdef ENABLE_SCI32 // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kList_subops[] = { @@ -553,7 +580,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, - { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", kFileIO_subops, NULL }, { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 3bb5827d45..aab7a9bd26 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -519,6 +519,25 @@ reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv); reg_t kPaletteSave(EngineState *s, int argc, reg_t *argv); reg_t kPaletteRestore(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOUnlink(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOFindFirst(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOFindNext(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOExists(EngineState *s, int argc, reg_t *argv); +reg_t kFileIORename(EngineState *s, int argc, reg_t *argv); +#ifdef ENABLE_SCI32 +reg_t kFileIOReadByte(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOWriteByte(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOReadWord(EngineState *s, int argc, reg_t *argv); +reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv); +#endif + //@} } // End of namespace Sci diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index eab2ece301..27ae7f1493 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -98,7 +98,7 @@ enum { -void file_open(EngineState *s, const char *filename, int mode) { +reg_t file_open(EngineState *s, const char *filename, int mode) { // QfG3 character import prepends /\ to the filenames. if (filename[0] == '/' && filename[1] == '\\') filename += 2; @@ -154,8 +154,7 @@ void file_open(EngineState *s, const char *filename, int mode) { if (!inFile && !outFile) { // Failed debugC(2, kDebugLevelFile, " -> file_open() failed"); - s->r_acc = SIGNAL_REG; - return; + return SIGNAL_REG; } // Find a free file handle @@ -172,9 +171,8 @@ void file_open(EngineState *s, const char *filename, int mode) { s->_fileHandles[handle]._out = outFile; s->_fileHandles[handle]._name = englishName; - s->r_acc = make_reg(0, handle); - debugC(2, kDebugLevelFile, " -> opened file '%s' with handle %d", englishName.c_str(), handle); + return make_reg(0, handle); } reg_t kFOpen(EngineState *s, int argc, reg_t *argv) { @@ -182,8 +180,7 @@ reg_t kFOpen(EngineState *s, int argc, reg_t *argv) { int mode = argv[1].toUint16(); debugC(2, kDebugLevelFile, "kFOpen(%s,0x%x)", name.c_str(), mode); - file_open(s, name.c_str(), mode); - return s->r_acc; + return file_open(s, name.c_str(), mode); } static FileHandle *getFileFromHandle(EngineState *s, uint handle) { @@ -647,28 +644,6 @@ reg_t kValidPath(EngineState *s, int argc, reg_t *argv) { return make_reg(0, 1); } -enum { - K_FILEIO_OPEN = 0, - K_FILEIO_CLOSE = 1, - K_FILEIO_READ_RAW = 2, - K_FILEIO_WRITE_RAW = 3, - K_FILEIO_UNLINK = 4, - K_FILEIO_READ_STRING = 5, - K_FILEIO_WRITE_STRING = 6, - K_FILEIO_SEEK = 7, - K_FILEIO_FIND_FIRST = 8, - K_FILEIO_FIND_NEXT = 9, - K_FILEIO_FILE_EXISTS = 10, - // SCI1.1 - K_FILEIO_RENAME = 11, - // SCI32 - // 12? - K_FILEIO_READ_BYTE = 13, - K_FILEIO_WRITE_BYTE = 14, - K_FILEIO_READ_WORD = 15, - K_FILEIO_WRITE_WORD = 16 -}; - reg_t DirSeeker::firstFile(const Common::String &mask, reg_t buffer, SegManager *segMan) { // Verify that we are given a valid buffer if (!buffer.segment) { @@ -709,264 +684,264 @@ reg_t DirSeeker::nextFile(SegManager *segMan) { } reg_t kFileIO(EngineState *s, int argc, reg_t *argv) { - int func_nr = argv[0].toUint16(); + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} - switch (func_nr) { - case K_FILEIO_OPEN : { - Common::String name = s->_segMan->getString(argv[1]); +reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { + Common::String name = s->_segMan->getString(argv[0]); - // SCI32 can call K_FILEIO_OPEN with only two arguments. It seems to - // just be checking if it exists. - int mode = (argc < 3) ? (int)_K_FILE_MODE_OPEN_OR_FAIL : argv[2].toUint16(); + // SCI32 can call K_FILEIO_OPEN with only one argument. It seems to + // just be checking if it exists. + int mode = (argc < 2) ? (int)_K_FILE_MODE_OPEN_OR_FAIL : argv[1].toUint16(); - // SQ4 floppy prepends /\ to the filenames - if (name.hasPrefix("/\\")) { - name.deleteChar(0); - name.deleteChar(0); - } + // SQ4 floppy prepends /\ to the filenames + if (name.hasPrefix("/\\")) { + name.deleteChar(0); + name.deleteChar(0); + } - // SQ4 floppy attempts to update the savegame index file sq4sg.dir when - // deleting saved games. We don't use an index file for saving or - // loading, so just stop the game from modifying the file here in order - // to avoid having it saved in the ScummVM save directory. - if (name == "sq4sg.dir") { - debugC(2, kDebugLevelFile, "Not opening unused file sq4sg.dir"); - return SIGNAL_REG; - } + // SQ4 floppy attempts to update the savegame index file sq4sg.dir when + // deleting saved games. We don't use an index file for saving or + // loading, so just stop the game from modifying the file here in order + // to avoid having it saved in the ScummVM save directory. + if (name == "sq4sg.dir") { + debugC(2, kDebugLevelFile, "Not opening unused file sq4sg.dir"); + return SIGNAL_REG; + } - if (name.empty()) { - warning("Attempted to open a file with an empty filename"); - return SIGNAL_REG; - } - debugC(2, kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode); - file_open(s, name.c_str(), mode); - break; + if (name.empty()) { + warning("Attempted to open a file with an empty filename"); + return SIGNAL_REG; } - case K_FILEIO_CLOSE : { - debugC(2, kDebugLevelFile, "kFileIO(close): %d", argv[1].toUint16()); + debugC(2, kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode); + return file_open(s, name.c_str(), mode); +} - FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); - if (f) - f->close(); - break; +reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) { + debugC(2, kDebugLevelFile, "kFileIO(close): %d", argv[0].toUint16()); + + FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); + if (f) { + f->close(); + return SIGNAL_REG; } - case K_FILEIO_READ_RAW : { - int handle = argv[1].toUint16(); - int size = argv[3].toUint16(); - char *buf = new char[size]; - debugC(2, kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size); + return NULL_REG; +} + +reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv) { + int handle = argv[0].toUint16(); + int size = argv[2].toUint16(); + int bytesRead = 0; + char *buf = new char[size]; + debugC(2, kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size); - FileHandle *f = getFileFromHandle(s, handle); - if (f) { - s->r_acc = make_reg(0, f->_in->read(buf, size)); - s->_segMan->memcpy(argv[2], (const byte*)buf, size); - } + FileHandle *f = getFileFromHandle(s, handle); + if (f) { + bytesRead = f->_in->read(buf, size); + s->_segMan->memcpy(argv[1], (const byte*)buf, size); + } - delete[] buf; - break; + delete[] buf; + return make_reg(0, bytesRead); +} + +reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv) { + int handle = argv[0].toUint16(); + int size = argv[2].toUint16(); + char *buf = new char[size]; + bool success = false; + s->_segMan->memcpy((byte*)buf, argv[1], size); + debugC(2, kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size); + + FileHandle *f = getFileFromHandle(s, handle); + if (f) { + f->_out->write(buf, size); + success = true; } - case K_FILEIO_WRITE_RAW : { - int handle = argv[1].toUint16(); - int size = argv[3].toUint16(); - char *buf = new char[size]; - s->_segMan->memcpy((byte*)buf, argv[2], size); - debugC(2, kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size); - FileHandle *f = getFileFromHandle(s, handle); - if (f) - f->_out->write(buf, size); + delete[] buf; + if (success) + return NULL_REG; + return make_reg(0, 6); // DOS - invalid handle +} - delete[] buf; - break; +reg_t kFileIOUnlink(EngineState *s, int argc, reg_t *argv) { + Common::String name = s->_segMan->getString(argv[0]); + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + bool result; + + // SQ4 floppy prepends /\ to the filenames + if (name.hasPrefix("/\\")) { + name.deleteChar(0); + name.deleteChar(0); + } + + // Special case for SQ4 floppy: This game has hardcoded names for all of + // its savegames, and they are all named "sq4sg.xxx", where xxx is the + // slot. We just take the slot number here, and delete the appropriate + // save game. + if (name.hasPrefix("sq4sg.")) { + // Special handling for SQ4... get the slot number and construct the + // save game name. + int slotNum = atoi(name.c_str() + name.size() - 3); + Common::Array saves; + listSavegames(saves); + int savedir_nr = saves[slotNum].id; + name = g_sci->getSavegameName(savedir_nr); + result = saveFileMan->removeSavefile(name); + } else { + const Common::String wrappedName = g_sci->wrapFilename(name); + result = saveFileMan->removeSavefile(wrappedName); } - case K_FILEIO_UNLINK : { - Common::String name = s->_segMan->getString(argv[1]); - Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); - bool result; - // SQ4 floppy prepends /\ to the filenames - if (name.hasPrefix("/\\")) { - name.deleteChar(0); - name.deleteChar(0); - } + debugC(2, kDebugLevelFile, "kFileIO(unlink): %s", name.c_str()); + if (result) + return NULL_REG; + return make_reg(0, 2); // DOS - file not found error code +} - // Special case for SQ4 floppy: This game has hardcoded names for all of - // its savegames, and they are all named "sq4sg.xxx", where xxx is the - // slot. We just take the slot number here, and delete the appropriate - // save game. - if (name.hasPrefix("sq4sg.")) { - // Special handling for SQ4... get the slot number and construct the - // save game name. - int slotNum = atoi(name.c_str() + name.size() - 3); - Common::Array saves; - listSavegames(saves); - int savedir_nr = saves[slotNum].id; - name = g_sci->getSavegameName(savedir_nr); - result = saveFileMan->removeSavefile(name); - } else { - const Common::String wrappedName = g_sci->wrapFilename(name); - result = saveFileMan->removeSavefile(wrappedName); - } +reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv) { + int size = argv[1].toUint16(); + char *buf = new char[size]; + int handle = argv[2].toUint16(); + debugC(2, kDebugLevelFile, "kFileIO(readString): %d, %d", handle, size); - debugC(2, kDebugLevelFile, "kFileIO(unlink): %s", name.c_str()); - if (result) - return NULL_REG; - return make_reg(0, 2); // DOS - file not found error code - } - case K_FILEIO_READ_STRING : { - int size = argv[2].toUint16(); - char *buf = new char[size]; - int handle = argv[3].toUint16(); - debugC(2, kDebugLevelFile, "kFileIO(readString): %d, %d", handle, size); + fgets_wrapper(s, buf, size, handle); + s->_segMan->memcpy(argv[0], (const byte*)buf, size); + delete[] buf; + return argv[1]; +} - fgets_wrapper(s, buf, size, handle); - s->_segMan->memcpy(argv[1], (const byte*)buf, size); - delete[] buf; - return argv[1]; - } - case K_FILEIO_WRITE_STRING : { - int handle = argv[1].toUint16(); - int size = argv[3].toUint16(); - Common::String str = s->_segMan->getString(argv[2]); - debugC(2, kDebugLevelFile, "kFileIO(writeString): %d, %d", handle, size); - - // CHECKME: Is the size parameter used at all? - // In the LSL5 password protection it is zero, and we should - // then write a full string. (Not sure if it should write the - // terminating zero.) - - FileHandle *f = getFileFromHandle(s, handle); - if (f) - f->_out->write(str.c_str(), str.size()); - break; - } - case K_FILEIO_SEEK : { - int handle = argv[1].toUint16(); - int offset = argv[2].toUint16(); - int whence = argv[3].toUint16(); - debugC(2, kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence); +reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) { + int handle = argv[0].toUint16(); + Common::String str = s->_segMan->getString(argv[1]); + debugC(2, kDebugLevelFile, "kFileIO(writeString): %d", handle); + + FileHandle *f = getFileFromHandle(s, handle); + if (f) + f->_out->write(str.c_str(), str.size()); + return NULL_REG; + return make_reg(0, 6); // DOS - invalid handle +} + +reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv) { + int handle = argv[0].toUint16(); + int offset = argv[1].toUint16(); + int whence = argv[2].toUint16(); + debugC(2, kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence); - FileHandle *f = getFileFromHandle(s, handle); - if (f) - s->r_acc = make_reg(0, f->_in->seek(offset, whence)); - break; - } - case K_FILEIO_FIND_FIRST : { - Common::String mask = s->_segMan->getString(argv[1]); - reg_t buf = argv[2]; - int attr = argv[3].toUint16(); // We won't use this, Win32 might, though... - debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr); - - // We remove ".*". mask will get prefixed, so we will return all additional files for that gameid - if (mask == "*.*") - mask = "*"; - - // QfG3 uses this mask for the character import - if (mask == "/\\*.*") - mask = "*"; -//#ifndef WIN32 -// if (mask == "*.*") -// mask = "*"; // For UNIX -//#endif - s->r_acc = s->_dirseeker.firstFile(mask, buf, s->_segMan); + FileHandle *f = getFileFromHandle(s, handle); + if (f) + s->r_acc = make_reg(0, f->_in->seek(offset, whence)); + return SIGNAL_REG; +} - break; - } - case K_FILEIO_FIND_NEXT : { - debugC(2, kDebugLevelFile, "kFileIO(findNext)"); - s->r_acc = s->_dirseeker.nextFile(s->_segMan); - break; - } - case K_FILEIO_FILE_EXISTS : { - Common::String name = s->_segMan->getString(argv[1]); +reg_t kFileIOFindFirst(EngineState *s, int argc, reg_t *argv) { + Common::String mask = s->_segMan->getString(argv[0]); + reg_t buf = argv[1]; + int attr = argv[2].toUint16(); // We won't use this, Win32 might, though... + debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr); - // Check for regular file - bool exists = Common::File::exists(name); - Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); - const Common::String wrappedName = g_sci->wrapFilename(name); + // We remove ".*". mask will get prefixed, so we will return all additional files for that gameid + if (mask == "*.*") + mask = "*"; - if (!exists) - exists = !saveFileMan->listSavefiles(name).empty(); + // QfG3 uses this mask for the character import + if (mask == "/\\*.*") + mask = "*"; + return s->_dirseeker.firstFile(mask, buf, s->_segMan); +} - if (!exists) { - // Try searching for the file prepending target- - Common::SeekableReadStream *inFile = saveFileMan->openForLoading(wrappedName); - exists = (inFile != 0); - delete inFile; - } +reg_t kFileIOFindNext(EngineState *s, int argc, reg_t *argv) { + debugC(2, kDebugLevelFile, "kFileIO(findNext)"); + return s->_dirseeker.nextFile(s->_segMan); +} - // Special case for non-English versions of LSL5: The English version of - // LSL5 calls kFileIO(), case K_FILEIO_OPEN for reading to check if - // memory.drv exists (which is where the game's password is stored). If - // it's not found, it calls kFileIO() again, case K_FILEIO_OPEN for - // writing and creates a new file. Non-English versions call kFileIO(), - // case K_FILEIO_FILE_EXISTS instead, and fail if memory.drv can't be - // found. We create a default memory.drv file with no password, so that - // the game can continue. - if (!exists && name == "memory.drv") { - // Create a new file, and write the bytes for the empty password - // string inside - byte defaultContent[] = { 0xE9, 0xE9, 0xEB, 0xE1, 0x0D, 0x0A, 0x31, 0x30, 0x30, 0x30 }; - Common::WriteStream *outFile = saveFileMan->openForSaving(wrappedName); - for (int i = 0; i < 10; i++) - outFile->writeByte(defaultContent[i]); - outFile->finalize(); - delete outFile; - exists = true; - } +reg_t kFileIOExists(EngineState *s, int argc, reg_t *argv) { + Common::String name = s->_segMan->getString(argv[0]); - debugC(2, kDebugLevelFile, "kFileIO(fileExists) %s -> %d", name.c_str(), exists); - return make_reg(0, exists); - } - case K_FILEIO_RENAME: { - Common::String oldName = s->_segMan->getString(argv[1]); - Common::String newName = s->_segMan->getString(argv[2]); + // Check for regular file + bool exists = Common::File::exists(name); + Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); + const Common::String wrappedName = g_sci->wrapFilename(name); + + if (!exists) + exists = !saveFileMan->listSavefiles(name).empty(); + + if (!exists) { + // Try searching for the file prepending target- + Common::SeekableReadStream *inFile = saveFileMan->openForLoading(wrappedName); + exists = (inFile != 0); + delete inFile; + } + + // Special case for non-English versions of LSL5: The English version of + // LSL5 calls kFileIO(), case K_FILEIO_OPEN for reading to check if + // memory.drv exists (which is where the game's password is stored). If + // it's not found, it calls kFileIO() again, case K_FILEIO_OPEN for + // writing and creates a new file. Non-English versions call kFileIO(), + // case K_FILEIO_FILE_EXISTS instead, and fail if memory.drv can't be + // found. We create a default memory.drv file with no password, so that + // the game can continue. + if (!exists && name == "memory.drv") { + // Create a new file, and write the bytes for the empty password + // string inside + byte defaultContent[] = { 0xE9, 0xE9, 0xEB, 0xE1, 0x0D, 0x0A, 0x31, 0x30, 0x30, 0x30 }; + Common::WriteStream *outFile = saveFileMan->openForSaving(wrappedName); + for (int i = 0; i < 10; i++) + outFile->writeByte(defaultContent[i]); + outFile->finalize(); + delete outFile; + exists = true; + } + + debugC(2, kDebugLevelFile, "kFileIO(fileExists) %s -> %d", name.c_str(), exists); + return make_reg(0, exists); +} + +reg_t kFileIORename(EngineState *s, int argc, reg_t *argv) { + Common::String oldName = s->_segMan->getString(argv[0]); + Common::String newName = s->_segMan->getString(argv[1]); + + // SCI1.1 returns 0 on success and a DOS error code on fail. SCI32 + // returns -1 on fail. We just return -1 for all versions. + if (g_engine->getSaveFileManager()->renameSavefile(oldName, newName)) + return NULL_REG; + else + return SIGNAL_REG; +} - // SCI1.1 returns 0 on success and a DOS error code on fail. SCI32 - // returns -1 on fail. We just return -1 for all versions. - if (g_engine->getSaveFileManager()->renameSavefile(oldName, newName)) - return NULL_REG; - else - return SIGNAL_REG; - } #ifdef ENABLE_SCI32 - case K_FILEIO_READ_BYTE: { - // Read the byte into the low byte of the accumulator - FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); - if (!f) - return NULL_REG; - - return make_reg(0, (s->r_acc.toUint16() & 0xff00) | f->_in->readByte()); - } - case K_FILEIO_WRITE_BYTE: { - FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); - if (f) - f->_out->writeByte(argv[2].toUint16() & 0xff); - break; - } - case K_FILEIO_READ_WORD: { - FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); - if (!f) - return NULL_REG; - - return make_reg(0, f->_in->readUint16LE()); - } - case K_FILEIO_WRITE_WORD: { - FileHandle *f = getFileFromHandle(s, argv[1].toUint16()); - if (f) - f->_out->writeUint16LE(argv[2].toUint16()); - break; - } - case 19: - // TODO: Torin's Passage uses this early on in the Sierra logo - warning("kFileIO(19)"); - break; -#endif - default: - error("kFileIO(): unknown sub-command: %d", func_nr); - } +reg_t kFileIOReadByte(EngineState *s, int argc, reg_t *argv) { + // Read the byte into the low byte of the accumulator + FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); + if (!f) + return NULL_REG; + return make_reg(0, (s->r_acc.toUint16() & 0xff00) | f->_in->readByte()); +} - return s->r_acc; +reg_t kFileIOWriteByte(EngineState *s, int argc, reg_t *argv) { + FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); + if (f) + f->_out->writeByte(argv[1].toUint16() & 0xff); + return s->r_acc; // FIXME: does this really doesn't return anything? } +reg_t kFileIOReadWord(EngineState *s, int argc, reg_t *argv) { + FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); + if (!f) + return NULL_REG; + return make_reg(0, f->_in->readUint16LE()); +} + +reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv) { + FileHandle *f = getFileFromHandle(s, argv[0].toUint16()); + if (f) + f->_out->writeUint16LE(argv[1].toUint16()); + return s->r_acc; // FIXME: does this really doesn't return anything? +} +#endif + } // End of namespace Sci -- cgit v1.2.3 From 7c210829dd3b4b3078a5c98bda9a7224165daa82 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 14 Jul 2010 22:19:05 +0000 Subject: SCI: removing #ifdef ENABLE_SCI32 from one single line (just a waste) and adding it to kDoSound (SCI2.1) svn-id: r50897 --- engines/sci/engine/kernel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 0b19cf01ad..a6a3453ed8 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -379,6 +379,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, +#ifdef ENABLE_SCI32 { SIG_SOUNDSCI21, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI21, 1, MAP_CALL(DoSoundMute), NULL, NULL }, { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, @@ -405,6 +406,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI21, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, { SIG_SOUNDSCI21, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, { SIG_SOUNDSCI21, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, +#endif SCI_SUBOPENTRY_TERMINATOR }; @@ -457,9 +459,7 @@ static const SciKernelMapSubEntry kPalette_subops[] = { }; static const SciKernelMapSubEntry kFileIO_subops[] = { -#ifdef ENABLE_SCI32 { SIG_SCI32, 0, MAP_CALL(FileIOOpen), "r(i)", NULL }, -#endif { SIG_SCIALL, 0, MAP_CALL(FileIOOpen), "ri", NULL }, { SIG_SCIALL, 1, MAP_CALL(FileIOClose), "i", NULL }, { SIG_SCIALL, 2, MAP_CALL(FileIOReadRaw), "iri", NULL }, -- cgit v1.2.3 From 72faf78b82a6395a058d89f1e349c6831e9517a7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 15 Jul 2010 06:04:52 +0000 Subject: SCI: adding support to qfg4 to import qfg3 character data svn-id: r50911 --- engines/sci/engine/kfile.cpp | 10 ++++++---- engines/sci/sci.cpp | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 27ae7f1493..5c8179103c 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -844,13 +844,15 @@ reg_t kFileIOFindFirst(EngineState *s, int argc, reg_t *argv) { int attr = argv[2].toUint16(); // We won't use this, Win32 might, though... debugC(2, kDebugLevelFile, "kFileIO(findFirst): %s, 0x%x", mask.c_str(), attr); + // QfG3 uses "/\*.*" for the character import, QfG4 uses "/\*" + if (mask.hasPrefix("/\\")) { + mask.deleteChar(0); + mask.deleteChar(0); + } + // We remove ".*". mask will get prefixed, so we will return all additional files for that gameid if (mask == "*.*") mask = "*"; - - // QfG3 uses this mask for the character import - if (mask == "/\\*.*") - mask = "*"; return s->_dirseeker.firstFile(mask, buf, s->_segMan); } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 1ebc6a2ba3..4601092af8 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -497,8 +497,11 @@ Common::String SciEngine::getFilePrefix() const { // Quest for Glory 3 wants to read files from Quest for Glory 2 to import character data if (_gamestate->currentRoomNumber() == 54) return "qfg2"; + } else if (_gameId == GID_QFG4) { + // Quest for Glory 4 wants to read files from Quest for Glory 3 to import character data + if (_gamestate->currentRoomNumber() == 54) + return "qfg3"; } - // TODO: Implement the same for qfg4, when sci32 is good enough return _targetName; } -- cgit v1.2.3 From 13eb510baf70be80afbad8473c6992b5a5119e99 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 15 Jul 2010 10:00:32 +0000 Subject: Bugfix to the SqrtF16 function to work correctly svn-id: r50912 --- engines/m4/rails.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/m4/rails.cpp b/engines/m4/rails.cpp index fbad6995eb..11b9bcdbb9 100644 --- a/engines/m4/rails.cpp +++ b/engines/m4/rails.cpp @@ -179,7 +179,7 @@ long SqrtF16(long n) { uint32 r = 0, s; uint32 v = (uint32)n; - for (int i = 15; i <= 0; i--) { + for (int i = 15; i >= 0; --i) { s = r + (1L << i * 2); r >>= 1; if (s <= v) { -- cgit v1.2.3 From 43662625111838729d776cd13708382d9ac6b270 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 15 Jul 2010 10:51:11 +0000 Subject: Implemented the original game cheat key for displaying the current mouse cursor position svn-id: r50913 --- engines/m4/mads_scene.cpp | 21 +++++++++++++++++++-- engines/m4/mads_scene.h | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index ba2bbc07e2..3f4b0df1ff 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -66,6 +66,8 @@ MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResour MadsView::_bgSurface = Scene::_backgroundSurface; MadsView::_depthSurface = Scene::_walkSurface; _interfaceSurface = new MadsInterfaceView(vm); + _showMousePos = false; + _mouseMsgIndex = -1; } MadsScene::~MadsScene() { @@ -349,6 +351,16 @@ void MadsScene::update() { void MadsScene::updateState() { _madsVm->_player.update(); + // Handle refreshing the mouse position display + if (_mouseMsgIndex != -1) + _madsVm->scene()->_kernelMessages.remove(_mouseMsgIndex); + if (_showMousePos) { + char buffer[20]; + sprintf(buffer, "(%d,%d)", _madsVm->_mouse->currentPos().x, _madsVm->_mouse->currentPos().y); + + _mouseMsgIndex = _madsVm->scene()->_kernelMessages.add(Common::Point(5, 5), 0x203, 0, 0, 1, buffer); + } + // Step through the scene _sceneLogic.sceneStep(); @@ -1158,8 +1170,13 @@ bool MadsInterfaceView::handleCheatKey(int32 keycode) { // TODO: Move player to current destination return true; - case Common::KEYCODE_t | (Common::KEYCODE_LALT): - case Common::KEYCODE_t | (Common::KEYCODE_RALT): + case Common::KEYCODE_c | (Common::KBD_CTRL << 24): + // Toggle display of mouse position + _madsVm->scene()->_showMousePos = !_madsVm->scene()->_showMousePos; + break; + + case Common::KEYCODE_t | (Common::KEYCODE_LALT << 24): + case Common::KEYCODE_t | (Common::KEYCODE_RALT << 24): { // Teleport to room //Scene *sceneView = (Scene *)vm->_viewManager->getView(VIEWID_SCENE); diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 5a8897802a..66fefcb0c0 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -109,6 +109,7 @@ private: MadsSceneLogic _sceneLogic; SpriteAsset *_playerSprites; + int _mouseMsgIndex; void drawElements(); void loadScene2(const char *aaName, int sceneNumber); @@ -119,6 +120,7 @@ private: void setAction(); public: char _aaName[100]; + bool _showMousePos; public: MadsScene(MadsEngine *vm); virtual ~MadsScene(); -- cgit v1.2.3 From 20a0ad6833fd50ed32e660a652ab962cb75d92ca Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 15 Jul 2010 12:37:46 +0000 Subject: Bugfixes to walking code. Rex can now walk about on-screen svn-id: r50914 --- engines/m4/mads_player.cpp | 14 ++++++++------ engines/m4/mads_scene.cpp | 4 +++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 7a16938248..ff5f3464bf 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -503,14 +503,14 @@ void MadsPlayer::move() { if (_v8452C < _posDiff.x) _v8452C += _posDiff.y; if (_v8452C >= _posDiff.x) { - if ((_posChange.y <= 0) || (_v844C0 != 0)) + if ((_posChange.y > 0) || (_v844C0 != 0)) newPos.y += _yDirection; --_posChange.y; _v8452C -= _posDiff.x; } if (_v8452C < _posDiff.x) { - if ((_posChange.x <= 0) || (_v844C0 != 0)) + if ((_posChange.x > 0) || (_v844C0 != 0)) newPos.x += _xDirection; --_posChange.x; } @@ -524,9 +524,11 @@ void MadsPlayer::move() { _v8452E += _v84530; - } while ((_v8452E < var1) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0))); + } while ((_v8452E < var1) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0) || (_v844C0 != 0))); } + _v8452E -= var1; + if (routeFlag) moveComplete(); else { @@ -696,7 +698,7 @@ void MadsPlayer::startMovement() { else if (yDiff == 0) majorDir = 3; else { - if ((scaleAmount >= xDiff) && ((xAmt33 / scaleAmount) >= 141)) + if ((scaleAmount < xDiff) && ((xAmt33 / scaleAmount) >= 141)) majorDir = 3; else if (yDiff <= xDiff) majorDir = 2; @@ -727,8 +729,8 @@ void MadsPlayer::startMovement() { _posChange.x = xDiff; _posChange.y = yDiff; - scaleAmount = MAX(xDiff, yDiff); - _v84530 = (scaleAmount == 0) ? 0 : _hypotenuse / scaleAmount; + int majorChange = MAX(xDiff, yDiff); + _v84530 = (majorChange == 0) ? 0 : _hypotenuse / majorChange; if (_playerPos.x > _destPos.x) _v8452C = MAX(_posChange.x, _posChange.y); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 3f4b0df1ff..c30e8db5da 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -854,7 +854,9 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su } void MadsSceneResources::setRouteNode(int nodeIndex, const Common::Point &pt, M4Surface *depthSurface) { - // TODO + _nodes[nodeIndex].pt = pt; + + // TODO: Implement the rest of the logic of this method } /*--------------------------------------------------------------------------*/ -- cgit v1.2.3 From ddd01ffcb6a5b3766892529523c912c7c623835c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 15 Jul 2010 19:23:18 +0000 Subject: SCI: some big changes to kCantBeHere - kCantBeHere returns the actual "problem" instead of being a plain boolean - part of solving lsl1 casino door / qfg1vga gate svn-id: r50919 --- engines/sci/engine/kgraphics.cpp | 9 ++++----- engines/sci/graphics/compare.cpp | 20 ++++++++++---------- engines/sci/graphics/compare.h | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 5f258f604b..11412ac1f3 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -382,17 +382,16 @@ reg_t kCanBeHere(EngineState *s, int argc, reg_t *argv) { reg_t curObject = argv[0]; reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; - bool canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); - return make_reg(0, canBeHere); + reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); + return make_reg(0, canBeHere.isNull() ? 1 : 0); } -// kCantBeHere does the same thing as kCanBeHere, except that it returns the opposite result. reg_t kCantBeHere(EngineState *s, int argc, reg_t *argv) { reg_t curObject = argv[0]; reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; - bool canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); - return make_reg(0, !canBeHere); + reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); + return make_reg(0, canBeHere.isNull() ? 0 : 1); } reg_t kIsItSkip(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 31c2b210ce..760108ffd2 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -70,7 +70,7 @@ uint16 GfxCompare::isOnControl(uint16 screenMask, const Common::Rect &rect) { return result; } -bool GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list) { +reg_t GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list) { reg_t curAddress = list->first; Node *curNode = _segMan->lookupNode(curAddress); reg_t curObject; @@ -96,14 +96,14 @@ bool GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &c curRect.left < checkRect.right && curRect.bottom > checkRect.top && curRect.top < checkRect.bottom) { - return false; + return curObject; } } } curAddress = curNode->succ; curNode = _segMan->lookupNode(curAddress); } - return true; + return NULL_REG; } uint16 GfxCompare::kernelOnControl(byte screenMask, const Common::Rect &rect) { @@ -150,11 +150,11 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { } } -bool GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) { +reg_t GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) { Common::Rect checkRect; Common::Rect adjustedRect; uint16 signal, controlMask; - bool result; + uint16 result; checkRect.left = readSelectorValue(_segMan, curObject, SELECTOR(brLeft)); checkRect.top = readSelectorValue(_segMan, curObject, SELECTOR(brTop)); @@ -163,22 +163,22 @@ bool GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) { if (!checkRect.isValidRect()) { // can occur in Iceman - HACK? TODO: is this really occuring in sierra sci? check this warning("kCan(t)BeHere - invalid rect %d, %d -> %d, %d", checkRect.left, checkRect.top, checkRect.right, checkRect.bottom); - return false; + return NULL_REG; } adjustedRect = _coordAdjuster->onControl(checkRect); signal = readSelectorValue(_segMan, curObject, SELECTOR(signal)); controlMask = readSelectorValue(_segMan, curObject, SELECTOR(illegalBits)); - result = (isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask) ? false : true; - if ((result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) { + result = isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask; + if ((!result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) { List *list = _segMan->lookupList(listReference); if (!list) error("kCanBeHere called with non-list as parameter"); - result = canBeHereCheckRectList(curObject, checkRect, list); + return canBeHereCheckRectList(curObject, checkRect, list); } - return result; + return make_reg(0, result); } bool GfxCompare::kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position) { diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h index be461cdc5b..1079f5f98c 100644 --- a/engines/sci/graphics/compare.h +++ b/engines/sci/graphics/compare.h @@ -42,7 +42,7 @@ public: uint16 kernelOnControl(byte screenMask, const Common::Rect &rect); void kernelSetNowSeen(reg_t objectReference); - bool kernelCanBeHere(reg_t curObject, reg_t listReference); + reg_t kernelCanBeHere(reg_t curObject, reg_t listReference); bool kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position); void kernelBaseSetter(reg_t object); @@ -60,7 +60,7 @@ private: * *different* from checkObject, has a brRect which is contained inside * checkRect. */ - bool canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list); + reg_t canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list); }; } // End of namespace Sci -- cgit v1.2.3 From 6e5b537aaffab8c734cec394e80ee5ba85b5aa86 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 15 Jul 2010 19:39:43 +0000 Subject: SCI: r50919 had some temporary test code in it, removing that so it really returns the actual "problem" svn-id: r50920 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 11412ac1f3..705aaa4ddb 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -391,7 +391,7 @@ reg_t kCantBeHere(EngineState *s, int argc, reg_t *argv) { reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); - return make_reg(0, canBeHere.isNull() ? 0 : 1); + return canBeHere; } reg_t kIsItSkip(EngineState *s, int argc, reg_t *argv) { -- cgit v1.2.3 From d78eba3d187b77b9843c3cc9b583c97ee7697998 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 15 Jul 2010 21:10:50 +0000 Subject: SCI: solved lsl1 casino door, lsl6 tram disappearing and qfg1 vga gate issue - i hope this won't cause regressions, but calling the method in collision case is definitely wrong svn-id: r50921 --- engines/sci/engine/kgraphics.cpp | 8 -------- engines/sci/engine/kmovement.cpp | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 705aaa4ddb..7d5e30ed6e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -517,14 +517,6 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) { reg_t object = argv[0]; g_sci->_gfxCompare->kernelBaseSetter(object); - - // WORKAROUND for a problem in LSL1VGA. This allows the casino door to be opened, - // till the actual problem is found - if (s->currentRoomNumber() == 300 && g_sci->getGameId() == GID_LSL1) { - int top = readSelectorValue(s->_segMan, object, SELECTOR(brTop)); - writeSelectorValue(s->_segMan, object, SELECTOR(brTop), top + 2); - } - return s->r_acc; } diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index ccef3d862a..69932efabc 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -331,7 +331,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { writeSelectorValue(segMan, client, SELECTOR(signal), (signal | kSignalHitObstacle)); debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover)); - completed = 1; + // we shall not set completed in this case, sierra sci also doesn't do it } if ((getSciVersion() >= SCI_VERSION_1_EGA)) -- cgit v1.2.3 From 30238347e9b68a597f395dfe6662557de5ac3cfe Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 15 Jul 2010 21:28:48 +0000 Subject: SCI: kDoBresen now returns result of CantBeHere() like sierra sci does it, also adding another comment about r50921 svn-id: r50922 --- engines/sci/engine/kmovement.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 69932efabc..125d0b208b 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -316,14 +316,21 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d", x, y, bdi); + bool collision = false; + reg_t cantBeHere = NULL_REG; + if (SELECTOR(cantBeHere) != -1) { invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv); - s->r_acc = make_reg(0, !s->r_acc.offset); + if (!s->r_acc.isNull()) + collision = true; + cantBeHere = s->r_acc; } else { invokeSelector(s, client, SELECTOR(canBeHere), argc, argv); + if (s->r_acc.isNull()) + collision = true; } - if (!s->r_acc.offset) { // Contains the return value + if (collision) { signal = readSelectorValue(segMan, client, SELECTOR(signal)); writeSelectorValue(segMan, client, SELECTOR(x), oldx); @@ -332,12 +339,15 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover)); // we shall not set completed in this case, sierra sci also doesn't do it + // if we set call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work } if ((getSciVersion() >= SCI_VERSION_1_EGA)) if (completed) invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); + if (SELECTOR(cantBeHere) != -1) + return cantBeHere; return make_reg(0, completed); } -- cgit v1.2.3 From d20ae841dd4321cb602139e175bef42f00268fcd Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:07:30 +0000 Subject: Cleanup. svn-id: r50923 --- engines/sword2/anims.cpp | 8 -------- engines/sword2/music.cpp | 6 ++---- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/engines/sword2/anims.cpp b/engines/sword2/anims.cpp index 1bf3967047..7fd36fcc86 100644 --- a/engines/sword2/anims.cpp +++ b/engines/sword2/anims.cpp @@ -56,8 +56,6 @@ int Router::doAnimate(byte *ob_logic, byte *ob_graph, int32 animRes, bool revers ObjectGraphic obGraph(ob_graph); if (obLogic.getLooping() == 0) { - byte *ptr; - // This is the start of the anim - set up the first frame // For testing all anims! @@ -75,12 +73,8 @@ int Router::doAnimate(byte *ob_logic, byte *ob_graph, int32 animRes, bool revers return IR_STOP; } - ptr = _vm->_resman->openResource(animRes); - // if it's not an animation file if (_vm->_resman->fetchType(animRes) != ANIMATION_FILE) { - _vm->_resman->closeResource(animRes); - // switch off the sprite // don't animate - just continue // script next cycle @@ -88,8 +82,6 @@ int Router::doAnimate(byte *ob_logic, byte *ob_graph, int32 animRes, bool revers return IR_STOP; } - _vm->_resman->closeResource(animRes); - // switch on the sprite setSpriteStatus(ob_graph, SORT_SPRITE); } diff --git a/engines/sword2/music.cpp b/engines/sword2/music.cpp index a68baed097..c052aa6b46 100644 --- a/engines/sword2/music.cpp +++ b/engines/sword2/music.cpp @@ -136,10 +136,8 @@ static Audio::AudioStream *getAudioStream(SoundFileHandle *fh, const char *base, return NULL; } if (fh->fileSize != fh->file.size()) { - if (fh->idxTab) { - free(fh->idxTab); - fh->idxTab = NULL; - } + free(fh->idxTab); + fh->idxTab = NULL; } } else alreadyOpen = true; -- cgit v1.2.3 From bcb4c49a03a0eb6786ec008da522f1c3314c28f6 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:14:03 +0000 Subject: Cleanup. svn-id: r50924 --- engines/tinsel/actors.cpp | 6 ++---- engines/tinsel/bmv.cpp | 12 ++++-------- engines/tinsel/handle.cpp | 16 ++++++---------- engines/tinsel/object.cpp | 6 ++---- engines/tinsel/savescn.cpp | 6 ++---- engines/tinsel/strres.cpp | 14 +++++--------- 6 files changed, 21 insertions(+), 39 deletions(-) diff --git a/engines/tinsel/actors.cpp b/engines/tinsel/actors.cpp index efcefb442c..3577f4e0cc 100644 --- a/engines/tinsel/actors.cpp +++ b/engines/tinsel/actors.cpp @@ -197,10 +197,8 @@ void RegisterActors(int num) { } void FreeActors() { - if (actorInfo) { - free(actorInfo); - actorInfo = NULL; - } + free(actorInfo); + actorInfo = NULL; } /** diff --git a/engines/tinsel/bmv.cpp b/engines/tinsel/bmv.cpp index 938507c3f9..b13de103c0 100644 --- a/engines/tinsel/bmv.cpp +++ b/engines/tinsel/bmv.cpp @@ -730,16 +730,12 @@ void BMVPlayer::FinishBMV() { stream.close(); // Release the data buffer - if (bigBuffer != NULL) { - free(bigBuffer); - bigBuffer = NULL; - } + free(bigBuffer); + bigBuffer = NULL; // Release the screen buffer - if (screenBuffer != NULL) { - free(screenBuffer); - screenBuffer = NULL; - } + free(screenBuffer); + screenBuffer = NULL; // Ditch any text objects for (i = 0; i < 2; i++) { diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp index 60eb08a2dd..fdc4484a7c 100644 --- a/engines/tinsel/handle.cpp +++ b/engines/tinsel/handle.cpp @@ -175,22 +175,18 @@ void SetupHandleTable() { } void FreeHandleTable() { - if (handleTable) { - free(handleTable); - handleTable = NULL; - } - if (cdGraphStream) { - delete cdGraphStream; - cdGraphStream = 0; - } + free(handleTable); + handleTable = NULL; + + delete cdGraphStream; + cdGraphStream = NULL; } /** * Loads a memory block as a file. */ void OpenCDGraphFile() { - if (cdGraphStream) - delete cdGraphStream; + delete cdGraphStream; // As the theory goes, the right CD will be in there! diff --git a/engines/tinsel/object.cpp b/engines/tinsel/object.cpp index f91e37a063..7a93a0b30a 100644 --- a/engines/tinsel/object.cpp +++ b/engines/tinsel/object.cpp @@ -49,10 +49,8 @@ static int maxObj = 0; #endif void FreeObjectList() { - if (objectList) { - free(objectList); - objectList = NULL; - } + free(objectList); + objectList = NULL; } /** diff --git a/engines/tinsel/savescn.cpp b/engines/tinsel/savescn.cpp index 50231d34bb..2b5c815d3c 100644 --- a/engines/tinsel/savescn.cpp +++ b/engines/tinsel/savescn.cpp @@ -162,10 +162,8 @@ void InitialiseSaveScenes() { } void FreeSaveScenes() { - if (ssData) { - free(ssData); - ssData = NULL; - } + free(ssData); + ssData = NULL; } /** diff --git a/engines/tinsel/strres.cpp b/engines/tinsel/strres.cpp index 8f9f72f446..2416d6a8fa 100644 --- a/engines/tinsel/strres.cpp +++ b/engines/tinsel/strres.cpp @@ -88,11 +88,9 @@ void ChangeLanguage(LANGUAGE newLang) { textLanguage = newLang; sampleLanguage = newLang; - if (textBuffer) { - // free the previous buffer - free(textBuffer); - textBuffer = NULL; - } + // free the previous buffer + free(textBuffer); + textBuffer = NULL; // Try and open the specified language file. If it fails, and the language // isn't English, try falling back on opening 'english.txt' - some foreign @@ -355,10 +353,8 @@ int SubStringCount(int id) { void FreeTextBuffer() { - if (textBuffer) { - free(textBuffer); - textBuffer = NULL; - } + free(textBuffer); + textBuffer = NULL; } /** -- cgit v1.2.3 From 992a8bfd3f05fc54aee3e25905d037ad0814a469 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:14:58 +0000 Subject: Cleanup. svn-id: r50925 --- gui/ThemeParser.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index 4cabf6ad2e..c809447cbd 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -365,10 +365,8 @@ bool ThemeParser::parserCallback_drawdata(ParserNode *node) { if (_theme->addDrawData(node->values["id"], cached) == false) return parserError("Error adding Draw Data set: Invalid DrawData name."); - if (_defaultStepLocal) { - delete _defaultStepLocal; - _defaultStepLocal = 0; - } + delete _defaultStepLocal; + _defaultStepLocal = 0; return true; } -- cgit v1.2.3 From b4459fe92338d1d83cac909519174456402d716e Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:31:45 +0000 Subject: Cleanup. svn-id: r50926 --- sound/midiparser.cpp | 4 ++-- sound/midiparser_smf.cpp | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sound/midiparser.cpp b/sound/midiparser.cpp index d58471765e..929b1d8b12 100644 --- a/sound/midiparser.cpp +++ b/sound/midiparser.cpp @@ -333,7 +333,7 @@ void MidiParser::hangAllActiveNotes() { uint32 advance_tick = _position._last_event_tick; while (true) { - int i, j; + int i; for (i = 0; i < 128; ++i) if (temp_active[i] != 0) break; @@ -349,7 +349,7 @@ void MidiParser::hangAllActiveNotes() { } else if (_next_event.event == 0xFF && _next_event.ext.type == 0x2F) { // warning("MidiParser::hangAllActiveNotes(): Hit End of Track with active notes left"); for (i = 0; i < 128; ++i) { - for (j = 0; j < 16; ++j) { + for (int j = 0; j < 16; ++j) { if (temp_active[i] & (1 << j)) { activeNote(j, i, false); sendToDriver(0x80 | j, i, 0); diff --git a/sound/midiparser_smf.cpp b/sound/midiparser_smf.cpp index 4261b1d770..a9c6f1eb3b 100644 --- a/sound/midiparser_smf.cpp +++ b/sound/midiparser_smf.cpp @@ -230,10 +230,8 @@ bool MidiParser_SMF::loadMusic(byte *data, uint32 size) { // If this is a Type 1 MIDI, we need to now compress // our tracks down into a single Type 0 track. - if (_buffer) { - free(_buffer); - _buffer = 0; - } + free(_buffer); + _buffer = 0; if (midi_type == 1) { // FIXME: Doubled the buffer size to prevent crashes with the -- cgit v1.2.3 From ae1afee564070234afc0a1b4fca619b3231d4e57 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:32:59 +0000 Subject: The standalone MIDI files for one of the re-releases of Inherit the Earth are General MIDI, not MT-32. (I hope this doesn't break anything else.) svn-id: r50927 --- engines/saga/music.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index fcf27cc845..e4a16e27da 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -158,6 +158,8 @@ Music::Music(SagaEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) { _driver->setGM(_vm->getGameId() != GID_ITE); } else { _parser = MidiParser::createParser_SMF(); + // ITE with standalone MIDI files is General MIDI + _driver->setGM(_vm->getGameId() == GID_ITE); } free(resourceData); } -- cgit v1.2.3 From bde1cbd785d14ed8a45a6863aa75ff380a30541e Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:34:25 +0000 Subject: Cleanup. svn-id: r50928 --- engines/agi/wagparser.cpp | 6 ++---- engines/agi/words.cpp | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp index 1d60524070..22de66712d 100644 --- a/engines/agi/wagparser.cpp +++ b/engines/agi/wagparser.cpp @@ -100,10 +100,8 @@ void WagProperty::setDefaults() { } void WagProperty::deleteData() { - if (_propData != NULL) { - delete _propData; - _propData = NULL; - } + delete _propData; + _propData = NULL; } WagFileParser::WagFileParser() : diff --git a/engines/agi/words.cpp b/engines/agi/words.cpp index c8b22956f4..464c218ae8 100644 --- a/engines/agi/words.cpp +++ b/engines/agi/words.cpp @@ -76,10 +76,8 @@ int AgiEngine::loadWords(const char *fname) { } void AgiEngine::unloadWords() { - if (words != NULL) { - free(words); - words = NULL; - } + free(words); + words = NULL; } /** -- cgit v1.2.3 From 9fafc859199f16a693ba40d18cd5e93f49d4b2fa Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 03:35:44 +0000 Subject: Cleanup. svn-id: r50929 --- engines/agos/midi.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp index ed3e3d801b..ab5bfc4c94 100644 --- a/engines/agos/midi.cpp +++ b/engines/agos/midi.cpp @@ -346,15 +346,11 @@ void MidiPlayer::clearConstructs(MusicInfo &info) { info.num_songs = 0; } - if (info.data) { - free(info.data); - info.data = 0; - } // end if - - if (info.parser) { - delete info.parser; - info.parser = 0; - } + free(info.data); + info.data = 0; + + delete info.parser; + info.parser = 0; if (_driver) { for (i = 0; i < 16; ++i) { -- cgit v1.2.3 From 90763f6e24ae1c51f4c8a9d0486a5488ea200f61 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 05:46:07 +0000 Subject: SCI: kDoBresen - save last position of client inside mover - fixes lsl6 tram still shaking while gotten stopped due ego svn-id: r50931 --- engines/sci/engine/kmovement.cpp | 6 ++++++ engines/sci/engine/selector.cpp | 2 ++ engines/sci/engine/selector.h | 1 + 3 files changed, 9 insertions(+) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 125d0b208b..71f9632ef3 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -267,6 +267,12 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr)); axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); + if (SELECTOR(xLast) != -1) { + // Introduced SCI1MIDDLE (it seems) - save last position into mover + writeSelectorValue(segMan, mover, SELECTOR(xLast), x); + writeSelectorValue(segMan, mover, SELECTOR(yLast), y); + } + //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); if (g_sci->_features->handleMoveCount()) { diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 00480743cc..431261eb7c 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -104,6 +104,8 @@ void Kernel::mapSelectors() { FIND_SELECTOR2(b_incr, "b-incr"); FIND_SELECTOR(xStep); FIND_SELECTOR(yStep); + FIND_SELECTOR(xLast); + FIND_SELECTOR(yLast); FIND_SELECTOR(moveSpeed); FIND_SELECTOR(canBeHere); // cantBeHere FIND_SELECTOR(heading); diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index acb7912d8d..c3428c1ed7 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -69,6 +69,7 @@ struct SelectorCache { Selector dx, dy; ///< Deltas Selector b_movCnt, b_i1, b_i2, b_di, b_xAxis, b_incr; ///< Various Bresenham vars Selector xStep, yStep; ///< BR adjustments + Selector xLast, yLast; ///< BR last position of client Selector moveSpeed; ///< Used for DoBresen Selector canBeHere; ///< Funcselector: Checks for movement validity in SCI0 Selector heading, mover; ///< Used in DoAvoider -- cgit v1.2.3 From 3473e8c6da4565d3c0729ba106b5405dc6039d29 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 16 Jul 2010 08:03:26 +0000 Subject: Clarified variable used for scene node loading, and added in extra blank nodes for player movement like the original game does svn-id: r50932 --- engines/m4/mads_scene.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index c30e8db5da..1972e2d989 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -765,7 +765,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su stream->skip(24); - int objectCount = stream->readUint16LE(); + int nodeCount = stream->readUint16LE(); _yBandsEnd = stream->readUint16LE(); _yBandsStart = stream->readUint16LE(); _maxScale = stream->readSint16LE(); @@ -775,14 +775,20 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su stream->skip(2); // Load in any scene objects - for (int i = 0; i < objectCount; ++i) { + for (int i = 0; i < nodeCount; ++i) { SceneNode rec; rec.load(stream); _nodes.push_back(rec); } - for (int i = 0; i < 20 - objectCount; ++i) + for (int i = 0; i < 20 - nodeCount; ++i) stream->skip(48); + // Add two extra nodes in that will be used for player movement + for (int i = 0; i < 2; ++i) { + SceneNode rec; + _nodes.push_back(rec); + } + int setCount = stream->readUint16LE(); stream->readUint16LE(); for (int i = 0; i < setCount; ++i) { -- cgit v1.2.3 From 5356a6133872c00ce0db904047ce2624bf853e03 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 09:51:57 +0000 Subject: SCI: only use xLast/yLast in kDoBresen for sci1middle+ only. qfg1 ega has those selector names, but doesn't use them inside mover objects svn-id: r50933 --- engines/sci/engine/kmovement.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 71f9632ef3..82a232f6b4 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -267,10 +267,12 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr)); axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); - if (SELECTOR(xLast) != -1) { - // Introduced SCI1MIDDLE (it seems) - save last position into mover - writeSelectorValue(segMan, mover, SELECTOR(xLast), x); - writeSelectorValue(segMan, mover, SELECTOR(yLast), y); + if ((getSciVersion() >= SCI_VERSION_1_MIDDLE)) { + if (SELECTOR(xLast) != -1) { + // Introduced SCI1MIDDLE (it seems) - save last position into mover + writeSelectorValue(segMan, mover, SELECTOR(xLast), x); + writeSelectorValue(segMan, mover, SELECTOR(yLast), y); + } } //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); -- cgit v1.2.3 From 1e4261bab455a43f23d9b59736c67474a563d703 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 10:00:58 +0000 Subject: SCI: added comments about when xLast/yLast were exactly introduced svn-id: r50934 --- engines/sci/engine/kmovement.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 82a232f6b4..cb35aabaa9 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -268,8 +268,9 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); if ((getSciVersion() >= SCI_VERSION_1_MIDDLE)) { + // Introduced inbetween SCI1MIDDLE, lsl5 demo doesn't have it, longbow demo has if (SELECTOR(xLast) != -1) { - // Introduced SCI1MIDDLE (it seems) - save last position into mover + // save last position into mover writeSelectorValue(segMan, mover, SELECTOR(xLast), x); writeSelectorValue(segMan, mover, SELECTOR(yLast), y); } -- cgit v1.2.3 From b062488987ed43d10d404f91c52e502fe3c44a37 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 10:12:31 +0000 Subject: SCI: enable r50931 for sci1late+ only, lsl1vga doesn't like it (ego gets stuck) svn-id: r50935 --- engines/sci/engine/kmovement.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index cb35aabaa9..f94750110c 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -267,13 +267,10 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { bdelta = (int16)readSelectorValue(segMan, mover, SELECTOR(b_incr)); axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); - if ((getSciVersion() >= SCI_VERSION_1_MIDDLE)) { - // Introduced inbetween SCI1MIDDLE, lsl5 demo doesn't have it, longbow demo has - if (SELECTOR(xLast) != -1) { - // save last position into mover - writeSelectorValue(segMan, mover, SELECTOR(xLast), x); - writeSelectorValue(segMan, mover, SELECTOR(yLast), y); - } + if ((getSciVersion() >= SCI_VERSION_1_LATE)) { + // save last position into mover + writeSelectorValue(segMan, mover, SELECTOR(xLast), x); + writeSelectorValue(segMan, mover, SELECTOR(yLast), y); } //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); -- cgit v1.2.3 From 379a55f089f70ee961bacf3072eead629cb1d2e3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 16 Jul 2010 13:15:18 +0000 Subject: Implemented path-finding logic for accurate player movement svn-id: r50936 --- engines/m4/mads_player.cpp | 41 +++++++++++++++++++++-- engines/m4/mads_player.h | 4 ++- engines/m4/mads_scene.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++--- engines/m4/mads_scene.h | 14 +++++++- 4 files changed, 132 insertions(+), 10 deletions(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index ff5f3464bf..5106d2210d 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -747,9 +747,44 @@ void MadsPlayer::turnToDestFacing() { } void MadsPlayer::setupRoute(bool bitFlag) { - // TODO: Properly Implement route setup - _routeIndexes[0] = _madsVm->scene()->getSceneResources()._nodes.size() - 1; - _routeCount = 1; + // Reset the flag set of nodes in use + SceneNodeList &nodes = _madsVm->scene()->getSceneResources()._nodes; + for (uint i = 0; i < nodes.size(); ++i) + nodes[i].active = false; + + // Start constructing route node list + _routeLength = 0x3FFF; + _routeCount = 0; + + setupRouteNode(_tempRoute, nodes.size() - 1, bitFlag ? 0xC000 : 0x8000, 0); +} + +void MadsPlayer::setupRouteNode(int *routeIndexP, int nodeIndex, int flags, int routeLength) { + SceneNodeList &nodes = _madsVm->scene()->getSceneResources()._nodes; + SceneNode ¤tNode = nodes[nodeIndex]; + currentNode.active = true; + + *routeIndexP++ = nodeIndex; + + int subIndex = nodes.size() - 2; + int indexVal = nodes[nodeIndex].indexes[subIndex]; + if (indexVal & flags) { + routeLength += indexVal & 0x3FFF; + if (routeLength < _routeLength) { + // Found a new shorter route to destination, so set up the route with the found one + Common::copy(_tempRoute, routeIndexP, _routeIndexes); + _routeCount = routeIndexP - _tempRoute; + _routeLength = indexVal & 0x3FFF; + } + } else { + for (int idx = nodes.size() - 2; idx > 0; --idx) { + int nodePos = idx - 1; + if (!nodes[nodePos].active && ((currentNode.indexes[nodePos] & flags) != 0)) + setupRouteNode(routeIndexP, nodePos, 0x8000, indexVal & 0x3fff); + } + } + + currentNode.active = false; } } // End of namespace M4 diff --git a/engines/m4/mads_player.h b/engines/m4/mads_player.h index 2fbba70664..6a9b7b4ca1 100644 --- a/engines/m4/mads_player.h +++ b/engines/m4/mads_player.h @@ -27,11 +27,11 @@ #define M4_MADS_PLAYER_H #include "common/scummsys.h" +#include "m4/mads_scene.h" namespace M4 { #define PLAYER_SEQ_INDEX -2 -#define MAX_ROUTE_NODES 22 class MadsPlayer { private: @@ -46,6 +46,7 @@ private: void reset(); int scanPath(M4Surface *depthSurface, const Common::Point &srcPos, const Common::Point &destPos); void startMovement(); + void setupRouteNode(int *routeIndexP, int nodeIndex, int flags, int routeLength); public: char _spritesPrefix[16]; int _spriteSetCount; @@ -92,6 +93,7 @@ public: int _v8452E; int _v8452C; int _v84530; + int _routeLength; static const int _directionListIndexes[32]; public: diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 1972e2d989..8ffe6b8c95 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -50,11 +50,11 @@ static const int SCROLLER_DELAY = 200; void SceneNode::load(Common::SeekableReadStream *stream) { // Get the next data block - uint8 obj[0x30]; - stream->read(obj, 0x30); + pt.x = stream->readUint16LE(); + pt.y = stream->readUint16LE(); - pt.x = READ_LE_UINT16(&obj[0]); - pt.y = READ_LE_UINT16(&obj[2]); + for (int i = 0; i < MAX_ROUTE_NODES; ++i) + indexes[i] = stream->readUint16LE(); } //-------------------------------------------------------------------------- @@ -860,9 +860,82 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su } void MadsSceneResources::setRouteNode(int nodeIndex, const Common::Point &pt, M4Surface *depthSurface) { + int flags, hypotenuse; + _nodes[nodeIndex].pt = pt; - // TODO: Implement the rest of the logic of this method + // Recalculate inter-node lengths + for (uint idx = 0; idx < _nodes.size(); ++idx) { + int entry; + if (idx == (uint)nodeIndex) { + entry = 0x3FFF; + } else { + // Process the node + flags = getRouteFlags(pt, _nodes[idx].pt, depthSurface); + + int xDiff = ABS(_nodes[idx].pt.x - pt.x); + int yDiff = ABS(_nodes[idx].pt.y - pt.y); + hypotenuse = SqrtF16(xDiff * xDiff + yDiff * yDiff); + + if (hypotenuse >= 0x3FFF) + // Shouldn't ever be this large + hypotenuse = 0x3FFF; + + entry = hypotenuse | flags; + _nodes[idx].indexes[nodeIndex] = entry; + _nodes[nodeIndex].indexes[idx] = entry; + } + } +} + +int MadsSceneResources::getRouteFlags(const Common::Point &src, const Common::Point &dest, M4Surface *depthSurface) { + int result = 0x8000; + bool flag = false; + + int xDiff = ABS(dest.x - src.x); + int yDiff = ABS(dest.y - src.y); + int xDirection = dest.x >= src.x ? 1 : -1; + int yDirection = dest.y >= src.y ? depthSurface->width() : -depthSurface->width(); + int majorDiff = 0; + if (dest.x < src.x) + majorDiff = MAX(xDiff, yDiff); + ++xDiff; + ++yDiff; + + byte *srcP = depthSurface->getBasePtr(src.x, src.y); + + int totalCtr = majorDiff; + for (int xCtr = 0; xCtr < xDiff; ++xCtr, srcP += xDirection) { + totalCtr += yDiff; + + if ((*srcP & 0x80) == 0) + flag = false; + else if (!flag) { + flag = true; + result -= 0x4000; + if (result == 0) + break; + } + + while (totalCtr >= xDiff) { + totalCtr -= xDiff; + + if ((*srcP & 0x80) == 0) + flag = false; + else if (!flag) { + flag = true; + result -= 0x4000; + if (result == 0) + break; + } + + srcP += yDirection; + } + if (result == 0) + break; + } + + return result; } /*--------------------------------------------------------------------------*/ diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 66fefcb0c0..7defe613bd 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -36,22 +36,34 @@ namespace M4 { class MadsInterfaceView; #define DEPTH_BANDS_SIZE 15 +#define MAX_ROUTE_NODES 22 class SceneNode { public: Common::Point pt; + int indexes[MAX_ROUTE_NODES]; + + bool active; + + SceneNode() { + active = false; + } void load(Common::SeekableReadStream *stream); }; +typedef Common::Array SceneNodeList; + class MadsSceneResources: public SceneResources { +private: + int getRouteFlags(const Common::Point &src, const Common::Point &dest, M4Surface *depthSurface); public: int _sceneId; int _artFileNum; int _depthStyle; int _width; int _height; - Common::Array _nodes; + SceneNodeList _nodes; Common::Array _setNames; int _yBandsStart, _yBandsEnd; int _maxScale, _minScale; -- cgit v1.2.3 From 3ceb02f08ac46537ba3bbc092b5b15f2390738c8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 13:37:19 +0000 Subject: SCI: adding signatures for 4-parameter variant of kDoSound(sendMidi), needs to get figured out how this works - fixes signature mismatch in lsl1 svn-id: r50937 --- engines/sci/engine/kernel.cpp | 6 +++--- engines/sci/sound/soundcmd.cpp | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index a6a3453ed8..cc2374f771 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -353,7 +353,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, - { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiiii", NULL }, + { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, @@ -376,7 +376,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), "oiii(i)", NULL }, { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, #ifdef ENABLE_SCI32 @@ -565,7 +565,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "i([io])(i)(ii[io])(i)", kDoSound_subops, NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 51832af09f..e4c0bd5c8a 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -443,6 +443,11 @@ reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { byte channel = argv[1].toUint16() & 0xf; byte midiCmd = argv[2].toUint16() & 0xff; + // TODO: first there is a 4-parameter variant of this call which needs to get reversed + // second the current code isn't 100% accurate, sierra sci does checks on the 4th parameter + if (argc == 4) + return acc; + uint16 controller = argv[3].toUint16(); uint16 param = argv[4].toUint16(); -- cgit v1.2.3 From 60363b8a53be77e56b23bca87926d07d3dc56ff5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 14:16:47 +0000 Subject: SCI: adding uninitialized workaround for lsl1 when playing at the casino svn-id: r50938 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 34f47adc4b..dd982c2c62 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -377,6 +377,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 0, "increase", "handleEvent", -1, 2, { 0, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory -- cgit v1.2.3 From 564b68a9fc85ed5d7ec6c374a0bc604051744e5a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 19:33:28 +0000 Subject: SCI: adding fixme and error() to fix crash when trying to run unmodified gk2 svn-id: r50939 --- engines/sci/resource.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 2958ca1e3b..1a40cba97e 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1396,7 +1396,13 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers // need to be used in concurrence with the volume specified in the map to get // the actual resource file. - addResource(resId, findVolume(map, volume_nr + map->_volumeNumber), off); + int mapVolumeNr = volume_nr + map->_volumeNumber; + ResourceSource *source = findVolume(map, mapVolumeNr); + // FIXME: this code has serious issues with multiple RESMAP.* files (like in unmodified gk2) + // adding a resource with source == NULL would crash later on + if (!source) + error("Unable to find volume for map %s volumeNr %d", map->getLocationName().c_str(), mapVolumeNr); + addResource(resId, source, off); } } } -- cgit v1.2.3 From 92c0e7e800dfcd1bf23febefc1b51fff3e9a57ac Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 16 Jul 2010 19:40:51 +0000 Subject: SCI: fix console commands so that console gets detached correctly svn-id: r50940 --- engines/sci/console.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 33aa5514f2..f04954f631 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1099,13 +1099,13 @@ bool Console::cmdRestoreGame(int argc, const char **argv) { return true; } - return false; + return Cmd_Exit(0, 0); } bool Console::cmdRestartGame(int argc, const char **argv) { _engine->_gamestate->abortScriptProcessing = kAbortRestartGame;; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdClassTable(int argc, const char **argv) { @@ -1341,7 +1341,7 @@ bool Console::cmdPlayVideo(int argc, const char **argv) { if (filename.hasSuffix(".seq") || filename.hasSuffix(".avi") || filename.hasSuffix(".vmd")) { _videoFile = filename; _videoFrameDelay = (argc == 2) ? 10 : atoi(argv[2]); - return false; + return Cmd_Exit(0, 0); } else { DebugPrintf("Unknown video file type\n"); return true; @@ -1631,7 +1631,7 @@ bool Console::cmdShowMap(int argc, const char **argv) { DebugPrintf("Map %d is not available.\n", map); return true; } - return false; + return Cmd_Exit(0, 0); } bool Console::cmdSongLib(int argc, const char **argv) { @@ -1676,8 +1676,7 @@ bool Console::cmdStartSound(int argc, const char **argv) { } g_sci->_soundCmd->startNewSound(number); - - return false; + return Cmd_Exit(0, 0); } bool Console::cmdToggleSound(int argc, const char **argv) { @@ -2310,7 +2309,7 @@ bool Console::cmdTrace(int argc, const char **argv) { _debugState.runningStep = atoi(argv[1]) - 1; _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdStepOver(int argc, const char **argv) { @@ -2318,14 +2317,14 @@ bool Console::cmdStepOver(int argc, const char **argv) { _debugState.seekLevel = _engine->_gamestate->_executionStack.size(); _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdStepEvent(int argc, const char **argv) { _debugState.stopOnEvent = true; _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdStepRet(int argc, const char **argv) { @@ -2333,7 +2332,7 @@ bool Console::cmdStepRet(int argc, const char **argv) { _debugState.seekLevel = _engine->_gamestate->_executionStack.size() - 1; _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdStepGlobal(int argc, const char **argv) { @@ -2347,7 +2346,7 @@ bool Console::cmdStepGlobal(int argc, const char **argv) { _debugState.seekSpecial = atoi(argv[1]); _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdStepCallk(int argc, const char **argv) { @@ -2380,7 +2379,7 @@ bool Console::cmdStepCallk(int argc, const char **argv) { } _debugState.debugging = true; - return false; + return Cmd_Exit(0, 0); } bool Console::cmdDisassemble(int argc, const char **argv) { @@ -2884,7 +2883,7 @@ bool Console::cmdQuit(int argc, const char **argv) { exit(0); } - return false; + return Cmd_Exit(0, 0); } bool Console::cmdAddresses(int argc, const char **argv) { -- cgit v1.2.3 From 38fb180edbb02d8c374f16207f595291c4948e38 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 16 Jul 2010 20:00:16 +0000 Subject: Add entries for the DOS, FM-Towns, and PC-98 versions of RTZ (all on the FM-Towns CD). svn-id: r50941 --- engines/made/detection.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/engines/made/detection.cpp b/engines/made/detection.cpp index dd2becd3b8..6a6a70cb30 100644 --- a/engines/made/detection.cpp +++ b/engines/made/detection.cpp @@ -76,7 +76,6 @@ using Common::GUIO_NONE; using Common::GUIO_NOSPEECH; static const MadeGameDescription gameDescriptions[] = { - { // NOTE: Return to Zork entries with *.dat are used to detect the game via rtzcd.dat, // which is packed inside rtzcd.red. Entries with *.red refer to the packed file @@ -328,6 +327,60 @@ static const MadeGameDescription gameDescriptions[] = { 3, }, + { + // Return to Zork - Japanese DOS + // This is the RTZCD.DAT in the base directory of the FM-Towns CD + { + "rtz", + "", + AD_ENTRY1("rtzcd.dat", "c4fccf67ad247f09b94c3c808b138576"), + Common::JA_JPN, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_RTZ, + 0, + GF_CD, + 3, + }, + + { + // Return to Zork - Japanese FM-Towns + // This is in the RTZFM folder of the FM-Towns CD + { + "rtz", + "", + AD_ENTRY1("rtzcd.dat", "e949a6a42d82daabfa7d4dc0a87a9843"), + Common::JA_JPN, + Common::kPlatformFMTowns, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_RTZ, + 0, + GF_CD, + 3, + }, + + { + // Return to Zork - Japanese PC-98 + // This is in the RTZ9821 folder of the FM-Towns CD + { + "rtz", + "", + AD_ENTRY1("rtzcd.dat", "0c0117e98530c736a141c2aad6834dc5"), + Common::JA_JPN, + Common::kPlatformPC98, + ADGF_NO_FLAGS, + GUIO_NONE + }, + GID_RTZ, + 0, + GF_CD, + 3, + }, + { // The Manhole: New and Enhanced { -- cgit v1.2.3 From e75eee21e38c71ae67382ff83ce926991f58743a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 16 Jul 2010 21:50:12 +0000 Subject: Use "true" instead of "1" in if statements to make clang a bit more happier with -Werror. svn-id: r50943 --- engines/agi/cycle.cpp | 4 ++-- engines/agi/op_cmd.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index c185c3efb3..b7eba22298 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -203,7 +203,7 @@ int AgiEngine::mainCycle() { // vars in every interpreter cycle. // // We run AGIMOUSE always as a side effect - if (getFeatures() & GF_AGIMOUSE || 1) { + if (getFeatures() & GF_AGIMOUSE || true) { _game.vars[28] = _mouse.x / 2; _game.vars[29] = _mouse.y; } @@ -318,7 +318,7 @@ int AgiEngine::playGame() { _game.lineUserInput = 22; // We run AGIMOUSE always as a side effect - if (getFeatures() & GF_AGIMOUSE || 1) + if (getFeatures() & GF_AGIMOUSE || true) report("Using AGI Mouse 1.0 protocol\n"); if (getFeatures() & GF_AGIPAL) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 072ab0114f..90a28b1042 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1504,7 +1504,7 @@ void AgiEngine::cmd_print_at_v(uint8 *p) { void AgiEngine::cmd_push_script(uint8 *p) { // We run AGIMOUSE always as a side effect - if (getFeatures() & GF_AGIMOUSE || 1) { + if (getFeatures() & GF_AGIMOUSE || true) { _game.vars[27] = _mouse.button; _game.vars[28] = _mouse.x / 2; _game.vars[29] = _mouse.y; -- cgit v1.2.3 From 587f3cf9586f019b59e7a4145e692ebde73d52df Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 16 Jul 2010 21:56:30 +0000 Subject: CINE: Get rid of g_saveFileMan svn-id: r50944 --- engines/cine/cine.cpp | 6 ++---- engines/cine/cine.h | 2 -- engines/cine/detection.cpp | 2 +- engines/cine/saveload.cpp | 6 +++--- engines/cine/various.cpp | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index c50af52901..9c232d0d8e 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -48,10 +48,9 @@ namespace Cine { -Sound *g_sound; -Common::SaveFileManager *g_saveFileMan; +Sound *g_sound = 0; -CineEngine *g_cine; +CineEngine *g_cine = 0; CineEngine::CineEngine(OSystem *syst, const CINEGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) { DebugMan.addDebugChannel(kCineDebugScript, "Script", "Script debug level"); @@ -88,7 +87,6 @@ Common::Error CineEngine::run() { // Paula chipset for Amiga and Atari versions g_sound = new PaulaSound(_mixer, this); } - g_saveFileMan = _saveFileMan; _restartRequested = false; diff --git a/engines/cine/cine.h b/engines/cine/cine.h index 6f7b409ad7..6f2c2243e2 100644 --- a/engines/cine/cine.h +++ b/engines/cine/cine.h @@ -190,8 +190,6 @@ enum { }; -extern Common::SaveFileManager *g_saveFileMan; // TEMP - } // End of namespace Cine #endif diff --git a/engines/cine/detection.cpp b/engines/cine/detection.cpp index b92ad8a0a2..9dfa2f71ea 100644 --- a/engines/cine/detection.cpp +++ b/engines/cine/detection.cpp @@ -251,7 +251,7 @@ Common::Error CineEngine::saveGameState(int slot, const char *desc) { char indexFile[80]; snprintf(indexFile, 80, "%s.dir", _targetName.c_str()); - Common::OutSaveFile *fHandle = g_saveFileMan->openForSaving(indexFile); + Common::OutSaveFile *fHandle = _saveFileMan->openForSaving(indexFile); if (!fHandle) { warning("Unable to open file %s for saving", indexFile); return Common::kUnknownError; diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index b5adebcd0b..6db0d59b13 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -465,7 +465,7 @@ bool CineEngine::loadSaveDirectory() { char tmp[80]; snprintf(tmp, 80, "%s.dir", _targetName.c_str()); - fHandle = g_saveFileMan->openForLoading(tmp); + fHandle = _saveFileMan->openForLoading(tmp); if (!fHandle) { return false; @@ -771,7 +771,7 @@ bool CineEngine::loadPlainSaveFW(Common::SeekableReadStream &in, CineSaveGameFor } bool CineEngine::makeLoad(char *saveName) { - Common::SharedPtr saveFile(g_saveFileMan->openForLoading(saveName)); + Common::SharedPtr saveFile(_saveFileMan->openForLoading(saveName)); if (!saveFile) { renderer->drawString(otherMessages[0], 0); @@ -966,7 +966,7 @@ void CineEngine::makeSaveOS(Common::OutSaveFile &out) { } void CineEngine::makeSave(char *saveFileName) { - Common::SharedPtr fHandle(g_saveFileMan->openForSaving(saveFileName)); + Common::SharedPtr fHandle(_saveFileMan->openForSaving(saveFileName)); setMouseCursor(MOUSE_CURSOR_DISK); diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 9a10c2b5d7..82c40a2f50 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -450,7 +450,7 @@ void CineEngine::makeSystemMenu() { snprintf(tmp, 80, "%s.dir", _targetName.c_str()); - Common::OutSaveFile *fHandle = g_saveFileMan->openForSaving(tmp); + Common::OutSaveFile *fHandle = _saveFileMan->openForSaving(tmp); if (!fHandle) { warning("Unable to open file %s for saving", tmp); break; -- cgit v1.2.3 From 70b6ee0a5bef3701328c456fd6f4c9d95aa47536 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 16 Jul 2010 21:56:50 +0000 Subject: CINE: Get rid of some unnecessary g_cine refs svn-id: r50945 --- engines/cine/cine.cpp | 12 ++++++------ engines/cine/saveload.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index 9c232d0d8e..e6ac2859cf 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -71,7 +71,7 @@ CineEngine::CineEngine(OSystem *syst, const CINEGameDescription *gameDesc) : Eng } CineEngine::~CineEngine() { - if (g_cine->getGameType() == Cine::GType_OS) { + if (getGameType() == Cine::GType_OS) { freeErrmessDat(); } DebugMan.clearAllDebugChannels(); @@ -81,7 +81,7 @@ Common::Error CineEngine::run() { // Initialize backend initGraphics(320, 200, false); - if (g_cine->getPlatform() == Common::kPlatformPC) { + if (getPlatform() == Common::kPlatformPC) { g_sound = new PCSound(_mixer, this); } else { // Paula chipset for Amiga and Atari versions @@ -145,9 +145,9 @@ void CineEngine::initialize() { _timerDelayMultiplier = 12; // Set default speed setupOpcodes(); - initLanguage(g_cine->getLanguage()); + initLanguage(getLanguage()); - if (g_cine->getGameType() == Cine::GType_OS) { + if (getGameType() == Cine::GType_OS) { renderer = new OSRenderer; } else { renderer = new FWRenderer; @@ -161,13 +161,13 @@ void CineEngine::initialize() { // Its size will change when loading data into it with the loadPart function. partBuffer.clear(); - if (g_cine->getGameType() == Cine::GType_OS) { + if (getGameType() == Cine::GType_OS) { readVolCnf(); } loadTextData("texte.dat"); - if (g_cine->getGameType() == Cine::GType_OS && !(g_cine->getFeatures() & GF_DEMO)) { + if (getGameType() == Cine::GType_OS && !(getFeatures() & GF_DEMO)) { loadPoldatDat("poldat.dat"); loadErrmessDat("errmess.dat"); } diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index 6db0d59b13..f9dfcc7737 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -976,7 +976,7 @@ void CineEngine::makeSave(char *saveFileName) { // restoreScreen(); checkDataDisk(-1); } else { - if (g_cine->getGameType() == GType_FW) { + if (getGameType() == GType_FW) { makeSaveFW(*fHandle); } else { makeSaveOS(*fHandle); -- cgit v1.2.3 From 30a92bec6be657df29881de8075c5075f2289e28 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 23:02:17 +0000 Subject: Removed unused variables. svn-id: r50947 --- engines/gob/inter_playtoons.cpp | 2 -- engines/gob/mult_v2.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp index c9b962579b..142467b47f 100644 --- a/engines/gob/inter_playtoons.cpp +++ b/engines/gob/inter_playtoons.cpp @@ -362,7 +362,6 @@ void Inter_Playtoons::oPlaytoons_getObjAnimSize() { int16 objIndex; uint16 readVar[4]; uint8 i; - bool break_fl; Mult::Mult_AnimData animData; _vm->_game->_script->evalExpr(&objIndex); @@ -375,7 +374,6 @@ void Inter_Playtoons::oPlaytoons_getObjAnimSize() { return; } if (objIndex == -2) { - break_fl = false; warning("oPlaytoons_getObjAnimSize case -2 not implemented"); return; } diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp index 88b604023c..6acd096e58 100644 --- a/engines/gob/mult_v2.cpp +++ b/engines/gob/mult_v2.cpp @@ -1149,7 +1149,6 @@ void Mult_v2::playImd(const char *imdFile, Mult::Mult_ImdKey &key, int16 dir, void Mult_v2::advanceObjects(int16 index) { int16 frame; bool stop = false; - bool hasImds = false; frame = _multData->animKeysFrames[index]; if (frame == -1) @@ -1254,7 +1253,6 @@ void Mult_v2::advanceObjects(int16 index) { if ((dir != 1) && (--startFrame < 0)) startFrame = 0; - hasImds = true; playImd(imdFile, key, dir, startFrame); } } -- cgit v1.2.3 From 4a52413a46c2b2fe5b81e15fef1ad34ef781bc4a Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 23:04:59 +0000 Subject: Removed unused variable. svn-id: r50948 --- engines/kyra/scene_mr.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/kyra/scene_mr.cpp b/engines/kyra/scene_mr.cpp index 875200895a..bd0a1fe544 100644 --- a/engines/kyra/scene_mr.cpp +++ b/engines/kyra/scene_mr.cpp @@ -79,11 +79,9 @@ void KyraEngine_MR::enterNewScene(uint16 sceneId, int facing, int unk1, int unk2 musicUpdate(0); uint32 waitUntilTimer = 0; - bool newSoundFile = false; if (_lastMusicCommand != _sceneList[sceneId].sound) { fadeOutMusic(60); waitUntilTimer = _system->getMillis() + 60 * _tickLength; - newSoundFile = true; } _chatAltFlag = false; -- cgit v1.2.3 From 17dcf79936b15bb4f830b3135a239b00edd315af Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 23:09:13 +0000 Subject: Cleanup svn-id: r50949 --- engines/kyra/sound_towns.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 8003ca25f3..27aa57586e 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -597,21 +597,15 @@ Towns_EuphonyDriver::~Towns_EuphonyDriver() { MidiDriver_YM2612::removeLookupTables(); - if (_fmInstruments) { - delete[] _fmInstruments; - _fmInstruments = 0; - } + delete[] _fmInstruments; + _fmInstruments = 0; - if (_waveInstruments) { - delete[] _waveInstruments; - _waveInstruments = 0; - } + delete[] _waveInstruments; + _waveInstruments = 0; for (int i = 0; i < 10; i++) { - if (_waveSounds[i]) { - delete[] _waveSounds[i]; - _waveSounds[i] = 0; - } + delete[] _waveSounds[i]; + _waveSounds[i] = 0; } if (_queue) { -- cgit v1.2.3 From 4172a94edd9eaba0d6dc27d09c8858704d7010a0 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 23:10:41 +0000 Subject: Cleanup. svn-id: r50950 --- engines/made/resource.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/engines/made/resource.cpp b/engines/made/resource.cpp index 28d46cf4ec..cdcb49f9f9 100644 --- a/engines/made/resource.cpp +++ b/engines/made/resource.cpp @@ -50,10 +50,9 @@ PictureResource::~PictureResource() { delete _picture; _picture = 0; } - if (_picturePalette) { - delete[] _picturePalette; - _picturePalette = 0; - } + + delete[] _picturePalette; + _picturePalette = 0; } void PictureResource::load(byte *source, int size) { -- cgit v1.2.3 From aa631a64dce17e89cc657b4588af0ba032b9664d Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 16 Jul 2010 23:23:30 +0000 Subject: Removed unused variable. I believe thread->_instructionOffset serves the same purpose that 'addr' was inteded to. svn-id: r50951 --- engines/saga/script.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp index 18bbca2425..5fd120ac33 100644 --- a/engines/saga/script.cpp +++ b/engines/saga/script.cpp @@ -571,9 +571,7 @@ void Script::opCall(SCRIPTOP_PARAMS) { if (iparam1 != kAddressModule) { error("Script::runThread iparam1 != kAddressModule"); } - byte *addr = thread->baseAddress(iparam1); iparam1 = scriptS->readSint16LE(); - addr += iparam1; thread->push(argumentsCount); // NOTE: The original pushes the program -- cgit v1.2.3 From bf17cc1053b4273ff21f069e161fdb38b4aec83a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 16 Jul 2010 23:30:29 +0000 Subject: In the help of making the new C++ standard a better one, we will now no longer rely on using parent class names in friend classes of a subclass. svn-id: r50952 --- engines/kyra/gui_lok.cpp | 2 +- engines/kyra/gui_lol.cpp | 4 ++-- engines/kyra/gui_v2.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/kyra/gui_lok.cpp b/engines/kyra/gui_lok.cpp index c8b7e8ec4f..9a1d750391 100644 --- a/engines/kyra/gui_lok.cpp +++ b/engines/kyra/gui_lok.cpp @@ -579,7 +579,7 @@ void GUI_LoK::setupSavegames(Menu &menu, int num) { for (int i = startSlot; i < num; ++i) menu.item[i].enabled = 0; - KyraEngine_v1::SaveHeader header; + KyraEngine_LoK::SaveHeader header; for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); i++) { if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header))) { Common::strlcpy(savenames[i], header.description.c_str(), ARRAYSIZE(savenames[0])); diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index ded1326110..2c86073892 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -2611,7 +2611,7 @@ void GUI_LoL::updateSavegameList() { if (_savegameListSize) { Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater()); - KyraEngine_v1::SaveHeader header; + LoLEngine::SaveHeader header; Common::InSaveFile *in; _savegameList = new char *[_savegameListSize]; @@ -2658,7 +2658,7 @@ int GUI_LoL::getInput() { if (_currentMenu == &_savenameMenu) { _vm->updateInput(); - for (Common::List::const_iterator evt = _vm->_eventList.begin(); evt != _vm->_eventList.end(); ++evt) { + for (Common::List::const_iterator evt = _vm->_eventList.begin(); evt != _vm->_eventList.end(); ++evt) { if (evt->event.type == Common::EVENT_KEYDOWN) _keyPressed = evt->event.kbd; } diff --git a/engines/kyra/gui_v2.cpp b/engines/kyra/gui_v2.cpp index de19228d16..fe4b54d09b 100644 --- a/engines/kyra/gui_v2.cpp +++ b/engines/kyra/gui_v2.cpp @@ -452,7 +452,7 @@ void GUI_v2::setupSavegameNames(Menu &menu, int num) { if (_isSaveMenu && _savegameOffset == 0) startSlot = 1; - KyraEngine_v1::SaveHeader header; + KyraEngine_v2::SaveHeader header; Common::InSaveFile *in; for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); ++i) { if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header)) != 0) { -- cgit v1.2.3 From ddb364412e3286eb68479285abc567351f4b5b45 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 16 Jul 2010 23:30:50 +0000 Subject: Fix use of "&&" instead of "&" for bit masking. (This looks much more sensible at least!) svn-id: r50953 --- engines/m4/mads_player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 5106d2210d..a8b6469771 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -634,7 +634,7 @@ int MadsPlayer::scanPath(M4Surface *depthSurface, const Common::Point &srcPos, c // Outer horizontal movement loop for (int yIndex = 0; yIndex < yDiff; ++yIndex) { index += yDiff; - int v = (*srcP && 0x7F) >> 4; + int v = (*srcP & 0x7F) >> 4; if (v) return v; @@ -642,7 +642,7 @@ int MadsPlayer::scanPath(M4Surface *depthSurface, const Common::Point &srcPos, c while (index >= xDiff) { index -= xDiff; - v = (*srcP && 0x7F) >> 4; + v = (*srcP & 0x7F) >> 4; if (v) return v; -- cgit v1.2.3 From 83e2aa236092120bf03efbf38558f69719dda11a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 17 Jul 2010 00:05:27 +0000 Subject: Remove extra ";" in class declarations. svn-id: r50955 --- engines/sci/graphics/font.h | 16 ++++++++-------- engines/sci/resource_intern.h | 4 ++-- engines/sci/sound/drivers/mididriver.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/engines/sci/graphics/font.h b/engines/sci/graphics/font.h index 90f18e426d..b9bee0fa9e 100644 --- a/engines/sci/graphics/font.h +++ b/engines/sci/graphics/font.h @@ -32,14 +32,14 @@ namespace Sci { class GfxFont { public: - GfxFont() {}; - virtual ~GfxFont() {}; - - virtual GuiResourceId getResourceId() { return 0; }; - virtual byte getHeight() { return 0; }; - virtual bool isDoubleByte(uint16 chr) { return false; }; - virtual byte getCharWidth(uint16 chr) { return 0; }; - virtual void draw(uint16 chr, int16 top, int16 left, byte color, bool greyedOutput) {}; + GfxFont() {} + virtual ~GfxFont() {} + + virtual GuiResourceId getResourceId() { return 0; } + virtual byte getHeight() { return 0; } + virtual bool isDoubleByte(uint16 chr) { return false; } + virtual byte getCharWidth(uint16 chr) { return 0; } + virtual void draw(uint16 chr, int16 top, int16 left, byte color, bool greyedOutput) {} }; diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 45421dd722..73986444a4 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -73,7 +73,7 @@ public: */ virtual ResourceSource *findVolume(ResourceSource *map, int volNum) { return NULL; - }; + } /** * Scan this source for TODO. @@ -122,7 +122,7 @@ public: if (_associatedMap == map && _volumeNumber == volNum) return this; return NULL; - }; + } }; class ExtMapResourceSource : public ResourceSource { diff --git a/engines/sci/sound/drivers/mididriver.h b/engines/sci/sound/drivers/mididriver.h index 58803db260..da97b723af 100644 --- a/engines/sci/sound/drivers/mididriver.h +++ b/engines/sci/sound/drivers/mididriver.h @@ -86,7 +86,7 @@ public: virtual byte getPlayId() = 0; virtual int getPolyphony() const = 0; - virtual int getFirstChannel() { return 0; }; + virtual int getFirstChannel() { return 0; } virtual void setVolume(byte volume) { if(_driver) -- cgit v1.2.3 From e000d2865450090d28f6a72608b963ece6435d4a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 12:06:31 +0000 Subject: SCI: fix debugging code of parser, add 0xffe special group into debug support svn-id: r50956 --- engines/sci/engine/kparse.cpp | 4 ++-- engines/sci/engine/scriptdebug.cpp | 2 +- engines/sci/parser/vocabulary.cpp | 7 +++++-- engines/sci/parser/vocabulary.h | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 45493a95d2..80a1c10e59 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -60,8 +60,8 @@ reg_t kSaid(EngineState *s, int argc, reg_t *argv) { } #ifdef DEBUG_PARSER - debugC(2, kDebugLevelParser, "Said block:", 0); - s->_voc->decipherSaidBlock(said_block); + printf("Said block: "); + g_sci->getVocabulary()->decipherSaidBlock(said_block); #endif if (voc->parser_event.isNull() || (readSelectorValue(s->_segMan, voc->parser_event, SELECTOR(claimed)))) { diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 915a6fa994..4521995123 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -489,7 +489,7 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { printf("%04x: ", seeker); while (seeker < _seeker) { - unsigned char nextitem = script->data [seeker++]; + uint16 nextitem = script->data [seeker++]; if (nextitem == 0xFF) printf("\n%04x: ", seeker); else if (nextitem >= 0xF0) { diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index e48a9cdfda..7b115a815d 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -142,10 +142,13 @@ bool Vocabulary::loadParserWords() { const char *Vocabulary::getAnyWordFromGroup(int group) { if (group == VOCAB_MAGIC_NUMBER_GROUP) return "{number}"; + if (group == VOCAB_MAGIC_NOTHING_GROUP) + return "{nothing}"; - for (WordMap::const_iterator i = _parserWords.begin(); i != _parserWords.end(); ++i) + for (WordMap::const_iterator i = _parserWords.begin(); i != _parserWords.end(); ++i) { if (i->_value._group == group) return i->_key.c_str(); + } return "{invalid}"; } @@ -301,7 +304,7 @@ ResultWord Vocabulary::lookupWord(const char *word, int word_len) { } void Vocabulary::decipherSaidBlock(byte *addr) { - byte nextitem; + uint16 nextitem; do { nextitem = *addr++; diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index dccef0f5f3..3317b6dfba 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -78,6 +78,7 @@ enum { /* This word class is used for numbers */ #define VOCAB_MAGIC_NUMBER_GROUP 0xffd /* 0xffe ? */ +#define VOCAB_MAGIC_NOTHING_GROUP 0xffe /* Number of nodes for each parse_tree_node structure */ #define VOCAB_TREE_NODES 500 -- cgit v1.2.3 From 1d31c278e6234d9624d4698aef9c9e3da8ea8ee1 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sat, 17 Jul 2010 12:37:02 +0000 Subject: SCI: Fix 'parse' debug command parameter handling svn-id: r50957 --- engines/sci/console.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index f04954f631..0fec80fe1c 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1176,8 +1176,9 @@ bool Console::cmdParse(int argc, const char **argv) { char string[1000]; // Construct the string - strcpy(string, argv[2]); + strcpy(string, argv[1]); for (int i = 2; i < argc; i++) { + strcat(string, " "); strcat(string, argv[i]); } -- cgit v1.2.3 From e9ed821953c3008b8bcfd836cd1afaa2428c6c16 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 12:46:57 +0000 Subject: SCI: add hack for iceman to skip [!*] in kSaid, fixes green board / depth affirmative not recognized svn-id: r50958 --- engines/sci/parser/said.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index f49704372a..231485b030 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -2025,6 +2025,14 @@ static int said_parse_spec(byte *spec) { } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); + if ((said_tokens_nr > 2) && (said_tokens[0] == 0xF500) && (said_tokens[1] == 0xFFE) && (said_tokens[2] == 0xF600)) { + // HACK: "[!*]" found at the start, remove it - occurs in iceman + for (int saidNr = 3; saidNr < said_tokens_nr; saidNr++) { + said_tokens[saidNr - 3] = said_tokens[saidNr]; + } + // FIXME: this should get properly implemented, but the parser code goes way over my head + } + if (nextitem == SAID_TERM) yyparse(); else { -- cgit v1.2.3 From 7ac5c3ef4faa91d48953c36693f406a749f80787 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 12:57:05 +0000 Subject: SCI: added iceman hack to original said.y as well svn-id: r50959 --- engines/sci/parser/said.y | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/parser/said.y b/engines/sci/parser/said.y index cbb2ff3e62..822ae07493 100644 --- a/engines/sci/parser/said.y +++ b/engines/sci/parser/said.y @@ -381,6 +381,14 @@ static int said_parse_spec(byte *spec) { } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); + if ((said_tokens_nr > 2) && (said_tokens[0] == 0xF500) && (said_tokens[1] == 0xFFE) && (said_tokens[2] == 0xF600)) { + // HACK: "[!*]" found at the start, remove it - occurs in iceman + for (int saidNr = 3; saidNr < said_tokens_nr; saidNr++) { + said_tokens[saidNr - 3] = said_tokens[saidNr]; + } + // FIXME: this should get properly implemented, but the parser code goes way over my head + } + if (nextitem == SAID_TERM) yyparse(); else { -- cgit v1.2.3 From cb4072f978b46a031b2ffb24e43eee7b76ef815f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 13:27:07 +0000 Subject: SCI: added special case for iceman when plotting course inside isSaneNodePointer svn-id: r50960 --- engines/sci/engine/klists.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 06fc68b82b..945fb1b0e0 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -37,7 +37,12 @@ static bool isSaneNodePointer(SegManager *segMan, reg_t addr) { Node *node = segMan->lookupNode(addr); if (!node) { - error("isSaneNodePointer: Node at %04x:%04x wasn't found", PRINT_REG(addr)); + if ((g_sci->getGameId() == GID_ICEMAN) && (g_sci->getEngineState()->currentRoomNumber() == 40)) { + // ICEMAN: when plotting course, unDrawLast is called by startPlot::changeState + // there is no previous entry so we get 0 in here + } else { + error("isSaneNodePointer: Node at %04x:%04x wasn't found", PRINT_REG(addr)); + } return false; } -- cgit v1.2.3 From 8c31dd7e854ef19b28bc5f5ef8b1e5b5073927bd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 13:32:11 +0000 Subject: SCI: added gameid for send() sq4 workaround svn-id: r50961 --- engines/sci/engine/vm.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index dd982c2c62..c7909672e5 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -646,14 +646,15 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt // result of a script bug const char *objectName = s->_segMan->getObjectName(send_obj); + const SciGameId gameId = g_sci->getGameId(); - if (!strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { + if (gameId == GID_SQ4 && !strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the // returnVal selector, which doesn't affect gameplay, thus don't diplay it - } else if (!strcmp(objectName, "longSong") && selector == 3 && g_sci->getGameId() == GID_QFG1VGA) { + } else if (gameId == GID_QFG1VGA && !strcmp(objectName, "longSong") && selector == 3) { // QFG1VGA has a script bug in the longSong object when invoking the // loop selector, which doesn't affect gameplay, thus don't diplay it - } else if (!strcmp(objectName, "PuzPiece") && selector == 77 && g_sci->getGameId() == GID_CASTLEBRAIN) { + } else if (gameId == GID_CASTLEBRAIN && !strcmp(objectName, "PuzPiece") && selector == 77) { // Castle of Dr. Brain has a script bug in the PuzPiece object when invoking // the value selector, which doesn't affect gameplay, thus don't display it } else { -- cgit v1.2.3 From 625af1260b2b6a28b57726564547d740fce35cad Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 17:58:50 +0000 Subject: SCI: checking if within kernel function before overwrite a save (thx @ digitall) svn-id: r50962 --- engines/sci/engine/kfile.cpp | 6 ++++++ engines/sci/engine/savegame.cpp | 1 + 2 files changed, 7 insertions(+) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 5c8179103c..dd9241a375 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -531,6 +531,12 @@ reg_t kSaveGame(EngineState *s, int argc, reg_t *argv) { debug(3, "kSaveGame(%s,%d,%s,%s)", game_id.c_str(), virtualId, game_description.c_str(), version.c_str()); + // We check here, we don't want to delete a users save in case we are within a kernel function + if (s->executionStackBase) { + warning("kSaveGame - won't save from within kernel function"); + return NULL_REG; + } + Common::Array saves; listSavegames(saves); diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0fe5f2088a..5690969065 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -722,6 +722,7 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam meta.script0_size = script0->size; meta.game_object_offset = g_sci->getGameObject().offset; + // Checking here again if (s->executionStackBase) { warning("Cannot save from below kernel function"); return false; -- cgit v1.2.3 From 1d4c82885ddcc0442671c863eef643aef2dc7dda Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 17 Jul 2010 18:38:42 +0000 Subject: DEBUGGER: Simplify how our console debugger works / is used * Remove _isAttached member var and isAttached method * Engines now always call the onFrame method; whether it does something is decided by the debugger class resp. its subclasses * Make detach() protected instead of private, so that subclasses can invoke it * Remove _detach_now member var (call detach() instead). * Rename _frame_countdown to _frameCountdown and properly document it. * Add more doxygen comments * Cleanup svn-id: r50963 --- engines/agi/agi.cpp | 3 +- engines/agi/console.cpp | 9 ---- engines/agi/console.h | 17 ------ engines/agos/event.cpp | 3 +- engines/cruise/cruise_main.cpp | 10 ++-- engines/engine.cpp | 2 +- engines/groovie/groovie.cpp | 6 +-- engines/kyra/debugger.cpp | 4 +- engines/kyra/kyra_v1.cpp | 2 +- engines/lure/debugger.cpp | 2 +- engines/lure/fights.cpp | 3 +- engines/lure/game.cpp | 3 +- engines/parallaction/input.cpp | 3 +- engines/queen/queen.cpp | 4 +- engines/saga/saga.cpp | 3 +- engines/sci/engine/vm.cpp | 4 +- engines/scumm/debugger.cpp | 12 ++--- engines/scumm/scumm.cpp | 3 +- engines/sky/sky.cpp | 3 +- engines/sword2/sword2.cpp | 3 +- engines/teenagent/teenagent.cpp | 4 +- engines/tinsel/tinsel.cpp | 3 +- gui/debugger.cpp | 61 ++++++++++----------- gui/debugger.h | 116 +++++++++++++++++++++++++++++++++------- 24 files changed, 152 insertions(+), 131 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index ce8b5931af..789d6a2193 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -279,8 +279,7 @@ void AgiEngine::pollTimer() { while ((dm = _tickTimer - _lastTickTimer) < 5) { processEvents(); - if (_console->isAttached()) - _console->onFrame(); + _console->onFrame(); _system->delayMillis(10); _system->updateScreen(); } diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp index e881b092e3..e5942455e2 100644 --- a/engines/agi/console.cpp +++ b/engines/agi/console.cpp @@ -53,15 +53,6 @@ Console::Console(AgiEngine *vm) : GUI::Debugger() { DCmd_Register("bt", WRAP_METHOD(Console, Cmd_BT)); } -Console::~Console() { -} - -void Console::preEnter() { -} - -void Console::postEnter() { -} - bool Console::Cmd_SetVar(int argc, const char **argv) { if (argc != 3) { DebugPrintf("Usage: setvar \n"); diff --git a/engines/agi/console.h b/engines/agi/console.h index e8eccbe50a..e79db42054 100644 --- a/engines/agi/console.h +++ b/engines/agi/console.h @@ -46,11 +46,6 @@ struct AgiDebug { class Console : public GUI::Debugger { public: Console(AgiEngine *vm); - virtual ~Console(); - -protected: - virtual void preEnter(); - virtual void postEnter(); private: bool Cmd_SetVar(int argc, const char **argv); @@ -80,10 +75,6 @@ public: PreAGI_Console(PreAgiEngine *vm); virtual ~PreAGI_Console() {} -protected: - virtual void preEnter() {} - virtual void postEnter() {} - private: PreAgiEngine *_vm; }; @@ -94,10 +85,6 @@ public: Mickey_Console(PreAgiEngine *vm, Mickey *mickey); virtual ~Mickey_Console() {} -protected: - virtual void preEnter() {} - virtual void postEnter() {} - private: Mickey *_mickey; @@ -112,10 +99,6 @@ public: Winnie_Console(PreAgiEngine *vm, Winnie *winnie); virtual ~Winnie_Console() {} -protected: - virtual void preEnter() {} - virtual void postEnter() {} - private: Winnie *_winnie; diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp index ac552ec285..95c9db906a 100644 --- a/engines/agos/event.cpp +++ b/engines/agos/event.cpp @@ -431,8 +431,7 @@ void AGOSEngine::delay(uint amount) { AudioCD.updateCD(); - if (_debugger->isAttached()) - _debugger->onFrame(); + _debugger->onFrame(); vgaPeriod = (_fastMode) ? 10 : _vgaPeriod; if (getGameType() == GType_PP && getGameId() != GID_DIMP) { diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp index 14de916a84..65d8b57366 100644 --- a/engines/cruise/cruise_main.cpp +++ b/engines/cruise/cruise_main.cpp @@ -1833,19 +1833,17 @@ void CruiseEngine::mainLoop() { if (!skipEvents) skipEvents = manageEvents(); - if (playerDontAskQuit) break; + if (playerDontAskQuit) + break; - if (_vm->getDebugger()->isAttached()) - _vm->getDebugger()->onFrame(); + _vm->getDebugger()->onFrame(); } while (currentTick < lastTick + _gameSpeed); } else { manageEvents(); if (currentTick >= (lastTickDebug + 10)) { lastTickDebug = currentTick; - - if (_vm->getDebugger()->isAttached()) - _vm->getDebugger()->onFrame(); + _vm->getDebugger()->onFrame(); } } if (playerDontAskQuit) diff --git a/engines/engine.cpp b/engines/engine.cpp index 84fc0bbe4e..e2c0bb79f3 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -78,7 +78,7 @@ static void defaultErrorHandler(const char *msg) { if (isSmartphone()) debugger = 0; #endif - if (debugger && !debugger->isAttached()) { + if (debugger && !debugger->isActive()) { debugger->attach(msg); debugger->onFrame(); } diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 9da413d362..cdf5171ab9 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -220,10 +220,8 @@ Common::Error GroovieEngine::run() { _system->openCD(cd_num); while (!shouldQuit()) { - // Show the debugger if required - if (_debugger->isAttached()) { - _debugger->onFrame(); - } + // Give the debugger a chance to act + _debugger->onFrame(); // Handle input Common::Event ev; diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp index d71f7b8b25..225b44b3f4 100644 --- a/engines/kyra/debugger.cpp +++ b/engines/kyra/debugger.cpp @@ -240,7 +240,7 @@ bool Debugger_LoK::cmd_enterRoom(int argc, const char **argv) { while (!_vm->_screen->isMouseVisible()) _vm->_screen->showMouse(); - _detach_now = true; + detach(); return false; } @@ -327,7 +327,7 @@ bool Debugger_v2::cmd_enterScene(int argc, const char **argv) { while (!_vm->screen_v2()->isMouseVisible()) _vm->screen_v2()->showMouse(); - _detach_now = true; + detach(); return false; } diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index abe13cec2b..2c6cd3ab5c 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -336,7 +336,7 @@ int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop, int eventFlag) break; } - if (_debugger && _debugger->isAttached()) + if (_debugger) _debugger->onFrame(); if (breakLoop) diff --git a/engines/lure/debugger.cpp b/engines/lure/debugger.cpp index 3abc079a05..1cfe0804e4 100644 --- a/engines/lure/debugger.cpp +++ b/engines/lure/debugger.cpp @@ -105,7 +105,7 @@ bool Debugger::cmd_enterRoom(int argc, const char **argv) { if (!remoteFlag) res.getActiveHotspot(PLAYER_ID)->setRoomNumber(roomNumber); - _detach_now = true; + detach(); return false; } diff --git a/engines/lure/fights.cpp b/engines/lure/fights.cpp index 53539677c8..789c9d924e 100644 --- a/engines/lure/fights.cpp +++ b/engines/lure/fights.cpp @@ -132,8 +132,7 @@ void FightsManager::fightLoop() { } Screen::getReference().update(); - if (game.debugger().isAttached()) - game.debugger().onFrame(); + game.debugger().onFrame(); g_system->delayMillis(10); } diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp index d0f98b9c34..5d2f0e8ed1 100644 --- a/engines/lure/game.cpp +++ b/engines/lure/game.cpp @@ -281,8 +281,7 @@ void Game::execute() { system.updateScreen(); system.delayMillis(10); - if (_debugger->isAttached()) - _debugger->onFrame(); + _debugger->onFrame(); } room.leaveRoom(); diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp index 6d3f6f0b04..ca8f358158 100644 --- a/engines/parallaction/input.cpp +++ b/engines/parallaction/input.cpp @@ -148,8 +148,7 @@ void Input::readInput() { setCursorPos(e.mouse); } - if (_vm->_debugger->isAttached()) - _vm->_debugger->onFrame(); + _vm->_debugger->onFrame(); return; diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 10c3d56cb4..5cda4e3208 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -264,9 +264,7 @@ void QueenEngine::writeOptionSettings() { } void QueenEngine::update(bool checkPlayerInput) { - if (_debugger->isAttached()) { - _debugger->onFrame(); - } + _debugger->onFrame(); _graphics->update(_logic->currentRoom()); _logic->update(); diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp index d1ab3bc9d7..1b7fa97f8d 100644 --- a/engines/saga/saga.cpp +++ b/engines/saga/saga.cpp @@ -352,8 +352,7 @@ Common::Error SagaEngine::run() { uint32 currentTicks; while (!shouldQuit()) { - if (_console->isAttached()) - _console->onFrame(); + _console->onFrame(); if (_render->getFlags() & RF_RENDERPAUSE) { // Freeze time while paused diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c7909672e5..900d843867 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1085,9 +1085,7 @@ void run_vm(EngineState *s, bool restoring) { g_sci->_debugState.breakpointWasHit = false; } Console *con = g_sci->getSciDebugger(); - if (con->isAttached()) { - con->onFrame(); - } + con->onFrame(); if (s->xs->sp < s->xs->fp) error("run_vm(): stack underflow, sp: %04x:%04x, fp: %04x:%04x", diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp index ea29e25a1f..b5a4070f0b 100644 --- a/engines/scumm/debugger.cpp +++ b/engines/scumm/debugger.cpp @@ -62,8 +62,6 @@ ScummDebugger::ScummDebugger(ScummEngine *s) _vm = s; // Register variables - DVar_Register("debug_countdown", &_frame_countdown, DVAR_INT, 0); - DVar_Register("scumm_speed", &_vm->_fastMode, DVAR_BYTE, 0); DVar_Register("scumm_room", &_vm->_currentRoom, DVAR_BYTE, 0); DVar_Register("scumm_roomresource", &_vm->_roomResource, DVAR_INT, 0); @@ -128,7 +126,7 @@ void ScummDebugger::postEnter() { bool ScummDebugger::Cmd_Restart(int argc, const char **argv) { _vm->restart(); - _detach_now = true; + detach(); return false; } @@ -202,7 +200,7 @@ bool ScummDebugger::Cmd_LoadGame(int argc, const char **argv) { _vm->requestLoad(slot); - _detach_now = true; + detach(); return false; } @@ -867,7 +865,7 @@ bool ScummDebugger::Cmd_Passcode(int argc, const char **argv) { } _vm->_bootParam = 0; - _detach_now = true; + detach(); } else { DebugPrintf("Current Passcode is %d \nUse 'passcode '\n",_vm->_scummVars[411]); @@ -878,9 +876,7 @@ bool ScummDebugger::Cmd_Passcode(int argc, const char **argv) { bool ScummDebugger::Cmd_ResetCursors(int argc, const char **argv) { _vm->resetCursors(); - - _detach_now = true; - + detach(); return false; } diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 7c3b8a4a1d..b44184f5cb 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1840,8 +1840,7 @@ Common::Error ScummEngine::go() { while (!shouldQuit()) { - if (_debugger->isAttached()) - _debugger->onFrame(); + _debugger->onFrame(); // Randomize the PRNG by calling it at regular intervals. This ensures // that it will be in a different state each time you run the program. diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp index 45b3cab947..edf96f8e8c 100644 --- a/engines/sky/sky.cpp +++ b/engines/sky/sky.cpp @@ -185,8 +185,7 @@ Common::Error SkyEngine::go() { uint32 delayCount = _system->getMillis(); while (!shouldQuit()) { - if (_debugger->isAttached()) - _debugger->onFrame(); + _debugger->onFrame(); if (shouldPerformAutoSave(_lastSaveTime)) { if (_skyControl->loadSaveAllowed()) { diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 29f567d7ef..1060dcf728 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -458,8 +458,7 @@ Common::Error Sword2Engine::run() { _screen->initialiseRenderCycle(); while (1) { - if (_debugger->isAttached()) - _debugger->onFrame(); + _debugger->onFrame(); #ifdef SWORD2_DEBUG if (_stepOneCycle) { diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index bb0e9773a2..c30809eef4 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -618,9 +618,7 @@ Common::Error TeenAgentEngine::run() { _system->updateScreen(); - if (console->isAttached()) { - console->onFrame(); - } + console->onFrame(); uint32 next_tick = MIN(game_timer, mark_timer); if (next_tick > 0) { diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 195066cac1..6c77a98dda 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -1001,8 +1001,7 @@ Common::Error TinselEngine::run() { uint32 timerVal = 0; while (!shouldQuit()) { assert(_console); - if (_console->isAttached()) - _console->onFrame(); + _console->onFrame(); // Check for time to do next game cycle if ((g_system->getMillis() > timerVal + GAME_FRAME_DELAY)) { diff --git a/gui/debugger.cpp b/gui/debugger.cpp index 13dc02452d..71728e8b13 100644 --- a/gui/debugger.cpp +++ b/gui/debugger.cpp @@ -39,9 +39,8 @@ namespace GUI { Debugger::Debugger() { - _frame_countdown = 0; - _detach_now = false; - _isAttached = false; + _frameCountdown = 0; + _isActive = false; _errStr = NULL; _firstTime = true; #ifndef USE_TEXT_CONSOLE @@ -50,6 +49,10 @@ Debugger::Debugger() { _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this); #endif + // Register variables + DVar_Register("debug_countdown", &_frameCountdown, DVAR_INT, 0); + + // Register commands //DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit)); DCmd_Register("exit", WRAP_METHOD(Debugger, Cmd_Exit)); DCmd_Register("quit", WRAP_METHOD(Debugger, Cmd_Exit)); @@ -84,40 +87,32 @@ int Debugger::DebugPrintf(const char *format, ...) { } void Debugger::attach(const char *entry) { - g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); - if (entry) { - _errStr = strdup(entry); - } + // Set error string (if any) + free(_errStr); + _errStr = entry ? strdup(entry) : 0; - _frame_countdown = 1; - _detach_now = false; - _isAttached = true; + // Reset frame countdown (i.e. attach immediately) + _frameCountdown = 1; } void Debugger::detach() { g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); - - _detach_now = false; - _isAttached = false; } // Temporary execution handler void Debugger::onFrame() { - if (_frame_countdown == 0) - return; - --_frame_countdown; - - if (!_frame_countdown) { - - preEnter(); - enter(); - postEnter(); - - // Detach if we're finished with the debugger - if (_detach_now) - detach(); + // Count down until 0 is reached + if (_frameCountdown > 0) { + --_frameCountdown; + if (_frameCountdown == 0) { + _isActive = true; + preEnter(); + enter(); + postEnter(); + _isActive = false; + } } } @@ -250,8 +245,8 @@ bool Debugger::parseCommand(const char *inputOrig) { } else { int element = atoi(chr+1); int32 *var = *(int32 **)_dvars[i].variable; - if (element >= _dvars[i].optional) { - DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional); + if (element >= _dvars[i].arraySize) { + DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].arraySize); } else { var[element] = atoi(param[1]); DebugPrintf("(int)%s = %d\n", param[0], var[element]); @@ -281,8 +276,8 @@ bool Debugger::parseCommand(const char *inputOrig) { } else { int element = atoi(chr+1); const int32 *var = *(const int32 **)_dvars[i].variable; - if (element >= _dvars[i].optional) { - DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional); + if (element >= _dvars[i].arraySize) { + DebugPrintf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].arraySize); } else { DebugPrintf("(int)%s = %d\n", param[0], var[element]); } @@ -383,7 +378,7 @@ char *Debugger::readlineComplete(const char *input, int state) { #endif // Variable registration function -void Debugger::DVar_Register(const Common::String &varname, void *pointer, int type, int optional) { +void Debugger::DVar_Register(const Common::String &varname, void *pointer, int type, int arraySize) { // TODO: Filter out duplicates // TODO: Sort this list? Then we can do binary search later on when doing lookups. assert(pointer); @@ -392,7 +387,7 @@ void Debugger::DVar_Register(const Common::String &varname, void *pointer, int t tmp.name = varname; tmp.type = type; tmp.variable = pointer; - tmp.optional = optional; + tmp.arraySize = arraySize; _dvars.push_back(tmp); } @@ -406,7 +401,7 @@ void Debugger::DCmd_Register(const Common::String &cmdname, Debuglet *debuglet) // Detach ("exit") the debugger bool Debugger::Cmd_Exit(int argc, const char **argv) { - _detach_now = true; + detach(); return false; } diff --git a/gui/debugger.h b/gui/debugger.h index 07fdddb808..6f06befdf1 100644 --- a/gui/debugger.h +++ b/gui/debugger.h @@ -43,20 +43,46 @@ public: int DebugPrintf(const char *format, ...); + /** + * The onFrame() method should be invoked by the engine at regular + * intervals (usually once per main loop iteration) whenever the + * debugger is attached. + * This will open up the console and accept user input if certain + * preconditions are met, such as the frame countdown having + * reached zero. + * + * Subclasses can override this to e.g. check for breakpoints being + * triggered. + */ virtual void onFrame(); + /** + * 'Attach' the debugger. This ensures that the next time onFrame() + * is invoked, the debugger will activate and accept user input. + */ virtual void attach(const char *entry = 0); - bool isAttached() const { return _isAttached; } + + /** + * Return true if the debugger is currently active (i.e. executing + * a command or waiting for use input). + */ + bool isActive() const { return _isActive; } protected: typedef Common::Functor2 Debuglet; - // Convenience macro for registering a method of a debugger class - // as the current command. + /** + * Convenience macro that makes it either to register a method + * of a debugger subclass as a command. + * Usage example: + * DCmd_Register("COMMAND", WRAP_METHOD(MyDebugger, MyCmd)); + * would register the method MyDebugger::MyCmd(int, const char **) + * under the command name "COMMAND". + */ #define WRAP_METHOD(cls, method) \ new Common::Functor2Mem(this, &cls::method) - enum { + enum VarType { DVAR_BYTE, DVAR_INT, DVAR_BOOL, @@ -67,50 +93,100 @@ protected: struct DVar { Common::String name; void *variable; - int type; - int optional; + VarType type; + int arraySize; }; - int _frame_countdown; - bool _detach_now; + + /** + * Register a variable with the debugger. This allows the user to read and modify + * this variable. + * @param varname the identifier with which the user may access the variable + * @param variable pointer to the actual storage of the variable + * @param type the type of the variable (byte, int, bool, ...) + * @paral arraySize for type DVAR_INTARRAY this specifies the size of the array + * + * @todo replace this single method by type safe variants. + */ + void DVar_Register(const Common::String &varname, void *variable, VarType type, int arraySize); + void DCmd_Register(const Common::String &cmdname, Debuglet *debuglet); + private: + /** + * The frame countdown specifies a number of frames that must pass + * until the console will show up. This value is decremented by one + * each time onFrame() is called, until it reaches 0, at which point + * onFrame() will open the console and handle input into it. + * + * The user can modify this value using the debug_countdown command. + * + * Note: The console must be in *attached* state, otherwise, it + * won't show up (and the countdown won't count down either). + */ + uint _frameCountdown; + Common::Array _dvars; typedef Common::HashMap, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> CommandsMap; CommandsMap _cmds; - bool _isAttached; + /** + * True if the debugger is currently active (i.e. executing + * a command or waiting for use input). + */ + bool _isActive; + char *_errStr; + + /** + * Initially true, set to false when Debugger::enter is called + * the first time. We use this flag to show a greeting message + * to the user once, when he opens the debugger for the first + * time. + */ bool _firstTime; + #ifndef USE_TEXT_CONSOLE GUI::ConsoleDialog *_debuggerDialog; #endif protected: - // Hook for subclasses: Called just before enter() is run + /** + * Hook for subclasses which is called just before enter() is run. + * A typical usage example is pausing music and sound effects. + */ virtual void preEnter() {} - // Hook for subclasses: Called just after enter() was run + /** + * Hook for subclasses which is called just after enter() was run. + * A typical usage example is resuming music and sound effects. + */ virtual void postEnter() {} - // Hook for subclasses: Process the given command line. - // Should return true if and only if argv[0] is a known command and was - // handled, false otherwise. - virtual bool handleCommand(int argc, const char **argv, bool &keepRunning); - + /** + * Subclasses should invoke the detach() method in their Cmd_FOO methods + * if that command will resume execution of the program (as opposed to + * executing, say, a "single step through code" command). + * + * This currently only hides the virtual keyboard, if any. + */ + void detach(); private: - void detach(); void enter(); bool parseCommand(const char *input); bool tabComplete(const char *input, Common::String &completion) const; -protected: - void DVar_Register(const Common::String &varname, void *pointer, int type, int optional); - void DCmd_Register(const Common::String &cmdname, Debuglet *debuglet); + /** + * Process the given command line. + * Returns true if and only if argv[0] is a known command and was + * handled, false otherwise. + */ + virtual bool handleCommand(int argc, const char **argv, bool &keepRunning); +protected: bool Cmd_Exit(int argc, const char **argv); bool Cmd_Help(int argc, const char **argv); bool Cmd_DebugFlagsList(int argc, const char **argv); -- cgit v1.2.3 From 0b48a71c9955b39117e2eb35b3e398f5c95c008a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 17 Jul 2010 18:41:38 +0000 Subject: Remove PalmOS port svn-id: r50964 --- AUTHORS | 4 +- NEWS | 1 + README | 8 +- backends/events/default/default-events.cpp | 4 +- backends/fs/palmos/palmos-fs-factory.cpp | 42 -- backends/fs/palmos/palmos-fs-factory.h | 49 -- backends/fs/palmos/palmos-fs.cpp | 212 ------- backends/midi/ypa1.cpp | 141 ----- backends/midi/zodiac.cpp | 161 ------ backends/module.mk | 1 - .../platform/PalmOS/Rsc/Resource.Frk/Starter.rsrc | Bin 52995 -> 0 bytes backends/platform/PalmOS/Rsc/Starter.rsrc | 0 backends/platform/PalmOS/Rsc/StarterRsc.h | 395 ------------- backends/platform/PalmOS/Rsc/batLow.bmp | Bin 1592 -> 0 bytes backends/platform/PalmOS/Rsc/keyAlt.bmp | Bin 1336 -> 0 bytes backends/platform/PalmOS/Rsc/keyCommand.bmp | Bin 1336 -> 0 bytes backends/platform/PalmOS/Rsc/keyCtrl.bmp | Bin 1336 -> 0 bytes backends/platform/PalmOS/Rsc/modules.rcp | 71 --- backends/platform/PalmOS/Rsc/modulesrsc.h | 6 - backends/platform/PalmOS/Rsc/numpad.bmp | Bin 1336 -> 0 bytes backends/platform/PalmOS/Src/args.cpp | 106 ---- backends/platform/PalmOS/Src/args.h | 44 -- backends/platform/PalmOS/Src/base_event.cpp | 458 --------------- backends/platform/PalmOS/Src/base_gfx.cpp | 198 ------- backends/platform/PalmOS/Src/base_mouse.cpp | 101 ---- backends/platform/PalmOS/Src/be_68k.cpp | 27 - backends/platform/PalmOS/Src/be_68k.h | 27 - backends/platform/PalmOS/Src/be_base.cpp | 203 ------- backends/platform/PalmOS/Src/be_base.h | 265 --------- backends/platform/PalmOS/Src/be_os5.cpp | 169 ------ backends/platform/PalmOS/Src/be_os5.h | 189 ------- backends/platform/PalmOS/Src/be_os5ex.cpp | 103 ---- backends/platform/PalmOS/Src/be_os5ex.h | 68 --- backends/platform/PalmOS/Src/be_zodiac.cpp | 74 --- backends/platform/PalmOS/Src/be_zodiac.h | 76 --- backends/platform/PalmOS/Src/cd_aeroplayer.cpp | 166 ------ backends/platform/PalmOS/Src/cd_aeroplayer.h | 65 --- backends/platform/PalmOS/Src/cd_default.cpp | 104 ---- backends/platform/PalmOS/Src/cd_default.h | 51 -- backends/platform/PalmOS/Src/cd_msa.cpp | 261 --------- backends/platform/PalmOS/Src/cd_msa.h | 68 --- backends/platform/PalmOS/Src/cd_pockettunes.cpp | 238 -------- backends/platform/PalmOS/Src/cd_pockettunes.h | 69 --- backends/platform/PalmOS/Src/cdaudio.h | 67 --- backends/platform/PalmOS/Src/extend.cpp | 109 ---- backends/platform/PalmOS/Src/features.h | 17 - backends/platform/PalmOS/Src/globals.h | 114 ---- backends/platform/PalmOS/Src/i_zodiac.cpp | 41 -- backends/platform/PalmOS/Src/i_zodiac.h | 12 - backends/platform/PalmOS/Src/init_golcd.cpp | 121 ---- backends/platform/PalmOS/Src/init_golcd.h | 22 - backends/platform/PalmOS/Src/init_mathlib.cpp | 29 - backends/platform/PalmOS/Src/init_mathlib.h | 7 - backends/platform/PalmOS/Src/init_pa1lib.cpp | 32 -- backends/platform/PalmOS/Src/init_pa1lib.h | 22 - backends/platform/PalmOS/Src/init_palmos.cpp | 172 ------ backends/platform/PalmOS/Src/init_palmos.h | 42 -- backends/platform/PalmOS/Src/init_sony.cpp | 163 ------ backends/platform/PalmOS/Src/init_sony.h | 40 -- backends/platform/PalmOS/Src/init_stuffs.cpp | 134 ----- backends/platform/PalmOS/Src/init_stuffs.h | 11 - backends/platform/PalmOS/Src/launcher/app.cpp | 360 ------------ .../PalmOS/Src/launcher/forms/formCards.cpp | 383 ------------- .../platform/PalmOS/Src/launcher/forms/formCards.h | 33 -- .../PalmOS/Src/launcher/forms/formEditGame.cpp | 612 --------------------- .../PalmOS/Src/launcher/forms/formEditGame.h | 39 -- .../PalmOS/Src/launcher/forms/formMisc.cpp | 275 --------- .../PalmOS/Src/launcher/forms/formSelect.cpp | 278 ---------- .../PalmOS/Src/launcher/forms/formSkins.cpp | 267 --------- .../PalmOS/Src/launcher/forms/formUtil.cpp | 60 -- .../platform/PalmOS/Src/launcher/forms/formUtil.h | 23 - .../PalmOS/Src/launcher/forms/forminfo.cpp | 146 ----- .../PalmOS/Src/launcher/forms/formmain.cpp | 364 ------------ .../PalmOS/Src/launcher/forms/formmusic.cpp | 388 ------------- .../platform/PalmOS/Src/launcher/forms/forms.h | 23 - .../PalmOS/Src/launcher/forms/formtabs.cpp | 242 -------- .../platform/PalmOS/Src/launcher/forms/formtabs.h | 24 - backends/platform/PalmOS/Src/launcher/games.cpp | 548 ------------------ backends/platform/PalmOS/Src/launcher/games.h | 212 ------- backends/platform/PalmOS/Src/launcher/launch.cpp | 512 ----------------- backends/platform/PalmOS/Src/launcher/skin.cpp | 612 --------------------- backends/platform/PalmOS/Src/launcher/skin.h | 131 ----- backends/platform/PalmOS/Src/launcher/start.cpp | 367 ------------ backends/platform/PalmOS/Src/launcher/start.h | 98 ---- backends/platform/PalmOS/Src/modules.cpp | 156 ------ backends/platform/PalmOS/Src/modules.h | 22 - backends/platform/PalmOS/Src/native/oscalls.cpp | 92 ---- backends/platform/PalmOS/Src/native/oscalls.h | 58 -- backends/platform/PalmOS/Src/native/pace.h | 103 ---- backends/platform/PalmOS/Src/native/pnoARM.c | 60 -- backends/platform/PalmOS/Src/native/pnoStartup.c | 28 - backends/platform/PalmOS/Src/native/zodiacARM.cpp | 150 ----- .../platform/PalmOS/Src/native/zodiacStartup.cpp | 161 ------ backends/platform/PalmOS/Src/os5_event.cpp | 82 --- backends/platform/PalmOS/Src/os5_gfx.cpp | 309 ----------- backends/platform/PalmOS/Src/os5_mouse.cpp | 157 ------ backends/platform/PalmOS/Src/os5_overlay.cpp | 76 --- backends/platform/PalmOS/Src/os5_renderer.cpp | 118 ---- backends/platform/PalmOS/Src/os5_sound.cpp | 156 ------ backends/platform/PalmOS/Src/os5ex_sound.cpp | 43 -- backends/platform/PalmOS/Src/palmdefs.h | 21 - backends/platform/PalmOS/Src/prefixes/compile.h | 76 --- backends/platform/PalmOS/Src/prefixes/native_agi.h | 11 - .../platform/PalmOS/Src/prefixes/native_agos.h | 7 - .../platform/PalmOS/Src/prefixes/native_cine.h | 12 - .../platform/PalmOS/Src/prefixes/native_common.h | 19 - .../platform/PalmOS/Src/prefixes/native_cruise.h | 11 - .../platform/PalmOS/Src/prefixes/native_drascula.h | 7 - backends/platform/PalmOS/Src/prefixes/native_gob.h | 7 - .../platform/PalmOS/Src/prefixes/native_kyra.h | 7 - .../platform/PalmOS/Src/prefixes/native_lure.h | 11 - backends/platform/PalmOS/Src/prefixes/native_m4.h | 7 - .../platform/PalmOS/Src/prefixes/native_made.h | 7 - .../PalmOS/Src/prefixes/native_parallaction.h | 11 - .../platform/PalmOS/Src/prefixes/native_queen.h | 7 - .../platform/PalmOS/Src/prefixes/native_saga.h | 7 - .../platform/PalmOS/Src/prefixes/native_scumm.h | 12 - backends/platform/PalmOS/Src/prefixes/native_sky.h | 7 - .../platform/PalmOS/Src/prefixes/native_sword1.h | 9 - .../platform/PalmOS/Src/prefixes/native_sword2.h | 10 - .../platform/PalmOS/Src/prefixes/native_touche.h | 7 - .../platform/PalmOS/Src/prefixes/prefix_frontend.h | 9 - backends/platform/PalmOS/Src/prefixes/prefix_os5.h | 13 - .../platform/PalmOS/Src/prefixes/prefix_zodiac.h | 13 - backends/platform/PalmOS/Src/rumble.cpp | 140 ----- backends/platform/PalmOS/Src/rumble.h | 34 -- backends/platform/PalmOS/Src/snd_pa1.cpp | 113 ---- backends/platform/PalmOS/Src/stuffs.h | 32 -- backends/platform/PalmOS/Src/vibrate.h | 61 -- backends/platform/PalmOS/Src/zodiac_event.cpp | 100 ---- backends/platform/PalmOS/Src/zodiac_gfx.cpp | 309 ----------- backends/platform/PalmOS/Src/zodiac_mouse.cpp | 153 ------ backends/platform/PalmOS/Src/zodiac_overlay.cpp | 67 --- backends/platform/PalmOS/arm.bat | 3 - backends/platform/PalmOS/scummvm.mcp | Bin 1147982 -> 0 bytes base/commandLine.cpp | 4 +- base/plugins.cpp | 7 - common/hashmap.h | 3 - common/scummsys.h | 21 - common/textconsole.cpp | 5 - engines/cruise/cruise.cpp | 4 - engines/cruise/vars.cpp | 4 - engines/cruise/vars.h | 5 - engines/queen/resource.cpp | 11 - engines/sword1/memman.h | 4 - engines/sword2/resman.h | 4 - graphics/video/mpeg_player.h | 4 +- gui/ListWidget.cpp | 5 - gui/console.cpp | 4 - gui/credits.h | 5 +- sound/rate_arm_asm.s | 30 - sound/softsynth/opl/mame.cpp | 4 +- tools/convbdf.c | 2 +- tools/credits.pl | 5 +- 154 files changed, 14 insertions(+), 14585 deletions(-) delete mode 100644 backends/fs/palmos/palmos-fs-factory.cpp delete mode 100644 backends/fs/palmos/palmos-fs-factory.h delete mode 100644 backends/fs/palmos/palmos-fs.cpp delete mode 100644 backends/midi/ypa1.cpp delete mode 100644 backends/midi/zodiac.cpp delete mode 100644 backends/platform/PalmOS/Rsc/Resource.Frk/Starter.rsrc delete mode 100644 backends/platform/PalmOS/Rsc/Starter.rsrc delete mode 100644 backends/platform/PalmOS/Rsc/StarterRsc.h delete mode 100644 backends/platform/PalmOS/Rsc/batLow.bmp delete mode 100644 backends/platform/PalmOS/Rsc/keyAlt.bmp delete mode 100644 backends/platform/PalmOS/Rsc/keyCommand.bmp delete mode 100644 backends/platform/PalmOS/Rsc/keyCtrl.bmp delete mode 100644 backends/platform/PalmOS/Rsc/modules.rcp delete mode 100644 backends/platform/PalmOS/Rsc/modulesrsc.h delete mode 100644 backends/platform/PalmOS/Rsc/numpad.bmp delete mode 100644 backends/platform/PalmOS/Src/args.cpp delete mode 100644 backends/platform/PalmOS/Src/args.h delete mode 100644 backends/platform/PalmOS/Src/base_event.cpp delete mode 100644 backends/platform/PalmOS/Src/base_gfx.cpp delete mode 100644 backends/platform/PalmOS/Src/base_mouse.cpp delete mode 100644 backends/platform/PalmOS/Src/be_68k.cpp delete mode 100644 backends/platform/PalmOS/Src/be_68k.h delete mode 100644 backends/platform/PalmOS/Src/be_base.cpp delete mode 100644 backends/platform/PalmOS/Src/be_base.h delete mode 100644 backends/platform/PalmOS/Src/be_os5.cpp delete mode 100644 backends/platform/PalmOS/Src/be_os5.h delete mode 100644 backends/platform/PalmOS/Src/be_os5ex.cpp delete mode 100644 backends/platform/PalmOS/Src/be_os5ex.h delete mode 100644 backends/platform/PalmOS/Src/be_zodiac.cpp delete mode 100644 backends/platform/PalmOS/Src/be_zodiac.h delete mode 100644 backends/platform/PalmOS/Src/cd_aeroplayer.cpp delete mode 100644 backends/platform/PalmOS/Src/cd_aeroplayer.h delete mode 100644 backends/platform/PalmOS/Src/cd_default.cpp delete mode 100644 backends/platform/PalmOS/Src/cd_default.h delete mode 100644 backends/platform/PalmOS/Src/cd_msa.cpp delete mode 100644 backends/platform/PalmOS/Src/cd_msa.h delete mode 100644 backends/platform/PalmOS/Src/cd_pockettunes.cpp delete mode 100644 backends/platform/PalmOS/Src/cd_pockettunes.h delete mode 100644 backends/platform/PalmOS/Src/cdaudio.h delete mode 100644 backends/platform/PalmOS/Src/extend.cpp delete mode 100644 backends/platform/PalmOS/Src/features.h delete mode 100644 backends/platform/PalmOS/Src/globals.h delete mode 100644 backends/platform/PalmOS/Src/i_zodiac.cpp delete mode 100644 backends/platform/PalmOS/Src/i_zodiac.h delete mode 100644 backends/platform/PalmOS/Src/init_golcd.cpp delete mode 100644 backends/platform/PalmOS/Src/init_golcd.h delete mode 100644 backends/platform/PalmOS/Src/init_mathlib.cpp delete mode 100644 backends/platform/PalmOS/Src/init_mathlib.h delete mode 100644 backends/platform/PalmOS/Src/init_pa1lib.cpp delete mode 100644 backends/platform/PalmOS/Src/init_pa1lib.h delete mode 100644 backends/platform/PalmOS/Src/init_palmos.cpp delete mode 100644 backends/platform/PalmOS/Src/init_palmos.h delete mode 100644 backends/platform/PalmOS/Src/init_sony.cpp delete mode 100644 backends/platform/PalmOS/Src/init_sony.h delete mode 100644 backends/platform/PalmOS/Src/init_stuffs.cpp delete mode 100644 backends/platform/PalmOS/Src/init_stuffs.h delete mode 100644 backends/platform/PalmOS/Src/launcher/app.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formCards.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formCards.h delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formEditGame.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formEditGame.h delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formMisc.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formUtil.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formUtil.h delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/forminfo.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formmain.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/forms.h delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formtabs.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/forms/formtabs.h delete mode 100644 backends/platform/PalmOS/Src/launcher/games.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/games.h delete mode 100644 backends/platform/PalmOS/Src/launcher/launch.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/skin.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/skin.h delete mode 100644 backends/platform/PalmOS/Src/launcher/start.cpp delete mode 100644 backends/platform/PalmOS/Src/launcher/start.h delete mode 100644 backends/platform/PalmOS/Src/modules.cpp delete mode 100644 backends/platform/PalmOS/Src/modules.h delete mode 100644 backends/platform/PalmOS/Src/native/oscalls.cpp delete mode 100644 backends/platform/PalmOS/Src/native/oscalls.h delete mode 100644 backends/platform/PalmOS/Src/native/pace.h delete mode 100644 backends/platform/PalmOS/Src/native/pnoARM.c delete mode 100644 backends/platform/PalmOS/Src/native/pnoStartup.c delete mode 100644 backends/platform/PalmOS/Src/native/zodiacARM.cpp delete mode 100644 backends/platform/PalmOS/Src/native/zodiacStartup.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_event.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_gfx.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_mouse.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_overlay.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_renderer.cpp delete mode 100644 backends/platform/PalmOS/Src/os5_sound.cpp delete mode 100644 backends/platform/PalmOS/Src/os5ex_sound.cpp delete mode 100644 backends/platform/PalmOS/Src/palmdefs.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/compile.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_agi.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_agos.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_cine.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_common.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_cruise.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_drascula.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_gob.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_kyra.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_lure.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_m4.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_made.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_parallaction.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_queen.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_saga.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_scumm.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_sky.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_sword1.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_sword2.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/native_touche.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/prefix_frontend.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/prefix_os5.h delete mode 100644 backends/platform/PalmOS/Src/prefixes/prefix_zodiac.h delete mode 100644 backends/platform/PalmOS/Src/rumble.cpp delete mode 100644 backends/platform/PalmOS/Src/rumble.h delete mode 100644 backends/platform/PalmOS/Src/snd_pa1.cpp delete mode 100644 backends/platform/PalmOS/Src/stuffs.h delete mode 100644 backends/platform/PalmOS/Src/vibrate.h delete mode 100644 backends/platform/PalmOS/Src/zodiac_event.cpp delete mode 100644 backends/platform/PalmOS/Src/zodiac_gfx.cpp delete mode 100644 backends/platform/PalmOS/Src/zodiac_mouse.cpp delete mode 100644 backends/platform/PalmOS/Src/zodiac_overlay.cpp delete mode 100755 backends/platform/PalmOS/arm.bat delete mode 100644 backends/platform/PalmOS/scummvm.mcp diff --git a/AUTHORS b/AUTHORS index 528674d59f..2891db3cb0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -190,9 +190,6 @@ ScummVM Team Nintendo DS: Neil Millstone - PalmOS: - Chris Apers - PocketPC / WinCE: Nicolas Bacca - (retired) Kostas Nakos @@ -256,6 +253,7 @@ ScummVM Team Retired Team Members -------------------- + Chris Apers - Former PalmOS porter Ralph Brorsen - Help with GUI implementation Jamieson Christian - iMUSE, MIDI, all things musical Felix Jakschitsch - Zak256 reverse engineering diff --git a/NEWS b/NEWS index 908c121721..6ce5f2b898 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Added Android port. General: + - Removed the outdated PalmOS port. - Switched to the "fast" DOSBox OPL emulator. - Fixed a crash in the rjp1 player code affecting the FOTAQ Amiga version. - Added support for more original media layouts. diff --git a/README b/README index 3c97bbbbd7..c583cf994c 100644 --- a/README +++ b/README @@ -859,17 +859,13 @@ Supported platforms include (but are not limited to): Nintendo DS Nintendo Wii OS/2 - PalmOS PlayStation 2 PlayStation Portable Symbian The Dreamcast port does not support The Curse of Monkey Island, nor The -Dig. The PalmOS port does not support The Curse of Monkey Island, -Beneath a Steel Sky, nor either Simon the Sorcerer 1 or 2. The Dig will -only work on some Palm devices (those with a large dynamic heap). The -Nintendo DS port does not support Full Throttle, The Dig, or The Curse -of Monkey Island. +Dig. The Nintendo DS port does not support Full Throttle, The Dig, or +The Curse of Monkey Island. For more platform specific limitations, please refer to our Wiki: http://wiki.scummvm.org/index.php/Platforms diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp index 212cb130c1..0616713eab 100644 --- a/backends/events/default/default-events.cpp +++ b/backends/events/default/default-events.cpp @@ -95,13 +95,11 @@ bool DefaultEventManager::pollEvent(Common::Event &event) { case Common::EVENT_KEYDOWN: _modifierState = event.kbd.flags; // init continuous event stream - // not done on PalmOS because keyboard is emulated and keyup is not generated -#if !defined(PALMOS_MODE) _currentKeyDown.ascii = event.kbd.ascii; _currentKeyDown.keycode = event.kbd.keycode; _currentKeyDown.flags = event.kbd.flags; _keyRepeatTime = time + kKeyRepeatInitialDelay; -#endif + // Global Main Menu if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_F5) { if (g_engine && !g_engine->isPaused()) { diff --git a/backends/fs/palmos/palmos-fs-factory.cpp b/backends/fs/palmos/palmos-fs-factory.cpp deleted file mode 100644 index 97b3644205..0000000000 --- a/backends/fs/palmos/palmos-fs-factory.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#if defined(PALMOS_MODE) -#include "backends/fs/palmos/palmos-fs-factory.h" -#include "backends/fs/palmos/palmos-fs.cpp" - -DECLARE_SINGLETON(PalmOSFilesystemFactory) - -AbstractFSNode *PalmOSFilesystemFactory::makeRootFileNode() const { - return new PalmOSFilesystemNode(); -} - -AbstractFSNode *PalmOSFilesystemFactory::makeCurrentDirectoryFileNode() const { - return new PalmOSFilesystemNode(); -} - -AbstractFSNode *PalmOSFilesystemFactory::makeFileNodePath(const Common::String &path) const { - return new PalmOSFilesystemNode(path); -} -#endif diff --git a/backends/fs/palmos/palmos-fs-factory.h b/backends/fs/palmos/palmos-fs-factory.h deleted file mode 100644 index 72729c570d..0000000000 --- a/backends/fs/palmos/palmos-fs-factory.h +++ /dev/null @@ -1,49 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#ifndef PALMOS_FILESYSTEM_FACTORY_H -#define PALMOS_FILESYSTEM_FACTORY_H - -#include "common/singleton.h" -#include "backends/fs/fs-factory.h" - -/** - * Creates PalmOSFilesystemNode objects. - * - * Parts of this class are documented in the base interface class, FilesystemFactory. - */ -class PalmOSFilesystemFactory : public FilesystemFactory, public Common::Singleton { -public: - virtual AbstractFSNode *makeRootFileNode() const; - virtual AbstractFSNode *makeCurrentDirectoryFileNode() const; - virtual AbstractFSNode *makeFileNodePath(const Common::String &path) const; - -protected: - PalmOSFilesystemFactory() {}; - -private: - friend class Common::Singleton; -}; - -#endif /*PALMOS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/palmos/palmos-fs.cpp b/backends/fs/palmos/palmos-fs.cpp deleted file mode 100644 index 4e05f75d19..0000000000 --- a/backends/fs/palmos/palmos-fs.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#if defined(PALMOS_MODE) - -#include "PalmVersion.h" -#include "globals.h" - -#include "backends/fs/abstract-fs.h" -#include "backends/fs/stdiostream.h" - -/** - * Implementation of the ScummVM file system API based on PalmOS VFS API. - * - * Parts of this class are documented in the base interface class, AbstractFSNode. - */ -class PalmOSFilesystemNode : public AbstractFSNode { -protected: - Common::String _displayName; - Common::String _path; - bool _isDirectory; - bool _isValid; - bool _isPseudoRoot; // TODO: get rid of this - -public: - /** - * Creates a PalmOSFilesystemNode with the root node as path. - */ - PalmOSFilesystemNode(); - - /** - * Creates a PalmOSFilesystemNode for a given path. - * - * @param path Common::String with the path the new node should point to. - */ - PalmOSFilesystemNode(const Common::String &p); - - virtual bool exists() const { return _isValid; } - virtual Common::String getDisplayName() const { return _displayName; } - virtual Common::String getName() const { return _displayName; } - virtual Common::String getPath() const { return _path; } - virtual bool isDirectory() const { return _isDirectory; } - virtual bool isReadable() const { return true; } //FIXME: this is just a stub - virtual bool isWritable() const { return true; } //FIXME: this is just a stub - - virtual AbstractFSNode *getChild(const Common::String &n) const; - virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; - virtual AbstractFSNode *getParent() const; - - virtual Common::SeekableReadStream *createReadStream(); - virtual Common::WriteStream *createWriteStream(); - -private: - /** - * Adds a single PalmOSFilesystemNode to a given list. - * This method is used by getChildren() to populate the directory entries list. - * - * @param list List to put the file entry node in. - * @param mode Mode to use while adding the file entry to the list. - * @param base Common::String with the directory being listed. - * @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find. - */ - static void addFile(AbstractFSList &list, ListMode mode, const Char *base, FileInfoType* find_data); -}; - -void PalmOSFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, FileInfoType* find_data) { - PalmOSFilesystemNode entry; - bool isDir; - - isDir = (find_data->attributes & vfsFileAttrDirectory); - - if ((!isDir && mode == Common::FSNode::kListDirectoriesOnly) || - (isDir && mode == Common::FSNode::kListFilesOnly)) - return; - - entry._isDirectory = isDir; - entry._displayName = find_data->nameP; - entry._path = base; - entry._path += find_data->nameP; - - if (entry._isDirectory) - entry._path += "/"; - - entry._isValid = true; - entry._isPseudoRoot = false; - - list.push_back(new PalmOSFilesystemNode(entry)); -} - -PalmOSFilesystemNode::PalmOSFilesystemNode() { - _isDirectory = true; - _displayName = "Root"; - _isValid = true; - _path = "/"; - _isPseudoRoot = false; -} - -PalmOSFilesystemNode::PalmOSFilesystemNode(const Common::String &p) { - assert(p.size() > 0); - - _path = p; - _displayName = lastPathComponent(_path, '/'); - - UInt32 attr; - FileRef handle; - Err error = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); - if (!error) { - error = VFSFileGetAttributes(handle, &attr); - VFSFileClose(handle); - } - - if (error) { - _isValid = false; - _isDirectory = false; - - } else { - _isValid = true; - _isDirectory = (attr & vfsFileAttrDirectory); - } - - _isPseudoRoot = false; -} - -AbstractFSNode *PalmOSFilesystemNode::getChild(const Common::String &n) const { - // FIXME: Pretty lame implementation! We do no error checking to speak - // of, do not check if this is a special node, etc. - assert(_isDirectory); - - Common::String newPath(_path); - if (_path.lastChar() != '/') - newPath += '/'; - newPath += n; - - return new PalmOSFilesystemNode(newPath); -} - -bool PalmOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const { - assert(_isDirectory); - - //TODO: honor the hidden flag - - Err error; - Char nameP[256]; - FileInfoType desc; - FileRef handle; - UInt32 dirIterator = expIteratorStart; - - desc.nameP = nameP; - desc.nameBufLen = 256; - - error = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); - if (error) - return false; - - while (dirIterator != expIteratorStop) { - error = VFSDirEntryEnumerate(handle, &dirIterator, &desc); - if (!error) - addFile(myList, mode, _path.c_str(), &desc); - } - - VFSFileClose(handle); - return true; -} - -AbstractFSNode *PalmOSFilesystemNode::getParent() const { - PalmOSFilesystemNode *p = 0; - - if (!_isPseudoRoot) { - const char *start = _path.c_str(); - const char *end = lastPathComponent(_path, '/'); - - p = new PalmOSFilesystemNode(); - p->_path = Common::String(start, end - start); - p->_isValid = true; - p->_isDirectory = true; - p->_displayName = lastPathComponent(p->_path, '/'); - p->_isPseudoRoot =(p->_path == "/"); - } - - return p; -} - -Common::SeekableReadStream *PalmOSFilesystemNode::createReadStream() { - return StdioStream::makeFromPath(getPath().c_str(), false); -} - -Common::WriteStream *PalmOSFilesystemNode::createWriteStream() { - return StdioStream::makeFromPath(getPath().c_str(), true); -} - -#endif // PALMOS_MODE diff --git a/backends/midi/ypa1.cpp b/backends/midi/ypa1.cpp deleted file mode 100644 index fb114d625c..0000000000 --- a/backends/midi/ypa1.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#include "common/util.h" -#include "sound/musicplugin.h" -#include "sound/mpu401.h" - -#include "Pa1Lib.h" - -class MidiDriver_YamahaPa1:public MidiDriver_MPU401 { -public: - MidiDriver_YamahaPa1(); - int open(); - void close(); - void send(uint32 b); - -private: - UInt8 _midiHandle; - Boolean _isOpen; - }; - -MidiDriver_YamahaPa1::MidiDriver_YamahaPa1() { - _isOpen = false; - _midiHandle = 0; -} - -int MidiDriver_YamahaPa1::open() { - if (!(_isOpen = Pa1Lib_midiOpen(NULL, &_midiHandle))) - return MERR_DEVICE_NOT_AVAILABLE; - - return 0; -} - -void MidiDriver_YamahaPa1::close() { - if (_isOpen) { - _isOpen = false; - MidiDriver_MPU401::close(); - for (UInt8 channel = 0; channel < 16; channel++) { - Pa1Lib_midiControlChange(_midiHandle, channel, 120,0); // all sound off - Pa1Lib_midiControlChange(_midiHandle, channel, 121,0); // reset all controller - Pa1Lib_midiControlChange(_midiHandle, channel, 123, 0); // all notes off - } - Pa1Lib_midiClose(_midiHandle); - } -} - -void MidiDriver_YamahaPa1::send(uint32 b) { - if (!_isOpen) - return; - - UInt8 midiCmd[4]; - UInt8 chanID,mdCmd; - - midiCmd[3] = (b & 0xFF000000) >> 24; - midiCmd[2] = (b & 0x00FF0000) >> 16; - midiCmd[1] = (b & 0x0000FF00) >> 8; - midiCmd[0] = (b & 0x000000FF); - - chanID = (midiCmd[0] & 0x0F) ; - mdCmd = midiCmd[0] & 0xF0; - - switch (mdCmd) { - case 0x80: // note off - Pa1Lib_midiNoteOff(_midiHandle, chanID, midiCmd[1], 0); - break; - - case 0x90: // note on - Pa1Lib_midiNoteOn(_midiHandle, chanID, midiCmd[1], midiCmd[2]); - break; - - case 0xB0: // control change - Pa1Lib_midiControlChange(_midiHandle, chanID, midiCmd[1], midiCmd[2]); - break; - - case 0xC0: // progam change - Pa1Lib_midiProgramChange(_midiHandle, chanID, midiCmd[1]); - break; - - case 0xE0: // pitchBend - Pa1Lib_midiPitchBend(_midiHandle, chanID, (short)(midiCmd[1] | (midiCmd[2] << 8))); - break; - } -} - - -// Plugin interface - -class YamahaPa1MusicPlugin : public MusicPluginObject { -public: - const char *getName() const { - return "Yamaha Pa1"; - } - - const char *getId() const { - return "ypa1"; - } - - MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; -}; - -MusicDevices YamahaPa1MusicPlugin::getDevices() const { - MusicDevices devices; - // TODO: Return a different music type depending on the configuration - // TODO: List the available devices - devices.push_back(MusicDevice(this, "", MT_GM)); - return devices; -} - -Common::Error YamahaPa1MusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { - *mididriver = new MidiDriver_YamahaPa1(); - - return Common::kNoError; -} - -//#if PLUGIN_ENABLED_DYNAMIC(YPA1) - //REGISTER_PLUGIN_DYNAMIC(YPA1, PLUGIN_TYPE_MUSIC, YamahaPa1MusicPlugin); -//#else - REGISTER_PLUGIN_STATIC(YPA1, PLUGIN_TYPE_MUSIC, YamahaPa1MusicPlugin); -//#endif diff --git a/backends/midi/zodiac.cpp b/backends/midi/zodiac.cpp deleted file mode 100644 index e848315ca4..0000000000 --- a/backends/midi/zodiac.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#include "common/util.h" -#include "sound/musicplugin.h" -#include "sound/mpu401.h" - -#ifndef DISABLE_TAPWAVE - -#include - - -class MidiDriver_Zodiac:public MidiDriver_MPU401 { -public: - MidiDriver_Zodiac(); - int open(); - void close(); - void send(uint32 b); - void sysEx(const byte *msg, uint16 length); - -private: - TwMidiHandle _midiHandle; - Boolean _isOpen; - Int32 _oldVol; - }; - -MidiDriver_Zodiac::MidiDriver_Zodiac() { - _isOpen = false; - _midiHandle = 0; -} - -int MidiDriver_Zodiac::open() { - Err e; - - if (e = TwMidiOpen(&_midiHandle)) - return MERR_DEVICE_NOT_AVAILABLE; - - TwMidiGetMasterVolume(&_oldVol); - TwMidiSetMasterVolume(twMidiMaxVolume); // TODO : set volume based on gVars - - _isOpen = true; - return 0; -} - -void MidiDriver_Zodiac::close() { - if (_isOpen) { - _isOpen = false; - MidiDriver_MPU401::close(); - - TwMidiSetMasterVolume(_oldVol); - TwMidiClose(_midiHandle); - } -} - -void MidiDriver_Zodiac::send(uint32 b) { - if (!_isOpen) - return; - - UInt8 midiCmd[4]; - UInt8 chanID,mdCmd; - - midiCmd[3] = (b & 0xFF000000) >> 24; - midiCmd[2] = (b & 0x00FF0000) >> 16; - midiCmd[1] = (b & 0x0000FF00) >> 8; - midiCmd[0] = (b & 0x000000FF); - - chanID = (midiCmd[0] & 0x0F) ; - mdCmd = midiCmd[0] & 0xF0; - - switch (mdCmd) { - case 0x80: // note off - TwMidiNoteOff(_midiHandle, chanID, midiCmd[1], 0); - break; - - case 0x90: // note on - TwMidiNoteOn(_midiHandle, chanID, midiCmd[1], midiCmd[2]); - break; - - case 0xB0: // control change - TwMidiControlChange(_midiHandle, chanID, midiCmd[1], midiCmd[2]); - break; - - case 0xC0: // progam change - TwMidiProgramChange(_midiHandle, chanID, midiCmd[1]); - break; - - case 0xE0: // pitchBend - TwMidiPitchBend(_midiHandle, chanID, (short)(midiCmd[1] | (midiCmd[2] << 8))); - break; - } -} - -void MidiDriver_Zodiac::sysEx(const byte *msg, uint16 length) { - unsigned char buf[266]; - - buf[0] = 0xF0; - memcpy(buf + 1, msg, length); - buf[length + 1] = 0xF7; - - TwMidiSysEx(_midiHandle, 0, (byte *)buf, length + 2); -} - - -// Plugin interface - -class ZodiacMusicPlugin : public MusicPluginObject { -public: - const char *getName() const { - return "Tapwave Zodiac"; - } - - const char *getId() const { - return "zodiac"; - } - - MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; -}; - -MusicDevices ZodiacMusicPlugin::getDevices() const { - MusicDevices devices; - // TODO: Return a different music type depending on the configuration - // TODO: List the available devices - devices.push_back(MusicDevice(this, "", MT_GM)); - return devices; -} - -Common::Error ZodiacMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { - *mididriver = new MidiDriver_Zodiac(); - - return Common::kNoError; -} - -//#if PLUGIN_ENABLED_DYNAMIC(ZODIAC) - //REGISTER_PLUGIN_DYNAMIC(ZODIAC, PLUGIN_TYPE_MUSIC, ZodiacMusicPlugin); -//#else - REGISTER_PLUGIN_STATIC(ZODIAC, PLUGIN_TYPE_MUSIC, ZodiacMusicPlugin); -//#endif - -#endif diff --git a/backends/module.mk b/backends/module.mk index 59df56b468..fb48f3d249 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -7,7 +7,6 @@ MODULE_OBJS := \ fs/stdiostream.o \ fs/amigaos4/amigaos4-fs-factory.o \ fs/ds/ds-fs-factory.o \ - fs/palmos/palmos-fs-factory.o \ fs/posix/posix-fs-factory.o \ fs/ps2/ps2-fs-factory.o \ fs/psp/psp-fs-factory.o \ diff --git a/backends/platform/PalmOS/Rsc/Resource.Frk/Starter.rsrc b/backends/platform/PalmOS/Rsc/Resource.Frk/Starter.rsrc deleted file mode 100644 index 70f74412e7..0000000000 Binary files a/backends/platform/PalmOS/Rsc/Resource.Frk/Starter.rsrc and /dev/null differ diff --git a/backends/platform/PalmOS/Rsc/Starter.rsrc b/backends/platform/PalmOS/Rsc/Starter.rsrc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/backends/platform/PalmOS/Rsc/StarterRsc.h b/backends/platform/PalmOS/Rsc/StarterRsc.h deleted file mode 100644 index fba46b310b..0000000000 --- a/backends/platform/PalmOS/Rsc/StarterRsc.h +++ /dev/null @@ -1,395 +0,0 @@ -#ifndef STARTERRSC_H -#define STARTERRSC_H - -// Header generated by Constructor for Palm OS (R) 1.9.1 -// -// Generated at 12:00:06 on samedi 25 août 2007 -// -// Generated for file: Starter.rsrc -// -// THIS IS AN AUTOMATICALLY GENERATED HEADER FILE -// DO NOT EDIT - CHANGES MADE TO THIS FILE WILL BE LOST -// -// Palm App Name: "ScummVM" -// -// Palm App Version: "1.0" - - -// Resource: tFRM 1000 -#define MainForm 1000 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 160, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 1000, Default Button ID = 0) -#define MainCardsButton 1003 //(Left Origin = 135, Top Origin = 1, Width = 12, Height = 12, Usable = 1, Anchor Left = 1, Frame = 0, Non-bold Frame = 0, Font = Standard) -#define MainAboutButton 1012 //(Left Origin = 148, Top Origin = 1, Width = 12, Height = 12, Usable = 1, Anchor Left = 1, Frame = 0, Non-bold Frame = 1, Font = Standard) -#define MainMSBitMap 1100 //(Left Origin = 135, Top Origin = 1, Bitmap Resource ID = 1100, Usable = 0) -#define MainMSNoneBitMap 1110 //(Left Origin = 135, Top Origin = 1, Bitmap Resource ID = 1110, Usable = 0) -#define MainUnnamed1010BitMap 2000 //(Left Origin = 148, Top Origin = 1, Bitmap Resource ID = 2000, Usable = 1) - -// Resource: tFRM 1200 -#define SkinsForm 1200 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 1203) -#define SkinsOKButton 1202 //(Left Origin = 5, Top Origin = 139, Width = 32, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define SkinsCancelButton 1203 //(Left Origin = 43, Top Origin = 139, Width = 32, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define SkinsDeleteButton 1205 //(Left Origin = 119, Top Origin = 139, Width = 32, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define SkinsBeamButton 1206 //(Left Origin = 81, Top Origin = 139, Width = 32, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define SkinsSoundClickCheckbox 1204 //(Left Origin = 5, Top Origin = 118, Width = 93, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define SkinsSkinList 1201 //(Left Origin = 5, Top Origin = 17, Width = 146, Usable = 1, Font = Standard, Visible Items = 9) - -// Resource: tFRM 1500 -#define CardSlotForm 1500 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define CardSlotOkButton 1510 //(Left Origin = 3, Top Origin = 140, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define CardSlotCancelButton 1511 //(Left Origin = 44, Top Origin = 140, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) - -// Resource: tFRM 2700 -#define MiscForm 2700 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define MiscOKButton 2710 //(Left Origin = 5, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define MiscCancelButton 2711 //(Left Origin = 46, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) - -// Resource: tFRM 2000 -#define ConvertForm 2000 //(Left Origin = 34, Top Origin = 64, Width = 91, Height = 32, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define ConvertUnnamed2001Label 2001 //(Left Origin = 7, Top Origin = 4, Usable = 1, Font = Standard) -#define ConvertUnnamed2002Label 2002 //(Left Origin = 16, Top Origin = 16, Usable = 1, Font = Bold) - -// Resource: tFRM 2100 -#define BeamForm 2100 //(Left Origin = 2, Top Origin = 72, Width = 156, Height = 86, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define BeamSendButton 2105 //(Left Origin = 5, Top Origin = 69, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define BeamCancelButton 2106 //(Left Origin = 47, Top Origin = 69, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define BeamMathlibCheckbox 2101 //(Left Origin = 4, Top Origin = 28, Width = 55, Height = 12, Usable = 1, Selected = 1, Group ID = 0, Font = Standard) -#define BeamGamesCheckbox 2103 //(Left Origin = 4, Top Origin = 40, Width = 86, Height = 12, Usable = 1, Selected = 1, Group ID = 0, Font = Standard) -#define BeamSkinCheckbox 2104 //(Left Origin = 4, Top Origin = 52, Width = 84, Height = 12, Usable = 1, Selected = 1, Group ID = 0, Font = Standard) -#define BeamUnnamed2102Label 2102 //(Left Origin = 4, Top Origin = 16, Usable = 1, Font = Bold) - -// Resource: tFRM 2200 -#define MusicForm 2200 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define MusicOKButton 2210 //(Left Origin = 5, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define MusicCancelButton 2211 //(Left Origin = 46, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) - -// Resource: tFRM 2300 -#define TabMusicForm 2300 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 120, Usable = 0, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabMusicMusicCheckbox 2301 //(Left Origin = 4, Top Origin = 12, Width = 100, Height = 12, Usable = 1, Selected = 1, Group ID = 0, Font = Standard) -#define TabMusicMultiMidiCheckbox 2308 //(Left Origin = 4, Top Origin = 24, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMusicTempoField 2302 //(Left Origin = 54, Top Origin = 36, Width = 16, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 3, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabMusicTitleLabel 2303 //(Left Origin = 6, Top Origin = 0, Usable = 1, Font = Bold) -#define TabMusicUnnamed2304Label 2304 //(Left Origin = 21, Top Origin = 48, Usable = 1, Font = Standard) -#define TabMusicUnnamed2305Label 2305 //(Left Origin = 16, Top Origin = 60, Usable = 1, Font = Standard) -#define TabMusicUnnamed2306Label 2306 //(Left Origin = 18, Top Origin = 36, Usable = 1, Font = Standard) -#define TabMusicUnnamed2307Label 2307 //(Left Origin = 72, Top Origin = 36, Usable = 1, Font = Standard) -#define TabMusicUnnamed2309Label 2309 //(Left Origin = 28, Top Origin = 72, Usable = 1, Font = Standard) -#define TabMusicRateList 2311 //(Left Origin = 54, Top Origin = 73, Width = 55, Usable = 0, Font = Standard, Visible Items = 3) -#define TabMusicQualityList 2313 //(Left Origin = 54, Top Origin = 60, Width = 60, Usable = 0, Font = Standard, Visible Items = 3) -#define TabMusicDriverList 2331 //(Left Origin = 54, Top Origin = 24, Width = 65, Usable = 0, Font = Standard, Visible Items = 4) -#define TabMusicRatePopTrigger 2310 //(Left Origin = 54, Top Origin = 72, Width = 55, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 2311) -#define TabMusicQualityPopTrigger 2312 //(Left Origin = 54, Top Origin = 60, Width = 50, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 2313) -#define TabMusicDriverPopTrigger 2330 //(Left Origin = 54, Top Origin = 48, Width = 65, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 2331) - -// Resource: tFRM 2500 -#define TabAudioCDForm 2500 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 110, Usable = 0, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabAudioCDMP3Checkbox 2502 //(Left Origin = 4, Top Origin = 12, Width = 125, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabAudioCDLengthSecsField 2504 //(Left Origin = 112, Top Origin = 60, Width = 16, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 3, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabAudioCDFirstTrackField 2507 //(Left Origin = 112, Top Origin = 50, Width = 16, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 80, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabAudioCDUnnamed2501Label 2501 //(Left Origin = 6, Top Origin = 0, Usable = 1, Font = Bold) -#define TabAudioCDUnnamed2503Label 2503 //(Left Origin = 20, Top Origin = 60, Usable = 1, Font = Standard) -#define TabAudioCDUnnamed2505Label 2505 //(Left Origin = 130, Top Origin = 61, Usable = 1, Font = Standard) -#define TabAudioCDUnnamed2506Label 2506 //(Left Origin = 21, Top Origin = 48, Usable = 1, Font = Standard) -#define TabAudioCDUnnamed2508Label 2508 //(Left Origin = 25, Top Origin = 24, Usable = 1, Font = Standard) -#define TabAudioCDUnnamed2511Label 2511 //(Left Origin = 21, Top Origin = 36, Usable = 1, Font = Standard) -#define TabAudioCDUnnamed2514Label 2514 //(Left Origin = 4, Top Origin = 80, Usable = 1, Font = Standard) -#define TabAudioCDDriverList 2510 //(Left Origin = 58, Top Origin = 24, Width = 90, Usable = 0, Font = Standard, Visible Items = 4) -#define TabAudioCDFormatList 2513 //(Left Origin = 58, Top Origin = 36, Width = 70, Usable = 0, Font = Standard, Visible Items = 2) -#define TabAudioCDDriverPopTrigger 2509 //(Left Origin = 58, Top Origin = 24, Width = 90, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 2510) -#define TabAudioCDFormatPopTrigger 2512 //(Left Origin = 58, Top Origin = 36, Width = 70, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 2513) - -// Resource: tFRM 2600 -#define TabVolumeForm 2600 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 100, Usable = 0, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabVolumeUnnamed2601Label 2601 //(Left Origin = 29, Top Origin = 69, Usable = 1, Font = Standard) -#define TabVolumeUnnamed2603Label 2603 //(Left Origin = 6, Top Origin = 0, Usable = 1, Font = Bold) -#define TabVolumeUnnamed2606Label 2606 //(Left Origin = 26, Top Origin = 15, Usable = 1, Font = Standard) -#define TabVolumeUnnamed2607Label 2607 //(Left Origin = 12, Top Origin = 30, Usable = 1, Font = Standard) -#define TabVolumeUnnamed2608Label 2608 //(Left Origin = 20, Top Origin = 45, Usable = 1, Font = Standard) -#define TabVolumeUnnamed2610Label 2610 //(Left Origin = 14, Top Origin = 84, Usable = 1, Font = Standard) -#define TabVolumeMusicSliderControl 2602 //(Left Origin = 58, Top Origin = 12, Width = 93, Height = 15, Usable = 1, Initial Value = 0, Minimum Value = 0, Maximum Value = 255, Page Jump Amount = 1, Thumb Bitmap = 0, Background Bitmap = 0) -#define TabVolumeSfxSliderControl 2604 //(Left Origin = 58, Top Origin = 27, Width = 93, Height = 15, Usable = 1, Initial Value = 0, Minimum Value = 0, Maximum Value = 255, Page Jump Amount = 1, Thumb Bitmap = 0, Background Bitmap = 0) -#define TabVolumePalmSliderControl 2605 //(Left Origin = 58, Top Origin = 66, Width = 93, Height = 15, Usable = 1, Initial Value = 0, Minimum Value = 0, Maximum Value = 100, Page Jump Amount = 1, Thumb Bitmap = 0, Background Bitmap = 0) -#define TabVolumeSpeechSliderControl 2609 //(Left Origin = 58, Top Origin = 42, Width = 93, Height = 15, Usable = 1, Initial Value = 0, Minimum Value = 0, Maximum Value = 255, Page Jump Amount = 1, Thumb Bitmap = 0, Background Bitmap = 0) -#define TabVolumeAudioCDSliderControl 2611 //(Left Origin = 58, Top Origin = 81, Width = 93, Height = 15, Usable = 1, Initial Value = 0, Minimum Value = 0, Maximum Value = 100, Page Jump Amount = 1, Thumb Bitmap = 0, Background Bitmap = 0) - -// Resource: tFRM 2800 -#define TabMiscPalmOSForm 2800 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 120, Usable = 0, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabMiscPalmOSVibratorCheckbox 2802 //(Left Origin = 4, Top Origin = 12, Width = 128, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSNoAutoOffCheckbox 2803 //(Left Origin = 4, Top Origin = 24, Width = 152, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSStdPaletteCheckbox 2804 //(Left Origin = 4, Top Origin = 84, Width = 146, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSLargerStackCheckbox 2805 //(Left Origin = 4, Top Origin = 36, Width = 100, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSAdvancedCheckbox 2806 //(Left Origin = 4, Top Origin = 96, Width = 100, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSArrowCheckbox 2807 //(Left Origin = 4, Top Origin = 72, Width = 150, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSExitLauncherCheckbox 2810 //(Left Origin = 4, Top Origin = 48, Width = 150, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSStylusClickCheckbox 2811 //(Left Origin = 4, Top Origin = 60, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscPalmOSTabTitlePalmLabel 2801 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) - -// Resource: tFRM 2900 -#define TabMiscScummVMForm 2900 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 120, Usable = 0, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabMiscScummVMAutosaveCheckbox 2902 //(Left Origin = 4, Top Origin = 48, Width = 90, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscScummVMDebugCheckbox 2904 //(Left Origin = 4, Top Origin = 60, Width = 90, Height = 12, Usable = 0, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscScummVMDemoCheckbox 2905 //(Left Origin = 4, Top Origin = 12, Width = 100, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscScummVMCopyProtectionCheckbox 2906 //(Left Origin = 4, Top Origin = 24, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscScummVMAltIntroCheckbox 2908 //(Left Origin = 4, Top Origin = 36, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscScummVMDebugLevelField 2907 //(Left Origin = 101, Top Origin = 60, Width = 12, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 1, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabMiscScummVMAutosaveField 2910 //(Left Origin = 101, Top Origin = 48, Width = 20, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 4, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabMiscScummVMTabTitleScummLabel 2901 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabMiscScummVMUnnamed2903Label 2903 //(Left Origin = 97, Top Origin = 61, Usable = 1, Font = Standard) -#define TabMiscScummVMUnnamed2909Label 2909 //(Left Origin = 97, Top Origin = 48, Usable = 1, Font = Standard) -#define TabMiscScummVMUnnamed2911Label 2911 //(Left Origin = 123, Top Origin = 48, Usable = 1, Font = Standard) - -// Resource: tFRM 3000 -#define GameEditForm 3000 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 1411) -#define GameEditOKButton 3020 //(Left Origin = 5, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define GameEditCancelButton 3021 //(Left Origin = 46, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define GameEditDeleteButton 3023 //(Left Origin = 109, Top Origin = 139, Width = 42, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define GameEditUnnamed3022GraffitiShift 3022 //(Left Origin = 87, Top Origin = 140) - -// Resource: tFRM 3100 -#define TabGameInfoForm 3100 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 120, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabGameInfoEntryNameField 3102 //(Left Origin = 4, Top Origin = 12, Width = 151, Height = 24, Usable = 1, Editable = 1, Underline = 1, Single Line = 0, Dynamic Size = 0, Left Justified = 1, Max Characters = 50, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 0) -#define TabGameInfoPathField 3104 //(Left Origin = 37, Top Origin = 38, Width = 118, Height = 24, Usable = 1, Editable = 1, Underline = 1, Single Line = 0, Dynamic Size = 0, Left Justified = 1, Max Characters = 150, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 0) -#define TabGameInfoGameField 3106 //(Left Origin = 37, Top Origin = 64, Width = 52, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 15, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 0) -#define TabGameInfoUnnamed3101Label 3101 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabGameInfoUnnamed3103Label 3103 //(Left Origin = 11, Top Origin = 38, Usable = 1, Font = Standard) -#define TabGameInfoUnnamed3105Label 3105 //(Left Origin = 6, Top Origin = 64, Usable = 1, Font = Standard) -#define TabGameInfoUnnamed3107Label 3107 //(Left Origin = 4, Top Origin = 79, Usable = 1, Font = Standard) -#define TabGameInfoEngineList 3109 //(Left Origin = 37, Top Origin = 57, Width = 115, Usable = 0, Font = Standard, Visible Items = 3) -#define TabGameInfoBrowsePushButton 3110 //(Left Origin = 11, Top Origin = 50, Width = 22, Height = 12, Usable = 1, Group ID = 0, Font = Standard) -#define TabGameInfoEnginePopTrigger 3108 //(Left Origin = 37, Top Origin = 79, Width = 115, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3109) - -// Resource: tFRM 3200 -#define TabGameDisplayForm 3200 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 95, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabGameDisplayFilterCheckbox 3205 //(Left Origin = 4, Top Origin = 36, Width = 80, Height = 12, Usable = 1, Selected = 1, Group ID = 0, Font = Standard) -#define TabGameDisplayFullscreenCheckbox 3206 //(Left Origin = 4, Top Origin = 60, Width = 100, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameDisplayAspectRatioCheckbox 3207 //(Left Origin = 4, Top Origin = 48, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameDisplayUnnamed3201Label 3201 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabGameDisplayUnnamed3202Label 3202 //(Left Origin = 5, Top Origin = 24, Usable = 1, Font = Standard) -#define TabGameDisplayUnnamed3208Label 3208 //(Left Origin = 10, Top Origin = 12, Usable = 1, Font = Standard) -#define TabGameDisplayGfxListList 3204 //(Left Origin = 38, Top Origin = 12, Width = 75, Usable = 0, Font = Standard, Visible Items = 2) -#define TabGameDisplayRenderList 3210 //(Left Origin = 38, Top Origin = 24, Width = 75, Usable = 0, Font = Standard, Visible Items = 6) -#define TabGameDisplayGfxPopupPopTrigger 3203 //(Left Origin = 38, Top Origin = 12, Width = 80, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3204) -#define TabGameDisplayRenderPopTrigger 3209 //(Left Origin = 38, Top Origin = 24, Width = 85, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3209) - -// Resource: tFRM 3300 -#define TabGameOptionsForm 3300 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 160, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabGameOptionsLoadSlotCheckbox 3302 //(Left Origin = 4, Top Origin = 24, Width = 85, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameOptionsStartRoomCheckbox 3303 //(Left Origin = 4, Top Origin = 36, Width = 84, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameOptionsAmigaCheckbox 3306 //(Left Origin = 4, Top Origin = 48, Width = 81, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameOptionsSubtitlesCheckbox 3307 //(Left Origin = 4, Top Origin = 60, Width = 82, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameOptionsTalkSpeedCheckbox 3308 //(Left Origin = 4, Top Origin = 12, Width = 66, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabGameOptionsLoadSlotField 3304 //(Left Origin = 92, Top Origin = 24, Width = 12, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 2, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabGameOptionsStartRoomField 3305 //(Left Origin = 92, Top Origin = 36, Width = 18, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 4, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabGameOptionsTalkSpeedField 3309 //(Left Origin = 92, Top Origin = 12, Width = 18, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 3, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabGameOptionsUnnamed3301Label 3301 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabGameOptionsUnnamed3314Label 3314 //(Left Origin = 88, Top Origin = 24, Usable = 1, Font = Standard) -#define TabGameOptionsUnnamed3315Label 3315 //(Left Origin = 88, Top Origin = 36, Usable = 1, Font = Standard) -#define TabGameOptionsUnnamed3316Label 3316 //(Left Origin = 88, Top Origin = 12, Usable = 1, Font = Standard) -#define TabGameOptionsUnnamed3317Label 3317 //(Left Origin = 88, Top Origin = 48, Usable = 1, Font = Standard) -#define TabGameOptionsUnnamed3318Label 3318 //(Left Origin = 88, Top Origin = 60, Usable = 1, Font = Standard) -#define TabGameOptionsLanguageList 3311 //(Left Origin = 92, Top Origin = 15, Width = 64, Usable = 0, Font = Standard, Visible Items = 5) -#define TabGameOptionsPlatformList 3313 //(Left Origin = 92, Top Origin = 15, Width = 64, Usable = 0, Font = Standard, Visible Items = 4) -#define TabGameOptionsLanguagePopTrigger 3310 //(Left Origin = 90, Top Origin = 60, Width = 65, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3311) -#define TabGameOptionsPlatformPopTrigger 3312 //(Left Origin = 90, Top Origin = 48, Width = 65, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3313) - -// Resource: tFRM 3400 -#define ImportForm 3400 //(Left Origin = 34, Top Origin = 64, Width = 91, Height = 32, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define ImportUnnamed3401Label 3401 //(Left Origin = 4, Top Origin = 4, Usable = 1, Font = Standard) -#define ImportUnnamed3402Label 3402 //(Left Origin = 16, Top Origin = 16, Usable = 1, Font = Bold) - -// Resource: tFRM 1400 -#define EngineForm 1400 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define EngineOkButton 1403 //(Left Origin = 4, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define EngineCancelButton 1420 //(Left Origin = 45, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) -#define EngineUnnamed1402Label 1402 //(Left Origin = 4, Top Origin = 16, Usable = 1, Font = Bold) -#define EngineUnnamed1404Label 1404 //(Left Origin = 4, Top Origin = 88, Usable = 1, Font = Bold) -#define EngineListList 1401 //(Left Origin = 4, Top Origin = 30, Width = 148, Usable = 1, Font = Standard, Visible Items = 5) -#define EngineSupportedList 1405 //(Left Origin = 4, Top Origin = 102, Width = 148, Usable = 1, Font = Standard, Visible Items = 3) - -// Resource: tFRM 4000 -#define InfoForm 4000 //(Left Origin = 2, Top Origin = 2, Width = 156, Height = 156, Usable = 1, Modal = 1, Save Behind = 1, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define InfoOKButton 4020 //(Left Origin = 5, Top Origin = 139, Width = 36, Height = 12, Usable = 1, Anchor Left = 1, Frame = 1, Non-bold Frame = 1, Font = Standard) - -// Resource: tFRM 4100 -#define TabInfoAboutForm 4100 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 125, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabInfoAboutTabTitleAboutLabel 4101 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabInfoAboutUnnamed4103Label 4103 //(Left Origin = 23, Top Origin = 58, Usable = 1, Font = Bold) -#define TabInfoAboutUnnamed4104Label 4104 //(Left Origin = 34, Top Origin = 70, Usable = 1, Font = Standard) -#define TabInfoAboutUnnamed4105Label 4105 //(Left Origin = 8, Top Origin = 82, Usable = 1, Font = Bold) - -// Resource: tFRM 4200 -#define TabInfoVersionForm 4200 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 100, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabInfoVersionTabTitleAboutLabel 4201 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabInfoVersionUnnamed4202Label 4202 //(Left Origin = 10, Top Origin = 12, Usable = 1, Font = Standard) -#define TabInfoVersionUnnamed4203Label 4203 //(Left Origin = 24, Top Origin = 24, Usable = 1, Font = Standard) -#define TabInfoVersionUnnamed4204Label 4204 //(Left Origin = 4, Top Origin = 42, Usable = 1, Font = Bold) -#define TabInfoVersionUnnamed4205Label 4205 //(Left Origin = 5, Top Origin = 53, Usable = 1, Font = Standard) -#define TabInfoVersionUnnamed4206Label 4206 //(Left Origin = 4, Top Origin = 72, Usable = 1, Font = Bold) -#define TabInfoVersionUnnamed4207Label 4207 //(Left Origin = 4, Top Origin = 84, Usable = 1, Font = Standard) - -// Resource: tFRM 4300 -#define TabInfoSystemForm 4300 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 100, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabInfoSystemTabTitleAboutLabel 4301 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabInfoSystemUnnamed4302Label 4302 //(Left Origin = 10, Top Origin = 12, Usable = 1, Font = Standard) -#define TabInfoSystemUnnamed4303Label 4303 //(Left Origin = 13, Top Origin = 24, Usable = 1, Font = Standard) -#define TabInfoSystemUnnamed4304Label 4304 //(Left Origin = 5, Top Origin = 36, Usable = 1, Font = Standard) -#define TabInfoSystemUnnamed4305Label 4305 //(Left Origin = 96, Top Origin = 0, Usable = 1, Font = Standard) -#define TabInfoSystemUnnamed4306Label 4306 //(Left Origin = 132, Top Origin = 0, Usable = 1, Font = Standard) - -// Resource: tFRM 1600 -#define TabCardConfigForm 1600 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 110, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabCardConfigDetectCheckbox 1602 //(Left Origin = 4, Top Origin = 86, Width = 150, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardConfigCacheCheckbox 1604 //(Left Origin = 4, Top Origin = 62, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardConfigLedCheckbox 1608 //(Left Origin = 4, Top Origin = 50, Width = 130, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardConfigCacheSizeField 1606 //(Left Origin = 68, Top Origin = 74, Width = 18, Height = 12, Usable = 1, Editable = 1, Underline = 1, Single Line = 1, Dynamic Size = 0, Left Justified = 1, Max Characters = 3, Font = Standard, Auto Shift = 0, Has Scroll Bar = 0, Numeric = 1) -#define TabCardConfigTabTitleAboutLabel 1601 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabCardConfigUnnamed1605Label 1605 //(Left Origin = 21, Top Origin = 74, Usable = 1, Font = Standard) -#define TabCardConfigUnnamed1607Label 1607 //(Left Origin = 88, Top Origin = 74, Usable = 1, Font = Standard) -#define TabCardConfigSlotList 1620 //(Left Origin = 7, Top Origin = 14, Width = 146, Usable = 1, Font = Standard, Visible Items = 3) - -// Resource: tFRM 1700 -#define TabCardGameListForm 1700 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 100, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabCardGameListMoveCheckbox 1702 //(Left Origin = 4, Top Origin = 12, Width = 143, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardGameListDeleteCheckbox 1703 //(Left Origin = 4, Top Origin = 24, Width = 142, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardGameListConfirmCheckbox 1704 //(Left Origin = 4, Top Origin = 36, Width = 152, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabCardGameListUnnamed1701Label 1701 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) - -// Resource: tFRM 3500 -#define TabMiscExtsForm 3500 //(Left Origin = 0, Top Origin = 0, Width = 160, Height = 80, Usable = 1, Modal = 0, Save Behind = 0, Help ID = 0, Menu Bar ID = 0, Default Button ID = 0) -#define TabMiscExtsLightspeedCheckbox 3502 //(Left Origin = 4, Top Origin = 24, Width = 95, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscExtsGolcdCheckbox 3505 //(Left Origin = 4, Top Origin = 12, Width = 120, Height = 12, Usable = 1, Selected = 0, Group ID = 0, Font = Standard) -#define TabMiscExtsTabTitleMoreLabel 3501 //(Left Origin = 4, Top Origin = 0, Usable = 1, Font = Bold) -#define TabMiscExtsNothingLabel 3506 //(Left Origin = 4, Top Origin = 36, Usable = 0, Font = Standard) -#define TabMiscExtsLightspeedList 3504 //(Left Origin = 96, Top Origin = 24, Width = 50, Usable = 0, Font = Standard, Visible Items = 3) -#define TabMiscExtsLightspeedPopTrigger 3503 //(Left Origin = 96, Top Origin = 24, Width = 60, Height = 12, Usable = 1, Anchor Left = 1, Font = Standard, List ID = 3504) - - -// Resource: Talt 1001 -#define RomIncompatibleAlert 1001 -#define RomIncompatibleOK 0 - -// Resource: Talt 1000 -#define FrmWarnAlert 1000 -#define FrmWarnOK 0 - -// Resource: Talt 1100 -#define FrmErrorAlert 1100 -#define FrmErrorCancel 0 - -// Resource: Talt 1300 -#define FrmConfirmAlert 1300 -#define FrmConfirmYes 0 -#define FrmConfirmNo 1 - -// Resource: Talt 1400 -#define FrmInfoAlert 1400 -#define FrmInfoOK 0 - - -// Resource: MBAR 1000 -#define MainFormMenuBar 1000 - - -// Resource: MENU 1000 -#define MainOptionsMenu 1000 -#define MainOptionsMisc 1000 // Command Key: I -#define MainOptionsSkins 1001 -#define MainOptionsBeam 1003 -#define MainOptionsAbout 1005 - -// Resource: MENU 1100 -#define MainGamesMenu 1100 -#define MainGamesNew 1100 // Command Key: N -#define MainGamesEdit 1101 // Command Key: E -#define MainGamesMusicSound 1102 // Command Key: M -#define MainGamesDelete 1103 -#define MainGamesMemoryCard 1105 // Command Key: C - - -// Resource: tSTR 9991 -#define ClieCatString 9991 // "32779" - -// Resource: tSTR 9990 -#define ClieDescString 9990 // "Play your favorite Point'n'Click games" - - -// Resource: PICT 1001 -#define Bitmap 1001 - -// Resource: PICT 1002 -#define Bitmap2 1002 - -// Resource: PICT 1008 -#define Bitmap3 1008 - -// Resource: PICT 1011 -#define Bitmap4 1011 - -// Resource: PICT 1012 -#define Bitmap5 1012 - -// Resource: PICT 1018 -#define Bitmap6 1018 - -// Resource: PICT 2000 -#define infoBitmap 2000 - -// Resource: PICT 1100 -#define msOnBitmap 1100 - -// Resource: PICT 1009 -#define Bitmap7 1009 - -// Resource: PICT 1010 -#define Bitmap8 1010 - -// Resource: PICT 1110 -#define msNoneBitmap 1110 - -// Resource: PICT 1020 -#define BitmapID1020Bitmap 1020 - -// Resource: PICT 1019 -#define BitmapID1019Bitmap 1019 - -// Resource: PICT 1200 -#define msOnD2Bitmap 1200 - -// Resource: PICT 1300 -#define msNoneD2Bitmap 1300 - -// Resource: PICT 2100 -#define infoD2Bitmap 2100 - -// Resource: PICT 1501 -#define ScummVMlogoD1Bitmap 1501 - -// Resource: PICT 1502 -#define ScummVMlogoD2Bitmap 1502 - -// Resource: PICT 1000 -#define icon16bitD2Bitmap 1000 - - -// Resource: tbmf 1000 -#define Icon_infoBitmapFamily 1000 - -// Resource: tbmf 1100 -#define MsOnBitmapFamily 1100 - -// Resource: tbmf 2000 -#define InfoBitmapFamily 2000 - -// Resource: tbmf 1110 -#define MsNoneBitmapFamily 1110 - -// Resource: tbmf 1200 -#define LogoBitmapFamily 1200 - - -// Resource: taif 1000 -#define Largeicons12and8bitsAppIconFamily 1000 - -// Resource: taif 1001 -#define Smallicons12and8bitsAppIconFamily 1001 - - -#endif // STARTERRSC_H diff --git a/backends/platform/PalmOS/Rsc/batLow.bmp b/backends/platform/PalmOS/Rsc/batLow.bmp deleted file mode 100644 index 1d18131450..0000000000 Binary files a/backends/platform/PalmOS/Rsc/batLow.bmp and /dev/null differ diff --git a/backends/platform/PalmOS/Rsc/keyAlt.bmp b/backends/platform/PalmOS/Rsc/keyAlt.bmp deleted file mode 100644 index 28165394f8..0000000000 Binary files a/backends/platform/PalmOS/Rsc/keyAlt.bmp and /dev/null differ diff --git a/backends/platform/PalmOS/Rsc/keyCommand.bmp b/backends/platform/PalmOS/Rsc/keyCommand.bmp deleted file mode 100644 index 1324037cd3..0000000000 Binary files a/backends/platform/PalmOS/Rsc/keyCommand.bmp and /dev/null differ diff --git a/backends/platform/PalmOS/Rsc/keyCtrl.bmp b/backends/platform/PalmOS/Rsc/keyCtrl.bmp deleted file mode 100644 index fed20fd8d0..0000000000 Binary files a/backends/platform/PalmOS/Rsc/keyCtrl.bmp and /dev/null differ diff --git a/backends/platform/PalmOS/Rsc/modules.rcp b/backends/platform/PalmOS/Rsc/modules.rcp deleted file mode 100644 index c7b17221b2..0000000000 --- a/backends/platform/PalmOS/Rsc/modules.rcp +++ /dev/null @@ -1,71 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2010 The ScummVM project - * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -BITMAP ID 3100 -BEGIN - BITMAP "keyCommand.bmp" BPP 1 DENSITY 2 -END -BITMAP ID 3101 -BEGIN - BITMAP "keyAlt.bmp" BPP 1 DENSITY 2 -END -BITMAP ID 3102 -BEGIN - BITMAP "keyCtrl.bmp" BPP 1 DENSITY 2 -END -BITMAP ID 3120 -BEGIN - BITMAP "batLow.bmp" BPP 1 DENSITY 2 -END -BITMAP ID 3130 -BEGIN - BITMAP "numpad.bmp" BPP 1 DENSITY 2 -END - -/* -BITMAP ID 3100 "keyCommand.bmp" DENSITY 2 -BITMAP ID 3101 "keyAlt.bmp" DENSITY 2 -BITMAP ID 3102 "keyCtrl.bmp" DENSITY 2 -BITMAP ID 3120 "batLow.bmp" DENSITY 2 -BITMAP ID 3130 "numpad.bmp" DENSITY 2 -*/ -BITMAP ID 3000 "keyCommand.bmp" DENSITY 1 -BITMAP ID 3001 "keyAlt.bmp" DENSITY 1 -BITMAP ID 3002 "keyCtrl.bmp" DENSITY 1 -BITMAP ID 3020 "batLow.bmp" DENSITY 1 -BITMAP ID 3030 "numpad.bmp" DENSITY 1 - -ALERT ID 1200 - DEFAULTBUTTON 0 - ERROR -BEGIN - TITLE "ScummVM Fatal Error" - MESSAGE "^1" - BUTTONS "Exit" -END - diff --git a/backends/platform/PalmOS/Rsc/modulesrsc.h b/backends/platform/PalmOS/Rsc/modulesrsc.h deleted file mode 100644 index 14b32ee0b6..0000000000 --- a/backends/platform/PalmOS/Rsc/modulesrsc.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MODULESRSC_H -#define MODULESRSC_H - -#define FrmFatalErrorAlert 1200 - -#endif diff --git a/backends/platform/PalmOS/Rsc/numpad.bmp b/backends/platform/PalmOS/Rsc/numpad.bmp deleted file mode 100644 index 7763d76c05..0000000000 Binary files a/backends/platform/PalmOS/Rsc/numpad.bmp and /dev/null differ diff --git a/backends/platform/PalmOS/Src/args.cpp b/backends/platform/PalmOS/Src/args.cpp deleted file mode 100644 index bfc34866e3..0000000000 --- a/backends/platform/PalmOS/Src/args.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include "palmdefs.h" -#include "args.h" -#include "pace.h" -#include "endianutils.h" - -Char **ArgsInit() { - // first 4 bytes keep the real address of the chunk - MemHandle argvH = MemHandleNew(sizeof(Char *) + (MAX_ARG * sizeof(Char **) + 2)); - // real addr - Char *lockP = (Char *)MemHandleLock(argvH); - // 4byte aligned - Char **argvP = (Char **)ALIGN_4BYTE(lockP); - // save real addr - argvP[0] = lockP; - // initial position - argvP++; - - for (UInt8 count = 0; count < MAX_ARG; count++) - argvP[count] = NULL; - - return argvP; -} - -void ArgsAdd(Char **argvP, const Char *argP, const Char *parmP, UInt8 *countArgP) { - if (argP) { - MemHandle newArg; - UInt16 len2 = 0; - UInt16 len1 = StrLen(argP); - - if (len1 > 0) { - if (parmP) - len2 = StrLen(parmP); - - (*countArgP)++; - newArg = MemHandleNew(len1 + len2 + 1); // +1 = NULL CHAR - *argvP = (Char *)MemHandleLock(newArg); - StrCopy(*argvP, argP); - - if (parmP) - StrCat(*argvP, parmP); - } - } -} - -void ArgsFree(Char **argvP) { - if (!argvP) - return; - - MemHandle oldH; - - for (UInt8 count = 0; count < MAX_ARG; count++) - if (argvP[count]) { - oldH = MemPtrRecoverHandle(argvP[count]); - MemHandleUnlock(oldH); - MemHandleFree(oldH); - } - - argvP--; - oldH = MemPtrRecoverHandle(argvP[0]); - MemHandleUnlock(oldH); - MemHandleFree(oldH); -} - -void ArgsSetOwner(Char **argvP, UInt16 owner) { - if (!argvP) - return; - - MemHandle oldH; - - for (UInt8 count = 0; count < MAX_ARG; count++) - if (argvP[count]) { - oldH = MemPtrRecoverHandle(argvP[count]); - MemHandleSetOwner(oldH, owner); - } - - argvP--; - oldH = MemPtrRecoverHandle(argvP[0]); - MemHandleSetOwner(oldH, owner); -} - -void ArgsExportInit(Char **argvP, UInt32 countArg, Boolean arm) { - if (arm) { - for (UInt8 count = 0; count < MAX_ARG; count++) - if (argvP[count]) - argvP[count] = (Char *)ByteSwap32(argvP[count]); - } - - FtrSet(appFileCreator, ftrArgsData , (UInt32)argvP); - FtrSet(appFileCreator, ftrArgsCount, (UInt32)countArg); -} - -void ArgsExportRelease(Boolean arm) { - if (arm) { - Char **argvP; - Err e = FtrGet(appFileCreator, ftrArgsData, (UInt32 *)&argvP); - - if (argvP) - for (UInt8 count = 0; count < MAX_ARG; count++) - if (argvP[count]) - argvP[count] = (Char *)ByteSwap32(argvP[count]); - } - - FtrUnregister(appFileCreator, ftrArgsCount); - FtrUnregister(appFileCreator, ftrArgsData); -} diff --git a/backends/platform/PalmOS/Src/args.h b/backends/platform/PalmOS/Src/args.h deleted file mode 100644 index fa988fe35f..0000000000 --- a/backends/platform/PalmOS/Src/args.h +++ /dev/null @@ -1,44 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef ARGS_H -#define ARGS_H - -#define MAX_ARG 25 - -#define ftrArgsData 1300 -#define ftrArgsCount 1301 -#define ftrVars 1302 -#define ftrStack 1303 - -Char **ArgsInit(); -void ArgsAdd(Char **argvP, const Char *argP, const Char *parmP, UInt8 *countArgP); -void ArgsFree(Char **argvP); -void ArgsSetOwner(Char **argvP, UInt16 owner); - -void ArgsExportInit(Char **argvP, UInt32 countArg, Boolean arm); -void ArgsExportRelease(Boolean arm); - -#endif diff --git a/backends/platform/PalmOS/Src/base_event.cpp b/backends/platform/PalmOS/Src/base_event.cpp deleted file mode 100644 index ae93514e34..0000000000 --- a/backends/platform/PalmOS/Src/base_event.cpp +++ /dev/null @@ -1,458 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_base.h" -#include "common/events.h" - -#ifdef STDLIB_TRACE_MEMORY -# include -#endif - -#if defined(COMPILE_OS5) && defined(PALMOS_ARM) -extern "C" void SysEventGet(EventType *eventP, Int32 timeout); -extern "C" void SysEventAddToQueue (const EventType *eventP); -#endif - -void OSystem_PalmBase::timer_handler() { - UInt32 msecs = getMillis(); - - if (_timer.active && (msecs >= _timer.nextExpiry)) { - _timer.duration = _timer.callback(_timer.duration); - _timer.nextExpiry = msecs + _timer.duration; - } -} - -void OSystem_PalmBase::battery_handler() { - // check battery level every 15secs - if ((TimGetTicks() - _batCheckLast) > _batCheckTicks) { - UInt16 voltage, warnThreshold, criticalThreshold; - Boolean pluggedIn; - voltage = SysBatteryInfoV20(false, &warnThreshold, &criticalThreshold, NULL, NULL, &pluggedIn); - - if (!pluggedIn) { - if (voltage <= warnThreshold) { - if (!_showBatLow) { - _showBatLow = true; - draw_osd(kDrawBatLow, _screenDest.w - 18, -16, true, 2); - displayMessageOnOSD("Battery low."); - } - } else { - if (_showBatLow) { - _showBatLow = false; - draw_osd(kDrawBatLow, _screenDest.w - 18, -16, false); - } - } - - if (voltage <= criticalThreshold) { - ::EventType event; - event.eType = keyDownEvent; - event.data.keyDown.chr = vchrPowerOff; - event.data.keyDown.modifiers = commandKeyMask; -#if defined(COMPILE_OS5) && defined(PALMOS_ARM) - SysEventAddToQueue(&event); -#else - EvtAddEventToQueue(&event); -#endif - } - } - - _batCheckLast = TimGetTicks(); - } -} - -bool OSystem_PalmBase::pollEvent(Common::Event &event) { - ::EventType ev; - Boolean handled; - UInt32 keyCurrentState; - Coord x, y; - - battery_handler(); - timer_handler(); - sound_handler(); - - for (;;) { - // check for hardkey repeat for mouse emulation - keyCurrentState = KeyCurrentState(); - - // if it was a key pressed, let the keyup event raise - if (_keyExtraPressed) { - if (gVars->arrowKeys) { - if (_keyExtraPressed & _keyExtra.bitLeft) { - if (!(keyCurrentState & _keyExtra.bitLeft)) { - _keyExtraPressed &= ~_keyExtra.bitLeft; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = Common::KEYCODE_LEFT; - event.kbd.ascii = event.kbd.keycode; - event.kbd.flags = 0; - return true; - } - } - if (_keyExtraPressed & _keyExtra.bitRight) { - if (!(keyCurrentState & _keyExtra.bitRight)) { - _keyExtraPressed &= ~_keyExtra.bitRight; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = Common::KEYCODE_RIGHT; - event.kbd.ascii = event.kbd.keycode; - event.kbd.flags = 0; - return true; - } - } - if (_keyExtraPressed & _keyExtra.bitUp) { - if (!(keyCurrentState & _keyExtra.bitUp)) { - _keyExtraPressed &= ~_keyExtra.bitUp; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = Common::KEYCODE_UP; - event.kbd.ascii = event.kbd.keycode; - event.kbd.flags = 0; - return true; - } - } - if (_keyExtraPressed & _keyExtra.bitDown) { - if (!(keyCurrentState & _keyExtra.bitDown)) { - _keyExtraPressed &= ~_keyExtra.bitDown; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = Common::KEYCODE_DOWN; - event.kbd.ascii = event.kbd.keycode; - event.kbd.flags = 0; - return true; - } - } - } - - if (_keyExtraPressed & _keyExtra.bitActionA) { - if (!(keyCurrentState & _keyExtra.bitActionA)) { - _keyExtraPressed &= ~_keyExtra.bitActionA; - - event.type = Common::EVENT_LBUTTONUP; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - } - } - - if (_keyExtraPressed & _keyExtra.bitActionB) { - if (!(keyCurrentState & _keyExtra.bitActionB)) { - _keyExtraPressed &= ~_keyExtra.bitActionB; - - event.type = Common::EVENT_RBUTTONUP; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - } - } - - // no more event till up is raised - return false; - } - - if (!(keyCurrentState & _keyExtraMask)) { - _lastKeyRepeat = 0; - - } else if (getMillis() >= (_keyExtraRepeat + _keyExtraDelay)) { - _keyExtraRepeat = getMillis(); - - if (gVars->arrowKeys) { - if (keyCurrentState & _keyExtra.bitLeft) { - _keyExtraPressed |= _keyExtra.bitLeft; - event.kbd.keycode = Common::KEYCODE_LEFT; - - } else if (keyCurrentState & _keyExtra.bitRight) { - _keyExtraPressed |= _keyExtra.bitRight; - event.kbd.keycode = Common::KEYCODE_RIGHT; - - } else if (keyCurrentState & _keyExtra.bitUp) { - _keyExtraPressed |= _keyExtra.bitUp; - event.kbd.keycode = Common::KEYCODE_UP; - - } else if (keyCurrentState & _keyExtra.bitDown) { - _keyExtraPressed |= _keyExtra.bitDown; - event.kbd.keycode = Common::KEYCODE_DOWN; - } - - event.type = Common::EVENT_KEYDOWN; - event.kbd.ascii = event.kbd.keycode; - event.kbd.flags = 0; - return true; - - } else { - Int8 sx = 0; - Int8 sy = 0; - - if (keyCurrentState & _keyExtra.bitUp) - sy = -1; - else if (keyCurrentState & _keyExtra.bitDown) - sy = +1; - - if (keyCurrentState & _keyExtra.bitLeft) - sx = -1; - else if (keyCurrentState & _keyExtra.bitRight) - sx = +1; - - if (sx || sy) { - simulate_mouse(event, sx, sy, &x, &y); - event.type = Common::EVENT_MOUSEMOVE; - event.mouse.x = x; - event.mouse.y = y; - warpMouse(x, y); - - return true; - } - } - } - -#if defined(COMPILE_OS5) && defined(PALMOS_ARM) - SysEventGet(&ev, evtNoWait); -#else - EvtGetEvent(&ev, evtNoWait); -#endif - - if (ev.eType == keyUpEvent) { - Common::KeyCode k = Common::KEYCODE_INVALID; - switch (ev.data.keyUp.chr) { - - // arrow keys - case chrUpArrow: - k = Common::KEYCODE_UP; break; - case chrDownArrow: - k = Common::KEYCODE_DOWN; break; - case chrRightArrow: - k = Common::KEYCODE_RIGHT; break; - case chrLeftArrow: - k = Common::KEYCODE_LEFT; break; - } - - if (k) { - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = k; - event.kbd.ascii = k; - event.kbd.flags = 0; - return true; - } - - } else if (ev.eType == keyDownEvent) { - Common::KeyCode k = Common::KEYCODE_INVALID; - switch (ev.data.keyDown.chr) { - // ESC key - case vchrLaunch: - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = Common::ASCII_ESCAPE; - event.kbd.flags = 0; - return true; - - // F5 = menu - case vchrMenu: - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = Common::ASCII_F5; - event.kbd.flags = 0; - return true; - - // if hotsync pressed, etc... - case vchrHardCradle: - case vchrHardCradle2: - case vchrLowBattery: - case vchrFind: -// case vchrBrightness: // volume control on Zodiac, let other backends disable it - case vchrContrast: - // do nothing - return true; - - // arrow keys - case chrUpArrow: - k = Common::KEYCODE_UP; break; - case chrDownArrow: - k = Common::KEYCODE_DOWN; break; - case chrRightArrow: - k = Common::KEYCODE_RIGHT; break; - case chrLeftArrow: - k = Common::KEYCODE_LEFT; break; - - // return - case chrLineFeed: - case chrCarriageReturn: - k = Common::KEYCODE_RETURN; break; - - } - - if (k) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = k; - event.kbd.ascii = k; - event.kbd.flags = 0; - return true; - } - } - - if (check_event(event, &ev)) - return true; - - // prevent crash when alarm is raised - handled = ((ev.eType == keyDownEvent) && - (ev.data.keyDown.modifiers & commandKeyMask) && - ((ev.data.keyDown.chr == vchrAttnStateChanged) || - (ev.data.keyDown.chr == vchrAttnUnsnooze))); - - // graffiti strokes, auto-off, etc... - if (!handled) - if (SysHandleEvent(&ev)) - continue; - - switch (ev.eType) { - case penMoveEvent: - get_coordinates(&ev, x, y); - - if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) - return false; - - if (abs(y - event.mouse.y) <= 2 || abs(x - event.mouse.x) <= 2) - return false; - - event.type = Common::EVENT_MOUSEMOVE; - event.mouse.x = x; - event.mouse.y = y; - warpMouse(x, y); - return true; - - case penDownEvent: - get_coordinates(&ev, x, y); - - // indy fight mode - if (_useNumPad && !_overlayVisible) { - char num = '1'; - num += 9 - - (3 - (3 * x / _screenWidth )) - - (3 * (3 * y / _screenHeight)); - - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = (Common::KeyCode)num; - event.kbd.ascii = num; - event.kbd.flags = 0; - - _wasKey = true; - return true; - } - - if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) - return false; - - event.type = ((gVars->stylusClick || _overlayVisible) ? Common::EVENT_LBUTTONDOWN : Common::EVENT_MOUSEMOVE); - event.mouse.x = x; - event.mouse.y = y; - warpMouse(x, y); - return true; - - case penUpEvent: - get_coordinates(&ev, x, y); - - event.type = ((gVars->stylusClick || _overlayVisible) ? Common::EVENT_LBUTTONUP : Common::EVENT_MOUSEMOVE); - if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) - return false; - - event.mouse.x = x; - event.mouse.y = y; - warpMouse(x, y); - return true; - - case keyDownEvent: - if (ev.data.keyDown.chr == vchrCommand && - (ev.data.keyDown.modifiers & commandKeyMask)) { - - _lastKeyModifier++; - _lastKeyModifier %= kModifierCount; - - if (_lastKeyModifier) - draw_osd((kDrawKeyState + _lastKeyModifier - 1), 2, _screenDest.h + 2, true); - else - draw_osd(kDrawKeyState, 2, _screenDest.h + 2, false); - - return false; - } - - char mask = 0; - UInt16 key = ev.data.keyDown.chr; - - if (_lastKeyModifier == kModifierNone) { - // for keyboard mode - if (ev.data.keyDown.modifiers & shiftKeyMask) mask |= Common::KBD_SHIFT; - if (ev.data.keyDown.modifiers & controlKeyMask) mask |= Common::KBD_CTRL; - if (ev.data.keyDown.modifiers & optionKeyMask) mask |= Common::KBD_ALT; - if (ev.data.keyDown.modifiers & commandKeyMask) mask |= Common::KBD_CTRL|Common::KBD_ALT; - } else { - // for grafiti mode - if (_lastKeyModifier == kModifierCommand) mask = Common::KBD_CTRL|Common::KBD_ALT; - if (_lastKeyModifier == kModifierAlt) mask = Common::KBD_ALT; - if (_lastKeyModifier == kModifierCtrl) mask = Common::KBD_CTRL; - } - - if (_lastKeyModifier) - draw_osd(kDrawKeyState, 2, _screenDest.h + 2, false); - _lastKeyModifier = kModifierNone; - - // F1 -> F10 key - if (key >= '0' && key <= '9' && mask == (Common::KBD_CTRL|Common::KBD_ALT)) { - key = (key == '0') ? 324 : (315 + key - '1'); - mask = 0; - -#ifdef STDLIB_TRACE_MEMORY - // print memory - } else if (key == 'm' && mask == (Common::KBD_CTRL|Common::KBD_ALT)) { - printf("Used memory: %d\n", __stdlib_trace_memory); -#endif - // exit - } else if ((key == 'z' && mask == Common::KBD_CTRL) || (mask == Common::KBD_ALT && key == 'x')) { - event.type = Common::EVENT_QUIT; - return true; - - // num pad (indy fight mode) - } else if (key == 'n' && mask == (Common::KBD_CTRL|Common::KBD_ALT) && !_overlayVisible) { - _useNumPad = !_useNumPad; - draw_osd(kDrawFight, _screenDest.w - 34, _screenDest.h + 2, _useNumPad, 1); - displayMessageOnOSD(_useNumPad ? "Fight mode on." : "Fight mode off."); - return false; - } - - // other keys - _wasKey = true; - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = (Common::KeyCode)key; - event.kbd.ascii = key; - event.kbd.flags = mask; - return true; - - default: - if (_wasKey && ev.eType != keyHoldEvent) { - event.type = Common::EVENT_KEYUP; - _wasKey = false; - return true; - } - return false; - }; - } -} diff --git a/backends/platform/PalmOS/Src/base_gfx.cpp b/backends/platform/PalmOS/Src/base_gfx.cpp deleted file mode 100644 index 46238efdc2..0000000000 --- a/backends/platform/PalmOS/Src/base_gfx.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_base.h" - -/* - * Graphics modes - * - */ - -static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { - {"1x", "Normal", GFX_NORMAL}, - {"wide", "Wide", GFX_WIDE}, - {0, 0, 0} -}; - -int OSystem_PalmBase::getDefaultGraphicsMode() const { - return GFX_NORMAL; -} - -const OSystem::GraphicsMode *OSystem_PalmBase::getSupportedGraphicsModes() const { - return int_getSupportedGraphicsModes(); -} - -const OSystem::GraphicsMode *OSystem_PalmBase::int_getSupportedGraphicsModes() const { - return s_supportedGraphicsModes; -} - -int OSystem_PalmBase::getGraphicsMode() const { - return _mode; -} - -bool OSystem_PalmBase::setGraphicsMode(int mode) { - switch (mode) { - case GFX_NORMAL: - case GFX_WIDE: - _setMode = mode; - break; - - default: - warning("unknown gfx mode %d", mode); - _setMode = GFX_NORMAL; - return false; - } - - return true; -} - -/* - * Init - * - */ - -void OSystem_PalmBase::initSize(uint w, uint h, const Graphics::PixelFormat *format) { - _screenWidth = w; - _screenHeight = h; - - _screenDest.w = _screenWidth; - _screenDest.h = _screenHeight; - - unload_gfx_mode(); - _mode = _setMode; - load_gfx_mode(); - - warpMouse(200, 150); - int_initSize(w, h); -} - -/* - * Palette - * - */ -void OSystem_PalmBase::setPalette(const byte *colors, uint start, uint num) { - RGBColorType *base = _currentPalette + start; - - for (uint i = 0; i < num; i++) { - base[i].r = colors[0]; - base[i].g = colors[1]; - base[i].b = colors[2]; - - extras_palette(i + start, colors[0], colors[1], colors[2]); - colors += 4; - } - - if (start < _paletteDirtyStart) - _paletteDirtyStart = start; - - if (start + num > _paletteDirtyEnd) - _paletteDirtyEnd = start + num; -} - -void OSystem_PalmBase::grabPalette(byte *colors, uint start, uint num) { - const RGBColorType *base = _currentPalette + start; - - for (uint i = 0; i < num; ++i) { - colors[i * 4] = base[i].r; - colors[i * 4 + 1] = base[i].g; - colors[i * 4 + 2] = base[i].b; - colors[i * 4 + 3] = 0xFF; - } -} - -/* - * Screen - * - */ - -void OSystem_PalmBase::setShakePos(int shakeOffset) { - _new_shake_pos = shakeOffset; - int_setShakePos(shakeOffset); -} - -void OSystem_PalmBase::updateScreen() { - // Check whether the palette was changed in the meantime and update the - // screen surface accordingly. - if (_paletteDirtyEnd != 0 && _setPalette) { - WinSetDrawWindow(WinGetDisplayWindow()); - WinPalette(winPaletteSet, _paletteDirtyStart, _paletteDirtyEnd - _paletteDirtyStart, _currentPalette + _paletteDirtyStart); - _paletteDirtyEnd = 0; - //_redawOSD = true; - } - if (_redawOSD) { - _redawOSD = false; - draw_osd(kDrawBatLow, _screenDest.w - 18, -16, _showBatLow, 2); - draw_osd(kDrawFight, _screenDest.w - 34, _screenDest.h + 2, (_useNumPad && !_overlayVisible), 1); - } - int_updateScreen(); - -} - -void OSystem_PalmBase::draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color) { -//return; - - MemHandle hTemp = DmGetResource('abmp', id + 100); - - if (hTemp) { - /*static const UInt32 pal[3] = { - (TwGfxComponentsToPackedRGB(0,255,0)), - (TwGfxComponentsToPackedRGB(255,255,0)), - (TwGfxComponentsToPackedRGB(255,0,0)) - };*/ - - BitmapType *bmTemp; - bmTemp = (BitmapType *)MemHandleLock(hTemp); - - Coord w, h; - BmpGetDimensions(bmTemp, &w, &h, 0); - - PointType dst = { _screenOffset.x + x, _screenOffset.y + y }; - RectangleType r = { dst.x, dst.y, w, h }; - - RectangleType c; - - UInt16 old = WinSetCoordinateSystem(kCoordinatesNative); - WinGetClip(&c); - WinResetClip(); - if (show) { - WinSetDrawWindow(_screenH); - WinSetBackColor(0); - WinSetForeColor(120); // pal[color] - WinFillRectangle(&r, 0); - WinSetDrawMode(winOverlay); - WinDrawBitmap(bmTemp, 0, 0); - WinSetDrawMode(winPaint); - - } else { - WinSetBackColor(0); - WinFillRectangle(&r, 0); - } - WinSetClip(&c); - WinSetCoordinateSystem(old); - - MemPtrUnlock(bmTemp); - DmReleaseResource(hTemp); - } -} diff --git a/backends/platform/PalmOS/Src/base_mouse.cpp b/backends/platform/PalmOS/Src/base_mouse.cpp deleted file mode 100644 index bf11a4b106..0000000000 --- a/backends/platform/PalmOS/Src/base_mouse.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_base.h" - -void OSystem_PalmBase::warpMouse(int x, int y) { - if (x != _mouseCurState.x || y != _mouseCurState.y) { - x = x >= _screenWidth ? _screenWidth - 1 : x; - y = y >= _screenHeight ? _screenHeight - 1 : y; - - _mouseCurState.x = x; - _mouseCurState.y = y; - } -} - -bool OSystem_PalmBase::showMouse(bool visible) { - bool last = _mouseVisible; - _mouseVisible = visible; - - return last; -} - -void OSystem_PalmBase::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { - if (w == 0 || h == 0) - return; - - _mouseHotspotX = hotspotX; - _mouseHotspotY = hotspotY; - - _mouseKeyColor = keycolor; - - if (_mouseCurState.w != w || _mouseCurState.h != h) { - _mouseCurState.w = w; - _mouseCurState.h = h; - - if (_mouseDataP) - free(_mouseDataP); - - if (_mouseBackupP) - free(_mouseBackupP); - - _mouseDataP = (byte *)malloc(w * h); - _mouseBackupP = (byte *)malloc(w * h * 2); // if 16bit = *2 - } - - if (!_mouseBackupP) { - free(_mouseDataP); - _mouseDataP = NULL; - } - - if (_mouseDataP) - memcpy(_mouseDataP, buf, w * h); -} - -void OSystem_PalmBase::simulate_mouse(Common::Event &event, Int8 iHoriz, Int8 iVert, Coord *xr, Coord *yr) { - Int16 x = _mouseCurState.x; - Int16 y = _mouseCurState.y; - Int16 slow, fact; - - _lastKeyRepeat++; - fact = _screenWidth / 320; - fact = (fact) ? fact : 1; - - if (_lastKeyRepeat > 32 * fact) - _lastKeyRepeat = 32 * fact; - - slow = (iHoriz && iVert) ? 2 : 1; - - x += iHoriz * (_lastKeyRepeat >> 2) / slow * fact; - y += iVert * (_lastKeyRepeat >> 2) / slow * fact; - - x = (x < 0 ) ? 0 : x; - x = (x >= _screenWidth ) ? _screenWidth - 1 : x; - y = (y < 0 ) ? 0 : y; - y = (y >= _screenHeight ) ? _screenHeight - 1 : y; - - *xr = x; - *yr = y; -} diff --git a/backends/platform/PalmOS/Src/be_68k.cpp b/backends/platform/PalmOS/Src/be_68k.cpp deleted file mode 100644 index 77b1e22615..0000000000 --- a/backends/platform/PalmOS/Src/be_68k.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - - -/* More to come */ diff --git a/backends/platform/PalmOS/Src/be_68k.h b/backends/platform/PalmOS/Src/be_68k.h deleted file mode 100644 index 77b1e22615..0000000000 --- a/backends/platform/PalmOS/Src/be_68k.h +++ /dev/null @@ -1,27 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - - -/* More to come */ diff --git a/backends/platform/PalmOS/Src/be_base.cpp b/backends/platform/PalmOS/Src/be_base.cpp deleted file mode 100644 index b3caee105d..0000000000 --- a/backends/platform/PalmOS/Src/be_base.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_base.h" -#include "common/config-file.h" -#include "common/config-manager.h" -#include "backends/saves/default/default-saves.h" -#include "backends/timer/default/default-timer.h" -#include "backends/fs/palmos/palmos-fs-factory.h" -#include "sound/mixer_intern.h" - -#define DEFAULT_SAVE_PATH "/PALM/Programs/ScummVM/Saved/" - - -OSystem_PalmBase::OSystem_PalmBase() { - _overlayVisible = false; - - _current_shake_pos = 0; - _new_shake_pos = 0; - - _paletteDirtyStart = 0; - _paletteDirtyEnd = 0; - - _gfxLoaded = false; - _modeChanged = false; - _setMode = GFX_NORMAL; - _mode = _setMode; - _redawOSD = false; - _setPalette = true; - - _offScreenH = NULL; - _screenH = NULL; - _offScreenP = NULL; - _screenP = NULL; - _screenPitch = gVars->screenPitch; - - _wasKey = false; - _lastKeyModifier = kModifierNone; - _lastKeyRepeat = 100; - _useNumPad = false; - _showBatLow = false; - _batCheckTicks = SysTicksPerSecond() * 15; - _batCheckLast = TimGetTicks(); - - _saveMgr = 0; - _timerMgr = 0; - _mixerMgr = 0; - - _mouseDataP = NULL; - _mouseBackupP = NULL; - _mouseVisible = false; - _mouseDrawn = false; - MemSet(&_keyExtra, sizeof(_keyExtra), 0); - MemSet(&_mouseCurState, sizeof(_mouseCurState), 0); - MemSet(&_mouseOldState, sizeof(_mouseOldState), 0); - MemSet(&_timer, sizeof(TimerType), 0); - MemSet(&_sound, sizeof(SoundType), 0); - - _keyExtraRepeat = 0; - _keyExtraPressed = 0; - _keyExtraDelay = (gVars->arrowKeys) ? computeMsecs(125) : computeMsecs(25); -} - -static int timer_handler(int t) { - DefaultTimerManager *tm = (DefaultTimerManager *)g_system->getTimerManager(); - tm->handler(); - return t; -} - -void OSystem_PalmBase::initBackend() { - if (gVars->autoSave != -1) - ConfMan.setInt("autosave_period", gVars->autoSave); - - _keyExtra.bitUp = keyBitPageUp; - _keyExtra.bitDown = keyBitPageDown; - _keyExtra.bitLeft = keyBitHard2; - _keyExtra.bitRight = keyBitHard3; - - int_initBackend(); - _keyExtraMask = (_keyExtra.bitUp | _keyExtra.bitDown | _keyExtra.bitLeft | _keyExtra.bitRight | _keyExtra.bitActionA | _keyExtra.bitActionB); - - // Create the savefile manager, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_saveMgr == 0) { - _saveMgr = new DefaultSaveFileManager(DEFAULT_SAVE_PATH); - } - - // Create and hook up the mixer, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_mixerMgr == 0) { - setupMixer(); - } - - // Create and hook up the timer manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_timerMgr == 0) { - _timerMgr = new DefaultTimerManager(); - setTimerCallback(::timer_handler, 10); - } - - OSystem::initBackend(); -} - -void OSystem_PalmBase::getTimeAndDate(TimeDate &td) const { - time_t curTime = time(0); - struct tm t = *localtime(&curTime); - td.tm_sec = t.tm_sec; - td.tm_min = t.tm_min; - td.tm_hour = t.tm_hour; - td.tm_mday = t.tm_mday; - td.tm_mon = t.tm_mon; - td.tm_year = t.tm_year; -} - -uint32 OSystem_PalmBase::getMillis() { - return TimGetTicks() * 1000 / SysTicksPerSecond(); -} - -void OSystem_PalmBase::delayMillis(uint msecs) { - Int32 delay = computeMsecs(msecs); - - if (delay > 0) - SysTaskDelay(delay); -} - -void OSystem_PalmBase::setTimerCallback(TimerProc callback, int timer) { - if (callback != NULL) { - _timer.duration = timer; - _timer.nextExpiry = getMillis() + timer; - _timer.callback = callback; - _timer.active = true; - } else { - _timer.active = false; - } -} - -void OSystem_PalmBase::quit() { - int_quit(); - clearSoundCallback(); - unload_gfx_mode(); - - if (_mouseDataP) { - MemPtrFree(_mouseBackupP); - MemPtrFree(_mouseDataP); - } - - delete _saveMgr; - delete _timerMgr; - delete _mixerMgr; - - exit(0); -} - -Common::SaveFileManager *OSystem_PalmBase::getSavefileManager() { - return _saveMgr; -} - -Audio::Mixer *OSystem_PalmBase::getMixer() { - return _mixerMgr; -} - -Common::TimerManager *OSystem_PalmBase::getTimerManager() { - return _timerMgr; -} - -FilesystemFactory *OSystem_PalmBase::getFilesystemFactory() { - return &PalmOSFilesystemFactory::instance(); -} - - -#define PALMOS_CONFIG_FILE "/PALM/Programs/ScummVM/scummvm.ini" - -Common::SeekableReadStream *OSystem_PalmBase::createConfigReadStream() { - Common::FSNode file(PALMOS_CONFIG_FILE); - return file.createReadStream(); -} - -Common::WriteStream *OSystem_PalmBase::createConfigWriteStream() { - Common::FSNode file(PALMOS_CONFIG_FILE); - return file.createWriteStream(); -} diff --git a/backends/platform/PalmOS/Src/be_base.h b/backends/platform/PalmOS/Src/be_base.h deleted file mode 100644 index 1885114ace..0000000000 --- a/backends/platform/PalmOS/Src/be_base.h +++ /dev/null @@ -1,265 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BE_BASE_H -#define BE_BASE_H - -#include - -#include "PalmVersion.h" -#include "globals.h" - -#include "backends/base-backend.h" -#include "common/scummsys.h" -#include "common/events.h" -#include "graphics/surface.h" -#include "graphics/colormasks.h" - -namespace Audio { - class MixerImpl; -} - -namespace Common { - class SaveFileManager; - class TimerManager; -} - -enum { - GFX_NORMAL = 0, - GFX_WIDE, -}; - -// OSD key state -enum { - kModifierNone = 0, - kModifierCommand, - kModifierAlt, - kModifierCtrl, - kModifierCount -}; - -// Mouse button event -enum { - vchrMouseLeft = vchrHardKeyMax - 2, - vchrMouseRight = vchrHardKeyMax - 1 -}; - -// OSD resource id -#define kDrawKeyState 3000 -#define kDrawNumPad 3010 -#define kDrawBatLow 3020 -#define kDrawFight 3030 - -#define computeMsecs(x) ((SysTicksPerSecond() * x) / 1000) - - -//typedef void (*SoundProc)(void *param, byte *buf, int len); -typedef void (*SoundProc)(byte *buf, uint len); -typedef int (*TimerProc)(int interval); - -typedef struct { - UInt32 duration, nextExpiry; - Boolean active; - TimerProc callback; -} TimerType, *TimerPtr; - -typedef struct { - Boolean active; - void *proc; - void *param; -} SoundType, *SoundPtr; - -class OSystem_PalmBase : public BaseBackend { -private: - virtual void int_initBackend() { } - - virtual const GraphicsMode *int_getSupportedGraphicsModes() const; - virtual void int_updateScreen() = 0; - virtual void int_initSize(uint w, uint h) = 0; - virtual void int_setShakePos(int shakeOffset) { } - - virtual void extras_palette(uint8 index, uint8 r, uint8 g, uint8 b) { } - virtual void int_quit() { } - - virtual void unload_gfx_mode() = 0; - virtual void load_gfx_mode() = 0; - - virtual void draw_mouse() = 0; - virtual void undraw_mouse() = 0; - - virtual bool check_event(Common::Event &event, EventPtr ev) = 0; - - virtual void timer_handler(); - void battery_handler(); - virtual void get_coordinates(EventPtr ev, Coord &x, Coord &y) = 0; - void simulate_mouse(Common::Event &event, Int8 iHoriz, Int8 iVert, Coord *xr, Coord *yr); - - virtual void sound_handler() = 0; - virtual bool setupMixer() = 0; - virtual void clearSoundCallback() = 0; - -protected: - OSystem_PalmBase(); - - virtual void draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color = 0); - virtual void clear_screen() = 0; - - struct MousePos { - int16 x,y,w,h; - }; - - TimerType _timer; - SoundType _sound; - - Common::SaveFileManager *_saveMgr; - Audio::MixerImpl *_mixerMgr; - Common::TimerManager *_timerMgr; - - RGBColorType _currentPalette[256]; - uint _paletteDirtyStart, _paletteDirtyEnd; - - int _mode, _setMode; - int16 _screenWidth, _screenHeight; - Boolean _modeChanged, _gfxLoaded; - UInt32 _screenPitch; - - PointType _screenOffset; - struct { - Coord w, h; - } _screenDest; - byte *_screenP, *_offScreenP; - WinHandle _screenH, _offScreenH; - - int _current_shake_pos; - int _new_shake_pos; - - Boolean _overlayVisible; - Boolean _redawOSD, _setPalette; - - UInt32 _keyExtraMask, _keyExtraPressed, _keyExtraRepeat, _keyExtraDelay; - struct { - UInt32 bitUp; - UInt32 bitDown; - UInt32 bitLeft; - UInt32 bitRight; - UInt32 bitActionA; // left mouse button - UInt32 bitActionB; // right mouse button - } _keyExtra; - - bool _mouseVisible; - bool _mouseDrawn; - MousePos _mouseCurState; - MousePos _mouseOldState; - int16 _mouseHotspotX; - int16 _mouseHotspotY; - byte _mouseKeyColor; - byte *_mouseDataP, *_mouseBackupP; - - - bool _wasKey; - UInt8 _lastKeyModifier; - UInt32 _lastKeyRepeat; - Boolean _useNumPad, _showBatLow; - UInt32 _batCheckTicks, _batCheckLast; - -public: - void initBackend(); - -/* - virtual void setFeatureState(Feature f, bool enable) {}; - - - bool hasFeature(Feature f); - bool getFeatureState(Feature f); - - virtual void beginGFXTransaction(); - virtual void endGFXTransaction(); - - virtual int16 getOverlayHeight(); - virtual int16 getOverlayWidth(); - - virtual void setCursorPalette(const byte *colors, uint start, uint num); - virtual void disableCursorPalette(bool disable); - - virtual void displayMessageOnOSD(const char *msg); -*/ - const GraphicsMode *getSupportedGraphicsModes() const; - int getGraphicsMode() const; - virtual int getDefaultGraphicsMode() const; - virtual bool setGraphicsMode(int mode); - - void initSize(uint w, uint h, const Graphics::PixelFormat *format); - int16 getWidth() { return _screenWidth; } - int16 getHeight() { return _screenHeight; } - - void setShakePos(int shakeOffset); - virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) = 0; - virtual void updateScreen(); - - bool showMouse(bool visible); - void warpMouse(int x, int y); - void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format); - - virtual void showOverlay() = 0; - virtual void hideOverlay() = 0; - virtual void clearOverlay() = 0; - virtual void grabOverlay(OverlayColor *buf, int pitch) = 0; - virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) = 0; - - int16 getOverlayWidth() { return getWidth(); } - int16 getOverlayHeight() { return getHeight(); } - - void setPalette(const byte *colors, uint start, uint num); - void grabPalette(byte *colors, uint start, uint num); - virtual Graphics::PixelFormat getOverlayFormat() const { return Graphics::createPixelFormat<565>(); } - - bool pollEvent(Common::Event &event); - - - void getTimeAndDate(TimeDate& td) const; - virtual uint32 getMillis(); - virtual void delayMillis(uint msecs); - - virtual void setTimerCallback(TimerProc callback, int interval); - - virtual MutexRef createMutex() { return NULL; } - virtual void lockMutex(MutexRef mutex) {} - virtual void unlockMutex(MutexRef mutex) {} - virtual void deleteMutex(MutexRef mutex) {} - - virtual Audio::Mixer *getMixer(); - - void quit(); - virtual void setWindowCaption(const char *caption) = 0; - - Common::SaveFileManager *getSavefileManager(); - Common::TimerManager *getTimerManager(); - FilesystemFactory *getFilesystemFactory(); - - virtual Common::SeekableReadStream *createConfigReadStream(); - virtual Common::WriteStream *createConfigWriteStream(); -}; - -#endif diff --git a/backends/platform/PalmOS/Src/be_os5.cpp b/backends/platform/PalmOS/Src/be_os5.cpp deleted file mode 100644 index c9ef9ecf7c..0000000000 --- a/backends/platform/PalmOS/Src/be_os5.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" -#include - -OSystem_PalmOS5::OSystem_PalmOS5() : OSystem_PalmBase() { - _sound.active = false; - _setPalette = false; - - _workScreenH = NULL; - _overlayH = NULL; - _isSwitchable = false; - _wasRotated = false; - _cursorPaletteDisabled = true; - - MemSet(&_soundEx, sizeof(SoundExType), 0); - _soundEx.sound = &_sound; -} - -void OSystem_PalmOS5::calc_scale() { - for (int y = 0; y < _screenDest.h; y++) { - int ys = y * _screenHeight / _screenDest.h; - _scaleTableY[y] = ys * _screenWidth; - } - - for (int x = 0; x < _screenDest.w; x++) { - int xs = x * _screenWidth / _screenDest.w; - _scaleTableX[x] = xs; - } -} - -void OSystem_PalmOS5::calc_rect(Boolean fullscreen) { - Int32 w, h; - - if (fullscreen) { - w = (_ratio.adjustAspect == kRatioWidth) ? _ratio.width : gVars->screenFullWidth; - h = (_ratio.adjustAspect == kRatioHeight) ? _ratio.height : gVars->screenFullHeight; - - _screenOffset.x = (_ratio.adjustAspect == kRatioWidth) ? (gVars->screenFullWidth - _ratio.width) / 2 : 0; - _screenOffset.y = (_ratio.adjustAspect == kRatioHeight) ? (gVars->screenFullHeight - _ratio.height) / 2 : 0; - - } else { - w = gVars->screenWidth; - h = gVars->screenHeight * _screenHeight / _screenWidth; - - _screenOffset.x = 0; - _screenOffset.y = (gVars->screenHeight - h) / 2; - } - - _screenDest.w = w; - _screenDest.h = h; -} - -void OSystem_PalmOS5::int_initBackend() { - _keyExtra.bitUp = keyBitRockerUp|keyBitPageUp; - _keyExtra.bitDown = keyBitRockerDown|keyBitPageDown; - _keyExtra.bitLeft = keyBitRockerLeft; - _keyExtra.bitRight = keyBitRockerRight; - _keyExtra.bitActionA = keyBitHard3; - _keyExtra.bitActionB = keyBitHard4; -} - -bool OSystem_PalmOS5::hasFeature(Feature f) { - switch (f) { - case kFeatureCursorHasPalette: - return true; - } - - return false; -} - -void OSystem_PalmOS5::setFeatureState(Feature f, bool enable) { - switch (f) { -/* case kFeatureFullscreenMode: - if (_gfxLoaded) - if (OPTIONS_TST(kOptModeWide) && _initMode != GFX_WIDE) { - _fullscreen = enable; - hotswap_gfx_mode(_mode); - } - break; -*/ - case kFeatureAspectRatioCorrection: - if (_mode == GFX_WIDE) { - _ratio.adjustAspect = (_ratio.adjustAspect + 1) % 3; - //calc_rect(true); - hotswap_gfx_mode(_mode); -// TwGfxSetClip(_palmScreenP, &_dstRect); - clear_screen(); - } - break; - } -} - -void OSystem_PalmOS5::setWindowCaption(const char *caption) { -/* -FIXME/TODO: Convert caption from ISO Latin 1 to "right" encoding ? -If the output encoding is unclear or conversion impossible, -then one could just skip over any chars > 0x7F and display the rest -*/ - Err e; - Char buf[64]; - Coord w, y, h = FntLineHeight() + 2; - const Char *loading = "Loading, please wait\0"; - - // allocate bitmap - BitmapTypeV3 *bmp2P; - BitmapType *bmp1P = BmpCreate(320, (h * 3), 8, NULL, &e); - WinHandle tmpH = WinCreateBitmapWindow(bmp1P, &e); - - WinSetDrawWindow(tmpH); - WinSetBackColor(0); - WinSetTextColor(255); - WinEraseWindow(); - - // loading message - FntSetFont(boldFont); - w = FntCharsWidth(loading, StrLen(loading)); - w = (320 - w) / 2; - WinDrawChars(loading, StrLen(loading), w, 0 + h); - - // caption - FntSetFont(stdFont); - w = FntCharsWidth(caption, StrLen(caption)); - w = (320 - w) / 2; - WinDrawChars(caption, StrLen(caption), w, 0); - - // memory size - StrPrintF(buf, "memory : %ld KB", gVars->startupMemory); - w = FntCharsWidth(buf, StrLen(buf)); - w = (320 - w) / 2; - WinDrawChars(buf, StrLen(buf), w, h * 2); - - // set the bitmap as v3 - bmp2P = BmpCreateBitmapV3(bmp1P, kDensityDouble, BmpGetBits(bmp1P), NULL); - y = (80 - (h / 4) - 5); - - // draw it - WinSetDrawWindow(WinGetDisplayWindow()); - WinEraseWindow(); - WinDrawBitmap((BitmapPtr)bmp2P, 0, y); - - // free - WinDeleteWindow(tmpH, 0); - BmpDelete((BitmapPtr)bmp2P); - BmpDelete(bmp1P); -} diff --git a/backends/platform/PalmOS/Src/be_os5.h b/backends/platform/PalmOS/Src/be_os5.h deleted file mode 100644 index 2040c7faea..0000000000 --- a/backends/platform/PalmOS/Src/be_os5.h +++ /dev/null @@ -1,189 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BE_OS5_H -#define BE_OS5_H - -#include "be_base.h" - -#if !defined(SYSTEM_CALLBACK) || defined(PALMOS_68K) -# define SYSTEM_CALLBACK -# ifdef PALMOS_ARM -# define CALLBACK_PROLOGUE \ - __asm { \ - stmfd r13!,{r9,r10}; \ - ldr r9,[r0]; \ - ldr r10,[r0,#4]; \ - } -# define CALLBACK_EPILOGUE __asm { ldmfd r13!,{r9,r10} } -# define CALLBACK_INIT(regs) \ - __asm { \ - ldr r0, = regs; \ - add r0,r0,r10; \ - str r9,[r0]; \ - str r10,[r0,#4]; \ - } -# else -# define CALLBACK_PROLOGUE \ - asm ( \ - movem.l a4-a5, -(sp); \ - move.l UserDataP, a0; \ - move.l 0(a0), a4; \ - move.l 4(a0), a5; \ - ); -# define CALLBACK_EPILOGUE asm ( movem.l (sp)+, a4-a5 ); -# define CALLBACK_INIT(regs) \ - { \ - void *ptr = ®s; \ - asm ( \ - move.l ptr, a0; \ - move.l a4, 0(a0); \ - move.l a5, 4(a0); \ - ); \ - } -# endif -#else -# define CALLBACK_PROLOGUE -# define CALLBACK_EPILOGUE -# define CALLBACK_INIT(regs) -#endif - -// TODO : change / remove this -#define gfxMakeDisplayRGB_BigEndian(_r,_g,_b) \ - ( (((_g) & 0xFC) << 11) | (((_b) & 0xF8) << 5) | ((_r) & 0xF8) | (((_g) & 0xFF) >> 5) ) - -#define gfxMakeDisplayRGB_LittleEndian(_r,_g,_b) \ - ( (((_r) & 0xF8) << 8) | (((_g) & 0xFC) << 3) | (((_b) & 0xF8) >> 3) ) - -#if CPU_TYPE == CPU_68K -#define gfxMakeDisplayRGB(_r,_g,_b) gfxMakeDisplayRGB_BigEndian(_r,_g,_b) -#else -#define gfxMakeDisplayRGB(_r,_g,_b) gfxMakeDisplayRGB_LittleEndian(_r,_g,_b) -#endif - -typedef struct { - // for real thread version only - UInt32 __reg1; - UInt32 __reg2; - - // no real thread version - Boolean set; - UInt32 size; - void *dataP; - - // default sound stuff - SndStreamRef handle; - SoundPtr sound; -} SoundExType, *SoundExPtr; -extern SoundExType _soundEx; - -class OSystem_PalmOS5 : public OSystem_PalmBase { -protected: - uint16 _nativePal[256], _mousePal[256]; - -private: - uint16 _scaleTableX[512]; - uint32 _scaleTableY[512]; - - typedef void (OSystem_PalmOS5::*RendererProc)(RectangleType &r, PointType &p); - RendererProc _render; - - Graphics::Surface _framebuffer; - - OverlayColor *_overlayP; - WinHandle _overlayH, _workScreenH; - uint16 *_workScreenP; - - Boolean _isSwitchable, _wasRotated; - - virtual void int_initBackend(); - virtual void int_updateScreen(); - virtual void int_initSize(uint w, uint h); - - virtual void unload_gfx_mode(); - virtual void load_gfx_mode(); - virtual void hotswap_gfx_mode(int mode); - - void draw_mouse(); - void undraw_mouse(); - virtual bool check_event(Common::Event &event, EventPtr ev); - void extras_palette(uint8 index, uint8 r, uint8 g, uint8 b); - void calc_scale(); - - void render_landscapeAny(RectangleType &r, PointType &p); - void render_landscape15x(RectangleType &r, PointType &p); - void render_1x(RectangleType &r, PointType &p); - WinHandle alloc_screen(Coord w, Coord h); - virtual void draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color = 0); - - virtual SndStreamVariableBufferCallback sound_callback(); - virtual void sound_handler(); - virtual bool setupMixer(); - void clearSoundCallback(); - -protected: - UInt16 _sysOldCoord, _sysOldOrientation, _sysOldTriggerState; - Boolean _stretched, _cursorPaletteDisabled; - - enum { - kRatioNone = 0, - kRatioHeight, - kRatioWidth - }; - struct { - UInt8 adjustAspect; - Coord width; // (width x 320) - Coord height; // (480 x height) - } _ratio; - - void calc_rect(Boolean fullscreen); - void get_coordinates(EventPtr ev, Coord &x, Coord &y); - void clear_screen(); - -public: - OSystem_PalmOS5(); - static OSystem *create(); - - bool hasFeature(Feature f); - void setFeatureState(Feature f, bool enable); - - void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); - virtual Graphics::Surface *lockScreen(); - virtual void unlockScreen(); - - void setCursorPalette(const byte *colors, uint start, uint num); - void disableCursorPalette(bool disable); - - void showOverlay(); - void hideOverlay(); - virtual void clearOverlay(); - virtual void grabOverlay(OverlayColor *buf, int pitch); - virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); - - void setWindowCaption(const char *caption); - -}; - -#endif diff --git a/backends/platform/PalmOS/Src/be_os5ex.cpp b/backends/platform/PalmOS/Src/be_os5ex.cpp deleted file mode 100644 index 05bf5e49ce..0000000000 --- a/backends/platform/PalmOS/Src/be_os5ex.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -// for DAL.h -#define ALLOW_ACCESS_TO_INTERNALS_OF_BITMAPS - -#include "be_os5ex.h" -#include "palmdefs.h" - -#include -#include - -static TimerExType _timerEx; - -OSystem_PalmOS5Ex::OSystem_PalmOS5Ex() : OSystem_PalmOS5() { - _timerEx.timerID = 0; - _timerEx.timer = &_timer; - _timerEx.ticks = SysTicksPerSecond(); -} - -static SYSTEM_CALLBACK void timer_handler(void *userDataP) { - CALLBACK_PROLOGUE - TimerExPtr _timerEx = (TimerExPtr)userDataP; - TimerPtr _timer = _timerEx->timer; - _timer->duration = _timer->callback(_timer->duration); - KALTimerSet(_timerEx->timerID, (_timer->duration * _timerEx->ticks / 1000)); - CALLBACK_EPILOGUE -} - -void OSystem_PalmOS5Ex::setTimerCallback(TimerProc callback, int timer) { - if (_timer.active && _timerEx.timerID) - KALTimerDelete(_timerEx.timerID); - - if (callback != NULL) { - Err e; - CALLBACK_INIT(_timerEx); - _timer.duration = timer; - _timer.callback = callback; - - // create the timer - e = KALTimerCreate(&_timerEx.timerID, appFileCreator, &::timer_handler, &_timerEx); - if (!e) { - e = KALTimerSet(_timerEx.timerID, (timer * _timerEx.ticks / 1000)); - if (e) KALTimerDelete(_timerEx.timerID); - } - _timer.active = (!e); - - } else { - _timer.active = false; - } - - if (!_timer.active) - _timerEx.timerID = 0; -} - -OSystem::MutexRef OSystem_PalmOS5Ex::createMutex() { - UInt32 mutexID; - Err e = KALMutexCreate(&mutexID, appFileCreator); - return (MutexRef)(e ? NULL : mutexID); - -} - -void OSystem_PalmOS5Ex::lockMutex(MutexRef mutex) { - if (mutex) - KALMutexReserve((UInt32)mutex); -} - -void OSystem_PalmOS5Ex::unlockMutex(MutexRef mutex) { - if (mutex) - KALMutexRelease((UInt32)mutex, 0); -} - -void OSystem_PalmOS5Ex::deleteMutex(MutexRef mutex) { - if (mutex) - KALMutexDelete((UInt32)mutex); -} - -void OSystem_PalmOS5Ex::int_quit() { - if (_timerEx.timerID) - KALTimerDelete(_timerEx.timerID); -} diff --git a/backends/platform/PalmOS/Src/be_os5ex.h b/backends/platform/PalmOS/Src/be_os5ex.h deleted file mode 100644 index f9842d82ac..0000000000 --- a/backends/platform/PalmOS/Src/be_os5ex.h +++ /dev/null @@ -1,68 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BE_OS5EX_H -#define BE_OS5EX_H - -#include "be_os5.h" - -#undef dprintf // fix compilation in Zodiac mode - -#ifndef PALMOS_ARM -// Not usable with 68k mode (?), so ... -#define OSystem_PalmOS5Ex OSystem_PalmOS5 -#else - -typedef struct { - UInt32 __r9; - UInt32 __r10; - UInt32 timerID; - UInt32 ticks; - - TimerPtr timer; -} TimerExType, *TimerExPtr; - -class OSystem_PalmOS5Ex : public OSystem_PalmOS5 { -private: - void timer_handler() {} - void sound_handler() {} - void int_quit(); - - SndStreamVariableBufferCallback sound_callback(); - -public: - OSystem_PalmOS5Ex(); - static OSystem *create(); - - void setTimerCallback(TimerProc callback, int interval); - - MutexRef createMutex(); - void lockMutex(MutexRef mutex); - void unlockMutex(MutexRef mutex); - void deleteMutex(MutexRef mutex); -}; -#endif - -#endif diff --git a/backends/platform/PalmOS/Src/be_zodiac.cpp b/backends/platform/PalmOS/Src/be_zodiac.cpp deleted file mode 100644 index d6e7e2c292..0000000000 --- a/backends/platform/PalmOS/Src/be_zodiac.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_zodiac.h" - -OSystem_PalmZodiac::OSystem_PalmZodiac() : OSystem_PalmOS5Ex() { - _gfxH = NULL; - _overlayP = NULL; - _palmScreenP = NULL; - _tmpScreenP = NULL; - _stretched = false; -} - -void OSystem_PalmZodiac::int_initBackend() { - _keyExtra.bitUp = keyBitRockerUp; - _keyExtra.bitDown = keyBitRockerDown; - _keyExtra.bitLeft = keyBitRockerLeft; - _keyExtra.bitRight = keyBitRockerRight; - -// _keyExtra.bitActionA = keyBitActionD; -// _keyExtra.bitActionB = keyBitActionB; -} - -void OSystem_PalmZodiac::calc_rect(Boolean fullscreen) { - OSystem_PalmOS5::calc_rect(fullscreen); - - _dstRect.x = _screenOffset.x; - _dstRect.y = _screenOffset.y; - _dstRect.w = _screenDest.w; - _dstRect.h = _screenDest.h; -} - -void OSystem_PalmZodiac::setFeatureState(Feature f, bool enable) { - switch (f) { -/* case kFeatureFullscreenMode: - if (_gfxLoaded) - if (OPTIONS_TST(kOptModeWide) && _initMode != GFX_WIDE) { - _fullscreen = enable; - hotswap_gfx_mode(_mode); - } - break; -*/ - case kFeatureAspectRatioCorrection: - if (_mode == GFX_WIDE) { - _ratio.adjustAspect = (_ratio.adjustAspect + 1) % 3; - calc_rect(true); - TwGfxSetClip(_palmScreenP, &_dstRect); - clear_screen(); - } - break; - } -} diff --git a/backends/platform/PalmOS/Src/be_zodiac.h b/backends/platform/PalmOS/Src/be_zodiac.h deleted file mode 100644 index 28fcf29ddd..0000000000 --- a/backends/platform/PalmOS/Src/be_zodiac.h +++ /dev/null @@ -1,76 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BE_ZODIAC_H -#define BE_ZODIAC_H - -#include -#include "be_os5ex.h" - -#define MIN_OFFSET 20 - -class OSystem_PalmZodiac : public OSystem_PalmOS5Ex { -private: - - TwGfxType *_gfxH; - TwGfxSurfaceType *_palmScreenP, *_tmpScreenP; - TwGfxSurfaceType *_overlayP; - Boolean _fullscreen; - - TwGfxPointType _srcPos; - TwGfxRectType _srcRect, _dstRect; - TwGfxBitmapType _srcBmp; - - void int_initBackend(); - void int_setShakePos(int shakeOffset); - - void draw_mouse(); - void undraw_mouse(); - - void unload_gfx_mode(); - void load_gfx_mode(); - void hotswap_gfx_mode(int mode); - - void calc_rect(Boolean fullscreen); - bool check_event(Common::Event &event, EventPtr ev); - void draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color = 0); - -public: - OSystem_PalmZodiac(); - - static OSystem *create(); - - void setFeatureState(Feature f, bool enable); - - int getDefaultGraphicsMode() const; - - void updateScreen(); - - void clearOverlay(); - void grabOverlay(OverlayColor *buf, int pitch); - void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); -}; - -#endif diff --git a/backends/platform/PalmOS/Src/cd_aeroplayer.cpp b/backends/platform/PalmOS/Src/cd_aeroplayer.cpp deleted file mode 100644 index c30fba595c..0000000000 --- a/backends/platform/PalmOS/Src/cd_aeroplayer.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/system.h" -#include "common/config-manager.h" - -#include "cd_aeroplayer.h" - -AeroCDPlayer::AeroCDPlayer(OSystem *sys) { - _sys = sys; - StrCopy(gameP, ConfMan.getActiveDomainName().c_str()); -} - -bool AeroCDPlayer::init() { - aeroplayer_Startup(); - _isInitialized = aeroplayer_PlayerIsActive(); - - if (_isInitialized) - _volumeLimit = aeroplayer_GetMaxVolumeIndex(); - - return _isInitialized; -} - -void AeroCDPlayer::release() { - aeroplayer_Shutdown(); - - // self delete - delete this; -} - -UInt32 AeroCDPlayer::getStatus() { - return aeroplayer_GetPlaybackStatus(); -} - -UInt32 AeroCDPlayer::getPosition() { - return aeroplayer_GetPosition_msec(); -} - -UInt32 AeroCDPlayer::getDuration() { - return aeroplayer_GetDuration_msec(); -} - -void AeroCDPlayer::setPosition(UInt32 value) { - aeroplayer_Seek_abs_msec(value); -} - -void AeroCDPlayer::setVolume(int volume) { - _volumeLevel = volume; - aeroplayer_SetVolumeIndex((_volumeLimit * volume) / 100); -} - -bool AeroCDPlayer::poll() { - return - ( _pckLoops != 0 && - ( getPosition() < _pckTrackEndFrame && - getStatus() == AEROPLAYER_STATUS_PLAY - ) - ); -} - -void AeroCDPlayer::update() { - - // stop replay upon request of stopCD() - if (_pckStopTime != 0 && _sys->getMillis() >= _pckStopTime) { - forceStop(); - _pckLoops = 0; - _pckStopTime = 0; - _pckTrackEndFrame = 0; - return; - } - - // not fully played - if (getPosition() < _pckTrackEndFrame && getStatus() == AEROPLAYER_STATUS_PLAY) - return; - - aeroplayer_Pause(); -// _pckStopTime = _sys->getMillis(); - - // loop again ? - if (_pckLoops > 0) - _pckLoops--; - - // loop if needed - if (_pckLoops == 0) - forceStop(); - else { - //_pckStopTime = 0; - - if (_pckTrackStartFrame == 0 && _pckTrackDuration == 0) { - setPosition(0); - } else { - setPosition(_pckTrackStartFrame); - } - - aeroplayer_Play(); - _pckEndTime = _sys->getMillis() + _pckTrackDuration; - } -} - -void AeroCDPlayer::stop() { - _pckStopTime = _sys->getMillis(); - _pckLoops = 0; - return; -} - -void AeroCDPlayer::forceStop() { - if (getStatus() != AEROPLAYER_STATUS_STOP) - aeroplayer_PlayTrack(vfsInvalidVolRef, NULL); -} - -void AeroCDPlayer::play(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - Char fileP[100]; - static const Char *ext[] = { "mp3", "ogg" }; - -// if (duration > 0) -// duration += 5; - - _pckTrack = track; - _pckLoops = num_loops; - _pckTrackStartFrame = TO_MSECS(start_frame); - _pckTrackDuration = TO_MSECS(duration); - - StrPrintF(fileP, "/Palm/Programs/ScummVM/Audio/%s_%03ld.%s", gameP, (track + gVars->CD.firstTrack - 1), ext[gVars->CD.format]); - aeroplayer_Pause(); - aeroplayer_PlayTrack(gVars->VFS.volRefNum, fileP); - aeroplayer_Pause(); - - if (_pckTrackStartFrame == 0 && _pckTrackDuration == 0) { - _pckTrackDuration = getDuration(); - } else { - setPosition(_pckTrackStartFrame); - if (_pckTrackDuration == 0) - _pckTrackDuration = getDuration() - _pckTrackStartFrame; - } - - aeroplayer_Play(); - - _pckStopTime = 0; - _pckTrackEndFrame = _pckTrackStartFrame + _pckTrackDuration; - _pckEndTime = _sys->getMillis() + _pckTrackDuration; -} diff --git a/backends/platform/PalmOS/Src/cd_aeroplayer.h b/backends/platform/PalmOS/Src/cd_aeroplayer.h deleted file mode 100644 index e661e06d52..0000000000 --- a/backends/platform/PalmOS/Src/cd_aeroplayer.h +++ /dev/null @@ -1,65 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef CD_AEROPLAYER_H -#define CD_AEROPLAYER_H - -#include "cdaudio.h" -#include "aeroplayer_public.h" - -class AeroCDPlayer : public CDAudio { -public: - AeroCDPlayer(OSystem *sys); - - bool init(); - void release(); - - bool poll(); - void update(); - void play(int track, int num_loops, int start_frame, int duration); - void stop(); - - void setVolume(int volume); - -private: - OSystem *_sys; - Char gameP[15]; - - UInt32 getStatus(); - void setPosition(UInt32 value); - UInt32 getDuration(); - UInt32 getPosition(); - void forceStop(); - - UInt16 _volumeLimit; - - Boolean _isPlaying; - // cdrom - UInt16 _pckLoops, _pckTrack; - UInt32 _pckTrackStartFrame, _pckTrackEndFrame; - UInt32 _pckStopTime, _pckEndTime, _pckTrackDuration; -}; - -#endif diff --git a/backends/platform/PalmOS/Src/cd_default.cpp b/backends/platform/PalmOS/Src/cd_default.cpp deleted file mode 100644 index 416701524d..0000000000 --- a/backends/platform/PalmOS/Src/cd_default.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ -#include "common/system.h" -#include "cd_default.h" - -DefaultCDPlayer::DefaultCDPlayer(OSystem *sys) { - _sys = sys; -} - -bool DefaultCDPlayer::init() { - _isInitialized = true; - return _isInitialized; -} - -void DefaultCDPlayer::release() { - // self delete - delete this; -} - -bool DefaultCDPlayer::poll() { - return (_defLoops != 0 && _sys->getMillis() < _defTrackEndFrame); -} - -void DefaultCDPlayer::update() { - - // stop replay upon request of stopCD() - if (_defStopTime != 0 && _sys->getMillis() >= _defStopTime) { - _defLoops = 0; - _defStopTime = 0; - _defTrackEndFrame = 0; - return; - } - - // not fully played - if (_sys->getMillis() < _defTrackEndFrame) - return; - - if (_defLoops == 0) - return; - - // loop again ? - if (_defLoops > 0) - _defLoops--; - - // loop if needed - if (_defLoops != 0) { - _defTrackEndFrame = _sys->getMillis() + _defTrackLength; - } -} - -void DefaultCDPlayer::stop() { /* Stop CD Audio in 1/10th of a second */ - _defStopTime = _sys->getMillis() + 100; - _defLoops = 0; - return; -} - -void DefaultCDPlayer::play(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - UInt32 fullLength; - - _defLoops = num_loops; - start_frame = TO_MSECS(start_frame); - duration = TO_MSECS(duration); - - // frame in milli-seconds - _defStopTime = 0; - fullLength = start_frame + gVars->CD.defaultTrackLength * 1000; - - if (duration > 0) { - _defTrackLength = duration; - } else if (start_frame > 0) { - _defTrackLength = fullLength; - _defTrackLength -= start_frame; - } else { - _defTrackLength = fullLength; - } - - // try to play the track - _defTrackEndFrame = _sys->getMillis() + _defTrackLength; -} diff --git a/backends/platform/PalmOS/Src/cd_default.h b/backends/platform/PalmOS/Src/cd_default.h deleted file mode 100644 index 69d909b1e7..0000000000 --- a/backends/platform/PalmOS/Src/cd_default.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - - #ifndef CD_DEFAULT_H - #define CD_DEFAULT_H - - #include "cdaudio.h" - - class DefaultCDPlayer : public CDAudio { - public: - DefaultCDPlayer(OSystem *sys); - - bool init(); - void release(); - - bool poll(); - void update(); - void play(int track, int num_loops, int start_frame, int duration); - void stop(); - - private: - OSystem *_sys; - - // cdrom - UInt16 _defLoops; - UInt32 _defStopTime, _defTrackEndFrame, _defTrackLength; - }; - - #endif diff --git a/backends/platform/PalmOS/Src/cd_msa.cpp b/backends/platform/PalmOS/Src/cd_msa.cpp deleted file mode 100644 index 5812d49b6d..0000000000 --- a/backends/platform/PalmOS/Src/cd_msa.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ -#include -#include "common/system.h" -#include "cd_msa.h" -#include "start.h" // for appFileCreat - -static void doErr(Err e, const Char *msg) { - Char err[100]; - StrPrintF(err, "%ld : " , e); - StrCat(err,msg); - FrmCustomAlert(1000,err,0,0); -} - -MsaCDPlayer::MsaCDPlayer(OSystem *sys) { - _sys = sys; - _msaRefNum = sysInvalidRefNum; - - _msaLoops = 0; - _msaStopTime = 0; - _msaTrackEndSu = 0; -} - -bool MsaCDPlayer::init() { - SonySysFtrSysInfoP sonySysFtrSysInfoP; - Err error = errNone; - - if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { - // not found with audio adapter ?! - //if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrMsa) { - if ((error = SysLibFind(sonySysLibNameMsa, &_msaRefNum))) - if (error == sysErrLibNotFound) - error = SysLibLoad(sonySysFileTMsaLib, sonySysFileCMsaLib, &_msaRefNum); - - // FIXME : still don't understand how this lib works, it seems to be very unstable - // and with the very bad documentation provided by Sony it's difficult to find out why - // this doesn't work the same way on build-in MP3 device and external MP3 devices - if (!error) { - //MsaLibClose(_msaRefNum, msaLibOpenModeAlbum); // close the lib if we previously let it open (?) Need to add Notify for sonySysNotifyMsaEnforceOpenEvent just in case ... - error = MsaLibOpen(_msaRefNum, msaLibOpenModeAlbum); - - //if (error == msaErrAlreadyOpen) - // error = MsaLibEnforceOpen(_msaRefNum, msaLibOpenModeAlbum, appFileCreator); - - //error = (error != msaErrStillOpen) ? error : errNone; - } - //} - } - -// if (error) -// _msaRefNum = sysInvalidRefNum; - - _isInitialized = (_msaRefNum != sysInvalidRefNum); - initInternal(); - return _isInitialized; -} - -void MsaCDPlayer::initInternal() { - if (!_isInitialized) - return; - - Err e; - Char nameP[256]; - UInt32 dummy, albumIterater = albumIteratorStart; - - MemSet(&_msaAlbum, sizeof(_msaAlbum), 0); - _msaAlbum.maskflag = msa_INF_ALBUM; - _msaAlbum.code = msa_LANG_CODE_ASCII; - _msaAlbum.nameP = nameP; - _msaAlbum.fileNameLength = 256; - - e = MsaAlbumEnumerate(_msaRefNum, &albumIterater, &_msaAlbum); - e = MsaSetAlbum(_msaRefNum, _msaAlbum.albumRefNum, &dummy); - - // TODO : use RMC to control volume - MsaOutCapabilityType capability; - MsaOutGetCapability(_msaRefNum, &capability); - _volumeLLimit = capability.volumeLLimit; - _volumeRLimit = capability.volumeRLimit; -} - -void MsaCDPlayer::setVolume(int volume) { - _volumeLevel = volume; - MsaOutSetVolume(_msaRefNum, (_volumeLLimit * volume) / 100, (_volumeRLimit * volume) / 100); -} - -void MsaCDPlayer::release() { - if (_isInitialized) { - if (_msaRefNum != sysInvalidRefNum) { - // stop the current track if any (needed if we use enforce open to prevent the track to play after exit) - MsaStop(_msaRefNum, true); - MsaLibClose(_msaRefNum, msaLibOpenModeAlbum); - } - } - - // self delete - delete this; -} - -bool MsaCDPlayer::poll() { - if (!_isInitialized) - return false; - - MsaPBStatus pb; - MsaGetPBStatus(_msaRefNum, &pb); - return (_msaLoops != 0 && (pb.currentSU < _msaTrackEndSu || pb.status != msa_STOPSTATUS)); -} - -void MsaCDPlayer::update() { - if (!_isInitialized) - return; - - // get playback status - MsaPBStatus pb; - MsaGetPBStatus(_msaRefNum, &pb); - - // stop replay upon request of stopCD() - if (_msaStopTime != 0 && _sys->getMillis() >= _msaStopTime) { - MsaStop(_msaRefNum, true); - _msaLoops = 0; - _msaStopTime = 0; - _msaTrackEndSu = 0; - return; - } - - // not fully played nad still playing the correct track - // (when playing a full track the return SU is not correct - // and so we need to check if we are still playing the correct track) - if (pb.currentSU < _msaTrackEndSu) { - UInt16 trackNo; - MsaPBListIndexToTrackNo(_msaRefNum, pb.currentpblistindex, &trackNo); - if (trackNo == _msaTrack) - return; - } - - MsaStop(_msaRefNum, true); - - if (_msaLoops == 0) - return; - - // track ends and last play, force stop if still playing -/* if (_msaLoops != 1 && pb.status != msa_STOPSTATUS) { - MsaStop(_msaRefNum, true); - return; - } -*/ - // loop again ? - if (_msaLoops > 0) - _msaLoops--; - - // loop if needed - if (_msaLoops != 0) { - if (_msaStartFrame == 0 && _msaDuration == 0) - MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); - else - MsaPlay(_msaRefNum, _msaTrack, _msaTrackStartSu, msa_PBRATE_SP); - } -} - -void MsaCDPlayer::stop() { /* Stop CD Audio in 1/10th of a second */ - if (!_isInitialized) - return; - - _msaStopTime = _sys->getMillis() + 100; - _msaLoops = 0; - return; -} - -void MsaCDPlayer::play(int track, int num_loops, int start_frame, int duration) { - if (!_isInitialized) - return; - - if (!num_loops && !start_frame) - return; - - _msaTrack = track + gVars->CD.firstTrack - 1; // first track >= 1 ?, not 0 (0=album) - _msaLoops = num_loops; - _msaStartFrame = TO_MSECS(start_frame); - _msaDuration = TO_MSECS(duration); - - Err e; - MemHandle trackH; - - // stop current play if any - MsaStop(_msaRefNum, true); - _msaStopTime = 0; - - // retreive track infos - e = MsaGetTrackInfo(_msaRefNum, _msaTrack, 0, msa_LANG_CODE_ASCII, &trackH); - - // track exists - if (!e && trackH) { - MsaTime msaTime; - MsaTrackInfo *trackP; - UInt32 SU, fullLength; - - // FIXME (?) : this enable MsaSuToTime to return the right value in some cases - MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); - MsaStop(_msaRefNum, true); - - // get the msa time - trackP = (MsaTrackInfo *)MemHandleLock(trackH); - MsaSuToTime(_msaRefNum, trackP->totalsu, &msaTime); - SU = trackP->totalsu; - MemPtrUnlock(trackP); - MemHandleFree(trackH); - - // MSA frame in milli-seconds - fullLength = FROM_MIN(msaTime.minute); - fullLength += FROM_SEC(msaTime.second); - fullLength += msaTime.frame; - - if (_msaDuration > 0) { - _msaTrackLength = _msaDuration; - } else if (_msaStartFrame > 0) { - _msaTrackLength = fullLength; - _msaTrackLength -= _msaStartFrame; - } else { - _msaTrackLength = fullLength; - } - - // try to play the track - if (start_frame == 0 && duration == 0) { - MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); - _msaTrackEndSu = SU; - } else { - // FIXME : MsaTimeToSu doesn't work ... (may work with previous FIXME) - _msaTrackStartSu = (UInt32) ((float)(_msaStartFrame) / ((float)fullLength / (float)SU)); - _msaTrackEndSu = (UInt32) ((float)(_msaTrackLength) / ((float)fullLength / (float)SU)); - _msaTrackEndSu += _msaTrackStartSu; - - if (_msaTrackEndSu > SU) - _msaTrackEndSu = SU; - - MsaPlay(_msaRefNum, _msaTrack, _msaTrackStartSu, msa_PBRATE_SP); - } - } - // TODO : use default track length if track not found -} diff --git a/backends/platform/PalmOS/Src/cd_msa.h b/backends/platform/PalmOS/Src/cd_msa.h deleted file mode 100644 index 223bc0efcf..0000000000 --- a/backends/platform/PalmOS/Src/cd_msa.h +++ /dev/null @@ -1,68 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef CD_MSA_H -#define CD_MSA_H - -#include "cdaudio.h" - -class MsaCDPlayer : public CDAudio { -public: - MsaCDPlayer(OSystem *sys); - - bool init(); - void release(); - - bool poll(); - void update(); - void play(int track, int num_loops, int start_frame, int duration); - void stop(); - - void setVolume(int volume); - - private: - void initInternal(); - - OSystem *_sys; - UInt16 _msaRefNum; - - UInt32 _volumeLLimit; - UInt32 _volumeRLimit; - - // cdrom - AlbumInfoType _msaAlbum; - UInt16 _msaLoops; - - UInt32 _msaStopTime; - - UInt32 _msaStartFrame; - UInt32 _msaDuration; - - UInt16 _msaTrack; - UInt32 _msaTrackStartSu, _msaTrackEndSu; - UInt32 _msaTrackLength; -}; - -#endif diff --git a/backends/platform/PalmOS/Src/cd_pockettunes.cpp b/backends/platform/PalmOS/Src/cd_pockettunes.cpp deleted file mode 100644 index 5a9f3874eb..0000000000 --- a/backends/platform/PalmOS/Src/cd_pockettunes.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ -#include "common/system.h" -#include "common/config-manager.h" - -#include "cd_pockettunes.h" - -PckTunesCDPlayer::PckTunesCDPlayer(OSystem *sys) { - _sys = sys; - StrCopy(gameP, ConfMan.getActiveDomainName().c_str()); -} - -bool PckTunesCDPlayer::init() { - PocketTunesStart(); - _isInitialized = PocketTunesIsRunning(); - _isPlaying = false; - _pAction = NULL; - - if (_isInitialized) { - _pAction = (PocketTunesAction*)MemPtrNew(sizeof(PocketTunesAction)); - _volumeLimit = getVolumeLimit(); - } - - _isInitialized = (_isInitialized && _pAction); - return _isInitialized; -} - -void PckTunesCDPlayer::release() { - PocketTunesStop(); - if (_pAction) - MemPtrFree(_pAction); - - // self delete - delete this; -} - -UInt32 PckTunesCDPlayer::getVolumeLimit() { - UInt32 value = 0; - - if (!_pAction) - return value; - - _pAction->action = kPocketTunesActionGetValue; - _pAction->data.getValueAction.which = kPtunesValueMaxVolume; - - EvtGetEvent(&_eAction, evtNoWait); - if (PocketTunesCallSynch(_pAction) == errNone) - value = _pAction->data.getValueAction.value; - - return value; -} - -UInt32 PckTunesCDPlayer::getStatus() { - UInt32 status = kPtunesStopped; - - if (!_isPlaying || !_pAction) - return status; - - _pAction->action = kPocketTunesActionGetStatus; - - EvtGetEvent(&_eAction, evtNoWait); - if (PocketTunesCallSynch(_pAction) == errNone) - status = _pAction->data.getStatusAction.status; - - return status; -} - -UInt32 PckTunesCDPlayer::getPosition(UInt32 deflt) { - UInt32 value = deflt; - - if (!_isPlaying || !_pAction) - return value; - - _pAction->action = kPocketTunesActionGetValue; - _pAction->data.getValueAction.which = kPtunesValueSongPosition; - - EvtGetEvent(&_eAction, evtNoWait); - if (PocketTunesCallSynch(_pAction) == errNone) - value = _pAction->data.getValueAction.value; - - return value; -} - -UInt32 PckTunesCDPlayer::getDuration() { - UInt32 value = gVars->CD.defaultTrackLength; - - if (!_isPlaying || !_pAction) - return value; - - _pAction->action = kPocketTunesActionGetValue; - _pAction->data.getValueAction.which = kPtunesValueSongDuration; - - EvtGetEvent(&_eAction, evtNoWait); - if (PocketTunesCallSynch(_pAction) == errNone) - value = _pAction->data.getValueAction.value; - - return value; -} - -void PckTunesCDPlayer::setPosition(UInt32 value) { - if (!_isPlaying) - return; - - PocketTunesAction *pAction = AllocateAsynchronousActionStruct(); - if (!pAction) - return; - - pAction->action = kPocketTunesActionSetValue; - pAction->data.getValueAction.which = kPtunesValueSongPosition; - pAction->data.getValueAction.value = value; - - EvtGetEvent(&_eAction, evtNoWait); - PocketTunesCall(pAction); -} - -void PckTunesCDPlayer::setVolume(int volume) { - _volumeLevel = volume; - - PocketTunesAction *pAction = AllocateAsynchronousActionStruct(); - if (!pAction) - return; - - pAction->action = kPocketTunesActionSetValue; - pAction->data.getValueAction.which = kPtunesValueVolume; - pAction->data.getValueAction.value = (_volumeLimit * volume) / 100; - - EvtGetEvent(&_eAction, evtNoWait); - PocketTunesCall(pAction); -} - -bool PckTunesCDPlayer::poll() { - return (_pckLoops != 0 && (getPosition(_pckTrackEndFrame) < _pckTrackEndFrame || getStatus() != kPtunesStopped)); -} - -void PckTunesCDPlayer::update() { - - // stop replay upon request of stopCD() - if (_pckStopTime != 0 && _sys->getMillis() >= _pckStopTime) { - PocketTunesStop(); - _pckLoops = 0; - _pckStopTime = 0; - _pckTrackEndFrame = 0; - return; - } - - // not fully played - if (getPosition(_pckTrackEndFrame) < _pckTrackEndFrame && getStatus() != kPtunesStopped) - return; - - PocketTunesStop(); - - if (_pckLoops == 0) - return; - - // loop again ? - if (_pckLoops > 0) - _pckLoops--; - - // loop if needed - if (_pckLoops != 0 && _isPlaying) { - if (_pckTrackStartFrame == 0 && _pckTrackDuration == 0) { - setPosition(0); - } else { - setPosition(_pckTrackStartFrame); - } - - PocketTunesPlay(); - } -} - -void PckTunesCDPlayer::stop() { /* Stop CD Audio in 1/10th of a second */ - _pckStopTime = _sys->getMillis() + 100; - _pckLoops = 0; - return; -} - -void PckTunesCDPlayer::play(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - EventType e; - Char nameP[256], fileP[100]; - static const Char *ext[] = { "mp3", "ogg" }; - - _pckTrack = track; - _pckLoops = num_loops; - _pckTrackStartFrame = TO_MSECS(start_frame); - _pckTrackDuration = TO_MSECS(duration); - - VFSVolumeGetLabel(gVars->VFS.volRefNum, nameP, 256); - - StrPrintF(fileP, "/Palm/Programs/ScummVM/Audio/%s_%03ld.%s", gameP, (track + gVars->CD.firstTrack - 1), ext[gVars->CD.format]); - - if (PocketTunesOpenFile(nameP, fileP, 0) == errNone) { - EvtGetEvent(&e, evtNoWait); - PocketTunesPauseIfPlaying(); - _isPlaying = true; - - if (_pckTrackStartFrame == 0 && _pckTrackDuration == 0) { - _pckTrackDuration = getDuration(); - } else { - setPosition(_pckTrackStartFrame); - if (_pckTrackDuration == 0) - _pckTrackDuration = getDuration() - _pckTrackStartFrame; - } - - PocketTunesPlay(); - - } else { - _isPlaying = false; - _pckTrackDuration = gVars->CD.defaultTrackLength * 1000; - } - - _pckStopTime = 0; - _pckTrackEndFrame = _pckTrackStartFrame + _pckTrackDuration; -} diff --git a/backends/platform/PalmOS/Src/cd_pockettunes.h b/backends/platform/PalmOS/Src/cd_pockettunes.h deleted file mode 100644 index 77938d846a..0000000000 --- a/backends/platform/PalmOS/Src/cd_pockettunes.h +++ /dev/null @@ -1,69 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - - #ifndef CD_POCKETTUNES_H - #define CD_POCKETTUNES_H - - #include "cdaudio.h" - #include "pockettunes.h" - - class PckTunesCDPlayer : public CDAudio { - public: - PckTunesCDPlayer(OSystem *sys); - - bool init(); - void release(); - - bool poll(); - void update(); - void play(int track, int num_loops, int start_frame, int duration); - void stop(); - - void setVolume(int volume); - - private: - OSystem *_sys; - Char gameP[15]; - - PocketTunesAction *_pAction; // prevent memory fragmentation - EventType _eAction; - - UInt32 getStatus(); - void setPosition(UInt32 value); - UInt32 getDuration(); - UInt32 getPosition(UInt32 deft); - - UInt32 _volumeLimit; - UInt32 getVolumeLimit(); - - Boolean _isPlaying; - // cdrom - UInt16 _pckLoops, _pckTrack; - UInt32 _pckTrackStartFrame, _pckTrackEndFrame; - UInt32 _pckStopTime, _pckTrackDuration; - }; - - #endif - diff --git a/backends/platform/PalmOS/Src/cdaudio.h b/backends/platform/PalmOS/Src/cdaudio.h deleted file mode 100644 index 7a3f5e56e4..0000000000 --- a/backends/platform/PalmOS/Src/cdaudio.h +++ /dev/null @@ -1,67 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef CDAUDIO_H -#define CDAUDIO_H - -#include "common/system.h" - -// CD frames are 1/75 sec -#define CD_FPS 75 -#define TO_MSECS(frame) ((UInt32)((frame) * 1000 / CD_FPS)) - -// consider frame at 1/1000 sec -#define FROM_MIN(mins) ((UInt32)((mins) * 60 * 1000)) -#define FROM_SEC(secs) ((UInt32)((secs) * 1000)) - -class CDAudio { -public: - CDAudio() { - _isInitialized = false; - _volumeLevel = 100; - }; - - virtual bool init() = 0; - virtual void release() = 0; - - // OSystem functions - virtual bool poll() = 0; - virtual void play(int track, int num_loops, int start_frame, int duration) = 0; - virtual void stop() = 0; - virtual void update() = 0; - - // volume in percent - virtual void setVolume(int volume) { _volumeLevel = volume; } - virtual int getVolume() const { return _volumeLevel; } - - virtual void upVolume(int value) {} - virtual void downVolume(int value) {} - -protected: - int _volumeLevel; - bool _isInitialized; -}; - -#endif diff --git a/backends/platform/PalmOS/Src/extend.cpp b/backends/platform/PalmOS/Src/extend.cpp deleted file mode 100644 index 430563a302..0000000000 --- a/backends/platform/PalmOS/Src/extend.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "PalmVersion.h" -#include -#include "globals.h" - -#include "modulesrsc.h" - -void PalmFatalError(const char *err) { - WinSetDrawWindow(WinGetDisplayWindow()); - WinPalette(winPaletteSetToDefault,0,0,0); - WinSetBackColor(0); - WinEraseWindow(); - FrmCustomAlert(FrmFatalErrorAlert, err, 0,0); -} - -void DrawStatus(Boolean show) { - if (OPTIONS_TST(kOptDisableOnScrDisp)) - return; - - UInt8 x,y; - UInt32 depth, d1; - Boolean d2; - WinScreenMode(winScreenModeGet, &d1, &d1, &depth, &d2); - Int16 color = (show ? gVars->indicator.on : gVars->indicator.off); - - if (depth == 8) { - UInt8 *src = (UInt8 *)BmpGetBits(WinGetBitmap(WinGetDisplayWindow())); - src += gVars->screenPitch + 1; - for (y=0; y < 4; y++) { - for (x=0; x < 4; x++) - src[x] = color; - - src += gVars->screenPitch; - } - - } else if (depth == 16) { - Int16 *src = (Int16 *)BmpGetBits(WinGetBitmap(WinGetDisplayWindow())); - src += gVars->screenPitch + 1; - for (y=0; y < 4; y++) { - for (x=0; x < 4; x++) - src[x] = color; - - src += gVars->screenPitch; - } - } -} - -#ifndef PALMOS_ARM - -// This is now required since some classes are now very big :) -#include "MemGlue.h" -void *operator new(UInt32 size) { - void *ptr = MemGluePtrNew(size); - MemSet(ptr, 0, size); - return ptr; -} - -void *operator new [] (UInt32 size) { - void *ptr = MemGluePtrNew(size); - MemSet(ptr, 0, size); - return ptr; -} -#elif defined(COMPILE_OS5) || defined(STDLIB_TRACE_MEMORY) - -void *operator new(UInt32 size) { - void *ptr = malloc(size); - MemSet(ptr, 0, size); - return ptr; -} - -void *operator new [] (UInt32 size) { - void *ptr = malloc(size); - MemSet(ptr, 0, size); - return ptr; -} - -void operator delete(void *ptr) throw() { - if (ptr) free(ptr); -} - -void operator delete[](void *ptr) throw() { - if (ptr) free(ptr); -} - -#endif diff --git a/backends/platform/PalmOS/Src/features.h b/backends/platform/PalmOS/Src/features.h deleted file mode 100644 index f82c7692fa..0000000000 --- a/backends/platform/PalmOS/Src/features.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __FEATURES_H__ -#define __FEATURES_H__ - -enum { - ftrBufferOverlay = 1000, - ftrBufferBackup, - ftrBufferHotSwap -}; - -#define FREE_FTR(num) \ - { \ - UInt32 ptr; \ - FtrGet(appFileCreator, num, &ptr); \ - if (ptr) FtrPtrFree(appFileCreator, num); \ - } - -#endif diff --git a/backends/platform/PalmOS/Src/globals.h b/backends/platform/PalmOS/Src/globals.h deleted file mode 100644 index 796832df82..0000000000 --- a/backends/platform/PalmOS/Src/globals.h +++ /dev/null @@ -1,114 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef GLOBALS_H -#define GLOBALS_H - -#include -#include "stuffs.h" - -enum { - INIT_VIBRATOR = 1 << 0x00, - INIT_PA1LIB = 1 << 0x01, - INIT_ARM = 1 << 0x02, - INIT_AUTOOFF = 1 << 0x03, - INIT_GOLCD = 1 << 0x04 -}; - -enum { - FM_QUALITY_LOW = 0, - FM_QUALITY_MED, - FM_QUALITY_HI, - FM_QUALITY_INI -}; - -typedef struct { - // common parts - UInt32 _4B, _2B; - - // 4 bytes part - UInt32 startupMemory; - UInt32 slkVersion; - UInt32 options; - UInt32 screenPitch; - - struct { - FileRef logFile; - UInt32 cacheSize; - UInt16 volRefNum; - UInt16 dummy; - } VFS; - - // 2 bytes part - UInt16 HRrefNum; - UInt16 slkRefNum; - Coord screenWidth, screenHeight; // silkarea shown - Coord screenFullWidth, screenFullHeight; // silkarea hidden - Int16 autoSave; - struct { - Int16 on; - Int16 off; - Int16 showLED; - } indicator; - - // 1 byte part - Boolean vibrator; - Boolean stdPalette; - Boolean filter; - Boolean stylusClick; - Boolean arrowKeys; - UInt8 init; - UInt8 palmVolume; - UInt8 fmQuality; - UInt8 advancedMode; - -} GlobalsDataType, *GlobalsDataPtr; - -extern GlobalsDataPtr gVars; - -#define VARS_EXPORT() gVars->_4B = 6; \ - gVars->_2B = 12; - -#define DO_VARS(z, t, o) \ - { Int8 *tmp = (Int8 *)gVars + o + 8; \ - for (Int8 cnt = 0; cnt < gVars->z; cnt++) \ - { UInt##t val = *((UInt##t *)tmp); \ - val = ByteSwap##t(val); \ - *((UInt##t *)tmp) = val; \ - tmp += (t / 8); \ - } \ - } - -#define OPTIONS_DEF() gVars->options - -#define HWR_INIT(x) (gVars->init & (x)) -#define HWR_SET(x) gVars->init |= (x) -#define HWR_RST(x) gVars->init &= ~(x) -#define HWR_RSTALL() gVars->init = 0 -#define HWR_GET() (gVars->init) - -#define ARM(x) gVars->arm[x] - -#endif diff --git a/backends/platform/PalmOS/Src/i_zodiac.cpp b/backends/platform/PalmOS/Src/i_zodiac.cpp deleted file mode 100644 index 20b06aa61f..0000000000 --- a/backends/platform/PalmOS/Src/i_zodiac.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include "extend.h" - -#ifndef DISABLE_TAPWAVE - -#include "tapwave.h" -#include "i_zodiac.h" - -// _twBmpV3 = offscreen bitmap, must be set before this call -Err ZodiacInit(void **ptrP, Int32 w, Int32 h) { - Err e; - - TwGfxSurfaceInfoType surface = { - sizeof(TwGfxSurfaceInfoType), - w, h, w * 2, - twGfxLocationAcceleratorMemory, - twGfxPixelFormatRGB565_LE - }; - - e = SysSetOrientation(sysOrientationLandscape); - e = TwGfxOpen((TwGfxType **)&_twGfxLib, NULL); - e = TwGfxAllocSurface( (TwGfxType *)_twGfxLib, - (TwGfxSurfaceType **)&_twSrc, - &surface); - - e = TwGfxGetPalmDisplaySurface( (TwGfxType *)_twGfxLib, - (TwGfxSurfaceType **)&_twDst); - - return e; -} - -Err ZodiacRelease(void **ptrP) { - Err e = errNone; - - TwGfxFreeSurface((TwGfxSurfaceType *)_twSrc); - TwGfxClose((TwGfxType *)_twGfxLib); - - return e; -} - -#endif diff --git a/backends/platform/PalmOS/Src/i_zodiac.h b/backends/platform/PalmOS/Src/i_zodiac.h deleted file mode 100644 index 96a373a22e..0000000000 --- a/backends/platform/PalmOS/Src/i_zodiac.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _I_ZODIAC_H_ -#define _I_ZODIAC_H_ - -#define _twGfxLib ptrP[0] -#define _twSrc ptrP[1] -#define _twDst ptrP[2] -#define _twBmpV3 ptrP[3] - -Err ZodiacInit(void **ptrP, Int32 w, Int32 h); -Err ZodiacRelease(void **ptrP); - -#endif diff --git a/backends/platform/PalmOS/Src/init_golcd.cpp b/backends/platform/PalmOS/Src/init_golcd.cpp deleted file mode 100644 index b09d3b104e..0000000000 --- a/backends/platform/PalmOS/Src/init_golcd.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include -#include - -#include "init_golcd.h" - -// you can use this handle directly -MemHandle gGoLcdH; - -Err GoLCDInit(MemHandle *goLcdH) { - if (!goLcdH) - return sysErrParamErr; - - Err e; - UInt16 refNum; - Boolean loaded = false; - *goLcdH = NULL; - - if (e = SysLibFind(goLcdLibName, &refNum)) - loaded = !(e = SysLibLoad(goLcdLibType, goLcdLibCreator, &refNum)); - - if (!e) - if ((e = GoLcdLibOpen(refNum))) - SysLibRemove(refNum); - - if (!e) { - MemHandle lcdH = MemHandleNew(sizeof(GoLCDType)); - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(lcdH); - MemSet(lcdP, MemHandleSize(lcdH), 0); - lcdP->refNum = refNum; - lcdP->timeout = GoLcdGetTimeout(refNum, goLcdPenTapMode); - MemPtrUnlock(lcdP); - *goLcdH = lcdH; - } - - return e; -} - -Err GoLCDRelease(MemHandle goLcdH) { - if (!goLcdH) - return sysErrParamErr; - - Err e; - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - if (lcdP->refNum != sysInvalidRefNum) - if (!(e = GoLcdLibClose(lcdP->refNum))) - e = SysLibRemove(lcdP->refNum); - - MemPtrUnlock(lcdP); - MemHandleFree(goLcdH); - - return e; -} - -Boolean GoLCDPointInBounds(MemHandle goLcdH, Coord x, Coord y) { - Boolean inBounds = false; - - if (!goLcdH) - return inBounds; - - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - inBounds = (lcdP->active && RctPtInRectangle(x, y, &(lcdP->bounds))); - MemPtrUnlock(lcdP); - - return inBounds; -} - -void GoLCDSetInk(MemHandle goLcdH, RGBColorType *inkP) { - if (!goLcdH) - return; - - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - MemMove(&(lcdP->ink), inkP, sizeof(RGBColorType)); - MemPtrUnlock(lcdP); -} - -void GoLCDSetBounds(MemHandle goLcdH, RectangleType *boundsP) { - if (!goLcdH) - return; - - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - MemMove(&(lcdP->bounds), boundsP, sizeof(RectangleType)); - MemPtrUnlock(lcdP); -} - -void GoLCDActivate(MemHandle goLcdH, Boolean active) { - if (!goLcdH) - return; - - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - - if (active) { - if (!lcdP->active) { - lcdP->active = true; - GoLcdSetInkState(lcdP->refNum, goLcdInkEnabled, goLcdColorOverride, &(lcdP->ink)); - GoLcdSetBounds(lcdP->refNum, &(lcdP->bounds)); - GoLcdSetGsiState(lcdP->refNum, goLcdGsiNormal, goLcdColorDefault, 0); - GoLcdSetTimeout(lcdP->refNum, goLcdPenTapMode, lcdP->timeout); - GoLcdSetStatus(lcdP->refNum, goLcdEnabled); - } - - } else { - lcdP->active = false; - GoLcdSetInkState(lcdP->refNum, goLcdInkDisabled, goLcdColorDefault, 0); - GoLcdSetStatus(lcdP->refNum, goLcdDisabled); - } - - MemPtrUnlock(lcdP); -} - -Boolean GoLCDToggle(MemHandle goLcdH) { - if (!goLcdH) - return; - - Boolean active; - GoLCDType *lcdP = (GoLCDType *)MemHandleLock(goLcdH); - active = lcdP->active; - MemPtrUnlock(lcdP); - - GoLCDActivate(goLcdH, !active); - return (!active); -} diff --git a/backends/platform/PalmOS/Src/init_golcd.h b/backends/platform/PalmOS/Src/init_golcd.h deleted file mode 100644 index 7750a13a52..0000000000 --- a/backends/platform/PalmOS/Src/init_golcd.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef INIT_GOLCD_H -#define INIT_GOLCD_H - -typedef struct { - Boolean active; - UInt16 refNum; - RectangleType bounds; - RGBColorType ink; - UInt32 timeout; -} GoLCDType; - -extern MemHandle gGoLcdH; - -Err GoLCDInit(MemHandle *goLcdH); -Err GoLCDRelease(MemHandle goLcdH); -void GoLCDSetInk(MemHandle goLcdH, RGBColorType *inkP); -void GoLCDSetBounds(MemHandle goLcdH, RectangleType *boundsP); -void GoLCDActivate(MemHandle goLcdH, Boolean active); -Boolean GoLCDToggle(MemHandle goLcdH); -Boolean GoLCDPointInBounds(MemHandle goLcdH, Coord x, Coord y); - -#endif diff --git a/backends/platform/PalmOS/Src/init_mathlib.cpp b/backends/platform/PalmOS/Src/init_mathlib.cpp deleted file mode 100644 index 1ea39c3e0a..0000000000 --- a/backends/platform/PalmOS/Src/init_mathlib.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -#include "globals.h" -#include "init_mathlib.h" -#include "mathlib.h" - -Err MathlibInit() { - Err e; - - if ((e = SysLibFind(MathLibName, &MathLibRef))) - if (e == sysErrLibNotFound) // couldn't find lib - e = SysLibLoad(LibType, MathLibCreator, &MathLibRef); - - if (e) return sysErrLibNotFound; - - e = MathLibOpen(MathLibRef, MathLibVersion); - return e; -} - -void MathlibRelease() { - UInt16 useCount; - - if (MathLibRef != sysInvalidRefNum) { - MathLibClose(MathLibRef, &useCount); - - if (!useCount) - SysLibRemove(MathLibRef); - } -} diff --git a/backends/platform/PalmOS/Src/init_mathlib.h b/backends/platform/PalmOS/Src/init_mathlib.h deleted file mode 100644 index 1901e1330d..0000000000 --- a/backends/platform/PalmOS/Src/init_mathlib.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef INIT_MATHLIB_H -#define INIT_MATHLIB_H - -Err MathlibInit(); -void MathlibRelease(); - -#endif diff --git a/backends/platform/PalmOS/Src/init_pa1lib.cpp b/backends/platform/PalmOS/Src/init_pa1lib.cpp deleted file mode 100644 index d5b0340cae..0000000000 --- a/backends/platform/PalmOS/Src/init_pa1lib.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include - -#include "pa1lib.h" -#include "init_pa1lib.h" - -void *sndStateOnFuncP = NULL; -void *sndStateOffFuncP = NULL; - -#define SndStateOn(a,b,c) if (sndStateOnFuncP)((sndStateOnType)(sndStateOnFuncP))(a, b, c); -#define SndStateOff(a) if (sndStateOffFuncP)((sndStateOffType)(sndStateOffFuncP))(a); - -void Pa1libInit(UInt16 vol) { - Pa1Lib_Open(); - - // Doesn't work on T4xx and T6xx series ? - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOnHandlerP, (UInt32*) &sndStateOnFuncP); - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOffHandlerP, (UInt32*) &sndStateOffFuncP); - - SndStateOn(aOutSndKindSp, vol, vol); - SndStateOn(aOutSndKindHp, vol, vol); - - Pa1Lib_devHpVolume(vol, vol); - Pa1Lib_devSpVolume(vol); -} - -void Pa1libRelease() { - SndStateOff(aOutSndKindSp); - SndStateOff(aOutSndKindHp); - - Pa1Lib_Close(); -} diff --git a/backends/platform/PalmOS/Src/init_pa1lib.h b/backends/platform/PalmOS/Src/init_pa1lib.h deleted file mode 100644 index d5be11d278..0000000000 --- a/backends/platform/PalmOS/Src/init_pa1lib.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef INIT_PA1LIB_H -#define INIT_PA1LIB_H - -// need to move this on a .h file -#define sonySysFileCSystem 'SsYs' /* Sony overall System */ -#define sonySysFtrCreatorSystem sonySysFileCSystem - -#define sonySysFtrNumSystemBase 10000 -#define sonySysFtrNumSystemAOutSndStateOnHandlerP (sonySysFtrNumSystemBase + 4) -#define sonySysFtrNumSystemAOutSndStateOffHandlerP (sonySysFtrNumSystemBase + 5) - -typedef void (*sndStateOnType) (UInt8 /* kind */, UInt8 /* L volume 0-31 */, UInt8 /* R volume 0-31 */); -typedef void (*sndStateOffType) (UInt8 /* kind */); - -/* kind */ -#define aOutSndKindSp (0) /* Speaker volume */ -#define aOutSndKindHp (2) /* HeadPhone volume */ - -void Pa1libInit(UInt16 vol); -void Pa1libRelease(); - -#endif diff --git a/backends/platform/PalmOS/Src/init_palmos.cpp b/backends/platform/PalmOS/Src/init_palmos.cpp deleted file mode 100644 index 3a72382362..0000000000 --- a/backends/platform/PalmOS/Src/init_palmos.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -#include "globals.h" -#include "init_palmos.h" - -static UInt16 autoOffDelay; - -void PalmInit(UInt8 init) { - // set screen depth - UInt32 depth = 8; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - - if (init & INIT_AUTOOFF) { - autoOffDelay = SysSetAutoOffTime(0); - EvtResetAutoOffTimer(); - } - -} - -void PalmRelease(UInt8 init) { - if (init & INIT_AUTOOFF) { - SysSetAutoOffTime(autoOffDelay); - EvtResetAutoOffTimer(); - } -} - -Err PalmHRInit(UInt32 depth) { - Err e; - UInt32 width = 320; - UInt32 height = 320; - Boolean color = true; - - e = WinScreenMode (winScreenModeSet, &width, &height, &depth, &color); - - if (!e) { - UInt32 attr; - WinScreenGetAttribute(winScreenDensity, &attr); - e = (attr != kDensityDouble); - } - - return e; -} - -void PalmHRRelease() { - // should i do something here ? -} - -UInt8 PalmScreenSize(Coord *stdw, Coord *stdh, Coord *fullw, Coord *fullh) { - UInt32 ftr; - UInt8 mode = 0; - - Coord sw = 160; - Coord sh = 160; - - // Hi-Density present ? - if (!FtrGet(sysFtrCreator, sysFtrNumWinVersion, &ftr)) { - if (ftr >= 4) { - sw = 320; - sh = 320; - } - } - - Coord fw = sw; - Coord fh = sh; - - // if feature set, not set on Garmin iQue3600 ??? - if (!(FtrGet(sysFtrCreator, sysFtrNumInputAreaFlags, &ftr))) { - if (ftr & grfFtrInputAreaFlagCollapsible) { - UInt16 curOrientation = SysGetOrientation(); - - if (curOrientation == sysOrientationLandscape || - curOrientation == sysOrientationReverseLandscape - ) - mode = PALM_LANDSCAPE; - else - mode = PALM_PORTRAIT; - - PINSetInputTriggerState(pinInputTriggerEnabled); - PINSetInputAreaState(pinInputAreaClosed); - StatHide(); - - WinGetDisplayExtent(&fw, &fh); - fw *= 2; - fh *= 2; - - StatShow(); - PINSetInputAreaState(pinInputAreaOpen); - PINSetInputTriggerState(pinInputTriggerDisabled); - } - } - - if (stdw) *stdw = sw; - if (stdh) *stdh = sh; - if (fullw) *fullw = fw; - if (fullh) *fullh = fh; - - return mode; -} - -void PalmGetMemory(UInt32* storageMemoryP, UInt32* dynamicMemoryP, UInt32 *storageFreeP, UInt32 *dynamicFreeP) { - UInt32 free, max; - - Int16 i; - Int16 nCards; - UInt16 cardNo; - UInt16 heapID; - - UInt32 storageMemory = 0; - UInt32 dynamicMemory = 0; - UInt32 storageFree = 0; - UInt32 dynamicFree = 0; - - // Iterate through each card to support devices with multiple cards. - nCards = MemNumCards(); - - for (cardNo = 0; cardNo < nCards; cardNo++) { - // Iterate through the RAM heaps on a card (excludes ROM). - for (i=0; i< MemNumRAMHeaps(cardNo); i++) { - // Obtain the ID of the heap. - heapID = MemHeapID(cardNo, i); - // Calculate the total memory and free memory of the heap. - MemHeapFreeBytes(heapID, &free, &max); - - // If the heap is dynamic, increment the dynamic memory total. - if (MemHeapDynamic(heapID)) { - dynamicMemory += MemHeapSize(heapID); - dynamicFree += free; - - // The heap is nondynamic (storage ?). - } else { - storageMemory += MemHeapSize(heapID); - storageFree += free; - } - } - } - // Reduce the stats to KB. Round the results. - dynamicMemory = dynamicMemory / 1024L; - storageMemory = storageMemory / 1024L; - - dynamicFree = dynamicFree / 1024L; - storageFree = storageFree / 1024L; - - if (dynamicMemoryP) *dynamicMemoryP = dynamicMemory; - if (storageMemoryP) *storageMemoryP = storageMemory; - if (dynamicFreeP) *dynamicFreeP = dynamicFree; - if (storageFreeP) *storageFreeP = storageFree; -} diff --git a/backends/platform/PalmOS/Src/init_palmos.h b/backends/platform/PalmOS/Src/init_palmos.h deleted file mode 100644 index d4691dd15b..0000000000 --- a/backends/platform/PalmOS/Src/init_palmos.h +++ /dev/null @@ -1,42 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef INIT_PALMOS_H -#define INIT_PALMOS_H - -#define PALM_PORTRAIT 1 -#define PALM_LANDSCAPE 2 - -void PalmInit(UInt8 init); -void PalmRelease(UInt8 init); - -Err PalmHRInit(UInt32 depth); -void PalmHRRelease(); - - -UInt8 PalmScreenSize(Coord *stdw, Coord *stdh, Coord *fullw, Coord *fullh); -void PalmGetMemory(UInt32* storageMemoryP, UInt32* dynamicMemoryP, UInt32 *storageFreeP, UInt32 *dynamicFreeP); - -#endif diff --git a/backends/platform/PalmOS/Src/init_sony.cpp b/backends/platform/PalmOS/Src/init_sony.cpp deleted file mode 100644 index f6728d08b3..0000000000 --- a/backends/platform/PalmOS/Src/init_sony.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include "init_sony.h" - -UInt16 SilkInit(UInt32 *retVersion) { - SonySysFtrSysInfoP sonySysFtrSysInfoP; - UInt32 version; - UInt16 slkRefNum; - Err e; - - // Sony HiRes+ - if (!(e = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { - if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrSilk) { - - if ((e = SysLibFind(sonySysLibNameSilk, &slkRefNum))) - if (e == sysErrLibNotFound) - e = SysLibLoad(sonySysFileTSilkLib, sonySysFileCSilkLib, &slkRefNum); - - if (!e) { - e = FtrGet(sonySysFtrCreator, sonySysFtrNumVskVersion, &version); - if (e) { - // v1 = NR - e = SilkLibOpen(slkRefNum); - if (!e) version = vskVersionNum1; - - } else { - // v2 = NX/NZ - // v3 = UX... - e = VskOpen(slkRefNum); - } - } - } else - e = sysErrLibNotFound; - } - - if (e) { - version = 0; - slkRefNum = sysInvalidRefNum; - } - - *retVersion = version; - return slkRefNum; -} - -void SilkRelease(UInt16 slkRefNum) { - if (slkRefNum != sysInvalidRefNum) - SilkLibClose(slkRefNum); -} - -UInt16 SonyHRInit(UInt32 depth) { - SonySysFtrSysInfoP sonySysFtrSysInfoP; - Err e; - UInt16 HRrefNum; - - // test if sonyHR is present - if (!(e = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { - if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrHR) { // HR available - - if ((e = SysLibFind(sonySysLibNameHR, &HRrefNum))) - if (e == sysErrLibNotFound) // can't find lib - e = SysLibLoad( 'libr', sonySysFileCHRLib, &HRrefNum); - - // Now we can use HR lib. Executes Open library. - if (!e) e = HROpen(HRrefNum); - } - } - - if (e) HRrefNum = sysInvalidRefNum; - - if (HRrefNum != sysInvalidRefNum) { - UInt32 width = hrWidth; - UInt32 height = hrHeight; - Boolean color = true; - - e = HRWinScreenMode(HRrefNum, winScreenModeSet, &width, &height, &depth, &color); - // error ? release and return an invalid reference number - if (e) { - SonyHRRelease(HRrefNum); - HRrefNum = sysInvalidRefNum; - } - } - - return HRrefNum; -} - -void SonyHRRelease(UInt16 HRrefNum) { - if (HRrefNum != sysInvalidRefNum) { - HRClose(HRrefNum); - //SysLibRemove(HRrefNum); // never call this !! - } -} - -UInt8 SonyScreenSize(UInt16 HRrefNum, Coord *stdw, Coord *stdh, Coord *fullw, Coord *fullh) { - UInt32 version; - UInt16 slkRefNum; - UInt8 mode = 0; - - Coord sw = 160; - Coord sh = 160; - Coord fw = sw; - Coord fh = sh; - - if (HRrefNum != sysInvalidRefNum) { - sw = hrWidth; - sh = hrHeight; - fw = sw; - fh = sh; - - slkRefNum = SilkInit(&version); - - if (slkRefNum != sysInvalidRefNum) { - if (version == vskVersionNum1) { - SilkLibEnableResize(slkRefNum); - SilkLibResizeDispWin(slkRefNum, silkResizeMax); - HRWinGetWindowExtent(HRrefNum, &fw, &fh); - SilkLibResizeDispWin(slkRefNum, silkResizeNormal); - SilkLibDisableResize(slkRefNum); - mode = SONY_PORTRAIT; - - } else { - VskSetState(slkRefNum, vskStateEnable, (version == vskVersionNum2 ? vskResizeVertically : vskResizeHorizontally)); - VskSetState(slkRefNum, vskStateResize, vskResizeNone); - HRWinGetWindowExtent(HRrefNum, &fw, &fh); - VskSetState(slkRefNum, vskStateResize, vskResizeMax); - VskSetState(slkRefNum, vskStateEnable, vskResizeDisable); - mode = (version == vskVersionNum3 ? SONY_LANDSCAPE : SONY_PORTRAIT); - } - SilkRelease(slkRefNum); - } - } - - *stdw = sw; - *stdh = sh; - *fullw = fw; - *fullh = fh; - - return mode; -} diff --git a/backends/platform/PalmOS/Src/init_sony.h b/backends/platform/PalmOS/Src/init_sony.h deleted file mode 100644 index 86224283f6..0000000000 --- a/backends/platform/PalmOS/Src/init_sony.h +++ /dev/null @@ -1,40 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef INIT_SONY_H -#define INIT_SONY_H - -#define SONY_PORTRAIT 1 -#define SONY_LANDSCAPE 2 - -UInt16 SilkInit(UInt32 *retVersion); -void SilkRelease(UInt16 slkRefNum); - -UInt16 SonyHRInit(UInt32 depth); -void SonyHRRelease(UInt16 HRrefNum); - -UInt8 SonyScreenSize(UInt16 HRrefNum, Coord *stdw, Coord *stdh, Coord *fullw, Coord *fullh); - -#endif diff --git a/backends/platform/PalmOS/Src/init_stuffs.cpp b/backends/platform/PalmOS/Src/init_stuffs.cpp deleted file mode 100644 index 51bfe755eb..0000000000 --- a/backends/platform/PalmOS/Src/init_stuffs.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include - -#ifndef DISABLE_SONY -#include -#endif - -#include -#include -#include -#include - -#include "globals.h" // for OPTIONS_DEF() -#include "init_stuffs.h" -#include "stuffs.h" - -#ifndef DISABLE_TAPWAVE -#define __TWKEYS_H__ // bad hack -#include "tapwave.h" -#endif - -#ifndef DISABLE_PA1LIB -#include "Pa1Lib.h" -#endif - -#ifndef DISABLE_LIGHTSPEED -#include "lightspeed_public.h" -#endif - -// TODO : check the depth to set correct value -// works only for 8bit for now -UInt32 StuffsGetPitch(Coord fullw) { - UInt32 pitch = 0; - - if (OPTIONS_TST(kOptModeHiDensity)) { - WinScreenGetAttribute(winScreenRowBytes, &pitch); - - // FIXME : hack for TT3 simulator (and real ?) return 28 on landscape mode - if (pitch < fullw) - pitch = fullw; - - } else { - pitch = fullw; - } - - return pitch; -} - -void *StuffsForceVG() { - // create an empty form to force the VG to be shown - FormType *frmP = FrmNewForm(4567, NULL, 0,0,0,0, false, 0, 0, 0); - FrmDrawForm(frmP); - return frmP; -} - -void StuffsReleaseVG(void *vg) { - FrmDeleteForm((FormPtr)vg); -} - -void StuffsGetFeatures() { - UInt32 ulProcessorType, manufacturer, version, depth; - Boolean color; - -#ifndef DISABLE_TAPWAVE - // Tapwave Zodiac libs ? - if (!FtrGet(sysFileCSystem, sysFtrNumOEMCompanyID, &manufacturer)) - if (manufacturer == twCreatorID) { - OPTIONS_SET(kOptDeviceZodiac); - OPTIONS_SET(kOpt5WayNavigatorV2); - } -#endif - - // Hi-Density present ? - if (!FtrGet(sysFtrCreator, sysFtrNumWinVersion, &version)) - if (version >= 4) - OPTIONS_SET(kOptModeHiDensity); - - // OS5 ? - if (!FtrGet(sysFtrCreator, sysFtrNumROMVersion, &version)) - if (version >= kOS5Version) - OPTIONS_SET(kOptDeviceOS5); - - // ARM ? - if (!FtrGet(sysFileCSystem, sysFtrNumProcessorID, &ulProcessorType)) - if (sysFtrNumProcessorIsARM(ulProcessorType)) - OPTIONS_SET(kOptDeviceARM); - else if (ulProcessorType == sysFtrNumProcessorx86) - OPTIONS_SET(kOptDeviceProcX86); - - // 5Way Navigator - if (!FtrGet(hsFtrCreator, hsFtrIDNavigationSupported, &version)) { - if (version >= 2) - OPTIONS_SET(kOpt5WayNavigatorV2); - - } else if (!FtrGet(sysFtrCreator, sysFtrNumFiveWayNavVersion, &version)) { - if (version >= 2) - OPTIONS_SET(kOpt5WayNavigatorV2); - else - OPTIONS_SET(kOpt5WayNavigatorV1); - - } else if (!FtrGet(navFtrCreator, navFtrVersion, &version)) { - if (version >= 2) - OPTIONS_SET(kOpt5WayNavigatorV2); - else - OPTIONS_SET(kOpt5WayNavigatorV1); - } - - // Palm Sound API ? - if (!FtrGet(sysFileCSoundMgr, sndFtrIDVersion, &version)) - if (version >= 1) - OPTIONS_SET(kOptPalmSoundAPI); - -#ifndef DISABLE_PA1LIB - // Sony Pa1 Sound API - if (Pa1Lib_Open()) { - OPTIONS_SET(kOptSonyPa1LibAPI); - Pa1Lib_Close(); - } -#endif - - // GoLCD - if (!FtrGet(goLcdLibCreator, goLcdLibFtrNum, &version)) - OPTIONS_SET(kOptGoLcdAPI); - -#ifndef DISABLE_LIGHTSPEED - // Lightspeed - if (LS_Installed()) - OPTIONS_SET(kOptLightspeedAPI); -#endif - - // check for 16bit mode - if (!WinScreenMode(winScreenModeGetSupportedDepths, NULL, NULL, &depth, &color)) - OPTIONS_SET(((depth & 0x8000) ? kOptMode16Bit : kOptNone)); - -} diff --git a/backends/platform/PalmOS/Src/init_stuffs.h b/backends/platform/PalmOS/Src/init_stuffs.h deleted file mode 100644 index 124510eeac..0000000000 --- a/backends/platform/PalmOS/Src/init_stuffs.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef INIT_STUFFS_H -#define INIT_STUFFS_H - -#define kOS5Version sysMakeROMVersion(5,0,0,sysROMStageRelease,0) - -void StuffsGetFeatures(); -UInt32 StuffsGetPitch(Coord fullw); -void *StuffsForceVG(); -void StuffsReleaseVG(void *vg); - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/app.cpp b/backends/platform/PalmOS/Src/launcher/app.cpp deleted file mode 100644 index 9bb1c1479b..0000000000 --- a/backends/platform/PalmOS/Src/launcher/app.cpp +++ /dev/null @@ -1,360 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include - -#include "StarterRsc.h" -#include "palmdefs.h" -#include "start.h" -#include "globals.h" -#include "rumble.h" - -#include "mathlib.h" -#include "formCards.h" -#include "games.h" - -#include "modules.h" -#include "init_mathlib.h" -#include "init_sony.h" -#include "init_palmos.h" -#include "init_stuffs.h" - -/*********************************************************************** - * - * FUNCTION: AppStart - * - * DESCRIPTION: Get the current application's preferences. - * - * PARAMETERS: nothing - * - * RETURNED: Err value 0 if nothing went wrong - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err AppStartCheckHRmode() -{ - Err e = errNone; - UInt32 depth = (OPTIONS_TST(kOptMode16Bit) && OPTIONS_TST(kOptDeviceOS5)) ? 16 : 8; - - // try to init Sony HR mode then Palm HR mode - gVars->HRrefNum = SonyHRInit(depth); - - if (gVars->HRrefNum == sysInvalidRefNum) { - if (e = PalmHRInit(depth)) - FrmCustomAlert(FrmErrorAlert,"Your device doesn't seem to support Hi-Res or 256color mode.",0,0); - } else { - OPTIONS_SET(kOptDeviceClie); - } - - return e; -} - -static void AppStopHRMode() { - if (gVars->HRrefNum != sysInvalidRefNum) - SonyHRRelease(gVars->HRrefNum); - else - PalmHRRelease(); -} - -static Err AppStartCheckNotify() { - UInt32 romVersion; - Err err; - - err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); - if (!err) { - UInt16 cardNo; - LocalID dbID; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (!err) { - SysNotifyRegister(cardNo, dbID, sysNotifyVolumeMountedEvent, NULL, sysNotifyNormalPriority, NULL); - SysNotifyRegister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, NULL, sysNotifyNormalPriority, NULL); - SysNotifyRegister(cardNo, dbID, sonySysNotifyMsaEnforceOpenEvent, NULL, sysNotifyNormalPriority, NULL); - SysNotifyRegister(cardNo, dbID, sysNotifyDisplayResizedEvent, NULL, sysNotifyNormalPriority, NULL); - } - } - - return err; -} - -static Err AppStartLoadSkin() { - Err err = errNone; - - // if skin defined, check if the db still exists - if (gPrefs->skin.dbID) { - UInt32 type, creator; - - // check if the DB still exists - DmSearchStateType state; - UInt16 cardNo; - LocalID dbID; - Boolean found = false; - err = DmGetNextDatabaseByTypeCreator(true, &state, 'skin', appFileCreator, false, &cardNo, &dbID); - while (!err && dbID && !found) { - found = (cardNo == gPrefs->skin.cardNo && dbID == gPrefs->skin.dbID); - err = DmGetNextDatabaseByTypeCreator(false, &state, 'skin', appFileCreator, false, &cardNo, &dbID); - } - - if (found) { - // remember to check version for next revision of the skin - err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0,0, &type, &creator); - if (!err) - if (type != 'skin' || creator != appFileCreator) - err = dmErrInvalidParam; - } - - if (!found || err) - MemSet(&(gPrefs->skin),sizeof(SkinInfoType),0); - } - - // No skin ? try to get the first one - if (!gPrefs->skin.dbID) { - DmSearchStateType stateInfo; - - err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &gPrefs->skin.cardNo, &gPrefs->skin.dbID); - if (!err) - err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - - return err; -} - -static Err AppStartCheckMathLib() { - Err e = MathlibInit(); - - switch (e) { - case errNone: - break; - case sysErrLibNotFound: - FrmCustomAlert(FrmErrorAlert,"Can't find MathLib !",0,0); - break; - default: - FrmCustomAlert(FrmErrorAlert,"Can't open MathLib !",0,0); - break; - } - - return e; -} - -static void AppStopMathLib() { - MathlibRelease(); -} - -static void AppStartCheckScreenSize() { - Coord sw, sh, fw, fh; - UInt8 mode; - - OPTIONS_RST(kOptCollapsible); - OPTIONS_RST(kOptModeWide); - OPTIONS_RST(kOptModeLandscape); - OPTIONS_RST(kOptModeRotatable); - - // we are on a sony device - if (OPTIONS_TST(kOptDeviceClie)) { - mode = SonyScreenSize(gVars->HRrefNum, &sw, &sh, &fw, &fh); - if (mode) { - OPTIONS_SET(kOptModeWide); - OPTIONS_SET((mode == SONY_LANDSCAPE) ? kOptModeLandscape : kOptNone); - } - } else { - mode = PalmScreenSize(&sw, &sh, &fw, &fh); - if (mode) { - OPTIONS_SET(kOptCollapsible); - OPTIONS_SET(kOptModeWide); - OPTIONS_SET((mode == PALM_LANDSCAPE) ? kOptModeLandscape : kOptNone); - // TODO: doesn't work with Sony - OPTIONS_SET(SysGlueTrapExists(pinSysSetOrientation) ? kOptModeRotatable :kOptNone); - } - } - - gVars->screenWidth = sw; - gVars->screenHeight = sh; - - gVars->screenFullWidth = fw; - gVars->screenFullHeight = fh; -} - -#define max(id,value) gVars->memory[id] = (gVars->memory[id] < value ? value : gVars->memory[id]) -#define min(id,value) gVars->memory[id] = (gVars->memory[id] > value ? value : gVars->memory[id]) -#define threshold 700 - -static void AppStartSetMemory() { - UInt32 mem, def; - PalmGetMemory(0,0,0,&mem); - def = (mem > threshold) ? (mem - threshold) * 1024 : 0; - gVars->startupMemory = mem; -} - -#undef threshold -#undef min -#undef max - -Err AppStart(void) { - UInt16 dataSize, checkSize = 0; - Err error; - -#ifndef _DEBUG_ENGINE - // delete old databases - ModDelete(); -#endif - - // allocate global variables space - dataSize = sizeof(GlobalsDataType); - gVars = (GlobalsDataType *)MemPtrNew(dataSize); - MemSet(gVars, dataSize, 0); - - gVars->indicator.on = 255; - gVars->indicator.off = 0; - gVars->HRrefNum = sysInvalidRefNum; - gVars->VFS.volRefNum = vfsInvalidVolRef; - gVars->slkRefNum = sysInvalidRefNum; - gVars->options = kOptNone; - - // set memory required by the differents engines - AppStartSetMemory(); - StuffsGetFeatures(); - - // allocate prefs space - dataSize = sizeof(GlobalsPreferenceType); - gPrefs = (GlobalsPreferenceType *)MemPtrNew(dataSize); - MemSet(gPrefs, dataSize, 0); - - // Read the saved preferences / saved-state information. - if (PrefGetAppPreferences(appFileCreator, appPrefID, NULL, &checkSize, true) == noPreferenceFound || checkSize != dataSize) { - // reset all elements - MemSet(gPrefs, dataSize, 0); - - gPrefs->card.volRefNum = vfsInvalidVolRef; - gPrefs->card.cacheSize = 4096; - gPrefs->card.useCache = true; - gPrefs->card.showLED = true; - gPrefs->card.autoDetect = true; - - gPrefs->autoOff = true; - gPrefs->vibrator = RumbleExists(); - gPrefs->debug = false; - gPrefs->exitLauncher = true; - gPrefs->stdPalette = OPTIONS_TST(kOptDeviceOS5); - gPrefs->stylusClick = true; - - } else { - PrefGetAppPreferences(appFileCreator, appPrefID, gPrefs, &dataSize, true); - } - - if (!OPTIONS_TST(kOptDeviceARM)) { - error = AppStartCheckMathLib(); - if (error) return (error); - } - - error = AppStartCheckHRmode(); - if (error) return (error); - - bDirectMode = (AppStartLoadSkin() != errNone); - - // if volref previously defined, check if it's a valid one - if (gPrefs->card.volRefNum != vfsInvalidVolRef) { - VolumeInfoType volInfo; - Err err = VFSVolumeInfo(gPrefs->card.volRefNum, &volInfo); - if (err) - gPrefs->card.volRefNum = parseCards(); - } - else - gPrefs->card.volRefNum = parseCards(); - if (gPrefs->card.volRefNum != vfsInvalidVolRef) - CardSlotCreateDirs(); - - // open games database - error = GamOpenDatabase(); - if (error) return (error); - GamImportDatabase(); - - AppStartCheckScreenSize(); - AppStartCheckNotify(); // not fatal error if not avalaible - - return error; -} - -/*********************************************************************** - * - * FUNCTION: AppStop - * - * DESCRIPTION: Save the current state of the application. - * - * PARAMETERS: nothing - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err AppStopCheckNotify() -{ - UInt32 romVersion; - Err err; - - err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); - if (!err) { - UInt16 cardNo; - LocalID dbID; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (!err) { - SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, sysNotifyNormalPriority); - SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeMountedEvent, sysNotifyNormalPriority); - // sonySysNotifyMsaEnforceOpenEvent - SysNotifyUnregister(cardNo, dbID, sysNotifyDisplayResizedEvent, sysNotifyNormalPriority); - } - } - - return err; -} - -void AppStop(void) { - // Close all the open forms. - FrmCloseAllForms(); - WinEraseWindow(); - WinPalette(winPaletteSetToDefault, 0, 256, NULL); - - // Close and move Game list database - GamCloseDatabase(false); - - // Write the saved preferences / saved-state information. This data - // will saved during a HotSync backup. - SavePrefs(); - - // stop all - AppStopCheckNotify(); - if (!OPTIONS_TST(kOptDeviceARM)) - AppStopMathLib(); - AppStopHRMode(); - - if (!bLaunched) - MemPtrFree(gVars); -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formCards.cpp b/backends/platform/PalmOS/Src/launcher/forms/formCards.cpp deleted file mode 100644 index eb4654ed10..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formCards.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include - -#include "start.h" -#include "formTabs.h" -#include "forms.h" -#include "globals.h" - -typedef struct { - UInt16 volRefNum; - Char nameP[expCardInfoStringMaxLen+1]; - -} CardInfoType; - -static TabType *myTabP; -static UInt16 lastTab = 0; - -static void CardSlotFormExit(Boolean bSave); - -static void CardSlotFreeList() { - MemHandle cards = NULL; - MemHandle items = NULL; - - if (itemsText && itemsList) { - cards = MemPtrRecoverHandle(itemsList); - items = MemPtrRecoverHandle(itemsText); - - itemsText = NULL; - itemsList = NULL; - } - itemsType = ITEM_TYPE_UNKNOWN; - - if (items && cards) { - MemHandleUnlock(items); - MemHandleUnlock(cards); - MemHandleFree(items); - MemHandleFree(cards); - } -} - -static UInt16 CardSlotFillList(Boolean getRefNum = false) { - Err err; - UInt16 index; - UInt16 volRefNum; - UInt32 volIterator = vfsIteratorStart|vfsIncludePrivateVolumes; - UInt8 counter = 0; - UInt32 other = 1; - - MemHandle items = NULL; - MemHandle cards = NULL; - CardInfoType *cardsInfo; - - // retreive card infos - while (volIterator != vfsIteratorStop) { - err = VFSVolumeEnumerate(&volRefNum, &volIterator); - - if (!err) { - Char labelP[expCardInfoStringMaxLen+1]; - MemSet(labelP, expCardInfoStringMaxLen+1, 0); - err = VFSVolumeGetLabel(volRefNum, labelP, expCardInfoStringMaxLen+1); - - if (err || StrLen(labelP) == 0) { // if no label try to retreive card type - VolumeInfoType volInfo; - err = VFSVolumeInfo(volRefNum, &volInfo); - - if (!err) { - ExpCardInfoType info; - err = ExpCardInfo(volInfo.slotRefNum, &info); - StrCopy(labelP, info.deviceClassStr); - } - - if (err) // if err default name - StrPrintF(labelP,"Other Card %ld", other++); - } - - if (!cards) - cards = MemHandleNew(sizeof(CardInfoType)); - else - MemHandleResize(cards, MemHandleSize(cards) + sizeof(CardInfoType)); - - cardsInfo = (CardInfoType *)MemHandleLock(cards); - cardsInfo[counter].volRefNum = volRefNum; - StrCopy(cardsInfo[counter].nameP, labelP); - MemHandleUnlock(cards); - counter++; - } - } - - if (counter > 0) { - // set the list items ... - if (!getRefNum) { - for (index = 0; index < counter; index++) { - if (!items) - items = MemHandleNew(sizeof(Char *)); - else - MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); - - itemsText = (Char **)MemHandleLock(items); - itemsText[index] = cardsInfo[index].nameP; - MemHandleUnlock(items); - } - - // save globals - itemsText = (Char **)MemHandleLock(items); - itemsList = (void *)MemHandleLock(cards); - itemsType = ITEM_TYPE_CARD; - - // ... or just return a default volRefNum - } else { - UInt16 volRefNum; - - cardsInfo = (CardInfoType *)MemHandleLock(cards); - volRefNum = cardsInfo[0].volRefNum; // return the first volref - MemHandleUnlock(cards); - MemHandleFree(cards); - - return volRefNum; - } - - // no card found ? free old list in any or return invalid volref - } else { - if (!getRefNum) - CardSlotFreeList(); - else - return vfsInvalidVolRef; - } - - return counter; -} - -static void ConfigTabInit(Boolean update = false) { - ListPtr listP; - - UInt16 index; - Int16 selected = -1; - - UInt16 counter = CardSlotFillList(); - listP = (ListType *)GetObjectPtr(TabCardConfigSlotList); - - // itemsText can be NULL if counter = 0 - LstSetListChoices (listP, itemsText, counter); - if (counter > 0) { - CardInfoType *cardsInfo = (CardInfoType *)itemsList; - - for (index = 0; index < counter; index++) { - if (cardsInfo[index].volRefNum == gPrefs->card.volRefNum) { - selected = index; - break; - } - } - - LstSetSelection(listP, selected); - } - - if (!update) { - FieldType *fld1P; - Char *cacheP; - MemHandle cacheH; - - fld1P = (FieldType *)GetObjectPtr(TabCardConfigCacheSizeField); - cacheH = MemHandleNew(FldGetMaxChars(fld1P)+1); - cacheP = (Char *)MemHandleLock(cacheH); - StrIToA(cacheP, gPrefs->card.cacheSize / 1024); - MemHandleUnlock(cacheH); - - FldSetTextHandle(fld1P, cacheH); - CtlSetValue((ControlType *)GetObjectPtr(TabCardConfigCacheCheckbox), gPrefs->card.useCache); - CtlSetValue((ControlType *)GetObjectPtr(TabCardConfigLedCheckbox), gPrefs->card.showLED); - CtlSetValue((ControlType *)GetObjectPtr(TabCardConfigDetectCheckbox), gPrefs->card.autoDetect); - // update ? redraw the list - } else { - WinScreenLock(winLockCopy); - LstDrawList(listP); - WinScreenUnlock(); - } -} - -static UInt16 ConfigTabSave() { - ControlType *cckP[3]; - FieldType *fld1P; - ListPtr listP; - FormPtr frmP; - UInt16 updateCode = frmRedrawUpdateMS; - - cckP[0] = (ControlType *)GetObjectPtr(TabCardConfigCacheCheckbox); - cckP[1] = (ControlType *)GetObjectPtr(TabCardConfigLedCheckbox); - cckP[2] = (ControlType *)GetObjectPtr(TabCardConfigDetectCheckbox); - - gPrefs->card.useCache = CtlGetValue(cckP[0]); - gPrefs->card.showLED = CtlGetValue(cckP[1]); - gPrefs->card.autoDetect = CtlGetValue(cckP[2]); - - fld1P = (FieldType *)GetObjectPtr(TabCardConfigCacheSizeField); - frmP = FrmGetActiveForm(); - if (FldGetTextLength(fld1P) == 0 && CtlGetValue(cckP[0]) == 1) { - TabSetActive(frmP, myTabP, 0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabCardConfigCacheSizeField)); - FrmCustomAlert(FrmWarnAlert,"You must specified a cache size.",0,0); - return 0; - } - gPrefs->card.cacheSize = StrAToI(FldGetTextPtr(fld1P)) * 1024; - - Int16 selected; - CardInfoType *cardsInfo = (CardInfoType *)itemsList; - - listP = (ListType *)GetObjectPtr(TabCardConfigSlotList); - selected = LstGetSelection(listP); - if (selected == -1) { - gPrefs->card.volRefNum = vfsInvalidVolRef; - } else if (gPrefs->card.volRefNum != cardsInfo[selected].volRefNum) { - updateCode = frmRedrawUpdateMSImport; - gPrefs->card.volRefNum = cardsInfo[selected].volRefNum; - } - - CardSlotCreateDirs(); - CardSlotFreeList(); - - return updateCode; -} - -static void GameListTabInit() { - CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox), gPrefs->card.moveDB); - CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListDeleteCheckbox), gPrefs->card.deleteDB); - CtlSetValue((ControlType *)GetObjectPtr(TabCardGameListConfirmCheckbox), gPrefs->card.confirmMoveDB); -} - -static void GameListTabSave() { - ControlType *cckP[3]; - - cckP[0] = (ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox); - cckP[1] = (ControlType *)GetObjectPtr(TabCardGameListDeleteCheckbox); - cckP[2] = (ControlType *)GetObjectPtr(TabCardGameListConfirmCheckbox); - - gPrefs->card.moveDB = CtlGetValue(cckP[0]); - gPrefs->card.deleteDB = CtlGetValue(cckP[1]); - gPrefs->card.confirmMoveDB = CtlGetValue(cckP[2]); -} - -static void GameListTabDraw() { - ControlType *cck1P; - FormPtr frmP = FrmGetActiveForm(); - - cck1P = (ControlType *)GetObjectPtr(TabCardGameListMoveCheckbox); - if (CtlGetValue(cck1P)) { - FrmShowObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListDeleteCheckbox)); - FrmShowObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListConfirmCheckbox)); - } else { - FrmHideObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListDeleteCheckbox)); - FrmHideObject(frmP, FrmGetObjectIndex (frmP, TabCardGameListConfirmCheckbox)); - } -} - -static void CardSlotFormInit() { - TabType *tabP; - FormType *frmP = FrmGetActiveForm(); - - tabP = TabNewTabs(2); - TabAddContent(&frmP, tabP, "Cards", TabCardConfigForm); - TabAddContent(&frmP, tabP, "Game List", TabCardGameListForm, GameListTabDraw); - - ConfigTabInit(); - GameListTabInit(); - - FrmDrawForm(frmP); - TabSetActive(frmP, tabP, lastTab); - - myTabP = tabP; -} - -static void CardSlotFormSave() { - UInt16 updateCode; - updateCode = ConfigTabSave(); - if (!updateCode) return; - GameListTabSave(); - CardSlotCreateDirs(); - - TabDeleteTabs(myTabP); - FrmReturnToMain(updateCode); -} - -static void CardSlotFormCancel() { - CardSlotFreeList(); - TabDeleteTabs(myTabP); - FrmReturnToMain(); -} - -Boolean CardSlotFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - CardSlotFormInit(); - handled = true; - break; - - case frmCloseEvent: - CardSlotFormCancel(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case (CardSlotForm + 1) : - case (CardSlotForm + 2) : - lastTab = (eventP->data.ctlSelect.controlID - CardSlotForm - 1); - TabSetActive(frmP, myTabP, lastTab); - break; - - case CardSlotOkButton: - CardSlotFormSave(); - break; - - case CardSlotCancelButton: - CardSlotFormCancel(); - break; - - case TabCardGameListMoveCheckbox: - GameListTabDraw(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} - -void CardSlotCreateDirs() { - if (gPrefs->card.volRefNum != vfsInvalidVolRef) { - VFSDirCreate(gPrefs->card.volRefNum, "/PALM"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Games"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Saved"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Audio"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Mods"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Themes"); - } -} - -void CardSlotFormUpdate() { - if (itemsType == ITEM_TYPE_CARD) { - CardSlotFreeList(); - ConfigTabInit(true); - } -} - -UInt16 parseCards() { - UInt16 volRefNum = CardSlotFillList(true); - CardSlotFreeList(); - return volRefNum; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formCards.h b/backends/platform/PalmOS/Src/launcher/forms/formCards.h deleted file mode 100644 index 766c4793b9..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formCards.h +++ /dev/null @@ -1,33 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __FORMCARDS_H__ -#define __FORMCARDS_H__ - -UInt16 parseCards(); -void CardSlotFormUpdate(); -void CardSlotCreateDirs(); - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/forms/formEditGame.cpp b/backends/platform/PalmOS/Src/launcher/forms/formEditGame.cpp deleted file mode 100644 index 0540c12577..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formEditGame.cpp +++ /dev/null @@ -1,612 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include -#include - -#include "formTabs.h" -#include "forms.h" - -#include "start.h" -#include "games.h" -#include "skin.h" - -#define errBadParam 0x1000 - -static TabType *myTabP; -static UInt16 lastTab = 0; - -UInt8 gFormEditMode; - -static void GameTabInit(GameInfoType *gameInfoP) { - FieldType *fld1P, *fld2P, *fld3P; - Char *nameP, *pathP, *gameP; - MemHandle nameH, pathH, gameH; - ListType *list1P; - - list1P = (ListType *)GetObjectPtr(TabGameInfoEngineList); - - itemsText = (Char **)MemPtrNew(ENGINE_COUNT * sizeof(Char *)); - for (int i = 0; i < ENGINE_COUNT; i++) - itemsText[i] = (Char *)engines[i].nameP; - LstSetListChoices(list1P, itemsText, ENGINE_COUNT); - - fld1P = (FieldType *)GetObjectPtr(TabGameInfoEntryNameField); - fld2P = (FieldType *)GetObjectPtr(TabGameInfoPathField); - fld3P = (FieldType *)GetObjectPtr(TabGameInfoGameField); - - nameH = MemHandleNew(FldGetMaxChars(fld1P)+1); - pathH = MemHandleNew(FldGetMaxChars(fld2P)+1); - gameH = MemHandleNew(FldGetMaxChars(fld3P)+1); - - nameP = (Char *)MemHandleLock(nameH); - pathP = (Char *)MemHandleLock(pathH); - gameP = (Char *)MemHandleLock(gameH); - - if (gameInfoP) { - LstSetSelection(list1P, gameInfoP->engine); - LstSetTopItem(list1P, gameInfoP->engine); - StrCopy(nameP, gameInfoP->nameP); - StrCopy(pathP, gameInfoP->pathP); - StrCopy(gameP, gameInfoP->gameP); - } else { - LstSetSelection(list1P, 0); - MemSet(nameP,MemHandleSize(nameH),0); - MemSet(pathP,MemHandleSize(pathH),0); - MemSet(gameP,MemHandleSize(gameH),0); - } - - CtlSetLabel((ControlType *)GetObjectPtr(TabGameInfoEnginePopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - - MemHandleUnlock(nameH); - MemHandleUnlock(pathH); - MemHandleUnlock(gameH); - - FldSetTextHandle(fld1P, nameH); - FldSetTextHandle(fld2P, pathH); - FldSetTextHandle(fld3P, gameH); -} - -static Err GameTabSave(GameInfoType *gameInfoP) { - FieldType *fld1P, *fld2P, *fld3P; - ListType *list1P; - - FormType *frmP = FrmGetActiveForm(); - list1P = (ListType *)GetObjectPtr(TabGameInfoEngineList); - - fld1P = (FieldType *)GetObjectPtr(TabGameInfoEntryNameField); - fld2P = (FieldType *)GetObjectPtr(TabGameInfoPathField); - fld3P = (FieldType *)GetObjectPtr(TabGameInfoGameField); - - FldTrimText(fld1P); - FldTrimText(fld2P); - FldTrimText(fld3P); - - // test case - if (!gameInfoP) { - if (FldGetTextLength(fld1P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specify an entry name.",0,0); - TabSetActive(frmP, myTabP, 0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameInfoEntryNameField)); - return errBadParam; - - } else if (FldGetTextLength(fld2P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specify a path.",0,0); - TabSetActive(frmP, myTabP, 0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameInfoPathField)); - return errBadParam; - - } else if (FldGetTextLength(fld3P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specify a game.",0,0); - TabSetActive(frmP, myTabP, 0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameInfoGameField)); - return errBadParam; - } - - } else { - gameInfoP->engine = LstGetSelection(list1P); - StrCopy(gameInfoP->nameP, FldGetTextPtr(fld1P)); - StrCopy(gameInfoP->pathP, FldGetTextPtr(fld2P)); - StrCopy(gameInfoP->gameP, FldGetTextPtr(fld3P)); - - if (gameInfoP->pathP[StrLen(gameInfoP->pathP)-1] != '/') - StrCat(gameInfoP->pathP, "/"); - - MemPtrFree(itemsText); - itemsText = NULL; - } - - return errNone; -} - -static void DisplayInit(GameInfoType *gameInfoP) { - ListType *list1P, *list2P; - - list1P = (ListType *)GetObjectPtr(TabGameDisplayGfxListList); - list2P = (ListType *)GetObjectPtr(TabGameDisplayRenderList); - - if (gameInfoP) { - LstSetSelection(list1P, gameInfoP->gfxMode); - LstSetSelection(list2P, gameInfoP->renderMode); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayFilterCheckbox), gameInfoP->filter); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayFullscreenCheckbox), gameInfoP->fullscreen); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayAspectRatioCheckbox), gameInfoP->aspectRatio); - - } else { - LstSetSelection(list1P, 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayFilterCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayFullscreenCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameDisplayAspectRatioCheckbox), 0); - } - - CtlSetLabel((ControlType *)GetObjectPtr(TabGameDisplayGfxPopupPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - CtlSetLabel((ControlType *)GetObjectPtr(TabGameDisplayRenderPopTrigger), LstGetSelectionText(list2P, LstGetSelection(list2P))); -} - -static Err DisplaySave(GameInfoType *gameInfoP) { - ListType *list1P, *list2P; - ControlType *cck6P, *cck7P, *cck8P; - - FormType *frmP = FrmGetActiveForm(); - - list1P = (ListType *)GetObjectPtr(TabGameDisplayGfxListList); - list2P = (ListType *)GetObjectPtr(TabGameDisplayRenderList); - cck6P = (ControlType *)GetObjectPtr(TabGameDisplayFilterCheckbox); - cck7P = (ControlType *)GetObjectPtr(TabGameDisplayFullscreenCheckbox); - cck8P = (ControlType *)GetObjectPtr(TabGameDisplayAspectRatioCheckbox); - - if (!gameInfoP) { - } else { - gameInfoP->gfxMode = LstGetSelection(list1P); - gameInfoP->renderMode = LstGetSelection(list2P); - gameInfoP->filter = CtlGetValue(cck6P); - gameInfoP->fullscreen = CtlGetValue(cck7P); - gameInfoP->aspectRatio = CtlGetValue(cck8P); - } - - return errNone; -} - -static void OptionsInit(GameInfoType *gameInfoP) { - ListType *list2P, *list3P; - FieldType *fld4P, *fld5P, *fld6P; - Char *loadP, *roomP, *talkP; - MemHandle loadH, roomH, talkH; - - list2P = (ListType *)GetObjectPtr(TabGameOptionsLanguageList); - list3P = (ListType *)GetObjectPtr(TabGameOptionsPlatformList); - - fld4P = (FieldType *)GetObjectPtr(TabGameOptionsLoadSlotField); - fld5P = (FieldType *)GetObjectPtr(TabGameOptionsStartRoomField); - fld6P = (FieldType *)GetObjectPtr(TabGameOptionsTalkSpeedField); - - loadH = MemHandleNew(FldGetMaxChars(fld4P)+1); - roomH = MemHandleNew(FldGetMaxChars(fld5P)+1); - talkH = MemHandleNew(FldGetMaxChars(fld6P)+1); - - loadP = (Char *)MemHandleLock(loadH); - roomP = (Char *)MemHandleLock(roomH); - talkP = (Char *)MemHandleLock(talkH); - - if (gameInfoP) { - LstSetSelection(list2P, gameInfoP->language); - LstSetTopItem(list2P, gameInfoP->language); - LstSetSelection(list3P, gameInfoP->platform); - LstSetTopItem(list3P, gameInfoP->platform); - - StrIToA(loadP, gameInfoP->loadSlot); - StrIToA(roomP, gameInfoP->bootValue); - StrIToA(talkP, gameInfoP->talkValue); - - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsLoadSlotCheckbox), gameInfoP->autoLoad); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsStartRoomCheckbox), gameInfoP->bootParam); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsAmigaCheckbox), gameInfoP->setPlatform); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsSubtitlesCheckbox), gameInfoP->subtitles); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsTalkSpeedCheckbox), gameInfoP->talkSpeed); - - } else { - LstSetSelection(list2P, 0); - LstSetSelection(list3P, 0); - - StrIToA(loadP, 0); - StrIToA(roomP, 0); - StrIToA(talkP, 60); - - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsLoadSlotCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsStartRoomCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsAmigaCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsSubtitlesCheckbox), 1); - CtlSetValue((ControlType *)GetObjectPtr(TabGameOptionsTalkSpeedCheckbox), 0); - } - - MemHandleUnlock(loadH); - MemHandleUnlock(roomH); - MemHandleUnlock(talkH); - - FldSetTextHandle(fld4P, loadH); - FldSetTextHandle(fld5P, roomH); - FldSetTextHandle(fld6P, talkH); - - CtlSetLabel((ControlType *)GetObjectPtr(TabGameOptionsLanguagePopTrigger), LstGetSelectionText(list2P, LstGetSelection(list2P))); - CtlSetLabel((ControlType *)GetObjectPtr(TabGameOptionsPlatformPopTrigger), LstGetSelectionText(list3P, LstGetSelection(list3P))); -} - -static Err OptionsSave(GameInfoType *gameInfoP) { - FieldType *fld4P, *fld5P, *fld6P; - ControlType *cck1P, *cck2P, *cck3P, *cck4P, *cck5P; - ListType *list2P, *list3P; - - FormType *frmP = FrmGetActiveForm(); - - list2P = (ListType *)GetObjectPtr(TabGameOptionsLanguageList); - list3P = (ListType *)GetObjectPtr(TabGameOptionsPlatformList); - - fld4P = (FieldType *)GetObjectPtr(TabGameOptionsLoadSlotField); - fld5P = (FieldType *)GetObjectPtr(TabGameOptionsStartRoomField); - fld6P = (FieldType *)GetObjectPtr(TabGameOptionsTalkSpeedField); - - cck1P = (ControlType *)GetObjectPtr(TabGameOptionsLoadSlotCheckbox); - cck2P = (ControlType *)GetObjectPtr(TabGameOptionsStartRoomCheckbox); - cck3P = (ControlType *)GetObjectPtr(TabGameOptionsAmigaCheckbox); - cck4P = (ControlType *)GetObjectPtr(TabGameOptionsSubtitlesCheckbox); - cck5P = (ControlType *)GetObjectPtr(TabGameOptionsTalkSpeedCheckbox); - - if (!gameInfoP) { - if (FldGetTextLength(fld5P) == 0 && CtlGetValue(cck2P) == 1) { - FrmCustomAlert(FrmWarnAlert,"You must specify a room number.",0,0); - TabSetActive(frmP, myTabP, 2); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameOptionsStartRoomField)); - return errBadParam; - - } else if (FldGetTextLength(fld6P) == 0 && CtlGetValue(cck5P) == 1) { - FrmCustomAlert(FrmWarnAlert,"You must specify a talk speed.",0,0); - TabSetActive(frmP, myTabP, 2); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameOptionsTalkSpeedField)); - return errBadParam; - } - } else { - gameInfoP->language = LstGetSelection(list2P); - gameInfoP->platform = LstGetSelection(list3P); - - gameInfoP->autoLoad = CtlGetValue(cck1P); - gameInfoP->bootParam = CtlGetValue(cck2P); - gameInfoP->setPlatform = CtlGetValue(cck3P); - gameInfoP->subtitles = (CtlGetValue(cck4P)); - gameInfoP->talkSpeed = CtlGetValue(cck5P); - - gameInfoP->loadSlot = StrAToI(FldGetTextPtr(fld4P)); - gameInfoP->bootValue = StrAToI(FldGetTextPtr(fld5P)); - gameInfoP->talkValue = StrAToI(FldGetTextPtr(fld6P)); - } - - return errNone; -} - -static void GameManInit(UInt16 index) { - TabType *tabP; - FormType *frmP = FrmGetActiveForm(); - UInt16 active = lastTab; - - tabP = TabNewTabs(3); - TabAddContent(&frmP, tabP, "Game", TabGameInfoForm); - TabAddContent(&frmP, tabP, "Display", TabGameDisplayForm); - TabAddContent(&frmP, tabP, "Options", TabGameOptionsForm); - - UInt16 refNum; - if (SysLibFind(kFileBrowserLibName, &refNum)) - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabGameInfoBrowsePushButton)); - - if (index != dmMaxRecordIndex) { - MemHandle recordH = NULL; - GameInfoType *gameInfoP; - - recordH = DmQueryRecord(gameDB, index); - gameInfoP = (GameInfoType *)MemHandleLock(recordH); - - GameTabInit(gameInfoP); - DisplayInit(gameInfoP); - OptionsInit(gameInfoP); - - MemHandleUnlock(recordH); - CtlSetUsable((ControlType *)GetObjectPtr(GameEditDeleteButton),true); - } else { - active = 0; // new game ? start with first tab - GameTabInit(0); - DisplayInit(0); - OptionsInit(0); - CtlSetUsable((ControlType *)GetObjectPtr(GameEditDeleteButton),false); - } - - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabGameInfoEntryNameField)); - FrmDrawForm(frmP); - TabSetActive(frmP, tabP, active); - - myTabP = tabP; -} - -static void GameManSave(UInt16 index) { - MemHandle recordH; - GameInfoType *gameInfoP, newGameInfo; - - if (GameTabSave(0) == errBadParam) return; - if (DisplaySave(0) == errBadParam) return; - if (OptionsSave(0) == errBadParam) return; - - if (index != dmMaxRecordIndex) { - recordH = DmGetRecord(gameDB, index); - gameInfoP = (GameInfoType *)MemHandleLock(recordH); - MemMove(&newGameInfo, gameInfoP, sizeof(GameInfoType)); - - } else { - index = dmMaxRecordIndex; - GamUnselect(); - recordH = DmNewRecord(gameDB, &index, sizeof(GameInfoType)); - gameInfoP = (GameInfoType *)MemHandleLock(recordH); - - MemSet(&newGameInfo, sizeof(GameInfoType), 0); - newGameInfo.version = curItemVersion; - newGameInfo.icnID = 0xFFFF; - newGameInfo.selected = true; - - // default sound data - newGameInfo.musicInfo.volume.palm = 50; - newGameInfo.musicInfo.volume.music = 192; - newGameInfo.musicInfo.volume.sfx = 192; - newGameInfo.musicInfo.volume.speech = 192; - newGameInfo.musicInfo.volume.audiocd = 50; - - newGameInfo.musicInfo.sound.tempo = 100; - newGameInfo.musicInfo.sound.defaultTrackLength = 10; - newGameInfo.musicInfo.sound.firstTrack = 1; - } - - GameTabSave(&newGameInfo); - DisplaySave(&newGameInfo); - OptionsSave(&newGameInfo); - - DmWrite(gameInfoP, 0, &newGameInfo, sizeof(GameInfoType)); - - MemHandleUnlock(recordH); - DmReleaseRecord (gameDB, index, 0); - GamSortList(); - // update list position - { - RectangleType rArea; - UInt16 posIndex, maxView; - - // get the sorted index - index = GamGetSelected(); - // if new item is out of the list bounds, change current list pos - SknGetListBounds(&rArea, NULL); - maxView = rArea.extent.y / sknInfoListItemSize; - posIndex = gPrefs->listPosition; - - // if out of the current list position - if (!(index >= posIndex && index < (posIndex + maxView))) - gPrefs->listPosition = index; // this value is corrected in SknUpdateList if needed - } - - TabDeleteTabs(myTabP); - FrmReturnToMain(); - SknUpdateList(); -} - -/*********************************************************************** - * - * FUNCTION: EditGameFormSave - * FUNCTION: EditGameFormInit - * FUNCTION: EditGameFormHandleEvent - * - * DESCRIPTION: - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -void EditGameFormDelete(Boolean direct) { - UInt16 index = GamGetSelected(); - - if (index == dmMaxRecordIndex) { - FrmCustomAlert(FrmWarnAlert, "Select an entry first.",0,0); - return; - - } else if (FrmCustomAlert(FrmConfirmAlert, "Do you really want to delete this entry ?", 0, 0) == FrmConfirmYes) { - DmRemoveRecord(gameDB, index); - if (!direct) { - TabDeleteTabs(myTabP); - FrmReturnToMain(); - } - GamSortList(); - SknUpdateList(); - } -} - -static void EditGameCancel() { - if (itemsText) { - MemPtrFree(itemsText); - itemsText = NULL; - } - TabDeleteTabs(myTabP); - FrmReturnToMain(); -} - -static void EditGameBowser() { - UInt16 refNum; - Err e; - - ControlPtr butP = (ControlType *)GetObjectPtr(TabGameInfoBrowsePushButton); - CtlSetValue(butP, 0); - - e = SysLibFind (kFileBrowserLibName, &refNum); - if (!e) { - e = FileBrowserLibOpen (refNum); - if (!e) { - UInt16 volRefNum = gPrefs->card.volRefNum; - Char *textP, *pathP = (Char *)MemPtrNew(kFileBrowserLibPathBufferSize); - pathP[0] = chrNull; - - if (FileBrowserLibShowOpenDialog(refNum, &volRefNum, pathP, 0, 0, 0, "Game Data Path", kFileBrowserLibFlagNoFiles)) { - FieldPtr fldP; - MemHandle textH; - Int16 offset, copySize, maxSize; - - fldP = (FieldType *)GetObjectPtr(TabGameInfoPathField); - maxSize = FldGetMaxChars(fldP); - textH = FldGetTextHandle(fldP); - - FldSetTextHandle(fldP, NULL); - textP = (Char *)MemHandleLock(textH); - offset = 0; - copySize = StrLen(pathP); - - if (StrNCaselessCompare(pathP, "/Palm/Programs/ScummVM/Games/", 29) == 0) { - if (StrLen(pathP) == 29) { - copySize = 1; - pathP[0] = '.'; - } else { - copySize -= 29; - offset = 29; - } - } - - if (copySize > maxSize) - copySize = maxSize; - StrNCopy(textP, pathP + offset, copySize); - - MemHandleUnlock(textH); - FldSetTextHandle(fldP, textH); - FldDrawField(fldP); - FldGrabFocus(fldP); - } - - MemPtrFree(pathP); - FileBrowserLibClose(refNum); - } - } -} - -Boolean EditGameFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmCloseEvent: - EditGameCancel(); - handled = true; - break; - - case frmOpenEvent: - switch (gFormEditMode) { - case edtModeAdd: - GameManInit(dmMaxRecordIndex); - break; - case edtModeEdit: - case edtModeParams: - default : - GameManInit(GamGetSelected()); - break; - } - handled = true; - break; - - case keyDownEvent: - switch (eventP->data.keyDown.chr) { - case chrLineFeed: - case chrCarriageReturn: - return true; - } - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case (GameEditForm + 1) : - case (GameEditForm + 2) : - case (GameEditForm + 3) : - lastTab = (eventP->data.ctlSelect.controlID - GameEditForm - 1); - TabSetActive(frmP, myTabP, lastTab); - break; - - case GameEditOKButton: - switch (gFormEditMode) { - case edtModeAdd: - GameManSave(dmMaxRecordIndex); - break; - case edtModeEdit: - case edtModeParams: - default : - GameManSave(GamGetSelected()); - break; - } - break; - - case GameEditCancelButton: - EditGameCancel(); - break; - - case GameEditDeleteButton: - EditGameFormDelete(false); - break; - - case TabGameInfoBrowsePushButton: - EditGameBowser(); - break; - - case TabGameInfoEnginePopTrigger: - FrmList(eventP, TabGameInfoEngineList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabGameInfoEngineList)); - break; - - case TabGameDisplayGfxPopupPopTrigger: - FrmList(eventP, TabGameDisplayGfxListList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabGameDisplayGfxListList)); - break; - - case TabGameDisplayRenderPopTrigger: - FrmList(eventP, TabGameDisplayRenderList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabGameDisplayRenderList)); - break; - - case TabGameOptionsLanguagePopTrigger: - FrmList(eventP, TabGameOptionsLanguageList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabGameOptionsLanguageList)); - break; - - case TabGameOptionsPlatformPopTrigger: - FrmList(eventP, TabGameOptionsPlatformList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabGameOptionsPlatformList)); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formEditGame.h b/backends/platform/PalmOS/Src/launcher/forms/formEditGame.h deleted file mode 100644 index 90d271e115..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formEditGame.h +++ /dev/null @@ -1,39 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __FORMEDITGAME_H__ -#define __FORMEDITGAME_H__ - -// edit game mode -enum { - edtModeAdd, - edtModeEdit, - edtModeParams -}; - -extern UInt8 gFormEditMode; -void EditGameFormDelete(Boolean direct); - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/forms/formMisc.cpp b/backends/platform/PalmOS/Src/launcher/forms/formMisc.cpp deleted file mode 100644 index 35b44486e9..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formMisc.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -#include "start.h" -#include "formTabs.h" -#include "forms.h" -#include "globals.h" - -static TabType *myTabP; -static UInt16 lastTab = 0; - -static Boolean ScummVMTabSave() { - FieldType *fld1P, *fld2P; - ControlType *cckP[11]; - FormPtr frmP; - - fld1P = (FieldType *)GetObjectPtr(TabMiscScummVMDebugLevelField); - fld2P = (FieldType *)GetObjectPtr(TabMiscScummVMAutosaveField); - - cckP[0] = (ControlType *)GetObjectPtr(TabMiscScummVMAutosaveCheckbox); - cckP[3] = (ControlType *)GetObjectPtr(TabMiscScummVMDebugCheckbox); - cckP[6] = (ControlType *)GetObjectPtr(TabMiscScummVMDemoCheckbox); - cckP[9] = (ControlType *)GetObjectPtr(TabMiscScummVMCopyProtectionCheckbox); - cckP[10]= (ControlType *)GetObjectPtr(TabMiscScummVMAltIntroCheckbox); - - frmP = FrmGetActiveForm(); - if (FldGetTextLength(fld1P) == 0 && CtlGetValue(cckP[3]) == 1) { - TabSetActive(frmP, myTabP, 1); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabMiscScummVMDebugLevelField)); - FrmCustomAlert(FrmWarnAlert,"You must specify a debug level.",0,0); - return false; - - } else if (FldGetTextLength(fld2P) == 0 && CtlGetValue(cckP[0]) == 1) { - TabSetActive(frmP, myTabP, 1); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabMiscScummVMAutosaveField)); - FrmCustomAlert(FrmWarnAlert,"You must specify a period.",0,0); - return false; - } - - gPrefs->autoSave = CtlGetValue(cckP[0]); - gPrefs->debug = CtlGetValue(cckP[3]); - gPrefs->demoMode = CtlGetValue(cckP[6]); - gPrefs->copyProtection = CtlGetValue(cckP[9]); - gPrefs->altIntro = CtlGetValue(cckP[10]); - - gPrefs->debugLevel = StrAToI(FldGetTextPtr(fld1P)); - gPrefs->autoSavePeriod = StrAToI(FldGetTextPtr(fld2P)); - - return true; -} - -static void PalmOSTabSave() { - ControlType *cckP[11]; - - if (OPTIONS_TST(kOptDeviceARM) && !OPTIONS_TST(kOptDeviceZodiac)) { - cckP[3]= (ControlType *)GetObjectPtr(TabMiscPalmOSAdvancedCheckbox); - gPrefs->advancedMode = CtlGetValue(cckP[3]); - } - - if (!OPTIONS_TST(kOptDeviceARM)) { - cckP[2] = (ControlType *)GetObjectPtr(TabMiscPalmOSStdPaletteCheckbox); - gPrefs->stdPalette = CtlGetValue(cckP[2]); - } - - cckP[0] = (ControlType *)GetObjectPtr(TabMiscPalmOSVibratorCheckbox); - cckP[1] = (ControlType *)GetObjectPtr(TabMiscPalmOSNoAutoOffCheckbox); - cckP[4] = (ControlType *)GetObjectPtr(TabMiscPalmOSLargerStackCheckbox); - cckP[5] = (ControlType *)GetObjectPtr(TabMiscPalmOSExitLauncherCheckbox); - cckP[6] = (ControlType *)GetObjectPtr(TabMiscPalmOSStylusClickCheckbox); - cckP[7] = (ControlType *)GetObjectPtr(TabMiscPalmOSArrowCheckbox); - - gPrefs->vibrator = CtlGetValue(cckP[0]); - gPrefs->autoOff = !CtlGetValue(cckP[1]); - gPrefs->setStack = CtlGetValue(cckP[4]); - gPrefs->exitLauncher = CtlGetValue(cckP[5]); - gPrefs->stylusClick = !CtlGetValue(cckP[6]); - gPrefs->arrowKeys = CtlGetValue(cckP[7]); -} - -static void ExtsTabSave() { - ControlType *cckP[2]; - - if (OPTIONS_TST(kOptLightspeedAPI)) { - ListType *list1P = (ListType *)GetObjectPtr(TabMiscExtsLightspeedList); - cckP[0] = (ControlType *)GetObjectPtr(TabMiscExtsLightspeedCheckbox); - - gPrefs->lightspeed.enable = CtlGetValue(cckP[0]); - gPrefs->lightspeed.mode = LstGetSelection(list1P); - } - if (OPTIONS_TST(kOptGoLcdAPI)) { - cckP[1] = (ControlType *)GetObjectPtr(TabMiscExtsGolcdCheckbox); - gPrefs->goLCD = CtlGetValue(cckP[1]); - } -} - -static void ScummVMTabInit() { - FieldType *fld1P, *fld2P; - Char *levelP, *periodP; - MemHandle levelH, periodH; - - CtlSetValue((ControlType *)GetObjectPtr(TabMiscScummVMAutosaveCheckbox), gPrefs->autoSave); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscScummVMDebugCheckbox), gPrefs->debug); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscScummVMDemoCheckbox), gPrefs->demoMode); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscScummVMCopyProtectionCheckbox), gPrefs->copyProtection); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscScummVMAltIntroCheckbox), gPrefs->altIntro); - - fld1P = (FieldType *)GetObjectPtr(TabMiscScummVMDebugLevelField); - fld2P = (FieldType *)GetObjectPtr(TabMiscScummVMAutosaveField); - - levelH = MemHandleNew(FldGetMaxChars(fld1P)+1); - levelP = (Char *)MemHandleLock(levelH); - StrIToA(levelP, gPrefs->debugLevel); - MemHandleUnlock(levelH); - - periodH = MemHandleNew(FldGetMaxChars(fld2P)+1); - periodP = (Char *)MemHandleLock(periodH); - StrIToA(periodP, gPrefs->autoSavePeriod); - MemHandleUnlock(periodH); - - FldSetTextHandle(fld1P, levelH); - FldSetTextHandle(fld2P, periodH); -} - -static void PalmOSTabInit() { - if (OPTIONS_TST(kOptDeviceARM) && !OPTIONS_TST(kOptDeviceZodiac)) - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSAdvancedCheckbox), gPrefs->advancedMode); - - if (!OPTIONS_TST(kOptDeviceARM)) - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSStdPaletteCheckbox), gPrefs->stdPalette); - - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSExitLauncherCheckbox), gPrefs->exitLauncher); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSLargerStackCheckbox), gPrefs->setStack); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSVibratorCheckbox), gPrefs->vibrator); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSNoAutoOffCheckbox), !gPrefs->autoOff); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSStylusClickCheckbox), !gPrefs->stylusClick); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscPalmOSArrowCheckbox), gPrefs->arrowKeys); -} - -static void ExtsTabInit() { - if (OPTIONS_TST(kOptLightspeedAPI)) { - ListType *list1P = (ListType *)GetObjectPtr(TabMiscExtsLightspeedList); - LstSetSelection(list1P, gPrefs->lightspeed.mode); - CtlSetLabel((ControlType *)GetObjectPtr(TabMiscExtsLightspeedPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - CtlSetValue((ControlType *)GetObjectPtr(TabMiscExtsLightspeedCheckbox), gPrefs->lightspeed.enable); - } - - if (OPTIONS_TST(kOptGoLcdAPI)) - CtlSetValue((ControlType *)GetObjectPtr(TabMiscExtsGolcdCheckbox), gPrefs->goLCD); -} - -static void MiscFormSave() { - if (!ScummVMTabSave()) return; - PalmOSTabSave(); - ExtsTabSave(); - - TabDeleteTabs(myTabP); - FrmReturnToMain(); -} - -static void MiscFormInit() { - TabType *tabP; - FormType *frmP = FrmGetActiveForm(); - UInt8 extsCnt = 2; - - tabP = TabNewTabs(3); - TabAddContent(&frmP, tabP, "PalmOS", TabMiscPalmOSForm); - TabAddContent(&frmP, tabP, "ScummVM", TabMiscScummVMForm); - TabAddContent(&frmP, tabP, "More ...", TabMiscExtsForm); - - if (OPTIONS_TST(kOptDeviceARM)) { - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscPalmOSStdPaletteCheckbox)); - TabMoveUpObject(frmP, TabMiscPalmOSAdvancedCheckbox, 12); - } - - if (!OPTIONS_TST(kOptDeviceARM) || OPTIONS_TST(kOptDeviceZodiac)) - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscPalmOSAdvancedCheckbox)); - - if (!OPTIONS_TST(kOptGoLcdAPI)) { - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscExtsGolcdCheckbox)); - // move lightspeed - TabMoveUpObject(frmP, TabMiscExtsLightspeedCheckbox, 12); - TabMoveUpObject(frmP, TabMiscExtsLightspeedPopTrigger, 12); - TabMoveUpObject(frmP, TabMiscExtsLightspeedList, 12); - TabMoveUpObject(frmP, TabMiscExtsNothingLabel, 12); - extsCnt--; - } - - if (!OPTIONS_TST(kOptLightspeedAPI)) { - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscExtsLightspeedCheckbox)); -// FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscExtsLightspeedList)); // cannot remove this ? - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscExtsLightspeedPopTrigger)); - TabMoveUpObject(frmP, TabMiscExtsNothingLabel, 12); - extsCnt--; - } - - if (extsCnt) - FrmRemoveObject(&frmP, FrmGetObjectIndex(frmP, TabMiscExtsNothingLabel)); - - PalmOSTabInit(); - ScummVMTabInit(); - ExtsTabInit(); - - FrmDrawForm(frmP); - TabSetActive(frmP, tabP, lastTab); - - myTabP = tabP; -} - -Boolean MiscFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - MiscFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case (MiscForm + 1) : - case (MiscForm + 2) : - case (MiscForm + 3) : - lastTab = (eventP->data.ctlSelect.controlID - MiscForm - 1); - TabSetActive(frmP, myTabP, lastTab); - break; - - case TabMiscExtsLightspeedPopTrigger: - FrmList(eventP, TabMiscExtsLightspeedList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabMiscExtsLightspeedList)); - break; - - case MiscOKButton: - MiscFormSave(); - break; - - case MiscCancelButton: - TabDeleteTabs(myTabP); - FrmReturnToMain(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp b/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp deleted file mode 100644 index bb0ac894c2..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include "StarterRsc.h" -#include "formUtil.h" -#include "games.h" -#include "start.h" - -#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0]))) - -static Char **items = NULL; -Int16 selectedEngine = -1; - -// Supported games -static const char *engine_agos[] = { - "Demon in my Pocket", - "Elvira - Mistress of the Dark", - "Elvira II - The Jaws of Cerberus", - "Jumble", - "NoPatience", - "Simon the Sorcerer I", - "Simon the Sorcerer II", - "Swampy Adventures", - "The Feeble Files", - "Waxworks" -}; - -static const char *engine_sky[] = { - "Floppy, CD and Demo" -}; - -static const char *engine_sword1[] = { - "The Shadow of the Templars (PC/Mac)", - "The Shadow of the Templars (Demo)" -}; - -static const char *engine_sword2[] = { - "The Smoking Mirror", - "The Smoking Mirror (Demo)" -}; - -static const char *engine_cine[] = { - "Future Wars", - "Operation Stealth" -}; - -static const char *engine_queen[] = { - "Flight of the Amazon Queen" -}; - -static const char *engine_lure[] = { - "Lure of the Tempress" -}; - -static const char *engine_gob[] = { - "Bargon Attack", - "Gobliiins", - "Gobliins 2", - "Goblins Quest 3", - "The Bizarre Adventures of Woodruff and the Schnibble", - "Ween: The Prophecy", -}; - -static const char *engine_kyra[] = { - "The Legend of Kyrandia", - "The Legend of Kyrandia: The Hand of Fate", - "The Legend of Kyrandia: Malcolm's Revenge" -}; - -static const char *engine_parallaction[] = { - "Nippon Safes Inc." -}; - -static const char *engine_saga[] = { - "I Have No Mouth And I Must Scream", - "Inherit the earth" -}; - -static const char *engine_scumm[] = { - "Day of the Tentacle", - "Indiana Jones and the Fate of Atlantis", - "Indiana Jones and the Last Crusade", - "Loom", - "Maniac Mansion", - "Monkey Island 2: LeChuck's Revenge", - "Passport to Adventure", - "Sam & Max Hit the Road", - "The Secret of Monkey Island" - "Zak McKracken and the Alien Mindbenders" -}; - -static const char *engine_agi[] = { - "AGI Tetris", - "Caitlyn's Destiny", - "Donald Duck's Playground", - "Fanmade AGI game", - "Gold Rush!", - "King's Quest I: Quest for the Crown", - "King's Quest II: Romancing the Throne", - "King's Quest III: To Heir Is Human", - "King's Quest IV: The Perils of Rosella", - "Leisure Suit Larry in the Land of the Lounge Lizards", - "Mixed-Up Mother Goose", - "Manhunter 1: New York", - "Manhunter 2: San Francisco", - "Police Quest I: In Pursuit of the Death Angel", - "Serguei's Destiny 1", - "Serguei's Destiny 2", - "Space Quest 0: Replicated", - "Space Quest I: The Sarien Encounter", - "Space Quest II: Vohaul's Revenge", - "Space Quest X: The Lost Chapter", - "The Black Cauldron", - "Xmas Card" -}; - -static const char *engine_touche[] = { - "Touche: The Adventures of the Fifth Musketeer" -}; - -static const char *engine_cruise[] = { - "Cruise for a Corpse" -}; - -static const struct { - int size; - const char **listP; -} supported[] = { - { ARRAYSIZE(engine_agos), engine_agos }, - { ARRAYSIZE(engine_sky), engine_sky }, - { ARRAYSIZE(engine_sword1), engine_sword1 }, - { ARRAYSIZE(engine_sword2), engine_sword2 }, - { ARRAYSIZE(engine_cine), engine_cine }, - { ARRAYSIZE(engine_queen), engine_queen }, - { ARRAYSIZE(engine_lure), engine_lure }, - { ARRAYSIZE(engine_gob), engine_gob }, - { ARRAYSIZE(engine_kyra), engine_kyra }, - { ARRAYSIZE(engine_parallaction), engine_parallaction }, - { ARRAYSIZE(engine_saga), engine_saga }, - { ARRAYSIZE(engine_scumm), engine_scumm }, - { ARRAYSIZE(engine_agi), engine_agi }, - { ARRAYSIZE(engine_touche), engine_touche }, - { ARRAYSIZE(engine_cruise), engine_cruise } -}; - -static void SelectorSetList(Int16 sel) { - ListType *listP; - FormPtr frmP = FrmGetActiveForm(); - - Boolean toBeDrawn = (items != NULL); - if (items) - MemPtrFree(items); - - listP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, EngineSupportedList)); - items = (Char **)MemPtrNew(supported[sel].size * sizeof(Char *)); - - for (int i = 0; i < supported[sel].size; i++) - items[i] = (Char *)supported[sel].listP[i]; - - LstSetListChoices (listP, items, supported[sel].size); - LstSetTopItem(listP, 0); - LstSetSelection(listP, -1); - - if (toBeDrawn) { - WinScreenLock(winLockCopy); - LstDrawList(listP); - WinScreenUnlock(); - } -} - -static void SelectorFormInit() { - ListType *listP; - FormPtr frmP = FrmGetActiveForm(); - - listP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, EngineListList)); - itemsText = (Char **)MemPtrNew(ENGINE_COUNT * sizeof(Char *)); - - for (int i = 0; i < ENGINE_COUNT; i++) - itemsText[i] = (Char *)engines[i].nameP; - - LstSetListChoices (listP, itemsText, ENGINE_COUNT); - LstSetSelection(listP, 0); - - SelectorSetList(0); - - FrmDrawForm(frmP); -} - -static void SelectorFormFree(bool quit) { - items = NULL; - - if (!quit) { - ListType *listP = (ListType *)GetObjectPtr(EngineListList); - Int16 sel = LstGetSelection(listP); - - FrmReturnToMain(); - StartScummVM(sel); - - } else { - FrmReturnToMain(); - - if (bDirectMode) { - // force exit if nothing selected - EventType event; - event.eType = keyDownEvent; - event.data.keyDown.chr = vchrLaunch; - event.data.keyDown.modifiers = commandKeyMask; - EvtAddUniqueEventToQueue(&event, 0, true); - } - } -} - -Boolean SelectorFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - SelectorFormInit(); - handled = true; - break; - - case frmCloseEvent: - SelectorFormFree(true); - handled = true; - break; - - case lstSelectEvent: - if (eventP->data.lstSelect.listID == EngineSupportedList) - LstSetSelection(eventP->data.lstSelect.pList, -1); - else - SelectorSetList(eventP->data.lstSelect.selection); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case EngineOkButton: - SelectorFormFree(false); - break; - - case EngineCancelButton: - SelectorFormFree(true); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp b/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp deleted file mode 100644 index 9566a25311..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include - -#include "palmdefs.h" -#include "start.h" -#include "forms.h" -#include "skin.h" -#include "globals.h" - -static Int16 SkinsFormCompare(SkinInfoType *a, SkinInfoType *b, SortRecordInfoPtr, SortRecordInfoPtr, MemHandle) { - return StrCompare(a->nameP, b->nameP); -} - -static void SkinsFormInit(Boolean bDraw) { - MemHandle skins = NULL; - SkinInfoType *skinsInfo; - UInt16 numSkins = 0; - - FormPtr frmP; - ListType *listP; - MemHandle items = NULL; - ControlType *cck1P; - DmSearchStateType stateInfo; - UInt16 cardNo; - LocalID dbID; - - Err errInfo; - Char nameP[32]; - - itemsText = NULL; - - // parse and save skins - Err err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); - while (!err && dbID) { - errInfo = DmDatabaseInfo (cardNo, dbID, nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - if (!errInfo) - { - if (!skins) - skins = MemHandleNew(sizeof(SkinInfoType)); - else - MemHandleResize(skins, MemHandleSize(skins) + sizeof(SkinInfoType)); - - skinsInfo = (SkinInfoType *)MemHandleLock(skins); - StrCopy(skinsInfo[numSkins].nameP, nameP); - skinsInfo[numSkins].cardNo = cardNo; - skinsInfo[numSkins].dbID = dbID; - MemHandleUnlock(skins); - numSkins++; - } - err = DmGetNextDatabaseByTypeCreator(false, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); - } - - Int16 selected = -1; - - cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); - CtlSetValue(cck1P, gPrefs->soundClick); - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - skinsInfo = (SkinInfoType *)MemHandleLock(skins); - SysQSort(skinsInfo, numSkins, sizeof(SkinInfoType), (CmpFuncPtr)SkinsFormCompare, 0); - - // create itemsText (TODO: create a custom draw function) - for (UInt16 index=0; index < numSkins; index++) - { - if (!items) - items = MemHandleNew(sizeof(Char *)); - else - MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); - - itemsText = (Char **)MemHandleLock(items); - itemsText[index] = skinsInfo[index].nameP; - MemHandleUnlock(items); - - if ( gPrefs->skin.cardNo == skinsInfo[index].cardNo && - gPrefs->skin.dbID == skinsInfo[index].dbID && - StrCompare(gPrefs->skin.nameP, skinsInfo[index].nameP) == 0) - selected = index; - } - // save globals and set list - itemsText = (Char **)MemHandleLock(items); - itemsList = (void *)skinsInfo; - itemsType = ITEM_TYPE_SKIN; - - LstSetListChoices (listP, itemsText, numSkins); - LstSetSelection(listP, selected); - - // bDraw = true -> draw whole from - // bDraw = false -> redraw list - if (bDraw) { - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); - } else { - WinScreenLock(winLockCopy); - LstDrawList(listP); - WinScreenUnlock(); -// LstSetSelection(listP, 0); - } -} - -static void SkinsFormExit(Boolean bSave) { - MemHandle skins; - MemHandle items; - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (bSave && selected == -1) { // may never occurred... - FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - skins = MemPtrRecoverHandle(skinsInfo); - items = MemPtrRecoverHandle(itemsText); - - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_UNKNOWN; - - if (bSave) { - ControlType *cck1P; - - StrCopy(gPrefs->skin.nameP, skinsInfo[selected].nameP); - gPrefs->skin.cardNo = skinsInfo[selected].cardNo; - gPrefs->skin.dbID = skinsInfo[selected].dbID; - -/* DmOpenRef skinDB = SknOpenSkin(); - UInt32 depth = SknGetDepth(skinDB); - SknCloseSkin(skinDB); - - if (depth != 8 && depth != 16) depth = 8; - - if (depth == 16 && !OPTIONS_TST(kOptMode16Bit)) { - FrmCustomAlert(FrmInfoAlert, "You can only use 8bit skin on your device.", 0, 0); - gPrefs->skin.cardNo = cardNo; - gPrefs->skin.dbID = dbID; - } -*/ - cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); - gPrefs->soundClick = CtlGetValue(cck1P); - } - - FrmReturnToMain(); - - MemHandleUnlock(items); - MemHandleUnlock(skins); - MemHandleFree(items); - MemHandleFree(skins); - - if (bSave) - SknApplySkin(); -} - -static void SkinsFormBeam() { - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - Err err; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (selected == -1) { // may never occurred... - FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - err = SendDatabase(0, skinsInfo[selected].dbID, "skin.pdb", "\nScummVM Skin"); - -// if (err) -// FrmCustomAlert(FrmErrorAlert, "Unable to beam this skin.",0,0); -} - -static void SkinsFormDelete() { - MemHandle skins; - MemHandle items; - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (selected == -1) { // may never occurred... - FrmCustomAlert(FrmInfoAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - skins = MemPtrRecoverHandle(skinsInfo); - items = MemPtrRecoverHandle(itemsText); - - if ( gPrefs->skin.cardNo == skinsInfo[selected].cardNo && - gPrefs->skin.dbID == skinsInfo[selected].dbID && - StrCompare(gPrefs->skin.nameP, skinsInfo[selected].nameP) == 0) { - FrmCustomAlert(FrmInfoAlert, "You cannot delete the active skin.",0,0); - return; - - } else { - Err err = DmDeleteDatabase(0, skinsInfo[selected].dbID); - if (!err) { - - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_UNKNOWN; - - MemHandleUnlock(items); - MemHandleUnlock(skins); - MemHandleFree(items); - MemHandleFree(skins); - - SkinsFormInit(false); - } else { - FrmCustomAlert(FrmErrorAlert, "Skin deletion failed.",0,0); - } - } - -} -Boolean SkinsFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - - case frmOpenEvent: - SkinsFormInit(true); - handled = true; - break; - - case frmCloseEvent: - SkinsFormExit(false); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case SkinsOKButton: - SkinsFormExit(true); - break; - - case SkinsCancelButton: - SkinsFormExit(false); - break; - - case SkinsBeamButton: - SkinsFormBeam(); - break; - - case SkinsDeleteButton: - SkinsFormDelete(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formUtil.cpp b/backends/platform/PalmOS/Src/launcher/forms/formUtil.cpp deleted file mode 100644 index 6d1d55e6e2..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formUtil.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include - -#include "forms.h" - -Char **itemsText = NULL; -void *itemsList = NULL; -Char itemsType = ITEM_TYPE_UNKNOWN; - -void FrmReturnToMain(UInt16 updateCode) { - // if there is a form loaded, prevent crash on OS5 - if (FrmGetFirstForm()) { - FrmUpdateForm(MainForm, updateCode); - FrmReturnToForm(MainForm); - } -} - -void FldTrimText(FieldPtr fldP) { - MemHandle tmpH; - Char *tmpP; - - tmpH = FldGetTextHandle(fldP); - FldSetTextHandle(fldP, NULL); - tmpP = (Char *)MemHandleLock(tmpH); - TxtGlueStripSpaces(tmpP, true, true); - MemHandleUnlock(tmpH); - FldSetTextHandle(fldP, tmpH); -} - -/*********************************************************************** - * - * FUNCTION: GetObjectPtr - * - * DESCRIPTION: This routine returns a pointer to an object in the current - * form. - * - * PARAMETERS: formId - id of the form to display - * - * RETURNED: void * - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -void * GetObjectPtr(UInt16 objectID) { - FormPtr frmP; - - frmP = FrmGetActiveForm(); - return FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, objectID)); -} - -void FrmList(EventPtr eventP, UInt16 objectID) { - ListType *listP; - UInt16 listItem; - - listP = (ListType *)GetObjectPtr(objectID); - listItem = LstPopupList(listP); - CtlSetLabel(eventP->data.ctlSelect.pControl, LstGetSelectionText(listP, LstGetSelection(listP))); -} - diff --git a/backends/platform/PalmOS/Src/launcher/forms/formUtil.h b/backends/platform/PalmOS/Src/launcher/forms/formUtil.h deleted file mode 100644 index e9b87bc49f..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formUtil.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __FORMUTIL_H__ -#define __FORMUTIL_H__ - -#define frmRedrawUpdateMS (frmRedrawUpdateCode + 1) -#define frmRedrawUpdateMSImport (frmRedrawUpdateCode + 2) - -#define NO_ENGINE -1 - -// form list draw -#define ITEM_TYPE_UNKNOWN 'U' -#define ITEM_TYPE_CARD 'C' -#define ITEM_TYPE_SKIN 'S' - -extern Char **itemsText; -extern void *itemsList; -extern Char itemsType; - -void FrmReturnToMain(UInt16 updateCode = frmRedrawUpdateMS); -void * GetObjectPtr(UInt16 objectID); -void FldTrimText(FieldPtr fldP); -void FrmList(EventPtr eventP, UInt16 objectID); - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/forms/forminfo.cpp b/backends/platform/PalmOS/Src/launcher/forms/forminfo.cpp deleted file mode 100644 index 3f4ab1b28f..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/forminfo.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include - -#include "start.h" -#include "formTabs.h" -#include "forms.h" - -#include "base/version.h" -#include "globals.h" -#include "init_palmos.h" - -/*********************************************************************** - * - * FUNCTION: MiscOptionsFormSave - * FUNCTION: MiscOptionsFormInit - * FUNCTION: MiscOptionsFormHandleEvent - * - * DESCRIPTION: Misc. Options form functions - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static TabType *myTabP; -static UInt16 lastTab = 0; - -static UInt32 GetStackSize() { - MemPtr startPP, endPP; - SysGetStackInfo(&startPP, &endPP); - - return ((Char *)endPP - (Char *)startPP) / 1024L; -} - -static void VersionTabDraw() { - WinDrawChars(gScummVMVersion, StrLen(gScummVMVersion), 47, 12 + 30); - WinDrawChars(gScummVMBuildDate, StrLen(gScummVMBuildDate), 47, 24 + 30); -} - -static void SystemTabDraw() { - Coord x; - UInt32 dm, sm, df, sf, stack; - Char num[10]; - - PalmGetMemory(&sm, &dm, &sf, 0); - stack = GetStackSize(); - df = gVars->startupMemory; - - WinSetTextColor(UIColorGetTableEntryIndex(UIObjectForeground)); - FntSetFont(stdFont); - - StrIToA(num, dm); - x = 147 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 12 + 30); - - StrIToA(num, sm); - x = 147 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 24 + 30); - - StrIToA(num, stack); - x = 147 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 36 + 30); - - StrIToA(num, df); - x = 107 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 12 + 30); - - StrIToA(num, sf); - x = 107 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 24 + 30); - - StrCopy(num,"-"); - x = 107 - FntCharsWidth(num, StrLen(num)) + 5; - WinDrawChars(num, StrLen(num), x, 36 + 30); -} - -static void InfoFormSave() { - TabDeleteTabs(myTabP); - FrmReturnToMain(); -} - -static void AboutTabDraw() { - MemHandle hTemp; - BitmapPtr bmpTemp; - - hTemp = DmGetResource (bitmapRsc, 1200); - if (hTemp) { - bmpTemp = (BitmapType *)MemHandleLock(hTemp); - WinDrawBitmap(bmpTemp,3,44); - MemPtrUnlock(bmpTemp); - DmReleaseResource(hTemp); - } -} - -static void InfoFormInit() { - TabType *tabP; - FormType *frmP = FrmGetActiveForm(); - - tabP = TabNewTabs(3); - TabAddContent(&frmP, tabP, "About", TabInfoAboutForm, AboutTabDraw); - TabAddContent(&frmP, tabP, "Version", TabInfoVersionForm, VersionTabDraw); - TabAddContent(&frmP, tabP, "Memory", TabInfoSystemForm, SystemTabDraw); - - lastTab = 0; - FrmDrawForm(frmP); - TabSetActive(frmP, tabP, lastTab); - - myTabP = tabP; -} - -Boolean InfoFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - InfoFormInit(); - handled = true; - break; - - case frmCloseEvent: - InfoFormSave(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case (InfoForm + 1) : - case (InfoForm + 2) : - case (InfoForm + 3) : - lastTab = (eventP->data.ctlSelect.controlID - InfoForm - 1); - TabSetActive(frmP, myTabP, lastTab); - break; - - case InfoOKButton: - InfoFormSave(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formmain.cpp b/backends/platform/PalmOS/Src/launcher/forms/formmain.cpp deleted file mode 100644 index ca2e18ee6d..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formmain.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -#include "StarterRsc.h" -#include "start.h" -#include "skin.h" -#include "games.h" -#include "globals.h" - -#include "base/version.h" - -#include "formEditGame.h" -#include "formUtil.h" - -static UInt16 sknLastOn = skinButtonNone; - -static Err BeamMe() { - UInt16 cardNo; - LocalID dbID; - Err err; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (dbID) - err = SendDatabase(0, dbID, "ScummVM.prc", "\nPlay your favorite LucasArts games"); - else - err = DmGetLastErr(); - - return err; -} - -/*********************************************************************** - * - * FUNCTION: MainFormInit - * - * DESCRIPTION: This routine initializes the MainForm form. - * - * PARAMETERS: frm - pointer to the MainForm form. - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void MainFormInit() -{ - SknApplySkin(); -} - -/*********************************************************************** - * - * FUNCTION: MainFormDoCommand - * - * DESCRIPTION: This routine performs the menu command specified. - * - * PARAMETERS: command - menu item id - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static Boolean MainFormDoCommand(UInt16 command) -{ - Boolean handled = false; - - switch (command) { - case MainGamesMemoryCard: - FrmPopupForm(CardSlotForm); - handled = true; - break; - - case MainGamesNew: - gFormEditMode = edtModeAdd; - FrmPopupForm(GameEditForm); - handled = true; - break; - - case MainGamesEdit: - gFormEditMode = edtModeEdit; - FrmPopupForm(GameEditForm); - handled = true; - break; - - case MainGamesDelete: - EditGameFormDelete(true); - handled = true; - break; - - case MainOptionsBeam: - BeamMe(); - //if (BeamMe()) - //FrmCustomAlert(FrmErrorAlert,"Unable to beam ScummVM for PalmOS.",0,0); - handled = true; - break; - - case MainOptionsAbout: - FrmPopupForm(InfoForm); - handled = true; - break; - - case MainGamesMusicSound: - FrmPopupForm(MusicForm); - handled = true; - break; - - case MainOptionsSkins: - FrmPopupForm(SkinsForm); - handled = true; - break; - - case MainOptionsMisc: - FrmPopupForm(MiscForm); - handled = true; - break; - } - - MenuEraseStatus(0); - return handled; -} - -/*********************************************************************** - * - * FUNCTION: MainFormHandleEvent - * - * DESCRIPTION: This routine is the event handler for the - * "MainForm" of this application. - * - * PARAMETERS: eventP - a pointer to an EventType structure - * - * RETURNED: true if the event has handle and should not be passed - * to a higher level handler. - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static Boolean PenDownRepeat() { - Coord x,y; - Boolean penDown, handled = false; - EvtGetPen(&x, &y, &penDown); - - if (penDown && sknLastOn) { - RectangleType r; - DmOpenRef skinDBP; - - skinDBP = SknOpenSkin(); - SknGetObjectBounds(skinDBP, sknLastOn, &r); - - if (RctPtInRectangle(x*2, y*2, &r)) { - if (SknGetState(skinDBP, sknLastOn) != sknStateSelected) { - SknSetState(skinDBP, sknLastOn, sknStateSelected); - SknShowObject(skinDBP, sknLastOn); - } - - switch (sknLastOn) { - case skinSliderUpArrow: - case skinSliderDownArrow: - handled = SknProcessArrowAction(sknLastOn); - break; - } - - } else { - if (SknGetState(skinDBP, sknLastOn) != sknStateNormal) { - SknSetState(skinDBP, sknLastOn, sknStateNormal); - SknShowObject(skinDBP, sknLastOn); - } - } - - SknCloseSkin(skinDBP); - } - - return handled; -} - - -Boolean MainFormHandleEvent(EventPtr eventP) -{ - Boolean handled = false; - FormPtr frmP; - Coord x,y; - DmOpenRef skinDBP; - - switch (eventP->eType) { - case frmUpdateEvent: - { - RectangleType r; - UInt16 idx; - IndexedColorType bgColor = UIColorGetTableEntryIndex(UIFormFill); - frmP = FrmGetFormPtr(MainForm); - - if (gPrefs->card.volRefNum != vfsInvalidVolRef) - idx = FrmGetObjectIndex (frmP, MainMSBitMap); - else - idx = FrmGetObjectIndex (frmP, MainMSNoneBitMap); - - WinSetDrawMode(winPaint); - WinSetBackColor(bgColor); - FrmGetObjectBounds(frmP, idx, &r); - WinEraseRectangle(&r, 0); - FrmShowObject(frmP, idx); - - if (eventP->data.frmUpdate.updateCode == frmRedrawUpdateMSImport) { - GamImportDatabase(); - SknUpdateList(); - } - handled = true; - break; - } - case menuEvent: - handled = MainFormDoCommand(eventP->data.menu.itemID); - break; - - case frmOpenEvent: - MainFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case MainCardsButton: - //gPrefs->card.volRefNum = parseCards(true); - FrmPopupForm(CardSlotForm); - break; - - case MainAboutButton: - FrmPopupForm(InfoForm); - break; - -// case MainListTypeSelTrigger: -// FrmList(eventP, MainListTypeList); -// break; - } - handled = true; - break; - - case penUpEvent: - x = eventP->screenX; - y = eventP->screenY; - lastIndex = dmMaxRecordIndex; // enable select/unselect list item - - if (sknLastOn != skinButtonNone) { - RectangleType r; - skinDBP = SknOpenSkin(); - SknGetObjectBounds(skinDBP, sknLastOn, &r); - SknSetState(skinDBP, sknLastOn, sknStateNormal); - SknShowObject(skinDBP, sknLastOn); - SknCloseSkin(skinDBP); - - if (RctPtInRectangle(x*2, y*2, &r)) { - switch (sknLastOn) { - case skinButtonGameAdd: - gFormEditMode = edtModeAdd; - FrmPopupForm(GameEditForm); - handled = true; - break; - - case skinButtonGameAudio: - FrmPopupForm(MusicForm); - handled = true; - break; - - case skinButtonGameEdit: - case skinButtonGameParams: - gFormEditMode = edtModeParams; - FrmPopupForm(GameEditForm); - handled = true; - break; - - case skinButtonGameStart: - if (gPrefs->card.volRefNum == vfsInvalidVolRef) - FrmCustomAlert(FrmWarnAlert,"Please select/insert a memory card.", 0, 0); - else if (GamGetSelected() != dmMaxRecordIndex) - StartScummVM(); - else - FrmPopupForm(EngineForm); - handled = true; - break; - - case skinButtonGameDelete: - EditGameFormDelete(true); - break; - } - } - sknLastOn = skinButtonNone; - } - break; - - case penDownEvent: - case penMoveEvent: - if (sknLastOn == skinButtonNone) { - x = eventP->screenX; - y = eventP->screenY; - skinDBP = SknOpenSkin(); - - switch (sknLastOn = SknCheckClick(skinDBP, x,y)) { - case skinButtonNone: - break; - case skinSliderUpArrow: - case skinSliderDownArrow: - case skinButtonGameAdd: - case skinButtonGameEdit: - case skinButtonGameParams: - case skinButtonGameStart: - case skinButtonGameDelete: - case skinButtonGameAudio: - SknSetState(skinDBP, sknLastOn, sknStateSelected); - SknShowObject(skinDBP, sknLastOn); - if (gPrefs->soundClick) - SndPlaySystemSound(sndClick); - handled = true; - break; - default: - FrmCustomAlert(FrmWarnAlert,"Unknown button !",0,0); - } - SknCloseSkin(skinDBP); - SknSelect(x, y); - } - break; - - case keyDownEvent: - if ( (eventP->data.keyDown.chr >= 'a' && eventP->data.keyDown.chr <= 'z') || - (eventP->data.keyDown.chr >= 'A' && eventP->data.keyDown.chr <= 'Z')) { - if (GamJumpTo(eventP->data.keyDown.chr)) { - SknUpdateList(); - handled = true; - } - } - break; - - default: - handled = PenDownRepeat(); - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp b/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp deleted file mode 100644 index 48399efa95..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include - -#include "start.h" -#include "formTabs.h" -#include "forms.h" -#include "games.h" - -#include "globals.h" - -static TabType *myTabP; -static UInt16 lastTab = 0; - -static GameInfoType *gameInfoP = NULL; - -// Music -static Boolean MusicTabSave() { - ControlType *cck1P, *cck2P; - ListType *list1P, *list2P, *list3P; - FieldType *fld1P; - UInt16 tempo; - FormPtr frmP; - - frmP = FrmGetActiveForm(); - - cck1P = (ControlType *)GetObjectPtr(TabMusicMusicCheckbox); - cck2P = (ControlType *)GetObjectPtr(TabMusicMultiMidiCheckbox); - - list1P = (ListType *)GetObjectPtr(TabMusicDriverList); - list2P = (ListType *)GetObjectPtr(TabMusicRateList); - list3P = (ListType *)GetObjectPtr(TabMusicQualityList); - - fld1P = (FieldType *)GetObjectPtr(TabMusicTempoField); - - tempo = StrAToI(FldGetTextPtr(fld1P)); - if (tempo < 50 || tempo > 200) { - TabSetActive(frmP, myTabP, 0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabMusicTempoField)); - FrmCustomAlert(FrmErrorAlert, "Invalid tempo value (50...200)", 0, 0); - return false; - } - - gameInfoP->musicInfo.sound.music = CtlGetValue(cck1P); - gameInfoP->musicInfo.sound.multiMidi = CtlGetValue(cck2P); - - gameInfoP->musicInfo.sound.drvMusic = LstGetSelection(list1P); - gameInfoP->musicInfo.sound.rate = LstGetSelection(list2P); - gameInfoP->fmQuality = LstGetSelection(list3P); - gameInfoP->musicInfo.sound.tempo = tempo; - - return true; -} - -static void MusicTabInit() { - ControlType *cck1P, *cck2P; - ListType *list1P, *list2P, *list3P; - FieldType *fld1P; - MemHandle tempoH; - Char *tempoP; - - cck1P = (ControlType *)GetObjectPtr(TabMusicMusicCheckbox); - cck2P = (ControlType *)GetObjectPtr(TabMusicMultiMidiCheckbox); - - list1P = (ListType *)GetObjectPtr(TabMusicDriverList); - list2P = (ListType *)GetObjectPtr(TabMusicRateList); - list3P = (ListType *)GetObjectPtr(TabMusicQualityList); - - fld1P = (FieldType *)GetObjectPtr(TabMusicTempoField); - - CtlSetValue(cck1P, gameInfoP->musicInfo.sound.music); - CtlSetValue(cck2P, gameInfoP->musicInfo.sound.multiMidi); - - if (gameInfoP->musicInfo.sound.drvMusic > 5) - gameInfoP->musicInfo.sound.drvMusic = 0; - - - LstSetSelection(list1P, gameInfoP->musicInfo.sound.drvMusic); - LstSetTopItem(list1P, gameInfoP->musicInfo.sound.drvMusic); - CtlSetLabel((ControlType *)GetObjectPtr(TabMusicDriverPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - - LstSetSelection(list2P, gameInfoP->musicInfo.sound.rate); - LstSetTopItem(list2P, gameInfoP->musicInfo.sound.rate); - CtlSetLabel((ControlType *)GetObjectPtr(TabMusicRatePopTrigger), LstGetSelectionText(list2P, LstGetSelection(list2P))); - - LstSetSelection(list3P, gameInfoP->fmQuality); - CtlSetLabel((ControlType *)GetObjectPtr(TabMusicQualityPopTrigger), LstGetSelectionText(list3P, LstGetSelection(list3P))); - - tempoH = MemHandleNew(FldGetMaxChars(fld1P)+1); - tempoP = (Char *)MemHandleLock(tempoH); - StrIToA(tempoP, gameInfoP->musicInfo.sound.tempo); - MemHandleUnlock(tempoH); - FldSetTextHandle(fld1P, tempoH); -} - -// Audio CD -static Boolean AudioCDTabSave() { - ControlType *cck3P; - FieldType *fld2P, *fld3P; - ListType *list1P, *list2P; - UInt16 firstTrack; - FormPtr frmP; - - frmP = FrmGetActiveForm(); - - cck3P = (ControlType *)GetObjectPtr(TabAudioCDMP3Checkbox); - fld2P = (FieldType *)GetObjectPtr(TabAudioCDLengthSecsField); - fld3P = (FieldType *)GetObjectPtr(TabAudioCDFirstTrackField); - list1P = (ListType *)GetObjectPtr(TabAudioCDDriverList); - list2P = (ListType *)GetObjectPtr(TabAudioCDFormatList); - - firstTrack = StrAToI(FldGetTextPtr(fld3P)); - if (firstTrack < 1 || firstTrack > 999) { - TabSetActive(frmP, myTabP, 2); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, TabAudioCDFirstTrackField)); - FrmCustomAlert(FrmErrorAlert, "Invalid track value (1...999)", 0, 0); - return false; - } - - gameInfoP->musicInfo.sound.CD = CtlGetValue(cck3P); - - gameInfoP->musicInfo.sound.drvCD = LstGetSelection(list1P); - gameInfoP->musicInfo.sound.frtCD = LstGetSelection(list2P); - - gameInfoP->musicInfo.sound.defaultTrackLength = StrAToI(FldGetTextPtr(fld2P)); - gameInfoP->musicInfo.sound.firstTrack = firstTrack; - - return true; -} - -static void AudioCDTabInit() { - ControlType *cck3P; - FieldType *fld2P, *fld3P; - ListType *list1P, *list2P; - MemHandle lengthH, firstTrackH; - Char *lengthP, *firstTrackP; - - cck3P = (ControlType *)GetObjectPtr(TabAudioCDMP3Checkbox); - fld2P = (FieldType *)GetObjectPtr(TabAudioCDLengthSecsField); - fld3P = (FieldType *)GetObjectPtr(TabAudioCDFirstTrackField); - list1P = (ListType *)GetObjectPtr(TabAudioCDDriverList); - list2P = (ListType *)GetObjectPtr(TabAudioCDFormatList); - - LstSetSelection(list1P, gameInfoP->musicInfo.sound.drvCD); - CtlSetLabel((ControlType *)GetObjectPtr(TabAudioCDDriverPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - - LstSetSelection(list2P, gameInfoP->musicInfo.sound.frtCD); - CtlSetLabel((ControlType *)GetObjectPtr(TabAudioCDFormatPopTrigger), LstGetSelectionText(list2P, LstGetSelection(list2P))); - - CtlSetValue(cck3P, gameInfoP->musicInfo.sound.CD); - - lengthH = MemHandleNew(FldGetMaxChars(fld2P)+1); - lengthP = (Char *)MemHandleLock(lengthH); - StrIToA(lengthP, gameInfoP->musicInfo.sound.defaultTrackLength); - MemHandleUnlock(lengthH); - FldSetTextHandle(fld2P, lengthH); - - firstTrackH = MemHandleNew(FldGetMaxChars(fld3P)+1); - firstTrackP = (Char *)MemHandleLock(firstTrackH); - StrIToA(firstTrackP, gameInfoP->musicInfo.sound.firstTrack); - MemHandleUnlock(firstTrackH); - FldSetTextHandle(fld3P, firstTrackH); -} - -// Volume -static void VolumeTabSave() { - SliderControlType *slid1P, *slid2P, *slid3P, *slid4P, *slid5P; - - slid1P = (SliderControlType *)GetObjectPtr(TabVolumePalmSliderControl); - slid2P = (SliderControlType *)GetObjectPtr(TabVolumeMusicSliderControl); - slid3P = (SliderControlType *)GetObjectPtr(TabVolumeSfxSliderControl); - slid4P = (SliderControlType *)GetObjectPtr(TabVolumeSpeechSliderControl); - slid5P = (SliderControlType *)GetObjectPtr(TabVolumeAudioCDSliderControl); - - CtlGetSliderValues ((ControlType *)slid1P, 0, 0, 0, &gameInfoP->musicInfo.volume.palm); - CtlGetSliderValues ((ControlType *)slid2P, 0, 0, 0, &gameInfoP->musicInfo.volume.music); - CtlGetSliderValues ((ControlType *)slid3P, 0, 0, 0, &gameInfoP->musicInfo.volume.sfx); - CtlGetSliderValues ((ControlType *)slid4P, 0, 0, 0, &gameInfoP->musicInfo.volume.speech); - CtlGetSliderValues ((ControlType *)slid5P, 0, 0, 0, &gameInfoP->musicInfo.volume.audiocd); -} - -static void VolumeTabInit() { - SliderControlType *slid1P, *slid2P, *slid3P, *slid4P, *slid5P; - UInt16 value; - - slid1P = (SliderControlType *)GetObjectPtr(TabVolumePalmSliderControl); - slid2P = (SliderControlType *)GetObjectPtr(TabVolumeMusicSliderControl); - slid3P = (SliderControlType *)GetObjectPtr(TabVolumeSfxSliderControl); - slid4P = (SliderControlType *)GetObjectPtr(TabVolumeSpeechSliderControl); - slid5P = (SliderControlType *)GetObjectPtr(TabVolumeAudioCDSliderControl); - - value = gameInfoP->musicInfo.volume.palm; - CtlSetSliderValues ((ControlType *)slid1P, 0, 0, 0, &value); - value = gameInfoP->musicInfo.volume.music; - CtlSetSliderValues ((ControlType *)slid2P, 0, 0, 0, &value); - value = gameInfoP->musicInfo.volume.sfx; - CtlSetSliderValues ((ControlType *)slid3P, 0, 0, 0, &value); - value = gameInfoP->musicInfo.volume.speech; - CtlSetSliderValues ((ControlType *)slid4P, 0, 0, 0, &value); - value = gameInfoP->musicInfo.volume.audiocd; - CtlSetSliderValues ((ControlType *)slid5P, 0, 0, 0, &value); -} - -static void MusicFormSave(UInt16 index) { - if (index != dmMaxRecordIndex) { - MemHandle recordH; - GameInfoType *ogameInfoP; - - if (!MusicTabSave()) return; - if (!AudioCDTabSave()) return; - VolumeTabSave(); - - recordH = DmGetRecord(gameDB, index); - ogameInfoP = (GameInfoType *)MemHandleLock(recordH); - DmWrite(ogameInfoP, 0, gameInfoP, sizeof(GameInfoType)); - MemHandleUnlock(recordH); - DmReleaseRecord (gameDB, index, 0); - } - - MemPtrFree(gameInfoP); - gameInfoP = NULL; - - TabDeleteTabs(myTabP); - FrmReturnToMain(); -} -static void MusicFormInit(UInt16 index) { - TabType *tabP; - FormType *frmP = FrmGetActiveForm(); - - if (index != dmMaxRecordIndex) { - MemHandle recordH = NULL; - GameInfoType *ogameInfoP; - - recordH = DmQueryRecord(gameDB, index); - ogameInfoP = (GameInfoType *)MemHandleLock(recordH); - - if (!ogameInfoP) { - FrmCustomAlert(FrmErrorAlert, "An error occurred.",0,0); - return; - } - - gameInfoP = (GameInfoType *)MemPtrNew(sizeof(GameInfoType)); - MemMove(gameInfoP, ogameInfoP, sizeof(GameInfoType)); - MemHandleUnlock(recordH); - - } else { - FrmCustomAlert(FrmWarnAlert, "Select an entry first.",0,0); - FrmReturnToMain(); - return; - } - - tabP = TabNewTabs(3); - TabAddContent(&frmP, tabP, "Sound", TabMusicForm); - TabAddContent(&frmP, tabP, "Volume", TabVolumeForm); - TabAddContent(&frmP, tabP, "Audio CD", TabAudioCDForm); - - MusicTabInit(); - AudioCDTabInit(); - VolumeTabInit(); - - FrmDrawForm(frmP); - TabSetActive(frmP, tabP, lastTab); - - myTabP = tabP; -} - -Boolean MusicFormHandleEvent(EventPtr eventP) { - FormPtr frmP = FrmGetActiveForm(); - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - MusicFormInit(GamGetSelected()); - handled = true; - break; - - case frmCloseEvent: - MusicFormSave(dmMaxRecordIndex); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case (MusicForm + 1) : - case (MusicForm + 2) : - case (MusicForm + 3) : - lastTab = (eventP->data.ctlSelect.controlID - MusicForm - 1); - TabSetActive(frmP, myTabP, lastTab); - break; - - case TabMusicDriverPopTrigger: - FrmList(eventP, TabMusicDriverList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabMusicDriverList)); - - if (!OPTIONS_TST(kOptDeviceZodiac) && !OPTIONS_TST(kOptSonyPa1LibAPI)) { - ListType *list1P = (ListType *)GetObjectPtr(TabMusicDriverList); - - if (LstGetSelection(list1P) == 4) { - FrmCustomAlert(FrmInfoAlert, "There is no built-in MIDI support on your device.", 0, 0); - LstSetSelection(list1P, 0); - CtlSetLabel((ControlType *)GetObjectPtr(TabMusicDriverPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - } - } - break; - - case TabMusicQualityPopTrigger: - FrmList(eventP, TabMusicQualityList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabMusicQualityList)); - break; - - case TabMusicRatePopTrigger: - FrmList(eventP, TabMusicRateList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabMusicRateList)); - - if (!OPTIONS_TST(kOptPalmSoundAPI)) { - ListType *list1P = (ListType *)GetObjectPtr(TabMusicRateList); - - if (LstGetSelection(list1P) != 0) { - FrmCustomAlert(FrmInfoAlert, "You cannot use this rate on your device.", 0, 0); - LstSetSelection(list1P, 0); - CtlSetLabel((ControlType *)GetObjectPtr(TabMusicRatePopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - } - } - break; - - case TabAudioCDFormatPopTrigger: - FrmList(eventP, TabAudioCDFormatList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabAudioCDFormatList)); - - if (LstGetSelection((ListPtr)GetObjectPtr(TabAudioCDDriverList)) == 1) { - ListType *list1P = (ListType *)GetObjectPtr(TabAudioCDFormatList); - LstSetSelection(list1P, 0); - CtlSetLabel((ControlType *)GetObjectPtr(TabAudioCDFormatPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - } - break; - - case TabAudioCDDriverPopTrigger: - FrmList(eventP, TabAudioCDDriverList); - FrmHideObject(frmP, FrmGetObjectIndex(frmP, TabAudioCDDriverList)); - - if (LstGetSelection((ListPtr)GetObjectPtr(TabAudioCDDriverList)) == 1) { - ListType *list1P = (ListType *)GetObjectPtr(TabAudioCDFormatList); - LstSetSelection(list1P, 0); - CtlSetLabel((ControlType *)GetObjectPtr(TabAudioCDFormatPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - } - break; - - case MusicOKButton: - MusicFormSave(GamGetSelected()); - break; - - case MusicCancelButton: - MusicFormSave(dmMaxRecordIndex); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/forms.h b/backends/platform/PalmOS/Src/launcher/forms/forms.h deleted file mode 100644 index ca0089d8c1..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/forms.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __FORMS_H__ -#define __FORMS_H__ - -#include "StarterRsc.h" -#include "formUtil.h" - -#include "formEditGame.h" -#include "formCards.h" - - -#define HANDLER(x) Boolean x##FormHandleEvent(EventPtr eventP); - -HANDLER(Main) -HANDLER(EditGame) -HANDLER(SystemInfo) -HANDLER(Misc) -HANDLER(CardSlot) -HANDLER(Skins) -HANDLER(Music) -HANDLER(Info) -HANDLER(Selector) - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/forms/formtabs.cpp b/backends/platform/PalmOS/Src/launcher/forms/formtabs.cpp deleted file mode 100644 index d3f18e39d7..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formtabs.cpp +++ /dev/null @@ -1,242 +0,0 @@ -#include -#include -#include -#include - -#include "globals.h" -#include "formTabs.h" - -TabType *TabNewTabs(UInt16 cnt) { - TabType *newP = new TabType; - - newP->count = 0; - newP->width = 0; - newP->tabs = new TabDataType[cnt]; - - return newP; -} - -void TabMoveUpObject(FormType *frmP, UInt16 objID, Coord amount) { - Coord x, y; - FrmGetObjectPosition(frmP, FrmGetObjectIndex(frmP, objID), &x, &y); - FrmSetObjectPosition(frmP, FrmGetObjectIndex(frmP, objID), x, y - amount); -} - -void TabDeleteTabs(TabType *tabP) { - UInt16 cnt, num; - num = MemPtrSize(tabP->tabs) / sizeof(TabDataType); - - for (cnt = 0; cnt < num; cnt++) - FrmDeleteForm(tabP->tabs[cnt].srcP); - - delete tabP->tabs; - delete tabP; -} - -Err TabAddContent(FormType **frmP, TabType *tabP, const Char *nameP, UInt16 rscID, TabProc *drawFunc) { - FormType *srcP; - UInt16 cnt; - void *objP, **dstP; - UInt16 objNum; - Coord x, y, w, h; - UInt16 id; - RectangleType r; - - dstP = (void **)frmP; - srcP = FrmInitForm(rscID); - - objNum = FrmGetNumberOfObjects(srcP); - - // save tab data - - // it's required to keep to source forms active - // while the tab form is not close for list data ptr (items text) - // TODO : fix this ! - tabP->tabs[tabP->count].srcP = srcP; - tabP->tabs[tabP->count].first = FrmGetObjectId(srcP, 0); - tabP->tabs[tabP->count].last = FrmGetObjectId(srcP, objNum - 1); - tabP->tabs[tabP->count].drawFunc= drawFunc; - tabP->count++; - tabP->active = tabP->count; - - // create tab - FntSetFont(stdFont); - x = 4 + tabP->width; - y = 16; - w = FntCharsWidth(nameP, StrLen(nameP)) + 6; - h = 12; - ControlType *addP = CtlNewControl(dstP, (FrmGetFormId(*frmP) + tabP->count), buttonCtl, nameP, x, y, w, h, stdFont, 0, true); - CtlGlueSetFrameStyle(addP, noButtonFrame); - tabP->width += w + 3; - - // create tab content - for (cnt = 0; cnt < objNum; cnt++) { - objP = FrmGetObjectPtr(srcP, cnt); - id = FrmGetObjectId(srcP, cnt); - FrmGetObjectBounds(srcP, cnt, &r); - x = r.topLeft.x - 2; - y = r.topLeft.y + 30; - w = r.extent.x; - h = r.extent.y; - - FrmSetObjectPosition(srcP, cnt, x, y); - - switch (FrmGetObjectType(srcP, cnt)) { - case frmListObj: { - // HOWTO : to auto link the list to a popup trigger the listID must be popupID + 1 if popup id - // desn't exist the triggerID will be 0 and the list will be shown, but take care to not define - // ListID - 1 object if you want to show the list. - ListType *newP; - Char **itemsP = LstGlueGetItemsText((ListType *)objP); - FontID font = LstGlueGetFont((ListType *)objP); - UInt16 visible = LstGetVisibleItems((ListType *)objP); - UInt16 items = LstGetNumberOfItems((ListType *)objP); - UInt16 trigger = id - 1; - trigger = (FrmGetObjectIndex((FormType *)*dstP, trigger) != frmInvalidObjectId) ? trigger : 0; - - LstNewList(dstP, id, x, y, w, h, font, visible, trigger); - newP = (ListType *)FrmGetObjectPtr((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); - LstSetListChoices(newP, itemsP, items); - FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); - break; - } - case frmFieldObj: { - FieldAttrType attr; - FontID font = FldGetFont((FieldType *)objP); - UInt16 maxChars = FldGetMaxChars((FieldType *)objP); - FldGetAttributes((FieldType *)objP, &attr); - FldNewField(dstP, id, x, y, w, h, font, maxChars, attr.editable, attr.underlined, attr.singleLine, attr.dynamicSize, (JustificationType)attr.justification, attr.autoShift, attr.hasScrollBar, attr.numeric); - FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); - break; - } - case frmControlObj: { - const Char *textP = CtlGetLabel((ControlType *)objP); - ControlStyleType style = CtlGlueGetControlStyle((ControlType *)objP); - FontID font = CtlGlueGetFont((ControlType *)objP); - ControlType *newP = CtlNewControl(dstP, id, style, textP, x, y, w, h, font, 0, true); - FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); - switch (style) { - case sliderCtl: - { - UInt16 min, max, page, val; - CtlGetSliderValues((ControlType *)objP, &min, &max, &page, &val); - CtlSetSliderValues(newP, &min, &max, &page, &val); - break; - } - } - break; - } - case frmLabelObj: { - const Char *textP = FrmGetLabel(srcP, id); - FontID font = FrmGlueGetLabelFont(srcP, id); - FrmNewLabel((FormType **)dstP, id, textP, x, y, font); - FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); - break; - } - - case frmBitmapObj: { -/* UInt16 family = id + 1; - FrmNewBitmap((FormType **)dstP, id, id, x, y); - //FrmHideObject((FormType *)*dstP, FrmGetObjectIndex((FormType *)*dstP, id)); -*/ break; - } - } - } - - frmP = (FormType **)dstP; // save new form ptr - return errNone; -} - -void TabSetActive(FormType *frmP, TabType *tabP, UInt16 num) { - UInt16 cnt, idx; - RectangleType r; - TabDataPtr dataP; - - if (tabP->active == num) - return; - - dataP = &tabP->tabs[tabP->active]; - - // hide active tab objects - if (tabP->active != tabP->count) { - for (cnt = dataP->first; cnt <= dataP->last; cnt++) { - if ((idx = FrmGetObjectIndex(frmP, cnt)) != frmInvalidObjectId) - FrmHideObject(frmP, idx); - } - } - - // save active tab - tabP->active = num; - dataP = &tabP->tabs[num]; - - // draw tab limit - WinSetForeColor(UIColorGetTableEntryIndex(UIFormFill)); - WinDrawLine(1, 14, 154,14); - WinDrawLine(1, 15, 154,15); - RctSetRectangle(&r, 1, 30, 154, 100); - WinDrawRectangle(&r, 0); - WinSetForeColor(UIColorGetTableEntryIndex(UIObjectFrame)); - WinDrawLine(1, 28, 154,28); - - // set tabs size - for (cnt = 0; cnt < tabP->count; cnt++) { - idx = FrmGetObjectIndex (frmP, (FrmGetFormId(frmP) + cnt + 1)); - - if (idx != frmInvalidObjectId) { - FrmGetObjectBounds(frmP, idx, &r); - r.topLeft.y = (num == cnt) ? 17 : 17; - r.extent.y = (num == cnt) ? 12 : 11; - FrmSetObjectBounds(frmP, idx, &r); - - if (num == cnt) { - RGBColorType yellow = {0,255,192,0}; - - UInt8 line = /*(UIColorGetTableEntryIndex(UIFormFill) == UIColorGetTableEntryIndex(UIFieldTextHighlightBackground)) ? - WinRGBToIndex(&yellow) :*/ - UIColorGetTableEntryIndex(UIFieldTextHighlightBackground); - - r.topLeft.y -= 1; - WinSetForeColor(UIColorGetTableEntryIndex(UIObjectFrame)); - WinDrawRectangleFrame(simpleFrame, &r); - WinSetForeColor(line); - WinDrawLine(r.topLeft.x, r.topLeft.y, r.topLeft.x + r.extent.x - 1, r.topLeft.y); - FrmShowObject(frmP, idx); - - } else { - UInt8 frame = UIColorGetTableEntryIndex(UIObjectFrame); - RGBColorType light; - WinIndexToRGB(frame, &light); - light.r = (255 - light.r) > 72 ? light.r + 72 : 255; - light.g = (255 - light.g) > 72 ? light.g + 72 : 255; - light.b = (255 - light.b) > 72 ? light.b + 72 : 255; - - WinSetForeColor(WinRGBToIndex(&light)); - WinDrawRectangleFrame(simpleFrame, &r); - WinSetForeColor(frame); - WinDrawLine(r.topLeft.x - 1, r.topLeft.y + r.extent.y, r.topLeft.x + r.extent.x, r.topLeft.y + r.extent.y); - } - - // round corner - WinSetForeColor(UIColorGetTableEntryIndex(UIFormFill)); - if (OPTIONS_TST(kOptModeHiDensity)) { - WinSetCoordinateSystem(kCoordinatesNative); - WinDrawPixel((r.topLeft.x - 1) * 2, (r.topLeft.y - 1) * 2); - WinDrawPixel((r.topLeft.x + r.extent.x) * 2 + 1, (r.topLeft.y - 1) * 2); - WinSetCoordinateSystem(kCoordinatesStandard); - - } else { - // TODO - } - } - } - - // show objects - for (cnt = dataP->first; cnt <= dataP->last; cnt++) { - if ((idx = FrmGetObjectIndex(frmP, cnt)) != frmInvalidObjectId) - FrmShowObject(frmP, idx); - } - - // post draw function - if (dataP->drawFunc) - (dataP->drawFunc)(); -} diff --git a/backends/platform/PalmOS/Src/launcher/forms/formtabs.h b/backends/platform/PalmOS/Src/launcher/forms/formtabs.h deleted file mode 100644 index f14c2ff4e4..0000000000 --- a/backends/platform/PalmOS/Src/launcher/forms/formtabs.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __FORMTABS_H__ -#define __FORMTABS_H__ - -typedef void (TabProc)(); - -typedef struct { - FormPtr srcP; - UInt16 first; - UInt16 last; - TabProc *drawFunc; -} TabDataType, *TabDataPtr; - -typedef struct { - UInt16 count, active; - Coord width; - TabDataPtr tabs; -} TabType, *TabPtr; - -TabType *TabNewTabs (UInt16 cnt); -void TabDeleteTabs (TabType *tabP); -Err TabAddContent (FormType **frmP, TabType *tabP, const Char *nameP, UInt16 rscID, TabProc *drawFunc = 0); -void TabSetActive (FormType *frmP, TabType *tabP, UInt16 num); -void TabMoveUpObject (FormType *frmP, UInt16 objID, Coord amount); -#endif diff --git a/backends/platform/PalmOS/Src/launcher/games.cpp b/backends/platform/PalmOS/Src/launcher/games.cpp deleted file mode 100644 index c3f7ef3e4a..0000000000 --- a/backends/platform/PalmOS/Src/launcher/games.cpp +++ /dev/null @@ -1,548 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include - -#include "globals.h" -#include "palmdefs.h" -#include "start.h" -#include "games.h" -#include "skin.h" - -#include "StarterRsc.h" - -DmOpenRef gameDB = NULL; - -static Err GamUpdateList() { - if (gameDB) { - UInt16 numRecs = DmNumRecords(gameDB); - - if (numRecs > 0) { - MemHandle tmpH; - UInt32 version, size; - UInt32 *versionP; - - // get record size and version - tmpH = DmQueryRecord(gameDB, 0); - size = MemHandleSize(tmpH); - versionP = (UInt32 *)MemHandleLock(tmpH); - version = *versionP; - MemHandleUnlock(tmpH); - - // check record - if (version != curItemVersion || size != sizeof(GameInfoType)) { - UInt16 index; - GameInfoType gitCur; - void *tmpP; - FormPtr ofmP, frmP; - - // show dialog - ofmP = FrmGetActiveForm(); - frmP = FrmInitForm(ConvertForm); - FrmSetActiveForm(frmP); - FrmDrawForm(frmP); - SysTaskDelay(1 * SysTicksPerSecond()); - - MemSet(&gitCur, sizeof(GameInfoType), 0); - - if (version == itemVersion_357 || - version == itemVersion_356 || - version == itemVersion_355 || - version == itemVersion_354 || - version == itemVersion_353 || - version == itemVersion_352 || - version == itemVersion_351 || - version == itemVersion_350 || - version == itemVersion_340 || - version == itemVersion_330 || - version == itemVersion_320 || - version == itemVersion_310 || - version == itemVersion_300 || - version == itemVersion_270 || - version == itemVersion_260 || - version == itemVersion_250) { - for (index = 0; index < numRecs; index++) { - // get old data - tmpH = DmQueryRecord(gameDB, index); - tmpP = MemHandleLock(tmpH); - MemMove(&gitCur, tmpP, MemHandleSize(tmpH)); - MemHandleUnlock(tmpH); - - // new format - gitCur.version = curItemVersion; - - if (version < itemVersion_300) { - gitCur.musicInfo.volume.palm = 50; - gitCur.musicInfo.volume.music = 192; - gitCur.musicInfo.volume.sfx = 192; - gitCur.musicInfo.volume.speech = 192; - gitCur.musicInfo.volume.audiocd = 50; - - gitCur.musicInfo.sound.tempo = 100; - gitCur.musicInfo.sound.defaultTrackLength = 10; - gitCur.musicInfo.sound.firstTrack = 1; - } - - if (version < itemVersion_310) - gitCur.engine = 0; - - if (version < itemVersion_320) - gitCur.renderMode = 0; - - if (version <= itemVersion_330) { - gitCur.fmQuality = 0; - gitCur.gfxMode = (gitCur.gfxMode == 3 ? 1 : 0); // v3.4 only 2 modes - - if (gitCur.engine == 0) gitCur.engine = 8; - else if (gitCur.engine == 1) gitCur.engine = 7; - else if (gitCur.engine == 2) gitCur.engine = 3; - else if (gitCur.engine == 3) gitCur.engine = 1; - else if (gitCur.engine == 4) gitCur.engine = 0; - else if (gitCur.engine == 5) gitCur.engine = 6; - else if (gitCur.engine == 6) gitCur.engine = 4; - else if (gitCur.engine == 7) gitCur.engine = 5; - else if (gitCur.engine == 8) gitCur.engine = 2; - - if (gitCur.renderMode == 1) gitCur.renderMode = 4; - else if (gitCur.renderMode == 2) gitCur.renderMode = 5; - else if (gitCur.renderMode == 3) gitCur.renderMode = 2; - else if (gitCur.renderMode == 4) gitCur.renderMode = 3; - else if (gitCur.renderMode == 5) gitCur.renderMode = 1; - - if (gitCur.platform == 2) gitCur.platform = 6; - else if (gitCur.platform == 5) gitCur.platform = 8; - else if (gitCur.platform == 6) gitCur.platform = 2; - - if (gitCur.language == 1) gitCur.language = 4; - else if (gitCur.language == 2) gitCur.language = 6; - else if (gitCur.language == 3) gitCur.language = 5; - else if (gitCur.language == 4) gitCur.language = 8; - else if (gitCur.language == 5) gitCur.language = 11; - else if (gitCur.language == 6) gitCur.language = 13; - else if (gitCur.language == 7) gitCur.language = 9; - else if (gitCur.language == 8) gitCur.language = 1; - else if (gitCur.language == 9) gitCur.language = 10; - else if (gitCur.language == 10) gitCur.language = 7; - else if (gitCur.language == 11) gitCur.language = 12; - else if (gitCur.language == 12) gitCur.language = 2; - else if (gitCur.language == 13) gitCur.language = 3; - - if (gitCur.musicInfo.sound.drvMusic == 1) gitCur.musicInfo.sound.drvMusic = 4; - else if (gitCur.musicInfo.sound.drvMusic == 2) gitCur.musicInfo.sound.drvMusic = 5; - else if (gitCur.musicInfo.sound.drvMusic == 4) gitCur.musicInfo.sound.drvMusic = 2; - else if (gitCur.musicInfo.sound.drvMusic == 5) gitCur.musicInfo.sound.drvMusic = 1; - } - - if (version <= itemVersion_340) { - gitCur.platform++; - - if (gitCur.language == 3) - gitCur.language = 0; - else if (gitCur.language >= 11) - gitCur.language++; - } - - if (version <= itemVersion_350) - if (gitCur.platform >= 9) - gitCur.platform++; - - if (version <= itemVersion_351) { - if (gitCur.engine >= ENGINE_LURE) // newly added engine - gitCur.engine++; - - if (gitCur.engine == ENGINE_SCUMM) // reorder - gitCur.engine = ENGINE_AGOS; - else if (gitCur.engine == ENGINE_AGOS) - gitCur.engine = ENGINE_SCUMM; - } - - if (version <= itemVersion_352) { - if (gitCur.engine >= ENGINE_CINE) // newly added engine - gitCur.engine++; - - gitCur.platform++; - } - - if (version <= itemVersion_353) - gitCur.musicInfo.sound.drvMusic++; - - if (version <= itemVersion_354) - if (gitCur.engine >= ENGINE_AGI) // newly added engine - gitCur.engine++; - - if (version <= itemVersion_355) { - gitCur.engine++; // renamed Simon -> AGOS - if (gitCur.engine == ENGINE_COUNT) - gitCur.engine = ENGINE_AGOS; - } - - if (version <= itemVersion_356) { - if (gitCur.platform >= 3) - gitCur.platform++; - } - - if (version <= itemVersion_357) - if (gitCur.engine >= ENGINE_PARALLACTION) // newly added engine - gitCur.engine++; - - if (gitCur.musicInfo.volume.palm > 100) - gitCur.musicInfo.volume.palm = 50; - - // simply resize the old record - tmpH = DmResizeRecord(gameDB, index, sizeof(GameInfoType)); // TODO : check error on resize tmpH==NULL - tmpP = MemHandleLock(tmpH); - DmWrite(tmpP, 0, &gitCur, sizeof(GameInfoType)); - MemPtrUnlock(tmpP); - } - - } else if (version == itemVersion_200) { - // need conversion from V2 -> V3.5.2 - GameInfoTypeV2 git0; - - for (index = 0; index < numRecs; index++) { - - // get old data - tmpH = DmQueryRecord(gameDB, index); - tmpP = MemHandleLock(tmpH); - MemMove(&git0, tmpP, sizeof(GameInfoTypeV2)); - MemHandleUnlock(tmpH); - - // convert to new format - gitCur.version = curItemVersion; - gitCur.icnID = 0xFFFF; - gitCur.selected = git0.selected; - StrCopy(gitCur.nameP, git0.nameP); - StrCopy(gitCur.pathP, git0.pathP); - StrCopy(gitCur.gameP, git0.gameP); - gitCur.gfxMode = (git0.gfxMode == 3 ? 1 : 0); // v3.4 only 2 modes - - gitCur.autoLoad = git0.autoLoad; - gitCur.bootParam = git0.bootParam; - gitCur.setPlatform = git0.setPlatform; - gitCur.subtitles = git0.subtitles; - gitCur.talkSpeed = git0.talkSpeed; - - gitCur.loadSlot = git0.loadSlot; - gitCur.bootValue = git0.bootValue; - gitCur.talkValue = git0.talkValue; - gitCur.platform = git0.platform; - gitCur.language = git0.language; - - gitCur.musicInfo.volume.palm = 50; - gitCur.musicInfo.volume.music = 192; - gitCur.musicInfo.volume.sfx = 192; - gitCur.musicInfo.volume.speech = 192; - gitCur.musicInfo.volume.audiocd = 50; - - gitCur.musicInfo.sound.tempo = 100; - gitCur.musicInfo.sound.defaultTrackLength = 10; - gitCur.musicInfo.sound.firstTrack = 1; - - // to V3.4 - if (gitCur.platform == 2) gitCur.platform = 6; - else if (gitCur.platform == 5) gitCur.platform = 8; - else if (gitCur.platform == 6) gitCur.platform = 2; - - if (gitCur.language == 1) gitCur.language = 4; - else if (gitCur.language == 2) gitCur.language = 6; - else if (gitCur.language == 3) gitCur.language = 5; - else if (gitCur.language == 4) gitCur.language = 8; - else if (gitCur.language == 5) gitCur.language = 11; - else if (gitCur.language == 6) gitCur.language = 13; - else if (gitCur.language == 7) gitCur.language = 9; - else if (gitCur.language == 8) gitCur.language = 1; - else if (gitCur.language == 9) gitCur.language = 10; - else if (gitCur.language == 10) gitCur.language = 7; - else if (gitCur.language == 11) gitCur.language = 12; - else if (gitCur.language == 12) gitCur.language = 2; - else if (gitCur.language == 13) gitCur.language = 3; - - if (gitCur.musicInfo.sound.drvMusic == 1) gitCur.musicInfo.sound.drvMusic = 4; - else if (gitCur.musicInfo.sound.drvMusic == 2) gitCur.musicInfo.sound.drvMusic = 5; - else if (gitCur.musicInfo.sound.drvMusic == 4) gitCur.musicInfo.sound.drvMusic = 2; - else if (gitCur.musicInfo.sound.drvMusic == 5) gitCur.musicInfo.sound.drvMusic = 1; - - // to V3.5 - gitCur.platform++; - - if (gitCur.language == 3) - gitCur.language = 0; - else if (gitCur.language >= 11) - gitCur.language++; - - // to V3.5.1 - if (gitCur.platform >= 9) - gitCur.platform++; - - //to V3.5.3 - gitCur.musicInfo.sound.drvMusic++; - - // ----- - gitCur.engine = ENGINE_SCUMM; - - tmpH = DmResizeRecord(gameDB, index, sizeof(GameInfoType)); // TODO : check error on resize tmpH==NULL - tmpP = MemHandleLock(tmpH); - DmWrite(tmpP, 0, &gitCur, sizeof(GameInfoType)); - MemPtrUnlock(tmpP); - } - } else { - // need conversion from V0 -> V3.5.2 - GameInfoTypeV0 git0; - - for (index = 0; index < numRecs; index++) { - - // get old data - tmpH = DmQueryRecord(gameDB, index); - tmpP = MemHandleLock(tmpH); - MemMove(&git0, tmpP, sizeof(GameInfoTypeV0)); - MemHandleUnlock(tmpH); - - // convert to new format - gitCur.version = curItemVersion; - gitCur.icnID = 0xFFFF; - gitCur.selected = git0.selected; - StrCopy(gitCur.nameP, git0.nameP); - StrCopy(gitCur.pathP, git0.pathP); - StrCopy(gitCur.gameP, git0.gameP); - gitCur.gfxMode = (git0.gfxMode == 3 ? 1 : 0); // v3.4 only 2 modes - - gitCur.autoLoad = git0.autoLoad; - gitCur.bootParam = git0.bootParam; - gitCur.setPlatform = git0.amiga; // amiga become platform amiga/atari-st/machintosh - gitCur.platform = 1; - gitCur.subtitles = git0.subtitles; - gitCur.talkSpeed = git0.talkSpeed; - - gitCur.loadSlot = git0.loadSlot; - gitCur.bootValue = git0.bootValue; - gitCur.talkValue = git0.talkValue; - gitCur.platform = 2; // default to amiga - gitCur.language = git0.language; - - gitCur.musicInfo.volume.palm = 50; - gitCur.musicInfo.volume.music = 192; - gitCur.musicInfo.volume.sfx = 192; - gitCur.musicInfo.volume.speech = 192; - gitCur.musicInfo.volume.audiocd = 50; - - gitCur.musicInfo.sound.tempo = 100; - gitCur.musicInfo.sound.defaultTrackLength = 10; - gitCur.musicInfo.sound.firstTrack = 1; - - gitCur.engine = ENGINE_SCUMM; - - tmpH = DmResizeRecord(gameDB, index, sizeof(GameInfoType)); // TODO : check error on resize tmpH==NULL - tmpP = MemHandleLock(tmpH); - DmWrite(tmpP, 0, &gitCur, sizeof(GameInfoType)); - MemPtrUnlock(tmpP); - } - } - - FrmEraseForm(frmP); - FrmDeleteForm(frmP); - if (ofmP) - FrmSetActiveForm(ofmP); - } - } - } - - return errNone; -} - -Err GamOpenDatabase() { - Err err = errNone; - - gameDB = DmOpenDatabaseByTypeCreator( 'DATA', appFileCreator, dmModeReadWrite); - - if (!gameDB) { - err = DmCreateDatabase(0, "ScummVM-Data", appFileCreator, 'DATA', false); - if (!err) { - gameDB = DmOpenDatabaseByTypeCreator( 'DATA', appFileCreator, dmModeReadWrite); - - if (!gameDB) - err = DmGetLastErr(); - } - } - - if (err) - FrmCustomAlert(FrmErrorAlert,"Cannot open/create games list DB !",0,0); - else - err = GamUpdateList(); - - return err; -} - -void GamImportDatabase() { - if (gPrefs->card.volRefNum != vfsInvalidVolRef && gPrefs->card.moveDB) { - FileRef file; - Err e; - - e = VFSFileOpen(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", vfsModeRead, &file); - if (!e) { - UInt16 oCardNo, nCardNo; - LocalID oDbID, nDbID; - - VFSFileClose(file); - if (gPrefs->card.confirmMoveDB) - if (FrmCustomAlert(FrmConfirmAlert, "Do you want to import games database from memory card ?", 0, 0) == FrmConfirmNo) { - // prevent to replace the file on memory card - gPrefs->card.moveDB = false; - return; - } - - // get current db info and rename it - DmOpenDatabaseInfo(gameDB, &oDbID, 0, 0, &oCardNo, 0); - GamCloseDatabase(true); - e = DmDeleteDatabase(oCardNo, oDbID); - - if (!e) - if (e = VFSImportDatabaseFromFile(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", &nCardNo, &nDbID)) - FrmCustomAlert(FrmErrorAlert, "Failed to import games database from memory card.", 0, 0); - - GamOpenDatabase(); - } - } -} - -void GamCloseDatabase(Boolean ignoreCardParams) { - if (gameDB) { - LocalID dbID; - UInt16 cardNo; - - DmOpenDatabaseInfo(gameDB, &dbID, 0, 0, &cardNo, 0); - DmCloseDatabase(gameDB); - - if (!ignoreCardParams) { - if (gPrefs->card.moveDB && gPrefs->card.volRefNum != vfsInvalidVolRef) { - VFSFileRename(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", "listdata-old.pdb"); - Err e = VFSExportDatabaseToFile(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", cardNo, dbID); - if (!e) { - VFSFileDelete(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata-old.pdb"); - if (gPrefs->card.deleteDB) - DmDeleteDatabase(cardNo, dbID); - } else { - VFSFileRename(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata-old.pdb", "listdata.pdb"); - } - } - } - } - gameDB = NULL; -} - -static Int16 GamCompare(GameInfoType *a, GameInfoType *b, SortRecordInfoPtr, SortRecordInfoPtr, MemHandle) { - return StrCaselessCompare(a->nameP, b->nameP); -} - -Err GamSortList() { - return DmQuickSort (gameDB, (DmComparF *)GamCompare, 0); -} - -void GamUnselect() { - GameInfoType *game; - - MemHandle recordH; - UInt16 index; - - index = GamGetSelected(); - - if (index != dmMaxRecordIndex) { - Boolean newValue; - - recordH = DmGetRecord(gameDB, index); - game = (GameInfoType *)MemHandleLock(recordH); - - newValue = false; - DmWrite(game, OffsetOf(GameInfoType,selected), &newValue, sizeof(Boolean)); - - MemHandleUnlock(recordH); - DmReleaseRecord (gameDB, index, 0); - } -} - -UInt16 GamGetSelected() { - MemHandle record; - GameInfoType *game; - Boolean selected; - UInt16 index = DmNumRecords(gameDB)-1; - - while (index != (UInt16)-1) { - record = DmQueryRecord(gameDB, index); - game = (GameInfoType *)MemHandleLock(record); - selected = game->selected; - MemHandleUnlock(record); - - if (selected) - return index; - - index--; - } - - return dmMaxRecordIndex; -} - -Boolean GamJumpTo(Char letter) { - MemHandle record; - GameInfoType *game; - Boolean found = false; - UInt16 index = 0; - UInt16 maxIndex = DmNumRecords(gameDB); - UInt16 active = GamGetSelected(); - - while (index < maxIndex) { - record = DmGetRecord(gameDB, index); - game = (GameInfoType *)MemHandleLock(record); - - if (tolower(game->nameP[0]) == tolower(letter)) { - found = true; - - if (index != active) { - RectangleType rArea; - UInt16 maxView; - Boolean newValue = true; - - SknGetListBounds(&rArea, NULL); - maxView = rArea.extent.y / sknInfoListItemSize; - - GamUnselect(); - DmWrite(game, OffsetOf(GameInfoType,selected), &newValue, sizeof(Boolean)); - - if (index < gPrefs->listPosition || index >= (gPrefs->listPosition + maxView)) - gPrefs->listPosition = index; - } - } - - MemHandleUnlock(record); - DmReleaseRecord (gameDB, index, 0); - - index++; - - if (found) - return found; - } - - return found; -} diff --git a/backends/platform/PalmOS/Src/launcher/games.h b/backends/platform/PalmOS/Src/launcher/games.h deleted file mode 100644 index 7c381a40f4..0000000000 --- a/backends/platform/PalmOS/Src/launcher/games.h +++ /dev/null @@ -1,212 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __GAMES_H__ -#define __GAMES_H__ - -#define curItemVersion sysMakeROMVersion(3,5,8,0,0) // Parallaction engine - - -#define itemVersion_357 sysMakeROMVersion(3,5,7,0,0) // Added : Apple IIgs -#define itemVersion_356 sysMakeROMVersion(3,5,6,0,0) // Changed : Simon -> AGOS -#define itemVersion_355 sysMakeROMVersion(3,5,5,0,0) // Added : AGI engine -#define itemVersion_354 sysMakeROMVersion(3,5,4,0,0) // Added : Default/Auto music driver -#define itemVersion_353 sysMakeROMVersion(3,5,3,0,0) // Added : CinE engine and 3DO platform -#define itemVersion_352 sysMakeROMVersion(3,5,2,0,0) // Added : Lure engine -#define itemVersion_351 sysMakeROMVersion(3,5,1,0,0) // Added : Sega CD platform -#define itemVersion_350 sysMakeROMVersion(3,5,0,0,0) -#define itemVersion_340 sysMakeROMVersion(3,4,0,0,0) -#define itemVersion_330 sysMakeROMVersion(3,3,0,0,0) -#define itemVersion_320 sysMakeROMVersion(3,2,0,0,0) -#define itemVersion_310 sysMakeROMVersion(3,1,0,0,0) -#define itemVersion_300 sysMakeROMVersion(3,0,0,0,0) -#define itemVersion_270 sysMakeROMVersion(2,7,0,0,0) -#define itemVersion_260 sysMakeROMVersion(2,6,0,0,0) -#define itemVersion_250 sysMakeROMVersion(2,5,0,0,0) -#define itemVersion_200 sysMakeROMVersion(2,0,0,0,0) - -// old config structs -typedef struct { - UInt32 version; - UInt16 icnID; // icon to display on the list - Boolean selected; - - Char nameP[50]; // game name to display in list - Char pathP[150]; // path to the game files - Char gameP[10]; // scumm name of the game - UInt16 gfxMode; - - Boolean autoLoad; - UInt16 loadSlot; - Boolean bootParam; - UInt16 bootValue; - Boolean amiga; - Boolean subtitles; - Boolean talkSpeed; - UInt16 talkValue; - UInt8 language; - -} GameInfoTypeV0; - -typedef struct { - UInt32 version; - UInt16 icnID; // icon to display on the list - Boolean selected; - - Char nameP[50]; // game name to display in list - Char pathP[150]; // path to the game files - Char gameP[10]; // scumm name of the game - UInt16 gfxMode; - - Boolean autoLoad; - Boolean bootParam; - Boolean setPlatform; - Boolean subtitles; - Boolean talkSpeed; - - UInt16 loadSlot; - UInt16 bootValue; - UInt16 talkValue; - UInt8 platform; - UInt8 language; - -} GameInfoTypeV2; - - -// Current config -typedef struct { - struct { - UInt16 palm; - UInt16 music; - UInt16 sfx; // TODO : remove - UInt16 speech; - UInt16 audiocd; - } volume; - - struct { - // midi - Boolean multiMidi; - Boolean music; // TODO : rename this, it is enable audio option - UInt8 drvMusic; - UInt8 tempo; - // sound FX - Boolean sfx; // TODO : remove this - UInt8 rate; - // CD audio - Boolean CD; - UInt8 drvCD, frtCD; - UInt16 defaultTrackLength; - UInt16 firstTrack; - } sound; -} MusicInfoType; - -typedef struct { - UInt32 version; - UInt16 icnID; // icon to display on the list - Boolean selected; - - Char nameP[50]; // game name to display in list - Char pathP[150]; // path to the game files - Char gameP[15]; // scumm name of the game - UInt16 gfxMode; - - Boolean autoLoad; - Boolean bootParam; - Boolean setPlatform; - Boolean subtitles; - Boolean talkSpeed; - - UInt16 loadSlot; - UInt16 bootValue; - UInt16 talkValue; - UInt8 platform; - UInt8 language; // |- v2.5 - - Boolean filter; // v2.6 - Boolean fullscreen; // | - Boolean aspectRatio; // |- v2.7 - - MusicInfoType musicInfo;// v3.0 - - UInt8 engine; // |- v3.1 - UInt8 renderMode; // |- v3.2 -// Boolean use16Bit; // |- v3.3 // removed - UInt8 fmQuality; // |- v3.4 // replace use16Bit -} GameInfoType; - -enum { - ENGINE_AGOS = 0, - ENGINE_SKY, - ENGINE_SWORD1, - ENGINE_SWORD2, - ENGINE_CINE, - ENGINE_QUEEN, - ENGINE_LURE, - ENGINE_GOB, - ENGINE_KYRA, - ENGINE_PARALLACTION, - ENGINE_SAGA, - ENGINE_SCUMM, - ENGINE_AGI, - ENGINE_TOUCHE, - ENGINE_CRUISE, - ENGINE_DRASCULA, - ENGINE_COUNT -}; - -static const struct { - const char *fileP; - const char *nameP; -} engines[] = { - { "agos", "AGOS Engine" }, - { "sky", "Beneath a Steel Sky" }, - { "sword1", "Broken Sword I" }, - { "sword2", "Broken Sword II" }, - { "cine", "Delphine Cinematique v1.0" }, - { "queen", "Flight of the Amazon Queen" }, - { "lure", "Lure of the Tempress" }, - { "gob", "Gobliiins, Bargon Attack and more" }, - { "kyra", "Kyrandia" }, - { "parallaction", "Parallaction" }, - { "saga", "SAGA Engine" }, - { "scumm", "Scumm Games" }, - { "agi", "Sierra AGI" }, - { "touche", "Touche: The Adventures of the Fifth Musketeer" }, - { "cruise", "Beta -> Cruise for a Corpse" }, - { "drascula", "Beta -> Drascula" }, -}; - -// protos -Err GamOpenDatabase (); -void GamImportDatabase (); -void GamCloseDatabase (Boolean ignoreCardParams); -Err GamSortList (); -UInt16 GamGetSelected (); -void GamUnselect (); -Boolean GamJumpTo (Char letter); - -extern DmOpenRef gameDB; - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/launch.cpp b/backends/platform/PalmOS/Src/launcher/launch.cpp deleted file mode 100644 index d83a34e94c..0000000000 --- a/backends/platform/PalmOS/Src/launcher/launch.cpp +++ /dev/null @@ -1,512 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include "StarterRsc.h" - -#include "games.h" -#include "start.h" -#include "rumble.h" -#include "globals.h" -#include "features.h" -#include "formUtil.h" -#include "formCards.h" -#include "palmdefs.h" - -#include "init_palmos.h" -#include "init_stuffs.h" - -#include "modules.h" -#include "args.h" - - -#define BUILD_ERROR(m) \ - { StrCopy(msg, m); \ - StrCat(msg, "\n\nPlease check that all required files are installed on your card, and you have enough free storage memory."); \ - goto onError; } - -#define BUILD_FILE(h,m) \ - StrCopy(filename, "/Palm/Programs/ScummVM/Mods/"); \ - StrCat(filename, h); \ - StrCat(filename, m); - -#define FIND_FILE() \ - if (*volRefNum == vfsInvalidVolRef) \ - *volRefNum = ModFind(filename); - - -#define CHECK_FILE(m) \ - e = VFSFileOpen(*volRefNum, filename, vfsModeRead, &file); \ - if (e) \ - BUILD_ERROR(m) \ - else \ - VFSFileClose(file); - -#define IMPRT_FILE(m) \ - e = VFSImportDatabaseFromFile(*volRefNum, filename, &cardNo, &dbID); \ - if (e) \ - BUILD_ERROR(m) - -#define DELET_FILE(f) \ - del_dbID = DmFindDatabase(0, f); \ - if (del_dbID) \ - DmDeleteDatabase(0, del_dbID); - -void ModDelete() { - LocalID del_dbID; - - DELET_FILE("Glbs::Common"); - DELET_FILE("Glbs::Engine"); - DELET_FILE("ScummVM-Engine"); -} - -UInt16 ModFind(const Char *f) { - Err e; - UInt16 volRefNum; - FileRef r; - UInt32 volIterator = vfsIteratorStart|vfsIncludePrivateVolumes; - while (volIterator != vfsIteratorStop) { - e = VFSVolumeEnumerate(&volRefNum, &volIterator); - - if (!e) e = VFSFileOpen(volRefNum, f, vfsModeRead, &r); - if (!e) e = VFSFileClose(r); - if (!e) break; - } - - return volRefNum; -} - -static void ModSetStack(UInt32 newSize, UInt16 cardNo, LocalID dbID) { - DmOpenRef dbRef = DmOpenDatabase(cardNo, dbID, dmModeReadWrite); - - if (dbRef) { - MemHandle pref = DmGetResource('pref',0); - UInt32 size = 0; - - if (pref) { - SysAppPrefsType *data = (SysAppPrefsType *)MemHandleLock(pref); - size = data->stackSize; - - if (newSize) { - SysAppPrefsType newData; - MemMove(&newData, data, sizeof(SysAppPrefsType)); - newData.stackSize = newSize; - DmWrite(data, 0, &newData, sizeof(SysAppPrefsType)); - } - - MemPtrUnlock(data); - DmReleaseResource(pref); - } - - DmCloseDatabase(dbRef); - } -} - -static Err ModImport(UInt16 *volRefNum, UInt8 engine, Boolean *armP) { -#ifndef _DEBUG_ENGINE - char filename[256]; - UInt16 cardNo; - LocalID dbID; - UInt32 result; - FileRef file; -#endif - char msg[256]; - FormPtr ofmP, frmP; - Err e = errNone; - - ofmP = FrmGetActiveForm(); - frmP = FrmInitForm(ImportForm); - FrmSetActiveForm(frmP); - FrmDrawForm(frmP); - - // In debug mode, the engine files are directly uploaded to the simulator -#ifndef _DEBUG_ENGINE - // engine file ? - BUILD_FILE(engines[engine].fileP, ".engine"); - FIND_FILE (); - CHECK_FILE("ScummVM engine file was not found !"); - IMPRT_FILE("Cannot import engine file !"); - - // need more files ? - dbID = DmFindDatabase(0, "ScummVM-Engine"); // be sure to have the correct dbID - e = SysAppLaunch(cardNo, dbID, 0, sysAppLaunchCustomEngineGetInfo, 0, &result); - *armP = ((result & GET_MODEARM) == GET_MODEARM); - -/* ARM ONLY FOR NOW, NOT REQUIRED - // common file ? - if (!e && (result & GET_DATACOMMON)) { - BUILD_FILE("common", ".data"); - CHECK_FILE("Common data file was not found !"); - IMPRT_FILE("Cannot import common data file !"); - } - // data file ? - if (!e && (result & GET_DATAENGINE)) { - BUILD_FILE(engines[engine].fileP, ".data"); - CHECK_FILE("Engine data file was not found !"); - IMPRT_FILE("Cannot import engine data file !"); - } -*/ -#endif - // if error, cleanup - if (e) ModDelete(); - -onError: - FrmEraseForm(frmP); - FrmDeleteForm(frmP); - if (e) { - if (ofmP) FrmSetActiveForm(ofmP); - FrmCustomAlert(FrmErrorAlert, msg, 0, 0); - } - - return e; -} - -#undef DELET_FILE -#undef CHECK_FILE -#undef BUILD_FILE - -Boolean StartScummVM(Int16 engine) { - Char **argvP; - UInt8 lightspeed, argc = 0; - UInt32 stackSize; - Boolean toLauncher, direct, isARM; - Char num[6]; - - argvP = ArgsInit(); - direct = false; - - // start command line (exec name) - ArgsAdd(&argvP[argc], "-", NULL, &argc); - // standard path - ArgsAdd(&argvP[argc], "--themepath=", "/PALM/Programs/ScummVM/Themes", &argc); - - UInt16 index = GamGetSelected(); - // no game selected - if (index == dmMaxRecordIndex) { - if (engine == NO_ENGINE) { - // free args - ArgsFree(argvP); - return false; - } - - // default values - if (bDirectMode) - gPrefs->card.volRefNum = parseCards(); // always use the first removable card available (?) - - gVars->filter = true; - gVars->palmVolume = 50; - gVars->fmQuality = FM_QUALITY_INI; - direct = true; - - // somthing selected - } else { - Char pathP[256]; - MemHandle recordH; - GameInfoType *gameInfoP; - - recordH = DmQueryRecord(gameDB,index); - gameInfoP = (GameInfoType *)MemHandleLock(recordH); - engine = gameInfoP->engine; - - // build path - StrCopy(pathP,"/Palm/Programs/ScummVM/Games/"); - if (gameInfoP->pathP[0] == '/') - StrCopy(pathP, gameInfoP->pathP); - else if (!(gameInfoP->pathP[0] == '.' && StrLen(gameInfoP->pathP) == 1)) - StrCat(pathP, gameInfoP->pathP); - - // path - ArgsAdd(&argvP[argc], "-p", pathP, &argc); - - // language - if (gameInfoP->language > 0) { - const Char *lang = "zh\0cz\0gb\0en\0fr\0de\0hb\0it\0jp\0kr\0pl\0pt\0ru\0es\0se\0"; - ArgsAdd(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc); - } - - // fullscreen ? - if (gameInfoP->fullscreen) - ArgsAdd(&argvP[argc], "-f", NULL, &argc); - - // aspect-ratio ? - ArgsAdd(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc); - - // gfx mode - gVars->filter = gameInfoP->filter; - - switch (gameInfoP->renderMode) { - case 1: - ArgsAdd(&argvP[argc], "--render-mode=", "amiga", &argc); - break; - case 2: - ArgsAdd(&argvP[argc], "--render-mode=", "cga", &argc); - break; - case 3: - ArgsAdd(&argvP[argc], "--render-mode=", "ega", &argc); - break; - case 4: - ArgsAdd(&argvP[argc], "--render-mode=", "hercAmber", &argc); - break; - case 5: - ArgsAdd(&argvP[argc], "--render-mode=", "hercGreen", &argc); - break; - } - - switch (gameInfoP->gfxMode) { - case 1: - ArgsAdd(&argvP[argc], "-g", "wide", &argc); - break; - default: - ArgsAdd(&argvP[argc], "-g", "1x", &argc); - break; - } - - // load state - if (gameInfoP->autoLoad) { - StrIToA(num, gameInfoP->loadSlot); - ArgsAdd(&argvP[argc], "-x", num, &argc); - } - // boot script parameter - if (gameInfoP->bootParam) { - StrIToA(num, gameInfoP->bootValue); - ArgsAdd(&argvP[argc], "-b", num, &argc); - } - // not a PC version - if (gameInfoP->setPlatform) { - static const char *platform[] = { - "3do", - "acorn", - "amiga", - "2gs", - "atari", - "c64", - "pc", - "fmtowns", - "linux", - "mac", - "nes", - "segacd", - "windows" - }; - ArgsAdd(&argvP[argc], "--platform=", platform[gameInfoP->platform], &argc); - } - - // subtitles - if (gameInfoP->subtitles) - ArgsAdd(&argvP[argc], "-n", NULL, &argc); - - // multi midi ? - if (gameInfoP->musicInfo.sound.multiMidi) - ArgsAdd(&argvP[argc], "--multi-midi", NULL, &argc); - - if (engine == ENGINE_SCUMM) { - // music tempo - StrIToA(num, gameInfoP->musicInfo.sound.tempo); - ArgsAdd(&argvP[argc], "--tempo=", num, &argc); - } - - // talk speed - if (gameInfoP->talkSpeed) { - StrIToA(num, gameInfoP->talkValue); - ArgsAdd(&argvP[argc], "--talkspeed=", num, &argc); - } - - // music driver - if (gameInfoP->musicInfo.sound.music) { - static char *drv[] = { - "auto", - "null", - "adlib", - "towns", - "pcjr", - "native", - "pcspk" - }; - - if (StrCompare(drv[gameInfoP->musicInfo.sound.drvMusic], "native") == 0) { - if (OPTIONS_TST(kOptDeviceZodiac)) - ArgsAdd(&argvP[argc], "-e", "zodiac", &argc); // Tapwave Zodiac - else if (OPTIONS_TST(kOptSonyPa1LibAPI)) - ArgsAdd(&argvP[argc], "-e", "ypa1", &argc); // Pa1Lib devices - else - ArgsAdd(&argvP[argc], "-e", "auto", &argc); // no driver, switch to auto - } else { - ArgsAdd(&argvP[argc], "-e", drv[gameInfoP->musicInfo.sound.drvMusic], &argc); - } - - // output rate - UInt32 rates[] = {4000, 8000, 11025, 22050, 44100}; - StrIToA(num, rates[gameInfoP->musicInfo.sound.rate]); - ArgsAdd(&argvP[argc], "--output-rate=", num, &argc); - - // FM quality - gVars->fmQuality = gameInfoP->fmQuality; - - } else { - ArgsAdd(&argvP[argc], "-e", "null", &argc); - } - - // volume control - StrIToA(num, gameInfoP->musicInfo.volume.sfx); - ArgsAdd(&argvP[argc], "-s", num, &argc); - StrIToA(num, gameInfoP->musicInfo.volume.music); - ArgsAdd(&argvP[argc], "-m", num, &argc); - StrIToA(num, gameInfoP->musicInfo.volume.speech); - ArgsAdd(&argvP[argc], "-r", num, &argc); - - // game name - ArgsAdd(&argvP[argc], gameInfoP->gameP, NULL, &argc); - - gVars->palmVolume = gameInfoP->musicInfo.sound.music ? gameInfoP->musicInfo.volume.palm : 0; - - MemHandleUnlock(recordH); - } // end no game / game selected - - // common command line options - - // debug level - if (gPrefs->debug) { - StrIToA(num, gPrefs->debugLevel); - ArgsAdd(&argvP[argc], "-d", num, &argc); - } - - if (engine == ENGINE_QUEEN || engine == ENGINE_SKY) { - // alternative intro ? - if (gPrefs->altIntro) - ArgsAdd(&argvP[argc], "--alt-intro", NULL, &argc); - } - - if (engine == ENGINE_SCUMM) { - // demo mode ? - if (gPrefs->demoMode) - ArgsAdd(&argvP[argc], "--demo-mode", NULL, &argc); - } - - // copy protection ? - if (gPrefs->copyProtection) - ArgsAdd(&argvP[argc], "--copy-protection", NULL, &argc); - - // exceed max args ? - if (argc > MAX_ARG) - FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0); - - // set some common options - stackSize = (gPrefs->setStack ? STACK_LARGER : STACK_DEFAULT); - lightspeed= (gPrefs->lightspeed.enable ? gPrefs->lightspeed.mode : 255); - toLauncher= (gPrefs->exitLauncher); - - // gVars values - // (gVars->HRrefNum defined in checkHRmode on Clie) -#ifndef _DEBUG_ENGINE - gVars->VFS.volRefNum = (gPrefs->card.autoDetect ? vfsInvalidVolRef : gPrefs->card.volRefNum); -#else - gVars->VFS.volRefNum = gPrefs->card.volRefNum; -#endif - gVars->vibrator = gPrefs->vibrator; - gVars->stdPalette = gPrefs->stdPalette; - gVars->VFS.cacheSize = (gPrefs->card.useCache ? gPrefs->card.cacheSize : 0); - gVars->indicator.showLED= gPrefs->card.showLED; - gVars->stylusClick = gPrefs->stylusClick; - gVars->autoSave = (gPrefs->autoSave ? gPrefs->autoSavePeriod : -1); - gVars->advancedMode = gPrefs->advancedMode; - gVars->arrowKeys = gPrefs->arrowKeys; - - // user params - HWR_RSTALL(); - - if (gPrefs->goLCD) - HWR_SET(INIT_GOLCD); - else - OPTIONS_RST(kOptGoLcdAPI); - - if (!gPrefs->autoOff) - HWR_SET(INIT_AUTOOFF); - - if (gVars->vibrator) - HWR_SET(INIT_VIBRATOR); -/* ???? - if ( musicDriver == 1 || - musicDriver == 3 || - musicDriver == 4 || - musicDriver == sysInvalidRefNum) { - HWR_SET(INIT_PA1LIB); - } -*/ - if (ModImport(&gVars->VFS.volRefNum, engine, &isARM) != errNone) { - if (bDirectMode) { - // and force exit if nothing selected - EventType event; - event.eType = keyDownEvent; - event.data.keyDown.chr = vchrLaunch; - event.data.keyDown.modifiers = commandKeyMask; - EvtAddUniqueEventToQueue(&event, 0, true); - } - ArgsFree(argvP); - return false; - } - - // reset mode if screen rotation occurred (DIA only) - if (!direct && OPTIONS_TST(kOptCollapsible)) { - UInt8 mode = PalmScreenSize(0,0, &(gVars->screenFullWidth), &(gVars->screenFullHeight)); - OPTIONS_RST(kOptModeLandscape); - OPTIONS_SET((mode == PALM_LANDSCAPE) ? kOptModeLandscape : kOptNone); - } - - // free and save globals pref memory - GamCloseDatabase(false); - FrmCloseAllForms(); - SavePrefs(); - - { - UInt16 cardNo; - UInt32 dbID; - - LaunchParamType *cmdPBP = (LaunchParamType *)MemPtrNew(sizeof(LaunchParamType)); - - MemPtrSetOwner(cmdPBP, 0); - MemPtrSetOwner(gVars, 0); - ArgsSetOwner(argvP, 0); - - cardNo = 0; - dbID = DmFindDatabase(0, "ScummVM-Engine"); - - if (isARM) - FtrSet(appFileCreator, ftrStack , (stackSize * 4)); - else - ModSetStack(stackSize, cardNo, dbID); - - cmdPBP->args.argc = argc; - cmdPBP->args.argv = argvP; - cmdPBP->gVars = gVars; - cmdPBP->lightspeed = lightspeed; - cmdPBP->exitLauncher = toLauncher; - - SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch, cmdPBP); - bLaunched = true; - } - - return false; -} diff --git a/backends/platform/PalmOS/Src/launcher/skin.cpp b/backends/platform/PalmOS/Src/launcher/skin.cpp deleted file mode 100644 index 4c3f722aa1..0000000000 --- a/backends/platform/PalmOS/Src/launcher/skin.cpp +++ /dev/null @@ -1,612 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include -#include - -#include "start.h" -#include "games.h" -#include "globals.h" -#include "skin.h" -#include "StarterRsc.h" - -UInt16 lastIndex = dmMaxRecordIndex; // last select index in the list to prevent flash -static WinHandle winLockH = NULL; - -MemPtr SknScreenLock(WinLockInitType initMode) { - Err e; - RectangleType r; - - WinGetBounds(WinGetDisplayWindow(), &r); - winLockH = WinCreateOffscreenWindow(r.extent.x, r.extent.y, nativeFormat, &e); - WinSetDrawWindow(winLockH); - - if (initMode == winLockCopy) - WinCopyRectangle(WinGetDisplayWindow(), winLockH, &r, 0, 0, winPaint); - - return BmpGetBits(WinGetBitmap(winLockH)); -} - -void SknScreenUnlock() { - RectangleType r; - - WinGetBounds(winLockH, &r); - WinCopyRectangle(winLockH, WinGetDisplayWindow(), &r, 0, 0, winPaint); - WinSetDrawWindow(WinGetDisplayWindow()); - WinDeleteWindow(winLockH, false); - winLockH = NULL; -} - -static void SknGetListColors(DmOpenRef skinDBP, UInt8 *text, UInt8 *selected, UInt8 *background) { - UInt16 colIndex; - MemHandle colH; - UInt8 *colTemp; - - // default - *text = UIColorGetTableEntryIndex (UIMenuForeground); - *selected = UIColorGetTableEntryIndex (UIMenuSelectedForeground); - *background = UIColorGetTableEntryIndex (UIMenuSelectedFill); - - if (skinDBP) { - colIndex = DmFindResource (skinDBP, sknColorsRsc, skinColors, NULL); - - if (colIndex != (UInt16)-1) { - colH = DmGetResourceIndex(skinDBP, colIndex); - - if (colH) { - colTemp = (UInt8 *)MemHandleLock(colH); - - *text = colTemp[0]; - *selected = colTemp[1]; - *background = colTemp[2]; - - MemPtrUnlock(colTemp); - DmReleaseResource(colH); - } - } - } -} - -static void SknCopyBits(DmOpenRef skinDBP, DmResID bitmapID, const RectangleType *srcRect, Coord destX, Coord destY) { - MemHandle hTemp; - BitmapPtr bmpTemp; - UInt16 index; - - Coord cx, cy, cw, ch, bw, bh; - RectangleType copy, old; - - if (skinDBP) { - // find the bitmap - index = DmFindResource (skinDBP, bitmapRsc, bitmapID, NULL); - - if (index != (UInt16)-1) { - hTemp = DmGetResourceIndex(skinDBP,index); - - if (hTemp) { - bmpTemp = (BitmapType *)MemHandleLock(hTemp); - BmpGlueGetDimensions(bmpTemp, &bw, &bh, 0); - - if (!srcRect) { - cx = 0; - cy = 0; - cw = bw; - ch = bh; - } else { - cx = srcRect->topLeft.x; - cy = srcRect->topLeft.y; - cw = srcRect->extent.x; - ch = srcRect->extent.y; - } - - if (ch) { - WinGetClip(&old); - if (OPTIONS_TST(kOptModeHiDensity)) { - Err e; - BitmapTypeV3 *bmp2P; - - // create an uncompressed version of the bitmap - WinHandle win = WinCreateOffscreenWindow(bw, bh, screenFormat, &e); - WinHandle old = WinGetDrawWindow(); - WinSetDrawWindow(win); - WinDrawBitmap(bmpTemp, 0, 0); - WinSetDrawWindow(old); - - bmp2P = BmpCreateBitmapV3(WinGetBitmap(win), kDensityDouble, BmpGetBits(WinGetBitmap(win)), NULL); - - copy.topLeft.x = destX / 2; - copy.topLeft.y = destY / 2; - copy.extent.x = cw / 2; - copy.extent.y = ch / 2; - - WinSetClip(©); - WinDrawBitmap((BitmapPtr)bmp2P, (destX - cx) / 2, (destY - cy) / 2); - BmpDelete((BitmapPtr)bmp2P); - WinDeleteWindow(win, false); - - } else { - copy.topLeft.x = destX; - copy.topLeft.y = destY; - copy.extent.x = cw; - copy.extent.y = ch; - - HRWinSetClip(gVars->HRrefNum, ©); - HRWinDrawBitmap(gVars->HRrefNum, bmpTemp, destX - cx, destY - cy); - } - WinSetClip(&old); - } - - MemPtrUnlock(bmpTemp); - DmReleaseResource(hTemp); - } - } - } -} - -void SknApplySkin() { - DmOpenRef skinDBP; - RectangleType r; - FormPtr frmP = FrmGetActiveForm(); - - // draw skin - FrmDrawForm(frmP); - SknScreenLock(winLockCopy); - - skinDBP = SknOpenSkin(); - - if (gPrefs->card.volRefNum != vfsInvalidVolRef) - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSBitMap)); - else - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSNoneBitMap)); - - WinSetForeColor(255); - WinSetDrawMode(winPaint); - WinDrawLine (0, 14, 159, 14); - WinDrawLine (0, 13, 159, 13); - - SknGetObjectBounds(skinDBP, skinBackgroundImageTop, &r); - SknCopyBits(skinDBP, skinBackgroundImageTop, 0, r.topLeft.x, r.topLeft.y); - SknGetObjectBounds(skinDBP, skinBackgroundImageBottom, &r); - SknCopyBits(skinDBP, skinBackgroundImageBottom, 0, r.topLeft.x, r.topLeft.y); - - for (UInt16 resID = 1100; resID <= 7000; resID += 100) { - SknSetState(skinDBP, resID, sknStateNormal); - SknShowObject(skinDBP, resID); - } - - SknCloseSkin(skinDBP); - SknScreenUnlock(); - SknUpdateList(); -} - -void SknGetObjectBounds(DmOpenRef skinDBP, DmResID resID, RectangleType *rP) { - - UInt16 bmpIndex, strIndex; - MemHandle hBmp, hStr; - BitmapType *bmpTemp; - UInt8 *strTemp; - - RctSetRectangle(rP, 0, 0, 0, 0); - - if (skinDBP) { - bmpIndex = DmFindResource (skinDBP, bitmapRsc, resID, NULL); - - if (bmpIndex != (UInt16)-1) { // if bmp exists - strIndex = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (strIndex != (UInt16)-1) { // if params exist - hBmp = DmGetResourceIndex(skinDBP,bmpIndex); - - if (hBmp) { - hStr = DmGetResourceIndex(skinDBP,strIndex); - - if (hStr) { - // buttons : state|x|y|w/h slider|draw mode|x1/y1 keep|x2/y2 keep slider - // list (160mode) : state|x|y|w|h| - bmpTemp = (BitmapType *)MemHandleLock(hBmp); - strTemp = (UInt8 *)MemHandleLock(hStr); - - BmpGlueGetDimensions(bmpTemp, &(rP->extent.x), &(rP->extent.y), 0); - rP->topLeft.x = strTemp[sknInfoPosX] * 2; - rP->topLeft.y = strTemp[sknInfoPosY] * 2; - - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - - MemPtrUnlock(bmpTemp); - DmReleaseResource(hBmp); - } - } - } - } -} - -DmOpenRef SknOpenSkin() { - return DmOpenDatabase(gPrefs->skin.cardNo, gPrefs->skin.dbID, dmModeReadOnly); -} - -void SknCloseSkin(DmOpenRef skinDBP) { - if (skinDBP) - DmCloseDatabase(skinDBP); -} - -UInt8 SknSetState(DmOpenRef skinDBP, DmResID resID, UInt8 newState) { - - UInt16 index; - MemHandle hStr; - UInt8 *strTemp; - UInt8 oldState = 0; - - if (skinDBP) { - index = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (index != (UInt16)-1) { - hStr = DmGetResourceIndex(skinDBP, index); - - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - oldState = strTemp[sknInfoState]; - - if (oldState != newState) { - DmWrite(strTemp, 0, &newState, 1); - } - - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - } - } - - return oldState; -} - -UInt8 SknGetDepth(DmOpenRef skinDBP) { - UInt16 index; - MemHandle hStr; - UInt8 *strTemp; - UInt8 depth = 8; - - if (skinDBP) { - index = DmFindResource (skinDBP, sknDepthRsc, skinDepth, NULL); - - if (index != (UInt16)-1) { - hStr = DmGetResourceIndex(skinDBP, index); - - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - depth = *strTemp; - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - } - } - - return depth; -} - -UInt8 SknGetState(DmOpenRef skinDBP, DmResID resID) { - UInt16 index; - MemHandle hStr; - UInt8 *strTemp; - UInt8 oldState = sknStateDisabled; - - if (skinDBP) { - index = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (index != (UInt16)-1) { - hStr = DmGetResourceIndex(skinDBP, index); - - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - oldState = strTemp[sknInfoState]; - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - } - } - - return oldState; -} - -void SknShowObject(DmOpenRef skinDBP, DmResID resID) { - RectangleType r; - UInt8 state = SknGetState(skinDBP, resID); - SknGetObjectBounds(skinDBP, resID, &r); - SknCopyBits(skinDBP, resID + state, NULL, r.topLeft.x, r.topLeft.y); -} - -void SknGetListBounds(RectangleType *rAreaP, RectangleType *rArea2xP) { - DmOpenRef skinDBP; - UInt16 strIndex; - MemHandle hStr; - UInt8 *strTemp; - UInt16 x,y,w,h; - - skinDBP = DmOpenDatabase(gPrefs->skin.cardNo, gPrefs->skin.dbID, dmModeReadOnly); - if (skinDBP) { - strIndex = DmFindResource (skinDBP, sknPosRsc, skinList, NULL); - - if (strIndex != 0xFFFF) { // if params exist - hStr = DmGetResourceIndex(skinDBP,strIndex); - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - - x = strTemp[sknInfoPosX]; - y = strTemp[sknInfoPosY]; - w = strTemp[sknInfoListWidth]; - h = strTemp[sknInfoListSize] * sknInfoListItemSize; - - if (rAreaP) - RctSetRectangle(rAreaP ,x, y, w, h); - if (rArea2xP) - RctSetRectangle(rArea2xP, x+x, y+y, w+w, h+h); - - MemHandleUnlock(hStr); - DmReleaseResource(hStr); - } - } - - DmCloseDatabase(skinDBP); - } -} - -static void SknRedrawTools(DmOpenRef skinDBP) { - if (GamGetSelected() == dmMaxRecordIndex) { - if (SknGetState(skinDBP, skinButtonGameDelete) == sknStateNormal) { - SknSetState(skinDBP, skinButtonGameDelete,sknStateDisabled); - SknShowObject(skinDBP, skinButtonGameDelete); - } - if (SknGetState(skinDBP, skinButtonGameEdit) == sknStateNormal) { - SknSetState(skinDBP, skinButtonGameEdit,sknStateDisabled); - SknShowObject(skinDBP, skinButtonGameEdit); - } - if (SknGetState(skinDBP, skinButtonGameAudio) == sknStateNormal) { - SknSetState(skinDBP, skinButtonGameAudio,sknStateDisabled); - SknShowObject(skinDBP, skinButtonGameAudio); - } - - } else { - if (SknGetState(skinDBP, skinButtonGameDelete) == sknStateDisabled) { - SknSetState(skinDBP, skinButtonGameDelete,sknStateNormal); - SknShowObject(skinDBP, skinButtonGameDelete); - } - if (SknGetState(skinDBP, skinButtonGameEdit) == sknStateDisabled) { - SknSetState(skinDBP, skinButtonGameEdit,sknStateNormal); - SknShowObject(skinDBP, skinButtonGameEdit); - } - if (SknGetState(skinDBP, skinButtonGameAudio) == sknStateDisabled) { - SknSetState(skinDBP, skinButtonGameAudio,sknStateNormal); - SknShowObject(skinDBP, skinButtonGameAudio); - } - } -} - -static void SknRedrawSlider(DmOpenRef skinDBP, UInt16 index, UInt16 maxIndex, UInt16 perPage) { - if (maxIndex <= perPage) { - if (SknGetState(skinDBP,skinSliderUpArrow) != sknStateDisabled) { - SknSetState(skinDBP,skinSliderUpArrow,sknStateDisabled); - SknShowObject(skinDBP,skinSliderUpArrow); - } - if (SknGetState(skinDBP,skinSliderDownArrow) != sknStateDisabled) { - SknSetState(skinDBP,skinSliderDownArrow,sknStateDisabled); - SknShowObject(skinDBP,skinSliderDownArrow); - } - - } else { - if (SknGetState(skinDBP,skinSliderUpArrow) == sknStateDisabled) { - SknSetState(skinDBP,skinSliderUpArrow,sknStateNormal); - SknShowObject(skinDBP,skinSliderUpArrow); - } - if (SknGetState(skinDBP,skinSliderDownArrow) == sknStateDisabled) { - SknSetState(skinDBP,skinSliderDownArrow,sknStateNormal); - SknShowObject(skinDBP,skinSliderDownArrow); - } - } -} - -void SknUpdateList() { - MemHandle record; - Int32 index, maxIndex, maxView; - GameInfoType *game; - RectangleType rArea, rField, rCopy, rArea2x; - DmOpenRef skinDBP; - - UInt8 txtColor, norColor, selColor, bkgColor; - UInt16 x,y; - - SknScreenLock(winLockCopy); - - SknGetListBounds(&rArea, &rArea2x); - skinDBP = SknOpenSkin(); - // set default bg - WinSetForeColor(UIColorGetTableEntryIndex (UIFormFill)); - WinDrawRectangle(&rArea,0); - // copy top bg - SknGetObjectBounds(skinDBP, skinBackgroundImageTop, &rField); - RctGetIntersection(&rArea2x, &rField, &rCopy); - x = rCopy.topLeft.x; - y = rCopy.topLeft.y; - rCopy.topLeft.x -= rField.topLeft.x; - rCopy.topLeft.y -= rField.topLeft.y; - SknCopyBits(skinDBP, skinBackgroundImageTop, &rCopy, x, y); - // copy bottom bg - SknGetObjectBounds(skinDBP, skinBackgroundImageBottom, &rField); - RctGetIntersection(&rArea2x, &rField, &rCopy); - x = rCopy.topLeft.x; - y = rCopy.topLeft.y; - rCopy.topLeft.x -= rField.topLeft.x; - rCopy.topLeft.y -= rField.topLeft.y; - SknCopyBits(skinDBP, skinBackgroundImageBottom, &rCopy, x, y); - - FntSetFont(stdFont); - - index = gPrefs->listPosition; - maxIndex = DmNumRecords(gameDB); - maxView = rArea.extent.y / sknInfoListItemSize; - - if (index > 0 && (index + maxView) > maxIndex) - index -= (index + maxView) - maxIndex; - - if (index < 0) - index = 0; - - gPrefs->listPosition = index; - - SknRedrawSlider(skinDBP, index, maxIndex, maxView); - SknRedrawTools(skinDBP); - SknGetListColors(skinDBP, &norColor, &selColor, &bkgColor); - - SknCloseSkin(skinDBP); - - while (index < (gPrefs->listPosition + maxView) && index < maxIndex) { - record = DmQueryRecord(gameDB, index); - game = (GameInfoType *)MemHandleLock(record); - - // text box - RctSetRectangle(&rField, rArea.topLeft.x, (rArea.topLeft.y + sknInfoListItemSize * (index - gPrefs->listPosition)), rArea.extent.x, sknInfoListItemSize); - WinSetClip(&rField); - - if (game->selected) { - WinSetDrawMode(winPaint); - WinSetForeColor(bkgColor); - WinDrawRectangle(&rField,0); - txtColor = selColor; - } - else - txtColor = norColor; - - // clipping - rField.topLeft.x += 2; - rField.extent.x -= 4; - WinSetClip(&rField); - // draw text mask - WinSetTextColor(255); - WinSetDrawMode(winMask); - WinPaintChars(game->nameP, StrLen(game->nameP), rField.topLeft.x, rField.topLeft.y); - // draw text - if (txtColor) { - WinSetTextColor(txtColor); - WinSetDrawMode(winOverlay); - WinPaintChars(game->nameP, StrLen(game->nameP), rField.topLeft.x, rField.topLeft.y); - } - - MemHandleUnlock(record); - index++; - } - - RctSetRectangle(&rArea,0,0,160,160); - WinSetClip(&rArea); - SknScreenUnlock(); -} - -UInt16 SknCheckClick(DmOpenRef skinDBP, Coord mx, Coord my) { - UInt16 resID; - RectangleType r; - - mx *= 2; - my *= 2; - - if (skinDBP) { - for (resID = 1100; resID <= 7000; resID += 100) { - if (SknGetState(skinDBP, resID) != sknStateDisabled) { - SknGetObjectBounds(skinDBP, resID, &r); - if (RctPtInRectangle(mx, my, &r)) { - return resID; - } - } - } - } - - return 0; -} - -void SknSelect(Coord x, Coord y) { - RectangleType rArea; - SknGetListBounds(&rArea,0); - - if (RctPtInRectangle(x, y, &rArea)) { - UInt16 index; - MemHandle record; - GameInfoType *game; - UInt16 oldIndex; - - index = (y - rArea.topLeft.y) / sknInfoListItemSize + gPrefs->listPosition; - - if (index == lastIndex) - return; - - if (index < DmNumRecords(gameDB)) { - Boolean newValue; - - oldIndex = GamGetSelected(); - - if (oldIndex != index && oldIndex != dmMaxRecordIndex) - GamUnselect(); - - record = DmGetRecord(gameDB, index); - game = (GameInfoType *)MemHandleLock(record); - - newValue = !game->selected; - DmWrite(game, OffsetOf(GameInfoType,selected), &newValue, sizeof(Boolean)); - - MemHandleUnlock(record); - DmReleaseRecord (gameDB, index, 0); - - lastIndex = index; - SknUpdateList(); - } - } -} - -Boolean SknProcessArrowAction(UInt16 button) { - Boolean handled = false; - - switch (button) { - case skinSliderUpArrow: - if (gPrefs->listPosition > 0) { - gPrefs->listPosition--; - SknUpdateList(); - } - handled = true; - break; - - case skinSliderDownArrow: - RectangleType rArea; - UInt16 maxView; - - SknGetListBounds(&rArea, 0); - maxView = rArea.extent.y / sknInfoListItemSize; - - if (gPrefs->listPosition < DmNumRecords(gameDB)-maxView) { - gPrefs->listPosition++; - SknUpdateList(); - } - handled = true; - break; - } - - return handled; -} diff --git a/backends/platform/PalmOS/Src/launcher/skin.h b/backends/platform/PalmOS/Src/launcher/skin.h deleted file mode 100644 index e8a81e7e2d..0000000000 --- a/backends/platform/PalmOS/Src/launcher/skin.h +++ /dev/null @@ -1,131 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __SKIN_H__ -#define __SKIN_H__ - -// skin -#define sknInfoState 0 -#define sknInfoPosX 1 -#define sknInfoPosY 2 - -#define sknInfoMaxWOrH 3 -#define sknInfoDrawMode 4 -#define sknInfoKeepXOrY1 5 -#define sknInfoKeepXOrY2 7 - -#define sknInfoListWidth sknInfoMaxWOrH -#define sknInfoListHeight sknInfoDrawMode -#define sknInfoListSize sknInfoListHeight -#define sknInfoListItemSize 12 - -#define sknPosRsc 'sPos' -#define sknColorsRsc 'sCol' -#define sknDepthRsc 'sDep' - -#define sknStateNormal 0 -#define sknStateSelected 10 -#define sknStateDisabled 20 - -#define sknSelectedState(bmp) (bmp + sknStateSelected) -#define sknDisabledState(bmp) (bmp + sknStateDisabled) - -// skin elements -#define skinList 500 -#define skinColors 600 -#define skinDepth 700 - -#define skinButtonNone 0 - -#define skinSliderUpArrow 2000 -#define skinSliderDownArrow 2100 - -#define skinButtonGameParams 3000 -#define skinButtonGameAdd 3100 -#define skinButtonGameEdit 3200 -#define skinButtonGameAudio 3300 -#define skinButtonGameDelete 4000 -#define skinButtonGameStart 7000 - -#define skinBackgroundImageTop 1000 -#define skinBackgroundImageBottom 1010 -/// - - -#define skinToolsBackground 1100 - -#define skinListUpArrowNormal 1500 -#define skinListUpArrowOver 1510 -#define skinListUpArrowDisabled 1540 - -#define skinListDownArrowNormal 1800 -#define skinListDownArrowOver 1810 -#define skinListDownArrowDisabled 1840 - -#define skinButtonGameInfoNormal 2000 -#define skinButtonGameInfoOver 2010 -#define skinButtonGameInfoDisabled 2040 - -#define skinButtonGameParamNormal 3000 -#define skinButtonGameParamOver 3010 - -#define skinButtonGameDeleteNormal 4000 -#define skinButtonGameDeleteOver 4010 -#define skinButtonGameDeleteDisabled 4040 - -#define skinButtonVibratorNormal 5000 -#define skinButtonVibratorOver 5010 -#define skinButtonVibratorSelected 5020 -#define skinButtonVibratorSelectedOver 5030 -#define skinButtonVibratorDisabled 5040 - - -#define skinButtonSleepNormal 6000 -#define skinButtonSleepOver 6010 -#define skinButtonSleepSelected 6020 -#define skinButtonSleepSelectedOver 9030 - -#define skinButtonPlayNormal 7000 -#define skinButtonPlayOver 7010 -#define skinButtonPlayDisabled 7040 - -// protos -void SknApplySkin(); -void SknGetObjectBounds(DmOpenRef skinDBP, DmResID resID, RectangleType *rP); -DmOpenRef SknOpenSkin(); -void SknCloseSkin(DmOpenRef skinDBP); -UInt8 SknSetState(DmOpenRef skinDBP, DmResID resID, UInt8 newState); -void SknShowObject(DmOpenRef skinDBP, DmResID resID); -UInt8 SknGetState(DmOpenRef skinDBP, DmResID resID); -void SknUpdateList(); -void SknGetListBounds(RectangleType *rAreaP, RectangleType *rArea2xP); -UInt16 SknCheckClick(DmOpenRef skinDBP, Coord mx, Coord my); -void SknSelect(Coord x, Coord y); -Boolean SknProcessArrowAction(UInt16 button); -UInt8 SknGetDepth(DmOpenRef skinDBP); - -extern UInt16 lastIndex; - -#endif diff --git a/backends/platform/PalmOS/Src/launcher/start.cpp b/backends/platform/PalmOS/Src/launcher/start.cpp deleted file mode 100644 index b5e8f24884..0000000000 --- a/backends/platform/PalmOS/Src/launcher/start.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include - -#include "palmdefs.h" -#include "start.h" -#include "games.h" -#include "globals.h" -#include "modules.h" -#include "skin.h" - -#include "forms.h" - -/*********************************************************************** - * - * Global variables - * - ***********************************************************************/ -GlobalsPreferencePtr gPrefs; -GlobalsDataPtr gVars; - -Boolean bDirectMode = false; -Boolean bLaunched = false; - -/*********************************************************************** - * - * Internal Constants - * - ***********************************************************************/ - -// Define the minimum OS version we support (3.5 for now). -#define kOurMinVersion sysMakeROMVersion(3,5,0,sysROMStageRelease,0) -#define kPalmOS10Version sysMakeROMVersion(1,0,0,sysROMStageRelease,0) - -/*********************************************************************** - * - * Internal Functions - * - ***********************************************************************/ - -// Callback for ExgDBWrite to send data with Exchange Manager -static Err WriteDBData(const void* dataP, UInt32* sizeP, void* userDataP) { - Err err; - *sizeP = ExgSend((ExgSocketPtr)userDataP, (void*)dataP, *sizeP, &err); - return err; -} - -Err SendDatabase (UInt16 cardNo, LocalID dbID, Char *nameP, Char *descriptionP) { - ExgSocketType exgSocket; - Err err; - - // Create exgSocket structure - MemSet(&exgSocket, sizeof(exgSocket), 0); - exgSocket.description = descriptionP; - exgSocket.name = nameP; - - // Start an exchange put operation - err = ExgPut(&exgSocket); - if (!err) { - err = ExgDBWrite(WriteDBData, &exgSocket, NULL, dbID, cardNo); - err = ExgDisconnect(&exgSocket, err); - } - - return err; -} - - -/*********************************************************************** - * - * FUNCTION: RomVersionCompatible - * - * DESCRIPTION: This routine checks that a ROM version is meet your - * minimum requirement. - * - * PARAMETERS: requiredVersion - minimum rom version required - * (see sysFtrNumROMVersion in SystemMgr.h - * for format) - * launchFlags - flags that indicate if the application - * UI is initialized. - * - * RETURNED: error code or zero if rom is compatible - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err RomVersionCompatible(UInt32 requiredVersion, UInt16 launchFlags) { - UInt32 romVersion; - - // See if we're on in minimum required version of the ROM or later. - FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - if (romVersion < requiredVersion) { - if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) == - (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) { - - FrmAlert (RomIncompatibleAlert); - - // Palm OS 1.0 will continuously relaunch this app unless we switch to - // another safe one. - if (romVersion <= kPalmOS10Version) - AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL); - - } - return sysErrRomIncompatible; - } - - return errNone; -} - -/////////////////////////////////////////////////////////////////////// - - -void SavePrefs() { - if (gPrefs) { - PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, gPrefs, sizeof (GlobalsPreferenceType), true); - MemPtrFree(gPrefs); - gPrefs = NULL; - } -} - -/*********************************************************************** - * - * FUNCTION: AppHandleEvent - * - * DESCRIPTION: This routine loads form resources and set the event - * handler for the form loaded. - * - * PARAMETERS: event - a pointer to an EventType structure - * - * RETURNED: true if the event has handle and should not be passed - * to a higher level handler. - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Boolean AppHandleEvent(EventPtr eventP) { - UInt16 formId; - FormPtr frmP; - - if (eventP->eType == frmLoadEvent) { - // Load the form resource. - formId = eventP->data.frmLoad.formID; - frmP = FrmInitForm(formId); - FrmSetActiveForm(frmP); - - // Set the event handler for the form. The handler of the currently - // active form is called by FrmHandleEvent each time is receives an - // event. - switch (formId) { - case MainForm: - FrmSetEventHandler(frmP, MainFormHandleEvent); - break; - - case SkinsForm: - FrmSetEventHandler(frmP, SkinsFormHandleEvent); - break; - - case GameEditForm: - FrmSetEventHandler(frmP, EditGameFormHandleEvent); - break; - - case MiscForm: - FrmSetEventHandler(frmP, MiscFormHandleEvent); - break; - - case CardSlotForm: - FrmSetEventHandler(frmP, CardSlotFormHandleEvent); - break; - - case MusicForm: - FrmSetEventHandler(frmP, MusicFormHandleEvent); - break; - - case InfoForm: - FrmSetEventHandler(frmP, InfoFormHandleEvent); - break; - - case EngineForm: - FrmSetEventHandler(frmP, SelectorFormHandleEvent); - break; - - default: -// ErrFatalDisplay("Invalid Form Load Event"); - break; - } - return true; - } - - return false; -} - -/*********************************************************************** - * - * FUNCTION: AppEventLoop - * - * DESCRIPTION: This routine is the event loop for the application. - * - * PARAMETERS: nothing - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void AppEventLoop(void) { - UInt16 error; - EventType event; - - do { - EvtGetEvent(&event, evtNoWait); - - if (! SysHandleEvent(&event)) - if (! MenuHandleEvent(0, &event, &error)) - if (! AppHandleEvent(&event)) - FrmDispatchEvent(&event); - - } while (event.eType != appStopEvent); -} - -/*********************************************************************** - * - * FUNCTION: ScummVMPalmMain - * - * DESCRIPTION: This is the main entry point for the application. - * - * PARAMETERS: cmd - word value specifying the launch code. - * cmdPB - pointer to a structure that is associated with the launch code. - * launchFlags - word value providing extra information about the launch. - * - * RETURNED: Result of launch - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void AppLaunchCmdNotify(UInt16 LaunchFlags, SysNotifyParamType * pData) { - switch (pData->notifyType) { - case sysNotifyVolumeMountedEvent: - pData->handled = true; // don't switch - - if (gPrefs) { // gPrefs exists ? so we are in the palm selector - CardSlotFormUpdate(); // redraw card list if needed - - if (gPrefs->card.volRefNum == vfsInvalidVolRef) { - VFSAnyMountParamType *notifyDetailsP = (VFSAnyMountParamType *)pData->notifyDetailsP; - gPrefs->card.volRefNum = notifyDetailsP->volRefNum; - - if (FrmGetFormPtr(MainForm) == FrmGetActiveForm()) - if (gPrefs->card.volRefNum != vfsInvalidVolRef) { - CardSlotCreateDirs(); - FrmUpdateForm(MainForm, frmRedrawUpdateMSImport); - } - } - } - break; - - case sysNotifyVolumeUnmountedEvent: - if (gPrefs) { - CardSlotFormUpdate(); - - if (gPrefs->card.volRefNum == (UInt16)pData->notifyDetailsP) { - gPrefs->card.volRefNum = vfsInvalidVolRef; - - if (FrmGetFormPtr(MainForm) == FrmGetActiveForm()) - FrmUpdateForm(MainForm, frmRedrawUpdateMS); - } - } - break; - - case sysNotifyDisplayResizedEvent: - if (gVars) - if (FrmGetFormPtr(MainForm) == FrmGetActiveForm()) - SknApplySkin(); - break; - - case sonySysNotifyMsaEnforceOpenEvent: - // what am i supposed to do here ??? - break; - } -} - -static UInt32 ScummVMPalmMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) { - Err error; - - error = RomVersionCompatible (kOurMinVersion, launchFlags); - if (error) return (error); - - switch (cmd) { - case sysAppLaunchCmdNotify: - AppLaunchCmdNotify(launchFlags, (SysNotifyParamType *) cmdPBP); - break; - - case sysAppLaunchCustomEngineDelete: -#ifndef _DEBUG_ENGINE - ModDelete(); -#endif - break; - - case sysAppLaunchCmdNormalLaunch: - error = AppStart(); - if (error) - goto end; - - if (!bDirectMode) { - FrmGotoForm(MainForm); - }else { - GamUnselect(); - FrmGotoForm(EngineForm); - } - - AppEventLoop(); -end: - AppStop(); - break; - - default: - break; - - } - return error; -} - -/*********************************************************************** - * - * FUNCTION: PilotMain - * - * DESCRIPTION: This is the main entry point for the application. - * - * PARAMETERS: cmd - word value specifying the launch code. - * cmdPB - pointer to a structure that is associated with the launch code. - * launchFlags - word value providing extra information about the launch. - * RETURNED: Result of launch - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) { - return ScummVMPalmMain(cmd, cmdPBP, launchFlags); -} diff --git a/backends/platform/PalmOS/Src/launcher/start.h b/backends/platform/PalmOS/Src/launcher/start.h deleted file mode 100644 index 3ed52b465b..0000000000 --- a/backends/platform/PalmOS/Src/launcher/start.h +++ /dev/null @@ -1,98 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __START_H__ -#define __START_H__ - -typedef struct { - Char nameP[32]; - UInt16 cardNo; - LocalID dbID; -} SkinInfoType, *SkinInfoPtr; - -typedef struct { - - //skin params - SkinInfoType skin; // card where is located the skin - Boolean soundClick; - - Boolean vibrator; - Boolean autoOff; - Boolean setStack; - Boolean exitLauncher; - Boolean goLCD; - Boolean stylusClick; - Boolean arrowKeys; - - UInt16 listPosition; - UInt16 autoSavePeriod; - - struct { - UInt16 volRefNum; - UInt32 cacheSize; - Boolean useCache; - Boolean showLED; - Boolean autoDetect; - Boolean moveDB; - Boolean deleteDB; - Boolean confirmMoveDB; - } card; - - Boolean debug; - UInt16 debugLevel; - Boolean stdPalette; - Boolean demoMode; - Boolean copyProtection; - Boolean oldarm;// TODO : free slot... - Boolean altIntro; - Boolean autoSave; - Boolean advancedMode; - - struct { - Boolean enable; - UInt8 mode; - } lightspeed; - -} GlobalsPreferenceType, *GlobalsPreferencePtr; - -extern GlobalsPreferencePtr gPrefs; - -extern Boolean bDirectMode; -extern Boolean bLaunched; - -#define appPrefID 0x00 -#define appVersionNum 0x01 -#define appPrefVersionNum 0x02 - -#define STACK_DEFAULT 8192 -#define STACK_LARGER 16384 -#define STACK_GET 0 - -Err AppStart(void); -void AppStop(void); -Boolean StartScummVM(Int16 engine = -1); -void SavePrefs(); -Err SendDatabase (UInt16 cardNo, LocalID dbID, Char *nameP, Char *descriptionP); -#endif diff --git a/backends/platform/PalmOS/Src/modules.cpp b/backends/platform/PalmOS/Src/modules.cpp deleted file mode 100644 index b16e2cf7d5..0000000000 --- a/backends/platform/PalmOS/Src/modules.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include - -#include "palmdefs.h" -#include "args.h" -#include "globals.h" -#include "modules.h" -#include "features.h" - -#include "rumble.h" -#include "init_mathlib.h" -#include "init_pa1lib.h" -#include "init_palmos.h" -#include "init_stuffs.h" -#include "init_sony.h" -#include "init_golcd.h" - -#ifndef DISABLE_LIGHTSPEED -#include "lightspeed_public.h" -#endif - -GlobalsDataPtr gVars; - -#include "endianutils.h" -#include - -#ifdef COMPILE_ZODIAC -# include -# include -#endif - -void run(int argc, char *argv[]) { - // init args - ArgsExportInit(argv, argc, true); - - // init system - PalmHRInit(16); - PalmInit(HWR_GET()); - void *__ptr = StuffsForceVG(); - - gVars->screenPitch = StuffsGetPitch(gVars->screenFullWidth); - - // export global struct to ARM - VARS_EXPORT(); - DO_VARS(_4B, 32, 0); - DO_VARS(_2B, 16, (gVars->_4B * sizeof(UInt32))); - FtrSet(appFileCreator, ftrVars , (UInt32)gVars); - - // run the module -#ifdef COMPILE_ZODIAC - NativeFuncType *entry; - TwLoadModule(0, 0, 0, 1, twLoadFlagTNA|twLoadFlagQuickRun, &entry); -#else - PnoDescriptor pno; - PnoLoadFromResources(&pno, 'ARMC', 1, appFileCreator, 1); - PnoCall(&pno, 0); - PnoUnload(&pno); -#endif - - // reset globals - DO_VARS(_4B, 32, 0); - DO_VARS(_2B, 16, (gVars->_4B * sizeof(UInt32))); - - // release - StuffsReleaseVG(__ptr); - PalmRelease(HWR_GET()); - PalmHRRelease(); - - // free args - ArgsExportRelease(true); - ArgsFree(argv); - - // release global struct - FtrUnregister(appFileCreator, ftrVars); - FtrUnregister(appFileCreator, ftrStack); - MemPtrFree(gVars); - - // reset the palette if needed - WinPalette(winPaletteSetToDefault, 0, 256, NULL); -} - -static UInt32 ModulesPalmMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) -{ - UInt32 result = 0; - - switch (cmd) { - case sysAppLaunchCustomEngineGetInfo: { -#ifdef PALMOS_NATIVE - result = GET_MODEARM; -#else -# if defined(ENABLE_SCUMM) || \ - defined(ENABLE_AGOS) || \ - defined(ENABLE_SWORD1) - result = GET_DATACOMMON|GET_DATAENGINE|GET_MODE68K; -# else - result = GET_DATACOMMON|GET_MODE68K; -# endif -#endif - break; - } - - case sysAppLaunchCmdNormalLaunch: { - if (cmdPBP) { - Char **argvP; - UInt16 cardNo; - LocalID dbID; - - LaunchParamType *lp = (LaunchParamType *)cmdPBP; - - gVars = lp->gVars; - argvP = lp->args.argv; - - // get the free memory on the dynamic heap - PalmGetMemory(0,0,0, &(gVars->startupMemory)); - -#ifndef DISABLE_LIGHTSPEED - switch (lp->lightspeed) { - case 0: - LS_SetCPUSpeedHigh(); - break; - case 1: - LS_SetCPUSpeedNormal(); - break; - case 2: - LS_SetCPUSpeedLow(); - break; - } -#endif - // MemPtrSetOwner(gVars, ownerID); - // ArgsSetOwner(argvP, ownerID); // will be freed by main(...) - // MemPtrFree(lp); // will be freed by the system on exit - - run(lp->args.argc, argvP); - - cardNo = 0; - dbID = DmFindDatabase(0, "ScummVM"); - if (dbID) { - if (lp->exitLauncher) - SysUIAppSwitch(cardNo, dbID, sysAppLaunchCustomEngineDelete,0); - else - SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch,0); - } - } - break; - } - - default: - break; - - } - - return result; -} - -UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) { - return ModulesPalmMain(cmd, cmdPBP, launchFlags); -} diff --git a/backends/platform/PalmOS/Src/modules.h b/backends/platform/PalmOS/Src/modules.h deleted file mode 100644 index d172ad11c2..0000000000 --- a/backends/platform/PalmOS/Src/modules.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MODULES_H -#define MODULES_H - -#include "globals.h" - -#define sysAppLaunchCode_SVMRunEngine (sysAppLaunchCmdCustomBase + 0) - -void ModDelete(); - -typedef struct { - UInt8 lightspeed; - Boolean exitLauncher; - - struct { - UInt8 argc; - Char **argv; - } args; - - GlobalsDataPtr gVars; -} LaunchParamType; - -#endif diff --git a/backends/platform/PalmOS/Src/native/oscalls.cpp b/backends/platform/PalmOS/Src/native/oscalls.cpp deleted file mode 100644 index 9bfd01393f..0000000000 --- a/backends/platform/PalmOS/Src/native/oscalls.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include "pace.h" - -GlobalsType global; - - -PACE_CLASS_WRAPPER(Err) - __68k_StatShow(void) { - PACE_PIN_EXEC_NP(pinStatShow, Err) -} - -PACE_CLASS_WRAPPER(Err) - __68k_StatHide(void) { - PACE_PIN_EXEC_NP(pinStatHide, Err) -} - -PACE_CLASS_WRAPPER(Err) - __68k_PINSetInputAreaState(UInt16 state) { - PACE_PARAMS_INIT() - PACE_PARAMS_ADD16(state) - PACE_PARAMS_END() - PACE_PIN_EXEC(pinPINSetInputAreaState, Err) -} - -PACE_CLASS_WRAPPER(UInt16) - __68k_PINGetInputAreaState(void) { - PACE_PIN_EXEC_NP(pinPINGetInputAreaState, UInt16) -} - -PACE_CLASS_WRAPPER(Err) - __68k_PINSetInputTriggerState(UInt16 state) { - PACE_PARAMS_INIT() - PACE_PARAMS_ADD16(state) - PACE_PARAMS_END() - PACE_PIN_EXEC(pinPINSetInputTriggerState, Err) -} - -PACE_CLASS_WRAPPER(UInt16) - __68k_PINGetInputTriggerState(void) { - PACE_PIN_EXEC_NP(pinPINGetInputTriggerState, UInt16) -} - -PACE_CLASS_WRAPPER(Err) - __68k_SysSetOrientation(UInt16 orientation) { - PACE_PARAMS_INIT() - PACE_PARAMS_ADD16(orientation) - PACE_PARAMS_END() - PACE_PIN_EXEC(pinSysSetOrientation, Err) -} - -PACE_CLASS_WRAPPER(UInt16) - __68k_SysGetOrientation(void) { - PACE_PIN_EXEC_NP(pinSysGetOrientation, UInt16) -} - -PACE_CLASS_WRAPPER(Err) - __68k_SysSetOrientationTriggerState(UInt16 triggerState) { - PACE_PARAMS_INIT() - PACE_PARAMS_ADD16(triggerState) - PACE_PARAMS_END() - PACE_PIN_EXEC(pinSysSetOrientationTriggerState, Err) -} - -PACE_CLASS_WRAPPER(UInt16) - __68k_SysGetOrientationTriggerState(void) { - PACE_PIN_EXEC_NP(pinSysGetOrientationTriggerState, UInt16) -} diff --git a/backends/platform/PalmOS/Src/native/oscalls.h b/backends/platform/PalmOS/Src/native/oscalls.h deleted file mode 100644 index 071b409130..0000000000 --- a/backends/platform/PalmOS/Src/native/oscalls.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef _OSCALLS_H_ -#define _OSCALLS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef PALMOS_ARM -# define __68K(a) __68k_##a -#else -# define __68K(a) a -#endif - -Err __68k_StatShow(); -Err __68k_StatHide(); - -Err __68k_PINSetInputAreaState(UInt16 state); -UInt16 __68k_PINGetInputAreaState(void); - -Err __68k_PINSetInputTriggerState(UInt16 state); -UInt16 __68k_PINGetInputTriggerState(void); - -Err __68k_SysSetOrientation(UInt16 orientation); -UInt16 __68k_SysGetOrientation(void); - -Err __68k_SysSetOrientationTriggerState(UInt16 triggerState); -UInt16 __68k_SysGetOrientationTriggerState(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/backends/platform/PalmOS/Src/native/pace.h b/backends/platform/PalmOS/Src/native/pace.h deleted file mode 100644 index 37b903b2c3..0000000000 --- a/backends/platform/PalmOS/Src/native/pace.h +++ /dev/null @@ -1,103 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef PACE_H -#define PACE_H - -#include -//#include "endianutils.h" - -// local definition of the emulation state structure -typedef struct { - UInt32 instr; - UInt32 regData[8]; - UInt32 regAddress[8]; - UInt32 regPC; -} EmulStateType; - -typedef struct { - EmulStateType *emulStateP; - Call68KFuncType *call68KFuncP; -} GlobalsType; - -extern GlobalsType global; - -// TODO : check this, already defined in ARMlet_Runtime -//extern EmulStateType *g_emulStateP; -//extern Call68KFuncType *g_call68KFuncP; -#define g_emulStateP global.emulStateP -#define g_call68KFuncP global.call68KFuncP - - -#ifdef __cplusplus -# define PACE_CLASS_WRAPPER(rv) extern "C" rv -#else -# define PACE_CLASS_WRAPPER(rv) rv -#endif -#define PACE_CALLBACK_PTR g_call68KFuncP -#define PACE_EMULSTATE g_emulStateP - -#define ALIGN_4BYTE(addr) (((UInt32)(addr) + 3) & 0xFFFFFFFC) - -/****** TAKEN FROM PACEInteface.cpp (ARMlet_Runtime) ******/ -// local definition of the emulation state structure - -#define PACE_PARAMS_INIT() \ - UInt8 params[] = { - -#define PACE_PARAMS_ADD8(param) \ - (UInt8)(param), \ - 0, - -#define PACE_PARAMS_ADD16(param) \ - (UInt8)((UInt16)(param) >> 8), \ - (UInt8)(param), - -#define PACE_PARAMS_ADD32(param) \ - (UInt8)((UInt32)(param) >> 24), \ - (UInt8)((UInt32)(param) >> 16), \ - (UInt8)((UInt32)(param) >> 8), \ - (UInt8)(param), - -#define PACE_PARAMS_END() \ - }; - -// PIN -#define PACE_PIN_EXEC_NP(pinTrap, returnType) \ - PACE_EMULSTATE->regData[2] = pinTrap; \ - return ((returnType)((PACE_CALLBACK_PTR)( \ - static_cast(PACE_EMULSTATE), \ - PceNativeTrapNo(sysTrapPinsDispatch), \ - NULL, 0))); - -#define PACE_PIN_EXEC(pinTrap, returnType) \ - PACE_EMULSTATE->regData[2] = pinTrap; \ - return ((returnType)((PACE_CALLBACK_PTR)( \ - static_cast(PACE_EMULSTATE), \ - PceNativeTrapNo(sysTrapPinsDispatch), \ - ¶ms, \ - sizeof(params)))); - -#endif diff --git a/backends/platform/PalmOS/Src/native/pnoARM.c b/backends/platform/PalmOS/Src/native/pnoARM.c deleted file mode 100644 index 48c4fee972..0000000000 --- a/backends/platform/PalmOS/Src/native/pnoARM.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef COMPILE_OS5 - -#include -#include -#include "pace.h" - -// Linker still looks for ARMlet_Main as entry point, but the -// "ARMlet" name is now officially discouraged. Compare an -// contrast to "PilotMain" for 68K applications. -#define PNO_Main ARMlet_Main - -/* Prepare static initializers */ -extern long __sinit__[]; -extern void __ARMlet_Startup__(); - -/* simple function pointer */ -typedef void (*StaticInitializer)(void); - -unsigned long PNO_Main(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) { - global.emulStateP = (EmulStateType *)emulStateP; - global.call68KFuncP = call68KFuncP; - - // handle static initializers - if (__sinit__) { - long base = (long)__ARMlet_Startup__; - long s, *p; - - for (p = __sinit__; p && (s = *p) != 0; p++) - ((StaticInitializer)(s + base))(); - } - - return PilotMain(sysAppLaunchCmdNormalLaunch, userData68KP, 0); -} - -#endif diff --git a/backends/platform/PalmOS/Src/native/pnoStartup.c b/backends/platform/PalmOS/Src/native/pnoStartup.c deleted file mode 100644 index b76cac3024..0000000000 --- a/backends/platform/PalmOS/Src/native/pnoStartup.c +++ /dev/null @@ -1,28 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef COMPILE_OS5 -# include "(Source)/ARMlet_Startup.c" -#endif diff --git a/backends/platform/PalmOS/Src/native/zodiacARM.cpp b/backends/platform/PalmOS/Src/native/zodiacARM.cpp deleted file mode 100644 index 7323bb6d69..0000000000 --- a/backends/platform/PalmOS/Src/native/zodiacARM.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "PalmVersion.h" -#include - -#include "globals.h" -#include "args.h" -#include "palmdefs.h" - -#include "rumble.h" - - -//#include -//#define DEBUG_ARM - -#include "base/main.h" -#ifdef COMPILE_ZODIAC -# include "be_zodiac.h" -#endif -#include "be_os5ex.h" - -GlobalsDataType g_vars; -GlobalsDataPtr gVars = &g_vars; -UInt32 g_stackSize; - -extern "C" void __destroy_global_chain(void); -extern void DrawStatus(Boolean show); - -static void palm_main(int argc, char **argvP) { -#ifdef COMPILE_OS5 - if (gVars->advancedMode) - g_system = new OSystem_PalmOS5Ex(); - else - g_system = new OSystem_PalmOS5(); -#elif defined(COMPILE_ZODIAC) - g_system = new OSystem_PalmZodiac(); -#else - #error "No target defined." -#endif - - assert(g_system); - - scummvm_main(argc, argvP); - - g_system->quit(); // TODO: Consider removing / replacing this! -} - -static void Go() { - void *tmp; - char **argvP; - int argc; - -#ifdef DEBUG_ARM -// Tell the debugger we want to enable full debugging - UInt32 flags = AdnDebugEnableGet(); - flags |= kAdnEnableMasterSwitch | kAdnEnableFullDebugging; - AdnDebugEnableSet(flags); -// Tell the debugger where our code lives in memory: - AdnDebugNativeRegister(sysFileTApplication, appFileCreator, 'ARMC', 1); -#endif - - // get global struct - FtrGet(appFileCreator, ftrVars, (UInt32 *)&tmp); - MemMove(gVars, tmp, sizeof(GlobalsDataType)); - - // init STDIO - stdio_set_cache(0); - stdio_init(gVars->VFS.volRefNum, "/PALM/Programs/ScummVM/scumm.log"); - if (gVars->indicator.showLED) - stdio_set_led(DrawStatus); - stdio_set_cache(gVars->VFS.cacheSize); - - // get args - FtrGet(appFileCreator, ftrArgsData, (UInt32 *)&argvP); - FtrGet(appFileCreator, ftrArgsCount, (UInt32 *)&argc); - - // init system - WinSetDrawWindow(WinGetDisplayWindow()); - if (HWR_INIT(INIT_VIBRATOR)) gVars->vibrator = RumbleInit(); - - // run ... - DO_EXIT ( palm_main(argc, argvP); ) - - // release - if (HWR_INIT(INIT_VIBRATOR)) RumbleRelease(); - stdio_release(); - -#ifdef DEBUG_ARM - AdnDebugNativeUnregister(); -#endif -} - -/* Stack size */ - -Int8 *g_newStack, *g_newStackPos; -void *g_oldStack; - -static asm void *StkSwap(void *newStack ,void *dummy) { - mov r1, r13 - mov r13, r0 - mov r0, r1 - bx lr -} - -extern UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) { - if (cmd == sysAppLaunchCmdNormalLaunch) { - FtrGet(appFileCreator, ftrStack, &g_stackSize); - if (!g_stackSize) - g_stackSize = 32 * 1024; - - g_newStack = (Int8 *)malloc(g_stackSize + 8); - g_newStackPos = (g_newStack + g_stackSize); - g_newStackPos -= ((UInt32)g_newStackPos & 7); - - g_oldStack = StkSwap(g_newStackPos, 0); - - Go(); - - StkSwap(g_oldStack, 0); - free(g_newStack); - } - - // Destroy all constructed global objects - __destroy_global_chain(); - - return 0; -} diff --git a/backends/platform/PalmOS/Src/native/zodiacStartup.cpp b/backends/platform/PalmOS/Src/native/zodiacStartup.cpp deleted file mode 100644 index 7f6264c1ac..0000000000 --- a/backends/platform/PalmOS/Src/native/zodiacStartup.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef COMPILE_ZODIAC - -#include - -#ifndef __PALMOS_ARMLET__ -#error "__PALMOS_ARMLET__ is not defined!!!" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This variable holds the Tapwave Native Application interface - * dispatch table. General ARM API calls will go through this table. - */ -struct TwGlue* twGlue; -const void* twEmulState; -Call68KFuncType* twCall68KFunc; - -#ifdef __MWERKS__ - -#if __PALMOS_ARMLET__ < 0x120 -#error "You must use CodeWarrior for Palm OS 9.3 or later!!!" -#endif - - -UInt32 __ARMlet_Startup__(const void*, void*, Call68KFuncType*); - -/* - * These symbols aren't real, but are linker-generated symbols that - * mark the start and end of the various data sections. - */ -extern long __DataStart__[]; -extern long __sinit__[]; -extern long __RODataStart__[]; -extern long __BSSStart__[]; -extern long __BSSEnd__[]; -extern long __CodeRelocStart__[]; -extern long __CodeRelocEnd__[]; -extern long __DataRelocStart__[]; -extern long __DataRelocEnd__[]; - -/* simple function pointer */ -typedef void (*StaticInitializer)(void); - -/* - * This function performs relocation for Tapwave Native Application. - */ -static void relocate(void) -{ - // this symbol points to the very beginning of current application - long base = (long) __ARMlet_Startup__; - long *cur, *end; - - // handle static initializers - if (__sinit__) { - long s, *p; - - for (p = __sinit__; p && (s = *p) != 0; p++) - ((StaticInitializer)(s + base))(); - } - - // handle code-to-data relocation - cur = __CodeRelocStart__; - end = __CodeRelocEnd__; - for (; cur < end; cur++) { - *(long*)(base + *cur) += base; - } - - // handle data-to-data relocation - cur = __DataRelocStart__; - end = __DataRelocEnd__; - for (; cur < end; cur++) { - *(long*)(base + *cur) += base; - } -} - -/* - * This is the real entrypoint for Tapwave Native Application. It - * depends on various CodeWarrior 9.2 compiler/linker/runtime features. - */ -static SYSTEM_CALLBACK UInt32 -Startup(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) -{ - if (emulStateP) { - twEmulState = emulStateP; - twCall68KFunc = call68KFuncP; - // COMMENT: normal pace native object launch - return PilotMain(sysAppLaunchCmdNormalLaunch, userData68KP, 0); - } else { - // Setup TNA interface dispatch table - twGlue = (struct TwGlue*) userData68KP; - - // OPTIONAL: relocate data segment - relocate(); - - // OPTIONAL: initialize the floating-point library - // _fp_init(); - - return 0; - } -} - -#pragma PIC off -asm UInt32 -__ARMlet_Startup__(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) -{ - b Startup // 0 forwarding call - nop // 4 - nop // 8 - nop // 12 - nop // 16 - nop // 20 - nop // 24 - dcd 'TWNA' // 28 Tapwave Native Application - dcd 1 // 32 version 1 - dcd 'cdwr' // 36 make this section the same as the __ARMlet_Startup__ - dcd __DataStart__ // 40 used by CodeWarrior 9.2 - dcd __RODataStart__ // 44 - dcd __BSSStart__ // 48 - dcd __BSSEnd__ // 52 - dcd __CodeRelocStart__ // 56 - dcd __CodeRelocEnd__ // 60 - dcd __DataRelocStart__ // 64 - dcd __DataRelocEnd__ // 68 -} -#pragma PIC reset - -#endif // __MWERKS__ - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/backends/platform/PalmOS/Src/os5_event.cpp b/backends/platform/PalmOS/Src/os5_event.cpp deleted file mode 100644 index 534c2eb4f9..0000000000 --- a/backends/platform/PalmOS/Src/os5_event.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" - -void OSystem_PalmOS5::get_coordinates(EventPtr ev, Coord &x, Coord &y) { - Boolean dummy; - EvtGetPenNative(WinGetDisplayWindow(), &ev->screenX, &ev->screenY, &dummy); - - x = (ev->screenX - _screenOffset.x); - y = (ev->screenY - _screenOffset.y); - - if (_stretched) { - x = (x * _screenWidth) / _screenDest.w; - y = (y * _screenHeight) / _screenDest.h; - } -} - -bool OSystem_PalmOS5::check_event(Common::Event &event, EventPtr ev) { - if (ev->eType == keyUpEvent) { - switch (ev->data.keyUp.chr) { - case vchrHard3: - case vchrHard4: - // will be handled by hard keys - return true; - } - - } else if (ev->eType == keyDownEvent) { - switch (ev->data.keyDown.chr) { - - // hot swap gfx -// case 0x1B04: - case vchrHard1: - if (OPTIONS_TST(kOptCollapsible)) - hotswap_gfx_mode(_mode == GFX_WIDE ? GFX_NORMAL: GFX_WIDE); - return false; // not a key - -// case 0x1B05: - case vchrHard2: - setFeatureState(kFeatureAspectRatioCorrection, 0); - return false; // not a key - - case vchrHard3: - _keyExtraPressed |= _keyExtra.bitActionA; - event.type = Common::EVENT_LBUTTONDOWN; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - - case vchrHard4: - _keyExtraPressed |= _keyExtra.bitActionB; - event.type = Common::EVENT_RBUTTONDOWN; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - } - } - - return false; -} diff --git a/backends/platform/PalmOS/Src/os5_gfx.cpp b/backends/platform/PalmOS/Src/os5_gfx.cpp deleted file mode 100644 index 6a7b21e100..0000000000 --- a/backends/platform/PalmOS/Src/os5_gfx.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" -#include "graphics/surface.h" -#include "common/config-manager.h" -#include -#include - -#include "oscalls.h" - -void OSystem_PalmOS5::int_initSize(uint w, uint h) { -} - -WinHandle OSystem_PalmOS5::alloc_screen(Coord w, Coord h) { - Err e; - WinHandle winH; - UInt16 old = WinSetCoordinateSystem(kCoordinatesNative); - winH = WinCreateOffscreenWindow(w, h, nativeFormat, &e); - WinSetCoordinateSystem(old); - - return winH; -} - -void OSystem_PalmOS5::load_gfx_mode() { - Err e; - - if (_gfxLoaded) - return; - _gfxLoaded = true; - - // get command line config -// _fullscreen = ConfMan.getBool("fullscreen"); // TODO : (NORMAL mode) - _ratio.adjustAspect = ConfMan.getBool("aspect_ratio") ? kRatioHeight : kRatioNone; - - // precalc ratio (WIDE mode) - _ratio.width = (gVars->screenFullHeight * _screenWidth / _screenHeight); - _ratio.height = (gVars->screenFullWidth * _screenHeight / _screenWidth); - - _offScreenP = (byte *)malloc(_screenWidth * _screenHeight); - - MemSet(_offScreenP, _screenWidth * _screenHeight, 0); - MemSet(_nativePal, sizeof(_nativePal), 0); - MemSet(_currentPalette, sizeof(_currentPalette), 0); - - UInt32 depth = 16; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - clear_screen(); - - if (OPTIONS_TST(kOptModeRotatable)) { - _sysOldOrientation = __68K(SysGetOrientation()); - _sysOldTriggerState = __68K(PINGetInputTriggerState()); - __68K(SysSetOrientation(sysOrientationLandscape)); - __68K(SysSetOrientationTriggerState(sysOrientationTriggerDisabled)); - __68K(PINSetInputTriggerState(pinInputTriggerDisabled)); - } - - gVars->indicator.on = Graphics::RGBToColor >(0,255,0); - gVars->indicator.off = Graphics::RGBToColor >(0,0,0); - - _overlayH = alloc_screen(_screenWidth, _screenHeight); - _overlayP = (OverlayColor *)(BmpGetBits(WinGetBitmap(_overlayH))); - - _screenH = WinGetDisplayWindow(); - _screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH))); - - _isSwitchable = OPTIONS_TST(kOptModeLandscape) && OPTIONS_TST(kOptCollapsible); - if (!_isSwitchable) - _mode = GFX_NORMAL; - - hotswap_gfx_mode(_mode); -} - -void OSystem_PalmOS5::hotswap_gfx_mode(int mode) { - Err e; - - if (_mode != GFX_NORMAL && !_isSwitchable) - return; - - if (_workScreenH) - WinDeleteWindow(_workScreenH, false); - _workScreenH = NULL; - - _screenDest.w = _screenWidth; - _screenDest.h = _screenHeight; - - // prevent bad DIA redraw (Stat part) - if (mode == GFX_NORMAL) { - _redawOSD = true; - _stretched = (_screenWidth > gVars->screenWidth); - - if (OPTIONS_TST(kOptCollapsible)) { - //AiaSetInputAreaState(aiaInputAreaShow); // For T3 ?? - __68K(StatShow()); - __68K(PINSetInputAreaState(pinInputAreaOpen)); - } - - if (_stretched) { - calc_rect(false); - } else { - // offsets - _screenOffset.x = (gVars->screenWidth - _screenWidth) / 2; - _screenOffset.y = (gVars->screenHeight - _screenHeight) / 2; - } - - } else { - _redawOSD = false; - _stretched = true; - - if (OPTIONS_TST(kOptCollapsible)) { - // T3 DIA library is 68k base, there is no possible native call - //AiaSetInputAreaState(aiaInputAreaFullScreen); - __68K(PINSetInputAreaState(pinInputAreaClosed)); - __68K(StatHide()); - } - - calc_rect(true); - } - - if (_stretched) { - OPTIONS_SET(kOptDisableOnScrDisp); - if (_screenHeight == 200 && _screenDest.h == 300) { - _render = &OSystem_PalmOS5::render_landscape15x; - } else { - _render = &OSystem_PalmOS5::render_landscapeAny; - calc_scale(); - } - } else { - OPTIONS_RST(kOptDisableOnScrDisp); - _render = &OSystem_PalmOS5::render_1x; - } - - _workScreenH = alloc_screen(_screenDest.w, _screenDest.h); - _workScreenP = (uint16 *)(BmpGetBits(WinGetBitmap(_workScreenH))); - MemSet(_workScreenP, _screenDest.w * _screenDest.h * 2, 0); - - _mode = mode; - clear_screen(); -} - -void OSystem_PalmOS5::unload_gfx_mode() { - if (!_gfxLoaded) - return; - _gfxLoaded = false; - - // mouse data freed in quit() - free(_offScreenP); - - if (_workScreenH) - WinDeleteWindow(_workScreenH, false); - if (_overlayH) - WinDeleteWindow(_overlayH, false); - - _workScreenH = NULL; - _overlayH = NULL; - - UInt32 depth = 8; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - clear_screen(); - - if (OPTIONS_TST(kOptModeRotatable)) { - __68K(PINSetInputTriggerState(_sysOldTriggerState)); - __68K(SysSetOrientation(_sysOldOrientation)); - } - - WinSetCoordinateSystem(_sysOldCoord); -} - -void OSystem_PalmOS5::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { - // Clip the coordinates - if (x < 0) { - w += x; - buf -= x; - x = 0; - } - - if (y < 0) { - h += y; - buf -= y * pitch; - y = 0; - } - - if (w > _screenWidth - x) - w = _screenWidth - x; - - if (h > _screenHeight - y) - h = _screenHeight - y; - - if (w <= 0 || h <= 0) - return; - - byte *dst = _offScreenP + y * _screenWidth + x; - - if (w == pitch && w == _screenWidth) { - MemMove(dst, buf, w * h); - } else { - do { - MemMove(dst, buf, w); - dst += _screenWidth; - buf += pitch; - } while (--h); - } -} - -Graphics::Surface *OSystem_PalmOS5::lockScreen() { - _framebuffer.pixels = _offScreenP; - _framebuffer.w = _screenWidth; - _framebuffer.h = _screenHeight; - _framebuffer.pitch = _screenWidth; - _framebuffer.bytesPerPixel = 1; - - return &_framebuffer; -} - -void OSystem_PalmOS5::unlockScreen() { - // The screen is always completely update anyway, so we don't have to force a full update here. -} - -void OSystem_PalmOS5::int_updateScreen() { - RectangleType r; - PointType p; - - draw_mouse(); - ((this)->*(_render))(r, p); - - _sysOldCoord = WinSetCoordinateSystem(kCoordinatesNative); - WinCopyRectangle(_workScreenH, _screenH, &r, p.x, p.y, winPaint); - WinSetCoordinateSystem(_sysOldCoord); - undraw_mouse(); -} - -void OSystem_PalmOS5::clear_screen() { - RGBColorType rgb = { 0,0,0,0 }; - WinSetDrawWindow(WinGetDisplayWindow()); - WinSetBackColorRGB(&rgb, 0); - WinEraseWindow(); -} - -void OSystem_PalmOS5::extras_palette(uint8 index, uint8 r, uint8 g, uint8 b) { - _nativePal[index] = gfxMakeDisplayRGB(r, g, b); -} - -void OSystem_PalmOS5::draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color) { - if (_mode != GFX_NORMAL) - return; -// MemHandle hTemp = DmGetResource(bitmapRsc, id); - MemHandle hTemp = DmGetResource('abmp', id + 100); - - if (hTemp) { - RGBColorType oldRGB; - static const RGBColorType pal[4] = { - {0,0,255,0}, - {0,255,255,0}, - {0,255,0,0}, - {0,0,0,0} - }; - - BitmapType *bmTemp; - bmTemp = (BitmapType *)MemHandleLock(hTemp); - - Coord w, h; - BmpGetDimensions(bmTemp, &w, &h, 0); - - PointType dst = { _screenOffset.x + x, _screenOffset.y + y }; - RectangleType c, r = { dst.x, dst.y, w, h }; - - UInt16 old = WinSetCoordinateSystem(kCoordinatesNative); - WinSetDrawWindow(_screenH); - WinGetClip(&c); - WinResetClip(); - - if (show) { - WinSetForeColorRGB(&pal[3], &oldRGB); - WinSetBackColorRGB(&pal[color], &oldRGB); - WinDrawBitmap(bmTemp, dst.x, dst.y); - } else { - WinSetBackColorRGB(&pal[3], &oldRGB); - WinFillRectangle(&r, 0); - } - - WinSetClip(&c); - WinSetCoordinateSystem(old); - - MemPtrUnlock(bmTemp); - DmReleaseResource(hTemp); - } -} diff --git a/backends/platform/PalmOS/Src/os5_mouse.cpp b/backends/platform/PalmOS/Src/os5_mouse.cpp deleted file mode 100644 index c019e1607d..0000000000 --- a/backends/platform/PalmOS/Src/os5_mouse.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" - -void OSystem_PalmOS5::setCursorPalette(const byte *colors, uint start, uint num) { - for (uint i = 0; i < num; i++) { - _mousePal[i + start] = gfxMakeDisplayRGB(colors[0], colors[1], colors[2]); - colors += 4; - } - - _cursorPaletteDisabled = false; -} - -void OSystem_PalmOS5::disableCursorPalette(bool disable) { - _cursorPaletteDisabled = disable; -} - -// TODO: this code is almost the same as Zodiac version. -void OSystem_PalmOS5::draw_mouse() { - if (!_mouseDataP || _mouseDrawn || !_mouseVisible) - return; - - byte *src = _mouseDataP; - - int x = _mouseCurState.x - _mouseHotspotX; - int y = _mouseCurState.y - _mouseHotspotY; - int w = _mouseCurState.w; - int h = _mouseCurState.h; - - // clip the mouse rect - if (y < 0) { - src -= y * w; - h += y; - y = 0; - } - if (x < 0) { - src -= x; - w += x; - x = 0; - } - - if (h > _screenHeight - y) - h = _screenHeight - y; - if (w > _screenWidth - x) - w = _screenWidth - x; - - if (w <= 0 || h <= 0) - return; - - // store the bounding box so that undraw mouse can restore the area the - // mouse currently covers to its original content - _mouseOldState.x = x; - _mouseOldState.y = y; - _mouseOldState.w = w; - _mouseOldState.h = h; - - byte color; - int ww; - - if (_overlayVisible) { - uint16 *bak = (uint16 *)_mouseBackupP; - uint16 *pal = _cursorPaletteDisabled ? _nativePal : _mousePal; - uint16 *dst = _overlayP + y * _screenWidth + x; - - do { - ww = w; - do { - *bak++ = *dst; - color = *src++; - - // transparent, don't draw - if (color != _mouseKeyColor) - *dst = pal[color]; - dst++; - } while (--ww); - - src += _mouseCurState.w - w; - dst += _screenWidth - w; - } while (--h); - - } else { - byte *bak = _mouseBackupP; - byte *dst =_offScreenP + y * _screenWidth + x; - - do { - ww = w; - do { - *bak++ = *dst; - color = *src++; - - // transparent, don't draw - if (color != _mouseKeyColor) - *dst = color; - dst++; - } while (--ww); - - src += _mouseCurState.w - w; - dst += _screenWidth - w; - } while (--h); - } - - _mouseDrawn = true; -} - -void OSystem_PalmOS5::undraw_mouse() { - if (!_mouseDrawn) - return; - - int h = _mouseOldState.h; - - // no need to do clipping here, since draw_mouse() did that already - if (_overlayVisible) { - uint16 *dst = _overlayP + _mouseOldState.y * _screenWidth + _mouseOldState.x; - uint16 *bak = (uint16 *)_mouseBackupP; - - do { - MemMove(dst, bak, _mouseOldState.w * 2); - dst += _screenWidth; - bak += _mouseOldState.w; - } while (--h); - - } else { - byte *dst = _offScreenP + _mouseOldState.y * _screenWidth + _mouseOldState.x; - byte *bak = _mouseBackupP; - - do { - MemMove(dst, bak, _mouseOldState.w); - dst += _screenWidth; - bak += _mouseOldState.w; - } while (--h); - } - - _mouseDrawn = false; -} diff --git a/backends/platform/PalmOS/Src/os5_overlay.cpp b/backends/platform/PalmOS/Src/os5_overlay.cpp deleted file mode 100644 index 7e16a6b7b9..0000000000 --- a/backends/platform/PalmOS/Src/os5_overlay.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" -#include "common/endian.h" - -void OSystem_PalmOS5::showOverlay() { - // hide fight indicator - draw_osd(kDrawFight, _screenDest.w - 34, _screenDest.h + 2, false); - - undraw_mouse(); - _overlayVisible = true; - clearOverlay(); -} - -void OSystem_PalmOS5::hideOverlay() { - undraw_mouse(); - _overlayVisible = false; - _redawOSD = true; -} - -void OSystem_PalmOS5::clearOverlay() { - if (!_overlayVisible) - return; - - byte *src = _offScreenP; - uint16 *dst = _overlayP; - int cnt = _screenWidth * _screenHeight; - do { - *dst++ = _nativePal[*src++]; - } while (--cnt); -} - -void OSystem_PalmOS5::grabOverlay(OverlayColor *buf, int pitch) { - OverlayColor *src = _overlayP; - int h = _screenHeight; - do { - memcpy(buf, src, _screenWidth * 2); - src += _screenWidth; - buf += pitch; - } while (--h); -} - -void OSystem_PalmOS5::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - if (w == 0 || h == 0) - return; - - OverlayColor *dst = _overlayP + x + y * _screenWidth; - do { - memcpy(dst, buf, w * 2); - dst += _screenWidth; - buf += pitch; - } while (--h); -} diff --git a/backends/platform/PalmOS/Src/os5_renderer.cpp b/backends/platform/PalmOS/Src/os5_renderer.cpp deleted file mode 100644 index fea3ec28d7..0000000000 --- a/backends/platform/PalmOS/Src/os5_renderer.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" - -void OSystem_PalmOS5::render_1x(RectangleType &r, PointType &p) { - Coord o = 0; - - if (_overlayVisible) { - uint16 *src = _overlayP; - uint16 *dst = _workScreenP; - MemMove(dst, src, _screenWidth * _screenHeight * 2); - - } else { - byte *src = _offScreenP; - uint16 *dst = _workScreenP; - int cnt = _screenWidth * _screenHeight; - o = _current_shake_pos; - - do { - *dst++ = _nativePal[*src++]; - } while (--cnt); - } - - p.x = _screenOffset.x; - p.y = _screenOffset.y + o; - RctSetRectangle(&r, 0, 0, _screenWidth, _screenHeight - o); -} - -void OSystem_PalmOS5::render_landscapeAny(RectangleType &r, PointType &p) { - Coord x, y, o = 0; - uint16 *dst = _workScreenP; - - if (_overlayVisible) { - for (y = 0; y < _screenDest.h; y++) { - uint16 *src = _overlayP + *(_scaleTableY + y); - for (x = 0; x < _screenDest.w; x++) { - *dst++ = *(src + *(_scaleTableX + x)); - } - } - - } else { - o = _current_shake_pos; - - for (y = 0; y < _screenDest.h; y++) { - byte *src = _offScreenP + *(_scaleTableY + y); - for (x = 0; x < _screenDest.w; x++) { - *dst++ = *(_nativePal + *(src + *(_scaleTableX + x))); - } - } - } - - p.x = _screenOffset.x; - p.y = _screenOffset.y + o; - RctSetRectangle(&r, 0, 0, _screenDest.w, _screenDest.h - o); -} - -void OSystem_PalmOS5::render_landscape15x(RectangleType &r, PointType &p) { - Coord x, y, o = 0; - uint16 *dst = _workScreenP; - - if (_overlayVisible) { - uint16 *src = _overlayP; - - for (y = 0; y < 100; y++) { - // draw 2 lines - for (x = 0; x < 320; x++) { - *dst++ = *src++; - *dst++ = *src; - *dst++ = *src++; - } - // copy the second to the next line - MemMove(dst, dst - 480, 480 * 2); - dst += 480; - } - } else { - byte *src = _offScreenP; - o = _current_shake_pos; - - for (y = 0; y < 100; y++) { - // draw 2 lines - for (x = 0; x < 320; x++) { - *dst++ = _nativePal[*src++]; - *dst++ = _nativePal[*src]; - *dst++ = _nativePal[*src++]; - } - // copy the second to the next line - MemMove(dst, dst - 480, 480 * 2); - dst += 480; - } - } - - p.x = _screenOffset.x; - p.y = _screenOffset.y + o; - RctSetRectangle(&r, 0, 0, 480, 300 - o); -} diff --git a/backends/platform/PalmOS/Src/os5_sound.cpp b/backends/platform/PalmOS/Src/os5_sound.cpp deleted file mode 100644 index 73ab64c0d5..0000000000 --- a/backends/platform/PalmOS/Src/os5_sound.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5.h" -#include "common/config-manager.h" -#include "sound/mixer_intern.h" - - -#ifdef PALMOS_ARM -# ifdef COMPILE_ZODIAC -# define SAMPLES_PER_SEC 44100 -# else -# define SAMPLES_PER_SEC 22050 -# endif -#else -# define SAMPLES_PER_SEC 8000 -#endif - - -SoundExType _soundEx; - -static Err sndCallback(void* UserDataP, SndStreamRef stream, void* bufferP, UInt32 *bufferSizeP) { - SoundExType *_soundEx = (SoundExType *)UserDataP; - SoundType *_sound = _soundEx->sound; - - if (_soundEx->set && _soundEx->size) { - MemMove(bufferP, _soundEx->dataP, _soundEx->size); - *bufferSizeP = _soundEx->size; - _soundEx->set = false; - - } else { - _soundEx->size = *bufferSizeP; - MemSet(bufferP, 128, 0); - *bufferSizeP = 128; - } - - return errNone; -} - -void OSystem_PalmOS5::sound_handler() { - if (_sound.active) { - if (_soundEx.size && !_soundEx.set) { - if (!_soundEx.dataP) - _soundEx.dataP = MemPtrNew(_soundEx.size); - - _mixerMgr->mixCallback((byte *)_soundEx.dataP, _soundEx.size); - _soundEx.set = true; - } - }// TODO : no Sound API case -} - -SndStreamVariableBufferCallback OSystem_PalmOS5::sound_callback() { - return sndCallback; -} - -bool OSystem_PalmOS5::setupMixer() { - Err e; - Boolean success = false; - - uint32 samplesPerSec; - if (ConfMan.hasKey("output_rate")) - samplesPerSec = ConfMan.getInt("output_rate"); - else - samplesPerSec = SAMPLES_PER_SEC; - - _mixerMgr = new Audio::MixerImpl(this, samplesPerSec); - - if (!_sound.active) { - if (gVars->fmQuality != FM_QUALITY_INI) { - ConfMan.setBool("FM_medium_quality", (gVars->fmQuality == FM_QUALITY_MED)); - ConfMan.setBool("FM_high_quality", (gVars->fmQuality == FM_QUALITY_HI)); - } - -#if defined (COMPILE_OS5) - CALLBACK_INIT(_soundEx); -#endif - _sound.proc = 0; - _sound.param = _mixerMgr; - _sound.active = true; // always true when we call this function, false when sound is off - - _soundEx.handle = 0; - _soundEx.size = 0; // set by the callback - _soundEx.set = false; - _soundEx.dataP = NULL; // set by the handler - - // try to create sound stream - if (OPTIONS_TST(kOptPalmSoundAPI)) { - e = SndStreamCreateExtended( - &_soundEx.handle, - sndOutput, - sndFormatPCM, - samplesPerSec, - sndInt16Little, - sndStereo, - sound_callback(), - &_soundEx, - 8192 -#ifdef COMPILE_OS5 - ,true -#endif - ); - - e = e ? e : SndStreamStart(_soundEx.handle); - e = e ? e : SndStreamSetVolume(_soundEx.handle, 1024L * gVars->palmVolume / 100); - success = (e == errNone); - - // no Sound API - } else { - _soundEx.size = 512; - _soundEx.dataP = MemPtrNew(_soundEx.size); - } - } - // if not true some scenes (indy3 256,...) may freeze (ESC to skip) - - _mixerMgr->setReady(true); - - return true; -} - -void OSystem_PalmOS5::clearSoundCallback() { - if (_sound.active) { - if (OPTIONS_TST(kOptPalmSoundAPI)) { - SndStreamStop(_soundEx.handle); - SndStreamDelete(_soundEx.handle); - } - - if (_soundEx.dataP) - MemPtrFree(_soundEx.dataP); - } - - _sound.active = false; - _soundEx.handle = NULL; - _soundEx.dataP = NULL; -} diff --git a/backends/platform/PalmOS/Src/os5ex_sound.cpp b/backends/platform/PalmOS/Src/os5ex_sound.cpp deleted file mode 100644 index f27f5a202d..0000000000 --- a/backends/platform/PalmOS/Src/os5ex_sound.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_os5ex.h" -#include "sound/mixer_intern.h" - -static SYSTEM_CALLBACK Err sndCallbackEx(void* UserDataP, SndStreamRef stream, void* bufferP, UInt32 *bufferSizeP) { - CALLBACK_PROLOGUE - SoundType *_sound = ((SoundExType *)UserDataP)->sound; -// ((SoundProc)_sound->proc)(_sound->param, (byte *)bufferP, *bufferSizeP); - - Audio::MixerImpl *_mixerMgr = ( Audio::MixerImpl *)_sound->param; - _mixerMgr->mixCallback((byte *)bufferP, *bufferSizeP); - - CALLBACK_EPILOGUE - return errNone; -} - -SndStreamVariableBufferCallback OSystem_PalmOS5Ex::sound_callback() { - return sndCallbackEx; -} diff --git a/backends/platform/PalmOS/Src/palmdefs.h b/backends/platform/PalmOS/Src/palmdefs.h deleted file mode 100644 index d37b533a21..0000000000 --- a/backends/platform/PalmOS/Src/palmdefs.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef PALMDEFS_H -#define PALMDEFS_H - -#define appFileCreator 'ScVM' -#define sysAppLaunchCustomEngineDelete (sysAppLaunchCmdCustomBase + 0) -#define sysAppLaunchCustomEngineGetInfo (sysAppLaunchCmdCustomBase + 1) - -enum { - GET_NONE = 0, - GET_DATACOMMON = 1 << 1, - GET_DATAENGINE = 1 << 2, - - GET_MODE68K = 1 << 14, - GET_MODEARM = 1 << 15, -}; - -SysAppInfoPtr SysGetAppInfo(SysAppInfoPtr *uiAppPP, SysAppInfoPtr *actionCodeAppPP) - SYS_TRAP(sysTrapSysGetAppInfo); - - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/compile.h b/backends/platform/PalmOS/Src/prefixes/compile.h deleted file mode 100644 index bb7230187a..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/compile.h +++ /dev/null @@ -1,76 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __COMPILE_H__ -#define __COMPILE_H__ - -#undef ENABLE_SCUMM -#undef ENABLE_SCUMM_7_8 -#undef ENABLE_HE - -#undef ENABLE_AGOS -#undef ENABLE_SKY -#undef ENABLE_SWORD1 -#undef ENABLE_SWORD2 -#undef ENABLE_QUEEN -#undef ENABLE_SAGA -#undef ENABLE_KYRA -#undef ENABLE_AWE -#undef ENABLE_GOB -#undef ENABLE_LURE -#undef ENABLE_CINE -#undef ENABLE_AGI -#undef ENABLE_TOUCHE -#undef ENABLE_PARALLACTION -#undef ENABLE_CRUISE -#undef ENABLE_DRASCULA - -// ScummVM -#define USE_SCALERS -#define DISABLE_FANCY_THEMES -//#define CT_NO_TRANSPARENCY -//#define REDUCE_MEMORY_USAGE - -#include "compile_base.h" - -//#define DISABLE_ADLIB -//#define DISABLE_LIGHTSPEED - -#ifdef COMPILE_ZODIAC -# undef DISABLE_FANCY_THEMES -# define USE_ZLIB -// set an external ZLIB since save/load implementation -// doesn't support built-in zodiac version which is 1.1.4 -// (seen inflateInit2 which err on "MAX_WBITS + 32") -# define USE_ZLIB_EXTERNAL -# define DISABLE_SONY -#endif - -#ifdef COMPILE_OS5 -# define DISABLE_TAPWAVE -# define USE_ZLIB -#endif - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_agi.h b/backends/platform/PalmOS/Src/prefixes/native_agi.h deleted file mode 100644 index f3feee8c70..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_agi.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_AGI STATIC_PLUGIN - -#undef USE_MAD -#undef USE_VORBIS -#undef USE_TREMOR - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_agos.h b/backends/platform/PalmOS/Src/prefixes/native_agos.h deleted file mode 100644 index 8a804e3116..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_agos.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_AGOS STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_cine.h b/backends/platform/PalmOS/Src/prefixes/native_cine.h deleted file mode 100644 index 3d19d9c557..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_cine.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_CINE STATIC_PLUGIN -#define _DEBUG - -#undef USE_MAD -#undef USE_VORBIS -#undef USE_TREMOR - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_common.h b/backends/platform/PalmOS/Src/prefixes/native_common.h deleted file mode 100644 index af4db70932..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_common.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef ZNATIVE_COMMON_H -#define ZNATIVE_COMMON_H - -#include "compile.h" - -#define __TWNEW_H__ - -#define PALMOS_ARM -#define DISABLE_LIGHTSPEED - -#define USE_MAD -#define USE_TREMOR -#define USE_VORBIS -//#define USE_MPEG2 - -// enable assert -//#define _DEBUG - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_cruise.h b/backends/platform/PalmOS/Src/prefixes/native_cruise.h deleted file mode 100644 index 89e6e65a70..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_cruise.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_CRUISE STATIC_PLUGIN - -#undef USE_MAD -#undef USE_VORBIS -#undef USE_TREMOR - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_drascula.h b/backends/platform/PalmOS/Src/prefixes/native_drascula.h deleted file mode 100644 index 35bc381af4..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_drascula.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_DRASCULA STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_gob.h b/backends/platform/PalmOS/Src/prefixes/native_gob.h deleted file mode 100644 index 9cb34099d0..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_gob.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_GOB STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_kyra.h b/backends/platform/PalmOS/Src/prefixes/native_kyra.h deleted file mode 100644 index 3b09c63a6f..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_kyra.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_KYRA STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_lure.h b/backends/platform/PalmOS/Src/prefixes/native_lure.h deleted file mode 100644 index 71835ee644..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_lure.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_LURE STATIC_PLUGIN - -#undef USE_MAD -#undef USE_VORBIS -#undef USE_TREMOR - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_m4.h b/backends/platform/PalmOS/Src/prefixes/native_m4.h deleted file mode 100644 index 3bf85460a6..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_m4.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_M4 STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_made.h b/backends/platform/PalmOS/Src/prefixes/native_made.h deleted file mode 100644 index fd439ed181..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_made.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_MADE STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_parallaction.h b/backends/platform/PalmOS/Src/prefixes/native_parallaction.h deleted file mode 100644 index e8d46cc382..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_parallaction.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_PARALLACTION STATIC_PLUGIN - -#undef USE_MAD -#undef USE_VORBIS -#undef USE_TREMOR - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_queen.h b/backends/platform/PalmOS/Src/prefixes/native_queen.h deleted file mode 100644 index 85bb5a0a04..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_queen.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_QUEEN STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_saga.h b/backends/platform/PalmOS/Src/prefixes/native_saga.h deleted file mode 100644 index 19db05b633..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_saga.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_SAGA STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_scumm.h b/backends/platform/PalmOS/Src/prefixes/native_scumm.h deleted file mode 100644 index b8433a3fa8..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_scumm.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_SCUMM STATIC_PLUGIN -#define ENABLE_SCUMM_7_8 -#define ENABLE_HE - -#define USE_ARM_GFX_ASM -#define USE_ARM_SMUSH_ASM - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_sky.h b/backends/platform/PalmOS/Src/prefixes/native_sky.h deleted file mode 100644 index 49b157471f..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_sky.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_SKY STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_sword1.h b/backends/platform/PalmOS/Src/prefixes/native_sword1.h deleted file mode 100644 index 6ae7bb9050..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_sword1.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_SWORD1 STATIC_PLUGIN -#define USE_MPEG2 -#define USE_VORBIS - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_sword2.h b/backends/platform/PalmOS/Src/prefixes/native_sword2.h deleted file mode 100644 index 5e9c45b047..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_sword2.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_SWORD2 STATIC_PLUGIN -#undef _DEBUG -#define USE_MPEG2 -#define USE_VORBIS - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/native_touche.h b/backends/platform/PalmOS/Src/prefixes/native_touche.h deleted file mode 100644 index acf50e2787..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/native_touche.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#include "native_common.h" -#define ENABLE_TOUCHE STATIC_PLUGIN - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/prefix_frontend.h b/backends/platform/PalmOS/Src/prefixes/prefix_frontend.h deleted file mode 100644 index 8473214746..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/prefix_frontend.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -#define PALMOS_68K -#define PALMOS_MODE - -//#define _DEBUG_ENGINE - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/prefix_os5.h b/backends/platform/PalmOS/Src/prefixes/prefix_os5.h deleted file mode 100644 index 6d84c543af..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/prefix_os5.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -// PalmOS -#define PALMOS_MODE -#define PALMOS_68K -#define PALMOS_NATIVE - -#define COMPILE_OS5 -#define DISABLE_SONY -#define DISABLE_PA1LIB - -#endif diff --git a/backends/platform/PalmOS/Src/prefixes/prefix_zodiac.h b/backends/platform/PalmOS/Src/prefixes/prefix_zodiac.h deleted file mode 100644 index 49331d356f..0000000000 --- a/backends/platform/PalmOS/Src/prefixes/prefix_zodiac.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PREFIX_H -#define PREFIX_H - -// PalmOS -#define PALMOS_MODE -#define PALMOS_68K -#define PALMOS_NATIVE - -#define COMPILE_ZODIAC -#define DISABLE_SONY -#define DISABLE_PA1LIB - -#endif diff --git a/backends/platform/PalmOS/Src/rumble.cpp b/backends/platform/PalmOS/Src/rumble.cpp deleted file mode 100644 index 513152f49c..0000000000 --- a/backends/platform/PalmOS/Src/rumble.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include -#include "globals.h" -#include "vibrate.h" -#include "rumble.h" - -#ifndef DISABLE_TAPWAVE -#include "tapwave.h" - -TwDeviceHandle hRumble; -#endif - -Boolean RumbleExists() { - Boolean exists = false; - Err e; - -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - e = TwDeviceOpen(&hRumble, "vibrator0", "w"); - if (!e) { - exists = true; - TwDeviceClose(hRumble); - } - - } else -#endif - { -#ifndef PALMOS_ARM - - UInt32 romVersion; - - e = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - if (!e) { - if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) { - Boolean active = false; - e = HwrVibrateAttributes(0, kHwrVibrateActive, &active); - exists = (!e) ? true : exists; - } - } -#endif - } - - - return exists; -} - -void RumbleRun(Boolean active) { -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - if (active) { - UInt8 buf[] = { '\64', '\100' }; - TwDeviceControl(hRumble, 'play', buf, sizeof(buf)); - } else { - TwDeviceControl(hRumble, 'stop', 0, 0); - } - - } else -#endif - { -#ifndef PALMOS_ARM - UInt32 pattern = active ? 0xFF000000 : 0x00000000; - - HwrVibrateAttributes(1, kHwrVibratePattern, &pattern); - HwrVibrateAttributes(1, kHwrVibrateActive, &active); -#endif - } - -} - -Boolean RumbleInit() { - Boolean done = false; - -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - Err e = TwDeviceOpen(&hRumble, "vibrator0", "w"); - done = (!e); - - } else -#endif - { -#ifndef PALMOS_ARM - if (RumbleExists()) { - UInt16 cycle = (SysTicksPerSecond())/2; - UInt32 pattern = 0xFF000000; - UInt16 delay = 1; - UInt16 repeat = 1; - - HwrVibrateAttributes(1, kHwrVibrateRate, &cycle); - HwrVibrateAttributes(1, kHwrVibratePattern, &pattern); - HwrVibrateAttributes(1, kHwrVibrateDelay, &delay); - HwrVibrateAttributes(1, kHwrVibrateRepeatCount, &repeat); - - done = true; - } -#endif - } - return done; -} - -void RumbleRelease() { -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - TwDeviceClose(hRumble); - - } else -#endif - { -#ifndef PALMOS_ARM - UInt32 pattern = 0x00000000; - Boolean active = false; - - HwrVibrateAttributes(1, kHwrVibratePattern, &pattern); - HwrVibrateAttributes(1, kHwrVibrateActive, &active); -#endif - } -} diff --git a/backends/platform/PalmOS/Src/rumble.h b/backends/platform/PalmOS/Src/rumble.h deleted file mode 100644 index 680c0eb164..0000000000 --- a/backends/platform/PalmOS/Src/rumble.h +++ /dev/null @@ -1,34 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef __RUMBLE_H__ -#define __RUMBLE_H__ - -Boolean RumbleExists (); -void RumbleRun (Boolean active); -Boolean RumbleInit (); -void RumbleRelease (); - -#endif diff --git a/backends/platform/PalmOS/Src/snd_pa1.cpp b/backends/platform/PalmOS/Src/snd_pa1.cpp deleted file mode 100644 index ddaf6495f6..0000000000 --- a/backends/platform/PalmOS/Src/snd_pa1.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include - -#include "native.h" -#include "globals.h" - -#ifdef COMPILE_PA1SND -# include -#endif - - -static Int32 diffLookup[16] = { - 1,3,5,7,9,11,13,15, - -1,-3,-5,-7,-9,-11,-13,-15, -}; - -static Int32 indexScale[16] = { - 0x0e6, 0x0e6, 0x0e6, 0x0e6, 0x133, 0x199, 0x200, 0x266, - 0x0e6, 0x0e6, 0x0e6, 0x0e6, 0x133, 0x199, 0x200, 0x266 /* same value for speedup */ -}; - -static int limit(int val,int min,int max) { - if (valmax) return max; - else return val; -} - -void pcm2adpcm(Int16 *src, UInt8 *dst, UInt32 length) { -#ifndef COMPILE_PA1SND -/* - if (OPTIONS_TST(kOptDeviceARM)) { - PnoDescriptor pno; - ARMPa1SndType userData = {src, dst, length}; - - MemPtr armP = _PnoInit(ARM_PA1SND, &pno); - _PnoCall(&pno, &userData); - _PnoFree(&pno, armP); - - return; - } -*/ - int data,val,diff; - int signal,step; -#else - long chan1, chan2; - long data,val,diff; - long signal,step; -#endif - - signal = 0; - step = 0x7F; - length >>= 3; // 16bit stereo -> 4bit mono - - do { - - // high nibble -#ifdef COMPILE_PA1SND - chan1 = ByteSwap16(*src); - src++; - chan2 = ByteSwap16(*src); - src++; - - diff = ((chan1 + chan2) >> 1) - signal; -#else - diff = ((*src++ + *src++) >> 1) - signal; -#endif - diff <<= 3; - diff /= step; - - val = abs(diff) >> 1; - - if (val > 7) val = 7; - if (diff < 0) val+= 8; - - signal+= (step * diffLookup[val]) >> 3; - signal = limit(signal, -32768, 32767); - - step = (step * indexScale[val]) >> 8; - step = limit(step, 0x7F, 0x6000); - - data = val; - - // low nibble -#ifdef COMPILE_PA1SND - chan1 = ByteSwap16(*src); - src++; - chan2 = ByteSwap16(*src); - src++; - - diff = ((chan1 + chan2) >> 1) - signal; -#else - diff = ((*src++ + *src++) >> 1) - signal; -#endif - diff <<= 3; - diff /= step; - - val = abs(diff) >> 1; - - if (val > 7) val = 7; - if (diff < 0) val+= 8; - - signal+= (step * diffLookup[val]) >> 3; - signal = limit(signal, -32768, 32767); - - step = (step * indexScale[val]) >> 8; - step = limit(step, 0x7F, 0x6000); - - data |= val << 4; - - *dst++ = (UInt8)data; - - } while (--length); - -} diff --git a/backends/platform/PalmOS/Src/stuffs.h b/backends/platform/PalmOS/Src/stuffs.h deleted file mode 100644 index 25bf17c8c6..0000000000 --- a/backends/platform/PalmOS/Src/stuffs.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef STUFFS_H -#define STUFFS_H - -enum { - kOptNone = 0, - kOptDeviceARM = 1 << 0x00, - kOptDeviceOS5 = 1 << 0x01, - kOptDeviceClie = 1 << 0x02, - kOptDeviceZodiac = 1 << 0x03, - kOptModeWide = 1 << 0x04, - kOptModeLandscape = 1 << 0x05, - kOptMode16Bit = 1 << 0x06, - kOptModeHiDensity = 1 << 0x07, - kOptCollapsible = 1 << 0x08, - kOptDisableOnScrDisp = 1 << 0x09, - kOpt5WayNavigatorV1 = 1 << 0x0A, - kOpt5WayNavigatorV2 = 1 << 0x0B, - kOptPalmSoundAPI = 1 << 0x0C, - kOptSonyPa1LibAPI = 1 << 0x0D, - kOptGoLcdAPI = 1 << 0x0E, - kOptLightspeedAPI = 1 << 0x0F, - kOptModeRotatable = 1 << 0x10, - - kOptDeviceProcX86 = 1 << 0x1F // DEBUG only -}; - -// WARNING : you need to define OPTIONS_DEF() -#define OPTIONS_TST(x) (OPTIONS_DEF() & (x)) -#define OPTIONS_SET(x) OPTIONS_DEF() |= (x) -#define OPTIONS_RST(x) OPTIONS_DEF() &= ~(x) - -#endif diff --git a/backends/platform/PalmOS/Src/vibrate.h b/backends/platform/PalmOS/Src/vibrate.h deleted file mode 100644 index 37604be5b7..0000000000 --- a/backends/platform/PalmOS/Src/vibrate.h +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************************** -** ** -** vibrate.h ** -** ** -** Definitions for setting/retrieving the state of the vibrator on ** -** PalmOS 4.x devices. These calls are not officially supported by ** -** Palm Inc and subsidiaries. It is not guaranteed that these calls ** -** will work at all or at least the same on every device. YOU ARE ** -** USING THESE ENTIRELY ON YOUR VERY OWN RISK ! ** -** ** -** Please send corrections to dseifert@dseifert.com ** -**********************************************************************/ - -#include - -/* HwrVibrateAttributes takes three arguments: -** Boolean set Should the setting be set (1) or retrieved (0) -** UInt32 setting what should be set -** void* value pointer to the value to set, or to store the -** retrieved setting -*/ - -Err HwrVibrateAttributes(Boolean set, UInt32 setting, void *value) - SYS_TRAP(sysTrapHwrVibrateAttributes); - -/* to determine whether the vibrator is supported on a specific device, you -** need to make sure that you are running on PalmOS 4.x (so that the -** trap exists), that the attention manager exists and you need to check -** whether HwrVibrateAttributes(0, 1, &active) returns an error code of -** 0. ('active' is a Boolean). -*/ - - -/***************************************************************/ -/* For the second parameter, the following defines can be used */ -/***************************************************************/ - -/* *value points to a Boolean stating the state of the vibrator */ -#define kHwrVibrateActive 1 - -/* *value points to a UInt16, specifying the length of one cycle. -** value is in ticks (1/100 seconds) */ -#define kHwrVibrateRate 2 - -/* *value points to a UInt32, specifying the pattern of vibrating -** -** example: -** 0xFFFFFFFF stay on, no vibrating -** 0x0F0F0F0F vibrate four times in equal intervals -** 0xAAAAAAAA vibrate really fast (not recommended) -** 0x0F0F0000 vibrate twice, then pause -*/ -#define kHwrVibratePattern 3 - -/* *value points to a UInt16, specifying the delay between two -** cycles in ticks */ -#define kHwrVibrateDelay 4 - -/* *value points to a UInt16 specifying the amount of repeats. */ -#define kHwrVibrateRepeatCount 5 - diff --git a/backends/platform/PalmOS/Src/zodiac_event.cpp b/backends/platform/PalmOS/Src/zodiac_event.cpp deleted file mode 100644 index f629c4cbd6..0000000000 --- a/backends/platform/PalmOS/Src/zodiac_event.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_zodiac.h" - -bool OSystem_PalmZodiac::check_event(Common::Event &event, EventPtr ev) { - if (ev->eType == keyUpEvent) { - switch (ev->data.keyDown.chr) { - case vchrActionLeft: - event.type = Common::EVENT_LBUTTONUP; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - - case vchrActionRight: - event.type = Common::EVENT_RBUTTONUP; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - } - - } else if (ev->eType == keyDownEvent) { - switch (ev->data.keyDown.chr) { - // F5 = menu - case vchrThumbWheelBack: - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = Common::ASCII_F5; - event.kbd.flags = 0; - return true; - - case vchrTriggerLeft: - hotswap_gfx_mode(_mode == GFX_WIDE ? GFX_NORMAL: GFX_WIDE); - return false; // not a key - - case vchrTriggerRight: - setFeatureState(kFeatureAspectRatioCorrection, 0); - return false; // not a key - - case vchrActionLeft: - event.type = Common::EVENT_LBUTTONDOWN; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - - case vchrActionRight: - event.type = Common::EVENT_RBUTTONDOWN; - event.mouse.x = _mouseCurState.x; - event.mouse.y = _mouseCurState.y; - return true; - - // skip text - case vchrActionDown: - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_PERIOD; - event.kbd.ascii = '.'; - event.kbd.flags = 0; - return true; - - // trun off - case vchrAutoOff: - case vchrPowerOff: - // pause the sound thread if any - if (_sound.active) - SndStreamPause(_soundEx.handle, true); - break; - - case vchrLateWakeup: - // resume the sound thread if any - if (_sound.active) - SndStreamPause(_soundEx.handle, false); - break; - } - - } - - return false; -} diff --git a/backends/platform/PalmOS/Src/zodiac_gfx.cpp b/backends/platform/PalmOS/Src/zodiac_gfx.cpp deleted file mode 100644 index 98c563e101..0000000000 --- a/backends/platform/PalmOS/Src/zodiac_gfx.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_zodiac.h" -#include "common/config-manager.h" -#include "rumble.h" - -static asm Err _TwGfxOpen(void **aResult, void *aInfoResult) { - stmfd sp!, {r4-r11,lr} - ldr r9, [r9] - ldr r9, [r9] - sub sp, sp, #0x24 - mov r6, r0 - mov r7, r1 - ldr pc, =0x200995F0 -} - -int OSystem_PalmZodiac::getDefaultGraphicsMode() const { - return GFX_WIDE; -} - -void OSystem_PalmZodiac::load_gfx_mode() { - Err e; - - if (_gfxLoaded) - return; - _gfxLoaded = true; - - // get command line config - _fullscreen = ConfMan.getBool("fullscreen"); // TODO : (NORMAL mode) - _ratio.adjustAspect = ConfMan.getBool("aspect_ratio") ? kRatioHeight : kRatioNone; - - // precalc ratio (WIDE mode) - _ratio.width = (gVars->screenFullHeight * _screenWidth / _screenHeight); - _ratio.height = (gVars->screenFullWidth * _screenHeight / _screenWidth); - - _offScreenP = (byte *)MemPtrNew(_screenWidth * _screenHeight); - - MemSet(_offScreenP, _screenWidth * _screenHeight, 0); - MemSet(_nativePal, sizeof(_nativePal), 0); - MemSet(_currentPalette, sizeof(_currentPalette), 0); - - UInt32 depth = 16; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - - _sysOldOrientation = SysGetOrientation(); - _sysOldTriggerState = PINGetInputTriggerState(); - SysSetOrientation(sysOrientationLandscape); - SysSetOrientationTriggerState(sysOrientationTriggerDisabled); - PINSetInputTriggerState(pinInputTriggerDisabled); - - gVars->indicator.on = Graphics::RGBToColor >(0,255,0); - gVars->indicator.off = Graphics::RGBToColor >(0,0,0); - - _screenH = WinGetDisplayWindow(); - _screenP = (byte *)BmpGetBits(WinGetBitmap(_screenH)); - - e = _TwGfxOpen((void **)&_gfxH, 0); - e = TwGfxGetPalmDisplaySurface(_gfxH, &_palmScreenP); - - // overlay buffer - TwGfxSurfaceInfoType nfo = { - sizeof(TwGfxSurfaceInfoType), - _screenWidth, _screenHeight, _screenWidth * 2, - twGfxLocationAcceleratorMemory, - twGfxPixelFormatRGB565_LE - }; - e = TwGfxAllocSurface(_gfxH, &_overlayP, &nfo); - - // prepare main bitmap - _srcBmp.size = sizeof(TwGfxBitmapType); - _srcBmp.width = _screenWidth; - _srcBmp.height = _screenHeight; - _srcBmp.rowBytes = _screenWidth; - _srcBmp.pixelFormat = twGfxPixelFormat8bpp; - _srcBmp.data = _offScreenP; - _srcBmp.palette = (UInt16 *)_nativePal; - - _srcRect.x = 0; - _srcRect.y = 0; - _srcRect.w = _screenWidth; - _srcRect.h = _screenHeight; - - hotswap_gfx_mode(_mode); -} - -void OSystem_PalmZodiac::hotswap_gfx_mode(int mode) { - Err e; - TwGfxSetClip(_palmScreenP, 0); - WinSetDrawWindow(_screenH); - - _screenDest.w = _screenWidth; - _screenDest.h = _screenHeight; - - // prevent bad DIA redraw (Stat part) - if (mode == GFX_NORMAL) { - _redawOSD = true; - _stretched = (_screenWidth > gVars->screenWidth); - StatShow(); - PINSetInputAreaState(pinInputAreaOpen); - - if (_stretched) { - calc_rect(false); - } else { - // offsets - _screenOffset.x = (gVars->screenWidth - _screenWidth) / 2; - _screenOffset.y = (gVars->screenHeight - _screenHeight) / 2; - - // clip Tapwave API - TwGfxRectType rt = { _screenOffset.x, _screenOffset.y, _screenWidth, _screenHeight }; - TwGfxSetClip(_palmScreenP, &rt); - } - - } else { - _redawOSD = false; - _stretched = true; - PINSetInputAreaState(pinInputAreaClosed); - StatHide(); - - calc_rect(true); - } - - if (_stretched) { - OPTIONS_SET(kOptDisableOnScrDisp); - TwGfxSetClip(_palmScreenP, &_dstRect); - - if (!_tmpScreenP) { - // wide buffer - TwGfxSurfaceInfoType nfo = { - sizeof(TwGfxSurfaceInfoType), - _screenWidth, _screenHeight, _screenWidth * 2, - twGfxLocationAcceleratorMemory, - twGfxPixelFormatRGB565_LE - }; - e = TwGfxAllocSurface(_gfxH, &_tmpScreenP, &nfo); - } - } else { - OPTIONS_RST(kOptDisableOnScrDisp); - if (_tmpScreenP) { - e = TwGfxFreeSurface(_tmpScreenP); - _tmpScreenP = NULL; - } - } - - _mode = mode; - _srcPos.x = _screenOffset.x; - _srcPos.y = _screenOffset.y; - clear_screen(); -// updateScreen(); -} - -void OSystem_PalmZodiac::unload_gfx_mode() { - Err e; - - if (!_gfxLoaded) - return; - _gfxLoaded = false; - - if (_tmpScreenP) { - e = TwGfxFreeSurface(_tmpScreenP); - _tmpScreenP = NULL; - } - - e = TwGfxFreeSurface(_overlayP); - e = TwGfxClose(_gfxH); - - UInt32 depth = 8; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - clear_screen(); - - MemPtrFree(_offScreenP); - - PINSetInputTriggerState(_sysOldTriggerState); - SysSetOrientation(_sysOldOrientation); - StatShow(); - PINSetInputAreaState(pinInputAreaOpen); -} - -static void rumblePack(Boolean active) { - if (!gVars->vibrator) - return; - - RumbleRun(active); -} - -void OSystem_PalmZodiac::int_setShakePos(int shakeOffset) { - if (shakeOffset == 0) - rumblePack(false); -} - -void OSystem_PalmZodiac::updateScreen() { - Err e; - - // draw the mouse pointer - draw_mouse(); - - // update the screen - if (_overlayVisible) { - if (_stretched) { - TwGfxRectType dst = {_dstRect.x, _dstRect.y, _dstRect.w, _dstRect.h}; - e = TwGfxStretchBlt2(_palmScreenP, &dst, _overlayP, &_srcRect, twGfxStretchFast| (gVars->filter ? twGfxStretchSmooth : 0)); - } else { - e = TwGfxBitBlt(_palmScreenP, &_srcPos, _overlayP, &_srcRect); - } - - } else { - if (_stretched) { - TwGfxPointType pos = {0, 0}; - TwGfxRectType dst = {_dstRect.x, _dstRect.y, _dstRect.w, _dstRect.h}; - - if (_new_shake_pos != _current_shake_pos) { - TwGfxRectType r = { _screenOffset.x, _screenOffset.y, _dstRect.w, _new_shake_pos }; - - if (_new_shake_pos != 0) { - TwGfxFillRect(_palmScreenP, &r, 0); - rumblePack(_new_shake_pos >= 3); - } - r.y += dst.h; - r.h = _current_shake_pos; - TwGfxFillRect(_palmScreenP, &r, 0); - - _current_shake_pos = _new_shake_pos; - dst.y += _new_shake_pos; - } - e = TwGfxDrawBitmap(_tmpScreenP, &pos, &_srcBmp); - e = TwGfxWaitForVBlank(_gfxH); - e = TwGfxStretchBlt2(_palmScreenP, &dst, _tmpScreenP, &_srcRect, twGfxStretchFast| (gVars->filter ? twGfxStretchSmooth : 0)); - - } else { - TwGfxPointType pos = {_srcPos.x, _srcPos.y}; - - if (_new_shake_pos != _current_shake_pos) { - if (_new_shake_pos != 0) { - TwGfxRectType r = { _screenOffset.x, _screenOffset.y, _screenWidth, _new_shake_pos }; - TwGfxFillRect(_palmScreenP, &r, 0); - rumblePack(_new_shake_pos >= 3); - } - _current_shake_pos = _new_shake_pos; - pos.y += _new_shake_pos; - } - e = TwGfxDrawBitmap(_palmScreenP, &pos, &_srcBmp); - } - } - - // undraw the mouse - undraw_mouse(); -} - -void OSystem_PalmZodiac::draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color) { - if (_mode != GFX_NORMAL) - return; - MemHandle hTemp = DmGetResource(bitmapRsc, id + 100); - - if (hTemp) { - RGBColorType oldRGB; - static const RGBColorType pal[4] = { - {0,0,255,0}, - {0,255,255,0}, - {0,255,0,0}, - {0,0,0,0} - }; - - BitmapType *bmTemp; - bmTemp = (BitmapType *)MemHandleLock(hTemp); - - Coord w, h; - WinGetBitmapDimensions(bmTemp, &w, &h); // return the size of the low density bmp - - PointType dst = { _screenOffset.x + x, _screenOffset.y + y }; - RectangleType c, r = { dst.x, dst.y, w * 2, h * 2 }; - - UInt16 old = WinSetCoordinateSystem(kCoordinatesNative); - WinSetDrawWindow(_screenH); - if (show) { - WinSetForeColorRGB(&pal[3], &oldRGB); - WinSetBackColorRGB(&pal[color], &oldRGB); - WinPaintBitmap(bmTemp, dst.x, dst.y); - } else { - WinSetBackColorRGB(&pal[3], &oldRGB); - WinFillRectangle(&r, 0); - } - WinSetCoordinateSystem(old); - - MemPtrUnlock(bmTemp); - DmReleaseResource(hTemp); - } -} diff --git a/backends/platform/PalmOS/Src/zodiac_mouse.cpp b/backends/platform/PalmOS/Src/zodiac_mouse.cpp deleted file mode 100644 index 39a789aaa1..0000000000 --- a/backends/platform/PalmOS/Src/zodiac_mouse.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_zodiac.h" - -void OSystem_PalmZodiac::draw_mouse() { - if (!_mouseDataP || _mouseDrawn || !_mouseVisible) - return; - - byte *src = _mouseDataP; - - int x = _mouseCurState.x - _mouseHotspotX; - int y = _mouseCurState.y - _mouseHotspotY; - int w = _mouseCurState.w; - int h = _mouseCurState.h; - - // clip the mouse rect - if (y < 0) { - src -= y * w; - h += y; - y = 0; - } - if (x < 0) { - src -= x; - w += x; - x = 0; - } - - if (h > _screenHeight - y) - h = _screenHeight - y; - if (w > _screenWidth - x) - w = _screenWidth - x; - - if (w <= 0 || h <= 0) - return; - - // store the bounding box so that undraw mouse can restore the area the - // mouse currently covers to its original content - _mouseOldState.x = x; - _mouseOldState.y = y; - _mouseOldState.w = w; - _mouseOldState.h = h; - - byte color; - int ww; - - if (_overlayVisible) { - uint16 *bak = (uint16 *)_mouseBackupP; - uint16 *pal = _cursorPaletteDisabled ? _nativePal : _mousePal; - uint16 *dst; - - TwGfxLockSurface(_overlayP, (void **)&dst); - dst += y * _screenWidth + x; - - do { - ww = w; - do { - *bak++ = *dst; - color = *src++; - - // transparent, don't draw - if (color != _mouseKeyColor) - *dst = pal[color]; - dst++; - } while (--ww); - - src += _mouseCurState.w - w; - dst += _screenWidth - w; - } while (--h); - - TwGfxUnlockSurface(_overlayP, true); - - } else { - byte *bak = _mouseBackupP; - byte *dst =_offScreenP + y * _screenWidth + x; - - do { - ww = w; - do { - *bak++ = *dst; - color = *src++; - - // transparent, don't draw - if (color != _mouseKeyColor) - *dst = color; - dst++; - } while (--ww); - - src += _mouseCurState.w - w; - dst += _screenWidth - w; - } while (--h); - } - - _mouseDrawn = true; -} - -void OSystem_PalmZodiac::undraw_mouse() { - if (!_mouseDrawn) - return; - - int h = _mouseOldState.h; - - // no need to do clipping here, since draw_mouse() did that already - if (_overlayVisible) { - uint16 *dst; - uint16 *bak = (uint16 *)_mouseBackupP; - - TwGfxLockSurface(_overlayP, (void **)&dst); - dst += _mouseOldState.y * _screenWidth + _mouseOldState.x; - - do { - MemMove(dst, bak, _mouseOldState.w * 2); - dst += _screenWidth; - bak += _mouseOldState.w; - } while (--h); - - TwGfxUnlockSurface(_overlayP, true); - - } else { - byte *dst = _offScreenP + _mouseOldState.y * _screenWidth + _mouseOldState.x; - byte *bak = _mouseBackupP; - - do { - MemMove(dst, bak, _mouseOldState.w); - dst += _screenWidth; - bak += _mouseOldState.w; - } while (--h); - } - - _mouseDrawn = false; -} diff --git a/backends/platform/PalmOS/Src/zodiac_overlay.cpp b/backends/platform/PalmOS/Src/zodiac_overlay.cpp deleted file mode 100644 index f8322e8fa5..0000000000 --- a/backends/platform/PalmOS/Src/zodiac_overlay.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "be_zodiac.h" -#include "common/endian.h" - -void OSystem_PalmZodiac::clearOverlay() { - if (!_overlayVisible) - return; - - Err e; - TwGfxPointType pos = {0, 0}; - TwGfxBitmapType bmp = { - sizeof(TwGfxBitmapType), - _screenWidth, _screenHeight, _screenWidth, twGfxPixelFormat8bpp, - (void *)_offScreenP, (UInt16 *)_nativePal - }; - e = TwGfxDrawBitmap(_overlayP, &pos, &bmp); -} - -void OSystem_PalmZodiac::grabOverlay(OverlayColor *buf, int pitch) { - Err e; - OverlayColor *src; - - e = TwGfxLockSurface(_overlayP, (void **)&src); - int h = _screenHeight; - do { - memcpy(buf, src, _screenWidth * 2); - src += _screenWidth; - buf += pitch; - } while (--h); - - e = TwGfxUnlockSurface(_overlayP, 0); -} - -void OSystem_PalmZodiac::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - Err e; - TwGfxPointType pos = {x, y}; - TwGfxBitmapType bmp = { - sizeof(TwGfxBitmapType), - w, h, pitch * 2 , twGfxPixelFormatRGB565_LE, - (void *)buf, 0 - }; - e = TwGfxDrawBitmap(_overlayP, &pos, &bmp); -} diff --git a/backends/platform/PalmOS/arm.bat b/backends/platform/PalmOS/arm.bat deleted file mode 100755 index 547ae391fe..0000000000 --- a/backends/platform/PalmOS/arm.bat +++ /dev/null @@ -1,3 +0,0 @@ -as.exe --defsym PALMOS_MODE=1 ../../../sound/rate_arm_asm.s -o Obj/rate_arm_asm.o -as.exe --defsym PALMOS_MODE=1 ../../../engines/scumm/gfxARM.s -o Obj/gfxARM.o -as.exe --defsym PALMOS_MODE=1 ../../../engines/scumm/smush/codec47ARM.s -o Obj/codec47ARM.o diff --git a/backends/platform/PalmOS/scummvm.mcp b/backends/platform/PalmOS/scummvm.mcp deleted file mode 100644 index a01967d059..0000000000 Binary files a/backends/platform/PalmOS/scummvm.mcp and /dev/null differ diff --git a/base/commandLine.cpp b/base/commandLine.cpp index e795b82d0a..2f4e78fd80 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -49,7 +49,7 @@ static const char USAGE_STRING[] = ; // DONT FIXME: DO NOT ORDER ALPHABETICALLY, THIS IS ORDERED BY IMPORTANCE/CATEGORY! :) -#if defined(PALMOS_MODE) || defined(__SYMBIAN32__) || defined(__GP32__) || defined(ANDROID) +#if defined(__SYMBIAN32__) || defined(__GP32__) || defined(ANDROID) static const char HELP_STRING[] = "NoUsageString"; // save more data segment space #else static const char HELP_STRING[] = @@ -944,7 +944,7 @@ Common::Error processSettings(Common::String &command, Common::StringMap &settin // environment variable. This is weaker than a --savepath on the // command line, but overrides the default savepath, hence it is // handled here, just before the command line gets parsed. -#if !defined(MACOS_CARBON) && !defined(_WIN32_WCE) && !defined(PALMOS_MODE) && !defined(__GP32__) && !defined(ANDROID) +#if !defined(_WIN32_WCE) && !defined(__GP32__) && !defined(ANDROID) if (!settings.contains("savepath")) { const char *dir = getenv("SCUMMVM_SAVEPATH"); if (dir && *dir && strlen(dir) < MAXPATHLEN) { diff --git a/base/plugins.cpp b/base/plugins.cpp index a6acd7e449..29383f1009 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -191,13 +191,6 @@ public: LINK_PLUGIN(COREAUDIO) LINK_PLUGIN(COREMIDI) #endif - #if defined(PALMOS_MODE) - # if defined(COMPILE_CLIE) - LINK_PLUGIN(YPA1) - # elif defined(COMPILE_ZODIAC) && (!defined(ENABLE_SCUMM) || !defined(PALMOS_ARM)) - LINK_PLUGIN(ZODIAC) - # endif - #endif #ifdef USE_FLUIDSYNTH LINK_PLUGIN(FLUIDSYNTH) #endif diff --git a/common/hashmap.h b/common/hashmap.h index db80f632ed..0d4d7663f3 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -68,9 +68,6 @@ template class IteratorImpl; template, class EqualFunc = EqualTo > class HashMap { private: -#if defined (PALMOS_MODE) -public: -#endif typedef HashMap HM_t; diff --git a/common/scummsys.h b/common/scummsys.h index 98dd47e171..96639716ea 100644 --- a/common/scummsys.h +++ b/common/scummsys.h @@ -243,27 +243,6 @@ #define SCUMM_NEED_ALIGNMENT #endif -#elif defined(__PALMOS_TRAPS__) || defined (__PALMOS_ARMLET__) - -#ifdef __PALMOS_ARMLET__ - #include -#endif - #define SCUMM_LITTLE_ENDIAN - - #define scumm_stricmp stricmp - #define scumm_strnicmp strnicmp - - #define SCUMM_NEED_ALIGNMENT - #define STRINGBUFLEN 256 - - extern const char *SCUMMVM_SAVEPATH; - - #if !defined(COMPILE_ZODIAC) && !defined(COMPILE_OS5) - # define NEWGUI_256 - #else - # undef UNUSED - #endif - #elif defined(__DC__) #define scumm_stricmp strcasecmp diff --git a/common/textconsole.cpp b/common/textconsole.cpp index 2e5a347489..b959b8ec23 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -155,11 +155,6 @@ void NORETURN_PRE error(const char *s, ...) { __android_log_assert("Fatal error", "ScummVM", "%s", buf_output); #endif -#ifdef PALMOS_MODE - extern void PalmFatalError(const char *err); - PalmFatalError(buf_output); -#endif - #ifdef __SYMBIAN32__ Symbian::FatalError(buf_output); #endif diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp index e6d0359059..2f38aa98ba 100644 --- a/engines/cruise/cruise.cpp +++ b/engines/cruise/cruise.cpp @@ -52,10 +52,6 @@ CruiseEngine *_vm; CruiseEngine::CruiseEngine(OSystem * syst, const CRUISEGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) { -#ifdef PALMOS_MODE - _currentVolumeFile = new Common::File(); -#endif - DebugMan.addDebugChannel(kCruiseDebugScript, "scripts", "Scripts debug level"); DebugMan.addDebugChannel(kCruiseDebugSound, "sound", "Sound debug level"); diff --git a/engines/cruise/vars.cpp b/engines/cruise/vars.cpp index 94fd00cbfd..bab5d171fd 100644 --- a/engines/cruise/vars.cpp +++ b/engines/cruise/vars.cpp @@ -64,11 +64,7 @@ int16 autoTrack; int16 currentDiskNumber = 1; -#ifdef PALMOS_MODE -Common::File *_currentVolumeFile; -#else Common::File currentVolumeFile; -#endif int16 volumeNumEntry; fileEntry *volumePtrToFileDescriptor = NULL; diff --git a/engines/cruise/vars.h b/engines/cruise/vars.h index 1e19794f3a..3cb09602cc 100644 --- a/engines/cruise/vars.h +++ b/engines/cruise/vars.h @@ -167,12 +167,7 @@ extern int16 autoTrack; extern int16 currentDiskNumber; -#ifdef PALMOS_MODE -extern Common::File *_currentVolumeFile; -#define currentVolumeFile (*_currentVolumeFile) -#else extern Common::File currentVolumeFile; -#endif extern int16 volumeNumEntry; extern fileEntry *volumePtrToFileDescriptor; diff --git a/engines/queen/resource.cpp b/engines/queen/resource.cpp index a43141ef56..1e2eff8458 100644 --- a/engines/queen/resource.cpp +++ b/engines/queen/resource.cpp @@ -96,18 +96,7 @@ ResourceEntry *Resource::resourceEntry(const char *filename) const { entryName.toUppercase(); ResourceEntry *re = NULL; -#ifndef PALMOS_MODE re = (ResourceEntry *)bsearch(entryName.c_str(), _resourceTable, _resourceEntries, sizeof(ResourceEntry), compareResourceEntry); -#else - // PALMOS FIXME (?) : still doesn't work for me (????) use this instead - uint32 cur = 0; - do { - if (!strcmp(entryName.c_str(), _resourceTable[cur].filename)) { - re = &_resourceTable[cur]; - break; - } - } while (++cur < _resourceEntries); -#endif return re; } diff --git a/engines/sword1/memman.h b/engines/sword1/memman.h index 845a8638a2..b489eae2f9 100644 --- a/engines/sword1/memman.h +++ b/engines/sword1/memman.h @@ -42,11 +42,7 @@ struct MemHandle { #define MEM_CAN_FREE 1 #define MEM_DONT_FREE 2 -#ifdef PALMOS_MODE -#define MAX_ALLOC (3*1024*1024) // max amount of mem we want to alloc(). -#else #define MAX_ALLOC (6*1024*1024) // max amount of mem we want to alloc(). -#endif class MemMan { public: diff --git a/engines/sword2/resman.h b/engines/sword2/resman.h index 72bdf73b98..dcc79927ea 100644 --- a/engines/sword2/resman.h +++ b/engines/sword2/resman.h @@ -32,11 +32,7 @@ namespace Common { class File; } -#ifdef PALMOS_MODE -#define MAX_MEM_CACHE (4 * 1024 * 1024) // 4 seems to be enough, 8 = out of memory -#else #define MAX_MEM_CACHE (8 * 1024 * 1024) // we keep up to 8 megs of resource data files in memory -#endif #define MAX_res_files 20 namespace Sword2 { diff --git a/graphics/video/mpeg_player.h b/graphics/video/mpeg_player.h index 70754fb5ed..4dedf12f57 100644 --- a/graphics/video/mpeg_player.h +++ b/graphics/video/mpeg_player.h @@ -52,10 +52,8 @@ typedef signed long int32_t; typedef unsigned long uint32_t; #endif -#elif !defined(PALMOS_MODE) -# include #else -# include +# include #endif extern "C" { diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp index e08bc09b0b..4447b62244 100644 --- a/gui/ListWidget.cpp +++ b/gui/ListWidget.cpp @@ -439,11 +439,6 @@ bool ListWidget::handleKeyDown(Common::KeyState state) { _scrollBar->draw(); } -#if !defined(PALMOS_MODE) - // not done on PalmOS because keyboard is emulated and keyup is not generated - _currentKeyDown = state.keycode; -#endif - return handled; } diff --git a/gui/console.cpp b/gui/console.cpp index a2aa56f5b3..a53e97888b 100644 --- a/gui/console.cpp +++ b/gui/console.cpp @@ -669,11 +669,7 @@ int ConsoleDialog::printf(const char *format, ...) { } int ConsoleDialog::vprintf(const char *format, va_list argptr) { -#ifdef PALMOS_MODE - char buf[256]; -#else char buf[2048]; -#endif #if defined(WIN32) int count = _vsnprintf(buf, sizeof(buf), format, argptr); diff --git a/gui/credits.h b/gui/credits.h index ae658e1196..c0e1870226 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -213,9 +213,6 @@ static const char *credits[] = { "C1""Nintendo DS", "C0""Neil Millstone", "", -"C1""PalmOS", -"C0""Chris Apers", -"", "C1""PocketPC / WinCE", "C0""Nicolas Bacca", "C2""(retired)", @@ -286,6 +283,8 @@ static const char *credits[] = { "C2""Wiki editor", "", "C1""Retired Team Members", +"C0""Chris Apers", +"C2""Former PalmOS porter", "C0""Ralph Brorsen", "C2""Help with GUI implementation", "C0""Jamieson Christian", diff --git a/sound/rate_arm_asm.s b/sound/rate_arm_asm.s index a0e116f8f7..9431ae0649 100644 --- a/sound/rate_arm_asm.s +++ b/sound/rate_arm_asm.s @@ -212,9 +212,6 @@ SimpleRate_M_end: SimpleRate_M_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) ADD r0, r0, #16 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf @@ -229,9 +226,6 @@ SimpleRate_M_read: SUBS r1, r0, #1 @ r1 = inLen-1 LDMFD r13!,{r0,r2-r3,r12,r14} BLT SimpleRate_M_end - .ifdef PALMOS_MODE - MOV r10,#0 - .endif SUBS r2, r2, #1 @ r2 = opos-- ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ BGE SimpleRate_M_loop @ and loop } @@ -297,9 +291,6 @@ SimpleRate_S_end: SimpleRate_S_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) ADD r0, r0, #16 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5) @@ -313,9 +304,6 @@ SimpleRate_S_read: SUBS r1, r0, #2 @ r1 = inLen-2 LDMFD r13!,{r0,r2-r3,r12,r14} BLT SimpleRate_S_end - .ifdef PALMOS_MODE - MOV r10,#0 - .endif SUBS r2, r2, #1 @ r2 = opos-- ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 BGE SimpleRate_S_loop @ and loop } @@ -382,9 +370,6 @@ SimpleRate_R_end: SimpleRate_R_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) ADD r0, r0, #16 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf @@ -399,9 +384,6 @@ SimpleRate_R_read: SUBS r1, r0, #2 @ r1 = inLen-2 LDMFD r13!,{r0,r2-r3,r12,r14} BLT SimpleRate_R_end - .ifdef PALMOS_MODE - MOV r10,#0 - .endif SUBS r2, r2, #1 @ r2 = opos-- ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 BGE SimpleRate_R_loop @ and loop } @@ -484,9 +466,6 @@ LinearRate_M_end: LDMFD r13!,{r4-r11,PC} LinearRate_M_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf @@ -501,9 +480,6 @@ LinearRate_M_read: SUBS r1, r0, #1 @ r1 = inLen-1 LDMFD r13!,{r0,r2-r3,r12,r14} BLT LinearRate_M_end - .ifdef PALMOS_MODE - MOV r10,#0 - .endif B LinearRate_M_read_return _ARM_LinearRate_S: @@ -592,9 +568,6 @@ LinearRate_S_end: LDMFD r13!,{r4-r11,PC} LinearRate_S_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf @@ -697,9 +670,6 @@ LinearRate_R_end: LDMFD r13!,{r4-r11,PC} LinearRate_R_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf - .ifdef PALMOS_MODE - LDR r10,[r13,#4*8] @ restore r10 - .endif STMFD r13!,{r0,r2-r3,r12,r14} MOV r1, r0 @ r1 = inBuf diff --git a/sound/softsynth/opl/mame.cpp b/sound/softsynth/opl/mame.cpp index 9e7cbfe3dc..f6da659918 100644 --- a/sound/softsynth/opl/mame.cpp +++ b/sound/softsynth/opl/mame.cpp @@ -33,7 +33,7 @@ #include "mame.h" -#if defined (_WIN32_WCE) || defined (__SYMBIAN32__) || defined(PALMOS_MODE) || defined(__GP32__) || defined(GP2X) || defined (__MAEMO__) || defined(__DS__) || defined (__MINT__) || defined(__N64__) +#if defined (_WIN32_WCE) || defined (__SYMBIAN32__) || defined(__GP32__) || defined(GP2X) || defined (__MAEMO__) || defined(__DS__) || defined (__MINT__) || defined(__N64__) #include "common/config-manager.h" #endif @@ -1212,7 +1212,7 @@ FM_OPL *makeAdLibOPL(int rate) { // We need to emulate one YM3812 chip int env_bits = FMOPL_ENV_BITS_HQ; int eg_ent = FMOPL_EG_ENT_HQ; -#if defined (_WIN32_WCE) || defined(__SYMBIAN32__) || defined(PALMOS_MODE) || defined(__GP32__) || defined (GP2X) || defined(__MAEMO__) || defined(__DS__) || defined (__MINT__) || defined(__N64__) +#if defined (_WIN32_WCE) || defined(__SYMBIAN32__) || defined(__GP32__) || defined (GP2X) || defined(__MAEMO__) || defined(__DS__) || defined (__MINT__) || defined(__N64__) if (ConfMan.hasKey("FM_high_quality") && ConfMan.getBool("FM_high_quality")) { env_bits = FMOPL_ENV_BITS_HQ; eg_ent = FMOPL_EG_ENT_HQ; diff --git a/tools/convbdf.c b/tools/convbdf.c index ad0d9d2373..fc13cff6ce 100644 --- a/tools/convbdf.c +++ b/tools/convbdf.c @@ -919,7 +919,7 @@ int gen_c_source(struct font* pf, char *path) { bbuf, pf->defaultchar); - fprintf(ofp, "\n" "#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))\n"); + fprintf(ofp, "\n" "#if !(defined(__GP32__))\n"); fprintf(ofp, "extern const NewFont g_sysfont(desc);\n"); fprintf(ofp, "#else\n"); fprintf(ofp, "DEFINE_FONT(g_sysfont)\n"); diff --git a/tools/credits.pl b/tools/credits.pl index 02a42c12cc..cf9becc9b5 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -698,10 +698,6 @@ begin_credits("Credits"); add_person("Neil Millstone", "agent-q", ""); end_section(); - begin_section("PalmOS"); - add_person("Chris Apers", "chrilith ", ""); - end_section(); - begin_section("PocketPC / WinCE"); add_person("Nicolas Bacca", "arisme", "(retired)"); add_person("Kostas Nakos", "Jubanka", ""); @@ -775,6 +771,7 @@ begin_credits("Credits"); begin_section("Retired Team Members"); begin_persons(); + add_person("Chris Apers", "chrilith ", "Former PalmOS porter"); add_person("Ralph Brorsen", "painelf", "Help with GUI implementation"); add_person("Jamieson Christian", "jamieson630", "iMUSE, MIDI, all things musical"); add_person("Felix Jakschitsch", "yot", "Zak256 reverse engineering"); -- cgit v1.2.3 From fb206fb7c0227ba24afc7c12cfd55d5219dcbe77 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 18:51:54 +0000 Subject: SCI: added uninitialized workaround for lsl3 svn-id: r50965 --- engines/sci/engine/vm.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 900d843867..c01f701f75 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -379,6 +379,10 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_LSL1, 250, 0, "increase", "handleEvent", -1, 2, { 0, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room + { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 200, { 0, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 201, { 0, 0 } }, // see above + { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 202, { 0, 0 } }, // see above + { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 203, { 0, 0 } }, // see above { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class -- cgit v1.2.3 From 48b288d9aa3fdb6079ec5d5be1cc56f1f446f945 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 17 Jul 2010 19:11:59 +0000 Subject: Fixing compilation with MSVC svn-id: r50966 --- gui/debugger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/debugger.cpp b/gui/debugger.cpp index 71728e8b13..9bd3b35915 100644 --- a/gui/debugger.cpp +++ b/gui/debugger.cpp @@ -378,7 +378,7 @@ char *Debugger::readlineComplete(const char *input, int state) { #endif // Variable registration function -void Debugger::DVar_Register(const Common::String &varname, void *pointer, int type, int arraySize) { +void Debugger::DVar_Register(const Common::String &varname, void *pointer, VarType type, int arraySize) { // TODO: Filter out duplicates // TODO: Sort this list? Then we can do binary search later on when doing lookups. assert(pointer); -- cgit v1.2.3 From 723f15c0848e828a6877365ff0453d16ebcb0589 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 19:52:19 +0000 Subject: SCI: removing kSetPort 4 argument support from r44938, which was wrong - adding workaround for lsl6 ending - fixes lsl6 ending svn-id: r50967 --- engines/sci/engine/kernel.cpp | 8 +++++++- engines/sci/engine/kgraphics.cpp | 5 ++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index cc2374f771..fd98f9c34d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -263,6 +263,12 @@ static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kSetPort_workarounds[] = { + { GID_LSL6, 740, 0, "rm740", "drawPic", -1, 0, { 1, 0 } }, // ending scene, is called with additional 3 (!) parameters + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, scriptNr,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident @@ -656,7 +662,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iii)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iiiii)(i)", NULL, kSetPort_workarounds }, { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 7d5e30ed6e..22ccf843d6 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -965,14 +965,13 @@ reg_t kSetPort(EngineState *s, int argc, reg_t *argv) { case 7: initPriorityBandsFlag = true; - case 4: case 6: picRect.top = argv[0].toSint16(); picRect.left = argv[1].toSint16(); picRect.bottom = argv[2].toSint16(); picRect.right = argv[3].toSint16(); - picTop = (argc >= 6) ? argv[4].toSint16() : 0; - picLeft = (argc >= 6) ? argv[5].toSint16() : 0; + picTop = argv[4].toSint16(); + picLeft = argv[5].toSint16(); g_sci->_gfxPorts->kernelSetPicWindow(picRect, picTop, picLeft, initPriorityBandsFlag); break; -- cgit v1.2.3 From 880bb9f421811b7c8ff170bc0332201d07b0ee65 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 17 Jul 2010 20:29:33 +0000 Subject: Add support for the altres.map/altres.000 map/volume pair in KQ7. svn-id: r50968 --- engines/sci/resource.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 1a40cba97e..731f4dd573 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -527,9 +527,13 @@ int ResourceManager::addAppropriateSources() { #endif addPatchDir("."); + if (Common::File::exists("message.map")) addSource(new VolumeResourceSource("resource.msg", addExternalMap("message.map"), 0)); + if (Common::File::exists("altres.map")) + addSource(new VolumeResourceSource("altres.000", addExternalMap("altres.map"), 0)); + return 1; } -- cgit v1.2.3 From 88dfa3142f46f1f346614dd9ca298be98023750c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 21:13:37 +0000 Subject: SCI: adding uninitialized workaround for gk1 svn-id: r50969 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c01f701f75..e066170715 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -364,6 +364,7 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_GK1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon -- cgit v1.2.3 From bbcf020457a19bf7fdbc758d5f878554058dbd08 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 22:11:35 +0000 Subject: SCI: adding detection for SCI01 vocab inside a SCI0 game that's using the SCI0 vocab resource number, fixes pq2 japanese crashing on startup svn-id: r50970 --- engines/sci/parser/vocabulary.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 7b115a815d..ad006b0ca8 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -85,6 +85,24 @@ bool Vocabulary::loadParserWords() { return false; // NOT critical: SCI1 games and some demos don't have one! } + if (_vocabVersion == kVocabularySCI0) { + if (resource->size < 26 * 2) { + warning("Invalid main vocabulary encountered: Much too small"); + return false; + } + // Check the alphabet-offset table for any content + int alphabetNr; + for (alphabetNr = 0; alphabetNr < 26; alphabetNr++) { + if (READ_LE_UINT16(resource->data + alphabetNr * 2)) + break; + } + // If all of them were empty, we are definitely seeing SCI01 vocab in disguise (e.g. pq2 japanese) + if (alphabetNr == 26) { + warning("SCI0: Found SCI01 vocabulary in disguise"); + _vocabVersion = kVocabularySCI1; + } + } + unsigned int seeker; if (_vocabVersion == kVocabularySCI1) seeker = 255 * 2; // vocab.900 starts with 255 16-bit pointers which we don't use -- cgit v1.2.3 From cd0997368cfc9f272888a96e80b1f4cc2379d0bc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 17 Jul 2010 22:59:57 +0000 Subject: SCI: adding pq2 japanese pc98 svn-id: r50972 --- engines/sci/detection_tables.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 5c2a30f282..04c2d89c6c 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2020,6 +2020,17 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Police Quest 2 - Japanese PC-98 + // SCI interpreter version unknown + {"pq2", "", { + {"resource.map", 0, "883804c616dca1d82373bf9fda3a71d2", 4656}, + {"resource.001", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 669319}, + {"resource.002", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 637662}, + {"resource.003", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 684395}, + {NULL, 0, NULL, 0}}, + Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH + }, // also includes english language + // Police Quest 3 - English Amiga // Executable scanning reports "1.004.024" // SCI interpreter version 1.000.784 -- cgit v1.2.3 From c128b87c779ab74deb494c48782fc8199c9672a5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 00:16:19 +0000 Subject: In SCI2.1, the type numbers inside resource maps/patches have changed slightly. We no longer use the number Sierra gives us directly, but use a function to convert to our ResourceType enum based on version. This allows us to read the chunk type from SCI2.1 (a form of script). Also, allow debugging of Mac-specific resources from the console. svn-id: r50973 --- engines/sci/engine/kscripts.cpp | 8 +-- engines/sci/resource.cpp | 119 +++++++++++++++++++++++++++++++++++----- engines/sci/resource.h | 26 +++++---- 3 files changed, 124 insertions(+), 29 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 029943b070..0286f7454a 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -38,7 +38,7 @@ namespace Sci { // Loads arbitrary resources of type 'restype' with resource numbers 'resnrs' // This implementation ignores all resource numbers except the first one. reg_t kLoad(EngineState *s, int argc, reg_t *argv) { - ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); + ResourceType restype = g_sci->getResMan()->convertResType(argv[0].toUint16()); int resnr = argv[1].toUint16(); // Request to dynamically allocate hunk memory for later use @@ -53,7 +53,7 @@ reg_t kLoad(EngineState *s, int argc, reg_t *argv) { // 1 or 3+ parameters is not right according to sierra sci reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { if (argc >= 2) { - ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); + ResourceType restype = g_sci->getResMan()->convertResType(argv[0].toUint16()); reg_t resnr = argv[1]; // WORKAROUND for a broken script in room 320 in Castle of Dr. Brain. @@ -73,7 +73,7 @@ reg_t kUnLoad(EngineState *s, int argc, reg_t *argv) { reg_t kLock(EngineState *s, int argc, reg_t *argv) { int state = argc > 2 ? argv[2].toUint16() : 1; - ResourceType type = (ResourceType)(argv[0].toUint16() & 0x7f); + ResourceType type = g_sci->getResMan()->convertResType(argv[0].toUint16()); ResourceId id = ResourceId(type, argv[1].toUint16()); Resource *which; @@ -115,7 +115,7 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { reg_t kResCheck(EngineState *s, int argc, reg_t *argv) { Resource *res = NULL; - ResourceType restype = (ResourceType)(argv[0].toUint16() & 0x7f); + ResourceType restype = g_sci->getResMan()->convertResType(argv[0].toUint16()); if (restype == kResourceTypeVMD) { char fileName[10]; diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 731f4dd573..f3c52e6760 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -108,30 +108,115 @@ static const char *sci_error_types[] = { "SCI version is unsupported" }; -// These are the 20 resource types supported by SCI1.1 -static const char *resourceTypeNames[] = { +static const char *s_resourceTypeNames[] = { "view", "pic", "script", "text", "sound", "memory", "vocab", "font", "cursor", "patch", "bitmap", "palette", "cdaudio", "audio", "sync", "message", "map", "heap", - "audio36", "sync36", "", "", "robot", "vmd" + "audio36", "sync36", "xlate", "robot", "vmd", + "chunk", "macibin", "macibis", "macpict" }; -static const char *resourceTypeSuffixes[] = { +static const char *s_resourceTypeSuffixes[] = { "v56", "p56", "scr", "tex", "snd", - " ", "voc", "fon", "cur", "pat", + "", "voc", "fon", "cur", "pat", "bit", "pal", "cda", "aud", "syn", - "msg", "map", "hep", "aud", "syn", - "trn", " ", "rbt", "vmd" -}; + "msg", "map", "hep", "", "", + "trn", "rbt", "vmd", "chk", "", + "", "" +}; const char *getResourceTypeName(ResourceType restype) { if (restype != kResourceTypeInvalid) - return resourceTypeNames[restype]; + return s_resourceTypeNames[restype]; else return "invalid"; } +struct ResTypeMap { + byte sciType; + ResourceType type; +}; + +static const ResTypeMap s_resTypeMapSci0[] = { + { 0, kResourceTypeView }, + { 1, kResourceTypePic }, + { 2, kResourceTypeScript }, + { 3, kResourceTypeText }, + { 4, kResourceTypeSound }, + { 5, kResourceTypeMemory }, + { 6, kResourceTypeVocab }, + { 7, kResourceTypeFont }, + { 8, kResourceTypeCursor }, + { 9, kResourceTypePatch }, + { 10, kResourceTypeBitmap }, + { 11, kResourceTypePalette }, + { 12, kResourceTypeCdAudio }, + { 13, kResourceTypeAudio }, + { 14, kResourceTypeSync }, + { 15, kResourceTypeMessage }, + { 16, kResourceTypeMap }, + { 17, kResourceTypeHeap }, + { 18, kResourceTypeAudio36 }, + { 19, kResourceTypeSync36 }, + { 20, kResourceTypeTranslation }, +}; + +#ifdef ENABLE_SCI32 +static const ResTypeMap s_resTypeMapSci21[] = { + { 0, kResourceTypeView }, + { 1, kResourceTypePic }, + { 2, kResourceTypeScript }, + { 3, kResourceTypeText }, + { 4, kResourceTypeSound }, + { 5, kResourceTypeMemory }, + { 6, kResourceTypeVocab }, + { 7, kResourceTypeFont }, + { 8, kResourceTypeCursor }, + { 9, kResourceTypePatch }, + { 10, kResourceTypeBitmap }, + { 11, kResourceTypePalette }, + // 12 is Wave, but SCI seems to just store it in Audio resources + { 13, kResourceTypeAudio }, + { 14, kResourceTypeSync }, + { 15, kResourceTypeMessage }, + { 16, kResourceTypeMap }, + { 17, kResourceTypeHeap }, + { 18, kResourceTypeChunk }, + { 19, kResourceTypeAudio36 }, + { 20, kResourceTypeSync36 }, + { 21, kResourceTypeTranslation }, + { 22, kResourceTypeRobot }, + { 23, kResourceTypeVMD } +}; +#endif + +ResourceType ResourceManager::convertResType(byte type) { + type &= 0x7f; + uint32 tableSize = 0; + const ResTypeMap *map = 0; + + if (_mapVersion != kResVersionSci32) { + // SCI0 - SCI2 + tableSize = ARRAYSIZE(s_resTypeMapSci0); + map = s_resTypeMapSci0; + } else { + // SCI2.1+ +#ifdef ENABLE_SCI32 + tableSize = ARRAYSIZE(s_resTypeMapSci21); + map = s_resTypeMapSci21; +#else + error("SCI32 support not compiled in"); +#endif + } + + for (uint32 i = 0; i < tableSize; i++) + if (map[i].sciType == type) + return map[i].type; + + return kResourceTypeInvalid; +} + //-- Resource main functions -- Resource::Resource(ResourceId id) : _id(id) { data = NULL; @@ -337,7 +422,7 @@ void MacResourceForkResourceSource::loadResource(ResourceManager *resMan, Resour Common::SeekableReadStream *stream = _macResMan->getResource(resTypeToMacTag(res->getType()), res->getNumber()); if (!stream) - error("Could not get Mac resource fork resource: %d %d", res->getType(), res->getNumber()); + error("Could not get Mac resource fork resource: %s %d", getResourceTypeName(res->getType()), res->getNumber()); int error = res->decompress(resMan->getVolVersion(), stream); if (error) { @@ -1097,7 +1182,7 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource return; } - byte patchType = fileStream->readByte() & 0x7F; + byte patchType = convertResType(fileStream->readByte()); byte patchDataOffset = fileStream->readByte(); delete fileStream; @@ -1235,7 +1320,11 @@ void ResourceManager::readResourcePatches() { const char *szResType; ResourceSource *psrcPatch; - for (int i = kResourceTypeView; i <= kResourceTypeHeap; ++i) { + for (int i = kResourceTypeView; i <= kResourceTypeInvalid; ++i) { + // Ignore the types that can't be patched (and Robot/VMD is handled externally for now) + if (!s_resourceTypeSuffixes[i] || i == kResourceTypeRobot || i == kResourceTypeVMD) + continue; + files.clear(); szResType = getResourceTypeName((ResourceType)i); // SCI0 naming - type.nnn @@ -1244,7 +1333,7 @@ void ResourceManager::readResourcePatches() { SearchMan.listMatchingMembers(files, mask); // SCI1 and later naming - nnn.typ mask = "*."; - mask += resourceTypeSuffixes[i]; + mask += s_resourceTypeSuffixes[i]; SearchMan.listMatchingMembers(files, mask); for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { @@ -1308,7 +1397,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { if (offset == 0xFFFFFFFF) break; - type = (ResourceType)(id >> 11); + type = convertResType(id >> 11); number = id & 0x7FF; ResourceId resId = ResourceId(type, number); // adding a new resource @@ -1393,7 +1482,7 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { warning("Error while reading %s", map->getLocationName().c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } - resId = ResourceId((ResourceType)type, number); + resId = ResourceId(convertResType(type), number); // adding new resource only if it does not exist if (_resMap.contains(resId) == false) { // NOTE: We add the map's volume number here to the specified volume number diff --git a/engines/sci/resource.h b/engines/sci/resource.h index f66b5b3956..d7acf3b9d6 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -95,22 +95,21 @@ enum ResourceType { kResourceTypeHeap, kResourceTypeAudio36, kResourceTypeSync36, - kResourceTypeUnknown1, // Translation, currently unsupported - kResourceTypeUnknown2, + kResourceTypeTranslation, // Currently unsupported kResourceTypeRobot, kResourceTypeVMD, - kResourceTypeInvalid, + kResourceTypeChunk, - // Mac-only resources, these resource types are self-defined - // Numbers subject to change - kResourceTypeMacIconBarPictN = -1, // IBIN resources (icon bar, not selected) - kResourceTypeMacIconBarPictS = -2, // IBIS resources (icon bar, selected) - kResourceTypeMacPict = -3 // PICT resources (inventory) + // Mac-only resources + kResourceTypeMacIconBarPictN, // IBIN resources (icon bar, not selected) + kResourceTypeMacIconBarPictS, // IBIS resources (icon bar, selected) + kResourceTypeMacPict, // PICT resources (inventory) + + kResourceTypeInvalid }; const char *getResourceTypeName(ResourceType restype); - enum ResVersion { kResVersionUnknown, kResVersionSci0Sci1Early, @@ -126,7 +125,7 @@ class ResourceSource; class ResourceId { static inline ResourceType fixupType(ResourceType type) { - if (type < kResourceTypeMacPict || type > kResourceTypeInvalid) + if (type == kResourceTypeInvalid) return kResourceTypeInvalid; return type; } @@ -344,6 +343,13 @@ public: */ reg_t findGameObject(bool addSci11ScriptOffset = true); + /** + * Converts a map resource type to our type + * @param sciType The type from the map/patch + * @return The ResourceType + */ + ResourceType convertResType(byte type); + protected: // Maximum number of bytes to allow being allocated for resources // Note: maxMemory will not be interpreted as a hard limit, only as a restriction -- cgit v1.2.3 From 4b66b8dd5f73702fb71cda6cc3d7b6f969d242e8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 00:18:27 +0000 Subject: Fix typo. svn-id: r50974 --- engines/sci/resource.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index d7acf3b9d6..f1f5f469d3 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -125,7 +125,7 @@ class ResourceSource; class ResourceId { static inline ResourceType fixupType(ResourceType type) { - if (type == kResourceTypeInvalid) + if (type >= kResourceTypeInvalid) return kResourceTypeInvalid; return type; } -- cgit v1.2.3 From 88b2bec07239b2babc7041b1361873fd331ad838 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 01:32:48 +0000 Subject: Cleanup and simplify resource type remapping. svn-id: r50975 --- engines/sci/resource.cpp | 81 ++++++++++++------------------------------------ 1 file changed, 19 insertions(+), 62 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index f3c52e6760..127236650f 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -133,87 +133,44 @@ const char *getResourceTypeName(ResourceType restype) { return "invalid"; } -struct ResTypeMap { - byte sciType; - ResourceType type; -}; - -static const ResTypeMap s_resTypeMapSci0[] = { - { 0, kResourceTypeView }, - { 1, kResourceTypePic }, - { 2, kResourceTypeScript }, - { 3, kResourceTypeText }, - { 4, kResourceTypeSound }, - { 5, kResourceTypeMemory }, - { 6, kResourceTypeVocab }, - { 7, kResourceTypeFont }, - { 8, kResourceTypeCursor }, - { 9, kResourceTypePatch }, - { 10, kResourceTypeBitmap }, - { 11, kResourceTypePalette }, - { 12, kResourceTypeCdAudio }, - { 13, kResourceTypeAudio }, - { 14, kResourceTypeSync }, - { 15, kResourceTypeMessage }, - { 16, kResourceTypeMap }, - { 17, kResourceTypeHeap }, - { 18, kResourceTypeAudio36 }, - { 19, kResourceTypeSync36 }, - { 20, kResourceTypeTranslation }, +static const ResourceType s_resTypeMapSci0[] = { + kResourceTypeView, kResourceTypePic, kResourceTypeScript, kResourceTypeText, // 0x00-0x03 + kResourceTypeSound, kResourceTypeMemory, kResourceTypeVocab, kResourceTypeFont, // 0x04-0x07 + kResourceTypeCursor, kResourceTypePatch, kResourceTypeBitmap, kResourceTypePalette, // 0x08-0x0B + kResourceTypeCdAudio, kResourceTypeAudio, kResourceTypeSync, kResourceTypeMessage, // 0x0C-0x0F + kResourceTypeMap, kResourceTypeHeap, kResourceTypeAudio36, kResourceTypeSync36, // 0x10-0x13 + kResourceTypeTranslation // 0x14 }; #ifdef ENABLE_SCI32 -static const ResTypeMap s_resTypeMapSci21[] = { - { 0, kResourceTypeView }, - { 1, kResourceTypePic }, - { 2, kResourceTypeScript }, - { 3, kResourceTypeText }, - { 4, kResourceTypeSound }, - { 5, kResourceTypeMemory }, - { 6, kResourceTypeVocab }, - { 7, kResourceTypeFont }, - { 8, kResourceTypeCursor }, - { 9, kResourceTypePatch }, - { 10, kResourceTypeBitmap }, - { 11, kResourceTypePalette }, - // 12 is Wave, but SCI seems to just store it in Audio resources - { 13, kResourceTypeAudio }, - { 14, kResourceTypeSync }, - { 15, kResourceTypeMessage }, - { 16, kResourceTypeMap }, - { 17, kResourceTypeHeap }, - { 18, kResourceTypeChunk }, - { 19, kResourceTypeAudio36 }, - { 20, kResourceTypeSync36 }, - { 21, kResourceTypeTranslation }, - { 22, kResourceTypeRobot }, - { 23, kResourceTypeVMD } +// TODO: 12 should be "Wave", but SCI seems to just store it in Audio resources +static const ResourceType s_resTypeMapSci21[] = { + kResourceTypeView, kResourceTypePic, kResourceTypeScript, kResourceTypeText, // 0x00-0x03 + kResourceTypeSound, kResourceTypeMemory, kResourceTypeVocab, kResourceTypeFont, // 0x04-0x07 + kResourceTypeCursor, kResourceTypePatch, kResourceTypeBitmap, kResourceTypePalette, // 0x08-0x0B + kResourceTypeInvalid, kResourceTypeAudio, kResourceTypeSync, kResourceTypeMessage, // 0x0C-0x0F + kResourceTypeMap, kResourceTypeHeap, kResourceTypeChunk, kResourceTypeAudio36, // 0x10-0x13 + kResourceTypeSync36, kResourceTypeTranslation, kResourceTypeRobot, kResourceTypeVMD // 0x14-0x17 }; #endif ResourceType ResourceManager::convertResType(byte type) { type &= 0x7f; - uint32 tableSize = 0; - const ResTypeMap *map = 0; if (_mapVersion != kResVersionSci32) { // SCI0 - SCI2 - tableSize = ARRAYSIZE(s_resTypeMapSci0); - map = s_resTypeMapSci0; + if (type < ARRAYSIZE(s_resTypeMapSci0)) + return s_resTypeMapSci0[type]; } else { // SCI2.1+ #ifdef ENABLE_SCI32 - tableSize = ARRAYSIZE(s_resTypeMapSci21); - map = s_resTypeMapSci21; + if (type < ARRAYSIZE(s_resTypeMapSci21)) + return s_resTypeMapSci21[type]; #else error("SCI32 support not compiled in"); #endif } - for (uint32 i = 0; i < tableSize; i++) - if (map[i].sciType == type) - return map[i].type; - return kResourceTypeInvalid; } -- cgit v1.2.3 From 525794927ed57fd18d3e713a5869f8fcde5ae2a9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 04:25:57 +0000 Subject: SCI: fix regression of r50896, behaviour of kFileIO(readString) is supposed to return the string instead of the size, fixes signature mismatch in hoyle 3 svn-id: r50977 --- engines/sci/engine/kfile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index dd9241a375..2cd2c147bd 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -817,7 +817,7 @@ reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv) { fgets_wrapper(s, buf, size, handle); s->_segMan->memcpy(argv[0], (const byte*)buf, size); delete[] buf; - return argv[1]; + return argv[0]; } reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) { -- cgit v1.2.3 From 59bb9f8fe82432b35de103f7e705d91fde3f3f2a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 04:56:16 +0000 Subject: SCI: added uninitialized workarounds for hoyle 3 svn-id: r50978 --- engines/sci/engine/vm.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e066170715..9fcf95f4d0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -314,7 +314,8 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) && (workaround->objectName == searchObjectName) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && workaround->index == index) { + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset + && ((workaround->index == -1) || (workaround->index == index))) { // Workaround found return workaround->newValue; } @@ -366,6 +367,9 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_GK1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts + { GID_HOYLE3, 0, 1, "Character", "say", -1, 504, { 0, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 0, 1, "Character", "say", -1, 505, { 0, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 700, 0, "gcWindow", "open", -1, -1, { 0, 0 } }, // when entering control menu { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game -- cgit v1.2.3 From 58a1fbc13c116d3fa69c426c0cdeb459d354fbf0 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 18 Jul 2010 06:49:56 +0000 Subject: Made memcpy faster but not as fast with uncached mem. svn-id: r50980 --- backends/platform/psp/display_client.cpp | 15 +- backends/platform/psp/memory.cpp | 627 ++++++++++++++++++++----------- backends/platform/psp/memory.h | 211 +++++++---- backends/platform/psp/module.mk | 3 +- backends/platform/psp/psp_main.cpp | 11 +- 5 files changed, 559 insertions(+), 308 deletions(-) diff --git a/backends/platform/psp/display_client.cpp b/backends/platform/psp/display_client.cpp index c5a6250188..71b505ec7c 100644 --- a/backends/platform/psp/display_client.cpp +++ b/backends/platform/psp/display_client.cpp @@ -340,11 +340,17 @@ void Buffer::copyFromRect(const byte *buf, uint32 pitch, int destX, int destY, u if (pitch == realWidthInBytes && pitch == recWidthInBytes) { //memcpy(dst, buf, _pixelFormat.pixelsToBytes(recHeight * recWidth)); - Copier::copy(dst, buf, _pixelFormat.pixelsToBytes(recHeight * recWidth), &_pixelFormat); + if (_pixelFormat.swapRB) + PspMemory::fastSwap(dst, buf, _pixelFormat.pixelsToBytes(recHeight * recWidth), _pixelFormat); + else + PspMemory::fastCopy(dst, buf, _pixelFormat.pixelsToBytes(recHeight * recWidth)); } else { do { //memcpy(dst, buf, recWidthInBytes); - Copier::copy(dst, buf, recWidthInBytes, &_pixelFormat); + if (_pixelFormat.swapRB) + PspMemory::fastSwap(dst, buf, recWidthInBytes, _pixelFormat); + else + PspMemory::fastCopy(dst, buf, recWidthInBytes); buf += pitch; dst += realWidthInBytes; } while (--recHeight); @@ -363,7 +369,10 @@ void Buffer::copyToArray(byte *dst, int pitch) { do { //memcpy(dst, src, sourceWidthInBytes); - Copier::copy(dst, src, sourceWidthInBytes, &_pixelFormat); + if (_pixelFormat.swapRB) + PspMemory::fastSwap(dst, src, sourceWidthInBytes, _pixelFormat); + else + PspMemory::fastCopy(dst, src, sourceWidthInBytes); src += realWidthInBytes; dst += pitch; } while (--h); diff --git a/backends/platform/psp/memory.cpp b/backends/platform/psp/memory.cpp index e134a7d0f4..d66650aee5 100644 --- a/backends/platform/psp/memory.cpp +++ b/backends/platform/psp/memory.cpp @@ -1,223 +1,404 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ - * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ - * - */ - -#include "common/scummsys.h" -#include "common/singleton.h" -#include "common/list.h" -#include "backends/platform/psp/psppixelformat.h" -#include "backends/platform/psp/memory.h" - -// Class Copier -------------------------------------------------------------------------- -//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ -//#define __PSP_DEBUG_PRINT__ - -#include "backends/platform/psp/trace.h" - -void Copier::copy(byte *dst, const byte *src, uint32 bytes, PSPPixelFormat *format /* = NULL */) { - DEBUG_ENTER_FUNC(); - - uint32 prefixDst = (((uint32)dst) & 0x3); - prefixDst = prefixDst ? 4 - prefixDst : 0; // prefix only if we have address % 4 != 0 - uint32 prefixSrc = (((uint32)src) & 0x3); - prefixSrc = prefixSrc ? 4 - prefixSrc : 0; // prefix only if we have address % 4 != 0 - uint32 *dst32, *src32; - bool swapRB = format ? format->swapRB : false; // take swap value from pixelformat if it's given -#ifdef __PSP_DEBUG_PRINT__ - uint32 debugBytes = bytes; - const byte *debugDst = dst, *debugSrc = src; -#endif - uint32 words, remainingBytes; - - //PSP_DEBUG_PRINT("dst[%p], src[%p], bytes[%d], swap[%s], prefixDst[%u], prefixSrc[%u]\n", dst, src, bytes, swapRB ? "true" : "false", prefixDst, prefixSrc); - - if (prefixDst || prefixSrc) { // we're not aligned to word boundaries - if (prefixDst != prefixSrc) { // worst case: we can never be aligned. this mode is highly inefficient. try to get engines not to use this mode too much - PSP_DEBUG_PRINT("misaligned copy of %u bytes from %p to %p\n", bytes, src, dst); - if ((prefixDst & 1) || (prefixSrc & 1)) - copy8(dst, src, bytes); // no swap is possible on 8 bit - else - copy16((uint16 *)dst, (uint16 *)src, bytes, format); - - goto test; - } - - // Do the prefix: the part to get us aligned - if (prefixDst & 1) { // byte - copy8(dst, src, prefixDst); // no swap available - } else { // short - copy16((uint16 *)dst, (uint16 *)src, prefixDst, format); - } - if (bytes > prefixDst) // check that we can afford to subtract from bytes - bytes -= prefixDst; - else { - return; - } - dst32 = (uint32 *)(dst + prefixDst); - src32 = (uint32 *)(src + prefixSrc); - } else { // We're aligned to word boundaries - dst32 = (uint32 *)dst; - src32 = (uint32 *)src; - } - - words = bytes >> 2; - remainingBytes = bytes & 0x3; - - if (swapRB) { // need to swap - for (; words > 0; words--) { - *dst32 = format->swapRedBlue32(*src32); - dst32++; - src32++; - } - } else { // no swapping - for (; words > 0; words--) { - *dst32 = *src32; - dst32++; - src32++; - } - } - - // Do any remaining bytes - if (remainingBytes) { - if (remainingBytes & 1) // we have bytes left - copy8((byte *)dst32, (byte *)src32, remainingBytes); - else // 16bits left - copy16((uint16*)dst32, (uint16 *)src32, remainingBytes, format); - } - -test: - // debug -#ifdef __PSP_DEBUG_PRINT__ - bool mismatch = false; - - for (uint32 i = 0; i < debugBytes; i++) { - if (debugDst[i] != debugSrc[i]) { - if (mismatch == false) { - PSP_DEBUG_PRINT_SAMELN("mismatch in copy:\n"); - PSP_DEBUG_PRINT("dst[%p], src[%p], bytes[%u], swap[%s], prefixDst[%u], prefixSrc[%u]\n", debugDst, debugSrc, debugBytes, swapRB ? "true" : "false", prefixDst, prefixSrc); - mismatch = true; - } - PSP_DEBUG_PRINT_SAMELN("%x!=%x ", debugSrc[i], debugDst[i]); - } - } - if (mismatch) - PSP_DEBUG_PRINT("\n"); -#endif - - return; // So we have something to jump to with the label -} - -inline void Copier::copy8(byte *dst, const byte *src, uint32 bytes) { - for (; bytes > 0; bytes--) { - *dst = *src; - dst++; - src++; - } -} - -inline void Copier::copy16(uint16 *dst, const uint16 *src, uint32 bytes, PSPPixelFormat *format /* = NULL */) { - uint32 shorts = bytes >> 1; - uint32 remainingBytes = bytes & 1; - bool swapRB = format ? format->swapRB : false; - - if (swapRB) { - for (; shorts > 0 ; shorts--) { - *dst = format->swapRedBlue16(*src); - dst++; - src++; - } - } else { - for (; shorts > 0 ; shorts--) { - *dst = *src; - dst++; - src++; - } - } - if (remainingBytes) - *(byte *)dst = *(byte *)src; -} - - -// Class VramAllocator ----------------------------------- - -DECLARE_SINGLETON(VramAllocator) - -//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ -//#define __PSP_DEBUG_PRINT__ - -#include "backends/platform/psp/trace.h" - - -void *VramAllocator::allocate(int32 size, bool smallAllocation /* = false */) { - DEBUG_ENTER_FUNC(); - assert(size > 0); - - byte *lastAddress = smallAllocation ? (byte *)VRAM_SMALL_ADDRESS : (byte *)VRAM_START_ADDRESS; - Common::List::iterator i; - - // Find a block that fits, starting from the beginning - for (i = _allocList.begin(); i != _allocList.end(); ++i) { - byte *currAddress = (*i).address; - - if (currAddress - lastAddress >= size) // We found a match - break; - - if ((*i).getEnd() > lastAddress) - lastAddress = (byte *)(*i).getEnd(); - } - - if (lastAddress + size > (byte *)VRAM_END_ADDRESS) { - PSP_DEBUG_PRINT("No space for allocation of %d bytes. %d bytes already allocated.\n", - size, _bytesAllocated); - return NULL; - } - - _allocList.insert(i, Allocation(lastAddress, size)); - _bytesAllocated += size; - - PSP_DEBUG_PRINT("Allocated in VRAM, size %u at %p.\n", size, lastAddress); - PSP_DEBUG_PRINT("Total allocated %u, remaining %u.\n", _bytesAllocated, (2 * 1024 * 1024) - _bytesAllocated); - - return lastAddress; -} - -// Deallocate a block from VRAM -void VramAllocator::deallocate(void *address) { - DEBUG_ENTER_FUNC(); - address = (byte *)CACHED(address); // Make sure all addresses are the same - - Common::List::iterator i; - - // Find the Allocator to deallocate - for (i = _allocList.begin(); i != _allocList.end(); ++i) { - if ((*i).address == address) { - _bytesAllocated -= (*i).size; - _allocList.erase(i); - PSP_DEBUG_PRINT("Deallocated address[%p], size[%u]\n", (*i).address, (*i).size); - return; - } - } - - PSP_DEBUG_PRINT("Address[%p] not allocated.\n", address); -} +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ + * + */ + +#include "common/scummsys.h" +#include "common/singleton.h" +#include "common/list.h" +#include "backends/platform/psp/PSPPixelFormat.h" +#include "backends/platform/psp/memory.h" + +// Class Copier -------------------------------------------------------------------------- +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + +//#define TEST_MEMORY_COPY + +// swapRB is used to swap red and blue in the display +void PspMemory::copy(byte *dst, const byte *src, uint32 bytes) { + DEBUG_ENTER_FUNC(); + +#ifdef TEST_MEMORY_COPY + uint32 debugBytes = bytes; + const byte *debugDst = dst, *debugSrc = src; +#endif + + PSP_DEBUG_PRINT("copy(): dst[%p], src[%p], bytes[%d]\n", dst, src, bytes); + + // align the destination pointer first + uint32 prefixDst = (((uint32)dst) & 0x3); + + if (prefixDst) { + prefixDst = 4 - prefixDst; // prefix only if we have address % 4 != 0 + PSP_DEBUG_PRINT("prefixDst[%d]\n", prefixDst); + + bytes -= prefixDst; // remember we assume bytes >= 4 + + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { // check if it's worthwhile to continue + copy8(dst, src, bytes); +#ifdef TEST_MEMORY_COPY + testCopy(debugDst, debugSrc, debugBytes); +#endif + return; + } + + while (prefixDst--) { + *dst++ = *src++; + } + } + + // check the source pointer alignment now + uint32 alignSrc = (((uint32)src) & 0x3); + + if (alignSrc) { // we'll need to realign our reads + copy32Misaligned((uint32 *)dst, src, bytes, alignSrc); + } else { + copy32Aligned((uint32 *)dst, (uint32 *)src, bytes); + } + +#ifdef TEST_MEMORY_COPY + testCopy(debugDst, debugSrc, debugBytes); +#endif +} + +void PspMemory::testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes) { + + bool mismatch = false; + PSP_INFO_PRINT("testing memcpy..."); + + for (uint32 i = 0; i < debugBytes; i++) { + if (debugDst[i] != debugSrc[i]) { + if (mismatch == false) { + PSP_DEBUG_PRINT_SAMELN("**** mismatch in copy! ****\n"); + PSP_DEBUG_PRINT("dst[%p], src[%p], bytes[%u]\n", debugDst, debugSrc, debugBytes); + mismatch = true; + } + PSP_DEBUG_PRINT_SAMELN("%x!=%x ", debugSrc[i], debugDst[i]); + } + } + if (mismatch) { + PSP_DEBUG_PRINT("\n"); + } else { + PSP_INFO_PRINT("ok\n"); + } +} + +// +// used to swap red and blue +void PspMemory::swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + + // align the destination pointer first + uint32 prefixDst = (((uint32)dst16) & 0x3); // for swap, we can only have 2 or 0 as our prefix + + if (prefixDst) { + bytes -= prefixDst; // remember we assume bytes > 4 + *dst16++ = *src16++; + + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY * 2) { // check if it's worthwhile to continue + swap16(dst16, src16, bytes, format); + return; + } + } + + // check the source pointer alignment now + uint32 alignSrc = (((uint32)src16) & 0x3); + + if (alignSrc) { // we'll need to realign our reads + PSP_DEBUG_PRINT("misaligned copy of %u bytes from %p to %p\n", bytes, src16, dst16); + swap32Misaligned((uint32 *)dst16, (uint16 *)src16, bytes, format); + } else { + swap32Aligned((uint32 *)dst16, (uint32 *)src16, bytes, format); + } +} + +void PspMemory::copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes) { + PSP_DEBUG_PRINT("copy32Aligned(): dst32[%p], src32[%p], bytes[%d]\n", dst32, src32, bytes); + + int words8 = bytes >> 5; + + // try blocks of 8 words at a time + if (words8) { + while (words8--) { + dst32[0] = src32[0]; + dst32[1] = src32[1]; + dst32[2] = src32[2]; + dst32[3] = src32[3]; + dst32[4] = src32[4]; + dst32[5] = src32[5]; + dst32[6] = src32[6]; + dst32[7] = src32[7]; + dst32 += 8; + src32 += 8; + } + } + + int words4 = (bytes & 0x1F) >> 4; + + // try blocks of 4 words at a time + if (words4) { + dst32[0] = src32[0]; + dst32[1] = src32[1]; + dst32[2] = src32[2]; + dst32[3] = src32[3]; + dst32 += 4; + src32 += 4; + } + + int bytesLeft = (bytes & 0xF); // only look at bytes left after we did the above + int wordsLeft = bytesLeft >> 2; + + // now just do single words + while (wordsLeft) { + *dst32++ = *src32++; + wordsLeft--; + } + + bytesLeft = bytes & 0x3; // get remaining bytes + + PSP_DEBUG_PRINT("bytesLeft[%d]\n", bytesLeft); + + byte *dst = (byte *)dst32; + byte *src = (byte *)src32; + + while (bytesLeft--) { + *dst++ = *src++; + } +} + +void PspMemory::swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + int words = bytes >> 2; + + // try blocks of 4 words at a time + for (; words - 4 >= 0; words -= 4) { + dst32[0] = format.swapRedBlue32(src32[0]); + dst32[1] = format.swapRedBlue32(src32[1]); + dst32[2] = format.swapRedBlue32(src32[2]); + dst32[3] = format.swapRedBlue32(src32[3]); + dst32 += 4; + src32 += 4; + } + + // now just do words + for (; words > 0; words--) { + *dst32++ = format.swapRedBlue32(*src32++); + } + + uint32 remainingBytes = bytes & 0x3; + + if (remainingBytes) { // for swap, must be a 16 bit value + *((uint16 *)dst32) = format.swapRedBlue16(*((uint16 *)src32)); // only 1 short left + } +} + + +// More challenging -- need to shift +// Assume dst is aligned +void PspMemory::copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc) { + PSP_DEBUG_PRINT("copy32Misaligned: dst32[%p], src[%p], bytes[%d], alignSrc[%d]\n", dst32, src, bytes, alignSrc); + + uint32 *src32 = (uint32 *)(((uint32)src) & 0xFFFFFFFC); // remove misalignment + uint32 offset; + + switch (alignSrc) { + case 1: + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 8, 24); + break; + case 2: + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 16, 16); + break; + case 3: + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 24, 8); + break; + } + + uint32 remainingBytes = bytes & 3; + + if (remainingBytes) { + byte *dst = (byte *)dst32; + src += offset; + dst += offset; + copy8(dst, src, remainingBytes); + } +} + +// returns offset in dst +uint32 PspMemory::misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue) { + uint32 *origDst32 = dst32; + register uint32 dstWord, srcWord; + + PSP_DEBUG_PRINT("misaligned32Detail(): alignSrc[%d], dst32[%p], src32[%p], words[%d]\n", alignSrc, dst32, src32, words); + + // Try to do groups of 4 words + uint32 words4 = bytes >> 4; + + srcWord = src32[0]; + + while (words4--) { + dstWord = srcWord >> shiftValue; + srcWord = src32[1]; + dstWord |= srcWord << lastShiftValue; + dst32[0] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[2]; + dstWord |= srcWord << lastShiftValue; + dst32[1] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[3]; + dstWord |= srcWord << lastShiftValue; + dst32[2] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[4]; + dstWord |= srcWord << lastShiftValue; + dst32[3] = dstWord; + src32 += 4; + dst32 += 4; + } + + uint32 words = (bytes & 0xF) >> 2; + + // we read one word ahead of what we write + // setup the first read + if (words) { + srcWord = *src32++; + + while (words--) { + dstWord = srcWord >> shiftValue; + srcWord = *src32++; + dstWord |= srcWord << lastShiftValue; + *dst32++ = dstWord; + } + } + + return (byte *)dst32 - (byte *)origDst32; +} +// More challenging -- need to shift +// Assume dst is aligned +void PspMemory::swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + if (bytes < MIN_AMOUNT_FOR_MISALIGNED_COPY) { // less than a certain number of bytes it's just not worth it + swap16((uint16 *)dst32, src16, bytes, format); + return; + } + + int words = bytes >> 2; + uint32 remainingBytes = bytes & 3; + + uint32 *src32 = (uint32 *)(((uint32)src16) & 0xFFFFFFFC); // remove misalignment + + // we read one word ahead of what we write + // setup the first read + uint32 lastWord = ((*src32++) >> 16) & 0xFFFF; + + for (; words; words--) { + uint32 srcWord = *src32++; + uint32 curWord = (srcWord >> 16) & 0xFFFF; + lastWord |= (srcWord & 0xFFFF) << 16; // take the part of the src that belongs to this word + *dst32++ = format.swapRedBlue32(lastWord); + lastWord = curWord; + } + + if (remainingBytes) { // add in the remaining stuff + *(uint16 *)dst32 = format.swapRedBlue16((uint16)lastWord); + } +} + +inline void PspMemory::copy16(uint16 *dst16, const uint16 *src16, uint32 bytes) { + PSP_DEBUG_PRINT("copy16(): dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); + + uint32 shorts = bytes >> 1; + uint32 remainingBytes = bytes & 1; + + for (; shorts > 0 ; shorts--) { + *dst16++ = *src16++; + } + if (remainingBytes) + *(byte *)dst16 = *(byte *)src16; +} + +// Class VramAllocator ----------------------------------- + +DECLARE_SINGLETON(VramAllocator) + +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + + +void *VramAllocator::allocate(int32 size, bool smallAllocation /* = false */) { + DEBUG_ENTER_FUNC(); + assert(size > 0); + + byte *lastAddress = smallAllocation ? (byte *)VRAM_SMALL_ADDRESS : (byte *)VRAM_START_ADDRESS; + Common::List::iterator i; + + // Find a block that fits, starting from the beginning + for (i = _allocList.begin(); i != _allocList.end(); ++i) { + byte *currAddress = (*i).address; + + if (currAddress - lastAddress >= size) // We found a match + break; + + if ((*i).getEnd() > lastAddress) + lastAddress = (byte *)(*i).getEnd(); + } + + if (lastAddress + size > (byte *)VRAM_END_ADDRESS) { + PSP_DEBUG_PRINT("No space for allocation of %d bytes. %d bytes already allocated.\n", + size, _bytesAllocated); + return NULL; + } + + _allocList.insert(i, Allocation(lastAddress, size)); + _bytesAllocated += size; + + PSP_DEBUG_PRINT("Allocated in VRAM, size %u at %p.\n", size, lastAddress); + PSP_DEBUG_PRINT("Total allocated %u, remaining %u.\n", _bytesAllocated, (2 * 1024 * 1024) - _bytesAllocated); + + return lastAddress; +} + +// Deallocate a block from VRAM +void VramAllocator::deallocate(void *address) { + DEBUG_ENTER_FUNC(); + address = (byte *)CACHED(address); // Make sure all addresses are the same + + Common::List::iterator i; + + // Find the Allocator to deallocate + for (i = _allocList.begin(); i != _allocList.end(); ++i) { + if ((*i).address == address) { + _bytesAllocated -= (*i).size; + _allocList.erase(i); + PSP_DEBUG_PRINT("Deallocated address[%p], size[%u]\n", (*i).address, (*i).size); + return; + } + } + + PSP_DEBUG_PRINT("Address[%p] not allocated.\n", address); +} diff --git a/backends/platform/psp/memory.h b/backends/platform/psp/memory.h index a198095090..81a77cca1c 100644 --- a/backends/platform/psp/memory.h +++ b/backends/platform/psp/memory.h @@ -1,80 +1,131 @@ - -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ - * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ - * - */ - -#ifndef PSP_MEMORY_H -#define PSP_MEMORY_H - -#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */ -#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */ - -/** - * Class that does memory copying and swapping if needed - */ -class Copier { -public: - static void copy(byte *dst, const byte *src, uint32 bytes, PSPPixelFormat *format = NULL); - static void copy8(byte *dst, const byte *src, uint32 bytes); - static void copy16(uint16 *dst, const uint16 *src, uint32 bytes, PSPPixelFormat *format = NULL); -}; - -/** - * Class that allocates memory in the VRAM - */ -class VramAllocator : public Common::Singleton { -public: - VramAllocator() : _bytesAllocated(0) {} - void *allocate(int32 size, bool smallAllocation = false); // smallAllocation e.g. palettes - void deallocate(void *pointer); - - static inline bool isAddressInVram(void *address) { - if ((uint32)(CACHED(address)) >= VRAM_START_ADDRESS && (uint32)(CACHED(address)) < VRAM_END_ADDRESS) - return true; - return false; - } - - -private: - /** - * Used to allocate in VRAM - */ - struct Allocation { - byte *address; - uint32 size; - void *getEnd() { return address + size; } - Allocation(void *Address, uint32 Size) : address((byte *)Address), size(Size) {} - Allocation() : address(0), size(0) {} - }; - - enum { - VRAM_START_ADDRESS = 0x04000000, - VRAM_END_ADDRESS = 0x04200000, - VRAM_SMALL_ADDRESS = VRAM_END_ADDRESS - (4 * 1024) // 4K in the end for small allocations - }; - Common::List _allocList; // List of allocations - uint32 _bytesAllocated; -}; - -#endif /* PSP_MEMORY_H */ + +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ + * + */ + +#ifndef PSP_MEMORY_H +#define PSP_MEMORY_H + +#include "backends/platform/psp/psppixelformat.h" +#include "common/list.h" + +#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */ +#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */ + +#define MIN_AMOUNT_FOR_COMPLEX_COPY 8 +#define MIN_AMOUNT_FOR_MISALIGNED_COPY 8 + +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + +/** + * Class that does memory copying and swapping if needed + */ +class PspMemory { +private: + static void testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes); + static void copy(byte *dst, const byte *src, uint32 bytes); + static void swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); + static void copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes); + static void swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format); + static void copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc); + static uint32 misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue); + static void swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); + static void copy16(uint16 *dst, const uint16 *src, uint32 bytes); + + // For swapping, we know that we have multiples of 16 bits + static void swap16(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + PSP_DEBUG_PRINT("swap16 called with dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); + uint32 shorts = bytes >> 1; + + for (; shorts > 0 ; shorts--) { + *dst16++ = format.swapRedBlue16(*src16++); + } + } + + static void copy8(byte *dst, const byte *src, uint32 bytes) { + PSP_DEBUG_PRINT("copy8 called with dst[%p], src[%p], bytes[%d]\n", dst, src, bytes); + while (bytes--) { + *dst++ = *src++; + } + } + +public: + // This is the interface to the outside world + static void fastCopy(byte *dst, const byte *src, uint32 bytes) { + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { + copy8(dst, src, bytes); + } else { // go to more powerful copy + copy(dst, src, bytes); + } + } + + static void fastSwap(byte *dst, const byte *src, uint32 bytes, PSPPixelFormat &format) { + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY * 2) { + swap16((uint16 *)dst, (uint16 *)src, bytes, format); + } else { // go to more powerful copy + swap((uint16 *)dst, (uint16 *)src, bytes, format); + } + } +}; + +/** + * Class that allocates memory in the VRAM + */ +class VramAllocator : public Common::Singleton { +public: + VramAllocator() : _bytesAllocated(0) {} + void *allocate(int32 size, bool smallAllocation = false); // smallAllocation e.g. palettes + void deallocate(void *pointer); + + static inline bool isAddressInVram(void *address) { + if ((uint32)(CACHED(address)) >= VRAM_START_ADDRESS && (uint32)(CACHED(address)) < VRAM_END_ADDRESS) + return true; + return false; + } + + +private: + /** + * Used to allocate in VRAM + */ + struct Allocation { + byte *address; + uint32 size; + void *getEnd() { return address + size; } + Allocation(void *Address, uint32 Size) : address((byte *)Address), size(Size) {} + Allocation() : address(0), size(0) {} + }; + + enum { + VRAM_START_ADDRESS = 0x04000000, + VRAM_END_ADDRESS = 0x04200000, + VRAM_SMALL_ADDRESS = VRAM_END_ADDRESS - (4 * 1024) // 4K in the end for small allocations + }; + Common::List _allocList; // List of allocations + uint32 _bytesAllocated; +}; + +#endif /* PSP_MEMORY_H */ diff --git a/backends/platform/psp/module.mk b/backends/platform/psp/module.mk index e9c896acfd..855554e980 100644 --- a/backends/platform/psp/module.mk +++ b/backends/platform/psp/module.mk @@ -16,7 +16,8 @@ MODULE_OBJS := powerman.o \ audio.o \ thread.o \ rtc.o \ - mp3.o + mp3.o \ + tests.o MODULE_DIRS += \ backends/platform/psp/ diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp index c26aed539e..b84702115f 100644 --- a/backends/platform/psp/psp_main.cpp +++ b/backends/platform/psp/psp_main.cpp @@ -44,12 +44,15 @@ #include "backends/plugins/psp/psp-provider.h" #include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/osys_psp.h" +#include "backends/platform/psp/tests.h" #include "backends/platform/psp/trace.h" #ifdef ENABLE_PROFILING #include #endif +#define ENABLE_TESTS /* to enable tests of PSP architecture */ + /** * Define the module info section * @@ -153,7 +156,7 @@ int SetupCallbacks(void) { #undef main int main(void) { //change clock rate to 333mhz - scePowerSetClockFrequency(333, 333, 166); + scePowerSetClockFrequency(222, 222, 111); PowerManager::instance(); // Setup power manager @@ -169,6 +172,12 @@ int main(void) { PluginManager::instance().addPluginProvider(new PSPPluginProvider()); #endif +#ifdef ENABLE_TESTS + PSP_INFO_PRINT("running tests\n"); + tests(); + sceKernelSleepThread(); +#endif + int res = scummvm_main(argc, argv); g_system->quit(); // TODO: Consider removing / replacing this! -- cgit v1.2.3 From 844a332f8de4ab74ec1c739c2ab6f41e8d957d53 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 18 Jul 2010 06:59:25 +0000 Subject: PSP: forgot test files svn-id: r50981 --- backends/platform/psp/tests.cpp | 656 ++++++++++++++++++++++++++++++++++++++++ backends/platform/psp/tests.h | 26 ++ 2 files changed, 682 insertions(+) create mode 100644 backends/platform/psp/tests.cpp create mode 100644 backends/platform/psp/tests.h diff --git a/backends/platform/psp/tests.cpp b/backends/platform/psp/tests.cpp new file mode 100644 index 0000000000..25c07fd723 --- /dev/null +++ b/backends/platform/psp/tests.cpp @@ -0,0 +1,656 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ + * + */ + +#include "common/scummsys.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "backends/platform/psp/rtc.h" +#include "backends/platform/psp/thread.h" +#include "backends/platform/psp/memory.h" + + +#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */ +#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */ + +//#define __PSP_DEBUG_FUNCS__ +//#define __PSP_DEBUG_PRINT__ + +// Results: (333Mhz/222Mhz) +// Getting a tick: 1-2 us +// Getting a time structure: 9/14us +// ie. using a tick and just dividing by 1000 saves us time. + +#include "backends/platform/psp/trace.h" + +void test_ticks() { + uint32 ticksPerSecond = sceRtcGetTickResolution(); + PSP_INFO_PRINT("ticksPerSecond[%d]\n", ticksPerSecond); + + uint32 currentTicks1[2]; + uint32 currentTicks2[2]; + + sceRtcGetCurrentTick((u64 *)currentTicks1); + sceRtcGetCurrentTick((u64 *)currentTicks2); + PSP_INFO_PRINT("current tick[%x %x][%u %u]\n", currentTicks1[0], currentTicks1[1], currentTicks1[0], currentTicks1[1]); + PSP_INFO_PRINT("current tick[%x %x][%u %u]\n", currentTicks2[0], currentTicks2[1], currentTicks2[0], currentTicks2[1]); + + pspTime time; + sceRtcSetTick(&time, (u64 *)currentTicks2); + PSP_INFO_PRINT("current tick in time, year[%d] month[%d] day[%d] hour[%d] minutes[%d] seconds[%d] us[%d]\n", time.year, time.month, time.day, time.hour, time.minutes, time.seconds, time.microseconds); + + pspTime time1; + pspTime time2; + sceRtcGetCurrentClockLocalTime(&time1); + sceRtcGetCurrentClockLocalTime(&time2); + PSP_INFO_PRINT("time1, year[%d] month[%d] day[%d] hour[%d] minutes[%d] seconds[%d] us[%d]\n", time1.year, time1.month, time1.day, time1.hour, time1.minutes, time1.seconds, time1.microseconds); + PSP_INFO_PRINT("time2, year[%d] month[%d] day[%d] hour[%d] minutes[%d] seconds[%d] us[%d]\n", time2.year, time2.month, time2.day, time2.hour, time2.minutes, time2.seconds, time2.microseconds); +} + +void test_getMicros() { + uint32 time1, time2, time3, time4; + time1 = PspRtc::instance().getMicros(); + time2 = PspRtc::instance().getMicros(); + time3 = PspRtc::instance().getMicros(); + time4 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("getMicros() times: %d, %d, %d\n", time4-time3, time3-time2, time2-time1); +} + +void read_and_time(uint32 bytes, char *buffer, FILE *file) { + uint32 time1 = PspRtc::instance().getMicros(); + // test minimal read + fread(buffer, bytes, 1, file); + uint32 time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Reading %d byte takes %dus\n", bytes, time2-time1); +} + +/* + 333MHz/222MHz + Reading 1 byte takes 2590us / 3167 + Reading 10 byte takes 8us / 9 + Reading 50 byte takes 8us / 11 + Reading 100 byte takes 8us / 11 + Reading 1000 byte takes 915us / 1131 + Reading 1000 byte takes 911us + Reading 1000 byte takes 914us + Reading 1000 byte takes 943us + Reading 1000 byte takes 915us + Reading 1000 byte takes 923us + Reading 1000 byte takes 22us + Reading 1000 byte takes 916us + Reading 1000 byte takes 913us / 1,120 + Reading 1000 byte takes 909us / 1,122 + Reading 2000 byte takes 1806us / 2,284 + Reading 3000 byte takes 2697us / 3,374 + Reading 4000 byte takes 3652us / 4,592 + Reading 5000 byte takes 4551us / 5,544 + Reading 6000 byte takes 5356us / 6,676 + Reading 7000 byte takes 6800us / 8,358 + Reading 8000 byte takes 6794us / 8,454 + Reading 9000 byte takes 6782us / 8,563 + Reading 10000 byte takes 8497us / 10,631 + Reading 30000 byte takes 25995us / 32,473 + Reading 50000 byte takes 42467us / 52,893 + Reading 80000 byte takes 68457us / 85,291 + Reading 100000 byte takes 85103us / 106,163 + Reading 500000 byte takes 427337us / 531,679 + Reading 1000000 byte takes 854831us / 1,063,107 +*/ +// Function to test the impact of MS reads +// These tests can't be done from shell - the cache screws them up +void test_ms_reads() { + FILE *file; + file = fopen("ms0:/psp/music/track1.mp3", "r"); + + char *buffer = (char *)malloc(2 * 1024 * 1024); + + read_and_time(1, buffer, file); + read_and_time(10, buffer, file); + read_and_time(50, buffer, file); + read_and_time(100, buffer, file); + for (int i = 0; i< 10; i++) + read_and_time(1000, buffer, file); + read_and_time(2000, buffer, file); + read_and_time(3000, buffer, file); + read_and_time(4000, buffer, file); + read_and_time(5000, buffer, file); + read_and_time(6000, buffer, file); + read_and_time(7000, buffer, file); + read_and_time(8000, buffer, file); + read_and_time(9000, buffer, file); + read_and_time(10000, buffer, file); + read_and_time(30000, buffer, file); + read_and_time(50000, buffer, file); + read_and_time(80000, buffer, file); + read_and_time(100000, buffer, file); + read_and_time(500000, buffer, file); + read_and_time(1000000, buffer, file); + + fclose(file); + free(buffer); +} + +void seek_and_time(int bytes, int origin, FILE *file) { + char buffer[1000]; + + uint32 time1 = PspRtc::instance().getMicros(); + // test minimal read + fseek(file, bytes, origin); + uint32 time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Seeking %d byte from %d took %dus\n", bytes, origin, time2-time1); + + time1 = PspRtc::instance().getMicros(); + // test minimal read + fread(buffer, 1000, 1, file); + time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Reading 1000 bytes took %dus\n", time2-time1); +} + +/* +333MHz +Seeking 0 byte from 0 took 946us +Reading 1000 bytes took 1781us +Seeking 5 byte from 0 took 6us +Reading 1000 bytes took 19us +Seeking 1000 byte from 0 took 5us +Reading 1000 bytes took 913us +Seeking 100 byte from 0 took 955us +Reading 1000 bytes took 906us +Seeking 10000 byte from 0 took 963us +Reading 1000 bytes took 905us +Seeking -5 byte from 1 took 1022us +Reading 1000 bytes took 949us +Seeking -100 byte from 1 took 1040us +Reading 1000 bytes took 907us +Seeking 100 byte from 1 took 1044us +Reading 1000 bytes took 930us +Seeking 0 byte from 2 took 7211us +Reading 1000 bytes took 80us +Seeking 10000 byte from 2 took 3636us +Reading 1000 bytes took 110us +*/ + +void test_seeks() { + FILE *file; + file = fopen("ms0:/psp/music/track1.mp3", "r"); + + seek_and_time(0, SEEK_SET, file); + seek_and_time(5, SEEK_SET, file); + seek_and_time(1000, SEEK_SET, file); + seek_and_time(100, SEEK_SET, file); + seek_and_time(10000, SEEK_SET, file); + seek_and_time(-5, SEEK_CUR, file); + seek_and_time(-100, SEEK_CUR, file); + seek_and_time(100, SEEK_CUR, file); + seek_and_time(0, SEEK_END, file); + seek_and_time(-10000, SEEK_END, file); + + fclose(file); +} + +// 222: 5-7us +int testGetThreadId() { + uint32 time1 = PspRtc::instance().getMicros(); + int threadId = sceKernelGetThreadId(); + uint32 time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Getting thread ID %d took %dus\n", threadId, time2-time1); + + return threadId; +} + +// 222: 4-5us +void testGetPriority() { + uint32 time1 = PspRtc::instance().getMicros(); + int priority = sceKernelGetThreadCurrentPriority(); + uint32 time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Getting thread priority %d took %dus\n", priority, time2-time1); +} + +// 222: 9-10us +void testChangePriority(int id, int priority) { + uint32 time1 = PspRtc::instance().getMicros(); + sceKernelChangeThreadPriority(id, priority); + uint32 time2 = PspRtc::instance().getMicros(); + + PSP_INFO_PRINT("Changing thread priority to %d for id %d took %dus\n", priority, id, time2-time1); +} + +void test_thread() { + int id; + id = testGetThreadId(); + testGetThreadId(); + testGetPriority(); + testGetPriority(); + testChangePriority(id, 30); + testChangePriority(id, 35); + testChangePriority(id, 25); + + // test context switch time + for (int i=0; i<10; i++) { + uint time1 = PspRtc::instance().getMicros(); + PspThread::delayMicros(0); + uint time2 = PspRtc::instance().getMicros(); + PSP_INFO_PRINT("poll %d. context switch Time = %dus\n", i, time2-time1); // 10-15us + } +} + +int test_mem_read(uint32 words) { + uint32 __attribute__((aligned(64))) buffer[1024]; + register uint32 r = 0; + + // uncached + uint32 *pBuffer = (uint32 *)UNCACHED(buffer); + + uint32 time1 = PspRtc::instance().getMicros(); + + for (int i=0; i= 4 - - if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { // check if it's worthwhile to continue - copy8(dst, src, bytes); -#ifdef TEST_MEMORY_COPY - testCopy(debugDst, debugSrc, debugBytes); -#endif - return; - } - - while (prefixDst--) { - *dst++ = *src++; - } - } - - // check the source pointer alignment now - uint32 alignSrc = (((uint32)src) & 0x3); - - if (alignSrc) { // we'll need to realign our reads - copy32Misaligned((uint32 *)dst, src, bytes, alignSrc); - } else { - copy32Aligned((uint32 *)dst, (uint32 *)src, bytes); - } - -#ifdef TEST_MEMORY_COPY - testCopy(debugDst, debugSrc, debugBytes); -#endif -} - -void PspMemory::testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes) { - - bool mismatch = false; - PSP_INFO_PRINT("testing memcpy..."); - - for (uint32 i = 0; i < debugBytes; i++) { - if (debugDst[i] != debugSrc[i]) { - if (mismatch == false) { - PSP_DEBUG_PRINT_SAMELN("**** mismatch in copy! ****\n"); - PSP_DEBUG_PRINT("dst[%p], src[%p], bytes[%u]\n", debugDst, debugSrc, debugBytes); - mismatch = true; - } - PSP_DEBUG_PRINT_SAMELN("%x!=%x ", debugSrc[i], debugDst[i]); - } - } - if (mismatch) { - PSP_DEBUG_PRINT("\n"); - } else { - PSP_INFO_PRINT("ok\n"); - } -} - -// -// used to swap red and blue -void PspMemory::swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { - DEBUG_ENTER_FUNC(); - - // align the destination pointer first - uint32 prefixDst = (((uint32)dst16) & 0x3); // for swap, we can only have 2 or 0 as our prefix - - if (prefixDst) { - bytes -= prefixDst; // remember we assume bytes > 4 - *dst16++ = *src16++; - - if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY * 2) { // check if it's worthwhile to continue - swap16(dst16, src16, bytes, format); - return; - } - } - - // check the source pointer alignment now - uint32 alignSrc = (((uint32)src16) & 0x3); - - if (alignSrc) { // we'll need to realign our reads - PSP_DEBUG_PRINT("misaligned copy of %u bytes from %p to %p\n", bytes, src16, dst16); - swap32Misaligned((uint32 *)dst16, (uint16 *)src16, bytes, format); - } else { - swap32Aligned((uint32 *)dst16, (uint32 *)src16, bytes, format); - } -} - -void PspMemory::copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes) { - PSP_DEBUG_PRINT("copy32Aligned(): dst32[%p], src32[%p], bytes[%d]\n", dst32, src32, bytes); - - int words8 = bytes >> 5; - - // try blocks of 8 words at a time - if (words8) { - while (words8--) { - dst32[0] = src32[0]; - dst32[1] = src32[1]; - dst32[2] = src32[2]; - dst32[3] = src32[3]; - dst32[4] = src32[4]; - dst32[5] = src32[5]; - dst32[6] = src32[6]; - dst32[7] = src32[7]; - dst32 += 8; - src32 += 8; - } - } - - int words4 = (bytes & 0x1F) >> 4; - - // try blocks of 4 words at a time - if (words4) { - dst32[0] = src32[0]; - dst32[1] = src32[1]; - dst32[2] = src32[2]; - dst32[3] = src32[3]; - dst32 += 4; - src32 += 4; - } - - int bytesLeft = (bytes & 0xF); // only look at bytes left after we did the above - int wordsLeft = bytesLeft >> 2; - - // now just do single words - while (wordsLeft) { - *dst32++ = *src32++; - wordsLeft--; - } - - bytesLeft = bytes & 0x3; // get remaining bytes - - PSP_DEBUG_PRINT("bytesLeft[%d]\n", bytesLeft); - - byte *dst = (byte *)dst32; - byte *src = (byte *)src32; - - while (bytesLeft--) { - *dst++ = *src++; - } -} - -void PspMemory::swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format) { - DEBUG_ENTER_FUNC(); - int words = bytes >> 2; - - // try blocks of 4 words at a time - for (; words - 4 >= 0; words -= 4) { - dst32[0] = format.swapRedBlue32(src32[0]); - dst32[1] = format.swapRedBlue32(src32[1]); - dst32[2] = format.swapRedBlue32(src32[2]); - dst32[3] = format.swapRedBlue32(src32[3]); - dst32 += 4; - src32 += 4; - } - - // now just do words - for (; words > 0; words--) { - *dst32++ = format.swapRedBlue32(*src32++); - } - - uint32 remainingBytes = bytes & 0x3; - - if (remainingBytes) { // for swap, must be a 16 bit value - *((uint16 *)dst32) = format.swapRedBlue16(*((uint16 *)src32)); // only 1 short left - } -} - - -// More challenging -- need to shift -// Assume dst is aligned -void PspMemory::copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc) { - PSP_DEBUG_PRINT("copy32Misaligned: dst32[%p], src[%p], bytes[%d], alignSrc[%d]\n", dst32, src, bytes, alignSrc); - - uint32 *src32 = (uint32 *)(((uint32)src) & 0xFFFFFFFC); // remove misalignment - uint32 offset; - - switch (alignSrc) { - case 1: - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 8, 24); - break; - case 2: - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 16, 16); - break; - case 3: - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 24, 8); - break; - } - - uint32 remainingBytes = bytes & 3; - - if (remainingBytes) { - byte *dst = (byte *)dst32; - src += offset; - dst += offset; - copy8(dst, src, remainingBytes); - } -} - -// returns offset in dst -uint32 PspMemory::misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue) { - uint32 *origDst32 = dst32; - register uint32 dstWord, srcWord; - - PSP_DEBUG_PRINT("misaligned32Detail(): alignSrc[%d], dst32[%p], src32[%p], words[%d]\n", alignSrc, dst32, src32, words); - - // Try to do groups of 4 words - uint32 words4 = bytes >> 4; - - srcWord = src32[0]; - - while (words4--) { - dstWord = srcWord >> shiftValue; - srcWord = src32[1]; - dstWord |= srcWord << lastShiftValue; - dst32[0] = dstWord; - dstWord = srcWord >> shiftValue; - srcWord = src32[2]; - dstWord |= srcWord << lastShiftValue; - dst32[1] = dstWord; - dstWord = srcWord >> shiftValue; - srcWord = src32[3]; - dstWord |= srcWord << lastShiftValue; - dst32[2] = dstWord; - dstWord = srcWord >> shiftValue; - srcWord = src32[4]; - dstWord |= srcWord << lastShiftValue; - dst32[3] = dstWord; - src32 += 4; - dst32 += 4; - } - - uint32 words = (bytes & 0xF) >> 2; - - // we read one word ahead of what we write - // setup the first read - if (words) { - srcWord = *src32++; - - while (words--) { - dstWord = srcWord >> shiftValue; - srcWord = *src32++; - dstWord |= srcWord << lastShiftValue; - *dst32++ = dstWord; - } - } - - return (byte *)dst32 - (byte *)origDst32; -} -// More challenging -- need to shift -// Assume dst is aligned -void PspMemory::swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { - DEBUG_ENTER_FUNC(); - if (bytes < MIN_AMOUNT_FOR_MISALIGNED_COPY) { // less than a certain number of bytes it's just not worth it - swap16((uint16 *)dst32, src16, bytes, format); - return; - } - - int words = bytes >> 2; - uint32 remainingBytes = bytes & 3; - - uint32 *src32 = (uint32 *)(((uint32)src16) & 0xFFFFFFFC); // remove misalignment - - // we read one word ahead of what we write - // setup the first read - uint32 lastWord = ((*src32++) >> 16) & 0xFFFF; - - for (; words; words--) { - uint32 srcWord = *src32++; - uint32 curWord = (srcWord >> 16) & 0xFFFF; - lastWord |= (srcWord & 0xFFFF) << 16; // take the part of the src that belongs to this word - *dst32++ = format.swapRedBlue32(lastWord); - lastWord = curWord; - } - - if (remainingBytes) { // add in the remaining stuff - *(uint16 *)dst32 = format.swapRedBlue16((uint16)lastWord); - } -} - -inline void PspMemory::copy16(uint16 *dst16, const uint16 *src16, uint32 bytes) { - PSP_DEBUG_PRINT("copy16(): dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); - - uint32 shorts = bytes >> 1; - uint32 remainingBytes = bytes & 1; - - for (; shorts > 0 ; shorts--) { - *dst16++ = *src16++; - } - if (remainingBytes) - *(byte *)dst16 = *(byte *)src16; -} - -// Class VramAllocator ----------------------------------- - -DECLARE_SINGLETON(VramAllocator) - -//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ -//#define __PSP_DEBUG_PRINT__ - -#include "backends/platform/psp/trace.h" - - -void *VramAllocator::allocate(int32 size, bool smallAllocation /* = false */) { - DEBUG_ENTER_FUNC(); - assert(size > 0); - - byte *lastAddress = smallAllocation ? (byte *)VRAM_SMALL_ADDRESS : (byte *)VRAM_START_ADDRESS; - Common::List::iterator i; - - // Find a block that fits, starting from the beginning - for (i = _allocList.begin(); i != _allocList.end(); ++i) { - byte *currAddress = (*i).address; - - if (currAddress - lastAddress >= size) // We found a match - break; - - if ((*i).getEnd() > lastAddress) - lastAddress = (byte *)(*i).getEnd(); - } - - if (lastAddress + size > (byte *)VRAM_END_ADDRESS) { - PSP_DEBUG_PRINT("No space for allocation of %d bytes. %d bytes already allocated.\n", - size, _bytesAllocated); - return NULL; - } - - _allocList.insert(i, Allocation(lastAddress, size)); - _bytesAllocated += size; - - PSP_DEBUG_PRINT("Allocated in VRAM, size %u at %p.\n", size, lastAddress); - PSP_DEBUG_PRINT("Total allocated %u, remaining %u.\n", _bytesAllocated, (2 * 1024 * 1024) - _bytesAllocated); - - return lastAddress; -} - -// Deallocate a block from VRAM -void VramAllocator::deallocate(void *address) { - DEBUG_ENTER_FUNC(); - address = (byte *)CACHED(address); // Make sure all addresses are the same - - Common::List::iterator i; - - // Find the Allocator to deallocate - for (i = _allocList.begin(); i != _allocList.end(); ++i) { - if ((*i).address == address) { - _bytesAllocated -= (*i).size; - _allocList.erase(i); - PSP_DEBUG_PRINT("Deallocated address[%p], size[%u]\n", (*i).address, (*i).size); - return; - } - } - - PSP_DEBUG_PRINT("Address[%p] not allocated.\n", address); -} +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ + * + */ + +#include "common/scummsys.h" +#include "common/singleton.h" +#include "common/list.h" +#include "backends/platform/psp/PSPPixelFormat.h" +#include "backends/platform/psp/memory.h" + +// Class Copier -------------------------------------------------------------------------- +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + +//#define TEST_MEMORY_COPY + +extern "C" { + +void *__wrap_memcpy(void *dst, void *src, size_t bytes) { + PspMemory::fastCopy((byte *)dst, (byte *)src, bytes); + return dst; +} + +} + +void PspMemory::copy(byte *dst, const byte *src, uint32 bytes) { + DEBUG_ENTER_FUNC(); + +#ifdef TEST_MEMORY_COPY + uint32 debugBytes = bytes; + const byte *debugDst = dst, *debugSrc = src; +#endif + + PSP_DEBUG_PRINT("copy(): dst[%p], src[%p], bytes[%d]\n", dst, src, bytes); + + // align the destination pointer first + uint32 prefixDst = (((uint32)dst) & 0x3); + + if (prefixDst) { + prefixDst = 4 - prefixDst; // prefix only if we have address % 4 != 0 + PSP_DEBUG_PRINT("prefixDst[%d]\n", prefixDst); + + bytes -= prefixDst; // remember we assume bytes >= 4 + + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { // check if it's worthwhile to continue + copy8(dst, src, bytes + prefixDst); +#ifdef TEST_MEMORY_COPY + testCopy(debugDst, debugSrc, debugBytes); +#endif + return; + } + + while (prefixDst--) { + *dst++ = *src++; + } + } + + // check the source pointer alignment now + uint32 alignSrc = (((uint32)src) & 0x3); + + if (alignSrc) { // we'll need to realign our reads + copy32Misaligned((uint32 *)dst, src, bytes, alignSrc); + } else { + copy32Aligned((uint32 *)dst, (uint32 *)src, bytes); + } + +#ifdef TEST_MEMORY_COPY + testCopy(debugDst, debugSrc, debugBytes); +#endif +} + +void PspMemory::testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes) { + + bool mismatch = false; + PSP_INFO_PRINT("testing fastCopy..."); + + for (uint32 i = 0; i < debugBytes; i++) { + if (debugDst[i] != debugSrc[i]) { + if (!mismatch) { + PSP_INFO_PRINT("**** mismatch in copy! ****\n"); + PSP_INFO_PRINT("dst[%p], src[%p], bytes[%u]\n", debugDst, debugSrc, debugBytes); + mismatch = true; + } + PSP_INFO_PRINT("[%d]%x!=%x ", i, debugSrc[i], debugDst[i]); + } + } + if (mismatch) { + PSP_INFO_PRINT("\n"); + } else { + PSP_INFO_PRINT("ok\n"); + } +} + +// +// used to swap red and blue +void PspMemory::swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + +#ifdef TEST_MEMORY_COPY + uint32 debugBytes = bytes; + const uint16 *debugDst = dst16, *debugSrc = src16; +#endif + + // align the destination pointer first + uint32 prefixDst = (((uint32)dst16) & 0x3); // for swap, we can only have 2 or 0 as our prefix + + if (prefixDst) { + bytes -= prefixDst; // remember we assume bytes > 4 + *dst16++ = format.swapRedBlue16(*src16++); + + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { // check if it's worthwhile to continue + swap16(dst16, src16, bytes, format); + +#ifdef TEST_MEMORY_COPY + testSwap(debugDst, debugSrc, debugBytes, format); +#endif + return; + } + } + + // check the source pointer alignment now + uint32 alignSrc = (((uint32)src16) & 0x3); + + if (alignSrc) { // we'll need to realign our reads + PSP_DEBUG_PRINT("misaligned copy of %u bytes from %p to %p\n", bytes, src16, dst16); + swap32Misaligned((uint32 *)dst16, src16, bytes, format); + } else { + swap32Aligned((uint32 *)dst16, (const uint32 *)src16, bytes, format); + } + +#ifdef TEST_MEMORY_COPY + testSwap(debugDst, debugSrc, debugBytes, format); +#endif + +} + +void PspMemory::testSwap(const uint16 *debugDst, const uint16 *debugSrc, uint32 debugBytes, PSPPixelFormat &format) { + + bool mismatch = false; + PSP_INFO_PRINT("testing fastSwap..."); + + uint32 shorts = debugBytes >> 1; + + for (uint32 i = 0; i < shorts; i++) { + if (debugDst[i] != format.swapRedBlue16(debugSrc[i])) { + if (!mismatch) { + PSP_INFO_PRINT("**** mismatch in swap! ****\n"); + PSP_INFO_PRINT("dst[%p], src[%p], bytes[%u]\n", debugDst, debugSrc, debugBytes); + mismatch = true; + } + PSP_INFO_PRINT("[%d]%x!=%x ", i<<1, format.swapRedBlue16(debugSrc[i]), debugDst[i]); + } + } + if (mismatch) { + PSP_INFO_PRINT("\n"); + } else { + PSP_INFO_PRINT("ok\n"); + } +} + + +void PspMemory::copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes) { + PSP_DEBUG_PRINT("copy32Aligned(): dst32[%p], src32[%p], bytes[%d]\n", dst32, src32, bytes); + + int words8 = bytes >> 5; + + // try blocks of 8 words at a time + if (words8) { + while (words8--) { + uint32 a, b, c, d; + a = src32[0]; + b = src32[1]; + c = src32[2]; + d = src32[3]; + dst32[0] = a; + dst32[1] = b; + dst32[2] = c; + dst32[3] = d; + a = src32[4]; + b = src32[5]; + c = src32[6]; + d = src32[7]; + dst32[4] = a; + dst32[5] = b; + dst32[6] = c; + dst32[7] = d; + dst32 += 8; + src32 += 8; + } + } + + int words4 = (bytes & 0x1F) >> 4; + + // try blocks of 4 words at a time + if (words4) { + uint32 a, b, c, d; + a = src32[0]; + b = src32[1]; + c = src32[2]; + d = src32[3]; + dst32[0] = a; + dst32[1] = b; + dst32[2] = c; + dst32[3] = d; + dst32 += 4; + src32 += 4; + } + + int bytesLeft = (bytes & 0xF); // only look at bytes left after we did the above + int wordsLeft = bytesLeft >> 2; + + // now just do single words + while (wordsLeft) { + *dst32++ = *src32++; + wordsLeft--; + } + + bytesLeft = bytes & 0x3; // get remaining bytes + + PSP_DEBUG_PRINT("bytesLeft[%d]\n", bytesLeft); + + byte *dst = (byte *)dst32; + byte *src = (byte *)src32; + + while (bytesLeft--) { + *dst++ = *src++; + } +} + +void PspMemory::swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + int words4 = bytes >> 4; + + // try blocks of 4 words at a time + while (words4--) { + uint32 a, b, c, d; + a = format.swapRedBlue32(src32[0]); + b = format.swapRedBlue32(src32[1]); + c = format.swapRedBlue32(src32[2]); + d = format.swapRedBlue32(src32[3]); + dst32[0] = a; + dst32[1] = b; + dst32[2] = c; + dst32[3] = d; + dst32 += 4; + src32 += 4; + } + + uint32 bytesLeft = bytes & 0xF; + uint32 words = bytesLeft >> 2; + + // now just do words + while (words--) { + *dst32++ = format.swapRedBlue32(*src32++); + } + + bytesLeft = bytes & 0x3; + + if (bytesLeft) { // for swap, can only be 1 short left + *((uint16 *)dst32) = format.swapRedBlue16(*((uint16 *)src32)); + } +} + + +// More challenging -- need to shift +// Assume dst is aligned +void PspMemory::copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc) { + PSP_DEBUG_PRINT("copy32Misaligned: dst32[%p], src[%p], bytes[%d], alignSrc[%d]\n", dst32, src, bytes, alignSrc); + + uint32 *src32 = (uint32 *)(((uint32)src) & 0xFFFFFFFC); // remove misalignment + uint32 offset; + + switch (alignSrc) { + case 1: + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 8, 24); + break; + case 2: + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 16, 16); + break; + default: /* 3 */ + offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 24, 8); + break; + } + + uint32 remainingBytes = bytes & 3; + + if (remainingBytes) { + byte *dst = (byte *)dst32; + src += offset; + dst += offset; + copy8(dst, src, remainingBytes); + } +} + +// returns offset in dst +uint32 PspMemory::misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue) { + uint32 *origDst32 = dst32; + register uint32 dstWord, srcWord; + + PSP_DEBUG_PRINT("misaligned32Detail(): alignSrc[%d], dst32[%p], src32[%p], bytes[%d]\n", alignSrc, dst32, src32, bytes); + + // Try to do groups of 4 words + uint32 words4 = bytes >> 4; + + srcWord = src32[0]; + + while (words4--) { + dstWord = srcWord >> shiftValue; + srcWord = src32[1]; + dstWord |= srcWord << lastShiftValue; + dst32[0] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[2]; + dstWord |= srcWord << lastShiftValue; + dst32[1] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[3]; + dstWord |= srcWord << lastShiftValue; + dst32[2] = dstWord; + dstWord = srcWord >> shiftValue; + srcWord = src32[4]; + dstWord |= srcWord << lastShiftValue; + dst32[3] = dstWord; + src32 += 4; + dst32 += 4; + } + + uint32 words = (bytes & 0xF) >> 2; + + // we read one word ahead of what we write + // setup the first read + if (words) { + src32++; // we already loaded the value, so just increment + + while (words--) { + dstWord = srcWord >> shiftValue; + srcWord = *src32++; + dstWord |= srcWord << lastShiftValue; + *dst32++ = dstWord; + } + } + + return (byte *)dst32 - (byte *)origDst32; +} + +// More challenging -- need to shift +// We assume dst is aligned +void PspMemory::swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + DEBUG_ENTER_FUNC(); + + const uint32 shiftValue = 16; + uint32 *src32 = (uint32 *)(((uint32)src16) & 0xFFFFFFFC); // remove misalignment + + // Try to do groups of 4 words + uint32 words4 = bytes >> 4; + uint32 srcWord = src32[0]; // preload + + while (words4--) { + uint32 dstWord = srcWord >> shiftValue; + srcWord = src32[1]; + dstWord |= srcWord << shiftValue; + dst32[0] = format.swapRedBlue32(dstWord); + dstWord = srcWord >> shiftValue; + srcWord = src32[2]; + dstWord |= srcWord << shiftValue; + dst32[1] = format.swapRedBlue32(dstWord); + dstWord = srcWord >> shiftValue; + srcWord = src32[3]; + dstWord |= srcWord << shiftValue; + dst32[2] = format.swapRedBlue32(dstWord); + dstWord = srcWord >> shiftValue; + srcWord = src32[4]; + dstWord |= srcWord << shiftValue; + dst32[3] = format.swapRedBlue32(dstWord); + src32 += 4; + dst32 += 4; + } + + uint32 words = (bytes & 0xF) >> 2; + + // we read one word ahead of what we write + // setup the first read + if (words) { + //srcWord = *src32++; // don't need this. already loaded + src32++; // we already have the value loaded in + + while (words--) { + uint32 dstWord = srcWord >> shiftValue; + srcWord = *src32++; + dstWord |= srcWord << shiftValue; + *dst32++ = format.swapRedBlue32(dstWord); + } + } + + uint32 bytesLeft = bytes & 3; + + if (bytesLeft) { // for swap, can only be 1 short left + *((uint16 *)dst32) = format.swapRedBlue16((uint16)(srcWord >> shiftValue)); + } +} + +inline void PspMemory::copy16(uint16 *dst16, const uint16 *src16, uint32 bytes) { + PSP_DEBUG_PRINT("copy16(): dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); + + uint32 shorts = bytes >> 1; + uint32 remainingBytes = bytes & 1; + + for (; shorts > 0 ; shorts--) { + *dst16++ = *src16++; + } + if (remainingBytes) + *(byte *)dst16 = *(byte *)src16; +} + +// Class VramAllocator ----------------------------------- + +DECLARE_SINGLETON(VramAllocator) + +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + + +void *VramAllocator::allocate(int32 size, bool smallAllocation /* = false */) { + DEBUG_ENTER_FUNC(); + assert(size > 0); + + byte *lastAddress = smallAllocation ? (byte *)VRAM_SMALL_ADDRESS : (byte *)VRAM_START_ADDRESS; + Common::List::iterator i; + + // Find a block that fits, starting from the beginning + for (i = _allocList.begin(); i != _allocList.end(); ++i) { + byte *currAddress = (*i).address; + + if (currAddress - lastAddress >= size) // We found a match + break; + + if ((*i).getEnd() > lastAddress) + lastAddress = (byte *)(*i).getEnd(); + } + + if (lastAddress + size > (byte *)VRAM_END_ADDRESS) { + PSP_DEBUG_PRINT("No space for allocation of %d bytes. %d bytes already allocated.\n", + size, _bytesAllocated); + return NULL; + } + + _allocList.insert(i, Allocation(lastAddress, size)); + _bytesAllocated += size; + + PSP_DEBUG_PRINT("Allocated in VRAM, size %u at %p.\n", size, lastAddress); + PSP_DEBUG_PRINT("Total allocated %u, remaining %u.\n", _bytesAllocated, (2 * 1024 * 1024) - _bytesAllocated); + + return lastAddress; +} + +// Deallocate a block from VRAM +void VramAllocator::deallocate(void *address) { + DEBUG_ENTER_FUNC(); + address = (byte *)CACHED(address); // Make sure all addresses are the same + + Common::List::iterator i; + + // Find the Allocator to deallocate + for (i = _allocList.begin(); i != _allocList.end(); ++i) { + if ((*i).address == address) { + _bytesAllocated -= (*i).size; + _allocList.erase(i); + PSP_DEBUG_PRINT("Deallocated address[%p], size[%u]\n", (*i).address, (*i).size); + return; + } + } + + PSP_DEBUG_PRINT("Address[%p] not allocated.\n", address); +} diff --git a/backends/platform/psp/memory.h b/backends/platform/psp/memory.h index 81a77cca1c..c9b3d21cb6 100644 --- a/backends/platform/psp/memory.h +++ b/backends/platform/psp/memory.h @@ -1,131 +1,132 @@ - -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ - * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ - * - */ - -#ifndef PSP_MEMORY_H -#define PSP_MEMORY_H - -#include "backends/platform/psp/psppixelformat.h" -#include "common/list.h" - -#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */ -#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */ - -#define MIN_AMOUNT_FOR_COMPLEX_COPY 8 -#define MIN_AMOUNT_FOR_MISALIGNED_COPY 8 - -//#define __PSP_DEBUG_PRINT__ - -#include "backends/platform/psp/trace.h" - -/** - * Class that does memory copying and swapping if needed - */ -class PspMemory { -private: - static void testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes); - static void copy(byte *dst, const byte *src, uint32 bytes); - static void swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); - static void copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes); - static void swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format); - static void copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc); - static uint32 misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue); - static void swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); - static void copy16(uint16 *dst, const uint16 *src, uint32 bytes); - - // For swapping, we know that we have multiples of 16 bits - static void swap16(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { - PSP_DEBUG_PRINT("swap16 called with dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); - uint32 shorts = bytes >> 1; - - for (; shorts > 0 ; shorts--) { - *dst16++ = format.swapRedBlue16(*src16++); - } - } - - static void copy8(byte *dst, const byte *src, uint32 bytes) { - PSP_DEBUG_PRINT("copy8 called with dst[%p], src[%p], bytes[%d]\n", dst, src, bytes); - while (bytes--) { - *dst++ = *src++; - } - } - -public: - // This is the interface to the outside world - static void fastCopy(byte *dst, const byte *src, uint32 bytes) { - if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { - copy8(dst, src, bytes); - } else { // go to more powerful copy - copy(dst, src, bytes); - } - } - - static void fastSwap(byte *dst, const byte *src, uint32 bytes, PSPPixelFormat &format) { - if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY * 2) { - swap16((uint16 *)dst, (uint16 *)src, bytes, format); - } else { // go to more powerful copy - swap((uint16 *)dst, (uint16 *)src, bytes, format); - } - } -}; - -/** - * Class that allocates memory in the VRAM - */ -class VramAllocator : public Common::Singleton { -public: - VramAllocator() : _bytesAllocated(0) {} - void *allocate(int32 size, bool smallAllocation = false); // smallAllocation e.g. palettes - void deallocate(void *pointer); - - static inline bool isAddressInVram(void *address) { - if ((uint32)(CACHED(address)) >= VRAM_START_ADDRESS && (uint32)(CACHED(address)) < VRAM_END_ADDRESS) - return true; - return false; - } - - -private: - /** - * Used to allocate in VRAM - */ - struct Allocation { - byte *address; - uint32 size; - void *getEnd() { return address + size; } - Allocation(void *Address, uint32 Size) : address((byte *)Address), size(Size) {} - Allocation() : address(0), size(0) {} - }; - - enum { - VRAM_START_ADDRESS = 0x04000000, - VRAM_END_ADDRESS = 0x04200000, - VRAM_SMALL_ADDRESS = VRAM_END_ADDRESS - (4 * 1024) // 4K in the end for small allocations - }; - Common::List _allocList; // List of allocations - uint32 _bytesAllocated; -}; - -#endif /* PSP_MEMORY_H */ + +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 46126 2009-11-24 14:18:46Z fingolfin $ + * + */ + +#ifndef PSP_MEMORY_H +#define PSP_MEMORY_H + +#include "backends/platform/psp/psppixelformat.h" +#include "common/list.h" + +#define UNCACHED(x) ((byte *)(((uint32)(x)) | 0x40000000)) /* make an uncached access */ +#define CACHED(x) ((byte *)(((uint32)(x)) & 0xBFFFFFFF)) /* make an uncached access into a cached one */ + +#define MIN_AMOUNT_FOR_COMPLEX_COPY 8 +#define MIN_AMOUNT_FOR_MISALIGNED_COPY 8 + +//#define __PSP_DEBUG_PRINT__ + +#include "backends/platform/psp/trace.h" + +/** + * Class that does memory copying and swapping if needed + */ +class PspMemory { +private: + static void testCopy(const byte *debugDst, const byte *debugSrc, uint32 debugBytes); + static void testSwap(const uint16 *debugDst, const uint16 *debugSrc, uint32 debugBytes, PSPPixelFormat &format); + static void copy(byte *dst, const byte *src, uint32 bytes); + static void swap(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); + static void copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes); + static void swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format); + static void copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc); + static uint32 misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue); + static void swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); + static void copy16(uint16 *dst, const uint16 *src, uint32 bytes); + + // For swapping, we know that we have multiples of 16 bits + static void swap16(uint16 *dst16, const uint16 *src16, uint32 bytes, PSPPixelFormat &format) { + PSP_DEBUG_PRINT("swap16 called with dst16[%p], src16[%p], bytes[%d]\n", dst16, src16, bytes); + uint32 shorts = bytes >> 1; + + while (shorts--) { + *dst16++ = format.swapRedBlue16(*src16++); + } + } + + static void copy8(byte *dst, const byte *src, uint32 bytes) { + PSP_DEBUG_PRINT("copy8 called with dst[%p], src[%p], bytes[%d]\n", dst, src, bytes); + while (bytes--) { + *dst++ = *src++; + } + } + +public: + // This is the interface to the outside world + static void fastCopy(byte *dst, const byte *src, uint32 bytes) { + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY) { + copy8(dst, src, bytes); + } else { // go to more powerful copy + copy(dst, src, bytes); + } + } + + static void fastSwap(byte *dst, const byte *src, uint32 bytes, PSPPixelFormat &format) { + if (bytes < MIN_AMOUNT_FOR_COMPLEX_COPY * 2) { + swap16((uint16 *)dst, (uint16 *)src, bytes, format); + } else { // go to more powerful copy + swap((uint16 *)dst, (uint16 *)src, bytes, format); + } + } +}; + +/** + * Class that allocates memory in the VRAM + */ +class VramAllocator : public Common::Singleton { +public: + VramAllocator() : _bytesAllocated(0) {} + void *allocate(int32 size, bool smallAllocation = false); // smallAllocation e.g. palettes + void deallocate(void *pointer); + + static inline bool isAddressInVram(void *address) { + if ((uint32)(CACHED(address)) >= VRAM_START_ADDRESS && (uint32)(CACHED(address)) < VRAM_END_ADDRESS) + return true; + return false; + } + + +private: + /** + * Used to allocate in VRAM + */ + struct Allocation { + byte *address; + uint32 size; + void *getEnd() { return address + size; } + Allocation(void *Address, uint32 Size) : address((byte *)Address), size(Size) {} + Allocation() : address(0), size(0) {} + }; + + enum { + VRAM_START_ADDRESS = 0x04000000, + VRAM_END_ADDRESS = 0x04200000, + VRAM_SMALL_ADDRESS = VRAM_END_ADDRESS - (4 * 1024) // 4K in the end for small allocations + }; + Common::List _allocList; // List of allocations + uint32 _bytesAllocated; +}; + +#endif /* PSP_MEMORY_H */ diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp index b84702115f..dba9a8fc2b 100644 --- a/backends/platform/psp/psp_main.cpp +++ b/backends/platform/psp/psp_main.cpp @@ -44,15 +44,13 @@ #include "backends/plugins/psp/psp-provider.h" #include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/osys_psp.h" -#include "backends/platform/psp/tests.h" +#include "backends/platform/psp/tests.h" /* for unit/speed tests */ #include "backends/platform/psp/trace.h" #ifdef ENABLE_PROFILING #include #endif -#define ENABLE_TESTS /* to enable tests of PSP architecture */ - /** * Define the module info section * @@ -156,7 +154,7 @@ int SetupCallbacks(void) { #undef main int main(void) { //change clock rate to 333mhz - scePowerSetClockFrequency(222, 222, 111); + scePowerSetClockFrequency(333, 333, 166); PowerManager::instance(); // Setup power manager @@ -172,10 +170,11 @@ int main(void) { PluginManager::instance().addPluginProvider(new PSPPluginProvider()); #endif -#ifdef ENABLE_TESTS +/* unit/speed tests */ +#if defined (PSP_ENABLE_UNIT_TESTS) || defined (PSP_ENABLE_SPEED_TESTS) PSP_INFO_PRINT("running tests\n"); - tests(); - sceKernelSleepThread(); + psp_tests(); + sceKernelSleepThread(); // that's it. That's all we're doing #endif int res = scummvm_main(argc, argv); diff --git a/backends/platform/psp/tests.cpp b/backends/platform/psp/tests.cpp index 25c07fd723..d1bdb9e640 100644 --- a/backends/platform/psp/tests.cpp +++ b/backends/platform/psp/tests.cpp @@ -23,6 +23,13 @@ * */ +// PSP speed and unit tests. Activate in tests.h +// You may also want to build without any engines. + +#include "backends/platform/psp/tests.h" + +#if defined (PSP_ENABLE_UNIT_TESTS) || defined (PSP_ENABLE_SPEED_TESTS) + #include "common/scummsys.h" #include #include @@ -51,7 +58,36 @@ #include "backends/platform/psp/trace.h" -void test_ticks() { +class PspSpeedTests { +public: + void tickSpeed(); + void getMicrosSpeed(); + void seekSpeed(); + void msReadSpeed(); + void threadFunctionsSpeed(); + void semaphoreSpeed(); + static int threadFunc(SceSize args, void *argp); + void semaphoreManyThreadSpeed(); + void fastCopySpeed(); + +private: + enum { + MEMCPY_BUFFER_SIZE = 8192 + }; + static PspSemaphore _sem; // semaphore + + void readAndTime(uint32 bytes, char *buffer, FILE *file); + void seekAndTime(int bytes, int origin, FILE *file); + void fastCopySpecificSize(byte *dst, byte *src, uint32 bytes); + void fastCopyDifferentSizes(byte *dst, byte *src); + int getThreadIdSpeed(); + void getPrioritySpeed(); + void changePrioritySpeed(int id, int priority); +}; + +PspSemaphore PspSpeedTests::_sem(0); + +void PspSpeedTests::tickSpeed() { uint32 ticksPerSecond = sceRtcGetTickResolution(); PSP_INFO_PRINT("ticksPerSecond[%d]\n", ticksPerSecond); @@ -75,7 +111,7 @@ void test_ticks() { PSP_INFO_PRINT("time2, year[%d] month[%d] day[%d] hour[%d] minutes[%d] seconds[%d] us[%d]\n", time2.year, time2.month, time2.day, time2.hour, time2.minutes, time2.seconds, time2.microseconds); } -void test_getMicros() { +void PspSpeedTests::getMicrosSpeed() { uint32 time1, time2, time3, time4; time1 = PspRtc::instance().getMicros(); time2 = PspRtc::instance().getMicros(); @@ -85,7 +121,7 @@ void test_getMicros() { PSP_INFO_PRINT("getMicros() times: %d, %d, %d\n", time4-time3, time3-time2, time2-time1); } -void read_and_time(uint32 bytes, char *buffer, FILE *file) { +void PspSpeedTests::readAndTime(uint32 bytes, char *buffer, FILE *file) { uint32 time1 = PspRtc::instance().getMicros(); // test minimal read fread(buffer, bytes, 1, file); @@ -101,18 +137,8 @@ void read_and_time(uint32 bytes, char *buffer, FILE *file) { Reading 50 byte takes 8us / 11 Reading 100 byte takes 8us / 11 Reading 1000 byte takes 915us / 1131 - Reading 1000 byte takes 911us - Reading 1000 byte takes 914us - Reading 1000 byte takes 943us - Reading 1000 byte takes 915us - Reading 1000 byte takes 923us - Reading 1000 byte takes 22us - Reading 1000 byte takes 916us - Reading 1000 byte takes 913us / 1,120 - Reading 1000 byte takes 909us / 1,122 Reading 2000 byte takes 1806us / 2,284 Reading 3000 byte takes 2697us / 3,374 - Reading 4000 byte takes 3652us / 4,592 Reading 5000 byte takes 4551us / 5,544 Reading 6000 byte takes 5356us / 6,676 Reading 7000 byte takes 6800us / 8,358 @@ -120,47 +146,40 @@ void read_and_time(uint32 bytes, char *buffer, FILE *file) { Reading 9000 byte takes 6782us / 8,563 Reading 10000 byte takes 8497us / 10,631 Reading 30000 byte takes 25995us / 32,473 - Reading 50000 byte takes 42467us / 52,893 Reading 80000 byte takes 68457us / 85,291 Reading 100000 byte takes 85103us / 106,163 - Reading 500000 byte takes 427337us / 531,679 - Reading 1000000 byte takes 854831us / 1,063,107 */ // Function to test the impact of MS reads // These tests can't be done from shell - the cache screws them up -void test_ms_reads() { +void PspSpeedTests::msReadSpeed() { FILE *file; file = fopen("ms0:/psp/music/track1.mp3", "r"); char *buffer = (char *)malloc(2 * 1024 * 1024); - read_and_time(1, buffer, file); - read_and_time(10, buffer, file); - read_and_time(50, buffer, file); - read_and_time(100, buffer, file); - for (int i = 0; i< 10; i++) - read_and_time(1000, buffer, file); - read_and_time(2000, buffer, file); - read_and_time(3000, buffer, file); - read_and_time(4000, buffer, file); - read_and_time(5000, buffer, file); - read_and_time(6000, buffer, file); - read_and_time(7000, buffer, file); - read_and_time(8000, buffer, file); - read_and_time(9000, buffer, file); - read_and_time(10000, buffer, file); - read_and_time(30000, buffer, file); - read_and_time(50000, buffer, file); - read_and_time(80000, buffer, file); - read_and_time(100000, buffer, file); - read_and_time(500000, buffer, file); - read_and_time(1000000, buffer, file); + readAndTime(1, buffer, file); + readAndTime(10, buffer, file); + readAndTime(50, buffer, file); + readAndTime(100, buffer, file); + readAndTime(1000, buffer, file); + readAndTime(2000, buffer, file); + readAndTime(3000, buffer, file); + readAndTime(5000, buffer, file); + readAndTime(6000, buffer, file); + readAndTime(7000, buffer, file); + readAndTime(8000, buffer, file); + readAndTime(9000, buffer, file); + readAndTime(10000, buffer, file); + readAndTime(30000, buffer, file); + readAndTime(50000, buffer, file); + readAndTime(80000, buffer, file); + readAndTime(100000, buffer, file); fclose(file); free(buffer); } -void seek_and_time(int bytes, int origin, FILE *file) { +void PspSpeedTests::seekAndTime(int bytes, int origin, FILE *file) { char buffer[1000]; uint32 time1 = PspRtc::instance().getMicros(); @@ -202,26 +221,26 @@ Seeking 10000 byte from 2 took 3636us Reading 1000 bytes took 110us */ -void test_seeks() { +void PspSpeedTests::seekSpeed() { FILE *file; file = fopen("ms0:/psp/music/track1.mp3", "r"); - seek_and_time(0, SEEK_SET, file); - seek_and_time(5, SEEK_SET, file); - seek_and_time(1000, SEEK_SET, file); - seek_and_time(100, SEEK_SET, file); - seek_and_time(10000, SEEK_SET, file); - seek_and_time(-5, SEEK_CUR, file); - seek_and_time(-100, SEEK_CUR, file); - seek_and_time(100, SEEK_CUR, file); - seek_and_time(0, SEEK_END, file); - seek_and_time(-10000, SEEK_END, file); + seekAndTime(0, SEEK_SET, file); + seekAndTime(5, SEEK_SET, file); + seekAndTime(1000, SEEK_SET, file); + seekAndTime(100, SEEK_SET, file); + seekAndTime(10000, SEEK_SET, file); + seekAndTime(-5, SEEK_CUR, file); + seekAndTime(-100, SEEK_CUR, file); + seekAndTime(100, SEEK_CUR, file); + seekAndTime(0, SEEK_END, file); + seekAndTime(-10000, SEEK_END, file); fclose(file); } // 222: 5-7us -int testGetThreadId() { +int PspSpeedTests::getThreadIdSpeed() { uint32 time1 = PspRtc::instance().getMicros(); int threadId = sceKernelGetThreadId(); uint32 time2 = PspRtc::instance().getMicros(); @@ -232,7 +251,7 @@ int testGetThreadId() { } // 222: 4-5us -void testGetPriority() { +void PspSpeedTests::getPrioritySpeed() { uint32 time1 = PspRtc::instance().getMicros(); int priority = sceKernelGetThreadCurrentPriority(); uint32 time2 = PspRtc::instance().getMicros(); @@ -241,7 +260,7 @@ void testGetPriority() { } // 222: 9-10us -void testChangePriority(int id, int priority) { +void PspSpeedTests::changePrioritySpeed(int id, int priority) { uint32 time1 = PspRtc::instance().getMicros(); sceKernelChangeThreadPriority(id, priority); uint32 time2 = PspRtc::instance().getMicros(); @@ -249,15 +268,16 @@ void testChangePriority(int id, int priority) { PSP_INFO_PRINT("Changing thread priority to %d for id %d took %dus\n", priority, id, time2-time1); } -void test_thread() { +void PspSpeedTests::threadFunctionsSpeed() { + // very unscientific -- just ballpark int id; - id = testGetThreadId(); - testGetThreadId(); - testGetPriority(); - testGetPriority(); - testChangePriority(id, 30); - testChangePriority(id, 35); - testChangePriority(id, 25); + id = getThreadIdSpeed(); + getThreadIdSpeed(); + getPrioritySpeed(); + getPrioritySpeed(); + changePrioritySpeed(id, 30); + changePrioritySpeed(id, 35); + changePrioritySpeed(id, 25); // test context switch time for (int i=0; i<10; i++) { @@ -268,118 +288,12 @@ void test_thread() { } } -int test_mem_read(uint32 words) { - uint32 __attribute__((aligned(64))) buffer[1024]; - register uint32 r = 0; +void PspSpeedTests::semaphoreSpeed() { + PspSemaphore sem(1); - // uncached - uint32 *pBuffer = (uint32 *)UNCACHED(buffer); - uint32 time1 = PspRtc::instance().getMicros(); - for (int i=0; ir_acc = validate_property(obj, (opparams[0] >> 1)); - s->r_acc = validate_property(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(-1 + /*acc*/); + reg_t &opProperty = validate_property(obj, opparams[0] >> 1); + uint16 valueProperty; + if (validate_unsignedInteger(opProperty, valueProperty)) + s->r_acc = make_reg(0, valueProperty - 1); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeDptoaWorkarounds, opProperty, NULL_REG); + opProperty = s->r_acc; break; } -- cgit v1.2.3 From f36eb7e2edf5ec6140c1fce136c1804cdf81e787 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 18 Jul 2010 12:26:22 +0000 Subject: SCI: Fix warning svn-id: r50988 --- engines/sci/engine/kparse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 80a1c10e59..4287e7c96b 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -106,7 +106,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { s->r_acc = make_reg(0, 1); #ifdef DEBUG_PARSER - debugC(2, kDebugLevelParser, "Parsed to the following blocks:", 0); + debugC(2, kDebugLevelParser, "Parsed to the following blocks:"); for (ResultWordList::const_iterator i = words.begin(); i != words.end(); ++i) debugC(2, kDebugLevelParser, " Type[%04x] Group[%04x]", i->_class, i->_group); -- cgit v1.2.3 From 70dfcdfb54707b95b115fbb60e86cd841cc42ffe Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Sun, 18 Jul 2010 12:53:24 +0000 Subject: trying to fix psp build for case sensitive filesystems. svn-id: r50989 --- backends/platform/psp/memory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/psp/memory.cpp b/backends/platform/psp/memory.cpp index 1e7705e9e8..8eef223f8c 100644 --- a/backends/platform/psp/memory.cpp +++ b/backends/platform/psp/memory.cpp @@ -26,7 +26,7 @@ #include "common/scummsys.h" #include "common/singleton.h" #include "common/list.h" -#include "backends/platform/psp/PSPPixelFormat.h" +#include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/memory.h" // Class Copier -------------------------------------------------------------------------- -- cgit v1.2.3 From 4595b8818a862649d244687e57f15d0cce7d48c0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 13:08:47 +0000 Subject: SCI: adding room numbers to all workarounds svn-id: r50990 --- engines/sci/engine/kernel.cpp | 50 +++++++++++++-------------- engines/sci/engine/kernel.h | 3 +- engines/sci/engine/vm.cpp | 80 ++++++++++++++++++++++--------------------- 3 files changed, 68 insertions(+), 65 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index fd98f9c34d..1b4eca1edd 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -221,65 +221,65 @@ reg_t kDummy(EngineState *s, int argc, reg_t *argv) { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers + { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // when leaving graveyard, parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ6, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // during intro, parameter 4 is an object + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // floppy: during intro, parameter 4 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, 85, 0, "rScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, 85, 0, "lScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, 86, 0, "LL6Inv", "hide", -1, 0, { 0, 0 } }, // happens during the game, gets called with 1 extra parameter + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { 0, 0 } }, // happens during the game, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily - gets called with additional 5th parameter + { GID_LSL6, 240, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily - gets called with additional 5th parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 0, "rm740", "drawPic", -1, 0, { 1, 0 } }, // ending scene, is called with additional 3 (!) parameters + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { 1, 0 } }, // ending scene, is called with additional 3 (!) parameters SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_LSL6, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_SQ1, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle, room 260 + { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index aab7a9bd26..81106625bf 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -122,6 +122,7 @@ typedef reg_t KernelFunctionCall(EngineState *s, int argc, reg_t *argv); struct SciWorkaroundEntry { SciGameId gameId; + int roomNr; int scriptNr; int16 inheritanceLevel; const char *objectName; @@ -131,7 +132,7 @@ struct SciWorkaroundEntry { reg_t newValue; }; -#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, 0, NULL, NULL, -1, 0, { 0, 0 } } +#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { 0, 0 } } struct KernelSubFunction { KernelFunctionCall *function; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9d72562d03..83c204bbfa 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -292,6 +292,7 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); Common::String curMethodName; const SciGameId gameId = g_sci->getGameId(); + const int curRoomNumber = state->currentRoomNumber(); if (lastCall->type == EXEC_STACK_TYPE_CALL) { if (lastCall->debugSelector != -1) { @@ -312,6 +313,7 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w workaround = workaroundList; while (workaround->objectName) { if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr + && ((workaround->roomNr == -1) || (workaround->roomNr == curRoomNumber)) && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) && (workaround->objectName == searchObjectName) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset @@ -352,15 +354,15 @@ static bool validate_signedInteger(reg_t reg, int16 &integer) { return true; } -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry opcodeDivWorkarounds[] = { - { GID_QFG1VGA, 928, 0, "Blink", "init", -1, 0, { 0, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { 0, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { - { GID_LSL6, 938, 0, "ROsc", "cycleDone", -1, 0, { 0, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { 0, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -374,42 +376,42 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround return workaroundValue; } -// gameID, scriptNr,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_FREDDYPHARKAS, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_GK1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking - { GID_GK2, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts - { GID_HOYLE3, 0, 1, "Character", "say", -1, 504, { 0, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 0, 1, "Character", "say", -1, 505, { 0, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 700, 0, "gcWindow", "open", -1, -1, { 0, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, where the walking rock is - { GID_KQ6, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs - { GID_KQ6, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast - { GID_KQ6, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW2, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 0, "increase", "handleEvent", -1, 2, { 0, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room - { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 200, { 0, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 201, { 0, 0 } }, // see above - { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 202, { 0, 0 } }, // see above - { GID_LSL3, 340, 0, "ComicScript", "changeState", -1, 203, { 0, 0 } }, // see above - { GID_LSL3, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory - { GID_LSL6, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_QFG2, 71, 0, "theInvSheet", "doit", -1, 1, { 0, 0 } }, // accessing the inventory - { GID_SQ1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts - { GID_SQ6, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking + { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { 0, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { 0, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { 0, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { 0, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { 0, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { 0, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { 0, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { 0, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { 0, 0 } }, // accessing the inventory + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 921c9a8e33733f119020abb5d99a1b509b119f69 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 18 Jul 2010 13:31:05 +0000 Subject: SCI: Add basic debugging command for 'said' svn-id: r50991 --- engines/sci/console.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ engines/sci/console.h | 1 + 2 files changed, 118 insertions(+) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 0fec80fe1c..d91f257efe 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -93,6 +93,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger(), DCmd_Register("sentence_fragments", WRAP_METHOD(Console, cmdSentenceFragments)); DCmd_Register("parse", WRAP_METHOD(Console, cmdParse)); DCmd_Register("set_parse_nodes", WRAP_METHOD(Console, cmdSetParseNodes)); + DCmd_Register("said", WRAP_METHOD(Console, cmdSaid)); // Resources DCmd_Register("diskdump", WRAP_METHOD(Console, cmdDiskDump)); DCmd_Register("hexdump", WRAP_METHOD(Console, cmdHexDump)); @@ -306,6 +307,7 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" sentence_fragments - Shows the sentence fragments (used to build Parse trees)\n"); DebugPrintf(" parse - Parses a sequence of words and prints the resulting parse tree\n"); DebugPrintf(" set_parse_nodes - Sets the contents of all parse nodes\n"); + DebugPrintf(" said - Match a string against a said spec\n"); DebugPrintf("\n"); DebugPrintf("Resources:\n"); DebugPrintf(" diskdump - Dumps the specified resource to disk as a patch file\n"); @@ -1210,6 +1212,121 @@ bool Console::cmdParse(int argc, const char **argv) { return true; } +bool Console::cmdSaid(int argc, const char **argv) { + if (argc < 2) { + DebugPrintf("Matches a string against a said spec\n"); + DebugPrintf("Usage: %s > & \n", argv[0]); + DebugPrintf(" is a sequence of actual words.\n"); + DebugPrintf(" is a sequence of hex tokens.\n"); + return true; + } + + ResultWordList words; + char *error; + char string[1000]; + byte spec[1000]; + + int p; + // Construct the string + strcpy(string, argv[1]); + for (p = 2; p < argc && strcmp(argv[p],"&") != 0; p++) { + strcat(string, " "); + strcat(string, argv[p]); + } + + if (p >= argc-1) { + DebugPrintf("Matches a string against a said spec\n"); + DebugPrintf("Usage: %s > & \n", argv[0]); + DebugPrintf(" is a sequence of actual words.\n"); + DebugPrintf(" is a sequence of hex tokens.\n"); + return true; + } + + // TODO: Maybe turn this into a proper said spec compiler + unsigned int len = 0; + for (p++; p < argc; p++) { + if (strcmp(argv[p], ",") == 0) { + spec[len++] = 0xf0; + } else if (strcmp(argv[p], "&") == 0) { + spec[len++] = 0xf1; + } else if (strcmp(argv[p], "/") == 0) { + spec[len++] = 0xf2; + } else if (strcmp(argv[p], "(") == 0) { + spec[len++] = 0xf3; + } else if (strcmp(argv[p], ")") == 0) { + spec[len++] = 0xf4; + } else if (strcmp(argv[p], "[") == 0) { + spec[len++] = 0xf5; + } else if (strcmp(argv[p], "]") == 0) { + spec[len++] = 0xf6; + } else if (strcmp(argv[p], "#") == 0) { + spec[len++] = 0xf7; + } else if (strcmp(argv[p], "<") == 0) { + spec[len++] = 0xf8; + } else if (strcmp(argv[p], ">") == 0) { + spec[len++] = 0xf9; + } else if (strcmp(argv[p], "[<") == 0) { + spec[len++] = 0xf5; + spec[len++] = 0xf8; + } else if (strcmp(argv[p], "[/") == 0) { + spec[len++] = 0xf5; + spec[len++] = 0xf2; + } else if (strcmp(argv[p], "!*") == 0) { + spec[len++] = 0x0f; + spec[len++] = 0xfe; + } else if (strcmp(argv[p], "[!*]") == 0) { + spec[len++] = 0xf5; + spec[len++] = 0x0f; + spec[len++] = 0xfe; + spec[len++] = 0xf6; + } else { + unsigned int s = strtol(argv[p], 0, 16); + if (s >= 0xf0 && s <= 0xff) { + spec[len++] = s; + } else { + spec[len++] = s >> 8; + spec[len++] = s & 0xFF; + } + } + } + spec[len++] = 0xFF; + + printf("Matching '%s' against:", string); + _engine->getVocabulary()->decipherSaidBlock(spec); + + bool res = _engine->getVocabulary()->tokenizeString(words, string, &error); + if (res && !words.empty()) { + int syntax_fail = 0; + + _engine->getVocabulary()->synonymizeTokens(words); + + DebugPrintf("Parsed to the following blocks:\n"); + + for (ResultWordList::const_iterator i = words.begin(); i != words.end(); ++i) + DebugPrintf(" Type[%04x] Group[%04x]\n", i->_class, i->_group); + + if (_engine->getVocabulary()->parseGNF(words, true)) + syntax_fail = 1; // Building a tree failed + + if (syntax_fail) + DebugPrintf("Building a tree failed.\n"); + else { + _engine->getVocabulary()->dumpParseTree(); + _engine->getVocabulary()->parserIsValid = true; + + int ret = said(_engine->_gamestate, (byte*)spec, true); + DebugPrintf("kSaid: %s\n", (ret == SAID_NO_MATCH ? "No match" : "Match")); + } + + } else { + DebugPrintf("Unknown word: '%s'\n", error); + free(error); + } + + return true; +} + + bool Console::cmdParserNodes(int argc, const char **argv) { if (argc != 2) { DebugPrintf("Shows the specified number of nodes from the parse node tree\n"); diff --git a/engines/sci/console.h b/engines/sci/console.h index 51f02d7168..cb96944e01 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -65,6 +65,7 @@ private: bool cmdSentenceFragments(int argc, const char **argv); bool cmdParse(int argc, const char **argv); bool cmdSetParseNodes(int argc, const char **argv); + bool cmdSaid(int argc, const char **argv); // Resources bool cmdDiskDump(int argc, const char **argv); bool cmdHexDump(int argc, const char **argv); -- cgit v1.2.3 From 1e72d488678813a3a27ba1266b699e09ea357afd Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 18 Jul 2010 13:31:23 +0000 Subject: SCI: Work on optional expressions in said rules. This fixes a number of said specs in Iceman, but has a good chance of introducing regressions since it's fairly invasive. It also removes the need for the hack in r50958. svn-id: r50992 --- engines/sci/parser/said.cpp | 326 ++++++++++++++++++++++++-------------------- engines/sci/parser/said.y | 53 +++---- 2 files changed, 205 insertions(+), 174 deletions(-) diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 231485b030..faf0002cdd 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -104,7 +104,7 @@ /* Copy the first part of user declarations. */ - +#line 1 "said.y" /* ScummVM - Graphic Adventure Engine * @@ -247,7 +247,7 @@ typedef int YYSTYPE; /* Line 216 of yacc.c. */ - +#line 251 "said.cpp" #ifdef short # undef short @@ -460,18 +460,18 @@ union yyalloc #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 23 +#define YYFINAL 22 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 80 +#define YYLAST 102 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 18 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 13 +#define YYNNTS 12 /* YYNRULES -- Number of rules. */ -#define YYNRULES 35 +#define YYNRULES 38 /* YYNRULES -- Number of states. */ -#define YYNSTATES 69 +#define YYNSTATES 74 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -518,36 +518,38 @@ static const yytype_uint8 yytranslate[] = YYRHS. */ static const yytype_uint8 yyprhs[] = { - 0, 0, 3, 6, 10, 15, 16, 18, 19, 21, - 24, 29, 31, 34, 39, 41, 43, 45, 49, 51, - 55, 59, 64, 70, 73, 75, 77, 79, 83, 88, - 92, 97, 100, 105, 109, 112 + 0, 0, 3, 6, 10, 15, 16, 18, 19, 23, + 28, 30, 33, 38, 44, 49, 51, 54, 59, 65, + 70, 72, 74, 76, 80, 84, 90, 93, 95, 97, + 99, 103, 108, 112, 117, 120, 125, 129, 132 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 19, 0, -1, 21, 20, -1, 21, 22, 20, -1, - 21, 22, 23, 20, -1, -1, 13, -1, -1, 27, - -1, 6, 27, -1, 15, 6, 27, 10, -1, 6, - -1, 6, 27, -1, 15, 6, 27, 10, -1, 6, - -1, 3, -1, 26, -1, 9, 26, 10, -1, 24, - -1, 7, 27, 8, -1, 26, 4, 26, -1, 26, - 14, 29, 10, -1, 26, 4, 9, 26, 10, -1, - 25, 28, -1, 25, -1, 28, -1, 29, -1, 14, - 29, 10, -1, 29, 14, 29, 10, -1, 12, 24, - 30, -1, 17, 7, 27, 8, -1, 12, 26, -1, - 16, 9, 26, 10, -1, 12, 26, 30, -1, 12, - 26, -1, 17, 7, 27, 8, -1 + 21, 22, 23, 20, -1, -1, 13, -1, -1, 9, + 26, 10, -1, 9, 26, 10, 27, -1, 26, -1, + 6, 26, -1, 6, 9, 26, 10, -1, 6, 9, + 26, 10, 27, -1, 15, 6, 26, 10, -1, 6, + -1, 6, 26, -1, 6, 9, 26, 10, -1, 6, + 9, 26, 10, 27, -1, 15, 6, 26, 10, -1, + 6, -1, 3, -1, 24, -1, 7, 26, 8, -1, + 25, 4, 25, -1, 25, 4, 9, 25, 10, -1, + 25, 27, -1, 25, -1, 27, -1, 28, -1, 14, + 28, 10, -1, 28, 14, 28, 10, -1, 12, 24, + 29, -1, 17, 7, 26, 8, -1, 12, 25, -1, + 16, 9, 25, 10, -1, 12, 25, 29, -1, 12, + 25, -1, 17, 7, 26, 8, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 130, 130, 132, 134, 140, 141, 148, 149, 155, - 157, 159, 165, 167, 169, 174, 179, 181, 186, 188, - 190, 192, 194, 199, 201, 203, 208, 210, 212, 217, - 219, 221, 223, 228, 230, 232 + 0, 130, 130, 132, 134, 140, 141, 148, 149, 151, + 153, 159, 161, 163, 165, 167, 173, 175, 177, 179, + 181, 186, 191, 193, 195, 197, 202, 204, 206, 211, + 213, 215, 220, 222, 224, 226, 231, 233, 235 }; #endif @@ -560,8 +562,8 @@ static const char *const yytname[] = "YY_SLASH", "YY_PARENO", "YY_PARENC", "YY_BRACKETSO", "YY_BRACKETSC", "YY_HASH", "YY_LT", "YY_GT", "YY_BRACKETSO_LT", "YY_BRACKETSO_SLASH", "YY_LT_BRACKETSO", "YY_LT_PARENO", "$accept", "saidspec", "optcont", - "leftspec", "midspec", "rightspec", "word", "cwordset", "wordset", - "expr", "cwordrefset", "wordrefset", "recref", 0 + "leftspec", "midspec", "rightspec", "word", "wordset", "expr", + "cwordrefset", "wordrefset", "recref", 0 }; #endif @@ -578,19 +580,19 @@ static const yytype_uint16 yytoknum[] = /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 18, 19, 19, 19, 20, 20, 21, 21, 22, - 22, 22, 23, 23, 23, 24, 25, 25, 26, 26, - 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, - 29, 29, 29, 30, 30, 30 + 0, 18, 19, 19, 19, 20, 20, 21, 21, 21, + 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, + 23, 24, 25, 25, 25, 25, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, 29 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { - 0, 2, 2, 3, 4, 0, 1, 0, 1, 2, - 4, 1, 2, 4, 1, 1, 1, 3, 1, 3, - 3, 4, 5, 2, 1, 1, 1, 3, 4, 3, - 4, 2, 4, 3, 2, 4 + 0, 2, 2, 3, 4, 0, 1, 0, 3, 4, + 1, 2, 4, 5, 4, 1, 2, 4, 5, 4, + 1, 1, 1, 3, 3, 5, 2, 1, 1, 1, + 3, 4, 3, 4, 2, 4, 3, 2, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -598,41 +600,43 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 7, 15, 0, 0, 0, 0, 0, 0, 0, 5, - 18, 24, 16, 8, 25, 26, 0, 0, 18, 31, - 0, 0, 0, 1, 11, 6, 0, 2, 5, 23, - 0, 0, 0, 19, 17, 0, 0, 29, 27, 0, - 0, 9, 0, 14, 0, 3, 5, 0, 20, 0, - 0, 34, 0, 32, 30, 0, 12, 0, 4, 0, - 21, 28, 33, 0, 10, 0, 22, 35, 13 + 7, 21, 0, 0, 0, 0, 0, 0, 0, 5, + 22, 27, 10, 28, 29, 0, 0, 22, 34, 0, + 0, 0, 1, 15, 6, 0, 2, 5, 0, 26, + 0, 23, 8, 0, 0, 32, 30, 0, 0, 0, + 11, 0, 20, 0, 3, 5, 0, 24, 0, 9, + 37, 0, 35, 33, 0, 0, 0, 16, 0, 4, + 0, 31, 36, 0, 12, 14, 0, 0, 25, 38, + 13, 17, 19, 18 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 8, 27, 9, 28, 46, 10, 11, 12, 13, - 14, 15, 37 + -1, 8, 26, 9, 27, 45, 10, 11, 12, 13, + 14, 35 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -24 +#define YYPACT_NINF -22 static const yytype_int8 yypact[] = { - -1, -24, -1, 62, 62, 54, 1, 5, 18, 38, - -24, 47, 3, -24, -24, 12, 23, 15, -3, 3, - 28, 62, -1, -24, -1, -24, 42, -24, 39, -24, - 53, 54, 54, -24, -24, 62, 50, -24, -24, 29, - 41, -24, -1, -1, 52, -24, 55, 62, 3, 57, - 63, 20, -1, -24, -24, 64, -24, -1, -24, 32, - -24, -24, -24, 67, -24, 66, -24, -24, -24 + 1, -22, 61, 61, 9, 78, 5, 19, 34, 68, + -22, 55, -22, -22, 29, 40, 44, 13, 58, 60, + 9, 61, -22, 30, -22, 70, -22, 73, 2, -22, + 78, -22, 75, 9, 77, -22, -22, 25, 72, 61, + -22, 61, 49, 76, -22, 80, 9, 58, 86, -22, + 15, 61, -22, -22, 87, 88, 61, -22, 61, -22, + 41, -22, -22, 91, 75, -22, 90, 92, -22, -22, + -22, 75, -22, -22 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -24, -24, -23, -24, -24, -24, 68, -24, 0, -2, - 69, -4, 26 + -22, -22, -21, -22, -22, -22, 81, 3, -1, -11, + -2, 51 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -642,28 +646,32 @@ static const yytype_int8 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { - 16, 20, 1, 17, 19, 45, 2, 30, 3, 35, - 21, 4, 22, 5, 36, 6, 7, 31, 23, 30, - 40, 39, 41, 58, 30, 34, 32, 49, 50, 31, - 48, 33, 35, 30, 31, 51, 30, 36, 38, 53, - 55, 56, 66, 31, 24, 43, 31, 59, 42, 54, - 63, 25, 25, 26, 44, 65, 1, 52, 57, 4, - 2, 5, 47, 6, 7, 1, 4, 60, 25, 2, - 6, 7, 18, 61, 64, 67, 68, 62, 0, 0, - 29 + 29, 15, 16, 19, 1, 1, 44, 18, 2, 2, + 3, 46, 1, 4, 20, 5, 2, 6, 7, 28, + 38, 49, 40, 37, 59, 33, 21, 33, 48, 28, + 34, 47, 34, 1, 22, 52, 50, 2, 54, 39, + 55, 57, 4, 30, 5, 28, 6, 7, 31, 60, + 63, 68, 1, 70, 32, 66, 2, 67, 56, 28, + 73, 4, 28, 5, 1, 6, 7, 4, 2, 5, + 36, 6, 7, 4, 23, 5, 41, 6, 7, 42, + 53, 24, 58, 25, 51, 17, 24, 4, 43, 5, + 4, 6, 7, 24, 6, 7, 61, 64, 65, 69, + 71, 62, 72 }; -static const yytype_int8 yycheck[] = +static const yytype_uint8 yycheck[] = { - 2, 5, 3, 3, 4, 28, 7, 4, 9, 12, - 9, 12, 7, 14, 17, 16, 17, 14, 0, 4, - 22, 21, 24, 46, 4, 10, 14, 31, 32, 14, - 30, 8, 12, 4, 14, 35, 4, 17, 10, 10, - 42, 43, 10, 14, 6, 6, 14, 47, 6, 8, - 52, 13, 13, 15, 15, 57, 3, 7, 6, 12, - 7, 14, 9, 16, 17, 3, 12, 10, 13, 7, - 16, 17, 4, 10, 10, 8, 10, 51, -1, -1, - 11 + 11, 2, 3, 5, 3, 3, 27, 4, 7, 7, + 9, 9, 3, 12, 9, 14, 7, 16, 17, 4, + 21, 32, 23, 20, 45, 12, 7, 12, 30, 4, + 17, 28, 17, 3, 0, 10, 33, 7, 39, 9, + 41, 42, 12, 14, 14, 4, 16, 17, 8, 46, + 51, 10, 3, 64, 10, 56, 7, 58, 9, 4, + 71, 12, 4, 14, 3, 16, 17, 12, 7, 14, + 10, 16, 17, 12, 6, 14, 6, 16, 17, 6, + 8, 13, 6, 15, 7, 4, 13, 12, 15, 14, + 12, 16, 17, 13, 16, 17, 10, 10, 10, 8, + 10, 50, 10 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -671,12 +679,13 @@ static const yytype_int8 yycheck[] = static const yytype_uint8 yystos[] = { 0, 3, 7, 9, 12, 14, 16, 17, 19, 21, - 24, 25, 26, 27, 28, 29, 27, 26, 24, 26, - 29, 9, 7, 0, 6, 13, 15, 20, 22, 28, - 4, 14, 14, 8, 10, 12, 17, 30, 10, 26, - 27, 27, 6, 6, 15, 20, 23, 9, 26, 29, - 29, 26, 7, 10, 8, 27, 27, 6, 20, 26, - 10, 10, 30, 27, 10, 27, 10, 8, 10 + 24, 25, 26, 27, 28, 26, 26, 24, 25, 28, + 9, 7, 0, 6, 13, 15, 20, 22, 4, 27, + 14, 8, 10, 12, 17, 29, 10, 25, 26, 9, + 26, 6, 6, 15, 20, 23, 9, 25, 28, 27, + 25, 7, 10, 8, 26, 26, 9, 26, 6, 20, + 25, 10, 29, 26, 10, 10, 26, 26, 10, 8, + 27, 10, 10, 27 }; #define yyerrok (yyerrstatus = 0) @@ -1491,178 +1500,193 @@ yyreduce: switch (yyn) { case 2: - +#line 131 "said.y" { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]))); ;} break; case 3: - +#line 133 "said.y" { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (3)]), said_attach_branch((yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])))); ;} break; case 4: - +#line 135 "said.y" { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (4)]), said_attach_branch((yyvsp[(2) - (4)]), said_attach_branch((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))))); ;} break; case 5: - +#line 140 "said.y" { (yyval) = SAID_BRANCH_NULL; ;} break; case 6: - +#line 142 "said.y" { (yyval) = said_paren(said_value(0x14b, said_value(0xf900, said_terminal(0xf900))), SAID_BRANCH_NULL); ;} break; case 7: - +#line 148 "said.y" { (yyval) = SAID_BRANCH_NULL; ;} break; case 8: - - { (yyval) = said_paren(said_value(0x141, said_value(0x149, (yyvsp[(1) - (1)]))), SAID_BRANCH_NULL); ;} +#line 150 "said.y" + { (yyval) = said_aug_branch(0x152, 0x141, said_aug_branch(0x141, 0x149, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} break; case 9: - - { (yyval) = said_aug_branch(0x142, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} +#line 152 "said.y" + { (yyval) = said_aug_branch(0x141, 0x149, said_attach_branch(said_aug_branch(0x152, 0x141, (yyvsp[(2) - (4)]), SAID_BRANCH_NULL), (yyvsp[(4) - (4)])), SAID_BRANCH_NULL); ;} break; case 10: - - { (yyval) = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 154 "said.y" + { (yyval) = said_paren(said_value(0x141, said_value(0x149, (yyvsp[(1) - (1)]))), SAID_BRANCH_NULL); ;} break; case 11: - - { (yyval) = SAID_BRANCH_NULL; ;} +#line 160 "said.y" + { (yyval) = said_aug_branch(0x142, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} break; case 12: - - { (yyval) = said_aug_branch(0x143, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} +#line 162 "said.y" + { (yyval) = said_aug_branch(0x142, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} break; case 13: - - { (yyval) = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 164 "said.y" + { (yyval) = said_aug_branch(0x142, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x142, (yyvsp[(3) - (5)]), SAID_BRANCH_NULL), (yyvsp[(5) - (5)])), SAID_BRANCH_NULL); ;} break; case 14: - - { (yyval) = SAID_BRANCH_NULL; ;} +#line 166 "said.y" + { (yyval) = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} break; case 15: - - { (yyval) = said_paren(said_value(0x141, said_value(0x153, said_terminal((yyvsp[(1) - (1)])))), SAID_BRANCH_NULL); ;} +#line 168 "said.y" + { (yyval) = SAID_BRANCH_NULL; ;} break; case 16: - - { (yyval) = said_aug_branch(0x141, 0x14f, (yyvsp[(1) - (1)]), SAID_BRANCH_NULL); ;} +#line 174 "said.y" + { (yyval) = said_aug_branch(0x143, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} break; case 17: - - { (yyval) = said_aug_branch(0x141, 0x14f, said_aug_branch(0x152, 0x14c, said_aug_branch(0x141, 0x14f, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 176 "said.y" + { (yyval) = said_aug_branch(0x143, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} break; case 18: - - { (yyval) = (yyvsp[(1) - (1)]); ;} +#line 178 "said.y" + { (yyval) = said_aug_branch(0x143, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x143, (yyvsp[(3) - (5)]), SAID_BRANCH_NULL), (yyvsp[(5) - (5)])), SAID_BRANCH_NULL); ;} break; case 19: - - { (yyval) = said_aug_branch(0x141, 0x14c, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} +#line 180 "said.y" + { (yyval) = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} break; case 20: - - { (yyval) = said_attach_branch((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); ;} +#line 182 "said.y" + { (yyval) = SAID_BRANCH_NULL; ;} break; case 21: - - { (yyval) = said_attach_branch((yyvsp[(1) - (4)]), (yyvsp[(3) - (4)])); ;} +#line 187 "said.y" + { (yyval) = said_paren(said_value(0x141, said_value(0x153, said_terminal((yyvsp[(1) - (1)])))), SAID_BRANCH_NULL); ;} break; case 22: - - { (yyval) = said_attach_branch((yyvsp[(1) - (5)]), (yyvsp[(3) - (5)])); ;} +#line 192 "said.y" + { (yyval) = (yyvsp[(1) - (1)]); ;} break; case 23: - - { (yyval) = said_attach_branch((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); ;} +#line 194 "said.y" + { (yyval) = said_aug_branch(0x141, 0x14c, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} break; case 24: - - { (yyval) = (yyvsp[(1) - (1)]); ;} +#line 196 "said.y" + { (yyval) = said_attach_branch((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); ;} break; case 25: - - { (yyval) = (yyvsp[(1) - (1)]); ;} +#line 198 "said.y" + { (yyval) = said_attach_branch((yyvsp[(1) - (5)]), (yyvsp[(3) - (5)])); ;} break; case 26: - - { (yyval) = (yyvsp[(1) - (1)]); ;} +#line 203 "said.y" + { (yyval) = said_attach_branch(said_aug_branch(0x141, 0x14f, (yyvsp[(1) - (2)]), SAID_BRANCH_NULL), (yyvsp[(2) - (2)])); ;} break; case 27: - - { (yyval) = said_aug_branch(0x152, 0x144, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} +#line 205 "said.y" + { (yyval) = said_aug_branch(0x141, 0x14f, (yyvsp[(1) - (1)]), SAID_BRANCH_NULL); ;} break; case 28: - - { (yyval) = said_attach_branch((yyvsp[(1) - (4)]), said_aug_branch(0x152, 0x144, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL)); ;} +#line 207 "said.y" + { (yyval) = (yyvsp[(1) - (1)]); ;} break; case 29: - - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); ;} +#line 212 "said.y" + { (yyval) = (yyvsp[(1) - (1)]); ;} break; case 30: - - { (yyval) = said_aug_branch(0x144, 0x14f, said_aug_branch(0x141, 0x144, (yyvsp[(2) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 214 "said.y" + { (yyval) = said_aug_branch(0x152, 0x144, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} break; case 31: - - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} +#line 216 "said.y" + { (yyval) = said_attach_branch((yyvsp[(1) - (4)]), said_aug_branch(0x152, 0x144, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL)); ;} break; case 32: - - { (yyval) = said_aug_branch(0x152, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 221 "said.y" + { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); ;} break; case 33: - - { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), (yyvsp[(3) - (3)])); ;} +#line 223 "said.y" + { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} break; case 34: - - { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} +#line 225 "said.y" + { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} break; case 35: +#line 227 "said.y" + { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} + break; + + case 36: +#line 232 "said.y" + { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), (yyvsp[(3) - (3)])); ;} + break; + + case 37: +#line 234 "said.y" + { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} + break; + case 38: +#line 236 "said.y" { (yyval) = said_aug_branch(0x141, 0x14c, (yyvsp[(2) - (4)]), SAID_BRANCH_NULL); ;} break; /* Line 1267 of yacc.c. */ - +#line 1690 "said.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1876,7 +1900,7 @@ yyreturn: } - +#line 239 "said.y" int parse_yy_token_lookup[] = {YY_COMMA, YY_AMP, YY_SLASH, YY_PARENO, YY_PARENC, YY_BRACKETSO, YY_BRACKETSC, YY_HASH, YY_LT, YY_GT}; @@ -2025,14 +2049,6 @@ static int said_parse_spec(byte *spec) { } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); - if ((said_tokens_nr > 2) && (said_tokens[0] == 0xF500) && (said_tokens[1] == 0xFFE) && (said_tokens[2] == 0xF600)) { - // HACK: "[!*]" found at the start, remove it - occurs in iceman - for (int saidNr = 3; saidNr < said_tokens_nr; saidNr++) { - said_tokens[saidNr - 3] = said_tokens[saidNr]; - } - // FIXME: this should get properly implemented, but the parser code goes way over my head - } - if (nextitem == SAID_TERM) yyparse(); else { @@ -2232,6 +2248,9 @@ static int augment_match_expression_p(parse_tree_node_t *saidt, int augment_pos, switch (major) { case WORD_TYPE_BASE: + + // Iterate over children, and succeed if ANY child matches + while (cpos) { if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { int word = aug_get_wgroup(saidt, cpos); @@ -2332,6 +2351,9 @@ static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos int *ref_words, int ref_words_nr) { int check_major, check_minor; int check_pos = aug_get_first_child(saidt, augment_pos, &check_major, &check_minor); + + // Iterate over all children of the said node, and succeed if they ALL match + do { if (!(augment_match_expression_p(saidt, check_pos, parset, parse_branch, check_major, check_minor, base_words, base_words_nr, ref_words, ref_words_nr))) @@ -2365,6 +2387,10 @@ static int augment_sentence_part(parse_tree_node_t *saidt, int augment_pos, pars return 0; } + + // Iterative over the parse tree to find ANY matching subtree of the + // right major type. + while ((parse_branch = aug_get_next_sibling(parset, parse_branch, &pmajor, &pminor))) { if (pmajor == major) { // found matching sentence part int success; diff --git a/engines/sci/parser/said.y b/engines/sci/parser/said.y index 822ae07493..08c0f0169e 100644 --- a/engines/sci/parser/said.y +++ b/engines/sci/parser/said.y @@ -146,6 +146,10 @@ optcont : /* empty */ leftspec : /* empty */ { $$ = SAID_BRANCH_NULL; } + | YY_BRACKETSO expr YY_BRACKETSC + { $$ = said_aug_branch(0x152, 0x141, said_aug_branch(0x141, 0x149, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } + | YY_BRACKETSO expr YY_BRACKETSC cwordrefset + { $$ = said_aug_branch(0x141, 0x149, said_attach_branch(said_aug_branch(0x152, 0x141, $2, SAID_BRANCH_NULL), $4), SAID_BRANCH_NULL); } | expr { $$ = said_paren(said_value(0x141, said_value(0x149, $1)), SAID_BRANCH_NULL); } ; @@ -154,6 +158,10 @@ leftspec : /* empty */ midspec : YY_SLASH expr { $$ = said_aug_branch(0x142, 0x14a, $2, SAID_BRANCH_NULL); } + | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC + { $$ = said_aug_branch(0x142, 0x14a, $3, SAID_BRANCH_NULL); } + | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC cwordrefset + { $$ = said_aug_branch(0x142, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x142, $3, SAID_BRANCH_NULL), $5), SAID_BRANCH_NULL); } | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC { $$ = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } | YY_SLASH @@ -164,6 +172,10 @@ midspec : YY_SLASH expr rightspec : YY_SLASH expr { $$ = said_aug_branch(0x143, 0x14a, $2, SAID_BRANCH_NULL); } + | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC + { $$ = said_aug_branch(0x143, 0x14a, $3, SAID_BRANCH_NULL); } + | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC cwordrefset + { $$ = said_aug_branch(0x143, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x143, $3, SAID_BRANCH_NULL), $5), SAID_BRANCH_NULL); } | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC { $$ = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } | YY_SLASH @@ -176,30 +188,21 @@ word : WGROUP ; -cwordset : wordset - { $$ = said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL); } - | YY_BRACKETSO wordset YY_BRACKETSC - { $$ = said_aug_branch(0x141, 0x14f, said_aug_branch(0x152, 0x14c, said_aug_branch(0x141, 0x14f, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL), SAID_BRANCH_NULL); } - ; - - wordset : word { $$ = $1; } | YY_PARENO expr YY_PARENC { $$ = said_aug_branch(0x141, 0x14c, $2, SAID_BRANCH_NULL); } | wordset YY_COMMA wordset { $$ = said_attach_branch($1, $3); } - | wordset YY_BRACKETSO_LT wordrefset YY_BRACKETSC - { $$ = said_attach_branch($1, $3); } | wordset YY_COMMA YY_BRACKETSO wordset YY_BRACKETSC - { $$ = said_attach_branch($1, $3); } + { $$ = said_attach_branch($1, $3); } // CHECKME ; -expr : cwordset cwordrefset - { $$ = said_attach_branch($1, $2); } - | cwordset - { $$ = $1; } +expr : wordset cwordrefset + { $$ = said_attach_branch(said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL), $2); } + | wordset + { $$ = said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL); } | cwordrefset { $$ = $1; } ; @@ -217,11 +220,11 @@ cwordrefset : wordrefset wordrefset : YY_LT word recref { $$ = said_aug_branch(0x144, 0x14f, $2, $3); } | YY_LT_PARENO YY_PARENO expr YY_PARENC - { $$ = said_aug_branch(0x144, 0x14f, said_aug_branch(0x141, 0x144, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } + { $$ = said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL); } | YY_LT wordset { $$ = said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL); } | YY_LT_BRACKETSO YY_BRACKETSO wordset YY_BRACKETSC - { $$ = said_aug_branch(0x152, 0x144, said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } + { $$ = said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL); } ; @@ -381,14 +384,6 @@ static int said_parse_spec(byte *spec) { } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); - if ((said_tokens_nr > 2) && (said_tokens[0] == 0xF500) && (said_tokens[1] == 0xFFE) && (said_tokens[2] == 0xF600)) { - // HACK: "[!*]" found at the start, remove it - occurs in iceman - for (int saidNr = 3; saidNr < said_tokens_nr; saidNr++) { - said_tokens[saidNr - 3] = said_tokens[saidNr]; - } - // FIXME: this should get properly implemented, but the parser code goes way over my head - } - if (nextitem == SAID_TERM) yyparse(); else { @@ -588,6 +583,9 @@ static int augment_match_expression_p(parse_tree_node_t *saidt, int augment_pos, switch (major) { case WORD_TYPE_BASE: + + // Iterate over children, and succeed if ANY child matches + while (cpos) { if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { int word = aug_get_wgroup(saidt, cpos); @@ -688,6 +686,9 @@ static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos int *ref_words, int ref_words_nr) { int check_major, check_minor; int check_pos = aug_get_first_child(saidt, augment_pos, &check_major, &check_minor); + + // Iterate over all children of the said node, and succeed if they ALL match + do { if (!(augment_match_expression_p(saidt, check_pos, parset, parse_branch, check_major, check_minor, base_words, base_words_nr, ref_words, ref_words_nr))) @@ -721,6 +722,10 @@ static int augment_sentence_part(parse_tree_node_t *saidt, int augment_pos, pars return 0; } + + // Iterative over the parse tree to find ANY matching subtree of the + // right major type. + while ((parse_branch = aug_get_next_sibling(parset, parse_branch, &pmajor, &pminor))) { if (pmajor == major) { // found matching sentence part int success; -- cgit v1.2.3 From fd27041b3545fdf627ebfe4e6b12d1298f449fa6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 14:21:38 +0000 Subject: SCI: disabling saving from scummvm menu svn-id: r50993 --- engines/sci/detection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 541b41d012..2ee3a0bdcb 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -626,8 +626,8 @@ bool SciMetaEngine::hasFeature(MetaEngineFeature f) const { bool SciEngine::hasFeature(EngineFeature f) const { return //(f == kSupportsRTL) || - (f == kSupportsLoadingDuringRuntime) || - (f == kSupportsSavingDuringRuntime); + (f == kSupportsLoadingDuringRuntime); // || + //(f == kSupportsSavingDuringRuntime); } SaveStateList SciMetaEngine::listSaves(const char *target) const { -- cgit v1.2.3 From 46b27926b21dd1fac3b5948415670054ad67c6b8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 16:02:16 +0000 Subject: SCI: adding obj in kDoSound debug output svn-id: r50994 --- engines/sci/sound/soundcmd.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index e4c0bd5c8a..037d86b6f5 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -73,8 +73,8 @@ void SoundCommandParser::processInitSound(reg_t obj) { if (_soundVersion >= SCI_VERSION_1_EARLY) newSound->volume = CLIP(readSelectorValue(_segMan, obj, SELECTOR(vol)), 0, MUSIC_VOLUME_MAX); - debugC(2, kDebugLevelSound, "kDoSound(init): number %d, loop %d, prio %d, vol %d", resourceId, - newSound->loop, newSound->priority, newSound->volume); + debugC(2, kDebugLevelSound, "kDoSound(init): %04x:%04x number %d, loop %d, prio %d, vol %d", PRINT_REG(obj), + resourceId, newSound->loop, newSound->priority, newSound->volume); // In SCI1.1 games, sound effects are started from here. If we can find // a relevant audio resource, play it, otherwise switch to synthesized @@ -142,8 +142,8 @@ void SoundCommandParser::processPlaySound(reg_t obj) { if (_soundVersion >= SCI_VERSION_1_EARLY) musicSlot->volume = readSelectorValue(_segMan, obj, SELECTOR(vol)); - debugC(2, kDebugLevelSound, "kDoSound(play): number %d, loop %d, prio %d, vol %d", resourceId, - musicSlot->loop, musicSlot->priority, musicSlot->volume); + debugC(2, kDebugLevelSound, "kDoSound(play): %04x:%04x number %d, loop %d, prio %d, vol %d", PRINT_REG(obj), + resourceId, musicSlot->loop, musicSlot->priority, musicSlot->volume); _music->soundPlay(musicSlot); } @@ -328,7 +328,7 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { error("kDoSound(fade): unsupported argc %d", argc); } - debugC(2, kDebugLevelSound, "kDoSound(fade): to %d, step %d, ticker %d", musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); + debugC(2, kDebugLevelSound, "kDoSound(fade): %04x:%04x to %d, step %d, ticker %d", PRINT_REG(obj), musicSlot->fadeTo, musicSlot->fadeStep, musicSlot->fadeTickerStep); return acc; } -- cgit v1.2.3 From aa5a1ddb473237b0b7a857c974850424f5c8a576 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 16:22:16 +0000 Subject: SCI: if game starts fading, stops music and later starts music again don't resume fading - fixes lsl6 music when going in from swimming pool svn-id: r50995 --- engines/sci/sound/music.cpp | 1 + engines/sci/sound/soundcmd.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 55a7e1fdc4..533bee8170 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -388,6 +388,7 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { } } + pSnd->fadeStep = 0; // just make sure that previous fading isn't continued pSnd->status = kSoundPlaying; } diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 037d86b6f5..30b7c97a94 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -300,7 +300,7 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { // If sound is not playing currently, set signal directly if (musicSlot->status != kSoundPlaying) { - debugC(2, kDebugLevelSound, "kDoSound(fade): fading requested, but sound is currently not playing"); + debugC(2, kDebugLevelSound, "kDoSound(fade): %04x:%04x fading requested, but sound is currently not playing", PRINT_REG(obj)); writeSelectorValue(_segMan, obj, SELECTOR(signal), SIGNAL_OFFSET); return acc; } -- cgit v1.2.3 From 3189fe4a329ce5d762f8e396d188117f42325fa9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 16:25:23 +0000 Subject: SCI: change to r50995 - better stop fading when stop is called svn-id: r50996 --- engines/sci/sound/music.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 533bee8170..f359d5de93 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -388,7 +388,6 @@ void SciMusic::soundPlay(MusicEntry *pSnd) { } } - pSnd->fadeStep = 0; // just make sure that previous fading isn't continued pSnd->status = kSoundPlaying; } @@ -411,6 +410,8 @@ void SciMusic::soundStop(MusicEntry *pSnd) { pSnd->pMidiParser->mainThreadEnd(); _mutex.unlock(); } + + pSnd->fadeStep = 0; // end fading, if fading was in progress } void SciMusic::soundSetVolume(MusicEntry *pSnd, byte volume) { -- cgit v1.2.3 From f2496427339e009d17dbe225cd76c55ec1badcc1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 17:18:56 +0000 Subject: SCI: making int/uint comparsions more verbose replacing int/uint comparsion opcode with new code that also displays much more information in case of errors and also add possibility to easily add workarounds svn-id: r50997 --- engines/sci/engine/vm.cpp | 72 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 83c204bbfa..d81a004a0d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1277,8 +1277,13 @@ void run_vm(EngineState *s, bool restoring) { // Pseudo-WORKAROUND: Sierra allows any pointer <-> value comparison // Happens in SQ1, room 28, when throwing the water at Orat s->r_acc = make_reg(0, 1); - } else - s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) > (int16)/*acc*/); + } else { + int16 compare1, compare2; + if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 > compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_ge_: // 0x10 (16) @@ -1289,8 +1294,13 @@ void run_vm(EngineState *s, bool restoring) { if (r_temp.segment != s->r_acc.segment) warning("[VM] Comparing pointers in different segments (%04x:%04x vs. %04x:%04x)", PRINT_REG(r_temp), PRINT_REG(s->r_acc)); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset >= s->r_acc.offset); - } else - s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) >= (int16)/*acc*/); + } else { + int16 compare1, compare2; + if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 >= compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_lt_: // 0x11 (17) @@ -1307,8 +1317,13 @@ void run_vm(EngineState *s, bool restoring) { // Pseudo-WORKAROUND: Sierra allows any pointer <-> value comparison // Happens in SQ1, room 58, when giving id-card to robot s->r_acc = make_reg(0, 1); - } else - s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) < (int16)/*acc*/); + } else { + int16 compare1, compare2; + if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 < compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_le_: // 0x12 (18) @@ -1319,8 +1334,13 @@ void run_vm(EngineState *s, bool restoring) { if (r_temp.segment != s->r_acc.segment) warning("[VM] Comparing pointers in different segments (%04x:%04x vs. %04x:%04x)", PRINT_REG(r_temp), PRINT_REG(s->r_acc)); s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset <= s->r_acc.offset); - } else - s->r_acc = ACC_ARITHMETIC_L(signed_validate_arithmetic(r_temp) <= (int16)/*acc*/); + } else { + int16 compare1, compare2; + if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 <= compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_ugt_: // 0x13 (19) @@ -1342,8 +1362,13 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = make_reg(0, 1); else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset); - else - s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) > /*acc*/); + else { + uint16 compare1, compare2; + if (validate_unsignedInteger(r_temp, compare1) && validate_unsignedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 > compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_uge_: // 0x14 (20) @@ -1356,8 +1381,13 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = make_reg(0, 1); else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset >= s->r_acc.offset); - else - s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) >= /*acc*/); + else { + uint16 compare1, compare2; + if (validate_unsignedInteger(r_temp, compare1) && validate_unsignedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 >= compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_ult_: // 0x15 (21) @@ -1370,8 +1400,13 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = NULL_REG; else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset); - else - s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) < /*acc*/); + else { + uint16 compare1, compare2; + if (validate_unsignedInteger(r_temp, compare1) && validate_unsignedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 < compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_ule_: // 0x16 (22) @@ -1384,8 +1419,13 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = NULL_REG; else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset <= s->r_acc.offset); - else - s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) <= /*acc*/); + else { + uint16 compare1, compare2; + if (validate_unsignedInteger(r_temp, compare1) && validate_unsignedInteger(s->r_acc, compare2)) + s->r_acc = make_reg(0, compare1 <= compare2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + } break; case op_bt: // 0x17 (23) -- cgit v1.2.3 From 5b4fd084b066d36cc68c7b9a635f10d6fb3c44d7 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 17:48:48 +0000 Subject: SCI: Fix order of characters when using hexDumpReg. svn-id: r50998 --- engines/sci/console.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index d91f257efe..005ac9eefd 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -3440,11 +3440,11 @@ void Console::hexDumpReg(const reg_t *data, int len, int regsPerLine, int startO } printf(" |"); for (i = 0; i < regsPerLine; i++) { - c = data[i].toUint16() >> 8; + c = data[i].toUint16() & 0xff; if (c < 32 || c >= 127) c = '.'; printf("%c", c); - c = data[i].toUint16() & 0xff; + c = data[i].toUint16() >> 8; if (c < 32 || c >= 127) c = '.'; printf("%c", c); @@ -3467,11 +3467,11 @@ void Console::hexDumpReg(const reg_t *data, int len, int regsPerLine, int startO } printf(" |"); for (i = 0; i < len; i++) { - c = data[i].toUint16() >> 8; + c = data[i].toUint16() & 0xff; if (c < 32 || c >= 127) c = '.'; printf("%c", c); - c = data[i].toUint16() & 0xff; + c = data[i].toUint16() >> 8; if (c < 32 || c >= 127) c = '.'; printf("%c", c); -- cgit v1.2.3 From a2ea3381feadf69ced8107ca19b9ea029f761189 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 18:01:52 +0000 Subject: SCI: ipToa/ipTos/dpTos more verbose ...and adding ability to add workarounds easily svn-id: r50999 --- engines/sci/engine/vm.cpp | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d81a004a0d..c77e12443f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1740,11 +1740,17 @@ void run_vm(EngineState *s, bool restoring) { validate_property(obj, (opparams[0] >> 1)) = POP32(); break; - case op_ipToa: // 0x35 (53) - // Incement Property and copy To Accumulator - s->r_acc = validate_property(obj, (opparams[0] >> 1)); - s->r_acc = validate_property(obj, (opparams[0] >> 1)) = ACC_ARITHMETIC_L(1 + /*acc*/); + case op_ipToa: { // 0x35 (53) + // Increment Property and copy To Accumulator + reg_t &opProperty = validate_property(obj, opparams[0] >> 1); + uint16 valueProperty; + if (validate_unsignedInteger(opProperty, valueProperty)) + s->r_acc = make_reg(0, valueProperty + 1); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, opProperty, NULL_REG); + opProperty = s->r_acc; break; + } case op_dpToa: { // 0x36 (54) // Decrement Property and copy To Accumulator @@ -1758,19 +1764,31 @@ void run_vm(EngineState *s, bool restoring) { break; } - case op_ipTos: // 0x37 (55) + case op_ipTos: { // 0x37 (55) // Increment Property and push to Stack - validate_arithmetic(validate_property(obj, (opparams[0] >> 1))); - temp = ++validate_property(obj, (opparams[0] >> 1)).offset; - PUSH(temp); + reg_t &opProperty = validate_property(obj, opparams[0] >> 1); + uint16 valueProperty; + if (validate_unsignedInteger(opProperty, valueProperty)) + valueProperty++; + else + valueProperty = arithmetic_lookForWorkaround(opcode, NULL, opProperty, NULL_REG).offset; + opProperty = make_reg(0, valueProperty); + PUSH(valueProperty); break; + } - case op_dpTos: // 0x38 (56) + case op_dpTos: { // 0x38 (56) // Decrement Property and push to Stack - validate_arithmetic(validate_property(obj, (opparams[0] >> 1))); - temp = --validate_property(obj, (opparams[0] >> 1)).offset; - PUSH(temp); + reg_t &opProperty = validate_property(obj, opparams[0] >> 1); + uint16 valueProperty; + if (validate_unsignedInteger(opProperty, valueProperty)) + valueProperty--; + else + valueProperty = arithmetic_lookForWorkaround(opcode, NULL, opProperty, NULL_REG).offset; + opProperty = make_reg(0, valueProperty); + PUSH(valueProperty); break; + } case op_lofsa: // 0x39 (57) // Load Offset to Accumulator -- cgit v1.2.3 From 6eedb73dba118910198b5d0d727e56ad91052ee4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 18:14:56 +0000 Subject: SCI: Add initial support for SCI0 Mac and SCI1 Amiga/Mac sound. SCI1 sound is pretty much done, but envelope support is still not 100% complete. SCI0 Mac sound is not complete, but sounds "ok" for now. Much thanks to Walter, who did a ton of work on this. svn-id: r51001 --- engines/sci/sound/drivers/amiga.cpp | 515 +++++++++++++++++++++++++++++------- engines/sci/sound/music.cpp | 14 +- 2 files changed, 417 insertions(+), 112 deletions(-) diff --git a/engines/sci/sound/drivers/amiga.cpp b/engines/sci/sound/drivers/amiga.cpp index 0413dbb79e..f1b918ae6a 100644 --- a/engines/sci/sound/drivers/amiga.cpp +++ b/engines/sci/sound/drivers/amiga.cpp @@ -25,6 +25,7 @@ #include "sound/softsynth/emumidi.h" #include "sci/sound/drivers/mididriver.h" +#include "sci/resource.h" #include "common/file.h" #include "common/frac.h" @@ -34,27 +35,6 @@ namespace Sci { /* #define DEBUG */ -// Frequencies for every note -// FIXME Store only one octave -static const int freq_table[] = { - 58, 62, 65, 69, 73, 78, 82, 87, - 92, 98, 104, 110, 117, 124, 131, 139, - 147, 156, 165, 175, 185, 196, 208, 220, - 234, 248, 262, 278, 294, 312, 331, 350, - 371, 393, 417, 441, 468, 496, 525, 556, - 589, 625, 662, 701, 743, 787, 834, 883, - 936, 992, 1051, 1113, 1179, 1250, 1324, 1403, - 1486, 1574, 1668, 1767, 1872, 1984, 2102, 2227, - 2359, 2500, 2648, 2806, 2973, 3149, 3337, 3535, - 3745, 3968, 4204, 4454, 4719, 5000, 5297, 5612, - 5946, 6299, 6674, 7071, 7491, 7937, 8408, 8908, - 9438, 10000, 10594, 11224, 11892, 12599, 13348, 14142, - 14983, 15874, 16817, 17817, 18877, 20000, 21189, 22449, - 23784, 25198, 26696, 28284, 29966, 31748, 33635, 35635, - 37754, 40000, 42378, 44898, 47568, 50396, 53393, 56568, - 59932, 63496, 67271, 71271, 75509, 80000, 84757, 89796 -}; - class MidiDriver_Amiga : public MidiDriver_Emulated { public: enum { @@ -99,6 +79,7 @@ private: int instrument; int volume; int pan; + uint16 pitch; }; struct Envelope { @@ -121,7 +102,7 @@ private: frac_t rate; }; - struct Instrument { + struct InstrumentSample { char name[30]; int mode; int size; // Size of non-looping part in bytes @@ -130,32 +111,52 @@ private: Envelope envelope[4]; // Envelope int8 *samples; int8 *loop; + int16 startNote; + int16 endNote; + bool isUnsigned; + uint16 baseFreq; + uint16 baseNote; + int16 fixedNote; + }; + + class Instrument : public Common::Array { + public: + char name[30]; }; struct Bank { char name[30]; uint size; - Instrument *instruments[256]; + Common::Array instruments; }; + bool _isSci1; bool _playSwitch; int _masterVolume; int _frequency; Envelope _envDecay; Bank _bank; // Instrument bank + double _freqTable[48]; Channel _channels[MIDI_CHANNELS]; /* Internal channels */ Voice _voices[kChannels]; void setEnvelope(Voice *channel, Envelope *envelope, int phase); - int interpolate(int8 *samples, frac_t offset); + void setOutputFrac(int voice); + int interpolate(int8 *samples, frac_t offset, bool isUnsigned); void playInstrument(int16 *dest, Voice *channel, int count); void changeInstrument(int channel, int instrument); void stopChannel(int ch); void stopNote(int ch, int note); void startNote(int ch, int note, int velocity); - Instrument *readInstrument(Common::File &file, int *id); + InstrumentSample *findInstrument(int instrument, int note); + void pitchWheel(int ch, uint16 pitch); + + bool loadInstrumentsSCI0(Common::File &file); + bool loadInstrumentsSCI0Mac(Common::SeekableReadStream &file); + InstrumentSample *readInstrumentSCI0(Common::SeekableReadStream &file, int *id); + bool loadInstrumentsSCI1(Common::SeekableReadStream &file); }; void MidiDriver_Amiga::setEnvelope(Voice *channel, Envelope *envelope, int phase) { @@ -168,25 +169,32 @@ void MidiDriver_Amiga::setEnvelope(Voice *channel, Envelope *envelope, int phase channel->velocity = envelope[phase - 1].target; } -int MidiDriver_Amiga::interpolate(int8 *samples, frac_t offset) { +int MidiDriver_Amiga::interpolate(int8 *samples, frac_t offset, bool isUnsigned) { int x = fracToInt(offset); - int diff = (samples[x + 1] - samples[x]) << 8; + if (isUnsigned) { + int s1 = (byte)samples[x] - 0x80; + int s2 = (byte)samples[x + 1] - 0x80; + int diff = (s2 - s1) << 8; + return (s1 << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); + } + + int diff = (samples[x + 1] - samples[x]) << 8; return (samples[x] << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); } void MidiDriver_Amiga::playInstrument(int16 *dest, Voice *channel, int count) { int index = 0; int vol = _channels[channel->hw_channel].volume; - Instrument *instrument = _bank.instruments[channel->instrument]; + InstrumentSample *instrument = findInstrument(channel->instrument, channel->note); while (1) { /* Available source samples until end of segment */ frac_t lin_avail; - int seg_end, rem, i, amount; + uint32 seg_end, rem, i, amount; int8 *samples; - if (channel->looping) { + if (channel->looping && instrument->loop) { samples = instrument->loop; seg_end = instrument->loop_size; } else { @@ -208,11 +216,11 @@ void MidiDriver_Amiga::playInstrument(int16 *dest, Voice *channel, int count) { amount = rem; /* Stop at next envelope event */ - if ((channel->envelope_samples != -1) && (amount > channel->envelope_samples)) + if ((channel->envelope_samples != -1) && (amount > (uint32)channel->envelope_samples)) amount = channel->envelope_samples; for (i = 0; i < amount; i++) { - dest[index++] = interpolate(samples, channel->offset) * channel->velocity / 64 * channel->note_velocity * vol / (127 * 127); + dest[index++] = interpolate(samples, channel->offset, instrument->isUnsigned) * channel->velocity / 64 * channel->note_velocity * vol / (127 * 127); channel->offset += channel->rate; } @@ -263,7 +271,7 @@ void MidiDriver_Amiga::playInstrument(int16 *dest, Voice *channel, int count) { if (index == count) break; - if (fracToInt(channel->offset) >= seg_end) { + if ((uint32)fracToInt(channel->offset) >= seg_end) { if (instrument->mode & kModeLoop) { /* Loop the samples */ channel->offset -= intToFrac(seg_end); @@ -279,7 +287,7 @@ void MidiDriver_Amiga::playInstrument(int16 *dest, Voice *channel, int count) { void MidiDriver_Amiga::changeInstrument(int channel, int instrument) { #ifdef DEBUG - if (_bank.instruments[instrument]) + if (_bank.instruments[instrument][0]) printf("[sfx:seq:amiga] Setting channel %i to \"%s\" (%i)\n", channel, _bank.instruments[instrument]->name, instrument); else warning("[sfx:seq:amiga] instrument %i does not exist (channel %i)", instrument, channel); @@ -300,9 +308,16 @@ void MidiDriver_Amiga::stopChannel(int ch) { } } +void MidiDriver_Amiga::pitchWheel(int ch, uint16 pitch) { + _channels[ch].pitch = pitch; + + for (int i = 0; i < kChannels; i++) + if (_voices[i].note != -1 && _voices[i].hw_channel == ch) + setOutputFrac(i); +} + void MidiDriver_Amiga::stopNote(int ch, int note) { int channel; - Instrument *instrument; for (channel = 0; channel < kChannels; channel++) if (_voices[channel].note == note && _voices[channel].hw_channel == ch && !_voices[channel].decay) @@ -315,15 +330,75 @@ void MidiDriver_Amiga::stopNote(int ch, int note) { return; } - instrument = _bank.instruments[_voices[channel].instrument]; + InstrumentSample *instrument = findInstrument(_voices[channel].instrument, note); + + // FIXME: SCI1 envelope support is not perfect yet /* Start the envelope phases for note-off if looping is on and envelope is enabled */ if ((instrument->mode & kModeLoop) && (instrument->envelope[0].length != 0)) setEnvelope(&_voices[channel], instrument->envelope, 2); } +MidiDriver_Amiga::InstrumentSample *MidiDriver_Amiga::findInstrument(int instrument, int note) { + if ((uint)instrument >= _bank.instruments.size()) + return 0; + + for (uint32 i = 0; i < _bank.instruments[instrument].size(); i++) { + InstrumentSample *sample = _bank.instruments[instrument][i]; + if (note >= sample->startNote && note <= sample->endNote) + return sample; + } + + return 0; +} + +void MidiDriver_Amiga::setOutputFrac(int voice) { + InstrumentSample *instrument = findInstrument(_voices[voice].instrument, _voices[voice].note); + + int fnote = 0; + + if (instrument->fixedNote == -1) { + fnote = _voices[voice].note; + + // Handle SCI0-style transposing here + if (!_isSci1) + fnote += instrument->transpose; + + if (fnote < 0 || fnote > 127) { + warning("[sfx:seq:amiga] illegal note %i", fnote); + return; + } + } else + fnote = instrument->fixedNote; + + // Compute rate for note + int mulFact = 1, divFact = 1; + + fnote -= instrument->baseNote; + fnote *= 4; + // FIXME: check how SSCI maps this + fnote += (_channels[_voices[voice].hw_channel].pitch - 0x2000) / 169; + + while (fnote < 0) { + divFact *= 2; + fnote += 12 * 4; + } + + while (fnote >= 12 * 4) { + mulFact *= 2; + fnote -= 12 * 4; + } + + double freq = _freqTable[fnote] * instrument->baseFreq * mulFact / divFact; + + // Handle SCI1-style transposing here + if (instrument->transpose && _isSci1) + freq = freq + ((_freqTable[4] - 1.0) * freq * (double)instrument->transpose / (double)16); + + _voices[voice].rate = doubleToFrac(freq / _frequency); +} + void MidiDriver_Amiga::startNote(int ch, int note, int velocity) { - Instrument *instrument; int channel; if (_channels[ch].instrument < 0 || _channels[ch].instrument > 255) { @@ -331,7 +406,7 @@ void MidiDriver_Amiga::startNote(int ch, int note, int velocity) { return; } - instrument = _bank.instruments[_channels[ch].instrument]; + InstrumentSample *instrument = findInstrument(_channels[ch].instrument, note); if (!instrument) { warning("[sfx:seq:amiga] instrument %i does not exist", _channels[ch].instrument); @@ -349,19 +424,6 @@ void MidiDriver_Amiga::startNote(int ch, int note, int velocity) { stopChannel(ch); - if (instrument->mode & kModePitch) { - int fnote = note + instrument->transpose; - - if (fnote < 0 || fnote > 127) { - warning("[sfx:seq:amiga] illegal note %i\n", fnote); - return; - } - - /* Compute rate for note */ - _voices[channel].rate = doubleToFrac(freq_table[fnote] / (double) _frequency); - } else - _voices[channel].rate = doubleToFrac(kBaseFreq / (double) _frequency); - _voices[channel].instrument = _channels[ch].instrument; _voices[channel].note = note; _voices[channel].note_velocity = velocity; @@ -377,30 +439,34 @@ void MidiDriver_Amiga::startNote(int ch, int note, int velocity) { _voices[channel].hw_channel = ch; _voices[channel].decay = 0; _voices[channel].looping = 0; + setOutputFrac(channel); } -MidiDriver_Amiga::Instrument *MidiDriver_Amiga::readInstrument(Common::File &file, int *id) { - Instrument *instrument; +MidiDriver_Amiga::InstrumentSample *MidiDriver_Amiga::readInstrumentSCI0(Common::SeekableReadStream &file, int *id) { byte header[61]; - int size; - int seg_size[3]; - int loop_offset; - int i; if (file.read(header, 61) < 61) { warning("[sfx:seq:amiga] failed to read instrument header"); return NULL; } - instrument = new Instrument; - + int seg_size[3]; seg_size[0] = READ_BE_UINT16(header + 35) * 2; seg_size[1] = READ_BE_UINT16(header + 41) * 2; seg_size[2] = READ_BE_UINT16(header + 47) * 2; + InstrumentSample *instrument = new InstrumentSample; + + instrument->startNote = 0; + instrument->endNote = 127; + instrument->isUnsigned = false; + instrument->baseFreq = kBaseFreq; + instrument->baseNote = 101; + instrument->fixedNote = 101; + instrument->mode = header[33]; instrument->transpose = (int8) header[34]; - for (i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { int length = (int8) header[49 + i]; if (length == 0 && i > 0) @@ -413,13 +479,14 @@ MidiDriver_Amiga::Instrument *MidiDriver_Amiga::readInstrument(Common::File &fil /* Final target must be 0 */ instrument->envelope[3].target = 0; - loop_offset = READ_BE_UINT32(header + 37) & ~1; - size = seg_size[0] + seg_size[1] + seg_size[2]; + int loop_offset = READ_BE_UINT32(header + 37) & ~1; + int size = seg_size[0] + seg_size[1] + seg_size[2]; *id = READ_BE_UINT16(header); strncpy(instrument->name, (char *) header + 2, 29); instrument->name[29] = 0; + #ifdef DEBUG printf("[sfx:seq:amiga] Reading instrument %i: \"%s\" (%i bytes)\n", *id, instrument->name, size); @@ -429,6 +496,7 @@ MidiDriver_Amiga::Instrument *MidiDriver_Amiga::readInstrument(Common::File &fil printf(" Segment sizes: %i %i %i\n", seg_size[0], seg_size[1], seg_size[2]); printf(" Segment offsets: 0 %i %i\n", loop_offset, read_int32(header + 43)); #endif + instrument->samples = (int8 *) malloc(size + 1); if (file.read(instrument->samples, size) < (unsigned int)size) { warning("[sfx:seq:amiga] failed to read instrument samples"); @@ -437,6 +505,9 @@ MidiDriver_Amiga::Instrument *MidiDriver_Amiga::readInstrument(Common::File &fil return NULL; } + if (instrument->mode & kModePitch) + instrument->fixedNote = -1; + if (instrument->mode & kModeLoop) { if (loop_offset + seg_size[1] > size) { #ifdef DEBUG @@ -463,6 +534,7 @@ MidiDriver_Amiga::Instrument *MidiDriver_Amiga::readInstrument(Common::File &fil instrument->loop[instrument->loop_size] = instrument->loop[0]; } else { instrument->loop = NULL; + instrument->loop_size = 0; instrument->size = size; instrument->samples[instrument->size] = 0; } @@ -483,27 +555,16 @@ uint32 MidiDriver_Amiga::property(int prop, uint32 param) { } int MidiDriver_Amiga::open() { + _isSci1 = false; + + for (int i = 0; i < 48; i++) + _freqTable[i] = pow(2, i / (double)48); + _frequency = _mixer->getOutputRate(); _envDecay.length = _frequency / (32 * 64); _envDecay.delta = 1; _envDecay.target = 0; - Common::File file; - byte header[40]; - - if (!file.open("bank.001")) { - warning("[sfx:seq:amiga] file bank.001 not found"); - return Common::kUnknownError; - } - - if (file.read(header, 40) < 40) { - warning("[sfx:seq:amiga] failed to read header of file bank.001"); - return Common::kUnknownError; - } - - for (uint i = 0; i < 256; i++) - _bank.instruments[i] = NULL; - for (uint i = 0; i < kChannels; i++) { _voices[i].note = -1; _voices[i].hw_channel = 0; @@ -513,32 +574,46 @@ int MidiDriver_Amiga::open() { _channels[i].instrument = -1; _channels[i].volume = 127; _channels[i].pan = (i % 4 == 0 || i % 4 == 3 ? kPanLeft : kPanRight); + _channels[i].pitch = 0x2000; } - _bank.size = READ_BE_UINT16(header + 38); - strncpy(_bank.name, (char *) header + 8, 29); - _bank.name[29] = 0; -#ifdef DEBUG - printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); -#endif - - for (uint i = 0; i < _bank.size; i++) { - int id; - Instrument *instrument = readInstrument(file, &id); + Common::File file; - if (!instrument) { - warning("[sfx:seq:amiga] failed to read bank.001"); + if (file.open("bank.001")) { + if (!loadInstrumentsSCI0(file)) { + file.close(); return Common::kUnknownError; } + file.close(); + } else { + ResourceManager *resMan = g_sci->getResMan(); - if (id < 0 || id > 255) { - warning("[sfx:seq:amiga] Error: instrument ID out of bounds"); + Resource *resource = resMan->findResource(ResourceId(kResourceTypePatch, 7), false); + if (!resource) + resource = resMan->findResource(ResourceId(kResourceTypePatch, 9), false); + + // If we have a patch by this point, it's SCI1 + if (resource) + _isSci1 = true; + + // Check for the SCI0 Mac patch + if (!resource) + resource = resMan->findResource(ResourceId(kResourceTypePatch, 200), false); + + if (!resource) { + warning("Could not open patch for Amiga sound driver"); return Common::kUnknownError; } - _bank.instruments[id] = instrument; - } + Common::MemoryReadStream stream(resource->data, resource->size); + if (_isSci1) { + if (!loadInstrumentsSCI1(stream)) + return Common::kUnknownError; + } else if (!loadInstrumentsSCI0Mac(stream)) + return Common::kUnknownError; + } + MidiDriver_Emulated::open(); _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, _mixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); @@ -550,11 +625,13 @@ void MidiDriver_Amiga::close() { _mixer->stopHandle(_mixerSoundHandle); for (uint i = 0; i < _bank.size; i++) { - if (_bank.instruments[i]) { - if (_bank.instruments[i]->loop) - free(_bank.instruments[i]->loop); - free(_bank.instruments[i]->samples); - delete _bank.instruments[i]; + for (uint32 j = 0; j < _bank.instruments[i].size(); j++) { + if (_bank.instruments[i][j]) { + if (_bank.instruments[i][j]->loop) + free(_bank.instruments[i][j]->loop); + free(_bank.instruments[i][j]->samples); + delete _bank.instruments[i][j]; + } } } } @@ -603,6 +680,9 @@ void MidiDriver_Amiga::send(uint32 b) { case 0xc0: changeInstrument(channel, op1); break; + case 0xe0: + pitchWheel(channel, (op2 << 7) | op1); + break; default: warning("[sfx:seq:amiga] unknown event %02x", command); } @@ -651,6 +731,239 @@ void MidiDriver_Amiga::generateSamples(int16 *data, int len) { free(buffers); } +bool MidiDriver_Amiga::loadInstrumentsSCI0(Common::File &file) { + _isSci1 = false; + + byte header[40]; + + if (file.read(header, 40) < 40) { + warning("[sfx:seq:amiga] failed to read header of file bank.001"); + return false; + } + + _bank.size = READ_BE_UINT16(header + 38); + strncpy(_bank.name, (char *) header + 8, 29); + _bank.name[29] = 0; +#ifdef DEBUG + printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); +#endif + + for (uint i = 0; i < _bank.size; i++) { + int id; + InstrumentSample *instrument = readInstrumentSCI0(file, &id); + + if (!instrument) { + warning("[sfx:seq:amiga] failed to read bank.001"); + return false; + } + + if (id < 0 || id > 255) { + warning("[sfx:seq:amiga] Error: instrument ID out of bounds"); + return false; + } + + if ((uint)id >= _bank.instruments.size()) + _bank.instruments.resize(id + 1); + + _bank.instruments[id].push_back(instrument); + memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); + } + + return true; +} + +bool MidiDriver_Amiga::loadInstrumentsSCI0Mac(Common::SeekableReadStream &file) { + byte header[40]; + + if (file.read(header, 40) < 40) { + warning("[sfx:seq:amiga] failed to read header of file patch.200"); + return false; + } + + _bank.size = 128; + strncpy(_bank.name, (char *) header + 8, 29); + _bank.name[29] = 0; +#ifdef DEBUG + printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); +#endif + + Common::Array instrumentOffsets; + instrumentOffsets.resize(_bank.size); + _bank.instruments.resize(_bank.size); + + for (uint32 i = 0; i < _bank.size; i++) + instrumentOffsets[i] = file.readUint32BE(); + + for (uint i = 0; i < _bank.size; i++) { + // 0 signifies it doesn't exist + if (instrumentOffsets[i] == 0) + continue; + + file.seek(instrumentOffsets[i]); + + uint16 id = file.readUint16BE(); + if (id != i) + error("Instrument number mismatch"); + + InstrumentSample *instrument = new InstrumentSample; + + instrument->startNote = 0; + instrument->endNote = 127; + instrument->isUnsigned = true; + instrument->baseFreq = kBaseFreq; + instrument->baseNote = 101; + instrument->fixedNote = 101; + instrument->mode = file.readUint16BE(); + + // Read in the offsets + int32 seg_size[3]; + seg_size[0] = file.readUint32BE(); + seg_size[1] = file.readUint32BE(); + seg_size[2] = file.readUint32BE(); + + instrument->transpose = file.readUint16BE(); + + for (byte j = 0; j < 4; j++) { + int length = (int8)file.readByte(); + + if (length == 0 && j > 0) + length = 256; + + instrument->envelope[j].length = length * _frequency / 60; + instrument->envelope[j].delta = (int8)file.readByte(); + instrument->envelope[j].target = file.readByte(); + } + + // Final target must be 0 + instrument->envelope[3].target = 0; + + file.read(instrument->name, 30); + + if (instrument->mode & kModePitch) + instrument->fixedNote = -1; + + uint32 size = seg_size[2]; + uint32 loop_offset = seg_size[0]; + + instrument->samples = (int8 *)malloc(size + 1); + uint32 startPos = file.pos(); + if (file.read(instrument->samples, size) < size) { + warning("[sfx:seq:amiga] failed to read instrument sample"); + free(instrument->samples); + delete instrument; + continue; + } + + if (instrument->mode & kModeLoop) { + instrument->size = seg_size[0]; + instrument->loop_size = seg_size[1] - seg_size[0]; + + instrument->loop = (int8*)malloc(instrument->loop_size + 1); + memcpy(instrument->loop, instrument->samples + loop_offset, instrument->loop_size); + + instrument->samples[instrument->size] = instrument->loop[0]; + instrument->loop[instrument->loop_size] = instrument->loop[0]; + } else { + instrument->loop = NULL; + instrument->loop_size = 0; + instrument->size = size; + instrument->samples[instrument->size] = (int8)0x80; + } + + _bank.instruments[id].push_back(instrument); + memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); + } + + return true; +} + +bool MidiDriver_Amiga::loadInstrumentsSCI1(Common::SeekableReadStream &file) { + _bank.size = 128; + + Common::Array instrumentOffsets; + instrumentOffsets.resize(_bank.size); + _bank.instruments.resize(_bank.size); + + for (uint32 i = 0; i < _bank.size; i++) + instrumentOffsets[i] = file.readUint32BE(); + + for (uint32 i = 0; i < _bank.size; i++) { + // 0 signifies it doesn't exist + if (instrumentOffsets[i] == 0) + continue; + + file.seek(instrumentOffsets[i]); + + // Read in the instrument name + file.read(_bank.instruments[i].name, 10); // last two bytes are always 0 + + for (uint32 j = 0; ; j++) { + InstrumentSample *sample = new InstrumentSample; + memset(sample, 0, sizeof(InstrumentSample)); + + sample->startNote = file.readSint16BE(); + + // startNote being -1 signifies we're done with this instrument + if (sample->startNote == -1) { + delete sample; + break; + } + + sample->endNote = file.readSint16BE(); + uint32 samplePtr = file.readUint32BE(); + sample->transpose = file.readSint16BE(); + for (int env = 0; env < 3; env++) { + sample->envelope[env].length = file.readByte() * _frequency / 60; + sample->envelope[env].delta = (env == 0 ? 10 : -10); + sample->envelope[env].target = file.readByte(); + } + + sample->envelope[3].length = 0; + sample->fixedNote = file.readSint16BE(); + int16 loop = file.readSint16BE(); + uint32 nextSamplePos = file.pos(); + + file.seek(samplePtr); + file.read(sample->name, 8); + + sample->isUnsigned = file.readUint16BE() == 0; + uint16 phase1Offset = file.readUint16BE(); + uint16 phase1End = file.readUint16BE(); + uint16 phase2Offset = file.readUint16BE(); + uint16 phase2End = file.readUint16BE(); + sample->baseNote = file.readUint16BE(); + uint32 periodTableOffset = file.readUint32BE(); + uint32 sampleDataPos = file.pos(); + + sample->size = phase1End - phase1Offset + 1; + sample->loop_size = phase2End - phase2Offset + 1; + + sample->samples = (int8 *)malloc(sample->size + 1); + file.seek(phase1Offset + sampleDataPos); + file.read(sample->samples, sample->size); + sample->samples[sample->size] = (sample->isUnsigned ? (int8)0x80 : 0); + + if (loop == 0 && sample->loop_size > 1) { + sample->loop = (int8 *)malloc(sample->loop_size + 1); + file.seek(phase2Offset + sampleDataPos); + file.read(sample->loop, sample->loop_size); + sample->mode |= kModeLoop; + sample->samples[sample->size] = sample->loop[0]; + sample->loop[sample->loop_size] = sample->loop[0]; + } + + _bank.instruments[i].push_back(sample); + + file.seek(periodTableOffset + 0xe0); + sample->baseFreq = file.readUint16BE(); + + file.seek(nextSamplePos); + } + } + + return true; +} + class MidiPlayer_Amiga : public MidiPlayer { public: MidiPlayer_Amiga(SciVersion version) : MidiPlayer(version) { _driver = new MidiDriver_Amiga(g_system->getMixer()); } @@ -667,8 +980,8 @@ MidiPlayer *MidiPlayer_Amiga_create(SciVersion version) { } byte MidiPlayer_Amiga::getPlayId() { - if (_version != SCI_VERSION_0_LATE) - error("Amiga sound support not available for this SCI version"); + if (_version > SCI_VERSION_0_LATE) + return 0x06; return 0x40; } diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index f359d5de93..5178c5f7cd 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -63,22 +63,14 @@ void SciMusic::init() { // SCI sound init _dwTempo = 0; - // Default to MIDI in SCI32 games, as many don't have AdLib support. - // WORKAROUND: Default to MIDI in Amiga SCI1_EGA+ games as we don't support - // those patches yet. We also don't yet support the 7.pat file of SCI1+ Mac - // games or SCI0 Mac patches, so we default to MIDI in those games to let - // them run. + // Default to MIDI in SCI2.1+ games, as many don't have AdLib support. Common::Platform platform = g_sci->getPlatform(); - uint32 dev = MidiDriver::detectDevice( - (getSciVersion() >= SCI_VERSION_2 || platform == Common::kPlatformMacintosh || - (platform == Common::kPlatformAmiga && getSciVersion() >= SCI_VERSION_1_EGA)) - ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) - : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); + uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2_1) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); switch (MidiDriver::getMusicType(dev)) { case MT_ADLIB: // FIXME: There's no Amiga sound option, so we hook it up to AdLib - if (g_sci->getPlatform() == Common::kPlatformAmiga) + if (g_sci->getPlatform() == Common::kPlatformAmiga || platform == Common::kPlatformMacintosh) _pMidiDrv = MidiPlayer_Amiga_create(_soundVersion); else _pMidiDrv = MidiPlayer_AdLib_create(_soundVersion); -- cgit v1.2.3 From d14635d6b26972f4a0cb7d66ce25090b6157a5cc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 18:18:11 +0000 Subject: SCI: Oops, silence gcc warning. svn-id: r51002 --- engines/sci/sound/drivers/amiga.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/sound/drivers/amiga.cpp b/engines/sci/sound/drivers/amiga.cpp index f1b918ae6a..02bba3e770 100644 --- a/engines/sci/sound/drivers/amiga.cpp +++ b/engines/sci/sound/drivers/amiga.cpp @@ -846,7 +846,6 @@ bool MidiDriver_Amiga::loadInstrumentsSCI0Mac(Common::SeekableReadStream &file) uint32 loop_offset = seg_size[0]; instrument->samples = (int8 *)malloc(size + 1); - uint32 startPos = file.pos(); if (file.read(instrument->samples, size) < size) { warning("[sfx:seq:amiga] failed to read instrument sample"); free(instrument->samples); -- cgit v1.2.3 From d06603f151f1d66410aaa3f533ff7308c3b60d3a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 18:26:00 +0000 Subject: SCI: make bnot/mod/mul more verbose ...and add abitility to easily add workarounds svn-id: r51003 --- engines/sci/engine/vm.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c77e12443f..09eb720f0b 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1130,7 +1130,11 @@ void run_vm(EngineState *s, bool restoring) { case op_bnot: // 0x00 (00) // Binary not - s->r_acc = ACC_ARITHMETIC_L(0xffff ^ /*acc*/); + int16 value; + if (validate_signedInteger(s->r_acc, value)) + s->r_acc = make_reg(0, 0xffff ^ value); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, NULL_REG); break; case op_add: // 0x01 (01) @@ -1197,13 +1201,17 @@ void run_vm(EngineState *s, bool restoring) { break; case op_mul: // 0x03 (03) - s->r_acc = ACC_ARITHMETIC_L(((int16)POP()) * (int16)/*acc*/); + r_temp = POP32(); + int16 value1, value2; + if (validate_signedInteger(s->r_acc, value1) && validate_signedInteger(r_temp, value2)) + s->r_acc = make_reg(0, value1 * value2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); break; case op_div: { // 0x04 (04) r_temp = POP32(); - int16 divisor; - int16 dividend; + int16 divisor, dividend; if (validate_signedInteger(s->r_acc, divisor) && validate_signedInteger(r_temp, dividend)) s->r_acc = make_reg(0, (divisor != 0 ? dividend / divisor : 0)); else @@ -1211,8 +1219,12 @@ void run_vm(EngineState *s, bool restoring) { break; } case op_mod: { // 0x05 (05) - int16 modulo = signed_validate_arithmetic(s->r_acc); - s->r_acc = make_reg(0, (modulo != 0 ? ((int16)POP()) % modulo : 0)); + r_temp = POP32(); + int16 modulo, value; + if (validate_signedInteger(s->r_acc, modulo) && validate_signedInteger(r_temp, value)) + s->r_acc = make_reg(0, (modulo != 0 ? value % modulo : 0)); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); break; } case op_shr: // 0x06 (06) -- cgit v1.2.3 From 2127da538de70605f046ba8392ed6b5c6a71ecac Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 18:38:49 +0000 Subject: SCI: Add Mac signature for kTextSize which can have an extra integer parameter. svn-id: r51004 --- engines/sci/engine/kernel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 1b4eca1edd..66b36b29f6 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -680,6 +680,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextSize), SIG_SCIALL, SIGFOR_MAC, "r[r0]i(i)(r0)(i)", NULL, NULL }, { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, -- cgit v1.2.3 From b23dd848ed70cf60856d76942b2a58f385be87ea Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 18:57:28 +0000 Subject: SCI: make the left-over opcodes more verbose ...and add ability to easily add workarounds remove ACC_ARITHMETIC_L and POP() svn-id: r51005 --- engines/sci/engine/vm.cpp | 67 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 09eb720f0b..8c540b34b1 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -489,12 +489,9 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i #define WRITE_VAR(type, index, value) validate_write_var(s->variables[type], s->stack_base, type, s->variablesMax[type], index, value, s->_segMan, g_sci->getKernel()) #define WRITE_VAR16(type, index, value) WRITE_VAR(type, index, make_reg(0, value)); -#define ACC_ARITHMETIC_L(op) make_reg(0, (op validate_arithmetic(s->r_acc))) - // Operating on the stack // 16 bit: #define PUSH(v) PUSH32(make_reg(0, v)) -#define POP() (validate_arithmetic(POP32())) // 32 bit: #define PUSH32(a) (*(validate_stack_addr(s, (s->xs->sp)++)) = (a)) #define POP32() (*(validate_stack_addr(s, --(s->xs->sp)))) @@ -1200,7 +1197,7 @@ void run_vm(EngineState *s, bool restoring) { } break; - case op_mul: // 0x03 (03) + case op_mul: { // 0x03 (03) r_temp = POP32(); int16 value1, value2; if (validate_signedInteger(s->r_acc, value1) && validate_signedInteger(r_temp, value2)) @@ -1208,6 +1205,7 @@ void run_vm(EngineState *s, bool restoring) { else s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); break; + } case op_div: { // 0x04 (04) r_temp = POP32(); @@ -1218,6 +1216,7 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeDivWorkarounds, s->r_acc, r_temp); break; } + case op_mod: { // 0x05 (05) r_temp = POP32(); int16 modulo, value; @@ -1227,31 +1226,67 @@ void run_vm(EngineState *s, bool restoring) { s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); break; } - case op_shr: // 0x06 (06) + + case op_shr: { // 0x06 (06) // Shift right logical - s->r_acc = ACC_ARITHMETIC_L(((uint16)POP()) >> /*acc*/); + r_temp = POP32(); + uint16 value, shiftCount; + if (validate_unsignedInteger(r_temp, value) && validate_unsignedInteger(s->r_acc, shiftCount)) + s->r_acc = make_reg(0, value >> shiftCount); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); break; + } - case op_shl: // 0x07 (07) + case op_shl: { // 0x07 (07) // Shift left logical - s->r_acc = ACC_ARITHMETIC_L(((uint16)POP()) << /*acc*/); + r_temp = POP32(); + uint16 value, shiftCount; + if (validate_unsignedInteger(r_temp, value) && validate_unsignedInteger(s->r_acc, shiftCount)) + s->r_acc = make_reg(0, value << shiftCount); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); break; + } - case op_xor: // 0x08 (08) - s->r_acc = ACC_ARITHMETIC_L(POP() ^ /*acc*/); + case op_xor: { // 0x08 (08) + r_temp = POP32(); + uint16 value1, value2; + if (validate_unsignedInteger(r_temp, value1) && validate_unsignedInteger(s->r_acc, value2)) + s->r_acc = make_reg(0, value1 ^ value2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); break; + } - case op_and: // 0x09 (09) - s->r_acc = ACC_ARITHMETIC_L(POP() & /*acc*/); + case op_and: { // 0x09 (09) + r_temp = POP32(); + uint16 value1, value2; + if (validate_unsignedInteger(r_temp, value1) && validate_unsignedInteger(s->r_acc, value2)) + s->r_acc = make_reg(0, value1 & value2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); break; + } - case op_or: // 0x0a (10) - s->r_acc = ACC_ARITHMETIC_L(POP() | /*acc*/); + case op_or: { // 0x0a (10) + r_temp = POP32(); + uint16 value1, value2; + if (validate_unsignedInteger(r_temp, value1) && validate_unsignedInteger(s->r_acc, value2)) + s->r_acc = make_reg(0, value1 | value2); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); break; + } - case op_neg: // 0x0b (11) - s->r_acc = ACC_ARITHMETIC_L(-/*acc*/); + case op_neg: { // 0x0b (11) + int16 value; + if (validate_signedInteger(s->r_acc, value)) + s->r_acc = make_reg(0, -value); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, NULL_REG); break; + } case op_not: // 0x0c (12) s->r_acc = make_reg(0, !(s->r_acc.offset || s->r_acc.segment)); -- cgit v1.2.3 From 0e9de72f626489a3186ee4d8c7c8c1028740445e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 18 Jul 2010 19:01:35 +0000 Subject: SCI: Rename the Amiga music drivers to AmigaMac to reflect its current purpose. svn-id: r51006 --- engines/sci/module.mk | 2 +- engines/sci/sound/drivers/amiga.cpp | 988 --------------------------------- engines/sci/sound/drivers/amigamac.cpp | 988 +++++++++++++++++++++++++++++++++ engines/sci/sound/drivers/mididriver.h | 2 +- engines/sci/sound/music.cpp | 2 +- 5 files changed, 991 insertions(+), 991 deletions(-) delete mode 100644 engines/sci/sound/drivers/amiga.cpp create mode 100644 engines/sci/sound/drivers/amigamac.cpp diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 85988b8f1b..6ec24f4466 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -63,7 +63,7 @@ MODULE_OBJS := \ sound/music.o \ sound/soundcmd.o \ sound/drivers/adlib.o \ - sound/drivers/amiga.o \ + sound/drivers/amigamac.o \ sound/drivers/fb01.o \ sound/drivers/midi.o \ sound/drivers/pcjr.o \ diff --git a/engines/sci/sound/drivers/amiga.cpp b/engines/sci/sound/drivers/amiga.cpp deleted file mode 100644 index 02bba3e770..0000000000 --- a/engines/sci/sound/drivers/amiga.cpp +++ /dev/null @@ -1,988 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "sound/softsynth/emumidi.h" -#include "sci/sound/drivers/mididriver.h" -#include "sci/resource.h" - -#include "common/file.h" -#include "common/frac.h" -#include "common/util.h" - -namespace Sci { - -/* #define DEBUG */ - -class MidiDriver_Amiga : public MidiDriver_Emulated { -public: - enum { - kVoices = 4 - }; - - MidiDriver_Amiga(Audio::Mixer *mixer) : MidiDriver_Emulated(mixer), _playSwitch(true), _masterVolume(15) { } - virtual ~MidiDriver_Amiga() { } - - // MidiDriver - int open(); - void close(); - void send(uint32 b); - MidiChannel *allocateChannel() { return NULL; } - MidiChannel *getPercussionChannel() { return NULL; } - - // AudioStream - bool isStereo() const { return true; } - int getRate() const { return _mixer->getOutputRate(); } - - // MidiDriver_Emulated - void generateSamples(int16 *buf, int len); - - void setVolume(byte volume); - void playSwitch(bool play); - virtual uint32 property(int prop, uint32 param); - -private: - enum { - kModeLoop = 1 << 0, // Instrument looping flag - kModePitch = 1 << 1 // Instrument pitch changes flag - }; - - enum { - kChannels = 10, - kBaseFreq = 20000, // Samplerate of the instrument bank - kPanLeft = 91, - kPanRight = 164 - }; - - struct Channel { - int instrument; - int volume; - int pan; - uint16 pitch; - }; - - struct Envelope { - int length; // Phase period length in samples - int delta; // Velocity delta per period - int target; // Target velocity - }; - - struct Voice { - int instrument; - int note; - int note_velocity; - int velocity; - int envelope; - int envelope_samples; // Number of samples till next envelope event - int decay; - int looping; - int hw_channel; - frac_t offset; - frac_t rate; - }; - - struct InstrumentSample { - char name[30]; - int mode; - int size; // Size of non-looping part in bytes - int loop_size; // Starting offset and size of loop in bytes - int transpose; // Transpose value in semitones - Envelope envelope[4]; // Envelope - int8 *samples; - int8 *loop; - int16 startNote; - int16 endNote; - bool isUnsigned; - uint16 baseFreq; - uint16 baseNote; - int16 fixedNote; - }; - - class Instrument : public Common::Array { - public: - char name[30]; - }; - - struct Bank { - char name[30]; - uint size; - Common::Array instruments; - }; - - bool _isSci1; - bool _playSwitch; - int _masterVolume; - int _frequency; - Envelope _envDecay; - Bank _bank; // Instrument bank - double _freqTable[48]; - - Channel _channels[MIDI_CHANNELS]; - /* Internal channels */ - Voice _voices[kChannels]; - - void setEnvelope(Voice *channel, Envelope *envelope, int phase); - void setOutputFrac(int voice); - int interpolate(int8 *samples, frac_t offset, bool isUnsigned); - void playInstrument(int16 *dest, Voice *channel, int count); - void changeInstrument(int channel, int instrument); - void stopChannel(int ch); - void stopNote(int ch, int note); - void startNote(int ch, int note, int velocity); - InstrumentSample *findInstrument(int instrument, int note); - void pitchWheel(int ch, uint16 pitch); - - bool loadInstrumentsSCI0(Common::File &file); - bool loadInstrumentsSCI0Mac(Common::SeekableReadStream &file); - InstrumentSample *readInstrumentSCI0(Common::SeekableReadStream &file, int *id); - bool loadInstrumentsSCI1(Common::SeekableReadStream &file); -}; - -void MidiDriver_Amiga::setEnvelope(Voice *channel, Envelope *envelope, int phase) { - channel->envelope = phase; - channel->envelope_samples = envelope[phase].length; - - if (phase == 0) - channel->velocity = channel->note_velocity / 2; - else - channel->velocity = envelope[phase - 1].target; -} - -int MidiDriver_Amiga::interpolate(int8 *samples, frac_t offset, bool isUnsigned) { - int x = fracToInt(offset); - - if (isUnsigned) { - int s1 = (byte)samples[x] - 0x80; - int s2 = (byte)samples[x + 1] - 0x80; - int diff = (s2 - s1) << 8; - return (s1 << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); - } - - int diff = (samples[x + 1] - samples[x]) << 8; - return (samples[x] << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); -} - -void MidiDriver_Amiga::playInstrument(int16 *dest, Voice *channel, int count) { - int index = 0; - int vol = _channels[channel->hw_channel].volume; - InstrumentSample *instrument = findInstrument(channel->instrument, channel->note); - - while (1) { - /* Available source samples until end of segment */ - frac_t lin_avail; - uint32 seg_end, rem, i, amount; - int8 *samples; - - if (channel->looping && instrument->loop) { - samples = instrument->loop; - seg_end = instrument->loop_size; - } else { - samples = instrument->samples; - seg_end = instrument->size; - } - - lin_avail = intToFrac(seg_end) - channel->offset; - - rem = count - index; - - /* Amount of destination samples that we will compute this iteration */ - amount = lin_avail / channel->rate; - - if (lin_avail % channel->rate) - amount++; - - if (amount > rem) - amount = rem; - - /* Stop at next envelope event */ - if ((channel->envelope_samples != -1) && (amount > (uint32)channel->envelope_samples)) - amount = channel->envelope_samples; - - for (i = 0; i < amount; i++) { - dest[index++] = interpolate(samples, channel->offset, instrument->isUnsigned) * channel->velocity / 64 * channel->note_velocity * vol / (127 * 127); - channel->offset += channel->rate; - } - - if (channel->envelope_samples != -1) - channel->envelope_samples -= amount; - - if (channel->envelope_samples == 0) { - Envelope *envelope; - int delta, target, velocity; - - if (channel->decay) - envelope = &_envDecay; - else - envelope = &instrument->envelope[channel->envelope]; - - delta = envelope->delta; - target = envelope->target; - velocity = channel->velocity - envelope->delta; - - /* Check whether we have reached the velocity target for the current phase */ - if ((delta >= 0 && velocity <= target) || (delta < 0 && velocity >= target)) { - channel->velocity = target; - - /* Stop note after velocity has dropped to 0 */ - if (target == 0) { - channel->note = -1; - break; - } else - switch (channel->envelope) { - case 0: - case 2: - /* Go to next phase */ - setEnvelope(channel, instrument->envelope, channel->envelope + 1); - break; - case 1: - case 3: - /* Stop envelope */ - channel->envelope_samples = -1; - break; - } - } else { - /* We haven't reached the target yet */ - channel->envelope_samples = envelope->length; - channel->velocity = velocity; - } - } - - if (index == count) - break; - - if ((uint32)fracToInt(channel->offset) >= seg_end) { - if (instrument->mode & kModeLoop) { - /* Loop the samples */ - channel->offset -= intToFrac(seg_end); - channel->looping = 1; - } else { - /* All samples have been played */ - channel->note = -1; - break; - } - } - } -} - -void MidiDriver_Amiga::changeInstrument(int channel, int instrument) { -#ifdef DEBUG - if (_bank.instruments[instrument][0]) - printf("[sfx:seq:amiga] Setting channel %i to \"%s\" (%i)\n", channel, _bank.instruments[instrument]->name, instrument); - else - warning("[sfx:seq:amiga] instrument %i does not exist (channel %i)", instrument, channel); -#endif - _channels[channel].instrument = instrument; -} - -void MidiDriver_Amiga::stopChannel(int ch) { - int i; - - /* Start decay phase for note on this hw channel, if any */ - for (i = 0; i < kChannels; i++) - if (_voices[i].note != -1 && _voices[i].hw_channel == ch && !_voices[i].decay) { - /* Trigger fast decay envelope */ - _voices[i].decay = 1; - _voices[i].envelope_samples = _envDecay.length; - break; - } -} - -void MidiDriver_Amiga::pitchWheel(int ch, uint16 pitch) { - _channels[ch].pitch = pitch; - - for (int i = 0; i < kChannels; i++) - if (_voices[i].note != -1 && _voices[i].hw_channel == ch) - setOutputFrac(i); -} - -void MidiDriver_Amiga::stopNote(int ch, int note) { - int channel; - - for (channel = 0; channel < kChannels; channel++) - if (_voices[channel].note == note && _voices[channel].hw_channel == ch && !_voices[channel].decay) - break; - - if (channel == kChannels) { -#ifdef DEBUG - warning("[sfx:seq:amiga] cannot stop note %i on channel %i", note, ch); -#endif - return; - } - - InstrumentSample *instrument = findInstrument(_voices[channel].instrument, note); - - // FIXME: SCI1 envelope support is not perfect yet - - /* Start the envelope phases for note-off if looping is on and envelope is enabled */ - if ((instrument->mode & kModeLoop) && (instrument->envelope[0].length != 0)) - setEnvelope(&_voices[channel], instrument->envelope, 2); -} - -MidiDriver_Amiga::InstrumentSample *MidiDriver_Amiga::findInstrument(int instrument, int note) { - if ((uint)instrument >= _bank.instruments.size()) - return 0; - - for (uint32 i = 0; i < _bank.instruments[instrument].size(); i++) { - InstrumentSample *sample = _bank.instruments[instrument][i]; - if (note >= sample->startNote && note <= sample->endNote) - return sample; - } - - return 0; -} - -void MidiDriver_Amiga::setOutputFrac(int voice) { - InstrumentSample *instrument = findInstrument(_voices[voice].instrument, _voices[voice].note); - - int fnote = 0; - - if (instrument->fixedNote == -1) { - fnote = _voices[voice].note; - - // Handle SCI0-style transposing here - if (!_isSci1) - fnote += instrument->transpose; - - if (fnote < 0 || fnote > 127) { - warning("[sfx:seq:amiga] illegal note %i", fnote); - return; - } - } else - fnote = instrument->fixedNote; - - // Compute rate for note - int mulFact = 1, divFact = 1; - - fnote -= instrument->baseNote; - fnote *= 4; - // FIXME: check how SSCI maps this - fnote += (_channels[_voices[voice].hw_channel].pitch - 0x2000) / 169; - - while (fnote < 0) { - divFact *= 2; - fnote += 12 * 4; - } - - while (fnote >= 12 * 4) { - mulFact *= 2; - fnote -= 12 * 4; - } - - double freq = _freqTable[fnote] * instrument->baseFreq * mulFact / divFact; - - // Handle SCI1-style transposing here - if (instrument->transpose && _isSci1) - freq = freq + ((_freqTable[4] - 1.0) * freq * (double)instrument->transpose / (double)16); - - _voices[voice].rate = doubleToFrac(freq / _frequency); -} - -void MidiDriver_Amiga::startNote(int ch, int note, int velocity) { - int channel; - - if (_channels[ch].instrument < 0 || _channels[ch].instrument > 255) { - warning("[sfx:seq:amiga] invalid instrument %i on channel %i", _channels[ch].instrument, ch); - return; - } - - InstrumentSample *instrument = findInstrument(_channels[ch].instrument, note); - - if (!instrument) { - warning("[sfx:seq:amiga] instrument %i does not exist", _channels[ch].instrument); - return; - } - - for (channel = 0; channel < kChannels; channel++) - if (_voices[channel].note == -1) - break; - - if (channel == kChannels) { - warning("[sfx:seq:amiga] could not find a free channel"); - return; - } - - stopChannel(ch); - - _voices[channel].instrument = _channels[ch].instrument; - _voices[channel].note = note; - _voices[channel].note_velocity = velocity; - - if ((instrument->mode & kModeLoop) && (instrument->envelope[0].length != 0)) - setEnvelope(&_voices[channel], instrument->envelope, 0); - else { - _voices[channel].velocity = 64; - _voices[channel].envelope_samples = -1; - } - - _voices[channel].offset = 0; - _voices[channel].hw_channel = ch; - _voices[channel].decay = 0; - _voices[channel].looping = 0; - setOutputFrac(channel); -} - -MidiDriver_Amiga::InstrumentSample *MidiDriver_Amiga::readInstrumentSCI0(Common::SeekableReadStream &file, int *id) { - byte header[61]; - - if (file.read(header, 61) < 61) { - warning("[sfx:seq:amiga] failed to read instrument header"); - return NULL; - } - - int seg_size[3]; - seg_size[0] = READ_BE_UINT16(header + 35) * 2; - seg_size[1] = READ_BE_UINT16(header + 41) * 2; - seg_size[2] = READ_BE_UINT16(header + 47) * 2; - - InstrumentSample *instrument = new InstrumentSample; - - instrument->startNote = 0; - instrument->endNote = 127; - instrument->isUnsigned = false; - instrument->baseFreq = kBaseFreq; - instrument->baseNote = 101; - instrument->fixedNote = 101; - - instrument->mode = header[33]; - instrument->transpose = (int8) header[34]; - for (int i = 0; i < 4; i++) { - int length = (int8) header[49 + i]; - - if (length == 0 && i > 0) - length = 256; - - instrument->envelope[i].length = length * _frequency / 60; - instrument->envelope[i].delta = (int8)header[53 + i]; - instrument->envelope[i].target = header[57 + i]; - } - /* Final target must be 0 */ - instrument->envelope[3].target = 0; - - int loop_offset = READ_BE_UINT32(header + 37) & ~1; - int size = seg_size[0] + seg_size[1] + seg_size[2]; - - *id = READ_BE_UINT16(header); - - strncpy(instrument->name, (char *) header + 2, 29); - instrument->name[29] = 0; - -#ifdef DEBUG - printf("[sfx:seq:amiga] Reading instrument %i: \"%s\" (%i bytes)\n", - *id, instrument->name, size); - printf(" Mode: %02x\n", instrument->mode); - printf(" Looping: %s\n", instrument->mode & kModeLoop ? "on" : "off"); - printf(" Pitch changes: %s\n", instrument->mode & kModePitch ? "on" : "off"); - printf(" Segment sizes: %i %i %i\n", seg_size[0], seg_size[1], seg_size[2]); - printf(" Segment offsets: 0 %i %i\n", loop_offset, read_int32(header + 43)); -#endif - - instrument->samples = (int8 *) malloc(size + 1); - if (file.read(instrument->samples, size) < (unsigned int)size) { - warning("[sfx:seq:amiga] failed to read instrument samples"); - free(instrument->samples); - delete instrument; - return NULL; - } - - if (instrument->mode & kModePitch) - instrument->fixedNote = -1; - - if (instrument->mode & kModeLoop) { - if (loop_offset + seg_size[1] > size) { -#ifdef DEBUG - warning("[sfx:seq:amiga] looping samples extend %i bytes past end of sample block", - loop_offset + seg_size[1] - size); -#endif - seg_size[1] = size - loop_offset; - } - - if (seg_size[1] < 0) { - warning("[sfx:seq:amiga] invalid looping point"); - free(instrument->samples); - delete instrument; - return NULL; - } - - instrument->size = seg_size[0]; - instrument->loop_size = seg_size[1]; - - instrument->loop = (int8*)malloc(instrument->loop_size + 1); - memcpy(instrument->loop, instrument->samples + loop_offset, instrument->loop_size); - - instrument->samples[instrument->size] = instrument->loop[0]; - instrument->loop[instrument->loop_size] = instrument->loop[0]; - } else { - instrument->loop = NULL; - instrument->loop_size = 0; - instrument->size = size; - instrument->samples[instrument->size] = 0; - } - - return instrument; -} - -uint32 MidiDriver_Amiga::property(int prop, uint32 param) { - switch(prop) { - case MIDI_PROP_MASTER_VOLUME: - if (param != 0xffff) - _masterVolume = param; - return _masterVolume; - default: - break; - } - return 0; -} - -int MidiDriver_Amiga::open() { - _isSci1 = false; - - for (int i = 0; i < 48; i++) - _freqTable[i] = pow(2, i / (double)48); - - _frequency = _mixer->getOutputRate(); - _envDecay.length = _frequency / (32 * 64); - _envDecay.delta = 1; - _envDecay.target = 0; - - for (uint i = 0; i < kChannels; i++) { - _voices[i].note = -1; - _voices[i].hw_channel = 0; - } - - for (uint i = 0; i < MIDI_CHANNELS; i++) { - _channels[i].instrument = -1; - _channels[i].volume = 127; - _channels[i].pan = (i % 4 == 0 || i % 4 == 3 ? kPanLeft : kPanRight); - _channels[i].pitch = 0x2000; - } - - Common::File file; - - if (file.open("bank.001")) { - if (!loadInstrumentsSCI0(file)) { - file.close(); - return Common::kUnknownError; - } - file.close(); - } else { - ResourceManager *resMan = g_sci->getResMan(); - - Resource *resource = resMan->findResource(ResourceId(kResourceTypePatch, 7), false); - if (!resource) - resource = resMan->findResource(ResourceId(kResourceTypePatch, 9), false); - - // If we have a patch by this point, it's SCI1 - if (resource) - _isSci1 = true; - - // Check for the SCI0 Mac patch - if (!resource) - resource = resMan->findResource(ResourceId(kResourceTypePatch, 200), false); - - if (!resource) { - warning("Could not open patch for Amiga sound driver"); - return Common::kUnknownError; - } - - Common::MemoryReadStream stream(resource->data, resource->size); - - if (_isSci1) { - if (!loadInstrumentsSCI1(stream)) - return Common::kUnknownError; - } else if (!loadInstrumentsSCI0Mac(stream)) - return Common::kUnknownError; - } - - MidiDriver_Emulated::open(); - - _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, _mixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); - - return Common::kNoError; -} - -void MidiDriver_Amiga::close() { - _mixer->stopHandle(_mixerSoundHandle); - - for (uint i = 0; i < _bank.size; i++) { - for (uint32 j = 0; j < _bank.instruments[i].size(); j++) { - if (_bank.instruments[i][j]) { - if (_bank.instruments[i][j]->loop) - free(_bank.instruments[i][j]->loop); - free(_bank.instruments[i][j]->samples); - delete _bank.instruments[i][j]; - } - } - } -} - -void MidiDriver_Amiga::playSwitch(bool play) { - _playSwitch = play; -} - -void MidiDriver_Amiga::setVolume(byte volume_) { - _masterVolume = volume_; -} - -void MidiDriver_Amiga::send(uint32 b) { - byte command = b & 0xf0; - byte channel = b & 0xf; - byte op1 = (b >> 8) & 0xff; - byte op2 = (b >> 16) & 0xff; - - switch (command) { - case 0x80: - stopNote(channel, op1); - break; - case 0x90: - if (op2 > 0) - startNote(channel, op1, op2); - else - stopNote(channel, op1); - break; - case 0xb0: - switch (op1) { - case 0x07: - _channels[channel].volume = op2; - break; - case 0x0a: -#ifdef DEBUG - warning("[sfx:seq:amiga] ignoring pan 0x%02x event for channel %i", op2, channel); -#endif - break; - case 0x7b: - stopChannel(channel); - break; - default: - warning("[sfx:seq:amiga] unknown control event 0x%02x", op1); - } - break; - case 0xc0: - changeInstrument(channel, op1); - break; - case 0xe0: - pitchWheel(channel, (op2 << 7) | op1); - break; - default: - warning("[sfx:seq:amiga] unknown event %02x", command); - } -} - -void MidiDriver_Amiga::generateSamples(int16 *data, int len) { - if (len == 0) - return; - - int16 *buffers = (int16*)malloc(len * 2 * kChannels); - - memset(buffers, 0, len * 2 * kChannels); - - /* Generate samples for all notes */ - for (int i = 0; i < kChannels; i++) - if (_voices[i].note >= 0) - playInstrument(buffers + i * len, &_voices[i], len); - - if (isStereo()) { - for (int j = 0; j < len; j++) { - int mixedl = 0, mixedr = 0; - - /* Mix and pan */ - for (int i = 0; i < kChannels; i++) { - mixedl += buffers[i * len + j] * (256 - _channels[_voices[i].hw_channel].pan); - mixedr += buffers[i * len + j] * _channels[_voices[i].hw_channel].pan; - } - - /* Adjust volume */ - data[2 * j] = mixedl * _masterVolume >> 13; - data[2 * j + 1] = mixedr * _masterVolume >> 13; - } - } else { - for (int j = 0; j < len; j++) { - int mixed = 0; - - /* Mix */ - for (int i = 0; i < kChannels; i++) - mixed += buffers[i * len + j]; - - /* Adjust volume */ - data[j] = mixed * _masterVolume >> 6; - } - } - - free(buffers); -} - -bool MidiDriver_Amiga::loadInstrumentsSCI0(Common::File &file) { - _isSci1 = false; - - byte header[40]; - - if (file.read(header, 40) < 40) { - warning("[sfx:seq:amiga] failed to read header of file bank.001"); - return false; - } - - _bank.size = READ_BE_UINT16(header + 38); - strncpy(_bank.name, (char *) header + 8, 29); - _bank.name[29] = 0; -#ifdef DEBUG - printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); -#endif - - for (uint i = 0; i < _bank.size; i++) { - int id; - InstrumentSample *instrument = readInstrumentSCI0(file, &id); - - if (!instrument) { - warning("[sfx:seq:amiga] failed to read bank.001"); - return false; - } - - if (id < 0 || id > 255) { - warning("[sfx:seq:amiga] Error: instrument ID out of bounds"); - return false; - } - - if ((uint)id >= _bank.instruments.size()) - _bank.instruments.resize(id + 1); - - _bank.instruments[id].push_back(instrument); - memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); - } - - return true; -} - -bool MidiDriver_Amiga::loadInstrumentsSCI0Mac(Common::SeekableReadStream &file) { - byte header[40]; - - if (file.read(header, 40) < 40) { - warning("[sfx:seq:amiga] failed to read header of file patch.200"); - return false; - } - - _bank.size = 128; - strncpy(_bank.name, (char *) header + 8, 29); - _bank.name[29] = 0; -#ifdef DEBUG - printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); -#endif - - Common::Array instrumentOffsets; - instrumentOffsets.resize(_bank.size); - _bank.instruments.resize(_bank.size); - - for (uint32 i = 0; i < _bank.size; i++) - instrumentOffsets[i] = file.readUint32BE(); - - for (uint i = 0; i < _bank.size; i++) { - // 0 signifies it doesn't exist - if (instrumentOffsets[i] == 0) - continue; - - file.seek(instrumentOffsets[i]); - - uint16 id = file.readUint16BE(); - if (id != i) - error("Instrument number mismatch"); - - InstrumentSample *instrument = new InstrumentSample; - - instrument->startNote = 0; - instrument->endNote = 127; - instrument->isUnsigned = true; - instrument->baseFreq = kBaseFreq; - instrument->baseNote = 101; - instrument->fixedNote = 101; - instrument->mode = file.readUint16BE(); - - // Read in the offsets - int32 seg_size[3]; - seg_size[0] = file.readUint32BE(); - seg_size[1] = file.readUint32BE(); - seg_size[2] = file.readUint32BE(); - - instrument->transpose = file.readUint16BE(); - - for (byte j = 0; j < 4; j++) { - int length = (int8)file.readByte(); - - if (length == 0 && j > 0) - length = 256; - - instrument->envelope[j].length = length * _frequency / 60; - instrument->envelope[j].delta = (int8)file.readByte(); - instrument->envelope[j].target = file.readByte(); - } - - // Final target must be 0 - instrument->envelope[3].target = 0; - - file.read(instrument->name, 30); - - if (instrument->mode & kModePitch) - instrument->fixedNote = -1; - - uint32 size = seg_size[2]; - uint32 loop_offset = seg_size[0]; - - instrument->samples = (int8 *)malloc(size + 1); - if (file.read(instrument->samples, size) < size) { - warning("[sfx:seq:amiga] failed to read instrument sample"); - free(instrument->samples); - delete instrument; - continue; - } - - if (instrument->mode & kModeLoop) { - instrument->size = seg_size[0]; - instrument->loop_size = seg_size[1] - seg_size[0]; - - instrument->loop = (int8*)malloc(instrument->loop_size + 1); - memcpy(instrument->loop, instrument->samples + loop_offset, instrument->loop_size); - - instrument->samples[instrument->size] = instrument->loop[0]; - instrument->loop[instrument->loop_size] = instrument->loop[0]; - } else { - instrument->loop = NULL; - instrument->loop_size = 0; - instrument->size = size; - instrument->samples[instrument->size] = (int8)0x80; - } - - _bank.instruments[id].push_back(instrument); - memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); - } - - return true; -} - -bool MidiDriver_Amiga::loadInstrumentsSCI1(Common::SeekableReadStream &file) { - _bank.size = 128; - - Common::Array instrumentOffsets; - instrumentOffsets.resize(_bank.size); - _bank.instruments.resize(_bank.size); - - for (uint32 i = 0; i < _bank.size; i++) - instrumentOffsets[i] = file.readUint32BE(); - - for (uint32 i = 0; i < _bank.size; i++) { - // 0 signifies it doesn't exist - if (instrumentOffsets[i] == 0) - continue; - - file.seek(instrumentOffsets[i]); - - // Read in the instrument name - file.read(_bank.instruments[i].name, 10); // last two bytes are always 0 - - for (uint32 j = 0; ; j++) { - InstrumentSample *sample = new InstrumentSample; - memset(sample, 0, sizeof(InstrumentSample)); - - sample->startNote = file.readSint16BE(); - - // startNote being -1 signifies we're done with this instrument - if (sample->startNote == -1) { - delete sample; - break; - } - - sample->endNote = file.readSint16BE(); - uint32 samplePtr = file.readUint32BE(); - sample->transpose = file.readSint16BE(); - for (int env = 0; env < 3; env++) { - sample->envelope[env].length = file.readByte() * _frequency / 60; - sample->envelope[env].delta = (env == 0 ? 10 : -10); - sample->envelope[env].target = file.readByte(); - } - - sample->envelope[3].length = 0; - sample->fixedNote = file.readSint16BE(); - int16 loop = file.readSint16BE(); - uint32 nextSamplePos = file.pos(); - - file.seek(samplePtr); - file.read(sample->name, 8); - - sample->isUnsigned = file.readUint16BE() == 0; - uint16 phase1Offset = file.readUint16BE(); - uint16 phase1End = file.readUint16BE(); - uint16 phase2Offset = file.readUint16BE(); - uint16 phase2End = file.readUint16BE(); - sample->baseNote = file.readUint16BE(); - uint32 periodTableOffset = file.readUint32BE(); - uint32 sampleDataPos = file.pos(); - - sample->size = phase1End - phase1Offset + 1; - sample->loop_size = phase2End - phase2Offset + 1; - - sample->samples = (int8 *)malloc(sample->size + 1); - file.seek(phase1Offset + sampleDataPos); - file.read(sample->samples, sample->size); - sample->samples[sample->size] = (sample->isUnsigned ? (int8)0x80 : 0); - - if (loop == 0 && sample->loop_size > 1) { - sample->loop = (int8 *)malloc(sample->loop_size + 1); - file.seek(phase2Offset + sampleDataPos); - file.read(sample->loop, sample->loop_size); - sample->mode |= kModeLoop; - sample->samples[sample->size] = sample->loop[0]; - sample->loop[sample->loop_size] = sample->loop[0]; - } - - _bank.instruments[i].push_back(sample); - - file.seek(periodTableOffset + 0xe0); - sample->baseFreq = file.readUint16BE(); - - file.seek(nextSamplePos); - } - } - - return true; -} - -class MidiPlayer_Amiga : public MidiPlayer { -public: - MidiPlayer_Amiga(SciVersion version) : MidiPlayer(version) { _driver = new MidiDriver_Amiga(g_system->getMixer()); } - byte getPlayId(); - int getPolyphony() const { return MidiDriver_Amiga::kVoices; } - bool hasRhythmChannel() const { return false; } - void setVolume(byte volume) { static_cast(_driver)->setVolume(volume); } - void playSwitch(bool play) { static_cast(_driver)->playSwitch(play); } - void loadInstrument(int idx, byte *data); -}; - -MidiPlayer *MidiPlayer_Amiga_create(SciVersion version) { - return new MidiPlayer_Amiga(version); -} - -byte MidiPlayer_Amiga::getPlayId() { - if (_version > SCI_VERSION_0_LATE) - return 0x06; - - return 0x40; -} - -} // End of namespace Sci diff --git a/engines/sci/sound/drivers/amigamac.cpp b/engines/sci/sound/drivers/amigamac.cpp new file mode 100644 index 0000000000..4fb9146b53 --- /dev/null +++ b/engines/sci/sound/drivers/amigamac.cpp @@ -0,0 +1,988 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sound/softsynth/emumidi.h" +#include "sci/sound/drivers/mididriver.h" +#include "sci/resource.h" + +#include "common/file.h" +#include "common/frac.h" +#include "common/util.h" + +namespace Sci { + +/* #define DEBUG */ + +class MidiDriver_AmigaMac : public MidiDriver_Emulated { +public: + enum { + kVoices = 4 + }; + + MidiDriver_AmigaMac(Audio::Mixer *mixer) : MidiDriver_Emulated(mixer), _playSwitch(true), _masterVolume(15) { } + virtual ~MidiDriver_AmigaMac() { } + + // MidiDriver + int open(); + void close(); + void send(uint32 b); + MidiChannel *allocateChannel() { return NULL; } + MidiChannel *getPercussionChannel() { return NULL; } + + // AudioStream + bool isStereo() const { return true; } + int getRate() const { return _mixer->getOutputRate(); } + + // MidiDriver_Emulated + void generateSamples(int16 *buf, int len); + + void setVolume(byte volume); + void playSwitch(bool play); + virtual uint32 property(int prop, uint32 param); + +private: + enum { + kModeLoop = 1 << 0, // Instrument looping flag + kModePitch = 1 << 1 // Instrument pitch changes flag + }; + + enum { + kChannels = 10, + kBaseFreq = 20000, // Samplerate of the instrument bank + kPanLeft = 91, + kPanRight = 164 + }; + + struct Channel { + int instrument; + int volume; + int pan; + uint16 pitch; + }; + + struct Envelope { + int length; // Phase period length in samples + int delta; // Velocity delta per period + int target; // Target velocity + }; + + struct Voice { + int instrument; + int note; + int note_velocity; + int velocity; + int envelope; + int envelope_samples; // Number of samples till next envelope event + int decay; + int looping; + int hw_channel; + frac_t offset; + frac_t rate; + }; + + struct InstrumentSample { + char name[30]; + int mode; + int size; // Size of non-looping part in bytes + int loop_size; // Starting offset and size of loop in bytes + int transpose; // Transpose value in semitones + Envelope envelope[4]; // Envelope + int8 *samples; + int8 *loop; + int16 startNote; + int16 endNote; + bool isUnsigned; + uint16 baseFreq; + uint16 baseNote; + int16 fixedNote; + }; + + class Instrument : public Common::Array { + public: + char name[30]; + }; + + struct Bank { + char name[30]; + uint size; + Common::Array instruments; + }; + + bool _isSci1; + bool _playSwitch; + int _masterVolume; + int _frequency; + Envelope _envDecay; + Bank _bank; // Instrument bank + double _freqTable[48]; + + Channel _channels[MIDI_CHANNELS]; + /* Internal channels */ + Voice _voices[kChannels]; + + void setEnvelope(Voice *channel, Envelope *envelope, int phase); + void setOutputFrac(int voice); + int interpolate(int8 *samples, frac_t offset, bool isUnsigned); + void playInstrument(int16 *dest, Voice *channel, int count); + void changeInstrument(int channel, int instrument); + void stopChannel(int ch); + void stopNote(int ch, int note); + void startNote(int ch, int note, int velocity); + InstrumentSample *findInstrument(int instrument, int note); + void pitchWheel(int ch, uint16 pitch); + + bool loadInstrumentsSCI0(Common::File &file); + bool loadInstrumentsSCI0Mac(Common::SeekableReadStream &file); + InstrumentSample *readInstrumentSCI0(Common::SeekableReadStream &file, int *id); + bool loadInstrumentsSCI1(Common::SeekableReadStream &file); +}; + +void MidiDriver_AmigaMac::setEnvelope(Voice *channel, Envelope *envelope, int phase) { + channel->envelope = phase; + channel->envelope_samples = envelope[phase].length; + + if (phase == 0) + channel->velocity = channel->note_velocity / 2; + else + channel->velocity = envelope[phase - 1].target; +} + +int MidiDriver_AmigaMac::interpolate(int8 *samples, frac_t offset, bool isUnsigned) { + int x = fracToInt(offset); + + if (isUnsigned) { + int s1 = (byte)samples[x] - 0x80; + int s2 = (byte)samples[x + 1] - 0x80; + int diff = (s2 - s1) << 8; + return (s1 << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); + } + + int diff = (samples[x + 1] - samples[x]) << 8; + return (samples[x] << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); +} + +void MidiDriver_AmigaMac::playInstrument(int16 *dest, Voice *channel, int count) { + int index = 0; + int vol = _channels[channel->hw_channel].volume; + InstrumentSample *instrument = findInstrument(channel->instrument, channel->note); + + while (1) { + /* Available source samples until end of segment */ + frac_t lin_avail; + uint32 seg_end, rem, i, amount; + int8 *samples; + + if (channel->looping && instrument->loop) { + samples = instrument->loop; + seg_end = instrument->loop_size; + } else { + samples = instrument->samples; + seg_end = instrument->size; + } + + lin_avail = intToFrac(seg_end) - channel->offset; + + rem = count - index; + + /* Amount of destination samples that we will compute this iteration */ + amount = lin_avail / channel->rate; + + if (lin_avail % channel->rate) + amount++; + + if (amount > rem) + amount = rem; + + /* Stop at next envelope event */ + if ((channel->envelope_samples != -1) && (amount > (uint32)channel->envelope_samples)) + amount = channel->envelope_samples; + + for (i = 0; i < amount; i++) { + dest[index++] = interpolate(samples, channel->offset, instrument->isUnsigned) * channel->velocity / 64 * channel->note_velocity * vol / (127 * 127); + channel->offset += channel->rate; + } + + if (channel->envelope_samples != -1) + channel->envelope_samples -= amount; + + if (channel->envelope_samples == 0) { + Envelope *envelope; + int delta, target, velocity; + + if (channel->decay) + envelope = &_envDecay; + else + envelope = &instrument->envelope[channel->envelope]; + + delta = envelope->delta; + target = envelope->target; + velocity = channel->velocity - envelope->delta; + + /* Check whether we have reached the velocity target for the current phase */ + if ((delta >= 0 && velocity <= target) || (delta < 0 && velocity >= target)) { + channel->velocity = target; + + /* Stop note after velocity has dropped to 0 */ + if (target == 0) { + channel->note = -1; + break; + } else + switch (channel->envelope) { + case 0: + case 2: + /* Go to next phase */ + setEnvelope(channel, instrument->envelope, channel->envelope + 1); + break; + case 1: + case 3: + /* Stop envelope */ + channel->envelope_samples = -1; + break; + } + } else { + /* We haven't reached the target yet */ + channel->envelope_samples = envelope->length; + channel->velocity = velocity; + } + } + + if (index == count) + break; + + if ((uint32)fracToInt(channel->offset) >= seg_end) { + if (instrument->mode & kModeLoop) { + /* Loop the samples */ + channel->offset -= intToFrac(seg_end); + channel->looping = 1; + } else { + /* All samples have been played */ + channel->note = -1; + break; + } + } + } +} + +void MidiDriver_AmigaMac::changeInstrument(int channel, int instrument) { +#ifdef DEBUG + if (_bank.instruments[instrument][0]) + printf("[sfx:seq:amiga] Setting channel %i to \"%s\" (%i)\n", channel, _bank.instruments[instrument]->name, instrument); + else + warning("[sfx:seq:amiga] instrument %i does not exist (channel %i)", instrument, channel); +#endif + _channels[channel].instrument = instrument; +} + +void MidiDriver_AmigaMac::stopChannel(int ch) { + int i; + + /* Start decay phase for note on this hw channel, if any */ + for (i = 0; i < kChannels; i++) + if (_voices[i].note != -1 && _voices[i].hw_channel == ch && !_voices[i].decay) { + /* Trigger fast decay envelope */ + _voices[i].decay = 1; + _voices[i].envelope_samples = _envDecay.length; + break; + } +} + +void MidiDriver_AmigaMac::pitchWheel(int ch, uint16 pitch) { + _channels[ch].pitch = pitch; + + for (int i = 0; i < kChannels; i++) + if (_voices[i].note != -1 && _voices[i].hw_channel == ch) + setOutputFrac(i); +} + +void MidiDriver_AmigaMac::stopNote(int ch, int note) { + int channel; + + for (channel = 0; channel < kChannels; channel++) + if (_voices[channel].note == note && _voices[channel].hw_channel == ch && !_voices[channel].decay) + break; + + if (channel == kChannels) { +#ifdef DEBUG + warning("[sfx:seq:amiga] cannot stop note %i on channel %i", note, ch); +#endif + return; + } + + InstrumentSample *instrument = findInstrument(_voices[channel].instrument, note); + + // FIXME: SCI1 envelope support is not perfect yet + + /* Start the envelope phases for note-off if looping is on and envelope is enabled */ + if ((instrument->mode & kModeLoop) && (instrument->envelope[0].length != 0)) + setEnvelope(&_voices[channel], instrument->envelope, 2); +} + +MidiDriver_AmigaMac::InstrumentSample *MidiDriver_AmigaMac::findInstrument(int instrument, int note) { + if ((uint)instrument >= _bank.instruments.size()) + return 0; + + for (uint32 i = 0; i < _bank.instruments[instrument].size(); i++) { + InstrumentSample *sample = _bank.instruments[instrument][i]; + if (note >= sample->startNote && note <= sample->endNote) + return sample; + } + + return 0; +} + +void MidiDriver_AmigaMac::setOutputFrac(int voice) { + InstrumentSample *instrument = findInstrument(_voices[voice].instrument, _voices[voice].note); + + int fnote = 0; + + if (instrument->fixedNote == -1) { + fnote = _voices[voice].note; + + // Handle SCI0-style transposing here + if (!_isSci1) + fnote += instrument->transpose; + + if (fnote < 0 || fnote > 127) { + warning("[sfx:seq:amiga] illegal note %i", fnote); + return; + } + } else + fnote = instrument->fixedNote; + + // Compute rate for note + int mulFact = 1, divFact = 1; + + fnote -= instrument->baseNote; + fnote *= 4; + // FIXME: check how SSCI maps this + fnote += (_channels[_voices[voice].hw_channel].pitch - 0x2000) / 169; + + while (fnote < 0) { + divFact *= 2; + fnote += 12 * 4; + } + + while (fnote >= 12 * 4) { + mulFact *= 2; + fnote -= 12 * 4; + } + + double freq = _freqTable[fnote] * instrument->baseFreq * mulFact / divFact; + + // Handle SCI1-style transposing here + if (instrument->transpose && _isSci1) + freq = freq + ((_freqTable[4] - 1.0) * freq * (double)instrument->transpose / (double)16); + + _voices[voice].rate = doubleToFrac(freq / _frequency); +} + +void MidiDriver_AmigaMac::startNote(int ch, int note, int velocity) { + int channel; + + if (_channels[ch].instrument < 0 || _channels[ch].instrument > 255) { + warning("[sfx:seq:amiga] invalid instrument %i on channel %i", _channels[ch].instrument, ch); + return; + } + + InstrumentSample *instrument = findInstrument(_channels[ch].instrument, note); + + if (!instrument) { + warning("[sfx:seq:amiga] instrument %i does not exist", _channels[ch].instrument); + return; + } + + for (channel = 0; channel < kChannels; channel++) + if (_voices[channel].note == -1) + break; + + if (channel == kChannels) { + warning("[sfx:seq:amiga] could not find a free channel"); + return; + } + + stopChannel(ch); + + _voices[channel].instrument = _channels[ch].instrument; + _voices[channel].note = note; + _voices[channel].note_velocity = velocity; + + if ((instrument->mode & kModeLoop) && (instrument->envelope[0].length != 0)) + setEnvelope(&_voices[channel], instrument->envelope, 0); + else { + _voices[channel].velocity = 64; + _voices[channel].envelope_samples = -1; + } + + _voices[channel].offset = 0; + _voices[channel].hw_channel = ch; + _voices[channel].decay = 0; + _voices[channel].looping = 0; + setOutputFrac(channel); +} + +MidiDriver_AmigaMac::InstrumentSample *MidiDriver_AmigaMac::readInstrumentSCI0(Common::SeekableReadStream &file, int *id) { + byte header[61]; + + if (file.read(header, 61) < 61) { + warning("[sfx:seq:amiga] failed to read instrument header"); + return NULL; + } + + int seg_size[3]; + seg_size[0] = READ_BE_UINT16(header + 35) * 2; + seg_size[1] = READ_BE_UINT16(header + 41) * 2; + seg_size[2] = READ_BE_UINT16(header + 47) * 2; + + InstrumentSample *instrument = new InstrumentSample; + + instrument->startNote = 0; + instrument->endNote = 127; + instrument->isUnsigned = false; + instrument->baseFreq = kBaseFreq; + instrument->baseNote = 101; + instrument->fixedNote = 101; + + instrument->mode = header[33]; + instrument->transpose = (int8) header[34]; + for (int i = 0; i < 4; i++) { + int length = (int8) header[49 + i]; + + if (length == 0 && i > 0) + length = 256; + + instrument->envelope[i].length = length * _frequency / 60; + instrument->envelope[i].delta = (int8)header[53 + i]; + instrument->envelope[i].target = header[57 + i]; + } + /* Final target must be 0 */ + instrument->envelope[3].target = 0; + + int loop_offset = READ_BE_UINT32(header + 37) & ~1; + int size = seg_size[0] + seg_size[1] + seg_size[2]; + + *id = READ_BE_UINT16(header); + + strncpy(instrument->name, (char *) header + 2, 29); + instrument->name[29] = 0; + +#ifdef DEBUG + printf("[sfx:seq:amiga] Reading instrument %i: \"%s\" (%i bytes)\n", + *id, instrument->name, size); + printf(" Mode: %02x\n", instrument->mode); + printf(" Looping: %s\n", instrument->mode & kModeLoop ? "on" : "off"); + printf(" Pitch changes: %s\n", instrument->mode & kModePitch ? "on" : "off"); + printf(" Segment sizes: %i %i %i\n", seg_size[0], seg_size[1], seg_size[2]); + printf(" Segment offsets: 0 %i %i\n", loop_offset, read_int32(header + 43)); +#endif + + instrument->samples = (int8 *) malloc(size + 1); + if (file.read(instrument->samples, size) < (unsigned int)size) { + warning("[sfx:seq:amiga] failed to read instrument samples"); + free(instrument->samples); + delete instrument; + return NULL; + } + + if (instrument->mode & kModePitch) + instrument->fixedNote = -1; + + if (instrument->mode & kModeLoop) { + if (loop_offset + seg_size[1] > size) { +#ifdef DEBUG + warning("[sfx:seq:amiga] looping samples extend %i bytes past end of sample block", + loop_offset + seg_size[1] - size); +#endif + seg_size[1] = size - loop_offset; + } + + if (seg_size[1] < 0) { + warning("[sfx:seq:amiga] invalid looping point"); + free(instrument->samples); + delete instrument; + return NULL; + } + + instrument->size = seg_size[0]; + instrument->loop_size = seg_size[1]; + + instrument->loop = (int8*)malloc(instrument->loop_size + 1); + memcpy(instrument->loop, instrument->samples + loop_offset, instrument->loop_size); + + instrument->samples[instrument->size] = instrument->loop[0]; + instrument->loop[instrument->loop_size] = instrument->loop[0]; + } else { + instrument->loop = NULL; + instrument->loop_size = 0; + instrument->size = size; + instrument->samples[instrument->size] = 0; + } + + return instrument; +} + +uint32 MidiDriver_AmigaMac::property(int prop, uint32 param) { + switch(prop) { + case MIDI_PROP_MASTER_VOLUME: + if (param != 0xffff) + _masterVolume = param; + return _masterVolume; + default: + break; + } + return 0; +} + +int MidiDriver_AmigaMac::open() { + _isSci1 = false; + + for (int i = 0; i < 48; i++) + _freqTable[i] = pow(2, i / (double)48); + + _frequency = _mixer->getOutputRate(); + _envDecay.length = _frequency / (32 * 64); + _envDecay.delta = 1; + _envDecay.target = 0; + + for (uint i = 0; i < kChannels; i++) { + _voices[i].note = -1; + _voices[i].hw_channel = 0; + } + + for (uint i = 0; i < MIDI_CHANNELS; i++) { + _channels[i].instrument = -1; + _channels[i].volume = 127; + _channels[i].pan = (i % 4 == 0 || i % 4 == 3 ? kPanLeft : kPanRight); + _channels[i].pitch = 0x2000; + } + + Common::File file; + + if (file.open("bank.001")) { + if (!loadInstrumentsSCI0(file)) { + file.close(); + return Common::kUnknownError; + } + file.close(); + } else { + ResourceManager *resMan = g_sci->getResMan(); + + Resource *resource = resMan->findResource(ResourceId(kResourceTypePatch, 7), false); + if (!resource) + resource = resMan->findResource(ResourceId(kResourceTypePatch, 9), false); + + // If we have a patch by this point, it's SCI1 + if (resource) + _isSci1 = true; + + // Check for the SCI0 Mac patch + if (!resource) + resource = resMan->findResource(ResourceId(kResourceTypePatch, 200), false); + + if (!resource) { + warning("Could not open patch for Amiga sound driver"); + return Common::kUnknownError; + } + + Common::MemoryReadStream stream(resource->data, resource->size); + + if (_isSci1) { + if (!loadInstrumentsSCI1(stream)) + return Common::kUnknownError; + } else if (!loadInstrumentsSCI0Mac(stream)) + return Common::kUnknownError; + } + + MidiDriver_Emulated::open(); + + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, _mixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); + + return Common::kNoError; +} + +void MidiDriver_AmigaMac::close() { + _mixer->stopHandle(_mixerSoundHandle); + + for (uint i = 0; i < _bank.size; i++) { + for (uint32 j = 0; j < _bank.instruments[i].size(); j++) { + if (_bank.instruments[i][j]) { + if (_bank.instruments[i][j]->loop) + free(_bank.instruments[i][j]->loop); + free(_bank.instruments[i][j]->samples); + delete _bank.instruments[i][j]; + } + } + } +} + +void MidiDriver_AmigaMac::playSwitch(bool play) { + _playSwitch = play; +} + +void MidiDriver_AmigaMac::setVolume(byte volume_) { + _masterVolume = volume_; +} + +void MidiDriver_AmigaMac::send(uint32 b) { + byte command = b & 0xf0; + byte channel = b & 0xf; + byte op1 = (b >> 8) & 0xff; + byte op2 = (b >> 16) & 0xff; + + switch (command) { + case 0x80: + stopNote(channel, op1); + break; + case 0x90: + if (op2 > 0) + startNote(channel, op1, op2); + else + stopNote(channel, op1); + break; + case 0xb0: + switch (op1) { + case 0x07: + _channels[channel].volume = op2; + break; + case 0x0a: +#ifdef DEBUG + warning("[sfx:seq:amiga] ignoring pan 0x%02x event for channel %i", op2, channel); +#endif + break; + case 0x7b: + stopChannel(channel); + break; + default: + warning("[sfx:seq:amiga] unknown control event 0x%02x", op1); + } + break; + case 0xc0: + changeInstrument(channel, op1); + break; + case 0xe0: + pitchWheel(channel, (op2 << 7) | op1); + break; + default: + warning("[sfx:seq:amiga] unknown event %02x", command); + } +} + +void MidiDriver_AmigaMac::generateSamples(int16 *data, int len) { + if (len == 0) + return; + + int16 *buffers = (int16*)malloc(len * 2 * kChannels); + + memset(buffers, 0, len * 2 * kChannels); + + /* Generate samples for all notes */ + for (int i = 0; i < kChannels; i++) + if (_voices[i].note >= 0) + playInstrument(buffers + i * len, &_voices[i], len); + + if (isStereo()) { + for (int j = 0; j < len; j++) { + int mixedl = 0, mixedr = 0; + + /* Mix and pan */ + for (int i = 0; i < kChannels; i++) { + mixedl += buffers[i * len + j] * (256 - _channels[_voices[i].hw_channel].pan); + mixedr += buffers[i * len + j] * _channels[_voices[i].hw_channel].pan; + } + + /* Adjust volume */ + data[2 * j] = mixedl * _masterVolume >> 13; + data[2 * j + 1] = mixedr * _masterVolume >> 13; + } + } else { + for (int j = 0; j < len; j++) { + int mixed = 0; + + /* Mix */ + for (int i = 0; i < kChannels; i++) + mixed += buffers[i * len + j]; + + /* Adjust volume */ + data[j] = mixed * _masterVolume >> 6; + } + } + + free(buffers); +} + +bool MidiDriver_AmigaMac::loadInstrumentsSCI0(Common::File &file) { + _isSci1 = false; + + byte header[40]; + + if (file.read(header, 40) < 40) { + warning("[sfx:seq:amiga] failed to read header of file bank.001"); + return false; + } + + _bank.size = READ_BE_UINT16(header + 38); + strncpy(_bank.name, (char *) header + 8, 29); + _bank.name[29] = 0; +#ifdef DEBUG + printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); +#endif + + for (uint i = 0; i < _bank.size; i++) { + int id; + InstrumentSample *instrument = readInstrumentSCI0(file, &id); + + if (!instrument) { + warning("[sfx:seq:amiga] failed to read bank.001"); + return false; + } + + if (id < 0 || id > 255) { + warning("[sfx:seq:amiga] Error: instrument ID out of bounds"); + return false; + } + + if ((uint)id >= _bank.instruments.size()) + _bank.instruments.resize(id + 1); + + _bank.instruments[id].push_back(instrument); + memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); + } + + return true; +} + +bool MidiDriver_AmigaMac::loadInstrumentsSCI0Mac(Common::SeekableReadStream &file) { + byte header[40]; + + if (file.read(header, 40) < 40) { + warning("[sfx:seq:amiga] failed to read header of file patch.200"); + return false; + } + + _bank.size = 128; + strncpy(_bank.name, (char *) header + 8, 29); + _bank.name[29] = 0; +#ifdef DEBUG + printf("[sfx:seq:amiga] Reading %i instruments from bank \"%s\"\n", _bank.size, _bank.name); +#endif + + Common::Array instrumentOffsets; + instrumentOffsets.resize(_bank.size); + _bank.instruments.resize(_bank.size); + + for (uint32 i = 0; i < _bank.size; i++) + instrumentOffsets[i] = file.readUint32BE(); + + for (uint i = 0; i < _bank.size; i++) { + // 0 signifies it doesn't exist + if (instrumentOffsets[i] == 0) + continue; + + file.seek(instrumentOffsets[i]); + + uint16 id = file.readUint16BE(); + if (id != i) + error("Instrument number mismatch"); + + InstrumentSample *instrument = new InstrumentSample; + + instrument->startNote = 0; + instrument->endNote = 127; + instrument->isUnsigned = true; + instrument->baseFreq = kBaseFreq; + instrument->baseNote = 101; + instrument->fixedNote = 101; + instrument->mode = file.readUint16BE(); + + // Read in the offsets + int32 seg_size[3]; + seg_size[0] = file.readUint32BE(); + seg_size[1] = file.readUint32BE(); + seg_size[2] = file.readUint32BE(); + + instrument->transpose = file.readUint16BE(); + + for (byte j = 0; j < 4; j++) { + int length = (int8)file.readByte(); + + if (length == 0 && j > 0) + length = 256; + + instrument->envelope[j].length = length * _frequency / 60; + instrument->envelope[j].delta = (int8)file.readByte(); + instrument->envelope[j].target = file.readByte(); + } + + // Final target must be 0 + instrument->envelope[3].target = 0; + + file.read(instrument->name, 30); + + if (instrument->mode & kModePitch) + instrument->fixedNote = -1; + + uint32 size = seg_size[2]; + uint32 loop_offset = seg_size[0]; + + instrument->samples = (int8 *)malloc(size + 1); + if (file.read(instrument->samples, size) < size) { + warning("[sfx:seq:amiga] failed to read instrument sample"); + free(instrument->samples); + delete instrument; + continue; + } + + if (instrument->mode & kModeLoop) { + instrument->size = seg_size[0]; + instrument->loop_size = seg_size[1] - seg_size[0]; + + instrument->loop = (int8*)malloc(instrument->loop_size + 1); + memcpy(instrument->loop, instrument->samples + loop_offset, instrument->loop_size); + + instrument->samples[instrument->size] = instrument->loop[0]; + instrument->loop[instrument->loop_size] = instrument->loop[0]; + } else { + instrument->loop = NULL; + instrument->loop_size = 0; + instrument->size = size; + instrument->samples[instrument->size] = (int8)0x80; + } + + _bank.instruments[id].push_back(instrument); + memcpy(_bank.instruments[id].name, instrument->name, sizeof(instrument->name)); + } + + return true; +} + +bool MidiDriver_AmigaMac::loadInstrumentsSCI1(Common::SeekableReadStream &file) { + _bank.size = 128; + + Common::Array instrumentOffsets; + instrumentOffsets.resize(_bank.size); + _bank.instruments.resize(_bank.size); + + for (uint32 i = 0; i < _bank.size; i++) + instrumentOffsets[i] = file.readUint32BE(); + + for (uint32 i = 0; i < _bank.size; i++) { + // 0 signifies it doesn't exist + if (instrumentOffsets[i] == 0) + continue; + + file.seek(instrumentOffsets[i]); + + // Read in the instrument name + file.read(_bank.instruments[i].name, 10); // last two bytes are always 0 + + for (uint32 j = 0; ; j++) { + InstrumentSample *sample = new InstrumentSample; + memset(sample, 0, sizeof(InstrumentSample)); + + sample->startNote = file.readSint16BE(); + + // startNote being -1 signifies we're done with this instrument + if (sample->startNote == -1) { + delete sample; + break; + } + + sample->endNote = file.readSint16BE(); + uint32 samplePtr = file.readUint32BE(); + sample->transpose = file.readSint16BE(); + for (int env = 0; env < 3; env++) { + sample->envelope[env].length = file.readByte() * _frequency / 60; + sample->envelope[env].delta = (env == 0 ? 10 : -10); + sample->envelope[env].target = file.readByte(); + } + + sample->envelope[3].length = 0; + sample->fixedNote = file.readSint16BE(); + int16 loop = file.readSint16BE(); + uint32 nextSamplePos = file.pos(); + + file.seek(samplePtr); + file.read(sample->name, 8); + + sample->isUnsigned = file.readUint16BE() == 0; + uint16 phase1Offset = file.readUint16BE(); + uint16 phase1End = file.readUint16BE(); + uint16 phase2Offset = file.readUint16BE(); + uint16 phase2End = file.readUint16BE(); + sample->baseNote = file.readUint16BE(); + uint32 periodTableOffset = file.readUint32BE(); + uint32 sampleDataPos = file.pos(); + + sample->size = phase1End - phase1Offset + 1; + sample->loop_size = phase2End - phase2Offset + 1; + + sample->samples = (int8 *)malloc(sample->size + 1); + file.seek(phase1Offset + sampleDataPos); + file.read(sample->samples, sample->size); + sample->samples[sample->size] = (sample->isUnsigned ? (int8)0x80 : 0); + + if (loop == 0 && sample->loop_size > 1) { + sample->loop = (int8 *)malloc(sample->loop_size + 1); + file.seek(phase2Offset + sampleDataPos); + file.read(sample->loop, sample->loop_size); + sample->mode |= kModeLoop; + sample->samples[sample->size] = sample->loop[0]; + sample->loop[sample->loop_size] = sample->loop[0]; + } + + _bank.instruments[i].push_back(sample); + + file.seek(periodTableOffset + 0xe0); + sample->baseFreq = file.readUint16BE(); + + file.seek(nextSamplePos); + } + } + + return true; +} + +class MidiPlayer_AmigaMac : public MidiPlayer { +public: + MidiPlayer_AmigaMac(SciVersion version) : MidiPlayer(version) { _driver = new MidiDriver_AmigaMac(g_system->getMixer()); } + byte getPlayId(); + int getPolyphony() const { return MidiDriver_AmigaMac::kVoices; } + bool hasRhythmChannel() const { return false; } + void setVolume(byte volume) { static_cast(_driver)->setVolume(volume); } + void playSwitch(bool play) { static_cast(_driver)->playSwitch(play); } + void loadInstrument(int idx, byte *data); +}; + +MidiPlayer *MidiPlayer_AmigaMac_create(SciVersion version) { + return new MidiPlayer_AmigaMac(version); +} + +byte MidiPlayer_AmigaMac::getPlayId() { + if (_version > SCI_VERSION_0_LATE) + return 0x06; + + return 0x40; +} + +} // End of namespace Sci diff --git a/engines/sci/sound/drivers/mididriver.h b/engines/sci/sound/drivers/mididriver.h index da97b723af..2db6f25c70 100644 --- a/engines/sci/sound/drivers/mididriver.h +++ b/engines/sci/sound/drivers/mididriver.h @@ -113,7 +113,7 @@ protected: }; extern MidiPlayer *MidiPlayer_AdLib_create(SciVersion version); -extern MidiPlayer *MidiPlayer_Amiga_create(SciVersion version); +extern MidiPlayer *MidiPlayer_AmigaMac_create(SciVersion version); extern MidiPlayer *MidiPlayer_PCJr_create(SciVersion version); extern MidiPlayer *MidiPlayer_PCSpeaker_create(SciVersion version); extern MidiPlayer *MidiPlayer_Midi_create(SciVersion version); diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 5178c5f7cd..8908d022df 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -71,7 +71,7 @@ void SciMusic::init() { case MT_ADLIB: // FIXME: There's no Amiga sound option, so we hook it up to AdLib if (g_sci->getPlatform() == Common::kPlatformAmiga || platform == Common::kPlatformMacintosh) - _pMidiDrv = MidiPlayer_Amiga_create(_soundVersion); + _pMidiDrv = MidiPlayer_AmigaMac_create(_soundVersion); else _pMidiDrv = MidiPlayer_AdLib_create(_soundVersion); break; -- cgit v1.2.3 From fc1e5c8faeedf13217658d22c7f25adce1a9e75b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 19:19:49 +0000 Subject: SCI: adding comments about not enabling ScummVM menu saving svn-id: r51007 --- engines/sci/detection.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 2ee3a0bdcb..8a1f68cfbb 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -628,6 +628,13 @@ bool SciEngine::hasFeature(EngineFeature f) const { //(f == kSupportsRTL) || (f == kSupportsLoadingDuringRuntime); // || //(f == kSupportsSavingDuringRuntime); + // We can't allow saving through ScummVM menu, because + // a) lots of games don't like saving everywhere (e.g. castle of dr. brain) + // b) some games even dont allow saving in certain rooms (e.g. lsl6) + // c) somehow some games even get mad when doing this (execstackbase was 1 all of a sudden in lsl3) + // d) for sci0/sci01 games we should at least wait till status bar got drawn, although this may not be enough + // we can't make sure that the scripts are fine with us saving at a specific location, doing so may work sometimes + // and some other times it won't work. } SaveStateList SciMetaEngine::listSaves(const char *target) const { -- cgit v1.2.3 From 8893d4ef2307696a306ab2e643857b17d354228e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 20:14:18 +0000 Subject: SCI: add workaround for script 500 lsl3 svn-id: r51008 --- engines/sci/engine/script.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index a293f81d2f..42e1c54c90 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -437,6 +437,9 @@ void Script::initialiseClasses(SegManager *segMan) { // WORKAROUND for an invalid species access in the demo of LSL2 if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); + // WORKAROUND for an invalid species access in LSL3 script 500 + if (g_sci->getGameId() == GID_LSL3 && !g_sci->isDemo() && species == (int)segMan->classTableSize()) + segMan->resizeClassTable(segMan->classTableSize() + 1); if (species < 0 || species >= (int)segMan->classTableSize()) error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d\n", -- cgit v1.2.3 From dbc16076034d23181b4a2ea897afbf6b923208ee Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 20:19:14 +0000 Subject: SCI: add script number to r51008 change svn-id: r51009 --- engines/sci/engine/script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 42e1c54c90..049ea9247b 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -438,7 +438,7 @@ void Script::initialiseClasses(SegManager *segMan) { if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); // WORKAROUND for an invalid species access in LSL3 script 500 - if (g_sci->getGameId() == GID_LSL3 && !g_sci->isDemo() && species == (int)segMan->classTableSize()) + if (g_sci->getGameId() == GID_LSL3 && !g_sci->isDemo() && _nr == 500 && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); if (species < 0 || species >= (int)segMan->classTableSize()) -- cgit v1.2.3 From e4271b0bb09cd80abc49444495aa9a6fac579ab1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 18 Jul 2010 20:36:19 +0000 Subject: SCI: fix warning svn-id: r51010 --- engines/sci/engine/vm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 8c540b34b1..ba35e024e1 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1125,7 +1125,7 @@ void run_vm(EngineState *s, bool restoring) { switch (opcode) { - case op_bnot: // 0x00 (00) + case op_bnot: { // 0x00 (00) // Binary not int16 value; if (validate_signedInteger(s->r_acc, value)) @@ -1133,6 +1133,7 @@ void run_vm(EngineState *s, bool restoring) { else s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, NULL_REG); break; + } case op_add: // 0x01 (01) r_temp = POP32(); -- cgit v1.2.3 From efbac08e6b5de96436b32ee5e8a79ba7f2b9cb88 Mon Sep 17 00:00:00 2001 From: David Turner Date: Sun, 18 Jul 2010 22:11:22 +0000 Subject: SCI : Corrected valgrind error on engine exit svn-id: r51011 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 66b36b29f6..ec96c6c3e9 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -736,7 +736,7 @@ Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) Kernel::~Kernel() { for (KernelFunctionArray::iterator i = _kernelFuncs.begin(); i != _kernelFuncs.end(); ++i) - free(i->signature); + delete[] i->signature; } uint Kernel::getSelectorNamesSize() const { -- cgit v1.2.3 From 75dd75a73767319b2797a140f985dfc356462862 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 19 Jul 2010 05:30:40 +0000 Subject: SUBSYSTEM: ALSA music driver We should probably open the sequencer the exact same way, both when opening the driver and when asking it for available MIDI devices. Not that I've been able to figure out the difference between "hw" and "default" from the fine ALSA manual... And I'm not sure we really need to try and keep compatibility with ancient (pre-0.9.0?) ALSA any longer... svn-id: r51014 --- backends/midi/alsa.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 6a1a8e88ae..a3f4b149d1 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -290,7 +290,7 @@ MusicDevices AlsaMusicPlugin::getDevices() const { MusicDevices devices; snd_seq_t *seq; - if (snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0) + if (my_snd_seq_open(&seq) < 0) return devices; // can't open sequencer snd_seq_client_info_t *cinfo; -- cgit v1.2.3 From d952e48a57a8efb7c6b8fbe8163cbde889b7e88f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 07:29:17 +0000 Subject: SCI: change kDoSound(updateCues) for samples only set signal when sample was/is playing, fixes qfg2 genie intro svn-id: r51017 --- engines/sci/sound/soundcmd.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 30b7c97a94..316468eee4 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -379,10 +379,12 @@ void SoundCommandParser::processUpdateCues(reg_t obj) { musicSlot->loop -= currentLoopCounter - musicSlot->sampleLoopCounter; musicSlot->sampleLoopCounter = currentLoopCounter; } - if ((!_music->soundIsActive(musicSlot)) && (musicSlot->status != kSoundPaused)) { - processStopSound(obj, true); - } else { - _music->updateAudioStreamTicker(musicSlot); + if (musicSlot->status == kSoundPlaying) { + if (!_music->soundIsActive(musicSlot)) { + processStopSound(obj, true); + } else { + _music->updateAudioStreamTicker(musicSlot); + } } // We get a flag from MusicEntry::doFade() here to set volume for the stream if (musicSlot->fadeSetVolume) { -- cgit v1.2.3 From 9cb23c8a7bcda26196e78af3e28da67db6b987ea Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 07:37:22 +0000 Subject: SCI: update sample ticker when paused little adjustment of r51017 svn-id: r51018 --- engines/sci/sound/soundcmd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 316468eee4..9312df5c80 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -385,6 +385,8 @@ void SoundCommandParser::processUpdateCues(reg_t obj) { } else { _music->updateAudioStreamTicker(musicSlot); } + } else if (musicSlot->status == kSoundPaused) { + _music->updateAudioStreamTicker(musicSlot); } // We get a flag from MusicEntry::doFade() here to set volume for the stream if (musicSlot->fadeSetVolume) { -- cgit v1.2.3 From abae29a2dccfc132505687e70c220beb2f56defe Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 19 Jul 2010 07:47:11 +0000 Subject: ALSA: Get ALSA port settings from the new device config settings. This is also an attempt to make the transition from the old settings to the new ones a little less rough, by trying to put something sensible into the first device, which is what's used by default. Currently it prefers 17:x and 65:x since they're the old defaults, followed by 128:x since that's probably TiMidity. The old SCUMMVM_PORT environment variable still overrides any config settings. I haven't made up my mind whether or not that's a good idea, but at least it prints a warning message. TODO: The old 'alsa_port' setting is not handled. It should probably be used to set sensible defaults for the new settings, but I'm not sure where this should be done. TODO: The documentation will need to be updated, once everything is working the way it should. svn-id: r51019 --- backends/midi/alsa.cpp | 253 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 182 insertions(+), 71 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index a3f4b149d1..076655bfed 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -56,7 +56,7 @@ class MidiDriver_ALSA:public MidiDriver_MPU401 { public: - MidiDriver_ALSA(); + MidiDriver_ALSA(int client, int port); int open(); void close(); void send(uint32 b); @@ -69,34 +69,19 @@ private: snd_seq_t *seq_handle; int seq_client, seq_port; int my_client, my_port; - static int parse_addr(const char *arg, int *client, int *port); }; -MidiDriver_ALSA::MidiDriver_ALSA() - : _isOpen(false), seq_handle(0), seq_client(0), seq_port(0), my_client(0), my_port(0) +MidiDriver_ALSA::MidiDriver_ALSA(int client, int port) + : _isOpen(false), seq_handle(0), seq_client(client), seq_port(port), my_client(0), my_port(0) { memset(&ev, 0, sizeof(ev)); } int MidiDriver_ALSA::open() { - const char *var = NULL; - if (_isOpen) return MERR_ALREADY_OPEN; _isOpen = true; - var = getenv("SCUMMVM_PORT"); - if (!var && ConfMan.hasKey("alsa_port")) { - var = ConfMan.get("alsa_port").c_str(); - } - - if (var) { - if (parse_addr(var, &seq_client, &seq_port) < 0) { - error("Invalid port %s", var); - return -1; - } - } - if (my_snd_seq_open(&seq_handle) < 0) { error("Can't open sequencer"); return -1; @@ -118,29 +103,11 @@ int MidiDriver_ALSA::open() { return -1; } - if (var) { - if (seq_client != SND_SEQ_ADDRESS_SUBSCRIBERS) { - // subscribe to MIDI port - if (snd_seq_connect_to(seq_handle, my_port, seq_client, seq_port) < 0) { - error("Can't subscribe to MIDI port (%d:%d) see README for help", seq_client, seq_port); - } - } - } else { - int defaultPorts[] = { - 65, 0, - 17, 0 - }; - int i; - - for (i = 0; i < ARRAYSIZE(defaultPorts); i += 2) { - seq_client = defaultPorts[i]; - seq_port = defaultPorts[i + 1]; - if (snd_seq_connect_to(seq_handle, my_port, seq_client, seq_port) >= 0) - break; + if (seq_client != SND_SEQ_ADDRESS_SUBSCRIBERS) { + // subscribe to MIDI port + if (snd_seq_connect_to(seq_handle, my_port, seq_client, seq_port) < 0) { + error("Can't subscribe to MIDI port (%d:%d) see README for help", seq_client, seq_port); } - - if (i >= ARRAYSIZE(defaultPorts)) - error("Can't subscribe to MIDI port (65:0) or (17:0)"); } printf("Connected to Alsa sequencer client [%d:%d]\n", seq_client, seq_port); @@ -230,24 +197,6 @@ void MidiDriver_ALSA::sysEx(const byte *msg, uint16 length) { send_event(1); } -int MidiDriver_ALSA::parse_addr(const char *arg, int *client, int *port) { - const char *p; - - if (isdigit(*arg)) { - if ((p = strpbrk(arg, ADDR_DELIM)) == NULL) - return -1; - *client = atoi(arg); - *port = atoi(p + 1); - } else { - if (*arg == 's' || *arg == 'S') { - *client = SND_SEQ_ADDRESS_SUBSCRIBERS; - *port = 0; - } else - return -1; - } - return 0; -} - void MidiDriver_ALSA::send_event(int do_flush) { snd_seq_ev_set_direct(&ev); snd_seq_ev_set_source(&ev, my_port); @@ -261,6 +210,43 @@ void MidiDriver_ALSA::send_event(int do_flush) { // Plugin interface +class AlsaDevice { +public: + AlsaDevice(Common::String name, MusicType mt, int client, int port); + Common::String getName(); + MusicType getType(); + int getClient(); + int getPort(); + +private: + Common::String _name; + MusicType _type; + int _client; + int _port; +}; + +typedef Common::List AlsaDevices; + +AlsaDevice::AlsaDevice(Common::String name, MusicType mt, int client, int port) + : _name(name), _type(mt), _client(client), _port(port) { +} + +Common::String AlsaDevice::getName() { + return _name; +} + +MusicType AlsaDevice::getType() { + return _type; +} + +int AlsaDevice::getClient() { + return _client; +} + +int AlsaDevice::getPort() { + return _port; +} + class AlsaMusicPlugin : public MusicPluginObject { public: const char *getName() const { @@ -271,8 +257,12 @@ public: return "alsa"; } + AlsaDevices getAlsaDevices() const; MusicDevices getDevices() const; Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; + +private: + static int parse_addr(const char *arg, int *client, int *port); }; #define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) @@ -286,11 +276,10 @@ static int check_permission(snd_seq_port_info_t *pinfo) return 0; } -MusicDevices AlsaMusicPlugin::getDevices() const { - MusicDevices devices; - - snd_seq_t *seq; - if (my_snd_seq_open(&seq) < 0) +AlsaDevices AlsaMusicPlugin::getAlsaDevices() const { + AlsaDevices devices; + snd_seq_t *seq_handle; + if (my_snd_seq_open(&seq_handle) < 0) return devices; // can't open sequencer snd_seq_client_info_t *cinfo; @@ -298,32 +287,154 @@ MusicDevices AlsaMusicPlugin::getDevices() const { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca(&pinfo); snd_seq_client_info_set_client(cinfo, -1); - while (snd_seq_query_next_client(seq, cinfo) >= 0) { + while (snd_seq_query_next_client(seq_handle, cinfo) >= 0) { bool found_valid_port = false; /* reset query info */ snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo)); snd_seq_port_info_set_port(pinfo, -1); - while (!found_valid_port && snd_seq_query_next_port(seq, pinfo) >= 0) { + while (!found_valid_port && snd_seq_query_next_port(seq_handle, pinfo) >= 0) { if (check_permission(pinfo)) { found_valid_port = true; - // TODO: Return a different music type depending on the configuration - devices.push_back(MusicDevice(this, snd_seq_client_info_get_name(cinfo), MT_GM)); - //snd_seq_client_info_get_client(cinfo) : snd_seq_port_info_get_port(pinfo) + + const char *name = snd_seq_client_info_get_name(cinfo); + // TODO: Can we figure out the appropriate music type? + MusicType type = MT_GM; + int client = snd_seq_client_info_get_client(cinfo); + int port = snd_seq_port_info_get_port(pinfo); + + devices.push_back(AlsaDevice(name, type, client, port)); } } } - snd_seq_close(seq); + snd_seq_close(seq_handle); return devices; } -Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { - *mididriver = new MidiDriver_ALSA(); +MusicDevices AlsaMusicPlugin::getDevices() const { + MusicDevices devices; + Common::Array used; + AlsaDevices::iterator d; + int i; + + AlsaDevices alsaDevices = getAlsaDevices(); + + for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { + used.push_back(false); + } + + // Since the default behaviour is to use the first device in the list, + // try to put something sensible there. We used to have 17:0 and 65:0 + // as defaults. + + for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { + int client = d->getClient(); + if (client == 17 || client == 65) { + devices.push_back(MusicDevice(this, d->getName(), d->getType())); + used[i] = true; + } + } + + // 128:0 is probably TiMidity, or something like that, so that's + // probably a good second choice. + + for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { + if (d->getClient() == 128) { + devices.push_back(MusicDevice(this, d->getName(), d->getType())); + used[i] = true; + } + } + + // Add the remaining devices in the order they were found. + + for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { + + if (!used[i]) { + devices.push_back(MusicDevice(this, d->getName(), d->getType())); + } + } + + return devices; +} + +Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle dev) const { + bool found = false; + int seq_client, seq_port; + + const char *var = NULL; + + // TODO: Upgrade from old alsa_port setting. This probably isn't the + // right place to do that, though. + + if (ConfMan.hasKey("alsa_port")) { + warning("AlsaMusicPlugin: Found old 'alsa_port' setting, which will be ignored"); + } + + // The SCUMMVM_PORT environment variable can still be used to override + // any config setting. + + var = getenv("SCUMMVM_PORT"); + if (var) { + warning("AlsaMusicPlugin: SCUMMVM_PORT environment variable overrides config settings"); + if (parse_addr(var, &seq_client, &seq_port) >= 0) { + found = true; + } else { + warning("AlsaMusicPlugin: Invalid port %s, using config settings instead", var); + } + } + + // Try to match the setting to an available ALSA device. + + if (!found && dev) { + AlsaDevices alsaDevices = getAlsaDevices(); + + for (AlsaDevices::iterator d = alsaDevices.begin(); d != alsaDevices.end(); ++d) { + MusicDevice device(this, d->getName(), d->getType()); + + if (device.getCompleteId().equals(MidiDriver::getDeviceString(dev, MidiDriver::kDeviceId))) { + found = true; + seq_client = d->getClient(); + seq_port = d->getPort(); + break; + } + } + } + + // Still nothing? Try a sensible default. + + if (!found) { + // TODO: What's a sensible default anyway? And exactly when do + // we get to this case? + + warning("AlsaMusicPlugin: Using 17:0 as default ALSA port"); + seq_client = 17; + seq_port = 0; + } + + *mididriver = new MidiDriver_ALSA(seq_client, seq_port); return Common::kNoError; } +int AlsaMusicPlugin::parse_addr(const char *arg, int *client, int *port) { + const char *p; + + if (isdigit(*arg)) { + if ((p = strpbrk(arg, ADDR_DELIM)) == NULL) + return -1; + *client = atoi(arg); + *port = atoi(p + 1); + } else { + if (*arg == 's' || *arg == 'S') { + *client = SND_SEQ_ADDRESS_SUBSCRIBERS; + *port = 0; + } else + return -1; + } + return 0; +} + //#if PLUGIN_ENABLED_DYNAMIC(ALSA) //REGISTER_PLUGIN_DYNAMIC(ALSA, PLUGIN_TYPE_MUSIC, AlsaMusicPlugin); //#else -- cgit v1.2.3 From 6bebc0df452c722de8ce0fd1b7458331f3e13a0e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 08:17:09 +0000 Subject: SCI: fixing signature for kDoSound(setReverb) fixes lsl5 signature mismatch, signature was wrong svn-id: r51020 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ec96c6c3e9..14e6e2de71 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -360,7 +360,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, - { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "oi", NULL }, + { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, // ^^ Longbow demo -- cgit v1.2.3 From b48045662dd4618ec9058bdc05ec50089abf740f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 10:19:13 +0000 Subject: SCI: fix ult to work for pq2 japanese pq2 japanese compares pointers to 2000 to find out if its a resourceid or a pointer svn-id: r51023 --- engines/sci/engine/vm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ba35e024e1..419acd3871 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1444,7 +1444,8 @@ void run_vm(EngineState *s, bool restoring) { r_temp = POP32(); // See above - if (r_temp.segment && (s->r_acc == make_reg(0, 1000))) + // PQ2 japanese compares pointers to 2000 to find out if its a pointer or a resourceid + if (r_temp.segment && (s->r_acc == make_reg(0, 1000) || (s->r_acc == make_reg(0, 2000)))) s->r_acc = NULL_REG; else if (r_temp.segment && s->r_acc.segment) s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset); -- cgit v1.2.3 From 42107e2f5c09d9b25419ea8e2710502ca94b88a4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 10:38:03 +0000 Subject: SCI: vocab version change for pq2 japanese pq2 japanese only uses sci01 vocabulary and everything else is still like in sci0 - fixes pq2 not accepting any input in parser svn-id: r51024 --- engines/sci/parser/vocabulary.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index ad006b0ca8..0b57d40686 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -85,7 +85,9 @@ bool Vocabulary::loadParserWords() { return false; // NOT critical: SCI1 games and some demos don't have one! } - if (_vocabVersion == kVocabularySCI0) { + VocabularyVersions resourceType = _vocabVersion; + + if (resourceType == kVocabularySCI0) { if (resource->size < 26 * 2) { warning("Invalid main vocabulary encountered: Much too small"); return false; @@ -99,12 +101,12 @@ bool Vocabulary::loadParserWords() { // If all of them were empty, we are definitely seeing SCI01 vocab in disguise (e.g. pq2 japanese) if (alphabetNr == 26) { warning("SCI0: Found SCI01 vocabulary in disguise"); - _vocabVersion = kVocabularySCI1; + resourceType = kVocabularySCI1; } } unsigned int seeker; - if (_vocabVersion == kVocabularySCI1) + if (resourceType == kVocabularySCI1) seeker = 255 * 2; // vocab.900 starts with 255 16-bit pointers which we don't use else seeker = 26 * 2; // vocab.000 starts with 26 16-bit pointers which we don't use @@ -122,7 +124,7 @@ bool Vocabulary::loadParserWords() { currentwordpos = resource->data[seeker++]; // Parts of previous words may be re-used - if (_vocabVersion == kVocabularySCI1) { + if (resourceType == kVocabularySCI1) { c = 1; while (seeker < resource->size && currentwordpos < 255 && c) { c = resource->data[seeker++]; -- cgit v1.2.3 From 07009b045e35133b0a398ecc0d78316ed2e01d09 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 11:41:20 +0000 Subject: SCI: fix parser crash on >=0x80 chars svn-id: r51025 --- engines/sci/parser/vocabulary.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 0b57d40686..22827a6327 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -376,7 +376,7 @@ void Vocabulary::decipherSaidBlock(byte *addr) { bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, char **error) { const char *lastword = sentence; int pos_in_sentence = 0; - char c; + unsigned char c; int wordlen = 0; *error = NULL; @@ -385,7 +385,7 @@ bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, ch c = sentence[pos_in_sentence++]; - if (isalnum(c) || (c == '-' && wordlen)) + if (isalnum(c) || (c == '-' && wordlen) || (c >= 0x80)) ++wordlen; // Continue on this word */ // Words may contain a '-', but may not -- cgit v1.2.3 From 8ea7eec267d925783e5762f54991e0d3879f7bd9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 13:05:41 +0000 Subject: SCI: lsl6 workaround switched on for all rooms lsl6 workaround also happens later, so we switch it to all rooms svn-id: r51026 --- engines/sci/engine/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 14e6e2de71..189f6c2000 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -253,7 +253,7 @@ static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, 240, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily - gets called with additional 5th parameter + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 2a0cff5c6ddc8409ef7daeead61b8e89479fe5a0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 13:50:06 +0000 Subject: SCI: implement foreign vocabulary support not fully working, extended chars do not work currently as input svn-id: r51027 --- engines/sci/engine/kparse.cpp | 1 + engines/sci/engine/state.cpp | 12 +++++++++ engines/sci/parser/vocabulary.cpp | 53 +++++++++++++++++---------------------- engines/sci/parser/vocabulary.h | 7 +++++- engines/sci/sci.cpp | 3 ++- engines/sci/sci.h | 4 +++ 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 4287e7c96b..8714981034 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -93,6 +93,7 @@ reg_t kParse(EngineState *s, int argc, reg_t *argv) { char *error; ResultWordList words; reg_t event = argv[1]; + g_sci->checkVocabularySwitch(); Vocabulary *voc = g_sci->getVocabulary(); voc->parser_event = event; reg_t params[2] = { voc->parser_base, stringpos }; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 36b03c0ad9..e07373b466 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -324,4 +324,16 @@ Common::String SciEngine::strSplit(const char *str, const char *sep) { return retval; } +void SciEngine::checkVocabularySwitch() { + uint16 parserLanguage = 1; + if (SELECTOR(parseLang) != -1) + parserLanguage = readSelectorValue(_gamestate->_segMan, _gameObj, SELECTOR(parseLang)); + + if (parserLanguage != _vocabularyLanguage) { + delete _vocabulary; + _vocabulary = new Vocabulary(_resMan, parserLanguage > 1 ? true : false); + _vocabularyLanguage = parserLanguage; + } +} + } // End of namespace Sci diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 22827a6327..cb580017c4 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -33,9 +33,8 @@ namespace Sci { -Vocabulary::Vocabulary(ResourceManager *resMan) : _resMan(resMan) { +Vocabulary::Vocabulary(ResourceManager *resMan, bool foreign) : _resMan(resMan), _foreign(foreign) { _parserRules = NULL; - _vocabVersion = kVocabularySCI0; memset(_parserNodes, 0, sizeof(_parserNodes)); // Mark parse tree as unused @@ -45,6 +44,23 @@ Vocabulary::Vocabulary(ResourceManager *resMan) : _resMan(resMan) { _synonyms.clear(); // No synonyms debug(2, "Initializing vocabulary"); + if (_resMan->testResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI0_MAIN_VOCAB))) { + _vocabVersion = kVocabularySCI0; + _resourceIdWords = VOCAB_RESOURCE_SCI0_MAIN_VOCAB; + _resourceIdSuffixes = VOCAB_RESOURCE_SCI0_SUFFIX_VOCAB; + _resourceIdBranches = VOCAB_RESOURCE_SCI0_PARSE_TREE_BRANCHES; + } else { + warning("Could not find a main vocabulary, trying SCI01"); + _vocabVersion = kVocabularySCI1; + _resourceIdWords = VOCAB_RESOURCE_SCI1_MAIN_VOCAB; + _resourceIdSuffixes = VOCAB_RESOURCE_SCI1_SUFFIX_VOCAB; + _resourceIdBranches = VOCAB_RESOURCE_SCI1_PARSE_TREE_BRANCHES; + if (_foreign) { + _resourceIdWords += 10; + _resourceIdSuffixes += 10; + _resourceIdBranches += 10; + } + } if (getSciVersion() <= SCI_VERSION_1_EGA && loadParserWords()) { loadSuffixes(); @@ -72,16 +88,10 @@ bool Vocabulary::loadParserWords() { int currentwordpos = 0; // First try to load the SCI0 vocab resource. - Resource *resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI0_MAIN_VOCAB), 0); - - if (!resource) { - warning("SCI0: Could not find a main vocabulary, trying SCI01"); - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI1_MAIN_VOCAB), 0); - _vocabVersion = kVocabularySCI1; - } + Resource *resource = _resMan->findResource(ResourceId(kResourceTypeVocab, _resourceIdWords), 0); if (!resource) { - warning("SCI1: Could not find a main vocabulary"); + warning("Could not find a main vocabulary"); return false; // NOT critical: SCI1 games and some demos don't have one! } @@ -175,13 +185,7 @@ const char *Vocabulary::getAnyWordFromGroup(int group) { bool Vocabulary::loadSuffixes() { // Determine if we can find a SCI1 suffix vocabulary first - Resource* resource = NULL; - - if (_vocabVersion == kVocabularySCI0) - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI0_SUFFIX_VOCAB), 1); - else - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI1_SUFFIX_VOCAB), 1); - + Resource* resource = _resMan->findResource(ResourceId(kResourceTypeVocab, _resourceIdSuffixes), 1); if (!resource) return false; // No vocabulary found @@ -214,13 +218,7 @@ bool Vocabulary::loadSuffixes() { } void Vocabulary::freeSuffixes() { - Resource* resource = NULL; - - if (_vocabVersion == kVocabularySCI0) - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI0_SUFFIX_VOCAB), 0); - else - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI1_SUFFIX_VOCAB), 0); - + Resource* resource = _resMan->findResource(ResourceId(kResourceTypeVocab, _resourceIdSuffixes), 0); if (resource) _resMan->unlockResource(resource); @@ -228,12 +226,7 @@ void Vocabulary::freeSuffixes() { } bool Vocabulary::loadBranches() { - Resource *resource = NULL; - - if (_vocabVersion == kVocabularySCI0) - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI0_PARSE_TREE_BRANCHES), 0); - else - resource = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SCI1_PARSE_TREE_BRANCHES), 0); + Resource *resource = _resMan->findResource(ResourceId(kResourceTypeVocab, _resourceIdBranches), 0); _parserBranches.clear(); diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index 3317b6dfba..e637d8088a 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -169,7 +169,7 @@ enum VocabularyVersions { class Vocabulary { public: - Vocabulary(ResourceManager *resMan); + Vocabulary(ResourceManager *resMan, bool foreign); ~Vocabulary(); /** @@ -302,6 +302,11 @@ private: ResourceManager *_resMan; VocabularyVersions _vocabVersion; + bool _foreign; + uint16 _resourceIdWords; + uint16 _resourceIdSuffixes; + uint16 _resourceIdBranches; + // Parser-related lists SuffixList _parserSuffixes; ParseRuleList *_parserRules; /**< GNF rules used in the parser algorithm */ diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 4601092af8..11d1057fff 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -85,6 +85,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam _gamestate = 0; _kernel = 0; _vocabulary = 0; + _vocabularyLanguage = -1; _eventMan = 0; _console = 0; @@ -202,7 +203,7 @@ Common::Error SciEngine::run() { _kernel = new Kernel(_resMan, segMan); _features = new GameFeatures(segMan, _kernel); // Only SCI0 and SCI01 games used a parser - _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan) : NULL; + _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan, false) : NULL; _audio = new AudioPlayer(_resMan); _gamestate = new EngineState(segMan); _eventMan = new EventManager(_resMan->detectFontExtended()); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 4768ca11b9..c497460334 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -267,6 +267,9 @@ public: Common::String getSciLanguageString(const char *str, kLanguage lang, kLanguage *lang2 = NULL) const; + // Check if vocabulary needs to get switched (in multilingual parser games) + void checkVocabularySwitch(); + // Initializes ports and paint16 for non-sci32 games, also sets default palette void initGraphics(); @@ -332,6 +335,7 @@ private: EngineState *_gamestate; Kernel *_kernel; Vocabulary *_vocabulary; + int16 _vocabularyLanguage; EventManager *_eventMan; reg_t _gameObj; /**< Pointer to the game object */ Console *_console; -- cgit v1.2.3 From 9977e2db90bf26ae4d956d2a61063f2b62b18780 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 19 Jul 2010 14:28:46 +0000 Subject: GUI: Enhance ThemeEngine to find theme .zip files using SearchMan This is based on the Android specific patch found under: backends/platform/android/scummvm-android-themeengine.patch After some testing we should be able to get rid of that custom patch. svn-id: r51028 --- gui/ThemeEngine.cpp | 97 +++++++++++++++++++++++++++++++++++------------------ gui/ThemeEngine.h | 2 ++ 2 files changed, 67 insertions(+), 32 deletions(-) diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 30bacbb617..91e32ce1e8 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -44,10 +44,6 @@ #include "gui/ThemeEval.h" #include "gui/ThemeParser.h" -#if defined(MACOSX) || defined(IPHONE) -#include -#endif - #define GUI_ENABLE_BUILTIN_THEME namespace GUI { @@ -396,15 +392,23 @@ bool ThemeEngine::init() { // Try to create a Common::Archive with the files of the theme. if (!_themeArchive && !_themeFile.empty()) { Common::FSNode node(_themeFile); - if (node.getName().hasSuffix(".zip") && !node.isDirectory()) { - Common::Archive *zipArchive = Common::makeZipArchive(node); - - if (!zipArchive) { - warning("Failed to open Zip archive '%s'.", node.getPath().c_str()); - } - _themeArchive = zipArchive; - } else if (node.isDirectory()) { + if (node.isDirectory()) { _themeArchive = new Common::FSDirectory(node); + } else if (_themeFile.hasSuffix(".zip")) { + // TODO: Also use "node" directly? + // Look for the zip file via SearchMan + Common::ArchiveMemberPtr member = SearchMan.getMember(_themeFile); + if (member) { + _themeArchive = Common::makeZipArchive(member->createReadStream()); + if (!_themeArchive) { + warning("Failed to open Zip archive '%s'.", member->getDisplayName().c_str()); + } + } else { + _themeArchive = Common::makeZipArchive(node); + if (!_themeArchive) { + warning("Failed to open Zip archive '%s'.", node.getPath().c_str()); + } + } } } @@ -1553,6 +1557,28 @@ bool ThemeEngine::themeConfigParseHeader(Common::String header, Common::String & return tok.empty(); } +bool ThemeEngine::themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName) { + Common::File stream; + bool foundHeader = false; + + if (member.getName().hasSuffix(".zip")) { + Common::Archive *zipArchive = Common::makeZipArchive(member.createReadStream()); + + if (zipArchive && zipArchive->hasFile("THEMERC")) { + stream.open("THEMERC", *zipArchive); + } + + delete zipArchive; + } + + if (stream.isOpen()) { + Common::String stxHeader = stream.readLine(); + foundHeader = themeConfigParseHeader(stxHeader, themeName); + } + + return foundHeader; +} + bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String &themeName) { Common::File stream; bool foundHeader = false; @@ -1608,26 +1634,7 @@ void ThemeEngine::listUsableThemes(Common::List &list) { if (ConfMan.hasKey("themepath")) listUsableThemes(Common::FSNode(ConfMan.get("themepath")), list); -#ifdef DATA_PATH - listUsableThemes(Common::FSNode(DATA_PATH), list); -#endif - -#if defined(MACOSX) || defined(IPHONE) - CFURLRef resourceUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); - if (resourceUrl) { - char buf[256]; - if (CFURLGetFileSystemRepresentation(resourceUrl, true, (UInt8 *)buf, 256)) { - Common::FSNode resourcePath(buf); - listUsableThemes(resourcePath, list); - } - CFRelease(resourceUrl); - } -#endif - - if (ConfMan.hasKey("extrapath")) - listUsableThemes(Common::FSNode(ConfMan.get("extrapath")), list); - - listUsableThemes(Common::FSNode("."), list, 1); + listUsableThemes(SearchMan, list); // Now we need to strip all duplicates // TODO: It might not be the best idea to strip duplicates. The user might @@ -1646,6 +1653,32 @@ void ThemeEngine::listUsableThemes(Common::List &list) { output.clear(); } +void ThemeEngine::listUsableThemes(Common::Archive &archive, Common::List &list) { + ThemeDescriptor td; + + Common::ArchiveMemberList fileList; + archive.listMatchingMembers(fileList, "*.zip"); + for (Common::ArchiveMemberList::iterator i = fileList.begin(); + i != fileList.end(); ++i) { + td.name.clear(); + if (themeConfigUsable(**i, td.name)) { + td.filename = (*i)->getName(); + td.id = (*i)->getDisplayName(); + + // If the name of the node object also contains + // the ".zip" suffix, we will strip it. + if (td.id.hasSuffix(".zip")) { + for (int j = 0; j < 4; ++j) + td.id.deleteLastChar(); + } + + list.push_back(td); + } + } + + fileList.clear(); +} + void ThemeEngine::listUsableThemes(const Common::FSNode &node, Common::List &list, int depth) { if (!node.exists() || !node.isReadable() || !node.isDirectory()) return; diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index f0d4e2585d..3173aa4aca 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -583,11 +583,13 @@ public: static void listUsableThemes(Common::List &list); private: static bool themeConfigUsable(const Common::FSNode &node, Common::String &themeName); + static bool themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName); static bool themeConfigParseHeader(Common::String header, Common::String &themeName); static Common::String getThemeFile(const Common::String &id); static Common::String getThemeId(const Common::String &filename); static void listUsableThemes(const Common::FSNode &node, Common::List &list, int depth = -1); + static void listUsableThemes(Common::Archive &archive, Common::List &list); protected: OSystem *_system; /** Global system object. */ -- cgit v1.2.3 From cda55fe770ed71f5d4b00690ba4ea196ad4b533f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 14:50:37 +0000 Subject: SCI: parser now matches extended chars too fixes multilingual games not accepting words that contain extended chars (>= 0x80) svn-id: r51029 --- engines/sci/parser/vocabulary.cpp | 67 +++++++++++++++++++++++++-------------- engines/sci/parser/vocabulary.h | 4 ++- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index cb580017c4..82051a3ecd 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -83,9 +83,8 @@ Vocabulary::~Vocabulary() { } bool Vocabulary::loadParserWords() { - - char currentword[256] = ""; // They're not going to use words longer than 255 ;-) - int currentwordpos = 0; + char currentWord[VOCAB_MAX_WORDLENGTH] = ""; + int currentWordPos = 0; // First try to load the SCI0 vocab resource. Resource *resource = _resMan->findResource(ResourceId(kResourceTypeVocab, _resourceIdWords), 0); @@ -132,13 +131,13 @@ bool Vocabulary::loadParserWords() { while (seeker < resource->size) { byte c; - currentwordpos = resource->data[seeker++]; // Parts of previous words may be re-used + currentWordPos = resource->data[seeker++]; // Parts of previous words may be re-used if (resourceType == kVocabularySCI1) { c = 1; - while (seeker < resource->size && currentwordpos < 255 && c) { + while (seeker < resource->size && currentWordPos < 255 && c) { c = resource->data[seeker++]; - currentword[currentwordpos++] = c; + currentWord[currentWordPos++] = c; } if (seeker == resource->size) { warning("SCI1: Vocabulary not usable, disabling"); @@ -148,11 +147,11 @@ bool Vocabulary::loadParserWords() { } else { do { c = resource->data[seeker++]; - currentword[currentwordpos++] = c & 0x7f; // 0x80 is used to terminate the string + currentWord[currentWordPos++] = c & 0x7f; // 0x80 is used to terminate the string } while (c < 0x80); } - currentword[currentwordpos] = 0; + currentWord[currentWordPos] = 0; // Now decode class and group: c = resource->data[seeker + 1]; @@ -161,7 +160,7 @@ bool Vocabulary::loadParserWords() { newWord._group = (resource->data[seeker + 2]) | ((c & 0x0f) << 8); // Add the word to the list - _parserWords[currentword] = newWord; + _parserWords[currentWord] = newWord; seeker += 3; } @@ -259,7 +258,7 @@ bool Vocabulary::loadBranches() { return true; } - +// we assume that *word points to an already lowercased word ResultWord Vocabulary::lookupWord(const char *word, int word_len) { Common::String tempword(word, word_len); @@ -286,7 +285,7 @@ ResultWord Vocabulary::lookupWord(const char *word, int word_len) { int suff_index = word_len - suffix->alt_suffix_length; // Offset of the start of the suffix - if (scumm_strnicmp(suffix->alt_suffix, word + suff_index, suffix->alt_suffix_length) == 0) { // Suffix matched! + if (strncmp(suffix->alt_suffix, word + suff_index, suffix->alt_suffix_length) == 0) { // Suffix matched! // Terminate word at suffix start position...: Common::String tempword2(word, MIN(word_len, suff_index)); @@ -366,32 +365,55 @@ void Vocabulary::decipherSaidBlock(byte *addr) { printf("\n"); } +static const byte lowerCaseMap[256] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // 0x00 + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // 0x10 + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, // 0x20 + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, // 0x30 + 0x40, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', // 0x40 + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, // 0x50 + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, // 0x60 + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, // 0x70 + 0x87, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x84, 0x86, // 0x80 + //^^ ^^^^ ^^^^ + 0x82, 0x91, 0x91, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x94, 0x81, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, // 0x90 + //^^ ^^^^ ^^^^ ^^^^ + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, // 0xa0 + // ^^^^ + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, // 0xb0 + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, // 0xc0 + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, // 0xd0 + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, // 0xe0 + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff // 0xf0 +}; + bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, char **error) { - const char *lastword = sentence; + char currentWord[VOCAB_MAX_WORDLENGTH] = ""; int pos_in_sentence = 0; unsigned char c; - int wordlen = 0; + int wordLen = 0; *error = NULL; do { c = sentence[pos_in_sentence++]; - - if (isalnum(c) || (c == '-' && wordlen) || (c >= 0x80)) - ++wordlen; + if (isalnum(c) || (c == '-' && wordLen) || (c >= 0x80)) { + currentWord[wordLen] = lowerCaseMap[c]; + ++wordLen; + } // Continue on this word */ // Words may contain a '-', but may not // start with one. else { - if (wordlen) { // Finished a word? + if (wordLen) { // Finished a word? - ResultWord lookup_result = lookupWord(lastword, wordlen); + ResultWord lookup_result = lookupWord(currentWord, wordLen); // Look it up if (lookup_result._class == -1) { // Not found? - *error = (char *)calloc(wordlen + 1, 1); - strncpy(*error, lastword, wordlen); // Set the offending word + *error = (char *)calloc(wordLen + 1, 1); + strncpy(*error, currentWord, wordLen); // Set the offending word retval.clear(); return false; // And return with error } @@ -400,8 +422,7 @@ bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, ch retval.push_back(lookup_result); } - lastword = sentence + pos_in_sentence; - wordlen = 0; + wordLen = 0; } } while (c); // Until terminator is hit @@ -410,7 +431,7 @@ bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, ch } void Vocabulary::printSuffixes() const { - char word_buf[256], alt_buf[256]; + char word_buf[VOCAB_MAX_WORDLENGTH], alt_buf[VOCAB_MAX_WORDLENGTH]; Console *con = g_sci->getSciDebugger(); int i = 0; diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index e637d8088a..80ed68547d 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -73,6 +73,8 @@ enum { kParseNumber = 4 }; +#define VOCAB_MAX_WORDLENGTH 256 + /* Anywords are ignored by the parser */ #define VOCAB_CLASS_ANYWORD 0xff @@ -116,7 +118,7 @@ struct ResultWord { typedef Common::List ResultWordList; -typedef Common::HashMap WordMap; +typedef Common::HashMap WordMap; struct ParseRuleList; -- cgit v1.2.3 From b7b904f9814ca0644a8fea1a3fb9250a4a4fbbd5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 15:30:27 +0000 Subject: SCI: fix regression of r51027 we have to reset the parser when switching vocabulary svn-id: r51031 --- engines/sci/engine/state.cpp | 1 + engines/sci/parser/vocabulary.cpp | 6 ++++++ engines/sci/parser/vocabulary.h | 3 +++ engines/sci/sci.cpp | 4 +--- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index e07373b466..a069344d61 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -332,6 +332,7 @@ void SciEngine::checkVocabularySwitch() { if (parserLanguage != _vocabularyLanguage) { delete _vocabulary; _vocabulary = new Vocabulary(_resMan, parserLanguage > 1 ? true : false); + _vocabulary->reset(); _vocabularyLanguage = parserLanguage; } } diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 82051a3ecd..b4bd4dcb16 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -82,6 +82,12 @@ Vocabulary::~Vocabulary() { freeSuffixes(); } +void Vocabulary::reset() { + parserIsValid = false; // Invalidate parser + parser_event = NULL_REG; // Invalidate parser event + parser_base = make_reg(g_sci->getEngineState()->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); +} + bool Vocabulary::loadParserWords() { char currentWord[VOCAB_MAX_WORDLENGTH] = ""; int currentWordPos = 0; diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index 80ed68547d..5c8c8fd57d 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -174,6 +174,9 @@ public: Vocabulary(ResourceManager *resMan, bool foreign); ~Vocabulary(); + // reset parser status + void reset(); + /** * Gets any word from the specified group. For debugging only. * @param group Group number diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 11d1057fff..4b467a7578 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -301,9 +301,7 @@ bool SciEngine::initGame() { // Reset parser if (_vocabulary) { - _vocabulary->parserIsValid = false; // Invalidate parser - _vocabulary->parser_event = NULL_REG; // Invalidate parser event - _vocabulary->parser_base = make_reg(_gamestate->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); + _vocabulary->reset(); } _gamestate->gameStartTime = _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis(); -- cgit v1.2.3 From 95ae668da0399c9cd89bb03d42bdea83eb8829f9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 15:32:26 +0000 Subject: SCI: don't initialize vocabulary twice svn-id: r51032 --- engines/sci/sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 4b467a7578..a39f1113a9 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -85,7 +85,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam _gamestate = 0; _kernel = 0; _vocabulary = 0; - _vocabularyLanguage = -1; + _vocabularyLanguage = 1; // we load english vocabulary on startup _eventMan = 0; _console = 0; -- cgit v1.2.3 From f4a5714477725b7e3016dd1271f65ee7aac0d91f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 16:01:16 +0000 Subject: SCI: make sci0 foreign vocabulary also work makes pq2 load japanese vocabulary too svn-id: r51033 --- engines/sci/parser/vocabulary.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index b4bd4dcb16..a266ba74c1 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -55,11 +55,11 @@ Vocabulary::Vocabulary(ResourceManager *resMan, bool foreign) : _resMan(resMan), _resourceIdWords = VOCAB_RESOURCE_SCI1_MAIN_VOCAB; _resourceIdSuffixes = VOCAB_RESOURCE_SCI1_SUFFIX_VOCAB; _resourceIdBranches = VOCAB_RESOURCE_SCI1_PARSE_TREE_BRANCHES; - if (_foreign) { - _resourceIdWords += 10; - _resourceIdSuffixes += 10; - _resourceIdBranches += 10; - } + } + if (_foreign) { + _resourceIdWords += 10; + _resourceIdSuffixes += 10; + _resourceIdBranches += 10; } if (getSciVersion() <= SCI_VERSION_1_EGA && loadParserWords()) { -- cgit v1.2.3 From f4a32793c0d63aba21c960c02f1eec325a1ede94 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 16:47:31 +0000 Subject: SCI: dont fix list control in sq4 sierra fixed this problem by having an up cursor starting one pixel-line later, adjusting in that case would be wrong svn-id: r51034 --- engines/sci/graphics/controls.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp index 126b163e38..5891413be8 100644 --- a/engines/sci/graphics/controls.cpp +++ b/engines/sci/graphics/controls.cpp @@ -75,7 +75,9 @@ void GfxControls::drawListControl(Common::Rect rect, reg_t obj, int16 maxChars, // draw UP/DOWN arrows // we draw UP arrow one pixel lower than sierra did, because it looks nicer. Also the DOWN arrow has one pixel // line inbetween as well - workerRect.top++; + // They "fixed" this in SQ4 by having the arrow character start one pixel line later, we don't adjust there + if (g_sci->getGameId() != GID_SQ4) + workerRect.top++; _text16->Box(controlListUpArrow, 0, workerRect, SCI_TEXT16_ALIGNMENT_CENTER, 0); workerRect.top = workerRect.bottom - 10; _text16->Box(controlListDownArrow, 0, workerRect, SCI_TEXT16_ALIGNMENT_CENTER, 0); -- cgit v1.2.3 From 6240e5353e1b26e78893bf2b7bca182b00fcd379 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 17:27:56 +0000 Subject: SCI: kDoBresen - check xLast/yLast selectors fixed mixed-up fairy tales demo svn-id: r51035 --- engines/sci/engine/kmovement.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index f94750110c..f6e6790e66 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -268,9 +268,12 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { axis = (int16)readSelectorValue(segMan, mover, SELECTOR(b_xAxis)); if ((getSciVersion() >= SCI_VERSION_1_LATE)) { - // save last position into mover - writeSelectorValue(segMan, mover, SELECTOR(xLast), x); - writeSelectorValue(segMan, mover, SELECTOR(yLast), y); + // Mixed-Up Fairy Tales has no xLast/yLast selectors + if (SELECTOR(xLast) != -1) { + // save last position into mover + writeSelectorValue(segMan, mover, SELECTOR(xLast), x); + writeSelectorValue(segMan, mover, SELECTOR(yLast), y); + } } //printf("movecnt %d, move speed %d\n", movcnt, max_movcnt); -- cgit v1.2.3 From 5b4ce3831c91d89c1214f412d90c4d36fc84932d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 19:14:37 +0000 Subject: SCI: adding 2 uninit workarounds for hoyle1 svn-id: r51036 --- engines/sci/engine/vm.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 419acd3871..bd92b18d82 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -382,6 +382,8 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { 0, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { 0, 0 } }, // Cribbage / during the game { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { 0, 0 } }, // when starting checkers, first time a character says something { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { 0, 0 } }, // when starting checkers, first time a character says something { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { 0, 0 } }, // when entering control menu -- cgit v1.2.3 From cef2e24edc8ec6b8c6d2674eedf3222ab1745d85 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 20:13:17 +0000 Subject: SCI: fixing comment svn-id: r51037 --- engines/sci/engine/kevent.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 7547ad5ab6..635dd7653a 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -150,11 +150,11 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { } if (g_sci->_features->detectDoSoundType() <= SCI_VERSION_0_LATE) { - // If we're running a SCI0 game, update the sound cues, to compensate - // for the fact that SCI0 does not poll to update the sound cues itself, - // like SCI01 and later do with cmdUpdateSoundCues. kGetEvent is called - // quite often, so emulate the SCI01 behavior of cmdUpdateSoundCues with - // this call + // If we're running a sound-SCI0 game, update the sound cues, to + // compensate for the fact that sound-SCI0 does not poll to update + // the sound cues itself, like sound-SCI1 and later do with + // cmdUpdateSoundCues. kGetEvent is called quite often, so emulate + // the sound-SCI1 behavior of cmdUpdateSoundCues with this call g_sci->_soundCmd->updateSci0Cues(); } -- cgit v1.2.3 From 961079ae195c200020b577d8f7f6a87f2eaac03f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 19 Jul 2010 22:11:06 +0000 Subject: SCI: disabling kDoSound(StopAll) this call can't be right, gets called in kq1 several times and would stop background effects svn-id: r51039 --- engines/sci/sound/soundcmd.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 9312df5c80..8e750def4a 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -497,6 +497,11 @@ reg_t SoundCommandParser::kDoSoundGetAudioCapability(int argc, reg_t *argv, reg_ } reg_t SoundCommandParser::kDoSoundStopAll(int argc, reg_t *argv, reg_t acc) { + // TODO: this can't be right, this gets called in kq1 - e.g. being in witch house, getting the note + // now the point jingle plays and after a messagebox they call this - and would stop the background effects with it + // this doesn't make sense, so i disable it for now + return acc; + Common::StackLock(_music->_mutex); const MusicList::iterator end = _music->getPlayListEnd(); -- cgit v1.2.3 From 211fcfe7bab49ceeb5e81f4dcb1be7e73c58d7c9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 20 Jul 2010 08:24:34 +0000 Subject: MIDI: Build and use ALSA driver if and only if USE_ALSA is defined svn-id: r51053 --- backends/midi/alsa.cpp | 2 +- base/plugins.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 076655bfed..a895ef8b80 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -24,7 +24,7 @@ #include "common/scummsys.h" -#if defined(UNIX) && defined(USE_ALSA) +#if defined(USE_ALSA) #include "common/config-manager.h" #include "common/util.h" diff --git a/base/plugins.cpp b/base/plugins.cpp index 29383f1009..f23fbb48d8 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -172,7 +172,7 @@ public: #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) LINK_PLUGIN(WINDOWS) #endif - #if defined(UNIX) && defined(USE_ALSA) + #if defined(USE_ALSA) LINK_PLUGIN(ALSA) #endif #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) -- cgit v1.2.3 From e527ad162f3fb69508947f7229d7b98f8aceafed Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 20 Jul 2010 08:24:48 +0000 Subject: BUILD: Enhance configure code, add (unfinished) USE_SEQ_MIDI support * Remove unused add_to_config_mk_if_no() * Add two new functions: define_in_config_h_if_yes() and define_in_config_if_yes(). These make it much more convenient to #define something in config.h, or in both config.h and config.mk simultaneously. * Convert configure code to use the two new functions, were appropriate. * Add preliminary USE_SEQ_MIDI support, as discussed on scummvm-devel. This is incomplete as it does not actually detect anything, it just allows turning off _seq support. svn-id: r51054 --- configure | 166 ++++++++++++++++++++++++-------------------------------------- 1 file changed, 65 insertions(+), 101 deletions(-) diff --git a/configure b/configure index 0a498c82c1..e34724c0f9 100755 --- a/configure +++ b/configure @@ -119,6 +119,7 @@ _tremor=auto _flac=auto _mad=auto _alsa=auto +_seq=auto _zlib=auto _mpeg2=no _fluidsynth=auto @@ -267,6 +268,10 @@ add_line_to_config_h() { '"$1" } +# Conditionally add a line of data to config.h. Takes two parameters: +# The first one can be set to 'no' to "comment out" the line, i.e. +# make it ineffective, use 'yes' otherwise. +# The second param is the line to insert. add_to_config_h_if_yes() { if test "$1" = yes ; then add_line_to_config_h "$2" @@ -287,15 +292,28 @@ add_to_config_mk_if_yes() { fi } -# Conditionally add a line of data to config.mk. Takes two parameters: -# The first one can be set to 'yes' to "comment out" the line, i.e. -# make it ineffective, use 'no' otherwise. -# The second param is the line to insert. -add_to_config_mk_if_no() { - if test "$1" = no ; then - add_line_to_config_mk "$2" +# Conditionally add a '#define' line to config.h. Takes two parameters: +# The first one can be set to 'yes' or 'no'. If 'yes' is used, then +# the line "#define $2" is added to config.h, otherwise "#undef $2". +define_in_config_h_if_yes() { + if test "$1" = yes ; then + add_line_to_config_h "#define $2" else - add_line_to_config_mk "# $2" + add_line_to_config_h "#undef $2" + fi +} + +# Conditionally add definitions to config.h and config.mk. Takes two parameters: +# The first one can be set to 'yes' or 'no'. If 'yes' is used, then +# the line "#define $2" is added to config.h and "$2 = 1" to config.mk. +# Otherwise "#undef $2" is added to config.h and "# $2 = 1" to config.mk +define_in_config_if_yes() { + if test "$1" = yes ; then + add_line_to_config_h "#define $2" + add_line_to_config_mk "$2 = 1" + else + add_line_to_config_h "#undef $2" + add_line_to_config_mk "# $2 = 1" fi } @@ -740,6 +758,8 @@ for ac_option in $@; do --disable-hq-scalers) _build_hq_scalers=no ;; --enable-alsa) _alsa=yes ;; --disable-alsa) _alsa=no ;; + --enable-seq-midi) _seq=yes ;; + --disable-seq-midi) _seq=no ;; --enable-vorbis) _vorbis=yes ;; --disable-vorbis) _vorbis=no ;; --enable-tremor) _tremor=yes ;; @@ -1768,21 +1788,21 @@ esac # case $_endian in big) - add_line_to_config_h '/* #define SCUMM_LITTLE_ENDIAN */' + add_line_to_config_h '#undef SCUMM_LITTLE_ENDIAN' add_line_to_config_h '#define SCUMM_BIG_ENDIAN' ;; little) add_line_to_config_h '#define SCUMM_LITTLE_ENDIAN' - add_line_to_config_h '/* #define SCUMM_BIG_ENDIAN */' + add_line_to_config_h '#undef SCUMM_BIG_ENDIAN' ;; *) exit 1 ;; esac -add_to_config_h_if_yes $_have_x86 '#define HAVE_X86' +define_in_config_h_if_yes $_have_x86 'HAVE_X86' -add_to_config_h_if_yes $_need_memalign '#define SCUMM_NEED_ALIGNMENT' +define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' # # Check whether to enable a verbose build @@ -1934,40 +1954,22 @@ fi # # Check whether integrated MT-32 emulator support is requested # -if test "$_mt32emu" = no ; then - _def_mt32emu='#undef USE_MT32EMU' -else - _def_mt32emu='#define USE_MT32EMU' -fi -add_to_config_mk_if_yes "$_mt32emu" 'USE_MT32EMU = 1' +define_in_config_if_yes "$_mt32emu" 'USE_MT32EMU' # # Check whether 16bit color support is requested # -if test "$_16bit" = no ; then - _def_16bit='#undef USE_RGB_COLOR' -else - _def_16bit='#define USE_RGB_COLOR' -fi -add_to_config_mk_if_yes "$_16bit" 'USE_RGB_COLOR = 1' +define_in_config_if_yes "$_16bit" 'USE_RGB_COLOR' # # Check whether to enable the (hq) scalers # if test "$_build_scalers" = no ; then _build_hq_scalers=no - _def_scalers='#undef USE_SCALERS' -else - _def_scalers='#define USE_SCALERS' fi -add_to_config_mk_if_yes "$_build_scalers" 'USE_SCALERS = 1' +define_in_config_if_yes "$_build_scalers" 'USE_SCALERS' -if test "$_build_hq_scalers" = no ; then - _def_hq_scalers='#undef USE_HQ_SCALERS' -else - _def_hq_scalers='#define USE_HQ_SCALERS' -fi -add_to_config_mk_if_yes "$_build_hq_scalers" 'USE_HQ_SCALERS = 1' +define_in_config_if_yes "$_build_hq_scalers" 'USE_HQ_SCALERS' # # Check whether to compile the Indeo3 decoder @@ -1980,12 +1982,7 @@ if test "$_indeo3" = auto ; then _indeo3="no" fi fi -if test "$_indeo3" = no ; then - _def_indeo3='#undef USE_INDEO3' -else - _def_indeo3='#define USE_INDEO3' -fi -add_to_config_mk_if_yes "$_indeo3" 'USE_INDEO3 = 1' +define_in_config_if_yes "$_indeo3" 'USE_INDEO3' # # Check for math lib @@ -2009,13 +2006,10 @@ EOF -lvorbisfile -lvorbis -logg && _vorbis=yes fi if test "$_vorbis" = yes ; then - _def_vorbis='#define USE_VORBIS' LIBS="$LIBS $OGG_LIBS $VORBIS_LIBS -lvorbisfile -lvorbis -logg" INCLUDES="$INCLUDES $OGG_CFLAGS $VORBIS_CFLAGS" -else - _def_vorbis='#undef USE_VORBIS' fi -add_to_config_mk_if_yes "$_vorbis" 'USE_VORBIS = 1' +define_in_config_if_yes "$_vorbis" 'USE_VORBIS' echo "$_vorbis" # @@ -2032,15 +2026,15 @@ EOF _tremor=yes fi if test "$_tremor" = yes && test "$_vorbis" = no; then - _def_tremor='#define USE_TREMOR' - _def_vorbis='#define USE_VORBIS' + add_line_to_config_h '#define USE_TREMOR' + add_line_to_config_h '#define USE_VORBIS' LIBS="$LIBS $TREMOR_LIBS -lvorbisidec" INCLUDES="$INCLUDES $TREMOR_CFLAGS" else if test "$_vorbis" = yes; then _tremor="no (Ogg Vorbis/Tremor support is mutually exclusive)" fi - _def_tremor='#undef USE_TREMOR' + add_line_to_config_h '#undef USE_TREMOR' fi add_to_config_mk_if_yes "$_tremor" 'USE_TREMOR = 1' echo "$_tremor" @@ -2064,17 +2058,14 @@ EOF fi fi if test "$_flac" = yes ; then - _def_flac='#define USE_FLAC' if test "$_vorbis" = yes ; then LIBS="$LIBS $FLAC_LIBS $OGG_LIBS -lFLAC -logg" else LIBS="$LIBS $FLAC_LIBS -lFLAC" fi INCLUDES="$INCLUDES $FLAC_CFLAGS" -else - _def_flac='#undef USE_FLAC' fi -add_to_config_mk_if_yes "$_flac" 'USE_FLAC = 1' +define_in_config_if_yes "$_flac" 'USE_FLAC' echo "$_flac" # @@ -2090,13 +2081,10 @@ EOF cc_check $MAD_CFLAGS $MAD_LIBS -lmad && _mad=yes fi if test "$_mad" = yes ; then - _def_mad='#define USE_MAD' LIBS="$LIBS $MAD_LIBS -lmad" INCLUDES="$INCLUDES $MAD_CFLAGS" -else - _def_mad='#undef USE_MAD' fi -add_to_config_mk_if_yes "$_mad" 'USE_MAD = 1' +define_in_config_if_yes "$_mad" 'USE_MAD' echo "$_mad" # @@ -2112,14 +2100,25 @@ EOF cc_check $ALSA_CFLAGS $ALSA_LIBS -lasound && _alsa=yes fi if test "$_alsa" = yes ; then - _def_alsa='#define USE_ALSA' LIBS="$LIBS $ALSA_LIBS -lasound" INCLUDES="$INCLUDES $ALSA_CFLAGS" -else - _def_alsa='#undef USE_ALSA' fi +define_in_config_h_if_yes "$_alsa" 'USE_ALSA' echo "$_alsa" +# +# Check for SEQ MIDI +# +echocheck "SEQ MIDI" +if test "$_seq" = auto ; then + _seq=no + # TODO: Test for /dev/sequencer presence? Or maybe just for /dev ? + # Or maybe imitate the old check? Here it is: + # #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) +fi +define_in_config_h_if_yes "$_seq" 'USE_SEQ_MIDI' +echo "$_seq" + # # Check for ZLib # @@ -2134,13 +2133,10 @@ EOF cc_check $ZLIB_CFLAGS $ZLIB_LIBS -lz && _zlib=yes fi if test "$_zlib" = yes ; then - _def_zlib='#define USE_ZLIB' LIBS="$LIBS $ZLIB_LIBS -lz" INCLUDES="$INCLUDES $ZLIB_CFLAGS" -else - _def_zlib='#undef USE_ZLIB' fi -add_to_config_mk_if_yes "$_zlib" 'USE_ZLIB = 1' +define_in_config_if_yes "$_zlib" 'USE_ZLIB' echo "$_zlib" # @@ -2180,13 +2176,10 @@ EOF fi fi if test "$_mpeg2" = yes ; then - _def_mpeg2='#define USE_MPEG2' INCLUDES="$INCLUDES $MPEG2_CFLAGS" LIBS="$LIBS $MPEG2_LIBS -lmpeg2" -else - _def_mpeg2='#undef USE_MPEG2' fi -add_to_config_mk_if_yes "$_mpeg2" 'USE_MPEG2 = 1' +define_in_config_if_yes "$_mpeg2" 'USE_MPEG2' echo "$_mpeg2" # @@ -2202,7 +2195,6 @@ EOF cc_check $FLUIDSYNTH_CFLAGS $FLUIDSYNTH_LIBS -lfluidsynth && _fluidsynth=yes fi if test "$_fluidsynth" = yes ; then - _def_fluidsynth='#define USE_FLUIDSYNTH' case $_host_os in mingw*) LIBS="$LIBS $FLUIDSYNTH_LIBS -lfluidsynth -ldsound -lwinmm" @@ -2212,9 +2204,8 @@ if test "$_fluidsynth" = yes ; then ;; esac INCLUDES="$INCLUDES $FLUIDSYNTH_CFLAGS" -else - _def_fluidsynth='#undef USE_FLUIDSYNTH' fi +define_in_config_h_if_yes "$_fluidsynth" 'USE_FLUIDSYNTH' echo "$_fluidsynth" # @@ -2247,18 +2238,12 @@ else fi if test "$_readline" = yes ; then - _def_readline='#define USE_READLINE' LIBS="$LIBS $READLINE_LIBS $_READLINE_LIBS" INCLUDES="$INCLUDES $READLINE_CFLAGS" -else - _def_readline='#undef USE_READLINE' fi +define_in_config_h_if_yes "$_readline" 'USE_READLINE' -if test "$_text_console" = yes ; then - _def_text_console='#define USE_TEXT_CONSOLE' -else - _def_text_console='#undef USE_TEXT_CONSOLE' -fi +define_in_config_h_if_yes "$_text_console" 'USE_TEXT_CONSOLE' # # Check for nasm @@ -2316,8 +2301,7 @@ if test "$_have_x86" = yes ; then fi fi -add_to_config_h_if_yes $_nasm '#define USE_NASM' -add_to_config_mk_if_yes $_nasm 'USE_NASM = 1' +define_in_config_if_yes $_nasm 'USE_NASM' # # Enable vkeybd / keymapper @@ -2332,8 +2316,7 @@ fi # Check whether to build translation support # echo_n "Building translation support... " -add_to_config_mk_if_yes $_translation 'USE_TRANSLATION = 1' -add_to_config_h_if_yes $_translation '#define USE_TRANSLATION' +define_in_config_if_yes $_translation 'USE_TRANSLATION' if test "$_translation" = no ; then echo "no" else @@ -2346,7 +2329,7 @@ EOF _detectlang=no cc_check $LDFLAGS $CXXFLAGS && _detectlang=yes - add_to_config_h_if_yes $_detectlang '#define USE_DETECTLANG' + define_in_config_h_if_yes $_detectlang 'USE_DETECTLANG' if test "$_detectlang" = yes ; then echo "with runtime language detection)" else @@ -2675,25 +2658,6 @@ typedef signed $type_1_byte int8; typedef signed $type_2_byte int16; typedef signed $type_4_byte int32; -/* Libs */ -$_def_vorbis -$_def_tremor -$_def_flac -$_def_mad -$_def_alsa -$_def_zlib -$_def_mpeg2 -$_def_fluidsynth -$_def_readline - -/* Options */ -$_def_text_console -$_def_mt32emu -$_def_indeo3 -$_def_16bit -$_def_scalers -$_def_hq_scalers - /* Plugin settings */ $_def_plugin -- cgit v1.2.3 From 37aa8a7499e6aa1698beb7e241c42ba19475a83a Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 20 Jul 2010 08:25:13 +0000 Subject: BUILD: Unify adding -DUNIX to DEFINES; complete SEQ MIDI detection * Added a yes/no variable _unix to configure, which controls when -DUNIX is added to DEFINES * Enable SEQ MIDI via _seq_midi by default on UNIX type systems, except for those which override that. * Switch SEQ MIDI code to check #define USE_SEQ_MIDI (alternatively, we could compile it only conditionally...) svn-id: r51055 --- backends/midi/seq.cpp | 2 +- base/plugins.cpp | 2 +- base/version.cpp | 4 +++ configure | 95 ++++++++++++++++++++++++++++++++++----------------- 4 files changed, 69 insertions(+), 34 deletions(-) diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index b1815adee5..06685df59a 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -28,7 +28,7 @@ * both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html) */ -#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) +#if defined(USE_SEQ_MIDI) #include "common/util.h" #include "sound/musicplugin.h" diff --git a/base/plugins.cpp b/base/plugins.cpp index f23fbb48d8..5d0be11065 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -175,7 +175,7 @@ public: #if defined(USE_ALSA) LINK_PLUGIN(ALSA) #endif - #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) + #if defined(USE_SEQ_MIDI) LINK_PLUGIN(SEQ) #endif #if defined(__MINT__) diff --git a/base/version.cpp b/base/version.cpp index ad74c64265..0e7f62f80f 100644 --- a/base/version.cpp +++ b/base/version.cpp @@ -86,6 +86,10 @@ const char *gScummVMFeatures = "" "ALSA " #endif +#ifdef USE_ALSA + "SEQ " +#endif + #ifdef USE_RGB_COLOR "RGB " #endif diff --git a/configure b/configure index e34724c0f9..4326bc1e46 100755 --- a/configure +++ b/configure @@ -119,7 +119,7 @@ _tremor=auto _flac=auto _mad=auto _alsa=auto -_seq=auto +_seq_midi=auto _zlib=auto _mpeg2=no _fluidsynth=auto @@ -134,6 +134,7 @@ _build_scalers=yes _build_hq_scalers=yes _indeo3=auto _enable_prof=no +_unix=no # Default vkeybd/keymapper options _vkeybd=no _keymapper=no @@ -758,8 +759,8 @@ for ac_option in $@; do --disable-hq-scalers) _build_hq_scalers=no ;; --enable-alsa) _alsa=yes ;; --disable-alsa) _alsa=no ;; - --enable-seq-midi) _seq=yes ;; - --disable-seq-midi) _seq=no ;; + --enable-seq-midi) _seq_midi=yes ;; + --disable-seq-midi) _seq_midi=no ;; --enable-vorbis) _vorbis=yes ;; --disable-vorbis) _vorbis=no ;; --enable-tremor) _tremor=yes ;; @@ -1349,32 +1350,35 @@ case $_host_os in type_4_byte='long' ;; beos*) - DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver LDFLAGS="-L/boot/home/config/lib" CFLAGS="-I/boot/home/config/include" CXXFLAGS="$CXXFLAGS -fhuge-objects" LIBS="$LIBS -lbind -lsocket" + _unix=yes + _seq_midi=no ;; bsd* | hpux* | netbsd* | openbsd* | sunos*) - DEFINES="$DEFINES -DUNIX" + _unix=yes ;; cygwin*) echo ERROR: Cygwin building is not supported by ScummVM anymore. Consider using MinGW. exit 1 ;; darwin*) - DEFINES="$DEFINES -DUNIX -DMACOSX" + DEFINES="$DEFINES -DMACOSX" LIBS="$LIBS -framework AudioUnit -framework AudioToolbox -framework Carbon -framework CoreMIDI" add_line_to_config_mk 'MACOSX = 1' + _unix=yes ;; dreamcast) DEFINES="$DEFINES -D__DC__ -DNONSTANDARD_PORT" ;; freebsd*) - DEFINES="$DEFINES -DUNIX" LDFLAGS="$LDFLAGS -L/usr/local/lib" CXXFLAGS="$CXXFLAGS -I/usr/local/include" + _unix=yes ;; gamecube) CXXFLAGS="$CXXFLAGS -Os -mogc -mcpu=750 -meabi -mhard-float" @@ -1384,15 +1388,18 @@ case $_host_os in LDFLAGS="$LDFLAGS -mogc -mcpu=750 -L$DEVKITPRO/libogc/lib/cube -L$DEVKITPRO/cube/lib -logc" ;; haiku*) - DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lnetwork for the timidity MIDI driver LIBS="$LIBS -lnetwork" CXXFLAGS="$CXXFLAGS -fhuge-objects" + _unix=yes + _seq_midi=no ;; irix*) - DEFINES="$DEFINES -DUNIX -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" LIBS="$LIBS -lmd -lfastm -lm" _ranlib=: + _unix=yes ;; linux* | uclinux*) # When not cross-compiling, enable large file support, but don't @@ -1400,7 +1407,7 @@ case $_host_os in if test -z "$_host"; then CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)" fi - DEFINES="$DEFINES -DUNIX" + _unix=yes ;; mingw*) DEFINES="$DEFINES -DWIN32 -D__USE_MINGW_ANSI_STDIO=0" @@ -1408,7 +1415,8 @@ case $_host_os in OBJS="$OBJS scummvmico.o" ;; mint*) - DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" + _unix=yes ;; ds) # TODO Nintendo DS @@ -1420,7 +1428,7 @@ case $_host_os in LIBS="$LIBS -lnds9" ;; os2-emx*) - DEFINES="$DEFINES -DUNIX" + _unix=yes # FIXME??? Why?? ;; ps2) # TODO ps2 @@ -1431,9 +1439,10 @@ case $_host_os in CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include -D_PSP_FW_VERSION=150" ;; solaris*) - DEFINES="$DEFINES -DUNIX -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver LIBS="$LIBS -lnsl -lsocket" + _unix=yes ;; wii) CXXFLAGS="$CXXFLAGS -Os -mrvl -mcpu=750 -meabi -mhard-float" @@ -1448,14 +1457,15 @@ case $_host_os in DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" ;; android) - DEFINES="$DEFINES -DUNIX" CXXFLAGS="$CXXFLAGS -Os -msoft-float -mtune=xscale -march=armv5te -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__" add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" + _unix=yes + _seq_midi=no ;; # given this is a shell script assume some type of unix *) echo "WARNING: could not establish system type, assuming unix like" - DEFINES="$DEFINES -DUNIX" + _unix=yes ;; esac @@ -1464,7 +1474,7 @@ if test -n "$_host"; then echo "Cross-compiling to $_host" case "$_host" in arm-linux|arm*-linux-gnueabi|arm-*-linux) - DEFINES="$DEFINES -DUNIX" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1473,7 +1483,8 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' ;; arm-riscos|linupy) - DEFINES="$DEFINES -DUNIX -DLINUPY" + DEFINES="$DEFINES -DLINUPY" + _unix=yes _need_memalign=yes ;; bfin*) @@ -1508,10 +1519,11 @@ if test -n "$_host"; then add_line_to_config_h "/* #define DEBUG_WII_GDB */" ;; gp2x) - DEFINES="$DEFINES -DUNIX -DGP2X -DNDEBUG" + DEFINES="$DEFINES -DGP2X -DNDEBUG" CXXFLAGS="$CXXFLAGS -march=armv4t" ASFLAGS="$ASFLAGS -mfloat-abi=soft" LDFLAGS="$LDFLAGS -static" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1522,12 +1534,14 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _seq_midi=no _port_mk="backends/platform/gp2x/gp2x-bundle.mk" ;; gp2xwiz) - DEFINES="$DEFINES -DUNIX -DGP2XWIZ -DNDEBUG" + DEFINES="$DEFINES -DGP2XWIZ -DNDEBUG" CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s" ASFLAGS="$ASFLAGS -mfloat-abi=soft" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1538,22 +1552,27 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _seq_midi=no _port_mk="backends/platform/gp2xwiz/gp2xwiz-bundle.mk" ;; iphone) - DEFINES="$DEFINES -DIPHONE -DUNIX" + DEFINES="$DEFINES -DIPHONE" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' _backend="iphone" _build_hq_scalers="no" + _seq_midi=no ;; m68k-atari-mint) - DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" + _unix=yes _endian=big _need_memalign=yes _ranlib=m68k-atari-mint-ranlib _ar="m68k-atari-mint-ar cru" + _seq_midi=no ;; *mingw32*) _sdlconfig=$_host-sdl-config @@ -1566,8 +1585,9 @@ if test -n "$_host"; then _need_memalign=yes ;; motoezx) - DEFINES="$DEFINES -DUNIX -DMOTOEZX" + DEFINES="$DEFINES -DMOTOEZX" ASFLAGS="$ASFLAGS -mfpu=vfp" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1578,11 +1598,13 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _seq_midi=no _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; motomagx) - DEFINES="$DEFINES -DUNIX -DMOTOMAGX" + DEFINES="$DEFINES -DMOTOMAGX" ASFLAGS="$ASFLAGS -mfpu=vfp" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1593,6 +1615,7 @@ if test -n "$_host"; then _build_hq_scalers="no" _mt32emu="no" _vkeybd="yes" + _seq_midi=no _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; ds) @@ -1614,7 +1637,8 @@ if test -n "$_host"; then _port_mk="backends/platform/ds/ds.mk" ;; neuros) - DEFINES="$DEFINES -DUNIX -DNEUROS" + DEFINES="$DEFINES -DNEUROS" + _unix=yes _need_memalign=yes _backend='null' _build_hq_scalers="no" @@ -1661,9 +1685,10 @@ if test -n "$_host"; then _port_mk="backends/platform/psp/psp.mk" ;; samsungtv) - DEFINES="$DEFINES -DUNIX -DSAMSUNGTV -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DSAMSUNGTV -DDISABLE_COMMAND_LINE" ASFLAGS="$ASFLAGS -mfpu=vfp" HOSTEXEEXT=".so" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1702,7 +1727,8 @@ if test -n "$_host"; then _port_mk="backends/platform/wince/wince.mk" ;; android) - DEFINES="$DEFINES -DANDROID -DUNIX -DUSE_ARM_SMUSH_ASM" + DEFINES="$DEFINES -DANDROID -DUSE_ARM_SMUSH_ASM" + _unix=yes _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' @@ -1711,6 +1737,7 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' _backend="android" _port_mk="backends/platform/android/android.mk" + _seq_midi=no ;; *) echo "WARNING: Unknown target, continuing with auto-detected values" @@ -1804,6 +1831,10 @@ define_in_config_h_if_yes $_have_x86 'HAVE_X86' define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' +if test "$_unix" = yes ; then + DEFINES="$DEFINES -DUNIX" +fi + # # Check whether to enable a verbose build # @@ -2110,14 +2141,14 @@ echo "$_alsa" # Check for SEQ MIDI # echocheck "SEQ MIDI" -if test "$_seq" = auto ; then - _seq=no +if test "$_seq_midi" = auto ; then # TODO: Test for /dev/sequencer presence? Or maybe just for /dev ? - # Or maybe imitate the old check? Here it is: - # #if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) + # For now, we just always enable it when "unix" mode is on (backends + # that do not want it can disable it by setting _seq_midi=no). + _seq_midi="$_unix" fi -define_in_config_h_if_yes "$_seq" 'USE_SEQ_MIDI' -echo "$_seq" +define_in_config_h_if_yes "$_seq_midi" 'USE_SEQ_MIDI' +echo "$_seq_midi" # # Check for ZLib -- cgit v1.2.3 From 5b3f31feec43db358c1ad9bb38a7e602b5a90bb0 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 20 Jul 2010 08:56:53 +0000 Subject: General: Fixed building the SEQ MIDI driver An #include was missing, causing the driver to never be built. Also fixed what looked like a cut-and-paste error in generating the features string. svn-id: r51056 --- backends/midi/seq.cpp | 2 ++ base/version.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 06685df59a..e3d2c35b39 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -28,6 +28,8 @@ * both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html) */ +#include "common/scummsys.h" + #if defined(USE_SEQ_MIDI) #include "common/util.h" diff --git a/base/version.cpp b/base/version.cpp index 0e7f62f80f..17058d4a03 100644 --- a/base/version.cpp +++ b/base/version.cpp @@ -86,7 +86,7 @@ const char *gScummVMFeatures = "" "ALSA " #endif -#ifdef USE_ALSA +#ifdef USE_SEQ_MIDI "SEQ " #endif -- cgit v1.2.3 From 35e2c78626b9196bd3c059780e273dd0044c1c26 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Tue, 20 Jul 2010 10:00:18 +0000 Subject: BUILD: Fix fallback readline detection svn-id: r51057 --- configure | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 4326bc1e46..56391409d4 100755 --- a/configure +++ b/configure @@ -2256,12 +2256,13 @@ int main(void) { char *x = readline(""); } EOF - cc_check $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes + cc_check_no_clean $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes if test "$_readline" = no ; then _READLINE_LIBS="-lreadline -ltermcap" - cc_check $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes + cc_check_no_clean $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes fi fi + cc_check_clean echo "$_readline" else _readline=no -- cgit v1.2.3 From a24de29358a94941190044aaadaf3d2003486888 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 11:17:33 +0000 Subject: SCI: renaming kDoSound(resume) to resumeAfterRestore kDoSound(resumeAfterRestore) is called right after restoring a saved game for sound-sci0 games, we already resume playing music inside restore, so we don't need to implement this at all svn-id: r51058 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/kernel.h | 2 +- engines/sci/engine/ksound.cpp | 2 +- engines/sci/sound/soundcmd.cpp | 17 +++-------------- engines/sci/sound/soundcmd.h | 2 +- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 189f6c2000..5f919fee62 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -337,7 +337,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, - { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResume), "", NULL }, + { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResumeAfterRestore), "", NULL }, { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", NULL }, diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 81106625bf..53b0dcb68e 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -475,7 +475,7 @@ reg_t kDoSoundMute(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundStop(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundStopAll(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundPause(EngineState *s, int argc, reg_t *argv); -reg_t kDoSoundResume(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundResumeAfterRestore(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundMasterVolume(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundUpdate(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundFade(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 69ae68674b..4e5ddc5e96 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -54,7 +54,7 @@ CREATE_DOSOUND_FORWARD(DoSoundMute) CREATE_DOSOUND_FORWARD(DoSoundStop) CREATE_DOSOUND_FORWARD(DoSoundStopAll) CREATE_DOSOUND_FORWARD(DoSoundPause) -CREATE_DOSOUND_FORWARD(DoSoundResume) +CREATE_DOSOUND_FORWARD(DoSoundResumeAfterRestore) CREATE_DOSOUND_FORWARD(DoSoundMasterVolume) CREATE_DOSOUND_FORWARD(DoSoundUpdate) CREATE_DOSOUND_FORWARD(DoSoundFade) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 8e750def4a..8fa60e357b 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -250,20 +250,9 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { } // SCI0 only command -reg_t SoundCommandParser::kDoSoundResume(int argc, reg_t *argv, reg_t acc) { - // this doesn't seem to do what we think it's doing - // it's called with no arguments at all (just restore a game in qfg1) - return acc; - reg_t obj = argv[0]; - - MusicEntry *musicSlot = _music->getSlot(obj); - if (!musicSlot) { - warning("kDoSound(resume):: Slot not found (%04x:%04x)", PRINT_REG(obj)); - return acc; - } - - writeSelectorValue(_segMan, musicSlot->soundObj, SELECTOR(state), kSoundPlaying); - _music->soundResume(musicSlot); +// It's called right after restoring a game - it's responsible to kick off playing music again +// we don't need this at all, so we don't do anything here +reg_t SoundCommandParser::kDoSoundResumeAfterRestore(int argc, reg_t *argv, reg_t acc) { return acc; } diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h index a8bc1eb280..10915e8ea9 100644 --- a/engines/sci/sound/soundcmd.h +++ b/engines/sci/sound/soundcmd.h @@ -85,7 +85,7 @@ public: reg_t kDoSoundDummy(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundMute(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundPause(int argc, reg_t *argv, reg_t acc); - reg_t kDoSoundResume(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundResumeAfterRestore(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundStop(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundStopAll(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundDispose(int argc, reg_t *argv, reg_t acc); -- cgit v1.2.3 From 3c97772d6e5aa05c7991d4114824fb0d7b5ff551 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 11:29:56 +0000 Subject: SCI: added workaround for kq1 kDoSound(fade) gets called with object 0:0 in several scenes, just ignore that call svn-id: r51059 --- engines/sci/engine/kernel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 5f919fee62..79b9d506c7 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -237,6 +237,7 @@ static const SciWorkaroundEntry kDisposeScript_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { 1, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // floppy: during intro, parameter 4 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -340,7 +341,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResumeAfterRestore), "", NULL }, { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, - { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", NULL }, + { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", kDoSoundFade_workarounds }, { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "", NULL }, { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, -- cgit v1.2.3 From 0b3f816c8b13d1cbc2b121461bdcd8aa2068ddde Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 11:45:06 +0000 Subject: SCI: change the workaround-types 0 is now don't call 1 is do call 2 is don't call and fake acc makes more sense svn-id: r51060 --- engines/sci/engine/kernel.cpp | 28 ++++++++++++++-------------- engines/sci/engine/vm.cpp | 11 +++++++++-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 79b9d506c7..bab6276228 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -231,56 +231,56 @@ static const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { 1, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { 0, 0 } }, // when leaving graveyard, parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { 1, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 - { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { 0, 0 } }, // floppy: during intro, parameter 4 is an object + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { 0, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { 1, 0 } }, // floppy: during intro, parameter 4 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { 0, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { 0, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { 1, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { 1, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { 1, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { 0, 0 } }, // happens during the game, gets called with 1 extra parameter + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { 1, 0 } }, // happens during the game, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { 0, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { 1, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { 0, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { 1, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { 1, 0 } }, // ending scene, is called with additional 3 (!) parameters + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { 0, 0 } }, // ending scene, is called with additional 3 (!) parameters SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 1, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { 1, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { 1, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 0, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { 0, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { 0, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { 0, 0 } }, // Hominy Homonym puzzle + { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { 1, 0 } }, // Hominy Homonym puzzle SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index bd92b18d82..a56eab4ddf 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -882,10 +882,17 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. - if (workaround.segment == 2) + switch (workaround.segment) { + case 0: // don't do kernel call, leave acc alone + return; + case 1: // call kernel anyway + break; + case 2: // don't do kernel call, fake acc s->r_acc = make_reg(0, workaround.offset); - if (workaround.segment) return; + default: + error("unknown workaround type"); + } } -- cgit v1.2.3 From 6ebcb5326585a3ec2e2708f8a943c86ce6c9d40f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 12:50:13 +0000 Subject: SCI: fix regression of r51060 svn-id: r51062 --- engines/sci/engine/vm.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a56eab4ddf..9ec8842ab3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -928,10 +928,17 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } // FIXME: implement some real workaround type logic - ignore call, still do call etc. - if (workaround.segment == 2) + switch (workaround.segment) { + case 0: // don't do kernel call, leave acc alone + return; + case 1: // call kernel anyway + break; + case 2: // don't do kernel call, fake acc s->r_acc = make_reg(0, workaround.offset); - if (workaround.segment) return; + default: + error("unknown workaround type"); + } } if (!kernelSubCall.function) error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); -- cgit v1.2.3 From ef69fb1af5e30fa5f6450ea74837086ea3624d37 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 14:27:30 +0000 Subject: SCI: adding uninit workarounds for cnick games longbow and king's quest KQ has the same issues as hoyle 3 svn-id: r51063 --- engines/sci/engine/kernel.cpp | 14 +++++++++++--- engines/sci/engine/kernel.h | 2 +- engines/sci/engine/vm.cpp | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index bab6276228..27ece063ad 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -744,9 +744,17 @@ uint Kernel::getSelectorNamesSize() const { return _selectorNames.size(); } -const Common::String &Kernel::getSelectorName(uint selector) const { - if (selector >= _selectorNames.size()) - return _invalid; +const Common::String &Kernel::getSelectorName(uint selector) { + if (selector >= _selectorNames.size()) { + // This should only occur in games w/o a selector-table + // We need this for proper workaround tables + // TODO: maybe check, if there is a fixed selector-table and error() out in that case + for (uint loopSelector = _selectorNames.size(); loopSelector <= selector; loopSelector++) { + Common::String newSelectorName; + newSelectorName = newSelectorName.printf("", loopSelector); + _selectorNames.push_back(newSelectorName); + } + } return _selectorNames[selector]; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 53b0dcb68e..baae5d7cd8 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -160,7 +160,7 @@ public: ~Kernel(); uint getSelectorNamesSize() const; - const Common::String &getSelectorName(uint selector) const; + const Common::String &getSelectorName(uint selector); uint getKernelNamesSize() const; const Common::String &getKernelName(uint number) const; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9ec8842ab3..7effc13462 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -378,6 +378,10 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { 0, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { 0, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { 0, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { 0, 0 } }, // when starting the game { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From 90d45aaa7d6aa0b63505e034430293c7b3fe352c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 14:53:55 +0000 Subject: SCI: adding workaround for sq1 in bar kGraph(drawLine) gets called sometimes with additional parameter svn-id: r51065 --- engines/sci/engine/kernel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 27ece063ad..e878818bae 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -242,6 +242,12 @@ static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call, index, replace +static const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { 1, 0 } }, // happens when ordering beer, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { 1, 0 } }, // happens when restoring (sometimes), same as the one below @@ -422,7 +428,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, // 3 - set palette via resource - { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", NULL }, + { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", kGraphDrawLine_workarounds }, // 5 - nop // 6 - draw pattern { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, -- cgit v1.2.3 From 14c2fb2f08df8cb8e600734400ffc0c750cbcf7d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 20 Jul 2010 16:05:25 +0000 Subject: Implement PlayNote/StopNote and PlayTele/StopTele for The Manhole. svn-id: r51066 --- engines/made/scriptfuncs.cpp | 83 +++++++++++++++++++++++++++++++++++++------- engines/made/scriptfuncs.h | 17 ++++++--- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index cd4081ea52..8d01ec70f3 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -28,6 +28,7 @@ #include "common/events.h" #include "graphics/cursorman.h" #include "sound/audiocd.h" +#include "sound/softsynth/pcspk.h" #include "made/made.h" #include "made/resource.h" @@ -41,6 +42,22 @@ namespace Made { +ScriptFunctions::ScriptFunctions(MadeEngine *vm) : _vm(vm), _soundStarted(false) { + // Initialize the two tone generators + _pcSpeaker1 = new Audio::PCSpeaker(); + _pcSpeaker2 = new Audio::PCSpeaker(); + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_pcSpeakerHandle1, _pcSpeaker1); + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_pcSpeakerHandle2, _pcSpeaker2); +} + +ScriptFunctions::~ScriptFunctions() { + for (uint i = 0; i < _externalFuncs.size(); ++i) + delete _externalFuncs[i]; + + _vm->_system->getMixer()->stopHandle(_pcSpeakerHandle1); + _vm->_system->getMixer()->stopHandle(_pcSpeakerHandle2); +} + typedef Common::Functor2Mem ExternalScriptFunc; #define External(x) \ _externalFuncs.push_back(new ExternalScriptFunc(this, &ScriptFunctions::x)); \ @@ -308,36 +325,78 @@ int16 ScriptFunctions::sfFlashScreen(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfPlayNote(int16 argc, int16 *argv) { - // TODO: Used in Manhole:NE, Manhole EGA - // This is used when using the piano in the desk screen inside the ship. + // This is used when using the piano in the desk screen inside the ship + // in The Manhole (EGA/NE). + // It takes 2 parameters: - // The first parameter is the key pressed + // The first parameter is the note number of the key pressed + 1 // The second parameter is some sort of modifier (volume, perhaps?), - // depending on which of the 3 keys on the right has been pressed (12 - 14) - warning("Unimplemented opcode: sfPlayNote"); + // depending on which of the 3 keys on the right has been pressed. + // This value seems to be [12, 14] in NE and [1, 3] in EGA. + + // Note frequencies based on http://www.phy.mtu.edu/~suits/notefreqs.html + static const int freqTable[] = { + 16, 17, 18, 19, 21, 22, 23, 24, 26, 28, 29, + 30, 32, 35, 37, 39, 41, 44, 46, 49, 52, 55, + 58, 62, 65, 69, 73, 77, 82, 87, 93, 98, 104, + 110, 117, 123, 131, 139, 147, 156, 165, 175, 195, + 196, 208, 220, 233, 247, 262, 277, 294, 311, 330, + 349, 370, 392, 415, 440, 466, 494, 523, 554, 587, + 622, 659, 698, 740, 784, 831, 880, 932, 988, 1047, + 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, + 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, + 3136, 3322, 3529, 3729, 3951, 4186, 4435, 4697, 4978 + }; + + debug(4, "sfPlayNote: Note = %d, Volume(?) = %d", argv[0] - 1, argv[1]); + + _pcSpeaker1->play(Audio::PCSpeaker::kWaveFormSine, freqTable[argv[0] - 1], -1); + + // TODO: Figure out what to do with the second parameter + //_pcSpeaker1->setVolume(argv[1]); + return 0; } int16 ScriptFunctions::sfStopNote(int16 argc, int16 *argv) { - // TODO: Used in Manhole:NE, Manhole EGA // Used in the same place as sfPlayNote, with the same parameters - warning("Unimplemented opcode: sfStopNote"); + // We just stop the wave generator here + _pcSpeaker1->stop(); return 0; } int16 ScriptFunctions::sfPlayTele(int16 argc, int16 *argv) { - // TODO: Used in Manhole:NE, Manhole EGA // This is used when pressing the phone keys while using the phone in - // the desk screen inside the ship. + // the desk screen inside the ship in The Manhole (EGA/NE). // It takes 1 parameter, the key pressed (0-9, 10 for asterisk, 11 for hash) - warning("Unimplemented opcode: sfPlayTele"); + + // A telephone keypad uses a two tones for each key. + // See http://en.wikipedia.org/wiki/Telephone_keypad for more info + + static const int freqTable1[] = { + 1336, 1209, 1336, 1477, + 1209, 1336, 1477, 1209, + 1336, 1477, 1209, 1477 + }; + + static const int freqTable2[] = { + 941, 697, 697, 697, + 770, 770, 770, 852, + 852, 852, 941, 941 + }; + + debug(4, "sfPlayTele: Button = %d", argv[0]); + + _pcSpeaker1->play(Audio::PCSpeaker::kWaveFormSine, freqTable1[argv[0]], -1); + _pcSpeaker2->play(Audio::PCSpeaker::kWaveFormSine, freqTable2[argv[0]], -1); return 0; } int16 ScriptFunctions::sfStopTele(int16 argc, int16 *argv) { - // TODO: Used in Manhole:NE, Manhole EGA // Used in the same place as sfPlayTele, with the same parameters - warning("Unimplemented opcode: sfStopTele"); + // We just stop both wave generators here + _pcSpeaker1->stop(); + _pcSpeaker2->stop(); return 0; } diff --git a/engines/made/scriptfuncs.h b/engines/made/scriptfuncs.h index 5fdfb77f45..3bed27c5c8 100644 --- a/engines/made/scriptfuncs.h +++ b/engines/made/scriptfuncs.h @@ -33,6 +33,10 @@ #include "made/resource.h" +namespace Audio { + class PCSpeaker; +} + namespace Made { class MadeEngine; @@ -41,17 +45,16 @@ typedef Common::Functor2 ExternalFunc; class ScriptFunctions { public: - ScriptFunctions(MadeEngine *vm) : _vm(vm), _soundStarted(false) {} - virtual ~ScriptFunctions() { - for (uint i = 0; i < _externalFuncs.size(); ++i) - delete _externalFuncs[i]; - } + ScriptFunctions(MadeEngine *vm); + virtual ~ScriptFunctions(); + int16 callFunction(uint16 index, int16 argc, int16 *argv) { if (index >= _externalFuncs.size()) error("ScriptFunctions::callFunction() Invalid function index %d", index); debug(4, "%s", _externalFuncNames[index]); return (*_externalFuncs[index])(argc, argv); } + void setupExternalsTable(); const char* getFuncName(int index) { return _externalFuncNames[index]; } int getCount() const { return _externalFuncs.size(); } @@ -64,6 +67,10 @@ protected: SoundResource* _soundResource; bool _soundStarted; + // PlayNote/StopNote and PlayTele/StopTele wave generators + Audio::SoundHandle _pcSpeakerHandle1, _pcSpeakerHandle2; + Audio::PCSpeaker *_pcSpeaker1, *_pcSpeaker2; + Common::Array _externalFuncs; Common::Array _externalFuncNames; GenericResource *_musicRes; -- cgit v1.2.3 From f771a2bbc78b2119d9666c112e6f49d7f13e2e3a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 17:28:10 +0000 Subject: SCI: fix regression of r50463 also check delta, because _play_tick does not include delta at that point - fixing sq1 ship takeoff svn-id: r51067 --- engines/sci/sound/midiparser_sci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 1ae0777113..e58fa5120b 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -475,7 +475,7 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { // on tick 0. Signal isn't set at that point by sierra sci and it would cause the castle daventry text to // get immediately removed, so we currently filter it. // Sierra SCI ignores them as well at that time - if (_position._play_tick) { + if ((_position._play_tick) || (info.delta)) { _signalSet = true; _signalToSet = info.basic.param1; } -- cgit v1.2.3 From a0ce89d2e987197df321d0f0fa40b1f4d77f9ba9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 17:58:04 +0000 Subject: SCI: clean up workaround tables/code svn-id: r51068 --- engines/sci/engine/kernel.cpp | 56 ++++++++-------- engines/sci/engine/kernel.h | 16 ++++- engines/sci/engine/vm.cpp | 146 ++++++++++++++++++++++-------------------- 3 files changed, 118 insertions(+), 100 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index e878818bae..6e5395e995 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -221,72 +221,72 @@ reg_t kDummy(EngineState *s, int argc, reg_t *argv) { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { 2, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { 2, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { 2, 0x3e9 } }, // hearts - called with objects instead of integers + { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { 0, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { 0, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 - { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { 1, 0 } }, // floppy: during intro, parameter 4 is an object + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { - { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { 1, 0 } }, // happens when ordering beer, gets called with 1 extra parameter + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { 1, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { 1, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { 1, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { 1, 0 } }, // happens during the game, gets called with 1 extra parameter + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { 1, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { 1, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { 0, 0 } }, // ending scene, is called with additional 3 (!) parameters + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { 0, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { 0, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { 0, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { 1, 0 } }, // Hominy Homonym puzzle + { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index baae5d7cd8..6fea670623 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -120,6 +120,18 @@ enum { /* Generic description: */ typedef reg_t KernelFunctionCall(EngineState *s, int argc, reg_t *argv); +enum SciWorkaroundType { + WORKAROUND_NONE, // only used by terminator or when no workaround was found + WORKAROUND_IGNORE, // ignore kernel call + WORKAROUND_STILLCALL, // still do kernel call + WORKAROUND_FAKE // fake kernel call / replace temp value / fake opcode +}; + +struct SciWorkaroundSolution { + SciWorkaroundType type; + uint16 value; +}; + struct SciWorkaroundEntry { SciGameId gameId; int roomNr; @@ -129,10 +141,10 @@ struct SciWorkaroundEntry { const char *methodName; int localCallOffset; int index; - reg_t newValue; + SciWorkaroundSolution newValue; }; -#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { 0, 0 } } +#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } struct KernelSubFunction { KernelFunctionCall *function; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 7effc13462..f3578ef248 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -269,7 +269,7 @@ struct SciTrackOriginReply { int localCallOffset; }; -static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { +static SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { EngineState *state = g_sci->getEngineState(); ExecStack *lastCall = state->xs; Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); @@ -337,7 +337,11 @@ static reg_t trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *w trackOrigin->methodName = curMethodName; trackOrigin->scriptNr = curScriptNr; trackOrigin->localCallOffset = lastCall->debugLocalCallOffset; - return make_reg(0xFFFF, 0xFFFF); + + SciWorkaroundSolution noneFound; + noneFound.type = WORKAROUND_NONE; + noneFound.value = 0; + return noneFound; } static bool validate_unsignedInteger(reg_t reg, uint16 &integer) { @@ -354,15 +358,15 @@ static bool validate_signedInteger(reg_t reg, int16 &integer) { return true; } -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry opcodeDivWorkarounds[] = { - { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { 0, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, replace static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { - { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { 0, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -370,54 +374,57 @@ extern const char *opcodeNames[]; // from scriptdebug.cpp static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaroundEntry *workaroundList, reg_t value1, reg_t value2) { SciTrackOriginReply originReply; - reg_t workaroundValue = trackOriginAndFindWorkaround(0, workaroundList, &originReply); - if ((workaroundValue.segment == 0xFFFF) && (workaroundValue.offset == 0xFFFF)) + SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, workaroundList, &originReply); + if (solution.type == WORKAROUND_NONE) error("%s on non-integer (%04x:%04x, %04x:%04x) from method %s::%s (script %d, localCall %x)", opcodeNames[opcode], PRINT_REG(value1), PRINT_REG(value2), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); - return workaroundValue; + assert(solution.type == WORKAROUND_FAKE); + return make_reg(0, solution.value); } -// gameID, room,script,lvl, object-name, method-name, call, index, replace +#define FAKE WORKAROUND_FAKE + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { 0, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { 0, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { 0, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { 0, 0 } }, // when starting the game - { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { 0, 0 } }, // sometimes when walk-clicking - { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { 0, 0 } }, // called when the game starts - { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { 0, 0 } }, // Gin Rummy / right when the game starts - { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { 0, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { 0, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { 0, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { 0, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { 0, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { 0, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { 0, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { 0, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { 0, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { 0, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { 0, 0 } }, // rats in the catacombs - { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { 0, 0 } }, // going to island of the beast - { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { 0, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { 0, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { 0, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { 0, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { 0, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { 0, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { 0, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { 0, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { 0, 0 } }, // see above - { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { 0, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { 0, 0 } }, // washcloth in inventory - { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { 0, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { 0, 0 } }, // accessing the inventory - { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { 0, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { 0, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { 0, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { 0, 0 } }, // called when the game starts - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { 0, 0 } }, // called when pressing "Start game" in the main menu + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -429,9 +436,11 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i // Uninitialized read on a temp // We need to find correct replacements for each situation manually SciTrackOriginReply originReply; - r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); - if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF)) + SciWorkaroundSolution solution = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); + if (solution.type == WORKAROUND_NONE) error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + assert(solution.type == WORKAROUND_FAKE); + r[index] = make_reg(0, solution.value); break; } case VAR_PARAM: @@ -879,20 +888,18 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { && !kernel->signatureMatch(kernelCall.signature, argc, argv)) { // signature mismatch, check if a workaround is available SciTrackOriginReply originReply; - reg_t workaround; - workaround = trackOriginAndFindWorkaround(0, kernelCall.workarounds, &originReply); - if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { + SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kernelCall.workarounds, &originReply); + switch (solution.type) { + case WORKAROUND_NONE: kernel->signatureDebug(kernelCall.signature, argc, argv); error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); - } - // FIXME: implement some real workaround type logic - ignore call, still do call etc. - switch (workaround.segment) { - case 0: // don't do kernel call, leave acc alone + break; + case WORKAROUND_IGNORE: // don't do kernel call, leave acc alone return; - case 1: // call kernel anyway + case WORKAROUND_STILLCALL: // call kernel anyway break; - case 2: // don't do kernel call, fake acc - s->r_acc = make_reg(0, workaround.offset); + case WORKAROUND_FAKE: // don't do kernel call, fake acc + s->r_acc = make_reg(0, solution.value); return; default: error("unknown workaround type"); @@ -920,9 +927,9 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { if (kernelSubCall.signature && !kernel->signatureMatch(kernelSubCall.signature, argc, argv)) { // Signature mismatch SciTrackOriginReply originReply; - reg_t workaround; - workaround = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); - if ((workaround.segment == 0xFFFF) && (workaround.offset == 0xFFFF)) { + SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kernelSubCall.workarounds, &originReply); + switch (solution.type) { + case WORKAROUND_NONE: { kernel->signatureDebug(kernelSubCall.signature, argc, argv); int callNameLen = strlen(kernelCall.name); if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { @@ -930,15 +937,14 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); } error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + break; } - // FIXME: implement some real workaround type logic - ignore call, still do call etc. - switch (workaround.segment) { - case 0: // don't do kernel call, leave acc alone + case WORKAROUND_IGNORE: // don't do kernel call, leave acc alone return; - case 1: // call kernel anyway + case WORKAROUND_STILLCALL: // call kernel anyway break; - case 2: // don't do kernel call, fake acc - s->r_acc = make_reg(0, workaround.offset); + case WORKAROUND_FAKE: // don't do kernel call, fake acc + s->r_acc = make_reg(0, solution.value); return; default: error("unknown workaround type"); -- cgit v1.2.3 From 70ed9dfc70ac5b19e1e648e562ab091598a5e4b7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 18:00:45 +0000 Subject: SCI: tiny comment change svn-id: r51069 --- engines/sci/engine/vm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f3578ef248..9d781d5abd 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -364,7 +364,7 @@ static const SciWorkaroundEntry opcodeDivWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call, index, replace +// gameID, room,script,lvl, object-name, method-name, call, index, workaround static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease SCI_WORKAROUNDENTRY_TERMINATOR @@ -383,7 +383,7 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround #define FAKE WORKAROUND_FAKE -// gameID, room,script,lvl, object-name, method-name, call,index, workaround +// gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 -- cgit v1.2.3 From 102b8c9efd4bad7330428c705fb574285bb6a0d3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 18:18:36 +0000 Subject: SCI: adding multilingual mixed up mother goose sci32 svn-id: r51070 --- engines/sci/detection_tables.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 04c2d89c6c..ea05e49056 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1869,6 +1869,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768}, {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + + // Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish) + // Executable scanning reports "2.100.002" + {"mothergoose", "", { + {"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969}, + {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, #endif // ENABLE_SCI32 // Ms. Astro Chicken - English DOS -- cgit v1.2.3 From c2577da7e0ef92a5a8586a83ffa710863a2a4f3f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 19:42:48 +0000 Subject: SCI: fixed jones/ega/vga port issue getPortById() error was caused by us remembering port when going interactive, restoring it and restoring it all the time afterwards as well svn-id: r51071 --- engines/sci/graphics/menu.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index bfe58e03d5..44d4e6968f 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -467,8 +467,10 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject, bool pauseSound) { _paint16->bitsShow(_ports->_menuRect); _barSaveHandle = NULL_REG; } - if (_oldPort) + if (_oldPort) { _ports->setPort(_oldPort); + _oldPort = NULL; + } if ((itemEntry) || (forceClaimed)) writeSelector(_segMan, eventObject, SELECTOR(claimed), make_reg(0, 1)); -- cgit v1.2.3 From 8e24b7930cd306d84288a3d085dfc99d6fb19f4e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 20:17:23 +0000 Subject: SCI: adding lsl6hires uninit workaround svn-id: r51072 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 9d781d5abd..e1352477a0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -419,6 +419,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 2a47f573ddad57655556ccc9b91753987aedb681 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 20 Jul 2010 21:22:39 +0000 Subject: SCI: some sci32 fixes kOnMe, kLocal2Global, kGlobal2Local now hires capable, hotspots seem to work in lsl6 and sq6, although pressing on start in sq6 doesn't work yet, you need to click on the rightmost/bottom area svn-id: r51074 --- engines/sci/engine/kernel.cpp | 4 +++- engines/sci/engine/kernel32.cpp | 14 ++++++------ engines/sci/engine/vm.cpp | 1 + engines/sci/graphics/coordadjuster.cpp | 41 ++++++++++++++++++++++++---------- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 6e5395e995..efb41bcf1d 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -447,6 +447,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kPalVary_subops[] = { + { SIG_SCI21, 0, MAP_CALL(PalVaryInit), "ii(i)(i)(i)", NULL }, { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, { SIG_SCIALL, 2, MAP_CALL(PalVaryGetCurrentStep), "", NULL }, @@ -521,7 +522,8 @@ static const SciKernelMapSubEntry kList_subops[] = { // be something like ListAt instead... If we swap the two subops though, // Torin demo crashes complaining that it tried to send to a non-object, // therefore the semantics might be different here (signature was l[o0]) - { SIG_SCI21, 18, MAP_CALL(StubNull), "li", NULL }, + // In SQ6 object is passed right when skipping the intro + { SIG_SCI21, 18, MAP_CALL(StubNull), "l[io]", NULL }, { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index f484a8bc45..c0e6a56b5e 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -861,8 +861,8 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { // Get the object's plane reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); if (!planeObject.isNull()) { - uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + //uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + //uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); @@ -872,12 +872,12 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { // Adjust the bounding rectangle of the object by the object's // actual X, Y coordinates - itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY); - itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX); - itemY += planeTop; - itemX += planeLeft; + nsRect.top = ((nsRect.top * g_sci->_gfxScreen->getHeight()) / planeResY); + nsRect.left = ((nsRect.left * g_sci->_gfxScreen->getWidth()) / planeResX); + nsRect.bottom = ((nsRect.bottom * g_sci->_gfxScreen->getHeight()) / planeResY); + nsRect.right = ((nsRect.right * g_sci->_gfxScreen->getWidth()) / planeResX); - nsRect.translate(itemX, itemY); + nsRect.translate(planeLeft, planeTop); } //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index e1352477a0..338f530827 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -426,6 +426,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp index 9481a68f13..fbeffa7cd2 100644 --- a/engines/sci/graphics/coordadjuster.cpp +++ b/engines/sci/graphics/coordadjuster.cpp @@ -31,6 +31,7 @@ #include "sci/engine/selector.h" #include "sci/graphics/coordadjuster.h" #include "sci/graphics/ports.h" +#include "sci/graphics/screen.h" namespace Sci { @@ -94,20 +95,36 @@ GfxCoordAdjuster32::~GfxCoordAdjuster32() { } void GfxCoordAdjuster32::kernelGlobalToLocal(int16 &x, int16 &y, reg_t planeObject) { - //int16 resY = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resY)); - //int16 resX = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resX)); - //*x = ( *x * _screen->getWidth()) / resX; - //*y = ( *y * _screen->getHeight()) / resY; - x -= readSelectorValue(_segMan, planeObject, SELECTOR(left)); - y -= readSelectorValue(_segMan, planeObject, SELECTOR(top)); + EngineState *s = g_sci->getEngineState(); + uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); + uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); + uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + + planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; + planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + + y -= planeTop; + x -= planeLeft; + + y = ((y * planeResY) / g_sci->_gfxScreen->getHeight()); + x = ((x * planeResX) / g_sci->_gfxScreen->getWidth()); } void GfxCoordAdjuster32::kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject) { - //int16 resY = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resY)); - //int16 resX = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resX)); - x += readSelectorValue(_segMan, planeObject, SELECTOR(left)); - y += readSelectorValue(_segMan, planeObject, SELECTOR(top)); - //*x = ( *x * resX) / _screen->getWidth(); - //*y = ( *y * resY) / _screen->getHeight(); + EngineState *s = g_sci->getEngineState(); + uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); + uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); + uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + + planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; + planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + + y = ((y * g_sci->_gfxScreen->getHeight()) / planeResY); + x = ((x * g_sci->_gfxScreen->getWidth()) / planeResX); + + x += planeLeft; + y += planeTop; } Common::Rect GfxCoordAdjuster32::onControl(Common::Rect rect) { -- cgit v1.2.3 From e7abc6da4fe164e1ba7e86a16dc3bf774392a3e9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 20 Jul 2010 21:53:58 +0000 Subject: SCI: Fixed an off-by-one error in the resource manager - it tried to load patches of type kResourceTypeInvalid svn-id: r51075 --- engines/sci/resource.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 127236650f..d84e9cc75b 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1277,7 +1277,7 @@ void ResourceManager::readResourcePatches() { const char *szResType; ResourceSource *psrcPatch; - for (int i = kResourceTypeView; i <= kResourceTypeInvalid; ++i) { + for (int i = kResourceTypeView; i < kResourceTypeInvalid; ++i) { // Ignore the types that can't be patched (and Robot/VMD is handled externally for now) if (!s_resourceTypeSuffixes[i] || i == kResourceTypeRobot || i == kResourceTypeVMD) continue; -- cgit v1.2.3 From d53e5fbfb7a3cafff6f21a6d656428f670256e9f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 20 Jul 2010 23:15:07 +0000 Subject: SCI: Removed the restoring parameter of the run_vm() function svn-id: r51076 --- engines/sci/console.cpp | 2 +- engines/sci/engine/selector.cpp | 2 +- engines/sci/engine/vm.cpp | 5 +++-- engines/sci/engine/vm.h | 3 +-- engines/sci/sci.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 005ac9eefd..8cbe946e4a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2662,7 +2662,7 @@ bool Console::cmdSend(int argc, const char **argv) { // We call run_engine explictly so we can restore the value of r_acc // after execution. - run_vm(_engine->_gamestate, 0); + run_vm(_engine->_gamestate); } diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 431261eb7c..c807e88d5f 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -238,7 +238,7 @@ void invokeSelector(EngineState *s, reg_t object, int selectorId, xstack->sp += argc + 2; xstack->fp += argc + 2; - run_vm(s, false); // Start a new vm + run_vm(s); // Start a new vm } SelectorType lookupSelector(SegManager *segMan, reg_t obj_location, Selector selectorId, ObjVarRef *varp, reg_t *fptr) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 338f530827..78b85df0c8 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1053,7 +1053,7 @@ int readPMachineInstruction(const byte *src, byte &extOpcode, int16 opparams[4]) return offset; } -void run_vm(EngineState *s, bool restoring) { +void run_vm(EngineState *s) { assert(s); int temp; @@ -1074,7 +1074,8 @@ void run_vm(EngineState *s, bool restoring) { if (!local_script) error("run_vm(): program counter gone astray (local_script pointer is null)"); - if (!restoring) + // TODO: Revise this + if (s->abortScriptProcessing != kAbortLoadGame) s->executionStackBase = s->_executionStack.size() - 1; s->variablesSegment[VAR_TEMP] = s->variablesSegment[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 81ec4f1c61..ee22e03310 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -315,9 +315,8 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, * It executes the code on s->heap[pc] until it hits a 'ret' operation * while (stack_base == stack_pos). Requires s to be set up correctly. * @param[in] s The state to use - * @param[in] restoring true if s has just been restored, false otherwise */ -void run_vm(EngineState *s, bool restoring); +void run_vm(EngineState *s); /** * Debugger functionality diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index a39f1113a9..16984639af 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -410,7 +410,7 @@ void SciEngine::runGame() { do { _gamestate->_executionStackPosChanged = false; - run_vm(_gamestate, (_gamestate->abortScriptProcessing == kAbortLoadGame)); + run_vm(_gamestate); exitGame(); if (_gamestate->abortScriptProcessing == kAbortRestartGame) { -- cgit v1.2.3 From 15fc39589d109245fd66d5cee6319ee19bb8e4d2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 12:05:10 +0000 Subject: SCI: more work on coordadjustment sci32 svn-id: r51084 --- engines/sci/engine/kernel32.cpp | 3 ++- engines/sci/engine/kevent.cpp | 4 ++-- engines/sci/graphics/coordadjuster.cpp | 14 ++++---------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index c0e6a56b5e..f5a50f3fcf 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -859,6 +859,7 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); // Get the object's plane +#if 0 reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); if (!planeObject.isNull()) { //uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); @@ -879,7 +880,7 @@ reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { nsRect.translate(planeLeft, planeTop); } - +#endif //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); return make_reg(0, nsRect.contains(x, y)); diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 635dd7653a..e752f1e8bb 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -215,7 +215,7 @@ reg_t kMapKeyToDir(EngineState *s, int argc, reg_t *argv) { } reg_t kGlobalToLocal(EngineState *s, int argc, reg_t *argv) { - reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars + reg_t obj = argv[0]; reg_t planeObject = argc > 1 ? argv[1] : NULL_REG; // SCI32 SegManager *segMan = s->_segMan; @@ -234,7 +234,7 @@ reg_t kGlobalToLocal(EngineState *s, int argc, reg_t *argv) { } reg_t kLocalToGlobal(EngineState *s, int argc, reg_t *argv) { - reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars + reg_t obj = argv[0]; reg_t planeObject = argc > 1 ? argv[1] : NULL_REG; // SCI32 SegManager *segMan = s->_segMan; diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp index fbeffa7cd2..69f89aa656 100644 --- a/engines/sci/graphics/coordadjuster.cpp +++ b/engines/sci/graphics/coordadjuster.cpp @@ -101,14 +101,11 @@ void GfxCoordAdjuster32::kernelGlobalToLocal(int16 &x, int16 &y, reg_t planeObje uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); - planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; - planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + y = ((y * planeResY) / g_sci->_gfxScreen->getHeight()); + x = ((x * planeResX) / g_sci->_gfxScreen->getWidth()); y -= planeTop; x -= planeLeft; - - y = ((y * planeResY) / g_sci->_gfxScreen->getHeight()); - x = ((x * planeResX) / g_sci->_gfxScreen->getWidth()); } void GfxCoordAdjuster32::kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject) { EngineState *s = g_sci->getEngineState(); @@ -117,14 +114,11 @@ void GfxCoordAdjuster32::kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObje uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); - planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; - planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + x += planeLeft; + y += planeTop; y = ((y * g_sci->_gfxScreen->getHeight()) / planeResY); x = ((x * g_sci->_gfxScreen->getWidth()) / planeResX); - - x += planeLeft; - y += planeTop; } Common::Rect GfxCoordAdjuster32::onControl(Common::Rect rect) { -- cgit v1.2.3 From 54c516b3bf34ce2f6f4e7f499839dfad2d5fa68a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 12:41:17 +0000 Subject: SCI: kSetNowSeen sci2.1 fixes hotspots svn-id: r51085 --- engines/sci/graphics/compare.cpp | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 760108ffd2..c019687fc2 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -132,14 +132,35 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { view = _cache->getView(viewId); - if (view->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(y, x); + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(y, x); + break; + case SCI_VERSION_2_1: + _coordAdjuster->kernelLocalToGlobal(x, y, readSelector(_segMan, objectReference, SELECTOR(plane))); + break; + default: + break; + } view->getCelRect(loopNo, celNo, x, y, z, celRect); - if (view->isSci2Hires()) { - _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); - _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); + _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + } + break; + case SCI_VERSION_2_1: { + reg_t planeObj = readSelector(_segMan, objectReference, SELECTOR(plane)); + _coordAdjuster->kernelGlobalToLocal(celRect.left, celRect.top, planeObj); + _coordAdjuster->kernelGlobalToLocal(celRect.right, celRect.bottom, planeObj); + break; + } + default: + break; } if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) { -- cgit v1.2.3 From e1bc084547ff6235fe35e8f9830f34859c255db7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 13:13:55 +0000 Subject: SCI: fixing hires background pictures sci2.1 svn-id: r51086 --- engines/sci/graphics/frameout.cpp | 4 ++-- engines/sci/graphics/picture.cpp | 9 +++++++-- engines/sci/graphics/picture.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 37c99e1e83..d540b44557 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -230,7 +230,7 @@ void GfxFrameout::kernelFrameout() { itemEntry = *listIterator; if (planePicture) { while ((planePictureCel <= itemEntry->priority) && (planePictureCel < planePictureCels)) { - planePicture->drawSci32Vga(planePictureCel); + planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX); planePictureCel++; } } @@ -302,7 +302,7 @@ void GfxFrameout::kernelFrameout() { if (planePicture) { while (planePictureCel < planePictureCels) { - planePicture->drawSci32Vga(planePictureCel); + planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX); planePictureCel++; } delete planePicture; diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 1416412b33..65a253459e 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -79,7 +79,7 @@ void GfxPicture::draw(int16 animationNr, bool mirroredFlag, bool addToFlag, int1 #ifdef ENABLE_SCI32 case 0x0e: // SCI32 VGA picture _resourceType = SCI_PICTURE_TYPE_SCI32; - drawSci32Vga(); + //drawSci32Vga(); break; #endif default: @@ -131,7 +131,7 @@ int16 GfxPicture::getSci32celCount() { return inbuffer[2]; } -void GfxPicture::drawSci32Vga(int16 celNo) { +void GfxPicture::drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX) { byte *inbuffer = _resource->data; int size = _resource->size; int header_size = READ_LE_UINT16(inbuffer); @@ -162,6 +162,11 @@ void GfxPicture::drawSci32Vga(int16 celNo) { cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38); cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40); + + // This is really weird, adjusting picture data to plane resolution - why... + cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY); + cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX); + drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, cel_relXpos, cel_relYpos); cel_headerPos += 42; celCount--; diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index 5a86539b37..b5636d5bd8 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -56,7 +56,7 @@ public: #ifdef ENABLE_SCI32 int16 getSci32celCount(); - void drawSci32Vga(int16 celNo = -1); + void drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX); #endif private: -- cgit v1.2.3 From 51258a723c1e5ab2e761556795974b40843553e8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 13:52:41 +0000 Subject: SCI: adding lsl6hires uninit workaround svn-id: r51087 --- engines/sci/engine/vm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 78b85df0c8..774d75b127 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -420,6 +420,7 @@ static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup + { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 3184aac398bb1bc1df6251d5db878a833c799c10 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 21 Jul 2010 14:18:26 +0000 Subject: SCI: Moved all the workaround tables in a separate file, to keep them apart from the actual code svn-id: r51088 --- engines/sci/engine/kernel.cpp | 70 +---------------- engines/sci/engine/vm.cpp | 63 +-------------- engines/sci/engine/workarounds.h | 164 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 131 deletions(-) create mode 100644 engines/sci/engine/workarounds.h diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index efb41bcf1d..bf59734fdc 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -28,6 +28,7 @@ #include "sci/event.h" #include "sci/resource.h" #include "sci/engine/state.h" +#include "sci/engine/workarounds.h" #include "common/system.h" @@ -221,75 +222,6 @@ reg_t kDummy(EngineState *s, int argc, reg_t *argv) { // i* -> optional multiple integers // .* -> any parameters afterwards (or none) -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 - { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { - { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time - // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle - SCI_WORKAROUNDENTRY_TERMINATOR -}; - struct SciKernelMapSubEntry { SciVersion fromVersion; SciVersion toVersion; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 774d75b127..ab887340e6 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -38,6 +38,7 @@ #include "sci/engine/seg_manager.h" #include "sci/engine/selector.h" // for SELECTOR #include "sci/engine/gc.h" +#include "sci/engine/workarounds.h" namespace Sci { @@ -358,18 +359,6 @@ static bool validate_signedInteger(reg_t reg, int16 &integer) { return true; } -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry opcodeDivWorkarounds[] = { - { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call, index, workaround -static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { - { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease - SCI_WORKAROUNDENTRY_TERMINATOR -}; - extern const char *opcodeNames[]; // from scriptdebug.cpp static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaroundEntry *workaroundList, reg_t value1, reg_t value2) { @@ -381,56 +370,6 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround return make_reg(0, solution.value); } -#define FAKE WORKAROUND_FAKE - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game - { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking - { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts - { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts - { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast - { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above - { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory - { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup - { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area - { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory - { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu - { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game - SCI_WORKAROUNDENTRY_TERMINATOR -}; - static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t default_value) { if (validate_variable(r, stack_base, type, max, index)) { if (r[index].segment == 0xffff) { diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h new file mode 100644 index 0000000000..be066d5fc7 --- /dev/null +++ b/engines/sci/engine/workarounds.h @@ -0,0 +1,164 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCI_ENGINE_WORKAROUNDS_H +#define SCI_ENGINE_WORKAROUNDS_H + +namespace Sci { + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry opcodeDivWorkarounds[] = { + { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call, index, workaround +static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { + { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +#define FAKE WORKAROUND_FAKE + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup + { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kAbs_workarounds[] = { + { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kDisposeScript_workarounds[] = { + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + // ^^ TODO: check, if this is really a script error or an issue with our restore code + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kSetPort_workarounds[] = { + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +static const SciWorkaroundEntry kStrCpy_workarounds[] = { + { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +} // End of namespace Sci + +#endif // SCI_ENGINE_WORKAROUNDS_H -- cgit v1.2.3 From 2ed45d3719a9d75f35aff7cc80b23468e1ceac3e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 21 Jul 2010 14:50:31 +0000 Subject: SCI: Moved all the static kernel-related tables in a separate file. Also, moved kStub, kStubNull and kDummy inside kmisc.cpp, together with the other misc kernel calls svn-id: r51089 --- engines/sci/engine/kernel.cpp | 692 ++---------------------- engines/sci/engine/kernel.h | 3 + engines/sci/engine/kernel32.cpp | 357 ------------- engines/sci/engine/kernel_tables.h | 1024 ++++++++++++++++++++++++++++++++++++ engines/sci/engine/kmisc.cpp | 35 ++ engines/sci/engine/vm.cpp | 80 --- 6 files changed, 1119 insertions(+), 1072 deletions(-) create mode 100644 engines/sci/engine/kernel_tables.h diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index bf59734fdc..d7f45323aa 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -27,6 +27,8 @@ #include "sci/engine/kernel.h" #include "sci/event.h" #include "sci/resource.h" +#include "sci/engine/features.h" +#include "sci/engine/kernel_tables.h" #include "sci/engine/state.h" #include "sci/engine/workarounds.h" @@ -34,641 +36,6 @@ namespace Sci { -/** Default kernel name table. */ -static const char *s_defaultKernelNames[] = { - /*0x00*/ "Load", - /*0x01*/ "UnLoad", - /*0x02*/ "ScriptID", - /*0x03*/ "DisposeScript", - /*0x04*/ "Clone", - /*0x05*/ "DisposeClone", - /*0x06*/ "IsObject", - /*0x07*/ "RespondsTo", - /*0x08*/ "DrawPic", - /*0x09*/ "Dummy", // Show - /*0x0a*/ "PicNotValid", - /*0x0b*/ "Animate", - /*0x0c*/ "SetNowSeen", - /*0x0d*/ "NumLoops", - /*0x0e*/ "NumCels", - /*0x0f*/ "CelWide", - /*0x10*/ "CelHigh", - /*0x11*/ "DrawCel", - /*0x12*/ "AddToPic", - /*0x13*/ "NewWindow", - /*0x14*/ "GetPort", - /*0x15*/ "SetPort", - /*0x16*/ "DisposeWindow", - /*0x17*/ "DrawControl", - /*0x18*/ "HiliteControl", - /*0x19*/ "EditControl", - /*0x1a*/ "TextSize", - /*0x1b*/ "Display", - /*0x1c*/ "GetEvent", - /*0x1d*/ "GlobalToLocal", - /*0x1e*/ "LocalToGlobal", - /*0x1f*/ "MapKeyToDir", - /*0x20*/ "DrawMenuBar", - /*0x21*/ "MenuSelect", - /*0x22*/ "AddMenu", - /*0x23*/ "DrawStatus", - /*0x24*/ "Parse", - /*0x25*/ "Said", - /*0x26*/ "SetSynonyms", // Portrait (KQ6 hires) - /*0x27*/ "HaveMouse", - /*0x28*/ "SetCursor", - // FOpen (SCI0) - // FPuts (SCI0) - // FGets (SCI0) - // FClose (SCI0) - /*0x29*/ "SaveGame", - /*0x2a*/ "RestoreGame", - /*0x2b*/ "RestartGame", - /*0x2c*/ "GameIsRestarting", - /*0x2d*/ "DoSound", - /*0x2e*/ "NewList", - /*0x2f*/ "DisposeList", - /*0x30*/ "NewNode", - /*0x31*/ "FirstNode", - /*0x32*/ "LastNode", - /*0x33*/ "EmptyList", - /*0x34*/ "NextNode", - /*0x35*/ "PrevNode", - /*0x36*/ "NodeValue", - /*0x37*/ "AddAfter", - /*0x38*/ "AddToFront", - /*0x39*/ "AddToEnd", - /*0x3a*/ "FindKey", - /*0x3b*/ "DeleteKey", - /*0x3c*/ "Random", - /*0x3d*/ "Abs", - /*0x3e*/ "Sqrt", - /*0x3f*/ "GetAngle", - /*0x40*/ "GetDistance", - /*0x41*/ "Wait", - /*0x42*/ "GetTime", - /*0x43*/ "StrEnd", - /*0x44*/ "StrCat", - /*0x45*/ "StrCmp", - /*0x46*/ "StrLen", - /*0x47*/ "StrCpy", - /*0x48*/ "Format", - /*0x49*/ "GetFarText", - /*0x4a*/ "ReadNumber", - /*0x4b*/ "BaseSetter", - /*0x4c*/ "DirLoop", - /*0x4d*/ "CanBeHere", // CantBeHere in newer SCI versions - /*0x4e*/ "OnControl", - /*0x4f*/ "InitBresen", - /*0x50*/ "DoBresen", - /*0x51*/ "Platform", // DoAvoider (SCI0) - /*0x52*/ "SetJump", - /*0x53*/ "SetDebug", - /*0x54*/ "Dummy", // InspectObj - /*0x55*/ "Dummy", // ShowSends - /*0x56*/ "Dummy", // ShowObjs - /*0x57*/ "Dummy", // ShowFree - /*0x58*/ "MemoryInfo", - /*0x59*/ "Dummy", // StackUsage - /*0x5a*/ "Dummy", // Profiler - /*0x5b*/ "GetMenu", - /*0x5c*/ "SetMenu", - /*0x5d*/ "GetSaveFiles", - /*0x5e*/ "GetCWD", - /*0x5f*/ "CheckFreeSpace", - /*0x60*/ "ValidPath", - /*0x61*/ "CoordPri", - /*0x62*/ "StrAt", - /*0x63*/ "DeviceInfo", - /*0x64*/ "GetSaveDir", - /*0x65*/ "CheckSaveGame", - /*0x66*/ "ShakeScreen", - /*0x67*/ "FlushResources", - /*0x68*/ "SinMult", - /*0x69*/ "CosMult", - /*0x6a*/ "SinDiv", - /*0x6b*/ "CosDiv", - /*0x6c*/ "Graph", - /*0x6d*/ "Joystick", - // End of kernel function table for SCI0 - /*0x6e*/ "Dummy", // ShiftScreen - /*0x6f*/ "Palette", - /*0x70*/ "MemorySegment", - /*0x71*/ "Intersections", // MoveCursor (SCI1 late), PalVary (SCI1.1) - /*0x72*/ "Memory", - /*0x73*/ "Dummy", // ListOps - /*0x74*/ "FileIO", - /*0x75*/ "DoAudio", - /*0x76*/ "DoSync", - /*0x77*/ "AvoidPath", - /*0x78*/ "Sort", // StrSplit (SCI01) - /*0x79*/ "Dummy", // ATan - /*0x7a*/ "Lock", - /*0x7b*/ "StrSplit", - /*0x7c*/ "GetMessage", // Message (SCI1.1) - /*0x7d*/ "IsItSkip", - /*0x7e*/ "MergePoly", - /*0x7f*/ "ResCheck", - /*0x80*/ "AssertPalette", - /*0x81*/ "TextColors", - /*0x82*/ "TextFonts", - /*0x83*/ "Dummy", // Record - /*0x84*/ "Dummy", // PlayBack - /*0x85*/ "ShowMovie", - /*0x86*/ "SetVideoMode", - /*0x87*/ "SetQuitStr", - /*0x88*/ "Dummy" // DbugStr -}; - -reg_t kStub(EngineState *s, int argc, reg_t *argv) { - Kernel *kernel = g_sci->getKernel(); - int kernelCallNr = -1; - - Common::List::iterator callIterator = s->_executionStack.end(); - if (callIterator != s->_executionStack.begin()) { - callIterator--; - ExecStack lastCall = *callIterator; - kernelCallNr = lastCall.debugSelector; - } - - Common::String warningMsg = "Dummy function k" + kernel->getKernelName(kernelCallNr) + - Common::String::printf("[%x]", kernelCallNr) + - " invoked. Params: " + - Common::String::printf("%d", argc) + " ("; - - for (int i = 0; i < argc; i++) { - warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - warningMsg += (i == argc - 1 ? ")" : ", "); - } - - warning("%s", warningMsg.c_str()); - return s->r_acc; -} - -reg_t kStubNull(EngineState *s, int argc, reg_t *argv) { - kStub(s, argc, argv); - return NULL_REG; -} - -reg_t kDummy(EngineState *s, int argc, reg_t *argv) { - kStub(s, argc, argv); - error("Kernel function was called, which was considered to be unused - see log for details"); -} - -// [io] -> either integer or object -// (io) -> optionally integer AND an object -// (i) -> optional integer -// . -> any type -// i* -> optional multiple integers -// .* -> any parameters afterwards (or none) - -struct SciKernelMapSubEntry { - SciVersion fromVersion; - SciVersion toVersion; - - uint16 id; - - const char *name; - KernelFunctionCall *function; - - const char *signature; - const SciWorkaroundEntry *workarounds; -}; - -#define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL } - - -#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE -#define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 -#define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE -#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 -#define SIG_SINCE_SCI11 SCI_VERSION_1_1, SCI_VERSION_NONE -#define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 - -#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 -#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE - -// SCI-Sound-Version -#define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE -#define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY -#define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE -#define SIG_SOUNDSCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 - -#define SIGFOR_ALL 0x3f -#define SIGFOR_DOS 1 << 0 -#define SIGFOR_PC98 1 << 1 -#define SIGFOR_WIN 1 << 2 -#define SIGFOR_MAC 1 << 3 -#define SIGFOR_AMIGA 1 << 4 -#define SIGFOR_ATARI 1 << 5 -#define SIGFOR_PC SIGFOR_DOS|SIGFOR_WIN - -#define SIG_EVERYWHERE SIG_SCIALL, SIGFOR_ALL - -#define MAP_CALL(_name_) #_name_, k##_name_ - -// version, subId, function-mapping, signature, workarounds -static const SciKernelMapSubEntry kDoSound_subops[] = { - { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, - { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, - { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "o", NULL }, - { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, - { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, - { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, - { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, - { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResumeAfterRestore), "", NULL }, - { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, - { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, - { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", kDoSoundFade_workarounds }, - { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "", NULL }, - { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, - { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, - // ^^ TODO: In SCI1-SCI1.1 DoSound (play) is called by 2 methods of the Sound object: play and - // playBed. The methods are the same, apart from the second integer parameter: it's 0 in - // play and 1 in playBed, to distinguish the caller. It's passed on, we should find out what - // it actually does internally - { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, - { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, - { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, - { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, - { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, - { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, - { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, - // ^^ Longbow demo - { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), "", NULL }, - { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, - { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, - { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, - { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, - { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, - { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, - { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), "oiii(i)", NULL }, - { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, -#ifdef ENABLE_SCI32 - { SIG_SOUNDSCI21, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, - { SIG_SOUNDSCI21, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, - { SIG_SOUNDSCI21, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, - { SIG_SOUNDSCI21, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, - { SIG_SOUNDSCI21, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, - { SIG_SOUNDSCI21, 6, MAP_CALL(DoSoundInit), NULL, NULL }, - { SIG_SOUNDSCI21, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, - { SIG_SOUNDSCI21, 8, MAP_CALL(DoSoundPlay), "o(i)", NULL }, - // ^^ TODO: if this is really the only change between SCI1LATE AND SCI21, we could rename the - // SIG_SOUNDSCI1LATE #define to SIG_SINCE_SOUNDSCI1LATE and make it being SCI1LATE+. Although - // I guess there are many more changes somewhere - // TODO: Quest for Glory 4 (SCI2.1) uses the old scheme, we need to detect it accordingly - // signature for SCI21 should be "o" - { SIG_SOUNDSCI21, 9, MAP_CALL(DoSoundStop), NULL, NULL }, - { SIG_SOUNDSCI21, 10, MAP_CALL(DoSoundPause), NULL, NULL }, - { SIG_SOUNDSCI21, 11, MAP_CALL(DoSoundFade), NULL, NULL }, - { SIG_SOUNDSCI21, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, - { SIG_SOUNDSCI21, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, - { SIG_SOUNDSCI21, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, - { SIG_SOUNDSCI21, 15, MAP_CALL(DoSoundSetPriority), NULL, NULL }, - { SIG_SOUNDSCI21, 16, MAP_CALL(DoSoundSetLoop), NULL, NULL }, - { SIG_SOUNDSCI21, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, - { SIG_SOUNDSCI21, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, - { SIG_SOUNDSCI21, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, - { SIG_SOUNDSCI21, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, -#endif - SCI_SUBOPENTRY_TERMINATOR -}; - -// version, subId, function-mapping, signature, workarounds -static const SciKernelMapSubEntry kGraph_subops[] = { - { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start - { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, - // 3 - set palette via resource - { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", kGraphDrawLine_workarounds }, - // 5 - nop - // 6 - draw pattern - { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, - { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, - // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same - { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, - { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", kGraphFillBoxForeground_workarounds }, - { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, - { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires - { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, - { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, - { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, - { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires - SCI_SUBOPENTRY_TERMINATOR -}; - -// version, subId, function-mapping, signature, workarounds -static const SciKernelMapSubEntry kPalVary_subops[] = { - { SIG_SCI21, 0, MAP_CALL(PalVaryInit), "ii(i)(i)(i)", NULL }, - { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, - { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, - { SIG_SCIALL, 2, MAP_CALL(PalVaryGetCurrentStep), "", NULL }, - { SIG_SCIALL, 3, MAP_CALL(PalVaryDeinit), "", NULL }, - { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, - { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, - { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, - { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, - SCI_SUBOPENTRY_TERMINATOR -}; - -// version, subId, function-mapping, signature, workarounds -static const SciKernelMapSubEntry kPalette_subops[] = { - { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, - { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, - { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", NULL }, - { SIG_SCIALL, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, - { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, - { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, - { SIG_SCIALL, 7, MAP_CALL(PaletteSave), "", NULL }, - { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "i", NULL }, - SCI_SUBOPENTRY_TERMINATOR -}; - -static const SciKernelMapSubEntry kFileIO_subops[] = { - { SIG_SCI32, 0, MAP_CALL(FileIOOpen), "r(i)", NULL }, - { SIG_SCIALL, 0, MAP_CALL(FileIOOpen), "ri", NULL }, - { SIG_SCIALL, 1, MAP_CALL(FileIOClose), "i", NULL }, - { SIG_SCIALL, 2, MAP_CALL(FileIOReadRaw), "iri", NULL }, - { SIG_SCIALL, 3, MAP_CALL(FileIOWriteRaw), "iri", NULL }, - { SIG_SCIALL, 4, MAP_CALL(FileIOUnlink), "r", NULL }, - { SIG_SCIALL, 5, MAP_CALL(FileIOReadString), "rii", NULL }, - { SIG_SCIALL, 6, MAP_CALL(FileIOWriteString), "ir", NULL }, - { SIG_SCIALL, 7, MAP_CALL(FileIOSeek), "iii", NULL }, - { SIG_SCIALL, 8, MAP_CALL(FileIOFindFirst), "rri", NULL }, - { SIG_SCIALL, 9, MAP_CALL(FileIOFindNext), "r", NULL }, - { SIG_SCIALL, 10, MAP_CALL(FileIOExists), "r", NULL }, - { SIG_SINCE_SCI11, 11, MAP_CALL(FileIORename), "rr", NULL }, -#ifdef ENABLE_SCI32 - { SIG_SCI32, 13, MAP_CALL(FileIOReadByte), "i", NULL }, - { SIG_SCI32, 14, MAP_CALL(FileIOWriteByte), "ii", NULL }, - { SIG_SCI32, 15, MAP_CALL(FileIOReadWord), "i", NULL }, - { SIG_SCI32, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, - { SIG_SCI32, 19, MAP_CALL(Stub), "", NULL }, // for Torin demo -#endif - SCI_SUBOPENTRY_TERMINATOR -}; - -#ifdef ENABLE_SCI32 -// version, subId, function-mapping, signature, workarounds -static const SciKernelMapSubEntry kList_subops[] = { - { SIG_SCI21, 0, MAP_CALL(NewList), "", NULL }, - { SIG_SCI21, 1, MAP_CALL(DisposeList), "l", NULL }, - { SIG_SCI21, 2, MAP_CALL(NewNode), ".", NULL }, - { SIG_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, - { SIG_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, - { SIG_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, - { SIG_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, - { SIG_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, - { SIG_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, - { SIG_SCI21, 9, MAP_CALL(AddAfter), "lnn.", NULL }, - { SIG_SCI21, 10, MAP_CALL(AddToFront), "ln.", NULL }, - { SIG_SCI21, 11, MAP_CALL(AddToEnd), "ln.", NULL }, - { SIG_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, - { SIG_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, - { SIG_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, - { SIG_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, - { SIG_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, - { SIG_SCI21, 17, MAP_CALL(ListAt), "li", NULL }, - // FIXME: This doesn't seem to be ListIndexOf. In Torin demo, an index is - // passed as a second parameter instead of an object. Thus, it seems to - // be something like ListAt instead... If we swap the two subops though, - // Torin demo crashes complaining that it tried to send to a non-object, - // therefore the semantics might be different here (signature was l[o0]) - // In SQ6 object is passed right when skipping the intro - { SIG_SCI21, 18, MAP_CALL(StubNull), "l[io]", NULL }, - { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, - { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, - { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, - { SIG_SCI21, 22, MAP_CALL(Sort), "ooo", NULL }, - SCI_SUBOPENTRY_TERMINATOR -}; -#endif - -struct SciKernelMapEntry { - const char *name; - KernelFunctionCall *function; - - SciVersion fromVersion; - SciVersion toVersion; - byte forPlatform; - - const char *signature; - const SciKernelMapSubEntry *subFunctions; - const SciWorkaroundEntry *workarounds; -}; - -// name, version/platform, signature, sub-signatures, workarounds -static SciKernelMapEntry s_kernelMap[] = { - { MAP_CALL(Abs), SIG_EVERYWHERE, "i", NULL, kAbs_workarounds }, - { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, - { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, - { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, - { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, - { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, - { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, - { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, - { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, - { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, - { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, - { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop - { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, - // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro - // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same - { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, - { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, - { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, - { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, - { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires - { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, - { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, - { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, - { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, - { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, - { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, - { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", kFileIO_subops, NULL }, - { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, - { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, - { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, - // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake - { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, - { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, - { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, - { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, - { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, - { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, - { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, - { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, - { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Graph), SIG_EVERYWHERE, NULL, kGraph_subops, NULL }, - { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, - { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, - { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, - { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, - { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, - { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop - { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, - { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, - { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, - { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, - { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", kPalVary_subops, NULL }, - { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", kPalette_subops, NULL }, - { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, - { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, - { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, - { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, - { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, - { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, - { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, - { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, - { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, - { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, - { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, - { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iiiii)(i)", NULL, kSetPort_workarounds }, - { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL }, - { MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, - { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, - { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, - { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, kStrCpy_workarounds }, - { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, - { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, - { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, - { MAP_CALL(TextSize), SIG_SCIALL, SIGFOR_MAC, "r[r0]i(i)(r0)(i)", NULL, NULL }, - { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, - { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, - { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, - { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, - { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, kUnLoad_workarounds }, - { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, - { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, - -#ifdef ENABLE_SCI32 - // SCI2 Kernel Functions - { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Array), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, - { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, - { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, - { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, - { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, - { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, - { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, - - // SCI2.1 Kernel Functions - { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, - { MAP_CALL(List), SIG_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL }, - { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, - { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } -#endif -}; - Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) : _resMan(resMan), _segMan(segMan), _invalid("") { loadSelectorNames(); @@ -1344,6 +711,39 @@ void Kernel::setDefaultKernelNames() { } } +#ifdef ENABLE_SCI32 + +enum { + kKernelEntriesSci2 = 0x8b, + kKernelEntriesGk2Demo = 0xa0, + kKernelEntriesSci21 = 0x9d +}; + +void Kernel::setKernelNamesSci2() { + _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesSci2); +} + +void Kernel::setKernelNamesSci21(GameFeatures *features) { + // Some SCI games use a modified SCI2 kernel table instead of the + // SCI2.1 kernel table. The GK2 demo does this as well as at least + // one version of KQ7 (1.4). We detect which version to use based on + // how kDoSound is called from Sound::play(). + + // This is interesting because they all have the same interpreter + // version (2.100.002), yet they would not be compatible with other + // games of the same interpreter. + + if (features->detectSci21KernelType() == SCI_VERSION_2) { + _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); + // OnMe is IsOnMe here, but they should be compatible + _kernelNames[0x23] = "Robot"; // Graph in SCI2 + _kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2 + } else + _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21); +} + +#endif + void Kernel::loadKernelNames(GameFeatures *features) { _kernelNames.clear(); @@ -1389,4 +789,26 @@ Common::String Kernel::lookupText(reg_t address, int index) { return NULL; } +// TODO: script_adjust_opcode_formats should probably be part of the +// constructor (?) of a VirtualMachine or a ScriptManager class. +void script_adjust_opcode_formats() { + if (g_sci->_features->detectLofsType() != SCI_VERSION_0_EARLY) { + g_opcode_formats[op_lofsa][0] = Script_Offset; + g_opcode_formats[op_lofss][0] = Script_Offset; + } + +#ifdef ENABLE_SCI32 + // In SCI32, some arguments are now words instead of bytes + if (getSciVersion() >= SCI_VERSION_2) { + g_opcode_formats[op_calle][2] = Script_Word; + g_opcode_formats[op_callk][1] = Script_Word; + g_opcode_formats[op_super][1] = Script_Word; + g_opcode_formats[op_send][0] = Script_Word; + g_opcode_formats[op_self][0] = Script_Word; + g_opcode_formats[op_call][1] = Script_Word; + g_opcode_formats[op_callb][1] = Script_Word; + } +#endif +} + } // End of namespace Sci diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 6fea670623..8de95f56ef 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -436,7 +436,10 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv); reg_t kPlatform(EngineState *s, int argc, reg_t *argv); reg_t kTextColors(EngineState *s, int argc, reg_t *argv); reg_t kTextFonts(EngineState *s, int argc, reg_t *argv); +reg_t kDummy(EngineState *s, int argc, reg_t *argv); reg_t kEmpty(EngineState *s, int argc, reg_t *argv); +reg_t kStub(EngineState *s, int argc, reg_t *argv); +reg_t kStubNull(EngineState *s, int argc, reg_t *argv); #ifdef ENABLE_SCI32 // SCI2 Kernel Functions diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp index f5a50f3fcf..7c90243681 100644 --- a/engines/sci/engine/kernel32.cpp +++ b/engines/sci/engine/kernel32.cpp @@ -25,7 +25,6 @@ #ifdef ENABLE_SCI32 -#include "sci/engine/features.h" #include "sci/engine/kernel.h" #include "sci/engine/segment.h" #include "sci/engine/state.h" @@ -37,362 +36,6 @@ namespace Sci { -// NOTE: 0x72-0x79, 0x85-0x86, 0x88 are from the GK2 demo (which has debug support) and are -// just Dummy in other SCI2 games. -static const char *sci2_default_knames[] = { - /*0x00*/ "Load", - /*0x01*/ "UnLoad", - /*0x02*/ "ScriptID", - /*0x03*/ "DisposeScript", - /*0x04*/ "Lock", - /*0x05*/ "ResCheck", - /*0x06*/ "Purge", - /*0x07*/ "Clone", - /*0x08*/ "DisposeClone", - /*0x09*/ "RespondsTo", - /*0x0a*/ "SetNowSeen", - /*0x0b*/ "NumLoops", - /*0x0c*/ "NumCels", - /*0x0d*/ "CelWide", - /*0x0e*/ "CelHigh", - /*0x0f*/ "GetHighPlanePri", - /*0x10*/ "GetHighItemPri", - /*0x11*/ "ShakeScreen", - /*0x12*/ "OnMe", - /*0x13*/ "ShowMovie", - /*0x14*/ "SetVideoMode", - /*0x15*/ "AddScreenItem", - /*0x16*/ "DeleteScreenItem", - /*0x17*/ "UpdateScreenItem", - /*0x18*/ "FrameOut", - /*0x19*/ "AddPlane", - /*0x1a*/ "DeletePlane", - /*0x1b*/ "UpdatePlane", - /*0x1c*/ "RepaintPlane", - /*0x1d*/ "SetShowStyle", - /*0x1e*/ "ShowStylePercent", - /*0x1f*/ "SetScroll", - /*0x20*/ "AddMagnify", - /*0x21*/ "DeleteMagnify", - /*0x22*/ "IsHiRes", - /*0x23*/ "Graph", - /*0x24*/ "InvertRect", - /*0x25*/ "TextSize", - /*0x26*/ "Message", - /*0x27*/ "TextColors", - /*0x28*/ "TextFonts", - /*0x29*/ "Dummy", - /*0x2a*/ "SetQuitStr", - /*0x2b*/ "EditText", - /*0x2c*/ "InputText", - /*0x2d*/ "CreateTextBitmap", - /*0x2e*/ "DisposeTextBitmap", - /*0x2f*/ "GetEvent", - /*0x30*/ "GlobalToLocal", - /*0x31*/ "LocalToGlobal", - /*0x32*/ "MapKeyToDir", - /*0x33*/ "HaveMouse", - /*0x34*/ "SetCursor", - /*0x35*/ "VibrateMouse", - /*0x36*/ "SaveGame", - /*0x37*/ "RestoreGame", - /*0x38*/ "RestartGame", - /*0x39*/ "GameIsRestarting", - /*0x3a*/ "MakeSaveCatName", - /*0x3b*/ "MakeSaveFileName", - /*0x3c*/ "GetSaveFiles", - /*0x3d*/ "GetSaveDir", - /*0x3e*/ "CheckSaveGame", - /*0x3f*/ "CheckFreeSpace", - /*0x40*/ "DoSound", - /*0x41*/ "DoAudio", - /*0x42*/ "DoSync", - /*0x43*/ "NewList", - /*0x44*/ "DisposeList", - /*0x45*/ "NewNode", - /*0x46*/ "FirstNode", - /*0x47*/ "LastNode", - /*0x48*/ "EmptyList", - /*0x49*/ "NextNode", - /*0x4a*/ "PrevNode", - /*0x4b*/ "NodeValue", - /*0x4c*/ "AddAfter", - /*0x4d*/ "AddToFront", - /*0x4e*/ "AddToEnd", - /*0x4f*/ "Dummy", - /*0x50*/ "Dummy", - /*0x51*/ "FindKey", - /*0x52*/ "Dummy", - /*0x53*/ "Dummy", - /*0x54*/ "Dummy", - /*0x55*/ "DeleteKey", - /*0x56*/ "Dummy", - /*0x57*/ "Dummy", - /*0x58*/ "ListAt", - /*0x59*/ "ListIndexOf", - /*0x5a*/ "ListEachElementDo", - /*0x5b*/ "ListFirstTrue", - /*0x5c*/ "ListAllTrue", - /*0x5d*/ "Random", - /*0x5e*/ "Abs", - /*0x5f*/ "Sqrt", - /*0x60*/ "GetAngle", - /*0x61*/ "GetDistance", - /*0x62*/ "ATan", - /*0x63*/ "SinMult", - /*0x64*/ "CosMult", - /*0x65*/ "SinDiv", - /*0x66*/ "CosDiv", - /*0x67*/ "GetTime", - /*0x68*/ "Platform", - /*0x69*/ "BaseSetter", - /*0x6a*/ "DirLoop", - /*0x6b*/ "CantBeHere", - /*0x6c*/ "InitBresen", - /*0x6d*/ "DoBresen", - /*0x6e*/ "SetJump", - /*0x6f*/ "AvoidPath", - /*0x70*/ "InPolygon", - /*0x71*/ "MergePoly", - /*0x72*/ "SetDebug", - /*0x73*/ "InspectObject", - /*0x74*/ "MemoryInfo", - /*0x75*/ "Profiler", - /*0x76*/ "Record", - /*0x77*/ "PlayBack", - /*0x78*/ "MonoOut", - /*0x79*/ "SetFatalStr", - /*0x7a*/ "GetCWD", - /*0x7b*/ "ValidPath", - /*0x7c*/ "FileIO", - /*0x7d*/ "Dummy", - /*0x7e*/ "DeviceInfo", - /*0x7f*/ "Palette", - /*0x80*/ "PalVary", - /*0x81*/ "PalCycle", - /*0x82*/ "Array", - /*0x83*/ "String", - /*0x84*/ "RemapColors", - /*0x85*/ "IntegrityChecking", - /*0x86*/ "CheckIntegrity", - /*0x87*/ "ObjectIntersect", - /*0x88*/ "MarkMemory", - /*0x89*/ "TextWidth", - /*0x8a*/ "PointSize", - - // GK2 Demo (and similar) only kernel functions - /*0x8b*/ "AddLine", - /*0x8c*/ "DeleteLine", - /*0x8d*/ "UpdateLine", - /*0x8e*/ "AddPolygon", - /*0x8f*/ "DeletePolygon", - /*0x90*/ "UpdatePolygon", - /*0x91*/ "Bitmap", - /*0x92*/ "ScrollWindow", - /*0x93*/ "SetFontRes", - /*0x94*/ "MovePlaneItems", - /*0x95*/ "PreloadResource", - /*0x96*/ "Dummy", - /*0x97*/ "ResourceTrack", - /*0x98*/ "CheckCDisc", - /*0x99*/ "GetSaveCDisc", - /*0x9a*/ "TestPoly", - /*0x9b*/ "WinHelp", - /*0x9c*/ "LoadChunk", - /*0x9d*/ "SetPalStyleRange", - /*0x9e*/ "AddPicAt", - /*0x9f*/ "MessageBox" -}; - -static const char *sci21_default_knames[] = { - /*0x00*/ "Load", - /*0x01*/ "UnLoad", - /*0x02*/ "ScriptID", - /*0x03*/ "DisposeScript", - /*0x04*/ "Lock", - /*0x05*/ "ResCheck", - /*0x06*/ "Purge", - /*0x07*/ "SetLanguage", - /*0x08*/ "Dummy", - /*0x09*/ "Dummy", - /*0x0a*/ "Clone", - /*0x0b*/ "DisposeClone", - /*0x0c*/ "RespondsTo", - /*0x0d*/ "FindSelector", - /*0x0e*/ "FindClass", - /*0x0f*/ "Dummy", - /*0x10*/ "Dummy", - /*0x11*/ "Dummy", - /*0x12*/ "Dummy", - /*0x13*/ "Dummy", - /*0x14*/ "SetNowSeen", - /*0x15*/ "NumLoops", - /*0x16*/ "NumCels", - /*0x17*/ "IsOnMe", - /*0x18*/ "AddMagnify", - /*0x19*/ "DeleteMagnify", - /*0x1a*/ "CelRect", - /*0x1b*/ "BaseLineSpan", - /*0x1c*/ "CelWide", - /*0x1d*/ "CelHigh", - /*0x1e*/ "AddScreenItem", - /*0x1f*/ "DeleteScreenItem", - /*0x20*/ "UpdateScreenItem", - /*0x21*/ "FrameOut", - /*0x22*/ "CelInfo", - /*0x23*/ "Bitmap", - /*0x24*/ "CelLink", - /*0x25*/ "Dummy", - /*0x26*/ "Dummy", - /*0x27*/ "Dummy", - /*0x28*/ "AddPlane", - /*0x29*/ "DeletePlane", - /*0x2a*/ "UpdatePlane", - /*0x2b*/ "RepaintPlane", - /*0x2c*/ "GetHighPlanePri", - /*0x2d*/ "GetHighItemPri", - /*0x2e*/ "SetShowStyle", - /*0x2f*/ "ShowStylePercent", - /*0x30*/ "SetScroll", - /*0x31*/ "MovePlaneItems", - /*0x32*/ "ShakeScreen", - /*0x33*/ "Dummy", - /*0x34*/ "Dummy", - /*0x35*/ "Dummy", - /*0x36*/ "Dummy", - /*0x37*/ "IsHiRes", - /*0x38*/ "SetVideoMode", - /*0x39*/ "ShowMovie", - /*0x3a*/ "Robot", - /*0x3b*/ "CreateTextBitmap", - /*0x3c*/ "Random", - /*0x3d*/ "Abs", - /*0x3e*/ "Sqrt", - /*0x3f*/ "GetAngle", - /*0x40*/ "GetDistance", - /*0x41*/ "ATan", - /*0x42*/ "SinMult", - /*0x43*/ "CosMult", - /*0x44*/ "SinDiv", - /*0x45*/ "CosDiv", - /*0x46*/ "Text", - /*0x47*/ "Dummy", - /*0x48*/ "Message", - /*0x49*/ "Font", - /*0x4a*/ "EditText", - /*0x4b*/ "InputText", - /*0x4c*/ "ScrollWindow", - /*0x4d*/ "Dummy", - /*0x4e*/ "Dummy", - /*0x4f*/ "Dummy", - /*0x50*/ "GetEvent", - /*0x51*/ "GlobalToLocal", - /*0x52*/ "LocalToGlobal", - /*0x53*/ "MapKeyToDir", - /*0x54*/ "HaveMouse", - /*0x55*/ "SetCursor", - /*0x56*/ "VibrateMouse", - /*0x57*/ "Dummy", - /*0x58*/ "Dummy", - /*0x59*/ "Dummy", - /*0x5a*/ "List", - /*0x5b*/ "Array", - /*0x5c*/ "String", - /*0x5d*/ "FileIO", - /*0x5e*/ "BaseSetter", - /*0x5f*/ "DirLoop", - /*0x60*/ "CantBeHere", - /*0x61*/ "InitBresen", - /*0x62*/ "DoBresen", - /*0x63*/ "SetJump", - /*0x64*/ "AvoidPath", - /*0x65*/ "InPolygon", - /*0x66*/ "MergePoly", - /*0x67*/ "ObjectIntersect", - /*0x68*/ "Dummy", - /*0x69*/ "MemoryInfo", - /*0x6a*/ "DeviceInfo", - /*0x6b*/ "Palette", - /*0x6c*/ "PalVary", - /*0x6d*/ "PalCycle", - /*0x6e*/ "RemapColors", - /*0x6f*/ "AddLine", - /*0x70*/ "DeleteLine", - /*0x71*/ "UpdateLine", - /*0x72*/ "AddPolygon", - /*0x73*/ "DeletePolygon", - /*0x74*/ "UpdatePolygon", - /*0x75*/ "DoSound", - /*0x76*/ "DoAudio", - /*0x77*/ "DoSync", - /*0x78*/ "Save", - /*0x79*/ "GetTime", - /*0x7a*/ "Platform", - /*0x7b*/ "CD", - /*0x7c*/ "SetQuitStr", - /*0x7d*/ "GetConfig", - /*0x7e*/ "Table", - /*0x7f*/ "WinHelp", // Windows only - /*0x80*/ "Dummy", - /*0x81*/ "Dummy", - /*0x82*/ "Dummy", - /*0x83*/ "PrintDebug", // used by Shivers 2 (demo and full) - /*0x84*/ "Dummy", - /*0x85*/ "Dummy", - /*0x86*/ "Dummy", - /*0x87*/ "Dummy", - /*0x88*/ "Dummy", - /*0x89*/ "Dummy", - /*0x8a*/ "LoadChunk", - /*0x8b*/ "SetPalStyleRange", - /*0x8c*/ "AddPicAt", - /*0x8d*/ "Dummy", - /*0x8e*/ "NewRoom", - /*0x8f*/ "Dummy", - /*0x90*/ "Priority", - /*0x91*/ "MorphOn", - /*0x92*/ "PlayVMD", - /*0x93*/ "SetHotRectangles", - /*0x94*/ "MulDiv", - /*0x95*/ "GetSierraProfileInt", // Windows only - /*0x96*/ "GetSierraProfileString", // Windows only - /*0x97*/ "SetWindowsOption", // Windows only - /*0x98*/ "GetWindowsOption", // Windows only - /*0x99*/ "WinDLL", // Windows only - /*0x9a*/ "Dummy", - /*0x9b*/ "Dummy", - /*0x9c*/ "DeletePic" -}; - -enum { - kKernelEntriesSci2 = 0x8b, - kKernelEntriesGk2Demo = 0xa0, - kKernelEntriesSci21 = 0x9d -}; - -void Kernel::setKernelNamesSci2() { - _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesSci2); -} - -void Kernel::setKernelNamesSci21(GameFeatures *features) { - // Some SCI games use a modified SCI2 kernel table instead of the - // SCI2.1 kernel table. The GK2 demo does this as well as at least - // one version of KQ7 (1.4). We detect which version to use based on - // how kDoSound is called from Sound::play(). - - // This is interesting because they all have the same interpreter - // version (2.100.002), yet they would not be compatible with other - // games of the same interpreter. - - if (features->detectSci21KernelType() == SCI_VERSION_2) { - _kernelNames = Common::StringArray(sci2_default_knames, kKernelEntriesGk2Demo); - // OnMe is IsOnMe here, but they should be compatible - _kernelNames[0x23] = "Robot"; // Graph in SCI2 - _kernelNames[0x2e] = "Priority"; // DisposeTextBitmap in SCI2 - } else - _kernelNames = Common::StringArray(sci21_default_knames, kKernelEntriesSci21); -} - // SCI2 Kernel Functions reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h new file mode 100644 index 0000000000..2f3e050042 --- /dev/null +++ b/engines/sci/engine/kernel_tables.h @@ -0,0 +1,1024 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCI_ENGINE_KERNEL_TABLES_H +#define SCI_ENGINE_KERNEL_TABLES_H + +#include "sci/engine/workarounds.h" + +namespace Sci { + +// [io] -> either integer or object +// (io) -> optionally integer AND an object +// (i) -> optional integer +// . -> any type +// i* -> optional multiple integers +// .* -> any parameters afterwards (or none) + +struct SciKernelMapSubEntry { + SciVersion fromVersion; + SciVersion toVersion; + + uint16 id; + + const char *name; + KernelFunctionCall *function; + + const char *signature; + const SciWorkaroundEntry *workarounds; +}; + +#define SCI_SUBOPENTRY_TERMINATOR { SCI_VERSION_NONE, SCI_VERSION_NONE, 0, NULL, NULL, NULL, NULL } + + +#define SIG_SCIALL SCI_VERSION_NONE, SCI_VERSION_NONE +#define SIG_SCI0 SCI_VERSION_NONE, SCI_VERSION_01 +#define SIG_SCI1 SCI_VERSION_1_EGA, SCI_VERSION_1_LATE +#define SIG_SCI11 SCI_VERSION_1_1, SCI_VERSION_1_1 +#define SIG_SINCE_SCI11 SCI_VERSION_1_1, SCI_VERSION_NONE +#define SIG_SCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 + +#define SIG_SCI16 SCI_VERSION_NONE, SCI_VERSION_1_1 +#define SIG_SCI32 SCI_VERSION_2, SCI_VERSION_NONE + +// SCI-Sound-Version +#define SIG_SOUNDSCI0 SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE +#define SIG_SOUNDSCI1EARLY SCI_VERSION_1_EARLY, SCI_VERSION_1_EARLY +#define SIG_SOUNDSCI1LATE SCI_VERSION_1_LATE, SCI_VERSION_1_LATE +#define SIG_SOUNDSCI21 SCI_VERSION_2_1, SCI_VERSION_2_1 + +#define SIGFOR_ALL 0x3f +#define SIGFOR_DOS 1 << 0 +#define SIGFOR_PC98 1 << 1 +#define SIGFOR_WIN 1 << 2 +#define SIGFOR_MAC 1 << 3 +#define SIGFOR_AMIGA 1 << 4 +#define SIGFOR_ATARI 1 << 5 +#define SIGFOR_PC SIGFOR_DOS|SIGFOR_WIN + +#define SIG_EVERYWHERE SIG_SCIALL, SIGFOR_ALL + +#define MAP_CALL(_name_) #_name_, k##_name_ + +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kDoSound_subops[] = { + { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, + { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, + { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "o", NULL }, + { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, + { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, + { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, + { SIG_SOUNDSCI0, 6, MAP_CALL(DoSoundPause), "i", NULL }, + { SIG_SOUNDSCI0, 7, MAP_CALL(DoSoundResumeAfterRestore), "", NULL }, + { SIG_SOUNDSCI0, 8, MAP_CALL(DoSoundMasterVolume), "(i)", NULL }, + { SIG_SOUNDSCI0, 9, MAP_CALL(DoSoundUpdate), "o", NULL }, + { SIG_SOUNDSCI0, 10, MAP_CALL(DoSoundFade), "o", kDoSoundFade_workarounds }, + { SIG_SOUNDSCI0, 11, MAP_CALL(DoSoundGetPolyphony), "", NULL }, + { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, + { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 6, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 7, MAP_CALL(DoSoundPlay), "oi", NULL }, + // ^^ TODO: In SCI1-SCI1.1 DoSound (play) is called by 2 methods of the Sound object: play and + // playBed. The methods are the same, apart from the second integer parameter: it's 0 in + // play and 1 in playBed, to distinguish the caller. It's passed on, we should find out what + // it actually does internally + { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, + { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, + { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, + { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, + { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, + { SIG_SOUNDSCI1EARLY, 14, MAP_CALL(DoSoundSetHold), "oi", NULL }, + { SIG_SOUNDSCI1EARLY, 15, MAP_CALL(DoSoundDummy), "", NULL }, + // ^^ Longbow demo + { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), "", NULL }, + { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, + { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, + { SIG_SOUNDSCI1LATE, 6, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 8, MAP_CALL(DoSoundPlay), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 9, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 10, MAP_CALL(DoSoundPause), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 11, MAP_CALL(DoSoundFade), "oiiii(i)", kDoSoundFade_workarounds }, + { SIG_SOUNDSCI1LATE, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 14, MAP_CALL(DoSoundSetVolume), "oi", NULL }, + { SIG_SOUNDSCI1LATE, 15, MAP_CALL(DoSoundSetPriority), "oi", NULL }, + { SIG_SOUNDSCI1LATE, 16, MAP_CALL(DoSoundSetLoop), "oi", NULL }, + { SIG_SOUNDSCI1LATE, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 18, MAP_CALL(DoSoundSendMidi), "oiii(i)", NULL }, + { SIG_SOUNDSCI1LATE, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, + { SIG_SOUNDSCI1LATE, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, +#ifdef ENABLE_SCI32 + { SIG_SOUNDSCI21, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, + { SIG_SOUNDSCI21, 1, MAP_CALL(DoSoundMute), NULL, NULL }, + { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI21, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, + { SIG_SOUNDSCI21, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, + { SIG_SOUNDSCI21, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, + { SIG_SOUNDSCI21, 6, MAP_CALL(DoSoundInit), NULL, NULL }, + { SIG_SOUNDSCI21, 7, MAP_CALL(DoSoundDispose), NULL, NULL }, + { SIG_SOUNDSCI21, 8, MAP_CALL(DoSoundPlay), "o(i)", NULL }, + // ^^ TODO: if this is really the only change between SCI1LATE AND SCI21, we could rename the + // SIG_SOUNDSCI1LATE #define to SIG_SINCE_SOUNDSCI1LATE and make it being SCI1LATE+. Although + // I guess there are many more changes somewhere + // TODO: Quest for Glory 4 (SCI2.1) uses the old scheme, we need to detect it accordingly + // signature for SCI21 should be "o" + { SIG_SOUNDSCI21, 9, MAP_CALL(DoSoundStop), NULL, NULL }, + { SIG_SOUNDSCI21, 10, MAP_CALL(DoSoundPause), NULL, NULL }, + { SIG_SOUNDSCI21, 11, MAP_CALL(DoSoundFade), NULL, NULL }, + { SIG_SOUNDSCI21, 12, MAP_CALL(DoSoundSetHold), NULL, NULL }, + { SIG_SOUNDSCI21, 13, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI21, 14, MAP_CALL(DoSoundSetVolume), NULL, NULL }, + { SIG_SOUNDSCI21, 15, MAP_CALL(DoSoundSetPriority), NULL, NULL }, + { SIG_SOUNDSCI21, 16, MAP_CALL(DoSoundSetLoop), NULL, NULL }, + { SIG_SOUNDSCI21, 17, MAP_CALL(DoSoundUpdateCues), NULL, NULL }, + { SIG_SOUNDSCI21, 18, MAP_CALL(DoSoundSendMidi), NULL, NULL }, + { SIG_SOUNDSCI21, 19, MAP_CALL(DoSoundReverb), NULL, NULL }, + { SIG_SOUNDSCI21, 20, MAP_CALL(DoSoundUpdate), NULL, NULL }, +#endif + SCI_SUBOPENTRY_TERMINATOR +}; + +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kGraph_subops[] = { + { SIG_SCI32, 1, MAP_CALL(StubNull), "", NULL }, // called by gk1 sci32 right at the start + { SIG_SCIALL, 2, MAP_CALL(GraphGetColorCount), "", NULL }, + // 3 - set palette via resource + { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", kGraphDrawLine_workarounds }, + // 5 - nop + // 6 - draw pattern + { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, + { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, + // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same + { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, + { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", kGraphFillBoxForeground_workarounds }, + { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, + { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires + { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, + { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, + { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, + { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires + SCI_SUBOPENTRY_TERMINATOR +}; + +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kPalVary_subops[] = { + { SIG_SCI21, 0, MAP_CALL(PalVaryInit), "ii(i)(i)(i)", NULL }, + { SIG_SCIALL, 0, MAP_CALL(PalVaryInit), "ii(i)(i)", NULL }, + { SIG_SCIALL, 1, MAP_CALL(PalVaryReverse), "(i)(i)(i)", NULL }, + { SIG_SCIALL, 2, MAP_CALL(PalVaryGetCurrentStep), "", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PalVaryDeinit), "", NULL }, + { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, + { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, + { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, + { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kPalette_subops[] = { + { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, + { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", NULL }, + { SIG_SCIALL, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, + { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, + { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, + { SIG_SCIALL, 7, MAP_CALL(PaletteSave), "", NULL }, + { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "i", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + +static const SciKernelMapSubEntry kFileIO_subops[] = { + { SIG_SCI32, 0, MAP_CALL(FileIOOpen), "r(i)", NULL }, + { SIG_SCIALL, 0, MAP_CALL(FileIOOpen), "ri", NULL }, + { SIG_SCIALL, 1, MAP_CALL(FileIOClose), "i", NULL }, + { SIG_SCIALL, 2, MAP_CALL(FileIOReadRaw), "iri", NULL }, + { SIG_SCIALL, 3, MAP_CALL(FileIOWriteRaw), "iri", NULL }, + { SIG_SCIALL, 4, MAP_CALL(FileIOUnlink), "r", NULL }, + { SIG_SCIALL, 5, MAP_CALL(FileIOReadString), "rii", NULL }, + { SIG_SCIALL, 6, MAP_CALL(FileIOWriteString), "ir", NULL }, + { SIG_SCIALL, 7, MAP_CALL(FileIOSeek), "iii", NULL }, + { SIG_SCIALL, 8, MAP_CALL(FileIOFindFirst), "rri", NULL }, + { SIG_SCIALL, 9, MAP_CALL(FileIOFindNext), "r", NULL }, + { SIG_SCIALL, 10, MAP_CALL(FileIOExists), "r", NULL }, + { SIG_SINCE_SCI11, 11, MAP_CALL(FileIORename), "rr", NULL }, +#ifdef ENABLE_SCI32 + { SIG_SCI32, 13, MAP_CALL(FileIOReadByte), "i", NULL }, + { SIG_SCI32, 14, MAP_CALL(FileIOWriteByte), "ii", NULL }, + { SIG_SCI32, 15, MAP_CALL(FileIOReadWord), "i", NULL }, + { SIG_SCI32, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, + { SIG_SCI32, 19, MAP_CALL(Stub), "", NULL }, // for Torin demo +#endif + SCI_SUBOPENTRY_TERMINATOR +}; + +#ifdef ENABLE_SCI32 +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kList_subops[] = { + { SIG_SCI21, 0, MAP_CALL(NewList), "", NULL }, + { SIG_SCI21, 1, MAP_CALL(DisposeList), "l", NULL }, + { SIG_SCI21, 2, MAP_CALL(NewNode), ".", NULL }, + { SIG_SCI21, 3, MAP_CALL(FirstNode), "[l0]", NULL }, + { SIG_SCI21, 4, MAP_CALL(LastNode), "l", NULL }, + { SIG_SCI21, 5, MAP_CALL(EmptyList), "l", NULL }, + { SIG_SCI21, 6, MAP_CALL(NextNode), "n", NULL }, + { SIG_SCI21, 7, MAP_CALL(PrevNode), "n", NULL }, + { SIG_SCI21, 8, MAP_CALL(NodeValue), "[n0]", NULL }, + { SIG_SCI21, 9, MAP_CALL(AddAfter), "lnn.", NULL }, + { SIG_SCI21, 10, MAP_CALL(AddToFront), "ln.", NULL }, + { SIG_SCI21, 11, MAP_CALL(AddToEnd), "ln.", NULL }, + { SIG_SCI21, 12, MAP_CALL(AddBefore), "ln.", NULL }, + { SIG_SCI21, 13, MAP_CALL(MoveToFront), "ln", NULL }, + { SIG_SCI21, 14, MAP_CALL(MoveToEnd), "ln", NULL }, + { SIG_SCI21, 15, MAP_CALL(FindKey), "l.", NULL }, + { SIG_SCI21, 16, MAP_CALL(DeleteKey), "l.", NULL }, + { SIG_SCI21, 17, MAP_CALL(ListAt), "li", NULL }, + // FIXME: This doesn't seem to be ListIndexOf. In Torin demo, an index is + // passed as a second parameter instead of an object. Thus, it seems to + // be something like ListAt instead... If we swap the two subops though, + // Torin demo crashes complaining that it tried to send to a non-object, + // therefore the semantics might be different here (signature was l[o0]) + // In SQ6 object is passed right when skipping the intro + { SIG_SCI21, 18, MAP_CALL(StubNull), "l[io]", NULL }, + { SIG_SCI21, 19, MAP_CALL(ListEachElementDo), "li(.*)", NULL }, + { SIG_SCI21, 20, MAP_CALL(ListFirstTrue), "li(.*)", NULL }, + { SIG_SCI21, 21, MAP_CALL(ListAllTrue), "li(.*)", NULL }, + { SIG_SCI21, 22, MAP_CALL(Sort), "ooo", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; +#endif + +struct SciKernelMapEntry { + const char *name; + KernelFunctionCall *function; + + SciVersion fromVersion; + SciVersion toVersion; + byte forPlatform; + + const char *signature; + const SciKernelMapSubEntry *subFunctions; + const SciWorkaroundEntry *workarounds; +}; + +// name, version/platform, signature, sub-signatures, workarounds +static SciKernelMapEntry s_kernelMap[] = { + { MAP_CALL(Abs), SIG_EVERYWHERE, "i", NULL, kAbs_workarounds }, + { MAP_CALL(AddAfter), SIG_EVERYWHERE, "lnn", NULL, NULL }, + { MAP_CALL(AddMenu), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(AddToEnd), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(AddToFront), SIG_EVERYWHERE, "ln", NULL, NULL }, + { MAP_CALL(AddToPic), SIG_EVERYWHERE, "[il](iiiiii)", NULL, NULL }, + { MAP_CALL(Animate), SIG_EVERYWHERE, "(l0)(i)", NULL, NULL }, + { MAP_CALL(AssertPalette), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, + { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, + { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, + { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop + { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, + // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro + // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same + { MAP_CALL(DirLoop), SIG_EVERYWHERE, "oi", NULL, NULL }, + { MAP_CALL(DisposeClone), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DisposeList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(DisposeScript), SIG_EVERYWHERE, "i(i*)", NULL, kDisposeScript_workarounds }, + { MAP_CALL(DisposeWindow), SIG_EVERYWHERE, "i(i)", NULL, NULL }, + { MAP_CALL(DoAudio), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(DoAvoider), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, + { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, + { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(DrawPic), SIG_EVERYWHERE, "i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(DrawStatus), SIG_EVERYWHERE, "[r0](i)(i)", NULL, NULL }, + { MAP_CALL(EditControl), SIG_EVERYWHERE, "[o0][o0]", NULL, NULL }, + { MAP_CALL(Empty), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(EmptyList), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(FClose), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(FGets), SIG_EVERYWHERE, "rii", NULL, NULL }, + { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, + { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, + { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", kFileIO_subops, NULL }, + { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, + { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, + { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, + // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake + { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, + { MAP_CALL(GetEvent), SIG_EVERYWHERE, "io", NULL, NULL }, + { MAP_CALL(GetFarText), SIG_EVERYWHERE, "ii[r0]", NULL, NULL }, + { MAP_CALL(GetMenu), SIG_EVERYWHERE, "i.", NULL, NULL }, + { MAP_CALL(GetMessage), SIG_EVERYWHERE, "iiir", NULL, NULL }, + { MAP_CALL(GetPort), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_SCI32, SIGFOR_ALL, "(r*)", NULL, NULL }, + { MAP_CALL(GetSaveDir), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetSaveFiles), SIG_EVERYWHERE, "rrr", NULL, NULL }, + { MAP_CALL(GetTime), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(GlobalToLocal), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Graph), SIG_EVERYWHERE, NULL, kGraph_subops, NULL }, + { MAP_CALL(HaveMouse), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(HiliteControl), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, + { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, + { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, + { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, + { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_SCI32, SIGFOR_ALL, "oo", NULL, NULL }, + { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop + { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(MergePoly), SIG_EVERYWHERE, "rli", NULL, NULL }, + { MAP_CALL(Message), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(MoveCursor), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(NewList), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(NewNode), SIG_EVERYWHERE, "..", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, + { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(NumLoops), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(OnControl), SIG_EVERYWHERE, "ii(i)(i)(i)", NULL, NULL }, + { MAP_CALL(PalVary), SIG_EVERYWHERE, "i(i*)", kPalVary_subops, NULL }, + { MAP_CALL(Palette), SIG_EVERYWHERE, "i(.*)", kPalette_subops, NULL }, + { MAP_CALL(Parse), SIG_EVERYWHERE, "ro", NULL, NULL }, + { MAP_CALL(PicNotValid), SIG_EVERYWHERE, "(i)", NULL, NULL }, + { MAP_CALL(Platform), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, + { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, + { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, + { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "rir", NULL, NULL }, + { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, + { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, + { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, + { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, + { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, + { MAP_CALL(SetNowSeen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, + { MAP_CALL(SetPort), SIG_EVERYWHERE, "i(iiiii)(i)", NULL, kSetPort_workarounds }, + { MAP_CALL(SetQuitStr), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(SetSynonyms), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(SetVideoMode), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(ShakeScreen), SIG_EVERYWHERE, "(i)(i)", NULL, NULL }, + { MAP_CALL(ShowMovie), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, + { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, + { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, + { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, kStrCpy_workarounds }, + { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, + { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, + { MAP_CALL(TextColors), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextFonts), SIG_EVERYWHERE, "(i*)", NULL, NULL }, + { MAP_CALL(TextSize), SIG_SCIALL, SIGFOR_MAC, "r[r0]i(i)(r0)(i)", NULL, NULL }, + { MAP_CALL(TextSize), SIG_EVERYWHERE, "r[r0]i(i)(r0)", NULL, NULL }, + { MAP_CALL(TimesCos), SIG_EVERYWHERE, "ii", NULL, NULL }, + { "CosMult", kTimesCos, SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesCot), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesSin), SIG_EVERYWHERE, "ii", NULL, NULL }, + { "SinMult", kTimesSin, SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(TimesTan), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(UnLoad), SIG_EVERYWHERE, "i[ri]", NULL, kUnLoad_workarounds }, + { MAP_CALL(ValidPath), SIG_EVERYWHERE, "r", NULL, NULL }, + { MAP_CALL(Wait), SIG_EVERYWHERE, "i", NULL, NULL }, + +#ifdef ENABLE_SCI32 + // SCI2 Kernel Functions + { MAP_CALL(AddPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(AddScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(Array), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(CreateTextBitmap), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, + { MAP_CALL(DeletePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(DeleteScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(FrameOut), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(GetHighPlanePri), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(InPolygon), SIG_EVERYWHERE, "iio", NULL, NULL }, + { MAP_CALL(IsHiRes), SIG_EVERYWHERE, "", NULL, NULL }, + { MAP_CALL(ListAllTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListAt), SIG_EVERYWHERE, "li", NULL, NULL }, + { MAP_CALL(ListEachElementDo), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListFirstTrue), SIG_EVERYWHERE, "li(.*)", NULL, NULL }, + { MAP_CALL(ListIndexOf), SIG_EVERYWHERE, "l[o0]", NULL, NULL }, + { MAP_CALL(OnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, + { MAP_CALL(RepaintPlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(String), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(UpdatePlane), SIG_EVERYWHERE, "o", NULL, NULL }, + { MAP_CALL(UpdateScreenItem), SIG_EVERYWHERE, "o", NULL, NULL }, + + // SCI2.1 Kernel Functions + { MAP_CALL(CD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(IsOnMe), SIG_EVERYWHERE, "iio(.*)", NULL, NULL }, + { MAP_CALL(List), SIG_SCI21, SIGFOR_ALL, "(.*)", kList_subops, NULL }, + { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, + { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } +#endif +}; + +/** Default kernel name table. */ +static const char *s_defaultKernelNames[] = { + /*0x00*/ "Load", + /*0x01*/ "UnLoad", + /*0x02*/ "ScriptID", + /*0x03*/ "DisposeScript", + /*0x04*/ "Clone", + /*0x05*/ "DisposeClone", + /*0x06*/ "IsObject", + /*0x07*/ "RespondsTo", + /*0x08*/ "DrawPic", + /*0x09*/ "Dummy", // Show + /*0x0a*/ "PicNotValid", + /*0x0b*/ "Animate", + /*0x0c*/ "SetNowSeen", + /*0x0d*/ "NumLoops", + /*0x0e*/ "NumCels", + /*0x0f*/ "CelWide", + /*0x10*/ "CelHigh", + /*0x11*/ "DrawCel", + /*0x12*/ "AddToPic", + /*0x13*/ "NewWindow", + /*0x14*/ "GetPort", + /*0x15*/ "SetPort", + /*0x16*/ "DisposeWindow", + /*0x17*/ "DrawControl", + /*0x18*/ "HiliteControl", + /*0x19*/ "EditControl", + /*0x1a*/ "TextSize", + /*0x1b*/ "Display", + /*0x1c*/ "GetEvent", + /*0x1d*/ "GlobalToLocal", + /*0x1e*/ "LocalToGlobal", + /*0x1f*/ "MapKeyToDir", + /*0x20*/ "DrawMenuBar", + /*0x21*/ "MenuSelect", + /*0x22*/ "AddMenu", + /*0x23*/ "DrawStatus", + /*0x24*/ "Parse", + /*0x25*/ "Said", + /*0x26*/ "SetSynonyms", // Portrait (KQ6 hires) + /*0x27*/ "HaveMouse", + /*0x28*/ "SetCursor", + // FOpen (SCI0) + // FPuts (SCI0) + // FGets (SCI0) + // FClose (SCI0) + /*0x29*/ "SaveGame", + /*0x2a*/ "RestoreGame", + /*0x2b*/ "RestartGame", + /*0x2c*/ "GameIsRestarting", + /*0x2d*/ "DoSound", + /*0x2e*/ "NewList", + /*0x2f*/ "DisposeList", + /*0x30*/ "NewNode", + /*0x31*/ "FirstNode", + /*0x32*/ "LastNode", + /*0x33*/ "EmptyList", + /*0x34*/ "NextNode", + /*0x35*/ "PrevNode", + /*0x36*/ "NodeValue", + /*0x37*/ "AddAfter", + /*0x38*/ "AddToFront", + /*0x39*/ "AddToEnd", + /*0x3a*/ "FindKey", + /*0x3b*/ "DeleteKey", + /*0x3c*/ "Random", + /*0x3d*/ "Abs", + /*0x3e*/ "Sqrt", + /*0x3f*/ "GetAngle", + /*0x40*/ "GetDistance", + /*0x41*/ "Wait", + /*0x42*/ "GetTime", + /*0x43*/ "StrEnd", + /*0x44*/ "StrCat", + /*0x45*/ "StrCmp", + /*0x46*/ "StrLen", + /*0x47*/ "StrCpy", + /*0x48*/ "Format", + /*0x49*/ "GetFarText", + /*0x4a*/ "ReadNumber", + /*0x4b*/ "BaseSetter", + /*0x4c*/ "DirLoop", + /*0x4d*/ "CanBeHere", // CantBeHere in newer SCI versions + /*0x4e*/ "OnControl", + /*0x4f*/ "InitBresen", + /*0x50*/ "DoBresen", + /*0x51*/ "Platform", // DoAvoider (SCI0) + /*0x52*/ "SetJump", + /*0x53*/ "SetDebug", + /*0x54*/ "Dummy", // InspectObj + /*0x55*/ "Dummy", // ShowSends + /*0x56*/ "Dummy", // ShowObjs + /*0x57*/ "Dummy", // ShowFree + /*0x58*/ "MemoryInfo", + /*0x59*/ "Dummy", // StackUsage + /*0x5a*/ "Dummy", // Profiler + /*0x5b*/ "GetMenu", + /*0x5c*/ "SetMenu", + /*0x5d*/ "GetSaveFiles", + /*0x5e*/ "GetCWD", + /*0x5f*/ "CheckFreeSpace", + /*0x60*/ "ValidPath", + /*0x61*/ "CoordPri", + /*0x62*/ "StrAt", + /*0x63*/ "DeviceInfo", + /*0x64*/ "GetSaveDir", + /*0x65*/ "CheckSaveGame", + /*0x66*/ "ShakeScreen", + /*0x67*/ "FlushResources", + /*0x68*/ "SinMult", + /*0x69*/ "CosMult", + /*0x6a*/ "SinDiv", + /*0x6b*/ "CosDiv", + /*0x6c*/ "Graph", + /*0x6d*/ "Joystick", + // End of kernel function table for SCI0 + /*0x6e*/ "Dummy", // ShiftScreen + /*0x6f*/ "Palette", + /*0x70*/ "MemorySegment", + /*0x71*/ "Intersections", // MoveCursor (SCI1 late), PalVary (SCI1.1) + /*0x72*/ "Memory", + /*0x73*/ "Dummy", // ListOps + /*0x74*/ "FileIO", + /*0x75*/ "DoAudio", + /*0x76*/ "DoSync", + /*0x77*/ "AvoidPath", + /*0x78*/ "Sort", // StrSplit (SCI01) + /*0x79*/ "Dummy", // ATan + /*0x7a*/ "Lock", + /*0x7b*/ "StrSplit", + /*0x7c*/ "GetMessage", // Message (SCI1.1) + /*0x7d*/ "IsItSkip", + /*0x7e*/ "MergePoly", + /*0x7f*/ "ResCheck", + /*0x80*/ "AssertPalette", + /*0x81*/ "TextColors", + /*0x82*/ "TextFonts", + /*0x83*/ "Dummy", // Record + /*0x84*/ "Dummy", // PlayBack + /*0x85*/ "ShowMovie", + /*0x86*/ "SetVideoMode", + /*0x87*/ "SetQuitStr", + /*0x88*/ "Dummy" // DbugStr +}; + +#ifdef ENABLE_SCI32 + +// NOTE: 0x72-0x79, 0x85-0x86, 0x88 are from the GK2 demo (which has debug support) and are +// just Dummy in other SCI2 games. +static const char *sci2_default_knames[] = { + /*0x00*/ "Load", + /*0x01*/ "UnLoad", + /*0x02*/ "ScriptID", + /*0x03*/ "DisposeScript", + /*0x04*/ "Lock", + /*0x05*/ "ResCheck", + /*0x06*/ "Purge", + /*0x07*/ "Clone", + /*0x08*/ "DisposeClone", + /*0x09*/ "RespondsTo", + /*0x0a*/ "SetNowSeen", + /*0x0b*/ "NumLoops", + /*0x0c*/ "NumCels", + /*0x0d*/ "CelWide", + /*0x0e*/ "CelHigh", + /*0x0f*/ "GetHighPlanePri", + /*0x10*/ "GetHighItemPri", + /*0x11*/ "ShakeScreen", + /*0x12*/ "OnMe", + /*0x13*/ "ShowMovie", + /*0x14*/ "SetVideoMode", + /*0x15*/ "AddScreenItem", + /*0x16*/ "DeleteScreenItem", + /*0x17*/ "UpdateScreenItem", + /*0x18*/ "FrameOut", + /*0x19*/ "AddPlane", + /*0x1a*/ "DeletePlane", + /*0x1b*/ "UpdatePlane", + /*0x1c*/ "RepaintPlane", + /*0x1d*/ "SetShowStyle", + /*0x1e*/ "ShowStylePercent", + /*0x1f*/ "SetScroll", + /*0x20*/ "AddMagnify", + /*0x21*/ "DeleteMagnify", + /*0x22*/ "IsHiRes", + /*0x23*/ "Graph", + /*0x24*/ "InvertRect", + /*0x25*/ "TextSize", + /*0x26*/ "Message", + /*0x27*/ "TextColors", + /*0x28*/ "TextFonts", + /*0x29*/ "Dummy", + /*0x2a*/ "SetQuitStr", + /*0x2b*/ "EditText", + /*0x2c*/ "InputText", + /*0x2d*/ "CreateTextBitmap", + /*0x2e*/ "DisposeTextBitmap", + /*0x2f*/ "GetEvent", + /*0x30*/ "GlobalToLocal", + /*0x31*/ "LocalToGlobal", + /*0x32*/ "MapKeyToDir", + /*0x33*/ "HaveMouse", + /*0x34*/ "SetCursor", + /*0x35*/ "VibrateMouse", + /*0x36*/ "SaveGame", + /*0x37*/ "RestoreGame", + /*0x38*/ "RestartGame", + /*0x39*/ "GameIsRestarting", + /*0x3a*/ "MakeSaveCatName", + /*0x3b*/ "MakeSaveFileName", + /*0x3c*/ "GetSaveFiles", + /*0x3d*/ "GetSaveDir", + /*0x3e*/ "CheckSaveGame", + /*0x3f*/ "CheckFreeSpace", + /*0x40*/ "DoSound", + /*0x41*/ "DoAudio", + /*0x42*/ "DoSync", + /*0x43*/ "NewList", + /*0x44*/ "DisposeList", + /*0x45*/ "NewNode", + /*0x46*/ "FirstNode", + /*0x47*/ "LastNode", + /*0x48*/ "EmptyList", + /*0x49*/ "NextNode", + /*0x4a*/ "PrevNode", + /*0x4b*/ "NodeValue", + /*0x4c*/ "AddAfter", + /*0x4d*/ "AddToFront", + /*0x4e*/ "AddToEnd", + /*0x4f*/ "Dummy", + /*0x50*/ "Dummy", + /*0x51*/ "FindKey", + /*0x52*/ "Dummy", + /*0x53*/ "Dummy", + /*0x54*/ "Dummy", + /*0x55*/ "DeleteKey", + /*0x56*/ "Dummy", + /*0x57*/ "Dummy", + /*0x58*/ "ListAt", + /*0x59*/ "ListIndexOf", + /*0x5a*/ "ListEachElementDo", + /*0x5b*/ "ListFirstTrue", + /*0x5c*/ "ListAllTrue", + /*0x5d*/ "Random", + /*0x5e*/ "Abs", + /*0x5f*/ "Sqrt", + /*0x60*/ "GetAngle", + /*0x61*/ "GetDistance", + /*0x62*/ "ATan", + /*0x63*/ "SinMult", + /*0x64*/ "CosMult", + /*0x65*/ "SinDiv", + /*0x66*/ "CosDiv", + /*0x67*/ "GetTime", + /*0x68*/ "Platform", + /*0x69*/ "BaseSetter", + /*0x6a*/ "DirLoop", + /*0x6b*/ "CantBeHere", + /*0x6c*/ "InitBresen", + /*0x6d*/ "DoBresen", + /*0x6e*/ "SetJump", + /*0x6f*/ "AvoidPath", + /*0x70*/ "InPolygon", + /*0x71*/ "MergePoly", + /*0x72*/ "SetDebug", + /*0x73*/ "InspectObject", + /*0x74*/ "MemoryInfo", + /*0x75*/ "Profiler", + /*0x76*/ "Record", + /*0x77*/ "PlayBack", + /*0x78*/ "MonoOut", + /*0x79*/ "SetFatalStr", + /*0x7a*/ "GetCWD", + /*0x7b*/ "ValidPath", + /*0x7c*/ "FileIO", + /*0x7d*/ "Dummy", + /*0x7e*/ "DeviceInfo", + /*0x7f*/ "Palette", + /*0x80*/ "PalVary", + /*0x81*/ "PalCycle", + /*0x82*/ "Array", + /*0x83*/ "String", + /*0x84*/ "RemapColors", + /*0x85*/ "IntegrityChecking", + /*0x86*/ "CheckIntegrity", + /*0x87*/ "ObjectIntersect", + /*0x88*/ "MarkMemory", + /*0x89*/ "TextWidth", + /*0x8a*/ "PointSize", + + // GK2 Demo (and similar) only kernel functions + /*0x8b*/ "AddLine", + /*0x8c*/ "DeleteLine", + /*0x8d*/ "UpdateLine", + /*0x8e*/ "AddPolygon", + /*0x8f*/ "DeletePolygon", + /*0x90*/ "UpdatePolygon", + /*0x91*/ "Bitmap", + /*0x92*/ "ScrollWindow", + /*0x93*/ "SetFontRes", + /*0x94*/ "MovePlaneItems", + /*0x95*/ "PreloadResource", + /*0x96*/ "Dummy", + /*0x97*/ "ResourceTrack", + /*0x98*/ "CheckCDisc", + /*0x99*/ "GetSaveCDisc", + /*0x9a*/ "TestPoly", + /*0x9b*/ "WinHelp", + /*0x9c*/ "LoadChunk", + /*0x9d*/ "SetPalStyleRange", + /*0x9e*/ "AddPicAt", + /*0x9f*/ "MessageBox" +}; + +static const char *sci21_default_knames[] = { + /*0x00*/ "Load", + /*0x01*/ "UnLoad", + /*0x02*/ "ScriptID", + /*0x03*/ "DisposeScript", + /*0x04*/ "Lock", + /*0x05*/ "ResCheck", + /*0x06*/ "Purge", + /*0x07*/ "SetLanguage", + /*0x08*/ "Dummy", + /*0x09*/ "Dummy", + /*0x0a*/ "Clone", + /*0x0b*/ "DisposeClone", + /*0x0c*/ "RespondsTo", + /*0x0d*/ "FindSelector", + /*0x0e*/ "FindClass", + /*0x0f*/ "Dummy", + /*0x10*/ "Dummy", + /*0x11*/ "Dummy", + /*0x12*/ "Dummy", + /*0x13*/ "Dummy", + /*0x14*/ "SetNowSeen", + /*0x15*/ "NumLoops", + /*0x16*/ "NumCels", + /*0x17*/ "IsOnMe", + /*0x18*/ "AddMagnify", + /*0x19*/ "DeleteMagnify", + /*0x1a*/ "CelRect", + /*0x1b*/ "BaseLineSpan", + /*0x1c*/ "CelWide", + /*0x1d*/ "CelHigh", + /*0x1e*/ "AddScreenItem", + /*0x1f*/ "DeleteScreenItem", + /*0x20*/ "UpdateScreenItem", + /*0x21*/ "FrameOut", + /*0x22*/ "CelInfo", + /*0x23*/ "Bitmap", + /*0x24*/ "CelLink", + /*0x25*/ "Dummy", + /*0x26*/ "Dummy", + /*0x27*/ "Dummy", + /*0x28*/ "AddPlane", + /*0x29*/ "DeletePlane", + /*0x2a*/ "UpdatePlane", + /*0x2b*/ "RepaintPlane", + /*0x2c*/ "GetHighPlanePri", + /*0x2d*/ "GetHighItemPri", + /*0x2e*/ "SetShowStyle", + /*0x2f*/ "ShowStylePercent", + /*0x30*/ "SetScroll", + /*0x31*/ "MovePlaneItems", + /*0x32*/ "ShakeScreen", + /*0x33*/ "Dummy", + /*0x34*/ "Dummy", + /*0x35*/ "Dummy", + /*0x36*/ "Dummy", + /*0x37*/ "IsHiRes", + /*0x38*/ "SetVideoMode", + /*0x39*/ "ShowMovie", + /*0x3a*/ "Robot", + /*0x3b*/ "CreateTextBitmap", + /*0x3c*/ "Random", + /*0x3d*/ "Abs", + /*0x3e*/ "Sqrt", + /*0x3f*/ "GetAngle", + /*0x40*/ "GetDistance", + /*0x41*/ "ATan", + /*0x42*/ "SinMult", + /*0x43*/ "CosMult", + /*0x44*/ "SinDiv", + /*0x45*/ "CosDiv", + /*0x46*/ "Text", + /*0x47*/ "Dummy", + /*0x48*/ "Message", + /*0x49*/ "Font", + /*0x4a*/ "EditText", + /*0x4b*/ "InputText", + /*0x4c*/ "ScrollWindow", + /*0x4d*/ "Dummy", + /*0x4e*/ "Dummy", + /*0x4f*/ "Dummy", + /*0x50*/ "GetEvent", + /*0x51*/ "GlobalToLocal", + /*0x52*/ "LocalToGlobal", + /*0x53*/ "MapKeyToDir", + /*0x54*/ "HaveMouse", + /*0x55*/ "SetCursor", + /*0x56*/ "VibrateMouse", + /*0x57*/ "Dummy", + /*0x58*/ "Dummy", + /*0x59*/ "Dummy", + /*0x5a*/ "List", + /*0x5b*/ "Array", + /*0x5c*/ "String", + /*0x5d*/ "FileIO", + /*0x5e*/ "BaseSetter", + /*0x5f*/ "DirLoop", + /*0x60*/ "CantBeHere", + /*0x61*/ "InitBresen", + /*0x62*/ "DoBresen", + /*0x63*/ "SetJump", + /*0x64*/ "AvoidPath", + /*0x65*/ "InPolygon", + /*0x66*/ "MergePoly", + /*0x67*/ "ObjectIntersect", + /*0x68*/ "Dummy", + /*0x69*/ "MemoryInfo", + /*0x6a*/ "DeviceInfo", + /*0x6b*/ "Palette", + /*0x6c*/ "PalVary", + /*0x6d*/ "PalCycle", + /*0x6e*/ "RemapColors", + /*0x6f*/ "AddLine", + /*0x70*/ "DeleteLine", + /*0x71*/ "UpdateLine", + /*0x72*/ "AddPolygon", + /*0x73*/ "DeletePolygon", + /*0x74*/ "UpdatePolygon", + /*0x75*/ "DoSound", + /*0x76*/ "DoAudio", + /*0x77*/ "DoSync", + /*0x78*/ "Save", + /*0x79*/ "GetTime", + /*0x7a*/ "Platform", + /*0x7b*/ "CD", + /*0x7c*/ "SetQuitStr", + /*0x7d*/ "GetConfig", + /*0x7e*/ "Table", + /*0x7f*/ "WinHelp", // Windows only + /*0x80*/ "Dummy", + /*0x81*/ "Dummy", + /*0x82*/ "Dummy", + /*0x83*/ "PrintDebug", // used by Shivers 2 (demo and full) + /*0x84*/ "Dummy", + /*0x85*/ "Dummy", + /*0x86*/ "Dummy", + /*0x87*/ "Dummy", + /*0x88*/ "Dummy", + /*0x89*/ "Dummy", + /*0x8a*/ "LoadChunk", + /*0x8b*/ "SetPalStyleRange", + /*0x8c*/ "AddPicAt", + /*0x8d*/ "Dummy", + /*0x8e*/ "NewRoom", + /*0x8f*/ "Dummy", + /*0x90*/ "Priority", + /*0x91*/ "MorphOn", + /*0x92*/ "PlayVMD", + /*0x93*/ "SetHotRectangles", + /*0x94*/ "MulDiv", + /*0x95*/ "GetSierraProfileInt", // Windows only + /*0x96*/ "GetSierraProfileString", // Windows only + /*0x97*/ "SetWindowsOption", // Windows only + /*0x98*/ "GetWindowsOption", // Windows only + /*0x99*/ "WinDLL", // Windows only + /*0x9a*/ "Dummy", + /*0x9b*/ "Dummy", + /*0x9c*/ "DeletePic" +}; + +#endif + +#define END Script_None + +opcode_format g_opcode_formats[128][4] = { + /*00*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*04*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*08*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*0C*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*10*/ + {Script_None}, {Script_None}, {Script_None}, {Script_None}, + /*14*/ + {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END}, + /*18*/ + {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None}, + /*1C*/ + {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END}, + /*20*/ + {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END}, + /*24 (24=ret)*/ + {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid}, + /*28*/ + {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END}, + /*2C*/ + {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid}, + /*30*/ + {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, + /*34*/ + {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, + /*38*/ + {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None}, + /*3C*/ + {Script_None}, {Script_None}, {Script_None}, {Script_Word}, + /*40-4F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*50-5F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*60-6F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + /*70-7F*/ + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, + {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END} +}; +#undef END + +} // End of namespace Sci + +#endif // SCI_ENGINE_KERNEL_TABLES_H diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index b8c62210f9..305e202ae9 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -368,4 +368,39 @@ reg_t kEmpty(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kStub(EngineState *s, int argc, reg_t *argv) { + Kernel *kernel = g_sci->getKernel(); + int kernelCallNr = -1; + + Common::List::iterator callIterator = s->_executionStack.end(); + if (callIterator != s->_executionStack.begin()) { + callIterator--; + ExecStack lastCall = *callIterator; + kernelCallNr = lastCall.debugSelector; + } + + Common::String warningMsg = "Dummy function k" + kernel->getKernelName(kernelCallNr) + + Common::String::printf("[%x]", kernelCallNr) + + " invoked. Params: " + + Common::String::printf("%d", argc) + " ("; + + for (int i = 0; i < argc; i++) { + warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + warningMsg += (i == argc - 1 ? ")" : ", "); + } + + warning("%s", warningMsg.c_str()); + return s->r_acc; +} + +reg_t kStubNull(EngineState *s, int argc, reg_t *argv) { + kStub(s, argc, argv); + return NULL_REG; +} + +reg_t kDummy(EngineState *s, int argc, reg_t *argv) { + kStub(s, argc, argv); + error("Kernel function was called, which was considered to be unused - see log for details"); +} + } // End of namespace Sci diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ab887340e6..ada6d8ed92 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -49,86 +49,6 @@ const reg_t TRUE_REG = {0, 1}; #define SCI_XS_CALLEE_LOCALS ((SegmentId)-1) -#define END Script_None - -opcode_format g_opcode_formats[128][4] = { - /*00*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*04*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*08*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*0C*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*10*/ - {Script_None}, {Script_None}, {Script_None}, {Script_None}, - /*14*/ - {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END}, - /*18*/ - {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None}, - /*1C*/ - {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END}, - /*20*/ - {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END}, - /*24 (24=ret)*/ - {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid}, - /*28*/ - {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END}, - /*2C*/ - {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid}, - /*30*/ - {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, - /*34*/ - {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, - /*38*/ - {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None}, - /*3C*/ - {Script_None}, {Script_None}, {Script_None}, {Script_Word}, - /*40-4F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*50-5F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*60-6F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - /*70-7F*/ - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}, - {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END} -}; -#undef END - -// TODO: script_adjust_opcode_formats should probably be part of the -// constructor (?) of a VirtualMachine or a ScriptManager class. -void script_adjust_opcode_formats() { - if (g_sci->_features->detectLofsType() != SCI_VERSION_0_EARLY) { - g_opcode_formats[op_lofsa][0] = Script_Offset; - g_opcode_formats[op_lofss][0] = Script_Offset; - } - -#ifdef ENABLE_SCI32 - // In SCI32, some arguments are now words instead of bytes - if (getSciVersion() >= SCI_VERSION_2) { - g_opcode_formats[op_calle][2] = Script_Word; - g_opcode_formats[op_callk][1] = Script_Word; - g_opcode_formats[op_super][1] = Script_Word; - g_opcode_formats[op_send][0] = Script_Word; - g_opcode_formats[op_self][0] = Script_Word; - g_opcode_formats[op_call][1] = Script_Word; - g_opcode_formats[op_callb][1] = Script_Word; - } -#endif -} - /** * Adds an entry to the top of the execution stack. * -- cgit v1.2.3 From 175d6e297d5d50a96f1af6ddc2e37c7c56f84763 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 21 Jul 2010 14:54:06 +0000 Subject: SCI: More rest of the workaround defs to workarounds.h svn-id: r51090 --- engines/sci/engine/kernel.h | 27 +-------------------------- engines/sci/engine/workarounds.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 8de95f56ef..8467a640af 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -40,6 +40,7 @@ namespace Sci { struct Node; // from segment.h struct List; // from segment.h struct SelectorCache; // from selector.h +struct SciWorkaroundEntry; // from workarounds.h /** * @defgroup VocabularyResources Vocabulary resources in SCI @@ -120,32 +121,6 @@ enum { /* Generic description: */ typedef reg_t KernelFunctionCall(EngineState *s, int argc, reg_t *argv); -enum SciWorkaroundType { - WORKAROUND_NONE, // only used by terminator or when no workaround was found - WORKAROUND_IGNORE, // ignore kernel call - WORKAROUND_STILLCALL, // still do kernel call - WORKAROUND_FAKE // fake kernel call / replace temp value / fake opcode -}; - -struct SciWorkaroundSolution { - SciWorkaroundType type; - uint16 value; -}; - -struct SciWorkaroundEntry { - SciGameId gameId; - int roomNr; - int scriptNr; - int16 inheritanceLevel; - const char *objectName; - const char *methodName; - int localCallOffset; - int index; - SciWorkaroundSolution newValue; -}; - -#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } - struct KernelSubFunction { KernelFunctionCall *function; const char *name; diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index be066d5fc7..9f38ab13ee 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -26,8 +26,37 @@ #ifndef SCI_ENGINE_WORKAROUNDS_H #define SCI_ENGINE_WORKAROUNDS_H +#include "sci/engine/vm_types.h" +#include "sci/sci.h" + namespace Sci { +enum SciWorkaroundType { + WORKAROUND_NONE, // only used by terminator or when no workaround was found + WORKAROUND_IGNORE, // ignore kernel call + WORKAROUND_STILLCALL, // still do kernel call + WORKAROUND_FAKE // fake kernel call / replace temp value / fake opcode +}; + +struct SciWorkaroundSolution { + SciWorkaroundType type; + uint16 value; +}; + +struct SciWorkaroundEntry { + SciGameId gameId; + int roomNr; + int scriptNr; + int16 inheritanceLevel; + const char *objectName; + const char *methodName; + int localCallOffset; + int index; + SciWorkaroundSolution newValue; +}; + +#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } + // gameID, room,script,lvl, object-name, method-name, call,index, workaround static const SciWorkaroundEntry opcodeDivWorkarounds[] = { { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object @@ -159,6 +188,8 @@ static const SciWorkaroundEntry kStrCpy_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +#undef FAKE + } // End of namespace Sci #endif // SCI_ENGINE_WORKAROUNDS_H -- cgit v1.2.3 From bb1c722a0b2b9e35f21ddef8109c443d6b69a620 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 17:42:51 +0000 Subject: SCI: adding workaround for sq3 fixing off-by-one error when initializing script 93 svn-id: r51091 --- engines/sci/engine/script.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 049ea9247b..eb6ff95a3d 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -434,16 +434,17 @@ void Script::initialiseClasses(SegManager *segMan) { } if (isClass) { - // WORKAROUND for an invalid species access in the demo of LSL2 + // WORKAROUNDs for off-by-one script errors if (g_sci->getGameId() == GID_LSL2 && g_sci->isDemo() && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); - // WORKAROUND for an invalid species access in LSL3 script 500 if (g_sci->getGameId() == GID_LSL3 && !g_sci->isDemo() && _nr == 500 && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); + if (g_sci->getGameId() == GID_SQ3 && !g_sci->isDemo() && _nr == 93 && species == (int)segMan->classTableSize()) + segMan->resizeClassTable(segMan->classTableSize() + 1); if (species < 0 || species >= (int)segMan->classTableSize()) - error("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d\n", - species, species, segMan->classTableSize(), _nr); + error("Invalid species %d(0x%x) unknown max %d(0x%x) while instantiating script %d\n", + species, species, segMan->classTableSize(), segMan->classTableSize(), _nr); SegmentId segmentId = segMan->getScriptSegment(_nr); segMan->setClassOffset(species, make_reg(segmentId, classpos)); -- cgit v1.2.3 From fcc9de35e254d62d58aac0c68b314bb2f7b5b6db Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 18:15:39 +0000 Subject: Strip trailing whitespaces. svn-id: r51093 --- engines/kyra/sound_towns.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 27aa57586e..5953e6cd18 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -1854,7 +1854,7 @@ void TownsPC98_OpnChannel::loadData(uint8 *data) { _dataPtr = data; _totalLevel = 0x7F; - uint8 *tmp = _dataPtr; + uint8 *tmp = _dataPtr; for (bool loop = true; loop; ) { uint8 cmd = *tmp++; if (cmd < 0xf0) { @@ -2502,7 +2502,7 @@ void TownsPC98_OpnSfxChannel::loadData(uint8 *data) { _ssgTl = 0xff; _algorithm = 0x80; - uint8 *tmp = _dataPtr; + uint8 *tmp = _dataPtr; for (bool loop = true; loop; ) { uint8 cmd = *tmp++; if (cmd < 0xf0) { @@ -2793,7 +2793,7 @@ void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { finOut += finOutTemp; } - finOut /= 3; + finOut /= 3; buffer[i << 1] += finOut; buffer[(i << 1) + 1] += finOut; @@ -3330,7 +3330,7 @@ void TownsPC98_OpnCore::setVolumeChannelMasks(int channelMaskA, int channelMaskB if (_ssg) _ssg->setVolumeChannelMasks(_volMaskA >> _numChan, _volMaskB >> _numChan); if (_prc) - _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); + _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); } void TownsPC98_OpnCore::generateTables() { @@ -3800,7 +3800,7 @@ void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { void TownsPC98_OpnDriver::startSoundEffect() { int volFlags = 0; - + for (int i = 0; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); @@ -3813,7 +3813,7 @@ void TownsPC98_OpnDriver::startSoundEffect() { _updateSfxFlag &= ~_sfxChannels[i]->_idFlag; } } - + setVolumeChannelMasks(~volFlags, volFlags); _sfxData = 0; } -- cgit v1.2.3 From e5e94d45118781902465024fc9a85c7aa0bfd3ce Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 18:17:51 +0000 Subject: Strip trailing whitespaces in our common code base. svn-id: r51094 --- common/ptr.h | 6 +++--- common/singleton.h | 2 +- common/textconsole.cpp | 2 +- common/translation.cpp | 2 +- common/unarj.cpp | 4 ++-- common/util.cpp | 2 +- graphics/video/dxa_decoder.h | 2 +- graphics/video/flic_decoder.cpp | 4 ++-- graphics/video/qt_decoder.cpp | 2 +- graphics/video/video_decoder.cpp | 2 +- gui/ThemeEngine.cpp | 2 +- gui/options.cpp | 4 ++-- gui/widget.cpp | 6 +++--- gui/widget.h | 4 ++-- sound/audiostream.cpp | 2 +- sound/decoders/mp3.cpp | 6 +++--- sound/mididrv.cpp | 6 +++--- sound/mididrv.h | 2 +- sound/musicplugin.h | 2 +- sound/softsynth/mt32.cpp | 4 ++-- test/common/tokenizer.h | 10 +++++----- 21 files changed, 38 insertions(+), 38 deletions(-) diff --git a/common/ptr.h b/common/ptr.h index 25ce6dcd64..7307038936 100644 --- a/common/ptr.h +++ b/common/ptr.h @@ -242,7 +242,7 @@ public: */ operator bool() const { return _pointer != 0; } - ~ScopedPtr() { + ~ScopedPtr() { delete _pointer; } @@ -255,14 +255,14 @@ public: } /** - * Returns the plain pointer value. + * Returns the plain pointer value. * * @return the pointer the ScopedPtr manages */ PointerType get() const { return _pointer; } /** - * Returns the plain pointer value and releases ScopedPtr. + * Returns the plain pointer value and releases ScopedPtr. * After release() call you need to delete object yourself * * @return the pointer the ScopedPtr manages diff --git a/common/singleton.h b/common/singleton.h index d66fb84cc2..2f721a65f7 100644 --- a/common/singleton.h +++ b/common/singleton.h @@ -95,7 +95,7 @@ protected: * Note that you need to use this macro from the global namespace. * * This is because C++ requires initial explicit specialization - * to be placed in the same namespace as the template. + * to be placed in the same namespace as the template. * It has to be put in the global namespace to assure the correct * namespace Common is referenced. */ diff --git a/common/textconsole.cpp b/common/textconsole.cpp index b959b8ec23..0d0b0aead9 100644 --- a/common/textconsole.cpp +++ b/common/textconsole.cpp @@ -162,7 +162,7 @@ void NORETURN_PRE error(const char *s, ...) { #ifdef __PSP__ PspDebugTrace(false, "%s", buf_output); // write to file #endif - + // Finally exit. quit() will terminate the program if g_system is present if (g_system) g_system->quit(); diff --git a/common/translation.cpp b/common/translation.cpp index 093f26510f..ab6a922c6e 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -65,7 +65,7 @@ TranslationManager::TranslationManager() { // http://msdn.microsoft.com/en-us/library/dd318101%28VS.85%29.aspx // On the other hand the locale constants used, seem to exist on Windows 98 too, // check this for that: http://msdn.microsoft.com/en-us/library/dd464799%28v=VS.85%29.aspx - // + // // I am not exactly sure what is the truth now, it might be very well that this breaks // support for systems older than Windows 2000.... // diff --git a/common/unarj.cpp b/common/unarj.cpp index c130533dc1..2b2af3c54f 100644 --- a/common/unarj.cpp +++ b/common/unarj.cpp @@ -738,7 +738,7 @@ ArjArchive::ArjArchive(const String &filename) : _arjFilename(filename) { warning("ArjArchive::ArjArchive(): Could not find the archive file"); return; } - + int32 firstHeaderOffset = findHeader(arjFile); if (firstHeaderOffset < 0) { @@ -828,7 +828,7 @@ SeekableReadStream *ArjArchive::createReadStreamForMember(const String &name) co delete decoder; } - return new Common::MemoryReadStream(uncompressedData, hdr->origSize, DisposeAfterUse::YES); + return new Common::MemoryReadStream(uncompressedData, hdr->origSize, DisposeAfterUse::YES); } Archive *makeArjArchive(const String &name) { diff --git a/common/util.cpp b/common/util.cpp index 521a12e4c7..9e36e0f161 100644 --- a/common/util.cpp +++ b/common/util.cpp @@ -345,7 +345,7 @@ const String getGameGUIOptionsDescriptionLanguage(Language lang) { uint32 parseGameGUIOptions(const String &str) { uint32 res = 0; - + for (int i = 0; g_gameOptions[i].desc; i++) if (str.contains(g_gameOptions[i].desc)) res |= g_gameOptions[i].option; diff --git a/graphics/video/dxa_decoder.h b/graphics/video/dxa_decoder.h index 0312828195..d61346324f 100644 --- a/graphics/video/dxa_decoder.h +++ b/graphics/video/dxa_decoder.h @@ -45,7 +45,7 @@ public: bool load(Common::SeekableReadStream &stream); void close(); - + bool isVideoLoaded() const { return _fileStream != 0; } uint16 getWidth() const { return _width; } uint16 getHeight() const { return _height; } diff --git a/graphics/video/flic_decoder.cpp b/graphics/video/flic_decoder.cpp index bb5b4f219b..b07e369cd8 100644 --- a/graphics/video/flic_decoder.cpp +++ b/graphics/video/flic_decoder.cpp @@ -57,7 +57,7 @@ bool FlicDecoder::load(Common::SeekableReadStream &stream) { return false; } - + _frameCount = _fileStream->readUint16LE(); uint16 width = _fileStream->readUint16LE(); uint16 height = _fileStream->readUint16LE(); @@ -265,7 +265,7 @@ Surface *FlicDecoder::decodeNextFrame() { delete[] data; } } - + _curFrame++; if (_curFrame == 0) diff --git a/graphics/video/qt_decoder.cpp b/graphics/video/qt_decoder.cpp index a95243ba6a..61b0f5166d 100644 --- a/graphics/video/qt_decoder.cpp +++ b/graphics/video/qt_decoder.cpp @@ -206,7 +206,7 @@ void QuickTimeDecoder::stopAudio() { void QuickTimeDecoder::pauseVideoIntern(bool pause) { if (_audStream) - g_system->getMixer()->pauseHandle(_audHandle, pause); + g_system->getMixer()->pauseHandle(_audHandle, pause); } Surface *QuickTimeDecoder::decodeNextFrame() { diff --git a/graphics/video/video_decoder.cpp b/graphics/video/video_decoder.cpp index fe4a5848f3..9733afc5cc 100644 --- a/graphics/video/video_decoder.cpp +++ b/graphics/video/video_decoder.cpp @@ -64,7 +64,7 @@ void VideoDecoder::setSystemPalette() { delete[] sysPalette; } -bool VideoDecoder::needsUpdate() const { +bool VideoDecoder::needsUpdate() const { return !endOfVideo() && getTimeToNextFrame() == 0; } diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 91e32ce1e8..6c2d8f1f7f 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1229,7 +1229,7 @@ void ThemeEngine::restoreState(StoredState *state) { src += state->backBuffer.pitch; dst += _backBuffer.pitch; } - + addDirtyRect(state->r); } diff --git a/gui/options.cpp b/gui/options.cpp index 856eb668fa..0553e5910a 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -790,7 +790,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se return true; if (_domain != Common::ConfigManager::kApplicationDomain || ConfMan.hasKey(setting, _domain) || preferredType) { - const Common::String drv = ConfMan.get(setting, (_domain != Common::ConfigManager::kApplicationDomain && !ConfMan.hasKey(setting, _domain)) ? Common::ConfigManager::kApplicationDomain : _domain); + const Common::String drv = ConfMan.get(setting, (_domain != Common::ConfigManager::kApplicationDomain && !ConfMan.hasKey(setting, _domain)) ? Common::ConfigManager::kApplicationDomain : _domain); const MusicPlugin::List p = MusicMan.getPlugins(); for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { @@ -810,7 +810,7 @@ bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String se void OptionsDialog::saveMusicDeviceSetting(PopUpWidget *popup, Common::String setting) { if (!popup || !_enableAudioSettings) return; - + const MusicPlugin::List p = MusicMan.getPlugins(); bool found = false; for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end() && !found; ++m) { diff --git a/gui/widget.cpp b/gui/widget.cpp index 14cb61006b..6dd79c9d4f 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -218,9 +218,9 @@ Common::String Widget::cleanupHotkey(const Common::String &label) { for (uint i = 0; i < label.size() ; i++) if (label[i] != '~') res = res + label[i]; - + return res; -} +} #pragma mark - @@ -361,7 +361,7 @@ ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Co } ButtonWidget::ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) - : StaticTextWidget(boss, name, cleanupHotkey(label), tooltip), CommandSender(boss), + : StaticTextWidget(boss, name, cleanupHotkey(label), tooltip), CommandSender(boss), _cmd(cmd) { if (hotkey == 0) _hotkey = parseHotkey(label); diff --git a/gui/widget.h b/gui/widget.h index 7b5fe9253f..25e4b9a235 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -164,7 +164,7 @@ class GuiManager; class Tooltip : public GuiObject { public: Tooltip(GuiManager *guiManager); - + bool isVisible() const { return _visible; } void draw(); void reflowLayout(); @@ -272,7 +272,7 @@ class RadiobuttonWidget : public ButtonWidget { protected: bool _state; int _value; - + public: RadiobuttonWidget(GuiObject *boss, int x, int y, int w, int h, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip = 0, uint8 hotkey = 0); RadiobuttonWidget(GuiObject *boss, const Common::String &name, RadiobuttonGroup *group, int value, const Common::String &label, const char *tooltip = 0, uint8 hotkey = 0); diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index a092e6c29d..b3efb2cefe 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -393,7 +393,7 @@ Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo // // An example is when converting the timestamp 500ms to a 11025 Hz based // stream. It would have an internal frame counter of 5512.5. Now when - // doing calculations at frame precision, this might lead to unexpected + // doing calculations at frame precision, this might lead to unexpected // results: The frame difference between a timestamp 1000ms and the above // mentioned timestamp (both with 11025 as framerate) would be 5512, // instead of 5513, which is what a frame-precision based code would expect. diff --git a/sound/decoders/mp3.cpp b/sound/decoders/mp3.cpp index 732ae58b67..f22eae5102 100644 --- a/sound/decoders/mp3.cpp +++ b/sound/decoders/mp3.cpp @@ -349,13 +349,13 @@ int MP3Stream::readBuffer(int16 *buffer, const int numSamples) { SeekableAudioStream *makeMP3Stream( Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { - + #if defined(__PSP__) SeekableAudioStream *s = 0; - + if (Mp3PspStream::isOkToCreateStream()) s = new Mp3PspStream(stream, disposeAfterUse); - + if (!s) // go to regular MAD mp3 stream if ME fails s = new MP3Stream(stream, disposeAfterUse); #else diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index aaff78bf92..8dc165c3d6 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -94,7 +94,7 @@ MusicType MidiDriver::getMusicType(MidiDriver::DeviceHandle handle) { } } } - + return MT_INVALID; } @@ -139,7 +139,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { if (flags & MDT_PCJR) return hdl; break; - + case MT_CMS: if (flags & MDT_CMS) return hdl; @@ -149,7 +149,7 @@ MidiDriver::DeviceHandle MidiDriver::detectDevice(int flags) { if (flags & MDT_ADLIB) return hdl; break; - + case MT_TOWNS: if (flags & MDT_TOWNS) return hdl; diff --git a/sound/mididrv.h b/sound/mididrv.h index 5fffd430fb..1184adee6c 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -124,7 +124,7 @@ public: /** Returns device handle based on the present devices and the flags parameter. */ static DeviceHandle detectDevice(int flags); - + /** Find the music driver matching the given driver name/description. */ static DeviceHandle getDeviceHandle(const Common::String &identifier); diff --git a/sound/musicplugin.h b/sound/musicplugin.h index 3823f2fd3d..bbb4ed778c 100644 --- a/sound/musicplugin.h +++ b/sound/musicplugin.h @@ -50,7 +50,7 @@ public: * device name (if it isn't the default one) and the name of the driver. */ Common::String getCompleteName(); - + /** * Returns a user readable string that contains the name of the current * device name (if it isn't the default one) and the id of the driver. diff --git a/sound/softsynth/mt32.cpp b/sound/softsynth/mt32.cpp index 95263a040d..54366a4300 100644 --- a/sound/softsynth/mt32.cpp +++ b/sound/softsynth/mt32.cpp @@ -149,7 +149,7 @@ static void drawProgress(float progress) { Common::Rect r(x, y, x + w, y + h); uint32 col; - + if (screenFormat.bytesPerPixel > 1) col = screenFormat.RGBToColor(0, 171, 0); else @@ -184,7 +184,7 @@ static void drawMessage(int offset, const Common::String &text) { uint16 y = g_system->getHeight() / 2 - h / 2 + offset * (h + 1); uint32 col; - + if (screenFormat.bytesPerPixel > 1) col = screenFormat.RGBToColor(0, 0, 0); else diff --git a/test/common/tokenizer.h b/test/common/tokenizer.h index 3420b562aa..9c14875b81 100644 --- a/test/common/tokenizer.h +++ b/test/common/tokenizer.h @@ -5,7 +5,7 @@ class TokenizerTestSuite : public CxxTest::TestSuite { public: void test_nextToken() { - + // test normal behavior Common::StringTokenizer strTokenizer("Now, this is a test!", " ,!"); Common::String tokenArray[] = {"Now", "this", "is", "a", "test"}; @@ -17,7 +17,7 @@ public: TS_ASSERT(strTokenizer.empty()); // Test edge cases: - + // empty string Common::StringTokenizer s1(""); TS_ASSERT_EQUALS("", s1.nextToken()); @@ -37,7 +37,7 @@ public: TS_ASSERT_EQUALS("af", s4.nextToken()); } - void test_resetAndEmpty() { + void test_resetAndEmpty() { Common::StringTokenizer strTokenizer("Just, another test!", " ,!"); // test reset() @@ -48,10 +48,10 @@ public: TS_ASSERT_EQUALS(token2, "Just"); // test empty() - TS_ASSERT(!strTokenizer.empty()); + TS_ASSERT(!strTokenizer.empty()); strTokenizer.nextToken(); //another strTokenizer.nextToken(); //test - TS_ASSERT(strTokenizer.empty()); + TS_ASSERT(strTokenizer.empty()); } }; -- cgit v1.2.3 From 780b04367738c42f5b1704b495248894f132deb7 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 21 Jul 2010 18:59:23 +0000 Subject: Janitorial: Removed extra semi-colon. svn-id: r51096 --- sound/softsynth/opl/dbopl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/softsynth/opl/dbopl.cpp b/sound/softsynth/opl/dbopl.cpp index db07eaf8cc..857ed78436 100644 --- a/sound/softsynth/opl/dbopl.cpp +++ b/sound/softsynth/opl/dbopl.cpp @@ -418,7 +418,7 @@ Bits Operator::TemplateVolume( ) { } //In sustain phase, but not sustaining, do regular release case RELEASE: - vol += RateForward( releaseAdd );; + vol += RateForward( releaseAdd ); if ( GCC_UNLIKELY(vol >= ENV_MAX) ) { volume = ENV_MAX; SetState( OFF ); -- cgit v1.2.3 From 472dbc9f7d60d873c0979dbb779344937a57261f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 19:19:33 +0000 Subject: SCI: fix initializing script 99 of sq3 svn-id: r51097 --- engines/sci/engine/script.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index eb6ff95a3d..6f4c272649 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -441,6 +441,8 @@ void Script::initialiseClasses(SegManager *segMan) { segMan->resizeClassTable(segMan->classTableSize() + 1); if (g_sci->getGameId() == GID_SQ3 && !g_sci->isDemo() && _nr == 93 && species == (int)segMan->classTableSize()) segMan->resizeClassTable(segMan->classTableSize() + 1); + if (g_sci->getGameId() == GID_SQ3 && !g_sci->isDemo() && _nr == 99 && species == (int)segMan->classTableSize()) + segMan->resizeClassTable(segMan->classTableSize() + 1); if (species < 0 || species >= (int)segMan->classTableSize()) error("Invalid species %d(0x%x) unknown max %d(0x%x) while instantiating script %d\n", -- cgit v1.2.3 From e95ef4f5f8f007763cf13fd718b6a2b4cdbb5711 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 19:20:10 +0000 Subject: KYRA: Respect mute setting on engine startup. svn-id: r51098 --- engines/kyra/kyra_v1.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 2c6cd3ab5c..1c9a583167 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -100,9 +100,7 @@ void KyraEngine_v1::pauseEngineIntern(bool pause) { Common::Error KyraEngine_v1::init() { // Setup mixer - _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); - _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume")); + syncSoundSettings(); if (!_flags.useDigSound) { // We prefer AdLib over MIDI in Kyra 1, since it offers MT-32 support only, most users don't have a real -- cgit v1.2.3 From a97d8875f5d921a6e6b2583ebe07f75b6989633f Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 21 Jul 2010 19:59:33 +0000 Subject: SCI: Rewrite said spec handling. We now use a manual parser instead of a bison-generated one, and the new code to match said trees with parse trees matches sierra's more closely. Also change the parse/spec tree nodes to use direct pointers to their child nodes to make it more convenient to manipulate the trees. This has a high potential for regressions. svn-id: r51099 --- engines/sci/engine/kparse.cpp | 2 + engines/sci/parser/grammar.cpp | 44 +- engines/sci/parser/said.cpp | 2913 ++++++++++--------------------------- engines/sci/parser/said.y | 852 ----------- engines/sci/parser/vocabulary.cpp | 76 +- engines/sci/parser/vocabulary.h | 20 +- 6 files changed, 832 insertions(+), 3075 deletions(-) delete mode 100644 engines/sci/parser/said.y diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 8714981034..799cbf63b6 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -31,6 +31,8 @@ #include "sci/engine/message.h" #include "sci/engine/kernel.h" +//#define DEBUG_PARSER + namespace Sci { /*************************************************************/ diff --git a/engines/sci/parser/grammar.cpp b/engines/sci/parser/grammar.cpp index 070e6767cf..6f37b49919 100644 --- a/engines/sci/parser/grammar.cpp +++ b/engines/sci/parser/grammar.cpp @@ -422,44 +422,44 @@ ParseRuleList *Vocabulary::buildGNF(bool verbose) { return tlist; } -static int _vbpt_pareno(parse_tree_node_t *nodes, int *pos, int base) { +static int _vbpt_pareno(ParseTreeNode *nodes, int *pos, int base) { // Opens parentheses - nodes[base].content.branches[0] = (*pos) + 1; + nodes[base].left = &nodes[(*pos) + 1]; nodes[++(*pos)].type = kParseTreeBranchNode; - nodes[*pos].content.branches[0] = 0; - nodes[*pos].content.branches[1] = 0; + nodes[*pos].left = 0; + nodes[*pos].right = 0; return *pos; } -static int _vbpt_parenc(parse_tree_node_t *nodes, int *pos, int paren) { +static int _vbpt_parenc(ParseTreeNode *nodes, int *pos, int paren) { // Closes parentheses for appending - nodes[paren].content.branches[1] = ++(*pos); + nodes[paren].right = &nodes[++(*pos)]; nodes[*pos].type = kParseTreeBranchNode; - nodes[*pos].content.branches[0] = 0; - nodes[*pos].content.branches[1] = 0; + nodes[*pos].left = 0; + nodes[*pos].right = 0; return *pos; } -static int _vbpt_append(parse_tree_node_t *nodes, int *pos, int base, int value) { +static int _vbpt_append(ParseTreeNode *nodes, int *pos, int base, int value) { // writes one value to an existing base node and creates a successor node for writing - nodes[base].content.branches[0] = ++(*pos); + nodes[base].left = &nodes[++(*pos)]; nodes[*pos].type = kParseTreeLeafNode; - nodes[*pos].content.value = value; - nodes[base].content.branches[1] = ++(*pos); + nodes[*pos].value = value; + nodes[base].right = &nodes[++(*pos)]; nodes[*pos].type = kParseTreeBranchNode; - nodes[*pos].content.branches[0] = 0; - nodes[*pos].content.branches[1] = 0; + nodes[*pos].left = 0; + nodes[*pos].right = 0; return *pos; } -static int _vbpt_terminate(parse_tree_node_t *nodes, int *pos, int base, int value) { +static int _vbpt_terminate(ParseTreeNode *nodes, int *pos, int base, int value) { // Terminates, overwriting a nextwrite forknode nodes[base].type = kParseTreeLeafNode; - nodes[base].content.value = value; + nodes[base].value = value; return *pos; } -static int _vbpt_write_subexpression(parse_tree_node_t *nodes, int *pos, ParseRule *rule, uint rulepos, int writepos) { +static int _vbpt_write_subexpression(ParseTreeNode *nodes, int *pos, ParseRule *rule, uint rulepos, int writepos) { uint token; while ((token = ((rulepos < rule->_data.size()) ? rule->_data[rulepos++] : TOKEN_CPAREN)) != TOKEN_CPAREN) { @@ -565,15 +565,15 @@ int Vocabulary::parseGNF(const ResultWordList &words, bool verbose) { int temp, pos; _parserNodes[0].type = kParseTreeBranchNode; - _parserNodes[0].content.branches[0] = 1; - _parserNodes[0].content.branches[1] = 2; + _parserNodes[0].left = &_parserNodes[1]; + _parserNodes[0].right = &_parserNodes[2]; _parserNodes[1].type = kParseTreeLeafNode; - _parserNodes[1].content.value = 0x141; + _parserNodes[1].value = 0x141; _parserNodes[2].type = kParseTreeBranchNode; - _parserNodes[2].content.branches[0] = 0; - _parserNodes[2].content.branches[1] = 0; + _parserNodes[2].left = 0; + _parserNodes[2].right = 0; pos = 2; diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index faf0002cdd..0bedc15507 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -1,111 +1,3 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.3" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - WGROUP = 258, - YY_COMMA = 259, - YY_AMP = 260, - YY_SLASH = 261, - YY_PARENO = 262, - YY_PARENC = 263, - YY_BRACKETSO = 264, - YY_BRACKETSC = 265, - YY_HASH = 266, - YY_LT = 267, - YY_GT = 268, - YY_BRACKETSO_LT = 269, - YY_BRACKETSO_SLASH = 270, - YY_LT_BRACKETSO = 271, - YY_LT_PARENO = 272 - }; -#endif -/* Tokens. */ -#define WGROUP 258 -#define YY_COMMA 259 -#define YY_AMP 260 -#define YY_SLASH 261 -#define YY_PARENO 262 -#define YY_PARENC 263 -#define YY_BRACKETSO 264 -#define YY_BRACKETSC 265 -#define YY_HASH 266 -#define YY_LT 267 -#define YY_GT 268 -#define YY_BRACKETSO_LT 269 -#define YY_BRACKETSO_SLASH 270 -#define YY_LT_BRACKETSO 271 -#define YY_LT_PARENO 272 - - - - -/* Copy the first part of user declarations. */ -#line 1 "said.y" - /* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names @@ -133,14 +25,6 @@ #include "sci/engine/state.h" - -// Bison generates an empty switch statement that gives a warning in MSVC. -// This disables that warning. -#ifdef _MSC_VER -#pragma warning(disable:4065) -#endif - - namespace Sci { #define SAID_BRANCH_NULL 0 @@ -150,25 +34,8 @@ namespace Sci { // Maximum number of words to be expected in a parsed sentence #define AUGMENT_MAX_WORDS 64 - -#define ANYWORD 0xfff - -#define WORD_TYPE_BASE 0x141 -#define WORD_TYPE_REF 0x144 -#define WORD_TYPE_SYNTACTIC_SUGAR 0x145 - -#define AUGMENT_SENTENCE_PART_BRACKETS 0x152 - -// Minor numbers -#define AUGMENT_SENTENCE_MINOR_MATCH_PHRASE 0x14c -#define AUGMENT_SENTENCE_MINOR_MATCH_WORD 0x153 -#define AUGMENT_SENTENCE_MINOR_RECURSE 0x144 -#define AUGMENT_SENTENCE_MINOR_PARENTHESES 0x14f - - -#undef YYDEBUG /*1*/ -//#define SAID_DEBUG*/ -//#define SCI_DEBUG_PARSE_TREE_AUGMENTATION // uncomment to debug parse tree augmentation +// uncomment to debug parse tree augmentation +//#define SCI_DEBUG_PARSE_TREE_AUGMENTATION #ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION @@ -179,1864 +46,622 @@ void print_nothing(...) { } #endif -static char *said_parse_error; - static int said_token; static int said_tokens_nr; static int said_tokens[MAX_SAID_TOKENS]; -static int said_blessed; // increminated by said_top_branch -static int said_tree_pos; // Set to 0 if we're out of space -#define SAID_TREE_START 4; // Reserve space for the 4 top nodes +static int said_tree_pos; +#define SAID_TREE_START 4 // Reserve space for the 4 top nodes + +enum SaidToken { + TOKEN_COMMA = 0xF000, + TOKEN_AMP = 0xF100, + TOKEN_SLASH = 0xF200, + TOKEN_PARENO = 0xF300, + TOKEN_PARENC = 0xF400, + TOKEN_BRACKETO = 0xF500, + TOKEN_BRACKETC = 0xF600, + TOKEN_HASH = 0xF700, + TOKEN_LT = 0xF800, + TOKEN_GT = 0xF900, + TOKEN_TERM = 0xFF00 +}; + +enum SaidWord { + WORD_NONE = 0x0ffe, + WORD_ANY = 0x0fff +}; + -#define VALUE_IGNORE -424242 -static parse_tree_node_t said_tree[VOCAB_TREE_NODES]; +// TODO: maybe turn this into a proper n-ary tree instead of an +// n-ary tree implemented in terms of a binary tree. +// (Together with _parserNodes in Vocabulary) + +static ParseTreeNode said_tree[VOCAB_TREE_NODES]; typedef int wgroup_t; -typedef int tree_t; typedef int said_spec_t; -static tree_t said_aug_branch(int, int, tree_t, tree_t); -static tree_t said_attach_branch(tree_t, tree_t); -/* -static tree_t said_wgroup_branch(wgroup_t); -*/ -static said_spec_t said_top_branch(tree_t); -static tree_t said_paren(tree_t, tree_t); -static tree_t said_value(int, tree_t); -static tree_t said_terminal(int); -static int yylex(); -static int yyerror(const char *s) { - said_parse_error = strdup(s); - return 1; /* Abort */ +static ParseTreeNode* said_next_node() { + assert(said_tree_pos > 0 && said_tree_pos < VOCAB_TREE_NODES); + + return &said_tree[said_tree_pos++]; } +static ParseTreeNode* said_leaf_node(ParseTreeNode* pos, int value) { + pos->type = kParseTreeLeafNode; + pos->value = value; + return pos; +} -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif +static ParseTreeNode* said_word_node(ParseTreeNode* pos, int value) { + pos->type = kParseTreeWordNode; + pos->value = value; -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif + return pos; +} -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif +static ParseTreeNode* said_branch_node(ParseTreeNode* pos, + ParseTreeNode* left, + ParseTreeNode* right) { + pos->type = kParseTreeBranchNode; + pos->left = left; + pos->right = right; -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif + return pos; +} +static ParseTreeNode* said_branch_attach_left(ParseTreeNode* pos, + ParseTreeNode* left) { + pos->type = kParseTreeBranchNode; + pos->left = left; + return pos; -/* Copy the second part of user declarations. */ +} +static ParseTreeNode* said_branch_attach_right(ParseTreeNode* pos, + ParseTreeNode* right) { + pos->type = kParseTreeBranchNode; + pos->right = right; -/* Line 216 of yacc.c. */ -#line 251 "said.cpp" + return pos; +} -#ifdef short -# undef short -#endif -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif +/* + pos + / \ + . \ + * + / \ + / 0 + * + / \ + / \ + / subtree + major / \ + / . + minor + + . = unchanged child node + * = new branch node + 0 = NULL child node. (Location for future siblings of the subtree) -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif +*/ -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif +static bool said_attach_subtree(ParseTreeNode* pos, int major, int minor, + ParseTreeNode* subtree) { + bool retval = true; -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif + said_branch_attach_right(pos, + said_branch_node(said_next_node(), + said_branch_node(said_next_node(), + said_leaf_node(said_next_node(), major), + said_branch_attach_left(subtree, + said_leaf_node(said_next_node(), minor))), + 0)); -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif + return retval; +} -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) -#else -static int -YYID (i) - int i; -#endif -{ - return i; -} -#endif -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +/*****************/ +/**** Parsing ****/ +/*****************/ -#endif +static bool parseSpec(ParseTreeNode* parentNode); +static bool parsePart2(ParseTreeNode* parentNode, bool& nonempty); +static bool parsePart3(ParseTreeNode* parentNode, bool& nonempty); +static bool parseSlash(ParseTreeNode* parentNode); +static bool parseExpr(ParseTreeNode* parentNode); +static bool parseRef(ParseTreeNode* parentNode); +static bool parseComma(ParseTreeNode* parentNode); +static bool parseList(ParseTreeNode* parentNode); +static bool parseListEntry(ParseTreeNode* parentNode); +static bool parseWord(ParseTreeNode* parentNode); -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 22 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 102 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 18 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 12 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 38 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 74 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 272 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = +static bool parseWord(ParseTreeNode* parentNode) { - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17 -}; + int token = said_tokens[said_token]; + if (token & 0x8000) + return false; -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 6, 10, 15, 16, 18, 19, 23, - 28, 30, 33, 38, 44, 49, 51, 54, 59, 65, - 70, 72, 74, 76, 80, 84, 90, 93, 95, 97, - 99, 103, 108, 112, 117, 120, 125, 129, 132 -}; + said_token++; -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 19, 0, -1, 21, 20, -1, 21, 22, 20, -1, - 21, 22, 23, 20, -1, -1, 13, -1, -1, 9, - 26, 10, -1, 9, 26, 10, 27, -1, 26, -1, - 6, 26, -1, 6, 9, 26, 10, -1, 6, 9, - 26, 10, 27, -1, 15, 6, 26, 10, -1, 6, - -1, 6, 26, -1, 6, 9, 26, 10, -1, 6, - 9, 26, 10, 27, -1, 15, 6, 26, 10, -1, - 6, -1, 3, -1, 24, -1, 7, 26, 8, -1, - 25, 4, 25, -1, 25, 4, 9, 25, 10, -1, - 25, 27, -1, 25, -1, 27, -1, 28, -1, 14, - 28, 10, -1, 28, 14, 28, 10, -1, 12, 24, - 29, -1, 17, 7, 26, 8, -1, 12, 25, -1, - 16, 9, 25, 10, -1, 12, 25, 29, -1, 12, - 25, -1, 17, 7, 26, 8, -1 -}; + ParseTreeNode* newNode = said_word_node(said_next_node(), token); -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = -{ - 0, 130, 130, 132, 134, 140, 141, 148, 149, 151, - 153, 159, 161, 163, 165, 167, 173, 175, 177, 179, - 181, 186, 191, 193, 195, 197, 202, 204, 206, 211, - 213, 215, 220, 222, 224, 226, 231, 233, 235 -}; -#endif + parentNode->right = newNode; -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "WGROUP", "YY_COMMA", "YY_AMP", - "YY_SLASH", "YY_PARENO", "YY_PARENC", "YY_BRACKETSO", "YY_BRACKETSC", - "YY_HASH", "YY_LT", "YY_GT", "YY_BRACKETSO_LT", "YY_BRACKETSO_SLASH", - "YY_LT_BRACKETSO", "YY_LT_PARENO", "$accept", "saidspec", "optcont", - "leftspec", "midspec", "rightspec", "word", "wordset", "expr", - "cwordrefset", "wordrefset", "recref", 0 -}; -#endif + return true; +} -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = +static bool parsePart2(ParseTreeNode* parentNode, bool& nonempty) { - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272 -}; -# endif + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 18, 19, 19, 19, 20, 20, 21, 21, 21, - 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, - 23, 24, 25, 25, 25, 25, 26, 26, 26, 27, - 27, 27, 28, 28, 28, 28, 29, 29, 29 -}; + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 2, 3, 4, 0, 1, 0, 3, 4, - 1, 2, 4, 5, 4, 1, 2, 4, 5, 4, - 1, 1, 1, 3, 3, 5, 2, 1, 1, 1, - 3, 4, 3, 4, 2, 4, 3, 2, 4 -}; + nonempty = true; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 7, 21, 0, 0, 0, 0, 0, 0, 0, 5, - 22, 27, 10, 28, 29, 0, 0, 22, 34, 0, - 0, 0, 1, 15, 6, 0, 2, 5, 0, 26, - 0, 23, 8, 0, 0, 32, 30, 0, 0, 0, - 11, 0, 20, 0, 3, 5, 0, 24, 0, 9, - 37, 0, 35, 33, 0, 0, 0, 16, 0, 4, - 0, 31, 36, 0, 12, 14, 0, 0, 25, 38, - 13, 17, 19, 18 -}; + bool found; -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 8, 26, 9, 27, 45, 10, 11, 12, 13, - 14, 35 -}; + found = parseSlash(newNode); -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -22 -static const yytype_int8 yypact[] = -{ - 1, -22, 61, 61, 9, 78, 5, 19, 34, 68, - -22, 55, -22, -22, 29, 40, 44, 13, 58, 60, - 9, 61, -22, 30, -22, 70, -22, 73, 2, -22, - 78, -22, 75, 9, 77, -22, -22, 25, 72, 61, - -22, 61, 49, 76, -22, 80, 9, 58, 86, -22, - 15, 61, -22, -22, 87, 88, 61, -22, 61, -22, - 41, -22, -22, 91, 75, -22, 90, 92, -22, -22, - -22, 75, -22, -22 -}; + if (found) { -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -22, -22, -21, -22, -22, -22, 81, 3, -1, -11, - -2, 51 -}; + said_attach_subtree(parentNode, 0x142, 0x14a, newNode); -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint8 yytable[] = -{ - 29, 15, 16, 19, 1, 1, 44, 18, 2, 2, - 3, 46, 1, 4, 20, 5, 2, 6, 7, 28, - 38, 49, 40, 37, 59, 33, 21, 33, 48, 28, - 34, 47, 34, 1, 22, 52, 50, 2, 54, 39, - 55, 57, 4, 30, 5, 28, 6, 7, 31, 60, - 63, 68, 1, 70, 32, 66, 2, 67, 56, 28, - 73, 4, 28, 5, 1, 6, 7, 4, 2, 5, - 36, 6, 7, 4, 23, 5, 41, 6, 7, 42, - 53, 24, 58, 25, 51, 17, 24, 4, 43, 5, - 4, 6, 7, 24, 6, 7, 61, 64, 65, 69, - 71, 62, 72 -}; + return true; -static const yytype_uint8 yycheck[] = -{ - 11, 2, 3, 5, 3, 3, 27, 4, 7, 7, - 9, 9, 3, 12, 9, 14, 7, 16, 17, 4, - 21, 32, 23, 20, 45, 12, 7, 12, 30, 4, - 17, 28, 17, 3, 0, 10, 33, 7, 39, 9, - 41, 42, 12, 14, 14, 4, 16, 17, 8, 46, - 51, 10, 3, 64, 10, 56, 7, 58, 9, 4, - 71, 12, 4, 14, 3, 16, 17, 12, 7, 14, - 10, 16, 17, 12, 6, 14, 6, 16, 17, 6, - 8, 13, 6, 15, 7, 4, 13, 12, 15, 14, - 12, 16, 17, 13, 16, 17, 10, 10, 10, 8, - 10, 50, 10 -}; + } else if (said_tokens[said_token] == TOKEN_BRACKETO) { + said_token++; + + found = parsePart2(newNode, nonempty); -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 3, 7, 9, 12, 14, 16, 17, 19, 21, - 24, 25, 26, 27, 28, 26, 26, 24, 25, 28, - 9, 7, 0, 6, 13, 15, 20, 22, 4, 27, - 14, 8, 10, 12, 17, 29, 10, 25, 26, 9, - 26, 6, 6, 15, 20, 23, 9, 25, 28, 27, - 25, 7, 10, 8, 26, 26, 9, 26, 6, 20, - 25, 10, 29, 26, 10, 10, 26, 26, 10, 8, - 27, 10, 10, 27 -}; + if (found) { -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif + if (said_tokens[said_token] == TOKEN_BRACKETC) { + said_token++; + said_attach_subtree(parentNode, 0x152, 0x142, newNode); -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ + return true; + } + } -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif + } + // CHECKME: this doesn't look right if the [] section matched partially + // Should the below 'if' be an 'else if' ? -/* YYLEX -- calling `yylex' with the right arguments. */ + if (said_tokens[said_token] == TOKEN_SLASH) { + said_token++; -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif + nonempty = false; -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} + return true; + } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; +} -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +static bool parsePart3(ParseTreeNode* parentNode, bool& nonempty) { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ + bool found; -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} + nonempty = true; -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) + found = parseSlash(newNode); + if (found) { -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ + said_attach_subtree(parentNode, 0x143, 0x14a, newNode); -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); - } -} + return true; -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif + } else if (said_tokens[said_token] == TOKEN_BRACKETO) { + said_token++; + + found = parsePart3(newNode, nonempty); -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). + if (found) { - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ + if (said_tokens[said_token] == TOKEN_BRACKETC) { + said_token++; -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif + said_attach_subtree(parentNode, 0x152, 0x143, newNode); - + return true; + } + } -#if YYERROR_VERBOSE + } -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; + // CHECKME: this doesn't look right if the [] section matched partially + // Should the below 'if' be an 'else if' ? + + if (said_tokens[said_token] == TOKEN_SLASH) { + said_token++; - while ((*yyd++ = *yys++) != '\0') - continue; + nonempty = false; - return yyd - 1; + return true; + + } + + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) + + +static bool parseSlash(ParseTreeNode* parentNode) { - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; + + if (said_tokens[said_token] == TOKEN_SLASH) { + said_token++; + + bool found = parseExpr(parentNode); + + if (found) + return true; + + } + + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) + + +static bool parseRef(ParseTreeNode* parentNode) { - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; + + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); + + ParseTreeNode* newParent = parentNode; + + bool found; + + if (said_tokens[said_token] == TOKEN_LT) { + said_token++; + + found = parseList(newNode); + + if (found) { + + said_attach_subtree(newParent, 0x144, 0x14f, newNode); + + newParent = newParent->right; + + newNode = said_branch_node(said_next_node(), 0, 0); + + found = parseRef(newNode); + + if (found) { + + said_attach_subtree(newParent, 0x141, 0x144, newNode); + + } + + return true; + } - else - { - yyp++; - yyf++; + + } + + // NB: This is not an "else if'. + // If there is a "< [ ... ]", that is parsed as "< ..." + + if (said_tokens[said_token] == TOKEN_BRACKETO) { + said_token++; + + found = parseRef(newNode); + + if (found) { + + if (said_tokens[said_token] == TOKEN_BRACKETC) { + said_token++; + + said_attach_subtree(parentNode, 0x152, 0x144, newNode); + + return true; + } } - } + } - return yysize; - } + + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif + +static bool parseComma(ParseTreeNode* parentNode) { - YYUSE (yyvaluep); + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + if (said_tokens[said_token] == TOKEN_COMMA) { + said_token++; - switch (yytype) - { + bool found = parseList(parentNode); + + if (found) + return true; + + } - default: - break; - } + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } - -/* Prevent warnings from -Wmissing-prototypes. */ +static bool parseListEntry(ParseTreeNode* parentNode) +{ + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); + bool found; + if (said_tokens[said_token] == TOKEN_BRACKETO) { + said_token++; -/* The look-ahead symbol. */ -int yychar; + found = parseExpr(newNode); -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; + if (found) { -/* Number of syntax errors so far. */ -int yynerrs; + if (said_tokens[said_token] == TOKEN_BRACKETC) { + said_token++; + said_attach_subtree(parentNode, 0x152, 0x14c, newNode); + return true; + } + } -/*----------. -| yyparse. | -`----------*/ + } else if (said_tokens[said_token] == TOKEN_PARENO) { + said_token++; -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () + found = parseExpr(newNode); -#endif -#endif -{ - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif + if (found) { - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; - - - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + if (said_tokens[said_token] == TOKEN_PARENC) { + said_token++; - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; + said_attach_subtree(parentNode, 0x141, 0x14c, newNode); + return true; + } + } - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; + } else if (parseWord(newNode)) { - YYDPRINTF ((stderr, "Starting parse\n")); + said_attach_subtree(parentNode, 0x141, 0x153, newNode); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ + return true; - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ + } - yyssp = yyss; - yyvsp = yyvs; - goto yysetstate; + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; +} -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to look-ahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a look-ahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - if (yyn == YYFINAL) - YYACCEPT; - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: -#line 131 "said.y" - { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]))); ;} - break; - - case 3: -#line 133 "said.y" - { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (3)]), said_attach_branch((yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])))); ;} - break; - - case 4: -#line 135 "said.y" - { (yyval) = said_top_branch(said_attach_branch((yyvsp[(1) - (4)]), said_attach_branch((yyvsp[(2) - (4)]), said_attach_branch((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))))); ;} - break; - - case 5: -#line 140 "said.y" - { (yyval) = SAID_BRANCH_NULL; ;} - break; - - case 6: -#line 142 "said.y" - { (yyval) = said_paren(said_value(0x14b, said_value(0xf900, said_terminal(0xf900))), SAID_BRANCH_NULL); ;} - break; - - case 7: -#line 148 "said.y" - { (yyval) = SAID_BRANCH_NULL; ;} - break; - - case 8: -#line 150 "said.y" - { (yyval) = said_aug_branch(0x152, 0x141, said_aug_branch(0x141, 0x149, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} - break; - - case 9: -#line 152 "said.y" - { (yyval) = said_aug_branch(0x141, 0x149, said_attach_branch(said_aug_branch(0x152, 0x141, (yyvsp[(2) - (4)]), SAID_BRANCH_NULL), (yyvsp[(4) - (4)])), SAID_BRANCH_NULL); ;} - break; - - case 10: -#line 154 "said.y" - { (yyval) = said_paren(said_value(0x141, said_value(0x149, (yyvsp[(1) - (1)]))), SAID_BRANCH_NULL); ;} - break; - - case 11: -#line 160 "said.y" - { (yyval) = said_aug_branch(0x142, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} - break; - - case 12: -#line 162 "said.y" - { (yyval) = said_aug_branch(0x142, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} - break; - - case 13: -#line 164 "said.y" - { (yyval) = said_aug_branch(0x142, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x142, (yyvsp[(3) - (5)]), SAID_BRANCH_NULL), (yyvsp[(5) - (5)])), SAID_BRANCH_NULL); ;} - break; - - case 14: -#line 166 "said.y" - { (yyval) = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} - break; - - case 15: -#line 168 "said.y" - { (yyval) = SAID_BRANCH_NULL; ;} - break; - - case 16: -#line 174 "said.y" - { (yyval) = said_aug_branch(0x143, 0x14a, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} - break; - - case 17: -#line 176 "said.y" - { (yyval) = said_aug_branch(0x143, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} - break; - - case 18: -#line 178 "said.y" - { (yyval) = said_aug_branch(0x143, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x143, (yyvsp[(3) - (5)]), SAID_BRANCH_NULL), (yyvsp[(5) - (5)])), SAID_BRANCH_NULL); ;} - break; - - case 19: -#line 180 "said.y" - { (yyval) = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} - break; - - case 20: -#line 182 "said.y" - { (yyval) = SAID_BRANCH_NULL; ;} - break; - - case 21: -#line 187 "said.y" - { (yyval) = said_paren(said_value(0x141, said_value(0x153, said_terminal((yyvsp[(1) - (1)])))), SAID_BRANCH_NULL); ;} - break; - - case 22: -#line 192 "said.y" - { (yyval) = (yyvsp[(1) - (1)]); ;} - break; - - case 23: -#line 194 "said.y" - { (yyval) = said_aug_branch(0x141, 0x14c, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} - break; - - case 24: -#line 196 "said.y" - { (yyval) = said_attach_branch((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); ;} - break; - - case 25: -#line 198 "said.y" - { (yyval) = said_attach_branch((yyvsp[(1) - (5)]), (yyvsp[(3) - (5)])); ;} - break; - - case 26: -#line 203 "said.y" - { (yyval) = said_attach_branch(said_aug_branch(0x141, 0x14f, (yyvsp[(1) - (2)]), SAID_BRANCH_NULL), (yyvsp[(2) - (2)])); ;} - break; - - case 27: -#line 205 "said.y" - { (yyval) = said_aug_branch(0x141, 0x14f, (yyvsp[(1) - (1)]), SAID_BRANCH_NULL); ;} - break; - - case 28: -#line 207 "said.y" - { (yyval) = (yyvsp[(1) - (1)]); ;} - break; - - case 29: -#line 212 "said.y" - { (yyval) = (yyvsp[(1) - (1)]); ;} - break; - - case 30: -#line 214 "said.y" - { (yyval) = said_aug_branch(0x152, 0x144, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL); ;} - break; - - case 31: -#line 216 "said.y" - { (yyval) = said_attach_branch((yyvsp[(1) - (4)]), said_aug_branch(0x152, 0x144, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL)); ;} - break; - - case 32: -#line 221 "said.y" - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); ;} - break; - - case 33: -#line 223 "said.y" - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} - break; - - case 34: -#line 225 "said.y" - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL); ;} - break; - - case 35: -#line 227 "said.y" - { (yyval) = said_aug_branch(0x144, 0x14f, (yyvsp[(3) - (4)]), SAID_BRANCH_NULL); ;} - break; - - case 36: -#line 232 "said.y" - { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (3)]), SAID_BRANCH_NULL), (yyvsp[(3) - (3)])); ;} - break; - - case 37: -#line 234 "said.y" - { (yyval) = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, (yyvsp[(2) - (2)]), SAID_BRANCH_NULL), SAID_BRANCH_NULL); ;} - break; - - case 38: -#line 236 "said.y" - { (yyval) = said_aug_branch(0x141, 0x14c, (yyvsp[(2) - (4)]), SAID_BRANCH_NULL); ;} - break; - - -/* Line 1267 of yacc.c. */ -#line 1690 "said.cpp" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } +static bool parseList(ParseTreeNode* parentNode) +{ + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; + bool found; + ParseTreeNode* newParent = parentNode; - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + found = parseListEntry(newParent); + + if (found) { + + newParent = newParent->right; + + found = parseComma(newParent); + + return true; - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } } - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; +} +static bool parseExpr(ParseTreeNode* parentNode) +{ + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); - if (yyn == YYFINAL) - YYACCEPT; + bool ret = false; + bool found; - *++yyvsp = yylval; + ParseTreeNode* newParent = parentNode; + found = parseList(newNode); - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + if (found) { + ret = true; - yystate = yyn; - goto yynewstate; + said_attach_subtree(newParent, 0x141, 0x14F, newNode); + newParent = newParent->right; -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; + } -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; + found = parseRef(newParent); -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif + if (found || ret) + return true; -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } +static bool parseSpec(ParseTreeNode* parentNode) +{ + // Store current state for rolling back if we fail + int curToken = said_token; + int curTreePos = said_tree_pos; + ParseTreeNode* curRightChild = parentNode->right; -#line 239 "said.y" + ParseTreeNode* newNode = said_branch_node(said_next_node(), 0, 0); + bool ret = false; -int parse_yy_token_lookup[] = {YY_COMMA, YY_AMP, YY_SLASH, YY_PARENO, YY_PARENC, YY_BRACKETSO, YY_BRACKETSC, YY_HASH, YY_LT, YY_GT}; + bool found; -static int yylex() { - int retval = said_tokens[said_token++]; + ParseTreeNode* newParent = parentNode; - if (retval < SAID_LONG(SAID_FIRST)) { - yylval = retval; - retval = WGROUP; - } else { - retval >>= 8; - - if (retval == SAID_TERM) - retval = 0; - else { - assert(retval >= SAID_FIRST); - retval = parse_yy_token_lookup[retval - SAID_FIRST]; - if (retval == YY_BRACKETSO) { - if ((said_tokens[said_token] >> 8) == SAID_LT) - retval = YY_BRACKETSO_LT; - else - if ((said_tokens[said_token] >> 8) == SAID_SLASH) - retval = YY_BRACKETSO_SLASH; - } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_BRACKO) { - retval = YY_LT_BRACKETSO; - } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_PARENO) { - retval = YY_LT_PARENO; - } - } - } + found = parseExpr(newNode); - return retval; -} + if (found) { + // Sentence part 1 found + said_attach_subtree(newParent, 0x141, 0x149, newNode); -static int said_next_node() { - return ((said_tree_pos == 0) || (said_tree_pos >= VOCAB_TREE_NODES)) ? said_tree_pos = 0 : said_tree_pos++; -} + newParent = newParent->right; -#define SAID_NEXT_NODE said_next_node() + ret = true; + } -static int said_leaf_node(tree_t pos, int value) { - said_tree[pos].type = kParseTreeLeafNode; + bool nonempty; - if (value != VALUE_IGNORE) - said_tree[pos].content.value = value; + found = parsePart2(newParent, nonempty); - return pos; -} + if (found) { -static int said_branch_node(tree_t pos, int left, int right) { - said_tree[pos].type = kParseTreeBranchNode; + ret = true; - if (left != VALUE_IGNORE) - said_tree[pos].content.branches[0] = left; + if (nonempty) // non-empty part found + newParent = newParent->right; - if (right != VALUE_IGNORE) - said_tree[pos].content.branches[1] = right; - return pos; -} + found = parsePart3(newParent, nonempty); -static tree_t said_paren(tree_t t1, tree_t t2) { - if (t1) - return said_branch_node(SAID_NEXT_NODE, t1, t2); - else - return t2; -} + if (found) { + + if (nonempty) + newParent = newParent->right; + } + } -static tree_t said_value(int val, tree_t t) { - return said_branch_node(SAID_NEXT_NODE, said_leaf_node(SAID_NEXT_NODE, val), t); + if (said_tokens[said_token] == TOKEN_GT) { + said_token++; -} + newNode = said_branch_node(said_next_node(), 0, + said_leaf_node(said_next_node(), TOKEN_GT)); -static tree_t said_terminal(int val) { - return said_leaf_node(SAID_NEXT_NODE, val); -} + said_attach_subtree(newParent, 0x14B, TOKEN_GT, newNode); -static tree_t said_aug_branch(int n1, int n2, tree_t t1, tree_t t2) { - int retval; + } - retval = said_branch_node(SAID_NEXT_NODE, - said_branch_node(SAID_NEXT_NODE, - said_leaf_node(SAID_NEXT_NODE, n1), - said_branch_node(SAID_NEXT_NODE, - said_leaf_node(SAID_NEXT_NODE, n2), - t1) - ), - t2); - -#ifdef SAID_DEBUG - fprintf(stderr, "AUG(0x%x, 0x%x, [%04x], [%04x]) = [%04x]\n", n1, n2, t1, t2, retval); -#endif - return retval; + if (ret) + return true; + + // Rollback + said_token = curToken; + said_tree_pos = curTreePos; + parentNode->right = curRightChild; + return false; } -static tree_t said_attach_branch(tree_t base, tree_t attacheant) { -#ifdef SAID_DEBUG - fprintf(stderr, "ATT2([%04x], [%04x]) = [%04x]\n", base, attacheant, base); -#endif - if (!attacheant) - return base; - if (!base) - return attacheant; +static bool buildSaidTree() { + said_branch_node(said_tree, &said_tree[1], &said_tree[2]); + said_leaf_node(&said_tree[1], 0x141); // Magic number #1 + said_branch_node(&said_tree[2], &said_tree[3], 0); + said_leaf_node(&said_tree[3], 0x13f); // Magic number #2 - if (!base) - return 0; // Happens if we're out of space + said_tree_pos = SAID_TREE_START; - said_branch_node(base, VALUE_IGNORE, attacheant); + bool ret = parseSpec(&said_tree[2]); - return base; -} + if (!ret) + return false; -static said_spec_t said_top_branch(tree_t first) { -#ifdef SAID_DEBUG - fprintf(stderr, "TOP([%04x])\n", first); -#endif - said_branch_node(0, 1, 2); - said_leaf_node(1, 0x141); // Magic number #1 - said_branch_node(2, 3, first); - said_leaf_node(3, 0x13f); // Magic number #2 + if (said_tokens[said_token] != TOKEN_TERM) { + // No terminator, so parse error. - ++said_blessed; + // Rollback + said_tree[2].right = 0; + said_token = 0; + said_tree_pos = SAID_TREE_START; + return false; + } - return 0; + return true; } static int said_parse_spec(byte *spec) { int nextitem; - said_parse_error = NULL; said_token = 0; said_tokens_nr = 0; - said_blessed = 0; said_tree_pos = SAID_TREE_START; @@ -2049,26 +674,13 @@ static int said_parse_spec(byte *spec) { } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); - if (nextitem == SAID_TERM) - yyparse(); - else { + if (nextitem != SAID_TERM) { warning("SAID spec is too long"); return 1; } - if (said_parse_error) { - warning("Error while parsing SAID spec: %s", said_parse_error); - free(said_parse_error); - return 1; - } - - if (said_tree_pos == 0) { - warning("Out of tree space while parsing SAID spec"); - return 1; - } - - if (said_blessed != 1) { - warning("Found multiple top branches"); + if (!buildSaidTree()) { + warning("Error while parsing SAID spec"); return 1; } @@ -2079,395 +691,304 @@ static int said_parse_spec(byte *spec) { /**** Augmentation ****/ /**********************/ -// primitive functions +static bool dontclaim; +static int outputDepth; -#define AUG_READ_BRANCH(a, br, p) \ - if (tree[p].type != kParseTreeBranchNode) \ - return 0; \ - a = tree[p].content.branches[br]; +enum ScanSaidType { + SCAN_SAID_AND = 0, + SCAN_SAID_OR = 1 +}; -#define AUG_READ_VALUE(a, p) \ - if (tree[p].type != kParseTreeLeafNode) \ - return 0; \ - a = tree[p].content.value; +static int matchTrees(ParseTreeNode* parseT, ParseTreeNode* saidT); +static int scanSaidChildren(ParseTreeNode* parseT, ParseTreeNode* saidT, + ScanSaidType type); +static int scanParseChildren(ParseTreeNode* parseT, ParseTreeNode* saidT); -#define AUG_ASSERT(i) \ - if (!i) return 0; -static int aug_get_next_sibling(parse_tree_node_t *tree, int pos, int *first, int *second) { - // Returns the next sibling relative to the specified position in 'tree', - // sets *first and *second to its augment node values, returns the new position - // or 0 if there was no next sibling - int seek, valpos; +static int node_major(ParseTreeNode* node) { + assert(node->type == kParseTreeBranchNode); + assert(node->left->type == kParseTreeLeafNode); + return node->left->value; +} +static int node_minor(ParseTreeNode* node) { + assert(node->type == kParseTreeBranchNode); + assert(node->right->type == kParseTreeBranchNode); + assert(node->right->left->type == kParseTreeLeafNode); + return node->right->left->value; +} +static bool node_is_terminal(ParseTreeNode* node) { + return (node->right->right && + node->right->right->type != kParseTreeBranchNode); +} +static int node_terminal_value(ParseTreeNode* node) { + assert(node_is_terminal(node)); + return node->right->right->value; +} +#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION +static void node_print_desc(ParseTreeNode* node) { + assert(node); + assert(node->left); + if (node->left->type == kParseTreeBranchNode) { + scidprintf("< "); + node_print_desc(node->left); + scidprintf(", ...>"); + } else { + if (node_is_terminal(node)) { + scidprintf("(%03x %03x %03x)", node_major(node), + node_minor(node), + node_terminal_value(node)); + } else { + scidprintf("(%03x %03x <...>)", node_major(node), + node_minor(node)); + } + } +} +#else +static void node_print_desc(ParseTreeNode*) { } +#endif - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(seek, 0, pos); - AUG_ASSERT(seek); - // Now retrieve first value - AUG_READ_BRANCH(valpos, 0, seek); - AUG_ASSERT(valpos); - AUG_READ_VALUE(*first, valpos); - // Get second value - AUG_READ_BRANCH(seek, 1, seek); - AUG_ASSERT(seek); - AUG_READ_BRANCH(valpos, 0, seek); - AUG_ASSERT(valpos); - AUG_READ_VALUE(*second, valpos); - return pos; -} +static int matchTrees(ParseTreeNode* parseT, ParseTreeNode* saidT) +{ + outputDepth++; + scidprintf("%*smatchTrees on ", outputDepth, ""); + node_print_desc(parseT); + scidprintf(" and "); + node_print_desc(saidT); + scidprintf("\n"); -static int aug_get_wgroup(parse_tree_node_t *tree, int pos) { - // Returns 0 if pos in tree is not the root of a 3-element list, otherwise - // it returns the last element (which, in practice, is the word group - int val; + bool inParen = node_minor(saidT) == 0x14F || node_minor(saidT) == 0x150; + bool inBracket = node_major(saidT) == 0x152; - AUG_READ_BRANCH(pos, 0, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_VALUE(val, pos); + int ret; - return val; -} + if (node_major(parseT) != 0x141 && + node_major(saidT) != 0x141 && node_major(saidT) != 0x152 && + node_major(saidT) != node_major(parseT)) + { + ret = -1; + } -static int aug_get_base_node(parse_tree_node_t *tree) { - int startpos = 0; - AUG_READ_BRANCH(startpos, 1, startpos); + // parse major is 0x141 and/or + // said major is 0x141/0x152 and/or + // said major is parse major - return startpos; -} + else if (node_is_terminal(saidT) && node_is_terminal(parseT) ) { -// semi-primitive functions + // both saidT and parseT are terminals -static int aug_get_first_child(parse_tree_node_t *tree, int pos, int *first, int *second) { - // like aug_get_next_sibling, except that it recurses into the tree and - // finds the first child (usually *not* Ayanami Rei) of the current branch - // rather than its next sibling. - AUG_READ_BRANCH(pos, 0, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); + int said_val = node_terminal_value(saidT); + int parse_val = node_terminal_value(parseT); - return aug_get_next_sibling(tree, pos, first, second); -} + if (said_val != WORD_NONE && + (said_val == parse_val || said_val == WORD_ANY || + parse_val == WORD_ANY)) + ret = 1; + else + ret = -1; -static void aug_find_words_recursively(parse_tree_node_t *tree, int startpos, int *base_words, int *base_words_nr, - int *ref_words, int *ref_words_nr, int maxwords, int refbranch) { - // Finds and lists all base (141) and reference (144) words */ - int major, minor; - int word; - int pos = aug_get_first_child(tree, startpos, &major, &minor); + scidprintf("%*smatchTrees matching terminals: %03x vs %03x (%d)\n", + outputDepth, "", parse_val, said_val, ret); - //if (major == WORD_TYPE_REF) - // refbranch = 1; + } else if (node_is_terminal(saidT) && !node_is_terminal(parseT)) { - while (pos) { - if ((word = aug_get_wgroup(tree, pos))) { // found a word - if (!refbranch && major == WORD_TYPE_BASE) { - if ((*base_words_nr) == maxwords) { - warning("Out of regular words"); - return; // return gracefully - } + // saidT is a terminal, but parseT isn't - base_words[*base_words_nr] = word; // register word - ++(*base_words_nr); + if (node_major(parseT) == 0x141 || + node_major(parseT) == node_major(saidT)) + ret = scanParseChildren(parseT->right->right, saidT); + else + ret = 0; - } - if (major == WORD_TYPE_REF || refbranch) { - if ((*ref_words_nr) == maxwords) { - warning("Out of reference words"); - return; // return gracefully - } + } else if (node_is_terminal(parseT)) { - ref_words[*ref_words_nr] = word; // register word - ++(*ref_words_nr); + // parseT is a terminal, but saidT isn't - } - if (major != WORD_TYPE_SYNTACTIC_SUGAR && major != WORD_TYPE_BASE && major != WORD_TYPE_REF) - warning("aug_find_words_recursively(): Unknown word type %03x", major); + if (node_major(saidT) == 0x141 || node_major(saidT) == 0x152 || + node_major(saidT) == node_major(parseT)) + ret = scanSaidChildren(parseT, saidT->right->right, + inParen ? SCAN_SAID_OR : SCAN_SAID_AND ); + else + ret = 0; - } else // Did NOT find a word group: Attempt to recurse - aug_find_words_recursively(tree, pos, base_words, base_words_nr, - ref_words, ref_words_nr, maxwords, refbranch || major == WORD_TYPE_REF); + } else if (node_major(saidT) != 0x141 && node_major(saidT) != 0x152 && + node_major(saidT) != node_major(parseT)) { - pos = aug_get_next_sibling(tree, pos, &major, &minor); - } -} + // parseT and saidT both aren't terminals + // said major is not 0x141 or 0x152 or parse major + ret = scanParseChildren(parseT->right->right, saidT); -static void aug_find_words(parse_tree_node_t *tree, int startpos, int *base_words, int *base_words_nr, - int *ref_words, int *ref_words_nr, int maxwords) { - // initializing wrapper for aug_find_words_recursively() - *base_words_nr = 0; - *ref_words_nr = 0; + } else { - aug_find_words_recursively(tree, startpos, base_words, base_words_nr, ref_words, ref_words_nr, maxwords, 0); -} + // parseT and saidT are both not terminals, + // said major 0x141 or 0x152 or equal to parse major + ret = scanSaidChildren(parseT->right->right, saidT->right->right, + inParen ? SCAN_SAID_OR : SCAN_SAID_AND); -static int aug_contains_word(int *list, int length, int word) { - int i; + } - if (word == ANYWORD) - return (length); + if (inBracket && ret == 0) { + scidprintf("%*smatchTrees changing ret to 1 due to brackets\n", + outputDepth, ""); + ret = 1; + } - for (i = 0; i < length; i++) - if (list[i] == word) - return 1; + scidprintf("%*smatchTrees returning %d\n", outputDepth, "", ret); + outputDepth--; - return 0; + return ret; } -static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_branch, int major, int minor, int *base_words, int base_words_nr, - int *ref_words, int ref_words_nr); - -static int augment_match_expression_p(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_basepos, int major, int minor, - int *base_words, int base_words_nr, int *ref_words, int ref_words_nr) { - int cmajor, cminor, cpos; - cpos = aug_get_first_child(saidt, augment_pos, &cmajor, &cminor); - if (!cpos) { - warning("augment_match_expression_p(): Empty condition"); - return 1; - } - - scidprintf("Attempting to match (%03x %03x (%03x %03x\n", major, minor, cmajor, cminor); +static int scanSaidChildren(ParseTreeNode* parseT, ParseTreeNode* saidT, + ScanSaidType type) { + outputDepth++; + scidprintf("%*sscanSaid(%s) on ", outputDepth, "", + type == SCAN_SAID_OR ? "OR" : "AND"); + node_print_desc(parseT); + scidprintf(" and "); + node_print_desc(saidT); + scidprintf("\n"); - if ((major == WORD_TYPE_BASE) && (minor == AUGMENT_SENTENCE_MINOR_RECURSE)) - return augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr); + int ret = 1; - switch (major) { + assert(!(type == SCAN_SAID_OR && !saidT)); - case WORD_TYPE_BASE: + while (saidT) { + assert(saidT->type == kParseTreeBranchNode); - // Iterate over children, and succeed if ANY child matches + ParseTreeNode* saidChild = saidT->left; + assert(saidChild); - while (cpos) { - if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { - int word = aug_get_wgroup(saidt, cpos); - scidprintf("Looking for word %03x\n", word); + if (node_major(saidChild) != 0x145) { - if (aug_contains_word(base_words, base_words_nr, word)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) { - if (augment_sentence_expression(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) { - int gc_major, gc_minor; - int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor); + ret = scanParseChildren(parseT, saidChild); - while (gchild) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, major, - minor, base_words, base_words_nr, - ref_words, ref_words_nr)) - return 1; - gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor); - } - } else - warning("augment_match_expression_p(): Unknown type 141 minor number %3x", cminor); + if (type == SCAN_SAID_AND && ret != 1) + break; - cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor); + if (type == SCAN_SAID_OR && ret == 1) + break; } - break; - - case WORD_TYPE_REF: - while (cpos) { - if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { - int word = aug_get_wgroup(saidt, cpos); - scidprintf("Looking for refword %03x\n", word); - - if (aug_contains_word(ref_words, ref_words_nr, word)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) { - int gc_major, gc_minor; - int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor); - - while (gchild) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, major, - minor, base_words, base_words_nr, - ref_words, ref_words_nr)) - return 1; - gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor); - } - } else - warning("augment_match_expression_p(): Unknown type 144 minor number %3x", cminor); - - cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor); - } - break; + saidT = saidT->right; - case AUGMENT_SENTENCE_PART_BRACKETS: - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; + } + scidprintf("%*sscanSaid returning %d\n", outputDepth, "", ret); - scidprintf("Didn't match subexpression; checking sub-bracked predicate %03x\n", cmajor); + outputDepth--; + return ret; +} - switch (cmajor) { - case WORD_TYPE_BASE: - if (!base_words_nr) - return 1; - break; - case WORD_TYPE_REF: - if (!ref_words_nr) - return 1; - break; +static int scanParseChildren(ParseTreeNode* parseT, ParseTreeNode* saidT) { - default: - warning("augment_match_expression_p(): (subp1) Unkonwn sub-bracket predicate %03x", cmajor); - } + outputDepth++; + scidprintf("%*sscanParse on ", outputDepth, ""); + node_print_desc(parseT); + scidprintf(" and "); + node_print_desc(saidT); + scidprintf("\n"); - break; + if (node_major(saidT) == 0x14B) { + dontclaim = true; + scidprintf("%*sscanParse returning 1 (0x14B)\n", outputDepth, ""); + outputDepth--; + return 1; + } - default: - warning("augment_match_expression_p(): Unknown predicate %03x", major); + bool inParen = node_minor(saidT) == 0x14F || node_minor(saidT) == 0x150; + bool inBracket = node_major(saidT) == 0x152; - } + int ret; - scidprintf("augment_match_expression_p(): Generic failure\n"); + // descend further down saidT before actually scanning parseT + if ((node_major(saidT) == 0x141 || node_major(saidT) == 0x152) && + !node_is_terminal(saidT)) { - return 0; -} + ret = scanSaidChildren(parseT, saidT->right->right, + inParen ? SCAN_SAID_OR : SCAN_SAID_AND ); -static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_branch, int major, int minor, int *base_words, int base_words_nr, - int *ref_words, int ref_words_nr) { - int check_major, check_minor; - int check_pos = aug_get_first_child(saidt, augment_pos, &check_major, &check_minor); + } else if (parseT && parseT->left->type == kParseTreeBranchNode) { - // Iterate over all children of the said node, and succeed if they ALL match + ret = 0; + int subresult = 0; - do { - if (!(augment_match_expression_p(saidt, check_pos, parset, parse_branch, check_major, check_minor, - base_words, base_words_nr, ref_words, ref_words_nr))) - return 0; - } while ((check_pos = aug_get_next_sibling(saidt, check_pos, &check_major, &check_minor))); + while (parseT) { + assert(parseT->type == kParseTreeBranchNode); - return 1; -} + ParseTreeNode* parseChild = parseT->left; + assert(parseChild); -static int augment_sentence_part(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, int parse_basepos, int major, int minor) { - int pmajor, pminor; - int parse_branch = parse_basepos; - int optional = 0; - int foundwords = 0; + scidprintf("%*sscanning next: ", outputDepth, ""); + node_print_desc(parseChild); + scidprintf("\n"); - scidprintf("Augmenting (%03x %03x\n", major, minor); + if (node_major(parseChild) == node_major(saidT) || + node_major(parseChild) == 0x141) + subresult = matchTrees(parseChild, saidT); - if (major == AUGMENT_SENTENCE_PART_BRACKETS) { // '[/ foo]' is true if '/foo' or if there - // exists no x for which '/x' is true - if ((augment_pos = aug_get_first_child(saidt, augment_pos, &major, &minor))) { - scidprintf("Optional part: Now augmenting (%03x %03x\n", major, minor); - optional = 1; - } else { - scidprintf("Matched empty optional expression\n"); - return 1; - } - } + if (subresult != 0) + ret = subresult; - if ((major < 0x141) || (major > 0x143)) { - scidprintf("augment_sentence_part(): Unexpected sentence part major number %03x\n", major); - return 0; - } + if (ret == 1) + break; + parseT = parseT->right; - // Iterative over the parse tree to find ANY matching subtree of the - // right major type. + } - while ((parse_branch = aug_get_next_sibling(parset, parse_branch, &pmajor, &pminor))) { - if (pmajor == major) { // found matching sentence part - int success; - int base_words_nr; - int ref_words_nr; - int base_words[AUGMENT_MAX_WORDS]; - int ref_words[AUGMENT_MAX_WORDS]; -#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION - int i; -#endif + // ret is now: + // 1 if ANY matchTrees(parseSibling, saidTree) returned 1 + // ELSE: -1 if ANY returned -1 + // ELSE: 0 - scidprintf("Found match with pminor = %03x\n", pminor); - aug_find_words(parset, parse_branch, base_words, &base_words_nr, ref_words, &ref_words_nr, AUGMENT_MAX_WORDS); - foundwords |= (ref_words_nr | base_words_nr); -#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION - printf("%d base words:", base_words_nr); - for (i = 0; i < base_words_nr; i++) - printf(" %03x", base_words[i]); - printf("\n%d reference words:", ref_words_nr); - for (i = 0; i < ref_words_nr; i++) - printf(" %03x", ref_words[i]); - printf("\n"); -#endif + } else { - success = augment_sentence_expression(saidt, augment_pos, parset, parse_basepos, major, minor, - base_words, base_words_nr, ref_words, ref_words_nr); + ret = matchTrees(parseT, saidT); - if (success) { - scidprintf("SUCCESS on augmenting (%03x %03x\n", major, minor); - return 1; - } - } } - if (optional && (foundwords == 0)) { - scidprintf("Found no words and optional branch => SUCCESS on augmenting (%03x %03x\n", major, minor); - return 1; + if (inBracket && ret == 0) { + scidprintf("%*sscanParse changing ret to 1 due to brackets\n", + outputDepth, ""); + ret = 1; } - scidprintf("FAILURE on augmenting (%03x %03x\n", major, minor); - return 0; + scidprintf("%*sscanParse returning %d\n", outputDepth, "", ret); + outputDepth--; + + return ret; } -static int augment_parse_nodes(parse_tree_node_t *parset, parse_tree_node_t *saidt) { - int augment_basepos = 0; - int parse_basepos; - int major, minor; - int dontclaim = 0; - parse_basepos = aug_get_base_node(parset); - if (!parse_basepos) { - warning("augment_parse_nodes(): Parse tree is corrupt"); - return 0; - } - augment_basepos = aug_get_base_node(saidt); - if (!augment_basepos) { - warning("augment_parse_nodes(): Said tree is corrupt"); - return 0; - } +static int augment_parse_nodes(ParseTreeNode *parseT, ParseTreeNode *saidT) { + outputDepth = 0; + scidprintf("augment_parse_nodes on "); + node_print_desc(parseT); + scidprintf(" and "); + node_print_desc(saidT); + scidprintf("\n"); - while ((augment_basepos = aug_get_next_sibling(saidt, augment_basepos, &major, &minor))) { - if ((major == 0x14b) && (minor == SAID_LONG(SAID_GT))) - dontclaim = 1; // special case - else // normal sentence part - if (!(augment_sentence_part(saidt, augment_basepos, parset, parse_basepos, major, minor))) { - scidprintf("Returning failure\n"); - return 0; // fail - } - } + dontclaim = false; - scidprintf("Returning success with dontclaim=%d\n", dontclaim); + int ret = matchTrees(parseT, saidT); + + scidprintf("matchTrees returned %d\n", ret); + + if (ret != 1) + return 0; if (dontclaim) return SAID_PARTIAL_MATCH; - else - return 1; // full match + + return 1; } @@ -2479,18 +1000,18 @@ int said(EngineState *s, byte *spec, bool verbose) { int retval; Vocabulary *voc = g_sci->getVocabulary(); - parse_tree_node_t *parse_tree_ptr = voc->_parserNodes; + ParseTreeNode *parse_tree_ptr = voc->_parserNodes; if (voc->parserIsValid) { if (said_parse_spec(spec)) { - printf("Offending spec was: "); + scidprintf("Offending spec was: "); voc->decipherSaidBlock(spec); return SAID_NO_MATCH; } if (verbose) - vocab_dump_parse_tree("Said-tree", said_tree); // Nothing better to do yet - retval = augment_parse_nodes(parse_tree_ptr, &(said_tree[0])); + vocab_dump_parse_tree("Said-tree", said_tree); + retval = augment_parse_nodes(parse_tree_ptr, said_tree); if (!retval) return SAID_NO_MATCH; @@ -2504,15 +1025,101 @@ int said(EngineState *s, byte *spec, bool verbose) { } -#ifdef SAID_DEBUG_PROGRAM -int main (int argc, char *argv) { - byte block[] = {0x01, 0x00, 0xf8, 0xf5, 0x02, 0x01, 0xf6, 0xf2, 0x02, 0x01, 0xf2, 0x01, 0x03, 0xff}; - EngineState s; +/* + +Some test expressions for in the ScummVM debugging console, using +Codename: ICEMAN's vocabulary: + + + +said green board & [!*] / 8af < 1f6 +True + +said get green board & [!*] / 8af < 1f6 +False + +said green board & [!*] / 8af [< 1f6 ] +True + +said climb up & 19b , 426 [< 142 ] [/ 81e ] +True + +said climb up ladder & 19b , 426 [< 142 ] [/ 81e ] +True + +said climb down & 19b , 426 [< 142 ] [/ 81e ] +False + +said climb up tree & 19b , 426 [< 142 ] [/ 81e ] +False + +said climb up & 19b , 446 , 426 [< 143 ] [/ 81e ] +False + +said climb down & 19b , 446 , 426 [< 143 ] [/ 81e ] +True + +said use green device & 1a5 / 8c1 [< 21d ] +False + +said use electronic device & 1a5 / 8c1 [< 21d ] +True + +said use device & 1a5 / 8c1 [< 21d ] +True + +said eat & 429 [/ !* ] +True + +said eat ladder & 429 [/ !* ] +False + +said look at the ladder & 3f8 / 81e [< !* ] +True + +said look at the green ladder & 3f8 / 81e [< !* ] +False + +said look green book & / 7f6 [< 8d2 ] +False + +said look green book & 3f8 [< ca ] +True + +said get a blue board for the green ladder & 3f9 / 8af [ < 1f6 ] / 81e < 1f6 +False + +said get a board for the green ladder & 3f9 / 8af [ < 1f6 ] / 81e < 1f6 +True + +said get a blue board & 3f9 / 8af [ < 1f6 ] +False + +said get up & ( 3f8 , 3f9 ) [ < ( 142 , 143 ) ] +True + +said get left & ( 3f8 , 3f9 ) [ < ( 142 , 143 ) ] +False + +said look down & ( 3f8 , 3f9 ) [ < ( 142 , 143 ) ] +True + +said get & ( 3f8 , 3f9 ) [ < ( 142 , 143 ) ] +True + +said put washer on shaft & 455 , ( 3fa < cb ) / 8c6 +True + +said depth correct & [!*] < 8b1 / 22 +True + + + + +*/ + + - s.parser_valid = 1; - said(&s, block); -} -#endif } // End of namespace Sci diff --git a/engines/sci/parser/said.y b/engines/sci/parser/said.y deleted file mode 100644 index 08c0f0169e..0000000000 --- a/engines/sci/parser/said.y +++ /dev/null @@ -1,852 +0,0 @@ -%{ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "sci/engine/state.h" - - -// Bison generates an empty switch statement that gives a warning in MSVC. -// This disables that warning. -#ifdef _MSC_VER -#pragma warning(disable:4065) -#endif - - -namespace Sci { - -#define SAID_BRANCH_NULL 0 - -#define MAX_SAID_TOKENS 128 - -// Maximum number of words to be expected in a parsed sentence -#define AUGMENT_MAX_WORDS 64 - - -#define ANYWORD 0xfff - -#define WORD_TYPE_BASE 0x141 -#define WORD_TYPE_REF 0x144 -#define WORD_TYPE_SYNTACTIC_SUGAR 0x145 - -#define AUGMENT_SENTENCE_PART_BRACKETS 0x152 - -// Minor numbers -#define AUGMENT_SENTENCE_MINOR_MATCH_PHRASE 0x14c -#define AUGMENT_SENTENCE_MINOR_MATCH_WORD 0x153 -#define AUGMENT_SENTENCE_MINOR_RECURSE 0x144 -#define AUGMENT_SENTENCE_MINOR_PARENTHESES 0x14f - - -#undef YYDEBUG /*1*/ -//#define SAID_DEBUG*/ -//#define SCI_DEBUG_PARSE_TREE_AUGMENTATION // uncomment to debug parse tree augmentation - - -#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION -#define scidprintf printf -#else -void print_nothing(...) { } -#define scidprintf print_nothing -#endif - - -static char *said_parse_error; - -static int said_token; -static int said_tokens_nr; -static int said_tokens[MAX_SAID_TOKENS]; -static int said_blessed; // increminated by said_top_branch - -static int said_tree_pos; // Set to 0 if we're out of space -#define SAID_TREE_START 4; // Reserve space for the 4 top nodes - -#define VALUE_IGNORE -424242 - -static parse_tree_node_t said_tree[VOCAB_TREE_NODES]; - -typedef int wgroup_t; -typedef int tree_t; -typedef int said_spec_t; - -static tree_t said_aug_branch(int, int, tree_t, tree_t); -static tree_t said_attach_branch(tree_t, tree_t); -/* -static tree_t said_wgroup_branch(wgroup_t); -*/ -static said_spec_t said_top_branch(tree_t); -static tree_t said_paren(tree_t, tree_t); -static tree_t said_value(int, tree_t); -static tree_t said_terminal(int); - -static int yylex(); - -static int yyerror(const char *s) { - said_parse_error = strdup(s); - return 1; /* Abort */ -} - -%} - -%token WGROUP /* Word group */ -%token YY_COMMA /* 0xf0 */ -%token YY_AMP /* 0xf1 */ -%token YY_SLASH /* 0xf2 */ -%token YY_PARENO /* 0xf3 */ -%token YY_PARENC /* 0xf4 */ -%token YY_BRACKETSO /* 0xf5 */ -%token YY_BRACKETSC /* 0xf6 */ -%token YY_HASH /* 0xf7 */ -%token YY_LT /* 0xf8 */ -%token YY_GT /* 0xf9 */ -%token YY_BRACKETSO_LT /* special token used to imitate LR(2) behaviour */ -%token YY_BRACKETSO_SLASH /* special token used to imitate LR(2) behaviour */ -%token YY_LT_BRACKETSO /* special token used to imitate LR(2) behaviour */ -%token YY_LT_PARENO /* special token used to imitate LR(2) behaviour */ - -%% - -saidspec : leftspec optcont - { $$ = said_top_branch(said_attach_branch($1, $2)); } - | leftspec midspec optcont - { $$ = said_top_branch(said_attach_branch($1, said_attach_branch($2, $3))); } - | leftspec midspec rightspec optcont - { $$ = said_top_branch(said_attach_branch($1, said_attach_branch($2, said_attach_branch($3, $4)))); } - ; - - -optcont : /* empty */ - { $$ = SAID_BRANCH_NULL; } - | YY_GT - { $$ = said_paren(said_value(0x14b, said_value(0xf900, said_terminal(0xf900))), SAID_BRANCH_NULL); } - ; - - - -leftspec : /* empty */ - { $$ = SAID_BRANCH_NULL; } - | YY_BRACKETSO expr YY_BRACKETSC - { $$ = said_aug_branch(0x152, 0x141, said_aug_branch(0x141, 0x149, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } - | YY_BRACKETSO expr YY_BRACKETSC cwordrefset - { $$ = said_aug_branch(0x141, 0x149, said_attach_branch(said_aug_branch(0x152, 0x141, $2, SAID_BRANCH_NULL), $4), SAID_BRANCH_NULL); } - | expr - { $$ = said_paren(said_value(0x141, said_value(0x149, $1)), SAID_BRANCH_NULL); } - ; - - - -midspec : YY_SLASH expr - { $$ = said_aug_branch(0x142, 0x14a, $2, SAID_BRANCH_NULL); } - | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC - { $$ = said_aug_branch(0x142, 0x14a, $3, SAID_BRANCH_NULL); } - | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC cwordrefset - { $$ = said_aug_branch(0x142, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x142, $3, SAID_BRANCH_NULL), $5), SAID_BRANCH_NULL); } - | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC - { $$ = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } - | YY_SLASH - { $$ = SAID_BRANCH_NULL; } - ; - - - -rightspec : YY_SLASH expr - { $$ = said_aug_branch(0x143, 0x14a, $2, SAID_BRANCH_NULL); } - | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC - { $$ = said_aug_branch(0x143, 0x14a, $3, SAID_BRANCH_NULL); } - | YY_SLASH YY_BRACKETSO expr YY_BRACKETSC cwordrefset - { $$ = said_aug_branch(0x143, 0x14a, said_attach_branch(said_aug_branch(0x152, 0x143, $3, SAID_BRANCH_NULL), $5), SAID_BRANCH_NULL); } - | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC - { $$ = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } - | YY_SLASH - { $$ = SAID_BRANCH_NULL; } - ; - - -word : WGROUP - { $$ = said_paren(said_value(0x141, said_value(0x153, said_terminal($1))), SAID_BRANCH_NULL); } - ; - - -wordset : word - { $$ = $1; } - | YY_PARENO expr YY_PARENC - { $$ = said_aug_branch(0x141, 0x14c, $2, SAID_BRANCH_NULL); } - | wordset YY_COMMA wordset - { $$ = said_attach_branch($1, $3); } - | wordset YY_COMMA YY_BRACKETSO wordset YY_BRACKETSC - { $$ = said_attach_branch($1, $3); } // CHECKME - ; - - -expr : wordset cwordrefset - { $$ = said_attach_branch(said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL), $2); } - | wordset - { $$ = said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL); } - | cwordrefset - { $$ = $1; } - ; - - -cwordrefset : wordrefset - { $$ = $1; } - | YY_BRACKETSO_LT wordrefset YY_BRACKETSC - { $$ = said_aug_branch(0x152, 0x144, $2, SAID_BRANCH_NULL); } - | wordrefset YY_BRACKETSO_LT wordrefset YY_BRACKETSC - { $$ = said_attach_branch($1, said_aug_branch(0x152, 0x144, $3, SAID_BRANCH_NULL)); } - ; - - -wordrefset : YY_LT word recref - { $$ = said_aug_branch(0x144, 0x14f, $2, $3); } - | YY_LT_PARENO YY_PARENO expr YY_PARENC - { $$ = said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL); } - | YY_LT wordset - { $$ = said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL); } - | YY_LT_BRACKETSO YY_BRACKETSO wordset YY_BRACKETSC - { $$ = said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL); } - ; - - -recref : YY_LT wordset recref - { $$ = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL), $3); } - | YY_LT wordset - { $$ = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); } - | YY_LT_PARENO YY_PARENO expr YY_PARENC - { $$ = said_aug_branch(0x141, 0x14c, $2, SAID_BRANCH_NULL); } - ; - -%% - -int parse_yy_token_lookup[] = {YY_COMMA, YY_AMP, YY_SLASH, YY_PARENO, YY_PARENC, YY_BRACKETSO, YY_BRACKETSC, YY_HASH, YY_LT, YY_GT}; - -static int yylex() { - int retval = said_tokens[said_token++]; - - if (retval < SAID_LONG(SAID_FIRST)) { - yylval = retval; - retval = WGROUP; - } else { - retval >>= 8; - - if (retval == SAID_TERM) - retval = 0; - else { - assert(retval >= SAID_FIRST); - retval = parse_yy_token_lookup[retval - SAID_FIRST]; - if (retval == YY_BRACKETSO) { - if ((said_tokens[said_token] >> 8) == SAID_LT) - retval = YY_BRACKETSO_LT; - else - if ((said_tokens[said_token] >> 8) == SAID_SLASH) - retval = YY_BRACKETSO_SLASH; - } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_BRACKO) { - retval = YY_LT_BRACKETSO; - } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_PARENO) { - retval = YY_LT_PARENO; - } - } - } - - return retval; -} - -static int said_next_node() { - return ((said_tree_pos == 0) || (said_tree_pos >= VOCAB_TREE_NODES)) ? said_tree_pos = 0 : said_tree_pos++; -} - -#define SAID_NEXT_NODE said_next_node() - -static int said_leaf_node(tree_t pos, int value) { - said_tree[pos].type = kParseTreeLeafNode; - - if (value != VALUE_IGNORE) - said_tree[pos].content.value = value; - - return pos; -} - -static int said_branch_node(tree_t pos, int left, int right) { - said_tree[pos].type = kParseTreeBranchNode; - - if (left != VALUE_IGNORE) - said_tree[pos].content.branches[0] = left; - - if (right != VALUE_IGNORE) - said_tree[pos].content.branches[1] = right; - - return pos; -} - -static tree_t said_paren(tree_t t1, tree_t t2) { - if (t1) - return said_branch_node(SAID_NEXT_NODE, t1, t2); - else - return t2; -} - -static tree_t said_value(int val, tree_t t) { - return said_branch_node(SAID_NEXT_NODE, said_leaf_node(SAID_NEXT_NODE, val), t); - -} - -static tree_t said_terminal(int val) { - return said_leaf_node(SAID_NEXT_NODE, val); -} - -static tree_t said_aug_branch(int n1, int n2, tree_t t1, tree_t t2) { - int retval; - - retval = said_branch_node(SAID_NEXT_NODE, - said_branch_node(SAID_NEXT_NODE, - said_leaf_node(SAID_NEXT_NODE, n1), - said_branch_node(SAID_NEXT_NODE, - said_leaf_node(SAID_NEXT_NODE, n2), - t1) - ), - t2); - -#ifdef SAID_DEBUG - fprintf(stderr, "AUG(0x%x, 0x%x, [%04x], [%04x]) = [%04x]\n", n1, n2, t1, t2, retval); -#endif - - return retval; -} - -static tree_t said_attach_branch(tree_t base, tree_t attacheant) { -#ifdef SAID_DEBUG - fprintf(stderr, "ATT2([%04x], [%04x]) = [%04x]\n", base, attacheant, base); -#endif - - if (!attacheant) - return base; - if (!base) - return attacheant; - - if (!base) - return 0; // Happens if we're out of space - - said_branch_node(base, VALUE_IGNORE, attacheant); - - return base; -} - -static said_spec_t said_top_branch(tree_t first) { -#ifdef SAID_DEBUG - fprintf(stderr, "TOP([%04x])\n", first); -#endif - said_branch_node(0, 1, 2); - said_leaf_node(1, 0x141); // Magic number #1 - said_branch_node(2, 3, first); - said_leaf_node(3, 0x13f); // Magic number #2 - - ++said_blessed; - - return 0; -} - -static int said_parse_spec(byte *spec) { - int nextitem; - - said_parse_error = NULL; - said_token = 0; - said_tokens_nr = 0; - said_blessed = 0; - - said_tree_pos = SAID_TREE_START; - - do { - nextitem = *spec++; - if (nextitem < SAID_FIRST) - said_tokens[said_tokens_nr++] = nextitem << 8 | *spec++; - else - said_tokens[said_tokens_nr++] = SAID_LONG(nextitem); - - } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS)); - - if (nextitem == SAID_TERM) - yyparse(); - else { - warning("SAID spec is too long"); - return 1; - } - - if (said_parse_error) { - warning("Error while parsing SAID spec: %s", said_parse_error); - free(said_parse_error); - return 1; - } - - if (said_tree_pos == 0) { - warning("Out of tree space while parsing SAID spec"); - return 1; - } - - if (said_blessed != 1) { - warning("Found multiple top branches"); - return 1; - } - - return 0; -} - -/**********************/ -/**** Augmentation ****/ -/**********************/ - -// primitive functions - -#define AUG_READ_BRANCH(a, br, p) \ - if (tree[p].type != kParseTreeBranchNode) \ - return 0; \ - a = tree[p].content.branches[br]; - -#define AUG_READ_VALUE(a, p) \ - if (tree[p].type != kParseTreeLeafNode) \ - return 0; \ - a = tree[p].content.value; - -#define AUG_ASSERT(i) \ - if (!i) return 0; - -static int aug_get_next_sibling(parse_tree_node_t *tree, int pos, int *first, int *second) { - // Returns the next sibling relative to the specified position in 'tree', - // sets *first and *second to its augment node values, returns the new position - // or 0 if there was no next sibling - int seek, valpos; - - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(seek, 0, pos); - AUG_ASSERT(seek); - - // Now retrieve first value - AUG_READ_BRANCH(valpos, 0, seek); - AUG_ASSERT(valpos); - AUG_READ_VALUE(*first, valpos); - - // Get second value - AUG_READ_BRANCH(seek, 1, seek); - AUG_ASSERT(seek); - AUG_READ_BRANCH(valpos, 0, seek); - AUG_ASSERT(valpos); - AUG_READ_VALUE(*second, valpos); - - return pos; -} - -static int aug_get_wgroup(parse_tree_node_t *tree, int pos) { - // Returns 0 if pos in tree is not the root of a 3-element list, otherwise - // it returns the last element (which, in practice, is the word group - int val; - - AUG_READ_BRANCH(pos, 0, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - AUG_READ_VALUE(val, pos); - - return val; -} - -static int aug_get_base_node(parse_tree_node_t *tree) { - int startpos = 0; - AUG_READ_BRANCH(startpos, 1, startpos); - - return startpos; -} - -// semi-primitive functions - -static int aug_get_first_child(parse_tree_node_t *tree, int pos, int *first, int *second) { - // like aug_get_next_sibling, except that it recurses into the tree and - // finds the first child (usually *not* Ayanami Rei) of the current branch - // rather than its next sibling. - AUG_READ_BRANCH(pos, 0, pos); - AUG_ASSERT(pos); - AUG_READ_BRANCH(pos, 1, pos); - AUG_ASSERT(pos); - - return aug_get_next_sibling(tree, pos, first, second); -} - -static void aug_find_words_recursively(parse_tree_node_t *tree, int startpos, int *base_words, int *base_words_nr, - int *ref_words, int *ref_words_nr, int maxwords, int refbranch) { - // Finds and lists all base (141) and reference (144) words */ - int major, minor; - int word; - int pos = aug_get_first_child(tree, startpos, &major, &minor); - - //if (major == WORD_TYPE_REF) - // refbranch = 1; - - while (pos) { - if ((word = aug_get_wgroup(tree, pos))) { // found a word - if (!refbranch && major == WORD_TYPE_BASE) { - if ((*base_words_nr) == maxwords) { - warning("Out of regular words"); - return; // return gracefully - } - - base_words[*base_words_nr] = word; // register word - ++(*base_words_nr); - - } - if (major == WORD_TYPE_REF || refbranch) { - if ((*ref_words_nr) == maxwords) { - warning("Out of reference words"); - return; // return gracefully - } - - ref_words[*ref_words_nr] = word; // register word - ++(*ref_words_nr); - - } - if (major != WORD_TYPE_SYNTACTIC_SUGAR && major != WORD_TYPE_BASE && major != WORD_TYPE_REF) - warning("aug_find_words_recursively(): Unknown word type %03x", major); - - } else // Did NOT find a word group: Attempt to recurse - aug_find_words_recursively(tree, pos, base_words, base_words_nr, - ref_words, ref_words_nr, maxwords, refbranch || major == WORD_TYPE_REF); - - pos = aug_get_next_sibling(tree, pos, &major, &minor); - } -} - - -static void aug_find_words(parse_tree_node_t *tree, int startpos, int *base_words, int *base_words_nr, - int *ref_words, int *ref_words_nr, int maxwords) { - // initializing wrapper for aug_find_words_recursively() - *base_words_nr = 0; - *ref_words_nr = 0; - - aug_find_words_recursively(tree, startpos, base_words, base_words_nr, ref_words, ref_words_nr, maxwords, 0); -} - - -static int aug_contains_word(int *list, int length, int word) { - int i; - - if (word == ANYWORD) - return (length); - - for (i = 0; i < length; i++) - if (list[i] == word) - return 1; - - return 0; -} - - -static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_branch, int major, int minor, int *base_words, int base_words_nr, - int *ref_words, int ref_words_nr); - -static int augment_match_expression_p(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_basepos, int major, int minor, - int *base_words, int base_words_nr, int *ref_words, int ref_words_nr) { - int cmajor, cminor, cpos; - cpos = aug_get_first_child(saidt, augment_pos, &cmajor, &cminor); - if (!cpos) { - warning("augment_match_expression_p(): Empty condition"); - return 1; - } - - scidprintf("Attempting to match (%03x %03x (%03x %03x\n", major, minor, cmajor, cminor); - - if ((major == WORD_TYPE_BASE) && (minor == AUGMENT_SENTENCE_MINOR_RECURSE)) - return augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr); - - switch (major) { - - case WORD_TYPE_BASE: - - // Iterate over children, and succeed if ANY child matches - - while (cpos) { - if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { - int word = aug_get_wgroup(saidt, cpos); - scidprintf("Looking for word %03x\n", word); - - if (aug_contains_word(base_words, base_words_nr, word)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) { - if (augment_sentence_expression(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) { - int gc_major, gc_minor; - int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor); - - while (gchild) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, major, - minor, base_words, base_words_nr, - ref_words, ref_words_nr)) - return 1; - gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor); - } - } else - warning("augment_match_expression_p(): Unknown type 141 minor number %3x", cminor); - - cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor); - - } - break; - - case WORD_TYPE_REF: - while (cpos) { - if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) { - int word = aug_get_wgroup(saidt, cpos); - scidprintf("Looking for refword %03x\n", word); - - if (aug_contains_word(ref_words, ref_words_nr, word)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; - } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) { - int gc_major, gc_minor; - int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor); - - while (gchild) { - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, major, - minor, base_words, base_words_nr, - ref_words, ref_words_nr)) - return 1; - gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor); - } - } else - warning("augment_match_expression_p(): Unknown type 144 minor number %3x", cminor); - - cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor); - - } - break; - - case AUGMENT_SENTENCE_PART_BRACKETS: - if (augment_match_expression_p(saidt, cpos, parset, parse_basepos, cmajor, cminor, - base_words, base_words_nr, ref_words, ref_words_nr)) - return 1; - - scidprintf("Didn't match subexpression; checking sub-bracked predicate %03x\n", cmajor); - - switch (cmajor) { - case WORD_TYPE_BASE: - if (!base_words_nr) - return 1; - break; - - case WORD_TYPE_REF: - if (!ref_words_nr) - return 1; - break; - - default: - warning("augment_match_expression_p(): (subp1) Unkonwn sub-bracket predicate %03x", cmajor); - } - - break; - - default: - warning("augment_match_expression_p(): Unknown predicate %03x", major); - - } - - scidprintf("augment_match_expression_p(): Generic failure\n"); - - return 0; -} - -static int augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, - int parse_branch, int major, int minor, int *base_words, int base_words_nr, - int *ref_words, int ref_words_nr) { - int check_major, check_minor; - int check_pos = aug_get_first_child(saidt, augment_pos, &check_major, &check_minor); - - // Iterate over all children of the said node, and succeed if they ALL match - - do { - if (!(augment_match_expression_p(saidt, check_pos, parset, parse_branch, check_major, check_minor, - base_words, base_words_nr, ref_words, ref_words_nr))) - return 0; - } while ((check_pos = aug_get_next_sibling(saidt, check_pos, &check_major, &check_minor))); - - return 1; -} - -static int augment_sentence_part(parse_tree_node_t *saidt, int augment_pos, parse_tree_node_t *parset, int parse_basepos, int major, int minor) { - int pmajor, pminor; - int parse_branch = parse_basepos; - int optional = 0; - int foundwords = 0; - - scidprintf("Augmenting (%03x %03x\n", major, minor); - - if (major == AUGMENT_SENTENCE_PART_BRACKETS) { // '[/ foo]' is true if '/foo' or if there - // exists no x for which '/x' is true - if ((augment_pos = aug_get_first_child(saidt, augment_pos, &major, &minor))) { - scidprintf("Optional part: Now augmenting (%03x %03x\n", major, minor); - optional = 1; - } else { - scidprintf("Matched empty optional expression\n"); - return 1; - } - } - - if ((major < 0x141) || (major > 0x143)) { - scidprintf("augment_sentence_part(): Unexpected sentence part major number %03x\n", major); - return 0; - } - - - // Iterative over the parse tree to find ANY matching subtree of the - // right major type. - - while ((parse_branch = aug_get_next_sibling(parset, parse_branch, &pmajor, &pminor))) { - if (pmajor == major) { // found matching sentence part - int success; - int base_words_nr; - int ref_words_nr; - int base_words[AUGMENT_MAX_WORDS]; - int ref_words[AUGMENT_MAX_WORDS]; -#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION - int i; -#endif - - scidprintf("Found match with pminor = %03x\n", pminor); - aug_find_words(parset, parse_branch, base_words, &base_words_nr, ref_words, &ref_words_nr, AUGMENT_MAX_WORDS); - foundwords |= (ref_words_nr | base_words_nr); -#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION - printf("%d base words:", base_words_nr); - for (i = 0; i < base_words_nr; i++) - printf(" %03x", base_words[i]); - printf("\n%d reference words:", ref_words_nr); - for (i = 0; i < ref_words_nr; i++) - printf(" %03x", ref_words[i]); - printf("\n"); -#endif - - success = augment_sentence_expression(saidt, augment_pos, parset, parse_basepos, major, minor, - base_words, base_words_nr, ref_words, ref_words_nr); - - if (success) { - scidprintf("SUCCESS on augmenting (%03x %03x\n", major, minor); - return 1; - } - } - } - - if (optional && (foundwords == 0)) { - scidprintf("Found no words and optional branch => SUCCESS on augmenting (%03x %03x\n", major, minor); - return 1; - } - scidprintf("FAILURE on augmenting (%03x %03x\n", major, minor); - - return 0; -} - -static int augment_parse_nodes(parse_tree_node_t *parset, parse_tree_node_t *saidt) { - int augment_basepos = 0; - int parse_basepos; - int major, minor; - int dontclaim = 0; - - parse_basepos = aug_get_base_node(parset); - if (!parse_basepos) { - warning("augment_parse_nodes(): Parse tree is corrupt"); - return 0; - } - - augment_basepos = aug_get_base_node(saidt); - if (!augment_basepos) { - warning("augment_parse_nodes(): Said tree is corrupt"); - return 0; - } - - while ((augment_basepos = aug_get_next_sibling(saidt, augment_basepos, &major, &minor))) { - if ((major == 0x14b) && (minor == SAID_LONG(SAID_GT))) - dontclaim = 1; // special case - else // normal sentence part - if (!(augment_sentence_part(saidt, augment_basepos, parset, parse_basepos, major, minor))) { - scidprintf("Returning failure\n"); - return 0; // fail - } - } - - scidprintf("Returning success with dontclaim=%d\n", dontclaim); - - if (dontclaim) - return SAID_PARTIAL_MATCH; - else - return 1; // full match -} - - -/*******************/ -/**** Main code ****/ -/*******************/ - -int said(EngineState *s, byte *spec, bool verbose) { - int retval; - Vocabulary *voc = g_sci->getVocabulary(); - - parse_tree_node_t *parse_tree_ptr = voc->_parserNodes; - - if (voc->parserIsValid) { - if (said_parse_spec(spec)) { - printf("Offending spec was: "); - voc->decipherSaidBlock(spec); - return SAID_NO_MATCH; - } - - if (verbose) - vocab_dump_parse_tree("Said-tree", said_tree); // Nothing better to do yet - retval = augment_parse_nodes(parse_tree_ptr, &(said_tree[0])); - - if (!retval) - return SAID_NO_MATCH; - else if (retval != SAID_PARTIAL_MATCH) - return SAID_FULL_MATCH; - else - return SAID_PARTIAL_MATCH; - } - - return SAID_NO_MATCH; -} - - -#ifdef SAID_DEBUG_PROGRAM -int main (int argc, char *argv) { - byte block[] = {0x01, 0x00, 0xf8, 0xf5, 0x02, 0x01, 0xf6, 0xf2, 0x02, 0x01, 0xf2, 0x01, 0x03, 0xff}; - EngineState s; - - s.parser_valid = 1; - said(&s, block); -} -#endif - -} // End of namespace Sci diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index a266ba74c1..3b1d9d29df 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -39,7 +39,7 @@ Vocabulary::Vocabulary(ResourceManager *resMan, bool foreign) : _resMan(resMan), memset(_parserNodes, 0, sizeof(_parserNodes)); // Mark parse tree as unused _parserNodes[0].type = kParseTreeLeafNode; - _parserNodes[0].content.value = 0; + _parserNodes[0].value = 0; _synonyms.clear(); // No synonyms @@ -466,30 +466,25 @@ void Vocabulary::printParserWords() const { con->DebugPrintf("\n"); } -void _vocab_recursive_ptree_dump_treelike(parse_tree_node_t *nodes, int nr, int prevnr) { - if ((nr > VOCAB_TREE_NODES)/* || (nr < prevnr)*/) { - printf("Error(%04x)", nr); - return; - } +void _vocab_recursive_ptree_dump_treelike(ParseTreeNode *tree) { + assert(tree); - if (nodes[nr].type == kParseTreeLeafNode) - //printf("[%03x]%04x", nr, nodes[nr].content.value); - printf("%x", nodes[nr].content.value); + if (tree->type == kParseTreeLeafNode) + printf("%x", tree->value); else { - int lbranch = nodes[nr].content.branches[0]; - int rbranch = nodes[nr].content.branches[1]; - //printf("<[%03x]", nr); + ParseTreeNode* lbranch = tree->left; + ParseTreeNode* rbranch = tree->right; printf("<"); if (lbranch) - _vocab_recursive_ptree_dump_treelike(nodes, lbranch, nr); + _vocab_recursive_ptree_dump_treelike(lbranch); else printf("NULL"); printf(","); if (rbranch) - _vocab_recursive_ptree_dump_treelike(nodes, rbranch, nr); + _vocab_recursive_ptree_dump_treelike(rbranch); else printf("NULL"); @@ -497,55 +492,52 @@ void _vocab_recursive_ptree_dump_treelike(parse_tree_node_t *nodes, int nr, int } } -void _vocab_recursive_ptree_dump(parse_tree_node_t *nodes, int nr, int prevnr, int blanks) { - int lbranch = nodes[nr].content.branches[0]; - int rbranch = nodes[nr].content.branches[1]; - int i; +void _vocab_recursive_ptree_dump(ParseTreeNode *tree, int blanks) { + assert(tree); - if (nodes[nr].type == kParseTreeLeafNode) { - printf("vocab_dump_parse_tree: Error: consp is nil for element %03x\n", nr); - return; - } + ParseTreeNode* lbranch = tree->left; + ParseTreeNode* rbranch = tree->right; + int i; - if ((nr > VOCAB_TREE_NODES)/* || (nr < prevnr)*/) { - printf("Error(%04x))", nr); + if (tree->type == kParseTreeLeafNode) { + printf("vocab_dump_parse_tree: Error: consp is nil\n"); return; } if (lbranch) { - if (nodes[lbranch].type == kParseTreeBranchNode) { + if (lbranch->type == kParseTreeBranchNode) { printf("\n"); for (i = 0; i < blanks; i++) printf(" "); printf("("); - _vocab_recursive_ptree_dump(nodes, lbranch, nr, blanks + 1); + _vocab_recursive_ptree_dump(lbranch, blanks + 1); printf(")\n"); for (i = 0; i < blanks; i++) printf(" "); } else - printf("%x", nodes[lbranch].content.value); + printf("%x", lbranch->value); printf(" "); }/* else printf ("nil");*/ if (rbranch) { - if (nodes[rbranch].type == kParseTreeBranchNode) - _vocab_recursive_ptree_dump(nodes, rbranch, nr, blanks); + if (rbranch->type == kParseTreeBranchNode) + _vocab_recursive_ptree_dump(rbranch, blanks); else - printf("%x", nodes[rbranch].content.value); + printf("%x", rbranch->value); }/* else printf("nil");*/ } -void vocab_dump_parse_tree(const char *tree_name, parse_tree_node_t *nodes) { +void vocab_dump_parse_tree(const char *tree_name, ParseTreeNode *nodes) { //_vocab_recursive_ptree_dump_treelike(nodes, 0, 0); printf("(setq %s \n'(", tree_name); - _vocab_recursive_ptree_dump(nodes, 0, 0, 1); + _vocab_recursive_ptree_dump(nodes, 1); printf("))\n"); } void Vocabulary::dumpParseTree() { //_vocab_recursive_ptree_dump_treelike(nodes, 0, 0); printf("(setq parse-tree \n'("); - _vocab_recursive_ptree_dump(_parserNodes, 0, 0, 1); + _vocab_recursive_ptree_dump(_parserNodes, 1); printf("))\n"); } @@ -565,10 +557,10 @@ void Vocabulary::printParserNodes(int num) { for (int i = 0; i < num; i++) { con->DebugPrintf(" Node %03x: ", i); if (_parserNodes[i].type == kParseTreeLeafNode) - con->DebugPrintf("Leaf: %04x\n", _parserNodes[i].content.value); + con->DebugPrintf("Leaf: %04x\n", _parserNodes[i].value); else - con->DebugPrintf("Branch: ->%04x, ->%04x\n", _parserNodes[i].content.branches[0], - _parserNodes[i].content.branches[1]); + con->DebugPrintf("Branch: ->%04x, ->%04x\n", _parserNodes[i].left, + _parserNodes[i].right); } } @@ -581,7 +573,7 @@ int Vocabulary::parseNodes(int *i, int *pos, int type, int nr, int argc, const c if (type == kParseNumber) { _parserNodes[*pos += 1].type = kParseTreeLeafNode; - _parserNodes[*pos].content.value = nr; + _parserNodes[*pos].value = nr; return *pos; } if (type == kParseEndOfInput) { @@ -613,7 +605,15 @@ int Vocabulary::parseNodes(int *i, int *pos, int type, int nr, int argc, const c } } - if ((newPos = _parserNodes[oldPos].content.branches[j] = parseNodes(i, pos, nextToken, nextValue, argc, argv)) == -1) + newPos = parseNodes(i, pos, nextToken, nextValue, argc, argv); + + if (j == 0) + _parserNodes[oldPos].left = &_parserNodes[newPos]; + else + _parserNodes[oldPos].right = &_parserNodes[newPos]; + + + if (newPos == -1) return -1; } diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index 5c8c8fd57d..375e0b21e9 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -82,7 +82,7 @@ enum { #define VOCAB_MAGIC_NUMBER_GROUP 0xffd /* 0xffe ? */ #define VOCAB_MAGIC_NOTHING_GROUP 0xffe -/* Number of nodes for each parse_tree_node structure */ +/* Number of nodes for each ParseTreeNode structure */ #define VOCAB_TREE_NODES 500 #define VOCAB_TREE_NODE_LAST_WORD_STORAGE 0x140 @@ -152,16 +152,16 @@ struct parse_tree_branch_t { }; enum ParseTypes { - kParseTreeLeafNode = 0, - kParseTreeBranchNode = 1 + kParseTreeWordNode = 4, + kParseTreeLeafNode = 5, + kParseTreeBranchNode = 6 }; -struct parse_tree_node_t { +struct ParseTreeNode { ParseTypes type; /**< leaf or branch */ - union { - int value; /**< For leaves */ - short branches[2]; /**< For branches */ - } content; + int value; /**< For leaves */ + ParseTreeNode* left; /**< Left child, for branches */ + ParseTreeNode* right; /**< Right child, for branches */ }; enum VocabularyVersions { @@ -321,7 +321,7 @@ private: public: // Accessed by said() - parse_tree_node_t _parserNodes[VOCAB_TREE_NODES]; /**< The parse tree */ + ParseTreeNode _parserNodes[VOCAB_TREE_NODES]; /**< The parse tree */ // Parser data: reg_t parser_base; /**< Base address for the parser error reporting mechanism */ @@ -334,7 +334,7 @@ public: * @param tree_name Name of the tree to dump (free-form) * @param nodes The nodes containing the parse tree */ -void vocab_dump_parse_tree(const char *tree_name, parse_tree_node_t *nodes); +void vocab_dump_parse_tree(const char *tree_name, ParseTreeNode *nodes); -- cgit v1.2.3 From 4d437bafd8be1966df8d690d46d2bebf78380ed1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 20:12:09 +0000 Subject: AGOS: Make AGOS respect the mute setting. svn-id: r51100 --- engines/agos/agos.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 8f0e69ffdb..5e78a5d52a 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -1039,12 +1039,21 @@ uint32 AGOSEngine::getTime() const { } void AGOSEngine::syncSoundSettings() { - _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); - _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume")); + // Sync the engine with the config manager + int soundVolumeMusic = ConfMan.getInt("music_volume"); + int soundVolumeSFX = ConfMan.getInt("sfx_volume"); + int soundVolumeSpeech = ConfMan.getInt("speech_volume"); + + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, (mute ? 0 : soundVolumeMusic)); + _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, (mute ? 0 : soundVolumeSFX)); + _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, (mute ? 0 : soundVolumeSpeech)); if (_midiEnabled) - _midi.setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume")); + _midi.setVolume((mute ? 0 : soundVolumeMusic), (mute ? 0 : soundVolumeSFX)); } } // End of namespace AGOS -- cgit v1.2.3 From e3d1ec482c510d0b7a851cb0d2a675bad79a2ec9 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 20:12:35 +0000 Subject: LURE: Make LURE respect the mute settings. svn-id: r51101 --- engines/lure/game.cpp | 2 -- engines/lure/game.h | 4 ---- engines/lure/sound.cpp | 23 ++++++++++++++--------- engines/lure/sound.h | 14 ++++++++++---- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp index 5d2f0e8ed1..e77ac25716 100644 --- a/engines/lure/game.cpp +++ b/engines/lure/game.cpp @@ -56,8 +56,6 @@ Game::Game() { _debugFlag = gDebugLevel >= ERROR_BASIC; _soundFlag = true; - _musicVolume = ConfMan.getBool("music_mute") ? 0 : MIN(255, ConfMan.getInt("music_volume")); - _sfxVolume = ConfMan.getBool("sfx_mute") ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); } Game::~Game() { diff --git a/engines/lure/game.h b/engines/lure/game.h index 3864e9c205..123ac0dca7 100644 --- a/engines/lure/game.h +++ b/engines/lure/game.h @@ -48,8 +48,6 @@ class Game { private: Debugger *_debugger; bool _fastTextFlag, _soundFlag; - uint8 _sfxVolume; - uint8 _musicVolume; uint8 _state; uint16 _tellCommands[MAX_TELL_COMMANDS * 3 + 1]; int _numTellCommands; @@ -87,8 +85,6 @@ public: bool &debugFlag() { return _debugFlag; } bool fastTextFlag() { return _fastTextFlag; } bool soundFlag() { return _soundFlag; } - uint8 sfxVolume() { return ConfMan.getInt("sfx_volume"); } - uint8 musicVolume() { return ConfMan.getInt("music_volume"); } Debugger &debugger() { return *_debugger; } // Menu item support methods diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp index cd539dfab4..a75545c330 100644 --- a/engines/lure/sound.cpp +++ b/engines/lure/sound.cpp @@ -72,6 +72,8 @@ SoundManager::SoundManager() { _channelsInner[index].volume = 90; } } + + syncSounds(); } SoundManager::~SoundManager() { @@ -288,16 +290,21 @@ uint8 SoundManager::descIndexOf(uint8 soundNumber) { // Used to sync the volume for all channels with the Config Manager // void SoundManager::syncSounds() { - Game &game = Game::getReference(); musicInterface_TidySounds(); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + _musicVolume = mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); + _sfxVolume = mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); + g_system->lockMutex(_soundMutex); MusicListIterator i; for (i = _playingSounds.begin(); i != _playingSounds.end(); ++i) { if ((*i)->isMusic()) - (*i)->setVolume(game.musicVolume()); + (*i)->setVolume(_musicVolume); else - (*i)->setVolume(game.sfxVolume()); + (*i)->setVolume(_sfxVolume); } g_system->unlockMutex(_soundMutex); } @@ -599,9 +606,9 @@ MidiMusic::MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS], } if (_isMusic) - setVolume(ConfMan.getInt("music_volume")); + setVolume(Sound.musicVolume()); else - setVolume(ConfMan.getInt("sfx_volume")); + setVolume(Sound.sfxVolume()); _passThrough = false; @@ -658,8 +665,7 @@ void MidiMusic::setVolume(int volume) { _volume = volume; - Game &game = Game::getReference(); - volume *= _isMusic ? game.musicVolume() : game.sfxVolume(); + volume *= _isMusic ? Sound.musicVolume() : Sound.sfxVolume(); for (int i = 0; i < _numChannels; ++i) { if (_channels[_channelNumber + i].midiChannel != NULL) @@ -707,8 +713,7 @@ void MidiMusic::send(uint32 b) { // Adjust volume changes by song and master volume byte volume = (byte)((b >> 16) & 0x7F); _channels[channel].volume = volume; - Game &game = Game::getReference(); - int master_volume = _isMusic ? game.musicVolume() : game.sfxVolume(); + int master_volume = _isMusic ? Sound.musicVolume() : Sound.sfxVolume(); volume = volume * _volume * master_volume / 65025; b = (b & 0xFF00FFFF) | (volume << 16); } else if ((b & 0xF0) == 0xC0) { diff --git a/engines/lure/sound.h b/engines/lure/sound.h index c41cec48fe..6d248fbd20 100644 --- a/engines/lure/sound.h +++ b/engines/lure/sound.h @@ -105,7 +105,7 @@ public: bool isMusic() {return _isMusic; } }; -class SoundManager: public Common::Singleton { +class SoundManager : public Common::Singleton { private: // Outer sound interface properties MemoryBlock *_descs; @@ -128,11 +128,15 @@ private: Common::MutexRef _soundMutex; bool _paused; + uint _musicVolume; + uint _sfxVolume; + // Internal support methods void bellsBodge(); void musicInterface_TidySounds(); static void onTimer(void *data); void doTimer(); + public: SoundManager(); ~SoundManager(); @@ -156,9 +160,11 @@ public: void fadeOut(); void pause() { _paused = true; } void resume() { _paused = false; } - bool getPaused() { return _paused; } - bool hasNativeMT32() { return _nativeMT32; } - bool isRoland() { return _isRoland; } + bool getPaused() const { return _paused; } + bool hasNativeMT32() const { return _nativeMT32; } + bool isRoland() const { return _isRoland; } + uint musicVolume() const { return _musicVolume; } + uint sfxVolume() const { return _sfxVolume; } // The following methods implement the external sound player module void musicInterface_Initialise(); -- cgit v1.2.3 From 97870a220de94ded0d7f0c70a6008c4d47b424ed Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 20:12:57 +0000 Subject: AGOS: Make the "m" hotkey respect the mute setting. svn-id: r51102 --- engines/agos/agos.cpp | 2 +- engines/agos/input.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index 5e78a5d52a..670c701198 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -1048,7 +1048,7 @@ void AGOSEngine::syncSoundSettings() { if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, (mute ? 0 : soundVolumeMusic)); + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, (mute ? 0 : (_musicPaused ? 0 : soundVolumeMusic))); _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, (mute ? 0 : soundVolumeSFX)); _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, (mute ? 0 : soundVolumeSpeech)); diff --git a/engines/agos/input.cpp b/engines/agos/input.cpp index 5fc2a64416..1246149aa5 100644 --- a/engines/agos/input.cpp +++ b/engines/agos/input.cpp @@ -602,7 +602,7 @@ bool AGOSEngine::processSpecialKeys() { if (_midiEnabled) { _midi.pause(_musicPaused); } - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, (_musicPaused) ? 0 : ConfMan.getInt("music_volume")); + syncSoundSettings(); break; case 's': if (getGameId() == GID_SIMON1DOS) { -- cgit v1.2.3 From ab655ba01fb0eef4864401ab9cd023bd42f6c318 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 20:13:24 +0000 Subject: SCI: terminating at another resource of sq4cd contains broken data as well, room 35 svn-id: r51103 --- engines/sci/graphics/picture.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 65a253459e..df95347609 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -546,6 +546,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { // This picture includes garbage data, first a set pattern w/o parameter and then short pattern // I guess that garbage is a left over from the sq4-floppy (sci1) to sq4-cd (sci1.1) conversion switch (_resourceId) { + case 35: case 381: case 376: return; -- cgit v1.2.3 From 0d1c44301ab51ad375e88479b3f965cfccc53a45 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 20:22:24 +0000 Subject: SCI: halfing kCelWide for sci2.1 fixes lsl6 inventory icon placement, ffs. see comments svn-id: r51104 --- engines/sci/engine/kgraphics.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 22ccf843d6..4c7d08c24e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -427,6 +427,11 @@ reg_t kCelWide(EngineState *s, int argc, reg_t *argv) { celWidth = g_sci->_gfxCache->kernelViewGetCelWidth(viewId, loopNo, celNo); + if (getSciVersion() == SCI_VERSION_2_1) + celWidth = celWidth / 2; // half the width returned here, fixes lsl6 action icon placements + // the scripts work low-res and add the returned value from here to the coordinate + // TODO: check, if this is actually right. I'm slightly confused by this, but even GK1CD has some idivs in this + // code, so it seems plausible. return make_reg(0, celWidth); } -- cgit v1.2.3 From 44aab95eb9c2b8e8777a50d80d4edbf462762d47 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 20:26:40 +0000 Subject: KYRA: Fix mute setting with MIDI and FM-Towns/PC98 output. svn-id: r51105 --- engines/kyra/sound_midi.cpp | 8 ++++++-- engines/kyra/sound_towns.cpp | 30 +++++++++++++++++++----------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index 7eb151a64d..026c72de26 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -573,8 +573,12 @@ void SoundMidiPC::updateVolumeSettings() { if (!_output) return; - int newMusVol = ConfMan.getInt("music_volume"); - _sfxVolume = ConfMan.getInt("sfx_volume"); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + const int newMusVol = (mute ? 0 : ConfMan.getInt("music_volume")); + _sfxVolume = (mute ? 0 : ConfMan.getInt("sfx_volume")); _output->setSourceVolume(0, newMusVol, newMusVol != _musicVolume); _musicVolume = newMusVol; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 5953e6cd18..9b17011ecf 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -4254,8 +4254,12 @@ void SoundPC98::updateVolumeSettings() { if (!_driver) return; - _driver->setMusicVolume(ConfMan.getInt("music_volume")); - _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + _driver->setMusicVolume((mute ? 0 : ConfMan.getInt("music_volume"))); + _driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume"))); } // KYRA 2 @@ -4456,14 +4460,18 @@ void SoundTownsPC98_v2::updateVolumeSettings() { if (!_driver) return; - _driver->setMusicVolume(ConfMan.getInt("music_volume")); - _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + _driver->setMusicVolume((mute ? 0 : ConfMan.getInt("music_volume"))); + _driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume"))); } // static resources const uint32 TownsPC98_OpnCore::_adtStat[] = { - 0x00010001, 0x00010001, 0x00010001, 0x01010001, + 0x00010001, 0x00010001, 0x00010001, 0x01010001, 0x00010101, 0x00010101, 0x00010101, 0x01010101, 0x01010101, 0x01010101, 0x01010102, 0x01010102, 0x01020102, 0x01020102, 0x01020202, 0x01020202, @@ -4477,14 +4485,14 @@ const uint32 TownsPC98_OpnCore::_adtStat[] = { const uint8 TownsPC98_OpnCore::_detSrc[] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, + 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, - 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, + 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, 0x16, 0x16, 0x16, 0x16 }; -- cgit v1.2.3 From 781aee909bd029f51fe8348dc1158f6835fc7d5b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 21 Jul 2010 20:28:53 +0000 Subject: SCI: r51104 adding #ifdef and check for hires pq4cd is probably low-res, so adding check for hires and adding #ifdef as well svn-id: r51106 --- engines/sci/engine/kgraphics.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 4c7d08c24e..27d4283dd4 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -427,11 +427,15 @@ reg_t kCelWide(EngineState *s, int argc, reg_t *argv) { celWidth = g_sci->_gfxCache->kernelViewGetCelWidth(viewId, loopNo, celNo); - if (getSciVersion() == SCI_VERSION_2_1) - celWidth = celWidth / 2; // half the width returned here, fixes lsl6 action icon placements +#ifdef ENABLE_SCI32 + if (getSciVersion() == SCI_VERSION_2_1) { + if (g_sci->_gfxScreen->getWidth() > 320) + celWidth = celWidth / 2; // half the width returned here, fixes lsl6 action icon placements + } // the scripts work low-res and add the returned value from here to the coordinate // TODO: check, if this is actually right. I'm slightly confused by this, but even GK1CD has some idivs in this // code, so it seems plausible. +#endif return make_reg(0, celWidth); } -- cgit v1.2.3 From 41190f8a7bf74087b113227fb831780d647ade05 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 21 Jul 2010 20:37:46 +0000 Subject: GUI: Properly show external MIDI devices. Formerly in case a game only specified GUIO_MIDIMT32, only the MT-32 Emulator was shown, since that is the only device which is of type MT_MT32. All external MIDI devices are currently only flagged with MT_GM. svn-id: r51107 --- gui/options.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gui/options.cpp b/gui/options.cpp index 0553e5910a..ed56630a62 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -657,9 +657,15 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + const uint32 deviceGuiOption = MidiDriver::musicType2GUIO(d->getMusicType()); + if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS) // global dialog - skip useless FM-Towns option there || (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified - || _guioptions & (MidiDriver::musicType2GUIO(d->getMusicType())) // flag is present + || (_guioptions & deviceGuiOption) // flag is present + // HACK/FIXME: For now we have to show GM devices, even when the game only has GUIO_MIDIMT32 set, + // else we would not show for example external devices connected via ALSA, since they are always + // marked as General MIDI device. + || (deviceGuiOption == Common::GUIO_MIDIGM && (_guioptions & Common::GUIO_MIDIMT32)) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device _midiPopUp->appendEntry(d->getCompleteName(), d->getHandle()); -- cgit v1.2.3 From 9862f3fe247420832fcc7bd082dcb6f73158843b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 21 Jul 2010 21:18:21 +0000 Subject: SCI: Moved the SCI32 kernel functions out of kernel32.cpp and into their respective files svn-id: r51108 --- engines/sci/engine/kernel32.cpp | 571 --------------------------------------- engines/sci/engine/kfile.cpp | 30 ++ engines/sci/engine/kgraphics.cpp | 254 +++++++++++++++-- engines/sci/engine/klists.cpp | 109 ++++++++ engines/sci/engine/kpathing.cpp | 9 + engines/sci/engine/kstring.cpp | 189 +++++++++++++ engines/sci/module.mk | 1 - 7 files changed, 565 insertions(+), 598 deletions(-) delete mode 100644 engines/sci/engine/kernel32.cpp diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp deleted file mode 100644 index 7c90243681..0000000000 --- a/engines/sci/engine/kernel32.cpp +++ /dev/null @@ -1,571 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef ENABLE_SCI32 - -#include "sci/engine/kernel.h" -#include "sci/engine/segment.h" -#include "sci/engine/state.h" -#include "sci/engine/selector.h" -#include "sci/graphics/frameout.h" -#include "sci/graphics/screen.h" - -#include "common/system.h" - -namespace Sci { - -// SCI2 Kernel Functions - -reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) { - // Returns 0 if the screen width or height is less than 640 or 400, - // respectively. - if (g_system->getWidth() < 640 || g_system->getHeight() < 400) - return make_reg(0, 0); - - return make_reg(0, 1); -} - -reg_t kArray(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { - case 0: { // New - reg_t arrayHandle; - SciArray *array = s->_segMan->allocateArray(&arrayHandle); - array->setType(argv[2].toUint16()); - array->setSize(argv[1].toUint16()); - return arrayHandle; - } - case 1: { // Size - SciArray *array = s->_segMan->lookupArray(argv[1]); - return make_reg(0, array->getSize()); - } - case 2: { // At (return value at an index) - SciArray *array = s->_segMan->lookupArray(argv[1]); - return array->getValue(argv[2].toUint16()); - } - case 3: { // Atput (put value at an index) - SciArray *array = s->_segMan->lookupArray(argv[1]); - - uint32 index = argv[2].toUint16(); - uint32 count = argc - 3; - - if (index + count > 65535) - break; - - if (array->getSize() < index + count) - array->setSize(index + count); - - for (uint16 i = 0; i < count; i++) - array->setValue(i + index, argv[i + 3]); - - return argv[1]; // We also have to return the handle - } - case 4: // Free - // Freeing of arrays is handled by the garbage collector - return s->r_acc; - case 5: { // Fill - SciArray *array = s->_segMan->lookupArray(argv[1]); - uint16 index = argv[2].toUint16(); - - // A count of -1 means fill the rest of the array - uint16 count = argv[3].toSint16() == -1 ? array->getSize() - index : argv[3].toUint16(); - uint16 arraySize = array->getSize(); - - if (arraySize < index + count) - array->setSize(index + count); - - for (uint16 i = 0; i < count; i++) - array->setValue(i + index, argv[4]); - - return argv[1]; - } - case 6: { // Cpy - if (s->_segMan->getSegmentObj(argv[1].segment)->getType() != SEG_TYPE_ARRAY || - s->_segMan->getSegmentObj(argv[3].segment)->getType() != SEG_TYPE_ARRAY) { - // Happens in the RAMA demo - warning("kArray(Cpy): Request to copy a segment which isn't an array, ignoring"); - return NULL_REG; - } - - SciArray *array1 = s->_segMan->lookupArray(argv[1]); - SciArray *array2 = s->_segMan->lookupArray(argv[3]); - uint32 index1 = argv[2].toUint16(); - uint32 index2 = argv[4].toUint16(); - - // The original engine ignores bad copies too - if (index2 > array2->getSize()) - break; - - // A count of -1 means fill the rest of the array - uint32 count = argv[5].toSint16() == -1 ? array2->getSize() - index2 : argv[5].toUint16(); - - if (array1->getSize() < index1 + count) - array1->setSize(index1 + count); - - for (uint16 i = 0; i < count; i++) - array1->setValue(i + index1, array2->getValue(i + index2)); - - return argv[1]; - } - case 7: // Cmp - // Not implemented in SSCI - return s->r_acc; - case 8: { // Dup - SciArray *array = s->_segMan->lookupArray(argv[1]); - reg_t arrayHandle; - SciArray *dupArray = s->_segMan->allocateArray(&arrayHandle); - - dupArray->setType(array->getType()); - dupArray->setSize(array->getSize()); - - for (uint32 i = 0; i < array->getSize(); i++) - dupArray->setValue(i, array->getValue(i)); - - return arrayHandle; - } - case 9: // Getdata - if (!s->_segMan->isHeapObject(argv[1])) - return argv[1]; - - return readSelector(s->_segMan, argv[1], SELECTOR(data)); - default: - error("Unknown kArray subop %d", argv[0].toUint16()); - } - - return NULL_REG; -} - -reg_t kText(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { - case 0: - return kTextSize(s, argc - 1, argv + 1); - default: - // TODO: Other subops here too, perhaps kTextColors and kTextFonts - warning("kText(%d)", argv[0].toUint16()); - break; - } - - return s->r_acc; -} - -reg_t kString(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { - case 0: { // New - reg_t stringHandle; - SciString *string = s->_segMan->allocateString(&stringHandle); - string->setSize(argv[1].toUint16()); - - // Make sure the first character is a null character - if (string->getSize() > 0) - string->setValue(0, 0); - - return stringHandle; - } - case 1: // Size - return make_reg(0, s->_segMan->getString(argv[1]).size()); - case 2: { // At (return value at an index) - if (argv[1].segment == s->_segMan->getStringSegmentId()) - return make_reg(0, s->_segMan->lookupString(argv[1])->getRawData()[argv[2].toUint16()]); - - return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]); - } - case 3: { // Atput (put value at an index) - SciString *string = s->_segMan->lookupString(argv[1]); - - uint32 index = argv[2].toUint16(); - uint32 count = argc - 3; - - if (index + count > 65535) - break; - - if (string->getSize() < index + count) - string->setSize(index + count); - - for (uint16 i = 0; i < count; i++) - string->setValue(i + index, argv[i + 3].toUint16()); - - return argv[1]; // We also have to return the handle - } - case 4: // Free - // Freeing of strings is handled by the garbage collector - return s->r_acc; - case 5: { // Fill - SciString *string = s->_segMan->lookupString(argv[1]); - uint16 index = argv[2].toUint16(); - - // A count of -1 means fill the rest of the array - uint16 count = argv[3].toSint16() == -1 ? string->getSize() - index : argv[3].toUint16(); - uint16 stringSize = string->getSize(); - - if (stringSize < index + count) - string->setSize(index + count); - - for (uint16 i = 0; i < count; i++) - string->setValue(i + index, argv[4].toUint16()); - - return argv[1]; - } - case 6: { // Cpy - const char *string2 = 0; - uint32 string2Size = 0; - - if (argv[3].segment == s->_segMan->getStringSegmentId()) { - SciString *string = s->_segMan->lookupString(argv[3]); - string2 = string->getRawData(); - string2Size = string->getSize(); - } else { - Common::String string = s->_segMan->getString(argv[3]); - string2 = string.c_str(); - string2Size = string.size() + 1; - } - - uint32 index1 = argv[2].toUint16(); - uint32 index2 = argv[4].toUint16(); - - // The original engine ignores bad copies too - if (index2 > string2Size) - break; - - // A count of -1 means fill the rest of the array - uint32 count = argv[5].toSint16() == -1 ? string2Size - index2 + 1 : argv[5].toUint16(); - - // We have a special case here for argv[1] being a system string - if (argv[1].segment == s->_segMan->getSysStringsSegment()) { - // Resize if necessary - const uint16 sysStringId = argv[1].toUint16(); - SystemString *sysString = s->_segMan->getSystemString(sysStringId); - assert(sysString); - if ((uint32)sysString->_maxSize < index1 + count) { - free(sysString->_value); - sysString->_maxSize = index1 + count; - sysString->_value = (char *)calloc(index1 + count, sizeof(char)); - } - - strncpy(sysString->_value + index1, string2 + index2, count); - } else { - SciString *string1 = s->_segMan->lookupString(argv[1]); - - if (string1->getSize() < index1 + count) - string1->setSize(index1 + count); - - // Note: We're accessing from c_str() here because the - // string's size ignores the trailing 0 and therefore - // triggers an assert when doing string2[i + index2]. - for (uint16 i = 0; i < count; i++) - string1->setValue(i + index1, string2[i + index2]); - } - - } return argv[1]; - case 7: { // Cmp - Common::String string1 = argv[1].isNull() ? "" : s->_segMan->getString(argv[1]); - Common::String string2 = argv[2].isNull() ? "" : s->_segMan->getString(argv[2]); - - if (argc == 4) // Strncmp - return make_reg(0, strncmp(string1.c_str(), string2.c_str(), argv[3].toUint16())); - else // Strcmp - return make_reg(0, strcmp(string1.c_str(), string2.c_str())); - } - case 8: { // Dup - const char *rawString = 0; - uint32 size = 0; - - if (argv[1].segment == s->_segMan->getStringSegmentId()) { - SciString *string = s->_segMan->lookupString(argv[1]); - rawString = string->getRawData(); - size = string->getSize(); - } else { - Common::String string = s->_segMan->getString(argv[1]); - rawString = string.c_str(); - size = string.size() + 1; - } - - reg_t stringHandle; - SciString *dupString = s->_segMan->allocateString(&stringHandle); - dupString->setSize(size); - - for (uint32 i = 0; i < size; i++) - dupString->setValue(i, rawString[i]); - - return stringHandle; - } - case 9: // Getdata - if (!s->_segMan->isHeapObject(argv[1])) - return argv[1]; - - return readSelector(s->_segMan, argv[1], SELECTOR(data)); - case 10: // Stringlen - return make_reg(0, s->_segMan->strlen(argv[1])); - case 11: { // Printf - reg_t stringHandle; - s->_segMan->allocateString(&stringHandle); - - reg_t *adjustedArgs = new reg_t[argc]; - adjustedArgs[0] = stringHandle; - memcpy(&adjustedArgs[1], argv + 1, (argc - 1) * sizeof(reg_t)); - - kFormat(s, argc, adjustedArgs); - delete[] adjustedArgs; - return stringHandle; - } - case 12: // Printf Buf - return kFormat(s, argc - 1, argv + 1); - case 13: { // atoi - Common::String string = s->_segMan->getString(argv[1]); - return make_reg(0, (uint16)atoi(string.c_str())); - } - default: - error("Unknown kString subop %d", argv[0].toUint16()); - } - - return NULL_REG; -} - -reg_t kSave(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { - case 2: // GetSaveDir - // Yay! Reusing the old kernel function! - return kGetSaveDir(s, argc - 1, argv + 1); - case 8: - // TODO - // This function has to return something other than 0 to proceed - return s->r_acc; - default: - warning("Unknown/unhandled kSave subop %d", argv[0].toUint16()); - } - - return NULL_REG; -} - -reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) { - reg_t viewObj = argv[0]; - - g_sci->_gfxFrameout->kernelAddScreenItem(viewObj); - return NULL_REG; -} - -reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv) { - //reg_t viewObj = argv[0]; - - //warning("kUpdateScreenItem, object %04x:%04x, view %d, loop %d, cel %d, pri %d", PRINT_REG(viewObj), viewId, loopNo, celNo, priority); - return NULL_REG; -} - -reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv) { - reg_t viewObj = argv[0]; - - g_sci->_gfxFrameout->kernelDeleteScreenItem(viewObj); - - /* - reg_t viewObj = argv[0]; - uint16 viewId = readSelectorValue(s->_segMan, viewObj, SELECTOR(view)); - int16 loopNo = readSelectorValue(s->_segMan, viewObj, SELECTOR(loop)); - int16 celNo = readSelectorValue(s->_segMan, viewObj, SELECTOR(cel)); - //int16 leftPos = 0; - //int16 topPos = 0; - int16 priority = readSelectorValue(s->_segMan, viewObj, SELECTOR(priority)); - //int16 control = 0; - */ - - // TODO - - //warning("kDeleteScreenItem, view %d, loop %d, cel %d, pri %d", viewId, loopNo, celNo, priority); - return NULL_REG; -} - -reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) { - reg_t planeObj = argv[0]; - - g_sci->_gfxFrameout->kernelAddPlane(planeObj); - warning("kAddPlane object %04x:%04x", PRINT_REG(planeObj)); - return NULL_REG; -} - -reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv) { - reg_t planeObj = argv[0]; - - g_sci->_gfxFrameout->kernelDeletePlane(planeObj); - warning("kDeletePlane object %04x:%04x", PRINT_REG(planeObj)); - return NULL_REG; -} - -reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv) { - reg_t planeObj = argv[0]; - - g_sci->_gfxFrameout->kernelUpdatePlane(planeObj); - return s->r_acc; -} - -reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv) { - reg_t picObj = argv[0]; - - // TODO - - warning("kRepaintPlane object %04x:%04x", PRINT_REG(picObj)); - return NULL_REG; -} - -reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) { - warning("kGetHighPlanePri: %d", g_sci->_gfxFrameout->kernelGetHighPlanePri()); - return make_reg(0, g_sci->_gfxFrameout->kernelGetHighPlanePri()); -} - -reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) { - // This kernel call likely seems to be doing the screen updates, - // as its called right after a view is updated - - // TODO - g_sci->_gfxFrameout->kernelFrameout(); - - return NULL_REG; -} - -reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { - // Tests if the cursor is on the passed object - - uint16 x = argv[0].toUint16(); - uint16 y = argv[1].toUint16(); - reg_t targetObject = argv[2]; - // TODO: argv[3] - it's usually 0 - Common::Rect nsRect; - - // Get the bounding rectangle of the object - nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); - nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); - nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); - nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); - uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - - // If top and left are negative, we need to adjust coordinates by - // the item's x and y (e.g. happens in GK1, day 1, with detective - // Mosely's hotspot in his office) - - if (nsRect.left < 0) - nsRect.translate(itemX, 0); - - if (nsRect.top < 0) - nsRect.translate(0, itemY); - - // HACK: nsLeft and nsTop can be invalid, so try and fix them here - // using x and y (e.g. with the inventory screen in GK1) - if (nsRect.left == itemY && nsRect.top == itemX) { - // Swap the values, as they're inversed (eh???) - nsRect.left = itemX; - nsRect.top = itemY; - } - - /* - warning("kOnMe: (%d, %d) on object %04x:%04x (%s), rect (%d, %d, %d, %d), parameter %d", - argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]), - nsRect.left, nsRect.top, nsRect.right, nsRect.bottom, - argv[3].toUint16()); - */ - - return make_reg(0, nsRect.contains(x, y)); -} - -reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { - // Tests if the cursor is on the passed object, after adjusting the - // coordinates of the object according to the object's plane - - uint16 x = argv[0].toUint16(); - uint16 y = argv[1].toUint16(); - reg_t targetObject = argv[2]; - // TODO: argv[3] - it's usually 0 - Common::Rect nsRect; - - // Get the bounding rectangle of the object - nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); - nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); - nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); - nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); - - // Get the object's plane -#if 0 - reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); - if (!planeObject.isNull()) { - //uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - //uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); - uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); - uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); - uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); - uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); - planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; - planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; - - // Adjust the bounding rectangle of the object by the object's - // actual X, Y coordinates - nsRect.top = ((nsRect.top * g_sci->_gfxScreen->getHeight()) / planeResY); - nsRect.left = ((nsRect.left * g_sci->_gfxScreen->getWidth()) / planeResX); - nsRect.bottom = ((nsRect.bottom * g_sci->_gfxScreen->getHeight()) / planeResY); - nsRect.right = ((nsRect.right * g_sci->_gfxScreen->getWidth()) / planeResX); - - nsRect.translate(planeLeft, planeTop); - } -#endif - //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); - - return make_reg(0, nsRect.contains(x, y)); -} - -reg_t kInPolygon(EngineState *s, int argc, reg_t *argv) { - // kAvoidPath already implements this - return kAvoidPath(s, argc, argv); -} - -reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { - // TODO: argument 0 is usually 0, and arguments 1 and 2 are usually 1 - switch (argv[0].toUint16()) { - case 0: { - if (argc != 4) { - warning("kCreateTextBitmap(0): expected 4 arguments, got %i", argc); - return NULL_REG; - } - reg_t object = argv[3]; - Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); - debug("kCreateTextBitmap: %s", text.c_str()); - } - default: - warning("CreateTextBitmap(%d)", argv[0].toUint16()); - } - - return NULL_REG; -} - -reg_t kCD(EngineState *s, int argc, reg_t *argv) { - // TODO: Stub - switch (argv[0].toUint16()) { - case 0: - // Return whether the contents of disc argv[1] is available. - return TRUE_REG; - default: - warning("CD(%d)", argv[0].toUint16()); - } - - return NULL_REG; -} - -} // End of namespace Sci - -#endif // ENABLE_SCI32 diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 2cd2c147bd..ec166e4b0a 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -950,6 +950,36 @@ reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv) { f->_out->writeUint16LE(argv[1].toUint16()); return s->r_acc; // FIXME: does this really doesn't return anything? } + +reg_t kCD(EngineState *s, int argc, reg_t *argv) { + // TODO: Stub + switch (argv[0].toUint16()) { + case 0: + // Return whether the contents of disc argv[1] is available. + return TRUE_REG; + default: + warning("CD(%d)", argv[0].toUint16()); + } + + return NULL_REG; +} + +reg_t kSave(EngineState *s, int argc, reg_t *argv) { + switch (argv[0].toUint16()) { + case 2: // GetSaveDir + // Yay! Reusing the old kernel function! + return kGetSaveDir(s, argc - 1, argv + 1); + case 8: + // TODO + // This function has to return something other than 0 to proceed + return s->r_acc; + default: + warning("Unknown/unhandled kSave subop %d", argv[0].toUint16()); + } + + return NULL_REG; +} + #endif } // End of namespace Sci diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 27d4283dd4..d9ddc59d1e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -49,6 +49,7 @@ #include "sci/graphics/text16.h" #include "sci/graphics/view.h" #ifdef ENABLE_SCI32 +#include "sci/graphics/frameout.h" #include "sci/video/vmd_decoder.h" #endif @@ -1220,7 +1221,234 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { + // This call is used for KQ6's intro. It has one parameter, which is 1 when + // the intro begins, and 0 when it ends. It is suspected that this is + // actually a flag to enable video planar memory access, as the video + // decoder in KQ6 is specifically written for the planar memory model. + // Planar memory mode access was used for VGA "Mode X" (320x240 resolution, + // although the intro in KQ6 is 320x200). + // Refer to http://en.wikipedia.org/wiki/Mode_X + + //warning("STUB: SetVideoMode %d", argv[0].toUint16()); + return s->r_acc; +} + +// New calls for SCI11. Using those is only needed when using text-codes so that +// one is able to change font and/or color multiple times during kDisplay and +// kDrawControl +reg_t kTextFonts(EngineState *s, int argc, reg_t *argv) { + g_sci->_gfxText16->kernelTextFonts(argc, argv); + return s->r_acc; +} + +reg_t kTextColors(EngineState *s, int argc, reg_t *argv) { + g_sci->_gfxText16->kernelTextColors(argc, argv); + return s->r_acc; +} + #ifdef ENABLE_SCI32 + +reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) { + // Returns 0 if the screen width or height is less than 640 or 400, + // respectively. + if (g_system->getWidth() < 640 || g_system->getHeight() < 400) + return make_reg(0, 0); + + return make_reg(0, 1); +} + +reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) { + reg_t viewObj = argv[0]; + + g_sci->_gfxFrameout->kernelAddScreenItem(viewObj); + return NULL_REG; +} + +reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv) { + //reg_t viewObj = argv[0]; + + //warning("kUpdateScreenItem, object %04x:%04x, view %d, loop %d, cel %d, pri %d", PRINT_REG(viewObj), viewId, loopNo, celNo, priority); + return NULL_REG; +} + +reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv) { + reg_t viewObj = argv[0]; + + g_sci->_gfxFrameout->kernelDeleteScreenItem(viewObj); + + /* + reg_t viewObj = argv[0]; + uint16 viewId = readSelectorValue(s->_segMan, viewObj, SELECTOR(view)); + int16 loopNo = readSelectorValue(s->_segMan, viewObj, SELECTOR(loop)); + int16 celNo = readSelectorValue(s->_segMan, viewObj, SELECTOR(cel)); + //int16 leftPos = 0; + //int16 topPos = 0; + int16 priority = readSelectorValue(s->_segMan, viewObj, SELECTOR(priority)); + //int16 control = 0; + */ + + // TODO + + //warning("kDeleteScreenItem, view %d, loop %d, cel %d, pri %d", viewId, loopNo, celNo, priority); + return NULL_REG; +} + +reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) { + reg_t planeObj = argv[0]; + + g_sci->_gfxFrameout->kernelAddPlane(planeObj); + warning("kAddPlane object %04x:%04x", PRINT_REG(planeObj)); + return NULL_REG; +} + +reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv) { + reg_t planeObj = argv[0]; + + g_sci->_gfxFrameout->kernelDeletePlane(planeObj); + warning("kDeletePlane object %04x:%04x", PRINT_REG(planeObj)); + return NULL_REG; +} + +reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv) { + reg_t planeObj = argv[0]; + + g_sci->_gfxFrameout->kernelUpdatePlane(planeObj); + return s->r_acc; +} + +reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv) { + reg_t picObj = argv[0]; + + // TODO + + warning("kRepaintPlane object %04x:%04x", PRINT_REG(picObj)); + return NULL_REG; +} + +reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) { + warning("kGetHighPlanePri: %d", g_sci->_gfxFrameout->kernelGetHighPlanePri()); + return make_reg(0, g_sci->_gfxFrameout->kernelGetHighPlanePri()); +} + +reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) { + // This kernel call likely seems to be doing the screen updates, + // as its called right after a view is updated + + // TODO + g_sci->_gfxFrameout->kernelFrameout(); + + return NULL_REG; +} + +reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { + // Tests if the cursor is on the passed object + + uint16 x = argv[0].toUint16(); + uint16 y = argv[1].toUint16(); + reg_t targetObject = argv[2]; + // TODO: argv[3] - it's usually 0 + Common::Rect nsRect; + + // Get the bounding rectangle of the object + nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); + nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); + nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); + nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); + uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + + // If top and left are negative, we need to adjust coordinates by + // the item's x and y (e.g. happens in GK1, day 1, with detective + // Mosely's hotspot in his office) + + if (nsRect.left < 0) + nsRect.translate(itemX, 0); + + if (nsRect.top < 0) + nsRect.translate(0, itemY); + + // HACK: nsLeft and nsTop can be invalid, so try and fix them here + // using x and y (e.g. with the inventory screen in GK1) + if (nsRect.left == itemY && nsRect.top == itemX) { + // Swap the values, as they're inversed (eh???) + nsRect.left = itemX; + nsRect.top = itemY; + } + + /* + warning("kOnMe: (%d, %d) on object %04x:%04x (%s), rect (%d, %d, %d, %d), parameter %d", + argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]), + nsRect.left, nsRect.top, nsRect.right, nsRect.bottom, + argv[3].toUint16()); + */ + + return make_reg(0, nsRect.contains(x, y)); +} + +reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { + // Tests if the cursor is on the passed object, after adjusting the + // coordinates of the object according to the object's plane + + uint16 x = argv[0].toUint16(); + uint16 y = argv[1].toUint16(); + reg_t targetObject = argv[2]; + // TODO: argv[3] - it's usually 0 + Common::Rect nsRect; + + // Get the bounding rectangle of the object + nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); + nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); + nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); + nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); + + // Get the object's plane +#if 0 + reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane)); + if (!planeObject.isNull()) { + //uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); + //uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); + uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); + uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY; + planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX; + + // Adjust the bounding rectangle of the object by the object's + // actual X, Y coordinates + nsRect.top = ((nsRect.top * g_sci->_gfxScreen->getHeight()) / planeResY); + nsRect.left = ((nsRect.left * g_sci->_gfxScreen->getWidth()) / planeResX); + nsRect.bottom = ((nsRect.bottom * g_sci->_gfxScreen->getHeight()) / planeResY); + nsRect.right = ((nsRect.right * g_sci->_gfxScreen->getWidth()) / planeResX); + + nsRect.translate(planeLeft, planeTop); + } +#endif + //warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16()); + + return make_reg(0, nsRect.contains(x, y)); +} + +reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { + // TODO: argument 0 is usually 0, and arguments 1 and 2 are usually 1 + switch (argv[0].toUint16()) { + case 0: { + if (argc != 4) { + warning("kCreateTextBitmap(0): expected 4 arguments, got %i", argc); + return NULL_REG; + } + reg_t object = argv[3]; + Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); + debug("kCreateTextBitmap: %s", text.c_str()); + } + default: + warning("CreateTextBitmap(%d)", argv[0].toUint16()); + } + + return NULL_REG; +} + reg_t kRobot(EngineState *s, int argc, reg_t *argv) { int16 subop = argv[0].toUint16(); @@ -1364,30 +1592,4 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { #endif -reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { - // This call is used for KQ6's intro. It has one parameter, which is 1 when - // the intro begins, and 0 when it ends. It is suspected that this is - // actually a flag to enable video planar memory access, as the video - // decoder in KQ6 is specifically written for the planar memory model. - // Planar memory mode access was used for VGA "Mode X" (320x240 resolution, - // although the intro in KQ6 is 320x200). - // Refer to http://en.wikipedia.org/wiki/Mode_X - - //warning("STUB: SetVideoMode %d", argv[0].toUint16()); - return s->r_acc; -} - -// New calls for SCI11. Using those is only needed when using text-codes so that -// one is able to change font and/or color multiple times during kDisplay and -// kDrawControl -reg_t kTextFonts(EngineState *s, int argc, reg_t *argv) { - g_sci->_gfxText16->kernelTextFonts(argc, argv); - return s->r_acc; -} - -reg_t kTextColors(EngineState *s, int argc, reg_t *argv) { - g_sci->_gfxText16->kernelTextColors(argc, argv); - return s->r_acc; -} - } // End of namespace Sci diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 945fb1b0e0..09a04493d6 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -614,6 +614,115 @@ reg_t kMoveToEnd(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kArray(EngineState *s, int argc, reg_t *argv) { + switch (argv[0].toUint16()) { + case 0: { // New + reg_t arrayHandle; + SciArray *array = s->_segMan->allocateArray(&arrayHandle); + array->setType(argv[2].toUint16()); + array->setSize(argv[1].toUint16()); + return arrayHandle; + } + case 1: { // Size + SciArray *array = s->_segMan->lookupArray(argv[1]); + return make_reg(0, array->getSize()); + } + case 2: { // At (return value at an index) + SciArray *array = s->_segMan->lookupArray(argv[1]); + return array->getValue(argv[2].toUint16()); + } + case 3: { // Atput (put value at an index) + SciArray *array = s->_segMan->lookupArray(argv[1]); + + uint32 index = argv[2].toUint16(); + uint32 count = argc - 3; + + if (index + count > 65535) + break; + + if (array->getSize() < index + count) + array->setSize(index + count); + + for (uint16 i = 0; i < count; i++) + array->setValue(i + index, argv[i + 3]); + + return argv[1]; // We also have to return the handle + } + case 4: // Free + // Freeing of arrays is handled by the garbage collector + return s->r_acc; + case 5: { // Fill + SciArray *array = s->_segMan->lookupArray(argv[1]); + uint16 index = argv[2].toUint16(); + + // A count of -1 means fill the rest of the array + uint16 count = argv[3].toSint16() == -1 ? array->getSize() - index : argv[3].toUint16(); + uint16 arraySize = array->getSize(); + + if (arraySize < index + count) + array->setSize(index + count); + + for (uint16 i = 0; i < count; i++) + array->setValue(i + index, argv[4]); + + return argv[1]; + } + case 6: { // Cpy + if (s->_segMan->getSegmentObj(argv[1].segment)->getType() != SEG_TYPE_ARRAY || + s->_segMan->getSegmentObj(argv[3].segment)->getType() != SEG_TYPE_ARRAY) { + // Happens in the RAMA demo + warning("kArray(Cpy): Request to copy a segment which isn't an array, ignoring"); + return NULL_REG; + } + + SciArray *array1 = s->_segMan->lookupArray(argv[1]); + SciArray *array2 = s->_segMan->lookupArray(argv[3]); + uint32 index1 = argv[2].toUint16(); + uint32 index2 = argv[4].toUint16(); + + // The original engine ignores bad copies too + if (index2 > array2->getSize()) + break; + + // A count of -1 means fill the rest of the array + uint32 count = argv[5].toSint16() == -1 ? array2->getSize() - index2 : argv[5].toUint16(); + + if (array1->getSize() < index1 + count) + array1->setSize(index1 + count); + + for (uint16 i = 0; i < count; i++) + array1->setValue(i + index1, array2->getValue(i + index2)); + + return argv[1]; + } + case 7: // Cmp + // Not implemented in SSCI + return s->r_acc; + case 8: { // Dup + SciArray *array = s->_segMan->lookupArray(argv[1]); + reg_t arrayHandle; + SciArray *dupArray = s->_segMan->allocateArray(&arrayHandle); + + dupArray->setType(array->getType()); + dupArray->setSize(array->getSize()); + + for (uint32 i = 0; i < array->getSize(); i++) + dupArray->setValue(i, array->getValue(i)); + + return arrayHandle; + } + case 9: // Getdata + if (!s->_segMan->isHeapObject(argv[1])) + return argv[1]; + + return readSelector(s->_segMan, argv[1], SELECTOR(data)); + default: + error("Unknown kArray subop %d", argv[0].toUint16()); + } + + return NULL_REG; +} + #endif } // End of namespace Sci diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index fdaae3e121..53063376e7 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1770,4 +1770,13 @@ reg_t kMergePoly(EngineState *s, int argc, reg_t *argv) { return output; } +#ifdef ENABLE_SCI32 + +reg_t kInPolygon(EngineState *s, int argc, reg_t *argv) { + // kAvoidPath already implements this + return kAvoidPath(s, argc, argv); +} + +#endif + } // End of namespace Sci diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index f2f9543ad2..3a7bb30c80 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -592,4 +592,193 @@ reg_t kStrSplit(EngineState *s, int argc, reg_t *argv) { return argv[0]; } +#ifdef ENABLE_SCI32 + +reg_t kText(EngineState *s, int argc, reg_t *argv) { + switch (argv[0].toUint16()) { + case 0: + return kTextSize(s, argc - 1, argv + 1); + default: + // TODO: Other subops here too, perhaps kTextColors and kTextFonts + warning("kText(%d)", argv[0].toUint16()); + break; + } + + return s->r_acc; +} + +reg_t kString(EngineState *s, int argc, reg_t *argv) { + switch (argv[0].toUint16()) { + case 0: { // New + reg_t stringHandle; + SciString *string = s->_segMan->allocateString(&stringHandle); + string->setSize(argv[1].toUint16()); + + // Make sure the first character is a null character + if (string->getSize() > 0) + string->setValue(0, 0); + + return stringHandle; + } + case 1: // Size + return make_reg(0, s->_segMan->getString(argv[1]).size()); + case 2: { // At (return value at an index) + if (argv[1].segment == s->_segMan->getStringSegmentId()) + return make_reg(0, s->_segMan->lookupString(argv[1])->getRawData()[argv[2].toUint16()]); + + return make_reg(0, s->_segMan->getString(argv[1])[argv[2].toUint16()]); + } + case 3: { // Atput (put value at an index) + SciString *string = s->_segMan->lookupString(argv[1]); + + uint32 index = argv[2].toUint16(); + uint32 count = argc - 3; + + if (index + count > 65535) + break; + + if (string->getSize() < index + count) + string->setSize(index + count); + + for (uint16 i = 0; i < count; i++) + string->setValue(i + index, argv[i + 3].toUint16()); + + return argv[1]; // We also have to return the handle + } + case 4: // Free + // Freeing of strings is handled by the garbage collector + return s->r_acc; + case 5: { // Fill + SciString *string = s->_segMan->lookupString(argv[1]); + uint16 index = argv[2].toUint16(); + + // A count of -1 means fill the rest of the array + uint16 count = argv[3].toSint16() == -1 ? string->getSize() - index : argv[3].toUint16(); + uint16 stringSize = string->getSize(); + + if (stringSize < index + count) + string->setSize(index + count); + + for (uint16 i = 0; i < count; i++) + string->setValue(i + index, argv[4].toUint16()); + + return argv[1]; + } + case 6: { // Cpy + const char *string2 = 0; + uint32 string2Size = 0; + + if (argv[3].segment == s->_segMan->getStringSegmentId()) { + SciString *string = s->_segMan->lookupString(argv[3]); + string2 = string->getRawData(); + string2Size = string->getSize(); + } else { + Common::String string = s->_segMan->getString(argv[3]); + string2 = string.c_str(); + string2Size = string.size() + 1; + } + + uint32 index1 = argv[2].toUint16(); + uint32 index2 = argv[4].toUint16(); + + // The original engine ignores bad copies too + if (index2 > string2Size) + break; + + // A count of -1 means fill the rest of the array + uint32 count = argv[5].toSint16() == -1 ? string2Size - index2 + 1 : argv[5].toUint16(); + + // We have a special case here for argv[1] being a system string + if (argv[1].segment == s->_segMan->getSysStringsSegment()) { + // Resize if necessary + const uint16 sysStringId = argv[1].toUint16(); + SystemString *sysString = s->_segMan->getSystemString(sysStringId); + assert(sysString); + if ((uint32)sysString->_maxSize < index1 + count) { + free(sysString->_value); + sysString->_maxSize = index1 + count; + sysString->_value = (char *)calloc(index1 + count, sizeof(char)); + } + + strncpy(sysString->_value + index1, string2 + index2, count); + } else { + SciString *string1 = s->_segMan->lookupString(argv[1]); + + if (string1->getSize() < index1 + count) + string1->setSize(index1 + count); + + // Note: We're accessing from c_str() here because the + // string's size ignores the trailing 0 and therefore + // triggers an assert when doing string2[i + index2]. + for (uint16 i = 0; i < count; i++) + string1->setValue(i + index1, string2[i + index2]); + } + + } return argv[1]; + case 7: { // Cmp + Common::String string1 = argv[1].isNull() ? "" : s->_segMan->getString(argv[1]); + Common::String string2 = argv[2].isNull() ? "" : s->_segMan->getString(argv[2]); + + if (argc == 4) // Strncmp + return make_reg(0, strncmp(string1.c_str(), string2.c_str(), argv[3].toUint16())); + else // Strcmp + return make_reg(0, strcmp(string1.c_str(), string2.c_str())); + } + case 8: { // Dup + const char *rawString = 0; + uint32 size = 0; + + if (argv[1].segment == s->_segMan->getStringSegmentId()) { + SciString *string = s->_segMan->lookupString(argv[1]); + rawString = string->getRawData(); + size = string->getSize(); + } else { + Common::String string = s->_segMan->getString(argv[1]); + rawString = string.c_str(); + size = string.size() + 1; + } + + reg_t stringHandle; + SciString *dupString = s->_segMan->allocateString(&stringHandle); + dupString->setSize(size); + + for (uint32 i = 0; i < size; i++) + dupString->setValue(i, rawString[i]); + + return stringHandle; + } + case 9: // Getdata + if (!s->_segMan->isHeapObject(argv[1])) + return argv[1]; + + return readSelector(s->_segMan, argv[1], SELECTOR(data)); + case 10: // Stringlen + return make_reg(0, s->_segMan->strlen(argv[1])); + case 11: { // Printf + reg_t stringHandle; + s->_segMan->allocateString(&stringHandle); + + reg_t *adjustedArgs = new reg_t[argc]; + adjustedArgs[0] = stringHandle; + memcpy(&adjustedArgs[1], argv + 1, (argc - 1) * sizeof(reg_t)); + + kFormat(s, argc, adjustedArgs); + delete[] adjustedArgs; + return stringHandle; + } + case 12: // Printf Buf + return kFormat(s, argc - 1, argv + 1); + case 13: { // atoi + Common::String string = s->_segMan->getString(argv[1]); + return make_reg(0, (uint16)atoi(string.c_str())); + } + default: + error("Unknown kString subop %d", argv[0].toUint16()); + } + + return NULL_REG; +} + +#endif + } // End of namespace Sci diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 6ec24f4466..f68115b780 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -72,7 +72,6 @@ MODULE_OBJS := \ ifdef ENABLE_SCI32 MODULE_OBJS += \ - engine/kernel32.o \ graphics/frameout.o \ graphics/paint32.o \ graphics/robot.o \ -- cgit v1.2.3 From a1dab5f9232d5d72721e6c20b6d20821ea6026d2 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 21 Jul 2010 21:37:30 +0000 Subject: SCI: Moved all the video related functions in a separate file svn-id: r51110 --- engines/sci/engine/kgraphics.cpp | 260 +-------------------------------- engines/sci/engine/kvideo.cpp | 300 +++++++++++++++++++++++++++++++++++++++ engines/sci/module.mk | 1 + 3 files changed, 303 insertions(+), 258 deletions(-) create mode 100644 engines/sci/engine/kvideo.cpp diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index d9ddc59d1e..63adcf9ed8 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -23,16 +23,15 @@ * */ +#include "common/system.h" + #include "engines/util.h" #include "graphics/cursorman.h" -#include "graphics/video/avi_decoder.h" -#include "graphics/video/qt_decoder.h" #include "graphics/surface.h" #include "sci/sci.h" #include "sci/debug.h" // for g_debug_sleeptime_factor #include "sci/resource.h" -#include "sci/video/seq_decoder.h" #include "sci/engine/features.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" @@ -50,7 +49,6 @@ #include "sci/graphics/view.h" #ifdef ENABLE_SCI32 #include "sci/graphics/frameout.h" -#include "sci/video/vmd_decoder.h" #endif namespace Sci { @@ -1075,152 +1073,6 @@ reg_t kDisplay(EngineState *s, int argc, reg_t *argv) { return g_sci->_gfxPaint16->kernelDisplay(g_sci->strSplit(text.c_str()).c_str(), argc, argv); } -void playVideo(Graphics::VideoDecoder *videoDecoder) { - if (!videoDecoder) - return; - - byte *scaleBuffer = 0; - uint16 width = videoDecoder->getWidth(); - uint16 height = videoDecoder->getHeight(); - uint16 screenWidth = g_system->getWidth(); - uint16 screenHeight = g_system->getHeight(); - - if (screenWidth == 640 && width <= 320 && height <= 240) { - assert(videoDecoder->getPixelFormat().bytesPerPixel == 1); - width *= 2; - height *= 2; - scaleBuffer = new byte[width * height]; - } - - uint16 x = (screenWidth - width) / 2; - uint16 y = (screenHeight - height) / 2; - bool skipVideo = false; - - while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { - if (videoDecoder->needsUpdate()) { - Graphics::Surface *frame = videoDecoder->decodeNextFrame(); - if (frame) { - if (scaleBuffer) { - // TODO: Probably should do aspect ratio correction in e.g. GK1 Windows - g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight()); - g_system->copyRectToScreen(scaleBuffer, width, x, y, width, height); - } else - g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, width, height); - - if (videoDecoder->hasDirtyPalette()) - videoDecoder->setSystemPalette(); - - g_system->updateScreen(); - } - } - - Common::Event event; - while (g_system->getEventManager()->pollEvent(event)) { - if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) - skipVideo = true; - } - - g_system->delayMillis(10); - } - - delete[] scaleBuffer; - delete videoDecoder; -} - -reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { - // Hide the cursor if it's showing and then show it again if it was - // previously visible. - bool reshowCursor = g_sci->_gfxCursor->isVisible(); - if (reshowCursor) - g_sci->_gfxCursor->kernelHide(); - - uint16 screenWidth = g_system->getWidth(); - uint16 screenHeight = g_system->getHeight(); - - Graphics::VideoDecoder *videoDecoder = 0; - - if (argv[0].segment != 0) { - Common::String filename = s->_segMan->getString(argv[0]); - - if (g_sci->getPlatform() == Common::kPlatformMacintosh) { - // Mac QuickTime - // The only argument is the string for the video - - // HACK: Switch to 16bpp graphics for Cinepak. - initGraphics(screenWidth, screenHeight, screenWidth > 320, NULL); - - if (g_system->getScreenFormat().bytesPerPixel == 1) { - error("This video requires >8bpp color to be displayed, but could not switch to RGB color mode."); - return NULL_REG; - } - - videoDecoder = new Graphics::QuickTimeDecoder(); - if (!videoDecoder->loadFile(filename)) - error("Could not open '%s'", filename.c_str()); - } else { - // DOS SEQ - // SEQ's are called with no subops, just the string and delay - SeqDecoder *seqDecoder = new SeqDecoder(); - seqDecoder->setFrameDelay(argv[1].toUint16()); // Time between frames in ticks - videoDecoder = seqDecoder; - - if (!videoDecoder->loadFile(filename)) { - warning("Failed to open movie file %s", filename.c_str()); - delete videoDecoder; - videoDecoder = 0; - } - } - } else { - // Windows AVI - // TODO: This appears to be some sort of subop. case 0 contains the string - // for the video, so we'll just play it from there for now. - -#ifdef ENABLE_SCI32 - if (getSciVersion() >= SCI_VERSION_2_1) { - // SCI2.1 always has argv[0] as 1, the rest of the arguments seem to - // follow SCI1.1/2. - if (argv[0].toUint16() != 1) - error("SCI2.1 kShowMovie argv[0] not 1"); - argv++; - argc--; - } -#endif - switch (argv[0].toUint16()) { - case 0: { - Common::String filename = s->_segMan->getString(argv[1]); - videoDecoder = new Graphics::AviDecoder(g_system->getMixer()); - - if (!videoDecoder->loadFile(filename.c_str())) { - warning("Failed to open movie file %s", filename.c_str()); - delete videoDecoder; - videoDecoder = 0; - } - break; - } - default: - warning("Unhandled SCI kShowMovie subop %d", argv[1].toUint16()); - } - } - - if (videoDecoder) { - playVideo(videoDecoder); - - // HACK: Switch back to 8bpp if we played a QuickTime video. - // We also won't be copying the screen to the SCI screen... - if (g_system->getScreenFormat().bytesPerPixel != 1) - initGraphics(screenWidth, screenHeight, screenWidth > 320); - else { - g_sci->_gfxScreen->kernelSyncWithFramebuffer(); - g_sci->_gfxPalette->kernelSyncScreenPalette(); - } - } - - if (reshowCursor) - g_sci->_gfxCursor->kernelShow(); - - return s->r_acc; -} - reg_t kSetVideoMode(EngineState *s, int argc, reg_t *argv) { // This call is used for KQ6's intro. It has one parameter, which is 1 when // the intro begins, and 0 when it ends. It is suspected that this is @@ -1482,114 +1334,6 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { - uint16 operation = argv[0].toUint16(); - Graphics::VideoDecoder *videoDecoder = 0; - bool reshowCursor = g_sci->_gfxCursor->isVisible(); - Common::String fileName, warningMsg; - - switch (operation) { - case 0: // init - // This is actually meant to init the video file, but we play it instead - fileName = s->_segMan->derefString(argv[1]); - // TODO: argv[2] (usually null). When it exists, it points to an "Event" object, - // that holds no data initially (e.g. in the intro of Phantasmagoria 1 demo). - // Perhaps it's meant for syncing - if (argv[2] != NULL_REG) - warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x - %s)", PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2])); - - videoDecoder = new VMDDecoder(g_system->getMixer()); - - if (reshowCursor) - g_sci->_gfxCursor->kernelHide(); - - if (videoDecoder && videoDecoder->loadFile(fileName)) - playVideo(videoDecoder); - - if (reshowCursor) - g_sci->_gfxCursor->kernelShow(); - break; - case 1: - { - // Set VMD parameters. Called with a maximum of 6 parameters: - // - // x, y, flags, gammaBoost, gammaFirst, gammaLast - // - // Flags are as follows: - // bit 0 doubled - // bit 1 "drop frames"? - // bit 2 insert black lines - // bit 3 unknown - // bit 4 gamma correction - // bit 5 hold black frame - // bit 6 hold last frame - // bit 7 unknown - // bit 8 stretch - - // gammaBoost boosts palette colors in the range gammaFirst to - // gammaLast, but only if bit 4 in flags is set. Percent value such that - // 0% = no amplification These three parameters are optional if bit 4 is - // clear. Also note that the x, y parameters play subtle games if used - // with subfx 21. The subtleness has to do with creation of temporary - // planes and positioning relative to such planes. - - int flags = argv[3].offset; - Common::String flagspec; - - if (argc > 3) { - if (flags & 1) - flagspec += "doubled "; - if (flags & 2) - flagspec += "dropframes "; - if (flags & 4) - flagspec += "blacklines "; - if (flags & 8) - flagspec += "bit3 "; - if (flags & 16) - flagspec += "gammaboost "; - if (flags & 32) - flagspec += "holdblack "; - if (flags & 64) - flagspec += "holdlast "; - if (flags & 128) - flagspec += "bit7 "; - if (flags & 256) - flagspec += "stretch"; - - warning("VMDFlags: %s", flagspec.c_str()); - } - - warning("x, y: %d, %d", argv[1].offset, argv[2].offset); - - if (argc > 4 && flags & 16) - warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].offset, argv[5].offset, argv[6].offset); - break; - } - case 6: - // Play, perhaps? Or stop? This is the last call made, and takes no extra parameters - case 14: - // Takes an additional integer parameter (e.g. 3) - case 16: - // Takes an additional parameter, usually 0 - case 21: - // Looks to be setting the video size and position. Called with 4 extra integer - // parameters (e.g. 86, 41, 235, 106) - default: - warningMsg = "PlayVMD - unsupported subop. Params: " + - Common::String::printf("%d", argc) + " ("; - - for (int i = 0; i < argc; i++) { - warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - warningMsg += (i == argc - 1 ? ")" : ", "); - } - - warning("%s", warningMsg.c_str()); - break; - } - - return s->r_acc; -} - #endif } // End of namespace Sci diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp new file mode 100644 index 0000000000..cd103dade7 --- /dev/null +++ b/engines/sci/engine/kvideo.cpp @@ -0,0 +1,300 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "engines/util.h" +#include "sci/engine/state.h" +#include "sci/graphics/helpers.h" +#include "sci/graphics/cursor.h" +#include "sci/graphics/palette.h" +#include "sci/graphics/screen.h" +#include "graphics/cursorman.h" +#include "graphics/video/avi_decoder.h" +#include "graphics/video/qt_decoder.h" +#include "sci/video/seq_decoder.h" +#ifdef ENABLE_SCI32 +#include "sci/video/vmd_decoder.h" +#endif + +namespace Sci { + +void playVideo(Graphics::VideoDecoder *videoDecoder) { + if (!videoDecoder) + return; + + byte *scaleBuffer = 0; + uint16 width = videoDecoder->getWidth(); + uint16 height = videoDecoder->getHeight(); + uint16 screenWidth = g_system->getWidth(); + uint16 screenHeight = g_system->getHeight(); + + if (screenWidth == 640 && width <= 320 && height <= 240) { + assert(videoDecoder->getPixelFormat().bytesPerPixel == 1); + width *= 2; + height *= 2; + scaleBuffer = new byte[width * height]; + } + + uint16 x = (screenWidth - width) / 2; + uint16 y = (screenHeight - height) / 2; + bool skipVideo = false; + + while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (frame) { + if (scaleBuffer) { + // TODO: Probably should do aspect ratio correction in e.g. GK1 Windows + g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight()); + g_system->copyRectToScreen(scaleBuffer, width, x, y, width, height); + } else + g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, width, height); + + if (videoDecoder->hasDirtyPalette()) + videoDecoder->setSystemPalette(); + + g_system->updateScreen(); + } + } + + Common::Event event; + while (g_system->getEventManager()->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } + + g_system->delayMillis(10); + } + + delete[] scaleBuffer; + delete videoDecoder; +} + +reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { + // Hide the cursor if it's showing and then show it again if it was + // previously visible. + bool reshowCursor = g_sci->_gfxCursor->isVisible(); + if (reshowCursor) + g_sci->_gfxCursor->kernelHide(); + + uint16 screenWidth = g_system->getWidth(); + uint16 screenHeight = g_system->getHeight(); + + Graphics::VideoDecoder *videoDecoder = 0; + + if (argv[0].segment != 0) { + Common::String filename = s->_segMan->getString(argv[0]); + + if (g_sci->getPlatform() == Common::kPlatformMacintosh) { + // Mac QuickTime + // The only argument is the string for the video + + // HACK: Switch to 16bpp graphics for Cinepak. + initGraphics(screenWidth, screenHeight, screenWidth > 320, NULL); + + if (g_system->getScreenFormat().bytesPerPixel == 1) { + error("This video requires >8bpp color to be displayed, but could not switch to RGB color mode."); + return NULL_REG; + } + + videoDecoder = new Graphics::QuickTimeDecoder(); + if (!videoDecoder->loadFile(filename)) + error("Could not open '%s'", filename.c_str()); + } else { + // DOS SEQ + // SEQ's are called with no subops, just the string and delay + SeqDecoder *seqDecoder = new SeqDecoder(); + seqDecoder->setFrameDelay(argv[1].toUint16()); // Time between frames in ticks + videoDecoder = seqDecoder; + + if (!videoDecoder->loadFile(filename)) { + warning("Failed to open movie file %s", filename.c_str()); + delete videoDecoder; + videoDecoder = 0; + } + } + } else { + // Windows AVI + // TODO: This appears to be some sort of subop. case 0 contains the string + // for the video, so we'll just play it from there for now. + +#ifdef ENABLE_SCI32 + if (getSciVersion() >= SCI_VERSION_2_1) { + // SCI2.1 always has argv[0] as 1, the rest of the arguments seem to + // follow SCI1.1/2. + if (argv[0].toUint16() != 1) + error("SCI2.1 kShowMovie argv[0] not 1"); + argv++; + argc--; + } +#endif + switch (argv[0].toUint16()) { + case 0: { + Common::String filename = s->_segMan->getString(argv[1]); + videoDecoder = new Graphics::AviDecoder(g_system->getMixer()); + + if (!videoDecoder->loadFile(filename.c_str())) { + warning("Failed to open movie file %s", filename.c_str()); + delete videoDecoder; + videoDecoder = 0; + } + break; + } + default: + warning("Unhandled SCI kShowMovie subop %d", argv[1].toUint16()); + } + } + + if (videoDecoder) { + playVideo(videoDecoder); + + // HACK: Switch back to 8bpp if we played a QuickTime video. + // We also won't be copying the screen to the SCI screen... + if (g_system->getScreenFormat().bytesPerPixel != 1) + initGraphics(screenWidth, screenHeight, screenWidth > 320); + else { + g_sci->_gfxScreen->kernelSyncWithFramebuffer(); + g_sci->_gfxPalette->kernelSyncScreenPalette(); + } + } + + if (reshowCursor) + g_sci->_gfxCursor->kernelShow(); + + return s->r_acc; +} + +#ifdef ENABLE_SCI32 + +reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { + uint16 operation = argv[0].toUint16(); + Graphics::VideoDecoder *videoDecoder = 0; + bool reshowCursor = g_sci->_gfxCursor->isVisible(); + Common::String fileName, warningMsg; + + switch (operation) { + case 0: // init + // This is actually meant to init the video file, but we play it instead + fileName = s->_segMan->derefString(argv[1]); + // TODO: argv[2] (usually null). When it exists, it points to an "Event" object, + // that holds no data initially (e.g. in the intro of Phantasmagoria 1 demo). + // Perhaps it's meant for syncing + if (argv[2] != NULL_REG) + warning("kPlayVMD: third parameter isn't 0 (it's %04x:%04x - %s)", PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2])); + + videoDecoder = new VMDDecoder(g_system->getMixer()); + + if (reshowCursor) + g_sci->_gfxCursor->kernelHide(); + + if (videoDecoder && videoDecoder->loadFile(fileName)) + playVideo(videoDecoder); + + if (reshowCursor) + g_sci->_gfxCursor->kernelShow(); + break; + case 1: + { + // Set VMD parameters. Called with a maximum of 6 parameters: + // + // x, y, flags, gammaBoost, gammaFirst, gammaLast + // + // Flags are as follows: + // bit 0 doubled + // bit 1 "drop frames"? + // bit 2 insert black lines + // bit 3 unknown + // bit 4 gamma correction + // bit 5 hold black frame + // bit 6 hold last frame + // bit 7 unknown + // bit 8 stretch + + // gammaBoost boosts palette colors in the range gammaFirst to + // gammaLast, but only if bit 4 in flags is set. Percent value such that + // 0% = no amplification These three parameters are optional if bit 4 is + // clear. Also note that the x, y parameters play subtle games if used + // with subfx 21. The subtleness has to do with creation of temporary + // planes and positioning relative to such planes. + + int flags = argv[3].offset; + Common::String flagspec; + + if (argc > 3) { + if (flags & 1) + flagspec += "doubled "; + if (flags & 2) + flagspec += "dropframes "; + if (flags & 4) + flagspec += "blacklines "; + if (flags & 8) + flagspec += "bit3 "; + if (flags & 16) + flagspec += "gammaboost "; + if (flags & 32) + flagspec += "holdblack "; + if (flags & 64) + flagspec += "holdlast "; + if (flags & 128) + flagspec += "bit7 "; + if (flags & 256) + flagspec += "stretch"; + + warning("VMDFlags: %s", flagspec.c_str()); + } + + warning("x, y: %d, %d", argv[1].offset, argv[2].offset); + + if (argc > 4 && flags & 16) + warning("gammaBoost: %d%% between palette entries %d and %d", argv[4].offset, argv[5].offset, argv[6].offset); + break; + } + case 6: + // Play, perhaps? Or stop? This is the last call made, and takes no extra parameters + case 14: + // Takes an additional integer parameter (e.g. 3) + case 16: + // Takes an additional parameter, usually 0 + case 21: + // Looks to be setting the video size and position. Called with 4 extra integer + // parameters (e.g. 86, 41, 235, 106) + default: + warningMsg = "PlayVMD - unsupported subop. Params: " + + Common::String::printf("%d", argc) + " ("; + + for (int i = 0; i < argc; i++) { + warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); + warningMsg += (i == argc - 1 ? ")" : ", "); + } + + warning("%s", warningMsg.c_str()); + break; + } + + return s->r_acc; +} + +#endif + +} // End of namespace Sci diff --git a/engines/sci/module.mk b/engines/sci/module.mk index f68115b780..9f7140043f 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS := \ engine/kscripts.o \ engine/ksound.o \ engine/kstring.o \ + engine/kvideo.o \ engine/message.o \ engine/savegame.o \ engine/script.o \ -- cgit v1.2.3 From e20288fd4f61f7cc0f5c22af4c4762f8fd277dbe Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 21 Jul 2010 21:52:15 +0000 Subject: SCI: Fixed signature of kFileIO subop 19 for Torin (full version) svn-id: r51112 --- engines/sci/engine/kernel_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 2f3e050042..e4cb90b238 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -238,7 +238,7 @@ static const SciKernelMapSubEntry kFileIO_subops[] = { { SIG_SCI32, 14, MAP_CALL(FileIOWriteByte), "ii", NULL }, { SIG_SCI32, 15, MAP_CALL(FileIOReadWord), "i", NULL }, { SIG_SCI32, 16, MAP_CALL(FileIOWriteWord), "ii", NULL }, - { SIG_SCI32, 19, MAP_CALL(Stub), "", NULL }, // for Torin demo + { SIG_SCI32, 19, MAP_CALL(Stub), "r", NULL }, // for Torin / Torin demo #endif SCI_SUBOPENTRY_TERMINATOR }; -- cgit v1.2.3 From 093800dc1cfa795ed0b58a0e9be99479f42d2d5e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 08:57:25 +0000 Subject: Silenced a known warning in SQ5, after the intro svn-id: r51131 --- engines/sci/graphics/palette.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index c1654b4612..2eebd57976 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -106,7 +106,12 @@ void GfxPalette::createFromData(byte *data, int bytesLeft, Palette *paletteOut) if (bytesLeft < 37) { // This happens when loading palette of picture 0 in sq5 - the resource is broken and doesn't contain a full // palette - warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette header"); + + if (g_sci->getGameId() == GID_SQ5 && g_sci->getEngineState()->currentRoomNumber() == 110 && bytesLeft == 28) { + // Known case for SQ5, which doesn't affect gameplay, thus don't throw a warning + } else { + warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette header"); + } return; } // palette formats in here are not really version exclusive, we can not use sci-version to differentiate between them -- cgit v1.2.3 From 87e4823c752ce617668a0ad87f810ef274b67ef6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 08:58:59 +0000 Subject: SCI: Moved the actual workaround arrays inside a cpp file svn-id: r51132 --- engines/sci/engine/workarounds.cpp | 161 +++++++++++++++++++++++++++++++++++++ engines/sci/engine/workarounds.h | 143 ++++---------------------------- engines/sci/module.mk | 1 + 3 files changed, 176 insertions(+), 129 deletions(-) create mode 100644 engines/sci/engine/workarounds.cpp diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp new file mode 100644 index 0000000000..dce9dbd844 --- /dev/null +++ b/engines/sci/engine/workarounds.cpp @@ -0,0 +1,161 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sci/engine/workarounds.h" + +namespace Sci { + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeDivWorkarounds[] = { + { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call, index, workaround +const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { + { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +#define FAKE WORKAROUND_FAKE + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry uninitializedReadWorkarounds[] = { + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup + { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kAbs_workarounds[] = { + { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDisposeScript_workarounds[] = { + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDoSoundFade_workarounds[] = { + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + // ^^ TODO: check, if this is really a script error or an issue with our restore code + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kSetPort_workarounds[] = { + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kStrCpy_workarounds[] = { + { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +} // End of namespace Sci diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 9f38ab13ee..d44ccf66b2 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -56,137 +56,22 @@ struct SciWorkaroundEntry { }; #define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry opcodeDivWorkarounds[] = { - { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call, index, workaround -static const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { - { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease - SCI_WORKAROUNDENTRY_TERMINATOR -}; - #define FAKE WORKAROUND_FAKE -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game - { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking - { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts - { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts - { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast - { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above - { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory - { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup - { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area - { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory - { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu - { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 - { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { - { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time - // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error - SCI_WORKAROUNDENTRY_TERMINATOR -}; - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -static const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle - SCI_WORKAROUNDENTRY_TERMINATOR -}; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +extern const SciWorkaroundEntry opcodeDivWorkarounds[]; +extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; +extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; +extern const SciWorkaroundEntry kAbs_workarounds[]; +extern const SciWorkaroundEntry kDisposeScript_workarounds[]; +extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; +extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; +extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; +extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; +extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; +extern const SciWorkaroundEntry kSetPort_workarounds[]; +extern const SciWorkaroundEntry kUnLoad_workarounds[]; +extern const SciWorkaroundEntry kStrCpy_workarounds[]; #undef FAKE diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 9f7140043f..dae2807cc2 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -36,6 +36,7 @@ MODULE_OBJS := \ engine/state.o \ engine/static_selectors.o \ engine/vm.o \ + engine/workarounds.o \ graphics/animate.o \ graphics/cache.o \ graphics/compare.o \ -- cgit v1.2.3 From 66115d697e78c3ff3d9e253c49174e46f50bd62d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 22 Jul 2010 09:36:04 +0000 Subject: SCI: Remove '#define FAKE', make SCI_WORKAROUNDENTRY_TERMINATOR 'private' svn-id: r51133 --- engines/sci/engine/workarounds.cpp | 90 +++++++++++++++++++------------------- engines/sci/engine/workarounds.h | 12 ++--- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index dce9dbd844..df9ab979f4 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -25,6 +25,8 @@ #include "sci/engine/workarounds.h" +#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } + namespace Sci { // gameID, room,script,lvl, object-name, method-name, call,index, workaround @@ -39,53 +41,51 @@ const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -#define FAKE WORKAROUND_FAKE - // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { FAKE, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { FAKE, 0 } }, // when starting the game - { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // sometimes when walk-clicking - { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { FAKE, 0 } }, // called when the game starts - { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { FAKE, 0 } }, // Gin Rummy / right when the game starts - { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { FAKE, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { FAKE, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { FAKE, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { FAKE, 0 } }, // jones/cd only - gets called during the game - { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio - { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { FAKE, 0 } }, // going to island of the beast - { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { FAKE, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { FAKE, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { FAKE, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { FAKE, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { FAKE, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { FAKE, 0 } }, // see above - { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { FAKE, 0 } }, // washcloth in inventory - { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { FAKE, 0 } }, // on startup - { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { FAKE, 0 } }, // at least when entering swimming pool area - { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { FAKE, 0 } }, // accessing the inventory - { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { FAKE, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { FAKE, 0 } }, // called when the game starts - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { FAKE, 0 } }, // called when pressing "Start game" in the main menu - { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { FAKE, 0 } }, // during the game + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK2, 34, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup + { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index d44ccf66b2..93ffc30e2b 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -43,6 +43,12 @@ struct SciWorkaroundSolution { uint16 value; }; +/** + * A structure describing a 'workaround' for a SCI script bug. + * + * Arrays of SciWorkaroundEntry instances are terminated by + * a fake entry in which "objectName" is NULL. + */ struct SciWorkaroundEntry { SciGameId gameId; int roomNr; @@ -55,10 +61,6 @@ struct SciWorkaroundEntry { SciWorkaroundSolution newValue; }; -#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } -#define FAKE WORKAROUND_FAKE - -// gameID, room,script,lvl, object-name, method-name, call,index, workaround extern const SciWorkaroundEntry opcodeDivWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; @@ -73,8 +75,6 @@ extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; -#undef FAKE - } // End of namespace Sci #endif // SCI_ENGINE_WORKAROUNDS_H -- cgit v1.2.3 From 15ef4b23a0f864a8788be57a118f75bdc6e383fa Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 10:24:08 +0000 Subject: SCI: some work on priority in sci32 svn-id: r51134 --- engines/sci/engine/selector.cpp | 2 ++ engines/sci/engine/selector.h | 3 ++ engines/sci/graphics/frameout.cpp | 61 +++++++++++++++++++++++++++++---------- engines/sci/graphics/picture.cpp | 37 +++++++++++++++++++----- engines/sci/graphics/picture.h | 5 +++- 5 files changed, 83 insertions(+), 25 deletions(-) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index c807e88d5f..befa7c38a2 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -178,6 +178,8 @@ void Kernel::mapSelectors() { FIND_SELECTOR(dimmed); FIND_SELECTOR(fore); FIND_SELECTOR(back); + FIND_SELECTOR(fixPriority); + FIND_SELECTOR(mirrored); #endif } diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index c3428c1ed7..7e13c18e4a 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -142,6 +142,9 @@ struct SelectorCache { Selector fore; Selector back; Selector dimmed; + + Selector fixPriority; + Selector mirrored; #endif }; diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index d540b44557..5ec29887db 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -157,6 +157,7 @@ void GfxFrameout::kernelFrameout() { GuiResourceId planePictureNr = readSelectorValue(_segMan, planeObject, SELECTOR(picture)); GfxPicture *planePicture = 0; int16 planePictureCels = 0; + bool planePictureMirrored = false; if ((planePictureNr != 0xFFFF) && (planePictureNr != 0xFFFE)) { planePicture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, planePictureNr, false); @@ -164,6 +165,9 @@ void GfxFrameout::kernelFrameout() { _coordAdjuster->pictureSetDisplayArea(planeRect); _palette->drewPicture(planePictureNr); + + if (readSelectorValue(_segMan, planeObject, SELECTOR(mirrored))) + planePictureMirrored = true; } // Fill our itemlist for this plane @@ -191,6 +195,9 @@ void GfxFrameout::kernelFrameout() { itemEntry->y = readSelectorValue(_segMan, itemObject, SELECTOR(y)); itemEntry->z = readSelectorValue(_segMan, itemObject, SELECTOR(z)); itemEntry->priority = readSelectorValue(_segMan, itemObject, SELECTOR(priority)); + if (readSelectorValue(_segMan, itemObject, SELECTOR(fixPriority)) == 0) + itemEntry->priority = itemEntry->y; + if (gameId == GID_GK1) { if ((itemEntry->viewId == 11000) && (itemEntry->loopNo == 0) && (itemEntry->celNo == 0) && (itemEntry->priority == 1)) { itemEntry->priority = 0; // HACK for gk1 hires main menu @@ -209,35 +216,60 @@ void GfxFrameout::kernelFrameout() { itemEntry->y += planeRect.top; itemEntry->x += planeRect.left; - if (!(itemEntry->signal & 0x0010)) { // kSignalFixedPriority - // TODO: Change priority of this item - } - itemList.push_back(itemEntry); itemEntry++; itemCount++; } } + FrameoutEntry *pictureCels = NULL; + + if (planePicture) { + // Show base picture + planePicture->drawSci32Vga(0, 0, 0, planePictureMirrored); + // Allocate memory for picture cels + pictureCels = (FrameoutEntry *)malloc(planePicture->getSci32celCount() * sizeof(FrameoutEntry)); + // Add following cels to the itemlist + FrameoutEntry *picEntry = pictureCels; + for (int pictureCelNr = 1; pictureCelNr < planePictureCels; pictureCelNr++) { + picEntry->celNo = pictureCelNr; + picEntry->object = NULL_REG; + picEntry->y = planePicture->getSci32celY(pictureCelNr); + picEntry->x = planePicture->getSci32celX(pictureCelNr); + + int16 celHeight = planePicture->getSci32celHeight(pictureCelNr); + if (_screen->getWidth() > 320) + celHeight = celHeight / 2; + + picEntry->priority = picEntry->y + celHeight; + + picEntry->y = ((picEntry->y * _screen->getHeight()) / planeResY); + picEntry->x = ((picEntry->x * _screen->getWidth()) / planeResX); + + itemList.push_back(picEntry); + picEntry++; + } + } + // Now sort our itemlist Common::sort(itemList.begin(), itemList.end(), sortHelper); // Now display itemlist - int16 planePictureCel = 0; itemEntry = itemData; for (FrameoutList::iterator listIterator = itemList.begin(); listIterator != itemList.end(); listIterator++) { itemEntry = *listIterator; - if (planePicture) { - while ((planePictureCel <= itemEntry->priority) && (planePictureCel < planePictureCels)) { - planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX); - planePictureCel++; - } - } - if (itemEntry->viewId != 0xFFFF) { + if (itemEntry->object.isNull()) { + // Picture cel data + planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planePictureMirrored); +// warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); + + } else if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); +// warning("view %s %d", _segMan->getObjectName(itemEntry->object), itemEntry->priority); + if (view->isSci2Hires()) _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); @@ -301,10 +333,7 @@ void GfxFrameout::kernelFrameout() { } if (planePicture) { - while (planePictureCel < planePictureCels) { - planePicture->drawSci32Vga(planePictureCel, planeResY, planeResX); - planePictureCel++; - } + free(pictureCels); delete planePicture; planePicture = 0; } diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index df95347609..2b4ceac97b 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -131,7 +131,28 @@ int16 GfxPicture::getSci32celCount() { return inbuffer[2]; } -void GfxPicture::drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX) { +int16 GfxPicture::getSci32celY(int16 celNo) { + byte *inbuffer = _resource->data; + int header_size = READ_LE_UINT16(inbuffer); + int cel_headerPos = header_size + 42 * celNo; + return READ_LE_UINT16(inbuffer + cel_headerPos + 40); +} + +int16 GfxPicture::getSci32celX(int16 celNo) { + byte *inbuffer = _resource->data; + int header_size = READ_LE_UINT16(inbuffer); + int cel_headerPos = header_size + 42 * celNo; + return READ_LE_UINT16(inbuffer + cel_headerPos + 38); +} + +int16 GfxPicture::getSci32celHeight(int16 celNo) { + byte *inbuffer = _resource->data; + int header_size = READ_LE_UINT16(inbuffer); + int cel_headerPos = header_size + 42 * celNo; + return READ_LE_UINT16(inbuffer + cel_headerPos + 2); +} + +void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored) { byte *inbuffer = _resource->data; int size = _resource->size; int header_size = READ_LE_UINT16(inbuffer); @@ -139,11 +160,11 @@ void GfxPicture::drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX) { int celCount = inbuffer[2]; int cel_headerPos = header_size; int cel_RlePos, cel_LiteralPos; - int cel_relXpos, cel_relYpos; +// int cel_relXpos, cel_relYpos; Palette palette; // HACK - _mirroredFlag = false; + _mirroredFlag = mirrored; _addToFlag = false; _resourceType = SCI_PICTURE_TYPE_SCI32; @@ -160,14 +181,14 @@ void GfxPicture::drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX) { while (celCount > 0) { cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24); cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); - cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38); - cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40); + //cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38); + //cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40); // This is really weird, adjusting picture data to plane resolution - why... - cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY); - cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX); + //cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY); + //cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX); - drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, cel_relXpos, cel_relYpos); + drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, callerX, callerY); cel_headerPos += 42; celCount--; } diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index b5636d5bd8..571d291442 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -56,7 +56,10 @@ public: #ifdef ENABLE_SCI32 int16 getSci32celCount(); - void drawSci32Vga(int16 celNo, uint16 planeResY, uint16 planeResX); + int16 getSci32celY(int16 celNo); + int16 getSci32celX(int16 celNo); + int16 getSci32celHeight(int16 celNo); + void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored); #endif private: -- cgit v1.2.3 From ed1ae39e4685e000cac0810ffeea01356fa55146 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 11:11:31 +0000 Subject: SCI: removing priority hack for gk1hires also fixing base picture drawing svn-id: r51137 --- engines/sci/graphics/frameout.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 5ec29887db..c6956e97ca 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -198,14 +198,6 @@ void GfxFrameout::kernelFrameout() { if (readSelectorValue(_segMan, itemObject, SELECTOR(fixPriority)) == 0) itemEntry->priority = itemEntry->y; - if (gameId == GID_GK1) { - if ((itemEntry->viewId == 11000) && (itemEntry->loopNo == 0) && (itemEntry->celNo == 0) && (itemEntry->priority == 1)) { - itemEntry->priority = 0; // HACK for gk1 hires main menu - } - if ((itemEntry->viewId == 10100) && (itemEntry->priority == 0)) { - itemEntry->priority = 1; // HACK for gk1 hires main menu - } - } itemEntry->signal = readSelectorValue(_segMan, itemObject, SELECTOR(signal)); itemEntry->scaleX = readSelectorValue(_segMan, itemObject, SELECTOR(scaleX)); itemEntry->scaleY = readSelectorValue(_segMan, itemObject, SELECTOR(scaleY)); @@ -226,7 +218,7 @@ void GfxFrameout::kernelFrameout() { if (planePicture) { // Show base picture - planePicture->drawSci32Vga(0, 0, 0, planePictureMirrored); + planePicture->drawSci32Vga(0, planePicture->getSci32celX(0), planePicture->getSci32celY(0), planePictureMirrored); // Allocate memory for picture cels pictureCels = (FrameoutEntry *)malloc(planePicture->getSci32celCount() * sizeof(FrameoutEntry)); // Add following cels to the itemlist -- cgit v1.2.3 From 68783fa01cb144e676137444126e3c9d6caf0fa9 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Thu, 22 Jul 2010 11:20:16 +0000 Subject: MADE: fixed bug 3029750 caused by caching from commit 46102. Cache needed to be cleared every time we load a game. Otherwise, those platforms that happen to use the exact same addresses (PC) were ok, but those platforms that had different addresses (PSP for example) would get messed up. svn-id: r51138 --- engines/made/database.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/made/database.cpp b/engines/made/database.cpp index ae1a08e1b5..51308cb7e5 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -515,6 +515,8 @@ int16 GameDatabaseV2::loadgame(const char *filename, int16 version) { _objects[i]->load(*in); } delete in; + + _objectPropertyCache.clear(); // make sure to clear cache return result; } @@ -644,6 +646,8 @@ void GameDatabaseV3::load(Common::SeekableReadStream &sourceS) { void GameDatabaseV3::reloadFromStream(Common::SeekableReadStream &sourceS) { sourceS.seek(_gameStateOffs); sourceS.read(_gameState, _gameStateSize); + + _objectPropertyCache.clear(); // make sure to clear cache } bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description, int16 version) { @@ -734,6 +738,9 @@ int16 GameDatabaseV3::loadgame(const char *filename, int16 version) { in->skip(64); // skip savegame description in->read(_gameState, _gameStateSize); delete in; + + _objectPropertyCache.clear(); // make sure to clear cache + return 0; } -- cgit v1.2.3 From a01152a3bacdeec06a4206b939bcfc1dc2c8ee65 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 12:36:58 +0000 Subject: SCI: some more work on priority sci32 svn-id: r51139 --- engines/sci/graphics/frameout.cpp | 6 +++--- engines/sci/graphics/picture.cpp | 7 +++++++ engines/sci/graphics/picture.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index c6956e97ca..bbfbd37ebe 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -218,12 +218,12 @@ void GfxFrameout::kernelFrameout() { if (planePicture) { // Show base picture - planePicture->drawSci32Vga(0, planePicture->getSci32celX(0), planePicture->getSci32celY(0), planePictureMirrored); +// planePicture->drawSci32Vga(0, planePicture->getSci32celX(0), planePicture->getSci32celY(0), planePictureMirrored); // Allocate memory for picture cels pictureCels = (FrameoutEntry *)malloc(planePicture->getSci32celCount() * sizeof(FrameoutEntry)); // Add following cels to the itemlist FrameoutEntry *picEntry = pictureCels; - for (int pictureCelNr = 1; pictureCelNr < planePictureCels; pictureCelNr++) { + for (int pictureCelNr = 0; pictureCelNr < planePictureCels; pictureCelNr++) { picEntry->celNo = pictureCelNr; picEntry->object = NULL_REG; picEntry->y = planePicture->getSci32celY(pictureCelNr); @@ -233,7 +233,7 @@ void GfxFrameout::kernelFrameout() { if (_screen->getWidth() > 320) celHeight = celHeight / 2; - picEntry->priority = picEntry->y + celHeight; + picEntry->priority = planePicture->getSci32celPriority(pictureCelNr); // picEntry->y + celHeight; picEntry->y = ((picEntry->y * _screen->getHeight()) / planeResY); picEntry->x = ((picEntry->x * _screen->getWidth()) / planeResX); diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 2b4ceac97b..b1ba656ccd 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -145,6 +145,13 @@ int16 GfxPicture::getSci32celX(int16 celNo) { return READ_LE_UINT16(inbuffer + cel_headerPos + 38); } +int16 GfxPicture::getSci32celPriority(int16 celNo) { + byte *inbuffer = _resource->data; + int header_size = READ_LE_UINT16(inbuffer); + int cel_headerPos = header_size + 42 * celNo; + return READ_LE_UINT16(inbuffer + cel_headerPos + 36); +} + int16 GfxPicture::getSci32celHeight(int16 celNo) { byte *inbuffer = _resource->data; int header_size = READ_LE_UINT16(inbuffer); diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index 571d291442..e684fc6fe1 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -58,6 +58,7 @@ public: int16 getSci32celCount(); int16 getSci32celY(int16 celNo); int16 getSci32celX(int16 celNo); + int16 getSci32celPriority(int16 celNo); int16 getSci32celHeight(int16 celNo); void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored); #endif -- cgit v1.2.3 From 8eca9d6acb55ae121145ca5779c493244a6499f3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 12:38:48 +0000 Subject: SCI: Fixed a bug when loading some saved games (sometimes, the execution stack wasn't cleared properly when loading and you couldn't save or restore) svn-id: r51140 --- engines/sci/engine/savegame.cpp | 1 - engines/sci/engine/vm.cpp | 4 +--- engines/sci/sci.cpp | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 5690969065..c080120d7b 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -805,7 +805,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_msgState = new MessageState(s->_segMan); s->abortScriptProcessing = kAbortLoadGame; - s->shrinkStackToBase(); } bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata *meta) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ada6d8ed92..61cc4c429a 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -934,9 +934,7 @@ void run_vm(EngineState *s) { if (!local_script) error("run_vm(): program counter gone astray (local_script pointer is null)"); - // TODO: Revise this - if (s->abortScriptProcessing != kAbortLoadGame) - s->executionStackBase = s->_executionStack.size() - 1; + s->executionStackBase = s->_executionStack.size() - 1; s->variablesSegment[VAR_TEMP] = s->variablesSegment[VAR_PARAM] = s->_segMan->findSegmentByType(SEG_TYPE_STACK); s->variablesBase[VAR_TEMP] = s->variablesBase[VAR_PARAM] = s->stack_base; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 16984639af..2dfcf076ab 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -414,13 +414,16 @@ void SciEngine::runGame() { exitGame(); if (_gamestate->abortScriptProcessing == kAbortRestartGame) { + _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_segMan->resetSegMan(); initGame(); initStackBaseWithSelector(SELECTOR(play)); _gamestate->gameWasRestarted = true; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { _gamestate->abortScriptProcessing = kAbortNone; + _gamestate->_executionStack.clear(); initStackBaseWithSelector(SELECTOR(replay)); + _gamestate->shrinkStackToBase(); } else { break; // exit loop } -- cgit v1.2.3 From debe58cd3871882caec7188dc51707bf616ffe35 Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 22 Jul 2010 13:19:59 +0000 Subject: SCI: Added workaround for Engine Abort when rummaging in Software Excess bargain bin. svn-id: r51142 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index df9ab979f4..f2b499fc7a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -82,6 +82,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu -- cgit v1.2.3 From ede85a539afae551a0e325b92968c2532bd1d358 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 22 Jul 2010 14:29:00 +0000 Subject: Silence gcc warning svn-id: r51143 --- engines/sci/graphics/frameout.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index bbfbd37ebe..a83611396a 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -128,8 +128,6 @@ void GfxFrameout::kernelFrameout() { // Allocate enough space for all screen items FrameoutEntry *itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); - const SciGameId gameId = g_sci->getGameId(); - for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { reg_t planeObject = *it; uint16 planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); -- cgit v1.2.3 From c1ad4a1110e7f5a9b9e8e88015052cf51abda1a3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 22 Jul 2010 14:33:14 +0000 Subject: Use new[]/delete[] instead of malloc/free svn-id: r51144 --- engines/sci/graphics/frameout.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index a83611396a..71352bb4f9 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -126,7 +126,7 @@ void GfxFrameout::kernelFrameout() { _palette->palVaryUpdate(); // Allocate enough space for all screen items - FrameoutEntry *itemData = (FrameoutEntry *)malloc(_screenItems.size() * sizeof(FrameoutEntry)); + FrameoutEntry *itemData = new FrameoutEntry[_screenItems.size()]; for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { reg_t planeObject = *it; @@ -218,7 +218,7 @@ void GfxFrameout::kernelFrameout() { // Show base picture // planePicture->drawSci32Vga(0, planePicture->getSci32celX(0), planePicture->getSci32celY(0), planePictureMirrored); // Allocate memory for picture cels - pictureCels = (FrameoutEntry *)malloc(planePicture->getSci32celCount() * sizeof(FrameoutEntry)); + pictureCels = new FrameoutEntry[planePicture->getSci32celCount()]; // Add following cels to the itemlist FrameoutEntry *picEntry = pictureCels; for (int pictureCelNr = 0; pictureCelNr < planePictureCels; pictureCelNr++) { @@ -323,13 +323,13 @@ void GfxFrameout::kernelFrameout() { } if (planePicture) { - free(pictureCels); + delete[] pictureCels; delete planePicture; planePicture = 0; } } - free(itemData); + delete[] itemData; _screen->copyToScreen(); } -- cgit v1.2.3 From 6c41ca440509d2f965c71d8fcd0502b4d042d0a6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 14:43:19 +0000 Subject: SCI: Adding workaround for sq4 room 411 kGraph(RestoreBox) is called with an additional parameter svn-id: r51145 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index e4cb90b238..a73a7ef9cd 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -186,7 +186,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, - { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", NULL }, + { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", kGraphRedrawBox_workarounds }, { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires SCI_SUBOPENTRY_TERMINATOR diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index f2b499fc7a..fcad97f7b9 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -139,6 +139,12 @@ const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { + { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 93ffc30e2b..f480fc5f05 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -71,6 +71,7 @@ extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; +extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; -- cgit v1.2.3 From 28bc31a13991b71d7007eaaf82c6f80f09144734 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 15:56:26 +0000 Subject: When modifying variable selectors with argc > 1, don't throw a warning, but use a debugC instead. These are usually typos in the original scripts, and aren't fatal svn-id: r51147 --- engines/sci/engine/vm.cpp | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 61cc4c429a..b1945d1cf4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -541,30 +541,17 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (argc > 1) { // argc can indeed be bigger than 1 in some cases, and it's usually the - // result of a script bug + // result of a script bug. Usually these aren't fatal. const char *objectName = s->_segMan->getObjectName(send_obj); - const SciGameId gameId = g_sci->getGameId(); - - if (gameId == GID_SQ4 && !strcmp(objectName, "Sq4GlobalNarrator") && selector == 606) { - // SQ4 has a script bug in the Sq4GlobalNarrator object when invoking the - // returnVal selector, which doesn't affect gameplay, thus don't diplay it - } else if (gameId == GID_QFG1VGA && !strcmp(objectName, "longSong") && selector == 3) { - // QFG1VGA has a script bug in the longSong object when invoking the - // loop selector, which doesn't affect gameplay, thus don't diplay it - } else if (gameId == GID_CASTLEBRAIN && !strcmp(objectName, "PuzPiece") && selector == 77) { - // Castle of Dr. Brain has a script bug in the PuzPiece object when invoking - // the value selector, which doesn't affect gameplay, thus don't display it - } else { - // Unknown script bug, show it. Usually these aren't fatal. - reg_t oldReg = *varp.getPointer(s->_segMan); - reg_t newReg = argp[1]; - const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); - warning("send_selector(): argc = %d while modifying variable selector " - "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", - argc, selector, selectorName, PRINT_REG(send_obj), - objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); - } + + reg_t oldReg = *varp.getPointer(s->_segMan); + reg_t newReg = argp[1]; + const char *selectorName = g_sci->getKernel()->getSelectorName(selector).c_str(); + debug(2, "send_selector(): argc = %d while modifying variable selector " + "%x (%s) of object %04x:%04x (%s) from %04x:%04x to %04x:%04x", + argc, selector, selectorName, PRINT_REG(send_obj), + objectName, PRINT_REG(oldReg), PRINT_REG(newReg)); } { -- cgit v1.2.3 From b587bf35c8207a71b894d60edba7b30bab84adde Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 16:01:32 +0000 Subject: SCI: changed the comment about the palette merging (it's not a workaround anymore). Also, changed the warning when a picture has a broken palette into debug output - these pictures (which can be found in other games too) are usually meant to be blank, thus don't have a palette svn-id: r51148 --- engines/sci/graphics/palette.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 2eebd57976..73689fe3b2 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -60,12 +60,12 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMergi _sysPaletteChanged = false; - // Pseudo-WORKAROUND - // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest 1 vga and all Nick's Picks - // all use an inbetween interpreter, some parts are SCI1.1, some parts are SCI1 - // It's not using the SCI1.1 palette merging (copying over all the colors) but the real merging - // If we use the copying over, we will get issues because some views have marked all colors as being used - // and those will overwrite the current palette in that case + // Quest for Glory 3 demo, Eco Quest 1 demo, Laura Bow 2 demo, Police Quest + // 1 vga and all Nick's Picks all use the older palette format and thus are + // not using the SCI1.1 palette merging (copying over all the colors) but + // the real merging done in earlier games. If we use the copying over, we + // will get issues because some views have marked all colors as being used + // and those will overwrite the current palette in that case _useMerging = useMerging; palVaryInit(); @@ -106,12 +106,7 @@ void GfxPalette::createFromData(byte *data, int bytesLeft, Palette *paletteOut) if (bytesLeft < 37) { // This happens when loading palette of picture 0 in sq5 - the resource is broken and doesn't contain a full // palette - - if (g_sci->getGameId() == GID_SQ5 && g_sci->getEngineState()->currentRoomNumber() == 110 && bytesLeft == 28) { - // Known case for SQ5, which doesn't affect gameplay, thus don't throw a warning - } else { - warning("GfxPalette::createFromData() - not enough bytes in resource, expected palette header"); - } + debugC(2, "GfxPalette::createFromData() - not enough bytes in resource (%d), expected palette header", bytesLeft); return; } // palette formats in here are not really version exclusive, we can not use sci-version to differentiate between them -- cgit v1.2.3 From 34c8f5dcc5e1b63b1d97e836fdaabc4e9810acce Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 22 Jul 2010 16:12:04 +0000 Subject: SCI: Added another workaround to SQ4 Skate-o-rama area. svn-id: r51149 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fcad97f7b9..f15390a9c3 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -141,6 +141,7 @@ const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { + { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 529af0fc3e4e537d81c3baf445885d87d5dacab1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 16:22:48 +0000 Subject: Extended the "version" console command to also show the game version found in the VERSION file svn-id: r51150 --- engines/sci/console.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 8cbe946e4a..c2db56c40a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -411,6 +411,13 @@ bool Console::cmdGetVersion(int argc, const char **argv) { const char *viewTypeDesc[] = { "Unknown", "EGA", "VGA", "VGA SCI1.1", "Amiga" }; bool hasVocab997 = g_sci->getResMan()->testResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SELECTORS)) ? true : false; + Common::String gameVersion = "N/A"; + + Common::File versionFile; + if (versionFile.open("VERSION")) { + gameVersion = versionFile.readLine(); + versionFile.close(); + } DebugPrintf("Game ID: %s\n", _engine->getGameIdStr()); DebugPrintf("Emulated interpreter version: %s\n", getSciVersionDesc(getSciVersion())); @@ -427,6 +434,7 @@ bool Console::cmdGetVersion(int argc, const char **argv) { DebugPrintf("Resource volume version: %s\n", g_sci->getResMan()->getVolVersionDesc()); DebugPrintf("Resource map version: %s\n", g_sci->getResMan()->getMapVersionDesc()); DebugPrintf("Contains selector vocabulary (vocab.997): %s\n", hasVocab997 ? "yes" : "no"); + DebugPrintf("Game version (VERSION file): %s\n", gameVersion.c_str()); DebugPrintf("\n"); return true; -- cgit v1.2.3 From 756ab24f3203837f1101b995c90d1ebbdb4e54b2 Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 22 Jul 2010 17:12:51 +0000 Subject: SCI: Added remaining workarounds to SQ4 Skate-o-rama area. svn-id: r51151 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index f15390a9c3..f035baf4ed 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -141,6 +141,8 @@ const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { + { GID_SQ4, 405, 405, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From 634d959897695bda9371411ebb9ffda9a09f18d9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 17:25:21 +0000 Subject: SCI: Fixed the crash in LSL2, room 42 (when arriving at the island). kAnimate may refer to unfrozen objects which have been deleted, thus handle that case accordingly. svn-id: r51152 --- engines/sci/engine/seg_manager.cpp | 5 ++++- engines/sci/engine/seg_manager.h | 2 +- engines/sci/graphics/animate.cpp | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index ef2279e492..25cf1d069f 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -508,7 +508,7 @@ List *SegManager::lookupList(reg_t addr) { return &(lt->_table[addr.offset]); } -Node *SegManager::lookupNode(reg_t addr) { +Node *SegManager::lookupNode(reg_t addr, bool stopOnDiscarded) { if (addr.isNull()) return NULL; // Non-error null @@ -522,6 +522,9 @@ Node *SegManager::lookupNode(reg_t addr) { NodeTable *nt = (NodeTable *)_heap[addr.segment]; if (!nt->isValidEntry(addr.offset)) { + if (!stopOnDiscarded) + return NULL; + error("Attempt to use invalid or discarded reference %04x:%04x as list node", PRINT_REG(addr)); return NULL; } diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index a7f5f8517f..e0808dbb1b 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -232,7 +232,7 @@ public: * @param addr The address to resolve * @return The list node referenced, or NULL on error */ - Node *lookupNode(reg_t addr); + Node *lookupNode(reg_t addr, bool stopOnDiscarded = true); // 8. Hunk Memory diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 6fb427500d..d95125e0a8 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -98,8 +98,10 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { if (_s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit()) return true; // Stop processing - // Lookup node again, since the nodetable it was in may have been reallocated - curNode = _s->_segMan->lookupNode(curAddress); + // Lookup node again, since the nodetable it was in may have been reallocated. + // The node might have been deallocated at this point (e.g. LSL2, room 42), + // in which case the node reference will be null and the loop will stop below. + curNode = _s->_segMan->lookupNode(curAddress, false); } if (curNode) { -- cgit v1.2.3 From b4a704c342929c5739a56d35b4035b24330380d0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 17:41:42 +0000 Subject: SCI: allow isSaneNodePointer to handle invalid node references itself svn-id: r51153 --- engines/sci/engine/klists.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 09a04493d6..cfd68e1264 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -34,7 +34,7 @@ static bool isSaneNodePointer(SegManager *segMan, reg_t addr) { reg_t prev = addr; do { - Node *node = segMan->lookupNode(addr); + Node *node = segMan->lookupNode(addr, false); if (!node) { if ((g_sci->getGameId() == GID_ICEMAN) && (g_sci->getEngineState()->currentRoomNumber() == 40)) { -- cgit v1.2.3 From 91e909a25cf056dba37eb6a68bd9ba957cd18175 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 17:53:32 +0000 Subject: SCI: Added a sanity check for rev 51152. If a node has been deleted, it shouldn't have a successor node svn-id: r51154 --- engines/sci/graphics/animate.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index d95125e0a8..229d38c777 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -91,6 +91,8 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); if (!(signal & kSignalFrozen)) { + reg_t nextNode = curNode->succ; + // Call .doit method of that object invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0); @@ -102,6 +104,10 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { // The node might have been deallocated at this point (e.g. LSL2, room 42), // in which case the node reference will be null and the loop will stop below. curNode = _s->_segMan->lookupNode(curAddress, false); + + // Sanity check: If the node has been deleted, it shouldn't have a successor node + if (!curNode && !nextNode.isNull()) + error("kAnimate: list node has been deleted, but it has a successor node"); } if (curNode) { -- cgit v1.2.3 From 50c2fbbb487fac48cfa9e38ae698cb0be6e77cc6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 18:13:05 +0000 Subject: SCI: Also allow checkListPointer() to check the result of lookupNode() itself svn-id: r51156 --- engines/sci/engine/klists.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index cfd68e1264..93e95099f5 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -75,8 +75,8 @@ static void checkListPointer(SegManager *segMan, reg_t addr) { // Empty list is fine } else if (!list->first.isNull() && !list->last.isNull()) { // Normal list - Node *node_a = segMan->lookupNode(list->first); - Node *node_z = segMan->lookupNode(list->last); + Node *node_a = segMan->lookupNode(list->first, false); + Node *node_z = segMan->lookupNode(list->last, false); if (!node_a) { error("checkListPointer (list %04x:%04x): missing first node", PRINT_REG(addr)); -- cgit v1.2.3 From aa15d5fcd10301b1a7f1817df541e5658c7f90da Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 18:14:43 +0000 Subject: SCI: Remove sanity check introduced in rev 51154. When a node is deleted via kDeleteKey, the successor is set to NULL, thus list processing stops (which is what SSCI is doing). svn-id: r51157 --- engines/sci/graphics/animate.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 229d38c777..f2aa4f9479 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -91,8 +91,6 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { signal = readSelectorValue(_s->_segMan, curObject, SELECTOR(signal)); if (!(signal & kSignalFrozen)) { - reg_t nextNode = curNode->succ; - // Call .doit method of that object invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0); @@ -103,11 +101,9 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) { // Lookup node again, since the nodetable it was in may have been reallocated. // The node might have been deallocated at this point (e.g. LSL2, room 42), // in which case the node reference will be null and the loop will stop below. + // If the node is deleted from kDeleteKey, it won't have a successor node, thus + // list processing will stop here (which is what SSCI does). curNode = _s->_segMan->lookupNode(curAddress, false); - - // Sanity check: If the node has been deleted, it shouldn't have a successor node - if (!curNode && !nextNode.isNull()) - error("kAnimate: list node has been deleted, but it has a successor node"); } if (curNode) { -- cgit v1.2.3 From 49c41ab166b66f650f91c5710e5329b300fc433d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 19:20:26 +0000 Subject: SCI: some changes to kFrameout for sci32 cels are now clipped correctly against plane boundaries, nsRect is also set now, fixes some hotspot issues and larry disappearing when going to the left/right of screen svn-id: r51158 --- engines/sci/graphics/frameout.cpp | 95 +++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 29 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 71352bb4f9..db95fadef8 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -148,6 +148,17 @@ void GfxFrameout::kernelFrameout() { planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; + Common::Rect planeClipRect(planeRect.width(), planeRect.height()); + + Common::Rect upscaledPlaneRect = planeRect; + Common::Rect upscaledPlaneClipRect = planeClipRect; + if (_screen->getUpscaledHires()) { + _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.top, upscaledPlaneRect.left); + _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.bottom, upscaledPlaneRect.right); + _screen->adjustToUpscaledCoordinates(upscaledPlaneClipRect.top, upscaledPlaneClipRect.left); + _screen->adjustToUpscaledCoordinates(upscaledPlaneClipRect.bottom, upscaledPlaneClipRect.right); + } + byte planeBack = readSelectorValue(_segMan, planeObject, SELECTOR(back)); if (planeBack) _paint32->fillRect(planeRect, planeBack); @@ -201,11 +212,6 @@ void GfxFrameout::kernelFrameout() { itemEntry->scaleY = readSelectorValue(_segMan, itemObject, SELECTOR(scaleY)); itemEntry->object = itemObject; - itemEntry->y = ((itemEntry->y * _screen->getHeight()) / planeResY); - itemEntry->x = ((itemEntry->x * _screen->getWidth()) / planeResX); - itemEntry->y += planeRect.top; - itemEntry->x += planeRect.left; - itemList.push_back(itemEntry); itemEntry++; itemCount++; @@ -227,14 +233,7 @@ void GfxFrameout::kernelFrameout() { picEntry->y = planePicture->getSci32celY(pictureCelNr); picEntry->x = planePicture->getSci32celX(pictureCelNr); - int16 celHeight = planePicture->getSci32celHeight(pictureCelNr); - if (_screen->getWidth() > 320) - celHeight = celHeight / 2; - - picEntry->priority = planePicture->getSci32celPriority(pictureCelNr); // picEntry->y + celHeight; - - picEntry->y = ((picEntry->y * _screen->getHeight()) / planeResY); - picEntry->x = ((picEntry->x * _screen->getWidth()) / planeResX); + picEntry->priority = planePicture->getSci32celPriority(pictureCelNr); itemList.push_back(picEntry); picEntry++; @@ -252,6 +251,9 @@ void GfxFrameout::kernelFrameout() { if (itemEntry->object.isNull()) { // Picture cel data + itemEntry->y = ((itemEntry->y * _screen->getHeight()) / planeResY); + itemEntry->x = ((itemEntry->x * _screen->getWidth()) / planeResX); + planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planePictureMirrored); // warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); @@ -260,14 +262,46 @@ void GfxFrameout::kernelFrameout() { // warning("view %s %d", _segMan->getObjectName(itemEntry->object), itemEntry->priority); - if (view->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + break; + case SCI_VERSION_2_1: + itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; + itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; + break; + default: + break; + } if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); else view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); + Common::Rect nsRect = itemEntry->celRect; + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left); + _screen->adjustBackUpscaledCoordinates(nsRect.bottom, nsRect.right); + } + break; + case SCI_VERSION_2_1: + nsRect.top = (nsRect.top * planeResY) / _screen->getHeight(); + nsRect.left = (nsRect.left * planeResX) / _screen->getWidth(); + nsRect.bottom = (nsRect.bottom * planeResY) / _screen->getHeight(); + nsRect.right = (nsRect.right * planeResX) / _screen->getWidth(); + break; + default: + break; + } + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsLeft), nsRect.left); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsTop), nsRect.top); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsRight), nsRect.right); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsBottom), nsRect.bottom); + int16 screenHeight = _screen->getHeight(); int16 screenWidth = _screen->getWidth(); if (view->isSci2Hires()) { @@ -275,27 +309,30 @@ void GfxFrameout::kernelFrameout() { screenWidth = _screen->getDisplayWidth(); } - if (itemEntry->celRect.top < 0 || itemEntry->celRect.top >= screenHeight) + if (itemEntry->celRect.bottom < 0 || itemEntry->celRect.top >= screenHeight) continue; - if (itemEntry->celRect.left < 0 || itemEntry->celRect.left >= screenWidth) + if (itemEntry->celRect.right < 0 || itemEntry->celRect.left >= screenWidth) continue; - Common::Rect clipRect; + Common::Rect clipRect, translatedClipRect; clipRect = itemEntry->celRect; if (view->isSci2Hires()) { - Common::Rect upscaledPlaneRect = planeRect; - _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.top, upscaledPlaneRect.left); - _screen->adjustToUpscaledCoordinates(upscaledPlaneRect.bottom, upscaledPlaneRect.right); - clipRect.clip(upscaledPlaneRect); + clipRect.clip(upscaledPlaneClipRect); + translatedClipRect = clipRect; + translatedClipRect.translate(upscaledPlaneRect.left, upscaledPlaneRect.top); } else { - clipRect.clip(planeRect); + clipRect.clip(planeClipRect); + translatedClipRect = clipRect; + translatedClipRect.translate(planeRect.left, planeRect.top); } - if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) - view->draw(itemEntry->celRect, clipRect, clipRect, itemEntry->loopNo, itemEntry->celNo, 255, 0, view->isSci2Hires()); - else - view->drawScaled(itemEntry->celRect, clipRect, clipRect, itemEntry->loopNo, itemEntry->celNo, 255, itemEntry->scaleX, itemEntry->scaleY); + if (!clipRect.isEmpty()) { + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) + view->draw(itemEntry->celRect, clipRect, translatedClipRect, itemEntry->loopNo, itemEntry->celNo, 255, 0, view->isSci2Hires()); + else + view->drawScaled(itemEntry->celRect, clipRect, translatedClipRect, itemEntry->loopNo, itemEntry->celNo, 255, itemEntry->scaleX, itemEntry->scaleY); + } } else { // Most likely a text entry // This draws text the "SCI0-SCI11" way. In SCI2, text is prerendered in kCreateTextBitmap @@ -305,8 +342,8 @@ void GfxFrameout::kernelFrameout() { GfxFont *font = _cache->getFont(readSelectorValue(_segMan, itemEntry->object, SELECTOR(font))); bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); - uint16 curX = itemEntry->x; - uint16 curY = itemEntry->y; + uint16 curX = itemEntry->x + planeRect.left; + uint16 curY = itemEntry->y + planeRect.top; for (uint32 i = 0; i < text.size(); i++) { unsigned char curChar = text[i]; // TODO: proper text splitting... this is a hack -- cgit v1.2.3 From 0848e3dd93034406852cf50423d595d0d50781e7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 19:30:20 +0000 Subject: SCI: doing res correction on text as well "fixes" lsl6 abort intro dialog svn-id: r51159 --- engines/sci/graphics/frameout.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index db95fadef8..04ed0ec739 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -342,6 +342,10 @@ void GfxFrameout::kernelFrameout() { GfxFont *font = _cache->getFont(readSelectorValue(_segMan, itemEntry->object, SELECTOR(font))); bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); + + itemEntry->y = ((itemEntry->y * _screen->getHeight()) / planeResY); + itemEntry->x = ((itemEntry->x * _screen->getWidth()) / planeResX); + uint16 curX = itemEntry->x + planeRect.left; uint16 curY = itemEntry->y + planeRect.top; for (uint32 i = 0; i < text.size(); i++) { -- cgit v1.2.3 From 9b347782ed5946cf04256be549a1c82fa9aa14ce Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 20:11:09 +0000 Subject: Display the MacPlay Gold logo for Macintosh versions which include it. svn-id: r51161 --- engines/kyra/sequences_lok.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index 78e8ded9f7..81f652c25a 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -137,6 +137,14 @@ void KyraEngine_LoK::seq_introLogos() { _screen->fadeToBlack(); if (!_abortIntroFlag) snd_playWanderScoreViaMap(_flags.platform == Common::kPlatformFMTowns ? 57 : 2, 0); + } else if (_flags.platform == Common::kPlatformMacintosh && _res->exists("MP_GOLD.CPS")) { + _screen->loadPalette("MP_GOLD.COL", _screen->getPalette(0)); + _screen->loadBitmap("MP_GOLD.CPS", 3, 3, 0); + _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); + _screen->updateScreen(); + _screen->fadeFromBlack(); + delay(120 * _tickLength); + _screen->fadeToBlack(); } _screen->clearPage(0); -- cgit v1.2.3 From 0e9291e929b61a355013a5abceb9d4a7bf16ff01 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 20:11:53 +0000 Subject: SCI: fixing mirrored sci32 pictures fixes lsl6, also slight cleanup and adding comments about sci32 picture resources svn-id: r51162 --- engines/sci/graphics/picture.cpp | 45 ++++++++++++++++++---------------------- engines/sci/graphics/picture.h | 1 - 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index b1ba656ccd..0b74784143 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -152,22 +152,14 @@ int16 GfxPicture::getSci32celPriority(int16 celNo) { return READ_LE_UINT16(inbuffer + cel_headerPos + 36); } -int16 GfxPicture::getSci32celHeight(int16 celNo) { - byte *inbuffer = _resource->data; - int header_size = READ_LE_UINT16(inbuffer); - int cel_headerPos = header_size + 42 * celNo; - return READ_LE_UINT16(inbuffer + cel_headerPos + 2); -} - void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored) { byte *inbuffer = _resource->data; int size = _resource->size; int header_size = READ_LE_UINT16(inbuffer); int palette_data_ptr = READ_LE_UINT16(inbuffer + 6); - int celCount = inbuffer[2]; +// int celCount = inbuffer[2]; int cel_headerPos = header_size; int cel_RlePos, cel_LiteralPos; -// int cel_relXpos, cel_relYpos; Palette palette; // HACK @@ -175,30 +167,33 @@ void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mi _addToFlag = false; _resourceType = SCI_PICTURE_TYPE_SCI32; - if ((celNo == -1) || (celNo == 0)) { + if (celNo == 0) { // Create palette and set it _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette); _palette->set(&palette, true); } - if (celNo != -1) { - cel_headerPos += 42 * celNo; - celCount = 1; - } - while (celCount > 0) { - cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24); - cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); - //cel_relXpos = READ_LE_UINT16(inbuffer + cel_headerPos + 38); - //cel_relYpos = READ_LE_UINT16(inbuffer + cel_headerPos + 40); + // Header + // [headerSize:WORD] [celCount:BYTE] [Unknown:BYTE] [Unknown:WORD] [paletteOffset:DWORD] [Unknown:DWORD] + // cel-header follow afterwards, each is 42 bytes + // Cel-Header + // [width:WORD] [height:WORD] [displaceX:WORD] [displaceY:WORD] [clearColor:BYTE] [compressed:BYTE] + // offset 10-23 is unknown + // [rleOffset:DWORD] [literalOffset:DWORD] [Unknown:WORD] [Unknown:WORD] [priority:WORD] [relativeXpos:WORD] [relativeYpos:WORD] - // This is really weird, adjusting picture data to plane resolution - why... - //cel_relYpos = ((cel_relYpos * g_sci->_gfxScreen->getHeight()) / planeResY); - //cel_relXpos = ((cel_relXpos * g_sci->_gfxScreen->getWidth()) / planeResX); + cel_headerPos += 42 * celNo; - drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, callerX, callerY); - cel_headerPos += 42; - celCount--; + if (mirrored) { + // switch around relativeXpos + Common::Rect displayArea = _coordAdjuster->pictureGetDisplayArea(); + callerX = displayArea.width() - callerX - READ_LE_UINT16(inbuffer + cel_headerPos + 0); } + + cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24); + cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); + + drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, callerX, callerY); + cel_headerPos += 42; } #endif diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index e684fc6fe1..c3e844fb9b 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -59,7 +59,6 @@ public: int16 getSci32celY(int16 celNo); int16 getSci32celX(int16 celNo); int16 getSci32celPriority(int16 celNo); - int16 getSci32celHeight(int16 celNo); void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored); #endif -- cgit v1.2.3 From 2e1486986728e30d480d73d944059c3fdcb75925 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 20:34:09 +0000 Subject: KYRA: Properly short-circuit after the SC/MP logo on quit. svn-id: r51163 --- engines/kyra/sequences_lok.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index 81f652c25a..ad0cee81d2 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -147,6 +147,9 @@ void KyraEngine_LoK::seq_introLogos() { _screen->fadeToBlack(); } + if (shouldQuit()) + return; + _screen->clearPage(0); if (_flags.platform == Common::kPlatformAmiga) { -- cgit v1.2.3 From 9dcbff72596094e44bea0b59701830b59e92fad9 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 22 Jul 2010 20:38:28 +0000 Subject: SCI: Hopefully fix compilation when ENABLE_SCI32 is not defined svn-id: r51164 --- engines/sci/graphics/compare.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index c019687fc2..c67126bfba 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -132,6 +132,7 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { view = _cache->getView(viewId); +#ifdef ENABLE_SCI32 switch (getSciVersion()) { case SCI_VERSION_2: if (view->isSci2Hires()) @@ -143,9 +144,11 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { default: break; } +#endif view->getCelRect(loopNo, celNo, x, y, z, celRect); +#ifdef ENABLE_SCI32 switch (getSciVersion()) { case SCI_VERSION_2: if (view->isSci2Hires()) { @@ -162,6 +165,7 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { default: break; } +#endif if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) { writeSelectorValue(_segMan, objectReference, SELECTOR(nsLeft), celRect.left); -- cgit v1.2.3 From 665ae8de9d04caa56646d00193b685008125fb1c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 21:06:45 +0000 Subject: SCI: fix signature of kStrCpy disabled workaround for island of dr. brain, seems to work w/o and was probably caused by bad signature svn-id: r51165 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index a73a7ef9cd..8a7de85cbe 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -430,7 +430,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "[r0]r(i)", NULL, kStrCpy_workarounds }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, kStrCpy_workarounds }, { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index f035baf4ed..6e92e43e5e 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -164,7 +164,8 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kStrCpy_workarounds[] = { - { GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle + // seems not to be needed, because the signature was wrong + //{ GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 688416ca3089909a025c0297a6f765bdcb95f8cc Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Thu, 22 Jul 2010 21:13:06 +0000 Subject: SCI: Swap suffix' class_mask result_class Now 'coldly' is correctly recognized as the adverb form of 'cold', and 'attained' as the adjective form of 'attain'. svn-id: r51166 --- engines/sci/parser/vocabulary.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 3b1d9d29df..d6268a26bc 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -203,7 +203,7 @@ bool Vocabulary::loadSuffixes() { suffix.alt_suffix_length = strlen(suffix.alt_suffix); seeker += suffix.alt_suffix_length + 1; // Hit end of string - suffix.class_mask = (int16)READ_BE_UINT16(resource->data + seeker); + suffix.result_class = (int16)READ_BE_UINT16(resource->data + seeker); seeker += 2; // Beginning of next string - skip leading '*' @@ -213,7 +213,7 @@ bool Vocabulary::loadSuffixes() { suffix.word_suffix_length = strlen(suffix.word_suffix); seeker += suffix.word_suffix_length + 1; - suffix.result_class = (int16)READ_BE_UINT16(resource->data + seeker); + suffix.class_mask = (int16)READ_BE_UINT16(resource->data + seeker); seeker += 3; // Next entry _parserSuffixes.push_back(suffix); -- cgit v1.2.3 From 198986b25b948986fda248367b114e3efbf9bd48 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Thu, 22 Jul 2010 21:16:36 +0000 Subject: SCI: Add more parser test cases svn-id: r51167 --- engines/sci/parser/said.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 0bedc15507..208051de97 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -1113,7 +1113,14 @@ True said depth correct & [!*] < 8b1 / 22 True +said depth acknowledged & / 46d , 460 , 44d < 8b1 +True + +said depth confirmed & / 46d , 460 , 44d < 8b1 +True +said depth attained & / 46d , 460 , 44d < 8b1 +True */ -- cgit v1.2.3 From ba47a427b2d8c511a2e9ebbddce28dce0c8d19d8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 21:40:10 +0000 Subject: SCI: sci2+ has a different kSetCursor order fixes gk1 mouse cursor issue thx to wjp svn-id: r51168 --- engines/sci/engine/kgraphics.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 63adcf9ed8..6ca6525aec 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -144,14 +144,19 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxCursor->kernelSetPos(pos); break; case 4: { - int16 top = argv[0].toSint16(); - int16 left = argv[1].toSint16(); - int16 bottom = argv[2].toSint16(); - int16 right = argv[3].toSint16(); - - // In SCI32, the right parameter seems to be divided by 2 - if (getSciVersion() >= SCI_VERSION_2) - right *= 2; + int16 top, left, bottom, right; + + if (getSciVersion() >= SCI_VERSION_2) { + top = argv[1].toSint16(); + left = argv[0].toSint16(); + bottom = argv[3].toSint16(); + right = argv[2].toSint16(); + } else { + top = argv[0].toSint16(); + left = argv[1].toSint16(); + bottom = argv[2].toSint16(); + right = argv[3].toSint16(); + } if ((right >= left) && (bottom >= top)) { Common::Rect rect = Common::Rect(left, top, right, bottom); -- cgit v1.2.3 From f48cb3cbb5dde861c859ee9029dbe3b3d37b824f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 21:45:12 +0000 Subject: KYRA: Remove superfluous palette update on quit. svn-id: r51169 --- engines/kyra/screen.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/engines/kyra/screen.cpp b/engines/kyra/screen.cpp index 7f3959d5fe..ade9886c2e 100644 --- a/engines/kyra/screen.cpp +++ b/engines/kyra/screen.cpp @@ -611,14 +611,6 @@ void Screen::fadePalette(const Palette &pal, int delay, const UpdateFunctor *upF _vm->delay((delayAcc >> 8) * 1000 / 60); delayAcc &= 0xFF; } - - if (_vm->shouldQuit()) { - setScreenPalette(pal); - if (upFunc && upFunc->isValid()) - (*upFunc)(); - else - _system->updateScreen(); - } } void Screen::getFadeParams(const Palette &pal, int delay, int &delayInc, int &diff) { -- cgit v1.2.3 From a3b3febb969912ce8083b43c8c641eb1bd06fc66 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 21:45:33 +0000 Subject: KYRA: Prevent fast fade to black when skipping the intro. svn-id: r51170 --- engines/kyra/sequences_lok.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index ad0cee81d2..5145cdfdf8 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -171,6 +171,7 @@ void KyraEngine_LoK::seq_introLogos() { _screen->fadeFromBlack(); if (_seq->playSequence(_seq_WestwoodLogo, skipFlag()) || shouldQuit()) { + resetSkipFlag(); _screen->fadeToBlack(); _screen->clearPage(0); return; @@ -186,6 +187,7 @@ void KyraEngine_LoK::seq_introLogos() { Screen::FontId of = _screen->setFont(Screen::FID_8_FNT); if ((_seq->playSequence(_seq_KyrandiaLogo, skipFlag()) && !seq_skipSequence()) || shouldQuit()) { + resetSkipFlag(); _screen->fadeToBlack(); _screen->clearPage(0); return; -- cgit v1.2.3 From 9f1c8f149db0c27fa737b4a058a610d36e816e01 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 21:45:55 +0000 Subject: KYRA: Free hand shapes after the Kallak writing sequence. svn-id: r51171 --- engines/kyra/sequences_lok.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index 5145cdfdf8..88c78a6c9e 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -319,6 +319,7 @@ void KyraEngine_LoK::seq_introKallakWriting() { _screen->_charWidth = -2; _screen->clearPage(3); _seq->playSequence(_seq_KallakWriting, true); + _seq->freeHandShapes(); } void KyraEngine_LoK::seq_introKallakMalcolm() { -- cgit v1.2.3 From 4e02acec85a5844def84e8092e543e4e7c710092 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 21:46:17 +0000 Subject: KYRA: Implement proper fade out when skipping the intro at any position. svn-id: r51172 --- engines/kyra/kyra_lok.h | 12 ++++----- engines/kyra/sequences_lok.cpp | 60 ++++++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index c0c9bf06c4..5e32f3fd05 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -132,7 +132,7 @@ public: int _paletteChanged; int16 _northExitHeight; - typedef void (KyraEngine_LoK::*IntroProc)(); + typedef bool (KyraEngine_LoK::*IntroProc)(); // static data access const char * const *seqWSATable() { return _seq_WSATable; } @@ -157,11 +157,11 @@ protected: // -> intro void seq_intro(); - void seq_introLogos(); - void seq_introStory(); - void seq_introMalcolmTree(); - void seq_introKallakWriting(); - void seq_introKallakMalcolm(); + bool seq_introLogos(); + bool seq_introStory(); + bool seq_introMalcolmTree(); + bool seq_introKallakWriting(); + bool seq_introKallakMalcolm(); // -> ingame animations void seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly); diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index 88c78a6c9e..8bdd85fea4 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -114,8 +114,13 @@ void KyraEngine_LoK::seq_intro() { snd_playTheme(0, 2); _text->setTalkCoords(144); - for (int i = 0; i < ARRAYSIZE(introProcTable) && !seq_skipSequence(); ++i) - (this->*introProcTable[i])(); + for (int i = 0; i < ARRAYSIZE(introProcTable) && !seq_skipSequence(); ++i) { + if ((this->*introProcTable[i])() && !shouldQuit()) { + resetSkipFlag(); + _screen->fadeToBlack(); + _screen->clearPage(0); + } + } _text->setTalkCoords(136); delay(30 * _tickLength); @@ -127,7 +132,7 @@ void KyraEngine_LoK::seq_intro() { _res->unloadPakFile("INTRO.VRM"); } -void KyraEngine_LoK::seq_introLogos() { +bool KyraEngine_LoK::seq_introLogos() { if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) { _screen->loadBitmap("LOGO.CPS", 3, 3, &_screen->getPalette(0)); _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); @@ -147,8 +152,8 @@ void KyraEngine_LoK::seq_introLogos() { _screen->fadeToBlack(); } - if (shouldQuit()) - return; + if (_abortIntroFlag || shouldQuit()) + return false; _screen->clearPage(0); @@ -170,12 +175,8 @@ void KyraEngine_LoK::seq_introLogos() { _screen->updateScreen(); _screen->fadeFromBlack(); - if (_seq->playSequence(_seq_WestwoodLogo, skipFlag()) || shouldQuit()) { - resetSkipFlag(); - _screen->fadeToBlack(); - _screen->clearPage(0); - return; - } + if (_seq->playSequence(_seq_WestwoodLogo, skipFlag()) || shouldQuit()) + return true; delay(60 * _tickLength); @@ -186,17 +187,14 @@ void KyraEngine_LoK::seq_introLogos() { Screen::FontId of = _screen->setFont(Screen::FID_8_FNT); - if ((_seq->playSequence(_seq_KyrandiaLogo, skipFlag()) && !seq_skipSequence()) || shouldQuit()) { - resetSkipFlag(); - _screen->fadeToBlack(); - _screen->clearPage(0); - return; - } + if (_seq->playSequence(_seq_KyrandiaLogo, skipFlag()) || shouldQuit()) + return true; + _screen->setFont(of); _screen->fillRect(0, 179, 319, 199, 0); if (shouldQuit()) - return; + return false; if (_flags.platform == Common::kPlatformAmiga) { _screen->copyPalette(0, 2); @@ -238,20 +236,20 @@ void KyraEngine_LoK::seq_introLogos() { } while (!doneFlag && !shouldQuit() && !_abortIntroFlag); } - if (shouldQuit()) - return; + if (_abortIntroFlag || shouldQuit()) + return true; - _seq->playSequence(_seq_Forest, true); + return _seq->playSequence(_seq_Forest, true); } -void KyraEngine_LoK::seq_introStory() { +bool KyraEngine_LoK::seq_introStory() { _screen->clearPage(3); _screen->clearPage(0); // HACK: The Italian fan translation uses an special text screen here // so we show it even when text is disabled if (!textEnabled() && speechEnabled() && _flags.lang != Common::IT_ITA) - return; + return false; if ((_flags.lang == Common::EN_ANY && !_flags.isTalkie && _flags.platform == Common::kPlatformPC) || _flags.platform == Common::kPlatformAmiga) _screen->loadBitmap("TEXT.CPS", 3, 3, &_screen->getPalette(0)); @@ -305,26 +303,30 @@ void KyraEngine_LoK::seq_introStory() { _screen->updateScreen(); delay(360 * _tickLength); + + return _abortIntroFlag; } -void KyraEngine_LoK::seq_introMalcolmTree() { +bool KyraEngine_LoK::seq_introMalcolmTree() { _screen->_curPage = 0; _screen->clearPage(3); - _seq->playSequence(_seq_MalcolmTree, true); + return _seq->playSequence(_seq_MalcolmTree, true); } -void KyraEngine_LoK::seq_introKallakWriting() { +bool KyraEngine_LoK::seq_introKallakWriting() { _seq->makeHandShapes(); _screen->setAnimBlockPtr(5060); _screen->_charWidth = -2; _screen->clearPage(3); - _seq->playSequence(_seq_KallakWriting, true); + const bool skipped = _seq->playSequence(_seq_KallakWriting, true); _seq->freeHandShapes(); + + return skipped; } -void KyraEngine_LoK::seq_introKallakMalcolm() { +bool KyraEngine_LoK::seq_introKallakMalcolm() { _screen->clearPage(3); - _seq->playSequence(_seq_KallakMalcolm, true); + return _seq->playSequence(_seq_KallakMalcolm, true); } void KyraEngine_LoK::seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly) { -- cgit v1.2.3 From d77649828237a71f383b791f9ae87c17c8cc67bc Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 21:46:39 +0000 Subject: KYRA: Cleanup. svn-id: r51173 --- engines/kyra/kyra_lok.h | 1 + engines/kyra/sequences_lok.cpp | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index 5e32f3fd05..239ca26a11 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -157,6 +157,7 @@ protected: // -> intro void seq_intro(); + bool seq_introPublisherLogos(); bool seq_introLogos(); bool seq_introStory(); bool seq_introMalcolmTree(); diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index 8bdd85fea4..c4bdc29f57 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -93,6 +93,7 @@ void KyraEngine_LoK::seq_intro() { _res->loadPakFile("INTRO.VRM"); static const IntroProc introProcTable[] = { + &KyraEngine_LoK::seq_introPublisherLogos, &KyraEngine_LoK::seq_introLogos, &KyraEngine_LoK::seq_introStory, &KyraEngine_LoK::seq_introMalcolmTree, @@ -132,16 +133,17 @@ void KyraEngine_LoK::seq_intro() { _res->unloadPakFile("INTRO.VRM"); } -bool KyraEngine_LoK::seq_introLogos() { +bool KyraEngine_LoK::seq_introPublisherLogos() { if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) { _screen->loadBitmap("LOGO.CPS", 3, 3, &_screen->getPalette(0)); _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0); _screen->updateScreen(); _screen->fadeFromBlack(); delay(90 * _tickLength); - _screen->fadeToBlack(); - if (!_abortIntroFlag) + if (!_abortIntroFlag) { + _screen->fadeToBlack(); snd_playWanderScoreViaMap(_flags.platform == Common::kPlatformFMTowns ? 57 : 2, 0); + } } else if (_flags.platform == Common::kPlatformMacintosh && _res->exists("MP_GOLD.CPS")) { _screen->loadPalette("MP_GOLD.COL", _screen->getPalette(0)); _screen->loadBitmap("MP_GOLD.CPS", 3, 3, 0); @@ -149,12 +151,14 @@ bool KyraEngine_LoK::seq_introLogos() { _screen->updateScreen(); _screen->fadeFromBlack(); delay(120 * _tickLength); - _screen->fadeToBlack(); + if (!_abortIntroFlag) + _screen->fadeToBlack(); } - if (_abortIntroFlag || shouldQuit()) - return false; + return _abortIntroFlag; +} +bool KyraEngine_LoK::seq_introLogos() { _screen->clearPage(0); if (_flags.platform == Common::kPlatformAmiga) { -- cgit v1.2.3 From d2ab37529e141fcedf0fb855c00ba66dab979e6c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 21:55:45 +0000 Subject: SCI: kSetCursor change for sci32 we use the movezone like any other rect, but sierra sci actually specifies bottom/right as being the last possible coordinates svn-id: r51174 --- engines/sci/engine/kgraphics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6ca6525aec..299a4f5c81 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -149,12 +149,12 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { if (getSciVersion() >= SCI_VERSION_2) { top = argv[1].toSint16(); left = argv[0].toSint16(); - bottom = argv[3].toSint16(); - right = argv[2].toSint16(); + bottom = argv[3].toSint16() + 1; // bottom/right needs to get included in our movezone + right = argv[2].toSint16() + 1; } else { top = argv[0].toSint16(); left = argv[1].toSint16(); - bottom = argv[2].toSint16(); + bottom = argv[2].toSint16(); // TODO: check if sci16 behaved the same as sci32 right = argv[3].toSint16(); } -- cgit v1.2.3 From 7fb37db81ea56f35251a189ace9dcee964d74c36 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 22:00:46 +0000 Subject: KYRA: Move LoL specific static data to its own file. svn-id: r51175 --- engines/kyra/module.mk | 1 + engines/kyra/staticres.cpp | 862 ---------------------------------------- engines/kyra/staticres_lol.cpp | 882 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 883 insertions(+), 862 deletions(-) create mode 100644 engines/kyra/staticres_lol.cpp diff --git a/engines/kyra/module.mk b/engines/kyra/module.mk index b9006431d7..4708041cf7 100644 --- a/engines/kyra/module.mk +++ b/engines/kyra/module.mk @@ -84,6 +84,7 @@ MODULE_OBJS += \ sequences_lol.o \ sound_lol.o \ sprites_lol.o \ + staticres_lol.o \ text_lol.o \ timer_lol.o endif diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 2f2acd78d1..9ad2f50619 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -27,18 +27,15 @@ #include "common/md5.h" #include "kyra/kyra_v1.h" #include "kyra/kyra_lok.h" -#include "kyra/lol.h" #include "kyra/kyra_v2.h" #include "kyra/kyra_hof.h" #include "kyra/kyra_mr.h" #include "kyra/screen.h" #include "kyra/screen_lok.h" -#include "kyra/screen_lol.h" #include "kyra/screen_hof.h" #include "kyra/screen_mr.h" #include "kyra/resource.h" #include "kyra/gui_lok.h" -#include "kyra/gui_lol.h" #include "kyra/gui_hof.h" #include "kyra/gui_mr.h" #include "kyra/sound_intern.h" @@ -305,36 +302,6 @@ const ItemAnimData_v2 *StaticResource::loadShapeAnimData_v2(int id, int &entries return (const ItemAnimData_v2 *)getData(id, k2ShpAnimDataV2, entries); } -#ifdef ENABLE_LOL -const LoLCharacter *StaticResource::loadCharData(int id, int &entries) { - return (const LoLCharacter *)getData(id, kLolCharData, entries); -} - -const SpellProperty *StaticResource::loadSpellData(int id, int &entries) { - return (const SpellProperty *)getData(id, kLolSpellData, entries); -} - -const CompassDef *StaticResource::loadCompassData(int id, int &entries) { - return (const CompassDef *)getData(id, kLolCompassData, entries); -} - -const FlyingObjectShape *StaticResource::loadFlyingObjectData(int id, int &entries) { - return (const FlyingObjectShape *)getData(id, kLolFlightShpData, entries); -} - -const uint16 *StaticResource::loadRawDataBe16(int id, int &entries) { - return (const uint16 *)getData(id, kLolRawDataBe16, entries); -} - -const uint32 *StaticResource::loadRawDataBe32(int id, int &entries) { - return (const uint32 *)getData(id, kLolRawDataBe32, entries); -} - -const ButtonDef *StaticResource::loadButtonDefs(int id, int &entries) { - return (const ButtonDef *)getData(id, kLolButtonData, entries); -} -#endif // ENABLE_LOL - bool StaticResource::prefetchId(int id) { if (id == -1) { for (DataMap::const_iterator i = _dataTable.begin(); i != _dataTable.end(); ++i) { @@ -641,160 +608,6 @@ bool StaticResource::loadShapeAnimData_v2(Common::SeekableReadStream &stream, vo return true; } -#ifdef ENABLE_LOL -bool StaticResource::loadCharData(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() / 130; - LoLCharacter *charData = new LoLCharacter[size]; - - for (int i = 0; i < size; i++) { - LoLCharacter *t = &charData[i]; - - t->flags = stream.readUint16LE(); - stream.read(t->name, 11); - t->raceClassSex = stream.readByte(); - t->id = stream.readSint16LE(); - t->curFaceFrame = stream.readByte(); - t->tempFaceFrame = stream.readByte(); - t->screamSfx = stream.readByte(); - stream.readUint32LE(); - for (int ii = 0; ii < 8; ii++) - t->itemsMight[ii] = stream.readUint16LE(); - for (int ii = 0; ii < 8; ii++) - t->protectionAgainstItems[ii] = stream.readUint16LE(); - t->itemProtection = stream.readUint16LE(); - t->hitPointsCur = stream.readSint16LE(); - t->hitPointsMax = stream.readUint16LE(); - t->magicPointsCur = stream.readSint16LE(); - t->magicPointsMax = stream.readUint16LE(); - t->field_41 = stream.readByte(); - t->damageSuffered = stream.readUint16LE(); - t->weaponHit = stream.readUint16LE(); - t->totalMightModifier = stream.readUint16LE(); - t->totalProtectionModifier = stream.readUint16LE(); - t->might = stream.readUint16LE(); - t->protection = stream.readUint16LE(); - t->nextAnimUpdateCountdown = stream.readSint16LE(); - for (int ii = 0; ii < 11; ii++) - t->items[ii] = stream.readUint16LE(); - for (int ii = 0; ii < 3; ii++) - t->skillLevels[ii] = stream.readByte(); - for (int ii = 0; ii < 3; ii++) - t->skillModifiers[ii] = stream.readByte(); - for (int ii = 0; ii < 3; ii++) - t->experiencePts[ii] = stream.readUint32LE(); - for (int ii = 0; ii < 5; ii++) - t->characterUpdateEvents[ii] = stream.readByte(); - for (int ii = 0; ii < 5; ii++) - t->characterUpdateDelay[ii] = stream.readByte(); - }; - - ptr = charData; - return true; -} - -bool StaticResource::loadSpellData(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() / 28; - SpellProperty *spellData = new SpellProperty[size]; - - for (int i = 0; i < size; i++) { - SpellProperty *t = &spellData[i]; - - t->spellNameCode = stream.readUint16LE(); - for (int ii = 0; ii < 4; ii++) - t->mpRequired[ii] = stream.readUint16LE(); - t->field_a = stream.readUint16LE(); - t->field_c = stream.readUint16LE(); - for (int ii = 0; ii < 4; ii++) - t->hpRequired[ii] = stream.readUint16LE(); - t->field_16 = stream.readUint16LE(); - t->field_18 = stream.readUint16LE(); - t->flags = stream.readUint16LE(); - }; - - ptr = spellData; - return true; -} - -bool StaticResource::loadCompassData(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() / 4; - CompassDef *defs = new CompassDef[size]; - - for (int i = 0; i < size; i++) { - CompassDef *t = &defs[i]; - t->shapeIndex = stream.readByte(); - t->x = stream.readByte(); - t->y = stream.readByte(); - t->flags = stream.readByte(); - }; - - - ptr = defs; - return true; -} - -bool StaticResource::loadFlyingObjectData(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() / 5; - FlyingObjectShape *defs = new FlyingObjectShape[size]; - - for (int i = 0; i < size; i++) { - FlyingObjectShape *t = &defs[i]; - t->shapeFront = stream.readByte(); - t->shapeBack = stream.readByte(); - t->shapeLeft = stream.readByte(); - t->drawFlags = stream.readByte(); - t->flipFlags = stream.readByte(); - }; - - ptr = defs; - return true; -} - -bool StaticResource::loadRawDataBe16(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() >> 1; - - uint16 *r = new uint16[size]; - - for (int i = 0; i < size; i++) - r[i] = stream.readUint16BE(); - - ptr = r; - return true; -} - -bool StaticResource::loadRawDataBe32(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() >> 2; - - uint32 *r = new uint32[size]; - - for (int i = 0; i < size; i++) - r[i] = stream.readUint32BE(); - - ptr = r; - return true; -} - -bool StaticResource::loadButtonDefs(Common::SeekableReadStream &stream, void *&ptr, int &size) { - size = stream.size() / 18; - - ButtonDef *r = new ButtonDef[size]; - - for (int i = 0; i < size; i++) { - r[i].buttonflags = stream.readUint16BE(); - r[i].keyCode = stream.readUint16BE(); - r[i].keyCode2 = stream.readUint16BE(); - r[i].x = stream.readSint16BE(); - r[i].y = stream.readSint16BE(); - r[i].w = stream.readUint16BE(); - r[i].h = stream.readUint16BE(); - r[i].index = stream.readUint16BE(); - r[i].screenDim = stream.readUint16BE(); - } - - ptr = r; - return true; -} -#endif // ENABLE_LOL - void StaticResource::freeRawData(void *&ptr, int &size) { uint8 *data = (uint8 *)ptr; delete[] data; @@ -870,58 +683,6 @@ void StaticResource::freeHofShapeAnimDataV2(void *&ptr, int &size) { size = 0; } -#ifdef ENABLE_LOL -void StaticResource::freeCharData(void *&ptr, int &size) { - LoLCharacter *d = (LoLCharacter *)ptr; - delete[] d; - ptr = 0; - size = 0; -} - -void StaticResource::freeSpellData(void *&ptr, int &size) { - SpellProperty *d = (SpellProperty *)ptr; - delete[] d; - ptr = 0; - size = 0; -} - -void StaticResource::freeCompassData(void *&ptr, int &size) { - CompassDef *d = (CompassDef *)ptr; - delete[] d; - ptr = 0; - size = 0; -} - -void StaticResource::freeFlyingObjectData(void *&ptr, int &size) { - FlyingObjectShape *d = (FlyingObjectShape *)ptr; - delete[] d; - ptr = 0; - size = 0; -} - - -void StaticResource::freeRawDataBe16(void *&ptr, int &size) { - uint16 *data = (uint16 *)ptr; - delete[] data; - ptr = 0; - size = 0; -} - -void StaticResource::freeRawDataBe32(void *&ptr, int &size) { - uint32 *data = (uint32 *)ptr; - delete[] data; - ptr = 0; - size = 0; -} - -void StaticResource::freeButtonDefs(void *&ptr, int &size) { - ButtonDef *d = (ButtonDef *)ptr; - delete[] d; - ptr = 0; - size = 0; -} -#endif // ENABLE_LOL - #pragma mark - void KyraEngine_LoK::initStaticResource() { @@ -1360,371 +1121,6 @@ void KyraEngine_MR::initStaticResource() { _itemStringMap = _staticres->loadRawData(k3ItemStringMap, _itemStringMapSize); } -#ifdef ENABLE_LOL -// TODO: move this to lol.cpp maybe? -void LoLEngine::initStaticResource() { - // assign music data - static const char *pcMusicFileListIntro[] = { "LOREINTR" }; - static const char *pcMusicFileListFinale[] = { "LOREFINL" }; - static const char *pcMusicFileListIngame[] = { "LORE%02d%c" }; - - static const char *pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; - static const char *pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; - static const char *pc98MusicFileListIngame[] = { "lore%02d.86" }; - - memset(_soundData, 0, sizeof(_soundData)); - if (_flags.platform == Common::kPlatformPC) { - _soundData[0].fileList = pcMusicFileListIntro; - _soundData[0].fileListLen = ARRAYSIZE(pcMusicFileListIntro); - _soundData[1].fileList = pcMusicFileListIngame; - _soundData[1].fileListLen = ARRAYSIZE(pcMusicFileListIngame); - _soundData[2].fileList = pcMusicFileListFinale; - _soundData[2].fileListLen = ARRAYSIZE(pcMusicFileListFinale); - } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = pc98MusicFileListIntro; - _soundData[0].fileListLen = ARRAYSIZE(pc98MusicFileListIntro); - _soundData[1].fileList = pc98MusicFileListIngame; - _soundData[1].fileListLen = ARRAYSIZE(pc98MusicFileListIngame); - _soundData[2].fileList = pc98MusicFileListFinale; - _soundData[2].fileListLen = ARRAYSIZE(pc98MusicFileListFinale); - } - - if (_flags.isDemo) - return; - - _pakFileList = _staticres->loadStrings(kLolIngamePakFiles, _pakFileListSize); - _charDefaults = _staticres->loadCharData(kLolCharacterDefs, _charDefaultsSize); - _ingameSoundIndex = (const uint16 *)_staticres->loadRawData(kLolIngameSfxIndex, _ingameSoundIndexSize); - _musicTrackMap = _staticres->loadRawData(kLolMusicTrackMap, _musicTrackMapSize); - _ingameGMSoundIndex = _staticres->loadRawData(kLolIngameGMSfxIndex, _ingameGMSoundIndexSize); - _ingameMT32SoundIndex = _staticres->loadRawData(kLolIngameMT32SfxIndex, _ingameMT32SoundIndexSize); - _ingamePCSpeakerSoundIndex = _staticres->loadRawData(kLolIngamePcSpkSfxIndex, _ingamePCSpeakerSoundIndexSize); - _spellProperties = _staticres->loadSpellData(kLolSpellProperties, _spellPropertiesSize); - _gameShapeMap = (const int8 *)_staticres->loadRawData(kLolGameShapeMap, _gameShapeMapSize); - _sceneItemOffs = (const int8 *)_staticres->loadRawData(kLolSceneItemOffs, _sceneItemOffsSize); - _charInvIndex = _staticres->loadRawData(kLolCharInvIndex, _charInvIndexSize); - _charInvDefs = _staticres->loadRawData(kLolCharInvDefs, _charInvDefsSize); - _charDefsMan = _staticres->loadRawDataBe16(kLolCharDefsMan, _charDefsManSize); - _charDefsWoman = _staticres->loadRawDataBe16(kLolCharDefsWoman, _charDefsWomanSize); - _charDefsKieran = _staticres->loadRawDataBe16(kLolCharDefsKieran, _charDefsKieranSize); - _charDefsAkshel = _staticres->loadRawDataBe16(kLolCharDefsAkshel, _charDefsAkshelSize); - _expRequirements = (const int32 *)_staticres->loadRawDataBe32(kLolExpRequirements, _expRequirementsSize); - _monsterModifiers = _staticres->loadRawDataBe16(kLolMonsterModifiers, _monsterModifiersSize); - _monsterShiftOffs = (const int8 *)_staticres->loadRawData(kLolMonsterShiftOffsets, _monsterShiftOffsSize); - _monsterDirFlags = _staticres->loadRawData(kLolMonsterDirFlags, _monsterDirFlagsSize); - _monsterScaleX = _staticres->loadRawData(kLolMonsterScaleX, _monsterScaleXSize); - _monsterScaleY = _staticres->loadRawData(kLolMonsterScaleY, _monsterScaleYSize); - _monsterScaleWH = _staticres->loadRawDataBe16(kLolMonsterScaleWH, _monsterScaleWHSize); - _inventorySlotDesc = _staticres->loadRawDataBe16(kLolInventoryDesc, _inventorySlotDescSize); - _levelShpList = _staticres->loadStrings(kLolLevelShpList, _levelShpListSize); - _levelDatList = _staticres->loadStrings(kLolLevelDatList, _levelDatListSize); - _compassDefs = _staticres->loadCompassData(kLolCompassDefs, _compassDefsSize); - _flyingItemShapes = _staticres->loadFlyingObjectData(kLolFlyingObjectShp, _flyingItemShapesSize); - _itemCost = _staticres->loadRawDataBe16(kLolItemPrices, _itemCostSize); - _stashSetupData = _staticres->loadRawData(kLolStashSetup, _stashSetupDataSize); - - _dscUnk1 = (const int8 *)_staticres->loadRawData(kLolDscUnk1, _dscUnk1Size); - _dscShapeIndex = (const int8 *)_staticres->loadRawData(kLolDscShapeIndex, _dscShapeIndexSize); - _dscOvlMap = _staticres->loadRawData(kLolDscOvlMap, _dscOvlMapSize); - _dscShapeScaleW = _staticres->loadRawDataBe16(kLolDscScaleWidthData, _dscShapeScaleWSize); - _dscShapeScaleH = _staticres->loadRawDataBe16(kLolDscScaleHeightData, _dscShapeScaleHSize); - _dscShapeX = (const int16 *)_staticres->loadRawDataBe16(kLolDscX, _dscShapeXSize); - _dscShapeY = (const int8 *)_staticres->loadRawData(kLolDscY, _dscShapeYSize); - _dscTileIndex = _staticres->loadRawData(kLolDscTileIndex, _dscTileIndexSize); - _dscUnk2 = _staticres->loadRawData(kLolDscUnk2, _dscUnk2Size); - _dscDoorShpIndex = _staticres->loadRawData(kLolDscDoorShapeIndex, _dscDoorShpIndexSize); - _dscDim1 = (const int8 *)_staticres->loadRawData(kLolDscDimData1, _dscDim1Size); - _dscDim2 = (const int8 *)_staticres->loadRawData(kLolDscDimData2, _dscDim2Size); - _dscBlockMap = _staticres->loadRawData(kLolDscBlockMap, _dscBlockMapSize); - _dscDimMap = _staticres->loadRawData(kLolDscDimMap, _dscDimMapSize); - _dscDoorMonsterScaleTable = _staticres->loadRawDataBe16(kLolDscDoorScale, _dscDoorMonsterScaleTableSize); - _dscShapeOvlIndex = _staticres->loadRawData(kLolDscOvlIndex, _dscShapeOvlIndexSize); - _dscDoor4 = _staticres->loadRawDataBe16(kLolDscDoor4, _dscDoor4Size); - _dscBlockIndex = (const int8 *)_staticres->loadRawData(kLolDscBlockIndex, _dscBlockIndexSize); - _dscDoor1 = _staticres->loadRawData(kLolDscDoor1, _dscDoor1Size); - _dscDoorMonsterX = (const int16 *)_staticres->loadRawDataBe16(kLolDscDoorX, _dscDoorMonsterXSize); - _dscDoorMonsterY = (const int16 *)_staticres->loadRawDataBe16(kLolDscDoorY, _dscDoorMonsterYSize); - - _scrollXTop = _staticres->loadRawData(kLolScrollXTop, _scrollXTopSize); - _scrollYTop = _staticres->loadRawData(kLolScrollYTop, _scrollYTopSize); - _scrollXBottom = _staticres->loadRawData(kLolScrollXBottom, _scrollXBottomSize); - _scrollYBottom = _staticres->loadRawData(kLolScrollYBottom, _scrollYBottomSize); - - const char *const *tmpSndList = _staticres->loadStrings(kLolIngameSfxFiles, _ingameSoundListSize); - if (tmpSndList) { - _ingameSoundList = new char *[_ingameSoundListSize]; - for (int i = 0; i < _ingameSoundListSize; i++) { - _ingameSoundList[i] = new char[strlen(tmpSndList[i]) + 1]; - strcpy(_ingameSoundList[i], tmpSndList[i]); - } - _staticres->unloadId(kLolIngameSfxFiles); - } - - _buttonData = _staticres->loadButtonDefs(kLolButtonDefs, _buttonDataSize); - _buttonList1 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList1, _buttonList1Size); - _buttonList2 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList2, _buttonList2Size); - _buttonList3 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList3, _buttonList3Size); - _buttonList4 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList4, _buttonList4Size); - _buttonList5 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList5, _buttonList5Size); - _buttonList6 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList6, _buttonList6Size); - _buttonList7 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList7, _buttonList7Size); - _buttonList8 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList8, _buttonList8Size); - - _autoMapStrings = _staticres->loadRawDataBe16(kLolMapStringId, _autoMapStringsSize); - - int tmpSize = 0; - const uint8 *tmp = _staticres->loadRawData(kLolLegendData, tmpSize); - tmpSize /= 5; - if (tmp) { - _defaultLegendData = new MapLegendData[tmpSize]; - for (int i = 0; i < tmpSize; i++) { - _defaultLegendData[i].shapeIndex = *tmp++; - _defaultLegendData[i].enable = *tmp++ ? true : false; - _defaultLegendData[i].x = (int8)*tmp++; - _defaultLegendData[i].stringId = READ_LE_UINT16(tmp); - tmp += 2; - } - _staticres->unloadId(kLolLegendData); - } - - tmp = _staticres->loadRawData(kLolMapCursorOvl, tmpSize); - _mapCursorOverlay = new uint8[tmpSize]; - memcpy(_mapCursorOverlay, tmp, tmpSize); - _staticres->unloadId(kLolMapCursorOvl); - - _updateSpellBookCoords = _staticres->loadRawData(kLolSpellbookCoords, _updateSpellBookCoordsSize); - _updateSpellBookAnimData = _staticres->loadRawData(kLolSpellbookAnim, _updateSpellBookAnimDataSize); - _healShapeFrames = _staticres->loadRawData(kLolHealShapeFrames, _healShapeFramesSize); - - tmp = _staticres->loadRawData(kLolLightningDefs, tmpSize); - if (tmp) { - _lightningProps = new LightningProperty[5]; - for (int i = 0; i < 5; i++) { - _lightningProps[i].lastFrame = tmp[i << 2]; - _lightningProps[i].frameDiv = tmp[(i << 2) + 1]; - _lightningProps[i].sfxId = READ_LE_UINT16(&tmp[(i << 2) + 2]); - } - _staticres->unloadId(kLolLightningDefs); - } - - _fireBallCoords = (const int16 *)_staticres->loadRawDataBe16(kLolFireballCoords, _fireBallCoordsSize); - - _buttonCallbacks.clear(); - _buttonCallbacks.reserve(95); -#define cb(x) _buttonCallbacks.push_back(BUTTON_FUNCTOR(LoLEngine, this, &LoLEngine::x)) - // 0x00 - cb(clickedUpArrow); - cb(clickedDownArrow); - _buttonCallbacks.push_back(_buttonCallbacks[1]); - cb(clickedLeftArrow); - - // 0x04 - cb(clickedRightArrow); - cb(clickedTurnLeftArrow); - cb(clickedTurnRightArrow); - cb(clickedAttackButton); - - // 0x08 - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[7]); - cb(clickedMagicButton); - - // 0x0C - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[11]); - cb(clickedMagicSubmenu); - - // 0x10 - cb(clickedScreen); - cb(clickedPortraitLeft); - for (int i = 0; i < 7; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[17]); - - // 0x19 - cb(clickedLiveMagicBarsLeft); - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[25]); - - // 0x1D - cb(clickedPortraitEtcRight); - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[29]); - - // 0x21 - cb(clickedCharInventorySlot); - for (int i = 0; i < 10; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[33]); - - // 0x2C - cb(clickedExitCharInventory); - cb(clickedSceneDropItem); - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[45]); - - // 0x31 - cb(clickedScenePickupItem); - cb(clickedInventorySlot); - for (int i = 0; i < 9; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[50]); - - // 0x3C - cb(clickedInventoryScroll); - cb(clickedInventoryScroll); - cb(clickedWall); - _buttonCallbacks.push_back(_buttonCallbacks[62]); - - // 0x40 - cb(clickedSequenceWindow); - _buttonCallbacks.push_back(_buttonCallbacks[0]); - _buttonCallbacks.push_back(_buttonCallbacks[1]); - _buttonCallbacks.push_back(_buttonCallbacks[3]); - - // 0x44 - _buttonCallbacks.push_back(_buttonCallbacks[4]); - _buttonCallbacks.push_back(_buttonCallbacks[5]); - _buttonCallbacks.push_back(_buttonCallbacks[6]); - cb(clickedScroll); - - // 0x48 - for (int i = 0; i < 9; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[71]); - - // 0x51 - cb(clickedSpellTargetCharacter); - for (int i = 0; i < 3; ++i) - _buttonCallbacks.push_back(_buttonCallbacks[81]); - - // 0x55 - cb(clickedSpellTargetScene); - cb(clickedSceneThrowItem); - _buttonCallbacks.push_back(_buttonCallbacks[86]); - - // 0x58 - cb(clickedOptions); - cb(clickedRestParty); - cb(clickedMoneyBox); - cb(clickedCompass); - - // 0x5C - cb(clickedAutomap); - cb(clickedLamp); - cb(clickedStatusIcon); -#undef cb -} - -void GUI_LoL::initStaticData() { - GUI_V2_BUTTON(_scrollUpButton, 20, 96, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); - GUI_V2_BUTTON(_scrollDownButton, 21, 98, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); - - for (uint i = 0; i < ARRAYSIZE(_menuButtons); ++i) - GUI_V2_BUTTON(_menuButtons[i], i, 0, 0, 0, 0, 0, 0x4487, 0, 0, 0, 0, 0, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); - - if (_vm->gameFlags().isTalkie) - GUI_LOL_MENU(_mainMenu, 9, 0x4000, 0, 7, -1, -1, -1, -1); - else - GUI_LOL_MENU(_mainMenu, 17, 0x4000, 0, 6, -1, -1, -1, -1); - - GUI_LOL_MENU_ITEM(_mainMenu.item[0], 0x4001, 16, 23, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[1], 0x4002, 16, 40, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[2], 0x4003, 16, 57, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[3], 0x4004, 16, 74, 176, 15, 0, 0); - - if (_vm->gameFlags().isTalkie) { - GUI_LOL_MENU_ITEM(_mainMenu.item[4], 0x42D9, 16, 91, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[5], 0x4006, 16, 108, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[6], 0x4005, 88, 127, 104, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - } else { - GUI_LOL_MENU_ITEM(_mainMenu.item[4], 0x4006, 16, 91, 176, 15, 0, 0); - GUI_LOL_MENU_ITEM(_mainMenu.item[5], 0x4005, 88, 110, 104, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - } - - Button::Callback mainMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedMainMenu); - for (int i = 0; i < _mainMenu.numberOfItems; ++i) - _mainMenu.item[i].callback = mainMenuFunctor; - - GUI_LOL_MENU(_loadMenu, 10, 0x400e, 1, 5, 128, 20, 128, 118); - GUI_LOL_MENU_ITEM(_loadMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_loadMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_loadMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_loadMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_loadMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - Button::Callback loadMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedLoadMenu); - for (int i = 0; i < 5; ++i) - _loadMenu.item[i].callback = loadMenuFunctor; - - GUI_LOL_MENU(_saveMenu, 10, 0x400d, 1, 5, 128, 20, 128, 118); - GUI_LOL_MENU_ITEM(_saveMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_saveMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_saveMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_saveMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_saveMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - Button::Callback saveMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedSaveMenu); - for (int i = 0; i < 5; ++i) - _saveMenu.item[i].callback = saveMenuFunctor; - - GUI_LOL_MENU(_deleteMenu, 10, 0x400f, 1, 5, 128, 20, 128, 118); - GUI_LOL_MENU_ITEM(_deleteMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_deleteMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_deleteMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_deleteMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); - GUI_LOL_MENU_ITEM(_deleteMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - Button::Callback deleteMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedDeleteMenu); - for (int i = 0; i < 5; ++i) - _deleteMenu.item[i].callback = deleteMenuFunctor; - - GUI_LOL_MENU(_gameOptions, 17, 0x400c, 0, 6, -1, -1, -1, -1); - if (_vm->gameFlags().isTalkie) { - GUI_LOL_MENU_ITEM(_gameOptions.item[0], 0xfff7, 120, 22, 80, 15, 0x406e, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[1], 0xfff6, 120, 39, 80, 15, 0x406c, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[2], 0xfff5, 120, 56, 80, 15, 0x406d, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[3], 0xfff4, 120, 73, 80, 15, 0x42d5, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[4], 0xfff3, 120, 90, 80, 15, 0x42d2, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[5], 0x4072, 104, 110, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - } else { - GUI_LOL_MENU_ITEM(_gameOptions.item[0], 0xfff9, 120, 22, 80, 15, 0x406a, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[1], 0xfff8, 120, 39, 80, 15, 0x406b, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[2], 0xfff7, 120, 56, 80, 15, 0x406e, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[3], 0xfff6, 120, 73, 80, 15, 0x406c, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[4], 0xfff5, 120, 90, 80, 15, 0x406d, 0); - GUI_LOL_MENU_ITEM(_gameOptions.item[5], 0x4072, 104, 110, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - } - Button::Callback optionsMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedOptionsMenu); - for (int i = 0; i < _gameOptions.numberOfItems; ++i) - _gameOptions.item[i].callback = optionsMenuFunctor; - - GUI_LOL_MENU(_audioOptions, 18, 0x42d9, 2, 1, -1, -1, -1, -1); - GUI_LOL_MENU_ITEM(_audioOptions.item[0], 0x4072, 152, 76, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - GUI_LOL_MENU_ITEM(_audioOptions.item[1], 3, 128, 22, 114, 14, 0x42db, 0); - GUI_LOL_MENU_ITEM(_audioOptions.item[2], 4, 128, 39, 114, 14, 0x42da, 0); - GUI_LOL_MENU_ITEM(_audioOptions.item[3], 5, 128, 56, 114, 14, 0x42dc, 0); - Button::Callback audioMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedAudioMenu); - for (int i = 0; i < 4; ++i) - _audioOptions.item[i].callback = audioMenuFunctor; - - GUI_LOL_MENU(_deathMenu, 11, 0x4013, 0, 2, -1, -1, -1, -1); - GUI_LOL_MENU_ITEM(_deathMenu.item[0], 0x4006, 8, 30, 104, 15, 0, 0); - GUI_LOL_MENU_ITEM(_deathMenu.item[1], 0x4001, 176, 30, 104, 15, 0, 0); - Button::Callback deathMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedDeathMenu); - for (int i = 0; i < 2; ++i) - _deathMenu.item[i].callback = deathMenuFunctor; - - GUI_LOL_MENU(_savenameMenu, 7, 0x4053, 0, 2, -1, -1, -1, -1); - GUI_LOL_MENU_ITEM(_savenameMenu.item[0], 0x4012, 8, 38, 72, 15, 0, _vm->_keyMap[Common::KEYCODE_RETURN]); - GUI_LOL_MENU_ITEM(_savenameMenu.item[1], 0x4011, 176, 38, 72, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); - Button::Callback savenameMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedSavenameMenu); - for (int i = 0; i < 2; ++i) - _savenameMenu.item[i].callback = savenameMenuFunctor; - - GUI_LOL_MENU(_choiceMenu, 11, 0, 0, 2, -1, -1, -1, -1); - GUI_LOL_MENU_ITEM(_choiceMenu.item[0], 0x4007, 8, 30, 72, 15, 0, 0); - GUI_LOL_MENU_ITEM(_choiceMenu.item[1], 0x4008, 208, 30, 72, 15, 0, 0); - Button::Callback choiceMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedChoiceMenu); - for (int i = 0; i < 2; ++i) - _choiceMenu.item[i].callback = choiceMenuFunctor; -} - -#endif // ENABLE_LOL - const uint8 Screen_LoK_16::_palette16[48] = { 0x00, 0x00, 0x00, 0x02, 0x07, 0x0B, 0x0C, 0x06, 0x04, 0x0E, 0x09, 0x07, 0x00, 0x06, 0x03, 0x00, 0x0C, 0x07, @@ -2745,263 +2141,5 @@ const int8 KyraEngine_MR::_albumWSAY[] = { -1, -2, 2, 2, -6, -6, -6, 0 }; -// lands of lore static res - -#ifdef ENABLE_LOL -const ScreenDim Screen_LoL::_screenDimTable256C[] = { - { 0x00, 0x00, 0x28, 0xC8, 0xC7, 0xCF, 0x00, 0x00 }, // Taken from Intro - { 0x08, 0x48, 0x18, 0x38, 0xFE, 0x01, 0x00, 0x00 }, - { 0x0E, 0x00, 0x16, 0x78, 0xFE, 0x01, 0x00, 0x00 }, - { 0x0B, 0x7B, 0x1C, 0x12, 0xFE, 0xFC, 0x00, 0x00 }, - { 0x0B, 0x7B, 0x1C, 0x2D, 0xFE, 0xFC, 0x00, 0x00 }, - { 0x55, 0x7B, 0xE9, 0x37, 0xFE, 0xFC, 0x00, 0x00 }, - { 0x0B, 0x8C, 0x10, 0x2B, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (4 entries) - { 0x04, 0x59, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00 }, - { 0x05, 0x6E, 0x1E, 0x0C, 0xFE, 0x01, 0x00, 0x00 }, - { 0x07, 0x19, 0x1A, 0x97, 0x00, 0x00, 0x00, 0x00 }, // Ingame main menu box CD version - { 0x03, 0x1E, 0x22, 0x8C, 0x00, 0x00, 0x00, 0x00 }, - { 0x02, 0x48, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x0E, 0x00, 0x16, 0x78, 0xFE, 0x01, 0x00, 0x00 }, - { 0x0D, 0xA2, 0x18, 0x0C, 0xFE, 0x01, 0x00, 0x00 }, - { 0x0F, 0x06, 0x14, 0x6E, 0x01, 0x00, 0x00, 0x00 }, - { 0x1A, 0xBE, 0x0A, 0x07, 0xFE, 0x01, 0x00, 0x00 }, - { 0x07, 0x21, 0x1A, 0x85, 0x00, 0x00, 0x00, 0x00 }, - { 0x03, 0x32, 0x22, 0x62, 0x00, 0x00, 0x00, 0x00 }, - { 0x0B, 0x8C, 0x10, 0x33, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (5 entries, CD version only) - { 0x0B, 0x8C, 0x10, 0x23, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (3 entries, floppy version only) - - { 0x01, 0x20, 0x26, 0x80, 0xDC, 0xFD, 0x00, 0x00 }, // Credits - { 0x09, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, - { 0x19, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, - { 0x01, 0x02, 0x26, 0x14, 0x00, 0x0F, 0x0E, 0x00 }, -}; - -const ScreenDim Screen_LoL::_screenDimTable16C[] = { - { 0x00, 0x00, 0x28, 0xC8, 0x33, 0x44, 0x00, 0x00 }, // Taken from Intro - { 0x08, 0x48, 0x18, 0x38, 0x33, 0x44, 0x00, 0x00 }, - { 0x0E, 0x00, 0x16, 0x78, 0x33, 0x44, 0x00, 0x00 }, - { 0x0B, 0x7B, 0x1C, 0x11, 0x33, 0x11, 0x00, 0x00 }, - { 0x0B, 0x7B, 0x1C, 0x2D, 0x33, 0x11, 0x00, 0x00 }, - { 0x55, 0x7B, 0xE9, 0x37, 0x33, 0x11, 0x00, 0x00 }, - { 0x0B, 0x92, 0x10, 0x2A, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (4 entries) - { 0x04, 0x58, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00 }, - { 0x05, 0x6C, 0x1E, 0x0D, 0x33, 0x44, 0x00, 0x00 }, - { 0x07, 0x20, 0x1A, 0x86, 0x00, 0x00, 0x00, 0x00 }, - { 0x03, 0x20, 0x22, 0x8C, 0x00, 0x00, 0x00, 0x00 }, - { 0x02, 0x48, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x0E, 0x00, 0x16, 0x78, 0x33, 0x44, 0x00, 0x00 }, - { 0x0D, 0xA2, 0x18, 0x0C, 0x33, 0x44, 0x00, 0x00 }, - { 0x0F, 0x06, 0x14, 0x6E, 0x44, 0x00, 0x00, 0x00 }, - { 0x1A, 0xBE, 0x0A, 0x07, 0x33, 0x44, 0x00, 0x00 }, - { 0x07, 0x21, 0x1A, 0x85, 0x00, 0x00, 0x00, 0x00 }, - { 0x03, 0x32, 0x22, 0x62, 0x00, 0x00, 0x00, 0x00 }, - { 0x0B, 0x8C, 0x10, 0x33, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (5 entries, not used here) - { 0x0B, 0x8C, 0x10, 0x23, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (3 entries) - - { 0x01, 0x20, 0x26, 0x80, 0xDC, 0xFD, 0x00, 0x00 }, // Credits (TODO: Check this!) - { 0x09, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, - { 0x19, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, - { 0x01, 0x02, 0x26, 0x14, 0x00, 0x0F, 0x0E, 0x00 }, -}; - -const int Screen_LoL::_screenDimTableCount = ARRAYSIZE(Screen_LoL::_screenDimTable256C); - -const char * const LoLEngine::_languageExt[] = { - "ENG", - "FRE", - "GER" -}; - -const LoLEngine::CharacterPrev LoLEngine::_charPreviews[] = { - { "Ak\'shel", 0x060, 0x7F, { 0x0F, 0x08, 0x05 } }, - { "Michael", 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } }, - { "Kieran", 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } }, - { "Conrad", 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } } -}; - -const uint16 LoLEngine::_charPosXPC98[] = { - 92, 152, 212, 268 -}; - -const uint8 LoLEngine::_charNamesPC98[][11] = { - { 0x83, 0x41, 0x83, 0x4E, 0x83, 0x56, 0x83, 0x46, 0x83, 0x8B, 0x00 }, - { 0x83, 0x7D, 0x83, 0x43, 0x83, 0x50, 0x83, 0x8B, 0x00, 0x00, 0x00 }, - { 0x83, 0x4C, 0x81, 0x5B, 0x83, 0x89, 0x83, 0x93, 0x00, 0x00, 0x00 }, - { 0x83, 0x52, 0x83, 0x93, 0x83, 0x89, 0x83, 0x62, 0x83, 0x68, 0x00 } -}; - -const uint8 LoLEngine::_chargenFrameTableTalkie[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, - 0x05, 0x04, 0x03, 0x02, 0x01, - 0x00, 0x00, 0x01, 0x02, 0x03, - 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0A, 0x0B, 0x0C, 0x0D, - 0x0E, 0x0F, 0x10, 0x11, 0x12 -}; - -const uint8 LoLEngine::_chargenFrameTableFloppy[] = { - 0, 1, 2, 3, 4, 5, 4, 3, 2, - 1, 0, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15 -}; - -const uint16 LoLEngine::_selectionPosTable[] = { - 0x6F, 0x00, 0x8F, 0x00, 0xAF, 0x00, 0xCF, 0x00, - 0xEF, 0x00, 0x6F, 0x20, 0x8F, 0x20, 0xAF, 0x20, - 0xCF, 0x20, 0xEF, 0x20, 0x6F, 0x40, 0x8F, 0x40, - 0xAF, 0x40, 0xCF, 0x40, 0xEF, 0x40, 0x10F, 0x00 -}; - -const uint8 LoLEngine::_selectionChar1IdxTable[] = { - 0, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, - 5, 5, 5 -}; - -const uint8 LoLEngine::_selectionChar2IdxTable[] = { - 1, 1, 6, 6, 1, 1, 6, 6, - 6, 6, 6, 6, 6, 1, 1, 6, - 6, 6, 1, 1, 6, 6, 6, 6, - 6, 6, 6 -}; - -const uint8 LoLEngine::_selectionChar3IdxTable[] = { - 2, 2, 7, 7, 7, 7, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, - 2, 7, 7, 7, 7, 2, 2, 7, - 7, 7, 7 -}; - -const uint8 LoLEngine::_selectionChar4IdxTable[] = { - 3, 3, 8, 8, 8, 8, 3, 3, - 8, 8, 3, 3, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 3, 3, 8, - 8, 8, 8 -}; - -const uint8 LoLEngine::_reminderChar1IdxTable[] = { - 4, 4, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5 -}; - -const uint8 LoLEngine::_reminderChar2IdxTable[] = { - 9, 9, 9, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6 -}; - -const uint8 LoLEngine::_reminderChar3IdxTable[] = { - 0xE, 0xE, 0xE, 0x7, 0x7, 0x7, 0x7, 0x7, - 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, - 0x7 -}; - -const uint8 LoLEngine::_reminderChar4IdxTable[] = { - 0xF, 0xF, 0xF, 0x8, 0x8, 0x8, 0x8, 0x8, - 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, - 0x8 -}; - -const uint8 LoLEngine::_selectionAnimIndexTable[] = { - 0, 5, 1, 6, 2, 7, 3, 8 -}; - -const uint8 LoLEngine::_charInfoFrameTable[] = { - 0x0, 0x7, 0x8, 0x9, 0xA, 0xB, 0xA, 0x9, - 0x8, 0x7, 0x0, 0x0, 0x7, 0x8, 0x9, 0xA, - 0xB, 0xA, 0x9, 0x8, 0x7, 0x0, 0x0, 0x7, - 0x8, 0x9, 0xA, 0xB, 0xA, 0x9, 0x8, 0x7 -}; - -const uint8 LoLEngine::_clock2Timers[] = { - 0x00, 0x10, 0x11, 0x03, 0x04, 0x50, - 0x51, 0x52, 0x08, 0x09, 0x0A -}; - -const uint8 LoLEngine::_numClock2Timers = ARRAYSIZE(LoLEngine::_clock2Timers); - -const int8 LoLEngine::_mapCoords[12][4] = { - { 0, 7, 0, -5 }, { -5, 0, 6, 0 }, { 7, 5, 7, 1 }, - { 5, 6, 4, 6 }, { 0, 7, 0, -1 }, { -3, 0, 6, 0 }, - { 6, 7, 6, -3 }, { -3, 5, 6, 5 }, { 1, 5, 1, 1 }, - { 3, 1, 3, 1 }, { -1, 6, -1, -8 }, { -7, -1, 5, -1 } -}; - -const MistOfDoomAnimData LoLEngine::_mistAnimData[] = { - { 0, 7, 7, 13, 155 }, - { 0, 16, 16, 17, 155 }, - { 0, 24, 24, 24, 174 }, - { 0, 19, 19, 19, 174 }, - { 0, 16, 16, 17, 175 }, -}; - -const char * const LoLEngine::_outroShapeFileTable[] = { - "AMAZON.SHP", "ARCHRSLG.SHP", "AVIANWRM.SHP", "BANDIT.SHP", "BOAR.SHP", "CABAL.SHP", - "GUARD.SHP", "HAG.SHP", "HORNET.SHP", "HURZELL.SHP", "IRONGRZR.SHP", "KNOWLES.SHP", - "LIZARD.SHP", "MANTHA.SHP", "MINOTAUR.SHP", "MORIBUND.SHP", "ORC.SHP", "ORCLDR.SHP", - "PENTROG.SHP", "RATMAN.SHP", "ROCKLING.SHP", "SCAVNGR.SHP", "STARK.SHP", - "SWAMPCIT.SHP", "SWAMPMON.SHP", "THUG.SHP", "VIPER.SHP", "XEOB.SHP" -}; - -const uint8 LoLEngine::_outroFrameTable[] = { - 0, 0, 0, 0, 0, 1, 2, 3, - 0, 1, 2, 3, 8, 9, 10, 11, - 8, 9, 10, 11, 4, 5, 6, 7 -}; - -const int16 LoLEngine::_outroRightMonsterPos[] = { - 205, 55, 205, 55, 205, 55, 205, 55, - 205, 56, 207, 57, 208, 58, 210, 59, - 213, 60, 216, 61, 220, 61, 225, 61, - 230, 61, 235, 61, 240, 61, 240, 61, - 240, 61, 240, 61, 240, 61, 240, 61, - 240, 61, 265, 61, 290, 61, 315, 61 -}; - -const int16 LoLEngine::_outroLeftMonsterPos[] = { - 92, 55, 92, 55, 92, 55, 92, 55, - 92, 56, 90, 57, 85, 58, 77, 59, - 67, 60, 57, 61, 47, 61, 35, 61, - 35, 61, 35, 61, 35, 61, 35, 61, - 35, 61, 35, 61, 35, 61, 35, 61, - 35, 61, 10, 61, -20, 61, -45, 61 -}; - -const int16 LoLEngine::_outroRightDoorPos[] = { - 200, 41, 200, 29, 200, 17, 200, 5, - 200, -7, 200, -7, 200, -7, 200, -7, - 200, 5, 200, 17, 200, 29, 200, 41, - 200, 41, 200, 41, 200, 41, 200, 41, - 200, 41, 200, 41, 200, 41, 200, 41, - 200, 41, 200, 41, 200, 41, 200, 41 -}; - -const int16 LoLEngine::_outroLeftDoorPos[] = { - 72, 41, 72, 29, 72, 17, 72, 5, - 72, -7, 72, -7, 72, -7, 72, -7, - 72, 5, 72, 17, 72, 29, 72, 41, - 72, 41, 72, 41, 72, 41, 72, 41, - 72, 41, 72, 41, 72, 41, 72, 41, - 72, 41, 72, 41, 72, 41, 72, 41 -}; - -const int LoLEngine::_outroMonsterScaleTableX[] = { - 0x050, 0x050, 0x050, 0x050, 0x050, 0x05D, 0x070, 0x085, - 0x0A0, 0x0C0, 0x0E2, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100 -}; - -const int LoLEngine::_outroMonsterScaleTableY[] = { - 0x04C, 0x04C, 0x04C, 0x04C, 0x04C, 0x059, 0x06B, 0x080, - 0x099, 0x0B8, 0x0D9, 0x100, 0x100, 0x100, 0x100, 0x100, - 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100 -}; - -#endif // ENABLE_LOL - } // End of namespace Kyra diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp new file mode 100644 index 0000000000..dbf6808e37 --- /dev/null +++ b/engines/kyra/staticres_lol.cpp @@ -0,0 +1,882 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "kyra/resource.h" +#include "kyra/lol.h" +#include "kyra/screen_lol.h" +#include "kyra/gui_lol.h" + +#ifdef ENABLE_LOL + +namespace Kyra { + +const LoLCharacter *StaticResource::loadCharData(int id, int &entries) { + return (const LoLCharacter *)getData(id, kLolCharData, entries); +} + +const SpellProperty *StaticResource::loadSpellData(int id, int &entries) { + return (const SpellProperty *)getData(id, kLolSpellData, entries); +} + +const CompassDef *StaticResource::loadCompassData(int id, int &entries) { + return (const CompassDef *)getData(id, kLolCompassData, entries); +} + +const FlyingObjectShape *StaticResource::loadFlyingObjectData(int id, int &entries) { + return (const FlyingObjectShape *)getData(id, kLolFlightShpData, entries); +} + +const uint16 *StaticResource::loadRawDataBe16(int id, int &entries) { + return (const uint16 *)getData(id, kLolRawDataBe16, entries); +} + +const uint32 *StaticResource::loadRawDataBe32(int id, int &entries) { + return (const uint32 *)getData(id, kLolRawDataBe32, entries); +} + +const ButtonDef *StaticResource::loadButtonDefs(int id, int &entries) { + return (const ButtonDef *)getData(id, kLolButtonData, entries); +} + +bool StaticResource::loadCharData(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() / 130; + LoLCharacter *charData = new LoLCharacter[size]; + + for (int i = 0; i < size; i++) { + LoLCharacter *t = &charData[i]; + + t->flags = stream.readUint16LE(); + stream.read(t->name, 11); + t->raceClassSex = stream.readByte(); + t->id = stream.readSint16LE(); + t->curFaceFrame = stream.readByte(); + t->tempFaceFrame = stream.readByte(); + t->screamSfx = stream.readByte(); + stream.readUint32LE(); + for (int ii = 0; ii < 8; ii++) + t->itemsMight[ii] = stream.readUint16LE(); + for (int ii = 0; ii < 8; ii++) + t->protectionAgainstItems[ii] = stream.readUint16LE(); + t->itemProtection = stream.readUint16LE(); + t->hitPointsCur = stream.readSint16LE(); + t->hitPointsMax = stream.readUint16LE(); + t->magicPointsCur = stream.readSint16LE(); + t->magicPointsMax = stream.readUint16LE(); + t->field_41 = stream.readByte(); + t->damageSuffered = stream.readUint16LE(); + t->weaponHit = stream.readUint16LE(); + t->totalMightModifier = stream.readUint16LE(); + t->totalProtectionModifier = stream.readUint16LE(); + t->might = stream.readUint16LE(); + t->protection = stream.readUint16LE(); + t->nextAnimUpdateCountdown = stream.readSint16LE(); + for (int ii = 0; ii < 11; ii++) + t->items[ii] = stream.readUint16LE(); + for (int ii = 0; ii < 3; ii++) + t->skillLevels[ii] = stream.readByte(); + for (int ii = 0; ii < 3; ii++) + t->skillModifiers[ii] = stream.readByte(); + for (int ii = 0; ii < 3; ii++) + t->experiencePts[ii] = stream.readUint32LE(); + for (int ii = 0; ii < 5; ii++) + t->characterUpdateEvents[ii] = stream.readByte(); + for (int ii = 0; ii < 5; ii++) + t->characterUpdateDelay[ii] = stream.readByte(); + }; + + ptr = charData; + return true; +} + +bool StaticResource::loadSpellData(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() / 28; + SpellProperty *spellData = new SpellProperty[size]; + + for (int i = 0; i < size; i++) { + SpellProperty *t = &spellData[i]; + + t->spellNameCode = stream.readUint16LE(); + for (int ii = 0; ii < 4; ii++) + t->mpRequired[ii] = stream.readUint16LE(); + t->field_a = stream.readUint16LE(); + t->field_c = stream.readUint16LE(); + for (int ii = 0; ii < 4; ii++) + t->hpRequired[ii] = stream.readUint16LE(); + t->field_16 = stream.readUint16LE(); + t->field_18 = stream.readUint16LE(); + t->flags = stream.readUint16LE(); + }; + + ptr = spellData; + return true; +} + +bool StaticResource::loadCompassData(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() / 4; + CompassDef *defs = new CompassDef[size]; + + for (int i = 0; i < size; i++) { + CompassDef *t = &defs[i]; + t->shapeIndex = stream.readByte(); + t->x = stream.readByte(); + t->y = stream.readByte(); + t->flags = stream.readByte(); + }; + + + ptr = defs; + return true; +} + +bool StaticResource::loadFlyingObjectData(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() / 5; + FlyingObjectShape *defs = new FlyingObjectShape[size]; + + for (int i = 0; i < size; i++) { + FlyingObjectShape *t = &defs[i]; + t->shapeFront = stream.readByte(); + t->shapeBack = stream.readByte(); + t->shapeLeft = stream.readByte(); + t->drawFlags = stream.readByte(); + t->flipFlags = stream.readByte(); + }; + + ptr = defs; + return true; +} + +bool StaticResource::loadRawDataBe16(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() >> 1; + + uint16 *r = new uint16[size]; + + for (int i = 0; i < size; i++) + r[i] = stream.readUint16BE(); + + ptr = r; + return true; +} + +bool StaticResource::loadRawDataBe32(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() >> 2; + + uint32 *r = new uint32[size]; + + for (int i = 0; i < size; i++) + r[i] = stream.readUint32BE(); + + ptr = r; + return true; +} + +bool StaticResource::loadButtonDefs(Common::SeekableReadStream &stream, void *&ptr, int &size) { + size = stream.size() / 18; + + ButtonDef *r = new ButtonDef[size]; + + for (int i = 0; i < size; i++) { + r[i].buttonflags = stream.readUint16BE(); + r[i].keyCode = stream.readUint16BE(); + r[i].keyCode2 = stream.readUint16BE(); + r[i].x = stream.readSint16BE(); + r[i].y = stream.readSint16BE(); + r[i].w = stream.readUint16BE(); + r[i].h = stream.readUint16BE(); + r[i].index = stream.readUint16BE(); + r[i].screenDim = stream.readUint16BE(); + } + + ptr = r; + return true; +} + +void StaticResource::freeCharData(void *&ptr, int &size) { + LoLCharacter *d = (LoLCharacter *)ptr; + delete[] d; + ptr = 0; + size = 0; +} + +void StaticResource::freeSpellData(void *&ptr, int &size) { + SpellProperty *d = (SpellProperty *)ptr; + delete[] d; + ptr = 0; + size = 0; +} + +void StaticResource::freeCompassData(void *&ptr, int &size) { + CompassDef *d = (CompassDef *)ptr; + delete[] d; + ptr = 0; + size = 0; +} + +void StaticResource::freeFlyingObjectData(void *&ptr, int &size) { + FlyingObjectShape *d = (FlyingObjectShape *)ptr; + delete[] d; + ptr = 0; + size = 0; +} + + +void StaticResource::freeRawDataBe16(void *&ptr, int &size) { + uint16 *data = (uint16 *)ptr; + delete[] data; + ptr = 0; + size = 0; +} + +void StaticResource::freeRawDataBe32(void *&ptr, int &size) { + uint32 *data = (uint32 *)ptr; + delete[] data; + ptr = 0; + size = 0; +} + +void StaticResource::freeButtonDefs(void *&ptr, int &size) { + ButtonDef *d = (ButtonDef *)ptr; + delete[] d; + ptr = 0; + size = 0; +} + +void LoLEngine::initStaticResource() { + // assign music data + static const char *pcMusicFileListIntro[] = { "LOREINTR" }; + static const char *pcMusicFileListFinale[] = { "LOREFINL" }; + static const char *pcMusicFileListIngame[] = { "LORE%02d%c" }; + + static const char *pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; + static const char *pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; + static const char *pc98MusicFileListIngame[] = { "lore%02d.86" }; + + memset(_soundData, 0, sizeof(_soundData)); + if (_flags.platform == Common::kPlatformPC) { + _soundData[0].fileList = pcMusicFileListIntro; + _soundData[0].fileListLen = ARRAYSIZE(pcMusicFileListIntro); + _soundData[1].fileList = pcMusicFileListIngame; + _soundData[1].fileListLen = ARRAYSIZE(pcMusicFileListIngame); + _soundData[2].fileList = pcMusicFileListFinale; + _soundData[2].fileListLen = ARRAYSIZE(pcMusicFileListFinale); + } else if (_flags.platform == Common::kPlatformPC98) { + _soundData[0].fileList = pc98MusicFileListIntro; + _soundData[0].fileListLen = ARRAYSIZE(pc98MusicFileListIntro); + _soundData[1].fileList = pc98MusicFileListIngame; + _soundData[1].fileListLen = ARRAYSIZE(pc98MusicFileListIngame); + _soundData[2].fileList = pc98MusicFileListFinale; + _soundData[2].fileListLen = ARRAYSIZE(pc98MusicFileListFinale); + } + + if (_flags.isDemo) + return; + + _pakFileList = _staticres->loadStrings(kLolIngamePakFiles, _pakFileListSize); + _charDefaults = _staticres->loadCharData(kLolCharacterDefs, _charDefaultsSize); + _ingameSoundIndex = (const uint16 *)_staticres->loadRawData(kLolIngameSfxIndex, _ingameSoundIndexSize); + _musicTrackMap = _staticres->loadRawData(kLolMusicTrackMap, _musicTrackMapSize); + _ingameGMSoundIndex = _staticres->loadRawData(kLolIngameGMSfxIndex, _ingameGMSoundIndexSize); + _ingameMT32SoundIndex = _staticres->loadRawData(kLolIngameMT32SfxIndex, _ingameMT32SoundIndexSize); + _ingamePCSpeakerSoundIndex = _staticres->loadRawData(kLolIngamePcSpkSfxIndex, _ingamePCSpeakerSoundIndexSize); + _spellProperties = _staticres->loadSpellData(kLolSpellProperties, _spellPropertiesSize); + _gameShapeMap = (const int8 *)_staticres->loadRawData(kLolGameShapeMap, _gameShapeMapSize); + _sceneItemOffs = (const int8 *)_staticres->loadRawData(kLolSceneItemOffs, _sceneItemOffsSize); + _charInvIndex = _staticres->loadRawData(kLolCharInvIndex, _charInvIndexSize); + _charInvDefs = _staticres->loadRawData(kLolCharInvDefs, _charInvDefsSize); + _charDefsMan = _staticres->loadRawDataBe16(kLolCharDefsMan, _charDefsManSize); + _charDefsWoman = _staticres->loadRawDataBe16(kLolCharDefsWoman, _charDefsWomanSize); + _charDefsKieran = _staticres->loadRawDataBe16(kLolCharDefsKieran, _charDefsKieranSize); + _charDefsAkshel = _staticres->loadRawDataBe16(kLolCharDefsAkshel, _charDefsAkshelSize); + _expRequirements = (const int32 *)_staticres->loadRawDataBe32(kLolExpRequirements, _expRequirementsSize); + _monsterModifiers = _staticres->loadRawDataBe16(kLolMonsterModifiers, _monsterModifiersSize); + _monsterShiftOffs = (const int8 *)_staticres->loadRawData(kLolMonsterShiftOffsets, _monsterShiftOffsSize); + _monsterDirFlags = _staticres->loadRawData(kLolMonsterDirFlags, _monsterDirFlagsSize); + _monsterScaleX = _staticres->loadRawData(kLolMonsterScaleX, _monsterScaleXSize); + _monsterScaleY = _staticres->loadRawData(kLolMonsterScaleY, _monsterScaleYSize); + _monsterScaleWH = _staticres->loadRawDataBe16(kLolMonsterScaleWH, _monsterScaleWHSize); + _inventorySlotDesc = _staticres->loadRawDataBe16(kLolInventoryDesc, _inventorySlotDescSize); + _levelShpList = _staticres->loadStrings(kLolLevelShpList, _levelShpListSize); + _levelDatList = _staticres->loadStrings(kLolLevelDatList, _levelDatListSize); + _compassDefs = _staticres->loadCompassData(kLolCompassDefs, _compassDefsSize); + _flyingItemShapes = _staticres->loadFlyingObjectData(kLolFlyingObjectShp, _flyingItemShapesSize); + _itemCost = _staticres->loadRawDataBe16(kLolItemPrices, _itemCostSize); + _stashSetupData = _staticres->loadRawData(kLolStashSetup, _stashSetupDataSize); + + _dscUnk1 = (const int8 *)_staticres->loadRawData(kLolDscUnk1, _dscUnk1Size); + _dscShapeIndex = (const int8 *)_staticres->loadRawData(kLolDscShapeIndex, _dscShapeIndexSize); + _dscOvlMap = _staticres->loadRawData(kLolDscOvlMap, _dscOvlMapSize); + _dscShapeScaleW = _staticres->loadRawDataBe16(kLolDscScaleWidthData, _dscShapeScaleWSize); + _dscShapeScaleH = _staticres->loadRawDataBe16(kLolDscScaleHeightData, _dscShapeScaleHSize); + _dscShapeX = (const int16 *)_staticres->loadRawDataBe16(kLolDscX, _dscShapeXSize); + _dscShapeY = (const int8 *)_staticres->loadRawData(kLolDscY, _dscShapeYSize); + _dscTileIndex = _staticres->loadRawData(kLolDscTileIndex, _dscTileIndexSize); + _dscUnk2 = _staticres->loadRawData(kLolDscUnk2, _dscUnk2Size); + _dscDoorShpIndex = _staticres->loadRawData(kLolDscDoorShapeIndex, _dscDoorShpIndexSize); + _dscDim1 = (const int8 *)_staticres->loadRawData(kLolDscDimData1, _dscDim1Size); + _dscDim2 = (const int8 *)_staticres->loadRawData(kLolDscDimData2, _dscDim2Size); + _dscBlockMap = _staticres->loadRawData(kLolDscBlockMap, _dscBlockMapSize); + _dscDimMap = _staticres->loadRawData(kLolDscDimMap, _dscDimMapSize); + _dscDoorMonsterScaleTable = _staticres->loadRawDataBe16(kLolDscDoorScale, _dscDoorMonsterScaleTableSize); + _dscShapeOvlIndex = _staticres->loadRawData(kLolDscOvlIndex, _dscShapeOvlIndexSize); + _dscDoor4 = _staticres->loadRawDataBe16(kLolDscDoor4, _dscDoor4Size); + _dscBlockIndex = (const int8 *)_staticres->loadRawData(kLolDscBlockIndex, _dscBlockIndexSize); + _dscDoor1 = _staticres->loadRawData(kLolDscDoor1, _dscDoor1Size); + _dscDoorMonsterX = (const int16 *)_staticres->loadRawDataBe16(kLolDscDoorX, _dscDoorMonsterXSize); + _dscDoorMonsterY = (const int16 *)_staticres->loadRawDataBe16(kLolDscDoorY, _dscDoorMonsterYSize); + + _scrollXTop = _staticres->loadRawData(kLolScrollXTop, _scrollXTopSize); + _scrollYTop = _staticres->loadRawData(kLolScrollYTop, _scrollYTopSize); + _scrollXBottom = _staticres->loadRawData(kLolScrollXBottom, _scrollXBottomSize); + _scrollYBottom = _staticres->loadRawData(kLolScrollYBottom, _scrollYBottomSize); + + const char *const *tmpSndList = _staticres->loadStrings(kLolIngameSfxFiles, _ingameSoundListSize); + if (tmpSndList) { + _ingameSoundList = new char *[_ingameSoundListSize]; + for (int i = 0; i < _ingameSoundListSize; i++) { + _ingameSoundList[i] = new char[strlen(tmpSndList[i]) + 1]; + strcpy(_ingameSoundList[i], tmpSndList[i]); + } + _staticres->unloadId(kLolIngameSfxFiles); + } + + _buttonData = _staticres->loadButtonDefs(kLolButtonDefs, _buttonDataSize); + _buttonList1 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList1, _buttonList1Size); + _buttonList2 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList2, _buttonList2Size); + _buttonList3 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList3, _buttonList3Size); + _buttonList4 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList4, _buttonList4Size); + _buttonList5 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList5, _buttonList5Size); + _buttonList6 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList6, _buttonList6Size); + _buttonList7 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList7, _buttonList7Size); + _buttonList8 = (const int16 *)_staticres->loadRawDataBe16(kLolButtonList8, _buttonList8Size); + + _autoMapStrings = _staticres->loadRawDataBe16(kLolMapStringId, _autoMapStringsSize); + + int tmpSize = 0; + const uint8 *tmp = _staticres->loadRawData(kLolLegendData, tmpSize); + tmpSize /= 5; + if (tmp) { + _defaultLegendData = new MapLegendData[tmpSize]; + for (int i = 0; i < tmpSize; i++) { + _defaultLegendData[i].shapeIndex = *tmp++; + _defaultLegendData[i].enable = *tmp++ ? true : false; + _defaultLegendData[i].x = (int8)*tmp++; + _defaultLegendData[i].stringId = READ_LE_UINT16(tmp); + tmp += 2; + } + _staticres->unloadId(kLolLegendData); + } + + tmp = _staticres->loadRawData(kLolMapCursorOvl, tmpSize); + _mapCursorOverlay = new uint8[tmpSize]; + memcpy(_mapCursorOverlay, tmp, tmpSize); + _staticres->unloadId(kLolMapCursorOvl); + + _updateSpellBookCoords = _staticres->loadRawData(kLolSpellbookCoords, _updateSpellBookCoordsSize); + _updateSpellBookAnimData = _staticres->loadRawData(kLolSpellbookAnim, _updateSpellBookAnimDataSize); + _healShapeFrames = _staticres->loadRawData(kLolHealShapeFrames, _healShapeFramesSize); + + tmp = _staticres->loadRawData(kLolLightningDefs, tmpSize); + if (tmp) { + _lightningProps = new LightningProperty[5]; + for (int i = 0; i < 5; i++) { + _lightningProps[i].lastFrame = tmp[i << 2]; + _lightningProps[i].frameDiv = tmp[(i << 2) + 1]; + _lightningProps[i].sfxId = READ_LE_UINT16(&tmp[(i << 2) + 2]); + } + _staticres->unloadId(kLolLightningDefs); + } + + _fireBallCoords = (const int16 *)_staticres->loadRawDataBe16(kLolFireballCoords, _fireBallCoordsSize); + + _buttonCallbacks.clear(); + _buttonCallbacks.reserve(95); +#define cb(x) _buttonCallbacks.push_back(BUTTON_FUNCTOR(LoLEngine, this, &LoLEngine::x)) + // 0x00 + cb(clickedUpArrow); + cb(clickedDownArrow); + _buttonCallbacks.push_back(_buttonCallbacks[1]); + cb(clickedLeftArrow); + + // 0x04 + cb(clickedRightArrow); + cb(clickedTurnLeftArrow); + cb(clickedTurnRightArrow); + cb(clickedAttackButton); + + // 0x08 + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[7]); + cb(clickedMagicButton); + + // 0x0C + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[11]); + cb(clickedMagicSubmenu); + + // 0x10 + cb(clickedScreen); + cb(clickedPortraitLeft); + for (int i = 0; i < 7; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[17]); + + // 0x19 + cb(clickedLiveMagicBarsLeft); + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[25]); + + // 0x1D + cb(clickedPortraitEtcRight); + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[29]); + + // 0x21 + cb(clickedCharInventorySlot); + for (int i = 0; i < 10; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[33]); + + // 0x2C + cb(clickedExitCharInventory); + cb(clickedSceneDropItem); + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[45]); + + // 0x31 + cb(clickedScenePickupItem); + cb(clickedInventorySlot); + for (int i = 0; i < 9; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[50]); + + // 0x3C + cb(clickedInventoryScroll); + cb(clickedInventoryScroll); + cb(clickedWall); + _buttonCallbacks.push_back(_buttonCallbacks[62]); + + // 0x40 + cb(clickedSequenceWindow); + _buttonCallbacks.push_back(_buttonCallbacks[0]); + _buttonCallbacks.push_back(_buttonCallbacks[1]); + _buttonCallbacks.push_back(_buttonCallbacks[3]); + + // 0x44 + _buttonCallbacks.push_back(_buttonCallbacks[4]); + _buttonCallbacks.push_back(_buttonCallbacks[5]); + _buttonCallbacks.push_back(_buttonCallbacks[6]); + cb(clickedScroll); + + // 0x48 + for (int i = 0; i < 9; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[71]); + + // 0x51 + cb(clickedSpellTargetCharacter); + for (int i = 0; i < 3; ++i) + _buttonCallbacks.push_back(_buttonCallbacks[81]); + + // 0x55 + cb(clickedSpellTargetScene); + cb(clickedSceneThrowItem); + _buttonCallbacks.push_back(_buttonCallbacks[86]); + + // 0x58 + cb(clickedOptions); + cb(clickedRestParty); + cb(clickedMoneyBox); + cb(clickedCompass); + + // 0x5C + cb(clickedAutomap); + cb(clickedLamp); + cb(clickedStatusIcon); +#undef cb +} + +void GUI_LoL::initStaticData() { + GUI_V2_BUTTON(_scrollUpButton, 20, 96, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); + GUI_V2_BUTTON(_scrollDownButton, 21, 98, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); + + for (uint i = 0; i < ARRAYSIZE(_menuButtons); ++i) + GUI_V2_BUTTON(_menuButtons[i], i, 0, 0, 0, 0, 0, 0x4487, 0, 0, 0, 0, 0, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0); + + if (_vm->gameFlags().isTalkie) + GUI_LOL_MENU(_mainMenu, 9, 0x4000, 0, 7, -1, -1, -1, -1); + else + GUI_LOL_MENU(_mainMenu, 17, 0x4000, 0, 6, -1, -1, -1, -1); + + GUI_LOL_MENU_ITEM(_mainMenu.item[0], 0x4001, 16, 23, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[1], 0x4002, 16, 40, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[2], 0x4003, 16, 57, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[3], 0x4004, 16, 74, 176, 15, 0, 0); + + if (_vm->gameFlags().isTalkie) { + GUI_LOL_MENU_ITEM(_mainMenu.item[4], 0x42D9, 16, 91, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[5], 0x4006, 16, 108, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[6], 0x4005, 88, 127, 104, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + } else { + GUI_LOL_MENU_ITEM(_mainMenu.item[4], 0x4006, 16, 91, 176, 15, 0, 0); + GUI_LOL_MENU_ITEM(_mainMenu.item[5], 0x4005, 88, 110, 104, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + } + + Button::Callback mainMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedMainMenu); + for (int i = 0; i < _mainMenu.numberOfItems; ++i) + _mainMenu.item[i].callback = mainMenuFunctor; + + GUI_LOL_MENU(_loadMenu, 10, 0x400e, 1, 5, 128, 20, 128, 118); + GUI_LOL_MENU_ITEM(_loadMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_loadMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_loadMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_loadMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_loadMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + Button::Callback loadMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedLoadMenu); + for (int i = 0; i < 5; ++i) + _loadMenu.item[i].callback = loadMenuFunctor; + + GUI_LOL_MENU(_saveMenu, 10, 0x400d, 1, 5, 128, 20, 128, 118); + GUI_LOL_MENU_ITEM(_saveMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_saveMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_saveMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_saveMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_saveMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + Button::Callback saveMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedSaveMenu); + for (int i = 0; i < 5; ++i) + _saveMenu.item[i].callback = saveMenuFunctor; + + GUI_LOL_MENU(_deleteMenu, 10, 0x400f, 1, 5, 128, 20, 128, 118); + GUI_LOL_MENU_ITEM(_deleteMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_deleteMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_deleteMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_deleteMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0); + GUI_LOL_MENU_ITEM(_deleteMenu.item[4], 0x4011, 168, 118, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + Button::Callback deleteMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedDeleteMenu); + for (int i = 0; i < 5; ++i) + _deleteMenu.item[i].callback = deleteMenuFunctor; + + GUI_LOL_MENU(_gameOptions, 17, 0x400c, 0, 6, -1, -1, -1, -1); + if (_vm->gameFlags().isTalkie) { + GUI_LOL_MENU_ITEM(_gameOptions.item[0], 0xfff7, 120, 22, 80, 15, 0x406e, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[1], 0xfff6, 120, 39, 80, 15, 0x406c, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[2], 0xfff5, 120, 56, 80, 15, 0x406d, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[3], 0xfff4, 120, 73, 80, 15, 0x42d5, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[4], 0xfff3, 120, 90, 80, 15, 0x42d2, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[5], 0x4072, 104, 110, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + } else { + GUI_LOL_MENU_ITEM(_gameOptions.item[0], 0xfff9, 120, 22, 80, 15, 0x406a, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[1], 0xfff8, 120, 39, 80, 15, 0x406b, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[2], 0xfff7, 120, 56, 80, 15, 0x406e, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[3], 0xfff6, 120, 73, 80, 15, 0x406c, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[4], 0xfff5, 120, 90, 80, 15, 0x406d, 0); + GUI_LOL_MENU_ITEM(_gameOptions.item[5], 0x4072, 104, 110, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + } + Button::Callback optionsMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedOptionsMenu); + for (int i = 0; i < _gameOptions.numberOfItems; ++i) + _gameOptions.item[i].callback = optionsMenuFunctor; + + GUI_LOL_MENU(_audioOptions, 18, 0x42d9, 2, 1, -1, -1, -1, -1); + GUI_LOL_MENU_ITEM(_audioOptions.item[0], 0x4072, 152, 76, 96, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + GUI_LOL_MENU_ITEM(_audioOptions.item[1], 3, 128, 22, 114, 14, 0x42db, 0); + GUI_LOL_MENU_ITEM(_audioOptions.item[2], 4, 128, 39, 114, 14, 0x42da, 0); + GUI_LOL_MENU_ITEM(_audioOptions.item[3], 5, 128, 56, 114, 14, 0x42dc, 0); + Button::Callback audioMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedAudioMenu); + for (int i = 0; i < 4; ++i) + _audioOptions.item[i].callback = audioMenuFunctor; + + GUI_LOL_MENU(_deathMenu, 11, 0x4013, 0, 2, -1, -1, -1, -1); + GUI_LOL_MENU_ITEM(_deathMenu.item[0], 0x4006, 8, 30, 104, 15, 0, 0); + GUI_LOL_MENU_ITEM(_deathMenu.item[1], 0x4001, 176, 30, 104, 15, 0, 0); + Button::Callback deathMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedDeathMenu); + for (int i = 0; i < 2; ++i) + _deathMenu.item[i].callback = deathMenuFunctor; + + GUI_LOL_MENU(_savenameMenu, 7, 0x4053, 0, 2, -1, -1, -1, -1); + GUI_LOL_MENU_ITEM(_savenameMenu.item[0], 0x4012, 8, 38, 72, 15, 0, _vm->_keyMap[Common::KEYCODE_RETURN]); + GUI_LOL_MENU_ITEM(_savenameMenu.item[1], 0x4011, 176, 38, 72, 15, 0, _vm->_keyMap[Common::KEYCODE_ESCAPE]); + Button::Callback savenameMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedSavenameMenu); + for (int i = 0; i < 2; ++i) + _savenameMenu.item[i].callback = savenameMenuFunctor; + + GUI_LOL_MENU(_choiceMenu, 11, 0, 0, 2, -1, -1, -1, -1); + GUI_LOL_MENU_ITEM(_choiceMenu.item[0], 0x4007, 8, 30, 72, 15, 0, 0); + GUI_LOL_MENU_ITEM(_choiceMenu.item[1], 0x4008, 208, 30, 72, 15, 0, 0); + Button::Callback choiceMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedChoiceMenu); + for (int i = 0; i < 2; ++i) + _choiceMenu.item[i].callback = choiceMenuFunctor; +} + +const ScreenDim Screen_LoL::_screenDimTable256C[] = { + { 0x00, 0x00, 0x28, 0xC8, 0xC7, 0xCF, 0x00, 0x00 }, // Taken from Intro + { 0x08, 0x48, 0x18, 0x38, 0xFE, 0x01, 0x00, 0x00 }, + { 0x0E, 0x00, 0x16, 0x78, 0xFE, 0x01, 0x00, 0x00 }, + { 0x0B, 0x7B, 0x1C, 0x12, 0xFE, 0xFC, 0x00, 0x00 }, + { 0x0B, 0x7B, 0x1C, 0x2D, 0xFE, 0xFC, 0x00, 0x00 }, + { 0x55, 0x7B, 0xE9, 0x37, 0xFE, 0xFC, 0x00, 0x00 }, + { 0x0B, 0x8C, 0x10, 0x2B, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (4 entries) + { 0x04, 0x59, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00 }, + { 0x05, 0x6E, 0x1E, 0x0C, 0xFE, 0x01, 0x00, 0x00 }, + { 0x07, 0x19, 0x1A, 0x97, 0x00, 0x00, 0x00, 0x00 }, // Ingame main menu box CD version + { 0x03, 0x1E, 0x22, 0x8C, 0x00, 0x00, 0x00, 0x00 }, + { 0x02, 0x48, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x0E, 0x00, 0x16, 0x78, 0xFE, 0x01, 0x00, 0x00 }, + { 0x0D, 0xA2, 0x18, 0x0C, 0xFE, 0x01, 0x00, 0x00 }, + { 0x0F, 0x06, 0x14, 0x6E, 0x01, 0x00, 0x00, 0x00 }, + { 0x1A, 0xBE, 0x0A, 0x07, 0xFE, 0x01, 0x00, 0x00 }, + { 0x07, 0x21, 0x1A, 0x85, 0x00, 0x00, 0x00, 0x00 }, + { 0x03, 0x32, 0x22, 0x62, 0x00, 0x00, 0x00, 0x00 }, + { 0x0B, 0x8C, 0x10, 0x33, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (5 entries, CD version only) + { 0x0B, 0x8C, 0x10, 0x23, 0x3D, 0x01, 0x00, 0x00 }, // Main menu box (3 entries, floppy version only) + + { 0x01, 0x20, 0x26, 0x80, 0xDC, 0xFD, 0x00, 0x00 }, // Credits + { 0x09, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, + { 0x19, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, + { 0x01, 0x02, 0x26, 0x14, 0x00, 0x0F, 0x0E, 0x00 }, +}; + +const ScreenDim Screen_LoL::_screenDimTable16C[] = { + { 0x00, 0x00, 0x28, 0xC8, 0x33, 0x44, 0x00, 0x00 }, // Taken from Intro + { 0x08, 0x48, 0x18, 0x38, 0x33, 0x44, 0x00, 0x00 }, + { 0x0E, 0x00, 0x16, 0x78, 0x33, 0x44, 0x00, 0x00 }, + { 0x0B, 0x7B, 0x1C, 0x11, 0x33, 0x11, 0x00, 0x00 }, + { 0x0B, 0x7B, 0x1C, 0x2D, 0x33, 0x11, 0x00, 0x00 }, + { 0x55, 0x7B, 0xE9, 0x37, 0x33, 0x11, 0x00, 0x00 }, + { 0x0B, 0x92, 0x10, 0x2A, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (4 entries) + { 0x04, 0x58, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00 }, + { 0x05, 0x6C, 0x1E, 0x0D, 0x33, 0x44, 0x00, 0x00 }, + { 0x07, 0x20, 0x1A, 0x86, 0x00, 0x00, 0x00, 0x00 }, + { 0x03, 0x20, 0x22, 0x8C, 0x00, 0x00, 0x00, 0x00 }, + { 0x02, 0x48, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x0E, 0x00, 0x16, 0x78, 0x33, 0x44, 0x00, 0x00 }, + { 0x0D, 0xA2, 0x18, 0x0C, 0x33, 0x44, 0x00, 0x00 }, + { 0x0F, 0x06, 0x14, 0x6E, 0x44, 0x00, 0x00, 0x00 }, + { 0x1A, 0xBE, 0x0A, 0x07, 0x33, 0x44, 0x00, 0x00 }, + { 0x07, 0x21, 0x1A, 0x85, 0x00, 0x00, 0x00, 0x00 }, + { 0x03, 0x32, 0x22, 0x62, 0x00, 0x00, 0x00, 0x00 }, + { 0x0B, 0x8C, 0x10, 0x33, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (5 entries, not used here) + { 0x0B, 0x8C, 0x10, 0x23, 0x33, 0x44, 0x00, 0x00 }, // Main menu box (3 entries) + + { 0x01, 0x20, 0x26, 0x80, 0xDC, 0xFD, 0x00, 0x00 }, // Credits (TODO: Check this!) + { 0x09, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, + { 0x19, 0x29, 0x08, 0x2C, 0x00, 0x00, 0x00, 0x00 }, + { 0x01, 0x02, 0x26, 0x14, 0x00, 0x0F, 0x0E, 0x00 }, +}; + +const int Screen_LoL::_screenDimTableCount = ARRAYSIZE(Screen_LoL::_screenDimTable256C); + +const char * const LoLEngine::_languageExt[] = { + "ENG", + "FRE", + "GER" +}; + +const LoLEngine::CharacterPrev LoLEngine::_charPreviews[] = { + { "Ak\'shel", 0x060, 0x7F, { 0x0F, 0x08, 0x05 } }, + { "Michael", 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } }, + { "Kieran", 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } }, + { "Conrad", 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } } +}; + +const uint16 LoLEngine::_charPosXPC98[] = { + 92, 152, 212, 268 +}; + +const uint8 LoLEngine::_charNamesPC98[][11] = { + { 0x83, 0x41, 0x83, 0x4E, 0x83, 0x56, 0x83, 0x46, 0x83, 0x8B, 0x00 }, + { 0x83, 0x7D, 0x83, 0x43, 0x83, 0x50, 0x83, 0x8B, 0x00, 0x00, 0x00 }, + { 0x83, 0x4C, 0x81, 0x5B, 0x83, 0x89, 0x83, 0x93, 0x00, 0x00, 0x00 }, + { 0x83, 0x52, 0x83, 0x93, 0x83, 0x89, 0x83, 0x62, 0x83, 0x68, 0x00 } +}; + +const uint8 LoLEngine::_chargenFrameTableTalkie[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x04, 0x03, 0x02, 0x01, + 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0A, 0x0B, 0x0C, 0x0D, + 0x0E, 0x0F, 0x10, 0x11, 0x12 +}; + +const uint8 LoLEngine::_chargenFrameTableFloppy[] = { + 0, 1, 2, 3, 4, 5, 4, 3, 2, + 1, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; + +const uint16 LoLEngine::_selectionPosTable[] = { + 0x6F, 0x00, 0x8F, 0x00, 0xAF, 0x00, 0xCF, 0x00, + 0xEF, 0x00, 0x6F, 0x20, 0x8F, 0x20, 0xAF, 0x20, + 0xCF, 0x20, 0xEF, 0x20, 0x6F, 0x40, 0x8F, 0x40, + 0xAF, 0x40, 0xCF, 0x40, 0xEF, 0x40, 0x10F, 0x00 +}; + +const uint8 LoLEngine::_selectionChar1IdxTable[] = { + 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 5, 5, + 5, 5, 5 +}; + +const uint8 LoLEngine::_selectionChar2IdxTable[] = { + 1, 1, 6, 6, 1, 1, 6, 6, + 6, 6, 6, 6, 6, 1, 1, 6, + 6, 6, 1, 1, 6, 6, 6, 6, + 6, 6, 6 +}; + +const uint8 LoLEngine::_selectionChar3IdxTable[] = { + 2, 2, 7, 7, 7, 7, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, + 2, 7, 7, 7, 7, 2, 2, 7, + 7, 7, 7 +}; + +const uint8 LoLEngine::_selectionChar4IdxTable[] = { + 3, 3, 8, 8, 8, 8, 3, 3, + 8, 8, 3, 3, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 3, 3, 8, + 8, 8, 8 +}; + +const uint8 LoLEngine::_reminderChar1IdxTable[] = { + 4, 4, 4, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5 +}; + +const uint8 LoLEngine::_reminderChar2IdxTable[] = { + 9, 9, 9, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6 +}; + +const uint8 LoLEngine::_reminderChar3IdxTable[] = { + 0xE, 0xE, 0xE, 0x7, 0x7, 0x7, 0x7, 0x7, + 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, + 0x7 +}; + +const uint8 LoLEngine::_reminderChar4IdxTable[] = { + 0xF, 0xF, 0xF, 0x8, 0x8, 0x8, 0x8, 0x8, + 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, + 0x8 +}; + +const uint8 LoLEngine::_selectionAnimIndexTable[] = { + 0, 5, 1, 6, 2, 7, 3, 8 +}; + +const uint8 LoLEngine::_charInfoFrameTable[] = { + 0x0, 0x7, 0x8, 0x9, 0xA, 0xB, 0xA, 0x9, + 0x8, 0x7, 0x0, 0x0, 0x7, 0x8, 0x9, 0xA, + 0xB, 0xA, 0x9, 0x8, 0x7, 0x0, 0x0, 0x7, + 0x8, 0x9, 0xA, 0xB, 0xA, 0x9, 0x8, 0x7 +}; + +const uint8 LoLEngine::_clock2Timers[] = { + 0x00, 0x10, 0x11, 0x03, 0x04, 0x50, + 0x51, 0x52, 0x08, 0x09, 0x0A +}; + +const uint8 LoLEngine::_numClock2Timers = ARRAYSIZE(LoLEngine::_clock2Timers); + +const int8 LoLEngine::_mapCoords[12][4] = { + { 0, 7, 0, -5 }, { -5, 0, 6, 0 }, { 7, 5, 7, 1 }, + { 5, 6, 4, 6 }, { 0, 7, 0, -1 }, { -3, 0, 6, 0 }, + { 6, 7, 6, -3 }, { -3, 5, 6, 5 }, { 1, 5, 1, 1 }, + { 3, 1, 3, 1 }, { -1, 6, -1, -8 }, { -7, -1, 5, -1 } +}; + +const MistOfDoomAnimData LoLEngine::_mistAnimData[] = { + { 0, 7, 7, 13, 155 }, + { 0, 16, 16, 17, 155 }, + { 0, 24, 24, 24, 174 }, + { 0, 19, 19, 19, 174 }, + { 0, 16, 16, 17, 175 }, +}; + +const char * const LoLEngine::_outroShapeFileTable[] = { + "AMAZON.SHP", "ARCHRSLG.SHP", "AVIANWRM.SHP", "BANDIT.SHP", "BOAR.SHP", "CABAL.SHP", + "GUARD.SHP", "HAG.SHP", "HORNET.SHP", "HURZELL.SHP", "IRONGRZR.SHP", "KNOWLES.SHP", + "LIZARD.SHP", "MANTHA.SHP", "MINOTAUR.SHP", "MORIBUND.SHP", "ORC.SHP", "ORCLDR.SHP", + "PENTROG.SHP", "RATMAN.SHP", "ROCKLING.SHP", "SCAVNGR.SHP", "STARK.SHP", + "SWAMPCIT.SHP", "SWAMPMON.SHP", "THUG.SHP", "VIPER.SHP", "XEOB.SHP" +}; + +const uint8 LoLEngine::_outroFrameTable[] = { + 0, 0, 0, 0, 0, 1, 2, 3, + 0, 1, 2, 3, 8, 9, 10, 11, + 8, 9, 10, 11, 4, 5, 6, 7 +}; + +const int16 LoLEngine::_outroRightMonsterPos[] = { + 205, 55, 205, 55, 205, 55, 205, 55, + 205, 56, 207, 57, 208, 58, 210, 59, + 213, 60, 216, 61, 220, 61, 225, 61, + 230, 61, 235, 61, 240, 61, 240, 61, + 240, 61, 240, 61, 240, 61, 240, 61, + 240, 61, 265, 61, 290, 61, 315, 61 +}; + +const int16 LoLEngine::_outroLeftMonsterPos[] = { + 92, 55, 92, 55, 92, 55, 92, 55, + 92, 56, 90, 57, 85, 58, 77, 59, + 67, 60, 57, 61, 47, 61, 35, 61, + 35, 61, 35, 61, 35, 61, 35, 61, + 35, 61, 35, 61, 35, 61, 35, 61, + 35, 61, 10, 61, -20, 61, -45, 61 +}; + +const int16 LoLEngine::_outroRightDoorPos[] = { + 200, 41, 200, 29, 200, 17, 200, 5, + 200, -7, 200, -7, 200, -7, 200, -7, + 200, 5, 200, 17, 200, 29, 200, 41, + 200, 41, 200, 41, 200, 41, 200, 41, + 200, 41, 200, 41, 200, 41, 200, 41, + 200, 41, 200, 41, 200, 41, 200, 41 +}; + +const int16 LoLEngine::_outroLeftDoorPos[] = { + 72, 41, 72, 29, 72, 17, 72, 5, + 72, -7, 72, -7, 72, -7, 72, -7, + 72, 5, 72, 17, 72, 29, 72, 41, + 72, 41, 72, 41, 72, 41, 72, 41, + 72, 41, 72, 41, 72, 41, 72, 41, + 72, 41, 72, 41, 72, 41, 72, 41 +}; + +const int LoLEngine::_outroMonsterScaleTableX[] = { + 0x050, 0x050, 0x050, 0x050, 0x050, 0x05D, 0x070, 0x085, + 0x0A0, 0x0C0, 0x0E2, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100 +}; + +const int LoLEngine::_outroMonsterScaleTableY[] = { + 0x04C, 0x04C, 0x04C, 0x04C, 0x04C, 0x059, 0x06B, 0x080, + 0x099, 0x0B8, 0x0D9, 0x100, 0x100, 0x100, 0x100, 0x100, + 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x100 +}; + +} // End of namespace Kyra + +#endif + -- cgit v1.2.3 From a9414ebb08feea0353ab32b97f5e1234f232f302 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 22:04:40 +0000 Subject: SCI: Some slight work on robot files svn-id: r51176 --- engines/sci/engine/kgraphics.cpp | 5 +++++ engines/sci/graphics/robot.cpp | 33 ++++++++++++++++++++++++++------- engines/sci/graphics/robot.h | 1 - 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 299a4f5c81..bea91d7bf3 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -44,6 +44,7 @@ #include "sci/graphics/palette.h" #include "sci/graphics/paint16.h" #include "sci/graphics/ports.h" +#include "sci/graphics/robot.h" #include "sci/graphics/screen.h" #include "sci/graphics/text16.h" #include "sci/graphics/view.h" @@ -1318,6 +1319,10 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv) { int16 x = argv[4].toUint16(); int16 y = argv[5].toUint16(); warning("kRobot(init), id %d, obj %04x:%04x, flag %d, x=%d, y=%d", id, PRINT_REG(obj), flag, x, y); + GfxRobot *test = new GfxRobot(g_sci->getResMan(), g_sci->_gfxScreen, id); + test->draw(); + delete test; + } break; case 1: // LSL6 hires (startup) diff --git a/engines/sci/graphics/robot.cpp b/engines/sci/graphics/robot.cpp index d926e037f4..352dc8177c 100644 --- a/engines/sci/graphics/robot.cpp +++ b/engines/sci/graphics/robot.cpp @@ -28,6 +28,8 @@ #include "sci/graphics/screen.h" #include "sci/graphics/robot.h" +#include "common/file.h" + namespace Sci { #ifdef ENABLE_SCI32 @@ -38,15 +40,29 @@ GfxRobot::GfxRobot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId res } GfxRobot::~GfxRobot() { - _resMan->unlockResource(_resource); + delete[] _resourceData; } void GfxRobot::initData(GuiResourceId resourceId) { - _resource = _resMan->findResource(ResourceId(kResourceTypeRobot, resourceId), true); - if (!_resource) { - error("robot resource %d not found", resourceId); + char fileName[10]; + sprintf(fileName, "%d.rbt", resourceId); + + Common::File robotFile; + if (robotFile.open(fileName)) { + _resourceData = new byte[robotFile.size()]; + robotFile.read(_resourceData, robotFile.size()); + robotFile.close(); + } else { + warning("Unable to open robot file %s", fileName); + return; + } + + byte version = _resourceData[6]; + + if (version != 4 && version != 5) { + warning("Robot version %d isn't supported yet", version); + return; } - _resourceData = _resource->data; // sample data: // Header - 14 bytes @@ -152,8 +168,11 @@ void GfxRobot::initData(GuiResourceId resourceId) { // ^ ?? // 00000120: 70 70 70 70 70 70 70 70-70 70 70 70 70 70 70 70 pppppppppppppppp - _frameCount = READ_LE_UINT16(_resourceData + 12); - _frameSize = READ_LE_UINT32(_resourceData + 34); + _frameCount = READ_LE_UINT16(_resourceData + 14); + //_frameSize = READ_LE_UINT32(_resourceData + 34); + byte hasSound = _resourceData[25]; + + debug("Robot %d, %d frames, sound: %d\n", resourceId, _frameCount, hasSound); } // TODO: just trying around in here... diff --git a/engines/sci/graphics/robot.h b/engines/sci/graphics/robot.h index 80dae95f95..3ea9a7f735 100644 --- a/engines/sci/graphics/robot.h +++ b/engines/sci/graphics/robot.h @@ -45,7 +45,6 @@ private: GfxScreen *_screen; GuiResourceId _resourceId; - Resource *_resource; byte *_resourceData; uint16 _width; -- cgit v1.2.3 From 53893341fb150378f332e9150dc3c5a678e6d6f7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 22 Jul 2010 22:13:25 +0000 Subject: SCI: kSetCursor works the same in sci16 (coordinates are not a regular Rect, but bottom/right is the last allowed coordinate) svn-id: r51177 --- engines/sci/engine/kgraphics.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index bea91d7bf3..55d0de8261 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -150,14 +150,17 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { if (getSciVersion() >= SCI_VERSION_2) { top = argv[1].toSint16(); left = argv[0].toSint16(); - bottom = argv[3].toSint16() + 1; // bottom/right needs to get included in our movezone - right = argv[2].toSint16() + 1; + bottom = argv[3].toSint16(); + right = argv[2].toSint16(); } else { top = argv[0].toSint16(); left = argv[1].toSint16(); - bottom = argv[2].toSint16(); // TODO: check if sci16 behaved the same as sci32 + bottom = argv[2].toSint16(); right = argv[3].toSint16(); } + // bottom/right needs to be included into our movezone, because we compare it like any regular Common::Rect + bottom++; + right++; if ((right >= left) && (bottom >= top)) { Common::Rect rect = Common::Rect(left, top, right, bottom); -- cgit v1.2.3 From 1f60595cdcbc99c9e0ca55d7907bb853690df510 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 22 Jul 2010 22:13:28 +0000 Subject: SCI: Cleanup leftovers from the FreeSCI sound code svn-id: r51178 --- engines/sci/sound/soundcmd.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 8fa60e357b..495cf4b9dd 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -33,9 +33,6 @@ namespace Sci { -#define SCI1_SOUND_FLAG_MAY_PAUSE 1 /* Only here for completeness; The interpreter doesn't touch this bit */ -#define SCI1_SOUND_FLAG_SCRIPTED_PRI 2 /* but does touch this */ - SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion) : _resMan(resMan), _segMan(segMan), _kernel(kernel), _audio(audio), _soundVersion(soundVersion) { -- cgit v1.2.3 From 4b2fca203e19b831b76a7d0ec0ee3c5235ed89ee Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 22 Jul 2010 23:16:33 +0000 Subject: KYRA: Implement missing dialog code. This finally enables animations for all of Darm's talk sequences. svn-id: r51179 --- engines/kyra/kyra_lok.cpp | 1 + engines/kyra/kyra_lok.h | 2 ++ engines/kyra/text_lok.cpp | 22 ++++++++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp index cf61b58326..159230e928 100644 --- a/engines/kyra/kyra_lok.cpp +++ b/engines/kyra/kyra_lok.cpp @@ -234,6 +234,7 @@ Common::Error KyraEngine_LoK::init() { _talkingCharNum = -1; _charSayUnk3 = -1; + _disabledTalkAnimObject = _enabledTalkAnimObject = 0; memset(_currSentenceColor, 0, 3); _startSentencePalIndex = -1; _fadeText = false; diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index 239ca26a11..9f1eb282f5 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -473,6 +473,8 @@ protected: int8 _charSayUnk2; int8 _charSayUnk3; int8 _currHeadShape; + int8 _disabledTalkAnimObject; + int8 _enabledTalkAnimObject; uint8 _currSentenceColor[3]; int8 _startSentencePalIndex; bool _fadeText; diff --git a/engines/kyra/text_lok.cpp b/engines/kyra/text_lok.cpp index 3e45c0f286..79b16bc1be 100644 --- a/engines/kyra/text_lok.cpp +++ b/engines/kyra/text_lok.cpp @@ -137,8 +137,11 @@ void KyraEngine_LoK::endCharacterChat(int8 charNum, int16 convoInitialized) { _charSayUnk3 = -1; if (charNum > 4 && charNum < 11) { - //TODO: weird _game_inventory stuff here - //warning("STUB: endCharacterChat() for high charnums"); + _animator->sprites()[_disabledTalkAnimObject].active = 1; + _sprites->_anims[_disabledTalkAnimObject].play = true; + + _animator->sprites()[_enabledTalkAnimObject].active = 0; + _sprites->_anims[_enabledTalkAnimObject].play = false; } if (convoInitialized != 0) { @@ -225,8 +228,19 @@ int KyraEngine_LoK::initCharacterChat(int8 charNum) { _animator->restoreAllObjectBackgrounds(); if (charNum > 4 && charNum < 11) { - // TODO: Fill in weird _game_inventory stuff here - //warning("STUB: initCharacterChat() for high charnums"); + const uint8 animDisableTable[] = { 3, 1, 1, 5, 0, 6 }; + const uint8 animEnableTable[] = { 4, 2, 5, 6, 1, 7 }; + + _disabledTalkAnimObject = animDisableTable[charNum - 5]; + _enabledTalkAnimObject = animEnableTable[charNum - 5]; + + _animator->sprites()[_disabledTalkAnimObject].active = 0; + _sprites->_anims[_disabledTalkAnimObject].play = false; + + _animator->sprites()[_enabledTalkAnimObject].active = 1; + _sprites->_anims[_enabledTalkAnimObject].play = true; + + _charSayUnk2 = _enabledTalkAnimObject; } _animator->flagAllObjectsForRefresh(); -- cgit v1.2.3 From a2f6fd976b09985ac5414e4665018f1b8cd7716e Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 22 Jul 2010 23:54:19 +0000 Subject: SCI: Added Workaround for SQ4CD Droid in Supercomputer Maze. There are about 20 screens, but all screens seem to share the same script, 704, so have added a -1 general exception. svn-id: r51180 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 6e92e43e5e..743b7757ed 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -145,6 +145,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { { GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 795062d8e75851d8d5ac337edaa55834cfc6adee Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:12:29 +0000 Subject: KYRA: Cleanup. svn-id: r51181 --- engines/kyra/kyra_lok.h | 12 +++++------- engines/kyra/timer_lok.cpp | 31 ++++++++++++------------------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index 9f1eb282f5..aa28c70410 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -374,16 +374,14 @@ protected: //void setTimer19(); void setupTimers(); void timerUpdateHeadAnims(int timerNum); - void timerSetFlags1(int timerNum); - void timerSetFlags2(int timerNum); - void timerSetFlags3(int timerNum); - void timerCheckAnimFlag1(int timerNum); - void timerCheckAnimFlag2(int timerNum); + void timerTulipCreator(int timerNum); + void timerAsInvisibleTimeout(int timerNum); + void timerAsWillowispTimeout(int timerNum); void checkAmuletAnimFlags(); void timerRedrawAmulet(int timerNum); void timerFadeText(int timerNum); - void updateAnimFlag1(int timerNum); - void updateAnimFlag2(int timerNum); + void timerWillowispFrameTimer(int timerNum); + void timerInvisibleFrameTimer(int timerNum); void drawAmulet(); void setTextFadeTimerCountdown(int16 countdown); void setWalkspeed(uint8 newSpeed); diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp index 3a7d1ed0de..c3353138ad 100644 --- a/engines/kyra/timer_lok.cpp +++ b/engines/kyra/timer_lok.cpp @@ -48,11 +48,11 @@ void KyraEngine_LoK::setupTimers() { for (int i = 10; i <= 13; ++i) _timer->addTimer(i, 0, 420, 1); - _timer->addTimer(14, TimerV1(timerCheckAnimFlag2), 600, 1); + _timer->addTimer(14, TimerV1(timerAsWillowispTimeout), 600, 1); _timer->addTimer(15, TimerV1(timerUpdateHeadAnims), 11, 1); - _timer->addTimer(16, TimerV1(timerSetFlags1), 7200, 1); + _timer->addTimer(16, TimerV1(timerTulipCreator), 7200, 1); _timer->addTimer(17, 0 /*sub_15120*/, 7200, 1); - _timer->addTimer(18, TimerV1(timerCheckAnimFlag1), 600, 1); + _timer->addTimer(18, TimerV1(timerAsInvisibleTimeout), 600, 1); _timer->addTimer(19, TimerV1(timerRedrawAmulet), 600, 1); _timer->addTimer(20, 0, 7200, 1); @@ -67,8 +67,8 @@ void KyraEngine_LoK::setupTimers() { _timer->addTimer(30, 0, 10800, 1); _timer->addTimer(31, TimerV1(timerFadeText), -1, 1); - _timer->addTimer(32, TimerV1(updateAnimFlag1), 9, 1); - _timer->addTimer(33, TimerV1(updateAnimFlag2), 3, 1); + _timer->addTimer(32, TimerV1(timerWillowispFrameTimer), 9, 1); + _timer->addTimer(33, TimerV1(timerInvisibleFrameTimer), 3, 1); } void KyraEngine_LoK::timerUpdateHeadAnims(int timerNum) { @@ -89,7 +89,7 @@ void KyraEngine_LoK::timerUpdateHeadAnims(int timerNum) { _animator->animRefreshNPC(_talkingCharNum); } -void KyraEngine_LoK::timerSetFlags1(int timerNum) { +void KyraEngine_LoK::timerTulipCreator(int timerNum) { if (_currentCharacter->sceneId == 0x1C) return; @@ -111,16 +111,14 @@ void KyraEngine_LoK::timerFadeText(int timerNum) { _fadeText = true; } -void KyraEngine_LoK::updateAnimFlag1(int timerNum) { - if (_brandonStatusBit & 2) { +void KyraEngine_LoK::timerWillowispFrameTimer(int timerNum) { + if (_brandonStatusBit & 2) _brandonStatusBit0x02Flag = 1; - } } -void KyraEngine_LoK::updateAnimFlag2(int timerNum) { - if (_brandonStatusBit & 0x20) { +void KyraEngine_LoK::timerInvisibleFrameTimer(int timerNum) { + if (_brandonStatusBit & 0x20) _brandonStatusBit0x20Flag = 1; - } } void KyraEngine_LoK::setTextFadeTimerCountdown(int16 countdown) { @@ -130,19 +128,14 @@ void KyraEngine_LoK::setTextFadeTimerCountdown(int16 countdown) { _timer->setCountdown(31, countdown*60); } -void KyraEngine_LoK::timerSetFlags2(int timerNum) { - if (!((uint32 *)(_flagsTable+0x2D))[timerNum]) - ((uint32 *)(_flagsTable+0x2D))[timerNum] = 1; -} - -void KyraEngine_LoK::timerCheckAnimFlag1(int timerNum) { +void KyraEngine_LoK::timerAsInvisibleTimeout(int timerNum) { if (_brandonStatusBit & 0x20) { checkAmuletAnimFlags(); _timer->setCountdown(18, -1); } } -void KyraEngine_LoK::timerCheckAnimFlag2(int timerNum) { +void KyraEngine_LoK::timerAsWillowispTimeout(int timerNum) { if (_brandonStatusBit & 0x2) { checkAmuletAnimFlags(); _timer->setCountdown(14, -1); -- cgit v1.2.3 From 6cf1b59742fda8dbed4df8750eba1569dd2e6315 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:12:52 +0000 Subject: KYRA: Implemented some missing timers for object creation. svn-id: r51182 --- engines/kyra/kyra_lok.h | 4 +++ engines/kyra/timer_lok.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index aa28c70410..e6e88f7649 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -375,10 +375,14 @@ protected: void setupTimers(); void timerUpdateHeadAnims(int timerNum); void timerTulipCreator(int timerNum); + void timerRubyCreator(int timerNum); void timerAsInvisibleTimeout(int timerNum); void timerAsWillowispTimeout(int timerNum); void checkAmuletAnimFlags(); void timerRedrawAmulet(int timerNum); + void timerLavenderRoseCreator(int timerNum); + void timerAcornCreator(int timerNum); + void timerBlueberryCreator(int timerNum); void timerFadeText(int timerNum); void timerWillowispFrameTimer(int timerNum); void timerInvisibleFrameTimer(int timerNum); diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp index c3353138ad..9c73314fba 100644 --- a/engines/kyra/timer_lok.cpp +++ b/engines/kyra/timer_lok.cpp @@ -51,16 +51,19 @@ void KyraEngine_LoK::setupTimers() { _timer->addTimer(14, TimerV1(timerAsWillowispTimeout), 600, 1); _timer->addTimer(15, TimerV1(timerUpdateHeadAnims), 11, 1); _timer->addTimer(16, TimerV1(timerTulipCreator), 7200, 1); - _timer->addTimer(17, 0 /*sub_15120*/, 7200, 1); + _timer->addTimer(17, TimerV1(timerRubyCreator), 7200, 1); _timer->addTimer(18, TimerV1(timerAsInvisibleTimeout), 600, 1); _timer->addTimer(19, TimerV1(timerRedrawAmulet), 600, 1); _timer->addTimer(20, 0, 7200, 1); - _timer->addTimer(21, 0/*sub_1517C*/, 18000, 1); + _timer->addTimer(21, TimerV1(timerLavenderRoseCreator), 18000, 1); _timer->addTimer(22, 0, 7200, 1); - for (int i = 23; i <= 27; ++i) - _timer->addTimer(i, 0, 10800, 1); + _timer->addTimer(23, 0, 10800, 1); + _timer->addTimer(24, TimerV1(timerAcornCreator), 10800, 1); + _timer->addTimer(25, 0, 10800, 1); + _timer->addTimer(26, TimerV1(timerBlueberryCreator), 10800, 1); + _timer->addTimer(27, 0, 10800, 1); _timer->addTimer(28, 0, 21600, 1); _timer->addTimer(29, 0, 7200, 1); @@ -107,6 +110,78 @@ void KyraEngine_LoK::timerTulipCreator(int timerNum) { } } +void KyraEngine_LoK::timerRubyCreator(int timerNum) { + if (_currentCharacter->sceneId == 0x23) + return; + + int rndNr = _rnd.getRandomNumberRng(0, 3); + + for (int i = 0; i < 4; i++) { + if (!queryGameFlag(rndNr + 22)) { + setGameFlag(rndNr + 22); + break; + } else { + rndNr++; + if (rndNr > 3) + rndNr = 0; + } + } +} + +void KyraEngine_LoK::timerLavenderRoseCreator(int timerNum) { + if (_currentCharacter->sceneId == 0x06) + return; + + int rndNr = _rnd.getRandomNumberRng(0, 4); + + for (int i = 0; i < 5; i++) { + if (!queryGameFlag(rndNr)) { + setGameFlag(rndNr); + break; + } else { + rndNr++; + if (rndNr > 4) + rndNr = 0; + } + } +} + +void KyraEngine_LoK::timerAcornCreator(int timerNum) { + if (_currentCharacter->sceneId == 0x1F) + return; + + int rndNr = _rnd.getRandomNumberRng(0, 5); + + for (int i = 0; i < 6; i++) { + if (!queryGameFlag(rndNr + 72)) { + setGameFlag(rndNr + 72); + break; + } else { + rndNr++; + if (rndNr > 5) + rndNr = 0; + } + } +} + +void KyraEngine_LoK::timerBlueberryCreator(int timerNum) { + if (_currentCharacter->sceneId == 0x28) + return; + + int rndNr = _rnd.getRandomNumberRng(0, 7); + + for (int i = 0; i < 8; i++) { + if (!queryGameFlag(rndNr + 26)) { + setGameFlag(rndNr + 26); + break; + } else { + rndNr++; + if (rndNr > 7) + rndNr = 0; + } + } +} + void KyraEngine_LoK::timerFadeText(int timerNum) { _fadeText = true; } -- cgit v1.2.3 From ba8ec806ba2746210217950b12c6dce9a5bb1696 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:13:21 +0000 Subject: KYRA: Cleanup. svn-id: r51183 --- engines/kyra/kyra_lok.h | 2 ++ engines/kyra/timer_lok.cpp | 66 +++++++++------------------------------------- 2 files changed, 15 insertions(+), 53 deletions(-) diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index e6e88f7649..b37a14bad4 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -390,6 +390,8 @@ protected: void setTextFadeTimerCountdown(int16 countdown); void setWalkspeed(uint8 newSpeed); + void setItemCreationFlags(int offset, int count); + int buttonInventoryCallback(Button *caller); int buttonAmuletCallback(Button *caller); diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp index 9c73314fba..0fba739ed0 100644 --- a/engines/kyra/timer_lok.cpp +++ b/engines/kyra/timer_lok.cpp @@ -96,87 +96,47 @@ void KyraEngine_LoK::timerTulipCreator(int timerNum) { if (_currentCharacter->sceneId == 0x1C) return; - int rndNr = _rnd.getRandomNumberRng(0, 3); - - for (int i = 0; i < 4; i++) { - if (!queryGameFlag(rndNr + 17)) { - setGameFlag(rndNr + 17); - break; - } else { - rndNr++; - if (rndNr > 3) - rndNr = 0; - } - } + setItemCreationFlags(17, 3); } void KyraEngine_LoK::timerRubyCreator(int timerNum) { if (_currentCharacter->sceneId == 0x23) return; - int rndNr = _rnd.getRandomNumberRng(0, 3); - - for (int i = 0; i < 4; i++) { - if (!queryGameFlag(rndNr + 22)) { - setGameFlag(rndNr + 22); - break; - } else { - rndNr++; - if (rndNr > 3) - rndNr = 0; - } - } + setItemCreationFlags(22, 4); } void KyraEngine_LoK::timerLavenderRoseCreator(int timerNum) { if (_currentCharacter->sceneId == 0x06) return; - int rndNr = _rnd.getRandomNumberRng(0, 4); - - for (int i = 0; i < 5; i++) { - if (!queryGameFlag(rndNr)) { - setGameFlag(rndNr); - break; - } else { - rndNr++; - if (rndNr > 4) - rndNr = 0; - } - } + setItemCreationFlags(0, 4); } void KyraEngine_LoK::timerAcornCreator(int timerNum) { if (_currentCharacter->sceneId == 0x1F) return; - int rndNr = _rnd.getRandomNumberRng(0, 5); - - for (int i = 0; i < 6; i++) { - if (!queryGameFlag(rndNr + 72)) { - setGameFlag(rndNr + 72); - break; - } else { - rndNr++; - if (rndNr > 5) - rndNr = 0; - } - } + setItemCreationFlags(72, 5); } void KyraEngine_LoK::timerBlueberryCreator(int timerNum) { if (_currentCharacter->sceneId == 0x28) return; - int rndNr = _rnd.getRandomNumberRng(0, 7); + setItemCreationFlags(26, 7); +} + +void KyraEngine_LoK::setItemCreationFlags(int offset, int count) { + int rndNr = _rnd.getRandomNumberRng(0, count); - for (int i = 0; i < 8; i++) { - if (!queryGameFlag(rndNr + 26)) { - setGameFlag(rndNr + 26); + for (int i = 0; i <= count; i++) { + if (!queryGameFlag(rndNr + offset)) { + setGameFlag(rndNr + offset); break; } else { rndNr++; - if (rndNr > 7) + if (rndNr > count) rndNr = 0; } } -- cgit v1.2.3 From 577e99c4323de51dedeff41fd47aea0b8bdbdcab Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:17:08 +0000 Subject: KYRA: Mention the minor fixes for Kyra1 in the NEWS. svn-id: r51184 --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 6ce5f2b898..aac0b7f7e4 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,10 @@ For a more comprehensive changelog for the latest experimental SVN code, see: - Added support for the Macintosh version of The 7th Guest. - Added support for custom MT-32 instruments. + KYRA: + - Fixed some minor graphical glitches. + - Implemented formerly missing recreation of some in game items. + Parallaction: - Made part one of The Big Red Adventure completable. -- cgit v1.2.3 From cef77cdae271c4d67ec7615069cee774b2c64e3d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:38:52 +0000 Subject: KYRA: Formatting fixes. svn-id: r51186 --- engines/kyra/timer_lok.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp index 0fba739ed0..40426a3dfe 100644 --- a/engines/kyra/timer_lok.cpp +++ b/engines/kyra/timer_lok.cpp @@ -76,8 +76,11 @@ void KyraEngine_LoK::setupTimers() { void KyraEngine_LoK::timerUpdateHeadAnims(int timerNum) { static int8 currentFrame = 0; - static const int8 frameTable[] = {4, 5, 4, 5, 4, 5, 0, 1, 4, 5, - 4, 4, 6, 4, 8, 1, 9, 4, -1}; + static const int8 frameTable[] = { + 4, 5, 4, 5, 4, 5, 0, 1, + 4, 5, 4, 4, 6, 4, 8, 1, + 9, 4, -1 + }; if (_talkingCharNum < 0) return; -- cgit v1.2.3 From 6da04bc13bdd76ae0230d9eeb3e00eb11b55b20a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 00:39:23 +0000 Subject: KYRA: Implement support for selecting the VQA quality via "video_quality". svn-id: r51187 --- engines/kyra/kyra_mr.cpp | 7 ++++--- engines/kyra/kyra_mr.h | 1 + engines/kyra/vqa.cpp | 4 ++-- engines/kyra/vqa.h | 3 --- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp index cf90c73dbd..61bc3708c3 100644 --- a/engines/kyra/kyra_mr.cpp +++ b/engines/kyra/kyra_mr.cpp @@ -369,9 +369,7 @@ void KyraEngine_MR::playVQA(const char *name) { VQAMovie vqa(this, _system); char filename[20]; - int size = 0; // TODO: Movie size is 0, 1 or 2. - - snprintf(filename, sizeof(filename), "%s%d.VQA", name, size); + snprintf(filename, sizeof(filename), "%s%d.VQA", name, _configVQAQuality); if (vqa.open(filename)) { for (int i = 0; i < 4; ++i) { @@ -1460,6 +1458,8 @@ void KyraEngine_MR::registerDefaultSettings() { ConfMan.registerDefault("studio_audience", true); ConfMan.registerDefault("skip_support", true); ConfMan.registerDefault("helium_mode", false); + // 0 - best, 1 - mid, 2 - low + ConfMan.registerDefault("video_quality", 0); } void KyraEngine_MR::writeSettings() { @@ -1495,6 +1495,7 @@ void KyraEngine_MR::readSettings() { _configStudio = ConfMan.getBool("studio_audience"); _configSkip = ConfMan.getBool("skip_support"); _configHelium = ConfMan.getBool("helium_mode"); + _configVQAQuality = CLIP(ConfMan.getInt("video_quality"), 0, 2); } } // End of namespace Kyra diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h index 773b0a1699..36b937f2a8 100644 --- a/engines/kyra/kyra_mr.h +++ b/engines/kyra/kyra_mr.h @@ -73,6 +73,7 @@ private: bool _configStudio; bool _configSkip; bool _configHelium; + int _configVQAQuality; void registerDefaultSettings(); void writeSettings(); diff --git a/engines/kyra/vqa.cpp b/engines/kyra/vqa.cpp index 8a598591bb..d0e54f996b 100644 --- a/engines/kyra/vqa.cpp +++ b/engines/kyra/vqa.cpp @@ -260,8 +260,8 @@ bool VQAMovie::open(const char *filename) { _header.bits = 8; } - setX((Screen::SCREEN_W - _header.width) / 2); - setY((Screen::SCREEN_H - _header.height) / 2); + _x = (Screen::SCREEN_W - _header.width) / 2; + _y = (Screen::SCREEN_H - _header.height) / 2; _frameInfo = new uint32[_header.numFrames]; _frame = new byte[_header.width * _header.height]; diff --git a/engines/kyra/vqa.h b/engines/kyra/vqa.h index c1448a4865..129d526e98 100644 --- a/engines/kyra/vqa.h +++ b/engines/kyra/vqa.h @@ -56,9 +56,6 @@ public: // It's unlikely that we ever want to change the movie position from // its default. - void setX(int x) { _x = x; } - void setY(int y) { _y = y; } - void setDrawPage(int page) { _drawPage = page; } bool open(const char *filename); -- cgit v1.2.3 From 3aa4f76ee422b42b6588296862e01eb3e8a50357 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 23 Jul 2010 07:36:55 +0000 Subject: SCI: Now saving the kPalVary state inside savegames svn-id: r51194 --- engines/sci/engine/savegame.cpp | 22 ++++++++++++++++++++++ engines/sci/engine/savegame.h | 2 +- engines/sci/graphics/helpers.h | 16 ++++++++++++++++ engines/sci/graphics/palette.h | 4 +++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c080120d7b..72f6ae28a7 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -40,6 +40,7 @@ #include "sci/engine/selector.h" #include "sci/engine/vm_types.h" #include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS +#include "sci/graphics/palette.h" #include "sci/graphics/ports.h" #include "sci/sound/audio.h" #include "sci/sound/music.h" @@ -628,6 +629,27 @@ void StringTable::saveLoadWithSerializer(Common::Serializer &ser) { } #endif +void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { + if (s.getVersion() < 24) + return; + + if (s.isLoading() && _palVaryResourceId != -1) + palVaryRemoveTimer(); + + s.syncAsSint32LE(_palVaryResourceId); + _palVaryOriginPalette.saveLoadWithSerializer(s); + _palVaryTargetPalette.saveLoadWithSerializer(s); + s.syncAsSint16LE(_palVaryStep); + s.syncAsSint16LE(_palVaryStepStop); + s.syncAsSint16LE(_palVaryDirection); + s.syncAsUint16LE(_palVaryTicks); + s.syncAsSint32LE(_palVaryPaused); + s.syncAsSint32LE(_palVarySignal); + + if (s.isLoading() && _palVaryResourceId != -1) + palVaryInstallTimer(); +} + void SegManager::reconstructStack(EngineState *s) { DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]); s->stack_base = stack->_entries; diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 9a882f2bf7..799a68cbbe 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -36,7 +36,7 @@ namespace Sci { struct EngineState; enum { - CURRENT_SAVEGAME_VERSION = 23, + CURRENT_SAVEGAME_VERSION = 24, MINIMUM_SAVEGAME_VERSION = 12 }; diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h index f0ffecfb59..115a4c996e 100644 --- a/engines/sci/graphics/helpers.h +++ b/engines/sci/graphics/helpers.h @@ -28,6 +28,7 @@ #include "common/endian.h" // for READ_LE_UINT16 #include "common/rect.h" +#include "common/serializer.h" #include "sci/engine/vm_types.h" namespace Sci { @@ -82,6 +83,13 @@ struct Window : public Port { struct Color { byte used; byte r, g, b; + + void saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsByte(used); + s.syncAsByte(r); + s.syncAsByte(g); + s.syncAsByte(b); + } }; struct Palette { @@ -89,6 +97,14 @@ struct Palette { uint32 timestamp; Color colors[256]; byte intensity[256]; + + void saveLoadWithSerializer(Common::Serializer &s) { + s.syncBytes(mapping, 256); + s.syncAsUint32LE(timestamp); + for (int i = 0; i < 256; i++) + colors[i].saveLoadWithSerializer(s); + s.syncBytes(intensity, 256); + } }; struct PalSchedule { diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 6af1d5a490..b9cd308281 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -34,7 +34,7 @@ class Screen; /** * Palette class, handles palette operations like changing intensity, setting up the palette, merging different palettes */ -class GfxPalette { +class GfxPalette : public Common::Serializable { public: GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMerging); ~GfxPalette(); @@ -80,6 +80,8 @@ public: Palette _sysPalette; + virtual void saveLoadWithSerializer(Common::Serializer &s); + private: void palVaryInit(); void palVaryInstallTimer(); -- cgit v1.2.3 From 15eebdb0618c82f80e7cdf83141552ff8da228b4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 08:08:27 +0000 Subject: SCI: some changes to kPalVary saving still needs to get tested svn-id: r51196 --- engines/sci/engine/savegame.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 72f6ae28a7..8074ebd9a9 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -637,17 +637,20 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { palVaryRemoveTimer(); s.syncAsSint32LE(_palVaryResourceId); - _palVaryOriginPalette.saveLoadWithSerializer(s); - _palVaryTargetPalette.saveLoadWithSerializer(s); - s.syncAsSint16LE(_palVaryStep); - s.syncAsSint16LE(_palVaryStepStop); - s.syncAsSint16LE(_palVaryDirection); - s.syncAsUint16LE(_palVaryTicks); - s.syncAsSint32LE(_palVaryPaused); - s.syncAsSint32LE(_palVarySignal); + if (_palVaryResourceId != -1) { + _palVaryOriginPalette.saveLoadWithSerializer(s); + _palVaryTargetPalette.saveLoadWithSerializer(s); + s.syncAsSint16LE(_palVaryStep); + s.syncAsSint16LE(_palVaryStepStop); + s.syncAsSint16LE(_palVaryDirection); + s.syncAsUint16LE(_palVaryTicks); + s.syncAsSint32LE(_palVaryPaused); + } - if (s.isLoading() && _palVaryResourceId != -1) + if (s.isLoading() && _palVaryResourceId != -1) { + _palVarySignal = 0; palVaryInstallTimer(); + } } void SegManager::reconstructStack(EngineState *s) { -- cgit v1.2.3 From 9db77be9d42b05edd4f76fb1b2ed99e02aa43a8f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 23 Jul 2010 08:22:13 +0000 Subject: SCI: Dropped support for the very old savegame versions 12 and 13 (hopefully, the last ones to be dropped) svn-id: r51197 --- engines/sci/engine/savegame.cpp | 113 ++++++++-------------------------------- engines/sci/engine/savegame.h | 2 +- 2 files changed, 24 insertions(+), 91 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 8074ebd9a9..c7c8b2ea53 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -65,47 +65,20 @@ const uint32 INTMAPPER_MAGIC_KEY = 0xDEADBEEF; #define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle & 0xffff)) void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { - if (s.getVersion() < 14) { - // Old sound system data. This data is only loaded, never saved (as we're never - // saving in the older version format) - uint32 handle = 0; - s.syncAsSint32LE(handle); - soundObj = DEFROBNICATE_HANDLE(handle); - s.syncAsSint32LE(resourceId); - s.syncAsSint32LE(priority); - s.syncAsSint32LE(status); - s.skip(4); // restoreBehavior - uint32 restoreTime = 0; - s.syncAsSint32LE(restoreTime); - ticker = restoreTime * 60 / 1000; - s.syncAsSint32LE(loop); - s.syncAsSint32LE(hold); - // volume and dataInc will be synced from the sound objects - // when the sound list is reconstructed in gamestate_restore() - volume = MUSIC_VOLUME_MAX; - dataInc = 0; - // No fading info - fadeTo = 0; - fadeStep = 0; - fadeTicker = 0; - fadeTickerStep = 0; - } else { - // A bit more optimized saving - soundObj.saveLoadWithSerializer(s); - s.syncAsSint16LE(resourceId); - s.syncAsSint16LE(dataInc); - s.syncAsSint16LE(ticker); - s.syncAsSint16LE(signal, VER(17)); - s.syncAsByte(priority); - s.syncAsSint16LE(loop, VER(17)); - s.syncAsByte(volume); - s.syncAsByte(hold, VER(17)); - s.syncAsByte(fadeTo); - s.syncAsSint16LE(fadeStep); - s.syncAsSint32LE(fadeTicker); - s.syncAsSint32LE(fadeTickerStep); - s.syncAsByte(status); - } + soundObj.saveLoadWithSerializer(s); + s.syncAsSint16LE(resourceId); + s.syncAsSint16LE(dataInc); + s.syncAsSint16LE(ticker); + s.syncAsSint16LE(signal, VER(17)); + s.syncAsByte(priority); + s.syncAsSint16LE(loop, VER(17)); + s.syncAsByte(volume); + s.syncAsByte(hold, VER(17)); + s.syncAsByte(fadeTo); + s.syncAsSint16LE(fadeStep); + s.syncAsSint32LE(fadeTicker); + s.syncAsSint32LE(fadeTickerStep); + s.syncAsByte(status); // pMidiParser and pStreamAud will be initialized when the // sound list is reconstructed in gamestate_restore() @@ -182,7 +155,7 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { if (s.isLoading()) resetSegMan(); - s.skip(4, VER(12), VER(18)); // OBSOLETE: Used to be _exportsAreWide + s.skip(4, VER(14), VER(18)); // OBSOLETE: Used to be _exportsAreWide if (s.isLoading()) { // Reset _scriptSegMap, to be restored below @@ -257,40 +230,9 @@ static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) void EngineState::saveLoadWithSerializer(Common::Serializer &s) { Common::String tmp; - s.syncString(tmp, VER(12), VER(23)); // OBSOLETE: Used to be game_version - - // OBSOLETE: Saved menus. Skip all of the saved data - if (s.getVersion() < 14) { - int totalMenus = 0; - s.syncAsUint32LE(totalMenus); - - // Now iterate through the obsolete saved menu data - for (int i = 0; i < totalMenus; i++) { - s.syncString(tmp); // OBSOLETE: Used to be _title - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _titleWidth - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _width - - int menuLength = 0; - s.syncAsUint32LE(menuLength); - - for (int j = 0; j < menuLength; j++) { - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _type - s.syncString(tmp); // OBSOLETE: Used to be _keytext - - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _flags - s.skip(64, VER(12), VER(12)); // OBSOLETE: Used to be MENU_SAID_SPEC_SIZE - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _saidPos - s.syncString(tmp); // OBSOLETE: Used to be _text - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _textPos - s.skip(4 * 4, VER(12), VER(12)); // OBSOLETE: Used to be _modifiers, _key, _enabled and _tag - } - } - } + s.syncString(tmp, VER(14), VER(23)); // OBSOLETE: Used to be game_version - s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_foreground - s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_background - - if (s.getVersion() >= 13 && getSciVersion() <= SCI_VERSION_1_1) { + if (getSciVersion() <= SCI_VERSION_1_1) { // Save/Load picPort as well for SCI0-SCI1.1. Necessary for Castle of Dr. Brain, // as the picPort has been changed when loading during the intro int16 picPortTop, picPortLeft; @@ -324,7 +266,6 @@ void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { void Object::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_flags); _pos.saveLoadWithSerializer(s); - s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be variable_names_nr s.syncAsSint32LE(_methodCount); // that's actually a uint16 syncArray(s, _variables); @@ -450,12 +391,12 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { if (s.isLoading()) init(_nr, g_sci->getResMan()); - s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _bufSize - s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _scriptSize - s.skip(4, VER(12), VER(22)); // OBSOLETE: Used to be _heapSize + s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _bufSize + s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _scriptSize + s.skip(4, VER(14), VER(22)); // OBSOLETE: Used to be _heapSize - s.skip(4, VER(12), VER(19)); // OBSOLETE: Used to be _numExports - s.skip(4, VER(12), VER(19)); // OBSOLETE: Used to be _numSynonyms + s.skip(4, VER(14), VER(19)); // OBSOLETE: Used to be _numExports + s.skip(4, VER(14), VER(19)); // OBSOLETE: Used to be _numSynonyms s.syncAsSint32LE(_lockers); // Sync _objects. This is a hashmap, and we use the following on disk format: @@ -483,7 +424,7 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { } } - s.skip(4, VER(12), VER(20)); // OBSOLETE: Used to be _localsOffset + s.skip(4, VER(14), VER(20)); // OBSOLETE: Used to be _localsOffset s.syncAsSint32LE(_localsSegment); s.syncAsSint32LE(_markedAsDeleted); @@ -600,14 +541,6 @@ void SoundCommandParser::reconstructPlayList(int savegame_version) { (*i)->soundRes = 0; } if ((*i)->status == kSoundPlaying) { - if (savegame_version < 14) { - (*i)->dataInc = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(dataInc)); - (*i)->signal = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(signal)); - - if (_soundVersion >= SCI_VERSION_1_LATE) - (*i)->volume = readSelectorValue(_segMan, (*i)->soundObj, SELECTOR(vol)); - } - processPlaySound((*i)->soundObj); } } diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 799a68cbbe..fc254ba33d 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -37,7 +37,7 @@ struct EngineState; enum { CURRENT_SAVEGAME_VERSION = 24, - MINIMUM_SAVEGAME_VERSION = 12 + MINIMUM_SAVEGAME_VERSION = 14 }; // Savegame metadata -- cgit v1.2.3 From 19042d78737ba1517f0b5e409730ed7f9703ed5c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 23 Jul 2010 08:26:20 +0000 Subject: SCI: Actually sync kPalVary data when saving/loading svn-id: r51198 --- engines/sci/engine/savegame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c7c8b2ea53..3de555cad3 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -255,6 +255,7 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { _segMan->saveLoadWithSerializer(s); g_sci->_soundCmd->syncPlayList(s); + g_sci->_gfxPalette->saveLoadWithSerializer(s); } void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { -- cgit v1.2.3 From 05999d1e5907747a39d3f3e4b73bac1929031600 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 09:13:54 +0000 Subject: SCI: adding workarounds for lsl6hires svn-id: r51199 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 743b7757ed..3861ad3228 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -38,6 +38,7 @@ const SciWorkaroundEntry opcodeDivWorkarounds[] = { // gameID, room,script,lvl, object-name, method-name, call, index, workaround const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + { GID_LSL6HIRES, 360,64938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -79,6 +80,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area + { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 42851e047f9c8bef8d20a1854ff50dfd11a41741 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 23 Jul 2010 09:49:40 +0000 Subject: Lots of action related fields added; scroll over default action is now displayed on-screen svn-id: r51200 --- engines/m4/animation.cpp | 8 +- engines/m4/animation.h | 3 +- engines/m4/hotspot.cpp | 1 + engines/m4/hotspot.h | 3 + engines/m4/m4_scene.cpp | 2 +- engines/m4/m4_scene.h | 2 +- engines/m4/mads_scene.cpp | 226 ++++----------------------------------- engines/m4/mads_scene.h | 44 +------- engines/m4/mads_views.cpp | 263 ++++++++++++++++++++++++++++++++++++++++++++-- engines/m4/mads_views.h | 68 +++++++++++- engines/m4/scene.cpp | 2 +- engines/m4/scene.h | 2 +- 12 files changed, 360 insertions(+), 264 deletions(-) diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 0ead57aac9..37314eff44 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -287,8 +287,8 @@ void MadsAnimation::load(const Common::String &filename, int abortTimers) { _abortTimers = abortTimers; _abortMode = _madsVm->scene()->_abortTimersMode2; - for (int i = 0; i < 3; ++i) - _actionNouns[i] = _madsVm->globals()->actionNouns[i]; + if (_madsVm->_scene) + _actionNouns = _madsVm->scene()->_action._action; // Initialise kernel message list for (uint i = 0; i < _messages.size(); ++i) @@ -464,8 +464,8 @@ void MadsAnimation::update() { if (_abortMode != ABORTMODE_1) { // Copy the noun list - for (int i = 0; i < 3; ++i) - _madsVm->globals()->actionNouns[i] = _actionNouns[i]; + if (_madsVm->_scene) + _madsVm->scene()->_action._action = _actionNouns; } } } diff --git a/engines/m4/animation.h b/engines/m4/animation.h index 583d829066..a7a6b57c32 100644 --- a/engines/m4/animation.h +++ b/engines/m4/animation.h @@ -104,8 +104,7 @@ private: int _messageCtr; int _abortTimers; AbortTimerMode _abortMode; - uint16 _actionNouns[3]; - + ActionDetails _actionNouns; void load1(int frameNumber); bool proc1(SpriteAsset &spriteSet, const Common::Point &pt, int frameNumber); diff --git a/engines/m4/hotspot.cpp b/engines/m4/hotspot.cpp index 9849cc7416..4eec50e29d 100644 --- a/engines/m4/hotspot.cpp +++ b/engines/m4/hotspot.cpp @@ -206,6 +206,7 @@ void HotSpotList::loadHotSpots(Common::SeekableReadStream* hotspotStream, int ho y2 = readHotSpotInteger(hotspotStream); index = add(new HotSpot(x1, y1, x2, y2), i == 0); currentHotSpot = get(index); + currentHotSpot->setIndex(index); feetX = readHotSpotInteger(hotspotStream); feetY = readHotSpotInteger(hotspotStream); currentHotSpot->setFeet(feetX, feetY); diff --git a/engines/m4/hotspot.h b/engines/m4/hotspot.h index 5bb4f5888a..b06865c39a 100644 --- a/engines/m4/hotspot.h +++ b/engines/m4/hotspot.h @@ -73,6 +73,8 @@ public: int getFeetY() { return _feetY; } int8 getArticle() const { return _articleNumber; } Common::Rect getRect() const; + int getIndex() const { return _index; } + void setIndex(int index) { _index = index; } int32 area() const { return (_rect.width() - 1) * (_rect.height() - 1); } bool pointInside(int x, int y) { return _rect.contains(x, y); } @@ -83,6 +85,7 @@ private: bool _active; int _feetX, _feetY; uint8 _facing, _cursor; + int _index; // Unused in Orion Burger, used in MADS games uint8 _syntax; diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp index 79122a9564..0c984af448 100644 --- a/engines/m4/m4_scene.cpp +++ b/engines/m4/m4_scene.cpp @@ -207,7 +207,7 @@ void M4Scene::leaveScene() { Scene::leaveScene(); } -void M4Scene::checkHotspotAtMousePos(int x, int y) { +void M4Scene::mouseMove(int x, int y) { if (_vm->getGameType() == GType_Riddle) return; diff --git a/engines/m4/m4_scene.h b/engines/m4/m4_scene.h index 329582caf4..2216779a3e 100644 --- a/engines/m4/m4_scene.h +++ b/engines/m4/m4_scene.h @@ -69,7 +69,7 @@ public: virtual void leaveScene(); virtual void loadSceneCodes(int sceneNumber, int index = 0); virtual void show(); - virtual void checkHotspotAtMousePos(int x, int y); + virtual void mouseMove(int x, int y); virtual void leftClick(int x, int y); virtual void rightClick(int x, int y); virtual void update(); diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 8ffe6b8c95..2ee60ae6d4 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -241,44 +241,20 @@ void MadsScene::loadSceneCodes(int sceneNumber, int index) { } } -void MadsScene::checkHotspotAtMousePos(int x, int y) { +void MadsScene::mouseMove(int x, int y) { HotSpot *currentHotSpot = _sceneResources.hotspots->findByXY(x, y); if (currentHotSpot != NULL) { _vm->_mouse->setCursorNum(currentHotSpot->getCursor()); - // This is the "easy" interface, which updates the status text when the mouse is moved - // TODO: toggle this code for easy/normal interface mode - char statusText[50]; - int verbId = 0;//***DEBUG****_currentAction; - if (verbId == kVerbNone) - verbId = currentHotSpot->getVerbID(); - if (verbId == kVerbNone) - verbId = kVerbWalkTo; - - sprintf(statusText, "%s %s\n", _madsVm->globals()->getVocab(verbId), currentHotSpot->getVocab()); + _action._hotspotId = currentHotSpot->getIndex(); + - statusText[0] = toupper(statusText[0]); // capitalize first letter - setStatusText(statusText); } else { _vm->_mouse->setCursorNum(0); - setStatusText(""); } } void MadsScene::leftClick(int x, int y) { - HotSpot *currentHotSpot = _sceneResources.hotspots->findByXY(x, y); - if (currentHotSpot != NULL) { - char statusText[50]; - if (currentHotSpot->getVerbID() != 0) { - sprintf(statusText, "%s %s\n", currentHotSpot->getVerb(), currentHotSpot->getVocab()); - } else { - sprintf(statusText, "%s %s\n", _madsVm->globals()->getVocab(kVerbWalkTo), currentHotSpot->getVocab()); - } - - statusText[0] = toupper(statusText[0]); // capitalize first letter - setStatusText(statusText); - } - // **DEBUG** - being used for movement testing _madsVm->_player.moveComplete(); _madsVm->_player.setDest(x, y, 2); @@ -297,7 +273,6 @@ void MadsScene::rightClick(int x, int y) { void MadsScene::setAction(int action, int objectId) { VALIDATE_MADS; - char statusText[50]; error("todo"); // TODO: Actually executing actions directly for objects. Also, some object actions are special in that @@ -314,7 +289,7 @@ void MadsScene::setAction(int action, int objectId) { _currentAction = action; } */ - setStatusText(statusText); +// setStatusText(statusText); } /** @@ -349,6 +324,17 @@ void MadsScene::update() { } void MadsScene::updateState() { + if ((_action._selectedAction != 0) || !_madsVm->_player._stepEnabled) + _action.clear(); + + if (!_abortTimers && !_madsVm->_player._unk3) { + if (_dynamicHotspots._changed) + _dynamicHotspots.refresh(); + +// int v = (_madsVm->_player._stepEnabled && !_action._verbNounFlag && !_abortTimers2) ? 1 : 0; +// _screenObjects.check(v, false); + } + _madsVm->_player.update(); // Handle refreshing the mouse position display @@ -361,6 +347,9 @@ void MadsScene::updateState() { _mouseMsgIndex = _madsVm->scene()->_kernelMessages.add(Common::Point(5, 5), 0x203, 0, 0, 1, buffer); } + if (_madsVm->globals()->_config.easyMouse) + _action.refresh(); + // Step through the scene _sceneLogic.sceneStep(); @@ -548,181 +537,6 @@ bool MadsScene::getDepthHighBits(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -MadsAction::MadsAction() { - clear(); -} - -void MadsAction::clear() { - _actionMode = ACTMODE_NONE; - _actionMode2 = ACTMODE2_0; - _word_86F42 = 0; - _word_86F4E = 0; - _articleNumber = 0; - _lookFlag = false; - _word_86F4A = 0; - _statusText[0] = '\0'; - _selectedRow = -1; - _currentHotspot = -1; - _word_86F3A = -1; - _word_86F4C = -1; - //word_86F3A/word_86F4C - _currentAction = kVerbNone; - _objectNameId = -1; - _objectDescId = -1; - _word_83334 = -1; -} - -void MadsAction::appendVocab(int vocabId, bool capitalise) { - char *s = _statusText + strlen(_statusText); - const char *vocabStr = _madsVm->globals()->getVocab(vocabId); - strcpy(s, vocabStr); - if (capitalise) - *s = toupper(*s); - - strcat(s, " "); -} - -void MadsAction::set() { - int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount; - bool flag = false; - _currentAction = -1; - _objectNameId = -1; - _objectDescId = -1; - - if (_actionMode == ACTMODE_TALK) { - // Handle showing the conversation selection. Rex at least doesn't actually seem to use this - if (_selectedRow >= 0) { - const char *desc = _madsVm->_converse[_selectedRow].desc; - if (desc) - strcpy(_statusText, desc); - } - } else if (_lookFlag && (_selectedRow == 0)) { - // Two 'look' actions in succession, so the action becomes 'Look around' - strcpy(_statusText, lookAroundStr); - } else { - if ((_actionMode == ACTMODE_OBJECT) && (_selectedRow >= 0) && (_flags1 == 2) && (_flags2 == 0)) { - // Use/to action - int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); - MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); - - _objectNameId = objEntry->descId; - _currentAction = objEntry->vocabList[_selectedRow].vocabId; - - // Set up the status text stirng - strcpy(_statusText, useStr); - appendVocab(_objectNameId); - strcpy(_statusText, toStr); - appendVocab(_currentAction); - } else { - // Handling for if an action has been selected - if (_selectedRow >= 0) { - if (_actionMode == ACTMODE_VERB) { - // Standard verb action - _currentAction = verbList[_selectedRow].verb; - } else { - // Selected action on an inventory object - int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); - MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); - - _currentAction = objEntry->vocabList[_selectedRow].vocabId; - } - - appendVocab(_currentAction, true); - - if (_currentAction == kVerbLook) { - // Add in the word 'add' - strcat(_statusText, atStr); - strcat(_statusText, " "); - } - } - - // Handling for if a hotspot has been selected/highlighted - if ((_currentHotspot >= 0) && (_selectedRow >= 0) && (_articleNumber > 0) && (_flags1 == 2)) { - flag = true; - - strcat(_statusText, englishMADSArticleList[_articleNumber]); - strcat(_statusText, " "); - } - - if (_currentHotspot >= 0) { - if (_selectedRow < 0) { - int verbId; - - if (_currentHotspot < hotspotCount) { - // Get the verb Id from the hotspot - verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getVerbID(); - } else { - // Get the verb Id from the scene object - verbId = (*_madsVm->scene()->getSceneResources().props)[_currentHotspot - hotspotCount].getVerbID(); - } - - if (verbId > 0) { - // Set the specified action - _currentAction = verbId; - appendVocab(_currentAction, true); - } else { - // Default to a standard 'walk to' - _currentAction = kVerbWalkTo; - strcat(_statusText, walkToStr); - } - } - - if ((_actionMode2 == ACTMODE2_2) || (_actionMode2 == ACTMODE2_5)) { - // Get name from given inventory object - int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_currentHotspot); - _objectNameId = _madsVm->globals()->getObject(objectId)->descId; - } else if (_currentHotspot < hotspotCount) { - // Get name from scene hotspot - _objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getVocabID(); - } else { - // Get name from temporary scene hotspot - _objectNameId = (*_madsVm->scene()->getSceneResources().props)[_currentHotspot].getVocabID(); - } - } - } - - if ((_currentHotspot >= 0) && (_articleNumber > 0) && !flag) { - if (_articleNumber == -1) { - if (_word_86F3A >= 0) { - int articleNum = 0; - - if ((_word_86F42 == 2) || (_word_86F42 == 5)) { - int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_currentHotspot); - articleNum = _madsVm->globals()->getObject(objectId)->article; - } else if (_word_86F3A < hotspotCount) { - articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getArticle(); - } else { - - } - } - - } else if ((_articleNumber == kVerbLook) || (_vm->getGameType() != GType_RexNebular) || - (strcmp(_madsVm->globals()->getVocab(_objectDescId), fenceStr) != 0)) { - // Write out the article - strcat(_statusText, englishMADSArticleList[_articleNumber]); - } else { - // Special case for a 'fence' entry in Rex Nebular - strcat(_statusText, overStr); - } - - strcat(_statusText, " "); - } - - // Append object description if necessary - if (_word_86F3A >= 0) - appendVocab(_objectDescId); - - // Remove any trailing space character - int statusLen = strlen(_statusText); - if ((statusLen > 0) && (_statusText[statusLen - 1] == ' ')) - _statusText[statusLen - 1] = '\0'; - } - - _word_83334 = -1; -} - -/*--------------------------------------------------------------------------*/ - void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Surface *depthSurface, M4Surface *surface) { char buffer1[80]; const char *sceneName; @@ -1151,7 +965,7 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) { } bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int y, bool &captureEvents) { - MadsAction &act = _madsVm->scene()->getAction(); + MadsAction &act = _madsVm->scene()->_action; // If the mouse isn't being held down, then reset the repeated scroll timer if (eventType != MEVENT_LEFT_HOLD) @@ -1198,7 +1012,7 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int act._flags1 = obj->vocabList[1].flags1; act._flags2 = obj->vocabList[1].flags2; - act._currentHotspot = _selectedObject; + act._action.hotspotId = _selectedObject; act._articleNumber = act._flags2; } } diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 7defe613bd..2bd38aff6f 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -38,6 +38,9 @@ class MadsInterfaceView; #define DEPTH_BANDS_SIZE 15 #define MAX_ROUTE_NODES 22 +enum ScreenCategory {CAT_NONE = 0, CAT_ACTION = 1, CAT_INV_LIST = 2, CAT_INV_VOCAB, CAT_HOTSPOT = 4, + CAT_INV_ANIM = 6, CAT_6, CAT_INV_SCROLLER = 7, CAT_12 = 12}; + class SceneNode { public: Common::Point pt; @@ -77,51 +80,16 @@ public: void setRouteNode(int nodeIndex, const Common::Point &pt, M4Surface *depthSurface); }; -enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; -enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_5 = 5}; - -class MadsAction { -private: - char _statusText[100]; - - void appendVocab(int vocabId, bool capitalise = false); -public: - int _currentHotspot; - int _objectNameId; - int _objectDescId; - int _currentAction; - int8 _flags1, _flags2; - MadsActionMode _actionMode; - MAdsActionMode2 _actionMode2; - int _articleNumber; - bool _lookFlag; - int _selectedRow; - // Unknown fields - int16 _word_86F3A; - int16 _word_86F42; - int16 _word_86F4E; - int16 _word_86F4A; - int16 _word_83334; - int16 _word_86F4C; - -public: - MadsAction(); - - void clear(); - void set(); - const char *statusText() const { return _statusText; } -}; - class MadsScene : public Scene, public MadsView { private: MadsEngine *_vm; MadsSceneResources _sceneResources; - MadsAction _action; Animation *_activeAnimation; MadsSceneLogic _sceneLogic; SpriteAsset *_playerSprites; int _mouseMsgIndex; + int _highlightedHotspot; void drawElements(); void loadScene2(const char *aaName, int sceneNumber); @@ -142,7 +110,7 @@ public: virtual void leaveScene(); virtual void loadSceneCodes(int sceneNumber, int index = 0); virtual void show(); - virtual void checkHotspotAtMousePos(int x, int y); + virtual void mouseMove(int x, int y); virtual void leftClick(int x, int y); virtual void rightClick(int x, int y); virtual void setAction(int action, int objectId = -1); @@ -158,8 +126,6 @@ public: MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; } MadsSceneResources &getSceneResources() { return _sceneResources; } - MadsAction &getAction() { return _action; } - void setStatusText(const char *text) {}//***DEPRECATED*** bool getDepthHighBit(const Common::Point &pt); bool getDepthHighBits(const Common::Point &pt); }; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index d7e6435b14..6566b37c50 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -37,6 +37,221 @@ namespace M4 { +MadsAction::MadsAction(MadsView &owner): _owner(owner) { + clear(); + _currentAction = kVerbNone; + _verbNounFlag = false; + _statusTextIndex = -1; + _selectedAction = 0; +} + +void MadsAction::clear() { + _v83338 = 1; + _actionMode = ACTMODE_NONE; + _actionMode2 = ACTMODE2_0; + _word_86F42 = 0; + _word_86F4E = 0; + _articleNumber = 0; + _lookFlag = false; + _word_86F4A = 0; + _statusText[0] = '\0'; + _selectedRow = -1; + _hotspotId = -1; + _word_86F3A = -1; + _word_86F4C = -1; + _action.hotspotId = -1; + _action.objectNameId = -1; + _action.indirectObjectId = -1; + _textChanged = true; +} + +void MadsAction::appendVocab(int vocabId, bool capitalise) { + char *s = _statusText + strlen(_statusText); + const char *vocabStr = _madsVm->globals()->getVocab(vocabId); + strcpy(s, vocabStr); + if (capitalise) + *s = toupper(*s); + + strcat(s, " "); +} + +void MadsAction::set() { + int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount; + bool flag = false; + strcpy(_statusText, ""); + + _currentAction = -1; + _action.objectNameId = -1; + _action.indirectObjectId = -1; + + if (_actionMode == ACTMODE_TALK) { + // Handle showing the conversation selection. Rex at least doesn't actually seem to use this + if (_selectedRow >= 0) { + const char *desc = _madsVm->_converse[_selectedRow].desc; + if (desc) + strcpy(_statusText, desc); + } + } else if (_lookFlag && (_selectedRow == 0)) { + // Two 'look' actions in succession, so the action becomes 'Look around' + strcpy(_statusText, lookAroundStr); + } else { + if ((_actionMode == ACTMODE_OBJECT) && (_selectedRow >= 0) && (_flags1 == 2) && (_flags2 == 0)) { + // Use/to action + int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); + MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); + + _action.objectNameId = objEntry->descId; + _currentAction = objEntry->vocabList[_selectedRow].vocabId; + + // Set up the status text stirng + strcpy(_statusText, useStr); + appendVocab(_action.objectNameId); + strcpy(_statusText, toStr); + appendVocab(_currentAction); + } else { + // Handling for if an action has been selected + if (_selectedRow >= 0) { + if (_actionMode == ACTMODE_VERB) { + // Standard verb action + _currentAction = verbList[_selectedRow].verb; + } else { + // Selected action on an inventory object + int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); + MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); + + _currentAction = objEntry->vocabList[_selectedRow].vocabId; + } + + appendVocab(_currentAction, true); + + if (_currentAction == kVerbLook) { + // Add in the word 'add' + strcat(_statusText, atStr); + strcat(_statusText, " "); + } + } + + // Handling for if a hotspot has been selected/highlighted + if ((_hotspotId >= 0) && (_selectedRow >= 0) && (_articleNumber > 0) && (_flags1 == 2)) { + flag = true; + + strcat(_statusText, englishMADSArticleList[_articleNumber]); + strcat(_statusText, " "); + } + + if (_hotspotId >= 0) { + if (_selectedRow < 0) { + int verbId; + + if (_hotspotId < hotspotCount) { + // Get the verb Id from the hotspot + verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVerbID(); + } else { + // Get the verb Id from the scene object + verbId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId - hotspotCount].getVerbID(); + } + + if (verbId > 0) { + // Set the specified action + _currentAction = verbId; + appendVocab(_currentAction, true); + } else { + // Default to a standard 'walk to' + _currentAction = kVerbWalkTo; + strcat(_statusText, walkToStr); + } + } + + if ((_actionMode2 == ACTMODE2_2) || (_actionMode2 == ACTMODE2_5)) { + // Get name from given inventory object + int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId); + _action.objectNameId = _madsVm->globals()->getObject(objectId)->descId; + } else if (_hotspotId < hotspotCount) { + // Get name from scene hotspot + _action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID(); + } else { + // Get name from temporary scene hotspot + _action.objectNameId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId].getVocabID(); + } + appendVocab(_action.objectNameId); + } + } + + if ((_hotspotId >= 0) && (_articleNumber > 0) && !flag) { + if (_articleNumber == -1) { + if (_word_86F3A >= 0) { + int articleNum = 0; + + if ((_word_86F42 == 2) || (_word_86F42 == 5)) { + int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId); + articleNum = _madsVm->globals()->getObject(objectId)->article; + } else if (_word_86F3A < hotspotCount) { + articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle(); + } else { + + } + } + + } else if ((_articleNumber == kVerbLook) || (_vm->getGameType() != GType_RexNebular) || + (strcmp(_madsVm->globals()->getVocab(_action.indirectObjectId), fenceStr) != 0)) { + // Write out the article + strcat(_statusText, englishMADSArticleList[_articleNumber]); + } else { + // Special case for a 'fence' entry in Rex Nebular + strcat(_statusText, overStr); + } + + strcat(_statusText, " "); + } + + // Append object description if necessary + if (_word_86F3A >= 0) + appendVocab(_action.indirectObjectId); + + // Remove any trailing space character + int statusLen = strlen(_statusText); + if ((statusLen > 0) && (_statusText[statusLen - 1] == ' ')) + _statusText[statusLen - 1] = '\0'; + } + + _textChanged = true; +} + +void MadsAction::refresh() { + // Exit immediately if nothing has changed + if (!_textChanged) + return; + + // Remove any old copy of the status text + if (_statusTextIndex >= 0) { + _owner._textDisplay.expire(_statusTextIndex); + _statusTextIndex = -1; + } + + if (strlen(_statusText) != 0) { + if ((_owner._screenObjects._v832EC == 0) || (_owner._screenObjects._v832EC == 2)) { + Font *font = _madsVm->_font->getFont(FONT_MAIN_MADS); + int textSpacing = -1; + + int strWidth = font->getWidth(_statusText); + if (strWidth > 320) { + // Too large to fit, so fall back on interface font + font = _madsVm->_font->getFont(FONT_INTERFACE_MADS); + strWidth = font->getWidth(_statusText, 0); + textSpacing = 0; + } + + // Add a new text display entry to display the status text at the bottom of the screen area + _statusTextIndex = _owner._textDisplay.add(160 - (strWidth / 2), + MADS_SURFACE_HEIGHT + _owner._posAdjust.y - 13, 3, textSpacing, _statusText, font); + } + } + + _textChanged = false; +} + +//-------------------------------------------------------------------------- + bool MadsSpriteSlot::operator==(const SpriteSlotSubset &other) const { return (spriteListIndex == other.spriteListIndex) && (frameNumber == other.frameNumber) && (xp == other.xp) && (yp == other.yp) && (depth == other.depth) && (scale == other.scale); @@ -618,6 +833,18 @@ void MadsKernelMessageList::processText(int msgIndex) { //-------------------------------------------------------------------------- +ScreenObjects::ScreenObjects(MadsView &owner): _owner(owner) { + _v832EC = 0; + _v7FECA = 0; + _v7FED6 = 0; + _v8332A = 0; + _yp = 0; + _v8333C = 0; + _selectedObject = 0; + _category = 0; + _objectIndex = 0; +} + /** * Clears the entries list */ @@ -670,6 +897,29 @@ void ScreenObjects::setActive(int category, int idx, bool active) { } } +void ScreenObjects::check(bool scanFlag, bool mouseClick) { + if (!mouseClick || _v832EC) + _v7FECA = 0; + + if (!_v7FED6 && !_v8332A && !_yp && (_v8333C != 0)) { + if (scanFlag) { + _category = CAT_NONE; + _selectedObject = scanBackwards(_madsVm->_mouse->currentPos().x, _madsVm->_mouse->currentPos().y, + LAYER_GUI); + + if (_selectedObject > 0) { + ScreenObjectEntry &obj = _entries[_selectedObject]; + _category = obj.category & 7; + _objectIndex = obj.index; + } + + // TODO: Other stuff related to the user interface + } + } + + _owner._action.refresh(); +} + /*--------------------------------------------------------------------------*/ MadsDynamicHotspots::MadsDynamicHotspots(MadsView &owner): _owner(owner) { @@ -678,7 +928,7 @@ MadsDynamicHotspots::MadsDynamicHotspots(MadsView &owner): _owner(owner) { rec.active = false; _entries.push_back(rec); } - _flag = true; + _changed = true; _count = 0; } @@ -702,7 +952,7 @@ int MadsDynamicHotspots::add(int descId, int field14, int seqIndex, const Common _entries[idx].field_17 = 0; ++_count; - _flag = true; + _changed = true; if (seqIndex >= 0) _owner._sequenceList[seqIndex].dynamicHotspotIndex = idx; @@ -734,7 +984,7 @@ void MadsDynamicHotspots::remove(int index) { _entries[index].active = false; --_count; - _flag = true; + _changed = true; } } @@ -743,7 +993,7 @@ void MadsDynamicHotspots::reset() { _entries[i].active = false; _count = 0; - _flag = false; + _changed = false; } /*--------------------------------------------------------------------------*/ @@ -1048,7 +1298,7 @@ bool MadsSequenceList::loadSprites(int seqIndex) { dynHotspot.bounds.top = MAX(y2 - height, 0); dynHotspot.bounds.bottom = MIN(y2, 155) - dynHotspot.bounds.top; - _owner._dynamicHotspots._flag = true; + _owner._dynamicHotspots._changed = true; } } @@ -1208,7 +1458,8 @@ Animation::~Animation() { //-------------------------------------------------------------------------- MadsView::MadsView(View *view): _view(view), _dynamicHotspots(*this), _sequenceList(*this), - _kernelMessages(*this), _spriteSlots(*this), _dirtyAreas(*this), _textDisplay(*this) { + _kernelMessages(*this), _spriteSlots(*this), _dirtyAreas(*this), _textDisplay(*this), + _screenObjects(*this), _action(*this) { _textSpacing = -1; _newTimeout = 0; diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 0604ae1ee1..d29947390a 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -36,6 +36,53 @@ namespace M4 { class MadsView; +enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; +enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_5 = 5}; + +struct ActionDetails { + int hotspotId; + int objectNameId; + int indirectObjectId; +}; + +class MadsAction { +private: + MadsView &_owner; + char _statusText[100]; + + void appendVocab(int vocabId, bool capitalise = false); +public: + ActionDetails _action; + int _currentAction; + int8 _flags1, _flags2; + MadsActionMode _actionMode; + MAdsActionMode2 _actionMode2; + int _articleNumber; + bool _lookFlag; + int _selectedRow; + bool _textChanged; + int _selectedAction; + bool _verbNounFlag; + int _statusTextIndex; + int _hotspotId; + + // Unknown fields + int16 _word_86F3A; + int16 _word_86F42; + int16 _word_86F4E; + int16 _word_86F4A; + int16 _word_86F4C; + int _v83338; + +public: + MadsAction(MadsView &owner); + + void clear(); + void set(); + const char *statusText() const { return _statusText; } + void refresh(); +}; + enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2}; class SpriteSlotSubset { @@ -211,10 +258,20 @@ public: class ScreenObjects { private: + MadsView &_owner; Common::Array _entries; public: - ScreenObjects() {} - + int _v832EC; + int _v7FECA; + int _v7FED6; + int _v8332A; + int _yp; + int _v8333C; + int _selectedObject; + int _category; + int _objectIndex; + + ScreenObjects(MadsView &owner); ScreenObjectEntry &operator[](uint idx) { assert(idx <= _entries.size()); return _entries[idx - 1]; @@ -226,6 +283,7 @@ public: int scan(int xp, int yp, int layer); int scanBackwards(int xp, int yp, int layer); void setActive(int category, int idx, bool active); + void check(bool scanFlag, bool mouseClick); }; class DynamicHotspot { @@ -251,7 +309,7 @@ private: Common::Array _entries; int _count; public: - bool _flag; + bool _changed; public: MadsDynamicHotspots(MadsView &owner); @@ -261,6 +319,9 @@ public: int set17(int index, int v); void remove(int index); void reset(); + void refresh() { + // TODO + } }; class MadsDirtyArea { @@ -393,6 +454,7 @@ public: MadsDynamicHotspots _dynamicHotspots; MadsSequenceList _sequenceList; MadsDirtyAreas _dirtyAreas; + MadsAction _action; int _textSpacing; uint32 _newTimeout; diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index e78d7f865e..ca59710586 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -184,7 +184,7 @@ bool Scene::onEvent(M4EventType eventType, int32 param1, int x, int y, bool &cap rightClick(x, y); break; case MEVENT_MOVE: - checkHotspotAtMousePos(x, y); + mouseMove(x, y); break; default: return false; diff --git a/engines/m4/scene.h b/engines/m4/scene.h index 633a34b549..76b99a7bcd 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -95,7 +95,7 @@ public: virtual void leaveScene(); virtual void loadSceneCodes(int sceneNumber, int index = 0) = 0; virtual void show(); - virtual void checkHotspotAtMousePos(int x, int y) = 0; + virtual void mouseMove(int x, int y) = 0; virtual void leftClick(int x, int y) = 0; virtual void rightClick(int x, int y) = 0; virtual void update() = 0; -- cgit v1.2.3 From b062b413aab72035996d71d274e3f6a6f8702e15 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 23 Jul 2010 10:53:21 +0000 Subject: Removed some old deprecated code that was drawing the status text a second time svn-id: r51201 --- engines/m4/mads_scene.cpp | 13 ------------- engines/m4/mads_views.cpp | 4 +++- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 2ee60ae6d4..c459a2a58a 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -308,19 +308,6 @@ void MadsScene::update() { drawElements(); _action.set(); - const char *sStatusText = _action.statusText(); - - // Handle display of any status text - if (sStatusText[0]) { - // Text colors are inverted in Dragonsphere - if (_vm->getGameType() == GType_DragonSphere) - _vm->_font->current()->setColours(_vm->_palette->BLACK, _vm->_palette->WHITE, _vm->_palette->BLACK); - else - _vm->_font->current()->setColours(_vm->_palette->WHITE, _vm->_palette->BLACK, _vm->_palette->BLACK); - - _vm->_font->setFont(FONT_MAIN_MADS); - _vm->_font->current()->writeString(this, sStatusText, (width() - _vm->_font->current()->getWidth(sStatusText)) / 2, 142, 0); - } } void MadsScene::updateState() { diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 6566b37c50..34218cebfd 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -242,8 +242,10 @@ void MadsAction::refresh() { } // Add a new text display entry to display the status text at the bottom of the screen area + uint colours = (_vm->getGameType() == GType_DragonSphere) ? 0x0300 : 0x0003; + _statusTextIndex = _owner._textDisplay.add(160 - (strWidth / 2), - MADS_SURFACE_HEIGHT + _owner._posAdjust.y - 13, 3, textSpacing, _statusText, font); + MADS_SURFACE_HEIGHT + _owner._posAdjust.y - 13, colours, textSpacing, _statusText, font); } } -- cgit v1.2.3 From 8e04d25be6455d7cd38cd0b300fd0ddead2b4f99 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 10:58:06 +0000 Subject: SCI: support kSetCursorSci11(-2) svn-id: r51202 --- engines/sci/engine/kgraphics.cpp | 3 ++- engines/sci/graphics/cursor.cpp | 49 +++++++++++++++++++++++----------------- engines/sci/graphics/cursor.h | 6 +++++ 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 55d0de8261..ed7b72f90b 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -129,9 +129,10 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { break; case -1: // TODO: Special case at least in kq6, check disassembly + // Does something with magCursor, which is set on argc = 10, which we don't support break; case -2: - // TODO: Special case at least in kq6, check disassembly + g_sci->_gfxCursor->kernelResetMoveZone(); break; default: g_sci->_gfxCursor->kernelShow(); diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index e1c05c97da..f6e2077cb3 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -47,7 +47,7 @@ GfxCursor::GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *sc // center mouse cursor setPosition(Common::Point(_screen->getWidth() / 2, _screen->getHeight() / 2)); - kernelSetMoveZone(Common::Rect(0, 0, _screen->getDisplayWidth(), _screen->getDisplayHeight())); + _moveZoneActive = false; } GfxCursor::~GfxCursor() { @@ -283,32 +283,39 @@ Common::Point GfxCursor::getPosition() { } void GfxCursor::refreshPosition() { - bool clipped = false; - Common::Point mousePoint = getPosition(); - - if (mousePoint.x < _moveZone.left) { - mousePoint.x = _moveZone.left; - clipped = true; - } else if (mousePoint.x >= _moveZone.right) { - mousePoint.x = _moveZone.right - 1; - clipped = true; - } + if (_moveZoneActive) { + bool clipped = false; + Common::Point mousePoint = getPosition(); + + if (mousePoint.x < _moveZone.left) { + mousePoint.x = _moveZone.left; + clipped = true; + } else if (mousePoint.x >= _moveZone.right) { + mousePoint.x = _moveZone.right - 1; + clipped = true; + } - if (mousePoint.y < _moveZone.top) { - mousePoint.y = _moveZone.top; - clipped = true; - } else if (mousePoint.y >= _moveZone.bottom) { - mousePoint.y = _moveZone.bottom - 1; - clipped = true; + if (mousePoint.y < _moveZone.top) { + mousePoint.y = _moveZone.top; + clipped = true; + } else if (mousePoint.y >= _moveZone.bottom) { + mousePoint.y = _moveZone.bottom - 1; + clipped = true; + } + + // FIXME: Do this only when mouse is grabbed? + if (clipped) + setPosition(mousePoint); } +} - // FIXME: Do this only when mouse is grabbed? - if (clipped) - setPosition(mousePoint); +void GfxCursor::kernelResetMoveZone() { + _moveZoneActive = false; } void GfxCursor::kernelSetMoveZone(Common::Rect zone) { - _moveZone = zone; + _moveZone = zone; + _moveZoneActive = true; } void GfxCursor::kernelSetPos(Common::Point pos) { diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h index 7acd14acd9..787841f5be 100644 --- a/engines/sci/graphics/cursor.h +++ b/engines/sci/graphics/cursor.h @@ -57,6 +57,11 @@ public: Common::Point getPosition(); void refreshPosition(); + /** + * Removes limit for mouse movement + */ + void kernelResetMoveZone(); + /** * Limits the mouse movement to a given rectangle. * @@ -78,6 +83,7 @@ private: int _upscaledHires; + bool _moveZoneActive; Common::Rect _moveZone; // Rectangle in which the pointer can move CursorCache _cachedCursors; -- cgit v1.2.3 From 7b485a797884dc24ddcde990dba450ca610875d9 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 23 Jul 2010 12:09:54 +0000 Subject: GP2XWIZ: Fix warning svn-id: r51203 --- backends/platform/gp2xwiz/gp2xwiz-graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp index 6abddd52f3..f6ad226d42 100644 --- a/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp +++ b/backends/platform/gp2xwiz/gp2xwiz-graphics.cpp @@ -138,7 +138,7 @@ bool OSystem_GP2XWIZ::loadGFXMode() { if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400) _videoMode.aspectRatioCorrection = false; - OSystem_SDL::loadGFXMode(); + return OSystem_SDL::loadGFXMode(); } void OSystem_GP2XWIZ::drawMouse() { -- cgit v1.2.3 From 32c81fa9183a574adeb766d9dbc265f665978153 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 12:37:58 +0000 Subject: SCI: fixing kNewWindow (SCI1.1) check differently for null restoreRect, fixes pq3 some windows not getting fully removed calling showBits on actual dims and not on restoreRect, fixes lb2 about window issues (and possible qfg1vga window issues as well) svn-id: r51204 --- engines/sci/graphics/ports.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 611db1061a..bc13d152b8 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -173,7 +173,7 @@ reg_t GfxPorts::kernelGetActive() { reg_t GfxPorts::kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title) { Window *wnd = NULL; - if (restoreRect.top != 0 && restoreRect.left != 0 && restoreRect.height() != 0 && restoreRect.width() != 0) + if (restoreRect.bottom != 0 && restoreRect.right != 0) wnd = newWindow(dims, &restoreRect, title, style, priority, false); else wnd = newWindow(dims, NULL, title, style, priority, false); @@ -367,7 +367,7 @@ void GfxPorts::drawWindow(Window *pWnd) { if (!(wndStyle & SCI_WINDOWMGR_STYLE_TRANSPARENT)) _paint16->fillRect(r, GFX_SCREEN_MASK_VISUAL, pWnd->backClr); - _paint16->bitsShow(pWnd->restoreRect); + _paint16->bitsShow(pWnd->dims); } setPort(oldport); } -- cgit v1.2.3 From a92576f08b566b92e4121b9415b47b74c903bd83 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Fri, 23 Jul 2010 12:56:57 +0000 Subject: GROOVIE: Optimize the VDX player. - Make some small optimizations to the VDX player. The changes aren't noticeable on desktop computers, but it showed changes on the profiler. Let's see if it helps limited platforms. - Clarify a few variable names and clean their usage. svn-id: r51205 --- engines/groovie/vdx.cpp | 121 ++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index 1d3108a2cc..04910ec128 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -209,17 +209,14 @@ static const uint16 vdxBlockMapLookup[] = { }; void VDXPlayer::getDelta(Common::ReadStream *in) { - uint16 j, k, l; - uint32 offset; - uint8 currOpCode, param1, param2, param3; + uint16 k, l; // Get the size of the local palette - j = in->readUint16LE(); + uint16 palSize = in->readUint16LE(); // Load the palette if it isn't empty - if (j) { + if (palSize) { uint16 palBitField[16]; - int flag = 1, palIndex; // Load the bit field for (l = 0; l < 16; l++) { @@ -228,9 +225,9 @@ void VDXPlayer::getDelta(Common::ReadStream *in) { // Load the actual palette for (l = 0; l < 16; l++) { - flag = 1 << 15; - for (j = 0; j < 16; j++) { - palIndex = (l * 16) + j; + int flag = 1 << 15; + for (uint16 j = 0; j < 16; j++) { + int palIndex = (l * 16) + j; if (flag & palBitField[l]) { for (k = 0; k < 3; k++) { @@ -247,11 +244,12 @@ void VDXPlayer::getDelta(Common::ReadStream *in) { setPalette(_palBuf); } } - currOpCode = in->readByte(); - /* j now becomes the current block line we're dealing with */ - j = 0; - offset = 0; + uint8 currOpCode = in->readByte(); + uint8 param1, param2, param3; + + uint16 currentLine = 0; + uint32 offset = 0; while (!in->eos()) { byte colours[16]; if (currOpCode < 0x60) { @@ -277,8 +275,8 @@ void VDXPlayer::getDelta(Common::ReadStream *in) { break; case 0x61: /* Skip to the end of this line, next block is start of next */ /* Note this is used at the end of EVERY line */ - j++; - offset = j * TILE_SIZE * 640; + currentLine++; + offset = currentLine * TILE_SIZE * 640; break; case 0x62: case 0x63: @@ -382,12 +380,15 @@ void VDXPlayer::getStill(Common::ReadStream *in) { byte colours[16]; for (uint16 j = 0; j < numYTiles; j++) { - for (uint16 i = 0; i < numXTiles; i++) { /* Tile number */ + byte *currentTile = buf + j * TILE_SIZE * imageWidth; + for (uint16 i = numXTiles; i; i--) { uint8 colour1 = in->readByte(); uint8 colour0 = in->readByte(); uint16 colourMap = in->readUint16LE(); expandColourMap(colours, colourMap, colour1, colour0); - decodeBlockStill(buf + j * TILE_SIZE * imageWidth + i * TILE_SIZE, colours, 640, mask); + decodeBlockStill(currentTile, colours, 640, mask); + + currentTile += TILE_SIZE; } } @@ -425,20 +426,27 @@ void VDXPlayer::getStill(Common::ReadStream *in) { } void VDXPlayer::expandColourMap(byte *out, uint16 colourMap, uint8 colour1, uint8 colour0) { - int flag = 1 << 15; - for (int i = 0; i < 16; i++) { + // It's a bit faster to start from the end + out += 16; + for (int i = 16; i; i--) { // Set the corresponding colour - out[i] = (colourMap & flag) ? colour1 : colour0; + // The following is an optimized version of: + // *--out = (colourMap & 1) ? colour1 : colour0; + uint8 selector = -(colourMap & 1); + *--out = (selector & colour1) | (~selector & colour0); - // Update the flag to test the next colour - flag >>= 1; + // Update the flag map to test the next colour + colourMap >>= 1; } } void VDXPlayer::decodeBlockStill(byte *buf, byte *colours, uint16 imageWidth, uint8 mask) { - for (int y = 0; y < TILE_SIZE; y++) { - for (int x = 0; x < TILE_SIZE; x++) { - if (_flagOne) { + assert(TILE_SIZE == 4); + + for (int y = TILE_SIZE; y; y--) { + if (_flagOne) { + // TODO: optimize with bit logic? + for (int x = 0; x < TILE_SIZE; x++) { // 0xff pixels don't modify the buffer if (*colours != 0xff) { // Write the colour @@ -446,25 +454,28 @@ void VDXPlayer::decodeBlockStill(byte *buf, byte *colours, uint16 imageWidth, ui // Note: if the mask is 0, it paints the image // else, it paints the image's mask using 0xff } - } else { - *buf = *colours; + + // Point to the next colour + colours++; + + // Point to the next pixel + buf++; } - // Point to the next colour - colours++; + // Point to the start of the next line + buf += imageWidth - TILE_SIZE; + } else { + *((uint32 *)buf) = *((uint32 *)colours); + colours += 4; - // Point to the next pixel - buf++; + // Point to the start of the next line + buf += imageWidth; } - - // Point to the start of the next line - buf += imageWidth - TILE_SIZE; } } void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth) { - byte *fgBuf = (byte *)_fg->getBasePtr(0, 0) + offset; - //byte *bgBuf = (byte *)_bg->getBasePtr(0, 0) + offset; + assert(TILE_SIZE == 4); byte *dest; // TODO: Verify just the else block is required @@ -475,27 +486,37 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth dest = (byte *)_bg->getBasePtr(0, 0) + offset; //} - int32 off = _origX + _origY * imageWidth; - for (int y = 0; y < TILE_SIZE; y++) { - for (int x = 0; x < TILE_SIZE; x++) { - if (_flagSeven) { - if (fgBuf[off] != 0xff) { + // Move the pointers to the beginning of the current block + int32 blockOff = _origX + _origY * imageWidth; + dest += blockOff; + if (_flagSeven) { + byte *fgBuf = (byte *)_fg->getBasePtr(0, 0) + offset + blockOff; + //byte *bgBuf = (byte *)_bg->getBasePtr(0, 0) + offset + blockOff; + } + + for (int y = TILE_SIZE; y; y--) { + if (_flagSeven) { + // Paint mask + for (int x = 0; x < TILE_SIZE; x++) { + // TODO: this can probably be optimized with bit logic + if (fgBuf[x] != 0xff) { if (*colours == 0xff) { - dest[off] = fgBuf[off]; + dest[x] = fgBuf[x]; } else { - dest[off] = *colours; + dest[x] = *colours; } } - } else { - // Paint directly - dest[off] = *colours; + colours++; } - colours++; - off++; + fgBuf += imageWidth; + } else { + // Paint directly + *((uint32 *)dest) = *((uint32 *)colours); + colours += 4; } - // Prepare the offset of the next line - off += imageWidth - TILE_SIZE; + // Move to the next line + dest += imageWidth; } } -- cgit v1.2.3 From 8cc6d8d0eb71c176cbe5f98385dd658e8228a17d Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Fri, 23 Jul 2010 13:05:16 +0000 Subject: GROOVIE: Fix compilation. svn-id: r51206 --- engines/groovie/vdx.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index 04910ec128..efb80059f7 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -489,8 +489,9 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth // Move the pointers to the beginning of the current block int32 blockOff = _origX + _origY * imageWidth; dest += blockOff; + byte *fgBuf; if (_flagSeven) { - byte *fgBuf = (byte *)_fg->getBasePtr(0, 0) + offset + blockOff; + fgBuf = (byte *)_fg->getBasePtr(0, 0) + offset + blockOff; //byte *bgBuf = (byte *)_bg->getBasePtr(0, 0) + offset + blockOff; } -- cgit v1.2.3 From 0bcc3af422754525304203edca34a3e6f44f5cfb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 13:57:45 +0000 Subject: SCI: adding workaround for sq4/room 391 kDisplay is called with an object as opcode, we simply skip over it svn-id: r51208 --- engines/sci/graphics/paint16.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 90b05c68a6..907e382c59 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -480,7 +480,10 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { _ports->textGreyedOutput(false); // processing codes in argv while (argc > 0) { - displayArg = argv[0].toUint16(); + if (argv[0].segment) + displayArg = 0xFFFF; + else + displayArg = argv[0].toUint16(); argc--; argv++; switch (displayArg) { case SCI_DISPLAY_MOVEPEN: @@ -543,6 +546,8 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { default: if ((g_sci->getGameId() == GID_ISLANDBRAIN) && (g_sci->getEngineState()->currentRoomNumber() == 300)) break; // WORKAROUND: we are called there with an forwarded 0 as additional parameter (script bug) + if ((g_sci->getGameId() == GID_SQ4) && (g_sci->getEngineState()->currentRoomNumber() == 391)) + break; // WORKAROUND: we get a pointer as parameter, skip it (sub 84h) error("Unknown kDisplay argument %X", displayArg); break; } -- cgit v1.2.3 From 20b1d80d598e6f741e28c9a85d186e463d111816 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 14:32:24 +0000 Subject: SCI: adding table for kDisplay workarounds and removing hardcoded checks, adding another workaround for kGraph(drawLine) in island of dr. brain (also gene explanation chart) Moving trackOriginAndFindWorkaround() into workarounds.cpp svn-id: r51209 --- engines/sci/engine/vm.cpp | 82 ----------------------------------- engines/sci/engine/workarounds.cpp | 88 +++++++++++++++++++++++++++++++++++++- engines/sci/engine/workarounds.h | 10 +++++ engines/sci/graphics/paint16.cpp | 11 ++--- 4 files changed, 103 insertions(+), 88 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b1945d1cf4..4cd5fc224f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -183,88 +183,6 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in return true; } -struct SciTrackOriginReply { - int scriptNr; - Common::String objectName; - Common::String methodName; - int localCallOffset; -}; - -static SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { - EngineState *state = g_sci->getEngineState(); - ExecStack *lastCall = state->xs; - Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); - int curScriptNr = local_script->getScriptNumber(); - - if (lastCall->debugLocalCallOffset != -1) { - // if lastcall was actually a local call search back for a real call - Common::List::iterator callIterator = state->_executionStack.end(); - while (callIterator != state->_executionStack.begin()) { - callIterator--; - ExecStack loopCall = *callIterator; - if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { - lastCall->debugSelector = loopCall.debugSelector; - lastCall->debugExportId = loopCall.debugExportId; - break; - } - } - } - - Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); - Common::String curMethodName; - const SciGameId gameId = g_sci->getGameId(); - const int curRoomNumber = state->currentRoomNumber(); - - if (lastCall->type == EXEC_STACK_TYPE_CALL) { - if (lastCall->debugSelector != -1) { - curMethodName = g_sci->getKernel()->getSelectorName(lastCall->debugSelector); - } else if (lastCall->debugExportId != -1) { - curObjectName = ""; - curMethodName = curMethodName.printf("export %d", lastCall->debugExportId); - } - } - - if (workaroundList) { - // Search if there is a workaround for this one - const SciWorkaroundEntry *workaround; - int16 inheritanceLevel = 0; - Common::String searchObjectName = curObjectName; - reg_t searchObject = lastCall->sendp; - do { - workaround = workaroundList; - while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr - && ((workaround->roomNr == -1) || (workaround->roomNr == curRoomNumber)) - && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) - && (workaround->objectName == searchObjectName) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset - && ((workaround->index == -1) || (workaround->index == index))) { - // Workaround found - return workaround->newValue; - } - workaround++; - } - - // Go back to the parent - inheritanceLevel++; - searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); - if (!searchObject.isNull()) - searchObjectName = state->_segMan->getObjectName(searchObject); - } while (!searchObject.isNull()); // no parent left? - } - - // give caller origin data - trackOrigin->objectName = curObjectName; - trackOrigin->methodName = curMethodName; - trackOrigin->scriptNr = curScriptNr; - trackOrigin->localCallOffset = lastCall->debugLocalCallOffset; - - SciWorkaroundSolution noneFound; - noneFound.type = WORKAROUND_NONE; - noneFound.value = 0; - return noneFound; -} - static bool validate_unsignedInteger(reg_t reg, uint16 &integer) { if (reg.segment) return false; diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 3861ad3228..acc977ce6d 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -23,6 +23,9 @@ * */ +#include "sci/engine/kernel.h" +#include "sci/engine/state.h" +#include "sci/engine/vm.h" #include "sci/engine/workarounds.h" #define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } } @@ -100,6 +103,13 @@ const SciWorkaroundEntry kAbs_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDisplay_workarounds[] = { + { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object + { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object @@ -115,7 +125,8 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { - { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when ordering beer, gets called with 1 extra parameter + { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when ordering beer, gets called with 1 extra parameter SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -172,4 +183,79 @@ const SciWorkaroundEntry kStrCpy_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { + EngineState *state = g_sci->getEngineState(); + ExecStack *lastCall = state->xs; + Script *local_script = state->_segMan->getScriptIfLoaded(lastCall->local_segment); + int curScriptNr = local_script->getScriptNumber(); + + if (lastCall->debugLocalCallOffset != -1) { + // if lastcall was actually a local call search back for a real call + Common::List::iterator callIterator = state->_executionStack.end(); + while (callIterator != state->_executionStack.begin()) { + callIterator--; + ExecStack loopCall = *callIterator; + if ((loopCall.debugSelector != -1) || (loopCall.debugExportId != -1)) { + lastCall->debugSelector = loopCall.debugSelector; + lastCall->debugExportId = loopCall.debugExportId; + break; + } + } + } + + Common::String curObjectName = state->_segMan->getObjectName(lastCall->sendp); + Common::String curMethodName; + const SciGameId gameId = g_sci->getGameId(); + const int curRoomNumber = state->currentRoomNumber(); + + if (lastCall->type == EXEC_STACK_TYPE_CALL) { + if (lastCall->debugSelector != -1) { + curMethodName = g_sci->getKernel()->getSelectorName(lastCall->debugSelector); + } else if (lastCall->debugExportId != -1) { + curObjectName = ""; + curMethodName = curMethodName.printf("export %d", lastCall->debugExportId); + } + } + + if (workaroundList) { + // Search if there is a workaround for this one + const SciWorkaroundEntry *workaround; + int16 inheritanceLevel = 0; + Common::String searchObjectName = curObjectName; + reg_t searchObject = lastCall->sendp; + do { + workaround = workaroundList; + while (workaround->objectName) { + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr + && ((workaround->roomNr == -1) || (workaround->roomNr == curRoomNumber)) + && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) + && (workaround->objectName == searchObjectName) + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset + && ((workaround->index == -1) || (workaround->index == index))) { + // Workaround found + return workaround->newValue; + } + workaround++; + } + + // Go back to the parent + inheritanceLevel++; + searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); + if (!searchObject.isNull()) + searchObjectName = state->_segMan->getObjectName(searchObject); + } while (!searchObject.isNull()); // no parent left? + } + + // give caller origin data + trackOrigin->objectName = curObjectName; + trackOrigin->methodName = curMethodName; + trackOrigin->scriptNr = curScriptNr; + trackOrigin->localCallOffset = lastCall->debugLocalCallOffset; + + SciWorkaroundSolution noneFound; + noneFound.type = WORKAROUND_NONE; + noneFound.value = 0; + return noneFound; +} + } // End of namespace Sci diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index f480fc5f05..ab88505103 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -38,6 +38,13 @@ enum SciWorkaroundType { WORKAROUND_FAKE // fake kernel call / replace temp value / fake opcode }; +struct SciTrackOriginReply { + int scriptNr; + Common::String objectName; + Common::String methodName; + int localCallOffset; +}; + struct SciWorkaroundSolution { SciWorkaroundType type; uint16 value; @@ -65,6 +72,7 @@ extern const SciWorkaroundEntry opcodeDivWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; +extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; @@ -76,6 +84,8 @@ extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; +extern SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin); + } // End of namespace Sci #endif // SCI_ENGINE_WORKAROUNDS_H diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 907e382c59..bd164b79b8 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -32,6 +32,7 @@ #include "sci/engine/features.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" +#include "sci/engine/workarounds.h" #include "sci/graphics/cache.h" #include "sci/graphics/coordadjuster.h" #include "sci/graphics/ports.h" @@ -544,11 +545,11 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { } break; default: - if ((g_sci->getGameId() == GID_ISLANDBRAIN) && (g_sci->getEngineState()->currentRoomNumber() == 300)) - break; // WORKAROUND: we are called there with an forwarded 0 as additional parameter (script bug) - if ((g_sci->getGameId() == GID_SQ4) && (g_sci->getEngineState()->currentRoomNumber() == 391)) - break; // WORKAROUND: we get a pointer as parameter, skip it (sub 84h) - error("Unknown kDisplay argument %X", displayArg); + SciTrackOriginReply originReply; + SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kDisplay_workarounds, &originReply); + if (solution.type == WORKAROUND_NONE) + error("Unknown kDisplay argument (%04x:%04x) from method %s::%s (script %d, localCall %x)", PRINT_REG(argv[0]), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + assert(solution.type == WORKAROUND_IGNORE); break; } } -- cgit v1.2.3 From 11a17b3908400904288432cfdd7b60c7e44ec0cb Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Jul 2010 16:38:06 +0000 Subject: SCUMM: Fix subtitles for Russian The Dig It is a long standing bug which was revealed by r31784. With that commit Kirben switched DIG code to newer one. Russian version used 0x03 as placeholders for keeping string widths. Original did not copy those characters but we did hence the bug. Based on study of original. Restrict it to Dig-only in order to avoid regressions. svn-id: r51211 --- engines/scumm/string.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index 62fdf48440..30281cb565 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -1110,6 +1110,8 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize) } num += (_game.version == 8) ? 4 : 2; } + } else if (_game.id == GID_DIG && (chr == 1 || chr == 2 || chr == 3 || chr == 8)) { + // Skip these characters } else { if (!(chr == '@') || (_game.id == GID_CMI && _language == Common::ZH_TWN) || (_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine && _language == Common::JA_JPN)) -- cgit v1.2.3 From b3f08d183b5fdafa850dc87401fc74d71476ef5d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Jul 2010 16:38:31 +0000 Subject: SDL: Fix bug #3025258 Bug #3025258: "Cursor Leaves Trail in GUI when Screen is Shaking". Based on patch provided by eriktorbjorn but extended with another edge case. svn-id: r51212 --- backends/platform/sdl/graphics.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 35c5b57db6..a97a153f3c 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -783,7 +783,8 @@ void OSystem_SDL::internUpdateScreen() { #endif // If the shake position changed, fill the dirty area with blackness - if (_currentShakePos != _newShakePos) { + if (_currentShakePos != _newShakePos || + (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) { SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor}; if (_videoMode.aspectRatioCorrection && !_overlayVisible) @@ -1681,7 +1682,7 @@ void OSystem_SDL::undrawMouse() { return; if (_mouseBackup.w != 0 && _mouseBackup.h != 0) - addDirtyRect(x, y, _mouseBackup.w, _mouseBackup.h); + addDirtyRect(x, y - _currentShakePos, _mouseBackup.w, _mouseBackup.h); } void OSystem_SDL::drawMouse() { -- cgit v1.2.3 From deef8bb650e980140a731490e3f6519a4ae4da60 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 18:42:54 +0000 Subject: TOOLS: Fix MSVC 2010 project files. Formerly the MSVC 2010 project files did not respect the global include/library/executable directories of the user, but used custom paths for that. This resulted in headers and libraries not be found by the MSVC, in case they were not stored in %(SCUMMVM_LIBS). Additionally it overwrote the executable MSVC used when compiling for x64, thus breaking the x64 target. svn-id: r51213 --- tools/create_msvc/create_msvc.cpp | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/tools/create_msvc/create_msvc.cpp b/tools/create_msvc/create_msvc.cpp index 3019e219e4..0855bf9de2 100644 --- a/tools/create_msvc/create_msvc.cpp +++ b/tools/create_msvc/create_msvc.cpp @@ -210,8 +210,9 @@ public: * @param bits Number of bits the platform supports. * @param defines Defines the platform needs to have set. * @param prefix File prefix, used to add additional include paths. + * @param isWin32 Bitness of property file */ - virtual void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix) = 0; + virtual void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix, bool isWin32) = 0; /** * Generates the project properties for debug and release settings. @@ -282,7 +283,7 @@ public: void writeReferences(std::ofstream &output); - void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix); + void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix, bool isWin32); void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32); @@ -305,7 +306,7 @@ public: void writeReferences(std::ofstream &output); - void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix); + void outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix, bool isWin32); void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32); @@ -1326,7 +1327,7 @@ void ProjectProvider::createGlobalProp(const BuildSetup &setup) { defines += *i; } - outputGlobalPropFile(properties, 32, defines, convertPathToWin(setup.filePrefix)); + outputGlobalPropFile(properties, 32, defines, convertPathToWin(setup.filePrefix), true); properties.close(); properties.open((setup.outputDir + '/' + "ScummVM_Global64" + getPropertiesExtension()).c_str()); @@ -1348,7 +1349,7 @@ void ProjectProvider::createGlobalProp(const BuildSetup &setup) { defines += *i; } - outputGlobalPropFile(properties, 64, defines, convertPathToWin(setup.filePrefix)); + outputGlobalPropFile(properties, 64, defines, convertPathToWin(setup.filePrefix), false); } void ProjectProvider::addFilesToProject(const std::string &dir, std::ofstream &projectFile, @@ -1651,7 +1652,7 @@ void VisualStudioProvider::writeReferences(std::ofstream &output) { output << "\tEndProjectSection\n"; } -void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix) { +void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix, bool isWin32) { properties << "\n" "\n" "\t\t<_ProjectFileVersion>10.0.30319.1\n"; - - if (name == "scummvm") - project << "$(SCUMMVM_LIBS)\\bin;$(VCInstallDir)bin;$(WindowsSdkDir)bin\\NETFX 4.0 Tools;$(WindowsSdkDir)bin;$(VSInstallDir)Common7\\Tools\\bin;$(VSInstallDir)Common7\\tools;$(VSInstallDir)Common7\\ide;$(ProgramFiles)\\HTML Help Workshop;$(FrameworkSDKDir)\\bin;$(MSBuildToolsPath32);$(VSInstallDir);$(SystemRoot)\\SysWow64;$(FxCopDir);$(PATH)\n" - "$(SCUMMVM_LIBS)\\include;$(VCInstallDir)include;$(VCInstallDir)atlmfc\\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\\include;\n" - "$(SCUMMVM_LIBS)\\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\\lib\n"; - project << "\t\n"; // Project-specific settings @@ -2049,38 +2044,41 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s project << "\t\n"; } -void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix) { +void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const std::string &defines, const std::string &prefix, bool isWin32) { properties << "\n" "\n" - "\n" - "<_ProjectFileVersion>10.0.30319.1\n" - "<_PropertySheetDisplayName>ScummVM_Global\n" - "$(Configuration)" << bits << "\\\n" - "$(Configuration)" << bits << "/$(ProjectName)\\\n" - "\n" - "\n" - "\n" - "true\n" - "" << _globalWarnings << ";%(DisableSpecificWarnings)\n" - "" << prefix << ";" << prefix << "\\engines;%(AdditionalIncludeDirectories)\n" - "" << defines << ";%(PreprocessorDefinitions)\n" - "\n" - "\n" - "false\n" - "Level4\n" - "false\n" - "Default\n" - "\n" - "\n" - "%(IgnoreSpecificDefaultLibraries)\n" - "Console\n" - "WinMainCRTStartup\n" - "\n" - "\n" - "HAS_INCLUDE_SET;%(PreprocessorDefinitions)\n" - "" << prefix << ";%(AdditionalIncludeDirectories)\n" - "\n" - "\n" + "\t\n" + "\t\t<_ProjectFileVersion>10.0.30319.1\n" + "\t\t<_PropertySheetDisplayName>ScummVM_Global\n" + "\t\t%(SCUMMVM_LIBS)\\bin;$(ExecutablePath)\n" + "\t\t%(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << ";$(LibraryPath)\n" + "\t\t%(SCUMMVM_LIBS)\\include;$(IncludePath)\n" + "\t\t$(Configuration)" << bits << "\\\n" + "\t\t$(Configuration)" << bits << "/$(ProjectName)\\\n" + "\t\n" + "\t\n" + "\t\t\n" + "\t\t\ttrue\n" + "\t\t\t" << _globalWarnings << ";%(DisableSpecificWarnings)\n" + "\t\t\t" << prefix << ";" << prefix << "\\engines;$(AdditionalIncludeDirectories)\n" + "\t\t\t" << defines << ";%(PreprocessorDefinitions)\n" + "\t\t\t\n" + "\t\t\t\n" + "\t\t\tfalse\n" + "\t\t\tLevel4\n" + "\t\t\tfalse\n" + "\t\t\tDefault\n" + "\t\t\n" + "\t\t\n" + "\t\t\t%(IgnoreSpecificDefaultLibraries)\n" + "\t\t\tConsole\n" + "\t\t\tWinMainCRTStartup\n" + "\t\t\n" + "\t\t\n" + "\t\t\tHAS_INCLUDE_SET;%(PreprocessorDefinitions)\n" + "\t\t\t" << prefix << ";%(AdditionalIncludeDirectories)\n" + "\t\t\n" + "\t\n" "\n"; properties.flush(); @@ -2105,7 +2103,9 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, b "\t\t" << (isRelease ? "false" : "true") << "\n" "\t\n" "\t\n" - "\t\t\n"; + "\t\t\n"; + + if (isRelease) { properties << "\t\t\ttrue\n" -- cgit v1.2.3 From 824a3c3ca1c1a0587a24db0e5b1ca6db6849aae4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 19:06:38 +0000 Subject: TOOLS: Preliminary SCUMMVM_LIBS support for msvc8/9. Currently %(SCUMMVM_LIBS)/bin is not added to the executable path, since I can not find any easy way to do that. The libs and include setting should be fine though. svn-id: r51214 --- tools/create_msvc/create_msvc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/create_msvc/create_msvc.cpp b/tools/create_msvc/create_msvc.cpp index 0855bf9de2..8e2a6011b4 100644 --- a/tools/create_msvc/create_msvc.cpp +++ b/tools/create_msvc/create_msvc.cpp @@ -1665,7 +1665,7 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b "\t\tName=\"VCCLCompilerTool\"\n" "\t\tDisableLanguageExtensions=\"true\"\n" "\t\tDisableSpecificWarnings=\"" << _globalWarnings << "\"\n" - "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines\"\n" + "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;%(SCUMMVM_LIBS)\\include\"\n" "\t\tPreprocessorDefinitions=\"" << defines << "\"\n" "\t\tExceptionHandling=\"0\"\n" "\t\tRuntimeTypeInfo=\"false\"\n" @@ -1682,6 +1682,7 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b "\t\tIgnoreDefaultLibraryNames=\"\"\n" "\t\tSubSystem=\"1\"\n" "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n" + "\t\tAdditionalLibraryDirectories=\"%(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << "\"\n" "\t/>\n" "\t\n" "\tScummVM_Global\n" "\t\t%(SCUMMVM_LIBS)\\bin;$(ExecutablePath)\n" "\t\t%(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << ";$(LibraryPath)\n" - "\t\t%(SCUMMVM_LIBS)\\include;$(IncludePath)\n" + "\t\t%(SCUMMVM_LIBS)\\include;$(IncludePath)\n" "\t\t$(Configuration)" << bits << "\\\n" "\t\t$(Configuration)" << bits << "/$(ProjectName)\\\n" "\t\n" @@ -2104,7 +2104,7 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, b "\t\t" << (isRelease ? "false" : "true") << "\n" "\t\n" "\t\n" - "\t\t\n"; + "\t\t\n"; -- cgit v1.2.3 From d6695e180cfedb723a670d94d8ed132ed896498d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Jul 2010 19:36:47 +0000 Subject: GUI: Fix tooltip drawing With help of Tanoku tooltips were switched from widgets to dialogs which helped to fix nasty bug with background not being restored. Although it is basically a hack around inconsistent font backbuffering in our GUI code, for the time being it is feasible. The patch was extended with way to specify tooltip background in the theme file. svn-id: r51217 --- gui/GuiManager.cpp | 36 +++++----- gui/GuiManager.h | 6 +- gui/ThemeEngine.cpp | 5 ++ gui/ThemeEngine.h | 2 + gui/Tooltip.cpp | 101 +++++++++++++++++++++++++++++ gui/Tooltip.h | 50 ++++++++++++++ gui/module.mk | 1 + gui/themes/default.inc | 7 ++ gui/themes/scummclassic.zip | Bin 56900 -> 57060 bytes gui/themes/scummclassic/classic_gfx.stx | 8 +++ gui/themes/scummmodern.zip | Bin 164185 -> 164369 bytes gui/themes/scummmodern/scummmodern_gfx.stx | 9 +++ gui/widget.cpp | 77 ---------------------- gui/widget.h | 25 ------- 14 files changed, 207 insertions(+), 120 deletions(-) create mode 100644 gui/Tooltip.cpp create mode 100644 gui/Tooltip.h diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index ff747c6e92..ab370425ab 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -45,11 +45,12 @@ namespace GUI { enum { kDoubleClickDelay = 500, // milliseconds - kCursorAnimateDelay = 250 + kCursorAnimateDelay = 250, + kTooltipDelay = 1250 }; // Constructor -GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), +GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), _tooltipCheck(false), _stateIsSaved(false), _cursorAnimateCounter(0), _cursorAnimateTimer(0) { _theme = 0; _useStdCursor = false; @@ -77,7 +78,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), } } - _tooltip = new Tooltip(this); + _tooltip = 0; } GuiManager::~GuiManager() { @@ -224,13 +225,6 @@ Dialog *GuiManager::getTopDialog() const { return _dialogStack.top(); } -static void tooltipCallback(void *ref) { - GuiManager *guiManager = (GuiManager *)ref; - - guiManager->getTooltip()->setVisible(true); - g_system->getTimerManager()->removeTimerProc(&tooltipCallback); -} - void GuiManager::runLoop() { Dialog *activeDialog = getTopDialog(); bool didSaveState = false; @@ -321,7 +315,14 @@ void GuiManager::runLoop() { break; case Common::EVENT_MOUSEMOVE: activeDialog->handleMouseMoved(mouse.x, mouse.y, 0); - _tooltip->setMouseXY(mouse.x, mouse.y); + + if (mouse.x != _lastMousePosition.x || mouse.y != _lastMousePosition.y) { + _lastMousePosition.x = mouse.x; + _lastMousePosition.y = mouse.y; + _lastMousePosition.time = _system->getMillis(); + } + + _tooltipCheck = true; eventTookplace = true; break; // We don't distinguish between mousebuttons (for now at least) @@ -367,11 +368,16 @@ void GuiManager::runLoop() { } } - if (eventTookplace) { - _tooltip->setVisible(false); + if (_tooltipCheck && _lastMousePosition.time + kTooltipDelay < _system->getMillis()) { + if (_tooltip == 0) + _tooltip = new Tooltip(); + + _tooltipCheck = false; + _tooltip->tooltipModal(_lastMousePosition.x, _lastMousePosition.y); + } - _system->getTimerManager()->removeTimerProc(&tooltipCallback); - _system->getTimerManager()->installTimerProc(&tooltipCallback, 2*1000000, this); + if (eventTookplace && _tooltip) { + _tooltip->mustClose(); } // Delay for a moment diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 2a187a92f9..ee1351dc9b 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -33,6 +33,7 @@ #include "graphics/font.h" #include "gui/widget.h" +#include "gui/Tooltip.h" #include "gui/ThemeEngine.h" class OSystem; @@ -93,8 +94,6 @@ public: */ bool checkScreenChange(); - Tooltip *getTooltip() { return _tooltip; } - protected: enum RedrawStatus { kRedrawDisabled = 0, @@ -119,13 +118,14 @@ protected: bool _useStdCursor; Tooltip *_tooltip; + bool _tooltipCheck; // position and time of last mouse click (used to detect double clicks) struct { int16 x, y; // Position of mouse when the click occurred uint32 time; // Time int count; // How often was it already pressed? - } _lastClick; + } _lastClick, _lastMousePosition; // mouse cursor state int _cursorAnimateCounter; diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index 6c2d8f1f7f..874df9e947 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -165,6 +165,7 @@ static const DrawDataInfo kDrawDataDefaults[] = { {kDDMainDialogBackground, "mainmenu_bg", true, kDDNone}, {kDDSpecialColorBackground, "special_bg", true, kDDNone}, {kDDPlainColorBackground, "plain_bg", true, kDDNone}, + {kDDTooltipBackground, "tooltip_bg", true, kDDNone}, {kDDDefaultBackground, "default_bg", true, kDDNone}, {kDDTextSelectionBackground, "text_selection", false, kDDNone}, {kDDTextSelectionFocusBackground, "text_selection_focus", false, kDDNone}, @@ -984,6 +985,10 @@ void ThemeEngine::drawDialogBackground(const Common::Rect &r, DialogBackground b queueDD(kDDPlainColorBackground, r); break; + case kDialogBackgroundTooltip: + queueDD(kDDTooltipBackground, r); + break; + case kDialogBackgroundDefault: queueDD(kDDDefaultBackground, r); break; diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index 3173aa4aca..f736559def 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -61,6 +61,7 @@ enum DrawData { kDDMainDialogBackground, kDDSpecialColorBackground, kDDPlainColorBackground, + kDDTooltipBackground, kDDDefaultBackground, kDDTextSelectionBackground, kDDTextSelectionFocusBackground, @@ -162,6 +163,7 @@ public: kDialogBackgroundMain, kDialogBackgroundSpecial, kDialogBackgroundPlain, + kDialogBackgroundTooltip, kDialogBackgroundDefault }; diff --git a/gui/Tooltip.cpp b/gui/Tooltip.cpp new file mode 100644 index 0000000000..64c34688df --- /dev/null +++ b/gui/Tooltip.cpp @@ -0,0 +1,101 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "common/util.h" +#include "graphics/fontman.h" +#include "gui/widget.h" +#include "gui/dialog.h" +#include "gui/GuiManager.h" + +#include "gui/Tooltip.h" +#include "gui/ThemeEval.h" + +namespace GUI { + + +Tooltip::Tooltip() : + Dialog(-1, -1, -1, -1), _maxWidth(-1) { + + _backgroundType = GUI::ThemeEngine::kDialogBackgroundTooltip; +} + +void Tooltip::mustClose() { + if (isVisible()) + Dialog::close(); +} + +bool Tooltip::tooltipModal(int x, int y) { + Widget *wdg; + + if (!g_gui.getTopDialog()) + return false; + + wdg = g_gui.getTopDialog()->findWidget(x, y); + + if (!wdg || !wdg->getTooltip()) + return false; + + if (_maxWidth == -1) { + _maxWidth = g_gui.xmlEval()->getVar("Globals.Tooltip.MaxWidth", 100); + _xdelta = g_gui.xmlEval()->getVar("Globals.Tooltip.XDelta", 0); + _ydelta = g_gui.xmlEval()->getVar("Globals.Tooltip.YDelta", 0); + } + + const Graphics::Font *tooltipFont = g_gui.theme()->getFont(ThemeEngine::kFontStyleTooltip); + + _wrappedLines.clear(); + _w = tooltipFont->wordWrapText(wdg->getTooltip(), _maxWidth - 4, _wrappedLines); + _h = (tooltipFont->getFontHeight() + 2) * _wrappedLines.size(); + + _x = MIN(g_gui.getTopDialog()->_x + x + _xdelta, g_gui.getWidth() - _w - 3); + _y = MIN(g_gui.getTopDialog()->_y + y + _ydelta, g_gui.getHeight() - _h - 3); + + open(); + g_gui.runLoop(); + + return true; +} + +void Tooltip::drawDialog() { + int num = 0; + int h = g_gui.theme()->getFontHeight(ThemeEngine::kFontStyleTooltip) + 2; + + Dialog::drawDialog(); + + for (Common::StringArray::const_iterator i = _wrappedLines.begin(); i != _wrappedLines.end(); ++i, ++num) { + g_gui.theme()->drawText( + Common::Rect(_x + 1, _y + 1 + num * h, _x + 1 +_w, _y + 1+ (num + 1) * h), *i, + ThemeEngine::kStateEnabled, + Graphics::kTextAlignLeft, + ThemeEngine::kTextInversionNone, + 0, + false, + ThemeEngine::kFontStyleTooltip, + ThemeEngine::kFontColorNormal, + false + ); + } +} + +} diff --git a/gui/Tooltip.h b/gui/Tooltip.h new file mode 100644 index 0000000000..60f3cf3a19 --- /dev/null +++ b/gui/Tooltip.h @@ -0,0 +1,50 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef GUI_TOOLTIP_H +#define GUI_TOOLTIP_H + +#include "gui/dialog.h" + +namespace GUI { + +class Tooltip : public Dialog { +public: + Tooltip(); + ~Tooltip() {} + + void drawDialog(); + bool tooltipModal(int x, int y); + void mustClose(); + +protected: + Common::String _text; + int _maxWidth; + int _xdelta, _ydelta; + + Common::StringArray _wrappedLines; +}; +} + +#endif diff --git a/gui/module.mk b/gui/module.mk index 9bf1a08d4b..72b5fa18f3 100644 --- a/gui/module.mk +++ b/gui/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS := \ ThemeEval.o \ ThemeLayout.o \ ThemeParser.o \ + Tooltip.o \ widget.o ifdef MACOSX diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 086fecc123..915ec55dca 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -877,6 +877,13 @@ "bevel='2' " "/> " " " +" " +" " +" " " " " + + + + + + + + + getFontHeight(ThemeEngine::kFontStyleTooltip) + 2; - - // Make Rect bigger for compensating the shadow - _storedState = g_gui.theme()->storeState(Common::Rect(_x - 5, _y - 5, _x + _w + 5, _y + _h + 5)); - - g_gui.theme()->startBuffering(); - g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x + _w, _y + _h), 0, ThemeEngine::kWidgetBackgroundBorderSmall); - - for (Common::StringArray::const_iterator i = _wrappedLines.begin(); i != _wrappedLines.end(); ++i, ++num) { - g_gui.theme()->drawText(Common::Rect(_x + 1, _y + 1 + num * h, _x + 1 +_w, _y + 1+ (num + 1) * h), *i, ThemeEngine::kStateEnabled, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, 0, false, ThemeEngine::kFontStyleTooltip, ThemeEngine::kFontColorNormal, false); - } - g_gui.theme()->finishBuffering(); -} - -void Tooltip::reflowLayout() { -} - -void Tooltip::setMouseXY(int x, int y) { - _mouseX = x; - _mouseY = y; -} - -void Tooltip::setVisible(bool state) { - if (state == _visible) - return; - - if (state) { - if (!_guiManager->getTopDialog()) - return; - - Widget *wdg = _guiManager->getTopDialog()->findWidget(_mouseX, _mouseY); - - if (!wdg) - return; - - if (wdg->getTooltip()) { - _visible = state; - - // Cache config values. - // NOTE: we cannot do it in the consturctor - if (_maxWidth == -1) { - _maxWidth = g_gui.xmlEval()->getVar("Globals.Tooltip.MaxWidth", 100); - _xdelta = g_gui.xmlEval()->getVar("Globals.Tooltip.XDelta", 0); - _ydelta = g_gui.xmlEval()->getVar("Globals.Tooltip.YDelta", 0); - } - - const Graphics::Font *tooltipFont = g_gui.theme()->getFont(ThemeEngine::kFontStyleTooltip); - - _wrappedLines.clear(); - _w = tooltipFont->wordWrapText(wdg->getTooltip(), _maxWidth - 4, _wrappedLines); - _h = (tooltipFont->getFontHeight() + 2) * _wrappedLines.size(); - - _x = MIN(_guiManager->getTopDialog()->_x + _mouseX + _xdelta, g_gui.getWidth() - _w - 3); - _y = MIN(_guiManager->getTopDialog()->_y + _mouseY + _ydelta, g_gui.getHeight() - _h - 3); - - draw(); - } - } else { - _visible = state; - - g_gui.theme()->restoreState(_storedState); - delete _storedState; - } -} - -#pragma mark - - StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align, const char *tooltip) : Widget(boss, x, y, w, h, tooltip), _align(align) { setFlags(WIDGET_ENABLED); diff --git a/gui/widget.h b/gui/widget.h index 25e4b9a235..92bfbf8256 100644 --- a/gui/widget.h +++ b/gui/widget.h @@ -159,31 +159,6 @@ protected: void handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { assert(_boss); _boss->handleCommand(sender, cmd, data); } }; -class GuiManager; - -class Tooltip : public GuiObject { -public: - Tooltip(GuiManager *guiManager); - - bool isVisible() const { return _visible; } - void draw(); - void reflowLayout(); - void releaseFocus() {} - void setVisible(bool state); - void setMouseXY(int x, int y); - -protected: - Common::String _text; - GuiManager *_guiManager; - bool _visible; - int _mouseX, _mouseY; - int _maxWidth; - int _xdelta, _ydelta; - - Common::StringArray _wrappedLines; - ThemeEngine::StoredState *_storedState; -}; - /* StaticTextWidget */ class StaticTextWidget : public Widget { protected: -- cgit v1.2.3 From cc6f4f4cdc1acd407cccd061e73b0ddb63f4b5ab Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Fri, 23 Jul 2010 19:52:58 +0000 Subject: SWORD2: Improve sync between local and global "mute" settings Broken Sword 2's options dialog allows you to mute any of speech, sound and sound effects, whereas ScummVM's options dialog just has one "master" mute setting. This is an attempt to keep them better in sync, though it's not perfect. Still, it may be good enough to fix bug #3032763 ("SWORD2: Mute setting does not work"). svn-id: r51218 --- engines/sword2/sword2.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 1060dcf728..3cdab2bd2b 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -326,12 +326,20 @@ void Sword2Engine::registerDefaultSettings() { } void Sword2Engine::syncSoundSettings() { - // Sound settings. At the time of writing, not all of these can be set - // by the global options dialog, but it seems silly to split them up. _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); setSubtitles(ConfMan.getBool("subtitles")); + + // Our own settings dialog can mute the music, speech and sound effects + // individually. ScummVM's settings dialog has one master mute setting. + + if (ConfMan.getBool("mute")) { + ConfMan.setBool("music_mute", true); + ConfMan.setBool("speech_mute", true); + ConfMan.setBool("sfx_mute", true); + } + _sound->muteMusic(ConfMan.getBool("music_mute")); _sound->muteSpeech(ConfMan.getBool("speech_mute")); _sound->muteFx(ConfMan.getBool("sfx_mute")); @@ -356,6 +364,13 @@ void Sword2Engine::writeSettings() { ConfMan.setBool("object_labels", _mouse->getObjectLabels()); ConfMan.setInt("reverse_stereo", _sound->isReverseStereo()); + // If even one sound type is unmuted, we can't say that all sound is + // muted. + + if (!_sound->isMusicMute() || !_sound->isSpeechMute() || !_sound->isFxMute()) { + ConfMan.setBool("mute", false); + } + ConfMan.flushToDisk(); } -- cgit v1.2.3 From 3a45e47c5c92435353d7524fea56dc7d30788dcf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 20:47:15 +0000 Subject: SCI: adding new debug command logkernel svn-id: r51220 --- engines/sci/console.cpp | 27 +++++++++++++++++++++++++++ engines/sci/console.h | 1 + engines/sci/engine/kernel.cpp | 14 +++++++++++++- engines/sci/engine/kernel.h | 7 ++++++- engines/sci/engine/vm.cpp | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index c2db56c40a..6bb2c52d84 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -168,6 +168,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger(), DCmd_Register("disasm_addr", WRAP_METHOD(Console, cmdDisassembleAddress)); DCmd_Register("send", WRAP_METHOD(Console, cmdSend)); DCmd_Register("go", WRAP_METHOD(Console, cmdGo)); + DCmd_Register("logkernel", WRAP_METHOD(Console, cmdLogKernel)); // Breakpoints DCmd_Register("bp_list", WRAP_METHOD(Console, cmdBreakpointList)); DCmd_Register("bplist", WRAP_METHOD(Console, cmdBreakpointList)); // alias @@ -374,6 +375,7 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" disasm_addr - Disassembles one or more commands\n"); DebugPrintf(" send - Sends a message to an object\n"); DebugPrintf(" go - Executes the script\n"); + DebugPrintf(" logkernel - Logs kernel calls\n"); DebugPrintf("\n"); DebugPrintf("Breakpoints:\n"); DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n"); @@ -2690,6 +2692,31 @@ bool Console::cmdGo(int argc, const char **argv) { return Cmd_Exit(argc, argv); } +bool Console::cmdLogKernel(int argc, const char **argv) { + if (argc < 3) { + DebugPrintf("Logs calls to specified kernel function.\n"); + DebugPrintf("Usage: %s \n", argv[0]); + DebugPrintf("Example: %s StrCpy on\n", argv[0]); + return true; + } + + bool logging; + if (strcmp(argv[2], "on") == 0) + logging = true; + else if (strcmp(argv[2], "off") == 0) + logging = false; + else { + DebugPrintf("2nd parameter must be either on or off\n"); + return true; + } + + if (g_sci->getKernel()->debugSetFunctionLogging(argv[1], logging)) + DebugPrintf("Logging %s for k%s\n", logging ? "enabled" : "disabled", argv[1]); + else + DebugPrintf("Unknown kernel function %s\n", argv[1]); + return true; +} + bool Console::cmdBreakpointList(int argc, const char **argv) { int i = 0; int bpdata; diff --git a/engines/sci/console.h b/engines/sci/console.h index cb96944e01..234272bbab 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -130,6 +130,7 @@ private: bool cmdDisassembleAddress(int argc, const char **argv); bool cmdSend(int argc, const char **argv); bool cmdGo(int argc, const char **argv); + bool cmdLogKernel(int argc, const char **argv); // Breakpoints bool cmdBreakpointList(int argc, const char **argv); bool cmdBreakpointDelete(int argc, const char **argv); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d7f45323aa..de64c1ea0b 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -544,7 +544,7 @@ void Kernel::mapFunctions() { _kernelFuncs[id].workarounds = NULL; _kernelFuncs[id].subFunctions = NULL; _kernelFuncs[id].subFunctionCount = 0; - _kernelFuncs[id].debugCalls = false; + _kernelFuncs[id].debugLogging = false; if (kernelName.empty()) { // No name was given -> must be an unknown opcode warning("Kernel function %x unknown", id); @@ -650,6 +650,18 @@ void Kernel::mapFunctions() { return; } +bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { + for (uint id = 0; id < _kernelFuncs.size(); id++) { + if (_kernelFuncs[id].name) { + if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { + _kernelFuncs[id].debugLogging = logging; + return true; + } + } + } + return false; +} + void Kernel::setDefaultKernelNames() { _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 8467a640af..19cf11affa 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -135,7 +135,7 @@ struct KernelFunction { const SciWorkaroundEntry *workarounds; const KernelSubFunction *subFunctions; uint16 subFunctionCount; - bool debugCalls; + bool debugLogging; }; class Kernel { @@ -216,6 +216,11 @@ public: */ void loadKernelNames(GameFeatures *features); + /** + * Sets debugCalls flag for a kernel function + */ + bool debugSetFunctionLogging(const char *kernelName, bool debugCalls); + private: /** * Sets the default kernel function names, based on the SCI version used. diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 4cd5fc224f..88d47cb22d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -642,6 +642,38 @@ static void addKernelCallToExecStack(EngineState *s, int kernelCallNr, int argc, xstack->type = EXEC_STACK_TYPE_KERNEL; } +static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv) { + Kernel *kernel = g_sci->getKernel(); + printf("k%s: ", kernelCall->name); + for (int parmNr = 0; parmNr < argc; parmNr++) { + if (parmNr) + printf(", "); + uint16 regType = kernel->findRegType(argv[parmNr]); + if (regType & SIG_TYPE_NULL) + printf("NULL"); + else if (regType & SIG_TYPE_UNINITIALIZED) + printf("UNINIT"); + else if (regType & SIG_IS_INVALID) + printf("INVALID"); + else if (regType & SIG_TYPE_INTEGER) + printf("%04x", argv[parmNr].offset); + else { + printf("%04x:%04x", PRINT_REG(argv[parmNr])); + switch (regType) { + case SIG_TYPE_OBJECT: + printf(" (%s)", s->_segMan->getObjectName(argv[parmNr])); + break; + case SIG_TYPE_REFERENCE: + printf(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str()); + break; + default: + break; + } + } + } + printf("\n"); +} + static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { Kernel *kernel = g_sci->getKernel(); @@ -676,6 +708,8 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { // Call kernel function if (!kernelCall.subFunctionCount) { + if (kernelCall.debugLogging) + logKernelCall(&kernelCall, s, argc, argv); addKernelCallToExecStack(s, kernelCallNr, argc, argv); s->r_acc = kernelCall.function(s, argc, argv); } else { -- cgit v1.2.3 From 9fc67f5c0b3eb7ad377372da7ccff87d5203de0c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 23 Jul 2010 20:55:44 +0000 Subject: KYRA: Mark Kyra 1 Mac as General MIDI only. It might be noteworthy that we do not support the music yet, but that might change one day. We also do not mark the Kyra 1 Mac CD as GM only, since that uses the included DOS sound files for now. svn-id: r51221 --- engines/kyra/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index 390281c356..fe4cc7298f 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -228,7 +228,7 @@ const KYRAGameDescription adGameDescs[] = { Common::EN_ANY, Common::kPlatformMacintosh, ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH + Common::GUIO_NOSPEECH | Common::GUIO_MIDIGM }, KYRA1_FLOPPY_FLAGS }, -- cgit v1.2.3 From b984d9afc09369f505482bfef9cda26a53efb572 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 20:59:27 +0000 Subject: SCI: logkernel changes removing old manual debug code, use logkernel * on/off to log all calls svn-id: r51222 --- engines/sci/console.cpp | 2 +- engines/sci/engine/kernel.cpp | 20 ++++++++++++++------ engines/sci/engine/vm.cpp | 27 ++++++++------------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 6bb2c52d84..501a0fa954 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -2695,7 +2695,7 @@ bool Console::cmdGo(int argc, const char **argv) { bool Console::cmdLogKernel(int argc, const char **argv) { if (argc < 3) { DebugPrintf("Logs calls to specified kernel function.\n"); - DebugPrintf("Usage: %s \n", argv[0]); + DebugPrintf("Usage: %s \n", argv[0]); DebugPrintf("Example: %s StrCpy on\n", argv[0]); return true; } diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index de64c1ea0b..21331335f7 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -651,15 +651,23 @@ void Kernel::mapFunctions() { } bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { - for (uint id = 0; id < _kernelFuncs.size(); id++) { - if (_kernelFuncs[id].name) { - if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { - _kernelFuncs[id].debugLogging = logging; - return true; + if (strcmp(kernelName, "*")) { + for (uint id = 0; id < _kernelFuncs.size(); id++) { + if (_kernelFuncs[id].name) { + if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { + _kernelFuncs[id].debugLogging = logging; + return true; + } } } + return false; } - return false; + // Set debugLogging for all calls + for (uint id = 0; id < _kernelFuncs.size(); id++) { + if (_kernelFuncs[id].name) + _kernelFuncs[id].debugLogging = logging; + } + return true; } void Kernel::setDefaultKernelNames() { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 88d47cb22d..05164f2f76 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -642,7 +642,7 @@ static void addKernelCallToExecStack(EngineState *s, int kernelCallNr, int argc, xstack->type = EXEC_STACK_TYPE_KERNEL; } -static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv) { +static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv, reg_t result) { Kernel *kernel = g_sci->getKernel(); printf("k%s: ", kernelCall->name); for (int parmNr = 0; parmNr < argc; parmNr++) { @@ -671,7 +671,10 @@ static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int } } } - printf("\n"); + if (result.segment) + printf(" = %04x:%04x\n", PRINT_REG(result)); + else + printf(" = %04x\n", result.offset); } static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { @@ -708,10 +711,11 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { // Call kernel function if (!kernelCall.subFunctionCount) { - if (kernelCall.debugLogging) - logKernelCall(&kernelCall, s, argc, argv); addKernelCallToExecStack(s, kernelCallNr, argc, argv); s->r_acc = kernelCall.function(s, argc, argv); + + if (kernelCall.debugLogging) + logKernelCall(&kernelCall, s, argc, argv, s->r_acc); } else { // Sub-functions available, check signature and call that one directly if (argc < 1) @@ -757,21 +761,6 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { s->r_acc = kernelSubCall.function(s, argc, argv); } -#if 0 - // Used for debugging - Common::String debugMsg = Common::String::printf("%s [0x%x]", kernelCall.name, kernelCallNr) + - Common::String::printf(", %d params: ", argc) + - " ("; - - for (int i = 0; i < argc; i++) { - debugMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); - debugMsg += (i == argc - 1 ? ")" : ", "); - } - - debugMsg += ", result: " + Common::String::printf("%04x:%04x", PRINT_REG(s->r_acc)); - debug("%s", debugMsg.c_str()); -#endif - // Remove callk stack frame again, if there's still an execution stack if (s->_executionStack.begin() != s->_executionStack.end()) s->_executionStack.pop_back(); -- cgit v1.2.3 From afc872cba8e577f54af2457c4e457e1489fafcbc Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Jul 2010 21:11:56 +0000 Subject: AGI: Fix bug #3017911 Bug #3017911: "AGI (Fan): SQ0 - Ego flickering". It is a regression from r49745, as it appeared, some of the screen updates were too much. svn-id: r51223 --- engines/agi/sprite.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 25118b69a6..d65fda7f9d 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -458,11 +458,11 @@ void SpritesMgr::blitSprites(SpriteList& l) { */ void SpritesMgr::commitUpdSprites() { - commitSprites(_sprUpd, true); + commitSprites(_sprUpd); } void SpritesMgr::commitNonupdSprites() { - commitSprites(_sprNonupd, true); + commitSprites(_sprNonupd); } // check moves in both lists -- cgit v1.2.3 From d92cece58a039b77f6dc8039a453d896dd6f9800 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 21:13:57 +0000 Subject: SCI: some small logkernel changes svn-id: r51224 --- engines/sci/engine/vm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 05164f2f76..ed094b4cd6 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -650,13 +650,13 @@ static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int printf(", "); uint16 regType = kernel->findRegType(argv[parmNr]); if (regType & SIG_TYPE_NULL) - printf("NULL"); + printf("0"); else if (regType & SIG_TYPE_UNINITIALIZED) printf("UNINIT"); else if (regType & SIG_IS_INVALID) printf("INVALID"); else if (regType & SIG_TYPE_INTEGER) - printf("%04x", argv[parmNr].offset); + printf("%d", argv[parmNr].offset); else { printf("%04x:%04x", PRINT_REG(argv[parmNr])); switch (regType) { -- cgit v1.2.3 From d73c8578ff0d707fbf2992162971a7eeb2067ffa Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 23 Jul 2010 21:20:35 +0000 Subject: SCI: result now displayed in decimal for logkernel svn-id: r51225 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index ed094b4cd6..2f1221bec3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -674,7 +674,7 @@ static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int if (result.segment) printf(" = %04x:%04x\n", PRINT_REG(result)); else - printf(" = %04x\n", result.offset); + printf(" = %d\n", result.offset); } static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { -- cgit v1.2.3 From 1867b44bf4fd9e1cfb9861f7e0e3ed65ba5144a7 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Jul 2010 21:26:30 +0000 Subject: GUI: Fix bug #3024930 Bug #3024930: "GUI: GMM errors out in Hercules mode". Fixed by switching Hercules resolutions to lowres GUI. svn-id: r51226 --- gui/themes/default.inc | 4 ++-- gui/themes/scummclassic.zip | Bin 57060 -> 57075 bytes gui/themes/scummclassic/classic_layout.stx | 2 +- gui/themes/scummclassic/classic_layout_lowres.stx | 2 +- gui/themes/scummmodern.zip | Bin 164369 -> 164384 bytes gui/themes/scummmodern/scummmodern_layout.stx | 2 +- .../scummmodern/scummmodern_layout_lowres.stx | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 915ec55dca..11460e7199 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1,5 +1,5 @@ "" -" " +" " " " " " " " @@ -1216,7 +1216,7 @@ "/> " " " " " -" " +" " " " " " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 4a31a8ebb9..b6b4ffe2e7 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 80bc4bf41e..0a38ea4b40 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -23,7 +23,7 @@ - $Id$ - --> - + diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 64ac6e200a..76838f5476 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -23,7 +23,7 @@ - $Id$ - --> - + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index b5e8f24019..dacec7f580 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 796d4d9a94..3dac5f0f3f 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -23,7 +23,7 @@ - $Id$ - --> - + diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 8bb31e9f8a..42e61286aa 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -23,7 +23,7 @@ - $Id$ - --> - + -- cgit v1.2.3 From cd66b7d11b4a1f3082b62d440e1b010a40be94b5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 24 Jul 2010 01:07:04 +0000 Subject: M4: Enhanced the show_codes debug command to also show a scene's walking points svn-id: r51230 --- engines/m4/scene.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index ca59710586..08d79f0f66 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -154,8 +154,21 @@ void Scene::showCodes() { colors[255 * 4 + 2] = 255; _vm->_palette->setPalette(colors, 0, 256); } else { - // For MADS, simply copy the walk data to the background, in whatever current palette is active + // MADS handling + + // copy the walk data to the background, in whatever current palette is active _walkSurface->copyTo(_backgroundSurface); + + // Show all the scene's walk nodes + SceneNodeList &nodeList = _madsVm->scene()->getSceneResources()._nodes; + _backgroundSurface->setColour(_madsVm->_palette->WHITE); + for (uint i = 0; i < nodeList.size() - 2; ++i) { + // Draw a little cross at the node's position + _backgroundSurface->hLine(nodeList[i].pt.x - 2, nodeList[i].pt.x + 2, nodeList[i].pt.y); + _backgroundSurface->vLine(nodeList[i].pt.x, nodeList[i].pt.y - 2, nodeList[i].pt.y + 2); + } + + ((MadsScene *)this)->_spriteSlots.fullRefresh(); } } -- cgit v1.2.3 From ec460ca2cabf426a6b3591d32a68872897c00ac3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 24 Jul 2010 05:56:06 +0000 Subject: M4: Implemented lots of support code for pre-action handling svn-id: r51235 --- engines/m4/console.cpp | 8 ++-- engines/m4/hotspot.h | 1 + engines/m4/m4_scene.cpp | 12 ++--- engines/m4/mads_logic.cpp | 6 ++- engines/m4/mads_logic.h | 1 + engines/m4/mads_menus.cpp | 2 +- engines/m4/mads_menus.h | 2 +- engines/m4/mads_scene.cpp | 45 ++++++++++++++++--- engines/m4/mads_scene.h | 4 ++ engines/m4/mads_views.cpp | 111 +++++++++++++++++++++++++++++++++++++++------- engines/m4/mads_views.h | 33 ++++++++++---- engines/m4/scene.cpp | 10 ++--- engines/m4/scene.h | 7 ++- 13 files changed, 190 insertions(+), 52 deletions(-) diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp index 19fbf6e852..71c70e3e1b 100644 --- a/engines/m4/console.cpp +++ b/engines/m4/console.cpp @@ -103,8 +103,8 @@ bool Console::cmdListHotSpots(int argc, const char **argv) { if (_vm->isM4()) { DebugPrintf("Scene parallax\n"); _m4Vm->scene()->getSceneResources().parallax->dump(); - DebugPrintf("Scene props\n"); - _vm->_scene->getSceneResources().props->dump(); + DebugPrintf("Scene dynamic hotspots\n"); + _vm->_scene->getSceneResources().dynamicHotspots->dump(); } return true; } @@ -400,9 +400,9 @@ bool M4Console::cmdSceneInfo(int argc, const char **argv) { DebugPrintf("Scene resources:\n"); DebugPrintf("artBase: %s\n", _m4Vm->scene()->getSceneResources().artBase); DebugPrintf("pictureBase: %s\n", _m4Vm->scene()->getSceneResources().pictureBase); - DebugPrintf("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspotCount); + DebugPrintf("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspots->size()); DebugPrintf("parallaxCount: %i\n", _m4Vm->scene()->getSceneResources().parallaxCount); - DebugPrintf("propsCount: %i\n", _m4Vm->scene()->getSceneResources().propsCount); + DebugPrintf("dynHotspotCount: %i\n", _m4Vm->scene()->getSceneResources().dynamicHotspots->size()); DebugPrintf("frontY: %i\n", _m4Vm->scene()->getSceneResources().frontY); DebugPrintf("backY: %i\n", _m4Vm->scene()->getSceneResources().backY); DebugPrintf("frontScale: %i\n", _m4Vm->scene()->getSceneResources().frontScale); diff --git a/engines/m4/hotspot.h b/engines/m4/hotspot.h index b06865c39a..f650d5ff54 100644 --- a/engines/m4/hotspot.h +++ b/engines/m4/hotspot.h @@ -104,6 +104,7 @@ public: int add(HotSpot *hotspot, bool head = false); HotSpot *get(int index) { return _hotspots[index]; } HotSpot &operator[](int idx) { return *get(idx); } + int size() const { return _hotspots.size(); } void remove(HotSpot *hotspot); void unlinkItem(HotSpot *hotspot); void clear(); diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp index 0c984af448..475fdba653 100644 --- a/engines/m4/m4_scene.cpp +++ b/engines/m4/m4_scene.cpp @@ -45,7 +45,7 @@ M4Scene::M4Scene(M4Engine *vm): _sceneResources(), Scene(vm, &_sceneResources) { _sceneResources.hotspots = new HotSpotList(); _sceneResources.parallax = new HotSpotList(); - _sceneResources.props = new HotSpotList(); + _sceneResources.dynamicHotspots = new HotSpotList(); _interfaceSurface = new M4InterfaceView(vm); } @@ -74,9 +74,9 @@ void M4Scene::loadSceneResources(int sceneNumber) { if (sceneS != NULL) { sceneS->read(_sceneResources.artBase, MAX_CHK_FILENAME_SIZE); sceneS->read(_sceneResources.pictureBase, MAX_CHK_FILENAME_SIZE); - _sceneResources.hotspotCount = sceneS->readUint32LE(); + int hotspotCount = sceneS->readUint32LE(); _sceneResources.parallaxCount = sceneS->readUint32LE(); - _sceneResources.propsCount = sceneS->readUint32LE(); + int dynHotspotCount = sceneS->readUint32LE(); _sceneResources.frontY = sceneS->readUint32LE(); _sceneResources.backY = sceneS->readUint32LE(); _sceneResources.frontScale = sceneS->readUint32LE(); @@ -99,11 +99,11 @@ void M4Scene::loadSceneResources(int sceneNumber) { // Clear current hotspot lists _sceneResources.hotspots->clear(); _sceneResources.parallax->clear(); - _sceneResources.props->clear(); + _sceneResources.dynamicHotspots->clear(); - _sceneResources.hotspots->loadHotSpots(sceneS, _sceneResources.hotspotCount); + _sceneResources.hotspots->loadHotSpots(sceneS, hotspotCount); _sceneResources.parallax->loadHotSpots(sceneS, _sceneResources.parallaxCount); - _sceneResources.props->loadHotSpots(sceneS, _sceneResources.propsCount); + _sceneResources.dynamicHotspots->loadHotSpots(sceneS, dynHotspotCount); // Note that toss() deletes the MemoryReadStream _vm->res()->toss(filename); diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index e451a306ef..f3f284d1a3 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -418,8 +418,12 @@ void MadsSceneLogic::enterScene() { lowRoomsEntrySound(); } -void MadsSceneLogic::doAction() { +void MadsSceneLogic::doPreactions() { + warning("Still to do preactions logic"); +} +void MadsSceneLogic::doAction() { + warning("Still to do actions logic"); } void MadsSceneLogic::sceneStep() { diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 98d6df6163..28120377e2 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -59,6 +59,7 @@ public: void setupScene(); void enterScene(); + void doPreactions(); void doAction(); void sceneStep(); }; diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index d7d9cf4150..810acb04fb 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -809,7 +809,7 @@ void RexDialogView::setFrame(int frameNumber, int depth) { } void RexDialogView::initVars() { - _word_8502C = -1; + _v8502C = -1; _selectedLine = -1; _lineIndex = 0; _enterFlag = false; diff --git a/engines/m4/mads_menus.h b/engines/m4/mads_menus.h index e964c5866d..a0fc6fb3bc 100644 --- a/engines/m4/mads_menus.h +++ b/engines/m4/mads_menus.h @@ -136,7 +136,7 @@ protected: int _dialogSelectedLine; Common::StringArray _saveList; - int _word_8502C; + int _v8502C; int _selectedLine; int _lineIndex; bool _enterFlag; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index c459a2a58a..1f43f73cc0 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -195,24 +195,21 @@ void MadsScene::loadSceneHotspots(int sceneNumber) { int hotspotCount = hotspotStream->readUint16LE(); delete hotspotStream; - _sceneResources.hotspotCount = hotspotCount; - hotspotStream = hotSpotData.getItemStream(1); // Clear current hotspot lists _sceneResources.hotspots->clear(); - - _sceneResources.hotspots->loadHotSpots(hotspotStream, _sceneResources.hotspotCount); + _sceneResources.hotspots->loadHotSpots(hotspotStream, hotspotCount); delete hotspotStream; } void MadsScene::leaveScene() { _sceneResources.hotspots->clear(); - _sceneResources.props->clear(); + _sceneResources.dynamicHotspots->clear(); delete _sceneResources.hotspots; - delete _sceneResources.props; + delete _sceneResources.dynamicHotspots; delete _walkSurface; if (_activeAnimation) { @@ -322,6 +319,21 @@ void MadsScene::updateState() { // _screenObjects.check(v, false); } + // Handle starting off any selected action + bool lookFlag = false; + if ((_action._selectedAction != 0) && _madsVm->_player._stepEnabled && + !_action._verbNounFlag && !_abortTimers && !_madsVm->_player._unk3) { + // Start the action + _action.startAction(); + + lookFlag = (_action._action.verbId == kVerbLookAt) || (_action._action.verbId == kVerbLook); + } + if (lookFlag || ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_2))) + doPreactions(); + + checkStartWalk(); + + // Update the player _madsVm->_player.update(); // Handle refreshing the mouse position display @@ -364,6 +376,25 @@ void MadsScene::updateState() { freeAnimation(); } +void MadsScene::checkStartWalk() { + if (_action._verbNounFlag && _action._walkFlag) { + _madsVm->_player.setDest(_destPos.x, _destPos.y, _destFacing); + _action._verbNounFlag = false; + } +} + +void MadsScene::doPreactions() { + if ((_screenObjects._v832EC == 0) || (_screenObjects._v832EC == 2)) { + _abortTimersMode2 = ABORTMODE_2; + _action.checkAction(); + + _sceneLogic.doPreactions(); + + if (_abortTimersMode == ABORTMODE_2) + _abortTimers = 0; + } +} + /** * Does extra work at cleaning up the animation, and then deletes it */ @@ -999,7 +1030,7 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int act._flags1 = obj->vocabList[1].flags1; act._flags2 = obj->vocabList[1].flags2; - act._action.hotspotId = _selectedObject; + act._action.verbId = _selectedObject; act._articleNumber = act._flags2; } } diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 2bd38aff6f..baa6a67861 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -98,9 +98,13 @@ private: void clearAction(); void appendActionVocab(int vocabId, bool capitalise); void setAction(); + void checkStartWalk(); + void doPreactions(); public: char _aaName[100]; bool _showMousePos; + Common::Point _destPos; + int _destFacing; public: MadsScene(MadsEngine *vm); virtual ~MadsScene(); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 34218cebfd..a8a8e09105 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -49,20 +49,21 @@ void MadsAction::clear() { _v83338 = 1; _actionMode = ACTMODE_NONE; _actionMode2 = ACTMODE2_0; - _word_86F42 = 0; - _word_86F4E = 0; + _v86F42 = 0; + _v86F4E = 0; _articleNumber = 0; _lookFlag = false; - _word_86F4A = 0; + _v86F4A = 0; _statusText[0] = '\0'; _selectedRow = -1; _hotspotId = -1; - _word_86F3A = -1; - _word_86F4C = -1; - _action.hotspotId = -1; + _v86F3A = -1; + _v86F4C = -1; + _action.verbId = -1; _action.objectNameId = -1; _action.indirectObjectId = -1; _textChanged = true; + _walkFlag = false; } void MadsAction::appendVocab(int vocabId, bool capitalise) { @@ -76,7 +77,7 @@ void MadsAction::appendVocab(int vocabId, bool capitalise) { } void MadsAction::set() { - int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount; + int hotspotCount = _madsVm->scene()->getSceneResources().hotspots->size(); bool flag = false; strcpy(_statusText, ""); @@ -148,7 +149,7 @@ void MadsAction::set() { verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVerbID(); } else { // Get the verb Id from the scene object - verbId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId - hotspotCount].getVerbID(); + verbId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId - hotspotCount].getVerbID(); } if (verbId > 0) { @@ -171,7 +172,7 @@ void MadsAction::set() { _action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID(); } else { // Get name from temporary scene hotspot - _action.objectNameId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId].getVocabID(); + _action.objectNameId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId].getVocabID(); } appendVocab(_action.objectNameId); } @@ -179,13 +180,13 @@ void MadsAction::set() { if ((_hotspotId >= 0) && (_articleNumber > 0) && !flag) { if (_articleNumber == -1) { - if (_word_86F3A >= 0) { + if (_v86F3A >= 0) { int articleNum = 0; - if ((_word_86F42 == 2) || (_word_86F42 == 5)) { + if ((_v86F42 == 2) || (_v86F42 == 5)) { int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId); articleNum = _madsVm->globals()->getObject(objectId)->article; - } else if (_word_86F3A < hotspotCount) { + } else if (_v86F3A < hotspotCount) { articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle(); } else { @@ -205,7 +206,7 @@ void MadsAction::set() { } // Append object description if necessary - if (_word_86F3A >= 0) + if (_v86F3A >= 0) appendVocab(_action.indirectObjectId); // Remove any trailing space character @@ -252,6 +253,86 @@ void MadsAction::refresh() { _textChanged = false; } +void MadsAction::startAction() { + _madsVm->_player.moveComplete(); + + _v84538 = -1; + _v8453A = 0; + _savedFields.selectedRow = _selectedRow; + _savedFields.articleNumber = _articleNumber; + _savedFields.actionMode = _actionMode; + _savedFields.actionMode2 = _actionMode2; + _savedFields.lookFlag = _lookFlag; + int savedHotspotId = _hotspotId; + int savedV86F3A = _v86F3A; + int savedV86F42 = _v86F42; + + // Copy the action to be active + _activeAction = _action; + strcpy(_dialogTitle, _statusText); + + if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0)) + _v8453A = true; + + _verbNounFlag = false; + int hotspotId = -1; + HotSpotList &dynHotspots = *_madsVm->scene()->getSceneResources().dynamicHotspots; + HotSpotList &hotspots = *_madsVm->scene()->getSceneResources().hotspots; + + if (!_savedFields.lookFlag && (_madsVm->scene()->_screenObjects._v832EC != 1)) { + if (_savedFields.actionMode2 == ACTMODE2_4) + hotspotId = savedHotspotId; + else if (savedV86F42 == 4) + hotspotId = savedV86F3A; + + if (hotspotId >= hotspots.size()) { + HotSpot &hs = dynHotspots[hotspotId - hotspots.size()]; + if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { + if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { + _verbNounFlag = true; + _madsVm->scene()->_destPos = _customDest; + } + } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { + _verbNounFlag = true; + _madsVm->scene()->_destPos.x = hs.getFeetX(); + _madsVm->scene()->_destPos.y = hs.getFeetY(); + } + _madsVm->scene()->_destFacing = hs.getFacing(); + } + hotspotId = -1; + } + + if (hotspotId >= 0) { + HotSpot &hs = hotspots[hotspotId]; + if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { + if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { + _verbNounFlag = true; + _madsVm->scene()->_destPos = _customDest; + } + } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { + _verbNounFlag = true; + _madsVm->scene()->_destPos.x = hs.getFeetX(); + _madsVm->scene()->_destPos.y = hs.getFeetY(); + } + _madsVm->scene()->_destFacing = hs.getFacing(); + } +} + +void MadsAction::checkAction() { + if (isAction(kVerbLookAt) || isAction(kVerbThrow)) + _verbNounFlag = 0; +} + +bool MadsAction::isAction(int verbId, int objectNameId, int indirectObjectId) { + if (_activeAction.verbId != verbId) + return false; + if ((objectNameId != 0) && (_activeAction.objectNameId != objectNameId)) + return false; + if ((indirectObjectId != 0) && (_activeAction.indirectObjectId != indirectObjectId)) + return false; + return true; +} + //-------------------------------------------------------------------------- bool MadsSpriteSlot::operator==(const SpriteSlotSubset &other) const { @@ -407,8 +488,8 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { // Get a list of sprite object depths for active objects for (int i = 0; i < startIndex; ++i) { - if (_entries[i].spriteType >= 0) { - DepthEntry rec(_entries[i].depth, i); + if (_entries[i].spriteType >= SPRITE_ZERO) { + DepthEntry rec(16 - _entries[i].depth, i); depthList.push_back(rec); } } diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index d29947390a..3f5615ee37 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -37,22 +37,31 @@ namespace M4 { class MadsView; enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; -enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_5 = 5}; +enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5}; struct ActionDetails { - int hotspotId; + int verbId; int objectNameId; int indirectObjectId; }; +struct MadsActionSavedFields { + int articleNumber; + int actionMode; + int actionMode2; + bool lookFlag; + int selectedRow; +}; + class MadsAction { private: MadsView &_owner; char _statusText[100]; + char _dialogTitle[100]; void appendVocab(int vocabId, bool capitalise = false); public: - ActionDetails _action; + ActionDetails _action, _activeAction; int _currentAction; int8 _flags1, _flags2; MadsActionMode _actionMode; @@ -65,14 +74,19 @@ public: bool _verbNounFlag; int _statusTextIndex; int _hotspotId; + MadsActionSavedFields _savedFields; + bool _walkFlag; + Common::Point _customDest; // Unknown fields - int16 _word_86F3A; - int16 _word_86F42; - int16 _word_86F4E; - int16 _word_86F4A; - int16 _word_86F4C; + int16 _v86F3A; + int16 _v86F42; + int16 _v86F4E; + bool _v86F4A; + int16 _v86F4C; int _v83338; + int _v84538; + bool _v8453A; public: MadsAction(MadsView &owner); @@ -81,6 +95,9 @@ public: void set(); const char *statusText() const { return _statusText; } void refresh(); + void startAction(); + void checkAction(); + bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0); }; enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2}; diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 08d79f0f66..361d1bad47 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -44,7 +44,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, _screenType = VIEWID_SCENE; _sceneResources->hotspots = new HotSpotList(); - _sceneResources->props = new HotSpotList(); + _sceneResources->dynamicHotspots = new HotSpotList(); _backgroundSurface = new M4Surface(); _walkSurface = new M4Surface(); _palData = NULL; @@ -123,14 +123,14 @@ void Scene::showHotSpots() { HotSpot *currentHotSpot; // hotspots (green) - for (i = 0; i < _sceneResources->hotspotCount; i++) { + for (i = 0; i < _sceneResources->hotspots->size(); i++) { currentHotSpot = _sceneResources->hotspots->get(i); _backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->GREEN); } - // props (red) - for (i = 0; i < _sceneResources->propsCount; i++) { - currentHotSpot = _sceneResources->props->get(i); + // Dynamic hotspots (red) + for (i = 0; i < _sceneResources->dynamicHotspots->size(); i++) { + currentHotSpot = _sceneResources->dynamicHotspots->get(i); _backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED); } } diff --git a/engines/m4/scene.h b/engines/m4/scene.h index 76b99a7bcd..e6eaed0ab9 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -53,17 +53,16 @@ enum MADSVerbs { kVerbPull = 10, kVerbClose = 11, kVerbThrow = 12, - kVerbWalkTo = 13 + kVerbWalkTo = 13, + kVerbLookAt = 209 }; class SceneResources { public: char artBase[MAX_CHK_FILENAME_SIZE]; char pictureBase[MAX_CHK_FILENAME_SIZE]; - int32 hotspotCount; HotSpotList *hotspots; - int32 propsCount; - HotSpotList *props; + HotSpotList *dynamicHotspots; int32 frontY, backY; int32 frontScale, backScale; int16 depthTable[16]; -- cgit v1.2.3 From bc04a8377be36480b4a4b737e7f3ca14cde62e6e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 07:45:47 +0000 Subject: SCI: adding workaround for room 150 sq4 svn-id: r51237 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 136a4db988..0f6232bc36 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -113,6 +113,7 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From c8cde0735fdc1ccbcdeb9075433d9f31bf03f86f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 07:55:29 +0000 Subject: SCI: adding workaround for sq4 room 391 svn-id: r51238 --- engines/sci/engine/workarounds.cpp | 1 + engines/sci/graphics/paint16.cpp | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0f6232bc36..5d80524193 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -107,6 +107,7 @@ const SciWorkaroundEntry kAbs_workarounds[] = { const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object + { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index bd164b79b8..9361c1adbc 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -464,7 +464,7 @@ void GfxPaint16::kernelGraphRedrawBox(Common::Rect rect) { #define SCI_DISPLAY_DONTSHOWBITS 121 reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { - int displayArg; + reg_t displayArg; TextAlignment alignment = SCI_TEXT16_ALIGNMENT_LEFT; int16 colorPen = -1, colorBack = -1, width = -1, bRedraw = 1; bool doSaveUnder = false; @@ -481,12 +481,11 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { _ports->textGreyedOutput(false); // processing codes in argv while (argc > 0) { - if (argv[0].segment) - displayArg = 0xFFFF; - else - displayArg = argv[0].toUint16(); + displayArg = argv[0]; + if (displayArg.segment) + displayArg.offset = 0xFFFF; argc--; argv++; - switch (displayArg) { + switch (displayArg.offset) { case SCI_DISPLAY_MOVEPEN: _ports->moveTo(argv[0].toUint16(), argv[1].toUint16()); argc -= 2; argv += 2; @@ -536,7 +535,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_DUMMY2: if (!((g_sci->getGameId() == GID_LONGBOW) && (g_sci->isDemo()))) error("Unknown kDisplay argument %X", displayArg); - if (displayArg == SCI_DISPLAY_DUMMY2) { + if (displayArg.offset == SCI_DISPLAY_DUMMY2) { if (argc) { argc--; argv++; } else { @@ -548,7 +547,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { SciTrackOriginReply originReply; SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kDisplay_workarounds, &originReply); if (solution.type == WORKAROUND_NONE) - error("Unknown kDisplay argument (%04x:%04x) from method %s::%s (script %d, localCall %x)", PRINT_REG(argv[0]), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("Unknown kDisplay argument (%04x:%04x) from method %s::%s (script %d, localCall %x)", PRINT_REG(displayArg), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); assert(solution.type == WORKAROUND_IGNORE); break; } -- cgit v1.2.3 From 0191f8fd7157e29e92f89f82cb15e44949c11357 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 24 Jul 2010 08:08:19 +0000 Subject: M4: Bugfixes for depth ordering to fix the Z order of on-screen objects svn-id: r51239 --- engines/m4/graphics.cpp | 4 ++-- engines/m4/mads_logic.cpp | 37 ++++++++++++++++++------------------- engines/m4/mads_logic.h | 6 +++--- engines/m4/mads_player.cpp | 2 +- engines/m4/mads_views.cpp | 13 ++++++++++--- engines/m4/mads_views.h | 10 +++++----- 6 files changed, 39 insertions(+), 33 deletions(-) diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index c10ea6c9f6..423dda5e7e 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -443,7 +443,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, for (int rowCtr = 0; rowCtr < copyRect.height(); ++rowCtr) { // Copy each byte one at a time checking against the depth for (int xCtr = 0; xCtr < copyRect.width(); ++xCtr) { - if ((depthsPtr[xCtr] > depth) && (srcPtr[xCtr] != transparentColour)) + if ((depth <= (depthsPtr[xCtr] & 0x7f)) && (srcPtr[xCtr] != transparentColour)) destPtr[xCtr] = srcPtr[xCtr]; } @@ -557,7 +557,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, // Not a display pixel continue; - if ((*srcP != transparentColour) && (depth <= *depthP)) + if ((*srcP != transparentColour) && (depth <= (*depthP & 0x7f))) *destP = *srcP; ++destP; diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index f3f284d1a3..49ba7e1468 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -189,30 +189,30 @@ uint16 MadsSceneLogic::loadSpriteSet(uint16 suffixNum, uint16 sepChar) { return _madsVm->scene()->loadSceneSpriteSet(resName); } -uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { +uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0); uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, 1, ANIMTYPE_REVERSIBLE, 0, 0); } -uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { +uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0); uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, 1, ANIMTYPE_CYCLED, 0, 0); } -uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { +uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks) { M4Sprite *spriteFrame = _madsVm->scene()->_spriteSlots.getSprite(srcSpriteIdx).getFrame(0); uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, v0, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, -1, ANIMTYPE_CYCLED, 0, 0); } @@ -354,20 +354,18 @@ void MadsSceneLogic::enterScene() { _spriteIndexes[12] = loadSpriteSet(8, 'x'); _spriteIndexes[13] = loadSpriteSet(0, 'x'); - _spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], 0, 5, 0, 0, 25); - - _spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], 0, 4, 0, 1, 0); - _spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], 0, 4, 0, 1, 0); + _spriteIndexes[15] = startCycledSpriteSequence(_spriteIndexes[0], false, 5, 0, 0, 25); + _spriteIndexes[16] = startCycledSpriteSequence(_spriteIndexes[1], false, 4, 0, 1, 0); + _spriteIndexes[17] = startCycledSpriteSequence(_spriteIndexes[2], false, 4, 0, 1, 0); _madsVm->scene()->_sequenceList.addSubEntry(_spriteIndexes[17], SM_FRAME_INDEX, 7, 70); - _spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], 0, 10, 0, 0, 60); - _spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], 0, 5, 0, 1, 0); - _spriteIndexes[20] = startCycledSpriteSequence(_spriteIndexes[5], 0, 10, 0, 2, 0); - _spriteIndexes[21] = startCycledSpriteSequence(_spriteIndexes[6], 0, 6, 0, 0, 0); - - _spriteIndexes[23] = startCycledSpriteSequence(_spriteIndexes[8], 0, 6, 0, 10, 4); - _spriteIndexes[24] = startCycledSpriteSequence(_spriteIndexes[9], 0, 6, 0, 32, 47); + _spriteIndexes[18] = startReversibleSpriteSequence(_spriteIndexes[3], false, 10, 0, 0, 60); + _spriteIndexes[19] = startCycledSpriteSequence(_spriteIndexes[4], false, 5, 0, 1, 0); + _spriteIndexes[20] = startCycledSpriteSequence(_spriteIndexes[5], false, 10, 0, 2, 0); + _spriteIndexes[21] = startCycledSpriteSequence(_spriteIndexes[6], false, 6, 0, 0, 0); + _spriteIndexes[23] = startCycledSpriteSequence(_spriteIndexes[8], false, 6, 0, 10, 4); + _spriteIndexes[24] = startCycledSpriteSequence(_spriteIndexes[9], false, 6, 0, 32, 47); activateHotspot(0x137, false); // SHIELD MODULATOR // shield_panel_opened = 0; @@ -386,7 +384,7 @@ void MadsSceneLogic::enterScene() { _madsVm->_player._direction = 9; // TODO: Extra flags setting - _spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], 0, 3, 0, 0, 0); + _spriteIndexes[25] = startCycledSpriteSequence(_spriteIndexes[10], false, 3, 0, 0, 0); _madsVm->scene()->_sequenceList.setAnimRange(_spriteIndexes[25], 17, 17); activateHotspot(0x47, false); // CHAIR /*timer_unk1 = */_madsVm->scene()->_dynamicHotspots.add(0x47, 0x13F /*SIT_IN*/, -1, @@ -395,7 +393,8 @@ void MadsSceneLogic::enterScene() { //if (_madsVm->globals()->previousScene == 112) // room101Check(); } else { - _spriteIndexes[26] = startCycledSpriteSequence(_spriteIndexes[11], 0, 6, 0, 0, 0); + _spriteIndexes[26] = startCycledSpriteSequence(_spriteIndexes[11], false, 6, 0, 0, 0); + _madsVm->scene()->_sequenceList.setDepth(_spriteIndexes[26], 4); } _madsVm->globals()->loadQuoteSet(0x31, 0x32, 0x37, 0x38, 0x39, -1); diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 28120377e2..b5608dc721 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -37,9 +37,9 @@ class MadsSceneLogic { private: // Library interface methods uint16 loadSpriteSet(uint16 suffixNum, uint16 sepChar); - uint16 startReversibleSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); - uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); - uint16 startSpriteSequence3(uint16 srcSpriteIdx, int v0, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); + uint16 startReversibleSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); + uint16 startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); + uint16 startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, int numTicks, int triggerCountdown, int timeoutTicks, int extraTicks); void activateHotspot(int idx, bool active); void lowRoomsEntrySound(); void getPlayerSpritesPrefix(); diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index a8b6469771..19cd9eafe5 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -136,7 +136,7 @@ void MadsPlayer::update() { int yp = MIN(_playerPos.y, (int16)155); for (int idx = 1; idx < 15; ++idx) { - if (_madsVm->scene()->getSceneResources().depthTable[newDepth] >= yp) + if (_madsVm->scene()->getSceneResources()._depthBands[newDepth] >= yp) newDepth = idx + 1; } _currentDepth = newDepth; diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index a8a8e09105..20d469fedf 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -1262,7 +1262,7 @@ bool MadsSequenceList::addSubEntry(int index, SequenceSubEntryMode mode, int fra return false; } -int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, +int MadsSequenceList::add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites, int frameStart) { @@ -1283,7 +1283,7 @@ int MadsSequenceList::add(int spriteListIndex, int v0, int frameIndex, int trigg // Set the list entry fields _entries[seqIndex].active = true; _entries[seqIndex].spriteListIndex = spriteListIndex; - _entries[seqIndex].field_2 = v0; + _entries[seqIndex].flipped = flipped; _entries[seqIndex].frameIndex = frameIndex; _entries[seqIndex].frameStart = frameStart; _entries[seqIndex].numSprites = numSprites; @@ -1329,7 +1329,7 @@ void MadsSequenceList::setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot) { spriteSlot.spriteType = spriteSet.isBackground() ? BACKGROUND_SPRITE : FOREGROUND_SPRITE; spriteSlot.seqIndex = seqIndex; spriteSlot.spriteListIndex = timerEntry.spriteListIndex; - spriteSlot.frameNumber = ((timerEntry.field_2 == 1) ? 0x8000 : 0) | timerEntry.frameIndex; + spriteSlot.frameNumber = (timerEntry.flipped ? 0x8000 : 0) | timerEntry.frameIndex; spriteSlot.depth = timerEntry.depth; spriteSlot.scale = timerEntry.scale; @@ -1530,6 +1530,13 @@ void MadsSequenceList::scan() { } } +/** + * Sets the depth of the specified entry in the sequence list + */ +void MadsSequenceList::setDepth(int seqIndex, int depth) { + _entries[seqIndex].depth = depth; +} + //-------------------------------------------------------------------------- Animation::Animation(MadsM4Engine *vm): _vm(vm) { diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 3f5615ee37..2f4103eaca 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -392,8 +392,7 @@ struct MadsSequenceSubEntries { struct MadsSequenceEntry { int8 active; int8 spriteListIndex; - - int field_2; + bool flipped; int frameIndex; int frameStart; @@ -433,9 +432,9 @@ public: MadsSequenceEntry &operator[](int index) { return _entries[index]; } void clear(); bool addSubEntry(int index, SequenceSubEntryMode mode, int frameIndex, int abortVal); - int add(int spriteListIndex, int v0, int v1, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, - int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, - int numSprites, int frameStart); + int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, + int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, char scale, uint8 depth, + int frameInc, SpriteAnimType animType, int numSprites, int frameStart); void remove(int seqIndex); void setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot); bool loadSprites(int seqIndex); @@ -443,6 +442,7 @@ public: void delay(uint32 v1, uint32 v2); void setAnimRange(int seqIndex, int startVal, int endVal); void scan(); + void setDepth(int seqIndex, int depth); }; class Animation { -- cgit v1.2.3 From c8dc2e4b8b9b82e9eeb2d3dabedc125bbb6818df Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 08:20:54 +0000 Subject: SCI: locking picture resource fixes sq6 crashing with resource data NULL pointer svn-id: r51240 --- engines/sci/graphics/picture.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 0b74784143..20228b75c4 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -43,10 +43,11 @@ GfxPicture::GfxPicture(ResourceManager *resMan, GfxCoordAdjuster *coordAdjuster, } GfxPicture::~GfxPicture() { + _resMan->unlockResource(_resource); } void GfxPicture::initData(GuiResourceId resourceId) { - _resource = _resMan->findResource(ResourceId(kResourceTypePic, resourceId), false); + _resource = _resMan->findResource(ResourceId(kResourceTypePic, resourceId), true); if (!_resource) { error("picture resource %d not found", resourceId); } -- cgit v1.2.3 From 9672c757d6e86c98ce968008f1b04f5adda443fc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 10:12:56 +0000 Subject: SCI: adding 1 to planeRect bottom/right svn-id: r51241 --- engines/sci/graphics/frameout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 04ed0ec739..d92f6ed1be 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -138,8 +138,8 @@ void GfxFrameout::kernelFrameout() { Common::Rect planeRect; planeRect.top = readSelectorValue(_segMan, planeObject, SELECTOR(top)); planeRect.left = readSelectorValue(_segMan, planeObject, SELECTOR(left)); - planeRect.bottom = readSelectorValue(_segMan, planeObject, SELECTOR(bottom)); - planeRect.right = readSelectorValue(_segMan, planeObject, SELECTOR(right)); + planeRect.bottom = readSelectorValue(_segMan, planeObject, SELECTOR(bottom)) + 1; + planeRect.right = readSelectorValue(_segMan, planeObject, SELECTOR(right)) + 1; int16 planeResY = readSelectorValue(_segMan, planeObject, SELECTOR(resY)); int16 planeResX = readSelectorValue(_segMan, planeObject, SELECTOR(resX)); -- cgit v1.2.3 From d49d1d60feabe7f3fe7691ed27b2627e35de848a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 11:51:09 +0000 Subject: SCI: added said spec dump ability to logkernel svn-id: r51242 --- engines/sci/console.cpp | 3 +- engines/sci/engine/vm.cpp | 14 +++++- engines/sci/parser/said.cpp | 5 +-- engines/sci/parser/vocabulary.cpp | 94 ++++++++++++++++++++------------------- engines/sci/parser/vocabulary.h | 2 +- 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 501a0fa954..20acbed450 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1302,7 +1302,8 @@ bool Console::cmdSaid(int argc, const char **argv) { spec[len++] = 0xFF; printf("Matching '%s' against:", string); - _engine->getVocabulary()->decipherSaidBlock(spec); + _engine->getVocabulary()->debugDecipherSaidBlock(spec); + printf("\n"); bool res = _engine->getVocabulary()->tokenizeString(words, string, &error); if (res && !words.empty()) { diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 2f1221bec3..099fabff16 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -664,8 +664,18 @@ static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int printf(" (%s)", s->_segMan->getObjectName(argv[parmNr])); break; case SIG_TYPE_REFERENCE: - printf(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str()); - break; + if (kernelCall->function == kSaid) { + SegmentRef saidSpec = s->_segMan->dereference(argv[parmNr]); + if (saidSpec.isRaw) { + printf(" ('"); + g_sci->getVocabulary()->debugDecipherSaidBlock(saidSpec.raw); + printf("')"); + } else { + printf(" (non-raw said-spec)"); + } + } else { + printf(" ('%s')", s->_segMan->getString(argv[parmNr]).c_str()); + } default: break; } diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 208051de97..0411952f2a 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -1003,11 +1003,8 @@ int said(EngineState *s, byte *spec, bool verbose) { ParseTreeNode *parse_tree_ptr = voc->_parserNodes; if (voc->parserIsValid) { - if (said_parse_spec(spec)) { - scidprintf("Offending spec was: "); - voc->decipherSaidBlock(spec); + if (said_parse_spec(spec)) return SAID_NO_MATCH; - } if (verbose) vocab_dump_parse_tree("Said-tree", said_tree); diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index d6268a26bc..0adcb4a89f 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -321,54 +321,58 @@ ResultWord Vocabulary::lookupWord(const char *word, int word_len) { return retval; } -void Vocabulary::decipherSaidBlock(byte *addr) { - uint16 nextitem; +void Vocabulary::debugDecipherSaidBlock(const byte *addr) { + bool first = true; + uint16 nextItem; do { - nextitem = *addr++; - - if (nextitem < 0xf0) { - nextitem = nextitem << 8 | *addr++; - printf(" %s[%03x]", getAnyWordFromGroup(nextitem), nextitem); - - nextitem = 42; // Make sure that group 0xff doesn't abort - } else switch (nextitem) { - case 0xf0: - printf(" ,"); - break; - case 0xf1: - printf(" &"); - break; - case 0xf2: - printf(" /"); - break; - case 0xf3: - printf(" ("); - break; - case 0xf4: - printf(" )"); - break; - case 0xf5: - printf(" ["); - break; - case 0xf6: - printf(" ]"); - break; - case 0xf7: - printf(" #"); - break; - case 0xf8: - printf(" <"); - break; - case 0xf9: - printf(" >"); - break; - case 0xff: - break; + nextItem = *addr++; + if (nextItem != 0xff) { + if ((!first) && (nextItem != 0xf0)) + printf(" "); + first = false; + + if (nextItem < 0xf0) { + nextItem = nextItem << 8 | *addr++; + printf("%s{%03x}", getAnyWordFromGroup(nextItem), nextItem); + + nextItem = 0; // Make sure that group 0xff doesn't abort + } else switch (nextItem) { + case 0xf0: + printf(","); + break; + case 0xf1: + printf("&"); + break; + case 0xf2: + printf("/"); + break; + case 0xf3: + printf("("); + break; + case 0xf4: + printf(")"); + break; + case 0xf5: + printf("["); + break; + case 0xf6: + printf("]"); + break; + case 0xf7: + printf("#"); + break; + case 0xf8: + printf("<"); + break; + case 0xf9: + printf(">"); + break; + case 0xff: + break; } - } while (nextitem != 0xff); - - printf("\n"); + } + } while (nextItem != 0xff); } static const byte lowerCaseMap[256] = { diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index 375e0b21e9..a20508e191 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -235,7 +235,7 @@ public: * For debugging only. * @param pos pointer to the data to dump */ - void decipherSaidBlock(byte *pos); + void debugDecipherSaidBlock(const byte *pos); /** * Prints the parser suffixes to the debug console. -- cgit v1.2.3 From 63c945f93ae01d046b092e783154d57609d68a79 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 11:59:40 +0000 Subject: SCI: fix warning and remove duplicate code svn-id: r51243 --- engines/sci/engine/scriptdebug.cpp | 43 +------------------------------------- engines/sci/graphics/paint16.cpp | 2 +- 2 files changed, 2 insertions(+), 43 deletions(-) diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 4521995123..9c08526fbb 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -488,48 +488,7 @@ void Kernel::dissectScript(int scriptNumber, Vocabulary *vocab) { Common::hexdump(script->data + seeker, objsize - 4, 16, seeker); printf("%04x: ", seeker); - while (seeker < _seeker) { - uint16 nextitem = script->data [seeker++]; - if (nextitem == 0xFF) - printf("\n%04x: ", seeker); - else if (nextitem >= 0xF0) { - switch (nextitem) { - case 0xf0: - printf(", "); - break; - case 0xf1: - printf("& "); - break; - case 0xf2: - printf("/ "); - break; - case 0xf3: - printf("( "); - break; - case 0xf4: - printf(") "); - break; - case 0xf5: - printf("[ "); - break; - case 0xf6: - printf("] "); - break; - case 0xf7: - printf("# "); - break; - case 0xf8: - printf("< "); - break; - case 0xf9: - printf("> "); - break; - } - } else { - nextitem = nextitem << 8 | script->data [seeker++]; - printf("%s[%03x] ", vocab->getAnyWordFromGroup(nextitem), nextitem); - } - } + vocab->debugDecipherSaidBlock(script->data + seeker); printf("\n"); break; diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 9361c1adbc..4227c458c5 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -534,7 +534,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_DUMMY1: case SCI_DISPLAY_DUMMY2: if (!((g_sci->getGameId() == GID_LONGBOW) && (g_sci->isDemo()))) - error("Unknown kDisplay argument %X", displayArg); + error("Unknown kDisplay argument %X", displayArg.offset); if (displayArg.offset == SCI_DISPLAY_DUMMY2) { if (argc) { argc--; argv++; -- cgit v1.2.3 From 5a5f8387addfc15d5b1f755b89e45ab046653742 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 12:03:30 +0000 Subject: SCI: removing some debug stuff from sci32 gfx svn-id: r51244 --- engines/sci/engine/kgraphics.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index ed7b72f90b..5e8869af5e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1160,7 +1160,6 @@ reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) { reg_t planeObj = argv[0]; g_sci->_gfxFrameout->kernelAddPlane(planeObj); - warning("kAddPlane object %04x:%04x", PRINT_REG(planeObj)); return NULL_REG; } @@ -1168,7 +1167,6 @@ reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv) { reg_t planeObj = argv[0]; g_sci->_gfxFrameout->kernelDeletePlane(planeObj); - warning("kDeletePlane object %04x:%04x", PRINT_REG(planeObj)); return NULL_REG; } @@ -1189,7 +1187,6 @@ reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv) { } reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) { - warning("kGetHighPlanePri: %d", g_sci->_gfxFrameout->kernelGetHighPlanePri()); return make_reg(0, g_sci->_gfxFrameout->kernelGetHighPlanePri()); } @@ -1302,7 +1299,6 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { } reg_t object = argv[3]; Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); - debug("kCreateTextBitmap: %s", text.c_str()); } default: warning("CreateTextBitmap(%d)", argv[0].toUint16()); -- cgit v1.2.3 From 2047e75d2b3ac553acd54e31fd9725d6821668ae Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 15:15:38 +0000 Subject: SCI: kCelWide/kCelHigh now adjust on hires views somewhat fixes gk1 hires inventory issue svn-id: r51245 --- engines/sci/engine/kgraphics.cpp | 11 ++--------- engines/sci/graphics/cache.cpp | 4 ++-- engines/sci/graphics/view.cpp | 38 ++++++++++++++++++++++++++++++++++---- engines/sci/graphics/view.h | 1 + 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 5e8869af5e..afbc08b1ec 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -436,15 +436,6 @@ reg_t kCelWide(EngineState *s, int argc, reg_t *argv) { celWidth = g_sci->_gfxCache->kernelViewGetCelWidth(viewId, loopNo, celNo); -#ifdef ENABLE_SCI32 - if (getSciVersion() == SCI_VERSION_2_1) { - if (g_sci->_gfxScreen->getWidth() > 320) - celWidth = celWidth / 2; // half the width returned here, fixes lsl6 action icon placements - } - // the scripts work low-res and add the returned value from here to the coordinate - // TODO: check, if this is actually right. I'm slightly confused by this, but even GK1CD has some idivs in this - // code, so it seems plausible. -#endif return make_reg(0, celWidth); } @@ -1159,6 +1150,8 @@ reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv) { reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) { reg_t planeObj = argv[0]; + warning("AddPlane %s", s->_segMan->getObjectName(argv[0])); + g_sci->_gfxFrameout->kernelAddPlane(planeObj); return NULL_REG; } diff --git a/engines/sci/graphics/cache.cpp b/engines/sci/graphics/cache.cpp index 8caa28b3a1..25475c727f 100644 --- a/engines/sci/graphics/cache.cpp +++ b/engines/sci/graphics/cache.cpp @@ -90,11 +90,11 @@ GfxView *GfxCache::getView(GuiResourceId viewId) { } int16 GfxCache::kernelViewGetCelWidth(GuiResourceId viewId, int16 loopNo, int16 celNo) { - return getView(viewId)->getCelInfo(loopNo, celNo)->width; + return getView(viewId)->getCelInfo(loopNo, celNo)->scriptWidth; } int16 GfxCache::kernelViewGetCelHeight(GuiResourceId viewId, int16 loopNo, int16 celNo) { - return getView(viewId)->getCelInfo(loopNo, celNo)->height; + return getView(viewId)->getCelInfo(loopNo, celNo)->scriptHeight; } int16 GfxCache::kernelViewGetLoopCount(GuiResourceId viewId) { diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 93df45820c..80778504ec 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -160,8 +160,8 @@ void GfxView::initData(GuiResourceId resourceId) { // For EGA // Width:WORD Height:WORD DisplaceX:BYTE DisplaceY:BYTE ClearKey:BYTE EGAData starts now directly cel = &_loop[loopNo].cel[celNo]; - cel->width = READ_LE_UINT16(celData); - cel->height = READ_LE_UINT16(celData + 2); + cel->scriptWidth = cel->width = READ_LE_UINT16(celData); + cel->scriptHeight = cel->height = READ_LE_UINT16(celData + 2); cel->displaceX = (signed char)celData[4]; cel->displaceY = celData[5]; cel->clearKey = celData[6]; @@ -231,8 +231,8 @@ void GfxView::initData(GuiResourceId resourceId) { _loop[loopNo].cel = new CelInfo[celCount]; for (celNo = 0; celNo < celCount; celNo++) { cel = &_loop[loopNo].cel[celNo]; - cel->width = READ_SCI11ENDIAN_UINT16(celData); - cel->height = READ_SCI11ENDIAN_UINT16(celData + 2); + cel->scriptWidth = cel->width = READ_SCI11ENDIAN_UINT16(celData); + cel->scriptHeight = cel->height = READ_SCI11ENDIAN_UINT16(celData + 2); cel->displaceX = READ_SCI11ENDIAN_UINT16(celData + 4); cel->displaceY = READ_SCI11ENDIAN_UINT16(celData + 6); @@ -253,6 +253,36 @@ void GfxView::initData(GuiResourceId resourceId) { celData += celSize; } } +#ifdef ENABLE_SCI32 + // adjust width/height returned to scripts + switch (getSciVersion()) { + case SCI_VERSION_2: + if (_isSci2Hires) { + for (loopNo = 0; loopNo < _loopCount; loopNo++) { + for (celNo = 0; celNo < _loop[loopNo].celCount; celNo++) { + _screen->adjustBackUpscaledCoordinates(_loop[loopNo].cel[celNo].scriptWidth, _loop[loopNo].cel[celNo].scriptHeight); + } + } + } + break; + + case SCI_VERSION_2_1: + // half the width returned here, fixes lsl6 action icon placements + // the scripts work low-res and add the returned value from here to the coordinate + // TODO: check, if this is actually right. I'm slightly confused by this, but even GK1CD has some idivs in this + // code, so it seems plausible. + if (_screen->getDisplayWidth() > 320) { + for (loopNo = 0; loopNo < _loopCount; loopNo++) { + for (celNo = 0; celNo < _loop[loopNo].celCount; celNo++) { + _loop[loopNo].cel[celNo].scriptWidth /= 2; + _loop[loopNo].cel[celNo].scriptHeight /= 2; + } + } + } + default: + break; + } +#endif break; default: diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index 6eb1830b99..bcfae8a112 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -30,6 +30,7 @@ namespace Sci { struct CelInfo { int16 width, height; + int16 scriptWidth, scriptHeight; int16 displaceX; int16 displaceY; byte clearKey; -- cgit v1.2.3 From d643928d0d443b2ad27b2a974f6e34f1da0e80b5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 15:25:29 +0000 Subject: SCI: delete hidden planes in kFrameout svn-id: r51246 --- engines/sci/graphics/frameout.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index d92f6ed1be..ec3d75516b 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -132,9 +132,6 @@ void GfxFrameout::kernelFrameout() { reg_t planeObject = *it; uint16 planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); - if (planePriority == 0xffff) // Plane currently not meant to be shown - continue; - Common::Rect planeRect; planeRect.top = readSelectorValue(_segMan, planeObject, SELECTOR(top)); planeRect.left = readSelectorValue(_segMan, planeObject, SELECTOR(left)); @@ -148,6 +145,12 @@ void GfxFrameout::kernelFrameout() { planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; + if (planePriority == 0xffff) { // Plane currently not meant to be shown + // TODO: better remember previous state and only delete if it got hidden now + _paint32->fillRect(planeRect, 0); + continue; + } + Common::Rect planeClipRect(planeRect.width(), planeRect.height()); Common::Rect upscaledPlaneRect = planeRect; -- cgit v1.2.3 From 72388cc638f2c358f6d3a77d75abd47f51cd5e0a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 15:30:06 +0000 Subject: SCI: adding sq4 workaround room 150 svn-id: r51247 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5d80524193..8dda3abf24 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -115,6 +115,7 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object + { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 9bea286e494f81ac7cf0482b05b9f4080f6c3806 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 16:47:12 +0000 Subject: SCI: cache Planes for sci32 svn-id: r51249 --- engines/sci/engine/kgraphics.cpp | 1 + engines/sci/graphics/frameout.cpp | 85 ++++++++++++++++++++++++++------------- engines/sci/graphics/frameout.h | 12 +++++- engines/sci/sci.cpp | 1 + 4 files changed, 71 insertions(+), 28 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index afbc08b1ec..fdc5710be4 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -43,6 +43,7 @@ #include "sci/graphics/cursor.h" #include "sci/graphics/palette.h" #include "sci/graphics/paint16.h" +#include "sci/graphics/picture.h" #include "sci/graphics/ports.h" #include "sci/graphics/robot.h" #include "sci/graphics/screen.h" diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index ec3d75516b..b4da40bbe4 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -54,17 +54,49 @@ GfxFrameout::~GfxFrameout() { } void GfxFrameout::kernelAddPlane(reg_t object) { - _planes.push_back(object); - sortPlanes(); + PlaneEntry newPlane; + newPlane.object = object; + newPlane.pictureId = 0xFFFF; + newPlane.picture = NULL; + newPlane.lastPriority = 0xFFFF; // hidden + _planes.push_back(newPlane); + + kernelUpdatePlane(object); } void GfxFrameout::kernelUpdatePlane(reg_t object) { - sortPlanes(); + for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { + if (it->object == object) { + // Read some information + it->priority = readSelectorValue(_segMan, object, SELECTOR(priority)); + GuiResourceId lastPictureId = it->pictureId; + it->pictureId = readSelectorValue(_segMan, object, SELECTOR(picture)); + if (lastPictureId != it->pictureId) { + // picture got changed, load new picture + if ((it->pictureId != 0xFFFF) && (it->pictureId != 0xFFFE)) { + it->picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, it->pictureId, false); + } else { + delete it->picture; + it->picture = NULL; + } + } + sortPlanes(); + return; + } + } + error("kUpdatePlane called on plane that wasn't added before"); } + reg_t object; + uint16 priority; + GuiResourceId pictureId; + GfxPicture *picture; + uint16 lastPriority; + + void GfxFrameout::kernelDeletePlane(reg_t object) { - for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { - if (object == *it) { + for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { + if (it->object == object) { _planes.erase(it); return; } @@ -73,7 +105,6 @@ void GfxFrameout::kernelDeletePlane(reg_t object) { void GfxFrameout::kernelAddScreenItem(reg_t object) { _screenItems.push_back(object); - //warning("addScreenItem %X:%X (%s)", object.segment, object.offset, _segMan->getObjectName(object)); } void GfxFrameout::kernelDeleteScreenItem(reg_t object) { @@ -87,32 +118,32 @@ void GfxFrameout::kernelDeleteScreenItem(reg_t object) { int16 GfxFrameout::kernelGetHighPlanePri() { sortPlanes(); - return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back(), SELECTOR(priority)); + return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back().object, SELECTOR(priority)); } bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { return (entry1->priority == entry2->priority) ? (entry1->y < entry2->y) : (entry1->priority < entry2->priority); } -bool planeSortHelper(const reg_t entry1, const reg_t entry2) { - SegManager *segMan = g_sci->getEngineState()->_segMan; +bool planeSortHelper(const PlaneEntry &entry1, const PlaneEntry &entry2) { +// SegManager *segMan = g_sci->getEngineState()->_segMan; - uint16 plane1Priority = readSelectorValue(segMan, entry1, SELECTOR(priority)); - uint16 plane2Priority = readSelectorValue(segMan, entry2, SELECTOR(priority)); +// uint16 plane1Priority = readSelectorValue(segMan, entry1, SELECTOR(priority)); +// uint16 plane2Priority = readSelectorValue(segMan, entry2, SELECTOR(priority)); - if (plane1Priority == 0xffff) + if (entry1.priority == 0xffff) return true; - if (plane2Priority == 0xffff) + if (entry2.priority == 0xffff) return false; - return plane1Priority < plane2Priority; + return entry1.priority < entry2.priority; } void GfxFrameout::sortPlanes() { // First, remove any invalid planes - for (Common::List::iterator it = _planes.begin(); it != _planes.end();) { - if (!_segMan->isObject(*it)) + for (PlaneList::iterator it = _planes.begin(); it != _planes.end();) { + if (!_segMan->isObject(it->object)) it = _planes.erase(it); else it++; @@ -128,9 +159,10 @@ void GfxFrameout::kernelFrameout() { // Allocate enough space for all screen items FrameoutEntry *itemData = new FrameoutEntry[_screenItems.size()]; - for (Common::List::iterator it = _planes.begin(); it != _planes.end(); it++) { - reg_t planeObject = *it; - uint16 planePriority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); + for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { + reg_t planeObject = it->object; + uint16 planePriority = it->priority; + uint16 planeLastPriority = it->lastPriority; Common::Rect planeRect; planeRect.top = readSelectorValue(_segMan, planeObject, SELECTOR(top)); @@ -145,9 +177,11 @@ void GfxFrameout::kernelFrameout() { planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; + it->lastPriority = planePriority; if (planePriority == 0xffff) { // Plane currently not meant to be shown - // TODO: better remember previous state and only delete if it got hidden now - _paint32->fillRect(planeRect, 0); + // If plane was shown before, delete plane rect + if (planePriority != planeLastPriority) + _paint32->fillRect(planeRect, 0); continue; } @@ -166,13 +200,12 @@ void GfxFrameout::kernelFrameout() { if (planeBack) _paint32->fillRect(planeRect, planeBack); - GuiResourceId planePictureNr = readSelectorValue(_segMan, planeObject, SELECTOR(picture)); - GfxPicture *planePicture = 0; + GuiResourceId planePictureNr = it->pictureId; + GfxPicture *planePicture = it->picture; int16 planePictureCels = 0; bool planePictureMirrored = false; - if ((planePictureNr != 0xFFFF) && (planePictureNr != 0xFFFE)) { - planePicture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, planePictureNr, false); + if (planePicture) { planePictureCels = planePicture->getSci32celCount(); _coordAdjuster->pictureSetDisplayArea(planeRect); @@ -368,8 +401,6 @@ void GfxFrameout::kernelFrameout() { if (planePicture) { delete[] pictureCels; - delete planePicture; - planePicture = 0; } } diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index e4568ad602..5adf147c8d 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -28,6 +28,16 @@ namespace Sci { +struct PlaneEntry { + reg_t object; + uint16 priority; + GuiResourceId pictureId; + GfxPicture *picture; + uint16 lastPriority; +}; + +typedef Common::List PlaneList; + struct FrameoutEntry { reg_t object; GuiResourceId viewId; @@ -75,7 +85,7 @@ private: GfxPaint32 *_paint32; Common::Array _screenItems; - Common::List _planes; + PlaneList _planes; void sortPlanes(); }; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 2dfcf076ab..5d67e5c5d7 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -54,6 +54,7 @@ #include "sci/graphics/menu.h" #include "sci/graphics/paint16.h" #include "sci/graphics/paint32.h" +#include "sci/graphics/picture.h" #include "sci/graphics/ports.h" #include "sci/graphics/palette.h" #include "sci/graphics/screen.h" -- cgit v1.2.3 From f0a2c10c92163917697ba83000f67132fa1f087f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 16:52:08 +0000 Subject: SCI: enable speed throttler for sci32 svn-id: r51250 --- engines/sci/graphics/frameout.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index b4da40bbe4..6eee71004d 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -406,6 +406,8 @@ void GfxFrameout::kernelFrameout() { delete[] itemData; _screen->copyToScreen(); + + g_sci->getEngineState()->_throttleTrigger = true; } } // End of namespace Sci -- cgit v1.2.3 From 353b0d29938690b0cff4c032febcc8375b1c17d8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 17:43:56 +0000 Subject: SCI: support useInsetRect in kFrameout svn-id: r51251 --- engines/sci/engine/selector.cpp | 5 +++ engines/sci/engine/selector.h | 3 ++ engines/sci/graphics/frameout.cpp | 83 ++++++++++++++++++++++----------------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index befa7c38a2..f5eb9eb73a 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -180,6 +180,11 @@ void Kernel::mapSelectors() { FIND_SELECTOR(back); FIND_SELECTOR(fixPriority); FIND_SELECTOR(mirrored); + FIND_SELECTOR(useInsetRect); + FIND_SELECTOR(inTop); + FIND_SELECTOR(inLeft); + FIND_SELECTOR(inBottom); + FIND_SELECTOR(inRight); #endif } diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 7e13c18e4a..661290f58c 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -145,6 +145,9 @@ struct SelectorCache { Selector fixPriority; Selector mirrored; + + Selector useInsetRect; + Selector inTop, inLeft, inBottom, inRight; #endif }; diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 6eee71004d..0ace3c8e62 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -298,45 +298,56 @@ void GfxFrameout::kernelFrameout() { // warning("view %s %d", _segMan->getObjectName(itemEntry->object), itemEntry->priority); - switch (getSciVersion()) { - case SCI_VERSION_2: - if (view->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); - break; - case SCI_VERSION_2_1: - itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; - itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; - break; - default: - break; - } + uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect)); + if (useInsetRect) { + itemEntry->celRect.top = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inTop)); + itemEntry->celRect.left = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inLeft)); + itemEntry->celRect.bottom = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inBottom)) + 1; + itemEntry->celRect.right = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inRight)) + 1; + itemEntry->celRect.translate(itemEntry->x, itemEntry->y); + // TODO: maybe we should clip the cels rect with this, i'm not sure + // the only currently known usage is game menu of gk1 + } else { + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + break; + case SCI_VERSION_2_1: + itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; + itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; + break; + default: + break; + } - if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) - view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); - else - view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); - - Common::Rect nsRect = itemEntry->celRect; - switch (getSciVersion()) { - case SCI_VERSION_2: - if (view->isSci2Hires()) { - _screen->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left); - _screen->adjustBackUpscaledCoordinates(nsRect.bottom, nsRect.right); + if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) + view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); + else + view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); + + Common::Rect nsRect = itemEntry->celRect; + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left); + _screen->adjustBackUpscaledCoordinates(nsRect.bottom, nsRect.right); + } + break; + case SCI_VERSION_2_1: + nsRect.top = (nsRect.top * planeResY) / _screen->getHeight(); + nsRect.left = (nsRect.left * planeResX) / _screen->getWidth(); + nsRect.bottom = (nsRect.bottom * planeResY) / _screen->getHeight(); + nsRect.right = (nsRect.right * planeResX) / _screen->getWidth(); + break; + default: + break; } - break; - case SCI_VERSION_2_1: - nsRect.top = (nsRect.top * planeResY) / _screen->getHeight(); - nsRect.left = (nsRect.left * planeResX) / _screen->getWidth(); - nsRect.bottom = (nsRect.bottom * planeResY) / _screen->getHeight(); - nsRect.right = (nsRect.right * planeResX) / _screen->getWidth(); - break; - default: - break; + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsLeft), nsRect.left); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsTop), nsRect.top); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsRight), nsRect.right); + writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsBottom), nsRect.bottom); } - writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsLeft), nsRect.left); - writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsTop), nsRect.top); - writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsRight), nsRect.right); - writeSelectorValue(_segMan, itemEntry->object, SELECTOR(nsBottom), nsRect.bottom); int16 screenHeight = _screen->getHeight(); int16 screenWidth = _screen->getWidth(); -- cgit v1.2.3 From 252e7736e59cdb2c57aa3a67396327d8e82c7742 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 18:06:49 +0000 Subject: SCI: honor given order of screen items in sci32 fixes gk1 game menu slider controls svn-id: r51252 --- engines/sci/graphics/frameout.cpp | 10 +++++++++- engines/sci/graphics/frameout.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 0ace3c8e62..6f0aa1c428 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -122,7 +122,12 @@ int16 GfxFrameout::kernelGetHighPlanePri() { } bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { - return (entry1->priority == entry2->priority) ? (entry1->y < entry2->y) : (entry1->priority < entry2->priority); + if (entry1->priority == entry2->priority) { + if (entry1->y == entry2->y) + return (entry1->givenOrderNr < entry2->givenOrderNr); + return (entry1->y < entry2->y); + } + return (entry1->priority < entry2->priority); } bool planeSortHelper(const PlaneEntry &entry1, const PlaneEntry &entry2) { @@ -247,6 +252,7 @@ void GfxFrameout::kernelFrameout() { itemEntry->scaleX = readSelectorValue(_segMan, itemObject, SELECTOR(scaleX)); itemEntry->scaleY = readSelectorValue(_segMan, itemObject, SELECTOR(scaleY)); itemEntry->object = itemObject; + itemEntry->givenOrderNr = itemNr; itemList.push_back(itemEntry); itemEntry++; @@ -282,6 +288,8 @@ void GfxFrameout::kernelFrameout() { // Now display itemlist itemEntry = itemData; +// warning("Plane %s", _segMan->getObjectName(planeObject)); + for (FrameoutList::iterator listIterator = itemList.begin(); listIterator != itemList.end(); listIterator++) { itemEntry = *listIterator; diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 5adf147c8d..5c42489446 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -39,6 +39,7 @@ struct PlaneEntry { typedef Common::List PlaneList; struct FrameoutEntry { + uint16 givenOrderNr; reg_t object; GuiResourceId viewId; int16 loopNo; -- cgit v1.2.3 From e515bc56d1911f8931b7b0fce2a7e38ae3b29425 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 18:35:39 +0000 Subject: SCI: fix warning svn-id: r51253 --- engines/sci/graphics/frameout.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 6f0aa1c428..fb0951502a 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -87,13 +87,6 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) { error("kUpdatePlane called on plane that wasn't added before"); } - reg_t object; - uint16 priority; - GuiResourceId pictureId; - GfxPicture *picture; - uint16 lastPriority; - - void GfxFrameout::kernelDeletePlane(reg_t object) { for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { if (it->object == object) { @@ -304,7 +297,7 @@ void GfxFrameout::kernelFrameout() { } else if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); -// warning("view %s %d", _segMan->getObjectName(itemEntry->object), itemEntry->priority); +// warning("view %s %04x:%04x", _segMan->getObjectName(itemEntry->object), PRINT_REG(itemEntry->object)); uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect)); if (useInsetRect) { -- cgit v1.2.3 From 97025ec7c1f2e9936cf8a435b65d03645d54a427 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 19:19:09 +0000 Subject: SCI: removing sci32 gfx debug messages svn-id: r51254 --- engines/sci/engine/kgraphics.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index fdc5710be4..f8e119988e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1151,8 +1151,6 @@ reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv) { reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) { reg_t planeObj = argv[0]; - warning("AddPlane %s", s->_segMan->getObjectName(argv[0])); - g_sci->_gfxFrameout->kernelAddPlane(planeObj); return NULL_REG; } @@ -1293,6 +1291,7 @@ reg_t kCreateTextBitmap(EngineState *s, int argc, reg_t *argv) { } reg_t object = argv[3]; Common::String text = s->_segMan->getString(readSelector(s->_segMan, object, SELECTOR(text))); + break; } default: warning("CreateTextBitmap(%d)", argv[0].toUint16()); -- cgit v1.2.3 From f3f3f1d6db885c5f100d91a59e30ae41f56e6528 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 19:38:13 +0000 Subject: SCI: adding kOnMe transparency support and disabling speed throttler for poor clones computer :P fixes some hotspots in gk1 only supposed to react on actual pixel clicks svn-id: r51255 --- engines/sci/engine/kgraphics.cpp | 65 ++++++++++++++++++++++++--------------- engines/sci/graphics/frameout.cpp | 3 +- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f8e119988e..4d3d73d0bb 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1198,43 +1198,58 @@ reg_t kOnMe(EngineState *s, int argc, reg_t *argv) { uint16 x = argv[0].toUint16(); uint16 y = argv[1].toUint16(); reg_t targetObject = argv[2]; - // TODO: argv[3] - it's usually 0 + uint16 illegalBits = argv[3].offset; Common::Rect nsRect; + // we assume that x, y are local coordinates + // Get the bounding rectangle of the object nsRect.left = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsLeft)); nsRect.top = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsTop)); nsRect.right = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsRight)); nsRect.bottom = readSelectorValue(s->_segMan, targetObject, SELECTOR(nsBottom)); - uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); - uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); + + // nsRect top/left may be negative, adjust accordingly + Common::Rect checkRect = nsRect; + if (checkRect.top < 0) + checkRect.top = 0; + if (checkRect.left < 0) + checkRect.left = 0; + + bool contained = checkRect.contains(x, y); + if (contained && illegalBits) { + // If illegalbits are set, we check the color of the pixel that got clicked on + // for now, we return false if the pixel is transparent + // although illegalBits may get differently set, don't know yet how this really works out + uint16 viewId = readSelectorValue(s->_segMan, targetObject, SELECTOR(view)); + int16 loopNo = readSelectorValue(s->_segMan, targetObject, SELECTOR(loop)); + int16 celNo = readSelectorValue(s->_segMan, targetObject, SELECTOR(cel)); + if (g_sci->_gfxCompare->kernelIsItSkip(viewId, loopNo, celNo, Common::Point(x - nsRect.left, y - nsRect.top))) + contained = false; + } +// these hacks shouldn't be needed anymore +// uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x)); +// uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y)); // If top and left are negative, we need to adjust coordinates by // the item's x and y (e.g. happens in GK1, day 1, with detective // Mosely's hotspot in his office) - if (nsRect.left < 0) - nsRect.translate(itemX, 0); - - if (nsRect.top < 0) - nsRect.translate(0, itemY); - - // HACK: nsLeft and nsTop can be invalid, so try and fix them here - // using x and y (e.g. with the inventory screen in GK1) - if (nsRect.left == itemY && nsRect.top == itemX) { - // Swap the values, as they're inversed (eh???) - nsRect.left = itemX; - nsRect.top = itemY; - } - - /* - warning("kOnMe: (%d, %d) on object %04x:%04x (%s), rect (%d, %d, %d, %d), parameter %d", - argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), s->_segMan->getObjectName(argv[2]), - nsRect.left, nsRect.top, nsRect.right, nsRect.bottom, - argv[3].toUint16()); - */ - - return make_reg(0, nsRect.contains(x, y)); +// if (nsRect.left < 0) +// nsRect.translate(itemX, 0); +// +// if (nsRect.top < 0) +// nsRect.translate(0, itemY); + +// // HACK: nsLeft and nsTop can be invalid, so try and fix them here +// // using x and y (e.g. with the inventory screen in GK1) +// if (nsRect.left == itemY && nsRect.top == itemX) { +// // Swap the values, as they're inversed (eh???) +// nsRect.left = itemX; +// nsRect.top = itemY; +// } + + return make_reg(0, contained); } reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index fb0951502a..299f0e3248 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -419,7 +419,8 @@ void GfxFrameout::kernelFrameout() { delete[] itemData; _screen->copyToScreen(); - g_sci->getEngineState()->_throttleTrigger = true; + //g_sci->getEngineState()->_throttleTrigger = true; + // currently disabled because clones computer is too slow :P } } // End of namespace Sci -- cgit v1.2.3 From b0af2dc95b4125c9c7f4ff6d6246667c812b79f4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 19:57:58 +0000 Subject: SCI: adding workaround for castle of dr. brain room 320, for kUnLoad svn-id: r51256 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8dda3abf24..b107373702 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -173,6 +173,7 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident -- cgit v1.2.3 From 50b163a106fba1dea763030727765f4f3fe311bb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 20:36:36 +0000 Subject: SCI: adding workaround for castle of dr. brain room 420, alien card game svn-id: r51257 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 8a7de85cbe..ed507e5736 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -178,7 +178,7 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 4, MAP_CALL(GraphDrawLine), "iiiii(i)(i)", kGraphDrawLine_workarounds }, // 5 - nop // 6 - draw pattern - { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", NULL }, + { SIG_SCIALL, 7, MAP_CALL(GraphSaveBox), "iiiii", kGraphSaveBox_workarounds }, { SIG_SCIALL, 8, MAP_CALL(GraphRestoreBox), "[r0!]", kGraphRestoreBox_workarounds }, // ^ this may get called with invalid references, we check them within restoreBits() and sierra sci behaves the same { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b107373702..8ce2b0e72c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -133,6 +133,12 @@ const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { + { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index ab88505103..11d3824c83 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -76,6 +76,7 @@ extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; +extern const SciWorkaroundEntry kGraphSaveBox_workarounds[]; extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; -- cgit v1.2.3 From adf4195e0b47b2b80b612e4b96b9b42f9be45d1e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 24 Jul 2010 21:18:07 +0000 Subject: SCI: changing how insectRect gets applied svn-id: r51259 --- engines/sci/graphics/frameout.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 299f0e3248..208459783b 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -299,29 +299,33 @@ void GfxFrameout::kernelFrameout() { // warning("view %s %04x:%04x", _segMan->getObjectName(itemEntry->object), PRINT_REG(itemEntry->object)); + switch (getSciVersion()) { + case SCI_VERSION_2: + if (view->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + break; + case SCI_VERSION_2_1: + itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; + itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; + break; + default: + break; + } + uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect)); if (useInsetRect) { itemEntry->celRect.top = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inTop)); itemEntry->celRect.left = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inLeft)); itemEntry->celRect.bottom = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inBottom)) + 1; itemEntry->celRect.right = readSelectorValue(_segMan, itemEntry->object, SELECTOR(inRight)) + 1; + if (view->isSci2Hires()) { + _screen->adjustToUpscaledCoordinates(itemEntry->celRect.top, itemEntry->celRect.left); + _screen->adjustToUpscaledCoordinates(itemEntry->celRect.bottom, itemEntry->celRect.right); + } itemEntry->celRect.translate(itemEntry->x, itemEntry->y); // TODO: maybe we should clip the cels rect with this, i'm not sure // the only currently known usage is game menu of gk1 } else { - switch (getSciVersion()) { - case SCI_VERSION_2: - if (view->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); - break; - case SCI_VERSION_2_1: - itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; - itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; - break; - default: - break; - } - if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128)) view->getCelRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect); else -- cgit v1.2.3 From 7457011a87cb54c4d6b7cc6bc7b4719b1c9a2b99 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sat, 24 Jul 2010 22:29:17 +0000 Subject: GUI: Fix bug #3027772 by adding MT-32 tab Bug #3027772: "Can't switch between Text and Speech". The problem was in overcrowded Audio tab in any resolution with height < 480. Solved by adding new MT-32 tab and grouping all relevant widgets there. TODO: - The problem still exists for 320x200 resolution where Subtitle speed control is not accessible - Apparently nobody tested tab control scrolling after switching to new GUI, and now there are artifacts svn-id: r51265 --- gui/launcher.cpp | 34 +++- gui/options.cpp | 179 +++++++++++++-------- gui/options.h | 11 +- gui/themes/scummclassic.zip | Bin 57075 -> 58134 bytes gui/themes/scummclassic/classic_layout.stx | 58 ++++--- gui/themes/scummclassic/classic_layout_lowres.stx | 56 ++++--- gui/themes/scummmodern.zip | Bin 164384 -> 165317 bytes gui/themes/scummmodern/scummmodern_layout.stx | 58 ++++--- .../scummmodern/scummmodern_layout_lowres.stx | 62 ++++--- 9 files changed, 298 insertions(+), 160 deletions(-) diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 1daf9ffd50..d50e7ce578 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -72,6 +72,7 @@ enum { kCmdGlobalGraphicsOverride = 'OGFX', kCmdGlobalAudioOverride = 'OSFX', kCmdGlobalMIDIOverride = 'OMID', + kCmdGlobalMT32Override = 'OM32', kCmdGlobalVolumeOverride = 'OVOL', kCmdChooseSoundFontCmd = 'chsf', @@ -144,6 +145,7 @@ protected: CheckboxWidget *_globalGraphicsOverride; CheckboxWidget *_globalAudioOverride; CheckboxWidget *_globalMIDIOverride; + CheckboxWidget *_globalMT32Override; CheckboxWidget *_globalVolumeOverride; }; @@ -199,7 +201,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // - // 3) The graphics tab + // 2) The graphics tab // _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); @@ -208,7 +210,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addGraphicControls(tab, "GameOptions_Graphics."); // - // 4) The audio tab + // 3) The audio tab // tab->addTab(_("Audio")); @@ -218,7 +220,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addSubtitleControls(tab, "GameOptions_Audio."); // - // 5) The volume tab + // 4) The volume tab // tab->addTab(_("Volume")); @@ -227,7 +229,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addVolumeControls(tab, "GameOptions_Volume."); // - // 6) The MIDI tab + // 5) The MIDI tab // tab->addTab(_("MIDI")); @@ -239,7 +241,19 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addMIDIControls(tab, "GameOptions_MIDI."); // - // 2) The 'Path' tab + // 6) The MT-32 tab + // + tab->addTab(_("MT-32")); + + _globalMT32Override = new CheckboxWidget(tab, "GameOptions_MT32.EnableTabCheckbox", _("Override global MT-32 settings"), 0, kCmdGlobalMT32Override); + + //if (_guioptions & Common::GUIO_NOMIDI) + // _globalMT32Override->setEnabled(false); + + addMT32Controls(tab, "GameOptions_MT32."); + + // + // 7) The Paths tab // tab->addTab(_("Paths")); @@ -305,11 +319,13 @@ void EditGameDialog::open() { e = ConfMan.hasKey("soundfont", _domain) || ConfMan.hasKey("multi_midi", _domain) || - ConfMan.hasKey("native_mt32", _domain) || - ConfMan.hasKey("enable_gs", _domain) || ConfMan.hasKey("midi_gain", _domain); _globalMIDIOverride->setState(e); + e = ConfMan.hasKey("native_mt32", _domain) || + ConfMan.hasKey("enable_gs", _domain); + _globalMT32Override->setState(e); + // TODO: game path const Common::Language lang = Common::parseLanguage(ConfMan.get("language", _domain)); @@ -383,6 +399,10 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat setMIDISettingsState(data != 0); draw(); break; + case kCmdGlobalMT32Override: + setMT32SettingsState(data != 0); + draw(); + break; case kCmdGlobalVolumeOverride: setVolumeSettingsState(data != 0); draw(); diff --git a/gui/options.cpp b/gui/options.cpp index ed56630a62..8ddd263a46 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -100,13 +100,14 @@ void OptionsDialog::init() { _aspectCheckbox = 0; _enableAudioSettings = false; _midiPopUp = 0; - _mt32DevicePopUp = 0; - _gmDevicePopUp = 0; _oplPopUp = 0; _outputRatePopUp = 0; _enableMIDISettings = false; + _gmDevicePopUp = 0; _multiMidiCheckbox = 0; + _enableMT32Settings = false; _mt32Checkbox = 0; + _mt32DevicePopUp = 0; _enableGSCheckbox = 0; _enableVolumeSettings = false; _musicVolumeDesc = 0; @@ -197,24 +198,6 @@ void OptionsDialog::open() { if (!loadMusicDeviceSetting(_midiPopUp, "music_driver")) _midiPopUp->setSelected(0); - if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device")) { - if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), MT_MT32)) - _mt32DevicePopUp->setSelected(0); - } else { - _mt32DevicePopUp->setSelected(0); - } - } - - if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device")) { - if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { - if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), MT_GM)) - _gmDevicePopUp->setSelected(0); - } else { - _gmDevicePopUp->setSelected(0); - } - } - if (_oplPopUp) { OPL::Config::DriverId id = MAX(OPL::Config::parse(ConfMan.get("opl_driver", _domain)), 0); _oplPopUp->setSelectedTag(id); @@ -230,16 +213,18 @@ void OptionsDialog::open() { } if (_multiMidiCheckbox) { + if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device")) { + if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { + if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), MT_GM)) + _gmDevicePopUp->setSelected(0); + } else { + _gmDevicePopUp->setSelected(0); + } + } // Multi midi setting _multiMidiCheckbox->setState(ConfMan.getBool("multi_midi", _domain)); - // Native mt32 setting - _mt32Checkbox->setState(ConfMan.getBool("native_mt32", _domain)); - - // GS extensions setting - _enableGSCheckbox->setState(ConfMan.getBool("enable_gs", _domain)); - Common::String soundFont(ConfMan.get("soundfont", _domain)); if (soundFont.empty() || !ConfMan.hasKey("soundfont", _domain)) { _soundFont->setLabel(_("None")); @@ -257,6 +242,24 @@ void OptionsDialog::open() { _midiGainLabel->setLabel(buf); } + // MT-32 options + if (_mt32DevicePopUp) { + if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device")) { + if (_domain.equals(Common::ConfigManager::kApplicationDomain)) { + if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), MT_MT32)) + _mt32DevicePopUp->setSelected(0); + } else { + _mt32DevicePopUp->setSelected(0); + } + } + + // Native mt32 setting + _mt32Checkbox->setState(ConfMan.getBool("native_mt32", _domain)); + + // GS extensions setting + _enableGSCheckbox->setState(ConfMan.getBool("enable_gs", _domain)); + } + // Volume options if (_musicVolumeSlider) { int vol; @@ -353,12 +356,8 @@ void OptionsDialog::close() { if (_midiPopUp) { if (_enableAudioSettings) { saveMusicDeviceSetting(_midiPopUp, "music_driver"); - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"); - saveMusicDeviceSetting(_gmDevicePopUp, "gm_device"); } else { ConfMan.removeKey("music_driver", _domain); - ConfMan.removeKey("mt32_device", _domain); - ConfMan.removeKey("gm_device", _domain); } } @@ -391,9 +390,9 @@ void OptionsDialog::close() { // MIDI options if (_multiMidiCheckbox) { if (_enableMIDISettings) { + saveMusicDeviceSetting(_gmDevicePopUp, "gm_device"); + ConfMan.setBool("multi_midi", _multiMidiCheckbox->getState(), _domain); - ConfMan.setBool("native_mt32", _mt32Checkbox->getState(), _domain); - ConfMan.setBool("enable_gs", _enableGSCheckbox->getState(), _domain); ConfMan.setInt("midi_gain", _midiGainSlider->getValue(), _domain); Common::String soundFont(_soundFont->getLabel()); @@ -402,14 +401,24 @@ void OptionsDialog::close() { else ConfMan.removeKey("soundfont", _domain); } else { + ConfMan.removeKey("gm_device", _domain); ConfMan.removeKey("multi_midi", _domain); - ConfMan.removeKey("native_mt32", _domain); - ConfMan.removeKey("enable_gs", _domain); ConfMan.removeKey("midi_gain", _domain); ConfMan.removeKey("soundfont", _domain); } } + // MT-32 options + if (_enableMT32Settings) { + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"); + ConfMan.setBool("native_mt32", _mt32Checkbox->getState(), _domain); + ConfMan.setBool("enable_gs", _enableGSCheckbox->getState(), _domain); + } else { + ConfMan.removeKey("mt32_device", _domain); + ConfMan.removeKey("native_mt32", _domain); + ConfMan.removeKey("enable_gs", _domain); + } + // Subtitle options if (_subToggleGroup) { if (_enableSubtitleSettings) { @@ -513,10 +522,6 @@ void OptionsDialog::setAudioSettingsState(bool enabled) { _enableAudioSettings = enabled; _midiPopUpDesc->setEnabled(enabled); _midiPopUp->setEnabled(enabled); - _mt32DevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); - _mt32DevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); - _gmDevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); - _gmDevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1); @@ -537,6 +542,9 @@ void OptionsDialog::setMIDISettingsState(bool enabled) { if (_guioptions & Common::GUIO_NOMIDI) enabled = false; + _gmDevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _gmDevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _enableMIDISettings = enabled; _soundFontButton->setEnabled(enabled); @@ -548,13 +556,21 @@ void OptionsDialog::setMIDISettingsState(bool enabled) { _soundFontClearButton->setEnabled(false); _multiMidiCheckbox->setEnabled(enabled); - _mt32Checkbox->setEnabled(enabled); - _enableGSCheckbox->setEnabled(enabled); _midiGainDesc->setEnabled(enabled); _midiGainSlider->setEnabled(enabled); _midiGainLabel->setEnabled(enabled); } +void OptionsDialog::setMT32SettingsState(bool enabled) { + _enableMT32Settings = enabled; + + _mt32DevicePopUpDesc->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + _mt32DevicePopUp->setEnabled(_domain.equals(Common::ConfigManager::kApplicationDomain) ? enabled : false); + + _mt32Checkbox->setEnabled(enabled); + _enableGSCheckbox->setEnabled(enabled); +} + void OptionsDialog::setVolumeSettingsState(bool enabled) { bool ena; @@ -645,11 +661,6 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _("Preferred Device:") : _("Music Device:"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator")); - _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT-32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); - _mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup"); - _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General MIDI output")); - _gmDevicePopUp = new PopUpWidget(boss, prefix + "auPrefGmPopup"); - // Populate it uint32 allFlags = MidiDriver::musicType2GUIO((uint32)-1); @@ -668,22 +679,9 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref || (deviceGuiOption == Common::GUIO_MIDIGM && (_guioptions & Common::GUIO_MIDIMT32)) || d->getMusicDriverId() == "auto" || d->getMusicDriverId() == "null") // always add default and null device _midiPopUp->appendEntry(d->getCompleteName(), d->getHandle()); - - if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { - _mt32DevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); - if (d->getMusicType() != MT_MT32) - _gmDevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); - } } } - if (!_domain.equals(Common::ConfigManager::kApplicationDomain)) { - _mt32DevicePopUpDesc->setEnabled(false); - _mt32DevicePopUp->setEnabled(false); - _gmDevicePopUpDesc->setEnabled(false); - _gmDevicePopUp->setEnabled(false); - } - // The OPL emulator popup & a label _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", _("AdLib emulator:"), _("AdLib is used for music in many games")); _oplPopUp = new PopUpWidget(boss, prefix + "auOPLPopup", _("AdLib is used for music in many games")); @@ -707,6 +705,26 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref } void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { + _gmDevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefGmPopupDesc", _("GM Device:"), _("Specifies default sound device for General MIDI output")); + _gmDevicePopUp = new PopUpWidget(boss, prefix + "auPrefGmPopup"); + + // Populate + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { + if (d->getMusicType() != MT_MT32) + _gmDevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); + } + } + } + + if (!_domain.equals(Common::ConfigManager::kApplicationDomain)) { + _gmDevicePopUpDesc->setEnabled(false); + _gmDevicePopUp->setEnabled(false); + } + // SoundFont _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity"), kChooseSoundFontCmd); _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None"), _("SoundFont is supported by some audio cards, Fluidsynth and Timidity")); @@ -715,12 +733,6 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi // Multi midi setting _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode"), _("Use both MIDI and AdLib sound generation")); - // Native mt32 setting - _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer")); - - // GS Extensions setting - _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack")); - // MIDI gain setting (FluidSynth uses this) _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); _midiGainSlider = new SliderWidget(boss, prefix + "mcMidiGainSlider", 0, kMidiGainChanged); @@ -731,6 +743,34 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi _enableMIDISettings = true; } +void OptionsDialog::addMT32Controls(GuiObject *boss, const Common::String &prefix) { + _mt32DevicePopUpDesc = new StaticTextWidget(boss, prefix + "auPrefMt32PopupDesc", _("MT-32 Device:"), _("Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output")); + _mt32DevicePopUp = new PopUpWidget(boss, prefix + "auPrefMt32Popup"); + + // Native mt32 setting + _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer")); + + // GS Extensions setting + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack")); + + const MusicPlugin::List p = MusicMan.getPlugins(); + for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) { + MusicDevices i = (**m)->getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) { + if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") { + _mt32DevicePopUp->appendEntry(d->getCompleteName(), d->getHandle()); + } + } + } + + if (!_domain.equals(Common::ConfigManager::kApplicationDomain)) { + _mt32DevicePopUpDesc->setEnabled(false); + _mt32DevicePopUp->setEnabled(false); + } + + _enableMIDISettings = true; +} + // The function has an extra slider range parameter, since both the launcher and SCUMM engine // make use of the widgets. The launcher range is 0-255. SCUMM's 0-9 void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) { @@ -892,7 +932,13 @@ GlobalOptionsDialog::GlobalOptionsDialog() addMIDIControls(tab, "GlobalOptions_MIDI."); // - // 4) The miscellaneous tab + // 4) The MT-32 tab + // + tab->addTab(_("MT-32")); + addMT32Controls(tab, "GlobalOptions_MT32."); + + // + // 5) The Paths tab // tab->addTab(_("Paths")); @@ -916,6 +962,9 @@ GlobalOptionsDialog::GlobalOptionsDialog() #endif #endif + // + // 6) The miscellaneous tab + // tab->addTab(_("Misc")); new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), 0, kChooseThemeCmd); diff --git a/gui/options.h b/gui/options.h index 235cb24462..c05f263d00 100644 --- a/gui/options.h +++ b/gui/options.h @@ -68,6 +68,7 @@ protected: void addGraphicControls(GuiObject *boss, const Common::String &prefix); void addAudioControls(GuiObject *boss, const Common::String &prefix); void addMIDIControls(GuiObject *boss, const Common::String &prefix); + void addMT32Controls(GuiObject *boss, const Common::String &prefix); void addVolumeControls(GuiObject *boss, const Common::String &prefix); // The default value is the launcher's non-scaled talkspeed value. When SCUMM uses the widget, // it uses its own scale @@ -76,6 +77,7 @@ protected: void setGraphicSettingsState(bool enabled); void setAudioSettingsState(bool enabled); void setMIDISettingsState(bool enabled); + void setMT32SettingsState(bool enabled); void setVolumeSettingsState(bool enabled); void setSubtitleSettingsState(bool enabled); @@ -120,12 +122,17 @@ private: // bool _enableMIDISettings; CheckboxWidget *_multiMidiCheckbox; - CheckboxWidget *_mt32Checkbox; - CheckboxWidget *_enableGSCheckbox; StaticTextWidget *_midiGainDesc; SliderWidget *_midiGainSlider; StaticTextWidget *_midiGainLabel; + // + // MT-32 controls + // + bool _enableMT32Settings; + CheckboxWidget *_mt32Checkbox; + CheckboxWidget *_enableGSCheckbox; + // // Subtitle controls // diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index b6b4ffe2e7..8722ece7a6 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 0a38ea4b40..74b8bf4b2c 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -231,22 +231,6 @@ type = 'PopUp' /> - - - - - - - - + + + + - - + + + + + + + + + + + @@ -518,6 +523,15 @@ + + + + + + + @@ -229,22 +229,6 @@ type = 'PopUp' /> - - - - - - - - + + + + + + + + + + + + + + + @@ -521,6 +532,15 @@ + + + + + + + - - - - - - - - + + + + - - + + + + + + + + + + + @@ -533,6 +538,15 @@ + + + + + + + @@ -227,22 +227,6 @@ type = 'PopUp' /> - - - - - - - - + + + + - - + + + + + + + + + + + @@ -519,6 +524,15 @@ + + + + + + + " " " " " " " " " @@ -190,22 +190,6 @@ "/> " " " " " -" " -" " -" " -" " -" " -" " -" " -" " " " @@ -293,6 +277,14 @@ " " " " " " +" " +" " +" " +" " " " " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " " @@ -471,6 +481,14 @@ " " " " " " +" " +" " +" " +" " +" " +" " " " " " " " " " " " -" " -" " -" " -" " -" " -" " -" " -" " " " @@ -1516,6 +1518,14 @@ " " " " " " +" " +" " +" " +" " " " @@ -1530,12 +1540,6 @@ " " -" " -" " " " " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " " @@ -1687,6 +1709,14 @@ " " " " " " +" " +" " +" " +" " +" " +" " " " " " " r.right || r.left + (i + 1) * tabWidth > r.right) + continue; + Common::Rect tabRect(r.left + i * tabWidth, r.top, r.left + (i + 1) * tabWidth, r.top + tabHeight); queueDD(kDDTabInactive, tabRect); queueDDText(getTextData(kDDTabInactive), getTextColor(kDDTabInactive), tabRect, tabs[i], false, false, _widgets[kDDTabInactive]->_textAlignH, _widgets[kDDTabInactive]->_textAlignV); } - if (active >= 0) { + if (active >= 0 && + (r.left + active * tabWidth < r.right) && (r.left + (active + 1) * tabWidth < r.right)) { Common::Rect tabRect(r.left + active * tabWidth, r.top, r.left + (active + 1) * tabWidth, r.top + tabHeight); const uint16 tabLeft = active * tabWidth; const uint16 tabRight = MAX(r.right - tabRect.right, 0); -- cgit v1.2.3 From b90493bba0f860608ee32834774e56def66eafaf Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sat, 24 Jul 2010 23:11:24 +0000 Subject: AMIGAOS4: Patch #3033938: "Configure change" AmigaOS4 core devs tell that the special directory "SObjs" (that holds the shared object files) should only be used by the end user (games, apps, etc.) but not by projects that are to be build. This patch fixes it. svn-id: r51269 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 56391409d4..6e93c70899 100755 --- a/configure +++ b/configure @@ -1344,7 +1344,7 @@ echo $_host_os case $_host_os in amigaos*) CXXFLAGS="$CXXFLAGS -mcrt=newlib -mstrict-align -mcpu=750 -mtune=7400" - LDFLAGS="$LDFLAGS -mcrt=newlib -use-dynld -Lsobjs:" + LDFLAGS="$LDFLAGS -mcrt=newlib -use-dynld -LSDK:Local/newib/lib" # We have to use 'long' for our 4 byte typedef because AmigaOS already typedefs (u)int32 # as (unsigned) long, and consequently we'd get a compiler error otherwise. type_4_byte='long' -- cgit v1.2.3 From 3090ee6ee710bf7c2c43a69e36740a829852f65d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 04:45:28 +0000 Subject: SCI: sci32 changes - mouse position now gets adjusted inside kGetEvent - priority is read out during kFrameout - check planeRect - check if plane picture resource actually exists fixes sq6 svn-id: r51270 --- engines/sci/engine/kevent.cpp | 1 + engines/sci/graphics/coordadjuster.cpp | 32 ++++++++++++++++---------------- engines/sci/graphics/coordadjuster.h | 9 +++++++++ engines/sci/graphics/frameout.cpp | 25 +++++++++++++++++++++++-- engines/sci/graphics/frameout.h | 3 +++ 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index e752f1e8bb..93bdb5ccf3 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -50,6 +50,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { // Limit the mouse cursor position, if necessary g_sci->_gfxCursor->refreshPosition(); mousePos = g_sci->_gfxCursor->getPosition(); + g_sci->_gfxCoordAdjuster->getEvent(mousePos); // If there's a simkey pending, and the game wants a keyboard event, use the // simkey instead of a normal event diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp index 69f89aa656..70b04b37bf 100644 --- a/engines/sci/graphics/coordadjuster.cpp +++ b/engines/sci/graphics/coordadjuster.cpp @@ -89,36 +89,26 @@ Common::Rect GfxCoordAdjuster16::pictureGetDisplayArea() { #ifdef ENABLE_SCI32 GfxCoordAdjuster32::GfxCoordAdjuster32(SegManager *segMan) : _segMan(segMan) { + scriptsRunningWidth = 0; + scriptsRunningHeight = 0; } GfxCoordAdjuster32::~GfxCoordAdjuster32() { } void GfxCoordAdjuster32::kernelGlobalToLocal(int16 &x, int16 &y, reg_t planeObject) { - EngineState *s = g_sci->getEngineState(); - uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); - uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); - uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); - uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); - - y = ((y * planeResY) / g_sci->_gfxScreen->getHeight()); - x = ((x * planeResX) / g_sci->_gfxScreen->getWidth()); + uint16 planeTop = readSelectorValue(_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(_segMan, planeObject, SELECTOR(left)); y -= planeTop; x -= planeLeft; } void GfxCoordAdjuster32::kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject) { - EngineState *s = g_sci->getEngineState(); - uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY)); - uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX)); - uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top)); - uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left)); + uint16 planeTop = readSelectorValue(_segMan, planeObject, SELECTOR(top)); + uint16 planeLeft = readSelectorValue(_segMan, planeObject, SELECTOR(left)); x += planeLeft; y += planeTop; - - y = ((y * g_sci->_gfxScreen->getHeight()) / planeResY); - x = ((x * g_sci->_gfxScreen->getWidth()) / planeResX); } Common::Rect GfxCoordAdjuster32::onControl(Common::Rect rect) { @@ -127,6 +117,16 @@ Common::Rect GfxCoordAdjuster32::onControl(Common::Rect rect) { return adjustedRect; } +void GfxCoordAdjuster32::setScriptsResolution(uint16 width, uint16 height) { + scriptsRunningWidth = width; + scriptsRunningHeight = height; +} + +void GfxCoordAdjuster32::getEvent(Common::Point &pos) { + pos.y = ((pos.y * scriptsRunningHeight) / g_sci->_gfxScreen->getHeight()); + pos.x = ((pos.x * scriptsRunningWidth) / g_sci->_gfxScreen->getWidth()); +} + void GfxCoordAdjuster32::pictureSetDisplayArea(Common::Rect displayArea) { _pictureDisplayArea = displayArea; } diff --git a/engines/sci/graphics/coordadjuster.h b/engines/sci/graphics/coordadjuster.h index 9b2bef48f1..8b9144981c 100644 --- a/engines/sci/graphics/coordadjuster.h +++ b/engines/sci/graphics/coordadjuster.h @@ -50,6 +50,9 @@ public: virtual void setCursorPos(Common::Point &pos) { } virtual void moveCursor(Common::Point &pos) { } + virtual void setScriptsResolution(uint16 width, uint16 height) { } + virtual void getEvent(Common::Point &pos) { } + virtual Common::Rect pictureGetDisplayArea() { return Common::Rect(0, 0); } private: }; @@ -85,6 +88,9 @@ public: Common::Rect onControl(Common::Rect rect); + void setScriptsResolution(uint16 width, uint16 height); + void getEvent(Common::Point &pos); + void pictureSetDisplayArea(Common::Rect displayArea); Common::Rect pictureGetDisplayArea(); @@ -92,6 +98,9 @@ private: SegManager *_segMan; Common::Rect _pictureDisplayArea; + + uint16 scriptsRunningWidth; + uint16 scriptsRunningHeight; }; #endif diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 208459783b..3fbdcfb546 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -48,6 +48,8 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd : _segMan(segMan), _resMan(resMan), _cache(cache), _screen(screen), _palette(palette), _paint32(paint32) { _coordAdjuster = (GfxCoordAdjuster32 *)coordAdjuster; + scriptsRunningWidth = 320; + scriptsRunningHeight = 200; } GfxFrameout::~GfxFrameout() { @@ -55,6 +57,15 @@ GfxFrameout::~GfxFrameout() { void GfxFrameout::kernelAddPlane(reg_t object) { PlaneEntry newPlane; + + if (_planes.empty()) { + // There has to be another way for sierra sci to do this or maybe script resolution is compiled into + // interpreter (TODO) + scriptsRunningHeight = readSelectorValue(_segMan, object, SELECTOR(resY)); + scriptsRunningWidth = readSelectorValue(_segMan, object, SELECTOR(resX)); + _coordAdjuster->setScriptsResolution(scriptsRunningWidth, scriptsRunningHeight); + } + newPlane.object = object; newPlane.pictureId = 0xFFFF; newPlane.picture = NULL; @@ -74,7 +85,9 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) { if (lastPictureId != it->pictureId) { // picture got changed, load new picture if ((it->pictureId != 0xFFFF) && (it->pictureId != 0xFFFE)) { - it->picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, it->pictureId, false); + // SQ6 gives us a bad picture number for the control menu + if (_resMan->testResource(ResourceId(kResourceTypePic, it->pictureId))) + it->picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, it->pictureId, false); } else { delete it->picture; it->picture = NULL; @@ -159,7 +172,6 @@ void GfxFrameout::kernelFrameout() { for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { reg_t planeObject = it->object; - uint16 planePriority = it->priority; uint16 planeLastPriority = it->lastPriority; Common::Rect planeRect; @@ -170,11 +182,20 @@ void GfxFrameout::kernelFrameout() { int16 planeResY = readSelectorValue(_segMan, planeObject, SELECTOR(resY)); int16 planeResX = readSelectorValue(_segMan, planeObject, SELECTOR(resX)); + // Update priority here, sq6 sets it w/o UpdatePlane + uint16 planePriority = it->priority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); + planeRect.top = (planeRect.top * _screen->getHeight()) / planeResY; planeRect.left = (planeRect.left * _screen->getWidth()) / planeResX; planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; + // We get bad plane-bottom in sq6 + if (planeRect.right > _screen->getWidth()) + planeRect.right = _screen->getWidth(); + if (planeRect.bottom > _screen->getHeight()) + planeRect.bottom = _screen->getHeight(); + it->lastPriority = planePriority; if (planePriority == 0xffff) { // Plane currently not meant to be shown // If plane was shown before, delete plane rect diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 5c42489446..028a61f0bf 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -89,6 +89,9 @@ private: PlaneList _planes; void sortPlanes(); + + uint16 scriptsRunningWidth; + uint16 scriptsRunningHeight; }; } // End of namespace Sci -- cgit v1.2.3 From c641731a4c9775685d0f2b79bf837b237128523d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 11:40:47 +0000 Subject: SCI: signature change for kPalVary(8) svn-id: r51271 --- engines/sci/engine/kernel_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index ed507e5736..c391898c46 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -202,7 +202,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { { SIG_SCIALL, 4, MAP_CALL(PalVaryChangeTarget), "i", NULL }, { SIG_SCIALL, 5, MAP_CALL(PalVaryChangeTicks), "i", NULL }, { SIG_SCIALL, 6, MAP_CALL(PalVaryPauseResume), "i", NULL }, - { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "", NULL }, + { SIG_SCI32, 8, MAP_CALL(PalVaryUnknown), "i", NULL }, SCI_SUBOPENTRY_TERMINATOR }; -- cgit v1.2.3 From da5f1506e322a4c33067f6130cb5bc53367b477c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 12:48:48 +0000 Subject: SCI: adjust z coordinate for views (sci32) fixes gk1 newspaper svn-id: r51272 --- engines/sci/graphics/frameout.cpp | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 3fbdcfb546..08cf56c5df 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -179,16 +179,14 @@ void GfxFrameout::kernelFrameout() { planeRect.left = readSelectorValue(_segMan, planeObject, SELECTOR(left)); planeRect.bottom = readSelectorValue(_segMan, planeObject, SELECTOR(bottom)) + 1; planeRect.right = readSelectorValue(_segMan, planeObject, SELECTOR(right)) + 1; - int16 planeResY = readSelectorValue(_segMan, planeObject, SELECTOR(resY)); - int16 planeResX = readSelectorValue(_segMan, planeObject, SELECTOR(resX)); // Update priority here, sq6 sets it w/o UpdatePlane uint16 planePriority = it->priority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); - planeRect.top = (planeRect.top * _screen->getHeight()) / planeResY; - planeRect.left = (planeRect.left * _screen->getWidth()) / planeResX; - planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / planeResY; - planeRect.right = (planeRect.right * _screen->getWidth()) / planeResX; + planeRect.top = (planeRect.top * _screen->getHeight()) / scriptsRunningHeight; + planeRect.left = (planeRect.left * _screen->getWidth()) / scriptsRunningWidth; + planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / scriptsRunningHeight; + planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; // We get bad plane-bottom in sq6 if (planeRect.right > _screen->getWidth()) @@ -309,8 +307,8 @@ void GfxFrameout::kernelFrameout() { if (itemEntry->object.isNull()) { // Picture cel data - itemEntry->y = ((itemEntry->y * _screen->getHeight()) / planeResY); - itemEntry->x = ((itemEntry->x * _screen->getWidth()) / planeResX); + itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight); + itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth); planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planePictureMirrored); // warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); @@ -322,12 +320,16 @@ void GfxFrameout::kernelFrameout() { switch (getSciVersion()) { case SCI_VERSION_2: - if (view->isSci2Hires()) + if (view->isSci2Hires()) { + int16 dummyX = 0; _screen->adjustToUpscaledCoordinates(itemEntry->y, itemEntry->x); + _screen->adjustToUpscaledCoordinates(itemEntry->z, dummyX); + } break; case SCI_VERSION_2_1: - itemEntry->y = (itemEntry->y * _screen->getHeight()) / planeResY; - itemEntry->x = (itemEntry->x * _screen->getWidth()) / planeResX; + itemEntry->y = (itemEntry->y * _screen->getHeight()) / scriptsRunningHeight; + itemEntry->x = (itemEntry->x * _screen->getWidth()) / scriptsRunningWidth; + itemEntry->z = (itemEntry->z * _screen->getHeight()) / scriptsRunningHeight; break; default: break; @@ -361,10 +363,10 @@ void GfxFrameout::kernelFrameout() { } break; case SCI_VERSION_2_1: - nsRect.top = (nsRect.top * planeResY) / _screen->getHeight(); - nsRect.left = (nsRect.left * planeResX) / _screen->getWidth(); - nsRect.bottom = (nsRect.bottom * planeResY) / _screen->getHeight(); - nsRect.right = (nsRect.right * planeResX) / _screen->getWidth(); + nsRect.top = (nsRect.top * scriptsRunningHeight) / _screen->getHeight(); + nsRect.left = (nsRect.left * scriptsRunningWidth) / _screen->getWidth(); + nsRect.bottom = (nsRect.bottom * scriptsRunningHeight) / _screen->getHeight(); + nsRect.right = (nsRect.right * scriptsRunningWidth) / _screen->getWidth(); break; default: break; @@ -416,8 +418,8 @@ void GfxFrameout::kernelFrameout() { bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); - itemEntry->y = ((itemEntry->y * _screen->getHeight()) / planeResY); - itemEntry->x = ((itemEntry->x * _screen->getWidth()) / planeResX); + itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight); + itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth); uint16 curX = itemEntry->x + planeRect.left; uint16 curY = itemEntry->y + planeRect.top; -- cgit v1.2.3 From 246a157d1ef05cceebbb29aa9f5380ea3c98564b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 13:11:28 +0000 Subject: SCI: adding separate kCantBeHere32 (stub) svn-id: r51273 --- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel_tables.h | 1 + engines/sci/engine/kgraphics.cpp | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 19cf11affa..c3b07f4668 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -428,6 +428,7 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv); reg_t kListAt(EngineState *s, int argc, reg_t *argv); reg_t kString(EngineState *s, int argc, reg_t *argv); reg_t kMulDiv(EngineState *s, int argc, reg_t *argv); +reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv); // "Screen items" in SCI32 are views reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv); reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index c391898c46..56d697ffea 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -305,6 +305,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, + { "CantBeHere", kCantBeHere32, SIG_SCI32, SIGFOR_ALL, "ol", NULL, NULL }, { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 4d3d73d0bb..a83c3986e1 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1112,6 +1112,14 @@ reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) { return make_reg(0, 1); } +// SCI32 variant, can't work like sci16 variants +reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv) { +// reg_t curObject = argv[0]; +// reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; + + return NULL_REG; +} + reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) { reg_t viewObj = argv[0]; -- cgit v1.2.3 From 8145fea6b9afdc90f1a24ce845133e46ac3f68ff Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 25 Jul 2010 13:32:15 +0000 Subject: Silenced false positive warning in MSVC svn-id: r51274 --- engines/groovie/vdx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/groovie/vdx.cpp b/engines/groovie/vdx.cpp index efb80059f7..61756cb218 100644 --- a/engines/groovie/vdx.cpp +++ b/engines/groovie/vdx.cpp @@ -489,7 +489,7 @@ void VDXPlayer::decodeBlockDelta(uint32 offset, byte *colours, uint16 imageWidth // Move the pointers to the beginning of the current block int32 blockOff = _origX + _origY * imageWidth; dest += blockOff; - byte *fgBuf; + byte *fgBuf = 0; if (_flagSeven) { fgBuf = (byte *)_fg->getBasePtr(0, 0) + offset + blockOff; //byte *bgBuf = (byte *)_bg->getBasePtr(0, 0) + offset + blockOff; -- cgit v1.2.3 From b3949cf4be02136c633becd841a4a5e45033f8d5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 16:31:46 +0000 Subject: SCI: sci32 coord adjustment changes - fixes lsl6hires inventory svn-id: r51275 --- engines/sci/engine/kevent.cpp | 5 ++++- engines/sci/graphics/compare.cpp | 7 +++---- engines/sci/graphics/coordadjuster.cpp | 11 ++++++++--- engines/sci/graphics/coordadjuster.h | 6 ++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 93bdb5ccf3..3395811700 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -50,7 +50,10 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { // Limit the mouse cursor position, if necessary g_sci->_gfxCursor->refreshPosition(); mousePos = g_sci->_gfxCursor->getPosition(); - g_sci->_gfxCoordAdjuster->getEvent(mousePos); +#ifdef ENABLE_SCI32 + if (getSciVersion() >= SCI_VERSION_2_1) + g_sci->_gfxCoordAdjuster->fromDisplayToScript(mousePos.y, mousePos.x); +#endif // If there's a simkey pending, and the game wants a keyboard event, use the // simkey instead of a normal event diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index c67126bfba..46ccd84e7f 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -139,7 +139,7 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { _screen->adjustToUpscaledCoordinates(y, x); break; case SCI_VERSION_2_1: - _coordAdjuster->kernelLocalToGlobal(x, y, readSelector(_segMan, objectReference, SELECTOR(plane))); + _coordAdjuster->fromScriptToDisplay(y, x); break; default: break; @@ -157,9 +157,8 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) { } break; case SCI_VERSION_2_1: { - reg_t planeObj = readSelector(_segMan, objectReference, SELECTOR(plane)); - _coordAdjuster->kernelGlobalToLocal(celRect.left, celRect.top, planeObj); - _coordAdjuster->kernelGlobalToLocal(celRect.right, celRect.bottom, planeObj); + _coordAdjuster->fromDisplayToScript(celRect.top, celRect.left); + _coordAdjuster->fromDisplayToScript(celRect.bottom, celRect.right); break; } default: diff --git a/engines/sci/graphics/coordadjuster.cpp b/engines/sci/graphics/coordadjuster.cpp index 70b04b37bf..468c41f1c1 100644 --- a/engines/sci/graphics/coordadjuster.cpp +++ b/engines/sci/graphics/coordadjuster.cpp @@ -122,9 +122,14 @@ void GfxCoordAdjuster32::setScriptsResolution(uint16 width, uint16 height) { scriptsRunningHeight = height; } -void GfxCoordAdjuster32::getEvent(Common::Point &pos) { - pos.y = ((pos.y * scriptsRunningHeight) / g_sci->_gfxScreen->getHeight()); - pos.x = ((pos.x * scriptsRunningWidth) / g_sci->_gfxScreen->getWidth()); +void GfxCoordAdjuster32::fromDisplayToScript(int16 &y, int16 &x) { + y = ((y * scriptsRunningHeight) / g_sci->_gfxScreen->getHeight()); + x = ((x * scriptsRunningWidth) / g_sci->_gfxScreen->getWidth()); +} + +void GfxCoordAdjuster32::fromScriptToDisplay(int16 &y, int16 &x) { + y = ((y * g_sci->_gfxScreen->getHeight()) / scriptsRunningHeight); + x = ((x * g_sci->_gfxScreen->getWidth()) / scriptsRunningWidth); } void GfxCoordAdjuster32::pictureSetDisplayArea(Common::Rect displayArea) { diff --git a/engines/sci/graphics/coordadjuster.h b/engines/sci/graphics/coordadjuster.h index 8b9144981c..7e5d2351b9 100644 --- a/engines/sci/graphics/coordadjuster.h +++ b/engines/sci/graphics/coordadjuster.h @@ -51,7 +51,8 @@ public: virtual void moveCursor(Common::Point &pos) { } virtual void setScriptsResolution(uint16 width, uint16 height) { } - virtual void getEvent(Common::Point &pos) { } + virtual void fromScriptToDisplay(int16 &y, int16 &x) { } + virtual void fromDisplayToScript(int16 &y, int16 &x) { } virtual Common::Rect pictureGetDisplayArea() { return Common::Rect(0, 0); } private: @@ -89,7 +90,8 @@ public: Common::Rect onControl(Common::Rect rect); void setScriptsResolution(uint16 width, uint16 height); - void getEvent(Common::Point &pos); + void fromScriptToDisplay(int16 &y, int16 &x); + void fromDisplayToScript(int16 &y, int16 &x); void pictureSetDisplayArea(Common::Rect displayArea); Common::Rect pictureGetDisplayArea(); -- cgit v1.2.3 From d5ced8ab9e6a3b089792d27741699c1928e7fc58 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 16:37:36 +0000 Subject: SCI: using coordadjuster in GfxView svn-id: r51276 --- engines/sci/graphics/view.cpp | 15 +++++---------- engines/sci/graphics/view.h | 1 + 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 80778504ec..d32e60335f 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -28,6 +28,7 @@ #include "sci/engine/state.h" #include "sci/graphics/screen.h" #include "sci/graphics/palette.h" +#include "sci/graphics/coordadjuster.h" #include "sci/graphics/view.h" namespace Sci { @@ -35,6 +36,7 @@ namespace Sci { GfxView::GfxView(ResourceManager *resMan, GfxScreen *screen, GfxPalette *palette, GuiResourceId resourceId) : _resMan(resMan), _screen(screen), _palette(palette), _resourceId(resourceId) { assert(resourceId != -1); + _coordAdjuster = g_sci->_gfxCoordAdjuster; initData(resourceId); } @@ -267,16 +269,9 @@ void GfxView::initData(GuiResourceId resourceId) { break; case SCI_VERSION_2_1: - // half the width returned here, fixes lsl6 action icon placements - // the scripts work low-res and add the returned value from here to the coordinate - // TODO: check, if this is actually right. I'm slightly confused by this, but even GK1CD has some idivs in this - // code, so it seems plausible. - if (_screen->getDisplayWidth() > 320) { - for (loopNo = 0; loopNo < _loopCount; loopNo++) { - for (celNo = 0; celNo < _loop[loopNo].celCount; celNo++) { - _loop[loopNo].cel[celNo].scriptWidth /= 2; - _loop[loopNo].cel[celNo].scriptHeight /= 2; - } + for (loopNo = 0; loopNo < _loopCount; loopNo++) { + for (celNo = 0; celNo < _loop[loopNo].celCount; celNo++) { + _coordAdjuster->fromDisplayToScript(_loop[loopNo].cel[celNo].scriptHeight, _loop[loopNo].cel[celNo].scriptWidth); } } default: diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index bcfae8a112..25e110ad13 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -82,6 +82,7 @@ private: void unditherBitmap(byte *bitmap, int16 width, int16 height, byte clearKey); ResourceManager *_resMan; + GfxCoordAdjuster *_coordAdjuster; GfxScreen *_screen; GfxPalette *_palette; -- cgit v1.2.3 From dec30186eb4892598a5d522633060cc20208dff1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 25 Jul 2010 16:38:25 +0000 Subject: GUI: Fix MIDI gain position in MIDI tab for lowres classic theme. svn-id: r51277 --- gui/themes/default.inc | 1830 ++++++++++----------- gui/themes/scummclassic.zip | Bin 58134 -> 58008 bytes gui/themes/scummclassic/classic_layout_lowres.stx | 6 - gui/themes/scummmodern.zip | Bin 165317 -> 165317 bytes 4 files changed, 912 insertions(+), 924 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 2ca6b87c1c..f03b3fc61e 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -300,12 +300,6 @@ " " -" " -" " " " " " " " " " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " +" " -" " -" " -" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " -" " +" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " -" " -" " +" " -" " -" " -" " -" " -" " -" " +" " +" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " +" " +" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " +" " -" " -" " -" " -" " +" " +" " +" " +" " -" " -" " +" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " " " " " " " -" " -" " +" " +" " " " -" " +" " " " " " " " " " -" " +" " " " -" " -" " -" " +" " " " -" " -" " -" " +" " +" " +" " +" " " " -" " +" " +" " +" " -" " +" " +" " +" " +" " +" " +" " " " " " -" " +" " " " +" " +" " +" " +" " +" " +" " " " -" " -" " " " " " -" " -" " " " " " -" " -" " " " -" " -" " +" " -" " -" " +" " +" " +" " +" " +" " +" " -" " " " -" " -" " +" " -" " -" " +" " +" " +" " " " " " " " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " +" " +" " " " @@ -1485,7 +1405,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1496,7 +1416,7 @@ "type='SmallLabel' " "/> " " " -" " +" " " " @@ -1508,516 +1428,590 @@ "/> " " " " " -" " +" " " " " " " " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " " " -" " -" " -" " +" " -" " -" " " " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " +" " -" " " " +" " " " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " " " -" " -" " +" " +" " -" " -" " -" " -" " +" " -" " " " " " " " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " -" " -" " -" " +" " " " +" " " " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " " " -" " -" " -" " -" " -" " -" " -" " -" " " " -" " " " " " " " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " " " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " " " " " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " +" " +" " -" " -" " -" " -" " +" " +" " -" " -" " +" " +" " -" " +" " +" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " +" " +" " -" " +" " +" " -" " -" " +" " +" " -" " +" " +" " -" " -" " -" " -" " -" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " -" " -" " -" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 8722ece7a6..6b079f7afc 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 057cc3ea0e..622c23439e 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -342,12 +342,6 @@ - - getHeight()) / scriptsRunningHeight; planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; + // We get negative left in kq7 in scrolling rooms + if (planeRect.left < 0) + planeRect.left = 0; + if (planeRect.top < 0) + planeRect.top = 0; // We get bad plane-bottom in sq6 if (planeRect.right > _screen->getWidth()) planeRect.right = _screen->getWidth(); -- cgit v1.2.3 From 9b1d691594e2dc36de5851d7062289665b6497e5 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 19:56:44 +0000 Subject: SCI: blacking out planes that got deleted svn-id: r51282 --- engines/sci/graphics/frameout.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 71d5b9ebb2..28f08a988f 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -104,6 +104,18 @@ void GfxFrameout::kernelDeletePlane(reg_t object) { for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { if (it->object == object) { _planes.erase(it); + Common::Rect planeRect; + planeRect.top = readSelectorValue(_segMan, object, SELECTOR(top)); + planeRect.left = readSelectorValue(_segMan, object, SELECTOR(left)); + planeRect.bottom = readSelectorValue(_segMan, object, SELECTOR(bottom)) + 1; + planeRect.right = readSelectorValue(_segMan, object, SELECTOR(right)) + 1; + + planeRect.top = (planeRect.top * _screen->getHeight()) / scriptsRunningHeight; + planeRect.left = (planeRect.left * _screen->getWidth()) / scriptsRunningWidth; + planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / scriptsRunningHeight; + planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; + // Blackout removed plane rect + _paint32->fillRect(planeRect, 0); return; } } -- cgit v1.2.3 From e3866046af852a465acabdc018bc1adf97767ac9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 25 Jul 2010 20:41:23 +0000 Subject: SCI: adding kAddPicAt dummy svn-id: r51283 --- engines/sci/engine/kernel.h | 1 + engines/sci/engine/kernel_tables.h | 1 + engines/sci/engine/kgraphics.cpp | 10 ++++++++++ engines/sci/graphics/frameout.cpp | 9 +++++++++ engines/sci/graphics/frameout.h | 1 + 5 files changed, 22 insertions(+) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index c3b07f4668..f7b46b81dd 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -457,6 +457,7 @@ reg_t kRobot(EngineState *s, int argc, reg_t *argv); reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv); reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); reg_t kCD(EngineState *s, int argc, reg_t *argv); +reg_t kAddPicAt(EngineState *s, int argc, reg_t *argv); reg_t kAddBefore(EngineState *s, int argc, reg_t *argv); reg_t kMoveToFront(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 56d697ffea..f9b4c4ced6 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -481,6 +481,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(AddPicAt), SIG_EVERYWHERE, "oiii", NULL, NULL }, { NULL, NULL, SIG_EVERYWHERE, NULL, NULL, NULL } #endif }; diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index a83c3986e1..cf260bc4e1 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1186,6 +1186,16 @@ reg_t kRepaintPlane(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } +reg_t kAddPicAt(EngineState *s, int argc, reg_t *argv) { + reg_t planeObj = argv[0]; + GuiResourceId pictureId = argv[1].toUint16(); + int16 forWidth = argv[2].toSint16(); + // argv[3] seems to be 0 most of the time + + g_sci->_gfxFrameout->kernelAddPicAt(planeObj, forWidth, pictureId); + return s->r_acc; +} + reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) { return make_reg(0, g_sci->_gfxFrameout->kernelGetHighPlanePri()); } diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 28f08a988f..1efde7cb33 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -139,6 +139,15 @@ int16 GfxFrameout::kernelGetHighPlanePri() { return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back().object, SELECTOR(priority)); } +// No idea yet how to implement this +void GfxFrameout::kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId) { + //if (forWidth == 320) { + // writeSelectorValue(_segMan, planeObj, SELECTOR(left), 0); + // writeSelectorValue(_segMan, planeObj, SELECTOR(picture), pictureId); + // kernelUpdatePlane(planeObj); + //} +} + bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { if (entry1->priority == entry2->priority) { if (entry1->y == entry2->y) diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 028a61f0bf..beb89d5d71 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -74,6 +74,7 @@ public: void kernelAddScreenItem(reg_t object); void kernelDeleteScreenItem(reg_t object); int16 kernelGetHighPlanePri(); + void kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId); void kernelFrameout(); private: -- cgit v1.2.3 From fed9541f475f4781dca28fa1d4cc94b36402dc62 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 25 Jul 2010 22:47:17 +0000 Subject: Fixed LSL6 hires resources, speech and lip sync work now (thanks to a discussion we had with clone2727) svn-id: r51287 --- engines/sci/resource.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index d84e9cc75b..65c9e6f34e 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -164,8 +164,15 @@ ResourceType ResourceManager::convertResType(byte type) { } else { // SCI2.1+ #ifdef ENABLE_SCI32 - if (type < ARRAYSIZE(s_resTypeMapSci21)) - return s_resTypeMapSci21[type]; + if (type < ARRAYSIZE(s_resTypeMapSci21)) { + // LSL6 hires doesn't have the chunk resource type, to match + // the resource types of the lowres version, thus we use the + // older resource types here + if (g_sci && g_sci->getGameId() == GID_LSL6HIRES) + return s_resTypeMapSci0[type]; + else + return s_resTypeMapSci21[type]; + } #else error("SCI32 support not compiled in"); #endif -- cgit v1.2.3 From b28b290c7086b1d16df3403b727bc9686d006f13 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 05:40:58 +0000 Subject: SCI: Fixed bug #3034464, "ECOQUEST2: Crash near beginning" svn-id: r51293 --- engines/sci/engine/vm.cpp | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 099fabff16..d672f9b10f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1101,7 +1101,7 @@ void run_vm(EngineState *s) { if (validate_unsignedInteger(r_temp, value1) && validate_unsignedInteger(s->r_acc, value2)) s->r_acc = make_reg(0, value1 | value2); else - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeOrWorkarounds, r_temp, s->r_acc); break; } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index e002fcf03f..6d74adde53 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -38,6 +38,12 @@ const SciWorkaroundEntry opcodeDivWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeOrWorkarounds[] = { + { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call, index, workaround const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 11d3824c83..4e941a0b15 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -69,6 +69,7 @@ struct SciWorkaroundEntry { }; extern const SciWorkaroundEntry opcodeDivWorkarounds[]; +extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; -- cgit v1.2.3 From 27ce375a9526effe904b1d2c36f862043c516fd3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 05:49:00 +0000 Subject: SCI: Fixed bug #3034507, "PQ2 Demo: Non-existant menu item" svn-id: r51294 --- engines/sci/graphics/menu.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 44d4e6968f..b280f78b3c 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -271,8 +271,13 @@ GuiMenuItemEntry *GfxMenu::findItem(uint16 menuId, uint16 itemId) { void GfxMenu::kernelSetAttribute(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value) { GuiMenuItemEntry *itemEntry = findItem(menuId, itemId); - if (!itemEntry) - error("Tried to setAttribute() on non-existant menu-item %d:%d", menuId, itemId); + if (!itemEntry) { + // Check if the game actually has a menu. PQ2 demo calls this, for example, but has no menus. + if (_itemList.size() == 0) + return; + else + error("Tried to setAttribute() on non-existant menu-item %d:%d", menuId, itemId); + } switch (attributeId) { case SCI_MENU_ATTRIBUTE_ENABLED: itemEntry->enabled = value.isNull() ? false : true; -- cgit v1.2.3 From 02a2f084080ba92f85e937dac5618bbda19e4ec4 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 26 Jul 2010 06:10:47 +0000 Subject: Janitorial: Fix punctuation in error/warning svn-id: r51296 --- base/main.cpp | 2 +- sound/mididrv.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index d40c912bf8..e651456ace 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -347,7 +347,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // On the other hand we cannot load the plugins before we know the file paths (in case of external plugins). if (settings.contains("music-driver")) { if (MidiDriver::getMusicType(MidiDriver::getDeviceHandle(settings["music-driver"])) == MT_INVALID) { - warning("Unrecognized music driver '%s'. Switching to default device.", settings["music-driver"].c_str()); + warning("Unrecognized music driver '%s'. Switching to default device", settings["music-driver"].c_str()); settings["music-driver"] = "auto"; } } diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 8dc165c3d6..893b873a35 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -261,7 +261,7 @@ MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &ident const MusicPlugin::List p = MusicMan.getPlugins(); if (p.begin() == p.end()) - error("Music plugins must be loaded prior to calling this method."); + error("Music plugins must be loaded prior to calling this method"); for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); -- cgit v1.2.3 From 9074103d4402d1be5758da9bdbbdd87a9189f2de Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 26 Jul 2010 06:19:57 +0000 Subject: MIDI: Make it possible to specify MIDI device by music driver id If getDeviceHandle() gets a music driver id it will pick the driver's first device, which should hopefully be a sensible default. E.g. it's once again possible to use "-e alsa" rather than the much more cumbersome "-e 'alsa_Emu10k1 WaveTable'". svn-id: r51297 --- sound/mididrv.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 893b873a35..c7587992e0 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -266,7 +266,10 @@ MidiDriver::DeviceHandle MidiDriver::getDeviceHandle(const Common::String &ident for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); m++) { MusicDevices i = (**m)->getDevices(); for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { - if (identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) { + // The music driver id isn't unique, but it will match + // driver's first device. This is useful when selecting + // the driver from the command line. + if (identifier.equals(d->getMusicDriverId()) || identifier.equals(d->getCompleteId()) || identifier.equals(d->getCompleteName())) { return d->getHandle(); } } -- cgit v1.2.3 From 703c8b665a42a7cb5356e6a8d019d9863d420535 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 06:30:15 +0000 Subject: SCI: Fixed bug #3034490 , "signature mismatch in laura bow 2 introduction" svn-id: r51298 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 8 ++++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index f9b4c4ced6..8d3bfac6a1 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -379,7 +379,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(LocalToGlobal), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(Lock), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(MapKeyToDir), SIG_EVERYWHERE, "o", NULL, NULL }, - { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop + { MAP_CALL(Memory), SIG_EVERYWHERE, "i(.*)", NULL, kMemory_workarounds }, // subop { MAP_CALL(MemoryInfo), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(MemorySegment), SIG_EVERYWHERE, "ir(i)", NULL, NULL }, // subop { MAP_CALL(MenuSelect), SIG_EVERYWHERE, "o(i)", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 6d74adde53..b1da529267 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -178,6 +178,14 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kMemory_workarounds[] = { + { GID_LAURABOW2, 160, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train + // TODO + //{ GID_LAURABOW2, 220, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when talking to Mr. Augustini + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 4e941a0b15..5eaf8721a2 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -82,6 +82,7 @@ extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; +extern const SciWorkaroundEntry kMemory_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; -- cgit v1.2.3 From efa0f664029151f213c3a73a54bfd48ebf844981 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 07:31:51 +0000 Subject: SCI: Fixed a script bug in the intro of LB2 (invalid call to kMemory), room 220 (while talking to Mr. Augustini) svn-id: r51301 --- engines/sci/engine/workarounds.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b1da529267..dd65b8e8a1 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -181,8 +181,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kMemory_workarounds[] = { { GID_LAURABOW2, 160, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train - // TODO - //{ GID_LAURABOW2, 220, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when talking to Mr. Augustini + { GID_LAURABOW2, 220, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when talking to Mr. Augustini SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From a278e01998aeda10d22b6edb1e9be23c81abf033 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 07:40:51 +0000 Subject: SCI: Fixed bug #3034536 - "AMIGAOS4: SCI - Compiler error". svn-id: r51302 --- engines/sci/engine/kernel_tables.h | 2 ++ engines/sci/resource.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 8d3bfac6a1..943d0cab9d 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -305,7 +305,9 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(AvoidPath), SIG_EVERYWHERE, "ii(.*)", NULL, NULL }, { MAP_CALL(BaseSetter), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(CanBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, +#ifdef ENABLE_SCI32 { "CantBeHere", kCantBeHere32, SIG_SCI32, SIGFOR_ALL, "ol", NULL, NULL }, +#endif { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, diff --git a/engines/sci/resource.h b/engines/sci/resource.h index f1f5f469d3..f1ea2f15f9 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -149,11 +149,11 @@ public: Common::String toString() const { char buf[32]; - snprintf(buf, 32, "%s.%i", getResourceTypeName(_type), _number); + snprintf(buf, 32, "%s.%d", getResourceTypeName(_type), _number); Common::String retStr = buf; if (_tuple != 0) { - snprintf(buf, 32, "(%i, %i, %i, %i)", _tuple >> 24, (_tuple >> 16) & 0xff, (_tuple >> 8) & 0xff, _tuple & 0xff); + snprintf(buf, 32, "(%d, %d, %d, %d)", _tuple >> 24, (_tuple >> 16) & 0xff, (_tuple >> 8) & 0xff, _tuple & 0xff); retStr += buf; } -- cgit v1.2.3 From 8d04588880548ef25102f15343ad970f274f6e09 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 07:55:50 +0000 Subject: SCI: Added room number to signature mismatch errors svn-id: r51303 --- engines/sci/engine/vm.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d672f9b10f..b1cdc8aa76 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -704,7 +704,9 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { switch (solution.type) { case WORKAROUND_NONE: kernel->signatureDebug(kernelCall.signature, argc, argv); - error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, room %d, localCall %x)", + kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), + originReply.scriptNr, s->currentRoomNumber(), originReply.localCallOffset); break; case WORKAROUND_IGNORE: // don't do kernel call, leave acc alone return; @@ -749,9 +751,13 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { int callNameLen = strlen(kernelCall.name); if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { const char *subCallName = kernelSubCall.name + callNameLen; - error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, localCall %x)", kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("[VM] k%s(%s): signature mismatch via method %s::%s (script %d, room %d, localCall %x)", + kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), + originReply.scriptNr, s->currentRoomNumber(), originReply.localCallOffset); } - error("[VM] k%s: signature mismatch via method %s::%s (script %d, localCall %x)", kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("[VM] k%s: signature mismatch via method %s::%s (script %d, room %d, localCall %x)", + kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), + originReply.scriptNr, s->currentRoomNumber(), originReply.localCallOffset); break; } case WORKAROUND_IGNORE: // don't do kernel call, leave acc alone -- cgit v1.2.3 From d85e01640609f59bd1b3a8e9ffb3f16677832fac Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 08:21:43 +0000 Subject: SCI: Fixed bug #3034506, "QFG4 Demo: kPalette Subfunction Sig Mismatch", plus another sig mismatch on kDrawCel later on, when Dr. Cranium talks svn-id: r51304 --- engines/sci/engine/kernel_tables.h | 4 ++-- engines/sci/engine/kgraphics.cpp | 5 +++-- engines/sci/engine/workarounds.cpp | 12 ++++++++++++ engines/sci/engine/workarounds.h | 2 ++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 943d0cab9d..ff754ab92d 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -210,7 +210,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { static const SciKernelMapSubEntry kPalette_subops[] = { { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, - { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", kPaletteUnsetFlag_workarounds }, { SIG_SCIALL, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, @@ -332,7 +332,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, kDrawCel_workarounds }, // for kq6 hires and qfg4 demo { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index cf260bc4e1..dae2197533 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,8 +1000,9 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - bool hiresMode = (argc > 7) ? true : false; - reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; + // QFG4 demo calls this with an extra integer parameter (room 22, when Dr. Cranium speaks) + bool hiresMode = (argc > 7 && argv[6].segment != 0) ? true : false; + reg_t upscaledHiresHandle = (argc > 7 && argv[6].segment != 0) ? argv[7] : NULL_REG; g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index dd65b8e8a1..af30753c03 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -110,6 +110,12 @@ const SciWorkaroundEntry kAbs_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDrawCel_workarounds[] = { + { GID_QFG4, 371, 22, 0, "GloryWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Dr. Cranium talks, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object @@ -185,6 +191,12 @@ const SciWorkaroundEntry kMemory_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { + { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 5eaf8721a2..cbd31d0849 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -73,6 +73,7 @@ extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; +extern const SciWorkaroundEntry kDrawCel_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; @@ -83,6 +84,7 @@ extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; +extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; -- cgit v1.2.3 From e1314408213860cb7a3b859ee2e985a2a8294668 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 09:16:57 +0000 Subject: SCI: Fixed bug #3034519, "GK1 Demo: kIsObject Sig Mismatch". svn-id: r51305 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index ff754ab92d..9d85a2ec6f 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -373,7 +373,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(InitBresen), SIG_EVERYWHERE, "o(i)", NULL, NULL }, { MAP_CALL(Intersections), SIG_EVERYWHERE, "iiiiriiiri", NULL, NULL }, { MAP_CALL(IsItSkip), SIG_EVERYWHERE, "iiiii", NULL, NULL }, - { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, NULL }, + { MAP_CALL(IsObject), SIG_EVERYWHERE, ".", NULL, kIsObject_workarounds }, { MAP_CALL(Joystick), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(LastNode), SIG_EVERYWHERE, "l", NULL, NULL }, { MAP_CALL(Load), SIG_EVERYWHERE, "ii(i*)", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index af30753c03..5a4839d1d8 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -184,6 +184,12 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kIsObject_workarounds[] = { + { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kMemory_workarounds[] = { { GID_LAURABOW2, 160, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index cbd31d0849..cef46c793a 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -83,6 +83,7 @@ extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; +extern const SciWorkaroundEntry kIsObject_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; -- cgit v1.2.3 From 9da4c3f883892d753ba31526aa7183300ffcd27c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 09:18:04 +0000 Subject: SCI: Some cosmetic changes to the warning thrown when fixing invalid windows svn-id: r51306 --- engines/sci/graphics/ports.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index bc13d152b8..71c4c5e656 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -250,9 +250,10 @@ Window *GfxPorts::newWindow(const Common::Rect &dims, const Common::Rect *restor r = dims; if (r.width() > _screen->getWidth()) { - // We get invalid dimensions at least at the end of sq3 (script bug!) - // same happens very often in lsl5, sierra sci didnt fix it but it looked awful - warning("fixing too large window, given left&right was %d, %d", dims.left, dims.right); + // We get invalid dimensions at least at the end of sq3 (script bug!). + // Same happens very often in lsl5, sierra sci didnt fix it but it looked awful. + // Also happens frequently in the demo of GK1. + warning("Fixing too large window, left: %d, right: %d", dims.left, dims.right); r.left = 0; r.right = _screen->getWidth() - 1; if ((style != _styleUser) && !(style & SCI_WINDOWMGR_STYLE_NOFRAME)) -- cgit v1.2.3 From ea8271f3cb3af273842d9848d6dde9b222e5cf40 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 09:34:15 +0000 Subject: SCI: combined lb2 workaround svn-id: r51307 --- engines/sci/engine/workarounds.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5a4839d1d8..8bf6e4813c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -192,8 +192,7 @@ const SciWorkaroundEntry kIsObject_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kMemory_workarounds[] = { - { GID_LAURABOW2, 160, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train - { GID_LAURABOW2, 220, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when talking to Mr. Augustini + { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train, talking to Mr. Augustini, etc. SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From c0d915b616b7f50e9feec2afb2969f23c79a9ffb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 12:20:07 +0000 Subject: SCI: some scrolling support for sci32 not fully done yet svn-id: r51308 --- engines/sci/graphics/frameout.cpp | 12 ++-- engines/sci/graphics/picture.cpp | 121 ++++++++++++++++++++++---------------- engines/sci/graphics/picture.h | 4 +- 3 files changed, 79 insertions(+), 58 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 1efde7cb33..df1273933a 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -209,9 +209,13 @@ void GfxFrameout::kernelFrameout() { planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / scriptsRunningHeight; planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; + int16 planeOffsetX = 0; + // We get negative left in kq7 in scrolling rooms - if (planeRect.left < 0) + if (planeRect.left < 0) { + planeOffsetX = -planeRect.left; planeRect.left = 0; + } if (planeRect.top < 0) planeRect.top = 0; // We get bad plane-bottom in sq6 @@ -301,8 +305,6 @@ void GfxFrameout::kernelFrameout() { FrameoutEntry *pictureCels = NULL; if (planePicture) { - // Show base picture -// planePicture->drawSci32Vga(0, planePicture->getSci32celX(0), planePicture->getSci32celY(0), planePictureMirrored); // Allocate memory for picture cels pictureCels = new FrameoutEntry[planePicture->getSci32celCount()]; // Add following cels to the itemlist @@ -336,7 +338,7 @@ void GfxFrameout::kernelFrameout() { itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight); itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth); - planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planePictureMirrored); + planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planeOffsetX, planePictureMirrored); // warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); } else if (itemEntry->viewId != 0xFFFF) { @@ -360,6 +362,8 @@ void GfxFrameout::kernelFrameout() { default: break; } + // Adjust according to current scroll position + itemEntry->x -= planeOffsetX; uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect)); if (useInsetRect) { diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 20228b75c4..e10a319c4c 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -117,7 +117,7 @@ void GfxPicture::drawSci11Vga() { // display Cel-data if (has_cel) - drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0); + drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0); // process vector data drawVectorData(inbuffer + vector_dataPos, vector_size); @@ -153,7 +153,7 @@ int16 GfxPicture::getSci32celPriority(int16 celNo) { return READ_LE_UINT16(inbuffer + cel_headerPos + 36); } -void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored) { +void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictureX, bool mirrored) { byte *inbuffer = _resource->data; int size = _resource->size; int header_size = READ_LE_UINT16(inbuffer); @@ -187,18 +187,18 @@ void GfxPicture::drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mi if (mirrored) { // switch around relativeXpos Common::Rect displayArea = _coordAdjuster->pictureGetDisplayArea(); - callerX = displayArea.width() - callerX - READ_LE_UINT16(inbuffer + cel_headerPos + 0); + drawX = displayArea.width() - drawX - READ_LE_UINT16(inbuffer + cel_headerPos + 0); } cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24); cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); - drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, callerX, callerY); + drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX); cel_headerPos += 42; } #endif -void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 callerX, int16 callerY) { +void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX) { byte *celBitmap = NULL; byte *ptr = NULL; byte *headerPtr = inbuffer + headerPos; @@ -326,54 +326,71 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos Common::Rect displayArea = _coordAdjuster->pictureGetDisplayArea(); - y = callerY + displayArea.top; - lastY = MIN(height + y, displayArea.bottom); - leftX = callerX + displayArea.left; - rightX = MIN(width + leftX, displayArea.right); - - // Change clearcolor to white, if we dont add to an existing picture. That way we will paint everything on screen - // but white and that wont matter because the screen is supposed to be already white. It seems that most (if not all) - // SCI1.1 games use color 0 as transparency and SCI1 games use color 255 as transparency. Sierra SCI seems to paint - // the whole data to screen and wont skip over transparent pixels. So this will actually make it work like Sierra - if (!_addToFlag) - clearColor = _screen->getColorWhite(); - - byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL | GFX_SCREEN_MASK_PRIORITY; - - ptr = celBitmap; - if (!_mirroredFlag) { - // Draw bitmap to screen - x = leftX; - while (y < lastY) { - curByte = *ptr++; - if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) - _screen->putPixel(x, y, drawMask, curByte, priority, 0); - - x++; - - if (x >= rightX) { - if (width > rightX - leftX) // Skip extra pixels at the end of the row - ptr += width - (rightX - leftX); - x = leftX; - y++; - } + uint16 skipCelBitmapPixels = 0; + int16 displayWidth = width; + if (pictureX) { + // scroll position for picture active, we need to adjust drawX accordingly + drawX -= pictureX; + if (drawX < 0) { + skipCelBitmapPixels = -drawX; + displayWidth -= skipCelBitmapPixels; + drawX = 0; } - } else { - // Draw bitmap to screen (mirrored) - x = rightX - 1; - while (y < lastY) { - curByte = *ptr++; - if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) - _screen->putPixel(x, y, drawMask, curByte, priority, 0); - - if (x == leftX) { - if (width > rightX - leftX) // Skip extra pixels at the end of the row - ptr += width - (rightX - leftX); - x = rightX; - y++; + } + + if (displayWidth > 0) { + y = displayArea.top + drawY; + lastY = MIN(height + y, displayArea.bottom); + leftX = displayArea.left + drawX; + rightX = MIN(displayWidth + leftX, displayArea.right); + + uint16 sourcePixelSkipPerRow = 0; + if (width > rightX - leftX) + sourcePixelSkipPerRow = width - (rightX - leftX); + + // Change clearcolor to white, if we dont add to an existing picture. That way we will paint everything on screen + // but white and that wont matter because the screen is supposed to be already white. It seems that most (if not all) + // SCI1.1 games use color 0 as transparency and SCI1 games use color 255 as transparency. Sierra SCI seems to paint + // the whole data to screen and wont skip over transparent pixels. So this will actually make it work like Sierra + if (!_addToFlag) + clearColor = _screen->getColorWhite(); + + byte drawMask = priority == 255 ? GFX_SCREEN_MASK_VISUAL : GFX_SCREEN_MASK_VISUAL | GFX_SCREEN_MASK_PRIORITY; + + ptr = celBitmap; + ptr += skipCelBitmapPixels; + if (!_mirroredFlag) { + // Draw bitmap to screen + x = leftX; + while (y < lastY) { + curByte = *ptr++; + if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) + _screen->putPixel(x, y, drawMask, curByte, priority, 0); + + x++; + + if (x >= rightX) { + ptr += sourcePixelSkipPerRow; + x = leftX; + y++; + } } + } else { + // Draw bitmap to screen (mirrored) + x = rightX - 1; + while (y < lastY) { + curByte = *ptr++; + if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) + _screen->putPixel(x, y, drawMask, curByte, priority, 0); + + if (x == leftX) { + ptr += sourcePixelSkipPerRow; + x = rightX; + y++; + } - x--; + x--; + } } } @@ -652,7 +669,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { vectorGetAbsCoordsNoMirror(data, curPos, x, y); size = READ_LE_UINT16(data + curPos); curPos += 2; _priority = pic_priority; // set global priority so the cel gets drawn using current priority as well - drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y); + drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0); curPos += size; break; case PIC_OPX_EGA_SET_PRIORITY_TABLE: @@ -692,7 +709,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { vectorGetAbsCoordsNoMirror(data, curPos, x, y); size = READ_LE_UINT16(data + curPos); curPos += 2; _priority = pic_priority; // set global priority so the cel gets drawn using current priority as well - drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y); + drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0); curPos += size; break; case PIC_OPX_VGA_PRIORITY_TABLE_EQDIST: diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index c3e844fb9b..b3a0a1509c 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -59,14 +59,14 @@ public: int16 getSci32celY(int16 celNo); int16 getSci32celX(int16 celNo); int16 getSci32celPriority(int16 celNo); - void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, bool mirrored); + void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, bool mirrored); #endif private: void initData(GuiResourceId resourceId); void reset(); void drawSci11Vga(); - void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 callerX, int16 callerY); + void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX); void drawVectorData(byte *data, int size); bool vectorIsNonOpcode(byte pixel); void vectorGetAbsCoords(byte *data, int &curPos, int16 &x, int16 &y); -- cgit v1.2.3 From 284377fc247aa876e6f342250e66bf8a8bbd800c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 26 Jul 2010 13:40:07 +0000 Subject: SCI: Fixed menu reset in SCI0/SCI01 games when restarting svn-id: r51309 --- engines/sci/sci.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 5d67e5c5d7..d58cdd5986 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -277,10 +277,6 @@ bool SciEngine::initGame() { } _gamestate->initGlobals(); - - if (_gamestate->abortScriptProcessing == kAbortRestartGame && _gfxMenu) - _gfxMenu->reset(); - _gamestate->_segMan->initSysStrings(); _gamestate->r_acc = _gamestate->r_prev = NULL_REG; @@ -415,16 +411,19 @@ void SciEngine::runGame() { exitGame(); if (_gamestate->abortScriptProcessing == kAbortRestartGame) { - _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_segMan->resetSegMan(); initGame(); initStackBaseWithSelector(SELECTOR(play)); _gamestate->gameWasRestarted = true; + if (_gfxMenu) + _gfxMenu->reset(); + _gamestate->abortScriptProcessing = kAbortNone; } else if (_gamestate->abortScriptProcessing == kAbortLoadGame) { _gamestate->abortScriptProcessing = kAbortNone; _gamestate->_executionStack.clear(); initStackBaseWithSelector(SELECTOR(replay)); _gamestate->shrinkStackToBase(); + _gamestate->abortScriptProcessing = kAbortNone; } else { break; // exit loop } -- cgit v1.2.3 From aea09cb3a0e0fcb5209b568ea2edd2e974e4ad3a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 26 Jul 2010 14:21:18 +0000 Subject: AGI: Fix spelling and formatting svn-id: r51310 --- engines/agi/op_cmd.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 90a28b1042..a60080186c 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1228,8 +1228,7 @@ void AgiEngine::cmd_quit(uint8 *p) { if (p0) { quitGame(); } else { - if (selectionBox - (" Quit the _game, or continue? \n\n\n", buttons) == 0) { + if (selectionBox(" Quit the game, or continue? \n\n\n", buttons) == 0) { quitGame(); } } -- cgit v1.2.3 From e4bc0c3a18eee3c4a64fc58b55517af510a220c0 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 26 Jul 2010 14:21:59 +0000 Subject: AGI: Fix crash on exit thanks to valgrind svn-id: r51311 --- engines/agi/agi.cpp | 2 +- engines/agi/sprite.cpp | 3 ++- engines/agi/view.cpp | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 789d6a2193..baefa0ab60 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -343,7 +343,7 @@ int AgiEngine::agiInit() { // clear view table for (i = 0; i < MAX_VIEWTABLE; i++) - memset(&_game.viewTable[i], 0, sizeof(VtEntry)); + memset(&_game.viewTable[i], 0, sizeof(struct VtEntry)); initWords(); diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index d65fda7f9d..569481d772 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -245,7 +245,7 @@ void SpritesMgr::objsRestoreArea(Sprite *s) { // WORKAROUND (see ScummVM bug #1945716) // When set.view command is called, current code cannot detect this situation while updating // Thus we force removal of the old sprite - if (s->v->viewReplaced) { + if (s->v && s->v->viewReplaced) { commitBlock(xPos, yPos, xPos + xSize, yPos + ySize); s->v->viewReplaced = false; } @@ -679,6 +679,7 @@ void SpritesMgr::showObj(int n) { s.xSize = c->width; s.ySize = c->height; s.buffer = (uint8 *)malloc(s.xSize * s.ySize); + s.v = 0; objsSaveArea(&s); blitCel(x1, y1, 15, c, _vm->_game.views[n].agi256_2); diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp index 45244bb292..fcca1e2a79 100644 --- a/engines/agi/view.cpp +++ b/engines/agi/view.cpp @@ -157,8 +157,7 @@ int AgiEngine::decodeView(int n) { return errNoLoopsInView; // allocate memory for all views - _game.views[n].loop = (ViewLoop *) - calloc(_game.views[n].numLoops, sizeof(ViewLoop)); + _game.views[n].loop = (ViewLoop *)calloc(_game.views[n].numLoops, sizeof(ViewLoop)); if (_game.views[n].loop == NULL) return errNotEnoughMemory; -- cgit v1.2.3 From 756d5e28479bb74ad011be3fc3aff50a222b6325 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 26 Jul 2010 14:22:16 +0000 Subject: AGI: Fix valgrind warning svn-id: r51312 --- engines/agi/agi.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index baefa0ab60..e83ef4ead9 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -609,6 +609,8 @@ void AgiEngine::initialize() { _renderMode = Common::kRenderEGA; break; } + } else { + _renderMode = Common::kRenderDefault; } _buttonStyle = AgiButtonStyle(_renderMode); -- cgit v1.2.3 From e3e2ae799e59a6245a43c21629313ee3a948e9ce Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 14:41:19 +0000 Subject: SCI: adding scrollcapability to sci32 svn-id: r51313 --- engines/sci/graphics/frameout.cpp | 123 +++++++++++++++++++++++++------------- engines/sci/graphics/frameout.h | 19 +++++- engines/sci/graphics/picture.cpp | 7 +++ engines/sci/graphics/picture.h | 1 + 4 files changed, 105 insertions(+), 45 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index df1273933a..ffa90e8e1f 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -68,7 +68,6 @@ void GfxFrameout::kernelAddPlane(reg_t object) { newPlane.object = object; newPlane.pictureId = 0xFFFF; - newPlane.picture = NULL; newPlane.lastPriority = 0xFFFF; // hidden _planes.push_back(newPlane); @@ -84,13 +83,11 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) { it->pictureId = readSelectorValue(_segMan, object, SELECTOR(picture)); if (lastPictureId != it->pictureId) { // picture got changed, load new picture + deletePlanePictures(object); if ((it->pictureId != 0xFFFF) && (it->pictureId != 0xFFFE)) { // SQ6 gives us a bad picture number for the control menu if (_resMan->testResource(ResourceId(kResourceTypePic, it->pictureId))) - it->picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, it->pictureId, false); - } else { - delete it->picture; - it->picture = NULL; + addPlanePicture(object, it->pictureId, 0); } } sortPlanes(); @@ -101,6 +98,7 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) { } void GfxFrameout::kernelDeletePlane(reg_t object) { + deletePlanePictures(object); for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) { if (it->object == object) { _planes.erase(it); @@ -121,6 +119,26 @@ void GfxFrameout::kernelDeletePlane(reg_t object) { } } +void GfxFrameout::addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX) { + PlanePictureEntry newPicture; + newPicture.object = object; + newPicture.pictureId = pictureId; + newPicture.picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, pictureId, false); + newPicture.startX = startX; + _planePictures.push_back(newPicture); +} + +void GfxFrameout::deletePlanePictures(reg_t object) { + for (PlanePictureList::iterator it = _planePictures.begin(); it != _planePictures.end(); it++) { + if (it->object == object) { + delete it->picture; + _planePictures.erase(it); + deletePlanePictures(object); + return; + } + } +} + void GfxFrameout::kernelAddScreenItem(reg_t object) { _screenItems.push_back(object); } @@ -141,11 +159,7 @@ int16 GfxFrameout::kernelGetHighPlanePri() { // No idea yet how to implement this void GfxFrameout::kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId) { - //if (forWidth == 320) { - // writeSelectorValue(_segMan, planeObj, SELECTOR(left), 0); - // writeSelectorValue(_segMan, planeObj, SELECTOR(picture), pictureId); - // kernelUpdatePlane(planeObj); - //} + addPlanePicture(planeObj, pictureId, forWidth); } bool sortHelper(const FrameoutEntry* entry1, const FrameoutEntry* entry2) { @@ -247,20 +261,14 @@ void GfxFrameout::kernelFrameout() { if (planeBack) _paint32->fillRect(planeRect, planeBack); - GuiResourceId planePictureNr = it->pictureId; - GfxPicture *planePicture = it->picture; - int16 planePictureCels = 0; - bool planePictureMirrored = false; + GuiResourceId planeMainPictureId = it->pictureId; - if (planePicture) { - planePictureCels = planePicture->getSci32celCount(); + bool planePictureMirrored = false; + if (readSelectorValue(_segMan, planeObject, SELECTOR(mirrored))) + planePictureMirrored = true; - _coordAdjuster->pictureSetDisplayArea(planeRect); - _palette->drewPicture(planePictureNr); - - if (readSelectorValue(_segMan, planeObject, SELECTOR(mirrored))) - planePictureMirrored = true; - } + _coordAdjuster->pictureSetDisplayArea(planeRect); + _palette->drewPicture(planeMainPictureId); // Fill our itemlist for this plane int16 itemCount = 0; @@ -302,23 +310,28 @@ void GfxFrameout::kernelFrameout() { } } - FrameoutEntry *pictureCels = NULL; - - if (planePicture) { - // Allocate memory for picture cels - pictureCels = new FrameoutEntry[planePicture->getSci32celCount()]; - // Add following cels to the itemlist - FrameoutEntry *picEntry = pictureCels; - for (int pictureCelNr = 0; pictureCelNr < planePictureCels; pictureCelNr++) { - picEntry->celNo = pictureCelNr; - picEntry->object = NULL_REG; - picEntry->y = planePicture->getSci32celY(pictureCelNr); - picEntry->x = planePicture->getSci32celX(pictureCelNr); - - picEntry->priority = planePicture->getSci32celPriority(pictureCelNr); - - itemList.push_back(picEntry); - picEntry++; + for (PlanePictureList::iterator pictureIt = _planePictures.begin(); pictureIt != _planePictures.end(); pictureIt++) { + if (pictureIt->object == planeObject) { + GfxPicture *planePicture = pictureIt->picture; + // Allocate memory for picture cels + pictureIt->pictureCels = new FrameoutEntry[planePicture->getSci32celCount()]; + + // Add following cels to the itemlist + FrameoutEntry *picEntry = pictureIt->pictureCels; + int planePictureCels = planePicture->getSci32celCount(); + for (int pictureCelNr = 0; pictureCelNr < planePictureCels; pictureCelNr++) { + picEntry->celNo = pictureCelNr; + picEntry->object = NULL_REG; + picEntry->picture = planePicture; + picEntry->y = planePicture->getSci32celY(pictureCelNr); + picEntry->x = planePicture->getSci32celX(pictureCelNr); + picEntry->picStartX = pictureIt->startX; + + picEntry->priority = planePicture->getSci32celPriority(pictureCelNr); + + itemList.push_back(picEntry); + picEntry++; + } } } @@ -337,9 +350,31 @@ void GfxFrameout::kernelFrameout() { // Picture cel data itemEntry->y = ((itemEntry->y * _screen->getHeight()) / scriptsRunningHeight); itemEntry->x = ((itemEntry->x * _screen->getWidth()) / scriptsRunningWidth); + itemEntry->picStartX = ((itemEntry->picStartX * _screen->getWidth()) / scriptsRunningWidth); + + // Out of view + int16 pictureCelStartX = itemEntry->picStartX + itemEntry->x; + int16 pictureCelEndX = pictureCelStartX + itemEntry->picture->getSci32celWidth(itemEntry->celNo); + int16 planeStartX = planeOffsetX; + int16 planeEndX = planeStartX + planeRect.width(); + if (pictureCelEndX < planeStartX) + continue; + if (pictureCelStartX > planeEndX) + continue; - planePicture->drawSci32Vga(itemEntry->celNo, itemEntry->x, itemEntry->y, planeOffsetX, planePictureMirrored); -// warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); + int16 pictureOffsetX = planeOffsetX; + int16 pictureX = itemEntry->x; + if (planeOffsetX) { + if (planeOffsetX <= itemEntry->picStartX) { + pictureX += itemEntry->picStartX - planeOffsetX; + pictureOffsetX = 0; + } else { + pictureOffsetX = planeOffsetX - itemEntry->picStartX; + } + } + + itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, planePictureMirrored); + warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); } else if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); @@ -468,8 +503,10 @@ void GfxFrameout::kernelFrameout() { } } - if (planePicture) { - delete[] pictureCels; + for (PlanePictureList::iterator pictureIt = _planePictures.begin(); pictureIt != _planePictures.end(); pictureIt++) { + if (pictureIt->object == planeObject) { + delete[] pictureIt->pictureCels; + } } } diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index beb89d5d71..f8f7e54a27 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -31,9 +31,8 @@ namespace Sci { struct PlaneEntry { reg_t object; uint16 priority; - GuiResourceId pictureId; - GfxPicture *picture; uint16 lastPriority; + GuiResourceId pictureId; }; typedef Common::List PlaneList; @@ -51,10 +50,22 @@ struct FrameoutEntry { int16 scaleX; int16 scaleY; Common::Rect celRect; + GfxPicture *picture; + int16 picStartX; }; typedef Common::List FrameoutList; +struct PlanePictureEntry { + reg_t object; + int16 startX; + GuiResourceId pictureId; + GfxPicture *picture; + FrameoutEntry *pictureCels; // temporary +}; + +typedef Common::List PlanePictureList; + class GfxCache; class GfxCoordAdjuster32; class GfxPaint32; @@ -77,6 +88,9 @@ public: void kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId); void kernelFrameout(); + void addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX); + void deletePlanePictures(reg_t object); + private: SegManager *_segMan; ResourceManager *_resMan; @@ -88,6 +102,7 @@ private: Common::Array _screenItems; PlaneList _planes; + PlanePictureList _planePictures; void sortPlanes(); diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index e10a319c4c..b31036daa8 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -146,6 +146,13 @@ int16 GfxPicture::getSci32celX(int16 celNo) { return READ_LE_UINT16(inbuffer + cel_headerPos + 38); } +int16 GfxPicture::getSci32celWidth(int16 celNo) { + byte *inbuffer = _resource->data; + int header_size = READ_LE_UINT16(inbuffer); + int cel_headerPos = header_size + 42 * celNo; + return READ_LE_UINT16(inbuffer + cel_headerPos + 0); +} + int16 GfxPicture::getSci32celPriority(int16 celNo) { byte *inbuffer = _resource->data; int header_size = READ_LE_UINT16(inbuffer); diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h index b3a0a1509c..7cd0d71b67 100644 --- a/engines/sci/graphics/picture.h +++ b/engines/sci/graphics/picture.h @@ -58,6 +58,7 @@ public: int16 getSci32celCount(); int16 getSci32celY(int16 celNo); int16 getSci32celX(int16 celNo); + int16 getSci32celWidth(int16 celNo); int16 getSci32celPriority(int16 celNo); void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, bool mirrored); #endif -- cgit v1.2.3 From 31828d093c2974f600e201d3b1915565eaa1e9bf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 14:44:28 +0000 Subject: SCI: commenting out picture cel debug msg svn-id: r51315 --- engines/sci/graphics/frameout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index ffa90e8e1f..c498262038 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -374,7 +374,7 @@ void GfxFrameout::kernelFrameout() { } itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, planePictureMirrored); - warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); +// warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority); } else if (itemEntry->viewId != 0xFFFF) { GfxView *view = _cache->getView(itemEntry->viewId); -- cgit v1.2.3 From faf0d5c2e31bb015ec9c6c8a5a68d761ad39e549 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 15:40:12 +0000 Subject: SCI: adding workaround for island of dr. brain room 290 elevator puzzle, solves bug #3034485 svn-id: r51319 --- engines/sci/engine/kgraphics.cpp | 2 +- engines/sci/engine/workarounds.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index dae2197533..e991070ee7 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -260,7 +260,7 @@ reg_t kGraphDrawLine(EngineState *s, int argc, reg_t *argv) { reg_t kGraphSaveBox(EngineState *s, int argc, reg_t *argv) { Common::Rect rect = getGraphRect(argv); - uint16 screenMask = (argc > 4) ? argv[4].toUint16() : 0; + uint16 screenMask = argv[4].toUint16() & GFX_SCREEN_MASK_ALL; return g_sci->_gfxPaint16->kernelGraphSaveBox(rect, screenMask); } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8bf6e4813c..ce706d17e5 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -149,6 +149,8 @@ const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter + { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack + { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From f5f8d8580484882e07d716f04c9c4f06ff75e740 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 15:43:39 +0000 Subject: SCI: forgot one workaround for r51319 svn-id: r51320 --- engines/sci/engine/workarounds.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ce706d17e5..ce1891ae26 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -149,8 +149,9 @@ const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter - { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above + { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack + { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above + { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution) SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 24c21a9960f9cc815433648b958f4c8cdea57d7b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 15:50:31 +0000 Subject: SCI: making kq5 workaround work in every room fixes bug #3034700 svn-id: r51321 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ce1891ae26..5b00c1ed75 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -72,7 +72,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, 90, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies, is used for kDoAudio + { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast -- cgit v1.2.3 From f6e0c2dd2c3eb6b9cde166497a8286f9d3fea543 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 15:59:04 +0000 Subject: SCI: adding workaround for castle brain room 320 solves bug #3034473, happened also in DOS version of the game but only when exiting the puzzle before solving it svn-id: r51322 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5b00c1ed75..a03bdba72e 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -214,6 +214,7 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference + { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident -- cgit v1.2.3 From 18a54f086f4b1e0edb16a887cc1a556b4ca86fb6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 16:49:04 +0000 Subject: SCI: fixing transition 9 fixes castle of dr. brain intro on amiga svn-id: r51323 --- engines/sci/graphics/transitions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index c1f626449f..9ebd67accf 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -539,7 +539,7 @@ void GfxTransitions::verticalRollFromCenter(bool blackoutFlag) { // only void GfxTransitions::verticalRollToCenter(bool blackoutFlag) { Common::Rect leftRect = Common::Rect(_picRect.left, _picRect.top, _picRect.left + 1, _picRect.bottom); - Common::Rect rightRect = Common::Rect(leftRect.right - 1, _picRect.top, leftRect.right, _picRect.bottom); + Common::Rect rightRect = Common::Rect(_picRect.right - 1, _picRect.top, _picRect.right, _picRect.bottom); while (leftRect.left < rightRect.right) { copyRectToScreen(leftRect, blackoutFlag); leftRect.translate(1, 0); -- cgit v1.2.3 From 3c0765ae7849a9ca9962c5a3c6c83c5bcae506f8 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 26 Jul 2010 17:03:45 +0000 Subject: KYRA: Fix assertion when using "enter" to scene with instant death. svn-id: r51324 --- engines/kyra/kyra_v1.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 1c9a583167..5db2c360d6 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -257,7 +257,7 @@ int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop, int eventFlag) int keys = 0; int8 mouseWheel = 0; - while (_eventList.size()) { + while (!_eventList.empty()) { Common::Event event = *_eventList.begin(); bool breakLoop = false; @@ -281,6 +281,7 @@ int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop, int eventFlag) if (event.kbd.keycode == Common::KEYCODE_d) { if (_debugger) _debugger->attach(); + breakLoop = true; } else if (event.kbd.keycode == Common::KEYCODE_q) { quitGame(); } -- cgit v1.2.3 From 9daa2472d05e9f656d03a80c9999b4e2d1ff9b68 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 17:51:50 +0000 Subject: SCI: adding workaround for kq6 room 210 fixes bug #3034565 svn-id: r51325 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a03bdba72e..8c37cb84db 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -75,6 +75,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) -- cgit v1.2.3 From 5fb760b053db695fdcf2222ae8e462bc5b300663 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 17:55:54 +0000 Subject: SCI: extending rats workaround kq6 to all rooms fixes bug #3034597 svn-id: r51326 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8c37cb84db..8085815aa2 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -74,7 +74,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, 30, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle -- cgit v1.2.3 From 7a86204e5cc1e38d0ce6a6095d339cda83f4704c Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 26 Jul 2010 18:13:35 +0000 Subject: SOUND: Move the Mac snd decoder from SCI to /sound For use with Kyra1 Mac instrument samples. T7G Mac and Loom Mac also use this format for their custom instrument samples. svn-id: r51327 --- engines/sci/sound/audio.cpp | 15 ++---- sound/decoders/mac_snd.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++++ sound/decoders/mac_snd.h | 58 ++++++++++++++++++++++ sound/module.mk | 1 + 4 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 sound/decoders/mac_snd.cpp create mode 100644 sound/decoders/mac_snd.h diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 2e92754cad..4a2a8e65d7 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -36,6 +36,7 @@ #include "sound/audiostream.h" #include "sound/decoders/aiff.h" #include "sound/decoders/flac.h" +#include "sound/decoders/mac_snd.h" #include "sound/decoders/mp3.h" #include "sound/decoders/raw.h" #include "sound/decoders/vorbis.h" @@ -338,19 +339,9 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 } else if (audioRes->size > 14 && READ_BE_UINT16(audioRes->data) == 1 && READ_BE_UINT16(audioRes->data + 2) == 1 && READ_BE_UINT16(audioRes->data + 4) == 5 && READ_BE_UINT32(audioRes->data + 10) == 0x00018051) { // Mac snd detected - // See http://developer.apple.com/legacy/mac/library/documentation/mac/Sound/Sound-60.html#HEADING60-15 for more details + Common::MemoryReadStream *sndStream = new Common::MemoryReadStream(audioRes->data, audioRes->size, DisposeAfterUse::NO); - uint32 soundHeaderOffset = READ_BE_UINT32(audioRes->data + 16); - assert(READ_BE_UINT32(audioRes->data + soundHeaderOffset) == 0); - size = READ_BE_UINT32(audioRes->data + soundHeaderOffset + 4); - _audioRate = READ_BE_UINT16(audioRes->data + soundHeaderOffset + 8); // Really floating point, but we're just truncating - - if (*(audioRes->data + soundHeaderOffset + 20) != 0) - error("Unhandled Mac snd extended/compressed header"); - - data = (byte *)malloc(size); - memcpy(data, audioRes->data + soundHeaderOffset + 22, size); - flags = Audio::FLAG_UNSIGNED; + audioSeekStream = Audio::makeMacSndStream(sndStream, DisposeAfterUse::YES); } else { // SCI1 raw audio size = audioRes->size; diff --git a/sound/decoders/mac_snd.cpp b/sound/decoders/mac_snd.cpp new file mode 100644 index 0000000000..f48d628a5f --- /dev/null +++ b/sound/decoders/mac_snd.cpp @@ -0,0 +1,116 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/* + * The code in this file is based on information found at + * http://developer.apple.com/legacy/mac/library/documentation/mac/Sound/Sound-60.html#HEADING60-15 + * + * We implement both type 1 and type 2 snd resources, but only those that are sampled + */ + +#include "common/util.h" +#include "common/stream.h" + +#include "sound/decoders/mac_snd.h" +#include "sound/audiostream.h" +#include "sound/decoders/raw.h" + +namespace Audio { + +SeekableAudioStream *makeMacSndStream(Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeAfterUse) { + + uint16 sndType = stream->readUint16BE(); + + if (sndType == 1) { + // "normal" snd resources + if (stream->readUint16BE() != 1) { + warning("makeMacSndStream(): Unsupported data type count"); + return 0; + } + + if (stream->readUint16BE() != 5) { + // 5 == sampled + warning("makeMacSndStream(): Unsupported data type"); + return 0; + } + + stream->readUint32BE(); // initialization option + } else if (sndType == 2) { + // old HyperCard snd resources + stream->readUint16BE(); // reference count (unused) + } else { + warning("makeMacSndStream(): Unknown format type %d", sndType); + return 0; + } + + // We really should never get this as long as we have sampled data only + if (stream->readUint16BE() != 1) { + warning("makeMacSndStream(): Unsupported command count"); + return 0; + } + + uint16 command = stream->readUint16BE(); + + // 0x8050 - soundCmd (with dataOffsetFlag set): install a sampled sound as a voice + // 0x8051 - bufferCmd (with dataOffsetFlag set): play a sample sound + if (command != 0x8050 && command != 0x8051) { + warning("makeMacSndStream(): Unsupported command %04x", command); + return 0; + } + + stream->readUint16BE(); // 0 + uint32 soundHeaderOffset = stream->readUint32BE(); + + stream->seek(soundHeaderOffset); + + uint32 soundDataOffset = stream->readUint32BE(); + uint32 size = stream->readUint32BE(); + uint16 rate = stream->readUint32BE() >> 16; // Really floating point, but we only support integer rates + stream->readUint32BE(); // loop start + stream->readUint32BE(); // loop end + byte encoding = stream->readByte(); + stream->readByte(); // base frequency + + if (encoding != 0) { + // 0 == PCM + warning("makeMacSndStream(): Unsupported compression %d", encoding); + return 0; + } + + stream->skip(soundDataOffset); + + byte *data = (byte *)malloc(size); + assert(data); + stream->read(data, size); + + if (disposeAfterUse == DisposeAfterUse::YES) + delete stream; + + // Since we allocated our own buffer for the data, we must specify DisposeAfterUse::YES. + return makeRawStream(data, size, rate, Audio::FLAG_UNSIGNED); +} + +} // End of namespace Audio diff --git a/sound/decoders/mac_snd.h b/sound/decoders/mac_snd.h new file mode 100644 index 0000000000..198a61333e --- /dev/null +++ b/sound/decoders/mac_snd.h @@ -0,0 +1,58 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/** + * @file + * Sound decoder used in engines: + * - sci + */ + +#ifndef SOUND_MAC_SND_H +#define SOUND_MAC_SND_H + +#include "common/scummsys.h" +#include "common/types.h" + +namespace Common { class SeekableReadStream; } + +namespace Audio { + +class SeekableAudioStream; + +/** + * Try to load a Mac snd resource from the given seekable stream and create a SeekableAudioStream + * from that data. + * + * @param stream the SeekableReadStream from which to read the snd data + * @param disposeAfterUse whether to delete the stream after use + * @return a new SeekableAudioStream, or NULL, if an error occurred + */ +SeekableAudioStream *makeMacSndStream( + Common::SeekableReadStream *stream, + DisposeAfterUse::Flag disposeAfterUse); + +} // End of namespace Audio + +#endif diff --git a/sound/module.mk b/sound/module.mk index df593d8e1f..f259f9e91b 100644 --- a/sound/module.mk +++ b/sound/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS := \ decoders/aiff.o \ decoders/flac.o \ decoders/iff_sound.o \ + decoders/mac_snd.o \ decoders/mp3.o \ decoders/raw.o \ decoders/vag.o \ -- cgit v1.2.3 From 85f9bb1e0c9d55a053378d02095ed1f3aa38aea9 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 26 Jul 2010 18:18:25 +0000 Subject: SOUND: The rate in Mac snd's is fixed, not floating point (fix the comment) svn-id: r51328 --- sound/decoders/mac_snd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/decoders/mac_snd.cpp b/sound/decoders/mac_snd.cpp index f48d628a5f..d6894f1144 100644 --- a/sound/decoders/mac_snd.cpp +++ b/sound/decoders/mac_snd.cpp @@ -88,7 +88,7 @@ SeekableAudioStream *makeMacSndStream(Common::SeekableReadStream *stream, uint32 soundDataOffset = stream->readUint32BE(); uint32 size = stream->readUint32BE(); - uint16 rate = stream->readUint32BE() >> 16; // Really floating point, but we only support integer rates + uint16 rate = stream->readUint32BE() >> 16; // Really fixed point, but we only support integer rates stream->readUint32BE(); // loop start stream->readUint32BE(); // loop end byte encoding = stream->readByte(); -- cgit v1.2.3 From 4940819df6d7eee7a5b6b1ebcc08e8ac35ad0268 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 18:40:49 +0000 Subject: SCI: reverting r51304, broke kq6 hires svn-id: r51329 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kgraphics.cpp | 5 ++--- engines/sci/engine/workarounds.cpp | 6 ------ engines/sci/engine/workarounds.h | 1 - 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 9d85a2ec6f..bc235978fc 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -332,7 +332,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, kDrawCel_workarounds }, // for kq6 hires and qfg4 demo + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index e991070ee7..20e4337b09 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,9 +1000,8 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - // QFG4 demo calls this with an extra integer parameter (room 22, when Dr. Cranium speaks) - bool hiresMode = (argc > 7 && argv[6].segment != 0) ? true : false; - reg_t upscaledHiresHandle = (argc > 7 && argv[6].segment != 0) ? argv[7] : NULL_REG; + bool hiresMode = (argc > 7) ? true : false; + reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8085815aa2..812030cafd 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -111,12 +111,6 @@ const SciWorkaroundEntry kAbs_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -const SciWorkaroundEntry kDrawCel_workarounds[] = { - { GID_QFG4, 371, 22, 0, "GloryWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Dr. Cranium talks, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR -}; - // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index cef46c793a..8496be36f6 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -73,7 +73,6 @@ extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; -extern const SciWorkaroundEntry kDrawCel_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; -- cgit v1.2.3 From 9be3c6943810a9a2a15a3acf42f18df661be5eee Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 26 Jul 2010 18:41:19 +0000 Subject: GUI: Fix regression from r51265. This makes the GMM's option dialog work again. The fix itself is exactly the same like I made in r50468, which also broke the GMM's option dialog. svn-id: r51330 --- gui/options.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gui/options.cpp b/gui/options.cpp index 8ddd263a46..d3bda228a7 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -409,14 +409,16 @@ void OptionsDialog::close() { } // MT-32 options - if (_enableMT32Settings) { - saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"); - ConfMan.setBool("native_mt32", _mt32Checkbox->getState(), _domain); - ConfMan.setBool("enable_gs", _enableGSCheckbox->getState(), _domain); - } else { - ConfMan.removeKey("mt32_device", _domain); - ConfMan.removeKey("native_mt32", _domain); - ConfMan.removeKey("enable_gs", _domain); + if (_mt32DevicePopUp) { + if (_enableMT32Settings) { + saveMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"); + ConfMan.setBool("native_mt32", _mt32Checkbox->getState(), _domain); + ConfMan.setBool("enable_gs", _enableGSCheckbox->getState(), _domain); + } else { + ConfMan.removeKey("mt32_device", _domain); + ConfMan.removeKey("native_mt32", _domain); + ConfMan.removeKey("enable_gs", _domain); + } } // Subtitle options -- cgit v1.2.3 From 95c68f029181875bcfe58c8b26358c20a5d358c4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 18:45:32 +0000 Subject: SCI: changing CRLF to LF svn-id: r51331 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 20e4337b09..f2be66ad85 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,7 +1000,7 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - bool hiresMode = (argc > 7) ? true : false; + bool hiresMode = (argc > 7) ? true : false; reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); -- cgit v1.2.3 From 57136cd86a66459a1ef5f2b6d02a7662714c7f3b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 19:25:56 +0000 Subject: SCI: implement scaling for kDrawCel fixes qfg4 demo properly (bug #3034506, previous commit r51304) svn-id: r51332 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kgraphics.cpp | 22 +++++++++++++++++++--- engines/sci/graphics/paint16.cpp | 4 ++-- engines/sci/graphics/paint16.h | 2 +- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index bc235978fc..400bbfc5d2 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -332,7 +332,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)([ri])", NULL, NULL }, // reference for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f2be66ad85..78fb78d42c 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,10 +1000,26 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - bool hiresMode = (argc > 7) ? true : false; - reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; + bool hiresMode = false; + reg_t upscaledHiresHandle = NULL_REG; + uint16 scaleX = 128; + uint16 scaleY = 128; + + if (argc > 7) { + // this is either kq6 hires or scaling + if (paletteNo > 0) { + // it's scaling + scaleX = argv[6].toUint16(); + scaleY = argv[7].toUint16(); + paletteNo = 0; + } else { + // KQ6 hires + hiresMode = true; + upscaledHiresHandle = argv[7]; + } + } - g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); + g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, scaleX, scaleY, hiresMode, upscaledHiresHandle); return s->r_acc; } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 4227c458c5..bb3975e9ef 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -383,11 +383,11 @@ void GfxPaint16::kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, b _ports->setPort(oldPort); } -void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle) { +void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY, bool hiresMode, reg_t upscaledHiresHandle) { // some calls are hiresMode even under kq6 DOS, that's why we check for // upscaled hires here if ((!hiresMode) || (!_screen->getUpscaledHires())) { - drawCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo); + drawCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo, scaleX, scaleY); } else { drawHiresCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo, upscaledHiresHandle); } diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 4c3ac255c4..edffa8da6e 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -73,7 +73,7 @@ public: void bitsFree(reg_t memoryHandle); void kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, bool animationBlackoutFlag, bool mirroredFlag, bool addToFlag, int16 EGApaletteNo); - void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle); + void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY, bool hiresMode, reg_t upscaledHiresHandle); void kernelGraphFillBoxForeground(const Common::Rect &rect); void kernelGraphFillBoxBackground(const Common::Rect &rect); -- cgit v1.2.3 From ea5f8049a2a3af836c81fb4698317b999c152459 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 21:25:07 +0000 Subject: SCI: fixing scroll transitions for kq6 hires fixes bug #3034587 svn-id: r51334 --- engines/sci/graphics/transitions.cpp | 65 ++++++++++++++---------------------- engines/sci/graphics/transitions.h | 1 + 2 files changed, 26 insertions(+), 40 deletions(-) diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp index 9ebd67accf..abb5e74cbd 100644 --- a/engines/sci/graphics/transitions.cpp +++ b/engines/sci/graphics/transitions.cpp @@ -407,39 +407,39 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) { } } +void GfxTransitions::scrollCopyOldToScreen(Common::Rect screenRect, int16 x, int16 y) { + byte *oldScreenPtr = _oldScreen; + int16 screenWidth = _screen->getDisplayWidth(); + if (_screen->getUpscaledHires()) { + _screen->adjustToUpscaledCoordinates(screenRect.top, screenRect.left); + _screen->adjustToUpscaledCoordinates(screenRect.bottom, screenRect.right); + _screen->adjustToUpscaledCoordinates(y, x); + } + oldScreenPtr += screenRect.left + screenRect.top * screenWidth; + g_system->copyRectToScreen(oldScreenPtr, screenWidth, x, y, screenRect.width(), screenRect.height()); +} + // Scroll old screen (up/down/left/right) and insert new screen that way - works // on _picRect area only. void GfxTransitions::scroll(int16 number) { int16 screenWidth, screenHeight; - byte *oldScreenPtr; int16 stepNr = 0; Common::Rect oldMoveRect = _picRect; + Common::Rect oldScreenRect = _picRect; Common::Rect newMoveRect = _picRect; Common::Rect newScreenRect = _picRect; _screen->copyFromScreen(_oldScreen); screenWidth = _screen->getDisplayWidth(); screenHeight = _screen->getDisplayHeight(); - oldScreenPtr = _oldScreen + _picRect.left + _picRect.top * screenWidth; - if (_screen->getUpscaledHires()) { - oldScreenPtr += _picRect.left + _picRect.top * screenWidth; - } - switch (number) { case SCI_TRANSITIONS_SCROLL_LEFT: newScreenRect.right = newScreenRect.left; newMoveRect.left = newMoveRect.right; while (oldMoveRect.left < oldMoveRect.right) { - oldScreenPtr++; - if (_screen->getUpscaledHires()) - oldScreenPtr++; - oldMoveRect.right--; - if (oldMoveRect.right > oldMoveRect.left) { - if (!_screen->getUpscaledHires()) - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left, oldMoveRect.top, oldMoveRect.width(), oldMoveRect.height()); - else - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left * 2, oldMoveRect.top * 2, oldMoveRect.width() * 2, oldMoveRect.height() * 2); - } + oldMoveRect.right--; oldScreenRect.left++; + if (oldMoveRect.right > oldMoveRect.left) + scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top); newScreenRect.right++; newMoveRect.left--; _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top); if ((stepNr & 1) == 0) { @@ -458,13 +458,9 @@ void GfxTransitions::scroll(int16 number) { case SCI_TRANSITIONS_SCROLL_RIGHT: newScreenRect.left = newScreenRect.right; while (oldMoveRect.left < oldMoveRect.right) { - oldMoveRect.left++; - if (oldMoveRect.right > oldMoveRect.left) { - if (!_screen->getUpscaledHires()) - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left, oldMoveRect.top, oldMoveRect.width(), oldMoveRect.height()); - else - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left * 2, oldMoveRect.top * 2, oldMoveRect.width() * 2, oldMoveRect.height() * 2); - } + oldMoveRect.left++; oldScreenRect.right--; + if (oldMoveRect.right > oldMoveRect.left) + scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top); newScreenRect.left--; _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top); if ((stepNr & 1) == 0) { @@ -484,16 +480,9 @@ void GfxTransitions::scroll(int16 number) { newScreenRect.bottom = newScreenRect.top; newMoveRect.top = newMoveRect.bottom; while (oldMoveRect.top < oldMoveRect.bottom) { - oldScreenPtr += screenWidth; - if (_screen->getUpscaledHires()) - oldScreenPtr += screenWidth; - oldMoveRect.top++; - if (oldMoveRect.top < oldMoveRect.bottom) { - if (!_screen->getUpscaledHires()) - g_system->copyRectToScreen(oldScreenPtr, screenWidth, _picRect.left, _picRect.top, oldMoveRect.width(), oldMoveRect.height()); - else - g_system->copyRectToScreen(oldScreenPtr, screenWidth, _picRect.left * 2, _picRect.top * 2, oldMoveRect.width() * 2, oldMoveRect.height() * 2); - } + oldMoveRect.top++; oldScreenRect.top++; + if (oldMoveRect.top < oldMoveRect.bottom) + scrollCopyOldToScreen(oldScreenRect, _picRect.left, _picRect.top); newScreenRect.bottom++; newMoveRect.top--; _screen->copyRectToScreen(newScreenRect, newMoveRect.left, newMoveRect.top); updateScreenAndWait(3); @@ -503,13 +492,9 @@ void GfxTransitions::scroll(int16 number) { case SCI_TRANSITIONS_SCROLL_DOWN: newScreenRect.top = newScreenRect.bottom; while (oldMoveRect.top < oldMoveRect.bottom) { - oldMoveRect.top++; - if (oldMoveRect.top < oldMoveRect.bottom) { - if (!_screen->getUpscaledHires()) - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left, oldMoveRect.top, oldMoveRect.width(), oldMoveRect.height()); - else - g_system->copyRectToScreen(oldScreenPtr, screenWidth, oldMoveRect.left * 2, oldMoveRect.top * 2, oldMoveRect.width() * 2, oldMoveRect.height() * 2); - } + oldMoveRect.top++; oldScreenRect.bottom--; + if (oldMoveRect.top < oldMoveRect.bottom) + scrollCopyOldToScreen(oldScreenRect, oldMoveRect.left, oldMoveRect.top); newScreenRect.top--; _screen->copyRectToScreen(newScreenRect, _picRect.left, _picRect.top); updateScreenAndWait(3); diff --git a/engines/sci/graphics/transitions.h b/engines/sci/graphics/transitions.h index 788cefabca..233638ffda 100644 --- a/engines/sci/graphics/transitions.h +++ b/engines/sci/graphics/transitions.h @@ -83,6 +83,7 @@ private: void pixelation(bool blackoutFlag); void blocks(bool blackoutFlag); void straight(int16 number, bool blackoutFlag); + void scrollCopyOldToScreen(Common::Rect screenRect, int16 x, int16 y); void scroll(int16 number); void verticalRollFromCenter(bool blackoutFlag); void verticalRollToCenter(bool blackoutFlag); -- cgit v1.2.3 From a27f30fa15db7def6c5e6d44703427254baec4ae Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 26 Jul 2010 22:58:06 +0000 Subject: SCI: fixing text fonts not working correctly fixes sq5 and bug #3034766 svn-id: r51335 --- engines/sci/graphics/text16.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 4aa2346aed..08be203230 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -289,6 +289,8 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId if (fontId != -1) SetFont(fontId); + else + fontId = oldFontId; if (g_sci->getLanguage() == Common::JA_JPN) SwitchToFont900OnSjis(text); @@ -296,7 +298,7 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId rect.top = rect.left = 0; if (maxWidth < 0) { // force output as single line - StringWidth(text, oldFontId, textWidth, textHeight); + StringWidth(text, fontId, textWidth, textHeight); rect.bottom = textHeight; rect.right = textWidth; } else { @@ -308,7 +310,7 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId charCount = GetLongest(curPos, rect.right, oldFontId); if (charCount == 0) break; - Width(curPos, 0, charCount, oldFontId, textWidth, textHeight); + Width(curPos, 0, charCount, fontId, textWidth, textHeight); maxTextWidth = MAX(textWidth, maxTextWidth); totalHeight += textHeight; curPos += charCount; @@ -390,6 +392,8 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex if (fontId != -1) SetFont(fontId); + else + fontId = orgFontId; if (g_sci->getLanguage() == Common::JA_JPN) { if (SwitchToFont900OnSjis(text)) @@ -420,9 +424,9 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex _ports->moveTo(rect.left + offset, rect.top + hline); if (bshow) { - Show(text, 0, charCount, orgFontId, orgPenColor); + Show(text, 0, charCount, fontId, orgPenColor); } else { - Draw(text, 0, charCount, orgFontId, orgPenColor); + Draw(text, 0, charCount, fontId, orgPenColor); } hline += textHeight; -- cgit v1.2.3 From 04d2ed5a7f74f58683cdc8e3d0d23d33d8410973 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 26 Jul 2010 23:38:17 +0000 Subject: SCI: Add workarounds for the LB2 demo svn-id: r51336 --- engines/sci/engine/workarounds.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 812030cafd..32328ec1b2 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -214,6 +214,11 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident + { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident + { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident + { GID_LAURABOW2, 6, 6, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the murder, a 3rd parameter is passed by accident + { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 3b231665b1bcca92539b08521727f31d717d4300 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 00:03:45 +0000 Subject: SCI: Add workaround for LB1 demo svn-id: r51337 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 32328ec1b2..a9a04103b6 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -124,6 +124,7 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object + { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 1dc36141a270525e972976d6b09e0909393b4daa Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 01:05:38 +0000 Subject: SCI: Add two more uninited workarounds for Jones/CD svn-id: r51340 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a9a04103b6..32e17540ec 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -70,6 +70,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_JONES, 1, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends + { GID_JONES, 1, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio -- cgit v1.2.3 From 89c9425eef092a7d9482d7512841151932a6a2e3 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 01:51:10 +0000 Subject: SCI: Add a 0x prefix to localCall to show it's a hexadecimal number svn-id: r51341 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b1cdc8aa76..bab71ad7fc 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -704,7 +704,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { switch (solution.type) { case WORKAROUND_NONE: kernel->signatureDebug(kernelCall.signature, argc, argv); - error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, room %d, localCall %x)", + error("[VM] k%s[%x]: signature mismatch via method %s::%s (script %d, room %d, localCall 0x%x)", kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, s->currentRoomNumber(), originReply.localCallOffset); break; -- cgit v1.2.3 From 280204bd12852109ac3202659c2c1b71a922a6c8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 01:52:52 +0000 Subject: SCI: Add workarounds for the camelot demo svn-id: r51342 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 32e17540ec..290f980f58 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -222,6 +222,8 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident { GID_LAURABOW2, 6, 6, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the murder, a 3rd parameter is passed by accident { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident + { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid + { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 03fe34df73286046fbb16d9ebbfc6580e206d914 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 02:46:06 +0000 Subject: SCI: Fix bug #3035033 - ISLANDBRAIN demo: Crash The demo needs the "init" selector so that the workaround for the full game will also work in the demo. svn-id: r51343 --- engines/sci/engine/static_selectors.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 85089e74c8..c3eb7d17b9 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -168,6 +168,13 @@ Common::StringArray Kernel::checkStaticSelectorNames() { names[274] = "syncTime"; names[275] = "syncCue"; + } else if (g_sci->getGameId() == GID_ISLANDBRAIN) { + // The demo of Island of Dr. Brain needs the init selector set to match up with the full + // game's workaround. + if (names.size() < 111) + names.resize(111); + + names[110] = "init"; } #ifdef ENABLE_SCI32 -- cgit v1.2.3 From 8312feec502255b329f827edb46b3f2998c4a631 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 08:08:04 +0000 Subject: SCI: Fixed bug #3034567, "KQ6CD: Crash on taking piece of paper from spider web" svn-id: r51347 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 290f980f58..eb13fd06a4 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -134,6 +134,7 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = { const SciWorkaroundEntry kDoSoundFade_workarounds[] = { { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object + { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 6c36c06f7aacb3fc2f1993f8f98039f817d795ba Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 08:27:32 +0000 Subject: SCI: Fixed game script bug #3034985, "LB1: Crash on Intro" svn-id: r51348 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index eb13fd06a4..6bb8877a05 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -81,6 +81,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room -- cgit v1.2.3 From 3da0c0794f151084f7552708c35beb92bd2f3725 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 08:43:10 +0000 Subject: SCI: Fixed bug #3035149, "Camelot: Crash at launch" svn-id: r51349 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 6bb8877a05..ac3c2ac7a8 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -133,6 +133,7 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDoSoundFade_workarounds[] = { + { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object -- cgit v1.2.3 From 4fb7b0657048cc3a368258cd4ca2f922fd888eeb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 09:17:57 +0000 Subject: SCI: translating nsRect back to actual plane coordinate on scrollable planes svn-id: r51350 --- engines/sci/graphics/frameout.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index c498262038..cea398250b 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -420,6 +420,8 @@ void GfxFrameout::kernelFrameout() { view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX, itemEntry->scaleY, itemEntry->celRect); Common::Rect nsRect = itemEntry->celRect; + // Translate back to actual coordinate within scrollable plane + nsRect.translate(planeOffsetX, 0); switch (getSciVersion()) { case SCI_VERSION_2: if (view->isSci2Hires()) { -- cgit v1.2.3 From 35ecdd59ad9befbb9e6611160a9996055dbba07e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 09:38:04 +0000 Subject: SCI: adding workaround for sq1-spanish svn-id: r51353 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ac3c2ac7a8..174a337c42 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -96,6 +96,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin -- cgit v1.2.3 From 742a226312a8d4f31705a65bdd3c960ae007e8b3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 09:40:29 +0000 Subject: SCI: Fixed bug #3035057 - "ECOQUEST demo: Crashing menu". EcoQuest 1 demo is using an in between SCI1-SCI1.1 interpreter. It's SCI1.1, but it calls kNewWindow with the SCI1 semantics. svn-id: r51354 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 400bbfc5d2..e8e691a0ff 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -393,7 +393,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(NewWindow), SIG_SCIALL, SIGFOR_MAC, ".*", NULL, NULL }, { MAP_CALL(NewWindow), SIG_SCI0, SIGFOR_ALL, "iiii[r0]i(i)(i)(i)", NULL, NULL }, { MAP_CALL(NewWindow), SIG_SCI1, SIGFOR_ALL, "iiii[ir]i(i)(i)([ir])(i)(i)(i)(i)", NULL, NULL }, - { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, NULL }, + { MAP_CALL(NewWindow), SIG_SCI11, SIGFOR_ALL, "iiiiiiii[r0]i(i)(i)(i)", NULL, kNewWindow_workarounds }, { MAP_CALL(NextNode), SIG_EVERYWHERE, "n", NULL, NULL }, { MAP_CALL(NodeValue), SIG_EVERYWHERE, "[n0]", NULL, NULL }, { MAP_CALL(NumCels), SIG_EVERYWHERE, "o", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 174a337c42..b13a458402 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -201,6 +201,12 @@ const SciWorkaroundEntry kMemory_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kNewWindow_workarounds[] = { + { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call. + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 8496be36f6..22358bf4bb 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -84,6 +84,7 @@ extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; extern const SciWorkaroundEntry kIsObject_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; +extern const SciWorkaroundEntry kNewWindow_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; -- cgit v1.2.3 From 6ff286c1f40fea7b7db92b44f45a8f3b31d53dc3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 09:55:43 +0000 Subject: SCI: fixing workaround from r51353 svn-id: r51355 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b13a458402..d58c4754fd 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -96,7 +96,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory - { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin -- cgit v1.2.3 From 14c059100c1505d2aedcea781c07756c9b5bcf30 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 10:00:17 +0000 Subject: SCI: Fixed script bug #3034610 - "KQ6CD: Crash in endgame (short path)", and removed a relevant TODO svn-id: r51356 --- engines/sci/engine/kernel_tables.h | 3 +-- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index e8e691a0ff..904bfa6ab3 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -351,8 +351,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, { MAP_CALL(GameIsRestarting), SIG_EVERYWHERE, "(i)", NULL, NULL }, - { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, NULL }, - // ^^ FIXME - occasionally KQ6 passes a 5th argument by mistake + { MAP_CALL(GetAngle), SIG_EVERYWHERE, "iiii", NULL, kGetAngle_workarounds }, { MAP_CALL(GetCWD), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(GetDistance), SIG_EVERYWHERE, "ii(i)(i)(i)(i)", NULL, NULL }, { MAP_CALL(GetEvent), SIG_SCIALL, SIGFOR_MAC, "io(i*)", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index d58c4754fd..b79fd9b114 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -141,6 +141,12 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGetAngle_workarounds[] = { + { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 22358bf4bb..3009bf4156 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -76,6 +76,7 @@ extern const SciWorkaroundEntry kAbs_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; +extern const SciWorkaroundEntry kGetAngle_workarounds[]; extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; extern const SciWorkaroundEntry kGraphSaveBox_workarounds[]; extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; -- cgit v1.2.3 From d6aed46c3a07f4a5a51ec77115764902c5d63e82 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Tue, 27 Jul 2010 10:10:49 +0000 Subject: SCI: Complete the workaround commited in r51355. svn-id: r51357 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b79fd9b114..f8fb297f43 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -97,6 +97,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin -- cgit v1.2.3 From d4774577251908e2a71cde67fc9704b2f9c6fcaf Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Tue, 27 Jul 2010 10:20:38 +0000 Subject: SCI: Fix indentation and alignment of some entries svn-id: r51358 --- engines/sci/engine/workarounds.cpp | 232 ++++++++++++++++++------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index f8fb297f43..6e3f0b2e10 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -34,206 +34,206 @@ namespace Sci { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeDivWorkarounds[] = { - { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeOrWorkarounds[] = { - { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call, index, workaround const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { - { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease - { GID_LSL6HIRES, 360,64938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + { GID_LSL6HIRES, 360,64938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking - { GID_GK2, -1, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts - { GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game - { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts - { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu - { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 - { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon - { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game + { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK2, -1, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts + { GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game + { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts + { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu + { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 + { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon + { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game { GID_JONES, 1, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends { GID_JONES, 1, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends - { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast - { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle - { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts + { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio + { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room + { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast + { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle + { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet - { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { WORKAROUND_FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { WORKAROUND_FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { WORKAROUND_FAKE, 0 } }, // see above - { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory - { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class - { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup - { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area - { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game - { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory - { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad - { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad - { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser - { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) - { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin - { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller - { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts - { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu - { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet + { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory + { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class + { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup + { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area + { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game + { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad + { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser + { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) + { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin + { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts + { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu + { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kAbs_workarounds[] = { - { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers - { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers - { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers + { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers + { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { - { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object - { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object - { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object + { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object + { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisposeScript_workarounds[] = { - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object - { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object - { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object + { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object + { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - SCI_WORKAROUNDENTRY_TERMINATOR + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDoSoundFade_workarounds[] = { { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) - { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 - { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object + { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - SCI_WORKAROUNDENTRY_TERMINATOR + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGetAngle_workarounds[] = { - { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { - { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter - { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when ordering beer, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter + { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when ordering beer, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { - { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter - { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above - { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution) - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter + { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack + { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above + { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution) + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphRestoreBox_workarounds[] = { - { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below - { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time - // ^^ TODO: check, if this is really a script error or an issue with our restore code - { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LSL6, -1, 85, 0, "rScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 85, 0, "lScroller", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring (sometimes), same as the one below + { GID_LSL6, -1, 86, 0, "LL6Inv", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when restoring, is called with hunk segment, but hunk is not allocated at that time + // ^^ TODO: check, if this is really a script error or an issue with our restore code + { GID_LSL6, -1, 86, 0, "LL6Inv", "hide", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens during the game, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[] = { - { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LSL6, -1, 0, 0, "LSL6", "hideControls", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // happens when giving the bungee key to merrily (room 240) and at least in room 650 too - gets called with additional 5th parameter + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphFillBoxAny_workarounds[] = { - { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_SQ4, -1, 818, 0, "iconTextSwitch", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // game menu "text/speech" display - parameter 5 is missing, but the right color number is on the stack + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { - { GID_SQ4, 405, 405, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified - { GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified - { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified - { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified - { GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_SQ4, 405, 405, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, 406, 406, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified + { GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - SCI_WORKAROUNDENTRY_TERMINATOR + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kMemory_workarounds[] = { - { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train, talking to Mr. Augustini, etc. - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train, talking to Mr. Augustini, etc. + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kNewWindow_workarounds[] = { - { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call. - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call. + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { - { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { - { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters - SCI_WORKAROUNDENTRY_TERMINATOR + { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { - { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference - { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error + { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference + { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident @@ -241,14 +241,14 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - SCI_WORKAROUNDENTRY_TERMINATOR + SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kStrCpy_workarounds[] = { // seems not to be needed, because the signature was wrong - //{ GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle - SCI_WORKAROUNDENTRY_TERMINATOR + //{ GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle + SCI_WORKAROUNDENTRY_TERMINATOR }; SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { -- cgit v1.2.3 From a50d9dea91cf4e8c5b9b012a2884132eb5979fae Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 10:22:41 +0000 Subject: SCI: Added room number for the KQ6 script workaround during the ending svn-id: r51359 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 6e3f0b2e10..2237b25ee3 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -144,7 +144,7 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGetAngle_workarounds[] = { - { GID_KQ6, -1, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. + { GID_KQ6, 740, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From eef7417487a657b14fa1204a009556bbb6e1c295 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Tue, 27 Jul 2010 10:40:14 +0000 Subject: TEENAGENT: Sort the object files alphabetically. svn-id: r51360 --- engines/teenagent/module.mk | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/engines/teenagent/module.mk b/engines/teenagent/module.mk index 2c04c99376..01ba3c79cb 100644 --- a/engines/teenagent/module.mk +++ b/engines/teenagent/module.mk @@ -1,23 +1,23 @@ MODULE := engines/teenagent MODULE_OBJS := \ + actor.o \ + animation.o \ + callbacks.o \ + console.o \ detection.o \ - teenagent.o \ - resources.o \ + dialog.o \ + font.o \ + inventory.o \ + music.o \ + objects.o \ pack.o \ - segment.o \ + resources.o \ scene.o \ - animation.o \ - font.o \ + segment.o \ surface.o \ surface_list.o \ - actor.o \ - callbacks.o \ - inventory.o \ - objects.o \ - music.o \ - console.o \ - dialog.o + teenagent.o # This module can be built as a plugin ifeq ($(ENABLE_TEENAGENT), DYNAMIC_PLUGIN) -- cgit v1.2.3 From 114f4dfb0a1b9bea16ec51fc3d0cc866779f3c44 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 11:11:47 +0000 Subject: SCI: adding scaling code in kBaseSetter and fixing palVary timer crash when exiting engine during palVary processing svn-id: r51361 --- engines/sci/graphics/compare.cpp | 37 +++++++++++++++++++++++++++---------- engines/sci/graphics/palette.cpp | 2 ++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 46ccd84e7f..9eda688a64 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -229,21 +229,38 @@ void GfxCompare::kernelBaseSetter(reg_t object) { if (viewId == 0xFFFF) // invalid view return; - GfxView *tmpView = _cache->getView(viewId); + uint16 scaleSignal = 0; + if (getSciVersion() >= SCI_VERSION_1_1) { + scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)) & kScaleSignalDoScaling; + if (scaleSignal) { + int16 scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); + if (scaleY < 64) + scaleSignal = 0; + } + } + Common::Rect celRect; - if (tmpView->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(y, x); + if (!scaleSignal) { + GfxView *tmpView = _cache->getView(viewId); + if (tmpView->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(y, x); - tmpView->getCelRect(loopNo, celNo, x, y, z, celRect); + tmpView->getCelRect(loopNo, celNo, x, y, z, celRect); - if (tmpView->isSci2Hires()) { - _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); - _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); - } + if (tmpView->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); + _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + } - celRect.bottom = y + 1; - celRect.top = celRect.bottom - yStep; + celRect.bottom = y + 1; + celRect.top = celRect.bottom - yStep; + } else { + celRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft)); + celRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight)); + celRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop)); + celRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom)); + } writeSelectorValue(_segMan, object, SELECTOR(brLeft), celRect.left); writeSelectorValue(_segMan, object, SELECTOR(brRight), celRect.right); diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 73689fe3b2..00d59c7b92 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -72,6 +72,8 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMergi } GfxPalette::~GfxPalette() { + if (_palVaryResourceId != -1) + palVaryRemoveTimer(); } bool GfxPalette::isMerging() { -- cgit v1.2.3 From d508ba67663c3150d2c7052cf568234e8739bdfb Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Tue, 27 Jul 2010 11:16:44 +0000 Subject: Remove Android themeengine patch - an improved version is now part of the main ScummVM codebase thanks to fingolfin :) svn-id: r51362 --- backends/platform/android/README.build | 4 - .../android/scummvm-android-themeengine.patch | 135 --------------------- 2 files changed, 139 deletions(-) delete mode 100644 backends/platform/android/scummvm-android-themeengine.patch diff --git a/backends/platform/android/README.build b/backends/platform/android/README.build index 3d1cf433a7..1c407bd469 100644 --- a/backends/platform/android/README.build +++ b/backends/platform/android/README.build @@ -67,10 +67,6 @@ toolchains around. Building ScummVM ================ -Apply the theme engine patch: - - patch -p1 < backends/platform/android/scummvm-android-themeengine.patch - (Optionally) compress scummmodern.zip: (ScummVM usually ships it uncompressed, but Android can read it more efficiently if it is compressed *before* adding it to the apk) diff --git a/backends/platform/android/scummvm-android-themeengine.patch b/backends/platform/android/scummvm-android-themeengine.patch deleted file mode 100644 index 1eafe7fb62..0000000000 --- a/backends/platform/android/scummvm-android-themeengine.patch +++ /dev/null @@ -1,135 +0,0 @@ -diff -r 884e66fd1b9c gui/ThemeEngine.cpp ---- a/gui/ThemeEngine.cpp Tue Apr 13 09:30:52 2010 +1000 -+++ b/gui/ThemeEngine.cpp Fri May 28 23:24:43 2010 +1000 -@@ -390,21 +390,19 @@ - - // Try to create a Common::Archive with the files of the theme. - if (!_themeArchive && !_themeFile.empty()) { -- Common::FSNode node(_themeFile); -- if (node.getName().hasSuffix(".zip") && !node.isDirectory()) { -+ Common::ArchiveMemberPtr member = SearchMan.getMember(_themeFile); -+ if (member && member->getName().hasSuffix(".zip")) { - #ifdef USE_ZLIB -- Common::Archive *zipArchive = Common::makeZipArchive(node); -+ Common::Archive *zipArchive = Common::makeZipArchive(member->createReadStream()); - - if (!zipArchive) { -- warning("Failed to open Zip archive '%s'.", node.getPath().c_str()); -+ warning("Failed to open Zip archive '%s'.", member->getDisplayName().c_str()); - } - _themeArchive = zipArchive; - #else - warning("Trying to load theme '%s' in a Zip archive without zLib support", _themeFile.c_str()); - return false; - #endif -- } else if (node.isDirectory()) { -- _themeArchive = new Common::FSDirectory(node); - } - } - -@@ -1436,6 +1434,30 @@ - return tok.empty(); - } - -+bool ThemeEngine::themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName) { -+ Common::File stream; -+ bool foundHeader = false; -+ -+ if (member.getName().hasSuffix(".zip")) { -+#ifdef USE_ZLIB -+ Common::Archive *zipArchive = Common::makeZipArchive(member.createReadStream()); -+ -+ if (zipArchive && zipArchive->hasFile("THEMERC")) { -+ stream.open("THEMERC", *zipArchive); -+ } -+ -+ delete zipArchive; -+#endif -+ } -+ -+ if (stream.isOpen()) { -+ Common::String stxHeader = stream.readLine(); -+ foundHeader = themeConfigParseHeader(stxHeader, themeName); -+ } -+ -+ return foundHeader; -+} -+ - bool ThemeEngine::themeConfigUsable(const Common::FSNode &node, Common::String &themeName) { - Common::File stream; - bool foundHeader = false; -@@ -1493,10 +1515,6 @@ - if (ConfMan.hasKey("themepath")) - listUsableThemes(Common::FSNode(ConfMan.get("themepath")), list); - --#ifdef DATA_PATH -- listUsableThemes(Common::FSNode(DATA_PATH), list); --#endif -- - #if defined(MACOSX) || defined(IPHONE) - CFURLRef resourceUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); - if (resourceUrl) { -@@ -1509,10 +1527,7 @@ - } - #endif - -- if (ConfMan.hasKey("extrapath")) -- listUsableThemes(Common::FSNode(ConfMan.get("extrapath")), list); -- -- listUsableThemes(Common::FSNode("."), list, 1); -+ listUsableThemes(SearchMan, list); - - // Now we need to strip all duplicates - // TODO: It might not be the best idea to strip duplicates. The user might -@@ -1531,6 +1546,34 @@ - output.clear(); - } - -+void ThemeEngine::listUsableThemes(Common::Archive &archive, Common::List &list) { -+ ThemeDescriptor td; -+ -+#ifdef USE_ZLIB -+ Common::ArchiveMemberList fileList; -+ archive.listMatchingMembers(fileList, "*.zip"); -+ for (Common::ArchiveMemberList::iterator i = fileList.begin(); -+ i != fileList.end(); ++i) { -+ td.name.clear(); -+ if (themeConfigUsable(**i, td.name)) { -+ td.filename = (*i)->getName(); -+ td.id = (*i)->getDisplayName(); -+ -+ // If the name of the node object also contains -+ // the ".zip" suffix, we will strip it. -+ if (td.id.hasSuffix(".zip")) { -+ for (int j = 0; j < 4; ++j) -+ td.id.deleteLastChar(); -+ } -+ -+ list.push_back(td); -+ } -+ } -+ -+ fileList.clear(); -+#endif -+} -+ - void ThemeEngine::listUsableThemes(const Common::FSNode &node, Common::List &list, int depth) { - if (!node.exists() || !node.isReadable() || !node.isDirectory()) - return; -diff -r 884e66fd1b9c gui/ThemeEngine.h ---- a/gui/ThemeEngine.h Tue Apr 13 09:30:52 2010 +1000 -+++ b/gui/ThemeEngine.h Fri May 28 23:24:43 2010 +1000 -@@ -560,11 +560,13 @@ - static void listUsableThemes(Common::List &list); - private: - static bool themeConfigUsable(const Common::FSNode &node, Common::String &themeName); -+ static bool themeConfigUsable(const Common::ArchiveMember &member, Common::String &themeName); - static bool themeConfigParseHeader(Common::String header, Common::String &themeName); - - static Common::String getThemeFile(const Common::String &id); - static Common::String getThemeId(const Common::String &filename); - static void listUsableThemes(const Common::FSNode &node, Common::List &list, int depth = -1); -+ static void listUsableThemes(Common::Archive &archive, Common::List &list); - - protected: - OSystem *_system; /** Global system object. */ -- cgit v1.2.3 From d013be51e535ff05b2f3f54c448b50b655bceaf3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 11:18:51 +0000 Subject: SCI: reverting part of r51361 breaks qfg3 right after intro svn-id: r51363 --- engines/sci/graphics/compare.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 9eda688a64..0a186115d0 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -229,19 +229,20 @@ void GfxCompare::kernelBaseSetter(reg_t object) { if (viewId == 0xFFFF) // invalid view return; - uint16 scaleSignal = 0; - if (getSciVersion() >= SCI_VERSION_1_1) { - scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)) & kScaleSignalDoScaling; - if (scaleSignal) { - int16 scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); - if (scaleY < 64) - scaleSignal = 0; - } - } + // must be something wrong with this TODO check - currently it breaks qfg3 right after the intro + //uint16 scaleSignal = 0; + //if (getSciVersion() >= SCI_VERSION_1_1) { + // scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)) & kScaleSignalDoScaling; + // if (scaleSignal) { + // int16 scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); + // if (scaleY < 64) + // scaleSignal = 0; + // } + //} Common::Rect celRect; - if (!scaleSignal) { + //if (!scaleSignal) { GfxView *tmpView = _cache->getView(viewId); if (tmpView->isSci2Hires()) _screen->adjustToUpscaledCoordinates(y, x); @@ -255,12 +256,12 @@ void GfxCompare::kernelBaseSetter(reg_t object) { celRect.bottom = y + 1; celRect.top = celRect.bottom - yStep; - } else { - celRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft)); - celRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight)); - celRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop)); - celRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom)); - } + //} else { + // celRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft)); + // celRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight)); + // celRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop)); + // celRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom)); + //} writeSelectorValue(_segMan, object, SELECTOR(brLeft), celRect.left); writeSelectorValue(_segMan, object, SELECTOR(brRight), celRect.right); -- cgit v1.2.3 From 601fe8ee7d5c2bffdc117ee6ff97d2d2df373d6c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 11:38:24 +0000 Subject: SCI: adding workaround for qfg3 (kIsObject) svn-id: r51364 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 2237b25ee3..fdcafc51bc 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -199,6 +199,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") + { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 2db4e71b6693f47f2fc48c78e8cff5e570c1f8d1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 27 Jul 2010 13:01:10 +0000 Subject: ALSA: Simplify device querying code. Thanks to eriktorbjorn for some quick testing. svn-id: r51366 --- backends/midi/alsa.cpp | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index a895ef8b80..1f7f7d2ba3 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -314,46 +314,41 @@ AlsaDevices AlsaMusicPlugin::getAlsaDevices() const { MusicDevices AlsaMusicPlugin::getDevices() const { MusicDevices devices; - Common::Array used; AlsaDevices::iterator d; - int i; AlsaDevices alsaDevices = getAlsaDevices(); - for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { - used.push_back(false); - } - // Since the default behaviour is to use the first device in the list, // try to put something sensible there. We used to have 17:0 and 65:0 // as defaults. - for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { - int client = d->getClient(); + for (d = alsaDevices.begin(); d != alsaDevices.end();) { + const int client = d->getClient(); + if (client == 17 || client == 65) { devices.push_back(MusicDevice(this, d->getName(), d->getType())); - used[i] = true; + d = alsaDevices.erase(d); + } else { + ++d; } } // 128:0 is probably TiMidity, or something like that, so that's // probably a good second choice. - for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { + for (d = alsaDevices.begin(); d != alsaDevices.end();) { if (d->getClient() == 128) { devices.push_back(MusicDevice(this, d->getName(), d->getType())); - used[i] = true; + d = alsaDevices.erase(d); + } else { + ++d; } } // Add the remaining devices in the order they were found. - for (i = 0, d = alsaDevices.begin(); d != alsaDevices.end(); ++i, ++d) { - - if (!used[i]) { - devices.push_back(MusicDevice(this, d->getName(), d->getType())); - } - } + for (d = alsaDevices.begin(); d != alsaDevices.end(); ++d) + devices.push_back(MusicDevice(this, d->getName(), d->getType())); return devices; } -- cgit v1.2.3 From 6925518143332099fcaf86bbab9f446063d206cb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 13:06:52 +0000 Subject: SCI: Fixed bug #3035068 - "LB2CD: Crash in first room, asking about burglary" svn-id: r51367 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fdcafc51bc..3db0f1df4a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -83,6 +83,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club -- cgit v1.2.3 From 93e8daec20c45bfaee3422480fe85cadbd844436 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 27 Jul 2010 13:25:35 +0000 Subject: KYRA: Formatting. svn-id: r51368 --- engines/kyra/script_tim.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp index 4ec6e7f349..20bc8abec5 100644 --- a/engines/kyra/script_tim.cpp +++ b/engines/kyra/script_tim.cpp @@ -159,7 +159,7 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Arrayopcodes = opcodes; IFFParser iff(*stream); - Common::Functor1Mem< Common::IFFChunk &, bool, TIMInterpreter > c(this, &TIMInterpreter::callback); + Common::Functor1Mem c(this, &TIMInterpreter::callback); iff.parse(c); if (!_tim->avtl) @@ -170,7 +170,7 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Arrayfunc[i].avtl = _tim->avtl + _tim->avtl[i]; -- cgit v1.2.3 From 596e10bb42c8b83802759ea272acb5af13df0d18 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 13:31:28 +0000 Subject: SCI: Fix PCjr sound svn-id: r51369 --- engines/sci/sound/music.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 8908d022df..64a94ee510 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -65,7 +65,7 @@ void SciMusic::init() { // Default to MIDI in SCI2.1+ games, as many don't have AdLib support. Common::Platform platform = g_sci->getPlatform(); - uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2_1) ? (MDT_PCSPK | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_ADLIB | MDT_MIDI)); + uint32 dev = MidiDriver::detectDevice((getSciVersion() >= SCI_VERSION_2_1) ? (MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI | MDT_PREFER_GM) : (MDT_PCSPK | MDT_PCJR | MDT_ADLIB | MDT_MIDI)); switch (MidiDriver::getMusicType(dev)) { case MT_ADLIB: -- cgit v1.2.3 From bdf4ed9abb45225bacfc6b9a4a3212000a706957 Mon Sep 17 00:00:00 2001 From: Oystein Eftevaag Date: Tue, 27 Jul 2010 14:31:33 +0000 Subject: Updated xcode project svn-id: r51370 --- dists/iphone/icon-72.png | Bin 5668 -> 9695 bytes dists/iphone/scummvm.xcodeproj/project.pbxproj | 302 ++++++++++++------------- 2 files changed, 151 insertions(+), 151 deletions(-) diff --git a/dists/iphone/icon-72.png b/dists/iphone/icon-72.png index d8820f3397..9b424b4018 100644 Binary files a/dists/iphone/icon-72.png and b/dists/iphone/icon-72.png differ diff --git a/dists/iphone/scummvm.xcodeproj/project.pbxproj b/dists/iphone/scummvm.xcodeproj/project.pbxproj index 032470cf25..5512318918 100755 --- a/dists/iphone/scummvm.xcodeproj/project.pbxproj +++ b/dists/iphone/scummvm.xcodeproj/project.pbxproj @@ -782,7 +782,6 @@ DF0941C20F63CB26002D821E /* staticres.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFD0D0F4870E50006E566 /* staticres.cpp */; }; DF0941C30F63CB26002D821E /* tucker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFD0E0F4870E50006E566 /* tucker.cpp */; }; DF0941C40F63CB26002D821E /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301A0F48AF18005EF03C /* detection.cpp */; }; - DF0941C50F63CB26002D821E /* game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301D0F48AF18005EF03C /* game.cpp */; }; DF0941C60F63CB26002D821E /* gc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301E0F48AF18005EF03C /* gc.cpp */; }; DF0941C80F63CB26002D821E /* kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830230F48AF18005EF03C /* kernel.cpp */; }; DF0941C90F63CB26002D821E /* kevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830260F48AF18005EF03C /* kevent.cpp */; }; @@ -960,7 +959,6 @@ DF45B1CE116628A5009B85CC /* coordadjuster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B17E116628A5009B85CC /* coordadjuster.cpp */; }; DF45B1CF116628A5009B85CC /* cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B180116628A5009B85CC /* cursor.cpp */; }; DF45B1D0116628A5009B85CC /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B182116628A5009B85CC /* font.cpp */; }; - DF45B1D2116628A5009B85CC /* gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B186116628A5009B85CC /* gui.cpp */; }; DF45B1D4116628A5009B85CC /* menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18B116628A5009B85CC /* menu.cpp */; }; DF45B1D5116628A5009B85CC /* paint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18D116628A5009B85CC /* paint.cpp */; }; DF45B1D6116628A5009B85CC /* paint16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18F116628A5009B85CC /* paint16.cpp */; }; @@ -979,13 +977,9 @@ DF45B1E4116628A5009B85CC /* vocabulary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1A9116628A5009B85CC /* vocabulary.cpp */; }; DF45B1E5116628A5009B85CC /* audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AC116628A5009B85CC /* audio.cpp */; }; DF45B1E6116628A5009B85CC /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AF116628A5009B85CC /* adlib.cpp */; }; - DF45B1E7116628A5009B85CC /* amiga.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B0116628A5009B85CC /* amiga.cpp */; }; DF45B1E8116628A5009B85CC /* fb01.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B1116628A5009B85CC /* fb01.cpp */; }; DF45B1E9116628A5009B85CC /* midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B3116628A5009B85CC /* midi.cpp */; }; DF45B1EA116628A5009B85CC /* pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B5116628A5009B85CC /* pcjr.cpp */; }; - DF45B1EB116628A5009B85CC /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B7116628A5009B85CC /* core.cpp */; }; - DF45B1EC116628A5009B85CC /* iterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B9116628A5009B85CC /* iterator.cpp */; }; - DF45B1ED116628A5009B85CC /* songlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BC116628A5009B85CC /* songlib.cpp */; }; DF45B1EF116628A5009B85CC /* midiparser_sci.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BF116628A5009B85CC /* midiparser_sci.cpp */; }; DF45B1F0116628A5009B85CC /* music.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C1116628A5009B85CC /* music.cpp */; }; DF45B1F1116628A5009B85CC /* soundcmd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C3116628A5009B85CC /* soundcmd.cpp */; }; @@ -998,7 +992,6 @@ DF45B1F8116628A5009B85CC /* coordadjuster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B17E116628A5009B85CC /* coordadjuster.cpp */; }; DF45B1F9116628A5009B85CC /* cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B180116628A5009B85CC /* cursor.cpp */; }; DF45B1FA116628A5009B85CC /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B182116628A5009B85CC /* font.cpp */; }; - DF45B1FC116628A5009B85CC /* gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B186116628A5009B85CC /* gui.cpp */; }; DF45B1FE116628A5009B85CC /* menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18B116628A5009B85CC /* menu.cpp */; }; DF45B1FF116628A5009B85CC /* paint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18D116628A5009B85CC /* paint.cpp */; }; DF45B200116628A5009B85CC /* paint16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18F116628A5009B85CC /* paint16.cpp */; }; @@ -1017,13 +1010,9 @@ DF45B20E116628A5009B85CC /* vocabulary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1A9116628A5009B85CC /* vocabulary.cpp */; }; DF45B20F116628A5009B85CC /* audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AC116628A5009B85CC /* audio.cpp */; }; DF45B210116628A5009B85CC /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AF116628A5009B85CC /* adlib.cpp */; }; - DF45B211116628A5009B85CC /* amiga.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B0116628A5009B85CC /* amiga.cpp */; }; DF45B212116628A5009B85CC /* fb01.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B1116628A5009B85CC /* fb01.cpp */; }; DF45B213116628A5009B85CC /* midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B3116628A5009B85CC /* midi.cpp */; }; DF45B214116628A5009B85CC /* pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B5116628A5009B85CC /* pcjr.cpp */; }; - DF45B215116628A5009B85CC /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B7116628A5009B85CC /* core.cpp */; }; - DF45B216116628A5009B85CC /* iterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B9116628A5009B85CC /* iterator.cpp */; }; - DF45B217116628A5009B85CC /* songlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BC116628A5009B85CC /* songlib.cpp */; }; DF45B219116628A5009B85CC /* midiparser_sci.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BF116628A5009B85CC /* midiparser_sci.cpp */; }; DF45B21A116628A5009B85CC /* music.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C1116628A5009B85CC /* music.cpp */; }; DF45B21B116628A5009B85CC /* soundcmd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C3116628A5009B85CC /* soundcmd.cpp */; }; @@ -1036,7 +1025,6 @@ DF45B222116628A5009B85CC /* coordadjuster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B17E116628A5009B85CC /* coordadjuster.cpp */; }; DF45B223116628A5009B85CC /* cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B180116628A5009B85CC /* cursor.cpp */; }; DF45B224116628A5009B85CC /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B182116628A5009B85CC /* font.cpp */; }; - DF45B226116628A5009B85CC /* gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B186116628A5009B85CC /* gui.cpp */; }; DF45B228116628A5009B85CC /* menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18B116628A5009B85CC /* menu.cpp */; }; DF45B229116628A5009B85CC /* paint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18D116628A5009B85CC /* paint.cpp */; }; DF45B22A116628A5009B85CC /* paint16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B18F116628A5009B85CC /* paint16.cpp */; }; @@ -1055,13 +1043,9 @@ DF45B238116628A5009B85CC /* vocabulary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1A9116628A5009B85CC /* vocabulary.cpp */; }; DF45B239116628A5009B85CC /* audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AC116628A5009B85CC /* audio.cpp */; }; DF45B23A116628A5009B85CC /* adlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1AF116628A5009B85CC /* adlib.cpp */; }; - DF45B23B116628A5009B85CC /* amiga.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B0116628A5009B85CC /* amiga.cpp */; }; DF45B23C116628A5009B85CC /* fb01.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B1116628A5009B85CC /* fb01.cpp */; }; DF45B23D116628A5009B85CC /* midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B3116628A5009B85CC /* midi.cpp */; }; DF45B23E116628A5009B85CC /* pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B5116628A5009B85CC /* pcjr.cpp */; }; - DF45B23F116628A5009B85CC /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B7116628A5009B85CC /* core.cpp */; }; - DF45B240116628A5009B85CC /* iterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1B9116628A5009B85CC /* iterator.cpp */; }; - DF45B241116628A5009B85CC /* songlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BC116628A5009B85CC /* songlib.cpp */; }; DF45B243116628A5009B85CC /* midiparser_sci.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1BF116628A5009B85CC /* midiparser_sci.cpp */; }; DF45B244116628A5009B85CC /* music.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C1116628A5009B85CC /* music.cpp */; }; DF45B245116628A5009B85CC /* soundcmd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF45B1C3116628A5009B85CC /* soundcmd.cpp */; }; @@ -1249,6 +1233,45 @@ DF7E8C110ED5FCC2001CB19F /* xmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8C0F0ED5FCC2001CB19F /* xmlparser.cpp */; }; DF7E8C530ED60067001CB19F /* game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7E8C510ED60067001CB19F /* game.cpp */; }; DF7E8C810ED60271001CB19F /* scummmodern.zip in Resources */ = {isa = PBXBuildFile; fileRef = DF7E8C7A0ED601E5001CB19F /* scummmodern.zip */; }; + DF7F285D11FF23B700159131 /* frameout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F285C11FF23B700159131 /* frameout.cpp */; }; + DF7F285E11FF23B700159131 /* frameout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F285C11FF23B700159131 /* frameout.cpp */; }; + DF7F285F11FF23B700159131 /* frameout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F285C11FF23B700159131 /* frameout.cpp */; }; + DF7F286111FF23D500159131 /* amigamac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286011FF23D500159131 /* amigamac.cpp */; }; + DF7F286211FF23D500159131 /* amigamac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286011FF23D500159131 /* amigamac.cpp */; }; + DF7F286311FF23D500159131 /* amigamac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286011FF23D500159131 /* amigamac.cpp */; }; + DF7F286711FF23EF00159131 /* kvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286411FF23EF00159131 /* kvideo.cpp */; }; + DF7F286811FF23EF00159131 /* workarounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286511FF23EF00159131 /* workarounds.cpp */; }; + DF7F286911FF23EF00159131 /* kvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286411FF23EF00159131 /* kvideo.cpp */; }; + DF7F286A11FF23EF00159131 /* workarounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286511FF23EF00159131 /* workarounds.cpp */; }; + DF7F286B11FF23EF00159131 /* kvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286411FF23EF00159131 /* kvideo.cpp */; }; + DF7F286C11FF23EF00159131 /* workarounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F286511FF23EF00159131 /* workarounds.cpp */; }; + DF7F287A11FF243B00159131 /* sound_2gs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287011FF243A00159131 /* sound_2gs.cpp */; }; + DF7F287B11FF243B00159131 /* sound_coco3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287211FF243B00159131 /* sound_coco3.cpp */; }; + DF7F287C11FF243B00159131 /* sound_midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287411FF243B00159131 /* sound_midi.cpp */; }; + DF7F287D11FF243B00159131 /* sound_pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287611FF243B00159131 /* sound_pcjr.cpp */; }; + DF7F287E11FF243B00159131 /* sound_sarien.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287811FF243B00159131 /* sound_sarien.cpp */; }; + DF7F287F11FF243B00159131 /* sound_2gs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287011FF243A00159131 /* sound_2gs.cpp */; }; + DF7F288011FF243B00159131 /* sound_coco3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287211FF243B00159131 /* sound_coco3.cpp */; }; + DF7F288111FF243B00159131 /* sound_midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287411FF243B00159131 /* sound_midi.cpp */; }; + DF7F288211FF243B00159131 /* sound_pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287611FF243B00159131 /* sound_pcjr.cpp */; }; + DF7F288311FF243B00159131 /* sound_sarien.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287811FF243B00159131 /* sound_sarien.cpp */; }; + DF7F288411FF243B00159131 /* sound_2gs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287011FF243A00159131 /* sound_2gs.cpp */; }; + DF7F288511FF243B00159131 /* sound_coco3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287211FF243B00159131 /* sound_coco3.cpp */; }; + DF7F288611FF243B00159131 /* sound_midi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287411FF243B00159131 /* sound_midi.cpp */; }; + DF7F288711FF243B00159131 /* sound_pcjr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287611FF243B00159131 /* sound_pcjr.cpp */; }; + DF7F288811FF243B00159131 /* sound_sarien.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F287811FF243B00159131 /* sound_sarien.cpp */; }; + DF7F288B11FF244F00159131 /* Tooltip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F288911FF244F00159131 /* Tooltip.cpp */; }; + DF7F288C11FF244F00159131 /* Tooltip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F288911FF244F00159131 /* Tooltip.cpp */; }; + DF7F288D11FF244F00159131 /* Tooltip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F288911FF244F00159131 /* Tooltip.cpp */; }; + DF7F289311FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; + DF7F289511FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; + DF7F289711FF247300159131 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289111FF247300159131 /* translation.cpp */; }; + DF7F28A011FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; + DF7F28A111FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; + DF7F28A211FF24B000159131 /* mac_snd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F289E11FF24B000159131 /* mac_snd.cpp */; }; + DF7F28A511FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; + DF7F28A611FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; + DF7F28A711FF24C400159131 /* console.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF7F28A311FF24C400159131 /* console.cpp */; }; DF841FDD0E7BA61800F5680E /* iphone_keyboard.m in Sources */ = {isa = PBXBuildFile; fileRef = DF841FD90E7BA61800F5680E /* iphone_keyboard.m */; }; DF841FDE0E7BA61800F5680E /* iphone_video.m in Sources */ = {isa = PBXBuildFile; fileRef = DF841FDB0E7BA61800F5680E /* iphone_video.m */; }; DF84250A0E7BA6AC00F5680E /* agi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF841FF70E7BA6A600F5680E /* agi.cpp */; }; @@ -1881,11 +1904,8 @@ DF89C2880F62D55C00D756B6 /* sprites_lol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2870F62D55C00D756B6 /* sprites_lol.cpp */; }; DF89C2A40F62D79E00D756B6 /* script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2A30F62D79E00D756B6 /* script.cpp */; }; DF89C2BB0F62D91000D756B6 /* timestamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF89C2B80F62D91000D756B6 /* timestamp.cpp */; }; - DF90E9BE10AEDA9B00C8F93F /* kernel32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BC10AEDA9B00C8F93F /* kernel32.cpp */; }; DF90E9BF10AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; - DF90E9C010AEDA9B00C8F93F /* kernel32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BC10AEDA9B00C8F93F /* kernel32.cpp */; }; DF90E9C110AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; - DF90E9C210AEDA9B00C8F93F /* kernel32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BC10AEDA9B00C8F93F /* kernel32.cpp */; }; DF90E9C310AEDA9B00C8F93F /* selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90E9BD10AEDA9B00C8F93F /* selector.cpp */; }; DF90EAA410B0234300C8F93F /* draw_playtoons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAA310B0234300C8F93F /* draw_playtoons.cpp */; }; DF90EAA510B0234300C8F93F /* draw_playtoons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF90EAA310B0234300C8F93F /* draw_playtoons.cpp */; }; @@ -1941,7 +1961,6 @@ DFB0579911B7549C0015AE65 /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0579611B7549C0015AE65 /* cinepak.cpp */; }; DFB0579A11B7549C0015AE65 /* cinepak.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB0579611B7549C0015AE65 /* cinepak.cpp */; }; DFC831210F48AF19005EF03C /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301A0F48AF18005EF03C /* detection.cpp */; }; - DFC831230F48AF19005EF03C /* game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301D0F48AF18005EF03C /* game.cpp */; }; DFC831240F48AF19005EF03C /* gc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301E0F48AF18005EF03C /* gc.cpp */; }; DFC831270F48AF19005EF03C /* kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830230F48AF18005EF03C /* kernel.cpp */; }; DFC831280F48AF19005EF03C /* kevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830260F48AF18005EF03C /* kevent.cpp */; }; @@ -2868,7 +2887,6 @@ DFF95C560FB22D5700A3EC78 /* staticres.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFD0D0F4870E50006E566 /* staticres.cpp */; }; DFF95C570FB22D5700A3EC78 /* tucker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF2FFD0E0F4870E50006E566 /* tucker.cpp */; }; DFF95C580FB22D5700A3EC78 /* detection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301A0F48AF18005EF03C /* detection.cpp */; }; - DFF95C590FB22D5700A3EC78 /* game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301D0F48AF18005EF03C /* game.cpp */; }; DFF95C5A0FB22D5700A3EC78 /* gc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC8301E0F48AF18005EF03C /* gc.cpp */; }; DFF95C5C0FB22D5700A3EC78 /* kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830230F48AF18005EF03C /* kernel.cpp */; }; DFF95C5D0FB22D5700A3EC78 /* kevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFC830260F48AF18005EF03C /* kevent.cpp */; }; @@ -3125,9 +3143,6 @@ DF45B182116628A5009B85CC /* font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = font.cpp; sourceTree = ""; }; DF45B183116628A5009B85CC /* font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font.h; sourceTree = ""; }; DF45B185116628A5009B85CC /* frameout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frameout.h; sourceTree = ""; }; - DF45B186116628A5009B85CC /* gui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gui.cpp; sourceTree = ""; }; - DF45B187116628A5009B85CC /* gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui.h; sourceTree = ""; }; - DF45B189116628A5009B85CC /* gui32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gui32.h; sourceTree = ""; }; DF45B18A116628A5009B85CC /* helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helpers.h; sourceTree = ""; }; DF45B18B116628A5009B85CC /* menu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = menu.cpp; sourceTree = ""; }; DF45B18C116628A5009B85CC /* menu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = menu.h; sourceTree = ""; }; @@ -3162,19 +3177,11 @@ DF45B1AC116628A5009B85CC /* audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio.cpp; sourceTree = ""; }; DF45B1AD116628A5009B85CC /* audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio.h; sourceTree = ""; }; DF45B1AF116628A5009B85CC /* adlib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = adlib.cpp; sourceTree = ""; }; - DF45B1B0116628A5009B85CC /* amiga.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = amiga.cpp; sourceTree = ""; }; DF45B1B1116628A5009B85CC /* fb01.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fb01.cpp; sourceTree = ""; }; DF45B1B2116628A5009B85CC /* map-mt32-to-gm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-mt32-to-gm.h"; sourceTree = ""; }; DF45B1B3116628A5009B85CC /* midi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = midi.cpp; sourceTree = ""; }; DF45B1B4116628A5009B85CC /* mididriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mididriver.h; sourceTree = ""; }; DF45B1B5116628A5009B85CC /* pcjr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pcjr.cpp; sourceTree = ""; }; - DF45B1B7116628A5009B85CC /* core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core.cpp; sourceTree = ""; }; - DF45B1B8116628A5009B85CC /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; - DF45B1B9116628A5009B85CC /* iterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iterator.cpp; sourceTree = ""; }; - DF45B1BA116628A5009B85CC /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = ""; }; - DF45B1BB116628A5009B85CC /* iterator_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator_internal.h; sourceTree = ""; }; - DF45B1BC116628A5009B85CC /* songlib.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = songlib.cpp; sourceTree = ""; }; - DF45B1BD116628A5009B85CC /* songlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = songlib.h; sourceTree = ""; }; DF45B1BF116628A5009B85CC /* midiparser_sci.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = midiparser_sci.cpp; sourceTree = ""; }; DF45B1C0116628A5009B85CC /* midiparser_sci.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = midiparser_sci.h; sourceTree = ""; }; DF45B1C1116628A5009B85CC /* music.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = music.cpp; sourceTree = ""; }; @@ -3308,6 +3315,29 @@ DF7E8C510ED60067001CB19F /* game.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game.cpp; sourceTree = ""; }; DF7E8C520ED60067001CB19F /* game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = ""; }; DF7E8C7A0ED601E5001CB19F /* scummmodern.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = scummmodern.zip; sourceTree = ""; }; + DF7F285C11FF23B700159131 /* frameout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frameout.cpp; sourceTree = ""; }; + DF7F286011FF23D500159131 /* amigamac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = amigamac.cpp; sourceTree = ""; }; + DF7F286411FF23EF00159131 /* kvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kvideo.cpp; sourceTree = ""; }; + DF7F286511FF23EF00159131 /* workarounds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = workarounds.cpp; sourceTree = ""; }; + DF7F286611FF23EF00159131 /* workarounds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = workarounds.h; sourceTree = ""; }; + DF7F286F11FF243A00159131 /* detection_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = detection_tables.h; sourceTree = ""; }; + DF7F287011FF243A00159131 /* sound_2gs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound_2gs.cpp; sourceTree = ""; }; + DF7F287111FF243A00159131 /* sound_2gs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound_2gs.h; sourceTree = ""; }; + DF7F287211FF243B00159131 /* sound_coco3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound_coco3.cpp; sourceTree = ""; }; + DF7F287311FF243B00159131 /* sound_coco3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound_coco3.h; sourceTree = ""; }; + DF7F287411FF243B00159131 /* sound_midi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound_midi.cpp; sourceTree = ""; }; + DF7F287511FF243B00159131 /* sound_midi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound_midi.h; sourceTree = ""; }; + DF7F287611FF243B00159131 /* sound_pcjr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound_pcjr.cpp; sourceTree = ""; }; + DF7F287711FF243B00159131 /* sound_pcjr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound_pcjr.h; sourceTree = ""; }; + DF7F287811FF243B00159131 /* sound_sarien.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound_sarien.cpp; sourceTree = ""; }; + DF7F287911FF243B00159131 /* sound_sarien.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound_sarien.h; sourceTree = ""; }; + DF7F288911FF244F00159131 /* Tooltip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tooltip.cpp; sourceTree = ""; }; + DF7F288A11FF244F00159131 /* Tooltip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tooltip.h; sourceTree = ""; }; + DF7F289111FF247300159131 /* translation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = translation.cpp; sourceTree = ""; }; + DF7F289E11FF24B000159131 /* mac_snd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mac_snd.cpp; sourceTree = ""; }; + DF7F289F11FF24B000159131 /* mac_snd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mac_snd.h; sourceTree = ""; }; + DF7F28A311FF24C400159131 /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; + DF7F28A411FF24C400159131 /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; DF841FD90E7BA61800F5680E /* iphone_keyboard.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = iphone_keyboard.m; sourceTree = ""; }; DF841FDA0E7BA61800F5680E /* iphone_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iphone_video.h; sourceTree = ""; }; DF841FDB0E7BA61800F5680E /* iphone_video.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = iphone_video.m; sourceTree = ""; }; @@ -4358,7 +4388,6 @@ DF89C2B80F62D91000D756B6 /* timestamp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timestamp.cpp; sourceTree = ""; }; DF89C2B90F62D91000D756B6 /* timestamp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timestamp.h; sourceTree = ""; }; DF90E9B410AEDA5300C8F93F /* detection_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = detection_tables.h; sourceTree = ""; }; - DF90E9BC10AEDA9B00C8F93F /* kernel32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kernel32.cpp; sourceTree = ""; }; DF90E9BD10AEDA9B00C8F93F /* selector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = selector.cpp; sourceTree = ""; }; DF90EAA310B0234300C8F93F /* draw_playtoons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = draw_playtoons.cpp; sourceTree = ""; }; DF90EAAB10B0236F00C8F93F /* staticres.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = staticres.cpp; sourceTree = ""; }; @@ -4399,11 +4428,9 @@ DFB0579611B7549C0015AE65 /* cinepak.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cinepak.cpp; sourceTree = ""; }; DFB0579711B7549C0015AE65 /* cinepak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cinepak.h; sourceTree = ""; }; DFC8301A0F48AF18005EF03C /* detection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = detection.cpp; sourceTree = ""; }; - DFC8301D0F48AF18005EF03C /* game.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game.cpp; sourceTree = ""; }; DFC8301E0F48AF18005EF03C /* gc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gc.cpp; sourceTree = ""; }; DFC8301F0F48AF18005EF03C /* gc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gc.h; sourceTree = ""; }; DFC830230F48AF18005EF03C /* kernel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kernel.cpp; sourceTree = ""; }; - DFC830250F48AF18005EF03C /* kernel_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_types.h; sourceTree = ""; }; DFC830260F48AF18005EF03C /* kevent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kevent.cpp; sourceTree = ""; }; DFC830270F48AF18005EF03C /* kfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kfile.cpp; sourceTree = ""; }; DFC830280F48AF18005EF03C /* kgraphics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kgraphics.cpp; sourceTree = ""; }; @@ -4444,9 +4471,7 @@ DFD518AA0DF34BA600854012 /* 2xsai.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xsai.cpp; sourceTree = ""; }; DFD518AB0DF34BA600854012 /* aspect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = aspect.cpp; sourceTree = ""; }; DFD518AD0DF34BA600854012 /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; - DFD518AE0DF34BA600854012 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq2x.h; sourceTree = ""; }; DFD518B10DF34BA600854012 /* hq3x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq3x.cpp; sourceTree = ""; }; - DFD518B20DF34BA600854012 /* hq3x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hq3x.h; sourceTree = ""; }; DFD518B50DF34BA600854012 /* scale2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scale2x.cpp; sourceTree = ""; }; DFD518B60DF34BA600854012 /* scale2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale2x.h; sourceTree = ""; }; DFD518B80DF34BA600854012 /* scale3x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scale3x.cpp; sourceTree = ""; }; @@ -4550,7 +4575,7 @@ DFE4778A0D81F4E900B6D1FB /* about.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = about.h; sourceTree = ""; }; DFE4778B0D81F4E900B6D1FB /* Actions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Actions.cpp; sourceTree = ""; }; DFE4778C0D81F4E900B6D1FB /* Actions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Actions.h; sourceTree = ""; }; - DFE4778D0D81F4E900B6D1FB /* browser.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = browser.cpp; sourceTree = ""; }; + DFE4778D0D81F4E900B6D1FB /* browser.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; path = browser.cpp; sourceTree = ""; }; DFE4778E0D81F4E900B6D1FB /* browser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser.h; sourceTree = ""; }; DFE4778F0D81F4E900B6D1FB /* chooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chooser.cpp; sourceTree = ""; }; DFE477900D81F4E900B6D1FB /* chooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chooser.h; sourceTree = ""; }; @@ -4901,6 +4926,8 @@ DF45B0EB116627D9009B85CC /* decoders */ = { isa = PBXGroup; children = ( + DF7F289E11FF24B000159131 /* mac_snd.cpp */, + DF7F289F11FF24B000159131 /* mac_snd.h */, DF45B0F7116627DA009B85CC /* adpcm.cpp */, DF45B0F8116627DA009B85CC /* adpcm.h */, DF45B0FA116627DA009B85CC /* aiff.cpp */, @@ -4928,6 +4955,7 @@ DF45B175116628A5009B85CC /* graphics */ = { isa = PBXGroup; children = ( + DF7F285C11FF23B700159131 /* frameout.cpp */, DFB0578811B754570015AE65 /* maciconbar.cpp */, DFB0578911B754570015AE65 /* maciconbar.h */, DF9B924F118E46A00069C19D /* fontsjis.cpp */, @@ -4947,9 +4975,6 @@ DF45B182116628A5009B85CC /* font.cpp */, DF45B183116628A5009B85CC /* font.h */, DF45B185116628A5009B85CC /* frameout.h */, - DF45B186116628A5009B85CC /* gui.cpp */, - DF45B187116628A5009B85CC /* gui.h */, - DF45B189116628A5009B85CC /* gui32.h */, DF45B18A116628A5009B85CC /* helpers.h */, DF45B18B116628A5009B85CC /* menu.cpp */, DF45B18C116628A5009B85CC /* menu.h */, @@ -5012,8 +5037,8 @@ DF45B1AE116628A5009B85CC /* drivers */ = { isa = PBXGroup; children = ( + DF7F286011FF23D500159131 /* amigamac.cpp */, DF45B1AF116628A5009B85CC /* adlib.cpp */, - DF45B1B0116628A5009B85CC /* amiga.cpp */, DF45B1B1116628A5009B85CC /* fb01.cpp */, DF45B1B2116628A5009B85CC /* map-mt32-to-gm.h */, DF45B1B3116628A5009B85CC /* midi.cpp */, @@ -5026,13 +5051,6 @@ DF45B1B6116628A5009B85CC /* iterator */ = { isa = PBXGroup; children = ( - DF45B1B7116628A5009B85CC /* core.cpp */, - DF45B1B8116628A5009B85CC /* core.h */, - DF45B1B9116628A5009B85CC /* iterator.cpp */, - DF45B1BA116628A5009B85CC /* iterator.h */, - DF45B1BB116628A5009B85CC /* iterator_internal.h */, - DF45B1BC116628A5009B85CC /* songlib.cpp */, - DF45B1BD116628A5009B85CC /* songlib.h */, ); path = iterator; sourceTree = ""; @@ -5128,6 +5146,17 @@ DF841FF60E7BA6A600F5680E /* agi */ = { isa = PBXGroup; children = ( + DF7F286F11FF243A00159131 /* detection_tables.h */, + DF7F287011FF243A00159131 /* sound_2gs.cpp */, + DF7F287111FF243A00159131 /* sound_2gs.h */, + DF7F287211FF243B00159131 /* sound_coco3.cpp */, + DF7F287311FF243B00159131 /* sound_coco3.h */, + DF7F287411FF243B00159131 /* sound_midi.cpp */, + DF7F287511FF243B00159131 /* sound_midi.h */, + DF7F287611FF243B00159131 /* sound_pcjr.cpp */, + DF7F287711FF243B00159131 /* sound_pcjr.h */, + DF7F287811FF243B00159131 /* sound_sarien.cpp */, + DF7F287911FF243B00159131 /* sound_sarien.h */, DF841FF70E7BA6A600F5680E /* agi.cpp */, DF841FF80E7BA6A600F5680E /* agi.h */, DF841FF90E7BA6A600F5680E /* checks.cpp */, @@ -5366,6 +5395,8 @@ DF8421040E7BA6A700F5680E /* drascula */ = { isa = PBXGroup; children = ( + DF7F28A311FF24C400159131 /* console.cpp */, + DF7F28A411FF24C400159131 /* console.h */, DFCDC6F611662AAB00A7D2A0 /* resource.cpp */, DF8421050E7BA6A700F5680E /* actors.cpp */, DF8421060E7BA6A700F5680E /* animation.cpp */, @@ -6490,11 +6521,13 @@ DFC8301B0F48AF18005EF03C /* engine */ = { isa = PBXGroup; children = ( + DF7F286411FF23EF00159131 /* kvideo.cpp */, + DF7F286511FF23EF00159131 /* workarounds.cpp */, + DF7F286611FF23EF00159131 /* workarounds.h */, DFCDC6D5116629CE00A7D2A0 /* features.cpp */, DFCDC6D6116629CE00A7D2A0 /* features.h */, DFCDC6D7116629CE00A7D2A0 /* kparse.cpp */, DFCDC6D8116629CE00A7D2A0 /* selector.h */, - DF90E9BC10AEDA9B00C8F93F /* kernel32.cpp */, DF90E9BD10AEDA9B00C8F93F /* selector.cpp */, DF7585F6100CB75800CC3324 /* static_selectors.cpp */, DF6118380FE3A8080042AD3F /* kmisc.cpp */, @@ -6509,11 +6542,9 @@ DF573C020F5A81EA00961A72 /* state.h */, DF573C030F5A81EA00961A72 /* vm.h */, DF573C040F5A81EA00961A72 /* vm_types.h */, - DFC8301D0F48AF18005EF03C /* game.cpp */, DFC8301E0F48AF18005EF03C /* gc.cpp */, DFC8301F0F48AF18005EF03C /* gc.h */, DFC830230F48AF18005EF03C /* kernel.cpp */, - DFC830250F48AF18005EF03C /* kernel_types.h */, DFC830260F48AF18005EF03C /* kevent.cpp */, DFC830270F48AF18005EF03C /* kfile.cpp */, DFC830280F48AF18005EF03C /* kgraphics.cpp */, @@ -6542,9 +6573,7 @@ DFD518AA0DF34BA600854012 /* 2xsai.cpp */, DFD518AB0DF34BA600854012 /* aspect.cpp */, DFD518AD0DF34BA600854012 /* hq2x.cpp */, - DFD518AE0DF34BA600854012 /* hq2x.h */, DFD518B10DF34BA600854012 /* hq3x.cpp */, - DFD518B20DF34BA600854012 /* hq3x.h */, DFD518B50DF34BA600854012 /* scale2x.cpp */, DFD518B60DF34BA600854012 /* scale2x.h */, DFD518B80DF34BA600854012 /* scale3x.cpp */, @@ -6736,6 +6765,7 @@ DFE473950D81F4E800B6D1FB /* common */ = { isa = PBXGroup; children = ( + DF7F289111FF247300159131 /* translation.cpp */, DFB0577311B753DA0015AE65 /* debug-channels.h */, DFB0577411B753DA0015AE65 /* rational.cpp */, DFB0577511B753DA0015AE65 /* rational.h */, @@ -6877,6 +6907,8 @@ DFE477880D81F4E900B6D1FB /* gui */ = { isa = PBXGroup; children = ( + DF7F288911FF244F00159131 /* Tooltip.cpp */, + DF7F288A11FF244F00159131 /* Tooltip.h */, DF9B9246118E46730069C19D /* error.cpp */, DF9B9247118E46730069C19D /* error.h */, DF2EC3E410E6490800765801 /* browser_osx.mm */, @@ -7937,7 +7969,6 @@ DF2FFD170F4870E50006E566 /* staticres.cpp in Sources */, DF2FFD180F4870E50006E566 /* tucker.cpp in Sources */, DFC831210F48AF19005EF03C /* detection.cpp in Sources */, - DFC831230F48AF19005EF03C /* game.cpp in Sources */, DFC831240F48AF19005EF03C /* gc.cpp in Sources */, DFC831270F48AF19005EF03C /* kernel.cpp in Sources */, DFC831280F48AF19005EF03C /* kevent.cpp in Sources */, @@ -8035,7 +8066,6 @@ DF6BF4FF10529F140069811F /* EventRecorder.cpp in Sources */, DF6BF50810529F540069811F /* maxtrax.cpp in Sources */, DF6BF50910529F540069811F /* tfmx.cpp in Sources */, - DF90E9C210AEDA9B00C8F93F /* kernel32.cpp in Sources */, DF90E9C310AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA610B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAF10B0236F00C8F93F /* staticres.cpp in Sources */, @@ -8066,7 +8096,6 @@ DF45B1CE116628A5009B85CC /* coordadjuster.cpp in Sources */, DF45B1CF116628A5009B85CC /* cursor.cpp in Sources */, DF45B1D0116628A5009B85CC /* font.cpp in Sources */, - DF45B1D2116628A5009B85CC /* gui.cpp in Sources */, DF45B1D4116628A5009B85CC /* menu.cpp in Sources */, DF45B1D5116628A5009B85CC /* paint.cpp in Sources */, DF45B1D6116628A5009B85CC /* paint16.cpp in Sources */, @@ -8085,13 +8114,9 @@ DF45B1E4116628A5009B85CC /* vocabulary.cpp in Sources */, DF45B1E5116628A5009B85CC /* audio.cpp in Sources */, DF45B1E6116628A5009B85CC /* adlib.cpp in Sources */, - DF45B1E7116628A5009B85CC /* amiga.cpp in Sources */, DF45B1E8116628A5009B85CC /* fb01.cpp in Sources */, DF45B1E9116628A5009B85CC /* midi.cpp in Sources */, DF45B1EA116628A5009B85CC /* pcjr.cpp in Sources */, - DF45B1EB116628A5009B85CC /* core.cpp in Sources */, - DF45B1EC116628A5009B85CC /* iterator.cpp in Sources */, - DF45B1ED116628A5009B85CC /* songlib.cpp in Sources */, DF45B1EF116628A5009B85CC /* midiparser_sci.cpp in Sources */, DF45B1F0116628A5009B85CC /* music.cpp in Sources */, DF45B1F1116628A5009B85CC /* soundcmd.cpp in Sources */, @@ -8119,6 +8144,19 @@ DFB0578B11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579211B7547D0015AE65 /* pict.cpp in Sources */, DFB0579911B7549C0015AE65 /* cinepak.cpp in Sources */, + DF7F285E11FF23B700159131 /* frameout.cpp in Sources */, + DF7F286211FF23D500159131 /* amigamac.cpp in Sources */, + DF7F286911FF23EF00159131 /* kvideo.cpp in Sources */, + DF7F286A11FF23EF00159131 /* workarounds.cpp in Sources */, + DF7F287F11FF243B00159131 /* sound_2gs.cpp in Sources */, + DF7F288011FF243B00159131 /* sound_coco3.cpp in Sources */, + DF7F288111FF243B00159131 /* sound_midi.cpp in Sources */, + DF7F288211FF243B00159131 /* sound_pcjr.cpp in Sources */, + DF7F288311FF243B00159131 /* sound_sarien.cpp in Sources */, + DF7F288C11FF244F00159131 /* Tooltip.cpp in Sources */, + DF7F289511FF247300159131 /* translation.cpp in Sources */, + DF7F28A111FF24B000159131 /* mac_snd.cpp in Sources */, + DF7F28A611FF24C400159131 /* console.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -8892,7 +8930,6 @@ DF0941C20F63CB26002D821E /* staticres.cpp in Sources */, DF0941C30F63CB26002D821E /* tucker.cpp in Sources */, DF0941C40F63CB26002D821E /* detection.cpp in Sources */, - DF0941C50F63CB26002D821E /* game.cpp in Sources */, DF0941C60F63CB26002D821E /* gc.cpp in Sources */, DF0941C80F63CB26002D821E /* kernel.cpp in Sources */, DF0941C90F63CB26002D821E /* kevent.cpp in Sources */, @@ -8993,7 +9030,6 @@ DF6BF50110529F140069811F /* EventRecorder.cpp in Sources */, DF6BF50A10529F540069811F /* maxtrax.cpp in Sources */, DF6BF50B10529F540069811F /* tfmx.cpp in Sources */, - DF90E9BE10AEDA9B00C8F93F /* kernel32.cpp in Sources */, DF90E9BF10AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA410B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAD10B0236F00C8F93F /* staticres.cpp in Sources */, @@ -9025,7 +9061,6 @@ DF45B1F8116628A5009B85CC /* coordadjuster.cpp in Sources */, DF45B1F9116628A5009B85CC /* cursor.cpp in Sources */, DF45B1FA116628A5009B85CC /* font.cpp in Sources */, - DF45B1FC116628A5009B85CC /* gui.cpp in Sources */, DF45B1FE116628A5009B85CC /* menu.cpp in Sources */, DF45B1FF116628A5009B85CC /* paint.cpp in Sources */, DF45B200116628A5009B85CC /* paint16.cpp in Sources */, @@ -9044,13 +9079,9 @@ DF45B20E116628A5009B85CC /* vocabulary.cpp in Sources */, DF45B20F116628A5009B85CC /* audio.cpp in Sources */, DF45B210116628A5009B85CC /* adlib.cpp in Sources */, - DF45B211116628A5009B85CC /* amiga.cpp in Sources */, DF45B212116628A5009B85CC /* fb01.cpp in Sources */, DF45B213116628A5009B85CC /* midi.cpp in Sources */, DF45B214116628A5009B85CC /* pcjr.cpp in Sources */, - DF45B215116628A5009B85CC /* core.cpp in Sources */, - DF45B216116628A5009B85CC /* iterator.cpp in Sources */, - DF45B217116628A5009B85CC /* songlib.cpp in Sources */, DF45B219116628A5009B85CC /* midiparser_sci.cpp in Sources */, DF45B21A116628A5009B85CC /* music.cpp in Sources */, DF45B21B116628A5009B85CC /* soundcmd.cpp in Sources */, @@ -9078,6 +9109,19 @@ DFB0578C11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579311B7547D0015AE65 /* pict.cpp in Sources */, DFB0579A11B7549C0015AE65 /* cinepak.cpp in Sources */, + DF7F285F11FF23B700159131 /* frameout.cpp in Sources */, + DF7F286311FF23D500159131 /* amigamac.cpp in Sources */, + DF7F286B11FF23EF00159131 /* kvideo.cpp in Sources */, + DF7F286C11FF23EF00159131 /* workarounds.cpp in Sources */, + DF7F288411FF243B00159131 /* sound_2gs.cpp in Sources */, + DF7F288511FF243B00159131 /* sound_coco3.cpp in Sources */, + DF7F288611FF243B00159131 /* sound_midi.cpp in Sources */, + DF7F288711FF243B00159131 /* sound_pcjr.cpp in Sources */, + DF7F288811FF243B00159131 /* sound_sarien.cpp in Sources */, + DF7F288D11FF244F00159131 /* Tooltip.cpp in Sources */, + DF7F289711FF247300159131 /* translation.cpp in Sources */, + DF7F28A211FF24B000159131 /* mac_snd.cpp in Sources */, + DF7F28A711FF24C400159131 /* console.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -9856,7 +9900,6 @@ DFF95C560FB22D5700A3EC78 /* staticres.cpp in Sources */, DFF95C570FB22D5700A3EC78 /* tucker.cpp in Sources */, DFF95C580FB22D5700A3EC78 /* detection.cpp in Sources */, - DFF95C590FB22D5700A3EC78 /* game.cpp in Sources */, DFF95C5A0FB22D5700A3EC78 /* gc.cpp in Sources */, DFF95C5C0FB22D5700A3EC78 /* kernel.cpp in Sources */, DFF95C5D0FB22D5700A3EC78 /* kevent.cpp in Sources */, @@ -9954,7 +9997,6 @@ DF6BF4FD10529F140069811F /* EventRecorder.cpp in Sources */, DF6BF50610529F540069811F /* maxtrax.cpp in Sources */, DF6BF50710529F540069811F /* tfmx.cpp in Sources */, - DF90E9C010AEDA9B00C8F93F /* kernel32.cpp in Sources */, DF90E9C110AEDA9B00C8F93F /* selector.cpp in Sources */, DF90EAA510B0234300C8F93F /* draw_playtoons.cpp in Sources */, DF90EAAE10B0236F00C8F93F /* staticres.cpp in Sources */, @@ -9985,7 +10027,6 @@ DF45B222116628A5009B85CC /* coordadjuster.cpp in Sources */, DF45B223116628A5009B85CC /* cursor.cpp in Sources */, DF45B224116628A5009B85CC /* font.cpp in Sources */, - DF45B226116628A5009B85CC /* gui.cpp in Sources */, DF45B228116628A5009B85CC /* menu.cpp in Sources */, DF45B229116628A5009B85CC /* paint.cpp in Sources */, DF45B22A116628A5009B85CC /* paint16.cpp in Sources */, @@ -10004,13 +10045,9 @@ DF45B238116628A5009B85CC /* vocabulary.cpp in Sources */, DF45B239116628A5009B85CC /* audio.cpp in Sources */, DF45B23A116628A5009B85CC /* adlib.cpp in Sources */, - DF45B23B116628A5009B85CC /* amiga.cpp in Sources */, DF45B23C116628A5009B85CC /* fb01.cpp in Sources */, DF45B23D116628A5009B85CC /* midi.cpp in Sources */, DF45B23E116628A5009B85CC /* pcjr.cpp in Sources */, - DF45B23F116628A5009B85CC /* core.cpp in Sources */, - DF45B240116628A5009B85CC /* iterator.cpp in Sources */, - DF45B241116628A5009B85CC /* songlib.cpp in Sources */, DF45B243116628A5009B85CC /* midiparser_sci.cpp in Sources */, DF45B244116628A5009B85CC /* music.cpp in Sources */, DF45B245116628A5009B85CC /* soundcmd.cpp in Sources */, @@ -10038,6 +10075,19 @@ DFB0578A11B754570015AE65 /* maciconbar.cpp in Sources */, DFB0579111B7547D0015AE65 /* pict.cpp in Sources */, DFB0579811B7549C0015AE65 /* cinepak.cpp in Sources */, + DF7F285D11FF23B700159131 /* frameout.cpp in Sources */, + DF7F286111FF23D500159131 /* amigamac.cpp in Sources */, + DF7F286711FF23EF00159131 /* kvideo.cpp in Sources */, + DF7F286811FF23EF00159131 /* workarounds.cpp in Sources */, + DF7F287A11FF243B00159131 /* sound_2gs.cpp in Sources */, + DF7F287B11FF243B00159131 /* sound_coco3.cpp in Sources */, + DF7F287C11FF243B00159131 /* sound_midi.cpp in Sources */, + DF7F287D11FF243B00159131 /* sound_pcjr.cpp in Sources */, + DF7F287E11FF243B00159131 /* sound_sarien.cpp in Sources */, + DF7F288B11FF244F00159131 /* Tooltip.cpp in Sources */, + DF7F289311FF247300159131 /* translation.cpp in Sources */, + DF7F28A011FF24B000159131 /* mac_snd.cpp in Sources */, + DF7F28A511FF24C400159131 /* console.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -10181,6 +10231,7 @@ SCUMM_LITTLE_ENDIAN, UNIX, IPHONE, + ENABLE_SCI32, ENABLE_HE, ); GCC_THUMB_SUPPORT = NO; @@ -10198,7 +10249,8 @@ PREBINDING = NO; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos3.0; + SDKROOT = iphonesimulator3.2; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; @@ -10210,6 +10262,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ""; + GCC_C_LANGUAGE_STANDARD = c99; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; GCC_INPUT_FILETYPE = automatic; @@ -10250,6 +10303,7 @@ SCUMM_LITTLE_ENDIAN, UNIX, IPHONE, + ENABLE_SCI32, ENABLE_HE, ); GCC_THUMB_SUPPORT = NO; @@ -10259,12 +10313,14 @@ ../../, ); LIBRARY_SEARCH_PATHS = ""; + ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = "-lz"; PREBINDING = NO; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos3.0; + SDKROOT = iphonesimulator3.2; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; @@ -10338,6 +10394,7 @@ "\\\"$(SRCROOT)/../../engines/m4\\\"", "\\\"$(SRCROOT)/lib\\\"", ); + ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-lSDLmain", @@ -10351,6 +10408,8 @@ ); PREBINDING = NO; PRODUCT_NAME = ScummVM; + SDKROOT = macosx10.6; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64 arm7 arm6"; }; name = Debug; }; @@ -10422,6 +10481,7 @@ "\\\"$(SRCROOT)/../../engines/m4\\\"", "\\\"$(SRCROOT)/lib\\\"", ); + ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-lSDLmain", @@ -10435,6 +10495,8 @@ ); PREBINDING = NO; PRODUCT_NAME = ScummVM; + SDKROOT = macosx10.6; + VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64 arm7 arm6"; WRAPPER_EXTENSION = app; }; name = Release; @@ -10454,43 +10516,13 @@ GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = ( - XCODE, - IPHONE_OFFICIAL, - USE_ZLIB, - SCUMMVM, - ENABLE_SCI, - ENABLE_TUCKER, - ENABLE_TOUCHE, - ENABLE_TINSEL, - ENABLE_SWORD2, - ENABLE_SWORD1, - ENABLE_SKY, - ENABLE_IHNM, - ENABLE_SAGA, - ENABLE_QUEEN, - ENABLE_PARALLACTION, - ENABLE_MADE, - ENABLE_LURE, - ENABLE_KYRA, - ENABLE_IGOR, - ENABLE_GROOVIE, - ENABLE_GOB, - ENABLE_DRASCULA, - ENABLE_CINE, - ENABLE_AGOS, - ENABLE_AGI, - ENABLE_SCUMM, - ENABLE_SCUMM_7_8, - CONFIG_H, - SCUMM_NEED_ALIGNMENT, - SCUMM_LITTLE_ENDIAN, - UNIX, - IPHONE, - ENABLE_HE, - ); GCC_THUMB_SUPPORT = NO; GCC_UNROLL_LOOPS = YES; + HEADER_SEARCH_PATHS = ( + ../../engines/, + ../../, + /opt/local/include, + ); INFOPLIST_FILE = "/Users/oystein/iphone/scummvm/dists/iphone/Info copy 2.plist"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -10499,12 +10531,11 @@ "\\\"$(SRCROOT)/../../engines/m4\\\"", "\\\"$(SRCROOT)/lib\\\"", ); - ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; PRODUCT_NAME = ScummVM; PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphonesimulator2.0; + SDKROOT = iphonesimulator3.2; }; name = Debug; }; @@ -10522,43 +10553,13 @@ GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; - GCC_PREPROCESSOR_DEFINITIONS = ( - XCODE, - IPHONE_OFFICIAL, - USE_ZLIB, - SCUMMVM, - ENABLE_SCI, - ENABLE_TUCKER, - ENABLE_TOUCHE, - ENABLE_TINSEL, - ENABLE_SWORD2, - ENABLE_SWORD1, - ENABLE_SKY, - ENABLE_IHNM, - ENABLE_SAGA, - ENABLE_QUEEN, - ENABLE_PARALLACTION, - ENABLE_MADE, - ENABLE_LURE, - ENABLE_KYRA, - ENABLE_IGOR, - ENABLE_GROOVIE, - ENABLE_GOB, - ENABLE_DRASCULA, - ENABLE_CINE, - ENABLE_AGOS, - ENABLE_AGI, - ENABLE_SCUMM, - ENABLE_SCUMM_7_8, - CONFIG_H, - SCUMM_NEED_ALIGNMENT, - SCUMM_LITTLE_ENDIAN, - UNIX, - IPHONE, - ENABLE_HE, - ); GCC_THUMB_SUPPORT = NO; GCC_UNROLL_LOOPS = YES; + HEADER_SEARCH_PATHS = ( + ../../engines/, + ../../, + /opt/local/include, + ); INFOPLIST_FILE = "/Users/oystein/iphone/scummvm/dists/iphone/Info copy 2.plist"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -10567,12 +10568,11 @@ "\\\"$(SRCROOT)/../../engines/m4\\\"", "\\\"$(SRCROOT)/lib\\\"", ); - ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; PRODUCT_NAME = ScummVM; PROVISIONING_PROFILE = "EF590570-5FAC-4346-9071-D609DE2B28D8"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphonesimulator2.0; + SDKROOT = iphonesimulator3.2; WRAPPER_EXTENSION = app; }; name = Release; -- cgit v1.2.3 From 5b686b539abe6ff876bb3479636741628fcdf11f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 14:48:22 +0000 Subject: SCI: adding workaround for sq5 entering the bridge makes the crew goof around, we are getting Osc::init with an object as cycle count svn-id: r51371 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 3db0f1df4a..4be4d56b21 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -48,6 +48,7 @@ const SciWorkaroundEntry opcodeOrWorkarounds[] = { const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease { GID_LSL6HIRES, 360,64938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease + { GID_SQ5, 200, 939, 0, "Osc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when going back to bridge the crew is goofing off, we get an object as cycle count SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From bc6baef0c0e6d952f5ac2eca2ccb1352cb9444b7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 14:51:08 +0000 Subject: SCI: Fixed bug #3035186 - "ECOQUEST2: Crash When Receiving Ecorder". Also removed the now obsolete kStringCpy workaround table. svn-id: r51372 --- engines/sci/engine/kernel_tables.h | 4 ++-- engines/sci/engine/workarounds.cpp | 13 ++++++------- engines/sci/engine/workarounds.h | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 904bfa6ab3..b684b17b02 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -346,7 +346,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(FOpen), SIG_EVERYWHERE, "ri", NULL, NULL }, { MAP_CALL(FPuts), SIG_EVERYWHERE, "ir", NULL, NULL }, { MAP_CALL(FileIO), SIG_EVERYWHERE, "i(.*)", kFileIO_subops, NULL }, - { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, NULL }, + { MAP_CALL(FindKey), SIG_EVERYWHERE, "l.", NULL, kFindKey_workarounds }, { MAP_CALL(FirstNode), SIG_EVERYWHERE, "[l0]", NULL, NULL }, { MAP_CALL(FlushResources), SIG_EVERYWHERE, "i", NULL, NULL }, { MAP_CALL(Format), SIG_EVERYWHERE, "r(.*)", NULL, NULL }, @@ -432,7 +432,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, - { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, kStrCpy_workarounds }, + { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, NULL }, { MAP_CALL(StrEnd), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(StrLen), SIG_EVERYWHERE, "[r0]", NULL, NULL }, { MAP_CALL(StrSplit), SIG_EVERYWHERE, "rr[r0]", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 4be4d56b21..794c5c78d6 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -150,6 +150,12 @@ const SciWorkaroundEntry kGetAngle_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kFindKey_workarounds[] = { + { GID_ECOQUEST2, 100, 999, 0, "myList", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When Noah Greene gives Adam the Ecorder, and just before the game gives a demonstration, a null reference to a list is passed. + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter @@ -247,13 +253,6 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -const SciWorkaroundEntry kStrCpy_workarounds[] = { - // seems not to be needed, because the signature was wrong - //{ GID_ISLANDBRAIN, 260, 45, 0, "aWord", "addOn", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Hominy Homonym puzzle - SCI_WORKAROUNDENTRY_TERMINATOR -}; - SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin) { EngineState *state = g_sci->getEngineState(); ExecStack *lastCall = state->xs; diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 3009bf4156..01c7676247 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -76,6 +76,7 @@ extern const SciWorkaroundEntry kAbs_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; +extern const SciWorkaroundEntry kFindKey_workarounds[]; extern const SciWorkaroundEntry kGetAngle_workarounds[]; extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; extern const SciWorkaroundEntry kGraphSaveBox_workarounds[]; @@ -89,7 +90,6 @@ extern const SciWorkaroundEntry kNewWindow_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; -extern const SciWorkaroundEntry kStrCpy_workarounds[]; extern SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin); -- cgit v1.2.3 From 349d3765e3e65bec4c198fe833e0ebe6e8478323 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 14:51:36 +0000 Subject: SOUND: Only dispose the input stream in makeAIFFStream if requested svn-id: r51373 --- sound/decoders/aiff.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sound/decoders/aiff.cpp b/sound/decoders/aiff.cpp index b76410f8d1..ce8c6ad32c 100644 --- a/sound/decoders/aiff.cpp +++ b/sound/decoders/aiff.cpp @@ -175,7 +175,9 @@ SeekableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, data = (byte *)malloc(size); assert(data); stream->read(data, size); - delete stream; + + if (disposeAfterUse == DisposeAfterUse::YES) + delete stream; // Since we allocated our own buffer for the data, we must specify DisposeAfterUse::YES. return makeRawStream(data, size, rate, flags); -- cgit v1.2.3 From 780cb85cce441c07540ec707e40eeef0d10e0420 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 15:10:41 +0000 Subject: SCI: Fixed bug #3035262 - "ISLANDBRAIN: Crash on "info" selection" svn-id: r51374 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 794c5c78d6..9b0db2c3fb 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -208,6 +208,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter + { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 7024991cc99bf5a964fceeae62057a1d5e501c51 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 27 Jul 2010 15:29:58 +0000 Subject: SCI: Removed the room number from the two workarounds for Hoyle 3 (Character::say) thus fixing the crash in dominoes observed in bug #3035080. Some whitespace fixes. svn-id: r51375 --- engines/sci/engine/workarounds.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 9b0db2c3fb..4f8c0184d7 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -48,7 +48,7 @@ const SciWorkaroundEntry opcodeOrWorkarounds[] = { const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease { GID_LSL6HIRES, 360,64938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease - { GID_SQ5, 200, 939, 0, "Osc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when going back to bridge the crew is goofing off, we get an object as cycle count + { GID_SQ5, 200, 939, 0, "Osc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when going back to bridge the crew is goofing off, we get an object as cycle count SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -65,8 +65,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts { GID_HOYLE1, 5, 204, 0, "tableau", "checkRuns", -1, 2, { WORKAROUND_FAKE, 0 } }, // Cribbage / during the game - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something - { GID_HOYLE3, 200, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers, first time a character says something + { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something + { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon -- cgit v1.2.3 From cf26b88e54983f8a8d73b640f817967c6fcd5d89 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 15:45:21 +0000 Subject: SCI: Fix bug #3035058 - ECOQUEST demo: Missing subtitles The demo uses a special version of kMessage to get its messages. svn-id: r51376 --- engines/sci/engine/kstring.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 3a7bb30c80..76541f78e0 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -456,7 +456,8 @@ enum kMessageFunc { K_MESSAGE_REFNOUN, K_MESSAGE_PUSH, K_MESSAGE_POP, - K_MESSAGE_LASTMESSAGE + K_MESSAGE_LASTMESSAGE, + K_MESSAGE_ECOQUEST1_DEMO = 99 }; reg_t kGetMessage(EngineState *s, int argc, reg_t *argv) { @@ -558,6 +559,18 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } + case K_MESSAGE_ECOQUEST1_DEMO: + // The EcoQuest 1 demo uses a special version of kMessage. It's one of the + // earliest SCI 1.1 games. The noun is always 99 in this case, so we can + // treat it as a subop. If any other games require this syntax, we can change + // this to work with those games too. + + if (g_sci->getGameId() != GID_ECOQUEST || !g_sci->isDemo()) + error("kMessage called with EcoQuest 1 demo syntax in a different game"); + + tuple.noun = argv[0].toUint16(); + tuple.verb = argv[2].toUint16(); + return make_reg(0, s->_msgState->getMessage(argv[1].toUint16(), tuple, argv[3])); default: warning("Message: subfunction %i invoked (not implemented)", func); } -- cgit v1.2.3 From 4fa22695908e4dae587959c70713fe119091a475 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 16:09:18 +0000 Subject: SCI: Add detection for some more EGA versions of games See bug #3035349 (MD5 Checksum for Castle of Dr. Brain - EGA), #3035350 (MD5 Checksum for Mixed-Up Fairy Tales EGA) and #3035354 (MD5 Checksum for Mixed-Up Mother Goose (1990 EGA, SCI01)) svn-id: r51377 --- engines/sci/detection_tables.h | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index ea05e49056..16535d04d0 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -83,6 +83,19 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + // Castle of Dr. Brain - English DOS Floppy EGA (from omer_mor, bug report #3035349) + {"castlebrain", "EGA", { + {"resource.map", 0, "88d106f945f7fd9d1aeda961cfec38a9", 2646}, + {"resource.000", 0, "6e125f4ce3f4f5c35f2617c7b66c6e21", 25325}, + {"resource.001", 0, "1d806162f6d3cfbe3c0135414efe6f88", 99931}, + {"resource.002", 0, "6a41a0eb5237778427dddf92ae07cf9b", 294772}, + {"resource.003", 0, "0c6ab4efb3be4d991ae9762e19f17c92", 306378}, + {"resource.004", 0, "5e7b90949422de005f80285979972e43", 292423}, + {"resource.005", 0, "8a5ed3ba96e2eaf18e36fedfaab89419", 297838}, + {"resource.006", 0, "dceed92e709cad1bd9582809a235b0a0", 266682}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Castle of Dr. Brain - English DOS Floppy (from jvprat) // Executable scanning reports "1.000.044", Floppy label reports "1.0, 10.30.91", VERSION file reports "1.000" // SCI interpreter version 1.000.510 @@ -1802,6 +1815,17 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + // Mixed-Up Fairy Tales - English DOS Floppy EGA (from omer_mor, bug report #3035350) + {"fairytales", "EGA", { + {"resource.map", 0, "daa94e9f327be6657eb97a51b490dbb1", 3219}, + {"resource.000", 0, "6dc287611e510793b72e73110bbdd45d", 17819}, + {"resource.001", 0, "5ad26e7af4d4c3a3185c66a44abd5220", 478401}, + {"resource.002", 0, "4db83250f821607b634c99d663cae74a", 663713}, + {"resource.003", 0, "509b2467ba779100d5933ed51a9ae32f", 560255}, + {"resource.004", 0, "93afc85d5ffa60ea555d6cc336d22c03", 651109}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Mixed-Up Fairy Tales v1.000 - English DOS (supplied by markcoolio in bug report #2723791) // Executable scanning reports "1.000.145" {"fairytales", "", { @@ -1835,6 +1859,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + // Mixed-Up Mother Goose - English DOS Floppy EGA (from omer_mor, bug report #3035354) + {"mothergoose", "EGA", { + {"resource.map", 0, "3490f85dab47e504c41b7eb3312e285e", 2598}, + {"resource.001", 0, "d893892d62b3f061357291d66775e360", 239906}, + {"resource.002", 0, "d893892d62b3f061357291d66775e360", 719398}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Mixed-Up Mother Goose v2.000 - English DOS Floppy (supplied by markcoolio in bug report #2723795) // Executable scanning reports "1.001.031" {"mothergoose", "", { @@ -1874,7 +1906,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Executable scanning reports "2.100.002" {"mothergoose", "", { {"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969}, - {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, + {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, #endif // ENABLE_SCI32 -- cgit v1.2.3 From 47f93e9d07e64b8746d9008afb1234744e095914 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 27 Jul 2010 16:35:28 +0000 Subject: ALSA: Tweak capability and type flags for the MIDI port This keeps ScummVM's own port from being included in the list of available MIDI devices. svn-id: r51378 --- backends/midi/alsa.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 1f7f7d2ba3..2b36cdc3cf 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -93,9 +93,14 @@ int MidiDriver_ALSA::open() { } snd_seq_set_client_group(seq_handle, "input"); - my_port = snd_seq_create_simple_port(seq_handle, "SCUMMVM port 0", - SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE | - SND_SEQ_PORT_CAP_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC); + // According to http://www.alsa-project.org/~tiwai/alsa-subs.html + // you can set read or write capabilities to allow other clients to + // read or write the port. I don't think we need that, unless maybe + // to be able to record the sound, but I can't get that to work even + // with those capabilities. + + my_port = snd_seq_create_simple_port(seq_handle, "SCUMMVM port 0", 0, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION); if (my_port < 0) { snd_seq_close(seq_handle); -- cgit v1.2.3 From 7424d39a980848e9c6783aae039aae28a4fa2b5a Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Tue, 27 Jul 2010 17:14:33 +0000 Subject: GOB: Respect mute option on startup (bug #3032781) svn-id: r51379 --- engines/gob/gob.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index ddeac25baa..f904c8c802 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -126,8 +126,13 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst) { _pauseStart = 0; // Setup mixer - _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); + bool muteSFX = ConfMan.getBool("mute") || ConfMan.getBool("sfx_mute"); + bool muteMusic = ConfMan.getBool("mute") || ConfMan.getBool("music_mute"); + + _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, + muteSFX ? 0 : ConfMan.getInt("sfx_volume")); + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, + muteMusic ? 0 : ConfMan.getInt("music_volume")); _copyProtection = ConfMan.getBool("copy_protection"); -- cgit v1.2.3 From bbd3f0dbb3f76417237882ae8dfe5acfab73b50b Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 27 Jul 2010 17:18:02 +0000 Subject: ALSA: Be more intelligent when picking MIDI port Often, a client has more than one available port. Pick the first one that isn't already in use. For instance, on my computer client 17 is the "Emu10k1 WaveTable", and it has four available ports. If, say, aplaymidi is already playing on port 17:0, ScummVM will use port 17:1 instead. Otherwise the two programs will mess up each others instruments and controller settings. Of course, in reality I doubt that anyone will run two different MIDI playing applications at once. svn-id: r51380 --- backends/midi/alsa.cpp | 76 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 2b36cdc3cf..4f73d7384b 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -48,6 +48,17 @@ #define my_snd_seq_open(seqp) snd_seq_open(seqp, SND_SEQ_OPEN) #endif +#define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) + +static int check_permission(snd_seq_port_info_t *pinfo) +{ + if (perm_ok(pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE)) { + if (!(snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_NO_EXPORT)) + return 1; + } + return 0; +} + /* * parse address string */ @@ -109,7 +120,41 @@ int MidiDriver_ALSA::open() { } if (seq_client != SND_SEQ_ADDRESS_SUBSCRIBERS) { - // subscribe to MIDI port + // Subscribe to MIDI port. Prefer one that doesn't already have + // any connections, unless we've forced a port number already. + if (seq_port == -1) { + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + + snd_seq_get_any_client_info(seq_handle, seq_client, cinfo); + + int first_port = -1; + int found_port = -1; + + snd_seq_port_info_set_client(pinfo, seq_client); + snd_seq_port_info_set_port(pinfo, -1); + while (found_port == -1 && snd_seq_query_next_port(seq_handle, pinfo) >= 0) { + if (check_permission(pinfo)) { + if (first_port == -1) + first_port = snd_seq_port_info_get_port(pinfo); + if (found_port == -1 && snd_seq_port_info_get_write_use(pinfo) == 0) + found_port = snd_seq_port_info_get_port(pinfo); + } + } + + if (found_port == -1) { + // Should we abort here? For now, use the first + // available port. + seq_port = first_port; + warning("MidiDriver_ALSA: All ports on client %d (%s) are already in use", seq_client, snd_seq_client_info_get_name(cinfo)); + } else { + seq_port = found_port; + } + } + if (snd_seq_connect_to(seq_handle, my_port, seq_client, seq_port) < 0) { error("Can't subscribe to MIDI port (%d:%d) see README for help", seq_client, seq_port); } @@ -217,23 +262,21 @@ void MidiDriver_ALSA::send_event(int do_flush) { class AlsaDevice { public: - AlsaDevice(Common::String name, MusicType mt, int client, int port); + AlsaDevice(Common::String name, MusicType mt, int client); Common::String getName(); MusicType getType(); int getClient(); - int getPort(); private: Common::String _name; MusicType _type; int _client; - int _port; }; typedef Common::List AlsaDevices; -AlsaDevice::AlsaDevice(Common::String name, MusicType mt, int client, int port) - : _name(name), _type(mt), _client(client), _port(port) { +AlsaDevice::AlsaDevice(Common::String name, MusicType mt, int client) + : _name(name), _type(mt), _client(client) { } Common::String AlsaDevice::getName() { @@ -248,10 +291,6 @@ int AlsaDevice::getClient() { return _client; } -int AlsaDevice::getPort() { - return _port; -} - class AlsaMusicPlugin : public MusicPluginObject { public: const char *getName() const { @@ -270,17 +309,6 @@ private: static int parse_addr(const char *arg, int *client, int *port); }; -#define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) - -static int check_permission(snd_seq_port_info_t *pinfo) -{ - if (perm_ok(pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE)) { - if (!(snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_NO_EXPORT)) - return 1; - } - return 0; -} - AlsaDevices AlsaMusicPlugin::getAlsaDevices() const { AlsaDevices devices; snd_seq_t *seq_handle; @@ -306,9 +334,7 @@ AlsaDevices AlsaMusicPlugin::getAlsaDevices() const { // TODO: Can we figure out the appropriate music type? MusicType type = MT_GM; int client = snd_seq_client_info_get_client(cinfo); - int port = snd_seq_port_info_get_port(pinfo); - - devices.push_back(AlsaDevice(name, type, client, port)); + devices.push_back(AlsaDevice(name, type, client)); } } } @@ -395,7 +421,7 @@ Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDrive if (device.getCompleteId().equals(MidiDriver::getDeviceString(dev, MidiDriver::kDeviceId))) { found = true; seq_client = d->getClient(); - seq_port = d->getPort(); + seq_port = -1; break; } } -- cgit v1.2.3 From c422e39bf8caa0e95b3202e444cc0190d4708248 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 17:51:44 +0000 Subject: SCI: implemented kPalette(save/restore) svn-id: r51381 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kgraphics.cpp | 6 +++--- engines/sci/engine/savegame.cpp | 16 ++++++++++++++-- engines/sci/graphics/helpers.h | 15 --------------- engines/sci/graphics/palette.cpp | 36 ++++++++++++++++++++++++++++++++++++ engines/sci/graphics/palette.h | 3 +++ 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index b684b17b02..ca4c8754a1 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -215,7 +215,7 @@ static const SciKernelMapSubEntry kPalette_subops[] = { { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, { SIG_SCIALL, 7, MAP_CALL(PaletteSave), "", NULL }, - { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "i", NULL }, + { SIG_SCIALL, 8, MAP_CALL(PaletteRestore), "[r0]", NULL }, SCI_SUBOPENTRY_TERMINATOR }; diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 78fb78d42c..56518f10bf 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -616,16 +616,16 @@ reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv) { reg_t kPaletteSave(EngineState *s, int argc, reg_t *argv) { if (g_sci->getResMan()->isVGA()) { - warning("kPalette(7), save palette to heap STUB"); + return g_sci->_gfxPalette->kernelSave(); } return NULL_REG; } reg_t kPaletteRestore(EngineState *s, int argc, reg_t *argv) { if (g_sci->getResMan()->isVGA()) { - warning("kPalette(8), restore palette from heap STUB"); + g_sci->_gfxPalette->kernelRestore(argv[0]); } - return s->r_acc; + return argv[0]; } reg_t kPalVary(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 3de555cad3..806c8893b4 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -563,6 +563,18 @@ void StringTable::saveLoadWithSerializer(Common::Serializer &ser) { } #endif +void GfxPalette::palVarySaveLoadPalette(Common::Serializer &s, Palette *palette) { + s.syncBytes(palette->mapping, 256); + s.syncAsUint32LE(palette->timestamp); + for (int i = 0; i < 256; i++) { + s.syncAsByte(palette->colors[i].used); + s.syncAsByte(palette->colors[i].r); + s.syncAsByte(palette->colors[i].g); + s.syncAsByte(palette->colors[i].b); + } + s.syncBytes(palette->intensity, 256); +} + void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { if (s.getVersion() < 24) return; @@ -572,8 +584,8 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_palVaryResourceId); if (_palVaryResourceId != -1) { - _palVaryOriginPalette.saveLoadWithSerializer(s); - _palVaryTargetPalette.saveLoadWithSerializer(s); + palVarySaveLoadPalette(s, &_palVaryOriginPalette); + palVarySaveLoadPalette(s, &_palVaryTargetPalette); s.syncAsSint16LE(_palVaryStep); s.syncAsSint16LE(_palVaryStepStop); s.syncAsSint16LE(_palVaryDirection); diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h index 115a4c996e..8f26ca296b 100644 --- a/engines/sci/graphics/helpers.h +++ b/engines/sci/graphics/helpers.h @@ -83,13 +83,6 @@ struct Window : public Port { struct Color { byte used; byte r, g, b; - - void saveLoadWithSerializer(Common::Serializer &s) { - s.syncAsByte(used); - s.syncAsByte(r); - s.syncAsByte(g); - s.syncAsByte(b); - } }; struct Palette { @@ -97,14 +90,6 @@ struct Palette { uint32 timestamp; Color colors[256]; byte intensity[256]; - - void saveLoadWithSerializer(Common::Serializer &s) { - s.syncBytes(mapping, 256); - s.syncAsUint32LE(timestamp); - for (int i = 0; i < 256; i++) - colors[i].saveLoadWithSerializer(s); - s.syncBytes(intensity, 256); - } }; struct PalSchedule { diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 00d59c7b92..5c17f76558 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -488,6 +488,42 @@ void GfxPalette::kernelAnimateSet() { setOnScreen(); } +reg_t GfxPalette::kernelSave() { + SegManager *segMan = g_sci->getEngineState()->_segMan; + reg_t memoryId = segMan->allocateHunkEntry("kPalette(save)", 1024); + byte *memoryPtr = segMan->getHunkPointer(memoryId); + if (memoryPtr) { + for (int colorNr = 0; colorNr < 256; colorNr++) { + *memoryPtr++ = _sysPalette.colors[colorNr].used; + *memoryPtr++ = _sysPalette.colors[colorNr].r; + *memoryPtr++ = _sysPalette.colors[colorNr].g; + *memoryPtr++ = _sysPalette.colors[colorNr].b; + } + } + return memoryId; +} + +void GfxPalette::kernelRestore(reg_t memoryHandle) { + SegManager *segMan = g_sci->getEngineState()->_segMan; + if (!memoryHandle.isNull()) { + byte *memoryPtr = segMan->getHunkPointer(memoryHandle); + if (!memoryPtr) + error("Bad handle used for kPalette(restore)"); + + Palette restoredPalette; + + restoredPalette.timestamp = 0; + for (int colorNr = 0; colorNr < 256; colorNr++) { + restoredPalette.colors[colorNr].used = *memoryPtr++; + restoredPalette.colors[colorNr].r = *memoryPtr++; + restoredPalette.colors[colorNr].g = *memoryPtr++; + restoredPalette.colors[colorNr].b = *memoryPtr++; + } + + set(&restoredPalette, true); + } +} + void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) { // Sometimes invalid viewIds are asked for, ignore those (e.g. qfg1vga) //if (!_resMan->testResource(ResourceId(kResourceTypeView, resourceId))) diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index b9cd308281..e10c10718d 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -63,6 +63,8 @@ public: int16 kernelFindColor(uint16 r, uint16 g, uint16 b); bool kernelAnimate(byte fromColor, byte toColor, int speed); void kernelAnimateSet(); + reg_t kernelSave(); + void kernelRestore(reg_t memoryHandle); void kernelAssertPalette(GuiResourceId resourceId); void kernelSyncScreenPalette(); @@ -81,6 +83,7 @@ public: Palette _sysPalette; virtual void saveLoadWithSerializer(Common::Serializer &s); + void palVarySaveLoadPalette(Common::Serializer &s, Palette *palette); private: void palVaryInit(); -- cgit v1.2.3 From a8574a37eec7f6fa91972e32482f49114df85553 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 18:17:47 +0000 Subject: SCI: Add second KQ5 EGA entry (from bug #3035421) svn-id: r51382 --- engines/sci/detection_tables.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 16535d04d0..9037cc6d8f 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -973,6 +973,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // King's Quest 5 EGA (supplied by markcoolio in bug report #2829470) // SCI interpreter version 1.000.060 + // VERSION file reports "0.000.055" {"kq5", "EGA", { {"resource.map", 0, "baf888a4e4797ce0de0b19d4e183583c", 7662}, {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 394242}, @@ -986,6 +987,21 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // King's Quest 5 EGA (supplied by omer_mor in bug report #3035421) + // VERSION file reports "0.000.062" + {"kq5", "EGA", { + {"resource.map", 0, "e17cfb38175382b9188da75c53bbab64", 7656}, + {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 394072}, + {"resource.001", 0, "c1eef048fa9fe76298c2d4705ef9549f", 561444}, + {"resource.002", 0, "076aa0bf1d8d2c147d64aeffbe2928e5", 597580}, + {"resource.003", 0, "ecb47cd04d06b2ab2f9f883667db6e81", 487633}, + {"resource.004", 0, "4d74e8094ff57cea6ee92faf63dbd0af", 620749}, + {"resource.005", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 669961}, + {"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666541}, + {"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541762}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101) // SCI interpreter version 1.000.060 {"kq5", "", { -- cgit v1.2.3 From 3cae0f3452233bc03ce5964e0bf7567798f35856 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 18:45:32 +0000 Subject: SCI: kCheckFreeSpace support for sci1.1 and possible sci32 svn-id: r51383 --- engines/sci/engine/kernel_tables.h | 1 + engines/sci/engine/kfile.cpp | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index ca4c8754a1..a2006a0578 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -312,6 +312,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI11, SIGFOR_ALL, "ri", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 24c96be111..0cc562c7c1 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -365,11 +365,25 @@ reg_t kGetSaveDir(EngineState *s, int argc, reg_t *argv) { } reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) { -#ifdef ENABLE_SCI32 - // TODO: SCI32 uses a parameter here. - if (argc > 1) - warning("kCheckFreeSpace called with %d parameter(s): %04x:%04x", argc, PRINT_REG(argv[1])); -#endif + if (argc > 1) { + // SCI1.1/SCI32 + // TODO: don't know if those are right for SCI32 as well + // Please note that sierra sci supported both calls either w/ or w/o opcode in SCI1.1 + switch (argv[1].toUint16()) { + case 0: // return saved game size + return make_reg(0, 0); // we return 0 + + case 1: // return free harddisc space (shifted right somehow) + return make_reg(0, 0x7fff); // we return maximum + + case 2: // same as call w/o opcode + break; + return make_reg(0, 1); + + default: + error("kCheckFreeSpace: called with unknown sub-op %d", argv[1].toUint16()); + } + } Common::String path = s->_segMan->getString(argv[0]); -- cgit v1.2.3 From 828434456f49587e64c85d8117323411542e759f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 19:07:39 +0000 Subject: SCI: Better fix for bug #3035058 - ECOQUEST demo: Missing subtitles The demo really uses kGetMessage and not kMessage. We now detect which version of the message function is used. Thanks to Walter for pointing this out. svn-id: r51384 --- engines/sci/engine/features.cpp | 36 ++++++++++++++++++++++++++++++++++++ engines/sci/engine/features.h | 8 +++++++- engines/sci/engine/kernel.cpp | 10 +++++++--- engines/sci/engine/kernel.h | 2 +- engines/sci/engine/kstring.cpp | 15 +-------------- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 71f99dbbf5..315c86c56c 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -38,6 +38,7 @@ GameFeatures::GameFeatures(SegManager *segMan, Kernel *kernel) : _segMan(segMan) _doSoundType = SCI_VERSION_NONE; _lofsType = SCI_VERSION_NONE; _gfxFunctionsType = SCI_VERSION_NONE; + _messageFunctionType = SCI_VERSION_NONE; _moveCountType = kMoveCountUninitialized; #ifdef ENABLE_SCI32 @@ -407,6 +408,41 @@ SciVersion GameFeatures::detectGfxFunctionsType() { return _gfxFunctionsType; } +SciVersion GameFeatures::detectMessageFunctionType() { + if (_messageFunctionType != SCI_VERSION_NONE) + return _messageFunctionType; + + if (getSciVersion() > SCI_VERSION_1_1) { + _messageFunctionType = SCI_VERSION_1_1; + return _messageFunctionType; + } else if (getSciVersion() < SCI_VERSION_1_1) { + _messageFunctionType = SCI_VERSION_1_LATE; + return _messageFunctionType; + } + + Common::List *resources = g_sci->getResMan()->listResources(kResourceTypeMessage, -1); + + if (resources->empty()) { + // No messages found, so this doesn't really matter anyway... + _messageFunctionType = SCI_VERSION_1_1; + return _messageFunctionType; + } + + Resource *res = g_sci->getResMan()->findResource(*resources->begin(), false); + assert(res); + + // Only v2 Message resources use the kGetMessage kernel function. + // v3-v5 use the kMessage kernel function. + + if (READ_SCI11ENDIAN_UINT32(res->data) / 1000 == 2) + _messageFunctionType = SCI_VERSION_1_LATE; + else + _messageFunctionType = SCI_VERSION_1_1; + + debugC(1, kDebugLevelVM, "Detected message function type: %s", getSciVersionDesc(_messageFunctionType)); + return _messageFunctionType; +} + #ifdef ENABLE_SCI32 bool GameFeatures::autoDetectSci21KernelType() { // First, check if the Sound object is loaded diff --git a/engines/sci/engine/features.h b/engines/sci/engine/features.h index 5b383746d8..167c207437 100644 --- a/engines/sci/engine/features.h +++ b/engines/sci/engine/features.h @@ -66,6 +66,12 @@ public: * @return Graphics functions type, SCI_VERSION_0_EARLY / SCI_VERSION_0_LATE */ SciVersion detectGfxFunctionsType(); + + /** + * Autodetects the message function used + * @return Message function type, SCI_VERSION_1_LATE / SCI_VERSION_1_1 + */ + SciVersion detectMessageFunctionType(); #ifdef ENABLE_SCI32 /** @@ -105,7 +111,7 @@ private: bool autoDetectSci21KernelType(); #endif - SciVersion _doSoundType, _setCursorType, _lofsType, _gfxFunctionsType; + SciVersion _doSoundType, _setCursorType, _lofsType, _gfxFunctionsType, _messageFunctionType; #ifdef ENABLE_SCI32 SciVersion _sci21KernelType; #endif diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 21331335f7..58ac35462e 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -670,7 +670,7 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { return true; } -void Kernel::setDefaultKernelNames() { +void Kernel::setDefaultKernelNames(GameFeatures *features) { _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); // Some (later) SCI versions replaced CanBeHere by CantBeHere @@ -722,7 +722,11 @@ void Kernel::setDefaultKernelNames() { } _kernelNames[0x71] = "PalVary"; - _kernelNames[0x7c] = "Message"; + + // At least EcoQuest 1 demo uses kGetMessage instead of kMessage. + // Detect which function to use. + if (features->detectMessageFunctionType() == SCI_VERSION_1_1) + _kernelNames[0x7c] = "Message"; break; default: @@ -774,7 +778,7 @@ void Kernel::loadKernelNames(GameFeatures *features) { setKernelNamesSci2(); else #endif - setDefaultKernelNames(); + setDefaultKernelNames(features); mapFunctions(); } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index f7b46b81dd..227eb19c01 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -225,7 +225,7 @@ private: /** * Sets the default kernel function names, based on the SCI version used. */ - void setDefaultKernelNames(); + void setDefaultKernelNames(GameFeatures *features); #ifdef ENABLE_SCI32 /** diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 76541f78e0..3a7bb30c80 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -456,8 +456,7 @@ enum kMessageFunc { K_MESSAGE_REFNOUN, K_MESSAGE_PUSH, K_MESSAGE_POP, - K_MESSAGE_LASTMESSAGE, - K_MESSAGE_ECOQUEST1_DEMO = 99 + K_MESSAGE_LASTMESSAGE }; reg_t kGetMessage(EngineState *s, int argc, reg_t *argv) { @@ -559,18 +558,6 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - case K_MESSAGE_ECOQUEST1_DEMO: - // The EcoQuest 1 demo uses a special version of kMessage. It's one of the - // earliest SCI 1.1 games. The noun is always 99 in this case, so we can - // treat it as a subop. If any other games require this syntax, we can change - // this to work with those games too. - - if (g_sci->getGameId() != GID_ECOQUEST || !g_sci->isDemo()) - error("kMessage called with EcoQuest 1 demo syntax in a different game"); - - tuple.noun = argv[0].toUint16(); - tuple.verb = argv[2].toUint16(); - return make_reg(0, s->_msgState->getMessage(argv[1].toUint16(), tuple, argv[3])); default: warning("Message: subfunction %i invoked (not implemented)", func); } -- cgit v1.2.3 From b873cf2ebf036a255c9729e0132db51e3de106a6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 19:09:57 +0000 Subject: SCI: changes for mother goose sci2.1 changed signature for kSetCursor sci2.1 added workarounds added separate gameid for mother goose sci2.1 svn-id: r51385 --- engines/sci/detection.cpp | 4 +++- engines/sci/detection_tables.h | 4 ++-- engines/sci/engine/kernel_tables.h | 2 ++ engines/sci/engine/vm.cpp | 2 +- engines/sci/engine/workarounds.cpp | 2 ++ engines/sci/sci.h | 1 + 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 8a1f68cfbb..3698964de5 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -94,7 +94,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = { {"sq5", "Space Quest V: The Next Mutation"}, {"islandbrain", "The Island of Dr. Brain"}, {"lsl6", "Leisure Suit Larry 6: Shape Up or Slip Out!"}, - {"mothergoose", "Mixed-Up Mother Goose"}, // floppy is SCI1.1, CD SCI2.1 + {"mothergoose", "Mixed-Up Mother Goose"}, {"pepper", "Pepper's Adventure in Time"}, {"slater", "Slater & Charlie Go Camping"}, // === SCI2 games ========================================================= @@ -107,6 +107,7 @@ static const PlainGameDescriptor s_sciGameTitles[] = { {"kq7", "King's Quest VII: The Princeless Bride"}, // TODO: King's Questions {"lsl6hires", "Leisure Suit Larry 6: Shape Up or Slip Out!"}, + {"mothergoosehires","Mixed-Up Mother Goose"}, {"phantasmagoria", "Phantasmagoria"}, {"pqswat", "Police Quest: SWAT"}, {"shivers", "Shivers"}, @@ -169,6 +170,7 @@ static const GameIdStrToEnum s_gameIdStrToEnum[] = { { "lsl6hires", GID_LSL6HIRES }, { "lsl7", GID_LSL7 }, { "mothergoose", GID_MOTHERGOOSE }, + { "mothergoosehires",GID_MOTHERGOOSEHIRES }, { "msastrochicken", GID_MSASTROCHICKEN }, { "pepper", GID_PEPPER }, { "phantasmagoria", GID_PHANTASMAGORIA }, diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 9037cc6d8f..b0c9ab6cf2 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1912,7 +1912,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { #ifdef ENABLE_SCI32 // Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810) // Executable scanning reports "2.100.002" - {"mothergoose", "", { + {"mothergoosehires", "", { {"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741}, {"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768}, {NULL, 0, NULL, 0}}, @@ -1920,7 +1920,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish) // Executable scanning reports "2.100.002" - {"mothergoose", "", { + {"mothergoosehires", "", { {"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969}, {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, {NULL, 0, NULL, 0}}, diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index a2006a0578..fcc754dbed 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -416,6 +416,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, { MAP_CALL(SaveGame), SIG_EVERYWHERE, "rir(r)", NULL, NULL }, { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_SCI21, SIGFOR_ALL, "i(i)([io])(i*)", NULL, NULL }, + // TODO: SCI2.1 may supply an object optionally (mother goose sci21 right on startup) - find out why { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index bab71ad7fc..1e5d61fceb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -169,7 +169,7 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in } else { // WORKAROUND: Mixed-Up Mother Goose tries to use an invalid parameter in Event::new(). // Just skip around it here so we don't error out in validate_arithmetic. - if (g_sci->getGameId() == GID_MOTHERGOOSE && getSciVersion() <= SCI_VERSION_1_1 && type == VAR_PARAM && index == 1) + if (g_sci->getGameId() == GID_MOTHERGOOSE && type == VAR_PARAM && index == 1) return false; debugC(2, kDebugLevelVM, "%s", txt.c_str()); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 4f8c0184d7..c92048d685 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -97,6 +97,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game + { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later + { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad diff --git a/engines/sci/sci.h b/engines/sci/sci.h index c497460334..13c9d03614 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -143,6 +143,7 @@ enum SciGameId { GID_LSL6HIRES, // We have a separate ID for LSL6 SCI32, because it's actually a completely different game GID_LSL7, GID_MOTHERGOOSE, + GID_MOTHERGOOSEHIRES, // We have a separate ID for Mother Goose SCI32, because it's actually a completely different game GID_MSASTROCHICKEN, GID_PEPPER, GID_PHANTASMAGORIA, -- cgit v1.2.3 From 20ced61f2823b7a90724ea5c73f26f320467de1a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 19:35:18 +0000 Subject: SCI: adding workaround for kq6 rats in catacombs solves bug #3035495 svn-id: r51386 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index c92048d685..d923fc659a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -78,6 +78,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 2, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle -- cgit v1.2.3 From b12424741cae1821ce1b5115ce38591177d8c1af Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 20:11:00 +0000 Subject: SCI: The mothergoose demo is really for Windows, so make that the platform svn-id: r51387 --- engines/sci/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index b0c9ab6cf2..dd35613c2c 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1906,7 +1906,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "87f9dc1cafc4d4fa835fb2f00cf3a6ef", 4560}, {"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 2070072}, {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 -- cgit v1.2.3 From 5787c8bb88eeb6ecccf8e28d8302bbdac4a1bbaa Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 27 Jul 2010 20:17:29 +0000 Subject: GUI: Rename Font cache to match new font naming scheme svn-id: r51388 --- gui/themes/scummclassic.zip | Bin 58008 -> 58510 bytes gui/themes/scummmodern.zip | Bin 165317 -> 165851 bytes gui/themes/scummmodern/helvb12-iso-8859-1.fcc | Bin 0 -> 5615 bytes gui/themes/scummmodern/helvr12-l1.fcc | Bin 5615 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui/themes/scummmodern/helvb12-iso-8859-1.fcc delete mode 100644 gui/themes/scummmodern/helvr12-l1.fcc diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 6b079f7afc..299bc41339 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 371d73c211..cd24d781bb 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/helvb12-iso-8859-1.fcc b/gui/themes/scummmodern/helvb12-iso-8859-1.fcc new file mode 100644 index 0000000000..651a25934a Binary files /dev/null and b/gui/themes/scummmodern/helvb12-iso-8859-1.fcc differ diff --git a/gui/themes/scummmodern/helvr12-l1.fcc b/gui/themes/scummmodern/helvr12-l1.fcc deleted file mode 100644 index 651a25934a..0000000000 Binary files a/gui/themes/scummmodern/helvr12-l1.fcc and /dev/null differ -- cgit v1.2.3 From 2df946f837ca7a3c721de27868de9e73241bc6a2 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 27 Jul 2010 20:20:00 +0000 Subject: SCI: Add an uninited workaround for the mothergoose demo svn-id: r51389 --- engines/sci/engine/workarounds.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index d923fc659a..0a44707644 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -98,7 +98,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup { GID_LSL6HIRES, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // at least when entering swimming pool area { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game - { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later + { GID_MOTHERGOOSE, 18, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // DEMO: Called when walking north from mother goose's house two screens + { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad -- cgit v1.2.3 From 7e545888fd82755403ef03c364ab67a6360bf4b9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 20:46:12 +0000 Subject: SCI: moving some fileio warnings to debug level svn-id: r51392 --- engines/sci/engine/kfile.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 0cc562c7c1..d4ba467b25 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -132,17 +132,17 @@ reg_t file_open(EngineState *s, const char *filename, int mode) { } if (!inFile) - warning(" -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str()); + debugC(2, kDebugLevelFile, " -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_CREATE) { // Create the file, destroying any content it might have had outFile = saveFileMan->openForSaving(wrappedName); if (!outFile) - warning(" -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); + debugC(2, kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); } else if (mode == _K_FILE_MODE_OPEN_OR_CREATE) { // Try to open file, create it if it doesn't exist outFile = saveFileMan->openForSaving(wrappedName); if (!outFile) - warning(" -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); + debugC(2, kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); // QfG1 opens the character export file with _K_FILE_MODE_CREATE first, // closes it immediately and opens it again with this here. Perhaps // other games use this for read access as well. I guess changing this -- cgit v1.2.3 From 11de85026d8c57ee64611770aad442226ec502db Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 21:04:02 +0000 Subject: SCI: found out interpreter version of lsl5g svn-id: r51393 --- engines/sci/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index dd35613c2c..93cc9036ab 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1580,7 +1580,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - German DOS (from Tobis87) - // SCI interpreter version 1.000.510 (just a guess) + // SCI interpreter version T.A00.196 {"lsl5", "", { {"resource.map", 0, "c97297aa76d4dd2ed144c7b7769e2caf", 6867}, {"resource.000", 0, "4c00c14b8181ad47076a51d86097d97e", 759095}, -- cgit v1.2.3 From 6e8b11867f471682ccab841da08d97575753c54f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 21:30:15 +0000 Subject: SCI: fixing signature of kCheckFreeSpace svn-id: r51394 --- engines/sci/engine/kernel_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index fcc754dbed..8e245d6b4c 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -312,7 +312,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, - { MAP_CALL(CheckFreeSpace), SIG_SCI11, SIGFOR_ALL, "ri", NULL, NULL }, + { MAP_CALL(CheckFreeSpace), SIG_SCI11, SIGFOR_ALL, "r(i)", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(CheckSaveGame), SIG_EVERYWHERE, ".*", NULL, NULL }, { MAP_CALL(Clone), SIG_EVERYWHERE, "o", NULL, NULL }, -- cgit v1.2.3 From 97b1cd34cf5b41c08e3e80f3dd9ce59db9865093 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 27 Jul 2010 23:20:43 +0000 Subject: SCI: sci1.1 priority bands now changing in kDrawPic fixes qfg3: right guard on top of the palace having wrong priority fixes sq5 and all sorts of sci1.1 games: when loading wrong priority for some actors that fixed itself after one frame svn-id: r51397 --- engines/sci/graphics/animate.cpp | 3 --- engines/sci/graphics/picture.cpp | 4 ++-- engines/sci/graphics/ports.cpp | 22 ++++++---------------- engines/sci/graphics/ports.h | 6 +----- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index f2aa4f9479..a883f572bb 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -542,9 +542,6 @@ void GfxAnimate::animateShowPic() { _transitions->doit(picRect); if (previousCursorState) _cursor->kernelShow(); - - // We set SCI1.1 priority band information here - _ports->priorityBandsRecall(); } void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t *argv) { diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index b31036daa8..107c5d0967 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -122,8 +122,8 @@ void GfxPicture::drawSci11Vga() { // process vector data drawVectorData(inbuffer + vector_dataPos, vector_size); - // Remember priority band information for later - _ports->priorityBandsRemember(inbuffer + 40); + // Set priority band information + _ports->priorityBandsInitSci11(inbuffer + 40); } #ifdef ENABLE_SCI32 diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 71c4c5e656..9268888b6c 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -134,8 +134,6 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te if (g_sci->_features->usesOldGfxFunctions()) _picWind->top = offTop; - priorityBandsMemoryActive = false; - kernelInitPriorityBands(); } @@ -541,22 +539,14 @@ void GfxPorts::priorityBandsInit(byte *data) { _priorityBands[i++] = inx; } -// Gets used by picture class to remember priority bands data from sci1.1 pictures that need to get applied when -// transitioning to that picture -void GfxPorts::priorityBandsRemember(byte *data) { - int bandNo; - for (bandNo = 0; bandNo < 14; bandNo++) { - priorityBandsMemory[bandNo] = READ_LE_UINT16(data); +// Gets used to read priority bands data from sci1.1 pictures +void GfxPorts::priorityBandsInitSci11(byte *data) { + byte priorityBands[14]; + for (int bandNo = 0; bandNo < 14; bandNo++) { + priorityBands[bandNo] = READ_LE_UINT16(data); data += 2; } - priorityBandsMemoryActive = true; -} - -void GfxPorts::priorityBandsRecall() { - if (priorityBandsMemoryActive) { - priorityBandsInit((byte *)&priorityBandsMemory); - priorityBandsMemoryActive = false; - } + priorityBandsInit(priorityBands); } void GfxPorts::kernelInitPriorityBands() { diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h index 818f92f44f..d10bc6772f 100644 --- a/engines/sci/graphics/ports.h +++ b/engines/sci/graphics/ports.h @@ -81,8 +81,7 @@ public: void priorityBandsInit(int16 bandCount, int16 top, int16 bottom); void priorityBandsInit(byte *data); - void priorityBandsRemember(byte *data); - void priorityBandsRecall(); + void priorityBandsInitSci11(byte *data); void kernelInitPriorityBands(); void kernelGraphAdjustPriority(int top, int bottom); @@ -121,9 +120,6 @@ private: // Priority Bands related variables int16 _priorityTop, _priorityBottom, _priorityBandCount; byte _priorityBands[200]; - - byte priorityBandsMemory[14]; - bool priorityBandsMemoryActive; }; } // End of namespace Sci -- cgit v1.2.3 From 50e493f3ef368847b95d443bee13f6918bbab34e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 03:54:14 +0000 Subject: SCI: Fix bug #3035720 - SQ1SCI demo: Menu crash kCelWide and kCelHigh are called with the second two parameters as objects instead of integers. We fake return the real width/height of the view in question to allow the quit menu to work. Values found by examining the view passed as the first parameter. svn-id: r51401 --- engines/sci/engine/kernel_tables.h | 4 ++-- engines/sci/engine/workarounds.cpp | 12 ++++++++++++ engines/sci/engine/workarounds.h | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 8e245d6b4c..de791c7c51 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -309,8 +309,8 @@ static SciKernelMapEntry s_kernelMap[] = { { "CantBeHere", kCantBeHere32, SIG_SCI32, SIGFOR_ALL, "ol", NULL, NULL }, #endif { MAP_CALL(CantBeHere), SIG_EVERYWHERE, "o(l)", NULL, NULL }, - { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, - { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, NULL }, + { MAP_CALL(CelHigh), SIG_EVERYWHERE, "ii(i)", NULL, kCelHigh_workarounds }, + { MAP_CALL(CelWide), SIG_EVERYWHERE, "ii(i)", NULL, kCelWide_workarounds }, { MAP_CALL(CheckFreeSpace), SIG_SCI32, SIGFOR_ALL, "r.*", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_SCI11, SIGFOR_ALL, "r(i)", NULL, NULL }, { MAP_CALL(CheckFreeSpace), SIG_EVERYWHERE, "r", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0a44707644..244066a6e6 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -122,6 +122,18 @@ const SciWorkaroundEntry kAbs_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kCelHigh_workarounds[] = { + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_FAKE, 66 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kCelWide_workarounds[] = { + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_FAKE, 78 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 01c7676247..d509d300d7 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -73,6 +73,8 @@ extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; +extern const SciWorkaroundEntry kCelHigh_workarounds[]; +extern const SciWorkaroundEntry kCelWide_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; -- cgit v1.2.3 From ea2256c05b500fb036101f0d99aed7a6ebe8b96e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 05:03:23 +0000 Subject: SCI: changing workarounds of r51401 to stillcall svn-id: r51402 --- engines/sci/engine/workarounds.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 244066a6e6..0adfd9be95 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -124,13 +124,13 @@ const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelHigh_workarounds[] = { - { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_FAKE, 66 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { - { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_FAKE, 78 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 558fc88cc68b0c4780caed9ecd546187de46c662 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 05:55:09 +0000 Subject: SCI: Initialize _resourceData to 0 in GfxRobot. Fixes PQSWAT demo. svn-id: r51404 --- engines/sci/graphics/robot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/graphics/robot.cpp b/engines/sci/graphics/robot.cpp index 352dc8177c..1572a0a9ec 100644 --- a/engines/sci/graphics/robot.cpp +++ b/engines/sci/graphics/robot.cpp @@ -37,6 +37,7 @@ GfxRobot::GfxRobot(ResourceManager *resMan, GfxScreen *screen, GuiResourceId res : _resMan(resMan), _screen(screen), _resourceId(resourceId) { assert(resourceId != -1); initData(resourceId); + _resourceData = 0; } GfxRobot::~GfxRobot() { -- cgit v1.2.3 From 61b63d9e4df160f54e64b567f65dcd80f0dc0b98 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 06:03:52 +0000 Subject: SCI: Add 'robots' subdirectory (PQSWAT demo stores them there) svn-id: r51405 --- engines/sci/sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index d58cdd5986..f07cc257bd 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -122,6 +122,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions SearchMan.addSubDirectoryMatching(gameDataDir, "seq"); // SEQ movie files for DOS versions SearchMan.addSubDirectoryMatching(gameDataDir, "robot"); // robot movie files + SearchMan.addSubDirectoryMatching(gameDataDir, "robots"); // robot movie files SearchMan.addSubDirectoryMatching(gameDataDir, "movies"); // vmd movie files SearchMan.addSubDirectoryMatching(gameDataDir, "vmd"); // vmd movie files -- cgit v1.2.3 From 764b8419900135cadb2f6d228811113c1ce6429c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 07:13:40 +0000 Subject: Fixed bug #3035694 - "LB2: crash to console when selecting in-game load/save menu" svn-id: r51406 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0adfd9be95..9826bc6449 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -85,6 +85,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu + { GID_LAURABOW2, -1, 24, 0, "gcWin", "", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu (floppy version, which doesn't have a selector vocabulary) - bug #3035694 { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room -- cgit v1.2.3 From 3c8a606e7191391857640c507c85c8a57154d5a7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 07:51:49 +0000 Subject: SCI: Added bug report numbers for all the recently fixed bugs svn-id: r51407 --- engines/sci/engine/static_selectors.cpp | 2 +- engines/sci/engine/workarounds.cpp | 54 ++++++++++++++++----------------- engines/sci/graphics/menu.cpp | 1 + 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index c3eb7d17b9..c062c4e786 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -170,7 +170,7 @@ Common::StringArray Kernel::checkStaticSelectorNames() { names[275] = "syncCue"; } else if (g_sci->getGameId() == GID_ISLANDBRAIN) { // The demo of Island of Dr. Brain needs the init selector set to match up with the full - // game's workaround. + // game's workaround - bug #3035033 if (names.size() < 111) names.resize(111); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 9826bc6449..ce753c276b 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -40,7 +40,7 @@ const SciWorkaroundEntry opcodeDivWorkarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeOrWorkarounds[] = { - { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number + { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -75,18 +75,18 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_JONES, 1, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/cd only - called when a game ends { GID_JONES, 764, 255, 0, "", "export 0", -1, 13, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts - { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio + { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #3034700 { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 2, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - bug #3034597 + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 2, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - bug #3035495 + { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - bug #3034565 { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) - { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian + { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 24, 0, "gcWin", "", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu (floppy version, which doesn't have a selector vocabulary) - bug #3035694 - { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary + { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary - bug #3035068 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club @@ -131,7 +131,7 @@ const SciWorkaroundEntry kCelHigh_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { - { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -148,28 +148,28 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object - { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object + { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDoSoundFade_workarounds[] = { - { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) + { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) - bug #3035149 { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object - { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object + { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #3034567 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGetAngle_workarounds[] = { - { GID_KQ6, 740, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed. + { GID_KQ6, 740, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed - bug #3034610 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kFindKey_workarounds[] = { - { GID_ECOQUEST2, 100, 999, 0, "myList", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When Noah Greene gives Adam the Ecorder, and just before the game gives a demonstration, a null reference to a list is passed. + { GID_ECOQUEST2, 100, 999, 0, "myList", "contains", -1, 0, { WORKAROUND_FAKE, 0 } }, // When Noah Greene gives Adam the Ecorder, and just before the game gives a demonstration, a null reference to a list is passed - bug #3035186 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -183,7 +183,7 @@ const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { { GID_CASTLEBRAIN, 420, 427, 0, "alienIcon", "select", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when selecting a card during the alien card game, gets called with 1 extra parameter - { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack + { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - bug #3034485 { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution) SCI_WORKAROUNDENTRY_TERMINATOR @@ -223,27 +223,27 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kIsObject_workarounds[] = { - { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") + { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #3034519 { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter - { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") + { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") - bug #3035262 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kMemory_workarounds[] = { - { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train, talking to Mr. Augustini, etc. + { GID_LAURABOW2, -1, 999, 0, "", "export 6", -1, 0, { WORKAROUND_FAKE, 0 } }, // during the intro, when exiting the train, talking to Mr. Augustini, etc. - bug #3034490 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kNewWindow_workarounds[] = { - { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call. + { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call - bug #3035057 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { - { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless + { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #3034506 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -256,18 +256,18 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference - { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference + { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference - bug #3034473 { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error - { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident - { GID_LAURABOW2, 6, 6, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the murder, a 3rd parameter is passed by accident - { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident - { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid + { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 + { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 + { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident - bug #3034902 + { GID_LAURABOW2, 6, 6, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the murder, a 3rd parameter is passed by accident - bug #3034902 + { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident - bug #3034902 + { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - bug #3035000 + { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000 SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index b280f78b3c..92c0e92f48 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -273,6 +273,7 @@ void GfxMenu::kernelSetAttribute(uint16 menuId, uint16 itemId, uint16 attributeI GuiMenuItemEntry *itemEntry = findItem(menuId, itemId); if (!itemEntry) { // Check if the game actually has a menu. PQ2 demo calls this, for example, but has no menus. + // (bug report #3034507) if (_itemList.size() == 0) return; else -- cgit v1.2.3 From 817170bbb6b1f889063bebbf3e5694d57dadee00 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 08:05:16 +0000 Subject: SCI: Sorted workaround tables alphabetically by game ID svn-id: r51408 --- engines/sci/engine/workarounds.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ce753c276b..c3a3751b0d 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -145,10 +145,10 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisposeScript_workarounds[] = { + { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907 { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object - { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -224,8 +224,8 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #3034519 - { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") - bug #3035262 + { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -255,19 +255,19 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { + { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - bug #3035000 + { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000 { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference - bug #3034473 - { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident - { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident - { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 6, 6, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the murder, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 7, 7, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the logo is shown, a 3rd parameter is passed by accident - bug #3034902 - { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - bug #3035000 - { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000 + { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident + { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From bae197c489346f7373a5f6b877456eaa1b2530d8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 09:21:58 +0000 Subject: SCI: Changed a warning into debug output svn-id: r51409 --- engines/sci/engine/kscripts.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index 0286f7454a..e211867ef9 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -104,8 +104,10 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { if (id.getType() == kResourceTypeInvalid) warning("[resMan] Attempt to unlock resource %i of invalid type %i", id.getNumber(), type); else - // Happens in CD games (e.g. LSL6CD) with the message resource - warning("[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); + // Happens in CD games (e.g. LSL6CD) with the message + // resource. It isn't fatal, and it's usually caused + // by leftover scripts. + debugC(2, kDebugLevelResMan, "[resMan] Attempt to unlock non-existant resource %s", id.toString().c_str()); } } break; -- cgit v1.2.3 From eb1cdc2c49ca17deac34563b9aad1e20cab18a27 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 09:34:31 +0000 Subject: SCI: Some workaround fixes - Merged all of the different workarounds for the rats in the KQ6 maze in one, thus fixing bug #3035824 - "kq6-win: more crashes on rats in catacombs" - Merged 4 different workarounds for LSL3 in one svn-id: r51410 --- engines/sci/engine/workarounds.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index c3a3751b0d..0f11f63bea 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -77,8 +77,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_JONES, 764, 255, 0, "", "export 0", -1, 14, { WORKAROUND_FAKE, 0 } }, // jones/ega&vga only - called when the game starts { GID_KQ5, -1, 0, 0, "", "export 29", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when playing harp for the harpies or when aborting dialog in toy shop, is used for kDoAudio - bug #3034700 { GID_KQ5, 25, 25, 0, "rm025", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // inside witch forest, when going to the room where the walking rock is - { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - bug #3034597 - { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, 2, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs - bug #3035495 + { GID_KQ6, -1, 30, 0, "rats", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // rats in the catacombs (temps 1 - 5) - bugs #3034597, #3035495, #3035824 { GID_KQ6, 210, 210, 0, "rm210", "scriptCheck", -1, 0, { WORKAROUND_FAKE, 1 } }, // using inventory in that room - bug #3034565 { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle @@ -89,10 +88,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary - bug #3035068 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 200, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 201, { WORKAROUND_FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 202, { WORKAROUND_FAKE, 0 } }, // see above - { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, 203, { WORKAROUND_FAKE, 0 } }, // see above + { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class -- cgit v1.2.3 From c0474c91c4e290edd8dab5808ce8a3854ac5fa45 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 11:22:58 +0000 Subject: SCI: fixes for qfg2 adding workaround changing signature for dummy kDoSound call svn-id: r51411 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index de791c7c51..db19c8ca28 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -86,7 +86,7 @@ struct SciKernelMapSubEntry { static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, - { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "o", NULL }, + { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "(o)", NULL }, { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0f11f63bea..06e7f53539 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -99,6 +99,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory + { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From 16f042270d885b96c5e93d99755c2c8997fb7e36 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 28 Jul 2010 11:31:13 +0000 Subject: SCI: Fix whitespace svn-id: r51412 --- engines/sci/engine/workarounds.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 06e7f53539..8f1195a682 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -97,9 +97,9 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL6HIRES, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game { GID_MOTHERGOOSE, 18, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // DEMO: Called when walking north from mother goose's house two screens { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later - { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above + { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory - { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 + { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser @@ -222,7 +222,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #3034519 { GID_ISLANDBRAIN, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when going to the game options, choosing "Info" and selecting anything from the list, gets called with an invalid parameter (type "error") - bug #3035262 - { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter + { GID_QFG3, -1, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // when asking for something, gets called with type error parameter SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From e0f6bb2e7aa27f9d1ac214bb7f68e0b6bb8a5f78 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 11:37:22 +0000 Subject: SCI: Adding the room number to some more errors svn-id: r51413 --- engines/sci/engine/vm.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1e5d61fceb..6625387b56 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -203,7 +203,10 @@ static reg_t arithmetic_lookForWorkaround(const byte opcode, const SciWorkaround SciTrackOriginReply originReply; SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, workaroundList, &originReply); if (solution.type == WORKAROUND_NONE) - error("%s on non-integer (%04x:%04x, %04x:%04x) from method %s::%s (script %d, localCall %x)", opcodeNames[opcode], PRINT_REG(value1), PRINT_REG(value2), originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("%s on non-integer (%04x:%04x, %04x:%04x) from method %s::%s (script %d, room %d, localCall %x)", + opcodeNames[opcode], PRINT_REG(value1), PRINT_REG(value2), originReply.objectName.c_str(), + originReply.methodName.c_str(), originReply.scriptNr, g_sci->getEngineState()->currentRoomNumber(), + originReply.localCallOffset); assert(solution.type == WORKAROUND_FAKE); return make_reg(0, solution.value); } @@ -218,7 +221,9 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i SciTrackOriginReply originReply; SciWorkaroundSolution solution = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply); if (solution.type == WORKAROUND_NONE) - error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset); + error("Uninitialized read for temp %d from method %s::%s (script %d, room %d, localCall %x)", + index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, + g_sci->getEngineState()->currentRoomNumber(), originReply.localCallOffset); assert(solution.type == WORKAROUND_FAKE); r[index] = make_reg(0, solution.value); break; -- cgit v1.2.3 From 0e47192346904858f0cbbc197d957cb68b777ad8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 12:28:35 +0000 Subject: SCI: priority handling for sci1.1 add-pictures fixes battle cruiser mini game in sq5 (at least we get something displayed now) svn-id: r51414 --- engines/sci/graphics/picture.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 107c5d0967..4730420a97 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -73,8 +73,6 @@ void GfxPicture::draw(int16 animationNr, bool mirroredFlag, bool addToFlag, int1 switch (headerSize) { case 0x26: // SCI 1.1 VGA picture _resourceType = SCI_PICTURE_TYPE_SCI11; - if (_addToFlag) - _priority = 15; drawSci11Vga(); break; #ifdef ENABLE_SCI32 @@ -102,7 +100,8 @@ void GfxPicture::reset() { void GfxPicture::drawSci11Vga() { byte *inbuffer = _resource->data; int size = _resource->size; - int has_cel = READ_LE_UINT16(inbuffer + 4); + int priorityBandsCount = inbuffer[3]; + int has_cel = inbuffer[4]; int vector_dataPos = READ_LE_UINT16(inbuffer + 16); int vector_size = size - vector_dataPos; int palette_data_ptr = READ_LE_UINT16(inbuffer + 28); @@ -115,6 +114,13 @@ void GfxPicture::drawSci11Vga() { _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette); _palette->set(&palette, true); + // priority bands are supposed to be 14 + assert(priorityBandsCount == 14); + + if (_addToFlag) { + _priority = inbuffer[40 + priorityBandsCount * 2] & 0xF; + } + // display Cel-data if (has_cel) drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0); -- cgit v1.2.3 From dc9c6276815731e976972747bcd9fd761dfee3d1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 12:41:24 +0000 Subject: SCI: adding header comments about sci1.1 pictures also fixing some of the offsets (those are DWORD instead of just WORDs) svn-id: r51415 --- engines/sci/graphics/picture.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 4730420a97..e568316919 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -102,19 +102,29 @@ void GfxPicture::drawSci11Vga() { int size = _resource->size; int priorityBandsCount = inbuffer[3]; int has_cel = inbuffer[4]; - int vector_dataPos = READ_LE_UINT16(inbuffer + 16); + int vector_dataPos = READ_LE_UINT32(inbuffer + 16); int vector_size = size - vector_dataPos; - int palette_data_ptr = READ_LE_UINT16(inbuffer + 28); - int cel_headerPos = READ_LE_UINT16(inbuffer + 32); - int cel_RlePos = READ_LE_UINT16(inbuffer + cel_headerPos + 24); - int cel_LiteralPos = READ_LE_UINT16(inbuffer + cel_headerPos + 28); + int palette_data_ptr = READ_LE_UINT32(inbuffer + 28); + int cel_headerPos = READ_LE_UINT32(inbuffer + 32); + int cel_RlePos = READ_LE_UINT32(inbuffer + cel_headerPos + 24); + int cel_LiteralPos = READ_LE_UINT32(inbuffer + cel_headerPos + 28); Palette palette; + // Header + // [headerSize:WORD] [unknown:BYTE] [priorityBandCount:BYTE] [hasCel:BYTE] [unknown:BYTE] + // [unknown:WORD] [unknown:WORD] [unknown:WORD] [unknown:WORD] [unknown:WORD] + // Offset 16 + // [vectorDataOffset:DWORD] [unknown:DWORD] [unknown:DWORD] [paletteDataOffset:DWORD] + // Offset 32 + // [celHeaderOffset:DWORD] [unknown:DWORD] + // [priorityBandData:WORD] * priorityBandCount + // [priority:BYTE] [unknown:BYTE] + // Create palette and set it _palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette); _palette->set(&palette, true); - // priority bands are supposed to be 14 + // priority bands are supposed to be 14 for sci1.1 pictures assert(priorityBandsCount == 14); if (_addToFlag) { -- cgit v1.2.3 From df3decc14c16ec242795d4649de1b6e9df0a3c55 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 13:16:36 +0000 Subject: SCI: adding workaround for eq1cd svn-id: r51416 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8f1195a682..a8b7ac05ed 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,6 +58,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game + { GID_ECOQUEST, 400, 400, 0, "rug", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the rug { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From ebd3356e89904e821e5b4f8a54b8c6c9831d7c52 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 13:34:14 +0000 Subject: SCI: adding workaround for eq1 svn-id: r51417 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a8b7ac05ed..5b08ebbe45 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -59,6 +59,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, 400, 400, 0, "rug", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the rug + { GID_ECOQUEST, 400, 400, 0, "computer", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the computer { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From 8b22fd921ffead15a4b85b9791638f49216e0608 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 13:35:24 +0000 Subject: SCI: Add detection entries for newer SCI fan games svn-id: r51418 --- engines/sci/detection_tables.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 93cc9036ab..d65ea33595 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -3149,22 +3149,30 @@ static const struct ADGameDescription SciGameDescriptions[] = { FANMADE("Al Pond: Island Quest 2", "4cba6a5a4c8f66f21935ed78b0511a92", 870, "876587dc9a5ec569287a3dc4b29139d8", 613769), FANMADE("Another DG Game: I Want My C64 Back", "4a8ca7ca2abd18899ef856f47665e2e9", 588, "12ff558d20c72e42cc6adb408f34d6d8", 150513), FANMADE_L("Another DG Game: I Want My C64 Back", "13dc1d9ebc57daf8895412eee5e39fea", 576, "e2ad60b3a280171429db5c85f158f84a", 141697, Common::FR_FRA), + FANMADE("Aquarius: An Aquatic Experience", "2e23bc3b82f22a454be202ea593fb478", 480, "01555c8de683d25405bda270aa1ff014", 272372), FANMADE("Bluntman and Chronic (Politically Correct Version)", "c3ef9fa6c7c5fb840078bf28d87c7f8b", 1362, "441636a9f6f86710844868fded868ee7", 596688), FANMADE("Cascade Quest", "c94efc10d18c040b6e22a1dc6d3adfe1", 3468, "8ada33dfa945f81531e5508240b573de", 1432195), - FANMADE("Curt Quest 1.0", "b0e555370380d218968a40a68eaaaffc", 1146, "c851182cdf6fc6a81b840f4d4875f1a0", 307165), - FANMADE("Curt Quest 1.1", "54084c29346683296e45ef32d7ae74f3", 1128, "c851182cdf6fc6a81b840f4d4875f1a0", 302000), + FANMADE("Circus Quest", "35871f6b4e1df56af4113c0203a0b223", 630, "7d6f97d7935d8733f488d4cb74315e5b", 279627), + FANMADE("Curt's Quest 1.0", "b0e555370380d218968a40a68eaaaffc", 1146, "c851182cdf6fc6a81b840f4d4875f1a0", 307165), + FANMADE("Curt's Quest 1.1", "54084c29346683296e45ef32d7ae74f3", 1128, "c851182cdf6fc6a81b840f4d4875f1a0", 302000), FANMADE("Demo Quest", "c89a0c9e0a4e4af0ecedb300a3b31dbf", 384, "a32f3495ba24764cba091119cc3f1e13", 160098), FANMADE("Dr. Jummybummy's Space Adventure 2", "6ae6cb7de423f51736d9487b4ca0c6da", 810, "26e5b563f578e104d79689f36568b7cf", 394670), FANMADE_L("Grostesteing: Plus Mechant que Jamais", "ec9a97ccb134f69249f6ea8b16c13d8e", 1500, "b869f5f11bfe2ab5f67f4f0c618f2ce1", 464657, Common::FR_FRA), // FIXME: Accent - FANMADE("Jim Quest", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446), + FANMADE("Humanoid Demo", "97d8331293a6d57e8bad58c1efc89a63", 624, "fb354b9abe64011b12159e45d724633f", 452320), + FANMADE("Jim’s Quest 1: The Phantom Thesis", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446), FANMADE("Knight's Quest Demo 1.0", "5e816edf993956752ed06fccfeeae6d9", 1260, "959321f88a22905fa1f8c6d897874744", 703836), FANMADE("LockerGnome Quest", "3eeff9130206cad0c4e1551e2b9dd2c5", 420, "ae05ca90806fd90cc43f147c82d3547c", 158906), FANMADE("New Year's Mystery", "efd1beb5120293725065c95959144f81", 714, "b3bd3c2372ed6efa28adb12403c4c31a", 305027), + FANMADE("Ocean Battle", "c2304a0568e0eb84f8e9a0915f01170a", 408, "46c520c1ac9b63528854d0f58c7e1b74", 142234), FANMADE("Osama", "db8f1710453cfbecf4214b2946970043", 390, "7afd75d4620dedf97a84ae8f0a7523cf", 123827), FANMADE("Quest for the Cheat", "a359d4cf27f98264b42b55c017671214", 882, "8a943029f73c4bc85d454b7f473455ba", 455209), + FANMADE("SCI Capture the Flag", "4cd679a51d93b8b27c6b38d81be24b8b", 432, "98ae1f6ed7b4c21f88addbf643dd1d2f", 147878), FANMADE("SCI Companion Template", "ad54d4f504086cd597aa2348d0aa3b09", 354, "6798b7b601ce8154c1d1bc0f0edcdd18", 113061), FANMADE("SCI Studio Template 3.0", "ca0dc8d586e0a8670b7621cde090b532", 354, "58a48ee692a86c0575e6bd0b00a92b9a", 113097), FANMADE("SCI Quest", "9067e1f1e54436d2dbfce855524bc84a", 552, "ffa7d355cd9223f245289108a696bcd2", 149634), + FANMADE("SCI-Man", "3ab85bd39a86c11f85781764f9db09bb", 468, "bb8f9992f504a242bf0860e3588e150b", 131810), + FANMADE("The Farm Nightmare", "fb6cbfddaa7c055e2c3d8cf4c683a7db", 906, "50655e8b8925f717e698e08f006f40be", 338303), + FANMADE("The Gem Scenario", "ef5f61f4d2c6d31122d3e2baf89ad976", 642, "2f16be390dd90c3d7ca1c8a594ac0bfa", 244794), FANMADE("The Legend of the Lost Jewel", "ba1bca315e3818c5626eda51bcfbcccf", 636, "9b0736d69924af0cff32a0f78db96855", 300398), // FIXME: The vga demo does not have a resource.000/001 file. -- cgit v1.2.3 From 15bff499790c56407f8edc85963f5f18c7154c44 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 13:54:04 +0000 Subject: SCI: adding workarounds for eq1cd svn-id: r51419 --- engines/sci/engine/workarounds.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5b08ebbe45..eb8e82ff98 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,8 +58,11 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_ECOQUEST, 400, 400, 0, "rug", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the rug + { GID_ECOQUEST, 400, 400, 0, "cabinet", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet + { GID_ECOQUEST, 400, 400, 0, "certUpper", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the certificate { GID_ECOQUEST, 400, 400, 0, "computer", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the computer + { GID_ECOQUEST, 400, 400, 0, "photo", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the photo + { GID_ECOQUEST, 400, 400, 0, "rug", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the rug { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking @@ -258,6 +261,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000 { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference - bug #3034473 + { GID_ECOQUEST, 380, 61, 0, "gotIt", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after talking to the dolphin the first time { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident - bug #3034902 -- cgit v1.2.3 From 67f4784f32f455c1a217ec48facc042e39712c9b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 14:15:10 +0000 Subject: SCI: adding workarounds for eq1cd svn-id: r51420 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index eb8e82ff98..5723c06c30 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,6 +58,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game + { GID_ECOQUEST, 140, 140, 0, "rm140", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle + { GID_ECOQUEST, 140, 140, 0, "mosaicPuzzle", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle { GID_ECOQUEST, 400, 400, 0, "cabinet", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet { GID_ECOQUEST, 400, 400, 0, "certUpper", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the certificate { GID_ECOQUEST, 400, 400, 0, "computer", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the computer -- cgit v1.2.3 From 00ff92e9e0b112a3016f93c837d918a7b9163b47 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 14:34:32 +0000 Subject: SCI: Remove SCI01 vocab warning, this behavior is normal svn-id: r51421 --- engines/sci/parser/vocabulary.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/parser/vocabulary.cpp b/engines/sci/parser/vocabulary.cpp index 0adcb4a89f..20436d5b30 100644 --- a/engines/sci/parser/vocabulary.cpp +++ b/engines/sci/parser/vocabulary.cpp @@ -50,12 +50,12 @@ Vocabulary::Vocabulary(ResourceManager *resMan, bool foreign) : _resMan(resMan), _resourceIdSuffixes = VOCAB_RESOURCE_SCI0_SUFFIX_VOCAB; _resourceIdBranches = VOCAB_RESOURCE_SCI0_PARSE_TREE_BRANCHES; } else { - warning("Could not find a main vocabulary, trying SCI01"); _vocabVersion = kVocabularySCI1; _resourceIdWords = VOCAB_RESOURCE_SCI1_MAIN_VOCAB; _resourceIdSuffixes = VOCAB_RESOURCE_SCI1_SUFFIX_VOCAB; _resourceIdBranches = VOCAB_RESOURCE_SCI1_PARSE_TREE_BRANCHES; } + if (_foreign) { _resourceIdWords += 10; _resourceIdSuffixes += 10; -- cgit v1.2.3 From 8a843b6c2152ef0019dfbf864fb250af308b6f9e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 14:57:35 +0000 Subject: SCI: adding support for middle mouse button svn-id: r51422 --- engines/sci/event.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index a100dda27c..ee301fff14 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -313,6 +313,10 @@ SciEvent EventManager::getScummVMEvent() { input.type = SCI_EVENT_MOUSE_PRESS; input.data = 2; break; + case Common::EVENT_MBUTTONDOWN: + input.type = SCI_EVENT_MOUSE_PRESS; + input.data = 3; + break; case Common::EVENT_LBUTTONUP: input.type = SCI_EVENT_MOUSE_RELEASE; input.data = 1; @@ -321,6 +325,10 @@ SciEvent EventManager::getScummVMEvent() { input.type = SCI_EVENT_MOUSE_RELEASE; input.data = 2; break; + case Common::EVENT_MBUTTONUP: + input.type = SCI_EVENT_MOUSE_RELEASE; + input.data = 3; + break; // Misc events case Common::EVENT_QUIT: -- cgit v1.2.3 From 191d50171a1afe358be2a56d26c0c50c36231df2 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 15:34:34 +0000 Subject: SCI: Fix bug #3035737 - SCI Fan Games: Incorrect Version Detection If we have a vocab 900 resource with the new decompressors, it can also be SCI0 late. If there is no parser vocab (with new decompressors), it is SCI1 early. svn-id: r51423 --- engines/sci/resource.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 65c9e6f34e..111bf6ad9b 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1938,14 +1938,18 @@ void ResourceManager::detectSciVersion() { return; } - // New decompressors. It's either SCI_VERSION_1_EGA or SCI_VERSION_1_EARLY. - if (hasSci1Voc900()) { - s_sciVersion = SCI_VERSION_1_EGA; - return; + // New decompressors. It's either SCI_VERSION_0_LATE, SCI_VERSION_1_EGA or SCI_VERSION_1_EARLY. + if (testResource(ResourceId(kResourceTypeVocab, 900))) { + if (hasSci1Voc900()) { + s_sciVersion = SCI_VERSION_1_EGA; + return; + } else { + s_sciVersion = SCI_VERSION_0_LATE; + return; + } } - // SCI_VERSION_1_EARLY EGA versions seem to be lacking a valid vocab.900. - // If this turns out to be unreliable, we could do some pic resource checks instead. + // SCI_VERSION_1_EARLY EGA versions lack the parser vocab s_sciVersion = SCI_VERSION_1_EARLY; return; case kResVersionSci1Middle: -- cgit v1.2.3 From e85cf6bfbb01f2691dd7215d765a1f8db81e3159 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 15:48:07 +0000 Subject: SCI: adding eq1cd workaround svn-id: r51424 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5723c06c30..865640878a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -60,6 +60,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, 140, 140, 0, "rm140", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle { GID_ECOQUEST, 140, 140, 0, "mosaicPuzzle", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle + { GID_ECOQUEST, 160, 160, 0, "seatedSenator", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on the senator { GID_ECOQUEST, 400, 400, 0, "cabinet", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet { GID_ECOQUEST, 400, 400, 0, "certUpper", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the certificate { GID_ECOQUEST, 400, 400, 0, "computer", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the computer -- cgit v1.2.3 From 3f5958af78797e1b99ebefafbce38fecfbb27d39 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 16:00:13 +0000 Subject: SCI: Fix compilation when DEBUG_PARSER is defined svn-id: r51425 --- engines/sci/engine/kparse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kparse.cpp b/engines/sci/engine/kparse.cpp index 799cbf63b6..552e425906 100644 --- a/engines/sci/engine/kparse.cpp +++ b/engines/sci/engine/kparse.cpp @@ -63,7 +63,7 @@ reg_t kSaid(EngineState *s, int argc, reg_t *argv) { #ifdef DEBUG_PARSER printf("Said block: "); - g_sci->getVocabulary()->decipherSaidBlock(said_block); + g_sci->getVocabulary()->debugDecipherSaidBlock(said_block); #endif if (voc->parser_event.isNull() || (readSelectorValue(s->_segMan, voc->parser_event, SELECTOR(claimed)))) { -- cgit v1.2.3 From 163f0cf7b5e1f6c21d75e31483bc1b23f7a74bfb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 16:18:03 +0000 Subject: SCI: eq1 workaround compression and new ones svn-id: r51426 --- engines/sci/engine/workarounds.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 865640878a..04030b001e 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,14 +58,11 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_ECOQUEST, 140, 140, 0, "rm140", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle - { GID_ECOQUEST, 140, 140, 0, "mosaicPuzzle", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle + { GID_ECOQUEST, 140, 140, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle { GID_ECOQUEST, 160, 160, 0, "seatedSenator", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on the senator - { GID_ECOQUEST, 400, 400, 0, "cabinet", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet - { GID_ECOQUEST, 400, 400, 0, "certUpper", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the certificate - { GID_ECOQUEST, 400, 400, 0, "computer", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the computer - { GID_ECOQUEST, 400, 400, 0, "photo", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the photo - { GID_ECOQUEST, 400, 400, 0, "rug", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the rug + { GID_ECOQUEST, 180, 180, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on the plant/coral + { GID_ECOQUEST, 200, 200, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on moss or other things :P + { GID_ECOQUEST, 400, 400, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet/certificate/computer/photo/rug { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking @@ -319,11 +316,11 @@ SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroun reg_t searchObject = lastCall->sendp; do { workaround = workaroundList; - while (workaround->objectName) { + while (workaround->methodName) { if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && ((workaround->roomNr == -1) || (workaround->roomNr == curRoomNumber)) && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) - && (workaround->objectName == searchObjectName) + && ((workaround->objectName == NULL) || (workaround->objectName == searchObjectName)) && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->debugLocalCallOffset && ((workaround->index == -1) || (workaround->index == index))) { // Workaround found -- cgit v1.2.3 From cfb1f53d5978d27295b48a77cf67023d955d2969 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 16:58:34 +0000 Subject: SCI: making a global eq1 workaround :P svn-id: r51427 --- engines/sci/engine/workarounds.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 04030b001e..c4869b108c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,11 +58,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_ECOQUEST, 140, 140, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when solving the mosaic puzzle - { GID_ECOQUEST, 160, 160, 0, "seatedSenator", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on the senator - { GID_ECOQUEST, 180, 180, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on the plant/coral - { GID_ECOQUEST, 200, 200, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when clicking on moss or other things :P - { GID_ECOQUEST, 400, 400, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // when looking at the cabinet/certificate/computer/photo/rug + { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking everywhere triggers this in almost all rooms { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking @@ -317,7 +313,8 @@ SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroun do { workaround = workaroundList; while (workaround->methodName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr + if (workaround->gameId == gameId + && ((workaround->scriptNr == -1) || (workaround->scriptNr == curScriptNr)) && ((workaround->roomNr == -1) || (workaround->roomNr == curRoomNumber)) && ((workaround->inheritanceLevel == -1) || (workaround->inheritanceLevel == inheritanceLevel)) && ((workaround->objectName == NULL) || (workaround->objectName == searchObjectName)) -- cgit v1.2.3 From f302469a77c394bb5c4feee915c71370700af63f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 17:39:47 +0000 Subject: SCI: Add workaround for a KQ7 uninitialized temp svn-id: r51428 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index c4869b108c..7c0fc47003 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -83,6 +83,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 500, 500, 0, "rm500", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to island of the beast { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) + { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 24, 0, "gcWin", "", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu (floppy version, which doesn't have a selector vocabulary) - bug #3035694 -- cgit v1.2.3 From 515cc3c369551b15503b982a007b645843a781a1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 17:45:19 +0000 Subject: SCI: Set the LB2 floppy open selector so we don't have to have duplicate workaround entries svn-id: r51429 --- engines/sci/engine/static_selectors.cpp | 7 +++++++ engines/sci/engine/workarounds.cpp | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index c062c4e786..55e18613e0 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -175,6 +175,13 @@ Common::StringArray Kernel::checkStaticSelectorNames() { names.resize(111); names[110] = "init"; + } else if (g_sci->getGameId() == GID_LAURABOW2) { + // The floppy of version needs the open selector set to match up with the CD version's + // workaround - bug #3035694 + if (names.size() < 190) + names.resize(190); + + names[189] = "open"; } #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 7c0fc47003..fa28e40801 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -86,7 +86,6 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_LAURABOW2, -1, 24, 0, "gcWin", "", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu (floppy version, which doesn't have a selector vocabulary) - bug #3035694 { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary - bug #3035068 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room -- cgit v1.2.3 From 78f0e4ce408a3cb76fcdfc8c102c169d1dba43de Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 18:23:43 +0000 Subject: SCI: Add updated detection for al pond 2/new year's mystery (fan games) svn-id: r51430 --- engines/sci/detection_tables.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index d65ea33595..9da5455ceb 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -3145,8 +3145,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { #endif // ENABLE_SCI32 // SCI Fanmade Games - FANMADE("Al Pond 2: Island Quest", "9625372e710d1a95d2027b48f9e325af", 1506, "a0f9aa65b9bf3d8703adff5a621f243c", 889843), FANMADE("Al Pond: Island Quest 2", "4cba6a5a4c8f66f21935ed78b0511a92", 870, "876587dc9a5ec569287a3dc4b29139d8", 613769), + FANMADE("Al Pond 2: Island Quest", "9625372e710d1a95d2027b48f9e325af", 1506, "a0f9aa65b9bf3d8703adff5a621f243c", 889843), + FANMADE("Al Pond 2: Island Quest (Updated)", "64be277cdcc6aafce7d9f26e88ad31a8", 1500, "571547228a212d63315f0c114cf48d54", 885241), FANMADE("Another DG Game: I Want My C64 Back", "4a8ca7ca2abd18899ef856f47665e2e9", 588, "12ff558d20c72e42cc6adb408f34d6d8", 150513), FANMADE_L("Another DG Game: I Want My C64 Back", "13dc1d9ebc57daf8895412eee5e39fea", 576, "e2ad60b3a280171429db5c85f158f84a", 141697, Common::FR_FRA), FANMADE("Aquarius: An Aquatic Experience", "2e23bc3b82f22a454be202ea593fb478", 480, "01555c8de683d25405bda270aa1ff014", 272372), @@ -3162,7 +3163,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { FANMADE("Jim’s Quest 1: The Phantom Thesis", "0af50be1d3f0cb77a09137709a76ef4f", 960, "9c042c136548b20d9183495668e03526", 496446), FANMADE("Knight's Quest Demo 1.0", "5e816edf993956752ed06fccfeeae6d9", 1260, "959321f88a22905fa1f8c6d897874744", 703836), FANMADE("LockerGnome Quest", "3eeff9130206cad0c4e1551e2b9dd2c5", 420, "ae05ca90806fd90cc43f147c82d3547c", 158906), - FANMADE("New Year's Mystery", "efd1beb5120293725065c95959144f81", 714, "b3bd3c2372ed6efa28adb12403c4c31a", 305027), + FANMADE("New Year's Mystery", "e4dcab1b1d3cb4a2c070a07a9c9589e0", 708, "e00ca5e44fd4e98d8174b467b31b0f21", 295425), + FANMADE("New Year's Mystery (Updated)", "efd1beb5120293725065c95959144f81", 714, "b3bd3c2372ed6efa28adb12403c4c31a", 305027), FANMADE("Ocean Battle", "c2304a0568e0eb84f8e9a0915f01170a", 408, "46c520c1ac9b63528854d0f58c7e1b74", 142234), FANMADE("Osama", "db8f1710453cfbecf4214b2946970043", 390, "7afd75d4620dedf97a84ae8f0a7523cf", 123827), FANMADE("Quest for the Cheat", "a359d4cf27f98264b42b55c017671214", 882, "8a943029f73c4bc85d454b7f473455ba", 455209), -- cgit v1.2.3 From 9a1afc5a2473b29a288a808917ed522ac3fac531 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 18:37:13 +0000 Subject: SCI: fix typo in comment svn-id: r51431 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fa28e40801..647d53ae4f 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -58,7 +58,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking everywhere triggers this in almost all rooms + { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From 07b67fe44b20f8f1c9dcdf659f5e2666d69834f4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 28 Jul 2010 19:03:49 +0000 Subject: SCI: Fix using the parser in SCI Fan Games Get a pointer to the said spec instead of copying to a buffer. The fan games use a said spec with size < 64. Also, make said() take a const pointer as the spec cannot change. Thanks to waltervn and wjp. svn-id: r51432 --- engines/sci/graphics/menu.cpp | 10 +++++++--- engines/sci/parser/said.cpp | 4 ++-- engines/sci/parser/vocabulary.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 92c0e92f48..120c43f379 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -397,7 +397,6 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject, bool pauseSound) { GuiMenuItemEntry *itemEntry = NULL; bool forceClaimed = false; EngineState *s; - byte saidSpec[64]; switch (eventType) { case SCI_EVENT_KEYBOARD: @@ -437,8 +436,13 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject, bool pauseSound) { itemEntry = *itemIterator; if (!itemEntry->saidVmPtr.isNull()) { - // TODO: get a pointer to saidVmPtr or make said() work on VmPtrs - _segMan->memcpy(saidSpec, itemEntry->saidVmPtr, 64); + byte *saidSpec = _segMan->derefBulkPtr(itemEntry->saidVmPtr, 0); + + if (!saidSpec) { + warning("Could not dereference saidSpec"); + continue; + } + if (said(s, saidSpec, 0) != SAID_NO_MATCH) break; } diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 0411952f2a..9c07be2dff 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -657,7 +657,7 @@ static bool buildSaidTree() { return true; } -static int said_parse_spec(byte *spec) { +static int said_parse_spec(const byte *spec) { int nextitem; said_token = 0; @@ -996,7 +996,7 @@ static int augment_parse_nodes(ParseTreeNode *parseT, ParseTreeNode *saidT) { /**** Main code ****/ /*******************/ -int said(EngineState *s, byte *spec, bool verbose) { +int said(EngineState *s, const byte *spec, bool verbose) { int retval; Vocabulary *voc = g_sci->getVocabulary(); diff --git a/engines/sci/parser/vocabulary.h b/engines/sci/parser/vocabulary.h index a20508e191..d4df8af715 100644 --- a/engines/sci/parser/vocabulary.h +++ b/engines/sci/parser/vocabulary.h @@ -345,7 +345,7 @@ void vocab_dump_parse_tree(const char *tree_name, ParseTreeNode *nodes); * @param verbose Whether to display the parse tree after building it * @return 1 on a match, 0 otherwise */ -int said(EngineState *s, byte *spec, bool verbose); +int said(EngineState *s, const byte *spec, bool verbose); } // End of namespace Sci -- cgit v1.2.3 From abf53f839a090fe6535390a27142964cd44f2566 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 21:47:15 +0000 Subject: SCI: implement additional variants of kRandom fixes pq1vga poker game (bug #3036125) svn-id: r51435 --- engines/sci/engine/kernel_tables.h | 2 ++ engines/sci/engine/kmath.cpp | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index db19c8ca28..1dfc1d2134 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -407,6 +407,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, + { MAP_CALL(Random), SIG_SCI11, SIGFOR_ALL, "i(i)(i)", NULL, NULL }, + // ^^ they actually changed it in SCI1, but it seems its never called that way ffs. kRandom { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index eab964d624..124a64d913 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -29,10 +29,27 @@ namespace Sci { reg_t kRandom(EngineState *s, int argc, reg_t *argv) { - int fromNumber = argv[0].toUint16(); - int toNumber = argv[1].toUint16(); - double randomNumber = fromNumber + ((toNumber + 1.0 - fromNumber) * (rand() / (RAND_MAX + 1.0))); - return make_reg(0, (int)randomNumber); + // SCI1 actually supported those argcs as well + // SCI0 only supported argc = 1 to reset the seed (no input was used, it was reset to 0) + switch (argc) { + case 1: // set seed to argv[0] + return NULL_REG; + + case 2: { // get random number + int fromNumber = argv[0].toUint16(); + int toNumber = argv[1].toUint16(); + double randomNumber = fromNumber + ((toNumber + 1.0 - fromNumber) * (rand() / (RAND_MAX + 1.0))); + return make_reg(0, (int)randomNumber); + } + + case 3: // get seed + // Actually we would have to return the previous seed + error("kRandom: scripts asked for previous seed"); + break; + + default: + error("kRandom: unsupported argc"); + } } reg_t kAbs(EngineState *s, int argc, reg_t *argv) { -- cgit v1.2.3 From 021c5d11dba67951113e293a14347869316c47e1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 28 Jul 2010 21:55:40 +0000 Subject: SCI: changed kRandom signature accepts 1-3 parameters now for all SCI versions (shouldnt hurt and argc 3 will error() out anyway) changed comments a bit svn-id: r51438 --- engines/sci/engine/kernel_tables.h | 4 +--- engines/sci/engine/kmath.cpp | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 1dfc1d2134..886e918fd8 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -407,9 +407,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(Portrait), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop { MAP_CALL(PrevNode), SIG_EVERYWHERE, "n", NULL, NULL }, { MAP_CALL(PriCoord), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(Random), SIG_SCI11, SIGFOR_ALL, "i(i)(i)", NULL, NULL }, - // ^^ they actually changed it in SCI1, but it seems its never called that way ffs. kRandom - { MAP_CALL(Random), SIG_EVERYWHERE, "ii", NULL, NULL }, + { MAP_CALL(Random), SIG_EVERYWHERE, "i(i)(i)", NULL, NULL }, { MAP_CALL(ReadNumber), SIG_EVERYWHERE, "r", NULL, NULL }, { MAP_CALL(ResCheck), SIG_EVERYWHERE, "ii(iiii)", NULL, NULL }, { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 124a64d913..bdc705cae3 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -29,10 +29,9 @@ namespace Sci { reg_t kRandom(EngineState *s, int argc, reg_t *argv) { - // SCI1 actually supported those argcs as well - // SCI0 only supported argc = 1 to reset the seed (no input was used, it was reset to 0) switch (argc) { case 1: // set seed to argv[0] + // SCI0/SCI01 just reset the seed to 0 instead of using argv[0] at all return NULL_REG; case 2: { // get random number @@ -43,6 +42,7 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) { } case 3: // get seed + // SCI0/01 did not support this at all // Actually we would have to return the previous seed error("kRandom: scripts asked for previous seed"); break; -- cgit v1.2.3 From fb35d46c1d5a2dd1b1b35d3a5a173b7a896c56c6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 22:36:22 +0000 Subject: SCI: Extended the LB2 workaround for bug #3035068 to all rooms. Fixes bug #3036274, "LB2CD: Crash in Police Station, asking about Ziggy" svn-id: r51443 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 647d53ae4f..8b41b7cc28 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -86,7 +86,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_LAURABOW2, 230, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking the reporter about the burglary - bug #3035068 + { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy) - bugs #3035068, #3036274 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) -- cgit v1.2.3 From a2b6b84bfb43266a30dd9106148fe5a469181d7f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 22:41:03 +0000 Subject: SCI: Changed a warning into a debug message svn-id: r51444 --- engines/sci/engine/kpathing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 53063376e7..30804a4a6b 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -944,7 +944,7 @@ static Common::Point *fixup_start_point(PathfindingState *s, const Common::Point } if ((type == POLY_BARRED_ACCESS) || (type == POLY_CONTAINED_ACCESS)) - warning("AvoidPath: start position at unreachable location"); + debug("AvoidPath: start position at unreachable location"); // The original start position is in an invalid location, so we // use the moved point and add the original one to the final path -- cgit v1.2.3 From 9e164f429da370244f92486cacde2e5ef9e25a46 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 23:01:28 +0000 Subject: SCI: Changed another warning into debug output svn-id: r51445 --- engines/sci/engine/kpathing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 30804a4a6b..45a52694dc 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -944,7 +944,7 @@ static Common::Point *fixup_start_point(PathfindingState *s, const Common::Point } if ((type == POLY_BARRED_ACCESS) || (type == POLY_CONTAINED_ACCESS)) - debug("AvoidPath: start position at unreachable location"); + debugC(2, kDebugLevelAvoidPath, "AvoidPath: start position at unreachable location"); // The original start position is in an invalid location, so we // use the moved point and add the original one to the final path @@ -1315,7 +1315,7 @@ static void AStar(PathfindingState *s) { } if (openSet.empty()) - warning("[avoidpath] End point (%i, %i) is unreachable", s->vertex_end->v.x, s->vertex_end->v.y); + debugC(2, kDebugLevelAvoidPath, "AvoidPath: End point (%i, %i) is unreachable", s->vertex_end->v.x, s->vertex_end->v.y); } static reg_t allocateOutputArray(SegManager *segMan, int size) { -- cgit v1.2.3 From 09ae3b7ca4132ca2a2ba466272d5744f0de7aaff Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 23:09:42 +0000 Subject: SCI: Fixed bug #3036291, "LB2CD: Crash in Docks, actor animation" svn-id: r51446 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8b41b7cc28..ec739ba290 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -87,6 +87,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy) - bugs #3035068, #3036274 + { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) -- cgit v1.2.3 From b3230b26a1343afd55e310520208b6424c89e3ea Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 23:21:27 +0000 Subject: SCI: Added forgotten bug number to the previous workaround svn-id: r51448 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ec739ba290..8963e020e7 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -87,7 +87,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy) - bugs #3035068, #3036274 - { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation + { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) -- cgit v1.2.3 From c099127c3dee1eddcb725415e2bf831674da87f3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 28 Jul 2010 23:30:59 +0000 Subject: SCI: Break out instead of continuing when an end point is contained in multiple polygons, while running the avoidpath algorithm (or we'll end up in an infinite loop). Fixes bug #3036299 - "LB2CD: Game Hangs at Speakeasy" svn-id: r51450 --- engines/sci/engine/kpathing.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 45a52694dc..2f96fd9f60 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -988,8 +988,13 @@ static Common::Point *fixup_end_point(PathfindingState *s, const Common::Point & if (cont != CONT_OUTSIDE) { if (s->_appendPoint != NULL) { // We shouldn't get here twice + // Happens in LB2CD, inside the speakeasy when walking from the + // speakeasy (room 310) into the bathroom (room 320), after having + // consulted the notebook (bug #3036299). + // We need to break in this case, otherwise we'll end in an infinite + // loop. warning("AvoidPath: end point is contained in multiple polygons"); - continue; + break; } // The original end position is in an invalid location, so we move the point -- cgit v1.2.3 From b19433e6d38c520f5d774c5f9a1dc19e065fb0be Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 29 Jul 2010 01:05:11 +0000 Subject: SCI: Re-enable the throttle for kFrameout, I must have been asleep that day svn-id: r51451 --- engines/sci/graphics/frameout.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index cea398250b..06dce6d111 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -515,8 +515,7 @@ void GfxFrameout::kernelFrameout() { delete[] itemData; _screen->copyToScreen(); - //g_sci->getEngineState()->_throttleTrigger = true; - // currently disabled because clones computer is too slow :P + g_sci->getEngineState()->_throttleTrigger = true; } } // End of namespace Sci -- cgit v1.2.3 From 3e6f3716acfcc042816f12a9321ad009b389aaf6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 07:17:42 +0000 Subject: SCI: Fixed bug #3036390 - "QFG3: Crash when talking to King Rajah", along with a similar problem later on while talking to the king svn-id: r51455 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8963e020e7..b6cbf3e2bb 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -102,6 +102,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 + { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, 0, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Tarna" + { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, 1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" - bug #3036390 { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From c40b9801dfbde95761521aa560ea1425fded527b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 07:58:48 +0000 Subject: SCI: Silenced warning when exiting in LSL6 (bug report #3035533), and commented out a related unused variable in kSetQuitStr svn-id: r51456 --- engines/sci/engine/kstring.cpp | 2 +- engines/sci/engine/message.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 3a7bb30c80..9254bce9c1 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -566,7 +566,7 @@ reg_t kMessage(EngineState *s, int argc, reg_t *argv) { } reg_t kSetQuitStr(EngineState *s, int argc, reg_t *argv) { - Common::String quitStr = s->_segMan->getString(argv[0]); + //Common::String quitStr = s->_segMan->getString(argv[0]); //debug("Setting quit string to '%s'", quitStr.c_str()); return s->r_acc; } diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index 18e60eb521..8842789c5f 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -380,7 +380,15 @@ void MessageState::outputString(reg_t buf, const Common::String &str) { if ((unsigned)buffer_r.maxSize >= str.size() + 1) { _segMan->strcpy(buf, str.c_str()); } else { - warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); + // LSL6 sets an exit text here, but the buffer size allocated + // is too small. Don't display a warning in this case, as we + // don't use the exit text anyway - bug report #3035533 + const char *foo = str.c_str(); + if (g_sci->getGameId() == GID_LSL6 && str.hasPrefix("\r\n(c) 1993 Sierra On-Line, Inc")) { + // LSL6 buggy exit text, don't show warning + } else { + warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(buf), str.size() + 1, str.c_str()); + } // Set buffer to empty string if possible if (buffer_r.maxSize > 0) -- cgit v1.2.3 From 5d72193c512559394258051208b05f7089bb4c06 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 08:03:16 +0000 Subject: Oops, removed leftover code svn-id: r51457 --- engines/sci/engine/message.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index 8842789c5f..cdecc556e8 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -383,7 +383,6 @@ void MessageState::outputString(reg_t buf, const Common::String &str) { // LSL6 sets an exit text here, but the buffer size allocated // is too small. Don't display a warning in this case, as we // don't use the exit text anyway - bug report #3035533 - const char *foo = str.c_str(); if (g_sci->getGameId() == GID_LSL6 && str.hasPrefix("\r\n(c) 1993 Sierra On-Line, Inc")) { // LSL6 buggy exit text, don't show warning } else { -- cgit v1.2.3 From 82bf2437e34434a05392754b53853e21d27cfdd5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 09:08:20 +0000 Subject: SCI: also break in AvoidPath instead of continuing, when the start point is contained in multiple polygons, otherwise we'll end up in an infinite loop svn-id: r51458 --- engines/sci/engine/kpathing.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 2f96fd9f60..fdebc0599c 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -933,9 +933,11 @@ static Common::Point *fixup_start_point(PathfindingState *s, const Common::Point case POLY_NEAREST_ACCESS: if (cont == CONT_INSIDE) { if (s->_prependPoint != NULL) { - // We shouldn't get here twice + // We shouldn't get here twice. + // We need to break in this case, otherwise we'll end in an infinite + // loop. warning("AvoidPath: start point is contained in multiple polygons"); - continue; + break; } if (s->findNearPoint(start, (*it), new_start) != PF_OK) { @@ -987,7 +989,7 @@ static Common::Point *fixup_end_point(PathfindingState *s, const Common::Point & case POLY_NEAREST_ACCESS: if (cont != CONT_OUTSIDE) { if (s->_appendPoint != NULL) { - // We shouldn't get here twice + // We shouldn't get here twice. // Happens in LB2CD, inside the speakeasy when walking from the // speakeasy (room 310) into the bathroom (room 320), after having // consulted the notebook (bug #3036299). -- cgit v1.2.3 From 6b63c951eb3cd218b496c190359ad705ee043791 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 10:48:54 +0000 Subject: SCI: updating screen within kAnimate as well - fixes pseudo hang in eq1 credits (bug #3036154) svn-id: r51459 --- engines/sci/event.cpp | 12 ++++++++---- engines/sci/event.h | 1 + engines/sci/graphics/animate.cpp | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index ee301fff14..5923e501cf 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -343,16 +343,20 @@ SciEvent EventManager::getScummVMEvent() { return input; } -SciEvent EventManager::getSciEvent(unsigned int mask) { - //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; - SciEvent event = { 0, 0, 0, 0 }; - +void EventManager::updateScreen() { // Update the screen here, since it's called very often. // Throttle the screen update rate to 60fps. if (g_system->getMillis() - g_sci->getEngineState()->_screenUpdateTime >= 1000 / 60) { g_system->updateScreen(); g_sci->getEngineState()->_screenUpdateTime = g_system->getMillis(); } +} + +SciEvent EventManager::getSciEvent(unsigned int mask) { + //sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 }; + SciEvent event = { 0, 0, 0, 0 }; + + EventManager::updateScreen(); // Get all queued events from graphics driver do { diff --git a/engines/sci/event.h b/engines/sci/event.h index 30098b0f6e..fade7dd337 100644 --- a/engines/sci/event.h +++ b/engines/sci/event.h @@ -114,6 +114,7 @@ public: EventManager(bool fontIsExtended); ~EventManager(); + void updateScreen(); SciEvent getSciEvent(unsigned int mask); bool getUsesNewKeyboardDirectionType(); diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index a883f572bb..c637ef8374 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -28,6 +28,7 @@ #include "graphics/primitives.h" #include "sci/sci.h" +#include "sci/event.h" #include "sci/engine/kernel.h" #include "sci/engine/state.h" #include "sci/engine/selector.h" @@ -597,6 +598,10 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t if (_lastCastData.size() > 1) _s->_throttleTrigger = true; + // We update the screen here as well, some scenes like EQ1 credits run w/o calling kGetEvent thus we wouldn't update + // screen at all + g_sci->getEventManager()->updateScreen(); + _ports->setPort(oldPort); } -- cgit v1.2.3 From f22821af666fe89a3635d53f02351273b435c952 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 10:58:01 +0000 Subject: SCI: Added back debug output to sound commands svn-id: r51460 --- engines/sci/sound/soundcmd.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 495cf4b9dd..bd88a5fca8 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -45,6 +45,7 @@ SoundCommandParser::~SoundCommandParser() { } reg_t SoundCommandParser::kDoSoundInit(int argc, reg_t *argv, reg_t acc) { + debugC(2, kDebugLevelSound, "kDoSound(init): %04x:%04x", PRINT_REG(argv[0])); processInitSound(argv[0]); return acc; } @@ -102,6 +103,7 @@ void SoundCommandParser::processInitSound(reg_t obj) { } reg_t SoundCommandParser::kDoSoundPlay(int argc, reg_t *argv, reg_t acc) { + debugC(2, kDebugLevelSound, "kDoSound(play): %04x:%04x", PRINT_REG(argv[0])); processPlaySound(argv[0]); return acc; } @@ -151,6 +153,7 @@ reg_t SoundCommandParser::kDoSoundDummy(int argc, reg_t *argv, reg_t acc) { } reg_t SoundCommandParser::kDoSoundDispose(int argc, reg_t *argv, reg_t acc) { + debugC(2, kDebugLevelSound, "kDoSound(dispose): %04x:%04x", PRINT_REG(argv[0])); processDisposeSound(argv[0]); return acc; } @@ -173,6 +176,7 @@ void SoundCommandParser::processDisposeSound(reg_t obj) { } reg_t SoundCommandParser::kDoSoundStop(int argc, reg_t *argv, reg_t acc) { + debugC(2, kDebugLevelSound, "kDoSound(stop): %04x:%04x", PRINT_REG(argv[0])); processStopSound(argv[0], false); return acc; } @@ -206,6 +210,11 @@ void SoundCommandParser::processStopSound(reg_t obj, bool sampleFinishedPlaying) } reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { + if (argc == 1) + debugC(2, kDebugLevelSound, "kDoSound(pause): %04x:%04x", PRINT_REG(argv[0])); + else + debugC(2, kDebugLevelSound, "kDoSound(pause): %04x:%04x, %04x:%04x", PRINT_REG(argv[0]), PRINT_REG(argv[1])); + if (_soundVersion <= SCI_VERSION_0_LATE) { // SCI0 games give us 0/1 for either resuming or pausing the current music // this one doesn't count, so pausing 2 times and resuming once means here that we are supposed to resume @@ -254,8 +263,11 @@ reg_t SoundCommandParser::kDoSoundResumeAfterRestore(int argc, reg_t *argv, reg_ } reg_t SoundCommandParser::kDoSoundMute(int argc, reg_t *argv, reg_t acc) { - if (argc > 0) + if (argc > 0) { + debugC(2, kDebugLevelSound, "kDoSound(mute): %d", argv[0].toUint16()); _music->soundSetSoundOn(argv[0].toUint16()); + } + return make_reg(0, _music->soundGetSoundOn()); } @@ -325,6 +337,8 @@ reg_t SoundCommandParser::kDoSoundGetPolyphony(int argc, reg_t *argv, reg_t acc) reg_t SoundCommandParser::kDoSoundUpdate(int argc, reg_t *argv, reg_t acc) { reg_t obj = argv[0]; + debugC(2, kDebugLevelSound, "kDoSound(update): %04x:%04x", PRINT_REG(argv[0])); + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("kDoSound(update): Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -441,6 +455,7 @@ reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { uint16 controller = argv[3].toUint16(); uint16 param = argv[4].toUint16(); + debugC(2, kDebugLevelSound, "kDoSound(sendMidi): %04x:%04x, %d, %d, %d, %d", PRINT_REG(obj), channel, midiCmd, controller, param); if (channel) channel--; // channel is given 1-based, we are using 0-based @@ -459,6 +474,7 @@ reg_t SoundCommandParser::kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc) { } reg_t SoundCommandParser::kDoSoundReverb(int argc, reg_t *argv, reg_t acc) { + debugC(2, kDebugLevelSound, "doSoundReverb: %d", argv[0].toUint16() & 0xF); _music->setReverb(argv[0].toUint16() & 0xF); return acc; } @@ -466,6 +482,8 @@ reg_t SoundCommandParser::kDoSoundReverb(int argc, reg_t *argv, reg_t acc) { reg_t SoundCommandParser::kDoSoundSetHold(int argc, reg_t *argv, reg_t acc) { reg_t obj = argv[0]; + debugC(2, kDebugLevelSound, "doSoundSetHold: %04x:%04x, %d", PRINT_REG(argv[0]), argv[1].toUint16()); + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("kDoSound(setHold): Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -535,6 +553,8 @@ reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc) reg_t obj = argv[0]; int16 value = argv[1].toSint16(); + debugC(2, kDebugLevelSound, "kDoSound(setPriority): %04x:%04x, %d", PRINT_REG(obj), value); + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { warning("kDoSound(setPriority): Slot not found (%04x:%04x)", PRINT_REG(obj)); @@ -565,6 +585,8 @@ reg_t SoundCommandParser::kDoSoundSetLoop(int argc, reg_t *argv, reg_t acc) { reg_t obj = argv[0]; int16 value = argv[1].toSint16(); + debugC(2, kDebugLevelSound, "kDoSound(setLoop): %04x:%04x, %d", PRINT_REG(obj), value); + MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { // Apparently, it's perfectly normal for a game to call cmdSetSoundLoop -- cgit v1.2.3 From fd804eb44b3e0f952efc2ffd3c66303e4a1c882c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 29 Jul 2010 11:04:54 +0000 Subject: M4: Further work done on the setup and starting of actions svn-id: r51461 --- engines/m4/mads_logic.cpp | 2 +- engines/m4/mads_logic.h | 2 +- engines/m4/mads_player.cpp | 2 + engines/m4/mads_scene.cpp | 110 ++++++++++++++++++++++++++++++--------------- engines/m4/mads_scene.h | 3 ++ engines/m4/mads_views.cpp | 23 +++++----- engines/m4/mads_views.h | 5 +-- engines/m4/scene.cpp | 1 + engines/m4/scene.h | 1 + 9 files changed, 97 insertions(+), 52 deletions(-) diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index 49ba7e1468..e7c20b237d 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -425,7 +425,7 @@ void MadsSceneLogic::doAction() { warning("Still to do actions logic"); } -void MadsSceneLogic::sceneStep() { +void MadsSceneLogic::doSceneStep() { // TODO: Sound handling switch (_madsVm->scene()->_abortTimers) { diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index b5608dc721..ec6eff368b 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -61,7 +61,7 @@ public: void enterScene(); void doPreactions(); void doAction(); - void sceneStep(); + void doSceneStep(); }; class MadsGameLogic { diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 19cd9eafe5..de09e97640 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -591,6 +591,8 @@ void MadsPlayer::reset() { _destFacing = 5; _newDirection = _direction; + _madsVm->scene()->_action._startWalkFlag = false; + _madsVm->scene()->_action._walkFlag = false; _moving = false; _v844BC = false; _v844C0 = false; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 1f43f73cc0..ca8460a53a 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -252,9 +252,12 @@ void MadsScene::mouseMove(int x, int y) { } void MadsScene::leftClick(int x, int y) { - // **DEBUG** - being used for movement testing - _madsVm->_player.moveComplete(); - _madsVm->_player.setDest(x, y, 2); + // TODO: figure out the rest of Scene_leftClick, and implements relevant parts in the interface class + _action._v86F4C = -1; + _action._v86F4E = 0; + _customDest = _madsVm->_mouse->currentPos(); + _action._selectedAction = -1; + _action._v86F4A = true; } void MadsScene::rightClick(int x, int y) { @@ -308,62 +311,74 @@ void MadsScene::update() { } void MadsScene::updateState() { - if ((_action._selectedAction != 0) || !_madsVm->_player._stepEnabled) - _action.clear(); - if (!_abortTimers && !_madsVm->_player._unk3) { if (_dynamicHotspots._changed) _dynamicHotspots.refresh(); -// int v = (_madsVm->_player._stepEnabled && !_action._verbNounFlag && !_abortTimers2) ? 1 : 0; +// int v = (_madsVm->_player._stepEnabled && !_action._startWalkFlag && !_abortTimers2) ? 1 : 0; // _screenObjects.check(v, false); } // Handle starting off any selected action - bool lookFlag = false; + bool doPreAction = false; if ((_action._selectedAction != 0) && _madsVm->_player._stepEnabled && - !_action._verbNounFlag && !_abortTimers && !_madsVm->_player._unk3) { + !_action._startWalkFlag && !_abortTimers && !_madsVm->_player._unk3) { // Start the action _action.startAction(); - lookFlag = (_action._action.verbId == kVerbLookAt) || (_action._action.verbId == kVerbLook); + if (_action._action.verbId == kVerbLookAt) { + _action._action.verbId = kVerbLook; + _action._savedFields.selectedRow = 0; + } + doPreAction = true; } - if (lookFlag || ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_2))) + if (doPreAction || ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_2))) doPreactions(); checkStartWalk(); - // Update the player - _madsVm->_player.update(); - - // Handle refreshing the mouse position display - if (_mouseMsgIndex != -1) - _madsVm->scene()->_kernelMessages.remove(_mouseMsgIndex); - if (_showMousePos) { - char buffer[20]; - sprintf(buffer, "(%d,%d)", _madsVm->_mouse->currentPos().x, _madsVm->_mouse->currentPos().y); - - _mouseMsgIndex = _madsVm->scene()->_kernelMessages.add(Common::Point(5, 5), 0x203, 0, 0, 1, buffer); + if (_action._inProgress && !_madsVm->_player._moving && !_action._startWalkFlag && + (_madsVm->_player._newDirection == _madsVm->_player._direction)) { + // Reached the end of action movement, so ready to actually do action + doAction(); + } else if ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_0)) + // Do an action designated by scripts + doAction(); + + bool freeFlag = false; + if (_currentScene != _nextScene) + freeFlag = true; + else { + doSceneStep(); + + if (_currentScene != _nextScene) + freeFlag = true; + else { + // Update the player + _madsVm->_player.nextFrame(); + + // Handle updating the animation + if (!_abortTimers && (_activeAnimation)) + _activeAnimation->update(); + + // Handle refreshing the mouse position display + if (_mouseMsgIndex != -1) + _madsVm->scene()->_kernelMessages.remove(_mouseMsgIndex); + if (_showMousePos) { + char buffer[20]; + sprintf(buffer, "(%d,%d)", _madsVm->_mouse->currentPos().x, _madsVm->_mouse->currentPos().y); + + _mouseMsgIndex = _madsVm->scene()->_kernelMessages.add(Common::Point(5, 5), 0x203, 0, 0, 1, buffer); + } + } } if (_madsVm->globals()->_config.easyMouse) _action.refresh(); - - // Step through the scene - _sceneLogic.sceneStep(); - - _madsVm->_player.step(); - _madsVm->_player._unk3 = 0; - - if (_abortTimersMode == ABORTMODE_1) - _abortTimers = 0; - - // Handle updating the player frame - _madsVm->_player.nextFrame(); if ((_activeAnimation) && !_abortTimers) { _activeAnimation->update(); - if (((MadsAnimation *) _activeAnimation)->freeFlag()) { + if (((MadsAnimation *) _activeAnimation)->freeFlag() || freeFlag) { delete _activeAnimation; _activeAnimation = NULL; } @@ -374,12 +389,17 @@ void MadsScene::updateState() { // Remove the animation if it's been completed if ((_activeAnimation) && ((MadsAnimation *)_activeAnimation)->freeFlag()) freeAnimation(); + + if ((_action._selectedAction != 0) || !_madsVm->_player._stepEnabled) { + _action.clear(); + _action._selectedAction = 0; + } } void MadsScene::checkStartWalk() { - if (_action._verbNounFlag && _action._walkFlag) { + if (_action._startWalkFlag && _action._walkFlag) { _madsVm->_player.setDest(_destPos.x, _destPos.y, _destFacing); - _action._verbNounFlag = false; + _action._startWalkFlag = false; } } @@ -395,6 +415,22 @@ void MadsScene::doPreactions() { } } +void MadsScene::doSceneStep() { + // Step through the scene + _sceneLogic.doSceneStep(); + + _madsVm->_player.step(); + _madsVm->_player._unk3 = 0; + + if (_abortTimersMode == ABORTMODE_1) + _abortTimers = 0; +} + +void MadsScene::doAction() { + warning("TODO MadsScene::doAction"); +} + + /** * Does extra work at cleaning up the animation, and then deletes it */ diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index baa6a67861..7723058cc7 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -100,11 +100,14 @@ private: void setAction(); void checkStartWalk(); void doPreactions(); + void doSceneStep(); + void doAction(); public: char _aaName[100]; bool _showMousePos; Common::Point _destPos; int _destFacing; + Common::Point _customDest; public: MadsScene(MadsEngine *vm); virtual ~MadsScene(); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 20d469fedf..6c16e0e611 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -40,9 +40,10 @@ namespace M4 { MadsAction::MadsAction(MadsView &owner): _owner(owner) { clear(); _currentAction = kVerbNone; - _verbNounFlag = false; + _startWalkFlag = false; _statusTextIndex = -1; _selectedAction = 0; + _inProgress = false; } void MadsAction::clear() { @@ -256,7 +257,7 @@ void MadsAction::refresh() { void MadsAction::startAction() { _madsVm->_player.moveComplete(); - _v84538 = -1; + _inProgress = true; _v8453A = 0; _savedFields.selectedRow = _selectedRow; _savedFields.articleNumber = _articleNumber; @@ -274,7 +275,7 @@ void MadsAction::startAction() { if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0)) _v8453A = true; - _verbNounFlag = false; + _startWalkFlag = false; int hotspotId = -1; HotSpotList &dynHotspots = *_madsVm->scene()->getSceneResources().dynamicHotspots; HotSpotList &hotspots = *_madsVm->scene()->getSceneResources().hotspots; @@ -289,11 +290,11 @@ void MadsAction::startAction() { HotSpot &hs = dynHotspots[hotspotId - hotspots.size()]; if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { - _verbNounFlag = true; - _madsVm->scene()->_destPos = _customDest; + _startWalkFlag = true; + _madsVm->scene()->_destPos = _madsVm->scene()->_customDest; } } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { - _verbNounFlag = true; + _startWalkFlag = true; _madsVm->scene()->_destPos.x = hs.getFeetX(); _madsVm->scene()->_destPos.y = hs.getFeetY(); } @@ -306,21 +307,23 @@ void MadsAction::startAction() { HotSpot &hs = hotspots[hotspotId]; if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { - _verbNounFlag = true; - _madsVm->scene()->_destPos = _customDest; + _startWalkFlag = true; + _madsVm->scene()->_destPos = _madsVm->scene()->_customDest; } } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { - _verbNounFlag = true; + _startWalkFlag = true; _madsVm->scene()->_destPos.x = hs.getFeetX(); _madsVm->scene()->_destPos.y = hs.getFeetY(); } _madsVm->scene()->_destFacing = hs.getFacing(); } + + _walkFlag = _startWalkFlag; } void MadsAction::checkAction() { if (isAction(kVerbLookAt) || isAction(kVerbThrow)) - _verbNounFlag = 0; + _startWalkFlag = 0; } bool MadsAction::isAction(int verbId, int objectNameId, int indirectObjectId) { diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 2f4103eaca..c93d0beda3 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -71,12 +71,11 @@ public: int _selectedRow; bool _textChanged; int _selectedAction; - bool _verbNounFlag; + bool _startWalkFlag; int _statusTextIndex; int _hotspotId; MadsActionSavedFields _savedFields; bool _walkFlag; - Common::Point _customDest; // Unknown fields int16 _v86F3A; @@ -85,7 +84,7 @@ public: bool _v86F4A; int16 _v86F4C; int _v83338; - int _v84538; + bool _inProgress; bool _v8453A; public: diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 361d1bad47..8457f2087a 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -61,6 +61,7 @@ Scene::~Scene() { void Scene::loadScene(int sceneNumber) { _previousScene = _currentScene; _currentScene = sceneNumber; + _nextScene = sceneNumber; } void Scene::leaveScene() { diff --git a/engines/m4/scene.h b/engines/m4/scene.h index e6eaed0ab9..9262a7c828 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -79,6 +79,7 @@ private: protected: int _currentScene; int _previousScene; + int _nextScene; GameInterfaceView *_interfaceSurface; M4Surface *_backgroundSurface; M4Surface *_walkSurface; -- cgit v1.2.3 From 28de229b518c91f46fd03758df0fb5d7553c7c02 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 29 Jul 2010 11:41:51 +0000 Subject: M4: Added further code fragments to enable player to move again svn-id: r51462 --- engines/m4/hotspot.cpp | 6 +++--- engines/m4/mads_scene.cpp | 4 +++- engines/m4/mads_views.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/engines/m4/hotspot.cpp b/engines/m4/hotspot.cpp index 4eec50e29d..27180c5eb8 100644 --- a/engines/m4/hotspot.cpp +++ b/engines/m4/hotspot.cpp @@ -185,9 +185,9 @@ void HotSpotList::dump() { uint32 HotSpotList::readHotSpotInteger(Common::SeekableReadStream* hotspotStream) { if (_vm->isM4()) - return hotspotStream->readUint32LE(); + return hotspotStream->readSint32LE(); else - return hotspotStream->readUint16LE(); + return hotspotStream->readSint16LE(); } void HotSpotList::loadHotSpots(Common::SeekableReadStream* hotspotStream, int hotspotCount) { @@ -196,7 +196,7 @@ void HotSpotList::loadHotSpots(Common::SeekableReadStream* hotspotStream, int ho char buffer[256]; uint32 strLength = 0; uint32 index = 0; - uint32 feetX, feetY; + int feetX, feetY; int cursorOffset = (_vm ->isM4()) ? 0 : 1; for (int i = 0; i < hotspotCount; i++) { diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index ca8460a53a..d44fa2a753 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -243,8 +243,10 @@ void MadsScene::mouseMove(int x, int y) { if (currentHotSpot != NULL) { _vm->_mouse->setCursorNum(currentHotSpot->getCursor()); + _action._selectedRow = -1; + _action._actionMode = ACTMODE_NONE; + _action._actionMode2 = ACTMODE2_4; _action._hotspotId = currentHotSpot->getIndex(); - } else { _vm->_mouse->setCursorNum(0); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 6c16e0e611..3e5f0c2ac9 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -299,8 +299,8 @@ void MadsAction::startAction() { _madsVm->scene()->_destPos.y = hs.getFeetY(); } _madsVm->scene()->_destFacing = hs.getFacing(); + hotspotId = -1; } - hotspotId = -1; } if (hotspotId >= 0) { -- cgit v1.2.3 From a64131ec0f588fca6dfadb2a52a5e8f9eb739bba Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 12:43:33 +0000 Subject: SCI: Fixed script bug #3036483 - "LSL2: Crash at the ship" svn-id: r51463 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b6cbf3e2bb..30f03f54a3 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -90,6 +90,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room + { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #3036483 { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory -- cgit v1.2.3 From 7364b9bb2f695918729606a716547d74b62b479c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 13:01:39 +0000 Subject: BUILD: Remove redundant MODULE_DIRS modification svn-id: r51464 --- engines/draci/module.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/engines/draci/module.mk b/engines/draci/module.mk index a172e4b939..1f80737135 100644 --- a/engines/draci/module.mk +++ b/engines/draci/module.mk @@ -17,9 +17,6 @@ MODULE_OBJS := \ surface.o \ walking.o -MODULE_DIRS += \ - engines/draci - # This module can be built as a plugin ifeq ($(ENABLE_DRACI), DYNAMIC_PLUGIN) PLUGIN := 1 -- cgit v1.2.3 From 264d17ccc7644440d4cd3dc64e14f3e0bd431fd4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 13:02:14 +0000 Subject: BUILD: Compile & link certain files only for specific BACKEND values svn-id: r51465 --- backends/module.mk | 47 +++++++++++++++++++++++++++++--------- backends/platform/dc/Makefile | 2 ++ backends/platform/ds/arm9/makefile | 2 ++ backends/platform/ds/module.mk | 1 - backends/platform/n64/Makefile | 2 ++ backends/platform/ps2/Makefile.gdb | 2 ++ backends/platform/ps2/Makefile.ps2 | 2 ++ backends/platform/psp/Makefile | 3 ++- 8 files changed, 48 insertions(+), 13 deletions(-) diff --git a/backends/module.mk b/backends/module.mk index fb48f3d249..e0a3f4c683 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -6,16 +6,9 @@ MODULE_OBJS := \ fs/abstract-fs.o \ fs/stdiostream.o \ fs/amigaos4/amigaos4-fs-factory.o \ - fs/ds/ds-fs-factory.o \ fs/posix/posix-fs-factory.o \ - fs/ps2/ps2-fs-factory.o \ - fs/psp/psp-fs-factory.o \ - fs/psp/psp-stream.o \ fs/symbian/symbian-fs-factory.o \ fs/windows/windows-fs-factory.o \ - fs/wii/wii-fs-factory.o \ - fs/n64/n64-fs-factory.o \ - fs/n64/romfsstream.o \ keymapper/action.o \ keymapper/keymap.o \ keymapper/keymapper.o \ @@ -29,22 +22,54 @@ MODULE_OBJS := \ midi/timidity.o \ midi/dmedia.o \ midi/windows.o \ - plugins/dc/dc-provider.o \ plugins/posix/posix-provider.o \ plugins/sdl/sdl-provider.o \ plugins/win32/win32-provider.o \ - plugins/psp/psp-provider.o \ saves/savefile.o \ saves/default/default-saves.o \ saves/posix/posix-saves.o \ - saves/psp/psp-saves.o \ timer/default/default-timer.o \ - timer/psp/timer.o \ vkeybd/image-map.o \ vkeybd/polygon.o \ vkeybd/virtual-keyboard.o \ vkeybd/virtual-keyboard-gui.o \ vkeybd/virtual-keyboard-parser.o +ifeq ($(BACKEND),dc) +MODULE_OBJS += \ + plugins/dc/dc-provider.o +endif + +ifeq ($(BACKEND),ds) +MODULE_OBJS += \ + fs/ds/ds-fs-factory.o \ + fs/ds/ds-fs.o +endif + +ifeq ($(BACKEND),n64) +MODULE_OBJS += \ + fs/n64/n64-fs-factory.o \ + fs/n64/romfsstream.o +endif + +ifeq ($(BACKEND),ps2) +MODULE_OBJS += \ + fs/ps2/ps2-fs-factory.o +endif + +ifeq ($(BACKEND),psp) +MODULE_OBJS += \ + fs/psp/psp-fs-factory.o \ + fs/psp/psp-stream.o \ + plugins/psp/psp-provider.o \ + saves/psp/psp-saves.o \ + timer/psp/timer.o +endif + +ifeq ($(BACKEND),wii) +MODULE_OBJS += \ + fs/wii/wii-fs-factory.o +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/backends/platform/dc/Makefile b/backends/platform/dc/Makefile index 2dcf9b7a7c..4494e8da78 100644 --- a/backends/platform/dc/Makefile +++ b/backends/platform/dc/Makefile @@ -69,6 +69,8 @@ OBJS := dcmain.o time.o display.o audio.o input.o selector.o icon.o \ MODULE_DIRS += ./ +BACKEND := dc + include $(srcdir)/Makefile.common scummvm.bin : scummvm.elf diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 079e23aec0..c99342c28e 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -251,6 +251,8 @@ ifdef WRAP_MALLOC DEFINES += -DWRAP_MALLOC endif +BACKEND := ds + INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \ -I$(portdir)/data -I$(portdir)/../commoninclude \ -I$(portdir)/source -I$(portdir)/source/mad \ diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index f6b69b3633..5f186f2528 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -8,7 +8,6 @@ PORT_OBJS := \ arm9/source/blitters_arm.o \ arm9/source/cdaudio.o \ arm9/source/dsmain.o \ - ../../fs/ds/ds-fs.o \ arm9/source/gbampsave.o \ arm9/source/scummhelp.o \ arm9/source/osystem_ds.o \ diff --git a/backends/platform/n64/Makefile b/backends/platform/n64/Makefile index 914e6e9c9e..b8b2e61f77 100644 --- a/backends/platform/n64/Makefile +++ b/backends/platform/n64/Makefile @@ -64,6 +64,8 @@ ENABLE_SCUMM = $(ENABLED) OBJS := nintendo64.o osys_n64_base.o osys_n64_events.o osys_n64_utilities.o pakfs_save_manager.o framfs_save_manager.o +BACKEND := n64 + include $(srcdir)/Makefile.common MODULE_DIRS += ./ diff --git a/backends/platform/ps2/Makefile.gdb b/backends/platform/ps2/Makefile.gdb index 41ac58d629..53646a9546 100644 --- a/backends/platform/ps2/Makefile.gdb +++ b/backends/platform/ps2/Makefile.gdb @@ -75,6 +75,8 @@ OBJS := backends/platform/ps2/DmaPipe.o \ MODULE_DIRS += . +BACKEND := ps2 + include $(srcdir)/Makefile.common LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile diff --git a/backends/platform/ps2/Makefile.ps2 b/backends/platform/ps2/Makefile.ps2 index bf7ac0aca0..d2a8d210e4 100644 --- a/backends/platform/ps2/Makefile.ps2 +++ b/backends/platform/ps2/Makefile.ps2 @@ -75,6 +75,8 @@ OBJS := backends/platform/ps2/DmaPipe.o \ MODULE_DIRS += . +BACKEND := ps2 + include $(srcdir)/Makefile.common LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile index 994d201f65..617ef7c8cc 100644 --- a/backends/platform/psp/Makefile +++ b/backends/platform/psp/Makefile @@ -64,7 +64,6 @@ ifeq ($(PSPSDK),) $(error $$(PSPSDK) cannot be obtained.) endif - # Variables for common Scummvm makefile CXX = psp-g++ CXXFLAGS = -O3 -Wall -Wno-multichar -fno-exceptions -fno-rtti @@ -151,6 +150,8 @@ OBJS := powerman.o \ mp3.o \ tests.o +BACKEND := psp + # Include common Scummvm makefile include $(srcdir)/Makefile.common -- cgit v1.2.3 From 2692e55208d8945b24d9a6c451a61856ed601a94 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 13:02:30 +0000 Subject: BUILD: Fix MODULE_DIRS for WinCE port svn-id: r51466 --- backends/platform/wince/module.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backends/platform/wince/module.mk b/backends/platform/wince/module.mk index 6e328b0af4..6b438f91c9 100644 --- a/backends/platform/wince/module.mk +++ b/backends/platform/wince/module.mk @@ -29,7 +29,9 @@ MODULE_OBJS := \ smartLandScale.o MODULE_DIRS += \ - backends/platform/wince/ + backends/platform/wince/ \ + backends/platform/wince/CEgui/ \ + backends/platform/wince/CEkeys/ # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) -- cgit v1.2.3 From d22ebd358dec75762c97f30d8a2fa8630e4268c2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 13:03:21 +0000 Subject: BUILD: Unify how MODULE_DIRS is computed for backends This should help avoid situations where MODULE_DIRS is not set to a complete list of build dirs (which causes troubles with the automatic header dependency detection logic). On the long run, we should replace the relevant code by a macro or also use rules.mk for this (with yet another if/else case add to it). svn-id: r51467 --- backends/platform/android/module.mk | 9 ++++----- backends/platform/dc/module.mk | 9 ++++----- backends/platform/ds/module.mk | 9 ++++----- backends/platform/gp2x/module.mk | 9 ++++----- backends/platform/gp2xwiz/module.mk | 9 ++++----- backends/platform/iphone/module.mk | 9 ++++----- backends/platform/linuxmoto/module.mk | 9 ++++----- backends/platform/n64/module.mk | 9 ++++----- backends/platform/null/module.mk | 9 ++++----- backends/platform/ps2/module.mk | 9 ++++----- backends/platform/psp/module.mk | 9 ++++----- backends/platform/samsungtv/module.mk | 9 ++++----- backends/platform/sdl/module.mk | 9 ++++----- backends/platform/wii/module.mk | 9 ++++----- backends/platform/wince/module.mk | 11 ++++------- 15 files changed, 60 insertions(+), 77 deletions(-) diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk index c7b98b996d..b457b388b1 100644 --- a/backends/platform/android/module.mk +++ b/backends/platform/android/module.mk @@ -3,11 +3,10 @@ MODULE := backends/platform/android MODULE_OBJS := \ android.o asset-archive.o video.o -MODULE_DIRS += \ - backends/platform/android/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) JAVA_SRC = \ $(MODULE)/org/inodes/gus/scummvm/ScummVM.java \ diff --git a/backends/platform/dc/module.mk b/backends/platform/dc/module.mk index eecb91909c..c52ca1a474 100644 --- a/backends/platform/dc/module.mk +++ b/backends/platform/dc/module.mk @@ -3,8 +3,7 @@ MODULE := backends/platform/dc MODULE_OBJS := dcmain.o time.o display.o audio.o input.o selector.o icon.o \ label.o vmsave.o softkbd.o dcloader.o cache.o dc-fs.o -MODULE_DIRS += \ - backends/platform/dc/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index 5f186f2528..7298267db4 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -98,11 +98,10 @@ $(MODULE)/arm9/source/touchkeyboard.o: \ MODULE_DIRS += \ - backends/platform/ds/ \ backends/platform/ds/arm7/source/ \ backends/platform/ds/arm7/source/libcartreset/ \ - backends/platform/ds/arm9/source/ \ - backends/platform/ds/arm9/source/fat/ -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/gp2x/module.mk b/backends/platform/gp2x/module.mk index 50a771219a..d4f145c64f 100644 --- a/backends/platform/gp2x/module.mk +++ b/backends/platform/gp2x/module.mk @@ -7,8 +7,7 @@ MODULE_OBJS := \ graphics.o \ gp2x.o \ -MODULE_DIRS += \ - backends/platform/gp2x/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/gp2xwiz/module.mk b/backends/platform/gp2xwiz/module.mk index f457d51615..edf2f2a717 100644 --- a/backends/platform/gp2xwiz/module.mk +++ b/backends/platform/gp2xwiz/module.mk @@ -6,11 +6,10 @@ MODULE_OBJS := \ gp2xwiz-hw.o \ gp2xwiz-main.o -MODULE_DIRS += \ - backends/platform/gp2xwiz/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) # Hack to ensure the SDL backend is built so we can use OSystem_SDL. -include $(srcdir)/backends/platform/sdl/module.mk \ No newline at end of file diff --git a/backends/platform/iphone/module.mk b/backends/platform/iphone/module.mk index 28bc8d3ac7..9768e6ded4 100644 --- a/backends/platform/iphone/module.mk +++ b/backends/platform/iphone/module.mk @@ -10,8 +10,7 @@ MODULE_OBJS := \ iphone_keyboard.o \ blit_arm.o -MODULE_DIRS += \ - backends/platform/iphone/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/linuxmoto/module.mk b/backends/platform/linuxmoto/module.mk index 8123d6e2ac..316ecbf78e 100644 --- a/backends/platform/linuxmoto/module.mk +++ b/backends/platform/linuxmoto/module.mk @@ -7,11 +7,10 @@ MODULE_OBJS := \ linuxmoto-sdl.o \ hardwarekeys.o -MODULE_DIRS += \ - backends/platform/linuxmoto/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) # HACK: The linuxmoto backend is based on the SDL one, so we load that, too. include $(srcdir)/backends/platform/sdl/module.mk diff --git a/backends/platform/n64/module.mk b/backends/platform/n64/module.mk index 34a7badb44..8fb6ba49ab 100644 --- a/backends/platform/n64/module.mk +++ b/backends/platform/n64/module.mk @@ -3,8 +3,7 @@ MODULE := backends/platform/n64 MODULE_OBJS := \ nintendo64.o -MODULE_DIRS += \ - backends/platform/n64/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/null/module.mk b/backends/platform/null/module.mk index 12a2cbc510..30345d7ac2 100644 --- a/backends/platform/null/module.mk +++ b/backends/platform/null/module.mk @@ -3,8 +3,7 @@ MODULE := backends/platform/null MODULE_OBJS := \ null.o -MODULE_DIRS += \ - backends/platform/null/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/ps2/module.mk b/backends/platform/ps2/module.mk index 86b12cb668..bf95a5501d 100644 --- a/backends/platform/ps2/module.mk +++ b/backends/platform/ps2/module.mk @@ -18,8 +18,7 @@ MODULE_OBJS := \ ps2time.o \ ps2debug.o -MODULE_DIRS += \ - backends/platform/ps2/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/psp/module.mk b/backends/platform/psp/module.mk index 855554e980..4652189ab4 100644 --- a/backends/platform/psp/module.mk +++ b/backends/platform/psp/module.mk @@ -19,8 +19,7 @@ MODULE_OBJS := powerman.o \ mp3.o \ tests.o -MODULE_DIRS += \ - backends/platform/psp/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/samsungtv/module.mk b/backends/platform/samsungtv/module.mk index 27e2cfa77d..d7ebe75080 100644 --- a/backends/platform/samsungtv/module.mk +++ b/backends/platform/samsungtv/module.mk @@ -5,8 +5,7 @@ MODULE_OBJS := \ main.o \ samsungtv.o -MODULE_DIRS += \ - backends/platform/samsungtv/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index f6ec769253..43751a57b2 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -7,8 +7,7 @@ MODULE_OBJS := \ main.o \ sdl.o -MODULE_DIRS += \ - backends/platform/sdl/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/wii/module.mk b/backends/platform/wii/module.mk index cf55a182c0..88e75fba26 100644 --- a/backends/platform/wii/module.mk +++ b/backends/platform/wii/module.mk @@ -8,8 +8,7 @@ MODULE_OBJS := \ osystem_sfx.o \ osystem_events.o -MODULE_DIRS += \ - backends/platform/wii/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) diff --git a/backends/platform/wince/module.mk b/backends/platform/wince/module.mk index 6b438f91c9..2d852670f8 100644 --- a/backends/platform/wince/module.mk +++ b/backends/platform/wince/module.mk @@ -28,10 +28,7 @@ MODULE_OBJS := \ PocketSCUMM.o \ smartLandScale.o -MODULE_DIRS += \ - backends/platform/wince/ \ - backends/platform/wince/CEgui/ \ - backends/platform/wince/CEkeys/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) +# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. +MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) +OBJS := $(MODULE_OBJS) $(OBJS) +MODULE_DIRS += $(sort $(dir $(MODULE_OBJS))) -- cgit v1.2.3 From a113986dc29ec6a6d53d48af7e06212a42be0c46 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 29 Jul 2010 13:45:52 +0000 Subject: SCI: Add detection for the April 2010 competition template (fan game) svn-id: r51469 --- engines/sci/detection_tables.h | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 9da5455ceb..da3763b236 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -3170,6 +3170,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { FANMADE("Quest for the Cheat", "a359d4cf27f98264b42b55c017671214", 882, "8a943029f73c4bc85d454b7f473455ba", 455209), FANMADE("SCI Capture the Flag", "4cd679a51d93b8b27c6b38d81be24b8b", 432, "98ae1f6ed7b4c21f88addbf643dd1d2f", 147878), FANMADE("SCI Companion Template", "ad54d4f504086cd597aa2348d0aa3b09", 354, "6798b7b601ce8154c1d1bc0f0edcdd18", 113061), + FANMADE("SCI Programming April 2010 Competition Template", "36e5c4011dd7c92e1ae4c6fede7d698d", 456, "20c87fbb7f73e2a3eb2c5dfab4d76b5a", 142221), FANMADE("SCI Studio Template 3.0", "ca0dc8d586e0a8670b7621cde090b532", 354, "58a48ee692a86c0575e6bd0b00a92b9a", 113097), FANMADE("SCI Quest", "9067e1f1e54436d2dbfce855524bc84a", 552, "ffa7d355cd9223f245289108a696bcd2", 149634), FANMADE("SCI-Man", "3ab85bd39a86c11f85781764f9db09bb", 468, "bb8f9992f504a242bf0860e3588e150b", 131810), -- cgit v1.2.3 From 9b6c78a4fed90b5b9fa98e77994f74645ee5fb47 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 15:24:19 +0000 Subject: SCI: Fixed bug #3036331 - "KQ5: Floppy version crashes after title", together with a related problem (kRedrawBox is called erroneously with an additional parameter when any dialog is closed) svn-id: r51470 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 30f03f54a3..2200dccb4b 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -220,6 +220,8 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { { GID_SQ4, 410, 410, 0, "swimAfterEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, 411, 411, 0, "swimAndShoot", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // skateOrama when "swimming" in the air - accidental additional parameter specified { GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified + { GID_KQ5, -1, 981, 0, "myWindow", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing any dialog box, accidental additional parameter specified - bug #3036331 + { GID_KQ5, -1, 995, 0, "invW", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing the inventory window, accidental additional parameter specified SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 123d1f6bf6a489fc7333292e2c34b8ff38276097 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 15:40:09 +0000 Subject: Extended the workaround for KQ5 French floppy for the German floppy too. Fixes bug #3035396 - "KQ5: Crash when start the game" svn-id: r51471 --- engines/sci/engine/script.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 6f4c272649..469fada5ba 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -474,8 +474,10 @@ void Script::initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId) { obj->initSpecies(segMan, addr); if (!obj->initBaseObject(segMan, addr)) { - if (_nr == 202 && g_sci->getGameId() == GID_KQ5 && g_sci->getSciLanguage() == K_LANG_FRENCH) { - // Script 202 of KQ5 French has an invalid object. This is non-fatal. + if (_nr == 202 && g_sci->getGameId() == GID_KQ5 && + (g_sci->getSciLanguage() == K_LANG_FRENCH || g_sci->getSciLanguage() == K_LANG_GERMAN)) { + // WORKAROUND: Script 202 of KQ5 French and German has an invalid object. This is non-fatal. + // Refer to bug #3035396. } else { error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); } -- cgit v1.2.3 From c61ed6e3aafeb6bd3ef200ee81b9912291b224a7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 15:50:53 +0000 Subject: SCI: Removed the language check from the KQ5 workaround, as there could be an issue with other non-English versions, too (e.g. the Spanish floppy version) svn-id: r51472 --- engines/sci/engine/script.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 469fada5ba..645094d9ec 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -474,10 +474,10 @@ void Script::initialiseObjectsSci0(SegManager *segMan, SegmentId segmentId) { obj->initSpecies(segMan, addr); if (!obj->initBaseObject(segMan, addr)) { - if (_nr == 202 && g_sci->getGameId() == GID_KQ5 && - (g_sci->getSciLanguage() == K_LANG_FRENCH || g_sci->getSciLanguage() == K_LANG_GERMAN)) { - // WORKAROUND: Script 202 of KQ5 French and German has an invalid object. This is non-fatal. - // Refer to bug #3035396. + if (_nr == 202 && g_sci->getGameId() == GID_KQ5) { + // WORKAROUND: Script 202 of KQ5 French and German + // (perhaps Spanish too?) has an invalid object. + // This is non-fatal. Refer to bug #3035396. } else { error("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); } -- cgit v1.2.3 From 8de57b0b2942cfd039c5bef47699809f2b5ccc60 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 16:24:08 +0000 Subject: DS: Get rid of DS_NON_SCUMM_BUILD and DS_SCUMM_BUILD svn-id: r51473 --- backends/platform/ds/arm9/makefile | 24 ++++++++++++------------ backends/platform/ds/arm9/source/dsoptions.cpp | 6 ------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index c99342c28e..fac50178b4 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -110,7 +110,7 @@ USE_ARM_COSTUME_ASM = 1 #WRAP_MALLOC = 1 ifdef DS_BUILD_A - DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A -DUSE_ARM_GFX_ASM -DUSE_ARM_COSTUME_ASM + DEFINES = -DDS_BUILD_A -DUSE_ARM_GFX_ASM -DUSE_ARM_COSTUME_ASM LOGO = logoa.bmp ENABLE_SCUMM = STATIC_PLUGIN USE_ARM_GFX_ASM = 1 @@ -118,7 +118,7 @@ ifdef DS_BUILD_A endif ifdef DS_BUILD_B - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_B + DEFINES = -DDS_BUILD_B LOGO = logob.bmp ENABLE_SKY = STATIC_PLUGIN ENABLE_QUEEN = STATIC_PLUGIN @@ -126,14 +126,14 @@ ifdef DS_BUILD_B endif ifdef DS_BUILD_C - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_C + DEFINES = -DDS_BUILD_C LOGO = logoc.bmp ENABLE_AGOS = STATIC_PLUGIN BUILD=scummvm-C endif ifdef DS_BUILD_D - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_D + DEFINES = -DDS_BUILD_D LOGO = logod.bmp ENABLE_GOB = STATIC_PLUGIN ENABLE_CINE = STATIC_PLUGIN @@ -142,42 +142,42 @@ ifdef DS_BUILD_D endif ifdef DS_BUILD_E - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_E + DEFINES = -DDS_BUILD_E LOGO = logoe.bmp ENABLE_SAGA = STATIC_PLUGIN BUILD=scummvm-E endif ifdef DS_BUILD_F - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_F + DEFINES = -DDS_BUILD_F LOGO = logof.bmp ENABLE_KYRA = STATIC_PLUGIN BUILD=scummvm-F endif ifdef DS_BUILD_G - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_G + DEFINES = -DDS_BUILD_G LOGO = logog.bmp ENABLE_LURE = STATIC_PLUGIN BUILD=scummvm-G endif ifdef DS_BUILD_H - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_H + DEFINES = -DDS_BUILD_H LOGO = logoh.bmp ENABLE_PARALLACTION = STATIC_PLUGIN BUILD=scummvm-H endif ifdef DS_BUILD_I - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_I + DEFINES = -DDS_BUILD_I LOGO = logoi.bmp ENABLE_MADE = STATIC_PLUGIN BUILD=scummvm-I endif ifdef DS_BUILD_K - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_K + DEFINES = -DDS_BUILD_K LOGO = logok.bmp ENABLE_CRUISE = STATIC_PLUGIN BUILD=scummvm-K @@ -185,14 +185,14 @@ endif #ifdef DS_BUILD_L -# DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_L +# DEFINES = -DDS_BUILD_L # LOGO = logog.bmp # ENABLE_DRASCULA = STATIC_PLUGIN # BUILD=scummvm-K #endif #ifdef DS_BUILD_M -# DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_M +# DEFINES = -DDS_BUILD_M # LOGO = logog.bmp # ENABLE_TUCKER = STATIC_PLUGIN # BUILD=scummvm-K diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index cc89c41017..6721a4910a 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -128,12 +128,6 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _radioButtonMode = false; -#ifdef DS_SCUMM_BUILD - if (!DS::isGBAMPAvailable()) { -// addButton(this, 100, 140, "Delete Save", 0, 'dels', 'D'); - } -#endif - // new GUI::StaticTextWidget(this, 90, 10, 130, 15, "ScummVM DS Options", Graphics::kTextAlignCenter); -- cgit v1.2.3 From 148c830d769aaf4fd4e08e46284d419ff0c93f18 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 29 Jul 2010 16:24:25 +0000 Subject: DS: Add WRAP_MALLOC support to ds.mk, update comments svn-id: r51474 --- backends/platform/ds/ds.mk | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 27309663d1..97f104c391 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -12,6 +12,11 @@ # build I: --enable-made --disable-mad # build K: --enable-cruise --disable-mad # +# However, this could be automated using a simple script, which generates +# subdirs for each build, and runs configure in those subdirs with the right +# parameters (all builds would still share the same set of source code files, +# thanks to our "out of tree" building support). +# # This does not currently take care of some things: # * It does not #define DS_BUILD_A etc. -- most uses of that should be # eliminated, though. Only usage should be for selecting the default config @@ -21,6 +26,9 @@ # too; we need to investigate those. # * It does not currently adjust the logo. Ideally, if we ever get real plugin # support, that should be necessary anymore anyway. +# * No support for USE_DEBUGGER and USE_PROFILER yet. I envision that we would +# integrate them with the --enable-debug and --enable-profiling configure options, +# I simply haven't gotten around to do that yet. # * ... # Set location of ndsdir so that we can easily refer to files in it @@ -59,6 +67,12 @@ LOGO = logoa.bmp # folder. +ifdef WRAP_MALLOC + LDFLAGS += -Wl,--wrap,malloc + DEFINES += -DWRAP_MALLOC +endif + + # Compiler options for files which should be optimised for speed OPT_SPEED := -O3 -- cgit v1.2.3 From 41ed8b438944025628b2e5a002ea3815b694fd22 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 17:22:38 +0000 Subject: SCI: some subfunction support for logkernel svn-id: r51475 --- engines/sci/engine/kernel.cpp | 29 ++++++++++++++++++++++++----- engines/sci/engine/kernel.h | 3 ++- engines/sci/engine/vm.cpp | 19 ++++++++++++++++--- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 58ac35462e..a7e5ab208a 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -654,9 +654,15 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { if (strcmp(kernelName, "*")) { for (uint id = 0; id < _kernelFuncs.size(); id++) { if (_kernelFuncs[id].name) { - if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { - _kernelFuncs[id].debugLogging = logging; - return true; + if (!_kernelFuncs[id].subFunctions) { + // No sub-functions, enable actual kernel function + if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { + _kernelFuncs[id].debugLogging = logging; + return true; + } + } else { + // Sub-Functions available + // TODO: do this } } } @@ -664,8 +670,21 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { } // Set debugLogging for all calls for (uint id = 0; id < _kernelFuncs.size(); id++) { - if (_kernelFuncs[id].name) - _kernelFuncs[id].debugLogging = logging; + if (_kernelFuncs[id].name) { + if (!_kernelFuncs[id].subFunctions) { + // No sub-functions, enable actual kernel function + _kernelFuncs[id].debugLogging = logging; + } else { + // Sub-Functions available, enable those too + KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions; + uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount; + for (uint subId = 0; subId < kernelSubCallCount; subId++) { + if (kernelSubCall->function) + kernelSubCall->debugLogging = logging; + kernelSubCall++; + } + } + } } return true; } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 227eb19c01..285e746349 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -126,6 +126,7 @@ struct KernelSubFunction { const char *name; uint16 *signature; const SciWorkaroundEntry *workarounds; + bool debugLogging; }; struct KernelFunction { @@ -133,7 +134,7 @@ struct KernelFunction { const char *name; uint16 *signature; const SciWorkaroundEntry *workarounds; - const KernelSubFunction *subFunctions; + KernelSubFunction *subFunctions; uint16 subFunctionCount; bool debugLogging; }; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 6625387b56..b7f6896a48 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -647,9 +647,19 @@ static void addKernelCallToExecStack(EngineState *s, int kernelCallNr, int argc, xstack->type = EXEC_STACK_TYPE_KERNEL; } -static void logKernelCall(const KernelFunction *kernelCall, EngineState *s, int argc, reg_t *argv, reg_t result) { +static void logKernelCall(const KernelFunction *kernelCall, const KernelSubFunction *kernelSubCall, EngineState *s, int argc, reg_t *argv, reg_t result) { Kernel *kernel = g_sci->getKernel(); - printf("k%s: ", kernelCall->name); + if (!kernelSubCall) { + printf("k%s: ", kernelCall->name); + } else { + int callNameLen = strlen(kernelCall->name); + if (strncmp(kernelCall->name, kernelSubCall->name, callNameLen) == 0) { + const char *subCallName = kernelSubCall->name + callNameLen; + printf("k%s(%s): ", kernelCall->name, subCallName); + } else { + printf("k%s(%s): ", kernelCall->name, kernelSubCall->name); + } + } for (int parmNr = 0; parmNr < argc; parmNr++) { if (parmNr) printf(", "); @@ -732,7 +742,7 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { s->r_acc = kernelCall.function(s, argc, argv); if (kernelCall.debugLogging) - logKernelCall(&kernelCall, s, argc, argv, s->r_acc); + logKernelCall(&kernelCall, NULL, s, argc, argv, s->r_acc); } else { // Sub-functions available, check signature and call that one directly if (argc < 1) @@ -780,6 +790,9 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { error("[VM] k%s: subfunction-id %d requested, but not available", kernelCall.name, subId); addKernelCallToExecStack(s, kernelCallNr, argc, argv); s->r_acc = kernelSubCall.function(s, argc, argv); + + if (kernelSubCall.debugLogging) + logKernelCall(&kernelCall, &kernelSubCall, s, argc, argv, s->r_acc); } // Remove callk stack frame again, if there's still an execution stack -- cgit v1.2.3 From 483f25b9e68daf41800e4dd51b7740e010782b18 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 17:26:56 +0000 Subject: SCI: fixing qfg1 workaround svn-id: r51476 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 2200dccb4b..a36a0c9b57 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -148,7 +148,7 @@ const SciWorkaroundEntry kDisplay_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisposeScript_workarounds[] = { { GID_LAURABOW, 777, 777, 0, "myStab", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: after the will is signed, parameter 0 is an object - bug #3034907 - { GID_QFG1, 64, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object + { GID_QFG1, -1, 64, 0, "rm64", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving graveyard, parameter 0 is an object { GID_SQ4, 150, 151, 0, "fightScript", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during fight with vohaul, parameter 0 is an object { GID_SQ4, 150, 152, 0, "driveCloseUp", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when choosing "beam download", parameter 0 is an object SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From bc54fde8e1f58b910026644d606ba140aa3032c4 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 29 Jul 2010 19:08:07 +0000 Subject: SCI: Ignore setAttribute() on any non-existent menu items This fixes two fan games: Al Pond 2 and Aquarius. The original interpreter did this as well. svn-id: r51477 --- engines/sci/graphics/menu.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 120c43f379..630626c128 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -271,14 +271,15 @@ GuiMenuItemEntry *GfxMenu::findItem(uint16 menuId, uint16 itemId) { void GfxMenu::kernelSetAttribute(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value) { GuiMenuItemEntry *itemEntry = findItem(menuId, itemId); + if (!itemEntry) { - // Check if the game actually has a menu. PQ2 demo calls this, for example, but has no menus. - // (bug report #3034507) - if (_itemList.size() == 0) - return; - else - error("Tried to setAttribute() on non-existant menu-item %d:%d", menuId, itemId); + // PQ2 demo calls this, for example, but has no menus (bug report #3034507). Some SCI + // fan games (Al Pond 2, Aquarius) call this too on non-existent menu items. The + // original interpreter ignored these as well. + debugC(2, kDebugLevelGraphics, "Tried to setAttribute() on non-existent menu-item %d:%d", menuId, itemId); + return; } + switch (attributeId) { case SCI_MENU_ATTRIBUTE_ENABLED: itemEntry->enabled = value.isNull() ? false : true; -- cgit v1.2.3 From 3e8a972602663810465414cd9aad6dddab6a2f14 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Thu, 29 Jul 2010 19:11:49 +0000 Subject: DC: Specialize createConfig{Read,Write}Stream Implement platform-specific variants of createConfigReadStream() and createConfigWriteStream(), instead of inheriting the BaseBackend definitions. Nonstandard behavious is as follows: * createConfigWriteStream() always returns 0 (read-only filesystem) * createConfigReadStream() returns an empty MemoryReadStream instead of NULL if scummvm.ini does not exist. This is to make sure that loadDefaultConfigFile() always clears out any old config data, as I'll want to restart config parsing from scratch after a disc swap. svn-id: r51478 --- backends/platform/dc/dc.h | 3 +++ backends/platform/dc/dcmain.cpp | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h index e87a0a8c90..057ab283cf 100644 --- a/backends/platform/dc/dc.h +++ b/backends/platform/dc/dc.h @@ -233,6 +233,9 @@ class OSystem_Dreamcast : private DCHardware, public BaseBackend, public Filesys Common::SaveFileManager *createSavefileManager(); + + Common::SeekableReadStream *createConfigReadStream(); + Common::WriteStream *createConfigWriteStream(); }; diff --git a/backends/platform/dc/dcmain.cpp b/backends/platform/dc/dcmain.cpp index 5a9286093f..5fde919650 100644 --- a/backends/platform/dc/dcmain.cpp +++ b/backends/platform/dc/dcmain.cpp @@ -31,6 +31,7 @@ #include "icon.h" #include "DCLauncherDialog.h" #include +#include #include "backends/plugins/dc/dc-provider.h" #include "sound/mixer_intern.h" @@ -206,6 +207,16 @@ void OSystem_Dreamcast::getTimeAndDate(TimeDate &td) const { td.tm_year = t.tm_year; } +Common::SeekableReadStream *OSystem_Dreamcast::createConfigReadStream() { + Common::FSNode file("/scummvm.ini"); + Common::SeekableReadStream *s = file.createReadStream(); + return s? s : new Common::MemoryReadStream((const byte *)"", 0); +} + +Common::WriteStream *OSystem_Dreamcast::createConfigWriteStream() { + return 0; +} + void DCHardware::dc_init_hardware() { #ifndef NOSERIAL -- cgit v1.2.3 From e9234b61d671141761ea77e88302180d9d55b2f9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 19:48:17 +0000 Subject: SCI: Fixed Hoyle 3 bugs #3035077, #3035080, #3035081 and #3035242, by using the "completed" case removed in rev #50921 for Hoyle 3 svn-id: r51479 --- engines/sci/engine/kmovement.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index f6e6790e66..9ff5b6e339 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -347,8 +347,13 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { writeSelectorValue(segMan, client, SELECTOR(signal), (signal | kSignalHitObstacle)); debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover)); - // we shall not set completed in this case, sierra sci also doesn't do it + // We shall not set completed in this case, sierra sci also doesn't do it // if we set call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work + // Update: however, it seems that Hoyle 3 (full and demo) does need to end here. + // TODO/FIXME: Find out why Hoyle 3 needs this. + // The following fixes bugs #3035077, #3035080, #3035081 and #3035242 + if (g_sci->getGameId() == GID_HOYLE3) + completed = 1; } if ((getSciVersion() >= SCI_VERSION_1_EGA)) -- cgit v1.2.3 From 630127bc077e56c619c816a89e1d577c38b5eafb Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Thu, 29 Jul 2010 20:37:56 +0000 Subject: DC: Let scummvm.ini override autodetect of games If a game CD has a scummvm.ini file with at least one game domain in it, the normal autodetection is now bypassed and a menu of only the games in the .ini file is presented instead. The descriptions of the games are taken from the .ini file, but icons are still scanned for in the old fashion. Note that previously ScummVM would read global options from the scummvm.ini file on the boot disc (if present), but now global options are instead taken from the scummvm.ini on the game disc (in case of a disc swap). svn-id: r51480 --- backends/platform/dc/selector.cpp | 98 ++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp index 0d8e0a0188..0d9b931d2c 100644 --- a/backends/platform/dc/selector.cpp +++ b/backends/platform/dc/selector.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include "dc.h" #include "icon.h" #include "label.h" @@ -200,12 +201,43 @@ static bool uniqueGame(const char *base, const char *dir, return true; } -static int findGames(Game *games, int max) +static int findGames(Game *games, int max, bool use_ini) { Dir *dirs = new Dir[MAX_DIR]; - int curr_game = 0, curr_dir = 0, num_dirs = 1; - dirs[0].node = Common::FSNode(""); - while (curr_game < max && curr_dir < num_dirs) { + int curr_game = 0, curr_dir = 0, num_dirs = 0; + + if (use_ini) { + ConfMan.loadDefaultConfigFile(); + Common::ConfigManager::DomainMap &game_domains = ConfMan.getGameDomains(); + for(Common::ConfigManager::DomainMap::const_iterator i = + game_domains.begin(); curr_game < max && i != game_domains.end(); i++) { + Common::String path = (*i)._value["path"]; + if (path.size() && path.lastChar() != '/') + path += "/"; + int j; + for (j=0; j= num_dirs) { + if (num_dirs >= MAX_DIR) + continue; + dirs[j = num_dirs++].node = Common::FSNode(path); + } + if (curr_game < max) { + strcpy(games[curr_game].filename_base, (*i)._key.c_str()); + strncpy(games[curr_game].dir, dirs[j].node.getPath().c_str(), 256); + games[curr_game].dir[255] = '\0'; + games[curr_game].language = Common::UNK_LANG; + games[curr_game].platform = Common::kPlatformUnknown; + strcpy(games[curr_game].text, (*i)._value["description"].c_str()); + curr_game++; + } + } + } else { + dirs[num_dirs++].node = Common::FSNode(""); + } + + while ((curr_game < max || use_ini) && curr_dir < num_dirs) { strncpy(dirs[curr_dir].name, dirs[curr_dir].node.getPath().c_str(), 252); dirs[curr_dir].name[251] = '\0'; dirs[curr_dir].deficon[0] = '\0'; @@ -214,44 +246,46 @@ static int findGames(Game *games, int max) for (Common::FSList::const_iterator entry = fslist.begin(); entry != fslist.end(); ++entry) { if (entry->isDirectory()) { - if (num_dirs < MAX_DIR && strcasecmp(entry->getDisplayName().c_str(), - "install")) { + if (!use_ini && num_dirs < MAX_DIR && + strcasecmp(entry->getDisplayName().c_str(), "install")) { dirs[num_dirs].node = *entry; num_dirs++; } } else if (isIcon(*entry)) strcpy(dirs[curr_dir-1].deficon, entry->getDisplayName().c_str()); - else + else if(!use_ini) files.push_back(*entry); } - GameList candidates = EngineMan.detectGames(files); - - for (GameList::const_iterator ge = candidates.begin(); - ge != candidates.end(); ++ge) - if (curr_game < max) { - strcpy(games[curr_game].filename_base, ge->gameid().c_str()); - strcpy(games[curr_game].dir, dirs[curr_dir-1].name); - games[curr_game].language = ge->language(); - games[curr_game].platform = ge->platform(); - if (uniqueGame(games[curr_game].filename_base, - games[curr_game].dir, - games[curr_game].language, - games[curr_game].platform, games, curr_game)) { - - strcpy(games[curr_game].text, ge->description().c_str()); + if (!use_ini) { + GameList candidates = EngineMan.detectGames(files); + + for (GameList::const_iterator ge = candidates.begin(); + ge != candidates.end(); ++ge) + if (curr_game < max) { + strcpy(games[curr_game].filename_base, ge->gameid().c_str()); + strcpy(games[curr_game].dir, dirs[curr_dir-1].name); + games[curr_game].language = ge->language(); + games[curr_game].platform = ge->platform(); + if (uniqueGame(games[curr_game].filename_base, + games[curr_game].dir, + games[curr_game].language, + games[curr_game].platform, games, curr_game)) { + + strcpy(games[curr_game].text, ge->description().c_str()); #if 0 - printf("Registered game <%s> (l:%d p:%d) in <%s> <%s> because of <%s> <*>\n", - games[curr_game].text, - (int)games[curr_game].language, - (int)games[curr_game].platform, - games[curr_game].dir, games[curr_game].filename_base, - dirs[curr_dir-1].name); + printf("Registered game <%s> (l:%d p:%d) in <%s> <%s> because of <%s> <*>\n", + games[curr_game].text, + (int)games[curr_game].language, + (int)games[curr_game].platform, + games[curr_game].dir, games[curr_game].filename_base, + dirs[curr_dir-1].name); #endif - curr_game++; + curr_game++; + } } - } + } } for (int i=0; ifunction) + kernelSubCall->debugLogging = logging; + kernelSubCall++; + } + } } } } diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 64a94ee510..c3315bd2b5 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -598,7 +598,7 @@ MusicEntry::MusicEntry() { priority = 0; loop = 0; volume = MUSIC_VOLUME_DEFAULT; - hold = 0; + hold = -1; pauseCounter = 0; sampleLoopCounter = 0; diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h index 943a5bd2a8..37e3c30030 100644 --- a/engines/sci/sound/music.h +++ b/engines/sci/sound/music.h @@ -71,7 +71,7 @@ public: byte priority; uint16 loop; int16 volume; - byte hold; + int16 hold; int16 pauseCounter; uint sampleLoopCounter; -- cgit v1.2.3 From 4101d4095716fee32ff1f3a4583d4b17eb7bab2f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 21:33:42 +0000 Subject: SCI: finished logkernel command use 'logkernel DoSound' on to log calls to all kDoSound subfunctions. use 'logkernel DoSoundPlay' to log calls to kDoSound(play) svn-id: r51483 --- engines/sci/engine/kernel.cpp | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 70a0166b15..9c5997f4ee 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -652,30 +652,37 @@ void Kernel::mapFunctions() { bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { if (strcmp(kernelName, "*")) { - const char *kernelSubName = strchr(kernelName, '('); - uint kernelSubNameLen = 0; - if (kernelSubName) { - kernelSubName++; - kernelSubNameLen = strlen(kernelSubName); - if ((!kernelSubNameLen) || (kernelSubName[kernelSubNameLen - 1] != ')')) - return false; - } for (uint id = 0; id < _kernelFuncs.size(); id++) { if (_kernelFuncs[id].name) { - if (!_kernelFuncs[id].subFunctions) { - // No sub-functions, enable actual kernel function - if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { - _kernelFuncs[id].debugLogging = logging; + if (strcmp(kernelName, _kernelFuncs[id].name) == 0) { + if (_kernelFuncs[id].subFunctions) { + // sub-functions available and main name matched, in that case set logging of all sub-functions + KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions; + uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount; + for (uint subId = 0; subId < kernelSubCallCount; subId++) { + if (kernelSubCall->function) + kernelSubCall->debugLogging = logging; + kernelSubCall++; + } return true; } + // function name matched, set for this one and exit + _kernelFuncs[id].debugLogging = logging; + return true; } else { - // Sub-Functions available - if (kernelSubName) { + // main name was not matched + if (_kernelFuncs[id].subFunctions) { + // Sub-Functions available KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions; uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount; for (uint subId = 0; subId < kernelSubCallCount; subId++) { - if (kernelSubCall->function) - kernelSubCall->debugLogging = logging; + if (kernelSubCall->function) { + if (strcmp(kernelName, kernelSubCall->name) == 0) { + // sub-function name matched, set for this one and exit + kernelSubCall->debugLogging = logging; + return true; + } + } kernelSubCall++; } } -- cgit v1.2.3 From df9f4b5bfeee75319440cab3b2cd54a6ed1ef8f8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 22:04:23 +0000 Subject: SCI: reverting r51479 and adding TODOs for fixing the hoyle issue (fixing this properly should make credits etc. appear and solve all the other issues that clone submitted) svn-id: r51484 --- engines/sci/engine/kmovement.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 9ff5b6e339..95654ce90f 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -328,6 +328,8 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { bool collision = false; reg_t cantBeHere = NULL_REG; + // FIXME here -> cantBeHere detection doesn't work in hoyle 3 + // it's using kCanBeHere but it just has a selector called cantBeHere, so this here doesn't work if (SELECTOR(cantBeHere) != -1) { invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv); if (!s->r_acc.isNull()) @@ -349,17 +351,14 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision", PRINT_REG(mover)); // We shall not set completed in this case, sierra sci also doesn't do it // if we set call .moveDone in those cases qfg1 vga gate at the castle and lsl1 casino door will not work - // Update: however, it seems that Hoyle 3 (full and demo) does need to end here. - // TODO/FIXME: Find out why Hoyle 3 needs this. - // The following fixes bugs #3035077, #3035080, #3035081 and #3035242 - if (g_sci->getGameId() == GID_HOYLE3) - completed = 1; } if ((getSciVersion() >= SCI_VERSION_1_EGA)) if (completed) invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); + // FIXME here -> cantBeHere detection doesn't work in hoyle 3 + // it's using kCanBeHere but it just has a selector called cantBeHere, so this here doesn't work if (SELECTOR(cantBeHere) != -1) return cantBeHere; return make_reg(0, completed); -- cgit v1.2.3 From 2c9d30290e1bdeef0407dc8061c7a9ca3abb9542 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 29 Jul 2010 22:52:48 +0000 Subject: SCI: fixing hoyle 3 hoyle 3 is using kCanBeHere, but it has cantBeHere and canBeHere selectors so our auto detection would fail it also has a cantBeHere stub in Actor, thus it won't set acc at all. We reset acc because of that before calling cantBeHere selector (!) of the actors (canBeHere isnt used) so that we wont get a collision otherwise because acc is non zero when calling kDoBresen (fixes all sorts of bugs, clone2727 should clean it up :P svn-id: r51485 --- engines/sci/engine/kernel.cpp | 7 +++++-- engines/sci/engine/kmovement.cpp | 7 +++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 9c5997f4ee..d76199c794 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -716,8 +716,11 @@ void Kernel::setDefaultKernelNames(GameFeatures *features) { _kernelNames = Common::StringArray(s_defaultKernelNames, ARRAYSIZE(s_defaultKernelNames)); // Some (later) SCI versions replaced CanBeHere by CantBeHere - if (_selectorCache.cantBeHere != -1) - _kernelNames[0x4d] = "CantBeHere"; + if (_selectorCache.cantBeHere != -1) { + // hoyle 3 has cantBeHere selector but is assuming to call kCanBeHere + if (g_sci->getGameId() != GID_HOYLE3) + _kernelNames[0x4d] = "CantBeHere"; + } switch (getSciVersion()) { case SCI_VERSION_0_EARLY: diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 95654ce90f..114b6eb755 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -328,9 +328,10 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { bool collision = false; reg_t cantBeHere = NULL_REG; - // FIXME here -> cantBeHere detection doesn't work in hoyle 3 - // it's using kCanBeHere but it just has a selector called cantBeHere, so this here doesn't work if (SELECTOR(cantBeHere) != -1) { + // adding this here for hoyle 3 to get happy. CantBeHere is a dummy in hoyle 3 and acc is != 0 so we would + // get a collision otherwise + s->r_acc = NULL_REG; invokeSelector(s, client, SELECTOR(cantBeHere), argc, argv); if (!s->r_acc.isNull()) collision = true; @@ -357,8 +358,6 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { if (completed) invokeSelector(s, mover, SELECTOR(moveDone), argc, argv); - // FIXME here -> cantBeHere detection doesn't work in hoyle 3 - // it's using kCanBeHere but it just has a selector called cantBeHere, so this here doesn't work if (SELECTOR(cantBeHere) != -1) return cantBeHere; return make_reg(0, completed); -- cgit v1.2.3 From a17e3c444917ca90dfd537c2102a6150e7ffe977 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 29 Jul 2010 23:58:47 +0000 Subject: SCI: Fixed script bug #3036601 - "LONGBOW: Druid hand code brings up ScummVM console", along with a related bug after giving an answer through the hand code svn-id: r51486 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a36a0c9b57..0db73e34d5 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -88,6 +88,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy) - bugs #3035068, #3036274 { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 + { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an aswer using the druid hand sign code in any room + { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #3036483 -- cgit v1.2.3 From ffe7dcaa6b24efe7ee33483f0427c5094898656a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 05:25:09 +0000 Subject: SCI: Fixed script bug #3036918 - "HOYLE3: Uninitialized read for temp 1" svn-id: r51494 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0db73e34d5..88e5aeda69 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -69,6 +69,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 504, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu + { GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3036918 { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game -- cgit v1.2.3 From d4aa4bc4d49e01d2e66cace53d3194a9d51a4b91 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 05:31:20 +0000 Subject: SCI: Fixed script bug #3036942 - "KQ4SCI demo: Menu crash" svn-id: r51496 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 88e5aeda69..076ddea63b 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -161,6 +161,7 @@ const SciWorkaroundEntry kDisposeScript_workarounds[] = { const SciWorkaroundEntry kDoSoundFade_workarounds[] = { { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) - bug #3035149 { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 + { GID_KQ4, -1, 989, 0, "mySound", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in the demo when trying to open the non-existent menu with 0:0 - bug #3036942 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #3034567 SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From c77eefad2481320f59f015b81abb59d67d997556 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 06:18:28 +0000 Subject: SCI: Added a case for 10 params inside kSetCursorSci11(), thus fixing the crash from bug #3034973 - "PHARKAS: Crash early in game' svn-id: r51497 --- engines/sci/engine/kgraphics.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 56518f10bf..db5b7d1482 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -174,6 +174,12 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { } case 5: case 9: + case 10: // Freddy Pharkas, when using the whiskey glass to read + // the prescription (bug #3034973) - looks like an erroneous + // extra param + // TODO: We don't really use parameter indices 6-10 (with no side + // effects), are they used for something, or are these a result of + // script bugs? hotspot = new Common::Point(argv[3].toSint16(), argv[4].toSint16()); // Fallthrough case 3: -- cgit v1.2.3 From 7c190074c19c500533619246069f22d997ddbbaf Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 07:05:40 +0000 Subject: SCI: Added PQ2 1.001.006 from bug report #3028479 svn-id: r51498 --- engines/sci/detection_tables.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index da3763b236..3e47031c49 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2076,6 +2076,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Police Quest 2 English DOS 1.001.006 (supplied by merkur-kun in bug report #3028479) + {"pq2", "", { + {"resource.map", 0, "8e1161c684b342742d30f938a4839a4b", 4518}, + {"resource.001", 0, "77f02def3094af804fd2371db25b7100", 506563}, + {"resource.002", 0, "77f02def3094af804fd2371db25b7100", 541261}, + {"resource.003", 0, "77f02def3094af804fd2371db25b7100", 587511}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Police Quest 2 - Japanese PC-98 // SCI interpreter version unknown {"pq2", "", { -- cgit v1.2.3 From a9a0451b15779bc7e9b792a49ff07bb0cff8d3fb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 07:11:57 +0000 Subject: SCI: Updated some comments related to Freddy Pharkas and silenced warning for kDoAudio subop 13 svn-id: r51499 --- engines/sci/engine/kgraphics.cpp | 2 +- engines/sci/engine/ksound.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index db5b7d1482..3316269e53 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -177,7 +177,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { case 10: // Freddy Pharkas, when using the whiskey glass to read // the prescription (bug #3034973) - looks like an erroneous // extra param - // TODO: We don't really use parameter indices 6-10 (with no side + // TODO: We don't really use parameter indices 5-9 (with no side // effects), are they used for something, or are these a result of // script bugs? hotspot = new Common::Point(argv[3].toSint16(), argv[4].toSint16()); diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 4e5ddc5e96..a8dc0eff16 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -222,16 +222,17 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { // 3 new subops in Pharkas. kDoAudio in Pharkas sits at seg026:038C case 11: + // Not sure where this is used yet warning("kDoAudio: Unhandled case 11, %d extra arguments passed", argc - 1); break; case 12: - // Seems to be audio sync, used in Pharkas. Silenced the warning due to - // the high level of spam it produces. + // Seems to be some sort of audio sync, used in Pharkas. Silenced the + // warning due to the high level of spam it produces. (takes no params) //warning("kDoAudio: Unhandled case 12, %d extra arguments passed", argc - 1); break; case 13: - // Used in Pharkas whenever a speech sample starts - warning("kDoAudio: Unhandled case 13, %d extra arguments passed", argc - 1); + // Used in Pharkas whenever a speech sample starts (takes no params) + //warning("kDoAudio: Unhandled case 13, %d extra arguments passed", argc - 1); break; default: warning("kDoAudio: Unhandled case %d, %d extra arguments passed", argv[0].toUint16(), argc - 1); -- cgit v1.2.3 From 034fb5343fcc71b095d8d29c3d3c4586c38ac9c9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 08:21:54 +0000 Subject: SCI: cleaning up kSetCursor showing warning about unsupported mag-cursor when argc = 10 is used removing argc = 9 support, must have been a script bug somewhere svn-id: r51500 --- engines/sci/engine/kernel_tables.h | 3 ++- engines/sci/engine/kgraphics.cpp | 12 +++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 886e918fd8..f78bbf39a3 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -418,7 +418,8 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, { MAP_CALL(SetCursor), SIG_SCI21, SIGFOR_ALL, "i(i)([io])(i*)", NULL, NULL }, // TODO: SCI2.1 may supply an object optionally (mother goose sci21 right on startup) - find out why - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i*)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(iiiiii)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i)(i)(i)(i)", NULL, NULL }, { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 3316269e53..954c306e0c 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -173,13 +173,6 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { break; } case 5: - case 9: - case 10: // Freddy Pharkas, when using the whiskey glass to read - // the prescription (bug #3034973) - looks like an erroneous - // extra param - // TODO: We don't really use parameter indices 5-9 (with no side - // effects), are they used for something, or are these a result of - // script bugs? hotspot = new Common::Point(argv[3].toSint16(), argv[4].toSint16()); // Fallthrough case 3: @@ -188,6 +181,11 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { else g_sci->_gfxCursor->kernelSetView(argv[0].toUint16(), argv[1].toUint16(), argv[2].toUint16(), hotspot); break; + case 10: + // Freddy pharkas, when using the whiskey glass to read the prescription (bug #3034973) + // magnifier support, disabled using argc == 1, argv == -1 + warning("kSetCursor: unsupported magnifier"); + break; default : error("kSetCursor: Unhandled case: %d arguments given", argc); break; -- cgit v1.2.3 From 2fc1461f2bee59da2517a2373005deaae3dd6e0b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 08:44:40 +0000 Subject: SCI: arguments of mag-kSetCursor documented adding primitive support to just set the cursor to the required view resource, nothing else implemented yet svn-id: r51501 --- engines/sci/engine/kgraphics.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 954c306e0c..6df26b04cc 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -185,6 +185,13 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { // Freddy pharkas, when using the whiskey glass to read the prescription (bug #3034973) // magnifier support, disabled using argc == 1, argv == -1 warning("kSetCursor: unsupported magnifier"); + // we just set the view cursor currently + g_sci->_gfxCursor->kernelSetView(argv[5].toUint16(), argv[6].toUint16(), argv[7].toUint16(), hotspot); + // argv[0] -> 1, 2, 4 -> maybe magnification multiplier + // argv[1-4] -> rect for magnification + // argv[5, 6, 7] -> view resource for cursor + // argv[8] -> picture resource for mag + // argv[9] -> color for magnifier replacement break; default : error("kSetCursor: Unhandled case: %d arguments given", argc); -- cgit v1.2.3 From 1532685d821322549a448e15fb438e7a96d82c33 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Fri, 30 Jul 2010 09:32:54 +0000 Subject: PSP: optimized memcpy some more and fixed memcpy testing Found that the particular implementation was producing messy assembly for misaligned copies. Improved it and also fixed up wrapping the memcpy, which would cause endless prints in case memcpy testing is asked for. svn-id: r51503 --- backends/platform/psp/memory.cpp | 71 +++++++++++++++++++++------------------- backends/platform/psp/memory.h | 1 - 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/backends/platform/psp/memory.cpp b/backends/platform/psp/memory.cpp index 8eef223f8c..29d0482d9a 100644 --- a/backends/platform/psp/memory.cpp +++ b/backends/platform/psp/memory.cpp @@ -39,9 +39,17 @@ extern "C" { +#ifdef TEST_MEMORY_COPY /* we won't be able to run in this case b/c of printouts */ +extern void *__real_memcpy(void *dst, void *src, size_t bytes); +#endif + void *__wrap_memcpy(void *dst, void *src, size_t bytes) { +#ifdef TEST_MEMORY_COPY /* we won't be able to run in this case */ + return __real_memcpy(dst, src, bytes); +#else PspMemory::fastCopy((byte *)dst, (byte *)src, bytes); return dst; +#endif } } @@ -291,43 +299,31 @@ void PspMemory::copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, u PSP_DEBUG_PRINT("copy32Misaligned: dst32[%p], src[%p], bytes[%d], alignSrc[%d]\n", dst32, src, bytes, alignSrc); uint32 *src32 = (uint32 *)(((uint32)src) & 0xFFFFFFFC); // remove misalignment - uint32 offset; + uint32 shiftValue, lastShiftValue; switch (alignSrc) { case 1: - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 8, 24); + shiftValue = 8; + lastShiftValue = 24; break; case 2: - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 16, 16); + shiftValue = 16; + lastShiftValue = 16; break; default: /* 3 */ - offset = misaligned32Detail(dst32, src32, bytes, alignSrc, 24, 8); + shiftValue = 24; + lastShiftValue = 8; break; } - - uint32 remainingBytes = bytes & 3; - - if (remainingBytes) { - byte *dst = (byte *)dst32; - src += offset; - dst += offset; - copy8(dst, src, remainingBytes); - } -} -// returns offset in dst -uint32 PspMemory::misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue) { - uint32 *origDst32 = dst32; - register uint32 dstWord, srcWord; - - PSP_DEBUG_PRINT("misaligned32Detail(): alignSrc[%d], dst32[%p], src32[%p], bytes[%d]\n", alignSrc, dst32, src32, bytes); - + uint32 dstWord, srcWord; + // Try to do groups of 4 words uint32 words4 = bytes >> 4; - srcWord = src32[0]; - - while (words4--) { + srcWord = *src32; // preload 1st word so we read ahead + + for (; words4; words4--) { dstWord = srcWord >> shiftValue; srcWord = src32[1]; dstWord |= srcWord << lastShiftValue; @@ -348,22 +344,29 @@ uint32 PspMemory::misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, dst32 += 4; } - uint32 words = (bytes & 0xF) >> 2; + uint32 words = (bytes & 0xF) >> 2; // now get remaining words // we read one word ahead of what we write // setup the first read - if (words) { - src32++; // we already loaded the value, so just increment + + for (; words ;words--) { + dstWord = srcWord >> shiftValue; + srcWord = src32[1]; // we still go one ahead + src32++; + dstWord |= srcWord << lastShiftValue; + *dst32++ = dstWord; + } + + uint32 bytesLeft = bytes & 3; // and remaining bytes - while (words--) { - dstWord = srcWord >> shiftValue; - srcWord = *src32++; - dstWord |= srcWord << lastShiftValue; - *dst32++ = dstWord; + if (bytesLeft) { + byte *dst8 = (byte *)dst32; + byte *src8 = ((byte *)src32) + ((uint32)src & 0x3); // get exact location we should be at + + for(; bytesLeft; bytesLeft--) { + *dst8++ = *src8++; } } - - return (byte *)dst32 - (byte *)origDst32; } // More challenging -- need to shift diff --git a/backends/platform/psp/memory.h b/backends/platform/psp/memory.h index c9b3d21cb6..793bc94888 100644 --- a/backends/platform/psp/memory.h +++ b/backends/platform/psp/memory.h @@ -52,7 +52,6 @@ private: static void copy32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes); static void swap32Aligned(uint32 *dst32, const uint32 *src32, uint32 bytes, PSPPixelFormat &format); static void copy32Misaligned(uint32 *dst32, const byte *src, uint32 bytes, uint32 alignSrc); - static uint32 misaligned32Detail(uint32 *dst32, uint32 *src32, uint32 bytes, uint32 alignSrc, const uint32 shiftValue, const uint32 lastShiftValue); static void swap32Misaligned(uint32 *dst32, const uint16 *src16, uint32 bytes, PSPPixelFormat &format); static void copy16(uint16 *dst, const uint16 *src, uint32 bytes); -- cgit v1.2.3 From 241e76d19d15a07d378e642effea28cc256ff47c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 12:40:06 +0000 Subject: SCI: Fixed script bug #3036263, "LB2CD: Disappearing Journal Entries" by changing the return value of the workarounds made for bugs #3036274 and #3035068. The game scripts perform lt on the uninitialized temp, and if it's smaller than expected they start removing journal entries svn-id: r51504 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 076ddea63b..64d62c3e11 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -87,7 +87,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy) - bugs #3035068, #3036274 + { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE,0xff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an aswer using the druid hand sign code in any room { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601 -- cgit v1.2.3 From 28eea504e9518baed9862037b16fbaf66ceab106 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 12:46:47 +0000 Subject: SCI: Adjusted return value of the script bug workaround in rev #51504 to a bigger number, just in case svn-id: r51505 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 64d62c3e11..e4329bb42f 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -87,7 +87,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE,0xff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 + { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an aswer using the druid hand sign code in any room { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601 -- cgit v1.2.3 From c665b9e9a7c7e860119cdd2b4fae76d39d276a81 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 13:29:33 +0000 Subject: Merged the two QFG3 workarounds and the two SQ1 workarounds svn-id: r51506 --- engines/sci/engine/workarounds.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index e4329bb42f..822144b280 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -89,7 +89,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 - { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an aswer using the druid hand sign code in any room + { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an answer using the druid hand sign code in any room { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601 { GID_LSL1, 250, 250, 0, "increase", "handleEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // casino, playing game, increasing bet { GID_LSL1, 720, 720, 0, "rm720", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // age check room @@ -106,10 +106,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 - { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, 0, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Tarna" - { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, 1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" - bug #3036390 - { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad - { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, 2, { WORKAROUND_FAKE, 0 } }, // spanish (and maybe early versions?) only: when moving cursor over input pad + { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) + { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin -- cgit v1.2.3 From 5b401215d9e0a31687c27b8b56ba3d651b89e000 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 14:56:38 +0000 Subject: SCI: Added handling of negative numbers to op_mod for SCI01 and newer games. Fixes the battlecruiser mini-game in SQ5. Many thanks to lskovlun, wjp and m_kiewitz for their joined effort on this issue svn-id: r51508 --- engines/sci/engine/vm.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b7f6896a48..0ab66419c0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1069,11 +1069,17 @@ void run_vm(EngineState *s) { case op_mod: { // 0x05 (05) r_temp = POP32(); - int16 modulo, value; - if (validate_signedInteger(s->r_acc, modulo) && validate_signedInteger(r_temp, value)) - s->r_acc = make_reg(0, (modulo != 0 ? value % modulo : 0)); - else + int16 modulo, value, result; + if (validate_signedInteger(s->r_acc, modulo) && validate_signedInteger(r_temp, value)) { + modulo = ABS(modulo); + result = (modulo != 0 ? value % modulo : 0); + // In SCI01, handling for negative numbers was added + if (getSciVersion() >= SCI_VERSION_01 && result < 0) + result += modulo; + s->r_acc = make_reg(0, result); + } else { s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); + } break; } -- cgit v1.2.3 From cbbafc138b897387f702e541a0bf873348604179 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Jul 2010 15:19:21 +0000 Subject: SCI: Updated the op_mod changes and added a link to the original bug report svn-id: r51509 --- engines/sci/engine/vm.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 0ab66419c0..d849d3e008 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1069,16 +1069,29 @@ void run_vm(EngineState *s) { case op_mod: { // 0x05 (05) r_temp = POP32(); - int16 modulo, value, result; - if (validate_signedInteger(s->r_acc, modulo) && validate_signedInteger(r_temp, value)) { - modulo = ABS(modulo); - result = (modulo != 0 ? value % modulo : 0); - // In SCI01, handling for negative numbers was added - if (getSciVersion() >= SCI_VERSION_01 && result < 0) - result += modulo; - s->r_acc = make_reg(0, result); + + if (getSciVersion() <= SCI_VERSION_0_LATE) { + uint16 modulo, value; + if (validate_unsignedInteger(s->r_acc, modulo) && validate_unsignedInteger(r_temp, value)) + s->r_acc = make_reg(0, (modulo != 0 ? value % modulo : 0)); + else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); } else { - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); + // In Iceman (and perhaps from SCI0 0.000.685 onwards in general), + // handling for negative numbers was added. Since Iceman doesn't + // seem to have issues with the older code, we exclude it for now + // for simplicity's sake and use the new code for SCI01 and newer + // games. Fixes the battlecruiser mini game in SQ5 (room 850), + // bug #3035755 + int16 modulo, value, result; + if (validate_signedInteger(s->r_acc, modulo) && validate_signedInteger(r_temp, value)) { + modulo = ABS(modulo); + result = (modulo != 0 ? value % modulo : 0); + if (result < 0) + result += modulo; + s->r_acc = make_reg(0, result); + } else + s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); } break; } -- cgit v1.2.3 From c785645123493b8087a869e9f96e645898d51bfc Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 15:26:30 +0000 Subject: SCI: adding workaround for kSetCursor kq5cd adding comments as well svn-id: r51510 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kgraphics.cpp | 1 + engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index f78bbf39a3..9652d4c25c 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -419,7 +419,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(SetCursor), SIG_SCI21, SIGFOR_ALL, "i(i)([io])(i*)", NULL, NULL }, // TODO: SCI2.1 may supply an object optionally (mother goose sci21 right on startup) - find out why { MAP_CALL(SetCursor), SIG_SCI11, SIGFOR_ALL, "i(i)(i)(i)(iiiiii)", NULL, NULL }, - { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i)(i)(i)(i)", NULL, NULL }, + { MAP_CALL(SetCursor), SIG_EVERYWHERE, "i(i)(i)(i)(i)", NULL, kSetCursor_workarounds }, { MAP_CALL(SetDebug), SIG_EVERYWHERE, "(i*)", NULL, NULL }, { MAP_CALL(SetJump), SIG_EVERYWHERE, "oiii", NULL, NULL }, { MAP_CALL(SetMenu), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6df26b04cc..b2ff83aa1e 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -172,6 +172,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { } break; } + case 9: // case for kq5cd, we are getting calling with 4 additional 900d parameters case 5: hotspot = new Common::Point(argv[3].toSint16(), argv[4].toSint16()); // Fallthrough diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 822144b280..fa1f3d7eca 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -253,6 +253,12 @@ const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kSetCursor_workarounds[] = { + { GID_KQ5, -1, 768, 0, "KQCursor", "init", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // CD: gets called with 4 additional "900d" parameters + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index d509d300d7..6fa08b8a69 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -90,6 +90,7 @@ extern const SciWorkaroundEntry kIsObject_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; extern const SciWorkaroundEntry kNewWindow_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; +extern const SciWorkaroundEntry kSetCursor_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; -- cgit v1.2.3 From 6dd5dfb7d0aa7e1d64f2e49ed3017dcceef6dbb1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 16:08:27 +0000 Subject: SCI: fixing font code handling in kTextSize fixes incorrect window proportions in sq5 when hailing ship at clorox II svn-id: r51511 --- engines/sci/graphics/text16.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 08be203230..61737cad05 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -233,9 +233,6 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF void GfxText16::Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight) { uint16 curChar; - GuiResourceId oldFontId = GetFontId(); - int16 oldPenColor = _ports->_curPort->penClr; - textWidth = 0; textHeight = 0; GetFont(); @@ -264,13 +261,17 @@ void GfxText16::Width(const char *text, int16 from, int16 len, GuiResourceId org } } } - SetFont(oldFontId); - _ports->penColor(oldPenColor); return; } void GfxText16::StringWidth(const char *str, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight) { + GuiResourceId oldFontId = GetFontId(); + int16 oldPenColor = _ports->_curPort->penClr; + Width(str, 0, (int16)strlen(str), orgFontId, textWidth, textHeight); + + SetFont(oldFontId); + _ports->penColor(oldPenColor); } void GfxText16::ShowString(const char *str, GuiResourceId orgFontId, int16 orgPenColor) { -- cgit v1.2.3 From 6aa228ccd8343b865f1ace5f0d404ee4714df5ed Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 16:23:09 +0000 Subject: SCI: fixing another text color code issue (sq5 some dialog boxes again using wrong font in rare cases) svn-id: r51512 --- engines/sci/graphics/text16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 61737cad05..b0c302297b 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -406,7 +406,7 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex charCount = GetLongest(text, rect.width(), orgFontId); if (charCount == 0) break; - Width(text, 0, charCount, orgFontId, textWidth, textHeight); + Width(text, 0, charCount, fontId, textWidth, textHeight); maxTextWidth = MAX(maxTextWidth, textWidth); switch (alignment) { case SCI_TEXT16_ALIGNMENT_RIGHT: -- cgit v1.2.3 From 839ba339ed58d66b7cb6f1fd69b0a85294f6f51f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 16:55:36 +0000 Subject: SCI: finally fixing font codes fixing regressions of r51511&51512 and cleaning up as well - for sq5 svn-id: r51513 --- engines/sci/graphics/text16.cpp | 76 ++++++++++++++++++++++------------------- engines/sci/graphics/text16.h | 2 +- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index b0c302297b..fc07febe14 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -142,8 +142,8 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF uint16 curChar = 0; int16 maxChars = 0, curCharCount = 0; uint16 width = 0; - GuiResourceId oldFontId = GetFontId(); - int16 oldPenColor = _ports->_curPort->penClr; + GuiResourceId previousFontId = GetFontId(); + int16 previousPenColor = _ports->_curPort->penClr; GetFont(); if (!_font) @@ -159,7 +159,7 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF case 0x7C: if (getSciVersion() >= SCI_VERSION_1_1) { curCharCount++; - curCharCount += CodeProcessing(text, orgFontId, oldPenColor); + curCharCount += CodeProcessing(text, orgFontId, previousPenColor); continue; } break; @@ -180,8 +180,8 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF curCharCount++; // and it's also meant to pass through here case 0: - SetFont(oldFontId); - _ports->penColor(oldPenColor); + SetFont(previousFontId); + _ports->penColor(previousPenColor); return curCharCount; case ' ': @@ -226,13 +226,16 @@ int16 GfxText16::GetLongest(const char *text, int16 maxWidth, GuiResourceId orgF } } } - SetFont(oldFontId); - _ports->penColor(oldPenColor); + SetFont(previousFontId); + _ports->penColor(previousPenColor); return maxChars; } -void GfxText16::Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight) { +void GfxText16::Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight, bool restoreFont) { uint16 curChar; + GuiResourceId previousFontId = GetFontId(); + int16 previousPenColor = _ports->_curPort->penClr; + textWidth = 0; textHeight = 0; GetFont(); @@ -261,17 +264,18 @@ void GfxText16::Width(const char *text, int16 from, int16 len, GuiResourceId org } } } + // When calculating size, we do not restore font because we need the current (code modified) font active + // If we are drawing this is called inbetween, so font needs to get restored + // If we are calculating size of just one fixed string (::StringWidth), then we need to restore + if (restoreFont) { + SetFont(previousFontId); + _ports->penColor(previousPenColor); + } return; } void GfxText16::StringWidth(const char *str, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight) { - GuiResourceId oldFontId = GetFontId(); - int16 oldPenColor = _ports->_curPort->penClr; - - Width(str, 0, (int16)strlen(str), orgFontId, textWidth, textHeight); - - SetFont(oldFontId); - _ports->penColor(oldPenColor); + Width(str, 0, (int16)strlen(str), orgFontId, textWidth, textHeight, true); } void GfxText16::ShowString(const char *str, GuiResourceId orgFontId, int16 orgPenColor) { @@ -282,8 +286,8 @@ void GfxText16::DrawString(const char *str, GuiResourceId orgFontId, int16 orgPe } int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId, int16 maxWidth) { - GuiResourceId oldFontId = GetFontId(); - int16 oldPenColor = _ports->_curPort->penClr; + GuiResourceId previousFontId = GetFontId(); + int16 previousPenColor = _ports->_curPort->penClr; int16 charCount; int16 maxTextWidth = 0, textWidth; int16 totalHeight = 0, textHeight; @@ -291,7 +295,7 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId if (fontId != -1) SetFont(fontId); else - fontId = oldFontId; + fontId = previousFontId; if (g_sci->getLanguage() == Common::JA_JPN) SwitchToFont900OnSjis(text); @@ -308,10 +312,10 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId rect.right = (maxWidth ? maxWidth : 192); const char *curPos = text; while (*curPos) { - charCount = GetLongest(curPos, rect.right, oldFontId); + charCount = GetLongest(curPos, rect.right, fontId); if (charCount == 0) break; - Width(curPos, 0, charCount, fontId, textWidth, textHeight); + Width(curPos, 0, charCount, fontId, textWidth, textHeight, false); maxTextWidth = MAX(textWidth, maxTextWidth); totalHeight += textHeight; curPos += charCount; @@ -321,8 +325,8 @@ int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId rect.bottom = totalHeight; rect.right = maxWidth ? maxWidth : MIN(rect.right, maxTextWidth); } - SetFont(oldFontId); - _ports->penColor(oldPenColor); + SetFont(previousFontId); + _ports->penColor(previousPenColor); return rect.right; } @@ -387,14 +391,14 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex int16 textWidth, maxTextWidth, textHeight, charCount; int16 offset = 0; int16 hline = 0; - GuiResourceId orgFontId = GetFontId(); - int16 orgPenColor = _ports->_curPort->penClr; + GuiResourceId previousFontId = GetFontId(); + int16 previousPenColor = _ports->_curPort->penClr; bool doubleByteMode = false; if (fontId != -1) SetFont(fontId); else - fontId = orgFontId; + fontId = previousFontId; if (g_sci->getLanguage() == Common::JA_JPN) { if (SwitchToFont900OnSjis(text)) @@ -403,10 +407,10 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex maxTextWidth = 0; while (*text) { - charCount = GetLongest(text, rect.width(), orgFontId); + charCount = GetLongest(text, rect.width(), fontId); if (charCount == 0) break; - Width(text, 0, charCount, fontId, textWidth, textHeight); + Width(text, 0, charCount, fontId, textWidth, textHeight, true); maxTextWidth = MAX(maxTextWidth, textWidth); switch (alignment) { case SCI_TEXT16_ALIGNMENT_RIGHT: @@ -425,9 +429,9 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex _ports->moveTo(rect.left + offset, rect.top + hline); if (bshow) { - Show(text, 0, charCount, fontId, orgPenColor); + Show(text, 0, charCount, fontId, previousPenColor); } else { - Draw(text, 0, charCount, fontId, orgPenColor); + Draw(text, 0, charCount, fontId, previousPenColor); } hline += textHeight; @@ -435,8 +439,8 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex if (*text == ' ') text++; // skip over breaking space } - SetFont(orgFontId); - _ports->penColor(orgPenColor); + SetFont(previousFontId); + _ports->penColor(previousPenColor); if (doubleByteMode) { // Kanji is written by pc98 rom to screen directly. Because of @@ -459,12 +463,12 @@ void GfxText16::Box(const char *text, int16 bshow, const Common::Rect &rect, Tex } void GfxText16::Draw_String(const char *text) { - GuiResourceId orgFontId = GetFontId(); - int16 orgPenColor = _ports->_curPort->penClr; + GuiResourceId previousFontId = GetFontId(); + int16 previousPenColor = _ports->_curPort->penClr; - Draw(text, 0, strlen(text), orgFontId, orgPenColor); - SetFont(orgFontId); - _ports->penColor(orgPenColor); + Draw(text, 0, strlen(text), previousFontId, previousPenColor); + SetFont(previousFontId); + _ports->penColor(previousPenColor); } // Sierra did this in their PC98 interpreter only, they identify a text as being diff --git a/engines/sci/graphics/text16.h b/engines/sci/graphics/text16.h index 71b602d116..9b8b6d9f19 100644 --- a/engines/sci/graphics/text16.h +++ b/engines/sci/graphics/text16.h @@ -53,7 +53,7 @@ public: void ClearChar(int16 chr); int16 GetLongest(const char *text, int16 maxWidth, GuiResourceId orgFontId); - void Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight); + void Width(const char *text, int16 from, int16 len, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight, bool restoreFont); void StringWidth(const char *str, GuiResourceId orgFontId, int16 &textWidth, int16 &textHeight); void ShowString(const char *str, GuiResourceId orgFontId, int16 orgPenColor); void DrawString(const char *str, GuiResourceId orgFontId, int16 orgPenColor); -- cgit v1.2.3 From 75b5ac38fbd2c75fab5d0f794a44ec906ee48c05 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 30 Jul 2010 18:45:28 +0000 Subject: SCI: Fix saving/restoring games in fan games The SCI Studio function library incorrectly calls kDeviceInfo with one parameter to get the current device. svn-id: r51514 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/kfile.cpp | 8 ++++++++ engines/sci/engine/workarounds.cpp | 13 +++++++++++++ engines/sci/engine/workarounds.h | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 9652d4c25c..7a377258f7 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -319,7 +319,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL }, { MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL }, - { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop + { MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, kDeviceInfo_workarounds }, // subop { MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL }, // ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro // restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index d4ba467b25..4f0ad12285 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -282,6 +282,14 @@ enum { }; reg_t kDeviceInfo(EngineState *s, int argc, reg_t *argv) { + if (g_sci->getGameId() == GID_FANMADE && argc == 1) { + // WORKAROUND: The fan game script library calls kDeviceInfo with one parameter. + // According to the scripts, it wants to call CurDevice. However, it fails to + // provide the subop to the function. + s->_segMan->strcpy(argv[0], "/"); + return s->r_acc; + } + int mode = argv[0].toUint16(); switch (mode) { diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fa1f3d7eca..e2d63b9d7c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -138,6 +138,19 @@ const SciWorkaroundEntry kCelWide_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDeviceInfo_workarounds[] = { + { GID_FANMADE, -1, 994, 1, "Game", "save", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest) + { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest) + { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back) + { GID_FANMADE, -1, 994, 1, "Game", "save", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them) + { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest) + { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest) + { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back) + { GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them) + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 6fa08b8a69..acb0c22e6c 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -75,6 +75,7 @@ extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; extern const SciWorkaroundEntry kCelHigh_workarounds[]; extern const SciWorkaroundEntry kCelWide_workarounds[]; +extern const SciWorkaroundEntry kDeviceInfo_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; -- cgit v1.2.3 From 8e705bb2e26f0900416e5649b869ee43706eeee5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 30 Jul 2010 20:35:09 +0000 Subject: VIDEO: Fix FLIC looping Thanks to salty-horse for finding this. Also, use Common::Rational directly to hold the frame rate to avoid rounding. svn-id: r51516 --- graphics/video/flic_decoder.cpp | 15 +++++++-------- graphics/video/flic_decoder.h | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/graphics/video/flic_decoder.cpp b/graphics/video/flic_decoder.cpp index b07e369cd8..524e157269 100644 --- a/graphics/video/flic_decoder.cpp +++ b/graphics/video/flic_decoder.cpp @@ -71,9 +71,8 @@ bool FlicDecoder::load(Common::SeekableReadStream &stream) { _fileStream->readUint16LE(); // flags // Note: The normal delay is a 32-bit integer (dword), whereas the overriden delay is a 16-bit integer (word) - // frameDelay is the FLIC "speed", in milliseconds. Our frameDelay is calculated in 1/100 ms, so we convert it here - uint32 frameDelay = 100 * _fileStream->readUint32LE(); - _frameRate = 100 * 1000 / frameDelay; + // the frame delay is the FLIC "speed", in milliseconds. + _frameRate = Common::Rational(1000, _fileStream->readUint32LE()); _fileStream->seek(80); _offsetFrame1 = _fileStream->readUint32LE(); @@ -209,10 +208,10 @@ Surface *FlicDecoder::decodeNextFrame() { chunkCount = _fileStream->readUint16LE(); // Note: The overriden delay is a 16-bit integer (word), whereas the normal delay is a 32-bit integer (dword) - // frameDelay is the FLIC "speed", in milliseconds. Our frameDelay is calculated in 1/100 ms, so we convert it here + // the frame delay is the FLIC "speed", in milliseconds. uint16 newFrameDelay = _fileStream->readUint16LE(); // "speed", in milliseconds if (newFrameDelay > 0) - _frameRate = 1000 / newFrameDelay; + _frameRate = Common::Rational(1000, newFrameDelay); _fileStream->readUint16LE(); // reserved, always 0 uint16 newWidth = _fileStream->readUint16LE(); @@ -268,15 +267,15 @@ Surface *FlicDecoder::decodeNextFrame() { _curFrame++; - if (_curFrame == 0) - _startTime = g_system->getMillis(); - // If we just processed the ring frame, set the next frame if (_curFrame == (int32)_frameCount) { _curFrame = 0; _fileStream->seek(_offsetFrame2); } + if (_curFrame == 0) + _startTime = g_system->getMillis(); + return _surface; } diff --git a/graphics/video/flic_decoder.h b/graphics/video/flic_decoder.h index 60d68889a2..60f4e3472c 100644 --- a/graphics/video/flic_decoder.h +++ b/graphics/video/flic_decoder.h @@ -91,7 +91,7 @@ private: Common::SeekableReadStream *_fileStream; Surface *_surface; uint32 _frameCount; - uint32 _frameRate; + Common::Rational _frameRate; Common::List _dirtyRects; }; -- cgit v1.2.3 From 757f787a270676a38b165705c2e8b118bd5ca96d Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Fri, 30 Jul 2010 21:07:27 +0000 Subject: VIDEO: Ignore requests to unpause when video is already unpaused Previous behavior was to assert svn-id: r51517 --- graphics/video/video_decoder.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/graphics/video/video_decoder.cpp b/graphics/video/video_decoder.cpp index 9733afc5cc..53a5887e4f 100644 --- a/graphics/video/video_decoder.cpp +++ b/graphics/video/video_decoder.cpp @@ -81,9 +81,14 @@ bool VideoDecoder::endOfVideo() const { void VideoDecoder::pauseVideo(bool pause) { if (pause) { _pauseLevel++; - } else { - assert(_pauseLevel); // We can't go negative + + // We can't go negative + } else if (_pauseLevel) { _pauseLevel--; + + // Do nothing + } else { + return; } if (_pauseLevel == 1 && pause) { -- cgit v1.2.3 From 685c124a8e91dcec656258e7d8c11e1a735fe1cf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 21:29:45 +0000 Subject: SCI: speed throttler cleanup and iceman comment svn-id: r51518 --- engines/sci/engine/kmisc.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 305e202ae9..f2026575de 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -55,16 +55,28 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { uint32 neededSleep = 30; - // WORKAROUND: LSL3 calculates a machinespeed variable during game startup - // (right after the filthy questions). This one would go through w/o - // throttling resulting in having to do 1000 pushups or something. Another - // way of handling this would be delaying incrementing of "machineSpeed" - // selector. - if (g_sci->getGameId() == GID_LSL3 && s->currentRoomNumber() == 290) - s->_throttleTrigger = true; - else if (g_sci->getGameId() == GID_ICEMAN && s->currentRoomNumber() == 27) { - s->_throttleTrigger = true; - neededSleep = 60; + // WORKAROUNDS: + switch (g_sci->getGameId()) { + case GID_LSL3: + // LSL3 calculates a machinespeed variable during game startup + // (right after the filthy questions). This one would go through w/o + // throttling resulting in having to do 1000 pushups or something. Another + // way of handling this would be delaying incrementing of "machineSpeed" + // selector. + if (s->currentRoomNumber() == 290) + s->_throttleTrigger = true; + break; + case GID_ICEMAN: + // In ICEMAN the submarine control room is not animating much, so it runs way too fast + // we calm it down even more otherwise especially fighting against other submarines + // is almost impossible + if (s->currentRoomNumber() == 27) { + s->_throttleTrigger = true; + neededSleep = 60; + } + break; + default: + break; } s->speedThrottler(neededSleep); -- cgit v1.2.3 From 062d9eedce06e79526b478441d2eefe85cf41113 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Jul 2010 22:44:23 +0000 Subject: SCI: fixing view scaling code fixes crash in sq5 with elevator on goliath svn-id: r51520 --- engines/sci/graphics/view.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index d32e60335f..22deb80422 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -637,7 +637,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, uint16 scalingX[640]; uint16 scalingY[480]; int16 scaledWidth, scaledHeight; - int16 pixelNo, scaledPixel, scaledPixelNo, prevScaledPixelNo; + int pixelNo, scaledPixel, scaledPixelNo, prevScaledPixelNo; if (_embeddedPal) { // Merge view palette in... @@ -650,8 +650,8 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, scaledHeight = CLIP(scaledHeight, 0, _screen->getHeight()); // Do we really need to do this?! - memset(scalingX, 0, sizeof(scalingX)); - memset(scalingY, 0, sizeof(scalingY)); + //memset(scalingX, 0, sizeof(scalingX)); + //memset(scalingY, 0, sizeof(scalingY)); // Create height scaling table pixelNo = 0; @@ -659,16 +659,15 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, while (pixelNo < celHeight) { scaledPixelNo = scaledPixel >> 7; assert(scaledPixelNo < ARRAYSIZE(scalingY)); - if (prevScaledPixelNo < scaledPixelNo) - memset(&scalingY[prevScaledPixelNo], pixelNo, scaledPixelNo - prevScaledPixelNo); - scalingY[scaledPixelNo] = pixelNo; - prevScaledPixelNo = scaledPixelNo + 1; + for (; prevScaledPixelNo <= scaledPixelNo; prevScaledPixelNo++) + scalingY[prevScaledPixelNo] = pixelNo; pixelNo++; scaledPixel += scaleY; } + pixelNo--; scaledPixelNo++; - if (scaledPixelNo < scaledHeight) - memset(&scalingY[scaledPixelNo], pixelNo - 1, scaledHeight - scaledPixelNo); + for (; scaledPixelNo < scaledWidth; scaledPixelNo++) + scalingY[scaledPixelNo] = pixelNo - 1; // Create width scaling table pixelNo = 0; @@ -676,16 +675,15 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, while (pixelNo < celWidth) { scaledPixelNo = scaledPixel >> 7; assert(scaledPixelNo < ARRAYSIZE(scalingX)); - if (prevScaledPixelNo < scaledPixelNo) - memset(&scalingX[prevScaledPixelNo], pixelNo, scaledPixelNo - prevScaledPixelNo); - scalingX[scaledPixelNo] = pixelNo; - prevScaledPixelNo = scaledPixelNo + 1; + for (; prevScaledPixelNo <= scaledPixelNo; prevScaledPixelNo++) + scalingX[prevScaledPixelNo] = pixelNo; pixelNo++; scaledPixel += scaleX; } + pixelNo--; scaledPixelNo++; - if (scaledPixelNo < scaledWidth) - memset(&scalingX[scaledPixelNo], pixelNo - 1, scaledWidth - scaledPixelNo); + for (; scaledPixelNo < scaledWidth; scaledPixelNo++) + scalingX[scaledPixelNo] = pixelNo - 1; scaledWidth = MIN(clipRect.width(), scaledWidth); scaledHeight = MIN(clipRect.height(), scaledHeight); -- cgit v1.2.3 From e29d6e681a2eccbfbedaf584f4cc530311ce1eb0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 30 Jul 2010 22:47:01 +0000 Subject: SCI: Switch to Common::RandomSource. Since I got no response to my mail to -devel, I just assume that there is no specific reason for using rand() in SCI. As explained in my mail to -devel about why SCI uses rand, this might allow SCI to work with our event recording, when that ever gets finished. I adapted kRandom so that it also supports negative random numbers. And furthermore that the toNumber argument is smaller than the fromNumber argument. I am not sure whether that really happens though, but it should be safer to have this. I marked that place with an TODO/CHECKME. svn-id: r51521 --- engines/sci/engine/kmath.cpp | 14 ++++++++++++-- engines/sci/engine/kmovement.cpp | 2 +- engines/sci/sci.cpp | 5 +++-- engines/sci/sci.h | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index bdc705cae3..f3769b653b 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -37,8 +37,18 @@ reg_t kRandom(EngineState *s, int argc, reg_t *argv) { case 2: { // get random number int fromNumber = argv[0].toUint16(); int toNumber = argv[1].toUint16(); - double randomNumber = fromNumber + ((toNumber + 1.0 - fromNumber) * (rand() / (RAND_MAX + 1.0))); - return make_reg(0, (int)randomNumber); + + // TODO/CHECKME: It is propbably not required to check whether + // toNumber is greater than fromNumber, at least not when one + // goes by their names, but let us be on the safe side and + // allow toNumber to be smaller than fromNumber too. + if (fromNumber > toNumber) + SWAP(fromNumber, toNumber); + + const uint diff = (uint)(toNumber - fromNumber); + + const int randomNumber = fromNumber + (int)g_sci->getRNG().getRandomNumber(diff); + return make_reg(0, randomNumber); } case 3: // get seed diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 114b6eb755..7f3439331e 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -437,7 +437,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { debugC(2, kDebugLevelBresen, "Movement (%d,%d), angle %d is %sblocked", dx, dy, angle, (s->r_acc.offset) ? " " : "not "); if (s->r_acc.offset) { // isBlocked() returned non-zero - int rotation = (rand() & 1) ? 45 : (360 - 45); // Clockwise/counterclockwise + int rotation = (g_sci->getRNG().getRandomBit() == 1) ? 45 : (360 - 45); // Clockwise/counterclockwise int oldx = readSelectorValue(segMan, client, SELECTOR(x)); int oldy = readSelectorValue(segMan, client, SELECTOR(y)); int xstep = readSelectorValue(segMan, client, SELECTOR(xStep)); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index f07cc257bd..080c045e27 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -26,6 +26,7 @@ #include "common/system.h" #include "common/config-manager.h" #include "common/debug-channels.h" +#include "common/EventRecorder.h" #include "engines/advancedDetector.h" #include "engines/util.h" @@ -169,6 +170,8 @@ SciEngine::~SciEngine() { } Common::Error SciEngine::run() { + g_eventRec.registerRandomSource(_rng, "sci"); + // Assign default values to the config manager, in case settings are missing ConfMan.registerDefault("undither", "true"); ConfMan.registerDefault("enable_fb01", "false"); @@ -304,8 +307,6 @@ bool SciEngine::initGame() { _gamestate->gameStartTime = _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis(); - srand(g_system->getMillis()); // Initialize random number generator - // Load game language into printLang property of game object setSciLanguage(); diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 13c9d03614..72d6e7e0cb 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -28,6 +28,7 @@ #include "engines/engine.h" #include "common/util.h" +#include "common/random.h" #include "sci/engine/vm_types.h" // for Selector #include "sci/debug.h" // for DebugState @@ -233,6 +234,8 @@ public: inline EventManager *getEventManager() const { return _eventMan; } inline reg_t getGameObject() const { return _gameObj; } + Common::RandomSource &getRNG() { return _rng; } + Common::String getSavegameName(int nr) const; Common::String getSavegamePattern() const; @@ -340,6 +343,7 @@ private: EventManager *_eventMan; reg_t _gameObj; /**< Pointer to the game object */ Console *_console; + Common::RandomSource _rng; }; -- cgit v1.2.3 From 8e8023d7cc24991f5ccf86734a8f95da6ac92f50 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 30 Jul 2010 23:24:22 +0000 Subject: JANITORIAL: Add comment about the stability of Common::sort. svn-id: r51522 --- common/algorithm.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/algorithm.h b/common/algorithm.h index d3f518b225..12c15f9b5d 100644 --- a/common/algorithm.h +++ b/common/algorithm.h @@ -197,6 +197,10 @@ T sortPartition(T first, T last, T pivot, StrictWeakOrdering &comp) { /** * Simple sort function, modeled after std::sort. * It compares data with the given comparator object comp. + * + * Like std::sort this is not guaranteed to be stable. + * Actually as the time of writing our implementation + * is unstable. */ template void sort(T first, T last, StrictWeakOrdering comp) { -- cgit v1.2.3 From fd0f5696a53dd990ff23525ec6eb2576a61e4bfb Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 30 Jul 2010 23:24:45 +0000 Subject: SCI: Add comment about stability requirements in makeSortedList. svn-id: r51523 --- engines/sci/graphics/animate.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index c637ef8374..a4d07cf4ad 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -177,6 +177,12 @@ void GfxAnimate::makeSortedList(List *list) { curNode = _s->_segMan->lookupNode(curAddress); } + // Possible TODO: As noted in the comment in sortHelper we actually + // require a stable sorting algorithm here. Since Common::sort is not stable + // at the time of writing this comment, we work around that in our ordering + // comparator. If that changes in the future or we want to use some + // stable sorting algorithm here, we should change that. + // Now sort the list according y and z (descending) Common::sort(_list.begin(), _list.end(), sortHelper); } -- cgit v1.2.3 From f75d84cbdd2baa9633a5c20bdf8742425df8f19d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 30 Jul 2010 23:42:50 +0000 Subject: JANITORIAL: Some small explanation about stability of sorting algorithms. Special thanks to lskovlun for his suggestion to add this. svn-id: r51524 --- common/algorithm.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/common/algorithm.h b/common/algorithm.h index 12c15f9b5d..9d22af4090 100644 --- a/common/algorithm.h +++ b/common/algorithm.h @@ -199,8 +199,19 @@ T sortPartition(T first, T last, T pivot, StrictWeakOrdering &comp) { * It compares data with the given comparator object comp. * * Like std::sort this is not guaranteed to be stable. - * Actually as the time of writing our implementation - * is unstable. + * + * Two small quotes from wikipedia about stability: + * + * Stable sorting algorithms maintain the relative order of records with + * equal keys. + * + * Unstable sorting algorithms may change the relative order of records with + * equal keys, but stable sorting algorithms never do so. + * + * For more information on that topic check out: + * http://en.wikipedia.org/wiki/Sorting_algorithm#Stability + * + * NOTE: Actually as the time of writing our implementation is unstable. */ template void sort(T first, T last, StrictWeakOrdering comp) { -- cgit v1.2.3 From 5dac7ba6ba8da1bfea07e8f696d230a8eea593b0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 00:48:03 +0000 Subject: SCI: fix kAddToPic called with view data and adding workaround for pq2 when showing windows with pictures change to kAddToPic fixes bad coordinates of cels when restoring the game (should also fix lsl2) svn-id: r51526 --- engines/sci/engine/workarounds.cpp | 2 ++ engines/sci/graphics/animate.cpp | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index e2d63b9d7c..daf41a6c39 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -128,12 +128,14 @@ const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelHigh_workarounds[] = { + { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { + { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index a4d07cf4ad..f260ee41be 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -527,13 +527,21 @@ void GfxAnimate::addToPicDrawCels() { } } -void GfxAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) { +void GfxAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 x, int16 y, int16 priority, int16 control) { GfxView *view = _cache->getView(viewId); Common::Rect celRect; + if (priority == -1) + priority = _ports->kernelCoordinateToPriority(y); + // Create rect according to coordinates and given cel - view->getCelRect(loopNo, celNo, leftPos, topPos, priority, celRect); + view->getCelRect(loopNo, celNo, x, y, 0, celRect); _paint16->drawCel(view, loopNo, celNo, celRect, priority, 0); + + if (control != -1) { + celRect.top = CLIP(_ports->kernelPriorityToCoordinate(priority) - 1, celRect.top, celRect.bottom - 1); + _paint16->fillRect(celRect, GFX_SCREEN_MASK_CONTROL, 0, 0, control); + } } @@ -633,9 +641,9 @@ void GfxAnimate::kernelAddToPicList(reg_t listReference, int argc, reg_t *argv) addToPicSetPicNotValid(); } -void GfxAnimate::kernelAddToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) { +void GfxAnimate::kernelAddToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 x, int16 y, int16 priority, int16 control) { _ports->setPort((Port *)_ports->_picWind); - addToPicDrawView(viewId, loopNo, celNo, leftPos, topPos, priority, control); + addToPicDrawView(viewId, loopNo, celNo, x, y, priority, control); addToPicSetPicNotValid(); } -- cgit v1.2.3 From 43e82aa895ae4e08cdb860fdfb7aa129ecf56d9b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 31 Jul 2010 00:54:32 +0000 Subject: SCI: Fix walking in GK1 later in the game The Feature class uninit'd workaround needs to be extended to all levels of inheritance. svn-id: r51527 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index daf41a6c39..91ee28daf9 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -61,7 +61,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu - { GID_GK1, -1, 64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking + { GID_GK1, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking { GID_GK2, -1, 11, 0, "", "export 10", -1, 3, { WORKAROUND_FAKE, 0 } }, // called when the game starts { GID_GK2, -1, 11, 0, "", "export 10", -1, 4, { WORKAROUND_FAKE, 0 } }, // called during the game { GID_HOYLE1, 4, 104, 0, "GinRummyCardList", "calcRuns", -1, 4, { WORKAROUND_FAKE, 0 } }, // Gin Rummy / right when the game starts -- cgit v1.2.3 From cc575359dfc3a729296600c3d5e9cc19e3e1cfe7 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 31 Jul 2010 02:11:05 +0000 Subject: SCI: Whitespace cleanup. svn-id: r51532 --- engines/sci/engine/static_selectors.cpp | 98 ++++++++++++++++----------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 55e18613e0..47893bbab2 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -38,66 +38,66 @@ struct SelectorRemap { }; static const char * const sci0Selectors[] = { - "y", "x", "view", "loop", "cel", // 0 - 4 - "underBits", "nsTop", "nsLeft", "nsBottom", "nsRight", // 5 - 9 - "lsTop", "lsLeft", "lsBottom", "lsRight", "signal", // 10 - 14 - "illegalBits", "brTop", "brLeft", "brBottom", "brRight", // 15 - 19 - "name", "key", "time", "text", "elements", // 20 - 25 - "color", "back", "mode", "style", "state", // 25 - 29 - "font", "type", "window", "cursor", "max", // 30 - 34 - "mark", "who", "message", "edit", "play", // 35 - 39 - "number", "handle", "client", "dx", "dy", // 40 - 44 - "b-moveCnt", "b-i1", "b-i2", "b-di", "b-xAxis", // 45 - 49 - "b-incr", "xStep", "yStep", "moveSpeed", "canBeHere", // 50 - 54 - "heading", "mover", "doit", "isBlocked", "looper", // 55 - 59 - "priority", "modifiers", "replay", "setPri", "at", // 60 - 64 - "next", "done", "width", "wordFail", "syntaxFail", // 65 - 69 - "semanticFail", "pragmaFail", "said", "claimed", "value", // 70 - 74 - "save", "restore", "title", "button", "icon", // 75 - 79 - "draw", "delete", "z" // 80 - 82 + "y", "x", "view", "loop", "cel", // 0 - 4 + "underBits", "nsTop", "nsLeft", "nsBottom", "nsRight", // 5 - 9 + "lsTop", "lsLeft", "lsBottom", "lsRight", "signal", // 10 - 14 + "illegalBits", "brTop", "brLeft", "brBottom", "brRight", // 15 - 19 + "name", "key", "time", "text", "elements", // 20 - 25 + "color", "back", "mode", "style", "state", // 25 - 29 + "font", "type", "window", "cursor", "max", // 30 - 34 + "mark", "who", "message", "edit", "play", // 35 - 39 + "number", "handle", "client", "dx", "dy", // 40 - 44 + "b-moveCnt", "b-i1", "b-i2", "b-di", "b-xAxis", // 45 - 49 + "b-incr", "xStep", "yStep", "moveSpeed", "canBeHere", // 50 - 54 + "heading", "mover", "doit", "isBlocked", "looper", // 55 - 59 + "priority", "modifiers", "replay", "setPri", "at", // 60 - 64 + "next", "done", "width", "wordFail", "syntaxFail", // 65 - 69 + "semanticFail", "pragmaFail", "said", "claimed", "value", // 70 - 74 + "save", "restore", "title", "button", "icon", // 75 - 79 + "draw", "delete", "z" // 80 - 82 }; static const char * const sci1Selectors[] = { - "parseLang", "printLang", "subtitleLang", "size", "points", // 83 - 87 - "palette", "dataInc", "handle", "min", "sec", // 88 - 92 - "frame", "vol", "pri", "perform", "moveDone" // 93 - 97 + "parseLang", "printLang", "subtitleLang", "size", "points", // 83 - 87 + "palette", "dataInc", "handle", "min", "sec", // 88 - 92 + "frame", "vol", "pri", "perform", "moveDone" // 93 - 97 }; #ifdef ENABLE_SCI32 static const char * const sci2Selectors[] = { - "plane", "x", "y", "z", "scaleX", // 0 - 4 - "scaleY", "maxScale", "priority", "fixPriority", "inLeft", // 5 - 9 - "inTop", "inRight", "inBottom", "useInsetRect", "view", // 10 - 14 - "loop", "cel", "bitmap", "nsLeft", "nsTop", // 15 - 19 - "nsRight", "nsBottom", "lsLeft", "lsTop", "lsRight", // 20 - 25 - "lsBottom", "signal", "illegalBits", "brLeft", "brTop", // 25 - 29 - "brRight", "brBottom", "name", "key", "time", // 30 - 34 - "text", "elements", "fore", "back", "mode", // 35 - 39 - "style", "state", "font", "type", "window", // 40 - 44 - "cursor", "max", "mark", "who", "message", // 45 - 49 - "edit", "play", "number", "nodePtr", "client", // 50 - 54 - "dx", "dy", "b-moveCnt", "b-i1", "b-i2", // 55 - 59 - "b-di", "b-xAxis", "b-incr", "xStep", "yStep", // 60 - 64 - "moveSpeed", "cantBeHere", "heading", "mover", "doit", // 65 - 69 - "isBlocked", "looper", "modifiers", "replay", "setPri", // 70 - 74 - "at", "next", "done", "width", "pragmaFail", // 75 - 79 - "claimed", "value", "save", "restore", "title", // 80 - 84 - "button", "icon", "draw", "delete", "printLang", // 85 - 89 - "size", "points", "palette", "dataInc", "handle", // 90 - 94 - "min", "sec", "frame", "vol", "perform", // 95 - 99 - "moveDone", "topString", "flags", "quitGame", "restart", // 100 - 104 - "hide", "scaleSignal", "vanishingX", "vanishingY", "picture", // 105 - 109 - "resX", "resY", "coordType", "data", "skip", // 110 - 104 - "center", "all", "show", "textLeft", "textTop", // 115 - 119 - "textRight", "textBottom", "borderColor", "titleFore", "titleBack", // 120 - 124 - "titleFont", "dimmed", "frameOut", "lastKey", "magnifier", // 125 - 129 - "magPower", "mirrored", "pitch", "roll", "yaw", // 130 - 134 - "left", "right", "top", "bottom", "numLines" // 135 - 139 + "plane", "x", "y", "z", "scaleX", // 0 - 4 + "scaleY", "maxScale", "priority", "fixPriority", "inLeft", // 5 - 9 + "inTop", "inRight", "inBottom", "useInsetRect", "view", // 10 - 14 + "loop", "cel", "bitmap", "nsLeft", "nsTop", // 15 - 19 + "nsRight", "nsBottom", "lsLeft", "lsTop", "lsRight", // 20 - 25 + "lsBottom", "signal", "illegalBits", "brLeft", "brTop", // 25 - 29 + "brRight", "brBottom", "name", "key", "time", // 30 - 34 + "text", "elements", "fore", "back", "mode", // 35 - 39 + "style", "state", "font", "type", "window", // 40 - 44 + "cursor", "max", "mark", "who", "message", // 45 - 49 + "edit", "play", "number", "nodePtr", "client", // 50 - 54 + "dx", "dy", "b-moveCnt", "b-i1", "b-i2", // 55 - 59 + "b-di", "b-xAxis", "b-incr", "xStep", "yStep", // 60 - 64 + "moveSpeed", "cantBeHere", "heading", "mover", "doit", // 65 - 69 + "isBlocked", "looper", "modifiers", "replay", "setPri", // 70 - 74 + "at", "next", "done", "width", "pragmaFail", // 75 - 79 + "claimed", "value", "save", "restore", "title", // 80 - 84 + "button", "icon", "draw", "delete", "printLang", // 85 - 89 + "size", "points", "palette", "dataInc", "handle", // 90 - 94 + "min", "sec", "frame", "vol", "perform", // 95 - 99 + "moveDone", "topString", "flags", "quitGame", "restart", // 100 - 104 + "hide", "scaleSignal", "vanishingX", "vanishingY", "picture", // 105 - 109 + "resX", "resY", "coordType", "data", "skip", // 110 - 104 + "center", "all", "show", "textLeft", "textTop", // 115 - 119 + "textRight", "textBottom", "borderColor", "titleFore", "titleBack", // 120 - 124 + "titleFont", "dimmed", "frameOut", "lastKey", "magnifier", // 125 - 129 + "magPower", "mirrored", "pitch", "roll", "yaw", // 130 - 134 + "left", "right", "top", "bottom", "numLines" // 135 - 139 }; #endif static const SelectorRemap sciSelectorRemap[] = { - { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "moveDone", 170 }, + { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "moveDone", 170 }, { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "points", 316 }, { SCI_VERSION_0_EARLY, SCI_VERSION_0_LATE, "flags", 368 }, { SCI_VERSION_1_EARLY, SCI_VERSION_1_LATE, "nodePtr", 44 }, -- cgit v1.2.3 From 9deb52fba60f73be7d09406bd4dd89385b95742a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 07:37:06 +0000 Subject: SCI: fixing stupid typo svn-id: r51533 --- engines/sci/graphics/view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 22deb80422..29b370aa82 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -666,7 +666,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, } pixelNo--; scaledPixelNo++; - for (; scaledPixelNo < scaledWidth; scaledPixelNo++) + for (; scaledPixelNo < scaledHeight; scaledPixelNo++) scalingY[scaledPixelNo] = pixelNo - 1; // Create width scaling table -- cgit v1.2.3 From e40ee138af219f934d8d420afd16e2713cb75aa9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 08:05:23 +0000 Subject: SCI: kAnimate - limit update of nsRect when scaled only set nsRect when being drawn later (scaled only), fixes sq5 instant-death in elevator shaft svn-id: r51534 --- engines/sci/graphics/animate.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index f260ee41be..537505a926 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -182,6 +182,9 @@ void GfxAnimate::makeSortedList(List *list) { // at the time of writing this comment, we work around that in our ordering // comparator. If that changes in the future or we want to use some // stable sorting algorithm here, we should change that. + // In that case we should test such changes intensively. A good place to test stable sort + // is iceman, cupboard within the submarine. If sort isn't stable, the cupboard will be + // half-open, half-closed. Of course that's just one of many special cases. // Now sort the list according y and z (descending) Common::sort(_list.begin(), _list.end(), sortHelper); @@ -196,6 +199,7 @@ void GfxAnimate::fill(byte &old_picNotValid) { for (it = _list.begin(); it != end; ++it) { curObject = it->object; + signal = it->signal; // Get the corresponding view view = _cache->getView(it->viewId); @@ -239,18 +243,23 @@ void GfxAnimate::fill(byte &old_picNotValid) { } } + bool setNsRect = true; + // Create rect according to coordinates and given cel if (it->scaleSignal & kScaleSignalDoScaling) { view->getCelScaledRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->scaleX, it->scaleY, it->celRect); + // when being scaled, only set nsRect, if object will get drawn + if ((signal & kSignalHidden) && !(signal & kSignalAlwaysUpdate)) + setNsRect = false; } else { view->getCelRect(it->loopNo, it->celNo, it->x, it->y, it->z, it->celRect); } - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), it->celRect.left); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), it->celRect.top); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), it->celRect.right); - writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), it->celRect.bottom); - - signal = it->signal; + if (setNsRect) { + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsLeft), it->celRect.left); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsTop), it->celRect.top); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsRight), it->celRect.right); + writeSelectorValue(_s->_segMan, curObject, SELECTOR(nsBottom), it->celRect.bottom); + } // Calculate current priority according to y-coordinate if (!(signal & kSignalFixedPriority)) { -- cgit v1.2.3 From 3a75d0fbe0e9cc6b3564c617338d4a14a59bb431 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 12:37:49 +0000 Subject: SCI: adding polish lsl1 svn-id: r51535 --- engines/sci/detection_tables.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 3e47031c49..94cba40e46 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1404,6 +1404,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release) + // SCI interpreter version 1.000.510 + {"lsl1sci", "VGA Remake", { + {"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228}, + {"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210}, + {NULL, 0, NULL, 0}}, + Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Larry 2 - English Amiga (from www.back2roots.org) // Executable scanning reports "x.yyy.zzz" // SCI interpreter version 0.000.572 -- cgit v1.2.3 From fec3ab7bee659f2cb2214cee2f88020b95f4fe8e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 12:42:23 +0000 Subject: SCI: updating comment svn-id: r51536 --- engines/sci/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 94cba40e46..2db046a5e8 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1405,7 +1405,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release) - // SCI interpreter version 1.000.510 + // SCI interpreter version 1.000.577, VERSION file reports "2.1" {"lsl1sci", "VGA Remake", { {"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228}, {"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210}, -- cgit v1.2.3 From fd7bc295367f848b3a8f0658f65adb6a8447710a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 13:13:46 +0000 Subject: SCI: adjusting inside view::getCelRect for sci0early fixes cels being placed wrongly, sci0early didnt have the z adjust. svn-id: r51537 --- engines/sci/graphics/view.cpp | 5 ++++- engines/sci/graphics/view.h | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 29b370aa82..38682770e4 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -85,6 +85,9 @@ void GfxView::initData(GuiResourceId resourceId) { _EGAmapping = NULL; _isSci2Hires = false; + // we adjust inside getCelRect for SCI0EARLY (that version didn't have the +1 when calculating bottom) + adjustForSci0Early = getSciVersion() == SCI_VERSION_0_EARLY ? -1 : 0; + // If we find an SCI1/SCI1.1 view (not amiga), we switch to that type for // EGA. This could get used to make view patches for EGA games, where the // new views include more colors. Users could manually adjust old views to @@ -322,7 +325,7 @@ void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, C const CelInfo *celInfo = getCelInfo(loopNo, celNo); outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); outRect.right = outRect.left + celInfo->width; - outRect.bottom = y + celInfo->displaceY - z + 1; + outRect.bottom = y + celInfo->displaceY - z + 1 + adjustForSci0Early; outRect.top = outRect.bottom - celInfo->height; } diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index 25e110ad13..0853f2e5a6 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -100,6 +100,9 @@ private: bool _isSci2Hires; byte *_EGAmapping; + + // this is set for sci0early to adjust for the getCelRect() change + int16 adjustForSci0Early; }; } // End of namespace Sci -- cgit v1.2.3 From 2d76fe009206f5a064c3e21485743e433aa8ac3c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 14:09:42 +0000 Subject: SCI: kGameIsRestarting returns 2 when we restored fixes castle of dr. brain save issue in puzzle room, fixes island of dr. brain save issue when saving in first room svn-id: r51538 --- engines/sci/engine/kmisc.cpp | 4 ++-- engines/sci/engine/savegame.cpp | 3 +++ engines/sci/engine/state.h | 8 +++++++- engines/sci/sci.cpp | 4 ++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index f2026575de..9611a04753 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -46,11 +46,11 @@ reg_t kRestartGame(EngineState *s, int argc, reg_t *argv) { ** Returns the restarting_flag in acc */ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { - s->r_acc = make_reg(0, s->gameWasRestarted); + s->r_acc = make_reg(0, s->gameIsRestarting); if (argc) { // Only happens during replay if (!argv[0].toUint16()) // Set restarting flag - s->gameWasRestarted = false; + s->gameIsRestarting = GAMEISRESTARTING_NONE; } uint32 neededSleep = 30; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 806c8893b4..64bd46563a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -776,6 +776,9 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->_msgState = new MessageState(s->_segMan); s->abortScriptProcessing = kAbortLoadGame; + + // signal restored game to game scripts + s->gameIsRestarting = GAMEISRESTARTING_RESTORE; } bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata *meta) { diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 243a460645..4f1d686b17 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -87,6 +87,12 @@ enum { SAVEGAMEID_OFFICIALRANGE_END = 1999 }; +enum { + GAMEISRESTARTING_NONE = 0, + GAMEISRESTARTING_RESTART = 1, + GAMEISRESTARTING_RESTORE = 2 +}; + class FileHandle { public: Common::String _name; @@ -159,7 +165,7 @@ public: int variablesMax[4]; ///< Max. values for all variables AbortGameState abortScriptProcessing; - bool gameWasRestarted; + int16 gameIsRestarting; // is set when restarting (=1) or restoring the game (=2) int scriptStepCounter; // Counts the number of steps executed int scriptGCInterval; // Number of steps in between gcs diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 080c045e27..6138be58cc 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -290,7 +290,7 @@ bool SciEngine::initGame() { _gamestate->_executionStackPosChanged = false; _gamestate->abortScriptProcessing = kAbortNone; - _gamestate->gameWasRestarted = false; + _gamestate->gameIsRestarting = GAMEISRESTARTING_NONE; _gamestate->stack_base = stack->_entries; _gamestate->stack_top = stack->_entries + stack->_capacity; @@ -416,7 +416,7 @@ void SciEngine::runGame() { _gamestate->_segMan->resetSegMan(); initGame(); initStackBaseWithSelector(SELECTOR(play)); - _gamestate->gameWasRestarted = true; + _gamestate->gameIsRestarting = GAMEISRESTARTING_RESTART; if (_gfxMenu) _gfxMenu->reset(); _gamestate->abortScriptProcessing = kAbortNone; -- cgit v1.2.3 From 7f3ce51031a02d2b54e9cee3aaa7a35bce3c7a92 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 14:29:22 +0000 Subject: SCI: little cleanup svn-id: r51539 --- engines/sci/engine/kmisc.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 9611a04753..99e02d92f2 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -172,10 +172,10 @@ reg_t kSetDebug(EngineState *s, int argc, reg_t *argv) { } enum { - K_NEW_GETTIME_TICKS = 0, - K_NEW_GETTIME_TIME_12HOUR = 1, - K_NEW_GETTIME_TIME_24HOUR = 2, - K_NEW_GETTIME_DATE = 3 + KGETTIME_TICKS = 0, + KGETTIME_TIME_12HOUR = 1, + KGETTIME_TIME_24HOUR = 2, + KGETTIME_DATE = 3 }; reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { @@ -192,19 +192,19 @@ reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { error("kGetTime called in SCI0 with mode %d (expected 0 or 1)", mode); switch (mode) { - case K_NEW_GETTIME_TICKS : + case KGETTIME_TICKS : retval = elapsedTime * 60 / 1000; debugC(2, kDebugLevelTime, "GetTime(elapsed) returns %d", retval); break; - case K_NEW_GETTIME_TIME_12HOUR : + case KGETTIME_TIME_12HOUR : retval = ((loc_time.tm_hour % 12) << 12) | (loc_time.tm_min << 6) | (loc_time.tm_sec); debugC(2, kDebugLevelTime, "GetTime(12h) returns %d", retval); break; - case K_NEW_GETTIME_TIME_24HOUR : + case KGETTIME_TIME_24HOUR : retval = (loc_time.tm_hour << 11) | (loc_time.tm_min << 5) | (loc_time.tm_sec >> 1); debugC(2, kDebugLevelTime, "GetTime(24h) returns %d", retval); break; - case K_NEW_GETTIME_DATE : + case KGETTIME_DATE : retval = loc_time.tm_mday | ((loc_time.tm_mon + 1) << 5) | (((loc_time.tm_year + 1900) & 0x7f) << 9); debugC(2, kDebugLevelTime, "GetTime(date) returns %d", retval); break; -- cgit v1.2.3 From f54b9e3527ac89f1030795a97b787fef4a047850 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 14:38:28 +0000 Subject: SCI: removing warning about uninitialized parameters didn't cause any harm till now and it seems testers get irritated by it. Switching it to VM debug level 2. svn-id: r51540 --- engines/sci/engine/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index d849d3e008..56d16e798e 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -231,7 +231,7 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i case VAR_PARAM: // Out-of-bounds read for a parameter that goes onto stack and hits an uninitialized temp // We return 0 currently in that case - warning("Read for a parameter goes out-of-bounds, onto the stack and gets uninitialized temp"); + debugC(2, kDebugLevelVM, "[VM] Read for a parameter goes out-of-bounds, onto the stack and gets uninitialized temp"); return NULL_REG; default: break; -- cgit v1.2.3 From 5ea840283934938110f21fc04e3071b94c076765 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 14:44:00 +0000 Subject: SCI: changing laurabow1 workaround to all rooms fixes bug #3037410 svn-id: r51541 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 91ee28daf9..a752c72981 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -85,7 +85,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key - { GID_LAURABOW, 44, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // second dialog box after the intro, when talking with Lillian - bug #3034985 + { GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up (initial bug #3034985) { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 -- cgit v1.2.3 From 1c6b339bbc2f9ee0624f7777e5950417a66a3286 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 31 Jul 2010 15:46:43 +0000 Subject: i18n: use user friendly language names in GUI The GUI now uses the content of the Language field from the po file header if it is present and not empty for the language selection PopupWidget. If not present it uses the file name as before (e.g. ru_RU). Also update all the translation template and all the translation files. svn-id: r51542 --- common/messages.cpp | 2346 ++++++++++++++++++++++++------------------------ common/translation.cpp | 6 +- common/translation.h | 4 +- gui/options.cpp | 2 +- po/ca_ES.po | 331 +++---- po/de_DE.po | 331 +++---- po/fr_FR.po | 527 ++++++----- po/hu_HU.po | 324 +++---- po/it_IT.po | 329 +++---- po/ru_RU.po | 333 +++---- po/scummvm.pot | 321 +++---- tools/po2c | 21 +- 12 files changed, 2511 insertions(+), 2364 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index fe87b5f642..ba7c5c98a0 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -128,193 +128,195 @@ static const char * const _messageIds[] = { /* 124 */ "MAME OPL emulator", /* 125 */ "MIDI", /* 126 */ "MIDI gain:", - /* 127 */ "MT-32 Device:", - /* 128 */ "MT-32 Emulator", - /* 129 */ "Main screen scaling:", - /* 130 */ "Map", - /* 131 */ "Mass Add...", - /* 132 */ "Menu", - /* 133 */ "Misc", - /* 134 */ "Mixed AdLib/MIDI mode", - /* 135 */ "Mount DVD", - /* 136 */ "Mount SMB", - /* 137 */ "Mouse click", - /* 138 */ "Multi Function", - /* 139 */ "Music Device:", - /* 140 */ "Music volume:", - /* 141 */ "Mute All", - /* 142 */ "Name:", - /* 143 */ "Network down", - /* 144 */ "Network not initialsed (%d)", - /* 145 */ "Network up", - /* 146 */ "Network up, share mounted", - /* 147 */ "Never", - /* 148 */ "No", - /* 149 */ "No date saved", - /* 150 */ "No music", - /* 151 */ "No playtime saved", - /* 152 */ "No time saved", - /* 153 */ "None", - /* 154 */ "Normal (no scaling)", - /* 155 */ "OK", - /* 156 */ "Output rate:", - /* 157 */ "Override global MIDI settings", - /* 158 */ "Override global audio settings", - /* 159 */ "Override global graphic settings", - /* 160 */ "Override global volume settings", - /* 161 */ "PC Speaker Emulator", - /* 162 */ "Password:", - /* 163 */ "Path not a directory", - /* 164 */ "Path not a file", - /* 165 */ "Path not exists", - /* 166 */ "Paths", - /* 167 */ "Pause", - /* 168 */ "Pick the game:", - /* 169 */ "Platform the game was originally designed for", - /* 170 */ "Platform:", - /* 171 */ "Playtime: ", - /* 172 */ "Please select an action", - /* 173 */ "Plugins Path:", - /* 174 */ "Preferred Device:", - /* 175 */ "Press the key to associate", - /* 176 */ "Quit", - /* 177 */ "Quit ScummVM", - /* 178 */ "Read permission denied", - /* 179 */ "Reading failed", - /* 180 */ "Remap keys", - /* 181 */ "Remove game from the list. The game data files stay intact", - /* 182 */ "Render mode:", - /* 183 */ "Right", - /* 184 */ "Right Click", - /* 185 */ "Right click", - /* 186 */ "Rotate", - /* 187 */ "SFX volume:", - /* 188 */ "SMB", - /* 189 */ "Save", - /* 190 */ "Save Path:", - /* 191 */ "Save Path: ", - /* 192 */ "Save game:", - /* 193 */ "Scan complete!", - /* 194 */ "Scanned %d directories ...", - /* 195 */ "ScummVM Main Menu", - /* 196 */ "ScummVM could not find any engine capable of running the selected game!", - /* 197 */ "ScummVM could not find any game in the specified directory!", - /* 198 */ "ScummVM couldn't open the specified directory!", - /* 199 */ "Search in game list", - /* 200 */ "Search:", - /* 201 */ "Select SoundFont", - /* 202 */ "Select a Theme", - /* 203 */ "Select additional game directory", - /* 204 */ "Select an action and click 'Map'", - /* 205 */ "Select directory for GUI themes", - /* 206 */ "Select directory for extra files", - /* 207 */ "Select directory for plugins", - /* 208 */ "Select directory for saved games", - /* 209 */ "Select directory for savegames", - /* 210 */ "Select directory with game data", - /* 211 */ "Sensitivity", - /* 212 */ "Server:", - /* 213 */ "Share:", - /* 214 */ "Short game identifier used for referring to savegames and running the game from the command line", - /* 215 */ "Show Keyboard", - /* 216 */ "Show mouse cursor", - /* 217 */ "Show subtitles and play speech", - /* 218 */ "Show/Hide Cursor", - /* 219 */ "Skip", - /* 220 */ "Skip line", - /* 221 */ "Skip text", - /* 222 */ "Snap to edges", - /* 223 */ "Software scale (good quality, but slower)", - /* 224 */ "Sound on/off", - /* 225 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", - /* 226 */ "SoundFont:", - /* 227 */ "Spch", - /* 228 */ "Special dithering modes supported by some games", - /* 229 */ "Special sound effects volume", - /* 230 */ "Specifies default sound device for General MIDI output", - /* 231 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", - /* 232 */ "Specifies output sound device or sound card emulator", - /* 233 */ "Specifies path to additional data used by all games or ScummVM", - /* 234 */ "Specifies path to additional data used the game", - /* 235 */ "Specifies preferred sound device or sound card emulator", - /* 236 */ "Specifies where your savegames are put", - /* 237 */ "Speech", - /* 238 */ "Speech volume:", - /* 239 */ "Standard Renderer (16bpp)", - /* 240 */ "Start selected game", - /* 241 */ "Status:", - /* 242 */ "Subs", - /* 243 */ "Subtitle speed:", - /* 244 */ "Subtitles", - /* 245 */ "Swap character", - /* 246 */ "Tap for left click, double tap right click", - /* 247 */ "Text and Speech:", - /* 248 */ "The chosen directory cannot be written to. Please select another one.", - /* 249 */ "Theme Path:", - /* 250 */ "Theme:", - /* 251 */ "This game ID is already taken. Please choose another one.", - /* 252 */ "This game does not support loading games from the launcher.", - /* 253 */ "Time: ", - /* 254 */ "Timeout while initialising network", - /* 255 */ "Touch X Offset", - /* 256 */ "Touch Y Offset", - /* 257 */ "Touchpad mode disabled.", - /* 258 */ "Touchpad mode enabled.", - /* 259 */ "True Roland MT-32 (disable GM emulation)", - /* 260 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", - /* 261 */ "Unknown", - /* 262 */ "Unknown Error", - /* 263 */ "Unmount DVD", - /* 264 */ "Unmount SMB", - /* 265 */ "Unscaled (you must scroll left and right)", - /* 266 */ "Unsupported Color Mode", - /* 267 */ "Untitled savestate", - /* 268 */ "Up", - /* 269 */ "Use both MIDI and AdLib sound generation", - /* 270 */ "Use laptop trackpad-style cursor control", - /* 271 */ "Username:", - /* 272 */ "Using SDL driver ", - /* 273 */ "Vertical underscan:", - /* 274 */ "Video", - /* 275 */ "Virtual keyboard", - /* 276 */ "Volume", - /* 277 */ "Windows MIDI", - /* 278 */ "Write permission denied", - /* 279 */ "Writing data failed", - /* 280 */ "Yes", - /* 281 */ "You have to restart ScummVM to take the effect.", - /* 282 */ "Zone", - /* 283 */ "Zoom down", - /* 284 */ "Zoom up", - /* 285 */ "every 10 mins", - /* 286 */ "every 15 mins", - /* 287 */ "every 30 mins", - /* 288 */ "every 5 mins", - /* 289 */ "~A~bout", - /* 290 */ "~A~dd Game...", - /* 291 */ "~C~ancel", - /* 292 */ "~C~lose", - /* 293 */ "~E~dit Game...", - /* 294 */ "~H~elp", - /* 295 */ "~I~ndy fight controls", - /* 296 */ "~K~eys", - /* 297 */ "~L~eft handed mode", - /* 298 */ "~L~oad", - /* 299 */ "~L~oad...", - /* 300 */ "~N~ext", - /* 301 */ "~O~K", - /* 302 */ "~O~ptions", - /* 303 */ "~O~ptions...", - /* 304 */ "~P~revious", - /* 305 */ "~Q~uit", - /* 306 */ "~R~emove Game", - /* 307 */ "~R~esume", - /* 308 */ "~R~eturn to Launcher", - /* 309 */ "~S~ave", - /* 310 */ "~S~tart", - /* 311 */ "~T~ransitions Enabled", - /* 312 */ "~W~ater Effect Enabled", - /* 313 */ "~Z~ip Mode Activated", + /* 127 */ "MT-32", + /* 128 */ "MT-32 Device:", + /* 129 */ "MT-32 Emulator", + /* 130 */ "Main screen scaling:", + /* 131 */ "Map", + /* 132 */ "Mass Add...", + /* 133 */ "Menu", + /* 134 */ "Misc", + /* 135 */ "Mixed AdLib/MIDI mode", + /* 136 */ "Mount DVD", + /* 137 */ "Mount SMB", + /* 138 */ "Mouse click", + /* 139 */ "Multi Function", + /* 140 */ "Music Device:", + /* 141 */ "Music volume:", + /* 142 */ "Mute All", + /* 143 */ "Name:", + /* 144 */ "Network down", + /* 145 */ "Network not initialsed (%d)", + /* 146 */ "Network up", + /* 147 */ "Network up, share mounted", + /* 148 */ "Never", + /* 149 */ "No", + /* 150 */ "No date saved", + /* 151 */ "No music", + /* 152 */ "No playtime saved", + /* 153 */ "No time saved", + /* 154 */ "None", + /* 155 */ "Normal (no scaling)", + /* 156 */ "OK", + /* 157 */ "Output rate:", + /* 158 */ "Override global MIDI settings", + /* 159 */ "Override global MT-32 settings", + /* 160 */ "Override global audio settings", + /* 161 */ "Override global graphic settings", + /* 162 */ "Override global volume settings", + /* 163 */ "PC Speaker Emulator", + /* 164 */ "Password:", + /* 165 */ "Path not a directory", + /* 166 */ "Path not a file", + /* 167 */ "Path not exists", + /* 168 */ "Paths", + /* 169 */ "Pause", + /* 170 */ "Pick the game:", + /* 171 */ "Platform the game was originally designed for", + /* 172 */ "Platform:", + /* 173 */ "Playtime: ", + /* 174 */ "Please select an action", + /* 175 */ "Plugins Path:", + /* 176 */ "Preferred Device:", + /* 177 */ "Press the key to associate", + /* 178 */ "Quit", + /* 179 */ "Quit ScummVM", + /* 180 */ "Read permission denied", + /* 181 */ "Reading failed", + /* 182 */ "Remap keys", + /* 183 */ "Remove game from the list. The game data files stay intact", + /* 184 */ "Render mode:", + /* 185 */ "Right", + /* 186 */ "Right Click", + /* 187 */ "Right click", + /* 188 */ "Rotate", + /* 189 */ "SFX volume:", + /* 190 */ "SMB", + /* 191 */ "Save", + /* 192 */ "Save Path:", + /* 193 */ "Save Path: ", + /* 194 */ "Save game:", + /* 195 */ "Scan complete!", + /* 196 */ "Scanned %d directories ...", + /* 197 */ "ScummVM Main Menu", + /* 198 */ "ScummVM could not find any engine capable of running the selected game!", + /* 199 */ "ScummVM could not find any game in the specified directory!", + /* 200 */ "ScummVM couldn't open the specified directory!", + /* 201 */ "Search in game list", + /* 202 */ "Search:", + /* 203 */ "Select SoundFont", + /* 204 */ "Select a Theme", + /* 205 */ "Select additional game directory", + /* 206 */ "Select an action and click 'Map'", + /* 207 */ "Select directory for GUI themes", + /* 208 */ "Select directory for extra files", + /* 209 */ "Select directory for plugins", + /* 210 */ "Select directory for saved games", + /* 211 */ "Select directory for savegames", + /* 212 */ "Select directory with game data", + /* 213 */ "Sensitivity", + /* 214 */ "Server:", + /* 215 */ "Share:", + /* 216 */ "Short game identifier used for referring to savegames and running the game from the command line", + /* 217 */ "Show Keyboard", + /* 218 */ "Show mouse cursor", + /* 219 */ "Show subtitles and play speech", + /* 220 */ "Show/Hide Cursor", + /* 221 */ "Skip", + /* 222 */ "Skip line", + /* 223 */ "Skip text", + /* 224 */ "Snap to edges", + /* 225 */ "Software scale (good quality, but slower)", + /* 226 */ "Sound on/off", + /* 227 */ "SoundFont is supported by some audio cards, Fluidsynth and Timidity", + /* 228 */ "SoundFont:", + /* 229 */ "Spch", + /* 230 */ "Special dithering modes supported by some games", + /* 231 */ "Special sound effects volume", + /* 232 */ "Specifies default sound device for General MIDI output", + /* 233 */ "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output", + /* 234 */ "Specifies output sound device or sound card emulator", + /* 235 */ "Specifies path to additional data used by all games or ScummVM", + /* 236 */ "Specifies path to additional data used the game", + /* 237 */ "Specifies preferred sound device or sound card emulator", + /* 238 */ "Specifies where your savegames are put", + /* 239 */ "Speech", + /* 240 */ "Speech volume:", + /* 241 */ "Standard Renderer (16bpp)", + /* 242 */ "Start selected game", + /* 243 */ "Status:", + /* 244 */ "Subs", + /* 245 */ "Subtitle speed:", + /* 246 */ "Subtitles", + /* 247 */ "Swap character", + /* 248 */ "Tap for left click, double tap right click", + /* 249 */ "Text and Speech:", + /* 250 */ "The chosen directory cannot be written to. Please select another one.", + /* 251 */ "Theme Path:", + /* 252 */ "Theme:", + /* 253 */ "This game ID is already taken. Please choose another one.", + /* 254 */ "This game does not support loading games from the launcher.", + /* 255 */ "Time: ", + /* 256 */ "Timeout while initialising network", + /* 257 */ "Touch X Offset", + /* 258 */ "Touch Y Offset", + /* 259 */ "Touchpad mode disabled.", + /* 260 */ "Touchpad mode enabled.", + /* 261 */ "True Roland MT-32 (disable GM emulation)", + /* 262 */ "Turns off General MIDI mapping for games with Roland MT-32 soundtrack", + /* 263 */ "Unknown", + /* 264 */ "Unknown Error", + /* 265 */ "Unmount DVD", + /* 266 */ "Unmount SMB", + /* 267 */ "Unscaled (you must scroll left and right)", + /* 268 */ "Unsupported Color Mode", + /* 269 */ "Untitled savestate", + /* 270 */ "Up", + /* 271 */ "Use both MIDI and AdLib sound generation", + /* 272 */ "Use laptop trackpad-style cursor control", + /* 273 */ "Username:", + /* 274 */ "Using SDL driver ", + /* 275 */ "Vertical underscan:", + /* 276 */ "Video", + /* 277 */ "Virtual keyboard", + /* 278 */ "Volume", + /* 279 */ "Windows MIDI", + /* 280 */ "Write permission denied", + /* 281 */ "Writing data failed", + /* 282 */ "Yes", + /* 283 */ "You have to restart ScummVM to take the effect.", + /* 284 */ "Zone", + /* 285 */ "Zoom down", + /* 286 */ "Zoom up", + /* 287 */ "every 10 mins", + /* 288 */ "every 15 mins", + /* 289 */ "every 30 mins", + /* 290 */ "every 5 mins", + /* 291 */ "~A~bout", + /* 292 */ "~A~dd Game...", + /* 293 */ "~C~ancel", + /* 294 */ "~C~lose", + /* 295 */ "~E~dit Game...", + /* 296 */ "~H~elp", + /* 297 */ "~I~ndy fight controls", + /* 298 */ "~K~eys", + /* 299 */ "~L~eft handed mode", + /* 300 */ "~L~oad", + /* 301 */ "~L~oad...", + /* 302 */ "~N~ext", + /* 303 */ "~O~K", + /* 304 */ "~O~ptions", + /* 305 */ "~O~ptions...", + /* 306 */ "~P~revious", + /* 307 */ "~Q~uit", + /* 308 */ "~R~emove Game", + /* 309 */ "~R~esume", + /* 310 */ "~R~eturn to Launcher", + /* 311 */ "~S~ave", + /* 312 */ "~S~tart", + /* 313 */ "~T~ransitions Enabled", + /* 314 */ "~W~ater Effect Enabled", + /* 315 */ "~Z~ip Mode Activated", NULL }; @@ -324,7 +326,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -451,198 +453,199 @@ static const PoMessageEntry _translation_ru_RU[] = { { 124, "\315\334\343\333\357\342\336\340 MAME OPL:" }, { 125, "MIDI" }, { 126, "\303\341\330\333\325\335\330\325 MIDI:" }, - { 127, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, - { 128, "\315\334\343\333\357\342\336\340 MT-32" }, - { 129, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" }, - { 130, "\275\320\327\335\320\347\330\342\354" }, - { 131, "\264\336\321. \334\335\336\323\336..." }, - { 132, "\274\325\335\356" }, - { 133, "\300\320\327\335\336\325" }, - { 134, "\301\334\325\350\320\335\335\353\331 \340\325\326\330\334 AdLib/MIDI" }, - { 135, "\277\336\324\332\333\356\347\330\342\354 DVD" }, - { 136, "\277\336\324\332\333\356\347\330\342\354 SMB" }, - { 137, "\272\333\330\332 \334\353\350\354\356" }, - { 138, "\274\343\333\354\342\330\344\343\335\332\346\330\357" }, - { 139, "\303\341\342\340\336\331\342\341\322\336 GM:" }, - { 140, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, - { 141, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, - { 142, "\275\320\327\322\320\335\330\325:" }, - { 143, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, - { 144, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, - { 145, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, - { 146, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" }, - { 147, "\275\330\332\336\323\324\320" }, - { 148, "\275\325\342" }, - { 149, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, - { 150, "\261\325\327 \334\343\327\353\332\330" }, - { 151, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" }, - { 152, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" }, - { 153, "\275\325 \327\320\324\320\335" }, - { 154, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, - { 155, "OK" }, - { 156, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, - { 157, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, - { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, - { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, - { 160, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, - { 161, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" }, - { 162, "\277\320\340\336\333\354:" }, - { 163, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" }, - { 164, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" }, - { 165, "\277\343\342\354 \335\325 \335\320\331\324\325\335" }, - { 166, "\277\343\342\330" }, - { 167, "\277\320\343\327\320" }, - { 168, "\262\353\321\325\340\330\342\325 \330\323\340\343:" }, - { 169, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" }, - { 170, "\277\333\320\342\344\336\340\334\320:" }, - { 171, "\262\340\325\334\357 \330\323\340\353: " }, - { 172, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, - { 173, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, - { 174, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, - { 175, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, - { 176, "\262\353\345\336\324" }, - { 177, "\262\353\345\336\324 \330\327 ScummVM" }, - { 178, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" }, - { 179, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, - { 180, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, - { 181, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, - { 182, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, - { 183, "\262\337\340\320\322\336" }, - { 184, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, - { 185, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, - { 186, "\277\336\322\325\340\335\343\342\354" }, - { 187, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, - { 188, "SMB" }, - { 189, "\267\320\337\330\341\320\342\354" }, - { 190, "\277\343\342\354 \341\336\345\340.: " }, - { 191, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, - { 192, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, - { 193, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, - { 194, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, - { 195, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" }, - { 196, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" }, - { 197, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" }, - { 198, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" }, - { 199, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" }, - { 200, "\277\336\330\341\332:" }, - { 201, "\262\353\321\325\340\330\342\325 SoundFont" }, - { 202, "\262\353\321\325\340\330\342\325 \342\325\334\343" }, - { 203, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" }, - { 204, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" }, - { 205, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" }, - { 206, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" }, - { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" }, - { 208, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, - { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, - { 210, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" }, - { 211, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" }, - { 212, "\301\325\340\322\325\340:" }, - { 213, "\301\325\342\325\322\320\357 \337\320\337\332\320:" }, - { 214, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" }, - { 215, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, - { 216, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" }, - { 217, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" }, - { 218, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" }, - { 219, "\277\340\336\337\343\341\342\330\342\354" }, - { 220, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" }, - { 221, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" }, - { 222, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" }, - { 223, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" }, - { 224, "\267\322\343\332 \322\332\333/\322\353\332\333" }, - { 225, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" }, - { 226, "SoundFont:" }, - { 227, "\276\327\322" }, - { 228, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" }, - { 229, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" }, - { 230, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" }, - { 231, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, - { 232, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, - { 233, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" }, - { 234, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" }, - { 235, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, - { 236, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, - { 237, "\276\327\322\343\347\332\320" }, - { 238, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, - { 239, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, - { 240, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, - { 241, "\301\336\341\342\336\357\335\330\325:" }, - { 242, "\301\343\321" }, - { 243, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, - { 244, "\301\343\321\342\330\342\340\353" }, - { 245, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, - { 246, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, - { 247, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, - { 248, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, - { 249, "\277\343\342\354 \332 \342\325\334\320\334:" }, - { 250, "\302\325\334\320:" }, - { 251, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, - { 252, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, - { 253, "\262\340\325\334\357: " }, - { 254, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" }, - { 255, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" }, - { 256, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" }, - { 257, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." }, - { 258, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." }, - { 259, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" }, - { 260, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" }, - { 261, "\275\325\330\327\322\325\341\342\335\336" }, - { 262, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" }, - { 263, "\276\342\332\333\356\347\330\342\354 DVD" }, - { 264, "\276\342\332\333\356\347\342\354 SMB" }, - { 265, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" }, - { 266, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" }, - { 267, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" }, - { 268, "\262\322\325\340\345" }, - { 269, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" }, - { 270, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" }, - { 271, "\277\336\333\354\327\336\322\320\342\325\333\354:" }, - { 272, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " }, - { 273, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" }, - { 274, "\262\330\324\325\336" }, - { 275, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" }, - { 276, "\263\340\336\334\332\336\341\342\354" }, - { 277, "Windows MIDI" }, - { 278, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" }, - { 279, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" }, - { 280, "\264\320" }, - { 281, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." }, - { 282, "\267\336\335\320" }, - { 283, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" }, - { 284, "\303\322\325\333. \334\320\341\350\342\320\321" }, - { 285, "\332\320\326\324\353\325 10 \334\330\335\343\342" }, - { 286, "\332\320\326\324\353\325 15 \334\330\335\343\342" }, - { 287, "\332\320\326\324\353\325 30 \334\330\335\343\342" }, - { 288, "\332\320\326\324\353\325 5 \334\330\335\343\342" }, - { 289, "\276 \337\340\336~\323~\340\320\334\334\325" }, - { 290, "~\264~\336\321. \330\323\340\343..." }, - { 291, "\276~\342~\334\325\335\320" }, - { 292, "~\267~\320\332\340\353\342\354" }, - { 293, "\270\327~\334~. \330\323\340\343..." }, - { 294, "~\277~\336\334\336\351\354" }, - { 295, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, - { 296, "~\272~\333\320\322\330\350\330" }, - { 297, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, - { 298, "~\267~\320\323\340\343\327\330\342\354" }, - { 299, "~\267~\320\323\340...." }, - { 300, "~\301~\333\325\324" }, - { 301, "~O~K" }, - { 302, "~\276~\337\346\330\330" }, - { 303, "~\276~\337\346\330\330..." }, - { 304, "~\277~\340\325\324" }, - { 305, "~\262~\353\345\336\324" }, - { 306, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, - { 307, "\277\340\336\324\336\333~\326~\330\342\354" }, - { 308, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, - { 309, "~\267~\320\337\330\341\320\342\354" }, - { 310, "\277~\343~\341\332" }, - { 311, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, - { 312, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" }, - { 313, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" }, + { 128, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, + { 129, "\315\334\343\333\357\342\336\340 MT-32" }, + { 130, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" }, + { 131, "\275\320\327\335\320\347\330\342\354" }, + { 132, "\264\336\321. \334\335\336\323\336..." }, + { 133, "\274\325\335\356" }, + { 134, "\300\320\327\335\336\325" }, + { 135, "\301\334\325\350\320\335\335\353\331 \340\325\326\330\334 AdLib/MIDI" }, + { 136, "\277\336\324\332\333\356\347\330\342\354 DVD" }, + { 137, "\277\336\324\332\333\356\347\330\342\354 SMB" }, + { 138, "\272\333\330\332 \334\353\350\354\356" }, + { 139, "\274\343\333\354\342\330\344\343\335\332\346\330\357" }, + { 140, "\303\341\342\340\336\331\342\341\322\336 GM:" }, + { 141, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, + { 142, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, + { 143, "\275\320\327\322\320\335\330\325:" }, + { 144, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, + { 145, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, + { 146, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, + { 147, "\301\325\342\354 \340\320\321\336\342\320\325\342, \337\320\337\332\320 \337\336\324\332\333\356\347\325\335\320" }, + { 148, "\275\330\332\336\323\324\320" }, + { 149, "\275\325\342" }, + { 150, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, + { 151, "\261\325\327 \334\343\327\353\332\330" }, + { 152, "\262\340\325\334\357 \330\323\340\353 \335\325 \327\320\337\330\341\320\335\336" }, + { 153, "\262\340\325\334\357 \335\325 \327\320\337\330\341\320\335\336" }, + { 154, "\275\325 \327\320\324\320\335" }, + { 155, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, + { 156, "OK" }, + { 157, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, + { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 160, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, + { 161, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, + { 162, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, + { 163, "\315\334\343\333\357\342\336\340 PC \341\337\330\332\325\340\320" }, + { 164, "\277\320\340\336\333\354:" }, + { 165, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \324\330\340\325\332\342\336\340\330\325\331" }, + { 166, "\277\343\342\354 \335\325 \357\322\333\357\325\342\341\357 \344\320\331\333\336\334" }, + { 167, "\277\343\342\354 \335\325 \335\320\331\324\325\335" }, + { 168, "\277\343\342\330" }, + { 169, "\277\320\343\327\320" }, + { 170, "\262\353\321\325\340\330\342\325 \330\323\340\343:" }, + { 171, "\277\333\320\342\344\336\340\334\320, \324\333\357 \332\336\342\336\340\336\331 \330\323\340\320 \321\353\333\320 \330\327\335\320\347\320\333\354\335\336 \340\320\327\340\320\321\336\342\320\335\320" }, + { 172, "\277\333\320\342\344\336\340\334\320:" }, + { 173, "\262\340\325\334\357 \330\323\340\353: " }, + { 174, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, + { 175, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, + { 176, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, + { 177, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, + { 178, "\262\353\345\336\324" }, + { 179, "\262\353\345\336\324 \330\327 ScummVM" }, + { 180, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \347\342\325\335\330\357" }, + { 181, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, + { 182, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, + { 183, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, + { 184, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, + { 185, "\262\337\340\320\322\336" }, + { 186, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 187, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, + { 188, "\277\336\322\325\340\335\343\342\354" }, + { 189, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, + { 190, "SMB" }, + { 191, "\267\320\337\330\341\320\342\354" }, + { 192, "\277\343\342\354 \341\336\345\340.: " }, + { 193, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, + { 194, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, + { 195, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, + { 196, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, + { 197, "\263\333\320\322\335\336\325 \334\325\335\356 ScummVM" }, + { 198, "ScummVM \335\325 \341\334\336\323 \335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\320 \322\353\321\340\320\335\335\336\331 \330\323\340\353!" }, + { 199, "ScummVM \335\325 \334\336\326\325\342 \335\320\331\342\330 \330\323\340\343 \322 \343\332\320\327\320\335\335\336\331 \324\330\340\325\332\342\336\340\330\330!" }, + { 200, "ScummVM \335\325 \334\336\326\325\342 \336\342\332\340\353\342\354 \343\332\320\327\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356!" }, + { 201, "\277\336\330\341\332 \322 \341\337\330\341\332\325 \330\323\340" }, + { 202, "\277\336\330\341\332:" }, + { 203, "\262\353\321\325\340\330\342\325 SoundFont" }, + { 204, "\262\353\321\325\340\330\342\325 \342\325\334\343" }, + { 205, "\262\353\321\325\340\330\342\325 \324\336\337\336\333\335\330\342\325\333\354\335\343\356 \324\330\340\325\332\342\336\340\330\356 \330\323\340\353" }, + { 206, "\262\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325 \330 \332\333\330\332\335\330\342\325 '\275\320\327\335\320\347\330\342\354'" }, + { 207, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \342\325\334 GUI" }, + { 208, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \324\336\337\336\333\335\330\342\325\333\354\335\353\334\330 \344\320\331\333\320\334\330" }, + { 209, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \337\333\320\323\330\335\320\334\330" }, + { 210, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 211, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \324\333\357 \341\336\345\340\320\335\325\335\330\331" }, + { 212, "\262\353\321\325\340\330\342\325 \324\330\340\325\332\342\336\340\330\356 \341 \344\320\331\333\320\334\330 \330\323\340\353" }, + { 213, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354" }, + { 214, "\301\325\340\322\325\340:" }, + { 215, "\301\325\342\325\322\320\357 \337\320\337\332\320:" }, + { 216, "\272\336\340\336\342\332\330\331 \330\324\325\335\342\330\344\330\332\320\342\336\340, \330\341\337\336\333\354\327\343\325\334\353\331 \324\333\357 \330\334\325\335 \341\336\345\340\320\335\325\335\330\331 \330\323\340 \330 \324\333\357 \327\320\337\343\341\332\320 \330\327 \332\336\334\320\335\324\335\336\331 \341\342\340\336\332\330" }, + { 217, "\277\336\332\320\327\320\342\354 \332\333\320\322\330\320\342\343\340\343" }, + { 218, "\277\336\332\320\327\353\322\320\342\354 \332\343\340\341\336\340 \334\353\350\330" }, + { 219, "\277\336\332\320\327\353\322\320\342\354 \341\343\321\342\330\342\340\353 \330 \322\336\341\337\340\336\330\327\322\336\324\330\342\354 \340\325\347\354" }, + { 220, "\277\336\332\320\327\320\342\354/\303\321\340\320\342\354 \332\343\340\341\336\340" }, + { 221, "\277\340\336\337\343\341\342\330\342\354" }, + { 222, "\277\340\336\337\343\341\342\330\342\354 \341\342\340\336\332\343" }, + { 223, "\277\340\336\337\343\341\342\330\342\354 \342\325\332\341\342" }, + { 224, "\277\340\330\332\340\325\337\330\342\354 \332 \323\340\320\335\330\346\320\334" }, + { 225, "\277\340\336\323\340\320\334\334\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\345\336\340\336\350\325\325 \332\320\347\325\341\342\322\336, \335\336 \334\325\324\333\325\335\335\325\325)" }, + { 226, "\267\322\343\332 \322\332\333/\322\353\332\333" }, + { 227, "SoundFont\353 \337\336\324\324\325\340\324\326\330\322\320\356\342\341\357 \335\325\332\336\342\336\340\353\334\330 \327\322\343\332\336\322\353\334\330 \332\320\340\342\320\334\330, Fluidsynth \330 Timidity" }, + { 228, "SoundFont:" }, + { 229, "\276\327\322" }, + { 230, "\301\337\325\346\330\320\333\354\335\353\325 \340\325\326\330\334\353 \340\325\335\324\325\340\330\335\323\320, \337\336\324\324\325\340\326\330\322\320\325\334\353\325 \335\325\332\336\342\336\340\353\334\330 \330\323\340\320\334\330" }, + { 231, "\263\340\336\334\332\336\341\342\354 \341\337\325\346\330\320\333\354\335\353\345 \327\322\343\332\336\322\353\345 \355\344\344\325\332\342\336\322" }, + { 232, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \324\333\357 MIDI" }, + { 233, "\303\332\320\327\353\322\320\325\342 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \337\336 \343\334\336\333\347\320\335\330\357 \324\333\357 \322\353\322\336\324\320 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 235, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345, \330\341\337\336\333\354\327\343\325\334\353\345 \322\341\325\334\330 \330\323\340\320\334\330, \333\330\321\336 ScummVM" }, + { 236, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \324\336\337\336\333\335\330\342\325\333\354\335\353\334 \344\320\331\333\320\334 \324\320\335\335\353\345 \324\333\357 \330\323\340\353" }, + { 237, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, + { 238, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, + { 239, "\276\327\322\343\347\332\320" }, + { 240, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, + { 241, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, + { 242, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, + { 243, "\301\336\341\342\336\357\335\330\325:" }, + { 244, "\301\343\321" }, + { 245, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, + { 246, "\301\343\321\342\330\342\340\353" }, + { 247, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, + { 248, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, + { 249, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, + { 250, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, + { 251, "\277\343\342\354 \332 \342\325\334\320\334:" }, + { 252, "\302\325\334\320:" }, + { 253, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, + { 254, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, + { 255, "\262\340\325\334\357: " }, + { 256, "\262\340\325\334\357 \337\336\324\332\333\356\347\325\335\330\357 \332 \341\325\342\330 \330\341\342\325\332\333\336" }, + { 257, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 X" }, + { 258, "\301\334\325\351\325\335\330\325 \332\320\341\320\335\330\331 \337\336 \336\341\330 Y" }, + { 259, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\353\332\333\356\347\325\335." }, + { 260, "\300\325\326\330\334 \342\320\347\337\320\324\320 \322\332\333\356\347\325\335." }, + { 261, "\275\320\341\342\336\357\351\330\331 Roland MT-32 (\327\320\337\340\325\342\330\342\354 \355\334\343\333\357\346\330\356 GM)" }, + { 262, "\262\353\332\333\356\347\320\325\342 \334\320\337\337\330\335\323 General MIDI \324\333\357 \330\323\340 \341 \327\322\343\332\336\322\336\331 \324\336\340\336\326\332\336\331 \324\333\357 Roland MT-32" }, + { 263, "\275\325\330\327\322\325\341\342\335\336" }, + { 264, "\275\325\330\327\322\325\341\342\335\320\357 \336\350\330\321\332\320" }, + { 265, "\276\342\332\333\356\347\330\342\354 DVD" }, + { 266, "\276\342\332\333\356\347\342\354 SMB" }, + { 267, "\261\325\327 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\357 (\335\343\326\335\336 \321\343\324\325\342 \337\340\336\332\340\343\347\330\322\320\342\354 \322\333\325\322\336 \330 \322\337\340\320\322\336)" }, + { 268, "\275\325\337\336\324\324\325\340\326\330\322\320\325\334\353\331 \340\325\326\330\334 \346\322\325\342\320" }, + { 269, "\301\336\345\340\320\335\325\335\330\325 \321\325\327 \330\334\325\335\330" }, + { 270, "\262\322\325\340\345" }, + { 271, "\270\341\337\336\333\354\327\336\322\320\342\354 \330 MIDI \330 AdLib \324\333\357 \323\325\335\325\340\320\346\330\330 \327\322\343\332\320" }, + { 272, "\270\341\337\336\333\354\327\336\322\320\342\354 \343\337\340\320\322\333\325\335\330\325 \332\343\340\341\336\340\336\334 \332\320\332 \335\320 \342\340\325\332\337\320\324\325 \333\325\337\342\336\337\336\322" }, + { 273, "\277\336\333\354\327\336\322\320\342\325\333\354:" }, + { 274, "\270\341\337\336\333\354\327\343\356 \324\340\320\331\322\325\340 SDL " }, + { 275, "\262\325\340\342\330\332\320\333\354\335\353\331 underscan:" }, + { 276, "\262\330\324\325\336" }, + { 277, "\262\330\340\342\343\320\333\354\335\320\357 \332\333\320\322\330\320\342\343\340\320" }, + { 278, "\263\340\336\334\332\336\341\342\354" }, + { 279, "Windows MIDI" }, + { 280, "\275\325\324\336\341\342\320\342\336\347\335\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\330" }, + { 281, "\276\350\330\321\332\320 \327\320\337\330\341\330 \324\320\335\335\353\345" }, + { 282, "\264\320" }, + { 283, "\262\353 \324\336\333\326\335\353 \337\325\340\325\327\320\337\343\341\342\330\342\354 ScummVM \347\342\336\321\353 \337\340\330\334\325\335\330\342\354 \330\327\334\325\335\325\335\330\357." }, + { 284, "\267\336\335\320" }, + { 285, "\303\334\325\335\354\350. \334\320\341\350\342\320\321" }, + { 286, "\303\322\325\333. \334\320\341\350\342\320\321" }, + { 287, "\332\320\326\324\353\325 10 \334\330\335\343\342" }, + { 288, "\332\320\326\324\353\325 15 \334\330\335\343\342" }, + { 289, "\332\320\326\324\353\325 30 \334\330\335\343\342" }, + { 290, "\332\320\326\324\353\325 5 \334\330\335\343\342" }, + { 291, "\276 \337\340\336~\323~\340\320\334\334\325" }, + { 292, "~\264~\336\321. \330\323\340\343..." }, + { 293, "\276~\342~\334\325\335\320" }, + { 294, "~\267~\320\332\340\353\342\354" }, + { 295, "\270\327~\334~. \330\323\340\343..." }, + { 296, "~\277~\336\334\336\351\354" }, + { 297, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, + { 298, "~\272~\333\320\322\330\350\330" }, + { 299, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, + { 300, "~\267~\320\323\340\343\327\330\342\354" }, + { 301, "~\267~\320\323\340...." }, + { 302, "~\301~\333\325\324" }, + { 303, "~O~K" }, + { 304, "~\276~\337\346\330\330" }, + { 305, "~\276~\337\346\330\330..." }, + { 306, "~\277~\340\325\324" }, + { 307, "~\262~\353\345\336\324" }, + { 308, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, + { 309, "\277\340\336\324\336\333~\326~\330\342\354" }, + { 310, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, + { 311, "~\267~\320\337\330\341\320\342\354" }, + { 312, "\277~\343~\341\332" }, + { 313, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, + { 314, "\315\344\344\325\332\342\353 \322\336\324\353 \322\332\333\356\347\325\335\353" }, + { 315, "\300\325\326\330\334 \321\353\341\342\340\336\323\336 \337\325\340\325\345\336\324\320 \320\332\342\330\322\330\340\336\322\320\335" }, { -1, NULL } }; static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-07-09 18:17+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nLanguage: Francais\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:18+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, { 1, "Voulez-vous vraiment quitter?" }, { 2, "(Actif)" }, { 3, "(Jeu)" }, @@ -769,198 +772,200 @@ static const PoMessageEntry _translation_fr_FR[] = { { 124, "\311mulateur MAME OPL" }, { 125, "MIDI" }, { 126, "Gain MIDI:" }, - { 127, "Sortie MT-32:" }, - { 128, "\311mulateur MT-32" }, - { 129, "\311chelle de l'\351cran principal" }, - { 130, "Affecter" }, - { 131, "Ajout Massif..." }, - { 132, "Menu" }, - { 133, "Divers" }, - { 134, "Mode mixe AdLib/MIDI" }, - { 135, "Monter le DVD" }, - { 136, "Monter SMB" }, - { 137, "Clic de souris" }, - { 138, "Fonction Multiple" }, - { 139, "Sortie Audio:" }, - { 140, "Volume Musique:" }, - { 141, "Silence" }, - { 142, "Nom:" }, - { 143, "R\351seau d\351connect\351" }, - { 144, "R\351seau non initialis\351 (%d)" }, - { 145, "R\351seau connect\351" }, - { 146, "R\351seau connect\351, disque partag\351 mont\351" }, - { 147, "Jamais" }, - { 148, "Non" }, - { 149, "Date non sauv\351e" }, - { 150, "Pas de musique" }, - { 151, "Dur\351e de jeu non sauv\351e" }, - { 152, "Heure non sauv\351e" }, - { 153, "Aucun" }, - { 154, "Normal (\351chelle d'origine)" }, - { 155, "OK" }, - { 156, "Fr\351quence:" }, - { 157, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, - { 158, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, - { 159, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, - { 160, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, - { 161, "\311mulateur Haut Parleur PC" }, - { 162, "Mot de passe:" }, - { 163, "Chemin n'est pas un r\351pertoire" }, - { 164, "Chemin n'est pas un fichier" }, - { 165, "Chemin inexistant" }, - { 166, "Chemins" }, - { 167, "Mettre en pause" }, - { 168, "Choisissez le jeu:" }, - { 169, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 170, "Plateforme:" }, - { 171, "Dur\351e de jeu:" }, - { 172, "Selectionnez une action" }, - { 173, "Plugins:" }, - { 174, "Sortie Pr\351f\351r\351:" }, - { 175, "Appuyez sur la touche \340 associer" }, - { 176, "Quitter" }, - { 177, "Quitter ScummVM" }, - { 178, "V\351roulli\351 en lecture" }, - { 179, "Echec de la lecture" }, - { 180, "Changer l'affectation des touches" }, - { 181, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 182, "Mode de rendu:" }, - { 183, "Droite" }, - { 184, "Clic Droit" }, - { 185, "Clic droit" }, - { 186, "Pivoter" }, - { 187, "Volume Bruitage:" }, - { 188, "SMB" }, - { 189, "Sauver" }, - { 190, "Sauvegardes:" }, - { 191, "Sauvegardes:" }, - { 192, "Sauvegarde:" }, - { 193, "Examen termin\351!" }, - { 194, "%d r\351pertoires examin\351s ..." }, - { 195, "Menu Principal ScummVM" }, - { 196, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 197, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 198, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 199, "Recherche dans la liste de jeux" }, - { 200, "Filtre:" }, - { 201, "Choisir une banque de sons" }, - { 202, "S\351lectionnez un Th\350me" }, - { 203, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 204, "Selectionez une action et cliquez 'Affecter'" }, - { 205, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 206, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 207, "S\351lectionner le r\351pertoire des plugins" }, - { 208, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 209, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 210, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 211, "Sensibilit\351" }, - { 212, "Serveur:" }, - { 213, "Disque partag\351:" }, - { 214, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 215, "Afficher le clavier" }, - { 216, "Afficher le curseur de la souris" }, - { 217, "Affiche les sous-titres et joue les dialogues audio" }, - { 218, "Afficher/Cacher le curseur" }, - { 219, "Passer" }, - { 220, "Passer la phrase" }, - { 221, "Sauter le texte" }, - { 222, "Aligner sur les bords" }, - { 223, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 224, "Audio marche/arr\352t" }, - { 225, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 226, "Banque de sons:" }, - { 227, "Audio" }, - { 228, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 229, "Volume des effets sp\351ciaux sonores" }, - { 230, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, - { 231, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, - { 232, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 233, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 234, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 235, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, - { 236, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 237, "Audio" }, - { 238, "Volume Dialogues:" }, - { 239, "Standard (16bpp)" }, - { 240, "D\351marre le jeu s\351lectionn\351" }, - { 241, "Status:" }, - { 242, "Subs" }, - { 243, "Vitesse des ST:" }, - { 244, "Sous-titres" }, - { 245, "Changement de personnage" }, - { 246, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 247, "Dialogue:" }, - { 248, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 249, "Th\350mes:" }, - { 250, "Th\350me:" }, - { 251, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 252, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 253, "Heure:" }, - { 254, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 255, "D\351calage X du toucher" }, - { 256, "D\351callage Y du toucher" }, - { 257, "Mode touchpad d\351sactiv\351" }, - { 258, "Mode touchpad activ\351" }, - { 259, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 260, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 261, "Inconue" }, - { 262, "Erreur inconnue" }, - { 263, "D\351monter le DVD" }, - { 264, "D\351monter SMB" }, - { 265, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 266, "Mode de couleurs non support\351" }, - { 267, "Sauvegarde sans nom" }, - { 268, "Haut" }, - { 269, "Utiliser \340 la fois MIDI et AdLib" }, - { 270, "Activer le contr\364le du curseur de type trackpad" }, - { 271, "Nom d'utilisateur:" }, - { 272, "Utilise le pilote SDL" }, - { 273, "Underscan vertical:" }, - { 274, "Vid\351o" }, - { 275, "Clavier virtuel" }, - { 276, "Volume" }, - { 277, "MIDI Windows" }, - { 278, "Verrouill\351 en \351criture" }, - { 279, "Echec de l'\351criture des donn\351es" }, - { 280, "Oui" }, - { 281, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 282, "Zone" }, - { 283, "Zoomer" }, - { 284, "D\351zoomer" }, - { 285, "Toutes les 10 mins" }, - { 286, "Toutes les 15 mins" }, - { 287, "Toutes les 30 mins" }, - { 288, "Toutes les 5 mins" }, - { 289, "\300 ~P~ropos" }, - { 290, "~A~jouter..." }, - { 291, "~A~nnuler" }, - { 292, "~F~ermer" }, - { 293, "~E~diter..." }, - { 294, "~A~ide" }, - { 295, "Contr\364le des combats d'~I~ndy" }, - { 296, "~T~ouches" }, - { 297, "Mode ~G~aucher" }, - { 298, "~C~harger" }, - { 299, "~C~harger" }, - { 300, "~S~uivant" }, - { 301, "~O~K" }, - { 302, "~O~ptions" }, - { 303, "~O~ptions..." }, - { 304, "~P~r\351c\351dent" }, - { 305, "~Q~uitter" }, - { 306, "~S~upprimer" }, - { 307, "~R~eprendre" }, - { 308, "Retour au ~L~anceur" }, - { 309, "~S~auver" }, - { 310, "~D~\351marrer" }, - { 311, "T~r~ansitions activ\351" }, - { 312, "~E~ffets de l'Eau Activ\351s" }, - { 313, "Mode ~Z~ip Activ\351" }, + { 127, "MT-32" }, + { 128, "Sortie MT-32:" }, + { 129, "\311mulateur MT-32" }, + { 130, "\311chelle de l'\351cran principal" }, + { 131, "Affecter" }, + { 132, "Ajout Massif..." }, + { 133, "Menu" }, + { 134, "Divers" }, + { 135, "Mode mixe AdLib/MIDI" }, + { 136, "Monter le DVD" }, + { 137, "Monter SMB" }, + { 138, "Clic de souris" }, + { 139, "Fonction Multiple" }, + { 140, "Sortie Audio:" }, + { 141, "Volume Musique:" }, + { 142, "Silence" }, + { 143, "Nom:" }, + { 144, "R\351seau d\351connect\351" }, + { 145, "R\351seau non initialis\351 (%d)" }, + { 146, "R\351seau connect\351" }, + { 147, "R\351seau connect\351, disque partag\351 mont\351" }, + { 148, "Jamais" }, + { 149, "Non" }, + { 150, "Date non sauv\351e" }, + { 151, "Pas de musique" }, + { 152, "Dur\351e de jeu non sauv\351e" }, + { 153, "Heure non sauv\351e" }, + { 154, "Aucun" }, + { 155, "Normal (\351chelle d'origine)" }, + { 156, "OK" }, + { 157, "Fr\351quence:" }, + { 158, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, + { 159, "Utiliser des r\351glages MT-32 sp\351cifiques \340 ce jeux" }, + { 160, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, + { 161, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, + { 162, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, + { 163, "\311mulateur Haut Parleur PC" }, + { 164, "Mot de passe:" }, + { 165, "Chemin n'est pas un r\351pertoire" }, + { 166, "Chemin n'est pas un fichier" }, + { 167, "Chemin inexistant" }, + { 168, "Chemins" }, + { 169, "Mettre en pause" }, + { 170, "Choisissez le jeu:" }, + { 171, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 172, "Plateforme:" }, + { 173, "Dur\351e de jeu:" }, + { 174, "Selectionnez une action" }, + { 175, "Plugins:" }, + { 176, "Sortie Pr\351f\351r\351:" }, + { 177, "Appuyez sur la touche \340 associer" }, + { 178, "Quitter" }, + { 179, "Quitter ScummVM" }, + { 180, "V\351roulli\351 en lecture" }, + { 181, "Echec de la lecture" }, + { 182, "Changer l'affectation des touches" }, + { 183, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 184, "Mode de rendu:" }, + { 185, "Droite" }, + { 186, "Clic Droit" }, + { 187, "Clic droit" }, + { 188, "Pivoter" }, + { 189, "Volume Bruitage:" }, + { 190, "SMB" }, + { 191, "Sauver" }, + { 192, "Sauvegardes:" }, + { 193, "Sauvegardes:" }, + { 194, "Sauvegarde:" }, + { 195, "Examen termin\351!" }, + { 196, "%d r\351pertoires examin\351s ..." }, + { 197, "Menu Principal ScummVM" }, + { 198, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 199, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 200, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 201, "Recherche dans la liste de jeux" }, + { 202, "Filtre:" }, + { 203, "Choisir une banque de sons" }, + { 204, "S\351lectionnez un Th\350me" }, + { 205, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 206, "Selectionez une action et cliquez 'Affecter'" }, + { 207, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 208, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 209, "S\351lectionner le r\351pertoire des plugins" }, + { 210, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 211, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 212, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 213, "Sensibilit\351" }, + { 214, "Serveur:" }, + { 215, "Disque partag\351:" }, + { 216, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 217, "Afficher le clavier" }, + { 218, "Afficher le curseur de la souris" }, + { 219, "Affiche les sous-titres et joue les dialogues audio" }, + { 220, "Afficher/Cacher le curseur" }, + { 221, "Passer" }, + { 222, "Passer la phrase" }, + { 223, "Sauter le texte" }, + { 224, "Aligner sur les bords" }, + { 225, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 226, "Audio marche/arr\352t" }, + { 227, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 228, "Banque de sons:" }, + { 229, "Audio" }, + { 230, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 231, "Volume des effets sp\351ciaux sonores" }, + { 232, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, + { 233, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 235, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 236, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 237, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, + { 238, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 239, "Audio" }, + { 240, "Volume Dialogues:" }, + { 241, "Standard (16bpp)" }, + { 242, "D\351marre le jeu s\351lectionn\351" }, + { 243, "Status:" }, + { 244, "Subs" }, + { 245, "Vitesse des ST:" }, + { 246, "Sous-titres" }, + { 247, "Changement de personnage" }, + { 248, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 249, "Dialogue:" }, + { 250, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 251, "Th\350mes:" }, + { 252, "Th\350me:" }, + { 253, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 254, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 255, "Heure:" }, + { 256, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 257, "D\351calage X du toucher" }, + { 258, "D\351callage Y du toucher" }, + { 259, "Mode touchpad d\351sactiv\351" }, + { 260, "Mode touchpad activ\351" }, + { 261, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 262, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 263, "Inconue" }, + { 264, "Erreur inconnue" }, + { 265, "D\351monter le DVD" }, + { 266, "D\351monter SMB" }, + { 267, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 268, "Mode de couleurs non support\351" }, + { 269, "Sauvegarde sans nom" }, + { 270, "Haut" }, + { 271, "Utiliser \340 la fois MIDI et AdLib" }, + { 272, "Activer le contr\364le du curseur de type trackpad" }, + { 273, "Nom d'utilisateur:" }, + { 274, "Utilise le pilote SDL" }, + { 275, "Underscan vertical:" }, + { 276, "Vid\351o" }, + { 277, "Clavier virtuel" }, + { 278, "Volume" }, + { 279, "MIDI Windows" }, + { 280, "Verrouill\351 en \351criture" }, + { 281, "Echec de l'\351criture des donn\351es" }, + { 282, "Oui" }, + { 283, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 284, "Zone" }, + { 285, "Zoomer" }, + { 286, "D\351zoomer" }, + { 287, "Toutes les 10 mins" }, + { 288, "Toutes les 15 mins" }, + { 289, "Toutes les 30 mins" }, + { 290, "Toutes les 5 mins" }, + { 291, "\300 ~P~ropos" }, + { 292, "~A~jouter..." }, + { 293, "~A~nnuler" }, + { 294, "~F~ermer" }, + { 295, "~E~diter..." }, + { 296, "~A~ide" }, + { 297, "Contr\364le des combats d'~I~ndy" }, + { 298, "~T~ouches" }, + { 299, "Mode ~G~aucher" }, + { 300, "~C~harger" }, + { 301, "~C~harger" }, + { 302, "~S~uivant" }, + { 303, "~O~K" }, + { 304, "~O~ptions" }, + { 305, "~O~ptions..." }, + { 306, "~P~r\351c\351dent" }, + { 307, "~Q~uitter" }, + { 308, "~S~upprimer" }, + { 309, "~R~eprendre" }, + { 310, "Retour au ~L~anceur" }, + { 311, "~S~auver" }, + { 312, "~D~\351marrer" }, + { 313, "T~r~ansitions activ\351" }, + { 314, "~E~ffets de l'Eau Activ\351s" }, + { 315, "Mode ~Z~ip Activ\351" }, { -1, NULL } }; static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nLanguage: Italiano\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, { 1, " Sei sicuro di voler uscire? " }, { 2, " (Attivo)" }, { 3, " (Gioco)" }, @@ -1087,198 +1092,199 @@ static const PoMessageEntry _translation_it_IT[] = { { 124, "Emulatore OPL MAME" }, { 125, "MIDI" }, { 126, "Guadagno MIDI:" }, - { 127, "Disposit. MT32:" }, - { 128, "Emulatore MT-32" }, - { 129, "Schermo principale:" }, - { 130, "Mappa" }, - { 131, "Agg. in massa..." }, - { 132, "Menu" }, - { 133, "Varie" }, - { 134, "Modalit\340 mista AdLib/MIDI" }, - { 135, "Monta DVD" }, - { 136, "Monta SMB" }, - { 137, "Clic del mouse" }, - { 138, "Multifunzione" }, - { 139, "Dispositivo GM:" }, - { 140, "Volume musica:" }, - { 141, "Disattiva audio" }, - { 142, "Nome:" }, - { 143, "Rete disattivata" }, - { 144, "Rete non avviata (%d)" }, - { 145, "Rete attiva" }, - { 146, "Rete attiva, condivisione montata" }, - { 147, "Mai" }, - { 148, "No" }, - { 149, "Nessuna data salvata" }, - { 150, "Nessuna musica" }, - { 151, "Nessun tempo salvato" }, - { 152, "Nessun orario salvato" }, - { 153, "Nessuno" }, - { 154, "Normale (nessun ridimensionamento)" }, - { 155, "OK" }, - { 156, "Frequenza:" }, - { 157, "Ignora le impostazioni MIDI globali" }, - { 158, "Ignora le impostazioni audio globali" }, - { 159, "Ignora le impostazioni grafiche globali" }, - { 160, "Ignora le impostazioni globali di volume" }, - { 161, "Emulatore PC Speaker" }, - { 162, "Password:" }, - { 163, "Il percorso non \350 una cartella" }, - { 164, "Il percorso non \350 un file" }, - { 165, "Il percorso non esiste" }, - { 166, "Percorsi" }, - { 167, "Pausa" }, - { 168, "Scegli il gioco:" }, - { 169, "La piattaforma per la quale il gioco \350 stato concepito" }, - { 170, "Piattaforma:" }, - { 171, "Tempo di gioco: " }, - { 172, "Seleziona un'azione" }, - { 173, "Percorso plugin:" }, - { 174, "Disp. preferito:" }, - { 175, "Premi il tasto da associare" }, - { 176, "Esci" }, - { 177, "Chiudi ScummVM" }, - { 178, "Autorizzazione di lettura negata" }, - { 179, "Lettura fallita" }, - { 180, "Riprogramma tasti" }, - { 181, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, - { 182, "Resa grafica:" }, - { 183, "Destra" }, - { 184, "Clic destro" }, - { 185, "Clic destro" }, - { 186, "Rotazione" }, - { 187, "Volume effetti:" }, - { 188, "SMB" }, - { 189, "Salva" }, - { 190, "Salvataggi:" }, - { 191, "Salvataggi:" }, - { 192, "Salva gioco:" }, - { 193, "Scansione completa!" }, - { 194, "%d cartelle analizzate..." }, - { 195, "Menu principale di ScummVM" }, - { 196, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, - { 197, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, - { 198, "ScummVM non ha potuto aprire la cartella specificata!" }, - { 199, "Cerca nella lista dei giochi" }, - { 200, "Cerca:" }, - { 201, "Seleziona SoundFont" }, - { 202, "Seleziona un tema" }, - { 203, "Seleziona la cartella di gioco aggiuntiva" }, - { 204, "Seleziona un'azione e clicca 'Mappa'" }, - { 205, "Seleziona la cartella dei temi dell'interfaccia" }, - { 206, "Seleziona la cartella dei file aggiuntivi" }, - { 207, "Seleziona la cartella dei plugin" }, - { 208, "Seleziona la cartella dei salvataggi" }, - { 209, "Seleziona la cartella per i salvataggi" }, - { 210, "Seleziona la cartella contenente i file di gioco" }, - { 211, "Sensibilit\340" }, - { 212, "Server:" }, - { 213, "Condivisione:" }, - { 214, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, - { 215, "Mostra tastiera" }, - { 216, "Mostra cursore del mouse" }, - { 217, "Mostra i sottotitoli e attiva le voci" }, - { 218, "Mostra/nascondi cursore" }, - { 219, "Salta" }, - { 220, "Salta battuta" }, - { 221, "Salta testo" }, - { 222, "Aggancia ai bordi" }, - { 223, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, - { 224, "Suono on/off" }, - { 225, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, - { 226, "SoundFont:" }, - { 227, "Voci" }, - { 228, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, - { 229, "Volume degli effetti sonori" }, - { 230, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, - { 231, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, - { 232, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, - { 233, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, - { 234, "Specifica il percorso di ulteriori dati usati dal gioco" }, - { 235, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, - { 236, "Specifica dove archiviare i salvataggi" }, - { 237, "Voci" }, - { 238, "Volume voci:" }, - { 239, "Renderer standard (16bpp)" }, - { 240, "Esegue il gioco selezionato" }, - { 241, "Stato:" }, - { 242, "Sub" }, - { 243, "Velocit\340 testo:" }, - { 244, "Sottotitoli" }, - { 245, "Cambia personaggio" }, - { 246, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, - { 247, "Testo e voci:" }, - { 248, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, - { 249, "Percorso tema:" }, - { 250, "Tema:" }, - { 251, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, - { 252, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, - { 253, "Ora: " }, - { 254, "Attesa per l'avvio della rete" }, - { 255, "Compensa X del tocco" }, - { 256, "Compensa Y del tocco" }, - { 257, "Modalit\340 touchpad disattivata." }, - { 258, "Modalit\340 touchpad attivata." }, - { 259, "Roland MT-32 effettivo (disattiva emulazione GM)" }, - { 260, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, - { 261, "Sconosciuto" }, - { 262, "Errore sconosciuto" }, - { 263, "Smonta DVD" }, - { 264, "Smonta SMB" }, - { 265, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, - { 266, "Modalit\340 colore non supportata" }, - { 267, "Salvataggio senza titolo" }, - { 268, "Su" }, - { 269, "Utilizza generazione di suono sia MIDI che AdLib" }, - { 270, "Utilizza il controllo del cursore stile trackpad del portatile" }, - { 271, "Nome utente:" }, - { 272, "Utilizzo del driver SDL " }, - { 273, "Underscan verticale:" }, - { 274, "Video" }, - { 275, "Tastiera virtuale" }, - { 276, "Volume" }, - { 277, "MIDI Windows" }, - { 278, "Autorizzazione di scrittura negata" }, - { 279, "Scrittura dati fallita" }, - { 280, "S\354" }, - { 281, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, - { 282, "Zona" }, - { 283, "Zoom indietro" }, - { 284, "Zoom avanti" }, - { 285, "ogni 10 minuti" }, - { 286, "ogni 15 minuti" }, - { 287, "ogni 30 minuti" }, - { 288, "ogni 5 minuti" }, - { 289, "~I~nfo" }, - { 290, "~A~ggiungi gioco..." }, - { 291, "~A~nnulla" }, - { 292, "~C~hiudi" }, - { 293, "~M~odifica gioco..." }, - { 294, "~A~iuto" }, - { 295, "Controlli combattimento di ~I~ndy" }, - { 296, "~T~asti" }, - { 297, "~M~odalit\340 mancini" }, - { 298, "~C~arica" }, - { 299, "~C~arica..." }, - { 300, "~S~uccessivi" }, - { 301, "~O~K" }, - { 302, "~O~pzioni" }, - { 303, "~O~pzioni..." }, - { 304, "~P~recedenti" }, - { 305, "C~h~iudi" }, - { 306, "~R~imuovi gioco" }, - { 307, "~R~ipristina" }, - { 308, "~V~ai a schermata di avvio" }, - { 309, "~S~alva" }, - { 310, "~G~ioca" }, - { 311, "~T~ransizioni attive" }, - { 312, "~E~ffetto acqua attivo" }, - { 313, "Modalit\340 ~Z~ip attivata" }, + { 128, "Disposit. MT32:" }, + { 129, "Emulatore MT-32" }, + { 130, "Schermo principale:" }, + { 131, "Mappa" }, + { 132, "Agg. in massa..." }, + { 133, "Menu" }, + { 134, "Varie" }, + { 135, "Modalit\340 mista AdLib/MIDI" }, + { 136, "Monta DVD" }, + { 137, "Monta SMB" }, + { 138, "Clic del mouse" }, + { 139, "Multifunzione" }, + { 140, "Dispositivo GM:" }, + { 141, "Volume musica:" }, + { 142, "Disattiva audio" }, + { 143, "Nome:" }, + { 144, "Rete disattivata" }, + { 145, "Rete non avviata (%d)" }, + { 146, "Rete attiva" }, + { 147, "Rete attiva, condivisione montata" }, + { 148, "Mai" }, + { 149, "No" }, + { 150, "Nessuna data salvata" }, + { 151, "Nessuna musica" }, + { 152, "Nessun tempo salvato" }, + { 153, "Nessun orario salvato" }, + { 154, "Nessuno" }, + { 155, "Normale (nessun ridimensionamento)" }, + { 156, "OK" }, + { 157, "Frequenza:" }, + { 158, "Ignora le impostazioni MIDI globali" }, + { 159, "Ignora le impostazioni MIDI globali" }, + { 160, "Ignora le impostazioni audio globali" }, + { 161, "Ignora le impostazioni grafiche globali" }, + { 162, "Ignora le impostazioni globali di volume" }, + { 163, "Emulatore PC Speaker" }, + { 164, "Password:" }, + { 165, "Il percorso non \350 una cartella" }, + { 166, "Il percorso non \350 un file" }, + { 167, "Il percorso non esiste" }, + { 168, "Percorsi" }, + { 169, "Pausa" }, + { 170, "Scegli il gioco:" }, + { 171, "La piattaforma per la quale il gioco \350 stato concepito" }, + { 172, "Piattaforma:" }, + { 173, "Tempo di gioco: " }, + { 174, "Seleziona un'azione" }, + { 175, "Percorso plugin:" }, + { 176, "Disp. preferito:" }, + { 177, "Premi il tasto da associare" }, + { 178, "Esci" }, + { 179, "Chiudi ScummVM" }, + { 180, "Autorizzazione di lettura negata" }, + { 181, "Lettura fallita" }, + { 182, "Riprogramma tasti" }, + { 183, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, + { 184, "Resa grafica:" }, + { 185, "Destra" }, + { 186, "Clic destro" }, + { 187, "Clic destro" }, + { 188, "Rotazione" }, + { 189, "Volume effetti:" }, + { 190, "SMB" }, + { 191, "Salva" }, + { 192, "Salvataggi:" }, + { 193, "Salvataggi:" }, + { 194, "Salva gioco:" }, + { 195, "Scansione completa!" }, + { 196, "%d cartelle analizzate..." }, + { 197, "Menu principale di ScummVM" }, + { 198, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, + { 199, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, + { 200, "ScummVM non ha potuto aprire la cartella specificata!" }, + { 201, "Cerca nella lista dei giochi" }, + { 202, "Cerca:" }, + { 203, "Seleziona SoundFont" }, + { 204, "Seleziona un tema" }, + { 205, "Seleziona la cartella di gioco aggiuntiva" }, + { 206, "Seleziona un'azione e clicca 'Mappa'" }, + { 207, "Seleziona la cartella dei temi dell'interfaccia" }, + { 208, "Seleziona la cartella dei file aggiuntivi" }, + { 209, "Seleziona la cartella dei plugin" }, + { 210, "Seleziona la cartella dei salvataggi" }, + { 211, "Seleziona la cartella per i salvataggi" }, + { 212, "Seleziona la cartella contenente i file di gioco" }, + { 213, "Sensibilit\340" }, + { 214, "Server:" }, + { 215, "Condivisione:" }, + { 216, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, + { 217, "Mostra tastiera" }, + { 218, "Mostra cursore del mouse" }, + { 219, "Mostra i sottotitoli e attiva le voci" }, + { 220, "Mostra/nascondi cursore" }, + { 221, "Salta" }, + { 222, "Salta battuta" }, + { 223, "Salta testo" }, + { 224, "Aggancia ai bordi" }, + { 225, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, + { 226, "Suono on/off" }, + { 227, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, + { 228, "SoundFont:" }, + { 229, "Voci" }, + { 230, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, + { 231, "Volume degli effetti sonori" }, + { 232, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, + { 233, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, + { 235, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, + { 236, "Specifica il percorso di ulteriori dati usati dal gioco" }, + { 237, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, + { 238, "Specifica dove archiviare i salvataggi" }, + { 239, "Voci" }, + { 240, "Volume voci:" }, + { 241, "Renderer standard (16bpp)" }, + { 242, "Esegue il gioco selezionato" }, + { 243, "Stato:" }, + { 244, "Sub" }, + { 245, "Velocit\340 testo:" }, + { 246, "Sottotitoli" }, + { 247, "Cambia personaggio" }, + { 248, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, + { 249, "Testo e voci:" }, + { 250, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, + { 251, "Percorso tema:" }, + { 252, "Tema:" }, + { 253, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, + { 254, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, + { 255, "Ora: " }, + { 256, "Attesa per l'avvio della rete" }, + { 257, "Compensa X del tocco" }, + { 258, "Compensa Y del tocco" }, + { 259, "Modalit\340 touchpad disattivata." }, + { 260, "Modalit\340 touchpad attivata." }, + { 261, "Roland MT-32 effettivo (disattiva emulazione GM)" }, + { 262, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, + { 263, "Sconosciuto" }, + { 264, "Errore sconosciuto" }, + { 265, "Smonta DVD" }, + { 266, "Smonta SMB" }, + { 267, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, + { 268, "Modalit\340 colore non supportata" }, + { 269, "Salvataggio senza titolo" }, + { 270, "Su" }, + { 271, "Utilizza generazione di suono sia MIDI che AdLib" }, + { 272, "Utilizza il controllo del cursore stile trackpad del portatile" }, + { 273, "Nome utente:" }, + { 274, "Utilizzo del driver SDL " }, + { 275, "Underscan verticale:" }, + { 276, "Video" }, + { 277, "Tastiera virtuale" }, + { 278, "Volume" }, + { 279, "MIDI Windows" }, + { 280, "Autorizzazione di scrittura negata" }, + { 281, "Scrittura dati fallita" }, + { 282, "S\354" }, + { 283, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, + { 284, "Zona" }, + { 285, "Zoom indietro" }, + { 286, "Zoom avanti" }, + { 287, "ogni 10 minuti" }, + { 288, "ogni 15 minuti" }, + { 289, "ogni 30 minuti" }, + { 290, "ogni 5 minuti" }, + { 291, "~I~nfo" }, + { 292, "~A~ggiungi gioco..." }, + { 293, "~A~nnulla" }, + { 294, "~C~hiudi" }, + { 295, "~M~odifica gioco..." }, + { 296, "~A~iuto" }, + { 297, "Controlli combattimento di ~I~ndy" }, + { 298, "~T~asti" }, + { 299, "~M~odalit\340 mancini" }, + { 300, "~C~arica" }, + { 301, "~C~arica..." }, + { 302, "~S~uccessivi" }, + { 303, "~O~K" }, + { 304, "~O~pzioni" }, + { 305, "~O~pzioni..." }, + { 306, "~P~recedenti" }, + { 307, "C~h~iudi" }, + { 308, "~R~imuovi gioco" }, + { 309, "~R~ipristina" }, + { 310, "~V~ai a schermata di avvio" }, + { 311, "~S~alva" }, + { 312, "~G~ioca" }, + { 313, "~T~ransizioni attive" }, + { 314, "~E~ffetto acqua attivo" }, + { 315, "Modalit\340 ~Z~ip attivata" }, { -1, NULL } }; static const PoMessageEntry _translation_ca_ES[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nLanguage: Catalan\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-26 16:45+0100\nLast-Translator: Jordi Vilalta Prat \nLanguage-Team: Catalan \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Catalan\n" }, { 2, " (Actiu)" }, { 3, " (Joc)" }, { 4, " (Global)" }, @@ -1402,195 +1408,196 @@ static const PoMessageEntry _translation_ca_ES[] = { { 124, "Emulador OPL de MAME" }, { 125, "MIDI" }, { 126, "Guany MIDI:" }, - { 127, "Dispositiu MT32:" }, - { 128, "Emulador de MT-32" }, - { 129, "Escalat de la pantalla principal:" }, - { 130, "Mapeja" }, - { 131, "Addici\363 Massiva..." }, - { 132, "Men\372" }, - { 133, "Misc" }, - { 134, "Mode combinat AdLib/MIDI" }, - { 135, "Munta el DVD" }, - { 136, "Munta SMB" }, - { 137, "Clic del ratol\355" }, - { 138, "Funci\363 M\372ltiple" }, - { 139, "Dispositiu GM:" }, - { 140, "Volum de la m\372sica:" }, - { 141, "Silenciar tot" }, - { 142, "Nom:" }, - { 143, "Xarxa inactiva" }, - { 144, "Xarxa no iniciada (%d)" }, - { 145, "Xarxa activa" }, - { 146, "Xarxa activa, compartici\363 muntada" }, - { 147, "Mai" }, - { 148, "No" }, - { 149, "No hi ha data desada" }, - { 150, "Sense m\372sica" }, - { 151, "No hi ha temps de joc desat" }, - { 152, "No hi ha hora desada" }, - { 153, "Cap" }, - { 154, "Normal (sense escalar)" }, - { 155, "D'acord" }, - { 156, "Freq\374\350ncia de sortida:" }, - { 157, "Fer canvis sobre les opcions globals de MIDI" }, - { 158, "Fer canvis sobre les opcions globals d'\340udio" }, - { 159, "Fer canvis sobre les opcions globals de gr\340fics" }, - { 160, "Fer canvis sobre les opcions globals de volum" }, - { 161, "Emulador d'Altaveu de PC" }, - { 162, "Contrasenya:" }, - { 163, "El cam\355 no \351s un directori" }, - { 164, "El cam\355 no \351s un fitxer" }, - { 165, "El cam\355 no existeix" }, - { 166, "Camins" }, - { 167, "Pausa" }, - { 168, "Seleccioneu el joc:" }, - { 169, "Plataforma per la que el joc es va dissenyar originalment" }, - { 170, "Plataforma:" }, - { 171, "Temps de joc: " }, - { 172, "Seleccioneu una acci\363" }, - { 173, "Cam\355 dels connectors:" }, - { 174, "Dispositiu Preferit:" }, - { 175, "Premeu la tecla a associar" }, - { 176, "Surt" }, - { 177, "Surt de ScummVM" }, - { 178, "S'ha denegat el perm\355s de lectura" }, - { 179, "Ha fallat la lectura" }, - { 180, "Remapeja les tecles" }, - { 181, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, - { 182, "Mode de pintat:" }, - { 183, "Dreta" }, - { 184, "Clic dret" }, - { 185, "Clic dret" }, - { 186, "Rotar" }, - { 187, "Volum dels efectes:" }, - { 188, "SMB" }, - { 189, "Desa" }, - { 190, "Cam\355 de les Partides:" }, - { 191, "Cam\355 de les Partides: " }, - { 192, "Desa la partida:" }, - { 193, "S'ha acabat la cerca!" }, - { 194, "S'han cercat %d directoris ..." }, - { 195, "Men\372 Principal de ScummVM" }, - { 196, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, - { 197, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, - { 198, "ScummVM no ha pogut obrir el directori especificat!" }, - { 199, "Cerca a la llista de jocs" }, - { 200, "Cerca:" }, - { 201, "Seleccioneu el fitxer SoundFont" }, - { 202, "Seleccioneu un Tema" }, - { 203, "Seleccioneu el directori addicional del joc" }, - { 204, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, - { 205, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, - { 206, "Seleccioneu el directori dels fitxers extra" }, - { 207, "Seleccioneu el directori dels connectors" }, - { 208, "Seleccioneu el directori de les partides desades" }, - { 209, "Seleccioneu el directori de les partides desades" }, - { 210, "Seleccioneu el directori amb les dades del joc" }, - { 211, "Sensibilitat" }, - { 212, "Servidor:" }, - { 213, "Compartici\363:" }, - { 214, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, - { 215, "Mostra el teclat" }, - { 216, "Mostra el cursor del ratol\355" }, - { 217, "Mostra els subt\355tols i reprodueix la veu" }, - { 218, "Mostra/Oculta el cursor" }, - { 219, "Salta" }, - { 220, "Salta la l\355nia" }, - { 221, "Salta el text" }, - { 223, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, - { 224, "So engegat/parat" }, - { 225, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, - { 226, "Fitxer SoundFont:" }, - { 227, "Veus" }, - { 228, "Modes de dispersi\363 especials suportats per alguns jocs" }, - { 229, "Volum dels sons d'efectes especials" }, - { 230, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, - { 231, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, - { 232, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, - { 233, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, - { 234, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, - { 235, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, - { 236, "Especifica on es desaran les partides" }, - { 237, "Veus" }, - { 238, "Volum de la veu:" }, - { 239, "Pintat est\340ndard (16bpp)" }, - { 240, "Iniciant el joc seleccionat" }, - { 241, "Estat:" }, - { 242, "Subt" }, - { 243, "Velocitat dels subt\355tols:" }, - { 244, "Subt\355tols" }, - { 245, "Commuta el personatge" }, - { 246, "Toc per a clic esquerre, doble toc per a clic dret" }, - { 247, "Text i Veus:" }, - { 248, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, - { 249, "Cam\355 dels Temes:" }, - { 250, "Tema:" }, - { 251, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, - { 252, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, - { 253, "Hora: " }, - { 255, "Despla\347ament X del toc" }, - { 256, "Despla\347ament Y del toc" }, - { 257, "Mode Touchpad desactivat." }, - { 258, "Mode Touchpad activat." }, - { 259, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, - { 260, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, - { 261, "Desconegut" }, - { 262, "Error desconegut" }, - { 263, "Desmunta el DVD" }, - { 264, "Desmunta SMB" }, - { 265, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, - { 266, "Mode de color no suportat" }, - { 267, "Partida sense t\355tol" }, - { 268, "Amunt" }, - { 269, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, - { 270, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, - { 271, "Nom d'usuari:" }, - { 272, "Utilitzant el controlador SDL " }, - { 274, "V\355deo" }, - { 275, "Teclat virtual" }, - { 276, "Volum" }, - { 277, "MIDI de Windows" }, - { 278, "S'ha denegat el perm\355s d'escriptura" }, - { 279, "Ha fallat l'escriptura de dades" }, - { 280, "S\355" }, - { 281, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, - { 282, "Zona" }, - { 283, "Redueix" }, - { 284, "Amplia" }, - { 285, "cada 10 minuts" }, - { 286, "cada 15 minuts" }, - { 287, "cada 30 minuts" }, - { 288, "cada 5 minuts" }, - { 289, "~Q~uant a" }, - { 290, "~A~fegeix Joc..." }, - { 291, "~C~ancel\267la" }, - { 292, "~T~anca" }, - { 293, "~E~dita Joc..." }, - { 294, "~A~juda" }, - { 295, "Controls de lluita de l'~I~ndy" }, - { 296, "~T~ecles" }, - { 297, "Mode ~e~squerr\340" }, - { 298, "C~a~rrega" }, - { 299, "~C~arrega..." }, - { 300, "~S~eg\374ent" }, - { 301, "~D~'acord" }, - { 302, "~O~pcions" }, - { 303, "~O~pcions..." }, - { 304, "~A~nterior" }, - { 305, "~T~anca" }, - { 306, "~S~uprimeix Joc" }, - { 307, "~C~ontinua" }, - { 308, "~R~etorna al Llan\347ador" }, - { 309, "~D~esa" }, - { 310, "~I~nicia" }, - { 311, "~T~ransicions activades" }, - { 312, "~E~fecte de l'aigua activat" }, - { 313, "Mode ~Z~ip activat" }, + { 128, "Dispositiu MT32:" }, + { 129, "Emulador de MT-32" }, + { 130, "Escalat de la pantalla principal:" }, + { 131, "Mapeja" }, + { 132, "Addici\363 Massiva..." }, + { 133, "Men\372" }, + { 134, "Misc" }, + { 135, "Mode combinat AdLib/MIDI" }, + { 136, "Munta el DVD" }, + { 137, "Munta SMB" }, + { 138, "Clic del ratol\355" }, + { 139, "Funci\363 M\372ltiple" }, + { 140, "Dispositiu GM:" }, + { 141, "Volum de la m\372sica:" }, + { 142, "Silenciar tot" }, + { 143, "Nom:" }, + { 144, "Xarxa inactiva" }, + { 145, "Xarxa no iniciada (%d)" }, + { 146, "Xarxa activa" }, + { 147, "Xarxa activa, compartici\363 muntada" }, + { 148, "Mai" }, + { 149, "No" }, + { 150, "No hi ha data desada" }, + { 151, "Sense m\372sica" }, + { 152, "No hi ha temps de joc desat" }, + { 153, "No hi ha hora desada" }, + { 154, "Cap" }, + { 155, "Normal (sense escalar)" }, + { 156, "D'acord" }, + { 157, "Freq\374\350ncia de sortida:" }, + { 158, "Fer canvis sobre les opcions globals de MIDI" }, + { 159, "Fer canvis sobre les opcions globals de MIDI" }, + { 160, "Fer canvis sobre les opcions globals d'\340udio" }, + { 161, "Fer canvis sobre les opcions globals de gr\340fics" }, + { 162, "Fer canvis sobre les opcions globals de volum" }, + { 163, "Emulador d'Altaveu de PC" }, + { 164, "Contrasenya:" }, + { 165, "El cam\355 no \351s un directori" }, + { 166, "El cam\355 no \351s un fitxer" }, + { 167, "El cam\355 no existeix" }, + { 168, "Camins" }, + { 169, "Pausa" }, + { 170, "Seleccioneu el joc:" }, + { 171, "Plataforma per la que el joc es va dissenyar originalment" }, + { 172, "Plataforma:" }, + { 173, "Temps de joc: " }, + { 174, "Seleccioneu una acci\363" }, + { 175, "Cam\355 dels connectors:" }, + { 176, "Dispositiu Preferit:" }, + { 177, "Premeu la tecla a associar" }, + { 178, "Surt" }, + { 179, "Surt de ScummVM" }, + { 180, "S'ha denegat el perm\355s de lectura" }, + { 181, "Ha fallat la lectura" }, + { 182, "Remapeja les tecles" }, + { 183, "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen intactes" }, + { 184, "Mode de pintat:" }, + { 185, "Dreta" }, + { 186, "Clic dret" }, + { 187, "Clic dret" }, + { 188, "Rotar" }, + { 189, "Volum dels efectes:" }, + { 190, "SMB" }, + { 191, "Desa" }, + { 192, "Cam\355 de les Partides:" }, + { 193, "Cam\355 de les Partides: " }, + { 194, "Desa la partida:" }, + { 195, "S'ha acabat la cerca!" }, + { 196, "S'han cercat %d directoris ..." }, + { 197, "Men\372 Principal de ScummVM" }, + { 198, "ScummVM no ha pogut trobar cap motor capa\347 d'executar el joc seleccionat!" }, + { 199, "ScummVM no ha pogut trobar cap joc al directori especificat!" }, + { 200, "ScummVM no ha pogut obrir el directori especificat!" }, + { 201, "Cerca a la llista de jocs" }, + { 202, "Cerca:" }, + { 203, "Seleccioneu el fitxer SoundFont" }, + { 204, "Seleccioneu un Tema" }, + { 205, "Seleccioneu el directori addicional del joc" }, + { 206, "Seleccioneu una acci\363 i cliqueu 'Mapeja'" }, + { 207, "Seleccioneu el directori dels temes de la Interf\355cie d'Usuari" }, + { 208, "Seleccioneu el directori dels fitxers extra" }, + { 209, "Seleccioneu el directori dels connectors" }, + { 210, "Seleccioneu el directori de les partides desades" }, + { 211, "Seleccioneu el directori de les partides desades" }, + { 212, "Seleccioneu el directori amb les dades del joc" }, + { 213, "Sensibilitat" }, + { 214, "Servidor:" }, + { 215, "Compartici\363:" }, + { 216, "Identificador de joc curt utilitzat per referir-se a les partides i per executar el joc des de la l\355nia de comandes" }, + { 217, "Mostra el teclat" }, + { 218, "Mostra el cursor del ratol\355" }, + { 219, "Mostra els subt\355tols i reprodueix la veu" }, + { 220, "Mostra/Oculta el cursor" }, + { 221, "Salta" }, + { 222, "Salta la l\355nia" }, + { 223, "Salta el text" }, + { 225, "Escalat per software (bona qualitat, per\362 m\351s lent)" }, + { 226, "So engegat/parat" }, + { 227, "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" }, + { 228, "Fitxer SoundFont:" }, + { 229, "Veus" }, + { 230, "Modes de dispersi\363 especials suportats per alguns jocs" }, + { 231, "Volum dels sons d'efectes especials" }, + { 232, "Especifica el dispositiu de so per defecte per a la sortida General MIDI" }, + { 233, "Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" }, + { 235, "Especifica el cam\355 de les dades addicionals utilitzades per tots els jocs o pel ScummVM" }, + { 236, "Especifica el cam\355 de dades addicionals utilitzades pel joc" }, + { 237, "Especifica el dispositiu de so o l'emulador de tarja de so preferit" }, + { 238, "Especifica on es desaran les partides" }, + { 239, "Veus" }, + { 240, "Volum de la veu:" }, + { 241, "Pintat est\340ndard (16bpp)" }, + { 242, "Iniciant el joc seleccionat" }, + { 243, "Estat:" }, + { 244, "Subt" }, + { 245, "Velocitat dels subt\355tols:" }, + { 246, "Subt\355tols" }, + { 247, "Commuta el personatge" }, + { 248, "Toc per a clic esquerre, doble toc per a clic dret" }, + { 249, "Text i Veus:" }, + { 250, "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un altre." }, + { 251, "Cam\355 dels Temes:" }, + { 252, "Tema:" }, + { 253, "Aquest identificador de joc ja est\340 usat. Si us plau, trieu-ne un altre." }, + { 254, "Aquest joc no suporta la c\340rrega de partides des del llan\347ador." }, + { 255, "Hora: " }, + { 257, "Despla\347ament X del toc" }, + { 258, "Despla\347ament Y del toc" }, + { 259, "Mode Touchpad desactivat." }, + { 260, "Mode Touchpad activat." }, + { 261, "Roland MT-32 real (desactiva l'emulaci\363 GM)" }, + { 262, "Desactiva la conversi\363 General MIDI pels jocs que tenen banda sonora per a Roland MT-32" }, + { 263, "Desconegut" }, + { 264, "Error desconegut" }, + { 265, "Desmunta el DVD" }, + { 266, "Desmunta SMB" }, + { 267, "Sense escalar (haureu de despla\347ar-vos a esquerra i dreta)" }, + { 268, "Mode de color no suportat" }, + { 269, "Partida sense t\355tol" }, + { 270, "Amunt" }, + { 271, "Utilitza MIDI i la generaci\363 de so AdLib alhora" }, + { 272, "Utilitza el control del cursor a l'estil del trackpad dels port\340tils" }, + { 273, "Nom d'usuari:" }, + { 274, "Utilitzant el controlador SDL " }, + { 276, "V\355deo" }, + { 277, "Teclat virtual" }, + { 278, "Volum" }, + { 279, "MIDI de Windows" }, + { 280, "S'ha denegat el perm\355s d'escriptura" }, + { 281, "Ha fallat l'escriptura de dades" }, + { 282, "S\355" }, + { 283, "Heu de reiniciar ScummVM perqu\350 tots els canvis tingui efecte." }, + { 284, "Zona" }, + { 285, "Redueix" }, + { 286, "Amplia" }, + { 287, "cada 10 minuts" }, + { 288, "cada 15 minuts" }, + { 289, "cada 30 minuts" }, + { 290, "cada 5 minuts" }, + { 291, "~Q~uant a" }, + { 292, "~A~fegeix Joc..." }, + { 293, "~C~ancel\267la" }, + { 294, "~T~anca" }, + { 295, "~E~dita Joc..." }, + { 296, "~A~juda" }, + { 297, "Controls de lluita de l'~I~ndy" }, + { 298, "~T~ecles" }, + { 299, "Mode ~e~squerr\340" }, + { 300, "C~a~rrega" }, + { 301, "~C~arrega..." }, + { 302, "~S~eg\374ent" }, + { 303, "~D~'acord" }, + { 304, "~O~pcions" }, + { 305, "~O~pcions..." }, + { 306, "~A~nterior" }, + { 307, "~T~anca" }, + { 308, "~S~uprimeix Joc" }, + { 309, "~C~ontinua" }, + { 310, "~R~etorna al Llan\347ador" }, + { 311, "~D~esa" }, + { 312, "~I~nicia" }, + { 313, "~T~ransicions activades" }, + { 314, "~E~fecte de l'aigua activat" }, + { 315, "Mode ~Z~ip activat" }, { -1, NULL } }; static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nLanguage: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, { 14, "" }, { 16, "AdLib vezet :" }, { 17, "AdLib vezet :" }, @@ -1611,45 +1618,45 @@ static const PoMessageEntry _translation_hu_HU[] = { { 115, "Kulcsok" }, { 124, "AdLib vezet :" }, { 126, "MIDI nyeres\351g:" }, - { 127, "Zene mennyis\351g:" }, - { 134, "Vegyes AdLib/MIDI m\363d" }, - { 139, "Zene mennyis\351g:" }, + { 128, "Zene mennyis\351g:" }, + { 135, "Vegyes AdLib/MIDI m\363d" }, { 140, "Zene mennyis\351g:" }, - { 141, "Muta \326sszes" }, - { 147, "Soha" }, - { 148, "Semmi" }, - { 153, "Semmi" }, - { 155, "Igen" }, - { 156, "Kimeneti teljes\355tm\351ny:" }, - { 166, "\326sv\351nyek" }, - { 167, "\326sv\351nyek" }, - { 182, "Renderel\351si m\363d:" }, - { 187, "SFX mennyis\351ge" }, - { 190, "Extra \332tvonal:" }, - { 212, "Soha" }, - { 237, "Csak a besz\351d" }, - { 238, "Besz\351d mennyis\351g:" }, - { 243, "Felirat sebess\351g:" }, - { 244, "Csak feliratok" }, - { 247, "Sz\366veg \351s besz\351d:" }, - { 250, "T\351ma:" }, - { 253, "T\351ma:" }, - { 259, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 272, "Zenei vezet :" }, - { 276, "Volumene" }, - { 282, "Semmi" }, - { 285, "10 percenk\351nt" }, - { 286, "15 percenk\351nt" }, - { 287, "30 percenk\351nt" }, - { 288, "5 percenk\351nt" }, - { 296, "Kulcsok" }, - { 297, "Renderel\351si m\363d:" }, - { 301, "Igen" }, + { 141, "Zene mennyis\351g:" }, + { 142, "Muta \326sszes" }, + { 148, "Soha" }, + { 149, "Semmi" }, + { 154, "Semmi" }, + { 156, "Igen" }, + { 157, "Kimeneti teljes\355tm\351ny:" }, + { 168, "\326sv\351nyek" }, + { 169, "\326sv\351nyek" }, + { 184, "Renderel\351si m\363d:" }, + { 189, "SFX mennyis\351ge" }, + { 192, "Extra \332tvonal:" }, + { 214, "Soha" }, + { 239, "Csak a besz\351d" }, + { 240, "Besz\351d mennyis\351g:" }, + { 245, "Felirat sebess\351g:" }, + { 246, "Csak feliratok" }, + { 249, "Sz\366veg \351s besz\351d:" }, + { 252, "T\351ma:" }, + { 255, "T\351ma:" }, + { 261, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 274, "Zenei vezet :" }, + { 278, "Volumene" }, + { 284, "Semmi" }, + { 287, "10 percenk\351nt" }, + { 288, "15 percenk\351nt" }, + { 289, "30 percenk\351nt" }, + { 290, "5 percenk\351nt" }, + { 298, "Kulcsok" }, + { 299, "Renderel\351si m\363d:" }, + { 303, "Igen" }, { -1, NULL } }; static const PoMessageEntry _translation_de_DE[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-12 17:44+0200\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nLanguage: Deutsch\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-09 20:37+0100\nLast-Translator: Simon Sawatzki\nLanguage-Team: Lothar Serra Mari & Simon Sawatzki \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Deutsch\nPlural-Forms: nplurals=2; plural=n != 1;\n" }, { 1, " M\366chten Sie wirklich beenden? " }, { 2, " (Aktiv)" }, { 3, " (Spiel)" }, @@ -1776,210 +1783,212 @@ static const PoMessageEntry _translation_de_DE[] = { { 124, "MAME-OPL-Emulator" }, { 125, "MIDI" }, { 126, "MIDI-Lautst\344rke:" }, - { 127, "MT32-Ger\344t:" }, - { 128, "MT-32-Emulation" }, - { 129, "Hauptbildschirm-Skalierung:" }, - { 130, "Zuweisen" }, - { 131, "Durchsuchen" }, - { 132, "Men\374" }, - { 133, "Sonstiges" }, - { 134, "AdLib-/MIDI-Modus" }, - { 135, "DVD einbinden" }, - { 136, "SMB einbinden" }, - { 137, "Mausklick" }, - { 138, "Multifunktion" }, - { 139, "Musikger\344t:" }, - { 140, "Musiklautst\344rke:" }, - { 141, "Alles aus" }, - { 142, "Name:" }, - { 143, "Netzwerk ist aus." }, - { 144, "Netzwerk nicht gestartet (%d)" }, - { 145, "Netzwerk gestartet" }, - { 146, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, - { 147, "Niemals" }, - { 148, "Nein" }, - { 149, "Kein Datum gespeichert" }, - { 150, "Keine Musik" }, - { 151, "Keine Spielzeit gespeichert" }, - { 152, "Keine Zeit gespeichert" }, - { 153, "-" }, - { 154, "Normal (keine Skalierung)" }, - { 155, "OK" }, - { 156, "Ausgabefrequenz:" }, - { 157, "Globale MIDI-Einstellungen \374bergehen" }, - { 158, "Globale Audioeinstellungen \374bergehen" }, - { 159, "Globale Grafikeinstellungen \374bergehen" }, - { 160, "Globale Lautst\344rke-Einstellungen \374bergehen" }, - { 161, "PC-Lautsprecher-Emulator" }, - { 162, "Passwort:" }, - { 163, "Ung\374ltiges Verzeichnis" }, - { 164, "Pfad ist keine Datei." }, - { 165, "Verzeichnis existiert nicht." }, - { 166, "Pfade" }, - { 167, "Pause" }, - { 168, "Spiel ausw\344hlen:" }, - { 169, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, - { 170, "Plattform:" }, - { 171, "Spieldauer: " }, - { 172, "Bitte eine Aktion ausw\344hlen" }, - { 173, "Plugin-Pfad:" }, - { 174, "Standard-Ger\344t:" }, - { 175, "Taste dr\374cken, um sie zuzuweisen" }, - { 176, "Beenden" }, - { 177, "ScummVM beenden" }, - { 178, "Lese-Berechtigung nicht vorhanden" }, - { 179, "Lesefehler aufgetreten" }, - { 180, "Tasten neu zuweisen" }, - { 181, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, - { 182, "Render-Modus:" }, - { 183, "Rechts" }, - { 184, "Rechtsklick" }, - { 185, "Rechtsklick" }, - { 186, "Drehen" }, - { 187, "Effektlautst\344rke:" }, - { 188, "SMB" }, - { 189, "Speichern" }, - { 190, "Spielst\344nde:" }, - { 191, "Spielst\344nde: " }, - { 192, "Speichern:" }, - { 193, "Suchlauf abgeschlossen!" }, - { 194, "%d Ordner durchsucht..." }, - { 195, "ScummVM-Hauptmen\374" }, - { 196, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, - { 197, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, - { 198, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, - { 199, "In Spieleliste suchen" }, - { 200, "Suchen:" }, - { 201, "SoundFont ausw\344hlen" }, - { 202, "Thema ausw\344hlen" }, - { 203, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, - { 204, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, - { 205, "Verzeichnis f\374r Oberfl\344chen-Themen" }, - { 206, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, - { 207, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, - { 208, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 209, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, - { 210, "Verzeichnis mit Spieldateien ausw\344hlen" }, - { 211, "Empfindlichkeit" }, - { 212, "Server:" }, - { 213, "\326ffentliches Verzeichnis:" }, - { 214, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, - { 215, "Tastatur zeigen" }, - { 216, "Mauszeiger anzeigen" }, - { 217, "Untertitel anzeigen und Sprachausgabe aktivieren" }, - { 218, "Cursor zeigen/verbergen" }, - { 219, "\334berspringen" }, - { 220, "Zeile \374berspringen" }, - { 221, "Text \374berspringen" }, - { 222, "An Ecken anheften" }, - { 223, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, - { 224, "Ton ein/aus" }, - { 225, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, - { 226, "SoundFont:" }, - { 227, "Spr." }, - { 228, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, - { 229, "Lautst\344rke spezieller Soundeffekte" }, - { 230, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." }, - { 231, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." }, - { 232, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 233, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, - { 234, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, - { 235, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, - { 236, "Legt fest, wo die Spielst\344nde abgelegt werden." }, - { 237, "Sprache" }, - { 238, "Sprachlautst\344rke:" }, - { 239, "Standard-Renderer (16bpp)" }, - { 240, "Ausgew\344hltes Spiel starten" }, - { 241, "Status:" }, - { 242, "Untert." }, - { 243, "Untertitel-Tempo:" }, - { 244, "Untertitel" }, - { 245, "Figur wechseln" }, - { 246, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, - { 247, "Text und Sprache:" }, - { 248, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, - { 249, "Themenpfad:" }, - { 250, "Thema:" }, - { 251, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, - { 252, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, - { 253, "Zeit: " }, - { 254, "Zeit\374berschreitung beim Starten des Netzwerks" }, - { 255, "Zu X-Position gehen" }, - { 256, "Zu Y-Position gehen" }, - { 257, "Touchpad-Modus ausgeschaltet." }, - { 258, "Touchpad-Modus aktiviert." }, - { 259, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" }, - { 260, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, - { 261, "Unbekannt" }, - { 262, "Unbekannter Fehler" }, - { 263, "DVD aush\344ngen" }, - { 264, "SMB aush\344ngen" }, - { 265, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, - { 266, "Farbmodus nicht unterst\374tzt" }, - { 267, "Unbenannt" }, - { 268, "Hoch" }, - { 269, "Benutzt MIDI und AdLib zur Sounderzeugung." }, - { 270, "Den Trackpad-Style f\374r Maussteuerung benutzen" }, - { 271, "Benutzername:" }, - { 272, "SDL-Treiber verwenden" }, - { 273, "Vertikale Bildverkleinerung:" }, - { 274, "Video" }, - { 275, "Virtuelle Tastatur" }, - { 276, "Lautst\344rke" }, - { 277, "Windows MIDI" }, - { 278, "Schreib-Berechtigung nicht vorhanden" }, - { 279, "Daten konnten nicht geschrieben werden." }, - { 280, "Ja" }, - { 281, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, - { 282, "Zone" }, - { 283, "Hineinzoomen" }, - { 284, "Herauszoomen" }, - { 285, "alle 10 Minuten" }, - { 286, "alle 15 Minuten" }, - { 287, "alle 30 Minuten" }, - { 288, "alle 5 Minuten" }, - { 289, "\334be~r~" }, - { 290, "Spiel ~h~inzuf\374gen" }, - { 291, "~A~bbrechen" }, - { 292, "~S~chlie\337en" }, - { 293, "Spielo~p~tionen" }, - { 294, "~H~ilfe" }, - { 295, "~K~ampfsteuerung f\374r Indiana Jones" }, - { 296, "~T~asten" }, - { 297, "~L~inke-Hand-Modus" }, - { 298, "~L~aden" }, - { 299, "~L~aden..." }, - { 300, "~W~eiter" }, - { 301, "~O~K" }, - { 302, "~O~ptionen" }, - { 303, "~O~ptionen" }, - { 304, "~Z~ur\374ck" }, - { 305, "~B~eenden" }, - { 306, "Spiel ~e~ntfernen" }, - { 307, "~F~ortsetzen" }, - { 308, "Zur Spiele~l~iste zur\374ck" }, - { 309, "~S~peichern" }, - { 310, "~S~tarten" }, - { 311, "\334ber~g~\344nge aktiviert" }, - { 312, "~W~assereffekt aktiviert" }, - { 313, "~Z~ip-Modus aktiviert" }, + { 128, "MT32-Ger\344t:" }, + { 129, "MT-32-Emulation" }, + { 130, "Hauptbildschirm-Skalierung:" }, + { 131, "Zuweisen" }, + { 132, "Durchsuchen" }, + { 133, "Men\374" }, + { 134, "Sonstiges" }, + { 135, "AdLib-/MIDI-Modus" }, + { 136, "DVD einbinden" }, + { 137, "SMB einbinden" }, + { 138, "Mausklick" }, + { 139, "Multifunktion" }, + { 140, "Musikger\344t:" }, + { 141, "Musiklautst\344rke:" }, + { 142, "Alles aus" }, + { 143, "Name:" }, + { 144, "Netzwerk ist aus." }, + { 145, "Netzwerk nicht gestartet (%d)" }, + { 146, "Netzwerk gestartet" }, + { 147, "Netzwerk gestartet, \366ffentliches Verzeichnis eingebunden" }, + { 148, "Niemals" }, + { 149, "Nein" }, + { 150, "Kein Datum gespeichert" }, + { 151, "Keine Musik" }, + { 152, "Keine Spielzeit gespeichert" }, + { 153, "Keine Zeit gespeichert" }, + { 154, "-" }, + { 155, "Normal (keine Skalierung)" }, + { 156, "OK" }, + { 157, "Ausgabefrequenz:" }, + { 158, "Globale MIDI-Einstellungen \374bergehen" }, + { 159, "Globale MIDI-Einstellungen \374bergehen" }, + { 160, "Globale Audioeinstellungen \374bergehen" }, + { 161, "Globale Grafikeinstellungen \374bergehen" }, + { 162, "Globale Lautst\344rke-Einstellungen \374bergehen" }, + { 163, "PC-Lautsprecher-Emulator" }, + { 164, "Passwort:" }, + { 165, "Ung\374ltiges Verzeichnis" }, + { 166, "Pfad ist keine Datei." }, + { 167, "Verzeichnis existiert nicht." }, + { 168, "Pfade" }, + { 169, "Pause" }, + { 170, "Spiel ausw\344hlen:" }, + { 171, "Plattform, f\374r die das Spiel urspr\374nglich erstellt wurde" }, + { 172, "Plattform:" }, + { 173, "Spieldauer: " }, + { 174, "Bitte eine Aktion ausw\344hlen" }, + { 175, "Plugin-Pfad:" }, + { 176, "Standard-Ger\344t:" }, + { 177, "Taste dr\374cken, um sie zuzuweisen" }, + { 178, "Beenden" }, + { 179, "ScummVM beenden" }, + { 180, "Lese-Berechtigung nicht vorhanden" }, + { 181, "Lesefehler aufgetreten" }, + { 182, "Tasten neu zuweisen" }, + { 183, "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." }, + { 184, "Render-Modus:" }, + { 185, "Rechts" }, + { 186, "Rechtsklick" }, + { 187, "Rechtsklick" }, + { 188, "Drehen" }, + { 189, "Effektlautst\344rke:" }, + { 190, "SMB" }, + { 191, "Speichern" }, + { 192, "Spielst\344nde:" }, + { 193, "Spielst\344nde: " }, + { 194, "Speichern:" }, + { 195, "Suchlauf abgeschlossen!" }, + { 196, "%d Ordner durchsucht..." }, + { 197, "ScummVM-Hauptmen\374" }, + { 198, "ScummVM konnte keine Engine finden, um das Spiel zu starten!" }, + { 199, "ScummVM kann in dem gew\344hlten Verzeichnis kein Spiel finden!" }, + { 200, "ScummVM kann das gew\344hlte Verzeichnis nicht \366ffnen!" }, + { 201, "In Spieleliste suchen" }, + { 202, "Suchen:" }, + { 203, "SoundFont ausw\344hlen" }, + { 204, "Thema ausw\344hlen" }, + { 205, "Verzeichnis mit zus\344tzlichen Dateien ausw\344hlen" }, + { 206, "Aktion ausw\344hlen und \"Zuweisen\" klicken" }, + { 207, "Verzeichnis f\374r Oberfl\344chen-Themen" }, + { 208, "Verzeichnis f\374r zus\344tzliche Dateien ausw\344hlen" }, + { 209, "Verzeichnis f\374r Erweiterungen ausw\344hlen" }, + { 210, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 211, "Verzeichnis f\374r Spielst\344nde ausw\344hlen" }, + { 212, "Verzeichnis mit Spieldateien ausw\344hlen" }, + { 213, "Empfindlichkeit" }, + { 214, "Server:" }, + { 215, "\326ffentliches Verzeichnis:" }, + { 216, "Kurzer Spielname, um die Spielst\344nde zuzuordnen und das Spiel von der Kommandozeile aus starten zu k\366nnen" }, + { 217, "Tastatur zeigen" }, + { 218, "Mauszeiger anzeigen" }, + { 219, "Untertitel anzeigen und Sprachausgabe aktivieren" }, + { 220, "Cursor zeigen/verbergen" }, + { 221, "\334berspringen" }, + { 222, "Zeile \374berspringen" }, + { 223, "Text \374berspringen" }, + { 224, "An Ecken anheften" }, + { 225, "Software-Skalierung (gute Qualit\344t, aber langsamer)" }, + { 226, "Ton ein/aus" }, + { 227, "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterst\374tzt." }, + { 228, "SoundFont:" }, + { 229, "Spr." }, + { 230, "Spezielle Farbmischungsmethoden werden von manchen Spielen unterst\374tzt." }, + { 231, "Lautst\344rke spezieller Soundeffekte" }, + { 232, "Legt das standardm\344\337ige Musikwiedergabe-Ger\344t f\374r General-MIDI-Ausgabe fest." }, + { 233, "Legt das standardm\344\337ige Tonwiedergabe-Ger\344t f\374r die Ausgabe von Roland MT-32/LAPC1/CM32l/CM64 fest." }, + { 234, "Legt das Musikwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 235, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien f\374r alle Spiele in ScummVM fest." }, + { 236, "Legt das Verzeichnis f\374r zus\344tzliche Spieldateien fest." }, + { 237, "Legt das bevorzugte Tonwiedergabe-Ger\344t oder den Soundkarten-Emulator fest." }, + { 238, "Legt fest, wo die Spielst\344nde abgelegt werden." }, + { 239, "Sprache" }, + { 240, "Sprachlautst\344rke:" }, + { 241, "Standard-Renderer (16bpp)" }, + { 242, "Ausgew\344hltes Spiel starten" }, + { 243, "Status:" }, + { 244, "Untert." }, + { 245, "Untertitel-Tempo:" }, + { 246, "Untertitel" }, + { 247, "Figur wechseln" }, + { 248, "Tippen f\374r Linksklick, Doppeltippen f\374r Rechtsklick" }, + { 249, "Text und Sprache:" }, + { 250, "In das gew\344hlte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes ausw\344hlen." }, + { 251, "Themenpfad:" }, + { 252, "Thema:" }, + { 253, "Diese Spielkennung ist schon vergeben. Bitte eine andere w\344hlen." }, + { 254, "F\374r dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterst\374tzt." }, + { 255, "Zeit: " }, + { 256, "Zeit\374berschreitung beim Starten des Netzwerks" }, + { 257, "Zu X-Position gehen" }, + { 258, "Zu Y-Position gehen" }, + { 259, "Touchpad-Modus ausgeschaltet." }, + { 260, "Touchpad-Modus aktiviert." }, + { 261, "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" }, + { 262, "Schaltet die General-MIDI-Zuweisung f\374r Spiele mit Roland-MT-32-Audiospur aus." }, + { 263, "Unbekannt" }, + { 264, "Unbekannter Fehler" }, + { 265, "DVD aush\344ngen" }, + { 266, "SMB aush\344ngen" }, + { 267, "Nicht skalieren (Sie m\374ssen nach links und nach rechts scrollen)" }, + { 268, "Farbmodus nicht unterst\374tzt" }, + { 269, "Unbenannt" }, + { 270, "Hoch" }, + { 271, "Benutzt MIDI und AdLib zur Sounderzeugung." }, + { 272, "Den Trackpad-Style f\374r Maussteuerung benutzen" }, + { 273, "Benutzername:" }, + { 274, "SDL-Treiber verwenden" }, + { 275, "Vertikale Bildverkleinerung:" }, + { 276, "Video" }, + { 277, "Virtuelle Tastatur" }, + { 278, "Lautst\344rke" }, + { 279, "Windows MIDI" }, + { 280, "Schreib-Berechtigung nicht vorhanden" }, + { 281, "Daten konnten nicht geschrieben werden." }, + { 282, "Ja" }, + { 283, "Sie m\374ssen ScummVM neustarten, um die Einstellungen zu \374bernehmen." }, + { 284, "Zone" }, + { 285, "Hineinzoomen" }, + { 286, "Herauszoomen" }, + { 287, "alle 10 Minuten" }, + { 288, "alle 15 Minuten" }, + { 289, "alle 30 Minuten" }, + { 290, "alle 5 Minuten" }, + { 291, "\334be~r~" }, + { 292, "Spiel ~h~inzuf\374gen" }, + { 293, "~A~bbrechen" }, + { 294, "~S~chlie\337en" }, + { 295, "Spielo~p~tionen" }, + { 296, "~H~ilfe" }, + { 297, "~K~ampfsteuerung f\374r Indiana Jones" }, + { 298, "~T~asten" }, + { 299, "~L~inke-Hand-Modus" }, + { 300, "~L~aden" }, + { 301, "~L~aden..." }, + { 302, "~W~eiter" }, + { 303, "~O~K" }, + { 304, "~O~ptionen" }, + { 305, "~O~ptionen" }, + { 306, "~Z~ur\374ck" }, + { 307, "~B~eenden" }, + { 308, "Spiel ~e~ntfernen" }, + { 309, "~F~ortsetzen" }, + { 310, "Zur Spiele~l~iste zur\374ck" }, + { 311, "~S~peichern" }, + { 312, "~S~tarten" }, + { 313, "\334ber~g~\344nge aktiviert" }, + { 314, "~W~assereffekt aktiviert" }, + { 315, "~Z~ip-Modus aktiviert" }, { -1, NULL } }; struct PoLangEntry { const char *lang; const char *charset; + const char *langname; const PoMessageEntry *msgs; }; const PoLangEntry _translations[] = { - { "ru_RU", "iso-8859-5", _translation_ru_RU }, - { "fr_FR", "iso-8859-1", _translation_fr_FR }, - { "it_IT", "iso-8859-1", _translation_it_IT }, - { "ca_ES", "iso-8859-1", _translation_ca_ES }, - { "hu_HU", "cp1250", _translation_hu_HU }, - { "de_DE", "iso-8859-1", _translation_de_DE }, - { NULL, NULL, NULL } + { "ru_RU", "iso-8859-5", NULL, _translation_ru_RU }, + { "fr_FR", "iso-8859-1", "Francais", _translation_fr_FR }, + { "it_IT", "iso-8859-1", "Italiano", _translation_it_IT }, + { "ca_ES", "iso-8859-1", "Catalan", _translation_ca_ES }, + { "hu_HU", "cp1250", NULL, _translation_hu_HU }, + { "de_DE", "iso-8859-1", "Deutsch", _translation_de_DE }, + { NULL, NULL, NULL, NULL } }; // code @@ -2061,3 +2070,10 @@ const char *po2c_getlang(const int num) { assert(num < ARRAYSIZE(_translations)); return _translations[num].lang; } + +const char *po2c_getlangname(const int num) { + assert(num < ARRAYSIZE(_translations)); + if (_translations[num].langname != NULL) + return _translations[num].langname; + return _translations[num].lang; +} diff --git a/common/translation.cpp b/common/translation.cpp index ab6a922c6e..b52aad0d1f 100644 --- a/common/translation.cpp +++ b/common/translation.cpp @@ -138,12 +138,12 @@ String TranslationManager::getTranslation(const String &message) { return po2c_gettext(message.c_str()); } -const TLangArray TranslationManager::getSupportedLanguages() const { +const TLangArray TranslationManager::getSupportedLanguageNames() const { TLangArray languages; int total = po2c_getnumlangs(); for (int i = 0; i < total; i++) { - TLanguage lng(po2c_getlang(i), i + 1); + TLanguage lng(po2c_getlangname(i), i + 1); languages.push_back(lng); } @@ -208,7 +208,7 @@ String TranslationManager::getTranslation(const String &message) { return message; } -const TLangArray TranslationManager::getSupportedLanguages() const { +const TLangArray TranslationManager::getSupportedLanguageNames() const { return TLangArray(); } diff --git a/common/translation.h b/common/translation.h index 277ac6f5c4..ccdd0f3500 100644 --- a/common/translation.h +++ b/common/translation.h @@ -117,9 +117,9 @@ public: /** * Returns a list of supported languages. * - * @return The list of supported languages. + * @return The list of supported languages in a user readable form. */ - const TLangArray getSupportedLanguages() const; + const TLangArray getSupportedLanguageNames() const; /** * Returns charset specified by selected translation language diff --git a/gui/options.cpp b/gui/options.cpp index d3bda228a7..072b20b393 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -1001,7 +1001,7 @@ GlobalOptionsDialog::GlobalOptionsDialog() #endif // USE_DETECTLANG _guiLanguagePopUp->appendEntry(_("English"), Common::kTranslationBuiltinId); _guiLanguagePopUp->appendEntry("", 0); - Common::TLangArray languages = TransMan.getSupportedLanguages(); + Common::TLangArray languages = TransMan.getSupportedLanguageNames(); Common::TLangArray::iterator lang = languages.begin(); while (lang != languages.end()) { _guiLanguagePopUp->appendEntry(lang->name, lang->id); diff --git a/po/ca_ES.po b/po/ca_ES.po index 7905fbdf16..6647dcc837 100644 --- a/po/ca_ES.po +++ b/po/ca_ES.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: 2010-06-26 16:45+0100\n" "Last-Translator: Jordi Vilalta Prat \n" "Language-Team: Catalan \n" -"Language: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Catalan\n" #: gui/about.cpp:96 #, c-format @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Torna al nivell de directoris anterior" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -48,19 +48,19 @@ msgstr "Cancel msgid "Choose" msgstr "Escull" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Tanca" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "Clic del ratolí" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "Mostra el teclat" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "Remapeja les tecles" @@ -68,8 +68,8 @@ msgstr "Remapeja les tecles" msgid "Map" msgstr "Mapeja" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -101,15 +101,15 @@ msgstr "Premeu la tecla a associar" msgid "Choose an action to map" msgstr "Sel·leccioneu una acció per mapejar" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "Joc" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "Identificador:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" @@ -117,19 +117,19 @@ msgstr "" "Identificador de joc curt utilitzat per referir-se a les partides i per " "executar el joc des de la línia de comandes" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "Nom:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "Títol complet del joc" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "Idioma:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" @@ -137,206 +137,215 @@ msgstr "" "Idioma del joc. Això no convertirà la vostra versió Espanyola del joc a " "Anglès" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "Plataforma:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "Plataforma per la que el joc es va dissenyar originalment" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "Gràfics" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "GFX" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "Fer canvis sobre les opcions globals de gràfics" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "Àudio" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "Fer canvis sobre les opcions globals d'àudio" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "Volum" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "Fer canvis sobre les opcions globals de volum" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "Fer canvis sobre les opcions globals de MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +#, fuzzy +msgid "Override global MT-32 settings" +msgstr "Fer canvis sobre les opcions globals de MIDI" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "Camins" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "Camí del Joc:" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "Camí Extra:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "Especifica el camí de dades addicionals utilitzades pel joc" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "Camí de les Partides:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "Especifica on es desaran les partides" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "Cap" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Per defecte" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "Seleccioneu el fitxer SoundFont" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "Seleccioneu el directori amb les dades del joc" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "Seleccioneu el directori addicional del joc" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "Seleccioneu el directori de les partides desades" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "" "Aquest identificador de joc ja està usat. Si us plau, trieu-ne un altre." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~T~anca" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "Surt de ScummVM" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "~Q~uant a..." -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "Quant a ScummVM" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "~O~pcions..." -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "Canvia les opcions globals de ScummVM" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "~I~nicia" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "Iniciant el joc seleccionat" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "~C~arrega..." -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "Carrega una partida pel joc seleccionat" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "~A~fegeix Joc..." -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "Mantingueu premut Shift per a l'Addició Massiva" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "~E~dita Joc..." -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "Canvia les opcions del joc" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "~S~uprimeix Joc" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "" "Elimina un joc de la llista. Els fitxers de dades del joc es mantenen " "intactes" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "Cerca a la llista de jocs" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "Neteja el valor" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Carrega partida:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Carrega" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." @@ -344,7 +353,7 @@ msgstr "" "Esteu segur que voleu executar el detector massiu de jocs? Això pot afegir " "una gran quantitat de jocs." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -352,7 +361,7 @@ msgstr "" msgid "Yes" msgstr "Sí" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -360,36 +369,36 @@ msgstr "S msgid "No" msgstr "No" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "ScummVM no ha pogut obrir el directori especificat!" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "ScummVM no ha pogut trobar cap joc al directori especificat!" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "Seleccioneu el joc:" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "Realment voleu suprimir la configuració d'aquest joc?" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "Aquest joc no suporta la càrrega de partides des del llançador." -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "" "ScummVM no ha pogut trobar cap motor capaç d'executar el joc seleccionat!" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "Addició Massiva..." -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "Afegeix Joc..." @@ -456,80 +465,60 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "Mode gràfic:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "Mode de pintat:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "Modes de dispersió especials suportats per alguns jocs" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "Mode pantalla completa" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "Correcció del rati d'aspecte" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregeix la relació d'aspecte per jocs de 320x200" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "Dispositiu Preferit:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 #, fuzzy msgid "Music Device:" msgstr "Dispositiu GM:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so preferit" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "Especifica el dispositiu de so o l'emulador de tarja de so de sortida" -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "Dispositiu MT32:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" -"LAPC1/CM32l/CM64" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "Dispositiu GM:" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "" -"Especifica el dispositiu de so per defecte per a la sortida General MIDI" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "Emulador d'AdLib:" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib s'utilitza per la música de molts jocs" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Freqüència de sortida:" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -537,27 +526,51 @@ msgstr "" "Valors més alts especifiquen millor qualitat de so però pot ser que la " "vostra tarja de so no ho suporti" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "Dispositiu GM:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "" +"Especifica el dispositiu de so per defecte per a la sortida General MIDI" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "Fitxer SoundFont:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "Algunes targes de so, Fluidsynth i Timidity suporten SoundFont" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "Mode combinat AdLib/MIDI" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilitza MIDI i la generació de so AdLib alhora" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "Guany MIDI:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "Dispositiu MT32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"Especifica el dispositiu de so per defecte per a la sortida de Roland MT-32/" +"LAPC1/CM32l/CM64" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 real (desactiva l'emulació GM)" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -565,145 +578,141 @@ msgstr "" "Marqueu si voleu utilitzar el vostre dispositiu hardware real de so " "compatible amb Roland connectat al vostre ordinador" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "Activa el Mode Roland GS" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Desactiva la conversió General MIDI pels jocs que tenen banda sonora per a " "Roland MT-32" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "Guany MIDI:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "Text i Veus:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 msgid "Speech" msgstr "Veus" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 msgid "Subtitles" msgstr "Subtítols" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "Ambdós" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "Veus" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "Subt" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "Mostra els subtítols i reprodueix la veu" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "Velocitat dels subtítols:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "Volum de la música:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "Silenciar tot" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "Volum dels efectes:" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "Volum dels sons d'efectes especials" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "Volum de la veu:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "Camí de les Partides: " -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "Camí dels Temes:" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Especifica el camí de les dades addicionals utilitzades per tots els jocs o " "pel ScummVM" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "Camí dels connectors:" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "Misc" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "Mode de pintat de la interfície d'usuari:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "Desat automàtic:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "Tecles" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "Idioma de la interfície d'usuari:" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "Idioma de la interfície d'usuari de ScummVM" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "Anglès" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "Heu de reiniciar ScummVM perquè tots els canvis tingui efecte." -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "Seleccioneu el directori de les partides desades" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "No es pot escriure al directori seleccionat. Si us plau, escolliu-ne un " "altre." -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "Seleccioneu el directori dels temes de la Interfície d'Usuari" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "Seleccioneu el directori dels fitxers extra" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "Seleccioneu el directori dels connectors" @@ -747,15 +756,15 @@ msgstr "Partida sense t msgid "Select a Theme" msgstr "Seleccioneu un Tema" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "GFX desactivats" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "Pintat estàndard (16bpp)" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "Pintat amb antialias (16bpp)" diff --git a/po/de_DE.po b/po/de_DE.po index 4b3f493a03..63e2307b43 100644 --- a/po/de_DE.po +++ b/po/de_DE.po @@ -7,15 +7,15 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: 2010-07-09 20:37+0100\n" "Last-Translator: Simon Sawatzki\n" "Language-Team: Lothar Serra Mari & Simon Sawatzki " "\n" -"Language: Deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Deutsch\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gui/about.cpp:96 @@ -40,7 +40,7 @@ msgid "Go to previous directory level" msgstr "Zu höherer Pfadebene wechseln" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -50,19 +50,19 @@ msgstr "Abbrechen" msgid "Choose" msgstr "Auswählen" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Schließen" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "Mausklick" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "Tastatur anzeigen" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "Tasten neu zuweisen" @@ -70,8 +70,8 @@ msgstr "Tasten neu zuweisen" msgid "Map" msgstr "Zuweisen" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -103,15 +103,15 @@ msgstr "Taste dr msgid "Choose an action to map" msgstr "Eine Aktion zum Zuweisen auswählen" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "Spiel" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "Kennung:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" @@ -119,19 +119,19 @@ msgstr "" "Kurzer Spielname, um die Spielstände zuzuordnen und das Spiel von der " "Kommandozeile aus starten zu können" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "Name:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "Voller Name des Spiels" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "Sprache:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" @@ -139,205 +139,214 @@ msgstr "" "Sprache des Spiels. Diese Funktion wird nicht eine spanische Version des " "Spiels in eine deutsche verwandeln." -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "Plattform:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "Plattform, für die das Spiel ursprünglich erstellt wurde" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "Grafik" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "GFX" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "Globale Grafikeinstellungen übergehen" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "Audio" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "Globale Audioeinstellungen übergehen" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "Lautstärke" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "Globale Lautstärke-Einstellungen übergehen" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "Globale MIDI-Einstellungen übergehen" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +#, fuzzy +msgid "Override global MT-32 settings" +msgstr "Globale MIDI-Einstellungen übergehen" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "Pfade" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "Spielpfad:" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "Extrapfad:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "Legt das Verzeichnis für zusätzliche Spieldateien fest." -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "Spielstände:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "Legt fest, wo die Spielstände abgelegt werden." -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "-" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Standard" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "SoundFont auswählen" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "Verzeichnis mit Spieldateien auswählen" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "Verzeichnis mit zusätzlichen Dateien auswählen" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "Diese Spielkennung ist schon vergeben. Bitte eine andere wählen." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~B~eenden" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "ScummVM beenden" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "Übe~r~" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "Über ScummVM" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "~O~ptionen" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "Globale ScummVM-Einstellungen bearbeiten" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "~S~tarten" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "Ausgewähltes Spiel starten" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "~L~aden..." -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "Spielstand für ausgewähltes Spiel laden" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "Spiel ~h~inzufügen" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "" "Umschalttaste (Shift) gedrückt halten, um Verzeichnisse nach Spielen zu " "durchsuchen" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "Spielo~p~tionen" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "Spieloptionen ändern" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "Spiel ~e~ntfernen" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "Spiel aus der Liste entfernen. Die Spieldateien bleiben erhalten." -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "In Spieleliste suchen" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "Suchen:" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "Wert löschen" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Spiel laden:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Laden" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." @@ -345,7 +354,7 @@ msgstr "" "Möchten Sie wirklich den PC nach Spielen durchsuchen? Möglicherweise wird " "dabei eine größere Menge an Spielen hinzugefügt." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -353,7 +362,7 @@ msgstr "" msgid "Yes" msgstr "Ja" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -361,36 +370,36 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "ScummVM kann das gewählte Verzeichnis nicht öffnen!" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "ScummVM kann in dem gewählten Verzeichnis kein Spiel finden!" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "Spiel auswählen:" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "Möchten Sie wirklich diese Spielkonfiguration entfernen?" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "" "Für dieses Spiel wird das Laden aus der Spieleliste heraus nicht unterstützt." -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "ScummVM konnte keine Engine finden, um das Spiel zu starten!" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "Durchsuchen" -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "Spiel hinzufügen" @@ -457,81 +466,61 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "Grafikmodus:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "Render-Modus:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "" "Spezielle Farbmischungsmethoden werden von manchen Spielen unterstützt." -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "Vollbildmodus" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "Seitenverhältnis korrigieren" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "Seitenverhältnis für Spiele mit der Auflösung 320x200 korrigieren" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "Standard-Gerät:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Music Device:" msgstr "Musikgerät:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Legt das bevorzugte Tonwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "Legt das Musikwiedergabe-Gerät oder den Soundkarten-Emulator fest." -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "MT32-Gerät:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/" -"LAPC1/CM32l/CM64 fest." - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "GM-Gerät:" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "" -"Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "AdLib-Emulator" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib wird für die Musik in vielen Spielen verwendet." -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Ausgabefrequenz:" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -539,28 +528,52 @@ msgstr "" "Höhere Werte bewirken eine bessere Soundqualität, werden aber möglicherweise " "nicht von jeder Soundkarte unterstützt." -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "GM-Gerät:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "" +"Legt das standardmäßige Musikwiedergabe-Gerät für General-MIDI-Ausgabe fest." + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFont wird von einigen Soundkarten, Fluidsynth und Timidity unterstützt." -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "AdLib-/MIDI-Modus" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "Benutzt MIDI und AdLib zur Sounderzeugung." -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "MIDI-Lautstärke:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "MT32-Gerät:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"Legt das standardmäßige Tonwiedergabe-Gerät für die Ausgabe von Roland MT-32/" +"LAPC1/CM32l/CM64 fest." + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Echte Roland-MT-32-Emulation (GM-Emulation deaktiviert)" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -568,145 +581,141 @@ msgstr "" "Wählen Sie dies aus, wenn Sie Ihre echte Hardware, die mit einer Roland-" "kompatiblen Soundkarte verbunden ist, verwenden möchten." -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "Roland-GS-Modus" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Schaltet die General-MIDI-Zuweisung für Spiele mit Roland-MT-32-Audiospur " "aus." -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "MIDI-Lautstärke:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "Text und Sprache:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 msgid "Speech" msgstr "Sprache" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 msgid "Subtitles" msgstr "Untertitel" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "Beides" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "Spr." -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "Untert." -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "Untertitel anzeigen und Sprachausgabe aktivieren" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "Untertitel-Tempo:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "Musiklautstärke:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "Alles aus" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "Effektlautstärke:" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "Lautstärke spezieller Soundeffekte" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "Sprachlautstärke:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "Spielstände: " -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "Themenpfad:" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "Legt das Verzeichnis für zusätzliche Spieldateien für alle Spiele in ScummVM " "fest." -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "Plugin-Pfad:" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "Sonstiges" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "Thema:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "GUI-Renderer:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "Autom. Speichern:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "Tasten" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "GUI-Sprache:" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "Sprache der ScummVM-Oberfläche" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "English" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "Sie müssen ScummVM neustarten, um die Einstellungen zu übernehmen." -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "Verzeichnis für Spielstände auswählen" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" "In das gewählte Verzeichnis kann nicht geschrieben werden. Bitte ein anderes " "auswählen." -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "Verzeichnis für Oberflächen-Themen" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "Verzeichnis für zusätzliche Dateien auswählen" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "Verzeichnis für Erweiterungen auswählen" @@ -750,15 +759,15 @@ msgstr "Unbenannt" msgid "Select a Theme" msgstr "Thema auswählen" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "GFX ausgeschalten" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "Standard-Renderer (16bpp)" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "Kantenglättung (16bpp)" diff --git a/po/fr_FR.po b/po/fr_FR.po index d4e9e9f53c..51af254072 100644 --- a/po/fr_FR.po +++ b/po/fr_FR.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" -"PO-Revision-Date: 2010-07-09 18:17+0100\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" +"PO-Revision-Date: 2010-07-30 22:18+0100\n" "Last-Translator: Thierry Crozat \n" "Language-Team: French \n" -"Language: Francais\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Francais\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: gui/about.cpp:96 @@ -38,30 +38,41 @@ msgstr "Remonter" msgid "Go to previous directory level" msgstr "Remonte d'un niveau dans la hiérarchie de répertoire" -#: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 -#: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 +#: gui/browser.cpp:70 +#: gui/chooser.cpp:49 +#: gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:280 +#: gui/massadd.cpp:95 +#: gui/options.cpp:1029 +#: gui/saveload.cpp:65 +#: gui/saveload.cpp:157 +#: gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" msgstr "Annuler" -#: gui/browser.cpp:71 gui/chooser.cpp:50 gui/themebrowser.cpp:57 +#: gui/browser.cpp:71 +#: gui/chooser.cpp:50 +#: gui/themebrowser.cpp:57 msgid "Choose" msgstr "Choisir" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 +#: backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Fermer" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "Clic de souris" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 +#: base/main.cpp:285 msgid "Display keyboard" msgstr "Afficher le clavier" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 +#: base/main.cpp:288 msgid "Remap keys" msgstr "Changer l'affectation des touches" @@ -69,8 +80,12 @@ msgstr "Changer l'affectation des touches" msgid "Map" msgstr "Affecter" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 +#: gui/launcher.cpp:281 +#: gui/launcher.cpp:893 +#: gui/launcher.cpp:897 +#: gui/massadd.cpp:92 +#: gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -80,12 +95,16 @@ msgstr "OK" msgid "Select an action and click 'Map'" msgstr "Selectionez une action et cliquez 'Affecter'" -#: gui/KeysDialog.cpp:83 gui/KeysDialog.cpp:105 gui/KeysDialog.cpp:144 +#: gui/KeysDialog.cpp:83 +#: gui/KeysDialog.cpp:105 +#: gui/KeysDialog.cpp:144 #, c-format msgid "Associated key : %s" msgstr "Touche associée: %s" -#: gui/KeysDialog.cpp:85 gui/KeysDialog.cpp:107 gui/KeysDialog.cpp:146 +#: gui/KeysDialog.cpp:85 +#: gui/KeysDialog.cpp:107 +#: gui/KeysDialog.cpp:146 #, c-format msgid "Associated key : none" msgstr "Touche associée: aucune" @@ -102,248 +121,286 @@ msgstr "Appuyez sur la touche msgid "Choose an action to map" msgstr "Sélectionnez une action à affecter" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "Jeu" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 -msgid "" -"Short game identifier used for referring to savegames and running the game " -"from the command line" -msgstr "" -"ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu " -"depuis la ligne de commande" +#: gui/launcher.cpp:175 +#: gui/launcher.cpp:176 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "ID compact du jeu utilisé pour identifier les sauvegardes et démarrer le jeu depuis la ligne de commande" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "Nom:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 +#: gui/launcher.cpp:180 msgid "Full title of the game" msgstr "Nom complet du jeu" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "Langue:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 -msgid "" -"Language of the game. This will not turn your Spanish game version into " -"English" -msgstr "" -"Langue du jeu. Cela ne traduira pas en anglais par magie votre version " -"espagnole du jeu." +#: gui/launcher.cpp:183 +#: gui/launcher.cpp:184 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 +#: gui/launcher.cpp:196 +#: gui/options.cpp:80 +#: gui/options.cpp:635 +#: gui/options.cpp:645 +#: gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "Plateforme:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 +#: gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "Plateforme pour laquelle votre jeu a été conçu" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 msgid "Graphics" msgstr "Graphique" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 msgid "GFX" msgstr "GFX" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "Utiliser des réglages graphiques spécifiques à ce jeux" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 +#: gui/options.cpp:921 msgid "Audio" msgstr "Audio" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "Utiliser des réglages audio spécifiques à ce jeux" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 +#: gui/options.cpp:925 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "Utiliser des réglages de volume sonore spécifiques à ce jeux" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 +#: gui/options.cpp:933 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "Utiliser des réglages MIDI spécifiques à ce jeux" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 +#: gui/options.cpp:939 +msgid "MT-32" +msgstr "MT-32" + +#: gui/launcher.cpp:248 +msgid "Override global MT-32 settings" +msgstr "Utiliser des réglages MT-32 spécifiques à ce jeux" + +#: gui/launcher.cpp:258 +#: gui/options.cpp:945 msgid "Paths" msgstr "Chemins" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "Chemin du Jeu:" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 +#: gui/options.cpp:958 msgid "Extra Path:" msgstr "Extra:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 +#: gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "Définie un chemin vers des données suplémentaires utilisées par le jeu" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "Sauvegardes:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 +#: gui/launcher.cpp:273 +#: gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "Définie l'emplacement où les fichiers de sauvegarde sont créés" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 +#: gui/launcher.cpp:369 +#: gui/launcher.cpp:418 +#: gui/options.cpp:230 +#: gui/options.cpp:399 +#: gui/options.cpp:497 +#: gui/options.cpp:555 +#: gui/options.cpp:732 +#: gui/options.cpp:956 +#: gui/options.cpp:959 +#: gui/options.cpp:963 +#: gui/options.cpp:1053 +#: gui/options.cpp:1059 +#: gui/options.cpp:1065 +#: gui/options.cpp:1073 +#: gui/options.cpp:1097 +#: gui/options.cpp:1101 +#: gui/options.cpp:1107 +#: gui/options.cpp:1114 +#: gui/options.cpp:1213 msgid "None" msgstr "Aucun" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 +#: gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Défaut" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 +#: gui/options.cpp:1207 msgid "Select SoundFont" msgstr "Choisir une banque de sons" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 +#: gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "Sélectionner le répertoire contenant les données du jeu" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "Sélectionner un répertoire supplémentaire" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "Cet ID est déjà utilisé par un autre jeu. Choisissez en un autre svp." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 +#: engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~Q~uitter" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "Quitter ScummVM" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "À ~P~ropos..." -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "À propos de ScummVM" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "~O~ptions..." -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "Change les options globales de ScummVM" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "~D~émarrer" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "Démarre le jeu sélectionné" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "~C~harger" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "Charge une sauvegarde pour le jeu sélectionné" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "~A~jouter..." -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" -msgstr "" -"Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" +msgstr "Ajoute un jeu à la Liste. Maintenez Shift enfoncée pour un Ajout Massif" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "~E~diter..." -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "Change les options du jeu" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "~S~upprimer" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "Supprime le jeu de la liste. Les fichiers sont conservés" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "Recherche dans la liste de jeux" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 +#: gui/launcher.cpp:1057 msgid "Search:" msgstr "Filtre:" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 +#: gui/options.cpp:733 msgid "Clear value" msgstr "Effacer la valeur" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 msgid "Load game:" msgstr "Charger le jeu:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Charger" -#: gui/launcher.cpp:660 -msgid "" -"Do you really want to run the mass game detector? This could potentially add " -"a huge number of games." -msgstr "" -"Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut " -"potentiellement ajouter un grand nombre de jeux." +#: gui/launcher.cpp:680 +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "Voulez-vous vraiment lancer la détection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -351,7 +408,8 @@ msgstr "" msgid "Yes" msgstr "Oui" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -359,40 +417,40 @@ msgstr "Oui" msgid "No" msgstr "Non" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "ScummVM n'a pas pu ouvrir le répertoire sélectionné." -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "ScummVM n'a pas trouvé de jeux dans le répertoire sélectionné." -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "Choisissez le jeu:" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "Voulez-vous vraiment supprimer ce jeu?" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." -msgstr "" -"Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." +msgstr "Le chargement de sauvegarde depuis le lanceur n'est pas supporté pour ce jeu." -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "ScummVM n'a pas pu trouvé de moteur pour lancer le jeu sélectionné." -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "Ajout Massif..." -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "Ajouter..." -#: gui/massadd.cpp:79 gui/massadd.cpp:82 +#: gui/massadd.cpp:79 +#: gui/massadd.cpp:82 msgid "... progress ..." msgstr "... en cours ..." @@ -455,271 +513,265 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "Mode graphique:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "Mode de rendu:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 +#: gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "Mode spécial de tramage supporté par certains jeux" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "Plein écran" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "Correction du rapport d'aspect" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "Corrige le rapport d'aspect pour les jeu 320x200" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "Sortie Préféré:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Music Device:" msgstr "Sortie Audio:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" -msgstr "" -"Spécifie le périphérique de sortie audio ou l'émulateur de carte audio " -"préféré" +msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio préféré" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 +#: gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "Spécifie le périphérique de sortie audio ou l'émulateur de carte audio" -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "Sortie MT-32:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/" -"CM32l/CM64" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "Sortie GM:" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "Émulateur AdLib:" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 +#: gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib est utilisé pour la musique dans de nombreux jeux" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Fréquence:" -#: gui/options.cpp:693 gui/options.cpp:694 -msgid "" -"Higher value specifies better sound quality but may be not supported by your " -"soundcard" -msgstr "" -"Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas " -"être supporté par votre carte son" +#: gui/options.cpp:699 +#: gui/options.cpp:700 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Une valeur plus élevée donne une meilleure qualité audio mais peut ne pas être supporté par votre carte son" + +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "Sortie GM:" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "Spécifie le périphérique audio par défaut pour la sortie General MIDI" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "Banque de sons:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 +#: gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" -msgstr "" -"La banque de sons est utilisée par certaines cartes audio, Fluidsynth et " -"Timidity" +msgstr "La banque de sons est utilisée par certaines cartes audio, Fluidsynth et Timidity" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "Mode mixe AdLib/MIDI" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "Utiliser à la fois MIDI et AdLib" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "Gain MIDI:" + +#: gui/options.cpp:749 +msgid "MT-32 Device:" +msgstr "Sortie MT-32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "Spécifie le périphérique audio par défaut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 exacte (désactive l'émulation GM)" -#: gui/options.cpp:713 -msgid "" -"Check if you want to use your real hardware Roland-compatible sound device " -"connected to your computer" -msgstr "" -"Vérifie si vous voulez utiliser un périphérique audio compatible Roland " -"connecté à l'ordinateur" +#: gui/options.cpp:753 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Vérifie si vous voulez utiliser un périphérique audio compatible Roland connecté à l'ordinateur" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "Activer le mode Roland GS" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "Désactiver la conversion des pistes MT-32 en General MIDI" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "Gain MIDI:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "Dialogue:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 +#: gui/options.cpp:791 msgid "Speech" msgstr "Audio" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 +#: gui/options.cpp:792 msgid "Subtitles" msgstr "Sous-titres" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 +#: gui/options.cpp:793 msgid "Both" msgstr "Les deux" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "Audio" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "Subs" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "Affiche les sous-titres et joue les dialogues audio" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "Vitesse des ST:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "Volume Musique:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "Silence" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "Volume Bruitage:" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 +#: gui/options.cpp:820 msgid "Special sound effects volume" msgstr "Volume des effets spéciaux sonores" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "Volume Dialogues:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "Sauvegardes:" -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "Thèmes:" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 +#: gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" -msgstr "" -"Spécifie un chemin vers des données supplémentaires utilisées par tous les " -"jeux ou ScummVM" +msgstr "Spécifie un chemin vers des données supplémentaires utilisées par tous les jeux ou ScummVM" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "Plugins:" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "Divers" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "Thème:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "Interface:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "Sauvegarde auto:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "Touches" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "Langue:" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "Langue de l'interface graphique de ScummVM" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "Anglais" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." -msgstr "" -"Vous devez relancer ScummVM pour que le changement soit pris en compte." +msgstr "Vous devez relancer ScummVM pour que le changement soit pris en compte." -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "Sélectionner le répertoire pour les sauvegardes" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." -msgstr "" -"Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre " -"répertoire." +msgstr "Le répertoire sélectionné est vérouillé en écriture. Sélectionnez un autre répertoire." -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "Sélectionner le répertoire des thèmes d'interface" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "Sélectionner le répertoire pour les fichiers suplémentaires" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "Sélectionner le répertoire des plugins" -#: gui/saveload.cpp:60 gui/saveload.cpp:241 +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:241 msgid "No date saved" msgstr "Date non sauvée" -#: gui/saveload.cpp:61 gui/saveload.cpp:242 +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:242 msgid "No time saved" msgstr "Heure non sauvée" -#: gui/saveload.cpp:62 gui/saveload.cpp:243 +#: gui/saveload.cpp:62 +#: gui/saveload.cpp:243 msgid "No playtime saved" msgstr "Durée de jeu non sauvée" -#: gui/saveload.cpp:69 gui/saveload.cpp:157 +#: gui/saveload.cpp:69 +#: gui/saveload.cpp:157 msgid "Delete" msgstr "Supprimer" @@ -739,7 +791,8 @@ msgstr "Heure:" msgid "Playtime: " msgstr "Durée de jeu:" -#: gui/saveload.cpp:286 gui/saveload.cpp:353 +#: gui/saveload.cpp:286 +#: gui/saveload.cpp:353 msgid "Untitled savestate" msgstr "Sauvegarde sans nom" @@ -747,15 +800,15 @@ msgstr "Sauvegarde sans nom" msgid "Select a Theme" msgstr "Sélectionnez un Thème" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "GFX désactivé" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "Standard (16bpp)" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "Anti-crénelé (16 bpp)" @@ -768,13 +821,15 @@ msgstr "Le niveau de debug '%s' n'est pas support msgid "Menu" msgstr "Menu" -#: base/main.cpp:276 backends/platform/symbian/src/SymbianActions.cpp:48 +#: base/main.cpp:276 +#: backends/platform/symbian/src/SymbianActions.cpp:48 #: backends/platform/wince/CEActionsPocket.cpp:44 #: backends/platform/wince/CEActionsSmartphone.cpp:45 msgid "Skip" msgstr "Passer" -#: base/main.cpp:279 backends/platform/symbian/src/SymbianActions.cpp:53 +#: base/main.cpp:279 +#: backends/platform/symbian/src/SymbianActions.cpp:53 #: backends/platform/wince/CEActionsPocket.cpp:41 msgid "Pause" msgstr "Mettre en pause" @@ -787,7 +842,8 @@ msgstr "Passer la phrase" msgid "Error running game:" msgstr "Erreur lors de l'éxécution du jeu:" -#: base/main.cpp:430 base/main.cpp:431 +#: base/main.cpp:430 +#: base/main.cpp:431 msgid "Could not find any engine capable of running the selected game" msgstr "Impossible de trouver un moteur pour exécuter le jeu sélectionné" @@ -839,7 +895,8 @@ msgstr "Echec de la lecture" msgid "Writing data failed" msgstr "Echec de l'écriture des données" -#: common/error.cpp:60 common/error.cpp:71 +#: common/error.cpp:60 +#: common/error.cpp:71 msgid "Unknown Error" msgstr "Erreur inconnue" @@ -883,7 +940,8 @@ msgstr "Retour au ~L~anceur" msgid "Save game:" msgstr "Sauvegarde:" -#: engines/dialogs.cpp:119 backends/platform/symbian/src/SymbianActions.cpp:47 +#: engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 #: backends/platform/wince/CEActionsPocket.cpp:42 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:44 @@ -891,12 +949,14 @@ msgstr "Sauvegarde:" msgid "Save" msgstr "Sauver" -#: engines/dialogs.cpp:301 engines/mohawk/dialogs.cpp:84 +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:84 #: engines/mohawk/dialogs.cpp:118 msgid "~O~K" msgstr "~O~K" -#: engines/dialogs.cpp:302 engines/mohawk/dialogs.cpp:85 +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:85 #: engines/mohawk/dialogs.cpp:119 msgid "~C~ancel" msgstr "~A~nnuler" @@ -918,7 +978,8 @@ msgstr "~S~uivant" msgid "~C~lose" msgstr "~F~ermer" -#: engines/mohawk/dialogs.cpp:81 engines/mohawk/dialogs.cpp:115 +#: engines/mohawk/dialogs.cpp:81 +#: engines/mohawk/dialogs.cpp:115 msgid "~Z~ip Mode Activated" msgstr "Mode ~Z~ip Activé" @@ -1190,11 +1251,13 @@ msgstr "Acceleration du pad GC:" msgid "DVD" msgstr "DVD" -#: backends/platform/wii/options.cpp:89 backends/platform/wii/options.cpp:101 +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 msgid "Status:" msgstr "Status:" -#: backends/platform/wii/options.cpp:90 backends/platform/wii/options.cpp:102 +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 msgid "Unknown" msgstr "Inconue" @@ -1404,8 +1467,8 @@ msgstr "Voulez-vous ex #~ msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" #~ msgstr "" -#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible " -#~ "'%s', chemin '%s')" +#~ "Le plugin %s a échoué dans l'instanciation du moteur de jeu: %s (cible '%" +#~ "s', chemin '%s')" #~ msgid "Ok" #~ msgstr "Ok" diff --git a/po/hu_HU.po b/po/hu_HU.po index 1d9a6c3268..8478f2ffaa 100644 --- a/po/hu_HU.po +++ b/po/hu_HU.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: 2009-11-25 07:42-0500\n" "Last-Translator: Alex Bevilacqua \n" "Language-Team: Hungarian\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=cp1250\n" "Content-Transfer-Encoding: 8bit\n" +"Language: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gui/about.cpp:96 @@ -39,7 +39,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -49,19 +49,19 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "" @@ -69,8 +69,8 @@ msgstr "" msgid "Map" msgstr "" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -102,244 +102,252 @@ msgstr "" msgid "Choose an action to map" msgstr "" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" msgstr "" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "Grafikával" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "Hang" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "Volumene" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +msgid "Override global MT-32 settings" +msgstr "" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "Ösvények" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 #, fuzzy msgid "Game Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 #, fuzzy msgid "Save Path:" msgstr "Extra Útvonal:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "Semmi" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 #, fuzzy msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "" -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." msgstr "" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -347,7 +355,7 @@ msgstr "" msgid "Yes" msgstr "" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -356,35 +364,35 @@ msgstr "" msgid "No" msgstr "Semmi" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "" -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "" -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "" @@ -451,243 +459,243 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "Grafikus mód:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "Renderelési mód:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "Teljes képerny s mód:" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "Aspect adag korrekció" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:645 +#: gui/options.cpp:663 #, fuzzy msgid "Music Device:" msgstr "Zene mennyiség:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "Zene mennyiség:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "AdLib vezet :" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Kimeneti teljesítmény:" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "Vegyes AdLib/MIDI mód" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "MIDI nyereség:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "Zene mennyiség:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Igaz Roland MT-32 (megbénít GM emuláció)" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "Képessé Roland GS Mode" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "MIDI nyereség:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "Szöveg és beszéd:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 #, fuzzy msgid "Speech" msgstr "Csak a beszéd" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 #, fuzzy msgid "Subtitles" msgstr "Csak feliratok" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "Felirat sebesség:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "Zene mennyiség:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "Muta Összes" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "SFX mennyisége" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "Beszéd mennyiség:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "" -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "Téma:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "Leképez eszköz GUI:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "Automatikus mentés:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "Kulcsok" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "" @@ -732,15 +740,15 @@ msgstr "" msgid "Select a Theme" msgstr "" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po index bbe6e92e95..efb92c9db9 100644 --- a/po/it_IT.po +++ b/po/it_IT.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: 2010-06-30 23:56+0100\n" "Last-Translator: Maff \n" "Language-Team: Italian\n" -"Language: Italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" +"Language: Italiano\n" #: gui/about.cpp:96 #, c-format @@ -38,7 +38,7 @@ msgid "Go to previous directory level" msgstr "Vai alla cartella superiore" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -48,19 +48,19 @@ msgstr "Annulla" msgid "Choose" msgstr "Scegli" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "Chiudi" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "Clic del mouse" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "Mostra tastiera" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "Riprogramma tasti" @@ -68,8 +68,8 @@ msgstr "Riprogramma tasti" msgid "Map" msgstr "Mappa" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -101,15 +101,15 @@ msgstr "Premi il tasto da associare" msgid "Choose an action to map" msgstr "Scegli un'azione da mappare" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "Gioco" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" @@ -117,222 +117,231 @@ msgstr "" "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e " "per l'esecuzione del gioco dalla riga di comando" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "Nome:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "Titolo completo del gioco" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "Lingua:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" msgstr "" "Lingua del gioco. Un gioco inglese non potrà risultare tradotto in italiano" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "Piattaforma:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "La piattaforma per la quale il gioco è stato concepito" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "Grafica" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "Grafica" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "Ignora le impostazioni grafiche globali" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "Audio" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "Ignora le impostazioni audio globali" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "Volume" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "Ignora le impostazioni globali di volume" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "Ignora le impostazioni MIDI globali" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +#, fuzzy +msgid "Override global MT-32 settings" +msgstr "Ignora le impostazioni MIDI globali" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "Percorsi" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "Percorso gioco:" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "Percorso extra:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "Specifica il percorso di ulteriori dati usati dal gioco" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "Salvataggi:" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "Specifica dove archiviare i salvataggi" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "Nessuno" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "Predefinito" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "Seleziona SoundFont" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "Seleziona la cartella contenente i file di gioco" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "Seleziona la cartella di gioco aggiuntiva" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "Seleziona la cartella dei salvataggi" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "Questo ID di gioco è già in uso. Si prega di sceglierne un'altro." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "C~h~iudi" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "Chiudi ScummVM" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "~I~nfo..." -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "Informazioni su ScummVM" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "~O~pzioni..." -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "Modifica le opzioni globali di ScummVM" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "~G~ioca" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "Esegue il gioco selezionato" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "~C~arica..." -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "Carica un salvataggio del gioco selezionato" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "~A~ggiungi gioco..." -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "Tieni premuto Shift per l'aggiunta in massa" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "~M~odifica gioco..." -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "Modifica le opzioni di gioco" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "~R~imuovi gioco" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "Cerca nella lista dei giochi" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "Cerca:" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "Cancella" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "Carica gioco:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "Carica" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." @@ -340,7 +349,7 @@ msgstr "" "Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere " "un numero enorme di giochi." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -348,7 +357,7 @@ msgstr "" msgid "Yes" msgstr "Sì" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -356,39 +365,39 @@ msgstr "S msgid "No" msgstr "No" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "ScummVM non ha potuto aprire la cartella specificata!" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "Scegli il gioco:" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "Sei sicuro di voler rimuovere questa configurazione di gioco?" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "" "Questo gioco non supporta il caricamento di salvataggi dalla schermata di " "avvio." -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "" "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco " "selezionato!" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "Agg. in massa..." -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "Aggiungi gioco..." @@ -455,81 +464,62 @@ msgstr "44 kHz" msgid "48 kHz" msgstr "48 kHz" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "Modalità:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "Resa grafica:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "Modalità di resa grafica speciali supportate da alcuni giochi" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "Modalità a schermo intero" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "Correzione proporzioni" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "Corregge le proporzioni dei giochi 320x200" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "Disp. preferito:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 #, fuzzy msgid "Music Device:" msgstr "Dispositivo GM:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "" "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "" "Specifica il dispositivo di output audio o l'emulatore della scheda audio" -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "Disposit. MT32:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" -"CM32l/CM64" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "Dispositivo GM:" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "Emulatore AdLib:" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "AdLib è utilizzato per la musica in molti giochi" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "Frequenza:" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -537,27 +527,50 @@ msgstr "" "Valori più alti restituiscono un suono di maggior qualità, ma potrebbero non " "essere supportati dalla tua scheda audio" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "Dispositivo GM:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "Specifica il dispositivo audio predefinito per l'output General MIDI" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "SoundFont è supportato da alcune schede audio, Fluidsynth e Timidity" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "Modalità mista AdLib/MIDI" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "Utilizza generazione di suono sia MIDI che AdLib" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "Guadagno MIDI:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "Disposit. MT32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/" +"CM32l/CM64" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "Roland MT-32 effettivo (disattiva emulazione GM)" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -565,141 +578,137 @@ msgstr "" "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland " "che è connesso al tuo computer" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "Attiva la modalità Roland GS" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland " "MT-32" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "Guadagno MIDI:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "Testo e voci:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 msgid "Speech" msgstr "Voci" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 msgid "Subtitles" msgstr "Sottotitoli" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "Entrambi" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "Voci" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "Sub" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "Mostra i sottotitoli e attiva le voci" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "Velocità testo:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "Volume musica:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "Disattiva audio" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "Volume effetti:" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "Volume degli effetti sonori" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "Volume voci:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "Salvataggi:" -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "Percorso tema:" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "Percorso plugin:" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "Varie" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "Tema:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "Renderer GUI:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "Autosalva:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "Tasti" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "Lingua GUI:" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "Lingua dell'interfaccia grafica di ScummVM" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "Inglese" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "Devi riavviare ScummVM affinché le modifiche abbiano effetto." -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "Seleziona la cartella per i salvataggi" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "La cartella scelta è in sola lettura. Si prega di sceglierne un'altra." -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "Seleziona la cartella dei temi dell'interfaccia" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "Seleziona la cartella dei file aggiuntivi" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "Seleziona la cartella dei plugin" @@ -743,15 +752,15 @@ msgstr "Salvataggio senza titolo" msgid "Select a Theme" msgstr "Seleziona un tema" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "Grafica disattivata" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "Renderer standard (16bpp)" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "Renderer con antialiasing (16bpp)" diff --git a/po/ru_RU.po b/po/ru_RU.po index 2d4a96b63c..cf77731f59 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -7,16 +7,16 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM VERSION\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: 2010-06-13 20:55+0300\n" "Last-Translator: Eugene Sandulenko \n" "Language-Team: Russian\n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n" -"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Language: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" +"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gui/about.cpp:96 #, c-format @@ -40,7 +40,7 @@ msgid "Go to previous directory level" msgstr "¿ÕàÕÙâØ ÝÐ ÔØàÕÚâÞàØî ãàÞÒÝÕÜ ÒëèÕ" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -50,19 +50,19 @@ msgstr " msgid "Choose" msgstr "²ëÑàÐâì" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "·ÐÚàëâì" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "ºÛØÚ Üëèìî" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "¿ÞÚÐ×Ðâì ÚÛÐÒØÐâãàã" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "¿ÕàÕÝÐ×ÝÐçØâì ÚÛÐÒØèØ" @@ -70,8 +70,8 @@ msgstr " msgid "Map" msgstr "½Ð×ÝÐçØâì" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -103,15 +103,15 @@ msgstr " msgid "Choose an action to map" msgstr "²ëÑÕàØâÕ ÔÕÙáâÒØÕ ÔÛï ÝÐ×ÝÐçÕÝØï" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "¸ÓàÐ" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "ID:" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" @@ -119,19 +119,19 @@ msgstr "" "ºÞàÞâÚØÙ ØÔÕÝâØäØÚÐâÞà, ØáßÞÛì×ãÕÜëÙ ÔÛï ØÜÕÝ áÞåàÐÝÕÝØÙ ØÓà Ø ÔÛï ×ÐßãáÚÐ " "Ø× ÚÞÜÐÝÔÝÞÙ áâàÞÚØ" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "½Ð×ÒÐÝØÕ:" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "¿ÞÛÝÞÕ ÝÐ×ÒÐÝØÕ ØÓàë" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "Ï×ëÚ:" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" @@ -139,203 +139,212 @@ msgstr "" "Ï×ëÚ ØÓàë. ¸×ÜÕÝÕÝØÕ íâÞÓÞ ßÐàÐÜÕâàÐ ÝÕ ßàÕÒàÐâØâ ØÓàã ÝÐ ÐÝÓÛØÙáÚÞÜ Ò " "àãááÚãî" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "<ßÞ ãÜÞÛçÐÝØî>" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "¿ÛÐâäÞàÜÐ:" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ÚÞâÞàÞÙ ØÓàÐ ÑëÛÐ Ø×ÝÐçÐÛìÝÞ àÐ×àÐÑÞâÐÝÐ" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "³àÐäØÚÐ" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "³àä" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÐäØÚØ" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "°ãÔØÞ" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÐãÔØÞ" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "³àÞÜÚÞáâì" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ ÓàÞÜÚÞáâØ" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "MIDI" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +#, fuzzy +msgid "Override global MT-32 settings" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "¿ãâØ" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "¿ãâì Ú ØÓàÕ: " -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "´Þß. ßãâì:" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå ÔÛï ØÓàë" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "¿ãâì áÞåà.: " -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "ÃÚÐ×ëÒÐÕâ ßãâì Ú áÞåàÐÝÕÝØïÜ ØÓàë" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "½Õ ×ÐÔÐÝ" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "¿Þ ãÜÞÛçÐÝØî" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "²ëÑÕàØâÕ SoundFont" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á äÐÙÛÐÜØ ØÓàë" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "²ëÑÕàØâÕ ÔÞßÞÛÝØâÕÛìÝãî ÔØàÕÚâÞàØî ØÓàë" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "ÍâÞâ ID ØÓàë ãÖÕ ØáßÞÛì×ãÕâáï. ¿ÞÖÐÛãÙáâÐ, ÒëÑÕàØâÕ ÔàãÓÞÙ." -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "~²~ëåÞÔ" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "²ëåÞÔ Ø× ScummVM" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "¾ ß~à~ÞÓàÐÜÜÕ..." -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "¾ ßàÞÓàÐÜÜÕ ScummVM" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "~¾~ßæØØ..." -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "¸×ÜÕÝØâì ÓÛÞÑÐÛìÝëÕ ÞßæØØ ScummVM" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "¿~ã~áÚ" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "·ÐßãáâØâì ÒëÑàÐÝÝãî ØÓàã" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "~·~ÐÓà...." -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "·ÐÓàãרâì áÞåàÝÕÝØÕ ÔÛï ÒëÑàÐÝÝÞÙ ØÓàë" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "~´~ÞÑ. ØÓàã..." -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "ÃÔÕàÖØÒÐÙâÕ ÚÛÐÒØèã Shift ÔÛï âÞÓÞ, çâÞÑë ÔÞÑÐÒØâì ÝÕáÚÞÛìÚÞ ØÓà" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "¸×~Ü~. ØÓàã..." -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "¸×ÜÕÝØâì ÞßæØØ ØÓàë" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "~Ã~ÔÐÛØâì ØÓàã" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "ÃÔÐÛØâì ØÓàã Ø× áߨáÚÐ. ½Õ ãÔÐÛïÕâ ØÓàã á ÖÕáâÚÞÓÞ ÔØáÚÐ" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "¿ÞØáÚ Ò áߨáÚÕ ØÓà" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "¿ÞØáÚ:" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "¾çØáâØâì ×ÝÐçÕÝØÕ" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "·ÐÓàãרâì ØÓàã:" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "·ÐÓàãרâì" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." @@ -343,7 +352,7 @@ msgstr "" "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ×ÐßãáâØâì ÔÕâÕÚâÞà ÒáÕå ØÓà? ÍâÞ ßÞâÕÝæØÐÛìÝÞ ÜÞÖÕâ " "ÔÞÑÐÒØâì ÑÞÛìèÞÕ ÚÞÛØçÕáâÒÞ ØÓà." -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -351,7 +360,7 @@ msgstr "" msgid "Yes" msgstr "´Ð" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -359,35 +368,35 @@ msgstr " msgid "No" msgstr "½Õâ" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "ScummVM ÝÕ ÜÞÖÕâ ÞâÚàëâì ãÚÐ×ÐÝÝãî ÔØàÕÚâÞàØî!" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "ScummVM ÝÕ ÜÞÖÕâ ÝÐÙâØ ØÓàã Ò ãÚÐ×ÐÝÝÞÙ ÔØàÕÚâÞàØØ!" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "²ëÑÕàØâÕ ØÓàã:" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "²ë ÔÕÙáâÒØâÕÛìÝÞ åÞâØâÕ ãÔÐÛØâì ãáâÐÝÞÒÚØ ÔÛï íâÞÙ ØÓàë?" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "ÍâÐ ØÓàÐ ÝÕ ßÞÔÔÕàÖØÒÐÕâ ×ÐÓàã×Úã áÞåàÐÝÕÝØÙ çÕàÕ× ÓÛÐÒÝÞÕ ÜÕÝî." -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "ScummVM ÝÕ áÜÞÓ ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚÐ ÒëÑàÐÝÝÞÙ ØÓàë!" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "´ÞÑ. ÜÝÞÓÞ..." -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "½ÞÒ. ØÓàÐ..." @@ -454,79 +463,60 @@ msgstr "44 Ú³ msgid "48 kHz" msgstr "48 Ú³æ" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "³àÐäØçÕáÚØÙ àÕÖØÜ:" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "ÀÕÖØÜ àÐáâàØàÞÒÐÝØï:" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "ÁßÕæØÐÛìÝëÕ àÕÖØÜë àÕÝÔÕàØÝÓÐ, ßÞÔÔÕàÖØÒÐÕÜëÕ ÝÕÚÞâÞàëÜØ ØÓàÐÜØ" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "¿ÞÛÝÞíÚàÐÝÝëÙ àÕÖØÜ" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "ºÞààÕÚæØï áÞÞâÝÞèÕÝØï áâÞàÞÝ" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "ºÞààÕÚâØàÞÒÐâì áÞÞâÝÞèÕÝØÕ áâÞàÞÝ ÔÛï ØÓà á àÐ×àÕèÕÝØÕÜ 320x200" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "¿àÕÔßÞçØâÐÕÜÞÕ ãáâàÞÙáâÒÞ:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 #, fuzzy msgid "Music Device:" msgstr "ÃáâàÞÙâáÒÞ GM:" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ØÛØ íÜãÛïâÞà ×ÒãÚÞÒÞÙ ÚÐàâë" -#: gui/options.cpp:648 -#, fuzzy -msgid "MT-32 Device:" -msgstr "ÃáâàÞÙáâÒÞ MT32:" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" -"ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" -"CM32l/CM64" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "ÃáâàÞÙâáÒÞ GM:" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "ÍÜãÛïâÞà AdLib:" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "·ÒãÚÞÒÐï ÚÐàâÐ AdLib ØáßÞÛì×ãÕâáï ÜÝÞÓØÜØ ØÓàÐÜØ" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "²ëåÞÔÝÐï çÐáâÞâÐ:" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" @@ -534,29 +524,52 @@ msgstr "" "±¾ÛìèØÕ ×ÝÐçÕÝØï ×ÐÔÐîâ ÛãçèÕÕ ÚÐçÕáâÒÞ ×ÒãÚÐ, ÞÔÝÐÚÞ ÞÝØ ÜÞÓãâ ÝÕ " "ßÞÔÔÕàÖØÒÐâìáï ÒÐèÕÙ ×ÒãÚÞÒÞÙ ÚÐàâÞÙ" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "ÃáâàÞÙâáÒÞ GM:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "ÃÚÐ×ëÒÐÕâ ÒëåÞÔÝÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ÔÛï MIDI" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "SoundFont:" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" "SoundFontë ßÞÔÔÕàÔÖØÒÐîâáï ÝÕÚÞâÞàëÜØ ×ÒãÚÞÒëÜØ ÚÐàâÐÜØ, Fluidsynth Ø " "Timidity" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "ÁÜÕèÐÝÝëÙ àÕÖØÜ AdLib/MIDI" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "¸áßÞÛì×ÞÒÐâì Ø MIDI Ø AdLib ÔÛï ÓÕÝÕàÐæØØ ×ÒãÚÐ" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "ÃáØÛÕÝØÕ MIDI:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "ÃáâàÞÙáâÒÞ MT32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" +"ÃÚÐ×ëÒÐÕâ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ ßÞ ãÜÞÛçÐÝØï ÔÛï ÒëÒÞÔÐ ÝÐ Roland MT-32/LAPC1/" +"CM32l/CM64" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "½ÐáâÞïéØÙ Roland MT-32 (×ÐßàÕâØâì íÜãÛïæØî GM)" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" @@ -564,142 +577,138 @@ msgstr "" "¾âÜÕâìâÕ, ÕáÛØ ã ÒÐá ßÞÔÚÛîçÕÝÞ Roland-áÞÒÜÕáâØÜÞÕ ×ÒãÚÞÒÞÕ ãáâàÞÙáâÒÞ Ø Òë " "åÞâØâÕ ÕÓÞ ØáßÞÛì×ÞÒÐâì" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "²ÚÛîçØâì àÕÖØÜ Roland GS" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" "²ëÚÛîçÐÕâ ÜÐßߨÝÓ General MIDI ÔÛï ØÓà á ×ÒãÚÞÒÞÙ ÔÞàÞÖÚÞÙ ÔÛï Roland MT-32" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "ÃáØÛÕÝØÕ MIDI:" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "ÂÕÚáâ Ø Þ×ÒãçÚÐ:" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 msgid "Speech" msgstr "¾×ÒãçÚÐ" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 msgid "Subtitles" msgstr "ÁãÑâØâàë" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "²áñ" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "¾×Ò" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "ÁãÑ" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "¿ÞÚÐ×ëÒÐâì áãÑâØâàë Ø ÒÞáßàÞØ×ÒÞÔØâì àÕçì" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "ÁÚÞàÞáâì áãÑâØâàÞÒ:" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "³àÞÜÚÞáâì Üã×ëÚØ:" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "²ëÚÛîçØâì Òáñ" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "³àÞÜÚÞáâì íääÕÚâÞÒ:" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "³àÞÜÚÞáâì áßÕæØÐÛìÝëå ×ÒãÚÞÒëå íääÕÚâÞÒ" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "³àÞÜÚÞáâì Þ×ÒãçÚØ:" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "¿ãâì ÔÛï áÞåàÐÝÕÝØÙ: " -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "¿ãâì Ú âÕÜÐÜ:" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" "ÃÚÐ×ëÒÐÕâ ßãâì Ú ÔÞßÞÛÝØâÕÛìÝëÜ äÐÙÛÐÜ ÔÐÝÝëå, ØáßÞÛì×ãÕÜëå ÒáÕÜØ ØÓàÐÜØ, " "ÛØÑÞ ScummVM" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "¿ãâì Ú ßÛÐÓØÝÐÜ:" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "ÀÐ×ÝÞÕ" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "ÂÕÜÐ:" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "°ÒâÞáÞåàÐÝÕÝØÕ:" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "ºÛÐÒØèØ" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "Ï×ëÚ ØÝâÕàäÕÙáÐ:" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "Ï×ëÚ ÓàÐäØçÕáÚÞÓÞ ØÝâÕàäÕÙáÐ ScummVM" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "English" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "²ë ÔÞÛÖÝë ßÕàÕ×ÐßãáâØâì ScummVM çâÞÑë ßàØÜÕÝØâì Ø×ÜÕÝÕÝØï." -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï áÞåàÐÝÕÝØÙ" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "½Õ ÜÞÓã ߨáÐâì Ò ÒëÑàÐÝÝãî ÔØàÕÚâÞàØî. ¿ÞÖÐÛãÙáâÐ, ãÚÐÖØâÕ ÔàãÓãî." -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî ÔÛï âÕÜ GUI" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ÔÞßÞÛÝØâÕÛìÝëÜØ äÐÙÛÐÜØ" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "²ëÑÕàØâÕ ÔØàÕÚâÞàØî á ßÛÐÓØÝÐÜØ" @@ -743,15 +752,15 @@ msgstr " msgid "Select a Theme" msgstr "²ëÑÕàØâÕ âÕÜã" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "±Õ× ÓàÐäØÚØ" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "ÁâÐÝÔÐàâÝëÙ àÐáâÕàØ×ÐâÞà (16bpp)" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "ÀÐáâÕàØ×ÐâÞà áÞ áÓÛÐÖØÒÐÝØÕÜ (16bpp)" diff --git a/po/scummvm.pot b/po/scummvm.pot index 6fe4989982..38ce9b1a48 100644 --- a/po/scummvm.pot +++ b/po/scummvm.pot @@ -8,11 +8,10 @@ msgid "" msgstr "" "Project-Id-Version: ScummVM 1.2.0svn\n" "Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" -"POT-Creation-Date: 2010-07-12 17:44+0200\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,7 +38,7 @@ msgid "Go to previous directory level" msgstr "" #: gui/browser.cpp:70 gui/chooser.cpp:49 gui/KeysDialog.cpp:46 -#: gui/launcher.cpp:266 gui/massadd.cpp:95 gui/options.cpp:972 +#: gui/launcher.cpp:280 gui/massadd.cpp:95 gui/options.cpp:1029 #: gui/saveload.cpp:65 gui/saveload.cpp:157 gui/themebrowser.cpp:56 #: backends/platform/wii/options.cpp:48 msgid "Cancel" @@ -49,19 +48,19 @@ msgstr "" msgid "Choose" msgstr "" -#: gui/GuiManager.cpp:102 backends/keymapper/remap-dialog.cpp:54 +#: gui/GuiManager.cpp:103 backends/keymapper/remap-dialog.cpp:54 msgid "Close" msgstr "" -#: gui/GuiManager.cpp:105 +#: gui/GuiManager.cpp:106 msgid "Mouse click" msgstr "" -#: gui/GuiManager.cpp:108 base/main.cpp:285 +#: gui/GuiManager.cpp:109 base/main.cpp:285 msgid "Display keyboard" msgstr "" -#: gui/GuiManager.cpp:111 base/main.cpp:288 +#: gui/GuiManager.cpp:112 base/main.cpp:288 msgid "Remap keys" msgstr "" @@ -69,8 +68,8 @@ msgstr "" msgid "Map" msgstr "" -#: gui/KeysDialog.cpp:45 gui/launcher.cpp:267 gui/launcher.cpp:873 -#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:973 +#: gui/KeysDialog.cpp:45 gui/launcher.cpp:281 gui/launcher.cpp:893 +#: gui/launcher.cpp:897 gui/massadd.cpp:92 gui/options.cpp:1030 #: backends/platform/wii/options.cpp:47 #: backends/platform/wince/CELauncherDialog.cpp:56 msgid "OK" @@ -102,241 +101,249 @@ msgstr "" msgid "Choose an action to map" msgstr "" -#: gui/launcher.cpp:170 +#: gui/launcher.cpp:172 msgid "Game" msgstr "" -#: gui/launcher.cpp:173 +#: gui/launcher.cpp:175 msgid "ID:" msgstr "" -#: gui/launcher.cpp:173 gui/launcher.cpp:174 +#: gui/launcher.cpp:175 gui/launcher.cpp:176 msgid "" "Short game identifier used for referring to savegames and running the game " "from the command line" msgstr "" -#: gui/launcher.cpp:177 +#: gui/launcher.cpp:179 msgid "Name:" msgstr "" -#: gui/launcher.cpp:177 gui/launcher.cpp:178 +#: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" msgstr "" -#: gui/launcher.cpp:181 +#: gui/launcher.cpp:183 msgid "Language:" msgstr "" -#: gui/launcher.cpp:181 gui/launcher.cpp:182 +#: gui/launcher.cpp:183 gui/launcher.cpp:184 msgid "" "Language of the game. This will not turn your Spanish game version into " "English" msgstr "" -#: gui/launcher.cpp:183 gui/launcher.cpp:194 gui/options.cpp:80 -#: gui/options.cpp:617 gui/options.cpp:627 gui/options.cpp:943 +#: gui/launcher.cpp:185 gui/launcher.cpp:196 gui/options.cpp:80 +#: gui/options.cpp:635 gui/options.cpp:645 gui/options.cpp:1000 #: sound/null.cpp:42 msgid "" msgstr "" -#: gui/launcher.cpp:192 +#: gui/launcher.cpp:194 msgid "Platform:" msgstr "" -#: gui/launcher.cpp:192 gui/launcher.cpp:193 +#: gui/launcher.cpp:194 gui/launcher.cpp:195 msgid "Platform the game was originally designed for" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "Graphics" msgstr "" -#: gui/launcher.cpp:204 gui/options.cpp:850 gui/options.cpp:867 +#: gui/launcher.cpp:206 gui/options.cpp:898 gui/options.cpp:915 msgid "GFX" msgstr "" -#: gui/launcher.cpp:206 +#: gui/launcher.cpp:208 msgid "Override global graphic settings" msgstr "" -#: gui/launcher.cpp:213 gui/options.cpp:873 +#: gui/launcher.cpp:215 gui/options.cpp:921 msgid "Audio" msgstr "" -#: gui/launcher.cpp:215 +#: gui/launcher.cpp:217 msgid "Override global audio settings" msgstr "" -#: gui/launcher.cpp:223 gui/options.cpp:877 +#: gui/launcher.cpp:225 gui/options.cpp:925 msgid "Volume" msgstr "" -#: gui/launcher.cpp:225 +#: gui/launcher.cpp:227 msgid "Override global volume settings" msgstr "" -#: gui/launcher.cpp:232 gui/options.cpp:885 +#: gui/launcher.cpp:234 gui/options.cpp:933 msgid "MIDI" msgstr "" -#: gui/launcher.cpp:234 +#: gui/launcher.cpp:236 msgid "Override global MIDI settings" msgstr "" -#: gui/launcher.cpp:244 gui/options.cpp:891 +#: gui/launcher.cpp:246 gui/options.cpp:939 +msgid "MT-32" +msgstr "" + +#: gui/launcher.cpp:248 +msgid "Override global MT-32 settings" +msgstr "" + +#: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" msgstr "" -#: gui/launcher.cpp:250 +#: gui/launcher.cpp:264 msgid "Game Path:" msgstr "" -#: gui/launcher.cpp:254 gui/options.cpp:904 +#: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" msgstr "" -#: gui/launcher.cpp:254 gui/launcher.cpp:255 +#: gui/launcher.cpp:268 gui/launcher.cpp:269 msgid "Specifies path to additional data used the game" msgstr "" -#: gui/launcher.cpp:258 +#: gui/launcher.cpp:272 msgid "Save Path:" msgstr "" -#: gui/launcher.cpp:258 gui/launcher.cpp:259 gui/options.cpp:898 -#: gui/options.cpp:899 +#: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 +#: gui/options.cpp:953 msgid "Specifies where your savegames are put" msgstr "" -#: gui/launcher.cpp:275 gui/launcher.cpp:353 gui/launcher.cpp:398 -#: gui/options.cpp:245 gui/options.cpp:400 gui/options.cpp:486 -#: gui/options.cpp:545 gui/options.cpp:706 gui/options.cpp:902 -#: gui/options.cpp:905 gui/options.cpp:909 gui/options.cpp:996 -#: gui/options.cpp:1002 gui/options.cpp:1008 gui/options.cpp:1016 -#: gui/options.cpp:1040 gui/options.cpp:1044 gui/options.cpp:1050 -#: gui/options.cpp:1057 gui/options.cpp:1156 +#: gui/launcher.cpp:289 gui/launcher.cpp:369 gui/launcher.cpp:418 +#: gui/options.cpp:230 gui/options.cpp:399 gui/options.cpp:497 +#: gui/options.cpp:555 gui/options.cpp:732 gui/options.cpp:956 +#: gui/options.cpp:959 gui/options.cpp:963 gui/options.cpp:1053 +#: gui/options.cpp:1059 gui/options.cpp:1065 gui/options.cpp:1073 +#: gui/options.cpp:1097 gui/options.cpp:1101 gui/options.cpp:1107 +#: gui/options.cpp:1114 gui/options.cpp:1213 msgid "None" msgstr "" -#: gui/launcher.cpp:280 gui/launcher.cpp:357 +#: gui/launcher.cpp:294 gui/launcher.cpp:373 #: backends/platform/wii/options.cpp:56 msgid "Default" msgstr "" -#: gui/launcher.cpp:391 gui/options.cpp:1150 +#: gui/launcher.cpp:411 gui/options.cpp:1207 msgid "Select SoundFont" msgstr "" -#: gui/launcher.cpp:410 gui/launcher.cpp:548 +#: gui/launcher.cpp:430 gui/launcher.cpp:568 msgid "Select directory with game data" msgstr "" -#: gui/launcher.cpp:428 +#: gui/launcher.cpp:448 msgid "Select additional game directory" msgstr "" -#: gui/launcher.cpp:440 +#: gui/launcher.cpp:460 msgid "Select directory for saved games" msgstr "" -#: gui/launcher.cpp:459 +#: gui/launcher.cpp:479 msgid "This game ID is already taken. Please choose another one." msgstr "" -#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +#: gui/launcher.cpp:520 engines/dialogs.cpp:113 msgid "~Q~uit" msgstr "" -#: gui/launcher.cpp:500 +#: gui/launcher.cpp:520 msgid "Quit ScummVM" msgstr "" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "A~b~out..." msgstr "" -#: gui/launcher.cpp:501 +#: gui/launcher.cpp:521 msgid "About ScummVM" msgstr "" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "~O~ptions..." msgstr "" -#: gui/launcher.cpp:502 +#: gui/launcher.cpp:522 msgid "Change global ScummVM options" msgstr "" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "~S~tart" msgstr "" -#: gui/launcher.cpp:504 +#: gui/launcher.cpp:524 msgid "Start selected game" msgstr "" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "~L~oad..." msgstr "" -#: gui/launcher.cpp:507 +#: gui/launcher.cpp:527 msgid "Load savegame for selected game" msgstr "" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "~A~dd Game..." msgstr "" -#: gui/launcher.cpp:511 +#: gui/launcher.cpp:531 msgid "Hold Shift for Mass Add" msgstr "" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "~E~dit Game..." msgstr "" -#: gui/launcher.cpp:513 +#: gui/launcher.cpp:533 msgid "Change game options" msgstr "" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "~R~emove Game" msgstr "" -#: gui/launcher.cpp:515 +#: gui/launcher.cpp:535 msgid "Remove game from the list. The game data files stay intact" msgstr "" -#: gui/launcher.cpp:522 +#: gui/launcher.cpp:542 msgid "Search in game list" msgstr "" -#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +#: gui/launcher.cpp:546 gui/launcher.cpp:1057 msgid "Search:" msgstr "" -#: gui/launcher.cpp:529 gui/options.cpp:707 +#: gui/launcher.cpp:549 gui/options.cpp:733 msgid "Clear value" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 msgid "Load game:" msgstr "" -#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +#: gui/launcher.cpp:571 engines/dialogs.cpp:117 #: backends/platform/wince/CEActionsPocket.cpp:263 #: backends/platform/wince/CEActionsSmartphone.cpp:225 msgid "Load" msgstr "" -#: gui/launcher.cpp:660 +#: gui/launcher.cpp:680 msgid "" "Do you really want to run the mass game detector? This could potentially add " "a huge number of games." msgstr "" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -344,7 +351,7 @@ msgstr "" msgid "Yes" msgstr "" -#: gui/launcher.cpp:661 gui/launcher.cpp:810 +#: gui/launcher.cpp:681 gui/launcher.cpp:830 #: backends/platform/symbian/src/SymbianOS.cpp:446 #: backends/platform/wince/CEActionsPocket.cpp:313 #: backends/platform/wince/CEActionsSmartphone.cpp:272 @@ -352,35 +359,35 @@ msgstr "" msgid "No" msgstr "" -#: gui/launcher.cpp:708 +#: gui/launcher.cpp:728 msgid "ScummVM couldn't open the specified directory!" msgstr "" -#: gui/launcher.cpp:720 +#: gui/launcher.cpp:740 msgid "ScummVM could not find any game in the specified directory!" msgstr "" -#: gui/launcher.cpp:734 +#: gui/launcher.cpp:754 msgid "Pick the game:" msgstr "" -#: gui/launcher.cpp:810 +#: gui/launcher.cpp:830 msgid "Do you really want to remove this game configuration?" msgstr "" -#: gui/launcher.cpp:873 +#: gui/launcher.cpp:893 msgid "This game does not support loading games from the launcher." msgstr "" -#: gui/launcher.cpp:877 +#: gui/launcher.cpp:897 msgid "ScummVM could not find any engine capable of running the selected game!" msgstr "" -#: gui/launcher.cpp:989 +#: gui/launcher.cpp:1009 msgid "Mass Add..." msgstr "" -#: gui/launcher.cpp:990 +#: gui/launcher.cpp:1010 msgid "Add Game..." msgstr "" @@ -447,239 +454,239 @@ msgstr "" msgid "48 kHz" msgstr "" -#: gui/options.cpp:614 +#: gui/options.cpp:632 msgid "Graphics mode:" msgstr "" -#: gui/options.cpp:625 +#: gui/options.cpp:643 msgid "Render mode:" msgstr "" -#: gui/options.cpp:625 gui/options.cpp:626 +#: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" msgstr "" -#: gui/options.cpp:635 +#: gui/options.cpp:653 msgid "Fullscreen mode" msgstr "" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Aspect ratio correction" msgstr "" -#: gui/options.cpp:638 +#: gui/options.cpp:656 msgid "Correct aspect ratio for 320x200 games" msgstr "" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Preferred Device:" msgstr "" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Music Device:" msgstr "" -#: gui/options.cpp:645 +#: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" msgstr "" -#: gui/options.cpp:645 gui/options.cpp:646 +#: gui/options.cpp:663 gui/options.cpp:664 msgid "Specifies output sound device or sound card emulator" msgstr "" -#: gui/options.cpp:648 -msgid "MT-32 Device:" -msgstr "" - -#: gui/options.cpp:648 -msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" -msgstr "" - -#: gui/options.cpp:650 -msgid "GM Device:" -msgstr "" - -#: gui/options.cpp:650 -msgid "Specifies default sound device for General MIDI output" -msgstr "" - -#: gui/options.cpp:682 +#: gui/options.cpp:688 msgid "AdLib emulator:" msgstr "" -#: gui/options.cpp:682 gui/options.cpp:683 +#: gui/options.cpp:688 gui/options.cpp:689 msgid "AdLib is used for music in many games" msgstr "" -#: gui/options.cpp:693 +#: gui/options.cpp:699 msgid "Output rate:" msgstr "" -#: gui/options.cpp:693 gui/options.cpp:694 +#: gui/options.cpp:699 gui/options.cpp:700 msgid "" "Higher value specifies better sound quality but may be not supported by your " "soundcard" msgstr "" -#: gui/options.cpp:705 +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "" + +#: gui/options.cpp:731 msgid "SoundFont:" msgstr "" -#: gui/options.cpp:705 gui/options.cpp:706 +#: gui/options.cpp:731 gui/options.cpp:732 msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Mixed AdLib/MIDI mode" msgstr "" -#: gui/options.cpp:710 +#: gui/options.cpp:736 msgid "Use both MIDI and AdLib sound generation" msgstr "" -#: gui/options.cpp:713 +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "" + +#: gui/options.cpp:749 +msgid "MT-32 Device:" +msgstr "" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "" + +#: gui/options.cpp:753 msgid "True Roland MT-32 (disable GM emulation)" msgstr "" -#: gui/options.cpp:713 +#: gui/options.cpp:753 msgid "" "Check if you want to use your real hardware Roland-compatible sound device " "connected to your computer" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Enable Roland GS Mode" msgstr "" -#: gui/options.cpp:716 +#: gui/options.cpp:756 msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" msgstr "" -#: gui/options.cpp:719 -msgid "MIDI gain:" -msgstr "" - -#: gui/options.cpp:732 +#: gui/options.cpp:780 msgid "Text and Speech:" msgstr "" -#: gui/options.cpp:737 gui/options.cpp:743 +#: gui/options.cpp:785 gui/options.cpp:791 msgid "Speech" msgstr "" -#: gui/options.cpp:738 gui/options.cpp:744 +#: gui/options.cpp:786 gui/options.cpp:792 msgid "Subtitles" msgstr "" -#: gui/options.cpp:739 gui/options.cpp:745 +#: gui/options.cpp:787 gui/options.cpp:793 msgid "Both" msgstr "" -#: gui/options.cpp:743 +#: gui/options.cpp:791 msgid "Spch" msgstr "" -#: gui/options.cpp:744 +#: gui/options.cpp:792 msgid "Subs" msgstr "" -#: gui/options.cpp:745 +#: gui/options.cpp:793 msgid "Show subtitles and play speech" msgstr "" -#: gui/options.cpp:749 +#: gui/options.cpp:797 msgid "Subtitle speed:" msgstr "" -#: gui/options.cpp:761 +#: gui/options.cpp:809 msgid "Music volume:" msgstr "" -#: gui/options.cpp:768 +#: gui/options.cpp:816 msgid "Mute All" msgstr "" -#: gui/options.cpp:771 +#: gui/options.cpp:819 msgid "SFX volume:" msgstr "" -#: gui/options.cpp:771 gui/options.cpp:772 +#: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" msgstr "" -#: gui/options.cpp:778 +#: gui/options.cpp:826 msgid "Speech volume:" msgstr "" -#: gui/options.cpp:898 +#: gui/options.cpp:952 msgid "Save Path: " msgstr "" -#: gui/options.cpp:901 +#: gui/options.cpp:955 msgid "Theme Path:" msgstr "" -#: gui/options.cpp:904 gui/options.cpp:905 +#: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" msgstr "" -#: gui/options.cpp:908 +#: gui/options.cpp:962 msgid "Plugins Path:" msgstr "" -#: gui/options.cpp:913 +#: gui/options.cpp:970 msgid "Misc" msgstr "" -#: gui/options.cpp:915 +#: gui/options.cpp:972 msgid "Theme:" msgstr "" -#: gui/options.cpp:919 +#: gui/options.cpp:976 msgid "GUI Renderer:" msgstr "" -#: gui/options.cpp:925 +#: gui/options.cpp:982 msgid "Autosave:" msgstr "" -#: gui/options.cpp:933 +#: gui/options.cpp:990 msgid "Keys" msgstr "" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "GUI Language:" msgstr "" -#: gui/options.cpp:940 +#: gui/options.cpp:997 msgid "Language of ScummVM GUI" msgstr "" -#: gui/options.cpp:945 +#: gui/options.cpp:1002 msgid "English" msgstr "" -#: gui/options.cpp:1089 +#: gui/options.cpp:1146 msgid "You have to restart ScummVM to take the effect." msgstr "" -#: gui/options.cpp:1102 +#: gui/options.cpp:1159 msgid "Select directory for savegames" msgstr "" -#: gui/options.cpp:1109 +#: gui/options.cpp:1166 msgid "The chosen directory cannot be written to. Please select another one." msgstr "" -#: gui/options.cpp:1118 +#: gui/options.cpp:1175 msgid "Select directory for GUI themes" msgstr "" -#: gui/options.cpp:1128 +#: gui/options.cpp:1185 msgid "Select directory for extra files" msgstr "" -#: gui/options.cpp:1139 +#: gui/options.cpp:1196 msgid "Select directory for plugins" msgstr "" @@ -723,15 +730,15 @@ msgstr "" msgid "Select a Theme" msgstr "" -#: gui/ThemeEngine.cpp:337 +#: gui/ThemeEngine.cpp:334 msgid "Disabled GFX" msgstr "" -#: gui/ThemeEngine.cpp:338 +#: gui/ThemeEngine.cpp:335 msgid "Standard Renderer (16bpp)" msgstr "" -#: gui/ThemeEngine.cpp:340 +#: gui/ThemeEngine.cpp:337 msgid "Antialiased Renderer (16bpp)" msgstr "" diff --git a/tools/po2c b/tools/po2c index 9dbc5e0fb7..10e15338c7 100755 --- a/tools/po2c +++ b/tools/po2c @@ -161,19 +161,29 @@ foreach my $l (keys(%msgs)) print "struct PoLangEntry {\n"; print "\tconst char *lang;\n"; print "\tconst char *charset;\n"; +print "\tconst char *langname;\n"; print "\tconst PoMessageEntry *msgs;\n"; print "};\n\n"; print "const PoLangEntry _translations[] = {\n"; foreach my $l (keys(%msgs)) { + # charset $header = $msgs{$l}->{""}; $header =~ /charset=([^\\]+)/; $charset = $1; - print "\t{ \"" . $l . "\", \"" . $charset . "\", _translation_${l} },\n"; + # user readable language name + $lang = "NULL"; + $header = $msgs{$l}->{""}; + $header =~ /Language:[\s]*([^\\]*)/; + unless ($1 eq "") + { + $lang = "\"" . $1 . "\""; + } + print "\t{ \"" . $l . "\", \"" . $charset . "\", " . $lang . ", _translation_${l} },\n"; } -print "\t{ NULL, NULL, NULL }\n};\n\n"; +print "\t{ NULL, NULL, NULL, NULL }\n};\n\n"; print "// code\n"; print << 'EOF'; @@ -255,6 +265,13 @@ const char *po2c_getlang(const int num) { assert(num < ARRAYSIZE(_translations)); return _translations[num].lang; } + +const char *po2c_getlangname(const int num) { + assert(num < ARRAYSIZE(_translations)); + if (_translations[num].langname != NULL) + return _translations[num].langname; + return _translations[num].lang; +} EOF exit 0; -- cgit v1.2.3 From e932270c0b1b5e6ba93011e5542591a5c5d94148 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 31 Jul 2010 16:20:16 +0000 Subject: SCI: Add uninit'd temp workaround for Grotesteing (fan game) svn-id: r51543 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a752c72981..25cf02b3c2 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -59,6 +59,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms + { GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From 3e29e9ffaeab91b1ddf8e02b90bb65a087f89979 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 16:41:42 +0000 Subject: SCI: adding detection for benchmark views and enable speed throttler when just one regular cel was drawn, fixes eco quest 2 ego getting light-speed fast in village (bug #3036805) =this could cause regressions like disabled animations in games= svn-id: r51544 --- engines/sci/graphics/animate.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 537505a926..521009eff6 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -618,14 +618,42 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t updateScreen(old_picNotValid); restoreAndDelete(argc, argv); - if (_lastCastData.size() > 1) - _s->_throttleTrigger = true; - // We update the screen here as well, some scenes like EQ1 credits run w/o calling kGetEvent thus we wouldn't update // screen at all g_sci->getEventManager()->updateScreen(); _ports->setPort(oldPort); + + // Now trigger speed throttler + switch (_lastCastData.size()) { + case 0: + // No entries drawn -> no speed throttler triggering + break; + case 1: { + // One entry drawn -> check if that entry was a speed benchmark view, if not enable speed throttler + AnimateEntry *onlyCast = &_lastCastData[0]; + // first loop and first cel used? + if ((onlyCast->loopNo == 0) && (onlyCast->celNo == 0)) { + // and that cel has a known speed benchmark resolution + int16 onlyHeight = onlyCast->celRect.height(); + int16 onlyWidth = onlyCast->celRect.width(); + if (((onlyWidth == 12) && (onlyHeight == 35)) || // regular benchmark view ("fred", "Speedy", "ego") + ((onlyWidth == 29) && (onlyHeight == 45)) || // King's Quest 5 french "fred" + ((onlyWidth == 1) && (onlyHeight == 1))) { // Laura Bow 2 Talkie + // check further that there is only one cel in that view + GfxView *onlyView = _cache->getView(onlyCast->viewId); + if ((onlyView->getLoopCount() == 1) && (onlyView->getCelCount(0))) + return; + } + } + _s->_throttleTrigger = true; + break; + } + default: + // More than 1 entry drawn -> time for speed throttling + _s->_throttleTrigger = true; + break; + } } void GfxAnimate::addToPicSetPicNotValid() { -- cgit v1.2.3 From 142fb8a1f122f7dbeedc9df1e9de770c325d08ca Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 31 Jul 2010 19:18:35 +0000 Subject: SCI: Don't include the time running the debugger in the game running time svn-id: r51548 --- engines/sci/console.cpp | 6 +++++- engines/sci/console.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 20acbed450..7407f08482 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -67,7 +67,7 @@ bool g_debug_track_mouse_clicks = false; static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeValue); Console::Console(SciEngine *engine) : GUI::Debugger(), - _engine(engine), _debugState(engine->_debugState) { + _engine(engine), _debugState(engine->_debugState), _enterTime(0) { // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); @@ -214,6 +214,7 @@ Console::~Console() { void Console::preEnter() { if (g_sci && g_sci->_soundCmd) g_sci->_soundCmd->pauseAll(true); + _enterTime = g_system->getMillis(); } void Console::postEnter() { @@ -272,6 +273,9 @@ void Console::postEnter() { _videoFile.clear(); _videoFrameDelay = 0; } + + // Subtract the time we were running the debugger from the game running time + _engine->_gamestate->gameStartTime += g_system->getMillis() - _enterTime; } bool Console::cmdHelp(int argc, const char **argv) { diff --git a/engines/sci/console.h b/engines/sci/console.h index 234272bbab..091a5d15f8 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -163,6 +163,7 @@ private: bool _mouseVisible; Common::String _videoFile; int _videoFrameDelay; + uint32 _enterTime; }; } // End of namespace Sci -- cgit v1.2.3 From 4afbfbf355d70df9ba7e2a33fd77685cf3e5399c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 19:35:53 +0000 Subject: SCI: fixing CR/LF, adding info about polish lsl1 svn-id: r51550 --- engines/sci/detection_tables.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 2db046a5e8..2144ee203b 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1405,10 +1405,10 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release) - // SCI interpreter version 1.000.577, VERSION file reports "2.1" + // SCI interpreter version 1.000.577, VERSION file reports "2.1" (this release does NOT include english text) {"lsl1sci", "VGA Remake", { {"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228}, - {"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210}, + {"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210}, {NULL, 0, NULL, 0}}, Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH }, -- cgit v1.2.3 From 450b82355d05f52bb900bcd4656ea850442b5140 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 31 Jul 2010 22:42:42 +0000 Subject: DS: Fix custom DS build system svn-id: r51555 --- backends/platform/ds/arm9/makefile | 4 ++-- backends/platform/ds/arm9/source/portdefs.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index fac50178b4..78638bdab8 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -297,14 +297,14 @@ ifdef USE_PROFILER endif -DATA_OBJS := +DATA_OBJS := \ $(portdir)/data/icons.o \ $(portdir)/data/keyboard.o \ $(portdir)/data/keyboard_pal.o \ $(portdir)/data/default_font.o \ $(portdir)/data/8x8font_tga.o -FAT_OBJS := +FAT_OBJS := \ $(portdir)/source/fat/disc_io.o \ $(portdir)/source/fat/gba_nds_fat.o \ $(portdir)/source/fat/io_fcsr.o \ diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index bdb42993d1..c08f994e8e 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -26,6 +26,9 @@ #ifndef _PORTDEFS_H_ #define _PORTDEFS_H_ +// Include ndstypes.h for uint16 etc. typedefs +#include "nds/ndstypes.h" + // Somebody removed these from scummsys.h, but they're still required, so I'm // adding them here in the hope that they'll stay. #include -- cgit v1.2.3 From 4b9df2203f065293ac4067f76fd58afe87d4e3c8 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 31 Jul 2010 22:43:09 +0000 Subject: DS: Add shell script which emulates old DS builds using configure&make svn-id: r51556 --- backends/platform/ds/setup-builddirs.sh | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 backends/platform/ds/setup-builddirs.sh diff --git a/backends/platform/ds/setup-builddirs.sh b/backends/platform/ds/setup-builddirs.sh new file mode 100755 index 0000000000..9d9cf3ffb6 --- /dev/null +++ b/backends/platform/ds/setup-builddirs.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +# TODO: Allow specifying (a list of) build ids (a, b, ...) on the command line. +# TODO: Allow overriding the LOGO variable + +# TODO: Computer srcdir in a better way +srcdir=../../../`dirname $0`/.. + +BASE_PARAM="--host=ds --disable-translation --disable-all-engines" + +for build in a b c d e f g h i k; do + echo "--- Setting up build $build ---" + mkdir -p build-$build && cd build-$build + case $build in + a) + EXTRA_PARAM="--enable-scumm" + ;; + b) + EXTRA_PARAM="--enable-sky --enable-queen" + ;; + c) + EXTRA_PARAM="--enable-agos" + ;; + d) + EXTRA_PARAM="--enable-gob --enable-cine --enable-agi" + ;; + e) + EXTRA_PARAM="--enable-saga --disable-mad" + ;; + f) + EXTRA_PARAM="--enable-kyra --disable-mad" + ;; + g) + EXTRA_PARAM="--enable-lure" + ;; + h) + EXTRA_PARAM="--enable-parallaction" + ;; + i) + EXTRA_PARAM="--enable-made --disable-mad" + ;; + k) + EXTRA_PARAM="--enable-cruise --disable-mad" + ;; + *) + echo "Invalid build $build selected" + exit 1 + ;; + esac + + defname="DS_BUILD_`echo $build | tr '[a-z]' '[A-Z]'`" + CPPFLAGS="$CPPFLAGS -D$defname" + $srcdir/configure $BASE_PARAM $EXTRA_PARAM + cd .. + echo DONE + echo +done -- cgit v1.2.3 From d5e4efa0258ff27b48dd4ce5bb12bc05787098cb Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 31 Jul 2010 22:45:38 +0000 Subject: SCI: fix lofs autodetection makes polish lsl1 work (its game superclass name got translated, so no "Game" object available) - bug #3037194 thx to dam-soft for his patient help svn-id: r51557 --- engines/sci/engine/features.cpp | 35 +++++++++++++++++++++++++---------- engines/sci/engine/features.h | 2 +- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 315c86c56c..ad6d4d728d 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -216,9 +216,9 @@ SciVersion GameFeatures::detectSetCursorType() { return _setCursorType; } -bool GameFeatures::autoDetectLofsType(int methodNum) { +bool GameFeatures::autoDetectLofsType(Common::String gameSuperClassName, int methodNum) { // Look up the script address - reg_t addr = getDetectionAddr("Game", -1, methodNum); + reg_t addr = getDetectionAddr(gameSuperClassName.c_str(), -1, methodNum); if (!addr.segment) return false; @@ -275,20 +275,35 @@ SciVersion GameFeatures::detectLofsType() { return _lofsType; } + // Find the "Game" object, super class of the actual game-object + const reg_t game = g_sci->getGameObject(); + const Object *gameObject = _segMan->getObject(game); + reg_t gameSuperClass = NULL_REG; + if (gameObject) { + gameSuperClass = gameObject->getSuperClassSelector(); + } + // Find a function of the game object which invokes lofsa/lofss - reg_t gameClass = _segMan->findObjectByName("Game"); - const Object *obj = _segMan->getObject(gameClass); bool found = false; + if (!gameSuperClass.isNull()) { + Common::String gameSuperClassName = _segMan->getObjectName(gameSuperClass); + const Object *gameSuperObject = _segMan->getObject(gameSuperClass); - for (uint m = 0; m < obj->getMethodCount(); m++) { - found = autoDetectLofsType(m); - - if (found) - break; + if (gameSuperObject) { + for (uint m = 0; m < gameSuperObject->getMethodCount(); m++) { + found = autoDetectLofsType(gameSuperClassName, m); + if (found) + break; + } + } else { + warning("detectLofsType(): Could not get superclass object"); + } + } else { + warning("detectLofsType(): Could not find superclass of game object"); } if (!found) { - warning("Lofs detection failed, taking an educated guess"); + warning("detectLofsType(): failed, taking an educated guess"); if (getSciVersion() >= SCI_VERSION_1_MIDDLE) _lofsType = SCI_VERSION_1_MIDDLE; diff --git a/engines/sci/engine/features.h b/engines/sci/engine/features.h index 167c207437..755054fb25 100644 --- a/engines/sci/engine/features.h +++ b/engines/sci/engine/features.h @@ -103,7 +103,7 @@ public: private: reg_t getDetectionAddr(const Common::String &objName, Selector slc, int methodNum = -1); - bool autoDetectLofsType(int methodNum); + bool autoDetectLofsType(Common::String gameSuperClassName, int methodNum); bool autoDetectGfxFunctionsType(int methodNum = -1); bool autoDetectSoundType(); bool autoDetectMoveCountType(); -- cgit v1.2.3 From 57ad0408461b5551ae16962940e7f8e57fa43522 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 31 Jul 2010 22:48:49 +0000 Subject: DS: Remove now redundant ds-fs.o from PORT_OBJS svn-id: r51558 --- backends/platform/ds/arm9/makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 78638bdab8..0446f84dad 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -281,7 +281,6 @@ PORT_OBJS := \ $(portdir)/source/blitters_arm.o \ $(portdir)/source/cdaudio.o \ $(portdir)/source/dsmain.o \ - $(portdir)/../../../fs/ds/ds-fs.o \ $(portdir)/source/gbampsave.o \ $(portdir)/source/scummhelp.o \ $(portdir)/source/osystem_ds.o \ -- cgit v1.2.3 From 8851c2016fea54d564d3c5717c35633a3517ef25 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Aug 2010 01:00:30 +0000 Subject: SCI: Fix uninitialized variable warning in g++. Thanks to clone2727 for suggestion to initialize the default new plane priority to 0xFFFF, which means that the plane should be invisible. I added a FIXME there though. So please re check this change. In case that is fine just remove the FIXME, in case some other default value should be chosen, please change the value and also remove the FIXME. svn-id: r51561 --- engines/sci/graphics/frameout.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 06dce6d111..3db0017dfa 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -68,6 +68,9 @@ void GfxFrameout::kernelAddPlane(reg_t object) { newPlane.object = object; newPlane.pictureId = 0xFFFF; + // TODO/FIXME: Check whether we should really default initialize the + // priority to 0xFFFF here. + newPlane.priority = 0xFFFF; newPlane.lastPriority = 0xFFFF; // hidden _planes.push_back(newPlane); @@ -125,6 +128,7 @@ void GfxFrameout::addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 newPicture.pictureId = pictureId; newPicture.picture = new GfxPicture(_resMan, _coordAdjuster, 0, _screen, _palette, pictureId, false); newPicture.startX = startX; + newPicture.pictureCels = 0; _planePictures.push_back(newPicture); } -- cgit v1.2.3 From 2b7e58ae9b38778c15024c38b840b2f4255c8ebf Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 1 Aug 2010 04:22:34 +0000 Subject: SCI: Add another KQ5 VGA floppy entry (bug #3036996) svn-id: r51564 --- engines/sci/detection_tables.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 2144ee203b..21c9ad826c 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -971,6 +971,21 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // King's Quest 5 - English DOS Floppy (supplied by omer_mor in bug report #3036996) + // VERSION file reports "0.000.051" + {"kq5", "", { + {"resource.map", 0, "8b2158083302568b73b16fa3655360fe", 8184}, + {"resource.000", 0, "a591bd4b879fc832b8095c0b3befe9e2", 276398}, + {"resource.001", 0, "c0f48d4a7ebeaa6aa074fc98d77423e9", 1099506}, + {"resource.002", 0, "e0c40d0e85340357d2404f9b5ae1921c", 1061243}, + {"resource.003", 0, "89c00d788d022c13a9b250fa96290ab0", 1110169}, + {"resource.004", 0, "d68f0d8a52ac990aa5641b7087476253", 1153751}, + {"resource.005", 0, "ef4f1166bc37b6cfab70234ea60ddc3d", 1032675}, + {"resource.006", 0, "06cb3f689836086ebe08b1efc0126592", 921113}, + {"resource.007", 0, "252249753c6e850eacceb8af634986d3", 1133608}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // King's Quest 5 EGA (supplied by markcoolio in bug report #2829470) // SCI interpreter version 1.000.060 // VERSION file reports "0.000.055" -- cgit v1.2.3 From b02a326b893318dbf58eb3b383d8b0208ec8e8c2 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 1 Aug 2010 04:40:46 +0000 Subject: SCI: Add another LB2 floppy selector name for an uninit'd workaround (bug #3036291) svn-id: r51565 --- engines/sci/engine/static_selectors.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 47893bbab2..aae6de01f1 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -176,11 +176,12 @@ Common::StringArray Kernel::checkStaticSelectorNames() { names[110] = "init"; } else if (g_sci->getGameId() == GID_LAURABOW2) { - // The floppy of version needs the open selector set to match up with the CD version's - // workaround - bug #3035694 + // The floppy of version needs the open and changeState selectors set to match up with the + // CD version's workarounds - bugs #3035694 and #3036291 if (names.size() < 190) names.resize(190); + names[144] = "changeState"; names[189] = "open"; } -- cgit v1.2.3 From 8f04aff6dccd4abffc707ec11d365362044fcae5 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 1 Aug 2010 07:02:05 +0000 Subject: QUEEN: fix for bug 3036170. File name test supports upper case for transferring from Windows to other systems (e.g. PSP) svn-id: r51566 --- engines/queen/queen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 5cda4e3208..74bb52f574 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -422,7 +422,7 @@ void QueenEngine::makeGameStateName(int slot, char *buf) const { int QueenEngine::getGameStateSlot(const char *filename) const { int i = -1; const char *slot = strrchr(filename, '.'); - if (slot && slot[1] == 's') { + if (slot && (slot[1] == 's' || slot[1] == 'S')) { i = atoi(slot + 2); } return i; -- cgit v1.2.3 From 0db8427f46674f8a835e606aa01eef4b50bf0f22 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sun, 1 Aug 2010 07:15:43 +0000 Subject: iPhone: changed GL_NEAREST to GL_LINEAR in miniaturization filter as per forum post 29/7/10 svn-id: r51567 --- backends/platform/iphone/iphone_video.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/iphone/iphone_video.m b/backends/platform/iphone/iphone_video.m index faa0719b6c..cd8b38acb3 100644 --- a/backends/platform/iphone/iphone_video.m +++ b/backends/platform/iphone/iphone_video.m @@ -276,7 +276,7 @@ uint getSizeNextPOT(uint size) { glGenTextures(1, &_screenTexture); glBindTexture(GL_TEXTURE_2D, _screenTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); if (_textureBuffer) { free(_textureBuffer); -- cgit v1.2.3 From 68f7b9be4c415186e2aebd749f978f31c0661ead Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 09:20:21 +0000 Subject: SCI: reading the actual priority instead of guessing svn-id: r51569 --- engines/sci/graphics/frameout.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 3db0017dfa..b8d50e77ce 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -68,9 +68,7 @@ void GfxFrameout::kernelAddPlane(reg_t object) { newPlane.object = object; newPlane.pictureId = 0xFFFF; - // TODO/FIXME: Check whether we should really default initialize the - // priority to 0xFFFF here. - newPlane.priority = 0xFFFF; + newPlane.priority = readSelectorValue(_segMan, object, SELECTOR(priority)); newPlane.lastPriority = 0xFFFF; // hidden _planes.push_back(newPlane); -- cgit v1.2.3 From 4bb9157d81940fc353faac4fcc1cceb9aa347164 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 10:07:24 +0000 Subject: SCI: adding audio directory searching for patches fixes bug #3037768 svn-id: r51570 --- engines/sci/sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 6138be58cc..13c28e0404 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -118,6 +118,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam SearchMan.addSubDirectoryMatching(gameDataDir, "actors"); // KQ6 hi-res portraits SearchMan.addSubDirectoryMatching(gameDataDir, "aud"); // resource.aud and audio files + SearchMan.addSubDirectoryMatching(gameDataDir, "audio");// resource.aud and audio files SearchMan.addSubDirectoryMatching(gameDataDir, "wav"); // speech files in WAV format SearchMan.addSubDirectoryMatching(gameDataDir, "sfx"); // music/sound files in WAV format SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions -- cgit v1.2.3 From af76912e873df1acb39714d1aa9479bb777591f9 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 10:17:31 +0000 Subject: i18n: Added Cyrillic fonts to theme packages This fixes ScummVM startup on systems with Russian set as locale. svn-id: r51571 --- gui/themes/scummclassic.zip | Bin 58510 -> 74494 bytes gui/themes/scummclassic/clR6x12-iso-8859-5.fcc | Bin 0 -> 6403 bytes gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc | Bin 0 -> 3985 bytes gui/themes/scummclassic/helvb12-iso-8859-5.fcc | Bin 0 -> 5234 bytes gui/themes/scummmodern.zip | Bin 165851 -> 181835 bytes gui/themes/scummmodern/clR6x12-iso-8859-5.fcc | Bin 0 -> 6403 bytes gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc | Bin 0 -> 3985 bytes gui/themes/scummmodern/helvb12-iso-8859-5.fcc | Bin 0 -> 5234 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui/themes/scummclassic/clR6x12-iso-8859-5.fcc create mode 100644 gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc create mode 100644 gui/themes/scummclassic/helvb12-iso-8859-5.fcc create mode 100644 gui/themes/scummmodern/clR6x12-iso-8859-5.fcc create mode 100644 gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc create mode 100644 gui/themes/scummmodern/helvb12-iso-8859-5.fcc diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 299bc41339..8e393a692a 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/clR6x12-iso-8859-5.fcc b/gui/themes/scummclassic/clR6x12-iso-8859-5.fcc new file mode 100644 index 0000000000..d8e614211d Binary files /dev/null and b/gui/themes/scummclassic/clR6x12-iso-8859-5.fcc differ diff --git a/gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc b/gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc new file mode 100644 index 0000000000..e70388dd93 Binary files /dev/null and b/gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc differ diff --git a/gui/themes/scummclassic/helvb12-iso-8859-5.fcc b/gui/themes/scummclassic/helvb12-iso-8859-5.fcc new file mode 100644 index 0000000000..8ad8f0eb22 Binary files /dev/null and b/gui/themes/scummclassic/helvb12-iso-8859-5.fcc differ diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index cd24d781bb..f41a82e0c9 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/clR6x12-iso-8859-5.fcc b/gui/themes/scummmodern/clR6x12-iso-8859-5.fcc new file mode 100644 index 0000000000..d8e614211d Binary files /dev/null and b/gui/themes/scummmodern/clR6x12-iso-8859-5.fcc differ diff --git a/gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc b/gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc new file mode 100644 index 0000000000..e70388dd93 Binary files /dev/null and b/gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc differ diff --git a/gui/themes/scummmodern/helvb12-iso-8859-5.fcc b/gui/themes/scummmodern/helvb12-iso-8859-5.fcc new file mode 100644 index 0000000000..8ad8f0eb22 Binary files /dev/null and b/gui/themes/scummmodern/helvb12-iso-8859-5.fcc differ -- cgit v1.2.3 From 9699f8291d4ec254d165954b5d4751cba93a8fe1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 1 Aug 2010 11:10:14 +0000 Subject: SCI: Ignoring non-critical script bug in QFG1VGA, when closing any conversation dialog with esc (doesn't affect gameplay in any manner) svn-id: r51572 --- engines/sci/engine/kmisc.cpp | 9 +++++++-- engines/sci/engine/seg_manager.cpp | 7 ++++--- engines/sci/engine/seg_manager.h | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 99e02d92f2..5ef4157119 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -236,8 +236,13 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { s->_segMan->allocDynmem(argv[1].toUint16(), "kMemory() non-critical", &s->r_acc); break; case K_MEMORY_FREE : - if (s->_segMan->freeDynmem(argv[1])) { - error("Attempt to kMemory::free() non-dynmem pointer %04x:%04x", PRINT_REG(argv[1])); + if (!s->_segMan->freeDynmem(argv[1])) { + if (g_sci->getGameId() == GID_QFG1VGA) { + // Ignore script bug in QFG1VGA, when closing any conversation dialog with esc + } else { + // Usually, the result of a script bug. Non-critical + warning("Attempt to kMemory::free() non-dynmem pointer %04x:%04x", PRINT_REG(argv[1])); + } } break; case K_MEMORY_MEMCPY : { diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 25cf1d069f..3fac6925a4 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -851,13 +851,14 @@ byte *SegManager::allocDynmem(int size, const char *descr, reg_t *addr) { return (byte *)(d._buf); } -int SegManager::freeDynmem(reg_t addr) { +bool SegManager::freeDynmem(reg_t addr) { + SegmentType foo = _heap[addr.segment]->getType(); if (addr.segment < 1 || addr.segment >= _heap.size() || !_heap[addr.segment] || _heap[addr.segment]->getType() != SEG_TYPE_DYNMEM) - return 1; // error + return false; // error deallocate(addr.segment, true); - return 0; // OK + return true; // OK } #ifdef ENABLE_SCI32 diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index e0808dbb1b..59ac6f39b6 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -274,7 +274,7 @@ public: * Deallocates a piece of dynamic memory * @param[in] addr Offset of the dynmem chunk to free */ - int freeDynmem(reg_t addr); + bool freeDynmem(reg_t addr); // Generic Operations on Segments and Addresses -- cgit v1.2.3 From 03f48560a9ab3d3ff972058dd184fcf60e872454 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 11:10:47 +0000 Subject: SCI: adding workaround for hq1/qfg1 fixes bug #3037659 svn-id: r51573 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 25cf02b3c2..b51ba2dc95 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -105,6 +105,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_MOTHERGOOSE, 18, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // DEMO: Called when walking north from mother goose's house two screens { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above + { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbd0, 0, { WORKAROUND_FAKE, 0 } }, // hq1: going to the brigands hideout + { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) -- cgit v1.2.3 From a0c58778f1c065c1fbe64a15fdc26fd6cef3efb2 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 11:23:04 +0000 Subject: i18n: Update Russian translation svn-id: r51574 --- common/messages.cpp | 59 ++++++++++++++++++++++++++------------------------- po/ru_RU.po | 61 +++++++++++++++++++++++++---------------------------- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/common/messages.cpp b/common/messages.cpp index ba7c5c98a0..e43e5c8ac2 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -326,7 +326,7 @@ struct PoMessageEntry { }; static const PoMessageEntry _translation_ru_RU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-13 20:55+0300\nLast-Translator: Eugene Sandulenko \nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: Russian\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, { 1, " \262\353 \343\322\325\340\325\335\353, \347\342\336 \345\336\342\330\342\325 \322\353\331\342\330? " }, { 2, " (\260\332\342\330\322\335\320\357)" }, { 3, " (\270\323\340\353)" }, @@ -345,7 +345,7 @@ static const PoMessageEntry _translation_ru_RU[] = { { 16, "\315\334\343\333\357\342\336\340 AdLib" }, { 17, "\315\334\343\333\357\342\336\340 AdLib:" }, { 18, "\267\322\343\332\336\322\320\357 \332\320\340\342\320 AdLib \330\341\337\336\333\354\327\343\325\342\341\357 \334\335\336\323\330\334\330 \330\323\340\320\334\330" }, - { 19, "\275\336\322. \330\323\340\320..." }, + { 19, "\275\336\322\320\357 \330\323\340\320..." }, { 20, "\300\320\341\342\325\340\330\327\320\342\336\340 \341\336 \341\323\333\320\326\330\322\320\335\330\325\334 (16bpp)" }, { 21, "\272\336\340\340\325\332\346\330\357 \341\336\336\342\335\336\350\325\335\330\357 \341\342\336\340\336\335" }, { 22, "\275\320\327\335\320\347\325\335\335\320\357 \332\333\320\322\330\350\320 : %s" }, @@ -408,20 +408,20 @@ static const PoMessageEntry _translation_ru_RU[] = { { 79, "\277\336\333\335\336\325 \335\320\327\322\320\335\330\325 \330\323\340\353" }, { 80, "\277\336\333\335\336\355\332\340\320\335\335\353\331 \340\325\326\330\334" }, { 81, "\303\341\332\336\340\325\335\330\325 GC \337\320\324\320:" }, - { 82, "\307\343\322\341\342\320\330\342\325\333\354\335\336\341\342\354 GC \337\320\324\320:" }, + { 82, "\307\343\322\341\342\322\330\342\325\333\354\335\336\341\342\354 GC \337\320\324\320:" }, { 83, "\263\340\344" }, - { 84, "\303\341\342\340\336\331\342\341\322\336 GM:" }, - { 85, "\317\327\353\332 \330\335\342\325\340\344\325\331\341\320:" }, - { 86, "\300\320\341\342\325\340\330\327\320\342\336\340 GUI:" }, + { 84, "\303\341\342\340\336\331\341\342\322\336 GM:" }, + { 85, "\317\327\353\332 GUI:" }, + { 86, "\300\330\341\336\322\320\333\332\320 GUI:" }, { 87, "\270\323\340\320" }, { 88, "\275\325\342 \344\320\331\333\336\322 \330\323\340\353" }, { 89, "Game Id \335\325 \337\336\324\324\325\340\326\330\322\320\325\342\341\357" }, - { 90, "\277\343\342\354 \332 \330\323\340\325: " }, + { 90, "\263\324\325 \330\323\340\320: " }, { 91, "\263\333\336\321\320\333\354\335\336\325 \334\325\335\356" }, { 92, "\277\325\340\325\331\342\330 \335\320 \324\330\340\325\332\342\336\340\330\356 \343\340\336\322\335\325\334 \322\353\350\325" }, { 93, "\262\322\325\340\345" }, { 94, "\263\340\320\344\330\332\320" }, - { 95, "\263\340\320\344\330\347\325\341\332\330\331 \340\325\326\330\334:" }, + { 95, "\263\340\320\344. \340\325\326\330\334:" }, { 96, "\305\320\340\324\322\320\340\335\336\325 \334\320\341\350\342\320\321\330\340\336\322\320\335\330\325 (\321\353\341\342\340\336, \335\336 \335\330\327\332\336\323\336 \332\320\347\325\341\342\322\320)" }, { 97, "Hercules \317\335\342\320\340\335\353\331" }, { 98, "Hercules \267\325\333\325\335\353\331" }, @@ -450,14 +450,15 @@ static const PoMessageEntry _translation_ru_RU[] = { { 121, "\267\320\323\340\343\327\330\342\354" }, { 122, "\267\320\323\340\343\327\330\342\354 \330\323\340\343:" }, { 123, "\267\320\323\340\343\327\330\342\354 \341\336\345\340\335\325\335\330\325 \324\333\357 \322\353\321\340\320\335\335\336\331 \330\323\340\353" }, - { 124, "\315\334\343\333\357\342\336\340 MAME OPL:" }, + { 124, "\315\334\343\333\357\342\336\340 MAME OPL" }, { 125, "MIDI" }, { 126, "\303\341\330\333\325\335\330\325 MIDI:" }, - { 128, "\303\341\342\340\336\331\341\342\322\336 MT32:" }, + { 127, "MT-32" }, + { 128, "\303\341\342\340. MT-32:" }, { 129, "\315\334\343\333\357\342\336\340 MT-32" }, { 130, "\274\320\341\350\342\320\321 \323\333\320\322\335\336\323\336 \355\332\340\320\335\320:" }, { 131, "\275\320\327\335\320\347\330\342\354" }, - { 132, "\264\336\321. \334\335\336\323\336..." }, + { 132, "\274\335\336\323\336 \330\323\340..." }, { 133, "\274\325\335\356" }, { 134, "\300\320\327\335\336\325" }, { 135, "\301\334\325\350\320\335\335\353\331 \340\325\326\330\334 AdLib/MIDI" }, @@ -465,10 +466,10 @@ static const PoMessageEntry _translation_ru_RU[] = { { 137, "\277\336\324\332\333\356\347\330\342\354 SMB" }, { 138, "\272\333\330\332 \334\353\350\354\356" }, { 139, "\274\343\333\354\342\330\344\343\335\332\346\330\357" }, - { 140, "\303\341\342\340\336\331\342\341\322\336 GM:" }, - { 141, "\263\340\336\334\332\336\341\342\354 \334\343\327\353\332\330:" }, - { 142, "\262\353\332\333\356\347\330\342\354 \322\341\361" }, - { 143, "\275\320\327\322\320\335\330\325:" }, + { 140, "\267\322\343\332\336\322\336\325 \343\341\342-\322\336:" }, + { 141, "\263\340\336\334\332. \334\343\327\353\332\330:" }, + { 142, "\262\353\332\333. \322\341\361" }, + { 143, "\275\320\327\322:" }, { 144, "\301\325\342\354 \322\353\332\333\356\347\325\335\320" }, { 145, "\301\325\342\354 \335\325 \335\320\341\342\340\336\325\335\320 (%d)" }, { 146, "\301\325\342\354 \340\320\321\336\342\320\325\342" }, @@ -482,9 +483,9 @@ static const PoMessageEntry _translation_ru_RU[] = { { 154, "\275\325 \327\320\324\320\335" }, { 155, "\261\325\327 \343\322\325\333\330\347\325\335\330\357" }, { 156, "OK" }, - { 157, "\262\353\345\336\324\335\320\357 \347\320\341\342\336\342\320:" }, + { 157, "\307\320\341\342\336\342\320 \327\322\343\332\320:" }, { 158, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, - { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 159, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 MT-32" }, { 160, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \320\343\324\330\336" }, { 161, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\320\344\330\332\330" }, { 162, "\277\325\340\325\332\340\353\342\354 \323\333\336\321\320\333\354\335\353\325 \343\341\342\320\335\336\322\332\330 \323\340\336\334\332\336\341\342\330" }, @@ -501,7 +502,7 @@ static const PoMessageEntry _translation_ru_RU[] = { { 173, "\262\340\325\334\357 \330\323\340\353: " }, { 174, "\277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\325\331\341\342\322\330\325" }, { 175, "\277\343\342\354 \332 \337\333\320\323\330\335\320\334:" }, - { 176, "\277\340\325\324\337\336\347\330\342\320\325\334\336\325 \343\341\342\340\336\331\341\342\322\336:" }, + { 176, "\267\322\343\332\336\322\336\325 \343\341\342-\322\336:" }, { 177, "\275\320\326\334\330\342\325 \332\333\320\322\330\350\343 \324\333\357 \335\320\327\335\320\347\325\335\330\357" }, { 178, "\262\353\345\336\324" }, { 179, "\262\353\345\336\324 \330\327 ScummVM" }, @@ -509,16 +510,16 @@ static const PoMessageEntry _translation_ru_RU[] = { { 181, "\276\350\330\321\332\320 \347\342\325\335\330\357" }, { 182, "\277\325\340\325\335\320\327\335\320\347\330\342\354 \332\333\320\322\330\350\330" }, { 183, "\303\324\320\333\330\342\354 \330\323\340\343 \330\327 \341\337\330\341\332\320. \275\325 \343\324\320\333\357\325\342 \330\323\340\343 \341 \326\325\341\342\332\336\323\336 \324\330\341\332\320" }, - { 184, "\300\325\326\330\334 \340\320\341\342\340\330\340\336\322\320\335\330\357:" }, + { 184, "\300\325\326\330\334 \340\320\341\342\340\320:" }, { 185, "\262\337\340\320\322\336" }, { 186, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, { 187, "\277\340\320\322\353\331 \351\325\333\347\336\332" }, { 188, "\277\336\322\325\340\335\343\342\354" }, - { 189, "\263\340\336\334\332\336\341\342\354 \355\344\344\325\332\342\336\322:" }, + { 189, "\263\340\336\334\332. SFX:" }, { 190, "SMB" }, { 191, "\267\320\337\330\341\320\342\354" }, - { 192, "\277\343\342\354 \341\336\345\340.: " }, - { 193, "\277\343\342\354 \324\333\357 \341\336\345\340\320\335\325\335\330\331: " }, + { 192, "\277\343\342\354 \341\336\345\340: " }, + { 193, "\301\336\345\340\320\335\325\335\330\357 \330\323\340:" }, { 194, "\301\336\345\340\320\335\330\342\354 \330\323\340\343: " }, { 195, "\277\336\330\341\332 \327\320\332\336\335\347\325\335!" }, { 196, "\277\340\336\341\334\336\342\340\325\335\336 %d \324\330\340\325\332\342\336\340\330\331 ..." }, @@ -565,18 +566,18 @@ static const PoMessageEntry _translation_ru_RU[] = { { 237, "\303\332\320\327\353\322\320\325\342 \322\353\345\336\324\335\336\325 \327\322\343\332\336\322\336\325 \343\341\342\340\336\331\341\342\322\336 \330\333\330 \355\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\331 \332\320\340\342\353" }, { 238, "\303\332\320\327\353\322\320\325\342 \337\343\342\354 \332 \341\336\345\340\320\335\325\335\330\357\334 \330\323\340\353" }, { 239, "\276\327\322\343\347\332\320" }, - { 240, "\263\340\336\334\332\336\341\342\354 \336\327\322\343\347\332\330:" }, + { 240, "\263\340\336\334\332. \336\327\322\343\347\332\330:" }, { 241, "\301\342\320\335\324\320\340\342\335\353\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, { 242, "\267\320\337\343\341\342\330\342\354 \322\353\321\340\320\335\335\343\356 \330\323\340\343" }, { 243, "\301\336\341\342\336\357\335\330\325:" }, { 244, "\301\343\321" }, - { 245, "\301\332\336\340\336\341\342\354 \341\343\321\342\330\342\340\336\322:" }, + { 245, "\301\332\336\340\336\341\342\354 \342\330\342\340\336\322:" }, { 246, "\301\343\321\342\330\342\340\353" }, { 247, "\301\334\325\335\330\342\354 \323\325\340\336\357" }, { 248, "\302\320\337 \324\333\357 \333\325\322\336\323\336 \351\325\333\347\332\320, \324\322\336\331\335\336\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \351\325\333\347\332\320" }, { 249, "\302\325\332\341\342 \330 \336\327\322\343\347\332\320:" }, { 250, "\275\325 \334\336\323\343 \337\330\341\320\342\354 \322 \322\353\321\340\320\335\335\343\356 \324\330\340\325\332\342\336\340\330\356. \277\336\326\320\333\343\331\341\342\320, \343\332\320\326\330\342\325 \324\340\343\323\343\356." }, - { 251, "\277\343\342\354 \332 \342\325\334\320\334:" }, + { 251, "\263\324\325 \342\325\334\353:" }, { 252, "\302\325\334\320:" }, { 253, "\315\342\336\342 ID \330\323\340\353 \343\326\325 \330\341\337\336\333\354\327\343\325\342\341\357. \277\336\326\320\333\343\331\341\342\320, \322\353\321\325\340\330\342\325 \324\340\343\323\336\331." }, { 254, "\315\342\320 \330\323\340\320 \335\325 \337\336\324\324\325\340\326\330\322\320\325\342 \327\320\323\340\343\327\332\343 \341\336\345\340\320\335\325\335\330\331 \347\325\340\325\327 \323\333\320\322\335\336\325 \334\325\335\356." }, @@ -620,13 +621,13 @@ static const PoMessageEntry _translation_ru_RU[] = { { 292, "~\264~\336\321. \330\323\340\343..." }, { 293, "\276~\342~\334\325\335\320" }, { 294, "~\267~\320\332\340\353\342\354" }, - { 295, "\270\327~\334~. \330\323\340\343..." }, + { 295, "\276~\337~\346\330\330 \330\323\340\353..." }, { 296, "~\277~\336\334\336\351\354" }, { 297, "\303\337\340\320\322\333\325\335\330\325 \321\336\357\334\330 \322 Indy" }, { 298, "~\272~\333\320\322\330\350\330" }, { 299, "\273\325\322\336\340\343\332\330\331 \340\325\326\330\334" }, { 300, "~\267~\320\323\340\343\327\330\342\354" }, - { 301, "~\267~\320\323\340...." }, + { 301, "~\267~\320\323\340\343\327\330\342\354..." }, { 302, "~\301~\333\325\324" }, { 303, "~O~K" }, { 304, "~\276~\337\346\330\330" }, @@ -635,7 +636,7 @@ static const PoMessageEntry _translation_ru_RU[] = { { 307, "~\262~\353\345\336\324" }, { 308, "~\303~\324\320\333\330\342\354 \330\323\340\343" }, { 309, "\277\340\336\324\336\333~\326~\330\342\354" }, - { 310, "~\262~\325\340\335\343\342\354\341\357 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, + { 310, "~\262~\353\331\342\330 \322 \323\333\320\322\335\336\325 \334\325\335\356" }, { 311, "~\267~\320\337\330\341\320\342\354" }, { 312, "\277~\343~\341\332" }, { 313, "\277\325\340\325\345\336\324\353 \320\332\342\330\322\330\340\336\322\320\335\353" }, @@ -1982,7 +1983,7 @@ struct PoLangEntry { }; const PoLangEntry _translations[] = { - { "ru_RU", "iso-8859-5", NULL, _translation_ru_RU }, + { "ru_RU", "iso-8859-5", "Russian", _translation_ru_RU }, { "fr_FR", "iso-8859-1", "Francais", _translation_fr_FR }, { "it_IT", "iso-8859-1", "Italiano", _translation_it_IT }, { "ca_ES", "iso-8859-1", "Catalan", _translation_ca_ES }, diff --git a/po/ru_RU.po b/po/ru_RU.po index cf77731f59..45bd5ceae2 100644 --- a/po/ru_RU.po +++ b/po/ru_RU.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-5\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" +"Language: Russian\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" "10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" @@ -121,7 +121,7 @@ msgstr "" #: gui/launcher.cpp:179 msgid "Name:" -msgstr "½Ð×ÒÐÝØÕ:" +msgstr "½Ð×Ò:" #: gui/launcher.cpp:179 gui/launcher.cpp:180 msgid "Full title of the game" @@ -191,12 +191,11 @@ msgstr " #: gui/launcher.cpp:246 gui/options.cpp:939 msgid "MT-32" -msgstr "" +msgstr "MT-32" #: gui/launcher.cpp:248 -#, fuzzy msgid "Override global MT-32 settings" -msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MIDI" +msgstr "¿ÕàÕÚàëâì ÓÛÞÑÐÛìÝëÕ ãáâÐÝÞÒÚØ MT-32" #: gui/launcher.cpp:258 gui/options.cpp:945 msgid "Paths" @@ -204,7 +203,7 @@ msgstr " #: gui/launcher.cpp:264 msgid "Game Path:" -msgstr "¿ãâì Ú ØÓàÕ: " +msgstr "³ÔÕ ØÓàÐ: " #: gui/launcher.cpp:268 gui/options.cpp:958 msgid "Extra Path:" @@ -216,7 +215,7 @@ msgstr " #: gui/launcher.cpp:272 msgid "Save Path:" -msgstr "¿ãâì áÞåà.: " +msgstr "¿ãâì áÞåà: " #: gui/launcher.cpp:272 gui/launcher.cpp:273 gui/options.cpp:952 #: gui/options.cpp:953 @@ -292,7 +291,7 @@ msgstr " #: gui/launcher.cpp:527 msgid "~L~oad..." -msgstr "~·~ÐÓà...." +msgstr "~·~ÐÓàãרâì..." #: gui/launcher.cpp:527 msgid "Load savegame for selected game" @@ -308,7 +307,7 @@ msgstr " #: gui/launcher.cpp:533 msgid "~E~dit Game..." -msgstr "¸×~Ü~. ØÓàã..." +msgstr "¾~ß~æØØ ØÓàë..." #: gui/launcher.cpp:533 msgid "Change game options" @@ -394,11 +393,11 @@ msgstr "ScummVM #: gui/launcher.cpp:1009 msgid "Mass Add..." -msgstr "´ÞÑ. ÜÝÞÓÞ..." +msgstr "¼ÝÞÓÞ ØÓà..." #: gui/launcher.cpp:1010 msgid "Add Game..." -msgstr "½ÞÒ. ØÓàÐ..." +msgstr "½ÞÒÐï ØÓàÐ..." #: gui/massadd.cpp:79 gui/massadd.cpp:82 msgid "... progress ..." @@ -465,11 +464,11 @@ msgstr "48 Ú³ #: gui/options.cpp:632 msgid "Graphics mode:" -msgstr "³àÐäØçÕáÚØÙ àÕÖØÜ:" +msgstr "³àÐä. àÕÖØÜ:" #: gui/options.cpp:643 msgid "Render mode:" -msgstr "ÀÕÖØÜ àÐáâàØàÞÒÐÝØï:" +msgstr "ÀÕÖØÜ àÐáâàÐ:" #: gui/options.cpp:643 gui/options.cpp:644 msgid "Special dithering modes supported by some games" @@ -489,12 +488,11 @@ msgstr " #: gui/options.cpp:663 msgid "Preferred Device:" -msgstr "¿àÕÔßÞçØâÐÕÜÞÕ ãáâàÞÙáâÒÞ:" +msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:" #: gui/options.cpp:663 -#, fuzzy msgid "Music Device:" -msgstr "ÃáâàÞÙâáÒÞ GM:" +msgstr "·ÒãÚÞÒÞÕ ãáâ-ÒÞ:" #: gui/options.cpp:663 msgid "Specifies preferred sound device or sound card emulator" @@ -514,7 +512,7 @@ msgstr " #: gui/options.cpp:699 msgid "Output rate:" -msgstr "²ëåÞÔÝÐï çÐáâÞâÐ:" +msgstr "ÇÐáâÞâÐ ×ÒãÚÐ:" #: gui/options.cpp:699 gui/options.cpp:700 msgid "" @@ -526,7 +524,7 @@ msgstr "" #: gui/options.cpp:710 msgid "GM Device:" -msgstr "ÃáâàÞÙâáÒÞ GM:" +msgstr "ÃáâàÞÙáâÒÞ GM:" #: gui/options.cpp:710 msgid "Specifies default sound device for General MIDI output" @@ -555,9 +553,8 @@ msgid "MIDI gain:" msgstr "ÃáØÛÕÝØÕ MIDI:" #: gui/options.cpp:749 -#, fuzzy msgid "MT-32 Device:" -msgstr "ÃáâàÞÙáâÒÞ MT32:" +msgstr "Ãáâà. MT-32:" #: gui/options.cpp:749 msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" @@ -616,19 +613,19 @@ msgstr " #: gui/options.cpp:797 msgid "Subtitle speed:" -msgstr "ÁÚÞàÞáâì áãÑâØâàÞÒ:" +msgstr "ÁÚÞàÞáâì âØâàÞÒ:" #: gui/options.cpp:809 msgid "Music volume:" -msgstr "³àÞÜÚÞáâì Üã×ëÚØ:" +msgstr "³àÞÜÚ. Üã×ëÚØ:" #: gui/options.cpp:816 msgid "Mute All" -msgstr "²ëÚÛîçØâì Òáñ" +msgstr "²ëÚÛ. Òáñ" #: gui/options.cpp:819 msgid "SFX volume:" -msgstr "³àÞÜÚÞáâì íääÕÚâÞÒ:" +msgstr "³àÞÜÚ. SFX:" #: gui/options.cpp:819 gui/options.cpp:820 msgid "Special sound effects volume" @@ -636,15 +633,15 @@ msgstr " #: gui/options.cpp:826 msgid "Speech volume:" -msgstr "³àÞÜÚÞáâì Þ×ÒãçÚØ:" +msgstr "³àÞÜÚ. Þ×ÒãçÚØ:" #: gui/options.cpp:952 msgid "Save Path: " -msgstr "¿ãâì ÔÛï áÞåàÐÝÕÝØÙ: " +msgstr "ÁÞåàÐÝÕÝØï ØÓà:" #: gui/options.cpp:955 msgid "Theme Path:" -msgstr "¿ãâì Ú âÕÜÐÜ:" +msgstr "³ÔÕ âÕÜë:" #: gui/options.cpp:958 gui/options.cpp:959 msgid "Specifies path to additional data used by all games or ScummVM" @@ -666,7 +663,7 @@ msgstr " #: gui/options.cpp:976 msgid "GUI Renderer:" -msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" +msgstr "ÀØáÞÒÐÛÚÐ GUI:" #: gui/options.cpp:982 msgid "Autosave:" @@ -678,7 +675,7 @@ msgstr " #: gui/options.cpp:997 msgid "GUI Language:" -msgstr "Ï×ëÚ ØÝâÕàäÕÙáÐ:" +msgstr "Ï×ëÚ GUI:" #: gui/options.cpp:997 msgid "Language of ScummVM GUI" @@ -882,7 +879,7 @@ msgstr " #: engines/dialogs.cpp:109 msgid "~R~eturn to Launcher" -msgstr "~²~ÕàÝãâìáï Ò ÓÛÐÒÝÞÕ ÜÕÝî" +msgstr "~²~ëÙâØ Ò ÓÛÐÒÝÞÕ ÜÕÝî" #: engines/dialogs.cpp:119 msgid "Save game:" @@ -937,7 +934,7 @@ msgstr " #: sound/fmopl.cpp:51 msgid "MAME OPL emulator" -msgstr "ÍÜãÛïâÞà MAME OPL:" +msgstr "ÍÜãÛïâÞà MAME OPL" #: sound/fmopl.cpp:53 msgid "DOSBox OPL emulator" @@ -1183,7 +1180,7 @@ msgstr " #: backends/platform/wii/options.cpp:74 msgid "GC Pad sensitivity:" -msgstr "ÇãÒáâÐØâÕÛìÝÞáâì GC ßÐÔÐ:" +msgstr "ÇãÒáâÒØâÕÛìÝÞáâì GC ßÐÔÐ:" #: backends/platform/wii/options.cpp:80 msgid "GC Pad acceleration:" -- cgit v1.2.3 From b0889cfd016e3e1f34466357384c2197366397cd Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 12:00:36 +0000 Subject: SCI: adding workaround for lb1 fixes bug #3037694 svn-id: r51575 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b51ba2dc95..1f07c5f3a5 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -86,6 +86,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_KQ6, 520, 520, 0, "rm520", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // going to boiling water trap on beast isle { GID_KQ6, -1, 903, 0, "controlWin", "open", -1, 4, { WORKAROUND_FAKE, 0 } }, // when opening the controls window (save, load etc) { GID_KQ7, 30, 64996, 0, "User", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0 } }, // called when pushing a keyboard key + { GID_LAURABOW, 37, 0, 0, "CB1", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // when going up the stairs (bug #3037694) { GID_LAURABOW, -1, 967, 0, "myIcon", "cycle", -1, 1, { WORKAROUND_FAKE, 0 } }, // having any portrait conversation coming up (initial bug #3034985) { GID_LAURABOW2, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 -- cgit v1.2.3 From 83e51b0e92b401fb117d40d9eaaf2cafe30ecbd2 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 12:38:07 +0000 Subject: SCI: removing pirated sq4 version from detection "fixes" bug #3037800 fixing warning in seg_manager svn-id: r51576 --- engines/sci/detection_tables.h | 4 +++- engines/sci/engine/seg_manager.cpp | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 21c9ad826c..e916d1341f 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2831,7 +2831,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Space Quest 4 - English DOS +#if 0 + // Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD= // Executable scanning reports "1.000.753" // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { @@ -2840,6 +2841,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, +#endif // Space Quest 4 - English DOS // Executable scanning reports "1.000.753" diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 3fac6925a4..1fb37f458d 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -852,7 +852,6 @@ byte *SegManager::allocDynmem(int size, const char *descr, reg_t *addr) { } bool SegManager::freeDynmem(reg_t addr) { - SegmentType foo = _heap[addr.segment]->getType(); if (addr.segment < 1 || addr.segment >= _heap.size() || !_heap[addr.segment] || _heap[addr.segment]->getType() != SEG_TYPE_DYNMEM) return false; // error -- cgit v1.2.3 From 7207290dc36c05f73693cf8107303ea49d9e0d63 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 1 Aug 2010 13:11:24 +0000 Subject: SCI: Enabled the "Return to Launcher" feature (needs testing) svn-id: r51577 --- engines/sci/detection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 3698964de5..3e5d978e91 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -627,7 +627,7 @@ bool SciMetaEngine::hasFeature(MetaEngineFeature f) const { bool SciEngine::hasFeature(EngineFeature f) const { return - //(f == kSupportsRTL) || + (f == kSupportsRTL) || (f == kSupportsLoadingDuringRuntime); // || //(f == kSupportsSavingDuringRuntime); // We can't allow saving through ScummVM menu, because -- cgit v1.2.3 From 88438ce118c38e3179bd4dac56aa95c54f8215b6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 15:31:23 +0000 Subject: SCI: adding workaround for pq2 kDisplay in room 23 svn-id: r51578 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 1f07c5f3a5..1e8c0df13f 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -160,6 +160,7 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object + { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 75h as id { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From 193d3212da5f5356cc531e2cbfe06e061caefdc7 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 16:23:44 +0000 Subject: SCI: adding "audiosfx" to directories svn-id: r51579 --- engines/sci/sci.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 13c28e0404..4728578e16 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -119,6 +119,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam SearchMan.addSubDirectoryMatching(gameDataDir, "actors"); // KQ6 hi-res portraits SearchMan.addSubDirectoryMatching(gameDataDir, "aud"); // resource.aud and audio files SearchMan.addSubDirectoryMatching(gameDataDir, "audio");// resource.aud and audio files + SearchMan.addSubDirectoryMatching(gameDataDir, "audiosfx");// resource.aud and audio files SearchMan.addSubDirectoryMatching(gameDataDir, "wav"); // speech files in WAV format SearchMan.addSubDirectoryMatching(gameDataDir, "sfx"); // music/sound files in WAV format SearchMan.addSubDirectoryMatching(gameDataDir, "avi"); // AVI movie files for Windows versions -- cgit v1.2.3 From adde79f1cbed9c0e4900ac305145ee22aae49d20 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 16:43:49 +0000 Subject: SCI: fixing regression of r51520 svn-id: r51580 --- engines/sci/graphics/view.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 38682770e4..271730015d 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -670,7 +670,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, pixelNo--; scaledPixelNo++; for (; scaledPixelNo < scaledHeight; scaledPixelNo++) - scalingY[scaledPixelNo] = pixelNo - 1; + scalingY[scaledPixelNo] = pixelNo; // Create width scaling table pixelNo = 0; @@ -686,7 +686,7 @@ void GfxView::drawScaled(const Common::Rect &rect, const Common::Rect &clipRect, pixelNo--; scaledPixelNo++; for (; scaledPixelNo < scaledWidth; scaledPixelNo++) - scalingX[scaledPixelNo] = pixelNo - 1; + scalingX[scaledPixelNo] = pixelNo; scaledWidth = MIN(clipRect.width(), scaledWidth); scaledHeight = MIN(clipRect.height(), scaledHeight); -- cgit v1.2.3 From 2e94391d982656a9120483796c36fd8d46529a36 Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Sun, 1 Aug 2010 17:16:39 +0000 Subject: CONFIGURE: add support for N64 port to configure svn-id: r51581 --- backends/platform/n64/module.mk | 7 +++++- configure | 48 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/backends/platform/n64/module.mk b/backends/platform/n64/module.mk index 8fb6ba49ab..429b63802e 100644 --- a/backends/platform/n64/module.mk +++ b/backends/platform/n64/module.mk @@ -1,7 +1,12 @@ MODULE := backends/platform/n64 MODULE_OBJS := \ - nintendo64.o + nintendo64.o \ + osys_n64_base.o \ + osys_n64_events.o \ + osys_n64_utilities.o \ + pakfs_save_manager.o \ + framfs_save_manager.o # We don't use rules.mk but rather manually update OBJS and MODULE_DIRS. MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) diff --git a/configure b/configure index 6e93c70899..7e3a6f45f0 100755 --- a/configure +++ b/configure @@ -362,7 +362,7 @@ get_system_exe_extension() { arm-riscos) _exeext=",ff8" ;; - dreamcast | gamecube | ds | ps2 | psp | wii) + dreamcast | gamecube | ds | ps2 | psp | wii | n64) _exeext=".elf" ;; gp2x-linux) @@ -975,6 +975,11 @@ ds) _host_cpu=arm _host_alias=arm-eabi ;; +n64) + _host_os=n64 + _host_cpu=mips + _host_alias=mips64 + ;; neuros) _host_os=linux _host_cpu=arm @@ -1418,6 +1423,11 @@ case $_host_os in DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" _unix=yes ;; + n64) + DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT" + DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_COMMAND_LINE" + DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL" + ;; ds) # TODO Nintendo DS DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" @@ -1636,6 +1646,33 @@ if test -n "$_host"; then _mt32emu="no" _port_mk="backends/platform/ds/ds.mk" ;; + n64) + CXXFLAGS="$CXXFLAGS -mno-extern-sdata -O2 --param max-inline-insns-auto=20 -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -march=vr4300 -mtune=vr4300 -mhard-float -fno-rtti -fno-exceptions -Wno-multichar -Wshadow" + LDFLAGS="-march=vr4300 -mtune=vr4300 -nodefaultlibs -nostartfiles -mno-crt0" + LDFLAGS="$LDFLAGS -L/opt/mips64-toolchain/hkz-libn64 -L/opt/mips64-toolchain/lib" + LDFLAGS="$LDFLAGS -T n64ld_cpp.x -Xlinker -Map -Xlinker scummvm.map" + _ar="$_host_alias-ar cru" + _ranlib="$_host_alias-ranlib" + _backend="n64" + _endian=big + _need_memalign=yes + _mt32emu=no + _vkeybd=yes + _build_hq_scalers=no + _build_scalers=no + _indeo3=no + _translation=no + _keymapper=no + _text_console=no + _vkeybd=yes + _dynamic_modules=no + _plugins_default=static + # Force use of libmad, libtremor and zlib + _mad=yes + _tremor=yes + _zlib=yes + ;; neuros) DEFINES="$DEFINES -DNEUROS" _unix=yes @@ -2469,6 +2506,13 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' ;; + n64) + INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/include' + INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/mips64/include' + INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/hkz-libn64' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' + LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs -lm -lstdc++ -lc -lgcc -lz -lnosys" + ;; null) DEFINES="$DEFINES -DUSE_NULL_DRIVER" ;; @@ -2561,7 +2605,7 @@ if test "$have_gcc" = yes ; then case $_host_os in # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ - mingw* | dreamcast | wii | gamecube | ds | psp | wince | amigaos* | android) + mingw* | dreamcast | wii | gamecube | ds | psp | wince | amigaos* | android | n64) CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) -- cgit v1.2.3 From f3851674f38bfc5a799dd52e2ef2617517280c5f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 17:51:21 +0000 Subject: SCI: changing noname selector names removing space from previous name svn-id: r51582 --- engines/sci/engine/kernel.cpp | 2 +- engines/sci/engine/workarounds.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index d76199c794..794279bd87 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -58,7 +58,7 @@ const Common::String &Kernel::getSelectorName(uint selector) { // TODO: maybe check, if there is a fixed selector-table and error() out in that case for (uint loopSelector = _selectorNames.size(); loopSelector <= selector; loopSelector++) { Common::String newSelectorName; - newSelectorName = newSelectorName.printf("", loopSelector); + newSelectorName = newSelectorName.printf("", loopSelector); _selectorNames.push_back(newSelectorName); } } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 1e8c0df13f..38b90d46a2 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -54,10 +54,10 @@ const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry uninitializedReadWorkarounds[] = { - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 - { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 - { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 + { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 + { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu @@ -263,13 +263,13 @@ const SciWorkaroundEntry kMemory_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kNewWindow_workarounds[] = { - { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call - bug #3035057 + { GID_ECOQUEST, -1, 981, 0, "SysWindow", "", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // EcoQuest 1 demo uses an in-between interpreter from SCI1 to SCI1.1. It's SCI1.1, but uses the SCI1 semantics for this call - bug #3035057 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { - { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #3034506 + { GID_QFG4, 100, 100, 0, "doMovie", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless - bug #3034506 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 79bf94c87729506b556f66d15ea30827b509451a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sun, 1 Aug 2010 17:54:48 +0000 Subject: SCI: Move kernelShakeScreen to GfxScreen so it can be used in SCI32 (it's used in GK1) svn-id: r51583 --- engines/sci/engine/kgraphics.cpp | 2 +- engines/sci/graphics/paint.cpp | 4 ---- engines/sci/graphics/paint.h | 4 ---- engines/sci/graphics/paint16.cpp | 17 ----------------- engines/sci/graphics/paint16.h | 2 -- engines/sci/graphics/screen.cpp | 16 ++++++++++++++++ engines/sci/graphics/screen.h | 5 +++-- 7 files changed, 20 insertions(+), 30 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index b2ff83aa1e..07864f5648 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1082,7 +1082,7 @@ reg_t kShakeScreen(EngineState *s, int argc, reg_t *argv) { int16 shakeCount = (argc > 0) ? argv[0].toUint16() : 1; int16 directions = (argc > 1) ? argv[1].toUint16() : 1; - g_sci->_gfxPaint->kernelShakeScreen(shakeCount, directions); + g_sci->_gfxScreen->kernelShakeScreen(shakeCount, directions); return s->r_acc; } diff --git a/engines/sci/graphics/paint.cpp b/engines/sci/graphics/paint.cpp index 13dcebc27a..50b0534ba7 100644 --- a/engines/sci/graphics/paint.cpp +++ b/engines/sci/graphics/paint.cpp @@ -49,8 +49,4 @@ void GfxPaint::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, ui void GfxPaint::kernelGraphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control) { } -void GfxPaint::kernelShakeScreen(uint16 shakeCount, uint16 directions) { - warning("Unimplemented kShakeScreen"); -} - } // End of namespace Sci diff --git a/engines/sci/graphics/paint.h b/engines/sci/graphics/paint.h index 75a17461d4..994bc4e5e9 100644 --- a/engines/sci/graphics/paint.h +++ b/engines/sci/graphics/paint.h @@ -38,10 +38,6 @@ public: virtual void kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, bool animationBlackoutFlag, bool mirroredFlag, bool addToFlag, int16 EGApaletteNo); virtual void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle); virtual void kernelGraphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control); - - virtual void kernelShakeScreen(uint16 shakeCount, uint16 directions); - -private: }; } // End of namespace Sci diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index bb3975e9ef..0685d96073 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -596,23 +596,6 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { return result; } -// TODO: If this matches the sci32 implementation, we may put it into GfxScreen -void GfxPaint16::kernelShakeScreen(uint16 shakeCount, uint16 directions) { - while (shakeCount--) { - if (directions & SCI_SHAKE_DIRECTION_VERTICAL) - _screen->setVerticalShakePos(10); - // TODO: horizontal shakes - g_system->updateScreen(); - g_sci->getEngineState()->wait(3); - - if (directions & SCI_SHAKE_DIRECTION_VERTICAL) - _screen->setVerticalShakePos(0); - - g_system->updateScreen(); - g_sci->getEngineState()->wait(3); - } -} - reg_t GfxPaint16::kernelPortraitLoad(const Common::String &resourceName) { //Portrait *myPortrait = new Portrait(g_sci->getResMan(), _screen, _palette, resourceName); return NULL_REG; diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index edffa8da6e..e944c71bdd 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -88,8 +88,6 @@ public: reg_t kernelDisplay(const char *text, int argc, reg_t *argv); - void kernelShakeScreen(uint16 shakeCount, uint16 directions); - reg_t kernelPortraitLoad(const Common::String &resourceName); void kernelPortraitShow(const Common::String &resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq); void kernelPortraitUnload(uint16 portraitId); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 131a3d2eb8..839b9975c5 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -534,6 +534,22 @@ void GfxScreen::setVerticalShakePos(uint16 shakePos) { g_system->setShakePos(shakePos * 2); } +void GfxScreen::kernelShakeScreen(uint16 shakeCount, uint16 directions) { + while (shakeCount--) { + if (directions & SCI_SHAKE_DIRECTION_VERTICAL) + setVerticalShakePos(10); + // TODO: horizontal shakes + g_system->updateScreen(); + g_sci->getEngineState()->wait(3); + + if (directions & SCI_SHAKE_DIRECTION_VERTICAL) + setVerticalShakePos(0); + + g_system->updateScreen(); + g_sci->getEngineState()->wait(3); + } +} + void GfxScreen::dither(bool addToFlag) { int y, x; byte color, ditheredColor; diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index f1e3d028a8..97f5736289 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -109,8 +109,6 @@ public: void getPalette(Palette *pal); void setPalette(Palette *pal); - void setVerticalShakePos(uint16 shakePos); - void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight); void adjustToUpscaledCoordinates(int16 &y, int16 &x); @@ -126,6 +124,7 @@ public: int _picNotValidSci11; // another variable that is used by kPicNotValid in sci1.1 int16 kernelPicNotValid(int16 newPicNotValid); + void kernelShakeScreen(uint16 shakeCount, uint16 direction); private: uint16 _width; @@ -143,6 +142,8 @@ private: void bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWidth, byte *&memoryPtr); void bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr); + void setVerticalShakePos(uint16 shakePos); + bool _unditherState; int16 _unditherMemorial[SCI_SCREEN_UNDITHERMEMORIAL_SIZE]; -- cgit v1.2.3 From 4423ad9333c000861fafb485c975dbac47e154ac Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Aug 2010 17:59:14 +0000 Subject: SCI: Cleanup. svn-id: r51584 --- engines/sci/engine/kernel.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 794279bd87..73fb3de062 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -56,11 +56,8 @@ const Common::String &Kernel::getSelectorName(uint selector) { // This should only occur in games w/o a selector-table // We need this for proper workaround tables // TODO: maybe check, if there is a fixed selector-table and error() out in that case - for (uint loopSelector = _selectorNames.size(); loopSelector <= selector; loopSelector++) { - Common::String newSelectorName; - newSelectorName = newSelectorName.printf("", loopSelector); - _selectorNames.push_back(newSelectorName); - } + for (uint loopSelector = _selectorNames.size(); loopSelector <= selector; ++loopSelector) + _selectorNames.push_back(Common::String::printf("", loopSelector)); } return _selectorNames[selector]; } -- cgit v1.2.3 From 2095ce31bde18f6b3a153d7479467eb13ed009ff Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Aug 2010 19:31:18 +0000 Subject: GUI: Fix loading BDF fonts from theme archives. svn-id: r51585 --- gui/ThemeEngine.cpp | 21 ++++++++++++++++++--- gui/ThemeEngine.h | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index b491b12065..3a50b2c69c 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1448,6 +1448,20 @@ const Graphics::Font *ThemeEngine::loadFontFromArchive(const Common::String &fil Common::SeekableReadStream *stream = 0; const Graphics::Font *font = 0; + if (_themeArchive) + stream = _themeArchive->createReadStreamForMember(filename); + if (stream) { + font = Graphics::NewFont::loadFont(*stream); + delete stream; + } + + return font; +} + +const Graphics::Font *ThemeEngine::loadCachedFontFromArchive(const Common::String &filename) { + Common::SeekableReadStream *stream = 0; + const Graphics::Font *font = 0; + if (_themeArchive) stream = _themeArchive->createReadStreamForMember(filename); if (stream) { @@ -1464,13 +1478,14 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) { Common::File fontFile; if (!cacheFilename.empty()) { - if (fontFile.open(cacheFilename)) + if (fontFile.open(cacheFilename)) { font = Graphics::NewFont::loadFromCache(fontFile); + } if (font) return font; - if ((font = loadFontFromArchive(cacheFilename))) + if ((font = loadCachedFontFromArchive(cacheFilename))) return font; } @@ -1485,7 +1500,7 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) { if (font) { if (!cacheFilename.empty()) { - if (!Graphics::NewFont::cacheFontData(*(const Graphics::NewFont*)font, cacheFilename)) { + if (!Graphics::NewFont::cacheFontData(*(const Graphics::NewFont *)font, cacheFilename)) { warning("Couldn't create cache file for font '%s'", filename.c_str()); } } diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index f736559def..73181b74a6 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -540,6 +540,7 @@ protected: const Graphics::Font *loadFont(const Common::String &filename); const Graphics::Font *loadFontFromArchive(const Common::String &filename); + const Graphics::Font *loadCachedFontFromArchive(const Common::String &filename); Common::String genCacheFilename(const char *filename); Common::String genLocalizedFontFilename(const char *filename); -- cgit v1.2.3 From c8aabe77e8858b68c5458888a01e5aeb3f5ffb2d Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Aug 2010 19:31:37 +0000 Subject: GUI: Fix font cache. The bounding boxes of the glyphs use signed coordinates. We stored only unsigned coordinates, which resulted in incorrect glyph positioning. Conrecte example: the bounding box of the glyphs for clR6x12-iso-8859-5.bdf used: x y w h 0 -3 6 12 We on the other hand interpreted that as: x y w h 0 65533 6 12 when loading the font from our font cache. svn-id: r51586 --- graphics/font.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/graphics/font.cpp b/graphics/font.cpp index 629f2f4b82..74247d4da1 100644 --- a/graphics/font.cpp +++ b/graphics/font.cpp @@ -609,8 +609,8 @@ bool NewFont::cacheFontData(const NewFont &font, const Common::String &filename) cacheFile.writeUint16BE(font.desc.height); cacheFile.writeUint16BE(font.desc.fbbw); cacheFile.writeUint16BE(font.desc.fbbh); - cacheFile.writeUint16BE(font.desc.fbbx); - cacheFile.writeUint16BE(font.desc.fbby); + cacheFile.writeSint16BE(font.desc.fbbx); + cacheFile.writeSint16BE(font.desc.fbby); cacheFile.writeUint16BE(font.desc.ascent); cacheFile.writeUint16BE(font.desc.firstchar); cacheFile.writeUint16BE(font.desc.size); @@ -667,8 +667,8 @@ NewFont *NewFont::loadFromCache(Common::SeekableReadStream &stream) { data->height = stream.readUint16BE(); data->fbbw = stream.readUint16BE(); data->fbbh = stream.readUint16BE(); - data->fbbx = stream.readUint16BE(); - data->fbby = stream.readUint16BE(); + data->fbbx = stream.readSint16BE(); + data->fbby = stream.readSint16BE(); data->ascent = stream.readUint16BE(); data->firstchar = stream.readUint16BE(); data->size = stream.readUint16BE(); -- cgit v1.2.3 From 55d7af07662802ad3bc04be6676aa2eb3932595e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 19:57:03 +0000 Subject: SCI: kDoSound(mute) behaviour change svn-id: r51589 --- engines/sci/sound/soundcmd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index bd88a5fca8..b12037065b 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -263,12 +263,13 @@ reg_t SoundCommandParser::kDoSoundResumeAfterRestore(int argc, reg_t *argv, reg_ } reg_t SoundCommandParser::kDoSoundMute(int argc, reg_t *argv, reg_t acc) { + uint16 previousState = _music->soundGetSoundOn(); if (argc > 0) { debugC(2, kDebugLevelSound, "kDoSound(mute): %d", argv[0].toUint16()); _music->soundSetSoundOn(argv[0].toUint16()); } - return make_reg(0, _music->soundGetSoundOn()); + return make_reg(0, previousState); } reg_t SoundCommandParser::kDoSoundMasterVolume(int argc, reg_t *argv, reg_t acc) { -- cgit v1.2.3 From 312db66d5f369436690e75f51a33a48ba501b824 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 20:47:46 +0000 Subject: AdvancedDetector: Introducing AD_LISTEND, another convenience macro svn-id: r51590 --- engines/advancedDetector.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index de4fc3bbf8..94c346813c 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -38,8 +38,10 @@ struct ADGameFileDescription { int32 fileSize; // Optional. Set to -1 to ignore. }; -#define AD_ENTRY1(f, x) {{ f, 0, x, -1}, {NULL, 0, NULL, 0}} -#define AD_ENTRY1s(f, x, s) {{ f, 0, x, s}, {NULL, 0, NULL, 0}} +#define AD_LISTEND {NULL, 0, NULL, 0} + +#define AD_ENTRY1(f, x) {{ f, 0, x, -1}, AD_LISTEND} +#define AD_ENTRY1s(f, x, s) {{ f, 0, x, s}, AD_LISTEND} enum ADGameFlags { ADGF_NO_FLAGS = 0, -- cgit v1.2.3 From 00e67c1f86ad5b6de203a9168f152bdc7f9e9a44 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 20:48:25 +0000 Subject: SCI: Use new convenience macro and shorted the detection table a bit svn-id: r51591 --- engines/sci/detection_tables.h | 852 ++++++++++++++++++----------------------- 1 file changed, 382 insertions(+), 470 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index e916d1341f..3414174ae7 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -32,7 +32,7 @@ namespace Sci { {"sci-fanmade", name, { \ {"resource.map", 0, resMapMd5, resMapSize}, \ {"resource.001", 0, resMd5, resSize}, \ - {NULL, 0, NULL, 0}}, lang, Common::kPlatformPC, 0, GUIO_NOSPEECH \ + AD_LISTEND}, lang, Common::kPlatformPC, 0, GUIO_NOSPEECH \ } #define FANMADE(name, resMapMd5, resMapSize, resMd5, resSize) FANMADE_L(name, resMapMd5, resMapSize, resMd5, resSize, Common::EN_ANY) @@ -47,7 +47,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"astrochicken", "", { {"resource.map", 0, "f3d1be7752d30ba60614533d531e2e98", 474}, {"resource.001", 0, "6fd05926c2199af0af6f72f90d0d7260", 126895}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - English Amiga (from www.back2roots.org) @@ -59,7 +59,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "3fb02ce493f6eacdcc3713851024f80e", 559540}, {"resource.002", 0, "d226d7d3b4f77c4a566913fc310487fc", 792380}, {"resource.003", 0, "d226d7d3b4f77c4a566913fc310487fc", 464348}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - German Amiga (from www.back2roots.org) @@ -71,7 +71,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "4e0836fadc324316c1a418125709ba45", 569057}, {"resource.002", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 826309}, {"resource.003", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 493638}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - English DOS Non-Interactive Demo @@ -80,7 +80,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "467bb5e3224bb54640c3280032aebff5", 633}, {"resource.000", 0, "9780f040d58182994e22d2e34fab85b0", 67367}, {"resource.001", 0, "2af49dbd8f2e1db4ab09f9310dc91259", 570553}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Castle of Dr. Brain - English DOS Floppy EGA (from omer_mor, bug report #3035349) @@ -93,7 +93,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "5e7b90949422de005f80285979972e43", 292423}, {"resource.005", 0, "8a5ed3ba96e2eaf18e36fedfaab89419", 297838}, {"resource.006", 0, "dceed92e709cad1bd9582809a235b0a0", 266682}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - English DOS Floppy (from jvprat) @@ -104,7 +104,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 346731}, {"resource.001", 0, "d2f5a1be74ed963fa849a76892be5290", 794832}, {"resource.002", 0, "c0c29c51af66d65cb53f49e785a2d978", 1280907}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - English DOS Floppy 1.1 @@ -113,7 +113,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 347071}, {"resource.001", 0, "13e81e1839cd7b216d2bb5615c1ca160", 796776}, {"resource.002", 0, "930e416bec196b9703a331d81b3d66f2", 1283812}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Castle of Dr. Brain - Spanish DOS @@ -122,7 +122,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "5738c163e014bbe046474de009020b82", 2727}, {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 1197694}, {"resource.001", 0, "735be4e58957180cfc807d5e18fdffcd", 1433302}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Christmas Card 1988 - English DOS @@ -130,7 +130,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"christmas1988", "", { {"resource.map", 0, "39485580d34a72997f3d5b3aba4d24f1", 426}, {"resource.001", 0, "11391434f41c834090d7a1e9488ce936", 129739}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Christmas Card 1990: The Seasoned Professional - English DOS (16 Colors) @@ -138,7 +138,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"christmas1990", "16 Colors", { {"resource.map", 0, "8f656714a05b94423ac6eb10ee8797d0", 600}, {"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 272629}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Christmas Card 1990: The Seasoned Professional - English DOS (256 Colors) @@ -146,7 +146,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"christmas1990", "256 Colors", { {"resource.map", 0, "44b8f45b841b9b5e17e939a35e443988", 600}, {"resource.001", 0, "acde93e58fca4f7a2a5a220558a94aa8", 335362}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Christmas Card 1992 - English DOS @@ -154,7 +154,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"christmas1992", "", { {"resource.map", 0, "f1f8c8a8443f523422af70b4ec85b71c", 318}, {"resource.000", 0, "62fb9256f8e7e6e65a6875efdb7939ac", 203396}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Codename: Iceman - English Amiga (from www.back2roots.org) @@ -168,7 +168,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "d97a96f1ab91b41cf46a02cc89b0a04e", 619219}, {"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 713382}, {"resource.005", 0, "605b67a9ef199a9bb015745e7c004cf4", 478384}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Codename: Iceman - English DOS Non-Interactive Demo @@ -176,7 +176,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"iceman", "Demo", { {"resource.map", 0, "782974f29d8a824782d2d4aea39964e3", 1056}, {"resource.001", 0, "d4b75e280d1c3a97cfef1b0bebff387c", 573647}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Codename: Iceman - English DOS (from jvprat) @@ -189,7 +189,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "36670a917550757d57df84c96cf9e6d9", 566549}, {"resource.003", 0, "d97a96f1ab91b41cf46a02cc89b0a04e", 624303}, {"resource.004", 0, "8613c45fc771d658e5a505b9a4a54f31", 670883}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Codename: Iceman - English DOS (from FRG) @@ -201,7 +201,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "250b859381ebf2bf8922bd99683b0cc1", 566464}, {"resource.003", 0, "dc7c5280e7acfaffe6ef2a6c963c5f94", 622118}, {"resource.004", 0, "64f342463f6f35ba71b3509ef696ae3f", 669188}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Codename: Iceman - English DOS 1.023 (from abevi, bug report #2612718) @@ -215,7 +215,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "dc7c5280e7acfaffe6ef2a6c963c5f94", 330653}, {"resource.006", 0, "08050329aa113a9f14ed99cbfe3536ec", 232942}, {"resource.007", 0, "64f342463f6f35ba71b3509ef696ae3f", 267702}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of Camelot - English Amiga (from www.back2roots.org) @@ -230,7 +230,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "6821dc97cf643ba521a4e840dda3c58b", 647410}, {"resource.005", 0, "c6e551bdc24f0acc193159038d4ca767", 605882}, {"resource.006", 0, "8f880a536908ab496bbc552f7f5c3738", 585255}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Conquests of Camelot - English DOS Non-Interactive Demo @@ -238,7 +238,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"camelot", "Demo", { {"resource.map", 0, "f4cd75c15be75e04cdca3acda2c0b0ea", 468}, {"resource.001", 0, "4930708722f34bfbaa4945fb08f55f61", 232523}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Conquests of Camelot - English DOS (from jvprat) @@ -250,7 +250,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "8e1a3a8c588007404b532b8dfacc1460", 722250}, {"resource.003", 0, "8e1a3a8c588007404b532b8dfacc1460", 723712}, {"resource.004", 0, "8e1a3a8c588007404b532b8dfacc1460", 729143}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of Camelot - English DOS @@ -264,7 +264,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "8e1a3a8c588007404b532b8dfacc1460", 345734}, {"resource.006", 0, "8e1a3a8c588007404b532b8dfacc1460", 332446}, {"resource.007", 0, "8e1a3a8c588007404b532b8dfacc1460", 358182}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of the Longbow - English Amiga (from www.back2roots.org) @@ -279,7 +279,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "d1038c75d85a6650d48e07d174a6a913", 838175}, {"resource.005", 0, "1c3804e56b114028c5873a35c2f06d13", 653002}, {"resource.006", 0, "f9487732289a4f4966b4e34eea413325", 842817}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Conquests of the Longbow - English DOS @@ -293,7 +293,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1064637}, {"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1154950}, {"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1042966}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of the Longbow - English DOS Floppy (from jvprat) @@ -307,7 +307,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "1867136d01ece57b531032d466910522", 823686}, {"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1261462}, {"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284720}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of the Longbow - English DOS @@ -320,7 +320,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "1867136d01ece57b531032d466910522", 823610}, {"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1260237}, {"resource.005", 0, "21ebe6b39b57a73fc449f67f013765aa", 1284609}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of the Longbow EGA - English DOS @@ -334,16 +334,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "b7bb35c027bb424ecefcd122768e5e60", 705631}, {"resource.005", 0, "58942b1aa6d6ffeb66e9f8897fd4435f", 469243}, {"resource.006", 0, "8c767b3939add63d11274065e46aad04", 713158}, - {NULL, 0, NULL, 0}}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Conquests of the Longbow - English DOS Non-Interactive Demo // SCI interpreter version 1.000.510 {"longbow", "Demo", { {"resource.map", 0, "cbc5cb73341de1bff1b1e20a640af220", 588}, {"resource.001", 0, "f05a20cc07eee85da8e999d0ac0f596b", 869916}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Conquests of the Longbow - German DOS (suplied by markcoolio in bug report #2727681) // SCI interpreter version 1.000.510 @@ -356,7 +355,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "9cfce07e204a329e94fda8b5657621da", 1101869}, {"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1176914}, {"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1123585}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest - English DOS Non-Interactive Demo (from FRG) @@ -365,16 +364,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ecoquest", "Demo", { {"resource.map", 0, "c819e171359b7c95f4c13b846d5c034e", 873}, {"resource.001", 0, "baf9393a9bfa73098adb501e5bc5487b", 657518}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Eco Quest - English DOS CD 1.1 // SCI interpreter version 1.001.064 {"ecoquest", "CD", { {"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804}, {"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Eco Quest - English DOS Floppy @@ -385,7 +383,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "96d4435d24c01f1c1675e46457604c5f", 1413719}, {"resource.002", 0, "28fe9b4f0567e71feb198bc9f3a2c605", 1241816}, {"resource.003", 0, "f3146df0ad4297f5ce35aa8c4753bf6c", 586832}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest - English DOS Floppy @@ -396,7 +394,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "2fed7451bca81b0c891eed1a956f2263", 1212161}, {"resource.002", 0, "323b3b12f43d53f27d259beb225f0aa7", 1129316}, {"resource.003", 0, "83ac03e4bddb2c1ac2d36d2a587d0536", 1145616}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest - German DOS Floppy (supplied by markcoolio in bug report #2723744) @@ -407,7 +405,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "2fed7451bca81b0c891eed1a956f2263", 1212060}, {"resource.002", 0, "02d7d0411f7903aacb3bc8b0f8ca8a9a", 1202581}, {"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1175835}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest - Spanish DOS Floppy (from jvprat) @@ -419,7 +417,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "2fed7451bca81b0c891eed1a956f2263", 1212060}, {"resource.002", 0, "2d21a1d2dcbffa551552e3e0725d2284", 1186033}, {"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1174993}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest - French DOS Floppy (from Strangerke) @@ -430,7 +428,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "fc7fba54b6bb88fd7e9c229636599aa9", 1205841}, {"resource.002", 0, "b836c6ee9de67d814ac5d1b05f5b9858", 1173872}, {"resource.003", 0, "f8f767f9d6351432621c6e54c1b2ba8c", 1141520}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest 2 - English DOS Non-Interactive Demo @@ -438,7 +436,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ecoquest2", "Demo", { {"resource.map", 0, "607cfa0d8a03b7d348c06ee727e3d939", 1321}, {"resource.000", 0, "dd6f614c43c029f063e93cd243af90a4", 525992}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Eco Quest 2 - English DOS Floppy (supplied by markcoolio in bug report #2723761) @@ -446,7 +444,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ecoquest2", "Floppy", { {"resource.map", 0, "28fb7b6abb9fc1cb8882d7c2e701b63f", 5658}, {"resource.000", 0, "cc1d17e5637528dbe4a812699e1cbfc6", 4208192}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Eco Quest 2 - French DOS Floppy (from Strangerke) @@ -454,7 +452,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ecoquest2", "Floppy", { {"resource.map", 0, "c22ab8b33c339c138b6b1697b77b9e79", 5588}, {"resource.000", 0, "1c4093f7248240329121fdf8c0d59152", 4231946}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Freddy Pharkas - English DOS demo (from FRG) @@ -462,7 +460,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"freddypharkas", "Demo", { {"resource.map", 0, "97aa9fcfe84c9993a64debd28c32393a", 1909}, {"resource.000", 0, "5ea8e7a3ea10cce6efd5c106dc62fd8c", 867724}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Freddy Pharkas - English CD (from FRG) @@ -470,7 +468,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"freddypharkas", "CD", { {"resource.map", 0, "d46b282f228a67ba13bd4b4009e95f8f", 6058}, {"resource.000", 0, "ee3c64ffff0ba9fb08bea2624631c598", 5490246}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Freddy Pharkas - English DOS Floppy (updated information from markcoolio in bug reports #2723773 and #2724720) @@ -480,7 +478,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816}, {"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230}, {"resource.msg", 0, "554f65315d851184f6e38211489fdd8f", -1}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Freddy Pharkas - Windows (supplied by abevi in bug report #2612718) @@ -489,7 +487,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"freddypharkas", "Floppy", { {"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816}, {"resource.000", 0, "fed4808fdb72486908ac7ad0044b14d8", 5233230}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // Freddy Pharkas - German DOS Floppy (from Tobis87, updated information from markcoolio in bug reports #2723772 and #2724720) @@ -499,7 +497,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816}, {"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230}, {"resource.msg", 0, "304b5a5781800affd2235152a5794fa8", -1}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Freddy Pharkas - Spanish DOS (from jvprat) @@ -512,7 +510,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "419dbd5366f702b4123dedbbb0cffaae", 1456640}, {"resource.003", 0, "05acdc256c742e79c50b9fe7ec2cc898", 863310}, {"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // Freddy Pharkas - Spanish DOS (from jvprat) @@ -522,7 +520,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a32674e7fbf7b213b4a066c8037f16b6", 5816}, {"resource.000", 0, "96b07e9b914dba1c8dc6c78a176326df", 5233230}, {"resource.msg", 0, "45b5bf74933ac3727e4cc844446dc052", 796156}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Freddy Pharkas - English DOS CD Demo @@ -530,7 +528,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"freddypharkas", "CD Demo", { {"resource.map", 0, "a62a7eae85dd1e6b07f39662b278437e", 1918}, {"resource.000", 0, "4962a3c4dd44e36e78ea4a7a374c2220", 957382}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE }, // Fun Seeker's Guide - English DOS @@ -538,7 +536,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"funseeker", "", { {"resource.map", 0, "7ee6859ef74314f6d91938c3595348a9", 282}, {"resource.001", 0, "f1e680095424e31f7fae1255d36bacba", 40692}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Gabriel Knight - English DOS CD Demo @@ -546,7 +544,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD Demo", { {"resource.map", 0, "39645952ae0ed8072c7e838f31b75464", 2490}, {"resource.000", 0, "eb3ed7477ca4110813fe1fcf35928561", 1718450}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NONE }, #ifdef ENABLE_SCI32 @@ -555,16 +553,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "", { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10783}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Gabriel Knight - English DOS Floppy (supplied my markcoolio in bug report #2723777) // SCI interpreter version 2.000.000 {"gk1", "", { {"resource.map", 0, "65e8c14092e4c9b3b3538b7602c8c5ec", 10783}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Gabriel Knight - German DOS Floppy (supplied my markcoolio in bug report #2723775) @@ -572,7 +569,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "", { {"resource.map", 0, "ad6508b0296b25c07b1f58828dc33696", 10789}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13077029}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Gabriel Knight - English DOS CD (from jvprat) @@ -580,7 +577,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Gabriel Knight - German DOS CD (from Tobis87) @@ -588,7 +585,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, // Gabriel Knight - Spanish DOS CD (from jvprat) @@ -596,7 +593,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // Gabriel Knight - French DOS CD (from Hkz) @@ -604,7 +601,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "55f909ba93a2515042a08d8a2da8414e", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13325145}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, // Gabriel Knight - English Windows CD (from jvprat) @@ -612,7 +609,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, // Gabriel Knight - German Windows CD (from Tobis87) @@ -620,7 +617,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NONE }, // Gabriel Knight - Spanish Windows CD (from jvprat) @@ -628,7 +625,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk1", "CD", { {"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformWindows, 0, GUIO_NONE }, // Gabriel Knight 2 - English Windows Non-Interactive Demo @@ -636,7 +633,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"gk2", "Demo", { {"resource.map", 0, "e0effce11c4908f4b91838741716c83d", 1351}, {"resource.000", 0, "d04cfc7f04b6f74d13025378be49ec2b", 4640330}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Gabriel Knight 2 - English DOS (from jvprat) @@ -654,7 +651,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.005", 0, "14b62d4a3bddee57a03cb1495a798a0f", 38075705}, {"resmap.006", 0, "ce9359037277b7d7976da185c2fa0aad", 2977}, {"ressci.006", 0, "8e44e03890205a7be12f45aaba9644b4", 60659424}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Gabriel Knight 2 - French DOS (6-CDs Sierra Originals reedition) @@ -672,7 +669,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.005", 0, "1eb5a72744799f5a5518543f5b4c3c79", 37882126}, {"resmap.006", 0, "11b2e722170b8c93fdaa5428e2c7676f", 3001}, {"ressci.006", 0, "4037d941aec39d2e654e20960429aefc", 60568486}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, @@ -685,7 +682,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 162783}, {"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 342309}, {"resource.003", 0, "e0dd44069a62a463fd124974b915f10d", 328912}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Hoyle 1 - English DOS (supplied by merkur in bug report #2719227) @@ -693,7 +690,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"hoyle1", "", { {"resource.map", 0, "1034a218943d12f1f36e753fa10c95b8", 4386}, {"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 518308}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #if 0 // TODO: unknown if these files are corrupt @@ -703,7 +700,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "2a72b1aba65fa6e339370eb86d8601d1", 5166}, {"resource.001", 0, "e0dd44069a62a463fd124974b915f10d", 218755}, {"resource.002", 0, "e0dd44069a62a463fd124974b915f10d", 439502}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, #endif @@ -713,7 +710,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "4f894d203f64aa23d9ff64d30ae36926", 2100}, {"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 98138}, {"resource.002", 0, "8f2dd70abe01112eca464cda818b5eb6", 196631}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Hoyle 2 - English Amiga (from www.back2roots.org) @@ -722,9 +719,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"hoyle2", "", { {"resource.map", 0, "62ed48d20c580e5a98f102f7cd93706a", 1356}, {"resource.001", 0, "8f2dd70abe01112eca464cda818b5eb6", 222704}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, #if 0 // TODO: unknown if these files are corrupt // Hoyle 3 - English Amiga (from www.back2roots.org) @@ -734,7 +730,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "f1f158e428398cb87fc41fb4aa8c2119", 2088}, {"resource.000", 0, "595b6039ea1356e7f96a52c58eedcf22", 355791}, {"resource.001", 0, "143df8aef214a2db34c2d48190742012", 632273}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, #endif @@ -744,7 +740,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"hoyle3", "Demo", { {"resource.map", 0, "0d06cacc87dc21a08cd017e73036f905", 735}, {"resource.001", 0, "24db2bccda0a3c43ac4a7b5edb116c7e", 797678}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Hoyle 3 - English DOS Floppy (from jvprat) @@ -754,7 +750,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "7216a2972f9c595c45ab314941628e43", 2247}, {"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 541845}, {"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 845795}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Hoyle 3 - English DOS Floppy 1.0 (supplied by abevi in bug report #2612718) @@ -762,14 +758,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "1728af1f6a85938c3522e64449e76ca1", 2205}, {"resource.000", 0, "6ef28cac094dcd97fdb461662ead6f92", 319905}, {"resource.001", 0, "0a98a268ee99b92c233a0d7187c1f0fa", 526438}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Hoyle 4 - English DOS Demo {"hoyle4", "Demo", { {"resource.map", 0, "60f764020a6b788bbbe415dbc2ccb9f3", 931}, {"resource.000", 0, "5fe3670e3ddcd4f85c10013b5453141a", 615522}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Hoyle 4 - English DOS Demo @@ -778,7 +774,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"hoyle4", "Demo", { {"resource.map", 0, "662087cb383e52e3cc4ae7ecb10e20aa", 938}, {"resource.000", 0, "24c10844792c54d476d272213cbac300", 675252}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Jones in the Fast Lane EGA - English DOS @@ -787,7 +783,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "be4cf9e8c1e253623ef35ae3b8a1d998", 1800}, {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 202105}, {"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 341771}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Jones in the Fast Lane VGA - English DOS @@ -796,14 +792,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "65cbe19b36fffc71c8e7b2686bd49ad7", 1800}, {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 313476}, {"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 719747}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Jones in the Fast Lane - English DOS CD {"jones", "CD", { {"resource.map", 0, "459f5b04467bc2107aec02f5c4b71b37", 4878}, {"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652150}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, // King's Quest 1 SCI Remake - English Amiga (from www.back2roots.org) @@ -815,7 +811,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "9ae2a13708d691cd42f9129173c4b39d", 795123}, {"resource.003", 0, "9ae2a13708d691cd42f9129173c4b39d", 763224}, {"resource.004", 0, "9ae2a13708d691cd42f9129173c4b39d", 820443}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // King's Quest 1 SCI Remake - English DOS Non-Interactive Demo @@ -823,7 +819,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq1sci", "SCI Remake Demo", { {"resource.map", 0, "59b13619078bd47011421468959ee5d4", 954}, {"resource.001", 0, "4cfb9040db152868f7cb6a1e8151c910", 296555}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // King's Quest 1 SCI Remake - English DOS (from the King's Quest Collection) @@ -834,7 +830,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "fed9e0072ffd511d248674e60dee2099", 555439}, {"resource.002", 0, "fed9e0072ffd511d248674e60dee2099", 714062}, {"resource.003", 0, "fed9e0072ffd511d248674e60dee2099", 717478}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 4 - English Amiga (from www.back2roots.org) @@ -847,7 +843,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "fb351106ec865fad9af5d78bd6b8e3cb", 663629}, {"resource.003", 0, "fd16c9c223f7dc5b65f06447615224ff", 683016}, {"resource.004", 0, "3fac034c7d130e055d05bc43a1f8d5f8", 549993}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // King's Quest 4 - English DOS Non-Interactive Demo @@ -855,7 +851,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq4sci", "Demo", { {"resource.map", 0, "992ac7cc31d3717fe53818a9bb6d1dae", 594}, {"resource.001", 0, "143e1c14f15ad0fbfc714f648a65f661", 205330}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // King's Quest 4 - English DOS (from the King's Quest Collection) @@ -867,7 +863,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "77615c595388acf3d1df8e107bfb6b52", 536573}, {"resource.003", 0, "77615c595388acf3d1df8e107bfb6b52", 707591}, {"resource.004", 0, "77615c595388acf3d1df8e107bfb6b52", 479562}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 4 - English DOS @@ -881,7 +877,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "851a62d00972dc4002f472cc0d84e71d", 321593}, {"resource.006", 0, "851a62d00972dc4002f472cc0d84e71d", 333777}, {"resource.007", 0, "851a62d00972dc4002f472cc0d84e71d", 341038}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 4 - English DOS @@ -895,7 +891,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "0c8566848a76eea19a6d6220914030a7", 325102}, {"resource.006", 0, "0c8566848a76eea19a6d6220914030a7", 337288}, {"resource.007", 0, "0c8566848a76eea19a6d6220914030a7", 343882}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - English Amiga (from www.back2roots.org) @@ -911,7 +907,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "31a5487f4d942e6354d5be49d59707c9", 834146}, {"resource.006", 0, "26c0c25399b6715fec03fc3e12544fe3", 823048}, {"resource.007", 0, "b914b5901e786327213e779725d30dd1", 778772}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // King's Quest 5 - German Amiga @@ -927,7 +923,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "5aa3d59968b569cd509dde00d4eb8751", 754201}, {"resource.006", 0, "56546b20db11a4836f900efa6d3a3e74", 672099}, {"resource.007", 0, "56546b20db11a4836f900efa6d3a3e74", 794194}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // King's Quest 5 - Italian Amiga @@ -943,7 +939,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "de3c5c09e350fded36ca354998c2194d", 754784}, {"resource.006", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 672527}, {"resource.007", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 794259}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::IT_ITA, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // King's Quest 5 - English DOS CD (from the King's Quest Collection) @@ -953,7 +949,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "f68ba690e5920725dcf9328001b90e33", 13122}, {"resource.000", 0, "449471bfd77be52f18a3773c7f7d843d", 571368}, {"resource.001", 0, "b45a581ff8751e052c7e364f58d3617f", 16800210}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // King's Quest 5 - English DOS Floppy @@ -968,7 +964,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "b6c43441cb78a9b484efc8e614aac092", 1287999}, {"resource.006", 0, "672ede1136e9e401658538e51bd5dc22", 1172619}, {"resource.007", 0, "2f48faf27666b58c276dda20f91f4a93", 1240456}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - English DOS Floppy (supplied by omer_mor in bug report #3036996) @@ -983,7 +979,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "ef4f1166bc37b6cfab70234ea60ddc3d", 1032675}, {"resource.006", 0, "06cb3f689836086ebe08b1efc0126592", 921113}, {"resource.007", 0, "252249753c6e850eacceb8af634986d3", 1133608}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 EGA (supplied by markcoolio in bug report #2829470) @@ -999,7 +995,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 669919}, {"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666527}, {"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541743}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 EGA (supplied by omer_mor in bug report #3035421) @@ -1014,7 +1010,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "3cca5b2dae8afe94532edfdc98d7edbe", 669961}, {"resource.006", 0, "698c698570cde9015e4d51eb8d2e9db1", 666541}, {"resource.007", 0, "703d8df30e89541af337d7706540d5c4", 541762}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101) @@ -1029,7 +1025,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "9c429782d102739f6bbb81e8b953b0cb", 1267525}, {"resource.006", 0, "d1a75fdc01840664d00366cff6919366", 1208972}, {"resource.007", 0, "c07494f0cce7c05210893938786a955b", 1337361}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - French DOS Floppy (from the King's Quest Collector's Edition 1994) @@ -1045,7 +1041,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "f4b31cafc5defac75125c5f7b7f9a31a", 1268334}, {"resource.006", 0, "f7dc85307632ef657ceb1651204f6f51", 1210081}, {"resource.007", 0, "7db4d0a1d8d547c0019cb7d2a6acbdd4", 1338473}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - Italian DOS Floppy (from glorifindel) @@ -1060,7 +1056,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "f4e441f284560eaa8022102315656a7d", 1267757}, {"resource.006", 0, "8eeabd92af71e766e323db2100879102", 1209325}, {"resource.007", 0, "dc10c107e0923b902326a040b9c166b9", 1337859}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722) @@ -1075,7 +1071,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "6556ff8e7c4d1acf6a78aea154daa76c", 1287869}, {"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456}, {"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 5 - English Macintosh @@ -1090,7 +1086,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "432e2a58e4d496d730697db072437337", 1366732}, {"resource.006", 0, "3d22904a374c192f51e5665b74364133", 1264079}, {"resource.007", 0, "ffe17e23d5833a79f3695addfc149a56", 1361965}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, // King's Quest 6 - English DOS Non-Interactive Demo @@ -1100,7 +1096,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "f75727c00a6d884234fa2a43c951943a", 706}, {"resource.000", 0, "535b1b920441ec73f42eaa4ccfd47b89", 264116}, {"resource.msg", 0, "54d1fdc936f98c81f9e4c19e04fb1510", 8260}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // King's Quest 6 - English DOS Floppy @@ -1109,7 +1105,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a362063318eebe7d6423b1d9dc6213e1", 8703}, {"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324}, {"resource.msg", 0, "3cf5de44de36191f109d425b8450efc8", 258590}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 6 - German DOS Floppy (supplied by markcoolio in bug report #2727156) @@ -1118,7 +1114,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a362063318eebe7d6423b1d9dc6213e1", 8703}, {"resource.000", 0, "f2b7f753992c56a0c7a08d6a5077c895", 7863324}, {"resource.msg", 0, "756297b2155db9e43f621c6f6fb763c3", 282822}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 6 - English DOS CD (from the King's Quest Collection) @@ -1127,7 +1123,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq6", "CD", { {"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215}, {"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // King's Quest 6 - English Windows CD (from the King's Quest Collection) @@ -1136,7 +1132,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq6", "CD", { {"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215}, {"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, // King's Quest 6 - Spanish DOS CD (from jvprat) @@ -1146,7 +1142,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a73a5ab04b8f60c4b75b946a4dccea5a", 8953}, {"resource.000", 0, "4da3ad5868a775549a7cc4f72770a58e", 8537260}, {"resource.msg", 0, "41eed2d3893e1ca6c3695deba4e9d2e8", 267102}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // King's Quest 6 - English Macintosh Floppy @@ -1154,7 +1150,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq6", "", { {"Data1", 0, "f3c38a33c94293b8ff0337c1090a4973", 3916479}, {"Data2", 0, "b255edf327d7b366dce816b7debf3b94", 15046256}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 @@ -1165,7 +1161,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.000", 0, "4948e4e1506f1e1c4e1d47abfa06b7f8", 204385195}, {"resource.map", 0, "40ccafb2195301504eba2e4f4f2c7f3d", 18925}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // King's Quest 7 - English Windows (from the King's Quest Collection) @@ -1173,7 +1169,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.map", 0, "2be9ab94429c721af8e05c507e048a15", 18697}, {"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 203882535}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // King's Quest 7 - English DOS (from FRG) @@ -1181,7 +1177,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 7 - English Windows (from FRG) @@ -1189,7 +1185,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // King's Quest 7 - German Windows (supplied by markcoolio in bug report #2727402) @@ -1197,7 +1193,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.map", 0, "838b9ff132bd6962026fee832e8a7ddb", 18697}, {"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 7 - Spanish DOS (from jvprat) @@ -1205,7 +1201,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "", { {"resource.map", 0, "0b62693cbe87e3aaca3e8655a437f27f", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // King's Quest 7 - English DOS Non-Interactive Demo @@ -1213,7 +1209,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"kq7", "Demo", { {"resource.map", 0, "b44f774108d63faa1d021101221c5a54", 1690}, {"resource.000", 0, "d9659d2cf0c269c6a9dc776707f5bea0", 2433827}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #endif // ENABLE_SCI32 @@ -1229,7 +1225,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "2ab23f64306b18c28302c8ec2964c5d6", 605134}, {"resource.004", 0, "aa553977f7e5804081de293800d3bcce", 695067}, {"resource.005", 0, "bfd870d51dc97729f0914095f58e6957", 676881}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Laura Bow - English Atari ST (from jvprat) @@ -1241,7 +1237,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 721149}, {"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667365}, {"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683737}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAtariST, 0, GUIO_NOSPEECH }, // Laura Bow - English DOS Non-Interactive Demo @@ -1249,7 +1245,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"laurabow", "Demo", { {"resource.map", 0, "e625726268ff4e123ada11f31f0249f3", 768}, {"resource.001", 0, "0c8912290af0890f8d95faeb4ddb2d68", 333031}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Laura Bow - English DOS 3.5" Floppy (from "The Roberta Williams Anthology"/1996) @@ -1260,7 +1256,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 721381}, {"resource.003", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 667468}, {"resource.004", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 683807}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow - English DOS (from FRG) @@ -1274,7 +1270,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 327465}, {"resource.006", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 328390}, {"resource.007", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 317687}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow - German DOS (from Tobis87) @@ -1288,7 +1284,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 327465}, {"resource.006", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 328390}, {"resource.007", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 317687}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow 2 - English DOS Non-Interactive Demo (from FRG) @@ -1297,7 +1293,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"laurabow2", "Demo", { {"resource.map", 0, "24dffc5db1d88c7999f13e8767ed7346", 855}, {"resource.000", 0, "2b2b1b4f7584f9b38fd13f6ab95634d1", 781912}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Laura Bow 2 - English DOS Floppy @@ -1306,7 +1302,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"laurabow2", "", { {"resource.map", 0, "610bfd9a852004222f0faaf5fc9e630a", 6489}, {"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5035964}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow 2 - English DOS CD (from "The Roberta Williams Antology"/1996) @@ -1315,7 +1311,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"laurabow2", "CD", { {"resource.map", 0, "a70945e61ba7ac7bfea6b7bd72c6aec5", 7274}, {"resource.000", 0, "82578b8d5a7e09c4c58891ca49fae35b", 5598672}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Laura Bow 2 v1.1 - French DOS Floppy (from Hkz) @@ -1323,7 +1319,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "3b6dfbcda210bbc3f23fd1927113bf98", 6483}, {"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766}, {"resource.msg", 0, "0fceedfbdd85a4bc7851fdd9dd2d2f19", 278253}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow 2 v1.1 - German DOS Floppy (from Tobis87, updated info from markcoolio in bug report #2723787, updated info from #2797962)) @@ -1332,7 +1328,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "3b6dfbcda210bbc3f23fd1927113bf98", 6483}, {"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766}, {"resource.msg", 0, "795c928cd00dfec9fbc62ebcd12e1f65", 303185}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Laura Bow 2 - Spanish DOS CD (from jvprat) @@ -1341,7 +1337,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "3b6dfbcda210bbc3f23fd1927113bf98", 6483}, {"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766}, {"resource.msg", 0, "71f1f0cd9f082da2e750c793a8ed9d84", 286141}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 1 EGA Remake - English DOS (from spookypeanut) @@ -1352,7 +1348,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "38936d3c68b6f79d3ffb13955713fed7", 591352}, {"resource.002", 0, "24c958bc922b07f91e25e8c93aa01fcf", 491230}, {"resource.003", 0, "685cd6c1e05a695ab1e0db826337ee2a", 553279}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - English Amiga (from www.back2roots.org) @@ -1364,7 +1360,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "24ed6dc01b1e7fbc66c3d63a5994549a", 750465}, {"resource.002", 0, "5790ac0505f7ca98d4567132b875eb1e", 681041}, {"resource.003", 0, "4a34c3367c2fe7eb380d741374da1989", 572251}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - English DOS (from spookypeanut) @@ -1374,7 +1370,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "d3bceaebef3f7be941c2038b3565161e", 922406}, {"resource.001", 0, "ec20246209d7b19f38989261e5c8f5b8", 1111226}, {"resource.002", 0, "85d6935ef77e6b0e16bc307640a0d913", 1088312}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - English DOS (from FRG) @@ -1384,7 +1380,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "d3bceaebef3f7be941c2038b3565161e", 918242}, {"resource.001", 0, "d34cadb11e1aefbb497cf91bc1d3baa7", 1114688}, {"resource.002", 0, "85b030bb66d5342b0a068f1208c431a8", 1078443}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - English DOS Non-Interactive Demo @@ -1392,7 +1388,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl1sci", "VGA Remake, Demo", { {"resource.map", 0, "434e1f6c39d71647b34f0ee57b2bbd68", 444}, {"resource.001", 0, "0c0768215c562d9dace4a5ca53696cf3", 359913}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Spanish DOS (from the Leisure Suit Larry Collection) @@ -1405,7 +1401,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "112648995dbc194037f1e4ed2e195910", 1063341}, {"resource.002", 0, "3fe2a3aec0ed53c7d6db1845a67e3aa2", 1095908}, {"resource.003", 0, "ac175df0ea9a2cba57f0248651856d27", 376556}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Russian DOS @@ -1416,7 +1412,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "0d7b2afa666bd36d9535a15d3a837a66", 928566}, {"resource.001", 0, "bc8ca10c807515d959cbd91f9ba47735", 1123759}, {"resource.002", 0, "b7409ab32bc3bee2d6cce887cd33f2b6", 1092160}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release) @@ -1424,7 +1420,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl1sci", "VGA Remake", { {"resource.map", 0, "58330a85767e42a2487129913283ab5b", 3228}, {"resource.000", 0, "b6097ff35cdc8469f02150fe2f824198", 4781210}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 2 - English Amiga (from www.back2roots.org) @@ -1436,7 +1432,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "a0d4a625311d307257da7fc43d00459d", 630106}, {"resource.003", 0, "a0d4a625311d307257da7fc43d00459d", 570356}, {"resource.004", 0, "a0d4a625311d307257da7fc43d00459d", 717844}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Larry 2 - English DOS Non-Interactive Demo @@ -1445,7 +1441,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl2", "Demo", { {"resource.map", 0, "03dba704bb77da55a91ad27b5a3cac09", 528}, {"resource.001", 0, "9f5520f0297206928df0b0b36493cd33", 127532}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Larry 2 - English DOS @@ -1458,7 +1454,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "4a24443a25e2b1492462a52809605dc2", 204861}, {"resource.005", 0, "4a24443a25e2b1492462a52809605dc2", 277732}, {"resource.006", 0, "4a24443a25e2b1492462a52809605dc2", 345683}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 2 - English DOS @@ -1473,7 +1469,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // TODO/FIXME: is the version with size 208739 corrupted? //{"resource.006", 0, "96033f57accfca903750413fd09193c8", 345818}, {"resource.006", 0, "96033f57accfca903750413fd09193c8", -1}, // 345818 or 208739 - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 3 - English Amiga (from www.back2roots.org) @@ -1487,7 +1483,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "5c10e462c8cf589610773e4fe8bfd996", 527238}, {"resource.004", 0, "f408e59cbee1457f042e5773b8c53951", 651634}, {"resource.005", 0, "433911eb764089d493aed1f958a5615a", 524259}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Larry 3 - English DOS @@ -1498,7 +1494,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "f18441027154292836b973c655fa3175", 578024}, {"resource.003", 0, "f18441027154292836b973c655fa3175", 506807}, {"resource.004", 0, "f18441027154292836b973c655fa3175", 513651}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 3 - English DOS @@ -1512,7 +1508,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "f18441027154292836b973c655fa3175", 302946}, {"resource.006", 0, "f18441027154292836b973c655fa3175", 282465}, {"resource.007", 0, "f18441027154292836b973c655fa3175", 257174}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 3 - English DOS Non-Interactive Demo @@ -1521,7 +1517,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "33a2384f395470af3d2180e37ad0322a", 1140}, {"resource.001", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 76525}, {"resource.002", 0, "f773d79b93dfd4052ec8c1cc64c1e6ab", 268299}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Larry 3 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723832) @@ -1533,7 +1529,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "3827a9b17b926e12dcc336860f50612a", 672403}, {"resource.003", 0, "3827a9b17b926e12dcc336860f50612a", 587036}, {"resource.004", 0, "3827a9b17b926e12dcc336860f50612a", 691932}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 3 - French DOS (provided by richiefs in bug report #2670691) @@ -1545,7 +1541,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "65f1bdaa20f6d0470e9d969f22473873", 671614}, {"resource.003", 0, "65f1bdaa20f6d0470e9d969f22473873", 586921}, {"resource.004", 0, "65f1bdaa20f6d0470e9d969f22473873", 690826}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - English Amiga @@ -1560,7 +1556,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "3ce5901f1bc171ac0274d99a4eeb9e57", 623022}, {"resource.005", 0, "f8b2d1137bb767e5d232056b99dd69eb", 623621}, {"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 715598}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Larry 5 - German Amiga @@ -1576,7 +1572,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "59eba83ad465b08d763b44f86afa86f6", 664717}, {"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 754966}, {"resource.007", 0, "59eba83ad465b08d763b44f86afa86f6", 683135}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Larry 5 - English DOS Non-Interactive Demo (from FRG) @@ -1584,7 +1580,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl5", "Demo", { {"resource.map", 0, "efe8d3f45ce4f6bd9a6643e0ac8d2a97", 504}, {"resource.001", 0, "8bd8d9c0b5f455ee1269d63ce86c50dd", 531380}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Larry 5 - English DOS (from spookypeanut) @@ -1599,7 +1595,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "0cc8d35a744031c772ca7cd21ae95273", 1011944}, {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1024810}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 1030656}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - German DOS (from Tobis87) @@ -1614,7 +1610,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "0cc8d35a744031c772ca7cd21ae95273", 959342}, {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1021774}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 993408}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - French DOS (provided by richiefs in bug report #2670691) @@ -1630,7 +1626,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "0cc8d35a744031c772ca7cd21ae95273", 920524}, {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 946540}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 958842}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - Spanish DOS (from the Leisure Suit Larry Collection) @@ -1646,7 +1642,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "0cc8d35a744031c772ca7cd21ae95273", 958079}, {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1015136}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 987222}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 5 - Italian DOS Floppy (from glorifindel) @@ -1654,7 +1650,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl5", "", { {"resource.map", 0, "a99776df795127f387cb35dae872d4e4", 5919}, {"resource.000", 0, "a8989a5a89e7d4f702b26b378c7a357a", 7001981}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 6 - English DOS (from spookypeanut) @@ -1662,7 +1658,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6", "", { {"resource.map", 0, "bb8a39d9e2a77ba449a1e591109ad9a8", 6973}, {"resource.000", 0, "4462fe48c7452d98fddcec327a3e738d", 5789138}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 6 - English/German/French DOS CD - LORES @@ -1670,7 +1666,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6", "", { {"resource.map", 0, "0b91234b7112782962cb480b7791b6e2", 7263}, {"resource.000", 0, "57d5fe8bb9e044158514476ea7678eb0", 5754790}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 6 - German DOS CD - LORES (provided by richiefs in bug report #2670691) @@ -1678,7 +1674,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6", "", { {"resource.map", 0, "bafe85f32738854135991d4324ad147e", 7268}, {"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5773160}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 6 - French DOS CD - LORES (provided by richiefs in bug report #2670691) @@ -1686,7 +1682,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6", "", { {"resource.map", 0, "97797ea775baaf18a1907d357d3c0ea6", 7268}, {"resource.000", 0, "f6cbc6da7b90ea135883e0759848ca2c", 5776092}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 6 - Spanish DOS - LORES (from the Leisure Suit Larry Collection) @@ -1694,7 +1690,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6", "", { {"resource.map", 0, "633bf8f42170b6271019917c8009989b", 6943}, {"resource.000", 0, "7884a8db9253e29e6b37a2651fd90ba3", 5733116}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Crazy Nick's Software Picks: Leisure Suit Larry's Casino - English DOS (from the Leisure Suit Larry Collection) @@ -1702,35 +1698,35 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"cnick-lsl", "", { {"resource.map", 0, "194f1578f2624db813c9072359ad1639", 783}, {"resource.001", 0, "3733433b517ec3d14a3331d9ab3842ae", 344830}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Crazy Nick's Software Picks: King Graham's Board Game Challenge {"cnick-kq", "", { {"resource.map", 0, "44bc538a5cd24b39ffccc967c0ebf84d", 1137}, {"resource.001", 0, "470e7a4a3504635e70b623c44461e1ac", 451272}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Crazy Nick's Software Picks: Parlor Games with Laura Bow {"cnick-laurabow", "", { {"resource.map", 0, "3b826bfe64f8ff1ccf30eef93cd2f727", 999}, {"resource.001", 0, "985ac8db6f636f2b4334c04b0fbb44fb", 336698}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Crazy Nick's Software Picks: Robin Hood's Game of Skill and Chance {"cnick-longbow", "", { {"resource.map", 0, "4a5c81f485a2416bde12978506f2fb5f", 897}, {"resource.001", 0, "ef16dc9e867eb8eeb5b13e110b90bd4b", 571466}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Crazy Nick's Software Picks: Roger Wilco's Spaced Out Game Pack {"cnick-sq", "", { {"resource.map", 0, "b4d95b02d84e297441bd999d34eaa6b1", 879}, {"resource.001", 0, "82ff2b64a60117886fbcd6a3a8c977c6", 364921}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 @@ -1739,7 +1735,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6hires", "", { {"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872}, {"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691) @@ -1747,7 +1743,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6hires", "", { {"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691) @@ -1755,7 +1751,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl6hires", "", { {"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691) @@ -1763,7 +1759,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "Demo", { {"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878}, {"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI3_GAMES @@ -1772,7 +1768,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "", { {"resmap.000", 0, "eae93e1b1d1ccc58b4691c371281c95d", 8188}, {"ressci.000", 0, "89353723488219e25589165d73ed663e", 66965678}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 7 - German DOS (from Tobis87) @@ -1780,7 +1776,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "", { {"resmap.000", 0, "c11e6bfcfc2f2d05da47e5a7df3e9b1a", 8188}, {"ressci.000", 0, "a8c6817bb94f332ff498a71c8b47f893", 66971724}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 7 - French DOS (provided by richiefs in bug report #2670691) @@ -1788,7 +1784,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "", { {"resmap.000", 0, "4407849fd52fe3efb0c30fba60cd5cd4", 8206}, {"ressci.000", 0, "dc37c3055fffbefb494ff22b145d377b", 66964472}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Larry 7 - Italian DOS CD (from glorifindel) @@ -1796,7 +1792,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "", { {"resmap.000", 0, "9852a97141f789413f29bf956052acdb", 8212}, {"ressci.000", 0, "440b9fed89590abb4e4386ed6f948ee2", 67140181}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NONE }, // Larry 7 - Spanish DOS (from the Leisure Suit Larry Collection) @@ -1804,7 +1800,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lsl7", "", { {"resmap.000", 0, "8f3d603e1acc834a5d598b30cdfc93f3", 8188}, {"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Lighthouse - English Windows Demo (from jvprat) @@ -1812,7 +1808,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lighthouse", "Demo", { {"resource.map", 0, "543124606352bfa5e07696ddf2a669be", 64}, {"resource.000", 0, "5d7714416b612463d750fb9c5690c859", 28952}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Lighthouse - English Windows Demo @@ -1820,7 +1816,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"lighthouse", "Demo", { {"resmap.000", 0, "3bdee7a16926975a4729f75cf6b80a92", 1525}, {"ressci.000", 0, "3c585827fa4a82f4c04a56a0bc52ccee", 11494351}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Lighthouse - English DOS (from jvprat) @@ -1830,7 +1826,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.001", 0, "14e922c47b92156377cb49e241691792", 99591924}, {"resmap.002", 0, "c68db5333f152fea6ca2dfc75cad8b34", 7573}, {"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94628315}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Lighthouse - Spanish DOS (from jvprat) @@ -1840,7 +1836,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.001", 0, "18553177dbf83fb2cb6c8edcbb174183", 99543093}, {"resmap.002", 0, "e7dc85884a2417e2eff9de0c63dd65fa", 7630}, {"ressci.002", 0, "3c8d627c555b0e3e4f1d9955bc0f0df4", 94631127}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #endif // ENABLE_SCI3_GAMES @@ -1851,7 +1847,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "c2cf672c3f4251e7472d4542af3bf764", 933}, {"resource.000", 0, "8be56a3a88c065ee00c02c0e29199f3a", 14643}, {"resource.001", 0, "9e33566515b18bee7915db448063bba2", 871853}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Mixed-Up Fairy Tales - English DOS Floppy EGA (from omer_mor, bug report #3035350) @@ -1862,7 +1858,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "4db83250f821607b634c99d663cae74a", 663713}, {"resource.003", 0, "509b2467ba779100d5933ed51a9ae32f", 560255}, {"resource.004", 0, "93afc85d5ffa60ea555d6cc336d22c03", 651109}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Mixed-Up Fairy Tales v1.000 - English DOS (supplied by markcoolio in bug report #2723791) @@ -1874,7 +1870,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "6767f8c8585f617aaa91d442f41ae714", 1032989}, {"resource.003", 0, "b1288e0821ee358d1ffe877e5900c8ec", 1047565}, {"resource.004", 0, "f79daa70390d73746742ffcfc3dc4471", 937580}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Mixed-Up Fairy Tales - English DOS Floppy (from jvprat) @@ -1885,7 +1881,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "49c8f7dcd9989e4491a93554bec325b0", 238019}, {"resource.002", 0, "564f516d991032e781492592a4eaa275", 1414142}, {"resource.003", 0, "dd6cef0c592eadb7e6be9a25307c57a2", 1344719}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Mixed-Up Mother Goose - English Amiga (from www.back2roots.org) @@ -1895,7 +1891,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "4aa28ac93fae03cf854594da13d9229c", 2700}, {"resource.001", 0, "fb552ae550ca1dac19ed8f6a3767612d", 262885}, {"resource.002", 0, "fb552ae550ca1dac19ed8f6a3767612d", 817191}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Mixed-Up Mother Goose - English DOS Floppy EGA (from omer_mor, bug report #3035354) @@ -1903,7 +1899,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "3490f85dab47e504c41b7eb3312e285e", 2598}, {"resource.001", 0, "d893892d62b3f061357291d66775e360", 239906}, {"resource.002", 0, "d893892d62b3f061357291d66775e360", 719398}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Mixed-Up Mother Goose v2.000 - English DOS Floppy (supplied by markcoolio in bug report #2723795) @@ -1911,7 +1907,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"mothergoose", "", { {"resource.map", 0, "52aae15e493cafd1da7e1c9b657a5bb9", 7026}, {"resource.000", 0, "b7ecd8ae9e254e80310b5a668b276e6e", 2948975}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Mixed-Up Mother Goose - English DOS CD (from jvprat) @@ -1920,7 +1916,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"mothergoose", "CD", { {"resource.map", 0, "1c7f311b0a2c927b2fbe81ae341fb2f6", 5790}, {"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 4369438}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Mixed-Up Mother Goose - English Windows Interactive Demo @@ -1928,9 +1924,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"mothergoose", "Demo", { {"resource.map", 0, "87f9dc1cafc4d4fa835fb2f00cf3a6ef", 4560}, {"resource.001", 0, "5a0ed1d745855148364de1b3be099bac", 2070072}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810) @@ -1938,7 +1933,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"mothergoosehires", "", { {"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741}, {"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish) @@ -1946,7 +1941,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"mothergoosehires", "", { {"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969}, {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, #endif // ENABLE_SCI32 @@ -1955,7 +1950,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"msastrochicken", "", { {"resource.map", 0, "5b457cbe5042f557e5b610148171f6c0", 1158}, {"resource.001", 0, "453ea81ef66a50cbe33ce06302afe47f", 229737}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 @@ -1976,7 +1971,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.006", 0, "3aae6559aa1df273bc542d5ac6330d75", 77901360}, {"resmap.007", 0, "afbd16ea77869a720afa1c5371de107d", 7972}, //{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Phantasmagoria - English DOS Demo @@ -1984,7 +1979,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"phantasmagoria", "Demo", { {"resmap.001", 0, "416138651ea828219ca454cae18341a3", 11518}, {"ressci.001", 0, "3aae6559aa1df273bc542d5ac6330d75", 65844612}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI3_GAMES @@ -2001,7 +1996,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.004", 0, "53f457cddb0dffc056593905c4cbb989", 42447131}, {"resmap.005", 0, "8bd5ceeedcbe16dfe55d1b90dcd4be84", 1942}, {"ressci.005", 0, "05f9fe2bee749659acb3cd2c90252fc5", 67905112}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, #endif // ENABLE_SCI3_GAMES @@ -2012,7 +2007,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pepper", "", { {"resource.map", 0, "72726dc81c1b4c1110c486be77369bc8", 5179}, {"resource.000", 0, "670d0c53622429f4b11275caf7f8d292", 5459574}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Pepper - English DOS Non-Interactive Demo @@ -2020,7 +2015,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pepper", "Demo", { {"resource.map", 0, "379bb4fb896630b14f2d91ed21e36ba1", 984}, {"resource.000", 0, "118f6c31a93ec7fd9a231c61125229e3", 645494}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Pepper - English DOS/Windows Interactive Demo @@ -2028,7 +2023,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pepper", "Demo", { {"resource.map", 0, "975e8df76106a5c13d12ab674f906a02", 2514}, {"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1698164}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Pepper - English DOS Interactive Demo @@ -2036,7 +2031,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pepper", "Demo", { {"resource.map", 0, "9c9b7b900651a370dd3fb38d478b1798", 2524}, {"resource.000", 0, "e6a918a2dd7a4bcecd8fb389f43287c2", 1713544}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Police Quest 1 VGA Remake - English DOS (from the Police Quest Collection) @@ -2044,7 +2039,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pq1sci", "VGA Remake", { {"resource.map", 0, "35efa814fb994b1cbdac9611e401da67", 5013}, {"resource.000", 0, "e0d5ddf34eda903a38f0837e2aa7145b", 6401433}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 2 - English Amiga (from www.back2roots.org) @@ -2055,7 +2050,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "523db0c07f1da2a822c2c39ee0482544", 179334}, {"resource.002", 0, "499737c21a28ac026e11ab817100d610", 511099}, {"resource.003", 0, "e008f5d6e2a7c4d4a0da0173e4fa8f8b", 553970}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Police Quest 2 - English DOS Non-Interactive Demo @@ -2063,7 +2058,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pq2", "Demo", { {"resource.map", 0, "8b77d0d4650c2052b356cece28294b58", 576}, {"resource.001", 0, "376ef6d6eaaeed66e1424bd219c4b9ab", 215398}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Police Quest 2 - English DOS (provided by richiefs in bug report #2670691) @@ -2076,7 +2071,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "77f02def3094af804fd2371db25b7100", 342149}, {"resource.005", 0, "77f02def3094af804fd2371db25b7100", 349899}, {"resource.006", 0, "77f02def3094af804fd2371db25b7100", 354991}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 2 - English DOS (from the Police Quest Collection) @@ -2086,7 +2081,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "77f02def3094af804fd2371db25b7100", 509525}, {"resource.002", 0, "77f02def3094af804fd2371db25b7100", 546000}, {"resource.003", 0, "77f02def3094af804fd2371db25b7100", 591851}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 2 - English DOS (from FRG) @@ -2096,7 +2091,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "77f02def3094af804fd2371db25b7100", 509760}, {"resource.002", 0, "77f02def3094af804fd2371db25b7100", 542897}, {"resource.003", 0, "77f02def3094af804fd2371db25b7100", 586857}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 2 English DOS 1.001.006 (supplied by merkur-kun in bug report #3028479) @@ -2105,7 +2100,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "77f02def3094af804fd2371db25b7100", 506563}, {"resource.002", 0, "77f02def3094af804fd2371db25b7100", 541261}, {"resource.003", 0, "77f02def3094af804fd2371db25b7100", 587511}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 2 - Japanese PC-98 @@ -2115,9 +2110,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 669319}, {"resource.002", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 637662}, {"resource.003", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 684395}, - {NULL, 0, NULL, 0}}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH - }, // also includes english language + AD_LISTEND}, + Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // also includes english language // Police Quest 3 - English Amiga // Executable scanning reports "1.004.024" @@ -2129,7 +2123,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "f7044bb08a1fcbe5077791ed8d4996f0", 691207}, {"resource.003", 0, "630bfa65beb05f743552704ac2899dae", 759891}, {"resource.004", 0, "7b229fbdf30d670d0728cede3e984a7e", 838663}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Police Quest 3 - German Amiga @@ -2143,9 +2137,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "87361c17fd863b58f98828de68770279", 682288}, {"resource.004", 0, "6258d5dd85898d8e218eb8113ebc9059", 722738}, {"resource.005", 0, "6258d5dd85898d8e218eb8113ebc9059", 704485}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Police Quest 3 - English DOS (from the Police Quest Collection) // Executable scanning reports "T.A00.178", VERSION file reports "1.00" @@ -2157,9 +2150,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "c18e0d408e4f4f40365d42aa15931f67", 1153561}, {"resource.003", 0, "8791b9eef53edf77c2dac950142221d3", 1159791}, {"resource.004", 0, "1b91e891a3c60a941dac0eecdf83375b", 1143606}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 3 - English DOS Non-Interactive Demo // Executable scanning reports "T.A00.052" @@ -2168,9 +2160,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "ec8e58e7663ae5173853abf6c76b52bb", 867}, {"resource.000", 0, "277f97771f7a6d89677141f02da313d6", 65150}, {"resource.001", 0, "5c5a551b6c86cce2ee75becb90e0b586", 624411}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Police Quest 3 - German DOS (supplied by markcoolio in bug report #2723837) // Executable scanning reports "T.A00.178" @@ -2182,18 +2173,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "cce99b96a578b62ff6cebdae8d122feb", 1179358}, {"resource.003", 0, "4836f460f4cfc8de61e2df4c45775504", 1180956}, {"resource.004", 0, "0c3eb84b9755852d9e795e0d5c9373c7", 1171760}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 4 - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.001.096 {"pq4", "Demo", { {"resource.map", 0, "be56f87a1c4a13062a30a362df860c2f", 1472}, {"resource.000", 0, "527d5684016e6816157cd15d9071b11b", 1121310}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // Police Quest 4 - English DOS (from the Police Quest Collection) @@ -2201,45 +2190,40 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"pq4", "", { {"resource.map", 0, "379dfe80ed6bd16c47e4b950c4722eac", 11374}, {"resource.000", 0, "fd316a09b628b7032248139003369022", 18841068}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 4 - English DOS // SCI interpreter version 2.000.000 (a guess?) {"pq4", "", { {"resource.map", 0, "aed9643158ccf01b71f359db33137f82", 9895}, {"resource.000", 0, "da383857b3be1e4514daeba2524359e0", 15141432}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 4 - French DOS (supplied by abevi in bug report #2612718) // SCI interpreter version 2.000.000 {"pq4", "", { {"resource.map", 0, "008030846edcc7c5c7a812c7f4ae4ceb", 9256}, {"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730153}, - {NULL, 0, NULL, 0}}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest 4 - German DOS (supplied by markcoolio in bug report #2723840) // SCI interpreter version 2.000.000 (a guess?) {"pq4", "", { {"resource.map", 0, "2393ee728ab930b2762cb5889f9b5aff", 9256}, {"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730155}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Police Quest: SWAT - English DOS/Windows Demo (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "0.001.200" {"pqswat", "Demo", { {"resource.map", 0, "8c96733ef94c21526792f7ca4e3f2120", 1648}, {"resource.000", 0, "d8892f1b8c56c8f7704325460f49b300", 3676175}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Police Quest: SWAT - English Windows (from the Police Quest Collection) // Executable scanning reports "2.100.002", VERSION file reports "1.0c" @@ -2253,9 +2237,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.003", 0, "00a755e917c442ca8cf1a1bea689e6fb", 45073980}, {"resmap.004", 0, "4228038906f041623e65789500b22285", 6835}, {"ressci.004", 0, "b7e619e6ecf62fe65d5116a3a422e5f0", 46223872}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, #endif // ENABLE_SCI32 // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by merkur in bug report #2718784) @@ -2267,7 +2250,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "439ba9b6dde216e6eb97ef3a9830fbe4", 646869}, {"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203}, {"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, @@ -2283,7 +2266,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "7288ed6d5da89b7a80b4af3897a7963a", 271185}, {"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852}, {"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, @@ -2294,9 +2277,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "a21451ef6fa8179bd4b22c4950004c44", 859959}, {"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1136968}, {"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 769897}, - {NULL, 0, NULL, 0}}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // Quest for Glory 1 - Japanese PC-98 5.25" Floppy // Executable scanning reports "S.old.201" @@ -2305,9 +2287,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "a21451ef6fa8179bd4b22c4950004c44", 864754}, {"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1147121}, {"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 777575}, - {NULL, 0, NULL, 0}}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // Quest for Glory 1 - English Amiga // Executable scanning reports "1.002.020" @@ -2320,9 +2301,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "16cd4414c37ae3bb6d6da33dce8e25e8", 654096}, {"resource.004", 0, "16cd4414c37ae3bb6d6da33dce8e25e8", 689124}, {"resource.005", 0, "5f3386ef2f2b1254e4a066f5d9027324", 609529}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Quest for Glory 1 (from abevi, bug report #2612718) {"qfg1", "", { @@ -2332,9 +2312,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "e64004e020fdf1813be52b639b08be89", 635561}, {"resource.003", 0, "f0af87c60ec869946da442833aa5afa8", 640502}, {"resource.004", 0, "f0af87c60ec869946da442833aa5afa8", 644575}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Quest for Glory 1 - English DOS // SCI interpreter version 0.000.629 @@ -2345,36 +2324,32 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "05ddce5f437a516b89ede2438fac09d8", 635734}, {"resource.003", 0, "951299a82a8134ed12c5c18118d45c2f", 640483}, {"resource.004", 0, "951299a82a8134ed12c5c18118d45c2f", 644443}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 1 VGA Remake - English DOS // Executable scanning reports "2.000.411" {"qfg1vga", "VGA Remake", { {"resource.map", 0, "a731fb6c9c0b282443f7027bc8694d4c", 8469}, {"resource.000", 0, "ecace1a2771846b1a8aa1afdd44111a0", 6570147}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 1 VGA Remake - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.001.029 {"qfg1vga", "VGA Remake, Demo", { {"resource.map", 0, "ac0257051c95a59c0cdc0be24d9b11fa", 729}, {"resource.000", 0, "ec6f5cf369054dd3e5392995e9975b9e", 768218}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Quest for Glory 1 VGA Remake - English Macintosh Floppy // VERSION file reports "2.0" {"qfg1vga", "VGA Remake", { {"Data1", 0, "14f26bc75f24bb1ecc94532df17b5371", 1768155}, {"Data2", 0, "a7aee8bd46fc9cef7fd3bea93ef173e0", 6586422}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NOSPEECH }, // Quest for Glory 2 - English Amiga // Executable scanning reports "1.003.004" @@ -2389,9 +2364,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "a77d2576c842b2b06da57d4ac8fc51c0", 579975}, {"resource.006", 0, "ccf5dba33e5cab6d5872838c0f8db44c", 500039}, {"resource.007", 0, "4c9fc1587545879295cb9627f56a2cb8", 575056}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Quest for Glory 2 - English (from FRG) // Executable scanning reports "1.000.072" @@ -2402,9 +2376,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "df137dc7869cab07e1149ba2333c815c", 790750}, {"resource.003", 0, "b192607c42f6960ecdf2ad2e4f90e9bc", 972804}, {"resource.004", 0, "cd2de58e27665d5853530de93fae7cd6", 983617}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 2 - English DOS // Executable scanning reports "1.000.072" @@ -2418,54 +2391,48 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "df137dc7869cab07e1149ba2333c815c", 478688}, {"resource.006", 0, "b1944bd664ddbd2859cdaa0c4a0d6281", 507489}, {"resource.007", 0, "cd2de58e27665d5853530de93fae7cd6", 490794}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 2 - English DOS Non-Interactive Demo // Executable scanning reports "1.000.046" {"qfg2", "Demo", { {"resource.map", 0, "e75eb86bdd517b3ef709058249986a87", 906}, {"resource.001", 0, "9b098f9e1008abe30e56c93b896494e6", 362123}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Quest for Glory 3 - English DOS Non-Interactive Demo (from FRG) // Executable scanning reports "1.001.021", VERSION file reports "1.000, 0.001.059, 6.12.92" {"qfg3", "Demo", { {"resource.map", 0, "fd71de9b588a45f085317caacf050e91", 687}, {"resource.000", 0, "b6c69bf6c18bf177492249fe81fc6a6d", 648702}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Quest for Glory 3 - English DOS // SCI interpreter version 1.001.050 {"qfg3", "", { {"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958}, {"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868000}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 3 - English DOS (supplied by abevi in bug report #2612718) // SCI interpreter version 1.001.050 {"qfg3", "", { {"resource.map", 0, "62c185d190363d7df06330fa0cc45b36", 5958}, {"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5867442}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 3 - German DOS (supplied by markcoolio in bug report #2723846) // Executable scanning reports "L.rry.083" {"qfg3", "", { {"resource.map", 0, "19e2bf9b693932b5e2bb59b9f9ab86c9", 5958}, {"resource.000", 0, "6178ad2e83e58e4671ca03315f7a6498", 5868042}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 3 - Spanish DOS CD (from jvprat) // Executable scanning reports "L.rry.083", VERSION file reports "1.000.000, June 30, 1994" @@ -2473,18 +2440,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "10809197c33a5e62819311d8a2f73f85", 5978}, {"resource.000", 0, "ba7ac86155e4c531e46cd73c86daa80a", 5884098}, {"resource.msg", 0, "a63974730d294dec0bea10057c36e506", 256014}, - {NULL, 0, NULL, 0}}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // Quest for Glory 4 - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.001.069 (just a guess) {"qfg4", "Demo", { {"resource.map", 0, "1ba7c7ae1efb315326d45cb931569b1b", 922}, {"resource.000", 0, "41ba03f0b188b029132daa3ece0d3e14", 623154}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // Quest for Glory 4 1.1 Floppy - English DOS (supplied by markcool in bug report #2723852) @@ -2492,36 +2457,32 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"qfg4", "", { {"resource.map", 0, "685bdb1ed47bbbb0e5e25db392da83ce", 9301}, {"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11004993}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 4 1.1 Floppy - English DOS (supplied by abevi in bug report #2612718) // SCI interpreter version 2.000.000 {"qfg4", "", { {"resource.map", 0, "d10a4cc177d2091d744e2ad8c049b0ae", 9295}, {"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11003589}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 4 1.1 Floppy - German DOS (supplied by markcool in bug report #2723850) // Executable scanning reports "2.000.000", VERSION file reports "1.1" {"qfg4", "", { {"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301}, {"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 4 - English DOS/Windows (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.0" {"qfg4", "", { {"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246}, {"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #endif @@ -2530,9 +2491,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "1846b57fe84774be72f7c50ab3c90df0", 2256126}, {"resource.map", 0, "21f85414124dc23e54544a5536dc35cd", 4044}, {"resource.msg", 0, "c44f51fb955eae266fecf360ebcd5ad2", 1132}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // RAMA - English DOS/Windows Demo @@ -2540,9 +2500,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"rama", "Demo", { {"resmap.001", 0, "775304e9b2a545156be4d94209550094", 1393}, {"ressci.001", 0, "259437fd75fdf51e8207fda8c01fa4fd", 2334384}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, #ifdef ENABLE_SCI3_GAMES // RAMA - English Windows (from jvprat) @@ -2554,9 +2513,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.002", 0, "2a68edd064e5e4937b5e9c74b38f2082", 128562138}, {"resmap.003", 0, "31ef4c0621711585d031f0ae81707251", 1636}, {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6860492}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, // RAMA - English Windows (from Quietust, in bug report #2850645) {"rama", "", { @@ -2566,18 +2524,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.002", 0, "2a68edd064e5e4937b5e9c74b38f2082", 128572432}, {"resmap.003", 0, "48841e4b84ef1b98b48d43566fda9e13", 1636}, {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6870356}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, // RAMA - Italian Windows CD (from glorifindel) // SCI interpreter version 3.000.000 (a guess?) {"rama", "", { {"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70611091}, {"resmap.001", 0, "70ba2ff04a2b7fb2c52420ba7fbd47c2", 8338}, - {NULL, 0, NULL, 0}}, - Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE }, #endif // ENABLE_SCI3_GAMES // Shivers - English Windows (from jvprat) @@ -2585,26 +2541,23 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"shivers", "", { {"resmap.000", 0, "f2ead37749ed8f6535a2445a7d05a0cc", 46525}, {"ressci.000", 0, "4294c6d7510935f2e0a52e302073c951", 262654836}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, // Shivers - German Windows (from Tobis87) {"shivers", "", { {"resmap.000", 0, "f483d0a1f78334c18052e92785c3086e", 46537}, {"ressci.000", 0, "6751b144671e2deed919eb9d284b07eb", 262390692}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NONE }, // Shivers - English Windows Demo // Executable scanning reports "2.100.002" {"shivers", "Demo", { {"resmap.000", 0, "d9e0bc5eddefcbe47f528760085d8927", 1186}, {"ressci.000", 0, "3a93c6340b54e07e65d0e5583354d186", 10505469}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, #ifdef ENABLE_SCI3_GAMES @@ -2613,16 +2566,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"shivers2", "Demo", { {"resmap.000", 0, "d8659188b84beaef076bd869837cd530", 634}, {"ressci.000", 0, "7fbac0807a044c9543e8ac376d200e59", 4925003}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, // Shivers 2 - English Windows (from abevi) // VERSION.TXT Version 1.0 (3/25/97) {"shivers2", "", { {"ressci.001", 0, "a79d03d6eb75be0a79324f14e3d2ace4", 95346793}, {"resmap.001", 0, "a4804d436d90c4ec2e46b537f5e954db", 6268}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, #endif //ENABLE_SCI3_GAMES @@ -2635,9 +2587,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "61b4f74039399e5aa1e737b16d0fc023", 1409}, {"resource.msg", 0, "1aeafe2b495de288d002109650b66614", 1364}, {"resource.000", 0, "8e10d4f05c1fd9f883384fa38a898489", 377394}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Space Quest 1 VGA Remake - English Amiga (from www.back2roots.org) // SCI interpreter version 1.000.510 (just a guess) @@ -2649,9 +2600,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "2588c1c2ca8b9bed0e3411948c0856a9", 839302}, {"resource.004", 0, "b25a1539c71701f7715f738c5037e9a6", 775515}, {"resource.005", 0, "640ffe1a9acde392cc33cc1b1a528328", 806324}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Space Quest 1 VGA Remake - English DOS (from the Space Quest Collection) // Executable scanning reports "T.A00.081", VERSION file reports "2.000" @@ -2663,9 +2613,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "a9e847c687529481f3a22b9bf01f45f7", 1169831}, {"resource.003", 0, "c47600e50c6fc591957ae0c5020ee7b8", 1213262}, {"resource.004", 0, "e19ea4ad131472f9238590f2e1d40289", 1203051}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 1 VGA Remake - English Mac (from Fingolfin) {"sq1sci", "VGA Remake", { @@ -2675,18 +2624,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "96860704f7a07ecc10bef223b4b2f153", 1273992}, {"resource.003", 0, "ae46e195e66df5a131917f0aa80b5669", 1242794}, {"resource.004", 0, "91d58a9eb2187c38424990afe4c12bc6", 1250949}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, // Space Quest 1 VGA Remake - English Non-Interactive Demo (from FRG) // SCI interpreter version 1.000.181 {"sq1sci", "VGA Remake, Demo", { {"resource.map", 0, "5af709ac5e0e923e0b8174f49978c30e", 636}, {"resource.001", 0, "fd99ea43f57576ded7c86036996346cf", 507642}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Space Quest 1 VGA Remake - Spanish DOS Floppy (from jvprat) // Executable scanning reports "T.A00.081", VERSION file reports "2.000" @@ -2699,9 +2646,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "8c22700a02991b763f512f837636b3ca", 1211307}, {"resource.004", 0, "9b78228ad4f9f335fedf74f1812dcfca", 513325}, {"resource.005", 0, "7d4ebcb745c0bf8fc42e4013f52ecd49", 1101812}, - {NULL, 0, NULL, 0}}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 3 - English Amiga (from www.back2roots.org) // SCI interpreter version 0.000.453 (just a guess) @@ -2711,7 +2657,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 754432}, {"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 746496}, {"resource.004", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 761984}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Space Quest 3 - German Amiga @@ -2724,7 +2670,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 712374}, {"resource.004", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 545053}, {"resource.005", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 687507}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Space Quest 3 - English DOS Non-Interactive Demo @@ -2732,7 +2678,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"sq3", "Demo", { {"resource.map", 0, "ec66ac2b1ce58b2575ba00b65058de1a", 612}, {"resource.001", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 180245}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Space Quest 3 - English DOS (provided by richiefs in bug report #2670691) @@ -2742,7 +2688,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 485158}, {"resource.002", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 720244}, {"resource.003", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 688367}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 3 - English DOS (from the Space Quest Collection) @@ -2752,7 +2698,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 490247}, {"resource.002", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 715777}, {"resource.003", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 703370}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 3 - English DOS (from abevi, bug report #2612718) @@ -2764,7 +2710,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 321222}, {"resource.005", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 328278}, {"resource.006", 0, "ceeda7202b96e5c85ecaa88a40a540fc", 356702}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 3 - English Mac (from Fingolfin) @@ -2773,7 +2719,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "0d8dfe42683b46f3131823233a91ce6a", 771917}, {"resource.002", 0, "0d8dfe42683b46f3131823233a91ce6a", 794072}, {"resource.003", 0, "0d8dfe42683b46f3131823233a91ce6a", 776536}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, // Space Quest 3 - German DOS (from Tobis87) @@ -2787,7 +2733,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "9107c2aa5398e28b5c5406df13491f85", 322107}, {"resource.006", 0, "9107c2aa5398e28b5c5406df13491f85", 320643}, {"resource.007", 0, "9107c2aa5398e28b5c5406df13491f85", 344287}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 3 v1.052 - German DOS (supplied by markcoolio in bug report #2723860) @@ -2797,7 +2743,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "9107c2aa5398e28b5c5406df13491f85", 567245}, {"resource.002", 0, "9107c2aa5398e28b5c5406df13491f85", 596768}, {"resource.003", 0, "9107c2aa5398e28b5c5406df13491f85", 693573}, - {NULL, 0, NULL, 0}}, + AD_LISTEND}, Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 - English Amiga @@ -2812,9 +2758,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "1887ed88bb34ae7238650e8f77f26315", 798226}, {"resource.005", 0, "3540d1cc84d674cf4b2c898b88a3b563", 790296}, {"resource.006", 0, "ade814bc4d56244c156d9e9bcfebbc11", 664085}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, // Space Quest 4 - German Amiga (from www.back2roots.org) // SCI interpreter version 1.000.200 (just a guess) @@ -2827,9 +2772,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "99c6a017da5e769a3b427ca52c8a564f", 824601}, {"resource.005", 0, "10ee1709e6559c724676d058199b75b5", 818745}, {"resource.006", 0, "67fb188b191d88efe8414af6ea297b93", 672675}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, #if 0 // Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD= @@ -2838,9 +2782,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"sq4", "", { {"resource.map", 0, "a18088c8aceb06025dbc945f29e02935", 5124}, {"resource.000", 0, "e1f46832cd2458796028e054a0466031", 5502009}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #endif // Space Quest 4 - English DOS @@ -2849,9 +2792,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"sq4", "", { {"resource.map", 0, "71ccf4f82ac4efb588731acfb7bf2603", 5646}, {"resource.000", 0, "e1f46832cd2458796028e054a0466031", 933928}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 1.052 - English DOS Floppy (supplied by markcoolio in bug report #2723865) // Executable scanning reports "1.000.753" @@ -2864,9 +2806,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "96fa33d89d838bc3f671c5b953e7a896", 1240130}, {"resource.004", 0, "ff9c87da3bc53473fdee8b9d3edbc93c", 1200631}, {"resource.005", 0, "e33019ac19f755ae33fbf49b4fc9066c", 1053294}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 1.000 - English DOS Floppy (from abevi, bug report #2612718) {"sq4", "", { @@ -2877,9 +2818,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "47ee647b5b12232d27e63cc627c25899", 1321146}, {"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368}, {"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 - German DOS (from Tobis87) // SCI interpreter version 1.000.200 (just a guess) @@ -2892,9 +2832,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "b8d6efbd3235329bfe844c794097b2c9", 1064761}, {"resource.005", 0, "47ee647b5b12232d27e63cc627c25899", 1156765}, {"resource.006", 0, "dfb023e4e2a1e7a00fa18f9ede72a91b", 924059}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 - Italian DOS Floppy (from glorifindel) // SCI interpreter version 1.000.200 (just a guess) @@ -2906,9 +2845,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "5289000399d503b59da9e23129256f1a", 1325546}, {"resource.004", 0, "4277c61bed40a50dadc4b5a344520af2", 1251000}, {"resource.005", 0, "5f885abd335978e2fd4e5f886d7676c8", 1102880}, - {NULL, 0, NULL, 0}}, - Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 - Japanese PC-98 5.25" Floppy // SCI interpreter version 1.000.1068 @@ -2917,9 +2855,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "161d719f38ed98d33f058a8cf3dc09c3", 952909}, {"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088}, {"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249}, - {NULL, 0, NULL, 0}}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // Space Quest 4 - Japanese PC-98 5.25" Floppy // SCI interpreter version 1.000.1068 @@ -2928,18 +2865,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "161d719f38ed98d33f058a8cf3dc09c3", 952909}, {"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088}, {"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC98, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // Space Quest 4 - English DOS CD (from the Space Quest Collection) // Executable scanning reports "1.001.064", VERSION file reports "1.0" {"sq4", "CD", { {"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054}, {"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 4 - Spanish DOS CD (from jvprat) // Executable scanning reports "1.SQ4.057", VERSION file reports "1.000" @@ -2952,9 +2887,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "42a307941edeb1a3be31daeb2e4be90b", 1319306}, {"resource.004", 0, "776fba81c110d1908776232cbe190e20", 1253752}, {"resource.005", 0, "55fae26c2a92f16ef72c1e216e827c0f", 1098328}, - {NULL, 0, NULL, 0}}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 4 - Spanish DOS Floppy (from jvprat) // Executable scanning reports "1.SQ4.056", VERSION file reports "1.000" @@ -2965,9 +2899,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "567608beb69d9dffdb42a8f39cb11a5e", 994323}, {"resource.002", 0, "74c62fa2146ff3b3b2ea2b3fb95b9af9", 1140801}, {"resource.003", 0, "42a307941edeb1a3be31daeb2e4be90b", 1088408}, - {NULL, 0, NULL, 0}}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 1.000 - German DOS Floppy (supplied by markcoolio in bug report #2723862) // Executable scanning reports "1.SQ4.030" @@ -2980,9 +2913,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "47ee647b5b12232d27e63cc627c25899", 1321146}, {"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368}, {"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 4 - English Macintosh // Executable scanning reports "x.yyy.zzz" @@ -2996,9 +2928,8 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "20fc54556ebfc737506288a1a32f7705", 364217}, {"resource.005", 0, "869d16cab6641c80b06f4dcee18f86bc", 1426228}, {"resource.006", 0, "91d23407bc0447a3722fbeb952d7edee", 1402451}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, // Space Quest 5 - English DOS (from the Space Quest Collection) // Executable scanning reports "1.001.068", VERSION file reports "1.04" @@ -3006,18 +2937,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "66317c12ac6e818d1f7c17e83c1d9819", 6143}, {"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486}, {"resource.msg", 0, "bb8ad78793c26bdb3f77498b1d6515a9", 125988}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 5 - English DOS // SCI interpreter version 1.001.067 {"sq5", "", { {"resource.map", 0, "8bde0a9adb9a3e9aaa861826874c9834", 6473}, {"resource.000", 0, "f4a48705764544d7cc64a7bb22a610df", 6025184}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 5 v1.04 - German DOS (from Tobis87, updated information by markcool from bug reports #2723935 and #2724762) // SCI interpreter version 1.001.068 @@ -3025,27 +2954,24 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "66317c12ac6e818d1f7c17e83c1d9819", 6143}, {"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486}, {"resource.msg", 0, "7c71cfc36153cfe07b450423a51f7e68", 146282}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 5 v1.04 - French DOS (from Hkz, Included in Space Quest Collector's Edition, with chapters I-V) {"sq5", "", { {"resource.map", 0, "66317c12ac6e818d1f7c17e83c1d9819", 6143}, {"resource.000", 0, "4147edc5045e6d62998018b5614c58ec", 5496486}, {"resource.msg", 0, "877c42380320eb1db7dad83ccd261214", 140374}, - {NULL, 0, NULL, 0}}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Space Quest 5 - Italian DOS Floppy (from glorifindel) // SCI interpreter version 1.001.068 (just a guess) {"sq5", "", { {"resource.000", 0, "5040026519f37199f3616fb1d4704dff", 6047170}, {"resource.map", 0, "5b09168baa2f6e2e22787429b2d72f54", 6492}, - {NULL, 0, NULL, 0}}, - Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // Space Quest 6 - English DOS/Win3.11 CD (from the Space Quest Collection) @@ -3053,45 +2979,40 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"sq6", "", { {"resource.map", 0, "6dddfa3a8f3a3a513ec9dfdfae955005", 10528}, {"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 6 - English DOS/Win3.11 CD ver 1.11 (from FRG) // SCI interpreter version 2.100.002 (just a guess) {"sq6", "", { {"resource.map", 0, "e0615d6e4e10e37ae42e6a2a95aaf145", 10528}, {"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 6 - French DOS/Win3.11 CD (from French magazine Joystick - September 1997) // Executable scanning reports "2.100.002", VERSION file reports "1.0" {"sq6", "", { {"resource.map", 0, "3c831625931d5079b73ae8c275f52c95", 10534}, {"resource.000", 0, "4195ca940f759424f62b90e262cc1737", 40932397}, - {NULL, 0, NULL, 0}}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 6 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723884) // SCI interpreter version 2.100.002 (just a guess) {"sq6", "", { {"resource.map", 0, "664d797415484f85c90b1b45aedc7686", 10534}, {"resource.000", 0, "ba87ba91e5bdabb4169dd0df75777722", 40933685}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, // Space Quest 6 - English DOS/Win3.11 Interactive Demo (from FRG) // SCI interpreter version 2.100.002 (just a guess) {"sq6", "Demo", { {"resource.map", 0, "368f07b07433db3f819fa3fa0e5efee5", 2572}, {"resource.000", 0, "ab12724e078dea34b624e0d2a38dcd7c", 2272050}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #endif // ENABLE_SCI32 // The Island of Dr. Brain - English DOS CD (from jvprat) @@ -3099,27 +3020,24 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"islandbrain", "", { {"resource.map", 0, "2388efef8430b041b0f3b00b9050e4a2", 3281}, {"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 2103560}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, // The Island of Dr. Brain - English DOS (from Quietust) // Executable scanning reports "1.001.053", VERSION file reports "1.1 2.3.93" {"islandbrain", "", { {"resource.map", 0, "3c07da06bdd1689f9d07af78fb94d0ec", 3101}, {"resource.000", 0, "ecc686e0034fb4d41de077ac7167b3cf", 1947866}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // The Island of Dr. Brain - English DOS Non-Interactive Demo // SCI interpreter version 1.001.053 (just a guess) {"islandbrain", "Demo", { {"resource.map", 0, "a8e5ca8ed1996974afa59f4c45e06195", 986}, {"resource.000", 0, "b3acd9b9dd7fe53c4ee133ac9a1acfab", 586560}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, #ifdef ENABLE_SCI32 // Torin's Passage - English Windows Interactive Demo @@ -3127,18 +3045,16 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"torin", "Demo", { {"resmap.000", 0, "9a3e172cde9963d0a969f26469318cec", 3403}, {"ressci.000", 0, "db3e290481c35c3224e9602e71e4a1f1", 5073868}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, // Torin's Passage - English Windows // SCI interpreter version 2.100.002 (just a guess) {"torin", "", { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, - {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // Torin's Passage - Spanish Windows (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.0" @@ -3146,36 +3062,32 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, // TODO: depend on one of the patches? - {NULL, 0, NULL, 0}}, - Common::ES_ESP, Common::kPlatformWindows, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::ES_ESP, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // Torin's Passage - French Windows // SCI interpreter version 2.100.002 (just a guess) {"torin", "", { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, - {NULL, 0, NULL, 0}}, - Common::FR_FRA, Common::kPlatformWindows, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::FR_FRA, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // Torin's Passage - German Windows // SCI interpreter version 2.100.002 (just a guess) {"torin", "", { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, - {NULL, 0, NULL, 0}}, - Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NOSPEECH - }, + AD_LISTEND}, + Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, // Torin's Passage - Italian Windows CD (from glorifindel) // SCI interpreter version 2.100.002 (just a guess) {"torin", "", { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, - {NULL, 0, NULL, 0}}, - Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE - }, + AD_LISTEND}, + Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE }, #endif // ENABLE_SCI32 // SCI Fanmade Games -- cgit v1.2.3 From 7c5c3faae2b1d54887059bc29e3d8515648f1837 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 21:17:00 +0000 Subject: AdvancedDetector: Introduce new flag GF_ADDENGLISH It is convenient for localized games which always have English as fallback, thus English will be selectable from GUI. svn-id: r51593 --- engines/advancedDetector.cpp | 3 +++ engines/advancedDetector.h | 1 + 2 files changed, 4 insertions(+) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 315763a6da..61e6a9de73 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -209,6 +209,9 @@ static void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription * desc.setGUIOptions(realDesc->guioptions | params.guioptions); desc.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(realDesc->language)); + + if (realDesc->flags & ADGF_ADDENGLISH) + desc.appendGUIOptions(getGameGUIOptionsDescriptionLanguage(Common::EN_ANY)); } GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const { diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 94c346813c..1e59df04bf 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -45,6 +45,7 @@ struct ADGameFileDescription { enum ADGameFlags { ADGF_NO_FLAGS = 0, + ADGF_ADDENGLISH = (1 << 24), // always add English as language option ADGF_MACRESFORK = (1 << 25), // the md5 for this entry will be calculated from the resource fork ADGF_USEEXTRAASTITLE = (1 << 26), // Extra field value will be used as main game title, not gameid ADGF_KEEPMATCH = (1 << 27), // this entry is kept even when there are matched entries with more files -- cgit v1.2.3 From e0fb6b0bbfafc1377f002e3807ba96f0fb6bf0af Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Aug 2010 21:18:08 +0000 Subject: SCI: Use new AD flag for German LSL5 which is dual-language svn-id: r51594 --- engines/sci/detection_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 3414174ae7..e49dcbd448 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1611,7 +1611,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1021774}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 993408}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 5 - French DOS (provided by richiefs in bug report #2670691) // Executable scanning reports "1.lsl5.019" -- cgit v1.2.3 From f2838316cb55fc743e68ff1768350fcca5ce08fc Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 1 Aug 2010 21:30:15 +0000 Subject: create_msvc: Fix SCUMMVM_LIBS support for MSVC2010. svn-id: r51595 --- tools/create_msvc/create_msvc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/create_msvc/create_msvc.cpp b/tools/create_msvc/create_msvc.cpp index 2d3e47c73a..1c395b01aa 100644 --- a/tools/create_msvc/create_msvc.cpp +++ b/tools/create_msvc/create_msvc.cpp @@ -1665,7 +1665,7 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b "\t\tName=\"VCCLCompilerTool\"\n" "\t\tDisableLanguageExtensions=\"true\"\n" "\t\tDisableSpecificWarnings=\"" << _globalWarnings << "\"\n" - "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;%(SCUMMVM_LIBS)\\include\"\n" + "\t\tAdditionalIncludeDirectories=\"" << prefix << ";" << prefix << "\\engines;$(SCUMMVM_LIBS)\\include\"\n" "\t\tPreprocessorDefinitions=\"" << defines << "\"\n" "\t\tExceptionHandling=\"0\"\n" "\t\tRuntimeTypeInfo=\"false\"\n" @@ -1682,7 +1682,7 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b "\t\tIgnoreDefaultLibraryNames=\"\"\n" "\t\tSubSystem=\"1\"\n" "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n" - "\t\tAdditionalLibraryDirectories=\"%(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << "\"\n" + "\t\tAdditionalLibraryDirectories=\"$(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << "\"\n" "\t/>\n" "\t\n" "\t\t<_ProjectFileVersion>10.0.30319.1\n" "\t\t<_PropertySheetDisplayName>ScummVM_Global\n" - "\t\t%(SCUMMVM_LIBS)\\bin;$(ExecutablePath)\n" - "\t\t%(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << ";$(LibraryPath)\n" - "\t\t%(SCUMMVM_LIBS)\\include;$(IncludePath)\n" + "\t\t$(SCUMMVM_LIBS)\\bin;$(ExecutablePath)\n" + "\t\t$(SCUMMVM_LIBS)\\libs\\" << (isWin32 ? "x86" : "x64") << ";$(LibraryPath)\n" + "\t\t$(SCUMMVM_LIBS)\\include;$(IncludePath)\n" "\t\t$(Configuration)" << bits << "\\\n" "\t\t$(Configuration)" << bits << "/$(ProjectName)\\\n" "\t\n" -- cgit v1.2.3 From 575d38f602f7d9356f1849f5599008b2fef0e81a Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 1 Aug 2010 21:41:43 +0000 Subject: i18n: Adding Spanish and Ukrainian translations svn-id: r51596 --- AUTHORS | 6 + common/messages.cpp | 1964 ++++++++++++++++++++++++++++++++++----------------- gui/credits.h | 6 + po/es_ES.po | 1428 +++++++++++++++++++++++++++++++++++++ po/uk_UA.po | 1433 +++++++++++++++++++++++++++++++++++++ tools/credits.pl | 6 + 6 files changed, 4182 insertions(+), 661 deletions(-) create mode 100644 po/es_ES.po create mode 100644 po/uk_UA.po diff --git a/AUTHORS b/AUTHORS index 2891db3cb0..76ff47e9db 100644 --- a/AUTHORS +++ b/AUTHORS @@ -339,6 +339,12 @@ Other contributions Russian: Eugene Sandulenko + Spanish: + Tomas Maidagan + + Ukrainian: + Lubomyr Lisen + Websites (design) ----------------- Dobo Balazs - Website design diff --git a/common/messages.cpp b/common/messages.cpp index e43e5c8ac2..b21454d02d 100644 --- a/common/messages.cpp +++ b/common/messages.cpp @@ -645,642 +645,1021 @@ static const PoMessageEntry _translation_ru_RU[] = { { -1, NULL } }; -static const PoMessageEntry _translation_fr_FR[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:18+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, - { 1, "Voulez-vous vraiment quitter?" }, - { 2, "(Actif)" }, - { 3, "(Jeu)" }, - { 4, "(Global)" }, - { 5, "(compil\351 sur %s)" }, - { 6, ", \351chec du montage du disque partag\351" }, - { 7, ", disque partag\351 non mont\351" }, - { 8, "... en cours ..." }, - { 9, "11 kHz" }, +static const PoMessageEntry _translation_it_IT[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, + { 1, " Sei sicuro di voler uscire? " }, + { 2, " (Attivo)" }, + { 3, " (Gioco)" }, + { 4, " (Globale)" }, + { 5, "(build creata il %s)" }, + { 6, ", errore nel montare la condivisione" }, + { 7, ", condivisione non montata" }, + { 8, "... progresso ..." }, + { 9, "11kHz" }, { 10, "22 kHz" }, { 11, "44 kHz" }, { 12, "48 kHz" }, { 13, "8 kHz" }, - { 14, "" }, - { 15, "\300 propos de ScummVM" }, - { 16, "\311mulateur AdLib" }, - { 17, "\311mulateur AdLib:" }, - { 18, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, - { 19, "Ajouter..." }, - { 20, "Anti-cr\351nel\351 (16 bpp)" }, - { 21, "Correction du rapport d'aspect" }, - { 22, "Touche associ\351e: %s" }, - { 23, "Touche associ\351e: aucune" }, + { 14, "" }, + { 15, "Informazioni su ScummVM" }, + { 16, "Emulatore AdLib" }, + { 17, "Emulatore AdLib:" }, + { 18, "AdLib \350 utilizzato per la musica in molti giochi" }, + { 19, "Aggiungi gioco..." }, + { 20, "Renderer con antialiasing (16bpp)" }, + { 21, "Correzione proporzioni" }, + { 22, "Tasto associato: %s" }, + { 23, "Tasto associato: nessuno" }, { 24, "Audio" }, - { 25, "Sauvegarde auto:" }, - { 26, "Moteurs disponibles:" }, - { 27, "\300 ~P~ropos..." }, - { 28, "Affecter les touches" }, - { 29, "Les deux" }, - { 30, "Luminosit\351:" }, - { 31, "Annuler" }, - { 32, "Impossible de cr\351er le fichier" }, - { 33, "Change les options du jeu" }, - { 34, "Change les options globales de ScummVM" }, - { 35, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, - { 36, "Choisir" }, - { 37, "S\351lectionnez une action \340 affecter" }, - { 38, "Effacer la valeur" }, - { 39, "Fermer" }, - { 40, "Corrige le rapport d'aspect pour les jeu 320x200" }, - { 41, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, - { 42, "Mode vid\351o actuel" }, - { 43, "Bas" }, - { 44, "Gauche" }, - { 45, "Droit" }, - { 46, "Haut" }, - { 47, "\311mulateur DOSBox OPL" }, + { 25, "Autosalva:" }, + { 26, "Motori disponibili:" }, + { 27, "~I~nfo..." }, + { 28, "Associa tasti" }, + { 29, "Entrambi" }, + { 30, "Luminosit\340:" }, + { 31, "Annulla" }, + { 32, "Impossibile creare il file" }, + { 33, "Modifica le opzioni di gioco" }, + { 34, "Modifica le opzioni globali di ScummVM" }, + { 35, "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland che \350 connesso al tuo computer" }, + { 36, "Scegli" }, + { 37, "Scegli un'azione da mappare" }, + { 38, "Cancella" }, + { 39, "Chiudi" }, + { 40, "Corregge le proporzioni dei giochi 320x200" }, + { 41, "Impossibile trovare un motore in grado di eseguire il gioco selezionato" }, + { 42, "Modalit\340 video attuale:" }, + { 43, "Cursore gi\371" }, + { 44, "Cursore a sinistra" }, + { 45, "Cursore a destra" }, + { 46, "Cursore su" }, + { 47, "Emulatore OPL DOSBox" }, { 48, "DVD" }, - { 49, "DVD mont\351 avec succ\350s" }, - { 50, "DVD non mont\351" }, - { 51, "Date:" }, + { 49, "DVD montato con successo" }, + { 50, "DVD non montato" }, + { 51, "Data: " }, { 52, "Debugger" }, - { 53, "D\351faut" }, - { 54, "Supprimer" }, - { 55, "D\351sactiv\351 l'extinction" }, - { 56, "GFX d\351sactiv\351" }, - { 57, "%d nouveaux jeux trouv\351s ..." }, - { 58, "%d nouveaux jeux trouv\351s." }, - { 59, "Affichage" }, - { 60, "Afficher le clavier" }, - { 61, "Voulez-vous vraiment supprimer cette sauvegarde?" }, - { 62, "Voulez-vous vraiment supprimer ce jeu?" }, - { 63, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, - { 64, "Voulez-vous charger ou sauver le jeu?" }, - { 65, "Voulez-vous ex\351cuter une recherche automatique?" }, - { 66, "Voulez-vous quitter?" }, - { 67, "Coup double" }, - { 68, "Bas" }, - { 69, "Activer le mode Roland GS" }, - { 70, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, - { 71, "Anglais" }, - { 72, "Erreur lors de l'\351x\351cution du jeu:" }, - { 73, "\311chec du montage du DVD" }, - { 74, "Extra:" }, - { 75, "\311mulateur FM Towns" }, - { 76, "Mode rapide" }, - { 77, "Options incluses:" }, - { 78, "Regarder autour" }, - { 79, "Nom complet du jeu" }, - { 80, "Plein \351cran" }, - { 81, "Acceleration du pad GC:" }, - { 82, "Sensibilit\351 du pad GC:" }, - { 83, "GFX" }, - { 84, "Sortie GM:" }, - { 85, "Langue:" }, - { 86, "Interface:" }, - { 87, "Jeu" }, - { 88, "Fichier de don\351es introuvable" }, - { 89, "ID de jeu non support\351" }, - { 90, "Chemin du Jeu:" }, - { 91, "Menu global" }, - { 92, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, - { 93, "Remonter" }, - { 94, "Graphique" }, - { 95, "Mode graphique:" }, - { 96, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, - { 97, "Hercules Ambre" }, - { 98, "Hercules Vert" }, - { 99, "Cach\351 la barre d'outils" }, - { 100, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, - { 101, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, - { 102, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, - { 103, "Underscan horizontal:" }, - { 104, "\311mulateur IBM PCjr" }, + { 53, "Predefinito" }, + { 54, "Elimina" }, + { 55, "Disattiva spegnimento in chiusura" }, + { 56, "Grafica disattivata" }, + { 57, "Rilevati %d nuovi giochi..." }, + { 58, "Rilevati %d nuovi giochi." }, + { 59, "Visualizza " }, + { 60, "Mostra tastiera" }, + { 61, "Sei sicuro di voler eliminare questo salvataggio?" }, + { 62, "Sei sicuro di voler rimuovere questa configurazione di gioco?" }, + { 63, "Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." }, + { 64, "Vuoi caricare o salvare il gioco?" }, + { 65, "Vuoi eseguire una scansione automatica?" }, + { 66, "Sei sicuro di voler uscire?" }, + { 67, "Double-strike" }, + { 68, "Gi\371" }, + { 69, "Attiva la modalit\340 Roland GS" }, + { 70, "Il motore non supporta il livello di debug '%s'" }, + { 71, "Inglese" }, + { 72, "Errore nell'esecuzione del gioco:" }, + { 73, "Errore nel montare il DVD" }, + { 74, "Percorso extra:" }, + { 75, "Emulatore FM Towns" }, + { 76, "Modalit\340 veloce" }, + { 77, "Funzionalit\340 compilate in:" }, + { 78, "Osservazione libera" }, + { 79, "Titolo completo del gioco" }, + { 80, "Modalit\340 a schermo intero" }, + { 81, "Accelerazione pad GC:" }, + { 82, "Sensibilit\340 pad GC:" }, + { 83, "Grafica" }, + { 84, "Dispositivo GM:" }, + { 85, "Lingua GUI:" }, + { 86, "Renderer GUI:" }, + { 87, "Gioco" }, + { 88, "Dati di gioco non trovati" }, + { 89, "ID di gioco non supportato" }, + { 90, "Percorso gioco:" }, + { 91, "Menu globale" }, + { 92, "Vai alla cartella superiore" }, + { 93, "Cartella superiore" }, + { 94, "Grafica" }, + { 95, "Modalit\340:" }, + { 96, "Ridimensionamento hardware (veloce, ma di bassa qualit\340)" }, + { 97, "Hercules ambra" }, + { 98, "Hercules verde" }, + { 99, "Nascondi la barra degli strumenti" }, + { 100, "Audio ad alta qualit\340 (pi\371 lento) (riavviare)" }, + { 101, "Valori pi\371 alti restituiscono un suono di maggior qualit\340, ma potrebbero non essere supportati dalla tua scheda audio" }, + { 102, "Tieni premuto Shift per l'aggiunta in massa" }, + { 103, "Underscan orizzontale:" }, + { 104, "Emulatore IBM PCjr" }, { 105, "ID:" }, - { 106, "Initialiser le r\351seau" }, - { 107, "\311chelle initiale de l'\351cran du haut" }, - { 108, "Initialisation de l'\311mulateur MT-32" }, - { 109, "Initialisation du r\351seau" }, - { 110, "Entr\351e" }, - { 111, "Chemin Invalide" }, - { 112, "Affectation des touches" }, - { 113, "Clavier" }, - { 114, "Affectation des touches:" }, - { 115, "Touches" }, - { 116, "Langue de l'interface graphique de ScummVM" }, - { 117, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, - { 118, "Langue:" }, - { 119, "Gauche" }, - { 120, "Clic Gauche" }, - { 121, "Charger" }, - { 122, "Charger le jeu:" }, - { 123, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, - { 124, "\311mulateur MAME OPL" }, + { 106, "Avvia rete" }, + { 107, "Schermo in primo piano:" }, + { 108, "Avvio in corso dell'emulatore MT-32" }, + { 109, "Avvio rete in corso" }, + { 110, "Input" }, + { 111, "Percorso non valido" }, + { 112, "Programmatore tasti" }, + { 113, "Tastiera" }, + { 114, "Mappa tasti:" }, + { 115, "Tasti" }, + { 116, "Lingua dell'interfaccia grafica di ScummVM" }, + { 117, "Lingua del gioco. Un gioco inglese non potr\340 risultare tradotto in italiano" }, + { 118, "Lingua:" }, + { 119, "Sinistra" }, + { 120, "Clic sinistro" }, + { 121, "Carica" }, + { 122, "Carica gioco:" }, + { 123, "Carica un salvataggio del gioco selezionato" }, + { 124, "Emulatore OPL MAME" }, { 125, "MIDI" }, - { 126, "Gain MIDI:" }, - { 127, "MT-32" }, - { 128, "Sortie MT-32:" }, - { 129, "\311mulateur MT-32" }, - { 130, "\311chelle de l'\351cran principal" }, - { 131, "Affecter" }, - { 132, "Ajout Massif..." }, + { 126, "Guadagno MIDI:" }, + { 128, "Disposit. MT32:" }, + { 129, "Emulatore MT-32" }, + { 130, "Schermo principale:" }, + { 131, "Mappa" }, + { 132, "Agg. in massa..." }, { 133, "Menu" }, - { 134, "Divers" }, - { 135, "Mode mixe AdLib/MIDI" }, - { 136, "Monter le DVD" }, - { 137, "Monter SMB" }, - { 138, "Clic de souris" }, - { 139, "Fonction Multiple" }, - { 140, "Sortie Audio:" }, - { 141, "Volume Musique:" }, - { 142, "Silence" }, - { 143, "Nom:" }, - { 144, "R\351seau d\351connect\351" }, - { 145, "R\351seau non initialis\351 (%d)" }, - { 146, "R\351seau connect\351" }, - { 147, "R\351seau connect\351, disque partag\351 mont\351" }, - { 148, "Jamais" }, - { 149, "Non" }, - { 150, "Date non sauv\351e" }, - { 151, "Pas de musique" }, - { 152, "Dur\351e de jeu non sauv\351e" }, - { 153, "Heure non sauv\351e" }, - { 154, "Aucun" }, - { 155, "Normal (\351chelle d'origine)" }, + { 134, "Varie" }, + { 135, "Modalit\340 mista AdLib/MIDI" }, + { 136, "Monta DVD" }, + { 137, "Monta SMB" }, + { 138, "Clic del mouse" }, + { 139, "Multifunzione" }, + { 140, "Dispositivo GM:" }, + { 141, "Volume musica:" }, + { 142, "Disattiva audio" }, + { 143, "Nome:" }, + { 144, "Rete disattivata" }, + { 145, "Rete non avviata (%d)" }, + { 146, "Rete attiva" }, + { 147, "Rete attiva, condivisione montata" }, + { 148, "Mai" }, + { 149, "No" }, + { 150, "Nessuna data salvata" }, + { 151, "Nessuna musica" }, + { 152, "Nessun tempo salvato" }, + { 153, "Nessun orario salvato" }, + { 154, "Nessuno" }, + { 155, "Normale (nessun ridimensionamento)" }, { 156, "OK" }, - { 157, "Fr\351quence:" }, - { 158, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, - { 159, "Utiliser des r\351glages MT-32 sp\351cifiques \340 ce jeux" }, - { 160, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, - { 161, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, - { 162, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, - { 163, "\311mulateur Haut Parleur PC" }, - { 164, "Mot de passe:" }, - { 165, "Chemin n'est pas un r\351pertoire" }, - { 166, "Chemin n'est pas un fichier" }, - { 167, "Chemin inexistant" }, - { 168, "Chemins" }, - { 169, "Mettre en pause" }, - { 170, "Choisissez le jeu:" }, - { 171, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, - { 172, "Plateforme:" }, - { 173, "Dur\351e de jeu:" }, - { 174, "Selectionnez une action" }, - { 175, "Plugins:" }, - { 176, "Sortie Pr\351f\351r\351:" }, - { 177, "Appuyez sur la touche \340 associer" }, - { 178, "Quitter" }, - { 179, "Quitter ScummVM" }, - { 180, "V\351roulli\351 en lecture" }, - { 181, "Echec de la lecture" }, - { 182, "Changer l'affectation des touches" }, - { 183, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, - { 184, "Mode de rendu:" }, - { 185, "Droite" }, - { 186, "Clic Droit" }, - { 187, "Clic droit" }, - { 188, "Pivoter" }, - { 189, "Volume Bruitage:" }, + { 157, "Frequenza:" }, + { 158, "Ignora le impostazioni MIDI globali" }, + { 159, "Ignora le impostazioni MIDI globali" }, + { 160, "Ignora le impostazioni audio globali" }, + { 161, "Ignora le impostazioni grafiche globali" }, + { 162, "Ignora le impostazioni globali di volume" }, + { 163, "Emulatore PC Speaker" }, + { 164, "Password:" }, + { 165, "Il percorso non \350 una cartella" }, + { 166, "Il percorso non \350 un file" }, + { 167, "Il percorso non esiste" }, + { 168, "Percorsi" }, + { 169, "Pausa" }, + { 170, "Scegli il gioco:" }, + { 171, "La piattaforma per la quale il gioco \350 stato concepito" }, + { 172, "Piattaforma:" }, + { 173, "Tempo di gioco: " }, + { 174, "Seleziona un'azione" }, + { 175, "Percorso plugin:" }, + { 176, "Disp. preferito:" }, + { 177, "Premi il tasto da associare" }, + { 178, "Esci" }, + { 179, "Chiudi ScummVM" }, + { 180, "Autorizzazione di lettura negata" }, + { 181, "Lettura fallita" }, + { 182, "Riprogramma tasti" }, + { 183, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, + { 184, "Resa grafica:" }, + { 185, "Destra" }, + { 186, "Clic destro" }, + { 187, "Clic destro" }, + { 188, "Rotazione" }, + { 189, "Volume effetti:" }, { 190, "SMB" }, - { 191, "Sauver" }, - { 192, "Sauvegardes:" }, - { 193, "Sauvegardes:" }, - { 194, "Sauvegarde:" }, - { 195, "Examen termin\351!" }, - { 196, "%d r\351pertoires examin\351s ..." }, - { 197, "Menu Principal ScummVM" }, - { 198, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, - { 199, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, - { 200, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, - { 201, "Recherche dans la liste de jeux" }, - { 202, "Filtre:" }, - { 203, "Choisir une banque de sons" }, - { 204, "S\351lectionnez un Th\350me" }, - { 205, "S\351lectionner un r\351pertoire suppl\351mentaire" }, - { 206, "Selectionez une action et cliquez 'Affecter'" }, - { 207, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, - { 208, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, - { 209, "S\351lectionner le r\351pertoire des plugins" }, - { 210, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 211, "S\351lectionner le r\351pertoire pour les sauvegardes" }, - { 212, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, - { 213, "Sensibilit\351" }, - { 214, "Serveur:" }, - { 215, "Disque partag\351:" }, - { 216, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, - { 217, "Afficher le clavier" }, - { 218, "Afficher le curseur de la souris" }, - { 219, "Affiche les sous-titres et joue les dialogues audio" }, - { 220, "Afficher/Cacher le curseur" }, - { 221, "Passer" }, - { 222, "Passer la phrase" }, - { 223, "Sauter le texte" }, - { 224, "Aligner sur les bords" }, - { 225, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, - { 226, "Audio marche/arr\352t" }, - { 227, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, - { 228, "Banque de sons:" }, - { 229, "Audio" }, - { 230, "Mode sp\351cial de tramage support\351 par certains jeux" }, - { 231, "Volume des effets sp\351ciaux sonores" }, - { 232, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, - { 233, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, - { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, - { 235, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, - { 236, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, - { 237, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, - { 238, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, - { 239, "Audio" }, - { 240, "Volume Dialogues:" }, - { 241, "Standard (16bpp)" }, - { 242, "D\351marre le jeu s\351lectionn\351" }, - { 243, "Status:" }, - { 244, "Subs" }, - { 245, "Vitesse des ST:" }, - { 246, "Sous-titres" }, - { 247, "Changement de personnage" }, - { 248, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, - { 249, "Dialogue:" }, - { 250, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, - { 251, "Th\350mes:" }, - { 252, "Th\350me:" }, - { 253, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, - { 254, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, - { 255, "Heure:" }, - { 256, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, - { 257, "D\351calage X du toucher" }, - { 258, "D\351callage Y du toucher" }, - { 259, "Mode touchpad d\351sactiv\351" }, - { 260, "Mode touchpad activ\351" }, - { 261, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, - { 262, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, - { 263, "Inconue" }, - { 264, "Erreur inconnue" }, - { 265, "D\351monter le DVD" }, - { 266, "D\351monter SMB" }, - { 267, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, - { 268, "Mode de couleurs non support\351" }, - { 269, "Sauvegarde sans nom" }, - { 270, "Haut" }, - { 271, "Utiliser \340 la fois MIDI et AdLib" }, - { 272, "Activer le contr\364le du curseur de type trackpad" }, - { 273, "Nom d'utilisateur:" }, - { 274, "Utilise le pilote SDL" }, - { 275, "Underscan vertical:" }, - { 276, "Vid\351o" }, - { 277, "Clavier virtuel" }, + { 191, "Salva" }, + { 192, "Salvataggi:" }, + { 193, "Salvataggi:" }, + { 194, "Salva gioco:" }, + { 195, "Scansione completa!" }, + { 196, "%d cartelle analizzate..." }, + { 197, "Menu principale di ScummVM" }, + { 198, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, + { 199, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, + { 200, "ScummVM non ha potuto aprire la cartella specificata!" }, + { 201, "Cerca nella lista dei giochi" }, + { 202, "Cerca:" }, + { 203, "Seleziona SoundFont" }, + { 204, "Seleziona un tema" }, + { 205, "Seleziona la cartella di gioco aggiuntiva" }, + { 206, "Seleziona un'azione e clicca 'Mappa'" }, + { 207, "Seleziona la cartella dei temi dell'interfaccia" }, + { 208, "Seleziona la cartella dei file aggiuntivi" }, + { 209, "Seleziona la cartella dei plugin" }, + { 210, "Seleziona la cartella dei salvataggi" }, + { 211, "Seleziona la cartella per i salvataggi" }, + { 212, "Seleziona la cartella contenente i file di gioco" }, + { 213, "Sensibilit\340" }, + { 214, "Server:" }, + { 215, "Condivisione:" }, + { 216, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, + { 217, "Mostra tastiera" }, + { 218, "Mostra cursore del mouse" }, + { 219, "Mostra i sottotitoli e attiva le voci" }, + { 220, "Mostra/nascondi cursore" }, + { 221, "Salta" }, + { 222, "Salta battuta" }, + { 223, "Salta testo" }, + { 224, "Aggancia ai bordi" }, + { 225, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, + { 226, "Suono on/off" }, + { 227, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, + { 228, "SoundFont:" }, + { 229, "Voci" }, + { 230, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, + { 231, "Volume degli effetti sonori" }, + { 232, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, + { 233, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, + { 235, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, + { 236, "Specifica il percorso di ulteriori dati usati dal gioco" }, + { 237, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, + { 238, "Specifica dove archiviare i salvataggi" }, + { 239, "Voci" }, + { 240, "Volume voci:" }, + { 241, "Renderer standard (16bpp)" }, + { 242, "Esegue il gioco selezionato" }, + { 243, "Stato:" }, + { 244, "Sub" }, + { 245, "Velocit\340 testo:" }, + { 246, "Sottotitoli" }, + { 247, "Cambia personaggio" }, + { 248, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, + { 249, "Testo e voci:" }, + { 250, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, + { 251, "Percorso tema:" }, + { 252, "Tema:" }, + { 253, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, + { 254, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, + { 255, "Ora: " }, + { 256, "Attesa per l'avvio della rete" }, + { 257, "Compensa X del tocco" }, + { 258, "Compensa Y del tocco" }, + { 259, "Modalit\340 touchpad disattivata." }, + { 260, "Modalit\340 touchpad attivata." }, + { 261, "Roland MT-32 effettivo (disattiva emulazione GM)" }, + { 262, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, + { 263, "Sconosciuto" }, + { 264, "Errore sconosciuto" }, + { 265, "Smonta DVD" }, + { 266, "Smonta SMB" }, + { 267, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, + { 268, "Modalit\340 colore non supportata" }, + { 269, "Salvataggio senza titolo" }, + { 270, "Su" }, + { 271, "Utilizza generazione di suono sia MIDI che AdLib" }, + { 272, "Utilizza il controllo del cursore stile trackpad del portatile" }, + { 273, "Nome utente:" }, + { 274, "Utilizzo del driver SDL " }, + { 275, "Underscan verticale:" }, + { 276, "Video" }, + { 277, "Tastiera virtuale" }, { 278, "Volume" }, { 279, "MIDI Windows" }, - { 280, "Verrouill\351 en \351criture" }, - { 281, "Echec de l'\351criture des donn\351es" }, - { 282, "Oui" }, - { 283, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, - { 284, "Zone" }, - { 285, "Zoomer" }, - { 286, "D\351zoomer" }, - { 287, "Toutes les 10 mins" }, - { 288, "Toutes les 15 mins" }, - { 289, "Toutes les 30 mins" }, - { 290, "Toutes les 5 mins" }, - { 291, "\300 ~P~ropos" }, - { 292, "~A~jouter..." }, - { 293, "~A~nnuler" }, - { 294, "~F~ermer" }, - { 295, "~E~diter..." }, - { 296, "~A~ide" }, - { 297, "Contr\364le des combats d'~I~ndy" }, - { 298, "~T~ouches" }, - { 299, "Mode ~G~aucher" }, - { 300, "~C~harger" }, - { 301, "~C~harger" }, - { 302, "~S~uivant" }, + { 280, "Autorizzazione di scrittura negata" }, + { 281, "Scrittura dati fallita" }, + { 282, "S\354" }, + { 283, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, + { 284, "Zona" }, + { 285, "Zoom indietro" }, + { 286, "Zoom avanti" }, + { 287, "ogni 10 minuti" }, + { 288, "ogni 15 minuti" }, + { 289, "ogni 30 minuti" }, + { 290, "ogni 5 minuti" }, + { 291, "~I~nfo" }, + { 292, "~A~ggiungi gioco..." }, + { 293, "~A~nnulla" }, + { 294, "~C~hiudi" }, + { 295, "~M~odifica gioco..." }, + { 296, "~A~iuto" }, + { 297, "Controlli combattimento di ~I~ndy" }, + { 298, "~T~asti" }, + { 299, "~M~odalit\340 mancini" }, + { 300, "~C~arica" }, + { 301, "~C~arica..." }, + { 302, "~S~uccessivi" }, { 303, "~O~K" }, - { 304, "~O~ptions" }, - { 305, "~O~ptions..." }, - { 306, "~P~r\351c\351dent" }, - { 307, "~Q~uitter" }, - { 308, "~S~upprimer" }, - { 309, "~R~eprendre" }, - { 310, "Retour au ~L~anceur" }, - { 311, "~S~auver" }, - { 312, "~D~\351marrer" }, - { 313, "T~r~ansitions activ\351" }, - { 314, "~E~ffets de l'Eau Activ\351s" }, - { 315, "Mode ~Z~ip Activ\351" }, + { 304, "~O~pzioni" }, + { 305, "~O~pzioni..." }, + { 306, "~P~recedenti" }, + { 307, "C~h~iudi" }, + { 308, "~R~imuovi gioco" }, + { 309, "~R~ipristina" }, + { 310, "~V~ai a schermata di avvio" }, + { 311, "~S~alva" }, + { 312, "~G~ioca" }, + { 313, "~T~ransizioni attive" }, + { 314, "~E~ffetto acqua attivo" }, + { 315, "Modalit\340 ~Z~ip attivata" }, + { -1, NULL } +}; + +static const PoMessageEntry _translation_hu_HU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 14, "" }, + { 16, "AdLib vezet :" }, + { 17, "AdLib vezet :" }, + { 21, "Aspect adag korrekci\363" }, + { 24, "Hang" }, + { 25, "Automatikus ment\351s:" }, + { 28, "Kulcsok" }, + { 42, "Renderel\351si m\363d:" }, + { 53, "" }, + { 69, "K\351pess\351 Roland GS Mode" }, + { 74, "Extra \332tvonal:" }, + { 76, "Grafikus m\363d:" }, + { 80, "Teljes k\351perny s m\363d:" }, + { 86, "Lek\351pez eszk\366z GUI:" }, + { 90, "Extra \332tvonal:" }, + { 94, "Grafik\341val" }, + { 95, "Grafikus m\363d:" }, + { 115, "Kulcsok" }, + { 124, "AdLib vezet :" }, + { 126, "MIDI nyeres\351g:" }, + { 128, "Zene mennyis\351g:" }, + { 135, "Vegyes AdLib/MIDI m\363d" }, + { 140, "Zene mennyis\351g:" }, + { 141, "Zene mennyis\351g:" }, + { 142, "Muta \326sszes" }, + { 148, "Soha" }, + { 149, "Semmi" }, + { 154, "Semmi" }, + { 156, "Igen" }, + { 157, "Kimeneti teljes\355tm\351ny:" }, + { 168, "\326sv\351nyek" }, + { 169, "\326sv\351nyek" }, + { 184, "Renderel\351si m\363d:" }, + { 189, "SFX mennyis\351ge" }, + { 192, "Extra \332tvonal:" }, + { 214, "Soha" }, + { 239, "Csak a besz\351d" }, + { 240, "Besz\351d mennyis\351g:" }, + { 245, "Felirat sebess\351g:" }, + { 246, "Csak feliratok" }, + { 249, "Sz\366veg \351s besz\351d:" }, + { 252, "T\351ma:" }, + { 255, "T\351ma:" }, + { 261, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 274, "Zenei vezet :" }, + { 278, "Volumene" }, + { 284, "Semmi" }, + { 287, "10 percenk\351nt" }, + { 288, "15 percenk\351nt" }, + { 289, "30 percenk\351nt" }, + { 290, "5 percenk\351nt" }, + { 298, "Kulcsok" }, + { 299, "Renderel\351si m\363d:" }, + { 303, "Igen" }, { -1, NULL } }; -static const PoMessageEntry _translation_it_IT[] = { - { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-06-30 23:56+0100\nLast-Translator: Maff \nLanguage-Team: Italian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Italiano\n" }, - { 1, " Sei sicuro di voler uscire? " }, - { 2, " (Attivo)" }, - { 3, " (Gioco)" }, - { 4, " (Globale)" }, - { 5, "(build creata il %s)" }, - { 6, ", errore nel montare la condivisione" }, - { 7, ", condivisione non montata" }, - { 8, "... progresso ..." }, - { 9, "11kHz" }, +static const PoMessageEntry _translation_fr_FR[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:18+0100\nLast-Translator: Thierry Crozat \nLanguage-Team: French \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Francais\nPlural-Forms: nplurals=2; plural=n>1;\n" }, + { 1, "Voulez-vous vraiment quitter?" }, + { 2, "(Actif)" }, + { 3, "(Jeu)" }, + { 4, "(Global)" }, + { 5, "(compil\351 sur %s)" }, + { 6, ", \351chec du montage du disque partag\351" }, + { 7, ", disque partag\351 non mont\351" }, + { 8, "... en cours ..." }, + { 9, "11 kHz" }, { 10, "22 kHz" }, { 11, "44 kHz" }, { 12, "48 kHz" }, { 13, "8 kHz" }, - { 14, "" }, - { 15, "Informazioni su ScummVM" }, - { 16, "Emulatore AdLib" }, - { 17, "Emulatore AdLib:" }, - { 18, "AdLib \350 utilizzato per la musica in molti giochi" }, - { 19, "Aggiungi gioco..." }, - { 20, "Renderer con antialiasing (16bpp)" }, - { 21, "Correzione proporzioni" }, - { 22, "Tasto associato: %s" }, - { 23, "Tasto associato: nessuno" }, + { 14, "" }, + { 15, "\300 propos de ScummVM" }, + { 16, "\311mulateur AdLib" }, + { 17, "\311mulateur AdLib:" }, + { 18, "AdLib est utilis\351 pour la musique dans de nombreux jeux" }, + { 19, "Ajouter..." }, + { 20, "Anti-cr\351nel\351 (16 bpp)" }, + { 21, "Correction du rapport d'aspect" }, + { 22, "Touche associ\351e: %s" }, + { 23, "Touche associ\351e: aucune" }, { 24, "Audio" }, - { 25, "Autosalva:" }, - { 26, "Motori disponibili:" }, - { 27, "~I~nfo..." }, - { 28, "Associa tasti" }, - { 29, "Entrambi" }, - { 30, "Luminosit\340:" }, - { 31, "Annulla" }, - { 32, "Impossibile creare il file" }, - { 33, "Modifica le opzioni di gioco" }, - { 34, "Modifica le opzioni globali di ScummVM" }, - { 35, "Seleziona se vuoi usare il dispositivo hardware audio compatibile con Roland che \350 connesso al tuo computer" }, - { 36, "Scegli" }, - { 37, "Scegli un'azione da mappare" }, - { 38, "Cancella" }, - { 39, "Chiudi" }, - { 40, "Corregge le proporzioni dei giochi 320x200" }, - { 41, "Impossibile trovare un motore in grado di eseguire il gioco selezionato" }, - { 42, "Modalit\340 video attuale:" }, - { 43, "Cursore gi\371" }, - { 44, "Cursore a sinistra" }, - { 45, "Cursore a destra" }, - { 46, "Cursore su" }, - { 47, "Emulatore OPL DOSBox" }, + { 25, "Sauvegarde auto:" }, + { 26, "Moteurs disponibles:" }, + { 27, "\300 ~P~ropos..." }, + { 28, "Affecter les touches" }, + { 29, "Les deux" }, + { 30, "Luminosit\351:" }, + { 31, "Annuler" }, + { 32, "Impossible de cr\351er le fichier" }, + { 33, "Change les options du jeu" }, + { 34, "Change les options globales de ScummVM" }, + { 35, "V\351rifie si vous voulez utiliser un p\351riph\351rique audio compatible Roland connect\351 \340 l'ordinateur" }, + { 36, "Choisir" }, + { 37, "S\351lectionnez une action \340 affecter" }, + { 38, "Effacer la valeur" }, + { 39, "Fermer" }, + { 40, "Corrige le rapport d'aspect pour les jeu 320x200" }, + { 41, "Impossible de trouver un moteur pour ex\351cuter le jeu s\351lectionn\351" }, + { 42, "Mode vid\351o actuel" }, + { 43, "Bas" }, + { 44, "Gauche" }, + { 45, "Droit" }, + { 46, "Haut" }, + { 47, "\311mulateur DOSBox OPL" }, { 48, "DVD" }, - { 49, "DVD montato con successo" }, - { 50, "DVD non montato" }, - { 51, "Data: " }, + { 49, "DVD mont\351 avec succ\350s" }, + { 50, "DVD non mont\351" }, + { 51, "Date:" }, { 52, "Debugger" }, - { 53, "Predefinito" }, - { 54, "Elimina" }, - { 55, "Disattiva spegnimento in chiusura" }, - { 56, "Grafica disattivata" }, - { 57, "Rilevati %d nuovi giochi..." }, - { 58, "Rilevati %d nuovi giochi." }, - { 59, "Visualizza " }, - { 60, "Mostra tastiera" }, - { 61, "Sei sicuro di voler eliminare questo salvataggio?" }, - { 62, "Sei sicuro di voler rimuovere questa configurazione di gioco?" }, - { 63, "Vuoi davvero eseguire il rilevatore di giochi in massa? Potrebbe aggiungere un numero enorme di giochi." }, - { 64, "Vuoi caricare o salvare il gioco?" }, - { 65, "Vuoi eseguire una scansione automatica?" }, - { 66, "Sei sicuro di voler uscire?" }, - { 67, "Double-strike" }, - { 68, "Gi\371" }, - { 69, "Attiva la modalit\340 Roland GS" }, - { 70, "Il motore non supporta il livello di debug '%s'" }, - { 71, "Inglese" }, - { 72, "Errore nell'esecuzione del gioco:" }, - { 73, "Errore nel montare il DVD" }, - { 74, "Percorso extra:" }, - { 75, "Emulatore FM Towns" }, - { 76, "Modalit\340 veloce" }, - { 77, "Funzionalit\340 compilate in:" }, - { 78, "Osservazione libera" }, - { 79, "Titolo completo del gioco" }, - { 80, "Modalit\340 a schermo intero" }, - { 81, "Accelerazione pad GC:" }, - { 82, "Sensibilit\340 pad GC:" }, - { 83, "Grafica" }, - { 84, "Dispositivo GM:" }, - { 85, "Lingua GUI:" }, - { 86, "Renderer GUI:" }, - { 87, "Gioco" }, - { 88, "Dati di gioco non trovati" }, - { 89, "ID di gioco non supportato" }, - { 90, "Percorso gioco:" }, - { 91, "Menu globale" }, - { 92, "Vai alla cartella superiore" }, - { 93, "Cartella superiore" }, - { 94, "Grafica" }, - { 95, "Modalit\340:" }, - { 96, "Ridimensionamento hardware (veloce, ma di bassa qualit\340)" }, - { 97, "Hercules ambra" }, - { 98, "Hercules verde" }, - { 99, "Nascondi la barra degli strumenti" }, - { 100, "Audio ad alta qualit\340 (pi\371 lento) (riavviare)" }, - { 101, "Valori pi\371 alti restituiscono un suono di maggior qualit\340, ma potrebbero non essere supportati dalla tua scheda audio" }, - { 102, "Tieni premuto Shift per l'aggiunta in massa" }, - { 103, "Underscan orizzontale:" }, - { 104, "Emulatore IBM PCjr" }, + { 53, "D\351faut" }, + { 54, "Supprimer" }, + { 55, "D\351sactiv\351 l'extinction" }, + { 56, "GFX d\351sactiv\351" }, + { 57, "%d nouveaux jeux trouv\351s ..." }, + { 58, "%d nouveaux jeux trouv\351s." }, + { 59, "Affichage" }, + { 60, "Afficher le clavier" }, + { 61, "Voulez-vous vraiment supprimer cette sauvegarde?" }, + { 62, "Voulez-vous vraiment supprimer ce jeu?" }, + { 63, "Voulez-vous vraiment lancer la d\351tection automatique des jeux? Cela peut potentiellement ajouter un grand nombre de jeux." }, + { 64, "Voulez-vous charger ou sauver le jeu?" }, + { 65, "Voulez-vous ex\351cuter une recherche automatique?" }, + { 66, "Voulez-vous quitter?" }, + { 67, "Coup double" }, + { 68, "Bas" }, + { 69, "Activer le mode Roland GS" }, + { 70, "Le niveau de debug '%s' n'est pas support\351 par ce moteur de jeu" }, + { 71, "Anglais" }, + { 72, "Erreur lors de l'\351x\351cution du jeu:" }, + { 73, "\311chec du montage du DVD" }, + { 74, "Extra:" }, + { 75, "\311mulateur FM Towns" }, + { 76, "Mode rapide" }, + { 77, "Options incluses:" }, + { 78, "Regarder autour" }, + { 79, "Nom complet du jeu" }, + { 80, "Plein \351cran" }, + { 81, "Acceleration du pad GC:" }, + { 82, "Sensibilit\351 du pad GC:" }, + { 83, "GFX" }, + { 84, "Sortie GM:" }, + { 85, "Langue:" }, + { 86, "Interface:" }, + { 87, "Jeu" }, + { 88, "Fichier de don\351es introuvable" }, + { 89, "ID de jeu non support\351" }, + { 90, "Chemin du Jeu:" }, + { 91, "Menu global" }, + { 92, "Remonte d'un niveau dans la hi\351rarchie de r\351pertoire" }, + { 93, "Remonter" }, + { 94, "Graphique" }, + { 95, "Mode graphique:" }, + { 96, "Mise \340 l'echelle mat\351rielle (rapide mais qualit\351 faible)" }, + { 97, "Hercules Ambre" }, + { 98, "Hercules Vert" }, + { 99, "Cach\351 la barre d'outils" }, + { 100, "Audio haute qualit\351 (plus lent) (red\351marrer)" }, + { 101, "Une valeur plus \351lev\351e donne une meilleure qualit\351 audio mais peut ne pas \352tre support\351 par votre carte son" }, + { 102, "Ajoute un jeu \340 la Liste. Maintenez Shift enfonc\351e pour un Ajout Massif" }, + { 103, "Underscan horizontal:" }, + { 104, "\311mulateur IBM PCjr" }, { 105, "ID:" }, - { 106, "Avvia rete" }, - { 107, "Schermo in primo piano:" }, - { 108, "Avvio in corso dell'emulatore MT-32" }, - { 109, "Avvio rete in corso" }, - { 110, "Input" }, - { 111, "Percorso non valido" }, - { 112, "Programmatore tasti" }, - { 113, "Tastiera" }, - { 114, "Mappa tasti:" }, - { 115, "Tasti" }, - { 116, "Lingua dell'interfaccia grafica di ScummVM" }, - { 117, "Lingua del gioco. Un gioco inglese non potr\340 risultare tradotto in italiano" }, - { 118, "Lingua:" }, - { 119, "Sinistra" }, - { 120, "Clic sinistro" }, - { 121, "Carica" }, - { 122, "Carica gioco:" }, - { 123, "Carica un salvataggio del gioco selezionato" }, - { 124, "Emulatore OPL MAME" }, + { 106, "Initialiser le r\351seau" }, + { 107, "\311chelle initiale de l'\351cran du haut" }, + { 108, "Initialisation de l'\311mulateur MT-32" }, + { 109, "Initialisation du r\351seau" }, + { 110, "Entr\351e" }, + { 111, "Chemin Invalide" }, + { 112, "Affectation des touches" }, + { 113, "Clavier" }, + { 114, "Affectation des touches:" }, + { 115, "Touches" }, + { 116, "Langue de l'interface graphique de ScummVM" }, + { 117, "Langue du jeu. Cela ne traduira pas en anglais par magie votre version espagnole du jeu." }, + { 118, "Langue:" }, + { 119, "Gauche" }, + { 120, "Clic Gauche" }, + { 121, "Charger" }, + { 122, "Charger le jeu:" }, + { 123, "Charge une sauvegarde pour le jeu s\351lectionn\351" }, + { 124, "\311mulateur MAME OPL" }, { 125, "MIDI" }, - { 126, "Guadagno MIDI:" }, - { 128, "Disposit. MT32:" }, - { 129, "Emulatore MT-32" }, - { 130, "Schermo principale:" }, - { 131, "Mappa" }, - { 132, "Agg. in massa..." }, + { 126, "Gain MIDI:" }, + { 127, "MT-32" }, + { 128, "Sortie MT-32:" }, + { 129, "\311mulateur MT-32" }, + { 130, "\311chelle de l'\351cran principal" }, + { 131, "Affecter" }, + { 132, "Ajout Massif..." }, { 133, "Menu" }, - { 134, "Varie" }, - { 135, "Modalit\340 mista AdLib/MIDI" }, - { 136, "Monta DVD" }, - { 137, "Monta SMB" }, - { 138, "Clic del mouse" }, - { 139, "Multifunzione" }, - { 140, "Dispositivo GM:" }, - { 141, "Volume musica:" }, - { 142, "Disattiva audio" }, - { 143, "Nome:" }, - { 144, "Rete disattivata" }, - { 145, "Rete non avviata (%d)" }, - { 146, "Rete attiva" }, - { 147, "Rete attiva, condivisione montata" }, - { 148, "Mai" }, - { 149, "No" }, - { 150, "Nessuna data salvata" }, - { 151, "Nessuna musica" }, - { 152, "Nessun tempo salvato" }, - { 153, "Nessun orario salvato" }, - { 154, "Nessuno" }, - { 155, "Normale (nessun ridimensionamento)" }, + { 134, "Divers" }, + { 135, "Mode mixe AdLib/MIDI" }, + { 136, "Monter le DVD" }, + { 137, "Monter SMB" }, + { 138, "Clic de souris" }, + { 139, "Fonction Multiple" }, + { 140, "Sortie Audio:" }, + { 141, "Volume Musique:" }, + { 142, "Silence" }, + { 143, "Nom:" }, + { 144, "R\351seau d\351connect\351" }, + { 145, "R\351seau non initialis\351 (%d)" }, + { 146, "R\351seau connect\351" }, + { 147, "R\351seau connect\351, disque partag\351 mont\351" }, + { 148, "Jamais" }, + { 149, "Non" }, + { 150, "Date non sauv\351e" }, + { 151, "Pas de musique" }, + { 152, "Dur\351e de jeu non sauv\351e" }, + { 153, "Heure non sauv\351e" }, + { 154, "Aucun" }, + { 155, "Normal (\351chelle d'origine)" }, { 156, "OK" }, - { 157, "Frequenza:" }, - { 158, "Ignora le impostazioni MIDI globali" }, - { 159, "Ignora le impostazioni MIDI globali" }, - { 160, "Ignora le impostazioni audio globali" }, - { 161, "Ignora le impostazioni grafiche globali" }, - { 162, "Ignora le impostazioni globali di volume" }, - { 163, "Emulatore PC Speaker" }, - { 164, "Password:" }, - { 165, "Il percorso non \350 una cartella" }, - { 166, "Il percorso non \350 un file" }, - { 167, "Il percorso non esiste" }, - { 168, "Percorsi" }, - { 169, "Pausa" }, - { 170, "Scegli il gioco:" }, - { 171, "La piattaforma per la quale il gioco \350 stato concepito" }, - { 172, "Piattaforma:" }, - { 173, "Tempo di gioco: " }, - { 174, "Seleziona un'azione" }, - { 175, "Percorso plugin:" }, - { 176, "Disp. preferito:" }, - { 177, "Premi il tasto da associare" }, - { 178, "Esci" }, - { 179, "Chiudi ScummVM" }, - { 180, "Autorizzazione di lettura negata" }, - { 181, "Lettura fallita" }, - { 182, "Riprogramma tasti" }, - { 183, "Rimuove il gioco dalla lista. I file del gioco rimarranno intatti" }, - { 184, "Resa grafica:" }, - { 185, "Destra" }, - { 186, "Clic destro" }, - { 187, "Clic destro" }, - { 188, "Rotazione" }, - { 189, "Volume effetti:" }, + { 157, "Fr\351quence:" }, + { 158, "Utiliser des r\351glages MIDI sp\351cifiques \340 ce jeux" }, + { 159, "Utiliser des r\351glages MT-32 sp\351cifiques \340 ce jeux" }, + { 160, "Utiliser des r\351glages audio sp\351cifiques \340 ce jeux" }, + { 161, "Utiliser des r\351glages graphiques sp\351cifiques \340 ce jeux" }, + { 162, "Utiliser des r\351glages de volume sonore sp\351cifiques \340 ce jeux" }, + { 163, "\311mulateur Haut Parleur PC" }, + { 164, "Mot de passe:" }, + { 165, "Chemin n'est pas un r\351pertoire" }, + { 166, "Chemin n'est pas un fichier" }, + { 167, "Chemin inexistant" }, + { 168, "Chemins" }, + { 169, "Mettre en pause" }, + { 170, "Choisissez le jeu:" }, + { 171, "Plateforme pour laquelle votre jeu a \351t\351 con\347u" }, + { 172, "Plateforme:" }, + { 173, "Dur\351e de jeu:" }, + { 174, "Selectionnez une action" }, + { 175, "Plugins:" }, + { 176, "Sortie Pr\351f\351r\351:" }, + { 177, "Appuyez sur la touche \340 associer" }, + { 178, "Quitter" }, + { 179, "Quitter ScummVM" }, + { 180, "V\351roulli\351 en lecture" }, + { 181, "Echec de la lecture" }, + { 182, "Changer l'affectation des touches" }, + { 183, "Supprime le jeu de la liste. Les fichiers sont conserv\351s" }, + { 184, "Mode de rendu:" }, + { 185, "Droite" }, + { 186, "Clic Droit" }, + { 187, "Clic droit" }, + { 188, "Pivoter" }, + { 189, "Volume Bruitage:" }, { 190, "SMB" }, - { 191, "Salva" }, - { 192, "Salvataggi:" }, - { 193, "Salvataggi:" }, - { 194, "Salva gioco:" }, - { 195, "Scansione completa!" }, - { 196, "%d cartelle analizzate..." }, - { 197, "Menu principale di ScummVM" }, - { 198, "ScummVM non ha potuto trovare un motore in grado di eseguire il gioco selezionato!" }, - { 199, "ScummVM non ha potuto trovare nessun gioco nella cartella specificata!" }, - { 200, "ScummVM non ha potuto aprire la cartella specificata!" }, - { 201, "Cerca nella lista dei giochi" }, - { 202, "Cerca:" }, - { 203, "Seleziona SoundFont" }, - { 204, "Seleziona un tema" }, - { 205, "Seleziona la cartella di gioco aggiuntiva" }, - { 206, "Seleziona un'azione e clicca 'Mappa'" }, - { 207, "Seleziona la cartella dei temi dell'interfaccia" }, - { 208, "Seleziona la cartella dei file aggiuntivi" }, - { 209, "Seleziona la cartella dei plugin" }, - { 210, "Seleziona la cartella dei salvataggi" }, - { 211, "Seleziona la cartella per i salvataggi" }, - { 212, "Seleziona la cartella contenente i file di gioco" }, - { 213, "Sensibilit\340" }, - { 214, "Server:" }, - { 215, "Condivisione:" }, - { 216, "Breve identificatore di gioco utilizzato per il riferimento a salvataggi e per l'esecuzione del gioco dalla riga di comando" }, - { 217, "Mostra tastiera" }, - { 218, "Mostra cursore del mouse" }, - { 219, "Mostra i sottotitoli e attiva le voci" }, - { 220, "Mostra/nascondi cursore" }, - { 221, "Salta" }, - { 222, "Salta battuta" }, - { 223, "Salta testo" }, - { 224, "Aggancia ai bordi" }, - { 225, "Ridimensionamento software (di buona qualit\340, ma pi\371 lento)" }, - { 226, "Suono on/off" }, - { 227, "SoundFont \350 supportato da alcune schede audio, Fluidsynth e Timidity" }, - { 228, "SoundFont:" }, - { 229, "Voci" }, - { 230, "Modalit\340 di resa grafica speciali supportate da alcuni giochi" }, - { 231, "Volume degli effetti sonori" }, - { 232, "Specifica il dispositivo audio predefinito per l'output General MIDI" }, - { 233, "Specifica il dispositivo audio predefinito per l'output Roland MT-32/LAPC1/CM32l/CM64" }, - { 234, "Specifica il dispositivo di output audio o l'emulatore della scheda audio" }, - { 235, "Specifica il percorso di ulteriori dati usati dai giochi o da ScummVM" }, - { 236, "Specifica il percorso di ulteriori dati usati dal gioco" }, - { 237, "Specifica il dispositivo audio o l'emulatore della scheda audio preferiti" }, - { 238, "Specifica dove archiviare i salvataggi" }, - { 239, "Voci" }, - { 240, "Volume voci:" }, - { 241, "Renderer standard (16bpp)" }, - { 242, "Esegue il gioco selezionato" }, - { 243, "Stato:" }, - { 244, "Sub" }, - { 245, "Velocit\340 testo:" }, - { 246, "Sottotitoli" }, - { 247, "Cambia personaggio" }, - { 248, "Un tocco per il clic sinistro, doppio tocco per il clic destro" }, - { 249, "Testo e voci:" }, - { 250, "La cartella scelta \350 in sola lettura. Si prega di sceglierne un'altra." }, - { 251, "Percorso tema:" }, - { 252, "Tema:" }, - { 253, "Questo ID di gioco \350 gi\340 in uso. Si prega di sceglierne un'altro." }, - { 254, "Questo gioco non supporta il caricamento di salvataggi dalla schermata di avvio." }, - { 255, "Ora: " }, - { 256, "Attesa per l'avvio della rete" }, - { 257, "Compensa X del tocco" }, - { 258, "Compensa Y del tocco" }, - { 259, "Modalit\340 touchpad disattivata." }, - { 260, "Modalit\340 touchpad attivata." }, - { 261, "Roland MT-32 effettivo (disattiva emulazione GM)" }, - { 262, "Disattiva la mappatura General MIDI per i giochi con colonna sonora Roland MT-32" }, - { 263, "Sconosciuto" }, - { 264, "Errore sconosciuto" }, - { 265, "Smonta DVD" }, - { 266, "Smonta SMB" }, - { 267, "Non ridimensionato (devi scorrere a sinistra e a destra)" }, - { 268, "Modalit\340 colore non supportata" }, - { 269, "Salvataggio senza titolo" }, - { 270, "Su" }, - { 271, "Utilizza generazione di suono sia MIDI che AdLib" }, - { 272, "Utilizza il controllo del cursore stile trackpad del portatile" }, - { 273, "Nome utente:" }, - { 274, "Utilizzo del driver SDL " }, - { 275, "Underscan verticale:" }, - { 276, "Video" }, - { 277, "Tastiera virtuale" }, + { 191, "Sauver" }, + { 192, "Sauvegardes:" }, + { 193, "Sauvegardes:" }, + { 194, "Sauvegarde:" }, + { 195, "Examen termin\351!" }, + { 196, "%d r\351pertoires examin\351s ..." }, + { 197, "Menu Principal ScummVM" }, + { 198, "ScummVM n'a pas pu trouv\351 de moteur pour lancer le jeu s\351lectionn\351." }, + { 199, "ScummVM n'a pas trouv\351 de jeux dans le r\351pertoire s\351lectionn\351." }, + { 200, "ScummVM n'a pas pu ouvrir le r\351pertoire s\351lectionn\351." }, + { 201, "Recherche dans la liste de jeux" }, + { 202, "Filtre:" }, + { 203, "Choisir une banque de sons" }, + { 204, "S\351lectionnez un Th\350me" }, + { 205, "S\351lectionner un r\351pertoire suppl\351mentaire" }, + { 206, "Selectionez une action et cliquez 'Affecter'" }, + { 207, "S\351lectionner le r\351pertoire des th\350mes d'interface" }, + { 208, "S\351lectionner le r\351pertoire pour les fichiers supl\351mentaires" }, + { 209, "S\351lectionner le r\351pertoire des plugins" }, + { 210, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 211, "S\351lectionner le r\351pertoire pour les sauvegardes" }, + { 212, "S\351lectionner le r\351pertoire contenant les donn\351es du jeu" }, + { 213, "Sensibilit\351" }, + { 214, "Serveur:" }, + { 215, "Disque partag\351:" }, + { 216, "ID compact du jeu utilis\351 pour identifier les sauvegardes et d\351marrer le jeu depuis la ligne de commande" }, + { 217, "Afficher le clavier" }, + { 218, "Afficher le curseur de la souris" }, + { 219, "Affiche les sous-titres et joue les dialogues audio" }, + { 220, "Afficher/Cacher le curseur" }, + { 221, "Passer" }, + { 222, "Passer la phrase" }, + { 223, "Sauter le texte" }, + { 224, "Aligner sur les bords" }, + { 225, "Mise \340 l'\351chelle logicielle (bonne qualit\351 mais plus lent)" }, + { 226, "Audio marche/arr\352t" }, + { 227, "La banque de sons est utilis\351e par certaines cartes audio, Fluidsynth et Timidity" }, + { 228, "Banque de sons:" }, + { 229, "Audio" }, + { 230, "Mode sp\351cial de tramage support\351 par certains jeux" }, + { 231, "Volume des effets sp\351ciaux sonores" }, + { 232, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie General MIDI" }, + { 233, "Sp\351cifie le p\351riph\351rique audio par d\351faut pour la sortie Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio" }, + { 235, "Sp\351cifie un chemin vers des donn\351es suppl\351mentaires utilis\351es par tous les jeux ou ScummVM" }, + { 236, "D\351finie un chemin vers des donn\351es supl\351mentaires utilis\351es par le jeu" }, + { 237, "Sp\351cifie le p\351riph\351rique de sortie audio ou l'\351mulateur de carte audio pr\351f\351r\351" }, + { 238, "D\351finie l'emplacement o\371 les fichiers de sauvegarde sont cr\351\351s" }, + { 239, "Audio" }, + { 240, "Volume Dialogues:" }, + { 241, "Standard (16bpp)" }, + { 242, "D\351marre le jeu s\351lectionn\351" }, + { 243, "Status:" }, + { 244, "Subs" }, + { 245, "Vitesse des ST:" }, + { 246, "Sous-titres" }, + { 247, "Changement de personnage" }, + { 248, "Toucher pour un clic gauche, toucher deux fois pour un clic droit" }, + { 249, "Dialogue:" }, + { 250, "Le r\351pertoire s\351lectionn\351 est v\351rouill\351 en \351criture. S\351lectionnez un autre r\351pertoire." }, + { 251, "Th\350mes:" }, + { 252, "Th\350me:" }, + { 253, "Cet ID est d\351j\340 utilis\351 par un autre jeu. Choisissez en un autre svp." }, + { 254, "Le chargement de sauvegarde depuis le lanceur n'est pas support\351 pour ce jeu." }, + { 255, "Heure:" }, + { 256, "D\351passement du d\351lai lors de l'initialisation du r\351seau" }, + { 257, "D\351calage X du toucher" }, + { 258, "D\351callage Y du toucher" }, + { 259, "Mode touchpad d\351sactiv\351" }, + { 260, "Mode touchpad activ\351" }, + { 261, "Roland MT-32 exacte (d\351sactive l'\351mulation GM)" }, + { 262, "D\351sactiver la conversion des pistes MT-32 en General MIDI" }, + { 263, "Inconue" }, + { 264, "Erreur inconnue" }, + { 265, "D\351monter le DVD" }, + { 266, "D\351monter SMB" }, + { 267, "Sans changement d'\351chelle (vous devez faire d\351filer l'\351cran)" }, + { 268, "Mode de couleurs non support\351" }, + { 269, "Sauvegarde sans nom" }, + { 270, "Haut" }, + { 271, "Utiliser \340 la fois MIDI et AdLib" }, + { 272, "Activer le contr\364le du curseur de type trackpad" }, + { 273, "Nom d'utilisateur:" }, + { 274, "Utilise le pilote SDL" }, + { 275, "Underscan vertical:" }, + { 276, "Vid\351o" }, + { 277, "Clavier virtuel" }, { 278, "Volume" }, { 279, "MIDI Windows" }, - { 280, "Autorizzazione di scrittura negata" }, - { 281, "Scrittura dati fallita" }, - { 282, "S\354" }, - { 283, "Devi riavviare ScummVM affinch\351 le modifiche abbiano effetto." }, - { 284, "Zona" }, - { 285, "Zoom indietro" }, - { 286, "Zoom avanti" }, - { 287, "ogni 10 minuti" }, - { 288, "ogni 15 minuti" }, - { 289, "ogni 30 minuti" }, - { 290, "ogni 5 minuti" }, - { 291, "~I~nfo" }, - { 292, "~A~ggiungi gioco..." }, - { 293, "~A~nnulla" }, - { 294, "~C~hiudi" }, - { 295, "~M~odifica gioco..." }, - { 296, "~A~iuto" }, - { 297, "Controlli combattimento di ~I~ndy" }, - { 298, "~T~asti" }, - { 299, "~M~odalit\340 mancini" }, - { 300, "~C~arica" }, - { 301, "~C~arica..." }, - { 302, "~S~uccessivi" }, + { 280, "Verrouill\351 en \351criture" }, + { 281, "Echec de l'\351criture des donn\351es" }, + { 282, "Oui" }, + { 283, "Vous devez relancer ScummVM pour que le changement soit pris en compte." }, + { 284, "Zone" }, + { 285, "Zoomer" }, + { 286, "D\351zoomer" }, + { 287, "Toutes les 10 mins" }, + { 288, "Toutes les 15 mins" }, + { 289, "Toutes les 30 mins" }, + { 290, "Toutes les 5 mins" }, + { 291, "\300 ~P~ropos" }, + { 292, "~A~jouter..." }, + { 293, "~A~nnuler" }, + { 294, "~F~ermer" }, + { 295, "~E~diter..." }, + { 296, "~A~ide" }, + { 297, "Contr\364le des combats d'~I~ndy" }, + { 298, "~T~ouches" }, + { 299, "Mode ~G~aucher" }, + { 300, "~C~harger" }, + { 301, "~C~harger" }, + { 302, "~S~uivant" }, { 303, "~O~K" }, - { 304, "~O~pzioni" }, - { 305, "~O~pzioni..." }, - { 306, "~P~recedenti" }, - { 307, "C~h~iudi" }, - { 308, "~R~imuovi gioco" }, - { 309, "~R~ipristina" }, - { 310, "~V~ai a schermata di avvio" }, - { 311, "~S~alva" }, - { 312, "~G~ioca" }, - { 313, "~T~ransizioni attive" }, - { 314, "~E~ffetto acqua attivo" }, - { 315, "Modalit\340 ~Z~ip attivata" }, + { 304, "~O~ptions" }, + { 305, "~O~ptions..." }, + { 306, "~P~r\351c\351dent" }, + { 307, "~Q~uitter" }, + { 308, "~S~upprimer" }, + { 309, "~R~eprendre" }, + { 310, "Retour au ~L~anceur" }, + { 311, "~S~auver" }, + { 312, "~D~\351marrer" }, + { 313, "T~r~ansitions activ\351" }, + { 314, "~E~ffets de l'Eau Activ\351s" }, + { 315, "Mode ~Z~ip Activ\351" }, + { -1, NULL } +}; + +static const PoMessageEntry _translation_uk_UA[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:19+0100\nLast-Translator: Lubomyr Lisen\nLanguage-Team: Ukrainian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-5\nContent-Transfer-Encoding: 8bit\nLanguage: Ukrainian\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 1, " \262\330 \343\337\325\322\335\325\335\366, \351\336 \345\336\347\325\342\325 \322\330\331\342\330? " }, + { 2, " (\260\332\342\330\322\335\320)" }, + { 3, " (\246\323\340\330)" }, + { 4, " (\263\333\336\321\320\333\354\335\320)" }, + { 5, "(\327\366\321\340\320\335\330\331 %s)" }, + { 6, ", \337\336\334\330\333\332\320 \337\366\324 \347\320\341 \337\366\324\332\333\356\347\325\335\335\357 \337\320\337\332\330" }, + { 7, ", \337\320\337\332\320 \335\325 \337\366\324\332\333\356\347\325\335\320" }, + { 8, "... \337\336\350\343\332 ..." }, + { 9, "11 \332\263\346" }, + { 10, "22 \332\263\346" }, + { 11, "44 \332\263\346" }, + { 12, "48 \332\263\346" }, + { 13, "8 \332\263\346" }, + { 14, "<\327\320 \343\334\336\322\347\320\335\335\357\334>" }, + { 15, "\277\340\336 ScummVM" }, + { 16, "\265\334\343\333\357\342\336\340 AdLib" }, + { 17, "\265\334\343\333\357\342\336\340 AdLib:" }, + { 18, "\267\322\343\332\336\322\320 \332\320\340\342\320 AdLib \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357 \321\320\323\320\342\354\334\320 \366\323\340\320\334\330" }, + { 19, "\264\336\324. \323\340\343..." }, + { 20, "\300\320\341\342\325\340\330\327\320\342\336\340 \327\366 \327\323\333\320\324\326\343\322\320\335\335\357\334 (16bpp)" }, + { 21, "\272\336\340\325\332\346\366\357 \341\337\366\322\322\366\324\335\336\350\325\335\335\357 \341\342\336\340\366\335" }, + { 22, "\277\340\330\327\335\320\347\325\335\320 \332\333\320\322\366\350\320 : %s" }, + { 23, "\277\340\330\327\335\320\347\325\335\320 \332\333\320\322\366\350\320 : \335\325\334\320\364" }, + { 24, "\260\343\324\366\336" }, + { 25, "\260\322\342\336\327\321\325\340\325\326\325\335\335\357:" }, + { 26, "\264\336\341\342\343\337\335\366 \324\322\330\326\332\330:" }, + { 27, "\277\340\336 \337~\340~\336\323\340\320\334\343..." }, + { 28, "\337\340\330\327\335\320\347\330\342\330 \332\333\320\322\366\350\366" }, + { 29, "\262\341\325" }, + { 30, "\317\341\332\340\320\322\366\341\342\354:" }, + { 31, "\262\366\324\334\366\335\320" }, + { 32, "\275\325 \334\336\326\343 \341\342\322\336\340\330\342\330 \344\320\331\333" }, + { 33, "\267\334\366\335\330\342\330 \336\337\346\366\367 \323\340\330" }, + { 34, "\267\334\366\335\330\342\330 \323\333\336\321\320\333\354\335\366 \336\337\346\366\367 ScummVM" }, + { 35, "\262\366\324\334\366\342\354\342\325, \357\332\351\336 \343 \322\320\341 \337\366\324\332\333\356\347\325\335\330\331 Roland-\341\343\334\366\341\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \366 \322\330 \345\336\347\325\342\325 \331\336\323\336 \322\330\332\336\340\330\341\342\320\342\330" }, + { 36, "\262\330\321\340\320\342\330" }, + { 37, "\262\330\321\325\340\366\342\354 \324\366\356 \324\333\357 \337\340\330\327\335\320\347\325\335\335\357" }, + { 38, "\276\347\330\341\342\330\342\330 \327\335\320\347\325\335\335\357" }, + { 39, "\267\320\332\340\330\342\330" }, + { 40, "\272\336\340\330\323\343\322\320\342\330 \341\337\366\322\322\366\324\335\336\350\325\335\335\357 \341\342\336\340\366\335 \324\333\357 \366\323\336\340 \327 \323\340\320\344\366\332\336\356 320x200" }, + { 41, "\275\325 \334\336\326\343 \327\335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\343 \322\330\321\340\320\335\336\367 \323\340\330" }, + { 42, "\302\325\332\343\347\330\331 \322\366\324\325\336\340\325\326\330\334:" }, + { 43, "\272\343\340\341\336\340 \322\335\330\327" }, + { 44, "\272\343\340\341\336\340 \322\333\366\322\336" }, + { 45, "\272\343\340\341\336\340 \322\337\340\320\322\336" }, + { 46, "\272\343\340\341\336\340 \322\322\325\340\345" }, + { 47, "\265\334\343\333\357\342\336\340 DOSBox OPL" }, + { 48, "DVD" }, + { 49, "DVD \337\366\324\332\333\356\347\325\335\330\331 \343\341\337\366\350\335\336" }, + { 50, "DVD \335\325 \337\366\324\332\333\356\347\325\335\330\331" }, + { 51, "\264\320\342\320: " }, + { 52, "\262\366\324\333\320\324\347\330\332" }, + { 53, "\267\320 \343\334\336\322\347\320\335\335\357\334" }, + { 54, "\262\330\324\320\333\330\342\330" }, + { 55, "\267\320\321\336\340\336\335\330\342\330 \322\330\334\332\335\325\335\335\357" }, + { 56, "\261\325\327 \323\340\320\344\366\332\330" }, + { 57, "\267\335\320\331\324\325\335\336 %d \335\336\322\330\345 \366\323\336\340 ..." }, + { 58, "\267\335\320\331\324\325\335\336 %d \335\336\322\330\345 \366\323\336\340." }, + { 59, "\277\336\332\320\327\320\342\330 " }, + { 60, "\277\336\332\320\327\320\342\330 \332\333\320\322\366\320\342\343\340\343" }, + { 61, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \322\330\324\320\333\330\342\330 \346\325 \327\321\325\340\325\326\325\335\335\357?" }, + { 62, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \322\330\324\320\333\330\342\330 \343\341\342\320\335\336\322\332\330 \324\333\357 \346\366\364\367 \323\340\330?" }, + { 63, "\262\330 \324\366\331\341\335\336 \345\336\347\325\342\325 \327\320\337\343\341\342\330\342\330 \324\325\342\325\332\342\336\340 \343\341\366\345 \366\323\336\340? \306\325 \337\336\342\325\335\346\366\331\335\336 \334\336\326\325 \324\336\324\320\342\330 \322\325\333\330\332\343 \332\366\333\354\332\366\341\342\354 \366\323\336\340." }, + { 64, "\262\330 \345\336\347\325\342\325 \327\320\322\320\335\342\320\326\330\342\330 \320\321\336 \327\321\325\340\325\323\342\330 \323\340\343?" }, + { 65, "\262\330 \345\336\347\325\342\325 \327\324\366\331\341\335\330\342\330 \320\322\342\336\334\320\342\330\347\335\330\331 \337\336\350\343\332?" }, + { 66, "\262\330 \345\336\347\330\342\325 \322\330\331\342\330?" }, + { 67, "\277\336\324\322\366\331\335\330\331 \343\324\320\340" }, + { 68, "\262\335\330\327" }, + { 69, "\303\322\366\334\332\335\343\342\330 \340\325\326\330\334 Roland GS" }, + { 70, "\264\322\330\326\336\332 \335\325 \337\366\324\342\340\330\334\343\364 \340\366\322\325\335\354 \322\366\324\333\320\324\332\330 '%s'" }, + { 71, "English" }, + { 72, "\277\336\334\330\333\332\320 \327\320\337\343\341\332\343 \323\340\330:" }, + { 73, "\277\336\334\330\333\332\320 \337\366\324 \347\320\341 \337\366\324\332\333\356\347\325\335\335\357 DVD" }, + { 74, "\264\336\324. \350\333\357\345:" }, + { 75, "\265\334\343\333\357\342\336\340 FM Towns" }, + { 76, "\310\322\330\324\332\330\331 \340\325\326\330\334" }, + { 77, "\262\332\333\356\347\325\335\366 \322 \321\366\333\324 \336\337\346\366\367:" }, + { 78, "\262\366\333\354\335\330\331 \336\323\333\357\324" }, + { 79, "\277\336\322\335\320 \335\320\327\322\320 \323\340\330" }, + { 80, "\277\336\322\335\336\325\332\340\320\335\335\330\331 \340\325\326\330\334" }, + { 81, "\277\340\330\341\332\336\340\325\335\335\357 GC \337\320\324\343:" }, + { 82, "\307\343\342\333\330\322\366\341\342\354 GC \337\320\324\343:" }, + { 83, "\263\340\344" }, + { 84, "\277\340\330\341\342\340\366\331 GM:" }, + { 85, "\274\336\322\320 \366\335\342\325\340\344\325\331\341\343:" }, + { 86, "\300\320\341\342\325\340\330\327\320\342\336\340 GUI:" }, + { 87, "\263\340\320" }, + { 88, "\275\325\334\320\364 \344\320\331\333\366\322 \323\340\330" }, + { 89, "Game Id \335\325 \337\366\324\342\340\330\334\343\364\342\354\341\357" }, + { 90, "\310\333\357\345 \324\336 \323\340\330: " }, + { 91, "\263\333\336\321\320\333\354\335\325 \334\325\335\356" }, + { 92, "\277\325\340\325\331\342\330 \335\320 \337\320\337\332\343 \340\366\322\335\325\334 \322\330\351\325" }, + { 93, "\262\322\325\340\345" }, + { 94, "\263\340\320\344\366\332\320" }, + { 95, "\263\340\320\344\366\347\335\330\331 \340\325\326\330\334:" }, + { 96, "\305\320\340\324\322\320\340\335\336\325 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\350\322\330\324\332\336, \320\333\325 \335\330\327\354\332\336\367 \357\332\336\341\342\366)" }, + { 97, "Hercules \317\335\342\320\340\335\330\331" }, + { 98, "Hercules \267\325\333\325\335\330\331" }, + { 99, "\267\320\345\336\322\320\342\330 \337\320\335\325\333\354 \366\335\341\342\340\343\334\325\335\342\366\322" }, + { 100, "\262\330\341\336\332\320 \357\332\366\341\342\354 \327\322\343\332\343 (\337\336\322\366\333\354\335\366\350\325) (\340\325\321\343\342)" }, + { 101, "\262\325\333\330\332\366 \327\335\320\347\325\335\335\357 \327\320\324\320\356\342\354 \332\340\320\351\343 \357\332\366\341\342\354 \327\322\343\332\343, \337\340\336\342\325 \322\336\335\330 \334\336\326\343\342\354 \335\325 \337\366\324\342\340\330\334\343\322\320\342\330\341\357 \322\320\350\336\356 \327\322\343\332\336\322\336\356 \332\320\340\342\336\356" }, + { 102, "\303\342\340\330\334\343\331\342\325 \332\333\320\322\366\350\343 Shift \324\333\357 \342\336\323\336, \351\336\321 \324\336\324\320\342\330 \324\325\332\366\333\354\332\320 \366\323\336\340" }, + { 103, "\263\336\340\330\327\336\335\342\320\333\354\335\330\331 underscan:" }, + { 104, "\265\334\343\333\357\342\336\340 IBM PCjr" }, + { 105, "ID:" }, + { 106, "\246\335\366\346\366\320\333\366\327\320\346\366\357 \334\325\340\325\326\366" }, + { 107, "\277\336\347\320\342\332\336\322\330\331 \334\320\341\350\342\320\321 \322\325\340\345\335\354\336\323\336 \325\332\340\320\335\343:" }, + { 108, "\275\320\341\342\340\336\356\356 \325\334\343\333\357\342\336\340 MT-32" }, + { 109, "\275\320\333\320\350\342\336\322\343\356 \334\325\340\325\326\343" }, + { 110, "\262\322\366\324" }, + { 111, "\275\325\337\340\320\322\330\333\354\335\330\331 \350\333\357\345" }, + { 112, "\277\340\330\327\335\320\347\325\335\335\357 \332\333\320\322\366\350" }, + { 113, "\272\333\320\322\366\320\342\343\340\320" }, + { 114, "\302\320\321\333\330\346\357 \332\333\320\322\366\350:" }, + { 115, "\272\333\320\322\366\350\366" }, + { 116, "\274\336\322\320 \323\340\320\344\366\347\335\336\323\336 \366\335\342\325\340\344\325\331\341\343 ScummVM" }, + { 117, "\274\336\322\320 \323\340\330. \267\334\366\335\320 \346\354\336\323\336 \337\320\340\320\334\325\342\340\343 \335\325 \337\325\340\325\342\322\336\340\330\342\354 \323\340\343 \335\320 \320\335\323\333\366\331\341\354\332\366\331 \322 \343\332\340\320\367\335\341\354\332\343" }, + { 118, "\274\336\322\320:" }, + { 119, "\262\333\366\322\336" }, + { 120, "\273\366\322\330\331 \332\333\366\332" }, + { 121, "\267\320\322\320\335\342\320\326\330\342\330" }, + { 122, "\267\320\322\320\335\342\320\326\330\342\330 \323\340\343:" }, + { 123, "\267\320\322\320\335\342\320\326\330\342\330 \327\321\325\340\325\326\325\335\335\357 \324\333\357 \322\330\321\340\320\335\336\367 \323\340\330" }, + { 124, "\265\334\343\333\357\342\336\340 MAME OPL:" }, + { 125, "MIDI" }, + { 126, "\277\336\341\330\333\325\335\335\357 MIDI:" }, + { 127, "MT-32" }, + { 128, "\277\340\330\341\342\340\366\331 MT-32:" }, + { 129, "\265\334\343\333\357\342\336\340 MT-32" }, + { 130, "\274\320\341\350\342\320\321 \323\336\333\336\322\335\336\323\336 \325\332\340\320\335\343:" }, + { 131, "\277\340\330\327\335\320\347\330\342\330" }, + { 132, "\264\336\324. \321\320\323\320\342\336..." }, + { 133, "\274\325\335\356" }, + { 134, "\300\366\327\335\325" }, + { 135, "\267\334\366\350\320\335\330\331 \340\325\326\330\334 AdLib/MIDI" }, + { 136, "\277\366\324\332\333\356\347\330\342\330 DVD" }, + { 137, "\277\366\324\332\333\356\347\330\342\330 SMB" }, + { 138, "\272\333\366\332 \334\330\350\332\336\356" }, + { 139, "\274\343\333\354\342\366\344\343\335\332\346\366\357" }, + { 140, "\274\343\327\330\347\335\330\331 \277\340\330\341\342\340\366\331:" }, + { 141, "\263\343\347\335\366\341\342\354 \334\343\327\330\332\330:" }, + { 142, "\262\330\334\332\335\343\342\330 \343\341\325" }, + { 143, "\275\320\327\322\320:" }, + { 144, "\274\325\340\325\326\320 \322\330\334\332\335\325\335\320" }, + { 145, "\274\325\340\325\326\320 \335\325 \335\320\333\320\323\336\324\326\325\335\320 (%d)" }, + { 146, "\274\325\340\325\326\320 \337\340\320\346\356\364" }, + { 147, "\274\325\340\325\326\320 \337\340\320\346\356\364, \337\320\337\332\320 \337\366\324\332\333\356\347\325\335\320" }, + { 148, "\275\366\332\336\333\330" }, + { 149, "\275\366" }, + { 150, "\264\320\342\320 \335\325 \327\320\337\330\341\320\335\320" }, + { 151, "\261\325\327 \334\343\327\330\332\330" }, + { 152, "\307\320\341 \323\340\330 \335\325 \327\320\337\330\341\320\335\336" }, + { 153, "\307\320\341 \335\325 \327\320\337\330\341\320\335\330\331" }, + { 154, "\275\325 \327\320\324\320\335\330\331" }, + { 155, "\261\325\327 \327\321\366\333\354\350\325\335\335\357" }, + { 156, "OK" }, + { 157, "\262\330\345\366\324\335\320 \347\320\341\342\336\342\320:" }, + { 158, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 MIDI" }, + { 159, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 MT-32" }, + { 160, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \320\343\324\366\336" }, + { 161, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \323\340\320\344\366\332\330" }, + { 162, "\277\325\340\325\332\340\330\342\330 \323\333\336\321\320\333\354\335\366 \343\341\342\320\335\336\322\332\330 \323\343\347\335\336\341\342\366" }, + { 163, "\265\334\343\333\357\342\336\340 PC \341\337\366\332\325\340\320" }, + { 164, "\277\320\340\336\333\354:" }, + { 165, "\310\333\357\345 \335\325 \364 \337\320\337\332\336\356" }, + { 166, "\310\333\357\345 \335\325 \364 \344\320\331\333\336\334" }, + { 167, "\310\333\357\345 \335\325 \327\335\320\331\324\325\335\330\331" }, + { 168, "\310\333\357\345\330" }, + { 169, "\277\320\343\327\320" }, + { 170, "\262\330\321\325\340\366\342\354 \323\340\343:" }, + { 171, "\277\333\320\342\344\336\340\334\320, \324\333\357 \357\332\336\367 \323\340\320 \321\343\333\320 \341\337\336\347\320\342\332\343 \340\336\327\340\336\321\333\325\335\320" }, + { 172, "\277\333\320\342\344\336\340\334\320:" }, + { 173, "\307\320\341 \323\340\330: " }, + { 174, "\261\343\324\354 \333\320\341\332\320, \322\330\321\325\340\366\342\354 \324\366\356" }, + { 175, "\310\333\357\345 \324\336 \337\333\320\323\366\335\366\322:" }, + { 176, "\277\340\330\341\342\340\366\331 \357\332\336\334\343 \322\366\324\324\320\364\342\354\341\357 \337\325\340\325\322\320\323\320:" }, + { 177, "\275\320\342\330\341\335\366\342\354 \332\333\320\322\366\350\343 \324\333\357 \337\340\330\327\335\320\347\325\335\335\357" }, + { 178, "\262\330\345\366\324" }, + { 179, "\262\330\345\366\324 \327 ScummVM" }, + { 180, "\275\325\324\336\341\342\320\342\335\354\336 \337\340\320\322 \324\333\357 \347\330\342\320\335\335\357" }, + { 181, "\277\336\334\330\333\332\320 \347\330\342\320\335\335\357" }, + { 182, "\277\325\340\325\337\340\330\327\335\320\347\330\342\330 \332\333\320\322\366\350\366" }, + { 183, "\262\330\324\320\333\330\342\330 \323\340\343 \327\366 \341\337\330\341\332\343. \275\325 \322\330\324\320\333\357\364 \323\340\343 \327 \326\336\340\341\342\332\336\323\336 \324\330\341\332\320" }, + { 184, "\300\325\326\330\334 \340\320\341\342\340\343\322\320\335\335\357:" }, + { 185, "\262\337\340\320\322\336" }, + { 186, "\277\340\320\322\330\331 \332\333\366\332" }, + { 187, "\277\340\320\322\330\331 \332\333\366\332" }, + { 188, "\277\336\322\325\340\335\343\342\330" }, + { 189, "\263\343\347\335\366\341\342\354 \325\344\325\332\342\366\322:" }, + { 190, "SMB" }, + { 191, "\267\320\337\330\341\320\342\330" }, + { 192, "\310\333\357\345 \327\321\325\340.: " }, + { 193, "\310\333\357\345 \324\333\357 \327\321\325\340\325\326\325\335\354: " }, + { 194, "\267\321\325\340\325\323\342\330 \323\340\343: " }, + { 195, "\277\336\350\343\332 \327\320\332\366\335\347\325\335\330\331!" }, + { 196, "\277\340\336\323\333\357\335\343\342\336 %d \337\320\337\336\332 ..." }, + { 197, "\263\336\333\336\322\335\325 \334\325\335\356 ScummVM" }, + { 198, "ScummVM \335\325 \327\334\366\323 \327\335\320\331\342\330 \324\322\330\326\336\332 \324\333\357 \327\320\337\343\341\332\343 \322\330\321\340\320\335\336\367 \323\340\330!" }, + { 199, "ScummVM \335\325 \334\336\326\325 \327\335\320\331\342\330 \323\340\343 \343 \322\332\320\327\320\335\366\331 \337\320\337\346\366!" }, + { 200, "ScummVM \335\325 \334\336\326\325 \322\366\324\332\340\330\342\330 \322\332\320\327\320\335\343 \337\320\337\332\343!" }, + { 201, "\277\336\350\343\332 \322 \341\337\330\341\332\343 \366\323\336\340" }, + { 202, "\277\336\350\343\332:" }, + { 203, "\262\330\321\325\340\366\342\354 SoundFont" }, + { 204, "\262\330\321\325\340\366\342\354 \342\325\334\343" }, + { 205, "\262\330\321\325\340\366\342\354 \324\336\324\320\342\332\336\322\343 \337\320\337\332\343 \323\340\330" }, + { 206, "\262\330\321\325\340\366\342\354 \324\366\356 \366 \332\333\366\332\335\366\342\354 '\277\340\330\327\335\320\347\330\342\330'" }, + { 207, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \342\325\334 GUI" }, + { 208, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \324\336\324\320\342\332\336\322\330\334\330 \344\320\331\333\320\334\330" }, + { 209, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \337\333\320\323\330\335\320\334\330" }, + { 210, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \327\321\325\340\325\326\325\335\354" }, + { 211, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \324\333\357 \327\321\325\340\325\326\325\335\354" }, + { 212, "\262\330\321\325\340\366\342\354 \337\320\337\332\343 \327 \344\320\331\333\320\334\330 \323\340\330" }, + { 213, "\307\343\342\333\330\322\366\341\342\354" }, + { 214, "\301\325\340\322\325\340:" }, + { 215, "\274\325\340\325\326\325\322\320 \337\320\337\332\320:" }, + { 216, "\272\336\340\336\342\332\330\331 \366\324\325\335\342\330\344\366\332\320\342\336\340, \357\332\330\331 \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357 \324\333\357 \335\320\327\322 \327\321\325\340\325\326\325\335\330\345 \366\323\336\340 \366 \324\333\357 \327\320\337\343\341\332\343 \327 \332\336\334\320\335\324\335\336\367 \341\342\340\366\347\332\330" }, + { 217, "\277\336\332\320\327\320\342\330 \332\333\320\322\366\320\342\343\340\343" }, + { 218, "\277\336\332\320\327\343\322\320\342\330 \332\343\340\341\336\340 \334\330\350\366" }, + { 219, "\277\336\332\320\327\343\322\320\342\330 \341\343\321\342\330\342\340\330 \366 \322\366\324\342\322\336\340\356\322\320\342\330 \334\336\322\343" }, + { 220, "\277\336\332\320\327\320\342\330/\301\345\336\322\320\342\330 \332\343\340\341\336\340" }, + { 221, "\277\340\336\337\343\341\342\330\342\330" }, + { 222, "\277\340\336\337\343\341\342\330\342\330 \340\357\324\336\332" }, + { 223, "\277\340\336\337\343\341\342\330\342\330 \342\325\332\341\342" }, + { 224, "\277\340\330\332\340\366\337\330\342\330 \324\336 \332\340\320\367\322" }, + { 225, "\277\340\336\323\340\320\334\335\325 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\345\336\340\336\350\320 \357\332\366\341\342\354, \320\333\325 \337\336\322\366\333\354\335\366\350\325)" }, + { 226, "\267\322\343\332 \343\322\366\334/\322\330\334\332" }, + { 227, "SoundFont \337\366\324\342\340\330\334\343\364\342\354\341\357 \324\325\357\332\330\334\330 \327\322\343\332\336\322\330\334\330 \332\320\340\342\320\334\330, Fluidsynth \366 Timidity" }, + { 228, "SoundFont:" }, + { 229, "\276\327\322" }, + { 230, "\301\337\325\346\366\320\333\354\335\366 \340\325\326\330\334\330 \340\325\335\324\325\340\330\335\323\343, \357\332\366 \337\366\324\342\340\330\334\343\356\342\354 \324\325\357\332\366 \366\323\340\330" }, + { 231, "\263\343\347\335\366\341\342\354 \341\337\325\346\366\320\333\354\335\330\345 \327\322\343\332\336\322\330\345 \325\344\325\332\342\366\322" }, + { 232, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \324\333\357 MIDI" }, + { 233, "\262\332\320\327\343\364 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \337\336 \343\334\336\322\347\320\335\335\356 \324\333\357 \322\330\322\336\324\343 \335\320 Roland MT-32/LAPC1/CM32l/CM64" }, + { 234, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \320\321\336 \325\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\367 \332\320\340\342\330" }, + { 235, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \324\336\324\320\342\332\336\322\330\345 \344\320\331\333\366\322 \324\320\335\330\345, \322\330\332\336\340\330\341\342\336\322\343\322\320\335\330\345 \343\341\366\334\320 \366\323\340\320\334\330, \320\321\336 ScummVM" }, + { 236, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \324\336\324\320\342\332\336\322\330\345 \344\320\331\333\366\322 \324\320\335\330\345 \324\333\357 \323\340\330" }, + { 237, "\262\332\320\327\343\364 \322\330\345\366\324\335\330\331 \327\322\343\332\336\322\330\331 \337\340\330\341\342\340\366\331 \320\321\336 \325\334\343\333\357\342\336\340 \327\322\343\332\336\322\336\367 \332\320\340\342\330" }, + { 238, "\262\332\320\327\343\364 \350\333\357\345 \324\336 \327\321\325\340\325\326\325\335\354 \323\340\330" }, + { 239, "\276\327\322\343\347\325\335\335\357" }, + { 240, "\263\343\347\335\366\341\342\354 \336\327\322\343\347\325\335\335\357:" }, + { 241, "\301\342\320\335\324\320\340\342\335\330\331 \340\320\341\342\325\340\330\327\320\342\336\340 (16bpp)" }, + { 242, "\267\320\337\343\341\342\330\342\330 \322\330\321\340\320\335\343 \323\340\343" }, + { 243, "\301\342\320\335:" }, + { 244, "\301\343\321" }, + { 245, "\310\322\330\324\332\366\341\342\354 \341\343\321\342\330\342\340\366\322:" }, + { 246, "\301\343\321\342\330\342\340\330" }, + { 247, "\267\334\366\335\330\342\330 \323\325\340\336\357" }, + { 248, "\302\320\337 \324\333\357 \333\366\322\336\323\336 \332\333\320\346\320\335\335\357, \337\336\324\322\366\331\335\330\331 \342\320\337 \324\333\357 \337\340\320\322\336\323\336 \332\333\320\346\320\335\335\357" }, + { 249, "\302\325\332\341\342 \366 \336\327\322\343\347\325\335\335\357:" }, + { 250, "\275\325 \334\336\326\343 \337\330\341\320\342\330 \343 \322\330\321\340\320\335\343 \337\320\337\332\343. \261\343\324\354 \333\320\341\332\320, \322\332\320\326\366\342\354 \366\335\350\343." }, + { 251, "\310\333\357\345 \324\336 \342\325\334:" }, + { 252, "\302\325\334\320:" }, + { 253, "\306\325\331 ID \323\340\330 \322\326\325 \322\330\332\336\340\330\341\342\336\322\343\364\342\354\341\357. \261\343\324\354 \333\320\341\332\320, \322\330\321\325\340\366\342\354 \366\335\350\330\331." }, + { 254, "\306\357 \323\340\320 \335\325 \337\366\324\342\340\330\334\343\364 \327\320\322\320\335\342\320\326\325\335\335\357 \327\321\325\340\325\326\325\335\354 \347\325\340\325\327 \323\336\333\336\322\335\325 \334\325\335\356." }, + { 255, "\307\320\341: " }, + { 256, "\307\320\341 \337\366\324\332\333\356\347\325\335\335\357 \324\336 \334\325\340\325\326\366 \322\330\342\366\332" }, + { 257, "\267\334\366\351\325\335\335\357 \342\336\340\332\320\335\354 \337\336 \336\341\366 X" }, + { 258, "\267\334\366\351\325\335\335\357 \342\336\340\332\320\335\354 \337\336 \336\341\366 Y" }, + { 259, "\300\325\326\330\334 \342\320\347\337\320\324\343 \322\330\334\332\335\325\335\330\331." }, + { 260, "\300\325\326\330\334 \342\320\347\337\320\324\343 \343\322\366\334\332\335\325\335\330\331." }, + { 261, "\301\337\340\320\322\326\335\366\331 Roland MT-32 (\322\330\334\332\335\343\342\330 \325\334\343\333\357\346\330\356 GM)" }, + { 262, "\262\330\334\330\332\320\364 \334\320\337\337\366\335\323 General MIDI \324\333\357 \366\323\336\340 \366\327 \327\322\343\332\336\322\336\356 \324\336\340\366\326\332\336\356 \324\333\357 Roland MT-32" }, + { 263, "\275\325\322\366\324\336\334\336" }, + { 264, "\275\325\322\366\324\336\334\320 \337\336\334\330\333\332\320" }, + { 265, "\262\366\324\332\333\356\347\330\342\330 DVD" }, + { 266, "\262\366\324\332\333\356\347\342\330 SMB" }, + { 267, "\261\325\327 \334\320\341\350\342\320\321\343\322\320\335\335\357 (\342\340\325\321\320 \321\343\324\325 \337\340\336\332\340\343\347\343\322\320\342\330 \335\320\333\366\322\336 \366 \335\320\337\340\320\322\336)" }, + { 268, "\300\325\326\330\334 \272\336\333\354\336\340\343 \335\325 \337\366\324\342\340\330\334\343\364\342\354\341\357" }, + { 269, "\267\321\325\340\325\326\325\335\335\357 \321\325\327 \366\334\325\335\366" }, + { 270, "\262\322\325\340\345" }, + { 271, "\262\330\332\336\340\330\341\342\336\322\343\322\320\342\330 \366 MIDI \366 AdLib \324\333\357 \323\325\335\325\340\320\346\366\367 \327\322\343\332\343" }, + { 272, "\262\330\332\336\340\330\341\342\336\322\343\322\320\342\330 \343\337\340\320\322\333\366\335\335\357 \332\343\340\341\336\340\336\334 \357\332 \335\320 \342\340\325\332\337\320\324\366 \333\320\337\342\336\337\366\322" }, + { 273, "\272\336\340\330\341\342\343\322\320\347:" }, + { 274, "\262\330\332\336\340\330\341\342\336\322\343\356 \324\340\320\331\322\325\340 SDL " }, + { 275, "\262\325\340\342\330\332\320\333\354\335\330\331 underscan:" }, + { 276, "\262\366\324\325\336" }, + { 277, "\262\366\340\342\343\320\333\354\335\320 \332\333\320\322\366\320\342\343\340\320" }, + { 278, "\263\343\347\335\366\341\342\354" }, + { 279, "Windows MIDI" }, + { 280, "\275\325\324\336\341\342\320\342\335\354\336 \337\340\320\322 \324\333\357 \327\320\337\330\341\343" }, + { 281, "\277\336\334\330\333\332\320 \327\320\337\330\341\343 \324\320\335\330\345" }, + { 282, "\302\320\332" }, + { 283, "\262\330 \337\336\322\330\335\335\366 \337\325\340\325\327\320\337\343\341\342\330\342\330 ScummVM \351\336\321 \327\320\341\342\336\341\343\322\320\342\330 \327\334\366\335\330." }, + { 284, "\267\336\335\320" }, + { 285, "\267\334\335\350. \334\320\350\342\320\321" }, + { 286, "\267\321\366\333. \334\320\350\342\320\321" }, + { 287, "\332\336\326\335\366 10 \345\322" }, + { 288, "\332\336\326\335\366 15 \345\322" }, + { 289, "\332\336\326\335\366 30 \345\322" }, + { 290, "\332\336\326\335\366 5 \345\322" }, + { 291, "\277\340\336 \337\340\336~\323~\340\320\334\343" }, + { 292, "~\264~\336\324. \323\340\343..." }, + { 293, "\262\366~\324~\334\366\335\320" }, + { 294, "~\267~\320\332\340\330\342\330" }, + { 295, "\300\325\324\320~\323~. \323\340\343..." }, + { 296, "~\264~\336\337\336\334\336\323\320" }, + { 297, "\272\325\340\343\322\320\335\335\357 \321\336\357\334\330 \322 Indy" }, + { 298, "~\272~\333\320\322\366\350\366" }, + { 299, "\273\366\322\336\340\343\332\330\331 \340\325\326\330\334" }, + { 300, "~\267~\320\322\320\335\342\320\326\330\342\330" }, + { 301, "~\267~\320\322\320\335..." }, + { 302, "~\275~\320\341\342" }, + { 303, "~O~K" }, + { 304, "~\276~\337\346\366\367" }, + { 305, "~\276~\337\346\366\367..." }, + { 306, "~\277~\336\337\325\340" }, + { 307, "~\262~\330\345\366\324" }, + { 308, "~\262~\330\324\320\333\330\342\330 \323\340\343" }, + { 309, "\277\340\336\324\336\322~\326~\330\342\330" }, + { 310, "~\277~\336\322\325\340\335\343\342\330\341\354 \322 \323\336\333\336\322\335\325 \334\325\335\356" }, + { 311, "~\267~\320\337\330\341\320\342\330" }, + { 312, "\267~\320~\337\343\341\332" }, + { 313, "\277\325\340\325\345\336\324\330 \320\332\342\330\322\336\322\320\335\366" }, + { 314, "\265\344\325\332\342\330 \322\336\324\330 \322\332\333\356\347\325\335\366" }, + { 315, "\300\325\326\330\334 \350\322\330\324\332\336\323\336 \337\325\340\325\345\336\324\343 \320\332\342\330\322\336\322\320\335\330\331" }, { -1, NULL } }; @@ -1597,62 +1976,323 @@ static const PoMessageEntry _translation_ca_ES[] = { { -1, NULL } }; -static const PoMessageEntry _translation_hu_HU[] = { - { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua \nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1250\nContent-Transfer-Encoding: 8bit\nLanguage: \nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, - { 14, "" }, - { 16, "AdLib vezet :" }, - { 17, "AdLib vezet :" }, - { 21, "Aspect adag korrekci\363" }, - { 24, "Hang" }, - { 25, "Automatikus ment\351s:" }, - { 28, "Kulcsok" }, - { 42, "Renderel\351si m\363d:" }, - { 53, "" }, - { 69, "K\351pess\351 Roland GS Mode" }, - { 74, "Extra \332tvonal:" }, - { 76, "Grafikus m\363d:" }, - { 80, "Teljes k\351perny s m\363d:" }, - { 86, "Lek\351pez eszk\366z GUI:" }, - { 90, "Extra \332tvonal:" }, - { 94, "Grafik\341val" }, - { 95, "Grafikus m\363d:" }, - { 115, "Kulcsok" }, - { 124, "AdLib vezet :" }, - { 126, "MIDI nyeres\351g:" }, - { 128, "Zene mennyis\351g:" }, - { 135, "Vegyes AdLib/MIDI m\363d" }, - { 140, "Zene mennyis\351g:" }, - { 141, "Zene mennyis\351g:" }, - { 142, "Muta \326sszes" }, - { 148, "Soha" }, - { 149, "Semmi" }, - { 154, "Semmi" }, - { 156, "Igen" }, - { 157, "Kimeneti teljes\355tm\351ny:" }, - { 168, "\326sv\351nyek" }, - { 169, "\326sv\351nyek" }, - { 184, "Renderel\351si m\363d:" }, - { 189, "SFX mennyis\351ge" }, - { 192, "Extra \332tvonal:" }, - { 214, "Soha" }, - { 239, "Csak a besz\351d" }, - { 240, "Besz\351d mennyis\351g:" }, - { 245, "Felirat sebess\351g:" }, - { 246, "Csak feliratok" }, - { 249, "Sz\366veg \351s besz\351d:" }, - { 252, "T\351ma:" }, - { 255, "T\351ma:" }, - { 261, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, - { 274, "Zenei vezet :" }, - { 278, "Volumene" }, - { 284, "Semmi" }, - { 287, "10 percenk\351nt" }, - { 288, "15 percenk\351nt" }, - { 289, "30 percenk\351nt" }, - { 290, "5 percenk\351nt" }, - { 298, "Kulcsok" }, - { 299, "Renderel\351si m\363d:" }, - { 303, "Igen" }, +static const PoMessageEntry _translation_es_ES[] = { + { 0, "Project-Id-Version: ScummVM 1.2.0svn\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-07-30 22:14+0100\nPO-Revision-Date: 2010-07-30 22:17+0100\nLast-Translator: Tom\341s Maidagan\nLanguage-Team: \nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: Espanol\n" }, + { 1, "\277Seguro que quieres salir?" }, + { 2, "(Activa)" }, + { 3, "(Juego)" }, + { 4, "(General)" }, + { 5, "(compilado el %s)" }, + { 6, ", error al montar el disco compartido" }, + { 7, ", disco compartido no montado" }, + { 8, "... progreso..." }, + { 9, "11kHz" }, + { 10, "22 kHz" }, + { 11, "44 kHz" }, + { 12, "48 kHz" }, + { 13, "8 kHz" }, + { 14, "" }, + { 15, "Acerca de ScummVM" }, + { 16, "Emulador de AdLib" }, + { 17, "Emulador de AdLib:" }, + { 18, "AdLib se usa para la m\372sica en muchos juegos" }, + { 19, "A\361adir juego..." }, + { 20, "Antialiasing (16bpp)" }, + { 21, "Correcci\363n de aspecto" }, + { 22, "Tecla asociada: %s" }, + { 23, "Tecla asociada: ninguna" }, + { 24, "Sonido" }, + { 25, "Autoguardado:" }, + { 26, "Motores disponibles:" }, + { 27, "Acerca ~d~e" }, + { 28, "Asignar teclas" }, + { 29, "Ambos" }, + { 30, "Brillo:" }, + { 31, "Cancelar" }, + { 32, "Imposible crear el archivo" }, + { 33, "Cambiar opciones de juego" }, + { 34, "Cambiar opciones generales de ScummVM" }, + { 35, "Marcar si se quiere usar un dispositivo de sonido real conectado al ordenador y compatible con Roland" }, + { 36, "Elegir" }, + { 37, "Elige la acci\363n a asociar" }, + { 38, "Eliminar valor" }, + { 39, "Cerrar" }, + { 40, "Corregir relaci\363n de aspecto en juegos 320x200" }, + { 41, "No se ha podido encontrar ning\372n motor capaz de ejecutar el juego" }, + { 42, "Modo de v\355deo actual:" }, + { 43, "Abajo" }, + { 44, "Izquierda" }, + { 45, "Derecha" }, + { 46, "Arriba" }, + { 47, "Emulador de DOSBox OPL" }, + { 48, "DVD" }, + { 49, "DVD montado con \351xito" }, + { 50, "DVD no montado" }, + { 51, "Fecha:" }, + { 52, "Debugger" }, + { 53, "Por defecto" }, + { 54, "Borrar" }, + { 55, "Desactivar apagado" }, + { 56, "GFX desactivados" }, + { 57, "Se han encontrado %d juegos nuevos..." }, + { 58, "Se han encontrado %d juegos nuevos." }, + { 59, "Pantalla" }, + { 60, "Mostrar el teclado" }, + { 61, "\277Seguro que quieres borrar esta partida?" }, + { 62, "\277Seguro que quieres eliminar la configuraci\363n de este juego?" }, + { 63, "\277Seguro que quieres ejecutar la detecci\363n masiva? Puede que se a\361ada un gran n\372mero de juegos." }, + { 64, "\277Quieres cargar o guardar el juego?" }, + { 65, "\277Quieres realizar una b\372squeda autom\341tica?" }, + { 66, "\277Quieres salir?" }, + { 67, "Doble golpe" }, + { 68, "Abajo" }, + { 69, "Activar modo Roland GS" }, + { 70, "El motor no soporta el nivel de debug '%s'" }, + { 71, "Ingl\351s" }, + { 72, "Error al ejecutar el juego:" }, + { 73, "Error al montar el DVD" }, + { 74, "Adicional:" }, + { 75, "Emulador de FM Towns" }, + { 76, "Modo r\341pido" }, + { 77, "Caracter\355sticas compiladas:" }, + { 78, "Vista libre" }, + { 79, "T\355tulo completo del juego" }, + { 80, "Pantalla completa" }, + { 81, "Aceleraci\363n del pad GC:" }, + { 82, "Sensibilidad del pad GC:" }, + { 83, "GFX" }, + { 84, "Dispositivo GM:" }, + { 85, "Idioma de la interfaz:" }, + { 86, "Render de la interfaz" }, + { 87, "Juego" }, + { 88, "No se han encontrado datos de juego" }, + { 89, "ID del juego no soportada" }, + { 90, "Juego:" }, + { 91, "Men\372 general" }, + { 92, "Ir al directorio anterior" }, + { 93, "Arriba" }, + { 94, "Gr\341ficos" }, + { 95, "Modo gr\341fico:" }, + { 96, "Escalado por hardware (r\341pido, pero de baja calidad)" }, + { 97, "Hercules \341mbar" }, + { 98, "Hercules verde" }, + { 99, "Ocultar barra de tareas" }, + { 100, "Sonido de alta calidad (m\341s lento) (reinicio)" }, + { 101, "Los valores m\341s altos ofrecen mayor calidad, pero puede que tu tarjeta de sonido no sea compatible" }, + { 102, "Mant\351n pulsado May\372s para a\361adir varios" }, + { 103, "Underscan horizontal" }, + { 104, "Emulador de IBM PCjr" }, + { 105, "ID:" }, + { 106, "Inicializar red" }, + { 107, "Escalado de la pantalla inicial superior:" }, + { 108, "Iniciando emulador de MT-32" }, + { 109, "Inicializando red" }, + { 110, "Entrada" }, + { 111, "Ruta no v\341lida" }, + { 112, "Asignaci\363n de teclas" }, + { 113, "Teclado" }, + { 114, "Asignaci\363n de teclas:" }, + { 115, "Teclas" }, + { 116, "Idioma de la interfaz de ScummVM" }, + { 117, "Idioma del juego. No sirve para pasar al ingl\351s la versi\363n espa\361ola de un juego" }, + { 118, "Idioma:" }, + { 119, "Izquierda" }, + { 120, "Clic izquierdo" }, + { 121, "Cargar" }, + { 122, "Cargar juego:" }, + { 123, "Cargar partida del juego seleccionado" }, + { 124, "Emulador de MAME OPL" }, + { 125, "MIDI" }, + { 126, "Ganancia MIDI:" }, + { 127, "MT-32" }, + { 128, "Dispositivo MT-32:" }, + { 129, "Emulador de MT-32" }, + { 130, "Escalado de la pantalla principal:" }, + { 131, "Asignar" }, + { 132, "A\361adir varios..." }, + { 133, "Men\372" }, + { 134, "Otros" }, + { 135, "Modo AdLib/MIDI" }, + { 136, "Montar DVD" }, + { 137, "Montar SMB" }, + { 138, "Clic de rat\363n" }, + { 139, "Multifunci\363n" }, + { 140, "Dispositivo de m\372sica:" }, + { 141, "Volumen de la m\372sica:" }, + { 142, "Silenciar" }, + { 143, "Nombre:" }, + { 144, "Red desconectada" }, + { 145, "Red no inicializada (%d)" }, + { 146, "Red conectada" }, + { 147, "Red conectada, disco compartido montado" }, + { 148, "Nunca" }, + { 149, "No" }, + { 150, "No hay fecha guardada" }, + { 151, "Sin m\372sica" }, + { 152, "No hay tiempo de juego guardado" }, + { 153, "No hay hora guardada" }, + { 154, "Ninguno" }, + { 155, "Normal (sin escalado)" }, + { 156, "De acuerdo" }, + { 157, "Frecuencia de salida:" }, + { 158, "Ignorar opciones MIDI generales" }, + { 159, "Ignorar opciones MT-32 generales" }, + { 160, "Ignorar opciones de sonido generales" }, + { 161, "Ignorar opciones gr\341ficas generales" }, + { 162, "Ignorar opciones de volumen generales" }, + { 163, "Emulador del altavoz de PC" }, + { 164, "Contrase\361a:" }, + { 165, "La ruta no es un directorio" }, + { 166, "La ruta no es un archivo" }, + { 167, "La ruta no existe" }, + { 168, "Rutas" }, + { 169, "Pausar" }, + { 170, "Elige el juego:" }, + { 171, "Plataforma para la que se dise\361\363 el juego" }, + { 172, "Plataforma:" }, + { 173, "Tiempo de juego:" }, + { 174, "Por favor, selecciona una acci\363n" }, + { 175, "Plugins:" }, + { 176, "Dispositivo preferido:" }, + { 177, "Pulsa la tecla a asignar" }, + { 178, "Salir" }, + { 179, "Cerrar ScummVM" }, + { 180, "Permiso de lectura denegado" }, + { 181, "Lectura fallida" }, + { 182, "Asignar teclas" }, + { 183, "Elimina el juego de la lista. Los archivos no se borran" }, + { 184, "Modo de renderizado:" }, + { 185, "Derecha" }, + { 186, "Clic derecho" }, + { 187, "Clic derecho" }, + { 188, "Rotar" }, + { 189, "Volumen de los efectos" }, + { 190, "SMB" }, + { 191, "Guardar" }, + { 192, "Partidas:" }, + { 193, "Partidas:" }, + { 194, "Guardar partida" }, + { 195, "\241B\372squeda completada!" }, + { 196, "Se ha buscado en %d directorios..." }, + { 197, "Men\372 principal de ScummVM" }, + { 198, "\241ScummVM no ha podido encontrar ning\372n motor capaz de ejecutar el juego!" }, + { 199, "\241ScummVM no ha encontrado ning\372n juego en el directorio!" }, + { 200, "\241ScummVM no ha podido abrir el directorio!" }, + { 201, "Buscar en la lista de juegos" }, + { 202, "Buscar:" }, + { 203, "Seleccionar SoundFont" }, + { 204, "Selecciona un tema" }, + { 205, "Seleccionar directorio de juego adicional" }, + { 206, "Selecciona una acci\363n y pulsa \"Asignar\"" }, + { 207, "Selecciona el directorio para temas de interfaz" }, + { 208, "Selecciona el directorio para archivos adicionales" }, + { 209, "Selecciona el directorio para plugins" }, + { 210, "Seleccionar directorio para partidas guardadas" }, + { 211, "Selecciona el directorio para partidas guardadas." }, + { 212, "Seleccionar directorio con los archivos del juego" }, + { 213, "Sensibilidad" }, + { 214, "Servidor:" }, + { 215, "Disco compartido:" }, + { 216, "Identificador usado para las partidas guardadas y para ejecutar el juego desde la l\355nea de comando" }, + { 217, "Mostrar teclado" }, + { 218, "Mostrar el cursor" }, + { 219, "Reproducir voces y subt\355tulos" }, + { 220, "Mostrar/ocultar cursor" }, + { 221, "Saltar" }, + { 222, "Saltar frase" }, + { 223, "Saltar texto" }, + { 224, "Pegar a los bordes" }, + { 225, "Escalado por software (buena calidad, pero m\341s lento)" }, + { 226, "Sonido activado/desactivado" }, + { 227, "Algunas tarjetas de sonido, Fluidsynth y Timidity soportan SoundFont" }, + { 228, "SoundFont:" }, + { 229, "Voces" }, + { 230, "Modos especiales de expansi\363n soportados por algunos juegos" }, + { 231, "Volumen de los efectos de sonido" }, + { 232, "Especifica el dispositivo de salida General MIDI por defecto" }, + { 233, "Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/CM64 por defecto" }, + { 234, "Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida" }, + { 235, "Especifica el directorio adicional usado por los juegos y ScummVM" }, + { 236, "Especifica un directorio para datos adicionales del juego" }, + { 237, "Especifica qu\351 dispositivo de sonido o emulador de tarjeta de sonido prefieres" }, + { 238, "Especifica d\363nde guardar tus partidas" }, + { 239, "Voces" }, + { 240, "Volumen de las voces" }, + { 241, "Est\341ndar (16bpp)" }, + { 242, "Jugar al juego seleccionado" }, + { 243, "Estado:" }, + { 244, "Subt." }, + { 245, "Velocidad de los subt\355tulos:" }, + { 246, "Subt\355tulos" }, + { 247, "Cambiar personaje" }, + { 248, "Un toque para clic izquierdo, dos para clic derecho" }, + { 249, "Texto y voces:" }, + { 250, "No se puede escribir en el directorio elegido. Por favor, selecciona otro." }, + { 251, "Temas:" }, + { 252, "Tema:" }, + { 253, "Esta ID ya est\341 siendo usada. Por favor, elige otra." }, + { 254, "Este juego no permite cargar partidas desde el lanzador." }, + { 255, "Hora:" }, + { 256, "Se ha excedido el tiempo de inicializaci\363n de red" }, + { 257, "Compensaci\363n X del toque" }, + { 258, "Compensaci\363n Y del toque" }, + { 259, "Modo Touchpad desactivado." }, + { 260, "Modo Touchpad activado." }, + { 261, "Roland MT-32 aut\351ntica (desactivar emulaci\363n GM)" }, + { 262, "Desactiva la conversi\363n General MIDI en juegos con sonido Roland MT-32" }, + { 263, "Desconocido" }, + { 264, "Error desconocido" }, + { 265, "Desmontar DVD" }, + { 266, "Desmontar SMB" }, + { 267, "Sin escalado (debes desplazar la pantalla a los lados)" }, + { 268, "Modo de color no soportado" }, + { 269, "Partida sin nombre" }, + { 270, "Arriba" }, + { 271, "Usar tanto MIDI como AdLib en la generaci\363n de sonido" }, + { 272, "Activar el sistema de control tipo trackpad de los port\341tiles" }, + { 273, "Usuario:" }, + { 274, "Usando driver SDL" }, + { 275, "Underscan vertical:" }, + { 276, "V\355deo" }, + { 277, "Teclado virtual" }, + { 278, "Volumen" }, + { 279, "Windows MIDI" }, + { 280, "Permiso de escritura denegado" }, + { 281, "Escritura de datos fallida" }, + { 282, "S\355" }, + { 283, "Tienes que reiniciar ScummVM para aplicar los cambios." }, + { 284, "Zona" }, + { 285, "Disminuir zoom" }, + { 286, "Aumentar zoom" }, + { 287, "cada 10 minutos" }, + { 288, "cada 15 minutos" }, + { 289, "cada 30 minutos" }, + { 290, "cada 5 minutos" }, + { 291, "Acerca ~d~e" }, + { 292, "~A~\361adir juego..." }, + { 293, "~C~ancelar" }, + { 294, "Cerra~r~" }, + { 295, "~E~ditar juego..." }, + { 296, "~A~yuda" }, + { 297, "Controles para pelear de ~I~ndy" }, + { 298, "~T~eclas" }, + { 299, "Modo para ~z~urdos" }, + { 300, "~C~argar" }, + { 301, "~C~argar..." }, + { 302, "Si~g~uiente" }, + { 303, "~S~\355" }, + { 304, "~O~opciones" }, + { 305, "~O~opciones..." }, + { 306, "~A~nterior" }, + { 307, "~S~alir" }, + { 308, "E~l~iminar juego" }, + { 309, "~R~eanudar" }, + { 310, "~V~olver al lanzador" }, + { 311, "~G~uardar" }, + { 312, "~J~ugar" }, + { 313, "Tra~n~siciones activadas" }, + { 314, "Efecto ag~u~a activado" }, + { 315, "Modo ~Z~ip activado" }, { -1, NULL } }; @@ -1984,10 +2624,12 @@ struct PoLangEntry { const PoLangEntry _translations[] = { { "ru_RU", "iso-8859-5", "Russian", _translation_ru_RU }, - { "fr_FR", "iso-8859-1", "Francais", _translation_fr_FR }, { "it_IT", "iso-8859-1", "Italiano", _translation_it_IT }, - { "ca_ES", "iso-8859-1", "Catalan", _translation_ca_ES }, { "hu_HU", "cp1250", NULL, _translation_hu_HU }, + { "fr_FR", "iso-8859-1", "Francais", _translation_fr_FR }, + { "uk_UA", "iso-8859-5", "Ukrainian", _translation_uk_UA }, + { "ca_ES", "iso-8859-1", "Catalan", _translation_ca_ES }, + { "es_ES", "iso-8859-1", "Espanol", _translation_es_ES }, { "de_DE", "iso-8859-1", "Deutsch", _translation_de_DE }, { NULL, NULL, NULL, NULL } }; diff --git a/gui/credits.h b/gui/credits.h index c0e1870226..bd4ecffc9b 100644 --- a/gui/credits.h +++ b/gui/credits.h @@ -384,6 +384,12 @@ static const char *credits[] = { "C1""Russian", "C0""Eugene Sandulenko", "", +"C1""Spanish", +"C0""Tom\341s Maidagan", +"", +"C1""Ukrainian", +"C0""Lubomyr Lisen", +"", "", "C1""Websites (design)", "C0""Dob\363 Bal\341zs", diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100644 index 0000000000..de9374f844 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,1428 @@ +# LANGUAGE translation for ScummVM. +# Copyright (C) YEAR ScummVM Team +# This file is distributed under the same license as the ScummVM package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" +"PO-Revision-Date: 2010-07-30 22:17+0100\n" +"Last-Translator: Tomás Maidagan\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: Espanol\n" + +#: gui/about.cpp:96 +#, c-format +msgid "(built on %s)" +msgstr "(compilado el %s)" + +#: gui/about.cpp:103 +msgid "Features compiled in:" +msgstr "Características compiladas:" + +#: gui/about.cpp:112 +msgid "Available engines:" +msgstr "Motores disponibles:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Arriba" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "Ir al directorio anterior" + +#: gui/browser.cpp:70 +#: gui/chooser.cpp:49 +#: gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:280 +#: gui/massadd.cpp:95 +#: gui/options.cpp:1029 +#: gui/saveload.cpp:65 +#: gui/saveload.cpp:157 +#: gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "Cancelar" + +#: gui/browser.cpp:71 +#: gui/chooser.cpp:50 +#: gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Elegir" + +#: gui/GuiManager.cpp:103 +#: backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "Cerrar" + +#: gui/GuiManager.cpp:106 +msgid "Mouse click" +msgstr "Clic de ratón" + +#: gui/GuiManager.cpp:109 +#: base/main.cpp:285 +msgid "Display keyboard" +msgstr "Mostrar el teclado" + +#: gui/GuiManager.cpp:112 +#: base/main.cpp:288 +msgid "Remap keys" +msgstr "Asignar teclas" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "Asignar" + +#: gui/KeysDialog.cpp:45 +#: gui/launcher.cpp:281 +#: gui/launcher.cpp:893 +#: gui/launcher.cpp:897 +#: gui/massadd.cpp:92 +#: gui/options.cpp:1030 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "De acuerdo" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "Selecciona una acción y pulsa \"Asignar\"" + +#: gui/KeysDialog.cpp:83 +#: gui/KeysDialog.cpp:105 +#: gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "Tecla asociada: %s" + +#: gui/KeysDialog.cpp:85 +#: gui/KeysDialog.cpp:107 +#: gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "Tecla asociada: ninguna" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "Por favor, selecciona una acción" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "Pulsa la tecla a asignar" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "Elige la acción a asociar" + +#: gui/launcher.cpp:172 +msgid "Game" +msgstr "Juego" + +#: gui/launcher.cpp:175 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:175 +#: gui/launcher.cpp:176 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "Identificador usado para las partidas guardadas y para ejecutar el juego desde la línea de comando" + +#: gui/launcher.cpp:179 +msgid "Name:" +msgstr "Nombre:" + +#: gui/launcher.cpp:179 +#: gui/launcher.cpp:180 +msgid "Full title of the game" +msgstr "Título completo del juego" + +#: gui/launcher.cpp:183 +msgid "Language:" +msgstr "Idioma:" + +#: gui/launcher.cpp:183 +#: gui/launcher.cpp:184 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "Idioma del juego. No sirve para pasar al inglés la versión española de un juego" + +#: gui/launcher.cpp:185 +#: gui/launcher.cpp:196 +#: gui/options.cpp:80 +#: gui/options.cpp:635 +#: gui/options.cpp:645 +#: gui/options.cpp:1000 +#: sound/null.cpp:42 +msgid "" +msgstr "" + +#: gui/launcher.cpp:194 +msgid "Platform:" +msgstr "Plataforma:" + +#: gui/launcher.cpp:194 +#: gui/launcher.cpp:195 +msgid "Platform the game was originally designed for" +msgstr "Plataforma para la que se diseñó el juego" + +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 +msgid "Graphics" +msgstr "Gráficos" + +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 +msgid "GFX" +msgstr "GFX" + +#: gui/launcher.cpp:208 +msgid "Override global graphic settings" +msgstr "Ignorar opciones gráficas generales" + +#: gui/launcher.cpp:215 +#: gui/options.cpp:921 +msgid "Audio" +msgstr "Sonido" + +#: gui/launcher.cpp:217 +msgid "Override global audio settings" +msgstr "Ignorar opciones de sonido generales" + +#: gui/launcher.cpp:225 +#: gui/options.cpp:925 +msgid "Volume" +msgstr "Volumen" + +#: gui/launcher.cpp:227 +msgid "Override global volume settings" +msgstr "Ignorar opciones de volumen generales" + +#: gui/launcher.cpp:234 +#: gui/options.cpp:933 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:236 +msgid "Override global MIDI settings" +msgstr "Ignorar opciones MIDI generales" + +#: gui/launcher.cpp:246 +#: gui/options.cpp:939 +msgid "MT-32" +msgstr "MT-32" + +#: gui/launcher.cpp:248 +msgid "Override global MT-32 settings" +msgstr "Ignorar opciones MT-32 generales" + +#: gui/launcher.cpp:258 +#: gui/options.cpp:945 +msgid "Paths" +msgstr "Rutas" + +#: gui/launcher.cpp:264 +msgid "Game Path:" +msgstr "Juego:" + +#: gui/launcher.cpp:268 +#: gui/options.cpp:958 +msgid "Extra Path:" +msgstr "Adicional:" + +#: gui/launcher.cpp:268 +#: gui/launcher.cpp:269 +msgid "Specifies path to additional data used the game" +msgstr "Especifica un directorio para datos adicionales del juego" + +#: gui/launcher.cpp:272 +msgid "Save Path:" +msgstr "Partidas:" + +#: gui/launcher.cpp:272 +#: gui/launcher.cpp:273 +#: gui/options.cpp:952 +#: gui/options.cpp:953 +msgid "Specifies where your savegames are put" +msgstr "Especifica dónde guardar tus partidas" + +#: gui/launcher.cpp:289 +#: gui/launcher.cpp:369 +#: gui/launcher.cpp:418 +#: gui/options.cpp:230 +#: gui/options.cpp:399 +#: gui/options.cpp:497 +#: gui/options.cpp:555 +#: gui/options.cpp:732 +#: gui/options.cpp:956 +#: gui/options.cpp:959 +#: gui/options.cpp:963 +#: gui/options.cpp:1053 +#: gui/options.cpp:1059 +#: gui/options.cpp:1065 +#: gui/options.cpp:1073 +#: gui/options.cpp:1097 +#: gui/options.cpp:1101 +#: gui/options.cpp:1107 +#: gui/options.cpp:1114 +#: gui/options.cpp:1213 +msgid "None" +msgstr "Ninguno" + +#: gui/launcher.cpp:294 +#: gui/launcher.cpp:373 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "Por defecto" + +#: gui/launcher.cpp:411 +#: gui/options.cpp:1207 +msgid "Select SoundFont" +msgstr "Seleccionar SoundFont" + +#: gui/launcher.cpp:430 +#: gui/launcher.cpp:568 +msgid "Select directory with game data" +msgstr "Seleccionar directorio con los archivos del juego" + +#: gui/launcher.cpp:448 +msgid "Select additional game directory" +msgstr "Seleccionar directorio de juego adicional" + +#: gui/launcher.cpp:460 +msgid "Select directory for saved games" +msgstr "Seleccionar directorio para partidas guardadas" + +#: gui/launcher.cpp:479 +msgid "This game ID is already taken. Please choose another one." +msgstr "Esta ID ya está siendo usada. Por favor, elige otra." + +#: gui/launcher.cpp:520 +#: engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~S~alir" + +#: gui/launcher.cpp:520 +msgid "Quit ScummVM" +msgstr "Cerrar ScummVM" + +#: gui/launcher.cpp:521 +msgid "A~b~out..." +msgstr "Acerca ~d~e" + +#: gui/launcher.cpp:521 +msgid "About ScummVM" +msgstr "Acerca de ScummVM" + +#: gui/launcher.cpp:522 +msgid "~O~ptions..." +msgstr "~O~opciones..." + +#: gui/launcher.cpp:522 +msgid "Change global ScummVM options" +msgstr "Cambiar opciones generales de ScummVM" + +#: gui/launcher.cpp:524 +msgid "~S~tart" +msgstr "~J~ugar" + +#: gui/launcher.cpp:524 +msgid "Start selected game" +msgstr "Jugar al juego seleccionado" + +#: gui/launcher.cpp:527 +msgid "~L~oad..." +msgstr "~C~argar..." + +#: gui/launcher.cpp:527 +msgid "Load savegame for selected game" +msgstr "Cargar partida del juego seleccionado" + +#: gui/launcher.cpp:531 +msgid "~A~dd Game..." +msgstr "~A~ñadir juego..." + +#: gui/launcher.cpp:531 +msgid "Hold Shift for Mass Add" +msgstr "Mantén pulsado Mayús para añadir varios" + +#: gui/launcher.cpp:533 +msgid "~E~dit Game..." +msgstr "~E~ditar juego..." + +#: gui/launcher.cpp:533 +msgid "Change game options" +msgstr "Cambiar opciones de juego" + +#: gui/launcher.cpp:535 +msgid "~R~emove Game" +msgstr "E~l~iminar juego" + +#: gui/launcher.cpp:535 +msgid "Remove game from the list. The game data files stay intact" +msgstr "Elimina el juego de la lista. Los archivos no se borran" + +#: gui/launcher.cpp:542 +msgid "Search in game list" +msgstr "Buscar en la lista de juegos" + +#: gui/launcher.cpp:546 +#: gui/launcher.cpp:1057 +msgid "Search:" +msgstr "Buscar:" + +#: gui/launcher.cpp:549 +#: gui/options.cpp:733 +msgid "Clear value" +msgstr "Eliminar valor" + +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Cargar juego:" + +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "Cargar" + +#: gui/launcher.cpp:680 +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "¿Seguro que quieres ejecutar la detección masiva? Puede que se añada un gran número de juegos." + +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "Sí" + +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "No" + +#: gui/launcher.cpp:728 +msgid "ScummVM couldn't open the specified directory!" +msgstr "¡ScummVM no ha podido abrir el directorio!" + +#: gui/launcher.cpp:740 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "¡ScummVM no ha encontrado ningún juego en el directorio!" + +#: gui/launcher.cpp:754 +msgid "Pick the game:" +msgstr "Elige el juego:" + +#: gui/launcher.cpp:830 +msgid "Do you really want to remove this game configuration?" +msgstr "¿Seguro que quieres eliminar la configuración de este juego?" + +#: gui/launcher.cpp:893 +msgid "This game does not support loading games from the launcher." +msgstr "Este juego no permite cargar partidas desde el lanzador." + +#: gui/launcher.cpp:897 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "¡ScummVM no ha podido encontrar ningún motor capaz de ejecutar el juego!" + +#: gui/launcher.cpp:1009 +msgid "Mass Add..." +msgstr "Añadir varios..." + +#: gui/launcher.cpp:1010 +msgid "Add Game..." +msgstr "Añadir juego..." + +#: gui/massadd.cpp:79 +#: gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... progreso..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "¡Búsqueda completada!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "Se han encontrado %d juegos nuevos." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "Se ha buscado en %d directorios..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "Se han encontrado %d juegos nuevos..." + +#: gui/options.cpp:78 +msgid "Never" +msgstr "Nunca" + +#: gui/options.cpp:78 +msgid "every 5 mins" +msgstr "cada 5 minutos" + +#: gui/options.cpp:78 +msgid "every 10 mins" +msgstr "cada 10 minutos" + +#: gui/options.cpp:78 +msgid "every 15 mins" +msgstr "cada 15 minutos" + +#: gui/options.cpp:78 +msgid "every 30 mins" +msgstr "cada 30 minutos" + +#: gui/options.cpp:80 +msgid "8 kHz" +msgstr "8 kHz" + +#: gui/options.cpp:80 +msgid "11kHz" +msgstr "11kHz" + +#: gui/options.cpp:80 +msgid "22 kHz" +msgstr "22 kHz" + +#: gui/options.cpp:80 +msgid "44 kHz" +msgstr "44 kHz" + +#: gui/options.cpp:80 +msgid "48 kHz" +msgstr "48 kHz" + +#: gui/options.cpp:632 +msgid "Graphics mode:" +msgstr "Modo gráfico:" + +#: gui/options.cpp:643 +msgid "Render mode:" +msgstr "Modo de renderizado:" + +#: gui/options.cpp:643 +#: gui/options.cpp:644 +msgid "Special dithering modes supported by some games" +msgstr "Modos especiales de expansión soportados por algunos juegos" + +#: gui/options.cpp:653 +msgid "Fullscreen mode" +msgstr "Pantalla completa" + +#: gui/options.cpp:656 +msgid "Aspect ratio correction" +msgstr "Corrección de aspecto" + +#: gui/options.cpp:656 +msgid "Correct aspect ratio for 320x200 games" +msgstr "Corregir relación de aspecto en juegos 320x200" + +#: gui/options.cpp:663 +msgid "Preferred Device:" +msgstr "Dispositivo preferido:" + +#: gui/options.cpp:663 +msgid "Music Device:" +msgstr "Dispositivo de música:" + +#: gui/options.cpp:663 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "Especifica qué dispositivo de sonido o emulador de tarjeta de sonido prefieres" + +#: gui/options.cpp:663 +#: gui/options.cpp:664 +msgid "Specifies output sound device or sound card emulator" +msgstr "Especifica el dispositivo de sonido o emulador de tarjeta de sonido de salida" + +#: gui/options.cpp:688 +msgid "AdLib emulator:" +msgstr "Emulador de AdLib:" + +#: gui/options.cpp:688 +#: gui/options.cpp:689 +msgid "AdLib is used for music in many games" +msgstr "AdLib se usa para la música en muchos juegos" + +#: gui/options.cpp:699 +msgid "Output rate:" +msgstr "Frecuencia de salida:" + +#: gui/options.cpp:699 +#: gui/options.cpp:700 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "Los valores más altos ofrecen mayor calidad, pero puede que tu tarjeta de sonido no sea compatible" + +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "Dispositivo GM:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "Especifica el dispositivo de salida General MIDI por defecto" + +#: gui/options.cpp:731 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:731 +#: gui/options.cpp:732 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "Algunas tarjetas de sonido, Fluidsynth y Timidity soportan SoundFont" + +#: gui/options.cpp:736 +msgid "Mixed AdLib/MIDI mode" +msgstr "Modo AdLib/MIDI" + +#: gui/options.cpp:736 +msgid "Use both MIDI and AdLib sound generation" +msgstr "Usar tanto MIDI como AdLib en la generación de sonido" + +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "Ganancia MIDI:" + +#: gui/options.cpp:749 +msgid "MT-32 Device:" +msgstr "Dispositivo MT-32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "Especifica el dispositivo de sonido para la salida Roland MT-32/LAPC1/CM32l/CM64 por defecto" + +#: gui/options.cpp:753 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Roland MT-32 auténtica (desactivar emulación GM)" + +#: gui/options.cpp:753 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "Marcar si se quiere usar un dispositivo de sonido real conectado al ordenador y compatible con Roland" + +#: gui/options.cpp:756 +msgid "Enable Roland GS Mode" +msgstr "Activar modo Roland GS" + +#: gui/options.cpp:756 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "Desactiva la conversión General MIDI en juegos con sonido Roland MT-32" + +#: gui/options.cpp:780 +msgid "Text and Speech:" +msgstr "Texto y voces:" + +#: gui/options.cpp:785 +#: gui/options.cpp:791 +msgid "Speech" +msgstr "Voces" + +#: gui/options.cpp:786 +#: gui/options.cpp:792 +msgid "Subtitles" +msgstr "Subtítulos" + +#: gui/options.cpp:787 +#: gui/options.cpp:793 +msgid "Both" +msgstr "Ambos" + +#: gui/options.cpp:791 +msgid "Spch" +msgstr "Voces" + +#: gui/options.cpp:792 +msgid "Subs" +msgstr "Subt." + +#: gui/options.cpp:793 +msgid "Show subtitles and play speech" +msgstr "Reproducir voces y subtítulos" + +#: gui/options.cpp:797 +msgid "Subtitle speed:" +msgstr "Velocidad de los subtítulos:" + +#: gui/options.cpp:809 +msgid "Music volume:" +msgstr "Volumen de la música:" + +#: gui/options.cpp:816 +msgid "Mute All" +msgstr "Silenciar" + +#: gui/options.cpp:819 +msgid "SFX volume:" +msgstr "Volumen de los efectos" + +#: gui/options.cpp:819 +#: gui/options.cpp:820 +msgid "Special sound effects volume" +msgstr "Volumen de los efectos de sonido" + +#: gui/options.cpp:826 +msgid "Speech volume:" +msgstr "Volumen de las voces" + +#: gui/options.cpp:952 +msgid "Save Path: " +msgstr "Partidas:" + +#: gui/options.cpp:955 +msgid "Theme Path:" +msgstr "Temas:" + +#: gui/options.cpp:958 +#: gui/options.cpp:959 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "Especifica el directorio adicional usado por los juegos y ScummVM" + +#: gui/options.cpp:962 +msgid "Plugins Path:" +msgstr "Plugins:" + +#: gui/options.cpp:970 +msgid "Misc" +msgstr "Otros" + +#: gui/options.cpp:972 +msgid "Theme:" +msgstr "Tema:" + +#: gui/options.cpp:976 +msgid "GUI Renderer:" +msgstr "Render de la interfaz" + +#: gui/options.cpp:982 +msgid "Autosave:" +msgstr "Autoguardado:" + +#: gui/options.cpp:990 +msgid "Keys" +msgstr "Teclas" + +#: gui/options.cpp:997 +msgid "GUI Language:" +msgstr "Idioma de la interfaz:" + +#: gui/options.cpp:997 +msgid "Language of ScummVM GUI" +msgstr "Idioma de la interfaz de ScummVM" + +#: gui/options.cpp:1002 +msgid "English" +msgstr "Inglés" + +#: gui/options.cpp:1146 +msgid "You have to restart ScummVM to take the effect." +msgstr "Tienes que reiniciar ScummVM para aplicar los cambios." + +#: gui/options.cpp:1159 +msgid "Select directory for savegames" +msgstr "Selecciona el directorio para partidas guardadas." + +#: gui/options.cpp:1166 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "No se puede escribir en el directorio elegido. Por favor, selecciona otro." + +#: gui/options.cpp:1175 +msgid "Select directory for GUI themes" +msgstr "Selecciona el directorio para temas de interfaz" + +#: gui/options.cpp:1185 +msgid "Select directory for extra files" +msgstr "Selecciona el directorio para archivos adicionales" + +#: gui/options.cpp:1196 +msgid "Select directory for plugins" +msgstr "Selecciona el directorio para plugins" + +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:241 +msgid "No date saved" +msgstr "No hay fecha guardada" + +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:242 +msgid "No time saved" +msgstr "No hay hora guardada" + +#: gui/saveload.cpp:62 +#: gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "No hay tiempo de juego guardado" + +#: gui/saveload.cpp:69 +#: gui/saveload.cpp:157 +msgid "Delete" +msgstr "Borrar" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "¿Seguro que quieres borrar esta partida?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Fecha:" + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Hora:" + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Tiempo de juego:" + +#: gui/saveload.cpp:286 +#: gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Partida sin nombre" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Selecciona un tema" + +#: gui/ThemeEngine.cpp:334 +msgid "Disabled GFX" +msgstr "GFX desactivados" + +#: gui/ThemeEngine.cpp:335 +msgid "Standard Renderer (16bpp)" +msgstr "Estándar (16bpp)" + +#: gui/ThemeEngine.cpp:337 +msgid "Antialiased Renderer (16bpp)" +msgstr "Antialiasing (16bpp)" + +#: base/main.cpp:205 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "El motor no soporta el nivel de debug '%s'" + +#: base/main.cpp:273 +msgid "Menu" +msgstr "Menú" + +#: base/main.cpp:276 +#: backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "Saltar" + +#: base/main.cpp:279 +#: backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "Pausar" + +#: base/main.cpp:282 +msgid "Skip line" +msgstr "Saltar frase" + +#: base/main.cpp:404 +msgid "Error running game:" +msgstr "Error al ejecutar el juego:" + +#: base/main.cpp:430 +#: base/main.cpp:431 +msgid "Could not find any engine capable of running the selected game" +msgstr "No se ha podido encontrar ningún motor capaz de ejecutar el juego" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Ruta no válida" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "No se han encontrado datos de juego" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "ID del juego no soportada" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Modo de color no soportado" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Permiso de lectura denegado" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Permiso de escritura denegado" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "La ruta no existe" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "La ruta no es un directorio" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "La ruta no es un archivo" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Imposible crear el archivo" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Lectura fallida" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Escritura de datos fallida" + +#: common/error.cpp:60 +#: common/error.cpp:71 +msgid "Unknown Error" +msgstr "Error desconocido" + +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "Hercules verde" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "Hercules ámbar" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "~R~eanudar" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~C~argar" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~G~uardar" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~O~opciones" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~A~yuda" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "Acerca ~d~e" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "~V~olver al lanzador" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Guardar partida" + +#: engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "Guardar" + +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~S~í" + +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "~C~ancelar" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~T~eclas" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~A~nterior" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "Si~g~uiente" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 +msgid "~C~lose" +msgstr "Cerra~r~" + +#: engines/mohawk/dialogs.cpp:81 +#: engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "Modo ~Z~ip activado" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "Tra~n~siciones activadas" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "Efecto ag~u~a activado" + +#: sound/fmopl.cpp:51 +msgid "MAME OPL emulator" +msgstr "Emulador de MAME OPL" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "Emulador de DOSBox OPL" + +#: sound/null.h:45 +msgid "No music" +msgstr "Sin música" + +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" +msgstr "Emulador de AdLib" + +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" +msgstr "Iniciando emulador de MT-32" + +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" +msgstr "Emulador de MT-32" + +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "Emulador del altavoz de PC" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" +msgstr "Emulador de IBM PCjr" + +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" +msgstr "Emulador de FM Towns" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "Asignación de teclas:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr "(Activa)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr "(General)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr "(Juego)" + +#: backends/midi/windows.cpp:157 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 +msgid "ScummVM Main Menu" +msgstr "Menú principal de ScummVM" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "~L~eft handed mode" +msgstr "Modo para ~z~urdos" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 +msgid "~I~ndy fight controls" +msgstr "Controles para pelear de ~I~ndy" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Show mouse cursor" +msgstr "Mostrar el cursor" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 +msgid "Snap to edges" +msgstr "Pegar a los bordes" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 +msgid "Touch X Offset" +msgstr "Compensación X del toque" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 +msgid "Touch Y Offset" +msgstr "Compensación Y del toque" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Use laptop trackpad-style cursor control" +msgstr "Activar el sistema de control tipo trackpad de los portátiles" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 +msgid "Tap for left click, double tap right click" +msgstr "Un toque para clic izquierdo, dos para clic derecho" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 +msgid "Sensitivity" +msgstr "Sensibilidad" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 +msgid "Initial top screen scale:" +msgstr "Escalado de la pantalla inicial superior:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Main screen scaling:" +msgstr "Escalado de la pantalla principal:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 +msgid "Hardware scale (fast, but low quality)" +msgstr "Escalado por hardware (rápido, pero de baja calidad)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Software scale (good quality, but slower)" +msgstr "Escalado por software (buena calidad, pero más lento)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 +msgid "Unscaled (you must scroll left and right)" +msgstr "Sin escalado (debes desplazar la pantalla a los lados)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 +msgid "Brightness:" +msgstr "Brillo:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 +msgid "High quality audio (slower) (reboot)" +msgstr "Sonido de alta calidad (más lento) (reinicio)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 +msgid "Disable power off" +msgstr "Desactivar apagado" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "Modo Touchpad activado." + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "Modo Touchpad desactivado." + +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "Normal (sin escalado)" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "Arriba" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "Abajo" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "Izquierda" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "Derecha" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "Clic izquierdo" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "Clic derecho" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "Zona" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "Multifunción" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "Cambiar personaje" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "Saltar texto" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "Modo rápido" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "Salir" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "Debugger" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "Menú general" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "Teclado virtual" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "Asignación de teclas" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "¿Quieres salir?" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "Vídeo" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "Modo de vídeo actual:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "Doble golpe" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "Underscan horizontal" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "Underscan vertical:" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "Entrada" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "Sensibilidad del pad GC:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "Aceleración del pad GC:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "Estado:" + +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "Desconocido" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "Montar DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "Desmontar DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "Servidor:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "Disco compartido:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "Usuario:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "Contraseña:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "Inicializar red" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "Montar SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "Desmontar SMB" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "DVD montado con éxito" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "Error al montar el DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "DVD no montado" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "Red conectada, disco compartido montado" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "Red conectada" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr ", error al montar el disco compartido" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr ", disco compartido no montado" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "Red desconectada" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "Inicializando red" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "Se ha excedido el tiempo de inicialización de red" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "Red no inicializada (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "Ocultar barra de tareas" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "Mostrar teclado" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "Sonido activado/desactivado" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "Clic derecho" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "Mostrar/ocultar cursor" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "Vista libre" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "Aumentar zoom" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "Disminuir zoom" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "Asignar teclas" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "Arriba" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "Abajo" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "Izquierda" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "Derecha" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "¿Quieres cargar o guardar el juego?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr "¿Seguro que quieres salir?" + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "Teclado" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "Rotar" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "Usando driver SDL" + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "Pantalla" + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "¿Quieres realizar una búsqueda automática?" + diff --git a/po/uk_UA.po b/po/uk_UA.po new file mode 100644 index 0000000000..fdbfcb89a4 --- /dev/null +++ b/po/uk_UA.po @@ -0,0 +1,1433 @@ +# Ukrainian translation for ScummVM. +# Copyright (C) 2010 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Lubomyr Lisen , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM VERSION\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-07-30 22:14+0100\n" +"PO-Revision-Date: 2010-07-30 22:19+0100\n" +"Last-Translator: Lubomyr Lisen\n" +"Language-Team: Ukrainian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-5\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: Ukrainian\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: gui/about.cpp:96 +#, c-format +msgid "(built on %s)" +msgstr "(×öÑàÐÝØÙ %s)" + +#: gui/about.cpp:103 +msgid "Features compiled in:" +msgstr "²ÚÛîçÕÝö Ò ÑöÛÔ Þßæö÷:" + +#: gui/about.cpp:112 +msgid "Available engines:" +msgstr "´ÞáâãßÝö ÔÒØÖÚØ:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "²ÒÕàå" + +#: gui/browser.cpp:69 +msgid "Go to previous directory level" +msgstr "¿ÕàÕÙâØ ÝÐ ßÐßÚã àöÒÝÕÜ ÒØéÕ" + +#: gui/browser.cpp:70 +#: gui/chooser.cpp:49 +#: gui/KeysDialog.cpp:46 +#: gui/launcher.cpp:280 +#: gui/massadd.cpp:95 +#: gui/options.cpp:1029 +#: gui/saveload.cpp:65 +#: gui/saveload.cpp:157 +#: gui/themebrowser.cpp:56 +#: backends/platform/wii/options.cpp:48 +msgid "Cancel" +msgstr "²öÔÜöÝÐ" + +#: gui/browser.cpp:71 +#: gui/chooser.cpp:50 +#: gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "²ØÑàÐâØ" + +#: gui/GuiManager.cpp:103 +#: backends/keymapper/remap-dialog.cpp:54 +msgid "Close" +msgstr "·ÐÚàØâØ" + +#: gui/GuiManager.cpp:106 +msgid "Mouse click" +msgstr "ºÛöÚ ÜØèÚÞî" + +#: gui/GuiManager.cpp:109 +#: base/main.cpp:285 +msgid "Display keyboard" +msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã" + +#: gui/GuiManager.cpp:112 +#: base/main.cpp:288 +msgid "Remap keys" +msgstr "¿ÕàÕßàØ×ÝÐçØâØ ÚÛÐÒöèö" + +#: gui/KeysDialog.cpp:44 +msgid "Map" +msgstr "¿àØ×ÝÐçØâØ" + +#: gui/KeysDialog.cpp:45 +#: gui/launcher.cpp:281 +#: gui/launcher.cpp:893 +#: gui/launcher.cpp:897 +#: gui/massadd.cpp:92 +#: gui/options.cpp:1030 +#: backends/platform/wii/options.cpp:47 +#: backends/platform/wince/CELauncherDialog.cpp:56 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:52 +msgid "Select an action and click 'Map'" +msgstr "²ØÑÕàöâì Ôöî ö ÚÛöÚÝöâì '¿àØ×ÝÐçØâØ'" + +#: gui/KeysDialog.cpp:83 +#: gui/KeysDialog.cpp:105 +#: gui/KeysDialog.cpp:144 +#, c-format +msgid "Associated key : %s" +msgstr "¿àØ×ÝÐçÕÝÐ ÚÛÐÒöèÐ : %s" + +#: gui/KeysDialog.cpp:85 +#: gui/KeysDialog.cpp:107 +#: gui/KeysDialog.cpp:146 +#, c-format +msgid "Associated key : none" +msgstr "¿àØ×ÝÐçÕÝÐ ÚÛÐÒöèÐ : ÝÕÜÐô" + +#: gui/KeysDialog.cpp:93 +msgid "Please select an action" +msgstr "±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì Ôöî" + +#: gui/KeysDialog.cpp:109 +msgid "Press the key to associate" +msgstr "½ÐâØáÝöâì ÚÛÐÒöèã ÔÛï ßàØ×ÝÐçÕÝÝï" + +#: gui/KeysDialog.cpp:148 +msgid "Choose an action to map" +msgstr "²ØÑÕàöâì Ôöî ÔÛï ßàØ×ÝÐçÕÝÝï" + +#: gui/launcher.cpp:172 +msgid "Game" +msgstr "³àÐ" + +#: gui/launcher.cpp:175 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:175 +#: gui/launcher.cpp:176 +msgid "Short game identifier used for referring to savegames and running the game from the command line" +msgstr "ºÞàÞâÚØÙ öÔÕÝâØäöÚÐâÞà, ïÚØÙ ÒØÚÞàØáâÞÒãôâìáï ÔÛï ÝÐ×Ò ×ÑÕàÕÖÕÝØå öÓÞà ö ÔÛï ×ÐßãáÚã × ÚÞÜÐÝÔÝÞ÷ áâàöçÚØ" + +#: gui/launcher.cpp:179 +msgid "Name:" +msgstr "½Ð×ÒÐ:" + +#: gui/launcher.cpp:179 +#: gui/launcher.cpp:180 +msgid "Full title of the game" +msgstr "¿ÞÒÝÐ ÝÐ×ÒÐ ÓàØ" + +#: gui/launcher.cpp:183 +msgid "Language:" +msgstr "¼ÞÒÐ:" + +#: gui/launcher.cpp:183 +#: gui/launcher.cpp:184 +msgid "Language of the game. This will not turn your Spanish game version into English" +msgstr "¼ÞÒÐ ÓàØ. ·ÜöÝÐ æìÞÓÞ ßÐàÐÜÕâàã ÝÕ ßÕàÕâÒÞàØâì Óàã ÝÐ ÐÝÓÛöÙáìÚöÙ Ò ãÚàÐ÷ÝáìÚã" + +#: gui/launcher.cpp:185 +#: gui/launcher.cpp:196 +#: gui/options.cpp:80 +#: gui/options.cpp:635 +#: gui/options.cpp:645 +#: gui/options.cpp:1000 +#: sound/null.cpp:42 +msgid "" +msgstr "<×Ð ãÜÞÒçÐÝÝïÜ>" + +#: gui/launcher.cpp:194 +msgid "Platform:" +msgstr "¿ÛÐâäÞàÜÐ:" + +#: gui/launcher.cpp:194 +#: gui/launcher.cpp:195 +msgid "Platform the game was originally designed for" +msgstr "¿ÛÐâäÞàÜÐ, ÔÛï ïÚÞ÷ ÓàÐ ÑãÛÐ áßÞçÐâÚã àÞ×àÞÑÛÕÝÐ" + +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 +msgid "Graphics" +msgstr "³àÐäöÚÐ" + +#: gui/launcher.cpp:206 +#: gui/options.cpp:898 +#: gui/options.cpp:915 +msgid "GFX" +msgstr "³àä" + +#: gui/launcher.cpp:208 +msgid "Override global graphic settings" +msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓàÐäöÚØ" + +#: gui/launcher.cpp:215 +#: gui/options.cpp:921 +msgid "Audio" +msgstr "°ãÔöÞ" + +#: gui/launcher.cpp:217 +msgid "Override global audio settings" +msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÐãÔöÞ" + +#: gui/launcher.cpp:225 +#: gui/options.cpp:925 +msgid "Volume" +msgstr "³ãçÝöáâì" + +#: gui/launcher.cpp:227 +msgid "Override global volume settings" +msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ ÓãçÝÞáâö" + +#: gui/launcher.cpp:234 +#: gui/options.cpp:933 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:236 +msgid "Override global MIDI settings" +msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MIDI" + +#: gui/launcher.cpp:246 +#: gui/options.cpp:939 +#, fuzzy +msgid "MT-32" +msgstr "MT-32" + +#: gui/launcher.cpp:248 +#, fuzzy +msgid "Override global MT-32 settings" +msgstr "¿ÕàÕÚàØâØ ÓÛÞÑÐÛìÝö ãáâÐÝÞÒÚØ MT-32" + +#: gui/launcher.cpp:258 +#: gui/options.cpp:945 +msgid "Paths" +msgstr "ÈÛïåØ" + +#: gui/launcher.cpp:264 +msgid "Game Path:" +msgstr "ÈÛïå ÔÞ ÓàØ: " + +#: gui/launcher.cpp:268 +#: gui/options.cpp:958 +msgid "Extra Path:" +msgstr "´ÞÔ. èÛïå:" + +#: gui/launcher.cpp:268 +#: gui/launcher.cpp:269 +msgid "Specifies path to additional data used the game" +msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå ÔÛï ÓàØ" + +#: gui/launcher.cpp:272 +msgid "Save Path:" +msgstr "ÈÛïå ×ÑÕà.: " + +#: gui/launcher.cpp:272 +#: gui/launcher.cpp:273 +#: gui/options.cpp:952 +#: gui/options.cpp:953 +msgid "Specifies where your savegames are put" +msgstr "²ÚÐ×ãô èÛïå ÔÞ ×ÑÕàÕÖÕÝì ÓàØ" + +#: gui/launcher.cpp:289 +#: gui/launcher.cpp:369 +#: gui/launcher.cpp:418 +#: gui/options.cpp:230 +#: gui/options.cpp:399 +#: gui/options.cpp:497 +#: gui/options.cpp:555 +#: gui/options.cpp:732 +#: gui/options.cpp:956 +#: gui/options.cpp:959 +#: gui/options.cpp:963 +#: gui/options.cpp:1053 +#: gui/options.cpp:1059 +#: gui/options.cpp:1065 +#: gui/options.cpp:1073 +#: gui/options.cpp:1097 +#: gui/options.cpp:1101 +#: gui/options.cpp:1107 +#: gui/options.cpp:1114 +#: gui/options.cpp:1213 +msgid "None" +msgstr "½Õ ×ÐÔÐÝØÙ" + +#: gui/launcher.cpp:294 +#: gui/launcher.cpp:373 +#: backends/platform/wii/options.cpp:56 +msgid "Default" +msgstr "·Ð ãÜÞÒçÐÝÝïÜ" + +#: gui/launcher.cpp:411 +#: gui/options.cpp:1207 +msgid "Select SoundFont" +msgstr "²ØÑÕàöâì SoundFont" + +#: gui/launcher.cpp:430 +#: gui/launcher.cpp:568 +msgid "Select directory with game data" +msgstr "²ØÑÕàöâì ßÐßÚã × äÐÙÛÐÜØ ÓàØ" + +#: gui/launcher.cpp:448 +msgid "Select additional game directory" +msgstr "²ØÑÕàöâì ÔÞÔÐâÚÞÒã ßÐßÚã ÓàØ" + +#: gui/launcher.cpp:460 +msgid "Select directory for saved games" +msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì" + +#: gui/launcher.cpp:479 +msgid "This game ID is already taken. Please choose another one." +msgstr "ÆÕÙ ID ÓàØ ÒÖÕ ÒØÚÞàØáâÞÒãôâìáï. ±ãÔì ÛÐáÚÐ, ÒØÑÕàöâì öÝèØÙ." + +#: gui/launcher.cpp:520 +#: engines/dialogs.cpp:113 +msgid "~Q~uit" +msgstr "~²~ØåöÔ" + +#: gui/launcher.cpp:520 +msgid "Quit ScummVM" +msgstr "²ØåöÔ × ScummVM" + +#: gui/launcher.cpp:521 +msgid "A~b~out..." +msgstr "¿àÞ ß~à~ÞÓàÐÜã..." + +#: gui/launcher.cpp:521 +msgid "About ScummVM" +msgstr "¿àÞ ScummVM" + +#: gui/launcher.cpp:522 +msgid "~O~ptions..." +msgstr "~¾~ßæö÷..." + +#: gui/launcher.cpp:522 +msgid "Change global ScummVM options" +msgstr "·ÜöÝØâØ ÓÛÞÑÐÛìÝö Þßæö÷ ScummVM" + +#: gui/launcher.cpp:524 +msgid "~S~tart" +msgstr "·~Ð~ßãáÚ" + +#: gui/launcher.cpp:524 +msgid "Start selected game" +msgstr "·ÐßãáâØâØ ÒØÑàÐÝã Óàã" + +#: gui/launcher.cpp:527 +msgid "~L~oad..." +msgstr "~·~ÐÒÐÝ..." + +#: gui/launcher.cpp:527 +msgid "Load savegame for selected game" +msgstr "·ÐÒÐÝâÐÖØâØ ×ÑÕàÕÖÕÝÝï ÔÛï ÒØÑàÐÝÞ÷ ÓàØ" + +#: gui/launcher.cpp:531 +msgid "~A~dd Game..." +msgstr "~´~ÞÔ. Óàã..." + +#: gui/launcher.cpp:531 +msgid "Hold Shift for Mass Add" +msgstr "ÃâàØÜãÙâÕ ÚÛÐÒöèã Shift ÔÛï âÞÓÞ, éÞÑ ÔÞÔÐâØ ÔÕÚöÛìÚÐ öÓÞà" + +#: gui/launcher.cpp:533 +msgid "~E~dit Game..." +msgstr "ÀÕÔÐ~Ó~. Óàã..." + +#: gui/launcher.cpp:533 +msgid "Change game options" +msgstr "·ÜöÝØâØ Þßæö÷ ÓàØ" + +#: gui/launcher.cpp:535 +msgid "~R~emove Game" +msgstr "~²~ØÔÐ󯉯 Óàã" + +#: gui/launcher.cpp:535 +msgid "Remove game from the list. The game data files stay intact" +msgstr "²ØÔÐ󯉯 Óàã ×ö áߨáÚã. ½Õ ÒØÔÐÛïô Óàã × ÖÞàáâÚÞÓÞ ÔØáÚÐ" + +#: gui/launcher.cpp:542 +msgid "Search in game list" +msgstr "¿ÞèãÚ Ò áߨáÚã öÓÞà" + +#: gui/launcher.cpp:546 +#: gui/launcher.cpp:1057 +msgid "Search:" +msgstr "¿ÞèãÚ:" + +#: gui/launcher.cpp:549 +#: gui/options.cpp:733 +msgid "Clear value" +msgstr "¾çØáâØâØ ×ÝÐçÕÝÝï" + +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "·ÐÒÐÝâÐÖØâØ Óàã:" + +#: gui/launcher.cpp:571 +#: engines/dialogs.cpp:117 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Load" +msgstr "·ÐÒÐÝâÐÖØâØ" + +#: gui/launcher.cpp:680 +msgid "Do you really want to run the mass game detector? This could potentially add a huge number of games." +msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ×ÐßãáâØâØ ÔÕâÕÚâÞà ãáöå öÓÞà? ÆÕ ßÞâÕÝæöÙÝÞ ÜÞÖÕ ÔÞÔÐâØ ÒÕÛØÚã ÚöÛìÚöáâì öÓÞà." + +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Yes" +msgstr "ÂÐÚ" + +#: gui/launcher.cpp:681 +#: gui/launcher.cpp:830 +#: backends/platform/symbian/src/SymbianOS.cpp:446 +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "No" +msgstr "½ö" + +#: gui/launcher.cpp:728 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM ÝÕ ÜÞÖÕ ÒöÔÚàØâØ ÒÚÐ×ÐÝã ßÐßÚã!" + +#: gui/launcher.cpp:740 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM ÝÕ ÜÞÖÕ ×ÝÐÙâØ Óàã ã ÒÚÐ×ÐÝöÙ ßÐßæö!" + +#: gui/launcher.cpp:754 +msgid "Pick the game:" +msgstr "²ØÑÕàöâì Óàã:" + +#: gui/launcher.cpp:830 +msgid "Do you really want to remove this game configuration?" +msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐ󯉯 ãáâÐÝÞÒÚØ ÔÛï æöô÷ ÓàØ?" + +#: gui/launcher.cpp:893 +msgid "This game does not support loading games from the launcher." +msgstr "Æï ÓàÐ ÝÕ ßöÔâàØÜãô ×ÐÒÐÝâÐÖÕÝÝï ×ÑÕàÕÖÕÝì çÕàÕ× ÓÞÛÞÒÝÕ ÜÕÝî." + +#: gui/launcher.cpp:897 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM ÝÕ ×ÜöÓ ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ!" + +#: gui/launcher.cpp:1009 +msgid "Mass Add..." +msgstr "´ÞÔ. ÑÐÓÐâÞ..." + +#: gui/launcher.cpp:1010 +msgid "Add Game..." +msgstr "´ÞÔ. Óàã..." + +#: gui/massadd.cpp:79 +#: gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... ßÞèãÚ ..." + +#: gui/massadd.cpp:244 +msgid "Scan complete!" +msgstr "¿ÞèãÚ ×ÐÚöÝçÕÝØÙ!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "¿àÞÓÛïÝãâÞ %d ßÐßÞÚ ..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "·ÝÐÙÔÕÝÞ %d ÝÞÒØå öÓÞà ..." + +#: gui/options.cpp:78 +msgid "Never" +msgstr "½öÚÞÛØ" + +#: gui/options.cpp:78 +msgid "every 5 mins" +msgstr "ÚÞÖÝö 5 åÒ" + +#: gui/options.cpp:78 +msgid "every 10 mins" +msgstr "ÚÞÖÝö 10 åÒ" + +#: gui/options.cpp:78 +msgid "every 15 mins" +msgstr "ÚÞÖÝö 15 åÒ" + +#: gui/options.cpp:78 +msgid "every 30 mins" +msgstr "ÚÞÖÝö 30 åÒ" + +#: gui/options.cpp:80 +msgid "8 kHz" +msgstr "8 Ú³æ" + +#: gui/options.cpp:80 +msgid "11kHz" +msgstr "11 Ú³æ" + +#: gui/options.cpp:80 +msgid "22 kHz" +msgstr "22 Ú³æ" + +#: gui/options.cpp:80 +msgid "44 kHz" +msgstr "44 Ú³æ" + +#: gui/options.cpp:80 +msgid "48 kHz" +msgstr "48 Ú³æ" + +#: gui/options.cpp:632 +msgid "Graphics mode:" +msgstr "³àÐäöçÝØÙ àÕÖØÜ:" + +#: gui/options.cpp:643 +msgid "Render mode:" +msgstr "ÀÕÖØÜ àÐáâàãÒÐÝÝï:" + +#: gui/options.cpp:643 +#: gui/options.cpp:644 +msgid "Special dithering modes supported by some games" +msgstr "ÁßÕæöÐÛìÝö àÕÖØÜØ àÕÝÔÕàØÝÓã, ïÚö ßöÔâàØÜãîâì ÔÕïÚö öÓàØ" + +#: gui/options.cpp:653 +msgid "Fullscreen mode" +msgstr "¿ÞÒÝÞÕÚàÐÝÝØÙ àÕÖØÜ" + +#: gui/options.cpp:656 +msgid "Aspect ratio correction" +msgstr "ºÞàÕÚæöï áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ" + +#: gui/options.cpp:656 +msgid "Correct aspect ratio for 320x200 games" +msgstr "ºÞàØÓãÒÐâØ áßöÒÒöÔÝÞèÕÝÝï áâÞàöÝ ÔÛï öÓÞà × ÓàÐäöÚÞî 320x200" + +#: gui/options.cpp:663 +msgid "Preferred Device:" +msgstr "¿àØáâàöÙ ïÚÞÜã ÒöÔÔÐôâìáï ßÕàÕÒÐÓÐ:" + +#: gui/options.cpp:663 +#, fuzzy +msgid "Music Device:" +msgstr "¼ãרçÝØÙ ¿àØáâàöÙ:" + +#: gui/options.cpp:663 +msgid "Specifies preferred sound device or sound card emulator" +msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ" + +#: gui/options.cpp:663 +#: gui/options.cpp:664 +msgid "Specifies output sound device or sound card emulator" +msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÐÑÞ ÕÜãÛïâÞà ×ÒãÚÞÒÞ÷ ÚÐàâØ" + +#: gui/options.cpp:688 +msgid "AdLib emulator:" +msgstr "µÜãÛïâÞà AdLib:" + +#: gui/options.cpp:688 +#: gui/options.cpp:689 +msgid "AdLib is used for music in many games" +msgstr "·ÒãÚÞÒÐ ÚÐàâÐ AdLib ÒØÚÞàØáâÞÒãôâìáï ÑÐÓÐâìÜÐ öÓàÐÜØ" + +#: gui/options.cpp:699 +msgid "Output rate:" +msgstr "²ØåöÔÝÐ çÐáâÞâÐ:" + +#: gui/options.cpp:699 +#: gui/options.cpp:700 +msgid "Higher value specifies better sound quality but may be not supported by your soundcard" +msgstr "²ÕÛØÚö ×ÝÐçÕÝÝï ×ÐÔÐîâì ÚàÐéã ïÚöáâì ×ÒãÚã, ßàÞâÕ ÒÞÝØ ÜÞÖãâì ÝÕ ßöÔâàØÜãÒÐâØáï ÒÐèÞî ×ÒãÚÞÒÞî ÚÐàâÞî" + +#: gui/options.cpp:710 +msgid "GM Device:" +msgstr "¿àØáâàöÙ GM:" + +#: gui/options.cpp:710 +msgid "Specifies default sound device for General MIDI output" +msgstr "²ÚÐ×ãô ÒØåöÔÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ÔÛï MIDI" + +#: gui/options.cpp:731 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:731 +#: gui/options.cpp:732 +msgid "SoundFont is supported by some audio cards, Fluidsynth and Timidity" +msgstr "SoundFont ßöÔâàØÜãôâìáï ÔÕïÚØÜØ ×ÒãÚÞÒØÜØ ÚÐàâÐÜØ, Fluidsynth ö Timidity" + +#: gui/options.cpp:736 +msgid "Mixed AdLib/MIDI mode" +msgstr "·ÜöèÐÝØÙ àÕÖØÜ AdLib/MIDI" + +#: gui/options.cpp:736 +msgid "Use both MIDI and AdLib sound generation" +msgstr "²ØÚÞàØáâÞÒãÒÐâØ ö MIDI ö AdLib ÔÛï ÓÕÝÕàÐæö÷ ×ÒãÚã" + +#: gui/options.cpp:739 +msgid "MIDI gain:" +msgstr "¿ÞáØÛÕÝÝï MIDI:" + +#: gui/options.cpp:749 +#, fuzzy +msgid "MT-32 Device:" +msgstr "¿àØáâàöÙ MT-32:" + +#: gui/options.cpp:749 +msgid "Specifies default sound device for Roland MT-32/LAPC1/CM32l/CM64 output" +msgstr "²ÚÐ×ãô ×ÒãÚÞÒØÙ ßàØáâàöÙ ßÞ ãÜÞÒçÐÝÝî ÔÛï ÒØÒÞÔã ÝÐ Roland MT-32/LAPC1/CM32l/CM64" + +#: gui/options.cpp:753 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "ÁßàÐÒÖÝöÙ Roland MT-32 (ÒØÜÚÝãâØ ÕÜãÛïæØî GM)" + +#: gui/options.cpp:753 +msgid "Check if you want to use your real hardware Roland-compatible sound device connected to your computer" +msgstr "²öÔÜöâìâÕ, ïÚéÞ ã ÒÐá ßöÔÚÛîçÕÝØÙ Roland-áãÜöáÝØÙ ×ÒãÚÞÒØÙ ßàØáâàöÙ ö ÒØ åÞçÕâÕ ÙÞÓÞ ÒØÚÞàØáâÐâØ" + +#: gui/options.cpp:756 +msgid "Enable Roland GS Mode" +msgstr "ÃÒöÜÚÝãâØ àÕÖØÜ Roland GS" + +#: gui/options.cpp:756 +msgid "Turns off General MIDI mapping for games with Roland MT-32 soundtrack" +msgstr "²ØÜØÚÐô ÜÐßßöÝÓ General MIDI ÔÛï öÓÞà ö× ×ÒãÚÞÒÞî ÔÞàöÖÚÞî ÔÛï Roland MT-32" + +#: gui/options.cpp:780 +msgid "Text and Speech:" +msgstr "ÂÕÚáâ ö Þ×ÒãçÕÝÝï:" + +#: gui/options.cpp:785 +#: gui/options.cpp:791 +msgid "Speech" +msgstr "¾×ÒãçÕÝÝï" + +#: gui/options.cpp:786 +#: gui/options.cpp:792 +msgid "Subtitles" +msgstr "ÁãÑâØâàØ" + +#: gui/options.cpp:787 +#: gui/options.cpp:793 +msgid "Both" +msgstr "²áÕ" + +#: gui/options.cpp:791 +msgid "Spch" +msgstr "¾×Ò" + +#: gui/options.cpp:792 +msgid "Subs" +msgstr "ÁãÑ" + +#: gui/options.cpp:793 +msgid "Show subtitles and play speech" +msgstr "¿ÞÚÐ×ãÒÐâØ áãÑâØâàØ ö ÒöÔâÒÞàîÒÐâØ ÜÞÒã" + +#: gui/options.cpp:797 +msgid "Subtitle speed:" +msgstr "ÈÒØÔÚöáâì áãÑâØâàöÒ:" + +#: gui/options.cpp:809 +msgid "Music volume:" +msgstr "³ãçÝöáâì Üã×ØÚØ:" + +#: gui/options.cpp:816 +msgid "Mute All" +msgstr "²ØÜÚÝãâØ ãáÕ" + +#: gui/options.cpp:819 +msgid "SFX volume:" +msgstr "³ãçÝöáâì ÕäÕÚâöÒ:" + +#: gui/options.cpp:819 +#: gui/options.cpp:820 +msgid "Special sound effects volume" +msgstr "³ãçÝöáâì áßÕæöÐÛìÝØå ×ÒãÚÞÒØå ÕäÕÚâöÒ" + +#: gui/options.cpp:826 +msgid "Speech volume:" +msgstr "³ãçÝöáâì Þ×ÒãçÕÝÝï:" + +#: gui/options.cpp:952 +msgid "Save Path: " +msgstr "ÈÛïå ÔÛï ×ÑÕàÕÖÕÝì: " + +#: gui/options.cpp:955 +msgid "Theme Path:" +msgstr "ÈÛïå ÔÞ âÕÜ:" + +#: gui/options.cpp:958 +#: gui/options.cpp:959 +msgid "Specifies path to additional data used by all games or ScummVM" +msgstr "²ÚÐ×ãô èÛïå ÔÞ ÔÞÔÐâÚÞÒØå äÐÙÛöÒ ÔÐÝØå, ÒØÚÞàØáâÞÒãÒÐÝØå ãáöÜÐ öÓàÐÜØ, ÐÑÞ ScummVM" + +#: gui/options.cpp:962 +msgid "Plugins Path:" +msgstr "ÈÛïå ÔÞ ßÛÐÓöÝöÒ:" + +#: gui/options.cpp:970 +msgid "Misc" +msgstr "Àö×ÝÕ" + +#: gui/options.cpp:972 +msgid "Theme:" +msgstr "ÂÕÜÐ:" + +#: gui/options.cpp:976 +msgid "GUI Renderer:" +msgstr "ÀÐáâÕàØ×ÐâÞà GUI:" + +#: gui/options.cpp:982 +msgid "Autosave:" +msgstr "°ÒâÞ×ÑÕàÕÖÕÝÝï:" + +#: gui/options.cpp:990 +msgid "Keys" +msgstr "ºÛÐÒöèö" + +#: gui/options.cpp:997 +msgid "GUI Language:" +msgstr "¼ÞÒÐ öÝâÕàäÕÙáã:" + +#: gui/options.cpp:997 +msgid "Language of ScummVM GUI" +msgstr "¼ÞÒÐ ÓàÐäöçÝÞÓÞ öÝâÕàäÕÙáã ScummVM" + +#: gui/options.cpp:1002 +msgid "English" +msgstr "English" + +#: gui/options.cpp:1146 +msgid "You have to restart ScummVM to take the effect." +msgstr "²Ø ßÞÒØÝÝö ßÕàÕ×ÐßãáâØâØ ScummVM éÞÑ ×ÐáâÞáãÒÐâØ ×ÜöÝØ." + +#: gui/options.cpp:1159 +msgid "Select directory for savegames" +msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï ×ÑÕàÕÖÕÝì" + +#: gui/options.cpp:1166 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "½Õ ÜÞÖã ߨáÐâØ ã ÒØÑàÐÝã ßÐßÚã. ±ãÔì ÛÐáÚÐ, ÒÚÐÖöâì öÝèã." + +#: gui/options.cpp:1175 +msgid "Select directory for GUI themes" +msgstr "²ØÑÕàöâì ßÐßÚã ÔÛï âÕÜ GUI" + +#: gui/options.cpp:1185 +msgid "Select directory for extra files" +msgstr "²ØÑÕàöâì ßÐßÚã × ÔÞÔÐâÚÞÒØÜØ äÐÙÛÐÜØ" + +#: gui/options.cpp:1196 +msgid "Select directory for plugins" +msgstr "²ØÑÕàöâì ßÐßÚã × ßÛÐÓØÝÐÜØ" + +#: gui/saveload.cpp:60 +#: gui/saveload.cpp:241 +msgid "No date saved" +msgstr "´ÐâÐ ÝÕ ×ÐߨáÐÝÐ" + +#: gui/saveload.cpp:61 +#: gui/saveload.cpp:242 +msgid "No time saved" +msgstr "ÇÐá ÝÕ ×ÐߨáÐÝØÙ" + +#: gui/saveload.cpp:62 +#: gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "ÇÐá ÓàØ ÝÕ ×ÐߨáÐÝÞ" + +#: gui/saveload.cpp:69 +#: gui/saveload.cpp:157 +msgid "Delete" +msgstr "²ØÔÐÛØâØ" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "²Ø ÔöÙáÝÞ åÞçÕâÕ ÒØÔÐ󯉯 æÕ ×ÑÕàÕÖÕÝÝï?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "´ÐâÐ: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "ÇÐá: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "ÇÐá ÓàØ: " + +#: gui/saveload.cpp:286 +#: gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "·ÑÕàÕÖÕÝÝï ÑÕ× öÜÕÝö" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "²ØÑÕàöâì âÕÜã" + +#: gui/ThemeEngine.cpp:334 +msgid "Disabled GFX" +msgstr "±Õ× ÓàÐäöÚØ" + +#: gui/ThemeEngine.cpp:335 +msgid "Standard Renderer (16bpp)" +msgstr "ÁâÐÝÔÐàâÝØÙ àÐáâÕàØ×ÐâÞà (16bpp)" + +#: gui/ThemeEngine.cpp:337 +msgid "Antialiased Renderer (16bpp)" +msgstr "ÀÐáâÕàØ×ÐâÞà ×ö ×ÓÛÐÔÖãÒÐÝÝïÜ (16bpp)" + +#: base/main.cpp:205 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "´ÒØÖÞÚ ÝÕ ßöÔâàØÜãô àöÒÕÝì ÒöÔÛÐÔÚØ '%s'" + +#: base/main.cpp:273 +msgid "Menu" +msgstr "¼ÕÝî" + +#: base/main.cpp:276 +#: backends/platform/symbian/src/SymbianActions.cpp:48 +#: backends/platform/wince/CEActionsPocket.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:45 +msgid "Skip" +msgstr "¿àÞßãáâØâØ" + +#: base/main.cpp:279 +#: backends/platform/symbian/src/SymbianActions.cpp:53 +#: backends/platform/wince/CEActionsPocket.cpp:41 +msgid "Pause" +msgstr "¿Ðã×Ð" + +#: base/main.cpp:282 +msgid "Skip line" +msgstr "¿àÞßãáâØâØ àïÔÞÚ" + +#: base/main.cpp:404 +msgid "Error running game:" +msgstr "¿ÞÜØÛÚÐ ×ÐßãáÚã ÓàØ:" + +#: base/main.cpp:430 +#: base/main.cpp:431 +msgid "Could not find any engine capable of running the selected game" +msgstr "½Õ ÜÞÖã ×ÝÐÙâØ ÔÒØÖÞÚ ÔÛï ×ÐßãáÚã ÒØÑàÐÝÞ÷ ÓàØ" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "½ÕßàÐÒØÛìÝØÙ èÛïå" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "½ÕÜÐô äÐÙÛöÒ ÓàØ" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "Game Id ÝÕ ßöÔâàØÜãôâìáï" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "ÀÕÖØÜ ºÞÛìÞàã ÝÕ ßöÔâàØÜãôâìáï" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "½ÕÔÞáâÐâÝìÞ ßàÐÒ ÔÛï çØâÐÝÝï" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "½ÕÔÞáâÐâÝìÞ ßàÐÒ ÔÛï ×Ðߨáã" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "ÈÛïå ÝÕ ×ÝÐÙÔÕÝØÙ" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "ÈÛïå ÝÕ ô ßÐßÚÞî" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "ÈÛïå ÝÕ ô äÐÙÛÞÜ" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "½Õ ÜÞÖã áâÒÞàØâØ äÐÙÛ" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "¿ÞÜØÛÚÐ çØâÐÝÝï" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "¿ÞÜØÛÚÐ ×Ðߨáã ÔÐÝØå" + +#: common/error.cpp:60 +#: common/error.cpp:71 +msgid "Unknown Error" +msgstr "½ÕÒöÔÞÜÐ ßÞÜØÛÚÐ" + +#: common/util.cpp:254 +msgid "Hercules Green" +msgstr "Hercules ·ÕÛÕÝØÙ" + +#: common/util.cpp:255 +msgid "Hercules Amber" +msgstr "Hercules ÏÝâÐàÝØÙ" + +#: engines/dialogs.cpp:89 +msgid "~R~esume" +msgstr "¿àÞÔÞÒ~Ö~ØâØ" + +#: engines/dialogs.cpp:91 +msgid "~L~oad" +msgstr "~·~ÐÒÐÝâÐÖØâØ" + +#: engines/dialogs.cpp:95 +msgid "~S~ave" +msgstr "~·~ÐߨáÐâØ" + +#: engines/dialogs.cpp:99 +msgid "~O~ptions" +msgstr "~¾~ßæö÷" + +#: engines/dialogs.cpp:104 +msgid "~H~elp" +msgstr "~´~ÞßÞÜÞÓÐ" + +#: engines/dialogs.cpp:107 +msgid "~A~bout" +msgstr "¿àÞ ßàÞ~Ó~àÐÜã" + +#: engines/dialogs.cpp:109 +msgid "~R~eturn to Launcher" +msgstr "~¿~ÞÒÕàÝãâØáì Ò ÓÞÛÞÒÝÕ ÜÕÝî" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "·ÑÕàÕÓâØ Óàã: " + +#: engines/dialogs.cpp:119 +#: backends/platform/symbian/src/SymbianActions.cpp:47 +#: backends/platform/wince/CEActionsPocket.cpp:42 +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Save" +msgstr "·ÐߨáÐâØ" + +#: engines/dialogs.cpp:301 +#: engines/mohawk/dialogs.cpp:84 +#: engines/mohawk/dialogs.cpp:118 +msgid "~O~K" +msgstr "~O~K" + +#: engines/dialogs.cpp:302 +#: engines/mohawk/dialogs.cpp:85 +#: engines/mohawk/dialogs.cpp:119 +msgid "~C~ancel" +msgstr "²ö~Ô~ÜöÝÐ" + +#: engines/dialogs.cpp:305 +msgid "~K~eys" +msgstr "~º~ÛÐÒöèö" + +#: engines/scumm/dialogs.cpp:287 +msgid "~P~revious" +msgstr "~¿~ÞßÕà" + +#: engines/scumm/dialogs.cpp:288 +msgid "~N~ext" +msgstr "~½~Ðáâ" + +#: engines/scumm/dialogs.cpp:289 +#: backends/platform/ds/arm9/source/dsoptions.cpp:59 +msgid "~C~lose" +msgstr "~·~ÐÚàØâØ" + +#: engines/mohawk/dialogs.cpp:81 +#: engines/mohawk/dialogs.cpp:115 +msgid "~Z~ip Mode Activated" +msgstr "ÀÕÖØÜ èÒØÔÚÞÓÞ ßÕàÕåÞÔã ÐÚâØÒÞÒÐÝØÙ" + +#: engines/mohawk/dialogs.cpp:82 +msgid "~T~ransitions Enabled" +msgstr "¿ÕàÕåÞÔØ ÐÚâØÒÞÒÐÝö" + +#: engines/mohawk/dialogs.cpp:116 +msgid "~W~ater Effect Enabled" +msgstr "µäÕÚâØ ÒÞÔØ ÒÚÛîçÕÝö" + +#: sound/fmopl.cpp:51 +msgid "MAME OPL emulator" +msgstr "µÜãÛïâÞà MAME OPL:" + +#: sound/fmopl.cpp:53 +msgid "DOSBox OPL emulator" +msgstr "µÜãÛïâÞà DOSBox OPL" + +#: sound/null.h:45 +msgid "No music" +msgstr "±Õ× Üã×ØÚØ" + +#: sound/softsynth/adlib.cpp:1590 +msgid "AdLib Emulator" +msgstr "µÜãÛïâÞà AdLib" + +#: sound/softsynth/mt32.cpp:327 +msgid "Initialising MT-32 Emulator" +msgstr "½ÐáâàÞîî ÕÜãÛïâÞà MT-32" + +#: sound/softsynth/mt32.cpp:541 +msgid "MT-32 Emulator" +msgstr "µÜãÛïâÞà MT-32" + +#: sound/softsynth/pcspk.cpp:142 +msgid "PC Speaker Emulator" +msgstr "µÜãÛïâÞà PC áßöÚÕàÐ" + +#: sound/softsynth/pcspk.cpp:161 +msgid "IBM PCjr Emulator" +msgstr "µÜãÛïâÞà IBM PCjr" + +#: sound/softsynth/ym2612.cpp:762 +msgid "FM Towns Emulator" +msgstr "µÜãÛïâÞà FM Towns" + +#: backends/keymapper/remap-dialog.cpp:49 +msgid "Keymap:" +msgstr "ÂÐÑÛØæï ÚÛÐÒöè:" + +#: backends/keymapper/remap-dialog.cpp:66 +msgid " (Active)" +msgstr " (°ÚâØÒÝÐ)" + +#: backends/keymapper/remap-dialog.cpp:100 +msgid " (Global)" +msgstr " (³ÛÞÑÐÛìÝÐ)" + +#: backends/keymapper/remap-dialog.cpp:110 +msgid " (Game)" +msgstr " (¦ÓàØ)" + +#: backends/midi/windows.cpp:157 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:60 +msgid "ScummVM Main Menu" +msgstr "³ÞÛÞÒÝÕ ÜÕÝî ScummVM" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:66 +msgid "~L~eft handed mode" +msgstr "»öÒÞàãÚØÙ àÕÖØÜ" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:67 +msgid "~I~ndy fight controls" +msgstr "ºÕàãÒÐÝÝï ÑÞïÜØ Ò Indy" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:68 +msgid "Show mouse cursor" +msgstr "¿ÞÚÐ×ãÒÐâØ ÚãàáÞà ÜØèö" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:69 +msgid "Snap to edges" +msgstr "¿àØÚàößØâØ ÔÞ ÚàÐ÷Ò" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:71 +msgid "Touch X Offset" +msgstr "·ÜöéÕÝÝï âÞàÚÐÝì ßÞ Þáö X" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:78 +msgid "Touch Y Offset" +msgstr "·ÜöéÕÝÝï âÞàÚÐÝì ßÞ Þáö Y" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:90 +msgid "Use laptop trackpad-style cursor control" +msgstr "²ØÚÞàØáâÞÒãÒÐâØ ãßàÐÒÛöÝÝï ÚãàáÞàÞÜ ïÚ ÝÐ âàÕÚßÐÔö ÛÐßâÞßöÒ" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:91 +msgid "Tap for left click, double tap right click" +msgstr "ÂÐß ÔÛï ÛöÒÞÓÞ ÚÛÐæÐÝÝï, ßÞÔÒöÙÝØÙ âÐß ÔÛï ßàÐÒÞÓÞ ÚÛÐæÐÝÝï" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:93 +msgid "Sensitivity" +msgstr "ÇãâÛØÒöáâì" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:102 +msgid "Initial top screen scale:" +msgstr "¿ÞçÐâÚÞÒØÙ ÜÐáèâÐÑ ÒÕàåÝìÞÓÞ ÕÚàÐÝã:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:108 +msgid "Main screen scaling:" +msgstr "¼ÐáèâÐÑ ÓÞÛÞÒÝÞÓÞ ÕÚàÐÝã:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:110 +msgid "Hardware scale (fast, but low quality)" +msgstr "ÅÐàÔÒÐàÝÞÕ ÜÐáèâÐÑãÒÐÝÝï (èÒØÔÚÞ, ÐÛÕ ÝØ×ìÚÞ÷ ïÚÞáâö)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:111 +msgid "Software scale (good quality, but slower)" +msgstr "¿àÞÓàÐÜÝÕ ÜÐáèâÐÑãÒÐÝÝï (åÞàÞèÐ ïÚöáâì, ÐÛÕ ßÞÒöÛìÝöèÕ)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:112 +msgid "Unscaled (you must scroll left and right)" +msgstr "±Õ× ÜÐáèâÐÑãÒÐÝÝï (âàÕÑÐ ÑãÔÕ ßàÞÚàãçãÒÐâØ ÝÐÛöÒÞ ö ÝÐßàÐÒÞ)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:114 +msgid "Brightness:" +msgstr "ÏáÚàÐÒöáâì:" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:124 +msgid "High quality audio (slower) (reboot)" +msgstr "²ØáÞÚÐ ïÚöáâì ×ÒãÚã (ßÞÒöÛìÝöèÕ) (àÕÑãâ)" + +#: backends/platform/ds/arm9/source/dsoptions.cpp:125 +msgid "Disable power off" +msgstr "·ÐÑÞàÞÝØâØ ÒØÜÚÝÕÝÝï" + +#: backends/platform/iphone/osys_events.cpp:339 +msgid "Touchpad mode enabled." +msgstr "ÀÕÖØÜ âÐçßÐÔã ãÒöÜÚÝÕÝØÙ." + +#: backends/platform/iphone/osys_events.cpp:341 +msgid "Touchpad mode disabled." +msgstr "ÀÕÖØÜ âÐçßÐÔã ÒØÜÚÝÕÝØÙ." + +#: backends/platform/sdl/graphics.cpp:40 +#: backends/platform/wince/wince-sdl.cpp:111 +#: backends/platform/wince/wince-sdl.cpp:118 +msgid "Normal (no scaling)" +msgstr "±Õ× ×ÑöÛìèÕÝÝï" + +#: backends/platform/symbian/src/SymbianActions.cpp:41 +#: backends/platform/wince/CEActionsSmartphone.cpp:38 +msgid "Up" +msgstr "²ÒÕàå" + +#: backends/platform/symbian/src/SymbianActions.cpp:42 +#: backends/platform/wince/CEActionsSmartphone.cpp:39 +msgid "Down" +msgstr "²ÝØ×" + +#: backends/platform/symbian/src/SymbianActions.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:40 +msgid "Left" +msgstr "²ÛöÒÞ" + +#: backends/platform/symbian/src/SymbianActions.cpp:44 +#: backends/platform/wince/CEActionsSmartphone.cpp:41 +msgid "Right" +msgstr "²ßàÐÒÞ" + +#: backends/platform/symbian/src/SymbianActions.cpp:45 +#: backends/platform/wince/CEActionsPocket.cpp:59 +#: backends/platform/wince/CEActionsSmartphone.cpp:42 +msgid "Left Click" +msgstr "»öÒØÙ ÚÛöÚ" + +#: backends/platform/symbian/src/SymbianActions.cpp:46 +#: backends/platform/wince/CEActionsSmartphone.cpp:43 +msgid "Right Click" +msgstr "¿àÐÒØÙ ÚÛöÚ" + +#: backends/platform/symbian/src/SymbianActions.cpp:49 +#: backends/platform/wince/CEActionsSmartphone.cpp:46 +msgid "Zone" +msgstr "·ÞÝÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:50 +#: backends/platform/wince/CEActionsPocket.cpp:53 +#: backends/platform/wince/CEActionsSmartphone.cpp:47 +msgid "Multi Function" +msgstr "¼ãÛìâöäãÝÚæöï" + +#: backends/platform/symbian/src/SymbianActions.cpp:51 +msgid "Swap character" +msgstr "·ÜöÝØâØ ÓÕàÞï" + +#: backends/platform/symbian/src/SymbianActions.cpp:52 +msgid "Skip text" +msgstr "¿àÞßãáâØâØ âÕÚáâ" + +#: backends/platform/symbian/src/SymbianActions.cpp:54 +msgid "Fast mode" +msgstr "ÈÒØÔÚØÙ àÕÖØÜ" + +#: backends/platform/symbian/src/SymbianActions.cpp:55 +#: backends/platform/wince/CEActionsPocket.cpp:43 +#: backends/platform/wince/CEActionsSmartphone.cpp:51 +msgid "Quit" +msgstr "²ØåöÔ" + +#: backends/platform/symbian/src/SymbianActions.cpp:56 +msgid "Debugger" +msgstr "²öÔÛÐÔçØÚ" + +#: backends/platform/symbian/src/SymbianActions.cpp:57 +msgid "Global menu" +msgstr "³ÛÞÑÐÛìÝÕ ÜÕÝî" + +#: backends/platform/symbian/src/SymbianActions.cpp:58 +msgid "Virtual keyboard" +msgstr "²öàâãÐÛìÝÐ ÚÛÐÒöÐâãàÐ" + +#: backends/platform/symbian/src/SymbianActions.cpp:59 +msgid "Key mapper" +msgstr "¿àØ×ÝÐçÕÝÝï ÚÛÐÒöè" + +#: backends/platform/symbian/src/SymbianOS.cpp:446 +msgid "Do you want to quit ?" +msgstr "²Ø åÞçØâÕ ÒØÙâØ?" + +#: backends/platform/wii/options.cpp:51 +msgid "Video" +msgstr "²öÔÕÞ" + +#: backends/platform/wii/options.cpp:54 +msgid "Current video mode:" +msgstr "ÂÕÚãçØÙ ÒöÔÕÞàÕÖØÜ:" + +#: backends/platform/wii/options.cpp:56 +msgid "Double-strike" +msgstr "¿ÞÔÒöÙÝØÙ ãÔÐà" + +#: backends/platform/wii/options.cpp:60 +msgid "Horizontal underscan:" +msgstr "³ÞàØ×ÞÝâÐÛìÝØÙ underscan:" + +#: backends/platform/wii/options.cpp:66 +msgid "Vertical underscan:" +msgstr "²ÕàâØÚÐÛìÝØÙ underscan:" + +#: backends/platform/wii/options.cpp:71 +msgid "Input" +msgstr "²ÒöÔ" + +#: backends/platform/wii/options.cpp:74 +msgid "GC Pad sensitivity:" +msgstr "ÇãâÛØÒöáâì GC ßÐÔã:" + +#: backends/platform/wii/options.cpp:80 +msgid "GC Pad acceleration:" +msgstr "¿àØáÚÞàÕÝÝï GC ßÐÔã:" + +#: backends/platform/wii/options.cpp:86 +msgid "DVD" +msgstr "DVD" + +#: backends/platform/wii/options.cpp:89 +#: backends/platform/wii/options.cpp:101 +msgid "Status:" +msgstr "ÁâÐÝ:" + +#: backends/platform/wii/options.cpp:90 +#: backends/platform/wii/options.cpp:102 +msgid "Unknown" +msgstr "½ÕÒöÔÞÜÞ" + +#: backends/platform/wii/options.cpp:93 +msgid "Mount DVD" +msgstr "¿öÔÚÛîçØâØ DVD" + +#: backends/platform/wii/options.cpp:94 +msgid "Unmount DVD" +msgstr "²öÔÚÛîçØâØ DVD" + +#: backends/platform/wii/options.cpp:98 +msgid "SMB" +msgstr "SMB" + +#: backends/platform/wii/options.cpp:106 +msgid "Server:" +msgstr "ÁÕàÒÕà:" + +#: backends/platform/wii/options.cpp:110 +msgid "Share:" +msgstr "¼ÕàÕÖÕÒÐ ßÐßÚÐ:" + +#: backends/platform/wii/options.cpp:114 +msgid "Username:" +msgstr "ºÞàØáâãÒÐç:" + +#: backends/platform/wii/options.cpp:118 +msgid "Password:" +msgstr "¿ÐàÞÛì:" + +#: backends/platform/wii/options.cpp:121 +msgid "Init network" +msgstr "¦ÝöæöÐÛö×Ðæöï ÜÕàÕÖö" + +#: backends/platform/wii/options.cpp:123 +msgid "Mount SMB" +msgstr "¿öÔÚÛîçØâØ SMB" + +#: backends/platform/wii/options.cpp:124 +msgid "Unmount SMB" +msgstr "²öÔÚÛîçâØ SMB" + +#: backends/platform/wii/options.cpp:145 +msgid "DVD Mounted successfully" +msgstr "DVD ßöÔÚÛîçÕÝØÙ ãáßöèÝÞ" + +#: backends/platform/wii/options.cpp:148 +msgid "Error while mounting the DVD" +msgstr "¿ÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï DVD" + +#: backends/platform/wii/options.cpp:150 +msgid "DVD not mounted" +msgstr "DVD ÝÕ ßöÔÚÛîçÕÝØÙ" + +#: backends/platform/wii/options.cpp:163 +msgid "Network up, share mounted" +msgstr "¼ÕàÕÖÐ ßàÐæîô, ßÐßÚÐ ßöÔÚÛîçÕÝÐ" + +#: backends/platform/wii/options.cpp:165 +msgid "Network up" +msgstr "¼ÕàÕÖÐ ßàÐæîô" + +#: backends/platform/wii/options.cpp:168 +msgid ", error while mounting the share" +msgstr ", ßÞÜØÛÚÐ ßöÔ çÐá ßöÔÚÛîçÕÝÝï ßÐßÚØ" + +#: backends/platform/wii/options.cpp:170 +msgid ", share not mounted" +msgstr ", ßÐßÚÐ ÝÕ ßöÔÚÛîçÕÝÐ" + +#: backends/platform/wii/options.cpp:176 +msgid "Network down" +msgstr "¼ÕàÕÖÐ ÒØÜÚÝÕÝÐ" + +#: backends/platform/wii/options.cpp:180 +msgid "Initialising network" +msgstr "½ÐÛÐèâÞÒãî ÜÕàÕÖã" + +#: backends/platform/wii/options.cpp:184 +msgid "Timeout while initialising network" +msgstr "ÇÐá ßöÔÚÛîçÕÝÝï ÔÞ ÜÕàÕÖö ÒØâöÚ" + +#: backends/platform/wii/options.cpp:188 +#, c-format +msgid "Network not initialsed (%d)" +msgstr "¼ÕàÕÖÐ ÝÕ ÝÐÛÐÓÞÔÖÕÝÐ (%d)" + +#: backends/platform/wince/CEActionsPocket.cpp:45 +msgid "Hide Toolbar" +msgstr "·ÐåÞÒÐâØ ßÐÝÕÛì öÝáâàãÜÕÝâöÒ" + +#: backends/platform/wince/CEActionsPocket.cpp:46 +msgid "Show Keyboard" +msgstr "¿ÞÚÐ×ÐâØ ÚÛÐÒöÐâãàã" + +#: backends/platform/wince/CEActionsPocket.cpp:47 +msgid "Sound on/off" +msgstr "·ÒãÚ ãÒöÜ/ÒØÜÚ" + +#: backends/platform/wince/CEActionsPocket.cpp:48 +msgid "Right click" +msgstr "¿àÐÒØÙ ÚÛöÚ" + +#: backends/platform/wince/CEActionsPocket.cpp:49 +msgid "Show/Hide Cursor" +msgstr "¿ÞÚÐ×ÐâØ/ÁåÞÒÐâØ ÚãàáÞà" + +#: backends/platform/wince/CEActionsPocket.cpp:50 +msgid "Free look" +msgstr "²öÛìÝØÙ ÞÓÛïÔ" + +#: backends/platform/wince/CEActionsPocket.cpp:51 +msgid "Zoom up" +msgstr "·ÑöÛ. ÜÐèâÐÑ" + +#: backends/platform/wince/CEActionsPocket.cpp:52 +msgid "Zoom down" +msgstr "·ÜÝè. ÜÐèâÐÑ" + +#: backends/platform/wince/CEActionsPocket.cpp:54 +#: backends/platform/wince/CEActionsSmartphone.cpp:48 +msgid "Bind Keys" +msgstr "ßàØ×ÝÐçØâØ ÚÛÐÒöèö" + +#: backends/platform/wince/CEActionsPocket.cpp:55 +msgid "Cursor Up" +msgstr "ºãàáÞà ÒÒÕàå" + +#: backends/platform/wince/CEActionsPocket.cpp:56 +msgid "Cursor Down" +msgstr "ºãàáÞà ÒÝØ×" + +#: backends/platform/wince/CEActionsPocket.cpp:57 +msgid "Cursor Left" +msgstr "ºãàáÞà ÒÛöÒÞ" + +#: backends/platform/wince/CEActionsPocket.cpp:58 +msgid "Cursor Right" +msgstr "ºãàáÞà ÒßàÐÒÞ" + +#: backends/platform/wince/CEActionsPocket.cpp:263 +#: backends/platform/wince/CEActionsSmartphone.cpp:225 +msgid "Do you want to load or save the game?" +msgstr "²Ø åÞçÕâÕ ×ÐÒÐÝâÐÖØâØ ÐÑÞ ×ÑÕàÕÓâØ Óàã?" + +#: backends/platform/wince/CEActionsPocket.cpp:313 +#: backends/platform/wince/CEActionsSmartphone.cpp:272 +msgid " Are you sure you want to quit ? " +msgstr " ²Ø ãßÕÒÝÕÝö, éÞ åÞçÕâÕ ÒØÙâØ? " + +#: backends/platform/wince/CEActionsSmartphone.cpp:49 +msgid "Keyboard" +msgstr "ºÛÐÒöÐâãàÐ" + +#: backends/platform/wince/CEActionsSmartphone.cpp:50 +msgid "Rotate" +msgstr "¿ÞÒÕàÝãâØ" + +#: backends/platform/wince/CELauncherDialog.cpp:58 +msgid "Using SDL driver " +msgstr "²ØÚÞàØáâÞÒãî ÔàÐÙÒÕà SDL " + +#: backends/platform/wince/CELauncherDialog.cpp:62 +msgid "Display " +msgstr "¿ÞÚÐ×ÐâØ " + +#: backends/platform/wince/CELauncherDialog.cpp:104 +msgid "Do you want to perform an automatic scan ?" +msgstr "²Ø åÞçÕâÕ ×ÔöÙáÝØâØ ÐÒâÞÜÐâØçÝØÙ ßÞèãÚ?" + diff --git a/tools/credits.pl b/tools/credits.pl index cf9becc9b5..f59c68021a 100755 --- a/tools/credits.pl +++ b/tools/credits.pl @@ -875,6 +875,12 @@ begin_credits("Credits"); begin_section("Russian"); add_person("Eugene Sandulenko", "sev", ""); end_section(); + begin_section("Spanish"); + add_person("Tomás Maidagan", "Truido", ""); + end_section(); + begin_section("Ukrainian"); + add_person("Lubomyr Lisen", "", ""); + end_section(); end_section(); begin_section("Websites (design)"); -- cgit v1.2.3 From afe35f5fb3a6f7df09a3ab751d3d475f5c4f49ab Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 22:11:21 +0000 Subject: SCI: adding ADGF_ADDENGLISH to multilingual games Most of the games are guessed, i assume that SCI01->SCI1 games are multilingual, SCI1.1+ are not. I'm definitely not sure about the amiga games, can't check them though svn-id: r51597 --- engines/sci/detection_tables.h | 140 ++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index e49dcbd448..9c369cbaba 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -62,7 +62,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Castle of Dr. Brain - German Amiga (from www.back2roots.org) + // Castle of Dr. Brain - German Amiga (from www.back2roots.org, also includes english language) // Executable scanning reports "1.005.001" // SCI interpreter version 1.000.510 {"castlebrain", "", { @@ -72,7 +72,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 826309}, {"resource.003", 0, "85e51acb5f9c539d66e3c8fe40e17da5", 493638}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Castle of Dr. Brain - English DOS Non-Interactive Demo // SCI interpreter version 1.000.005 @@ -116,14 +116,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Castle of Dr. Brain - Spanish DOS + // Castle of Dr. Brain - Spanish DOS (also includes english language) // SCI interpreter version 1.000.510 {"castlebrain", "", { {"resource.map", 0, "5738c163e014bbe046474de009020b82", 2727}, {"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 1197694}, {"resource.001", 0, "735be4e58957180cfc807d5e18fdffcd", 1433302}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Christmas Card 1988 - English DOS // SCI interpreter version 0.000.294 @@ -344,7 +344,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Conquests of the Longbow - German DOS (suplied by markcoolio in bug report #2727681) + // Conquests of the Longbow - German DOS (suplied by markcoolio in bug report #2727681, also includes english language) // SCI interpreter version 1.000.510 {"longbow", "", { {"resource.map", 0, "7376b7a07f8bd3a8ab8d67595d3f5b51", 6285}, @@ -356,7 +356,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "d036df0872f2db19bca34601276be2d7", 1176914}, {"resource.006", 0, "b367a6a59f29ee30dde1d88a5a41152d", 1123585}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Eco Quest - English DOS Non-Interactive Demo (from FRG) // Executable scanning reports "x.yyy.zzz" @@ -397,7 +397,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Eco Quest - German DOS Floppy (supplied by markcoolio in bug report #2723744) + // Eco Quest - German DOS Floppy (supplied by markcoolio in bug report #2723744, also includes english language) // SCI interpreter version 1.000.510 {"ecoquest", "Floppy", { {"resource.map", 0, "7a9b43bf27dc000ac8559ecbe824b659", 4395}, @@ -406,9 +406,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "02d7d0411f7903aacb3bc8b0f8ca8a9a", 1202581}, {"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1175835}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Eco Quest - Spanish DOS Floppy (from jvprat) + // Eco Quest - Spanish DOS Floppy (from jvprat, also includes english language) // Executable scanning reports "1.ECO.013", VERSION file reports "1.000, 11.12.92" // SCI interpreter version 1.000.510 {"ecoquest", "Floppy", { @@ -418,9 +418,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "2d21a1d2dcbffa551552e3e0725d2284", 1186033}, {"resource.003", 0, "84dd11b6825255671c703aee5ceff620", 1174993}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Eco Quest - French DOS Floppy (from Strangerke) + // Eco Quest - French DOS Floppy (from Strangerke, also includes english language) // SCI interpreter version 1.ECO.013 {"ecoquest", "Floppy", { {"resource.map", 0, "67742945cd59b896d9f22a549f605217", 4407}, @@ -429,7 +429,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "b836c6ee9de67d814ac5d1b05f5b9858", 1173872}, {"resource.003", 0, "f8f767f9d6351432621c6e54c1b2ba8c", 1141520}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Eco Quest 2 - English DOS Non-Interactive Demo // SCI interpreter version 1.001.055 @@ -910,7 +910,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // King's Quest 5 - German Amiga + // King's Quest 5 - German Amiga (also includes english language) // Executable scanning reports "1.004.024" // SCI interpreter version 1.000.060 {"kq5", "", { @@ -924,9 +924,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "56546b20db11a4836f900efa6d3a3e74", 672099}, {"resource.007", 0, "56546b20db11a4836f900efa6d3a3e74", 794194}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // King's Quest 5 - Italian Amiga + // King's Quest 5 - Italian Amiga (also includes english language) // Executable scanning reports "1.004.024" // SCI interpreter version 1.000.060 {"kq5", "", { @@ -940,7 +940,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 672527}, {"resource.007", 0, "11cb750f5f816445ad0f4b9f50a4f59a", 794259}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::IT_ITA, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // King's Quest 5 - English DOS CD (from the King's Quest Collection) // Executable scanning reports "x.yyy.zzz", VERSION file reports "1.000.052" @@ -1013,7 +1013,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101) + // King's Quest 5 - German DOS Floppy (supplied by markcoolio in bug report #2727101, also includes english language) // SCI interpreter version 1.000.060 {"kq5", "", { {"resource.map", 0, "bff44f0c326a71b1757c793a02b502d6", 8283}, @@ -1026,9 +1026,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "d1a75fdc01840664d00366cff6919366", 1208972}, {"resource.007", 0, "c07494f0cce7c05210893938786a955b", 1337361}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // King's Quest 5 - French DOS Floppy (from the King's Quest Collector's Edition 1994) + // King's Quest 5 - French DOS Floppy (from the King's Quest Collector's Edition 1994, also includes english language) // Supplied by aroenai in bug report #2812611 // VERSION file reports "1.000", SCI interpreter version 1.000.784 {"kq5", "", { @@ -1042,9 +1042,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "f7dc85307632ef657ceb1651204f6f51", 1210081}, {"resource.007", 0, "7db4d0a1d8d547c0019cb7d2a6acbdd4", 1338473}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // King's Quest 5 - Italian DOS Floppy (from glorifindel) + // King's Quest 5 - Italian DOS Floppy (from glorifindel, includes english language) // SCI interpreter version 1.000.060 {"kq5", "", { {"resource.map", 0, "d55c9e83894a0885e37cd79bacf86384", 8283}, @@ -1057,9 +1057,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "8eeabd92af71e766e323db2100879102", 1209325}, {"resource.007", 0, "dc10c107e0923b902326a040b9c166b9", 1337859}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722) + // King's Quest 5 - Polish DOS Floppy (supplied by jacek909 in bug report #2725722, includes english language?!) // SCI interpreter version 1.000.060 {"kq5", "", { {"resource.map", 0, "70010c20138541f89013bb5e1b30f16a", 7998}, @@ -1072,7 +1072,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "da82e4beb744731d0a151f1d4922fafa", 1170456}, {"resource.007", 0, "431def14ca29cdb5e6a5e84d3f38f679", 1240176}, AD_LISTEND}, - Common::PL_POL, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::PL_POL, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // King's Quest 5 - English Macintosh // VERSION file reports "1.000.055" @@ -1273,7 +1273,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Laura Bow - German DOS (from Tobis87) + // Laura Bow - German DOS (from Tobis87, also includes english language) // SCI interpreter version 0.000.631 (or 0.000.685?) {"laurabow", "", { {"resource.map", 0, "b1905f6aa68ff65a057b080b1eae954c", 12030}, @@ -1285,7 +1285,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 328390}, {"resource.007", 0, "e45c888d9c7c04aec0a20e9f820b79ff", 317687}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Laura Bow 2 - English DOS Non-Interactive Demo (from FRG) // Executable scanning reports "x.yyy.zzz" @@ -1391,7 +1391,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Larry 1 VGA Remake - Spanish DOS (from the Leisure Suit Larry Collection) + // Larry 1 VGA Remake - Spanish DOS (from the Leisure Suit Larry Collection, also includes english language) // Executable scanning reports "1.SQ4.057", VERSION file reports "1.000" // This version is known to be corrupted // SCI interpreter version 1.000.510 @@ -1402,9 +1402,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "3fe2a3aec0ed53c7d6db1845a67e3aa2", 1095908}, {"resource.003", 0, "ac175df0ea9a2cba57f0248651856d27", 376556}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Larry 1 VGA Remake - Russian DOS + // Larry 1 VGA Remake - Russian DOS (also includes english language?!) // Executable scanning reports "1.000.510", VERSION file reports "2.0" // SCI interpreter version 1.000.510 {"lsl1sci", "VGA Remake", { @@ -1413,7 +1413,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "bc8ca10c807515d959cbd91f9ba47735", 1123759}, {"resource.002", 0, "b7409ab32bc3bee2d6cce887cd33f2b6", 1092160}, AD_LISTEND}, - Common::RU_RUS, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::RU_RUS, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 1 VGA Remake - Polish DOS (from Polish Leisure Suit Larry Collection, official release) // SCI interpreter version 1.000.577, VERSION file reports "2.1" (this release does NOT include english text) @@ -1520,7 +1520,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Larry 3 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723832) + // Larry 3 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723832, also includes english language) // Executable scanning reports "S.old.123" // SCI interpreter version 0.000.572 (just a guess) {"lsl3", "", { @@ -1530,9 +1530,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "3827a9b17b926e12dcc336860f50612a", 587036}, {"resource.004", 0, "3827a9b17b926e12dcc336860f50612a", 691932}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Larry 3 - French DOS (provided by richiefs in bug report #2670691) + // Larry 3 - French DOS (provided by richiefs in bug report #2670691, also includes english language) // Executable scanning reports "S.old.123" // SCI interpreter version 0.000.572 (just a guess) {"lsl3", "", { @@ -1542,7 +1542,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "65f1bdaa20f6d0470e9d969f22473873", 586921}, {"resource.004", 0, "65f1bdaa20f6d0470e9d969f22473873", 690826}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 5 - English Amiga // Executable scanning reports "1.004.023" @@ -1559,7 +1559,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Larry 5 - German Amiga + // Larry 5 - German Amiga (also includes english language) // Executable scanning reports "1.004.024" // SCI interpreter version 1.000.784 {"lsl5", "", { @@ -1573,7 +1573,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "bafc64e3144f115dc58c6aee02de98fb", 754966}, {"resource.007", 0, "59eba83ad465b08d763b44f86afa86f6", 683135}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 5 - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.000.181 @@ -1627,7 +1627,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 946540}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 958842}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 5 - Spanish DOS (from the Leisure Suit Larry Collection) // Executable scanning reports "1.ls5.006", VERSION file reports "1.000, 4/21/92" @@ -1643,7 +1643,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "dda27ce00682aa76198dac124bbbe334", 1015136}, {"resource.007", 0, "ac443fae1285fb359bf2b2bc6a7301ae", 987222}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Larry 5 - Italian DOS Floppy (from glorifindel) // SCI interpreter version 1.000.510 (just a guess) @@ -2103,7 +2103,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Police Quest 2 - Japanese PC-98 + // Police Quest 2 - Japanese PC-98 (also includes english language) // SCI interpreter version unknown {"pq2", "", { {"resource.map", 0, "883804c616dca1d82373bf9fda3a71d2", 4656}, @@ -2111,7 +2111,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 637662}, {"resource.003", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 684395}, AD_LISTEND}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, // also includes english language + Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Police Quest 3 - English Amiga // Executable scanning reports "1.004.024" @@ -2126,7 +2126,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Police Quest 3 - German Amiga + // Police Quest 3 - German Amiga (also includes english language) // Executable scanning reports "1.004.024" // SCI interpreter version 1.000.784 {"pq3", "", { @@ -2138,7 +2138,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "6258d5dd85898d8e218eb8113ebc9059", 722738}, {"resource.005", 0, "6258d5dd85898d8e218eb8113ebc9059", 704485}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Police Quest 3 - English DOS (from the Police Quest Collection) // Executable scanning reports "T.A00.178", VERSION file reports "1.00" @@ -2163,7 +2163,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, - // Police Quest 3 - German DOS (supplied by markcoolio in bug report #2723837) + // Police Quest 3 - German DOS (supplied by markcoolio in bug report #2723837, also includes english language) // Executable scanning reports "T.A00.178" // SCI interpreter version 1.000.510 {"pq3", "", { @@ -2174,7 +2174,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "4836f460f4cfc8de61e2df4c45775504", 1180956}, {"resource.004", 0, "0c3eb84b9755852d9e795e0d5c9373c7", 1171760}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Police Quest 4 - English DOS Non-Interactive Demo (from FRG) // SCI interpreter version 1.001.096 @@ -2270,7 +2270,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Quest for Glory 1 - Japanese PC-98 5.25" Floppy + // Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes english language) // Executable scanning reports "S.old.201" {"qfg1", "8 Colors", { {"resource.map", 0, "5cbeb95dd2a4b7cb242b415cc6ec1c47", 6444}, @@ -2278,9 +2278,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1136968}, {"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 769897}, AD_LISTEND}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, + Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Quest for Glory 1 - Japanese PC-98 5.25" Floppy + // Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes english language) // Executable scanning reports "S.old.201" {"qfg1", "16 Colors", { {"resource.map", 0, "3ecaba33bf77cb434067a0b8aee15097", 6444}, @@ -2288,7 +2288,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1147121}, {"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 777575}, AD_LISTEND}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, + Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Quest for Glory 1 - English Amiga // Executable scanning reports "1.002.020" @@ -2660,7 +2660,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Space Quest 3 - German Amiga + // Space Quest 3 - German Amiga (also includes english language) // Executable scanning reports "1.004.006" // SCI interpreter version 0.000.453 (just a guess) {"sq3", "", { @@ -2671,7 +2671,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 545053}, {"resource.005", 0, "6d8f34090503ce937e7dbef6cb6cdb6a", 687507}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Space Quest 3 - English DOS Non-Interactive Demo // SCI interpreter version 0.000.453 @@ -2722,7 +2722,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, - // Space Quest 3 - German DOS (from Tobis87) + // Space Quest 3 - German DOS (from Tobis87, also includes english language) // SCI interpreter version 0.000.453 (?) {"sq3", "", { {"resource.map", 0, "4965c78b5eff50d5e4148ce114594ba8", 7584}, @@ -2734,9 +2734,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "9107c2aa5398e28b5c5406df13491f85", 320643}, {"resource.007", 0, "9107c2aa5398e28b5c5406df13491f85", 344287}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Space Quest 3 v1.052 - German DOS (supplied by markcoolio in bug report #2723860) + // Space Quest 3 v1.052 - German DOS (supplied by markcoolio in bug report #2723860, also includes english language) // Executable scanning reports "S.old.114" {"sq3", "", { {"resource.map", 0, "f0dd735098c254f584878649c6f08dbc", 5154}, @@ -2744,7 +2744,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "9107c2aa5398e28b5c5406df13491f85", 596768}, {"resource.003", 0, "9107c2aa5398e28b5c5406df13491f85", 693573}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Space Quest 4 - English Amiga // Executable scanning reports "1.004.024" @@ -2761,7 +2761,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, - // Space Quest 4 - German Amiga (from www.back2roots.org) + // Space Quest 4 - German Amiga (from www.back2roots.org, also includes english language) // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { {"resource.map", 0, "79641c0d43408e33c251a1d494d2575e", 6252}, @@ -2773,7 +2773,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "10ee1709e6559c724676d058199b75b5", 818745}, {"resource.006", 0, "67fb188b191d88efe8414af6ea297b93", 672675}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO_NOSPEECH }, #if 0 // Space Quest 4 - English DOS - THIS VERSION IS PIRATED/CRACKED AND REPACKAGED =DO NOT RE-ADD= @@ -2821,7 +2821,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - // Space Quest 4 - German DOS (from Tobis87) + // Space Quest 4 - German DOS (from Tobis87, also includes english language) // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { {"resource.map", 0, "71715e775e3791178d606cfe6c7e1fb9", 6339}, @@ -2833,9 +2833,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.005", 0, "47ee647b5b12232d27e63cc627c25899", 1156765}, {"resource.006", 0, "dfb023e4e2a1e7a00fa18f9ede72a91b", 924059}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Space Quest 4 - Italian DOS Floppy (from glorifindel) + // Space Quest 4 - Italian DOS Floppy (from glorifindel, also includes english language) // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { {"resource.map", 0, "e753dfa96d68dd95f84f6cd80479a35e", 6135}, @@ -2846,9 +2846,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "4277c61bed40a50dadc4b5a344520af2", 1251000}, {"resource.005", 0, "5f885abd335978e2fd4e5f886d7676c8", 1102880}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::IT_ITA, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Space Quest 4 - Japanese PC-98 5.25" Floppy + // Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language) // SCI interpreter version 1.000.1068 {"sq4", "", { {"resource.map", 0, "ca7bba01019222b6f3e54e9051067a99", 5283}, @@ -2856,9 +2856,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088}, {"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249}, AD_LISTEND}, - Common::JA_JPN, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, + Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Space Quest 4 - Japanese PC-98 5.25" Floppy + // Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language) // SCI interpreter version 1.000.1068 {"sq4", "", { {"resource.map", 0, "ca7bba01019222b6f3e54e9051067a99", 5283}, @@ -2866,7 +2866,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088}, {"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC98, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Space Quest 4 - English DOS CD (from the Space Quest Collection) // Executable scanning reports "1.001.064", VERSION file reports "1.0" @@ -2876,7 +2876,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, - // Space Quest 4 - Spanish DOS CD (from jvprat) + // Space Quest 4 - Spanish DOS CD (from jvprat, is still text only, not talkie, also includes english language) // Executable scanning reports "1.SQ4.057", VERSION file reports "1.000" // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { @@ -2888,9 +2888,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "776fba81c110d1908776232cbe190e20", 1253752}, {"resource.005", 0, "55fae26c2a92f16ef72c1e216e827c0f", 1098328}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NONE }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NONE }, - // Space Quest 4 - Spanish DOS Floppy (from jvprat) + // Space Quest 4 - Spanish DOS Floppy (from jvprat, also includes english language) // Executable scanning reports "1.SQ4.056", VERSION file reports "1.000" // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { @@ -2900,9 +2900,9 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.002", 0, "74c62fa2146ff3b3b2ea2b3fb95b9af9", 1140801}, {"resource.003", 0, "42a307941edeb1a3be31daeb2e4be90b", 1088408}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, - // Space Quest 4 1.000 - German DOS Floppy (supplied by markcoolio in bug report #2723862) + // Space Quest 4 1.000 - German DOS Floppy (supplied by markcoolio in bug report #2723862, also includes english language) // Executable scanning reports "1.SQ4.030" // SCI interpreter version 1.000.200 (just a guess) {"sq4", "", { @@ -2914,7 +2914,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.004", 0, "c06350184a490c10eb4585fff0aa3192", 1254368}, {"resource.005", 0, "b8d6efbd3235329bfe844c794097b2c9", 1098717}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_ADDENGLISH, GUIO_NOSPEECH }, // Space Quest 4 - English Macintosh // Executable scanning reports "x.yyy.zzz" -- cgit v1.2.3 From 716f08a8ffcb77a1c488b1e4cc88f2be8af97a2e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 22:41:06 +0000 Subject: SCI: honoring english selection for multilingual games svn-id: r51598 --- engines/sci/sci.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 4728578e16..ba2779e84d 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -237,6 +237,17 @@ Common::Error SciEngine::run() { debug("Emulating SCI version %s\n", getSciVersionDesc(getSciVersion())); + if (_gameDescription->flags & ADGF_ADDENGLISH) { + // if game is multilingual + if (getLanguage() == Common::EN_ANY) { + // and english was selected as language + if (SELECTOR(printLang) != -1) // set text language to english + writeSelectorValue(segMan, _gameObj, SELECTOR(printLang), 1); + if (SELECTOR(parseLang) != -1) // and set parser language to english as well + writeSelectorValue(segMan, _gameObj, SELECTOR(parseLang), 1); + } + } + // Check whether loading a savestate was requested int saveSlot = ConfMan.getInt("save_slot"); if (saveSlot >= 0) { -- cgit v1.2.3 From 75ff5360e22b2e8c6d796d064eb93751e6da522e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 22:54:34 +0000 Subject: SCI: adding workaround for pq3 svn-id: r51600 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 38b90d46a2..ade75c7bd4 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -300,6 +300,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_LSL6, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident { GID_LSL6, 740, 740, 0, "showCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during ending, 4 additional parameters are passed by accident { GID_LSL6HIRES, 130, 130, 0, "recruitLarryScr", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // during intro, a 3rd parameter is passed by accident + { GID_PQ3, 877, 998, 0, "View", "delete", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when getting run over on the freeway, the reference is invalid { GID_SQ1, 43, 303, 0, "slotGuy", "dispose", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when leaving ulence flats bar, parameter 1 is not passed - script error SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From ddd2bd6a1cc3e8b599e4398b61bc8e6e45ebb805 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 1 Aug 2010 22:59:58 +0000 Subject: SCI: switching to upscaled hires on pc98 games instead of checking the language to be japanese for that svn-id: r51601 --- engines/sci/graphics/screen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 839b9975c5..07ba7441ca 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -62,7 +62,7 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { } // Japanese versions of games use hi-res font on upscaled version of the game. - if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) + if ((g_sci->getPlatform() == Common::kPlatformPC98) && (getSciVersion() <= SCI_VERSION_1_1)) _upscaledHires = GFX_SCREEN_UPSCALED_640x400; _pixels = _width * _height; -- cgit v1.2.3 From 55ada2315a269ee5dd2777652dc622c5b1c70b2e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 2 Aug 2010 08:36:33 +0000 Subject: AdvancedDetector: Fix ADGF_ADDENGISH implementation svn-id: r51606 --- engines/advancedDetector.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 61e6a9de73..f4af4a8500 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -309,7 +309,12 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) // If the GUI options were updated, we catch this here and update them in the users config // file transparently. - Common::updateGameGUIOptions(agdDesc->guioptions | params.guioptions, getGameGUIOptionsDescriptionLanguage(agdDesc->language)); + Common::String lang = getGameGUIOptionsDescriptionLanguage(agdDesc->language); + if (agdDesc->flags & ADGF_ADDENGLISH) + lang += " " + getGameGUIOptionsDescriptionLanguage(Common::EN_ANY); + + Common::updateGameGUIOptions(agdDesc->guioptions | params.guioptions, lang); + debug(2, "Running %s", toGameDescriptor(*agdDesc, params.list).description().c_str()); if (!createInstance(syst, engine, agdDesc)) @@ -458,7 +463,8 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p // Do not even bother to look at entries which do not have matching // language and platform (if specified). - if ((language != Common::UNK_LANG && g->language != Common::UNK_LANG && g->language != language) || + if ((language != Common::UNK_LANG && g->language != Common::UNK_LANG && g->language != language + && !(language == Common::EN_ANY && (g->flags & ADGF_ADDENGLISH))) || (platform != Common::kPlatformUnknown && g->platform != Common::kPlatformUnknown && g->platform != platform)) { continue; } -- cgit v1.2.3 From 52c9c7b445f430879cadf06277a0da8fb499e4d8 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 08:47:06 +0000 Subject: SCI: fixing getting selected language for multilingual games svn-id: r51608 --- engines/sci/graphics/screen.cpp | 2 +- engines/sci/sci.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 07ba7441ca..839b9975c5 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -62,7 +62,7 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) { } // Japanese versions of games use hi-res font on upscaled version of the game. - if ((g_sci->getPlatform() == Common::kPlatformPC98) && (getSciVersion() <= SCI_VERSION_1_1)) + if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1)) _upscaledHires = GFX_SCREEN_UPSCALED_640x400; _pixels = _width * _height; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index ba2779e84d..6abe52fea4 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -239,7 +239,8 @@ Common::Error SciEngine::run() { if (_gameDescription->flags & ADGF_ADDENGLISH) { // if game is multilingual - if (getLanguage() == Common::EN_ANY) { + Common::Language selectedLanguage = Common::parseLanguage(ConfMan.get("language")); + if (selectedLanguage == Common::EN_ANY) { // and english was selected as language if (SELECTOR(printLang) != -1) // set text language to english writeSelectorValue(segMan, _gameObj, SELECTOR(printLang), 1); -- cgit v1.2.3 From f434f901bdafc119454a119e94ea5dfba4b6ec5c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Aug 2010 09:04:14 +0000 Subject: SCI: Fixed script bug #3038077 - "PQ3 : Engine Abort While Plotting Crimes", together with 2 subsequent similar bugs svn-id: r51609 --- engines/sci/engine/kernel_tables.h | 4 ++-- engines/sci/engine/workarounds.cpp | 8 ++++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 7a377258f7..2427e5fc89 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -184,8 +184,8 @@ static const SciKernelMapSubEntry kGraph_subops[] = { { SIG_SCIALL, 9, MAP_CALL(GraphFillBoxBackground), "iiii", NULL }, { SIG_SCIALL, 10, MAP_CALL(GraphFillBoxForeground), "iiii", kGraphFillBoxForeground_workarounds }, { SIG_SCIALL, 11, MAP_CALL(GraphFillBoxAny), "iiiiii(i)(i)", kGraphFillBoxAny_workarounds }, - { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", NULL }, // kq6 hires - { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", NULL }, + { SIG_SCI11, 12, MAP_CALL(GraphUpdateBox), "iiii(i)(r0)", kGraphUpdateBox_workarounds }, // kq6 hires + { SIG_SCIALL, 12, MAP_CALL(GraphUpdateBox), "iiii(i)", kGraphUpdateBox_workarounds }, { SIG_SCIALL, 13, MAP_CALL(GraphRedrawBox), "iiii", kGraphRedrawBox_workarounds }, { SIG_SCIALL, 14, MAP_CALL(GraphAdjustPriority), "ii", NULL }, { SIG_SCI11, 15, MAP_CALL(GraphSaveUpscaledHiresBox), "iiii", NULL }, // kq6 hires diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index ade75c7bd4..689fd7bcd6 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -210,6 +210,7 @@ const SciWorkaroundEntry kGraphSaveBox_workarounds[] = { { GID_ISLANDBRAIN, 290, 291, 0, "upElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // when testing in the elevator puzzle, gets called with 1 argument less - 15 is on stack - bug #3034485 { GID_ISLANDBRAIN, 290, 291, 0, "downElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above { GID_ISLANDBRAIN, 290, 291, 0, "correctElevator", "changeState",0x201f, 0, { WORKAROUND_STILLCALL, 0 } }, // see above (when testing the correct solution) + { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -247,6 +248,13 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kGraphUpdateBox_workarounds[] = { + { GID_PQ3, 202, 202, 0, "MapEdit", "movePt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077 + { GID_PQ3, 202, 202, 0, "MapEdit", "addPt", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when plotting crimes, gets called with 2 extra parameters - bug #3038077 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kIsObject_workarounds[] = { { GID_GK1, 50, 999, 0, "List", "eachElementDo", -1, 0, { WORKAROUND_FAKE, 0 } }, // GK1 demo, when asking Grace for messages it gets called with an invalid parameter (type "error") - bug #3034519 diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index acb0c22e6c..8666d1bc6e 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -84,6 +84,7 @@ extern const SciWorkaroundEntry kGetAngle_workarounds[]; extern const SciWorkaroundEntry kGraphDrawLine_workarounds[]; extern const SciWorkaroundEntry kGraphSaveBox_workarounds[]; extern const SciWorkaroundEntry kGraphRestoreBox_workarounds[]; +extern const SciWorkaroundEntry kGraphUpdateBox_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; -- cgit v1.2.3 From f0d7808b2ad8054a7c557dffbe2ac8c95ebd1ad9 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Aug 2010 09:10:20 +0000 Subject: Added another version of Castle of Dr. Brain (bug report #3037942) svn-id: r51610 --- engines/sci/detection_tables.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 9c369cbaba..4077ff113d 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -116,6 +116,21 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Castle of Dr. Brain - English DOS Floppy 1.000 + // Reported by graxer in bug report #3037942 + {"castlebrain", "", { + {"resource.map", 0, "453daa935535cef68d19704c2b1b78a2", 2649}, + {"resource.000", 0, "6e125f4ce3f4f5c35f2617c7b66c6e21", 25929}, + {"resource.001", 0, "4891faa2f6594c622e482f0ddce24fb4", 99404}, + {"resource.002", 0, "aebb56d5d005557ca0d122a03aa85386", 322459}, + {"resource.003", 0, "278ec1e6132c7be844d433dd23beb318", 335156}, + {"resource.004", 0, "fca1c3f2be660185206f004bda09f4fb", 333549}, + {"resource.005", 0, "9294e55da1e83708ad3104b2a3963e18", 327537}, + {"resource.006", 0, "1d778a0c65cac9ddbab65495e50a94ee", 335281}, + {"resource.007", 0, "063bb8ce4157c778cf30d1c912c006f1", 335631}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Castle of Dr. Brain - Spanish DOS (also includes english language) // SCI interpreter version 1.000.510 {"castlebrain", "", { -- cgit v1.2.3 From 065d32ec0025a12276957277798464a62bd88094 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Aug 2010 11:46:03 +0000 Subject: SCI: Fixed script bug #3037835 - "ISLANDBRAIN: Crash when breeding second-generation hybrid" svn-id: r51611 --- engines/sci/engine/kernel_tables.h | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 2427e5fc89..a0995b8e66 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -433,7 +433,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(SinDiv), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(Sort), SIG_EVERYWHERE, "ooo", NULL, NULL }, { MAP_CALL(Sqrt), SIG_EVERYWHERE, "i", NULL, NULL }, - { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, NULL }, + { MAP_CALL(StrAt), SIG_EVERYWHERE, "ri(i)", NULL, kStrAt_workarounds }, { MAP_CALL(StrCat), SIG_EVERYWHERE, "rr", NULL, NULL }, { MAP_CALL(StrCmp), SIG_EVERYWHERE, "rr(i)", NULL, NULL }, { MAP_CALL(StrCpy), SIG_EVERYWHERE, "r[r0](i)", NULL, NULL }, diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 689fd7bcd6..8c122b7278 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -293,6 +293,12 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kStrAt_workarounds[] = { + { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_IGNORE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #3037835 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_CAMELOT, 921, 921, 1, "Script", "changeState", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: While showing Camelot (and other places), the reference is invalid - bug #3035000 diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 8666d1bc6e..a58f790c56 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -94,6 +94,7 @@ extern const SciWorkaroundEntry kNewWindow_workarounds[]; extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetCursor_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; +extern const SciWorkaroundEntry kStrAt_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroundEntry *workaroundList, SciTrackOriginReply *trackOrigin); -- cgit v1.2.3 From 81aeb6a125947dc8ae7456c7f5898d41d6d1a86c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Aug 2010 12:18:22 +0000 Subject: SCI: Actually fake a return value for rev #51611, instead of ignoring the call completely svn-id: r51612 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 8c122b7278..33e5764fed 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -295,7 +295,7 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kStrAt_workarounds[] = { - { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_IGNORE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #3037835 + { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_FAKE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #3037835 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From e59db80dec9460356a4c30c737b605ccf4720d1d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 12:39:01 +0000 Subject: SCI: qfg2/3 import - change directory button disabled - showing message where to put characters, if saved from original sci interpreter svn-id: r51613 --- engines/sci/engine/kgraphics.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 07864f5648..ae3394e1c2 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -29,6 +29,8 @@ #include "graphics/cursorman.h" #include "graphics/surface.h" +#include "gui/message.h" + #include "sci/sci.h" #include "sci/debug.h" // for g_debug_sleeptime_factor #include "sci/resource.h" @@ -894,7 +896,8 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { // Disable the "Change Directory" button, as we don't allow the game engine to // change the directory where saved games are placed - if (objName == "changeDirI") { + // "changeDirItem" is used in the import windows of QFG2&3 + if ((objName == "changeDirI") || (objName == "changeDirItem")) { int state = readSelectorValue(s->_segMan, controlObject, SELECTOR(state)); writeSelectorValue(s->_segMan, controlObject, SELECTOR(state), (state | SCI_CONTROLS_STYLE_DISABLED) & ~SCI_CONTROLS_STYLE_ENABLED); } @@ -910,6 +913,12 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { } } } + if (objName == "savedHeros") { + // Import of QfG character files dialog is shown + // display additional popup information before letting user use it + GUI::MessageDialog dialog("characters saved inside ScummVM will get shown automatically. Character files saved in the original interpreter need to get put inside ScummVM saved games directory and a prefix need to get added depending on which game it was saved in 'qfg1-' for Quest for Glory 1, 'qfg2-' for Quest for Glory 2 e.g. 'qfg2-thief.sav'", "OK"); + dialog.runModal(); + } _k_GenericDrawControl(s, controlObject, false); return NULL_REG; -- cgit v1.2.3 From b914ad3e843b208fa897b1916ae187559b1b3f71 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 12:48:28 +0000 Subject: SCI: fixing typo svn-id: r51614 --- engines/sci/engine/kgraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index ae3394e1c2..5a6ad7e324 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -916,7 +916,7 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { if (objName == "savedHeros") { // Import of QfG character files dialog is shown // display additional popup information before letting user use it - GUI::MessageDialog dialog("characters saved inside ScummVM will get shown automatically. Character files saved in the original interpreter need to get put inside ScummVM saved games directory and a prefix need to get added depending on which game it was saved in 'qfg1-' for Quest for Glory 1, 'qfg2-' for Quest for Glory 2 e.g. 'qfg2-thief.sav'", "OK"); + GUI::MessageDialog dialog("characters saved inside ScummVM will get shown automatically. Character files saved in the original interpreter need to get put inside ScummVM saved games directory and a prefix needs to get added depending on which game it was saved in 'qfg1-' for Quest for Glory 1, 'qfg2-' for Quest for Glory 2 e.g. 'qfg2-thief.sav'", "OK"); dialog.runModal(); } -- cgit v1.2.3 From 50b8073bab18e1a5f8c620468bc97bb1e9369148 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 13:41:58 +0000 Subject: SCI: clipping plane rects for sci32 fixes crash in hires gk1 on cemetary svn-id: r51615 --- engines/sci/graphics/frameout.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index b8d50e77ce..21e3c59628 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -109,10 +109,12 @@ void GfxFrameout::kernelDeletePlane(reg_t object) { planeRect.bottom = readSelectorValue(_segMan, object, SELECTOR(bottom)) + 1; planeRect.right = readSelectorValue(_segMan, object, SELECTOR(right)) + 1; - planeRect.top = (planeRect.top * _screen->getHeight()) / scriptsRunningHeight; - planeRect.left = (planeRect.left * _screen->getWidth()) / scriptsRunningWidth; - planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / scriptsRunningHeight; - planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; + Common::Rect screenRect(_screen->getWidth(), _screen->getHeight()); + planeRect.top = (planeRect.top * screenRect.height()) / scriptsRunningHeight; + planeRect.left = (planeRect.left * screenRect.width()) / scriptsRunningWidth; + planeRect.bottom = (planeRect.bottom * screenRect.height()) / scriptsRunningHeight; + planeRect.right = (planeRect.right * screenRect.width()) / scriptsRunningWidth; + planeRect.clip(screenRect); // we need to do this, at least in gk1 on cemetary we get bottom right -> 201, 321 // Blackout removed plane rect _paint32->fillRect(planeRect, 0); return; @@ -220,10 +222,12 @@ void GfxFrameout::kernelFrameout() { // Update priority here, sq6 sets it w/o UpdatePlane uint16 planePriority = it->priority = readSelectorValue(_segMan, planeObject, SELECTOR(priority)); - planeRect.top = (planeRect.top * _screen->getHeight()) / scriptsRunningHeight; - planeRect.left = (planeRect.left * _screen->getWidth()) / scriptsRunningWidth; - planeRect.bottom = (planeRect.bottom * _screen->getHeight()) / scriptsRunningHeight; - planeRect.right = (planeRect.right * _screen->getWidth()) / scriptsRunningWidth; + Common::Rect screenRect(_screen->getWidth(), _screen->getHeight()); + planeRect.top = (planeRect.top * screenRect.height()) / scriptsRunningHeight; + planeRect.left = (planeRect.left * screenRect.width()) / scriptsRunningWidth; + planeRect.bottom = (planeRect.bottom * screenRect.height()) / scriptsRunningHeight; + planeRect.right = (planeRect.right * screenRect.width()) / scriptsRunningWidth; + planeRect.clip(screenRect); // we need to do this, at least in gk1 on cemetary we get bottom right -> 201, 321 int16 planeOffsetX = 0; -- cgit v1.2.3 From 7ad434c592787969138b506eae5381c99c4d3909 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 13:45:51 +0000 Subject: SCI: adding workaround for kq5 floppy should fix bug #3037003, i dont have english floppy, can't test. svn-id: r51616 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 33e5764fed..54f956e521 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -132,6 +132,7 @@ const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelHigh_workarounds[] = { + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu SCI_WORKAROUNDENTRY_TERMINATOR @@ -139,6 +140,7 @@ const SciWorkaroundEntry kCelHigh_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From 8cfce68c087d75b96524aee36b85364074bf4574 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 13:49:08 +0000 Subject: SCI: adding bug id inside comments svn-id: r51617 --- engines/sci/engine/workarounds.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 54f956e521..a4fe2d9147 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -132,15 +132,15 @@ const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelHigh_workarounds[] = { - { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects - { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu + { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { - { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From c715f18273a51629d73cd185b94f8c036d5c15de Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 14:14:06 +0000 Subject: SCI: Fix bug #3037055: Jones in the Fast Lane EGA - fails to start A regression of r51423. Jones EGA has a non-parser related vocab.900 resource, so we can't detect the fan games based on not having an SCI1 vocab.900 resource. Fan games are now detected on whether or not vocab.0 exists (the parser vocab for SCI0). svn-id: r51619 --- engines/sci/resource.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 111bf6ad9b..9d722a08c0 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1939,14 +1939,14 @@ void ResourceManager::detectSciVersion() { } // New decompressors. It's either SCI_VERSION_0_LATE, SCI_VERSION_1_EGA or SCI_VERSION_1_EARLY. - if (testResource(ResourceId(kResourceTypeVocab, 900))) { - if (hasSci1Voc900()) { - s_sciVersion = SCI_VERSION_1_EGA; - return; - } else { - s_sciVersion = SCI_VERSION_0_LATE; - return; - } + if (testResource(ResourceId(kResourceTypeVocab, 0))) { + s_sciVersion = SCI_VERSION_0_LATE; + return; + } + + if (hasSci1Voc900()) { + s_sciVersion = SCI_VERSION_1_EGA; + return; } // SCI_VERSION_1_EARLY EGA versions lack the parser vocab -- cgit v1.2.3 From 94e8c3a1a85c6939aa205fa504fc06fdaf7fd8f9 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 14:38:20 +0000 Subject: SCI: Add fallback detection for Mac SCI0 games svn-id: r51620 --- engines/sci/detection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 3e5d978e91..3a8e10fd84 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -496,8 +496,8 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const Common::FSList &fsl filename.contains("patch.005") || filename.contains("bank.001")) s_fallbackDesc.platform = Common::kPlatformAmiga; - // The existence of 7.pat indicates a Mac game - if (filename.contains("7.pat")) + // The existence of 7.pat or patch.200 indicates a Mac game + if (filename.contains("7.pat") || filename.contains("patch.200")) s_fallbackDesc.platform = Common::kPlatformMacintosh; // The data files for Atari ST versions are the same as their DOS counterparts -- cgit v1.2.3 From c5959bb179201d3c4eda48968c57468a01664a4d Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 14:39:46 +0000 Subject: SCI: Add Hoyle 2 Mac md5's svn-id: r51622 --- engines/sci/detection_tables.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 4077ff113d..3b59f96a63 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -737,6 +737,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformAmiga, 0, GUIO_NOSPEECH }, + // Hoyle 2 - English Macintosh + // Executable scanning reports "x.yyy.zzz" + {"hoyle2", "", { + {"resource.map", 0, "1af1d3aa3cf564f93477c9f87e53f495", 1728}, + {"resource.001", 0, "b73b8131669d69d41a326415e4519138", 482882}, + {NULL, 0, NULL, 0}}, + Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, + #if 0 // TODO: unknown if these files are corrupt // Hoyle 3 - English Amiga (from www.back2roots.org) // Executable scanning reports "1.005.000" -- cgit v1.2.3 From 8686be738b8c72824bec8b00d003b975965206b5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 15:17:18 +0000 Subject: SCI: Enable the Lighthouse demo SCI2.1 entry even when ENABLE_SCI3_GAMES is not set svn-id: r51624 --- engines/sci/detection_tables.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 3b59f96a63..0c642ffbde 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -1825,6 +1825,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418}, AD_LISTEND}, Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, +#endif // Lighthouse - English Windows Demo (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.00" @@ -1834,6 +1835,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, +#ifdef ENABLE_SCI3_GAMES // Lighthouse - English Windows Demo // Executable scanning reports "3.000.000", VERSION file reports "1.00" {"lighthouse", "Demo", { -- cgit v1.2.3 From 84999b2daa85e67ea945af87c23ce418d69a4c03 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 15:23:23 +0000 Subject: SCI: adding workaround for lsl6 when touching fence svn-id: r51625 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a4fe2d9147..e7c2112506 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -98,6 +98,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #3036483 { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') + { GID_LSL6, 820, 82, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup -- cgit v1.2.3 From 6792193c892d68fc8a5b104c580a644635e576c6 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 15:26:19 +0000 Subject: SCI: adding bugid again :P svn-id: r51626 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index e7c2112506..5754110143 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -98,7 +98,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LSL2, 38, 38, 0, "cloudScript", "changeState", -1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #3036483 { GID_LSL3, 340, 340, 0, "ComicScript", "changeState", -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203) { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", -1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's') - { GID_LSL6, 820, 82, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence + { GID_LSL6, 820, 82, 0, "", "export 0", -1, -1, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence - bug #3038326 { GID_LSL6, -1, 85, 0, "washcloth", "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory { GID_LSL6, -1, 928, -1, "Narrator", "startText", -1, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_LSL6HIRES, 0, 85, 0, "LL6Inv", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // on startup -- cgit v1.2.3 From e14033c6c5a12c74f56091a0f53e113fbe2ad279 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 15:42:51 +0000 Subject: SCI: adding kq5 english floppy workaround solves bug #3037594 svn-id: r51627 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5754110143..57917e26b9 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -183,6 +183,7 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { { GID_CAMELOT, -1, 989, 0, "rmMusic", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called frequently with a NULL reference (i.e. 0:0) - bug #3035149 { GID_KQ1, -1, 989, 0, "gameSound", "fade", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in several scenes (e.g. graham cracker) with 0:0 { GID_KQ4, -1, 989, 0, "mySound", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // gets called in the demo when trying to open the non-existent menu with 0:0 - bug #3036942 + { GID_KQ5, 213, 989, 0, "globalSound3", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when bandits leave the secret temple, parameter 4 is an object - bug #3037594 { GID_KQ6, 105, 989, 0, "globalSound", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object { GID_KQ6, 460, 989, 0, "globalSound2", "fade", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #3034567 SCI_WORKAROUNDENTRY_TERMINATOR -- cgit v1.2.3 From cad3ea9f78b1765676ab35727622979b4cf65fec Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 16:38:48 +0000 Subject: SCI: extend workaround for qfg2 fixes bug #3038367 svn-id: r51628 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 57917e26b9..359fb16c97 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -110,7 +110,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbd0, 0, { WORKAROUND_FAKE, 0 } }, // hq1: going to the brigands hideout { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory - { GID_QFG2, -1, 701, 0, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 + { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From d82e106d8117233e11875eafa323e845149339ee Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:11:12 +0000 Subject: DS: Disable scalers and SID svn-id: r51634 --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 7e3a6f45f0..7118efc122 100755 --- a/configure +++ b/configure @@ -1633,7 +1633,7 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" - DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' @@ -1642,7 +1642,7 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="ds" - _build_hq_scalers="no" + _build_scalers="no" _mt32emu="no" _port_mk="backends/platform/ds/ds.mk" ;; -- cgit v1.2.3 From 5fb1bfd5a692c9b8a38b431d64958b3c3ffcb92c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:11:25 +0000 Subject: BUILD: Order host names (in particular ds and android) alphabetically svn-id: r51635 --- configure | 208 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/configure b/configure index 7118efc122..165d7479b6 100755 --- a/configure +++ b/configure @@ -362,7 +362,7 @@ get_system_exe_extension() { arm-riscos) _exeext=",ff8" ;; - dreamcast | gamecube | ds | ps2 | psp | wii | n64) + dreamcast | ds | gamecube | n64 | ps2 | psp | wii) _exeext=".elf" ;; gp2x-linux) @@ -921,6 +921,11 @@ get_system_exe_extension $guessed_host NATIVEEXEEXT=$_exeext case $_host in +android) + _host_os=android + _host_cpu=arm + _host_alias=arm-oe-linux-androideabi + ;; arm-riscos) _host_os=riscos _host_cpu=arm @@ -932,6 +937,11 @@ dreamcast) CXXFLAGS="$CXXFLAGS -ml -m4-single-only" LDFLAGS="$LDFLAGS -ml -m4-single-only" ;; +ds) + _host_os=ds + _host_cpu=arm + _host_alias=arm-eabi + ;; gamecube) _host_os=gamecube _host_cpu=ppc @@ -970,11 +980,6 @@ motomagx) _host_cpu=arm _host_alias=arm-linux-gnueabi ;; -ds) - _host_os=ds - _host_cpu=arm - _host_alias=arm-eabi - ;; n64) _host_os=n64 _host_cpu=mips @@ -1030,11 +1035,6 @@ wince) _host_cpu=arm _host_alias=arm-wince-mingw32ce ;; -android) - _host_os=android - _host_cpu=arm - _host_alias=arm-oe-linux-androideabi - ;; *) if test -n "$_host"; then guessed_host=`$_srcdir/config.sub $_host` @@ -1096,7 +1096,13 @@ esac # Platform specific sanity checks # case $_host_os in -gamecube | ds | wii) +android) + if test -z "$ANDROID_SDK"; then + echo "Please set ANDROID_SDK in your environment. export ANDROID_SDK=" + exit 1 + fi + ;; +ds | gamecube | wii) if test -z "$DEVKITPRO"; then echo "Please set DEVKITPRO in your environment. export DEVKITPRO=" exit 1 @@ -1115,12 +1121,6 @@ psp) exit 1 fi ;; -android) - if test -z "$ANDROID_SDK"; then - echo "Please set ANDROID_SDK in your environment. export ANDROID_SDK=" - exit 1 - fi - ;; *) ;; esac @@ -1354,6 +1354,12 @@ case $_host_os in # as (unsigned) long, and consequently we'd get a compiler error otherwise. type_4_byte='long' ;; + android) + CXXFLAGS="$CXXFLAGS -Os -msoft-float -mtune=xscale -march=armv5te -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__" + add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" + _unix=yes + _seq_midi=no + ;; beos*) DEFINES="$DEFINES -DSYSTEM_NOT_SUPPORTING_D_TYPE" # Needs -lbind -lsocket for the timidity MIDI driver @@ -1380,6 +1386,15 @@ case $_host_os in dreamcast) DEFINES="$DEFINES -D__DC__ -DNONSTANDARD_PORT" ;; + ds) + # TODO Nintendo DS + DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" + CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" + CXXFLAGS="$CXXFLAGS -mthumb-interwork -ffunction-sections -fdata-sections -fno-strict-aliasing" + LDFLAGS="$LDFLAGS -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections" + LDFLAGS="$LDFLAGS -L$DEVKITPRO/libnds/lib" + LIBS="$LIBS -lnds9" + ;; freebsd*) LDFLAGS="$LDFLAGS -L/usr/local/lib" CXXFLAGS="$CXXFLAGS -I/usr/local/include" @@ -1428,15 +1443,6 @@ case $_host_os in DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_COMMAND_LINE" DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL" ;; - ds) - # TODO Nintendo DS - DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" - CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" - CXXFLAGS="$CXXFLAGS -mthumb-interwork -ffunction-sections -fdata-sections -fno-strict-aliasing" - LDFLAGS="$LDFLAGS -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections" - LDFLAGS="$LDFLAGS -L$DEVKITPRO/libnds/lib" - LIBS="$LIBS -lnds9" - ;; os2-emx*) _unix=yes # FIXME??? Why?? ;; @@ -1466,12 +1472,6 @@ case $_host_os in DEFINES="$DEFINES -D_WIN32_WCE=300 -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT" DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__=" ;; - android) - CXXFLAGS="$CXXFLAGS -Os -msoft-float -mtune=xscale -march=armv5te -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__" - add_line_to_config_mk "ANDROID_SDK = $ANDROID_SDK" - _unix=yes - _seq_midi=no - ;; # given this is a shell script assume some type of unix *) echo "WARNING: could not establish system type, assuming unix like" @@ -1483,6 +1483,19 @@ if test -n "$_host"; then # Cross-compiling mode - add your target here if needed echo "Cross-compiling to $_host" case "$_host" in + android) + DEFINES="$DEFINES -DANDROID -DUSE_ARM_SMUSH_ASM" + _unix=yes + _need_memalign=yes + add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' + add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' + add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' + add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' + add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' + _backend="android" + _port_mk="backends/platform/android/android.mk" + _seq_midi=no + ;; arm-linux|arm*-linux-gnueabi|arm-*-linux) _unix=yes _need_memalign=yes @@ -1515,6 +1528,24 @@ if test -n "$_host"; then add_line_to_config_mk 'ronindir = /usr/local/ronin' _port_mk="backends/platform/dc/dreamcast.mk" ;; + ds) + # TODO: complete this + DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" + DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" + DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID" + DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" + _need_memalign=yes + add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' + add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' + add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' + add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' + add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' + _backend="ds" + _build_scalers="no" + _mt32emu="no" + _port_mk="backends/platform/ds/ds.mk" + ;; gamecube) _endian=big _need_memalign=yes @@ -1628,24 +1659,6 @@ if test -n "$_host"; then _seq_midi=no _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; - ds) - # TODO: complete this - DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" - DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" - DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" - DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID" - DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" - _need_memalign=yes - add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' - add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' - add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' - add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' - add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' - _backend="ds" - _build_scalers="no" - _mt32emu="no" - _port_mk="backends/platform/ds/ds.mk" - ;; n64) CXXFLAGS="$CXXFLAGS -mno-extern-sdata -O2 --param max-inline-insns-auto=20 -fomit-frame-pointer" CXXFLAGS="$CXXFLAGS -march=vr4300 -mtune=vr4300 -mhard-float -fno-rtti -fno-exceptions -Wno-multichar -Wshadow" @@ -1763,19 +1776,6 @@ if test -n "$_host"; then _mt32emu="no" _port_mk="backends/platform/wince/wince.mk" ;; - android) - DEFINES="$DEFINES -DANDROID -DUSE_ARM_SMUSH_ASM" - _unix=yes - _need_memalign=yes - add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' - add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' - add_line_to_config_mk 'USE_ARM_GFX_ASM = 1' - add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' - add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' - _backend="android" - _port_mk="backends/platform/android/android.mk" - _seq_midi=no - ;; *) echo "WARNING: Unknown target, continuing with auto-detected values" ;; @@ -2471,11 +2471,49 @@ fi # Backend related stuff # case $_backend in + android) + static_libs='' + system_libs='' + for lib in $LIBS; do + case $lib in + -lz|-lm) + system_libs="$system_libs $lib" + ;; + *) + static_libs="$static_libs $lib" + ;; + esac + done + + # -lgcc is carefully placed here - we want to catch + # all toolchain symbols in *our* libraries rather + # than pick up anything unhygenic from the Android libs. + LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -lstdc++ -llog -lGLESv1_CM" + DEFINES="$DEFINES -D__ANDROID__ -DANDROID_BACKEND -DREDUCE_MEMORY_USAGE" + add_line_to_config_mk 'PLUGIN_LDFLAGS += $(LDFLAGS) -Wl,-shared,-Bsymbolic' + + # Work around an Android 2.0+ run-time linker bug: + # The linker doesn't actually look in previously + # loaded libraries when trying to resolve symbols - + # effectively turning all dlopen(RTLD_GLOBAL) calls + # into dlopen(RTLD_LOCAL). It *does* look in + # DT_NEEDED libraries, so the workaround is to add an + # (otherwise unnecessary) dependency from plugins back + # to the main libscummvm.so. + add_line_to_config_mk 'PLUGIN_LDFLAGS += -Lbuild.tmp -lscummvm' + add_line_to_config_mk 'PLUGIN_EXTRA_DEPS += build.tmp/libscummvm.so' + ;; dc) INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/dc -isystem $(ronindir)/include' LDFLAGS="$LDFLAGS -Wl,-Ttext,0x8c010000 -nostartfiles "'$(ronindir)/lib/crt0.o -L$(ronindir)/lib' LIBS="$LIBS -lronin -lm" ;; + ds) + # TODO ds + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' + INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' + INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' + ;; gp2x) find_sdlconfig INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`" @@ -2500,12 +2538,6 @@ case $_backend in LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`" DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" ;; - ds) - # TODO ds - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/arm9/source' - INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/ds/commoninclude' - INCLUDES="$INCLUDES "'-Ibackends/platform/ds/arm9/data' - ;; n64) INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/include' INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/mips64/include' @@ -2558,38 +2590,6 @@ case $_backend in INCLUDES="$INCLUDES "'-I$(srcdir) -I$(srcdir)/backends/platform/wince -I$(srcdir)/engines -I$(srcdir)/backends/platform/wince/missing/gcc -I$(srcdir)/backends/platform/wince/CEgui -I$(srcdir)/backends/platform/wince/CEkeys' LIBS="$LIBS -static -lSDL" ;; - android) - static_libs='' - system_libs='' - for lib in $LIBS; do - case $lib in - -lz|-lm) - system_libs="$system_libs $lib" - ;; - *) - static_libs="$static_libs $lib" - ;; - esac - done - - # -lgcc is carefully placed here - we want to catch - # all toolchain symbols in *our* libraries rather - # than pick up anything unhygenic from the Android libs. - LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -lstdc++ -llog -lGLESv1_CM" - DEFINES="$DEFINES -D__ANDROID__ -DANDROID_BACKEND -DREDUCE_MEMORY_USAGE" - add_line_to_config_mk 'PLUGIN_LDFLAGS += $(LDFLAGS) -Wl,-shared,-Bsymbolic' - - # Work around an Android 2.0+ run-time linker bug: - # The linker doesn't actually look in previously - # loaded libraries when trying to resolve symbols - - # effectively turning all dlopen(RTLD_GLOBAL) calls - # into dlopen(RTLD_LOCAL). It *does* look in - # DT_NEEDED libraries, so the workaround is to add an - # (otherwise unnecessary) dependency from plugins back - # to the main libscummvm.so. - add_line_to_config_mk 'PLUGIN_LDFLAGS += -Lbuild.tmp -lscummvm' - add_line_to_config_mk 'PLUGIN_EXTRA_DEPS += build.tmp/libscummvm.so' - ;; *) echo "support for $_backend backend not implemented in configure script yet" exit 1 @@ -2605,7 +2605,7 @@ if test "$have_gcc" = yes ; then case $_host_os in # newlib-based system include files suppress non-C89 function # declarations under __STRICT_ANSI__ - mingw* | dreamcast | wii | gamecube | ds | psp | wince | amigaos* | android | n64) + amigaos* | android | ds | dreamcast | gamecube | mingw* | n64 | psp | wii | wince ) CXXFLAGS="$CXXFLAGS -W -Wno-unused-parameter" ;; *) @@ -2626,7 +2626,7 @@ fi; # Some platforms use certain GNU extensions in header files case $_host_os in -gamecube | psp | wii | android) +android | gamecube | psp | wii) ;; *) CXXFLAGS="$CXXFLAGS -pedantic" -- cgit v1.2.3 From 2682721aac813939f61105c40584373e3a30053c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:11:43 +0000 Subject: DS: Reorder & complete list of OPT_SPEED files; some tweaks Add -mno-thumb to OPT_SPEED to override the -mthumb from OPT_SIZE. svn-id: r51636 --- backends/platform/ds/ds.mk | 53 +++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index 97f104c391..a9ed3e0096 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -75,7 +75,7 @@ endif # Compiler options for files which should be optimised for speed -OPT_SPEED := -O3 +OPT_SPEED := -O3 -mno-thumb # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb @@ -83,31 +83,46 @@ OPT_SIZE := -Os -mthumb # By default optimize for size CXXFLAGS += $(OPT_SIZE) -# Files listed below will be optimisied for speed, otherwise they will be optimised for space -# TODO: speed original list contained three more files that should be optimized -# for speed: actor.cpp gfx.cpp sprite.cpp -- but there are many files with these -# names, which are the "right" ones? +# Files listed below will be optimisied for speed, otherwise they will be optimised for space. +# TODO: Several of these files probably should not be optimized for speed, but for now +# we replicate the *precise* list from the old DS makefile, to ensure full compatibility. +# Eventually, we should tune this list. +$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) $(ndsdir)/arm9/source/dsmain.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) $(ndsdir)/arm9/source/osystem_ds.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -$(ndsdir)/arm9/source/ds_main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +base/main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) sound/rate.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +sound/softsynth/opl/mame.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agos/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/cruise/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/cruise/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/draci/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/draci/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/gob/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/groovie/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/kyra/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/made/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) engines/saga/actor_path.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -sound/fmopl.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) engines/saga/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) engines/saga/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) engines/saga/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -# TODO: Fingolfin says: optimizing staticres for size would +engines/sci/engine/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/script.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/sword2/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/teenagent/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +# TODO: Fingolfin says: optimizing kyra/staticres.o for size would # save about 30k, so maybe consider that? #engines/kyra/staticres.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -- cgit v1.2.3 From 8a3a41bc2b14c9eedeafc588de42e05860809045 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:12:03 +0000 Subject: DS: More closely immitate CXXFLAGS of custom DS build system svn-id: r51637 --- backends/platform/ds/arm9/makefile | 1 - configure | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 0446f84dad..eedf75c256 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -205,7 +205,6 @@ CXX = arm-eabi-g++ LD = arm-eabi-g++ CFLAGS = -Wno-multichar -Wall\ - -Wno-multichar -mcpu=arm9tdmi -mtune=arm9tdmi \ -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ -mthumb-interwork -DUSE_ARM_COSTUME_ASM=1 -DDISABLE_SID diff --git a/configure b/configure index 165d7479b6..81c8970922 100755 --- a/configure +++ b/configure @@ -1390,7 +1390,8 @@ case $_host_os in # TODO Nintendo DS DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT" CXXFLAGS="$CXXFLAGS -isystem $DEVKITPRO/libnds/include -isystem $DEVKITPRO/devkitARM/arm-eabi/include" - CXXFLAGS="$CXXFLAGS -mthumb-interwork -ffunction-sections -fdata-sections -fno-strict-aliasing" + CXXFLAGS="$CXXFLAGS -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer -mthumb-interwork" + CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections -fno-strict-aliasing" LDFLAGS="$LDFLAGS -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections" LDFLAGS="$LDFLAGS -L$DEVKITPRO/libnds/lib" LIBS="$LIBS -lnds9" -- cgit v1.2.3 From 8d1890d9313bab67997353e68241a1ceb8d15fb2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:12:20 +0000 Subject: DS: Disable debug mode in setup-builddirs.sh svn-id: r51638 --- backends/platform/ds/setup-builddirs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/ds/setup-builddirs.sh b/backends/platform/ds/setup-builddirs.sh index 9d9cf3ffb6..11aacc1233 100755 --- a/backends/platform/ds/setup-builddirs.sh +++ b/backends/platform/ds/setup-builddirs.sh @@ -6,7 +6,7 @@ # TODO: Computer srcdir in a better way srcdir=../../../`dirname $0`/.. -BASE_PARAM="--host=ds --disable-translation --disable-all-engines" +BASE_PARAM="--host=ds --disable-translation --disable-debug --disable-all-engines" for build in a b c d e f g h i k; do echo "--- Setting up build $build ---" -- cgit v1.2.3 From 8aae4aaaeef199f65522f94fe906449e3e626e75 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:12:34 +0000 Subject: BUILD: Unify how we set vars to yes/no svn-id: r51639 --- configure | 68 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/configure b/configure index 81c8970922..451b55d35d 100755 --- a/configure +++ b/configure @@ -1523,9 +1523,9 @@ if test -n "$_host"; then CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks" _need_memalign=yes _backend="dc" - _build_scalers="no" - _mad="yes" - _zlib="yes" + _build_scalers=no + _mad=yes + _zlib=yes add_line_to_config_mk 'ronindir = /usr/local/ronin' _port_mk="backends/platform/dc/dreamcast.mk" ;; @@ -1543,16 +1543,16 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="ds" - _build_scalers="no" - _mt32emu="no" + _build_scalers=no + _mt32emu=no _port_mk="backends/platform/ds/ds.mk" ;; gamecube) _endian=big _need_memalign=yes _backend="wii" - _build_scalers="no" - _mt32emu="no" + _build_scalers=no + _mt32emu=no _port_mk="backends/platform/wii/wii.mk" add_line_to_config_mk 'GAMECUBE = 1' add_line_to_config_h '#define GAMECUBE' @@ -1573,9 +1573,9 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="gp2x" - _build_hq_scalers="no" - _mt32emu="no" - _vkeybd="yes" + _build_hq_scalers=no + _mt32emu=no + _vkeybd=yes _seq_midi=no _port_mk="backends/platform/gp2x/gp2x-bundle.mk" ;; @@ -1591,9 +1591,9 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="gp2xwiz" - _build_hq_scalers="no" - _mt32emu="no" - _vkeybd="yes" + _build_hq_scalers=no + _mt32emu=no + _vkeybd=yes _seq_midi=no _port_mk="backends/platform/gp2xwiz/gp2xwiz-bundle.mk" ;; @@ -1604,7 +1604,7 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1' _backend="iphone" - _build_hq_scalers="no" + _build_hq_scalers=no _seq_midi=no ;; m68k-atari-mint) @@ -1637,9 +1637,9 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="linuxmoto" - _build_hq_scalers="no" - _mt32emu="no" - _vkeybd="yes" + _build_hq_scalers=no + _mt32emu=no + _vkeybd=yes _seq_midi=no _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; @@ -1654,9 +1654,9 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="linuxmoto" - _build_hq_scalers="no" - _mt32emu="no" - _vkeybd="yes" + _build_hq_scalers=no + _mt32emu=no + _vkeybd=yes _seq_midi=no _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; @@ -1692,8 +1692,8 @@ if test -n "$_host"; then _unix=yes _need_memalign=yes _backend='null' - _build_hq_scalers="no" - _mt32emu="no" + _build_hq_scalers=no + _mt32emu=no ;; ppc-amigaos) _endian=big @@ -1704,14 +1704,14 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" _need_memalign=yes _backend="ps2" - _build_scalers="no" - _mt32emu="no" + _build_scalers=no + _mt32emu=no # HACK to enable mad & zlib (they are not properly detected due to linker issues). # This trick doesn't work for tremor right now, as the PS2 port the resulting library # libtremor, while our code later on expects it to be called libvorbisidec. # TODO: Enable tremor, e.g. by adding -ltremor or by renaming the lib. - _mad="yes" - _zlib="yes" + _mad=yes + _zlib=yes # HACK to fix compilation of C source files for now. add_line_to_config_mk 'CC = ee-gcc' # HACK to fix linking for now. It seems ee-g++ does not handle linking correctly. @@ -1731,8 +1731,8 @@ if test -n "$_host"; then psp) _need_memalign=yes _backend="psp" - _build_scalers="no" - _mt32emu="no" + _build_scalers=no + _mt32emu=no _port_mk="backends/platform/psp/psp.mk" ;; samsungtv) @@ -1747,14 +1747,14 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="samsungtv" - _mt32emu="no" - _vkeybd="yes" + _mt32emu=no + _vkeybd=yes ;; wii) _endian=big _need_memalign=yes _backend="wii" - _build_scalers="no" + _build_scalers=no _port_mk="backends/platform/wii/wii.mk" add_line_to_config_mk 'GAMECUBE = 0' add_line_to_config_h "#define DEBUG_WII_USBGECKO" @@ -1774,7 +1774,7 @@ if test -n "$_host"; then add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1' add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1' _backend="wince" - _mt32emu="no" + _mt32emu=no _port_mk="backends/platform/wince/wince.mk" ;; *) @@ -2046,9 +2046,9 @@ define_in_config_if_yes "$_build_hq_scalers" 'USE_HQ_SCALERS' if test "$_indeo3" = auto ; then # Autodetect. Build if either the gob engine or plugins are enabled if test `get_engine_build gob` = yes || test "$_dynamic_modules" = yes ; then - _indeo3="yes" + _indeo3=yes else - _indeo3="no" + _indeo3=no fi fi define_in_config_if_yes "$_indeo3" 'USE_INDEO3' -- cgit v1.2.3 From 2f4d2b58de1e4109cb454180b402708146476a8c Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:12:52 +0000 Subject: DS: Allow disabling assert via NDEBUG; cleanup svn-id: r51640 --- backends/platform/ds/arm9/source/portdefs.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index c08f994e8e..cc38d66a73 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -52,6 +52,7 @@ #define STREAM_AUDIO_FROM_DISK #endif +// FIXME: What is "NO_DEBUG_MSGS" good for? #define NO_DEBUG_MSGS // This is defined in dsmain.cpp @@ -68,16 +69,22 @@ void consolePrintf(const char *format, ...); #undef assert #endif +#ifdef NDEBUG + +#define assert(e) ((void)0) + +#else + +// FIXME: Shouldn't assert() also bail out / exit / halt the program? Right now we just +// print an error message... #define assert(s) \ do { \ - if (!(s)) \ + if (!(s)) { \ consolePrintf("Assertion failed: '##s##' at file %s, line %d\n", __FILE__, __LINE__); \ + } \ } while (0) -//#include "ds-fs.h" - -//#define debug(fmt, ...) consolePrintf(fmt, ##__VA_ARGS__) -//#define debug(fmt, ...) debug(0, fmt, ##__VA_ARGS__) +#endif // FIXME: Since I can't change the engine at the moment (post lockdown) this define can go here. // This define changes the mouse-relative motion which doesn't make sense on a touch screen to -- cgit v1.2.3 From bcfb8a030ae03b777ae2dbddfea0567509fb200f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 2 Aug 2010 17:13:09 +0000 Subject: SCI: Rewrap overlong lines; improve dialog text slightly svn-id: r51641 --- engines/sci/engine/kgraphics.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 5a6ad7e324..2b0e3b3726 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -753,8 +753,10 @@ reg_t kPortrait(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// Original top-left must stay on kControl rects, we adjust accordingly because sierra sci actually wont draw rects that -// are upside down (example: jones, when challenging jones - one button is a duplicate and also has lower-right which is 0, 0) +// Original top-left must stay on kControl rects, we adjust accordingly because +// sierra sci actually wont draw rects that are upside down (example: jones, +// when challenging jones - one button is a duplicate and also has lower-right +// which is 0, 0) Common::Rect kControlCreateRect(int16 x, int16 y, int16 x1, int16 y1) { if (x > x1) x1 = x; if (y > y1) y1 = y; @@ -916,7 +918,13 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { if (objName == "savedHeros") { // Import of QfG character files dialog is shown // display additional popup information before letting user use it - GUI::MessageDialog dialog("characters saved inside ScummVM will get shown automatically. Character files saved in the original interpreter need to get put inside ScummVM saved games directory and a prefix needs to get added depending on which game it was saved in 'qfg1-' for Quest for Glory 1, 'qfg2-' for Quest for Glory 2 e.g. 'qfg2-thief.sav'", "OK"); + GUI::MessageDialog dialog("Characters saved inside ScummVM are shown " + "automatically. Character files saved in the original " + "interpreter need to be put inside ScummVM's saved games " + "directory and a prefix needs to be added depending on which " + "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " + "for Quest for Glory 2. Example: 'qfg2-thief.sav'.", + "OK"); dialog.runModal(); } -- cgit v1.2.3 From 512fec56c7bc3095463c4eaaf4c8e84d3113b151 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 18:04:23 +0000 Subject: SCI: adding offTop = 0 for mother goose sci1.1 fixes graphics in that game svn-id: r51643 --- engines/sci/graphics/ports.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 9268888b6c..2137de39de 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -99,8 +99,15 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te offTop = 0; break; case GID_MOTHERGOOSE: - if (getSciVersion() == SCI_VERSION_1_EARLY) + // TODO: if mother goose EGA also uses offTop we can simply remove this check altogether + switch (getSciVersion()) { + case SCI_VERSION_1_EARLY: + case SCI_VERSION_1_1: offTop = 0; + break; + default: + break; + } break; case GID_FAIRYTALES: // Mixed-Up Fairy Tales (& its demo) uses -w 26 0 200 320. If we don't -- cgit v1.2.3 From 180f188b88dd7be12df5152f52f95b9b7039f012 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 18:25:48 +0000 Subject: SCI: Cleanup SCI0 late version detection After discussing with Walter, we should be able to detect SCI0 late on the presence of a SCI0 vocab.999 without checking if we're using the old decompressors. svn-id: r51644 --- engines/sci/resource.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 9d722a08c0..2fdf091314 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1907,18 +1907,18 @@ void ResourceManager::detectSciVersion() { return; } + if (hasSci0Voc999()) { + s_sciVersion = SCI_VERSION_0_LATE; + return; + } + if (oldDecompressors) { // It's either SCI_VERSION_0_LATE or SCI_VERSION_01 // We first check for SCI1 vocab.999 if (testResource(ResourceId(kResourceTypeVocab, 999))) { - if (hasSci0Voc999()) { - s_sciVersion = SCI_VERSION_0_LATE; - return; - } else { - s_sciVersion = SCI_VERSION_01; - return; - } + s_sciVersion = SCI_VERSION_01; + return; } // If vocab.999 is missing, we try vocab.900 @@ -1938,12 +1938,7 @@ void ResourceManager::detectSciVersion() { return; } - // New decompressors. It's either SCI_VERSION_0_LATE, SCI_VERSION_1_EGA or SCI_VERSION_1_EARLY. - if (testResource(ResourceId(kResourceTypeVocab, 0))) { - s_sciVersion = SCI_VERSION_0_LATE; - return; - } - + // New decompressors. It's either SCI_VERSION_1_EGA or SCI_VERSION_1_EARLY. if (hasSci1Voc900()) { s_sciVersion = SCI_VERSION_1_EGA; return; -- cgit v1.2.3 From 9c8b4655053063fcdd5311ee0e5df5a4bd19cf92 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 18:30:25 +0000 Subject: KYRA: FM-Towns audio driver rewrite - FM-Towns euphony driver completely rewritten based on KYRA FM-Towns and LOOM towns disasm. - Split all the emu and driver code from sound_towns.cpp into different files to make things a bit less confusing. - Move the driver code to common space since the exact same euphony driver is used by LOOM which means we could get rid of the outdated and incomplete ym2612 driver/emu implementation (which doesn't even do things like instrument loading, pan position, etc). I haven't tried to add this to the Scumm engine yet, since I am not familiar with it and my priority was to get the driver finished first. But from the look of disasm it shouldn't be difficult to do. - Introduce a generic FM-Towns audio interface based on FM-Towns system file disasm which was necessary for the euphony driver rewrite. Every FM-Towns game I have seen so far seems to access the audio hardware via these system functions. This interface implementation will also allow reasonably simple creation of new FM-Towns audio drivers (e.g. this could be used for Kings Quest 5 FM-Towns or others). - Move the PC98 driver to common space, too, since I have a strong feeling that this driver is also used in the PC98 version of Future Wars - This also improves KYRA FM-Towns music quality, sound effects accuracy and music fading. svn-id: r51645 --- engines/kyra/resource.h | 1 + engines/kyra/sound_intern.h | 43 +- engines/kyra/sound_towns.cpp | 4329 +------------------- engines/kyra/staticres.cpp | 2 +- sound/module.mk | 4 + sound/softsynth/fmtowns_pc98/towns_audio.cpp | 1479 +++++++ sound/softsynth/fmtowns_pc98/towns_audio.h | 162 + sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 886 ++++ sound/softsynth/fmtowns_pc98/towns_euphony.h | 178 + sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp | 1403 +++++++ sound/softsynth/fmtowns_pc98/towns_pc98_driver.h | 110 + .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 1461 +++++++ sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 171 + tools/create_kyradat/create_kyradat.cpp | 5 +- tools/create_kyradat/create_kyradat.h | 2 + tools/create_kyradat/games.cpp | 2 + tools/create_kyradat/tables.cpp | 7 + 17 files changed, 6071 insertions(+), 4174 deletions(-) create mode 100644 sound/softsynth/fmtowns_pc98/towns_audio.cpp create mode 100644 sound/softsynth/fmtowns_pc98/towns_audio.h create mode 100644 sound/softsynth/fmtowns_pc98/towns_euphony.cpp create mode 100644 sound/softsynth/fmtowns_pc98/towns_euphony.h create mode 100644 sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp create mode 100644 sound/softsynth/fmtowns_pc98/towns_pc98_driver.h create mode 100644 sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp create mode 100644 sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index 7983be9a68..d572c1ac54 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -209,6 +209,7 @@ enum KyraResources { k1CreditsStrings, + k1TownsMusicFadeTable, k1TownsSFXwdTable, k1TownsSFXbtTable, k1TownsCDATable, diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index a229dc310d..186162a700 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -31,7 +31,9 @@ #include "common/mutex.h" -#include "sound/softsynth/ym2612.h" +#include "sound/softsynth/fmtowns_pc98/towns_pc98_driver.h" +#include "sound/softsynth/fmtowns_pc98/towns_euphony.h" + #include "sound/softsynth/emumidi.h" #include "sound/midiparser.h" @@ -99,10 +101,7 @@ private: Common::Mutex _mutex; }; -class Towns_EuphonyDriver; -class TownsPC98_OpnDriver; - -class SoundTowns : public MidiDriver, public Sound { +class SoundTowns : public Sound { public: SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer); ~SoundTowns(); @@ -119,43 +118,33 @@ public: void haltTrack(); void playSoundEffect(uint8); + void stopAllSoundEffects(); void beginFadeOut(); - //MidiDriver interface implementation - int open(); - void close(); - void send(uint32 b); - void metaEvent(byte type, byte *data, uint16 length) {} - - void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { } - uint32 getBaseTempo(); - - //Channel allocation functions - MidiChannel *allocateChannel() { return 0; } - MidiChannel *getPercussionChannel() { return 0; } - - static float calculatePhaseStep(int8 semiTone, int8 semiToneRootkey, - uint32 sampleRate, uint32 outputRate, int32 pitchWheel); - private: bool loadInstruments(); void playEuphonyTrack(uint32 offset, int loop); - static void onTimer(void *data); + void fadeOutSoundEffects(); int _lastTrack; Audio::AudioStream *_currentSFX; Audio::SoundHandle _sfxHandle; + uint8 *_musicTrackData; + uint _sfxFileIndex; uint8 *_sfxFileData; + uint8 _sfxChannel; - Towns_EuphonyDriver * _driver; - MidiParser * _parser; - + TownsEuphonyDriver *_driver; + Common::Mutex _mutex; + bool _cdaPlaying; + + const uint8 *_musicFadeTable; const uint8 *_sfxBTTable; const uint8 *_sfxWDTable; }; @@ -186,7 +175,7 @@ protected: int _lastTrack; uint8 *_musicTrackData; uint8 *_sfxTrackData; - TownsPC98_OpnDriver *_driver; + TownsPC98_AudioDriver *_driver; }; class SoundTownsPC98_v2 : public Sound { @@ -218,7 +207,7 @@ protected: uint8 *_musicTrackData; uint8 *_sfxTrackData; - TownsPC98_OpnDriver *_driver; + TownsPC98_AudioDriver *_driver; }; // PC Speaker MIDI driver diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 9b17011ecf..2ed6d972c2 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -36,3889 +36,37 @@ #include "common/util.h" -#define EUPHONY_FADEOUT_TICKS 600 - -namespace Kyra { - -enum EnvelopeState { s_ready, s_attacking, s_decaying, s_sustaining, s_releasing }; - -class Towns_EuphonyChannel : public MidiChannel { -public: - Towns_EuphonyChannel() {} - virtual ~Towns_EuphonyChannel() {} - - virtual void nextTick(int32 *outbuf, int buflen) = 0; - virtual void rate(uint16 r) = 0; - -protected: - uint16 _rate; -}; - -class Towns_EuphonyFmChannel : public Towns_EuphonyChannel { -public: - Towns_EuphonyFmChannel(); - virtual ~Towns_EuphonyFmChannel(); - - void nextTick(int32 *outbuf, int buflen); - void rate(uint16 r); - - // MidiChannel interface - MidiDriver *device() { return 0; } - byte getNumber() { return 0; } - void release() { } - void send(uint32) { } - void noteOff(byte note); - void noteOn(byte note, byte onVelo); - void programChange(byte) {} - void pitchBend(int16 value); - void controlChange(byte control, byte value); - void pitchBendFactor(byte) { } - void sysEx_customInstrument(uint32 unused, const byte *instr); - -protected: - Voice2612 *_voice; -}; - -class Towns_EuphonyPcmChannel : public Towns_EuphonyChannel { -public: - void nextTick(int32 *outbuf, int buflen); - void rate(uint16 r); - - Towns_EuphonyPcmChannel(); - virtual ~Towns_EuphonyPcmChannel(); - - // MidiChannel interface - MidiDriver *device() { return 0; } - byte getNumber() { return 0; } - void release() { } - void send(uint32 b) { } - void noteOff(byte note); - void noteOn(byte note, byte onVelo); - void programChange(byte program) {} - void pitchBend(int16 value); - void controlChange(byte control, byte value); - void pitchBendFactor(byte value) { } - void sysEx_customInstrument(uint32 type, const byte *instr); - -protected: - void velocity(int velo); - void panPosition(int8 pan); - void evpNextTick(); - - int _ctrl7_volume; - int16 _velocity; - int16 _note; - int32 _frequencyOffs; - float _phase; - int8 _current; - - struct Voice { - char name[9]; - uint16 split[8]; - uint32 id[8]; - struct Snd { - char name[9]; - int32 id; - int32 numSamples; - int32 loopStart; - int32 loopLength; - int32 samplingRate; - int32 keyOffset; - int32 keyNote; - const int8 *_samples; - } *_snd[8]; - struct Env { - EnvelopeState state; - int32 currentLevel; - int32 rate; - int32 tickCount; - int32 totalLevel; - int32 attackRate; - int32 decayRate; - int32 sustainLevel; - int32 sustainRate; - int32 releaseLevel; - int32 releaseRate; - int32 rootKeyOffset; - int32 size; - } *_env[8]; - } *_voice; -}; - -class Towns_EuphonyTrackQueue { -public: - Towns_EuphonyTrackQueue(Towns_EuphonyDriver *driver, Towns_EuphonyTrackQueue *last); - ~Towns_EuphonyTrackQueue() {} - - Towns_EuphonyTrackQueue *release(); - void initDriver(); - void loadDataToCurrentPosition(uint8 *trackdata, uint32 size, bool loop = 0); - void loadDataToEndOfQueue(uint8 *trackdata, uint32 size, bool loop = 0); - void setPlayBackStatus(bool playing); - bool isPlaying() const {return _playing; } - uint8 *trackData() {return _trackData; } - - bool _loop; - Towns_EuphonyTrackQueue *_next; - -private: - uint8 *_trackData; - uint8 *_used; - uint8 *_fchan; - uint8 *_wchan; - bool _playing; - Towns_EuphonyDriver *_driver; - Towns_EuphonyTrackQueue *_last; -}; - -class Towns_EuphonyParser : public MidiParser { -public: - Towns_EuphonyParser(Towns_EuphonyTrackQueue * queue); - bool loadMusic (byte *data, uint32 size); - int32 calculateTempo(int16 val); - -protected: - void parseNextEvent (EventInfo &info); - void resetTracking(); - void setup(); - - byte *_enable; - byte *_mode; - byte *_channel; - byte *_adjVelo; - int8 *_adjNote; - - uint8 _firstBaseTickStep; - uint8 _nextBaseTickStep; - uint32 _initialTempo; - uint32 _baseTick; - - byte _tempo[3]; - Towns_EuphonyTrackQueue *_queue; -}; - -class Towns_EuphonyDriver : public MidiDriver_Emulated { -public: - Towns_EuphonyDriver(Audio::Mixer *mixer); - virtual ~Towns_EuphonyDriver(); - - int open(); - void close(); - void send(uint32 b); - void send(byte channel, uint32 b); - uint32 property(int prop, uint32 param) { return 0; } - - void setPitchBendRange(byte channel, uint range) { } - void loadFmInstruments(const byte *instr); - void loadWaveInstruments(const byte *instr); - - Towns_EuphonyTrackQueue *queue() { return _queue; } - - MidiChannel *allocateChannel() { return 0; } - MidiChannel *getPercussionChannel() { return 0; } - - void assignFmChannel(uint8 midiChannelNumber, uint8 fmChannelNumber); - void assignWaveChannel(uint8 midiChannelNumber, uint8 waveChannelNumber); - void removeChannel(uint8 midiChannelNumber); - - void setVolume(int val = -1) { if (val >= 0) _volume = val; } - int getVolume(int val = -1) { return _volume; } - - // AudioStream API - bool isStereo() const { return true; } - int getRate() const { return _mixer->getOutputRate(); } - - void fading(bool status = true); - -protected: - void nextTick(int16 *buf1, int buflen); - void rate(uint16 r); - - void generateSamples(int16 *buf, int len); - - Towns_EuphonyFmChannel *_fChannel[6]; - Towns_EuphonyPcmChannel *_wChannel[8]; - Towns_EuphonyChannel *_channel[16]; - Towns_EuphonyTrackQueue *_queue; - - int _volume; - bool _fading; - int16 _fadestate; - - uint8 *_fmInstruments; - uint8 *_waveInstruments; - int8 * _waveSounds[10]; -}; - -Towns_EuphonyFmChannel::Towns_EuphonyFmChannel() { - _voice = new Voice2612; -} - -Towns_EuphonyFmChannel::~Towns_EuphonyFmChannel() { - delete _voice; -} - -void Towns_EuphonyFmChannel::noteOn(byte note, byte onVelo) { - _voice->noteOn(note, onVelo); -} - -void Towns_EuphonyFmChannel::noteOff(byte note) { - _voice->noteOff(note); -} - -void Towns_EuphonyFmChannel::controlChange(byte control, byte value) { - if (control == 121) { - // Reset controller - delete _voice; - _voice = new Voice2612; - } else if (control == 10) { - // pan position - } else { - _voice->setControlParameter(control, value); - } -} - -void Towns_EuphonyFmChannel::sysEx_customInstrument(uint32, const byte *fmInst) { - _voice->_rate = _rate; - _voice->setInstrument(fmInst); -} - -void Towns_EuphonyFmChannel::pitchBend(int16 value) { - _voice->pitchBend(value); -} - -void Towns_EuphonyFmChannel::nextTick(int32 *outbuf, int buflen) { - _voice->nextTick((int *)outbuf, buflen); -} - -void Towns_EuphonyFmChannel::rate(uint16 r) { - _rate = r; - _voice->_rate = r; -} - -Towns_EuphonyPcmChannel::Towns_EuphonyPcmChannel() { - _voice = new Voice; - for (uint8 i = 0; i < 8; i++) { - _voice->_env[i] = new Voice::Env; - _voice->_snd[i] = 0; - } - - _ctrl7_volume = 127; - velocity(0); - _frequencyOffs = 0x2000; - _current = -1; -} - -Towns_EuphonyPcmChannel::~Towns_EuphonyPcmChannel() { - for (uint8 i = 0; i < 8; i++) { - if (_voice->_snd[i]) - delete _voice->_snd[i]; - delete _voice->_env[i]; - } - delete _voice; -} - -void Towns_EuphonyPcmChannel::noteOn(byte note, byte onVelo) { - _note = note; - velocity(onVelo); - _phase = 0; - - for (_current = 0; _current < 7; _current++) { - if (note <= _voice->split[_current]) - break; - } - - _voice->_env[_current]->state = s_attacking; - _voice->_env[_current]->currentLevel = 0; - _voice->_env[_current]->rate = _rate; - _voice->_env[_current]->tickCount = 0; -} - -void Towns_EuphonyPcmChannel::noteOff(byte note) { - if (_current == -1) - return; - if (_voice->_env[_current]->state == s_ready) - return; - - _voice->_env[_current]->state = s_releasing; - _voice->_env[_current]->releaseLevel = _voice->_env[_current]->currentLevel; - _voice->_env[_current]->tickCount = 0; -} - -void Towns_EuphonyPcmChannel::controlChange(byte control, byte value) { - switch (control) { - case 0x07: - // volume - _ctrl7_volume = value; - break; - case 0x0A: - // pan position - break; - case 0x79: - // Reset controller - for (uint8 i = 0; i < 8; i++) { - if (_voice->_snd[i]) - delete _voice->_snd[i]; - delete _voice->_env[i]; - } - delete _voice; - _voice = new Voice; - for (uint8 i = 0; i < 8; i++) { - _voice->_env[i] = new Voice::Env; - _voice->_snd[i] = 0; - } - break; - case 0x7B: - noteOff(_note); - break; - default: - break; - } -} - -void Towns_EuphonyPcmChannel::sysEx_customInstrument(uint32 type, const byte *fmInst) { - if (type == 0x80) { - for (uint8 i = 0; i < 8; i++) { - const byte * const *pos = (const byte * const *)fmInst; - for (uint8 ii = 0; ii < 10; ii++) { - if (_voice->id[i] == *(pos[ii] + 8)) { - if (!_voice->_snd[i]) - _voice->_snd[i] = new Voice::Snd; - memset(_voice->_snd[i]->name, 0, 9); - memcpy(_voice->_snd[i]->name, (const char *)pos[ii], 8); - _voice->_snd[i]->id = READ_LE_UINT32(pos[ii] + 8); - _voice->_snd[i]->numSamples = READ_LE_UINT32(pos[ii] + 12); - _voice->_snd[i]->loopStart = READ_LE_UINT32(pos[ii] + 16); - _voice->_snd[i]->loopLength = READ_LE_UINT32(pos[ii] + 20); - _voice->_snd[i]->samplingRate = READ_LE_UINT16(pos[ii] + 24); - _voice->_snd[i]->keyOffset = READ_LE_UINT16(pos[ii] + 26); - _voice->_snd[i]->keyNote = *(const uint8 *)(pos[ii] + 28); - _voice->_snd[i]->_samples = (const int8 *)(pos[ii] + 32); - } - } - } - } else { - memset(_voice->name, 0, 9); - memcpy(_voice->name, (const char *)fmInst, 8); - - for (uint8 i = 0; i < 8; i++) { - _voice->split[i] = READ_LE_UINT16(fmInst + 16 + 2 * i); - _voice->id[i] = READ_LE_UINT32(fmInst + 32 + 4 * i); - _voice->_snd[i] = 0; - _voice->_env[i]->state = s_ready; - _voice->_env[i]->currentLevel = 0; - _voice->_env[i]->totalLevel = *(fmInst + 64 + 8 * i); - _voice->_env[i]->attackRate = *(fmInst + 65 + 8 * i) * 10; - _voice->_env[i]->decayRate = *(fmInst + 66 + 8 * i) * 10; - _voice->_env[i]->sustainLevel = *(fmInst + 67 + 8 * i); - _voice->_env[i]->sustainRate = *(fmInst + 68 + 8 * i) * 20; - _voice->_env[i]->releaseRate = *(fmInst + 69 + 8 * i) * 10; - _voice->_env[i]->rootKeyOffset = *(fmInst + 70 + 8 * i); - } - } -} - -void Towns_EuphonyPcmChannel::pitchBend(int16 value) { - _frequencyOffs = value; -} - -void Towns_EuphonyPcmChannel::nextTick(int32 *outbuf, int buflen) { - if (_current == -1 || !_voice->_snd[_current] || !_voice->_env[_current]->state || !_velocity) { - velocity(0); - _current = -1; - return; - } - - float phaseStep = SoundTowns::calculatePhaseStep(_note, _voice->_snd[_current]->keyNote - - _voice->_env[_current]->rootKeyOffset, _voice->_snd[_current]->samplingRate, _rate, _frequencyOffs); - - int32 looplength = _voice->_snd[_current]->loopLength; - int32 numsamples = _voice->_snd[_current]->numSamples; - const int8 * samples = _voice->_snd[_current]->_samples; - - for (int i = 0; i < buflen; i++) { - if (looplength > 0) { - while (_phase >= numsamples) - _phase -= looplength; - } else { - if (_phase >= numsamples) { - velocity(0); - _current = -1; - break; - } - } - - int32 output; - - int32 phase0 = int32(_phase); - int32 phase1 = int32(_phase + 1); - if (phase1 >= numsamples) - phase1 -= looplength; - float weight0 = _phase - phase0; - float weight1 = phase1 - _phase; - output = int32(samples[phase0] * weight0 + samples[phase1] * weight1); - - output *= _velocity; - output <<= 1; - - evpNextTick(); - output *= _voice->_env[_current]->currentLevel; - output >>= 7; - output *= _ctrl7_volume; - output >>= 7; - - output *= 185; - output >>= 8; - outbuf[i] += output; - _phase += phaseStep; - } -} - -void Towns_EuphonyPcmChannel::evpNextTick() { - switch (_voice->_env[_current]->state) { - case s_ready: - _voice->_env[_current]->currentLevel = 0; - return; - - case s_attacking: - if (_voice->_env[_current]->attackRate == 0) - _voice->_env[_current]->currentLevel = _voice->_env[_current]->totalLevel; - else if (_voice->_env[_current]->attackRate >= 1270) - _voice->_env[_current]->currentLevel = 0; - else - _voice->_env[_current]->currentLevel = (_voice->_env[_current]->totalLevel * - _voice->_env[_current]->tickCount++ * 1000) / - (_voice->_env[_current]->attackRate * _voice->_env[_current]->rate); - - if (_voice->_env[_current]->currentLevel >= _voice->_env[_current]->totalLevel) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->totalLevel; - _voice->_env[_current]->state = s_decaying; - _voice->_env[_current]->tickCount = 0; - } - break; - - case s_decaying: - if (_voice->_env[_current]->decayRate == 0) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->sustainLevel; - } else if (_voice->_env[_current]->decayRate >= 1270) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->totalLevel; - } else { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->totalLevel; - _voice->_env[_current]->currentLevel -= ((_voice->_env[_current]->totalLevel - - _voice->_env[_current]->sustainLevel) * _voice->_env[_current]->tickCount++ * 1000) / - (_voice->_env[_current]->decayRate * _voice->_env[_current]->rate); - } - - if (_voice->_env[_current]->currentLevel <= _voice->_env[_current]->sustainLevel) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->sustainLevel; - _voice->_env[_current]->state = s_sustaining; - _voice->_env[_current]->tickCount = 0; - } - break; - - case s_sustaining: - if (_voice->_env[_current]->sustainRate == 0) { - _voice->_env[_current]->currentLevel = 0; - } else if (_voice->_env[_current]->sustainRate >= 2540) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->sustainLevel; - } else { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->sustainLevel; - _voice->_env[_current]->currentLevel -= (_voice->_env[_current]->sustainLevel * - _voice->_env[_current]->tickCount++ * 1000) / (_voice->_env[_current]->sustainRate * - _voice->_env[_current]->rate); - } - - if (_voice->_env[_current]->currentLevel <= 0) { - _voice->_env[_current]->currentLevel = 0; - _voice->_env[_current]->state = s_ready; - _voice->_env[_current]->tickCount = 0; - } - break; - - case s_releasing: - if (_voice->_env[_current]->releaseRate == 0) { - _voice->_env[_current]->currentLevel = 0; - } else if (_voice->_env[_current]->releaseRate >= 1270) { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->releaseLevel; - } else { - _voice->_env[_current]->currentLevel = _voice->_env[_current]->releaseLevel; - _voice->_env[_current]->currentLevel -= (_voice->_env[_current]->releaseLevel * - _voice->_env[_current]->tickCount++ * 1000) / (_voice->_env[_current]->releaseRate * - _voice->_env[_current]->rate); - } - - if (_voice->_env[_current]->currentLevel <= 0) { - _voice->_env[_current]->currentLevel = 0; - _voice->_env[_current]->state = s_ready; - } - break; - - default: - break; - } -} - -void Towns_EuphonyPcmChannel::rate(uint16 r) { - _rate = r; -} - -void Towns_EuphonyPcmChannel::velocity(int velo) { - _velocity = velo; -} - -Towns_EuphonyDriver::Towns_EuphonyDriver(Audio::Mixer *mixer) - : MidiDriver_Emulated(mixer) { - _volume = 255; - _fadestate = EUPHONY_FADEOUT_TICKS; - _queue = 0; - - MidiDriver_YM2612::createLookupTables(); - - for (uint8 i = 0; i < 6; i++) - _channel[i] = _fChannel[i] = new Towns_EuphonyFmChannel; - for (uint8 i = 0; i < 8; i++) - _channel[i + 6] = _wChannel[i] = new Towns_EuphonyPcmChannel; - _channel[14] = _channel[15] = 0; - - _fmInstruments = _waveInstruments = 0; - memset(_waveSounds, 0, sizeof(uint8 *)* 10); - - rate(getRate()); - fading(0); - - _queue = new Towns_EuphonyTrackQueue(this, 0); -} - -Towns_EuphonyDriver::~Towns_EuphonyDriver() { - for (int i = 0; i < 6; i++) - delete _fChannel[i]; - for (int i = 0; i < 8; i++) - delete _wChannel[i]; - - MidiDriver_YM2612::removeLookupTables(); - - delete[] _fmInstruments; - _fmInstruments = 0; - - delete[] _waveInstruments; - _waveInstruments = 0; - - for (int i = 0; i < 10; i++) { - delete[] _waveSounds[i]; - _waveSounds[i] = 0; - } - - if (_queue) { - _queue->release(); - delete _queue; - _queue = 0; - } -} - -int Towns_EuphonyDriver::open() { - if (_isOpen) - return MERR_ALREADY_OPEN; - MidiDriver_Emulated::open(); - - _mixer->playStream(Audio::Mixer::kMusicSoundType, &_mixerSoundHandle, - this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - - return 0; -} - -void Towns_EuphonyDriver::close() { - if (!_isOpen) - return; - _isOpen = false; - _mixer->stopHandle(_mixerSoundHandle); -} - -void Towns_EuphonyDriver::send(uint32 b) { - send(b & 0xF, b & 0xFFFFFFF0); -} - -void Towns_EuphonyDriver::send(byte chan, uint32 b) { - byte param2 = (byte) ((b >> 16) & 0xFF); - byte param1 = (byte) ((b >> 8) & 0xFF); - byte cmd = (byte) (b & 0xF0); - if (chan > ARRAYSIZE(_channel)) - return; - - switch (cmd) { - case 0x80:// Note Off - if (_channel[chan]) - _channel[chan]->noteOff(param1); - break; - case 0x90: // Note On - if (_channel[chan]) - _channel[chan]->noteOn(param1, param2); - break; - case 0xA0: // Aftertouch - break; // Not supported. - case 0xB0: // Control Change - if (param1 == 0x79) { - fading(0); - for (int i = 0; i < 15; i++) { - if (_channel[i]) { - _channel[i]->controlChange(param1, param2); - _channel[i]->programChange(0); - } - } - } else if (param1 == 0x7B) { - for (int i = 0; i < 15; i++) { - if (_channel[i]) - _channel[i]->controlChange(param1, param2); - } - } else { - if (_channel[chan]) - _channel[chan]->controlChange(param1, param2); - } - break; - case 0xC0: // Program Change - for (int i = 0; i < 6; i++) { - if (_channel[chan] == _fChannel[i]) { - _channel[chan]->sysEx_customInstrument(0, _fmInstruments + param1 * 0x30); - break; - } - } - for (int i = 0; i < 8; i++) { - if (_channel[chan] == _wChannel[i]) { - _channel[chan]->sysEx_customInstrument(0, _waveInstruments + param1 * 0x80); - _channel[chan]->sysEx_customInstrument(0x80, (const byte *)_waveSounds); - break; - } - } - break; - case 0xD0: // Channel Pressure - break; // Not supported. - case 0xE0: // Pitch Bend - if (_channel[chan]) - _channel[chan]->pitchBend((param1 | (param2 << 7)) - 0x2000); - break; - default: - warning("Towns_EuphonyDriver: Unknown send() command 0x%02X", cmd); - } -} - -void Towns_EuphonyDriver::loadFmInstruments(const byte *instr) { - delete[] _fmInstruments; - _fmInstruments = new uint8[0x1800]; - memcpy(_fmInstruments, instr, 0x1800); -} - -void Towns_EuphonyDriver::loadWaveInstruments(const byte *instr) { - delete[] _waveInstruments; - _waveInstruments = new uint8[0x1000]; - memcpy(_waveInstruments, instr, 0x1000); - - const uint8 *pos = (const uint8 *)(instr + 0x1000); - - for (uint8 i = 0; i < 10; i++) { - delete[] _waveSounds[i]; - uint32 numsamples = READ_LE_UINT32(pos + 0x0C); - _waveSounds[i] = new int8[numsamples + 0x20]; - memcpy(_waveSounds[i], pos, 0x20); - pos += 0x20; - for (uint32 ii = 0; ii < numsamples; ii++) { - uint8 s = *(pos + ii); - s = (s < 0x80) ? 0x80 - s : s; - _waveSounds[i][ii + 0x20] = s ^ 0x80; - } - pos += numsamples; - } -} - - -void Towns_EuphonyDriver::assignFmChannel(uint8 midiChannelNumber, uint8 fmChannelNumber) { - _channel[midiChannelNumber] = _fChannel[fmChannelNumber]; -} - -void Towns_EuphonyDriver::assignWaveChannel(uint8 midiChannelNumber, uint8 waveChannelNumber) { - _channel[midiChannelNumber] = _wChannel[waveChannelNumber]; -} - -void Towns_EuphonyDriver::removeChannel(uint8 midiChannelNumber) { - _channel[midiChannelNumber] = 0; -} - -void Towns_EuphonyDriver::generateSamples(int16 *data, int len) { - memset(data, 0, 2 * sizeof(int16) * len); - nextTick(data, len); -} - -void Towns_EuphonyDriver::nextTick(int16 *buf1, int buflen) { - int32 *buf0 = (int32 *)buf1; - - for (int i = 0; i < ARRAYSIZE(_channel); i++) { - if (_channel[i]) - _channel[i]->nextTick(buf0, buflen); - } - - for (int i = 0; i < buflen; ++i) { - int s = int( float(buf0[i] * _volume) * float((float)_fadestate / EUPHONY_FADEOUT_TICKS) ); - buf1[i*2] = buf1[i*2+1] = (s >> 9) & 0xffff; - } - - if (_fading) { - if (_fadestate) { - _fadestate--; - } else { - _fading = false; - _queue->setPlayBackStatus(false); - } - } -} - -void Towns_EuphonyDriver::rate(uint16 r) { - for (uint8 i = 0; i < 16; i++) { - if (_channel[i]) - _channel[i]->rate(r); - } -} - -void Towns_EuphonyDriver::fading(bool status) { - _fading = status; - if (!_fading) - _fadestate = EUPHONY_FADEOUT_TICKS; -} - -Towns_EuphonyParser::Towns_EuphonyParser(Towns_EuphonyTrackQueue * queue) : MidiParser(), - _firstBaseTickStep(0x33), _nextBaseTickStep(0x33) { - _initialTempo = calculateTempo(0x5a); - _queue = queue; -} - -void Towns_EuphonyParser::parseNextEvent(EventInfo &info) { - byte *pos = _position._play_pos; - - if (_queue->_next) { - if (info.ext.type == 0x2F) { - unloadMusic(); - memset(&info, 0, sizeof(EventInfo)); - pos = _position._play_pos = _tracks[0] = _queue->trackData() + 0x806; - } else if (_active_track == 255) { - _queue = _queue->_next; - setup(); - setTrack(0); - _queue->setPlayBackStatus(true); - return; - } else if (!_queue->isPlaying()) { - unloadMusic(); - _queue = _queue->_next; - setup(); - setTrack(0); - _queue->setPlayBackStatus(true); - return; - } - } - - bool loop = true; - while (loop) { - byte cmd = *pos; - byte evt = (cmd & 0xF0); - - if (evt == 0x90) { - byte chan = pos[1]; - - if (_enable[chan]) { - uint16 tick = (pos[2] | ((uint16) pos[3] << 7)) + _baseTick; - info.start = pos + 6; - uint32 last = _position._last_event_tick; - info.delta = (tick < last) ? 0 : (tick - last); - - info.event = 0x90 | _channel[chan]; - info.length = pos[7] | (pos[8] << 4) | (pos[9] << 8) | (pos[10] << 12); - - int8 note = (int8) pos[4]; - if (_adjNote[chan]) { - note = (note & 0x7f) & _adjNote[chan]; - if (note > 0x7c) - note -= 0x0c; - else if (note < 0) - note += 0x0c; - } - info.basic.param1 = (byte) note; - - uint8 onVelo = (pos[5] & 0x7f) + _adjVelo[chan]; - if (onVelo > 0x7f) - onVelo = 0x7f; - if (onVelo < 1) - onVelo = 1; - info.basic.param2 = onVelo; - - pos += 12; - loop = false; - } else { - pos += 6; - } - } else if (evt == 0xB0 || evt == 0xC0 || evt == 0xe0) { - byte chan = pos[1]; - - if (_enable[chan]) { - info.start = pos; - uint16 tick = (pos[2] | ((uint16) pos[3] << 7)) + _baseTick; - uint32 last = _position._last_event_tick; - info.delta = (tick < last) ? 0 : (tick - last); - info.event = evt | _channel[chan]; - info.length = 0; - info.basic.param1 = pos[4]; - info.basic.param2 = pos[5]; - pos += 6; - loop = false; - } else { - pos += 6; - } - } else if (cmd == 0xF2) { - static const uint16 tickTable[] = { 0x180, 0xC0, 0x80, 0x60, 0x40, 0x30, 0x20, 0x18 }; - _baseTick += tickTable[_nextBaseTickStep >> 4] * ((_nextBaseTickStep & 0x0f) + 1); - _nextBaseTickStep = pos[1]; - pos += 6; - } else if (cmd == 0xF8) { - int32 tempo = calculateTempo(pos[4] | (pos[5] << 7)); - info.event = 0xff; - info.length = 3; - info.ext.type = 0x51; - _tempo[0] = (tempo >> 16) & 0xff; - _tempo[1] = (tempo >> 8) & 0xff; - _tempo[2] = tempo & 0xff; - info.ext.data = (byte *)_tempo; - pos += 6; - loop = false; - } else if (cmd == 0xFD || cmd == 0xFE) { - // End of track. - if (_autoLoop) { - unloadMusic(); - _queue->setPlayBackStatus(true); - pos = info.start = _tracks[0]; - } else { - info.start = pos; - } - - uint32 last = _position._last_event_tick; - uint16 tick = (pos[2] | ((uint16) pos[3] << 7)) + _baseTick; - info.delta = (tick < last) ? 0 : (tick - last); - info.event = 0xFF; - info.ext.type = 0x2F; - info.ext.data = pos; - loop = false; - } else { - warning("Unknown Euphony music event 0x%02X", (int)cmd); - memset(&info, 0, sizeof(info)); - pos = 0; - loop = false; - } - } - _position._play_pos = pos; -} - -bool Towns_EuphonyParser::loadMusic(byte *data, uint32 size) { - bool loop = _autoLoop; - - if (_queue->isPlaying() && !_queue->_loop) { - _queue->loadDataToEndOfQueue(data, size, loop); - } else { - unloadMusic(); - _queue = _queue->release(); - _queue->loadDataToCurrentPosition(data, size, loop); - setup(); - setTrack(0); - _queue->setPlayBackStatus(true); - } - return true; -} - -int32 Towns_EuphonyParser::calculateTempo(int16 val) { - int32 tempo = val; - - if (tempo < 0) - tempo = 0; - if (tempo > 0x1F4) - tempo = 0x1F4; - - tempo = 0x4C4B4 / (tempo + 0x1E); - while (tempo < 0x451) - tempo <<= 1; - tempo <<= 8; - - return tempo; -} - -void Towns_EuphonyParser::resetTracking() { - MidiParser::resetTracking(); - - _nextBaseTickStep = _firstBaseTickStep; - _baseTick = 0; - setTempo(_initialTempo); - _queue->setPlayBackStatus(false); -} - -void Towns_EuphonyParser::setup() { - uint8 *data = _queue->trackData(); - if (!data) - return; - _queue->initDriver(); - - _enable = data + 0x354; - _mode = data + 0x374; - _channel = data + 0x394; - _adjVelo = data + 0x3B4; - _adjNote = (int8 *)data + 0x3D4; - - _nextBaseTickStep = _firstBaseTickStep = data[0x804]; - _initialTempo = calculateTempo((data[0x805] > 0xfc) ? 0x5a : data[0x805]); - - property(MidiParser::mpAutoLoop, _queue->_loop); - - _num_tracks = 1; - _ppqn = 120; - _tracks[0] = data + 0x806; -} - -Towns_EuphonyTrackQueue::Towns_EuphonyTrackQueue(Towns_EuphonyDriver * driver, Towns_EuphonyTrackQueue * last) { - _trackData = 0; - _next = 0; - _driver = driver; - _last = last; - _used = _fchan = _wchan = 0; - _playing = _loop = false; -} - -void Towns_EuphonyTrackQueue::setPlayBackStatus(bool playing) { - Towns_EuphonyTrackQueue *i = this; - do { - i->_playing = playing; - i = i->_next; - } while (i); -} - -void Towns_EuphonyTrackQueue::loadDataToCurrentPosition(uint8 * trackdata, uint32 size, bool loop) { - delete[] _trackData; - _trackData = new uint8[0xC58A]; - memset(_trackData, 0, 0xC58A); - Screen::decodeFrame4(trackdata, _trackData, size); - - _used = _trackData + 0x374; - _fchan = _trackData + 0x6d4; - _wchan = _trackData + 0x6dA; - _loop = loop; - _playing = false; -} - -void Towns_EuphonyTrackQueue::loadDataToEndOfQueue(uint8 * trackdata, uint32 size, bool loop) { - if (!_trackData) { - loadDataToCurrentPosition(trackdata, size, loop); - return; - } - - Towns_EuphonyTrackQueue *i = this; - while (i->_next) - i = i->_next; - - i = i->_next = new Towns_EuphonyTrackQueue(_driver, i); - i->_trackData = new uint8[0xC58A]; - memset(i->_trackData, 0, 0xC58A); - Screen::decodeFrame4(trackdata, i->_trackData, size); - - i->_used = i->_trackData + 0x374; - i->_fchan = i->_trackData + 0x6d4; - i->_wchan = i->_trackData + 0x6dA; - i->_loop = loop; - i->_playing = _playing; -} - -Towns_EuphonyTrackQueue *Towns_EuphonyTrackQueue::release() { - Towns_EuphonyTrackQueue *i = this; - while (i->_next) - i = i->_next; - - Towns_EuphonyTrackQueue *res = i; - - while (i) { - i->_playing = false; - i->_used = i->_fchan = i->_wchan = 0; - delete[] i->_trackData; - i->_trackData = 0; - i = i->_last; - if (i) { - res = i; - delete i->_next; - i->_next = 0; - } - } - - delete[] res->_trackData; - res->_trackData = 0; - - return res; -} - -void Towns_EuphonyTrackQueue::initDriver() { - for (uint8 i = 0; i < 6; i++) { - if (_used[_fchan[i]]) - _driver->assignFmChannel(_fchan[i], i); - } - - for (uint8 i = 0; i < 8; i++) { - if (_used[_wchan[i]]) - _driver->assignWaveChannel(_wchan[i], i); - } - - for (uint8 i = 0; i < 16; i++) { - if (!_used[i]) - _driver->removeChannel(i); - } - _driver->send(0x79B0); -} - -class TownsPC98_OpnOperator { -public: - TownsPC98_OpnOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); - ~TownsPC98_OpnOperator() {} - - void keyOn(); - void keyOff(); - void frequency(int freq); - void updatePhaseIncrement(); - void recalculateRates(); - void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); - - void feedbackLevel(int32 level) {_feedbackLevel = level ? level + 6 : 0; } - void detune(int value) { _detn = &_detnTbl[value << 5]; } - void multiple(uint32 value) { _multiple = value ? (value << 1) : 1; } - void attackRate(uint32 value) { _specifiedAttackRate = value; } - bool scaleRate(uint8 value); - void decayRate(uint32 value) { _specifiedDecayRate = value; recalculateRates(); } - void sustainRate(uint32 value) { _specifiedSustainRate = value; recalculateRates(); } - void sustainLevel(uint32 value) { _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; } - void releaseRate(uint32 value) { _specifiedReleaseRate = value; recalculateRates(); } - void totalLevel(uint32 value) { _totalLevel = value << 3; } - void reset(); - -protected: - EnvelopeState _state; - bool _playing; - uint32 _feedbackLevel; - uint32 _multiple; - uint32 _totalLevel; - uint8 _keyScale1; - uint8 _keyScale2; - uint32 _specifiedAttackRate; - uint32 _specifiedDecayRate; - uint32 _specifiedSustainRate; - uint32 _specifiedReleaseRate; - uint32 _tickCount; - uint32 _sustainLevel; - - uint32 _frequency; - uint8 _kcode; - uint32 _phase; - uint32 _phaseIncrement; - const int32 *_detn; - - const uint8 *_rateTbl; - const uint8 *_rshiftTbl; - const uint8 *_adTbl; - const uint32 *_fTbl; - const uint32 *_sinTbl; - const int32 *_tLvlTbl; - const int32 *_detnTbl; - - const uint32 _tickLength; - uint32 _timer; - int32 _currentLevel; - - struct EvpState { - uint8 rate; - uint8 shift; - } fs_a, fs_d, fs_s, fs_r; -}; - -TownsPC98_OpnOperator::TownsPC98_OpnOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : - _rateTbl(rateTable), _rshiftTbl(shiftTable), _adTbl(attackDecayTable), _fTbl(frqTable), - _sinTbl(sineTable), _tLvlTbl(tlevelOut), _detnTbl(detuneTable), _tickLength(timerbase * 2), - _specifiedAttackRate(0), _specifiedDecayRate(0), _specifiedReleaseRate(0), _specifiedSustainRate(0), - _phase(0), _state(s_ready), _playing(false), _timer(0), _keyScale1(0), _keyScale2(0), _currentLevel(1023), - _tickCount(0) { - - fs_a.rate = fs_a.shift = fs_d.rate = fs_d.shift = fs_s.rate = fs_s.shift = fs_r.rate = fs_r.shift = 0; - - reset(); -} - -void TownsPC98_OpnOperator::keyOn() { - if (_playing) - return; - - _playing = true; - _state = s_attacking; - _phase = 0; -} - -void TownsPC98_OpnOperator::keyOff() { - if (!_playing) - return; - - _playing = false; - if (_state != s_ready) - _state = s_releasing; -} - -void TownsPC98_OpnOperator::frequency(int freq) { - uint8 block = (freq >> 11); - uint16 pos = (freq & 0x7ff); - uint8 c = pos >> 7; - - _kcode = (block << 2) | ((c < 7) ? 0 : ((c > 8) ? 3 : c - 6 )); - _frequency = _fTbl[pos << 1] >> (7 - block); -} - -void TownsPC98_OpnOperator::updatePhaseIncrement() { - _phaseIncrement = ((_frequency + _detn[_kcode]) * _multiple) >> 1; - uint8 keyscale = _kcode >> _keyScale1; - if (_keyScale2 != keyscale) { - _keyScale2 = keyscale; - recalculateRates(); - } -} - -void TownsPC98_OpnOperator::recalculateRates() { - int k = _keyScale2; - int r = _specifiedAttackRate ? (_specifiedAttackRate << 1) + 0x20 : 0; - fs_a.rate = ((r + k) < 94) ? _rateTbl[r + k] : 136; - fs_a.shift = ((r + k) < 94) ? _rshiftTbl[r + k] : 0; - - r = _specifiedDecayRate ? (_specifiedDecayRate << 1) + 0x20 : 0; - fs_d.rate = _rateTbl[r + k]; - fs_d.shift = _rshiftTbl[r + k]; - - r = _specifiedSustainRate ? (_specifiedSustainRate << 1) + 0x20 : 0; - fs_s.rate = _rateTbl[r + k]; - fs_s.shift = _rshiftTbl[r + k]; - - r = (_specifiedReleaseRate << 2) + 0x22; - fs_r.rate = _rateTbl[r + k]; - fs_r.shift = _rshiftTbl[r + k]; -} - -void TownsPC98_OpnOperator::generateOutput(int32 phasebuf, int32 *feed, int32 &out) { - if (_state == s_ready) - return; - - _timer += _tickLength; - while (_timer > 0x5B8D80) { - _timer -= 0x5B8D80; - ++_tickCount; - - int32 levelIncrement = 0; - uint32 targetTime = 0; - int32 targetLevel = 0; - EnvelopeState nextState = s_ready; - - switch (_state) { - case s_ready: - return; - case s_attacking: - targetLevel = 0; - nextState = s_decaying; - if ((_specifiedAttackRate << 1) + _keyScale2 < 64) { - targetTime = (1 << fs_a.shift) - 1; - levelIncrement = (~_currentLevel * _adTbl[fs_a.rate + ((_tickCount >> fs_a.shift) & 7)]) >> 4; - break; - } else { - _currentLevel = targetLevel; - _state = nextState; - } - // Fall through - case s_decaying: - targetTime = (1 << fs_d.shift) - 1; - nextState = s_sustaining; - targetLevel = _sustainLevel; - levelIncrement = _adTbl[fs_d.rate + ((_tickCount >> fs_d.shift) & 7)]; - break; - case s_sustaining: - targetTime = (1 << fs_s.shift) - 1; - nextState = s_sustaining; - targetLevel = 1023; - levelIncrement = _adTbl[fs_s.rate + ((_tickCount >> fs_s.shift) & 7)]; - break; - case s_releasing: - targetTime = (1 << fs_r.shift) - 1; - nextState = s_ready; - targetLevel = 1023; - levelIncrement = _adTbl[fs_r.rate + ((_tickCount >> fs_r.shift) & 7)]; - break; - } - - if (!(_tickCount & targetTime)) { - _currentLevel += levelIncrement; - if ((_state == s_attacking && _currentLevel <= targetLevel) || (_state != s_attacking && _currentLevel >= targetLevel)) { - if (_state != s_decaying) - _currentLevel = targetLevel; - _state = nextState; - } - } - } - - uint32 lvlout = _totalLevel + (uint32) _currentLevel; - - - int32 outp = 0; - int32 *i = &outp, *o = &outp; - int phaseShift = 0; - - if (feed) { - o = &feed[0]; - i = &feed[1]; - phaseShift = _feedbackLevel ? ((*o + *i) << _feedbackLevel) : 0; - *o = *i; - } else { - phaseShift = phasebuf << 15; - } - - if (lvlout < 832) { - uint32 index = (lvlout << 3) + _sinTbl[(((int32)((_phase & 0xffff0000) - + phaseShift)) >> 16) & 0x3ff]; - *i = ((index < 6656) ? _tLvlTbl[index] : 0); - } else { - *i = 0; - } - - _phase += _phaseIncrement; - out += *o; -} - -void TownsPC98_OpnOperator::reset(){ - keyOff(); - _timer = 0; - _keyScale2 = 0; - _currentLevel = 1023; - - frequency(0); - detune(0); - scaleRate(0); - multiple(0); - updatePhaseIncrement(); - attackRate(0); - decayRate(0); - releaseRate(0); - sustainRate(0); - feedbackLevel(0); - totalLevel(127); -} - -bool TownsPC98_OpnOperator::scaleRate(uint8 value) { - value = 3 - value; - if (_keyScale1 != value) { - _keyScale1 = value; - return true; - } - - int k = _keyScale2; - int r = _specifiedAttackRate ? (_specifiedAttackRate << 1) + 0x20 : 0; - fs_a.rate = ((r + k) < 94) ? _rateTbl[r + k] : 136; - fs_a.shift = ((r + k) < 94) ? _rshiftTbl[r + k] : 0; - return false; -} - -class TownsPC98_OpnDriver; -class TownsPC98_OpnChannel { -public: - TownsPC98_OpnChannel(TownsPC98_OpnDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, - uint8 key, uint8 prt, uint8 id); - virtual ~TownsPC98_OpnChannel(); - virtual void init(); - - typedef enum channelState { - CHS_RECALCFREQ = 0x01, - CHS_KEYOFF = 0x02, - CHS_SSGOFF = 0x04, - CHS_VBROFF = 0x08, - CHS_ALLOFF = 0x0f, - CHS_PROTECT = 0x40, - CHS_EOT = 0x80 - } ChannelState; - - virtual void loadData(uint8 *data); - virtual void processEvents(); - virtual void processFrequency(); - virtual bool processControlEvent(uint8 cmd); - - virtual void keyOn(); - void keyOff(); - - void setOutputLevel(); - virtual void fadeStep(); - virtual void reset(); - - const uint8 _idFlag; - -protected: - void setupVibrato(); - bool processVibrato(); - - bool control_dummy(uint8 para); - bool control_f0_setPatch(uint8 para); - bool control_f1_presetOutputLevel(uint8 para); - bool control_f2_setKeyOffTime(uint8 para); - bool control_f3_setFreqLSB(uint8 para); - bool control_f4_setOutputLevel(uint8 para); - bool control_f5_setTempo(uint8 para); - bool control_f6_repeatSection(uint8 para); - bool control_f7_setupVibrato(uint8 para); - bool control_f8_toggleVibrato(uint8 para); - bool control_fa_writeReg(uint8 para); - virtual bool control_fb_incOutLevel(uint8 para); - virtual bool control_fc_decOutLevel(uint8 para); - bool control_fd_jump(uint8 para); - virtual bool control_ff_endOfTrack(uint8 para); - - uint8 _ticksLeft; - uint8 _algorithm; - uint8 _instr; - uint8 _totalLevel; - uint8 _frqBlockMSB; - int8 _frqLSB; - uint8 _keyOffTime; - bool _hold; - uint8 *_dataPtr; - uint8 _vbrInitDelayHi; - uint8 _vbrInitDelayLo; - int16 _vbrModInitVal; - uint8 _vbrDuration; - uint8 _vbrCurDelay; - int16 _vbrModCurVal; - uint8 _vbrDurLeft; - uint16 _frequency; - uint8 _block; - uint8 _regOffset; - uint8 _flags; - uint8 _ssgTl; - uint8 _ssgStep; - uint8 _ssgTicksLeft; - uint8 _ssgTargetLvl; - uint8 _ssgStartLvl; - - const uint8 _chanNum; - const uint8 _keyNum; - const uint8 _part; - - TownsPC98_OpnDriver *_drv; - - typedef bool (TownsPC98_OpnChannel::*ControlEventFunc)(uint8 para); - const ControlEventFunc *controlEvents; -}; - -class TownsPC98_OpnChannelSSG : public TownsPC98_OpnChannel { -public: - TownsPC98_OpnChannelSSG(TownsPC98_OpnDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); - virtual ~TownsPC98_OpnChannelSSG() {} - void init(); - - virtual void loadData(uint8 *data); - void processEvents(); - void processFrequency(); - bool processControlEvent(uint8 cmd); - - void keyOn(); - void nextShape(); - - void protect(); - void restore(); - virtual void reset(); - - void fadeStep(); - -protected: - void setOutputLevel(uint8 lvl); - - bool control_f0_setPatch(uint8 para); - bool control_f1_setTotalLevel(uint8 para); - bool control_f4_setAlgorithm(uint8 para); - bool control_f9_loadCustomPatch(uint8 para); - bool control_fb_incOutLevel(uint8 para); - bool control_fc_decOutLevel(uint8 para); - bool control_ff_endOfTrack(uint8 para); - - typedef bool (TownsPC98_OpnChannelSSG::*ControlEventFunc)(uint8 para); - const ControlEventFunc *controlEvents; -}; - -class TownsPC98_OpnSfxChannel : public TownsPC98_OpnChannelSSG { -public: - TownsPC98_OpnSfxChannel(TownsPC98_OpnDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : - TownsPC98_OpnChannelSSG(driver, regOffs, flgs, num, key, prt, id) {} - ~TownsPC98_OpnSfxChannel() {} - - void loadData(uint8 *data); - void reset(); -}; - -class TownsPC98_OpnChannelPCM : public TownsPC98_OpnChannel { -public: - TownsPC98_OpnChannelPCM(TownsPC98_OpnDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); - ~TownsPC98_OpnChannelPCM() {} - void init(); - - void loadData(uint8 *data); - void processEvents(); - bool processControlEvent(uint8 cmd); - -private: - bool control_f1_prcStart(uint8 para); - bool control_ff_endOfTrack(uint8 para); - - typedef bool (TownsPC98_OpnChannelPCM::*ControlEventFunc)(uint8 para); - const ControlEventFunc *controlEvents; -}; - -class TownsPC98_OpnSquareSineSource { -public: - TownsPC98_OpnSquareSineSource(const uint32 timerbase); - ~TownsPC98_OpnSquareSineSource(); - - void init(const int *rsTable, const int *rseTable); - void reset(); - void writeReg(uint8 address, uint8 value, bool force = false); - - void nextTick(int32 *buffer, uint32 bufferSize); - - void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } - void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } - - uint8 chanEnable() const { return _chanEnable; } -private: - void updateRegs(); - - uint8 _updateRequestBuf[64]; - int _updateRequest; - int _rand; - - int8 _evpTimer; - uint32 _pReslt; - uint8 _attack; - - bool _evpUpdate, _cont; - - int _evpUpdateCnt; - uint8 _outN; - int _nTick; - - int32 *_tlTable; - int32 *_tleTable; - - const uint32 _tickLength; - uint32 _timer; - - struct Channel { - int tick; - uint8 smp; - uint8 out; - - uint8 frqL; - uint8 frqH; - uint8 vol; - } _channels[3]; - - uint8 _noiseGenerator; - uint8 _chanEnable; - - uint8 **_reg; - - uint16 _volumeA; - uint16 _volumeB; - int _volMaskA; - int _volMaskB; - - bool _ready; -}; - -class TownsPC98_OpnPercussionSource { -public: - TownsPC98_OpnPercussionSource(const uint32 timerbase); - ~TownsPC98_OpnPercussionSource() { delete[] _reg; } - - void init(const uint8 *instrData = 0); - void reset(); - void writeReg(uint8 address, uint8 value); - - void nextTick(int32 *buffer, uint32 bufferSize); - - void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } - void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } - -private: - struct RhtChannel { - const uint8 *data; - - const uint8 *start; - const uint8 *end; - const uint8 *pos; - uint32 size; - bool active; - uint8 level; - - int8 decState; - uint8 decStep; - - int16 samples[2]; - int out; - - uint8 startPosH; - uint8 startPosL; - uint8 endPosH; - uint8 endPosL; - }; - - void recalcOuput(RhtChannel *ins); - void advanceInput(RhtChannel *ins); - - RhtChannel _rhChan[6]; - - uint8 _totalLevel; - - const uint32 _tickLength; - uint32 _timer; - - uint8 **_reg; - - uint16 _volumeA; - uint16 _volumeB; - int _volMaskA; - int _volMaskB; - - bool _ready; -}; - -class TownsPC98_OpnCore : public Audio::AudioStream { -public: - enum OpnType { - OD_TOWNS, - OD_TYPE26, - OD_TYPE86 - }; - - TownsPC98_OpnCore(Audio::Mixer *mixer, OpnType type); - virtual ~TownsPC98_OpnCore(); - - virtual bool init(); - virtual void reset(); - - void writeReg(uint8 part, uint8 regAddress, uint8 value); - - // AudioStream interface - int readBuffer(int16 *buffer, const int numSamples); - bool isStereo() const { return true; } - bool endOfData() const { return false; } - int getRate() const { return _mixer->getOutputRate(); } - -protected: - void toggleRegProtection(bool prot) { _regProtectionFlag = prot; } - uint8 readSSGStatus() { return _ssg->chanEnable(); } - - virtual void timerCallbackA() = 0; - virtual void timerCallbackB() = 0; - - // The audio driver can store and apply two different audio settings - // (usually for music and sound effects). The channel mask will determine - // which channels get effected by the setting. The first bits will be - // the normal opn channels, the next bits the ssg channels and the final - // bit the rhythm channel. - void setVolumeIntern(int volA, int volB); - void setVolumeChannelMasks(int channelMaskA, int channelMaskB); - - const int _numChan; - const int _numSSG; - const bool _hasPercussion; - - Common::Mutex _mutex; -private: - void generateTables(); - void nextTick(int32 *buffer, uint32 bufferSize); - void generateOutput(int32 &leftSample, int32 &rightSample, int32 *del, int32 *feed); - - struct ChanInternal { - ChanInternal() { - memset(this, 0, sizeof(ChanInternal)); - } - - ~ChanInternal() { - for (uint i = 0; i < ARRAYSIZE(opr); ++i) - delete opr[i]; - } - - uint16 frqTemp; - bool enableLeft; - bool enableRight; - bool updateEnvelopeParameters; - int32 feedbuf[3]; - uint8 algorithm; - TownsPC98_OpnOperator *opr[4]; - }; - - TownsPC98_OpnSquareSineSource *_ssg; - TownsPC98_OpnPercussionSource *_prc; - ChanInternal *_chanInternal; - - uint8 *_oprRates; - uint8 *_oprRateshift; - uint8 *_oprAttackDecay; - uint32 *_oprFrq; - uint32 *_oprSinTbl; - int32 *_oprLevelOut; - int32 *_oprDetune; - - bool _regProtectionFlag; - - typedef void (TownsPC98_OpnCore::*OpnTimerProc)(); - - struct OpnTimer { - bool enabled; - uint16 value; - - int32 smpTillCb; - uint32 smpTillCbRem; - int32 smpPerCb; - uint32 smpPerCbRem; - - OpnTimerProc cb; - }; - - OpnTimer _timers[2]; - - int _volMaskA, _volMaskB; - uint16 _volumeA, _volumeB; - - const float _baserate; - uint32 _timerbase; - - Audio::Mixer *_mixer; - Audio::SoundHandle _soundHandle; - - static const uint8 _percussionData[]; - static const uint32 _adtStat[]; - static const uint8 _detSrc[]; - static const int _ssgTables[]; - - bool _ready; -}; - -class TownsPC98_OpnDriver : public TownsPC98_OpnCore { -friend class TownsPC98_OpnChannel; -friend class TownsPC98_OpnChannelSSG; -friend class TownsPC98_OpnSfxChannel; -friend class TownsPC98_OpnChannelPCM; -public: - TownsPC98_OpnDriver(Audio::Mixer *mixer, OpnType type); - ~TownsPC98_OpnDriver(); - - void loadMusicData(uint8 *data, bool loadPaused = false); - void loadSoundEffectData(uint8 *data, uint8 trackNum); - bool init(); - void reset(); - - void fadeStep(); - - void pause() { _musicPlaying = false; } - void cont() { _musicPlaying = true; } - - void timerCallbackB(); - void timerCallbackA(); - - bool looping() { return _looping == _updateChannelsFlag ? true : false; } - bool musicPlaying() { return _musicPlaying; } - - void setMusicVolume(int volume) { _musicVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } - void setSoundEffectVolume(int volume) { _sfxVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } - -protected: - void startSoundEffect(); - - void setMusicTempo(uint8 tempo); - void setSfxTempo(uint16 tempo); - - TownsPC98_OpnChannel **_channels; - TownsPC98_OpnChannelSSG **_ssgChannels; - TownsPC98_OpnSfxChannel **_sfxChannels; - TownsPC98_OpnChannelPCM *_rhythmChannel; - - const uint8 *_opnCarrier; - const uint8 *_opnFreqTable; - const uint8 *_opnFreqTableSSG; - const uint8 *_opnFxCmdLen; - const uint8 *_opnLvlPresets; - - uint8 *_musicBuffer; - uint8 *_sfxBuffer; - uint8 *_trackPtr; - uint8 *_patches; - uint8 *_ssgPatches; - - uint8 _updateChannelsFlag; - uint8 _updateSSGFlag; - uint8 _updateRhythmFlag; - uint8 _updateSfxFlag; - uint8 _finishedChannelsFlag; - uint8 _finishedSSGFlag; - uint8 _finishedRhythmFlag; - uint8 _finishedSfxFlag; - - bool _musicPlaying; - bool _sfxPlaying; - uint8 _fading; - uint8 _looping; - uint32 _musicTickCounter; - - int _sfxOffs; - uint8 *_sfxData; - uint16 _sfxOffsets[2]; - - uint16 _musicVolume; - uint16 _sfxVolume; - - static const uint8 _drvTables[]; - - bool _ready; -}; - -TownsPC98_OpnChannel::TownsPC98_OpnChannel(TownsPC98_OpnDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, - uint8 key, uint8 prt, uint8 id) : _drv(driver), _regOffset(regOffs), _flags(flgs), _chanNum(num), _keyNum(key), - _part(prt), _idFlag(id), controlEvents(0) { - - _ticksLeft = _algorithm = _instr = _totalLevel = _frqBlockMSB = _keyOffTime = 0; - _ssgStartLvl = _ssgTl = _ssgStep = _ssgTicksLeft = _ssgTargetLvl = _block = 0; - _vbrInitDelayHi = _vbrInitDelayLo = _vbrDuration = _vbrCurDelay = _vbrDurLeft = 0; - _frqLSB = 0; - _hold = false; - _dataPtr = 0; - _vbrModInitVal = _vbrModCurVal = 0; - _frequency = 0; -} - -TownsPC98_OpnChannel::~TownsPC98_OpnChannel() { -} - -void TownsPC98_OpnChannel::init() { - #define Control(x) &TownsPC98_OpnChannel::control_##x - static const ControlEventFunc ctrlEvents[] = { - Control(f0_setPatch), - Control(f1_presetOutputLevel), - Control(f2_setKeyOffTime), - Control(f3_setFreqLSB), - Control(f4_setOutputLevel), - Control(f5_setTempo), - Control(f6_repeatSection), - Control(f7_setupVibrato), - Control(f8_toggleVibrato), - Control(dummy), - Control(fa_writeReg), - Control(fb_incOutLevel), - Control(fc_decOutLevel), - Control(fd_jump), - Control(dummy), - Control(ff_endOfTrack) - }; - #undef Control - - controlEvents = ctrlEvents; -} - -void TownsPC98_OpnChannel::keyOff() { - // all operators off - uint8 value = _keyNum & 0x0f; - if (_part) - value |= 4; - uint8 regAddress = 0x28; - _drv->writeReg(0, regAddress, value); - _flags |= CHS_KEYOFF; -} - -void TownsPC98_OpnChannel::keyOn() { - // all operators on - uint8 value = _keyNum | 0xf0; - if (_part) - value |= 4; - uint8 regAddress = 0x28; - _drv->writeReg(0, regAddress, value); -} - -void TownsPC98_OpnChannel::loadData(uint8 *data) { - _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; - _ticksLeft = 1; - _dataPtr = data; - _totalLevel = 0x7F; - - uint8 *tmp = _dataPtr; - for (bool loop = true; loop; ) { - uint8 cmd = *tmp++; - if (cmd < 0xf0) { - tmp++; - } else if (cmd == 0xff) { - if (READ_LE_UINT16(tmp)) { - _drv->_looping |= _idFlag; - tmp += _drv->_opnFxCmdLen[cmd - 240]; - } else - loop = false; - } else if (cmd == 0xf6) { - // reset repeat section countdown - tmp[0] = tmp[1]; - tmp += 4; - } else { - tmp += _drv->_opnFxCmdLen[cmd - 240]; - } - } -} - -void TownsPC98_OpnChannel::processEvents() { - if (_flags & CHS_EOT) - return; - - if (!_hold && _ticksLeft == _keyOffTime) - keyOff(); - - if (--_ticksLeft) - return; - - if (!_hold) - keyOff(); - - uint8 cmd = 0; - bool loop = true; - - while (loop) { - cmd = *_dataPtr++; - if (cmd < 0xf0) - loop = false; - else if (!processControlEvent(cmd)) - return; - } - - uint8 para = *_dataPtr++; - - if (cmd == 0x80) { - keyOff(); - _hold = false; - } else { - keyOn(); - - if (_hold == false || cmd != _frqBlockMSB) - _flags |= CHS_RECALCFREQ; - - _hold = (para & 0x80) ? true : false; - _frqBlockMSB = cmd; - } - - _ticksLeft = para & 0x7f; -} - -void TownsPC98_OpnChannel::processFrequency() { - if (_flags & CHS_RECALCFREQ) { - - _frequency = (((const uint16 *)_drv->_opnFreqTable)[_frqBlockMSB & 0x0f] + _frqLSB) | (((_frqBlockMSB & 0x70) >> 1) << 8); - - _drv->writeReg(_part, _regOffset + 0xa4, (_frequency >> 8)); - _drv->writeReg(_part, _regOffset + 0xa0, (_frequency & 0xff)); - - setupVibrato(); - } - - if (!(_flags & CHS_VBROFF)) { - if (!processVibrato()) - return; - - _drv->writeReg(_part, _regOffset + 0xa4, (_frequency >> 8)); - _drv->writeReg(_part, _regOffset + 0xa0, (_frequency & 0xff)); - } -} - -void TownsPC98_OpnChannel::setupVibrato() { - _vbrCurDelay = _vbrInitDelayHi; - if (_flags & CHS_KEYOFF) { - _vbrModCurVal = _vbrModInitVal; - _vbrCurDelay += _vbrInitDelayLo; - } - _vbrDurLeft = (_vbrDuration >> 1); - _flags &= ~(CHS_KEYOFF | CHS_RECALCFREQ); -} - -bool TownsPC98_OpnChannel::processVibrato() { - if (--_vbrCurDelay) - return false; - - _vbrCurDelay = _vbrInitDelayHi; - _frequency += _vbrModCurVal; - - if (!--_vbrDurLeft) { - _vbrDurLeft = _vbrDuration; - _vbrModCurVal = -_vbrModCurVal; - } - - return true; -} - -bool TownsPC98_OpnChannel::processControlEvent(uint8 cmd) { - uint8 para = *_dataPtr++; - return (this->*controlEvents[cmd & 0x0f])(para); -} - -void TownsPC98_OpnChannel::setOutputLevel() { - uint8 outopr = _drv->_opnCarrier[_algorithm]; - uint8 reg = 0x40 + _regOffset; - - for (int i = 0; i < 4; i++) { - if (outopr & 1) - _drv->writeReg(_part, reg, _totalLevel); - outopr >>= 1; - reg += 4; - } -} - -void TownsPC98_OpnChannel::fadeStep() { - _totalLevel += 3; - if (_totalLevel > 0x7f) - _totalLevel = 0x7f; - setOutputLevel(); -} - -void TownsPC98_OpnChannel::reset() { - _hold = false; - _keyOffTime = 0; - _ticksLeft = 1; - - _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; - - _totalLevel = 0; - _algorithm = 0; - _flags = CHS_EOT; - _algorithm = 0; - - _block = 0; - _frequency = 0; - _frqBlockMSB = 0; - _frqLSB = 0; - - _ssgTl = 0; - _ssgStartLvl = 0; - _ssgTargetLvl = 0; - _ssgStep = 0; - _ssgTicksLeft = 0; - - _vbrInitDelayHi = 0; - _vbrInitDelayLo = 0; - _vbrModInitVal = 0; - _vbrDuration = 0; - _vbrCurDelay = 0; - _vbrModCurVal = 0; - _vbrDurLeft = 0; -} - -bool TownsPC98_OpnChannel::control_f0_setPatch(uint8 para) { - _instr = para; - uint8 reg = _regOffset + 0x80; - - for (int i = 0; i < 4; i++) { - // set release rate for each operator - _drv->writeReg(_part, reg, 0x0f); - reg += 4; - } - - const uint8 *tptr = _drv->_patches + ((uint32)_instr << 5); - reg = _regOffset + 0x30; - - // write registers 0x30 to 0x8f - for (int i = 0; i < 6; i++) { - _drv->writeReg(_part, reg, tptr[0]); - reg += 4; - _drv->writeReg(_part, reg, tptr[2]); - reg += 4; - _drv->writeReg(_part, reg, tptr[1]); - reg += 4; - _drv->writeReg(_part, reg, tptr[3]); - reg += 4; - tptr += 4; - } - - reg = _regOffset + 0xB0; - _algorithm = tptr[0] & 7; - // set feedback and algorithm - _drv->writeReg(_part, reg, tptr[0]); - - setOutputLevel(); - return true; -} - -bool TownsPC98_OpnChannel::control_f1_presetOutputLevel(uint8 para) { - if (_drv->_fading) - return true; - - _totalLevel = _drv->_opnLvlPresets[para]; - setOutputLevel(); - return true; -} - -bool TownsPC98_OpnChannel::control_f2_setKeyOffTime(uint8 para) { - _keyOffTime = para; - return true; -} - -bool TownsPC98_OpnChannel::control_f3_setFreqLSB(uint8 para) { - _frqLSB = (int8) para; - return true; -} - -bool TownsPC98_OpnChannel::control_f4_setOutputLevel(uint8 para) { - if (_drv->_fading) - return true; - - _totalLevel = para; - setOutputLevel(); - return true; -} - -bool TownsPC98_OpnChannel::control_f5_setTempo(uint8 para) { - _drv->setMusicTempo(para); - return true; -} - -bool TownsPC98_OpnChannel::control_f6_repeatSection(uint8 para) { - _dataPtr--; - _dataPtr[0]--; - - if (*_dataPtr) { - // repeat section until counter has reached zero - _dataPtr = _drv->_trackPtr + READ_LE_UINT16(_dataPtr + 2); - } else { - // reset counter, advance to next section - _dataPtr[0] = _dataPtr[1]; - _dataPtr += 4; - } - return true; -} - -bool TownsPC98_OpnChannel::control_f7_setupVibrato(uint8 para) { - _vbrInitDelayHi = _dataPtr[0]; - _vbrInitDelayLo = para; - _vbrModInitVal = (int16) READ_LE_UINT16(_dataPtr + 1); - _vbrDuration = _dataPtr[3]; - _dataPtr += 4; - _flags = (_flags & ~CHS_VBROFF) | CHS_KEYOFF | CHS_RECALCFREQ; - return true; -} - -bool TownsPC98_OpnChannel::control_f8_toggleVibrato(uint8 para) { - if (para == 0x10) { - if (*_dataPtr++) { - _flags = (_flags & ~CHS_VBROFF) | CHS_KEYOFF; - } else { - _flags |= CHS_VBROFF; - } - } else { - /* NOT IMPLEMENTED - uint8 skipChannels = para / 36; - uint8 entry = para % 36; - TownsPC98_OpnDriver::TownsPC98_OpnChannel *t = &chan[skipChannels]; - - t->unnamedEntries[entry] = *_dataPtr++;*/ - } - return true; -} - -bool TownsPC98_OpnChannel::control_fa_writeReg(uint8 para) { - _drv->writeReg(_part, para, *_dataPtr++); - return true; -} - -bool TownsPC98_OpnChannel::control_fb_incOutLevel(uint8 para) { - _dataPtr--; - if (_drv->_fading) - return true; - - uint8 val = (_totalLevel + 3); - if (val > 0x7f) - val = 0x7f; - - _totalLevel = val; - setOutputLevel(); - return true; -} - -bool TownsPC98_OpnChannel::control_fc_decOutLevel(uint8 para) { - _dataPtr--; - if (_drv->_fading) - return true; - - int8 val = (int8) (_totalLevel - 3); - if (val < 0) - val = 0; - - _totalLevel = (uint8) val; - setOutputLevel(); - return true; -} - -bool TownsPC98_OpnChannel::control_fd_jump(uint8 para) { - uint8 *tmp = _drv->_trackPtr + READ_LE_UINT16(_dataPtr - 1); - _dataPtr = (tmp[1] == 1) ? tmp : (_dataPtr + 1); - return true; -} - -bool TownsPC98_OpnChannel::control_dummy(uint8 para) { - _dataPtr--; - return true; -} - -bool TownsPC98_OpnChannel::control_ff_endOfTrack(uint8 para) { - uint16 val = READ_LE_UINT16(--_dataPtr); - if (val) { - // loop - _dataPtr = _drv->_trackPtr + val; - return true; - } else { - // quit parsing for active channel - --_dataPtr; - _flags |= CHS_EOT; - _drv->_finishedChannelsFlag |= _idFlag; - keyOff(); - return false; - } -} - -TownsPC98_OpnChannelSSG::TownsPC98_OpnChannelSSG(TownsPC98_OpnDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : - TownsPC98_OpnChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { -} - -void TownsPC98_OpnChannelSSG::init() { - _algorithm = 0x80; - - #define Control(x) &TownsPC98_OpnChannelSSG::control_##x - static const ControlEventFunc ctrlEventsSSG[] = { - Control(f0_setPatch), - Control(f1_setTotalLevel), - Control(f2_setKeyOffTime), - Control(f3_setFreqLSB), - Control(f4_setAlgorithm), - Control(f5_setTempo), - Control(f6_repeatSection), - Control(f7_setupVibrato), - Control(f8_toggleVibrato), - Control(f9_loadCustomPatch), - Control(fa_writeReg), - Control(fb_incOutLevel), - Control(fc_decOutLevel), - Control(fd_jump), - Control(dummy), - Control(ff_endOfTrack) - }; - #undef Control - - controlEvents = ctrlEventsSSG; -} - -void TownsPC98_OpnChannelSSG::processEvents() { - if (_flags & CHS_EOT) - return; - - _drv->toggleRegProtection(_flags & CHS_PROTECT ? true : false); - - if (!_hold && _ticksLeft == _keyOffTime) - nextShape(); - - if (!--_ticksLeft) { - - uint8 cmd = 0; - bool loop = true; - - while (loop) { - cmd = *_dataPtr++; - if (cmd < 0xf0) - loop = false; - else if (!processControlEvent(cmd)) - return; - } - - uint8 para = *_dataPtr++; - - if (cmd == 0x80) { - nextShape(); - _hold = false; - } else { - if (!_hold) { - _instr &= 0xf0; - _ssgStep = _drv->_ssgPatches[_instr]; - _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; - _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; - _ssgStartLvl = _drv->_ssgPatches[_instr + 3]; - _flags = (_flags & ~CHS_SSGOFF) | CHS_KEYOFF; - } - - keyOn(); - - if (_hold == false || cmd != _frqBlockMSB) - _flags |= CHS_RECALCFREQ; - - _hold = (para & 0x80) ? true : false; - _frqBlockMSB = cmd; - } - - _ticksLeft = para & 0x7f; - } - - if (!(_flags & CHS_SSGOFF)) { - if (--_ssgTicksLeft) { - if (!_drv->_fading) - setOutputLevel(_ssgStartLvl); - return; - } - - _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; - - if (_drv->_ssgPatches[_instr + 1] & 0x80) { - uint8 t = _ssgStartLvl - _ssgStep; - - if (_ssgStep <= _ssgStartLvl && _ssgTargetLvl < t) { - if (!_drv->_fading) - setOutputLevel(t); - return; - } - } else { - int t = _ssgStartLvl + _ssgStep; - uint8 p = (uint8) (t & 0xff); - - if (t < 256 && _ssgTargetLvl > p) { - if (!_drv->_fading) - setOutputLevel(p); - return; - } - } - - setOutputLevel(_ssgTargetLvl); - if (_ssgStartLvl && !(_instr & 8)){ - _instr += 4; - _ssgStep = _drv->_ssgPatches[_instr]; - _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; - _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; - } else { - _flags |= CHS_SSGOFF; - setOutputLevel(0); - } - } -} - -void TownsPC98_OpnChannelSSG::processFrequency() { - if (_algorithm & 0x40) - return; - - if (_flags & CHS_RECALCFREQ) { - _block = _frqBlockMSB >> 4; - _frequency = ((const uint16 *)_drv->_opnFreqTableSSG)[_frqBlockMSB & 0x0f] + _frqLSB; - - uint16 f = _frequency >> _block; - _drv->writeReg(_part, _regOffset << 1, f & 0xff); - _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); - - setupVibrato(); - } - - if (!(_flags & (CHS_EOT | CHS_VBROFF | CHS_SSGOFF))) { - if (!processVibrato()) - return; - - uint16 f = _frequency >> _block; - _drv->writeReg(_part, _regOffset << 1, f & 0xff); - _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); - } -} - -bool TownsPC98_OpnChannelSSG::processControlEvent(uint8 cmd) { - uint8 para = *_dataPtr++; - return (this->*controlEvents[cmd & 0x0f])(para); -} - -void TownsPC98_OpnChannelSSG::nextShape() { - _instr = (_instr & 0xf0) + 0x0c; - _ssgStep = _drv->_ssgPatches[_instr]; - _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; - _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; -} - -void TownsPC98_OpnChannelSSG::keyOn() { - uint8 c = 0x7b; - uint8 t = (_algorithm & 0xC0) << 1; - if (_algorithm & 0x80) - t |= 4; - - c = (c << (_regOffset + 1)) | (c >> (7 - _regOffset)); - t = (t << (_regOffset + 1)) | (t >> (7 - _regOffset)); - - if (!(_algorithm & 0x80)) - _drv->writeReg(_part, 6, _algorithm & 0x7f); - - uint8 e = (_drv->readSSGStatus() & c) | t; - _drv->writeReg(_part, 7, e); -} - -void TownsPC98_OpnChannelSSG::protect() { - _flags |= CHS_PROTECT; -} - -void TownsPC98_OpnChannelSSG::restore() { - _flags &= ~CHS_PROTECT; - keyOn(); - _drv->writeReg(_part, 8 + _regOffset, _ssgTl); - uint16 f = _frequency >> _block; - _drv->writeReg(_part, _regOffset << 1, f & 0xff); - _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); -} - -void TownsPC98_OpnChannelSSG::loadData(uint8 *data) { - _drv->toggleRegProtection(_flags & CHS_PROTECT ? true : false); - TownsPC98_OpnChannel::loadData(data); - setOutputLevel(0); - _algorithm = 0x80; -} - -void TownsPC98_OpnChannelSSG::setOutputLevel(uint8 lvl) { - _ssgStartLvl = lvl; - uint16 newTl = (((uint16)_totalLevel + 1) * (uint16)lvl) >> 8; - if (newTl == _ssgTl) - return; - _ssgTl = newTl; - _drv->writeReg(_part, 8 + _regOffset, _ssgTl); -} - -void TownsPC98_OpnChannelSSG::reset() { - TownsPC98_OpnChannel::reset(); - - // Unlike the original we restore the default patch data. This fixes a bug - // where certain sound effects would bring each other out of tune (e.g. the - // dragon's fire in Darm's house in Kyra 1 would sound different each time - // you triggered another sfx by dropping an item etc.) - uint8 i = (10 + _regOffset) << 4; - const uint8 *src = &_drv->_drvTables[156]; - _drv->_ssgPatches[i] = src[i]; - _drv->_ssgPatches[i + 3] = src[i + 3]; - _drv->_ssgPatches[i + 4] = src[i + 4]; - _drv->_ssgPatches[i + 6] = src[i + 6]; - _drv->_ssgPatches[i + 8] = src[i + 8]; - _drv->_ssgPatches[i + 12] = src[i + 12]; -} - -void TownsPC98_OpnChannelSSG::fadeStep() { - _totalLevel--; - if ((int8)_totalLevel < 0) - _totalLevel = 0; - setOutputLevel(_ssgStartLvl); -} - -bool TownsPC98_OpnChannelSSG::control_f0_setPatch(uint8 para) { - _instr = para << 4; - para = (para >> 3) & 0x1e; - if (para) - return control_f4_setAlgorithm(para | 0x40); - return true; -} - -bool TownsPC98_OpnChannelSSG::control_f1_setTotalLevel(uint8 para) { - if (!_drv->_fading) - _totalLevel = para; - return true; -} - -bool TownsPC98_OpnChannelSSG::control_f4_setAlgorithm(uint8 para) { - _algorithm = para; - return true; -} - -bool TownsPC98_OpnChannelSSG::control_f9_loadCustomPatch(uint8 para) { - _instr = (_drv->_sfxOffs + 10 + _regOffset) << 4; - _drv->_ssgPatches[_instr] = *_dataPtr++; - _drv->_ssgPatches[_instr + 3] = para; - _drv->_ssgPatches[_instr + 4] = *_dataPtr++; - _drv->_ssgPatches[_instr + 6] = *_dataPtr++; - _drv->_ssgPatches[_instr + 8] = *_dataPtr++; - _drv->_ssgPatches[_instr + 12] = *_dataPtr++; - return true; -} - -bool TownsPC98_OpnChannelSSG::control_fb_incOutLevel(uint8 para) { - _dataPtr--; - if (_drv->_fading) - return true; - - _totalLevel--; - if ((int8)_totalLevel < 0) - _totalLevel = 0; - - return true; -} - -bool TownsPC98_OpnChannelSSG::control_fc_decOutLevel(uint8 para) { - _dataPtr--; - if (_drv->_fading) - return true; - - if (_totalLevel + 1 < 0x10) - _totalLevel++; - - return true; -} - -bool TownsPC98_OpnChannelSSG::control_ff_endOfTrack(uint8 para) { - if (!_drv->_sfxOffs) { - uint16 val = READ_LE_UINT16(--_dataPtr); - if (val) { - // loop - _dataPtr = _drv->_trackPtr + val; - return true; - } else { - // stop parsing - if (!_drv->_fading) - setOutputLevel(0); - --_dataPtr; - _flags |= CHS_EOT; - _drv->_finishedSSGFlag |= _idFlag; - } - } else { - // end of sfx track - restore ssg music channel - _flags |= CHS_EOT; - _drv->_finishedSfxFlag |= _idFlag; - _drv->_ssgChannels[_chanNum]->restore(); - } - - return false; -} - -void TownsPC98_OpnSfxChannel::loadData(uint8 *data) { - _flags = CHS_ALLOFF; - _ticksLeft = 1; - _dataPtr = data; - _ssgTl = 0xff; - _algorithm = 0x80; - - uint8 *tmp = _dataPtr; - for (bool loop = true; loop; ) { - uint8 cmd = *tmp++; - if (cmd < 0xf0) { - tmp++; - } else if (cmd == 0xff) { - loop = false; - } else if (cmd == 0xf6) { - // reset repeat section countdown - tmp[0] = tmp[1]; - tmp += 4; - } else { - tmp += _drv->_opnFxCmdLen[cmd - 240]; - } - } -} - -void TownsPC98_OpnSfxChannel::reset() { - TownsPC98_OpnChannel::reset(); - - // Unlike the original we restore the default patch data. This fixes a bug - // where certain sound effects would bring each other out of tune (e.g. the - // dragon's fire in Darm's house in Kyra 1 would sound different each time - // you triggered another sfx by dropping an item etc.) - uint8 i = (13 + _regOffset) << 4; - const uint8 *src = &_drv->_drvTables[156]; - _drv->_ssgPatches[i] = src[i]; - _drv->_ssgPatches[i + 3] = src[i + 3]; - _drv->_ssgPatches[i + 4] = src[i + 4]; - _drv->_ssgPatches[i + 6] = src[i + 6]; - _drv->_ssgPatches[i + 8] = src[i + 8]; - _drv->_ssgPatches[i + 12] = src[i + 12]; -} - -TownsPC98_OpnChannelPCM::TownsPC98_OpnChannelPCM(TownsPC98_OpnDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : - TownsPC98_OpnChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { -} - -void TownsPC98_OpnChannelPCM::init() { - _algorithm = 0x80; - - #define Control(x) &TownsPC98_OpnChannelPCM::control_##x - static const ControlEventFunc ctrlEventsPCM[] = { - Control(dummy), - Control(f1_prcStart), - Control(dummy), - Control(dummy), - Control(dummy), - Control(dummy), - Control(f6_repeatSection), - Control(dummy), - Control(dummy), - Control(dummy), - Control(fa_writeReg), - Control(dummy), - Control(dummy), - Control(dummy), - Control(dummy), - Control(ff_endOfTrack) - }; - #undef Control - - controlEvents = ctrlEventsPCM; -} - -void TownsPC98_OpnChannelPCM::loadData(uint8 *data) { - _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; - _ticksLeft = 1; - _dataPtr = data; - _totalLevel = 0x7F; -} - -void TownsPC98_OpnChannelPCM::processEvents() { - if (_flags & CHS_EOT) - return; - - if (--_ticksLeft) - return; - - uint8 cmd = 0; - bool loop = true; - - while (loop) { - cmd = *_dataPtr++; - if (cmd == 0x80) { - loop = false; - } else if (cmd < 0xf0) { - _drv->writeReg(_part, 0x10, cmd); - } else if (!processControlEvent(cmd)) { - return; - } - } - - _ticksLeft = *_dataPtr++; -} - -bool TownsPC98_OpnChannelPCM::processControlEvent(uint8 cmd) { - uint8 para = *_dataPtr++; - return (this->*controlEvents[cmd & 0x0f])(para); -} - -bool TownsPC98_OpnChannelPCM::control_f1_prcStart(uint8 para) { - _totalLevel = para; - _drv->writeReg(_part, 0x11, para); - return true; -} - -bool TownsPC98_OpnChannelPCM::control_ff_endOfTrack(uint8 para) { - uint16 val = READ_LE_UINT16(--_dataPtr); - if (val) { - // loop - _dataPtr = _drv->_trackPtr + val; - return true; - } else { - // quit parsing for active channel - --_dataPtr; - _flags |= CHS_EOT; - _drv->_finishedRhythmFlag |= _idFlag; - return false; - } -} - -TownsPC98_OpnSquareSineSource::TownsPC98_OpnSquareSineSource(const uint32 timerbase) : _tlTable(0), - _tleTable(0), _updateRequest(-1), _tickLength(timerbase * 27), _ready(0), _reg(0), _rand(1), _outN(1), - _nTick(0), _evpUpdateCnt(0), _evpTimer(0x1f), _pReslt(0x1f), _attack(0), _cont(false), _evpUpdate(true), - _timer(0), _noiseGenerator(0), _chanEnable(0), - _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { - - memset(_channels, 0, sizeof(_channels)); - memset(_updateRequestBuf, 0, sizeof(_updateRequestBuf)); - _reg = new uint8 *[11]; - - _reg[0] = &_channels[0].frqL; - _reg[1] = &_channels[0].frqH; - _reg[2] = &_channels[1].frqL; - _reg[3] = &_channels[1].frqH; - _reg[4] = &_channels[2].frqL; - _reg[5] = &_channels[2].frqH; - _reg[6] = &_noiseGenerator; - _reg[7] = &_chanEnable; - _reg[8] = &_channels[0].vol; - _reg[9] = &_channels[1].vol; - _reg[10] = &_channels[2].vol; - - reset(); -} - -TownsPC98_OpnSquareSineSource::~TownsPC98_OpnSquareSineSource() { - delete[] _tlTable; - delete[] _tleTable; - delete[] _reg; -} - -void TownsPC98_OpnSquareSineSource::init(const int *rsTable, const int *rseTable) { - if (_ready) { - reset(); - return; - } - - delete[] _tlTable; - delete[] _tleTable; - _tlTable = new int32[16]; - _tleTable = new int32[32]; - float a, b, d; - d = 801.0f; - - for (int i = 0; i < 16; i++) { - b = 1.0f / rsTable[i]; - a = 1.0f / d + b + 1.0f / 1000.0f; - float v = (b / a) * 32767.0f; - _tlTable[i] = (int32) v; - - b = 1.0f / rseTable[i]; - a = 1.0f / d + b + 1.0f / 1000.0f; - v = (b / a) * 32767.0f; - _tleTable[i] = (int32) v; - } - - for (int i = 16; i < 32; i++) { - b = 1.0f / rseTable[i]; - a = 1.0f / d + b + 1.0f / 1000.0f; - float v = (b / a) * 32767.0f; - _tleTable[i] = (int32) v; - } - - _ready = true; -} - -void TownsPC98_OpnSquareSineSource::reset() { - _rand = 1; - _outN = 1; - _updateRequest = -1; - _nTick = _evpUpdateCnt = 0; - _evpTimer = 0x1f; - _pReslt = 0x1f; - _attack = 0; - _cont = false; - _evpUpdate = true; - _timer = 0; - - for (int i = 0; i < 3; i++) { - _channels[i].tick = 0; - _channels[i].smp = _channels[i].out = 0; - } - - for (int i = 0; i < 14; i++) - writeReg(i, 0, true); - - writeReg(7, 0xbf, true); -} - -void TownsPC98_OpnSquareSineSource::writeReg(uint8 address, uint8 value, bool force) { - if (!_ready) - return; - - if (address > 10 || *_reg[address] == value) { - if ((address == 11 || address == 12 || address == 13) && value) - warning("TownsPC98_OpnSquareSineSource: unsupported reg address: %d", address); - return; - } - - if (!force) { - if (_updateRequest >= 63) { - warning("TownsPC98_OpnSquareSineSource: event buffer overflow"); - _updateRequest = -1; - } - _updateRequestBuf[++_updateRequest] = value; - _updateRequestBuf[++_updateRequest] = address; - return; - } - - *_reg[address] = value; -} - -void TownsPC98_OpnSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { - if (!_ready) - return; - - for (uint32 i = 0; i < bufferSize; i++) { - _timer += _tickLength; - while (_timer > 0x5B8D80) { - _timer -= 0x5B8D80; - - if (++_nTick >= (_noiseGenerator & 0x1f)) { - if ((_rand + 1) & 2) - _outN ^= 1; - - _rand = (((_rand & 1) ^ ((_rand >> 3) & 1)) << 16) | (_rand >> 1); - _nTick = 0; - } - - for (int ii = 0; ii < 3; ii++) { - if (++_channels[ii].tick >= (((_channels[ii].frqH & 0x0f) << 8) | _channels[ii].frqL)) { - _channels[ii].tick = 0; - _channels[ii].smp ^= 1; - } - _channels[ii].out = (_channels[ii].smp | ((_chanEnable >> ii) & 1)) & (_outN | ((_chanEnable >> (ii + 3)) & 1)); - } - - if (_evpUpdate) { - if (++_evpUpdateCnt >= 0) { - _evpUpdateCnt = 0; - - if (--_evpTimer < 0) { - if (_cont) { - _evpTimer &= 0x1f; - } else { - _evpUpdate = false; - _evpTimer = 0; - } - } - } - } - _pReslt = _evpTimer ^ _attack; - updateRegs(); - } - - int32 finOut = 0; - for (int ii = 0; ii < 3; ii++) { - int32 finOutTemp = ((_channels[ii].vol >> 4) & 1) ? _tleTable[_channels[ii].out ? _pReslt : 0] : _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; - - if ((1 << ii) & _volMaskA) - finOutTemp = (finOutTemp * _volumeA) / Audio::Mixer::kMaxMixerVolume; - - if ((1 << ii) & _volMaskB) - finOutTemp = (finOutTemp * _volumeB) / Audio::Mixer::kMaxMixerVolume; - - finOut += finOutTemp; - } - - finOut /= 3; - - buffer[i << 1] += finOut; - buffer[(i << 1) + 1] += finOut; - } -} - -void TownsPC98_OpnSquareSineSource::updateRegs() { - for (int i = 0; i < _updateRequest;) { - uint8 b = _updateRequestBuf[i++]; - uint8 a = _updateRequestBuf[i++]; - writeReg(a, b, true); - } - _updateRequest = -1; -} - -TownsPC98_OpnPercussionSource::TownsPC98_OpnPercussionSource(const uint32 timerbase) : - _tickLength(timerbase * 2), _timer(0), _ready(false), _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { - - memset(_rhChan, 0, sizeof(RhtChannel) * 6); - _reg = new uint8 *[40]; - - _reg[0] = _reg[1] = _reg[2] = _reg[3] = _reg[4] = _reg[5] = _reg[6] = _reg[7] = _reg[8] = _reg[9] = _reg[10] = _reg[11] = _reg[12] = _reg[13] = _reg[14] = _reg[15] = 0; - _reg[16] = &_rhChan[0].startPosL; - _reg[17] = &_rhChan[1].startPosL; - _reg[18] = &_rhChan[2].startPosL; - _reg[19] = &_rhChan[3].startPosL; - _reg[20] = &_rhChan[4].startPosL; - _reg[21] = &_rhChan[5].startPosL; - _reg[22] = &_rhChan[0].startPosH; - _reg[23] = &_rhChan[1].startPosH; - _reg[24] = &_rhChan[2].startPosH; - _reg[25] = &_rhChan[3].startPosH; - _reg[26] = &_rhChan[4].startPosH; - _reg[27] = &_rhChan[5].startPosH; - _reg[28] = &_rhChan[0].endPosL; - _reg[29] = &_rhChan[1].endPosL; - _reg[30] = &_rhChan[2].endPosL; - _reg[31] = &_rhChan[3].endPosL; - _reg[32] = &_rhChan[4].endPosL; - _reg[33] = &_rhChan[5].endPosL; - _reg[34] = &_rhChan[0].endPosH; - _reg[35] = &_rhChan[1].endPosH; - _reg[36] = &_rhChan[2].endPosH; - _reg[37] = &_rhChan[3].endPosH; - _reg[38] = &_rhChan[4].endPosH; - _reg[39] = &_rhChan[5].endPosH; -} - -void TownsPC98_OpnPercussionSource::init(const uint8 *instrData) { - if (_ready) { - reset(); - return; - } - - const uint8 *start = instrData; - const uint8 *pos = start; - - if (instrData) { - for (int i = 0; i < 6; i++) { - _rhChan[i].data = start + READ_BE_UINT16(pos); - pos += 2; - _rhChan[i].size = READ_BE_UINT16(pos); - pos += 2; - } - reset(); - _ready = true; - } else { - memset(_rhChan, 0, sizeof(RhtChannel) * 6); - _ready = false; - } -} - -void TownsPC98_OpnPercussionSource::reset() { - _timer = 0; - _totalLevel = 63; - - for (int i = 0; i < 6; i++) { - RhtChannel *s = &_rhChan[i]; - s->pos = s->start = s->data; - s->end = s->data + s->size; - s->active = false; - s->level = 0; - s->out = 0; - s->decStep = 1; - s->decState = 0; - s->samples[0] = s->samples[1] = 0; - s->startPosH = s->startPosL = s->endPosH = s->endPosL = 0; - } -} - -void TownsPC98_OpnPercussionSource::writeReg(uint8 address, uint8 value) { - if (!_ready) - return; - - uint8 h = address >> 4; - uint8 l = address & 15; - - if (address > 15) - *_reg[address] = value; - - if (address == 0) { - if (value & 0x80) { - //key off - for (int i = 0; i < 6; i++) { - if ((value >> i) & 1) - _rhChan[i].active = false; - } - } else { - //key on - for (int i = 0; i < 6; i++) { - if ((value >> i) & 1) { - RhtChannel *s = &_rhChan[i]; - s->pos = s->start; - s->active = true; - s->out = 0; - s->samples[0] = s->samples[1] = 0; - s->decStep = 1; - s->decState = 0; - } - } - } - } else if (address == 1) { - // total level - _totalLevel = (value & 63) ^ 63; - for (int i = 0; i < 6; i++) - recalcOuput(&_rhChan[i]); - } else if (!h && l & 8) { - // instrument level - l &= 7; - _rhChan[l].level = (value & 0x1f) ^ 0x1f; - recalcOuput(&_rhChan[l]); - } else if (h & 3) { - l &= 7; - if (h == 1) { - // set start offset - _rhChan[l].start = _rhChan[l].data + ((_rhChan[l].startPosH << 8 | _rhChan[l].startPosL) << 8); - } else if (h == 2) { - // set end offset - _rhChan[l].end = _rhChan[l].data + ((_rhChan[l].endPosH << 8 | _rhChan[l].endPosL) << 8) + 255; - } - } -} - -void TownsPC98_OpnPercussionSource::nextTick(int32 *buffer, uint32 bufferSize) { - if (!_ready) - return; - - for (uint32 i = 0; i < bufferSize; i++) { - _timer += _tickLength; - while (_timer > 0x5B8D80) { - _timer -= 0x5B8D80; - - for (int ii = 0; ii < 6; ii++) { - RhtChannel *s = &_rhChan[ii]; - if (s->active) { - recalcOuput(s); - if (s->decStep) { - advanceInput(s); - if (s->pos == s->end) - s->active = false; - } - s->decStep ^= 1; - } - } - } - - int32 finOut = 0; - - for (int ii = 0; ii < 6; ii++) { - if (_rhChan[ii].active) - finOut += _rhChan[ii].out; - } - - finOut <<= 1; - - if (1 & _volMaskA) - finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; - - if (1 & _volMaskB) - finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; - - buffer[i << 1] += finOut; - buffer[(i << 1) + 1] += finOut; - } -} - -void TownsPC98_OpnPercussionSource::recalcOuput(RhtChannel *ins) { - uint32 s = _totalLevel + ins->level; - uint32 x = s > 62 ? 0 : (1 + (s >> 3)); - int32 y = s > 62 ? 0 : (15 - (s & 7)); - ins->out = ((ins->samples[ins->decStep] * y) >> x) & ~3; -} - -void TownsPC98_OpnPercussionSource::advanceInput(RhtChannel *ins) { - static const int8 adjustIndex[] = {-1, -1, -1, -1, 2, 5, 7, 9 }; - - static const int16 stepTable[] = { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, - 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, - 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 - }; - - uint8 cur = (int8) *ins->pos++; - - for (int i = 0; i < 2; i++) { - int b = (2 * (cur & 7) + 1) * stepTable[ins->decState] / 8; - ins->samples[i] = CLIP(ins->samples[i ^ 1] + (cur & 8 ? b : -b), -2048, 2047); - ins->decState = CLIP(ins->decState + adjustIndex[cur & 7], 0, 48); - cur >>= 4; - } -} - -TownsPC98_OpnCore::TownsPC98_OpnCore(Audio::Mixer *mixer, OpnType type) : - _mixer(mixer), - _chanInternal(0), _ssg(0), _prc(0), - _numChan(type == OD_TYPE26 ? 3 : 6), _numSSG(type == OD_TOWNS ? 0 : 3), _hasPercussion(type == OD_TYPE86 ? true : false), - _oprRates(0), _oprRateshift(0), _oprAttackDecay(0), _oprFrq(0), _oprSinTbl(0), _oprLevelOut(0), _oprDetune(0), - _baserate(55125.0f / (float)mixer->getOutputRate()), - _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), - _regProtectionFlag(false), _ready(false) { - - memset(&_timers[0], 0, sizeof(OpnTimer)); - memset(&_timers[1], 0, sizeof(OpnTimer)); - _timers[0].cb = &TownsPC98_OpnCore::timerCallbackA; - _timers[1].cb = &TownsPC98_OpnCore::timerCallbackB; - _timerbase = (uint32)(_baserate * 1000000.0f); -} - -TownsPC98_OpnCore::~TownsPC98_OpnCore() { - Common::StackLock lock(_mutex); - _mixer->stopHandle(_soundHandle); - delete _ssg; - delete _prc; - delete[] _chanInternal; - - delete[] _oprRates; - delete[] _oprRateshift; - delete[] _oprFrq; - delete[] _oprAttackDecay; - delete[] _oprSinTbl; - delete[] _oprLevelOut; - delete[] _oprDetune; -} - -bool TownsPC98_OpnCore::init() { - if (_ready) { - reset(); - return true; - } - - generateTables(); - - _chanInternal = new ChanInternal[_numChan]; - for (int i = 0; i < _numChan; i++) { - memset(&_chanInternal[i], 0, sizeof(ChanInternal)); - for (int j = 0; j < 4; ++j) - _chanInternal[i].opr[j] = new TownsPC98_OpnOperator(_timerbase, _oprRates, _oprRateshift, _oprAttackDecay, _oprFrq, _oprSinTbl, _oprLevelOut, _oprDetune); - } - - if (_numSSG) { - _ssg = new TownsPC98_OpnSquareSineSource(_timerbase); - _ssg->init(&_ssgTables[0], &_ssgTables[16]); - } - - if (_hasPercussion) { - _prc = new TownsPC98_OpnPercussionSource(_timerbase); - _prc->init(_percussionData); - } - - _mixer->playStream(Audio::Mixer::kPlainSoundType, - &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - - _ready = true; - - return true; -} - -void TownsPC98_OpnCore::reset() { - for (int i = 0; i < _numChan; i++) { - for (int ii = 0; ii < 4; ii++) - _chanInternal[i].opr[ii]->reset(); - memset(_chanInternal[i].feedbuf, 0, 3); - _chanInternal[i].algorithm = 0; - _chanInternal[i].frqTemp = 0; - _chanInternal[i].enableLeft = _chanInternal[i].enableRight = true; - _chanInternal[i].updateEnvelopeParameters = false; - } - - writeReg(0, 0x27, 0x33); - - if (_ssg) - _ssg->reset(); - - if (_prc) - _prc->reset(); -} - -void TownsPC98_OpnCore::writeReg(uint8 part, uint8 regAddress, uint8 value) { - if (_regProtectionFlag || !_ready) - return; - - static const uint8 oprOrdr[] = { 0, 2, 1, 3 }; - - uint8 h = regAddress & 0xf0; - uint8 l = (regAddress & 0x0f); - - ChanInternal *c = 0; - TownsPC98_OpnOperator **co = 0; - TownsPC98_OpnOperator *o = 0; - - if (regAddress > 0x2F) { - c = &_chanInternal[(l & 3) + 3 * part]; - co = c->opr; - o = c->opr[oprOrdr[(l - (l & 3)) >> 2]]; - } else if (regAddress == 0x28) { - c = &_chanInternal[(value & 3) + ((value & 4) ? 3 : 0)]; - co = c->opr; - } - - switch (h) { - case 0x00: - // ssg - if (_ssg) - _ssg->writeReg(l, value); - break; - case 0x10: - // pcm rhythm channel - if (_prc) - _prc->writeReg(l, value); - break; - case 0x20: - if (l == 8) { - // Key on/off - for (int i = 0; i < 4; i++) { - if ((value >> (4 + i)) & 1) - co[oprOrdr[i]]->keyOn(); - else - co[oprOrdr[i]]->keyOff(); - } - } else if (l == 4) { - // Timer A - _timers[0].value = (_timers[0].value & 0xff00) | value; - } else if (l == 5) { - // Timer A - _timers[0].value = (_timers[0].value & 0xff) | (value << 8); - } else if (l == 6) { - // Timer B - _timers[1].value = value & 0xff; - } else if (l == 7) { - _timers[0].enabled = (value & 1) ? 1 : 0; - _timers[1].enabled = (value & 2) ? 1 : 0; - - float spc = (float)(0x400 - _timers[0].value) / _baserate; - _timers[0].smpPerCb = (int32) spc; - _timers[0].smpPerCbRem = (uint32) ((spc - (float)_timers[0].smpPerCb) * 1000000.0f); - - spc = (float)(0x100 - _timers[1].value) * 16.0f / _baserate; - _timers[1].smpPerCb = (int32) spc; - _timers[1].smpPerCbRem = (uint32) ((spc - (float)_timers[1].smpPerCb) * 1000000.0f); - - if (value & 10) { - _timers[0].smpTillCb = _timers[0].smpPerCb; - _timers[0].smpTillCbRem = _timers[0].smpTillCbRem; - } - - if (value & 20) { - _timers[1].smpTillCb = _timers[1].smpPerCb; - _timers[1].smpTillCbRem = _timers[1].smpTillCbRem; - } - } else if (l == 2) { - // LFO - warning("TownsPC98_OpnDriver: TRYING TO USE LFO (NOT SUPPORTED)"); - } else if (l == 10 || l == 11) { - // DAC - warning("TownsPC98_OpnDriver: TRYING TO USE DAC (NOT SUPPORTED)"); - } - break; - - case 0x30: - // detune, multiple - o->detune((value >> 4) & 7); - o->multiple(value & 0x0f); - c->updateEnvelopeParameters = true; - break; - - case 0x40: - // total level - o->totalLevel(value & 0x7f); - break; - - case 0x50: - // rate scaling, attack rate - o->attackRate(value & 0x1f); - if (o->scaleRate(value >> 6)) - c->updateEnvelopeParameters = true; - break; - - case 0x60: - // first decay rate, amplitude modulation - o->decayRate(value & 0x1f); - if (value & 0x80) - warning("TownsPC98_OpnDriver: TRYING TO USE AMP MODULATION (NOT SUPPORTED)"); - break; - - case 0x70: - // secondary decay rate - o->sustainRate(value & 0x1f); - break; - - case 0x80: - // secondary amplitude, release rate; - o->sustainLevel(value >> 4); - o->releaseRate(value & 0x0f); - break; - - case 0x90: - warning("TownsPC98_OpnDriver: TRYING TO SSG ENVELOPE SHAPES (NOT SUPPORTED)"); - break; - - case 0xa0: - // frequency - l &= ~3; - if (l == 0) { - c->frqTemp = (c->frqTemp & 0xff00) | value; - c->updateEnvelopeParameters = true; - for (int i = 0; i < 4; i++) - co[i]->frequency(c->frqTemp); - } else if (l == 4) { - c->frqTemp = (c->frqTemp & 0xff) | (value << 8); - } else if (l == 8) { - // Ch 3/6 special mode frq - warning("TownsPC98_OpnDriver: TRYING TO USE CH 3/6 SPECIAL MODE FREQ (NOT SUPPORTED)"); - } else if (l == 12) { - // Ch 3/6 special mode frq - warning("TownsPC98_OpnDriver: TRYING TO USE CH 3/6 SPECIAL MODE FREQ (NOT SUPPORTED)"); - } - break; - - case 0xb0: - l &= ~3; - if (l == 0) { - // feedback, _algorithm - co[0]->feedbackLevel((value >> 3) & 7); - c->algorithm = value & 7; - } else if (l == 4) { - // stereo, LFO sensitivity - c->enableLeft = value & 0x80 ? true : false; - c->enableRight = value & 0x40 ? true : false; - uint8 ams = (value & 0x3F) >> 3; - if (ams) - warning("TownsPC98_OpnDriver: TRYING TO USE AMP MODULATION SENSITIVITY (NOT SUPPORTED)"); - uint8 fms = value & 3; - if (fms) - warning("TownsPC98_OpnDriver: TRYING TO USE FREQ MODULATION SENSITIVITY (NOT SUPPORTED)"); - } - break; - - default: - warning("TownsPC98_OpnDriver: UNKNOWN ADDRESS %d", regAddress); - } -} - -int TownsPC98_OpnCore::readBuffer(int16 *buffer, const int numSamples) { - Common::StackLock lock(_mutex); - - memset(buffer, 0, sizeof(int16) * numSamples); - int32 *tmp = new int32[numSamples]; - int32 *tmpStart = tmp; - memset(tmp, 0, sizeof(int32) * numSamples); - int32 samplesLeft = numSamples >> 1; - - while (samplesLeft) { - int32 render = samplesLeft; - - for (int i = 0; i < 2; i++) { - if (_timers[i].enabled && _timers[i].cb) { - if (!_timers[i].smpTillCb) { - (this->*_timers[i].cb)(); - _timers[i].smpTillCb = _timers[i].smpPerCb; - - _timers[i].smpTillCbRem += _timers[i].smpPerCbRem; - if (_timers[i].smpTillCbRem >= _timerbase) { - _timers[i].smpTillCb++; - _timers[i].smpTillCbRem -= _timerbase; - } - } - render = MIN(render, _timers[i].smpTillCb); - } - } - - samplesLeft -= render; - - for (int i = 0; i < 2; i++) { - if (_timers[i].enabled && _timers[i].cb) { - _timers[i].smpTillCb -= render; - } - } - - nextTick(tmp, render); - - if (_ssg) - _ssg->nextTick(tmp, render); - if (_prc) - _prc->nextTick(tmp, render); - - for (int i = 0; i < render; ++i) { - int32 l = CLIP(tmp[i << 1], -32767, 32767); - buffer[i << 1] = (int16) l; - int32 r = CLIP(tmp[(i << 1) + 1], -32767, 32767); - buffer[(i << 1) + 1] = (int16) r; - } - - buffer += (render << 1); - tmp += (render << 1); - } - - delete[] tmpStart; - return numSamples; -} - -void TownsPC98_OpnCore::setVolumeIntern(int volA, int volB) { - Common::StackLock lock(_mutex); - _volumeA = volA; - _volumeB = volB; - if (_ssg) - _ssg->setVolumeIntern(volA, volB); - if (_prc) - _prc->setVolumeIntern(volA, volB); -} - -void TownsPC98_OpnCore::setVolumeChannelMasks(int channelMaskA, int channelMaskB) { - Common::StackLock lock(_mutex); - _volMaskA = channelMaskA; - _volMaskB = channelMaskB; - if (_ssg) - _ssg->setVolumeChannelMasks(_volMaskA >> _numChan, _volMaskB >> _numChan); - if (_prc) - _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); -} - -void TownsPC98_OpnCore::generateTables() { - delete[] _oprRates; - _oprRates = new uint8[128]; - - WRITE_BE_UINT32(_oprRates + 32, _numChan == 6 ? 0x90900000 : 0x00081018); - WRITE_BE_UINT32(_oprRates + 36, _numChan == 6 ? 0x00001010 : 0x00081018); - memset(_oprRates, 0x90, 32); - memset(_oprRates + 96, 0x80, 32); - uint8 *dst = (uint8 *)_oprRates + 40; - for (int i = 0; i < 40; i += 4) - WRITE_BE_UINT32(dst + i, 0x00081018); - for (int i = 0; i < 48; i += 4) - WRITE_BE_UINT32(dst + i, 0x00081018); - dst += 40; - for (uint8 i = 0; i < 16; i ++) { - uint8 v = (i < 12) ? i : 12; - *dst++ = ((4 + v) << 3); - } - - delete[] _oprRateshift; - _oprRateshift = new uint8[128]; - memset(_oprRateshift, 0, 128); - dst = (uint8 *)_oprRateshift + 32; - for (int i = 11; i; i--) { - memset(dst, i, 4); - dst += 4; - } - - delete[] _oprFrq; - _oprFrq = new uint32[0x1000]; - for (uint32 i = 0; i < 0x1000; i++) - _oprFrq[i] = (uint32)(_baserate * (float)(i << 11)); - - delete[] _oprAttackDecay; - _oprAttackDecay = new uint8[152]; - memset(_oprAttackDecay, 0, 152); - for (int i = 0; i < 36; i++) - WRITE_BE_UINT32(_oprAttackDecay + (i << 2), _adtStat[i]); - - delete[] _oprSinTbl; - _oprSinTbl = new uint32[1024]; - for (int i = 0; i < 1024; i++) { - double val = sin((double) (((i << 1) + 1) * PI / 1024.0)); - double d_dcb = log(1.0 / (double)ABS(val)) / log(2.0) * 256.0; - int32 i_dcb = (int32)(2.0 * d_dcb); - i_dcb = (i_dcb & 1) ? (i_dcb >> 1) + 1 : (i_dcb >> 1); - _oprSinTbl[i] = (i_dcb << 1) + (val >= 0.0 ? 0 : 1); - } - - delete[] _oprLevelOut; - _oprLevelOut = new int32[0x1a00]; - for (int i = 0; i < 256; i++) { - double val = floor(65536.0 / pow(2.0, 0.00390625 * (double)(1 + i))); - int32 val_int = ((int32) val) >> 4; - _oprLevelOut[i << 1] = (val_int & 1) ? ((val_int >> 1) + 1) << 2 : (val_int >> 1) << 2; - _oprLevelOut[(i << 1) + 1] = -_oprLevelOut[i << 1]; - for (int ii = 1; ii < 13; ii++) { - _oprLevelOut[(i << 1) + (ii << 9)] = _oprLevelOut[i << 1] >> ii; - _oprLevelOut[(i << 1) + (ii << 9) + 1] = -_oprLevelOut[(i << 1) + (ii << 9)]; - } - } - - uint8 *dtt = new uint8[128]; - memset(dtt, 0, 36); - memset(dtt + 36, 1, 8); - memcpy(dtt + 44, _detSrc, 84); - - delete[] _oprDetune; - _oprDetune = new int32[256]; - for (int i = 0; i < 128; i++) { - _oprDetune[i] = (int32) ((float)dtt[i] * _baserate * 64.0); - _oprDetune[i + 128] = -_oprDetune[i]; - } - - delete[] dtt; -} - -void TownsPC98_OpnCore::nextTick(int32 *buffer, uint32 bufferSize) { - if (!_ready) - return; - - for (int i = 0; i < _numChan; i++) { - TownsPC98_OpnOperator **o = _chanInternal[i].opr; - - if (_chanInternal[i].updateEnvelopeParameters) { - _chanInternal[i].updateEnvelopeParameters = false; - for (int ii = 0; ii < 4 ; ii++) - o[ii]->updatePhaseIncrement(); - } - - for (uint32 ii = 0; ii < bufferSize ; ii++) { - int32 phbuf1, phbuf2, output; - phbuf1 = phbuf2 = output = 0; - - int32 *leftSample = &buffer[ii * 2]; - int32 *rightSample = &buffer[ii * 2 + 1]; - int32 *del = &_chanInternal[i].feedbuf[2]; - int32 *feed = _chanInternal[i].feedbuf; - - switch (_chanInternal[i].algorithm) { - case 0: - o[0]->generateOutput(0, feed, phbuf1); - o[2]->generateOutput(*del, 0, phbuf2); - *del = 0; - o[1]->generateOutput(phbuf1, 0, *del); - o[3]->generateOutput(phbuf2, 0, output); - break; - case 1: - o[0]->generateOutput(0, feed, phbuf1); - o[2]->generateOutput(*del, 0, phbuf2); - o[1]->generateOutput(0, 0, phbuf1); - o[3]->generateOutput(phbuf2, 0, output); - *del = phbuf1; - break; - case 2: - o[0]->generateOutput(0, feed, phbuf2); - o[2]->generateOutput(*del, 0, phbuf2); - o[1]->generateOutput(0, 0, phbuf1); - o[3]->generateOutput(phbuf2, 0, output); - *del = phbuf1; - break; - case 3: - o[0]->generateOutput(0, feed, phbuf2); - o[2]->generateOutput(0, 0, *del); - o[1]->generateOutput(phbuf2, 0, phbuf1); - o[3]->generateOutput(*del, 0, output); - *del = phbuf1; - break; - case 4: - o[0]->generateOutput(0, feed, phbuf1); - o[2]->generateOutput(0, 0, phbuf2); - o[1]->generateOutput(phbuf1, 0, output); - o[3]->generateOutput(phbuf2, 0, output); - *del = 0; - break; - case 5: - o[0]->generateOutput(0, feed, phbuf1); - o[2]->generateOutput(*del, 0, output); - o[1]->generateOutput(phbuf1, 0, output); - o[3]->generateOutput(phbuf1, 0, output); - *del = phbuf1; - break; - case 6: - o[0]->generateOutput(0, feed, phbuf1); - o[2]->generateOutput(0, 0, output); - o[1]->generateOutput(phbuf1, 0, output); - o[3]->generateOutput(0, 0, output); - *del = 0; - break; - case 7: - o[0]->generateOutput(0, feed, output); - o[2]->generateOutput(0, 0, output); - o[1]->generateOutput(0, 0, output); - o[3]->generateOutput(0, 0, output); - *del = 0; - break; - }; - - int32 finOut = (output << 2) / ((_numChan + _numSSG - 3) / 3); - - if ((1 << i) & _volMaskA) - finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; - - if ((1 << i) & _volMaskB) - finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; - - if (_chanInternal[i].enableLeft) - *leftSample += finOut; - - if (_chanInternal[i].enableRight) - *rightSample += finOut; - } - } -} - -TownsPC98_OpnDriver::TownsPC98_OpnDriver(Audio::Mixer *mixer, OpnType type) : TownsPC98_OpnCore(mixer, type), - _channels(0), _ssgChannels(0), _sfxChannels(0), _rhythmChannel(0), - _trackPtr(0), _sfxData(0), _sfxOffs(0), _ssgPatches(0), - _patches(0), _sfxBuffer(0), _musicBuffer(0), - - _opnCarrier(_drvTables + 76), _opnFreqTable(_drvTables + 108), _opnFreqTableSSG(_drvTables + 132), - _opnFxCmdLen(_drvTables + 36), _opnLvlPresets(_drvTables + (type == OD_TOWNS ? 52 : 84)), - - _updateChannelsFlag(type == OD_TYPE26 ? 0x07 : 0x3F), _finishedChannelsFlag(0), - _updateSSGFlag(type == OD_TOWNS ? 0x00 : 0x07), _finishedSSGFlag(0), - _updateRhythmFlag(type == OD_TYPE86 ? 0x01 : 0x00), _finishedRhythmFlag(0), - _updateSfxFlag(0), _finishedSfxFlag(0), - - _musicTickCounter(0), - - _musicVolume(255), _sfxVolume(255), - - _musicPlaying(false), _sfxPlaying(false), _fading(false), _looping(0), _ready(false) { - - _sfxOffsets[0] = _sfxOffsets[1] = 0; -} - -TownsPC98_OpnDriver::~TownsPC98_OpnDriver() { - reset(); - - if (_channels) { - for (int i = 0; i < _numChan; i++) - delete _channels[i]; - delete[] _channels; - } - - if (_ssgChannels) { - for (int i = 0; i < _numSSG; i++) - delete _ssgChannels[i]; - delete[] _ssgChannels; - } - - if (_sfxChannels) { - for (int i = 0; i < 2; i++) - delete _sfxChannels[i]; - delete[] _sfxChannels; - } - - delete _rhythmChannel; - - delete[] _ssgPatches; -} - -bool TownsPC98_OpnDriver::init() { - if (_ready) { - reset(); - return true; - } - - TownsPC98_OpnCore::init(); - - setVolumeChannelMasks(-1, 0); - - _channels = new TownsPC98_OpnChannel *[_numChan]; - for (int i = 0; i < _numChan; i++) { - int ii = i * 6; - _channels[i] = new TownsPC98_OpnChannel(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); - _channels[i]->init(); - } - - if (_numSSG) { - _ssgPatches = new uint8[256]; - memcpy(_ssgPatches, _drvTables + 156, 256); - - _ssgChannels = new TownsPC98_OpnChannelSSG *[_numSSG]; - for (int i = 0; i < _numSSG; i++) { - int ii = i * 6; - _ssgChannels[i] = new TownsPC98_OpnChannelSSG(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); - _ssgChannels[i]->init(); - } - - _sfxChannels = new TownsPC98_OpnSfxChannel *[2]; - for (int i = 0; i < 2; i++) { - int ii = (i + 1) * 6; - _sfxChannels[i] = new TownsPC98_OpnSfxChannel(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); - _sfxChannels[i]->init(); - } - } - - if (_hasPercussion) { - _rhythmChannel = new TownsPC98_OpnChannelPCM(this, 0, 0, 0, 0, 0, 1); - _rhythmChannel->init(); - } - - setMusicTempo(84); - setSfxTempo(654); - - _ready = true; - - return true; -} - -void TownsPC98_OpnDriver::loadMusicData(uint8 *data, bool loadPaused) { - if (!_ready) { - warning("TownsPC98_OpnDriver: Driver must be initialized before loading data"); - return; - } - - if (!data) { - warning("TownsPC98_OpnDriver: Invalid music file data"); - return; - } - - reset(); - - Common::StackLock lock(_mutex); - uint8 *src_a = _trackPtr = _musicBuffer = data; - - for (uint8 i = 0; i < 3; i++) { - _channels[i]->loadData(data + READ_LE_UINT16(src_a)); - src_a += 2; - } - - for (int i = 0; i < _numSSG; i++) { - _ssgChannels[i]->loadData(data + READ_LE_UINT16(src_a)); - src_a += 2; - } - - for (uint8 i = 3; i < _numChan; i++) { - _channels[i]->loadData(data + READ_LE_UINT16(src_a)); - src_a += 2; - } - - if (_hasPercussion) { - _rhythmChannel->loadData(data + READ_LE_UINT16(src_a)); - src_a += 2; - } - - toggleRegProtection(false); - - _patches = src_a + 4; - _finishedChannelsFlag = _finishedSSGFlag = _finishedRhythmFlag = 0; - - _musicPlaying = (loadPaused ? false : true); -} - -void TownsPC98_OpnDriver::loadSoundEffectData(uint8 *data, uint8 trackNum) { - if (!_ready) { - warning("TownsPC98_OpnDriver: Driver must be initialized before loading data"); - return; - } - - if (!_sfxChannels) { - warning("TownsPC98_OpnDriver: Sound effects not supported by this configuration"); - return; - } - - if (!data) { - warning("TownsPC98_OpnDriver: Invalid sound effects file data"); - return; - } - - Common::StackLock lock(_mutex); - _sfxData = _sfxBuffer = data; - _sfxOffsets[0] = READ_LE_UINT16(&_sfxData[(trackNum << 2)]); - _sfxOffsets[1] = READ_LE_UINT16(&_sfxData[(trackNum << 2) + 2]); - _sfxPlaying = true; - _finishedSfxFlag = 0; -} - -void TownsPC98_OpnDriver::reset() { - Common::StackLock lock(_mutex); - - _musicPlaying = false; - _sfxPlaying = false; - _fading = false; - _looping = 0; - _musicTickCounter = 0; - _sfxData = 0; - - TownsPC98_OpnCore::reset(); - - for (int i = 0; i < _numChan; i++) - _channels[i]->reset(); - for (int i = 0; i < _numSSG; i++) - _ssgChannels[i]->reset(); - - if (_numSSG) { - for (int i = 0; i < 2; i++) - _sfxChannels[i]->reset(); - - memcpy(_ssgPatches, _drvTables + 156, 256); - } - - if (_rhythmChannel) - _rhythmChannel->reset(); -} - -void TownsPC98_OpnDriver::fadeStep() { - if (!_musicPlaying) - return; - - Common::StackLock lock(_mutex); - for (int j = 0; j < _numChan; j++) { - if (_updateChannelsFlag & _channels[j]->_idFlag) - _channels[j]->fadeStep(); - } - - for (int j = 0; j < _numSSG; j++) { - if (_updateSSGFlag & _ssgChannels[j]->_idFlag) - _ssgChannels[j]->fadeStep(); - } - - if (!_fading) { - _fading = 19; - if (_hasPercussion) { - if (_updateRhythmFlag & _rhythmChannel->_idFlag) - _rhythmChannel->reset(); - } - } else { - if (!--_fading) - reset(); - } -} - -void TownsPC98_OpnDriver::timerCallbackB() { - _sfxOffs = 0; - - if (_musicPlaying) { - _musicTickCounter++; - - for (int i = 0; i < _numChan; i++) { - if (_updateChannelsFlag & _channels[i]->_idFlag) { - _channels[i]->processEvents(); - _channels[i]->processFrequency(); - } - } - - for (int i = 0; i < _numSSG; i++) { - if (_updateSSGFlag & _ssgChannels[i]->_idFlag) { - _ssgChannels[i]->processEvents(); - _ssgChannels[i]->processFrequency(); - } - } - - if (_hasPercussion) - if (_updateRhythmFlag & _rhythmChannel->_idFlag) - _rhythmChannel->processEvents(); - } - - toggleRegProtection(false); - - if (_finishedChannelsFlag == _updateChannelsFlag && _finishedSSGFlag == _updateSSGFlag && _finishedRhythmFlag == _updateRhythmFlag) - _musicPlaying = false; -} - -void TownsPC98_OpnDriver::timerCallbackA() { - if (_sfxChannels && _sfxPlaying) { - if (_sfxData) - startSoundEffect(); - - _sfxOffs = 3; - _trackPtr = _sfxBuffer; - - for (int i = 0; i < 2; i++) { - if (_updateSfxFlag & _sfxChannels[i]->_idFlag) { - _sfxChannels[i]->processEvents(); - _sfxChannels[i]->processFrequency(); - } - } - - _trackPtr = _musicBuffer; - } - - if (_updateSfxFlag && _finishedSfxFlag == _updateSfxFlag) { - _sfxPlaying = false; - _updateSfxFlag = 0; - setVolumeChannelMasks(-1, 0); - } -} - -void TownsPC98_OpnDriver::setMusicTempo(uint8 tempo) { - writeReg(0, 0x26, tempo); - writeReg(0, 0x27, 0x33); -} - -void TownsPC98_OpnDriver::setSfxTempo(uint16 tempo) { - writeReg(0, 0x24, tempo & 0xff); - writeReg(0, 0x25, tempo >> 8); - writeReg(0, 0x27, 0x33); -} - -void TownsPC98_OpnDriver::startSoundEffect() { - int volFlags = 0; - - for (int i = 0; i < 2; i++) { - if (_sfxOffsets[i]) { - _ssgChannels[i + 1]->protect(); - _sfxChannels[i]->reset(); - _sfxChannels[i]->loadData(_sfxData + _sfxOffsets[i]); - _updateSfxFlag |= _sfxChannels[i]->_idFlag; - volFlags |= (_sfxChannels[i]->_idFlag << _numChan); - } else { - _ssgChannels[i + 1]->restore(); - _updateSfxFlag &= ~_sfxChannels[i]->_idFlag; - } - } - - setVolumeChannelMasks(~volFlags, volFlags); - _sfxData = 0; -} - -const uint8 TownsPC98_OpnDriver::_drvTables[] = { - // channel presets - 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x80, 0x01, 0x01, 0x00, 0x02, - 0x02, 0x80, 0x02, 0x02, 0x00, 0x04, - 0x00, 0x80, 0x03, 0x04, 0x01, 0x08, - 0x01, 0x80, 0x04, 0x05, 0x01, 0x10, - 0x02, 0x80, 0x05, 0x06, 0x01, 0x20, - - // control event size - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x05, - 0x02, 0x06, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, - - // fmt level presets - 0x54, 0x50, 0x4C, 0x48, 0x44, 0x40, 0x3C, 0x38, - 0x34, 0x30, 0x2C, 0x28, 0x24, 0x20, 0x1C, 0x18, - 0x14, 0x10, 0x0C, 0x08, 0x04, 0x90, 0x90, 0x90, - - // carriers - 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0E, 0x0E, 0x0F, - - // pc98 level presets - 0x40, 0x3B, 0x38, 0x34, 0x30, 0x2A, 0x28, 0x25, - 0x22, 0x20, 0x1D, 0x1A, 0x18, 0x15, 0x12, 0x10, - 0x0D, 0x0A, 0x08, 0x05, 0x02, 0x90, 0x90, 0x90, - - // frequencies - 0x6A, 0x02, 0x8F, 0x02, 0xB6, 0x02, 0xDF, 0x02, - 0x0B, 0x03, 0x39, 0x03, 0x6A, 0x03, 0x9E, 0x03, - 0xD5, 0x03, 0x10, 0x04, 0x4E, 0x04, 0x8F, 0x04, - - // ssg frequencies - 0xE8, 0x0E, 0x12, 0x0E, 0x48, 0x0D, 0x89, 0x0C, - 0xD5, 0x0B, 0x2B, 0x0B, 0x8A, 0x0A, 0xF3, 0x09, - 0x64, 0x09, 0xDD, 0x08, 0x5E, 0x08, 0xE6, 0x07, - - // ssg patch data - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, - 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0x37, 0x81, 0xC8, 0x00, - 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0x37, 0x81, 0xC8, 0x00, - 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, - 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, - 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, - 0x04, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, - 0x0A, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0x01, 0x00, - 0xFF, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, - 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0x00, - 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x64, 0x01, 0xFF, 0x64, 0xFF, 0x81, 0xFF, 0x00, - 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - - 0x02, 0x01, 0xFF, 0x28, 0xFF, 0x81, 0xF0, 0x00, - 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xC8, 0x00, - 0x01, 0x81, 0x00, 0x00, 0x28, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0x78, 0x5F, 0x81, 0xA0, 0x00, - 0x05, 0x81, 0x00, 0x00, 0x28, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, - 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, - 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, - 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, - 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00 -}; +namespace Kyra { SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer) - : Sound(vm, mixer), _lastTrack(-1), _currentSFX(0), _sfxFileData(0), - _sfxFileIndex((uint)-1), _sfxWDTable(0), _sfxBTTable(0), _parser(0) { + : Sound(vm, mixer), _lastTrack(-1), _currentSFX(0), _musicTrackData(0), _sfxFileData(0), _cdaPlaying(0), + _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46) { - _driver = new Towns_EuphonyDriver(_mixer); - int ret = open(); - if (ret != MERR_ALREADY_OPEN && ret != 0) - error("couldn't open midi driver"); + _driver = new TownsEuphonyDriver(_mixer); } SoundTowns::~SoundTowns() { AudioCD.stop(); haltTrack(); + delete[] _musicTrackData; delete[] _sfxFileData; - - Common::StackLock lock(_mutex); - _driver->setTimerCallback(0, 0); - close(); - - _driver = 0; } bool SoundTowns::init() { _vm->checkCD(); int unused = 0; + _musicFadeTable = _vm->staticres()->loadRawData(k1TownsMusicFadeTable, unused); _sfxWDTable = _vm->staticres()->loadRawData(k1TownsSFXwdTable, unused); _sfxBTTable = _vm->staticres()->loadRawData(k1TownsSFXbtTable, unused); + _musicTrackData = new uint8[50570]; + + if (!_driver->init()) + return false; - return loadInstruments(); + if (!loadInstruments()) + return false; + + return true; } void SoundTowns::process() { @@ -3944,8 +92,10 @@ void SoundTowns::playTrack(uint8 track) { if (_musicEnabled == 2 && trackNum != -1) { AudioCD.play(trackNum+1, loop ? -1 : 1, 0, 0); AudioCD.updateCD(); + _cdaPlaying = true; } else if (_musicEnabled) { playEuphonyTrack(READ_LE_UINT32(&tTable[tTableIndex]), loop); + _cdaPlaying = false; } _lastTrack = track; @@ -3955,15 +105,15 @@ void SoundTowns::haltTrack() { _lastTrack = -1; AudioCD.stop(); AudioCD.updateCD(); - if (_parser) { - Common::StackLock lock(_mutex); - _parser->setTrack(0); - _parser->jumpToTick(0); - _parser->unloadMusic(); - delete _parser; - _parser = 0; - } - _driver->queue()->release(); + _cdaPlaying = false; + + for (int i = 0; i < 6; i++) + _driver->chanVolume(i, 0); + for (int i = 0x40; i < 0x46; i++) + _driver->chanVolume(i, 0); + for (int i = 0; i < 32; i++) + _driver->chanEnable(i, 0); + _driver->stopParser(); } void SoundTowns::loadSoundFile(uint file) { @@ -3977,27 +127,26 @@ void SoundTowns::loadSoundFile(uint file) { void SoundTowns::playSoundEffect(uint8 track) { if (!_sfxEnabled || !_sfxFileData) return; - + if (track == 0 || track == 10) { - _mixer->stopHandle(_sfxHandle); + stopAllSoundEffects(); return; } else if (track == 1) { - // sfx fadeout - _mixer->stopHandle(_sfxHandle); + fadeOutSoundEffects(); return; } - uint8 note = 0x3c; + uint8 note = 60; if (_sfxFileIndex == 5) { - if (track == 0x10) { - note = 0x3e; - track = 0x0f; - } else if (track == 0x11) { - note = 0x40; - track = 0x0f; - } else if (track == 0x12) { - note = 0x41; - track = 0x0f; + if (track == 16) { + note = 62; + track = 15; + } else if (track == 17) { + note = 64; + track = 15; + } else if (track == 18) { + note = 65; + track = 15; } } @@ -4006,32 +155,37 @@ void SoundTowns::playSoundEffect(uint8 track) { if (offset == -1) return; - uint32 *sfxHeader = (uint32 *)(fileBody + offset); + if (!_driver->soundEffectIsPlaying(_sfxChannel ^ 1)) { + _sfxChannel ^= 1; + } else if (_driver->soundEffectIsPlaying(_sfxChannel)) { + _sfxChannel ^= 1; + _driver->stopSoundEffect(_sfxChannel); + } + uint32 *sfxHeader = (uint32 *)(fileBody + offset); uint32 sfxHeaderID = READ_LE_UINT32(sfxHeader); - uint32 sfxHeaderInBufferSize = READ_LE_UINT32(&sfxHeader[1]); - uint32 sfxHeaderOutBufferSize = READ_LE_UINT32(&sfxHeader[3]); - uint32 sfxRootNoteOffs = READ_LE_UINT32(&sfxHeader[7]); - uint32 sfxRate = READ_LE_UINT32(&sfxHeader[6]); + uint32 playbackBufferSize = sfxHeaderID == 1 ? 30704 : READ_LE_UINT32(&sfxHeader[3]); - uint32 playbackBufferSize = (sfxHeaderID == 1) ? sfxHeaderInBufferSize : sfxHeaderOutBufferSize; + uint8 *sfxPlaybackBuffer = new uint8[playbackBufferSize + 32]; + memcpy(sfxPlaybackBuffer, fileBody + offset, 32); - uint8 *sfxPlaybackBuffer = (uint8 *)malloc(playbackBufferSize); - memset(sfxPlaybackBuffer, 0x80, playbackBufferSize); + uint8 *dst = sfxPlaybackBuffer + 32; + memset(dst, 0x80, playbackBufferSize); uint8 *sfxBody = ((uint8 *)sfxHeader) + 0x20; if (!sfxHeaderID) { - memcpy(sfxPlaybackBuffer, sfxBody, playbackBufferSize); + memcpy(dst, sfxBody, playbackBufferSize); } else if (sfxHeaderID == 1) { - Screen::decodeFrame4(sfxBody, sfxPlaybackBuffer, playbackBufferSize); + Screen::decodeFrame4(sfxBody, dst, playbackBufferSize); } else if (_sfxWDTable) { - uint8 *tgt = sfxPlaybackBuffer; + uint8 *tgt = dst; uint32 sfx_BtTable_Offset = 0; uint32 sfx_WdTable_Offset = 0; uint32 sfx_WdTable_Number = 5; + uint32 inSize = READ_LE_UINT32(&sfxHeader[1]); - for (uint32 i = 0; i < sfxHeaderInBufferSize; i++) { + for (uint32 i = 0; i < inSize; i++) { sfx_WdTable_Offset = (sfx_WdTable_Number * 3 << 9) + sfxBody[i] * 6; sfx_WdTable_Number = READ_LE_UINT16(_sfxWDTable + sfx_WdTable_Offset); @@ -4043,124 +197,161 @@ void SoundTowns::playSoundEffect(uint8 track) { } } - for (uint32 i = 0; i < playbackBufferSize; i++) { - if (sfxPlaybackBuffer[i] < 0x80) - sfxPlaybackBuffer[i] = 0x80 - sfxPlaybackBuffer[i]; - } - - playbackBufferSize -= 0x20; - - uint32 outputRate = uint32(11025 * calculatePhaseStep(note, sfxRootNoteOffs, sfxRate, 11025, 0x2000)); + _driver->chanVolume(_sfxChannel, 127); + _driver->chanStereo(_sfxChannel, 0x40); + _driver->chanPitch(_sfxChannel, 0); + _driver->playSoundEffect(_sfxChannel, note, 127, sfxPlaybackBuffer); +} - _currentSFX = Audio::makeRawStream(sfxPlaybackBuffer, playbackBufferSize, - outputRate, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN); - _mixer->playStream(Audio::Mixer::kSFXSoundType, &_sfxHandle, _currentSFX); +void SoundTowns::stopAllSoundEffects() { + _driver->chanVolume(0x46, 0); + _driver->chanVolume(0x47, 0); + _driver->stopSoundEffect(0x46); + _driver->stopSoundEffect(0x47); + _sfxChannel = 0x46; } void SoundTowns::beginFadeOut() { - _lastTrack = -1; - _driver->fading(); + if (_cdaPlaying) { + for (int i = 118; i > 103; i--) { + _driver->cdaSetVolume(1, i, i); + _vm->delay(2 * _vm->tickLength()); + } - // TODO: this should fade out too - AudioCD.stop(); - AudioCD.updateCD(); -} + for (int i = 103; i > 83; i -= 2) { + _driver->cdaSetVolume(1, i, i); + _vm->delay(2 * _vm->tickLength()); + } -int SoundTowns::open() { - if (!_driver) - return 255; + for (int i = 83; i > 58; i -= 2) { + _driver->cdaSetVolume(1, i, i); + _vm->delay(_vm->tickLength()); + } - int ret = _driver->open(); - if (ret) - return ret; + for (int i = 58; i > 0; i--) + _driver->cdaSetVolume(1, i, i); - _driver->setTimerCallback(this, &onTimer); - return 0; -} + _driver->cdaSetVolume(1, 0, 0); -void SoundTowns::close() { - if (_driver) - _driver->close(); -} + } else { + if (_lastTrack == -1) + return; -void SoundTowns::send(uint32 b) { - _driver->send(b); -} + uint32 ticks = 2; + int tickAdv = 0; + + uint16 fadeVolCur[12]; + uint16 fadeVolStep[12]; + + for (int i = 0; i < 6; i++) { + fadeVolCur[i] = READ_LE_UINT16(&_musicFadeTable[(_lastTrack * 12 + i) * 2]); + fadeVolStep[i] = fadeVolCur[i] / 50; + fadeVolCur[i + 6] = READ_LE_UINT16(&_musicFadeTable[(_lastTrack * 12 + 6 + i) * 2]); + fadeVolStep[i + 6] = fadeVolCur[i + 6] / 30; + } + + for (int i = 0; i < 12; i++) { + for (int ii = 0; ii < 6; ii++) + _driver->chanVolume(ii, fadeVolCur[ii]); + for (int ii = 0x40; ii < 0x46; ii++) + _driver->chanVolume(ii, fadeVolCur[ii - 0x3a]); -uint32 SoundTowns::getBaseTempo() { - return _driver ? _driver->getBaseTempo() : 0; + for (int ii = 0; ii < 6; ii++) { + fadeVolCur[ii] -= fadeVolStep[ii]; + if (fadeVolCur[ii] < 10) + fadeVolCur[ii] = 0; + fadeVolCur[ii + 6] -= fadeVolStep[ii + 6]; + if (fadeVolCur[ii + 6] < 10) + fadeVolCur[ii + 6] = 0; + } + + if (++tickAdv == 3) { + tickAdv = 0; + ticks += 2; + } + _vm->delay(ticks * _vm->tickLength()); + } + } + + haltTrack(); } bool SoundTowns::loadInstruments() { uint8 *twm = _vm->resource()->fileData("twmusic.pak", 0); if (!twm) return false; - _driver->queue()->loadDataToCurrentPosition(twm, 0x8BF0); - _driver->loadFmInstruments(_driver->queue()->trackData() + 8); - _driver->queue()->loadDataToCurrentPosition(twm + 0x0CA0, 0xC58A); - _driver->loadWaveInstruments(_driver->queue()->trackData() + 8); + Common::StackLock lock(_mutex); + + Screen::decodeFrame4(twm, _musicTrackData, 50570); + for (int i = 0; i < 128; i++) + _driver->loadInstrument(0, i, &_musicTrackData[i * 48 + 8]); + + Screen::decodeFrame4(twm + 3232, _musicTrackData, 50570); + for (int i = 0; i < 32; i++) + _driver->loadInstrument(0x40, i, &_musicTrackData[i * 128 + 8]); + + _driver->unloadWaveTable(-1); + uint8 *src = &_musicTrackData[32 * 128 + 8]; + for (int i = 0; i < 10; i++) { + _driver->loadWaveTable(src); + src = src + READ_LE_UINT16(&src[12]) + 32; + } + + _driver->reserveSfxChannels(2); + delete[] twm; - _driver->queue()->release(); return true; } void SoundTowns::playEuphonyTrack(uint32 offset, int loop) { - uint8 *twm = _vm->resource()->fileData("twmusic.pak", 0); Common::StackLock lock(_mutex); - if (!_parser) { - _parser = new Towns_EuphonyParser(_driver->queue()); - _parser->setMidiDriver(this); - _parser->setTimerRate(getBaseTempo()); - } - - _parser->property(MidiParser::mpAutoLoop, loop); - _parser->loadMusic(twm + 0x4b70 + offset, 0xC58A); - + uint8 *twm = _vm->resource()->fileData("twmusic.pak", 0); + Screen::decodeFrame4(twm + 19312 + offset, _musicTrackData, 50570); delete[] twm; -} -void SoundTowns::onTimer(void *data) { - SoundTowns *music = (SoundTowns *)data; - Common::StackLock lock(music->_mutex); - if (music->_parser) - music->_parser->onTimer(); -} + const uint8 *src = _musicTrackData + 852; + for (int i = 0; i < 32; i++) + _driver->chanEnable(i, *src++); + for (int i = 0; i < 32; i++) + _driver->chanMode(i, *src++); + for (int i = 0; i < 32; i++) + _driver->chanOrdr(i, *src++); + for (int i = 0; i < 32; i++) + _driver->chanLevel(i, *src++); + for (int i = 0; i < 32; i++) + _driver->chanTranspose(i, *src++); + + src = _musicTrackData + 1748; + for (int i = 0; i < 6; i++) + _driver->assignChannel(i, *src++); + for (int i = 0x40; i < 0x46; i++) + _driver->assignChannel(i, *src++); -float SoundTowns::calculatePhaseStep(int8 semiTone, int8 semiToneRootkey, - uint32 sampleRate, uint32 outputRate, int32 pitchWheel) { - if (semiTone < 0) - semiTone = 0; - if (semiTone > 119) - semiTone = 119; - if (semiTone < 0) - semiTone = 0; - if (semiTone > 119) - semiTone = 119; + uint32 trackSize = READ_LE_UINT32(_musicTrackData + 2048); + uint8 startTick = _musicTrackData[2052]; + + _driver->setMusicTempo(_musicTrackData[2053]); - static const float noteFrq[] = { - 0004.13f, 0004.40f, 0004.64f, 0004.95f, 0005.16f, 0005.50f, 0005.80f, 0006.19f, 0006.60f, 0006.86f, - 0007.43f, 0007.73f, 0008.25f, 0008.80f, 0009.28f, 0009.90f, 0010.31f, 0011.00f, 0011.60f, 0012.38f, - 0013.20f, 0013.75f, 0014.85f, 0015.47f, 0016.50f, 0017.60f, 0018.56f, 0019.80f, 0020.63f, 0022.00f, - 0023.21f, 0024.75f, 0026.40f, 0027.50f, 0029.70f, 0030.94f, 0033.00f, 0035.20f, 0037.16f, 0039.60f, - 0041.25f, 0044.00f, 0046.41f, 0049.50f, 0052.80f, 0055.00f, 0059.40f, 0061.88f, 0066.00f, 0070.40f, - 0074.25f, 0079.20f, 0082.50f, 0088.00f, 0092.83f, 0099.00f, 0105.60f, 0110.00f, 0118.80f, 0123.75f, - 0132.00f, 0140.80f, 0148.50f, 0158.40f, 0165.00f, 0176.00f, 0185.65f, 0198.00f, 0211.20f, 0220.00f, - 0237.60f, 0247.50f, 0264.00f, 0281.60f, 0297.00f, 0316.80f, 0330.00f, 0352.00f, 0371.30f, 0396.00f, - 0422.40f, 0440.00f, 0475.20f, 0495.00f, 0528.00f, 0563.20f, 0594.00f, 0633.60f, 0660.00f, 0704.00f, - 0742.60f, 0792.00f, 0844.80f, 0880.00f, 0950.40f, 0990.00f, 1056.00f, 1126.40f, 1188.00f, 1267.20f, - 1320.00f, 1408.00f, 1485.20f, 1584.00f, 1689.60f, 1760.00f, 1900.80f, 1980.00f, 2112.00f, 2252.80f, - 2376.00f, 2534.40f, 2640.00f, 2816.00f, 2970.40f, 3168.00f, 3379.20f, 3520.00f, 3801.60f, 3960.00f - }; + src = _musicTrackData + 2054; + uint32 l = READ_LE_UINT32(src + trackSize); + trackSize += (l + 4); + l = READ_LE_UINT32(src + trackSize); + trackSize += (l + 4); - float pwModifier = (pitchWheel - 0x2000) / 0x2000; - int8 d = pwModifier ? (pwModifier < 0 ? -1 : 1) : 0; - float rateshift = (noteFrq[semiTone] - ((noteFrq[semiTone] - - noteFrq[semiTone + d]) * pwModifier * d)) / noteFrq[semiToneRootkey]; + _driver->setMusicLoop(loop); + _driver->startMusicTrack(src, trackSize, startTick); +} - return (float)sampleRate * 10.0f * rateshift / outputRate; +void SoundTowns::fadeOutSoundEffects() { + for (int i = 127; i > 0; i-= 12) { + _driver->chanVolume(0x46, i); + _driver->chanVolume(0x47, i); + _vm->delay(_vm->tickLength()); + } + stopAllSoundEffects(); } SoundPC98::SoundPC98(KyraEngine_v1 *vm, Audio::Mixer *mixer) : @@ -4174,7 +365,7 @@ SoundPC98::~SoundPC98() { } bool SoundPC98::init() { - _driver = new TownsPC98_OpnDriver(_mixer, TownsPC98_OpnDriver::OD_TYPE26); + _driver = new TownsPC98_AudioDriver(_mixer, TownsPC98_AudioDriver::kType26); bool reslt = _driver->init(); updateVolumeSettings(); return reslt; @@ -4255,6 +446,7 @@ void SoundPC98::updateVolumeSettings() { return; bool mute = false; + _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); @@ -4275,8 +467,8 @@ SoundTownsPC98_v2::~SoundTownsPC98_v2() { } bool SoundTownsPC98_v2::init() { - _driver = new TownsPC98_OpnDriver(_mixer, _vm->gameFlags().platform == Common::kPlatformPC98 ? - TownsPC98_OpnDriver::OD_TYPE86 : TownsPC98_OpnDriver::OD_TOWNS); + _driver = new TownsPC98_AudioDriver(_mixer, _vm->gameFlags().platform == Common::kPlatformPC98 ? + TownsPC98_AudioDriver::kType86 : TownsPC98_AudioDriver::kTypeTowns); if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { _vm->checkCD(); @@ -4437,9 +629,7 @@ int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, sfx[i] = cmd; } - uint32 outputRate = uint32(11025 * SoundTowns::calculatePhaseStep(0x3c, 0x3c, sfxRate, 11025, 0x2000)); - - _currentSFX = Audio::makeRawStream(sfx, outsize, outputRate, + _currentSFX = Audio::makeRawStream(sfx, outsize, 11025, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN); _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundChannels[h], _currentSFX); if (handle) @@ -4461,6 +651,7 @@ void SoundTownsPC98_v2::updateVolumeSettings() { return; bool mute = false; + _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); if (ConfMan.hasKey("mute")) mute = ConfMan.getBool("mute"); @@ -4468,158 +659,6 @@ void SoundTownsPC98_v2::updateVolumeSettings() { _driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume"))); } -// static resources - -const uint32 TownsPC98_OpnCore::_adtStat[] = { - 0x00010001, 0x00010001, 0x00010001, 0x01010001, - 0x00010101, 0x00010101, 0x00010101, 0x01010101, - 0x01010101, 0x01010101, 0x01010102, 0x01010102, - 0x01020102, 0x01020102, 0x01020202, 0x01020202, - 0x02020202, 0x02020202, 0x02020204, 0x02020204, - 0x02040204, 0x02040204, 0x02040404, 0x02040404, - 0x04040404, 0x04040404, 0x04040408, 0x04040408, - 0x04080408, 0x04080408, 0x04080808, 0x04080808, - 0x08080808, 0x08080808, 0x10101010, 0x10101010 -}; - -const uint8 TownsPC98_OpnCore::_detSrc[] = { - 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, - 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, - 0x16, 0x16, 0x16, 0x16 -}; - -const int TownsPC98_OpnCore::_ssgTables[] = { - 0x01202A, 0x0092D2, 0x006B42, 0x0053CB, 0x003DF8, 0x003053, 0x0022DA, 0x001A8C, - 0x00129B, 0x000DC1, 0x000963, 0x0006C9, 0x000463, 0x0002FA, 0x0001B6, 0x0000FB, - 0x0193B6, 0x01202A, 0x00CDB1, 0x0092D2, 0x007D7D, 0x006B42, 0x005ECD, 0x0053CB, - 0x00480F, 0x003DF8, 0x0036B9, 0x003053, 0x00290A, 0x0022DA, 0x001E6B, 0x001A8C, - 0x001639, 0x00129B, 0x000FFF, 0x000DC1, 0x000B5D, 0x000963, 0x0007FB, 0x0006C9, - 0x000575, 0x000463, 0x00039D, 0x0002FA, 0x000242, 0x0001B6, 0x00014C, 0x0000FB -}; - -const uint8 TownsPC98_OpnCore::_percussionData[] = { - 0,24,1,192,1,216,2,128,4,88,23,64,27,152,1,128,29,24,2,128,31,152,0,128,136,128,128,128,0,136,97,103,153,139,34,163,72,195,27,69,1,154,137,35,8,51,169,122,164,75,133,203,81,146,168,121,185,68,202,8,33,237,49,177,12,133,140,17,160,42,161,10,0,137,176, 57, - 233,41,160,136,235,65,177,137,128,26,164,28,3,157,51,137,1,152,113,161,40,146,115,192,56,5,169,66,161,56,1,50,145,59,39,168,97,1,160,57,7,153,50,153,32,2,25,129,32,20,186,66,129,24,153,164,142,130,169,153,26,242,138,217,9,128,204,58,209,172,40, 176, 141, - 128,155,144,203,139,0,235,9,177,172,0,185,168,138,25,240,59,211,139,19,176,90,160,17,26,132,41,1,5,25,3,50,144,115,147,42,39,152,41,3,56,193,105,130,155,66,200,26,19,218,154,49,201,171,138,176,251,139,185,172,136,189,139,145,207,41,160,171,152, 186, 139, - 186,141,128,218,171,51,217,170,56,163,12,4,155,81,147,42,37,152,32,54,136,49,50,48,37,32,69,0,17,50,50,83,2,16,68,20,8,66,4,154,84,145,24,33,24,32,17,18,145,32,22,168,49,163,1,33,50,184,115,129,25,66,1,24,67,2,80,35,40,53,2,65,51,19,67,37,0,52,35,49, 37, - 34,49,37,17,52,17,35,35,35,34,32,49,33,152,34,145,24,24,128,138,128,184,9,177,171,168,185,155,152,172,155,186,172,185,172,155,186,173,153,202,187,185,202,170,171,202,186,169,170,170,171,139,154,171,153,154,169,10,168,154,128,168,154,0,153, 152, 136, 137, - 128,153,0,152,8,128,137,0,136,136,8,9,8,9,8,24,153,128,136,153,144,0,161,138,1,169,136,128,160,168,152,153,138,137,154,153,153,154,153,170,168,170,185,168,169,154,169,171,153,169,170,153,152,154,153,137,169,137,136,144,152,144,128,128,144,129,129, 0, 33, - 0,17,17,17,33,33,18,18,34,34,34,34,34,34,35,19,35,19,35,35,18,19,18,35,18,33,0,8,8,8,8,8,8,8,160,205,65,176,171,203,16,240,95,242,120,145,156,66,177,26,19,153,9,35,35,239,56,132,138,154,50,145,203,25,32,20,237,24,130,138,160,27,39,173,50,203,64,145, 139, - 18,168,48,146,171,65,18,176,12,52,128,25,5,57,240,104,161,25,129,18,188,114,160,26,36,200,154,18,1,128,186,73,162,173,32,184,25,144,137,234,8,154,32,160,158,18,187,81,2,235,41,36,144,154,17,67,128,33,160,114,146,26,37,33,232,41,130,41,178,29,50, 251, 24, - 1,153,138,160,76,179,155,11,0,38,252,41,146,41,178,27,193,43,39,170,136,17,129,8,49,233,48,129,11,6,26,130,136,128,64,1,248,105,145,9,16,144,140,5,25,168,16,186,48,5,171,217,57,134,171,8,34,188,20,203,41,6,155,161,89,164,140,2,136,51,202,41,131, 56, 144, - 8,97,144,146,13,69,200,42,130,25,152,57,6,220,88,177,26,148,9,168,8,67,192,156,65,145,137,10,4,154,18,157,67,160,154,1,50,188,82,170,82,185,49,220,97,144,10,8,16,145,9,136,18,202,51,184,141,114,179,139,24,19,8,250,121,160,40,160,10,18,152,168,42,35, 216, - 187,120,145,18,156,203,84,144,9,144,26,66,161,13,1,128,17,154,18,142,6,154,65,192,29,35,186,64,192,24,9,146,56,185,16,248,121,176,40,129,136,171,96,147,140,50,203,64,144,41,128,161,187,71,200,24,129,24,217,56,20,220,24,4,169,9,1,33,201,26,134,141,51,201, - 25,16,33,235,32,144,33,153,169,99,160,11,3,136,58,210,33,203,48,163,17,219,128,140,38,8,184,141,50,131,159,33,128,153,25,18,153,88,242,43,3,9,136,157,53,202,40,145,25,2,204,105,146,156,66,152,8,153,33,128,129,136,153,50,186,55,188,51,249,64,178, 27, 128, - 48,177,156,18,35,175,51,189,32,51,234,155,69,184,26,2,152,9,17,136,144,137,50,235,115,216,24,2,170,67,187,49,129,155,4,27,129,56,232,43,39,203,40,3,154,169,66,184,114,224,25,2,9,128,11,35,155,18,11,202,84,169,26,5,154,8,160,98,185,17,187,50, 23, 188, 33, - 1,139,4,154,90,147,12,3,43,2,170,171,103,193,28,132,137,8,129,24,170,50,201,42,35,202,169,52,201,33,218,40,39,203,0,40,147,29,163,139,83,185,1,4,159,34,160,12,21,155,40,129,137,58,151,13,2,136,144,16,153,40,17,131,207,51,144,140,4,154,17,146,170,73, 163, - 44,164,12,152,37,203,17,128,144,139,23,154,128,138,38,216,41,1,0,233,73,131,171,49,136,9,164,46,3,171,32,0,145,157,38,187,64,176,58,134,155,18,136,217,64,1,200,140,38,153,170,66,161,8,169,65,185,98,200,41,3,155,144,58,23,187,1,145,40,147,189,32, 68, 249, - 1,112,255,199,195,19,108,76,187,247,247,183,40,168,212,245,199,227,68,45,59,10,145,177,198,24,130,76,26,193,180,129,0,162,42,160,199,162,0,16,152,137,132,168,195,130,162,181,227,163,161,179,211,180,179,164,128,162,161,194,164,179,40,153,195,213,146, 178, - 147,176,50,186,161,196,151,58,16,28,162,160,131,122,155,33,241,146,128,40,26,128,154,36,170,89,59,9,24,144,77,161,8,177,112,139,33,232,148,24,41,61,9,26,162,32,30,58,153,32,59,73,59,11,79,137,57,9,49,30,24,153,131,25,106,61,153,73,28,56,27, 41, 137, 148, - 76,43,74,58,13,161,3,171,149,32,77,10,74,42,168,16,0,123,138,129,162,178,225,50,140,161,0,147,10,129,41,244,210,165,1,152,24,162,184,166,32,144,59,216,132,177,8,145,67,143,146,160,183,162,130,24,192,32,225,146,144,33,44,73,30,129,137,32,76, 152, 25, 161, - 2,154,32,177,132,232,2,136,210,128,149,177,32,58,27,168,225,133,8,44,107,136,25,136,17,26,58,46,16,11,145,17,144,79,136,144,136,145,152,33,31,162,130,200,82,153,74,137,147,26,0,13,133,170,149,16,192,0,178,0,128,152,182,150,9,16,9,137,33,59,63,10,152, 32, - 179,192,5,154,228,182,145,130,144,42,128,242,2,136,41,168,17,76,57,31,129,136,17,47,8,41,138,32,138,123,59,58,10,136,161,4,46,25,145,136,129,25,56,28,91,41,154,108,9,16,44,24,137,48,15,0,194,162,41,194,56,241,163,146,0,139,7,186,150,129,152,1,208,33,176, - 136,164,163,185,7,138,130,242,162,163,177,88,136,184,166,146,0,25,25,177,199,146,16,136,9,145,178,178,0,147,138,229,18,152,25,144,163,246,162,129,129,184,5,152,178,145,148,136,146,95,152,128,144,33,170,81,11,40,202,131,0,243,24,1,11,148,42, 24, 163, 140, - 120,9,76,58,153,145,56,30,72,46,42,9,8,57,91,76,59,26,160,129,41,76,10,57,192,163,129,16,225,2,27,40,200,48,91,226,40,145,43,177,177,182,196,145,33,184,165,17,192,163,194,129,211,128,162,197,129,0,136,211,146,8,162,144,0,167,160,1,176,150,137,1, 24, 243, - 0,129,145,25,123,169,130,168,132,41,63,42,136,137,120,26,136,8,24,89,29,58,177,193,147,1,26,162,176,167,180,8,49,28,29,178,162,88,43,42,57,43,61,8,29,129,128,128,123,137,24,243,16,136,16,46,0,169,149,128,1,60,153,72,154,90,25,25,25,8,91,73,12,16,137,144, - 72,11,8,167,128,129,9,138,166,193,147,162,123,137,145,1,162,26,1,219,147,129,210,147,243,1,243,16,144,145,160,131,200,4,59,75,57,218,2,178,77,24,60,11,147,10,50,141,64,27,185,122,161,41,128,90,136,24,46,16,139,16,24,28,124,9,41,8,26,121,10,42,40,139,129, - 0,201,135,137,56,176,176,35,215,145,1,26,145,144,160,135,138,1,177,146,146,161,65,242,136,164,177,1,1,186,151,208,148,129,10,32,241,145,163,178,17,168,136,151,168,2,148,185,133,176,130,129,154,163,215,0,146,136,40,211,161,131,171,81,144,170, 21, 184, 56, - 195,168,133,177,91,16,187,5,145,153,66,172,18,177,42,120,138,27,134,26,106,42,138,146,184,66,75,46,41,168,0,145,57,91,75,27,24,27,48,169,40,122,9,109,10,8,177,146,16,74,30,129,160,162,146,41,124,138,24,145,152,3,1,14,3,139,1,192,161,151,177,122,8, 10, 0, - 176,130,129,27,88,225,0,2,154,129,129,193,49,203,81,153,226,33,0,30,0,176,179,18,9,96,156,162,148,160,129,2,29,195,128,0,56,156,20,232,129,128,32,10,144,74,183,9,145,162,1,162,138,23,171,1,164,224,34,43,43,177,200,135,161,91,57,154,177,148, 145, 146, 58, - 108,136,170,35,208,177,34,128,44,129,155,151,243,16,1,154,72,193,144,18,11,122,160,153,5,192,24,130,184,132,226,0,128,153,131,181,136,65,154,128,17,170,39,28,59,144,168,80,25,47,24,26,144,32,47,41,153,161,148,8,92,9,9,129,144,33,26,47,24,137,108, 25, 10, - 17,10,73,75,47,24,184,48,8,45,57,138,136,150,10,48,139,136,35,203,121,8,27,179,161,106,0,29,16,176,179,3,185,19,227,41,145,168,61,197,177,20,10,57,42,250,147,196,16,41,138,24,195,208,135,137,0,145,160,2,210,146,195,177,132,136,153,167,210,146,162, 40, 8, - 138,148,227,145,17,137,40,169,179,130,242,2,196,9,146,145,169,167,146,130,137,136,51,220,17,163,28,74,10,76,40,140,5,137,43,18,12,107,137,40,8,201,50,0,143,3,138,161,134,138,104,169,16,162,160,121,25,28,129,152,32,56,14,16,184,146,3,46,25, 176, 129, 179, - 193,17,130,202,135,8,57,25,154,148,184,120,9,153,211,165,24,128,26,17,242,161,18,185,81,42,11,17,12,25,181,137,66,42,47,41,184,166,129,24,91,27,136,196,0,0,74,28,178,161,149,160,32,8,225,32,128,59,8,169,50,139,47,72,186,16,132,9,122,9,160,146,144,89,153, - 10,149,178,0,121,11,146,152,162,48,13,123,177,24,0,106,27,9,144,132,12,17,0,168,0,181,56,169,129,242,195,129,17,154,64,161,244,16,137,24,144,144,164,129,75,42,176,149,9,179,148,203,4,166,136,163,128,227,163,8,57,11,30,165,0,74,59,62,9,208,131,144,40, 76, - 26,27,196,129,1,25,43,49,174,67,153,136,106,152,41,25,28,2,43,44,104,45,59,8,43,128,144,120,25,12,17,152,9,130,155,151,145,74,40,13,48,192,58,90,43,43,177,146,49,31,75,24,217,131,0,76,26,152,149,161,24,74,154,193,166,145,32,27,161,164,176,135,152,24,193, - 162,146,164,58,227,193,148,161,128,18,234,130,180,145,2,200,1,163,186,98,184,129,149,153,49,42,186,151,242,129,1,43,8,177,212,165,8,40,137,24,8,144,90,9,25,48,44,46,24,138,40,144,108,58,27,128,181,128,80,29,42,152,162,130,25,106,136,11,148,8,144,128,136, - 112,139,80,153,24,136,129,46,0,60,129,208,1,3,13,57,168,144,1,242,17,9,26,2,185,27,55,140,73,137,179,16,192,3,145,143,33,9,171,135,160,17,137,10,151,168,3,178,44,17,208,144,167,0,40,155,16,167,152,18,144,26,160,199,1,136,91,136,160,178,150,161,1,10, 181, - 145,161,1,145,161,198,2,9,90,137,177,160,150,40,29,129,144,145,162,57,77,169,16,148,42,42,40,141,34,170,121,154,210,131,162,107,8,9,160,195,40,73,139,18,224,162,34,139,0,244,178,163,24,26,146,194,166,49,29,42,137,130,192,16,93,128,154,19,59, 11, 122, 11, - 146,177,120,42,26,43,164,152,17,60,63,137,128,48,10,58,92,9,59,91,75,139,32,25,25,61,74,28,177,40,130,74,29,73,168,130,128,48,14,8,77,9,25,26,179,211,32,78,26,41,152,161,180,89,59,9,153,166,160,3,26,57,106,154,88,184,40,1,27,58,73,143,131,169,3,161, 184, - 122,152,16,181,145,129,17,15,129,193,147,145,192,33,193,162,183,163,136,178,129,178,197,2,41,216,131,168,163,181,226,163,178,1,33,187,166,212,129,1,27,24,162,184,151,8,16,160,144,181,210,72,168,128,32,42,25,40,142,5,185,88,58,11,58,177,32,129,63,42, 136, - 186,53,29,75,58,144,144,129,77,128,11,144,133,29,40,152,24,161,129,80,155,60,3,12,89,8,60,152,152,49,136,47,57,224,129,16,41,90,139,162,147,170,51,169,27,17,95,26,26,160,5,139,48,76,10,228,146,1,136,44,161,147,209,130,137,73,224,1,162,195,32,210,177,180, - 179,148,145,154,132,242,146,1,152,32,192,1,144,155,7,177,168,5,138,178,148,152,150,136,89,152,9,41,196,145,40,28,16,8,10,178,167,24,1,44,123,137,136,145,194,48,27,74,26,192,179,135,136,88,27,10,177,163,164,128,73,24,31,8,0,192,149,144,129,9,106, 41, 200, - 161,151,41,138,0,24,226,162,49,42,11,90,136,136,152,17,145,10,63,40,11,56,245,162,16,26,73,11,144,135,137,58,106,10,25,8,57,137,28,33,129,156,113,10,10,161,18,8,153,77,3,217,0,1,242,128,193,18,128,75,60,178,154,37,45,58,29,144,1,184,66,41,29, 8, 145, 10, - 194,33,148,170,107,89,139,128,163,178,16,63,59,176,144,151,129,42,74,10,129,192,2,128,154,97,192,0,177,128,178,183,16,16,155,149,145,184,84,138,8,192,161,20,225,0,130,138,165,0,28,148,153,18,209,128,88,153,89,152,9,17,9,29,130,43,122,153,24, 32, 202, 49, - 24,43,106,154,130,193,27,51,29,28,133,138,65,11,123,25,10,40,152,44,130,26,43,148,45,73,140,33,8,153,88,128,61,144,42,59,225,128,18,155,50,75,186,20,202,120,144,42,92,176,162,165,25,2,169,152,135,185,19,152,8,146,160,123,195,137,132,209,0,16, 11, 2, 242, - 146,164,152,73,193,136,130,178,1,136,169,23,169,128,164,242,129,178,129,32,138,180,167,153,132,8,138,2,209,4,138,1,128,138,92,136,44,129,136,162,33,63,40,141,2,160,144,106,137,64,155,17,129,60,30,146,26,17,28,48,46,169,51,154,91,137,41,26,32,143,18, 138, - 1,32,28,123,177,9,181,195,56,57,14,145,161,17,17,31,41,152,145,194,194,20,153,41,9,243,129,180,0,128,45,16,43,170,135,144,16,25,42,137,242,163,194,16,0,57,14,130,194,178,16,33,30,8,59,211,163,160,5,137,44,10,17,170,3,120,9,44,146,136,131,140, 91, 9, 171, - 7,161,32,73,13,8,161,40,106,11,25,129,59,0,49,31,42,28,40,11,0,81,176,61,32,138,25,178,241,148,136,106,8,136,128,177,90,8,155,96,176,9,18,217,132,129,10,81,156,40,178,161,36,169,76,147,203,150,0,10,146,200,147,149,128,144,148,154,182,24,0,137,11,134,211, - 24,136,129,145,209,33,8,43,163,243,88,41,13,0,160,145,33,31,32,185,145,4,155,17,32,47,161,128,73,160,44,56,176,75,74,12,35,141,104,137,9,89,152,58,56,44,41,30,41,40,157,48,128,154,88,41,42,8,14,3,184,59,120,152,9,56,10,128,41,57,227,186,52,152,62, 8, 56, - 242,0,58,8,156,34,243,128,24,176,51,169,58,183,192,146,164,177,18,170,7,177,208,132,161,24,136,27,147,243,128,133,10,24,161,161,178,214,17,160,25,16,161,137,165,192,48,27,72,58,218,133,162,26,72,27,10,197,178,49,138,89,56,142,1,24,11,0,44,105, 10, 25, 0, - 194,9,3,47,8,138,147,18,28,48,202,147,199,146,25,161,0,145,194,163,57,11,146,248,130,32,57,63,154,16,48,14,128,144,209,133,26,56,154,182,162,195,18,152,44,194,180,168,5,24,137,138,35,192,232,66,176,161,24,41,26,244,129,163,160,75,129,226,147,40, 145, 61, - 13,130,177,17,137,112,170,130,0,136,75,152,177,241,34,0,59,156,51,186,178,91,132,137,137,122,1,45,28,50,172,57,108,8,26,136,32,152,46,144,131,171,4,152,18,141,148,1,216,32,9,60,169,66,152,128,72,90,201,1,17,201,136,3,195,26,73,133,200,176, 150, 146, 169, - 24,33,178,184,151,73,11,28,72,44,153,82,153,17,42,57,78,153,8,160,0,1,123,11,19,171,195,18,59,31,129,10,162,2,58,96,142,130,26,75,128,176,17,180,123,9,90,137,211,145,32,26,76,43,145,130,12,90,41,27,58,160,160,128,178,7,76,59,0,203,180,147,33,62,10,0,243, - 129,146,73,29,145,144,0,26,56,153,185,83,8,76,27,166,161,193,146,131,224,145,165,161,40,168,149,162,226,2,136,138,163,131,211,0,59,146,218,148,1,192,16,16,58,248,88,144,177,136,1,58,45,9,195,197,147,48,29,10,0,162,176,64,122,9,10,17,9,153,56, 75, 27, 31, - 72,136,9,129,129,61,45,59,10,161,18,122,43,59,41,169,34,155,130,131,219,120,162,27,49,208,160,131,156,66,12,145,50,240,16,136,12,162,40,129,130,15,129,162,146,180,83,139,58,217,129,177,4,0,169,197,163,144,242,131,168,179,179,17,197,145,178,164, 128, 160, - 211,2,244,163,145,162,129,212,177,163,17,208,163,195,180,57,24,170,182,164,129,0,60,60,169,149,162,177,122,26,24,136,136,133,43,27,178,56,77,24,128,240,0,2,44,46,8,128,193,146,64,27,42,16,193,25,0,192,148,11,52,47,153,147,243,0,24,73,28,144, 161, 150, 9, - 8,73,170,2,162,25,27,147,167,131,29,1,168,200,165,16,91,137,8,162,176,35,41,31,24,169,50,168,58,123,144,48,128,13,73,169,144,16,57,123,44,200,163,56,153,80,10,176,146,57,94,8,152,131,9,168,125,26,145,177,132,137,41,60,26,144,243,32,192,34,60, 43, 26, 16, - 249,164,16,58,61,11,130,243,146,2,42,44,27,128,165,137,49,45,28,16,43,8,211,48,28,152,105,9,9,163,161,169,35,107,42,232,164,130,168,72,42,168,210,148,144,136,129,3,217,194,50,27,192,41,210,147,40,76,226,1,161,1,155,132,145,147,171,67,173,210,132,161,106, - 137,56,169,209,131,64,13,129,9,194,17,57,61,169,17,128,40,31,16,10,162,57,61,75,139,40,242,17,58,59,138,179,144,50,105,140,179,243,57,40,26,9,243,130,24,29,57,128,210,129,25,59,91,137,162,178,72,27,181,168,19,129,8,184,231,147,178,32,28,184,198,148, 144, - 1,26,128,16,192,2,26,144,244,129,0,16,10,197,177,181,1,41,9,178,165,211,129,25,145,137,210,147,152,210,163,132,194,17,91,169,145,181,130,9,89,137,152,178,4,128,9,63,160,128,106,8,25,43,10,32,47,26,123,152,24,40,25,27,18,186,35,158,64,42,216,33,25,58, 58, - 45,184,147,29,72,46,9,0,178,146,58,77,26,25,209,165,128,145,17,153,128,129,148,240,129,1,40,31,0,152,242,163,16,59,44,24,243,146,128,1,26,26,179,213,145,130,176,131,40,25,145,219,179,167,8,33,59,14,176,166,16,136,74,128,176,128,149,8,8,209,148,152,0, 72, - 153,161,178,35,62,75,154,163,153,19,62,170,133,179,136,89,12,129,164,144,3,47,58,193,177,148,0,61,43,10,129,17,41,61,43,25,8,126,26,25,137,145,34,44,45,129,216,179,1,90,25,137,32,227,8,16,9,170,49,31,32,29,128,145,148,75,25,75,153,162,192,35,12, 80, 136, - 176,8,194,24,1,176,21,154,145,80,251,130,2,30,9,8,130,145,128,98,27,26,129,136,162,15,33,168,59,65,177,77,141,1,128,168,113,10,137,178,163,146,132,74,153,224,164,33,184,19,184,228,161,17,91,152,25,146,152,44,121,9,160,145,17,25,28,93,128,152,2,25,27,161, - 210,129,146,45,179,227,163,162,9,40,193,148,179,57,107,140,196,32,25,57,47,136,210,130,24,40,28,152,210,182,145,40,8,129,184,147,147,140,163,166,160,34,45,144,194,161,134,41,46,152,162,162,3,44,58,75,209,162,144,57,129,47,152,130,59,16,248,129,17,26, 57, - 9,29,167,2,60,42,138,136,209,130,90,42,42,176,146,178,120,28,8,160,145,16,33,31,1,8,160,129,128,242,164,32,152,177,146,213,196,128,40,26,160,163,180,146,108,60,144,144,136,147,137,40,90,161,3,17,219,243,33,184,130,60,136,243,178,179,132,26,8,168,212,147, - 16,57,42,31,145,145,160,32,43,184,66,45,180,33,140,226,1,91,152,16,144,193,162,48,77,25,137,153,17,178,78,0,0,16,14,90,152,153,19,129,13,123,137,129,160,1,73,44,9,129,0,153,120,10,9,162,195,32,139,28,151,161,2,128,26,45,193,146,48,29,146,153, 194, 5, 59, - 29,128,144,195,1,64,43,208,178,149,8,9,16,240,163,129,16,42,185,181,211,24,48,45,137,149,9,24,41,75,184,177,4,43,91,128,180,16,144,29,25,184,167,1,59,60,153,148,161,146,91,42,186,4,24,145,123,11,2,178,77,136,26,25,195,40,115,61,27,168,177,3,59,79,26, 25, - 144,1,48,13,56,154,248,1,16,9,129,8,2,178,31,130,153,162,20,15,33,170,56,40,29,28,128,152,149,144,56,120,11,162,212,129,144,145,59,180,243,147,145,144,16,152,48,241,0,161,176,1,134,10,129,200,166,144,128,121,26,24,177,178,196,48,75,138,41,180,195,26, 24, - 89,138,24,33,187,41,84,155,57,79,136,160,210,130,0,58,58,168,243,132,27,41,75,138,3,8,61,8,29,145,179,76,24,28,146,208,2,49,140,75,196,144,0,40,44,179,208,3,176,33,15,177,2,160,106,8,160,164,164,8,73,27,226,179,161,1,57,1,196,211,128,40,156,145,166, 178, - 131,29,128,145,162,165,40,27,216,146,135,144,40,160,194,177,145,20,139,200,151,178,17,136,40,25,205,130,17,11,17,129,156,38,26,25,137,179,163,11,79,16,12,146,147,143,89,25,136,136,25,48,26,46,129,40,29,42,29,8,145,2,56,27,62,8,25,212,161,48,43, 144, 129, - 29,145,144,41,106,10,107,43,184,131,1,36,61,13,138,2,194,1,16,27,75,186,181,151,8,1,161,138,211,129,2,59,248,129,16,0,144,63,152,150,136,24,25,128,30,161,128,17,24,225,146,10,16,0,9,227,183,129,40,60,26,162,194,181,24,90,9,24,0,176,161,193,194,35,12, 63, - 8,210,162,1,32,78,28,152,164,144,16,48,45,137,162,147,168,152,98,27,43,33,12,160,165,129,137,63,41,153,153,151,16,91,26,8,8,9,56,10,46,24,146,57,168,160,166,241,129,32,140,16,145,179,164,137,113,138,208,131,26,25,1,42,178,196,106,24,171,18,196,8, 18, 29, - 41,194,128,3,249,57,162,152,48,184,120,160,208,33,137,74,57,187,149,129,26,35,158,72,128,168,32,26,25,180,75,2,136,15,163,161,136,120,27,41,160,128,182,56,60,25,12,178,151,128,168,72,10,152,4,177,26,147,137,113,44,42,33,220,2,152,41,82,11, 210, 163, 184, - 133,162,10,196,128,3,234,40,149,152,161,1,44,129,194,4,225,16,58,168,24,194,146,146,154,49,21,218,33,152,248,129,194,147,0,28,1,195,162,20,140,42,25,160,198,1,33,136,142,3,25,24,141,16,177,208,112,0,138,41,160,130,45,60,32,170,73,24,75,59,161,176,49,159, - 97,26,168,149,145,32,28,25,184,211,129,179,74,73,8,153,136,193,151,160,32,48,143,9,147,181,145,32,60,9,187,133,166,144,32,152,25,136,161,150,168,145,81,10,42,0,169,182,148,136,58,41,187,182,211,131,16,137,25,243,144,129,2,9,8,202,7,25,185,21,144,136,153, - 65,184,137,56,151,10,153,49,16,145,14,56,176,11,192,19,89,91,44,168,147,2,8,147,63,27,1,136,229,129,73,26,136,26,137,81,170,147,77,72,12,42,42,192,24,104,91,26,27,65,177,27,32,41,60,14,136,17,170,150,129,24,58,11,16,251,162,19,57,31,0,152,129,145,17, 61, - 14,1,129,27,129,66,169,178,74,12,11,19,198,145,75,33,138,174,133,1,184,57,40,136,169,20,1,60,174,20,154,201,67,26,162,151,42,16,138,59,130,204,20,169,59,180,59,114,184,56,178,242,128,130,43,8,194,3,229,144,33,185,144,34,181,145,168,17,149,153,74,35, 220, - 129,128,1,88,59,75,225,136,130,168,17,144,12,151,8,25,179,8,1,240,16,8,25,145,211,41,130,138,115,169,160,163,168,84,154,74,0,170,144,211,149,2,30,128,137,9,149,1,144,58,60,57,153,178,150,17,29,27,74,25,195,152,56,15,1,25,26,152,149,80,153,57,73,140, 128, - 160,144,113,27,56,28,25,4,42,44,137,60,171,130,50,240,8,5,139,145,1,105,137,200,80,137,145,146,178,179,160,46,16,240,195,131,128,144,24,164,198,128,0,136,137,131,194,165,177,2,161,147,11,144,188,181,148,144,23,0,28,224,128,131,192,32,1,224,1,168,132,145, - 9,41,208,58,137,179,151,145,16,1,30,8,145,178,1,47,32,186,72,169,146,75,8,41,48,136,89,13,48,9,10,124,26,11,42,32,129,91,77,16,12,128,42,57,138,10,60,2,63,9,0,93,128,152,90,8,10,24,40,44,144,29,49,188,48,72,25,30,177,33,128,186,120,129,186,133, 152, 130, - 24,156,51,154,8,226,2,56,155,2,179,233,167,128,24,129,176,136,151,8,184,0,33,224,152,21,177,24,10,163,16,250,17,130,171,83,137,136,37,12,56,242,154,17,160,145,82,13,3,201,128,18,137,24,162,63,162,8,107,178,128,57,158,32,24,200,18,0,106,154,73,16, 248, 8, - 73,137,57,75,0,128,12,65,137,59,75,28,144,129,122,0,58,140,160,195,145,105,56,28,153,145,164,88,8,28,25,153,9,162,113,89,153,136,33,234,147,128,41,72,11,138,151,144,145,16,43,58,248,130,178,42,4,40,10,196,154,147,216,24,7,136,10,161,148,210,161, 98, 138, - 137,128,146,176,33,105,27,43,163,49,185,6,10,136,43,67,174,161,162,151,137,1,64,200,193,24,64,200,56,145,242,24,57,137,1,128,3,162,175,80,128,162,152,25,58,175,17,17,0,200,64,168,162,91,1,154,44,211,177,35,64,160,161,144,4,241,41,209,162,25,1,3,242, 176, - 134,153,42,41,136,135,154,2,130,46,41,161,153,180,145,34,26,46,18,242,137,146,129,25,128,11,151,161,40,179,27,122,168,59,137,181,50,172,36,56,15,9,129,137,128,75,2,58,12,52,141,8,24,58,153,157,122,145,9,1,80,27,184,32,74,219,50,57,168,153,180,48,28, 143, - 131,144,178,65,13,48,168,162,147,155,121,9,170,5,16,153,21,29,144,161,91,0,184,57,128,137,17,159,88,178,128,105,152,9,162,33,164,141,88,178,224,1,0,16,27,185,150,161,9,4,139,16,128,160,194,144,65,180,46,40,136,27,135,160,16,44,57,145,236,2,195,40,75,177, - 2,200,179,146,186,104,50,141,24,169,165,148,11,97,10,11,130,177,49,57,78,42,154,128,165,59,33,28,30,1,136,16,192,41,128,152,123,136,24,1,169,113,10,11,49,153,14,147,19,45,43,8,176,210,148,8,16,11,96,144,192,163,150,10,128,43,26,150,178,165,24,41,171, 18, - 27,215,1,8,128,136,40,35,208,11,161,193,18,73,154,133,155,165,164,10,49,154,8,199,0,2,168,64,192,0,40,162,43,202,180,150,10,106,24,185,145,131,184,113,43,24,162,187,73,146,42,81,171,121,58,155,151,16,43,32,31,9,160,146,17,136,94,10,24,145,25, 9, 130, 59, - 65,13,91,25,169,146,176,112,42,59,16,217,130,20,13,25,9,40,161,138,68,169,154,18,62,154,180,145,135,152,56,58,155,165,211,8,40,42,10,198,1,2,184,57,184,224,51,154,27,134,168,19,202,73,75,184,35,176,75,24,25,209,51,157,19,30,184,179,3,33,148,45, 232, 146, - 129,168,41,32,170,149,193,35,136,16,50,191,56,146,173,149,16,24,41,30,129,168,209,3,57,31,0,16,176,147,41,152,10,17,181,14,40,144,49,170,75,97,141,25,162,146,72,177,92,137,137,19,137,153,113,154,2,41,60,129,217,2,211,152,73,42,193,197,146,147, 10, 59, 0, - 192,196,132,41,160,25,88,169,16,40,241,1,153,81,28,10,147,161,209,88,75,9,161,162,180,16,43,57,235,33,56,156,129,144,2,135,31,128,145,136,163,56,59,154,57,167,160,105,137,0,138,163,3,41,47,185,211,131,41,41,60,139,182,146,16,16,43,242,144,145,129,16,179, - 183,1,26,9,147,240,131,160,91,74,152,184,166,178,33,140,9,4,162,233,34,136,129,144,163,60,142,144,149,128,33,73,13,161,194,131,0,26,56,142,128,163,128,1,233,56,209,41,145,194,147,179,149,64,30,8,128,216,18,24,43,43,32,153,25,74,109,137,153,48,8,137, 122, - 25,144,26,43,59,30,33,41,27,24,96,153,160,50,76,27,47,152,145,163,73,40,14,152,131,176,74,90,8,8,200,67,155,154,50,49,155,28,124,177,152,1,2,17,62,138,180,176,4,25,9,177,245,162,129,40,25,176,164,130,172,4,8,181,194,49,11,168,154,165,133,152,40,136, 226, - 179,19,26,185,16,167,194,16,25,57,243,136,147,1,31,25,184,132,160,33,62,138,129,130,41,121,137,153,145,26,17,107,136,179,1,61,60,26,162,168,148,64,31,25,32,168,152,64,31,137,8,129,33,62,24,137,8,16,59,47,153,33,162,91,59,41,170,145,5,43,60,41,13,178,134, - 57,153,12,194,227,8,2,128,57,208,162,19,216,32,178,25,128,160,48,194,195,37,155,10,33,251,163,146,16,136,12,166,195,160,148,129,176,147,178,150,160,72,162,162,193,162,60,200,145,5,144,25,122,216,129,161,130,0,10,73,1,241,2,9,168,33,13,161,165,24,64, 203, - 50,1,14,9,9,129,161,106,33,27,13,164,128,40,41,107,169,160,33,136,60,92,168,152,2,91,57,176,129,0,144,47,136,162,164,128,80,43,154,179,213,130,74,27,0,145,145,167,58,59,160,9,26,76,8,171,5,49,28,44,169,162,183,130,72,28,144,179,228,2,25,26,129, 186, 151, - 1,75,128,169,17,178,15,57,170,16,166,16,57,8,139,162,181,1,8,152,164,181,41,81,43,10,242,145,57,139,89,8,193,18,154,32,176,10,165,129,137,147,177,134,0,25,25,201,147,227,129,72,59,185,167,128,129,160,91,25,176,130,147,145,9,160,5,202,17,16, 186, 136, 37, - 177,56,76,42,169,186,48,9,145,57,24,128,41,169,134,137,145,147,28,41,168,131,228,32,27,9,60,129,178,64,60,45,25,9,24,152,49,31,136,57,42,0,25,12,181,18,153,57,96,169,177,132,153,123,9,152,129,177,17,74,43,24,169,128,121,137,25,1,139,96,42,10,146,178, 18, - 44,29,1,161,164,146,31,137,146,177,19,1,10,26,209,165,146,43,40,138,240,130,18,144,25,40,212,1,58,11,152,196,147,10,74,26,152,225,130,146,58,60,210,145,16,148,16,185,192,18,44,42,57,199,162,1,9,87,47,186,215,231,197,179,180,195,212,164,32,59,92, 126, 62, - 41,59,76,59,60,168,179,213,197,163,72,44,25,74,126,127,127,79,26,177,148,90,27,225,247,165,0,152,147,123,138,211,164,72,126,127,46,210,196,163,228,215,64,11,210,180,1,8,58,153,1,224,149,57,76,27,24,76,42,43,136,128,243,179,130,106,60,42,42,92,28,243,231, - 147,24,57,44,58,94,45,8,57,139,214,148,40,77,26,9,16,10,144,64,62,43,25,123,59,138,162,48,63,26,41,92,60,43,176,3,59,232,214,164,16,75,75,76,60,153,179,33,62,26,136,40,75,169,197,163,129,57,60,59,75,138,145,64,63,138,179,1,42,136,90,43,176,214,180,1, 25, - 152,195,129,129,106,76,60,137,145,178,2,25,10,228,130,57,59,44,41,154,165,105,76,44,144,16,76,26,41,76,26,152,1,58,26,9,193,165,16,92,26,41,77,59,76,76,60,26,136,161,130,152,195,163,211,146,0,57,11,211,130,8,25,40,62,153,162,17,109,60,153,146,40, 76, 60, - 26,160,179,211,163,32,60,42,153,179,194,199,130,24,58,43,58,27,128,161,195,129,226,196,147,90,59,75,44,136,128,145,160,148,123,59,42,26,41,26,57,27,192,215,147,57,59,27,161,145,213,130,106,76,43,9,144,162,129,177,181,130,136,194,146,40,10,129,25,210,146, - 178,197,196,179,196,130,8,41,9,144,178,130,209,182,17,92,43,176,147,144,212,130,136,0,177,130,73,62,10,161,130,91,75,59,43,57,46,25,41,77,10,177,164,16,26,136,210,197,179,130,128,57,77,43,25,75,10,227,179,180,179,146,128,57,185,183,163,145,0,8,8,10, 119, - 114,120,16,210,244,60,28,41,25,152,149,56,161,35,44,89,27,24,136,24,164,211,17,233,176,136,192,129,179,17,17,25,0,10,46,160,132,49,66,24,132,177,147,193,56,72,26,29,232,168,176,12,137,41,139,147,9,1,41,15,91,136,35,148,21,18,48,40,1,168,167,144,0,42,172, - 177,204,193,155,232,152,152,26,152,41,146,17,6,4,65,34,35,135,4,16,32,9,24,186,176,0,250,153,204,186,173,154,153,177,3,65,41,34,145,134,35,65,98,49,50,50,2,33,169,138,155,175,170,172,204,192,138,234,136,155,136,10,32,18,5,52,48,24,162,17,67,54,66,51, 34, - 131,184,174,234,153,10,9,40,0,152,251,168,142,154,9,16,33,49,33,128,154,170,156,34,54,54,33,68,0,1,136,201,137,26,88,48,35,99,8,152,189,189,187,155,171,16,24,130,145,188,175,203,144,49,115,67,67,50,19,2,1,0,0,130,131,1,136,206,216,188,203, 204, 187, 187, - 156,153,0,0,51,17,34,24,112,20,69,67,67,34,19,0,136,169,185,137,186,232,185,219,201,203,187,173,170,154,153,129,131,6,2,19,49,49,21,65,19,53,51,83,34,16,168,201,154,172,156,138,0,1,24,201,233,186,204,186,171,137,3,37,48,24,128,201,202,202,129,17, 48, 21, - 22,20,19,19,32,16,2,66,52,68,4,3,1,203,235,188,189,186,171,153,137,153,170,219,170,140,9,17,53,115,50,52,67,51,51,51,17,130,0,145,154,169,188,236,187,190,203,187,172,171,138,136,17,33,18,2,34,98,98,50,50,52,66,34,35,2,19,24,169,203,203,188,219, 169, 154, - 9,137,171,204,188,203,184,136,34,83,50,33,153,184,170,170,152,40,57,19,36,50,50,18,35,17,2,49,49,66,66,66,34,17,168,233,202,202,170,171,170,186,219,203,188,188,154,138,25,33,68,52,68,67,67,36,51,36,18,17,17,136,8,170,176,202,188,206,202,171,172,186, 169, - 153,8,25,144,128,1,34,68,52,68,51,52,34,49,18,34,2,144,136,155,140,187,186,186,154,154,185,185,153,9,9,0,24,0,128,144,168,169,170,154,154,153,9,8,16,8,0,144,19,35,68,51,52,67,51,66,34,50,33,1,144,185,186,172,204,187,188,173,172,186,172,186, 154, 138, 41, - 33,52,53,83,50,51,52,52,37,34,34,18,16,144,152,154,187,219,203,188,173,186,186,186,170,154,153,138,144,16,17,67,82,50,51,21,34,19,33,2,18,33,1,8,153,169,153,153,136,128,0,136,154,153,153,8,8,1,16,0,169,170,187,171,171,154,153,153,152,153,153,0,16,51, 83, - 66,50,67,50,51,67,51,52,35,18,136,186,219,187,189,186,171,187,173,187,188,187,203,138,9,16,33,50,52,53,67,67,147,8,128,128,128,128,128,128,128,128,0,240,255,55,232,23,220,0,148,1,9,18,148,10,189,32,163,62,160,5,137,12,149,42,153,144,34,42,8, 1, 138, 181, - 45,136,18,144,105,138,1,160,14,128,132,145,186,37,138,41,192,48,145,46,160,33,44,24,225,16,13,132,136,137,16,148,25,170,194,82,152,136,91,24,42,169,33,233,131,179,24,185,149,16,57,172,164,18,10,211,160,147,211,33,138,243,129,16,41,193,0,43, 132, 155, 73, - 58,145,244,145,43,35,9,171,16,110,25,8,28,74,162,128,26,27,82,45,136,153,18,8,136,8 -}; - } // End of namespace Kyra #undef EUPHONY_FADEOUT_TICKS diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 9ad2f50619..274acae22c 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -42,7 +42,7 @@ namespace Kyra { -#define RESFILE_VERSION 70 +#define RESFILE_VERSION 71 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { diff --git a/sound/module.mk b/sound/module.mk index f259f9e91b..caf14be547 100644 --- a/sound/module.mk +++ b/sound/module.mk @@ -36,6 +36,10 @@ MODULE_OBJS := \ softsynth/opl/dbopl.o \ softsynth/opl/dosbox.o \ softsynth/opl/mame.o \ + softsynth/fmtowns_pc98/towns_audio.o \ + softsynth/fmtowns_pc98/towns_euphony.o \ + softsynth/fmtowns_pc98/towns_pc98_driver.o \ + softsynth/fmtowns_pc98/towns_pc98_fmsynth.o \ softsynth/ym2612.o \ softsynth/fluidsynth.o \ softsynth/mt32.o \ diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp new file mode 100644 index 0000000000..0d5a16b35f --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -0,0 +1,1479 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sound/softsynth/fmtowns_pc98/towns_audio.h" +#include "common/endian.h" + + +class TownsAudio_PcmChannel { +friend class TownsAudioInterface; +public: + TownsAudio_PcmChannel(); + ~TownsAudio_PcmChannel(); + +private: + void loadExtData(uint8 *buffer, uint32 size); + void setupLoop(uint32 start, uint32 len); + void clear(); + + void envAttack(); + void envDecay(); + void envSustain(); + void envRelease(); + + uint8 *curInstrument; + uint8 note; + uint8 velo; + + int8 *data; + int8 *dataEnd; + + int8 *loopEnd; + uint32 loopLen; + + uint16 stepNote; + uint16 stepPitch; + uint16 step; + + uint8 panLeft; + uint8 panRight; + + uint32 pos; + + uint8 envTotalLevel; + uint8 envAttackRate; + uint8 envDecayRate; + uint8 envSustainLevel; + uint8 envSustainRate; + uint8 envReleaseRate; + + int16 envStep; + int16 envCurrentLevel; + + EnvelopeState envState; + + int8 *extData; +}; + +class TownsAudio_WaveTable { +friend class TownsAudioInterface; +public: + TownsAudio_WaveTable(); + ~TownsAudio_WaveTable(); + +private: + void readHeader(const uint8 *buffer); + void readData(const uint8 *buffer); + void clear(); + + char name[9]; + int32 id; + uint32 size; + uint32 loopStart; + uint32 loopLen; + uint16 rate; + uint16 rateOffs; + uint16 baseNote; + int8 *data; +}; + +TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), + _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), + _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _ready(false) { + +#define INTCB(x) &TownsAudioInterface::intf_##x + static const TownsAudioIntfCallback intfCb[] = { + // 0 + INTCB(reset), + INTCB(keyOn), + INTCB(keyOff), + INTCB(setPanPos), + // 4 + INTCB(setInstrument), + INTCB(loadInstrument), + INTCB(notImpl), + INTCB(setPitch), + // 8 + INTCB(setLevel), + INTCB(chanOff), + INTCB(notImpl), + INTCB(notImpl), + // 12 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 16 + INTCB(notImpl), + INTCB(writeReg), + INTCB(notImpl), + INTCB(bufferedWriteReg), + // 20 + INTCB(readRegBuffer), + INTCB(setTimerA), + INTCB(setTimerB), + INTCB(enableTimerA), + // 24 + INTCB(enableTimerB), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 28 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 32 + INTCB(notImpl), + INTCB(reserveEffectChannels), + INTCB(loadWaveTable), + INTCB(unloadWaveTable), + // 36 + INTCB(notImpl), + INTCB(pcmPlayEffect), + INTCB(notImpl), + INTCB(pcmChanOff), + // 40 + INTCB(pcmEffectPlaying), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 44 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 48 + INTCB(notImpl), + INTCB(notImpl), + INTCB(fmKeyOn), + INTCB(fmKeyOff), + // 52 + INTCB(fmSetPanPos), + INTCB(fmSetInstrument), + INTCB(fmLoadInstrument), + INTCB(notImpl), + // 56 + INTCB(fmSetPitch), + INTCB(fmSetLevel), + INTCB(fmReset), + INTCB(notImpl), + // 60 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 64 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(cdaSetVolume), + // 68 + INTCB(cdaReset), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 72 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 76 + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + INTCB(notImpl), + // 80 + INTCB(pcmUpdateEnvelopeGenerator), + INTCB(notImpl) + + }; +#undef INTCB + + _intfOpcodes = intfCb; + + memset(_fmSaveReg, 0, sizeof(_fmSaveReg)); + _timerBase = (uint32)(_baserate * 1000000.0f); + _tickLength = 2 * _timerBase; +} + +TownsAudioInterface::~TownsAudioInterface() { + delete[] _fmSaveReg[0]; + delete[] _fmSaveReg[1]; + delete[] _fmInstruments; + delete[] _pcmInstruments; + delete[] _waveTables; + delete[] _pcmChan; +} + +bool TownsAudioInterface::init() { + if (_ready) + return true; + + if (!_drv) + return false; + + if (!TownsPC98_FmSynth::init()) + return false; + + _fmSaveReg[0] = new uint8[256]; + _fmSaveReg[1] = new uint8[256]; + _fmInstruments = new uint8[128 * 48]; + _pcmInstruments = new uint8[32 * 128]; + _waveTables = new TownsAudio_WaveTable[128]; + _pcmChan = new TownsAudio_PcmChannel[8]; + + _timer = 0; + + callback(0); + + _ready = true; + return true; +} + +int TownsAudioInterface::callback(int command, ...) { + va_list args; + va_start(args, command); + + if (command > 81) { + va_end(args); + return 4; + } + + Common::StackLock lock(_mutex); + int res = (this->*_intfOpcodes[command])(args); + + va_end(args); + return res; +} + +void TownsAudioInterface::nextTickEx(int32 *buffer, uint32 bufferSize) { + if (!_ready) + return; + + for (uint32 i = 0; i < bufferSize; i++) { + _timer += _tickLength; + while (_timer > 0x5B8D80) { + _timer -= 0x5B8D80; + + for (int ii = 0; ii < 8; ii++) { + if ((_pcmChanKeyPlaying & _chanFlags[ii]) || (_pcmChanEffectPlaying & _chanFlags[ii])) { + TownsAudio_PcmChannel *s = &_pcmChan[ii]; + s->pos += s->step; + + if (&s->data[s->pos >> 11] >= s->loopEnd) { + if (s->loopLen) { + s->pos -= s->loopLen; + } else { + s->pos = 0; + _pcmChanEffectPlaying &= ~_chanFlags[ii]; + _pcmChanKeyPlaying &= ~_chanFlags[ii]; + } + } + } + } + } + + int32 finOutL = 0; + int32 finOutR = 0; + + for (int ii = 0; ii < 8; ii++) { + if (_pcmChanOut & _chanFlags[ii]) { + int32 o = _pcmChan[ii].data[_pcmChan[ii].pos >> 11] * _pcmChan[ii].velo; + if (_pcmChan[ii].panLeft) + finOutL += ((o * _pcmChan[ii].panLeft) >> 3); + if (_pcmChan[ii].panRight) + finOutR += ((o *_pcmChan[ii].panRight) >> 3); + if (!((_pcmChanKeyPlaying & _chanFlags[ii]) || (_pcmChanEffectPlaying & _chanFlags[ii]))) + _pcmChanOut &= ~_chanFlags[ii]; + } + } + + buffer[i << 1] += finOutL; + buffer[(i << 1) + 1] += finOutR; + } +} + +void TownsAudioInterface::timerCallbackA() { + Common::StackLock lock(_mutex); + if (_drv && _ready) + _drv->timerCallback(0); +} + +void TownsAudioInterface::timerCallbackB() { + Common::StackLock lock(_mutex); + if (_ready) { + if (_drv) + _drv->timerCallback(1); + for (int i = 0; i < 8; i++) + pcmUpdateEnvelopeGenerator(i); + } +} + +int TownsAudioInterface::intf_reset(va_list &args) { + Common::StackLock lock(_mutex); + fmReset(); + pcmReset(); + cdaReset(); + return 0; +} + +int TownsAudioInterface::intf_keyOn(va_list &args) { + int chan = va_arg(args, int); + int note = va_arg(args, int); + int velo = va_arg(args, int); + return (chan & 0x40) ? pcmKeyOn(chan, note, velo) : fmKeyOn(chan, note, velo); +} + +int TownsAudioInterface::intf_keyOff(va_list &args) { + int chan = va_arg(args, int); + return (chan & 0x40) ? pcmKeyOff(chan) : fmKeyOff(chan); +} + +int TownsAudioInterface::intf_setPanPos(va_list &args) { + int chan = va_arg(args, int); + int mode = va_arg(args, int); + return (chan & 0x40) ? pcmSetPanPos(chan, mode) : fmSetPanPos(chan, mode); +} + +int TownsAudioInterface::intf_setInstrument(va_list &args) { + int chan = va_arg(args, int); + int instrId = va_arg(args, int); + return (chan & 0x40) ? pcmSetInstrument(chan, instrId) : fmSetInstrument(chan, instrId); +} + +int TownsAudioInterface::intf_loadInstrument(va_list &args) { + int chanType = va_arg(args, int); + int instrId = va_arg(args, int); + uint8 *instrData = va_arg(args, uint8*); + return (chanType & 0x40) ? pcmLoadInstrument(instrId, instrData) : fmLoadInstrument(instrId, instrData); +} + +int TownsAudioInterface::intf_setPitch(va_list &args) { + int chan = va_arg(args, int); + int16 pitch = (int16)(va_arg(args, int) & 0xffff); + return (chan & 0x40) ? pcmSetPitch(chan, pitch) : fmSetPitch(chan, pitch); +} + +int TownsAudioInterface::intf_setLevel(va_list &args) { + int chan = va_arg(args, int); + int lvl = va_arg(args, int); + return (chan & 0x40) ? pcmSetLevel(chan, lvl) : fmSetLevel(chan, lvl); +} + +int TownsAudioInterface::intf_chanOff(va_list &args) { + int chan = va_arg(args, int); + return (chan & 0x40) ? pcmChanOff(chan) : fmChanOff(chan); +} + +int TownsAudioInterface::intf_writeReg(va_list &args) { + int part = va_arg(args, int) ? 1 : 0; + int reg = va_arg(args, int); + int val = va_arg(args, int); + if ((!part && reg < 0x20) || (part && reg < 0x30) || (reg > 0xb6)) + return 3; + + bufferedWriteReg(part, reg, val); + return 0; +} + +int TownsAudioInterface::intf_bufferedWriteReg(va_list &args) { + int part = va_arg(args, int) ? 1 : 0; + int reg = va_arg(args, int); + int val = va_arg(args, int); + + if ((!part && reg < 0x20) || (part && reg < 0x30) || (reg > 0xef)) + return 3; + + _fmSaveReg[part][reg] = val; + return 0; +} + +int TownsAudioInterface::intf_readRegBuffer(va_list &args) { + int part = va_arg(args, int) ? 1 : 0; + int reg = va_arg(args, int); + uint8 *dst = va_arg(args, uint8*); + *dst = 0; + + if ((!part && reg < 0x20) || (part && reg < 0x30) || (reg > 0xef)) + return 3; + + *dst = _fmSaveReg[part][reg]; + return 0; +} + +int TownsAudioInterface::intf_setTimerA(va_list &args) { + int enable = va_arg(args, int); + int tempo = va_arg(args, int); + + if (enable) { + bufferedWriteReg(0, 0x25, tempo & 3); + bufferedWriteReg(0, 0x24, (tempo >> 2) & 0xff); + bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x05); + } else { + bufferedWriteReg(0, 0x27, (_fmSaveReg[0][0x27] & 0xfa) | 0x10); + } + + return 0; +} + +int TownsAudioInterface::intf_setTimerB(va_list &args) { + int enable = va_arg(args, int); + int tempo = va_arg(args, int); + + if (enable) { + bufferedWriteReg(0, 0x26, tempo & 0xff); + bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x0A); + } else { + bufferedWriteReg(0, 0x27, (_fmSaveReg[0][0x27] & 0xf5) | 0x20); + } + + return 0; +} + +int TownsAudioInterface::intf_enableTimerA(va_list &args) { + bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x15); + return 0; +} + +int TownsAudioInterface::intf_enableTimerB(va_list &args) { + bufferedWriteReg(0, 0x27, _fmSaveReg[0][0x27] | 0x2a); + return 0; +} + +int TownsAudioInterface::intf_reserveEffectChannels(va_list &args) { + int numChan = va_arg(args, int); + if (numChan > 8) + return 3; + if ((numChan << 13) + _waveTablesTotalDataSize > 65536) + return 5; + + if (numChan == _numReservedChannels) + return 0; + + if (numChan < _numReservedChannels) { + int c = 8 - _numReservedChannels; + for (int i = numChan; i; i--) { + uint8 f = ~_chanFlags[c--]; + _pcmChanEffectPlaying &= f; + } + } else { + int c = 7 - _numReservedChannels; + for (int i = numChan - _numReservedChannels; i; i--) { + uint8 f = ~_chanFlags[c--]; + _pcmChanKeyPressed &= f; + _pcmChanKeyPlaying &= f; + } + } + + static const uint8 reserveChanFlags[] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF }; + _numReservedChannels = numChan; + _pcmChanReserved = reserveChanFlags[_numReservedChannels]; + + return 0; +} + +int TownsAudioInterface::intf_loadWaveTable(va_list &args) { + uint8 *data = va_arg(args, uint8*); + if (_numWaveTables > 127) + return 3; + + TownsAudio_WaveTable w; + w.readHeader(data); + if (!w.size) + return 6; + + if (_waveTablesTotalDataSize + w.size > 65504) + return 5; + + for (int i = 0; i < _numWaveTables; i++) { + if (_waveTables[i].id == w.id) + return 10; + } + + TownsAudio_WaveTable *s = &_waveTables[_numWaveTables++]; + s->readHeader(data); + s->readData(data + 32); + + _waveTablesTotalDataSize += w.size; + + return 0; +} + +int TownsAudioInterface::intf_unloadWaveTable(va_list &args) { + int id = va_arg(args, int); + + if (id == -1) { + for (int i = 0; i < 128; i++) + _waveTables[i].clear(); + _numWaveTables = 0; + _waveTablesTotalDataSize = 0; + } else { + if (_waveTables) { + for (int i = 0; i < _numWaveTables; i++) { + if (_waveTables[i].id == id) { + _numWaveTables--; + _waveTablesTotalDataSize -= _waveTables[i].size; + _waveTables[i].clear(); + for (; i < _numWaveTables; i++) + memcpy(&_waveTables[i], &_waveTables[i + 1], sizeof(TownsAudio_WaveTable)); + return 0; + } + return 9; + } + } + } + + return 0; +} + +int TownsAudioInterface::intf_pcmPlayEffect(va_list &args) { + int chan = va_arg(args, int); + int note = va_arg(args, int); + int velo = va_arg(args, int); + uint8 *data = va_arg(args, uint8*); + + if (chan < 0x40 || chan > 0x47) + return 1; + + if (note & 0x80 || velo & 0x80) + return 3; + + chan -= 0x40; + + if (!(_pcmChanReserved & _chanFlags[chan])) + return 7; + + if ((_pcmChanEffectPlaying & _chanFlags[chan])) + return 2; + + TownsAudio_WaveTable w; + w.readHeader(data); + + if (!w.size < (w.loopStart + w.loopLen)) + return 13; + + if (!w.size) + return 6; + + TownsAudio_PcmChannel *p = &_pcmChan[chan]; + + _pcmChanNote[chan] = note; + _pcmChanVelo[chan] = velo; + + p->note = note; + p->velo = velo << 1; + + p->loadExtData(data + 32, w.size); + p->setupLoop(w.loopStart, w.loopLen); + + pcmCalcPhaseStep(p, &w); + if (p->step > 2048) + p->step = 2048; + + _pcmChanEffectPlaying |= _chanFlags[chan]; + _pcmChanOut |= _chanFlags[chan]; + + return 0; +} + +int TownsAudioInterface::intf_pcmChanOff(va_list &args) { + int chan = va_arg(args, int); + pcmChanOff(chan); + return 0; +} + +int TownsAudioInterface::intf_pcmEffectPlaying(va_list &args) { + int chan = va_arg(args, int); + if (chan < 0x40 || chan > 0x47) + return 1; + chan -= 0x40; + return (_pcmChanEffectPlaying & _chanFlags[chan]) ? true : false; +} + +int TownsAudioInterface::intf_fmKeyOn(va_list &args) { + int chan = va_arg(args, int); + int note = va_arg(args, int); + int velo = va_arg(args, int); + return fmKeyOn(chan, note, velo); +} + +int TownsAudioInterface::intf_fmKeyOff(va_list &args) { + int chan = va_arg(args, int); + return fmKeyOff(chan); +} + +int TownsAudioInterface::intf_fmSetPanPos(va_list &args) { + int chan = va_arg(args, int); + int mode = va_arg(args, int); + return fmSetPanPos(chan, mode); +} + +int TownsAudioInterface::intf_fmSetInstrument(va_list &args) { + int chan = va_arg(args, int); + int instrId = va_arg(args, int); + return fmSetInstrument(chan, instrId); +} + +int TownsAudioInterface::intf_fmLoadInstrument(va_list &args) { + int instrId = va_arg(args, int); + uint8 *instrData = va_arg(args, uint8*); + return fmLoadInstrument(instrId, instrData); +} + +int TownsAudioInterface::intf_fmSetPitch(va_list &args) { + int chan = va_arg(args, int); + uint16 freq = va_arg(args, int) & 0xffff; + return fmSetPitch(chan, freq); +} + +int TownsAudioInterface::intf_fmSetLevel(va_list &args) { + int chan = va_arg(args, int); + int lvl = va_arg(args, int); + return fmSetLevel(chan, lvl); +} + +int TownsAudioInterface::intf_fmReset(va_list &args) { + fmReset(); + return 0; +} + +int TownsAudioInterface::intf_cdaReset(va_list &args) { + cdaReset(); + return 0; +} + +int TownsAudioInterface::intf_pcmUpdateEnvelopeGenerator(va_list &args) { + for (int i = 0; i < 8; i++) + pcmUpdateEnvelopeGenerator(i); + return 0; +} + +int TownsAudioInterface::intf_cdaSetVolume(va_list &args) { + /*int unk = va_arg(args, int); + int volume1 = va_arg(args, int); + int volume2 = va_arg(args, int);*/ + return 0; +} + +int TownsAudioInterface::intf_notImpl(va_list &args) { + return 4; +} + +void TownsAudioInterface::fmReset() { + TownsPC98_FmSynth::reset(); + + _fmChanPlaying = 0; + memset(_fmChanNote, 0, sizeof(_fmChanNote)); + memset(_fmChanPitch, 0, sizeof(_fmChanPitch)); + + memset(_fmSaveReg[0], 0, 240); + memset(&_fmSaveReg[0][240], 0x7f, 16); + memset(_fmSaveReg[1], 0, 256); + memset(&_fmSaveReg[1][240], 0x7f, 16); + _fmSaveReg[0][243] = _fmSaveReg[0][247] = _fmSaveReg[0][251] = _fmSaveReg[0][255] = + _fmSaveReg[1][243] = _fmSaveReg[1][247] = _fmSaveReg[1][251] = _fmSaveReg[1][255] = 0xff; + + for (int i = 0; i < 128; i++) + fmLoadInstrument(i, _fmDefaultInstrument); + + bufferedWriteReg(0, 0x21, 0); + bufferedWriteReg(0, 0x2C, 0x80); + bufferedWriteReg(0, 0x2B, 0); + bufferedWriteReg(0, 0x27, 0x30); + + for (int i = 0; i < 6; i++) { + fmKeyOff(i); + fmSetInstrument(i, 0); + fmSetLevel(i, 127); + } +} + +int TownsAudioInterface::fmKeyOn(int chan, int note, int velo) { + if (chan > 5) + return 1; + if (note < 12 || note > 107 || (velo & 0x80)) + return 3; + if (_fmChanPlaying & _chanFlags[chan]) + return 2; + + _fmChanPlaying |= _chanFlags[chan]; + note -= 12; + + _fmChanNote[chan] = note; + int16 pitch = _fmChanPitch[chan]; + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + int frq = 0; + uint8 bl = 0; + + if (note) { + frq = _frequency[(note - 1) % 12]; + bl = (note - 1) / 12; + } else { + frq = 616; + } + + frq += pitch; + + if (frq < 616) { + if (!bl) { + frq = 616; + } else { + frq += 616; + --bl; + } + } else if (frq > 1232) { + if (bl == 7) { + frq = 15500; + } else { + frq -= 616; + ++bl; + } + } + + frq |= (bl << 11); + + bufferedWriteReg(part, chan + 0xa4, (frq >> 8) & 0xff); + bufferedWriteReg(part, chan + 0xa0, frq & 0xff); + + velo = (velo >> 2) + 96; + uint16 c = _carrier[_fmSaveReg[part][0xb0 + chan] & 7]; + _fmSaveReg[part][0xe0 + chan] = velo; + + for (uint8 reg = 0x40 + chan; reg < 0x50; reg += 4) { + c += c; + if (c & 0x100) { + c &= 0xff; + bufferedWriteReg(part, reg, (((((((_fmSaveReg[part][0x80 + reg] ^ 0x7f) * velo) >> 7) + 1) * _fmSaveReg[part][0xd0 + chan]) >> 7) + 1) ^ 0x7f); + } + } + + uint8 v = chan; + if (part) + v |= 4; + + for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) + writeReg(part, reg, _fmSaveReg[part][reg] | 0x0f); + + writeReg(0, 0x28, v); + + for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) + writeReg(part, reg, _fmSaveReg[part][reg]); + + bufferedWriteReg(0, 0x28, v | 0xf0); + + return 0; +} + +int TownsAudioInterface::fmKeyOff(int chan) { + if (chan > 5) + return 1; + _fmChanPlaying &= ~_chanFlags[chan]; + if (chan > 2) + chan++; + bufferedWriteReg(0, 0x28, chan); + return 0; +} + +int TownsAudioInterface::fmChanOff(int chan) { + if (chan > 5) + return 1; + _fmChanPlaying &= ~_chanFlags[chan]; + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) + writeReg(part, reg, _fmSaveReg[part][reg] | 0x0f); + + if (part) + chan += 4; + writeReg(0, 0x28, chan); + return 0; +} + +int TownsAudioInterface::fmSetPanPos(int chan, int value) { + if (chan > 5) + return 1; + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + if (value > 0x40) + value = 0x40; + else if (value < 0x40) + value = 0x80; + else + value = 0xC0; + + bufferedWriteReg(part, 0xb4 + chan, (_fmSaveReg[part][0xb4 + chan] & 0x3f) | value); + return 0; +} + +int TownsAudioInterface::fmSetInstrument(int chan, int instrId) { + if (chan > 5) + return 1; + if (instrId > 127) + return 3; + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + uint8 *src = &_fmInstruments[instrId * 48 + 8]; + + uint16 c = _carrier[src[24] & 7]; + uint8 reg = 0x30 + chan; + + for (; reg < 0x40; reg += 4) + bufferedWriteReg(part, reg, *src++); + + for (; reg < 0x50; reg += 4) { + uint8 v = *src++; + _fmSaveReg[part][0x80 + reg] = _fmSaveReg[part][reg] = v; + c += c; + if (c & 0x100) { + c &= 0xff; + v = 127; + } + writeReg(part, reg, v); + } + + for (; reg < 0x90; reg += 4) + bufferedWriteReg(part, reg, *src++); + + reg += 0x20; + bufferedWriteReg(part, reg, *src++); + + uint8 v = *src++; + reg += 4; + if (v < 64) + v |= (_fmSaveReg[part][reg] & 0xc0); + bufferedWriteReg(part, reg, v); + + return 0; +} + +int TownsAudioInterface::fmLoadInstrument(int instrId, const uint8 *data) { + if (instrId > 127) + return 3; + assert(data); + memcpy(&_fmInstruments[instrId * 48], data, 48); + return 0; +} + +int TownsAudioInterface::fmSetPitch(int chan, int pitch) { + if (chan > 5) + return 1; + + uint8 bl = _fmChanNote[chan]; + int frq = 0; + + if (pitch < 0) { + if (bl) { + if (pitch < -8008) + pitch = -8008; + pitch *= -1; + pitch /= 13; + frq = _frequency[(bl - 1) % 12] - pitch; + bl = (bl - 1) / 12; + _fmChanPitch[chan] = -pitch; + + if (frq < 616) { + if (bl) { + frq += 616; + bl--; + } else { + frq = 616; + bl = 0; + } + } + } else { + frq = 616; + bl = 0; + } + + } else if (pitch > 0) { + if (bl < 96) { + if (pitch > 8008) + pitch = 8008; + pitch /= 13; + + if (bl) { + frq = _frequency[(bl - 1) % 12] + pitch; + bl = (bl - 1) / 12; + } else { + frq = 616; + bl = 0; + } + + _fmChanPitch[chan] = pitch; + + if (frq > 1232) { + if (bl < 7) { + frq -= 616; + bl++; + } else { + frq = 1164; + bl = 7; + } + } else { + if (bl >= 7 && frq > 1164) + frq = 1164; + } + + } else { + frq = 1164; + bl = 7; + } + } else { + _fmChanPitch[chan] = 0; + if (bl) { + frq = _frequency[(bl - 1) % 12]; + bl = (bl - 1) / 12; + } else { + frq = 616; + bl = 0; + } + } + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + frq |= (bl << 11); + + bufferedWriteReg(part, chan + 0xa4, (frq >> 8)); + bufferedWriteReg(part, chan + 0xa0, (frq & 0xff)); + + return 0; +} + +int TownsAudioInterface::fmSetLevel(int chan, int lvl) { + if (chan > 5) + return 1; + if (lvl > 127) + return 3; + + uint8 part = chan > 2 ? 1 : 0; + if (chan > 2) + chan -= 3; + + uint16 c = _carrier[_fmSaveReg[part][0xb0 + chan] & 7]; + _fmSaveReg[part][0xd0 + chan] = lvl; + + for (uint8 reg = 0x40 + chan; reg < 0x50; reg += 4) { + c += c; + if (c & 0x100) { + c &= 0xff; + bufferedWriteReg(part, reg, (((((((_fmSaveReg[part][0x80 + reg] ^ 0x7f) * lvl) >> 7) + 1) * _fmSaveReg[part][0xe0 + chan]) >> 7) + 1) ^ 0x7f); + } + } + return 0; +} + +void TownsAudioInterface::bufferedWriteReg(uint8 part, uint8 regAddress, uint8 value) { + _fmSaveReg[part][regAddress] = value; + writeReg(part, regAddress, value); +} + +void TownsAudioInterface::pcmReset() { + _pcmChanOut = 0; + _pcmChanReserved = _pcmChanKeyPressed = _pcmChanEffectPlaying = _pcmChanKeyPlaying = 0; + _numReservedChannels = 0; + + memset(_pcmChanNote, 0, 8); + memset(_pcmChanVelo, 0, 8); + memset(_pcmChanLevel, 0, 8); + + for (int i = 0; i < 8; i++) + _pcmChan[i].clear(); + + memset(_pcmInstruments, 0, 128 * 32); + static uint8 name[] = { 0x4E, 0x6F, 0x20, 0x44, 0x61, 0x74, 0x61, 0x21 }; + for (int i = 0; i < 32; i++) + memcpy(_pcmInstruments + i * 128, name, 8); + + for (int i = 0; i < 128; i++) + _waveTables[i].clear(); + _numWaveTables = 0; + _waveTablesTotalDataSize = 0; + + for (int i = 0x40; i < 0x48; i++) { + pcmSetInstrument(i, 0); + pcmSetLevel(i, 127); + } +} + +int TownsAudioInterface::pcmKeyOn(int chan, int note, int velo) { + if (chan < 0x40 || chan > 0x47) + return 1; + + if (note & 0x80 || velo & 0x80) + return 3; + + chan -= 0x40; + + if ((_pcmChanReserved & _chanFlags[chan]) || (_pcmChanKeyPressed & _chanFlags[chan])) + return 2; + + _pcmChanNote[chan] = note; + _pcmChanVelo[chan] = velo; + + TownsAudio_PcmChannel *p = &_pcmChan[chan]; + p->note = note; + + uint8 *instr = _pcmChan[chan].curInstrument; + int i = 0; + for (; i < 8; i++) { + if (note <= instr[16 + 2 * i]) + break; + } + + if (i == 8) + return 8; + + int il = i << 3; + p->note += instr[il + 70]; + + p->envTotalLevel = instr[il + 64]; + p->envAttackRate = instr[il + 65]; + p->envDecayRate = instr[il + 66]; + p->envSustainLevel = instr[il + 67]; + p->envSustainRate = instr[il + 68]; + p->envReleaseRate = instr[il + 69]; + p->envStep = 0; + + int32 id = (int32)READ_LE_UINT32(&instr[i * 4 + 32]); + + for (i = 0; i < _numWaveTables; i++) { + if (id == _waveTables[i].id) + break; + } + + if (i == _numWaveTables) + return 9; + + TownsAudio_WaveTable *w = &_waveTables[i]; + + p->data = w->data; + p->dataEnd = w->data + w->size; + p->setupLoop(w->loopStart, w->loopLen); + + pcmCalcPhaseStep(p, w); + + uint32 lvl = _pcmChanLevel[chan] * _pcmChanVelo[chan]; + p->envTotalLevel = ((p->envTotalLevel * lvl) >> 14) & 0xff; + p->envSustainLevel = ((p->envSustainLevel * lvl) >> 14) & 0xff; + + p->envAttack(); + p->velo = (p->envCurrentLevel >> 8) << 1; + + _pcmChanKeyPressed |= _chanFlags[chan]; + _pcmChanKeyPlaying |= _chanFlags[chan]; + _pcmChanOut |= _chanFlags[chan]; + + return 0; +} + +int TownsAudioInterface::pcmKeyOff(int chan) { + if (chan < 0x40 || chan > 0x47) + return 1; + + chan -= 0x40; + _pcmChanKeyPressed &= ~_chanFlags[chan]; + _pcmChan[chan].envRelease(); + return 0; +} + +int TownsAudioInterface::pcmChanOff(int chan) { + if (chan < 0x40 || chan > 0x47) + return 1; + + chan -= 0x40; + + _pcmChanKeyPressed &= ~_chanFlags[chan]; + _pcmChanEffectPlaying &= ~_chanFlags[chan]; + _pcmChanKeyPlaying &= ~_chanFlags[chan]; + _pcmChanOut &= ~_chanFlags[chan]; + + return 0; +} + +int TownsAudioInterface::pcmSetPanPos(int chan, int mode) { + if (chan > 0x47) + return 1; + if (mode & 0x80) + return 3; + + chan -= 0x40; + uint8 blc = 0x77; + + if (mode > 64) { + mode -= 64; + blc = ((blc ^ (mode >> 3)) + (mode << 4)) & 0xff; + } else if (mode < 64) { + mode = (mode >> 3) ^ 7; + blc = ((119 + mode) ^ (mode << 4)) & 0xff; + } + + _pcmChan[chan].panLeft = blc & 0x0f; + _pcmChan[chan].panRight = blc >> 4; + + return 0; +} + +int TownsAudioInterface::pcmSetInstrument(int chan, int instrId) { + if (chan > 0x47) + return 1; + if (instrId > 31) + return 3; + chan -= 0x40; + _pcmChan[chan].curInstrument = &_pcmInstruments[instrId * 128]; + return 0; +} + +int TownsAudioInterface::pcmLoadInstrument(int instrId, const uint8 *data) { + if (instrId > 31) + return 3; + assert(data); + memcpy(&_pcmInstruments[instrId * 128], data, 128); + return 0; +} + +int TownsAudioInterface::pcmSetPitch(int chan, int pitch) { + if (chan > 0x47) + return 1; + + if (pitch < -8192 || pitch > 8191) + return 3; + + chan -= 0x40; + TownsAudio_PcmChannel *p = &_pcmChan[chan]; + + uint32 pts = 0x4000; + + if (pitch < 0) + pts = (0x20000000 / (-pitch + 0x2001)) >> 2; + else if (pitch > 0) + pts = (((pitch + 0x2001) << 16) / 0x2000) >> 2; + + p->stepPitch = pts & 0xffff; + p->step = (p->stepNote * p->stepPitch) >> 14; + +// if (_pcmChanUnkFlag & _chanFlags[chan]) +// unk[chan] = (((p->step * 1000) << 11) / 98) / 20833; + + /*else*/ if ((_pcmChanEffectPlaying & _chanFlags[chan]) && (p->step > 2048)) + p->step = 2048; + + return 0; +} + +int TownsAudioInterface::pcmSetLevel(int chan, int lvl) { + if (chan > 0x47) + return 1; + + if (lvl & 0x80) + return 3; + + chan -= 0x40; + TownsAudio_PcmChannel *p = &_pcmChan[chan]; + + if (_pcmChanReserved & _chanFlags[chan]) { + _pcmChanVelo[chan] = lvl; + p->velo = lvl << 1; + } else { + int32 t = p->envStep * lvl; + if (_pcmChanLevel[chan]) + t /= _pcmChanLevel[chan]; + p->envStep = t; + t = p->envCurrentLevel * lvl; + if (_pcmChanLevel[chan]) + t /= _pcmChanLevel[chan]; + p->envCurrentLevel = t; + _pcmChanLevel[chan] = lvl; + p->velo = p->envCurrentLevel >> 8; + } + + return 0; +} + +void TownsAudioInterface::pcmUpdateEnvelopeGenerator(int chan) { + TownsAudio_PcmChannel *p = &_pcmChan[chan]; + if (!p->envCurrentLevel) { + _pcmChanKeyPlaying &= ~_chanFlags[chan]; + p->envState = kEnvReady; + } + + if (!(_pcmChanKeyPlaying & _chanFlags[chan])) + return; + + switch (p->envState) { + case kEnvAttacking: + if (((p->envCurrentLevel + p->envStep) >> 8) > p->envTotalLevel) { + p->envDecay(); + return; + } else { + p->envCurrentLevel += p->envStep; + } + break; + + case kEnvDecaying: + if (((p->envCurrentLevel - p->envStep) >> 8) < p->envSustainLevel) { + p->envSustain(); + return; + } else { + p->envCurrentLevel -= p->envStep; + } + break; + + case kEnvSustaining: + case kEnvReleasing: + p->envCurrentLevel -= p->envStep; + if (p->envCurrentLevel <= 0) + p->envCurrentLevel = 0; + break; + + default: + break; + } + p->velo = (p->envCurrentLevel >> 8) << 1; +} + +void TownsAudioInterface::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w) { + int8 diff = p->note - w->baseNote; + uint16 r = w->rate + w->rateOffs; + uint16 bl = 0; + uint32 s = 0; + + if (diff < 0) { + diff -= 1; + bl = diff % 12; + diff /= 12; + s = (r >> diff); + if (bl) + s = (s * _pcmPhase2[bl]) >> 16; + + } else if (diff > 0) { + bl = diff % 12; + diff /= 12; + s = (r << diff); + if (bl) + s += ((s * _pcmPhase1[bl]) >> 16); + + } else { + s = r; + } + + p->stepNote = s & 0xffff; + p->step = (s * p->stepPitch) >> 14; +} + +void TownsAudioInterface::cdaReset() { + +} + +const uint8 TownsAudioInterface::_chanFlags[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 +}; + +const uint16 TownsAudioInterface::_frequency[] = { + 0x028C, 0x02B4, 0x02DC, 0x030A, 0x0338, 0x0368, 0x039C, 0x03D4, 0x040E, 0x044A, 0x048C, 0x04D0 +}; + +const uint8 TownsAudioInterface::_carrier[] = { + 0x10, 0x10, 0x10, 0x10, 0x30, 0x70, 0x70, 0xF0 +}; + +const uint8 TownsAudioInterface::_fmDefaultInstrument[] = { + 0x45, 0x4C, 0x45, 0x50, 0x49, 0x41, 0x4E, 0x4F, 0x01, 0x0A, 0x02, 0x01, + 0x1E, 0x32, 0x05, 0x00, 0x9C, 0xDC, 0x9C, 0xDC, 0x07, 0x03, 0x14, 0x08, + 0x00, 0x03, 0x05, 0x05, 0x55, 0x45, 0x27, 0xA7, 0x04, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint16 TownsAudioInterface::_pcmPhase1[] = { + 0x879B, 0x0F37, 0x1F58, 0x306E, 0x4288, 0x55B6, 0x6A08, 0x7F8F, 0x965E, 0xAE88, 0xC882, 0xE341 +}; + +const uint16 TownsAudioInterface::_pcmPhase2[] = { + 0xFEFE, 0xF1A0, 0xE411, 0xD744, 0xCB2F, 0xBFC7, 0xB504, 0xAAE2, 0xA144, 0x9827, 0x8FAC +}; + +TownsAudio_PcmChannel::TownsAudio_PcmChannel() { + extData = 0; + clear(); +} + +TownsAudio_PcmChannel::~TownsAudio_PcmChannel() { + clear(); +} + +void TownsAudio_PcmChannel::loadExtData(uint8 *buffer, uint32 size) { + delete[] extData; + extData = new int8[size]; + int8 *src = (int8*)buffer; + int8 *dst = extData; + for (uint32 i = 0; i < size; i++) + *dst++ = *src & 0x80 ? (*src++ & 0x7f) : -*src++; + + data = extData; + dataEnd = extData + size; + pos = 0; +} + +void TownsAudio_PcmChannel::setupLoop(uint32 start, uint32 len) { + loopLen = len << 11; + loopEnd = loopLen ? &data[(start + loopLen) >> 11] : dataEnd; + pos = start; +} + +void TownsAudio_PcmChannel::clear() { + curInstrument = 0; + note = 0; + velo = 0; + + data = 0; + dataEnd = 0; + loopLen = 0; + + pos = 0; + loopEnd = 0; + + step = 0; + stepNote = 0x4000; + stepPitch = 0x4000; + + panLeft = panRight = 0; + + envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = + envSustainRate = envReleaseRate = 0; + envStep = envCurrentLevel = 0; + + envState = kEnvReady; + + delete[] extData; + extData = 0; +} + +void TownsAudio_PcmChannel::envAttack() { + envState = kEnvAttacking; + int16 t = envTotalLevel << 8; + if (envAttackRate == 127) { + envStep = 0; + } else if (envAttackRate) { + envStep = t / envAttackRate; + envCurrentLevel = 1; + } else { + envCurrentLevel = t; + envDecay(); + } +} + +void TownsAudio_PcmChannel::envDecay() { + envState = kEnvDecaying; + int16 t = envTotalLevel - envSustainLevel; + if (t < 0 || envDecayRate == 127) { + envStep = 0; + } else if (envDecayRate) { + envStep = (t << 8) / envDecayRate; + } else { + envCurrentLevel = envSustainLevel << 8; + envSustain(); + } +} + +void TownsAudio_PcmChannel::envSustain() { + envState = kEnvSustaining; + if (envSustainLevel && envSustainRate) + envStep = (envSustainRate == 127) ? 0 : (envCurrentLevel / envSustainRate) >> 1; + else + envStep = envCurrentLevel = 1; +} + +void TownsAudio_PcmChannel::envRelease() { + envState = kEnvReleasing; + if (envReleaseRate == 127) + envStep = 0; + else if (envReleaseRate) + envStep = envCurrentLevel / envReleaseRate; + else + envStep = envCurrentLevel = 1; +} + +TownsAudio_WaveTable::TownsAudio_WaveTable() { + data = 0; + clear(); +} + +TownsAudio_WaveTable::~TownsAudio_WaveTable() { + clear(); +} + +void TownsAudio_WaveTable::readHeader(const uint8 *buffer) { + memcpy(name, buffer, 8); + name[8] = 0; + id = READ_LE_UINT32(&buffer[8]); + size = READ_LE_UINT32(&buffer[12]); + loopStart = READ_LE_UINT32(&buffer[16]); + loopLen = READ_LE_UINT32(&buffer[20]); + rate = READ_LE_UINT16(&buffer[24]); + rateOffs = READ_LE_UINT16(&buffer[26]); + baseNote = READ_LE_UINT32(&buffer[28]); +} + +void TownsAudio_WaveTable::readData(const uint8 *buffer) { + if (!size) + return; + + delete[] data; + data = new int8[size]; + + const int8 *src = (const int8*)buffer; + int8 *dst = data; + for (uint32 i = 0; i < size; i++) + *dst++ = *src & 0x80 ? (*src++ & 0x7f) : -*src++; +} + +void TownsAudio_WaveTable::clear() { + name[0] = name[8] = 0; + id = -1; + size = 0; + loopStart = 0; + loopLen = 0; + rate = 0; + rateOffs = 0; + baseNote = 0; + delete[] data; + data = 0; +} + diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h new file mode 100644 index 0000000000..82d390d9b6 --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -0,0 +1,162 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef TOWNS_AUDIO_H +#define TOWNS_AUDIO_H + +#include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" + +class TownsAudioInterfacePluginDriver { +public: + virtual void timerCallback(int timerId) = 0; +}; + +class TownsAudio_PcmChannel; +class TownsAudio_WaveTable; + +class TownsAudioInterface : public TownsPC98_FmSynth { +public: + TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver); + ~TownsAudioInterface(); + + bool init(); + + int callback(int command, ...); + +private: + void nextTickEx(int32 *buffer, uint32 bufferSize); + + void timerCallbackA(); + void timerCallbackB(); + + typedef int (TownsAudioInterface::*TownsAudioIntfCallback)(va_list&); + const TownsAudioIntfCallback *_intfOpcodes; + + int intf_reset(va_list &args); + int intf_keyOn(va_list &args); + int intf_keyOff(va_list &args); + int intf_setPanPos(va_list &args); + int intf_setInstrument(va_list &args); + int intf_loadInstrument(va_list &args); + int intf_setPitch(va_list &args); + int intf_setLevel(va_list &args); + int intf_chanOff(va_list &args); + int intf_writeReg(va_list &args); + int intf_bufferedWriteReg(va_list &args); + int intf_readRegBuffer(va_list &args); + int intf_setTimerA(va_list &args); + int intf_setTimerB(va_list &args); + int intf_enableTimerA(va_list &args); + int intf_enableTimerB(va_list &args); + int intf_reserveEffectChannels(va_list &args); + int intf_loadWaveTable(va_list &args); + int intf_unloadWaveTable(va_list &args); + int intf_pcmPlayEffect(va_list &args); + int intf_pcmChanOff(va_list &args); + int intf_pcmEffectPlaying(va_list &args); + int intf_fmKeyOn(va_list &args); + int intf_fmKeyOff(va_list &args); + int intf_fmSetPanPos(va_list &args); + int intf_fmSetInstrument(va_list &args); + int intf_fmLoadInstrument(va_list &args); + int intf_fmSetPitch(va_list &args); + int intf_fmSetLevel(va_list &args); + int intf_fmReset(va_list &args); + int intf_cdaSetVolume(va_list &args); + int intf_cdaReset(va_list &args); + int intf_pcmUpdateEnvelopeGenerator(va_list &args); + + int intf_notImpl(va_list &args); + + void fmReset(); + int fmKeyOn(int chan, int note, int velo); + int fmKeyOff(int chan); + int fmChanOff(int chan); + int fmSetPanPos(int chan, int mode); + int fmSetInstrument(int chan, int instrId); + int fmLoadInstrument(int instrId, const uint8 *data); + int fmSetPitch(int chan, int pitch); + int fmSetLevel(int chan, int lvl); + + void bufferedWriteReg(uint8 part, uint8 regAddress, uint8 value); + + uint8 _fmChanPlaying; + uint8 _fmChanNote[6]; + int16 _fmChanPitch[6]; + + uint8 *_fmSaveReg[2]; + uint8 *_fmInstruments; + + void pcmReset(); + int pcmKeyOn(int chan, int note, int velo); + int pcmKeyOff(int chan); + int pcmChanOff(int chan); + int pcmSetPanPos(int chan, int mode); + int pcmSetInstrument(int chan, int instrId); + int pcmLoadInstrument(int instrId, const uint8 *data); + int pcmSetPitch(int chan, int pitch); + int pcmSetLevel(int chan, int lvl); + void pcmUpdateEnvelopeGenerator(int chan); + + TownsAudio_PcmChannel *_pcmChan; + uint8 _pcmChanOut; + uint8 _pcmChanReserved; + uint8 _pcmChanKeyPressed; + uint8 _pcmChanEffectPlaying; + uint8 _pcmChanKeyPlaying; + + uint8 _pcmChanNote[8]; + uint8 _pcmChanVelo[8]; + uint8 _pcmChanLevel[8]; + + uint8 _numReservedChannels; + uint8 *_pcmInstruments; + + TownsAudio_WaveTable *_waveTables; + uint8 _numWaveTables; + uint32 _waveTablesTotalDataSize; + + void pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w); + + void cdaReset(); + + const float _baserate; + uint32 _timerBase; + uint32 _tickLength; + uint32 _timer; + + TownsAudioInterfacePluginDriver *_drv; + bool _ready; + + static const uint8 _chanFlags[]; + static const uint16 _frequency[]; + static const uint8 _carrier[]; + static const uint8 _fmDefaultInstrument[]; + static const uint16 _pcmPhase1[]; + static const uint16 _pcmPhase2[]; +}; + +#endif + diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp new file mode 100644 index 0000000000..54b5d5b1d6 --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -0,0 +1,886 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sound/softsynth/fmtowns_pc98/towns_euphony.h" +#include "common/endian.h" + +TownsEuphonyDriver::TownsEuphonyDriver(Audio::Mixer *mixer) : _activeChannels(0), _sustainChannels(0), + _assignedChannels(0), _paraCount(0), _command(0), _tEnable(0), _tMode(0), _tOrdr(0), _tLevel(0), + _tTranspose(0), _musicPos(0), _musicStart(0), _playing(false), _eventBuffer(0), _bufferedEventsCount(0), + _tempoControlMode(0) { + _para[0] = _para[1] = 0; + _intf = new TownsAudioInterface(mixer, this); + resetTempo(); +} + +TownsEuphonyDriver::~TownsEuphonyDriver() { + delete[] _activeChannels; + delete[] _sustainChannels; + delete[] _assignedChannels; + + delete[] _tEnable; + delete[] _tMode; + delete[] _tOrdr; + delete[] _tLevel; + delete[] _tTranspose; + + delete _intf; +} + +bool TownsEuphonyDriver::init() { + if (!_intf->init()) + return false; + + _activeChannels = new int8[16]; + _sustainChannels = new int8[16]; + _assignedChannels = new ActiveChannel[128]; + _eventBuffer = new DlEvent[64]; + + _tEnable = new uint8[32]; + _tMode = new uint8[32]; + _tOrdr = new uint8[32]; + _tLevel = new int8[32]; + _tTranspose = new int8[32]; + + reset(); + + cdaSetVolume(1, 118, 118); + + return true; +} + +void TownsEuphonyDriver::reset() { + _intf->callback(0); + + _intf->callback(74); + _intf->callback(70); + _intf->callback(75, 3); + + setTimerA(true, 1); + setTimerA(false, 1); + setTimerB(true, 221); + + _paraCount = _command = _para[0] = _para[1] = 0; + memset(_sustainChannels, 0, 16); + memset(_activeChannels, -1, 16); + for (int i = 0; i < 128; i++) { + _assignedChannels[i].chan = _assignedChannels[i].next = -1; + _assignedChannels[i].note = _assignedChannels[i].sub = 0; + } + + int e = 0; + for (int i = 0; i < 6; i++) + assignChannel(i, e++); + for (int i = 0x40; i < 0x48; i++) + assignChannel(i, e++); + + resetTables(); + + memset(_eventBuffer, 0, 64 * sizeof(DlEvent)); + _bufferedEventsCount = 0; + + _playing = _endOfTrack = _suspendParsing = _loop = false; + _elapsedEvents = 0; + _tempoDiff = 0; + + resetTempo(); + + if (_tempoControlMode == 1) { + //if (///) + // return; + setTempoIntern(_defaultTempo); + } else { + setTempoIntern(_defaultTempo); + } + + resetControl(); +} + +void TownsEuphonyDriver::loadInstrument(int chanType, int id, const uint8 *data) { + _intf->callback(5, chanType, id, data); +} + +void TownsEuphonyDriver::loadWaveTable(const uint8 *data) { + _intf->callback(34, data); +} + +void TownsEuphonyDriver::unloadWaveTable(int id) { + _intf->callback(35, id); +} + +void TownsEuphonyDriver::reserveSfxChannels(int num) { + _intf->callback(33, num); +} + +int TownsEuphonyDriver::setMusicTempo(int tempo) { + if (tempo > 250) + return 3; + _defaultTempo = tempo; + _trackTempo = tempo; + setTempoIntern(tempo); + return 0; +} + +int TownsEuphonyDriver::startMusicTrack(const uint8 *data, int trackSize, int startTick) { + if (_playing) + return 2; + + _musicPos = _musicStart = data; + _defaultBaseTickLen = _baseTickLen = startTick; + _musicTrackSize = trackSize; + _timeStampBase = _timeStampDest = 0; + _tickCounter = 0; + _playing = true; + + return 0; +} + +void TownsEuphonyDriver::setMusicLoop(bool loop) { + _loop = loop; +} + +void TownsEuphonyDriver::stopParser() { + if (_playing) { + _playing = false; + _pulseCount = 0; + _endOfTrack = false; + flushEventBuffer(); + resetControl(); + } +} + +void TownsEuphonyDriver::playSoundEffect(int chan, int note, int velo, const uint8 *data) { + _intf->callback(37, chan, note, velo, data); +} + +void TownsEuphonyDriver::stopSoundEffect(int chan) { + _intf->callback(39, chan); +} + +bool TownsEuphonyDriver::soundEffectIsPlaying(int chan) { + return _intf->callback(40, chan) ? true : false; +} + +void TownsEuphonyDriver::chanStereo(int chan, int mode) { + _intf->callback(3, chan, mode); +} + +void TownsEuphonyDriver::chanPitch(int chan, int pitch) { + _intf->callback(7, chan, pitch); +} + +void TownsEuphonyDriver::chanVolume(int chan, int vol) { + _intf->callback(8, chan, vol); +} + +void TownsEuphonyDriver::cdaSetVolume(int a, int vol1, int vol2) { + _intf->callback(67, a, vol1, vol2); +} + +int TownsEuphonyDriver::chanEnable(int tableEntry, int val) { + if (tableEntry > 31) + return 3; + _tEnable[tableEntry] = val; + return 0; +} + +int TownsEuphonyDriver::chanMode(int tableEntry, int val) { + if (tableEntry > 31) + return 3; + _tMode[tableEntry] = val; + return 0; +} + +int TownsEuphonyDriver::chanOrdr(int tableEntry, int val) { + if (tableEntry > 31) + return 3; + if (val < 16) + _tOrdr[tableEntry] = val; + return 0; +} + +int TownsEuphonyDriver::chanLevel(int tableEntry, int val) { + if (tableEntry > 31) + return 3; + if (val <= 40) + _tLevel[tableEntry] = (int8) (val & 0xff); + return 0; +} + +int TownsEuphonyDriver::chanTranspose(int tableEntry, int val) { + if (tableEntry > 31) + return 3; + if (val <= 40) + _tTranspose[tableEntry] = (int8) (val & 0xff); + return 0; +} + +int TownsEuphonyDriver::assignChannel(int chan, int tableEntry) { + if (tableEntry > 15 || chan > 127 || chan < 0) + return 3; + + ActiveChannel *a = &_assignedChannels[chan]; + if (a->chan == tableEntry) + return 0; + + if (a->chan != -1) { + int8 *b = &_activeChannels[a->chan]; + while(*b != chan) { + b = &_assignedChannels[*b].next; + if (*b == -1 && *b != chan) + return 3; + } + + *b = a->next; + + if (a->note) + _intf->callback(2, chan); + + a->chan = a->next = -1; + a->note = 0; + } + + a->next = _activeChannels[tableEntry]; + _activeChannels[tableEntry] = chan; + a->chan = tableEntry; + a->note = a->sub = 0; + + return 0; +} + +void TownsEuphonyDriver::timerCallback(int timerId) { + switch (timerId) { + case 0: + updatePulseCount(); + while (_pulseCount > 0) { + --_pulseCount; + updateTimeStampBase(); + if (!_playing) + continue; + updateEventBuffer(); + updateParser(); + updateCheckEot(); + } + break; + default: + break; + } +} + +void TownsEuphonyDriver::resetTables() { + memset(_tEnable, 0xff, 32); + memset(_tMode, 0xff, 16); + memset(_tMode + 16, 0, 16); + for (int i = 0; i < 32; i++) + _tOrdr[i] = i & 0x0f; + memset(_tLevel, 0, 32); + memset(_tTranspose, 0, 32); +} + +void TownsEuphonyDriver::resetTempo() { + _defaultBaseTickLen = _baseTickLen = 0x33; + _pulseCount = 0; + _extraTimingControlRemainder = 0; + _extraTimingControl = 16; + _tempoModifier = 0; + _timeStampDest = 0; + _deltaTicks = 0; + _tickCounter = 0; + _defaultTempo = 90; + _trackTempo = 90; +} + +void TownsEuphonyDriver::setTempoIntern(int tempo) { + tempo = CLIP(tempo + _tempoModifier, 0, 500); + if (_tempoControlMode == 0) { + _timerSetting = 34750 / (tempo + 30); + _extraTimingControl = 16; + + while (_timerSetting < 126) { + _timerSetting <<= 1; + _extraTimingControl <<= 1; + } + + while (_timerSetting > 383) { + _timerSetting >>= 1; + _extraTimingControl >>= 1; + } + + setTimerA(true, -(_timerSetting - 2)); + + } else if (_tempoControlMode == 1) { + _timerSetting = 312500 / (tempo + 30); + _extraTimingControl = 16; + while (_timerSetting < 1105) { + _timerSetting <<= 1; + _extraTimingControl <<= 1; + } + + } else if (_tempoControlMode == 2) { + _timerSetting = 625000 / (tempo + 30); + _extraTimingControlRemainder = 0; + } +} + +void TownsEuphonyDriver::setTimerA(bool enable, int tempo) { + _intf->callback(21, enable ? 255 : 0, tempo); +} + +void TownsEuphonyDriver::setTimerB(bool enable, int tempo) { + _intf->callback(22, enable ? 255 : 0, tempo); +} + +void TownsEuphonyDriver::updatePulseCount() { + int tc = _extraTimingControl + _extraTimingControlRemainder; + _extraTimingControlRemainder = tc & 0x0f; + tc >>= 4; + _tempoDiff -= tc; + + while (_tempoDiff < 0) { + _elapsedEvents++; + _tempoDiff += 4; + } + + if (_playing && !_suspendParsing) + _pulseCount += tc; +} + +void TownsEuphonyDriver::updateTimeStampBase() { + static const uint16 table[] = { 0x180, 0xC0, 0x80, 0x60, 0x40, 0x30, 0x20, 0x18 }; + if ((uint32)(table[_baseTickLen >> 4] * ((_baseTickLen & 0x0f) + 1)) > ++_tickCounter) + return; + ++_timeStampDest; + _tickCounter = 0; + _deltaTicks = 0; +} + +void TownsEuphonyDriver::updateParser() { + for (bool loop = true; loop; ) { + uint8 cmd = _musicPos[0]; + + if (cmd == 0xff || cmd == 0xf7) { + jumpNextLoop(); + + } else if (cmd < 0x90) { + _endOfTrack = true; + flushEventBuffer(); + loop = false; + + } else if (_timeStampBase > _timeStampDest) { + loop = false; + + } else { + if (_timeStampBase == _timeStampDest) { + uint16 timeStamp = READ_LE_UINT16(&_musicPos[2]); + uint8 l = (timeStamp & 0xff) + (timeStamp & 0xff); + timeStamp = ((timeStamp & 0xff00) | l) >> 1; + if (timeStamp > _tickCounter) + loop = false; + } + + if (loop) { + if (parseNext()) + loop = false; + } + } + } +} + +void TownsEuphonyDriver::updateCheckEot() { + if (!_endOfTrack || _bufferedEventsCount) + return; + stopParser(); +} + +bool TownsEuphonyDriver::parseNext() { +#define OPC(x) &TownsEuphonyDriver::evt##x + static const EuphonyOpcode opcodes[] = { + OPC(NotImpl), + OPC(SetupNote), + OPC(PolyphonicAftertouch), + OPC(ControlPitch), + OPC(InstrumentChanAftertouch), + OPC(InstrumentChanAftertouch), + OPC(ControlPitch) + }; +#undef OPC + + uint cmd = _musicPos[0]; + if (cmd != 0xfe && cmd != 0xfd) { + if (cmd >= 0xf0 ) { + cmd &= 0x0f; + if (cmd == 0) + evtLoadInstrument(); + else if (cmd == 2) + evtAdvanceTimestampOffset(); + else if (cmd == 8) + evtTempo(); + else if (cmd == 12) + evtModeOrdrChange(); + jumpNextLoop(); + return false; + + } else if (!(this->*opcodes[(cmd - 0x80) >> 4])()) { + jumpNextLoop(); + return false; + } + } + + if (cmd == 0xfd) { + _suspendParsing = true; + return true; + } + + if (!_loop) { + _endOfTrack = true; + return true; + } + + _endOfTrack = false; + _musicPos = _musicStart; + _timeStampBase = _timeStampDest = _tickCounter = 0; + _baseTickLen = _defaultBaseTickLen; + + return false; +} + +void TownsEuphonyDriver::jumpNextLoop() { + _musicPos += 6; + if (_musicPos >= _musicStart + _musicTrackSize) + _musicPos = _musicStart; +} + +void TownsEuphonyDriver::updateEventBuffer() { + DlEvent *e = _eventBuffer; + for (int i = _bufferedEventsCount; i; e++) { + if (e->evt == 0) + continue; + if (--e->len) { + --i; + continue; + } + processBufferNote(e->mode, e->evt, e->note, e->velo); + e->evt = 0; + --i; + --_bufferedEventsCount; + } +} + +void TownsEuphonyDriver::flushEventBuffer() { + DlEvent *e = _eventBuffer; + for (int i = _bufferedEventsCount; i; e++) { + if (e->evt == 0) + continue; + processBufferNote(e->mode, e->evt, e->note, e->velo); + e->evt = 0; + --i; + --_bufferedEventsCount; + } +} + +void TownsEuphonyDriver::processBufferNote(int mode, int evt, int note, int velo) { + if (!velo) + evt &= 0x8f; + sendEvent(mode, evt); + sendEvent(mode, note); + sendEvent(mode, velo); +} + +void TownsEuphonyDriver::resetControl() { + for (int i = 0; i < 32; i++) { + if (_tOrdr[i] > 15) { + for (int ii = 0; ii < 16; ii++) + resetControlIntern(_tMode[i], ii); + } else { + resetControlIntern(_tMode[i], _tOrdr[i]); + } + } +} + +void TownsEuphonyDriver::resetControlIntern(int mode, int chan) { + sendEvent(mode, 0xb0 | chan); + sendEvent(mode, 0x40); + sendEvent(mode, 0); + sendEvent(mode, 0xb0 | chan); + sendEvent(mode, 0x7b); + sendEvent(mode, 0); + sendEvent(mode, 0xb0 | chan); + sendEvent(mode, 0x79); + sendEvent(mode, 0x40); +} + +uint8 TownsEuphonyDriver::appendEvent(uint8 evt, uint8 chan) { + if (evt >= 0x80 && evt < 0xf0 && _tOrdr[chan] < 16) + return (evt & 0xf0) | _tOrdr[chan]; + return evt; +} + +void TownsEuphonyDriver::sendEvent(uint8 mode, uint8 command) { + if (mode == 0) { + warning("TownsEuphonyDriver: Mode 0 not implemented."); + + } else if (mode == 0x10) { + warning("TownsEuphonyDriver: Mode 0x10 not implemented."); + + } else if (mode == 0xff) { + if (command >= 0xf0) { + _paraCount = 1; + _command = 0; + } else if (command >= 0x80) { + _paraCount = 1; + _command = command; + } else if (_command >= 0x80) { + switch ((_command - 0x80) >> 4) { + case 0: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + _para[1] = command; + sendNoteOff(); + } + break; + + case 1: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + _para[1] = command; + if (command) + sendNoteOn(); + else + sendNoteOff(); + } + break; + + case 2: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + } + break; + + case 3: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + _para[1] = command; + + if (_para[0] == 7) + sendChanVolume(); + else if (_para[0] == 10) + sendPanPosition(); + else if (_para[0] == 64) + sendAllNotesOff(); + } + break; + + case 4: + _paraCount = 1; + _para[0] = command; + sendSetInstrument(); + break; + + case 5: + _paraCount = 1; + _para[0] = command; + break; + + case 6: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + _para[1] = command; + sendPitch(); + } + break; + } + } + } +} + +bool TownsEuphonyDriver::evtSetupNote() { + if (_musicPos[1] > 31) + return false; + if (!_tEnable[_musicPos[1]]) { + jumpNextLoop(); + return (_musicPos[0] == 0xfe || _musicPos[0] == 0xfd) ? true : false; + } + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); + uint8 mode = _tMode[_musicPos[1]]; + uint8 note = _musicPos[4]; + uint8 velo = _musicPos[5]; + + sendEvent(mode, evt); + sendEvent(mode, prepTranspose(note)); + sendEvent(mode, prepVelo(velo)); + + jumpNextLoop(); + if (_musicPos[0] == 0xfe || _musicPos[0] == 0xfd) + return true; + + velo = _musicPos[5]; + uint16 len = ((((_musicPos[1] << 4) | (_musicPos[2] << 8)) >> 4) & 0xff) | ((((_musicPos[3] << 4) | (_musicPos[4] << 8)) >> 4) << 8); + + int i = 0; + for (; i < 64; i++) { + if (_eventBuffer[i].evt == 0) + break; + } + + if (i == 64) { + processBufferNote(mode, evt, note, velo); + } else { + _eventBuffer[i].evt = evt; + _eventBuffer[i].mode = mode; + _eventBuffer[i].note = note; + _eventBuffer[i].velo = velo; + _eventBuffer[i].len = len ? len : 1; + _bufferedEventsCount++; + } + + return false; +} + +bool TownsEuphonyDriver::evtPolyphonicAftertouch() { + if (_musicPos[1] > 31) + return false; + if (!_tEnable[_musicPos[1]]) + return false; + + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); + uint8 mode = _tMode[_musicPos[1]]; + + sendEvent(mode, evt); + sendEvent(mode, prepTranspose(_musicPos[4])); + sendEvent(mode, _musicPos[5]); + + return false; +} + +bool TownsEuphonyDriver::evtControlPitch() { + if (_musicPos[1] > 31) + return false; + if (!_tEnable[_musicPos[1]]) + return false; + + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); + uint8 mode = _tMode[_musicPos[1]]; + + sendEvent(mode, evt); + sendEvent(mode, _musicPos[4]); + sendEvent(mode, _musicPos[5]); + + return false; +} + +bool TownsEuphonyDriver::evtInstrumentChanAftertouch() { + if (_musicPos[1] > 31) + return false; + if (!_tEnable[_musicPos[1]]) + return false; + + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); + uint8 mode = _tMode[_musicPos[1]]; + + sendEvent(mode, evt); + sendEvent(mode, _musicPos[4]); + + return false; +} + +bool TownsEuphonyDriver::evtLoadInstrument() { + return false; +} + +bool TownsEuphonyDriver::evtAdvanceTimestampOffset() { + ++_timeStampBase; + _baseTickLen = _musicPos[1]; + return false; +} + +bool TownsEuphonyDriver::evtTempo() { + uint8 l = _musicPos[4] << 1; + _trackTempo = (l | (_musicPos[5] << 8)) >> 1; + setTempoIntern(_trackTempo); + return false; +} + +bool TownsEuphonyDriver::evtModeOrdrChange() { + if (_musicPos[1] > 31) + return false; + if (!_tEnable[_musicPos[1]]) + return false; + + if (_musicPos[4] == 1) + _tMode[_musicPos[1]] = _musicPos[5]; + else if (_musicPos[4] == 2) + _tOrdr[_musicPos[1]] = _musicPos[5]; + + return false; +} + +uint8 TownsEuphonyDriver::prepTranspose(uint8 in) { + int out = _tTranspose[_musicPos[1]]; + if (!out) + return in; + out += (in & 0x7f); + + if (out > 127) + out -= 12; + + if (out < 0) + out += 12; + + return out & 0xff; +} + +uint8 TownsEuphonyDriver::prepVelo(uint8 in) { + int out = _tLevel[_musicPos[1]]; + out += (in & 0x7f); + out = CLIP(out, 1, 127); + + return out & 0xff; +} + +void TownsEuphonyDriver::sendNoteOff() { + int8 *chan = &_activeChannels[_command & 0x0f]; + if (*chan == -1) + return; + + while (_assignedChannels[*chan].note != _para[0]) { + chan = &_assignedChannels[*chan].next; + if (*chan == -1) + return; + } + + if (_sustainChannels[_command & 0x0f]) { + _assignedChannels[*chan].note |= 0x80; + } else { + _assignedChannels[*chan].note = 0; + _intf->callback(2, *chan); + } +} + +void TownsEuphonyDriver::sendNoteOn() { + if (!_para[0]) + return; + int8 *chan = &_activeChannels[_command & 0x0f]; + if (*chan == -1) + return; + + do { + _assignedChannels[*chan].sub++; + chan = &_assignedChannels[*chan].next; + } while (*chan != -1); + + chan = &_activeChannels[_command & 0x0f]; + + int d = 0; + int c = 0; + bool found = false; + + do { + if (!_assignedChannels[*chan].note) { + found = true; + break; + } + if (d <= _assignedChannels[*chan].sub) { + c = *chan; + d = _assignedChannels[*chan].sub; + } + chan = &_assignedChannels[*chan].next; + } while (*chan != -1); + + if (found) + c = *chan; + else + _intf->callback(2, c); + + _assignedChannels[c].note = _para[0]; + _assignedChannels[c].sub = 0; + _intf->callback(1, c, _para[0], _para[1]); +} + +void TownsEuphonyDriver::sendChanVolume() { + int8 *chan = &_activeChannels[_command & 0x0f]; + while (*chan != -1) { + _intf->callback(8, *chan, _para[1] & 0x7f); + chan = &_assignedChannels[*chan].next; + }; +} + +void TownsEuphonyDriver::sendPanPosition() { + int8 *chan = &_activeChannels[_command & 0x0f]; + while (*chan != -1) { + _intf->callback(3, *chan, _para[1] & 0x7f); + chan = &_assignedChannels[*chan].next; + }; +} + +void TownsEuphonyDriver::sendAllNotesOff() { + if (_para[1] > 63) { + _sustainChannels[_command & 0x0f] = -1; + return; + } + + _sustainChannels[_command & 0x0f] = 0; + int8 *chan = &_activeChannels[_command & 0x0f]; + while (*chan != -1) { + if (_assignedChannels[*chan].note & 0x80) { + _assignedChannels[*chan].note = 0; + _intf->callback(2, *chan); + } + chan = &_assignedChannels[*chan].next; + }; +} + +void TownsEuphonyDriver::sendSetInstrument() { + int8 *chan = &_activeChannels[_command & 0x0f]; + while (*chan != -1) { + _intf->callback(4, *chan, _para[0]); + _intf->callback(7, *chan, 0); + chan = &_assignedChannels[*chan].next; + }; +} + +void TownsEuphonyDriver::sendPitch() { + int8 *chan = &_activeChannels[_command & 0x0f]; + while (*chan != -1) { + _para[0] += _para[0]; + int16 pitch = (((READ_LE_UINT16(_para)) >> 1) & 0x3fff) - 0x2000; + _intf->callback(7, *chan, pitch); + chan = &_assignedChannels[*chan].next; + }; +} diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.h b/sound/softsynth/fmtowns_pc98/towns_euphony.h new file mode 100644 index 0000000000..315e4ab4f0 --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.h @@ -0,0 +1,178 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef TOWNS_EUP_H +#define TOWNS_EUP_H + +#include "sound/softsynth/fmtowns_pc98/towns_audio.h" + +class TownsEuphonyDriver : public TownsAudioInterfacePluginDriver { +public: + TownsEuphonyDriver(Audio::Mixer *mixer); + virtual ~TownsEuphonyDriver(); + + bool init(); + void reset(); + + void loadInstrument(int chanType, int id, const uint8 *data); + void loadWaveTable(const uint8 *data); + void unloadWaveTable(int id); + void reserveSfxChannels(int num); + + int setMusicTempo(int tempo); + int startMusicTrack(const uint8 *data, int trackSize, int startTick); + void setMusicLoop(bool loop); + void stopParser(); + + void playSoundEffect(int chan, int note, int velo, const uint8 *data); + void stopSoundEffect(int chan); + bool soundEffectIsPlaying(int chan); + + void chanStereo(int chan, int mode); + void chanPitch(int chan, int pitch); + void chanVolume(int chan, int vol); + + void cdaSetVolume(int a, int vol1, int vol2); + + int chanEnable(int tableEntry, int val); + int chanMode(int tableEntry, int val); + int chanOrdr(int tableEntry, int val); + int chanLevel(int tableEntry, int val); + int chanTranspose(int tableEntry, int val); + + int assignChannel(int chan, int tableEntry); + + void timerCallback(int timerId); + + TownsAudioInterface *intf() { return _intf; } + +private: + void resetTables(); + + void resetTempo(); + void setTempoIntern(int tempo); + void setTimerA(bool enable, int tempo); + void setTimerB(bool enable, int tempo); + + void updatePulseCount(); + void updateTimeStampBase(); + void updateParser(); + void updateCheckEot(); + + bool parseNext(); + void jumpNextLoop(); + + void updateEventBuffer(); + void flushEventBuffer(); + void processBufferNote(int mode, int evt, int note, int velo); + + void resetControl(); + void resetControlIntern(int mode, int chan); + uint8 appendEvent(uint8 evt, uint8 chan); + + void sendEvent(uint8 mode, uint8 command); + + typedef bool(TownsEuphonyDriver::*EuphonyOpcode)(); + bool evtSetupNote(); + bool evtPolyphonicAftertouch(); + bool evtControlPitch(); + bool evtInstrumentChanAftertouch(); + bool evtLoadInstrument(); + bool evtAdvanceTimestampOffset(); + bool evtTempo(); + bool evtModeOrdrChange(); + bool evtNotImpl() { return false; } + + uint8 prepTranspose(uint8 in); + uint8 prepVelo(uint8 in); + + void sendNoteOff(); + void sendNoteOn(); + void sendChanVolume(); + void sendPanPosition(); + void sendAllNotesOff(); + void sendSetInstrument(); + void sendPitch(); + + int8 *_activeChannels; + int8 *_sustainChannels; + + struct ActiveChannel { + int8 chan; + int8 next; + uint8 note; + uint8 sub; + } *_assignedChannels; + + uint8 *_tEnable; + uint8 *_tMode; + uint8 *_tOrdr; + int8 *_tLevel; + int8 *_tTranspose; + + struct DlEvent { + uint8 evt; + uint8 mode; + uint8 note; + uint8 velo; + uint16 len; + } *_eventBuffer; + int _bufferedEventsCount; + + uint8 _para[2]; + uint8 _paraCount; + uint8 _command; + + uint8 _defaultBaseTickLen; + uint8 _baseTickLen; + uint32 _pulseCount; + int _tempoControlMode; + int _extraTimingControlRemainder; + int _extraTimingControl; + int _timerSetting; + int8 _tempoDiff; + int _tempoModifier; + uint32 _timeStampDest; + uint32 _timeStampBase; + int8 _elapsedEvents; + uint8 _deltaTicks; + uint32 _tickCounter; + uint8 _defaultTempo; + int _trackTempo; + + bool _loop; + bool _playing; + bool _endOfTrack; + bool _suspendParsing; + + const uint8 *_musicStart; + const uint8 *_musicPos; + uint32 _musicTrackSize; + + TownsAudioInterface *_intf; +}; + +#endif + diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp new file mode 100644 index 0000000000..1279429e7c --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -0,0 +1,1403 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sound/softsynth/fmtowns_pc98/towns_pc98_driver.h" +#include "common/endian.h" + +class TownsPC98_MusicChannel { +public: + TownsPC98_MusicChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, + uint8 key, uint8 prt, uint8 id); + virtual ~TownsPC98_MusicChannel(); + virtual void init(); + + typedef enum channelState { + CHS_RECALCFREQ = 0x01, + CHS_KEYOFF = 0x02, + CHS_SSGOFF = 0x04, + CHS_VBROFF = 0x08, + CHS_ALLOFF = 0x0f, + CHS_PROTECT = 0x40, + CHS_EOT = 0x80 + } ChannelState; + + virtual void loadData(uint8 *data); + virtual void processEvents(); + virtual void processFrequency(); + virtual bool processControlEvent(uint8 cmd); + + virtual void keyOn(); + void keyOff(); + + void setOutputLevel(); + virtual void fadeStep(); + virtual void reset(); + + const uint8 _idFlag; + +protected: + void setupVibrato(); + bool processVibrato(); + + bool control_dummy(uint8 para); + bool control_f0_setPatch(uint8 para); + bool control_f1_presetOutputLevel(uint8 para); + bool control_f2_setKeyOffTime(uint8 para); + bool control_f3_setFreqLSB(uint8 para); + bool control_f4_setOutputLevel(uint8 para); + bool control_f5_setTempo(uint8 para); + bool control_f6_repeatSection(uint8 para); + bool control_f7_setupVibrato(uint8 para); + bool control_f8_toggleVibrato(uint8 para); + bool control_fa_writeReg(uint8 para); + virtual bool control_fb_incOutLevel(uint8 para); + virtual bool control_fc_decOutLevel(uint8 para); + bool control_fd_jump(uint8 para); + virtual bool control_ff_endOfTrack(uint8 para); + + uint8 _ticksLeft; + uint8 _algorithm; + uint8 _instr; + uint8 _totalLevel; + uint8 _frqBlockMSB; + int8 _frqLSB; + uint8 _keyOffTime; + bool _hold; + uint8 *_dataPtr; + uint8 _vbrInitDelayHi; + uint8 _vbrInitDelayLo; + int16 _vbrModInitVal; + uint8 _vbrDuration; + uint8 _vbrCurDelay; + int16 _vbrModCurVal; + uint8 _vbrDurLeft; + uint16 _frequency; + uint8 _block; + uint8 _regOffset; + uint8 _flags; + uint8 _ssgTl; + uint8 _ssgStep; + uint8 _ssgTicksLeft; + uint8 _ssgTargetLvl; + uint8 _ssgStartLvl; + + const uint8 _chanNum; + const uint8 _keyNum; + const uint8 _part; + + TownsPC98_AudioDriver *_drv; + + typedef bool (TownsPC98_MusicChannel::*ControlEventFunc)(uint8 para); + const ControlEventFunc *controlEvents; +}; + +class TownsPC98_MusicChannelSSG : public TownsPC98_MusicChannel { +public: + TownsPC98_MusicChannelSSG(TownsPC98_AudioDriver *driver, uint8 regOffs, + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); + virtual ~TownsPC98_MusicChannelSSG() {} + void init(); + + virtual void loadData(uint8 *data); + void processEvents(); + void processFrequency(); + bool processControlEvent(uint8 cmd); + + void keyOn(); + void nextShape(); + + void protect(); + void restore(); + virtual void reset(); + + void fadeStep(); + +protected: + void setOutputLevel(uint8 lvl); + + bool control_f0_setPatch(uint8 para); + bool control_f1_setTotalLevel(uint8 para); + bool control_f4_setAlgorithm(uint8 para); + bool control_f9_loadCustomPatch(uint8 para); + bool control_fb_incOutLevel(uint8 para); + bool control_fc_decOutLevel(uint8 para); + bool control_ff_endOfTrack(uint8 para); + + typedef bool (TownsPC98_MusicChannelSSG::*ControlEventFunc)(uint8 para); + const ControlEventFunc *controlEvents; +}; + +class TownsPC98_SfxChannel : public TownsPC98_MusicChannelSSG { +public: + TownsPC98_SfxChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + TownsPC98_MusicChannelSSG(driver, regOffs, flgs, num, key, prt, id) {} + ~TownsPC98_SfxChannel() {} + + void loadData(uint8 *data); + void reset(); +}; + +class TownsPC98_MusicChannelPCM : public TownsPC98_MusicChannel { +public: + TownsPC98_MusicChannelPCM(TownsPC98_AudioDriver *driver, uint8 regOffs, + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); + ~TownsPC98_MusicChannelPCM() {} + void init(); + + void loadData(uint8 *data); + void processEvents(); + bool processControlEvent(uint8 cmd); + +private: + bool control_f1_prcStart(uint8 para); + bool control_ff_endOfTrack(uint8 para); + + typedef bool (TownsPC98_MusicChannelPCM::*ControlEventFunc)(uint8 para); + const ControlEventFunc *controlEvents; +}; + +TownsPC98_MusicChannel::TownsPC98_MusicChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, + uint8 key, uint8 prt, uint8 id) : _drv(driver), _regOffset(regOffs), _flags(flgs), _chanNum(num), _keyNum(key), + _part(prt), _idFlag(id), controlEvents(0) { + + _ticksLeft = _algorithm = _instr = _totalLevel = _frqBlockMSB = _keyOffTime = 0; + _ssgStartLvl = _ssgTl = _ssgStep = _ssgTicksLeft = _ssgTargetLvl = _block = 0; + _vbrInitDelayHi = _vbrInitDelayLo = _vbrDuration = _vbrCurDelay = _vbrDurLeft = 0; + _frqLSB = 0; + _hold = false; + _dataPtr = 0; + _vbrModInitVal = _vbrModCurVal = 0; + _frequency = 0; +} + +TownsPC98_MusicChannel::~TownsPC98_MusicChannel() { +} + +void TownsPC98_MusicChannel::init() { + #define Control(x) &TownsPC98_MusicChannel::control_##x + static const ControlEventFunc ctrlEvents[] = { + Control(f0_setPatch), + Control(f1_presetOutputLevel), + Control(f2_setKeyOffTime), + Control(f3_setFreqLSB), + Control(f4_setOutputLevel), + Control(f5_setTempo), + Control(f6_repeatSection), + Control(f7_setupVibrato), + Control(f8_toggleVibrato), + Control(dummy), + Control(fa_writeReg), + Control(fb_incOutLevel), + Control(fc_decOutLevel), + Control(fd_jump), + Control(dummy), + Control(ff_endOfTrack) + }; + #undef Control + + controlEvents = ctrlEvents; +} + +void TownsPC98_MusicChannel::keyOff() { + // all operators off + uint8 value = _keyNum & 0x0f; + if (_part) + value |= 4; + uint8 regAddress = 0x28; + _drv->writeReg(0, regAddress, value); + _flags |= CHS_KEYOFF; +} + +void TownsPC98_MusicChannel::keyOn() { + // all operators on + uint8 value = _keyNum | 0xf0; + if (_part) + value |= 4; + uint8 regAddress = 0x28; + _drv->writeReg(0, regAddress, value); +} + +void TownsPC98_MusicChannel::loadData(uint8 *data) { + _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; + _ticksLeft = 1; + _dataPtr = data; + _totalLevel = 0x7F; + + uint8 *tmp = _dataPtr; + for (bool loop = true; loop; ) { + uint8 cmd = *tmp++; + if (cmd < 0xf0) { + tmp++; + } else if (cmd == 0xff) { + if (READ_LE_UINT16(tmp)) { + _drv->_looping |= _idFlag; + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } else + loop = false; + } else if (cmd == 0xf6) { + // reset repeat section countdown + tmp[0] = tmp[1]; + tmp += 4; + } else { + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } + } +} + +void TownsPC98_MusicChannel::processEvents() { + if (_flags & CHS_EOT) + return; + + if (!_hold && _ticksLeft == _keyOffTime) + keyOff(); + + if (--_ticksLeft) + return; + + if (!_hold) + keyOff(); + + uint8 cmd = 0; + bool loop = true; + + while (loop) { + cmd = *_dataPtr++; + if (cmd < 0xf0) + loop = false; + else if (!processControlEvent(cmd)) + return; + } + + uint8 para = *_dataPtr++; + + if (cmd == 0x80) { + keyOff(); + _hold = false; + } else { + keyOn(); + + if (_hold == false || cmd != _frqBlockMSB) + _flags |= CHS_RECALCFREQ; + + _hold = (para & 0x80) ? true : false; + _frqBlockMSB = cmd; + } + + _ticksLeft = para & 0x7f; +} + +void TownsPC98_MusicChannel::processFrequency() { + if (_flags & CHS_RECALCFREQ) { + + _frequency = (((const uint16 *)_drv->_opnFreqTable)[_frqBlockMSB & 0x0f] + _frqLSB) | (((_frqBlockMSB & 0x70) >> 1) << 8); + + _drv->writeReg(_part, _regOffset + 0xa4, (_frequency >> 8)); + _drv->writeReg(_part, _regOffset + 0xa0, (_frequency & 0xff)); + + setupVibrato(); + } + + if (!(_flags & CHS_VBROFF)) { + if (!processVibrato()) + return; + + _drv->writeReg(_part, _regOffset + 0xa4, (_frequency >> 8)); + _drv->writeReg(_part, _regOffset + 0xa0, (_frequency & 0xff)); + } +} + +void TownsPC98_MusicChannel::setupVibrato() { + _vbrCurDelay = _vbrInitDelayHi; + if (_flags & CHS_KEYOFF) { + _vbrModCurVal = _vbrModInitVal; + _vbrCurDelay += _vbrInitDelayLo; + } + _vbrDurLeft = (_vbrDuration >> 1); + _flags &= ~(CHS_KEYOFF | CHS_RECALCFREQ); +} + +bool TownsPC98_MusicChannel::processVibrato() { + if (--_vbrCurDelay) + return false; + + _vbrCurDelay = _vbrInitDelayHi; + _frequency += _vbrModCurVal; + + if (!--_vbrDurLeft) { + _vbrDurLeft = _vbrDuration; + _vbrModCurVal = -_vbrModCurVal; + } + + return true; +} + +bool TownsPC98_MusicChannel::processControlEvent(uint8 cmd) { + uint8 para = *_dataPtr++; + return (this->*controlEvents[cmd & 0x0f])(para); +} + +void TownsPC98_MusicChannel::setOutputLevel() { + uint8 outopr = _drv->_opnCarrier[_algorithm]; + uint8 reg = 0x40 + _regOffset; + + for (int i = 0; i < 4; i++) { + if (outopr & 1) + _drv->writeReg(_part, reg, _totalLevel); + outopr >>= 1; + reg += 4; + } +} + +void TownsPC98_MusicChannel::fadeStep() { + _totalLevel += 3; + if (_totalLevel > 0x7f) + _totalLevel = 0x7f; + setOutputLevel(); +} + +void TownsPC98_MusicChannel::reset() { + _hold = false; + _keyOffTime = 0; + _ticksLeft = 1; + + _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; + + _totalLevel = 0; + _algorithm = 0; + _flags = CHS_EOT; + _algorithm = 0; + + _block = 0; + _frequency = 0; + _frqBlockMSB = 0; + _frqLSB = 0; + + _ssgTl = 0; + _ssgStartLvl = 0; + _ssgTargetLvl = 0; + _ssgStep = 0; + _ssgTicksLeft = 0; + + _vbrInitDelayHi = 0; + _vbrInitDelayLo = 0; + _vbrModInitVal = 0; + _vbrDuration = 0; + _vbrCurDelay = 0; + _vbrModCurVal = 0; + _vbrDurLeft = 0; +} + +bool TownsPC98_MusicChannel::control_f0_setPatch(uint8 para) { + _instr = para; + uint8 reg = _regOffset + 0x80; + + for (int i = 0; i < 4; i++) { + // set release rate for each operator + _drv->writeReg(_part, reg, 0x0f); + reg += 4; + } + + const uint8 *tptr = _drv->_patches + ((uint32)_instr << 5); + reg = _regOffset + 0x30; + + // write registers 0x30 to 0x8f + for (int i = 0; i < 6; i++) { + _drv->writeReg(_part, reg, tptr[0]); + reg += 4; + _drv->writeReg(_part, reg, tptr[2]); + reg += 4; + _drv->writeReg(_part, reg, tptr[1]); + reg += 4; + _drv->writeReg(_part, reg, tptr[3]); + reg += 4; + tptr += 4; + } + + reg = _regOffset + 0xB0; + _algorithm = tptr[0] & 7; + // set feedback and algorithm + _drv->writeReg(_part, reg, tptr[0]); + + setOutputLevel(); + return true; +} + +bool TownsPC98_MusicChannel::control_f1_presetOutputLevel(uint8 para) { + if (_drv->_fading) + return true; + + _totalLevel = _drv->_opnLvlPresets[para]; + setOutputLevel(); + return true; +} + +bool TownsPC98_MusicChannel::control_f2_setKeyOffTime(uint8 para) { + _keyOffTime = para; + return true; +} + +bool TownsPC98_MusicChannel::control_f3_setFreqLSB(uint8 para) { + _frqLSB = (int8) para; + return true; +} + +bool TownsPC98_MusicChannel::control_f4_setOutputLevel(uint8 para) { + if (_drv->_fading) + return true; + + _totalLevel = para; + setOutputLevel(); + return true; +} + +bool TownsPC98_MusicChannel::control_f5_setTempo(uint8 para) { + _drv->setMusicTempo(para); + return true; +} + +bool TownsPC98_MusicChannel::control_f6_repeatSection(uint8 para) { + _dataPtr--; + _dataPtr[0]--; + + if (*_dataPtr) { + // repeat section until counter has reached zero + _dataPtr = _drv->_trackPtr + READ_LE_UINT16(_dataPtr + 2); + } else { + // reset counter, advance to next section + _dataPtr[0] = _dataPtr[1]; + _dataPtr += 4; + } + return true; +} + +bool TownsPC98_MusicChannel::control_f7_setupVibrato(uint8 para) { + _vbrInitDelayHi = _dataPtr[0]; + _vbrInitDelayLo = para; + _vbrModInitVal = (int16) READ_LE_UINT16(_dataPtr + 1); + _vbrDuration = _dataPtr[3]; + _dataPtr += 4; + _flags = (_flags & ~CHS_VBROFF) | CHS_KEYOFF | CHS_RECALCFREQ; + return true; +} + +bool TownsPC98_MusicChannel::control_f8_toggleVibrato(uint8 para) { + if (para == 0x10) { + if (*_dataPtr++) { + _flags = (_flags & ~CHS_VBROFF) | CHS_KEYOFF; + } else { + _flags |= CHS_VBROFF; + } + } else { + /* NOT IMPLEMENTED + uint8 skipChannels = para / 36; + uint8 entry = para % 36; + TownsPC98_AudioDriver::TownsPC98_MusicChannel *t = &chan[skipChannels]; + + t->unnamedEntries[entry] = *_dataPtr++;*/ + } + return true; +} + +bool TownsPC98_MusicChannel::control_fa_writeReg(uint8 para) { + _drv->writeReg(_part, para, *_dataPtr++); + return true; +} + +bool TownsPC98_MusicChannel::control_fb_incOutLevel(uint8 para) { + _dataPtr--; + if (_drv->_fading) + return true; + + uint8 val = (_totalLevel + 3); + if (val > 0x7f) + val = 0x7f; + + _totalLevel = val; + setOutputLevel(); + return true; +} + +bool TownsPC98_MusicChannel::control_fc_decOutLevel(uint8 para) { + _dataPtr--; + if (_drv->_fading) + return true; + + int8 val = (int8) (_totalLevel - 3); + if (val < 0) + val = 0; + + _totalLevel = (uint8) val; + setOutputLevel(); + return true; +} + +bool TownsPC98_MusicChannel::control_fd_jump(uint8 para) { + uint8 *tmp = _drv->_trackPtr + READ_LE_UINT16(_dataPtr - 1); + _dataPtr = (tmp[1] == 1) ? tmp : (_dataPtr + 1); + return true; +} + +bool TownsPC98_MusicChannel::control_dummy(uint8 para) { + _dataPtr--; + return true; +} + +bool TownsPC98_MusicChannel::control_ff_endOfTrack(uint8 para) { + uint16 val = READ_LE_UINT16(--_dataPtr); + if (val) { + // loop + _dataPtr = _drv->_trackPtr + val; + return true; + } else { + // quit parsing for active channel + --_dataPtr; + _flags |= CHS_EOT; + _drv->_finishedChannelsFlag |= _idFlag; + keyOff(); + return false; + } +} + +TownsPC98_MusicChannelSSG::TownsPC98_MusicChannelSSG(TownsPC98_AudioDriver *driver, uint8 regOffs, + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { +} + +void TownsPC98_MusicChannelSSG::init() { + _algorithm = 0x80; + + #define Control(x) &TownsPC98_MusicChannelSSG::control_##x + static const ControlEventFunc ctrlEventsSSG[] = { + Control(f0_setPatch), + Control(f1_setTotalLevel), + Control(f2_setKeyOffTime), + Control(f3_setFreqLSB), + Control(f4_setAlgorithm), + Control(f5_setTempo), + Control(f6_repeatSection), + Control(f7_setupVibrato), + Control(f8_toggleVibrato), + Control(f9_loadCustomPatch), + Control(fa_writeReg), + Control(fb_incOutLevel), + Control(fc_decOutLevel), + Control(fd_jump), + Control(dummy), + Control(ff_endOfTrack) + }; + #undef Control + + controlEvents = ctrlEventsSSG; +} + +void TownsPC98_MusicChannelSSG::processEvents() { + if (_flags & CHS_EOT) + return; + + _drv->toggleRegProtection(_flags & CHS_PROTECT ? true : false); + + if (!_hold && _ticksLeft == _keyOffTime) + nextShape(); + + if (!--_ticksLeft) { + + uint8 cmd = 0; + bool loop = true; + + while (loop) { + cmd = *_dataPtr++; + if (cmd < 0xf0) + loop = false; + else if (!processControlEvent(cmd)) + return; + } + + uint8 para = *_dataPtr++; + + if (cmd == 0x80) { + nextShape(); + _hold = false; + } else { + if (!_hold) { + _instr &= 0xf0; + _ssgStep = _drv->_ssgPatches[_instr]; + _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; + _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; + _ssgStartLvl = _drv->_ssgPatches[_instr + 3]; + _flags = (_flags & ~CHS_SSGOFF) | CHS_KEYOFF; + } + + keyOn(); + + if (_hold == false || cmd != _frqBlockMSB) + _flags |= CHS_RECALCFREQ; + + _hold = (para & 0x80) ? true : false; + _frqBlockMSB = cmd; + } + + _ticksLeft = para & 0x7f; + } + + if (!(_flags & CHS_SSGOFF)) { + if (--_ssgTicksLeft) { + if (!_drv->_fading) + setOutputLevel(_ssgStartLvl); + return; + } + + _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; + + if (_drv->_ssgPatches[_instr + 1] & 0x80) { + uint8 t = _ssgStartLvl - _ssgStep; + + if (_ssgStep <= _ssgStartLvl && _ssgTargetLvl < t) { + if (!_drv->_fading) + setOutputLevel(t); + return; + } + } else { + int t = _ssgStartLvl + _ssgStep; + uint8 p = (uint8) (t & 0xff); + + if (t < 256 && _ssgTargetLvl > p) { + if (!_drv->_fading) + setOutputLevel(p); + return; + } + } + + setOutputLevel(_ssgTargetLvl); + if (_ssgStartLvl && !(_instr & 8)){ + _instr += 4; + _ssgStep = _drv->_ssgPatches[_instr]; + _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; + _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; + } else { + _flags |= CHS_SSGOFF; + setOutputLevel(0); + } + } +} + +void TownsPC98_MusicChannelSSG::processFrequency() { + if (_algorithm & 0x40) + return; + + if (_flags & CHS_RECALCFREQ) { + _block = _frqBlockMSB >> 4; + _frequency = ((const uint16 *)_drv->_opnFreqTableSSG)[_frqBlockMSB & 0x0f] + _frqLSB; + + uint16 f = _frequency >> _block; + _drv->writeReg(_part, _regOffset << 1, f & 0xff); + _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); + + setupVibrato(); + } + + if (!(_flags & (CHS_EOT | CHS_VBROFF | CHS_SSGOFF))) { + if (!processVibrato()) + return; + + uint16 f = _frequency >> _block; + _drv->writeReg(_part, _regOffset << 1, f & 0xff); + _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); + } +} + +bool TownsPC98_MusicChannelSSG::processControlEvent(uint8 cmd) { + uint8 para = *_dataPtr++; + return (this->*controlEvents[cmd & 0x0f])(para); +} + +void TownsPC98_MusicChannelSSG::nextShape() { + _instr = (_instr & 0xf0) + 0x0c; + _ssgStep = _drv->_ssgPatches[_instr]; + _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; + _ssgTargetLvl = _drv->_ssgPatches[_instr + 2]; +} + +void TownsPC98_MusicChannelSSG::keyOn() { + uint8 c = 0x7b; + uint8 t = (_algorithm & 0xC0) << 1; + if (_algorithm & 0x80) + t |= 4; + + c = (c << (_regOffset + 1)) | (c >> (7 - _regOffset)); + t = (t << (_regOffset + 1)) | (t >> (7 - _regOffset)); + + if (!(_algorithm & 0x80)) + _drv->writeReg(_part, 6, _algorithm & 0x7f); + + uint8 e = (_drv->readSSGStatus() & c) | t; + _drv->writeReg(_part, 7, e); +} + +void TownsPC98_MusicChannelSSG::protect() { + _flags |= CHS_PROTECT; +} + +void TownsPC98_MusicChannelSSG::restore() { + _flags &= ~CHS_PROTECT; + keyOn(); + _drv->writeReg(_part, 8 + _regOffset, _ssgTl); + uint16 f = _frequency >> _block; + _drv->writeReg(_part, _regOffset << 1, f & 0xff); + _drv->writeReg(_part, (_regOffset << 1) + 1, f >> 8); +} + +void TownsPC98_MusicChannelSSG::loadData(uint8 *data) { + _drv->toggleRegProtection(_flags & CHS_PROTECT ? true : false); + TownsPC98_MusicChannel::loadData(data); + setOutputLevel(0); + _algorithm = 0x80; +} + +void TownsPC98_MusicChannelSSG::setOutputLevel(uint8 lvl) { + _ssgStartLvl = lvl; + uint16 newTl = (((uint16)_totalLevel + 1) * (uint16)lvl) >> 8; + if (newTl == _ssgTl) + return; + _ssgTl = newTl; + _drv->writeReg(_part, 8 + _regOffset, _ssgTl); +} + +void TownsPC98_MusicChannelSSG::reset() { + TownsPC98_MusicChannel::reset(); + + // Unlike the original we restore the default patch data. This fixes a bug + // where certain sound effects would bring each other out of tune (e.g. the + // dragon's fire in Darm's house in Kyra 1 would sound different each time + // you triggered another sfx by dropping an item etc.) + uint8 i = (10 + _regOffset) << 4; + const uint8 *src = &_drv->_drvTables[156]; + _drv->_ssgPatches[i] = src[i]; + _drv->_ssgPatches[i + 3] = src[i + 3]; + _drv->_ssgPatches[i + 4] = src[i + 4]; + _drv->_ssgPatches[i + 6] = src[i + 6]; + _drv->_ssgPatches[i + 8] = src[i + 8]; + _drv->_ssgPatches[i + 12] = src[i + 12]; +} + +void TownsPC98_MusicChannelSSG::fadeStep() { + _totalLevel--; + if ((int8)_totalLevel < 0) + _totalLevel = 0; + setOutputLevel(_ssgStartLvl); +} + +bool TownsPC98_MusicChannelSSG::control_f0_setPatch(uint8 para) { + _instr = para << 4; + para = (para >> 3) & 0x1e; + if (para) + return control_f4_setAlgorithm(para | 0x40); + return true; +} + +bool TownsPC98_MusicChannelSSG::control_f1_setTotalLevel(uint8 para) { + if (!_drv->_fading) + _totalLevel = para; + return true; +} + +bool TownsPC98_MusicChannelSSG::control_f4_setAlgorithm(uint8 para) { + _algorithm = para; + return true; +} + +bool TownsPC98_MusicChannelSSG::control_f9_loadCustomPatch(uint8 para) { + _instr = (_drv->_sfxOffs + 10 + _regOffset) << 4; + _drv->_ssgPatches[_instr] = *_dataPtr++; + _drv->_ssgPatches[_instr + 3] = para; + _drv->_ssgPatches[_instr + 4] = *_dataPtr++; + _drv->_ssgPatches[_instr + 6] = *_dataPtr++; + _drv->_ssgPatches[_instr + 8] = *_dataPtr++; + _drv->_ssgPatches[_instr + 12] = *_dataPtr++; + return true; +} + +bool TownsPC98_MusicChannelSSG::control_fb_incOutLevel(uint8 para) { + _dataPtr--; + if (_drv->_fading) + return true; + + _totalLevel--; + if ((int8)_totalLevel < 0) + _totalLevel = 0; + + return true; +} + +bool TownsPC98_MusicChannelSSG::control_fc_decOutLevel(uint8 para) { + _dataPtr--; + if (_drv->_fading) + return true; + + if (_totalLevel + 1 < 0x10) + _totalLevel++; + + return true; +} + +bool TownsPC98_MusicChannelSSG::control_ff_endOfTrack(uint8 para) { + if (!_drv->_sfxOffs) { + uint16 val = READ_LE_UINT16(--_dataPtr); + if (val) { + // loop + _dataPtr = _drv->_trackPtr + val; + return true; + } else { + // stop parsing + if (!_drv->_fading) + setOutputLevel(0); + --_dataPtr; + _flags |= CHS_EOT; + _drv->_finishedSSGFlag |= _idFlag; + } + } else { + // end of sfx track - restore ssg music channel + _flags |= CHS_EOT; + _drv->_finishedSfxFlag |= _idFlag; + _drv->_ssgChannels[_chanNum]->restore(); + } + + return false; +} + +void TownsPC98_SfxChannel::loadData(uint8 *data) { + _flags = CHS_ALLOFF; + _ticksLeft = 1; + _dataPtr = data; + _ssgTl = 0xff; + _algorithm = 0x80; + + uint8 *tmp = _dataPtr; + for (bool loop = true; loop; ) { + uint8 cmd = *tmp++; + if (cmd < 0xf0) { + tmp++; + } else if (cmd == 0xff) { + loop = false; + } else if (cmd == 0xf6) { + // reset repeat section countdown + tmp[0] = tmp[1]; + tmp += 4; + } else { + tmp += _drv->_opnFxCmdLen[cmd - 240]; + } + } +} + +void TownsPC98_SfxChannel::reset() { + TownsPC98_MusicChannel::reset(); + + // Unlike the original we restore the default patch data. This fixes a bug + // where certain sound effects would bring each other out of tune (e.g. the + // dragon's fire in Darm's house in Kyra 1 would sound different each time + // you triggered another sfx by dropping an item etc.) + uint8 i = (13 + _regOffset) << 4; + const uint8 *src = &_drv->_drvTables[156]; + _drv->_ssgPatches[i] = src[i]; + _drv->_ssgPatches[i + 3] = src[i + 3]; + _drv->_ssgPatches[i + 4] = src[i + 4]; + _drv->_ssgPatches[i + 6] = src[i + 6]; + _drv->_ssgPatches[i + 8] = src[i + 8]; + _drv->_ssgPatches[i + 12] = src[i + 12]; +} + +TownsPC98_MusicChannelPCM::TownsPC98_MusicChannelPCM(TownsPC98_AudioDriver *driver, uint8 regOffs, + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { +} + +void TownsPC98_MusicChannelPCM::init() { + _algorithm = 0x80; + + #define Control(x) &TownsPC98_MusicChannelPCM::control_##x + static const ControlEventFunc ctrlEventsPCM[] = { + Control(dummy), + Control(f1_prcStart), + Control(dummy), + Control(dummy), + Control(dummy), + Control(dummy), + Control(f6_repeatSection), + Control(dummy), + Control(dummy), + Control(dummy), + Control(fa_writeReg), + Control(dummy), + Control(dummy), + Control(dummy), + Control(dummy), + Control(ff_endOfTrack) + }; + #undef Control + + controlEvents = ctrlEventsPCM; +} + +void TownsPC98_MusicChannelPCM::loadData(uint8 *data) { + _flags = (_flags & ~CHS_EOT) | CHS_ALLOFF; + _ticksLeft = 1; + _dataPtr = data; + _totalLevel = 0x7F; +} + +void TownsPC98_MusicChannelPCM::processEvents() { + if (_flags & CHS_EOT) + return; + + if (--_ticksLeft) + return; + + uint8 cmd = 0; + bool loop = true; + + while (loop) { + cmd = *_dataPtr++; + if (cmd == 0x80) { + loop = false; + } else if (cmd < 0xf0) { + _drv->writeReg(_part, 0x10, cmd); + } else if (!processControlEvent(cmd)) { + return; + } + } + + _ticksLeft = *_dataPtr++; +} + +bool TownsPC98_MusicChannelPCM::processControlEvent(uint8 cmd) { + uint8 para = *_dataPtr++; + return (this->*controlEvents[cmd & 0x0f])(para); +} + +bool TownsPC98_MusicChannelPCM::control_f1_prcStart(uint8 para) { + _totalLevel = para; + _drv->writeReg(_part, 0x11, para); + return true; +} + +bool TownsPC98_MusicChannelPCM::control_ff_endOfTrack(uint8 para) { + uint16 val = READ_LE_UINT16(--_dataPtr); + if (val) { + // loop + _dataPtr = _drv->_trackPtr + val; + return true; + } else { + // quit parsing for active channel + --_dataPtr; + _flags |= CHS_EOT; + _drv->_finishedRhythmFlag |= _idFlag; + return false; + } +} + +TownsPC98_AudioDriver::TownsPC98_AudioDriver(Audio::Mixer *mixer, EmuType type) : TownsPC98_FmSynth(mixer, type), + _channels(0), _ssgChannels(0), _sfxChannels(0), _rhythmChannel(0), + _trackPtr(0), _sfxData(0), _sfxOffs(0), _ssgPatches(0), + _patches(0), _sfxBuffer(0), _musicBuffer(0), + + _opnCarrier(_drvTables + 76), _opnFreqTable(_drvTables + 108), _opnFreqTableSSG(_drvTables + 132), + _opnFxCmdLen(_drvTables + 36), _opnLvlPresets(_drvTables + (type == kTypeTowns ? 52 : 84)), + + _updateChannelsFlag(type == kType26 ? 0x07 : 0x3F), _finishedChannelsFlag(0), + _updateSSGFlag(type == kTypeTowns ? 0x00 : 0x07), _finishedSSGFlag(0), + _updateRhythmFlag(type == kType86 ? 0x01 : 0x00), _finishedRhythmFlag(0), + _updateSfxFlag(0), _finishedSfxFlag(0), + + _musicTickCounter(0), + + _musicVolume(255), _sfxVolume(255), + + _musicPlaying(false), _sfxPlaying(false), _fading(false), _looping(0), _ready(false) { + + _sfxOffsets[0] = _sfxOffsets[1] = 0; +} + +TownsPC98_AudioDriver::~TownsPC98_AudioDriver() { + reset(); + + if (_channels) { + for (int i = 0; i < _numChan; i++) + delete _channels[i]; + delete[] _channels; + } + + if (_ssgChannels) { + for (int i = 0; i < _numSSG; i++) + delete _ssgChannels[i]; + delete[] _ssgChannels; + } + + if (_sfxChannels) { + for (int i = 0; i < 2; i++) + delete _sfxChannels[i]; + delete[] _sfxChannels; + } + + delete _rhythmChannel; + + delete[] _ssgPatches; +} + +bool TownsPC98_AudioDriver::init() { + if (_ready) { + reset(); + return true; + } + + TownsPC98_FmSynth::init(); + + setVolumeChannelMasks(-1, 0); + + _channels = new TownsPC98_MusicChannel *[_numChan]; + for (int i = 0; i < _numChan; i++) { + int ii = i * 6; + _channels[i] = new TownsPC98_MusicChannel(this, _drvTables[ii], _drvTables[ii + 1], + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _channels[i]->init(); + } + + if (_numSSG) { + _ssgPatches = new uint8[256]; + memcpy(_ssgPatches, _drvTables + 156, 256); + + _ssgChannels = new TownsPC98_MusicChannelSSG *[_numSSG]; + for (int i = 0; i < _numSSG; i++) { + int ii = i * 6; + _ssgChannels[i] = new TownsPC98_MusicChannelSSG(this, _drvTables[ii], _drvTables[ii + 1], + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _ssgChannels[i]->init(); + } + + _sfxChannels = new TownsPC98_SfxChannel *[2]; + for (int i = 0; i < 2; i++) { + int ii = (i + 1) * 6; + _sfxChannels[i] = new TownsPC98_SfxChannel(this, _drvTables[ii], _drvTables[ii + 1], + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _sfxChannels[i]->init(); + } + } + + if (_hasPercussion) { + _rhythmChannel = new TownsPC98_MusicChannelPCM(this, 0, 0, 0, 0, 0, 1); + _rhythmChannel->init(); + } + + setMusicTempo(84); + setSfxTempo(654); + + _ready = true; + + return true; +} + +void TownsPC98_AudioDriver::loadMusicData(uint8 *data, bool loadPaused) { + if (!_ready) { + warning("TownsPC98_AudioDriver: Driver must be initialized before loading data"); + return; + } + + if (!data) { + warning("TownsPC98_AudioDriver: Invalid music file data"); + return; + } + + reset(); + + Common::StackLock lock(_mutex); + uint8 *src_a = _trackPtr = _musicBuffer = data; + + for (uint8 i = 0; i < 3; i++) { + _channels[i]->loadData(data + READ_LE_UINT16(src_a)); + src_a += 2; + } + + for (int i = 0; i < _numSSG; i++) { + _ssgChannels[i]->loadData(data + READ_LE_UINT16(src_a)); + src_a += 2; + } + + for (uint8 i = 3; i < _numChan; i++) { + _channels[i]->loadData(data + READ_LE_UINT16(src_a)); + src_a += 2; + } + + if (_hasPercussion) { + _rhythmChannel->loadData(data + READ_LE_UINT16(src_a)); + src_a += 2; + } + + toggleRegProtection(false); + + _patches = src_a + 4; + _finishedChannelsFlag = _finishedSSGFlag = _finishedRhythmFlag = 0; + + _musicPlaying = (loadPaused ? false : true); +} + +void TownsPC98_AudioDriver::loadSoundEffectData(uint8 *data, uint8 trackNum) { + if (!_ready) { + warning("TownsPC98_AudioDriver: Driver must be initialized before loading data"); + return; + } + + if (!_sfxChannels) { + warning("TownsPC98_AudioDriver: Sound effects not supported by this configuration"); + return; + } + + if (!data) { + warning("TownsPC98_AudioDriver: Invalid sound effects file data"); + return; + } + + Common::StackLock lock(_mutex); + _sfxData = _sfxBuffer = data; + _sfxOffsets[0] = READ_LE_UINT16(&_sfxData[(trackNum << 2)]); + _sfxOffsets[1] = READ_LE_UINT16(&_sfxData[(trackNum << 2) + 2]); + _sfxPlaying = true; + _finishedSfxFlag = 0; +} + +void TownsPC98_AudioDriver::reset() { + Common::StackLock lock(_mutex); + + _musicPlaying = false; + _sfxPlaying = false; + _fading = false; + _looping = 0; + _musicTickCounter = 0; + _sfxData = 0; + + TownsPC98_FmSynth::reset(); + + for (int i = 0; i < _numChan; i++) + _channels[i]->reset(); + for (int i = 0; i < _numSSG; i++) + _ssgChannels[i]->reset(); + + if (_numSSG) { + for (int i = 0; i < 2; i++) + _sfxChannels[i]->reset(); + + memcpy(_ssgPatches, _drvTables + 156, 256); + } + + if (_rhythmChannel) + _rhythmChannel->reset(); +} + +void TownsPC98_AudioDriver::fadeStep() { + if (!_musicPlaying) + return; + + Common::StackLock lock(_mutex); + for (int j = 0; j < _numChan; j++) { + if (_updateChannelsFlag & _channels[j]->_idFlag) + _channels[j]->fadeStep(); + } + + for (int j = 0; j < _numSSG; j++) { + if (_updateSSGFlag & _ssgChannels[j]->_idFlag) + _ssgChannels[j]->fadeStep(); + } + + if (!_fading) { + _fading = 19; + if (_hasPercussion) { + if (_updateRhythmFlag & _rhythmChannel->_idFlag) + _rhythmChannel->reset(); + } + } else { + if (!--_fading) + reset(); + } +} + +void TownsPC98_AudioDriver::timerCallbackB() { + _sfxOffs = 0; + + if (_musicPlaying) { + _musicTickCounter++; + + for (int i = 0; i < _numChan; i++) { + if (_updateChannelsFlag & _channels[i]->_idFlag) { + _channels[i]->processEvents(); + _channels[i]->processFrequency(); + } + } + + for (int i = 0; i < _numSSG; i++) { + if (_updateSSGFlag & _ssgChannels[i]->_idFlag) { + _ssgChannels[i]->processEvents(); + _ssgChannels[i]->processFrequency(); + } + } + + if (_hasPercussion) + if (_updateRhythmFlag & _rhythmChannel->_idFlag) + _rhythmChannel->processEvents(); + } + + toggleRegProtection(false); + + if (_finishedChannelsFlag == _updateChannelsFlag && _finishedSSGFlag == _updateSSGFlag && _finishedRhythmFlag == _updateRhythmFlag) + _musicPlaying = false; +} + +void TownsPC98_AudioDriver::timerCallbackA() { + if (_sfxChannels && _sfxPlaying) { + if (_sfxData) + startSoundEffect(); + + _sfxOffs = 3; + _trackPtr = _sfxBuffer; + + for (int i = 0; i < 2; i++) { + if (_updateSfxFlag & _sfxChannels[i]->_idFlag) { + _sfxChannels[i]->processEvents(); + _sfxChannels[i]->processFrequency(); + } + } + + _trackPtr = _musicBuffer; + } + + if (_updateSfxFlag && _finishedSfxFlag == _updateSfxFlag) { + _sfxPlaying = false; + _updateSfxFlag = 0; + setVolumeChannelMasks(-1, 0); + } +} + +void TownsPC98_AudioDriver::setMusicTempo(uint8 tempo) { + writeReg(0, 0x26, tempo); + writeReg(0, 0x27, 0x33); +} + +void TownsPC98_AudioDriver::setSfxTempo(uint16 tempo) { + writeReg(0, 0x24, tempo & 0xff); + writeReg(0, 0x25, tempo >> 8); + writeReg(0, 0x27, 0x33); +} + +void TownsPC98_AudioDriver::startSoundEffect() { + int volFlags = 0; + + for (int i = 0; i < 2; i++) { + if (_sfxOffsets[i]) { + _ssgChannels[i + 1]->protect(); + _sfxChannels[i]->reset(); + _sfxChannels[i]->loadData(_sfxData + _sfxOffsets[i]); + _updateSfxFlag |= _sfxChannels[i]->_idFlag; + volFlags |= (_sfxChannels[i]->_idFlag << _numChan); + } else { + _ssgChannels[i + 1]->restore(); + _updateSfxFlag &= ~_sfxChannels[i]->_idFlag; + } + } + + setVolumeChannelMasks(~volFlags, volFlags); + _sfxData = 0; +} + +const uint8 TownsPC98_AudioDriver::_drvTables[] = { + // channel presets + 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x80, 0x01, 0x01, 0x00, 0x02, + 0x02, 0x80, 0x02, 0x02, 0x00, 0x04, + 0x00, 0x80, 0x03, 0x04, 0x01, 0x08, + 0x01, 0x80, 0x04, 0x05, 0x01, 0x10, + 0x02, 0x80, 0x05, 0x06, 0x01, 0x20, + + // control event size + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x05, + 0x02, 0x06, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, + + // fmt level presets + 0x54, 0x50, 0x4C, 0x48, 0x44, 0x40, 0x3C, 0x38, + 0x34, 0x30, 0x2C, 0x28, 0x24, 0x20, 0x1C, 0x18, + 0x14, 0x10, 0x0C, 0x08, 0x04, 0x90, 0x90, 0x90, + + // carriers + 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0E, 0x0E, 0x0F, + + // pc98 level presets + 0x40, 0x3B, 0x38, 0x34, 0x30, 0x2A, 0x28, 0x25, + 0x22, 0x20, 0x1D, 0x1A, 0x18, 0x15, 0x12, 0x10, + 0x0D, 0x0A, 0x08, 0x05, 0x02, 0x90, 0x90, 0x90, + + // frequencies + 0x6A, 0x02, 0x8F, 0x02, 0xB6, 0x02, 0xDF, 0x02, + 0x0B, 0x03, 0x39, 0x03, 0x6A, 0x03, 0x9E, 0x03, + 0xD5, 0x03, 0x10, 0x04, 0x4E, 0x04, 0x8F, 0x04, + + // ssg frequencies + 0xE8, 0x0E, 0x12, 0x0E, 0x48, 0x0D, 0x89, 0x0C, + 0xD5, 0x0B, 0x2B, 0x0B, 0x8A, 0x0A, 0xF3, 0x09, + 0x64, 0x09, 0xDD, 0x08, 0x5E, 0x08, 0xE6, 0x07, + + // ssg patch data + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, + 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x37, 0x81, 0xC8, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x37, 0x81, 0xC8, 0x00, + 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, + 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, + 0x04, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xBE, 0x00, + 0x0A, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0x01, 0x00, + 0xFF, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0x00, + 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x64, 0x01, 0xFF, 0x64, 0xFF, 0x81, 0xFF, 0x00, + 0x01, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + + 0x02, 0x01, 0xFF, 0x28, 0xFF, 0x81, 0xF0, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x0A, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xC8, 0x00, + 0x01, 0x81, 0x00, 0x00, 0x28, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0x78, 0x5F, 0x81, 0xA0, 0x00, + 0x05, 0x81, 0x00, 0x00, 0x28, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, + 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, + 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x81, 0x00, 0x00, + 0x00, 0x81, 0x00, 0x00, 0xFF, 0x81, 0x00, 0x00 +}; + +#undef EUPHONY_FADEOUT_TICKS + diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h new file mode 100644 index 0000000000..f7d09df09d --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h @@ -0,0 +1,110 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef TOWNS_PC98_AUDIODRIVER_H +#define TOWNS_PC98_AUDIODRIVER_H + +#include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" + +class TownsPC98_AudioDriver : public TownsPC98_FmSynth { +friend class TownsPC98_MusicChannel; +friend class TownsPC98_MusicChannelSSG; +friend class TownsPC98_SfxChannel; +friend class TownsPC98_MusicChannelPCM; +public: + TownsPC98_AudioDriver(Audio::Mixer *mixer, EmuType type); + ~TownsPC98_AudioDriver(); + + void loadMusicData(uint8 *data, bool loadPaused = false); + void loadSoundEffectData(uint8 *data, uint8 trackNum); + bool init(); + void reset(); + + void fadeStep(); + + void pause() { _musicPlaying = false; } + void cont() { _musicPlaying = true; } + + void timerCallbackB(); + void timerCallbackA(); + + bool looping() { return _looping == _updateChannelsFlag ? true : false; } + bool musicPlaying() { return _musicPlaying; } + + void setMusicVolume(int volume) { _musicVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } + void setSoundEffectVolume(int volume) { _sfxVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } + +protected: + void startSoundEffect(); + + void setMusicTempo(uint8 tempo); + void setSfxTempo(uint16 tempo); + + TownsPC98_MusicChannel **_channels; + TownsPC98_MusicChannelSSG **_ssgChannels; + TownsPC98_SfxChannel **_sfxChannels; + TownsPC98_MusicChannelPCM *_rhythmChannel; + + const uint8 *_opnCarrier; + const uint8 *_opnFreqTable; + const uint8 *_opnFreqTableSSG; + const uint8 *_opnFxCmdLen; + const uint8 *_opnLvlPresets; + + uint8 *_musicBuffer; + uint8 *_sfxBuffer; + uint8 *_trackPtr; + uint8 *_patches; + uint8 *_ssgPatches; + + uint8 _updateChannelsFlag; + uint8 _updateSSGFlag; + uint8 _updateRhythmFlag; + uint8 _updateSfxFlag; + uint8 _finishedChannelsFlag; + uint8 _finishedSSGFlag; + uint8 _finishedRhythmFlag; + uint8 _finishedSfxFlag; + + bool _musicPlaying; + bool _sfxPlaying; + uint8 _fading; + uint8 _looping; + uint32 _musicTickCounter; + + int _sfxOffs; + uint8 *_sfxData; + uint16 _sfxOffsets[2]; + + uint16 _musicVolume; + uint16 _sfxVolume; + + static const uint8 _drvTables[]; + + bool _ready; +}; + +#endif + diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp new file mode 100644 index 0000000000..5436c8e0c7 --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -0,0 +1,1461 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" +#include "common/endian.h" + +class TownsPC98_FmSynthOperator { +public: + TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); + ~TownsPC98_FmSynthOperator() {} + + void keyOn(); + void keyOff(); + void frequency(int freq); + void updatePhaseIncrement(); + void recalculateRates(); + void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); + + void feedbackLevel(int32 level) {_feedbackLevel = level ? level + 6 : 0; } + void detune(int value) { _detn = &_detnTbl[value << 5]; } + void multiple(uint32 value) { _multiple = value ? (value << 1) : 1; } + void attackRate(uint32 value) { _specifiedAttackRate = value; } + bool scaleRate(uint8 value); + void decayRate(uint32 value) { _specifiedDecayRate = value; recalculateRates(); } + void sustainRate(uint32 value) { _specifiedSustainRate = value; recalculateRates(); } + void sustainLevel(uint32 value) { _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; } + void releaseRate(uint32 value) { _specifiedReleaseRate = value; recalculateRates(); } + void totalLevel(uint32 value) { _totalLevel = value << 3; } + void ampModulation(bool enable) { _ampMod = enable; } + void reset(); + +protected: + EnvelopeState _state; + bool _playing; + uint32 _feedbackLevel; + uint32 _multiple; + uint32 _totalLevel; + uint8 _keyScale1; + uint8 _keyScale2; + uint32 _specifiedAttackRate; + uint32 _specifiedDecayRate; + uint32 _specifiedSustainRate; + uint32 _specifiedReleaseRate; + uint32 _tickCount; + uint32 _sustainLevel; + + bool _ampMod; + uint32 _frequency; + uint8 _kcode; + uint32 _phase; + uint32 _phaseIncrement; + const int32 *_detn; + + const uint8 *_rateTbl; + const uint8 *_rshiftTbl; + const uint8 *_adTbl; + const uint32 *_fTbl; + const uint32 *_sinTbl; + const int32 *_tLvlTbl; + const int32 *_detnTbl; + + const uint32 _tickLength; + uint32 _timer; + int32 _currentLevel; + + struct EvpState { + uint8 rate; + uint8 shift; + } fs_a, fs_d, fs_s, fs_r; +}; + +TownsPC98_FmSynthOperator::TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : + _rateTbl(rateTable), _rshiftTbl(shiftTable), _adTbl(attackDecayTable), _fTbl(frqTable), + _sinTbl(sineTable), _tLvlTbl(tlevelOut), _detnTbl(detuneTable), _tickLength(timerbase * 2), + _specifiedAttackRate(0), _specifiedDecayRate(0), _specifiedReleaseRate(0), _specifiedSustainRate(0), + _phase(0), _state(kEnvReady), _playing(false), _timer(0), _keyScale1(0), + _keyScale2(0), _currentLevel(1023), _ampMod(false), _tickCount(0) { + + fs_a.rate = fs_a.shift = fs_d.rate = fs_d.shift = fs_s.rate = fs_s.shift = fs_r.rate = fs_r.shift = 0; + + reset(); +} + +void TownsPC98_FmSynthOperator::keyOn() { + if (_playing) + return; + + _playing = true; + _state = kEnvAttacking; + _phase = 0; +} + +void TownsPC98_FmSynthOperator::keyOff() { + if (!_playing) + return; + + _playing = false; + if (_state != kEnvReady) + _state = kEnvReleasing; +} + +void TownsPC98_FmSynthOperator::frequency(int freq) { + uint8 block = (freq >> 11); + uint16 pos = (freq & 0x7ff); + uint8 c = pos >> 7; + + _kcode = (block << 2) | ((c < 7) ? 0 : ((c > 8) ? 3 : c - 6 )); + _frequency = _fTbl[pos << 1] >> (7 - block); +} + +void TownsPC98_FmSynthOperator::updatePhaseIncrement() { + _phaseIncrement = ((_frequency + _detn[_kcode]) * _multiple) >> 1; + uint8 keyscale = _kcode >> _keyScale1; + if (_keyScale2 != keyscale) { + _keyScale2 = keyscale; + recalculateRates(); + } +} + +void TownsPC98_FmSynthOperator::recalculateRates() { + int k = _keyScale2; + int r = _specifiedAttackRate ? (_specifiedAttackRate << 1) + 0x20 : 0; + fs_a.rate = ((r + k) < 94) ? _rateTbl[r + k] : 136; + fs_a.shift = ((r + k) < 94) ? _rshiftTbl[r + k] : 0; + + r = _specifiedDecayRate ? (_specifiedDecayRate << 1) + 0x20 : 0; + fs_d.rate = _rateTbl[r + k]; + fs_d.shift = _rshiftTbl[r + k]; + + r = _specifiedSustainRate ? (_specifiedSustainRate << 1) + 0x20 : 0; + fs_s.rate = _rateTbl[r + k]; + fs_s.shift = _rshiftTbl[r + k]; + + r = (_specifiedReleaseRate << 2) + 0x22; + fs_r.rate = _rateTbl[r + k]; + fs_r.shift = _rshiftTbl[r + k]; +} + +void TownsPC98_FmSynthOperator::generateOutput(int32 phasebuf, int32 *feed, int32 &out) { + if (_state == kEnvReady) + return; + + _timer += _tickLength; + while (_timer > 0x5B8D80) { + _timer -= 0x5B8D80; + ++_tickCount; + + int32 levelIncrement = 0; + uint32 targetTime = 0; + int32 targetLevel = 0; + EnvelopeState nextState = kEnvReady; + + switch (_state) { + case kEnvReady: + return; + case kEnvAttacking: + targetLevel = 0; + nextState = kEnvDecaying; + if ((_specifiedAttackRate << 1) + _keyScale2 < 64) { + targetTime = (1 << fs_a.shift) - 1; + levelIncrement = (~_currentLevel * _adTbl[fs_a.rate + ((_tickCount >> fs_a.shift) & 7)]) >> 4; + break; + } else { + _currentLevel = targetLevel; + _state = nextState; + } + // Fall through + case kEnvDecaying: + targetTime = (1 << fs_d.shift) - 1; + nextState = kEnvSustaining; + targetLevel = _sustainLevel; + levelIncrement = _adTbl[fs_d.rate + ((_tickCount >> fs_d.shift) & 7)]; + break; + case kEnvSustaining: + targetTime = (1 << fs_s.shift) - 1; + nextState = kEnvSustaining; + targetLevel = 1023; + levelIncrement = _adTbl[fs_s.rate + ((_tickCount >> fs_s.shift) & 7)]; + break; + case kEnvReleasing: + targetTime = (1 << fs_r.shift) - 1; + nextState = kEnvReady; + targetLevel = 1023; + levelIncrement = _adTbl[fs_r.rate + ((_tickCount >> fs_r.shift) & 7)]; + break; + } + + if (!(_tickCount & targetTime)) { + _currentLevel += levelIncrement; + if ((_state == kEnvAttacking && _currentLevel <= targetLevel) || (_state != kEnvAttacking && _currentLevel >= targetLevel)) { + if (_state != kEnvDecaying) + _currentLevel = targetLevel; + _state = nextState; + } + } + } + + uint32 lvlout = _totalLevel + (uint32) _currentLevel; + + + int32 outp = 0; + int32 *i = &outp, *o = &outp; + int phaseShift = 0; + + if (feed) { + o = &feed[0]; + i = &feed[1]; + phaseShift = _feedbackLevel ? ((*o + *i) << _feedbackLevel) : 0; + *o = *i; + } else { + phaseShift = phasebuf << 15; + } + + if (lvlout < 832) { + uint32 index = (lvlout << 3) + _sinTbl[(((int32)((_phase & 0xffff0000) + + phaseShift)) >> 16) & 0x3ff]; + *i = ((index < 6656) ? _tLvlTbl[index] : 0); + } else { + *i = 0; + } + + _phase += _phaseIncrement; + out += *o; +} + +void TownsPC98_FmSynthOperator::reset(){ + keyOff(); + _timer = 0; + _keyScale2 = 0; + _currentLevel = 1023; + + frequency(0); + detune(0); + scaleRate(0); + multiple(0); + updatePhaseIncrement(); + attackRate(0); + decayRate(0); + releaseRate(0); + sustainRate(0); + feedbackLevel(0); + totalLevel(127); + ampModulation(false); +} + +bool TownsPC98_FmSynthOperator::scaleRate(uint8 value) { + value = 3 - value; + if (_keyScale1 != value) { + _keyScale1 = value; + return true; + } + + int k = _keyScale2; + int r = _specifiedAttackRate ? (_specifiedAttackRate << 1) + 0x20 : 0; + fs_a.rate = ((r + k) < 94) ? _rateTbl[r + k] : 136; + fs_a.shift = ((r + k) < 94) ? _rshiftTbl[r + k] : 0; + return false; +} + +class TownsPC98_FmSynthSquareSineSource { +public: + TownsPC98_FmSynthSquareSineSource(const uint32 timerbase); + ~TownsPC98_FmSynthSquareSineSource(); + + void init(const int *rsTable, const int *rseTable); + void reset(); + void writeReg(uint8 address, uint8 value, bool force = false); + + void nextTick(int32 *buffer, uint32 bufferSize); + + void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + + uint8 chanEnable() const { return _chanEnable; } +private: + void updateRegs(); + + uint8 _updateRequestBuf[64]; + int _updateRequest; + int _rand; + + int8 _evpTimer; + uint32 _pReslt; + uint8 _attack; + + bool _evpUpdate, _cont; + + int _evpUpdateCnt; + uint8 _outN; + int _nTick; + + int32 *_tlTable; + int32 *_tleTable; + + const uint32 _tickLength; + uint32 _timer; + + struct Channel { + int tick; + uint8 smp; + uint8 out; + + uint8 frqL; + uint8 frqH; + uint8 vol; + } _channels[3]; + + uint8 _noiseGenerator; + uint8 _chanEnable; + + uint8 **_reg; + + uint16 _volumeA; + uint16 _volumeB; + int _volMaskA; + int _volMaskB; + + bool _ready; +}; + +class TownsPC98_FmSynthPercussionSource { +public: + TownsPC98_FmSynthPercussionSource(const uint32 timerbase); + ~TownsPC98_FmSynthPercussionSource() { delete[] _reg; } + + void init(const uint8 *instrData = 0); + void reset(); + void writeReg(uint8 address, uint8 value); + + void nextTick(int32 *buffer, uint32 bufferSize); + + void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + +private: + struct RhtChannel { + const uint8 *data; + + const uint8 *start; + const uint8 *end; + const uint8 *pos; + uint32 size; + bool active; + uint8 level; + + int8 decState; + uint8 decStep; + + int16 samples[2]; + int out; + + uint8 startPosH; + uint8 startPosL; + uint8 endPosH; + uint8 endPosL; + }; + + void recalcOuput(RhtChannel *ins); + void advanceInput(RhtChannel *ins); + + RhtChannel _rhChan[6]; + + uint8 _totalLevel; + + const uint32 _tickLength; + uint32 _timer; + + uint8 **_reg; + + uint16 _volumeA; + uint16 _volumeB; + int _volMaskA; + int _volMaskB; + + bool _ready; +}; + +TownsPC98_FmSynthSquareSineSource::TownsPC98_FmSynthSquareSineSource(const uint32 timerbase) : _tlTable(0), + _tleTable(0), _updateRequest(-1), _tickLength(timerbase * 27), _ready(0), _reg(0), _rand(1), _outN(1), + _nTick(0), _evpUpdateCnt(0), _evpTimer(0x1f), _pReslt(0x1f), _attack(0), _cont(false), _evpUpdate(true), + _timer(0), _noiseGenerator(0), _chanEnable(0), + _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { + + memset(_channels, 0, sizeof(_channels)); + memset(_updateRequestBuf, 0, sizeof(_updateRequestBuf)); + _reg = new uint8 *[11]; + + _reg[0] = &_channels[0].frqL; + _reg[1] = &_channels[0].frqH; + _reg[2] = &_channels[1].frqL; + _reg[3] = &_channels[1].frqH; + _reg[4] = &_channels[2].frqL; + _reg[5] = &_channels[2].frqH; + _reg[6] = &_noiseGenerator; + _reg[7] = &_chanEnable; + _reg[8] = &_channels[0].vol; + _reg[9] = &_channels[1].vol; + _reg[10] = &_channels[2].vol; + + reset(); +} + +TownsPC98_FmSynthSquareSineSource::~TownsPC98_FmSynthSquareSineSource() { + delete[] _tlTable; + delete[] _tleTable; + delete[] _reg; +} + +void TownsPC98_FmSynthSquareSineSource::init(const int *rsTable, const int *rseTable) { + if (_ready) { + reset(); + return; + } + + delete[] _tlTable; + delete[] _tleTable; + _tlTable = new int32[16]; + _tleTable = new int32[32]; + float a, b, d; + d = 801.0f; + + for (int i = 0; i < 16; i++) { + b = 1.0f / rsTable[i]; + a = 1.0f / d + b + 1.0f / 1000.0f; + float v = (b / a) * 32767.0f; + _tlTable[i] = (int32) v; + + b = 1.0f / rseTable[i]; + a = 1.0f / d + b + 1.0f / 1000.0f; + v = (b / a) * 32767.0f; + _tleTable[i] = (int32) v; + } + + for (int i = 16; i < 32; i++) { + b = 1.0f / rseTable[i]; + a = 1.0f / d + b + 1.0f / 1000.0f; + float v = (b / a) * 32767.0f; + _tleTable[i] = (int32) v; + } + + _ready = true; +} + +void TownsPC98_FmSynthSquareSineSource::reset() { + _rand = 1; + _outN = 1; + _updateRequest = -1; + _nTick = _evpUpdateCnt = 0; + _evpTimer = 0x1f; + _pReslt = 0x1f; + _attack = 0; + _cont = false; + _evpUpdate = true; + _timer = 0; + + for (int i = 0; i < 3; i++) { + _channels[i].tick = 0; + _channels[i].smp = _channels[i].out = 0; + } + + for (int i = 0; i < 14; i++) + writeReg(i, 0, true); + + writeReg(7, 0xbf, true); +} + +void TownsPC98_FmSynthSquareSineSource::writeReg(uint8 address, uint8 value, bool force) { + if (!_ready) + return; + + if (address > 10 || *_reg[address] == value) { + if ((address == 11 || address == 12 || address == 13) && value) + warning("TownsPC98_FmSynthSquareSineSource: unsupported reg address: %d", address); + return; + } + + if (!force) { + if (_updateRequest >= 63) { + warning("TownsPC98_FmSynthSquareSineSource: event buffer overflow"); + _updateRequest = -1; + } + _updateRequestBuf[++_updateRequest] = value; + _updateRequestBuf[++_updateRequest] = address; + return; + } + + *_reg[address] = value; +} + +void TownsPC98_FmSynthSquareSineSource::nextTick(int32 *buffer, uint32 bufferSize) { + if (!_ready) + return; + + for (uint32 i = 0; i < bufferSize; i++) { + _timer += _tickLength; + while (_timer > 0x5B8D80) { + _timer -= 0x5B8D80; + + if (++_nTick >= (_noiseGenerator & 0x1f)) { + if ((_rand + 1) & 2) + _outN ^= 1; + + _rand = (((_rand & 1) ^ ((_rand >> 3) & 1)) << 16) | (_rand >> 1); + _nTick = 0; + } + + for (int ii = 0; ii < 3; ii++) { + if (++_channels[ii].tick >= (((_channels[ii].frqH & 0x0f) << 8) | _channels[ii].frqL)) { + _channels[ii].tick = 0; + _channels[ii].smp ^= 1; + } + _channels[ii].out = (_channels[ii].smp | ((_chanEnable >> ii) & 1)) & (_outN | ((_chanEnable >> (ii + 3)) & 1)); + } + + if (_evpUpdate) { + if (++_evpUpdateCnt >= 0) { + _evpUpdateCnt = 0; + + if (--_evpTimer < 0) { + if (_cont) { + _evpTimer &= 0x1f; + } else { + _evpUpdate = false; + _evpTimer = 0; + } + } + } + } + _pReslt = _evpTimer ^ _attack; + updateRegs(); + } + + int32 finOut = 0; + for (int ii = 0; ii < 3; ii++) { + int32 finOutTemp = ((_channels[ii].vol >> 4) & 1) ? _tleTable[_channels[ii].out ? _pReslt : 0] : _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; + + if ((1 << ii) & _volMaskA) + finOutTemp = (finOutTemp * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if ((1 << ii) & _volMaskB) + finOutTemp = (finOutTemp * _volumeB) / Audio::Mixer::kMaxMixerVolume; + + finOut += finOutTemp; + } + + finOut /= 3; + + buffer[i << 1] += finOut; + buffer[(i << 1) + 1] += finOut; + } +} + +void TownsPC98_FmSynthSquareSineSource::updateRegs() { + for (int i = 0; i < _updateRequest;) { + uint8 b = _updateRequestBuf[i++]; + uint8 a = _updateRequestBuf[i++]; + writeReg(a, b, true); + } + _updateRequest = -1; +} + +TownsPC98_FmSynthPercussionSource::TownsPC98_FmSynthPercussionSource(const uint32 timerbase) : + _tickLength(timerbase * 2), _timer(0), _ready(false), _volMaskA(0), _volMaskB(0), _volumeA(Audio::Mixer::kMaxMixerVolume), _volumeB(Audio::Mixer::kMaxMixerVolume) { + + memset(_rhChan, 0, sizeof(RhtChannel) * 6); + _reg = new uint8 *[40]; + + _reg[0] = _reg[1] = _reg[2] = _reg[3] = _reg[4] = _reg[5] = _reg[6] = _reg[7] = _reg[8] = _reg[9] = _reg[10] = _reg[11] = _reg[12] = _reg[13] = _reg[14] = _reg[15] = 0; + _reg[16] = &_rhChan[0].startPosL; + _reg[17] = &_rhChan[1].startPosL; + _reg[18] = &_rhChan[2].startPosL; + _reg[19] = &_rhChan[3].startPosL; + _reg[20] = &_rhChan[4].startPosL; + _reg[21] = &_rhChan[5].startPosL; + _reg[22] = &_rhChan[0].startPosH; + _reg[23] = &_rhChan[1].startPosH; + _reg[24] = &_rhChan[2].startPosH; + _reg[25] = &_rhChan[3].startPosH; + _reg[26] = &_rhChan[4].startPosH; + _reg[27] = &_rhChan[5].startPosH; + _reg[28] = &_rhChan[0].endPosL; + _reg[29] = &_rhChan[1].endPosL; + _reg[30] = &_rhChan[2].endPosL; + _reg[31] = &_rhChan[3].endPosL; + _reg[32] = &_rhChan[4].endPosL; + _reg[33] = &_rhChan[5].endPosL; + _reg[34] = &_rhChan[0].endPosH; + _reg[35] = &_rhChan[1].endPosH; + _reg[36] = &_rhChan[2].endPosH; + _reg[37] = &_rhChan[3].endPosH; + _reg[38] = &_rhChan[4].endPosH; + _reg[39] = &_rhChan[5].endPosH; +} + +void TownsPC98_FmSynthPercussionSource::init(const uint8 *instrData) { + if (_ready) { + reset(); + return; + } + + const uint8 *start = instrData; + const uint8 *pos = start; + + if (instrData) { + for (int i = 0; i < 6; i++) { + _rhChan[i].data = start + READ_BE_UINT16(pos); + pos += 2; + _rhChan[i].size = READ_BE_UINT16(pos); + pos += 2; + } + reset(); + _ready = true; + } else { + memset(_rhChan, 0, sizeof(RhtChannel) * 6); + _ready = false; + } +} + +void TownsPC98_FmSynthPercussionSource::reset() { + _timer = 0; + _totalLevel = 63; + + for (int i = 0; i < 6; i++) { + RhtChannel *s = &_rhChan[i]; + s->pos = s->start = s->data; + s->end = s->data + s->size; + s->active = false; + s->level = 0; + s->out = 0; + s->decStep = 1; + s->decState = 0; + s->samples[0] = s->samples[1] = 0; + s->startPosH = s->startPosL = s->endPosH = s->endPosL = 0; + } +} + +void TownsPC98_FmSynthPercussionSource::writeReg(uint8 address, uint8 value) { + if (!_ready) + return; + + uint8 h = address >> 4; + uint8 l = address & 15; + + if (address > 15) + *_reg[address] = value; + + if (address == 0) { + if (value & 0x80) { + //key off + for (int i = 0; i < 6; i++) { + if ((value >> i) & 1) + _rhChan[i].active = false; + } + } else { + //key on + for (int i = 0; i < 6; i++) { + if ((value >> i) & 1) { + RhtChannel *s = &_rhChan[i]; + s->pos = s->start; + s->active = true; + s->out = 0; + s->samples[0] = s->samples[1] = 0; + s->decStep = 1; + s->decState = 0; + } + } + } + } else if (address == 1) { + // total level + _totalLevel = (value & 63) ^ 63; + for (int i = 0; i < 6; i++) + recalcOuput(&_rhChan[i]); + } else if (!h && l & 8) { + // instrument level + l &= 7; + _rhChan[l].level = (value & 0x1f) ^ 0x1f; + recalcOuput(&_rhChan[l]); + } else if (h & 3) { + l &= 7; + if (h == 1) { + // set start offset + _rhChan[l].start = _rhChan[l].data + ((_rhChan[l].startPosH << 8 | _rhChan[l].startPosL) << 8); + } else if (h == 2) { + // set end offset + _rhChan[l].end = _rhChan[l].data + ((_rhChan[l].endPosH << 8 | _rhChan[l].endPosL) << 8) + 255; + } + } +} + +void TownsPC98_FmSynthPercussionSource::nextTick(int32 *buffer, uint32 bufferSize) { + if (!_ready) + return; + + for (uint32 i = 0; i < bufferSize; i++) { + _timer += _tickLength; + while (_timer > 0x5B8D80) { + _timer -= 0x5B8D80; + + for (int ii = 0; ii < 6; ii++) { + RhtChannel *s = &_rhChan[ii]; + if (s->active) { + recalcOuput(s); + if (s->decStep) { + advanceInput(s); + if (s->pos == s->end) + s->active = false; + } + s->decStep ^= 1; + } + } + } + + int32 finOut = 0; + + for (int ii = 0; ii < 6; ii++) { + if (_rhChan[ii].active) + finOut += _rhChan[ii].out; + } + + finOut <<= 1; + + if (1 & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if (1 & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + + buffer[i << 1] += finOut; + buffer[(i << 1) + 1] += finOut; + } +} + +void TownsPC98_FmSynthPercussionSource::recalcOuput(RhtChannel *ins) { + uint32 s = _totalLevel + ins->level; + uint32 x = s > 62 ? 0 : (1 + (s >> 3)); + int32 y = s > 62 ? 0 : (15 - (s & 7)); + ins->out = ((ins->samples[ins->decStep] * y) >> x) & ~3; +} + +void TownsPC98_FmSynthPercussionSource::advanceInput(RhtChannel *ins) { + static const int8 adjustIndex[] = {-1, -1, -1, -1, 2, 5, 7, 9 }; + + static const int16 stepTable[] = { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, + 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, + 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 + }; + + uint8 cur = (int8) *ins->pos++; + + for (int i = 0; i < 2; i++) { + int b = (2 * (cur & 7) + 1) * stepTable[ins->decState] / 8; + ins->samples[i] = CLIP(ins->samples[i ^ 1] + (cur & 8 ? b : -b), -2048, 2047); + ins->decState = CLIP(ins->decState + adjustIndex[cur & 7], 0, 48); + cur >>= 4; + } +} + +TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) : + _mixer(mixer), + _chanInternal(0), _ssg(0), _prc(0), + _numChan(type == kType26 ? 3 : 6), _numSSG(type == kTypeTowns ? 0 : 3), _hasPercussion(type == kType86 ? true : false), + _oprRates(0), _oprRateshift(0), _oprAttackDecay(0), _oprFrq(0), _oprSinTbl(0), _oprLevelOut(0), _oprDetune(0), + _baserate(55125.0f / (float)mixer->getOutputRate()), + _volMaskA(0), _volMaskB(0), _volumeA(255), _volumeB(255), + _regProtectionFlag(false), _ready(false) { + + memset(&_timers[0], 0, sizeof(ChipTimer)); + memset(&_timers[1], 0, sizeof(ChipTimer)); + _timers[0].cb = &TownsPC98_FmSynth::timerCallbackA; + _timers[1].cb = &TownsPC98_FmSynth::timerCallbackB; + _timerbase = (uint32)(_baserate * 1000000.0f); +} + +TownsPC98_FmSynth::~TownsPC98_FmSynth() { + Common::StackLock lock(_mutex); + _mixer->stopHandle(_soundHandle); + delete _ssg; + delete _prc; + delete[] _chanInternal; + + delete[] _oprRates; + delete[] _oprRateshift; + delete[] _oprFrq; + delete[] _oprAttackDecay; + delete[] _oprSinTbl; + delete[] _oprLevelOut; + delete[] _oprDetune; +} + +bool TownsPC98_FmSynth::init() { + if (_ready) { + reset(); + return true; + } + + generateTables(); + + _chanInternal = new ChanInternal[_numChan]; + for (int i = 0; i < _numChan; i++) { + memset(&_chanInternal[i], 0, sizeof(ChanInternal)); + for (int j = 0; j < 4; ++j) + _chanInternal[i].opr[j] = new TownsPC98_FmSynthOperator(_timerbase, _oprRates, _oprRateshift, _oprAttackDecay, _oprFrq, _oprSinTbl, _oprLevelOut, _oprDetune); + } + + if (_numSSG) { + _ssg = new TownsPC98_FmSynthSquareSineSource(_timerbase); + _ssg->init(&_ssgTables[0], &_ssgTables[16]); + } + + if (_hasPercussion) { + _prc = new TownsPC98_FmSynthPercussionSource(_timerbase); + _prc->init(_percussionData); + } + + _mixer->playStream(Audio::Mixer::kPlainSoundType, + &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + + _ready = true; + + return true; +} + +void TownsPC98_FmSynth::reset() { + for (int i = 0; i < _numChan; i++) { + for (int ii = 0; ii < 4; ii++) + _chanInternal[i].opr[ii]->reset(); + memset(_chanInternal[i].feedbuf, 0, 3); + _chanInternal[i].algorithm = 0; + _chanInternal[i].frqTemp = 0; + _chanInternal[i].enableLeft = _chanInternal[i].enableRight = true; + _chanInternal[i].updateEnvelopeParameters = false; + } + + writeReg(0, 0x27, 0x33); + + if (_ssg) + _ssg->reset(); + + if (_prc) + _prc->reset(); +} + +void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { + if (_regProtectionFlag || !_ready) + return; + + static const uint8 oprOrdr[] = { 0, 2, 1, 3 }; + + Common::StackLock lock(_mutex); + + uint8 h = regAddress & 0xf0; + uint8 l = (regAddress & 0x0f); + + ChanInternal *c = 0; + TownsPC98_FmSynthOperator **co = 0; + TownsPC98_FmSynthOperator *o = 0; + + if (regAddress > 0x2F) { + c = &_chanInternal[(l & 3) + 3 * part]; + co = c->opr; + o = c->opr[oprOrdr[(l - (l & 3)) >> 2]]; + } else if (regAddress == 0x28) { + c = &_chanInternal[(value & 3) + ((value & 4) ? 3 : 0)]; + co = c->opr; + } + + switch (h) { + case 0x00: + // ssg + if (_ssg) + _ssg->writeReg(l, value); + break; + case 0x10: + // pcm rhythm channel + if (_prc) + _prc->writeReg(l, value); + break; + case 0x20: + if (l == 8) { + // Key on/off + for (int i = 0; i < 4; i++) { + if ((value >> (4 + i)) & 1) + co[oprOrdr[i]]->keyOn(); + else + co[oprOrdr[i]]->keyOff(); + } + } else if (l == 4) { + // Timer A + _timers[0].value = (_timers[0].value & 3) | (value << 2); + } else if (l == 5) { + // Timer A + _timers[0].value = (_timers[0].value & 0x3fc) | (value & 3); + } else if (l == 6) { + // Timer B + _timers[1].value = value & 0xff; + } else if (l == 7) { + if (value & 1) { + float spc = (float)(0x400 - _timers[0].value) / _baserate; + if (spc < 1) { + warning("TownsPC98_FmSynth: Invalid Timer A setting: %d", _timers[0].value); + spc = 1; + } + + _timers[0].smpPerCb = (int32) spc; + _timers[0].smpPerCbRem = (uint32) ((spc - (float)_timers[0].smpPerCb) * 1000000.0f); + _timers[0].smpTillCb = _timers[0].smpPerCb; + _timers[0].smpTillCbRem = _timers[0].smpPerCbRem; + _timers[0].enabled = true; + } else { + _timers[0].enabled = false; + } + + if (value & 2) { + float spc = (float)(0x100 - _timers[1].value) * 16.0f / _baserate; + if (spc < 1) { + warning("TownsPC98_FmSynth: Invalid Timer B setting: %d", _timers[1].value); + spc = 1; + } + + _timers[1].smpPerCb = (int32) spc; + _timers[1].smpPerCbRem = (uint32) ((spc - (float)_timers[1].smpPerCb) * 1000000.0f); + _timers[1].smpTillCb = _timers[1].smpPerCb; + _timers[1].smpTillCbRem = _timers[1].smpPerCbRem; + _timers[1].enabled = true; + } else { + _timers[1].enabled = false; + } + + if (value & 0x10) { + _timers[0].smpTillCb = _timers[0].smpPerCb; + _timers[0].smpTillCbRem = _timers[0].smpTillCbRem; + } + + if (value & 0x20) { + _timers[1].smpTillCb = _timers[1].smpPerCb; + _timers[1].smpTillCbRem = _timers[1].smpTillCbRem; + } + } else if (l == 2) { + // LFO + if (value & 8) + warning("TownsPC98_FmSynth: TRYING TO USE LFO (NOT SUPPORTED)"); + } else if (l == 10 || l == 11) { + // DAC + if (l == 11 && (value & 0x80)) + warning("TownsPC98_FmSynth: TRYING TO USE DAC (NOT SUPPORTED)"); + } + break; + + case 0x30: + // detune, multiple + o->detune((value >> 4) & 7); + o->multiple(value & 0x0f); + c->updateEnvelopeParameters = true; + break; + + case 0x40: + // total level + o->totalLevel(value & 0x7f); + break; + + case 0x50: + // rate scaling, attack rate + o->attackRate(value & 0x1f); + if (o->scaleRate(value >> 6)) + c->updateEnvelopeParameters = true; + break; + + case 0x60: + // first decay rate, amplitude modulation + o->decayRate(value & 0x1f); + o->ampModulation(value & 0x80 ? true : false); + break; + + case 0x70: + // secondary decay rate + o->sustainRate(value & 0x1f); + break; + + case 0x80: + // secondary amplitude, release rate; + o->sustainLevel(value >> 4); + o->releaseRate(value & 0x0f); + break; + + case 0x90: + warning("TownsPC98_FmSynth: TRYING TO USE SSG ENVELOPE SHAPES (NOT SUPPORTED)"); + break; + + case 0xa0: + // frequency + l &= ~3; + if (l == 0) { + c->frqTemp = (c->frqTemp & 0xff00) | value; + c->updateEnvelopeParameters = true; + for (int i = 0; i < 4; i++) + co[i]->frequency(c->frqTemp); + } else if (l == 4) { + c->frqTemp = (c->frqTemp & 0xff) | (value << 8); + } else if (l == 8) { + // Ch 3/6 special mode frq + warning("TownsPC98_FmSynth: TRYING TO USE CH 3/6 SPECIAL MODE FREQ (NOT SUPPORTED)"); + } else if (l == 12) { + // Ch 3/6 special mode frq + warning("TownsPC98_FmSynth: TRYING TO USE CH 3/6 SPECIAL MODE FREQ (NOT SUPPORTED)"); + } + break; + + case 0xb0: + l &= ~3; + if (l == 0) { + // feedback, _algorithm + co[0]->feedbackLevel((value >> 3) & 7); + c->algorithm = value & 7; + } else if (l == 4) { + // stereo, LFO sensitivity + c->enableLeft = value & 0x80 ? true : false; + c->enableRight = value & 0x40 ? true : false; + c->ampModSensitivity((value & 0x30) >> 4); + c->frqModSensitivity(value & 3); + } + break; + + default: + warning("TownsPC98_FmSynth: UNKNOWN ADDRESS %d", regAddress); + } +} + +int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) { + Common::StackLock lock(_mutex); + + memset(buffer, 0, sizeof(int16) * numSamples); + int32 *tmp = new int32[numSamples]; + int32 *tmpStart = tmp; + memset(tmp, 0, sizeof(int32) * numSamples); + int32 samplesLeft = numSamples >> 1; + + while (samplesLeft) { + int32 render = samplesLeft; + + for (int i = 0; i < 2; i++) { + if (_timers[i].enabled && _timers[i].cb) { + if (!_timers[i].smpTillCb) { + (this->*_timers[i].cb)(); + _timers[i].smpTillCb = _timers[i].smpPerCb; + + _timers[i].smpTillCbRem += _timers[i].smpPerCbRem; + if (_timers[i].smpTillCbRem >= _timerbase) { + _timers[i].smpTillCb++; + _timers[i].smpTillCbRem -= _timerbase; + } + } + render = MIN(render, _timers[i].smpTillCb); + } + } + + samplesLeft -= render; + + for (int i = 0; i < 2; i++) { + if (_timers[i].enabled && _timers[i].cb) { + _timers[i].smpTillCb -= render; + } + } + + nextTick(tmp, render); + + if (_ssg) + _ssg->nextTick(tmp, render); + if (_prc) + _prc->nextTick(tmp, render); + + nextTickEx(tmp, render); + + for (int i = 0; i < render; ++i) { + int32 l = CLIP(tmp[i << 1], -32767, 32767); + buffer[i << 1] = (int16) l; + int32 r = CLIP(tmp[(i << 1) + 1], -32767, 32767); + buffer[(i << 1) + 1] = (int16) r; + } + + buffer += (render << 1); + tmp += (render << 1); + } + + delete[] tmpStart; + return numSamples; +} + +uint8 TownsPC98_FmSynth::readSSGStatus() { + return _ssg->chanEnable(); +} + +void TownsPC98_FmSynth::setVolumeIntern(int volA, int volB) { + Common::StackLock lock(_mutex); + _volumeA = volA; + _volumeB = volB; + if (_ssg) + _ssg->setVolumeIntern(volA, volB); + if (_prc) + _prc->setVolumeIntern(volA, volB); +} + +void TownsPC98_FmSynth::setVolumeChannelMasks(int channelMaskA, int channelMaskB) { + Common::StackLock lock(_mutex); + _volMaskA = channelMaskA; + _volMaskB = channelMaskB; + if (_ssg) + _ssg->setVolumeChannelMasks(_volMaskA >> _numChan, _volMaskB >> _numChan); + if (_prc) + _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); +} + +void TownsPC98_FmSynth::generateTables() { + delete[] _oprRates; + _oprRates = new uint8[128]; + + WRITE_BE_UINT32(_oprRates + 32, _numChan == 6 ? 0x90900000 : 0x00081018); + WRITE_BE_UINT32(_oprRates + 36, _numChan == 6 ? 0x00001010 : 0x00081018); + memset(_oprRates, 0x90, 32); + memset(_oprRates + 96, 0x80, 32); + uint8 *dst = (uint8 *)_oprRates + 40; + for (int i = 0; i < 40; i += 4) + WRITE_BE_UINT32(dst + i, 0x00081018); + for (int i = 0; i < 48; i += 4) + WRITE_BE_UINT32(dst + i, 0x00081018); + dst += 40; + for (uint8 i = 0; i < 16; i ++) { + uint8 v = (i < 12) ? i : 12; + *dst++ = ((4 + v) << 3); + } + + delete[] _oprRateshift; + _oprRateshift = new uint8[128]; + memset(_oprRateshift, 0, 128); + dst = (uint8 *)_oprRateshift + 32; + for (int i = 11; i; i--) { + memset(dst, i, 4); + dst += 4; + } + + delete[] _oprFrq; + _oprFrq = new uint32[0x1000]; + for (uint32 i = 0; i < 0x1000; i++) + _oprFrq[i] = (uint32)(_baserate * (float)(i << 11)); + + delete[] _oprAttackDecay; + _oprAttackDecay = new uint8[152]; + memset(_oprAttackDecay, 0, 152); + for (int i = 0; i < 36; i++) + WRITE_BE_UINT32(_oprAttackDecay + (i << 2), _adtStat[i]); + + delete[] _oprSinTbl; + _oprSinTbl = new uint32[1024]; + for (int i = 0; i < 1024; i++) { + double val = sin((double) (((i << 1) + 1) * PI / 1024.0)); + double d_dcb = log(1.0 / (double)ABS(val)) / log(2.0) * 256.0; + int32 i_dcb = (int32)(2.0 * d_dcb); + i_dcb = (i_dcb & 1) ? (i_dcb >> 1) + 1 : (i_dcb >> 1); + _oprSinTbl[i] = (i_dcb << 1) + (val >= 0.0 ? 0 : 1); + } + + delete[] _oprLevelOut; + _oprLevelOut = new int32[0x1a00]; + for (int i = 0; i < 256; i++) { + double val = floor(65536.0 / pow(2.0, 0.00390625 * (double)(1 + i))); + int32 val_int = ((int32) val) >> 4; + _oprLevelOut[i << 1] = (val_int & 1) ? ((val_int >> 1) + 1) << 2 : (val_int >> 1) << 2; + _oprLevelOut[(i << 1) + 1] = -_oprLevelOut[i << 1]; + for (int ii = 1; ii < 13; ii++) { + _oprLevelOut[(i << 1) + (ii << 9)] = _oprLevelOut[i << 1] >> ii; + _oprLevelOut[(i << 1) + (ii << 9) + 1] = -_oprLevelOut[(i << 1) + (ii << 9)]; + } + } + + uint8 *dtt = new uint8[128]; + memset(dtt, 0, 36); + memset(dtt + 36, 1, 8); + memcpy(dtt + 44, _detSrc, 84); + + delete[] _oprDetune; + _oprDetune = new int32[256]; + for (int i = 0; i < 128; i++) { + _oprDetune[i] = (int32) ((float)dtt[i] * _baserate * 64.0); + _oprDetune[i + 128] = -_oprDetune[i]; + } + + delete[] dtt; +} + +void TownsPC98_FmSynth::nextTick(int32 *buffer, uint32 bufferSize) { + if (!_ready) + return; + + for (int i = 0; i < _numChan; i++) { + TownsPC98_FmSynthOperator **o = _chanInternal[i].opr; + + if (_chanInternal[i].updateEnvelopeParameters) { + _chanInternal[i].updateEnvelopeParameters = false; + for (int ii = 0; ii < 4 ; ii++) + o[ii]->updatePhaseIncrement(); + } + + for (uint32 ii = 0; ii < bufferSize ; ii++) { + int32 phbuf1, phbuf2, output; + phbuf1 = phbuf2 = output = 0; + + int32 *leftSample = &buffer[ii * 2]; + int32 *rightSample = &buffer[ii * 2 + 1]; + int32 *del = &_chanInternal[i].feedbuf[2]; + int32 *feed = _chanInternal[i].feedbuf; + + switch (_chanInternal[i].algorithm) { + case 0: + o[0]->generateOutput(0, feed, phbuf1); + o[2]->generateOutput(*del, 0, phbuf2); + *del = 0; + o[1]->generateOutput(phbuf1, 0, *del); + o[3]->generateOutput(phbuf2, 0, output); + break; + case 1: + o[0]->generateOutput(0, feed, phbuf1); + o[2]->generateOutput(*del, 0, phbuf2); + o[1]->generateOutput(0, 0, phbuf1); + o[3]->generateOutput(phbuf2, 0, output); + *del = phbuf1; + break; + case 2: + o[0]->generateOutput(0, feed, phbuf2); + o[2]->generateOutput(*del, 0, phbuf2); + o[1]->generateOutput(0, 0, phbuf1); + o[3]->generateOutput(phbuf2, 0, output); + *del = phbuf1; + break; + case 3: + o[0]->generateOutput(0, feed, phbuf2); + o[2]->generateOutput(0, 0, *del); + o[1]->generateOutput(phbuf2, 0, phbuf1); + o[3]->generateOutput(*del, 0, output); + *del = phbuf1; + break; + case 4: + o[0]->generateOutput(0, feed, phbuf1); + o[2]->generateOutput(0, 0, phbuf2); + o[1]->generateOutput(phbuf1, 0, output); + o[3]->generateOutput(phbuf2, 0, output); + *del = 0; + break; + case 5: + o[0]->generateOutput(0, feed, phbuf1); + o[2]->generateOutput(*del, 0, output); + o[1]->generateOutput(phbuf1, 0, output); + o[3]->generateOutput(phbuf1, 0, output); + *del = phbuf1; + break; + case 6: + o[0]->generateOutput(0, feed, phbuf1); + o[2]->generateOutput(0, 0, output); + o[1]->generateOutput(phbuf1, 0, output); + o[3]->generateOutput(0, 0, output); + *del = 0; + break; + case 7: + o[0]->generateOutput(0, feed, output); + o[2]->generateOutput(0, 0, output); + o[1]->generateOutput(0, 0, output); + o[3]->generateOutput(0, 0, output); + *del = 0; + break; + }; + + int32 finOut = (output << 2) / ((_numChan + _numSSG - 3) / 3); + + if ((1 << i) & _volMaskA) + finOut = (finOut * _volumeA) / Audio::Mixer::kMaxMixerVolume; + + if ((1 << i) & _volMaskB) + finOut = (finOut * _volumeB) / Audio::Mixer::kMaxMixerVolume; + + if (_chanInternal[i].enableLeft) + *leftSample += finOut; + + if (_chanInternal[i].enableRight) + *rightSample += finOut; + } + } +} + +const uint32 TownsPC98_FmSynth::_adtStat[] = { + 0x00010001, 0x00010001, 0x00010001, 0x01010001, + 0x00010101, 0x00010101, 0x00010101, 0x01010101, + 0x01010101, 0x01010101, 0x01010102, 0x01010102, + 0x01020102, 0x01020102, 0x01020202, 0x01020202, + 0x02020202, 0x02020202, 0x02020204, 0x02020204, + 0x02040204, 0x02040204, 0x02040404, 0x02040404, + 0x04040404, 0x04040404, 0x04040408, 0x04040408, + 0x04080408, 0x04080408, 0x04080808, 0x04080808, + 0x08080808, 0x08080808, 0x10101010, 0x10101010 +}; + +const uint8 TownsPC98_FmSynth::_detSrc[] = { + 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, + 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, + 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, + 0x16, 0x16, 0x16, 0x16 +}; + +const int TownsPC98_FmSynth::_ssgTables[] = { + 0x01202A, 0x0092D2, 0x006B42, 0x0053CB, 0x003DF8, 0x003053, 0x0022DA, 0x001A8C, + 0x00129B, 0x000DC1, 0x000963, 0x0006C9, 0x000463, 0x0002FA, 0x0001B6, 0x0000FB, + 0x0193B6, 0x01202A, 0x00CDB1, 0x0092D2, 0x007D7D, 0x006B42, 0x005ECD, 0x0053CB, + 0x00480F, 0x003DF8, 0x0036B9, 0x003053, 0x00290A, 0x0022DA, 0x001E6B, 0x001A8C, + 0x001639, 0x00129B, 0x000FFF, 0x000DC1, 0x000B5D, 0x000963, 0x0007FB, 0x0006C9, + 0x000575, 0x000463, 0x00039D, 0x0002FA, 0x000242, 0x0001B6, 0x00014C, 0x0000FB +}; + +const uint8 TownsPC98_FmSynth::_percussionData[] = { + 0,24,1,192,1,216,2,128,4,88,23,64,27,152,1,128,29,24,2,128,31,152,0,128,136,128,128,128,0,136,97,103,153,139,34,163,72,195,27,69,1,154,137,35,8,51,169,122,164,75,133,203,81,146,168,121,185,68,202,8,33,237,49,177,12,133,140,17,160,42,161,10,0,137,176, 57, + 233,41,160,136,235,65,177,137,128,26,164,28,3,157,51,137,1,152,113,161,40,146,115,192,56,5,169,66,161,56,1,50,145,59,39,168,97,1,160,57,7,153,50,153,32,2,25,129,32,20,186,66,129,24,153,164,142,130,169,153,26,242,138,217,9,128,204,58,209,172,40, 176, 141, + 128,155,144,203,139,0,235,9,177,172,0,185,168,138,25,240,59,211,139,19,176,90,160,17,26,132,41,1,5,25,3,50,144,115,147,42,39,152,41,3,56,193,105,130,155,66,200,26,19,218,154,49,201,171,138,176,251,139,185,172,136,189,139,145,207,41,160,171,152, 186, 139, + 186,141,128,218,171,51,217,170,56,163,12,4,155,81,147,42,37,152,32,54,136,49,50,48,37,32,69,0,17,50,50,83,2,16,68,20,8,66,4,154,84,145,24,33,24,32,17,18,145,32,22,168,49,163,1,33,50,184,115,129,25,66,1,24,67,2,80,35,40,53,2,65,51,19,67,37,0,52,35,49, 37, + 34,49,37,17,52,17,35,35,35,34,32,49,33,152,34,145,24,24,128,138,128,184,9,177,171,168,185,155,152,172,155,186,172,185,172,155,186,173,153,202,187,185,202,170,171,202,186,169,170,170,171,139,154,171,153,154,169,10,168,154,128,168,154,0,153, 152, 136, 137, + 128,153,0,152,8,128,137,0,136,136,8,9,8,9,8,24,153,128,136,153,144,0,161,138,1,169,136,128,160,168,152,153,138,137,154,153,153,154,153,170,168,170,185,168,169,154,169,171,153,169,170,153,152,154,153,137,169,137,136,144,152,144,128,128,144,129,129, 0, 33, + 0,17,17,17,33,33,18,18,34,34,34,34,34,34,35,19,35,19,35,35,18,19,18,35,18,33,0,8,8,8,8,8,8,8,160,205,65,176,171,203,16,240,95,242,120,145,156,66,177,26,19,153,9,35,35,239,56,132,138,154,50,145,203,25,32,20,237,24,130,138,160,27,39,173,50,203,64,145, 139, + 18,168,48,146,171,65,18,176,12,52,128,25,5,57,240,104,161,25,129,18,188,114,160,26,36,200,154,18,1,128,186,73,162,173,32,184,25,144,137,234,8,154,32,160,158,18,187,81,2,235,41,36,144,154,17,67,128,33,160,114,146,26,37,33,232,41,130,41,178,29,50, 251, 24, + 1,153,138,160,76,179,155,11,0,38,252,41,146,41,178,27,193,43,39,170,136,17,129,8,49,233,48,129,11,6,26,130,136,128,64,1,248,105,145,9,16,144,140,5,25,168,16,186,48,5,171,217,57,134,171,8,34,188,20,203,41,6,155,161,89,164,140,2,136,51,202,41,131, 56, 144, + 8,97,144,146,13,69,200,42,130,25,152,57,6,220,88,177,26,148,9,168,8,67,192,156,65,145,137,10,4,154,18,157,67,160,154,1,50,188,82,170,82,185,49,220,97,144,10,8,16,145,9,136,18,202,51,184,141,114,179,139,24,19,8,250,121,160,40,160,10,18,152,168,42,35, 216, + 187,120,145,18,156,203,84,144,9,144,26,66,161,13,1,128,17,154,18,142,6,154,65,192,29,35,186,64,192,24,9,146,56,185,16,248,121,176,40,129,136,171,96,147,140,50,203,64,144,41,128,161,187,71,200,24,129,24,217,56,20,220,24,4,169,9,1,33,201,26,134,141,51,201, + 25,16,33,235,32,144,33,153,169,99,160,11,3,136,58,210,33,203,48,163,17,219,128,140,38,8,184,141,50,131,159,33,128,153,25,18,153,88,242,43,3,9,136,157,53,202,40,145,25,2,204,105,146,156,66,152,8,153,33,128,129,136,153,50,186,55,188,51,249,64,178, 27, 128, + 48,177,156,18,35,175,51,189,32,51,234,155,69,184,26,2,152,9,17,136,144,137,50,235,115,216,24,2,170,67,187,49,129,155,4,27,129,56,232,43,39,203,40,3,154,169,66,184,114,224,25,2,9,128,11,35,155,18,11,202,84,169,26,5,154,8,160,98,185,17,187,50, 23, 188, 33, + 1,139,4,154,90,147,12,3,43,2,170,171,103,193,28,132,137,8,129,24,170,50,201,42,35,202,169,52,201,33,218,40,39,203,0,40,147,29,163,139,83,185,1,4,159,34,160,12,21,155,40,129,137,58,151,13,2,136,144,16,153,40,17,131,207,51,144,140,4,154,17,146,170,73, 163, + 44,164,12,152,37,203,17,128,144,139,23,154,128,138,38,216,41,1,0,233,73,131,171,49,136,9,164,46,3,171,32,0,145,157,38,187,64,176,58,134,155,18,136,217,64,1,200,140,38,153,170,66,161,8,169,65,185,98,200,41,3,155,144,58,23,187,1,145,40,147,189,32, 68, 249, + 1,112,255,199,195,19,108,76,187,247,247,183,40,168,212,245,199,227,68,45,59,10,145,177,198,24,130,76,26,193,180,129,0,162,42,160,199,162,0,16,152,137,132,168,195,130,162,181,227,163,161,179,211,180,179,164,128,162,161,194,164,179,40,153,195,213,146, 178, + 147,176,50,186,161,196,151,58,16,28,162,160,131,122,155,33,241,146,128,40,26,128,154,36,170,89,59,9,24,144,77,161,8,177,112,139,33,232,148,24,41,61,9,26,162,32,30,58,153,32,59,73,59,11,79,137,57,9,49,30,24,153,131,25,106,61,153,73,28,56,27, 41, 137, 148, + 76,43,74,58,13,161,3,171,149,32,77,10,74,42,168,16,0,123,138,129,162,178,225,50,140,161,0,147,10,129,41,244,210,165,1,152,24,162,184,166,32,144,59,216,132,177,8,145,67,143,146,160,183,162,130,24,192,32,225,146,144,33,44,73,30,129,137,32,76, 152, 25, 161, + 2,154,32,177,132,232,2,136,210,128,149,177,32,58,27,168,225,133,8,44,107,136,25,136,17,26,58,46,16,11,145,17,144,79,136,144,136,145,152,33,31,162,130,200,82,153,74,137,147,26,0,13,133,170,149,16,192,0,178,0,128,152,182,150,9,16,9,137,33,59,63,10,152, 32, + 179,192,5,154,228,182,145,130,144,42,128,242,2,136,41,168,17,76,57,31,129,136,17,47,8,41,138,32,138,123,59,58,10,136,161,4,46,25,145,136,129,25,56,28,91,41,154,108,9,16,44,24,137,48,15,0,194,162,41,194,56,241,163,146,0,139,7,186,150,129,152,1,208,33,176, + 136,164,163,185,7,138,130,242,162,163,177,88,136,184,166,146,0,25,25,177,199,146,16,136,9,145,178,178,0,147,138,229,18,152,25,144,163,246,162,129,129,184,5,152,178,145,148,136,146,95,152,128,144,33,170,81,11,40,202,131,0,243,24,1,11,148,42, 24, 163, 140, + 120,9,76,58,153,145,56,30,72,46,42,9,8,57,91,76,59,26,160,129,41,76,10,57,192,163,129,16,225,2,27,40,200,48,91,226,40,145,43,177,177,182,196,145,33,184,165,17,192,163,194,129,211,128,162,197,129,0,136,211,146,8,162,144,0,167,160,1,176,150,137,1, 24, 243, + 0,129,145,25,123,169,130,168,132,41,63,42,136,137,120,26,136,8,24,89,29,58,177,193,147,1,26,162,176,167,180,8,49,28,29,178,162,88,43,42,57,43,61,8,29,129,128,128,123,137,24,243,16,136,16,46,0,169,149,128,1,60,153,72,154,90,25,25,25,8,91,73,12,16,137,144, + 72,11,8,167,128,129,9,138,166,193,147,162,123,137,145,1,162,26,1,219,147,129,210,147,243,1,243,16,144,145,160,131,200,4,59,75,57,218,2,178,77,24,60,11,147,10,50,141,64,27,185,122,161,41,128,90,136,24,46,16,139,16,24,28,124,9,41,8,26,121,10,42,40,139,129, + 0,201,135,137,56,176,176,35,215,145,1,26,145,144,160,135,138,1,177,146,146,161,65,242,136,164,177,1,1,186,151,208,148,129,10,32,241,145,163,178,17,168,136,151,168,2,148,185,133,176,130,129,154,163,215,0,146,136,40,211,161,131,171,81,144,170, 21, 184, 56, + 195,168,133,177,91,16,187,5,145,153,66,172,18,177,42,120,138,27,134,26,106,42,138,146,184,66,75,46,41,168,0,145,57,91,75,27,24,27,48,169,40,122,9,109,10,8,177,146,16,74,30,129,160,162,146,41,124,138,24,145,152,3,1,14,3,139,1,192,161,151,177,122,8, 10, 0, + 176,130,129,27,88,225,0,2,154,129,129,193,49,203,81,153,226,33,0,30,0,176,179,18,9,96,156,162,148,160,129,2,29,195,128,0,56,156,20,232,129,128,32,10,144,74,183,9,145,162,1,162,138,23,171,1,164,224,34,43,43,177,200,135,161,91,57,154,177,148, 145, 146, 58, + 108,136,170,35,208,177,34,128,44,129,155,151,243,16,1,154,72,193,144,18,11,122,160,153,5,192,24,130,184,132,226,0,128,153,131,181,136,65,154,128,17,170,39,28,59,144,168,80,25,47,24,26,144,32,47,41,153,161,148,8,92,9,9,129,144,33,26,47,24,137,108, 25, 10, + 17,10,73,75,47,24,184,48,8,45,57,138,136,150,10,48,139,136,35,203,121,8,27,179,161,106,0,29,16,176,179,3,185,19,227,41,145,168,61,197,177,20,10,57,42,250,147,196,16,41,138,24,195,208,135,137,0,145,160,2,210,146,195,177,132,136,153,167,210,146,162, 40, 8, + 138,148,227,145,17,137,40,169,179,130,242,2,196,9,146,145,169,167,146,130,137,136,51,220,17,163,28,74,10,76,40,140,5,137,43,18,12,107,137,40,8,201,50,0,143,3,138,161,134,138,104,169,16,162,160,121,25,28,129,152,32,56,14,16,184,146,3,46,25, 176, 129, 179, + 193,17,130,202,135,8,57,25,154,148,184,120,9,153,211,165,24,128,26,17,242,161,18,185,81,42,11,17,12,25,181,137,66,42,47,41,184,166,129,24,91,27,136,196,0,0,74,28,178,161,149,160,32,8,225,32,128,59,8,169,50,139,47,72,186,16,132,9,122,9,160,146,144,89,153, + 10,149,178,0,121,11,146,152,162,48,13,123,177,24,0,106,27,9,144,132,12,17,0,168,0,181,56,169,129,242,195,129,17,154,64,161,244,16,137,24,144,144,164,129,75,42,176,149,9,179,148,203,4,166,136,163,128,227,163,8,57,11,30,165,0,74,59,62,9,208,131,144,40, 76, + 26,27,196,129,1,25,43,49,174,67,153,136,106,152,41,25,28,2,43,44,104,45,59,8,43,128,144,120,25,12,17,152,9,130,155,151,145,74,40,13,48,192,58,90,43,43,177,146,49,31,75,24,217,131,0,76,26,152,149,161,24,74,154,193,166,145,32,27,161,164,176,135,152,24,193, + 162,146,164,58,227,193,148,161,128,18,234,130,180,145,2,200,1,163,186,98,184,129,149,153,49,42,186,151,242,129,1,43,8,177,212,165,8,40,137,24,8,144,90,9,25,48,44,46,24,138,40,144,108,58,27,128,181,128,80,29,42,152,162,130,25,106,136,11,148,8,144,128,136, + 112,139,80,153,24,136,129,46,0,60,129,208,1,3,13,57,168,144,1,242,17,9,26,2,185,27,55,140,73,137,179,16,192,3,145,143,33,9,171,135,160,17,137,10,151,168,3,178,44,17,208,144,167,0,40,155,16,167,152,18,144,26,160,199,1,136,91,136,160,178,150,161,1,10, 181, + 145,161,1,145,161,198,2,9,90,137,177,160,150,40,29,129,144,145,162,57,77,169,16,148,42,42,40,141,34,170,121,154,210,131,162,107,8,9,160,195,40,73,139,18,224,162,34,139,0,244,178,163,24,26,146,194,166,49,29,42,137,130,192,16,93,128,154,19,59, 11, 122, 11, + 146,177,120,42,26,43,164,152,17,60,63,137,128,48,10,58,92,9,59,91,75,139,32,25,25,61,74,28,177,40,130,74,29,73,168,130,128,48,14,8,77,9,25,26,179,211,32,78,26,41,152,161,180,89,59,9,153,166,160,3,26,57,106,154,88,184,40,1,27,58,73,143,131,169,3,161, 184, + 122,152,16,181,145,129,17,15,129,193,147,145,192,33,193,162,183,163,136,178,129,178,197,2,41,216,131,168,163,181,226,163,178,1,33,187,166,212,129,1,27,24,162,184,151,8,16,160,144,181,210,72,168,128,32,42,25,40,142,5,185,88,58,11,58,177,32,129,63,42, 136, + 186,53,29,75,58,144,144,129,77,128,11,144,133,29,40,152,24,161,129,80,155,60,3,12,89,8,60,152,152,49,136,47,57,224,129,16,41,90,139,162,147,170,51,169,27,17,95,26,26,160,5,139,48,76,10,228,146,1,136,44,161,147,209,130,137,73,224,1,162,195,32,210,177,180, + 179,148,145,154,132,242,146,1,152,32,192,1,144,155,7,177,168,5,138,178,148,152,150,136,89,152,9,41,196,145,40,28,16,8,10,178,167,24,1,44,123,137,136,145,194,48,27,74,26,192,179,135,136,88,27,10,177,163,164,128,73,24,31,8,0,192,149,144,129,9,106, 41, 200, + 161,151,41,138,0,24,226,162,49,42,11,90,136,136,152,17,145,10,63,40,11,56,245,162,16,26,73,11,144,135,137,58,106,10,25,8,57,137,28,33,129,156,113,10,10,161,18,8,153,77,3,217,0,1,242,128,193,18,128,75,60,178,154,37,45,58,29,144,1,184,66,41,29, 8, 145, 10, + 194,33,148,170,107,89,139,128,163,178,16,63,59,176,144,151,129,42,74,10,129,192,2,128,154,97,192,0,177,128,178,183,16,16,155,149,145,184,84,138,8,192,161,20,225,0,130,138,165,0,28,148,153,18,209,128,88,153,89,152,9,17,9,29,130,43,122,153,24, 32, 202, 49, + 24,43,106,154,130,193,27,51,29,28,133,138,65,11,123,25,10,40,152,44,130,26,43,148,45,73,140,33,8,153,88,128,61,144,42,59,225,128,18,155,50,75,186,20,202,120,144,42,92,176,162,165,25,2,169,152,135,185,19,152,8,146,160,123,195,137,132,209,0,16, 11, 2, 242, + 146,164,152,73,193,136,130,178,1,136,169,23,169,128,164,242,129,178,129,32,138,180,167,153,132,8,138,2,209,4,138,1,128,138,92,136,44,129,136,162,33,63,40,141,2,160,144,106,137,64,155,17,129,60,30,146,26,17,28,48,46,169,51,154,91,137,41,26,32,143,18, 138, + 1,32,28,123,177,9,181,195,56,57,14,145,161,17,17,31,41,152,145,194,194,20,153,41,9,243,129,180,0,128,45,16,43,170,135,144,16,25,42,137,242,163,194,16,0,57,14,130,194,178,16,33,30,8,59,211,163,160,5,137,44,10,17,170,3,120,9,44,146,136,131,140, 91, 9, 171, + 7,161,32,73,13,8,161,40,106,11,25,129,59,0,49,31,42,28,40,11,0,81,176,61,32,138,25,178,241,148,136,106,8,136,128,177,90,8,155,96,176,9,18,217,132,129,10,81,156,40,178,161,36,169,76,147,203,150,0,10,146,200,147,149,128,144,148,154,182,24,0,137,11,134,211, + 24,136,129,145,209,33,8,43,163,243,88,41,13,0,160,145,33,31,32,185,145,4,155,17,32,47,161,128,73,160,44,56,176,75,74,12,35,141,104,137,9,89,152,58,56,44,41,30,41,40,157,48,128,154,88,41,42,8,14,3,184,59,120,152,9,56,10,128,41,57,227,186,52,152,62, 8, 56, + 242,0,58,8,156,34,243,128,24,176,51,169,58,183,192,146,164,177,18,170,7,177,208,132,161,24,136,27,147,243,128,133,10,24,161,161,178,214,17,160,25,16,161,137,165,192,48,27,72,58,218,133,162,26,72,27,10,197,178,49,138,89,56,142,1,24,11,0,44,105, 10, 25, 0, + 194,9,3,47,8,138,147,18,28,48,202,147,199,146,25,161,0,145,194,163,57,11,146,248,130,32,57,63,154,16,48,14,128,144,209,133,26,56,154,182,162,195,18,152,44,194,180,168,5,24,137,138,35,192,232,66,176,161,24,41,26,244,129,163,160,75,129,226,147,40, 145, 61, + 13,130,177,17,137,112,170,130,0,136,75,152,177,241,34,0,59,156,51,186,178,91,132,137,137,122,1,45,28,50,172,57,108,8,26,136,32,152,46,144,131,171,4,152,18,141,148,1,216,32,9,60,169,66,152,128,72,90,201,1,17,201,136,3,195,26,73,133,200,176, 150, 146, 169, + 24,33,178,184,151,73,11,28,72,44,153,82,153,17,42,57,78,153,8,160,0,1,123,11,19,171,195,18,59,31,129,10,162,2,58,96,142,130,26,75,128,176,17,180,123,9,90,137,211,145,32,26,76,43,145,130,12,90,41,27,58,160,160,128,178,7,76,59,0,203,180,147,33,62,10,0,243, + 129,146,73,29,145,144,0,26,56,153,185,83,8,76,27,166,161,193,146,131,224,145,165,161,40,168,149,162,226,2,136,138,163,131,211,0,59,146,218,148,1,192,16,16,58,248,88,144,177,136,1,58,45,9,195,197,147,48,29,10,0,162,176,64,122,9,10,17,9,153,56, 75, 27, 31, + 72,136,9,129,129,61,45,59,10,161,18,122,43,59,41,169,34,155,130,131,219,120,162,27,49,208,160,131,156,66,12,145,50,240,16,136,12,162,40,129,130,15,129,162,146,180,83,139,58,217,129,177,4,0,169,197,163,144,242,131,168,179,179,17,197,145,178,164, 128, 160, + 211,2,244,163,145,162,129,212,177,163,17,208,163,195,180,57,24,170,182,164,129,0,60,60,169,149,162,177,122,26,24,136,136,133,43,27,178,56,77,24,128,240,0,2,44,46,8,128,193,146,64,27,42,16,193,25,0,192,148,11,52,47,153,147,243,0,24,73,28,144, 161, 150, 9, + 8,73,170,2,162,25,27,147,167,131,29,1,168,200,165,16,91,137,8,162,176,35,41,31,24,169,50,168,58,123,144,48,128,13,73,169,144,16,57,123,44,200,163,56,153,80,10,176,146,57,94,8,152,131,9,168,125,26,145,177,132,137,41,60,26,144,243,32,192,34,60, 43, 26, 16, + 249,164,16,58,61,11,130,243,146,2,42,44,27,128,165,137,49,45,28,16,43,8,211,48,28,152,105,9,9,163,161,169,35,107,42,232,164,130,168,72,42,168,210,148,144,136,129,3,217,194,50,27,192,41,210,147,40,76,226,1,161,1,155,132,145,147,171,67,173,210,132,161,106, + 137,56,169,209,131,64,13,129,9,194,17,57,61,169,17,128,40,31,16,10,162,57,61,75,139,40,242,17,58,59,138,179,144,50,105,140,179,243,57,40,26,9,243,130,24,29,57,128,210,129,25,59,91,137,162,178,72,27,181,168,19,129,8,184,231,147,178,32,28,184,198,148, 144, + 1,26,128,16,192,2,26,144,244,129,0,16,10,197,177,181,1,41,9,178,165,211,129,25,145,137,210,147,152,210,163,132,194,17,91,169,145,181,130,9,89,137,152,178,4,128,9,63,160,128,106,8,25,43,10,32,47,26,123,152,24,40,25,27,18,186,35,158,64,42,216,33,25,58, 58, + 45,184,147,29,72,46,9,0,178,146,58,77,26,25,209,165,128,145,17,153,128,129,148,240,129,1,40,31,0,152,242,163,16,59,44,24,243,146,128,1,26,26,179,213,145,130,176,131,40,25,145,219,179,167,8,33,59,14,176,166,16,136,74,128,176,128,149,8,8,209,148,152,0, 72, + 153,161,178,35,62,75,154,163,153,19,62,170,133,179,136,89,12,129,164,144,3,47,58,193,177,148,0,61,43,10,129,17,41,61,43,25,8,126,26,25,137,145,34,44,45,129,216,179,1,90,25,137,32,227,8,16,9,170,49,31,32,29,128,145,148,75,25,75,153,162,192,35,12, 80, 136, + 176,8,194,24,1,176,21,154,145,80,251,130,2,30,9,8,130,145,128,98,27,26,129,136,162,15,33,168,59,65,177,77,141,1,128,168,113,10,137,178,163,146,132,74,153,224,164,33,184,19,184,228,161,17,91,152,25,146,152,44,121,9,160,145,17,25,28,93,128,152,2,25,27,161, + 210,129,146,45,179,227,163,162,9,40,193,148,179,57,107,140,196,32,25,57,47,136,210,130,24,40,28,152,210,182,145,40,8,129,184,147,147,140,163,166,160,34,45,144,194,161,134,41,46,152,162,162,3,44,58,75,209,162,144,57,129,47,152,130,59,16,248,129,17,26, 57, + 9,29,167,2,60,42,138,136,209,130,90,42,42,176,146,178,120,28,8,160,145,16,33,31,1,8,160,129,128,242,164,32,152,177,146,213,196,128,40,26,160,163,180,146,108,60,144,144,136,147,137,40,90,161,3,17,219,243,33,184,130,60,136,243,178,179,132,26,8,168,212,147, + 16,57,42,31,145,145,160,32,43,184,66,45,180,33,140,226,1,91,152,16,144,193,162,48,77,25,137,153,17,178,78,0,0,16,14,90,152,153,19,129,13,123,137,129,160,1,73,44,9,129,0,153,120,10,9,162,195,32,139,28,151,161,2,128,26,45,193,146,48,29,146,153, 194, 5, 59, + 29,128,144,195,1,64,43,208,178,149,8,9,16,240,163,129,16,42,185,181,211,24,48,45,137,149,9,24,41,75,184,177,4,43,91,128,180,16,144,29,25,184,167,1,59,60,153,148,161,146,91,42,186,4,24,145,123,11,2,178,77,136,26,25,195,40,115,61,27,168,177,3,59,79,26, 25, + 144,1,48,13,56,154,248,1,16,9,129,8,2,178,31,130,153,162,20,15,33,170,56,40,29,28,128,152,149,144,56,120,11,162,212,129,144,145,59,180,243,147,145,144,16,152,48,241,0,161,176,1,134,10,129,200,166,144,128,121,26,24,177,178,196,48,75,138,41,180,195,26, 24, + 89,138,24,33,187,41,84,155,57,79,136,160,210,130,0,58,58,168,243,132,27,41,75,138,3,8,61,8,29,145,179,76,24,28,146,208,2,49,140,75,196,144,0,40,44,179,208,3,176,33,15,177,2,160,106,8,160,164,164,8,73,27,226,179,161,1,57,1,196,211,128,40,156,145,166, 178, + 131,29,128,145,162,165,40,27,216,146,135,144,40,160,194,177,145,20,139,200,151,178,17,136,40,25,205,130,17,11,17,129,156,38,26,25,137,179,163,11,79,16,12,146,147,143,89,25,136,136,25,48,26,46,129,40,29,42,29,8,145,2,56,27,62,8,25,212,161,48,43, 144, 129, + 29,145,144,41,106,10,107,43,184,131,1,36,61,13,138,2,194,1,16,27,75,186,181,151,8,1,161,138,211,129,2,59,248,129,16,0,144,63,152,150,136,24,25,128,30,161,128,17,24,225,146,10,16,0,9,227,183,129,40,60,26,162,194,181,24,90,9,24,0,176,161,193,194,35,12, 63, + 8,210,162,1,32,78,28,152,164,144,16,48,45,137,162,147,168,152,98,27,43,33,12,160,165,129,137,63,41,153,153,151,16,91,26,8,8,9,56,10,46,24,146,57,168,160,166,241,129,32,140,16,145,179,164,137,113,138,208,131,26,25,1,42,178,196,106,24,171,18,196,8, 18, 29, + 41,194,128,3,249,57,162,152,48,184,120,160,208,33,137,74,57,187,149,129,26,35,158,72,128,168,32,26,25,180,75,2,136,15,163,161,136,120,27,41,160,128,182,56,60,25,12,178,151,128,168,72,10,152,4,177,26,147,137,113,44,42,33,220,2,152,41,82,11, 210, 163, 184, + 133,162,10,196,128,3,234,40,149,152,161,1,44,129,194,4,225,16,58,168,24,194,146,146,154,49,21,218,33,152,248,129,194,147,0,28,1,195,162,20,140,42,25,160,198,1,33,136,142,3,25,24,141,16,177,208,112,0,138,41,160,130,45,60,32,170,73,24,75,59,161,176,49,159, + 97,26,168,149,145,32,28,25,184,211,129,179,74,73,8,153,136,193,151,160,32,48,143,9,147,181,145,32,60,9,187,133,166,144,32,152,25,136,161,150,168,145,81,10,42,0,169,182,148,136,58,41,187,182,211,131,16,137,25,243,144,129,2,9,8,202,7,25,185,21,144,136,153, + 65,184,137,56,151,10,153,49,16,145,14,56,176,11,192,19,89,91,44,168,147,2,8,147,63,27,1,136,229,129,73,26,136,26,137,81,170,147,77,72,12,42,42,192,24,104,91,26,27,65,177,27,32,41,60,14,136,17,170,150,129,24,58,11,16,251,162,19,57,31,0,152,129,145,17, 61, + 14,1,129,27,129,66,169,178,74,12,11,19,198,145,75,33,138,174,133,1,184,57,40,136,169,20,1,60,174,20,154,201,67,26,162,151,42,16,138,59,130,204,20,169,59,180,59,114,184,56,178,242,128,130,43,8,194,3,229,144,33,185,144,34,181,145,168,17,149,153,74,35, 220, + 129,128,1,88,59,75,225,136,130,168,17,144,12,151,8,25,179,8,1,240,16,8,25,145,211,41,130,138,115,169,160,163,168,84,154,74,0,170,144,211,149,2,30,128,137,9,149,1,144,58,60,57,153,178,150,17,29,27,74,25,195,152,56,15,1,25,26,152,149,80,153,57,73,140, 128, + 160,144,113,27,56,28,25,4,42,44,137,60,171,130,50,240,8,5,139,145,1,105,137,200,80,137,145,146,178,179,160,46,16,240,195,131,128,144,24,164,198,128,0,136,137,131,194,165,177,2,161,147,11,144,188,181,148,144,23,0,28,224,128,131,192,32,1,224,1,168,132,145, + 9,41,208,58,137,179,151,145,16,1,30,8,145,178,1,47,32,186,72,169,146,75,8,41,48,136,89,13,48,9,10,124,26,11,42,32,129,91,77,16,12,128,42,57,138,10,60,2,63,9,0,93,128,152,90,8,10,24,40,44,144,29,49,188,48,72,25,30,177,33,128,186,120,129,186,133, 152, 130, + 24,156,51,154,8,226,2,56,155,2,179,233,167,128,24,129,176,136,151,8,184,0,33,224,152,21,177,24,10,163,16,250,17,130,171,83,137,136,37,12,56,242,154,17,160,145,82,13,3,201,128,18,137,24,162,63,162,8,107,178,128,57,158,32,24,200,18,0,106,154,73,16, 248, 8, + 73,137,57,75,0,128,12,65,137,59,75,28,144,129,122,0,58,140,160,195,145,105,56,28,153,145,164,88,8,28,25,153,9,162,113,89,153,136,33,234,147,128,41,72,11,138,151,144,145,16,43,58,248,130,178,42,4,40,10,196,154,147,216,24,7,136,10,161,148,210,161, 98, 138, + 137,128,146,176,33,105,27,43,163,49,185,6,10,136,43,67,174,161,162,151,137,1,64,200,193,24,64,200,56,145,242,24,57,137,1,128,3,162,175,80,128,162,152,25,58,175,17,17,0,200,64,168,162,91,1,154,44,211,177,35,64,160,161,144,4,241,41,209,162,25,1,3,242, 176, + 134,153,42,41,136,135,154,2,130,46,41,161,153,180,145,34,26,46,18,242,137,146,129,25,128,11,151,161,40,179,27,122,168,59,137,181,50,172,36,56,15,9,129,137,128,75,2,58,12,52,141,8,24,58,153,157,122,145,9,1,80,27,184,32,74,219,50,57,168,153,180,48,28, 143, + 131,144,178,65,13,48,168,162,147,155,121,9,170,5,16,153,21,29,144,161,91,0,184,57,128,137,17,159,88,178,128,105,152,9,162,33,164,141,88,178,224,1,0,16,27,185,150,161,9,4,139,16,128,160,194,144,65,180,46,40,136,27,135,160,16,44,57,145,236,2,195,40,75,177, + 2,200,179,146,186,104,50,141,24,169,165,148,11,97,10,11,130,177,49,57,78,42,154,128,165,59,33,28,30,1,136,16,192,41,128,152,123,136,24,1,169,113,10,11,49,153,14,147,19,45,43,8,176,210,148,8,16,11,96,144,192,163,150,10,128,43,26,150,178,165,24,41,171, 18, + 27,215,1,8,128,136,40,35,208,11,161,193,18,73,154,133,155,165,164,10,49,154,8,199,0,2,168,64,192,0,40,162,43,202,180,150,10,106,24,185,145,131,184,113,43,24,162,187,73,146,42,81,171,121,58,155,151,16,43,32,31,9,160,146,17,136,94,10,24,145,25, 9, 130, 59, + 65,13,91,25,169,146,176,112,42,59,16,217,130,20,13,25,9,40,161,138,68,169,154,18,62,154,180,145,135,152,56,58,155,165,211,8,40,42,10,198,1,2,184,57,184,224,51,154,27,134,168,19,202,73,75,184,35,176,75,24,25,209,51,157,19,30,184,179,3,33,148,45, 232, 146, + 129,168,41,32,170,149,193,35,136,16,50,191,56,146,173,149,16,24,41,30,129,168,209,3,57,31,0,16,176,147,41,152,10,17,181,14,40,144,49,170,75,97,141,25,162,146,72,177,92,137,137,19,137,153,113,154,2,41,60,129,217,2,211,152,73,42,193,197,146,147, 10, 59, 0, + 192,196,132,41,160,25,88,169,16,40,241,1,153,81,28,10,147,161,209,88,75,9,161,162,180,16,43,57,235,33,56,156,129,144,2,135,31,128,145,136,163,56,59,154,57,167,160,105,137,0,138,163,3,41,47,185,211,131,41,41,60,139,182,146,16,16,43,242,144,145,129,16,179, + 183,1,26,9,147,240,131,160,91,74,152,184,166,178,33,140,9,4,162,233,34,136,129,144,163,60,142,144,149,128,33,73,13,161,194,131,0,26,56,142,128,163,128,1,233,56,209,41,145,194,147,179,149,64,30,8,128,216,18,24,43,43,32,153,25,74,109,137,153,48,8,137, 122, + 25,144,26,43,59,30,33,41,27,24,96,153,160,50,76,27,47,152,145,163,73,40,14,152,131,176,74,90,8,8,200,67,155,154,50,49,155,28,124,177,152,1,2,17,62,138,180,176,4,25,9,177,245,162,129,40,25,176,164,130,172,4,8,181,194,49,11,168,154,165,133,152,40,136, 226, + 179,19,26,185,16,167,194,16,25,57,243,136,147,1,31,25,184,132,160,33,62,138,129,130,41,121,137,153,145,26,17,107,136,179,1,61,60,26,162,168,148,64,31,25,32,168,152,64,31,137,8,129,33,62,24,137,8,16,59,47,153,33,162,91,59,41,170,145,5,43,60,41,13,178,134, + 57,153,12,194,227,8,2,128,57,208,162,19,216,32,178,25,128,160,48,194,195,37,155,10,33,251,163,146,16,136,12,166,195,160,148,129,176,147,178,150,160,72,162,162,193,162,60,200,145,5,144,25,122,216,129,161,130,0,10,73,1,241,2,9,168,33,13,161,165,24,64, 203, + 50,1,14,9,9,129,161,106,33,27,13,164,128,40,41,107,169,160,33,136,60,92,168,152,2,91,57,176,129,0,144,47,136,162,164,128,80,43,154,179,213,130,74,27,0,145,145,167,58,59,160,9,26,76,8,171,5,49,28,44,169,162,183,130,72,28,144,179,228,2,25,26,129, 186, 151, + 1,75,128,169,17,178,15,57,170,16,166,16,57,8,139,162,181,1,8,152,164,181,41,81,43,10,242,145,57,139,89,8,193,18,154,32,176,10,165,129,137,147,177,134,0,25,25,201,147,227,129,72,59,185,167,128,129,160,91,25,176,130,147,145,9,160,5,202,17,16, 186, 136, 37, + 177,56,76,42,169,186,48,9,145,57,24,128,41,169,134,137,145,147,28,41,168,131,228,32,27,9,60,129,178,64,60,45,25,9,24,152,49,31,136,57,42,0,25,12,181,18,153,57,96,169,177,132,153,123,9,152,129,177,17,74,43,24,169,128,121,137,25,1,139,96,42,10,146,178, 18, + 44,29,1,161,164,146,31,137,146,177,19,1,10,26,209,165,146,43,40,138,240,130,18,144,25,40,212,1,58,11,152,196,147,10,74,26,152,225,130,146,58,60,210,145,16,148,16,185,192,18,44,42,57,199,162,1,9,87,47,186,215,231,197,179,180,195,212,164,32,59,92, 126, 62, + 41,59,76,59,60,168,179,213,197,163,72,44,25,74,126,127,127,79,26,177,148,90,27,225,247,165,0,152,147,123,138,211,164,72,126,127,46,210,196,163,228,215,64,11,210,180,1,8,58,153,1,224,149,57,76,27,24,76,42,43,136,128,243,179,130,106,60,42,42,92,28,243,231, + 147,24,57,44,58,94,45,8,57,139,214,148,40,77,26,9,16,10,144,64,62,43,25,123,59,138,162,48,63,26,41,92,60,43,176,3,59,232,214,164,16,75,75,76,60,153,179,33,62,26,136,40,75,169,197,163,129,57,60,59,75,138,145,64,63,138,179,1,42,136,90,43,176,214,180,1, 25, + 152,195,129,129,106,76,60,137,145,178,2,25,10,228,130,57,59,44,41,154,165,105,76,44,144,16,76,26,41,76,26,152,1,58,26,9,193,165,16,92,26,41,77,59,76,76,60,26,136,161,130,152,195,163,211,146,0,57,11,211,130,8,25,40,62,153,162,17,109,60,153,146,40, 76, 60, + 26,160,179,211,163,32,60,42,153,179,194,199,130,24,58,43,58,27,128,161,195,129,226,196,147,90,59,75,44,136,128,145,160,148,123,59,42,26,41,26,57,27,192,215,147,57,59,27,161,145,213,130,106,76,43,9,144,162,129,177,181,130,136,194,146,40,10,129,25,210,146, + 178,197,196,179,196,130,8,41,9,144,178,130,209,182,17,92,43,176,147,144,212,130,136,0,177,130,73,62,10,161,130,91,75,59,43,57,46,25,41,77,10,177,164,16,26,136,210,197,179,130,128,57,77,43,25,75,10,227,179,180,179,146,128,57,185,183,163,145,0,8,8,10, 119, + 114,120,16,210,244,60,28,41,25,152,149,56,161,35,44,89,27,24,136,24,164,211,17,233,176,136,192,129,179,17,17,25,0,10,46,160,132,49,66,24,132,177,147,193,56,72,26,29,232,168,176,12,137,41,139,147,9,1,41,15,91,136,35,148,21,18,48,40,1,168,167,144,0,42,172, + 177,204,193,155,232,152,152,26,152,41,146,17,6,4,65,34,35,135,4,16,32,9,24,186,176,0,250,153,204,186,173,154,153,177,3,65,41,34,145,134,35,65,98,49,50,50,2,33,169,138,155,175,170,172,204,192,138,234,136,155,136,10,32,18,5,52,48,24,162,17,67,54,66,51, 34, + 131,184,174,234,153,10,9,40,0,152,251,168,142,154,9,16,33,49,33,128,154,170,156,34,54,54,33,68,0,1,136,201,137,26,88,48,35,99,8,152,189,189,187,155,171,16,24,130,145,188,175,203,144,49,115,67,67,50,19,2,1,0,0,130,131,1,136,206,216,188,203, 204, 187, 187, + 156,153,0,0,51,17,34,24,112,20,69,67,67,34,19,0,136,169,185,137,186,232,185,219,201,203,187,173,170,154,153,129,131,6,2,19,49,49,21,65,19,53,51,83,34,16,168,201,154,172,156,138,0,1,24,201,233,186,204,186,171,137,3,37,48,24,128,201,202,202,129,17, 48, 21, + 22,20,19,19,32,16,2,66,52,68,4,3,1,203,235,188,189,186,171,153,137,153,170,219,170,140,9,17,53,115,50,52,67,51,51,51,17,130,0,145,154,169,188,236,187,190,203,187,172,171,138,136,17,33,18,2,34,98,98,50,50,52,66,34,35,2,19,24,169,203,203,188,219, 169, 154, + 9,137,171,204,188,203,184,136,34,83,50,33,153,184,170,170,152,40,57,19,36,50,50,18,35,17,2,49,49,66,66,66,34,17,168,233,202,202,170,171,170,186,219,203,188,188,154,138,25,33,68,52,68,67,67,36,51,36,18,17,17,136,8,170,176,202,188,206,202,171,172,186, 169, + 153,8,25,144,128,1,34,68,52,68,51,52,34,49,18,34,2,144,136,155,140,187,186,186,154,154,185,185,153,9,9,0,24,0,128,144,168,169,170,154,154,153,9,8,16,8,0,144,19,35,68,51,52,67,51,66,34,50,33,1,144,185,186,172,204,187,188,173,172,186,172,186, 154, 138, 41, + 33,52,53,83,50,51,52,52,37,34,34,18,16,144,152,154,187,219,203,188,173,186,186,186,170,154,153,138,144,16,17,67,82,50,51,21,34,19,33,2,18,33,1,8,153,169,153,153,136,128,0,136,154,153,153,8,8,1,16,0,169,170,187,171,171,154,153,153,152,153,153,0,16,51, 83, + 66,50,67,50,51,67,51,52,35,18,136,186,219,187,189,186,171,187,173,187,188,187,203,138,9,16,33,50,52,53,67,67,147,8,128,128,128,128,128,128,128,128,0,240,255,55,232,23,220,0,148,1,9,18,148,10,189,32,163,62,160,5,137,12,149,42,153,144,34,42,8, 1, 138, 181, + 45,136,18,144,105,138,1,160,14,128,132,145,186,37,138,41,192,48,145,46,160,33,44,24,225,16,13,132,136,137,16,148,25,170,194,82,152,136,91,24,42,169,33,233,131,179,24,185,149,16,57,172,164,18,10,211,160,147,211,33,138,243,129,16,41,193,0,43, 132, 155, 73, + 58,145,244,145,43,35,9,171,16,110,25,8,28,74,162,128,26,27,82,45,136,153,18,8,136,8 +}; diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h new file mode 100644 index 0000000000..1f9d610d9d --- /dev/null +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -0,0 +1,171 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef TOWNS_PC98_FMSYNTH_H +#define TOWNS_PC98_FMSYNTH_H + +#include "sound/audiostream.h" +#include "sound/mixer.h" +#include "common/list.h" + +class TownsPC98_FmSynthOperator; +class TownsPC98_FmSynthSquareSineSource; +class TownsPC98_FmSynthPercussionSource; + +enum EnvelopeState { + kEnvReady, + kEnvAttacking, + kEnvDecaying, + kEnvSustaining, + kEnvReleasing +}; + +class TownsPC98_FmSynth : public Audio::AudioStream { +public: + enum EmuType { + kTypeTowns, + kType26, + kType86 + }; + + TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type); + virtual ~TownsPC98_FmSynth(); + + virtual bool init(); + virtual void reset(); + + void writeReg(uint8 part, uint8 regAddress, uint8 value); + + // AudioStream interface + int readBuffer(int16 *buffer, const int numSamples); + bool isStereo() const { return true; } + bool endOfData() const { return false; } + int getRate() const { return _mixer->getOutputRate(); } + +protected: + // Implement this in your inherited class if your driver generates + // additional output that has to be inserted into the buffer. + virtual void nextTickEx(int32 *buffer, uint32 bufferSize) {} + + void toggleRegProtection(bool prot) { _regProtectionFlag = prot; } + uint8 readSSGStatus(); + + virtual void timerCallbackA() = 0; + virtual void timerCallbackB() = 0; + + // The audio driver can store and apply two different audio settings + // (usually for music and sound effects). The channel mask will determine + // which channels get effected by the setting. The first bits will be + // the normal fm channels, the next bits the ssg channels and the final + // bit the rhythm channel. + void setVolumeIntern(int volA, int volB); + void setVolumeChannelMasks(int channelMaskA, int channelMaskB); + + const int _numChan; + const int _numSSG; + const bool _hasPercussion; + + Common::Mutex _mutex; +private: + void generateTables(); + void nextTick(int32 *buffer, uint32 bufferSize); + void generateOutput(int32 &leftSample, int32 &rightSample, int32 *del, int32 *feed); + + struct ChanInternal { + ChanInternal() { + memset(this, 0, sizeof(ChanInternal)); + } + + ~ChanInternal() { + for (uint i = 0; i < ARRAYSIZE(opr); ++i) + delete opr[i]; + } + + void ampModSensitivity(uint32 value) { ampModSvty = (1 << (3 - value)) - (((value >> 1) & 1) | (value & 1)); } + void frqModSensitivity(uint32 value) { frqModSvty = value << 5; } + + uint16 frqTemp; + bool enableLeft; + bool enableRight; + bool updateEnvelopeParameters; + int32 feedbuf[3]; + uint8 algorithm; + + uint32 ampModSvty; + uint32 frqModSvty; + + + TownsPC98_FmSynthOperator *opr[4]; + }; + + TownsPC98_FmSynthSquareSineSource *_ssg; + TownsPC98_FmSynthPercussionSource *_prc; + ChanInternal *_chanInternal; + + uint8 *_oprRates; + uint8 *_oprRateshift; + uint8 *_oprAttackDecay; + uint32 *_oprFrq; + uint32 *_oprSinTbl; + int32 *_oprLevelOut; + int32 *_oprDetune; + + bool _regProtectionFlag; + + typedef void (TownsPC98_FmSynth::*ChipTimerProc)(); + + struct ChipTimer { + bool enabled; + uint16 value; + + int32 smpTillCb; + uint32 smpTillCbRem; + int32 smpPerCb; + uint32 smpPerCbRem; + + ChipTimerProc cb; + }; + + ChipTimer _timers[2]; + + int _volMaskA, _volMaskB; + uint16 _volumeA, _volumeB; + + const float _baserate; + uint32 _timerbase; + + Audio::Mixer *_mixer; + Audio::SoundHandle _soundHandle; + + static const uint8 _percussionData[]; + static const uint32 _adtStat[]; + static const uint8 _detSrc[]; + static const int _ssgTables[]; + + bool _ready; +}; + +#endif + diff --git a/tools/create_kyradat/create_kyradat.cpp b/tools/create_kyradat/create_kyradat.cpp index c1bcbc006c..38fc60763e 100644 --- a/tools/create_kyradat/create_kyradat.cpp +++ b/tools/create_kyradat/create_kyradat.cpp @@ -45,7 +45,7 @@ #include enum { - kKyraDatVersion = 70 + kKyraDatVersion = 71 }; const ExtractFilename extractFilenames[] = { @@ -163,6 +163,7 @@ const ExtractFilename extractFilenames[] = { { k1CreditsStrings, kTypeRawData, true }, // FM-TOWNS specific + { k1TownsMusicFadeTable, k3TypeRaw16to8, false }, { k1TownsSFXwdTable, kTypeTownsWDSfxTable, false }, { k1TownsSFXbtTable, kTypeRawData, false }, { k1TownsCDATable, kTypeRawData, false }, @@ -898,6 +899,8 @@ const char *getIdString(const int id) { return "k1GUIStrings"; case k1ConfigStrings: return "k1ConfigStrings"; + case k1TownsMusicFadeTable: + return "k1TownsMusicFadeTable"; case k1TownsSFXwdTable: return "k1TownsSFXwdTable"; case k1TownsSFXbtTable: diff --git a/tools/create_kyradat/create_kyradat.h b/tools/create_kyradat/create_kyradat.h index 435e239381..25a950935b 100644 --- a/tools/create_kyradat/create_kyradat.h +++ b/tools/create_kyradat/create_kyradat.h @@ -138,6 +138,8 @@ enum kExtractID { k1CreditsStrings, + k1TownsMusicFadeTable, + k1TownsMusicFadeTable, k1TownsSFXwdTable, k1TownsSFXbtTable, k1TownsCDATable, diff --git a/tools/create_kyradat/games.cpp b/tools/create_kyradat/games.cpp index 9976451067..1bd7d31648 100644 --- a/tools/create_kyradat/games.cpp +++ b/tools/create_kyradat/games.cpp @@ -411,6 +411,8 @@ const int kyra1TownsNeed[] = { k1NewGameString, k1ConfigStrings, + k1TownsMusicFadeTable, + k1TownsMusicFadeTable, k1TownsSFXwdTable, k1TownsSFXbtTable, k1TownsCDATable, diff --git a/tools/create_kyradat/tables.cpp b/tools/create_kyradat/tables.cpp index a74f58e2c3..dc8163901d 100644 --- a/tools/create_kyradat/tables.cpp +++ b/tools/create_kyradat/tables.cpp @@ -968,6 +968,12 @@ const ExtractEntrySearchData k1ConfigStringsProvider[] = { EXTRACT_END_ENTRY }; +const ExtractEntrySearchData k1TownsMusicFadeTableProvider[] = { + { UNK_LANG, kPlatformFMTowns, { 0x00000B10, 0x000076DE, { { 0x9F, 0x08, 0x5B, 0xD6, 0x25, 0x7F, 0x11, 0x08, 0x87, 0x45, 0x92, 0xD3, 0xE5, 0xA8, 0x7C, 0x2F } } } }, + + EXTRACT_END_ENTRY +}; + const ExtractEntrySearchData k1TownsSFXwdTableProvider[] = { { UNK_LANG, kPlatformFMTowns, { 0x00012608, 0x006717A1, { { 0x34, 0xDD, 0x2D, 0xA5, 0x14, 0x05, 0xEE, 0x2F, 0x93, 0x7C, 0x78, 0x4D, 0xCA, 0x13, 0xED, 0x93 } } } }, @@ -1823,6 +1829,7 @@ const ExtractEntry extractProviders[] = { { k1SpecialPalette33, k1SpecialPalette33Provider }, { k1GUIStrings, k1GUIStringsProvider }, { k1ConfigStrings, k1ConfigStringsProvider }, + { k1TownsMusicFadeTable, k1TownsMusicFadeTableProvider }, { k1TownsSFXwdTable, k1TownsSFXwdTableProvider }, { k1TownsSFXbtTable, k1TownsSFXbtTableProvider }, { k1TownsCDATable, k1TownsCDATableProvider }, -- cgit v1.2.3 From bed1e3c164771f4108ebab3d5aaf688e29e8118f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 2 Aug 2010 18:30:37 +0000 Subject: SCI: Fix bug #3037401 - LB2Floppy: No SFX Laura Bow 2 floppy and Mixed-Up Mother Goose SCI1.1 use an 8-byte entry 0.map format to store their entries. svn-id: r51646 --- engines/sci/resource_audio.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 08e05f5ccd..2c7a63b363 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -235,6 +235,20 @@ void ResourceManager::removeAudioResource(ResourceId resId) { // w nEntry // tb offset (cumulative) +// QFG3 Demo 0.MAP structure: +// ========= +// 10-byte entries: +// w nEntry +// dw offset +// dw size + +// LB2 Floppy/Mother Goose SCI1.1 0.MAP structure: +// ========= +// 8-byte entries: +// w nEntry +// w 0xffff +// dw offset + // Early SCI1.1 MAP structure: // =============== // 10-byte entries: @@ -316,6 +330,31 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { uint32 size = READ_LE_UINT32(ptr); ptr += 4; + addResource(ResourceId(kResourceTypeAudio, n), src, offset, size); + } + } else if (map->_volumeNumber == 0 && entrySize == 8 && READ_LE_UINT16(ptr + 2) == 0xffff) { + // LB2 Floppy/Mother Goose SCI1.1 format + Common::SeekableReadStream *stream = getVolumeFile(src); + + while (ptr < mapRes->data + mapRes->size) { + uint16 n = READ_LE_UINT16(ptr); + ptr += 4; + + if (n == 0xffff) + break; + + offset = READ_LE_UINT32(ptr); + ptr += 4; + + // The size is not stored in the map and the entries have no order. + // We need to dig into the audio resource in the volume to get the size. + stream->seek(offset + 1); + byte headerSize = stream->readByte(); + assert(headerSize == 11 || headerSize == 12); + + stream->skip(5); + uint32 size = stream->readUint32LE() + headerSize + 2; + addResource(ResourceId(kResourceTypeAudio, n), src, offset, size); } } else { -- cgit v1.2.3 From d2019b9b8d2095c6a9ddd3114d282edfd6e9fcb4 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 18:37:37 +0000 Subject: KYRA: forgot to update Kyra.dat in last commit svn-id: r51647 --- dists/engine-data/kyra.dat | Bin 353834 -> 355277 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat index 3fba5780f4..ff21159362 100644 Binary files a/dists/engine-data/kyra.dat and b/dists/engine-data/kyra.dat differ -- cgit v1.2.3 From add6d6772ad6c2160bce854fc13694feb16e0d06 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 18:53:23 +0000 Subject: KYRA/TOWNS AUDIO: try to fix last regression svn-id: r51648 --- sound/softsynth/fmtowns_pc98/towns_pc98_driver.h | 5 ++ .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 67 --------------------- sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 68 +++++++++++++++++++++- 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h index f7d09df09d..a0dd870549 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h @@ -28,6 +28,11 @@ #include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" +class TownsPC98_MusicChannel; +class TownsPC98_MusicChannelSSG; +class TownsPC98_SfxChannel; +class TownsPC98_MusicChannelPCM; + class TownsPC98_AudioDriver : public TownsPC98_FmSynth { friend class TownsPC98_MusicChannel; friend class TownsPC98_MusicChannelSSG; diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 5436c8e0c7..7fb4519844 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -26,73 +26,6 @@ #include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" #include "common/endian.h" -class TownsPC98_FmSynthOperator { -public: - TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); - ~TownsPC98_FmSynthOperator() {} - - void keyOn(); - void keyOff(); - void frequency(int freq); - void updatePhaseIncrement(); - void recalculateRates(); - void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); - - void feedbackLevel(int32 level) {_feedbackLevel = level ? level + 6 : 0; } - void detune(int value) { _detn = &_detnTbl[value << 5]; } - void multiple(uint32 value) { _multiple = value ? (value << 1) : 1; } - void attackRate(uint32 value) { _specifiedAttackRate = value; } - bool scaleRate(uint8 value); - void decayRate(uint32 value) { _specifiedDecayRate = value; recalculateRates(); } - void sustainRate(uint32 value) { _specifiedSustainRate = value; recalculateRates(); } - void sustainLevel(uint32 value) { _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; } - void releaseRate(uint32 value) { _specifiedReleaseRate = value; recalculateRates(); } - void totalLevel(uint32 value) { _totalLevel = value << 3; } - void ampModulation(bool enable) { _ampMod = enable; } - void reset(); - -protected: - EnvelopeState _state; - bool _playing; - uint32 _feedbackLevel; - uint32 _multiple; - uint32 _totalLevel; - uint8 _keyScale1; - uint8 _keyScale2; - uint32 _specifiedAttackRate; - uint32 _specifiedDecayRate; - uint32 _specifiedSustainRate; - uint32 _specifiedReleaseRate; - uint32 _tickCount; - uint32 _sustainLevel; - - bool _ampMod; - uint32 _frequency; - uint8 _kcode; - uint32 _phase; - uint32 _phaseIncrement; - const int32 *_detn; - - const uint8 *_rateTbl; - const uint8 *_rshiftTbl; - const uint8 *_adTbl; - const uint32 *_fTbl; - const uint32 *_sinTbl; - const int32 *_tLvlTbl; - const int32 *_detnTbl; - - const uint32 _tickLength; - uint32 _timer; - int32 _currentLevel; - - struct EvpState { - uint8 rate; - uint8 shift; - } fs_a, fs_d, fs_s, fs_r; -}; - TownsPC98_FmSynthOperator::TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 1f9d610d9d..7ef9880f83 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -30,7 +30,6 @@ #include "sound/mixer.h" #include "common/list.h" -class TownsPC98_FmSynthOperator; class TownsPC98_FmSynthSquareSineSource; class TownsPC98_FmSynthPercussionSource; @@ -42,6 +41,73 @@ enum EnvelopeState { kEnvReleasing }; +class TownsPC98_FmSynthOperator { +public: + TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); + ~TownsPC98_FmSynthOperator() {} + + void keyOn(); + void keyOff(); + void frequency(int freq); + void updatePhaseIncrement(); + void recalculateRates(); + void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); + + void feedbackLevel(int32 level) {_feedbackLevel = level ? level + 6 : 0; } + void detune(int value) { _detn = &_detnTbl[value << 5]; } + void multiple(uint32 value) { _multiple = value ? (value << 1) : 1; } + void attackRate(uint32 value) { _specifiedAttackRate = value; } + bool scaleRate(uint8 value); + void decayRate(uint32 value) { _specifiedDecayRate = value; recalculateRates(); } + void sustainRate(uint32 value) { _specifiedSustainRate = value; recalculateRates(); } + void sustainLevel(uint32 value) { _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; } + void releaseRate(uint32 value) { _specifiedReleaseRate = value; recalculateRates(); } + void totalLevel(uint32 value) { _totalLevel = value << 3; } + void ampModulation(bool enable) { _ampMod = enable; } + void reset(); + +protected: + EnvelopeState _state; + bool _playing; + uint32 _feedbackLevel; + uint32 _multiple; + uint32 _totalLevel; + uint8 _keyScale1; + uint8 _keyScale2; + uint32 _specifiedAttackRate; + uint32 _specifiedDecayRate; + uint32 _specifiedSustainRate; + uint32 _specifiedReleaseRate; + uint32 _tickCount; + uint32 _sustainLevel; + + bool _ampMod; + uint32 _frequency; + uint8 _kcode; + uint32 _phase; + uint32 _phaseIncrement; + const int32 *_detn; + + const uint8 *_rateTbl; + const uint8 *_rshiftTbl; + const uint8 *_adTbl; + const uint32 *_fTbl; + const uint32 *_sinTbl; + const int32 *_tLvlTbl; + const int32 *_detnTbl; + + const uint32 _tickLength; + uint32 _timer; + int32 _currentLevel; + + struct EvpState { + uint8 rate; + uint8 shift; + } fs_a, fs_d, fs_s, fs_r; +}; + class TownsPC98_FmSynth : public Audio::AudioStream { public: enum EmuType { -- cgit v1.2.3 From 7575c2be0b337cb88df0fe59ca297f38c34879c5 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 18:56:51 +0000 Subject: KYRA/TOWNS AUDIO: and another fix svn-id: r51649 --- sound/softsynth/fmtowns_pc98/towns_audio.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 82d390d9b6..6c68601673 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -30,6 +30,7 @@ class TownsAudioInterfacePluginDriver { public: + virtual ~TownsAudioInterfacePluginDriver() {} virtual void timerCallback(int timerId) = 0; }; -- cgit v1.2.3 From 2964e9213de9d81e901156a76ee1fdad6707a268 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 19:00:46 +0000 Subject: KYRA2: fix warning svn-id: r51650 --- engines/kyra/sound_towns.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 2ed6d972c2..1209c6b69a 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -568,7 +568,7 @@ void SoundTownsPC98_v2::beginFadeOut() { } int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, uint8, bool) { - static const uint16 rates[] = { 0x10E1, 0x0CA9, 0x0870, 0x0654, 0x0438, 0x032A, 0x021C, 0x0194 }; + //static const uint16 rates[] = { 0x10E1, 0x0CA9, 0x0870, 0x0654, 0x0438, 0x032A, 0x021C, 0x0194 }; static const char patternHOF[] = "%s.PCM"; static const char patternLOL[] = "%s.VOC"; @@ -589,7 +589,7 @@ int32 SoundTownsPC98_v2::voicePlay(const char *file, Audio::SoundHandle *handle, if (!src) return 0; - uint16 sfxRate = rates[READ_LE_UINT16(src)]; + //uint16 sfxRate = rates[READ_LE_UINT16(src)]; src += 2; bool compressed = (READ_LE_UINT16(src) & 1) ? true : false; src += 2; -- cgit v1.2.3 From f14940cbb577648bad3a9495e02e335aa6f8952e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 19:05:12 +0000 Subject: FM-TOWNS/PC98 Sound: Strip trailing whitespaces/tabs. svn-id: r51651 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 96 +++++++++++----------- sound/softsynth/fmtowns_pc98/towns_audio.h | 18 ++-- sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 38 ++++----- sound/softsynth/fmtowns_pc98/towns_euphony.h | 8 +- sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp | 8 +- .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 12 +-- sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 2 +- 7 files changed, 91 insertions(+), 91 deletions(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index 0d5a16b35f..cd94939f9d 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -46,7 +46,7 @@ private: uint8 *curInstrument; uint8 note; uint8 velo; - + int8 *data; int8 *dataEnd; @@ -73,10 +73,10 @@ private: int16 envCurrentLevel; EnvelopeState envState; - + int8 *extData; }; - + class TownsAudio_WaveTable { friend class TownsAudioInterface; public: @@ -233,10 +233,10 @@ bool TownsAudioInterface::init() { return true; if (!_drv) - return false; + return false; if (!TownsPC98_FmSynth::init()) - return false; + return false; _fmSaveReg[0] = new uint8[256]; _fmSaveReg[1] = new uint8[256]; @@ -423,7 +423,7 @@ int TownsAudioInterface::intf_readRegBuffer(va_list &args) { *dst = _fmSaveReg[part][reg]; return 0; } - + int TownsAudioInterface::intf_setTimerA(va_list &args) { int enable = va_arg(args, int); int tempo = va_arg(args, int); @@ -449,7 +449,7 @@ int TownsAudioInterface::intf_setTimerB(va_list &args) { } else { bufferedWriteReg(0, 0x27, (_fmSaveReg[0][0x27] & 0xf5) | 0x20); } - + return 0; } @@ -466,10 +466,10 @@ int TownsAudioInterface::intf_enableTimerB(va_list &args) { int TownsAudioInterface::intf_reserveEffectChannels(va_list &args) { int numChan = va_arg(args, int); if (numChan > 8) - return 3; + return 3; if ((numChan << 13) + _waveTablesTotalDataSize > 65536) return 5; - + if (numChan == _numReservedChannels) return 0; @@ -477,14 +477,14 @@ int TownsAudioInterface::intf_reserveEffectChannels(va_list &args) { int c = 8 - _numReservedChannels; for (int i = numChan; i; i--) { uint8 f = ~_chanFlags[c--]; - _pcmChanEffectPlaying &= f; + _pcmChanEffectPlaying &= f; } } else { int c = 7 - _numReservedChannels; for (int i = numChan - _numReservedChannels; i; i--) { uint8 f = ~_chanFlags[c--]; _pcmChanKeyPressed &= f; - _pcmChanKeyPlaying &= f; + _pcmChanKeyPlaying &= f; } } @@ -499,7 +499,7 @@ int TownsAudioInterface::intf_loadWaveTable(va_list &args) { uint8 *data = va_arg(args, uint8*); if (_numWaveTables > 127) return 3; - + TownsAudio_WaveTable w; w.readHeader(data); if (!w.size) @@ -524,7 +524,7 @@ int TownsAudioInterface::intf_loadWaveTable(va_list &args) { int TownsAudioInterface::intf_unloadWaveTable(va_list &args) { int id = va_arg(args, int); - + if (id == -1) { for (int i = 0; i < 128; i++) _waveTables[i].clear(); @@ -557,7 +557,7 @@ int TownsAudioInterface::intf_pcmPlayEffect(va_list &args) { if (chan < 0x40 || chan > 0x47) return 1; - + if (note & 0x80 || velo & 0x80) return 3; @@ -579,7 +579,7 @@ int TownsAudioInterface::intf_pcmPlayEffect(va_list &args) { return 6; TownsAudio_PcmChannel *p = &_pcmChan[chan]; - + _pcmChanNote[chan] = note; _pcmChanVelo[chan] = velo; @@ -693,9 +693,9 @@ void TownsAudioInterface::fmReset() { memset(&_fmSaveReg[0][240], 0x7f, 16); memset(_fmSaveReg[1], 0, 256); memset(&_fmSaveReg[1][240], 0x7f, 16); - _fmSaveReg[0][243] = _fmSaveReg[0][247] = _fmSaveReg[0][251] = _fmSaveReg[0][255] = + _fmSaveReg[0][243] = _fmSaveReg[0][247] = _fmSaveReg[0][251] = _fmSaveReg[0][255] = _fmSaveReg[1][243] = _fmSaveReg[1][247] = _fmSaveReg[1][251] = _fmSaveReg[1][255] = 0xff; - + for (int i = 0; i < 128; i++) fmLoadInstrument(i, _fmDefaultInstrument); @@ -728,7 +728,7 @@ int TownsAudioInterface::fmKeyOn(int chan, int note, int velo) { uint8 part = chan > 2 ? 1 : 0; if (chan > 2) chan -= 3; - + int frq = 0; uint8 bl = 0; @@ -778,12 +778,12 @@ int TownsAudioInterface::fmKeyOn(int chan, int note, int velo) { if (part) v |= 4; - for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) + for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) writeReg(part, reg, _fmSaveReg[part][reg] | 0x0f); writeReg(0, 0x28, v); - for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) + for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) writeReg(part, reg, _fmSaveReg[part][reg]); bufferedWriteReg(0, 0x28, v | 0xf0); @@ -874,7 +874,7 @@ int TownsAudioInterface::fmSetInstrument(int chan, int instrId) { bufferedWriteReg(part, reg, *src++); uint8 v = *src++; - reg += 4; + reg += 4; if (v < 64) v |= (_fmSaveReg[part][reg] & 0xc0); bufferedWriteReg(part, reg, v); @@ -886,7 +886,7 @@ int TownsAudioInterface::fmLoadInstrument(int instrId, const uint8 *data) { if (instrId > 127) return 3; assert(data); - memcpy(&_fmInstruments[instrId * 48], data, 48); + memcpy(&_fmInstruments[instrId * 48], data, 48); return 0; } @@ -901,7 +901,7 @@ int TownsAudioInterface::fmSetPitch(int chan, int pitch) { if (bl) { if (pitch < -8008) pitch = -8008; - pitch *= -1; + pitch *= -1; pitch /= 13; frq = _frequency[(bl - 1) % 12] - pitch; bl = (bl - 1) / 12; @@ -915,7 +915,7 @@ int TownsAudioInterface::fmSetPitch(int chan, int pitch) { frq = 616; bl = 0; } - } + } } else { frq = 616; bl = 0; @@ -926,7 +926,7 @@ int TownsAudioInterface::fmSetPitch(int chan, int pitch) { if (pitch > 8008) pitch = 8008; pitch /= 13; - + if (bl) { frq = _frequency[(bl - 1) % 12] + pitch; bl = (bl - 1) / 12; @@ -934,7 +934,7 @@ int TownsAudioInterface::fmSetPitch(int chan, int pitch) { frq = 616; bl = 0; } - + _fmChanPitch[chan] = pitch; if (frq > 1232) { @@ -948,8 +948,8 @@ int TownsAudioInterface::fmSetPitch(int chan, int pitch) { } else { if (bl >= 7 && frq > 1164) frq = 1164; - } - + } + } else { frq = 1164; bl = 7; @@ -986,7 +986,7 @@ int TownsAudioInterface::fmSetLevel(int chan, int lvl) { uint8 part = chan > 2 ? 1 : 0; if (chan > 2) chan -= 3; - + uint16 c = _carrier[_fmSaveReg[part][0xb0 + chan] & 7]; _fmSaveReg[part][0xd0 + chan] = lvl; @@ -1016,12 +1016,12 @@ void TownsAudioInterface::pcmReset() { for (int i = 0; i < 8; i++) _pcmChan[i].clear(); - + memset(_pcmInstruments, 0, 128 * 32); static uint8 name[] = { 0x4E, 0x6F, 0x20, 0x44, 0x61, 0x74, 0x61, 0x21 }; for (int i = 0; i < 32; i++) memcpy(_pcmInstruments + i * 128, name, 8); - + for (int i = 0; i < 128; i++) _waveTables[i].clear(); _numWaveTables = 0; @@ -1036,7 +1036,7 @@ void TownsAudioInterface::pcmReset() { int TownsAudioInterface::pcmKeyOn(int chan, int note, int velo) { if (chan < 0x40 || chan > 0x47) return 1; - + if (note & 0x80 || velo & 0x80) return 3; @@ -1047,7 +1047,7 @@ int TownsAudioInterface::pcmKeyOn(int chan, int note, int velo) { _pcmChanNote[chan] = note; _pcmChanVelo[chan] = velo; - + TownsAudio_PcmChannel *p = &_pcmChan[chan]; p->note = note; @@ -1109,7 +1109,7 @@ int TownsAudioInterface::pcmKeyOff(int chan) { return 1; chan -= 0x40; - _pcmChanKeyPressed &= ~_chanFlags[chan]; + _pcmChanKeyPressed &= ~_chanFlags[chan]; _pcmChan[chan].envRelease(); return 0; } @@ -1165,7 +1165,7 @@ int TownsAudioInterface::pcmLoadInstrument(int instrId, const uint8 *data) { if (instrId > 31) return 3; assert(data); - memcpy(&_pcmInstruments[instrId * 128], data, 128); + memcpy(&_pcmInstruments[instrId * 128], data, 128); return 0; } @@ -1184,14 +1184,14 @@ int TownsAudioInterface::pcmSetPitch(int chan, int pitch) { if (pitch < 0) pts = (0x20000000 / (-pitch + 0x2001)) >> 2; else if (pitch > 0) - pts = (((pitch + 0x2001) << 16) / 0x2000) >> 2; + pts = (((pitch + 0x2001) << 16) / 0x2000) >> 2; p->stepPitch = pts & 0xffff; p->step = (p->stepNote * p->stepPitch) >> 14; // if (_pcmChanUnkFlag & _chanFlags[chan]) // unk[chan] = (((p->step * 1000) << 11) / 98) / 20833; - + /*else*/ if ((_pcmChanEffectPlaying & _chanFlags[chan]) && (p->step > 2048)) p->step = 2048; @@ -1201,13 +1201,13 @@ int TownsAudioInterface::pcmSetPitch(int chan, int pitch) { int TownsAudioInterface::pcmSetLevel(int chan, int lvl) { if (chan > 0x47) return 1; - + if (lvl & 0x80) return 3; chan -= 0x40; TownsAudio_PcmChannel *p = &_pcmChan[chan]; - + if (_pcmChanReserved & _chanFlags[chan]) { _pcmChanVelo[chan] = lvl; p->velo = lvl << 1; @@ -1262,7 +1262,7 @@ void TownsAudioInterface::pcmUpdateEnvelopeGenerator(int chan) { if (p->envCurrentLevel <= 0) p->envCurrentLevel = 0; break; - + default: break; } @@ -1295,11 +1295,11 @@ void TownsAudioInterface::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_ } p->stepNote = s & 0xffff; - p->step = (s * p->stepPitch) >> 14; + p->step = (s * p->stepPitch) >> 14; } void TownsAudioInterface::cdaReset() { - + } const uint8 TownsAudioInterface::_chanFlags[] = { @@ -1340,7 +1340,7 @@ TownsAudio_PcmChannel::~TownsAudio_PcmChannel() { void TownsAudio_PcmChannel::loadExtData(uint8 *buffer, uint32 size) { delete[] extData; - extData = new int8[size]; + extData = new int8[size]; int8 *src = (int8*)buffer; int8 *dst = extData; for (uint32 i = 0; i < size; i++) @@ -1361,7 +1361,7 @@ void TownsAudio_PcmChannel::clear() { curInstrument = 0; note = 0; velo = 0; - + data = 0; dataEnd = 0; loopLen = 0; @@ -1380,14 +1380,14 @@ void TownsAudio_PcmChannel::clear() { envStep = envCurrentLevel = 0; envState = kEnvReady; - + delete[] extData; extData = 0; } void TownsAudio_PcmChannel::envAttack() { envState = kEnvAttacking; - int16 t = envTotalLevel << 8; + int16 t = envTotalLevel << 8; if (envAttackRate == 127) { envStep = 0; } else if (envAttackRate) { @@ -1405,7 +1405,7 @@ void TownsAudio_PcmChannel::envDecay() { if (t < 0 || envDecayRate == 127) { envStep = 0; } else if (envDecayRate) { - envStep = (t << 8) / envDecayRate; + envStep = (t << 8) / envDecayRate; } else { envCurrentLevel = envSustainLevel << 8; envSustain(); @@ -1457,7 +1457,7 @@ void TownsAudio_WaveTable::readData(const uint8 *buffer) { delete[] data; data = new int8[size]; - + const int8 *src = (const int8*)buffer; int8 *dst = data; for (uint32 i = 0; i < size; i++) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 6c68601673..84bc7d0454 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -44,7 +44,7 @@ public: bool init(); - int callback(int command, ...); + int callback(int command, ...); private: void nextTickEx(int32 *buffer, uint32 bufferSize); @@ -70,7 +70,7 @@ private: int intf_setTimerA(va_list &args); int intf_setTimerB(va_list &args); int intf_enableTimerA(va_list &args); - int intf_enableTimerB(va_list &args); + int intf_enableTimerB(va_list &args); int intf_reserveEffectChannels(va_list &args); int intf_loadWaveTable(va_list &args); int intf_unloadWaveTable(va_list &args); @@ -90,26 +90,26 @@ private: int intf_pcmUpdateEnvelopeGenerator(va_list &args); int intf_notImpl(va_list &args); - + void fmReset(); int fmKeyOn(int chan, int note, int velo); int fmKeyOff(int chan); int fmChanOff(int chan); - int fmSetPanPos(int chan, int mode); + int fmSetPanPos(int chan, int mode); int fmSetInstrument(int chan, int instrId); int fmLoadInstrument(int instrId, const uint8 *data); int fmSetPitch(int chan, int pitch); int fmSetLevel(int chan, int lvl); void bufferedWriteReg(uint8 part, uint8 regAddress, uint8 value); - + uint8 _fmChanPlaying; uint8 _fmChanNote[6]; int16 _fmChanPitch[6]; uint8 *_fmSaveReg[2]; uint8 *_fmInstruments; - + void pcmReset(); int pcmKeyOn(int chan, int note, int velo); int pcmKeyOff(int chan); @@ -127,14 +127,14 @@ private: uint8 _pcmChanKeyPressed; uint8 _pcmChanEffectPlaying; uint8 _pcmChanKeyPlaying; - + uint8 _pcmChanNote[8]; uint8 _pcmChanVelo[8]; uint8 _pcmChanLevel[8]; uint8 _numReservedChannels; uint8 *_pcmInstruments; - + TownsAudio_WaveTable *_waveTables; uint8 _numWaveTables; uint32 _waveTablesTotalDataSize; @@ -156,7 +156,7 @@ private: static const uint8 _carrier[]; static const uint8 _fmDefaultInstrument[]; static const uint16 _pcmPhase1[]; - static const uint16 _pcmPhase2[]; + static const uint16 _pcmPhase2[]; }; #endif diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp index 54b5d5b1d6..ec6829a99e 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -63,7 +63,7 @@ bool TownsEuphonyDriver::init() { _tOrdr = new uint8[32]; _tLevel = new int8[32]; _tTranspose = new int8[32]; - + reset(); cdaSetVolume(1, 118, 118); @@ -97,7 +97,7 @@ void TownsEuphonyDriver::reset() { assignChannel(i, e++); resetTables(); - + memset(_eventBuffer, 0, 64 * sizeof(DlEvent)); _bufferedEventsCount = 0; @@ -114,7 +114,7 @@ void TownsEuphonyDriver::reset() { } else { setTempoIntern(_defaultTempo); } - + resetControl(); } @@ -152,8 +152,8 @@ int TownsEuphonyDriver::startMusicTrack(const uint8 *data, int trackSize, int st _musicTrackSize = trackSize; _timeStampBase = _timeStampDest = 0; _tickCounter = 0; - _playing = true; - + _playing = true; + return 0; } @@ -240,7 +240,7 @@ int TownsEuphonyDriver::chanTranspose(int tableEntry, int val) { int TownsEuphonyDriver::assignChannel(int chan, int tableEntry) { if (tableEntry > 15 || chan > 127 || chan < 0) return 3; - + ActiveChannel *a = &_assignedChannels[chan]; if (a->chan == tableEntry) return 0; @@ -461,7 +461,7 @@ bool TownsEuphonyDriver::parseNext() { _endOfTrack = false; _musicPos = _musicStart; _timeStampBase = _timeStampDest = _tickCounter = 0; - _baseTickLen = _defaultBaseTickLen; + _baseTickLen = _defaultBaseTickLen; return false; } @@ -543,7 +543,7 @@ void TownsEuphonyDriver::sendEvent(uint8 mode, uint8 command) { } else if (mode == 0x10) { warning("TownsEuphonyDriver: Mode 0x10 not implemented."); - + } else if (mode == 0xff) { if (command >= 0xf0) { _paraCount = 1; @@ -574,8 +574,8 @@ void TownsEuphonyDriver::sendEvent(uint8 mode, uint8 command) { if (command) sendNoteOn(); else - sendNoteOff(); - } + sendNoteOff(); + } break; case 2: @@ -584,7 +584,7 @@ void TownsEuphonyDriver::sendEvent(uint8 mode, uint8 command) { _para[0] = command; } else { _paraCount = 1; - } + } break; case 3: @@ -658,7 +658,7 @@ bool TownsEuphonyDriver::evtSetupNote() { if (_eventBuffer[i].evt == 0) break; } - + if (i == 64) { processBufferNote(mode, evt, note, velo); } else { @@ -678,7 +678,7 @@ bool TownsEuphonyDriver::evtPolyphonicAftertouch() { return false; if (!_tEnable[_musicPos[1]]) return false; - + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); uint8 mode = _tMode[_musicPos[1]]; @@ -694,7 +694,7 @@ bool TownsEuphonyDriver::evtControlPitch() { return false; if (!_tEnable[_musicPos[1]]) return false; - + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); uint8 mode = _tMode[_musicPos[1]]; @@ -710,7 +710,7 @@ bool TownsEuphonyDriver::evtInstrumentChanAftertouch() { return false; if (!_tEnable[_musicPos[1]]) return false; - + uint8 evt = appendEvent(_musicPos[0], _musicPos[1]); uint8 mode = _tMode[_musicPos[1]]; @@ -826,8 +826,8 @@ void TownsEuphonyDriver::sendNoteOn() { if (found) c = *chan; else - _intf->callback(2, c); - + _intf->callback(2, c); + _assignedChannels[c].note = _para[0]; _assignedChannels[c].sub = 0; _intf->callback(1, c, _para[0], _para[1]); @@ -836,7 +836,7 @@ void TownsEuphonyDriver::sendNoteOn() { void TownsEuphonyDriver::sendChanVolume() { int8 *chan = &_activeChannels[_command & 0x0f]; while (*chan != -1) { - _intf->callback(8, *chan, _para[1] & 0x7f); + _intf->callback(8, *chan, _para[1] & 0x7f); chan = &_assignedChannels[*chan].next; }; } @@ -844,7 +844,7 @@ void TownsEuphonyDriver::sendChanVolume() { void TownsEuphonyDriver::sendPanPosition() { int8 *chan = &_activeChannels[_command & 0x0f]; while (*chan != -1) { - _intf->callback(3, *chan, _para[1] & 0x7f); + _intf->callback(3, *chan, _para[1] & 0x7f); chan = &_assignedChannels[*chan].next; }; } diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.h b/sound/softsynth/fmtowns_pc98/towns_euphony.h index 315e4ab4f0..06f6ed2d63 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.h +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.h @@ -68,9 +68,9 @@ public: TownsAudioInterface *intf() { return _intf; } -private: +private: void resetTables(); - + void resetTempo(); void setTempoIntern(int tempo); void setTimerA(bool enable, int tempo); @@ -93,7 +93,7 @@ private: uint8 appendEvent(uint8 evt, uint8 chan); void sendEvent(uint8 mode, uint8 command); - + typedef bool(TownsEuphonyDriver::*EuphonyOpcode)(); bool evtSetupNote(); bool evtPolyphonicAftertouch(); @@ -118,7 +118,7 @@ private: int8 *_activeChannels; int8 *_sustainChannels; - + struct ActiveChannel { int8 chan; int8 next; diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index 1279429e7c..ee1b50d355 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -246,7 +246,7 @@ void TownsPC98_MusicChannel::loadData(uint8 *data) { _dataPtr = data; _totalLevel = 0x7F; - uint8 *tmp = _dataPtr; + uint8 *tmp = _dataPtr; for (bool loop = true; loop; ) { uint8 cmd = *tmp++; if (cmd < 0xf0) { @@ -894,7 +894,7 @@ void TownsPC98_SfxChannel::loadData(uint8 *data) { _ssgTl = 0xff; _algorithm = 0x80; - uint8 *tmp = _dataPtr; + uint8 *tmp = _dataPtr; for (bool loop = true; loop; ) { uint8 cmd = *tmp++; if (cmd < 0xf0) { @@ -1309,7 +1309,7 @@ void TownsPC98_AudioDriver::setSfxTempo(uint16 tempo) { void TownsPC98_AudioDriver::startSoundEffect() { int volFlags = 0; - + for (int i = 0; i < 2; i++) { if (_sfxOffsets[i]) { _ssgChannels[i + 1]->protect(); @@ -1322,7 +1322,7 @@ void TownsPC98_AudioDriver::startSoundEffect() { _updateSfxFlag &= ~_sfxChannels[i]->_idFlag; } } - + setVolumeChannelMasks(~volFlags, volFlags); _sfxData = 0; } diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 7fb4519844..03023e776b 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -502,7 +502,7 @@ void TownsPC98_FmSynthSquareSineSource::nextTick(int32 *buffer, uint32 bufferSiz finOut += finOutTemp; } - finOut /= 3; + finOut /= 3; buffer[i << 1] += finOut; buffer[(i << 1) + 1] += finOut; @@ -862,14 +862,14 @@ void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { _timers[0].smpPerCb = (int32) spc; _timers[0].smpPerCbRem = (uint32) ((spc - (float)_timers[0].smpPerCb) * 1000000.0f); - _timers[0].smpTillCb = _timers[0].smpPerCb; + _timers[0].smpTillCb = _timers[0].smpPerCb; _timers[0].smpTillCbRem = _timers[0].smpPerCbRem; _timers[0].enabled = true; } else { _timers[0].enabled = false; - } + } - if (value & 2) { + if (value & 2) { float spc = (float)(0x100 - _timers[1].value) * 16.0f / _baserate; if (spc < 1) { warning("TownsPC98_FmSynth: Invalid Timer B setting: %d", _timers[1].value); @@ -884,7 +884,7 @@ void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { } else { _timers[1].enabled = false; } - + if (value & 0x10) { _timers[0].smpTillCb = _timers[0].smpPerCb; _timers[0].smpTillCbRem = _timers[0].smpTillCbRem; @@ -1065,7 +1065,7 @@ void TownsPC98_FmSynth::setVolumeChannelMasks(int channelMaskA, int channelMaskB if (_ssg) _ssg->setVolumeChannelMasks(_volMaskA >> _numChan, _volMaskB >> _numChan); if (_prc) - _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); + _prc->setVolumeChannelMasks(_volMaskA >> (_numChan + _numSSG), _volMaskB >> (_numChan + _numSSG)); } void TownsPC98_FmSynth::generateTables() { diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 7ef9880f83..fbe85f5b24 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -82,7 +82,7 @@ protected: uint32 _specifiedReleaseRate; uint32 _tickCount; uint32 _sustainLevel; - + bool _ampMod; uint32 _frequency; uint8 _kcode; -- cgit v1.2.3 From 7f2e880f705937702bbddf8c224e0574e7a85d56 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 19:27:44 +0000 Subject: TOWNS/PC98 Driver: Some formatting fixes. svn-id: r51653 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 109 ++++---- sound/softsynth/fmtowns_pc98/towns_audio.h | 2 +- sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 172 ++++++------ sound/softsynth/fmtowns_pc98/towns_euphony.h | 8 +- sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp | 46 ++-- sound/softsynth/fmtowns_pc98/towns_pc98_driver.h | 28 +- .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 291 +++++++++++---------- sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 71 +++-- 8 files changed, 399 insertions(+), 328 deletions(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index cd94939f9d..1207cb121f 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -283,7 +283,7 @@ void TownsAudioInterface::nextTickEx(int32 *buffer, uint32 bufferSize) { TownsAudio_PcmChannel *s = &_pcmChan[ii]; s->pos += s->step; - if (&s->data[s->pos >> 11] >= s->loopEnd) { + if (&s->data[s->pos >> 11] >= s->loopEnd) { if (s->loopLen) { s->pos -= s->loopLen; } else { @@ -305,7 +305,7 @@ void TownsAudioInterface::nextTickEx(int32 *buffer, uint32 bufferSize) { if (_pcmChan[ii].panLeft) finOutL += ((o * _pcmChan[ii].panLeft) >> 3); if (_pcmChan[ii].panRight) - finOutR += ((o *_pcmChan[ii].panRight) >> 3); + finOutR += ((o * _pcmChan[ii].panRight) >> 3); if (!((_pcmChanKeyPlaying & _chanFlags[ii]) || (_pcmChanEffectPlaying & _chanFlags[ii]))) _pcmChanOut &= ~_chanFlags[ii]; } @@ -326,7 +326,7 @@ void TownsAudioInterface::timerCallbackB() { Common::StackLock lock(_mutex); if (_ready) { if (_drv) - _drv->timerCallback(1); + _drv->timerCallback(1); for (int i = 0; i < 8; i++) pcmUpdateEnvelopeGenerator(i); } @@ -367,7 +367,7 @@ int TownsAudioInterface::intf_setInstrument(va_list &args) { int TownsAudioInterface::intf_loadInstrument(va_list &args) { int chanType = va_arg(args, int); int instrId = va_arg(args, int); - uint8 *instrData = va_arg(args, uint8*); + uint8 *instrData = va_arg(args, uint8 *); return (chanType & 0x40) ? pcmLoadInstrument(instrId, instrData) : fmLoadInstrument(instrId, instrData); } @@ -414,7 +414,7 @@ int TownsAudioInterface::intf_bufferedWriteReg(va_list &args) { int TownsAudioInterface::intf_readRegBuffer(va_list &args) { int part = va_arg(args, int) ? 1 : 0; int reg = va_arg(args, int); - uint8 *dst = va_arg(args, uint8*); + uint8 *dst = va_arg(args, uint8 *); *dst = 0; if ((!part && reg < 0x20) || (part && reg < 0x30) || (reg > 0xef)) @@ -496,7 +496,7 @@ int TownsAudioInterface::intf_reserveEffectChannels(va_list &args) { } int TownsAudioInterface::intf_loadWaveTable(va_list &args) { - uint8 *data = va_arg(args, uint8*); + uint8 *data = va_arg(args, uint8 *); if (_numWaveTables > 127) return 3; @@ -553,7 +553,7 @@ int TownsAudioInterface::intf_pcmPlayEffect(va_list &args) { int chan = va_arg(args, int); int note = va_arg(args, int); int velo = va_arg(args, int); - uint8 *data = va_arg(args, uint8*); + uint8 *data = va_arg(args, uint8 *); if (chan < 0x40 || chan > 0x47) return 1; @@ -639,7 +639,7 @@ int TownsAudioInterface::intf_fmSetInstrument(va_list &args) { int TownsAudioInterface::intf_fmLoadInstrument(va_list &args) { int instrId = va_arg(args, int); - uint8 *instrData = va_arg(args, uint8*); + uint8 *instrData = va_arg(args, uint8 *); return fmLoadInstrument(instrId, instrData); } @@ -694,7 +694,7 @@ void TownsAudioInterface::fmReset() { memset(_fmSaveReg[1], 0, 256); memset(&_fmSaveReg[1][240], 0x7f, 16); _fmSaveReg[0][243] = _fmSaveReg[0][247] = _fmSaveReg[0][251] = _fmSaveReg[0][255] = - _fmSaveReg[1][243] = _fmSaveReg[1][247] = _fmSaveReg[1][251] = _fmSaveReg[1][255] = 0xff; + _fmSaveReg[1][243] = _fmSaveReg[1][247] = _fmSaveReg[1][251] = _fmSaveReg[1][255] = 0xff; for (int i = 0; i < 128; i++) fmLoadInstrument(i, _fmDefaultInstrument); @@ -1192,7 +1192,8 @@ int TownsAudioInterface::pcmSetPitch(int chan, int pitch) { // if (_pcmChanUnkFlag & _chanFlags[chan]) // unk[chan] = (((p->step * 1000) << 11) / 98) / 20833; - /*else*/ if ((_pcmChanEffectPlaying & _chanFlags[chan]) && (p->step > 2048)) + /*else*/ + if ((_pcmChanEffectPlaying & _chanFlags[chan]) && (p->step > 2048)) p->step = 2048; return 0; @@ -1238,33 +1239,33 @@ void TownsAudioInterface::pcmUpdateEnvelopeGenerator(int chan) { return; switch (p->envState) { - case kEnvAttacking: - if (((p->envCurrentLevel + p->envStep) >> 8) > p->envTotalLevel) { - p->envDecay(); - return; - } else { - p->envCurrentLevel += p->envStep; - } - break; - - case kEnvDecaying: - if (((p->envCurrentLevel - p->envStep) >> 8) < p->envSustainLevel) { - p->envSustain(); - return; - } else { - p->envCurrentLevel -= p->envStep; - } - break; + case kEnvAttacking: + if (((p->envCurrentLevel + p->envStep) >> 8) > p->envTotalLevel) { + p->envDecay(); + return; + } else { + p->envCurrentLevel += p->envStep; + } + break; - case kEnvSustaining: - case kEnvReleasing: + case kEnvDecaying: + if (((p->envCurrentLevel - p->envStep) >> 8) < p->envSustainLevel) { + p->envSustain(); + return; + } else { p->envCurrentLevel -= p->envStep; - if (p->envCurrentLevel <= 0) - p->envCurrentLevel = 0; - break; + } + break; - default: - break; + case kEnvSustaining: + case kEnvReleasing: + p->envCurrentLevel -= p->envStep; + if (p->envCurrentLevel <= 0) + p->envCurrentLevel = 0; + break; + + default: + break; } p->velo = (p->envCurrentLevel >> 8) << 1; } @@ -1341,7 +1342,7 @@ TownsAudio_PcmChannel::~TownsAudio_PcmChannel() { void TownsAudio_PcmChannel::loadExtData(uint8 *buffer, uint32 size) { delete[] extData; extData = new int8[size]; - int8 *src = (int8*)buffer; + int8 *src = (int8 *)buffer; int8 *dst = extData; for (uint32 i = 0; i < size; i++) *dst++ = *src & 0x80 ? (*src++ & 0x7f) : -*src++; @@ -1358,31 +1359,31 @@ void TownsAudio_PcmChannel::setupLoop(uint32 start, uint32 len) { } void TownsAudio_PcmChannel::clear() { - curInstrument = 0; - note = 0; - velo = 0; + curInstrument = 0; + note = 0; + velo = 0; - data = 0; - dataEnd = 0; - loopLen = 0; + data = 0; + dataEnd = 0; + loopLen = 0; - pos = 0; - loopEnd = 0; + pos = 0; + loopEnd = 0; - step = 0; - stepNote = 0x4000; - stepPitch = 0x4000; + step = 0; + stepNote = 0x4000; + stepPitch = 0x4000; - panLeft = panRight = 0; + panLeft = panRight = 0; - envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = - envSustainRate = envReleaseRate = 0; - envStep = envCurrentLevel = 0; + envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = + envSustainRate = envReleaseRate = 0; + envStep = envCurrentLevel = 0; - envState = kEnvReady; + envState = kEnvReady; - delete[] extData; - extData = 0; + delete[] extData; + extData = 0; } void TownsAudio_PcmChannel::envAttack() { @@ -1458,7 +1459,7 @@ void TownsAudio_WaveTable::readData(const uint8 *buffer) { delete[] data; data = new int8[size]; - const int8 *src = (const int8*)buffer; + const int8 *src = (const int8 *)buffer; int8 *dst = data; for (uint32 i = 0; i < size; i++) *dst++ = *src & 0x80 ? (*src++ & 0x7f) : -*src++; diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 84bc7d0454..22784699bc 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -52,7 +52,7 @@ private: void timerCallbackA(); void timerCallbackB(); - typedef int (TownsAudioInterface::*TownsAudioIntfCallback)(va_list&); + typedef int (TownsAudioInterface::*TownsAudioIntfCallback)(va_list &); const TownsAudioIntfCallback *_intfOpcodes; int intf_reset(va_list &args); diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp index ec6829a99e..db25846b47 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -225,7 +225,7 @@ int TownsEuphonyDriver::chanLevel(int tableEntry, int val) { if (tableEntry > 31) return 3; if (val <= 40) - _tLevel[tableEntry] = (int8) (val & 0xff); + _tLevel[tableEntry] = (int8)(val & 0xff); return 0; } @@ -233,7 +233,7 @@ int TownsEuphonyDriver::chanTranspose(int tableEntry, int val) { if (tableEntry > 31) return 3; if (val <= 40) - _tTranspose[tableEntry] = (int8) (val & 0xff); + _tTranspose[tableEntry] = (int8)(val & 0xff); return 0; } @@ -247,7 +247,7 @@ int TownsEuphonyDriver::assignChannel(int chan, int tableEntry) { if (a->chan != -1) { int8 *b = &_activeChannels[a->chan]; - while(*b != chan) { + while (*b != chan) { b = &_assignedChannels[*b].next; if (*b == -1 && *b != chan) return 3; @@ -272,20 +272,20 @@ int TownsEuphonyDriver::assignChannel(int chan, int tableEntry) { void TownsEuphonyDriver::timerCallback(int timerId) { switch (timerId) { - case 0: - updatePulseCount(); - while (_pulseCount > 0) { - --_pulseCount; - updateTimeStampBase(); - if (!_playing) - continue; - updateEventBuffer(); - updateParser(); - updateCheckEot(); - } - break; - default: - break; + case 0: + updatePulseCount(); + while (_pulseCount > 0) { + --_pulseCount; + updateTimeStampBase(); + if (!_playing) + continue; + updateEventBuffer(); + updateParser(); + updateCheckEot(); + } + break; + default: + break; } } @@ -377,7 +377,7 @@ void TownsEuphonyDriver::updateTimeStampBase() { } void TownsEuphonyDriver::updateParser() { - for (bool loop = true; loop; ) { + for (bool loop = true; loop;) { uint8 cmd = _musicPos[0]; if (cmd == 0xff || cmd == 0xf7) { @@ -429,7 +429,7 @@ bool TownsEuphonyDriver::parseNext() { uint cmd = _musicPos[0]; if (cmd != 0xfe && cmd != 0xfd) { - if (cmd >= 0xf0 ) { + if (cmd >= 0xf0) { cmd &= 0x0f; if (cmd == 0) evtLoadInstrument(); @@ -553,78 +553,78 @@ void TownsEuphonyDriver::sendEvent(uint8 mode, uint8 command) { _command = command; } else if (_command >= 0x80) { switch ((_command - 0x80) >> 4) { - case 0: - if (_paraCount < 2) { - _paraCount++; - _para[0] = command; - } else { - _paraCount = 1; - _para[1] = command; - sendNoteOff(); - } - break; - - case 1: - if (_paraCount < 2) { - _paraCount++; - _para[0] = command; - } else { - _paraCount = 1; - _para[1] = command; - if (command) - sendNoteOn(); - else - sendNoteOff(); - } - break; - - case 2: - if (_paraCount < 2) { - _paraCount++; - _para[0] = command; - } else { - _paraCount = 1; - } - break; - - case 3: - if (_paraCount < 2) { - _paraCount++; - _para[0] = command; - } else { - _paraCount = 1; - _para[1] = command; - - if (_para[0] == 7) - sendChanVolume(); - else if (_para[0] == 10) - sendPanPosition(); - else if (_para[0] == 64) - sendAllNotesOff(); - } - break; - - case 4: + case 0: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { _paraCount = 1; + _para[1] = command; + sendNoteOff(); + } + break; + + case 1: + if (_paraCount < 2) { + _paraCount++; _para[0] = command; - sendSetInstrument(); - break; + } else { + _paraCount = 1; + _para[1] = command; + if (command) + sendNoteOn(); + else + sendNoteOff(); + } + break; + + case 2: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { + _paraCount = 1; + } + break; - case 5: + case 3: + if (_paraCount < 2) { + _paraCount++; + _para[0] = command; + } else { _paraCount = 1; + _para[1] = command; + + if (_para[0] == 7) + sendChanVolume(); + else if (_para[0] == 10) + sendPanPosition(); + else if (_para[0] == 64) + sendAllNotesOff(); + } + break; + + case 4: + _paraCount = 1; + _para[0] = command; + sendSetInstrument(); + break; + + case 5: + _paraCount = 1; + _para[0] = command; + break; + + case 6: + if (_paraCount < 2) { + _paraCount++; _para[0] = command; - break; - - case 6: - if (_paraCount < 2) { - _paraCount++; - _para[0] = command; - } else { - _paraCount = 1; - _para[1] = command; - sendPitch(); - } - break; + } else { + _paraCount = 1; + _para[1] = command; + sendPitch(); + } + break; } } } diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.h b/sound/softsynth/fmtowns_pc98/towns_euphony.h index 06f6ed2d63..c869b612a3 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.h +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.h @@ -66,7 +66,9 @@ public: void timerCallback(int timerId); - TownsAudioInterface *intf() { return _intf; } + TownsAudioInterface *intf() { + return _intf; + } private: void resetTables(); @@ -103,7 +105,9 @@ private: bool evtAdvanceTimestampOffset(); bool evtTempo(); bool evtModeOrdrChange(); - bool evtNotImpl() { return false; } + bool evtNotImpl() { + return false; + } uint8 prepTranspose(uint8 in); uint8 prepVelo(uint8 in); diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index ee1b50d355..2853f616a3 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -29,7 +29,7 @@ class TownsPC98_MusicChannel { public: TownsPC98_MusicChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, - uint8 key, uint8 prt, uint8 id); + uint8 key, uint8 prt, uint8 id); virtual ~TownsPC98_MusicChannel(); virtual void init(); @@ -116,7 +116,7 @@ protected: class TownsPC98_MusicChannelSSG : public TownsPC98_MusicChannel { public: TownsPC98_MusicChannelSSG(TownsPC98_AudioDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); virtual ~TownsPC98_MusicChannelSSG() {} void init(); @@ -152,7 +152,7 @@ protected: class TownsPC98_SfxChannel : public TownsPC98_MusicChannelSSG { public: TownsPC98_SfxChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : TownsPC98_MusicChannelSSG(driver, regOffs, flgs, num, key, prt, id) {} ~TownsPC98_SfxChannel() {} @@ -163,7 +163,7 @@ public: class TownsPC98_MusicChannelPCM : public TownsPC98_MusicChannel { public: TownsPC98_MusicChannelPCM(TownsPC98_AudioDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id); ~TownsPC98_MusicChannelPCM() {} void init(); @@ -180,7 +180,7 @@ private: }; TownsPC98_MusicChannel::TownsPC98_MusicChannel(TownsPC98_AudioDriver *driver, uint8 regOffs, uint8 flgs, uint8 num, - uint8 key, uint8 prt, uint8 id) : _drv(driver), _regOffset(regOffs), _flags(flgs), _chanNum(num), _keyNum(key), + uint8 key, uint8 prt, uint8 id) : _drv(driver), _regOffset(regOffs), _flags(flgs), _chanNum(num), _keyNum(key), _part(prt), _idFlag(id), controlEvents(0) { _ticksLeft = _algorithm = _instr = _totalLevel = _frqBlockMSB = _keyOffTime = 0; @@ -197,7 +197,7 @@ TownsPC98_MusicChannel::~TownsPC98_MusicChannel() { } void TownsPC98_MusicChannel::init() { - #define Control(x) &TownsPC98_MusicChannel::control_##x +#define Control(x) &TownsPC98_MusicChannel::control_##x static const ControlEventFunc ctrlEvents[] = { Control(f0_setPatch), Control(f1_presetOutputLevel), @@ -216,7 +216,7 @@ void TownsPC98_MusicChannel::init() { Control(dummy), Control(ff_endOfTrack) }; - #undef Control +#undef Control controlEvents = ctrlEvents; } @@ -247,7 +247,7 @@ void TownsPC98_MusicChannel::loadData(uint8 *data) { _totalLevel = 0x7F; uint8 *tmp = _dataPtr; - for (bool loop = true; loop; ) { + for (bool loop = true; loop;) { uint8 cmd = *tmp++; if (cmd < 0xf0) { tmp++; @@ -545,7 +545,7 @@ bool TownsPC98_MusicChannel::control_fc_decOutLevel(uint8 para) { if (_drv->_fading) return true; - int8 val = (int8) (_totalLevel - 3); + int8 val = (int8)(_totalLevel - 3); if (val < 0) val = 0; @@ -582,14 +582,14 @@ bool TownsPC98_MusicChannel::control_ff_endOfTrack(uint8 para) { } TownsPC98_MusicChannelSSG::TownsPC98_MusicChannelSSG(TownsPC98_AudioDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : - TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { } void TownsPC98_MusicChannelSSG::init() { _algorithm = 0x80; - #define Control(x) &TownsPC98_MusicChannelSSG::control_##x +#define Control(x) &TownsPC98_MusicChannelSSG::control_##x static const ControlEventFunc ctrlEventsSSG[] = { Control(f0_setPatch), Control(f1_setTotalLevel), @@ -608,7 +608,7 @@ void TownsPC98_MusicChannelSSG::init() { Control(dummy), Control(ff_endOfTrack) }; - #undef Control +#undef Control controlEvents = ctrlEventsSSG; } @@ -681,7 +681,7 @@ void TownsPC98_MusicChannelSSG::processEvents() { } } else { int t = _ssgStartLvl + _ssgStep; - uint8 p = (uint8) (t & 0xff); + uint8 p = (uint8)(t & 0xff); if (t < 256 && _ssgTargetLvl > p) { if (!_drv->_fading) @@ -691,7 +691,7 @@ void TownsPC98_MusicChannelSSG::processEvents() { } setOutputLevel(_ssgTargetLvl); - if (_ssgStartLvl && !(_instr & 8)){ + if (_ssgStartLvl && !(_instr & 8)) { _instr += 4; _ssgStep = _drv->_ssgPatches[_instr]; _ssgTicksLeft = _drv->_ssgPatches[_instr + 1] & 0x7f; @@ -895,7 +895,7 @@ void TownsPC98_SfxChannel::loadData(uint8 *data) { _algorithm = 0x80; uint8 *tmp = _dataPtr; - for (bool loop = true; loop; ) { + for (bool loop = true; loop;) { uint8 cmd = *tmp++; if (cmd < 0xf0) { tmp++; @@ -929,14 +929,14 @@ void TownsPC98_SfxChannel::reset() { } TownsPC98_MusicChannelPCM::TownsPC98_MusicChannelPCM(TownsPC98_AudioDriver *driver, uint8 regOffs, - uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : - TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { + uint8 flgs, uint8 num, uint8 key, uint8 prt, uint8 id) : + TownsPC98_MusicChannel(driver, regOffs, flgs, num, key, prt, id), controlEvents(0) { } void TownsPC98_MusicChannelPCM::init() { _algorithm = 0x80; - #define Control(x) &TownsPC98_MusicChannelPCM::control_##x +#define Control(x) &TownsPC98_MusicChannelPCM::control_##x static const ControlEventFunc ctrlEventsPCM[] = { Control(dummy), Control(f1_prcStart), @@ -955,7 +955,7 @@ void TownsPC98_MusicChannelPCM::init() { Control(dummy), Control(ff_endOfTrack) }; - #undef Control +#undef Control controlEvents = ctrlEventsPCM; } @@ -1079,7 +1079,7 @@ bool TownsPC98_AudioDriver::init() { for (int i = 0; i < _numChan; i++) { int ii = i * 6; _channels[i] = new TownsPC98_MusicChannel(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); _channels[i]->init(); } @@ -1091,7 +1091,7 @@ bool TownsPC98_AudioDriver::init() { for (int i = 0; i < _numSSG; i++) { int ii = i * 6; _ssgChannels[i] = new TownsPC98_MusicChannelSSG(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); _ssgChannels[i]->init(); } @@ -1099,7 +1099,7 @@ bool TownsPC98_AudioDriver::init() { for (int i = 0; i < 2; i++) { int ii = (i + 1) * 6; _sfxChannels[i] = new TownsPC98_SfxChannel(this, _drvTables[ii], _drvTables[ii + 1], - _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); + _drvTables[ii + 2], _drvTables[ii + 3], _drvTables[ii + 4], _drvTables[ii + 5]); _sfxChannels[i]->init(); } } diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h index a0dd870549..18daee1e72 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.h @@ -49,17 +49,31 @@ public: void fadeStep(); - void pause() { _musicPlaying = false; } - void cont() { _musicPlaying = true; } + void pause() { + _musicPlaying = false; + } + void cont() { + _musicPlaying = true; + } void timerCallbackB(); void timerCallbackA(); - bool looping() { return _looping == _updateChannelsFlag ? true : false; } - bool musicPlaying() { return _musicPlaying; } - - void setMusicVolume(int volume) { _musicVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } - void setSoundEffectVolume(int volume) { _sfxVolume = volume; setVolumeIntern(_musicVolume, _sfxVolume); } + bool looping() { + return _looping == _updateChannelsFlag ? true : false; + } + bool musicPlaying() { + return _musicPlaying; + } + + void setMusicVolume(int volume) { + _musicVolume = volume; + setVolumeIntern(_musicVolume, _sfxVolume); + } + void setSoundEffectVolume(int volume) { + _sfxVolume = volume; + setVolumeIntern(_musicVolume, _sfxVolume); + } protected: void startSoundEffect(); diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 03023e776b..c7cd83560d 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -27,13 +27,13 @@ #include "common/endian.h" TownsPC98_FmSynthOperator::TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : _rateTbl(rateTable), _rshiftTbl(shiftTable), _adTbl(attackDecayTable), _fTbl(frqTable), _sinTbl(sineTable), _tLvlTbl(tlevelOut), _detnTbl(detuneTable), _tickLength(timerbase * 2), _specifiedAttackRate(0), _specifiedDecayRate(0), _specifiedReleaseRate(0), _specifiedSustainRate(0), - _phase(0), _state(kEnvReady), _playing(false), _timer(0), _keyScale1(0), - _keyScale2(0), _currentLevel(1023), _ampMod(false), _tickCount(0) { + _phase(0), _state(kEnvReady),_ playing(false), _timer(0), _keyScale1(0), + _keyScale2(0), _currentLevel(1023), _ampMod(false), _tickCount(0) { fs_a.rate = fs_a.shift = fs_d.rate = fs_d.shift = fs_s.rate = fs_s.shift = fs_r.rate = fs_r.shift = 0; @@ -63,7 +63,7 @@ void TownsPC98_FmSynthOperator::frequency(int freq) { uint16 pos = (freq & 0x7ff); uint8 c = pos >> 7; - _kcode = (block << 2) | ((c < 7) ? 0 : ((c > 8) ? 3 : c - 6 )); + _kcode = (block << 2) | ((c < 7) ? 0 : ((c > 8) ? 3 : c - 6)); _frequency = _fTbl[pos << 1] >> (7 - block); } @@ -172,7 +172,7 @@ void TownsPC98_FmSynthOperator::generateOutput(int32 phasebuf, int32 *feed, int3 if (lvlout < 832) { uint32 index = (lvlout << 3) + _sinTbl[(((int32)((_phase & 0xffff0000) - + phaseShift)) >> 16) & 0x3ff]; + + phaseShift)) >> 16) & 0x3ff]; *i = ((index < 6656) ? _tLvlTbl[index] : 0); } else { *i = 0; @@ -182,7 +182,7 @@ void TownsPC98_FmSynthOperator::generateOutput(int32 phasebuf, int32 *feed, int3 out += *o; } -void TownsPC98_FmSynthOperator::reset(){ +void TownsPC98_FmSynthOperator::reset() { keyOff(); _timer = 0; _keyScale2 = 0; @@ -227,10 +227,18 @@ public: void nextTick(int32 *buffer, uint32 bufferSize); - void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } - void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + void setVolumeIntern(int volA, int volB) { + _volumeA = volA; + _volumeB = volB; + } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { + _volMaskA = channelMaskA; + _volMaskB = channelMaskB; + } - uint8 chanEnable() const { return _chanEnable; } + uint8 chanEnable() const { + return _chanEnable; + } private: void updateRegs(); @@ -280,7 +288,9 @@ private: class TownsPC98_FmSynthPercussionSource { public: TownsPC98_FmSynthPercussionSource(const uint32 timerbase); - ~TownsPC98_FmSynthPercussionSource() { delete[] _reg; } + ~TownsPC98_FmSynthPercussionSource() { + delete[] _reg; + } void init(const uint8 *instrData = 0); void reset(); @@ -288,8 +298,14 @@ public: void nextTick(int32 *buffer, uint32 bufferSize); - void setVolumeIntern(int volA, int volB) { _volumeA = volA; _volumeB = volB; } - void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { _volMaskA = channelMaskA; _volMaskB = channelMaskB; } + void setVolumeIntern(int volA, int volB) { + _volumeA = volA; + _volumeB = volB; + } + void setVolumeChannelMasks(int channelMaskA, int channelMaskB) { + _volMaskA = channelMaskA; + _volMaskB = channelMaskB; + } private: struct RhtChannel { @@ -491,7 +507,7 @@ void TownsPC98_FmSynthSquareSineSource::nextTick(int32 *buffer, uint32 bufferSiz int32 finOut = 0; for (int ii = 0; ii < 3; ii++) { - int32 finOutTemp = ((_channels[ii].vol >> 4) & 1) ? _tleTable[_channels[ii].out ? _pReslt : 0] : _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; +int32 finOutTemp = ((_channels[ii].vol >> 4) & 1) ? _tleTable[_channels[ii].out ? _pReslt : 0] : _tlTable[_channels[ii].out ? (_channels[ii].vol & 0x0f) : 0]; if ((1 << ii) & _volMaskA) finOutTemp = (finOutTemp * _volumeA) / Audio::Mixer::kMaxMixerVolume; @@ -597,8 +613,8 @@ void TownsPC98_FmSynthPercussionSource::writeReg(uint8 address, uint8 value) { if (!_ready) return; - uint8 h = address >> 4; - uint8 l = address & 15; + uint8 h = address >> 4; + uint8 l = address & 15; if (address > 15) *_reg[address] = value; @@ -697,14 +713,15 @@ void TownsPC98_FmSynthPercussionSource::recalcOuput(RhtChannel *ins) { } void TownsPC98_FmSynthPercussionSource::advanceInput(RhtChannel *ins) { - static const int8 adjustIndex[] = {-1, -1, -1, -1, 2, 5, 7, 9 }; + static const int8 adjustIndex[] = { -1, -1, -1, -1, 2, 5, 7, 9 }; - static const int16 stepTable[] = { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, + static const int16 stepTable[] = { + 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 }; - uint8 cur = (int8) *ins->pos++; + uint8 cur = (int8)*ins->pos++; for (int i = 0; i < 2; i++) { int b = (2 * (cur & 7) + 1) * stepTable[ins->decState] / 8; @@ -772,7 +789,7 @@ bool TownsPC98_FmSynth::init() { } _mixer->playStream(Audio::Mixer::kPlainSoundType, - &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); _ready = true; @@ -861,7 +878,7 @@ void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { } _timers[0].smpPerCb = (int32) spc; - _timers[0].smpPerCbRem = (uint32) ((spc - (float)_timers[0].smpPerCb) * 1000000.0f); + _timers[0].smpPerCbRem = (uint32)((spc - (float)_timers[0].smpPerCb) * 1000000.0f); _timers[0].smpTillCb = _timers[0].smpPerCb; _timers[0].smpTillCbRem = _timers[0].smpPerCbRem; _timers[0].enabled = true; @@ -877,7 +894,7 @@ void TownsPC98_FmSynth::writeReg(uint8 part, uint8 regAddress, uint8 value) { } _timers[1].smpPerCb = (int32) spc; - _timers[1].smpPerCbRem = (uint32) ((spc - (float)_timers[1].smpPerCb) * 1000000.0f); + _timers[1].smpPerCbRem = (uint32)((spc - (float)_timers[1].smpPerCb) * 1000000.0f); _timers[1].smpTillCb = _timers[1].smpPerCb; _timers[1].smpTillCbRem = _timers[1].smpPerCbRem; _timers[1].enabled = true; @@ -1110,7 +1127,7 @@ void TownsPC98_FmSynth::generateTables() { delete[] _oprSinTbl; _oprSinTbl = new uint32[1024]; for (int i = 0; i < 1024; i++) { - double val = sin((double) (((i << 1) + 1) * PI / 1024.0)); + double val = sin((double)(((i << 1) + 1) * PI / 1024.0)); double d_dcb = log(1.0 / (double)ABS(val)) / log(2.0) * 256.0; int32 i_dcb = (int32)(2.0 * d_dcb); i_dcb = (i_dcb & 1) ? (i_dcb >> 1) + 1 : (i_dcb >> 1); @@ -1124,7 +1141,7 @@ void TownsPC98_FmSynth::generateTables() { int32 val_int = ((int32) val) >> 4; _oprLevelOut[i << 1] = (val_int & 1) ? ((val_int >> 1) + 1) << 2 : (val_int >> 1) << 2; _oprLevelOut[(i << 1) + 1] = -_oprLevelOut[i << 1]; - for (int ii = 1; ii < 13; ii++) { + for (int ii = 1; ii < 13; ++ii) { _oprLevelOut[(i << 1) + (ii << 9)] = _oprLevelOut[i << 1] >> ii; _oprLevelOut[(i << 1) + (ii << 9) + 1] = -_oprLevelOut[(i << 1) + (ii << 9)]; } @@ -1138,7 +1155,7 @@ void TownsPC98_FmSynth::generateTables() { delete[] _oprDetune; _oprDetune = new int32[256]; for (int i = 0; i < 128; i++) { - _oprDetune[i] = (int32) ((float)dtt[i] * _baserate * 64.0); + _oprDetune[i] = (int32)((float)dtt[i] * _baserate * 64.0); _oprDetune[i + 128] = -_oprDetune[i]; } @@ -1279,116 +1296,116 @@ const int TownsPC98_FmSynth::_ssgTables[] = { }; const uint8 TownsPC98_FmSynth::_percussionData[] = { - 0,24,1,192,1,216,2,128,4,88,23,64,27,152,1,128,29,24,2,128,31,152,0,128,136,128,128,128,0,136,97,103,153,139,34,163,72,195,27,69,1,154,137,35,8,51,169,122,164,75,133,203,81,146,168,121,185,68,202,8,33,237,49,177,12,133,140,17,160,42,161,10,0,137,176, 57, - 233,41,160,136,235,65,177,137,128,26,164,28,3,157,51,137,1,152,113,161,40,146,115,192,56,5,169,66,161,56,1,50,145,59,39,168,97,1,160,57,7,153,50,153,32,2,25,129,32,20,186,66,129,24,153,164,142,130,169,153,26,242,138,217,9,128,204,58,209,172,40, 176, 141, - 128,155,144,203,139,0,235,9,177,172,0,185,168,138,25,240,59,211,139,19,176,90,160,17,26,132,41,1,5,25,3,50,144,115,147,42,39,152,41,3,56,193,105,130,155,66,200,26,19,218,154,49,201,171,138,176,251,139,185,172,136,189,139,145,207,41,160,171,152, 186, 139, - 186,141,128,218,171,51,217,170,56,163,12,4,155,81,147,42,37,152,32,54,136,49,50,48,37,32,69,0,17,50,50,83,2,16,68,20,8,66,4,154,84,145,24,33,24,32,17,18,145,32,22,168,49,163,1,33,50,184,115,129,25,66,1,24,67,2,80,35,40,53,2,65,51,19,67,37,0,52,35,49, 37, - 34,49,37,17,52,17,35,35,35,34,32,49,33,152,34,145,24,24,128,138,128,184,9,177,171,168,185,155,152,172,155,186,172,185,172,155,186,173,153,202,187,185,202,170,171,202,186,169,170,170,171,139,154,171,153,154,169,10,168,154,128,168,154,0,153, 152, 136, 137, - 128,153,0,152,8,128,137,0,136,136,8,9,8,9,8,24,153,128,136,153,144,0,161,138,1,169,136,128,160,168,152,153,138,137,154,153,153,154,153,170,168,170,185,168,169,154,169,171,153,169,170,153,152,154,153,137,169,137,136,144,152,144,128,128,144,129,129, 0, 33, - 0,17,17,17,33,33,18,18,34,34,34,34,34,34,35,19,35,19,35,35,18,19,18,35,18,33,0,8,8,8,8,8,8,8,160,205,65,176,171,203,16,240,95,242,120,145,156,66,177,26,19,153,9,35,35,239,56,132,138,154,50,145,203,25,32,20,237,24,130,138,160,27,39,173,50,203,64,145, 139, - 18,168,48,146,171,65,18,176,12,52,128,25,5,57,240,104,161,25,129,18,188,114,160,26,36,200,154,18,1,128,186,73,162,173,32,184,25,144,137,234,8,154,32,160,158,18,187,81,2,235,41,36,144,154,17,67,128,33,160,114,146,26,37,33,232,41,130,41,178,29,50, 251, 24, - 1,153,138,160,76,179,155,11,0,38,252,41,146,41,178,27,193,43,39,170,136,17,129,8,49,233,48,129,11,6,26,130,136,128,64,1,248,105,145,9,16,144,140,5,25,168,16,186,48,5,171,217,57,134,171,8,34,188,20,203,41,6,155,161,89,164,140,2,136,51,202,41,131, 56, 144, - 8,97,144,146,13,69,200,42,130,25,152,57,6,220,88,177,26,148,9,168,8,67,192,156,65,145,137,10,4,154,18,157,67,160,154,1,50,188,82,170,82,185,49,220,97,144,10,8,16,145,9,136,18,202,51,184,141,114,179,139,24,19,8,250,121,160,40,160,10,18,152,168,42,35, 216, - 187,120,145,18,156,203,84,144,9,144,26,66,161,13,1,128,17,154,18,142,6,154,65,192,29,35,186,64,192,24,9,146,56,185,16,248,121,176,40,129,136,171,96,147,140,50,203,64,144,41,128,161,187,71,200,24,129,24,217,56,20,220,24,4,169,9,1,33,201,26,134,141,51,201, - 25,16,33,235,32,144,33,153,169,99,160,11,3,136,58,210,33,203,48,163,17,219,128,140,38,8,184,141,50,131,159,33,128,153,25,18,153,88,242,43,3,9,136,157,53,202,40,145,25,2,204,105,146,156,66,152,8,153,33,128,129,136,153,50,186,55,188,51,249,64,178, 27, 128, - 48,177,156,18,35,175,51,189,32,51,234,155,69,184,26,2,152,9,17,136,144,137,50,235,115,216,24,2,170,67,187,49,129,155,4,27,129,56,232,43,39,203,40,3,154,169,66,184,114,224,25,2,9,128,11,35,155,18,11,202,84,169,26,5,154,8,160,98,185,17,187,50, 23, 188, 33, - 1,139,4,154,90,147,12,3,43,2,170,171,103,193,28,132,137,8,129,24,170,50,201,42,35,202,169,52,201,33,218,40,39,203,0,40,147,29,163,139,83,185,1,4,159,34,160,12,21,155,40,129,137,58,151,13,2,136,144,16,153,40,17,131,207,51,144,140,4,154,17,146,170,73, 163, - 44,164,12,152,37,203,17,128,144,139,23,154,128,138,38,216,41,1,0,233,73,131,171,49,136,9,164,46,3,171,32,0,145,157,38,187,64,176,58,134,155,18,136,217,64,1,200,140,38,153,170,66,161,8,169,65,185,98,200,41,3,155,144,58,23,187,1,145,40,147,189,32, 68, 249, - 1,112,255,199,195,19,108,76,187,247,247,183,40,168,212,245,199,227,68,45,59,10,145,177,198,24,130,76,26,193,180,129,0,162,42,160,199,162,0,16,152,137,132,168,195,130,162,181,227,163,161,179,211,180,179,164,128,162,161,194,164,179,40,153,195,213,146, 178, - 147,176,50,186,161,196,151,58,16,28,162,160,131,122,155,33,241,146,128,40,26,128,154,36,170,89,59,9,24,144,77,161,8,177,112,139,33,232,148,24,41,61,9,26,162,32,30,58,153,32,59,73,59,11,79,137,57,9,49,30,24,153,131,25,106,61,153,73,28,56,27, 41, 137, 148, - 76,43,74,58,13,161,3,171,149,32,77,10,74,42,168,16,0,123,138,129,162,178,225,50,140,161,0,147,10,129,41,244,210,165,1,152,24,162,184,166,32,144,59,216,132,177,8,145,67,143,146,160,183,162,130,24,192,32,225,146,144,33,44,73,30,129,137,32,76, 152, 25, 161, - 2,154,32,177,132,232,2,136,210,128,149,177,32,58,27,168,225,133,8,44,107,136,25,136,17,26,58,46,16,11,145,17,144,79,136,144,136,145,152,33,31,162,130,200,82,153,74,137,147,26,0,13,133,170,149,16,192,0,178,0,128,152,182,150,9,16,9,137,33,59,63,10,152, 32, - 179,192,5,154,228,182,145,130,144,42,128,242,2,136,41,168,17,76,57,31,129,136,17,47,8,41,138,32,138,123,59,58,10,136,161,4,46,25,145,136,129,25,56,28,91,41,154,108,9,16,44,24,137,48,15,0,194,162,41,194,56,241,163,146,0,139,7,186,150,129,152,1,208,33,176, - 136,164,163,185,7,138,130,242,162,163,177,88,136,184,166,146,0,25,25,177,199,146,16,136,9,145,178,178,0,147,138,229,18,152,25,144,163,246,162,129,129,184,5,152,178,145,148,136,146,95,152,128,144,33,170,81,11,40,202,131,0,243,24,1,11,148,42, 24, 163, 140, - 120,9,76,58,153,145,56,30,72,46,42,9,8,57,91,76,59,26,160,129,41,76,10,57,192,163,129,16,225,2,27,40,200,48,91,226,40,145,43,177,177,182,196,145,33,184,165,17,192,163,194,129,211,128,162,197,129,0,136,211,146,8,162,144,0,167,160,1,176,150,137,1, 24, 243, - 0,129,145,25,123,169,130,168,132,41,63,42,136,137,120,26,136,8,24,89,29,58,177,193,147,1,26,162,176,167,180,8,49,28,29,178,162,88,43,42,57,43,61,8,29,129,128,128,123,137,24,243,16,136,16,46,0,169,149,128,1,60,153,72,154,90,25,25,25,8,91,73,12,16,137,144, - 72,11,8,167,128,129,9,138,166,193,147,162,123,137,145,1,162,26,1,219,147,129,210,147,243,1,243,16,144,145,160,131,200,4,59,75,57,218,2,178,77,24,60,11,147,10,50,141,64,27,185,122,161,41,128,90,136,24,46,16,139,16,24,28,124,9,41,8,26,121,10,42,40,139,129, - 0,201,135,137,56,176,176,35,215,145,1,26,145,144,160,135,138,1,177,146,146,161,65,242,136,164,177,1,1,186,151,208,148,129,10,32,241,145,163,178,17,168,136,151,168,2,148,185,133,176,130,129,154,163,215,0,146,136,40,211,161,131,171,81,144,170, 21, 184, 56, - 195,168,133,177,91,16,187,5,145,153,66,172,18,177,42,120,138,27,134,26,106,42,138,146,184,66,75,46,41,168,0,145,57,91,75,27,24,27,48,169,40,122,9,109,10,8,177,146,16,74,30,129,160,162,146,41,124,138,24,145,152,3,1,14,3,139,1,192,161,151,177,122,8, 10, 0, - 176,130,129,27,88,225,0,2,154,129,129,193,49,203,81,153,226,33,0,30,0,176,179,18,9,96,156,162,148,160,129,2,29,195,128,0,56,156,20,232,129,128,32,10,144,74,183,9,145,162,1,162,138,23,171,1,164,224,34,43,43,177,200,135,161,91,57,154,177,148, 145, 146, 58, - 108,136,170,35,208,177,34,128,44,129,155,151,243,16,1,154,72,193,144,18,11,122,160,153,5,192,24,130,184,132,226,0,128,153,131,181,136,65,154,128,17,170,39,28,59,144,168,80,25,47,24,26,144,32,47,41,153,161,148,8,92,9,9,129,144,33,26,47,24,137,108, 25, 10, - 17,10,73,75,47,24,184,48,8,45,57,138,136,150,10,48,139,136,35,203,121,8,27,179,161,106,0,29,16,176,179,3,185,19,227,41,145,168,61,197,177,20,10,57,42,250,147,196,16,41,138,24,195,208,135,137,0,145,160,2,210,146,195,177,132,136,153,167,210,146,162, 40, 8, - 138,148,227,145,17,137,40,169,179,130,242,2,196,9,146,145,169,167,146,130,137,136,51,220,17,163,28,74,10,76,40,140,5,137,43,18,12,107,137,40,8,201,50,0,143,3,138,161,134,138,104,169,16,162,160,121,25,28,129,152,32,56,14,16,184,146,3,46,25, 176, 129, 179, - 193,17,130,202,135,8,57,25,154,148,184,120,9,153,211,165,24,128,26,17,242,161,18,185,81,42,11,17,12,25,181,137,66,42,47,41,184,166,129,24,91,27,136,196,0,0,74,28,178,161,149,160,32,8,225,32,128,59,8,169,50,139,47,72,186,16,132,9,122,9,160,146,144,89,153, - 10,149,178,0,121,11,146,152,162,48,13,123,177,24,0,106,27,9,144,132,12,17,0,168,0,181,56,169,129,242,195,129,17,154,64,161,244,16,137,24,144,144,164,129,75,42,176,149,9,179,148,203,4,166,136,163,128,227,163,8,57,11,30,165,0,74,59,62,9,208,131,144,40, 76, - 26,27,196,129,1,25,43,49,174,67,153,136,106,152,41,25,28,2,43,44,104,45,59,8,43,128,144,120,25,12,17,152,9,130,155,151,145,74,40,13,48,192,58,90,43,43,177,146,49,31,75,24,217,131,0,76,26,152,149,161,24,74,154,193,166,145,32,27,161,164,176,135,152,24,193, - 162,146,164,58,227,193,148,161,128,18,234,130,180,145,2,200,1,163,186,98,184,129,149,153,49,42,186,151,242,129,1,43,8,177,212,165,8,40,137,24,8,144,90,9,25,48,44,46,24,138,40,144,108,58,27,128,181,128,80,29,42,152,162,130,25,106,136,11,148,8,144,128,136, - 112,139,80,153,24,136,129,46,0,60,129,208,1,3,13,57,168,144,1,242,17,9,26,2,185,27,55,140,73,137,179,16,192,3,145,143,33,9,171,135,160,17,137,10,151,168,3,178,44,17,208,144,167,0,40,155,16,167,152,18,144,26,160,199,1,136,91,136,160,178,150,161,1,10, 181, - 145,161,1,145,161,198,2,9,90,137,177,160,150,40,29,129,144,145,162,57,77,169,16,148,42,42,40,141,34,170,121,154,210,131,162,107,8,9,160,195,40,73,139,18,224,162,34,139,0,244,178,163,24,26,146,194,166,49,29,42,137,130,192,16,93,128,154,19,59, 11, 122, 11, - 146,177,120,42,26,43,164,152,17,60,63,137,128,48,10,58,92,9,59,91,75,139,32,25,25,61,74,28,177,40,130,74,29,73,168,130,128,48,14,8,77,9,25,26,179,211,32,78,26,41,152,161,180,89,59,9,153,166,160,3,26,57,106,154,88,184,40,1,27,58,73,143,131,169,3,161, 184, - 122,152,16,181,145,129,17,15,129,193,147,145,192,33,193,162,183,163,136,178,129,178,197,2,41,216,131,168,163,181,226,163,178,1,33,187,166,212,129,1,27,24,162,184,151,8,16,160,144,181,210,72,168,128,32,42,25,40,142,5,185,88,58,11,58,177,32,129,63,42, 136, - 186,53,29,75,58,144,144,129,77,128,11,144,133,29,40,152,24,161,129,80,155,60,3,12,89,8,60,152,152,49,136,47,57,224,129,16,41,90,139,162,147,170,51,169,27,17,95,26,26,160,5,139,48,76,10,228,146,1,136,44,161,147,209,130,137,73,224,1,162,195,32,210,177,180, - 179,148,145,154,132,242,146,1,152,32,192,1,144,155,7,177,168,5,138,178,148,152,150,136,89,152,9,41,196,145,40,28,16,8,10,178,167,24,1,44,123,137,136,145,194,48,27,74,26,192,179,135,136,88,27,10,177,163,164,128,73,24,31,8,0,192,149,144,129,9,106, 41, 200, - 161,151,41,138,0,24,226,162,49,42,11,90,136,136,152,17,145,10,63,40,11,56,245,162,16,26,73,11,144,135,137,58,106,10,25,8,57,137,28,33,129,156,113,10,10,161,18,8,153,77,3,217,0,1,242,128,193,18,128,75,60,178,154,37,45,58,29,144,1,184,66,41,29, 8, 145, 10, - 194,33,148,170,107,89,139,128,163,178,16,63,59,176,144,151,129,42,74,10,129,192,2,128,154,97,192,0,177,128,178,183,16,16,155,149,145,184,84,138,8,192,161,20,225,0,130,138,165,0,28,148,153,18,209,128,88,153,89,152,9,17,9,29,130,43,122,153,24, 32, 202, 49, - 24,43,106,154,130,193,27,51,29,28,133,138,65,11,123,25,10,40,152,44,130,26,43,148,45,73,140,33,8,153,88,128,61,144,42,59,225,128,18,155,50,75,186,20,202,120,144,42,92,176,162,165,25,2,169,152,135,185,19,152,8,146,160,123,195,137,132,209,0,16, 11, 2, 242, - 146,164,152,73,193,136,130,178,1,136,169,23,169,128,164,242,129,178,129,32,138,180,167,153,132,8,138,2,209,4,138,1,128,138,92,136,44,129,136,162,33,63,40,141,2,160,144,106,137,64,155,17,129,60,30,146,26,17,28,48,46,169,51,154,91,137,41,26,32,143,18, 138, - 1,32,28,123,177,9,181,195,56,57,14,145,161,17,17,31,41,152,145,194,194,20,153,41,9,243,129,180,0,128,45,16,43,170,135,144,16,25,42,137,242,163,194,16,0,57,14,130,194,178,16,33,30,8,59,211,163,160,5,137,44,10,17,170,3,120,9,44,146,136,131,140, 91, 9, 171, - 7,161,32,73,13,8,161,40,106,11,25,129,59,0,49,31,42,28,40,11,0,81,176,61,32,138,25,178,241,148,136,106,8,136,128,177,90,8,155,96,176,9,18,217,132,129,10,81,156,40,178,161,36,169,76,147,203,150,0,10,146,200,147,149,128,144,148,154,182,24,0,137,11,134,211, - 24,136,129,145,209,33,8,43,163,243,88,41,13,0,160,145,33,31,32,185,145,4,155,17,32,47,161,128,73,160,44,56,176,75,74,12,35,141,104,137,9,89,152,58,56,44,41,30,41,40,157,48,128,154,88,41,42,8,14,3,184,59,120,152,9,56,10,128,41,57,227,186,52,152,62, 8, 56, - 242,0,58,8,156,34,243,128,24,176,51,169,58,183,192,146,164,177,18,170,7,177,208,132,161,24,136,27,147,243,128,133,10,24,161,161,178,214,17,160,25,16,161,137,165,192,48,27,72,58,218,133,162,26,72,27,10,197,178,49,138,89,56,142,1,24,11,0,44,105, 10, 25, 0, - 194,9,3,47,8,138,147,18,28,48,202,147,199,146,25,161,0,145,194,163,57,11,146,248,130,32,57,63,154,16,48,14,128,144,209,133,26,56,154,182,162,195,18,152,44,194,180,168,5,24,137,138,35,192,232,66,176,161,24,41,26,244,129,163,160,75,129,226,147,40, 145, 61, - 13,130,177,17,137,112,170,130,0,136,75,152,177,241,34,0,59,156,51,186,178,91,132,137,137,122,1,45,28,50,172,57,108,8,26,136,32,152,46,144,131,171,4,152,18,141,148,1,216,32,9,60,169,66,152,128,72,90,201,1,17,201,136,3,195,26,73,133,200,176, 150, 146, 169, - 24,33,178,184,151,73,11,28,72,44,153,82,153,17,42,57,78,153,8,160,0,1,123,11,19,171,195,18,59,31,129,10,162,2,58,96,142,130,26,75,128,176,17,180,123,9,90,137,211,145,32,26,76,43,145,130,12,90,41,27,58,160,160,128,178,7,76,59,0,203,180,147,33,62,10,0,243, - 129,146,73,29,145,144,0,26,56,153,185,83,8,76,27,166,161,193,146,131,224,145,165,161,40,168,149,162,226,2,136,138,163,131,211,0,59,146,218,148,1,192,16,16,58,248,88,144,177,136,1,58,45,9,195,197,147,48,29,10,0,162,176,64,122,9,10,17,9,153,56, 75, 27, 31, - 72,136,9,129,129,61,45,59,10,161,18,122,43,59,41,169,34,155,130,131,219,120,162,27,49,208,160,131,156,66,12,145,50,240,16,136,12,162,40,129,130,15,129,162,146,180,83,139,58,217,129,177,4,0,169,197,163,144,242,131,168,179,179,17,197,145,178,164, 128, 160, - 211,2,244,163,145,162,129,212,177,163,17,208,163,195,180,57,24,170,182,164,129,0,60,60,169,149,162,177,122,26,24,136,136,133,43,27,178,56,77,24,128,240,0,2,44,46,8,128,193,146,64,27,42,16,193,25,0,192,148,11,52,47,153,147,243,0,24,73,28,144, 161, 150, 9, - 8,73,170,2,162,25,27,147,167,131,29,1,168,200,165,16,91,137,8,162,176,35,41,31,24,169,50,168,58,123,144,48,128,13,73,169,144,16,57,123,44,200,163,56,153,80,10,176,146,57,94,8,152,131,9,168,125,26,145,177,132,137,41,60,26,144,243,32,192,34,60, 43, 26, 16, - 249,164,16,58,61,11,130,243,146,2,42,44,27,128,165,137,49,45,28,16,43,8,211,48,28,152,105,9,9,163,161,169,35,107,42,232,164,130,168,72,42,168,210,148,144,136,129,3,217,194,50,27,192,41,210,147,40,76,226,1,161,1,155,132,145,147,171,67,173,210,132,161,106, - 137,56,169,209,131,64,13,129,9,194,17,57,61,169,17,128,40,31,16,10,162,57,61,75,139,40,242,17,58,59,138,179,144,50,105,140,179,243,57,40,26,9,243,130,24,29,57,128,210,129,25,59,91,137,162,178,72,27,181,168,19,129,8,184,231,147,178,32,28,184,198,148, 144, - 1,26,128,16,192,2,26,144,244,129,0,16,10,197,177,181,1,41,9,178,165,211,129,25,145,137,210,147,152,210,163,132,194,17,91,169,145,181,130,9,89,137,152,178,4,128,9,63,160,128,106,8,25,43,10,32,47,26,123,152,24,40,25,27,18,186,35,158,64,42,216,33,25,58, 58, - 45,184,147,29,72,46,9,0,178,146,58,77,26,25,209,165,128,145,17,153,128,129,148,240,129,1,40,31,0,152,242,163,16,59,44,24,243,146,128,1,26,26,179,213,145,130,176,131,40,25,145,219,179,167,8,33,59,14,176,166,16,136,74,128,176,128,149,8,8,209,148,152,0, 72, - 153,161,178,35,62,75,154,163,153,19,62,170,133,179,136,89,12,129,164,144,3,47,58,193,177,148,0,61,43,10,129,17,41,61,43,25,8,126,26,25,137,145,34,44,45,129,216,179,1,90,25,137,32,227,8,16,9,170,49,31,32,29,128,145,148,75,25,75,153,162,192,35,12, 80, 136, - 176,8,194,24,1,176,21,154,145,80,251,130,2,30,9,8,130,145,128,98,27,26,129,136,162,15,33,168,59,65,177,77,141,1,128,168,113,10,137,178,163,146,132,74,153,224,164,33,184,19,184,228,161,17,91,152,25,146,152,44,121,9,160,145,17,25,28,93,128,152,2,25,27,161, - 210,129,146,45,179,227,163,162,9,40,193,148,179,57,107,140,196,32,25,57,47,136,210,130,24,40,28,152,210,182,145,40,8,129,184,147,147,140,163,166,160,34,45,144,194,161,134,41,46,152,162,162,3,44,58,75,209,162,144,57,129,47,152,130,59,16,248,129,17,26, 57, - 9,29,167,2,60,42,138,136,209,130,90,42,42,176,146,178,120,28,8,160,145,16,33,31,1,8,160,129,128,242,164,32,152,177,146,213,196,128,40,26,160,163,180,146,108,60,144,144,136,147,137,40,90,161,3,17,219,243,33,184,130,60,136,243,178,179,132,26,8,168,212,147, - 16,57,42,31,145,145,160,32,43,184,66,45,180,33,140,226,1,91,152,16,144,193,162,48,77,25,137,153,17,178,78,0,0,16,14,90,152,153,19,129,13,123,137,129,160,1,73,44,9,129,0,153,120,10,9,162,195,32,139,28,151,161,2,128,26,45,193,146,48,29,146,153, 194, 5, 59, - 29,128,144,195,1,64,43,208,178,149,8,9,16,240,163,129,16,42,185,181,211,24,48,45,137,149,9,24,41,75,184,177,4,43,91,128,180,16,144,29,25,184,167,1,59,60,153,148,161,146,91,42,186,4,24,145,123,11,2,178,77,136,26,25,195,40,115,61,27,168,177,3,59,79,26, 25, - 144,1,48,13,56,154,248,1,16,9,129,8,2,178,31,130,153,162,20,15,33,170,56,40,29,28,128,152,149,144,56,120,11,162,212,129,144,145,59,180,243,147,145,144,16,152,48,241,0,161,176,1,134,10,129,200,166,144,128,121,26,24,177,178,196,48,75,138,41,180,195,26, 24, - 89,138,24,33,187,41,84,155,57,79,136,160,210,130,0,58,58,168,243,132,27,41,75,138,3,8,61,8,29,145,179,76,24,28,146,208,2,49,140,75,196,144,0,40,44,179,208,3,176,33,15,177,2,160,106,8,160,164,164,8,73,27,226,179,161,1,57,1,196,211,128,40,156,145,166, 178, - 131,29,128,145,162,165,40,27,216,146,135,144,40,160,194,177,145,20,139,200,151,178,17,136,40,25,205,130,17,11,17,129,156,38,26,25,137,179,163,11,79,16,12,146,147,143,89,25,136,136,25,48,26,46,129,40,29,42,29,8,145,2,56,27,62,8,25,212,161,48,43, 144, 129, - 29,145,144,41,106,10,107,43,184,131,1,36,61,13,138,2,194,1,16,27,75,186,181,151,8,1,161,138,211,129,2,59,248,129,16,0,144,63,152,150,136,24,25,128,30,161,128,17,24,225,146,10,16,0,9,227,183,129,40,60,26,162,194,181,24,90,9,24,0,176,161,193,194,35,12, 63, - 8,210,162,1,32,78,28,152,164,144,16,48,45,137,162,147,168,152,98,27,43,33,12,160,165,129,137,63,41,153,153,151,16,91,26,8,8,9,56,10,46,24,146,57,168,160,166,241,129,32,140,16,145,179,164,137,113,138,208,131,26,25,1,42,178,196,106,24,171,18,196,8, 18, 29, - 41,194,128,3,249,57,162,152,48,184,120,160,208,33,137,74,57,187,149,129,26,35,158,72,128,168,32,26,25,180,75,2,136,15,163,161,136,120,27,41,160,128,182,56,60,25,12,178,151,128,168,72,10,152,4,177,26,147,137,113,44,42,33,220,2,152,41,82,11, 210, 163, 184, - 133,162,10,196,128,3,234,40,149,152,161,1,44,129,194,4,225,16,58,168,24,194,146,146,154,49,21,218,33,152,248,129,194,147,0,28,1,195,162,20,140,42,25,160,198,1,33,136,142,3,25,24,141,16,177,208,112,0,138,41,160,130,45,60,32,170,73,24,75,59,161,176,49,159, - 97,26,168,149,145,32,28,25,184,211,129,179,74,73,8,153,136,193,151,160,32,48,143,9,147,181,145,32,60,9,187,133,166,144,32,152,25,136,161,150,168,145,81,10,42,0,169,182,148,136,58,41,187,182,211,131,16,137,25,243,144,129,2,9,8,202,7,25,185,21,144,136,153, - 65,184,137,56,151,10,153,49,16,145,14,56,176,11,192,19,89,91,44,168,147,2,8,147,63,27,1,136,229,129,73,26,136,26,137,81,170,147,77,72,12,42,42,192,24,104,91,26,27,65,177,27,32,41,60,14,136,17,170,150,129,24,58,11,16,251,162,19,57,31,0,152,129,145,17, 61, - 14,1,129,27,129,66,169,178,74,12,11,19,198,145,75,33,138,174,133,1,184,57,40,136,169,20,1,60,174,20,154,201,67,26,162,151,42,16,138,59,130,204,20,169,59,180,59,114,184,56,178,242,128,130,43,8,194,3,229,144,33,185,144,34,181,145,168,17,149,153,74,35, 220, - 129,128,1,88,59,75,225,136,130,168,17,144,12,151,8,25,179,8,1,240,16,8,25,145,211,41,130,138,115,169,160,163,168,84,154,74,0,170,144,211,149,2,30,128,137,9,149,1,144,58,60,57,153,178,150,17,29,27,74,25,195,152,56,15,1,25,26,152,149,80,153,57,73,140, 128, - 160,144,113,27,56,28,25,4,42,44,137,60,171,130,50,240,8,5,139,145,1,105,137,200,80,137,145,146,178,179,160,46,16,240,195,131,128,144,24,164,198,128,0,136,137,131,194,165,177,2,161,147,11,144,188,181,148,144,23,0,28,224,128,131,192,32,1,224,1,168,132,145, - 9,41,208,58,137,179,151,145,16,1,30,8,145,178,1,47,32,186,72,169,146,75,8,41,48,136,89,13,48,9,10,124,26,11,42,32,129,91,77,16,12,128,42,57,138,10,60,2,63,9,0,93,128,152,90,8,10,24,40,44,144,29,49,188,48,72,25,30,177,33,128,186,120,129,186,133, 152, 130, - 24,156,51,154,8,226,2,56,155,2,179,233,167,128,24,129,176,136,151,8,184,0,33,224,152,21,177,24,10,163,16,250,17,130,171,83,137,136,37,12,56,242,154,17,160,145,82,13,3,201,128,18,137,24,162,63,162,8,107,178,128,57,158,32,24,200,18,0,106,154,73,16, 248, 8, - 73,137,57,75,0,128,12,65,137,59,75,28,144,129,122,0,58,140,160,195,145,105,56,28,153,145,164,88,8,28,25,153,9,162,113,89,153,136,33,234,147,128,41,72,11,138,151,144,145,16,43,58,248,130,178,42,4,40,10,196,154,147,216,24,7,136,10,161,148,210,161, 98, 138, - 137,128,146,176,33,105,27,43,163,49,185,6,10,136,43,67,174,161,162,151,137,1,64,200,193,24,64,200,56,145,242,24,57,137,1,128,3,162,175,80,128,162,152,25,58,175,17,17,0,200,64,168,162,91,1,154,44,211,177,35,64,160,161,144,4,241,41,209,162,25,1,3,242, 176, - 134,153,42,41,136,135,154,2,130,46,41,161,153,180,145,34,26,46,18,242,137,146,129,25,128,11,151,161,40,179,27,122,168,59,137,181,50,172,36,56,15,9,129,137,128,75,2,58,12,52,141,8,24,58,153,157,122,145,9,1,80,27,184,32,74,219,50,57,168,153,180,48,28, 143, - 131,144,178,65,13,48,168,162,147,155,121,9,170,5,16,153,21,29,144,161,91,0,184,57,128,137,17,159,88,178,128,105,152,9,162,33,164,141,88,178,224,1,0,16,27,185,150,161,9,4,139,16,128,160,194,144,65,180,46,40,136,27,135,160,16,44,57,145,236,2,195,40,75,177, - 2,200,179,146,186,104,50,141,24,169,165,148,11,97,10,11,130,177,49,57,78,42,154,128,165,59,33,28,30,1,136,16,192,41,128,152,123,136,24,1,169,113,10,11,49,153,14,147,19,45,43,8,176,210,148,8,16,11,96,144,192,163,150,10,128,43,26,150,178,165,24,41,171, 18, - 27,215,1,8,128,136,40,35,208,11,161,193,18,73,154,133,155,165,164,10,49,154,8,199,0,2,168,64,192,0,40,162,43,202,180,150,10,106,24,185,145,131,184,113,43,24,162,187,73,146,42,81,171,121,58,155,151,16,43,32,31,9,160,146,17,136,94,10,24,145,25, 9, 130, 59, - 65,13,91,25,169,146,176,112,42,59,16,217,130,20,13,25,9,40,161,138,68,169,154,18,62,154,180,145,135,152,56,58,155,165,211,8,40,42,10,198,1,2,184,57,184,224,51,154,27,134,168,19,202,73,75,184,35,176,75,24,25,209,51,157,19,30,184,179,3,33,148,45, 232, 146, - 129,168,41,32,170,149,193,35,136,16,50,191,56,146,173,149,16,24,41,30,129,168,209,3,57,31,0,16,176,147,41,152,10,17,181,14,40,144,49,170,75,97,141,25,162,146,72,177,92,137,137,19,137,153,113,154,2,41,60,129,217,2,211,152,73,42,193,197,146,147, 10, 59, 0, - 192,196,132,41,160,25,88,169,16,40,241,1,153,81,28,10,147,161,209,88,75,9,161,162,180,16,43,57,235,33,56,156,129,144,2,135,31,128,145,136,163,56,59,154,57,167,160,105,137,0,138,163,3,41,47,185,211,131,41,41,60,139,182,146,16,16,43,242,144,145,129,16,179, - 183,1,26,9,147,240,131,160,91,74,152,184,166,178,33,140,9,4,162,233,34,136,129,144,163,60,142,144,149,128,33,73,13,161,194,131,0,26,56,142,128,163,128,1,233,56,209,41,145,194,147,179,149,64,30,8,128,216,18,24,43,43,32,153,25,74,109,137,153,48,8,137, 122, - 25,144,26,43,59,30,33,41,27,24,96,153,160,50,76,27,47,152,145,163,73,40,14,152,131,176,74,90,8,8,200,67,155,154,50,49,155,28,124,177,152,1,2,17,62,138,180,176,4,25,9,177,245,162,129,40,25,176,164,130,172,4,8,181,194,49,11,168,154,165,133,152,40,136, 226, - 179,19,26,185,16,167,194,16,25,57,243,136,147,1,31,25,184,132,160,33,62,138,129,130,41,121,137,153,145,26,17,107,136,179,1,61,60,26,162,168,148,64,31,25,32,168,152,64,31,137,8,129,33,62,24,137,8,16,59,47,153,33,162,91,59,41,170,145,5,43,60,41,13,178,134, - 57,153,12,194,227,8,2,128,57,208,162,19,216,32,178,25,128,160,48,194,195,37,155,10,33,251,163,146,16,136,12,166,195,160,148,129,176,147,178,150,160,72,162,162,193,162,60,200,145,5,144,25,122,216,129,161,130,0,10,73,1,241,2,9,168,33,13,161,165,24,64, 203, - 50,1,14,9,9,129,161,106,33,27,13,164,128,40,41,107,169,160,33,136,60,92,168,152,2,91,57,176,129,0,144,47,136,162,164,128,80,43,154,179,213,130,74,27,0,145,145,167,58,59,160,9,26,76,8,171,5,49,28,44,169,162,183,130,72,28,144,179,228,2,25,26,129, 186, 151, - 1,75,128,169,17,178,15,57,170,16,166,16,57,8,139,162,181,1,8,152,164,181,41,81,43,10,242,145,57,139,89,8,193,18,154,32,176,10,165,129,137,147,177,134,0,25,25,201,147,227,129,72,59,185,167,128,129,160,91,25,176,130,147,145,9,160,5,202,17,16, 186, 136, 37, - 177,56,76,42,169,186,48,9,145,57,24,128,41,169,134,137,145,147,28,41,168,131,228,32,27,9,60,129,178,64,60,45,25,9,24,152,49,31,136,57,42,0,25,12,181,18,153,57,96,169,177,132,153,123,9,152,129,177,17,74,43,24,169,128,121,137,25,1,139,96,42,10,146,178, 18, - 44,29,1,161,164,146,31,137,146,177,19,1,10,26,209,165,146,43,40,138,240,130,18,144,25,40,212,1,58,11,152,196,147,10,74,26,152,225,130,146,58,60,210,145,16,148,16,185,192,18,44,42,57,199,162,1,9,87,47,186,215,231,197,179,180,195,212,164,32,59,92, 126, 62, - 41,59,76,59,60,168,179,213,197,163,72,44,25,74,126,127,127,79,26,177,148,90,27,225,247,165,0,152,147,123,138,211,164,72,126,127,46,210,196,163,228,215,64,11,210,180,1,8,58,153,1,224,149,57,76,27,24,76,42,43,136,128,243,179,130,106,60,42,42,92,28,243,231, - 147,24,57,44,58,94,45,8,57,139,214,148,40,77,26,9,16,10,144,64,62,43,25,123,59,138,162,48,63,26,41,92,60,43,176,3,59,232,214,164,16,75,75,76,60,153,179,33,62,26,136,40,75,169,197,163,129,57,60,59,75,138,145,64,63,138,179,1,42,136,90,43,176,214,180,1, 25, - 152,195,129,129,106,76,60,137,145,178,2,25,10,228,130,57,59,44,41,154,165,105,76,44,144,16,76,26,41,76,26,152,1,58,26,9,193,165,16,92,26,41,77,59,76,76,60,26,136,161,130,152,195,163,211,146,0,57,11,211,130,8,25,40,62,153,162,17,109,60,153,146,40, 76, 60, - 26,160,179,211,163,32,60,42,153,179,194,199,130,24,58,43,58,27,128,161,195,129,226,196,147,90,59,75,44,136,128,145,160,148,123,59,42,26,41,26,57,27,192,215,147,57,59,27,161,145,213,130,106,76,43,9,144,162,129,177,181,130,136,194,146,40,10,129,25,210,146, - 178,197,196,179,196,130,8,41,9,144,178,130,209,182,17,92,43,176,147,144,212,130,136,0,177,130,73,62,10,161,130,91,75,59,43,57,46,25,41,77,10,177,164,16,26,136,210,197,179,130,128,57,77,43,25,75,10,227,179,180,179,146,128,57,185,183,163,145,0,8,8,10, 119, - 114,120,16,210,244,60,28,41,25,152,149,56,161,35,44,89,27,24,136,24,164,211,17,233,176,136,192,129,179,17,17,25,0,10,46,160,132,49,66,24,132,177,147,193,56,72,26,29,232,168,176,12,137,41,139,147,9,1,41,15,91,136,35,148,21,18,48,40,1,168,167,144,0,42,172, - 177,204,193,155,232,152,152,26,152,41,146,17,6,4,65,34,35,135,4,16,32,9,24,186,176,0,250,153,204,186,173,154,153,177,3,65,41,34,145,134,35,65,98,49,50,50,2,33,169,138,155,175,170,172,204,192,138,234,136,155,136,10,32,18,5,52,48,24,162,17,67,54,66,51, 34, - 131,184,174,234,153,10,9,40,0,152,251,168,142,154,9,16,33,49,33,128,154,170,156,34,54,54,33,68,0,1,136,201,137,26,88,48,35,99,8,152,189,189,187,155,171,16,24,130,145,188,175,203,144,49,115,67,67,50,19,2,1,0,0,130,131,1,136,206,216,188,203, 204, 187, 187, - 156,153,0,0,51,17,34,24,112,20,69,67,67,34,19,0,136,169,185,137,186,232,185,219,201,203,187,173,170,154,153,129,131,6,2,19,49,49,21,65,19,53,51,83,34,16,168,201,154,172,156,138,0,1,24,201,233,186,204,186,171,137,3,37,48,24,128,201,202,202,129,17, 48, 21, - 22,20,19,19,32,16,2,66,52,68,4,3,1,203,235,188,189,186,171,153,137,153,170,219,170,140,9,17,53,115,50,52,67,51,51,51,17,130,0,145,154,169,188,236,187,190,203,187,172,171,138,136,17,33,18,2,34,98,98,50,50,52,66,34,35,2,19,24,169,203,203,188,219, 169, 154, - 9,137,171,204,188,203,184,136,34,83,50,33,153,184,170,170,152,40,57,19,36,50,50,18,35,17,2,49,49,66,66,66,34,17,168,233,202,202,170,171,170,186,219,203,188,188,154,138,25,33,68,52,68,67,67,36,51,36,18,17,17,136,8,170,176,202,188,206,202,171,172,186, 169, - 153,8,25,144,128,1,34,68,52,68,51,52,34,49,18,34,2,144,136,155,140,187,186,186,154,154,185,185,153,9,9,0,24,0,128,144,168,169,170,154,154,153,9,8,16,8,0,144,19,35,68,51,52,67,51,66,34,50,33,1,144,185,186,172,204,187,188,173,172,186,172,186, 154, 138, 41, - 33,52,53,83,50,51,52,52,37,34,34,18,16,144,152,154,187,219,203,188,173,186,186,186,170,154,153,138,144,16,17,67,82,50,51,21,34,19,33,2,18,33,1,8,153,169,153,153,136,128,0,136,154,153,153,8,8,1,16,0,169,170,187,171,171,154,153,153,152,153,153,0,16,51, 83, - 66,50,67,50,51,67,51,52,35,18,136,186,219,187,189,186,171,187,173,187,188,187,203,138,9,16,33,50,52,53,67,67,147,8,128,128,128,128,128,128,128,128,0,240,255,55,232,23,220,0,148,1,9,18,148,10,189,32,163,62,160,5,137,12,149,42,153,144,34,42,8, 1, 138, 181, - 45,136,18,144,105,138,1,160,14,128,132,145,186,37,138,41,192,48,145,46,160,33,44,24,225,16,13,132,136,137,16,148,25,170,194,82,152,136,91,24,42,169,33,233,131,179,24,185,149,16,57,172,164,18,10,211,160,147,211,33,138,243,129,16,41,193,0,43, 132, 155, 73, - 58,145,244,145,43,35,9,171,16,110,25,8,28,74,162,128,26,27,82,45,136,153,18,8,136,8 + 0, 24, 1, 192, 1, 216, 2, 128, 4, 88, 23, 64, 27, 152, 1, 128, 29, 24, 2, 128, 31, 152, 0, 128, 136, 128, 128, 128, 0, 136, 97, 103, 153, 139, 34, 163, 72, 195, 27, 69, 1, 154, 137, 35, 8, 51, 169, 122, 164, 75, 133, 203, 81, 146, 168, 121, 185, 68, 202, 8, 33, 237, 49, 177, 12, 133, 140, 17, 160, 42, 161, 10, 0, 137, 176, 57, + 233, 41, 160, 136, 235, 65, 177, 137, 128, 26, 164, 28, 3, 157, 51, 137, 1, 152, 113, 161, 40, 146, 115, 192, 56, 5, 169, 66, 161, 56, 1, 50, 145, 59, 39, 168, 97, 1, 160, 57, 7, 153, 50, 153, 32, 2, 25, 129, 32, 20, 186, 66, 129, 24, 153, 164, 142, 130, 169, 153, 26, 242, 138, 217, 9, 128, 204, 58, 209, 172, 40, 176, 141, + 128, 155, 144, 203, 139, 0, 235, 9, 177, 172, 0, 185, 168, 138, 25, 240, 59, 211, 139, 19, 176, 90, 160, 17, 26, 132, 41, 1, 5, 25, 3, 50, 144, 115, 147, 42, 39, 152, 41, 3, 56, 193, 105, 130, 155, 66, 200, 26, 19, 218, 154, 49, 201, 171, 138, 176, 251, 139, 185, 172, 136, 189, 139, 145, 207, 41, 160, 171, 152, 186, 139, + 186, 141, 128, 218, 171, 51, 217, 170, 56, 163, 12, 4, 155, 81, 147, 42, 37, 152, 32, 54, 136, 49, 50, 48, 37, 32, 69, 0, 17, 50, 50, 83, 2, 16, 68, 20, 8, 66, 4, 154, 84, 145, 24, 33, 24, 32, 17, 18, 145, 32, 22, 168, 49, 163, 1, 33, 50, 184, 115, 129, 25, 66, 1, 24, 67, 2, 80, 35, 40, 53, 2, 65, 51, 19, 67, 37, 0, 52, 35, 49, 37, + 34, 49, 37, 17, 52, 17, 35, 35, 35, 34, 32, 49, 33, 152, 34, 145, 24, 24, 128, 138, 128, 184, 9, 177, 171, 168, 185, 155, 152, 172, 155, 186, 172, 185, 172, 155, 186, 173, 153, 202, 187, 185, 202, 170, 171, 202, 186, 169, 170, 170, 171, 139, 154, 171, 153, 154, 169, 10, 168, 154, 128, 168, 154, 0, 153, 152, 136, 137, + 128, 153, 0, 152, 8, 128, 137, 0, 136, 136, 8, 9, 8, 9, 8, 24, 153, 128, 136, 153, 144, 0, 161, 138, 1, 169, 136, 128, 160, 168, 152, 153, 138, 137, 154, 153, 153, 154, 153, 170, 168, 170, 185, 168, 169, 154, 169, 171, 153, 169, 170, 153, 152, 154, 153, 137, 169, 137, 136, 144, 152, 144, 128, 128, 144, 129, 129, 0, 33, + 0, 17, 17, 17, 33, 33, 18, 18, 34, 34, 34, 34, 34, 34, 35, 19, 35, 19, 35, 35, 18, 19, 18, 35, 18, 33, 0, 8, 8, 8, 8, 8, 8, 8, 160, 205, 65, 176, 171, 203, 16, 240, 95, 242, 120, 145, 156, 66, 177, 26, 19, 153, 9, 35, 35, 239, 56, 132, 138, 154, 50, 145, 203, 25, 32, 20, 237, 24, 130, 138, 160, 27, 39, 173, 50, 203, 64, 145, 139, + 18, 168, 48, 146, 171, 65, 18, 176, 12, 52, 128, 25, 5, 57, 240, 104, 161, 25, 129, 18, 188, 114, 160, 26, 36, 200, 154, 18, 1, 128, 186, 73, 162, 173, 32, 184, 25, 144, 137, 234, 8, 154, 32, 160, 158, 18, 187, 81, 2, 235, 41, 36, 144, 154, 17, 67, 128, 33, 160, 114, 146, 26, 37, 33, 232, 41, 130, 41, 178, 29, 50, 251, 24, + 1, 153, 138, 160, 76, 179, 155, 11, 0, 38, 252, 41, 146, 41, 178, 27, 193, 43, 39, 170, 136, 17, 129, 8, 49, 233, 48, 129, 11, 6, 26, 130, 136, 128, 64, 1, 248, 105, 145, 9, 16, 144, 140, 5, 25, 168, 16, 186, 48, 5, 171, 217, 57, 134, 171, 8, 34, 188, 20, 203, 41, 6, 155, 161, 89, 164, 140, 2, 136, 51, 202, 41, 131, 56, 144, + 8, 97, 144, 146, 13, 69, 200, 42, 130, 25, 152, 57, 6, 220, 88, 177, 26, 148, 9, 168, 8, 67, 192, 156, 65, 145, 137, 10, 4, 154, 18, 157, 67, 160, 154, 1, 50, 188, 82, 170, 82, 185, 49, 220, 97, 144, 10, 8, 16, 145, 9, 136, 18, 202, 51, 184, 141, 114, 179, 139, 24, 19, 8, 250, 121, 160, 40, 160, 10, 18, 152, 168, 42, 35, 216, + 187, 120, 145, 18, 156, 203, 84, 144, 9, 144, 26, 66, 161, 13, 1, 128, 17, 154, 18, 142, 6, 154, 65, 192, 29, 35, 186, 64, 192, 24, 9, 146, 56, 185, 16, 248, 121, 176, 40, 129, 136, 171, 96, 147, 140, 50, 203, 64, 144, 41, 128, 161, 187, 71, 200, 24, 129, 24, 217, 56, 20, 220, 24, 4, 169, 9, 1, 33, 201, 26, 134, 141, 51, 201, + 25, 16, 33, 235, 32, 144, 33, 153, 169, 99, 160, 11, 3, 136, 58, 210, 33, 203, 48, 163, 17, 219, 128, 140, 38, 8, 184, 141, 50, 131, 159, 33, 128, 153, 25, 18, 153, 88, 242, 43, 3, 9, 136, 157, 53, 202, 40, 145, 25, 2, 204, 105, 146, 156, 66, 152, 8, 153, 33, 128, 129, 136, 153, 50, 186, 55, 188, 51, 249, 64, 178, 27, 128, + 48, 177, 156, 18, 35, 175, 51, 189, 32, 51, 234, 155, 69, 184, 26, 2, 152, 9, 17, 136, 144, 137, 50, 235, 115, 216, 24, 2, 170, 67, 187, 49, 129, 155, 4, 27, 129, 56, 232, 43, 39, 203, 40, 3, 154, 169, 66, 184, 114, 224, 25, 2, 9, 128, 11, 35, 155, 18, 11, 202, 84, 169, 26, 5, 154, 8, 160, 98, 185, 17, 187, 50, 23, 188, 33, + 1, 139, 4, 154, 90, 147, 12, 3, 43, 2, 170, 171, 103, 193, 28, 132, 137, 8, 129, 24, 170, 50, 201, 42, 35, 202, 169, 52, 201, 33, 218, 40, 39, 203, 0, 40, 147, 29, 163, 139, 83, 185, 1, 4, 159, 34, 160, 12, 21, 155, 40, 129, 137, 58, 151, 13, 2, 136, 144, 16, 153, 40, 17, 131, 207, 51, 144, 140, 4, 154, 17, 146, 170, 73, 163, + 44, 164, 12, 152, 37, 203, 17, 128, 144, 139, 23, 154, 128, 138, 38, 216, 41, 1, 0, 233, 73, 131, 171, 49, 136, 9, 164, 46, 3, 171, 32, 0, 145, 157, 38, 187, 64, 176, 58, 134, 155, 18, 136, 217, 64, 1, 200, 140, 38, 153, 170, 66, 161, 8, 169, 65, 185, 98, 200, 41, 3, 155, 144, 58, 23, 187, 1, 145, 40, 147, 189, 32, 68, 249, + 1, 112, 255, 199, 195, 19, 108, 76, 187, 247, 247, 183, 40, 168, 212, 245, 199, 227, 68, 45, 59, 10, 145, 177, 198, 24, 130, 76, 26, 193, 180, 129, 0, 162, 42, 160, 199, 162, 0, 16, 152, 137, 132, 168, 195, 130, 162, 181, 227, 163, 161, 179, 211, 180, 179, 164, 128, 162, 161, 194, 164, 179, 40, 153, 195, 213, 146, 178, + 147, 176, 50, 186, 161, 196, 151, 58, 16, 28, 162, 160, 131, 122, 155, 33, 241, 146, 128, 40, 26, 128, 154, 36, 170, 89, 59, 9, 24, 144, 77, 161, 8, 177, 112, 139, 33, 232, 148, 24, 41, 61, 9, 26, 162, 32, 30, 58, 153, 32, 59, 73, 59, 11, 79, 137, 57, 9, 49, 30, 24, 153, 131, 25, 106, 61, 153, 73, 28, 56, 27, 41, 137, 148, + 76, 43, 74, 58, 13, 161, 3, 171, 149, 32, 77, 10, 74, 42, 168, 16, 0, 123, 138, 129, 162, 178, 225, 50, 140, 161, 0, 147, 10, 129, 41, 244, 210, 165, 1, 152, 24, 162, 184, 166, 32, 144, 59, 216, 132, 177, 8, 145, 67, 143, 146, 160, 183, 162, 130, 24, 192, 32, 225, 146, 144, 33, 44, 73, 30, 129, 137, 32, 76, 152, 25, 161, + 2, 154, 32, 177, 132, 232, 2, 136, 210, 128, 149, 177, 32, 58, 27, 168, 225, 133, 8, 44, 107, 136, 25, 136, 17, 26, 58, 46, 16, 11, 145, 17, 144, 79, 136, 144, 136, 145, 152, 33, 31, 162, 130, 200, 82, 153, 74, 137, 147, 26, 0, 13, 133, 170, 149, 16, 192, 0, 178, 0, 128, 152, 182, 150, 9, 16, 9, 137, 33, 59, 63, 10, 152, 32, + 179, 192, 5, 154, 228, 182, 145, 130, 144, 42, 128, 242, 2, 136, 41, 168, 17, 76, 57, 31, 129, 136, 17, 47, 8, 41, 138, 32, 138, 123, 59, 58, 10, 136, 161, 4, 46, 25, 145, 136, 129, 25, 56, 28, 91, 41, 154, 108, 9, 16, 44, 24, 137, 48, 15, 0, 194, 162, 41, 194, 56, 241, 163, 146, 0, 139, 7, 186, 150, 129, 152, 1, 208, 33, 176, + 136, 164, 163, 185, 7, 138, 130, 242, 162, 163, 177, 88, 136, 184, 166, 146, 0, 25, 25, 177, 199, 146, 16, 136, 9, 145, 178, 178, 0, 147, 138, 229, 18, 152, 25, 144, 163, 246, 162, 129, 129, 184, 5, 152, 178, 145, 148, 136, 146, 95, 152, 128, 144, 33, 170, 81, 11, 40, 202, 131, 0, 243, 24, 1, 11, 148, 42, 24, 163, 140, + 120, 9, 76, 58, 153, 145, 56, 30, 72, 46, 42, 9, 8, 57, 91, 76, 59, 26, 160, 129, 41, 76, 10, 57, 192, 163, 129, 16, 225, 2, 27, 40, 200, 48, 91, 226, 40, 145, 43, 177, 177, 182, 196, 145, 33, 184, 165, 17, 192, 163, 194, 129, 211, 128, 162, 197, 129, 0, 136, 211, 146, 8, 162, 144, 0, 167, 160, 1, 176, 150, 137, 1, 24, 243, + 0, 129, 145, 25, 123, 169, 130, 168, 132, 41, 63, 42, 136, 137, 120, 26, 136, 8, 24, 89, 29, 58, 177, 193, 147, 1, 26, 162, 176, 167, 180, 8, 49, 28, 29, 178, 162, 88, 43, 42, 57, 43, 61, 8, 29, 129, 128, 128, 123, 137, 24, 243, 16, 136, 16, 46, 0, 169, 149, 128, 1, 60, 153, 72, 154, 90, 25, 25, 25, 8, 91, 73, 12, 16, 137, 144, + 72, 11, 8, 167, 128, 129, 9, 138, 166, 193, 147, 162, 123, 137, 145, 1, 162, 26, 1, 219, 147, 129, 210, 147, 243, 1, 243, 16, 144, 145, 160, 131, 200, 4, 59, 75, 57, 218, 2, 178, 77, 24, 60, 11, 147, 10, 50, 141, 64, 27, 185, 122, 161, 41, 128, 90, 136, 24, 46, 16, 139, 16, 24, 28, 124, 9, 41, 8, 26, 121, 10, 42, 40, 139, 129, + 0, 201, 135, 137, 56, 176, 176, 35, 215, 145, 1, 26, 145, 144, 160, 135, 138, 1, 177, 146, 146, 161, 65, 242, 136, 164, 177, 1, 1, 186, 151, 208, 148, 129, 10, 32, 241, 145, 163, 178, 17, 168, 136, 151, 168, 2, 148, 185, 133, 176, 130, 129, 154, 163, 215, 0, 146, 136, 40, 211, 161, 131, 171, 81, 144, 170, 21, 184, 56, + 195, 168, 133, 177, 91, 16, 187, 5, 145, 153, 66, 172, 18, 177, 42, 120, 138, 27, 134, 26, 106, 42, 138, 146, 184, 66, 75, 46, 41, 168, 0, 145, 57, 91, 75, 27, 24, 27, 48, 169, 40, 122, 9, 109, 10, 8, 177, 146, 16, 74, 30, 129, 160, 162, 146, 41, 124, 138, 24, 145, 152, 3, 1, 14, 3, 139, 1, 192, 161, 151, 177, 122, 8, 10, 0, + 176, 130, 129, 27, 88, 225, 0, 2, 154, 129, 129, 193, 49, 203, 81, 153, 226, 33, 0, 30, 0, 176, 179, 18, 9, 96, 156, 162, 148, 160, 129, 2, 29, 195, 128, 0, 56, 156, 20, 232, 129, 128, 32, 10, 144, 74, 183, 9, 145, 162, 1, 162, 138, 23, 171, 1, 164, 224, 34, 43, 43, 177, 200, 135, 161, 91, 57, 154, 177, 148, 145, 146, 58, + 108, 136, 170, 35, 208, 177, 34, 128, 44, 129, 155, 151, 243, 16, 1, 154, 72, 193, 144, 18, 11, 122, 160, 153, 5, 192, 24, 130, 184, 132, 226, 0, 128, 153, 131, 181, 136, 65, 154, 128, 17, 170, 39, 28, 59, 144, 168, 80, 25, 47, 24, 26, 144, 32, 47, 41, 153, 161, 148, 8, 92, 9, 9, 129, 144, 33, 26, 47, 24, 137, 108, 25, 10, + 17, 10, 73, 75, 47, 24, 184, 48, 8, 45, 57, 138, 136, 150, 10, 48, 139, 136, 35, 203, 121, 8, 27, 179, 161, 106, 0, 29, 16, 176, 179, 3, 185, 19, 227, 41, 145, 168, 61, 197, 177, 20, 10, 57, 42, 250, 147, 196, 16, 41, 138, 24, 195, 208, 135, 137, 0, 145, 160, 2, 210, 146, 195, 177, 132, 136, 153, 167, 210, 146, 162, 40, 8, + 138, 148, 227, 145, 17, 137, 40, 169, 179, 130, 242, 2, 196, 9, 146, 145, 169, 167, 146, 130, 137, 136, 51, 220, 17, 163, 28, 74, 10, 76, 40, 140, 5, 137, 43, 18, 12, 107, 137, 40, 8, 201, 50, 0, 143, 3, 138, 161, 134, 138, 104, 169, 16, 162, 160, 121, 25, 28, 129, 152, 32, 56, 14, 16, 184, 146, 3, 46, 25, 176, 129, 179, + 193, 17, 130, 202, 135, 8, 57, 25, 154, 148, 184, 120, 9, 153, 211, 165, 24, 128, 26, 17, 242, 161, 18, 185, 81, 42, 11, 17, 12, 25, 181, 137, 66, 42, 47, 41, 184, 166, 129, 24, 91, 27, 136, 196, 0, 0, 74, 28, 178, 161, 149, 160, 32, 8, 225, 32, 128, 59, 8, 169, 50, 139, 47, 72, 186, 16, 132, 9, 122, 9, 160, 146, 144, 89, 153, + 10, 149, 178, 0, 121, 11, 146, 152, 162, 48, 13, 123, 177, 24, 0, 106, 27, 9, 144, 132, 12, 17, 0, 168, 0, 181, 56, 169, 129, 242, 195, 129, 17, 154, 64, 161, 244, 16, 137, 24, 144, 144, 164, 129, 75, 42, 176, 149, 9, 179, 148, 203, 4, 166, 136, 163, 128, 227, 163, 8, 57, 11, 30, 165, 0, 74, 59, 62, 9, 208, 131, 144, 40, 76, + 26, 27, 196, 129, 1, 25, 43, 49, 174, 67, 153, 136, 106, 152, 41, 25, 28, 2, 43, 44, 104, 45, 59, 8, 43, 128, 144, 120, 25, 12, 17, 152, 9, 130, 155, 151, 145, 74, 40, 13, 48, 192, 58, 90, 43, 43, 177, 146, 49, 31, 75, 24, 217, 131, 0, 76, 26, 152, 149, 161, 24, 74, 154, 193, 166, 145, 32, 27, 161, 164, 176, 135, 152, 24, 193, + 162, 146, 164, 58, 227, 193, 148, 161, 128, 18, 234, 130, 180, 145, 2, 200, 1, 163, 186, 98, 184, 129, 149, 153, 49, 42, 186, 151, 242, 129, 1, 43, 8, 177, 212, 165, 8, 40, 137, 24, 8, 144, 90, 9, 25, 48, 44, 46, 24, 138, 40, 144, 108, 58, 27, 128, 181, 128, 80, 29, 42, 152, 162, 130, 25, 106, 136, 11, 148, 8, 144, 128, 136, + 112, 139, 80, 153, 24, 136, 129, 46, 0, 60, 129, 208, 1, 3, 13, 57, 168, 144, 1, 242, 17, 9, 26, 2, 185, 27, 55, 140, 73, 137, 179, 16, 192, 3, 145, 143, 33, 9, 171, 135, 160, 17, 137, 10, 151, 168, 3, 178, 44, 17, 208, 144, 167, 0, 40, 155, 16, 167, 152, 18, 144, 26, 160, 199, 1, 136, 91, 136, 160, 178, 150, 161, 1, 10, 181, + 145, 161, 1, 145, 161, 198, 2, 9, 90, 137, 177, 160, 150, 40, 29, 129, 144, 145, 162, 57, 77, 169, 16, 148, 42, 42, 40, 141, 34, 170, 121, 154, 210, 131, 162, 107, 8, 9, 160, 195, 40, 73, 139, 18, 224, 162, 34, 139, 0, 244, 178, 163, 24, 26, 146, 194, 166, 49, 29, 42, 137, 130, 192, 16, 93, 128, 154, 19, 59, 11, 122, 11, + 146, 177, 120, 42, 26, 43, 164, 152, 17, 60, 63, 137, 128, 48, 10, 58, 92, 9, 59, 91, 75, 139, 32, 25, 25, 61, 74, 28, 177, 40, 130, 74, 29, 73, 168, 130, 128, 48, 14, 8, 77, 9, 25, 26, 179, 211, 32, 78, 26, 41, 152, 161, 180, 89, 59, 9, 153, 166, 160, 3, 26, 57, 106, 154, 88, 184, 40, 1, 27, 58, 73, 143, 131, 169, 3, 161, 184, + 122, 152, 16, 181, 145, 129, 17, 15, 129, 193, 147, 145, 192, 33, 193, 162, 183, 163, 136, 178, 129, 178, 197, 2, 41, 216, 131, 168, 163, 181, 226, 163, 178, 1, 33, 187, 166, 212, 129, 1, 27, 24, 162, 184, 151, 8, 16, 160, 144, 181, 210, 72, 168, 128, 32, 42, 25, 40, 142, 5, 185, 88, 58, 11, 58, 177, 32, 129, 63, 42, 136, + 186, 53, 29, 75, 58, 144, 144, 129, 77, 128, 11, 144, 133, 29, 40, 152, 24, 161, 129, 80, 155, 60, 3, 12, 89, 8, 60, 152, 152, 49, 136, 47, 57, 224, 129, 16, 41, 90, 139, 162, 147, 170, 51, 169, 27, 17, 95, 26, 26, 160, 5, 139, 48, 76, 10, 228, 146, 1, 136, 44, 161, 147, 209, 130, 137, 73, 224, 1, 162, 195, 32, 210, 177, 180, + 179, 148, 145, 154, 132, 242, 146, 1, 152, 32, 192, 1, 144, 155, 7, 177, 168, 5, 138, 178, 148, 152, 150, 136, 89, 152, 9, 41, 196, 145, 40, 28, 16, 8, 10, 178, 167, 24, 1, 44, 123, 137, 136, 145, 194, 48, 27, 74, 26, 192, 179, 135, 136, 88, 27, 10, 177, 163, 164, 128, 73, 24, 31, 8, 0, 192, 149, 144, 129, 9, 106, 41, 200, + 161, 151, 41, 138, 0, 24, 226, 162, 49, 42, 11, 90, 136, 136, 152, 17, 145, 10, 63, 40, 11, 56, 245, 162, 16, 26, 73, 11, 144, 135, 137, 58, 106, 10, 25, 8, 57, 137, 28, 33, 129, 156, 113, 10, 10, 161, 18, 8, 153, 77, 3, 217, 0, 1, 242, 128, 193, 18, 128, 75, 60, 178, 154, 37, 45, 58, 29, 144, 1, 184, 66, 41, 29, 8, 145, 10, + 194, 33, 148, 170, 107, 89, 139, 128, 163, 178, 16, 63, 59, 176, 144, 151, 129, 42, 74, 10, 129, 192, 2, 128, 154, 97, 192, 0, 177, 128, 178, 183, 16, 16, 155, 149, 145, 184, 84, 138, 8, 192, 161, 20, 225, 0, 130, 138, 165, 0, 28, 148, 153, 18, 209, 128, 88, 153, 89, 152, 9, 17, 9, 29, 130, 43, 122, 153, 24, 32, 202, 49, + 24, 43, 106, 154, 130, 193, 27, 51, 29, 28, 133, 138, 65, 11, 123, 25, 10, 40, 152, 44, 130, 26, 43, 148, 45, 73, 140, 33, 8, 153, 88, 128, 61, 144, 42, 59, 225, 128, 18, 155, 50, 75, 186, 20, 202, 120, 144, 42, 92, 176, 162, 165, 25, 2, 169, 152, 135, 185, 19, 152, 8, 146, 160, 123, 195, 137, 132, 209, 0, 16, 11, 2, 242, + 146, 164, 152, 73, 193, 136, 130, 178, 1, 136, 169, 23, 169, 128, 164, 242, 129, 178, 129, 32, 138, 180, 167, 153, 132, 8, 138, 2, 209, 4, 138, 1, 128, 138, 92, 136, 44, 129, 136, 162, 33, 63, 40, 141, 2, 160, 144, 106, 137, 64, 155, 17, 129, 60, 30, 146, 26, 17, 28, 48, 46, 169, 51, 154, 91, 137, 41, 26, 32, 143, 18, 138, + 1, 32, 28, 123, 177, 9, 181, 195, 56, 57, 14, 145, 161, 17, 17, 31, 41, 152, 145, 194, 194, 20, 153, 41, 9, 243, 129, 180, 0, 128, 45, 16, 43, 170, 135, 144, 16, 25, 42, 137, 242, 163, 194, 16, 0, 57, 14, 130, 194, 178, 16, 33, 30, 8, 59, 211, 163, 160, 5, 137, 44, 10, 17, 170, 3, 120, 9, 44, 146, 136, 131, 140, 91, 9, 171, + 7, 161, 32, 73, 13, 8, 161, 40, 106, 11, 25, 129, 59, 0, 49, 31, 42, 28, 40, 11, 0, 81, 176, 61, 32, 138, 25, 178, 241, 148, 136, 106, 8, 136, 128, 177, 90, 8, 155, 96, 176, 9, 18, 217, 132, 129, 10, 81, 156, 40, 178, 161, 36, 169, 76, 147, 203, 150, 0, 10, 146, 200, 147, 149, 128, 144, 148, 154, 182, 24, 0, 137, 11, 134, 211, + 24, 136, 129, 145, 209, 33, 8, 43, 163, 243, 88, 41, 13, 0, 160, 145, 33, 31, 32, 185, 145, 4, 155, 17, 32, 47, 161, 128, 73, 160, 44, 56, 176, 75, 74, 12, 35, 141, 104, 137, 9, 89, 152, 58, 56, 44, 41, 30, 41, 40, 157, 48, 128, 154, 88, 41, 42, 8, 14, 3, 184, 59, 120, 152, 9, 56, 10, 128, 41, 57, 227, 186, 52, 152, 62, 8, 56, + 242, 0, 58, 8, 156, 34, 243, 128, 24, 176, 51, 169, 58, 183, 192, 146, 164, 177, 18, 170, 7, 177, 208, 132, 161, 24, 136, 27, 147, 243, 128, 133, 10, 24, 161, 161, 178, 214, 17, 160, 25, 16, 161, 137, 165, 192, 48, 27, 72, 58, 218, 133, 162, 26, 72, 27, 10, 197, 178, 49, 138, 89, 56, 142, 1, 24, 11, 0, 44, 105, 10, 25, 0, + 194, 9, 3, 47, 8, 138, 147, 18, 28, 48, 202, 147, 199, 146, 25, 161, 0, 145, 194, 163, 57, 11, 146, 248, 130, 32, 57, 63, 154, 16, 48, 14, 128, 144, 209, 133, 26, 56, 154, 182, 162, 195, 18, 152, 44, 194, 180, 168, 5, 24, 137, 138, 35, 192, 232, 66, 176, 161, 24, 41, 26, 244, 129, 163, 160, 75, 129, 226, 147, 40, 145, 61, + 13, 130, 177, 17, 137, 112, 170, 130, 0, 136, 75, 152, 177, 241, 34, 0, 59, 156, 51, 186, 178, 91, 132, 137, 137, 122, 1, 45, 28, 50, 172, 57, 108, 8, 26, 136, 32, 152, 46, 144, 131, 171, 4, 152, 18, 141, 148, 1, 216, 32, 9, 60, 169, 66, 152, 128, 72, 90, 201, 1, 17, 201, 136, 3, 195, 26, 73, 133, 200, 176, 150, 146, 169, + 24, 33, 178, 184, 151, 73, 11, 28, 72, 44, 153, 82, 153, 17, 42, 57, 78, 153, 8, 160, 0, 1, 123, 11, 19, 171, 195, 18, 59, 31, 129, 10, 162, 2, 58, 96, 142, 130, 26, 75, 128, 176, 17, 180, 123, 9, 90, 137, 211, 145, 32, 26, 76, 43, 145, 130, 12, 90, 41, 27, 58, 160, 160, 128, 178, 7, 76, 59, 0, 203, 180, 147, 33, 62, 10, 0, 243, + 129, 146, 73, 29, 145, 144, 0, 26, 56, 153, 185, 83, 8, 76, 27, 166, 161, 193, 146, 131, 224, 145, 165, 161, 40, 168, 149, 162, 226, 2, 136, 138, 163, 131, 211, 0, 59, 146, 218, 148, 1, 192, 16, 16, 58, 248, 88, 144, 177, 136, 1, 58, 45, 9, 195, 197, 147, 48, 29, 10, 0, 162, 176, 64, 122, 9, 10, 17, 9, 153, 56, 75, 27, 31, + 72, 136, 9, 129, 129, 61, 45, 59, 10, 161, 18, 122, 43, 59, 41, 169, 34, 155, 130, 131, 219, 120, 162, 27, 49, 208, 160, 131, 156, 66, 12, 145, 50, 240, 16, 136, 12, 162, 40, 129, 130, 15, 129, 162, 146, 180, 83, 139, 58, 217, 129, 177, 4, 0, 169, 197, 163, 144, 242, 131, 168, 179, 179, 17, 197, 145, 178, 164, 128, 160, + 211, 2, 244, 163, 145, 162, 129, 212, 177, 163, 17, 208, 163, 195, 180, 57, 24, 170, 182, 164, 129, 0, 60, 60, 169, 149, 162, 177, 122, 26, 24, 136, 136, 133, 43, 27, 178, 56, 77, 24, 128, 240, 0, 2, 44, 46, 8, 128, 193, 146, 64, 27, 42, 16, 193, 25, 0, 192, 148, 11, 52, 47, 153, 147, 243, 0, 24, 73, 28, 144, 161, 150, 9, + 8, 73, 170, 2, 162, 25, 27, 147, 167, 131, 29, 1, 168, 200, 165, 16, 91, 137, 8, 162, 176, 35, 41, 31, 24, 169, 50, 168, 58, 123, 144, 48, 128, 13, 73, 169, 144, 16, 57, 123, 44, 200, 163, 56, 153, 80, 10, 176, 146, 57, 94, 8, 152, 131, 9, 168, 125, 26, 145, 177, 132, 137, 41, 60, 26, 144, 243, 32, 192, 34, 60, 43, 26, 16, + 249, 164, 16, 58, 61, 11, 130, 243, 146, 2, 42, 44, 27, 128, 165, 137, 49, 45, 28, 16, 43, 8, 211, 48, 28, 152, 105, 9, 9, 163, 161, 169, 35, 107, 42, 232, 164, 130, 168, 72, 42, 168, 210, 148, 144, 136, 129, 3, 217, 194, 50, 27, 192, 41, 210, 147, 40, 76, 226, 1, 161, 1, 155, 132, 145, 147, 171, 67, 173, 210, 132, 161, 106, + 137, 56, 169, 209, 131, 64, 13, 129, 9, 194, 17, 57, 61, 169, 17, 128, 40, 31, 16, 10, 162, 57, 61, 75, 139, 40, 242, 17, 58, 59, 138, 179, 144, 50, 105, 140, 179, 243, 57, 40, 26, 9, 243, 130, 24, 29, 57, 128, 210, 129, 25, 59, 91, 137, 162, 178, 72, 27, 181, 168, 19, 129, 8, 184, 231, 147, 178, 32, 28, 184, 198, 148, 144, + 1, 26, 128, 16, 192, 2, 26, 144, 244, 129, 0, 16, 10, 197, 177, 181, 1, 41, 9, 178, 165, 211, 129, 25, 145, 137, 210, 147, 152, 210, 163, 132, 194, 17, 91, 169, 145, 181, 130, 9, 89, 137, 152, 178, 4, 128, 9, 63, 160, 128, 106, 8, 25, 43, 10, 32, 47, 26, 123, 152, 24, 40, 25, 27, 18, 186, 35, 158, 64, 42, 216, 33, 25, 58, 58, + 45, 184, 147, 29, 72, 46, 9, 0, 178, 146, 58, 77, 26, 25, 209, 165, 128, 145, 17, 153, 128, 129, 148, 240, 129, 1, 40, 31, 0, 152, 242, 163, 16, 59, 44, 24, 243, 146, 128, 1, 26, 26, 179, 213, 145, 130, 176, 131, 40, 25, 145, 219, 179, 167, 8, 33, 59, 14, 176, 166, 16, 136, 74, 128, 176, 128, 149, 8, 8, 209, 148, 152, 0, 72, + 153, 161, 178, 35, 62, 75, 154, 163, 153, 19, 62, 170, 133, 179, 136, 89, 12, 129, 164, 144, 3, 47, 58, 193, 177, 148, 0, 61, 43, 10, 129, 17, 41, 61, 43, 25, 8, 126, 26, 25, 137, 145, 34, 44, 45, 129, 216, 179, 1, 90, 25, 137, 32, 227, 8, 16, 9, 170, 49, 31, 32, 29, 128, 145, 148, 75, 25, 75, 153, 162, 192, 35, 12, 80, 136, + 176, 8, 194, 24, 1, 176, 21, 154, 145, 80, 251, 130, 2, 30, 9, 8, 130, 145, 128, 98, 27, 26, 129, 136, 162, 15, 33, 168, 59, 65, 177, 77, 141, 1, 128, 168, 113, 10, 137, 178, 163, 146, 132, 74, 153, 224, 164, 33, 184, 19, 184, 228, 161, 17, 91, 152, 25, 146, 152, 44, 121, 9, 160, 145, 17, 25, 28, 93, 128, 152, 2, 25, 27, 161, + 210, 129, 146, 45, 179, 227, 163, 162, 9, 40, 193, 148, 179, 57, 107, 140, 196, 32, 25, 57, 47, 136, 210, 130, 24, 40, 28, 152, 210, 182, 145, 40, 8, 129, 184, 147, 147, 140, 163, 166, 160, 34, 45, 144, 194, 161, 134, 41, 46, 152, 162, 162, 3, 44, 58, 75, 209, 162, 144, 57, 129, 47, 152, 130, 59, 16, 248, 129, 17, 26, 57, + 9, 29, 167, 2, 60, 42, 138, 136, 209, 130, 90, 42, 42, 176, 146, 178, 120, 28, 8, 160, 145, 16, 33, 31, 1, 8, 160, 129, 128, 242, 164, 32, 152, 177, 146, 213, 196, 128, 40, 26, 160, 163, 180, 146, 108, 60, 144, 144, 136, 147, 137, 40, 90, 161, 3, 17, 219, 243, 33, 184, 130, 60, 136, 243, 178, 179, 132, 26, 8, 168, 212, 147, + 16, 57, 42, 31, 145, 145, 160, 32, 43, 184, 66, 45, 180, 33, 140, 226, 1, 91, 152, 16, 144, 193, 162, 48, 77, 25, 137, 153, 17, 178, 78, 0, 0, 16, 14, 90, 152, 153, 19, 129, 13, 123, 137, 129, 160, 1, 73, 44, 9, 129, 0, 153, 120, 10, 9, 162, 195, 32, 139, 28, 151, 161, 2, 128, 26, 45, 193, 146, 48, 29, 146, 153, 194, 5, 59, + 29, 128, 144, 195, 1, 64, 43, 208, 178, 149, 8, 9, 16, 240, 163, 129, 16, 42, 185, 181, 211, 24, 48, 45, 137, 149, 9, 24, 41, 75, 184, 177, 4, 43, 91, 128, 180, 16, 144, 29, 25, 184, 167, 1, 59, 60, 153, 148, 161, 146, 91, 42, 186, 4, 24, 145, 123, 11, 2, 178, 77, 136, 26, 25, 195, 40, 115, 61, 27, 168, 177, 3, 59, 79, 26, 25, + 144, 1, 48, 13, 56, 154, 248, 1, 16, 9, 129, 8, 2, 178, 31, 130, 153, 162, 20, 15, 33, 170, 56, 40, 29, 28, 128, 152, 149, 144, 56, 120, 11, 162, 212, 129, 144, 145, 59, 180, 243, 147, 145, 144, 16, 152, 48, 241, 0, 161, 176, 1, 134, 10, 129, 200, 166, 144, 128, 121, 26, 24, 177, 178, 196, 48, 75, 138, 41, 180, 195, 26, 24, + 89, 138, 24, 33, 187, 41, 84, 155, 57, 79, 136, 160, 210, 130, 0, 58, 58, 168, 243, 132, 27, 41, 75, 138, 3, 8, 61, 8, 29, 145, 179, 76, 24, 28, 146, 208, 2, 49, 140, 75, 196, 144, 0, 40, 44, 179, 208, 3, 176, 33, 15, 177, 2, 160, 106, 8, 160, 164, 164, 8, 73, 27, 226, 179, 161, 1, 57, 1, 196, 211, 128, 40, 156, 145, 166, 178, + 131, 29, 128, 145, 162, 165, 40, 27, 216, 146, 135, 144, 40, 160, 194, 177, 145, 20, 139, 200, 151, 178, 17, 136, 40, 25, 205, 130, 17, 11, 17, 129, 156, 38, 26, 25, 137, 179, 163, 11, 79, 16, 12, 146, 147, 143, 89, 25, 136, 136, 25, 48, 26, 46, 129, 40, 29, 42, 29, 8, 145, 2, 56, 27, 62, 8, 25, 212, 161, 48, 43, 144, 129, + 29, 145, 144, 41, 106, 10, 107, 43, 184, 131, 1, 36, 61, 13, 138, 2, 194, 1, 16, 27, 75, 186, 181, 151, 8, 1, 161, 138, 211, 129, 2, 59, 248, 129, 16, 0, 144, 63, 152, 150, 136, 24, 25, 128, 30, 161, 128, 17, 24, 225, 146, 10, 16, 0, 9, 227, 183, 129, 40, 60, 26, 162, 194, 181, 24, 90, 9, 24, 0, 176, 161, 193, 194, 35, 12, 63, + 8, 210, 162, 1, 32, 78, 28, 152, 164, 144, 16, 48, 45, 137, 162, 147, 168, 152, 98, 27, 43, 33, 12, 160, 165, 129, 137, 63, 41, 153, 153, 151, 16, 91, 26, 8, 8, 9, 56, 10, 46, 24, 146, 57, 168, 160, 166, 241, 129, 32, 140, 16, 145, 179, 164, 137, 113, 138, 208, 131, 26, 25, 1, 42, 178, 196, 106, 24, 171, 18, 196, 8, 18, 29, + 41, 194, 128, 3, 249, 57, 162, 152, 48, 184, 120, 160, 208, 33, 137, 74, 57, 187, 149, 129, 26, 35, 158, 72, 128, 168, 32, 26, 25, 180, 75, 2, 136, 15, 163, 161, 136, 120, 27, 41, 160, 128, 182, 56, 60, 25, 12, 178, 151, 128, 168, 72, 10, 152, 4, 177, 26, 147, 137, 113, 44, 42, 33, 220, 2, 152, 41, 82, 11, 210, 163, 184, + 133, 162, 10, 196, 128, 3, 234, 40, 149, 152, 161, 1, 44, 129, 194, 4, 225, 16, 58, 168, 24, 194, 146, 146, 154, 49, 21, 218, 33, 152, 248, 129, 194, 147, 0, 28, 1, 195, 162, 20, 140, 42, 25, 160, 198, 1, 33, 136, 142, 3, 25, 24, 141, 16, 177, 208, 112, 0, 138, 41, 160, 130, 45, 60, 32, 170, 73, 24, 75, 59, 161, 176, 49, 159, + 97, 26, 168, 149, 145, 32, 28, 25, 184, 211, 129, 179, 74, 73, 8, 153, 136, 193, 151, 160, 32, 48, 143, 9, 147, 181, 145, 32, 60, 9, 187, 133, 166, 144, 32, 152, 25, 136, 161, 150, 168, 145, 81, 10, 42, 0, 169, 182, 148, 136, 58, 41, 187, 182, 211, 131, 16, 137, 25, 243, 144, 129, 2, 9, 8, 202, 7, 25, 185, 21, 144, 136, 153, + 65, 184, 137, 56, 151, 10, 153, 49, 16, 145, 14, 56, 176, 11, 192, 19, 89, 91, 44, 168, 147, 2, 8, 147, 63, 27, 1, 136, 229, 129, 73, 26, 136, 26, 137, 81, 170, 147, 77, 72, 12, 42, 42, 192, 24, 104, 91, 26, 27, 65, 177, 27, 32, 41, 60, 14, 136, 17, 170, 150, 129, 24, 58, 11, 16, 251, 162, 19, 57, 31, 0, 152, 129, 145, 17, 61, + 14, 1, 129, 27, 129, 66, 169, 178, 74, 12, 11, 19, 198, 145, 75, 33, 138, 174, 133, 1, 184, 57, 40, 136, 169, 20, 1, 60, 174, 20, 154, 201, 67, 26, 162, 151, 42, 16, 138, 59, 130, 204, 20, 169, 59, 180, 59, 114, 184, 56, 178, 242, 128, 130, 43, 8, 194, 3, 229, 144, 33, 185, 144, 34, 181, 145, 168, 17, 149, 153, 74, 35, 220, + 129, 128, 1, 88, 59, 75, 225, 136, 130, 168, 17, 144, 12, 151, 8, 25, 179, 8, 1, 240, 16, 8, 25, 145, 211, 41, 130, 138, 115, 169, 160, 163, 168, 84, 154, 74, 0, 170, 144, 211, 149, 2, 30, 128, 137, 9, 149, 1, 144, 58, 60, 57, 153, 178, 150, 17, 29, 27, 74, 25, 195, 152, 56, 15, 1, 25, 26, 152, 149, 80, 153, 57, 73, 140, 128, + 160, 144, 113, 27, 56, 28, 25, 4, 42, 44, 137, 60, 171, 130, 50, 240, 8, 5, 139, 145, 1, 105, 137, 200, 80, 137, 145, 146, 178, 179, 160, 46, 16, 240, 195, 131, 128, 144, 24, 164, 198, 128, 0, 136, 137, 131, 194, 165, 177, 2, 161, 147, 11, 144, 188, 181, 148, 144, 23, 0, 28, 224, 128, 131, 192, 32, 1, 224, 1, 168, 132, 145, + 9, 41, 208, 58, 137, 179, 151, 145, 16, 1, 30, 8, 145, 178, 1, 47, 32, 186, 72, 169, 146, 75, 8, 41, 48, 136, 89, 13, 48, 9, 10, 124, 26, 11, 42, 32, 129, 91, 77, 16, 12, 128, 42, 57, 138, 10, 60, 2, 63, 9, 0, 93, 128, 152, 90, 8, 10, 24, 40, 44, 144, 29, 49, 188, 48, 72, 25, 30, 177, 33, 128, 186, 120, 129, 186, 133, 152, 130, + 24, 156, 51, 154, 8, 226, 2, 56, 155, 2, 179, 233, 167, 128, 24, 129, 176, 136, 151, 8, 184, 0, 33, 224, 152, 21, 177, 24, 10, 163, 16, 250, 17, 130, 171, 83, 137, 136, 37, 12, 56, 242, 154, 17, 160, 145, 82, 13, 3, 201, 128, 18, 137, 24, 162, 63, 162, 8, 107, 178, 128, 57, 158, 32, 24, 200, 18, 0, 106, 154, 73, 16, 248, 8, + 73, 137, 57, 75, 0, 128, 12, 65, 137, 59, 75, 28, 144, 129, 122, 0, 58, 140, 160, 195, 145, 105, 56, 28, 153, 145, 164, 88, 8, 28, 25, 153, 9, 162, 113, 89, 153, 136, 33, 234, 147, 128, 41, 72, 11, 138, 151, 144, 145, 16, 43, 58, 248, 130, 178, 42, 4, 40, 10, 196, 154, 147, 216, 24, 7, 136, 10, 161, 148, 210, 161, 98, 138, + 137, 128, 146, 176, 33, 105, 27, 43, 163, 49, 185, 6, 10, 136, 43, 67, 174, 161, 162, 151, 137, 1, 64, 200, 193, 24, 64, 200, 56, 145, 242, 24, 57, 137, 1, 128, 3, 162, 175, 80, 128, 162, 152, 25, 58, 175, 17, 17, 0, 200, 64, 168, 162, 91, 1, 154, 44, 211, 177, 35, 64, 160, 161, 144, 4, 241, 41, 209, 162, 25, 1, 3, 242, 176, + 134, 153, 42, 41, 136, 135, 154, 2, 130, 46, 41, 161, 153, 180, 145, 34, 26, 46, 18, 242, 137, 146, 129, 25, 128, 11, 151, 161, 40, 179, 27, 122, 168, 59, 137, 181, 50, 172, 36, 56, 15, 9, 129, 137, 128, 75, 2, 58, 12, 52, 141, 8, 24, 58, 153, 157, 122, 145, 9, 1, 80, 27, 184, 32, 74, 219, 50, 57, 168, 153, 180, 48, 28, 143, + 131, 144, 178, 65, 13, 48, 168, 162, 147, 155, 121, 9, 170, 5, 16, 153, 21, 29, 144, 161, 91, 0, 184, 57, 128, 137, 17, 159, 88, 178, 128, 105, 152, 9, 162, 33, 164, 141, 88, 178, 224, 1, 0, 16, 27, 185, 150, 161, 9, 4, 139, 16, 128, 160, 194, 144, 65, 180, 46, 40, 136, 27, 135, 160, 16, 44, 57, 145, 236, 2, 195, 40, 75, 177, + 2, 200, 179, 146, 186, 104, 50, 141, 24, 169, 165, 148, 11, 97, 10, 11, 130, 177, 49, 57, 78, 42, 154, 128, 165, 59, 33, 28, 30, 1, 136, 16, 192, 41, 128, 152, 123, 136, 24, 1, 169, 113, 10, 11, 49, 153, 14, 147, 19, 45, 43, 8, 176, 210, 148, 8, 16, 11, 96, 144, 192, 163, 150, 10, 128, 43, 26, 150, 178, 165, 24, 41, 171, 18, + 27, 215, 1, 8, 128, 136, 40, 35, 208, 11, 161, 193, 18, 73, 154, 133, 155, 165, 164, 10, 49, 154, 8, 199, 0, 2, 168, 64, 192, 0, 40, 162, 43, 202, 180, 150, 10, 106, 24, 185, 145, 131, 184, 113, 43, 24, 162, 187, 73, 146, 42, 81, 171, 121, 58, 155, 151, 16, 43, 32, 31, 9, 160, 146, 17, 136, 94, 10, 24, 145, 25, 9, 130, 59, + 65, 13, 91, 25, 169, 146, 176, 112, 42, 59, 16, 217, 130, 20, 13, 25, 9, 40, 161, 138, 68, 169, 154, 18, 62, 154, 180, 145, 135, 152, 56, 58, 155, 165, 211, 8, 40, 42, 10, 198, 1, 2, 184, 57, 184, 224, 51, 154, 27, 134, 168, 19, 202, 73, 75, 184, 35, 176, 75, 24, 25, 209, 51, 157, 19, 30, 184, 179, 3, 33, 148, 45, 232, 146, + 129, 168, 41, 32, 170, 149, 193, 35, 136, 16, 50, 191, 56, 146, 173, 149, 16, 24, 41, 30, 129, 168, 209, 3, 57, 31, 0, 16, 176, 147, 41, 152, 10, 17, 181, 14, 40, 144, 49, 170, 75, 97, 141, 25, 162, 146, 72, 177, 92, 137, 137, 19, 137, 153, 113, 154, 2, 41, 60, 129, 217, 2, 211, 152, 73, 42, 193, 197, 146, 147, 10, 59, 0, + 192, 196, 132, 41, 160, 25, 88, 169, 16, 40, 241, 1, 153, 81, 28, 10, 147, 161, 209, 88, 75, 9, 161, 162, 180, 16, 43, 57, 235, 33, 56, 156, 129, 144, 2, 135, 31, 128, 145, 136, 163, 56, 59, 154, 57, 167, 160, 105, 137, 0, 138, 163, 3, 41, 47, 185, 211, 131, 41, 41, 60, 139, 182, 146, 16, 16, 43, 242, 144, 145, 129, 16, 179, + 183, 1, 26, 9, 147, 240, 131, 160, 91, 74, 152, 184, 166, 178, 33, 140, 9, 4, 162, 233, 34, 136, 129, 144, 163, 60, 142, 144, 149, 128, 33, 73, 13, 161, 194, 131, 0, 26, 56, 142, 128, 163, 128, 1, 233, 56, 209, 41, 145, 194, 147, 179, 149, 64, 30, 8, 128, 216, 18, 24, 43, 43, 32, 153, 25, 74, 109, 137, 153, 48, 8, 137, 122, + 25, 144, 26, 43, 59, 30, 33, 41, 27, 24, 96, 153, 160, 50, 76, 27, 47, 152, 145, 163, 73, 40, 14, 152, 131, 176, 74, 90, 8, 8, 200, 67, 155, 154, 50, 49, 155, 28, 124, 177, 152, 1, 2, 17, 62, 138, 180, 176, 4, 25, 9, 177, 245, 162, 129, 40, 25, 176, 164, 130, 172, 4, 8, 181, 194, 49, 11, 168, 154, 165, 133, 152, 40, 136, 226, + 179, 19, 26, 185, 16, 167, 194, 16, 25, 57, 243, 136, 147, 1, 31, 25, 184, 132, 160, 33, 62, 138, 129, 130, 41, 121, 137, 153, 145, 26, 17, 107, 136, 179, 1, 61, 60, 26, 162, 168, 148, 64, 31, 25, 32, 168, 152, 64, 31, 137, 8, 129, 33, 62, 24, 137, 8, 16, 59, 47, 153, 33, 162, 91, 59, 41, 170, 145, 5, 43, 60, 41, 13, 178, 134, + 57, 153, 12, 194, 227, 8, 2, 128, 57, 208, 162, 19, 216, 32, 178, 25, 128, 160, 48, 194, 195, 37, 155, 10, 33, 251, 163, 146, 16, 136, 12, 166, 195, 160, 148, 129, 176, 147, 178, 150, 160, 72, 162, 162, 193, 162, 60, 200, 145, 5, 144, 25, 122, 216, 129, 161, 130, 0, 10, 73, 1, 241, 2, 9, 168, 33, 13, 161, 165, 24, 64, 203, + 50, 1, 14, 9, 9, 129, 161, 106, 33, 27, 13, 164, 128, 40, 41, 107, 169, 160, 33, 136, 60, 92, 168, 152, 2, 91, 57, 176, 129, 0, 144, 47, 136, 162, 164, 128, 80, 43, 154, 179, 213, 130, 74, 27, 0, 145, 145, 167, 58, 59, 160, 9, 26, 76, 8, 171, 5, 49, 28, 44, 169, 162, 183, 130, 72, 28, 144, 179, 228, 2, 25, 26, 129, 186, 151, + 1, 75, 128, 169, 17, 178, 15, 57, 170, 16, 166, 16, 57, 8, 139, 162, 181, 1, 8, 152, 164, 181, 41, 81, 43, 10, 242, 145, 57, 139, 89, 8, 193, 18, 154, 32, 176, 10, 165, 129, 137, 147, 177, 134, 0, 25, 25, 201, 147, 227, 129, 72, 59, 185, 167, 128, 129, 160, 91, 25, 176, 130, 147, 145, 9, 160, 5, 202, 17, 16, 186, 136, 37, + 177, 56, 76, 42, 169, 186, 48, 9, 145, 57, 24, 128, 41, 169, 134, 137, 145, 147, 28, 41, 168, 131, 228, 32, 27, 9, 60, 129, 178, 64, 60, 45, 25, 9, 24, 152, 49, 31, 136, 57, 42, 0, 25, 12, 181, 18, 153, 57, 96, 169, 177, 132, 153, 123, 9, 152, 129, 177, 17, 74, 43, 24, 169, 128, 121, 137, 25, 1, 139, 96, 42, 10, 146, 178, 18, + 44, 29, 1, 161, 164, 146, 31, 137, 146, 177, 19, 1, 10, 26, 209, 165, 146, 43, 40, 138, 240, 130, 18, 144, 25, 40, 212, 1, 58, 11, 152, 196, 147, 10, 74, 26, 152, 225, 130, 146, 58, 60, 210, 145, 16, 148, 16, 185, 192, 18, 44, 42, 57, 199, 162, 1, 9, 87, 47, 186, 215, 231, 197, 179, 180, 195, 212, 164, 32, 59, 92, 126, 62, + 41, 59, 76, 59, 60, 168, 179, 213, 197, 163, 72, 44, 25, 74, 126, 127, 127, 79, 26, 177, 148, 90, 27, 225, 247, 165, 0, 152, 147, 123, 138, 211, 164, 72, 126, 127, 46, 210, 196, 163, 228, 215, 64, 11, 210, 180, 1, 8, 58, 153, 1, 224, 149, 57, 76, 27, 24, 76, 42, 43, 136, 128, 243, 179, 130, 106, 60, 42, 42, 92, 28, 243, 231, + 147, 24, 57, 44, 58, 94, 45, 8, 57, 139, 214, 148, 40, 77, 26, 9, 16, 10, 144, 64, 62, 43, 25, 123, 59, 138, 162, 48, 63, 26, 41, 92, 60, 43, 176, 3, 59, 232, 214, 164, 16, 75, 75, 76, 60, 153, 179, 33, 62, 26, 136, 40, 75, 169, 197, 163, 129, 57, 60, 59, 75, 138, 145, 64, 63, 138, 179, 1, 42, 136, 90, 43, 176, 214, 180, 1, 25, + 152, 195, 129, 129, 106, 76, 60, 137, 145, 178, 2, 25, 10, 228, 130, 57, 59, 44, 41, 154, 165, 105, 76, 44, 144, 16, 76, 26, 41, 76, 26, 152, 1, 58, 26, 9, 193, 165, 16, 92, 26, 41, 77, 59, 76, 76, 60, 26, 136, 161, 130, 152, 195, 163, 211, 146, 0, 57, 11, 211, 130, 8, 25, 40, 62, 153, 162, 17, 109, 60, 153, 146, 40, 76, 60, + 26, 160, 179, 211, 163, 32, 60, 42, 153, 179, 194, 199, 130, 24, 58, 43, 58, 27, 128, 161, 195, 129, 226, 196, 147, 90, 59, 75, 44, 136, 128, 145, 160, 148, 123, 59, 42, 26, 41, 26, 57, 27, 192, 215, 147, 57, 59, 27, 161, 145, 213, 130, 106, 76, 43, 9, 144, 162, 129, 177, 181, 130, 136, 194, 146, 40, 10, 129, 25, 210, 146, + 178, 197, 196, 179, 196, 130, 8, 41, 9, 144, 178, 130, 209, 182, 17, 92, 43, 176, 147, 144, 212, 130, 136, 0, 177, 130, 73, 62, 10, 161, 130, 91, 75, 59, 43, 57, 46, 25, 41, 77, 10, 177, 164, 16, 26, 136, 210, 197, 179, 130, 128, 57, 77, 43, 25, 75, 10, 227, 179, 180, 179, 146, 128, 57, 185, 183, 163, 145, 0, 8, 8, 10, 119, + 114, 120, 16, 210, 244, 60, 28, 41, 25, 152, 149, 56, 161, 35, 44, 89, 27, 24, 136, 24, 164, 211, 17, 233, 176, 136, 192, 129, 179, 17, 17, 25, 0, 10, 46, 160, 132, 49, 66, 24, 132, 177, 147, 193, 56, 72, 26, 29, 232, 168, 176, 12, 137, 41, 139, 147, 9, 1, 41, 15, 91, 136, 35, 148, 21, 18, 48, 40, 1, 168, 167, 144, 0, 42, 172, + 177, 204, 193, 155, 232, 152, 152, 26, 152, 41, 146, 17, 6, 4, 65, 34, 35, 135, 4, 16, 32, 9, 24, 186, 176, 0, 250, 153, 204, 186, 173, 154, 153, 177, 3, 65, 41, 34, 145, 134, 35, 65, 98, 49, 50, 50, 2, 33, 169, 138, 155, 175, 170, 172, 204, 192, 138, 234, 136, 155, 136, 10, 32, 18, 5, 52, 48, 24, 162, 17, 67, 54, 66, 51, 34, + 131, 184, 174, 234, 153, 10, 9, 40, 0, 152, 251, 168, 142, 154, 9, 16, 33, 49, 33, 128, 154, 170, 156, 34, 54, 54, 33, 68, 0, 1, 136, 201, 137, 26, 88, 48, 35, 99, 8, 152, 189, 189, 187, 155, 171, 16, 24, 130, 145, 188, 175, 203, 144, 49, 115, 67, 67, 50, 19, 2, 1, 0, 0, 130, 131, 1, 136, 206, 216, 188, 203, 204, 187, 187, + 156, 153, 0, 0, 51, 17, 34, 24, 112, 20, 69, 67, 67, 34, 19, 0, 136, 169, 185, 137, 186, 232, 185, 219, 201, 203, 187, 173, 170, 154, 153, 129, 131, 6, 2, 19, 49, 49, 21, 65, 19, 53, 51, 83, 34, 16, 168, 201, 154, 172, 156, 138, 0, 1, 24, 201, 233, 186, 204, 186, 171, 137, 3, 37, 48, 24, 128, 201, 202, 202, 129, 17, 48, 21, + 22, 20, 19, 19, 32, 16, 2, 66, 52, 68, 4, 3, 1, 203, 235, 188, 189, 186, 171, 153, 137, 153, 170, 219, 170, 140, 9, 17, 53, 115, 50, 52, 67, 51, 51, 51, 17, 130, 0, 145, 154, 169, 188, 236, 187, 190, 203, 187, 172, 171, 138, 136, 17, 33, 18, 2, 34, 98, 98, 50, 50, 52, 66, 34, 35, 2, 19, 24, 169, 203, 203, 188, 219, 169, 154, + 9, 137, 171, 204, 188, 203, 184, 136, 34, 83, 50, 33, 153, 184, 170, 170, 152, 40, 57, 19, 36, 50, 50, 18, 35, 17, 2, 49, 49, 66, 66, 66, 34, 17, 168, 233, 202, 202, 170, 171, 170, 186, 219, 203, 188, 188, 154, 138, 25, 33, 68, 52, 68, 67, 67, 36, 51, 36, 18, 17, 17, 136, 8, 170, 176, 202, 188, 206, 202, 171, 172, 186, 169, + 153, 8, 25, 144, 128, 1, 34, 68, 52, 68, 51, 52, 34, 49, 18, 34, 2, 144, 136, 155, 140, 187, 186, 186, 154, 154, 185, 185, 153, 9, 9, 0, 24, 0, 128, 144, 168, 169, 170, 154, 154, 153, 9, 8, 16, 8, 0, 144, 19, 35, 68, 51, 52, 67, 51, 66, 34, 50, 33, 1, 144, 185, 186, 172, 204, 187, 188, 173, 172, 186, 172, 186, 154, 138, 41, + 33, 52, 53, 83, 50, 51, 52, 52, 37, 34, 34, 18, 16, 144, 152, 154, 187, 219, 203, 188, 173, 186, 186, 186, 170, 154, 153, 138, 144, 16, 17, 67, 82, 50, 51, 21, 34, 19, 33, 2, 18, 33, 1, 8, 153, 169, 153, 153, 136, 128, 0, 136, 154, 153, 153, 8, 8, 1, 16, 0, 169, 170, 187, 171, 171, 154, 153, 153, 152, 153, 153, 0, 16, 51, 83, + 66, 50, 67, 50, 51, 67, 51, 52, 35, 18, 136, 186, 219, 187, 189, 186, 171, 187, 173, 187, 188, 187, 203, 138, 9, 16, 33, 50, 52, 53, 67, 67, 147, 8, 128, 128, 128, 128, 128, 128, 128, 128, 0, 240, 255, 55, 232, 23, 220, 0, 148, 1, 9, 18, 148, 10, 189, 32, 163, 62, 160, 5, 137, 12, 149, 42, 153, 144, 34, 42, 8, 1, 138, 181, + 45, 136, 18, 144, 105, 138, 1, 160, 14, 128, 132, 145, 186, 37, 138, 41, 192, 48, 145, 46, 160, 33, 44, 24, 225, 16, 13, 132, 136, 137, 16, 148, 25, 170, 194, 82, 152, 136, 91, 24, 42, 169, 33, 233, 131, 179, 24, 185, 149, 16, 57, 172, 164, 18, 10, 211, 160, 147, 211, 33, 138, 243, 129, 16, 41, 193, 0, 43, 132, 155, 73, + 58, 145, 244, 145, 43, 35, 9, 171, 16, 110, 25, 8, 28, 74, 162, 128, 26, 27, 82, 45, 136, 153, 18, 8, 136, 8 }; diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index fbe85f5b24..3a40d6aed4 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -44,8 +44,8 @@ enum EnvelopeState { class TownsPC98_FmSynthOperator { public: TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); ~TownsPC98_FmSynthOperator() {} void keyOn(); @@ -55,17 +55,40 @@ public: void recalculateRates(); void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); - void feedbackLevel(int32 level) {_feedbackLevel = level ? level + 6 : 0; } - void detune(int value) { _detn = &_detnTbl[value << 5]; } - void multiple(uint32 value) { _multiple = value ? (value << 1) : 1; } - void attackRate(uint32 value) { _specifiedAttackRate = value; } + void feedbackLevel(int32 level) { + _feedbackLevel = level ? level + 6 : 0; + } + void detune(int value) { + _detn = &_detnTbl[value << 5]; + } + void multiple(uint32 value) { + _multiple = value ? (value << 1) : 1; + } + void attackRate(uint32 value) { + _specifiedAttackRate = value; + } bool scaleRate(uint8 value); - void decayRate(uint32 value) { _specifiedDecayRate = value; recalculateRates(); } - void sustainRate(uint32 value) { _specifiedSustainRate = value; recalculateRates(); } - void sustainLevel(uint32 value) { _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; } - void releaseRate(uint32 value) { _specifiedReleaseRate = value; recalculateRates(); } - void totalLevel(uint32 value) { _totalLevel = value << 3; } - void ampModulation(bool enable) { _ampMod = enable; } + void decayRate(uint32 value) { + _specifiedDecayRate = value; + recalculateRates(); + } + void sustainRate(uint32 value) { + _specifiedSustainRate = value; + recalculateRates(); + } + void sustainLevel(uint32 value) { + _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; + } + void releaseRate(uint32 value) { + _specifiedReleaseRate = value; + recalculateRates(); + } + void totalLevel(uint32 value) { + _totalLevel = value << 3; + } + void ampModulation(bool enable) { + _ampMod = enable; + } void reset(); protected: @@ -126,16 +149,24 @@ public: // AudioStream interface int readBuffer(int16 *buffer, const int numSamples); - bool isStereo() const { return true; } - bool endOfData() const { return false; } - int getRate() const { return _mixer->getOutputRate(); } + bool isStereo() const { + return true; + } + bool endOfData() const { + return false; + } + int getRate() const { + return _mixer->getOutputRate(); + } protected: // Implement this in your inherited class if your driver generates // additional output that has to be inserted into the buffer. virtual void nextTickEx(int32 *buffer, uint32 bufferSize) {} - void toggleRegProtection(bool prot) { _regProtectionFlag = prot; } + void toggleRegProtection(bool prot) { + _regProtectionFlag = prot; + } uint8 readSSGStatus(); virtual void timerCallbackA() = 0; @@ -169,8 +200,12 @@ private: delete opr[i]; } - void ampModSensitivity(uint32 value) { ampModSvty = (1 << (3 - value)) - (((value >> 1) & 1) | (value & 1)); } - void frqModSensitivity(uint32 value) { frqModSvty = value << 5; } + void ampModSensitivity(uint32 value) { + ampModSvty = (1 << (3 - value)) - (((value >> 1) & 1) | (value & 1)); + } + void frqModSensitivity(uint32 value) { + frqModSvty = value << 5; + } uint16 frqTemp; bool enableLeft; -- cgit v1.2.3 From 7f1f4c8b07973782a0a56ff530e11cfb631a6a75 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 19:36:49 +0000 Subject: TOWNS/PC98: Replaced some tabs with spaces. svn-id: r51654 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 4 +-- sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 4 +-- sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp | 42 +++++++++++----------- .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 16 ++++----- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index 1207cb121f..d3484ce548 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -779,12 +779,12 @@ int TownsAudioInterface::fmKeyOn(int chan, int note, int velo) { v |= 4; for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) - writeReg(part, reg, _fmSaveReg[part][reg] | 0x0f); + writeReg(part, reg, _fmSaveReg[part][reg] | 0x0f); writeReg(0, 0x28, v); for (uint8 reg = 0x80 + chan; reg < 0x90; reg += 4) - writeReg(part, reg, _fmSaveReg[part][reg]); + writeReg(part, reg, _fmSaveReg[part][reg]); bufferedWriteReg(0, 0x28, v | 0xf0); diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp index db25846b47..4fe645e2fc 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -109,7 +109,7 @@ void TownsEuphonyDriver::reset() { if (_tempoControlMode == 1) { //if (///) - // return; + // return; setTempoIntern(_defaultTempo); } else { setTempoIntern(_defaultTempo); @@ -415,7 +415,7 @@ void TownsEuphonyDriver::updateCheckEot() { } bool TownsEuphonyDriver::parseNext() { -#define OPC(x) &TownsEuphonyDriver::evt##x +#define OPC(x) &TownsEuphonyDriver::evt##x static const EuphonyOpcode opcodes[] = { OPC(NotImpl), OPC(SetupNote), diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp index 2853f616a3..82d0bd0438 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp @@ -34,13 +34,13 @@ public: virtual void init(); typedef enum channelState { - CHS_RECALCFREQ = 0x01, - CHS_KEYOFF = 0x02, - CHS_SSGOFF = 0x04, - CHS_VBROFF = 0x08, - CHS_ALLOFF = 0x0f, - CHS_PROTECT = 0x40, - CHS_EOT = 0x80 + CHS_RECALCFREQ = 0x01, + CHS_KEYOFF = 0x02, + CHS_SSGOFF = 0x04, + CHS_VBROFF = 0x08, + CHS_ALLOFF = 0x0f, + CHS_PROTECT = 0x40, + CHS_EOT = 0x80 } ChannelState; virtual void loadData(uint8 *data); @@ -197,7 +197,7 @@ TownsPC98_MusicChannel::~TownsPC98_MusicChannel() { } void TownsPC98_MusicChannel::init() { -#define Control(x) &TownsPC98_MusicChannel::control_##x +#define Control(x) &TownsPC98_MusicChannel::control_##x static const ControlEventFunc ctrlEvents[] = { Control(f0_setPatch), Control(f1_presetOutputLevel), @@ -589,7 +589,7 @@ TownsPC98_MusicChannelSSG::TownsPC98_MusicChannelSSG(TownsPC98_AudioDriver *driv void TownsPC98_MusicChannelSSG::init() { _algorithm = 0x80; -#define Control(x) &TownsPC98_MusicChannelSSG::control_##x +#define Control(x) &TownsPC98_MusicChannelSSG::control_##x static const ControlEventFunc ctrlEventsSSG[] = { Control(f0_setPatch), Control(f1_setTotalLevel), @@ -936,7 +936,7 @@ TownsPC98_MusicChannelPCM::TownsPC98_MusicChannelPCM(TownsPC98_AudioDriver *driv void TownsPC98_MusicChannelPCM::init() { _algorithm = 0x80; -#define Control(x) &TownsPC98_MusicChannelPCM::control_##x +#define Control(x) &TownsPC98_MusicChannelPCM::control_##x static const ControlEventFunc ctrlEventsPCM[] = { Control(dummy), Control(f1_prcStart), @@ -1328,7 +1328,7 @@ void TownsPC98_AudioDriver::startSoundEffect() { } const uint8 TownsPC98_AudioDriver::_drvTables[] = { - // channel presets + // channel presets 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x01, 0x80, 0x01, 0x01, 0x00, 0x02, 0x02, 0x80, 0x02, 0x02, 0x00, 0x04, @@ -1336,29 +1336,29 @@ const uint8 TownsPC98_AudioDriver::_drvTables[] = { 0x01, 0x80, 0x04, 0x05, 0x01, 0x10, 0x02, 0x80, 0x05, 0x06, 0x01, 0x20, - // control event size - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x05, + // control event size + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x05, 0x02, 0x06, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, - // fmt level presets - 0x54, 0x50, 0x4C, 0x48, 0x44, 0x40, 0x3C, 0x38, + // fmt level presets + 0x54, 0x50, 0x4C, 0x48, 0x44, 0x40, 0x3C, 0x38, 0x34, 0x30, 0x2C, 0x28, 0x24, 0x20, 0x1C, 0x18, - 0x14, 0x10, 0x0C, 0x08, 0x04, 0x90, 0x90, 0x90, + 0x14, 0x10, 0x0C, 0x08, 0x04, 0x90, 0x90, 0x90, - // carriers - 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0E, 0x0E, 0x0F, + // carriers + 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0E, 0x0E, 0x0F, - // pc98 level presets + // pc98 level presets 0x40, 0x3B, 0x38, 0x34, 0x30, 0x2A, 0x28, 0x25, 0x22, 0x20, 0x1D, 0x1A, 0x18, 0x15, 0x12, 0x10, 0x0D, 0x0A, 0x08, 0x05, 0x02, 0x90, 0x90, 0x90, - // frequencies + // frequencies 0x6A, 0x02, 0x8F, 0x02, 0xB6, 0x02, 0xDF, 0x02, 0x0B, 0x03, 0x39, 0x03, 0x6A, 0x03, 0x9E, 0x03, 0xD5, 0x03, 0x10, 0x04, 0x4E, 0x04, 0x8F, 0x04, - // ssg frequencies + // ssg frequencies 0xE8, 0x0E, 0x12, 0x0E, 0x48, 0x0D, 0x89, 0x0C, 0xD5, 0x0B, 0x2B, 0x0B, 0x8A, 0x0A, 0xF3, 0x09, 0x64, 0x09, 0xDD, 0x08, 0x5E, 0x08, 0xE6, 0x07, diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index c7cd83560d..65014f6201 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -32,7 +32,7 @@ TownsPC98_FmSynthOperator::TownsPC98_FmSynthOperator(const uint32 timerbase, con _rateTbl(rateTable), _rshiftTbl(shiftTable), _adTbl(attackDecayTable), _fTbl(frqTable), _sinTbl(sineTable), _tLvlTbl(tlevelOut), _detnTbl(detuneTable), _tickLength(timerbase * 2), _specifiedAttackRate(0), _specifiedDecayRate(0), _specifiedReleaseRate(0), _specifiedSustainRate(0), - _phase(0), _state(kEnvReady),_ playing(false), _timer(0), _keyScale1(0), + _phase(0), _state(kEnvReady), _playing(false), _timer(0), _keyScale1(0), _keyScale2(0), _currentLevel(1023), _ampMod(false), _tickCount(0) { fs_a.rate = fs_a.shift = fs_d.rate = fs_d.shift = fs_s.rate = fs_s.shift = fs_r.rate = fs_r.shift = 0; @@ -1261,7 +1261,7 @@ void TownsPC98_FmSynth::nextTick(int32 *buffer, uint32 bufferSize) { } const uint32 TownsPC98_FmSynth::_adtStat[] = { - 0x00010001, 0x00010001, 0x00010001, 0x01010001, + 0x00010001, 0x00010001, 0x00010001, 0x01010001, 0x00010101, 0x00010101, 0x00010101, 0x01010101, 0x01010101, 0x01010101, 0x01010102, 0x01010102, 0x01020102, 0x01020102, 0x01020202, 0x01020202, @@ -1275,14 +1275,14 @@ const uint32 TownsPC98_FmSynth::_adtStat[] = { const uint8 TownsPC98_FmSynth::_detSrc[] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, - 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, + 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x10, 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, - 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, + 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x13, 0x14, 0x16, 0x16, 0x16, 0x16 }; -- cgit v1.2.3 From 20d6173ee060d73202945dce9a142943491b085c Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Mon, 2 Aug 2010 20:17:05 +0000 Subject: TOWNS AUDIO: fix typo svn-id: r51655 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index d3484ce548..b3d37dbcd6 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -572,7 +572,7 @@ int TownsAudioInterface::intf_pcmPlayEffect(va_list &args) { TownsAudio_WaveTable w; w.readHeader(data); - if (!w.size < (w.loopStart + w.loopLen)) + if (w.size < (w.loopStart + w.loopLen)) return 13; if (!w.size) -- cgit v1.2.3 From bde60490adf6ef10cfe68460b12c310377641c4a Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Mon, 2 Aug 2010 20:28:14 +0000 Subject: N64: mention hkz-libn64 download location in port readme svn-id: r51656 --- backends/platform/n64/README.N64 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backends/platform/n64/README.N64 b/backends/platform/n64/README.N64 index 1cdd82e1e9..276436b676 100644 --- a/backends/platform/n64/README.N64 +++ b/backends/platform/n64/README.N64 @@ -13,6 +13,8 @@ Requirements Build cart images from sources ============================== +You can download hkz-libn64 sources from here: http://hkzlab.ipv7.net/consoles.html +hkz-libn64 is a library to control Nintendo64 hardware (es, video, audio, input, etc.). * TODO * Build cart images from binaries -- cgit v1.2.3 From a46f69570f5307ed962e92db9d858783b93ef098 Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Mon, 2 Aug 2010 20:38:06 +0000 Subject: CONFIGURE: cleanup of N64 port sections svn-id: r51657 --- configure | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/configure b/configure index 451b55d35d..75fe693c68 100755 --- a/configure +++ b/configure @@ -1661,10 +1661,10 @@ if test -n "$_host"; then _port_mk="backends/platform/linuxmoto/linuxmoto.mk" ;; n64) - CXXFLAGS="$CXXFLAGS -mno-extern-sdata -O2 --param max-inline-insns-auto=20 -fomit-frame-pointer" - CXXFLAGS="$CXXFLAGS -march=vr4300 -mtune=vr4300 -mhard-float -fno-rtti -fno-exceptions -Wno-multichar -Wshadow" - LDFLAGS="-march=vr4300 -mtune=vr4300 -nodefaultlibs -nostartfiles -mno-crt0" - LDFLAGS="$LDFLAGS -L/opt/mips64-toolchain/hkz-libn64 -L/opt/mips64-toolchain/lib" + CXXFLAGS="$CXXFLAGS -mno-extern-sdata --param max-inline-insns-auto=20 -fomit-frame-pointer" + CXXFLAGS="$CXXFLAGS -march=vr4300 -mtune=vr4300 -mhard-float" + LDFLAGS="$LDFLAGS -march=vr4300 -mtune=vr4300 -nodefaultlibs -nostartfiles -mno-crt0" + LDFLAGS="$LDFLAGS -L$N64SDK/hkz-libn64 -L$N64SDK/lib" LDFLAGS="$LDFLAGS -T n64ld_cpp.x -Xlinker -Map -Xlinker scummvm.map" _ar="$_host_alias-ar cru" _ranlib="$_host_alias-ranlib" @@ -2540,9 +2540,9 @@ case $_backend in DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO" ;; n64) - INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/include' - INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/mips64/include' - INCLUDES="$INCLUDES "'-I/opt/mips64-toolchain/hkz-libn64' + INCLUDES="$INCLUDES "'-I$(N64SDK)/include' + INCLUDES="$INCLUDES "'-I$(N64SDK)/mips64/include' + INCLUDES="$INCLUDES "'-I$(N64SDK)/hkz-libn64' INCLUDES="$INCLUDES "'-I$(srcdir)/backends/platform/n64' LIBS="$LIBS -lpakfs -lframfs -ln64 -ln64utils -lromfs -lm -lstdc++ -lc -lgcc -lz -lnosys" ;; -- cgit v1.2.3 From 2b73c50a476a20864f3631e3d3c2ac24710fe3a3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 20:43:42 +0000 Subject: GUI: Fix valgrind warning. svn-id: r51658 --- gui/GuiManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index ab370425ab..bbd7718d71 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -249,6 +249,9 @@ void GuiManager::runLoop() { redraw(); } + _lastMousePosition.x = _lastMousePosition.y = -1; + _lastMousePosition.time = 0; + Common::EventManager *eventMan = _system->getEventManager(); uint32 lastRedraw = 0; const uint32 waitTime = 1000 / 45; -- cgit v1.2.3 From e52128706303a3016e3ac0c69a88477c93bfc78c Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Mon, 2 Aug 2010 20:45:17 +0000 Subject: CONFIGURE: drop hardcoded endianess and hq scalers from n64 section svn-id: r51659 --- configure | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure b/configure index 75fe693c68..454544300b 100755 --- a/configure +++ b/configure @@ -1669,11 +1669,9 @@ if test -n "$_host"; then _ar="$_host_alias-ar cru" _ranlib="$_host_alias-ranlib" _backend="n64" - _endian=big _need_memalign=yes _mt32emu=no _vkeybd=yes - _build_hq_scalers=no _build_scalers=no _indeo3=no _translation=no -- cgit v1.2.3 From 09f4562551c6f26f5eac8a048051cd379ef93a2d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 21:04:09 +0000 Subject: SCI: adding non-scaleable view capability fixes laura bow 2 (especially floppy but CD is also affected somewhat by this) svn-id: r51660 --- engines/sci/graphics/animate.cpp | 7 +++++++ engines/sci/graphics/view.cpp | 30 +++++++++++++++++++++++++----- engines/sci/graphics/view.h | 7 ++++++- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index 521009eff6..df52ab9a7c 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -243,6 +243,13 @@ void GfxAnimate::fill(byte &old_picNotValid) { } } + if (!view->isScaleable()) { + // Laura Bow 2 (especially floppy) depends on this, some views are not supposed to be scaleable + // this "feature" was removed in later versions of SCI1.1 + it->scaleSignal = 0; + it->scaleY = it->scaleX = 128; + } + bool setNsRect = true; // Create rect according to coordinates and given cel diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 271730015d..1c865f6bcf 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -84,9 +84,10 @@ void GfxView::initData(GuiResourceId resourceId) { _embeddedPal = false; _EGAmapping = NULL; _isSci2Hires = false; + _isScaleable = true; // we adjust inside getCelRect for SCI0EARLY (that version didn't have the +1 when calculating bottom) - adjustForSci0Early = getSciVersion() == SCI_VERSION_0_EARLY ? -1 : 0; + _adjustForSci0Early = getSciVersion() == SCI_VERSION_0_EARLY ? -1 : 0; // If we find an SCI1/SCI1.1 view (not amiga), we switch to that type for // EGA. This could get used to make view patches for EGA games, where the @@ -192,15 +193,30 @@ void GfxView::initData(GuiResourceId resourceId) { break; case kViewVga11: // View-format SCI1.1+ - // HeaderSize:WORD LoopCount:BYTE Unknown:BYTE Version:WORD Unknown:WORD PaletteOffset:WORD + // HeaderSize:WORD LoopCount:BYTE Flags:BYTE Version:WORD Unknown:WORD PaletteOffset:WORD headerSize = READ_SCI11ENDIAN_UINT16(_resourceData + 0) + 2; // headerSize is not part of the header, so it's added assert(headerSize >= 16); _loopCount = _resourceData[2]; assert(_loopCount); _isSci2Hires = _resourceData[5] == 1 ? true : false; palOffset = READ_SCI11ENDIAN_UINT32(_resourceData + 8); - // FIXME: After LoopCount there is another byte and its set for view 50 - // within Laura Bow 2 CD, check what it means. + // flags is actually a bit-mask + // it seems it was only used for some early sci1.1 games (or even just laura bow 2) + // later interpreters dont support it at all anymore + // we assume that if flags is 0h the view does not support flags and default to scaleable + // if it's 1h then we assume that the view is not to be scaled + // if it's 40h then we assume that the view is scaleable + switch (_resourceData[3]) { + case 1: + _isScaleable = false; + break; + case 0x40: + case 0: + break; // don't do anything, we already have _isScaleable set + default: + error("unsupported flags byte inside sci1.1 view"); + break; + } loopData = _resourceData + headerSize; loopSize = _resourceData[12]; @@ -321,11 +337,15 @@ bool GfxView::isSci2Hires() { return _isSci2Hires; } +bool GfxView::isScaleable() { + return _isScaleable; +} + void GfxView::getCelRect(int16 loopNo, int16 celNo, int16 x, int16 y, int16 z, Common::Rect &outRect) const { const CelInfo *celInfo = getCelInfo(loopNo, celNo); outRect.left = x + celInfo->displaceX - (celInfo->width >> 1); outRect.right = outRect.left + celInfo->width; - outRect.bottom = y + celInfo->displaceY - z + 1 + adjustForSci0Early; + outRect.bottom = y + celInfo->displaceY - z + 1 + _adjustForSci0Early; outRect.top = outRect.bottom - celInfo->height; } diff --git a/engines/sci/graphics/view.h b/engines/sci/graphics/view.h index 0853f2e5a6..990a7e2f71 100644 --- a/engines/sci/graphics/view.h +++ b/engines/sci/graphics/view.h @@ -74,6 +74,7 @@ public: uint16 getCelCount(int16 loopNo) const; Palette *getPalette(); + bool isScaleable(); bool isSci2Hires(); private: @@ -102,7 +103,11 @@ private: byte *_EGAmapping; // this is set for sci0early to adjust for the getCelRect() change - int16 adjustForSci0Early; + int16 _adjustForSci0Early; + + // this is not set for some views in laura bow 2 floppy and signals that the view shall never get scaled + // even if scaleX/Y are set (inside kAnimate) + bool _isScaleable; }; } // End of namespace Sci -- cgit v1.2.3 From 5ca6b33ba7bd9b6c5c35635d8f56f695ca931ce1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 2 Aug 2010 21:20:43 +0000 Subject: SCI: Silenced some sound related warnings. Added an empty function for kDoSound(Restore), called when restoring games svn-id: r51661 --- engines/sci/engine/kernel.h | 3 ++- engines/sci/engine/kernel_tables.h | 8 ++++---- engines/sci/engine/ksound.cpp | 3 ++- engines/sci/sound/soundcmd.cpp | 9 ++++++++- engines/sci/sound/soundcmd.h | 3 ++- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 285e746349..02ce102f30 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -467,7 +467,7 @@ reg_t kMoveToEnd(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundInit(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundPlay(EngineState *s, int argc, reg_t *argv); -reg_t kDoSoundDummy(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundRestore(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundDispose(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundMute(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundStop(EngineState *s, int argc, reg_t *argv); @@ -482,6 +482,7 @@ reg_t kDoSoundUpdateCues(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSendMidi(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundReverb(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetHold(EngineState *s, int argc, reg_t *argv); +reg_t kDoSoundDummy(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundGetAudioCapability(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSuspend(EngineState *s, int argc, reg_t *argv); reg_t kDoSoundSetVolume(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index a0995b8e66..cc1c622e2d 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -86,7 +86,7 @@ struct SciKernelMapSubEntry { static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 0, MAP_CALL(DoSoundInit), "o", NULL }, { SIG_SOUNDSCI0, 1, MAP_CALL(DoSoundPlay), "o", NULL }, - { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundDummy), "(o)", NULL }, + { SIG_SOUNDSCI0, 2, MAP_CALL(DoSoundRestore), "(o)", NULL }, { SIG_SOUNDSCI0, 3, MAP_CALL(DoSoundDispose), "o", NULL }, { SIG_SOUNDSCI0, 4, MAP_CALL(DoSoundMute), "(i)", NULL }, { SIG_SOUNDSCI0, 5, MAP_CALL(DoSoundStop), "o", NULL }, @@ -99,7 +99,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { { SIG_SOUNDSCI0, 12, MAP_CALL(DoSoundStopAll), "", NULL }, { SIG_SOUNDSCI1EARLY, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI1EARLY, 2, MAP_CALL(DoSoundRestore), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 4, MAP_CALL(DoSoundUpdate), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 5, MAP_CALL(DoSoundInit), NULL, NULL }, @@ -120,7 +120,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { // ^^ Longbow demo { SIG_SOUNDSCI1LATE, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI1LATE, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundDummy), "", NULL }, + { SIG_SOUNDSCI1LATE, 2, MAP_CALL(DoSoundRestore), "", NULL }, { SIG_SOUNDSCI1LATE, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, { SIG_SOUNDSCI1LATE, 4, MAP_CALL(DoSoundGetAudioCapability), "", NULL }, { SIG_SOUNDSCI1LATE, 5, MAP_CALL(DoSoundSuspend), "i", NULL }, @@ -142,7 +142,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { #ifdef ENABLE_SCI32 { SIG_SOUNDSCI21, 0, MAP_CALL(DoSoundMasterVolume), NULL, NULL }, { SIG_SOUNDSCI21, 1, MAP_CALL(DoSoundMute), NULL, NULL }, - { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundDummy), NULL, NULL }, + { SIG_SOUNDSCI21, 2, MAP_CALL(DoSoundRestore), NULL, NULL }, { SIG_SOUNDSCI21, 3, MAP_CALL(DoSoundGetPolyphony), NULL, NULL }, { SIG_SOUNDSCI21, 4, MAP_CALL(DoSoundGetAudioCapability), NULL, NULL }, { SIG_SOUNDSCI21, 5, MAP_CALL(DoSoundSuspend), NULL, NULL }, diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index a8dc0eff16..2f00cd7da2 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -48,7 +48,7 @@ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { CREATE_DOSOUND_FORWARD(DoSoundInit) CREATE_DOSOUND_FORWARD(DoSoundPlay) -CREATE_DOSOUND_FORWARD(DoSoundDummy) +CREATE_DOSOUND_FORWARD(DoSoundRestore) CREATE_DOSOUND_FORWARD(DoSoundDispose) CREATE_DOSOUND_FORWARD(DoSoundMute) CREATE_DOSOUND_FORWARD(DoSoundStop) @@ -63,6 +63,7 @@ CREATE_DOSOUND_FORWARD(DoSoundUpdateCues) CREATE_DOSOUND_FORWARD(DoSoundSendMidi) CREATE_DOSOUND_FORWARD(DoSoundReverb) CREATE_DOSOUND_FORWARD(DoSoundSetHold) +CREATE_DOSOUND_FORWARD(DoSoundDummy) CREATE_DOSOUND_FORWARD(DoSoundGetAudioCapability) CREATE_DOSOUND_FORWARD(DoSoundSuspend) CREATE_DOSOUND_FORWARD(DoSoundSetVolume) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index b12037065b..52c97eba90 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -147,6 +147,12 @@ void SoundCommandParser::processPlaySound(reg_t obj) { _music->soundPlay(musicSlot); } +reg_t SoundCommandParser::kDoSoundRestore(int argc, reg_t *argv, reg_t acc) { + // Called after loading, to restore the playlist + // We don't really use or need this + return acc; +} + reg_t SoundCommandParser::kDoSoundDummy(int argc, reg_t *argv, reg_t acc) { warning("cmdDummy invoked"); // not supposed to occur return acc; @@ -246,7 +252,8 @@ reg_t SoundCommandParser::kDoSoundPause(int argc, reg_t *argv, reg_t acc) { } else { // pause a playlist slot MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("kDoSound(pause): Slot not found (%04x:%04x)", PRINT_REG(obj)); + // This happens quite frequently + debugC(2, kDebugLevelSound, "kDoSound(pause): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } diff --git a/engines/sci/sound/soundcmd.h b/engines/sci/sound/soundcmd.h index 10915e8ea9..8e6fb81762 100644 --- a/engines/sci/sound/soundcmd.h +++ b/engines/sci/sound/soundcmd.h @@ -82,7 +82,7 @@ public: reg_t kDoSoundInit(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundPlay(int argc, reg_t *argv, reg_t acc); - reg_t kDoSoundDummy(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundRestore(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundMute(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundPause(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundResumeAfterRestore(int argc, reg_t *argv, reg_t acc); @@ -97,6 +97,7 @@ public: reg_t kDoSoundSendMidi(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundReverb(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundSetHold(int argc, reg_t *argv, reg_t acc); + reg_t kDoSoundDummy(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundGetAudioCapability(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundSetVolume(int argc, reg_t *argv, reg_t acc); reg_t kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc); -- cgit v1.2.3 From 7da703f0af8cf85d7f961d43becee616dffa28aa Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 21:37:43 +0000 Subject: SCI: adding workaround for qfg2 (restore game) svn-id: r51662 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 359fb16c97..d8ea7ff7e1 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -111,6 +111,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 + { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From d42d7ad6c52ad90c53b510f10611cbbb6eb56f5b Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 21:44:41 +0000 Subject: SCI: allowing kCheckSaveGame with id 0 qfg2 - when trying to restore from an empty saved game list svn-id: r51663 --- engines/sci/engine/kfile.cpp | 6 +++++- engines/sci/engine/workarounds.cpp | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 4f0ad12285..39c32ccc68 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -488,6 +488,10 @@ reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) { Common::Array saves; listSavegames(saves); + // we allow 0 (happens in QfG2 when trying to restore from an empty saved game list) and return false in that case + if (virtualId == 0) + return NULL_REG; + // Find saved-game if ((virtualId < SAVEGAMEID_OFFICIALRANGE_START) || (virtualId > SAVEGAMEID_OFFICIALRANGE_END)) error("kCheckSaveGame: called with invalid savegameId!"); @@ -502,7 +506,7 @@ reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) { return NULL_REG; // Otherwise we assume the savegame is OK - return make_reg(0, 1); + return TRUE_REG; } reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index d8ea7ff7e1..336dd5343b 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -111,7 +111,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 - { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 0, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present + { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser -- cgit v1.2.3 From 0f339921edc7908fafa4a9098211255abd6ee13c Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 21:57:17 +0000 Subject: SCI: only display qfg-import information dialog once per room usage svn-id: r51664 --- engines/sci/engine/kgraphics.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 2b0e3b3726..e1e92b1cf9 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -918,14 +918,20 @@ reg_t kDrawControl(EngineState *s, int argc, reg_t *argv) { if (objName == "savedHeros") { // Import of QfG character files dialog is shown // display additional popup information before letting user use it - GUI::MessageDialog dialog("Characters saved inside ScummVM are shown " - "automatically. Character files saved in the original " - "interpreter need to be put inside ScummVM's saved games " - "directory and a prefix needs to be added depending on which " - "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " - "for Quest for Glory 2. Example: 'qfg2-thief.sav'.", - "OK"); - dialog.runModal(); + reg_t changeDirButton = s->_segMan->findObjectByName("changeDirItem"); + if (!changeDirButton.isNull()) { + // check if checkDirButton is still enabled, in that case we are called the first time during that room + if (!(readSelectorValue(s->_segMan, changeDirButton, SELECTOR(state)) & SCI_CONTROLS_STYLE_DISABLED)) { + GUI::MessageDialog dialog("Characters saved inside ScummVM are shown " + "automatically. Character files saved in the original " + "interpreter need to be put inside ScummVM's saved games " + "directory and a prefix needs to be added depending on which " + "game it was saved in: 'qfg1-' for Quest for Glory 1, 'qfg2-' " + "for Quest for Glory 2. Example: 'qfg2-thief.sav'.", + "OK"); + dialog.runModal(); + } + } } _k_GenericDrawControl(s, controlObject, false); -- cgit v1.2.3 From a1001731fa50c730dcf834b724edfb89a8352298 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 2 Aug 2010 22:12:45 +0000 Subject: SCI: fixing leak kernel subfunctions svn-id: r51665 --- engines/sci/engine/kernel.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 73fb3de062..e702002199 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -43,8 +43,17 @@ Kernel::Kernel(ResourceManager *resMan, SegManager *segMan) } Kernel::~Kernel() { - for (KernelFunctionArray::iterator i = _kernelFuncs.begin(); i != _kernelFuncs.end(); ++i) - delete[] i->signature; + for (KernelFunctionArray::iterator it = _kernelFuncs.begin(); it != _kernelFuncs.end(); ++it) { + if (it->subFunctionCount) { + uint16 subFunctionNr = 0; + while (subFunctionNr < it->subFunctionCount) { + delete[] it->subFunctions[subFunctionNr].signature; + subFunctionNr++; + } + delete[] it->subFunctions; + } + delete[] it->signature; + } } uint Kernel::getSelectorNamesSize() const { -- cgit v1.2.3 From dd38e424e7ec87990019f4a811fdc25c62fe1729 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 22:27:26 +0000 Subject: SCI: Fix leaks in ResourceManager::listResources caller code. svn-id: r51666 --- engines/sci/console.cpp | 3 ++- engines/sci/detection.cpp | 2 +- engines/sci/engine/features.cpp | 3 +++ engines/sci/engine/kscripts.cpp | 1 + engines/sci/resource.cpp | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 7407f08482..bac31f6c8e 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -844,6 +844,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { } DebugPrintf("SCI1.1-SCI2.1 script check finished\n"); + delete resources; return true; } @@ -1006,6 +1007,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { DebugPrintf("\n\n"); } + delete resources; return true; } @@ -1051,7 +1053,6 @@ bool Console::cmdList(int argc, const char **argv) { ++itr; } DebugPrintf("\n"); - delete resources; } diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 3a8e10fd84..e330bd5f30 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -299,7 +299,7 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R if (sierraId == "fp" || sierraId == "gk" || sierraId == "pq4") demoThreshold = 150; - Common::List *resources = resMan->listResources(kResourceTypeScript, -1); + Common::ScopedPtr > resources(resMan->listResources(kResourceTypeScript, -1)); if (resources->size() < demoThreshold) { *gameFlags |= ADGF_DEMO; diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index ad6d4d728d..f99d412c64 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -438,6 +438,8 @@ SciVersion GameFeatures::detectMessageFunctionType() { Common::List *resources = g_sci->getResMan()->listResources(kResourceTypeMessage, -1); if (resources->empty()) { + delete resources; + // No messages found, so this doesn't really matter anyway... _messageFunctionType = SCI_VERSION_1_1; return _messageFunctionType; @@ -445,6 +447,7 @@ SciVersion GameFeatures::detectMessageFunctionType() { Resource *res = g_sci->getResMan()->findResource(*resources->begin(), false); assert(res); + delete resources; // Only v2 Message resources use the kGetMessage kernel function. // v3-v5 use the kMessage kernel function. diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index e211867ef9..a5501c160f 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -95,6 +95,7 @@ reg_t kLock(EngineState *s, int argc, reg_t *argv) { ++itr; } + delete resources; } else { which = g_sci->getResMan()->findResource(id, 0); diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 2fdf091314..d59b21eef6 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -665,6 +665,7 @@ int ResourceManager::addInternalSources() { ++itr; } + delete resources; return 1; } -- cgit v1.2.3 From 0dba655085e3c5f025ae111be4929d5a9250d95a Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 22:27:50 +0000 Subject: SCI: Fix memory leak. This was a quite bad leak in gamestate_restore. It was caused by the code only deleting the Graphics::Surface object but not its data. I changed the code to use skipThumbnailHeader now, since the code actually ignores the thumbnail anyway. svn-id: r51667 --- engines/sci/engine/savegame.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 64bd46563a..10a2cbd569 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -748,11 +748,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } // We don't need the thumbnail here, so just read it and discard it - Graphics::Surface *thumbnail = new Graphics::Surface(); - assert(thumbnail); - Graphics::loadThumbnail(*fh, *thumbnail); - delete thumbnail; - thumbnail = 0; + Graphics::skipThumbnailHeader(*fh); s->reset(true); s->saveLoadWithSerializer(ser); // FIXME: Error handling? -- cgit v1.2.3 From 4e33b7a3befbc4d14cdb57ac8da8c205ca724cb0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 22:28:30 +0000 Subject: GRAPHICS: Renamed skipThumbnailHeader to skipThumbnail. svn-id: r51668 --- engines/kyra/saveload.cpp | 2 +- engines/sci/engine/savegame.cpp | 2 +- engines/scumm/saveload.cpp | 4 ++-- engines/sword1/control.cpp | 3 +-- graphics/thumbnail.cpp | 2 +- graphics/thumbnail.h | 4 ++-- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp index 959d89f0ad..56e1c73d0a 100644 --- a/engines/kyra/saveload.cpp +++ b/engines/kyra/saveload.cpp @@ -122,7 +122,7 @@ KyraEngine_v1::kReadSaveHeaderError KyraEngine_v1::readSaveHeader(Common::Seekab header.thumbnail = 0; } } else { - Graphics::skipThumbnailHeader(*in); + Graphics::skipThumbnail(*in); } } diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 10a2cbd569..0b0072432f 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -748,7 +748,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } // We don't need the thumbnail here, so just read it and discard it - Graphics::skipThumbnailHeader(*fh); + Graphics::skipThumbnail(*fh); s->reset(true); s->saveLoadWithSerializer(ser); // FIXME: Error handling? diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 762b38fba2..3cc619f630 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -364,7 +364,7 @@ bool ScummEngine::loadState(int slot, bool compat) { } } - Graphics::skipThumbnailHeader(*in); + Graphics::skipThumbnail(*in); } // Since version 56 we save additional information about the creation of @@ -721,7 +721,7 @@ bool ScummEngine::loadInfosFromSlot(const char *target, int slot, InfoStuff *stu return false; } - if (!Graphics::skipThumbnailHeader(*in)) { + if (!Graphics::skipThumbnail(*in)) { delete in; return false; } diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp index d6a04513a8..8d9ca85829 100644 --- a/engines/sword1/control.cpp +++ b/engines/sword1/control.cpp @@ -1175,8 +1175,7 @@ bool Control::restoreGameFromFile(uint8 slot) { if (saveVersion < 2) // These older version of the savegames used a flag to signal presence of thumbnail inf->skip(1); - if (Graphics::checkThumbnailHeader(*inf)) - Graphics::skipThumbnailHeader(*inf); + Graphics::skipThumbnail(*inf); inf->readUint32BE(); // save date inf->readUint16BE(); // save time diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp index 4c8ce289cf..ccde78806d 100644 --- a/graphics/thumbnail.cpp +++ b/graphics/thumbnail.cpp @@ -82,7 +82,7 @@ bool checkThumbnailHeader(Common::SeekableReadStream &in) { return hasHeader; } -bool skipThumbnailHeader(Common::SeekableReadStream &in) { +bool skipThumbnail(Common::SeekableReadStream &in) { uint32 position = in.pos(); ThumbnailHeader header; diff --git a/graphics/thumbnail.h b/graphics/thumbnail.h index b3fdb70b95..0465173364 100644 --- a/graphics/thumbnail.h +++ b/graphics/thumbnail.h @@ -39,11 +39,11 @@ namespace Graphics { bool checkThumbnailHeader(Common::SeekableReadStream &in); /** - * Skips a thumbnail header, if present. + * Skips a thumbnail, if present. * * @param in stream to process */ -bool skipThumbnailHeader(Common::SeekableReadStream &in); +bool skipThumbnail(Common::SeekableReadStream &in); /** * Lodas a thumbnail from the given input stream. -- cgit v1.2.3 From 92b0b384eaea0540bf7c06652d799b616ebf4c3c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 22:35:29 +0000 Subject: SCI: Fix memory leak. svn-id: r51669 --- engines/sci/engine/message.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp index cdecc556e8..6e1b326c4f 100644 --- a/engines/sci/engine/message.cpp +++ b/engines/sci/engine/message.cpp @@ -166,6 +166,8 @@ bool MessageState::getRecord(CursorStack &stack, bool recurse, MessageRecord &re } if (!reader->init()) { + delete reader; + warning("Message: failed to read resource header"); return false; } @@ -180,6 +182,7 @@ bool MessageState::getRecord(CursorStack &stack, bool recurse, MessageRecord &re continue; } + delete reader; return false; } @@ -193,6 +196,7 @@ bool MessageState::getRecord(CursorStack &stack, bool recurse, MessageRecord &re } } + delete reader; return true; } } -- cgit v1.2.3 From a76f5449bc741d35a76ed9173350b3c18dbb87bd Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 2 Aug 2010 23:03:04 +0000 Subject: SCI: Yet another slight leak fix. svn-id: r51670 --- engines/sci/engine/savegame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0b0072432f..bb9ac0ba20 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -769,6 +769,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); // Message state: + delete s->_msgState; s->_msgState = new MessageState(s->_segMan); s->abortScriptProcessing = kAbortLoadGame; -- cgit v1.2.3 From 39846310d79e75faf55482a239ec5ca8eaf34c2b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 3 Aug 2010 00:02:46 +0000 Subject: SOUND: Constify waveform table; slightly simplify code svn-id: r51671 --- sound/softsynth/sid.cpp | 13 ++++--------- sound/softsynth/sid.h | 13 ++++--------- sound/softsynth/wave6581.cpp | 15 +++++---------- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/sound/softsynth/sid.cpp b/sound/softsynth/sid.cpp index d600ac28f5..e925f4a447 100644 --- a/sound/softsynth/sid.cpp +++ b/sound/softsynth/sid.cpp @@ -46,11 +46,6 @@ const int SID::FIXP_MASK = 0xffff; WaveformGenerator::WaveformGenerator() { sync_source = this; - wave__ST = wave6581__ST; - wave_P_T = wave6581_P_T; - wave_PS_ = wave6581_PS_; - wave_PST = wave6581_PST; - reset(); } @@ -226,19 +221,19 @@ RESID_INLINE reg12 WaveformGenerator::outputN___() { // Combined waveforms: RESID_INLINE reg12 WaveformGenerator::output__ST() { - return wave__ST[output__S_()] << 4; + return wave6581__ST[output__S_()] << 4; } RESID_INLINE reg12 WaveformGenerator::output_P_T() { - return (wave_P_T[output___T() >> 1] << 4) & output_P__(); + return (wave6581_P_T[output___T() >> 1] << 4) & output_P__(); } RESID_INLINE reg12 WaveformGenerator::output_PS_() { - return (wave_PS_[output__S_()] << 4) & output_P__(); + return (wave6581_PS_[output__S_()] << 4) & output_P__(); } RESID_INLINE reg12 WaveformGenerator::output_PST() { - return (wave_PST[output__S_()] << 4) & output_P__(); + return (wave6581_PST[output__S_()] << 4) & output_P__(); } // Combined waveforms including noise: diff --git a/sound/softsynth/sid.h b/sound/softsynth/sid.h index d57ec73bad..c78f538441 100644 --- a/sound/softsynth/sid.h +++ b/sound/softsynth/sid.h @@ -118,15 +118,10 @@ protected: reg12 outputNPST(); // Sample data for combinations of waveforms. - static reg8 wave6581__ST[]; - static reg8 wave6581_P_T[]; - static reg8 wave6581_PS_[]; - static reg8 wave6581_PST[]; - - reg8* wave__ST; - reg8* wave_P_T; - reg8* wave_PS_; - reg8* wave_PST; + static const reg8 wave6581__ST[]; + static const reg8 wave6581_P_T[]; + static const reg8 wave6581_PS_[]; + static const reg8 wave6581_PST[]; friend class Voice; friend class SID; diff --git a/sound/softsynth/wave6581.cpp b/sound/softsynth/wave6581.cpp index 29998dcd0a..d1ddad1623 100644 --- a/sound/softsynth/wave6581.cpp +++ b/sound/softsynth/wave6581.cpp @@ -32,11 +32,9 @@ #include "sid.h" -namespace Resid -{ +namespace Resid { -reg8 WaveformGenerator::wave6581__ST[] = -{ +const reg8 WaveformGenerator::wave6581__ST[] = { /* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -551,8 +549,7 @@ reg8 WaveformGenerator::wave6581__ST[] = /* 0xff8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, }; -reg8 WaveformGenerator::wave6581_P_T[] = -{ +const reg8 WaveformGenerator::wave6581_P_T[] = { /* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1067,8 +1064,7 @@ reg8 WaveformGenerator::wave6581_P_T[] = /* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; -reg8 WaveformGenerator::wave6581_PS_[] = -{ +const reg8 WaveformGenerator::wave6581_PS_[] = { /* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1583,8 +1579,7 @@ reg8 WaveformGenerator::wave6581_PS_[] = /* 0xff8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, }; -reg8 WaveformGenerator::wave6581_PST[] = -{ +const reg8 WaveformGenerator::wave6581_PST[] = { /* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -- cgit v1.2.3 From 0437ffa75c510f0bb8a3a5cd580b79008446522e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 3 Aug 2010 00:03:04 +0000 Subject: N64: Error out in configure if N64SDK is not set svn-id: r51672 --- configure | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure b/configure index 454544300b..d276ab541c 100755 --- a/configure +++ b/configure @@ -1108,6 +1108,12 @@ ds | gamecube | wii) exit 1 fi ;; +n64) + if test -z "$N64SDK"; then + echo "Please set N64SDK in your environment. export N64SDK=" + exit 1 + fi + ;; ps2) if test -z "$PS2SDK"; then echo "Please set PS2SDK in your environment. export PS2SDK=" -- cgit v1.2.3 From 02cca98ed6fce6d7aced41974eaf2fd1622f207c Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 3 Aug 2010 11:25:20 +0000 Subject: SCUMM: Add posibility to disable NES APU which is CPU demanding svn-id: r51679 --- engines/scumm/player_nes.cpp | 3 +++ engines/scumm/scumm.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/engines/scumm/player_nes.cpp b/engines/scumm/player_nes.cpp index 4618de3175..96396e7a08 100644 --- a/engines/scumm/player_nes.cpp +++ b/engines/scumm/player_nes.cpp @@ -23,6 +23,7 @@ * */ +#ifndef DISABLE_NES_APU #include "engines/engine.h" #include "scumm/player_nes.h" @@ -1065,3 +1066,5 @@ byte Player_NES::APU_readStatus() { } } // End of namespace Scumm + +#endif // DISABLE_NES_APU diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index b44184f5cb..fc95060b6f 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -1723,7 +1723,9 @@ void ScummEngine::setupMusic(int midi) { _musicEngine = new Player_SID(this, _mixer); #endif } else if (_game.platform == Common::kPlatformNES && _game.version == 1) { +#ifndef DISABLE_NES_APU _musicEngine = new Player_NES(this, _mixer); +#endif } else if (_game.platform == Common::kPlatformAmiga && _game.version == 2) { _musicEngine = new Player_V2A(this, _mixer); } else if (_game.platform == Common::kPlatformAmiga && _game.version == 3) { -- cgit v1.2.3 From 5d212755ced446403739a229277b0087c9f8ec08 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 3 Aug 2010 11:25:37 +0000 Subject: NDS: Disable NES APU for the platform svn-id: r51680 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index d276ab541c..abc044e171 100755 --- a/configure +++ b/configure @@ -1540,7 +1540,7 @@ if test -n "$_host"; then DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE -DSTREAM_AUDIO_FROM_DISK" - DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID" + DEFINES="$DEFINES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE" _need_memalign=yes add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1' -- cgit v1.2.3 From 1ec8a75ef6a07436d8e143fba7662a00ac39afd8 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 3 Aug 2010 11:25:52 +0000 Subject: N64: Disable CPU-hungry sound chips svn-id: r51681 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index abc044e171..f8343f3a6a 100755 --- a/configure +++ b/configure @@ -1448,7 +1448,7 @@ case $_host_os in n64) DEFINES="$DEFINES -D__N64__ -DLIMIT_FPS -DNONSTANDARD_PORT" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_COMMAND_LINE" - DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DDISABLE_DOSBOX_OPL -DDISABLE_SID -DDISABLE_NES_APU" ;; os2-emx*) _unix=yes # FIXME??? Why?? -- cgit v1.2.3 From ed9c3093b5cf041b8ddb304a5a03ec6dad3575f6 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 3 Aug 2010 11:26:10 +0000 Subject: PS2: Disable CPU-hungry sound chips svn-id: r51682 --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index f8343f3a6a..5c9bcdf884 100755 --- a/configure +++ b/configure @@ -1706,6 +1706,7 @@ if test -n "$_host"; then ps2) # TODO: complete this DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" _need_memalign=yes _backend="ps2" _build_scalers=no -- cgit v1.2.3 From 3932ebfaf04e7c759b672170692ae39ee03c6159 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 3 Aug 2010 11:26:32 +0000 Subject: PSP: Disable CPU-hungry sound chips svn-id: r51683 --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index 5c9bcdf884..dfbc7f2964 100755 --- a/configure +++ b/configure @@ -2564,6 +2564,7 @@ case $_backend in ;; psp) DEFINES="$DEFINES -D__PSP__ -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" + DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" LDFLAGS="$LDFLAGS -Wl,--wrap,memcpy" ;; -- cgit v1.2.3 From bcd6dd26278a2c29209ac1505c655e846f01daf9 Mon Sep 17 00:00:00 2001 From: Joost Peters Date: Tue, 3 Aug 2010 12:03:36 +0000 Subject: PSP: Enable "CPU-hungry sound chips" again, the PSP is fast enough. svn-id: r51684 --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index dfbc7f2964..5c9bcdf884 100755 --- a/configure +++ b/configure @@ -2564,7 +2564,6 @@ case $_backend in ;; psp) DEFINES="$DEFINES -D__PSP__ -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL" - DEFINES="$DEFINES -DDISABLE_SID -DDISABLE_NES_APU" LIBS="$LIBS -lpng -Wl,-Map,mapfile.txt" LDFLAGS="$LDFLAGS -Wl,--wrap,memcpy" ;; -- cgit v1.2.3 From 3b4b00cf5099e3720ae93bff17c7778389b5ff62 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Tue, 3 Aug 2010 12:29:08 +0000 Subject: PSP: Factored out thread creation routines into PspThreadable class. This should aid in further optimizations. svn-id: r51685 --- backends/platform/psp/audio.cpp | 45 +++++-------------------------- backends/platform/psp/audio.h | 10 +++---- backends/platform/psp/display_manager.cpp | 30 ++++++--------------- backends/platform/psp/display_manager.h | 12 +++++---- backends/platform/psp/thread.cpp | 45 ++++++++++++++++++++++++++++++- backends/platform/psp/thread.h | 20 ++++++++++++-- 6 files changed, 89 insertions(+), 73 deletions(-) diff --git a/backends/platform/psp/audio.cpp b/backends/platform/psp/audio.cpp index bf1fb9ab41..e540733162 100644 --- a/backends/platform/psp/audio.cpp +++ b/backends/platform/psp/audio.cpp @@ -28,7 +28,6 @@ #include "common/scummsys.h" #include "backends/platform/psp/audio.h" -#include "backends/platform/psp/thread.h" //#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ //#define __PSP_DEBUG_PRINT__ /* For debug printouts */ @@ -85,43 +84,13 @@ bool PspAudio::open(uint32 freq, uint32 numOfChannels, uint32 numOfSamples, call _init = true; _paused = true; // start in paused mode - createThread(); + threadCreateAndStart("audioThread", PRIORITY_AUDIO_THREAD, STACK_AUDIO_THREAD); // start the consumer thread return true; } -bool PspAudio::createThread() { - DEBUG_ENTER_FUNC(); - int threadId = sceKernelCreateThread("audioThread", thread, PRIORITY_AUDIO_THREAD, STACK_AUDIO_THREAD, THREAD_ATTR_USER, 0); - - if (threadId < 0) { // error - PSP_ERROR("failed to create audio thread. Error code %d\n", threadId); - return false; - } - - PspAudio *_this = this; // trick to get into context when the thread starts - - if (sceKernelStartThread(threadId, sizeof(uint32 *), &_this) < 0) { - PSP_ERROR("failed to start thread %d\n", threadId); - return false; - } - - PSP_DEBUG_PRINT("created audio thread[%x]\n", threadId); - - return true; -} - -// Static function to be called upon thread startup. Will call a non-static function -int PspAudio::thread(SceSize, void *__this) { - DEBUG_ENTER_FUNC(); - PspAudio *_this = *(PspAudio **)__this; // get our this for the context - - _this->audioThread(); - return 0; -}; - // The real thread function -void PspAudio::audioThread() { +void PspAudio::threadFunction() { assert(_callback); PSP_DEBUG_PRINT_FUNC("audio thread started\n"); @@ -129,15 +98,15 @@ void PspAudio::audioThread() { if (_paused) PSP_DEBUG_PRINT("audio thread paused\n"); while (_paused) { // delay until we stop pausing - sceKernelDelayThread(100000); // 100ms + PspThread::delayMicros(100000); // 100ms if (!_paused) PSP_DEBUG_PRINT("audio thread unpaused\n"); } - PSP_DEBUG_PRINT("remaining samples[%d]\n", remainingSamples); + PSP_DEBUG_PRINT("remaining samples[%d]\n", _remainingSamples); PSP_DEBUG_PRINT("filling buffer[%d]\n", _bufferToFill); - _callback(_userData, _buffers[_bufferToFill], _bufferSize); // ask mixer to fill in + _callback(_userData, _buffers[_bufferToFill], _bufferSize); // ask mixer to fill in data nextBuffer(_bufferToFill); PSP_DEBUG_PRINT("playing buffer[%d].\n", _bufferToPlay); @@ -151,7 +120,7 @@ void PspAudio::audioThread() { PSP_DEBUG_PRINT("audio thread exiting. ****************************\n"); } -// Much faster than using % +// Much faster than using %, especially with conditional moves (MIPS) inline void PspAudio::nextBuffer(int &bufferIdx) { DEBUG_ENTER_FUNC(); bufferIdx++; @@ -176,6 +145,6 @@ inline bool PspAudio::playBuffer() { } void PspAudio::close() { - PSP_DEBUG_PRINT("close had been called ***************\n"); + PSP_DEBUG_PRINT("close has been called ***************\n"); _init = false; } diff --git a/backends/platform/psp/audio.h b/backends/platform/psp/audio.h index 603f8f6bfc..eeba598fed 100644 --- a/backends/platform/psp/audio.h +++ b/backends/platform/psp/audio.h @@ -26,13 +26,15 @@ #ifndef PSP_AUDIO_H #define PSP_AUDIO_H -class PspAudio { +#include "backends/platform/psp/thread.h" + +class PspAudio : public PspThreadable { public: enum { NUM_BUFFERS = 2, FREQUENCY = 44100 /* only frequency we allow */ }; - typedef void (* callbackFunc)(void *userData, byte *samples, int len); + typedef void (* callbackFunc)(void *userData, byte *samples, int len); // audio callback to call PspAudio() : _pspChannel(0), _numOfChannels(0), _numOfSamples(0), _callback(0), _bufferToPlay(0), _bufferToFill(0), @@ -43,14 +45,12 @@ public: ~PspAudio() { close(); } bool playBuffer(); void nextBuffer(int &bufferIdx); - static int thread(SceSize, void *); - void audioThread(); bool open(uint32 freq, uint32 numOfChannels, uint32 numOfSamples, callbackFunc callback, void *userData); - bool createThread(); void close(); uint32 getFrequency() { return FREQUENCY; } void pause() { _paused = true; } void unpause() { _paused = false; } + virtual void threadFunction(); // actual audio thread private: int _pspChannel; // chosen hardware output channel diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index a9f33f6091..5037543f12 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -34,7 +34,6 @@ #include "backends/platform/psp/default_display_client.h" #include "backends/platform/psp/cursor.h" #include "backends/platform/psp/pspkeyboard.h" -#include "backends/platform/psp/thread.h" #define USE_DISPLAY_CALLBACK // to use callback for finishing the render #include "backends/platform/psp/display_manager.h" @@ -65,37 +64,24 @@ const OSystem::GraphicsMode DisplayManager::_supportedModes[] = { void MasterGuRenderer::setupCallbackThread() { DEBUG_ENTER_FUNC(); - int thid = sceKernelCreateThread("displayCbThread", guCallbackThread, PRIORITY_DISPLAY_THREAD, STACK_DISPLAY_THREAD, THREAD_ATTR_USER, 0); - PSP_DEBUG_PRINT("Display CB thread id is %x\n", thid); - - // We want to pass the pointer to this, but we'll have to take address of this so use a little trick - MasterGuRenderer *_this = this; - - if (thid >= 0) { - sceKernelStartThread(thid, sizeof(uint32 *), &_this); - } else - PSP_ERROR("failed to create display callback thread\n"); + // start the thread that updates the display + threadCreateAndStart("DisplayCbThread", PRIORITY_DISPLAY_THREAD, STACK_DISPLAY_THREAD); } -// thread that reacts to the callback -int MasterGuRenderer::guCallbackThread(SceSize, void *__this) { +// this function gets called by PspThread when starting the new thread +void MasterGuRenderer::threadFunction() { DEBUG_ENTER_FUNC(); - // Dereferenced the copied value which was this - MasterGuRenderer *_this = *(MasterGuRenderer **)__this; - // Create the callback. It should always get the pointer to MasterGuRenderer - _this->_callbackId = sceKernelCreateCallback("Display Callback", guCallback, _this); - if (_this->_callbackId < 0) { - PSP_ERROR("failed to create display callback\n"); - return -1; + _callbackId = sceKernelCreateCallback("Display Callback", guCallback, this); + if (_callbackId < 0) { + PSP_ERROR("failed to create display callback\n"); } PSP_DEBUG_PRINT("created callback. Going to sleep\n"); - sceKernelSleepThreadCB(); // sleep until we get a callback - return 0; + sceKernelSleepThreadCB(); // sleep until we get a callback } // This callback is called when the render is finished. It swaps the buffers diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h index dbbdf2022c..1f7320902c 100644 --- a/backends/platform/psp/display_manager.h +++ b/backends/platform/psp/display_manager.h @@ -26,10 +26,12 @@ #ifndef PSP_DISPLAY_MAN_H #define PSP_DISPLAY_MAN_H +#include "backends/platform/psp/thread.h" + /** * Class used only by DisplayManager to start/stop GU rendering */ -class MasterGuRenderer { +class MasterGuRenderer : public PspThreadable { public: MasterGuRenderer() : _lastRenderTime(0), _renderFinished(true), _callbackId(-1) {} void guInit(); @@ -37,15 +39,15 @@ public: void guPostRender(); void guShutDown(); bool isRenderFinished() { return _renderFinished; } - void setupCallbackThread(); + void setupCallbackThread(); private: + virtual void threadFunction(); // for the display callback thread static uint32 _displayList[]; uint32 _lastRenderTime; // For measuring rendering time void guProgramDisplayBufferSizes(); - static int guCallbackThread(SceSize, void *); // for the graphics callbacks - static int guCallback(int, int, void *__this); + static int guCallback(int, int, void *__this); // for the display callback bool _renderFinished; // for sync with render callback - int _callbackId; // to keep track of render callback + int _callbackId; // to keep track of render callback }; class Screen; diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index c19ff5f9e3..916b1e553b 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -28,7 +28,50 @@ #include "backends/platform/psp/thread.h" #include "backends/platform/psp/trace.h" -// Class PspThread -------------------------------------------------- +// Class PspThreadable -------------------------------------------------- +// Inherit this to create C++ threads easily + +bool PspThreadable::threadCreateAndStart(const char *threadName, int priority, int stackSize, bool useVfpu /*= false*/) { + DEBUG_ENTER_FUNC(); + + if (_threadId != -1) { + PSP_ERROR("thread already created!\n"); + return false; + } + + _threadId = sceKernelCreateThread(threadName, __threadCallback, priority, stackSize, THREAD_ATTR_USER, 0); // add VFPU support + + if (_threadId < 0) { + PSP_ERROR("failed to create %s thread. Error code %d\n", threadName, _threadId); + return false; + } + + // We want to pass the pointer to this, but we'll have to take address of this so use a little trick + PspThreadable *_this = this; + + if (sceKernelStartThread(_threadId, sizeof(uint32 *), &_this) < 0) { + PSP_ERROR("failed to start %s thread id[%d]\n", threadName, _threadId); + return false; + } + + PSP_DEBUG_PRINT("Started %s thread with id[%x]\n", threadName, _threadId); + + return true; +} + +// Callback function to be called by PSP kernel +int PspThreadable::__threadCallback(SceSize, void *__this) { + DEBUG_ENTER_FUNC(); + + PspThreadable *_this = *(PspThreadable **)__this; // Dereference the copied value which was 'this' + + _this->threadFunction(); // call the virtual function + + return 0; +} + +// PspThread class +// Utilities to access general thread functions void PspThread::delayMillis(uint32 ms) { sceKernelDelayThread(ms * 1000); diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index 27d53903d6..de1c10a2aa 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -26,11 +26,26 @@ #ifndef PSP_THREAD_H #define PSP_THREAD_H +#include #include "common/scummsys.h" +// class to inherit for creating threads +class PspThreadable { +protected: + int _threadId; + virtual void threadFunction() = 0; // this function will be called when the thread starts +public: + PspThreadable() : _threadId(-1) {} // constructor + virtual ~PspThreadable() {} // destructor + static int __threadCallback(SceSize, void *__this); // used to get called by sceKernelStartThread() Don't override + bool threadCreateAndStart(const char *threadName, int priority, int stackSize, bool useVfpu = false); +}; + +// class for thread utils class PspThread { -public: - static void delayMillis(uint32 ms); +public: + // static functions + static void delayMillis(uint32 ms); // delay the current thread static void delayMicros(uint32 us); }; @@ -85,6 +100,7 @@ enum ThreadPriority { }; enum StackSizes { + STACK_DEFAULT = 4 * 1024, STACK_AUDIO_THREAD = 16 * 1024, STACK_TIMER_THREAD = 32 * 1024, STACK_DISPLAY_THREAD = 2 * 1024, -- cgit v1.2.3 From 425b90f6d21c8fec27565b649f8d6bc10d926719 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 12:39:11 +0000 Subject: SCI: adding kDoSound(fade) workaround table to sci1early fixes kq5 bug #3037594 thx to [md5] for testing svn-id: r51686 --- engines/sci/engine/kernel_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index cc1c622e2d..b2b8eb593e 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -111,7 +111,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = { // it actually does internally { SIG_SOUNDSCI1EARLY, 8, MAP_CALL(DoSoundStop), NULL, NULL }, { SIG_SOUNDSCI1EARLY, 9, MAP_CALL(DoSoundPause), "[o0]i", NULL }, - { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", NULL }, + { SIG_SOUNDSCI1EARLY, 10, MAP_CALL(DoSoundFade), "oiiii", kDoSoundFade_workarounds }, { SIG_SOUNDSCI1EARLY, 11, MAP_CALL(DoSoundUpdateCues), "o", NULL }, { SIG_SOUNDSCI1EARLY, 12, MAP_CALL(DoSoundSendMidi), "oiii", NULL }, { SIG_SOUNDSCI1EARLY, 13, MAP_CALL(DoSoundReverb), "i", NULL }, -- cgit v1.2.3 From 32807512d949f482814ddda7d7625192cdc0f8ef Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 3 Aug 2010 12:41:36 +0000 Subject: SCI: Cleanup svn-id: r51687 --- engines/sci/engine/savegame.cpp | 6 ------ engines/sci/engine/segment.h | 3 --- 2 files changed, 9 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index bb9ac0ba20..f434e5326b 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -53,17 +53,11 @@ namespace Sci { #define VER(x) Common::Serializer::Version(x) -// OBSOLETE: This const is used for backward compatibility only. -const uint32 INTMAPPER_MAGIC_KEY = 0xDEADBEEF; - - #pragma mark - // TODO: Many of the following sync_*() methods should be turned into member funcs // of the classes they are syncing. -#define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle & 0xffff)) - void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { soundObj.saveLoadWithSerializer(s); s.syncAsSint16LE(resourceId); diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 2465576302..c8cb4cd203 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -143,9 +143,6 @@ public: } }; - -struct IntMapper; - enum { SYS_STRINGS_MAX = 4, -- cgit v1.2.3 From a1730b4b34d4893f2ada108928b43058648a8c62 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 12:46:18 +0000 Subject: SCI: adding workaround for sq5 on the bridge fixes bug #3038563 svn-id: r51689 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 336dd5343b..fed9a3cc42 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -118,6 +118,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) { GID_SQ4, -1, 398, 0, "showBox", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // sq4cd: called when rummaging in Software Excess bargain bin { GID_SQ4, -1, 928, 0, "Narrator", "startText", -1, 1000, { WORKAROUND_FAKE, 1 } }, // sq4cd: method returns this to the caller + { GID_SQ5, 201, 201, 0, "buttonPanel", "doVerb", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking at the orange or red button - bug #3038563 { GID_SQ6, 100, 0, 0, "SQ6", "init", -1, 2, { WORKAROUND_FAKE, 0 } }, // called when the game starts { GID_SQ6, 100, 64950, 0, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // called when pressing "Start game" in the main menu { GID_SQ6, -1, 64964, 0, "DPath", "init", -1, 1, { WORKAROUND_FAKE, 0 } }, // during the game -- cgit v1.2.3 From 8e08c432da73e014c7759f2f18019ddc3870771c Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 3 Aug 2010 13:12:42 +0000 Subject: FMTOWNS AUDIO: minor layout change svn-id: r51691 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 4 +- sound/softsynth/fmtowns_pc98/towns_audio.h | 2 +- .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 99 ++++++++++++++++++++ sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h | 102 +-------------------- 4 files changed, 105 insertions(+), 102 deletions(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index b3d37dbcd6..3d3427fcfb 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -129,7 +129,7 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac INTCB(notImpl), INTCB(writeReg), INTCB(notImpl), - INTCB(bufferedWriteReg), + INTCB(writeRegBuffer), // 20 INTCB(readRegBuffer), INTCB(setTimerA), @@ -399,7 +399,7 @@ int TownsAudioInterface::intf_writeReg(va_list &args) { return 0; } -int TownsAudioInterface::intf_bufferedWriteReg(va_list &args) { +int TownsAudioInterface::intf_writeRegBuffer(va_list &args) { int part = va_arg(args, int) ? 1 : 0; int reg = va_arg(args, int); int val = va_arg(args, int); diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 22784699bc..93a9198fe4 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -65,7 +65,7 @@ private: int intf_setLevel(va_list &args); int intf_chanOff(va_list &args); int intf_writeReg(va_list &args); - int intf_bufferedWriteReg(va_list &args); + int intf_writeRegBuffer(va_list &args); int intf_readRegBuffer(va_list &args); int intf_setTimerA(va_list &args); int intf_setTimerB(va_list &args); diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 65014f6201..7a91cb81b9 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -26,6 +26,96 @@ #include "sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h" #include "common/endian.h" +class TownsPC98_FmSynthOperator { +public: + TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, + const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, + const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); + ~TownsPC98_FmSynthOperator() {} + + void keyOn(); + void keyOff(); + void frequency(int freq); + void updatePhaseIncrement(); + void recalculateRates(); + void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); + + void feedbackLevel(int32 level) { + _feedbackLevel = level ? level + 6 : 0; + } + void detune(int value) { + _detn = &_detnTbl[value << 5]; + } + void multiple(uint32 value) { + _multiple = value ? (value << 1) : 1; + } + void attackRate(uint32 value) { + _specifiedAttackRate = value; + } + bool scaleRate(uint8 value); + void decayRate(uint32 value) { + _specifiedDecayRate = value; + recalculateRates(); + } + void sustainRate(uint32 value) { + _specifiedSustainRate = value; + recalculateRates(); + } + void sustainLevel(uint32 value) { + _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; + } + void releaseRate(uint32 value) { + _specifiedReleaseRate = value; + recalculateRates(); + } + void totalLevel(uint32 value) { + _totalLevel = value << 3; + } + void ampModulation(bool enable) { + _ampMod = enable; + } + void reset(); + +protected: + EnvelopeState _state; + bool _playing; + uint32 _feedbackLevel; + uint32 _multiple; + uint32 _totalLevel; + uint8 _keyScale1; + uint8 _keyScale2; + uint32 _specifiedAttackRate; + uint32 _specifiedDecayRate; + uint32 _specifiedSustainRate; + uint32 _specifiedReleaseRate; + uint32 _tickCount; + uint32 _sustainLevel; + + bool _ampMod; + uint32 _frequency; + uint8 _kcode; + uint32 _phase; + uint32 _phaseIncrement; + const int32 *_detn; + + const uint8 *_rateTbl; + const uint8 *_rshiftTbl; + const uint8 *_adTbl; + const uint32 *_fTbl; + const uint32 *_sinTbl; + const int32 *_tLvlTbl; + const int32 *_detnTbl; + + const uint32 _tickLength; + uint32 _timer; + int32 _currentLevel; + + struct EvpState { + uint8 rate; + uint8 shift; + } fs_a, fs_d, fs_s, fs_r; +}; + TownsPC98_FmSynthOperator::TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable) : @@ -1409,3 +1499,12 @@ const uint8 TownsPC98_FmSynth::_percussionData[] = { 45, 136, 18, 144, 105, 138, 1, 160, 14, 128, 132, 145, 186, 37, 138, 41, 192, 48, 145, 46, 160, 33, 44, 24, 225, 16, 13, 132, 136, 137, 16, 148, 25, 170, 194, 82, 152, 136, 91, 24, 42, 169, 33, 233, 131, 179, 24, 185, 149, 16, 57, 172, 164, 18, 10, 211, 160, 147, 211, 33, 138, 243, 129, 16, 41, 193, 0, 43, 132, 155, 73, 58, 145, 244, 145, 43, 35, 9, 171, 16, 110, 25, 8, 28, 74, 162, 128, 26, 27, 82, 45, 136, 153, 18, 8, 136, 8 }; + +TownsPC98_FmSynth::ChanInternal::ChanInternal() { + memset(this, 0, sizeof(ChanInternal)); +} + +TownsPC98_FmSynth::ChanInternal::~ChanInternal() { + for (uint i = 0; i < ARRAYSIZE(opr); ++i) + delete opr[i]; +} diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h index 3a40d6aed4..34ee2ce7b8 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h @@ -30,6 +30,7 @@ #include "sound/mixer.h" #include "common/list.h" +class TownsPC98_FmSynthOperator; class TownsPC98_FmSynthSquareSineSource; class TownsPC98_FmSynthPercussionSource; @@ -41,96 +42,6 @@ enum EnvelopeState { kEnvReleasing }; -class TownsPC98_FmSynthOperator { -public: - TownsPC98_FmSynthOperator(const uint32 timerbase, const uint8 *rateTable, - const uint8 *shiftTable, const uint8 *attackDecayTable, const uint32 *frqTable, - const uint32 *sineTable, const int32 *tlevelOut, const int32 *detuneTable); - ~TownsPC98_FmSynthOperator() {} - - void keyOn(); - void keyOff(); - void frequency(int freq); - void updatePhaseIncrement(); - void recalculateRates(); - void generateOutput(int32 phasebuf, int32 *feedbuf, int32 &out); - - void feedbackLevel(int32 level) { - _feedbackLevel = level ? level + 6 : 0; - } - void detune(int value) { - _detn = &_detnTbl[value << 5]; - } - void multiple(uint32 value) { - _multiple = value ? (value << 1) : 1; - } - void attackRate(uint32 value) { - _specifiedAttackRate = value; - } - bool scaleRate(uint8 value); - void decayRate(uint32 value) { - _specifiedDecayRate = value; - recalculateRates(); - } - void sustainRate(uint32 value) { - _specifiedSustainRate = value; - recalculateRates(); - } - void sustainLevel(uint32 value) { - _sustainLevel = (value == 0x0f) ? 0x3e0 : value << 5; - } - void releaseRate(uint32 value) { - _specifiedReleaseRate = value; - recalculateRates(); - } - void totalLevel(uint32 value) { - _totalLevel = value << 3; - } - void ampModulation(bool enable) { - _ampMod = enable; - } - void reset(); - -protected: - EnvelopeState _state; - bool _playing; - uint32 _feedbackLevel; - uint32 _multiple; - uint32 _totalLevel; - uint8 _keyScale1; - uint8 _keyScale2; - uint32 _specifiedAttackRate; - uint32 _specifiedDecayRate; - uint32 _specifiedSustainRate; - uint32 _specifiedReleaseRate; - uint32 _tickCount; - uint32 _sustainLevel; - - bool _ampMod; - uint32 _frequency; - uint8 _kcode; - uint32 _phase; - uint32 _phaseIncrement; - const int32 *_detn; - - const uint8 *_rateTbl; - const uint8 *_rshiftTbl; - const uint8 *_adTbl; - const uint32 *_fTbl; - const uint32 *_sinTbl; - const int32 *_tLvlTbl; - const int32 *_detnTbl; - - const uint32 _tickLength; - uint32 _timer; - int32 _currentLevel; - - struct EvpState { - uint8 rate; - uint8 shift; - } fs_a, fs_d, fs_s, fs_r; -}; - class TownsPC98_FmSynth : public Audio::AudioStream { public: enum EmuType { @@ -191,14 +102,8 @@ private: void generateOutput(int32 &leftSample, int32 &rightSample, int32 *del, int32 *feed); struct ChanInternal { - ChanInternal() { - memset(this, 0, sizeof(ChanInternal)); - } - - ~ChanInternal() { - for (uint i = 0; i < ARRAYSIZE(opr); ++i) - delete opr[i]; - } + ChanInternal(); + ~ChanInternal(); void ampModSensitivity(uint32 value) { ampModSvty = (1 << (3 - value)) - (((value >> 1) & 1) | (value & 1)); @@ -217,7 +122,6 @@ private: uint32 ampModSvty; uint32 frqModSvty; - TownsPC98_FmSynthOperator *opr[4]; }; -- cgit v1.2.3 From a02d9d656b8a066f362dd872d094dd4d849a8537 Mon Sep 17 00:00:00 2001 From: Jordi Vilalta Prat Date: Tue, 3 Aug 2010 13:15:34 +0000 Subject: GRAPHICS: Fix a typo in a comment. svn-id: r51692 --- graphics/thumbnail.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/thumbnail.h b/graphics/thumbnail.h index 0465173364..9341582aa1 100644 --- a/graphics/thumbnail.h +++ b/graphics/thumbnail.h @@ -46,7 +46,7 @@ bool checkThumbnailHeader(Common::SeekableReadStream &in); bool skipThumbnail(Common::SeekableReadStream &in); /** - * Lodas a thumbnail from the given input stream. + * Loads a thumbnail from the given input stream. * The loaded thumbnail will be automatically converted to the * current overlay pixelformat. */ -- cgit v1.2.3 From 4c7a6ac2d56e9fa136663028d6be45c01d53d321 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 13:17:30 +0000 Subject: SCI: adding workaround for pq3 inside kMemory fixing plot crimes warnings and bad text on screen svn-id: r51693 --- engines/sci/engine/kmisc.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 5ef4157119..47d86f920a 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -227,12 +227,22 @@ enum { reg_t kMemory(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { - case K_MEMORY_ALLOCATE_CRITICAL : - if (!s->_segMan->allocDynmem(argv[1].toUint16(), "kMemory() critical", &s->r_acc)) { + case K_MEMORY_ALLOCATE_CRITICAL: { + int byteCount = argv[1].toUint16(); + // WORKAROUND: pq3 when plotting crimes - allocates the returned bytes + // from kStrLen on "W" and "E" and wants to put a string in there, + // which doesn't fit of course. That's why we allocate one byte more + // all the time inside that room - maybe only multilingual pq3 + if (g_sci->getGameId() == GID_PQ3) { + if (s->currentRoomNumber() == 202) + byteCount++; + } + if (!s->_segMan->allocDynmem(byteCount, "kMemory() critical", &s->r_acc)) { error("Critical heap allocation failed"); } break; - case K_MEMORY_ALLOCATE_NONCRITICAL : + } + case K_MEMORY_ALLOCATE_NONCRITICAL: s->_segMan->allocDynmem(argv[1].toUint16(), "kMemory() non-critical", &s->r_acc); break; case K_MEMORY_FREE : -- cgit v1.2.3 From 221934ea9374bb1248784d4e88a78c36b881f3fb Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 3 Aug 2010 14:10:25 +0000 Subject: SCI: Add detection entries from bug #3037054, bug #3038720, and bug #3038761 svn-id: r51694 --- engines/sci/detection_tables.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 0c642ffbde..73dd7e1c29 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -802,13 +802,20 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Jones in the Fast Lane EGA - English DOS // SCI interpreter version 1.000.172 (not 100% sure FIXME) - {"jones", "", { + {"jones", "EGA", { {"resource.map", 0, "be4cf9e8c1e253623ef35ae3b8a1d998", 1800}, {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 202105}, {"resource.002", 0, "b86daa3ba2784d1502da881eedb80d9b", 341771}, AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Jones in the Fast Lane EGA - English DOS (supplied by EddyDrama in bug report #3038761) + {"jones", "EGA", { + {"resource.map", 0, "8e92cf319180cc8b5b87b2ce93a4fe22", 1602}, + {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 511528}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Jones in the Fast Lane VGA - English DOS // SCI interpreter version 1.000.172 {"jones", "", { @@ -818,6 +825,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Jones in the Fast Lane VGA - English DOS (supplied by omer_mor in bug report #3037054) + // VERSION file reports "1.000.060" + {"jones", "", { + {"resource.map", 0, "db175ab494ab0666f19ab8f2597a8e49", 1602}, + {"resource.001", 0, "bac3ec6cb3e3920984ab0f32becf5163", 994487}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + // Jones in the Fast Lane - English DOS CD {"jones", "CD", { {"resource.map", 0, "459f5b04467bc2107aec02f5c4b71b37", 4878}, @@ -1112,6 +1127,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformMacintosh, 0, GUIO_NOSPEECH }, + // King's Quest 5 - FM-Towns (supplied by abevi in bug report #3038720) + {"kq5", "", { + {"resource.map", 0, "20c7cd248ff1a349ed354568eebd972b", 12733}, + {"resource.000", 0, "71afd220d46bde1109c58e6acc0f3a01", 469094}, + {"resource.001", 0, "72a569f46f1abf2d9d2b1526ad3799c3", 12808839}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO_NONE }, + // King's Quest 6 - English DOS Non-Interactive Demo // Executable scanning reports "1.001.055", VERSION file reports "1.000.000" // SCI interpreter version 1.001.055 @@ -1952,6 +1975,13 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, + // Mixed-Up Mother Goose - FM-Towns (supplied by abevi in bug report #3038720) + {"mothergoose", "", { + {"resource.map", 0, "b11e971ccd2040bebba59dfb409a08ef", 5772}, + {"resource.001", 0, "d49625d9b8005ec01c852f8322a82867", 4330713}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformFMTowns, 0, GUIO_NONE }, + #ifdef ENABLE_SCI32 // Mixed-Up Mother Goose Deluxe - English Windows/DOS CD (supplied by markcoolio in bug report #2723810) // Executable scanning reports "2.100.002" -- cgit v1.2.3 From 5962b0bbe27b8d32dbbad1e8c3d36906dc391dd2 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 3 Aug 2010 14:58:01 +0000 Subject: KYRA/TOWNS: implement music/sfx volume control via GUI/GMM svn-id: r51695 --- engines/kyra/sound_intern.h | 2 ++ engines/kyra/sound_towns.cpp | 15 ++++++++++++- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 25 +++++++++++++++++++++- sound/softsynth/fmtowns_pc98/towns_audio.h | 10 +++++++++ sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 21 +++++++++++++++++- sound/softsynth/fmtowns_pc98/towns_euphony.h | 5 ++++- .../softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp | 8 +++---- 7 files changed, 78 insertions(+), 8 deletions(-) diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 186162a700..f8738bc791 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -122,6 +122,8 @@ public: void beginFadeOut(); + void updateVolumeSettings(); + private: bool loadInstruments(); void playEuphonyTrack(uint32 offset, int loop); diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 1209c6b69a..5f877f7d8a 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -203,6 +203,19 @@ void SoundTowns::playSoundEffect(uint8 track) { _driver->playSoundEffect(_sfxChannel, note, 127, sfxPlaybackBuffer); } +void SoundTowns::updateVolumeSettings() { + if (!_driver) + return; + + bool mute = false; + _driver->setSoundEffectVolume(ConfMan.getInt("sfx_volume")); + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + _driver->setMusicVolume((mute ? 0 : ConfMan.getInt("music_volume"))); + _driver->setSoundEffectVolume((mute ? 0 : ConfMan.getInt("sfx_volume"))); +} + void SoundTowns::stopAllSoundEffects() { _driver->chanVolume(0x46, 0); _driver->chanVolume(0x47, 0); @@ -298,7 +311,7 @@ bool SoundTowns::loadInstruments() { src = src + READ_LE_UINT16(&src[12]) + 32; } - _driver->reserveSfxChannels(2); + _driver->reserveSoundEffectChannels(2); delete[] twm; diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index 3d3427fcfb..683f574f65 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -101,7 +101,8 @@ private: TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), - _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _ready(false) { + _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), + _musicVolume(256), _sfxVolume(256), _pcmSfxChanMask(0), _ready(false) { #define INTCB(x) &TownsAudioInterface::intf_##x static const TownsAudioIntfCallback intfCb[] = { @@ -247,6 +248,8 @@ bool TownsAudioInterface::init() { _timer = 0; + setVolumeChannelMasks(-1, 0); + callback(0); _ready = true; @@ -269,6 +272,22 @@ int TownsAudioInterface::callback(int command, ...) { return res; } +void TownsAudioInterface::setMusicVolume(int volume) { + _musicVolume = CLIP(volume, 0, Audio::Mixer::kMaxMixerVolume); + setVolumeIntern(_musicVolume, _sfxVolume); +} + +void TownsAudioInterface::setSoundEffectVolume(int volume) { + _sfxVolume = CLIP(volume, 0, Audio::Mixer::kMaxMixerVolume); + setVolumeIntern(_musicVolume, _sfxVolume); +} + +void TownsAudioInterface::setSoundEffectChanMask(uint32 mask) { + _pcmSfxChanMask = mask >> 6; + mask &= 0x3f; + setVolumeChannelMasks(~mask, mask); +} + void TownsAudioInterface::nextTickEx(int32 *buffer, uint32 bufferSize) { if (!_ready) return; @@ -302,6 +321,10 @@ void TownsAudioInterface::nextTickEx(int32 *buffer, uint32 bufferSize) { for (int ii = 0; ii < 8; ii++) { if (_pcmChanOut & _chanFlags[ii]) { int32 o = _pcmChan[ii].data[_pcmChan[ii].pos >> 11] * _pcmChan[ii].velo; + if ((1 << ii) & (~_pcmSfxChanMask)) + o = (o * _musicVolume) / Audio::Mixer::kMaxMixerVolume; + if ((1 << ii) & _pcmSfxChanMask) + o = (o * _sfxVolume) / Audio::Mixer::kMaxMixerVolume; if (_pcmChan[ii].panLeft) finOutL += ((o * _pcmChan[ii].panLeft) >> 3); if (_pcmChan[ii].panRight) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 93a9198fe4..707c9e6bd4 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -46,6 +46,12 @@ public: int callback(int command, ...); + void setMusicVolume(int volume); + void setSoundEffectVolume(int volume); + // Defines the channels used as sound effect channels for the purpose of ScummVM GUI volume control. + // The first 6 bits are the 6 fm channels. The next 8 bits are pcm channels. + void setSoundEffectChanMask(uint32 mask); + private: void nextTickEx(int32 *buffer, uint32 bufferSize); @@ -148,6 +154,10 @@ private: uint32 _tickLength; uint32 _timer; + uint16 _musicVolume; + uint16 _sfxVolume; + uint32 _pcmSfxChanMask; + TownsAudioInterfacePluginDriver *_drv; bool _ready; diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp index 4fe645e2fc..13120df17a 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -130,8 +130,19 @@ void TownsEuphonyDriver::unloadWaveTable(int id) { _intf->callback(35, id); } -void TownsEuphonyDriver::reserveSfxChannels(int num) { +void TownsEuphonyDriver::reserveSoundEffectChannels(int num) { _intf->callback(33, num); + uint32 volMask = 0; + + if (num > 8) + return; + + for (uint32 v = 1 << 13; num; num--) { + volMask |= v; + v >>= 1; + } + + _intf->setSoundEffectChanMask(volMask); } int TownsEuphonyDriver::setMusicTempo(int tempo) { @@ -289,6 +300,14 @@ void TownsEuphonyDriver::timerCallback(int timerId) { } } +void TownsEuphonyDriver::setMusicVolume(int volume) { + _intf->setMusicVolume(volume); +} + +void TownsEuphonyDriver::setSoundEffectVolume(int volume) { + _intf->setSoundEffectVolume(volume); +} + void TownsEuphonyDriver::resetTables() { memset(_tEnable, 0xff, 32); memset(_tMode, 0xff, 16); diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.h b/sound/softsynth/fmtowns_pc98/towns_euphony.h index c869b612a3..47cfdcb2b9 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.h +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.h @@ -39,7 +39,7 @@ public: void loadInstrument(int chanType, int id, const uint8 *data); void loadWaveTable(const uint8 *data); void unloadWaveTable(int id); - void reserveSfxChannels(int num); + void reserveSoundEffectChannels(int num); int setMusicTempo(int tempo); int startMusicTrack(const uint8 *data, int trackSize, int startTick); @@ -66,6 +66,9 @@ public: void timerCallback(int timerId); + void setMusicVolume(int volume); + void setSoundEffectVolume(int volume); + TownsAudioInterface *intf() { return _intf; } diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp index 7a91cb81b9..507c8e159a 100644 --- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp @@ -1157,12 +1157,12 @@ uint8 TownsPC98_FmSynth::readSSGStatus() { void TownsPC98_FmSynth::setVolumeIntern(int volA, int volB) { Common::StackLock lock(_mutex); - _volumeA = volA; - _volumeB = volB; + _volumeA = CLIP(volA, 0, Audio::Mixer::kMaxMixerVolume); + _volumeB = CLIP(volB, 0, Audio::Mixer::kMaxMixerVolume); if (_ssg) - _ssg->setVolumeIntern(volA, volB); + _ssg->setVolumeIntern(_volumeA, _volumeB); if (_prc) - _prc->setVolumeIntern(volA, volB); + _prc->setVolumeIntern(_volumeA, _volumeB); } void TownsPC98_FmSynth::setVolumeChannelMasks(int channelMaskA, int channelMaskB) { -- cgit v1.2.3 From 44f12117f2f3d842f455d3bea1554904199b73e1 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 3 Aug 2010 14:58:57 +0000 Subject: SCI: Add support for SCI2.1 chunk resources And if no scripts are present, but chunk 0 is present, load resources from there. This fixes the Lighthouse SCI2.1 demo. svn-id: r51696 --- engines/sci/resource.cpp | 109 ++++++++++++++++++++++++++++++++++++++--- engines/sci/resource.h | 17 ++++++- engines/sci/resource_audio.cpp | 2 +- engines/sci/resource_intern.h | 28 ++++++++++- 4 files changed, 146 insertions(+), 10 deletions(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index d59b21eef6..a6899e4ef0 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -182,7 +182,7 @@ ResourceType ResourceManager::convertResType(byte type) { } //-- Resource main functions -- -Resource::Resource(ResourceId id) : _id(id) { +Resource::Resource(ResourceManager *resMan, ResourceId id) : _resMan(resMan), _id(id) { data = NULL; size = 0; _fileOffset = 0; @@ -705,6 +705,86 @@ void IntMapResourceSource::scanSource(ResourceManager *resMan) { resMan->readAudioMapSCI11(this); } +#ifdef ENABLE_SCI32 + +// Chunk resources are resources that hold other resources. They are normally called +// when using the kLoadChunk SCI2.1 kernel function. However, for example, the Lighthouse +// SCI2.1 demo has a chunk but no scripts outside of the chunk. + +// A chunk resource is pretty straightforward in terms of layout +// It begins with 11-byte entries in the header: +// ========= +// b resType +// w nEntry +// dw offset +// dw length + +ChunkResourceSource::ChunkResourceSource(const Common::String &name, uint16 number) + : ResourceSource(kSourceChunk, name) { + + _number = 0; +} + +void ChunkResourceSource::scanSource(ResourceManager *resMan) { + Resource *chunk = resMan->findResource(ResourceId(kResourceTypeChunk, _number), false); + + if (!chunk) + error("Trying to load non-existent chunk"); + + byte *ptr = chunk->data; + uint32 firstOffset = 0; + + for (;;) { + ResourceType type = resMan->convertResType(*ptr); + uint16 number = READ_LE_UINT16(ptr + 1); + ResourceId id(type, number); + + ResourceEntry entry; + entry.offset = READ_LE_UINT32(ptr + 3); + entry.length = READ_LE_UINT32(ptr + 7); + + _resMap[id] = entry; + ptr += 11; + + debugC(kDebugLevelResMan, 2, "Found %s in chunk %d", id.toString().c_str(), _number); + + resMan->updateResource(id, this, entry.length); + + // There's no end marker to the data table, but the first resource + // begins directly after the entry table. So, when we hit the first + // resource, we're at the end of the entry table. + + if (!firstOffset) + firstOffset = entry.offset; + + if ((ptr - chunk->data) >= firstOffset) + break; + } +} + +void ChunkResourceSource::loadResource(ResourceManager *resMan, Resource *res) { + Resource *chunk = resMan->findResource(ResourceId(kResourceTypeChunk, _number), false); + + if (!_resMap.contains(res->_id)) + error("Trying to load non-existent resource from chunk %d: %s %d", _number, getResourceTypeName(res->_id.getType()), res->_id.getNumber()); + + ResourceEntry entry = _resMap[res->_id]; + res->data = new byte[entry.length]; + res->size = entry.length; + res->_header = 0; + res->_headerSize = 0; + res->_status = kResStatusAllocated; + + // Copy the resource data over + memcpy(res->data, chunk->data + entry.offset, entry.length); +} + +void ResourceManager::addResourcesFromChunk(uint16 id) { + addSource(new ChunkResourceSource(Common::String::printf("Chunk %d", id), id)); + scanNewSources(); +} + +#endif void ResourceManager::freeResourceSources() { for (Common::List::iterator it = _sources.begin(); it != _sources.end(); ++it) @@ -770,6 +850,21 @@ void ResourceManager::init() { default: error("resMan: Couldn't determine view type"); } + +#ifdef ENABLE_SCI32 + if (getSciVersion() >= SCI_VERSION_2_1) { + // If we have no scripts, but chunk 0 is present, open up the chunk + // to try to get to any scripts in there. The Lighthouse SCI2.1 demo + // does exactly this. + + Common::List *scriptList = listResources(kResourceTypeScript); + + if (scriptList->empty() && testResource(ResourceId(kResourceTypeChunk, 0))) + addResourcesFromChunk(0); + + delete scriptList; + } +#endif } ResourceManager::~ResourceManager() { @@ -1544,7 +1639,7 @@ void MacResourceForkResourceSource::scanSource(ResourceManager *resMan) { void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size) { // Adding new resource only if it does not exist if (_resMap.contains(resId) == false) { - Resource *res = new Resource(resId); + Resource *res = new Resource(this, resId); _resMap.setVal(resId, res); res->_source = src; res->_fileOffset = offset; @@ -1559,7 +1654,7 @@ Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, if (_resMap.contains(resId)) { res = _resMap.getVal(resId); } else { - res = new Resource(resId); + res = new Resource(this, resId); _resMap.setVal(resId, res); } @@ -1585,21 +1680,21 @@ int Resource::readResourceInfo(ResVersion volVersion, Common::SeekableReadStream case kResVersionSci0Sci1Early: case kResVersionSci1Middle: w = file->readUint16LE(); - type = (ResourceType)(w >> 11); + type = _resMan->convertResType(w >> 11); number = w & 0x7FF; szPacked = file->readUint16LE() - 4; szUnpacked = file->readUint16LE(); wCompression = file->readUint16LE(); break; case kResVersionSci1Late: - type = (ResourceType)(file->readByte() & 0x7F); + type = _resMan->convertResType(file->readByte()); number = file->readUint16LE(); szPacked = file->readUint16LE() - 4; szUnpacked = file->readUint16LE(); wCompression = file->readUint16LE(); break; case kResVersionSci11: - type = (ResourceType)(file->readByte() & 0x7F); + type = _resMan->convertResType(file->readByte()); number = file->readUint16LE(); szPacked = file->readUint16LE(); szUnpacked = file->readUint16LE(); @@ -1616,7 +1711,7 @@ int Resource::readResourceInfo(ResVersion volVersion, Common::SeekableReadStream break; #ifdef ENABLE_SCI32 case kResVersionSci32: - type = (ResourceType)(file->readByte() & 0x7F); + type = _resMan->convertResType(file->readByte()); number = file->readUint16LE(); szPacked = file->readUint32LE(); szUnpacked = file->readUint32LE(); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index f1ea2f15f9..48210b835f 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -193,6 +193,9 @@ class Resource { friend class WaveResourceSource; friend class AudioVolumeResourceSource; friend class MacResourceForkResourceSource; +#ifdef ENABLE_SCI32 + friend class ChunkResourceSource; +#endif // NOTE : Currently most member variables lack the underscore prefix and have // public visibility to let the rest of the engine compile without changes. @@ -203,7 +206,7 @@ public: uint32 _headerSize; public: - Resource(ResourceId id); + Resource(ResourceManager *resMan, ResourceId id); ~Resource(); void unalloc(); @@ -227,6 +230,7 @@ protected: ResourceStatus _status; uint16 _lockers; /**< Number of places where this resource was locked */ ResourceSource *_source; + ResourceManager *_resMan; bool loadPatch(Common::SeekableReadStream *file); bool loadFromPatchFile(); @@ -251,6 +255,9 @@ class ResourceManager { friend class ExtAudioMapResourceSource; friend class WaveResourceSource; friend class MacResourceForkResourceSource; +#ifdef ENABLE_SCI32 + friend class ChunkResourceSource; +#endif public: /** @@ -324,6 +331,14 @@ public: */ void addNewGMPatch(SciGameId gameId); +#ifdef ENABLE_SCI32 + /** + * Parses all resources from a SCI2.1 chunk resource and adds them to the + * resource manager. + */ + void addResourcesFromChunk(uint16 id); +#endif + bool detectHires(); // Detects, if standard font of current game includes extended characters (>0x80) bool detectFontExtended(); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 2c7a63b363..8c7fe9eca4 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -99,7 +99,7 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { } file->seek(-4, SEEK_CUR); - ResourceType type = (ResourceType)(file->readByte() & 0x7f); + ResourceType type = _resMan->convertResType(file->readByte()); if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio)) || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) { warning("Resource type mismatch loading %s", _id.toString().c_str()); diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 73986444a4..14f872b46e 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -43,7 +43,8 @@ enum ResSourceType { kSourceAudioVolume, kSourceExtAudioMap, kSourceWave, - kSourceMacResourceFork + kSourceMacResourceFork, + kSourceChunk }; @@ -188,6 +189,31 @@ public: virtual void loadResource(ResourceManager *resMan, Resource *res); }; +#ifdef ENABLE_SCI32 + +/** + * Reads resources from SCI2.1+ chunk resources + */ +class ChunkResourceSource : public ResourceSource { +public: + ChunkResourceSource(const Common::String &name, uint16 number); + + virtual void scanSource(ResourceManager *resMan); + virtual void loadResource(ResourceManager *resMan, Resource *res); + +protected: + uint16 _number; + + struct ResourceEntry { + uint32 offset; + uint32 length; + }; + + Common::HashMap _resMap; +}; + +#endif + } // End of namespace Sci #endif // SCI_RESOURCE_INTERN_H -- cgit v1.2.3 From 65e215628d26397ed23ef53db46fb2b8a5203eb3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 15:04:56 +0000 Subject: SCI: dont clip plane during frameout.cpp disables scrolling capability (regression of r51615) svn-id: r51697 --- engines/sci/graphics/frameout.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 21e3c59628..fd559917ca 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -227,7 +227,6 @@ void GfxFrameout::kernelFrameout() { planeRect.left = (planeRect.left * screenRect.width()) / scriptsRunningWidth; planeRect.bottom = (planeRect.bottom * screenRect.height()) / scriptsRunningHeight; planeRect.right = (planeRect.right * screenRect.width()) / scriptsRunningWidth; - planeRect.clip(screenRect); // we need to do this, at least in gk1 on cemetary we get bottom right -> 201, 321 int16 planeOffsetX = 0; -- cgit v1.2.3 From b149ca89d518feb470ffc71893c5e0717b7482da Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Aug 2010 15:09:39 +0000 Subject: KYRA3: Fix bug in Screen_v2::generateOverlay. Uncovered by a valgrind warning. svn-id: r51698 --- engines/kyra/screen_v2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index 919b9086f3..f493b39f19 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -53,7 +53,7 @@ uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int startCo uint8 *dst = buffer; *dst++ = 0; - for (int i = 1; i != 255; ++i) { + for (int i = 1; i != 256; ++i) { uint8 processedPalette[3]; byte col; -- cgit v1.2.3 From 20002588e66036fc992d60d44381a53650fd9d01 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 3 Aug 2010 15:33:35 +0000 Subject: SCI: Hopefully fix signedness warning with some compilers svn-id: r51699 --- engines/sci/resource.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index a6899e4ef0..4bf26ff0bf 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -757,7 +757,7 @@ void ChunkResourceSource::scanSource(ResourceManager *resMan) { if (!firstOffset) firstOffset = entry.offset; - if ((ptr - chunk->data) >= firstOffset) + if ((size_t)(ptr - chunk->data) >= firstOffset) break; } } -- cgit v1.2.3 From 6665bf4a0194e1199c3005b12986f5fa87847608 Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Tue, 3 Aug 2010 15:34:28 +0000 Subject: CONFIGURE: removed two useless definitions in N64 sections svn-id: r51700 --- configure | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure b/configure index 5c9bcdf884..db01465db0 100755 --- a/configure +++ b/configure @@ -1672,8 +1672,6 @@ if test -n "$_host"; then LDFLAGS="$LDFLAGS -march=vr4300 -mtune=vr4300 -nodefaultlibs -nostartfiles -mno-crt0" LDFLAGS="$LDFLAGS -L$N64SDK/hkz-libn64 -L$N64SDK/lib" LDFLAGS="$LDFLAGS -T n64ld_cpp.x -Xlinker -Map -Xlinker scummvm.map" - _ar="$_host_alias-ar cru" - _ranlib="$_host_alias-ranlib" _backend="n64" _need_memalign=yes _mt32emu=no -- cgit v1.2.3 From ee28c2eb54b3b02643a2e46d793acdf0843596a0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 15:51:31 +0000 Subject: SCI: adding workaround for pq3 fixes bug #3037565 svn-id: r51701 --- engines/sci/engine/vm.cpp | 2 +- engines/sci/engine/workarounds.cpp | 18 ++++++++++++------ engines/sci/engine/workarounds.h | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 56d16e798e..c25e26dc2c 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1215,7 +1215,7 @@ void run_vm(EngineState *s) { if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) s->r_acc = make_reg(0, compare1 >= compare2); else - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeGeWorkarounds, r_temp, s->r_acc); } break; diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fed9a3cc42..168a053e1c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -38,12 +38,6 @@ const SciWorkaroundEntry opcodeDivWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; -// gameID, room,script,lvl, object-name, method-name, call,index, workaround -const SciWorkaroundEntry opcodeOrWorkarounds[] = { - { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 - SCI_WORKAROUNDENTRY_TERMINATOR -}; - // gameID, room,script,lvl, object-name, method-name, call, index, workaround const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { { GID_LSL6, 360, 938, 0, "ROsc", "cycleDone", -1, 0, { WORKAROUND_FAKE, 1 } }, // when looking through tile in the shower room initial cycles get set to an object instead of 2, we fix this by setting 1 after decrease @@ -52,6 +46,18 @@ const SciWorkaroundEntry opcodeDptoaWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeGeWorkarounds[] = { + { GID_PQ3, 31, 31, 0, "rm031", "init", -1, 0, { WORKAROUND_FAKE, 1 } }, // pq3 english: when exiting the car, while morales is making phonecalls - bug #3037565 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeOrWorkarounds[] = { + { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index a58f790c56..b2852db150 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -69,8 +69,9 @@ struct SciWorkaroundEntry { }; extern const SciWorkaroundEntry opcodeDivWorkarounds[]; -extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; +extern const SciWorkaroundEntry opcodeGeWorkarounds[]; +extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; extern const SciWorkaroundEntry kCelHigh_workarounds[]; -- cgit v1.2.3 From 14e7ba5d91be70e4c4479916875a0d782c02b1ee Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 16:03:22 +0000 Subject: SCI: kMemory issue in pq3 only for multilingual adjusted comment accordingly svn-id: r51702 --- engines/sci/engine/kmisc.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 47d86f920a..fbe20410de 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -229,10 +229,10 @@ reg_t kMemory(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case K_MEMORY_ALLOCATE_CRITICAL: { int byteCount = argv[1].toUint16(); - // WORKAROUND: pq3 when plotting crimes - allocates the returned bytes - // from kStrLen on "W" and "E" and wants to put a string in there, - // which doesn't fit of course. That's why we allocate one byte more - // all the time inside that room - maybe only multilingual pq3 + // WORKAROUND: pq3 (multilingual) when plotting crimes - allocates the + // returned bytes from kStrLen on "W" and "E" and wants to put a + // string in there, which doesn't fit of course. That's why we allocate + // one byte more all the time inside that room if (g_sci->getGameId() == GID_PQ3) { if (s->currentRoomNumber() == 202) byteCount++; -- cgit v1.2.3 From 14c9522d776a6a7ceb01b9b3076d43729e7780f4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Aug 2010 16:21:45 +0000 Subject: KYRA: Fix Screen_v2::generateOverlay implementation. svn-id: r51703 --- engines/kyra/screen_v2.cpp | 61 ++++++++++++++++++++++++++++++---------------- engines/kyra/screen_v2.h | 2 +- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index f493b39f19..dec380c3e8 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -38,38 +38,57 @@ Screen_v2::~Screen_v2() { delete[] _wsaFrameAnimBuffer; } -uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int startColor, uint16 factor) { +uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor, uint weight) { if (!buffer) return buffer; - factor = MIN(255, factor); - factor >>= 1; - factor &= 0xFF; + weight = MIN(weight, 255) >> 1; - const byte col1 = pal[startColor * 3 + 0]; - const byte col2 = pal[startColor * 3 + 1]; - const byte col3 = pal[startColor * 3 + 2]; + const byte opR = pal[opColor * 3 + 0]; + const byte opG = pal[opColor * 3 + 1]; + const byte opB = pal[opColor * 3 + 2]; uint8 *dst = buffer; *dst++ = 0; - for (int i = 1; i != 256; ++i) { - uint8 processedPalette[3]; - byte col; - - col = pal[i * 3 + 0]; - col -= ((((col - col1) * factor) << 1) >> 8) & 0xFF; - processedPalette[0] = col; + const int maxIndex = (_vm->gameFlags().gameID == GI_LOL) ? (_use16ColorMode ? 255 : 127) : 255; - col = pal[i * 3 + 1]; - col -= ((((col - col2) * factor) << 1) >> 8) & 0xFF; - processedPalette[1] = col; + for (int i = 1; i != 256; ++i) { + const byte curR = pal[i * 3 + 0] - ((((pal[i * 3 + 0] - opR) * weight) >> 7) & 0x7F); + const byte curG = pal[i * 3 + 1] - ((((pal[i * 3 + 1] - opG) * weight) >> 7) & 0x7F); + const byte curB = pal[i * 3 + 2] - ((((pal[i * 3 + 2] - opB) * weight) >> 7) & 0x7F); + + uint16 idxSum = _use16ColorMode ? 0xFFFF : 0x7FFF; + byte index = opColor; + + for (int curIdx = 1; curIdx <= maxIndex; ++curIdx) { + if (!_use16ColorMode && i == curIdx) + continue; + + int diff = 0; + uint16 sum = 0; + + diff = pal[curIdx * 3 + 0] - curR; + sum += diff * diff; + diff = pal[curIdx * 3 + 1] - curG; + sum += diff * diff; + diff = pal[curIdx * 3 + 2] - curB; + sum += diff * diff; + + if (!sum) { + index = curIdx; + break; + } - col = pal[i * 3 + 2]; - col -= ((((col - col3) * factor) << 1) >> 8) & 0xFF; - processedPalette[2] = col; + if (sum <= idxSum) { + if (!_use16ColorMode || (curIdx == opColor || curIdx != i)) { + idxSum = sum; + index = curIdx; + } + } + } - *dst++ = findLeastDifferentColor(processedPalette, pal, 1, 255) + 1; + *dst++ = index; } return buffer; diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index 7be68e7b6d..2850c96e02 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -40,7 +40,7 @@ public: void checkedPageUpdate(int srcPage, int dstPage); // palette handling - uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint16 factor); + uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint weight); void applyOverlay(int x, int y, int w, int h, int pageNum, const uint8 *overlay); int findLeastDifferentColor(const uint8 *paletteEntry, const Palette &pal, uint8 firstColor, uint16 numColors, bool skipSpecialColors = false); -- cgit v1.2.3 From 64585b40ebd8fac26d151aa12e6c6a22f631c20c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Aug 2010 16:22:12 +0000 Subject: KYRA: Get rid of Screen_LoL::generateLevelOverlay. This function is actually exactly the same as Screen_v2::generateOverlay, after I fixed the implementation of the latter last commit. svn-id: r51704 --- engines/kyra/scene_lol.cpp | 2 +- engines/kyra/screen_lol.cpp | 62 --------------------------------------------- engines/kyra/screen_lol.h | 1 - 3 files changed, 1 insertion(+), 64 deletions(-) diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index ddc6e41bec..bf3320486a 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -468,7 +468,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight for (int i = 0; i < 7; i++) { weight = 100 - (i * _lastSpecialColorWeight); weight = (weight > 0) ? (weight * 255) / 100 : 0; - _screen->generateLevelOverlay(tpal, _screen->getLevelOverlay(i), _lastSpecialColor, weight); + _screen->generateOverlay(tpal, _screen->getLevelOverlay(i), _lastSpecialColor, weight); int l = _flags.use16ColorMode ? 256 : 128; uint8 *levelOverlay = _screen->getLevelOverlay(i); diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp index e350d2c977..be3dbe5b21 100644 --- a/engines/kyra/screen_lol.cpp +++ b/engines/kyra/screen_lol.cpp @@ -183,68 +183,6 @@ void Screen_LoL::generateGrayOverlay(const Palette &srcPal, uint8 *grayOverlay, grayOverlay[i] = findLeastDifferentColor(tmpPal.getData() + 3 * i, srcPal, 0, lastColor, skipSpecialColors); } -uint8 *Screen_LoL::generateLevelOverlay(const Palette &srcPal, uint8 *ovl, int opColor, int weight) { - if (!ovl) - return ovl; - - if (weight > 255) - weight = 255; - - const uint8 *srt = srcPal.getData(); - - uint16 r = srt[opColor * 3]; - uint16 g = srt[opColor * 3 + 1]; - uint16 b = srt[opColor * 3 + 2]; - - uint8 *d = ovl; - *d++ = 0; - - for (int i = 1; i != 256; i++) { - uint16 a = srt[i * 3]; - uint8 dr = a - ((((a - r) * (weight >> 1)) << 1) >> 8); - a = srt[i * 3 + 1]; - uint8 dg = a - ((((a - g) * (weight >> 1)) << 1) >> 8); - a = srt[i * 3 + 2]; - uint8 db = a - ((((a - b) * (weight >> 1)) << 1) >> 8); - - int l = opColor; - int m = _use16ColorMode ? 0xffff : 0x7fff; - int ii = _use16ColorMode ? 255 : 127; - int x = 1; - const uint8 *s = srt + 3; - - do { - if (!_use16ColorMode && i == x) { - s += 3; - } else { - int t = *s++ - dr; - int c = t * t; - t = *s++ - dg; - c += (t * t); - t = *s++ - db; - c += (t * t); - - if (!c) { - l = x; - break; - } - - if (c <= m) { - if (!_use16ColorMode || (x == opColor || i != x)) { - m = c; - l = x; - } - } - } - x++; - } while (--ii); - - *d++ = l & 0xff; - } - - return ovl; -} - void Screen_LoL::createTransparencyTablesIntern(const uint8 *ovl, int a, const uint8 *fxPal1, const uint8 *fxPal2, uint8 *outTable1, uint8 *outTable2, int b) { Palette screenPal(256); screenPal.copy(fxPal2, 0, 256); diff --git a/engines/kyra/screen_lol.h b/engines/kyra/screen_lol.h index cdd18f98f6..52e66df1ec 100644 --- a/engines/kyra/screen_lol.h +++ b/engines/kyra/screen_lol.h @@ -79,7 +79,6 @@ public: Palette **generateFadeTable(Palette **dst, Palette *src1, Palette *src2, int numTabs); void generateGrayOverlay(const Palette &Pal, uint8 *grayOverlay, int factor, int addR, int addG, int addB, int lastColor, bool skipSpecialColors); - uint8 *generateLevelOverlay(const Palette &Pal, uint8 *ovl, int opColor, int weight); uint8 *getLevelOverlay(int index) { return _levelOverlays[index]; } void createTransparencyTablesIntern(const uint8 *ovl, int a, const uint8 *fxPal1, const uint8 *fxPal2, uint8 *outTable1, uint8 *outTable2, int b); -- cgit v1.2.3 From 13824582d1dc3d1d6df6b57e171f6357799e0489 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 3 Aug 2010 16:43:57 +0000 Subject: LOL: Minor adjustment to latest generateOverlay changes. svn-id: r51705 --- engines/kyra/lol.cpp | 4 ++-- engines/kyra/screen_v2.cpp | 14 ++++++++++++-- engines/kyra/screen_v2.h | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 5a066e5d0c..98f0e31b69 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -810,8 +810,8 @@ void LoLEngine::startup() { pal.fill(0, 1, 0x3F); pal.fill(2, 126, 0x3F); pal.fill(192, 4, 0x3F); - _screen->generateOverlay(pal, _screen->_paletteOverlay1, 1, 96); - _screen->generateOverlay(pal, _screen->_paletteOverlay2, 144, 65); + _screen->generateOverlay(pal, _screen->_paletteOverlay1, 1, 96, 254); + _screen->generateOverlay(pal, _screen->_paletteOverlay2, 144, 65, 254); _screen->copyPalette(0, 1); } diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index dec380c3e8..3907f844cb 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -38,7 +38,7 @@ Screen_v2::~Screen_v2() { delete[] _wsaFrameAnimBuffer; } -uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor, uint weight) { +uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor, uint weight, int maxColor) { if (!buffer) return buffer; @@ -51,7 +51,17 @@ uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor uint8 *dst = buffer; *dst++ = 0; - const int maxIndex = (_vm->gameFlags().gameID == GI_LOL) ? (_use16ColorMode ? 255 : 127) : 255; + int maxIndex = maxColor; + if (maxIndex == -1) { + if (_vm->gameFlags().gameID == GI_LOL) { + if (_use16ColorMode) + maxIndex = 255; + else + maxIndex = 127; + } else { + maxIndex = 255; + } + } for (int i = 1; i != 256; ++i) { const byte curR = pal[i * 3 + 0] - ((((pal[i * 3 + 0] - opR) * weight) >> 7) & 0x7F); diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index 2850c96e02..92aeb3525d 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -40,7 +40,7 @@ public: void checkedPageUpdate(int srcPage, int dstPage); // palette handling - uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint weight); + uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint weight, int maxColor = -1); void applyOverlay(int x, int y, int w, int h, int pageNum, const uint8 *overlay); int findLeastDifferentColor(const uint8 *paletteEntry, const Palette &pal, uint8 firstColor, uint16 numColors, bool skipSpecialColors = false); -- cgit v1.2.3 From 824a5f32a043486b3e15b9a01f0651ac7ae6a372 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 3 Aug 2010 16:54:39 +0000 Subject: LOL: fixed possible crash in environmental sfx code svn-id: r51706 --- engines/kyra/sound_lol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/kyra/sound_lol.cpp b/engines/kyra/sound_lol.cpp index 1bcb77c89d..c233987120 100644 --- a/engines/kyra/sound_lol.cpp +++ b/engines/kyra/sound_lol.cpp @@ -225,7 +225,7 @@ void LoLEngine::snd_processEnvironmentalSoundEffect(int soundId, int block) { for (int i = 3; i > 0; i--) { int dir = calcMonsterDirection(cbl & 0x1f, cbl >> 5, block & 0x1f, block >> 5); - cbl += blockShiftTable[dir]; + cbl = (cbl + blockShiftTable[dir]) & 0x3ff; if (cbl != block) { if (testWallFlag(cbl, 0, 1)) _environmentSfxVol >>= 1; -- cgit v1.2.3 From 3d228f270f380d5b74becfb3e3598d0ef1ed5c8c Mon Sep 17 00:00:00 2001 From: Robert Å palek Date: Tue, 3 Aug 2010 17:09:27 +0000 Subject: DRACI: recognize German translation svn-id: r51707 --- engines/draci/detection.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index e1025e698a..07a9928cfa 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -71,6 +71,16 @@ const ADGameDescription gameDescriptions[] = { GUIO_NONE }, + { + "draci", + 0, + AD_ENTRY1s("INIT.DFW", "9a7115b91cdea361bcaff3e046ac7ded", 906), + Common::DE_DEU, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + AD_TABLE_END_MARKER }; -- cgit v1.2.3 From 3fc3a59139b52828fa06f8f3e22f068c004fd469 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 3 Aug 2010 18:19:25 +0000 Subject: KYRA/TOWNS: replace some music stops with fadeouts (based on original code) svn-id: r51708 --- engines/kyra/sound_lok.cpp | 6 ++---- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/engines/kyra/sound_lok.cpp b/engines/kyra/sound_lok.cpp index 1d0b334a09..40daa0b5bd 100644 --- a/engines/kyra/sound_lok.cpp +++ b/engines/kyra/sound_lok.cpp @@ -49,16 +49,14 @@ void KyraEngine_LoK::snd_playWanderScoreViaMap(int command, int restart) { _lastMusicCommand = -1; if (_flags.platform == Common::kPlatformFMTowns) { - if (command == 1) { - _sound->beginFadeOut(); - } else if (command >= 35 && command <= 38) { + if (command >= 35 && command <= 38) { snd_playSoundEffect(command - 20); } else if (command >= 2) { if (_lastMusicCommand != command) // the original does -2 here we handle this inside _sound->playTrack() _sound->playTrack(command); } else { - _sound->haltTrack(); + _sound->beginFadeOut(); } _lastMusicCommand = command; } else if (_flags.platform == Common::kPlatformPC98) { diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index 683f574f65..ea5797baec 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -101,8 +101,8 @@ private: TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), - _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), - _musicVolume(256), _sfxVolume(256), _pcmSfxChanMask(0), _ready(false) { + _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _pcmSfxChanMask(0), + _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), _ready(false) { #define INTCB(x) &TownsAudioInterface::intf_##x static const TownsAudioIntfCallback intfCb[] = { @@ -257,6 +257,9 @@ bool TownsAudioInterface::init() { } int TownsAudioInterface::callback(int command, ...) { + if (!_ready) + return 1; + va_list args; va_start(args, command); -- cgit v1.2.3 From 449927abcf3c7c5b7346b6483375f19150ebc3bd Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Tue, 3 Aug 2010 19:06:27 +0000 Subject: FMTOWNS AUDIO: fix typo svn-id: r51709 --- sound/softsynth/fmtowns_pc98/towns_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index ea5797baec..773c5a8067 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -1303,7 +1303,7 @@ void TownsAudioInterface::pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_ uint32 s = 0; if (diff < 0) { - diff -= 1; + diff *= -1; bl = diff % 12; diff /= 12; s = (r >> diff); -- cgit v1.2.3 From fcede4680a03e4f7a389a43f71d1484794e8dead Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 19:06:40 +0000 Subject: SCI: adding bpk debug command currently removing or listing such breakpoints is not yet supported svn-id: r51710 --- engines/sci/console.cpp | 41 ++++++++++++++++++++++++++++++----------- engines/sci/console.h | 5 +++-- engines/sci/engine/kernel.cpp | 33 +++++++++++++++++++++++++-------- engines/sci/engine/kernel.h | 6 ++++-- engines/sci/engine/vm.cpp | 10 ++++++++++ 5 files changed, 72 insertions(+), 23 deletions(-) diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index bac31f6c8e..2432d84faa 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -176,10 +176,12 @@ Console::Console(SciEngine *engine) : GUI::Debugger(), DCmd_Register("bp_del", WRAP_METHOD(Console, cmdBreakpointDelete)); DCmd_Register("bpdel", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias DCmd_Register("bc", WRAP_METHOD(Console, cmdBreakpointDelete)); // alias - DCmd_Register("bp_exec_method", WRAP_METHOD(Console, cmdBreakpointExecMethod)); - DCmd_Register("bpx", WRAP_METHOD(Console, cmdBreakpointExecMethod)); // alias - DCmd_Register("bp_exec_function", WRAP_METHOD(Console, cmdBreakpointExecFunction)); - DCmd_Register("bpe", WRAP_METHOD(Console, cmdBreakpointExecFunction)); // alias + DCmd_Register("bp_method", WRAP_METHOD(Console, cmdBreakpointMethod)); + DCmd_Register("bpx", WRAP_METHOD(Console, cmdBreakpointMethod)); // alias + DCmd_Register("bp_kernel", WRAP_METHOD(Console, cmdBreakpointKernel)); + DCmd_Register("bpk", WRAP_METHOD(Console, cmdBreakpointKernel)); // alias + DCmd_Register("bp_function", WRAP_METHOD(Console, cmdBreakpointFunction)); + DCmd_Register("bpe", WRAP_METHOD(Console, cmdBreakpointFunction)); // alias // VM DCmd_Register("script_steps", WRAP_METHOD(Console, cmdScriptSteps)); DCmd_Register("vm_varlist", WRAP_METHOD(Console, cmdVMVarlist)); @@ -384,8 +386,9 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf("Breakpoints:\n"); DebugPrintf(" bp_list / bplist / bl - Lists the current breakpoints\n"); DebugPrintf(" bp_del / bpdel / bc - Deletes a breakpoint with the specified index\n"); - DebugPrintf(" bp_exec_method / bpx - Sets a breakpoint on the execution of the specified method\n"); - DebugPrintf(" bp_exec_function / bpe - Sets a breakpoint on the execution of the specified exported function\n"); + DebugPrintf(" bp_method / bpx - Sets a breakpoint on the execution or access of a specified method/selector\n"); + DebugPrintf(" bp_kernel / bpk - Sets a breakpoint on execution of a kernel function\n"); + DebugPrintf(" bp_function / bpe - Sets a breakpoint on the execution of the specified exported function\n"); DebugPrintf("\n"); DebugPrintf("VM:\n"); DebugPrintf(" script_steps - Shows the number of executed SCI operations\n"); @@ -2716,7 +2719,7 @@ bool Console::cmdLogKernel(int argc, const char **argv) { return true; } - if (g_sci->getKernel()->debugSetFunctionLogging(argv[1], logging)) + if (g_sci->getKernel()->debugSetFunction(argv[1], logging, -1)) DebugPrintf("Logging %s for k%s\n", logging ? "enabled" : "disabled", argv[1]); else DebugPrintf("Unknown kernel function %s\n", argv[1]); @@ -2794,10 +2797,10 @@ bool Console::cmdBreakpointDelete(int argc, const char **argv) { return true; } -bool Console::cmdBreakpointExecMethod(int argc, const char **argv) { +bool Console::cmdBreakpointMethod(int argc, const char **argv) { if (argc != 2) { - DebugPrintf("Sets a breakpoint on the execution of the specified method.\n"); - DebugPrintf("Usage: %s \n", argv[0]); + DebugPrintf("Sets a breakpoint on execution/access of a specified method/selector.\n"); + DebugPrintf("Usage: %s \n", argv[0]); DebugPrintf("Example: %s ego::doit\n", argv[0]); DebugPrintf("May also be used to set a breakpoint that applies whenever an object\n"); DebugPrintf("of a specific type is touched: %s foo::\n", argv[0]); @@ -2817,7 +2820,23 @@ bool Console::cmdBreakpointExecMethod(int argc, const char **argv) { return true; } -bool Console::cmdBreakpointExecFunction(int argc, const char **argv) { +bool Console::cmdBreakpointKernel(int argc, const char **argv) { + if (argc != 2) { + DebugPrintf("Sets a breakpoint on execution of a kernel function.\n"); + DebugPrintf("Usage: %s \n", argv[0]); + DebugPrintf("Example: %s DrawPic\n", argv[0]); + return true; + } + + if (g_sci->getKernel()->debugSetFunction(argv[1], -1, true)) + DebugPrintf("Breakpoint enabled for k%s\n", argv[1]); + else + DebugPrintf("Unknown kernel function %s\n", argv[1]); + + return true; +} + +bool Console::cmdBreakpointFunction(int argc, const char **argv) { // TODO/FIXME: Why does this accept 2 parameters (the high and the low part of the address)?" if (argc != 3) { DebugPrintf("Sets a breakpoint on the execution of the specified exported function.\n"); diff --git a/engines/sci/console.h b/engines/sci/console.h index 091a5d15f8..60599ea783 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -134,8 +134,9 @@ private: // Breakpoints bool cmdBreakpointList(int argc, const char **argv); bool cmdBreakpointDelete(int argc, const char **argv); - bool cmdBreakpointExecMethod(int argc, const char **argv); - bool cmdBreakpointExecFunction(int argc, const char **argv); + bool cmdBreakpointMethod(int argc, const char **argv); + bool cmdBreakpointKernel(int argc, const char **argv); + bool cmdBreakpointFunction(int argc, const char **argv); // VM bool cmdScriptSteps(int argc, const char **argv); bool cmdVMVarlist(int argc, const char **argv); diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index e702002199..25502100ae 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -656,7 +656,7 @@ void Kernel::mapFunctions() { return; } -bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { +bool Kernel::debugSetFunction(const char *kernelName, int logging, int breakpoint) { if (strcmp(kernelName, "*")) { for (uint id = 0; id < _kernelFuncs.size(); id++) { if (_kernelFuncs[id].name) { @@ -666,14 +666,21 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions; uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount; for (uint subId = 0; subId < kernelSubCallCount; subId++) { - if (kernelSubCall->function) - kernelSubCall->debugLogging = logging; + if (kernelSubCall->function) { + if (logging != -1) + kernelSubCall->debugLogging = logging == 1 ? true : false; + if (breakpoint != -1) + kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false; + } kernelSubCall++; } return true; } // function name matched, set for this one and exit - _kernelFuncs[id].debugLogging = logging; + if (logging != -1) + _kernelFuncs[id].debugLogging = logging == 1 ? true : false; + if (breakpoint != -1) + _kernelFuncs[id].debugBreakpoint = breakpoint == 1 ? true : false; return true; } else { // main name was not matched @@ -685,7 +692,10 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { if (kernelSubCall->function) { if (strcmp(kernelName, kernelSubCall->name) == 0) { // sub-function name matched, set for this one and exit - kernelSubCall->debugLogging = logging; + if (logging != -1) + kernelSubCall->debugLogging = logging == 1 ? true : false; + if (breakpoint != -1) + kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false; return true; } } @@ -702,14 +712,21 @@ bool Kernel::debugSetFunctionLogging(const char *kernelName, bool logging) { if (_kernelFuncs[id].name) { if (!_kernelFuncs[id].subFunctions) { // No sub-functions, enable actual kernel function - _kernelFuncs[id].debugLogging = logging; + if (logging != -1) + _kernelFuncs[id].debugLogging = logging == 1 ? true : false; + if (breakpoint != -1) + _kernelFuncs[id].debugBreakpoint = breakpoint == 1 ? true : false; } else { // Sub-Functions available, enable those too KernelSubFunction *kernelSubCall = _kernelFuncs[id].subFunctions; uint kernelSubCallCount = _kernelFuncs[id].subFunctionCount; for (uint subId = 0; subId < kernelSubCallCount; subId++) { - if (kernelSubCall->function) - kernelSubCall->debugLogging = logging; + if (kernelSubCall->function) { + if (logging != -1) + kernelSubCall->debugLogging = logging == 1 ? true : false; + if (breakpoint != -1) + kernelSubCall->debugBreakpoint = breakpoint == 1 ? true : false; + } kernelSubCall++; } } diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 02ce102f30..b6247b46f1 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -127,6 +127,7 @@ struct KernelSubFunction { uint16 *signature; const SciWorkaroundEntry *workarounds; bool debugLogging; + bool debugBreakpoint; }; struct KernelFunction { @@ -137,6 +138,7 @@ struct KernelFunction { KernelSubFunction *subFunctions; uint16 subFunctionCount; bool debugLogging; + bool debugBreakpoint; }; class Kernel { @@ -218,9 +220,9 @@ public: void loadKernelNames(GameFeatures *features); /** - * Sets debugCalls flag for a kernel function + * Sets debug flags for a kernel function */ - bool debugSetFunctionLogging(const char *kernelName, bool debugCalls); + bool debugSetFunction(const char *kernelName, int logging, int breakpoint); private: /** diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c25e26dc2c..c6e8b3e2dd 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -743,6 +743,11 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { if (kernelCall.debugLogging) logKernelCall(&kernelCall, NULL, s, argc, argv, s->r_acc); + if (kernelCall.debugBreakpoint) { + printf("Break on k%s\n", kernelCall.name); + g_sci->_debugState.debugging = true; + g_sci->_debugState.breakpointWasHit = true; + } } else { // Sub-functions available, check signature and call that one directly if (argc < 1) @@ -793,6 +798,11 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { if (kernelSubCall.debugLogging) logKernelCall(&kernelCall, &kernelSubCall, s, argc, argv, s->r_acc); + if (kernelSubCall.debugBreakpoint) { + printf("Break on k%s\n", kernelSubCall.name); + g_sci->_debugState.debugging = true; + g_sci->_debugState.breakpointWasHit = true; + } } // Remove callk stack frame again, if there's still an execution stack -- cgit v1.2.3 From 2e11c1cf9642de2db81ea0a25541872c20f28b8e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 19:43:16 +0000 Subject: SCI: reset ports when restoring fixes qfg3/fairy tales restoring (bug #3035626) also fixes ScummVM menu restoring while a window is shown (e.g. sq5) svn-id: r51712 --- engines/sci/engine/savegame.cpp | 2 ++ engines/sci/graphics/ports.cpp | 52 ++++++++++++++++++++++++++++++++++------- engines/sci/graphics/ports.h | 6 +++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index f434e5326b..fb23b79c34 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -760,6 +760,8 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->gameStartTime = g_system->getMillis(); s->_screenUpdateTime = g_system->getMillis(); + g_sci->_gfxPorts->reset(); + g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); // Message state: diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 2137de39de..afbe0e676c 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -50,7 +50,10 @@ GfxPorts::GfxPorts(SegManager *segMan, GfxScreen *screen) } GfxPorts::~GfxPorts() { - // TODO: Clear _windowList and delete all stuff in it? + // reset frees all windows but _picWind + reset(); + freeWindow(_picWind); + delete _wmgrPort; delete _menuPort; } @@ -135,7 +138,7 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te _wmgrPort->curLeft = 0; _windowList.push_front(_wmgrPort); - _picWind = newWindow(Common::Rect(0, offTop, _screen->getWidth(), _screen->getHeight()), 0, 0, SCI_WINDOWMGR_STYLE_TRANSPARENT | SCI_WINDOWMGR_STYLE_NOFRAME, 0, true); + _picWind = addWindow(Common::Rect(0, offTop, _screen->getWidth(), _screen->getHeight()), 0, 0, SCI_WINDOWMGR_STYLE_TRANSPARENT | SCI_WINDOWMGR_STYLE_NOFRAME, 0, true); // For SCI0 games till kq4 (.502 - not including) we set _picWind top to offTop instead // Because of the menu/status bar if (g_sci->_features->usesOldGfxFunctions()) @@ -144,6 +147,30 @@ void GfxPorts::init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *te kernelInitPriorityBands(); } +// Removes any windows from windowList +// is used when restoring/restarting the game +// Sierra SCI actually saved the whole windowList, it seems we don't need to do this at all +// but in some games there are still windows active when restoring. Leaving those windows open +// would create all sorts of issues, that's why we remove them +void GfxPorts::reset() { + PortList::iterator it = _windowList.begin(); + const PortList::iterator end = _windowList.end(); + + setPort(_picWind); + + while (it != end) { + Port *pPort = *it; + if (pPort->id > 2) { + // found a window beyond _picWind + freeWindow((Window *)pPort); + } + it++; + } + _windowList.clear(); + _windowList.push_front(_wmgrPort); + _windowList.push_back(_picWind); +} + void GfxPorts::kernelSetActive(uint16 portId) { switch (portId) { case 0: @@ -179,9 +206,9 @@ reg_t GfxPorts::kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uin Window *wnd = NULL; if (restoreRect.bottom != 0 && restoreRect.right != 0) - wnd = newWindow(dims, &restoreRect, title, style, priority, false); + wnd = addWindow(dims, &restoreRect, title, style, priority, false); else - wnd = newWindow(dims, NULL, title, style, priority, false); + wnd = addWindow(dims, NULL, title, style, priority, false); wnd->penClr = colorPen; wnd->backClr = colorBack; drawWindow(wnd); @@ -191,7 +218,7 @@ reg_t GfxPorts::kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uin void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { Window *wnd = (Window *)getPortById(windowId); - disposeWindow(wnd, reanimate); + removeWindow(wnd, reanimate); } int16 GfxPorts::isFrontWindow(Window *pWnd) { @@ -228,7 +255,7 @@ void GfxPorts::endUpdate(Window *wnd) { setPort(oldPort); } -Window *GfxPorts::newWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw) { +Window *GfxPorts::addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw) { // Find an unused window/port id uint id = 1; while (id < _windowsById.size() && _windowsById[id]) { @@ -378,7 +405,7 @@ void GfxPorts::drawWindow(Window *pWnd) { setPort(oldport); } -void GfxPorts::disposeWindow(Window *pWnd, bool reanimate) { +void GfxPorts::removeWindow(Window *pWnd, bool reanimate) { setPort(_wmgrPort); _paint16->bitsRestore(pWnd->hSaved1); _paint16->bitsRestore(pWnd->hSaved2); @@ -392,6 +419,15 @@ void GfxPorts::disposeWindow(Window *pWnd, bool reanimate) { delete pWnd; } +void GfxPorts::freeWindow(Window *pWnd) { + if (!pWnd->hSaved1.isNull()) + _segMan->freeHunkEntry(pWnd->hSaved1); + if (!pWnd->hSaved2.isNull()) + _segMan->freeHunkEntry(pWnd->hSaved1); + _windowsById[pWnd->id] = 0; + delete pWnd; +} + void GfxPorts::updateWindow(Window *wnd) { reg_t handle; @@ -413,8 +449,6 @@ Port *GfxPorts::getPortById(uint16 id) { return _windowsById[id]; } - - Port *GfxPorts::setPort(Port *newPort) { Port *oldPort = _curPort; _curPort = newPort; diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h index d10bc6772f..f7f0721eb7 100644 --- a/engines/sci/graphics/ports.h +++ b/engines/sci/graphics/ports.h @@ -46,6 +46,7 @@ public: ~GfxPorts(); void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16); + void reset(); void kernelSetActive(uint16 portId); Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft); @@ -57,9 +58,10 @@ public: int16 isFrontWindow(Window *wnd); void beginUpdate(Window *wnd); void endUpdate(Window *wnd); - Window *newWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw); + Window *addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw); void drawWindow(Window *wnd); - void disposeWindow(Window *pWnd, bool reanimate); + void removeWindow(Window *pWnd, bool reanimate); + void freeWindow(Window *pWnd); void updateWindow(Window *wnd); Port *getPortById(uint16 id); -- cgit v1.2.3 From dc08c733db190ea9f1814e49cd4ed5a7525a96b0 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 20:46:28 +0000 Subject: SCI: adding jones/talkie speed throttler view fixes bug #3038989, regression of r51544 svn-id: r51714 --- engines/sci/graphics/animate.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index df52ab9a7c..ab4362cda9 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -631,14 +631,21 @@ void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t _ports->setPort(oldPort); + // Now trigger speed throttler switch (_lastCastData.size()) { case 0: // No entries drawn -> no speed throttler triggering break; case 1: { + // One entry drawn -> check if that entry was a speed benchmark view, if not enable speed throttler AnimateEntry *onlyCast = &_lastCastData[0]; + if ((onlyCast->viewId == 0) && (onlyCast->loopNo == 13) && (onlyCast->celNo == 0)) { + // this one is used by jones talkie + if ((onlyCast->celRect.height() == 8) && (onlyCast->celRect.width() == 8)) + return; + } // first loop and first cel used? if ((onlyCast->loopNo == 0) && (onlyCast->celNo == 0)) { // and that cel has a known speed benchmark resolution -- cgit v1.2.3 From 7487b51e873bdb9b919641ab84cfa1225cd465ed Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 3 Aug 2010 21:38:26 +0000 Subject: SCI: not error()ing out on no free channels instead we just ignore such channels. I'm not sure how sierra sci behaved in that case, they ignored channels as well, but maybe they removed them from earlier music svn-id: r51715 --- engines/sci/sound/midiparser_sci.cpp | 3 ++- engines/sci/sound/music.cpp | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index e58fa5120b..6ec28a8b02 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -425,7 +425,8 @@ void MidiParser_SCI::sendToDriver(uint32 midi) { // Channel remapping int16 realChannel = _channelRemap[midiChannel]; - assert(realChannel != -1); + if (realChannel == -1) + return; midi = (midi & 0xFFFFFFF0) | realChannel; if (_mainThreadCalled) diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index c3315bd2b5..061f380ebc 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -293,7 +293,10 @@ int16 SciMusic::tryToOwnChannel(MusicEntry *caller, int16 bestChannel) { return channelNr; } } - error("no free channels"); + // nothing found, don't map channel at all + // sierra did this as well, although i'm not sure if we act exactly the same way + // maybe they removed channels from previous playing music + return -1; } void SciMusic::freeChannels(MusicEntry *caller) { -- cgit v1.2.3 From bde4012f464a47ebe43a5f0498c7a18c40889140 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 00:33:54 +0000 Subject: SCI: Silence valgrind warning (thanks to syke for pointing out) svn-id: r51717 --- engines/sci/video/seq_decoder.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/video/seq_decoder.cpp b/engines/sci/video/seq_decoder.cpp index 2c117ae329..02db66bfb9 100644 --- a/engines/sci/video/seq_decoder.cpp +++ b/engines/sci/video/seq_decoder.cpp @@ -76,6 +76,7 @@ bool SeqDecoder::load(Common::SeekableReadStream &stream) { uint16 palColorCount = READ_LE_UINT16(paletteData + 29); int palOffset = 37; + memset(_palette, 0, 256 * 3); for (uint16 colorNo = palColorStart; colorNo < palColorStart + palColorCount; colorNo++) { if (palFormat == kSeqPalVariable) -- cgit v1.2.3 From cbe07a07b7bad5dec7630d85675128cd5f7ece51 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 05:06:41 +0000 Subject: SCI: Fix SCI32 texts that are in Str objects The text selector of the text bitmap object can contain either a Str object or a raw string. Handling the Str object case fixes the Torin demo. Oooh! Vertical scrolling! svn-id: r51722 --- engines/sci/graphics/frameout.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index fd559917ca..9816e0caa6 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -485,7 +485,15 @@ void GfxFrameout::kernelFrameout() { // This draws text the "SCI0-SCI11" way. In SCI2, text is prerendered in kCreateTextBitmap // TODO: rewrite this the "SCI2" way (i.e. implement the text buffer to draw inside kCreateTextBitmap) if (lookupSelector(_segMan, itemEntry->object, SELECTOR(text), NULL, NULL) == kSelectorVariable) { - Common::String text = _segMan->getString(readSelector(_segMan, itemEntry->object, SELECTOR(text))); + reg_t stringObject = readSelector(_segMan, itemEntry->object, SELECTOR(text)); + + // The object in the text selector of the item can be either a raw string + // or a Str object. In the latter case, we need to access the object's data + // selector to get the raw string. + if (_segMan->isHeapObject(stringObject)) + stringObject = readSelector(_segMan, stringObject, SELECTOR(data)); + + Common::String text = _segMan->getString(stringObject); GfxFont *font = _cache->getFont(readSelectorValue(_segMan, itemEntry->object, SELECTOR(font))); bool dimmed = readSelectorValue(_segMan, itemEntry->object, SELECTOR(dimmed)); uint16 foreColor = readSelectorValue(_segMan, itemEntry->object, SELECTOR(fore)); -- cgit v1.2.3 From 0eaa9bddb6beb605ef602dffb4da6dae9713ac50 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 05:15:01 +0000 Subject: SCI: Fix restoring SCI32 games (a regression of r51712) svn-id: r51723 --- engines/sci/engine/savegame.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index fb23b79c34..a086669997 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -760,7 +760,8 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->gameStartTime = g_system->getMillis(); s->_screenUpdateTime = g_system->getMillis(); - g_sci->_gfxPorts->reset(); + if (g_sci->_gfxPorts) + g_sci->_gfxPorts->reset(); g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); -- cgit v1.2.3 From 154c589f188914e79ba10da1de947a5ae2c0427e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 Aug 2010 08:23:48 +0000 Subject: GRAPHICS: Fix FlicDecoder::hasDirtyPalette signature Add const qualifier to FlicDecoder::hasDirtyPalette to make it match that if VideoDecoder::hasDirtyPalette. svn-id: r51724 --- graphics/video/flic_decoder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/video/flic_decoder.h b/graphics/video/flic_decoder.h index 60f4e3472c..249d3ba4bc 100644 --- a/graphics/video/flic_decoder.h +++ b/graphics/video/flic_decoder.h @@ -72,7 +72,7 @@ public: void copyDirtyRectsToBuffer(uint8 *dst, uint pitch); byte *getPalette() { _paletteChanged = false; return _palette; } - bool hasDirtyPalette() { return _paletteChanged; } + bool hasDirtyPalette() const { return _paletteChanged; } void reset(); protected: -- cgit v1.2.3 From 0e2807dc27af89c46a191834e5e623a9e77e9187 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 Aug 2010 08:25:05 +0000 Subject: GRAPHICS: Change signature of VideoDecoder::load() Now takes a pointer to a stream, instead of a reference. The rational is that in all instances, callers have a pointer (and dereference it to call load), and all load implementations turn the reference back into a pointer. svn-id: r51725 --- engines/gob/videoplayer.cpp | 2 +- engines/mohawk/video.cpp | 4 ++-- engines/sci/video/seq_decoder.cpp | 4 ++-- engines/sci/video/seq_decoder.h | 2 +- engines/sci/video/vmd_decoder.cpp | 4 ++-- engines/sci/video/vmd_decoder.h | 2 +- graphics/video/avi_decoder.cpp | 4 ++-- graphics/video/avi_decoder.h | 2 +- graphics/video/coktelvideo/coktelvideo.cpp | 12 ++++++------ graphics/video/coktelvideo/coktelvideo.h | 16 ++++++---------- graphics/video/dxa_decoder.cpp | 4 ++-- graphics/video/dxa_decoder.h | 2 +- graphics/video/flic_decoder.cpp | 4 ++-- graphics/video/flic_decoder.h | 2 +- graphics/video/qt_decoder.cpp | 4 ++-- graphics/video/qt_decoder.h | 2 +- graphics/video/smk_decoder.cpp | 4 ++-- graphics/video/smk_decoder.h | 2 +- graphics/video/video_decoder.cpp | 2 +- graphics/video/video_decoder.h | 2 +- 20 files changed, 38 insertions(+), 42 deletions(-) diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index 125edd4307..51bc1b88a5 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -73,7 +73,7 @@ bool VideoPlayer::Video::open(const char *fileName, Type which, int16 width, int return false; } - if (!_video->load(*_stream)) { + if (!_video->load(_stream)) { warning("While loading video \"%s\"", fileName); close(); return false; diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index a45a4294c8..17456b8ec3 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -342,7 +342,7 @@ VideoHandle VideoManager::createVideoHandle(uint16 id, uint16 x, uint16 y, bool entry.loop = loop; entry.enabled = true; entry->setChunkBeginOffset(_vm->getResourceOffset(ID_TMOV, id)); - entry->load(*_vm->getRawData(ID_TMOV, id)); + entry->load(_vm->getRawData(ID_TMOV, id)); // Search for any deleted videos so we can take a formerly used slot for (uint32 i = 0; i < _videoStreams.size(); i++) @@ -378,7 +378,7 @@ VideoHandle VideoManager::createVideoHandle(Common::String filename, uint16 x, u return NULL_VID_HANDLE; } - entry->load(*file); + entry->load(file); // Search for any deleted videos so we can take a formerly used slot for (uint32 i = 0; i < _videoStreams.size(); i++) diff --git a/engines/sci/video/seq_decoder.cpp b/engines/sci/video/seq_decoder.cpp index 02db66bfb9..58fd60621d 100644 --- a/engines/sci/video/seq_decoder.cpp +++ b/engines/sci/video/seq_decoder.cpp @@ -55,10 +55,10 @@ SeqDecoder::~SeqDecoder() { close(); } -bool SeqDecoder::load(Common::SeekableReadStream &stream) { +bool SeqDecoder::load(Common::SeekableReadStream *stream) { close(); - _fileStream = &stream; + _fileStream = stream; _surface = new Graphics::Surface(); _surface->create(SEQ_SCREEN_WIDTH, SEQ_SCREEN_HEIGHT, 1); diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index 416abb78fa..1714477083 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -38,7 +38,7 @@ public: SeqDecoder(); virtual ~SeqDecoder(); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); void setFrameDelay(int frameDelay) { _frameDelay = frameDelay; } diff --git a/engines/sci/video/vmd_decoder.cpp b/engines/sci/video/vmd_decoder.cpp index 93132bc5d6..680a449207 100644 --- a/engines/sci/video/vmd_decoder.cpp +++ b/engines/sci/video/vmd_decoder.cpp @@ -50,13 +50,13 @@ VMDDecoder::~VMDDecoder() { close(); } -bool VMDDecoder::load(Common::SeekableReadStream &stream) { +bool VMDDecoder::load(Common::SeekableReadStream *stream) { close(); if (!_vmdDecoder->load(stream)) return false; - _fileStream = &stream; + _fileStream = stream; if (_vmdDecoder->getFeatures() & Graphics::CoktelVideo::kFeaturesPalette) loadPaletteFromVMD(); diff --git a/engines/sci/video/vmd_decoder.h b/engines/sci/video/vmd_decoder.h index 231da9202e..e79064b1f7 100644 --- a/engines/sci/video/vmd_decoder.h +++ b/engines/sci/video/vmd_decoder.h @@ -56,7 +56,7 @@ public: uint32 getFrameWaitTime(); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); bool isVideoLoaded() const { return _fileStream != 0; } diff --git a/graphics/video/avi_decoder.cpp b/graphics/video/avi_decoder.cpp index 4c3c770c60..06589d99b0 100644 --- a/graphics/video/avi_decoder.cpp +++ b/graphics/video/avi_decoder.cpp @@ -211,10 +211,10 @@ void AviDecoder::handleStreamHeader() { } } -bool AviDecoder::load(Common::SeekableReadStream &stream) { +bool AviDecoder::load(Common::SeekableReadStream *stream) { close(); - _fileStream = &stream; + _fileStream = stream; _decodedHeader = false; // Read chunks until we have decoded the header diff --git a/graphics/video/avi_decoder.h b/graphics/video/avi_decoder.h index 5f09992647..72cf2d7ef5 100644 --- a/graphics/video/avi_decoder.h +++ b/graphics/video/avi_decoder.h @@ -178,7 +178,7 @@ public: Audio::Mixer::SoundType soundType = Audio::Mixer::kPlainSoundType); virtual ~AviDecoder(); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); bool isVideoLoaded() const { return _fileStream != 0; } diff --git a/graphics/video/coktelvideo/coktelvideo.cpp b/graphics/video/coktelvideo/coktelvideo.cpp index 4d93815b44..9ee9fd68d0 100644 --- a/graphics/video/coktelvideo/coktelvideo.cpp +++ b/graphics/video/coktelvideo/coktelvideo.cpp @@ -127,14 +127,14 @@ Common::MemoryReadStream *PreImd::getExtraData(const char *fileName) { return 0; } -bool PreImd::load(Common::SeekableReadStream &stream) { +bool PreImd::load(Common::SeekableReadStream *stream) { // Since PreIMDs don't have any width and height values stored, // we need them to be specified in the constructor assert((_forcedWidth > 0) && (_forcedHeight > 0)); unload(); - _stream = &stream; + _stream = stream; _stream->seek(0); @@ -564,10 +564,10 @@ bool Imd::loadFrameTables(uint32 framesPosPos, uint32 framesCoordsPos) { return true; } -bool Imd::load(Common::SeekableReadStream &stream) { +bool Imd::load(Common::SeekableReadStream *stream) { unload(); - _stream = &stream; + _stream = stream; uint16 handle; @@ -1656,10 +1656,10 @@ void Vmd::readExtraData() { } } -bool Vmd::load(Common::SeekableReadStream &stream) { +bool Vmd::load(Common::SeekableReadStream *stream) { unload(); - _stream = &stream; + _stream = stream; uint16 headerLength; uint16 handle; diff --git a/graphics/video/coktelvideo/coktelvideo.h b/graphics/video/coktelvideo/coktelvideo.h index 8fbd861e82..f8b1965f41 100644 --- a/graphics/video/coktelvideo/coktelvideo.h +++ b/graphics/video/coktelvideo/coktelvideo.h @@ -23,12 +23,8 @@ * */ -// Currently, only GOB and SCI32 games play IMDs and VMDs, so skip compiling if GOB and SCI32 is disabled. -#if !(defined(ENABLE_GOB) || defined(ENABLE_SCI32) || defined(DYNAMIC_MODULES)) - -// Do not compile the CoktelVideo code - -#else +// Currently, only GOB and SCI32 games play IMDs and VMDs +#if defined(ENABLE_GOB) || defined(ENABLE_SCI32) || defined(DYNAMIC_MODULES) #ifndef GRAPHICS_VIDEO_COKTELVIDEO_H #define GRAPHICS_VIDEO_COKTELVIDEO_H @@ -153,7 +149,7 @@ public: virtual Common::MemoryReadStream *getExtraData(const char *fileName) = 0; /** Load a video out of a stream. */ - virtual bool load(Common::SeekableReadStream &stream) = 0; + virtual bool load(Common::SeekableReadStream *stream) = 0; /** Unload the currently loaded video. */ virtual void unload() = 0; @@ -243,7 +239,7 @@ public: bool hasExtraData(const char *fileName) const; Common::MemoryReadStream *getExtraData(const char *fileName); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void unload(); void setXY(int16 x, int16 y); @@ -322,7 +318,7 @@ public: uint32 getSyncLag() const; - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void unload(); void setXY(int16 x, int16 y); @@ -451,7 +447,7 @@ public: bool hasExtraData(const char *fileName) const; Common::MemoryReadStream *getExtraData(const char *fileName); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void unload(); int16 getWidth() const; diff --git a/graphics/video/dxa_decoder.cpp b/graphics/video/dxa_decoder.cpp index 3f26012f5e..5066e8cf37 100644 --- a/graphics/video/dxa_decoder.cpp +++ b/graphics/video/dxa_decoder.cpp @@ -66,10 +66,10 @@ DXADecoder::~DXADecoder() { close(); } -bool DXADecoder::load(Common::SeekableReadStream &stream) { +bool DXADecoder::load(Common::SeekableReadStream *stream) { close(); - _fileStream = &stream; + _fileStream = stream; uint32 tag = _fileStream->readUint32BE(); assert(tag == MKID_BE('DEXA')); diff --git a/graphics/video/dxa_decoder.h b/graphics/video/dxa_decoder.h index d61346324f..eb4426dbbc 100644 --- a/graphics/video/dxa_decoder.h +++ b/graphics/video/dxa_decoder.h @@ -43,7 +43,7 @@ public: DXADecoder(); virtual ~DXADecoder(); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); bool isVideoLoaded() const { return _fileStream != 0; } diff --git a/graphics/video/flic_decoder.cpp b/graphics/video/flic_decoder.cpp index 524e157269..843d3ee093 100644 --- a/graphics/video/flic_decoder.cpp +++ b/graphics/video/flic_decoder.cpp @@ -41,10 +41,10 @@ FlicDecoder::~FlicDecoder() { close(); } -bool FlicDecoder::load(Common::SeekableReadStream &stream) { +bool FlicDecoder::load(Common::SeekableReadStream *stream) { close(); - _fileStream = &stream; + _fileStream = stream; /* uint32 frameSize = */ _fileStream->readUint32LE(); uint16 frameType = _fileStream->readUint16LE(); diff --git a/graphics/video/flic_decoder.h b/graphics/video/flic_decoder.h index 249d3ba4bc..bba1403c22 100644 --- a/graphics/video/flic_decoder.h +++ b/graphics/video/flic_decoder.h @@ -51,7 +51,7 @@ public: * Load a video file * @param stream the stream to load */ - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); /** diff --git a/graphics/video/qt_decoder.cpp b/graphics/video/qt_decoder.cpp index 61b0f5166d..470441dab8 100644 --- a/graphics/video/qt_decoder.cpp +++ b/graphics/video/qt_decoder.cpp @@ -308,8 +308,8 @@ bool QuickTimeDecoder::loadFile(const Common::String &filename) { return true; } -bool QuickTimeDecoder::load(Common::SeekableReadStream &stream) { - _fd = &stream; +bool QuickTimeDecoder::load(Common::SeekableReadStream *stream) { + _fd = stream; _foundMOOV = _foundMDAT = false; _numStreams = 0; _partial = 0; diff --git a/graphics/video/qt_decoder.h b/graphics/video/qt_decoder.h index db4ff8180b..196d4c02cb 100644 --- a/graphics/video/qt_decoder.h +++ b/graphics/video/qt_decoder.h @@ -89,7 +89,7 @@ public: * Load a QuickTime video file from a SeekableReadStream * @param stream the stream to load */ - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); /** * Close a QuickTime encoded video file diff --git a/graphics/video/smk_decoder.cpp b/graphics/video/smk_decoder.cpp index 0b7de774eb..4d03305cce 100644 --- a/graphics/video/smk_decoder.cpp +++ b/graphics/video/smk_decoder.cpp @@ -367,10 +367,10 @@ uint32 SmackerDecoder::getElapsedTime() const { return VideoDecoder::getElapsedTime(); } -bool SmackerDecoder::load(Common::SeekableReadStream &stream) { +bool SmackerDecoder::load(Common::SeekableReadStream *stream) { close(); - _fileStream = &stream; + _fileStream = stream; // Seek to the first frame _header.signature = _fileStream->readUint32BE(); diff --git a/graphics/video/smk_decoder.h b/graphics/video/smk_decoder.h index 6bf671f318..43bb84a4f8 100644 --- a/graphics/video/smk_decoder.h +++ b/graphics/video/smk_decoder.h @@ -57,7 +57,7 @@ public: Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType); virtual ~SmackerDecoder(); - bool load(Common::SeekableReadStream &stream); + bool load(Common::SeekableReadStream *stream); void close(); bool isVideoLoaded() const { return _fileStream != 0; } diff --git a/graphics/video/video_decoder.cpp b/graphics/video/video_decoder.cpp index 53a5887e4f..081f47bf78 100644 --- a/graphics/video/video_decoder.cpp +++ b/graphics/video/video_decoder.cpp @@ -42,7 +42,7 @@ bool VideoDecoder::loadFile(const Common::String &filename) { return false; } - return load(*file); + return load(file); } uint32 VideoDecoder::getElapsedTime() const { diff --git a/graphics/video/video_decoder.h b/graphics/video/video_decoder.h index d96545d2c1..a398a62009 100644 --- a/graphics/video/video_decoder.h +++ b/graphics/video/video_decoder.h @@ -93,7 +93,7 @@ public: * Load a video file * @param stream the stream to load */ - virtual bool load(Common::SeekableReadStream &stream) = 0; + virtual bool load(Common::SeekableReadStream *stream) = 0; /** * Close a video file -- cgit v1.2.3 From 5ed9ddaa2c0ba1df52b72799c6fbd35a566e6960 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 Aug 2010 08:25:39 +0000 Subject: SCI: Remove reference to common/serializer.h from vm_types.h svn-id: r51726 --- engines/sci/engine/savegame.cpp | 74 ++++++++++++++++++++--------------------- engines/sci/engine/vm_types.h | 6 ---- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index a086669997..96dddb2c62 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -55,34 +55,6 @@ namespace Sci { #pragma mark - -// TODO: Many of the following sync_*() methods should be turned into member funcs -// of the classes they are syncing. - -void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { - soundObj.saveLoadWithSerializer(s); - s.syncAsSint16LE(resourceId); - s.syncAsSint16LE(dataInc); - s.syncAsSint16LE(ticker); - s.syncAsSint16LE(signal, VER(17)); - s.syncAsByte(priority); - s.syncAsSint16LE(loop, VER(17)); - s.syncAsByte(volume); - s.syncAsByte(hold, VER(17)); - s.syncAsByte(fadeTo); - s.syncAsSint16LE(fadeStep); - s.syncAsSint32LE(fadeTicker); - s.syncAsSint32LE(fadeTickerStep); - s.syncAsByte(status); - - // pMidiParser and pStreamAud will be initialized when the - // sound list is reconstructed in gamestate_restore() - if (s.isLoading()) { - soundRes = 0; - pMidiParser = 0; - pStreamAud = 0; - } -} - // Experimental hack: Use syncWithSerializer to sync. By default, this assume // the object to be synced is a subclass of Serializable and thus tries to invoke // the saveLoadWithSerializer() method. But it is possible to specialize this @@ -142,7 +114,8 @@ void syncArray(Common::Serializer &s, Common::Array &arr) { template <> void syncWithSerializer(Common::Serializer &s, reg_t &obj) { - obj.saveLoadWithSerializer(s); + s.syncAsUint16LE(obj.segment); + s.syncAsUint16LE(obj.offset); } void SegManager::saveLoadWithSerializer(Common::Serializer &s) { @@ -200,7 +173,7 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { template <> void syncWithSerializer(Common::Serializer &s, Class &obj) { s.syncAsSint32LE(obj.script); - obj.reg.saveLoadWithSerializer(s); + syncWithSerializer(s, obj.reg); } static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) { @@ -260,7 +233,7 @@ void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { void Object::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_flags); - _pos.saveLoadWithSerializer(s); + syncWithSerializer(s, _pos); s.syncAsSint32LE(_methodCount); // that's actually a uint16 syncArray(s, _variables); @@ -277,18 +250,18 @@ template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - obj.first.saveLoadWithSerializer(s); - obj.last.saveLoadWithSerializer(s); + syncWithSerializer(s, obj.first); + syncWithSerializer(s, obj.last); } template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - obj.pred.saveLoadWithSerializer(s); - obj.succ.saveLoadWithSerializer(s); - obj.key.saveLoadWithSerializer(s); - obj.value.saveLoadWithSerializer(s); + syncWithSerializer(s, obj.pred); + syncWithSerializer(s, obj.succ); + syncWithSerializer(s, obj.key); + syncWithSerializer(s, obj.value); } #ifdef ENABLE_SCI32 @@ -322,7 +295,7 @@ void syncWithSerializer(Common::Serializer &s, Table >::Entry &o if (s.isSaving()) value = obj.getValue(i); - value.saveLoadWithSerializer(s); + syncWithSerializer(s, value); if (s.isLoading()) obj.setValue(i, value); @@ -520,6 +493,31 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { } } +void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { + syncWithSerializer(s, soundObj); + s.syncAsSint16LE(resourceId); + s.syncAsSint16LE(dataInc); + s.syncAsSint16LE(ticker); + s.syncAsSint16LE(signal, VER(17)); + s.syncAsByte(priority); + s.syncAsSint16LE(loop, VER(17)); + s.syncAsByte(volume); + s.syncAsByte(hold, VER(17)); + s.syncAsByte(fadeTo); + s.syncAsSint16LE(fadeStep); + s.syncAsSint32LE(fadeTicker); + s.syncAsSint32LE(fadeTickerStep); + s.syncAsByte(status); + + // pMidiParser and pStreamAud will be initialized when the + // sound list is reconstructed in gamestate_restore() + if (s.isLoading()) { + soundRes = 0; + pMidiParser = 0; + pStreamAud = 0; + } +} + void SoundCommandParser::syncPlayList(Common::Serializer &s) { _music->saveLoadWithSerializer(s); } diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index 828fba3d7d..edf35a122a 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -27,7 +27,6 @@ #define SCI_ENGINE_VM_TYPES_H #include "common/scummsys.h" -#include "common/serializer.h" namespace Sci { @@ -57,11 +56,6 @@ struct reg_t { int16 toSint16() const { return (int16) offset; } - - void saveLoadWithSerializer(Common::Serializer &s) { - s.syncAsUint16LE(segment); - s.syncAsUint16LE(offset); - } }; static inline reg_t make_reg(SegmentId segment, uint16 offset) { -- cgit v1.2.3 From fcf3ea61fef643231076ce9b3d6e160f74015477 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 4 Aug 2010 08:26:09 +0000 Subject: SCI: Simplify code (let the compiler interfer types where possible) svn-id: r51727 --- engines/sci/engine/savegame.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 96dddb2c62..4a60aaa2fb 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -173,7 +173,7 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) { template <> void syncWithSerializer(Common::Serializer &s, Class &obj) { s.syncAsSint32LE(obj.script); - syncWithSerializer(s, obj.reg); + syncWithSerializer(s, obj.reg); } static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) { @@ -233,7 +233,7 @@ void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { void Object::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsSint32LE(_flags); - syncWithSerializer(s, _pos); + syncWithSerializer(s, _pos); s.syncAsSint32LE(_methodCount); // that's actually a uint16 syncArray(s, _variables); @@ -243,25 +243,25 @@ template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - syncWithSerializer(s, obj); + syncWithSerializer(s, obj); } template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - syncWithSerializer(s, obj.first); - syncWithSerializer(s, obj.last); + syncWithSerializer(s, obj.first); + syncWithSerializer(s, obj.last); } template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - syncWithSerializer(s, obj.pred); - syncWithSerializer(s, obj.succ); - syncWithSerializer(s, obj.key); - syncWithSerializer(s, obj.value); + syncWithSerializer(s, obj.pred); + syncWithSerializer(s, obj.succ); + syncWithSerializer(s, obj.key); + syncWithSerializer(s, obj.value); } #ifdef ENABLE_SCI32 @@ -295,7 +295,7 @@ void syncWithSerializer(Common::Serializer &s, Table >::Entry &o if (s.isSaving()) value = obj.getValue(i); - syncWithSerializer(s, value); + syncWithSerializer(s, value); if (s.isLoading()) obj.setValue(i, value); @@ -381,14 +381,14 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { _objects.clear(); Object tmp; for (uint i = 0; i < numObjs; ++i) { - syncWithSerializer(s, tmp); + syncWithSerializer(s, tmp); _objects[tmp.getPos().offset] = tmp; } } else { ObjMap::iterator it; const ObjMap::iterator end = _objects.end(); for (it = _objects.begin(); it != end; ++it) { - syncWithSerializer(s, it->_value); + syncWithSerializer(s, it->_value); } } @@ -494,7 +494,7 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) { } void MusicEntry::saveLoadWithSerializer(Common::Serializer &s) { - syncWithSerializer(s, soundObj); + syncWithSerializer(s, soundObj); s.syncAsSint16LE(resourceId); s.syncAsSint16LE(dataInc); s.syncAsSint16LE(ticker); -- cgit v1.2.3 From b45f2fcb972d18808db80c51280f2f132150ef06 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 4 Aug 2010 09:15:37 +0000 Subject: SCI: fix fadeout on workarounds svn-id: r51728 --- engines/sci/sound/soundcmd.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 52c97eba90..7a01b91e44 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -324,7 +324,11 @@ reg_t SoundCommandParser::kDoSoundFade(int argc, reg_t *argv, reg_t acc) { case 4: // SCI01+ case 5: // SCI1+ (SCI1 late sound scheme), with fade and continue musicSlot->fadeTo = CLIP(argv[1].toUint16(), 0, MUSIC_VOLUME_MAX); - musicSlot->fadeStep = volume > argv[1].toUint16() ? -argv[3].toUint16() : argv[3].toUint16(); + // sometimes we get objects in that position, fix it up (ffs. workarounds) + if (!argv[1].segment) + musicSlot->fadeStep = volume > musicSlot->fadeTo ? -argv[3].toUint16() : argv[3].toUint16(); + else + musicSlot->fadeStep = volume > musicSlot->fadeTo ? -5 : 5; musicSlot->fadeTickerStep = argv[2].toUint16() * 16667 / _music->soundGetTempo(); musicSlot->fadeTicker = 0; musicSlot->stopAfterFading = (argc == 5) ? (argv[4].toUint16() != 0) : false; -- cgit v1.2.3 From 975e3bf83e2ddd985906930d5c0e6f5b07afc134 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 4 Aug 2010 10:11:06 +0000 Subject: SCI: fixing a scrolling issue in sci32 svn-id: r51729 --- engines/sci/graphics/frameout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 9816e0caa6..a433b26ef2 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -369,7 +369,7 @@ void GfxFrameout::kernelFrameout() { int16 pictureOffsetX = planeOffsetX; int16 pictureX = itemEntry->x; - if (planeOffsetX) { + if ((planeOffsetX) || (itemEntry->picStartX)) { if (planeOffsetX <= itemEntry->picStartX) { pictureX += itemEntry->picStartX - planeOffsetX; pictureOffsetX = 0; -- cgit v1.2.3 From 8d3086d3016477e070c434db2ddc915c9ac53284 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Aug 2010 12:02:50 +0000 Subject: SCI: Fixed the two script bugs described in bug #3039294 - "SCI: HOYLE4 - Uninitialized Read(s)" svn-id: r51730 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 168a053e1c..63e9089336 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -77,6 +77,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_HOYLE3, -1, 0, 1, "Character", "say", -1, 505, { WORKAROUND_FAKE, 0 } }, // when starting checkers or dominoes, first time a character says something { GID_HOYLE3, -1, 700, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu { GID_HOYLE3, 100, 100, 0, "dominoHand2", "cue", -1, 1, { WORKAROUND_FAKE, 0 } }, // while playing domino - bug #3036918 + { GID_HOYLE4, -1, 0, 0, "gcWindow", "open", -1, -1, { WORKAROUND_FAKE, 0 } }, // when selecting "Control" from the menu (temp vars 0-3) - bug #3039294 + { GID_HOYLE4, 910, 910, 0, "IconBarList", "setup", -1, 3, { WORKAROUND_FAKE, 0 } }, // when selecting "Tutorial" from the main menu - bug #3039294 { GID_ISLANDBRAIN, 140, 140, 0, "piece", "init", -1, 3, { WORKAROUND_FAKE, 1 } }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 200, 268, 0, "anElement", "select", -1, 0, { WORKAROUND_FAKE, 0 } }, // elements puzzle, gets used before super TextIcon { GID_JONES, 1, 232, 0, "weekendText", "draw", 0x3d3, 0, { WORKAROUND_FAKE, 0 } }, // jones/cd only - gets called during the game -- cgit v1.2.3 From 74304fb790759a1dc4dc9b078565b9eba0fe2c34 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Wed, 4 Aug 2010 12:11:23 +0000 Subject: SCI: Fix infinite recursion when saving. This was a regression from r51727. svn-id: r51731 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 4a60aaa2fb..a7716516e7 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -243,7 +243,7 @@ template <> void syncWithSerializer(Common::Serializer &s, Table::Entry &obj) { s.syncAsSint32LE(obj.next_free); - syncWithSerializer(s, obj); + syncWithSerializer(s, obj); } template <> -- cgit v1.2.3 From 624107319ef8d57854b6b8e4d264831697d5d00e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Aug 2010 12:41:00 +0000 Subject: SCI: Fixed an off-by-one error in GfxPorts::getPortById() and moved the error checking code outside the function. Also fixed script bug #3039305 - "HOYLE4: segfault" svn-id: r51733 --- engines/sci/graphics/ports.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index afbe0e676c..0c97f5d29b 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -179,8 +179,18 @@ void GfxPorts::kernelSetActive(uint16 portId) { case 0xFFFF: setPort(_menuPort); break; - default: - setPort(getPortById(portId)); + default: { + Port *newPort = getPortById(portId); + if (newPort) + setPort(newPort); + else { + if (g_sci->getGameId() == GID_HOYLE4 && portId == 3) { + // Hoyle 4 attempts to set invalid port ID 3 when closing the options dialog (bug #3039305) + } else { + error("GfxPorts::kernelSetActive was requested to set invalid port id %d", portId); + } + } + } }; } @@ -218,7 +228,10 @@ reg_t GfxPorts::kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uin void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { Window *wnd = (Window *)getPortById(windowId); - removeWindow(wnd, reanimate); + if (wnd) + removeWindow(wnd, reanimate); + else + error("GfxPorts::kernelDisposeWindow: Request to dispose invalid port id %d", windowId); } int16 GfxPorts::isFrontWindow(Window *pWnd) { @@ -415,7 +428,7 @@ void GfxPorts::removeWindow(Window *pWnd, bool reanimate) { _paint16->kernelGraphRedrawBox(pWnd->restoreRect); _windowList.remove(pWnd); setPort(_windowList.back()); - _windowsById[pWnd->id] = 0; + _windowsById[pWnd->id] = NULL; delete pWnd; } @@ -444,9 +457,7 @@ void GfxPorts::updateWindow(Window *wnd) { } Port *GfxPorts::getPortById(uint16 id) { - if (id > _windowsById.size()) - error("getPortById() received invalid id"); - return _windowsById[id]; + return (id < _windowsById.size()) ? _windowsById[id] : NULL; } Port *GfxPorts::setPort(Port *newPort) { -- cgit v1.2.3 From 2b1f366e19f19ba5316fe7af95bd77176178d801 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Aug 2010 12:54:16 +0000 Subject: SCI: Added detection entry for Hoyle 4 (Hoyle Classic Card Games) from bug report #3039291 svn-id: r51735 --- engines/sci/detection_tables.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 73dd7e1c29..f29dce1603 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -800,6 +800,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + // Hoyle 4 (Hoyle Classic Card Games) - English DOS/Win + // SCI1.1 + // Supplied by abevi in bug report #3039291 + {"hoyle4", "Demo", { + {"resource.map", 0, "2b577c975cc8d8d43f61b6a756129fe3", 4352}, + {"resource.000", 0, "43e2c15ce436aab611a462ad0603e12d", 2000132}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + // Jones in the Fast Lane EGA - English DOS // SCI interpreter version 1.000.172 (not 100% sure FIXME) {"jones", "EGA", { -- cgit v1.2.3 From 4db52c1ce13fa6b621ba77949b0a34c8881ff997 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Aug 2010 13:35:56 +0000 Subject: SCI: Turned a warning into a debugC svn-id: r51738 --- engines/sci/sound/soundcmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 7a01b91e44..567a1605f3 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -569,7 +569,7 @@ reg_t SoundCommandParser::kDoSoundSetPriority(int argc, reg_t *argv, reg_t acc) MusicEntry *musicSlot = _music->getSlot(obj); if (!musicSlot) { - warning("kDoSound(setPriority): Slot not found (%04x:%04x)", PRINT_REG(obj)); + debugC(2, kDebugLevelSound, "kDoSound(setPriority): Slot not found (%04x:%04x)", PRINT_REG(obj)); return acc; } -- cgit v1.2.3 From a5056cde9812a18dd76e3c453ba4bb62b9d303ab Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 15:17:09 +0000 Subject: SCI: Add 'movie' subdirectory for VMD's The Torin's intro movie now plays. Minor kPlayVMD cleanup. svn-id: r51739 --- engines/sci/engine/kvideo.cpp | 11 +++++++---- engines/sci/sci.cpp | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index cd103dade7..3ad2d95f58 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -205,11 +205,15 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { videoDecoder = new VMDDecoder(g_system->getMixer()); + if (!videoDecoder->loadFile(fileName)) { + warning("Could not open VMD %s", fileName.c_str()); + break; + } + if (reshowCursor) g_sci->_gfxCursor->kernelHide(); - if (videoDecoder && videoDecoder->loadFile(fileName)) - playVideo(videoDecoder); + playVideo(videoDecoder); if (reshowCursor) g_sci->_gfxCursor->kernelShow(); @@ -280,8 +284,7 @@ reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv) { // Looks to be setting the video size and position. Called with 4 extra integer // parameters (e.g. 86, 41, 235, 106) default: - warningMsg = "PlayVMD - unsupported subop. Params: " + - Common::String::printf("%d", argc) + " ("; + warningMsg = Common::String::printf("PlayVMD - unsupported subop %d. Params: %d (", operation, argc); for (int i = 0; i < argc; i++) { warningMsg += Common::String::printf("%04x:%04x", PRINT_REG(argv[i])); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 6abe52fea4..7624aed569 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -126,6 +126,7 @@ SciEngine::SciEngine(OSystem *syst, const ADGameDescription *desc, SciGameId gam SearchMan.addSubDirectoryMatching(gameDataDir, "seq"); // SEQ movie files for DOS versions SearchMan.addSubDirectoryMatching(gameDataDir, "robot"); // robot movie files SearchMan.addSubDirectoryMatching(gameDataDir, "robots"); // robot movie files + SearchMan.addSubDirectoryMatching(gameDataDir, "movie"); // vmd movie files SearchMan.addSubDirectoryMatching(gameDataDir, "movies"); // vmd movie files SearchMan.addSubDirectoryMatching(gameDataDir, "vmd"); // vmd movie files -- cgit v1.2.3 From fbd7c8456705442f12c9c798c58ec146f0a85063 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 16:13:26 +0000 Subject: SCI: Add Hero's Quest demo detection entry (qfg1 ega) svn-id: r51740 --- engines/sci/detection_tables.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index f29dce1603..9007e18eba 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -2315,8 +2315,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.003", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 642203}, {"resource.004", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 641688}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Quest for Glory 1 / Hero's Quest - English DOS 5.25" Floppy (supplied by markcoolio in bug report #2723843) // Executable scanning reports "0.000.566" @@ -2331,8 +2330,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.006", 0, "69366c2a2f99917199fe1b60a4fee19d", 267852}, {"resource.007", 0, "7ab2bf8e224b57f75e0cd6e4ba790761", 272747}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH - }, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + + // Quest for Glory 1 / Hero's Quest - English DOS Demo + // Executable scanning reports "0.000.685" + {"qfg1", "Demo", { + {"resource.map", 0, "df34c758cbb9026da175793ff686b0e6", 882}, + {"resource.001", 0, "73fbaafdd313b39aeedb80fbf85ecef1", 389884}, + AD_LISTEND}, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, // Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes english language) // Executable scanning reports "S.old.201" -- cgit v1.2.3 From e5ffc7847cb70f792b4658aa032959949e849669 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Wed, 4 Aug 2010 16:53:09 +0000 Subject: AUDIO: Implement volume and balance control for the AudioCD manager (needed for music fading in Kyra 1 FM-Towns and probably other FM-Towns games). This addition applies to emulated CD audio only for now. I haven't found a way to implement this for real CDs yet. SDL doesn't seem to support this (but it might be just me? If anyone knows more about this, just tell me). svn-id: r51741 --- engines/kyra/sound_towns.cpp | 5 +- sound/audiocd.cpp | 37 ++++++++++- sound/audiocd.h | 5 ++ sound/softsynth/fmtowns_pc98/towns_audio.cpp | 90 +++++++++++++++++++++----- sound/softsynth/fmtowns_pc98/towns_audio.h | 3 + sound/softsynth/fmtowns_pc98/towns_euphony.cpp | 8 +-- sound/softsynth/fmtowns_pc98/towns_euphony.h | 4 +- 7 files changed, 126 insertions(+), 26 deletions(-) diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 5f877f7d8a..95e2a5e63f 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -66,6 +66,8 @@ bool SoundTowns::init() { if (!loadInstruments()) return false; + _driver->cdaSetVolume(1, 118, 118); + return true; } @@ -90,6 +92,7 @@ void SoundTowns::playTrack(uint8 track) { beginFadeOut(); if (_musicEnabled == 2 && trackNum != -1) { + _driver->cdaSetVolume(1, 118, 118); AudioCD.play(trackNum+1, loop ? -1 : 1, 0, 0); AudioCD.updateCD(); _cdaPlaying = true; @@ -198,7 +201,7 @@ void SoundTowns::playSoundEffect(uint8 track) { } _driver->chanVolume(_sfxChannel, 127); - _driver->chanStereo(_sfxChannel, 0x40); + _driver->chanPanPos(_sfxChannel, 0x40); _driver->chanPitch(_sfxChannel, 0); _driver->playSoundEffect(_sfxChannel, note, 127, sfxPlaybackBuffer); } diff --git a/sound/audiocd.cpp b/sound/audiocd.cpp index 7afbd12d03..625def58fe 100644 --- a/sound/audiocd.cpp +++ b/sound/audiocd.cpp @@ -42,6 +42,8 @@ AudioCDManager::AudioCDManager() { _cd.start = 0; _cd.duration = 0; _cd.numLoops = 0; + _cd.volume = Mixer::kMaxChannelVolume; + _cd.balance = 0; _mixer = g_system->getMixer(); _emulating = false; assert(_mixer); @@ -79,7 +81,8 @@ void AudioCDManager::play(int track, int numLoops, int startFrame, int duration, */ _emulating = true; _mixer->playStream(Mixer::kMusicSoundType, &_handle, - makeLoopingAudioStream(stream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops)); + makeLoopingAudioStream(stream, start, end, (numLoops < 1) ? numLoops + 1 : numLoops), -1, _cd.volume, _cd.balance); + } else { _emulating = false; if (!only_emulate) @@ -109,6 +112,38 @@ bool AudioCDManager::isPlaying() const { } } +void AudioCDManager::setVolume(byte volume) { + _cd.volume = volume; + if (_emulating) { + // Audio CD emulation + if (_mixer->isSoundHandleActive(_handle)) + _mixer->setChannelVolume(_handle, _cd.volume); + } else { + // Real Audio CD + + // Unfortunately I can't implement this atm + // since SDL doesn't seem to offer an interface method for this. + + // g_system->setVolumeCD(_cd.volume); + } +} + +void AudioCDManager::setBalance(int8 balance) { + _cd.balance = balance; + if (_emulating) { + // Audio CD emulation + if (isPlaying()) + _mixer->setChannelBalance(_handle, _cd.balance); + } else { + // Real Audio CD + + // Unfortunately I can't implement this atm + // since SDL doesn't seem to offer an interface method for this. + + // g_system->setBalanceCD(_cd.balance); + } +} + void AudioCDManager::updateCD() { if (_emulating) { // Check whether the audio track stopped playback diff --git a/sound/audiocd.h b/sound/audiocd.h index 3ef4a1ac09..abc45a1640 100644 --- a/sound/audiocd.h +++ b/sound/audiocd.h @@ -42,6 +42,8 @@ public: int start; int duration; int numLoops; + int volume; + int balance; }; /** @@ -59,6 +61,9 @@ public: void stop(); bool isPlaying() const; + void setVolume(byte volume); + void setBalance(int8 balance); + void updateCD(); Status getStatus() const; diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp index 773c5a8067..42b9be804e 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp @@ -24,6 +24,7 @@ */ #include "sound/softsynth/fmtowns_pc98/towns_audio.h" +#include "sound/audiocd.h" #include "common/endian.h" @@ -101,8 +102,9 @@ private: TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfacePluginDriver *driver) : TownsPC98_FmSynth(mixer, kTypeTowns), _fmInstruments(0), _pcmInstruments(0), _pcmChan(0), _waveTables(0), _waveTablesTotalDataSize(0), - _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), _pcmSfxChanMask(0), - _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), _ready(false) { + _baserate(55125.0f / (float)mixer->getOutputRate()), _tickLength(0), _timer(0), _drv(driver), + _pcmSfxChanMask(0), _musicVolume(Audio::Mixer::kMaxMixerVolume), _sfxVolume(Audio::Mixer::kMaxMixerVolume), + _cdaVolFlags(0), _ready(false) { #define INTCB(x) &TownsAudioInterface::intf_##x static const TownsAudioIntfCallback intfCb[] = { @@ -147,7 +149,7 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac INTCB(notImpl), INTCB(notImpl), // 32 - INTCB(notImpl), + INTCB(loadSamples), INTCB(reserveEffectChannels), INTCB(loadWaveTable), INTCB(unloadWaveTable), @@ -268,7 +270,6 @@ int TownsAudioInterface::callback(int command, ...) { return 4; } - Common::StackLock lock(_mutex); int res = (this->*_intfOpcodes[command])(args); va_end(args); @@ -350,11 +351,9 @@ void TownsAudioInterface::timerCallbackA() { void TownsAudioInterface::timerCallbackB() { Common::StackLock lock(_mutex); - if (_ready) { - if (_drv) - _drv->timerCallback(1); - for (int i = 0; i < 8; i++) - pcmUpdateEnvelopeGenerator(i); + if (_drv && _ready) { + _drv->timerCallback(1); + callback(80); } } @@ -489,6 +488,29 @@ int TownsAudioInterface::intf_enableTimerB(va_list &args) { return 0; } +int TownsAudioInterface::intf_loadSamples(va_list &args) { + uint32 dest = va_arg(args, uint32); + int size = va_arg(args, int); + uint8 *src = va_arg(args, uint8*); + + if (dest >= 65536 || size == 0 || size > 65536) + return 3; + if (size + dest > 65536) + return 5; + + int dwIndex = _numWaveTables - 1; + for (uint32 t = _waveTablesTotalDataSize; dwIndex && (dest < t); dwIndex--) + t -= _waveTables[dwIndex].size; + + TownsAudio_WaveTable *s = &_waveTables[dwIndex]; + _waveTablesTotalDataSize -= s->size; + s->size = size; + s->readData(src); + _waveTablesTotalDataSize += s->size; + + return 0; +} + int TownsAudioInterface::intf_reserveEffectChannels(va_list &args) { int numChan = va_arg(args, int); if (numChan > 8) @@ -541,9 +563,9 @@ int TownsAudioInterface::intf_loadWaveTable(va_list &args) { TownsAudio_WaveTable *s = &_waveTables[_numWaveTables++]; s->readHeader(data); - s->readData(data + 32); - - _waveTablesTotalDataSize += w.size; + + _waveTablesTotalDataSize += s->size; + callback(32, _waveTablesTotalDataSize, s->size, data + 32); return 0; } @@ -698,9 +720,44 @@ int TownsAudioInterface::intf_pcmUpdateEnvelopeGenerator(va_list &args) { } int TownsAudioInterface::intf_cdaSetVolume(va_list &args) { - /*int unk = va_arg(args, int); - int volume1 = va_arg(args, int); - int volume2 = va_arg(args, int);*/ + int mode = va_arg(args, int); + int left = va_arg(args, int); + int right = va_arg(args, int); + + // calculate mixer balance value + int8 balance = right - left; + + if (left & 0xff80 || right & 0xff80) + return 3; + + static const uint8 flags[] = { 0x0C, 0x30, 0x40, 0x80 }; + + //int a = (mode & 0x40) ? 4 : 0; + int b = mode & 3; + left = (left & 0x7e) >> 1; + right = (right & 0x7e) >> 1; + + if (mode & 0x40) + _cdaVolFlags |= flags[b]; + else + _cdaVolFlags &= ~flags[b]; + + if (mode > 1) { + // Unknown purpose / TODO + + } else if (mode == 1) { + // FM Towns seems to support volumes of 0 - 63 for each channel. + // We recalculate sane values for out 0 to 255 volume range. + + int vl = (int)(((float)left * 255.0f) / 63.0f); + int vr = (int)(((float)right * 255.0f) / 63.0f); + AudioCD.setVolume((vl + vr) >> 1); + AudioCD.setBalance(balance); + + } else { + // Unknown purpose / TODO + } + return 0; } @@ -1402,8 +1459,7 @@ void TownsAudio_PcmChannel::clear() { panLeft = panRight = 0; - envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = - envSustainRate = envReleaseRate = 0; + envTotalLevel = envAttackRate = envDecayRate = envSustainLevel = envSustainRate = envReleaseRate = 0; envStep = envCurrentLevel = 0; envState = kEnvReady; diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.h b/sound/softsynth/fmtowns_pc98/towns_audio.h index 707c9e6bd4..212c00c40f 100644 --- a/sound/softsynth/fmtowns_pc98/towns_audio.h +++ b/sound/softsynth/fmtowns_pc98/towns_audio.h @@ -77,6 +77,7 @@ private: int intf_setTimerB(va_list &args); int intf_enableTimerA(va_list &args); int intf_enableTimerB(va_list &args); + int intf_loadSamples(va_list &args); int intf_reserveEffectChannels(va_list &args); int intf_loadWaveTable(va_list &args); int intf_unloadWaveTable(va_list &args); @@ -148,6 +149,8 @@ private: void pcmCalcPhaseStep(TownsAudio_PcmChannel *p, TownsAudio_WaveTable *w); void cdaReset(); + + uint8 _cdaVolFlags; const float _baserate; uint32 _timerBase; diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp index 13120df17a..e23d5bcb36 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.cpp +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.cpp @@ -66,8 +66,6 @@ bool TownsEuphonyDriver::init() { reset(); - cdaSetVolume(1, 118, 118); - return true; } @@ -194,7 +192,7 @@ bool TownsEuphonyDriver::soundEffectIsPlaying(int chan) { return _intf->callback(40, chan) ? true : false; } -void TownsEuphonyDriver::chanStereo(int chan, int mode) { +void TownsEuphonyDriver::chanPanPos(int chan, int mode) { _intf->callback(3, chan, mode); } @@ -206,8 +204,8 @@ void TownsEuphonyDriver::chanVolume(int chan, int vol) { _intf->callback(8, chan, vol); } -void TownsEuphonyDriver::cdaSetVolume(int a, int vol1, int vol2) { - _intf->callback(67, a, vol1, vol2); +void TownsEuphonyDriver::cdaSetVolume(int mode, int volLeft, int volRight) { + _intf->callback(67, mode, volLeft, volRight); } int TownsEuphonyDriver::chanEnable(int tableEntry, int val) { diff --git a/sound/softsynth/fmtowns_pc98/towns_euphony.h b/sound/softsynth/fmtowns_pc98/towns_euphony.h index 47cfdcb2b9..2026a299c1 100644 --- a/sound/softsynth/fmtowns_pc98/towns_euphony.h +++ b/sound/softsynth/fmtowns_pc98/towns_euphony.h @@ -50,11 +50,11 @@ public: void stopSoundEffect(int chan); bool soundEffectIsPlaying(int chan); - void chanStereo(int chan, int mode); + void chanPanPos(int chan, int mode); void chanPitch(int chan, int pitch); void chanVolume(int chan, int vol); - void cdaSetVolume(int a, int vol1, int vol2); + void cdaSetVolume(int mode, int volLeft, int volRight); int chanEnable(int tableEntry, int val); int chanMode(int tableEntry, int val); -- cgit v1.2.3 From 642b03fb44a19109d8f098174fdfa326d2ae5ee5 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 17:50:09 +0000 Subject: SCI: Add kDisplay workarounds for the Hero's Quest demo svn-id: r51742 --- engines/sci/engine/kernel.cpp | 5 +++++ engines/sci/engine/workarounds.cpp | 3 ++- engines/sci/graphics/paint16.cpp | 11 ++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 25502100ae..157884fac3 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -68,6 +68,11 @@ const Common::String &Kernel::getSelectorName(uint selector) { for (uint loopSelector = _selectorNames.size(); loopSelector <= selector; ++loopSelector) _selectorNames.push_back(Common::String::printf("", loopSelector)); } + + // Ensure that the selector has a name + if (_selectorNames[selector].empty()) + _selectorNames[selector] = Common::String::printf("", selector); + return _selectorNames[selector]; } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 63e9089336..9f3509be1d 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -173,7 +173,8 @@ const SciWorkaroundEntry kDeviceInfo_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object - { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 75h as id + { GID_PQ2, 23, 23, 0, "rm23Script", "elements", 0x4ae, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the 2nd page of pate's file - 0x75 as id + { GID_QFG1, 11, 11, 0, "battle", "", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When entering battle, 0x75 as id { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object { GID_SQ4, 391, 391, 0, "choosePlug", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ordering connector in roboter sale - a parameter is an object SCI_WORKAROUNDENTRY_TERMINATOR diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 0685d96073..4551e9dafc 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -459,8 +459,8 @@ void GfxPaint16::kernelGraphRedrawBox(Common::Rect rect) { #define SCI_DISPLAY_WIDTH 106 #define SCI_DISPLAY_SAVEUNDER 107 #define SCI_DISPLAY_RESTOREUNDER 108 -#define SCI_DISPLAY_DUMMY1 114 // used in longbow-demo, not supported in sierra sci - no parameters -#define SCI_DISPLAY_DUMMY2 115 // used in longbow-demo, not supported in sierra sci - has 1 parameter +#define SCI_DISPLAY_DUMMY1 114 // used in longbow demo/qfg1 ega demo, not supported in sierra sci - no parameters +#define SCI_DISPLAY_DUMMY2 115 // used in longbow demo, not supported in sierra sci - has 1 parameter #define SCI_DISPLAY_DONTSHOWBITS 121 reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { @@ -531,15 +531,16 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { break; // 2 Dummy functions, longbow-demo is using those several times but sierra sci doesn't support them at all + // The Quest for Glory 1 EGA demo also calls kDisplay(114) case SCI_DISPLAY_DUMMY1: case SCI_DISPLAY_DUMMY2: - if (!((g_sci->getGameId() == GID_LONGBOW) && (g_sci->isDemo()))) - error("Unknown kDisplay argument %X", displayArg.offset); + if (!g_sci->isDemo() || (g_sci->getGameId() != GID_LONGBOW && g_sci->getGameId() != GID_QFG1)) + error("Unknown kDisplay argument %d", displayArg.offset); if (displayArg.offset == SCI_DISPLAY_DUMMY2) { if (argc) { argc--; argv++; } else { - error("No parameter left for kDisplay(0x73)"); + error("No parameter left for kDisplay(115)"); } } break; -- cgit v1.2.3 From ed741dc96c2369bfc6abf29704108bc29e5ba9a9 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 18:11:11 +0000 Subject: SCI: Fix bug #3038913 - SCI Fanmade - The Legend of the Lost Jewel: Crash by bugs Added workaround for calling mul with an object and kSetAngle with two objects as parameters. svn-id: r51743 --- engines/sci/engine/vm.cpp | 2 +- engines/sci/engine/workarounds.cpp | 7 +++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index c6e8b3e2dd..7f6d6cfd82 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1063,7 +1063,7 @@ void run_vm(EngineState *s) { if (validate_signedInteger(s->r_acc, value1) && validate_signedInteger(r_temp, value2)) s->r_acc = make_reg(0, value1 * value2); else - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, s->r_acc, r_temp); + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeMulWorkarounds, s->r_acc, r_temp); break; } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 9f3509be1d..49349f7083 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -52,6 +52,12 @@ const SciWorkaroundEntry opcodeGeWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeMulWorkarounds[] = { + { GID_FANMADE, 516, 983, 0, "Wander", "setTarget", -1, 0, { WORKAROUND_FAKE, 0 } }, // The Legend of the Lost Jewel Demo (fan made): called with object as second parameter when attacked by insects - bug #3038913 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeOrWorkarounds[] = { { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 @@ -202,6 +208,7 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kGetAngle_workarounds[] = { + { GID_FANMADE, 516, 992, 0, "Motion", "init", -1, 0, { WORKAROUND_IGNORE, 0 } }, // The Legend of the Lost Jewel Demo (fan made): called with third/fourth parameters as objects { GID_KQ6, 740, 752, 0, "throwDazzle", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // after the Genie is exposed in the Palace (short and long ending), it starts shooting lightning bolts around. An extra 5th parameter is passed - bug #3034610 SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index b2852db150..8a3edb6246 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -71,6 +71,7 @@ struct SciWorkaroundEntry { extern const SciWorkaroundEntry opcodeDivWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry opcodeGeWorkarounds[]; +extern const SciWorkaroundEntry opcodeMulWorkarounds[]; extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; -- cgit v1.2.3 From 79882783369235ae815a5f00d5c7d9d281b9fb7b Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 18:19:18 +0000 Subject: SCI: Add uninit'd workaround for bug #3038757 svn-id: r51744 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 49349f7083..5028855b1a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -72,6 +72,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos + { GID_FANMADE, 528, 990, 0, "GDialog", "doit", -1, 4, { WORKAROUND_FAKE, 0 } }, // Happens in Cascade Quest when closing the glossary - bug #3038757 { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_FREDDYPHARKAS, -1, 31, 0, "quitWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu { GID_GK1, -1, 64950, -1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // sometimes when walk-clicking -- cgit v1.2.3 From 4a2ab850192eeec9df486d920b0cb769081d2b03 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 4 Aug 2010 22:45:10 +0000 Subject: SCI: Fix size of wave files inside audio volumes (thanks to LordHoto for pointing out) svn-id: r51745 --- engines/sci/resource_audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 8c7fe9eca4..a25505fe47 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -93,7 +93,7 @@ bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { uint32 riffTag = file->readUint32BE(); if (riffTag == MKID_BE('RIFF')) { _headerSize = 0; - size = file->readUint32LE(); + size = file->readUint32LE() + 8; file->seek(-8, SEEK_CUR); return loadFromWaveFile(file); } -- cgit v1.2.3 From 8e6d2eb5a37a0887ec569699118486cbf78ab5f5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 05:27:55 +0000 Subject: SCI: Extended the QFG3 workaround in room 330 (speaking with King Rajah). Fixes bug #3039774 - "Uninitialized Read" svn-id: r51751 --- engines/sci/engine/workarounds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5028855b1a..c9df8e1764 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -127,7 +127,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present - { GID_QFG3, 330, 330, 0, "rajahTeller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0) + { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 1b6925765469de2e96bfa44f5b0c739309f982cf Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 5 Aug 2010 07:49:19 +0000 Subject: SCI: changing hoyle 4 workaround fixing hoyle 4 detection entry (not a demo) adding direct selector fix, maybe we should replace this later with a script patch adding detailed comment about the issue svn-id: r51753 --- engines/sci/detection_tables.h | 2 +- engines/sci/engine/selector.cpp | 1 + engines/sci/engine/selector.h | 2 ++ engines/sci/graphics/ports.cpp | 35 ++++++++++++++++++++++++++++------- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index 9007e18eba..0614eff6e6 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -807,7 +807,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "2b577c975cc8d8d43f61b6a756129fe3", 4352}, {"resource.000", 0, "43e2c15ce436aab611a462ad0603e12d", 2000132}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, // Jones in the Fast Lane EGA - English DOS // SCI interpreter version 1.000.172 (not 100% sure FIXME) diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index f5eb9eb73a..f99a41e088 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -164,6 +164,7 @@ void Kernel::mapSelectors() { FIND_SELECTOR(vanishingX); FIND_SELECTOR(vanishingY); FIND_SELECTOR(iconIndex); + FIND_SELECTOR(port); #ifdef ENABLE_SCI32 FIND_SELECTOR(data); diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 661290f58c..00e795c1b9 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -127,6 +127,8 @@ struct SelectorCache { // SCI1.1 Mac icon bar selectors Selector iconIndex; ///< Used to index icon bar objects + Selector port; // used by a hoyle 4 workaround + #ifdef ENABLE_SCI32 Selector data; // Used by Array()/String() Selector picture; // Used to hold the picture ID for SCI32 pictures diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 0c97f5d29b..2e4eb85cb8 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -27,7 +27,9 @@ #include "sci/sci.h" #include "sci/engine/features.h" +#include "sci/engine/kernel.h" #include "sci/engine/state.h" +#include "sci/engine/selector.h" #include "sci/graphics/screen.h" #include "sci/graphics/paint16.h" #include "sci/graphics/animate.h" @@ -183,13 +185,8 @@ void GfxPorts::kernelSetActive(uint16 portId) { Port *newPort = getPortById(portId); if (newPort) setPort(newPort); - else { - if (g_sci->getGameId() == GID_HOYLE4 && portId == 3) { - // Hoyle 4 attempts to set invalid port ID 3 when closing the options dialog (bug #3039305) - } else { - error("GfxPorts::kernelSetActive was requested to set invalid port id %d", portId); - } - } + else + error("GfxPorts::kernelSetActive was requested to set invalid port id %d", portId); } }; } @@ -232,6 +229,30 @@ void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { removeWindow(wnd, reanimate); else error("GfxPorts::kernelDisposeWindow: Request to dispose invalid port id %d", windowId); + + if ((g_sci->getGameId() == GID_HOYLE4) && (!g_sci->isDemo())) { + // WORKAROUND: hoyle 4 has a broken User::handleEvent implementation + // first of all iconbar is always set and always gets called with + // events checking if event got claimed got removed inside that code + // and it will call handleEvent on gameObj afterwards. Iconbar windows + // are handled inside iconbar as well including disposing + // e.g. iconOK::doit, script 14) and claimed isn't even set. gameObj + // handleEvent calling will result in coordinate adjust with a now + // invalid port. + // We fix this by adjusting the port variable to be global + // again when hoyle4 is disposing windows. + // TODO: maybe this could get implemented as script patch somehow + // although this could get quite tricky to implement (script 996) + // IconBar::handleEvent (script 937) + // maybe inside export 8 of script 0, which is called by iconOK + // and iconReplay + // or inside GameControls::hide (script 978) which is called to + // actually remove the window + reg_t eventObject = _segMan->findObjectByName("uEvt"); + if (!eventObject.isNull()) { + //writeSelectorValue(_segMan, eventObject, SELECTOR(port), 0); + } + } } int16 GfxPorts::isFrontWindow(Window *pWnd) { -- cgit v1.2.3 From c71f1f1612eb87e04f8fd55b7982d99594f93c43 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 5 Aug 2010 07:54:33 +0000 Subject: SCI: actually enable hoyle 4 workaround and adding additional comment svn-id: r51754 --- engines/sci/graphics/ports.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 2e4eb85cb8..2e9128cda6 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -241,6 +241,8 @@ void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { // invalid port. // We fix this by adjusting the port variable to be global // again when hoyle4 is disposing windows. + // This worked because sierra sci leaves old port data, so the pointer + // was still valid for a short period of time // TODO: maybe this could get implemented as script patch somehow // although this could get quite tricky to implement (script 996) // IconBar::handleEvent (script 937) @@ -250,7 +252,7 @@ void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { // actually remove the window reg_t eventObject = _segMan->findObjectByName("uEvt"); if (!eventObject.isNull()) { - //writeSelectorValue(_segMan, eventObject, SELECTOR(port), 0); + writeSelectorValue(_segMan, eventObject, SELECTOR(port), 0); } } } -- cgit v1.2.3 From 33f2bc65a66ee20ad51f4a614820d5a1f19dff29 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 11:19:32 +0000 Subject: SCI: Fixed bug #3039477 - "KQ5CD: No speech after restoring from ScummVM" and added a TODO for loading through the game launcher svn-id: r51755 --- engines/sci/sci.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 7624aed569..d0c578bd45 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -27,6 +27,7 @@ #include "common/config-manager.h" #include "common/debug-channels.h" #include "common/EventRecorder.h" +#include "common/file.h" // for Common::File::exists() #include "engines/advancedDetector.h" #include "engines/util.h" @@ -256,6 +257,16 @@ Common::Error SciEngine::run() { reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL) kRestoreGame(_gamestate, 2, restoreArgv); + // TODO: The best way to do the following would be to invoke Game::init + // here and stop when the room is about to be changed, otherwise some + // game initialization won't take place + + // Set audio language for KQ5CD (bug #3039477) + if (g_sci->getGameId() == GID_KQ5 && Common::File::exists("AUDIO001.002")) { + reg_t doAudioArgv[2] = { make_reg(0, 9), make_reg(0, 1) }; + kDoAudio(_gamestate, 2, doAudioArgv); + } + // Initialize the game menu, if there is one. // This is not done when loading, so we must do it manually. reg_t menuBarObj = _gamestate->_segMan->findObjectByName("MenuBar"); -- cgit v1.2.3 From ff2ad216b1e4042e8b64323998605d2d83e36427 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 5 Aug 2010 14:40:22 +0000 Subject: GUI: Fix classic theme's GMM in 320x200. svn-id: r51756 --- gui/themes/default.inc | 5 ++--- gui/themes/scummclassic.zip | Bin 74494 -> 73968 bytes gui/themes/scummclassic/classic_layout_lowres.stx | 5 ++--- gui/themes/scummmodern.zip | Bin 181835 -> 181317 bytes 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/gui/themes/default.inc b/gui/themes/default.inc index f03b3fc61e..46ac4a1365 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -653,7 +653,6 @@ "width='80' " "/> " " " -" " " " " " " " " " -" " +" " " " " " " " -" " +" " " " " - - + - + _curPage; _screen->_curPage = 2; objectChatPrintText(_chatText, _chatObject); @@ -1996,9 +1996,10 @@ void KyraEngine_HoF::writeSettings() { } void KyraEngine_HoF::readSettings() { + KyraEngine_v2::readSettings(); + int talkspeed = ConfMan.getInt("talkspeed"); _configTextspeed = (talkspeed*95)/255 + 2; - KyraEngine_v1::readSettings(); } } // End of namespace Kyra diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index b37a14bad4..50f36d7b71 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -319,7 +319,7 @@ protected: // chat // -> process void characterSays(int vocFile, const char *chatStr, int8 charNum, int8 chatDuration); - void waitForChatToFinish(int vocFile, int16 chatDuration, const char *str, uint8 charNum); + void waitForChatToFinish(int vocFile, int16 chatDuration, const char *str, uint8 charNum, const bool printText); // -> initialization int initCharacterChat(int8 charNum); diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp index 61bc3708c3..2169e5283f 100644 --- a/engines/kyra/kyra_mr.cpp +++ b/engines/kyra/kyra_mr.cpp @@ -1127,7 +1127,7 @@ void KyraEngine_MR::updateWithText() { restorePage3(); drawAnimObjects(); - if (textEnabled() && _chatText) { + if (_chatTextEnabled && _chatText) { int curPage = _screen->_curPage; _screen->_curPage = 2; objectChatPrintText(_chatText, _chatObject); @@ -1490,7 +1490,7 @@ void KyraEngine_MR::writeSettings() { } void KyraEngine_MR::readSettings() { - KyraEngine_v1::readSettings(); + KyraEngine_v2::readSettings(); _configStudio = ConfMan.getBool("studio_audience"); _configSkip = ConfMan.getBool("skip_support"); diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 5db2c360d6..1c27716a67 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -625,6 +625,10 @@ uint8 KyraEngine_v1::getVolume(kVolumeEntry vol) { void KyraEngine_v1::syncSoundSettings() { Engine::syncSoundSettings(); + // We need to use this here to allow the subtitle options to be changed + // through the GMM's options dialog. + readSettings(); + if (_sound) _sound->updateVolumeSettings(); } diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index 34284a8e20..53c57c21cd 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -63,6 +63,7 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags, const Engi _chatVocLow = -1; _chatText = 0; _chatObject = -1; + _chatTextEnabled = false; memset(_hiddenItems, -1, sizeof(_hiddenItems)); diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index 6aaa8c3687..6414040344 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -350,6 +350,7 @@ protected: int _chatObject; uint32 _chatEndTime; int _chatVocHigh, _chatVocLow; + bool _chatTextEnabled; EMCData _chatScriptData; EMCState _chatScriptState; diff --git a/engines/kyra/text_hof.cpp b/engines/kyra/text_hof.cpp index 48eda97f80..9d20cdd51a 100644 --- a/engines/kyra/text_hof.cpp +++ b/engines/kyra/text_hof.cpp @@ -255,7 +255,8 @@ void KyraEngine_HoF::objectChatInit(const char *str, int object, int vocHigh, in _screen->hideMouse(); - if (textEnabled()) { + _chatTextEnabled = textEnabled(); + if (_chatTextEnabled) { objectChatPrintText(str, object); _chatEndTime = _system->getMillis() + chatCalcDuration(str) * _tickLength; } else { diff --git a/engines/kyra/text_lok.cpp b/engines/kyra/text_lok.cpp index 79b16bc1be..40f2217a2b 100644 --- a/engines/kyra/text_lok.cpp +++ b/engines/kyra/text_lok.cpp @@ -32,10 +32,9 @@ namespace Kyra { -void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const char *chatStr, uint8 charNum) { +void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const char *chatStr, uint8 charNum, const bool printText) { bool hasUpdatedNPCs = false; bool runLoop = true; - bool drawText = textEnabled(); uint8 currPage; uint32 timeToEnd = strlen(chatStr) * 8 * _tickLength + _system->getMillis(); @@ -92,7 +91,7 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const _animator->preserveAnyChangedBackgrounds(); _animator->prepDrawAllObjects(); - if (drawText) { + if (printText) { currPage = _screen->_curPage; _screen->_curPage = 2; _text->printCharacterText(chatStr, charNum, _characterList[charNum].x1); @@ -102,7 +101,7 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const _animator->copyChangedObjectsForward(0); updateTextFade(); - if (((chatDuration < (int16)(_system->getMillis() - timeAtStart)) && chatDuration != -1 && drawText) || (!drawText && !snd_voiceIsPlaying())) + if (((chatDuration < (int16)(_system->getMillis() - timeAtStart)) && chatDuration != -1 && printText) || (!printText && !snd_voiceIsPlaying())) break; uint32 nextTime = loopStart + _tickLength; @@ -293,7 +292,9 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int8 charNu _text->_talkMessageY = yPos; _text->_talkMessageH = lineNum * 10; - if (textEnabled()) { + const bool printText = textEnabled(); + + if (printText) { _animator->restoreAllObjectBackgrounds(); _screen->copyRegion(12, _text->_talkMessageY, 12, 136, 296, _text->_talkMessageH, 2, 2); @@ -310,9 +311,9 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int8 charNu if (!speechEnabled()) vocFile = -1; - waitForChatToFinish(vocFile, chatTicks, chatStr, charNum); + waitForChatToFinish(vocFile, chatTicks, chatStr, charNum, printText); - if (textEnabled()) { + if (printText) { _animator->restoreAllObjectBackgrounds(); _screen->copyRegion(12, 136, 12, _text->_talkMessageY, 296, _text->_talkMessageH, 2, 2); diff --git a/engines/kyra/text_mr.cpp b/engines/kyra/text_mr.cpp index ea2dc48031..726d9e339f 100644 --- a/engines/kyra/text_mr.cpp +++ b/engines/kyra/text_mr.cpp @@ -265,7 +265,8 @@ void KyraEngine_MR::objectChatInit(const char *str, int object, int vocHigh, int _screen->hideMouse(); - if (textEnabled()) { + _chatTextEnabled = textEnabled(); + if (_chatTextEnabled) { objectChatPrintText(str, object); _chatEndTime = _system->getMillis() + chatCalcDuration(str) * _tickLength; } else { diff --git a/engines/kyra/timer_hof.cpp b/engines/kyra/timer_hof.cpp index 117b84f48a..d8f86e30a2 100644 --- a/engines/kyra/timer_hof.cpp +++ b/engines/kyra/timer_hof.cpp @@ -97,6 +97,9 @@ void KyraEngine_HoF::setTimer1DelaySecs(int secs) { } void KyraEngine_HoF::setWalkspeed(uint8 newSpeed) { + if (!_timer) + return; + if (newSpeed < 5) newSpeed = 3; else diff --git a/engines/kyra/timer_lok.cpp b/engines/kyra/timer_lok.cpp index 40426a3dfe..6f4948c279 100644 --- a/engines/kyra/timer_lok.cpp +++ b/engines/kyra/timer_lok.cpp @@ -188,6 +188,9 @@ void KyraEngine_LoK::timerRedrawAmulet(int timerNum) { } void KyraEngine_LoK::setWalkspeed(uint8 newSpeed) { + if (!_timer) + return; + static const uint8 speeds[] = { 11, 9, 6, 5, 3 }; assert(newSpeed < ARRAYSIZE(speeds)); -- cgit v1.2.3 From 19e624ae5be72bfe1dc677911d656871737dd371 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 16:58:59 +0000 Subject: SCI: Changed the warning when a script can't be found from a segment into an error svn-id: r51758 --- engines/sci/engine/vm.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 7f6d6cfd82..35fc3ca566 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -933,11 +933,7 @@ void run_vm(EngineState *s) { obj = s->_segMan->getObject(s->xs->objp); local_script = s->_segMan->getScriptIfLoaded(s->xs->local_segment); if (!local_script) { - // FIXME: Why does this happen? Is the script not loaded yet at this point? - warning("Could not find local script from segment %x", s->xs->local_segment); - local_script = NULL; - s->variablesBase[VAR_LOCAL] = s->variables[VAR_LOCAL] = NULL; - s->variablesMax[VAR_LOCAL] = 0; + error("Could not find local script from segment %x", s->xs->local_segment); } else { s->variablesSegment[VAR_LOCAL] = local_script->_localsSegment; if (local_script->_localsBlock) -- cgit v1.2.3 From e36abee963c2af73981db0dea42eb39d504a7f0c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 20:12:40 +0000 Subject: SCI: Applied patch #3040164, "3 Workarrounds for QFG4 floppy" svn-id: r51762 --- engines/sci/engine/workarounds.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index c9df8e1764..2349827f27 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -128,6 +128,9 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) + { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen + { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu + { GID_QFG4, -1, 64917, -1, "Plane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, happen sometimes in fights { GID_SQ1, 103, 103, 0, "hand", "internalEvent", -1, -1, { WORKAROUND_FAKE, 0 } }, // Spanish (and maybe early versions?) only: when moving cursor over input pad, temps 1 and 2 { GID_SQ1, -1, 703, 0, "", "export 1", -1, 0, { WORKAROUND_FAKE, 0 } }, // sub that's called from several objects while on sarien battle cruiser { GID_SQ1, -1, 703, 0, "firePulsar", "changeState", 0x18a, 0, { WORKAROUND_FAKE, 0 } }, // export 1, but called locally (when shooting at aliens) -- cgit v1.2.3 From 0f27a860491ded3631db18a954dd4b46677c4965 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 20:21:28 +0000 Subject: SCI: Fixed script bug #3039656 - "CASTLEBRAIN: Crashes in robot room" svn-id: r51763 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 2349827f27..0753a0794c 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -66,6 +66,7 @@ const SciWorkaroundEntry opcodeOrWorkarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry uninitializedReadWorkarounds[] = { + { GID_CASTLEBRAIN, 280, 280, 0, "programmer", "dispatchEvent", -1, 0, { WORKAROUND_FAKE, 0xf } }, // pressing 'q' on the computer screen in the robot room, and closing the help dialog that pops up (bug #3039656). Moves the cursor to the view with the ID returned (in this case, the robot hand) { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 504, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 -- cgit v1.2.3 From b69469a75d6a4247df0632fa8862398179540704 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 20:32:18 +0000 Subject: SCI: Fixed script bug #3039891 - "QFG2: Crash in thief's job" svn-id: r51764 --- engines/sci/engine/workarounds.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 0753a0794c..e153fadca5 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -127,7 +127,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 - { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when press enter in restore dialog w/o any saved games present + { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present + { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before the second brother is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu -- cgit v1.2.3 From 4ae7427eed781613e2cda096d0f61c77883bca05 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 21:48:30 +0000 Subject: Added a sanity check inside kDoBresen, thanks to lskovlun. Fixes the random crashes in the floor scrubbing scene in SQ5 svn-id: r51768 --- engines/sci/engine/kmovement.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 7f3439331e..4becc6f415 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -30,6 +30,7 @@ #include "sci/engine/selector.h" #include "sci/engine/kernel.h" #include "sci/graphics/animate.h" +#include "sci/graphics/screen.h" namespace Sci { @@ -313,8 +314,15 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { || ((y == desty) && (abs(dy) >= abs(dx))) /* Moving fast, reached? */ ))) { // Whew... in short: If we have reached or passed our target position - x = destx; - y = desty; + + // Sanity check: make sure that destx, desty are inside the screen coordinates. + // They can go off screen in some cases, e.g. in SQ5 while scrubbing the floor + if (destx < g_sci->_gfxScreen->getWidth() && desty < g_sci->_gfxScreen->getHeight()) { + x = destx; + y = desty; + } else { + warning("kDoBresen: destination x, y would be off-screen(%d, %d)", destx, desty); + } completed = 1; debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x", PRINT_REG(mover)); -- cgit v1.2.3 From e82194e4c5e03d4f3786ec17e3f091c5ac92ce3b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 5 Aug 2010 22:39:54 +0000 Subject: KYRA: Fix compilation of create_kyradat. svn-id: r51769 --- tools/create_kyradat/create_kyradat.h | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/create_kyradat/create_kyradat.h b/tools/create_kyradat/create_kyradat.h index 25a950935b..d82e16fed0 100644 --- a/tools/create_kyradat/create_kyradat.h +++ b/tools/create_kyradat/create_kyradat.h @@ -138,7 +138,6 @@ enum kExtractID { k1CreditsStrings, - k1TownsMusicFadeTable, k1TownsMusicFadeTable, k1TownsSFXwdTable, k1TownsSFXbtTable, -- cgit v1.2.3 From 0850f3dcea0f2d6e7f11f0caf4ffc11ebd404901 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 22:58:16 +0000 Subject: SCI: Added bug number for the floor scrubbing bug svn-id: r51770 --- engines/sci/engine/kmovement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 4becc6f415..dfd1aa699e 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -316,7 +316,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { // Whew... in short: If we have reached or passed our target position // Sanity check: make sure that destx, desty are inside the screen coordinates. - // They can go off screen in some cases, e.g. in SQ5 while scrubbing the floor + // They can go off screen in some cases, e.g. in SQ5 while scrubbing the floor (bug #3037351) if (destx < g_sci->_gfxScreen->getWidth() && desty < g_sci->_gfxScreen->getHeight()) { x = destx; y = desty; -- cgit v1.2.3 From b7aa748dd203cf066bab384cca49dc49056b07d5 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 5 Aug 2010 23:04:57 +0000 Subject: KYRA: Append newline in help string of create_kyradat. svn-id: r51771 --- tools/create_kyradat/create_kyradat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/create_kyradat/create_kyradat.cpp b/tools/create_kyradat/create_kyradat.cpp index 38fc60763e..a9d1ecc721 100644 --- a/tools/create_kyradat/create_kyradat.cpp +++ b/tools/create_kyradat/create_kyradat.cpp @@ -501,7 +501,7 @@ bool checkIndex(PAKFile &file) { void printHelp(const char *f) { printf("Usage:\n"); - printf("%s output inputfiles ...", f); + printf("%s output inputfiles ...\n", f); } bool process(PAKFile &out, const Game *g, const byte *data, const uint32 size); -- cgit v1.2.3 From 6c8bcd2ba1cad1312f0a588ca284110bbbb81ccc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 5 Aug 2010 23:08:05 +0000 Subject: SCI: Added a workaround for a script bug in QFG2, room 200, when talking with the astrologer. Fixes bug #3039879, "QFG2: Crash at astrologer's" svn-id: r51772 --- engines/sci/engine/vm.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 35fc3ca566..7bcc5b43a3 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -135,9 +135,13 @@ static StackPtr validate_stack_addr(EngineState *s, StackPtr sp) { static int validate_arithmetic(reg_t reg) { if (reg.segment) { // The results of this are likely unpredictable... It most likely means that a kernel function is returning something wrong. - // If such an error occurs, we usually need to find the last kernel function called and check its return value. Check - // callKernelFunc() below - error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]. Address: %04x:%04x", reg.segment, PRINT_REG(reg)); + // If such an error occurs, we usually need to find the last kernel function called and check its return value. + if (g_sci->getGameId() == GID_QFG2 && g_sci->getEngineState()->currentRoomNumber() == 200) { + // WORKAROUND: This happens in QFG2, room 200, when talking to the astrologer (bug #3039879) - script bug. + // Returning 0 in this case. + } else { + error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]. Address: %04x:%04x", reg.segment, PRINT_REG(reg)); + } return 0; } -- cgit v1.2.3 From 5216d816168072bf2c2587eacb970abb92762513 Mon Sep 17 00:00:00 2001 From: Lars Persson Date: Fri, 6 Aug 2010 10:15:27 +0000 Subject: Don't include engines/sci as userinclude path, causes conflicts with graphics/ inclusion svn-id: r51779 --- backends/platform/symbian/mmp/scummvm_sci.mmp.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/platform/symbian/mmp/scummvm_sci.mmp.in b/backends/platform/symbian/mmp/scummvm_sci.mmp.in index 2466f0ec2d..1748be29b9 100644 --- a/backends/platform/symbian/mmp/scummvm_sci.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sci.mmp.in @@ -58,7 +58,7 @@ SOURCEPATH ..\..\..\..\engines\sci // *** Include paths -USERINCLUDE ..\..\..\..\engines ..\..\..\..\engines\sci +USERINCLUDE ..\..\..\..\engines USERINCLUDE ..\..\..\.. ..\..\..\..\common ..\..\..\..\gui ..\..\..\..\sound ..\src SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src -- cgit v1.2.3 From 0c940edb711e6e1a59b25d907425bed5fbcb8e1a Mon Sep 17 00:00:00 2001 From: Lars Persson Date: Fri, 6 Aug 2010 10:58:51 +0000 Subject: Start to support Flac when building! svn-id: r51781 --- .../symbian/BuildPackageUpload_LocalSettings.pl | 43 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl index cd107f59ca..a9e7aa562a 100644 --- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl +++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl @@ -42,12 +42,12 @@ 'zlib' => 'zlib.lib', 'mad' => 'libmad.lib', 'tremor' => 'libtremor.lib', - 'mpeg2' => 'libmpeg2.lib' + 'flac' => 'libflac.lib' ); # these are normally enabled for each variation #$DefaultFeatures = qw(zlib,mad); - $DefaultFeatures = qw(zlib,mad,tremor); + $DefaultFeatures = qw(zlib,mad,tremor,flac); ################################################################################################################## ## @@ -229,6 +229,45 @@ # now you can add $VariationSets only built on this PC below this line :) } + elsif ($ENV{'COMPUTERNAME'} eq "EMBEDDEV_VAIO1") ################################################################# + { + $Producer = "AnotherGuest"; + $RedirectSTDERR = 1; + $HaltOnError = 0; + $SkipExistingPackages = 1; + $ReallyQuiet = 1; + + #$FTP_Host = "host.com"; + #$FTP_User = "ag@host.com"; + #$FTP_Pass = "password"; + #$FTP_Dir = "cvsbuilds"; + + #$SDK_RootDirs{'UIQ2'}= "D:\\UIQ2"; + $SDK_RootDirs{'UIQ3'}= "G:\\UIQ3"; + #$SDK_RootDirs{'S60v1'}= "D:\\S60v1"; + #$SDK_RootDirs{'S60v2'}= "D:\\S60v2"; + $SDK_RootDirs{'S60v3'}= "G:\\S60v3"; + #$SDK_RootDirs{'S80'}= "D:\\S80"; + #$SDK_RootDirs{'S90'}= "D:\\S90"; + $ECompXL_BinDir= "D:\\ECompXL\\"; + if (0) # so we can turn them on/off easily + { +# $SDK_LibraryDirs{'ALL'}{'zlib.lib'} = "C:\\S\\zlib-1.2.2\\epoc"; +# $SDK_LibraryDirs{'ALL'}{'libmad.lib'} = "C:\\S\\libmad-0.15.1b\\group"; +# $SDK_LibraryDirs{'ALL'}{'libtremor.lib'}= "C:\\tremor\\epoc"; + $SDK_LibraryDirs{'UIQ2'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ"; + $SDK_LibraryDirs{'S60v1'}{'esdl.lib'} = $SDK_LibraryDirs{'S60v2'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60"; + $SDK_LibraryDirs{'S80'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S80"; + $SDK_LibraryDirs{'S90'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S90"; + $SDK_LibraryDirs{'S60v3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\S60\\S60V3"; + $SDK_LibraryDirs{'UIQ3'}{'esdl.lib'} = "E:\\WICKED\\ESDL\\epoc\\UIQ\\UIQ3"; + #$SDK_LibraryDirs{'ALL'}{'libmpeg2.lib'} = "C:\\S\\mpeg2dec-0.4.0\\epoc"; + } + + # now you can add $VariationSets only built on this PC below this line :) + + } + else ######################################################################################################### { print "ERROR: Computer name ".$ENV{'COMPUTERNAME'}." not recognized! Plz edit _LocalSettings.pl!"; -- cgit v1.2.3 From ffbecee1d7178109b27a5809d53c8d51b6267955 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 11:02:52 +0000 Subject: SCI: adding workaround for qfg3 when importing character and choosing previous profession (bug #3040460) svn-id: r51782 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index e153fadca5..25022ec03e 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -129,6 +129,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before the second brother is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 + { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu -- cgit v1.2.3 From 9013c154800a2216b9ce3e36f019f0871d8deeb4 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 11:45:32 +0000 Subject: SCI: properly implementing qfg2 astrologer workaround svn-id: r51783 --- engines/sci/engine/vm.cpp | 15 +++++++-------- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 7bcc5b43a3..6eff5c3ff7 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -136,12 +136,7 @@ static int validate_arithmetic(reg_t reg) { if (reg.segment) { // The results of this are likely unpredictable... It most likely means that a kernel function is returning something wrong. // If such an error occurs, we usually need to find the last kernel function called and check its return value. - if (g_sci->getGameId() == GID_QFG2 && g_sci->getEngineState()->currentRoomNumber() == 200) { - // WORKAROUND: This happens in QFG2, room 200, when talking to the astrologer (bug #3039879) - script bug. - // Returning 0 in this case. - } else { - error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]. Address: %04x:%04x", reg.segment, PRINT_REG(reg)); - } + error("[VM] Attempt to read arithmetic value from non-zero segment [%04x]. Address: %04x:%04x", reg.segment, PRINT_REG(reg)); return 0; } @@ -1820,13 +1815,17 @@ void run_vm(EngineState *s) { case op_lsgi: // 0x4c (76) case op_lsli: // 0x4d (77) case op_lsti: // 0x4e (78) - case op_lspi: // 0x4f (79) + case op_lspi: { // 0x4f (79) // Load global, local, temp or param variable into the stack, // using the accumulator as an additional index var_type = opcode & 0x3; // Gets the variable type: g, l, t or p - var_number = opparams[0] + signed_validate_arithmetic(s->r_acc); + int16 value; + if (!validate_signedInteger(s->r_acc, value)) + value = arithmetic_lookForWorkaround(opcode, opcodeLsiWorkarounds, s->r_acc, NULL_REG).offset; + var_number = opparams[0] + value; PUSH32(READ_VAR(var_type, var_number)); break; + } case op_sag: // 0x50 (80) case op_sal: // 0x51 (81) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 25022ec03e..dd7edde968 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -52,6 +52,12 @@ const SciWorkaroundEntry opcodeGeWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeLsiWorkarounds[] = { + { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // when getting asked for your name by the astrologer bug #3039879 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeMulWorkarounds[] = { { GID_FANMADE, 516, 983, 0, "Wander", "setTarget", -1, 0, { WORKAROUND_FAKE, 0 } }, // The Legend of the Lost Jewel Demo (fan made): called with object as second parameter when attacked by insects - bug #3038913 diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 8a3edb6246..eb13849bdd 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -71,6 +71,7 @@ struct SciWorkaroundEntry { extern const SciWorkaroundEntry opcodeDivWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry opcodeGeWorkarounds[]; +extern const SciWorkaroundEntry opcodeLsiWorkarounds[]; extern const SciWorkaroundEntry opcodeMulWorkarounds[]; extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; -- cgit v1.2.3 From 39e6bb3257e279c60bdf473015d080363ea67945 Mon Sep 17 00:00:00 2001 From: Lars Persson Date: Fri, 6 Aug 2010 13:55:16 +0000 Subject: Enabled translation by default. Include common/error.cpp in uiq3 makefile svn-id: r51784 --- backends/platform/symbian/BuildPackageUpload_AllVersions.pl | 1 + backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in | 7 +++++-- backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in | 7 +++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl index 3543dc8d19..62fcef0275 100644 --- a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl +++ b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl @@ -61,6 +61,7 @@ $ftp_url = "FTP://$FTP_User\@$FTP_Host/$FTP_Dir/"; $ExtraMacros = "MACRO NONSTANDARD_PORT\n"; $ExtraMacros .= "MACRO ENABLE_VKEYBD\n"; $ExtraMacros .= "MACRO DISABLE_FANCY_THEMES\n"; +$ExtraMacros .= "MACRO USE_TRANSLATION\n"; # prep nice list of SDKs #while( ($SDK, $RootDir) = each(%SDK_RootDirs) ) diff --git a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in index bd65c3b5e7..99cbb264c2 100644 --- a/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in +++ b/backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in @@ -110,13 +110,13 @@ SOURCEPATH ..\..\..\..\base //STOP_AUTO_OBJECTS_BASE_// -SOURCEPATH ..\..\..\..\ +SOURCEPATH ..\..\..\.. // backend EPOC/SDL/ESDL specific includes SOURCE backends\platform\sdl\events.cpp SOURCE backends\platform\sdl\graphics.cpp -SOURCE backends\platform\sdl\sdl.cpp SOURCE backends\platform\sdl\hardwarekeys.cpp +SOURCE backends\platform\sdl\sdl.cpp SOURCE backends\fs\symbian\symbian-fs-factory.cpp SOURCE backends\platform\symbian\src\SymbianOS.cpp SOURCE backends\platform\symbian\src\SymbianActions.cpp @@ -127,6 +127,9 @@ SOURCE gui\KeysDialog.cpp SOURCE gui\Actions.cpp SOURCE gui\Dialog.cpp +// Common error +source common\error.cpp + // Special for graphics source graphics\iff.cpp diff --git a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in index 34207df5cf..3509714152 100644 --- a/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in +++ b/backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in @@ -110,13 +110,13 @@ SOURCEPATH ..\..\..\..\base //STOP_AUTO_OBJECTS_BASE_// -SOURCEPATH ..\..\..\..\ +SOURCEPATH ..\..\..\.. // backend EPOC/SDL/ESDL specific includes SOURCE backends\platform\sdl\events.cpp SOURCE backends\platform\sdl\graphics.cpp -SOURCE backends\platform\sdl\sdl.cpp SOURCE backends\platform\sdl\hardwarekeys.cpp +SOURCE backends\platform\sdl\sdl.cpp SOURCE backends\fs\symbian\symbian-fs-factory.cpp SOURCE backends\platform\symbian\src\SymbianOS.cpp SOURCE backends\platform\symbian\src\SymbianActions.cpp @@ -127,6 +127,9 @@ SOURCE gui\KeysDialog.cpp SOURCE gui\Actions.cpp SOURCE gui\Dialog.cpp +// Common error +source common\error.cpp + // Special for graphics source graphics\iff.cpp -- cgit v1.2.3 From 4d03efe855bd3bce1c7e061287b4f201b28d28fa Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Fri, 6 Aug 2010 14:54:00 +0000 Subject: SCI: Fix whitespace svn-id: r51785 --- engines/sci/engine/workarounds.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index dd7edde968..2cfb80738b 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -77,7 +77,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_CNICK_KQ, 200, 0, 1, "Character", "", -1, 505, { WORKAROUND_FAKE, 0 } }, // checkers, like in hoyle 3 { GID_CNICK_KQ, -1, 700, 0, "gcWindow", "", -1, -1, { WORKAROUND_FAKE, 0 } }, // when entering control menu, like in hoyle 3 { GID_CNICK_LONGBOW, 0, 0, 0, "RH Budget", "", -1, 1, { WORKAROUND_FAKE, 0 } }, // when starting the game - { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms + { GID_ECOQUEST, -1, -1, 0, NULL, "doVerb", -1, 0, { WORKAROUND_FAKE, 0 } }, // almost clicking anywhere triggers this in almost all rooms { GID_FANMADE, 516, 979, 0, "", "export 0", -1, 20, { WORKAROUND_FAKE, 0 } }, // Happens in Grotesteing after the logos { GID_FANMADE, 528, 990, 0, "GDialog", "doit", -1, 4, { WORKAROUND_FAKE, 0 } }, // Happens in Cascade Quest when closing the glossary - bug #3038757 { GID_FREDDYPHARKAS, -1, 24, 0, "gcWin", "open", -1, 5, { WORKAROUND_FAKE, 0xf } }, // is used as priority for game menu @@ -135,7 +135,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before the second brother is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 - { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 + { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu @@ -162,16 +162,16 @@ const SciWorkaroundEntry kAbs_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelHigh_workarounds[] = { - { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 - { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 + { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kCelWide_workarounds[] = { - { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 - { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects + { GID_KQ5, -1, 255, 0, "deathIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when getting beaten up in the inn and probably more, called with 2nd parameter as object - bug #3037003 + { GID_PQ2, -1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when showing picture within windows, called with 2nd/3rd parameters as objects { GID_SQ1, 1, 255, 0, "DIcon", "setSize", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // DEMO: Called with 2nd/3rd parameters as objects when clicking on the menu - bug #3035720 SCI_WORKAROUNDENTRY_TERMINATOR }; @@ -340,7 +340,7 @@ const SciWorkaroundEntry kUnLoad_workarounds[] = { { GID_CAMELOT, 921, 921, 1, "Script", "init", 0x36, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: When being attacked by the boar (and other places), the reference is invalid - bug #3035000 { GID_CASTLEBRAIN, 320, 377, 0, "SWord", "upDate", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after solving the cross-word-puzzle, trying to unload invalid reference { GID_CASTLEBRAIN, 320, 377, 0, "theWord", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // 2nd word puzzle, when exiting before solving, trying to unload invalid reference - bug #3034473 - { GID_ECOQUEST, 380, 61, 0, "gotIt", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after talking to the dolphin the first time + { GID_ECOQUEST, 380, 61, 0, "gotIt", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after talking to the dolphin the first time { GID_LAURABOW2, 1, 1, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 2, 2, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: during the intro, a 3rd parameter is passed by accident - bug #3034902 { GID_LAURABOW2, 4, 4, 0, "sCartoon", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // DEMO: inside the museum, a 3rd parameter is passed by accident - bug #3034902 -- cgit v1.2.3 From eb112d671103b7021e466fd0b160efab7a91a26a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 15:05:05 +0000 Subject: SCI: Rewrote the Mother Goose workaround to be like the others, some cleanup svn-id: r51786 --- engines/sci/engine/vm.cpp | 16 ++-------------- engines/sci/engine/workarounds.cpp | 8 +++++++- engines/sci/engine/workarounds.h | 1 + 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 6eff5c3ff7..dbf9c2b17e 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -75,7 +75,6 @@ static ExecStack *add_exec_stack_entry(Common::List &execStack, reg_t reg_t objp, int argc, StackPtr argp, Selector selector, int exportId, int localCallOffset, reg_t sendp, int origin, SegmentId local_segment); - /** * Adds one varselector access to the execution stack. * This function is called from send_selector only. @@ -93,8 +92,6 @@ static ExecStack *add_exec_stack_varselector(Common::List &execStack, int origin); - - // validation functionality static reg_t &validate_property(Object *obj, int index) { @@ -103,14 +100,10 @@ static reg_t &validate_property(Object *obj, int index) { // may modify the value of the returned reg_t. static reg_t dummyReg = NULL_REG; - // FIXME/TODO: Where does this occur? Returning a dummy reg here could lead - // to all sorts of issues! Turned it into an error for now... // If this occurs, it means there's probably something wrong with the garbage // collector, so don't hide it with fake return values - if (!obj) { + if (!obj) error("validate_property: Sending to disposed object"); - //return dummyReg; - } if (index < 0 || (uint)index >= obj->getVarCount()) { // This is same way sierra does it and there are some games, that contain such scripts like @@ -166,11 +159,6 @@ static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, in error("%s. [VM] Access would be outside even of the stack (%d); access denied", txt.c_str(), total_offset); return false; } else { - // WORKAROUND: Mixed-Up Mother Goose tries to use an invalid parameter in Event::new(). - // Just skip around it here so we don't error out in validate_arithmetic. - if (g_sci->getGameId() == GID_MOTHERGOOSE && type == VAR_PARAM && index == 1) - return false; - debugC(2, kDebugLevelVM, "%s", txt.c_str()); debugC(2, kDebugLevelVM, "[VM] Access within stack boundaries; access granted."); return true; @@ -1139,7 +1127,7 @@ void run_vm(EngineState *s) { if (validate_unsignedInteger(r_temp, value1) && validate_unsignedInteger(s->r_acc, value2)) s->r_acc = make_reg(0, value1 & value2); else - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeAndWorkarounds, r_temp, s->r_acc); break; } diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 2cfb80738b..a2720f2933 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -64,9 +64,15 @@ const SciWorkaroundEntry opcodeMulWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeAndWorkarounds[] = { + { GID_MOTHERGOOSE, -1, 999, 0, "Event", "new", -1, 0, { WORKAROUND_FAKE, 0 } }, // constantly during the game + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeOrWorkarounds[] = { - { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 + { GID_ECOQUEST2, 100, 0, 0, "Rain", "points", 0xcc6, 0, { WORKAROUND_FAKE, 0 } }, // when giving the papers to the customs officer, gets called against a pointer instead of a number - bug #3034464 SCI_WORKAROUNDENTRY_TERMINATOR }; diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index eb13849bdd..1b3bafd6cc 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -73,6 +73,7 @@ extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry opcodeGeWorkarounds[]; extern const SciWorkaroundEntry opcodeLsiWorkarounds[]; extern const SciWorkaroundEntry opcodeMulWorkarounds[]; +extern const SciWorkaroundEntry opcodeAndWorkarounds[]; extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; -- cgit v1.2.3 From 2a4768401eeef5ec688524a24aba0740db0abf34 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 15:06:42 +0000 Subject: SCI: some work on the script patcher signature matching is working (added hoyle 4 signature) svn-id: r51787 --- engines/sci/engine/script.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++ engines/sci/engine/script.h | 12 +++++ 2 files changed, 112 insertions(+) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 645094d9ec..845f5b92e3 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -113,6 +113,103 @@ void Script::init(int script_nr, ResourceManager *resMan) { } } +// signatures are built like this: +// - first a counter of the bytes that follow +// - then the actual bytes that need to get matched +// - then another counter of bytes (0 for EOS) +// - if not EOS, an adjust offset and the actual bytes +// - rinse and repeat +const byte hoyle4SignaturePortFix[] = { + 28, + 0x39, 0x09, // pushi 09 + 0x89, 0x0b, // lsg 0b + 0x39, 0x64, // pushi 64 + 0x38, 0xc8, 0x00, // pushi 00c8 + 0x38, 0x2c, 0x01, // pushi 012c + 0x38, 0x90, 0x01, // pushi 0190 + 0x38, 0xf4, 0x01, // pushi 01f4 + 0x38, 0x58, 0x02, // pushi 0258 + 0x38, 0xbc, 0x02, // pushi 02bc + 0x38, 0x20, 0x03, // pushi 0320 + 0x46, // calle [xxxx] [xxxx] [xx] + 13, +5, // [skip 5 bytes] + 0x30, 0x27, 0x00, // bnt 0027 -> end of routine + 0x87, 0x00, // lap 00 + 0x30, 0x19, 0x00, // bnt 0019 -> fade out + 0x87, 0x01, // lap 01 + 0x30, 0x14, 0x00, // bnt 0014 -> fade out + // [...] + 10, +20, // [skip 20 bytes] + 0x38, 0xaa, 0x00, // pushi 00aa + 0x76, // push0 + 0x80, 0x29, 0x01, // lag 0129 + 0x4a, 0x04, // send 04 + 0x48, // ret + 0 +}; + +const int16 hoyle4PatchPortFix[] = { + 0 +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature hoyle4Signatures[] = { + { 0, "port fix when disponsing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, + { 0, NULL, 0, 0, NULL, NULL } +}; + +// will return -1 if no match was found, otherwise an offset to the start of the signature match +int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) { + if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay + return -1; + + const uint32 magicDWord = signature->magicDWord; // is platform-specific BE/LE form, so that the later match will work + const uint32 searchLimit = scriptSize - 3; + uint32 DWordOffset = 0; + // first search for the magic DWORD + while (DWordOffset < searchLimit) { + if (magicDWord == *(uint32 *)(scriptData + DWordOffset)) { + // magic DWORD found, check if actual signature matches + uint32 offset = DWordOffset + signature->magicOffset; + uint32 byteOffset = offset; + const byte *signatureData = signature->data; + byte matchBytesCount = *signatureData++; + while (matchBytesCount) { + if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds? + break; + if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch? + break; + // those bytes matched, adjust offsets accordingly + signatureData += matchBytesCount; + byteOffset += matchBytesCount; + // get next byte count and offset + matchBytesCount = *signatureData++; + if (matchBytesCount) + byteOffset += *signatureData++; + } + if (!matchBytesCount) // all matches worked? + return offset; + } + DWordOffset++; + } + // nothing found + return -1; +} + +void Script::matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, const uint32 scriptSize) { + if (g_sci->getGameId() == GID_HOYLE4) { + const SciScriptSignature *signatureTable = hoyle4Signatures; + while (signatureTable->data) { + uint32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); + if (foundOffset != -1) { + // found, so apply the patch + warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); + } + signatureTable++; + } + } +} + void Script::load(ResourceManager *resMan) { Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, _nr), 0); assert(script != 0); @@ -123,6 +220,9 @@ void Script::load(ResourceManager *resMan) { assert(_bufSize >= script->size); memcpy(_buf, script->data, script->size); + // Check scripts for matching signatures and patch those, if found + matchSignatureAndPatch(_nr, _buf, script->size); + if (getSciVersion() >= SCI_VERSION_1_1) { Resource *heap = resMan->findResource(ResourceId(kResourceTypeHeap, _nr), 0); assert(heap != 0); diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 3817f8aae1..8334cc838c 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -31,6 +31,15 @@ namespace Sci { +struct SciScriptSignature { + uint16 scriptNr; + const char *description; + uint32 magicDWord; + int magicOffset; + const byte *data; + const int16 *patch; +}; + struct EngineState; class ResourceManager; @@ -100,6 +109,9 @@ public: void init(int script_nr, ResourceManager *resMan); void load(ResourceManager *resMan); + void matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, const uint32 scriptSize); + int32 findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize); + virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); virtual reg_t findCanonicAddress(SegManager *segMan, reg_t sub_addr) const; -- cgit v1.2.3 From afed447b6fd3f52e7958c5ce499f84939f2e79e3 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 15:12:03 +0000 Subject: SCI: fix warnings svn-id: r51788 --- engines/sci/engine/script.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 845f5b92e3..17ea7cf782 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -168,7 +168,7 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr uint32 DWordOffset = 0; // first search for the magic DWORD while (DWordOffset < searchLimit) { - if (magicDWord == *(uint32 *)(scriptData + DWordOffset)) { + if (magicDWord == *(const uint32 *)(scriptData + DWordOffset)) { // magic DWORD found, check if actual signature matches uint32 offset = DWordOffset + signature->magicOffset; uint32 byteOffset = offset; @@ -200,7 +200,7 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, con if (g_sci->getGameId() == GID_HOYLE4) { const SciScriptSignature *signatureTable = hoyle4Signatures; while (signatureTable->data) { - uint32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); + int32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); if (foundOffset != -1) { // found, so apply the patch warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); -- cgit v1.2.3 From 8ca076fb3adbe5d0b8d781ed2a8ac78b22090a38 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 15:30:23 +0000 Subject: SCI: fixing another warning svn-id: r51789 --- engines/sci/engine/segment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index cb908979a3..b16dd5a5e5 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -414,7 +414,7 @@ int Object::locateVarSelector(SegManager *segMan, Selector slc) const { } else { const Object *obj = getClass(segMan); varnum = obj->getVariable(1).toUint16(); - buf = (byte *)obj->_baseVars; + buf = (const byte *)obj->_baseVars; } for (uint i = 0; i < varnum; i++) -- cgit v1.2.3 From 7c70e488ea74008300e54258c8fe81dded274913 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 16:43:59 +0000 Subject: SCI: Fixed script bug #3040624 - "QFG3: Crash after any combat in jungle" svn-id: r51790 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index a2720f2933..867c538008 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -143,6 +143,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before the second brother is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) + { GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #3040624 { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu { GID_QFG4, -1, 64917, -1, "Plane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, happen sometimes in fights -- cgit v1.2.3 From 91753047be66bdedb3f6e626f3c1f7f123364dc4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 17:00:23 +0000 Subject: SCI: Fixed script bug #3040565, "QFG3: Crash when looking at stats" svn-id: r51791 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 867c538008..fbf4c58b20 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -144,6 +144,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #3040624 + { GID_QFG3, 470, 470, -1, "rm470", "notify", -1, 0, { WORKAROUND_FAKE, 0 } }, // closing the character screen in the Simbani village in the room with the bridge, bug #3040565 { GID_QFG4, -1, 15, -1, "charInitScreen", "dispatchEvent", -1, 5, { WORKAROUND_FAKE, 0 } }, // floppy version, when viewing the character screen { GID_QFG4, -1, 64917, -1, "controlPlane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, when entering the game menu { GID_QFG4, -1, 64917, -1, "Plane", "setBitmap", -1, 3, { WORKAROUND_FAKE, 0 } }, // floppy version, happen sometimes in fights -- cgit v1.2.3 From 993c8b70f29a90ecfc9b663836302af7f50afd2b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 17:29:17 +0000 Subject: SCI: Fixed script bug #3040469, "QFG2: Second crash in thief's job" svn-id: r51792 --- engines/sci/engine/workarounds.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index fbf4c58b20..5a6dc08d3a 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -140,7 +140,8 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory { GID_QFG2, -1, 701, -1, "Alley", "at", -1, 0, { WORKAROUND_FAKE, 0 } }, // when walking inside the alleys in the town - bug #3035835 & #3038367 { GID_QFG2, -1, 990, 0, "Restore", "doit", -1, 364, { WORKAROUND_FAKE, 0 } }, // when pressing enter in restore dialog w/o any saved games present - { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before the second brother is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 + { GID_QFG2, 260, 260, 0, "abdulS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Abdul is about to enter the house (where you have to hide in the wardrobe), bug #3039891, temps 1 and 2 + { GID_QFG2, 260, 260, 0, "jabbarS", "changeState",0x2d22, -1, { WORKAROUND_FAKE, 0 } }, // During the thief's first mission (in the house), just before Jabbar is about to enter the house (where you have to hide in the wardrobe), bug #3040469, temps 1 and 2 { GID_QFG3, 140, 140, 0, "rm140", "init", 0x1008, 0, { WORKAROUND_FAKE, 0 } }, // when importing a character and selecting the previous profession - bug #3040460 { GID_QFG3, 330, 330, -1, "Teller", "doChild", -1, -1, { WORKAROUND_FAKE, 0 } }, // when talking to King Rajah about "Rajah" (bug #3036390, temp 1) or "Tarna" (temp 0), or when clicking on yourself and saying "Greet" (bug #3039774, temp 1) { GID_QFG3, 700, 700, -1, "monsterIsDead", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // in the jungle, after winning any fight, bug #3040624 -- cgit v1.2.3 From 753c431937ce3cb080b24c6a79f5e90548bfe431 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 18:54:58 +0000 Subject: SCI: adding script patching including a patch for hoyle 4 and commenting out the workaround code inside kDisposeWindow svn-id: r51795 --- engines/sci/engine/script.cpp | 62 ++++++++++++++++++++++++++++++++++++++---- engines/sci/engine/script.h | 5 ++-- engines/sci/graphics/ports.cpp | 8 +++--- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 17ea7cf782..7c5442cc06 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -119,6 +119,13 @@ void Script::init(int script_nr, ResourceManager *resMan) { // - then another counter of bytes (0 for EOS) // - if not EOS, an adjust offset and the actual bytes // - rinse and repeat + + +// this here gets called on entry and when going out of game windows +// uEvt::port will not get changed after kDisposeWindow but a bit later, so +// we would get an invalid port handle to a kSetPort call. We just patch in +// resetting of the port selector. We destroy the stop/fade code in there, +// it seems it isn't used at all in the game. const byte hoyle4SignaturePortFix[] = { 28, 0x39, 0x09, // pushi 09 @@ -132,14 +139,22 @@ const byte hoyle4SignaturePortFix[] = { 0x38, 0xbc, 0x02, // pushi 02bc 0x38, 0x20, 0x03, // pushi 0320 0x46, // calle [xxxx] [xxxx] [xx] - 13, +5, // [skip 5 bytes] + 43, +5, // [skip 5 bytes] 0x30, 0x27, 0x00, // bnt 0027 -> end of routine 0x87, 0x00, // lap 00 0x30, 0x19, 0x00, // bnt 0019 -> fade out 0x87, 0x01, // lap 01 0x30, 0x14, 0x00, // bnt 0014 -> fade out - // [...] - 10, +20, // [skip 20 bytes] + 0x38, 0xa7, 0x00, // pushi 00a7 + 0x76, // push0 + 0x80, 0x29, 0x01, // lag 0129 + 0x4a, 0x04, // send 04 (song::stop) + 0x39, 0x27, // pushi 27 + 0x78, // push1 + 0x8f, 0x01, // lsp 01 + 0x51, 0x54, // class 54 + 0x4a, 0x06, // send 06 (PlaySong::play) + 0x33, 0x09, // jmp 09 -> end of routine 0x38, 0xaa, 0x00, // pushi 00aa 0x76, // push0 0x80, 0x29, 0x01, // lag 0129 @@ -148,8 +163,23 @@ const byte hoyle4SignaturePortFix[] = { 0 }; -const int16 hoyle4PatchPortFix[] = { - 0 +#define PATCH_END 0xFFFF +#define PATCH_ADDTOOFFSET 0x8000 +#define PATCH_GETORIGINALBYTE 0x4000 + +const uint16 hoyle4PatchPortFix[] = { + PATCH_ADDTOOFFSET | +33, + 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent) + 0x76, // push0 + 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User") + 0x4a, 0x04, // send 04 (read User::curEvent) + + 0x38, 0x93, 0x00, // pushi 0093 (selector port) + 0x78, // push1 + 0x78, // push1 + 0x4a, 0x06, // send 06 (write 0 to that object::port) + 0x48, // ret + PATCH_END }; // script, description, magic DWORD, adjust @@ -158,6 +188,25 @@ const SciScriptSignature hoyle4Signatures[] = { { 0, NULL, 0, 0, NULL, NULL } }; +// will actually patch previously found signature area +void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { + int32 offset = signatureOffset; + uint16 patchWord = *patch; + + while (patchWord != PATCH_END) { + if (patchWord & PATCH_ADDTOOFFSET) { + offset += patchWord & ~PATCH_ADDTOOFFSET; + } else if (patchWord & PATCH_GETORIGINALBYTE) { + // TODO: implement this + } else { + scriptData[offset] = patchWord & 0xFF; + offset++; + } + patch++; + patchWord = *patch; + } +} + // will return -1 if no match was found, otherwise an offset to the start of the signature match int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) { if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay @@ -196,7 +245,7 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr return -1; } -void Script::matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, const uint32 scriptSize) { +void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) { if (g_sci->getGameId() == GID_HOYLE4) { const SciScriptSignature *signatureTable = hoyle4Signatures; while (signatureTable->data) { @@ -204,6 +253,7 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, con if (foundOffset != -1) { // found, so apply the patch warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); + applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); } signatureTable++; } diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 8334cc838c..4e38c68954 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -37,7 +37,7 @@ struct SciScriptSignature { uint32 magicDWord; int magicOffset; const byte *data; - const int16 *patch; + const uint16 *patch; }; struct EngineState; @@ -109,8 +109,9 @@ public: void init(int script_nr, ResourceManager *resMan); void load(ResourceManager *resMan); - void matchSignatureAndPatch(uint16 scriptNr, const byte *scriptData, const uint32 scriptSize); + void matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize); int32 findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize); + void applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset); virtual bool isValidOffset(uint16 offset) const; virtual SegmentRef dereference(reg_t pointer); diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 2e9128cda6..76a60cbbab 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -250,10 +250,10 @@ void GfxPorts::kernelDisposeWindow(uint16 windowId, bool reanimate) { // and iconReplay // or inside GameControls::hide (script 978) which is called to // actually remove the window - reg_t eventObject = _segMan->findObjectByName("uEvt"); - if (!eventObject.isNull()) { - writeSelectorValue(_segMan, eventObject, SELECTOR(port), 0); - } + //reg_t eventObject = _segMan->findObjectByName("uEvt"); + //if (!eventObject.isNull()) { + // writeSelectorValue(_segMan, eventObject, SELECTOR(port), 0); + //} } } -- cgit v1.2.3 From 7b0a5ec099df23c5b6662a09aeb54b9666c07ee1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 19:13:19 +0000 Subject: SCI: adjusting patch to write 0 instead of 1 patch still worked, but 0 was meant to be there thx to lskovlun to point this out svn-id: r51796 --- engines/sci/engine/script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 7c5442cc06..0e4104170f 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -176,7 +176,7 @@ const uint16 hoyle4PatchPortFix[] = { 0x38, 0x93, 0x00, // pushi 0093 (selector port) 0x78, // push1 - 0x78, // push1 + 0x76, // push0 0x4a, 0x06, // send 06 (write 0 to that object::port) 0x48, // ret PATCH_END -- cgit v1.2.3 From 346bc3f7e0bbad741f529d7a5bafeedffc9d67b1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 20:29:27 +0000 Subject: SCI: Added a workaround for kAbs to properly support patched scripts by NRS in QFG1VGA. Properly fixes bug #3037218 - "QFG1 VGA: kAbs signature mismatch" (thanks to wjp for his help on this) svn-id: r51799 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5a6dc08d3a..4529b75a0f 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -166,6 +166,7 @@ const SciWorkaroundEntry kAbs_workarounds[] = { { GID_HOYLE1, 1, 1, 0, "room1", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // crazy eights - called with objects instead of integers { GID_HOYLE1, 2, 2, 0, "room2", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // old maid - called with objects instead of integers { GID_HOYLE1, 3, 3, 0, "room3", "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // hearts - called with objects instead of integers + { GID_QFG1VGA, -1, -1, 0, NULL, "doit", -1, 0, { WORKAROUND_FAKE, 0x3e9 } }, // when the game is patched with the NRS patch SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From d0ff92e2a0c96dbea82989cf94aacc28430dcfa4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 21:18:43 +0000 Subject: SCI: Fixed an off-by one error in the kDoBresen sanity check svn-id: r51804 --- engines/sci/engine/kmovement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index dfd1aa699e..9bc93cbeb0 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -317,7 +317,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { // Sanity check: make sure that destx, desty are inside the screen coordinates. // They can go off screen in some cases, e.g. in SQ5 while scrubbing the floor (bug #3037351) - if (destx < g_sci->_gfxScreen->getWidth() && desty < g_sci->_gfxScreen->getHeight()) { + if (destx <= g_sci->_gfxScreen->getWidth() && desty <= g_sci->_gfxScreen->getHeight()) { x = destx; y = desty; } else { -- cgit v1.2.3 From 96fd9e6c8273715c48556bdc6e150908f0fa04c7 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 21:21:39 +0000 Subject: SCI: Added support for scripts that have more than one export table. Fixes bug #3039785 - "Conquests of Camelot: Crash in Glastonbury Tor" svn-id: r51805 --- engines/sci/engine/script.cpp | 18 ++++++++++++++++-- engines/sci/engine/script.h | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 0e4104170f..8ccedc0c00 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -476,12 +476,25 @@ uint16 Script::validateExportFunc(int pubfunct) { uint16 offset = READ_SCI11ENDIAN_UINT16(_exportTable + pubfunct); VERIFY(offset < _bufSize, "invalid export function pointer"); + if (offset == 0) { + // Check if the game has a second export table (e.g. script 912 in Camelot) + // Fixes bug #3039785 + const uint16 *secondExportTable = (const uint16 *)findBlock(SCI_OBJ_EXPORTS, 0); + + if (secondExportTable) { + secondExportTable += 3; // skip header plus 2 bytes (secondExportTable is a uint16 pointer) + offset = READ_SCI11ENDIAN_UINT16(secondExportTable + pubfunct); + VERIFY(offset < _bufSize, "invalid export function pointer"); + } + } + return offset; } -byte *Script::findBlock(int type) { +byte *Script::findBlock(int type, int skipBlockIndex) { byte *buf = _buf; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); + int blockIndex = 0; if (oldScriptHeader) buf += 2; @@ -491,12 +504,13 @@ byte *Script::findBlock(int type) { if (seekerType == 0) break; - if (seekerType == type) + if (seekerType == type && blockIndex != skipBlockIndex) return buf; int seekerSize = READ_LE_UINT16(buf + 2); assert(seekerSize > 0); buf += seekerSize; + blockIndex++; } while (1); return NULL; diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 4e38c68954..35daf20191 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -255,7 +255,7 @@ public: /** * Finds the pointer where a block of a specific type starts from */ - byte *findBlock(int type); + byte *findBlock(int type, int skipBlockIndex = -1); private: /** -- cgit v1.2.3 From 8ddcf3942bbc03225ff6a3ce8c577bbfc791f1c1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 21:51:45 +0000 Subject: SCI: adding patch for lsl6 issue fixes crashing when dieing at least in german lsl6, caused by temp memory space corruption. Also happened in sierra sci. svn-id: r51807 --- engines/sci/engine/script.cpp | 88 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 8ccedc0c00..34504a8041 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -139,7 +139,7 @@ const byte hoyle4SignaturePortFix[] = { 0x38, 0xbc, 0x02, // pushi 02bc 0x38, 0x20, 0x03, // pushi 0320 0x46, // calle [xxxx] [xxxx] [xx] - 43, +5, // [skip 5 bytes] + +5, 43, // [skip 5 bytes] 0x30, 0x27, 0x00, // bnt 0027 -> end of routine 0x87, 0x00, // lap 00 0x30, 0x19, 0x00, // bnt 0019 -> fade out @@ -188,6 +188,57 @@ const SciScriptSignature hoyle4Signatures[] = { { 0, NULL, 0, 0, NULL, NULL } }; + +// this is called on every death dialog. Problem is at least the german +// version of lsl6 gets title text that is far too long for the +// available temp space resulting in temp space corruption +// This patch moves the title text around, so this overflow +// doesn't happen anymore. We would otherwise get a crash +// calling for invalid views (this happens of course also +// in sierra sci) +const byte larry6SignatureDeathDialog[] = { + 7, + 0x3e, 0x33, 0x01, // link 0133 (offset 0x20) + 0x35, 0xff, // ldi ff + 0xa3, 0x00, // sal 00 + +255, 0, + +255, 0, + +170, 12, // [skip 680 bytes] + 0x8f, 0x01, // lsp 01 (offset 0x2cf) + 0x7a, // push2 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, // push + 0x43, 0x7c, 0x0e, // kMessage[7c] 0e + +90, 10, // [skip 90 bytes] + 0x38, 0xd6, 0x00, // pushi 00d6 (offset 0x335) + 0x78, // push1 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, // push + +76, 11, // [skip 76 bytes] + 0x38, 0xcd, 0x00, // pushi 00cd (offset 0x38b) + 0x39, 0x03, // pushi 03 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, + 0 +}; + +const uint16 larry6PatchDeathDialog[] = { + 0x3e, 0x00, 0x02, // link 0200 + PATCH_ADDTOOFFSET | +687, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET | +98, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET | +82, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_END +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature larry6Signatures[] = { + { 82, "death dialog memory corruption", CONSTANT_LE_32(0x3501333e), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, + { 0, NULL, 0, 0, NULL, NULL } +}; + // will actually patch previously found signature area void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { int32 offset = signatureOffset; @@ -222,8 +273,9 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr uint32 offset = DWordOffset + signature->magicOffset; uint32 byteOffset = offset; const byte *signatureData = signature->data; - byte matchBytesCount = *signatureData++; - while (matchBytesCount) { + byte matchAdjust = 1; + while (matchAdjust) { + byte matchBytesCount = *signatureData++; if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds? break; if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch? @@ -231,12 +283,11 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr // those bytes matched, adjust offsets accordingly signatureData += matchBytesCount; byteOffset += matchBytesCount; - // get next byte count and offset - matchBytesCount = *signatureData++; - if (matchBytesCount) - byteOffset += *signatureData++; + // get offset... + matchAdjust = *signatureData++; + byteOffset += matchAdjust; } - if (!matchBytesCount) // all matches worked? + if (!matchAdjust) // all matches worked? return offset; } DWordOffset++; @@ -246,14 +297,21 @@ int32 Script::findSignature(const SciScriptSignature *signature, const byte *scr } void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) { - if (g_sci->getGameId() == GID_HOYLE4) { - const SciScriptSignature *signatureTable = hoyle4Signatures; + const SciScriptSignature *signatureTable = NULL; + if (g_sci->getGameId() == GID_HOYLE4) + signatureTable = hoyle4Signatures; + if (g_sci->getGameId() == GID_LSL6) + signatureTable = larry6Signatures; + + if (signatureTable) { while (signatureTable->data) { - int32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); - if (foundOffset != -1) { - // found, so apply the patch - warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); - applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); + if (scriptNr == signatureTable->scriptNr) { + int32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); + if (foundOffset != -1) { + // found, so apply the patch + warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); + applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); + } } signatureTable++; } -- cgit v1.2.3 From 92dfff36bf6c6e1c7e2a1c215ef9c5dc8a4709e8 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 21:52:16 +0000 Subject: SCI: Fixed script bug #3040844 - "QFG3: Crash near the end" svn-id: r51808 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 4529b75a0f..5406e4fedc 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -335,6 +335,7 @@ const SciWorkaroundEntry kSetCursor_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters + { GID_QFG3, 830, 830, 0, "portalOpens", "changeState", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when the portal appears during the end, bug #3040844 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From dfe4c8d9a079c01d4a6cfdf5290da2a0af941c8a Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 6 Aug 2010 22:14:38 +0000 Subject: SCI: fixing typo svn-id: r51809 --- engines/sci/engine/script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 34504a8041..07e0982076 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -184,7 +184,7 @@ const uint16 hoyle4PatchPortFix[] = { // script, description, magic DWORD, adjust const SciScriptSignature hoyle4Signatures[] = { - { 0, "port fix when disponsing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, + { 0, "port fix when disposing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, { 0, NULL, 0, 0, NULL, NULL } }; -- cgit v1.2.3 From 57fd5883277b258eba73bfec98a27503223569ff Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 22:36:46 +0000 Subject: SCI: Split the new script patch code in a separate file svn-id: r51810 --- engines/sci/engine/script.cpp | 205 ---------------------------- engines/sci/engine/script.h | 10 +- engines/sci/engine/script_patches.cpp | 247 ++++++++++++++++++++++++++++++++++ engines/sci/module.mk | 1 + 4 files changed, 249 insertions(+), 214 deletions(-) create mode 100644 engines/sci/engine/script_patches.cpp diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index 07e0982076..3ba550adf9 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -113,211 +113,6 @@ void Script::init(int script_nr, ResourceManager *resMan) { } } -// signatures are built like this: -// - first a counter of the bytes that follow -// - then the actual bytes that need to get matched -// - then another counter of bytes (0 for EOS) -// - if not EOS, an adjust offset and the actual bytes -// - rinse and repeat - - -// this here gets called on entry and when going out of game windows -// uEvt::port will not get changed after kDisposeWindow but a bit later, so -// we would get an invalid port handle to a kSetPort call. We just patch in -// resetting of the port selector. We destroy the stop/fade code in there, -// it seems it isn't used at all in the game. -const byte hoyle4SignaturePortFix[] = { - 28, - 0x39, 0x09, // pushi 09 - 0x89, 0x0b, // lsg 0b - 0x39, 0x64, // pushi 64 - 0x38, 0xc8, 0x00, // pushi 00c8 - 0x38, 0x2c, 0x01, // pushi 012c - 0x38, 0x90, 0x01, // pushi 0190 - 0x38, 0xf4, 0x01, // pushi 01f4 - 0x38, 0x58, 0x02, // pushi 0258 - 0x38, 0xbc, 0x02, // pushi 02bc - 0x38, 0x20, 0x03, // pushi 0320 - 0x46, // calle [xxxx] [xxxx] [xx] - +5, 43, // [skip 5 bytes] - 0x30, 0x27, 0x00, // bnt 0027 -> end of routine - 0x87, 0x00, // lap 00 - 0x30, 0x19, 0x00, // bnt 0019 -> fade out - 0x87, 0x01, // lap 01 - 0x30, 0x14, 0x00, // bnt 0014 -> fade out - 0x38, 0xa7, 0x00, // pushi 00a7 - 0x76, // push0 - 0x80, 0x29, 0x01, // lag 0129 - 0x4a, 0x04, // send 04 (song::stop) - 0x39, 0x27, // pushi 27 - 0x78, // push1 - 0x8f, 0x01, // lsp 01 - 0x51, 0x54, // class 54 - 0x4a, 0x06, // send 06 (PlaySong::play) - 0x33, 0x09, // jmp 09 -> end of routine - 0x38, 0xaa, 0x00, // pushi 00aa - 0x76, // push0 - 0x80, 0x29, 0x01, // lag 0129 - 0x4a, 0x04, // send 04 - 0x48, // ret - 0 -}; - -#define PATCH_END 0xFFFF -#define PATCH_ADDTOOFFSET 0x8000 -#define PATCH_GETORIGINALBYTE 0x4000 - -const uint16 hoyle4PatchPortFix[] = { - PATCH_ADDTOOFFSET | +33, - 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent) - 0x76, // push0 - 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User") - 0x4a, 0x04, // send 04 (read User::curEvent) - - 0x38, 0x93, 0x00, // pushi 0093 (selector port) - 0x78, // push1 - 0x76, // push0 - 0x4a, 0x06, // send 06 (write 0 to that object::port) - 0x48, // ret - PATCH_END -}; - -// script, description, magic DWORD, adjust -const SciScriptSignature hoyle4Signatures[] = { - { 0, "port fix when disposing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, - { 0, NULL, 0, 0, NULL, NULL } -}; - - -// this is called on every death dialog. Problem is at least the german -// version of lsl6 gets title text that is far too long for the -// available temp space resulting in temp space corruption -// This patch moves the title text around, so this overflow -// doesn't happen anymore. We would otherwise get a crash -// calling for invalid views (this happens of course also -// in sierra sci) -const byte larry6SignatureDeathDialog[] = { - 7, - 0x3e, 0x33, 0x01, // link 0133 (offset 0x20) - 0x35, 0xff, // ldi ff - 0xa3, 0x00, // sal 00 - +255, 0, - +255, 0, - +170, 12, // [skip 680 bytes] - 0x8f, 0x01, // lsp 01 (offset 0x2cf) - 0x7a, // push2 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e - 0x36, // push - 0x43, 0x7c, 0x0e, // kMessage[7c] 0e - +90, 10, // [skip 90 bytes] - 0x38, 0xd6, 0x00, // pushi 00d6 (offset 0x335) - 0x78, // push1 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e - 0x36, // push - +76, 11, // [skip 76 bytes] - 0x38, 0xcd, 0x00, // pushi 00cd (offset 0x38b) - 0x39, 0x03, // pushi 03 - 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e - 0x36, - 0 -}; - -const uint16 larry6PatchDeathDialog[] = { - 0x3e, 0x00, 0x02, // link 0200 - PATCH_ADDTOOFFSET | +687, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 - PATCH_ADDTOOFFSET | +98, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 - PATCH_ADDTOOFFSET | +82, - 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 - PATCH_END -}; - -// script, description, magic DWORD, adjust -const SciScriptSignature larry6Signatures[] = { - { 82, "death dialog memory corruption", CONSTANT_LE_32(0x3501333e), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, - { 0, NULL, 0, 0, NULL, NULL } -}; - -// will actually patch previously found signature area -void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { - int32 offset = signatureOffset; - uint16 patchWord = *patch; - - while (patchWord != PATCH_END) { - if (patchWord & PATCH_ADDTOOFFSET) { - offset += patchWord & ~PATCH_ADDTOOFFSET; - } else if (patchWord & PATCH_GETORIGINALBYTE) { - // TODO: implement this - } else { - scriptData[offset] = patchWord & 0xFF; - offset++; - } - patch++; - patchWord = *patch; - } -} - -// will return -1 if no match was found, otherwise an offset to the start of the signature match -int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) { - if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay - return -1; - - const uint32 magicDWord = signature->magicDWord; // is platform-specific BE/LE form, so that the later match will work - const uint32 searchLimit = scriptSize - 3; - uint32 DWordOffset = 0; - // first search for the magic DWORD - while (DWordOffset < searchLimit) { - if (magicDWord == *(const uint32 *)(scriptData + DWordOffset)) { - // magic DWORD found, check if actual signature matches - uint32 offset = DWordOffset + signature->magicOffset; - uint32 byteOffset = offset; - const byte *signatureData = signature->data; - byte matchAdjust = 1; - while (matchAdjust) { - byte matchBytesCount = *signatureData++; - if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds? - break; - if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch? - break; - // those bytes matched, adjust offsets accordingly - signatureData += matchBytesCount; - byteOffset += matchBytesCount; - // get offset... - matchAdjust = *signatureData++; - byteOffset += matchAdjust; - } - if (!matchAdjust) // all matches worked? - return offset; - } - DWordOffset++; - } - // nothing found - return -1; -} - -void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) { - const SciScriptSignature *signatureTable = NULL; - if (g_sci->getGameId() == GID_HOYLE4) - signatureTable = hoyle4Signatures; - if (g_sci->getGameId() == GID_LSL6) - signatureTable = larry6Signatures; - - if (signatureTable) { - while (signatureTable->data) { - if (scriptNr == signatureTable->scriptNr) { - int32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); - if (foundOffset != -1) { - // found, so apply the patch - warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); - applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); - } - } - signatureTable++; - } - } -} - void Script::load(ResourceManager *resMan) { Resource *script = resMan->findResource(ResourceId(kResourceTypeScript, _nr), 0); assert(script != 0); diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 35daf20191..c60cc4b19f 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -31,17 +31,9 @@ namespace Sci { -struct SciScriptSignature { - uint16 scriptNr; - const char *description; - uint32 magicDWord; - int magicOffset; - const byte *data; - const uint16 *patch; -}; - struct EngineState; class ResourceManager; +struct SciScriptSignature; enum ScriptObjectTypes { SCI_OBJ_TERMINATOR, diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp new file mode 100644 index 0000000000..228bf39e7d --- /dev/null +++ b/engines/sci/engine/script_patches.cpp @@ -0,0 +1,247 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "sci/sci.h" +#include "sci/engine/script.h" + +#include "common/util.h" + +namespace Sci { + +struct SciScriptSignature { + uint16 scriptNr; + const char *description; + uint32 magicDWord; + int magicOffset; + const byte *data; + const uint16 *patch; +}; + +// signatures are built like this: +// - first a counter of the bytes that follow +// - then the actual bytes that need to get matched +// - then another counter of bytes (0 for EOS) +// - if not EOS, an adjust offset and the actual bytes +// - rinse and repeat + + +// this here gets called on entry and when going out of game windows +// uEvt::port will not get changed after kDisposeWindow but a bit later, so +// we would get an invalid port handle to a kSetPort call. We just patch in +// resetting of the port selector. We destroy the stop/fade code in there, +// it seems it isn't used at all in the game. +const byte hoyle4SignaturePortFix[] = { + 28, + 0x39, 0x09, // pushi 09 + 0x89, 0x0b, // lsg 0b + 0x39, 0x64, // pushi 64 + 0x38, 0xc8, 0x00, // pushi 00c8 + 0x38, 0x2c, 0x01, // pushi 012c + 0x38, 0x90, 0x01, // pushi 0190 + 0x38, 0xf4, 0x01, // pushi 01f4 + 0x38, 0x58, 0x02, // pushi 0258 + 0x38, 0xbc, 0x02, // pushi 02bc + 0x38, 0x20, 0x03, // pushi 0320 + 0x46, // calle [xxxx] [xxxx] [xx] + +5, 43, // [skip 5 bytes] + 0x30, 0x27, 0x00, // bnt 0027 -> end of routine + 0x87, 0x00, // lap 00 + 0x30, 0x19, 0x00, // bnt 0019 -> fade out + 0x87, 0x01, // lap 01 + 0x30, 0x14, 0x00, // bnt 0014 -> fade out + 0x38, 0xa7, 0x00, // pushi 00a7 + 0x76, // push0 + 0x80, 0x29, 0x01, // lag 0129 + 0x4a, 0x04, // send 04 (song::stop) + 0x39, 0x27, // pushi 27 + 0x78, // push1 + 0x8f, 0x01, // lsp 01 + 0x51, 0x54, // class 54 + 0x4a, 0x06, // send 06 (PlaySong::play) + 0x33, 0x09, // jmp 09 -> end of routine + 0x38, 0xaa, 0x00, // pushi 00aa + 0x76, // push0 + 0x80, 0x29, 0x01, // lag 0129 + 0x4a, 0x04, // send 04 + 0x48, // ret + 0 +}; + +#define PATCH_END 0xFFFF +#define PATCH_ADDTOOFFSET 0x8000 +#define PATCH_GETORIGINALBYTE 0x4000 + +const uint16 hoyle4PatchPortFix[] = { + PATCH_ADDTOOFFSET | +33, + 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent) + 0x76, // push0 + 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User") + 0x4a, 0x04, // send 04 (read User::curEvent) + + 0x38, 0x93, 0x00, // pushi 0093 (selector port) + 0x78, // push1 + 0x76, // push0 + 0x4a, 0x06, // send 06 (write 0 to that object::port) + 0x48, // ret + PATCH_END +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature hoyle4Signatures[] = { + { 0, "port fix when disposing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, + { 0, NULL, 0, 0, NULL, NULL } +}; + + +// this is called on every death dialog. Problem is at least the german +// version of lsl6 gets title text that is far too long for the +// available temp space resulting in temp space corruption +// This patch moves the title text around, so this overflow +// doesn't happen anymore. We would otherwise get a crash +// calling for invalid views (this happens of course also +// in sierra sci) +const byte larry6SignatureDeathDialog[] = { + 7, + 0x3e, 0x33, 0x01, // link 0133 (offset 0x20) + 0x35, 0xff, // ldi ff + 0xa3, 0x00, // sal 00 + +255, 0, + +255, 0, + +170, 12, // [skip 680 bytes] + 0x8f, 0x01, // lsp 01 (offset 0x2cf) + 0x7a, // push2 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, // push + 0x43, 0x7c, 0x0e, // kMessage[7c] 0e + +90, 10, // [skip 90 bytes] + 0x38, 0xd6, 0x00, // pushi 00d6 (offset 0x335) + 0x78, // push1 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, // push + +76, 11, // [skip 76 bytes] + 0x38, 0xcd, 0x00, // pushi 00cd (offset 0x38b) + 0x39, 0x03, // pushi 03 + 0x5a, 0x04, 0x00, 0x0e, 0x01, // lea 0004 010e + 0x36, + 0 +}; + +const uint16 larry6PatchDeathDialog[] = { + 0x3e, 0x00, 0x02, // link 0200 + PATCH_ADDTOOFFSET | +687, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET | +98, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_ADDTOOFFSET | +82, + 0x5a, 0x04, 0x00, 0x40, 0x01, // lea 0004 0140 + PATCH_END +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature larry6Signatures[] = { + { 82, "death dialog memory corruption", CONSTANT_LE_32(0x3501333e), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, + { 0, NULL, 0, 0, NULL, NULL } +}; + +// will actually patch previously found signature area +void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { + int32 offset = signatureOffset; + uint16 patchWord = *patch; + + while (patchWord != PATCH_END) { + if (patchWord & PATCH_ADDTOOFFSET) { + offset += patchWord & ~PATCH_ADDTOOFFSET; + } else if (patchWord & PATCH_GETORIGINALBYTE) { + // TODO: implement this + } else { + scriptData[offset] = patchWord & 0xFF; + offset++; + } + patch++; + patchWord = *patch; + } +} + +// will return -1 if no match was found, otherwise an offset to the start of the signature match +int32 Script::findSignature(const SciScriptSignature *signature, const byte *scriptData, const uint32 scriptSize) { + if (scriptSize < 4) // we need to find a DWORD, so less than 4 bytes is not okay + return -1; + + const uint32 magicDWord = signature->magicDWord; // is platform-specific BE/LE form, so that the later match will work + const uint32 searchLimit = scriptSize - 3; + uint32 DWordOffset = 0; + // first search for the magic DWORD + while (DWordOffset < searchLimit) { + if (magicDWord == *(const uint32 *)(scriptData + DWordOffset)) { + // magic DWORD found, check if actual signature matches + uint32 offset = DWordOffset + signature->magicOffset; + uint32 byteOffset = offset; + const byte *signatureData = signature->data; + byte matchAdjust = 1; + while (matchAdjust) { + byte matchBytesCount = *signatureData++; + if ((byteOffset + matchBytesCount) > scriptSize) // Out-Of-Bounds? + break; + if (memcmp(signatureData, &scriptData[byteOffset], matchBytesCount)) // Byte-Mismatch? + break; + // those bytes matched, adjust offsets accordingly + signatureData += matchBytesCount; + byteOffset += matchBytesCount; + // get offset... + matchAdjust = *signatureData++; + byteOffset += matchAdjust; + } + if (!matchAdjust) // all matches worked? + return offset; + } + DWordOffset++; + } + // nothing found + return -1; +} + +void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) { + const SciScriptSignature *signatureTable = NULL; + if (g_sci->getGameId() == GID_HOYLE4) + signatureTable = hoyle4Signatures; + if (g_sci->getGameId() == GID_LSL6) + signatureTable = larry6Signatures; + + if (signatureTable) { + while (signatureTable->data) { + if (scriptNr == signatureTable->scriptNr) { + int32 foundOffset = findSignature(signatureTable, scriptData, scriptSize); + if (foundOffset != -1) { + // found, so apply the patch + warning("matched %s on script %d offset %d", signatureTable->description, scriptNr, foundOffset); + applyPatch(signatureTable->patch, scriptData, scriptSize, foundOffset); + } + } + signatureTable++; + } + } +} + +} // End of namespace Sci diff --git a/engines/sci/module.mk b/engines/sci/module.mk index dae2807cc2..7107b722f9 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -30,6 +30,7 @@ MODULE_OBJS := \ engine/savegame.o \ engine/script.o \ engine/scriptdebug.o \ + engine/script_patches.o \ engine/selector.o \ engine/seg_manager.o \ engine/segment.o \ -- cgit v1.2.3 From ab0d57d73d434c3523e5b44ed5f4ce95b895c8a0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 22:51:25 +0000 Subject: SCI: Some cleanup of the script patch code. Added a PATCH_MAGICDWORD define to make the patch tables easier to understand svn-id: r51811 --- engines/sci/engine/script_patches.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 228bf39e7d..51bdf14e46 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -30,6 +30,11 @@ namespace Sci { +#define PATCH_END 0xFFFF +#define PATCH_ADDTOOFFSET 0x8000 +#define PATCH_GETORIGINALBYTE 0x4000 +#define PATCH_MAGICDWORD(a, b, c, d) CONSTANT_LE_32(a | (b << 8) | (c << 16) | (d << 24)) + struct SciScriptSignature { uint16 scriptNr; const char *description; @@ -89,10 +94,6 @@ const byte hoyle4SignaturePortFix[] = { 0 }; -#define PATCH_END 0xFFFF -#define PATCH_ADDTOOFFSET 0x8000 -#define PATCH_GETORIGINALBYTE 0x4000 - const uint16 hoyle4PatchPortFix[] = { PATCH_ADDTOOFFSET | +33, 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent) @@ -108,10 +109,10 @@ const uint16 hoyle4PatchPortFix[] = { PATCH_END }; -// script, description, magic DWORD, adjust +// script, description, magic DWORD, adjust const SciScriptSignature hoyle4Signatures[] = { - { 0, "port fix when disposing windows", CONSTANT_LE_32(0x00C83864), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, - { 0, NULL, 0, 0, NULL, NULL } + { 0, "port fix when disposing windows", PATCH_MAGICDWORD(0x64, 0x38, 0xC8, 0x00), -5, hoyle4SignaturePortFix, hoyle4PatchPortFix }, + { 0, NULL, 0, 0, NULL, NULL } }; @@ -159,10 +160,10 @@ const uint16 larry6PatchDeathDialog[] = { PATCH_END }; -// script, description, magic DWORD, adjust +// script, description, magic DWORD, adjust const SciScriptSignature larry6Signatures[] = { - { 82, "death dialog memory corruption", CONSTANT_LE_32(0x3501333e), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, - { 0, NULL, 0, 0, NULL, NULL } + { 82, "death dialog memory corruption", PATCH_MAGICDWORD(0x3e, 0x33, 0x01, 0x35), 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, + { 0, NULL, 0, 0, NULL, NULL } }; // will actually patch previously found signature area -- cgit v1.2.3 From cb0aa8679828709b4a7fb8756f1d9d6685cc6b54 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 6 Aug 2010 23:56:19 +0000 Subject: SCI: Fixed 2 SQ1 script bugs (#3040894 and #3040905) svn-id: r51815 --- engines/sci/engine/workarounds.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 5406e4fedc..946182b0c3 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -246,6 +246,8 @@ const SciWorkaroundEntry kFindKey_workarounds[] = { const SciWorkaroundEntry kGraphDrawLine_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "dudeViewer", "show", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when looking at the gene explanation chart, gets called with 1 extra parameter { GID_SQ1, 43, 43, 0, "someoneDied", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when ordering beer, gets called with 1 extra parameter + { GID_SQ1, 71, 71, 0, "destroyXenon", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // during the Xenon destruction cutscene (which results in death), gets called with 1 extra parameter - bug #3040894 + { GID_SQ1, 53, 53, 0, "blastEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Roger is found and zapped by the cleaning robot, gets called with 1 extra parameter - bug #3040905 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 7935ebf4a32fe340de2220c2c90f76f06c9c7472 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 00:22:57 +0000 Subject: SCI: Converted an error back into a warning when loading games svn-id: r51816 --- engines/sci/engine/savegame.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index a7716516e7..dfc41cc56a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -659,8 +659,10 @@ void SegManager::reconstructClones() { CloneTable::Entry &seeker = ct->_table[j]; const Object *baseObj = getObject(seeker.getSpeciesSelector()); seeker.cloneFromObject(baseObj); - if (!baseObj) - error("Clone entry without a base class: %d", j); + if (!baseObj) { + // Can happen when loading some KQ6 savegames + warning("Clone entry without a base class: %d", j); + } } // end for } // end if } // end for -- cgit v1.2.3 From 53474618ac82fe74ed6637a19e1dfb4b655e994c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 00:34:38 +0000 Subject: SCI: Fixed script bug #3039036 - "Castle of Dr. Brain: Crash at robot jokes" svn-id: r51817 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 946182b0c3..4c6ddc18df 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -343,6 +343,7 @@ const SciWorkaroundEntry kSetPort_workarounds[] = { // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kStrAt_workarounds[] = { + { GID_CASTLEBRAIN, 220, 220, 0, "robotJokes", "animateOnce", -1, 0, { WORKAROUND_FAKE, 0 } }, // when trying to view the terminal at the end of the maze without having collected any robot jokes - bug #3039036 { GID_ISLANDBRAIN, 300, 310, 0, "childBreed", "changeState",0x1c7c, 0, { WORKAROUND_FAKE, 0 } }, // when clicking Breed to get the second-generation cyborg hybrid (Standard difficulty), the two parameters are swapped - bug #3037835 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 0cb8e130d891cfe2418e2792c490f73544cb6689 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 00:59:40 +0000 Subject: SCI: Changed a warning into a debugC svn-id: r51820 --- engines/sci/resource.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 4bf26ff0bf..17dc7171dd 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -989,7 +989,7 @@ void ResourceManager::unlockResource(Resource *res) { assert(res); if (res->_status != kResStatusLocked) { - warning("[resMan] Attempt to unlock unlocked resource %s", res->_id.toString().c_str()); + debugC(kDebugLevelResMan, 2, "[resMan] Attempt to unlock unlocked resource %s", res->_id.toString().c_str()); return; } -- cgit v1.2.3 From ab79d581531355f76f90ce0668e012ffbfa201f5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 01:09:32 +0000 Subject: SCI: Fixed script bug #3040142 - "PEPPER: Crash on Pugh's office" svn-id: r51821 --- engines/sci/engine/vm.cpp | 2 +- engines/sci/engine/workarounds.cpp | 6 ++++++ engines/sci/engine/workarounds.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index dbf9c2b17e..fe4eb15763 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1248,7 +1248,7 @@ void run_vm(EngineState *s) { if (validate_signedInteger(r_temp, compare1) && validate_signedInteger(s->r_acc, compare2)) s->r_acc = make_reg(0, compare1 <= compare2); else - s->r_acc = arithmetic_lookForWorkaround(opcode, NULL, r_temp, s->r_acc); + s->r_acc = arithmetic_lookForWorkaround(opcode, opcodeLeWorkarounds, r_temp, s->r_acc); } break; diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 4c6ddc18df..b7bb306edf 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -52,6 +52,12 @@ const SciWorkaroundEntry opcodeGeWorkarounds[] = { SCI_WORKAROUNDENTRY_TERMINATOR }; +// gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry opcodeLeWorkarounds[] = { + { GID_PEPPER, 370, 23, 0, "eastExitFeature", "onMe", -1, 0, { WORKAROUND_FAKE, 1 } }, // Pugh's office, when trying to use either the left or right exits, gets called on an integer and a pointer - bug #3040142 + SCI_WORKAROUNDENTRY_TERMINATOR +}; + // gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry opcodeLsiWorkarounds[] = { { GID_QFG2, 200, 200, 0, "astro", "messages", -1, 0, { WORKAROUND_FAKE, 0 } }, // when getting asked for your name by the astrologer bug #3039879 diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 1b3bafd6cc..220ffd7fda 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -71,6 +71,7 @@ struct SciWorkaroundEntry { extern const SciWorkaroundEntry opcodeDivWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry opcodeGeWorkarounds[]; +extern const SciWorkaroundEntry opcodeLeWorkarounds[]; extern const SciWorkaroundEntry opcodeLsiWorkarounds[]; extern const SciWorkaroundEntry opcodeMulWorkarounds[]; extern const SciWorkaroundEntry opcodeAndWorkarounds[]; -- cgit v1.2.3 From 978e52379f50cb787000bbfdfca804e25a59783a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 01:14:58 +0000 Subject: SCI: Fixed script bug #3040012 - "PEPPER: Book crash" svn-id: r51822 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index b7bb306edf..25d0c16196 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -141,6 +141,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_MOTHERGOOSE, 18, 992, 0, "AIPath", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // DEMO: Called when walking north from mother goose's house two screens { GID_MOTHERGOOSEHIRES,-1,64950, 1, "Feature", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // right when clicking on a child at the start and probably also later { GID_MOTHERGOOSEHIRES,-1,64950, 1, "View", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // see above + { GID_PEPPER, -1, 894, 0, "Package", "doVerb", -1, 3, { WORKAROUND_FAKE, 0 } }, // using the hand on the book in the inventory - bug #3040012 { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbd0, 0, { WORKAROUND_FAKE, 0 } }, // hq1: going to the brigands hideout { GID_QFG1, -1, 210, 0, "Encounter", "init", 0xbe4, 0, { WORKAROUND_FAKE, 0 } }, // qfg1: going to the brigands hideout { GID_QFG2, -1, 71, 0, "theInvSheet", "doit", -1, 1, { WORKAROUND_FAKE, 0 } }, // accessing the inventory -- cgit v1.2.3 From 7b7364a80f8db29b8b36f419cf47b0097358af6d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 01:27:14 +0000 Subject: SCI: Fixed script bug #3039395 - "KQ5: Crash when opening leather pouch" svn-id: r51823 --- engines/sci/engine/workarounds.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 25d0c16196..427556a368 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -299,6 +299,7 @@ const SciWorkaroundEntry kGraphRedrawBox_workarounds[] = { { GID_SQ4, -1, 704, 0, "shootEgo", "changeState", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // When shot by Droid in Super Computer Maze (Rooms 500, 505, 510...) - accidental additional parameter specified { GID_KQ5, -1, 981, 0, "myWindow", "dispose", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing any dialog box, accidental additional parameter specified - bug #3036331 { GID_KQ5, -1, 995, 0, "invW", "doit", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when closing the inventory window, accidental additional parameter specified + { GID_KQ5, -1, 995, 0, "", "export 0", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // Happens in the floppy version, when opening the gem pouch, accidental additional parameter specified - bug #3039395 SCI_WORKAROUNDENTRY_TERMINATOR }; -- cgit v1.2.3 From 421ac2562879d6bae8c01536273cca3c89dbd603 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 08:59:43 +0000 Subject: SCI: Added support for the inbuilt leftover parser in XMAS1990 svn-id: r51829 --- engines/sci/sci.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index d0c578bd45..7a9a786121 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -211,8 +211,11 @@ Common::Error SciEngine::run() { _console = new Console(this); _kernel = new Kernel(_resMan, segMan); _features = new GameFeatures(segMan, _kernel); - // Only SCI0 and SCI01 games used a parser + // Only SCI0, SCI01 and SCI1 EGA games used a parser _vocabulary = (getSciVersion() <= SCI_VERSION_1_EGA) ? new Vocabulary(_resMan, false) : NULL; + // Also, XMAS1990 apparently had a parser too. Refer to http://forums.scummvm.org/viewtopic.php?t=9135 + if (getGameId() == GID_CHRISTMAS1990) + _vocabulary = new Vocabulary(_resMan, false); _audio = new AudioPlayer(_resMan); _gamestate = new EngineState(segMan); _eventMan = new EventManager(_resMan->detectFontExtended()); -- cgit v1.2.3 From 8e7cce6e5bbca78556c96ead341e04dfa839ae78 Mon Sep 17 00:00:00 2001 From: Neeraj Kumar Date: Sat, 7 Aug 2010 12:13:12 +0000 Subject: fixed a typo with hotkeys in ButtonWidget svn-id: r51830 --- gui/widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/widget.cpp b/gui/widget.cpp index 07cf4407a2..f8713a14db 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -274,7 +274,7 @@ void StaticTextWidget::drawWidget() { ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey) : StaticTextWidget(boss, x, y, w, h, cleanupHotkey(label), Graphics::kTextAlignCenter, tooltip), CommandSender(boss), - _cmd(cmd) { + _cmd(cmd), _hotkey(hotkey) { if (hotkey == 0) _hotkey = parseHotkey(label); -- cgit v1.2.3 From 9aa3f25499e7a7454fc56b17e005842415ac2113 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 12:36:17 +0000 Subject: SCI: Improve output when VM_DEBUG_SEND is set svn-id: r51831 --- engines/sci/engine/vm.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index fe4eb15763..7c989e43f4 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -417,7 +417,9 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt printSendActions = g_sci->checkSelectorBreakpoint(send_obj, selector); #ifdef VM_DEBUG_SEND - printf("Send to %04x:%04x, selector %04x (%s):", PRINT_REG(send_obj), selector, g_sci->getKernel()->getSelectorName(selector).c_str()); + printf("Send to %04x:%04x (%s), selector %04x (%s):", PRINT_REG(send_obj), + s->_segMan->getObjectName(send_obj), selector, + g_sci->getKernel()->getSelectorName(selector).c_str()); #endif // VM_DEBUG_SEND ObjVarRef varp; @@ -445,7 +447,9 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt if (printSendActions && argc) { reg_t oldReg = *varp.getPointer(s->_segMan); reg_t newReg = argp[1]; - debug("[write to selector: change %04x:%04x to %04x:%04x]\n", PRINT_REG(oldReg), PRINT_REG(newReg)); + warning("[write to selector (%s:%s): change %04x:%04x to %04x:%04x]\n", + s->_segMan->getObjectName(send_obj), g_sci->getKernel()->getSelectorName(selector).c_str(), + PRINT_REG(oldReg), PRINT_REG(newReg)); printSendActions = false; } -- cgit v1.2.3 From 1c1eff9ec56147a94aab5148994a39d72cb67e53 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 7 Aug 2010 13:40:14 +0000 Subject: SCI: adding sq5 scrubbing patch (for testing only, i'm not sure if it works because i'm unable to reproduce the bug anymore) svn-id: r51832 --- engines/sci/engine/script_patches.cpp | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 51bdf14e46..60f6c4a826 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -166,6 +166,47 @@ const SciScriptSignature larry6Signatures[] = { { 0, NULL, 0, 0, NULL, NULL } }; +const byte sq5SignatureScrubbing[] = { + 19, + 0x18, // not + 0x31, 0x37, // bnt 37 + 0x78, // push1 (selector x) + 0x76, // push0 + 0x39, 0x38, // pushi 38 (selector mover) + 0x76, // push0 + 0x81, 0x00, // lag 00 + 0x4a, 0x04, // send 04 (read ego::mover) + 0x4a, 0x04, // send 04 (read ego::mover::x) + 0x36, // push + 0x34, 0xa0, 0x00, // ldi 00a0 + 0x1c, // ne? + 0 +}; + +const uint16 sq5PatchScrubbing[] = { + 0x18, // not + 0x31, 0x37, // bnt 37 +// 0x2f, 0x38, // bt 37 (would save another byte, isn't needed + 0x39, 0x38, // pushi 38 (selector mover) + 0x76, // push0 + 0x81, 0x00, // lag 00 + 0x4a, 0x04, // send 04 (read ego::mover) + 0x31, 0x2e, // bnt 2e (jump if ego::mover is 0) + 0x78, // push1 (selector x) + 0x76, // push0 + 0x4a, 0x04, // send 04 (read ego::mover::x) + 0x39, 0xa0, // pushi a0 (saving 2 bytes) + 0x1c, // ne? + PATCH_END +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature sq5Signatures[] = { + { 119, "scrubbing send crash", PATCH_MAGICDWORD(0x18, 0x31, 0x37, 0x78), 0, sq5SignatureScrubbing, sq5PatchScrubbing }, + { 0, NULL, 0, 0, NULL, NULL } +}; + + // will actually patch previously found signature area void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) { int32 offset = signatureOffset; @@ -229,6 +270,8 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin signatureTable = hoyle4Signatures; if (g_sci->getGameId() == GID_LSL6) signatureTable = larry6Signatures; + if (g_sci->getGameId() == GID_SQ5) + signatureTable = sq5Signatures; if (signatureTable) { while (signatureTable->data) { -- cgit v1.2.3 From d2d22de9115fe803870d7ca1d06ece1ab5f77f45 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 7 Aug 2010 13:56:31 +0000 Subject: SCI: removing kDoBresen hack for sq5 adding detailed comment about sq5 scrubbing issue not 100% fixed (waltervn should look into it), but at least it works now svn-id: r51833 --- engines/sci/engine/kmovement.cpp | 10 ++-------- engines/sci/engine/script_patches.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 9bc93cbeb0..5c23539bf8 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -315,14 +315,8 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { ))) { // Whew... in short: If we have reached or passed our target position - // Sanity check: make sure that destx, desty are inside the screen coordinates. - // They can go off screen in some cases, e.g. in SQ5 while scrubbing the floor (bug #3037351) - if (destx <= g_sci->_gfxScreen->getWidth() && desty <= g_sci->_gfxScreen->getHeight()) { - x = destx; - y = desty; - } else { - warning("kDoBresen: destination x, y would be off-screen(%d, %d)", destx, desty); - } + x = destx; + y = desty; completed = 1; debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x", PRINT_REG(mover)); diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 60f6c4a826..bb918cc706 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -166,6 +166,13 @@ const SciScriptSignature larry6Signatures[] = { { 0, NULL, 0, 0, NULL, NULL } }; +// It seems to scripts warp ego outside the screen somehow (or maybe kDoBresen?) +// ego::mover is set to 0 and rm119::doit will crash in that case. This here +// fixes part of the problem and actually checks ego::mover to be 0 and skips +// TODO: this should get further investigated by waltervn and maybe properly +// patched. For now ego will shortly disappear and reappear a bit after +// this isn't good, but sierra sci also "crashed" (endless looped) so this +// is at least better than the original code const byte sq5SignatureScrubbing[] = { 19, 0x18, // not -- cgit v1.2.3 From f4d38ccd407f2a007050d69e4841ba7fc53cd401 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sat, 7 Aug 2010 14:38:07 +0000 Subject: LOL: added english floppy version svn-id: r51834 --- dists/engine-data/kyra.dat | Bin 355277 -> 355807 bytes engines/cruise/script.cpp | 4 ++-- engines/kyra/detection_tables.h | 17 +++++++++++++++++ engines/kyra/lol.cpp | 2 +- engines/kyra/lol.h | 2 +- engines/kyra/staticres.cpp | 2 +- engines/kyra/staticres_lol.cpp | 23 ++++++++++++----------- tools/create_kyradat/create_kyradat.cpp | 2 +- tools/create_kyradat/games.cpp | 1 + tools/create_kyradat/tables.cpp | 3 +++ 10 files changed, 39 insertions(+), 17 deletions(-) diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat index ff21159362..d8cb28076a 100644 Binary files a/dists/engine-data/kyra.dat and b/dists/engine-data/kyra.dat differ diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index f2877a7730..d6c1aa47f3 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -618,13 +618,13 @@ int executeScripts(scriptInstanceStruct *ptr) { positionInStack = 0; do { -#ifdef SKIP_INTRO +//#ifdef SKIP_INTRO if (currentScriptPtr->scriptOffset == 290 && currentScriptPtr->overlayNumber == 4 && currentScriptPtr->scriptNumber == 0) { currentScriptPtr->scriptOffset = 923; } -#endif +//#endif opcodeType = getByteFromScript(); debugC(5, kCruiseDebugScript, "Script %s/%d ip=%d opcode=%d", diff --git a/engines/kyra/detection_tables.h b/engines/kyra/detection_tables.h index fe4cc7298f..8eabb15264 100644 --- a/engines/kyra/detection_tables.h +++ b/engines/kyra/detection_tables.h @@ -1108,6 +1108,23 @@ const KYRAGameDescription adGameDescs[] = { LOL_FLOPPY_FLAGS }, + { + { + "lol", + "Extracted", + { + { "GENERAL.PAK", 0, "0f1fabc1f67b772a30d8e05ece720ac5", -1 }, + { "CHAPTER7.PAK", 0, "482308aba1c40ee32449b91b0c63b990", -1 }, + { 0, 0, 0, 0 } + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_NO_FLAGS, + Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK + }, + LOL_FLOPPY_FLAGS + }, + { { "lol", diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 98f0e31b69..03d52ec4ac 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -4291,7 +4291,7 @@ void LoLEngine::drawMapPage(int pageNum) { if (!_defaultLegendData[ii].enable) continue; _screen->copyBlockAndApplyOverlay(_screen->_curPage, 235, (tY << 3) + 21 + yOffset, _screen->_curPage, 235 + xOffset, (tY << 3) + 21 + yOffset, 7, 6, 0, _mapOverlay); - _screen->drawShape(_screen->_curPage, _automapShapes[_defaultLegendData[ii].shapeIndex << 2], 232 + xOffset, (tY << 3) + 18 + yOffset + _defaultLegendData[ii].x, 0, 0); + _screen->drawShape(_screen->_curPage, _automapShapes[_defaultLegendData[ii].shapeIndex << 2], 232 + xOffset, (tY << 3) + 18 + yOffset + _defaultLegendData[ii].y, 0, 0); printMapText(_defaultLegendData[ii].stringId, 244 + xOffset, (tY << 3) + 22 + yOffset); tY++; } diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index b5a657ac15..57c127a94f 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -256,7 +256,7 @@ struct LevelTempData { struct MapLegendData { uint8 shapeIndex; bool enable; - int8 x; + int8 y; uint16 stringId; }; diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 274acae22c..4b71b1d69d 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -42,7 +42,7 @@ namespace Kyra { -#define RESFILE_VERSION 71 +#define RESFILE_VERSION 72 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp index dbf6808e37..3287ee37d6 100644 --- a/engines/kyra/staticres_lol.cpp +++ b/engines/kyra/staticres_lol.cpp @@ -372,31 +372,32 @@ void LoLEngine::initStaticResource() { _autoMapStrings = _staticres->loadRawDataBe16(kLolMapStringId, _autoMapStringsSize); - int tmpSize = 0; - const uint8 *tmp = _staticres->loadRawData(kLolLegendData, tmpSize); - tmpSize /= 5; - if (tmp) { - _defaultLegendData = new MapLegendData[tmpSize]; - for (int i = 0; i < tmpSize; i++) { + int tempSize; + const uint8 *tmp = _staticres->loadRawData(kLolLegendData, tempSize); + uint8 entrySize = tempSize / 12; + tempSize /= entrySize; + if (tempSize) { + _defaultLegendData = new MapLegendData[tempSize]; + for (int i = 0; i < tempSize; i++) { _defaultLegendData[i].shapeIndex = *tmp++; _defaultLegendData[i].enable = *tmp++ ? true : false; - _defaultLegendData[i].x = (int8)*tmp++; + _defaultLegendData[i].y = (entrySize == 5) ? (int8)*tmp++ : (i == 10 ? -5 : 0); _defaultLegendData[i].stringId = READ_LE_UINT16(tmp); tmp += 2; } _staticres->unloadId(kLolLegendData); } - tmp = _staticres->loadRawData(kLolMapCursorOvl, tmpSize); - _mapCursorOverlay = new uint8[tmpSize]; - memcpy(_mapCursorOverlay, tmp, tmpSize); + tmp = _staticres->loadRawData(kLolMapCursorOvl, tempSize); + _mapCursorOverlay = new uint8[tempSize]; + memcpy(_mapCursorOverlay, tmp, tempSize); _staticres->unloadId(kLolMapCursorOvl); _updateSpellBookCoords = _staticres->loadRawData(kLolSpellbookCoords, _updateSpellBookCoordsSize); _updateSpellBookAnimData = _staticres->loadRawData(kLolSpellbookAnim, _updateSpellBookAnimDataSize); _healShapeFrames = _staticres->loadRawData(kLolHealShapeFrames, _healShapeFramesSize); - tmp = _staticres->loadRawData(kLolLightningDefs, tmpSize); + tmp = _staticres->loadRawData(kLolLightningDefs, tempSize); if (tmp) { _lightningProps = new LightningProperty[5]; for (int i = 0; i < 5; i++) { diff --git a/tools/create_kyradat/create_kyradat.cpp b/tools/create_kyradat/create_kyradat.cpp index a9d1ecc721..85038a0820 100644 --- a/tools/create_kyradat/create_kyradat.cpp +++ b/tools/create_kyradat/create_kyradat.cpp @@ -45,7 +45,7 @@ #include enum { - kKyraDatVersion = 71 + kKyraDatVersion = 72 }; const ExtractFilename extractFilenames[] = { diff --git a/tools/create_kyradat/games.cpp b/tools/create_kyradat/games.cpp index 1bd7d31648..008120868f 100644 --- a/tools/create_kyradat/games.cpp +++ b/tools/create_kyradat/games.cpp @@ -99,6 +99,7 @@ const Game lolGames[] = { { kLol, { EN_ANY, -1, -1 }, kPlatformPC, kDemoVersion, { "30bb5af87d38adb47d3e6ce06b1cb042", 0 } }, // DOS floppy (no language specifc strings) + { kLol, { EN_ANY, -1, -1 }, kPlatformPC, kNoSpecial, { "0cc764a204f7ba8cefe1a5f14c479619", 0 } }, { kLol, { DE_DEU, -1, -1 }, kPlatformPC, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } }, // PC98 (no language specifc strings) diff --git a/tools/create_kyradat/tables.cpp b/tools/create_kyradat/tables.cpp index dc8163901d..e2235b1b78 100644 --- a/tools/create_kyradat/tables.cpp +++ b/tools/create_kyradat/tables.cpp @@ -1281,6 +1281,7 @@ const ExtractEntrySearchData kLolIngamePakFilesProvider[] = { }; const ExtractEntrySearchData kLolCharacterDefsProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD { UNK_LANG, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } }, @@ -1619,6 +1620,7 @@ const ExtractEntrySearchData kLolScrollYBottomProvider[] = { }; const ExtractEntrySearchData kLolButtonDefsProvider[] = { + { UNK_LANG, kPlatformPC, { 0x0000082A, 0x0000CAAE, { { 0xC1, 0x83, 0x0D, 0xA0, 0x66, 0x16, 0x3D, 0x31, 0xCE, 0x30, 0x9F, 0x4E, 0x00, 0x65, 0x5A, 0xC8 } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x0000082A, 0x0000C34E, { { 0x7F, 0x9A, 0x0F, 0x28, 0x1A, 0x8F, 0x03, 0x46, 0x48, 0xEB, 0xC9, 0xB9, 0x23, 0x29, 0x5E, 0x50 } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x0000082A, 0x0000C47B, { { 0xDF, 0x1A, 0x18, 0x1F, 0x58, 0x05, 0x1F, 0x56, 0xD8, 0x6D, 0xBB, 0x93, 0xEC, 0x35, 0x9D, 0xA5 } } } }, // CD { UNK_LANG, kPlatformPC98, { 0x0000082A, 0x0000AB58, { { 0xDD, 0x2B, 0xA9, 0x54, 0x60, 0x25, 0x2C, 0x74, 0xF8, 0x5D, 0xC6, 0xD2, 0x2C, 0x1A, 0x24, 0x44 } } } }, @@ -1675,6 +1677,7 @@ const ExtractEntrySearchData kLolButtonList8Provider[] = { }; const ExtractEntrySearchData kLolLegendDataProvider[] = { + { UNK_LANG, kPlatformUnknown, { 0x00000030, 0x00000858, { { 0x63, 0x5E, 0x60, 0xC7, 0x62, 0x2C, 0x5D, 0x8F, 0x74, 0x71, 0x98, 0xB7, 0x09, 0xD2, 0x51, 0xC7 } } } }, { UNK_LANG, kPlatformUnknown, { 0x0000003C, 0x00000A52, { { 0x81, 0xC5, 0xA4, 0xE7, 0x60, 0xDA, 0xD6, 0x5E, 0x19, 0xAB, 0xF3, 0xC7, 0xDD, 0xDB, 0x92, 0x5E } } } }, EXTRACT_END_ENTRY -- cgit v1.2.3 From adc243c5aca723a625d9a6240241a66a421abeb9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 7 Aug 2010 15:02:08 +0000 Subject: SCI: changing kBaseSetter behaviour when scaled fixes lb2 docks issue (bug #3036306) svn-id: r51835 --- engines/sci/graphics/compare.cpp | 45 +++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 0a186115d0..1c961b2ad6 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -229,39 +229,32 @@ void GfxCompare::kernelBaseSetter(reg_t object) { if (viewId == 0xFFFF) // invalid view return; - // must be something wrong with this TODO check - currently it breaks qfg3 right after the intro - //uint16 scaleSignal = 0; - //if (getSciVersion() >= SCI_VERSION_1_1) { - // scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)) & kScaleSignalDoScaling; - // if (scaleSignal) { - // int16 scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); - // if (scaleY < 64) - // scaleSignal = 0; - // } - //} + uint16 scaleSignal = 0; + if (getSciVersion() >= SCI_VERSION_1_1) { + scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal)); + } Common::Rect celRect; - //if (!scaleSignal) { - GfxView *tmpView = _cache->getView(viewId); - if (tmpView->isSci2Hires()) - _screen->adjustToUpscaledCoordinates(y, x); + GfxView *tmpView = _cache->getView(viewId); + if (tmpView->isSci2Hires()) + _screen->adjustToUpscaledCoordinates(y, x); + if (scaleSignal & kScaleSignalDoScaling) { + int16 scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX)); + int16 scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY)); + tmpView->getCelScaledRect(loopNo, celNo, x, y, z, scaleX, scaleY, celRect); + } else { tmpView->getCelRect(loopNo, celNo, x, y, z, celRect); + } - if (tmpView->isSci2Hires()) { - _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); - _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); - } + if (tmpView->isSci2Hires()) { + _screen->adjustBackUpscaledCoordinates(celRect.top, celRect.left); + _screen->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right); + } - celRect.bottom = y + 1; - celRect.top = celRect.bottom - yStep; - //} else { - // celRect.left = readSelectorValue(_segMan, object, SELECTOR(nsLeft)); - // celRect.right = readSelectorValue(_segMan, object, SELECTOR(nsRight)); - // celRect.top = readSelectorValue(_segMan, object, SELECTOR(nsTop)); - // celRect.bottom = readSelectorValue(_segMan, object, SELECTOR(nsBottom)); - //} + celRect.bottom = y + 1; + celRect.top = celRect.bottom - yStep; writeSelectorValue(_segMan, object, SELECTOR(brLeft), celRect.left); writeSelectorValue(_segMan, object, SELECTOR(brRight), celRect.right); -- cgit v1.2.3 From d365b71945c8d31fd19b4de638cc26db617fd5a5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 7 Aug 2010 16:42:10 +0000 Subject: SCI: Turned a warning into an error svn-id: r51838 --- engines/sci/engine/kpathing.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index fdebc0599c..07d0a31f0b 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -265,7 +265,8 @@ struct PathfindingState { static Common::Point read_point(SegManager *segMan, reg_t list, int offset) { SegmentRef list_r = segMan->dereference(list); if (!list_r.isValid() || list_r.skipByte) { - warning("read_point(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(list)); + // If this happens, then the code below will probably go OOB and crash + error("read_point(): Attempt to dereference invalid pointer %04x:%04x", PRINT_REG(list)); } Common::Point point; -- cgit v1.2.3 From b5b47d50c8984361965c49eead999eb7bc672171 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Aug 2010 00:33:13 +0000 Subject: VIDEO: Make Indeo3 a proper video codec This way, Indeo3 is properly usable in various container VideoDecoder, for example AVI, and not just VMD. Since VMD is not yet ready for this, we're disabling Indeo3 in VMDs for now. svn-id: r51849 --- graphics/module.mk | 2 +- graphics/video/avi_decoder.cpp | 7 +- graphics/video/codecs/indeo3.cpp | 3431 +++++++++++++++++++++++++++ graphics/video/codecs/indeo3.h | 94 + graphics/video/coktelvideo/coktelvideo.cpp | 76 +- graphics/video/coktelvideo/coktelvideo.h | 10 +- graphics/video/coktelvideo/indeo3.cpp | 3485 ---------------------------- graphics/video/coktelvideo/indeo3.h | 126 - 8 files changed, 3566 insertions(+), 3665 deletions(-) create mode 100644 graphics/video/codecs/indeo3.cpp create mode 100644 graphics/video/codecs/indeo3.h delete mode 100644 graphics/video/coktelvideo/indeo3.cpp delete mode 100644 graphics/video/coktelvideo/indeo3.h diff --git a/graphics/module.mk b/graphics/module.mk index 75e3919370..9df126afa7 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -37,7 +37,7 @@ MODULE_OBJS := \ video/codecs/qtrle.o \ video/codecs/rpza.o \ video/codecs/smc.o \ - video/coktelvideo/indeo3.o \ + video/codecs/indeo3.o \ video/coktelvideo/coktelvideo.o ifdef USE_SCALERS diff --git a/graphics/video/avi_decoder.cpp b/graphics/video/avi_decoder.cpp index 06589d99b0..4973cb3eb0 100644 --- a/graphics/video/avi_decoder.cpp +++ b/graphics/video/avi_decoder.cpp @@ -38,6 +38,7 @@ #include "graphics/video/codecs/cinepak.h" #include "graphics/video/codecs/msvideo1.h" #include "graphics/video/codecs/msrle.h" +#include "graphics/video/codecs/indeo3.h" namespace Graphics { @@ -387,10 +388,14 @@ Codec *AviDecoder::createCodec() { case ID_MSVC: case ID_WHAM: return new MSVideo1Decoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); - case ID_RLE : + case ID_RLE: return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); case ID_CVID: return new CinepakDecoder(); +#ifdef USE_INDEO3 + case ID_IV32: + return new Indeo3Decoder(_bmInfo.width, _bmInfo.height); +#endif default: warning ("Unknown/Unhandled compression format \'%s\'", tag2str(_vidsHeader.streamHandler)); } diff --git a/graphics/video/codecs/indeo3.cpp b/graphics/video/codecs/indeo3.cpp new file mode 100644 index 0000000000..f59ae81e81 --- /dev/null +++ b/graphics/video/codecs/indeo3.cpp @@ -0,0 +1,3431 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/scummsys.h" + +#ifdef USE_INDEO3 + +/* Intel Indeo 3 decompressor, derived from ffmpeg. + * + * Original copyright note: * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg + * written, produced, and directed by Alan Smithee + */ + +#include "common/system.h" +#include "common/endian.h" +#include "common/frac.h" +#include "common/file.h" + +#include "graphics/conversion.h" + +#include "graphics/video/codecs/indeo3.h" + +namespace Graphics { + +Indeo3Decoder::Indeo3Decoder(uint16 width, uint16 height) : _ModPred(0), _corrector_type(0) { + _iv_frame[0].the_buf = 0; + _iv_frame[1].the_buf = 0; + + _pixelFormat = g_system->getScreenFormat(); + + _surface = new Surface; + _surface->create(width, height, _pixelFormat.bytesPerPixel); + + buildModPred(); + allocFrames(); +} + +Indeo3Decoder::~Indeo3Decoder() { + delete _surface; + + delete[] _iv_frame[0].the_buf; + delete[] _ModPred; + delete[] _corrector_type; +} + +PixelFormat Indeo3Decoder::getPixelFormat() const { + return _pixelFormat; +} + +bool Indeo3Decoder::isIndeo3(byte *data, uint32 dataLen) { + // No data, no Indeo 3 + if (!data) + return false; + + // Less than 16 bytes? This can't be right + if (dataLen < 16) + return false; + + // Unknown, but according to the docs, always 0 + if (READ_LE_UINT32(data + 4) != 0) + return false; + + uint32 id; + id = READ_LE_UINT32(data ); // frame number + id ^= READ_LE_UINT32(data + 4); // unknown + id ^= READ_LE_UINT32(data + 8); // checksum + id ^= READ_LE_UINT32(data + 12); // frame data length + + // These 4 uint32s XOR'd need to spell "FRMH" + if (id != MKID_BE('FRMH')) + return false; + + return true; +} + +void Indeo3Decoder::buildModPred() { + _ModPred = new byte[8 * 128]; + + for (int i = 0; i < 128; i++) { + _ModPred[i+0*128] = (i > 126) ? 254 : 2*((i + 1) - ((i + 1) % 2)); + _ModPred[i+1*128] = (i == 7) ? 20 : ((i == 119 || i == 120) + ? 236 : 2*((i + 2) - ((i + 1) % 3))); + _ModPred[i+2*128] = (i > 125) ? 248 : 2*((i + 2) - ((i + 2) % 4)); + _ModPred[i+3*128] = 2*((i + 1) - ((i - 3) % 5)); + _ModPred[i+4*128] = (i == 8) ? 20 : 2*((i + 1) - ((i - 3) % 6)); + _ModPred[i+5*128] = 2*((i + 4) - ((i + 3) % 7)); + _ModPred[i+6*128] = (i > 123) ? 240 : 2*((i + 4) - ((i + 4) % 8)); + _ModPred[i+7*128] = 2*((i + 5) - ((i + 4) % 9)); + } + + _corrector_type = new uint16[24 * 256]; + + for (int i = 0; i < 24; i++) { + for (int j = 0; j < 256; j++) { + _corrector_type[i*256+j] = + (j < _corrector_type_0[i]) ? 1 : + ((j < 248 || (i == 16 && j == 248)) ? 0 : + _corrector_type_2[j - 248]); + } + } +} + +void Indeo3Decoder::allocFrames() { + int32 luma_width = (_surface->w + 3) & (~3); + int32 luma_height = (_surface->h + 3) & (~3); + + int32 chroma_width = ((luma_width >> 2) + 3) & (~3); + int32 chroma_height = ((luma_height >> 2) + 3) & (~3); + + int32 luma_pixels = luma_width * luma_height; + int32 chroma_pixels = chroma_width * chroma_height; + + uint32 bufsize = luma_pixels * 2 + luma_width * 3 + + (chroma_pixels + chroma_width) * 4; + + _iv_frame[0].y_w = _iv_frame[1].y_w = luma_width; + _iv_frame[0].y_h = _iv_frame[1].y_h = luma_height; + _iv_frame[0].uv_w = _iv_frame[1].uv_w = chroma_width; + _iv_frame[0].uv_h = _iv_frame[1].uv_h = chroma_height; + + _iv_frame[0].the_buf_size = bufsize; + _iv_frame[1].the_buf_size = 0; + + _iv_frame[0].the_buf = new byte[bufsize]; + memset(_iv_frame[0].the_buf, 0, bufsize); + _iv_frame[1].the_buf = 0; + + uint32 offs = 0; + + _iv_frame[0].Ybuf = _iv_frame[0].the_buf + luma_width; + offs += luma_pixels + luma_width * 2; + _iv_frame[1].Ybuf = _iv_frame[0].the_buf + offs; + offs += (luma_pixels + luma_width); + _iv_frame[0].Ubuf = _iv_frame[0].the_buf + offs; + offs += (chroma_pixels + chroma_width); + _iv_frame[1].Ubuf = _iv_frame[0].the_buf + offs; + offs += (chroma_pixels + chroma_width); + _iv_frame[0].Vbuf = _iv_frame[0].the_buf + offs; + offs += (chroma_pixels + chroma_width); + _iv_frame[1].Vbuf = _iv_frame[0].the_buf + offs; + + for (int i = 1; i <= luma_width; i++) + _iv_frame[0].Ybuf[-i] = _iv_frame[1].Ybuf[-i] = + _iv_frame[0].Ubuf[-i] = 0x80; + + for (int i = 1; i <= chroma_width; i++) { + _iv_frame[1].Ubuf[-i] = 0x80; + _iv_frame[0].Vbuf[-i] = 0x80; + _iv_frame[1].Vbuf[-i] = 0x80; + _iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80; + } +} + +Surface *Indeo3Decoder::decodeImage(Common::SeekableReadStream *stream) { + uint32 dataLen = stream->size(); + + byte *inData = new byte[dataLen]; + + if (stream->read(inData, dataLen) != dataLen) + return 0; + + // Not Indeo 3? Fail + if (!isIndeo3(inData, dataLen)) + return 0; + + uint32 frameDataLen = READ_LE_UINT32(inData + 12); + + // Less data than the frame should have? Fail + if (dataLen < (frameDataLen - 16)) + return 0; + + Common::MemoryReadStream frame(inData, dataLen); + + frame.skip(16); // Header + frame.skip(2); // Unknown + + uint16 flags1 = frame.readUint16LE(); + uint32 flags3 = frame.readUint32LE(); + uint8 flags2 = frame.readByte(); + + // Finding the reference frame + if (flags1 & 0x200) { + _cur_frame = _iv_frame + 1; + _ref_frame = _iv_frame; + } else { + _cur_frame = _iv_frame; + _ref_frame = _iv_frame + 1; + } + + if (flags3 == 0x80) + return _surface; + + frame.skip(3); + + uint16 fHeight = frame.readUint16LE(); + uint16 fWidth = frame.readUint16LE(); + + uint32 chromaHeight = ((fHeight >> 2) + 3) & 0x7FFC; + uint32 chromaWidth = ((fWidth >> 2) + 3) & 0x7FFC; + + uint32 offs; + uint32 offsY = frame.readUint32LE() + 16; + uint32 offsU = frame.readUint32LE() + 16; + uint32 offsV = frame.readUint32LE() + 16; + + frame.skip(4); + + uint32 hPos = frame.pos(); + + byte *hdr_pos = inData + hPos; + byte *buf_pos; + + // Luminance Y + frame.seek(offsY); + buf_pos = inData + offsY + 4; + offs = frame.readUint32LE(); + decodeChunk(_cur_frame->Ybuf, _ref_frame->Ybuf, fWidth, fHeight, + buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(fWidth, 160)); + + // Chrominance U + frame.seek(offsU); + buf_pos = inData + offsU + 4; + offs = frame.readUint32LE(); + decodeChunk(_cur_frame->Vbuf, _ref_frame->Vbuf, chromaWidth, chromaHeight, + buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(chromaWidth, 40)); + + // Chrominance V + frame.seek(offsV); + buf_pos = inData + offsV + 4; + offs = frame.readUint32LE(); + decodeChunk(_cur_frame->Ubuf, _ref_frame->Ubuf, chromaWidth, chromaHeight, + buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(chromaWidth, 40)); + + // Blit the frame onto the surface + const byte *srcY = _cur_frame->Ybuf; + const byte *srcU = _cur_frame->Ubuf; + const byte *srcV = _cur_frame->Vbuf; + byte *dest = (byte *)_surface->pixels; + for (uint32 y = 0; y < fHeight; y++) { + byte *rowDest = dest; + + for (uint32 x = 0; x < fWidth; x++, rowDest += _surface->bytesPerPixel) { + const byte cY = srcY[x]; + const byte cU = srcU[x >> 2]; + const byte cV = srcV[x >> 2]; + + byte r = 0, g = 0, b = 0; + YUV2RGB(cY, cU, cV, r, g, b); + + const uint32 color = _pixelFormat.RGBToColor(r, g, b); + + if (_surface->bytesPerPixel == 1) + *((uint8 *)rowDest) = (uint8)color; + else if (_surface->bytesPerPixel == 2) + *((uint16 *)rowDest) = (uint16)color; + } + + dest += _surface->pitch; + srcY += fWidth; + + if ((y & 3) == 3) { + srcU += fWidth >> 2; + srcV += fWidth >> 2; + } + } + + return _surface; +} + +typedef struct { + int32 xpos; + int32 ypos; + int32 width; + int32 height; + int32 split_flag; + int32 split_direction; + int32 usl7; +} ustr_t; + +/* ---------------------------------------------------------------------- */ + +#define LV1_CHECK(buf1,rle_v3,lv1,lp2) \ + if ((lv1 & 0x80) != 0) { \ + if (rle_v3 != 0) \ + rle_v3 = 0; \ + else { \ + rle_v3 = 1; \ + buf1 -= 2; \ + } \ + } \ + lp2 = 4; + + +#define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \ + if (rle_v3 == 0) { \ + rle_v2 = *buf1; \ + rle_v1 = 1; \ + if (rle_v2 > 32) { \ + rle_v2 -= 32; \ + rle_v1 = 0; \ + } \ + rle_v3 = 1; \ + } \ + buf1--; + + +#define LP2_CHECK(buf1,rle_v3,lp2) \ + if (lp2 == 0 && rle_v3 != 0) \ + rle_v3 = 0; \ + else { \ + buf1--; \ + rle_v3 = 1; \ + } + + +#define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \ + rle_v2--; \ + if (rle_v2 == 0) { \ + rle_v3 = 0; \ + buf1 += 2; \ + } \ + lp2 = 4; + +void Indeo3Decoder::decodeChunk(byte *cur, byte *ref, int width, int height, + const byte *buf1, uint32 fflags2, const byte *hdr, + const byte *buf2, int min_width_160) { + + byte bit_buf; + uint32 bit_pos, lv, lv1, lv2; + int32 *width_tbl, width_tbl_arr[10]; + const int8 *ref_vectors; + byte *cur_frm_pos, *ref_frm_pos, *cp, *cp2; + uint32 *cur_lp, *ref_lp; + const uint32 *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2]; + uint16 *correction_type_sp[2]; + ustr_t strip_tbl[20], *strip; + int i, j, k, lp1, lp2, flag1, cmd; + int blks_width, blks_height, region_160_width; + int rle_v1, rle_v2, rle_v3; + uint16 res; + + bit_buf = 0; + ref_vectors = NULL; + + width_tbl = width_tbl_arr + 1; + i = (width < 0 ? width + 3 : width)/4; + for (j = -1; j < 8; j++) + width_tbl[j] = i * j; + + strip = strip_tbl; + + for (region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160) + ; + + strip->ypos = strip->xpos = 0; + for (strip->width = min_width_160; width > strip->width; strip->width *= 2) + ; + strip->height = height; + strip->split_direction = 0; + strip->split_flag = 0; + strip->usl7 = 0; + + bit_pos = 0; + + rle_v1 = rle_v2 = rle_v3 = 0; + + while (strip >= strip_tbl) { + if (bit_pos <= 0) { + bit_pos = 8; + bit_buf = *buf1++; + } + + bit_pos -= 2; + cmd = (bit_buf >> bit_pos) & 0x03; + + if (cmd == 0) { + strip++; + memcpy(strip, strip-1, sizeof(ustr_t)); + strip->split_flag = 1; + strip->split_direction = 0; + strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4); + continue; + } else if (cmd == 1) { + strip++; + memcpy(strip, strip-1, sizeof(ustr_t)); + strip->split_flag = 1; + strip->split_direction = 1; + strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4); + continue; + } else if (cmd == 2) { + if (strip->usl7 == 0) { + strip->usl7 = 1; + ref_vectors = NULL; + continue; + } + } else if (cmd == 3) { + if (strip->usl7 == 0) { + strip->usl7 = 1; + ref_vectors = (const signed char*)buf2 + (*buf1 * 2); + buf1++; + continue; + } + } + + cur_frm_pos = cur + width * strip->ypos + strip->xpos; + + if ((blks_width = strip->width) < 0) + blks_width += 3; + blks_width >>= 2; + blks_height = strip->height; + + if (ref_vectors != NULL) { + ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width + + ref_vectors[1] + strip->xpos; + } else + ref_frm_pos = cur_frm_pos - width_tbl[4]; + + if (cmd == 2) { + if (bit_pos <= 0) { + bit_pos = 8; + bit_buf = *buf1++; + } + + bit_pos -= 2; + cmd = (bit_buf >> bit_pos) & 0x03; + + if (cmd == 0 || ref_vectors != NULL) { + for (lp1 = 0; lp1 < blks_width; lp1++) { + for (i = 0, j = 0; i < blks_height; i++, j += width_tbl[1]) + ((uint32 *)cur_frm_pos)[j] = ((uint32 *)ref_frm_pos)[j]; + cur_frm_pos += 4; + ref_frm_pos += 4; + } + } else if (cmd != 1) + return; + } else { + k = *buf1 >> 4; + j = *buf1 & 0x0f; + buf1++; + lv = j + fflags2; + + if ((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) { + cp2 = _ModPred + ((lv - 8) << 7); + cp = ref_frm_pos; + for (i = 0; i < blks_width << 2; i++) { + int v = *cp >> 1; + *(cp++) = cp2[v]; + } + } + + if (k == 1 || k == 4) { + lv = (hdr[j] & 0xf) + fflags2; + correction_type_sp[0] = _corrector_type + (lv << 8); + correction_lp[0] = correction + (lv << 8); + lv = (hdr[j] >> 4) + fflags2; + correction_lp[1] = correction + (lv << 8); + correction_type_sp[1] = _corrector_type + (lv << 8); + } else { + correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8); + correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8); + correction_type_sp[0] = correction_type_sp[1] = _corrector_type + (lv << 8); + correction_lp[0] = correction_lp[1] = correction + (lv << 8); + } + + switch (k) { + case 1: + case 0: /********** CASE 0 **********/ + for ( ; blks_height > 0; blks_height -= 4) { + for (lp1 = 0; lp1 < blks_width; lp1++) { + for (lp2 = 0; lp2 < 4; ) { + k = *buf1++; + cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2]; + ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2]; + + switch (correction_type_sp[0][k]) { + case 0: + *cur_lp = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); + lp2++; + break; + case 1: + res = ((FROM_LE_16(((uint16 *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1; + ((uint16 *)cur_lp)[0] = FROM_LE_16(res); + res = ((FROM_LE_16(((uint16 *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1; + ((uint16 *)cur_lp)[1] = FROM_LE_16(res); + buf1++; + lp2++; + break; + case 2: + if (lp2 == 0) { + for (i = 0, j = 0; i < 2; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 += 2; + } + break; + case 3: + if (lp2 < 2) { + for (i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 = 3; + } + break; + case 8: + if (lp2 == 0) { + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) + + if (rle_v1 == 1 || ref_vectors != NULL) { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + } + + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) + break; + } else { + rle_v1 = 1; + rle_v2 = *buf1 - 1; + } + case 5: + LP2_CHECK(buf1,rle_v3,lp2) + case 4: + for (i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 = 4; + break; + + case 7: + if (rle_v3 != 0) + rle_v3 = 0; + else { + buf1--; + rle_v3 = 1; + } + case 6: + if (ref_vectors != NULL) { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + } + lp2 = 4; + break; + + case 9: + lv1 = *buf1++; + lv = (lv1 & 0x7F) << 1; + lv += (lv << 8); + lv += (lv << 16); + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = lv; + + LV1_CHECK(buf1,rle_v3,lv1,lp2) + break; + default: + return; + } + } + + cur_frm_pos += 4; + ref_frm_pos += 4; + } + + cur_frm_pos += ((width - blks_width) * 4); + ref_frm_pos += ((width - blks_width) * 4); + } + break; + + case 4: + case 3: /********** CASE 3 **********/ + if (ref_vectors != NULL) + return; + flag1 = 1; + + for ( ; blks_height > 0; blks_height -= 8) { + for (lp1 = 0; lp1 < blks_width; lp1++) { + for (lp2 = 0; lp2 < 4; ) { + k = *buf1++; + + cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; + ref_lp = ((uint32 *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; + + switch (correction_type_sp[lp2 & 0x01][k]) { + case 0: + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); + if (lp2 > 0 || flag1 == 0 || strip->ypos != 0) + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + else + cur_lp[0] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); + lp2++; + break; + + case 1: + res = ((FROM_LE_16(((uint16 *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1; + ((uint16 *)cur_lp)[width_tbl[2]] = FROM_LE_16(res); + res = ((FROM_LE_16(((uint16 *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1; + ((uint16 *)cur_lp)[width_tbl[2]+1] = FROM_LE_16(res); + + if (lp2 > 0 || flag1 == 0 || strip->ypos != 0) + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + else + cur_lp[0] = cur_lp[width_tbl[1]]; + buf1++; + lp2++; + break; + + case 2: + if (lp2 == 0) { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = *ref_lp; + lp2 += 2; + } + break; + + case 3: + if (lp2 < 2) { + for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) + cur_lp[j] = *ref_lp; + lp2 = 3; + } + break; + + case 6: + lp2 = 4; + break; + + case 7: + if (rle_v3 != 0) + rle_v3 = 0; + else { + buf1--; + rle_v3 = 1; + } + lp2 = 4; + break; + + case 8: + if (lp2 == 0) { + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) + + if (rle_v1 == 1) { + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + } + + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) + break; + } else { + rle_v2 = (*buf1) - 1; + rle_v1 = 1; + } + case 5: + LP2_CHECK(buf1,rle_v3,lp2) + case 4: + for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) + cur_lp[j] = *ref_lp; + lp2 = 4; + break; + + case 9: + warning("Indeo3Decoder::decodeChunk: Untested (1)"); + lv1 = *buf1++; + lv = (lv1 & 0x7F) << 1; + lv += (lv << 8); + lv += (lv << 16); + + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = lv; + + LV1_CHECK(buf1,rle_v3,lv1,lp2) + break; + + default: + return; + } + } + + cur_frm_pos += 4; + } + + cur_frm_pos += (((width * 2) - blks_width) * 4); + flag1 = 0; + } + break; + + case 10: /********** CASE 10 **********/ + if (ref_vectors == NULL) { + flag1 = 1; + + for ( ; blks_height > 0; blks_height -= 8) { + for (lp1 = 0; lp1 < blks_width; lp1 += 2) { + for (lp2 = 0; lp2 < 4; ) { + k = *buf1++; + cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; + ref_lp = ((uint32 *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; + lv1 = ref_lp[0]; + lv2 = ref_lp[1]; + if (lp2 == 0 && flag1 != 0) { +#if defined(SCUMM_BIG_ENDIAN) + lv1 = lv1 & 0xFF00FF00; + lv1 = (lv1 >> 8) | lv1; + lv2 = lv2 & 0xFF00FF00; + lv2 = (lv2 >> 8) | lv2; +#else + lv1 = lv1 & 0x00FF00FF; + lv1 = (lv1 << 8) | lv1; + lv2 = lv2 & 0x00FF00FF; + lv2 = (lv2 << 8) | lv2; +#endif + } + + switch (correction_type_sp[lp2 & 0x01][k]) { + case 0: + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1); + cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1); + if (lp2 > 0 || strip->ypos != 0 || flag1 == 0) { + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + cur_lp[0] = cur_lp[width_tbl[1]]; + cur_lp[1] = cur_lp[width_tbl[1]+1]; + } + lp2++; + break; + + case 1: + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1]) << 1); + cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1); + if (lp2 > 0 || strip->ypos != 0 || flag1 == 0) { + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + cur_lp[0] = cur_lp[width_tbl[1]]; + cur_lp[1] = cur_lp[width_tbl[1]+1]; + } + buf1++; + lp2++; + break; + + case 2: + if (lp2 == 0) { + if (flag1 != 0) { + for (i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + } + lp2 += 2; + } + break; + + case 3: + if (lp2 < 2) { + if (lp2 == 0 && flag1 != 0) { + for (i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + } + lp2 = 3; + } + break; + + case 8: + if (lp2 == 0) { + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) + if (rle_v1 == 1) { + if (flag1 != 0) { + for (i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + } + } + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) + break; + } else { + rle_v1 = 1; + rle_v2 = (*buf1) - 1; + } + case 5: + LP2_CHECK(buf1,rle_v3,lp2) + case 4: + if (lp2 == 0 && flag1 != 0) { + for (i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; + cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; + } else { + for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { + cur_lp[j] = lv1; + cur_lp[j+1] = lv2; + } + } + lp2 = 4; + break; + + case 6: + lp2 = 4; + break; + + case 7: + if (lp2 == 0) { + if (rle_v3 != 0) + rle_v3 = 0; + else { + buf1--; + rle_v3 = 1; + } + lp2 = 4; + } + break; + + case 9: + warning("Indeo3Decoder::decodeChunk: Untested (2)"); + lv1 = *buf1; + lv = (lv1 & 0x7F) << 1; + lv += (lv << 8); + lv += (lv << 16); + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) + cur_lp[j] = lv; + LV1_CHECK(buf1,rle_v3,lv1,lp2) + break; + + default: + return; + } + } + + cur_frm_pos += 8; + } + + cur_frm_pos += (((width * 2) - blks_width) * 4); + flag1 = 0; + } + } else { + for ( ; blks_height > 0; blks_height -= 8) { + for (lp1 = 0; lp1 < blks_width; lp1 += 2) { + for (lp2 = 0; lp2 < 4; ) { + k = *buf1++; + cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; + ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2 * 2]; + + switch (correction_type_sp[lp2 & 0x01][k]) { + case 0: + lv1 = correctionloworder_lp[lp2 & 0x01][k]; + lv2 = correctionhighorder_lp[lp2 & 0x01][k]; + cur_lp[0] = FROM_LE_32(((FROM_LE_32(ref_lp[0]) >> 1) + lv1) << 1); + cur_lp[1] = FROM_LE_32(((FROM_LE_32(ref_lp[1]) >> 1) + lv2) << 1); + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1); + cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1); + lp2++; + break; + + case 1: + lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++]; + lv2 = correctionloworder_lp[lp2 & 0x01][k]; + cur_lp[0] = FROM_LE_32(((FROM_LE_32(ref_lp[0]) >> 1) + lv1) << 1); + cur_lp[1] = FROM_LE_32(((FROM_LE_32(ref_lp[1]) >> 1) + lv2) << 1); + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1); + cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1); + lp2++; + break; + + case 2: + if (lp2 == 0) { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) { + cur_lp[j] = ref_lp[j]; + cur_lp[j+1] = ref_lp[j+1]; + } + lp2 += 2; + } + break; + + case 3: + if (lp2 < 2) { + for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) { + cur_lp[j] = ref_lp[j]; + cur_lp[j+1] = ref_lp[j+1]; + } + lp2 = 3; + } + break; + + case 8: + if (lp2 == 0) { + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { + ((uint32 *)cur_frm_pos)[j] = ((uint32 *)ref_frm_pos)[j]; + ((uint32 *)cur_frm_pos)[j+1] = ((uint32 *)ref_frm_pos)[j+1]; + } + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) + break; + } else { + rle_v1 = 1; + rle_v2 = (*buf1) - 1; + } + case 5: + case 7: + LP2_CHECK(buf1,rle_v3,lp2) + case 6: + case 4: + for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { + cur_lp[j] = ref_lp[j]; + cur_lp[j+1] = ref_lp[j+1]; + } + lp2 = 4; + break; + + case 9: + warning("Indeo3Decoder::decodeChunk: Untested (3)"); + lv1 = *buf1; + lv = (lv1 & 0x7F) << 1; + lv += (lv << 8); + lv += (lv << 16); + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) + ((uint32 *)cur_frm_pos)[j] = ((uint32 *)cur_frm_pos)[j+1] = lv; + LV1_CHECK(buf1,rle_v3,lv1,lp2) + break; + + default: + return; + } + } + + cur_frm_pos += 8; + ref_frm_pos += 8; + } + + cur_frm_pos += (((width * 2) - blks_width) * 4); + ref_frm_pos += (((width * 2) - blks_width) * 4); + } + } + break; + + case 11: /********** CASE 11 **********/ + if (ref_vectors == NULL) + return; + + for ( ; blks_height > 0; blks_height -= 8) { + for (lp1 = 0; lp1 < blks_width; lp1++) { + for (lp2 = 0; lp2 < 4; ) { + k = *buf1++; + cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; + ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2 * 2]; + + switch (correction_type_sp[lp2 & 0x01][k]) { + case 0: + cur_lp[0] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); + cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); + lp2++; + break; + + case 1: + lv1 = (uint16)(correction_lp[lp2 & 0x01][*buf1++]); + lv2 = (uint16)(correction_lp[lp2 & 0x01][k]); + res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[0]) >> 1) + lv1) << 1); + ((uint16 *)cur_lp)[0] = FROM_LE_16(res); + res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[1]) >> 1) + lv2) << 1); + ((uint16 *)cur_lp)[1] = FROM_LE_16(res); + res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1); + ((uint16 *)cur_lp)[width_tbl[2]] = FROM_LE_16(res); + res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1); + ((uint16 *)cur_lp)[width_tbl[2]+1] = FROM_LE_16(res); + lp2++; + break; + + case 2: + if (lp2 == 0) { + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 += 2; + } + break; + + case 3: + if (lp2 < 2) { + for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 = 3; + } + break; + + case 8: + if (lp2 == 0) { + RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) + + for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + + RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) + break; + } else { + rle_v1 = 1; + rle_v2 = (*buf1) - 1; + } + case 5: + case 7: + LP2_CHECK(buf1,rle_v3,lp2) + case 4: + case 6: + for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) + cur_lp[j] = ref_lp[j]; + lp2 = 4; + break; + + case 9: + warning("Indeo3Decoder::decodeChunk: Untested (4)"); + lv1 = *buf1++; + lv = (lv1 & 0x7F) << 1; + lv += (lv << 8); + lv += (lv << 16); + for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) + cur_lp[j] = lv; + LV1_CHECK(buf1,rle_v3,lv1,lp2) + break; + + default: + return; + } + } + + cur_frm_pos += 4; + ref_frm_pos += 4; + } + + cur_frm_pos += (((width * 2) - blks_width) * 4); + ref_frm_pos += (((width * 2) - blks_width) * 4); + } + break; + + default: + // FIXME: I've seen case 13 happen in Urban + // Runner. Perhaps it uses a more recent form of + // Indeo 3? There appears to have been several. + warning("Indeo3Decoder::decodeChunk: Unknown case %d", k); + return; + } + } + + if (strip < strip_tbl) + return; + + for ( ; strip >= strip_tbl; strip--) { + if (strip->split_flag != 0) { + strip->split_flag = 0; + strip->usl7 = (strip-1)->usl7; + + if (strip->split_direction) { + strip->xpos += strip->width; + strip->width = (strip-1)->width - strip->width; + if (region_160_width <= strip->xpos && width < strip->width + strip->xpos) + strip->width = width - strip->xpos; + } else { + strip->ypos += strip->height; + strip->height = (strip-1)->height - strip->height; + } + break; + } + } + } +} + +// static data + +const int Indeo3Decoder::_corrector_type_0[24] = { + 195, 159, 133, 115, 101, 93, 87, 77, + 195, 159, 133, 115, 101, 93, 87, 77, + 128, 79, 79, 79, 79, 79, 79, 79 +}; + +const int Indeo3Decoder::_corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 }; + +const uint32 Indeo3Decoder::correction[] = { + 0x00000000, 0x00000202, 0xfffffdfe, 0x000002ff, 0xfffffd01, 0xffffff03, 0x000000fd, 0x00000404, + 0xfffffbfc, 0x00000501, 0xfffffaff, 0x00000105, 0xfffffefb, 0x000003fc, 0xfffffc04, 0x000005fe, + 0xfffffa02, 0xfffffe06, 0x000001fa, 0x00000904, 0xfffff6fc, 0x00000409, 0xfffffbf7, 0x00000909, + 0xfffff6f7, 0x00000a01, 0xfffff5ff, 0x0000010a, 0xfffffef6, 0x000007fb, 0xfffff805, 0xfffffb08, + 0x000004f8, 0x00000f09, 0xfffff0f7, 0x0000090f, 0xfffff6f1, 0x00000bfd, 0xfffff403, 0xfffffd0c, + 0x000002f4, 0x00001004, 0xffffeffc, 0x00000410, 0xfffffbf0, 0x00001010, 0xffffeff0, 0x00001200, + 0xffffee00, 0x00000012, 0xffffffee, 0x00000bf4, 0xfffff40c, 0x00000ff7, 0xfffff009, 0xfffff710, + 0x000008f0, 0x00001b0b, 0xffffe4f5, 0x00000b1b, 0xfffff4e5, 0x00001c13, 0xffffe3ed, 0x0000131c, + 0xffffece4, 0x000015fa, 0xffffea06, 0xfffffa16, 0x000005ea, 0x00001d04, 0xffffe2fc, 0x0000041d, + 0xfffffbe3, 0x00001e1e, 0xffffe1e2, 0x000020fe, 0xffffdf02, 0xfffffe21, 0x000001df, 0x000016ee, + 0xffffe912, 0xffffee17, 0x000011e9, 0x00001df1, 0xffffe20f, 0xfffff11e, 0x00000ee2, 0x00002e16, + 0xffffd1ea, 0x0000162e, 0xffffe9d2, 0x00002f0d, 0xffffd0f3, 0x00000d2f, 0xfffff2d1, 0x00003123, + 0xffffcedd, 0x00002331, 0xffffdccf, 0x000028f5, 0xffffd70b, 0xfffff529, 0x00000ad7, 0x00003304, + 0xffffccfc, 0x00000433, 0xfffffbcd, 0x00003636, 0xffffc9ca, 0x000021de, 0xffffde22, 0x000029e3, + 0xffffd61d, 0xffffe32a, 0x00001cd6, 0x00003bfa, 0xffffc406, 0xfffffa3c, 0x000005c4, 0x00004c1b, + 0xffffb3e5, 0x00001b4c, 0xffffe4b4, 0x00004d2b, 0xffffb2d5, 0x00002b4d, 0xffffd4b3, 0x000036e8, + 0xffffc918, 0xffffe837, 0x000017c9, 0x00004f0e, 0xffffb0f2, 0x00000e4f, 0xfffff1b1, 0x0000533f, + 0xffffacc1, 0x00003f53, 0xffffc0ad, 0x000049ec, 0xffffb614, 0xffffec4a, 0x000013b6, 0x00005802, + 0xffffa7fe, 0x00000258, 0xfffffda8, 0x00005d5d, 0xffffa2a3, 0x00003ccc, 0xffffc334, 0xffffcc3d, + 0x000033c3, 0x00007834, 0xffff87cc, 0x00003478, 0xffffcb88, 0x00004ad3, 0xffffb52d, 0xffffd34b, + 0x00002cb5, 0x00007d4b, 0xffff82b5, 0x00004b7d, 0xffffb483, 0x00007a21, 0xffff85df, 0x0000217a, + 0xffffde86, 0x000066f3, 0xffff990d, 0xfffff367, 0x00000c99, 0x00005fd8, 0xffffa028, 0xffffd860, + 0x000027a0, 0x00007ede, 0xffff8122, 0xffffde7f, 0x00002181, 0x000058a7, 0xffffa759, 0x000068b2, + 0xffff974e, 0xffffb269, 0x00004d97, 0x00000c0c, 0xfffff3f4, 0x00001717, 0xffffe8e9, 0x00002a2a, + 0xffffd5d6, 0x00004949, 0xffffb6b7, 0x00000000, 0x02020000, 0xfdfe0000, 0x02ff0000, 0xfd010000, + 0xff030000, 0x00fd0000, 0x00000202, 0x02020202, 0xfdfe0202, 0x02ff0202, 0xfd010202, 0xff030202, + 0x00fd0202, 0xfffffdfe, 0x0201fdfe, 0xfdfdfdfe, 0x02fefdfe, 0xfd00fdfe, 0xff02fdfe, 0x00fcfdfe, + 0x000002ff, 0x020202ff, 0xfdfe02ff, 0x02ff02ff, 0xfd0102ff, 0xff0302ff, 0x00fd02ff, 0xfffffd01, + 0x0201fd01, 0xfdfdfd01, 0x02fefd01, 0xfd00fd01, 0xff02fd01, 0x00fcfd01, 0xffffff03, 0x0201ff03, + 0xfdfdff03, 0x02feff03, 0xfd00ff03, 0xff02ff03, 0x00fcff03, 0x000000fd, 0x020200fd, 0xfdfe00fd, + 0x02ff00fd, 0xfd0100fd, 0xff0300fd, 0x00fd00fd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000303, 0xfffffcfd, 0x000003ff, 0xfffffc01, 0xffffff04, 0x000000fc, 0x00000707, + 0xfffff8f9, 0x00000802, 0xfffff7fe, 0x00000208, 0xfffffdf8, 0x000008fe, 0xfffff702, 0xfffffe09, + 0x000001f7, 0x000005fa, 0xfffffa06, 0x00000d06, 0xfffff2fa, 0x0000060d, 0xfffff9f3, 0x00000d0d, + 0xfffff2f3, 0x00000e01, 0xfffff1ff, 0x0000010e, 0xfffffef2, 0x00000bf8, 0xfffff408, 0xfffff80c, + 0x000007f4, 0x0000170e, 0xffffe8f2, 0x00000e17, 0xfffff1e9, 0x000011fb, 0xffffee05, 0xfffffb12, + 0x000004ee, 0x00001806, 0xffffe7fa, 0x00000618, 0xfffff9e8, 0x00001818, 0xffffe7e8, 0x00001aff, + 0xffffe501, 0xffffff1b, 0x000000e5, 0x000010ef, 0xffffef11, 0x000016f3, 0xffffe90d, 0xfffff317, + 0x00000ce9, 0x00002810, 0xffffd7f0, 0x00001028, 0xffffefd8, 0x0000291c, 0xffffd6e4, 0x00001c29, + 0xffffe3d7, 0x000020f7, 0xffffdf09, 0xfffff721, 0x000008df, 0x00002b06, 0xffffd4fa, 0x0000062b, + 0xfffff9d5, 0x00002e2e, 0xffffd1d2, 0x000031fc, 0xffffce04, 0xfffffc32, 0x000003ce, 0x000021e5, + 0xffffde1b, 0xffffe522, 0x00001ade, 0x00002cea, 0xffffd316, 0xffffea2d, 0x000015d3, 0x00004522, + 0xffffbade, 0x00002245, 0xffffddbb, 0x00004613, 0xffffb9ed, 0x00001346, 0xffffecba, 0x00004935, + 0xffffb6cb, 0x00003549, 0xffffcab7, 0x00003def, 0xffffc211, 0xffffef3e, 0x000010c2, 0x00004d05, + 0xffffb2fb, 0x0000054d, 0xfffffab3, 0x00005252, 0xffffadae, 0x000032cd, 0xffffcd33, 0x00003fd5, + 0xffffc02b, 0xffffd540, 0x00002ac0, 0x000059f6, 0xffffa60a, 0xfffff65a, 0x000009a6, 0x00007229, + 0xffff8dd7, 0x00002972, 0xffffd68e, 0x00007440, 0xffff8bc0, 0x00004074, 0xffffbf8c, 0x000051db, + 0xffffae25, 0xffffdb52, 0x000024ae, 0x00007716, 0xffff88ea, 0x00001677, 0xffffe989, 0x00007c5f, + 0xffff83a1, 0x00005f7c, 0xffffa084, 0x00006ee2, 0xffff911e, 0xffffe26f, 0x00001d91, 0x00005bb2, + 0xffffa44e, 0xffffb25c, 0x00004da4, 0x000070bc, 0xffff8f44, 0xffffbc71, 0x0000438f, 0x00001212, + 0xffffedee, 0x00002222, 0xffffddde, 0x00003f3f, 0xffffc0c1, 0x00006d6d, 0xffff9293, 0x00000000, + 0x03030000, 0xfcfd0000, 0x03ff0000, 0xfc010000, 0xff040000, 0x00fc0000, 0x07070000, 0xf8f90000, + 0x00000303, 0x03030303, 0xfcfd0303, 0x03ff0303, 0xfc010303, 0xff040303, 0x00fc0303, 0x07070303, + 0xf8f90303, 0xfffffcfd, 0x0302fcfd, 0xfcfcfcfd, 0x03fefcfd, 0xfc00fcfd, 0xff03fcfd, 0x00fbfcfd, + 0x0706fcfd, 0xf8f8fcfd, 0x000003ff, 0x030303ff, 0xfcfd03ff, 0x03ff03ff, 0xfc0103ff, 0xff0403ff, + 0x00fc03ff, 0x070703ff, 0xf8f903ff, 0xfffffc01, 0x0302fc01, 0xfcfcfc01, 0x03fefc01, 0xfc00fc01, + 0xff03fc01, 0x00fbfc01, 0x0706fc01, 0xf8f8fc01, 0xffffff04, 0x0302ff04, 0xfcfcff04, 0x03feff04, + 0xfc00ff04, 0xff03ff04, 0x00fbff04, 0x0706ff04, 0xf8f8ff04, 0x000000fc, 0x030300fc, 0xfcfd00fc, + 0x03ff00fc, 0xfc0100fc, 0xff0400fc, 0x00fc00fc, 0x070700fc, 0xf8f900fc, 0x00000707, 0x03030707, + 0xfcfd0707, 0x03ff0707, 0xfc010707, 0xff040707, 0x00fc0707, 0x07070707, 0xf8f90707, 0xfffff8f9, + 0x0302f8f9, 0xfcfcf8f9, 0x03fef8f9, 0xfc00f8f9, 0xff03f8f9, 0x00fbf8f9, 0x0706f8f9, 0xf8f8f8f9, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000404, 0xfffffbfc, 0x000004ff, 0xfffffb01, 0xffffff05, 0x000000fb, 0x00000a03, + 0xfffff5fd, 0x0000030a, 0xfffffcf6, 0x00000909, 0xfffff6f7, 0x000006f9, 0xfffff907, 0x00000bfd, + 0xfffff403, 0xfffffd0c, 0x000002f4, 0x00001108, 0xffffeef8, 0x00000811, 0xfffff7ef, 0x00001111, + 0xffffeeef, 0x00001301, 0xffffecff, 0x00000113, 0xfffffeed, 0x00000ff5, 0xfffff00b, 0xfffff510, + 0x00000af0, 0x000016fa, 0xffffe906, 0xfffffa17, 0x000005e9, 0x00001f12, 0xffffe0ee, 0x0000121f, + 0xffffede1, 0x00002008, 0xffffdff8, 0x00000820, 0xfffff7e0, 0x00002121, 0xffffdedf, 0x000023ff, + 0xffffdc01, 0xffffff24, 0x000000dc, 0x000016e9, 0xffffe917, 0x00001eef, 0xffffe111, 0xffffef1f, + 0x000010e1, 0x00003615, 0xffffc9eb, 0x00001536, 0xffffeaca, 0x00003725, 0xffffc8db, 0x00002537, + 0xffffdac9, 0x00002bf4, 0xffffd40c, 0xfffff42c, 0x00000bd4, 0x00003908, 0xffffc6f8, 0x00000839, + 0xfffff7c7, 0x00003d3d, 0xffffc2c3, 0x000041fb, 0xffffbe05, 0xfffffb42, 0x000004be, 0x00002cdc, + 0xffffd324, 0xffffdc2d, 0x000023d3, 0x00003be3, 0xffffc41d, 0xffffe33c, 0x00001cc4, 0x00005c2d, + 0xffffa3d3, 0x00002d5c, 0xffffd2a4, 0x00005d19, 0xffffa2e7, 0x0000195d, 0xffffe6a3, 0x00006147, + 0xffff9eb9, 0x00004761, 0xffffb89f, 0x000052ea, 0xffffad16, 0xffffea53, 0x000015ad, 0x00006607, + 0xffff99f9, 0x00000766, 0xfffff89a, 0x00006d6d, 0xffff9293, 0x000043bc, 0xffffbc44, 0x000054c7, + 0xffffab39, 0xffffc755, 0x000038ab, 0x000077f3, 0xffff880d, 0xfffff378, 0x00000c88, 0x00006dcf, + 0xffff9231, 0xffffcf6e, 0x00003092, 0x00007a98, 0xffff8568, 0xffff987b, 0x00006785, 0x00001818, + 0xffffe7e8, 0x00002e2e, 0xffffd1d2, 0x00005454, 0xffffabac, 0x00000000, 0x04040000, 0xfbfc0000, + 0x04ff0000, 0xfb010000, 0xff050000, 0x00fb0000, 0x0a030000, 0xf5fd0000, 0x030a0000, 0x00000404, + 0x04040404, 0xfbfc0404, 0x04ff0404, 0xfb010404, 0xff050404, 0x00fb0404, 0x0a030404, 0xf5fd0404, + 0x030a0404, 0xfffffbfc, 0x0403fbfc, 0xfbfbfbfc, 0x04fefbfc, 0xfb00fbfc, 0xff04fbfc, 0x00fafbfc, + 0x0a02fbfc, 0xf5fcfbfc, 0x0309fbfc, 0x000004ff, 0x040404ff, 0xfbfc04ff, 0x04ff04ff, 0xfb0104ff, + 0xff0504ff, 0x00fb04ff, 0x0a0304ff, 0xf5fd04ff, 0x030a04ff, 0xfffffb01, 0x0403fb01, 0xfbfbfb01, + 0x04fefb01, 0xfb00fb01, 0xff04fb01, 0x00fafb01, 0x0a02fb01, 0xf5fcfb01, 0x0309fb01, 0xffffff05, + 0x0403ff05, 0xfbfbff05, 0x04feff05, 0xfb00ff05, 0xff04ff05, 0x00faff05, 0x0a02ff05, 0xf5fcff05, + 0x0309ff05, 0x000000fb, 0x040400fb, 0xfbfc00fb, 0x04ff00fb, 0xfb0100fb, 0xff0500fb, 0x00fb00fb, + 0x0a0300fb, 0xf5fd00fb, 0x030a00fb, 0x00000a03, 0x04040a03, 0xfbfc0a03, 0x04ff0a03, 0xfb010a03, + 0xff050a03, 0x00fb0a03, 0x0a030a03, 0xf5fd0a03, 0x030a0a03, 0xfffff5fd, 0x0403f5fd, 0xfbfbf5fd, + 0x04fef5fd, 0xfb00f5fd, 0xff04f5fd, 0x00faf5fd, 0x0a02f5fd, 0xf5fcf5fd, 0x0309f5fd, 0x0000030a, + 0x0404030a, 0xfbfc030a, 0x04ff030a, 0xfb01030a, 0xff05030a, 0x00fb030a, 0x0a03030a, 0xf5fd030a, + 0x030a030a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000505, 0xfffffafb, 0x000006fe, 0xfffff902, 0xfffffe07, 0x000001f9, 0x00000b0b, + 0xfffff4f5, 0x00000d03, 0xfffff2fd, 0x0000030d, 0xfffffcf3, 0x000008f7, 0xfffff709, 0x00000efc, + 0xfffff104, 0xfffffc0f, 0x000003f1, 0x0000160b, 0xffffe9f5, 0x00000b16, 0xfffff4ea, 0x00001515, + 0xffffeaeb, 0x00001802, 0xffffe7fe, 0x00000218, 0xfffffde8, 0x000013f2, 0xffffec0e, 0xfffff214, + 0x00000dec, 0x00002617, 0xffffd9e9, 0x00001726, 0xffffe8da, 0x00001cf8, 0xffffe308, 0xfffff81d, + 0x000007e3, 0x0000270b, 0xffffd8f5, 0x00000b27, 0xfffff4d9, 0x00002929, 0xffffd6d7, 0x00002cff, + 0xffffd301, 0xffffff2d, 0x000000d3, 0x00001ce3, 0xffffe31d, 0x000026ea, 0xffffd916, 0xffffea27, + 0x000015d9, 0x0000431b, 0xffffbce5, 0x00001b43, 0xffffe4bd, 0x0000452f, 0xffffbad1, 0x00002f45, + 0xffffd0bb, 0x000037f1, 0xffffc80f, 0xfffff138, 0x00000ec8, 0x0000470b, 0xffffb8f5, 0x00000b47, + 0xfffff4b9, 0x00004c4c, 0xffffb3b4, 0x000052fa, 0xffffad06, 0xfffffa53, 0x000005ad, 0x000038d3, + 0xffffc72d, 0xffffd339, 0x00002cc7, 0x00004adc, 0xffffb524, 0xffffdc4b, 0x000023b5, 0x00007338, + 0xffff8cc8, 0x00003873, 0xffffc78d, 0x0000751f, 0xffff8ae1, 0x00001f75, 0xffffe08b, 0x00007a58, + 0xffff85a8, 0x0000587a, 0xffffa786, 0x000067e4, 0xffff981c, 0xffffe468, 0x00001b98, 0x000054ab, + 0xffffab55, 0x000069b8, 0xffff9648, 0xffffb86a, 0x00004796, 0x00001e1e, 0xffffe1e2, 0x00003a3a, + 0xffffc5c6, 0x00006969, 0xffff9697, 0x00000000, 0x05050000, 0xfafb0000, 0x06fe0000, 0xf9020000, + 0xfe070000, 0x01f90000, 0x0b0b0000, 0xf4f50000, 0x0d030000, 0xf2fd0000, 0x00000505, 0x05050505, + 0xfafb0505, 0x06fe0505, 0xf9020505, 0xfe070505, 0x01f90505, 0x0b0b0505, 0xf4f50505, 0x0d030505, + 0xf2fd0505, 0xfffffafb, 0x0504fafb, 0xfafafafb, 0x06fdfafb, 0xf901fafb, 0xfe06fafb, 0x01f8fafb, + 0x0b0afafb, 0xf4f4fafb, 0x0d02fafb, 0xf2fcfafb, 0x000006fe, 0x050506fe, 0xfafb06fe, 0x06fe06fe, + 0xf90206fe, 0xfe0706fe, 0x01f906fe, 0x0b0b06fe, 0xf4f506fe, 0x0d0306fe, 0xf2fd06fe, 0xfffff902, + 0x0504f902, 0xfafaf902, 0x06fdf902, 0xf901f902, 0xfe06f902, 0x01f8f902, 0x0b0af902, 0xf4f4f902, + 0x0d02f902, 0xf2fcf902, 0xfffffe07, 0x0504fe07, 0xfafafe07, 0x06fdfe07, 0xf901fe07, 0xfe06fe07, + 0x01f8fe07, 0x0b0afe07, 0xf4f4fe07, 0x0d02fe07, 0xf2fcfe07, 0x000001f9, 0x050501f9, 0xfafb01f9, + 0x06fe01f9, 0xf90201f9, 0xfe0701f9, 0x01f901f9, 0x0b0b01f9, 0xf4f501f9, 0x0d0301f9, 0xf2fd01f9, + 0x00000b0b, 0x05050b0b, 0xfafb0b0b, 0x06fe0b0b, 0xf9020b0b, 0xfe070b0b, 0x01f90b0b, 0x0b0b0b0b, + 0xf4f50b0b, 0x0d030b0b, 0xf2fd0b0b, 0xfffff4f5, 0x0504f4f5, 0xfafaf4f5, 0x06fdf4f5, 0xf901f4f5, + 0xfe06f4f5, 0x01f8f4f5, 0x0b0af4f5, 0xf4f4f4f5, 0x0d02f4f5, 0xf2fcf4f5, 0x00000d03, 0x05050d03, + 0xfafb0d03, 0x06fe0d03, 0xf9020d03, 0xfe070d03, 0x01f90d03, 0x0b0b0d03, 0xf4f50d03, 0x0d030d03, + 0xf2fd0d03, 0xfffff2fd, 0x0504f2fd, 0xfafaf2fd, 0x06fdf2fd, 0xf901f2fd, 0xfe06f2fd, 0x01f8f2fd, + 0x0b0af2fd, 0xf4f4f2fd, 0x0d02f2fd, 0xf2fcf2fd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000606, 0xfffff9fa, 0x000007fe, 0xfffff802, 0xfffffe08, 0x000001f8, 0x00000d0d, + 0xfffff2f3, 0x00000f04, 0xfffff0fc, 0x0000040f, 0xfffffbf1, 0x00000af5, 0xfffff50b, 0x000011fb, + 0xffffee05, 0xfffffb12, 0x000004ee, 0x00001a0d, 0xffffe5f3, 0x00000d1a, 0xfffff2e6, 0x00001a1a, + 0xffffe5e6, 0x00001d02, 0xffffe2fe, 0x0000021d, 0xfffffde3, 0x000017f0, 0xffffe810, 0xfffff018, + 0x00000fe8, 0x00002e1c, 0xffffd1e4, 0x00001c2e, 0xffffe3d2, 0x000022f7, 0xffffdd09, 0xfffff723, + 0x000008dd, 0x00002f0d, 0xffffd0f3, 0x00000d2f, 0xfffff2d1, 0x00003131, 0xffffcecf, 0x000035ff, + 0xffffca01, 0xffffff36, 0x000000ca, 0x000022dd, 0xffffdd23, 0x00002ee6, 0xffffd11a, 0xffffe62f, + 0x000019d1, 0x00005120, 0xffffaee0, 0x00002051, 0xffffdfaf, 0x00005338, 0xffffacc8, 0x00003853, + 0xffffc7ad, 0x000042ee, 0xffffbd12, 0xffffee43, 0x000011bd, 0x0000560d, 0xffffa9f3, 0x00000d56, + 0xfffff2aa, 0x00005b5b, 0xffffa4a5, 0x000062f9, 0xffff9d07, 0xfffff963, 0x0000069d, 0x000043ca, + 0xffffbc36, 0xffffca44, 0x000035bc, 0x000059d4, 0xffffa62c, 0xffffd45a, 0x00002ba6, 0x00007bdf, + 0xffff8421, 0xffffdf7c, 0x00002084, 0x00006699, 0xffff9967, 0x00007eaa, 0xffff8156, 0xffffaa7f, + 0x00005581, 0x00002525, 0xffffdadb, 0x00004545, 0xffffbabb, 0x00000000, 0x06060000, 0xf9fa0000, + 0x07fe0000, 0xf8020000, 0xfe080000, 0x01f80000, 0x0d0d0000, 0xf2f30000, 0x0f040000, 0xf0fc0000, + 0x040f0000, 0x00000606, 0x06060606, 0xf9fa0606, 0x07fe0606, 0xf8020606, 0xfe080606, 0x01f80606, + 0x0d0d0606, 0xf2f30606, 0x0f040606, 0xf0fc0606, 0x040f0606, 0xfffff9fa, 0x0605f9fa, 0xf9f9f9fa, + 0x07fdf9fa, 0xf801f9fa, 0xfe07f9fa, 0x01f7f9fa, 0x0d0cf9fa, 0xf2f2f9fa, 0x0f03f9fa, 0xf0fbf9fa, + 0x040ef9fa, 0x000007fe, 0x060607fe, 0xf9fa07fe, 0x07fe07fe, 0xf80207fe, 0xfe0807fe, 0x01f807fe, + 0x0d0d07fe, 0xf2f307fe, 0x0f0407fe, 0xf0fc07fe, 0x040f07fe, 0xfffff802, 0x0605f802, 0xf9f9f802, + 0x07fdf802, 0xf801f802, 0xfe07f802, 0x01f7f802, 0x0d0cf802, 0xf2f2f802, 0x0f03f802, 0xf0fbf802, + 0x040ef802, 0xfffffe08, 0x0605fe08, 0xf9f9fe08, 0x07fdfe08, 0xf801fe08, 0xfe07fe08, 0x01f7fe08, + 0x0d0cfe08, 0xf2f2fe08, 0x0f03fe08, 0xf0fbfe08, 0x040efe08, 0x000001f8, 0x060601f8, 0xf9fa01f8, + 0x07fe01f8, 0xf80201f8, 0xfe0801f8, 0x01f801f8, 0x0d0d01f8, 0xf2f301f8, 0x0f0401f8, 0xf0fc01f8, + 0x040f01f8, 0x00000d0d, 0x06060d0d, 0xf9fa0d0d, 0x07fe0d0d, 0xf8020d0d, 0xfe080d0d, 0x01f80d0d, + 0x0d0d0d0d, 0xf2f30d0d, 0x0f040d0d, 0xf0fc0d0d, 0x040f0d0d, 0xfffff2f3, 0x0605f2f3, 0xf9f9f2f3, + 0x07fdf2f3, 0xf801f2f3, 0xfe07f2f3, 0x01f7f2f3, 0x0d0cf2f3, 0xf2f2f2f3, 0x0f03f2f3, 0xf0fbf2f3, + 0x040ef2f3, 0x00000f04, 0x06060f04, 0xf9fa0f04, 0x07fe0f04, 0xf8020f04, 0xfe080f04, 0x01f80f04, + 0x0d0d0f04, 0xf2f30f04, 0x0f040f04, 0xf0fc0f04, 0x040f0f04, 0xfffff0fc, 0x0605f0fc, 0xf9f9f0fc, + 0x07fdf0fc, 0xf801f0fc, 0xfe07f0fc, 0x01f7f0fc, 0x0d0cf0fc, 0xf2f2f0fc, 0x0f03f0fc, 0xf0fbf0fc, + 0x040ef0fc, 0x0000040f, 0x0606040f, 0xf9fa040f, 0x07fe040f, 0xf802040f, 0xfe08040f, 0x01f8040f, + 0x0d0d040f, 0xf2f3040f, 0x0f04040f, 0xf0fc040f, 0x040f040f, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000707, 0xfffff8f9, 0x000009fd, 0xfffff603, 0xfffffd0a, 0x000002f6, 0x00001010, + 0xffffeff0, 0x00001205, 0xffffedfb, 0x00000512, 0xfffffaee, 0x00000cf3, 0xfffff30d, 0x000014fa, + 0xffffeb06, 0xfffffa15, 0x000005eb, 0x00001e0f, 0xffffe1f1, 0x00000f1e, 0xfffff0e2, 0x00001e1e, + 0xffffe1e2, 0x00002202, 0xffffddfe, 0x00000222, 0xfffffdde, 0x00001bed, 0xffffe413, 0xffffed1c, + 0x000012e4, 0x00003620, 0xffffc9e0, 0x00002036, 0xffffdfca, 0x000028f5, 0xffffd70b, 0xfffff529, + 0x00000ad7, 0x0000370f, 0xffffc8f1, 0x00000f37, 0xfffff0c9, 0x00003939, 0xffffc6c7, 0x00003eff, + 0xffffc101, 0xffffff3f, 0x000000c1, 0x000027d8, 0xffffd828, 0x000036e2, 0xffffc91e, 0xffffe237, + 0x00001dc9, 0x00005e25, 0xffffa1db, 0x0000255e, 0xffffdaa2, 0x00006041, 0xffff9fbf, 0x00004160, + 0xffffbea0, 0x00004deb, 0xffffb215, 0xffffeb4e, 0x000014b2, 0x0000640f, 0xffff9bf1, 0x00000f64, + 0xfffff09c, 0x00006a6a, 0xffff9596, 0x000073f8, 0xffff8c08, 0xfffff874, 0x0000078c, 0x00004ec1, + 0xffffb13f, 0xffffc14f, 0x00003eb1, 0x000068cd, 0xffff9733, 0xffffcd69, 0x00003297, 0x00007788, + 0xffff8878, 0x00002b2b, 0xffffd4d5, 0x00005050, 0xffffafb0, 0x00000000, 0x07070000, 0xf8f90000, + 0x09fd0000, 0xf6030000, 0xfd0a0000, 0x02f60000, 0x10100000, 0xeff00000, 0x12050000, 0xedfb0000, + 0x05120000, 0x00000707, 0x07070707, 0xf8f90707, 0x09fd0707, 0xf6030707, 0xfd0a0707, 0x02f60707, + 0x10100707, 0xeff00707, 0x12050707, 0xedfb0707, 0x05120707, 0xfffff8f9, 0x0706f8f9, 0xf8f8f8f9, + 0x09fcf8f9, 0xf602f8f9, 0xfd09f8f9, 0x02f5f8f9, 0x100ff8f9, 0xefeff8f9, 0x1204f8f9, 0xedfaf8f9, + 0x0511f8f9, 0x000009fd, 0x070709fd, 0xf8f909fd, 0x09fd09fd, 0xf60309fd, 0xfd0a09fd, 0x02f609fd, + 0x101009fd, 0xeff009fd, 0x120509fd, 0xedfb09fd, 0x051209fd, 0xfffff603, 0x0706f603, 0xf8f8f603, + 0x09fcf603, 0xf602f603, 0xfd09f603, 0x02f5f603, 0x100ff603, 0xefeff603, 0x1204f603, 0xedfaf603, + 0x0511f603, 0xfffffd0a, 0x0706fd0a, 0xf8f8fd0a, 0x09fcfd0a, 0xf602fd0a, 0xfd09fd0a, 0x02f5fd0a, + 0x100ffd0a, 0xefeffd0a, 0x1204fd0a, 0xedfafd0a, 0x0511fd0a, 0x000002f6, 0x070702f6, 0xf8f902f6, + 0x09fd02f6, 0xf60302f6, 0xfd0a02f6, 0x02f602f6, 0x101002f6, 0xeff002f6, 0x120502f6, 0xedfb02f6, + 0x051202f6, 0x00001010, 0x07071010, 0xf8f91010, 0x09fd1010, 0xf6031010, 0xfd0a1010, 0x02f61010, + 0x10101010, 0xeff01010, 0x12051010, 0xedfb1010, 0x05121010, 0xffffeff0, 0x0706eff0, 0xf8f8eff0, + 0x09fceff0, 0xf602eff0, 0xfd09eff0, 0x02f5eff0, 0x100feff0, 0xefefeff0, 0x1204eff0, 0xedfaeff0, + 0x0511eff0, 0x00001205, 0x07071205, 0xf8f91205, 0x09fd1205, 0xf6031205, 0xfd0a1205, 0x02f61205, + 0x10101205, 0xeff01205, 0x12051205, 0xedfb1205, 0x05121205, 0xffffedfb, 0x0706edfb, 0xf8f8edfb, + 0x09fcedfb, 0xf602edfb, 0xfd09edfb, 0x02f5edfb, 0x100fedfb, 0xefefedfb, 0x1204edfb, 0xedfaedfb, + 0x0511edfb, 0x00000512, 0x07070512, 0xf8f90512, 0x09fd0512, 0xf6030512, 0xfd0a0512, 0x02f60512, + 0x10100512, 0xeff00512, 0x12050512, 0xedfb0512, 0x05120512, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000808, 0xfffff7f8, 0x00000afd, 0xfffff503, 0xfffffd0b, 0x000002f5, 0x00001212, + 0xffffedee, 0x00001405, 0xffffebfb, 0x00000514, 0xfffffaec, 0x00000ef1, 0xfffff10f, 0x000017f9, + 0xffffe807, 0xfffff918, 0x000006e8, 0x00002311, 0xffffdcef, 0x00001123, 0xffffeedd, 0x00002222, + 0xffffddde, 0x00002603, 0xffffd9fd, 0x00000326, 0xfffffcda, 0x00001fea, 0xffffe016, 0xffffea20, + 0x000015e0, 0x00003d25, 0xffffc2db, 0x0000253d, 0xffffdac3, 0x00002ef3, 0xffffd10d, 0xfffff32f, + 0x00000cd1, 0x00003f11, 0xffffc0ef, 0x0000113f, 0xffffeec1, 0x00004141, 0xffffbebf, 0x000047ff, + 0xffffb801, 0xffffff48, 0x000000b8, 0x00002dd2, 0xffffd22e, 0x00003edd, 0xffffc123, 0xffffdd3f, + 0x000022c1, 0x00006b2b, 0xffff94d5, 0x00002b6b, 0xffffd495, 0x00006e4b, 0xffff91b5, 0x00004b6e, + 0xffffb492, 0x000058e8, 0xffffa718, 0xffffe859, 0x000017a7, 0x00007211, 0xffff8def, 0x00001172, + 0xffffee8e, 0x00007979, 0xffff8687, 0x00005ab8, 0xffffa548, 0xffffb85b, 0x000047a5, 0x000077c6, + 0xffff883a, 0xffffc678, 0x00003988, 0x00003131, 0xffffcecf, 0x00005c5c, 0xffffa3a4, 0x00000000, + 0x08080000, 0xf7f80000, 0x0afd0000, 0xf5030000, 0xfd0b0000, 0x02f50000, 0x12120000, 0xedee0000, + 0x14050000, 0xebfb0000, 0x05140000, 0x00000808, 0x08080808, 0xf7f80808, 0x0afd0808, 0xf5030808, + 0xfd0b0808, 0x02f50808, 0x12120808, 0xedee0808, 0x14050808, 0xebfb0808, 0x05140808, 0xfffff7f8, + 0x0807f7f8, 0xf7f7f7f8, 0x0afcf7f8, 0xf502f7f8, 0xfd0af7f8, 0x02f4f7f8, 0x1211f7f8, 0xededf7f8, + 0x1404f7f8, 0xebfaf7f8, 0x0513f7f8, 0x00000afd, 0x08080afd, 0xf7f80afd, 0x0afd0afd, 0xf5030afd, + 0xfd0b0afd, 0x02f50afd, 0x12120afd, 0xedee0afd, 0x14050afd, 0xebfb0afd, 0x05140afd, 0xfffff503, + 0x0807f503, 0xf7f7f503, 0x0afcf503, 0xf502f503, 0xfd0af503, 0x02f4f503, 0x1211f503, 0xededf503, + 0x1404f503, 0xebfaf503, 0x0513f503, 0xfffffd0b, 0x0807fd0b, 0xf7f7fd0b, 0x0afcfd0b, 0xf502fd0b, + 0xfd0afd0b, 0x02f4fd0b, 0x1211fd0b, 0xededfd0b, 0x1404fd0b, 0xebfafd0b, 0x0513fd0b, 0x000002f5, + 0x080802f5, 0xf7f802f5, 0x0afd02f5, 0xf50302f5, 0xfd0b02f5, 0x02f502f5, 0x121202f5, 0xedee02f5, + 0x140502f5, 0xebfb02f5, 0x051402f5, 0x00001212, 0x08081212, 0xf7f81212, 0x0afd1212, 0xf5031212, + 0xfd0b1212, 0x02f51212, 0x12121212, 0xedee1212, 0x14051212, 0xebfb1212, 0x05141212, 0xffffedee, + 0x0807edee, 0xf7f7edee, 0x0afcedee, 0xf502edee, 0xfd0aedee, 0x02f4edee, 0x1211edee, 0xedededee, + 0x1404edee, 0xebfaedee, 0x0513edee, 0x00001405, 0x08081405, 0xf7f81405, 0x0afd1405, 0xf5031405, + 0xfd0b1405, 0x02f51405, 0x12121405, 0xedee1405, 0x14051405, 0xebfb1405, 0x05141405, 0xffffebfb, + 0x0807ebfb, 0xf7f7ebfb, 0x0afcebfb, 0xf502ebfb, 0xfd0aebfb, 0x02f4ebfb, 0x1211ebfb, 0xededebfb, + 0x1404ebfb, 0xebfaebfb, 0x0513ebfb, 0x00000514, 0x08080514, 0xf7f80514, 0x0afd0514, 0xf5030514, + 0xfd0b0514, 0x02f50514, 0x12120514, 0xedee0514, 0x14050514, 0xebfb0514, 0x05140514, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000909, 0xfffff6f7, 0x00000bfd, 0xfffff403, 0xfffffd0c, 0x000002f4, 0x00001414, + 0xffffebec, 0x00001706, 0xffffe8fa, 0x00000617, 0xfffff9e9, 0x000010ef, 0xffffef11, 0x00001af9, + 0xffffe507, 0xfffff91b, 0x000006e5, 0x00002713, 0xffffd8ed, 0x00001327, 0xffffecd9, 0x00002727, + 0xffffd8d9, 0x00002b03, 0xffffd4fd, 0x0000032b, 0xfffffcd5, 0x000023e8, 0xffffdc18, 0xffffe824, + 0x000017dc, 0x0000452a, 0xffffbad6, 0x00002a45, 0xffffd5bb, 0x000034f2, 0xffffcb0e, 0xfffff235, + 0x00000dcb, 0x00004713, 0xffffb8ed, 0x00001347, 0xffffecb9, 0x00004949, 0xffffb6b7, 0x00004ffe, + 0xffffb002, 0xfffffe50, 0x000001b0, 0x000033cc, 0xffffcc34, 0x000045d9, 0xffffba27, 0xffffd946, + 0x000026ba, 0x00007930, 0xffff86d0, 0x00003079, 0xffffcf87, 0x00007c54, 0xffff83ac, 0x0000547c, + 0xffffab84, 0x000063e5, 0xffff9c1b, 0xffffe564, 0x00001a9c, 0x000065af, 0xffff9a51, 0xffffaf66, + 0x0000509a, 0x00003737, 0xffffc8c9, 0x00006868, 0xffff9798, 0x00000000, 0x09090000, 0xf6f70000, + 0x0bfd0000, 0xf4030000, 0xfd0c0000, 0x02f40000, 0x14140000, 0xebec0000, 0x17060000, 0xe8fa0000, + 0x06170000, 0xf9e90000, 0x00000909, 0x09090909, 0xf6f70909, 0x0bfd0909, 0xf4030909, 0xfd0c0909, + 0x02f40909, 0x14140909, 0xebec0909, 0x17060909, 0xe8fa0909, 0x06170909, 0xf9e90909, 0xfffff6f7, + 0x0908f6f7, 0xf6f6f6f7, 0x0bfcf6f7, 0xf402f6f7, 0xfd0bf6f7, 0x02f3f6f7, 0x1413f6f7, 0xebebf6f7, + 0x1705f6f7, 0xe8f9f6f7, 0x0616f6f7, 0xf9e8f6f7, 0x00000bfd, 0x09090bfd, 0xf6f70bfd, 0x0bfd0bfd, + 0xf4030bfd, 0xfd0c0bfd, 0x02f40bfd, 0x14140bfd, 0xebec0bfd, 0x17060bfd, 0xe8fa0bfd, 0x06170bfd, + 0xf9e90bfd, 0xfffff403, 0x0908f403, 0xf6f6f403, 0x0bfcf403, 0xf402f403, 0xfd0bf403, 0x02f3f403, + 0x1413f403, 0xebebf403, 0x1705f403, 0xe8f9f403, 0x0616f403, 0xf9e8f403, 0xfffffd0c, 0x0908fd0c, + 0xf6f6fd0c, 0x0bfcfd0c, 0xf402fd0c, 0xfd0bfd0c, 0x02f3fd0c, 0x1413fd0c, 0xebebfd0c, 0x1705fd0c, + 0xe8f9fd0c, 0x0616fd0c, 0xf9e8fd0c, 0x000002f4, 0x090902f4, 0xf6f702f4, 0x0bfd02f4, 0xf40302f4, + 0xfd0c02f4, 0x02f402f4, 0x141402f4, 0xebec02f4, 0x170602f4, 0xe8fa02f4, 0x061702f4, 0xf9e902f4, + 0x00001414, 0x09091414, 0xf6f71414, 0x0bfd1414, 0xf4031414, 0xfd0c1414, 0x02f41414, 0x14141414, + 0xebec1414, 0x17061414, 0xe8fa1414, 0x06171414, 0xf9e91414, 0xffffebec, 0x0908ebec, 0xf6f6ebec, + 0x0bfcebec, 0xf402ebec, 0xfd0bebec, 0x02f3ebec, 0x1413ebec, 0xebebebec, 0x1705ebec, 0xe8f9ebec, + 0x0616ebec, 0xf9e8ebec, 0x00001706, 0x09091706, 0xf6f71706, 0x0bfd1706, 0xf4031706, 0xfd0c1706, + 0x02f41706, 0x14141706, 0xebec1706, 0x17061706, 0xe8fa1706, 0x06171706, 0xf9e91706, 0xffffe8fa, + 0x0908e8fa, 0xf6f6e8fa, 0x0bfce8fa, 0xf402e8fa, 0xfd0be8fa, 0x02f3e8fa, 0x1413e8fa, 0xebebe8fa, + 0x1705e8fa, 0xe8f9e8fa, 0x0616e8fa, 0xf9e8e8fa, 0x00000617, 0x09090617, 0xf6f70617, 0x0bfd0617, + 0xf4030617, 0xfd0c0617, 0x02f40617, 0x14140617, 0xebec0617, 0x17060617, 0xe8fa0617, 0x06170617, + 0xf9e90617, 0xfffff9e9, 0x0908f9e9, 0xf6f6f9e9, 0x0bfcf9e9, 0xf402f9e9, 0xfd0bf9e9, 0x02f3f9e9, + 0x1413f9e9, 0xebebf9e9, 0x1705f9e9, 0xe8f9f9e9, 0x0616f9e9, 0xf9e8f9e9, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, + 0xfffffbfc, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x000003fc, 0xfffffc04, 0x000005fe, + 0xfffffa02, 0xfffffe06, 0x000001fa, 0x00000804, 0xfffff7fc, 0x00000408, 0xfffffbf8, 0x00000808, + 0xfffff7f8, 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x000007fc, 0xfffff804, 0xfffffc08, + 0x000003f8, 0x00000e08, 0xfffff1f8, 0x0000080e, 0xfffff7f2, 0x00000bfe, 0xfffff402, 0xfffffe0c, + 0x000001f4, 0x00001004, 0xffffeffc, 0x00000410, 0xfffffbf0, 0x00001010, 0xffffeff0, 0x00001200, + 0xffffee00, 0x00000012, 0xffffffee, 0x00000bf4, 0xfffff40c, 0x00000ff8, 0xfffff008, 0xfffff810, + 0x000007f0, 0x00001a0a, 0xffffe5f6, 0x00000a1a, 0xfffff5e6, 0x00001c12, 0xffffe3ee, 0x0000121c, + 0xffffede4, 0x000015fa, 0xffffea06, 0xfffffa16, 0x000005ea, 0x00001c04, 0xffffe3fc, 0x0000041c, + 0xfffffbe4, 0x00001e1e, 0xffffe1e2, 0x00001ffe, 0xffffe002, 0xfffffe20, 0x000001e0, 0x000015ee, + 0xffffea12, 0xffffee16, 0x000011ea, 0x00001df2, 0xffffe20e, 0xfffff21e, 0x00000de2, 0x00002e16, + 0xffffd1ea, 0x0000162e, 0xffffe9d2, 0x00002e0c, 0xffffd1f4, 0x00000c2e, 0xfffff3d2, 0x00003022, + 0xffffcfde, 0x00002230, 0xffffddd0, 0x000027f6, 0xffffd80a, 0xfffff628, 0x000009d8, 0x00003204, + 0xffffcdfc, 0x00000432, 0xfffffbce, 0x00003636, 0xffffc9ca, 0x000021de, 0xffffde22, 0x000029e4, + 0xffffd61c, 0xffffe42a, 0x00001bd6, 0x00003bfa, 0xffffc406, 0xfffffa3c, 0x000005c4, 0x00004c1a, + 0xffffb3e6, 0x00001a4c, 0xffffe5b4, 0x00004c2a, 0xffffb3d6, 0x00002a4c, 0xffffd5b4, 0x000035e8, + 0xffffca18, 0xffffe836, 0x000017ca, 0x00004e0e, 0xffffb1f2, 0x00000e4e, 0xfffff1b2, 0x0000523e, + 0xffffadc2, 0x00003e52, 0xffffc1ae, 0x000049ec, 0xffffb614, 0xffffec4a, 0x000013b6, 0x00005802, + 0xffffa7fe, 0x00000258, 0xfffffda8, 0x00005c5c, 0xffffa3a4, 0x00003bcc, 0xffffc434, 0xffffcc3c, + 0x000033c4, 0x00007634, 0xffff89cc, 0x00003476, 0xffffcb8a, 0x000049d4, 0xffffb62c, 0xffffd44a, + 0x00002bb6, 0x0000764a, 0xffff89b6, 0x00004a76, 0xffffb58a, 0x00007620, 0xffff89e0, 0x00002076, + 0xffffdf8a, 0x000065f4, 0xffff9a0c, 0xfffff466, 0x00000b9a, 0x00005fd8, 0xffffa028, 0xffffd860, + 0x000027a0, 0x000075de, 0xffff8a22, 0xffffde76, 0x0000218a, 0x000057a8, 0xffffa858, 0x000067b2, + 0xffff984e, 0xffffb268, 0x00004d98, 0x00000c0c, 0xfffff3f4, 0x00001616, 0xffffe9ea, 0x00002a2a, + 0xffffd5d6, 0x00004848, 0xffffb7b8, 0x00000000, 0x02020000, 0xfdfe0000, 0x02000000, 0xfe000000, + 0x00020000, 0xfffe0000, 0x00000202, 0x02020202, 0xfdfe0202, 0x02000202, 0xfe000202, 0x00020202, + 0xfffe0202, 0xfffffdfe, 0x0201fdfe, 0xfdfdfdfe, 0x01fffdfe, 0xfdfffdfe, 0x0001fdfe, 0xfffdfdfe, + 0x00000200, 0x02020200, 0xfdfe0200, 0x02000200, 0xfe000200, 0x00020200, 0xfffe0200, 0xfffffe00, + 0x0201fe00, 0xfdfdfe00, 0x01fffe00, 0xfdfffe00, 0x0001fe00, 0xfffdfe00, 0x00000002, 0x02020002, + 0xfdfe0002, 0x02000002, 0xfe000002, 0x00020002, 0xfffe0002, 0xfffffffe, 0x0201fffe, 0xfdfdfffe, + 0x01fffffe, 0xfdfffffe, 0x0001fffe, 0xfffdfffe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000303, 0xfffffcfd, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, + 0xfffff9fa, 0x00000903, 0xfffff6fd, 0x00000309, 0xfffffcf7, 0x000008fd, 0xfffff703, 0xfffffd09, + 0x000002f7, 0x000005fa, 0xfffffa06, 0x00000c06, 0xfffff3fa, 0x0000060c, 0xfffff9f4, 0x00000c0c, + 0xfffff3f4, 0x00000f00, 0xfffff100, 0x0000000f, 0xfffffff1, 0x00000bf7, 0xfffff409, 0xfffff70c, + 0x000008f4, 0x0000180f, 0xffffe7f1, 0x00000f18, 0xfffff0e8, 0x000011fa, 0xffffee06, 0xfffffa12, + 0x000005ee, 0x00001806, 0xffffe7fa, 0x00000618, 0xfffff9e8, 0x00001818, 0xffffe7e8, 0x00001b00, + 0xffffe500, 0x0000001b, 0xffffffe5, 0x000011ee, 0xffffee12, 0x000017f4, 0xffffe80c, 0xfffff418, + 0x00000be8, 0x0000270f, 0xffffd8f1, 0x00000f27, 0xfffff0d9, 0x00002a1b, 0xffffd5e5, 0x00001b2a, + 0xffffe4d6, 0x000020f7, 0xffffdf09, 0xfffff721, 0x000008df, 0x00002a06, 0xffffd5fa, 0x0000062a, + 0xfffff9d6, 0x00002d2d, 0xffffd2d3, 0x000032fd, 0xffffcd03, 0xfffffd33, 0x000002cd, 0x000020e5, + 0xffffdf1b, 0xffffe521, 0x00001adf, 0x00002ceb, 0xffffd315, 0xffffeb2d, 0x000014d3, 0x00004521, + 0xffffbadf, 0x00002145, 0xffffdebb, 0x00004512, 0xffffbaee, 0x00001245, 0xffffedbb, 0x00004836, + 0xffffb7ca, 0x00003648, 0xffffc9b8, 0x00003eee, 0xffffc112, 0xffffee3f, 0x000011c1, 0x00004e06, + 0xffffb1fa, 0x0000064e, 0xfffff9b2, 0x00005151, 0xffffaeaf, 0x000032cd, 0xffffcd33, 0x00003ed6, + 0xffffc12a, 0xffffd63f, 0x000029c1, 0x000059f7, 0xffffa609, 0xfffff75a, 0x000008a6, 0x0000722a, + 0xffff8dd6, 0x00002a72, 0xffffd58e, 0x0000753f, 0xffff8ac1, 0x00003f75, 0xffffc08b, 0x000050dc, + 0xffffaf24, 0xffffdc51, 0x000023af, 0x00007815, 0xffff87eb, 0x00001578, 0xffffea88, 0x00007b60, + 0xffff84a0, 0x0000607b, 0xffff9f85, 0x00006ee2, 0xffff911e, 0xffffe26f, 0x00001d91, 0x00005cb2, + 0xffffa34e, 0xffffb25d, 0x00004da3, 0x000071bb, 0xffff8e45, 0xffffbb72, 0x0000448e, 0x00001212, + 0xffffedee, 0x00002121, 0xffffdedf, 0x00003f3f, 0xffffc0c1, 0x00006c6c, 0xffff9394, 0x00000000, + 0x03030000, 0xfcfd0000, 0x03000000, 0xfd000000, 0x00030000, 0xfffd0000, 0x06060000, 0xf9fa0000, + 0x00000303, 0x03030303, 0xfcfd0303, 0x03000303, 0xfd000303, 0x00030303, 0xfffd0303, 0x06060303, + 0xf9fa0303, 0xfffffcfd, 0x0302fcfd, 0xfcfcfcfd, 0x02fffcfd, 0xfcfffcfd, 0x0002fcfd, 0xfffcfcfd, + 0x0605fcfd, 0xf9f9fcfd, 0x00000300, 0x03030300, 0xfcfd0300, 0x03000300, 0xfd000300, 0x00030300, + 0xfffd0300, 0x06060300, 0xf9fa0300, 0xfffffd00, 0x0302fd00, 0xfcfcfd00, 0x02fffd00, 0xfcfffd00, + 0x0002fd00, 0xfffcfd00, 0x0605fd00, 0xf9f9fd00, 0x00000003, 0x03030003, 0xfcfd0003, 0x03000003, + 0xfd000003, 0x00030003, 0xfffd0003, 0x06060003, 0xf9fa0003, 0xfffffffd, 0x0302fffd, 0xfcfcfffd, + 0x02fffffd, 0xfcfffffd, 0x0002fffd, 0xfffcfffd, 0x0605fffd, 0xf9f9fffd, 0x00000606, 0x03030606, + 0xfcfd0606, 0x03000606, 0xfd000606, 0x00030606, 0xfffd0606, 0x06060606, 0xf9fa0606, 0xfffff9fa, + 0x0302f9fa, 0xfcfcf9fa, 0x02fff9fa, 0xfcfff9fa, 0x0002f9fa, 0xfffcf9fa, 0x0605f9fa, 0xf9f9f9fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000404, 0xfffffbfc, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000804, + 0xfffff7fc, 0x00000408, 0xfffffbf8, 0x00000808, 0xfffff7f8, 0x000007f8, 0xfffff808, 0x00000bfc, + 0xfffff404, 0xfffffc0c, 0x000003f4, 0x00001008, 0xffffeff8, 0x00000810, 0xfffff7f0, 0x00001010, + 0xffffeff0, 0x00001400, 0xffffec00, 0x00000014, 0xffffffec, 0x00000ff4, 0xfffff00c, 0xfffff410, + 0x00000bf0, 0x000017fc, 0xffffe804, 0xfffffc18, 0x000003e8, 0x00002010, 0xffffdff0, 0x00001020, + 0xffffefe0, 0x00002008, 0xffffdff8, 0x00000820, 0xfffff7e0, 0x00002020, 0xffffdfe0, 0x00002400, + 0xffffdc00, 0x00000024, 0xffffffdc, 0x000017e8, 0xffffe818, 0x00001ff0, 0xffffe010, 0xfffff020, + 0x00000fe0, 0x00003414, 0xffffcbec, 0x00001434, 0xffffebcc, 0x00003824, 0xffffc7dc, 0x00002438, + 0xffffdbc8, 0x00002bf4, 0xffffd40c, 0xfffff42c, 0x00000bd4, 0x00003808, 0xffffc7f8, 0x00000838, + 0xfffff7c8, 0x00003c3c, 0xffffc3c4, 0x00003ffc, 0xffffc004, 0xfffffc40, 0x000003c0, 0x00002bdc, + 0xffffd424, 0xffffdc2c, 0x000023d4, 0x00003be4, 0xffffc41c, 0xffffe43c, 0x00001bc4, 0x00005c2c, + 0xffffa3d4, 0x00002c5c, 0xffffd3a4, 0x00005c18, 0xffffa3e8, 0x0000185c, 0xffffe7a4, 0x00006048, + 0xffff9fb8, 0x00004860, 0xffffb7a0, 0x000053ec, 0xffffac14, 0xffffec54, 0x000013ac, 0x00006408, + 0xffff9bf8, 0x00000864, 0xfffff79c, 0x00006c6c, 0xffff9394, 0x000043bc, 0xffffbc44, 0x000053c8, + 0xffffac38, 0xffffc854, 0x000037ac, 0x000077f4, 0xffff880c, 0xfffff478, 0x00000b88, 0x00006bd0, + 0xffff9430, 0xffffd06c, 0x00002f94, 0x00007b98, 0xffff8468, 0xffff987c, 0x00006784, 0x00001818, + 0xffffe7e8, 0x00002c2c, 0xffffd3d4, 0x00005454, 0xffffabac, 0x00000000, 0x04040000, 0xfbfc0000, + 0x04000000, 0xfc000000, 0x00040000, 0xfffc0000, 0x08040000, 0xf7fc0000, 0x04080000, 0x00000404, + 0x04040404, 0xfbfc0404, 0x04000404, 0xfc000404, 0x00040404, 0xfffc0404, 0x08040404, 0xf7fc0404, + 0x04080404, 0xfffffbfc, 0x0403fbfc, 0xfbfbfbfc, 0x03fffbfc, 0xfbfffbfc, 0x0003fbfc, 0xfffbfbfc, + 0x0803fbfc, 0xf7fbfbfc, 0x0407fbfc, 0x00000400, 0x04040400, 0xfbfc0400, 0x04000400, 0xfc000400, + 0x00040400, 0xfffc0400, 0x08040400, 0xf7fc0400, 0x04080400, 0xfffffc00, 0x0403fc00, 0xfbfbfc00, + 0x03fffc00, 0xfbfffc00, 0x0003fc00, 0xfffbfc00, 0x0803fc00, 0xf7fbfc00, 0x0407fc00, 0x00000004, + 0x04040004, 0xfbfc0004, 0x04000004, 0xfc000004, 0x00040004, 0xfffc0004, 0x08040004, 0xf7fc0004, + 0x04080004, 0xfffffffc, 0x0403fffc, 0xfbfbfffc, 0x03fffffc, 0xfbfffffc, 0x0003fffc, 0xfffbfffc, + 0x0803fffc, 0xf7fbfffc, 0x0407fffc, 0x00000804, 0x04040804, 0xfbfc0804, 0x04000804, 0xfc000804, + 0x00040804, 0xfffc0804, 0x08040804, 0xf7fc0804, 0x04080804, 0xfffff7fc, 0x0403f7fc, 0xfbfbf7fc, + 0x03fff7fc, 0xfbfff7fc, 0x0003f7fc, 0xfffbf7fc, 0x0803f7fc, 0xf7fbf7fc, 0x0407f7fc, 0x00000408, + 0x04040408, 0xfbfc0408, 0x04000408, 0xfc000408, 0x00040408, 0xfffc0408, 0x08040408, 0xf7fc0408, + 0x04080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000505, 0xfffffafb, 0x00000500, 0xfffffb00, 0x00000005, 0xfffffffb, 0x00000a0a, + 0xfffff5f6, 0x00000f05, 0xfffff0fb, 0x0000050f, 0xfffffaf1, 0x000009f6, 0xfffff60a, 0x00000efb, + 0xfffff105, 0xfffffb0f, 0x000004f1, 0x0000140a, 0xffffebf6, 0x00000a14, 0xfffff5ec, 0x00001414, + 0xffffebec, 0x00001900, 0xffffe700, 0x00000019, 0xffffffe7, 0x000013f1, 0xffffec0f, 0xfffff114, + 0x00000eec, 0x00002819, 0xffffd7e7, 0x00001928, 0xffffe6d8, 0x00001df6, 0xffffe20a, 0xfffff61e, + 0x000009e2, 0x0000280a, 0xffffd7f6, 0x00000a28, 0xfffff5d8, 0x00002828, 0xffffd7d8, 0x00002d00, + 0xffffd300, 0x0000002d, 0xffffffd3, 0x00001de2, 0xffffe21e, 0x000027ec, 0xffffd814, 0xffffec28, + 0x000013d8, 0x00004119, 0xffffbee7, 0x00001941, 0xffffe6bf, 0x0000462d, 0xffffb9d3, 0x00002d46, + 0xffffd2ba, 0x000036f1, 0xffffc90f, 0xfffff137, 0x00000ec9, 0x0000460a, 0xffffb9f6, 0x00000a46, + 0xfffff5ba, 0x00004b4b, 0xffffb4b5, 0x000054fb, 0xffffab05, 0xfffffb55, 0x000004ab, 0x000036d3, + 0xffffc92d, 0xffffd337, 0x00002cc9, 0x00004add, 0xffffb523, 0xffffdd4b, 0x000022b5, 0x00007337, + 0xffff8cc9, 0x00003773, 0xffffc88d, 0x0000731e, 0xffff8ce2, 0x00001e73, 0xffffe18d, 0x0000785a, + 0xffff87a6, 0x00005a78, 0xffffa588, 0x000068e2, 0xffff971e, 0xffffe269, 0x00001d97, 0x000054ab, + 0xffffab55, 0x000068ba, 0xffff9746, 0xffffba69, 0x00004597, 0x00001e1e, 0xffffe1e2, 0x00003c3c, + 0xffffc3c4, 0x00006969, 0xffff9697, 0x00000000, 0x05050000, 0xfafb0000, 0x05000000, 0xfb000000, + 0x00050000, 0xfffb0000, 0x0a0a0000, 0xf5f60000, 0x0f050000, 0xf0fb0000, 0x00000505, 0x05050505, + 0xfafb0505, 0x05000505, 0xfb000505, 0x00050505, 0xfffb0505, 0x0a0a0505, 0xf5f60505, 0x0f050505, + 0xf0fb0505, 0xfffffafb, 0x0504fafb, 0xfafafafb, 0x04fffafb, 0xfafffafb, 0x0004fafb, 0xfffafafb, + 0x0a09fafb, 0xf5f5fafb, 0x0f04fafb, 0xf0fafafb, 0x00000500, 0x05050500, 0xfafb0500, 0x05000500, + 0xfb000500, 0x00050500, 0xfffb0500, 0x0a0a0500, 0xf5f60500, 0x0f050500, 0xf0fb0500, 0xfffffb00, + 0x0504fb00, 0xfafafb00, 0x04fffb00, 0xfafffb00, 0x0004fb00, 0xfffafb00, 0x0a09fb00, 0xf5f5fb00, + 0x0f04fb00, 0xf0fafb00, 0x00000005, 0x05050005, 0xfafb0005, 0x05000005, 0xfb000005, 0x00050005, + 0xfffb0005, 0x0a0a0005, 0xf5f60005, 0x0f050005, 0xf0fb0005, 0xfffffffb, 0x0504fffb, 0xfafafffb, + 0x04fffffb, 0xfafffffb, 0x0004fffb, 0xfffafffb, 0x0a09fffb, 0xf5f5fffb, 0x0f04fffb, 0xf0fafffb, + 0x00000a0a, 0x05050a0a, 0xfafb0a0a, 0x05000a0a, 0xfb000a0a, 0x00050a0a, 0xfffb0a0a, 0x0a0a0a0a, + 0xf5f60a0a, 0x0f050a0a, 0xf0fb0a0a, 0xfffff5f6, 0x0504f5f6, 0xfafaf5f6, 0x04fff5f6, 0xfafff5f6, + 0x0004f5f6, 0xfffaf5f6, 0x0a09f5f6, 0xf5f5f5f6, 0x0f04f5f6, 0xf0faf5f6, 0x00000f05, 0x05050f05, + 0xfafb0f05, 0x05000f05, 0xfb000f05, 0x00050f05, 0xfffb0f05, 0x0a0a0f05, 0xf5f60f05, 0x0f050f05, + 0xf0fb0f05, 0xfffff0fb, 0x0504f0fb, 0xfafaf0fb, 0x04fff0fb, 0xfafff0fb, 0x0004f0fb, 0xfffaf0fb, + 0x0a09f0fb, 0xf5f5f0fb, 0x0f04f0fb, 0xf0faf0fb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000606, 0xfffff9fa, 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x00000c0c, + 0xfffff3f4, 0x00000c06, 0xfffff3fa, 0x0000060c, 0xfffff9f4, 0x00000bf4, 0xfffff40c, 0x000011fa, + 0xffffee06, 0xfffffa12, 0x000005ee, 0x0000180c, 0xffffe7f4, 0x00000c18, 0xfffff3e8, 0x00001818, + 0xffffe7e8, 0x00001e00, 0xffffe200, 0x0000001e, 0xffffffe2, 0x000017ee, 0xffffe812, 0xffffee18, + 0x000011e8, 0x0000301e, 0xffffcfe2, 0x00001e30, 0xffffe1d0, 0x000023fa, 0xffffdc06, 0xfffffa24, + 0x000005dc, 0x0000300c, 0xffffcff4, 0x00000c30, 0xfffff3d0, 0x00003030, 0xffffcfd0, 0x00003600, + 0xffffca00, 0x00000036, 0xffffffca, 0x000023dc, 0xffffdc24, 0x00002fe8, 0xffffd018, 0xffffe830, + 0x000017d0, 0x00004e1e, 0xffffb1e2, 0x00001e4e, 0xffffe1b2, 0x00005436, 0xffffabca, 0x00003654, + 0xffffc9ac, 0x000041ee, 0xffffbe12, 0xffffee42, 0x000011be, 0x0000540c, 0xffffabf4, 0x00000c54, + 0xfffff3ac, 0x00005a5a, 0xffffa5a6, 0x00005ffa, 0xffffa006, 0xfffffa60, 0x000005a0, 0x000041ca, + 0xffffbe36, 0xffffca42, 0x000035be, 0x000059d6, 0xffffa62a, 0xffffd65a, 0x000029a6, 0x00007de2, + 0xffff821e, 0xffffe27e, 0x00001d82, 0x0000659a, 0xffff9a66, 0x00007dac, 0xffff8254, 0xffffac7e, + 0x00005382, 0x00002424, 0xffffdbdc, 0x00004242, 0xffffbdbe, 0x00000000, 0x06060000, 0xf9fa0000, + 0x06000000, 0xfa000000, 0x00060000, 0xfffa0000, 0x0c0c0000, 0xf3f40000, 0x0c060000, 0xf3fa0000, + 0x060c0000, 0x00000606, 0x06060606, 0xf9fa0606, 0x06000606, 0xfa000606, 0x00060606, 0xfffa0606, + 0x0c0c0606, 0xf3f40606, 0x0c060606, 0xf3fa0606, 0x060c0606, 0xfffff9fa, 0x0605f9fa, 0xf9f9f9fa, + 0x05fff9fa, 0xf9fff9fa, 0x0005f9fa, 0xfff9f9fa, 0x0c0bf9fa, 0xf3f3f9fa, 0x0c05f9fa, 0xf3f9f9fa, + 0x060bf9fa, 0x00000600, 0x06060600, 0xf9fa0600, 0x06000600, 0xfa000600, 0x00060600, 0xfffa0600, + 0x0c0c0600, 0xf3f40600, 0x0c060600, 0xf3fa0600, 0x060c0600, 0xfffffa00, 0x0605fa00, 0xf9f9fa00, + 0x05fffa00, 0xf9fffa00, 0x0005fa00, 0xfff9fa00, 0x0c0bfa00, 0xf3f3fa00, 0x0c05fa00, 0xf3f9fa00, + 0x060bfa00, 0x00000006, 0x06060006, 0xf9fa0006, 0x06000006, 0xfa000006, 0x00060006, 0xfffa0006, + 0x0c0c0006, 0xf3f40006, 0x0c060006, 0xf3fa0006, 0x060c0006, 0xfffffffa, 0x0605fffa, 0xf9f9fffa, + 0x05fffffa, 0xf9fffffa, 0x0005fffa, 0xfff9fffa, 0x0c0bfffa, 0xf3f3fffa, 0x0c05fffa, 0xf3f9fffa, + 0x060bfffa, 0x00000c0c, 0x06060c0c, 0xf9fa0c0c, 0x06000c0c, 0xfa000c0c, 0x00060c0c, 0xfffa0c0c, + 0x0c0c0c0c, 0xf3f40c0c, 0x0c060c0c, 0xf3fa0c0c, 0x060c0c0c, 0xfffff3f4, 0x0605f3f4, 0xf9f9f3f4, + 0x05fff3f4, 0xf9fff3f4, 0x0005f3f4, 0xfff9f3f4, 0x0c0bf3f4, 0xf3f3f3f4, 0x0c05f3f4, 0xf3f9f3f4, + 0x060bf3f4, 0x00000c06, 0x06060c06, 0xf9fa0c06, 0x06000c06, 0xfa000c06, 0x00060c06, 0xfffa0c06, + 0x0c0c0c06, 0xf3f40c06, 0x0c060c06, 0xf3fa0c06, 0x060c0c06, 0xfffff3fa, 0x0605f3fa, 0xf9f9f3fa, + 0x05fff3fa, 0xf9fff3fa, 0x0005f3fa, 0xfff9f3fa, 0x0c0bf3fa, 0xf3f3f3fa, 0x0c05f3fa, 0xf3f9f3fa, + 0x060bf3fa, 0x0000060c, 0x0606060c, 0xf9fa060c, 0x0600060c, 0xfa00060c, 0x0006060c, 0xfffa060c, + 0x0c0c060c, 0xf3f4060c, 0x0c06060c, 0xf3fa060c, 0x060c060c, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000707, 0xfffff8f9, 0x00000700, 0xfffff900, 0x00000007, 0xfffffff9, 0x00000e0e, + 0xfffff1f2, 0x00001507, 0xffffeaf9, 0x00000715, 0xfffff8eb, 0x00000df2, 0xfffff20e, 0x000014f9, + 0xffffeb07, 0xfffff915, 0x000006eb, 0x00001c0e, 0xffffe3f2, 0x00000e1c, 0xfffff1e4, 0x00001c1c, + 0xffffe3e4, 0x00002300, 0xffffdd00, 0x00000023, 0xffffffdd, 0x00001beb, 0xffffe415, 0xffffeb1c, + 0x000014e4, 0x00003823, 0xffffc7dd, 0x00002338, 0xffffdcc8, 0x000029f2, 0xffffd60e, 0xfffff22a, + 0x00000dd6, 0x0000380e, 0xffffc7f2, 0x00000e38, 0xfffff1c8, 0x00003838, 0xffffc7c8, 0x00003f00, + 0xffffc100, 0x0000003f, 0xffffffc1, 0x000029d6, 0xffffd62a, 0x000037e4, 0xffffc81c, 0xffffe438, + 0x00001bc8, 0x00005b23, 0xffffa4dd, 0x0000235b, 0xffffdca5, 0x0000623f, 0xffff9dc1, 0x00003f62, + 0xffffc09e, 0x00004ceb, 0xffffb315, 0xffffeb4d, 0x000014b3, 0x0000620e, 0xffff9df2, 0x00000e62, + 0xfffff19e, 0x00006969, 0xffff9697, 0x000076f9, 0xffff8907, 0xfffff977, 0x00000689, 0x00004cc1, + 0xffffb33f, 0xffffc14d, 0x00003eb3, 0x000068cf, 0xffff9731, 0xffffcf69, 0x00003097, 0x00007689, + 0xffff8977, 0x00002a2a, 0xffffd5d6, 0x00004d4d, 0xffffb2b3, 0x00000000, 0x07070000, 0xf8f90000, + 0x07000000, 0xf9000000, 0x00070000, 0xfff90000, 0x0e0e0000, 0xf1f20000, 0x15070000, 0xeaf90000, + 0x07150000, 0x00000707, 0x07070707, 0xf8f90707, 0x07000707, 0xf9000707, 0x00070707, 0xfff90707, + 0x0e0e0707, 0xf1f20707, 0x15070707, 0xeaf90707, 0x07150707, 0xfffff8f9, 0x0706f8f9, 0xf8f8f8f9, + 0x06fff8f9, 0xf8fff8f9, 0x0006f8f9, 0xfff8f8f9, 0x0e0df8f9, 0xf1f1f8f9, 0x1506f8f9, 0xeaf8f8f9, + 0x0714f8f9, 0x00000700, 0x07070700, 0xf8f90700, 0x07000700, 0xf9000700, 0x00070700, 0xfff90700, + 0x0e0e0700, 0xf1f20700, 0x15070700, 0xeaf90700, 0x07150700, 0xfffff900, 0x0706f900, 0xf8f8f900, + 0x06fff900, 0xf8fff900, 0x0006f900, 0xfff8f900, 0x0e0df900, 0xf1f1f900, 0x1506f900, 0xeaf8f900, + 0x0714f900, 0x00000007, 0x07070007, 0xf8f90007, 0x07000007, 0xf9000007, 0x00070007, 0xfff90007, + 0x0e0e0007, 0xf1f20007, 0x15070007, 0xeaf90007, 0x07150007, 0xfffffff9, 0x0706fff9, 0xf8f8fff9, + 0x06fffff9, 0xf8fffff9, 0x0006fff9, 0xfff8fff9, 0x0e0dfff9, 0xf1f1fff9, 0x1506fff9, 0xeaf8fff9, + 0x0714fff9, 0x00000e0e, 0x07070e0e, 0xf8f90e0e, 0x07000e0e, 0xf9000e0e, 0x00070e0e, 0xfff90e0e, + 0x0e0e0e0e, 0xf1f20e0e, 0x15070e0e, 0xeaf90e0e, 0x07150e0e, 0xfffff1f2, 0x0706f1f2, 0xf8f8f1f2, + 0x06fff1f2, 0xf8fff1f2, 0x0006f1f2, 0xfff8f1f2, 0x0e0df1f2, 0xf1f1f1f2, 0x1506f1f2, 0xeaf8f1f2, + 0x0714f1f2, 0x00001507, 0x07071507, 0xf8f91507, 0x07001507, 0xf9001507, 0x00071507, 0xfff91507, + 0x0e0e1507, 0xf1f21507, 0x15071507, 0xeaf91507, 0x07151507, 0xffffeaf9, 0x0706eaf9, 0xf8f8eaf9, + 0x06ffeaf9, 0xf8ffeaf9, 0x0006eaf9, 0xfff8eaf9, 0x0e0deaf9, 0xf1f1eaf9, 0x1506eaf9, 0xeaf8eaf9, + 0x0714eaf9, 0x00000715, 0x07070715, 0xf8f90715, 0x07000715, 0xf9000715, 0x00070715, 0xfff90715, + 0x0e0e0715, 0xf1f20715, 0x15070715, 0xeaf90715, 0x07150715, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000808, 0xfffff7f8, 0x00000800, 0xfffff800, 0x00000008, 0xfffffff8, 0x00001010, + 0xffffeff0, 0x00001008, 0xffffeff8, 0x00000810, 0xfffff7f0, 0x00000ff0, 0xfffff010, 0x000017f8, + 0xffffe808, 0xfffff818, 0x000007e8, 0x00002010, 0xffffdff0, 0x00001020, 0xffffefe0, 0x00002020, + 0xffffdfe0, 0x00002800, 0xffffd800, 0x00000028, 0xffffffd8, 0x00001fe8, 0xffffe018, 0xffffe820, + 0x000017e0, 0x00004028, 0xffffbfd8, 0x00002840, 0xffffd7c0, 0x00002ff0, 0xffffd010, 0xfffff030, + 0x00000fd0, 0x00004010, 0xffffbff0, 0x00001040, 0xffffefc0, 0x00004040, 0xffffbfc0, 0x00004800, + 0xffffb800, 0x00000048, 0xffffffb8, 0x00002fd0, 0xffffd030, 0x00003fe0, 0xffffc020, 0xffffe040, + 0x00001fc0, 0x00006828, 0xffff97d8, 0x00002868, 0xffffd798, 0x00007048, 0xffff8fb8, 0x00004870, + 0xffffb790, 0x000057e8, 0xffffa818, 0xffffe858, 0x000017a8, 0x00007010, 0xffff8ff0, 0x00001070, + 0xffffef90, 0x00007878, 0xffff8788, 0x000057b8, 0xffffa848, 0xffffb858, 0x000047a8, 0x000077c8, + 0xffff8838, 0xffffc878, 0x00003788, 0x00003030, 0xffffcfd0, 0x00005858, 0xffffa7a8, 0x00000000, + 0x08080000, 0xf7f80000, 0x08000000, 0xf8000000, 0x00080000, 0xfff80000, 0x10100000, 0xeff00000, + 0x10080000, 0xeff80000, 0x08100000, 0x00000808, 0x08080808, 0xf7f80808, 0x08000808, 0xf8000808, + 0x00080808, 0xfff80808, 0x10100808, 0xeff00808, 0x10080808, 0xeff80808, 0x08100808, 0xfffff7f8, + 0x0807f7f8, 0xf7f7f7f8, 0x07fff7f8, 0xf7fff7f8, 0x0007f7f8, 0xfff7f7f8, 0x100ff7f8, 0xefeff7f8, + 0x1007f7f8, 0xeff7f7f8, 0x080ff7f8, 0x00000800, 0x08080800, 0xf7f80800, 0x08000800, 0xf8000800, + 0x00080800, 0xfff80800, 0x10100800, 0xeff00800, 0x10080800, 0xeff80800, 0x08100800, 0xfffff800, + 0x0807f800, 0xf7f7f800, 0x07fff800, 0xf7fff800, 0x0007f800, 0xfff7f800, 0x100ff800, 0xefeff800, + 0x1007f800, 0xeff7f800, 0x080ff800, 0x00000008, 0x08080008, 0xf7f80008, 0x08000008, 0xf8000008, + 0x00080008, 0xfff80008, 0x10100008, 0xeff00008, 0x10080008, 0xeff80008, 0x08100008, 0xfffffff8, + 0x0807fff8, 0xf7f7fff8, 0x07fffff8, 0xf7fffff8, 0x0007fff8, 0xfff7fff8, 0x100ffff8, 0xefeffff8, + 0x1007fff8, 0xeff7fff8, 0x080ffff8, 0x00001010, 0x08081010, 0xf7f81010, 0x08001010, 0xf8001010, + 0x00081010, 0xfff81010, 0x10101010, 0xeff01010, 0x10081010, 0xeff81010, 0x08101010, 0xffffeff0, + 0x0807eff0, 0xf7f7eff0, 0x07ffeff0, 0xf7ffeff0, 0x0007eff0, 0xfff7eff0, 0x100feff0, 0xefefeff0, + 0x1007eff0, 0xeff7eff0, 0x080feff0, 0x00001008, 0x08081008, 0xf7f81008, 0x08001008, 0xf8001008, + 0x00081008, 0xfff81008, 0x10101008, 0xeff01008, 0x10081008, 0xeff81008, 0x08101008, 0xffffeff8, + 0x0807eff8, 0xf7f7eff8, 0x07ffeff8, 0xf7ffeff8, 0x0007eff8, 0xfff7eff8, 0x100feff8, 0xefefeff8, + 0x1007eff8, 0xeff7eff8, 0x080feff8, 0x00000810, 0x08080810, 0xf7f80810, 0x08000810, 0xf8000810, + 0x00080810, 0xfff80810, 0x10100810, 0xeff00810, 0x10080810, 0xeff80810, 0x08100810, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000909, 0xfffff6f7, 0x00000900, 0xfffff700, 0x00000009, 0xfffffff7, 0x00001212, + 0xffffedee, 0x00001b09, 0xffffe4f7, 0x0000091b, 0xfffff6e5, 0x000011ee, 0xffffee12, 0x00001af7, + 0xffffe509, 0xfffff71b, 0x000008e5, 0x00002412, 0xffffdbee, 0x00001224, 0xffffeddc, 0x00002424, + 0xffffdbdc, 0x00002d00, 0xffffd300, 0x0000002d, 0xffffffd3, 0x000023e5, 0xffffdc1b, 0xffffe524, + 0x00001adc, 0x0000482d, 0xffffb7d3, 0x00002d48, 0xffffd2b8, 0x000035ee, 0xffffca12, 0xffffee36, + 0x000011ca, 0x00004812, 0xffffb7ee, 0x00001248, 0xffffedb8, 0x00004848, 0xffffb7b8, 0x00005100, + 0xffffaf00, 0x00000051, 0xffffffaf, 0x000035ca, 0xffffca36, 0x000047dc, 0xffffb824, 0xffffdc48, + 0x000023b8, 0x0000752d, 0xffff8ad3, 0x00002d75, 0xffffd28b, 0x00007e51, 0xffff81af, 0x0000517e, + 0xffffae82, 0x000062e5, 0xffff9d1b, 0xffffe563, 0x00001a9d, 0x000062af, 0xffff9d51, 0xffffaf63, + 0x0000509d, 0x00003636, 0xffffc9ca, 0x00006c6c, 0xffff9394, 0x00000000, 0x09090000, 0xf6f70000, + 0x09000000, 0xf7000000, 0x00090000, 0xfff70000, 0x12120000, 0xedee0000, 0x1b090000, 0xe4f70000, + 0x091b0000, 0xf6e50000, 0x00000909, 0x09090909, 0xf6f70909, 0x09000909, 0xf7000909, 0x00090909, + 0xfff70909, 0x12120909, 0xedee0909, 0x1b090909, 0xe4f70909, 0x091b0909, 0xf6e50909, 0xfffff6f7, + 0x0908f6f7, 0xf6f6f6f7, 0x08fff6f7, 0xf6fff6f7, 0x0008f6f7, 0xfff6f6f7, 0x1211f6f7, 0xededf6f7, + 0x1b08f6f7, 0xe4f6f6f7, 0x091af6f7, 0xf6e4f6f7, 0x00000900, 0x09090900, 0xf6f70900, 0x09000900, + 0xf7000900, 0x00090900, 0xfff70900, 0x12120900, 0xedee0900, 0x1b090900, 0xe4f70900, 0x091b0900, + 0xf6e50900, 0xfffff700, 0x0908f700, 0xf6f6f700, 0x08fff700, 0xf6fff700, 0x0008f700, 0xfff6f700, + 0x1211f700, 0xededf700, 0x1b08f700, 0xe4f6f700, 0x091af700, 0xf6e4f700, 0x00000009, 0x09090009, + 0xf6f70009, 0x09000009, 0xf7000009, 0x00090009, 0xfff70009, 0x12120009, 0xedee0009, 0x1b090009, + 0xe4f70009, 0x091b0009, 0xf6e50009, 0xfffffff7, 0x0908fff7, 0xf6f6fff7, 0x08fffff7, 0xf6fffff7, + 0x0008fff7, 0xfff6fff7, 0x1211fff7, 0xededfff7, 0x1b08fff7, 0xe4f6fff7, 0x091afff7, 0xf6e4fff7, + 0x00001212, 0x09091212, 0xf6f71212, 0x09001212, 0xf7001212, 0x00091212, 0xfff71212, 0x12121212, + 0xedee1212, 0x1b091212, 0xe4f71212, 0x091b1212, 0xf6e51212, 0xffffedee, 0x0908edee, 0xf6f6edee, + 0x08ffedee, 0xf6ffedee, 0x0008edee, 0xfff6edee, 0x1211edee, 0xedededee, 0x1b08edee, 0xe4f6edee, + 0x091aedee, 0xf6e4edee, 0x00001b09, 0x09091b09, 0xf6f71b09, 0x09001b09, 0xf7001b09, 0x00091b09, + 0xfff71b09, 0x12121b09, 0xedee1b09, 0x1b091b09, 0xe4f71b09, 0x091b1b09, 0xf6e51b09, 0xffffe4f7, + 0x0908e4f7, 0xf6f6e4f7, 0x08ffe4f7, 0xf6ffe4f7, 0x0008e4f7, 0xfff6e4f7, 0x1211e4f7, 0xedede4f7, + 0x1b08e4f7, 0xe4f6e4f7, 0x091ae4f7, 0xf6e4e4f7, 0x0000091b, 0x0909091b, 0xf6f7091b, 0x0900091b, + 0xf700091b, 0x0009091b, 0xfff7091b, 0x1212091b, 0xedee091b, 0x1b09091b, 0xe4f7091b, 0x091b091b, + 0xf6e5091b, 0xfffff6e5, 0x0908f6e5, 0xf6f6f6e5, 0x08fff6e5, 0xf6fff6e5, 0x0008f6e5, 0xfff6f6e5, + 0x1211f6e5, 0xededf6e5, 0x1b08f6e5, 0xe4f6f6e5, 0x091af6e5, 0xf6e4f6e5, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, + 0xfffff9fa, 0x00000700, 0xfffff900, 0x00000007, 0xfffffff9, 0x000004fb, 0xfffffb05, 0xfffffb05, + 0x000004fb, 0x00000b06, 0xfffff4fa, 0x0000060b, 0xfffff9f5, 0x00000800, 0xfffff800, 0x00000008, + 0xfffffff8, 0x00000b0b, 0xfffff4f5, 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x0000110c, + 0xffffeef4, 0x00000c11, 0xfffff3ef, 0x00001111, 0xffffeeef, 0x00001206, 0xffffedfa, 0x00000612, + 0xfffff9ee, 0x00000af8, 0xfffff508, 0xfffff80b, 0x000007f5, 0x00000f00, 0xfffff100, 0x0000000f, + 0xfffffff1, 0x00001400, 0xffffec00, 0x00000014, 0xffffffec, 0x00001912, 0xffffe6ee, 0x00001219, + 0xffffede7, 0x0000190b, 0xffffe6f5, 0x00000b19, 0xfffff4e7, 0x00001919, 0xffffe6e7, 0x00000df2, + 0xfffff20e, 0xfffff20e, 0x00000df2, 0x00001a00, 0xffffe600, 0x0000001a, 0xffffffe6, 0x000011f5, + 0xffffee0b, 0xfffff512, 0x00000aee, 0x000015f9, 0xffffea07, 0xfffff916, 0x000006ea, 0x0000221a, + 0xffffdde6, 0x00001a22, 0xffffe5de, 0x00002212, 0xffffddee, 0x00001222, 0xffffedde, 0x00002222, + 0xffffddde, 0x0000230b, 0xffffdcf5, 0x00000b23, 0xfffff4dd, 0x00001d00, 0xffffe300, 0x0000001d, + 0xffffffe3, 0x000015ed, 0xffffea13, 0xffffed16, 0x000012ea, 0x000019f1, 0xffffe60f, 0xfffff11a, + 0x00000ee6, 0x00002500, 0xffffdb00, 0x00000025, 0xffffffdb, 0x00002c1b, 0xffffd3e5, 0x00001b2c, + 0xffffe4d4, 0x00002c24, 0xffffd3dc, 0x0000242c, 0xffffdbd4, 0x00002c12, 0xffffd3ee, 0x0000122c, + 0xffffedd4, 0x000020f6, 0xffffdf0a, 0xfffff621, 0x000009df, 0x00002d2d, 0xffffd2d3, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, + 0xfffff9fa, 0x00000700, 0xfffff900, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020300, 0x0201fd00, + 0x02020003, 0x0201fffd, 0x02020606, 0x0201f9fa, 0x02020700, 0x0201f900, 0xfdfe0000, 0xfdfe0202, + 0xfdfdfdfe, 0xfdfe0300, 0xfdfdfd00, 0xfdfe0003, 0xfdfdfffd, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0700, + 0xfdfdf900, 0x03000000, 0x03000202, 0x02fffdfe, 0x03000300, 0x02fffd00, 0x03000003, 0x02fffffd, + 0x03000606, 0x02fff9fa, 0x03000700, 0x02fff900, 0xfd000000, 0xfd000202, 0xfcfffdfe, 0xfd000300, + 0xfcfffd00, 0xfd000003, 0xfcfffffd, 0xfd000606, 0xfcfff9fa, 0xfd000700, 0xfcfff900, 0x00030000, + 0x00030202, 0x0002fdfe, 0x00030300, 0x0002fd00, 0x00030003, 0x0002fffd, 0x00030606, 0x0002f9fa, + 0x00030700, 0x0002f900, 0xfffd0000, 0xfffd0202, 0xfffcfdfe, 0xfffd0300, 0xfffcfd00, 0xfffd0003, + 0xfffcfffd, 0xfffd0606, 0xfffcf9fa, 0xfffd0700, 0xfffcf900, 0x06060000, 0x06060202, 0x0605fdfe, + 0x06060300, 0x0605fd00, 0x06060003, 0x0605fffd, 0x06060606, 0x0605f9fa, 0x06060700, 0x0605f900, + 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0300, 0xf9f9fd00, 0xf9fa0003, 0xf9f9fffd, 0xf9fa0606, + 0xf9f9f9fa, 0xf9fa0700, 0xf9f9f900, 0x07000000, 0x07000202, 0x06fffdfe, 0x07000300, 0x06fffd00, + 0x07000003, 0x06fffffd, 0x07000606, 0x06fff9fa, 0x07000700, 0x06fff900, 0xf9000000, 0xf9000202, + 0xf8fffdfe, 0xf9000300, 0xf8fffd00, 0xf9000003, 0xf8fffffd, 0xf9000606, 0xf8fff9fa, 0xf9000700, + 0xf8fff900, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000202, 0xfffffdfe, 0x00000606, + 0xfffff9fa, 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x000003fc, 0xfffffc04, 0xfffffa0a, + 0x000005f6, 0xfffff400, 0x00000c00, 0xfffff3fa, 0xfffff406, 0x00000bfa, 0x00000c06, 0xfffffff2, + 0x0000000e, 0x00000c0c, 0xfffff3f4, 0xffffee00, 0x00001200, 0xfffff40e, 0x00000bf2, 0xfffff9ee, + 0xfffffa12, 0x000005ee, 0x00000612, 0xffffedf6, 0xffffee0a, 0x000011f6, 0x0000120a, 0xffffffea, + 0x00000016, 0xffffe800, 0x00001800, 0xfffff3ea, 0xfffff416, 0x00000bea, 0x00000c16, 0xffffe7f8, + 0xffffe808, 0x000017f8, 0x00001808, 0xfffff9e6, 0xfffffa1a, 0x000005e6, 0x0000061a, 0xffffffe4, + 0x0000001c, 0x00001414, 0xffffebec, 0xffffe5f2, 0x00001a0e, 0xfffff3e2, 0x00000c1e, 0xffffdff6, + 0x0000200a, 0xffffdfee, 0x00002012, 0xffffe5e6, 0x00001a1a, 0xffffebde, 0x00001422, 0xfffff3da, + 0x00000c26, 0xffffdfe0, 0x00002020, 0x00002020, 0xffffd7ea, 0xffffddde, 0x00002222, 0x00000000, + 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, + 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x02000000, 0x02000200, 0x01fffe00, 0x02000002, + 0x01fffffe, 0x02000202, 0x01fffdfe, 0x02000606, 0x01fff9fa, 0x02000600, 0x01fffa00, 0x02000006, + 0x01fffffa, 0xfe000000, 0xfe000200, 0xfdfffe00, 0xfe000002, 0xfdfffffe, 0xfe000202, 0xfdfffdfe, + 0xfe000606, 0xfdfff9fa, 0xfe000600, 0xfdfffa00, 0xfe000006, 0xfdfffffa, 0x00020000, 0x00020200, + 0x0001fe00, 0x00020002, 0x0001fffe, 0x00020202, 0x0001fdfe, 0x00020606, 0x0001f9fa, 0x00020600, + 0x0001fa00, 0x00020006, 0x0001fffa, 0xfffe0000, 0xfffe0200, 0xfffdfe00, 0xfffe0002, 0xfffdfffe, + 0xfffe0202, 0xfffdfdfe, 0xfffe0606, 0xfffdf9fa, 0xfffe0600, 0xfffdfa00, 0xfffe0006, 0xfffdfffa, + 0x02020000, 0x02020200, 0x0201fe00, 0x02020002, 0x0201fffe, 0x02020202, 0x0201fdfe, 0x02020606, + 0x0201f9fa, 0x02020600, 0x0201fa00, 0x02020006, 0x0201fffa, 0xfdfe0000, 0xfdfe0200, 0xfdfdfe00, + 0xfdfe0002, 0xfdfdfffe, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0600, 0xfdfdfa00, + 0xfdfe0006, 0xfdfdfffa, 0x06060000, 0x06060200, 0x0605fe00, 0x06060002, 0x0605fffe, 0x06060202, + 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060600, 0x0605fa00, 0x06060006, 0x0605fffa, 0xf9fa0000, + 0xf9fa0200, 0xf9f9fe00, 0xf9fa0002, 0xf9f9fffe, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, + 0xf9fa0600, 0xf9f9fa00, 0xf9fa0006, 0xf9f9fffa, 0x06000000, 0x06000200, 0x05fffe00, 0x06000002, + 0x05fffffe, 0x06000202, 0x05fffdfe, 0x06000606, 0x05fff9fa, 0x06000600, 0x05fffa00, 0x06000006, + 0x05fffffa, 0xfa000000, 0xfa000200, 0xf9fffe00, 0xfa000002, 0xf9fffffe, 0xfa000202, 0xf9fffdfe, + 0xfa000606, 0xf9fff9fa, 0xfa000600, 0xf9fffa00, 0xfa000006, 0xf9fffffa, 0x00060000, 0x00060200, + 0x0005fe00, 0x00060002, 0x0005fffe, 0x00060202, 0x0005fdfe, 0x00060606, 0x0005f9fa, 0x00060600, + 0x0005fa00, 0x00060006, 0x0005fffa, 0xfffa0000, 0xfffa0200, 0xfff9fe00, 0xfffa0002, 0xfff9fffe, + 0xfffa0202, 0xfff9fdfe, 0xfffa0606, 0xfff9f9fa, 0xfffa0600, 0xfff9fa00, 0xfffa0006, 0xfff9fffa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, 0xfffffbfc, 0x00000a0a, + 0xfffff5f6, 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x000005fa, 0xfffffa06, 0xfffff80e, + 0x000007f2, 0xffffffee, 0x00000012, 0xfffff00a, 0x00000ff6, 0xffffe800, 0x00001800, 0xfffff7e8, + 0xfffff818, 0x000007e8, 0x00000818, 0x00001212, 0xffffedee, 0xfffff014, 0x00000fec, 0xffffe5f2, + 0xffffe60e, 0x000019f2, 0x00001a0e, 0xffffffe2, 0x0000001e, 0xffffde00, 0x00002200, 0xfffff7de, + 0xfffff822, 0x000007de, 0x00000822, 0xffffede2, 0xffffee1e, 0x000011e2, 0x0000121e, 0xffffddf6, + 0xffffde0a, 0x000021f6, 0x0000220a, 0xffffddec, 0x00002214, 0xffffffd8, 0x00000028, 0x00001e1e, + 0xffffe1e2, 0xffffedd8, 0x00001228, 0xffffd400, 0x00002c00, 0xffffd3f0, 0x00002c10, 0xffffdbdc, + 0xffffdbdc, 0x00002424, 0xffffd3e6, 0x00002c1a, 0xffffe5d2, 0x00001a2e, 0xffffedcc, 0x00001234, + 0xffffc9ec, 0xffffd3d4, 0x00002c2c, 0xffffc9e0, 0xffffd1d2, 0xffffd1d2, 0x00002e2e, 0x00000000, + 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, 0xfffffbfc, 0x00000a0a, 0xfffff5f6, + 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x02000000, 0x02000200, 0x01fffe00, 0x02000002, + 0x01fffffe, 0x02000404, 0x01fffbfc, 0x02000a0a, 0x01fff5f6, 0x02000a00, 0x01fff600, 0x0200000a, + 0x01fffff6, 0xfe000000, 0xfe000200, 0xfdfffe00, 0xfe000002, 0xfdfffffe, 0xfe000404, 0xfdfffbfc, + 0xfe000a0a, 0xfdfff5f6, 0xfe000a00, 0xfdfff600, 0xfe00000a, 0xfdfffff6, 0x00020000, 0x00020200, + 0x0001fe00, 0x00020002, 0x0001fffe, 0x00020404, 0x0001fbfc, 0x00020a0a, 0x0001f5f6, 0x00020a00, + 0x0001f600, 0x0002000a, 0x0001fff6, 0xfffe0000, 0xfffe0200, 0xfffdfe00, 0xfffe0002, 0xfffdfffe, + 0xfffe0404, 0xfffdfbfc, 0xfffe0a0a, 0xfffdf5f6, 0xfffe0a00, 0xfffdf600, 0xfffe000a, 0xfffdfff6, + 0x04040000, 0x04040200, 0x0403fe00, 0x04040002, 0x0403fffe, 0x04040404, 0x0403fbfc, 0x04040a0a, + 0x0403f5f6, 0x04040a00, 0x0403f600, 0x0404000a, 0x0403fff6, 0xfbfc0000, 0xfbfc0200, 0xfbfbfe00, + 0xfbfc0002, 0xfbfbfffe, 0xfbfc0404, 0xfbfbfbfc, 0xfbfc0a0a, 0xfbfbf5f6, 0xfbfc0a00, 0xfbfbf600, + 0xfbfc000a, 0xfbfbfff6, 0x0a0a0000, 0x0a0a0200, 0x0a09fe00, 0x0a0a0002, 0x0a09fffe, 0x0a0a0404, + 0x0a09fbfc, 0x0a0a0a0a, 0x0a09f5f6, 0x0a0a0a00, 0x0a09f600, 0x0a0a000a, 0x0a09fff6, 0xf5f60000, + 0xf5f60200, 0xf5f5fe00, 0xf5f60002, 0xf5f5fffe, 0xf5f60404, 0xf5f5fbfc, 0xf5f60a0a, 0xf5f5f5f6, + 0xf5f60a00, 0xf5f5f600, 0xf5f6000a, 0xf5f5fff6, 0x0a000000, 0x0a000200, 0x09fffe00, 0x0a000002, + 0x09fffffe, 0x0a000404, 0x09fffbfc, 0x0a000a0a, 0x09fff5f6, 0x0a000a00, 0x09fff600, 0x0a00000a, + 0x09fffff6, 0xf6000000, 0xf6000200, 0xf5fffe00, 0xf6000002, 0xf5fffffe, 0xf6000404, 0xf5fffbfc, + 0xf6000a0a, 0xf5fff5f6, 0xf6000a00, 0xf5fff600, 0xf600000a, 0xf5fffff6, 0x000a0000, 0x000a0200, + 0x0009fe00, 0x000a0002, 0x0009fffe, 0x000a0404, 0x0009fbfc, 0x000a0a0a, 0x0009f5f6, 0x000a0a00, + 0x0009f600, 0x000a000a, 0x0009fff6, 0xfff60000, 0xfff60200, 0xfff5fe00, 0xfff60002, 0xfff5fffe, + 0xfff60404, 0xfff5fbfc, 0xfff60a0a, 0xfff5f5f6, 0xfff60a00, 0xfff5f600, 0xfff6000a, 0xfff5fff6, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000404, 0xfffffbfc, 0x00000c0c, + 0xfffff3f4, 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x000007f8, 0xfffff808, 0xfffff008, + 0x00000ff8, 0xffffe800, 0x00001800, 0xfffff7e8, 0xfffff818, 0x000007e8, 0x00000818, 0xfffff014, + 0x00000fec, 0xffffffe4, 0x0000001c, 0xffffe7f0, 0xffffe810, 0x000017f0, 0x00001810, 0xffffe000, + 0x00002000, 0xffffefe4, 0xfffff01c, 0x00000fe4, 0x0000101c, 0xffffdff8, 0xffffe008, 0xfffff7e0, + 0xfffff820, 0x000007e0, 0x00000820, 0x00001ff8, 0x00002008, 0x00001818, 0xffffe7e8, 0xffffe818, + 0x000017e8, 0xffffdfec, 0x00002014, 0xffffffd8, 0x00000028, 0xffffefd8, 0x00001028, 0xffffd400, + 0xffffd400, 0xffffffd4, 0x0000002c, 0x00002c00, 0x00002c00, 0xffffdfe0, 0x00002020, 0xffffd3f0, + 0x00002c10, 0xffffd3e8, 0xffffe7d4, 0x0000182c, 0x00002c18, 0xffffefd0, 0x00001030, 0xffffdbdc, + 0xffffdbdc, 0x00002424, 0x00002424, 0xffffcbec, 0x00002828, 0xffffd7d8, 0xffffcbe0, 0x00000000, + 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000404, 0xfffffbfc, 0x00000c0c, 0xfffff3f4, + 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x04000000, 0x04000400, 0x03fffc00, 0x04000004, + 0x03fffffc, 0x04000404, 0x03fffbfc, 0x04000c0c, 0x03fff3f4, 0x04000c00, 0x03fff400, 0x0400000c, + 0x03fffff4, 0xfc000000, 0xfc000400, 0xfbfffc00, 0xfc000004, 0xfbfffffc, 0xfc000404, 0xfbfffbfc, + 0xfc000c0c, 0xfbfff3f4, 0xfc000c00, 0xfbfff400, 0xfc00000c, 0xfbfffff4, 0x00040000, 0x00040400, + 0x0003fc00, 0x00040004, 0x0003fffc, 0x00040404, 0x0003fbfc, 0x00040c0c, 0x0003f3f4, 0x00040c00, + 0x0003f400, 0x0004000c, 0x0003fff4, 0xfffc0000, 0xfffc0400, 0xfffbfc00, 0xfffc0004, 0xfffbfffc, + 0xfffc0404, 0xfffbfbfc, 0xfffc0c0c, 0xfffbf3f4, 0xfffc0c00, 0xfffbf400, 0xfffc000c, 0xfffbfff4, + 0x04040000, 0x04040400, 0x0403fc00, 0x04040004, 0x0403fffc, 0x04040404, 0x0403fbfc, 0x04040c0c, + 0x0403f3f4, 0x04040c00, 0x0403f400, 0x0404000c, 0x0403fff4, 0xfbfc0000, 0xfbfc0400, 0xfbfbfc00, + 0xfbfc0004, 0xfbfbfffc, 0xfbfc0404, 0xfbfbfbfc, 0xfbfc0c0c, 0xfbfbf3f4, 0xfbfc0c00, 0xfbfbf400, + 0xfbfc000c, 0xfbfbfff4, 0x0c0c0000, 0x0c0c0400, 0x0c0bfc00, 0x0c0c0004, 0x0c0bfffc, 0x0c0c0404, + 0x0c0bfbfc, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c0c00, 0x0c0bf400, 0x0c0c000c, 0x0c0bfff4, 0xf3f40000, + 0xf3f40400, 0xf3f3fc00, 0xf3f40004, 0xf3f3fffc, 0xf3f40404, 0xf3f3fbfc, 0xf3f40c0c, 0xf3f3f3f4, + 0xf3f40c00, 0xf3f3f400, 0xf3f4000c, 0xf3f3fff4, 0x0c000000, 0x0c000400, 0x0bfffc00, 0x0c000004, + 0x0bfffffc, 0x0c000404, 0x0bfffbfc, 0x0c000c0c, 0x0bfff3f4, 0x0c000c00, 0x0bfff400, 0x0c00000c, + 0x0bfffff4, 0xf4000000, 0xf4000400, 0xf3fffc00, 0xf4000004, 0xf3fffffc, 0xf4000404, 0xf3fffbfc, + 0xf4000c0c, 0xf3fff3f4, 0xf4000c00, 0xf3fff400, 0xf400000c, 0xf3fffff4, 0x000c0000, 0x000c0400, + 0x000bfc00, 0x000c0004, 0x000bfffc, 0x000c0404, 0x000bfbfc, 0x000c0c0c, 0x000bf3f4, 0x000c0c00, + 0x000bf400, 0x000c000c, 0x000bfff4, 0xfff40000, 0xfff40400, 0xfff3fc00, 0xfff40004, 0xfff3fffc, + 0xfff40404, 0xfff3fbfc, 0xfff40c0c, 0xfff3f3f4, 0xfff40c00, 0xfff3f400, 0xfff4000c, 0xfff3fff4, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, + 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, + 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, + 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, + 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, + 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, + 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, + 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, + 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, + 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, + 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, + 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, + 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, + 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, + 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, + 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, + 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, + 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, + 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, + 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, + 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, + 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, + 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, + 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, + 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, + 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, + 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, + 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, + 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, + 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, + 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, + 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, + 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, + 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, + 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, + 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, + 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, + 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, + 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, + 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, + 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, + 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, + 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, + 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, + 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, + 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, + 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, + 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, + 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, + 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, + 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, + 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, + 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, + 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, + 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, + 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, + 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, + 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, + 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, + 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, + 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, + 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, + 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, + 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, + 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, + 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, + 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, + 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, + 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, + 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, + 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, + 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, + 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, + 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, + 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, + 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, + 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, + 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, + 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, + 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, + 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, + 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, + 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, + 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, + 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + + +const uint32 Indeo3Decoder::correctionloworder[] = { + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x04040404, + 0xfbfbfbfc, 0x05050101, 0xfafafeff, 0x01010505, 0xfefefafb, 0x0403fbfc, 0xfbfc0404, 0x0605fdfe, + 0xf9fa0202, 0xfdfe0606, 0x0201f9fa, 0x09090404, 0xf6f6fbfc, 0x04040909, 0xfbfbf6f7, 0x09090909, + 0xf6f6f6f7, 0x0a0a0101, 0xf5f5feff, 0x01010a0a, 0xfefef5f6, 0x0807fafb, 0xf7f80505, 0xfafb0808, + 0x0504f7f8, 0x0f0f0909, 0xf0f0f6f7, 0x09090f0f, 0xf6f6f0f1, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, + 0x0302f3f4, 0x10100404, 0xefeffbfc, 0x04041010, 0xfbfbeff0, 0x10101010, 0xefefeff0, 0x12120000, + 0xedee0000, 0x00001212, 0xffffedee, 0x0c0bf3f4, 0xf3f40c0c, 0x100ff6f7, 0xeff00909, 0xf6f71010, + 0x0908eff0, 0x1b1b0b0b, 0xe4e4f4f5, 0x0b0b1b1b, 0xf4f4e4e5, 0x1c1c1313, 0xe3e3eced, 0x13131c1c, + 0xecece3e4, 0x1615f9fa, 0xe9ea0606, 0xf9fa1616, 0x0605e9ea, 0x1d1d0404, 0xe2e2fbfc, 0x04041d1d, + 0xfbfbe2e3, 0x1e1e1e1e, 0xe1e1e1e2, 0x2120fdfe, 0xdedf0202, 0xfdfe2121, 0x0201dedf, 0x1716edee, + 0xe8e91212, 0xedee1717, 0x1211e8e9, 0x1e1df0f1, 0xe1e20f0f, 0xf0f11e1e, 0x0f0ee1e2, 0x2e2e1616, + 0xd1d1e9ea, 0x16162e2e, 0xe9e9d1d2, 0x2f2f0d0d, 0xd0d0f2f3, 0x0d0d2f2f, 0xf2f2d0d1, 0x31312323, + 0xcecedcdd, 0x23233131, 0xdcdccecf, 0x2928f4f5, 0xd6d70b0b, 0xf4f52929, 0x0b0ad6d7, 0x33330404, + 0xccccfbfc, 0x04043333, 0xfbfbcccd, 0x36363636, 0xc9c9c9ca, 0x2221ddde, 0xddde2222, 0x2a29e2e3, + 0xd5d61d1d, 0xe2e32a2a, 0x1d1cd5d6, 0x3c3bf9fa, 0xc3c40606, 0xf9fa3c3c, 0x0605c3c4, 0x4c4c1b1b, + 0xb3b3e4e5, 0x1b1b4c4c, 0xe4e4b3b4, 0x4d4d2b2b, 0xb2b2d4d5, 0x2b2b4d4d, 0xd4d4b2b3, 0x3736e7e8, + 0xc8c91818, 0xe7e83737, 0x1817c8c9, 0x4f4f0e0e, 0xb0b0f1f2, 0x0e0e4f4f, 0xf1f1b0b1, 0x53533f3f, + 0xacacc0c1, 0x3f3f5353, 0xc0c0acad, 0x4a49ebec, 0xb5b61414, 0xebec4a4a, 0x1413b5b6, 0x58580202, + 0xa7a7fdfe, 0x02025858, 0xfdfda7a8, 0x5d5d5d5d, 0xa2a2a2a3, 0x3d3ccbcc, 0xc2c33434, 0xcbcc3d3d, + 0x3433c2c3, 0x78783434, 0x8787cbcc, 0x34347878, 0xcbcb8788, 0x4b4ad2d3, 0xb4b52d2d, 0xd2d34b4b, + 0x2d2cb4b5, 0x7d7d4b4b, 0x8282b4b5, 0x4b4b7d7d, 0xb4b48283, 0x7a7a2121, 0x8585dedf, 0x21217a7a, + 0xdede8586, 0x6766f2f3, 0x98990d0d, 0xf2f36767, 0x0d0c9899, 0x605fd7d8, 0x9fa02828, 0xd7d86060, + 0x28279fa0, 0x7f7eddde, 0x80812222, 0xddde7f7f, 0x22218081, 0x5958a6a7, 0xa6a75959, 0x6968b1b2, + 0x96974e4e, 0xb1b26969, 0x4e4d9697, 0x0c0c0c0c, 0xf3f3f3f4, 0x17171717, 0xe8e8e8e9, 0x2a2a2a2a, + 0xd5d5d5d6, 0x49494949, 0xb6b6b6b7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0xfcfd0101, + 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfeff0303, 0xfeff0303, + 0xfeff0303, 0xfeff0303, 0xfeff0303, 0xfeff0303, 0xfeff0303, 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, + 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, + 0xf8f8f8f9, 0x08080202, 0xf7f7fdfe, 0x02020808, 0xfdfdf7f8, 0x0908fdfe, 0xf6f70202, 0xfdfe0909, + 0x0201f6f7, 0x0605f9fa, 0xf9fa0606, 0x0d0d0606, 0xf2f2f9fa, 0x06060d0d, 0xf9f9f2f3, 0x0d0d0d0d, + 0xf2f2f2f3, 0x0e0e0101, 0xf1f1feff, 0x01010e0e, 0xfefef1f2, 0x0c0bf7f8, 0xf3f40808, 0xf7f80c0c, + 0x0807f3f4, 0x17170e0e, 0xe8e8f1f2, 0x0e0e1717, 0xf1f1e8e9, 0x1211fafb, 0xedee0505, 0xfafb1212, + 0x0504edee, 0x18180606, 0xe7e7f9fa, 0x06061818, 0xf9f9e7e8, 0x18181818, 0xe7e7e7e8, 0x1b1afeff, + 0xe4e50101, 0xfeff1b1b, 0x0100e4e5, 0x1110eeef, 0xeeef1111, 0x1716f2f3, 0xe8e90d0d, 0xf2f31717, + 0x0d0ce8e9, 0x28281010, 0xd7d7eff0, 0x10102828, 0xefefd7d8, 0x29291c1c, 0xd6d6e3e4, 0x1c1c2929, + 0xe3e3d6d7, 0x2120f6f7, 0xdedf0909, 0xf6f72121, 0x0908dedf, 0x2b2b0606, 0xd4d4f9fa, 0x06062b2b, + 0xf9f9d4d5, 0x2e2e2e2e, 0xd1d1d1d2, 0x3231fbfc, 0xcdce0404, 0xfbfc3232, 0x0403cdce, 0x2221e4e5, + 0xddde1b1b, 0xe4e52222, 0x1b1addde, 0x2d2ce9ea, 0xd2d31616, 0xe9ea2d2d, 0x1615d2d3, 0x45452222, + 0xbabaddde, 0x22224545, 0xddddbabb, 0x46461313, 0xb9b9eced, 0x13134646, 0xececb9ba, 0x49493535, + 0xb6b6cacb, 0x35354949, 0xcacab6b7, 0x3e3deeef, 0xc1c21111, 0xeeef3e3e, 0x1110c1c2, 0x4d4d0505, + 0xb2b2fafb, 0x05054d4d, 0xfafab2b3, 0x52525252, 0xadadadae, 0x3332cccd, 0xcccd3333, 0x403fd4d5, + 0xbfc02b2b, 0xd4d54040, 0x2b2abfc0, 0x5a59f5f6, 0xa5a60a0a, 0xf5f65a5a, 0x0a09a5a6, 0x72722929, + 0x8d8dd6d7, 0x29297272, 0xd6d68d8e, 0x74744040, 0x8b8bbfc0, 0x40407474, 0xbfbf8b8c, 0x5251dadb, + 0xadae2525, 0xdadb5252, 0x2524adae, 0x77771616, 0x8888e9ea, 0x16167777, 0xe9e98889, 0x7c7c5f5f, + 0x8383a0a1, 0x5f5f7c7c, 0xa0a08384, 0x6f6ee1e2, 0x90911e1e, 0xe1e26f6f, 0x1e1d9091, 0x5c5bb1b2, + 0xa3a44e4e, 0xb1b25c5c, 0x4e4da3a4, 0x7170bbbc, 0x8e8f4444, 0xbbbc7171, 0x44438e8f, 0x12121212, + 0xedededee, 0x22222222, 0xddddddde, 0x3f3f3f3f, 0xc0c0c0c1, 0x6d6d6d6d, 0x92929293, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, + 0x03030303, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, + 0xfcfcfcfd, 0xfcfcfcfd, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, + 0x0403feff, 0x0403feff, 0x0403feff, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, + 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, + 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, + 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x07070707, 0x07070707, + 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, + 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, + 0xf5f5fcfd, 0x03030a0a, 0xfcfcf5f6, 0x09090909, 0xf6f6f6f7, 0x0706f8f9, 0xf8f90707, 0x0c0bfcfd, + 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x11110808, 0xeeeef7f8, 0x08081111, 0xf7f7eeef, 0x11111111, + 0xeeeeeeef, 0x13130101, 0xececfeff, 0x01011313, 0xfefeeced, 0x100ff4f5, 0xeff00b0b, 0xf4f51010, + 0x0b0aeff0, 0x1716f9fa, 0xe8e90606, 0xf9fa1717, 0x0605e8e9, 0x1f1f1212, 0xe0e0edee, 0x12121f1f, + 0xedede0e1, 0x20200808, 0xdfdff7f8, 0x08082020, 0xf7f7dfe0, 0x21212121, 0xdedededf, 0x2423feff, + 0xdbdc0101, 0xfeff2424, 0x0100dbdc, 0x1716e8e9, 0xe8e91717, 0x1f1eeeef, 0xe0e11111, 0xeeef1f1f, + 0x1110e0e1, 0x36361515, 0xc9c9eaeb, 0x15153636, 0xeaeac9ca, 0x37372525, 0xc8c8dadb, 0x25253737, + 0xdadac8c9, 0x2c2bf3f4, 0xd3d40c0c, 0xf3f42c2c, 0x0c0bd3d4, 0x39390808, 0xc6c6f7f8, 0x08083939, + 0xf7f7c6c7, 0x3d3d3d3d, 0xc2c2c2c3, 0x4241fafb, 0xbdbe0505, 0xfafb4242, 0x0504bdbe, 0x2d2cdbdc, + 0xd2d32424, 0xdbdc2d2d, 0x2423d2d3, 0x3c3be2e3, 0xc3c41d1d, 0xe2e33c3c, 0x1d1cc3c4, 0x5c5c2d2d, + 0xa3a3d2d3, 0x2d2d5c5c, 0xd2d2a3a4, 0x5d5d1919, 0xa2a2e6e7, 0x19195d5d, 0xe6e6a2a3, 0x61614747, + 0x9e9eb8b9, 0x47476161, 0xb8b89e9f, 0x5352e9ea, 0xacad1616, 0xe9ea5353, 0x1615acad, 0x66660707, + 0x9999f8f9, 0x07076666, 0xf8f8999a, 0x6d6d6d6d, 0x92929293, 0x4443bbbc, 0xbbbc4444, 0x5554c6c7, + 0xaaab3939, 0xc6c75555, 0x3938aaab, 0x7877f2f3, 0x87880d0d, 0xf2f37878, 0x0d0c8788, 0x6e6dcecf, + 0x91923131, 0xcecf6e6e, 0x31309192, 0x7b7a9798, 0x84856868, 0x97987b7b, 0x68678485, 0x18181818, + 0xe7e7e7e8, 0x2e2e2e2e, 0xd1d1d1d2, 0x54545454, 0xabababac, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040404, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, + 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, + 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0xfafb0101, 0xfafb0101, 0xfafb0101, + 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfeff0505, + 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, + 0xfeff0505, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, + 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, + 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, + 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0x03030a0a, + 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, + 0x03030a0a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, + 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x03030d0d, 0xfcfcf2f3, 0x0908f6f7, 0xf6f70909, 0x0f0efbfc, + 0xf0f10404, 0xfbfc0f0f, 0x0403f0f1, 0x16160b0b, 0xe9e9f4f5, 0x0b0b1616, 0xf4f4e9ea, 0x15151515, + 0xeaeaeaeb, 0x18180202, 0xe7e7fdfe, 0x02021818, 0xfdfde7e8, 0x1413f1f2, 0xebec0e0e, 0xf1f21414, + 0x0e0debec, 0x26261717, 0xd9d9e8e9, 0x17172626, 0xe8e8d9da, 0x1d1cf7f8, 0xe2e30808, 0xf7f81d1d, + 0x0807e2e3, 0x27270b0b, 0xd8d8f4f5, 0x0b0b2727, 0xf4f4d8d9, 0x29292929, 0xd6d6d6d7, 0x2d2cfeff, + 0xd2d30101, 0xfeff2d2d, 0x0100d2d3, 0x1d1ce2e3, 0xe2e31d1d, 0x2726e9ea, 0xd8d91616, 0xe9ea2727, + 0x1615d8d9, 0x43431b1b, 0xbcbce4e5, 0x1b1b4343, 0xe4e4bcbd, 0x45452f2f, 0xbabad0d1, 0x2f2f4545, + 0xd0d0babb, 0x3837f0f1, 0xc7c80f0f, 0xf0f13838, 0x0f0ec7c8, 0x47470b0b, 0xb8b8f4f5, 0x0b0b4747, + 0xf4f4b8b9, 0x4c4c4c4c, 0xb3b3b3b4, 0x5352f9fa, 0xacad0606, 0xf9fa5353, 0x0605acad, 0x3938d2d3, + 0xc6c72d2d, 0xd2d33939, 0x2d2cc6c7, 0x4b4adbdc, 0xb4b52424, 0xdbdc4b4b, 0x2423b4b5, 0x73733838, + 0x8c8cc7c8, 0x38387373, 0xc7c78c8d, 0x75751f1f, 0x8a8ae0e1, 0x1f1f7575, 0xe0e08a8b, 0x7a7a5858, + 0x8585a7a8, 0x58587a7a, 0xa7a78586, 0x6867e3e4, 0x97981c1c, 0xe3e46868, 0x1c1b9798, 0x5554aaab, + 0xaaab5555, 0x6a69b7b8, 0x95964848, 0xb7b86a6a, 0x48479596, 0x1e1e1e1e, 0xe1e1e1e2, 0x3a3a3a3a, + 0xc5c5c5c6, 0x69696969, 0x96969697, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x05050505, 0x05050505, + 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, + 0x05050505, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, + 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, + 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0xf8f90202, + 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, + 0xf8f90202, 0xf8f90202, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, + 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, + 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, + 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, + 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, + 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0x0d0d0303, 0x0d0d0303, + 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, + 0x0d0d0303, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, + 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, + 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0xfbfbf0f1, 0x0b0af4f5, 0xf4f50b0b, 0x1211fafb, + 0xedee0505, 0xfafb1212, 0x0504edee, 0x1a1a0d0d, 0xe5e5f2f3, 0x0d0d1a1a, 0xf2f2e5e6, 0x1a1a1a1a, + 0xe5e5e5e6, 0x1d1d0202, 0xe2e2fdfe, 0x02021d1d, 0xfdfde2e3, 0x1817eff0, 0xe7e81010, 0xeff01818, + 0x100fe7e8, 0x2e2e1c1c, 0xd1d1e3e4, 0x1c1c2e2e, 0xe3e3d1d2, 0x2322f6f7, 0xdcdd0909, 0xf6f72323, + 0x0908dcdd, 0x2f2f0d0d, 0xd0d0f2f3, 0x0d0d2f2f, 0xf2f2d0d1, 0x31313131, 0xcecececf, 0x3635feff, + 0xc9ca0101, 0xfeff3636, 0x0100c9ca, 0x2322dcdd, 0xdcdd2323, 0x2f2ee5e6, 0xd0d11a1a, 0xe5e62f2f, + 0x1a19d0d1, 0x51512020, 0xaeaedfe0, 0x20205151, 0xdfdfaeaf, 0x53533838, 0xacacc7c8, 0x38385353, + 0xc7c7acad, 0x4342edee, 0xbcbd1212, 0xedee4343, 0x1211bcbd, 0x56560d0d, 0xa9a9f2f3, 0x0d0d5656, + 0xf2f2a9aa, 0x5b5b5b5b, 0xa4a4a4a5, 0x6362f8f9, 0x9c9d0707, 0xf8f96363, 0x07069c9d, 0x4443c9ca, + 0xbbbc3636, 0xc9ca4444, 0x3635bbbc, 0x5a59d3d4, 0xa5a62c2c, 0xd3d45a5a, 0x2c2ba5a6, 0x7c7bdedf, + 0x83842121, 0xdedf7c7c, 0x21208384, 0x67669899, 0x98996767, 0x7f7ea9aa, 0x80815656, 0xa9aa7f7f, + 0x56558081, 0x25252525, 0xdadadadb, 0x45454545, 0xbabababb, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, + 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0xf7f80202, 0xf7f80202, 0xf7f80202, + 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, + 0xf7f80202, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, + 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, + 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, + 0x0201f7f8, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, + 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, + 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, + 0xf2f2f2f3, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, + 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, + 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, + 0xf0f0fbfc, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, + 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, + 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0xfafaedee, 0x0d0cf2f3, 0xf2f30d0d, 0x1514f9fa, + 0xeaeb0606, 0xf9fa1515, 0x0605eaeb, 0x1e1e0f0f, 0xe1e1f0f1, 0x0f0f1e1e, 0xf0f0e1e2, 0x1e1e1e1e, + 0xe1e1e1e2, 0x22220202, 0xddddfdfe, 0x02022222, 0xfdfdddde, 0x1c1beced, 0xe3e41313, 0xeced1c1c, + 0x1312e3e4, 0x36362020, 0xc9c9dfe0, 0x20203636, 0xdfdfc9ca, 0x2928f4f5, 0xd6d70b0b, 0xf4f52929, + 0x0b0ad6d7, 0x37370f0f, 0xc8c8f0f1, 0x0f0f3737, 0xf0f0c8c9, 0x39393939, 0xc6c6c6c7, 0x3f3efeff, + 0xc0c10101, 0xfeff3f3f, 0x0100c0c1, 0x2827d7d8, 0xd7d82828, 0x3736e1e2, 0xc8c91e1e, 0xe1e23737, + 0x1e1dc8c9, 0x5e5e2525, 0xa1a1dadb, 0x25255e5e, 0xdadaa1a2, 0x60604141, 0x9f9fbebf, 0x41416060, + 0xbebe9fa0, 0x4e4deaeb, 0xb1b21515, 0xeaeb4e4e, 0x1514b1b2, 0x64640f0f, 0x9b9bf0f1, 0x0f0f6464, + 0xf0f09b9c, 0x6a6a6a6a, 0x95959596, 0x7473f7f8, 0x8b8c0808, 0xf7f87474, 0x08078b8c, 0x4f4ec0c1, + 0xb0b13f3f, 0xc0c14f4f, 0x3f3eb0b1, 0x6968cccd, 0x96973333, 0xcccd6969, 0x33329697, 0x78778788, + 0x87887878, 0x2b2b2b2b, 0xd4d4d4d5, 0x50505050, 0xafafafb0, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, + 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, + 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, + 0xf8f8f8f9, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, + 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0xf5f60303, 0xf5f60303, 0xf5f60303, + 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, + 0xf5f60303, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, + 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, + 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, + 0x0302f5f6, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, + 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0xefefeff0, 0xefefeff0, 0xefefeff0, + 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, + 0xefefeff0, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, + 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0xededfafb, 0xededfafb, 0xededfafb, + 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, + 0xededfafb, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, + 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, + 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0xfafaebec, 0x0f0ef0f1, 0xf0f10f0f, 0x1817f8f9, + 0xe7e80707, 0xf8f91818, 0x0706e7e8, 0x23231111, 0xdcdceeef, 0x11112323, 0xeeeedcdd, 0x22222222, + 0xddddddde, 0x26260303, 0xd9d9fcfd, 0x03032626, 0xfcfcd9da, 0x201fe9ea, 0xdfe01616, 0xe9ea2020, + 0x1615dfe0, 0x3d3d2525, 0xc2c2dadb, 0x25253d3d, 0xdadac2c3, 0x2f2ef2f3, 0xd0d10d0d, 0xf2f32f2f, + 0x0d0cd0d1, 0x3f3f1111, 0xc0c0eeef, 0x11113f3f, 0xeeeec0c1, 0x41414141, 0xbebebebf, 0x4847feff, + 0xb7b80101, 0xfeff4848, 0x0100b7b8, 0x2e2dd1d2, 0xd1d22e2e, 0x3f3edcdd, 0xc0c12323, 0xdcdd3f3f, + 0x2322c0c1, 0x6b6b2b2b, 0x9494d4d5, 0x2b2b6b6b, 0xd4d49495, 0x6e6e4b4b, 0x9191b4b5, 0x4b4b6e6e, + 0xb4b49192, 0x5958e7e8, 0xa6a71818, 0xe7e85959, 0x1817a6a7, 0x72721111, 0x8d8deeef, 0x11117272, + 0xeeee8d8e, 0x79797979, 0x86868687, 0x5b5ab7b8, 0xa4a54848, 0xb7b85b5b, 0x4847a4a5, 0x7877c5c6, + 0x87883a3a, 0xc5c67878, 0x3a398788, 0x31313131, 0xcecececf, 0x5c5c5c5c, 0xa3a3a3a4, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, + 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0xf7f7f7f8, + 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, + 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, + 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0xf4f50303, + 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, + 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, + 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0x0302f4f5, + 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, + 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, + 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0xedededee, + 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, + 0xedededee, 0xedededee, 0xedededee, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, + 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0xebebfafb, + 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, + 0xebebfafb, 0xebebfafb, 0xebebfafb, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, + 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, + 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x1110eeef, 0xeeef1111, 0x1b1af8f9, + 0xe4e50707, 0xf8f91b1b, 0x0706e4e5, 0x27271313, 0xd8d8eced, 0x13132727, 0xececd8d9, 0x27272727, + 0xd8d8d8d9, 0x2b2b0303, 0xd4d4fcfd, 0x03032b2b, 0xfcfcd4d5, 0x2423e7e8, 0xdbdc1818, 0xe7e82424, + 0x1817dbdc, 0x45452a2a, 0xbabad5d6, 0x2a2a4545, 0xd5d5babb, 0x3534f1f2, 0xcacb0e0e, 0xf1f23535, + 0x0e0dcacb, 0x47471313, 0xb8b8eced, 0x13134747, 0xececb8b9, 0x49494949, 0xb6b6b6b7, 0x504ffdfe, + 0xafb00202, 0xfdfe5050, 0x0201afb0, 0x3433cbcc, 0xcbcc3434, 0x4645d8d9, 0xb9ba2727, 0xd8d94646, + 0x2726b9ba, 0x79793030, 0x8686cfd0, 0x30307979, 0xcfcf8687, 0x7c7c5454, 0x8383abac, 0x54547c7c, + 0xabab8384, 0x6463e4e5, 0x9b9c1b1b, 0xe4e56464, 0x1b1a9b9c, 0x6665aeaf, 0x999a5151, 0xaeaf6666, + 0x5150999a, 0x37373737, 0xc8c8c8c9, 0x68686868, 0x97979798, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, + 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0xf6f6f6f7, + 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, + 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, + 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, + 0x0c0bfcfd, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, + 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xfcfd0c0c, 0xfcfd0c0c, + 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, + 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, + 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, + 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0xe8e8f9fa, + 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, + 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0x06061717, 0x06061717, 0x06061717, 0x06061717, + 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, + 0x06061717, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, + 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, + 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x0403fbfc, 0xfbfc0404, 0x0605fdfe, + 0xf9fa0202, 0xfdfe0606, 0x0201f9fa, 0x08080404, 0xf7f7fbfc, 0x04040808, 0xfbfbf7f8, 0x08080808, + 0xf7f7f7f8, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x0807fbfc, 0xf7f80404, 0xfbfc0808, + 0x0403f7f8, 0x0e0e0808, 0xf1f1f7f8, 0x08080e0e, 0xf7f7f1f2, 0x0c0bfdfe, 0xf3f40202, 0xfdfe0c0c, + 0x0201f3f4, 0x10100404, 0xefeffbfc, 0x04041010, 0xfbfbeff0, 0x10101010, 0xefefeff0, 0x12120000, + 0xedee0000, 0x00001212, 0xffffedee, 0x0c0bf3f4, 0xf3f40c0c, 0x100ff7f8, 0xeff00808, 0xf7f81010, + 0x0807eff0, 0x1a1a0a0a, 0xe5e5f5f6, 0x0a0a1a1a, 0xf5f5e5e6, 0x1c1c1212, 0xe3e3edee, 0x12121c1c, + 0xedede3e4, 0x1615f9fa, 0xe9ea0606, 0xf9fa1616, 0x0605e9ea, 0x1c1c0404, 0xe3e3fbfc, 0x04041c1c, + 0xfbfbe3e4, 0x1e1e1e1e, 0xe1e1e1e2, 0x201ffdfe, 0xdfe00202, 0xfdfe2020, 0x0201dfe0, 0x1615edee, + 0xe9ea1212, 0xedee1616, 0x1211e9ea, 0x1e1df1f2, 0xe1e20e0e, 0xf1f21e1e, 0x0e0de1e2, 0x2e2e1616, + 0xd1d1e9ea, 0x16162e2e, 0xe9e9d1d2, 0x2e2e0c0c, 0xd1d1f3f4, 0x0c0c2e2e, 0xf3f3d1d2, 0x30302222, + 0xcfcfddde, 0x22223030, 0xddddcfd0, 0x2827f5f6, 0xd7d80a0a, 0xf5f62828, 0x0a09d7d8, 0x32320404, + 0xcdcdfbfc, 0x04043232, 0xfbfbcdce, 0x36363636, 0xc9c9c9ca, 0x2221ddde, 0xddde2222, 0x2a29e3e4, + 0xd5d61c1c, 0xe3e42a2a, 0x1c1bd5d6, 0x3c3bf9fa, 0xc3c40606, 0xf9fa3c3c, 0x0605c3c4, 0x4c4c1a1a, + 0xb3b3e5e6, 0x1a1a4c4c, 0xe5e5b3b4, 0x4c4c2a2a, 0xb3b3d5d6, 0x2a2a4c4c, 0xd5d5b3b4, 0x3635e7e8, + 0xc9ca1818, 0xe7e83636, 0x1817c9ca, 0x4e4e0e0e, 0xb1b1f1f2, 0x0e0e4e4e, 0xf1f1b1b2, 0x52523e3e, + 0xadadc1c2, 0x3e3e5252, 0xc1c1adae, 0x4a49ebec, 0xb5b61414, 0xebec4a4a, 0x1413b5b6, 0x58580202, + 0xa7a7fdfe, 0x02025858, 0xfdfda7a8, 0x5c5c5c5c, 0xa3a3a3a4, 0x3c3bcbcc, 0xc3c43434, 0xcbcc3c3c, + 0x3433c3c4, 0x76763434, 0x8989cbcc, 0x34347676, 0xcbcb898a, 0x4a49d3d4, 0xb5b62c2c, 0xd3d44a4a, + 0x2c2bb5b6, 0x76764a4a, 0x8989b5b6, 0x4a4a7676, 0xb5b5898a, 0x76762020, 0x8989dfe0, 0x20207676, + 0xdfdf898a, 0x6665f3f4, 0x999a0c0c, 0xf3f46666, 0x0c0b999a, 0x605fd7d8, 0x9fa02828, 0xd7d86060, + 0x28279fa0, 0x7675ddde, 0x898a2222, 0xddde7676, 0x2221898a, 0x5857a7a8, 0xa7a85858, 0x6867b1b2, + 0x97984e4e, 0xb1b26868, 0x4e4d9798, 0x0c0c0c0c, 0xf3f3f3f4, 0x16161616, 0xe9e9e9ea, 0x2a2a2a2a, + 0xd5d5d5d6, 0x48484848, 0xb7b7b7b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0xfdfe0000, + 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, + 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, + 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, + 0xf9f9f9fa, 0x09090303, 0xf6f6fcfd, 0x03030909, 0xfcfcf6f7, 0x0908fcfd, 0xf6f70303, 0xfcfd0909, + 0x0302f6f7, 0x0605f9fa, 0xf9fa0606, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0xf9f9f3f4, 0x0c0c0c0c, + 0xf3f3f3f4, 0x0f0f0000, 0xf0f10000, 0x00000f0f, 0xfffff0f1, 0x0c0bf6f7, 0xf3f40909, 0xf6f70c0c, + 0x0908f3f4, 0x18180f0f, 0xe7e7f0f1, 0x0f0f1818, 0xf0f0e7e8, 0x1211f9fa, 0xedee0606, 0xf9fa1212, + 0x0605edee, 0x18180606, 0xe7e7f9fa, 0x06061818, 0xf9f9e7e8, 0x18181818, 0xe7e7e7e8, 0x1b1b0000, + 0xe4e50000, 0x00001b1b, 0xffffe4e5, 0x1211edee, 0xedee1212, 0x1817f3f4, 0xe7e80c0c, 0xf3f41818, + 0x0c0be7e8, 0x27270f0f, 0xd8d8f0f1, 0x0f0f2727, 0xf0f0d8d9, 0x2a2a1b1b, 0xd5d5e4e5, 0x1b1b2a2a, + 0xe4e4d5d6, 0x2120f6f7, 0xdedf0909, 0xf6f72121, 0x0908dedf, 0x2a2a0606, 0xd5d5f9fa, 0x06062a2a, + 0xf9f9d5d6, 0x2d2d2d2d, 0xd2d2d2d3, 0x3332fcfd, 0xcccd0303, 0xfcfd3333, 0x0302cccd, 0x2120e4e5, + 0xdedf1b1b, 0xe4e52121, 0x1b1adedf, 0x2d2ceaeb, 0xd2d31515, 0xeaeb2d2d, 0x1514d2d3, 0x45452121, + 0xbabadedf, 0x21214545, 0xdedebabb, 0x45451212, 0xbabaedee, 0x12124545, 0xededbabb, 0x48483636, + 0xb7b7c9ca, 0x36364848, 0xc9c9b7b8, 0x3f3eedee, 0xc0c11212, 0xedee3f3f, 0x1211c0c1, 0x4e4e0606, + 0xb1b1f9fa, 0x06064e4e, 0xf9f9b1b2, 0x51515151, 0xaeaeaeaf, 0x3332cccd, 0xcccd3333, 0x3f3ed5d6, + 0xc0c12a2a, 0xd5d63f3f, 0x2a29c0c1, 0x5a59f6f7, 0xa5a60909, 0xf6f75a5a, 0x0908a5a6, 0x72722a2a, + 0x8d8dd5d6, 0x2a2a7272, 0xd5d58d8e, 0x75753f3f, 0x8a8ac0c1, 0x3f3f7575, 0xc0c08a8b, 0x5150dbdc, + 0xaeaf2424, 0xdbdc5151, 0x2423aeaf, 0x78781515, 0x8787eaeb, 0x15157878, 0xeaea8788, 0x7b7b6060, + 0x84849fa0, 0x60607b7b, 0x9f9f8485, 0x6f6ee1e2, 0x90911e1e, 0xe1e26f6f, 0x1e1d9091, 0x5d5cb1b2, + 0xa2a34e4e, 0xb1b25d5d, 0x4e4da2a3, 0x7271babb, 0x8d8e4545, 0xbabb7272, 0x45448d8e, 0x12121212, + 0xedededee, 0x21212121, 0xdedededf, 0x3f3f3f3f, 0xc0c0c0c1, 0x6c6c6c6c, 0x93939394, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, + 0x03030303, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, + 0xfcfcfcfd, 0xfcfcfcfd, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, + 0x03030000, 0x03030000, 0x03030000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, + 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0x00000303, 0x00000303, 0x00000303, 0x00000303, + 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, + 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, + 0xf7f7fbfc, 0x04040808, 0xfbfbf7f8, 0x08080808, 0xf7f7f7f8, 0x0807f7f8, 0xf7f80808, 0x0c0bfbfc, + 0xf3f40404, 0xfbfc0c0c, 0x0403f3f4, 0x10100808, 0xefeff7f8, 0x08081010, 0xf7f7eff0, 0x10101010, + 0xefefeff0, 0x14140000, 0xebec0000, 0x00001414, 0xffffebec, 0x100ff3f4, 0xeff00c0c, 0xf3f41010, + 0x0c0beff0, 0x1817fbfc, 0xe7e80404, 0xfbfc1818, 0x0403e7e8, 0x20201010, 0xdfdfeff0, 0x10102020, + 0xefefdfe0, 0x20200808, 0xdfdff7f8, 0x08082020, 0xf7f7dfe0, 0x20202020, 0xdfdfdfe0, 0x24240000, + 0xdbdc0000, 0x00002424, 0xffffdbdc, 0x1817e7e8, 0xe7e81818, 0x201feff0, 0xdfe01010, 0xeff02020, + 0x100fdfe0, 0x34341414, 0xcbcbebec, 0x14143434, 0xebebcbcc, 0x38382424, 0xc7c7dbdc, 0x24243838, + 0xdbdbc7c8, 0x2c2bf3f4, 0xd3d40c0c, 0xf3f42c2c, 0x0c0bd3d4, 0x38380808, 0xc7c7f7f8, 0x08083838, + 0xf7f7c7c8, 0x3c3c3c3c, 0xc3c3c3c4, 0x403ffbfc, 0xbfc00404, 0xfbfc4040, 0x0403bfc0, 0x2c2bdbdc, + 0xd3d42424, 0xdbdc2c2c, 0x2423d3d4, 0x3c3be3e4, 0xc3c41c1c, 0xe3e43c3c, 0x1c1bc3c4, 0x5c5c2c2c, + 0xa3a3d3d4, 0x2c2c5c5c, 0xd3d3a3a4, 0x5c5c1818, 0xa3a3e7e8, 0x18185c5c, 0xe7e7a3a4, 0x60604848, + 0x9f9fb7b8, 0x48486060, 0xb7b79fa0, 0x5453ebec, 0xabac1414, 0xebec5454, 0x1413abac, 0x64640808, + 0x9b9bf7f8, 0x08086464, 0xf7f79b9c, 0x6c6c6c6c, 0x93939394, 0x4443bbbc, 0xbbbc4444, 0x5453c7c8, + 0xabac3838, 0xc7c85454, 0x3837abac, 0x7877f3f4, 0x87880c0c, 0xf3f47878, 0x0c0b8788, 0x6c6bcfd0, + 0x93943030, 0xcfd06c6c, 0x302f9394, 0x7c7b9798, 0x83846868, 0x97987c7c, 0x68678384, 0x18181818, + 0xe7e7e7e8, 0x2c2c2c2c, 0xd3d3d3d4, 0x54545454, 0xabababac, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040404, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, + 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, + 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, + 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0x00000404, + 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, + 0x00000404, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, + 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0x08080404, + 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, + 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0x04040808, + 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, + 0x04040808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, + 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x05050f0f, 0xfafaf0f1, 0x0a09f5f6, 0xf5f60a0a, 0x0f0efafb, + 0xf0f10505, 0xfafb0f0f, 0x0504f0f1, 0x14140a0a, 0xebebf5f6, 0x0a0a1414, 0xf5f5ebec, 0x14141414, + 0xebebebec, 0x19190000, 0xe6e70000, 0x00001919, 0xffffe6e7, 0x1413f0f1, 0xebec0f0f, 0xf0f11414, + 0x0f0eebec, 0x28281919, 0xd7d7e6e7, 0x19192828, 0xe6e6d7d8, 0x1e1df5f6, 0xe1e20a0a, 0xf5f61e1e, + 0x0a09e1e2, 0x28280a0a, 0xd7d7f5f6, 0x0a0a2828, 0xf5f5d7d8, 0x28282828, 0xd7d7d7d8, 0x2d2d0000, + 0xd2d30000, 0x00002d2d, 0xffffd2d3, 0x1e1de1e2, 0xe1e21e1e, 0x2827ebec, 0xd7d81414, 0xebec2828, + 0x1413d7d8, 0x41411919, 0xbebee6e7, 0x19194141, 0xe6e6bebf, 0x46462d2d, 0xb9b9d2d3, 0x2d2d4646, + 0xd2d2b9ba, 0x3736f0f1, 0xc8c90f0f, 0xf0f13737, 0x0f0ec8c9, 0x46460a0a, 0xb9b9f5f6, 0x0a0a4646, + 0xf5f5b9ba, 0x4b4b4b4b, 0xb4b4b4b5, 0x5554fafb, 0xaaab0505, 0xfafb5555, 0x0504aaab, 0x3736d2d3, + 0xc8c92d2d, 0xd2d33737, 0x2d2cc8c9, 0x4b4adcdd, 0xb4b52323, 0xdcdd4b4b, 0x2322b4b5, 0x73733737, + 0x8c8cc8c9, 0x37377373, 0xc8c88c8d, 0x73731e1e, 0x8c8ce1e2, 0x1e1e7373, 0xe1e18c8d, 0x78785a5a, + 0x8787a5a6, 0x5a5a7878, 0xa5a58788, 0x6968e1e2, 0x96971e1e, 0xe1e26969, 0x1e1d9697, 0x5554aaab, + 0xaaab5555, 0x6968b9ba, 0x96974646, 0xb9ba6969, 0x46459697, 0x1e1e1e1e, 0xe1e1e1e2, 0x3c3c3c3c, + 0xc3c3c3c4, 0x69696969, 0x96969697, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x05050505, 0x05050505, + 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, + 0x05050505, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, + 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0x05050000, 0x05050000, 0x05050000, 0x05050000, + 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0xfafb0000, + 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, + 0xfafb0000, 0xfafb0000, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, + 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0xfffffafb, 0xfffffafb, 0xfffffafb, + 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, + 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, + 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, + 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0x0f0f0505, 0x0f0f0505, + 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, + 0x0f0f0505, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, + 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, + 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0xf9f9f3f4, 0x0c0bf3f4, 0xf3f40c0c, 0x1211f9fa, + 0xedee0606, 0xf9fa1212, 0x0605edee, 0x18180c0c, 0xe7e7f3f4, 0x0c0c1818, 0xf3f3e7e8, 0x18181818, + 0xe7e7e7e8, 0x1e1e0000, 0xe1e20000, 0x00001e1e, 0xffffe1e2, 0x1817edee, 0xe7e81212, 0xedee1818, + 0x1211e7e8, 0x30301e1e, 0xcfcfe1e2, 0x1e1e3030, 0xe1e1cfd0, 0x2423f9fa, 0xdbdc0606, 0xf9fa2424, + 0x0605dbdc, 0x30300c0c, 0xcfcff3f4, 0x0c0c3030, 0xf3f3cfd0, 0x30303030, 0xcfcfcfd0, 0x36360000, + 0xc9ca0000, 0x00003636, 0xffffc9ca, 0x2423dbdc, 0xdbdc2424, 0x302fe7e8, 0xcfd01818, 0xe7e83030, + 0x1817cfd0, 0x4e4e1e1e, 0xb1b1e1e2, 0x1e1e4e4e, 0xe1e1b1b2, 0x54543636, 0xababc9ca, 0x36365454, + 0xc9c9abac, 0x4241edee, 0xbdbe1212, 0xedee4242, 0x1211bdbe, 0x54540c0c, 0xababf3f4, 0x0c0c5454, + 0xf3f3abac, 0x5a5a5a5a, 0xa5a5a5a6, 0x605ff9fa, 0x9fa00606, 0xf9fa6060, 0x06059fa0, 0x4241c9ca, + 0xbdbe3636, 0xc9ca4242, 0x3635bdbe, 0x5a59d5d6, 0xa5a62a2a, 0xd5d65a5a, 0x2a29a5a6, 0x7e7de1e2, + 0x81821e1e, 0xe1e27e7e, 0x1e1d8182, 0x6665999a, 0x999a6666, 0x7e7dabac, 0x81825454, 0xabac7e7e, + 0x54538182, 0x24242424, 0xdbdbdbdc, 0x42424242, 0xbdbdbdbe, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, + 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, + 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, + 0xf9fa0000, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, + 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, + 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, + 0xfffff9fa, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, + 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, + 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, + 0xf3f3f9fa, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, + 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, + 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0xf8f8eaeb, 0x0e0df1f2, 0xf1f20e0e, 0x1514f8f9, + 0xeaeb0707, 0xf8f91515, 0x0706eaeb, 0x1c1c0e0e, 0xe3e3f1f2, 0x0e0e1c1c, 0xf1f1e3e4, 0x1c1c1c1c, + 0xe3e3e3e4, 0x23230000, 0xdcdd0000, 0x00002323, 0xffffdcdd, 0x1c1beaeb, 0xe3e41515, 0xeaeb1c1c, + 0x1514e3e4, 0x38382323, 0xc7c7dcdd, 0x23233838, 0xdcdcc7c8, 0x2a29f1f2, 0xd5d60e0e, 0xf1f22a2a, + 0x0e0dd5d6, 0x38380e0e, 0xc7c7f1f2, 0x0e0e3838, 0xf1f1c7c8, 0x38383838, 0xc7c7c7c8, 0x3f3f0000, + 0xc0c10000, 0x00003f3f, 0xffffc0c1, 0x2a29d5d6, 0xd5d62a2a, 0x3837e3e4, 0xc7c81c1c, 0xe3e43838, + 0x1c1bc7c8, 0x5b5b2323, 0xa4a4dcdd, 0x23235b5b, 0xdcdca4a5, 0x62623f3f, 0x9d9dc0c1, 0x3f3f6262, + 0xc0c09d9e, 0x4d4ceaeb, 0xb2b31515, 0xeaeb4d4d, 0x1514b2b3, 0x62620e0e, 0x9d9df1f2, 0x0e0e6262, + 0xf1f19d9e, 0x69696969, 0x96969697, 0x7776f8f9, 0x88890707, 0xf8f97777, 0x07068889, 0x4d4cc0c1, + 0xb2b33f3f, 0xc0c14d4d, 0x3f3eb2b3, 0x6968cecf, 0x96973131, 0xcecf6969, 0x31309697, 0x77768889, + 0x88897777, 0x2a2a2a2a, 0xd5d5d5d6, 0x4d4d4d4d, 0xb2b2b2b3, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, + 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, + 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, + 0xf8f8f8f9, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, + 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0xf8f90000, 0xf8f90000, 0xf8f90000, + 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, + 0xf8f90000, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, + 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, + 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, + 0xfffff8f9, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, + 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, + 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, + 0xf1f1f1f2, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, + 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, + 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, + 0xeaeaf8f9, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, + 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, + 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0xf7f7eff0, 0x100feff0, 0xeff01010, 0x1817f7f8, + 0xe7e80808, 0xf7f81818, 0x0807e7e8, 0x20201010, 0xdfdfeff0, 0x10102020, 0xefefdfe0, 0x20202020, + 0xdfdfdfe0, 0x28280000, 0xd7d80000, 0x00002828, 0xffffd7d8, 0x201fe7e8, 0xdfe01818, 0xe7e82020, + 0x1817dfe0, 0x40402828, 0xbfbfd7d8, 0x28284040, 0xd7d7bfc0, 0x302feff0, 0xcfd01010, 0xeff03030, + 0x100fcfd0, 0x40401010, 0xbfbfeff0, 0x10104040, 0xefefbfc0, 0x40404040, 0xbfbfbfc0, 0x48480000, + 0xb7b80000, 0x00004848, 0xffffb7b8, 0x302fcfd0, 0xcfd03030, 0x403fdfe0, 0xbfc02020, 0xdfe04040, + 0x201fbfc0, 0x68682828, 0x9797d7d8, 0x28286868, 0xd7d79798, 0x70704848, 0x8f8fb7b8, 0x48487070, + 0xb7b78f90, 0x5857e7e8, 0xa7a81818, 0xe7e85858, 0x1817a7a8, 0x70701010, 0x8f8feff0, 0x10107070, + 0xefef8f90, 0x78787878, 0x87878788, 0x5857b7b8, 0xa7a84848, 0xb7b85858, 0x4847a7a8, 0x7877c7c8, + 0x87883838, 0xc7c87878, 0x38378788, 0x30303030, 0xcfcfcfd0, 0x58585858, 0xa7a7a7a8, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, + 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0xf7f7f7f8, + 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, + 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, + 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0xf7f80000, + 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, + 0xf7f80000, 0xf7f80000, 0xf7f80000, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, + 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0xfffff7f8, + 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, + 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, + 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0xefefeff0, + 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, + 0xefefeff0, 0xefefeff0, 0xefefeff0, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, + 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0xefeff7f8, + 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, + 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, + 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, + 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x1211edee, 0xedee1212, 0x1b1af6f7, + 0xe4e50909, 0xf6f71b1b, 0x0908e4e5, 0x24241212, 0xdbdbedee, 0x12122424, 0xededdbdc, 0x24242424, + 0xdbdbdbdc, 0x2d2d0000, 0xd2d30000, 0x00002d2d, 0xffffd2d3, 0x2423e4e5, 0xdbdc1b1b, 0xe4e52424, + 0x1b1adbdc, 0x48482d2d, 0xb7b7d2d3, 0x2d2d4848, 0xd2d2b7b8, 0x3635edee, 0xc9ca1212, 0xedee3636, + 0x1211c9ca, 0x48481212, 0xb7b7edee, 0x12124848, 0xededb7b8, 0x48484848, 0xb7b7b7b8, 0x51510000, + 0xaeaf0000, 0x00005151, 0xffffaeaf, 0x3635c9ca, 0xc9ca3636, 0x4847dbdc, 0xb7b82424, 0xdbdc4848, + 0x2423b7b8, 0x75752d2d, 0x8a8ad2d3, 0x2d2d7575, 0xd2d28a8b, 0x7e7e5151, 0x8181aeaf, 0x51517e7e, + 0xaeae8182, 0x6362e4e5, 0x9c9d1b1b, 0xe4e56363, 0x1b1a9c9d, 0x6362aeaf, 0x9c9d5151, 0xaeaf6363, + 0x51509c9d, 0x36363636, 0xc9c9c9ca, 0x6c6c6c6c, 0x93939394, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, + 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0xf6f6f6f7, + 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, + 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0x09090000, 0x09090000, 0x09090000, 0x09090000, + 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, + 0x09090000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, + 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0x00000909, 0x00000909, + 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, + 0x00000909, 0x00000909, 0x00000909, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, + 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, + 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, + 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0xedededee, 0xedededee, 0xedededee, + 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, + 0xedededee, 0xedededee, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, + 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0xe4e4f6f7, + 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, + 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, + 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, + 0x09091b1b, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, + 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, + 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0504fafb, 0xfafb0505, 0xfafb0505, + 0x0504fafb, 0x0b0b0606, 0xf4f4f9fa, 0x06060b0b, 0xf9f9f4f5, 0x08080000, 0xf7f80000, 0x00000808, + 0xfffff7f8, 0x0b0b0b0b, 0xf4f4f4f5, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x11110c0c, + 0xeeeef3f4, 0x0c0c1111, 0xf3f3eeef, 0x11111111, 0xeeeeeeef, 0x12120606, 0xededf9fa, 0x06061212, + 0xf9f9edee, 0x0b0af7f8, 0xf4f50808, 0xf7f80b0b, 0x0807f4f5, 0x0f0f0000, 0xf0f10000, 0x00000f0f, + 0xfffff0f1, 0x14140000, 0xebec0000, 0x00001414, 0xffffebec, 0x19191212, 0xe6e6edee, 0x12121919, + 0xedede6e7, 0x19190b0b, 0xe6e6f4f5, 0x0b0b1919, 0xf4f4e6e7, 0x19191919, 0xe6e6e6e7, 0x0e0df1f2, + 0xf1f20e0e, 0xf1f20e0e, 0x0e0df1f2, 0x1a1a0000, 0xe5e60000, 0x00001a1a, 0xffffe5e6, 0x1211f4f5, + 0xedee0b0b, 0xf4f51212, 0x0b0aedee, 0x1615f8f9, 0xe9ea0707, 0xf8f91616, 0x0706e9ea, 0x22221a1a, + 0xdddde5e6, 0x1a1a2222, 0xe5e5ddde, 0x22221212, 0xddddedee, 0x12122222, 0xededddde, 0x22222222, + 0xddddddde, 0x23230b0b, 0xdcdcf4f5, 0x0b0b2323, 0xf4f4dcdd, 0x1d1d0000, 0xe2e30000, 0x00001d1d, + 0xffffe2e3, 0x1615eced, 0xe9ea1313, 0xeced1616, 0x1312e9ea, 0x1a19f0f1, 0xe5e60f0f, 0xf0f11a1a, + 0x0f0ee5e6, 0x25250000, 0xdadb0000, 0x00002525, 0xffffdadb, 0x2c2c1b1b, 0xd3d3e4e5, 0x1b1b2c2c, + 0xe4e4d3d4, 0x2c2c2424, 0xd3d3dbdc, 0x24242c2c, 0xdbdbd3d4, 0x2c2c1212, 0xd3d3edee, 0x12122c2c, + 0xededd3d4, 0x2120f5f6, 0xdedf0a0a, 0xf5f62121, 0x0a09dedf, 0x2d2d2d2d, 0xd2d2d2d3, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, + 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, + 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, + 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, + 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, + 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, + 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, + 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, + 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, + 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, + 0xf8f90000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0403fbfc, 0xfbfc0404, 0xf9fa0a0a, + 0x0605f5f6, 0xf3f40000, 0x0c0c0000, 0xf3f3f9fa, 0xf3f40606, 0x0c0bf9fa, 0x0c0c0606, 0xfffff1f2, + 0x00000e0e, 0x0c0c0c0c, 0xf3f3f3f4, 0xedee0000, 0x12120000, 0xf3f40e0e, 0x0c0bf1f2, 0xf9f9edee, + 0xf9fa1212, 0x0605edee, 0x06061212, 0xededf5f6, 0xedee0a0a, 0x1211f5f6, 0x12120a0a, 0xffffe9ea, + 0x00001616, 0xe7e80000, 0x18180000, 0xf3f3e9ea, 0xf3f41616, 0x0c0be9ea, 0x0c0c1616, 0xe7e7f7f8, + 0xe7e80808, 0x1817f7f8, 0x18180808, 0xf9f9e5e6, 0xf9fa1a1a, 0x0605e5e6, 0x06061a1a, 0xffffe3e4, + 0x00001c1c, 0x14141414, 0xebebebec, 0xe5e5f1f2, 0x1a1a0e0e, 0xf3f3e1e2, 0x0c0c1e1e, 0xdfdff5f6, + 0x20200a0a, 0xdfdfedee, 0x20201212, 0xe5e5e5e6, 0x1a1a1a1a, 0xebebddde, 0x14142222, 0xf3f3d9da, + 0x0c0c2626, 0xdfdfdfe0, 0x20202020, 0x20202020, 0xd7d7e9ea, 0xddddddde, 0x22222222, 0x00000000, + 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, + 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, + 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, + 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, + 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, + 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, + 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, + 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, + 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, + 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, + 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, + 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, + 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x0605f9fa, 0xf9fa0606, 0xf7f80e0e, + 0x0807f1f2, 0xffffedee, 0x00001212, 0xeff00a0a, 0x100ff5f6, 0xe7e80000, 0x18180000, 0xf7f7e7e8, + 0xf7f81818, 0x0807e7e8, 0x08081818, 0x12121212, 0xedededee, 0xeff01414, 0x100febec, 0xe5e5f1f2, + 0xe5e60e0e, 0x1a19f1f2, 0x1a1a0e0e, 0xffffe1e2, 0x00001e1e, 0xddde0000, 0x22220000, 0xf7f7ddde, + 0xf7f82222, 0x0807ddde, 0x08082222, 0xedede1e2, 0xedee1e1e, 0x1211e1e2, 0x12121e1e, 0xddddf5f6, + 0xddde0a0a, 0x2221f5f6, 0x22220a0a, 0xddddebec, 0x22221414, 0xffffd7d8, 0x00002828, 0x1e1e1e1e, + 0xe1e1e1e2, 0xededd7d8, 0x12122828, 0xd3d40000, 0x2c2c0000, 0xd3d3eff0, 0x2c2c1010, 0xdbdbdbdc, + 0xdbdbdbdc, 0x24242424, 0xd3d3e5e6, 0x2c2c1a1a, 0xe5e5d1d2, 0x1a1a2e2e, 0xededcbcc, 0x12123434, + 0xc9c9ebec, 0xd3d3d3d4, 0x2c2c2c2c, 0xc9c9dfe0, 0xd1d1d1d2, 0xd1d1d1d2, 0x2e2e2e2e, 0x00000000, + 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, + 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, + 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, + 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, + 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, + 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, + 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, + 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, + 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, + 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, + 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, + 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, + 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, + 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, + 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, + 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, + 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, + 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, + 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, + 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, + 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, + 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x0807f7f8, 0xf7f80808, 0xeff00808, + 0x100ff7f8, 0xe7e80000, 0x18180000, 0xf7f7e7e8, 0xf7f81818, 0x0807e7e8, 0x08081818, 0xeff01414, + 0x100febec, 0xffffe3e4, 0x00001c1c, 0xe7e7eff0, 0xe7e81010, 0x1817eff0, 0x18181010, 0xdfe00000, + 0x20200000, 0xefefe3e4, 0xeff01c1c, 0x100fe3e4, 0x10101c1c, 0xdfdff7f8, 0xdfe00808, 0xf7f7dfe0, + 0xf7f82020, 0x0807dfe0, 0x08082020, 0x201ff7f8, 0x20200808, 0x18181818, 0xe7e7e7e8, 0xe7e81818, + 0x1817e7e8, 0xdfdfebec, 0x20201414, 0xffffd7d8, 0x00002828, 0xefefd7d8, 0x10102828, 0xd3d40000, + 0xd3d40000, 0xffffd3d4, 0x00002c2c, 0x2c2c0000, 0x2c2c0000, 0xdfdfdfe0, 0x20202020, 0xd3d3eff0, + 0x2c2c1010, 0xd3d3e7e8, 0xe7e7d3d4, 0x18182c2c, 0x2c2c1818, 0xefefcfd0, 0x10103030, 0xdbdbdbdc, + 0xdbdbdbdc, 0x24242424, 0x24242424, 0xcbcbebec, 0x28282828, 0xd7d7d7d8, 0xcbcbdfe0, 0x00000000, + 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, + 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, + 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, + 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, + 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, + 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, + 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, + 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, + 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, + 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, + 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, + 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, + 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, + 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, + 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, + 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, + 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, + 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, + 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, + 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, + 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, + 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, + 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, + 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, + 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, + 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, + 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, + 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, + 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, + 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, + 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, + 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, + 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + + +const uint32 Indeo3Decoder::correctionhighorder[] = { + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, + 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, + 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, + 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, + 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, + 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, + 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, + 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, + 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, + 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, + 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, + 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, + 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, + 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, + 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, + 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, + 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, + 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, + 0x03030a0a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, + 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, + 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, + 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, + 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, + 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, + 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, + 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, + 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, + 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, + 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, + 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, + 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, + 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, + 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, + 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, + 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, + 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, + 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, + 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, + 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, + 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x09090909, 0xf6f6f6f7, + 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, + 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, + 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, + 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, + 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, + 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, + 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, + 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, + 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, + 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, + 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, + 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, + 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, + 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, + 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, + 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, + 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, + 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, + 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, + 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, + 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, + 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, + 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, + 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, + 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, + 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, + 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, + 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, + 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, + 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, + 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, + 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, + 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, + 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, + 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, + 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, + 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, + 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, + 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, + 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, + 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, + 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, + 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, + 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, + 0x04040808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, + 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, + 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, + 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, + 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, + 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, + 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, + 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, + 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, + 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, + 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, + 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, + 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, + 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, + 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, + 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, + 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, + 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, + 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, + 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, + 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, + 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, + 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, + 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x09090909, 0xf6f6f6f7, + 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, + 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, + 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, + 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, + 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, + 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, + 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, + 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, + 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, + 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, + 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, + 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, + 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, + 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, + 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, + 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, + 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, + 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, + 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, + 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, + 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, + 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, + 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0x00000303, + 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, + 0x00000303, 0x00000303, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, + 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, + 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0xf8f90000, 0xf8f90000, + 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, + 0xf8f90000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, + 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, + 0x02020000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, + 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, + 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, + 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, + 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0x06060000, 0x06060000, 0x06060000, 0x06060000, + 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, + 0x06060000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, + 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0x00000606, 0x00000606, + 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, + 0x00000606, 0x00000606, 0x00000606, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, + 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, + 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, + 0x02020000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, + 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, + 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, + 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, + 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, + 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0xf5f5f5f6, + 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, + 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, + 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, + 0x0a0a0000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, + 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0x00000a0a, 0x00000a0a, + 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, + 0x00000a0a, 0x00000a0a, 0x00000a0a, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, + 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, + 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, + 0x04040000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, + 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0x00000404, 0x00000404, + 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, + 0x00000404, 0x00000404, 0x00000404, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, + 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, + 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, + 0xfbfbfbfc, 0xfbfbfbfc, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, + 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, + 0x0c0c0000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, + 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0x00000c0c, 0x00000c0c, + 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, + 0x00000c0c, 0x00000c0c, 0x00000c0c, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, + 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, + 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, + 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, + 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, + 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, + 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, + 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, + 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, + 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, + 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, + 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, + 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, + 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, + 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + +} // End of namespace Graphics + +#endif // USE_INDEO3 diff --git a/graphics/video/codecs/indeo3.h b/graphics/video/codecs/indeo3.h new file mode 100644 index 0000000000..8d50b74b1e --- /dev/null +++ b/graphics/video/codecs/indeo3.h @@ -0,0 +1,94 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/scummsys.h" + +#ifdef USE_INDEO3 + +/* Intel Indeo 3 decompressor, derived from ffmpeg. + * + * Original copyright note: + * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg + * written, produced, and directed by Alan Smithee + */ + +#ifndef GRAPHICS_INDEO3_H +#define GRAPHICS_INDEO3_H + +#include "graphics/video/codecs/codec.h" + +namespace Graphics { + +class Indeo3Decoder : public Codec { +public: + Indeo3Decoder(uint16 width, uint16 height); + ~Indeo3Decoder(); + + Surface *decodeImage(Common::SeekableReadStream *stream); + PixelFormat getPixelFormat() const; + + static bool isIndeo3(byte *data, uint32 dataLen); + +private: + Surface *_surface; + + PixelFormat _pixelFormat; + + static const int _corrector_type_0[24]; + static const int _corrector_type_2[8]; + static const uint32 correction[]; + static const uint32 correctionloworder[]; + static const uint32 correctionhighorder[]; + + struct YUVBufs { + byte *Ybuf; + byte *Ubuf; + byte *Vbuf; + byte *the_buf; + uint32 the_buf_size; + uint16 y_w, y_h; + uint16 uv_w, uv_h; + }; + + YUVBufs _iv_frame[2]; + YUVBufs *_cur_frame; + YUVBufs *_ref_frame; + + byte *_ModPred; + uint16 *_corrector_type; + + void buildModPred(); + void allocFrames(); + + void decodeChunk(byte *cur, byte *ref, int width, int height, + const byte *buf1, uint32 fflags2, const byte *hdr, + const byte *buf2, int min_width_160); +}; + +} // End of namespace Graphics + +#endif // GRAPHICS_INDEO3_H + +#endif // USE_INDEO3 diff --git a/graphics/video/coktelvideo/coktelvideo.cpp b/graphics/video/coktelvideo/coktelvideo.cpp index 9ee9fd68d0..280431b5d5 100644 --- a/graphics/video/coktelvideo/coktelvideo.cpp +++ b/graphics/video/coktelvideo/coktelvideo.cpp @@ -31,11 +31,13 @@ #include "common/system.h" #include "graphics/dither.h" -#include "graphics/video/coktelvideo/indeo3.h" +#include "graphics/video/codecs/indeo3.h" #include "sound/audiostream.h" #include "sound/decoders/raw.h" +static const uint32 kVideoCodecIndeo3 = MKID_BE('iv32'); + namespace Graphics { PreImd::PreImd() { @@ -1439,11 +1441,11 @@ bool Vmd::assessVideoProperties() { _externalCodec = false; if (_externalCodec) { - if (_videoCodec == MKID_BE('iv32')) { + if (_videoCodec == kVideoCodecIndeo3) { #ifdef USE_INDEO3 _features &= ~kFeaturesPalette; _features |= kFeaturesFullColor; - _codecIndeo3 = new Indeo3(_width, _height, _palLUT); + _codec = new Indeo3Decoder(_width, _height); #else warning("Vmd::assessVideoProperties(): Indeo3 decoder not compiled in"); #endif @@ -1503,11 +1505,6 @@ bool Vmd::assessVideoProperties() { } } -#ifdef USE_INDEO3 - if (_externalCodec && _codecIndeo3) - _features |= kFeaturesSupportsDouble; -#endif - return true; } @@ -1816,15 +1813,6 @@ void Vmd::setDoubleMode(bool doubleMode) { } -#ifdef USE_INDEO3 - if (_codecIndeo3) { - delete _codecIndeo3; - - _codecIndeo3 = new Indeo3(_width * (doubleMode ? 2 : 1), - _height * (doubleMode ? 2 : 1), _palLUT); - } -#endif - _doubleMode = doubleMode; } @@ -1870,10 +1858,6 @@ void Vmd::zeroData() { _hasVideo = true; _videoCodec = 0; -#ifdef USE_INDEO3 - _codecIndeo3 = 0; -#endif - _partsPerFrame = 0; _frames = 0; @@ -1886,6 +1870,8 @@ void Vmd::zeroData() { _audioFormat = kAudioFormat8bitDirect; _externalCodec = false; + _codec = 0; + _doubleMode = false; _blitMode = 0; _bytesPerPixel = 1; @@ -1898,11 +1884,10 @@ void Vmd::zeroData() { void Vmd::deleteData() { Imd::deleteData(); -#ifdef USE_INDEO3 - delete _codecIndeo3; -#endif - delete[] _frames; - delete[] _vidMemBuffer; + delete _codec; + + delete[] _frames; + delete[] _vidMemBuffer; } void Vmd::clear() { @@ -2158,38 +2143,39 @@ uint32 Vmd::renderFrame(int16 &left, int16 &top, int16 &right, int16 &bottom) { uint8 type; byte *dest = imdVidMem; -#ifdef USE_INDEO3 - uint32 dataLen = _frameDataLen; - - if (Indeo3::isIndeo3(dataPtr, dataLen)) { - if (!_codecIndeo3) + if (_externalCodec) { + if (!_codec) return 0; - if (!_codecIndeo3->decompressFrame(dataPtr, dataLen, _vidBuffer, - width * (_doubleMode ? 2 : 1), height * (_doubleMode ? 2 : 1))) + if (_videoCodec == kVideoCodecIndeo3) { +#ifndef USE_INDEO3 return 0; +#else + if (!Indeo3Decoder::isIndeo3(dataPtr, _frameDataLen)) { + warning("Indeo3 data not indeo3"); + return 0; + } +#endif + } + Common::MemoryReadStream *dataStream = new Common::MemoryReadStream(dataPtr, _frameDataLen); + _codec->decodeImage(dataStream); + + // TODO + + /* type = 2; srcPtr = _vidBuffer; width = _width * (_doubleMode ? 2 : 1); height = _height * (_doubleMode ? 2 : 1); right = left + width - 1; bottom = top + height - 1; + */ - } else { - - if (_externalCodec) { - warning("Unknown external codec"); - return 0; - } - -#else - - if (_externalCodec) { return 0; - } else { + } -#endif + if (!_externalCodec) { type = *dataPtr++; srcPtr = dataPtr; diff --git a/graphics/video/coktelvideo/coktelvideo.h b/graphics/video/coktelvideo/coktelvideo.h index f8b1965f41..91dbee99bf 100644 --- a/graphics/video/coktelvideo/coktelvideo.h +++ b/graphics/video/coktelvideo/coktelvideo.h @@ -41,9 +41,7 @@ namespace Audio { namespace Graphics { -#ifdef USE_INDEO3 -class Indeo3; -#endif +class Codec; /** Common interface for handling Coktel Vision videos and derivated formats. */ class CoktelVideo { @@ -530,7 +528,6 @@ protected: AudioFormat _audioFormat; // Video properties - bool _externalCodec; byte _blitMode; byte _bytesPerPixel; byte _preScaleX; @@ -542,9 +539,8 @@ protected: Graphics::PaletteLUT *_palLUT; -#ifdef USE_INDEO3 - Indeo3 *_codecIndeo3; -#endif + bool _externalCodec; + Codec *_codec; void clear(); void zeroData(); diff --git a/graphics/video/coktelvideo/indeo3.cpp b/graphics/video/coktelvideo/indeo3.cpp deleted file mode 100644 index 983705ab9c..0000000000 --- a/graphics/video/coktelvideo/indeo3.cpp +++ /dev/null @@ -1,3485 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/scummsys.h" - -#ifdef USE_INDEO3 - -/* Intel Indeo 3 decompressor, derived from ffmpeg. - * - * Original copyright note: * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg - * written, produced, and directed by Alan Smithee - */ - -#include "common/system.h" -#include "common/endian.h" -#include "common/frac.h" -#include "common/file.h" - -#include "graphics/dither.h" -#include "graphics/video/coktelvideo/indeo3.h" - -namespace Graphics { - -Indeo3::Indeo3(int16 width, int16 height, Graphics::PaletteLUT *palLUT) { - assert((width > 0) && (height > 0)); - - _width = width; - _height = height; - _palLUT = palLUT; - - _ditherSL = 0; - setDither(kDitherSierraLight); - - buildModPred(); - allocFrames(); -} - -Indeo3::~Indeo3() { - delete[] _iv_frame[0].the_buf; - delete[] _ModPred; - delete[] _corrector_type; - delete _ditherSL; -} - -bool Indeo3::isIndeo3(byte *data, uint32 dataLen) { - // No data, no Indeo 3 - if (!data) - return false; - - // Less than 16 bytes? This can't be right - if (dataLen < 16) - return false; - - // Unknown, but according to the docs, always 0 - if (READ_LE_UINT32(data + 4) != 0) - return false; - - uint32 id; - id = READ_LE_UINT32(data ); // frame number - id ^= READ_LE_UINT32(data + 4); // unknown - id ^= READ_LE_UINT32(data + 8); // checksum - id ^= READ_LE_UINT32(data + 12); // frame data length - - // These 4 uint32s XOR'd need to spell "FRMH" - if (id != MKID_BE('FRMH')) - return false; - - return true; -} - -void Indeo3::setDither(DitherAlgorithm dither) { - delete _ditherSL; - _ditherSL = 0; - - _dither = dither; - - switch (dither) { - case kDitherSierraLight: - _ditherSL = new Graphics::SierraLight(_width, _palLUT); - break; - - default: - return; - } -} - -void Indeo3::buildModPred() { - _ModPred = new byte[8 * 128]; - - for (int i = 0; i < 128; i++) { - _ModPred[i+0*128] = (i > 126) ? 254 : 2*((i + 1) - ((i + 1) % 2)); - _ModPred[i+1*128] = (i == 7) ? 20 : ((i == 119 || i == 120) - ? 236 : 2*((i + 2) - ((i + 1) % 3))); - _ModPred[i+2*128] = (i > 125) ? 248 : 2*((i + 2) - ((i + 2) % 4)); - _ModPred[i+3*128] = 2*((i + 1) - ((i - 3) % 5)); - _ModPred[i+4*128] = (i == 8) ? 20 : 2*((i + 1) - ((i - 3) % 6)); - _ModPred[i+5*128] = 2*((i + 4) - ((i + 3) % 7)); - _ModPred[i+6*128] = (i > 123) ? 240 : 2*((i + 4) - ((i + 4) % 8)); - _ModPred[i+7*128] = 2*((i + 5) - ((i + 4) % 9)); - } - - _corrector_type = new uint16[24 * 256]; - - for (int i = 0; i < 24; i++) { - for (int j = 0; j < 256; j++) { - _corrector_type[i*256+j] = - (j < _corrector_type_0[i]) ? 1 : - ((j < 248 || (i == 16 && j == 248)) ? 0 : - _corrector_type_2[j - 248]); - } - } -} - -void Indeo3::allocFrames() { - int32 luma_width = (_width + 3) & (~3); - int32 luma_height = (_height + 3) & (~3); - - int32 chroma_width = ((luma_width >> 2) + 3) & (~3); - int32 chroma_height = ((luma_height>> 2) + 3) & (~3); - - int32 luma_pixels = luma_width * luma_height; - int32 chroma_pixels = chroma_width * chroma_height; - - uint32 bufsize = luma_pixels * 2 + luma_width * 3 + - (chroma_pixels + chroma_width) * 4; - - _iv_frame[0].y_w = _iv_frame[1].y_w = luma_width; - _iv_frame[0].y_h = _iv_frame[1].y_h = luma_height; - _iv_frame[0].uv_w = _iv_frame[1].uv_w = chroma_width; - _iv_frame[0].uv_h = _iv_frame[1].uv_h = chroma_height; - - _iv_frame[0].the_buf_size = bufsize; - _iv_frame[1].the_buf_size = 0; - - _iv_frame[0].the_buf = new byte[bufsize]; - memset(_iv_frame[0].the_buf, 0, bufsize); - _iv_frame[1].the_buf = 0; - - uint32 offs = 0; - - _iv_frame[0].Ybuf = _iv_frame[0].the_buf + luma_width; - offs += luma_pixels + luma_width * 2; - _iv_frame[1].Ybuf = _iv_frame[0].the_buf + offs; - offs += (luma_pixels + luma_width); - _iv_frame[0].Ubuf = _iv_frame[0].the_buf + offs; - offs += (chroma_pixels + chroma_width); - _iv_frame[1].Ubuf = _iv_frame[0].the_buf + offs; - offs += (chroma_pixels + chroma_width); - _iv_frame[0].Vbuf = _iv_frame[0].the_buf + offs; - offs += (chroma_pixels + chroma_width); - _iv_frame[1].Vbuf = _iv_frame[0].the_buf + offs; - - for (int i = 1; i <= luma_width; i++) - _iv_frame[0].Ybuf[-i] = _iv_frame[1].Ybuf[-i] = - _iv_frame[0].Ubuf[-i] = 0x80; - - for (int i = 1; i <= chroma_width; i++) { - _iv_frame[1].Ubuf[-i] = 0x80; - _iv_frame[0].Vbuf[-i] = 0x80; - _iv_frame[1].Vbuf[-i] = 0x80; - _iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80; - } -} - -bool Indeo3::decompressFrame(byte *inData, uint32 dataLen, - byte *outData, uint16 width, uint16 height) { - - // Not Indeo 3? Fail - if (!isIndeo3(inData, dataLen)) - return false; - - assert(outData); - assert(_palLUT); - - uint32 frameDataLen = READ_LE_UINT32(inData + 12); - - // Less data than the frame should have? Fail - if (dataLen < (frameDataLen - 16)) - return false; - - Common::MemoryReadStream frame(inData, dataLen); - - frame.skip(16); // Header - frame.skip(2); // Unknown - - uint16 flags1 = frame.readUint16LE(); - uint32 flags3 = frame.readUint32LE(); - uint8 flags2 = frame.readByte(); - - // Finding the reference frame - if (flags1 & 0x200) { - _cur_frame = _iv_frame + 1; - _ref_frame = _iv_frame; - } else { - _cur_frame = _iv_frame; - _ref_frame = _iv_frame + 1; - } - - if (flags3 == 0x80) - return true; - - frame.skip(3); - - uint16 fHeight = frame.readUint16LE(); - uint16 fWidth = frame.readUint16LE(); - - uint32 chromaHeight = ((fHeight >> 2) + 3) & 0x7FFC; - uint32 chromaWidth = ((fWidth >> 2) + 3) & 0x7FFC; - - uint32 offs; - uint32 offsY = frame.readUint32LE() + 16; - uint32 offsU = frame.readUint32LE() + 16; - uint32 offsV = frame.readUint32LE() + 16; - - frame.skip(4); - - uint32 hPos = frame.pos(); - - byte *hdr_pos = inData + hPos; - byte *buf_pos; - - // Luminance Y - frame.seek(offsY); - buf_pos = inData + offsY + 4; - offs = frame.readUint32LE(); - decodeChunk(_cur_frame->Ybuf, _ref_frame->Ybuf, fWidth, fHeight, - buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(fWidth, 160)); - - // Chrominance U - frame.seek(offsU); - buf_pos = inData + offsU + 4; - offs = frame.readUint32LE(); - decodeChunk(_cur_frame->Vbuf, _ref_frame->Vbuf, chromaWidth, chromaHeight, - buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(chromaWidth, 40)); - - // Chrominance V - frame.seek(offsV); - buf_pos = inData + offsV + 4; - offs = frame.readUint32LE(); - decodeChunk(_cur_frame->Ubuf, _ref_frame->Ubuf, chromaWidth, chromaHeight, - buf_pos + offs * 2, flags2, hdr_pos, buf_pos, MIN(chromaWidth, 40)); - - BlitState blitState; - - blitState.widthY = _cur_frame->y_w; - blitState.widthUV = _cur_frame->uv_w; - blitState.uwidthUV = chromaWidth; - blitState.uwidthOut = fWidth; - blitState.heightY = _cur_frame->y_h; - blitState.heightUV = _cur_frame->uv_h; - blitState.uheightUV = chromaHeight; - blitState.uheightOut = fHeight; - blitState.scaleWYUV = blitState.widthY / blitState.widthUV; - blitState.scaleHYUV = blitState.heightY / blitState.heightUV; - blitState.scaleWYOut = blitState.widthY / blitState.uwidthOut; - blitState.scaleHYOut = blitState.heightY / blitState.uheightOut; - blitState.lineWidthOut = blitState.scaleWYOut * blitState.uwidthOut; - blitState.lineHeightOut = blitState.scaleHYOut * blitState.uheightOut; - blitState.bufY = _cur_frame->Ybuf; - blitState.bufU = _cur_frame->Ubuf; - blitState.bufV = _cur_frame->Vbuf; - blitState.bufOut = outData; - - blitFrame(blitState); - - return true; -} - -void Indeo3::blitFrame(BlitState &s) { - if (_ditherSL) - _ditherSL->newFrame(); - - for (s.curY = 0; s.curY < s.uheightOut; s.curY++) { - if (_dither == kDitherNone) - blitLine(s); - else - blitLineDither(s); - } -} - -void Indeo3::blitLine(BlitState &s) { - byte *lineU = s.bufU + (s.curY >> 2) * s.uwidthUV; - byte *lineV = s.bufV + (s.curY >> 2) * s.uwidthUV; - - for (s.curX = 0; s.curX < s.uwidthOut; s.curX++) { - byte dataY = *s.bufY++; - byte dataU = lineU[s.curX >> 2]; - byte dataV = lineV[s.curX >> 2]; - - for (int n = 0; n < s.scaleWYOut; n++) - *s.bufOut++ = _palLUT->findNearest(dataY, dataU, dataV); - } - - byte *lineDest = s.bufOut - s.lineWidthOut; - for (int n = 1; n < s.scaleHYOut; n++) { - memcpy(s.bufOut, lineDest, s.lineWidthOut); - s.bufOut += s.lineWidthOut; - } -} - -void Indeo3::blitLineDither(BlitState &s) { - byte *lineU = s.bufU + (s.curY >> 2) * s.uwidthUV; - byte *lineV = s.bufV + (s.curY >> 2) * s.uwidthUV; - - for (uint16 i = 0; i < s.scaleHYOut; i++) { - byte *bufY = s.bufY; - - for (s.curX = 0; s.curX < s.uwidthOut; s.curX++) { - byte dataY = *bufY++; - byte dataU = lineU[s.curX >> 2]; - byte dataV = lineV[s.curX >> 2]; - - for (int n = 0; n < s.scaleWYOut; n++) - *s.bufOut++ = _ditherSL->dither(dataY, dataU, dataV, s.curX * s.scaleWYOut + n); - - } - - _ditherSL->nextLine(); - } - - s.bufY += s.uwidthOut; -} - -typedef struct { - int32 xpos; - int32 ypos; - int32 width; - int32 height; - int32 split_flag; - int32 split_direction; - int32 usl7; -} ustr_t; - -/* ---------------------------------------------------------------------- */ - -#define LV1_CHECK(buf1,rle_v3,lv1,lp2) \ - if ((lv1 & 0x80) != 0) { \ - if (rle_v3 != 0) \ - rle_v3 = 0; \ - else { \ - rle_v3 = 1; \ - buf1 -= 2; \ - } \ - } \ - lp2 = 4; - - -#define RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) \ - if (rle_v3 == 0) { \ - rle_v2 = *buf1; \ - rle_v1 = 1; \ - if (rle_v2 > 32) { \ - rle_v2 -= 32; \ - rle_v1 = 0; \ - } \ - rle_v3 = 1; \ - } \ - buf1--; - - -#define LP2_CHECK(buf1,rle_v3,lp2) \ - if (lp2 == 0 && rle_v3 != 0) \ - rle_v3 = 0; \ - else { \ - buf1--; \ - rle_v3 = 1; \ - } - - -#define RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) \ - rle_v2--; \ - if (rle_v2 == 0) { \ - rle_v3 = 0; \ - buf1 += 2; \ - } \ - lp2 = 4; - -void Indeo3::decodeChunk(byte *cur, byte *ref, int width, int height, - const byte *buf1, uint32 fflags2, const byte *hdr, - const byte *buf2, int min_width_160) { - - byte bit_buf; - uint32 bit_pos, lv, lv1, lv2; - int32 *width_tbl, width_tbl_arr[10]; - const int8 *ref_vectors; - byte *cur_frm_pos, *ref_frm_pos, *cp, *cp2; - uint32 *cur_lp, *ref_lp; - const uint32 *correction_lp[2], *correctionloworder_lp[2], *correctionhighorder_lp[2]; - uint16 *correction_type_sp[2]; - ustr_t strip_tbl[20], *strip; - int i, j, k, lp1, lp2, flag1, cmd; - int blks_width, blks_height, region_160_width; - int rle_v1, rle_v2, rle_v3; - uint16 res; - - bit_buf = 0; - ref_vectors = NULL; - - width_tbl = width_tbl_arr + 1; - i = (width < 0 ? width + 3 : width)/4; - for (j = -1; j < 8; j++) - width_tbl[j] = i * j; - - strip = strip_tbl; - - for (region_160_width = 0; region_160_width < (width - min_width_160); region_160_width += min_width_160) - ; - - strip->ypos = strip->xpos = 0; - for (strip->width = min_width_160; width > strip->width; strip->width *= 2) - ; - strip->height = height; - strip->split_direction = 0; - strip->split_flag = 0; - strip->usl7 = 0; - - bit_pos = 0; - - rle_v1 = rle_v2 = rle_v3 = 0; - - while (strip >= strip_tbl) { - if (bit_pos <= 0) { - bit_pos = 8; - bit_buf = *buf1++; - } - - bit_pos -= 2; - cmd = (bit_buf >> bit_pos) & 0x03; - - if (cmd == 0) { - strip++; - memcpy(strip, strip-1, sizeof(ustr_t)); - strip->split_flag = 1; - strip->split_direction = 0; - strip->height = (strip->height > 8 ? ((strip->height+8)>>4)<<3 : 4); - continue; - } else if (cmd == 1) { - strip++; - memcpy(strip, strip-1, sizeof(ustr_t)); - strip->split_flag = 1; - strip->split_direction = 1; - strip->width = (strip->width > 8 ? ((strip->width+8)>>4)<<3 : 4); - continue; - } else if (cmd == 2) { - if (strip->usl7 == 0) { - strip->usl7 = 1; - ref_vectors = NULL; - continue; - } - } else if (cmd == 3) { - if (strip->usl7 == 0) { - strip->usl7 = 1; - ref_vectors = (const signed char*)buf2 + (*buf1 * 2); - buf1++; - continue; - } - } - - cur_frm_pos = cur + width * strip->ypos + strip->xpos; - - if ((blks_width = strip->width) < 0) - blks_width += 3; - blks_width >>= 2; - blks_height = strip->height; - - if (ref_vectors != NULL) { - ref_frm_pos = ref + (ref_vectors[0] + strip->ypos) * width + - ref_vectors[1] + strip->xpos; - } else - ref_frm_pos = cur_frm_pos - width_tbl[4]; - - if (cmd == 2) { - if (bit_pos <= 0) { - bit_pos = 8; - bit_buf = *buf1++; - } - - bit_pos -= 2; - cmd = (bit_buf >> bit_pos) & 0x03; - - if (cmd == 0 || ref_vectors != NULL) { - for (lp1 = 0; lp1 < blks_width; lp1++) { - for (i = 0, j = 0; i < blks_height; i++, j += width_tbl[1]) - ((uint32 *)cur_frm_pos)[j] = ((uint32 *)ref_frm_pos)[j]; - cur_frm_pos += 4; - ref_frm_pos += 4; - } - } else if (cmd != 1) - return; - } else { - k = *buf1 >> 4; - j = *buf1 & 0x0f; - buf1++; - lv = j + fflags2; - - if ((lv - 8) <= 7 && (k == 0 || k == 3 || k == 10)) { - cp2 = _ModPred + ((lv - 8) << 7); - cp = ref_frm_pos; - for (i = 0; i < blks_width << 2; i++) { - int v = *cp >> 1; - *(cp++) = cp2[v]; - } - } - - if (k == 1 || k == 4) { - lv = (hdr[j] & 0xf) + fflags2; - correction_type_sp[0] = _corrector_type + (lv << 8); - correction_lp[0] = correction + (lv << 8); - lv = (hdr[j] >> 4) + fflags2; - correction_lp[1] = correction + (lv << 8); - correction_type_sp[1] = _corrector_type + (lv << 8); - } else { - correctionloworder_lp[0] = correctionloworder_lp[1] = correctionloworder + (lv << 8); - correctionhighorder_lp[0] = correctionhighorder_lp[1] = correctionhighorder + (lv << 8); - correction_type_sp[0] = correction_type_sp[1] = _corrector_type + (lv << 8); - correction_lp[0] = correction_lp[1] = correction + (lv << 8); - } - - switch (k) { - case 1: - case 0: /********** CASE 0 **********/ - for ( ; blks_height > 0; blks_height -= 4) { - for (lp1 = 0; lp1 < blks_width; lp1++) { - for (lp2 = 0; lp2 < 4; ) { - k = *buf1++; - cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2]; - ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2]; - - switch (correction_type_sp[0][k]) { - case 0: - *cur_lp = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); - lp2++; - break; - case 1: - res = ((FROM_LE_16(((uint16 *)(ref_lp))[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1; - ((uint16 *)cur_lp)[0] = FROM_LE_16(res); - res = ((FROM_LE_16(((uint16 *)(ref_lp))[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1; - ((uint16 *)cur_lp)[1] = FROM_LE_16(res); - buf1++; - lp2++; - break; - case 2: - if (lp2 == 0) { - for (i = 0, j = 0; i < 2; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 += 2; - } - break; - case 3: - if (lp2 < 2) { - for (i = 0, j = 0; i < (3 - lp2); i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 = 3; - } - break; - case 8: - if (lp2 == 0) { - RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) - - if (rle_v1 == 1 || ref_vectors != NULL) { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - } - - RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) - break; - } else { - rle_v1 = 1; - rle_v2 = *buf1 - 1; - } - case 5: - LP2_CHECK(buf1,rle_v3,lp2) - case 4: - for (i = 0, j = 0; i < (4 - lp2); i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 = 4; - break; - - case 7: - if (rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } - case 6: - if (ref_vectors != NULL) { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - } - lp2 = 4; - break; - - case 9: - lv1 = *buf1++; - lv = (lv1 & 0x7F) << 1; - lv += (lv << 8); - lv += (lv << 16); - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = lv; - - LV1_CHECK(buf1,rle_v3,lv1,lp2) - break; - default: - return; - } - } - - cur_frm_pos += 4; - ref_frm_pos += 4; - } - - cur_frm_pos += ((width - blks_width) * 4); - ref_frm_pos += ((width - blks_width) * 4); - } - break; - - case 4: - case 3: /********** CASE 3 **********/ - if (ref_vectors != NULL) - return; - flag1 = 1; - - for ( ; blks_height > 0; blks_height -= 8) { - for (lp1 = 0; lp1 < blks_width; lp1++) { - for (lp2 = 0; lp2 < 4; ) { - k = *buf1++; - - cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; - ref_lp = ((uint32 *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; - - switch (correction_type_sp[lp2 & 0x01][k]) { - case 0: - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); - if (lp2 > 0 || flag1 == 0 || strip->ypos != 0) - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - else - cur_lp[0] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); - lp2++; - break; - - case 1: - res = ((FROM_LE_16(((uint16 *)ref_lp)[0]) >> 1) + correction_lp[lp2 & 0x01][*buf1]) << 1; - ((uint16 *)cur_lp)[width_tbl[2]] = FROM_LE_16(res); - res = ((FROM_LE_16(((uint16 *)ref_lp)[1]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1; - ((uint16 *)cur_lp)[width_tbl[2]+1] = FROM_LE_16(res); - - if (lp2 > 0 || flag1 == 0 || strip->ypos != 0) - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - else - cur_lp[0] = cur_lp[width_tbl[1]]; - buf1++; - lp2++; - break; - - case 2: - if (lp2 == 0) { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = *ref_lp; - lp2 += 2; - } - break; - - case 3: - if (lp2 < 2) { - for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) - cur_lp[j] = *ref_lp; - lp2 = 3; - } - break; - - case 6: - lp2 = 4; - break; - - case 7: - if (rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } - lp2 = 4; - break; - - case 8: - if (lp2 == 0) { - RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) - - if (rle_v1 == 1) { - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - } - - RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) - break; - } else { - rle_v2 = (*buf1) - 1; - rle_v1 = 1; - } - case 5: - LP2_CHECK(buf1,rle_v3,lp2) - case 4: - for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) - cur_lp[j] = *ref_lp; - lp2 = 4; - break; - - case 9: - warning("Indeo3::decodeChunk: Untested (1)"); - lv1 = *buf1++; - lv = (lv1 & 0x7F) << 1; - lv += (lv << 8); - lv += (lv << 16); - - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = lv; - - LV1_CHECK(buf1,rle_v3,lv1,lp2) - break; - - default: - return; - } - } - - cur_frm_pos += 4; - } - - cur_frm_pos += (((width * 2) - blks_width) * 4); - flag1 = 0; - } - break; - - case 10: /********** CASE 10 **********/ - if (ref_vectors == NULL) { - flag1 = 1; - - for ( ; blks_height > 0; blks_height -= 8) { - for (lp1 = 0; lp1 < blks_width; lp1 += 2) { - for (lp2 = 0; lp2 < 4; ) { - k = *buf1++; - cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; - ref_lp = ((uint32 *)cur_frm_pos) + width_tbl[(lp2 * 2) - 1]; - lv1 = ref_lp[0]; - lv2 = ref_lp[1]; - if (lp2 == 0 && flag1 != 0) { -#if defined(SCUMM_BIG_ENDIAN) - lv1 = lv1 & 0xFF00FF00; - lv1 = (lv1 >> 8) | lv1; - lv2 = lv2 & 0xFF00FF00; - lv2 = (lv2 >> 8) | lv2; -#else - lv1 = lv1 & 0x00FF00FF; - lv1 = (lv1 << 8) | lv1; - lv2 = lv2 & 0x00FF00FF; - lv2 = (lv2 << 8) | lv2; -#endif - } - - switch (correction_type_sp[lp2 & 0x01][k]) { - case 0: - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1); - cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(lv2) >> 1) + correctionhighorder_lp[lp2 & 0x01][k]) << 1); - if (lp2 > 0 || strip->ypos != 0 || flag1 == 0) { - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - cur_lp[0] = cur_lp[width_tbl[1]]; - cur_lp[1] = cur_lp[width_tbl[1]+1]; - } - lp2++; - break; - - case 1: - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(lv1) >> 1) + correctionloworder_lp[lp2 & 0x01][*buf1]) << 1); - cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(lv2) >> 1) + correctionloworder_lp[lp2 & 0x01][k]) << 1); - if (lp2 > 0 || strip->ypos != 0 || flag1 == 0) { - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - cur_lp[0] = cur_lp[width_tbl[1]]; - cur_lp[1] = cur_lp[width_tbl[1]+1]; - } - buf1++; - lp2++; - break; - - case 2: - if (lp2 == 0) { - if (flag1 != 0) { - for (i = 0, j = width_tbl[1]; i < 3; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - } - lp2 += 2; - } - break; - - case 3: - if (lp2 < 2) { - if (lp2 == 0 && flag1 != 0) { - for (i = 0, j = width_tbl[1]; i < 5; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - } - lp2 = 3; - } - break; - - case 8: - if (lp2 == 0) { - RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) - if (rle_v1 == 1) { - if (flag1 != 0) { - for (i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - } - } - RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) - break; - } else { - rle_v1 = 1; - rle_v2 = (*buf1) - 1; - } - case 5: - LP2_CHECK(buf1,rle_v3,lp2) - case 4: - if (lp2 == 0 && flag1 != 0) { - for (i = 0, j = width_tbl[1]; i < 7; i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - cur_lp[0] = ((cur_lp[-width_tbl[1]] >> 1) + (cur_lp[width_tbl[1]] >> 1)) & 0xFEFEFEFE; - cur_lp[1] = ((cur_lp[-width_tbl[1]+1] >> 1) + (cur_lp[width_tbl[1]+1] >> 1)) & 0xFEFEFEFE; - } else { - for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { - cur_lp[j] = lv1; - cur_lp[j+1] = lv2; - } - } - lp2 = 4; - break; - - case 6: - lp2 = 4; - break; - - case 7: - if (lp2 == 0) { - if (rle_v3 != 0) - rle_v3 = 0; - else { - buf1--; - rle_v3 = 1; - } - lp2 = 4; - } - break; - - case 9: - warning("Indeo3::decodeChunk: Untested (2)"); - lv1 = *buf1; - lv = (lv1 & 0x7F) << 1; - lv += (lv << 8); - lv += (lv << 16); - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) - cur_lp[j] = lv; - LV1_CHECK(buf1,rle_v3,lv1,lp2) - break; - - default: - return; - } - } - - cur_frm_pos += 8; - } - - cur_frm_pos += (((width * 2) - blks_width) * 4); - flag1 = 0; - } - } else { - for ( ; blks_height > 0; blks_height -= 8) { - for (lp1 = 0; lp1 < blks_width; lp1 += 2) { - for (lp2 = 0; lp2 < 4; ) { - k = *buf1++; - cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; - ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2 * 2]; - - switch (correction_type_sp[lp2 & 0x01][k]) { - case 0: - lv1 = correctionloworder_lp[lp2 & 0x01][k]; - lv2 = correctionhighorder_lp[lp2 & 0x01][k]; - cur_lp[0] = FROM_LE_32(((FROM_LE_32(ref_lp[0]) >> 1) + lv1) << 1); - cur_lp[1] = FROM_LE_32(((FROM_LE_32(ref_lp[1]) >> 1) + lv2) << 1); - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1); - cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1); - lp2++; - break; - - case 1: - lv1 = correctionloworder_lp[lp2 & 0x01][*buf1++]; - lv2 = correctionloworder_lp[lp2 & 0x01][k]; - cur_lp[0] = FROM_LE_32(((FROM_LE_32(ref_lp[0]) >> 1) + lv1) << 1); - cur_lp[1] = FROM_LE_32(((FROM_LE_32(ref_lp[1]) >> 1) + lv2) << 1); - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + lv1) << 1); - cur_lp[width_tbl[1]+1] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]+1]) >> 1) + lv2) << 1); - lp2++; - break; - - case 2: - if (lp2 == 0) { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) { - cur_lp[j] = ref_lp[j]; - cur_lp[j+1] = ref_lp[j+1]; - } - lp2 += 2; - } - break; - - case 3: - if (lp2 < 2) { - for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) { - cur_lp[j] = ref_lp[j]; - cur_lp[j+1] = ref_lp[j+1]; - } - lp2 = 3; - } - break; - - case 8: - if (lp2 == 0) { - RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) { - ((uint32 *)cur_frm_pos)[j] = ((uint32 *)ref_frm_pos)[j]; - ((uint32 *)cur_frm_pos)[j+1] = ((uint32 *)ref_frm_pos)[j+1]; - } - RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) - break; - } else { - rle_v1 = 1; - rle_v2 = (*buf1) - 1; - } - case 5: - case 7: - LP2_CHECK(buf1,rle_v3,lp2) - case 6: - case 4: - for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) { - cur_lp[j] = ref_lp[j]; - cur_lp[j+1] = ref_lp[j+1]; - } - lp2 = 4; - break; - - case 9: - warning("Indeo3::decodeChunk: Untested (3)"); - lv1 = *buf1; - lv = (lv1 & 0x7F) << 1; - lv += (lv << 8); - lv += (lv << 16); - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) - ((uint32 *)cur_frm_pos)[j] = ((uint32 *)cur_frm_pos)[j+1] = lv; - LV1_CHECK(buf1,rle_v3,lv1,lp2) - break; - - default: - return; - } - } - - cur_frm_pos += 8; - ref_frm_pos += 8; - } - - cur_frm_pos += (((width * 2) - blks_width) * 4); - ref_frm_pos += (((width * 2) - blks_width) * 4); - } - } - break; - - case 11: /********** CASE 11 **********/ - if (ref_vectors == NULL) - return; - - for ( ; blks_height > 0; blks_height -= 8) { - for (lp1 = 0; lp1 < blks_width; lp1++) { - for (lp2 = 0; lp2 < 4; ) { - k = *buf1++; - cur_lp = ((uint32 *)cur_frm_pos) + width_tbl[lp2 * 2]; - ref_lp = ((uint32 *)ref_frm_pos) + width_tbl[lp2 * 2]; - - switch (correction_type_sp[lp2 & 0x01][k]) { - case 0: - cur_lp[0] = FROM_LE_32(((FROM_LE_32(*ref_lp) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); - cur_lp[width_tbl[1]] = FROM_LE_32(((FROM_LE_32(ref_lp[width_tbl[1]]) >> 1) + correction_lp[lp2 & 0x01][k]) << 1); - lp2++; - break; - - case 1: - lv1 = (uint16)(correction_lp[lp2 & 0x01][*buf1++]); - lv2 = (uint16)(correction_lp[lp2 & 0x01][k]); - res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[0]) >> 1) + lv1) << 1); - ((uint16 *)cur_lp)[0] = FROM_LE_16(res); - res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[1]) >> 1) + lv2) << 1); - ((uint16 *)cur_lp)[1] = FROM_LE_16(res); - res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[width_tbl[2]]) >> 1) + lv1) << 1); - ((uint16 *)cur_lp)[width_tbl[2]] = FROM_LE_16(res); - res = (uint16)(((FROM_LE_16(((uint16 *)ref_lp)[width_tbl[2]+1]) >> 1) + lv2) << 1); - ((uint16 *)cur_lp)[width_tbl[2]+1] = FROM_LE_16(res); - lp2++; - break; - - case 2: - if (lp2 == 0) { - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 += 2; - } - break; - - case 3: - if (lp2 < 2) { - for (i = 0, j = 0; i < 6 - (lp2 * 2); i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 = 3; - } - break; - - case 8: - if (lp2 == 0) { - RLE_V3_CHECK(buf1,rle_v1,rle_v2,rle_v3) - - for (i = 0, j = 0; i < 8; i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - - RLE_V2_CHECK(buf1,rle_v2, rle_v3,lp2) - break; - } else { - rle_v1 = 1; - rle_v2 = (*buf1) - 1; - } - case 5: - case 7: - LP2_CHECK(buf1,rle_v3,lp2) - case 4: - case 6: - for (i = 0, j = 0; i < 8 - (lp2 * 2); i++, j += width_tbl[1]) - cur_lp[j] = ref_lp[j]; - lp2 = 4; - break; - - case 9: - warning("Indeo3::decodeChunk: Untested (4)"); - lv1 = *buf1++; - lv = (lv1 & 0x7F) << 1; - lv += (lv << 8); - lv += (lv << 16); - for (i = 0, j = 0; i < 4; i++, j += width_tbl[1]) - cur_lp[j] = lv; - LV1_CHECK(buf1,rle_v3,lv1,lp2) - break; - - default: - return; - } - } - - cur_frm_pos += 4; - ref_frm_pos += 4; - } - - cur_frm_pos += (((width * 2) - blks_width) * 4); - ref_frm_pos += (((width * 2) - blks_width) * 4); - } - break; - - default: - // FIXME: I've seen case 13 happen in Urban - // Runner. Perhaps it uses a more recent form of - // Indeo 3? There appears to have been several. - warning("Indeo3::decodeChunk: Unknown case %d", k); - return; - } - } - - if (strip < strip_tbl) - return; - - for ( ; strip >= strip_tbl; strip--) { - if (strip->split_flag != 0) { - strip->split_flag = 0; - strip->usl7 = (strip-1)->usl7; - - if (strip->split_direction) { - strip->xpos += strip->width; - strip->width = (strip-1)->width - strip->width; - if (region_160_width <= strip->xpos && width < strip->width + strip->xpos) - strip->width = width - strip->xpos; - } else { - strip->ypos += strip->height; - strip->height = (strip-1)->height - strip->height; - } - break; - } - } - } -} - -// static data - -const int Indeo3::_corrector_type_0[24] = { - 195, 159, 133, 115, 101, 93, 87, 77, - 195, 159, 133, 115, 101, 93, 87, 77, - 128, 79, 79, 79, 79, 79, 79, 79 -}; - -const int Indeo3::_corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 }; - -const uint32 Indeo3::correction[] = { - 0x00000000, 0x00000202, 0xfffffdfe, 0x000002ff, 0xfffffd01, 0xffffff03, 0x000000fd, 0x00000404, - 0xfffffbfc, 0x00000501, 0xfffffaff, 0x00000105, 0xfffffefb, 0x000003fc, 0xfffffc04, 0x000005fe, - 0xfffffa02, 0xfffffe06, 0x000001fa, 0x00000904, 0xfffff6fc, 0x00000409, 0xfffffbf7, 0x00000909, - 0xfffff6f7, 0x00000a01, 0xfffff5ff, 0x0000010a, 0xfffffef6, 0x000007fb, 0xfffff805, 0xfffffb08, - 0x000004f8, 0x00000f09, 0xfffff0f7, 0x0000090f, 0xfffff6f1, 0x00000bfd, 0xfffff403, 0xfffffd0c, - 0x000002f4, 0x00001004, 0xffffeffc, 0x00000410, 0xfffffbf0, 0x00001010, 0xffffeff0, 0x00001200, - 0xffffee00, 0x00000012, 0xffffffee, 0x00000bf4, 0xfffff40c, 0x00000ff7, 0xfffff009, 0xfffff710, - 0x000008f0, 0x00001b0b, 0xffffe4f5, 0x00000b1b, 0xfffff4e5, 0x00001c13, 0xffffe3ed, 0x0000131c, - 0xffffece4, 0x000015fa, 0xffffea06, 0xfffffa16, 0x000005ea, 0x00001d04, 0xffffe2fc, 0x0000041d, - 0xfffffbe3, 0x00001e1e, 0xffffe1e2, 0x000020fe, 0xffffdf02, 0xfffffe21, 0x000001df, 0x000016ee, - 0xffffe912, 0xffffee17, 0x000011e9, 0x00001df1, 0xffffe20f, 0xfffff11e, 0x00000ee2, 0x00002e16, - 0xffffd1ea, 0x0000162e, 0xffffe9d2, 0x00002f0d, 0xffffd0f3, 0x00000d2f, 0xfffff2d1, 0x00003123, - 0xffffcedd, 0x00002331, 0xffffdccf, 0x000028f5, 0xffffd70b, 0xfffff529, 0x00000ad7, 0x00003304, - 0xffffccfc, 0x00000433, 0xfffffbcd, 0x00003636, 0xffffc9ca, 0x000021de, 0xffffde22, 0x000029e3, - 0xffffd61d, 0xffffe32a, 0x00001cd6, 0x00003bfa, 0xffffc406, 0xfffffa3c, 0x000005c4, 0x00004c1b, - 0xffffb3e5, 0x00001b4c, 0xffffe4b4, 0x00004d2b, 0xffffb2d5, 0x00002b4d, 0xffffd4b3, 0x000036e8, - 0xffffc918, 0xffffe837, 0x000017c9, 0x00004f0e, 0xffffb0f2, 0x00000e4f, 0xfffff1b1, 0x0000533f, - 0xffffacc1, 0x00003f53, 0xffffc0ad, 0x000049ec, 0xffffb614, 0xffffec4a, 0x000013b6, 0x00005802, - 0xffffa7fe, 0x00000258, 0xfffffda8, 0x00005d5d, 0xffffa2a3, 0x00003ccc, 0xffffc334, 0xffffcc3d, - 0x000033c3, 0x00007834, 0xffff87cc, 0x00003478, 0xffffcb88, 0x00004ad3, 0xffffb52d, 0xffffd34b, - 0x00002cb5, 0x00007d4b, 0xffff82b5, 0x00004b7d, 0xffffb483, 0x00007a21, 0xffff85df, 0x0000217a, - 0xffffde86, 0x000066f3, 0xffff990d, 0xfffff367, 0x00000c99, 0x00005fd8, 0xffffa028, 0xffffd860, - 0x000027a0, 0x00007ede, 0xffff8122, 0xffffde7f, 0x00002181, 0x000058a7, 0xffffa759, 0x000068b2, - 0xffff974e, 0xffffb269, 0x00004d97, 0x00000c0c, 0xfffff3f4, 0x00001717, 0xffffe8e9, 0x00002a2a, - 0xffffd5d6, 0x00004949, 0xffffb6b7, 0x00000000, 0x02020000, 0xfdfe0000, 0x02ff0000, 0xfd010000, - 0xff030000, 0x00fd0000, 0x00000202, 0x02020202, 0xfdfe0202, 0x02ff0202, 0xfd010202, 0xff030202, - 0x00fd0202, 0xfffffdfe, 0x0201fdfe, 0xfdfdfdfe, 0x02fefdfe, 0xfd00fdfe, 0xff02fdfe, 0x00fcfdfe, - 0x000002ff, 0x020202ff, 0xfdfe02ff, 0x02ff02ff, 0xfd0102ff, 0xff0302ff, 0x00fd02ff, 0xfffffd01, - 0x0201fd01, 0xfdfdfd01, 0x02fefd01, 0xfd00fd01, 0xff02fd01, 0x00fcfd01, 0xffffff03, 0x0201ff03, - 0xfdfdff03, 0x02feff03, 0xfd00ff03, 0xff02ff03, 0x00fcff03, 0x000000fd, 0x020200fd, 0xfdfe00fd, - 0x02ff00fd, 0xfd0100fd, 0xff0300fd, 0x00fd00fd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000303, 0xfffffcfd, 0x000003ff, 0xfffffc01, 0xffffff04, 0x000000fc, 0x00000707, - 0xfffff8f9, 0x00000802, 0xfffff7fe, 0x00000208, 0xfffffdf8, 0x000008fe, 0xfffff702, 0xfffffe09, - 0x000001f7, 0x000005fa, 0xfffffa06, 0x00000d06, 0xfffff2fa, 0x0000060d, 0xfffff9f3, 0x00000d0d, - 0xfffff2f3, 0x00000e01, 0xfffff1ff, 0x0000010e, 0xfffffef2, 0x00000bf8, 0xfffff408, 0xfffff80c, - 0x000007f4, 0x0000170e, 0xffffe8f2, 0x00000e17, 0xfffff1e9, 0x000011fb, 0xffffee05, 0xfffffb12, - 0x000004ee, 0x00001806, 0xffffe7fa, 0x00000618, 0xfffff9e8, 0x00001818, 0xffffe7e8, 0x00001aff, - 0xffffe501, 0xffffff1b, 0x000000e5, 0x000010ef, 0xffffef11, 0x000016f3, 0xffffe90d, 0xfffff317, - 0x00000ce9, 0x00002810, 0xffffd7f0, 0x00001028, 0xffffefd8, 0x0000291c, 0xffffd6e4, 0x00001c29, - 0xffffe3d7, 0x000020f7, 0xffffdf09, 0xfffff721, 0x000008df, 0x00002b06, 0xffffd4fa, 0x0000062b, - 0xfffff9d5, 0x00002e2e, 0xffffd1d2, 0x000031fc, 0xffffce04, 0xfffffc32, 0x000003ce, 0x000021e5, - 0xffffde1b, 0xffffe522, 0x00001ade, 0x00002cea, 0xffffd316, 0xffffea2d, 0x000015d3, 0x00004522, - 0xffffbade, 0x00002245, 0xffffddbb, 0x00004613, 0xffffb9ed, 0x00001346, 0xffffecba, 0x00004935, - 0xffffb6cb, 0x00003549, 0xffffcab7, 0x00003def, 0xffffc211, 0xffffef3e, 0x000010c2, 0x00004d05, - 0xffffb2fb, 0x0000054d, 0xfffffab3, 0x00005252, 0xffffadae, 0x000032cd, 0xffffcd33, 0x00003fd5, - 0xffffc02b, 0xffffd540, 0x00002ac0, 0x000059f6, 0xffffa60a, 0xfffff65a, 0x000009a6, 0x00007229, - 0xffff8dd7, 0x00002972, 0xffffd68e, 0x00007440, 0xffff8bc0, 0x00004074, 0xffffbf8c, 0x000051db, - 0xffffae25, 0xffffdb52, 0x000024ae, 0x00007716, 0xffff88ea, 0x00001677, 0xffffe989, 0x00007c5f, - 0xffff83a1, 0x00005f7c, 0xffffa084, 0x00006ee2, 0xffff911e, 0xffffe26f, 0x00001d91, 0x00005bb2, - 0xffffa44e, 0xffffb25c, 0x00004da4, 0x000070bc, 0xffff8f44, 0xffffbc71, 0x0000438f, 0x00001212, - 0xffffedee, 0x00002222, 0xffffddde, 0x00003f3f, 0xffffc0c1, 0x00006d6d, 0xffff9293, 0x00000000, - 0x03030000, 0xfcfd0000, 0x03ff0000, 0xfc010000, 0xff040000, 0x00fc0000, 0x07070000, 0xf8f90000, - 0x00000303, 0x03030303, 0xfcfd0303, 0x03ff0303, 0xfc010303, 0xff040303, 0x00fc0303, 0x07070303, - 0xf8f90303, 0xfffffcfd, 0x0302fcfd, 0xfcfcfcfd, 0x03fefcfd, 0xfc00fcfd, 0xff03fcfd, 0x00fbfcfd, - 0x0706fcfd, 0xf8f8fcfd, 0x000003ff, 0x030303ff, 0xfcfd03ff, 0x03ff03ff, 0xfc0103ff, 0xff0403ff, - 0x00fc03ff, 0x070703ff, 0xf8f903ff, 0xfffffc01, 0x0302fc01, 0xfcfcfc01, 0x03fefc01, 0xfc00fc01, - 0xff03fc01, 0x00fbfc01, 0x0706fc01, 0xf8f8fc01, 0xffffff04, 0x0302ff04, 0xfcfcff04, 0x03feff04, - 0xfc00ff04, 0xff03ff04, 0x00fbff04, 0x0706ff04, 0xf8f8ff04, 0x000000fc, 0x030300fc, 0xfcfd00fc, - 0x03ff00fc, 0xfc0100fc, 0xff0400fc, 0x00fc00fc, 0x070700fc, 0xf8f900fc, 0x00000707, 0x03030707, - 0xfcfd0707, 0x03ff0707, 0xfc010707, 0xff040707, 0x00fc0707, 0x07070707, 0xf8f90707, 0xfffff8f9, - 0x0302f8f9, 0xfcfcf8f9, 0x03fef8f9, 0xfc00f8f9, 0xff03f8f9, 0x00fbf8f9, 0x0706f8f9, 0xf8f8f8f9, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000404, 0xfffffbfc, 0x000004ff, 0xfffffb01, 0xffffff05, 0x000000fb, 0x00000a03, - 0xfffff5fd, 0x0000030a, 0xfffffcf6, 0x00000909, 0xfffff6f7, 0x000006f9, 0xfffff907, 0x00000bfd, - 0xfffff403, 0xfffffd0c, 0x000002f4, 0x00001108, 0xffffeef8, 0x00000811, 0xfffff7ef, 0x00001111, - 0xffffeeef, 0x00001301, 0xffffecff, 0x00000113, 0xfffffeed, 0x00000ff5, 0xfffff00b, 0xfffff510, - 0x00000af0, 0x000016fa, 0xffffe906, 0xfffffa17, 0x000005e9, 0x00001f12, 0xffffe0ee, 0x0000121f, - 0xffffede1, 0x00002008, 0xffffdff8, 0x00000820, 0xfffff7e0, 0x00002121, 0xffffdedf, 0x000023ff, - 0xffffdc01, 0xffffff24, 0x000000dc, 0x000016e9, 0xffffe917, 0x00001eef, 0xffffe111, 0xffffef1f, - 0x000010e1, 0x00003615, 0xffffc9eb, 0x00001536, 0xffffeaca, 0x00003725, 0xffffc8db, 0x00002537, - 0xffffdac9, 0x00002bf4, 0xffffd40c, 0xfffff42c, 0x00000bd4, 0x00003908, 0xffffc6f8, 0x00000839, - 0xfffff7c7, 0x00003d3d, 0xffffc2c3, 0x000041fb, 0xffffbe05, 0xfffffb42, 0x000004be, 0x00002cdc, - 0xffffd324, 0xffffdc2d, 0x000023d3, 0x00003be3, 0xffffc41d, 0xffffe33c, 0x00001cc4, 0x00005c2d, - 0xffffa3d3, 0x00002d5c, 0xffffd2a4, 0x00005d19, 0xffffa2e7, 0x0000195d, 0xffffe6a3, 0x00006147, - 0xffff9eb9, 0x00004761, 0xffffb89f, 0x000052ea, 0xffffad16, 0xffffea53, 0x000015ad, 0x00006607, - 0xffff99f9, 0x00000766, 0xfffff89a, 0x00006d6d, 0xffff9293, 0x000043bc, 0xffffbc44, 0x000054c7, - 0xffffab39, 0xffffc755, 0x000038ab, 0x000077f3, 0xffff880d, 0xfffff378, 0x00000c88, 0x00006dcf, - 0xffff9231, 0xffffcf6e, 0x00003092, 0x00007a98, 0xffff8568, 0xffff987b, 0x00006785, 0x00001818, - 0xffffe7e8, 0x00002e2e, 0xffffd1d2, 0x00005454, 0xffffabac, 0x00000000, 0x04040000, 0xfbfc0000, - 0x04ff0000, 0xfb010000, 0xff050000, 0x00fb0000, 0x0a030000, 0xf5fd0000, 0x030a0000, 0x00000404, - 0x04040404, 0xfbfc0404, 0x04ff0404, 0xfb010404, 0xff050404, 0x00fb0404, 0x0a030404, 0xf5fd0404, - 0x030a0404, 0xfffffbfc, 0x0403fbfc, 0xfbfbfbfc, 0x04fefbfc, 0xfb00fbfc, 0xff04fbfc, 0x00fafbfc, - 0x0a02fbfc, 0xf5fcfbfc, 0x0309fbfc, 0x000004ff, 0x040404ff, 0xfbfc04ff, 0x04ff04ff, 0xfb0104ff, - 0xff0504ff, 0x00fb04ff, 0x0a0304ff, 0xf5fd04ff, 0x030a04ff, 0xfffffb01, 0x0403fb01, 0xfbfbfb01, - 0x04fefb01, 0xfb00fb01, 0xff04fb01, 0x00fafb01, 0x0a02fb01, 0xf5fcfb01, 0x0309fb01, 0xffffff05, - 0x0403ff05, 0xfbfbff05, 0x04feff05, 0xfb00ff05, 0xff04ff05, 0x00faff05, 0x0a02ff05, 0xf5fcff05, - 0x0309ff05, 0x000000fb, 0x040400fb, 0xfbfc00fb, 0x04ff00fb, 0xfb0100fb, 0xff0500fb, 0x00fb00fb, - 0x0a0300fb, 0xf5fd00fb, 0x030a00fb, 0x00000a03, 0x04040a03, 0xfbfc0a03, 0x04ff0a03, 0xfb010a03, - 0xff050a03, 0x00fb0a03, 0x0a030a03, 0xf5fd0a03, 0x030a0a03, 0xfffff5fd, 0x0403f5fd, 0xfbfbf5fd, - 0x04fef5fd, 0xfb00f5fd, 0xff04f5fd, 0x00faf5fd, 0x0a02f5fd, 0xf5fcf5fd, 0x0309f5fd, 0x0000030a, - 0x0404030a, 0xfbfc030a, 0x04ff030a, 0xfb01030a, 0xff05030a, 0x00fb030a, 0x0a03030a, 0xf5fd030a, - 0x030a030a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000505, 0xfffffafb, 0x000006fe, 0xfffff902, 0xfffffe07, 0x000001f9, 0x00000b0b, - 0xfffff4f5, 0x00000d03, 0xfffff2fd, 0x0000030d, 0xfffffcf3, 0x000008f7, 0xfffff709, 0x00000efc, - 0xfffff104, 0xfffffc0f, 0x000003f1, 0x0000160b, 0xffffe9f5, 0x00000b16, 0xfffff4ea, 0x00001515, - 0xffffeaeb, 0x00001802, 0xffffe7fe, 0x00000218, 0xfffffde8, 0x000013f2, 0xffffec0e, 0xfffff214, - 0x00000dec, 0x00002617, 0xffffd9e9, 0x00001726, 0xffffe8da, 0x00001cf8, 0xffffe308, 0xfffff81d, - 0x000007e3, 0x0000270b, 0xffffd8f5, 0x00000b27, 0xfffff4d9, 0x00002929, 0xffffd6d7, 0x00002cff, - 0xffffd301, 0xffffff2d, 0x000000d3, 0x00001ce3, 0xffffe31d, 0x000026ea, 0xffffd916, 0xffffea27, - 0x000015d9, 0x0000431b, 0xffffbce5, 0x00001b43, 0xffffe4bd, 0x0000452f, 0xffffbad1, 0x00002f45, - 0xffffd0bb, 0x000037f1, 0xffffc80f, 0xfffff138, 0x00000ec8, 0x0000470b, 0xffffb8f5, 0x00000b47, - 0xfffff4b9, 0x00004c4c, 0xffffb3b4, 0x000052fa, 0xffffad06, 0xfffffa53, 0x000005ad, 0x000038d3, - 0xffffc72d, 0xffffd339, 0x00002cc7, 0x00004adc, 0xffffb524, 0xffffdc4b, 0x000023b5, 0x00007338, - 0xffff8cc8, 0x00003873, 0xffffc78d, 0x0000751f, 0xffff8ae1, 0x00001f75, 0xffffe08b, 0x00007a58, - 0xffff85a8, 0x0000587a, 0xffffa786, 0x000067e4, 0xffff981c, 0xffffe468, 0x00001b98, 0x000054ab, - 0xffffab55, 0x000069b8, 0xffff9648, 0xffffb86a, 0x00004796, 0x00001e1e, 0xffffe1e2, 0x00003a3a, - 0xffffc5c6, 0x00006969, 0xffff9697, 0x00000000, 0x05050000, 0xfafb0000, 0x06fe0000, 0xf9020000, - 0xfe070000, 0x01f90000, 0x0b0b0000, 0xf4f50000, 0x0d030000, 0xf2fd0000, 0x00000505, 0x05050505, - 0xfafb0505, 0x06fe0505, 0xf9020505, 0xfe070505, 0x01f90505, 0x0b0b0505, 0xf4f50505, 0x0d030505, - 0xf2fd0505, 0xfffffafb, 0x0504fafb, 0xfafafafb, 0x06fdfafb, 0xf901fafb, 0xfe06fafb, 0x01f8fafb, - 0x0b0afafb, 0xf4f4fafb, 0x0d02fafb, 0xf2fcfafb, 0x000006fe, 0x050506fe, 0xfafb06fe, 0x06fe06fe, - 0xf90206fe, 0xfe0706fe, 0x01f906fe, 0x0b0b06fe, 0xf4f506fe, 0x0d0306fe, 0xf2fd06fe, 0xfffff902, - 0x0504f902, 0xfafaf902, 0x06fdf902, 0xf901f902, 0xfe06f902, 0x01f8f902, 0x0b0af902, 0xf4f4f902, - 0x0d02f902, 0xf2fcf902, 0xfffffe07, 0x0504fe07, 0xfafafe07, 0x06fdfe07, 0xf901fe07, 0xfe06fe07, - 0x01f8fe07, 0x0b0afe07, 0xf4f4fe07, 0x0d02fe07, 0xf2fcfe07, 0x000001f9, 0x050501f9, 0xfafb01f9, - 0x06fe01f9, 0xf90201f9, 0xfe0701f9, 0x01f901f9, 0x0b0b01f9, 0xf4f501f9, 0x0d0301f9, 0xf2fd01f9, - 0x00000b0b, 0x05050b0b, 0xfafb0b0b, 0x06fe0b0b, 0xf9020b0b, 0xfe070b0b, 0x01f90b0b, 0x0b0b0b0b, - 0xf4f50b0b, 0x0d030b0b, 0xf2fd0b0b, 0xfffff4f5, 0x0504f4f5, 0xfafaf4f5, 0x06fdf4f5, 0xf901f4f5, - 0xfe06f4f5, 0x01f8f4f5, 0x0b0af4f5, 0xf4f4f4f5, 0x0d02f4f5, 0xf2fcf4f5, 0x00000d03, 0x05050d03, - 0xfafb0d03, 0x06fe0d03, 0xf9020d03, 0xfe070d03, 0x01f90d03, 0x0b0b0d03, 0xf4f50d03, 0x0d030d03, - 0xf2fd0d03, 0xfffff2fd, 0x0504f2fd, 0xfafaf2fd, 0x06fdf2fd, 0xf901f2fd, 0xfe06f2fd, 0x01f8f2fd, - 0x0b0af2fd, 0xf4f4f2fd, 0x0d02f2fd, 0xf2fcf2fd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000606, 0xfffff9fa, 0x000007fe, 0xfffff802, 0xfffffe08, 0x000001f8, 0x00000d0d, - 0xfffff2f3, 0x00000f04, 0xfffff0fc, 0x0000040f, 0xfffffbf1, 0x00000af5, 0xfffff50b, 0x000011fb, - 0xffffee05, 0xfffffb12, 0x000004ee, 0x00001a0d, 0xffffe5f3, 0x00000d1a, 0xfffff2e6, 0x00001a1a, - 0xffffe5e6, 0x00001d02, 0xffffe2fe, 0x0000021d, 0xfffffde3, 0x000017f0, 0xffffe810, 0xfffff018, - 0x00000fe8, 0x00002e1c, 0xffffd1e4, 0x00001c2e, 0xffffe3d2, 0x000022f7, 0xffffdd09, 0xfffff723, - 0x000008dd, 0x00002f0d, 0xffffd0f3, 0x00000d2f, 0xfffff2d1, 0x00003131, 0xffffcecf, 0x000035ff, - 0xffffca01, 0xffffff36, 0x000000ca, 0x000022dd, 0xffffdd23, 0x00002ee6, 0xffffd11a, 0xffffe62f, - 0x000019d1, 0x00005120, 0xffffaee0, 0x00002051, 0xffffdfaf, 0x00005338, 0xffffacc8, 0x00003853, - 0xffffc7ad, 0x000042ee, 0xffffbd12, 0xffffee43, 0x000011bd, 0x0000560d, 0xffffa9f3, 0x00000d56, - 0xfffff2aa, 0x00005b5b, 0xffffa4a5, 0x000062f9, 0xffff9d07, 0xfffff963, 0x0000069d, 0x000043ca, - 0xffffbc36, 0xffffca44, 0x000035bc, 0x000059d4, 0xffffa62c, 0xffffd45a, 0x00002ba6, 0x00007bdf, - 0xffff8421, 0xffffdf7c, 0x00002084, 0x00006699, 0xffff9967, 0x00007eaa, 0xffff8156, 0xffffaa7f, - 0x00005581, 0x00002525, 0xffffdadb, 0x00004545, 0xffffbabb, 0x00000000, 0x06060000, 0xf9fa0000, - 0x07fe0000, 0xf8020000, 0xfe080000, 0x01f80000, 0x0d0d0000, 0xf2f30000, 0x0f040000, 0xf0fc0000, - 0x040f0000, 0x00000606, 0x06060606, 0xf9fa0606, 0x07fe0606, 0xf8020606, 0xfe080606, 0x01f80606, - 0x0d0d0606, 0xf2f30606, 0x0f040606, 0xf0fc0606, 0x040f0606, 0xfffff9fa, 0x0605f9fa, 0xf9f9f9fa, - 0x07fdf9fa, 0xf801f9fa, 0xfe07f9fa, 0x01f7f9fa, 0x0d0cf9fa, 0xf2f2f9fa, 0x0f03f9fa, 0xf0fbf9fa, - 0x040ef9fa, 0x000007fe, 0x060607fe, 0xf9fa07fe, 0x07fe07fe, 0xf80207fe, 0xfe0807fe, 0x01f807fe, - 0x0d0d07fe, 0xf2f307fe, 0x0f0407fe, 0xf0fc07fe, 0x040f07fe, 0xfffff802, 0x0605f802, 0xf9f9f802, - 0x07fdf802, 0xf801f802, 0xfe07f802, 0x01f7f802, 0x0d0cf802, 0xf2f2f802, 0x0f03f802, 0xf0fbf802, - 0x040ef802, 0xfffffe08, 0x0605fe08, 0xf9f9fe08, 0x07fdfe08, 0xf801fe08, 0xfe07fe08, 0x01f7fe08, - 0x0d0cfe08, 0xf2f2fe08, 0x0f03fe08, 0xf0fbfe08, 0x040efe08, 0x000001f8, 0x060601f8, 0xf9fa01f8, - 0x07fe01f8, 0xf80201f8, 0xfe0801f8, 0x01f801f8, 0x0d0d01f8, 0xf2f301f8, 0x0f0401f8, 0xf0fc01f8, - 0x040f01f8, 0x00000d0d, 0x06060d0d, 0xf9fa0d0d, 0x07fe0d0d, 0xf8020d0d, 0xfe080d0d, 0x01f80d0d, - 0x0d0d0d0d, 0xf2f30d0d, 0x0f040d0d, 0xf0fc0d0d, 0x040f0d0d, 0xfffff2f3, 0x0605f2f3, 0xf9f9f2f3, - 0x07fdf2f3, 0xf801f2f3, 0xfe07f2f3, 0x01f7f2f3, 0x0d0cf2f3, 0xf2f2f2f3, 0x0f03f2f3, 0xf0fbf2f3, - 0x040ef2f3, 0x00000f04, 0x06060f04, 0xf9fa0f04, 0x07fe0f04, 0xf8020f04, 0xfe080f04, 0x01f80f04, - 0x0d0d0f04, 0xf2f30f04, 0x0f040f04, 0xf0fc0f04, 0x040f0f04, 0xfffff0fc, 0x0605f0fc, 0xf9f9f0fc, - 0x07fdf0fc, 0xf801f0fc, 0xfe07f0fc, 0x01f7f0fc, 0x0d0cf0fc, 0xf2f2f0fc, 0x0f03f0fc, 0xf0fbf0fc, - 0x040ef0fc, 0x0000040f, 0x0606040f, 0xf9fa040f, 0x07fe040f, 0xf802040f, 0xfe08040f, 0x01f8040f, - 0x0d0d040f, 0xf2f3040f, 0x0f04040f, 0xf0fc040f, 0x040f040f, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000707, 0xfffff8f9, 0x000009fd, 0xfffff603, 0xfffffd0a, 0x000002f6, 0x00001010, - 0xffffeff0, 0x00001205, 0xffffedfb, 0x00000512, 0xfffffaee, 0x00000cf3, 0xfffff30d, 0x000014fa, - 0xffffeb06, 0xfffffa15, 0x000005eb, 0x00001e0f, 0xffffe1f1, 0x00000f1e, 0xfffff0e2, 0x00001e1e, - 0xffffe1e2, 0x00002202, 0xffffddfe, 0x00000222, 0xfffffdde, 0x00001bed, 0xffffe413, 0xffffed1c, - 0x000012e4, 0x00003620, 0xffffc9e0, 0x00002036, 0xffffdfca, 0x000028f5, 0xffffd70b, 0xfffff529, - 0x00000ad7, 0x0000370f, 0xffffc8f1, 0x00000f37, 0xfffff0c9, 0x00003939, 0xffffc6c7, 0x00003eff, - 0xffffc101, 0xffffff3f, 0x000000c1, 0x000027d8, 0xffffd828, 0x000036e2, 0xffffc91e, 0xffffe237, - 0x00001dc9, 0x00005e25, 0xffffa1db, 0x0000255e, 0xffffdaa2, 0x00006041, 0xffff9fbf, 0x00004160, - 0xffffbea0, 0x00004deb, 0xffffb215, 0xffffeb4e, 0x000014b2, 0x0000640f, 0xffff9bf1, 0x00000f64, - 0xfffff09c, 0x00006a6a, 0xffff9596, 0x000073f8, 0xffff8c08, 0xfffff874, 0x0000078c, 0x00004ec1, - 0xffffb13f, 0xffffc14f, 0x00003eb1, 0x000068cd, 0xffff9733, 0xffffcd69, 0x00003297, 0x00007788, - 0xffff8878, 0x00002b2b, 0xffffd4d5, 0x00005050, 0xffffafb0, 0x00000000, 0x07070000, 0xf8f90000, - 0x09fd0000, 0xf6030000, 0xfd0a0000, 0x02f60000, 0x10100000, 0xeff00000, 0x12050000, 0xedfb0000, - 0x05120000, 0x00000707, 0x07070707, 0xf8f90707, 0x09fd0707, 0xf6030707, 0xfd0a0707, 0x02f60707, - 0x10100707, 0xeff00707, 0x12050707, 0xedfb0707, 0x05120707, 0xfffff8f9, 0x0706f8f9, 0xf8f8f8f9, - 0x09fcf8f9, 0xf602f8f9, 0xfd09f8f9, 0x02f5f8f9, 0x100ff8f9, 0xefeff8f9, 0x1204f8f9, 0xedfaf8f9, - 0x0511f8f9, 0x000009fd, 0x070709fd, 0xf8f909fd, 0x09fd09fd, 0xf60309fd, 0xfd0a09fd, 0x02f609fd, - 0x101009fd, 0xeff009fd, 0x120509fd, 0xedfb09fd, 0x051209fd, 0xfffff603, 0x0706f603, 0xf8f8f603, - 0x09fcf603, 0xf602f603, 0xfd09f603, 0x02f5f603, 0x100ff603, 0xefeff603, 0x1204f603, 0xedfaf603, - 0x0511f603, 0xfffffd0a, 0x0706fd0a, 0xf8f8fd0a, 0x09fcfd0a, 0xf602fd0a, 0xfd09fd0a, 0x02f5fd0a, - 0x100ffd0a, 0xefeffd0a, 0x1204fd0a, 0xedfafd0a, 0x0511fd0a, 0x000002f6, 0x070702f6, 0xf8f902f6, - 0x09fd02f6, 0xf60302f6, 0xfd0a02f6, 0x02f602f6, 0x101002f6, 0xeff002f6, 0x120502f6, 0xedfb02f6, - 0x051202f6, 0x00001010, 0x07071010, 0xf8f91010, 0x09fd1010, 0xf6031010, 0xfd0a1010, 0x02f61010, - 0x10101010, 0xeff01010, 0x12051010, 0xedfb1010, 0x05121010, 0xffffeff0, 0x0706eff0, 0xf8f8eff0, - 0x09fceff0, 0xf602eff0, 0xfd09eff0, 0x02f5eff0, 0x100feff0, 0xefefeff0, 0x1204eff0, 0xedfaeff0, - 0x0511eff0, 0x00001205, 0x07071205, 0xf8f91205, 0x09fd1205, 0xf6031205, 0xfd0a1205, 0x02f61205, - 0x10101205, 0xeff01205, 0x12051205, 0xedfb1205, 0x05121205, 0xffffedfb, 0x0706edfb, 0xf8f8edfb, - 0x09fcedfb, 0xf602edfb, 0xfd09edfb, 0x02f5edfb, 0x100fedfb, 0xefefedfb, 0x1204edfb, 0xedfaedfb, - 0x0511edfb, 0x00000512, 0x07070512, 0xf8f90512, 0x09fd0512, 0xf6030512, 0xfd0a0512, 0x02f60512, - 0x10100512, 0xeff00512, 0x12050512, 0xedfb0512, 0x05120512, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000808, 0xfffff7f8, 0x00000afd, 0xfffff503, 0xfffffd0b, 0x000002f5, 0x00001212, - 0xffffedee, 0x00001405, 0xffffebfb, 0x00000514, 0xfffffaec, 0x00000ef1, 0xfffff10f, 0x000017f9, - 0xffffe807, 0xfffff918, 0x000006e8, 0x00002311, 0xffffdcef, 0x00001123, 0xffffeedd, 0x00002222, - 0xffffddde, 0x00002603, 0xffffd9fd, 0x00000326, 0xfffffcda, 0x00001fea, 0xffffe016, 0xffffea20, - 0x000015e0, 0x00003d25, 0xffffc2db, 0x0000253d, 0xffffdac3, 0x00002ef3, 0xffffd10d, 0xfffff32f, - 0x00000cd1, 0x00003f11, 0xffffc0ef, 0x0000113f, 0xffffeec1, 0x00004141, 0xffffbebf, 0x000047ff, - 0xffffb801, 0xffffff48, 0x000000b8, 0x00002dd2, 0xffffd22e, 0x00003edd, 0xffffc123, 0xffffdd3f, - 0x000022c1, 0x00006b2b, 0xffff94d5, 0x00002b6b, 0xffffd495, 0x00006e4b, 0xffff91b5, 0x00004b6e, - 0xffffb492, 0x000058e8, 0xffffa718, 0xffffe859, 0x000017a7, 0x00007211, 0xffff8def, 0x00001172, - 0xffffee8e, 0x00007979, 0xffff8687, 0x00005ab8, 0xffffa548, 0xffffb85b, 0x000047a5, 0x000077c6, - 0xffff883a, 0xffffc678, 0x00003988, 0x00003131, 0xffffcecf, 0x00005c5c, 0xffffa3a4, 0x00000000, - 0x08080000, 0xf7f80000, 0x0afd0000, 0xf5030000, 0xfd0b0000, 0x02f50000, 0x12120000, 0xedee0000, - 0x14050000, 0xebfb0000, 0x05140000, 0x00000808, 0x08080808, 0xf7f80808, 0x0afd0808, 0xf5030808, - 0xfd0b0808, 0x02f50808, 0x12120808, 0xedee0808, 0x14050808, 0xebfb0808, 0x05140808, 0xfffff7f8, - 0x0807f7f8, 0xf7f7f7f8, 0x0afcf7f8, 0xf502f7f8, 0xfd0af7f8, 0x02f4f7f8, 0x1211f7f8, 0xededf7f8, - 0x1404f7f8, 0xebfaf7f8, 0x0513f7f8, 0x00000afd, 0x08080afd, 0xf7f80afd, 0x0afd0afd, 0xf5030afd, - 0xfd0b0afd, 0x02f50afd, 0x12120afd, 0xedee0afd, 0x14050afd, 0xebfb0afd, 0x05140afd, 0xfffff503, - 0x0807f503, 0xf7f7f503, 0x0afcf503, 0xf502f503, 0xfd0af503, 0x02f4f503, 0x1211f503, 0xededf503, - 0x1404f503, 0xebfaf503, 0x0513f503, 0xfffffd0b, 0x0807fd0b, 0xf7f7fd0b, 0x0afcfd0b, 0xf502fd0b, - 0xfd0afd0b, 0x02f4fd0b, 0x1211fd0b, 0xededfd0b, 0x1404fd0b, 0xebfafd0b, 0x0513fd0b, 0x000002f5, - 0x080802f5, 0xf7f802f5, 0x0afd02f5, 0xf50302f5, 0xfd0b02f5, 0x02f502f5, 0x121202f5, 0xedee02f5, - 0x140502f5, 0xebfb02f5, 0x051402f5, 0x00001212, 0x08081212, 0xf7f81212, 0x0afd1212, 0xf5031212, - 0xfd0b1212, 0x02f51212, 0x12121212, 0xedee1212, 0x14051212, 0xebfb1212, 0x05141212, 0xffffedee, - 0x0807edee, 0xf7f7edee, 0x0afcedee, 0xf502edee, 0xfd0aedee, 0x02f4edee, 0x1211edee, 0xedededee, - 0x1404edee, 0xebfaedee, 0x0513edee, 0x00001405, 0x08081405, 0xf7f81405, 0x0afd1405, 0xf5031405, - 0xfd0b1405, 0x02f51405, 0x12121405, 0xedee1405, 0x14051405, 0xebfb1405, 0x05141405, 0xffffebfb, - 0x0807ebfb, 0xf7f7ebfb, 0x0afcebfb, 0xf502ebfb, 0xfd0aebfb, 0x02f4ebfb, 0x1211ebfb, 0xededebfb, - 0x1404ebfb, 0xebfaebfb, 0x0513ebfb, 0x00000514, 0x08080514, 0xf7f80514, 0x0afd0514, 0xf5030514, - 0xfd0b0514, 0x02f50514, 0x12120514, 0xedee0514, 0x14050514, 0xebfb0514, 0x05140514, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000909, 0xfffff6f7, 0x00000bfd, 0xfffff403, 0xfffffd0c, 0x000002f4, 0x00001414, - 0xffffebec, 0x00001706, 0xffffe8fa, 0x00000617, 0xfffff9e9, 0x000010ef, 0xffffef11, 0x00001af9, - 0xffffe507, 0xfffff91b, 0x000006e5, 0x00002713, 0xffffd8ed, 0x00001327, 0xffffecd9, 0x00002727, - 0xffffd8d9, 0x00002b03, 0xffffd4fd, 0x0000032b, 0xfffffcd5, 0x000023e8, 0xffffdc18, 0xffffe824, - 0x000017dc, 0x0000452a, 0xffffbad6, 0x00002a45, 0xffffd5bb, 0x000034f2, 0xffffcb0e, 0xfffff235, - 0x00000dcb, 0x00004713, 0xffffb8ed, 0x00001347, 0xffffecb9, 0x00004949, 0xffffb6b7, 0x00004ffe, - 0xffffb002, 0xfffffe50, 0x000001b0, 0x000033cc, 0xffffcc34, 0x000045d9, 0xffffba27, 0xffffd946, - 0x000026ba, 0x00007930, 0xffff86d0, 0x00003079, 0xffffcf87, 0x00007c54, 0xffff83ac, 0x0000547c, - 0xffffab84, 0x000063e5, 0xffff9c1b, 0xffffe564, 0x00001a9c, 0x000065af, 0xffff9a51, 0xffffaf66, - 0x0000509a, 0x00003737, 0xffffc8c9, 0x00006868, 0xffff9798, 0x00000000, 0x09090000, 0xf6f70000, - 0x0bfd0000, 0xf4030000, 0xfd0c0000, 0x02f40000, 0x14140000, 0xebec0000, 0x17060000, 0xe8fa0000, - 0x06170000, 0xf9e90000, 0x00000909, 0x09090909, 0xf6f70909, 0x0bfd0909, 0xf4030909, 0xfd0c0909, - 0x02f40909, 0x14140909, 0xebec0909, 0x17060909, 0xe8fa0909, 0x06170909, 0xf9e90909, 0xfffff6f7, - 0x0908f6f7, 0xf6f6f6f7, 0x0bfcf6f7, 0xf402f6f7, 0xfd0bf6f7, 0x02f3f6f7, 0x1413f6f7, 0xebebf6f7, - 0x1705f6f7, 0xe8f9f6f7, 0x0616f6f7, 0xf9e8f6f7, 0x00000bfd, 0x09090bfd, 0xf6f70bfd, 0x0bfd0bfd, - 0xf4030bfd, 0xfd0c0bfd, 0x02f40bfd, 0x14140bfd, 0xebec0bfd, 0x17060bfd, 0xe8fa0bfd, 0x06170bfd, - 0xf9e90bfd, 0xfffff403, 0x0908f403, 0xf6f6f403, 0x0bfcf403, 0xf402f403, 0xfd0bf403, 0x02f3f403, - 0x1413f403, 0xebebf403, 0x1705f403, 0xe8f9f403, 0x0616f403, 0xf9e8f403, 0xfffffd0c, 0x0908fd0c, - 0xf6f6fd0c, 0x0bfcfd0c, 0xf402fd0c, 0xfd0bfd0c, 0x02f3fd0c, 0x1413fd0c, 0xebebfd0c, 0x1705fd0c, - 0xe8f9fd0c, 0x0616fd0c, 0xf9e8fd0c, 0x000002f4, 0x090902f4, 0xf6f702f4, 0x0bfd02f4, 0xf40302f4, - 0xfd0c02f4, 0x02f402f4, 0x141402f4, 0xebec02f4, 0x170602f4, 0xe8fa02f4, 0x061702f4, 0xf9e902f4, - 0x00001414, 0x09091414, 0xf6f71414, 0x0bfd1414, 0xf4031414, 0xfd0c1414, 0x02f41414, 0x14141414, - 0xebec1414, 0x17061414, 0xe8fa1414, 0x06171414, 0xf9e91414, 0xffffebec, 0x0908ebec, 0xf6f6ebec, - 0x0bfcebec, 0xf402ebec, 0xfd0bebec, 0x02f3ebec, 0x1413ebec, 0xebebebec, 0x1705ebec, 0xe8f9ebec, - 0x0616ebec, 0xf9e8ebec, 0x00001706, 0x09091706, 0xf6f71706, 0x0bfd1706, 0xf4031706, 0xfd0c1706, - 0x02f41706, 0x14141706, 0xebec1706, 0x17061706, 0xe8fa1706, 0x06171706, 0xf9e91706, 0xffffe8fa, - 0x0908e8fa, 0xf6f6e8fa, 0x0bfce8fa, 0xf402e8fa, 0xfd0be8fa, 0x02f3e8fa, 0x1413e8fa, 0xebebe8fa, - 0x1705e8fa, 0xe8f9e8fa, 0x0616e8fa, 0xf9e8e8fa, 0x00000617, 0x09090617, 0xf6f70617, 0x0bfd0617, - 0xf4030617, 0xfd0c0617, 0x02f40617, 0x14140617, 0xebec0617, 0x17060617, 0xe8fa0617, 0x06170617, - 0xf9e90617, 0xfffff9e9, 0x0908f9e9, 0xf6f6f9e9, 0x0bfcf9e9, 0xf402f9e9, 0xfd0bf9e9, 0x02f3f9e9, - 0x1413f9e9, 0xebebf9e9, 0x1705f9e9, 0xe8f9f9e9, 0x0616f9e9, 0xf9e8f9e9, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, - 0xfffffbfc, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x000003fc, 0xfffffc04, 0x000005fe, - 0xfffffa02, 0xfffffe06, 0x000001fa, 0x00000804, 0xfffff7fc, 0x00000408, 0xfffffbf8, 0x00000808, - 0xfffff7f8, 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x000007fc, 0xfffff804, 0xfffffc08, - 0x000003f8, 0x00000e08, 0xfffff1f8, 0x0000080e, 0xfffff7f2, 0x00000bfe, 0xfffff402, 0xfffffe0c, - 0x000001f4, 0x00001004, 0xffffeffc, 0x00000410, 0xfffffbf0, 0x00001010, 0xffffeff0, 0x00001200, - 0xffffee00, 0x00000012, 0xffffffee, 0x00000bf4, 0xfffff40c, 0x00000ff8, 0xfffff008, 0xfffff810, - 0x000007f0, 0x00001a0a, 0xffffe5f6, 0x00000a1a, 0xfffff5e6, 0x00001c12, 0xffffe3ee, 0x0000121c, - 0xffffede4, 0x000015fa, 0xffffea06, 0xfffffa16, 0x000005ea, 0x00001c04, 0xffffe3fc, 0x0000041c, - 0xfffffbe4, 0x00001e1e, 0xffffe1e2, 0x00001ffe, 0xffffe002, 0xfffffe20, 0x000001e0, 0x000015ee, - 0xffffea12, 0xffffee16, 0x000011ea, 0x00001df2, 0xffffe20e, 0xfffff21e, 0x00000de2, 0x00002e16, - 0xffffd1ea, 0x0000162e, 0xffffe9d2, 0x00002e0c, 0xffffd1f4, 0x00000c2e, 0xfffff3d2, 0x00003022, - 0xffffcfde, 0x00002230, 0xffffddd0, 0x000027f6, 0xffffd80a, 0xfffff628, 0x000009d8, 0x00003204, - 0xffffcdfc, 0x00000432, 0xfffffbce, 0x00003636, 0xffffc9ca, 0x000021de, 0xffffde22, 0x000029e4, - 0xffffd61c, 0xffffe42a, 0x00001bd6, 0x00003bfa, 0xffffc406, 0xfffffa3c, 0x000005c4, 0x00004c1a, - 0xffffb3e6, 0x00001a4c, 0xffffe5b4, 0x00004c2a, 0xffffb3d6, 0x00002a4c, 0xffffd5b4, 0x000035e8, - 0xffffca18, 0xffffe836, 0x000017ca, 0x00004e0e, 0xffffb1f2, 0x00000e4e, 0xfffff1b2, 0x0000523e, - 0xffffadc2, 0x00003e52, 0xffffc1ae, 0x000049ec, 0xffffb614, 0xffffec4a, 0x000013b6, 0x00005802, - 0xffffa7fe, 0x00000258, 0xfffffda8, 0x00005c5c, 0xffffa3a4, 0x00003bcc, 0xffffc434, 0xffffcc3c, - 0x000033c4, 0x00007634, 0xffff89cc, 0x00003476, 0xffffcb8a, 0x000049d4, 0xffffb62c, 0xffffd44a, - 0x00002bb6, 0x0000764a, 0xffff89b6, 0x00004a76, 0xffffb58a, 0x00007620, 0xffff89e0, 0x00002076, - 0xffffdf8a, 0x000065f4, 0xffff9a0c, 0xfffff466, 0x00000b9a, 0x00005fd8, 0xffffa028, 0xffffd860, - 0x000027a0, 0x000075de, 0xffff8a22, 0xffffde76, 0x0000218a, 0x000057a8, 0xffffa858, 0x000067b2, - 0xffff984e, 0xffffb268, 0x00004d98, 0x00000c0c, 0xfffff3f4, 0x00001616, 0xffffe9ea, 0x00002a2a, - 0xffffd5d6, 0x00004848, 0xffffb7b8, 0x00000000, 0x02020000, 0xfdfe0000, 0x02000000, 0xfe000000, - 0x00020000, 0xfffe0000, 0x00000202, 0x02020202, 0xfdfe0202, 0x02000202, 0xfe000202, 0x00020202, - 0xfffe0202, 0xfffffdfe, 0x0201fdfe, 0xfdfdfdfe, 0x01fffdfe, 0xfdfffdfe, 0x0001fdfe, 0xfffdfdfe, - 0x00000200, 0x02020200, 0xfdfe0200, 0x02000200, 0xfe000200, 0x00020200, 0xfffe0200, 0xfffffe00, - 0x0201fe00, 0xfdfdfe00, 0x01fffe00, 0xfdfffe00, 0x0001fe00, 0xfffdfe00, 0x00000002, 0x02020002, - 0xfdfe0002, 0x02000002, 0xfe000002, 0x00020002, 0xfffe0002, 0xfffffffe, 0x0201fffe, 0xfdfdfffe, - 0x01fffffe, 0xfdfffffe, 0x0001fffe, 0xfffdfffe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000303, 0xfffffcfd, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, - 0xfffff9fa, 0x00000903, 0xfffff6fd, 0x00000309, 0xfffffcf7, 0x000008fd, 0xfffff703, 0xfffffd09, - 0x000002f7, 0x000005fa, 0xfffffa06, 0x00000c06, 0xfffff3fa, 0x0000060c, 0xfffff9f4, 0x00000c0c, - 0xfffff3f4, 0x00000f00, 0xfffff100, 0x0000000f, 0xfffffff1, 0x00000bf7, 0xfffff409, 0xfffff70c, - 0x000008f4, 0x0000180f, 0xffffe7f1, 0x00000f18, 0xfffff0e8, 0x000011fa, 0xffffee06, 0xfffffa12, - 0x000005ee, 0x00001806, 0xffffe7fa, 0x00000618, 0xfffff9e8, 0x00001818, 0xffffe7e8, 0x00001b00, - 0xffffe500, 0x0000001b, 0xffffffe5, 0x000011ee, 0xffffee12, 0x000017f4, 0xffffe80c, 0xfffff418, - 0x00000be8, 0x0000270f, 0xffffd8f1, 0x00000f27, 0xfffff0d9, 0x00002a1b, 0xffffd5e5, 0x00001b2a, - 0xffffe4d6, 0x000020f7, 0xffffdf09, 0xfffff721, 0x000008df, 0x00002a06, 0xffffd5fa, 0x0000062a, - 0xfffff9d6, 0x00002d2d, 0xffffd2d3, 0x000032fd, 0xffffcd03, 0xfffffd33, 0x000002cd, 0x000020e5, - 0xffffdf1b, 0xffffe521, 0x00001adf, 0x00002ceb, 0xffffd315, 0xffffeb2d, 0x000014d3, 0x00004521, - 0xffffbadf, 0x00002145, 0xffffdebb, 0x00004512, 0xffffbaee, 0x00001245, 0xffffedbb, 0x00004836, - 0xffffb7ca, 0x00003648, 0xffffc9b8, 0x00003eee, 0xffffc112, 0xffffee3f, 0x000011c1, 0x00004e06, - 0xffffb1fa, 0x0000064e, 0xfffff9b2, 0x00005151, 0xffffaeaf, 0x000032cd, 0xffffcd33, 0x00003ed6, - 0xffffc12a, 0xffffd63f, 0x000029c1, 0x000059f7, 0xffffa609, 0xfffff75a, 0x000008a6, 0x0000722a, - 0xffff8dd6, 0x00002a72, 0xffffd58e, 0x0000753f, 0xffff8ac1, 0x00003f75, 0xffffc08b, 0x000050dc, - 0xffffaf24, 0xffffdc51, 0x000023af, 0x00007815, 0xffff87eb, 0x00001578, 0xffffea88, 0x00007b60, - 0xffff84a0, 0x0000607b, 0xffff9f85, 0x00006ee2, 0xffff911e, 0xffffe26f, 0x00001d91, 0x00005cb2, - 0xffffa34e, 0xffffb25d, 0x00004da3, 0x000071bb, 0xffff8e45, 0xffffbb72, 0x0000448e, 0x00001212, - 0xffffedee, 0x00002121, 0xffffdedf, 0x00003f3f, 0xffffc0c1, 0x00006c6c, 0xffff9394, 0x00000000, - 0x03030000, 0xfcfd0000, 0x03000000, 0xfd000000, 0x00030000, 0xfffd0000, 0x06060000, 0xf9fa0000, - 0x00000303, 0x03030303, 0xfcfd0303, 0x03000303, 0xfd000303, 0x00030303, 0xfffd0303, 0x06060303, - 0xf9fa0303, 0xfffffcfd, 0x0302fcfd, 0xfcfcfcfd, 0x02fffcfd, 0xfcfffcfd, 0x0002fcfd, 0xfffcfcfd, - 0x0605fcfd, 0xf9f9fcfd, 0x00000300, 0x03030300, 0xfcfd0300, 0x03000300, 0xfd000300, 0x00030300, - 0xfffd0300, 0x06060300, 0xf9fa0300, 0xfffffd00, 0x0302fd00, 0xfcfcfd00, 0x02fffd00, 0xfcfffd00, - 0x0002fd00, 0xfffcfd00, 0x0605fd00, 0xf9f9fd00, 0x00000003, 0x03030003, 0xfcfd0003, 0x03000003, - 0xfd000003, 0x00030003, 0xfffd0003, 0x06060003, 0xf9fa0003, 0xfffffffd, 0x0302fffd, 0xfcfcfffd, - 0x02fffffd, 0xfcfffffd, 0x0002fffd, 0xfffcfffd, 0x0605fffd, 0xf9f9fffd, 0x00000606, 0x03030606, - 0xfcfd0606, 0x03000606, 0xfd000606, 0x00030606, 0xfffd0606, 0x06060606, 0xf9fa0606, 0xfffff9fa, - 0x0302f9fa, 0xfcfcf9fa, 0x02fff9fa, 0xfcfff9fa, 0x0002f9fa, 0xfffcf9fa, 0x0605f9fa, 0xf9f9f9fa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000404, 0xfffffbfc, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000804, - 0xfffff7fc, 0x00000408, 0xfffffbf8, 0x00000808, 0xfffff7f8, 0x000007f8, 0xfffff808, 0x00000bfc, - 0xfffff404, 0xfffffc0c, 0x000003f4, 0x00001008, 0xffffeff8, 0x00000810, 0xfffff7f0, 0x00001010, - 0xffffeff0, 0x00001400, 0xffffec00, 0x00000014, 0xffffffec, 0x00000ff4, 0xfffff00c, 0xfffff410, - 0x00000bf0, 0x000017fc, 0xffffe804, 0xfffffc18, 0x000003e8, 0x00002010, 0xffffdff0, 0x00001020, - 0xffffefe0, 0x00002008, 0xffffdff8, 0x00000820, 0xfffff7e0, 0x00002020, 0xffffdfe0, 0x00002400, - 0xffffdc00, 0x00000024, 0xffffffdc, 0x000017e8, 0xffffe818, 0x00001ff0, 0xffffe010, 0xfffff020, - 0x00000fe0, 0x00003414, 0xffffcbec, 0x00001434, 0xffffebcc, 0x00003824, 0xffffc7dc, 0x00002438, - 0xffffdbc8, 0x00002bf4, 0xffffd40c, 0xfffff42c, 0x00000bd4, 0x00003808, 0xffffc7f8, 0x00000838, - 0xfffff7c8, 0x00003c3c, 0xffffc3c4, 0x00003ffc, 0xffffc004, 0xfffffc40, 0x000003c0, 0x00002bdc, - 0xffffd424, 0xffffdc2c, 0x000023d4, 0x00003be4, 0xffffc41c, 0xffffe43c, 0x00001bc4, 0x00005c2c, - 0xffffa3d4, 0x00002c5c, 0xffffd3a4, 0x00005c18, 0xffffa3e8, 0x0000185c, 0xffffe7a4, 0x00006048, - 0xffff9fb8, 0x00004860, 0xffffb7a0, 0x000053ec, 0xffffac14, 0xffffec54, 0x000013ac, 0x00006408, - 0xffff9bf8, 0x00000864, 0xfffff79c, 0x00006c6c, 0xffff9394, 0x000043bc, 0xffffbc44, 0x000053c8, - 0xffffac38, 0xffffc854, 0x000037ac, 0x000077f4, 0xffff880c, 0xfffff478, 0x00000b88, 0x00006bd0, - 0xffff9430, 0xffffd06c, 0x00002f94, 0x00007b98, 0xffff8468, 0xffff987c, 0x00006784, 0x00001818, - 0xffffe7e8, 0x00002c2c, 0xffffd3d4, 0x00005454, 0xffffabac, 0x00000000, 0x04040000, 0xfbfc0000, - 0x04000000, 0xfc000000, 0x00040000, 0xfffc0000, 0x08040000, 0xf7fc0000, 0x04080000, 0x00000404, - 0x04040404, 0xfbfc0404, 0x04000404, 0xfc000404, 0x00040404, 0xfffc0404, 0x08040404, 0xf7fc0404, - 0x04080404, 0xfffffbfc, 0x0403fbfc, 0xfbfbfbfc, 0x03fffbfc, 0xfbfffbfc, 0x0003fbfc, 0xfffbfbfc, - 0x0803fbfc, 0xf7fbfbfc, 0x0407fbfc, 0x00000400, 0x04040400, 0xfbfc0400, 0x04000400, 0xfc000400, - 0x00040400, 0xfffc0400, 0x08040400, 0xf7fc0400, 0x04080400, 0xfffffc00, 0x0403fc00, 0xfbfbfc00, - 0x03fffc00, 0xfbfffc00, 0x0003fc00, 0xfffbfc00, 0x0803fc00, 0xf7fbfc00, 0x0407fc00, 0x00000004, - 0x04040004, 0xfbfc0004, 0x04000004, 0xfc000004, 0x00040004, 0xfffc0004, 0x08040004, 0xf7fc0004, - 0x04080004, 0xfffffffc, 0x0403fffc, 0xfbfbfffc, 0x03fffffc, 0xfbfffffc, 0x0003fffc, 0xfffbfffc, - 0x0803fffc, 0xf7fbfffc, 0x0407fffc, 0x00000804, 0x04040804, 0xfbfc0804, 0x04000804, 0xfc000804, - 0x00040804, 0xfffc0804, 0x08040804, 0xf7fc0804, 0x04080804, 0xfffff7fc, 0x0403f7fc, 0xfbfbf7fc, - 0x03fff7fc, 0xfbfff7fc, 0x0003f7fc, 0xfffbf7fc, 0x0803f7fc, 0xf7fbf7fc, 0x0407f7fc, 0x00000408, - 0x04040408, 0xfbfc0408, 0x04000408, 0xfc000408, 0x00040408, 0xfffc0408, 0x08040408, 0xf7fc0408, - 0x04080408, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000505, 0xfffffafb, 0x00000500, 0xfffffb00, 0x00000005, 0xfffffffb, 0x00000a0a, - 0xfffff5f6, 0x00000f05, 0xfffff0fb, 0x0000050f, 0xfffffaf1, 0x000009f6, 0xfffff60a, 0x00000efb, - 0xfffff105, 0xfffffb0f, 0x000004f1, 0x0000140a, 0xffffebf6, 0x00000a14, 0xfffff5ec, 0x00001414, - 0xffffebec, 0x00001900, 0xffffe700, 0x00000019, 0xffffffe7, 0x000013f1, 0xffffec0f, 0xfffff114, - 0x00000eec, 0x00002819, 0xffffd7e7, 0x00001928, 0xffffe6d8, 0x00001df6, 0xffffe20a, 0xfffff61e, - 0x000009e2, 0x0000280a, 0xffffd7f6, 0x00000a28, 0xfffff5d8, 0x00002828, 0xffffd7d8, 0x00002d00, - 0xffffd300, 0x0000002d, 0xffffffd3, 0x00001de2, 0xffffe21e, 0x000027ec, 0xffffd814, 0xffffec28, - 0x000013d8, 0x00004119, 0xffffbee7, 0x00001941, 0xffffe6bf, 0x0000462d, 0xffffb9d3, 0x00002d46, - 0xffffd2ba, 0x000036f1, 0xffffc90f, 0xfffff137, 0x00000ec9, 0x0000460a, 0xffffb9f6, 0x00000a46, - 0xfffff5ba, 0x00004b4b, 0xffffb4b5, 0x000054fb, 0xffffab05, 0xfffffb55, 0x000004ab, 0x000036d3, - 0xffffc92d, 0xffffd337, 0x00002cc9, 0x00004add, 0xffffb523, 0xffffdd4b, 0x000022b5, 0x00007337, - 0xffff8cc9, 0x00003773, 0xffffc88d, 0x0000731e, 0xffff8ce2, 0x00001e73, 0xffffe18d, 0x0000785a, - 0xffff87a6, 0x00005a78, 0xffffa588, 0x000068e2, 0xffff971e, 0xffffe269, 0x00001d97, 0x000054ab, - 0xffffab55, 0x000068ba, 0xffff9746, 0xffffba69, 0x00004597, 0x00001e1e, 0xffffe1e2, 0x00003c3c, - 0xffffc3c4, 0x00006969, 0xffff9697, 0x00000000, 0x05050000, 0xfafb0000, 0x05000000, 0xfb000000, - 0x00050000, 0xfffb0000, 0x0a0a0000, 0xf5f60000, 0x0f050000, 0xf0fb0000, 0x00000505, 0x05050505, - 0xfafb0505, 0x05000505, 0xfb000505, 0x00050505, 0xfffb0505, 0x0a0a0505, 0xf5f60505, 0x0f050505, - 0xf0fb0505, 0xfffffafb, 0x0504fafb, 0xfafafafb, 0x04fffafb, 0xfafffafb, 0x0004fafb, 0xfffafafb, - 0x0a09fafb, 0xf5f5fafb, 0x0f04fafb, 0xf0fafafb, 0x00000500, 0x05050500, 0xfafb0500, 0x05000500, - 0xfb000500, 0x00050500, 0xfffb0500, 0x0a0a0500, 0xf5f60500, 0x0f050500, 0xf0fb0500, 0xfffffb00, - 0x0504fb00, 0xfafafb00, 0x04fffb00, 0xfafffb00, 0x0004fb00, 0xfffafb00, 0x0a09fb00, 0xf5f5fb00, - 0x0f04fb00, 0xf0fafb00, 0x00000005, 0x05050005, 0xfafb0005, 0x05000005, 0xfb000005, 0x00050005, - 0xfffb0005, 0x0a0a0005, 0xf5f60005, 0x0f050005, 0xf0fb0005, 0xfffffffb, 0x0504fffb, 0xfafafffb, - 0x04fffffb, 0xfafffffb, 0x0004fffb, 0xfffafffb, 0x0a09fffb, 0xf5f5fffb, 0x0f04fffb, 0xf0fafffb, - 0x00000a0a, 0x05050a0a, 0xfafb0a0a, 0x05000a0a, 0xfb000a0a, 0x00050a0a, 0xfffb0a0a, 0x0a0a0a0a, - 0xf5f60a0a, 0x0f050a0a, 0xf0fb0a0a, 0xfffff5f6, 0x0504f5f6, 0xfafaf5f6, 0x04fff5f6, 0xfafff5f6, - 0x0004f5f6, 0xfffaf5f6, 0x0a09f5f6, 0xf5f5f5f6, 0x0f04f5f6, 0xf0faf5f6, 0x00000f05, 0x05050f05, - 0xfafb0f05, 0x05000f05, 0xfb000f05, 0x00050f05, 0xfffb0f05, 0x0a0a0f05, 0xf5f60f05, 0x0f050f05, - 0xf0fb0f05, 0xfffff0fb, 0x0504f0fb, 0xfafaf0fb, 0x04fff0fb, 0xfafff0fb, 0x0004f0fb, 0xfffaf0fb, - 0x0a09f0fb, 0xf5f5f0fb, 0x0f04f0fb, 0xf0faf0fb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000606, 0xfffff9fa, 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x00000c0c, - 0xfffff3f4, 0x00000c06, 0xfffff3fa, 0x0000060c, 0xfffff9f4, 0x00000bf4, 0xfffff40c, 0x000011fa, - 0xffffee06, 0xfffffa12, 0x000005ee, 0x0000180c, 0xffffe7f4, 0x00000c18, 0xfffff3e8, 0x00001818, - 0xffffe7e8, 0x00001e00, 0xffffe200, 0x0000001e, 0xffffffe2, 0x000017ee, 0xffffe812, 0xffffee18, - 0x000011e8, 0x0000301e, 0xffffcfe2, 0x00001e30, 0xffffe1d0, 0x000023fa, 0xffffdc06, 0xfffffa24, - 0x000005dc, 0x0000300c, 0xffffcff4, 0x00000c30, 0xfffff3d0, 0x00003030, 0xffffcfd0, 0x00003600, - 0xffffca00, 0x00000036, 0xffffffca, 0x000023dc, 0xffffdc24, 0x00002fe8, 0xffffd018, 0xffffe830, - 0x000017d0, 0x00004e1e, 0xffffb1e2, 0x00001e4e, 0xffffe1b2, 0x00005436, 0xffffabca, 0x00003654, - 0xffffc9ac, 0x000041ee, 0xffffbe12, 0xffffee42, 0x000011be, 0x0000540c, 0xffffabf4, 0x00000c54, - 0xfffff3ac, 0x00005a5a, 0xffffa5a6, 0x00005ffa, 0xffffa006, 0xfffffa60, 0x000005a0, 0x000041ca, - 0xffffbe36, 0xffffca42, 0x000035be, 0x000059d6, 0xffffa62a, 0xffffd65a, 0x000029a6, 0x00007de2, - 0xffff821e, 0xffffe27e, 0x00001d82, 0x0000659a, 0xffff9a66, 0x00007dac, 0xffff8254, 0xffffac7e, - 0x00005382, 0x00002424, 0xffffdbdc, 0x00004242, 0xffffbdbe, 0x00000000, 0x06060000, 0xf9fa0000, - 0x06000000, 0xfa000000, 0x00060000, 0xfffa0000, 0x0c0c0000, 0xf3f40000, 0x0c060000, 0xf3fa0000, - 0x060c0000, 0x00000606, 0x06060606, 0xf9fa0606, 0x06000606, 0xfa000606, 0x00060606, 0xfffa0606, - 0x0c0c0606, 0xf3f40606, 0x0c060606, 0xf3fa0606, 0x060c0606, 0xfffff9fa, 0x0605f9fa, 0xf9f9f9fa, - 0x05fff9fa, 0xf9fff9fa, 0x0005f9fa, 0xfff9f9fa, 0x0c0bf9fa, 0xf3f3f9fa, 0x0c05f9fa, 0xf3f9f9fa, - 0x060bf9fa, 0x00000600, 0x06060600, 0xf9fa0600, 0x06000600, 0xfa000600, 0x00060600, 0xfffa0600, - 0x0c0c0600, 0xf3f40600, 0x0c060600, 0xf3fa0600, 0x060c0600, 0xfffffa00, 0x0605fa00, 0xf9f9fa00, - 0x05fffa00, 0xf9fffa00, 0x0005fa00, 0xfff9fa00, 0x0c0bfa00, 0xf3f3fa00, 0x0c05fa00, 0xf3f9fa00, - 0x060bfa00, 0x00000006, 0x06060006, 0xf9fa0006, 0x06000006, 0xfa000006, 0x00060006, 0xfffa0006, - 0x0c0c0006, 0xf3f40006, 0x0c060006, 0xf3fa0006, 0x060c0006, 0xfffffffa, 0x0605fffa, 0xf9f9fffa, - 0x05fffffa, 0xf9fffffa, 0x0005fffa, 0xfff9fffa, 0x0c0bfffa, 0xf3f3fffa, 0x0c05fffa, 0xf3f9fffa, - 0x060bfffa, 0x00000c0c, 0x06060c0c, 0xf9fa0c0c, 0x06000c0c, 0xfa000c0c, 0x00060c0c, 0xfffa0c0c, - 0x0c0c0c0c, 0xf3f40c0c, 0x0c060c0c, 0xf3fa0c0c, 0x060c0c0c, 0xfffff3f4, 0x0605f3f4, 0xf9f9f3f4, - 0x05fff3f4, 0xf9fff3f4, 0x0005f3f4, 0xfff9f3f4, 0x0c0bf3f4, 0xf3f3f3f4, 0x0c05f3f4, 0xf3f9f3f4, - 0x060bf3f4, 0x00000c06, 0x06060c06, 0xf9fa0c06, 0x06000c06, 0xfa000c06, 0x00060c06, 0xfffa0c06, - 0x0c0c0c06, 0xf3f40c06, 0x0c060c06, 0xf3fa0c06, 0x060c0c06, 0xfffff3fa, 0x0605f3fa, 0xf9f9f3fa, - 0x05fff3fa, 0xf9fff3fa, 0x0005f3fa, 0xfff9f3fa, 0x0c0bf3fa, 0xf3f3f3fa, 0x0c05f3fa, 0xf3f9f3fa, - 0x060bf3fa, 0x0000060c, 0x0606060c, 0xf9fa060c, 0x0600060c, 0xfa00060c, 0x0006060c, 0xfffa060c, - 0x0c0c060c, 0xf3f4060c, 0x0c06060c, 0xf3fa060c, 0x060c060c, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000707, 0xfffff8f9, 0x00000700, 0xfffff900, 0x00000007, 0xfffffff9, 0x00000e0e, - 0xfffff1f2, 0x00001507, 0xffffeaf9, 0x00000715, 0xfffff8eb, 0x00000df2, 0xfffff20e, 0x000014f9, - 0xffffeb07, 0xfffff915, 0x000006eb, 0x00001c0e, 0xffffe3f2, 0x00000e1c, 0xfffff1e4, 0x00001c1c, - 0xffffe3e4, 0x00002300, 0xffffdd00, 0x00000023, 0xffffffdd, 0x00001beb, 0xffffe415, 0xffffeb1c, - 0x000014e4, 0x00003823, 0xffffc7dd, 0x00002338, 0xffffdcc8, 0x000029f2, 0xffffd60e, 0xfffff22a, - 0x00000dd6, 0x0000380e, 0xffffc7f2, 0x00000e38, 0xfffff1c8, 0x00003838, 0xffffc7c8, 0x00003f00, - 0xffffc100, 0x0000003f, 0xffffffc1, 0x000029d6, 0xffffd62a, 0x000037e4, 0xffffc81c, 0xffffe438, - 0x00001bc8, 0x00005b23, 0xffffa4dd, 0x0000235b, 0xffffdca5, 0x0000623f, 0xffff9dc1, 0x00003f62, - 0xffffc09e, 0x00004ceb, 0xffffb315, 0xffffeb4d, 0x000014b3, 0x0000620e, 0xffff9df2, 0x00000e62, - 0xfffff19e, 0x00006969, 0xffff9697, 0x000076f9, 0xffff8907, 0xfffff977, 0x00000689, 0x00004cc1, - 0xffffb33f, 0xffffc14d, 0x00003eb3, 0x000068cf, 0xffff9731, 0xffffcf69, 0x00003097, 0x00007689, - 0xffff8977, 0x00002a2a, 0xffffd5d6, 0x00004d4d, 0xffffb2b3, 0x00000000, 0x07070000, 0xf8f90000, - 0x07000000, 0xf9000000, 0x00070000, 0xfff90000, 0x0e0e0000, 0xf1f20000, 0x15070000, 0xeaf90000, - 0x07150000, 0x00000707, 0x07070707, 0xf8f90707, 0x07000707, 0xf9000707, 0x00070707, 0xfff90707, - 0x0e0e0707, 0xf1f20707, 0x15070707, 0xeaf90707, 0x07150707, 0xfffff8f9, 0x0706f8f9, 0xf8f8f8f9, - 0x06fff8f9, 0xf8fff8f9, 0x0006f8f9, 0xfff8f8f9, 0x0e0df8f9, 0xf1f1f8f9, 0x1506f8f9, 0xeaf8f8f9, - 0x0714f8f9, 0x00000700, 0x07070700, 0xf8f90700, 0x07000700, 0xf9000700, 0x00070700, 0xfff90700, - 0x0e0e0700, 0xf1f20700, 0x15070700, 0xeaf90700, 0x07150700, 0xfffff900, 0x0706f900, 0xf8f8f900, - 0x06fff900, 0xf8fff900, 0x0006f900, 0xfff8f900, 0x0e0df900, 0xf1f1f900, 0x1506f900, 0xeaf8f900, - 0x0714f900, 0x00000007, 0x07070007, 0xf8f90007, 0x07000007, 0xf9000007, 0x00070007, 0xfff90007, - 0x0e0e0007, 0xf1f20007, 0x15070007, 0xeaf90007, 0x07150007, 0xfffffff9, 0x0706fff9, 0xf8f8fff9, - 0x06fffff9, 0xf8fffff9, 0x0006fff9, 0xfff8fff9, 0x0e0dfff9, 0xf1f1fff9, 0x1506fff9, 0xeaf8fff9, - 0x0714fff9, 0x00000e0e, 0x07070e0e, 0xf8f90e0e, 0x07000e0e, 0xf9000e0e, 0x00070e0e, 0xfff90e0e, - 0x0e0e0e0e, 0xf1f20e0e, 0x15070e0e, 0xeaf90e0e, 0x07150e0e, 0xfffff1f2, 0x0706f1f2, 0xf8f8f1f2, - 0x06fff1f2, 0xf8fff1f2, 0x0006f1f2, 0xfff8f1f2, 0x0e0df1f2, 0xf1f1f1f2, 0x1506f1f2, 0xeaf8f1f2, - 0x0714f1f2, 0x00001507, 0x07071507, 0xf8f91507, 0x07001507, 0xf9001507, 0x00071507, 0xfff91507, - 0x0e0e1507, 0xf1f21507, 0x15071507, 0xeaf91507, 0x07151507, 0xffffeaf9, 0x0706eaf9, 0xf8f8eaf9, - 0x06ffeaf9, 0xf8ffeaf9, 0x0006eaf9, 0xfff8eaf9, 0x0e0deaf9, 0xf1f1eaf9, 0x1506eaf9, 0xeaf8eaf9, - 0x0714eaf9, 0x00000715, 0x07070715, 0xf8f90715, 0x07000715, 0xf9000715, 0x00070715, 0xfff90715, - 0x0e0e0715, 0xf1f20715, 0x15070715, 0xeaf90715, 0x07150715, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000808, 0xfffff7f8, 0x00000800, 0xfffff800, 0x00000008, 0xfffffff8, 0x00001010, - 0xffffeff0, 0x00001008, 0xffffeff8, 0x00000810, 0xfffff7f0, 0x00000ff0, 0xfffff010, 0x000017f8, - 0xffffe808, 0xfffff818, 0x000007e8, 0x00002010, 0xffffdff0, 0x00001020, 0xffffefe0, 0x00002020, - 0xffffdfe0, 0x00002800, 0xffffd800, 0x00000028, 0xffffffd8, 0x00001fe8, 0xffffe018, 0xffffe820, - 0x000017e0, 0x00004028, 0xffffbfd8, 0x00002840, 0xffffd7c0, 0x00002ff0, 0xffffd010, 0xfffff030, - 0x00000fd0, 0x00004010, 0xffffbff0, 0x00001040, 0xffffefc0, 0x00004040, 0xffffbfc0, 0x00004800, - 0xffffb800, 0x00000048, 0xffffffb8, 0x00002fd0, 0xffffd030, 0x00003fe0, 0xffffc020, 0xffffe040, - 0x00001fc0, 0x00006828, 0xffff97d8, 0x00002868, 0xffffd798, 0x00007048, 0xffff8fb8, 0x00004870, - 0xffffb790, 0x000057e8, 0xffffa818, 0xffffe858, 0x000017a8, 0x00007010, 0xffff8ff0, 0x00001070, - 0xffffef90, 0x00007878, 0xffff8788, 0x000057b8, 0xffffa848, 0xffffb858, 0x000047a8, 0x000077c8, - 0xffff8838, 0xffffc878, 0x00003788, 0x00003030, 0xffffcfd0, 0x00005858, 0xffffa7a8, 0x00000000, - 0x08080000, 0xf7f80000, 0x08000000, 0xf8000000, 0x00080000, 0xfff80000, 0x10100000, 0xeff00000, - 0x10080000, 0xeff80000, 0x08100000, 0x00000808, 0x08080808, 0xf7f80808, 0x08000808, 0xf8000808, - 0x00080808, 0xfff80808, 0x10100808, 0xeff00808, 0x10080808, 0xeff80808, 0x08100808, 0xfffff7f8, - 0x0807f7f8, 0xf7f7f7f8, 0x07fff7f8, 0xf7fff7f8, 0x0007f7f8, 0xfff7f7f8, 0x100ff7f8, 0xefeff7f8, - 0x1007f7f8, 0xeff7f7f8, 0x080ff7f8, 0x00000800, 0x08080800, 0xf7f80800, 0x08000800, 0xf8000800, - 0x00080800, 0xfff80800, 0x10100800, 0xeff00800, 0x10080800, 0xeff80800, 0x08100800, 0xfffff800, - 0x0807f800, 0xf7f7f800, 0x07fff800, 0xf7fff800, 0x0007f800, 0xfff7f800, 0x100ff800, 0xefeff800, - 0x1007f800, 0xeff7f800, 0x080ff800, 0x00000008, 0x08080008, 0xf7f80008, 0x08000008, 0xf8000008, - 0x00080008, 0xfff80008, 0x10100008, 0xeff00008, 0x10080008, 0xeff80008, 0x08100008, 0xfffffff8, - 0x0807fff8, 0xf7f7fff8, 0x07fffff8, 0xf7fffff8, 0x0007fff8, 0xfff7fff8, 0x100ffff8, 0xefeffff8, - 0x1007fff8, 0xeff7fff8, 0x080ffff8, 0x00001010, 0x08081010, 0xf7f81010, 0x08001010, 0xf8001010, - 0x00081010, 0xfff81010, 0x10101010, 0xeff01010, 0x10081010, 0xeff81010, 0x08101010, 0xffffeff0, - 0x0807eff0, 0xf7f7eff0, 0x07ffeff0, 0xf7ffeff0, 0x0007eff0, 0xfff7eff0, 0x100feff0, 0xefefeff0, - 0x1007eff0, 0xeff7eff0, 0x080feff0, 0x00001008, 0x08081008, 0xf7f81008, 0x08001008, 0xf8001008, - 0x00081008, 0xfff81008, 0x10101008, 0xeff01008, 0x10081008, 0xeff81008, 0x08101008, 0xffffeff8, - 0x0807eff8, 0xf7f7eff8, 0x07ffeff8, 0xf7ffeff8, 0x0007eff8, 0xfff7eff8, 0x100feff8, 0xefefeff8, - 0x1007eff8, 0xeff7eff8, 0x080feff8, 0x00000810, 0x08080810, 0xf7f80810, 0x08000810, 0xf8000810, - 0x00080810, 0xfff80810, 0x10100810, 0xeff00810, 0x10080810, 0xeff80810, 0x08100810, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000909, 0xfffff6f7, 0x00000900, 0xfffff700, 0x00000009, 0xfffffff7, 0x00001212, - 0xffffedee, 0x00001b09, 0xffffe4f7, 0x0000091b, 0xfffff6e5, 0x000011ee, 0xffffee12, 0x00001af7, - 0xffffe509, 0xfffff71b, 0x000008e5, 0x00002412, 0xffffdbee, 0x00001224, 0xffffeddc, 0x00002424, - 0xffffdbdc, 0x00002d00, 0xffffd300, 0x0000002d, 0xffffffd3, 0x000023e5, 0xffffdc1b, 0xffffe524, - 0x00001adc, 0x0000482d, 0xffffb7d3, 0x00002d48, 0xffffd2b8, 0x000035ee, 0xffffca12, 0xffffee36, - 0x000011ca, 0x00004812, 0xffffb7ee, 0x00001248, 0xffffedb8, 0x00004848, 0xffffb7b8, 0x00005100, - 0xffffaf00, 0x00000051, 0xffffffaf, 0x000035ca, 0xffffca36, 0x000047dc, 0xffffb824, 0xffffdc48, - 0x000023b8, 0x0000752d, 0xffff8ad3, 0x00002d75, 0xffffd28b, 0x00007e51, 0xffff81af, 0x0000517e, - 0xffffae82, 0x000062e5, 0xffff9d1b, 0xffffe563, 0x00001a9d, 0x000062af, 0xffff9d51, 0xffffaf63, - 0x0000509d, 0x00003636, 0xffffc9ca, 0x00006c6c, 0xffff9394, 0x00000000, 0x09090000, 0xf6f70000, - 0x09000000, 0xf7000000, 0x00090000, 0xfff70000, 0x12120000, 0xedee0000, 0x1b090000, 0xe4f70000, - 0x091b0000, 0xf6e50000, 0x00000909, 0x09090909, 0xf6f70909, 0x09000909, 0xf7000909, 0x00090909, - 0xfff70909, 0x12120909, 0xedee0909, 0x1b090909, 0xe4f70909, 0x091b0909, 0xf6e50909, 0xfffff6f7, - 0x0908f6f7, 0xf6f6f6f7, 0x08fff6f7, 0xf6fff6f7, 0x0008f6f7, 0xfff6f6f7, 0x1211f6f7, 0xededf6f7, - 0x1b08f6f7, 0xe4f6f6f7, 0x091af6f7, 0xf6e4f6f7, 0x00000900, 0x09090900, 0xf6f70900, 0x09000900, - 0xf7000900, 0x00090900, 0xfff70900, 0x12120900, 0xedee0900, 0x1b090900, 0xe4f70900, 0x091b0900, - 0xf6e50900, 0xfffff700, 0x0908f700, 0xf6f6f700, 0x08fff700, 0xf6fff700, 0x0008f700, 0xfff6f700, - 0x1211f700, 0xededf700, 0x1b08f700, 0xe4f6f700, 0x091af700, 0xf6e4f700, 0x00000009, 0x09090009, - 0xf6f70009, 0x09000009, 0xf7000009, 0x00090009, 0xfff70009, 0x12120009, 0xedee0009, 0x1b090009, - 0xe4f70009, 0x091b0009, 0xf6e50009, 0xfffffff7, 0x0908fff7, 0xf6f6fff7, 0x08fffff7, 0xf6fffff7, - 0x0008fff7, 0xfff6fff7, 0x1211fff7, 0xededfff7, 0x1b08fff7, 0xe4f6fff7, 0x091afff7, 0xf6e4fff7, - 0x00001212, 0x09091212, 0xf6f71212, 0x09001212, 0xf7001212, 0x00091212, 0xfff71212, 0x12121212, - 0xedee1212, 0x1b091212, 0xe4f71212, 0x091b1212, 0xf6e51212, 0xffffedee, 0x0908edee, 0xf6f6edee, - 0x08ffedee, 0xf6ffedee, 0x0008edee, 0xfff6edee, 0x1211edee, 0xedededee, 0x1b08edee, 0xe4f6edee, - 0x091aedee, 0xf6e4edee, 0x00001b09, 0x09091b09, 0xf6f71b09, 0x09001b09, 0xf7001b09, 0x00091b09, - 0xfff71b09, 0x12121b09, 0xedee1b09, 0x1b091b09, 0xe4f71b09, 0x091b1b09, 0xf6e51b09, 0xffffe4f7, - 0x0908e4f7, 0xf6f6e4f7, 0x08ffe4f7, 0xf6ffe4f7, 0x0008e4f7, 0xfff6e4f7, 0x1211e4f7, 0xedede4f7, - 0x1b08e4f7, 0xe4f6e4f7, 0x091ae4f7, 0xf6e4e4f7, 0x0000091b, 0x0909091b, 0xf6f7091b, 0x0900091b, - 0xf700091b, 0x0009091b, 0xfff7091b, 0x1212091b, 0xedee091b, 0x1b09091b, 0xe4f7091b, 0x091b091b, - 0xf6e5091b, 0xfffff6e5, 0x0908f6e5, 0xf6f6f6e5, 0x08fff6e5, 0xf6fff6e5, 0x0008f6e5, 0xfff6f6e5, - 0x1211f6e5, 0xededf6e5, 0x1b08f6e5, 0xe4f6f6e5, 0x091af6e5, 0xf6e4f6e5, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, - 0xfffff9fa, 0x00000700, 0xfffff900, 0x00000007, 0xfffffff9, 0x000004fb, 0xfffffb05, 0xfffffb05, - 0x000004fb, 0x00000b06, 0xfffff4fa, 0x0000060b, 0xfffff9f5, 0x00000800, 0xfffff800, 0x00000008, - 0xfffffff8, 0x00000b0b, 0xfffff4f5, 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x0000110c, - 0xffffeef4, 0x00000c11, 0xfffff3ef, 0x00001111, 0xffffeeef, 0x00001206, 0xffffedfa, 0x00000612, - 0xfffff9ee, 0x00000af8, 0xfffff508, 0xfffff80b, 0x000007f5, 0x00000f00, 0xfffff100, 0x0000000f, - 0xfffffff1, 0x00001400, 0xffffec00, 0x00000014, 0xffffffec, 0x00001912, 0xffffe6ee, 0x00001219, - 0xffffede7, 0x0000190b, 0xffffe6f5, 0x00000b19, 0xfffff4e7, 0x00001919, 0xffffe6e7, 0x00000df2, - 0xfffff20e, 0xfffff20e, 0x00000df2, 0x00001a00, 0xffffe600, 0x0000001a, 0xffffffe6, 0x000011f5, - 0xffffee0b, 0xfffff512, 0x00000aee, 0x000015f9, 0xffffea07, 0xfffff916, 0x000006ea, 0x0000221a, - 0xffffdde6, 0x00001a22, 0xffffe5de, 0x00002212, 0xffffddee, 0x00001222, 0xffffedde, 0x00002222, - 0xffffddde, 0x0000230b, 0xffffdcf5, 0x00000b23, 0xfffff4dd, 0x00001d00, 0xffffe300, 0x0000001d, - 0xffffffe3, 0x000015ed, 0xffffea13, 0xffffed16, 0x000012ea, 0x000019f1, 0xffffe60f, 0xfffff11a, - 0x00000ee6, 0x00002500, 0xffffdb00, 0x00000025, 0xffffffdb, 0x00002c1b, 0xffffd3e5, 0x00001b2c, - 0xffffe4d4, 0x00002c24, 0xffffd3dc, 0x0000242c, 0xffffdbd4, 0x00002c12, 0xffffd3ee, 0x0000122c, - 0xffffedd4, 0x000020f6, 0xffffdf0a, 0xfffff621, 0x000009df, 0x00002d2d, 0xffffd2d3, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000300, 0xfffffd00, 0x00000003, 0xfffffffd, 0x00000606, - 0xfffff9fa, 0x00000700, 0xfffff900, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020300, 0x0201fd00, - 0x02020003, 0x0201fffd, 0x02020606, 0x0201f9fa, 0x02020700, 0x0201f900, 0xfdfe0000, 0xfdfe0202, - 0xfdfdfdfe, 0xfdfe0300, 0xfdfdfd00, 0xfdfe0003, 0xfdfdfffd, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0700, - 0xfdfdf900, 0x03000000, 0x03000202, 0x02fffdfe, 0x03000300, 0x02fffd00, 0x03000003, 0x02fffffd, - 0x03000606, 0x02fff9fa, 0x03000700, 0x02fff900, 0xfd000000, 0xfd000202, 0xfcfffdfe, 0xfd000300, - 0xfcfffd00, 0xfd000003, 0xfcfffffd, 0xfd000606, 0xfcfff9fa, 0xfd000700, 0xfcfff900, 0x00030000, - 0x00030202, 0x0002fdfe, 0x00030300, 0x0002fd00, 0x00030003, 0x0002fffd, 0x00030606, 0x0002f9fa, - 0x00030700, 0x0002f900, 0xfffd0000, 0xfffd0202, 0xfffcfdfe, 0xfffd0300, 0xfffcfd00, 0xfffd0003, - 0xfffcfffd, 0xfffd0606, 0xfffcf9fa, 0xfffd0700, 0xfffcf900, 0x06060000, 0x06060202, 0x0605fdfe, - 0x06060300, 0x0605fd00, 0x06060003, 0x0605fffd, 0x06060606, 0x0605f9fa, 0x06060700, 0x0605f900, - 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0300, 0xf9f9fd00, 0xf9fa0003, 0xf9f9fffd, 0xf9fa0606, - 0xf9f9f9fa, 0xf9fa0700, 0xf9f9f900, 0x07000000, 0x07000202, 0x06fffdfe, 0x07000300, 0x06fffd00, - 0x07000003, 0x06fffffd, 0x07000606, 0x06fff9fa, 0x07000700, 0x06fff900, 0xf9000000, 0xf9000202, - 0xf8fffdfe, 0xf9000300, 0xf8fffd00, 0xf9000003, 0xf8fffffd, 0xf9000606, 0xf8fff9fa, 0xf9000700, - 0xf8fff900, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000202, 0xfffffdfe, 0x00000606, - 0xfffff9fa, 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x000003fc, 0xfffffc04, 0xfffffa0a, - 0x000005f6, 0xfffff400, 0x00000c00, 0xfffff3fa, 0xfffff406, 0x00000bfa, 0x00000c06, 0xfffffff2, - 0x0000000e, 0x00000c0c, 0xfffff3f4, 0xffffee00, 0x00001200, 0xfffff40e, 0x00000bf2, 0xfffff9ee, - 0xfffffa12, 0x000005ee, 0x00000612, 0xffffedf6, 0xffffee0a, 0x000011f6, 0x0000120a, 0xffffffea, - 0x00000016, 0xffffe800, 0x00001800, 0xfffff3ea, 0xfffff416, 0x00000bea, 0x00000c16, 0xffffe7f8, - 0xffffe808, 0x000017f8, 0x00001808, 0xfffff9e6, 0xfffffa1a, 0x000005e6, 0x0000061a, 0xffffffe4, - 0x0000001c, 0x00001414, 0xffffebec, 0xffffe5f2, 0x00001a0e, 0xfffff3e2, 0x00000c1e, 0xffffdff6, - 0x0000200a, 0xffffdfee, 0x00002012, 0xffffe5e6, 0x00001a1a, 0xffffebde, 0x00001422, 0xfffff3da, - 0x00000c26, 0xffffdfe0, 0x00002020, 0x00002020, 0xffffd7ea, 0xffffddde, 0x00002222, 0x00000000, - 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, - 0x00000600, 0xfffffa00, 0x00000006, 0xfffffffa, 0x02000000, 0x02000200, 0x01fffe00, 0x02000002, - 0x01fffffe, 0x02000202, 0x01fffdfe, 0x02000606, 0x01fff9fa, 0x02000600, 0x01fffa00, 0x02000006, - 0x01fffffa, 0xfe000000, 0xfe000200, 0xfdfffe00, 0xfe000002, 0xfdfffffe, 0xfe000202, 0xfdfffdfe, - 0xfe000606, 0xfdfff9fa, 0xfe000600, 0xfdfffa00, 0xfe000006, 0xfdfffffa, 0x00020000, 0x00020200, - 0x0001fe00, 0x00020002, 0x0001fffe, 0x00020202, 0x0001fdfe, 0x00020606, 0x0001f9fa, 0x00020600, - 0x0001fa00, 0x00020006, 0x0001fffa, 0xfffe0000, 0xfffe0200, 0xfffdfe00, 0xfffe0002, 0xfffdfffe, - 0xfffe0202, 0xfffdfdfe, 0xfffe0606, 0xfffdf9fa, 0xfffe0600, 0xfffdfa00, 0xfffe0006, 0xfffdfffa, - 0x02020000, 0x02020200, 0x0201fe00, 0x02020002, 0x0201fffe, 0x02020202, 0x0201fdfe, 0x02020606, - 0x0201f9fa, 0x02020600, 0x0201fa00, 0x02020006, 0x0201fffa, 0xfdfe0000, 0xfdfe0200, 0xfdfdfe00, - 0xfdfe0002, 0xfdfdfffe, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0600, 0xfdfdfa00, - 0xfdfe0006, 0xfdfdfffa, 0x06060000, 0x06060200, 0x0605fe00, 0x06060002, 0x0605fffe, 0x06060202, - 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060600, 0x0605fa00, 0x06060006, 0x0605fffa, 0xf9fa0000, - 0xf9fa0200, 0xf9f9fe00, 0xf9fa0002, 0xf9f9fffe, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, - 0xf9fa0600, 0xf9f9fa00, 0xf9fa0006, 0xf9f9fffa, 0x06000000, 0x06000200, 0x05fffe00, 0x06000002, - 0x05fffffe, 0x06000202, 0x05fffdfe, 0x06000606, 0x05fff9fa, 0x06000600, 0x05fffa00, 0x06000006, - 0x05fffffa, 0xfa000000, 0xfa000200, 0xf9fffe00, 0xfa000002, 0xf9fffffe, 0xfa000202, 0xf9fffdfe, - 0xfa000606, 0xf9fff9fa, 0xfa000600, 0xf9fffa00, 0xfa000006, 0xf9fffffa, 0x00060000, 0x00060200, - 0x0005fe00, 0x00060002, 0x0005fffe, 0x00060202, 0x0005fdfe, 0x00060606, 0x0005f9fa, 0x00060600, - 0x0005fa00, 0x00060006, 0x0005fffa, 0xfffa0000, 0xfffa0200, 0xfff9fe00, 0xfffa0002, 0xfff9fffe, - 0xfffa0202, 0xfff9fdfe, 0xfffa0606, 0xfff9f9fa, 0xfffa0600, 0xfff9fa00, 0xfffa0006, 0xfff9fffa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, 0xfffffbfc, 0x00000a0a, - 0xfffff5f6, 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x000005fa, 0xfffffa06, 0xfffff80e, - 0x000007f2, 0xffffffee, 0x00000012, 0xfffff00a, 0x00000ff6, 0xffffe800, 0x00001800, 0xfffff7e8, - 0xfffff818, 0x000007e8, 0x00000818, 0x00001212, 0xffffedee, 0xfffff014, 0x00000fec, 0xffffe5f2, - 0xffffe60e, 0x000019f2, 0x00001a0e, 0xffffffe2, 0x0000001e, 0xffffde00, 0x00002200, 0xfffff7de, - 0xfffff822, 0x000007de, 0x00000822, 0xffffede2, 0xffffee1e, 0x000011e2, 0x0000121e, 0xffffddf6, - 0xffffde0a, 0x000021f6, 0x0000220a, 0xffffddec, 0x00002214, 0xffffffd8, 0x00000028, 0x00001e1e, - 0xffffe1e2, 0xffffedd8, 0x00001228, 0xffffd400, 0x00002c00, 0xffffd3f0, 0x00002c10, 0xffffdbdc, - 0xffffdbdc, 0x00002424, 0xffffd3e6, 0x00002c1a, 0xffffe5d2, 0x00001a2e, 0xffffedcc, 0x00001234, - 0xffffc9ec, 0xffffd3d4, 0x00002c2c, 0xffffc9e0, 0xffffd1d2, 0xffffd1d2, 0x00002e2e, 0x00000000, - 0x00000200, 0xfffffe00, 0x00000002, 0xfffffffe, 0x00000404, 0xfffffbfc, 0x00000a0a, 0xfffff5f6, - 0x00000a00, 0xfffff600, 0x0000000a, 0xfffffff6, 0x02000000, 0x02000200, 0x01fffe00, 0x02000002, - 0x01fffffe, 0x02000404, 0x01fffbfc, 0x02000a0a, 0x01fff5f6, 0x02000a00, 0x01fff600, 0x0200000a, - 0x01fffff6, 0xfe000000, 0xfe000200, 0xfdfffe00, 0xfe000002, 0xfdfffffe, 0xfe000404, 0xfdfffbfc, - 0xfe000a0a, 0xfdfff5f6, 0xfe000a00, 0xfdfff600, 0xfe00000a, 0xfdfffff6, 0x00020000, 0x00020200, - 0x0001fe00, 0x00020002, 0x0001fffe, 0x00020404, 0x0001fbfc, 0x00020a0a, 0x0001f5f6, 0x00020a00, - 0x0001f600, 0x0002000a, 0x0001fff6, 0xfffe0000, 0xfffe0200, 0xfffdfe00, 0xfffe0002, 0xfffdfffe, - 0xfffe0404, 0xfffdfbfc, 0xfffe0a0a, 0xfffdf5f6, 0xfffe0a00, 0xfffdf600, 0xfffe000a, 0xfffdfff6, - 0x04040000, 0x04040200, 0x0403fe00, 0x04040002, 0x0403fffe, 0x04040404, 0x0403fbfc, 0x04040a0a, - 0x0403f5f6, 0x04040a00, 0x0403f600, 0x0404000a, 0x0403fff6, 0xfbfc0000, 0xfbfc0200, 0xfbfbfe00, - 0xfbfc0002, 0xfbfbfffe, 0xfbfc0404, 0xfbfbfbfc, 0xfbfc0a0a, 0xfbfbf5f6, 0xfbfc0a00, 0xfbfbf600, - 0xfbfc000a, 0xfbfbfff6, 0x0a0a0000, 0x0a0a0200, 0x0a09fe00, 0x0a0a0002, 0x0a09fffe, 0x0a0a0404, - 0x0a09fbfc, 0x0a0a0a0a, 0x0a09f5f6, 0x0a0a0a00, 0x0a09f600, 0x0a0a000a, 0x0a09fff6, 0xf5f60000, - 0xf5f60200, 0xf5f5fe00, 0xf5f60002, 0xf5f5fffe, 0xf5f60404, 0xf5f5fbfc, 0xf5f60a0a, 0xf5f5f5f6, - 0xf5f60a00, 0xf5f5f600, 0xf5f6000a, 0xf5f5fff6, 0x0a000000, 0x0a000200, 0x09fffe00, 0x0a000002, - 0x09fffffe, 0x0a000404, 0x09fffbfc, 0x0a000a0a, 0x09fff5f6, 0x0a000a00, 0x09fff600, 0x0a00000a, - 0x09fffff6, 0xf6000000, 0xf6000200, 0xf5fffe00, 0xf6000002, 0xf5fffffe, 0xf6000404, 0xf5fffbfc, - 0xf6000a0a, 0xf5fff5f6, 0xf6000a00, 0xf5fff600, 0xf600000a, 0xf5fffff6, 0x000a0000, 0x000a0200, - 0x0009fe00, 0x000a0002, 0x0009fffe, 0x000a0404, 0x0009fbfc, 0x000a0a0a, 0x0009f5f6, 0x000a0a00, - 0x0009f600, 0x000a000a, 0x0009fff6, 0xfff60000, 0xfff60200, 0xfff5fe00, 0xfff60002, 0xfff5fffe, - 0xfff60404, 0xfff5fbfc, 0xfff60a0a, 0xfff5f5f6, 0xfff60a00, 0xfff5f600, 0xfff6000a, 0xfff5fff6, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000404, 0xfffffbfc, 0x00000c0c, - 0xfffff3f4, 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x000007f8, 0xfffff808, 0xfffff008, - 0x00000ff8, 0xffffe800, 0x00001800, 0xfffff7e8, 0xfffff818, 0x000007e8, 0x00000818, 0xfffff014, - 0x00000fec, 0xffffffe4, 0x0000001c, 0xffffe7f0, 0xffffe810, 0x000017f0, 0x00001810, 0xffffe000, - 0x00002000, 0xffffefe4, 0xfffff01c, 0x00000fe4, 0x0000101c, 0xffffdff8, 0xffffe008, 0xfffff7e0, - 0xfffff820, 0x000007e0, 0x00000820, 0x00001ff8, 0x00002008, 0x00001818, 0xffffe7e8, 0xffffe818, - 0x000017e8, 0xffffdfec, 0x00002014, 0xffffffd8, 0x00000028, 0xffffefd8, 0x00001028, 0xffffd400, - 0xffffd400, 0xffffffd4, 0x0000002c, 0x00002c00, 0x00002c00, 0xffffdfe0, 0x00002020, 0xffffd3f0, - 0x00002c10, 0xffffd3e8, 0xffffe7d4, 0x0000182c, 0x00002c18, 0xffffefd0, 0x00001030, 0xffffdbdc, - 0xffffdbdc, 0x00002424, 0x00002424, 0xffffcbec, 0x00002828, 0xffffd7d8, 0xffffcbe0, 0x00000000, - 0x00000400, 0xfffffc00, 0x00000004, 0xfffffffc, 0x00000404, 0xfffffbfc, 0x00000c0c, 0xfffff3f4, - 0x00000c00, 0xfffff400, 0x0000000c, 0xfffffff4, 0x04000000, 0x04000400, 0x03fffc00, 0x04000004, - 0x03fffffc, 0x04000404, 0x03fffbfc, 0x04000c0c, 0x03fff3f4, 0x04000c00, 0x03fff400, 0x0400000c, - 0x03fffff4, 0xfc000000, 0xfc000400, 0xfbfffc00, 0xfc000004, 0xfbfffffc, 0xfc000404, 0xfbfffbfc, - 0xfc000c0c, 0xfbfff3f4, 0xfc000c00, 0xfbfff400, 0xfc00000c, 0xfbfffff4, 0x00040000, 0x00040400, - 0x0003fc00, 0x00040004, 0x0003fffc, 0x00040404, 0x0003fbfc, 0x00040c0c, 0x0003f3f4, 0x00040c00, - 0x0003f400, 0x0004000c, 0x0003fff4, 0xfffc0000, 0xfffc0400, 0xfffbfc00, 0xfffc0004, 0xfffbfffc, - 0xfffc0404, 0xfffbfbfc, 0xfffc0c0c, 0xfffbf3f4, 0xfffc0c00, 0xfffbf400, 0xfffc000c, 0xfffbfff4, - 0x04040000, 0x04040400, 0x0403fc00, 0x04040004, 0x0403fffc, 0x04040404, 0x0403fbfc, 0x04040c0c, - 0x0403f3f4, 0x04040c00, 0x0403f400, 0x0404000c, 0x0403fff4, 0xfbfc0000, 0xfbfc0400, 0xfbfbfc00, - 0xfbfc0004, 0xfbfbfffc, 0xfbfc0404, 0xfbfbfbfc, 0xfbfc0c0c, 0xfbfbf3f4, 0xfbfc0c00, 0xfbfbf400, - 0xfbfc000c, 0xfbfbfff4, 0x0c0c0000, 0x0c0c0400, 0x0c0bfc00, 0x0c0c0004, 0x0c0bfffc, 0x0c0c0404, - 0x0c0bfbfc, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c0c00, 0x0c0bf400, 0x0c0c000c, 0x0c0bfff4, 0xf3f40000, - 0xf3f40400, 0xf3f3fc00, 0xf3f40004, 0xf3f3fffc, 0xf3f40404, 0xf3f3fbfc, 0xf3f40c0c, 0xf3f3f3f4, - 0xf3f40c00, 0xf3f3f400, 0xf3f4000c, 0xf3f3fff4, 0x0c000000, 0x0c000400, 0x0bfffc00, 0x0c000004, - 0x0bfffffc, 0x0c000404, 0x0bfffbfc, 0x0c000c0c, 0x0bfff3f4, 0x0c000c00, 0x0bfff400, 0x0c00000c, - 0x0bfffff4, 0xf4000000, 0xf4000400, 0xf3fffc00, 0xf4000004, 0xf3fffffc, 0xf4000404, 0xf3fffbfc, - 0xf4000c0c, 0xf3fff3f4, 0xf4000c00, 0xf3fff400, 0xf400000c, 0xf3fffff4, 0x000c0000, 0x000c0400, - 0x000bfc00, 0x000c0004, 0x000bfffc, 0x000c0404, 0x000bfbfc, 0x000c0c0c, 0x000bf3f4, 0x000c0c00, - 0x000bf400, 0x000c000c, 0x000bfff4, 0xfff40000, 0xfff40400, 0xfff3fc00, 0xfff40004, 0xfff3fffc, - 0xfff40404, 0xfff3fbfc, 0xfff40c0c, 0xfff3f3f4, 0xfff40c00, 0xfff3f400, 0xfff4000c, 0xfff3fff4, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, - 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, - 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, - 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, - 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, - 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, - 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, - 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, - 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, - 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, - 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, - 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, - 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, - 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, - 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, - 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, - 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, - 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, - 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, - 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, - 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, - 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, - 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, - 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, - 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, - 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, - 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, - 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, - 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, - 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, - 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, - 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, - 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, - 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, - 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, - 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, - 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, - 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, - 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, - 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, - 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, - 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, - 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, - 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, - 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, - 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, - 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, - 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, - 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, - 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, - 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, - 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, - 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, - 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, - 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, - 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, - 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, - 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, - 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, - 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, - 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, - 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, - 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, - 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, - 0xffffebec, 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000202, 0xfffffdfe, 0x00000606, 0xfffff9fa, 0x00000c0c, 0xfffff3f4, 0x00001414, 0xffffebec, - 0x00002020, 0xffffdfe0, 0x00002e2e, 0xffffd1d2, 0x02020000, 0x02020202, 0x0201fdfe, 0x02020606, - 0x0201f9fa, 0x02020c0c, 0x0201f3f4, 0x02021414, 0x0201ebec, 0x02022020, 0x0201dfe0, 0x02022e2e, - 0x0201d1d2, 0xfdfe0000, 0xfdfe0202, 0xfdfdfdfe, 0xfdfe0606, 0xfdfdf9fa, 0xfdfe0c0c, 0xfdfdf3f4, - 0xfdfe1414, 0xfdfdebec, 0xfdfe2020, 0xfdfddfe0, 0xfdfe2e2e, 0xfdfdd1d2, 0x06060000, 0x06060202, - 0x0605fdfe, 0x06060606, 0x0605f9fa, 0x06060c0c, 0x0605f3f4, 0x06061414, 0x0605ebec, 0x06062020, - 0x0605dfe0, 0x06062e2e, 0x0605d1d2, 0xf9fa0000, 0xf9fa0202, 0xf9f9fdfe, 0xf9fa0606, 0xf9f9f9fa, - 0xf9fa0c0c, 0xf9f9f3f4, 0xf9fa1414, 0xf9f9ebec, 0xf9fa2020, 0xf9f9dfe0, 0xf9fa2e2e, 0xf9f9d1d2, - 0x0c0c0000, 0x0c0c0202, 0x0c0bfdfe, 0x0c0c0606, 0x0c0bf9fa, 0x0c0c0c0c, 0x0c0bf3f4, 0x0c0c1414, - 0x0c0bebec, 0x0c0c2020, 0x0c0bdfe0, 0x0c0c2e2e, 0x0c0bd1d2, 0xf3f40000, 0xf3f40202, 0xf3f3fdfe, - 0xf3f40606, 0xf3f3f9fa, 0xf3f40c0c, 0xf3f3f3f4, 0xf3f41414, 0xf3f3ebec, 0xf3f42020, 0xf3f3dfe0, - 0xf3f42e2e, 0xf3f3d1d2, 0x14140000, 0x14140202, 0x1413fdfe, 0x14140606, 0x1413f9fa, 0x14140c0c, - 0x1413f3f4, 0x14141414, 0x1413ebec, 0x14142020, 0x1413dfe0, 0x14142e2e, 0x1413d1d2, 0xebec0000, - 0xebec0202, 0xebebfdfe, 0xebec0606, 0xebebf9fa, 0xebec0c0c, 0xebebf3f4, 0xebec1414, 0xebebebec, - 0xebec2020, 0xebebdfe0, 0xebec2e2e, 0xebebd1d2, 0x20200000, 0x20200202, 0x201ffdfe, 0x20200606, - 0x201ff9fa, 0x20200c0c, 0x201ff3f4, 0x20201414, 0x201febec, 0x20202020, 0x201fdfe0, 0x20202e2e, - 0x201fd1d2, 0xdfe00000, 0xdfe00202, 0xdfdffdfe, 0xdfe00606, 0xdfdff9fa, 0xdfe00c0c, 0xdfdff3f4, - 0xdfe01414, 0xdfdfebec, 0xdfe02020, 0xdfdfdfe0, 0xdfe02e2e, 0xdfdfd1d2, 0x2e2e0000, 0x2e2e0202, - 0x2e2dfdfe, 0x2e2e0606, 0x2e2df9fa, 0x2e2e0c0c, 0x2e2df3f4, 0x2e2e1414, 0x2e2debec, 0x2e2e2020, - 0x2e2ddfe0, 0x2e2e2e2e, 0x2e2dd1d2, 0xd1d20000, 0xd1d20202, 0xd1d1fdfe, 0xd1d20606, 0xd1d1f9fa, - 0xd1d20c0c, 0xd1d1f3f4, 0xd1d21414, 0xd1d1ebec, 0xd1d22020, 0xd1d1dfe0, 0xd1d22e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 -}; - - -const uint32 Indeo3::correctionloworder[] = { - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x04040404, - 0xfbfbfbfc, 0x05050101, 0xfafafeff, 0x01010505, 0xfefefafb, 0x0403fbfc, 0xfbfc0404, 0x0605fdfe, - 0xf9fa0202, 0xfdfe0606, 0x0201f9fa, 0x09090404, 0xf6f6fbfc, 0x04040909, 0xfbfbf6f7, 0x09090909, - 0xf6f6f6f7, 0x0a0a0101, 0xf5f5feff, 0x01010a0a, 0xfefef5f6, 0x0807fafb, 0xf7f80505, 0xfafb0808, - 0x0504f7f8, 0x0f0f0909, 0xf0f0f6f7, 0x09090f0f, 0xf6f6f0f1, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, - 0x0302f3f4, 0x10100404, 0xefeffbfc, 0x04041010, 0xfbfbeff0, 0x10101010, 0xefefeff0, 0x12120000, - 0xedee0000, 0x00001212, 0xffffedee, 0x0c0bf3f4, 0xf3f40c0c, 0x100ff6f7, 0xeff00909, 0xf6f71010, - 0x0908eff0, 0x1b1b0b0b, 0xe4e4f4f5, 0x0b0b1b1b, 0xf4f4e4e5, 0x1c1c1313, 0xe3e3eced, 0x13131c1c, - 0xecece3e4, 0x1615f9fa, 0xe9ea0606, 0xf9fa1616, 0x0605e9ea, 0x1d1d0404, 0xe2e2fbfc, 0x04041d1d, - 0xfbfbe2e3, 0x1e1e1e1e, 0xe1e1e1e2, 0x2120fdfe, 0xdedf0202, 0xfdfe2121, 0x0201dedf, 0x1716edee, - 0xe8e91212, 0xedee1717, 0x1211e8e9, 0x1e1df0f1, 0xe1e20f0f, 0xf0f11e1e, 0x0f0ee1e2, 0x2e2e1616, - 0xd1d1e9ea, 0x16162e2e, 0xe9e9d1d2, 0x2f2f0d0d, 0xd0d0f2f3, 0x0d0d2f2f, 0xf2f2d0d1, 0x31312323, - 0xcecedcdd, 0x23233131, 0xdcdccecf, 0x2928f4f5, 0xd6d70b0b, 0xf4f52929, 0x0b0ad6d7, 0x33330404, - 0xccccfbfc, 0x04043333, 0xfbfbcccd, 0x36363636, 0xc9c9c9ca, 0x2221ddde, 0xddde2222, 0x2a29e2e3, - 0xd5d61d1d, 0xe2e32a2a, 0x1d1cd5d6, 0x3c3bf9fa, 0xc3c40606, 0xf9fa3c3c, 0x0605c3c4, 0x4c4c1b1b, - 0xb3b3e4e5, 0x1b1b4c4c, 0xe4e4b3b4, 0x4d4d2b2b, 0xb2b2d4d5, 0x2b2b4d4d, 0xd4d4b2b3, 0x3736e7e8, - 0xc8c91818, 0xe7e83737, 0x1817c8c9, 0x4f4f0e0e, 0xb0b0f1f2, 0x0e0e4f4f, 0xf1f1b0b1, 0x53533f3f, - 0xacacc0c1, 0x3f3f5353, 0xc0c0acad, 0x4a49ebec, 0xb5b61414, 0xebec4a4a, 0x1413b5b6, 0x58580202, - 0xa7a7fdfe, 0x02025858, 0xfdfda7a8, 0x5d5d5d5d, 0xa2a2a2a3, 0x3d3ccbcc, 0xc2c33434, 0xcbcc3d3d, - 0x3433c2c3, 0x78783434, 0x8787cbcc, 0x34347878, 0xcbcb8788, 0x4b4ad2d3, 0xb4b52d2d, 0xd2d34b4b, - 0x2d2cb4b5, 0x7d7d4b4b, 0x8282b4b5, 0x4b4b7d7d, 0xb4b48283, 0x7a7a2121, 0x8585dedf, 0x21217a7a, - 0xdede8586, 0x6766f2f3, 0x98990d0d, 0xf2f36767, 0x0d0c9899, 0x605fd7d8, 0x9fa02828, 0xd7d86060, - 0x28279fa0, 0x7f7eddde, 0x80812222, 0xddde7f7f, 0x22218081, 0x5958a6a7, 0xa6a75959, 0x6968b1b2, - 0x96974e4e, 0xb1b26969, 0x4e4d9697, 0x0c0c0c0c, 0xf3f3f3f4, 0x17171717, 0xe8e8e8e9, 0x2a2a2a2a, - 0xd5d5d5d6, 0x49494949, 0xb6b6b6b7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0x0302feff, 0xfcfd0101, - 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfcfd0101, 0xfeff0303, 0xfeff0303, - 0xfeff0303, 0xfeff0303, 0xfeff0303, 0xfeff0303, 0xfeff0303, 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, - 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, 0x0100fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, - 0xf8f8f8f9, 0x08080202, 0xf7f7fdfe, 0x02020808, 0xfdfdf7f8, 0x0908fdfe, 0xf6f70202, 0xfdfe0909, - 0x0201f6f7, 0x0605f9fa, 0xf9fa0606, 0x0d0d0606, 0xf2f2f9fa, 0x06060d0d, 0xf9f9f2f3, 0x0d0d0d0d, - 0xf2f2f2f3, 0x0e0e0101, 0xf1f1feff, 0x01010e0e, 0xfefef1f2, 0x0c0bf7f8, 0xf3f40808, 0xf7f80c0c, - 0x0807f3f4, 0x17170e0e, 0xe8e8f1f2, 0x0e0e1717, 0xf1f1e8e9, 0x1211fafb, 0xedee0505, 0xfafb1212, - 0x0504edee, 0x18180606, 0xe7e7f9fa, 0x06061818, 0xf9f9e7e8, 0x18181818, 0xe7e7e7e8, 0x1b1afeff, - 0xe4e50101, 0xfeff1b1b, 0x0100e4e5, 0x1110eeef, 0xeeef1111, 0x1716f2f3, 0xe8e90d0d, 0xf2f31717, - 0x0d0ce8e9, 0x28281010, 0xd7d7eff0, 0x10102828, 0xefefd7d8, 0x29291c1c, 0xd6d6e3e4, 0x1c1c2929, - 0xe3e3d6d7, 0x2120f6f7, 0xdedf0909, 0xf6f72121, 0x0908dedf, 0x2b2b0606, 0xd4d4f9fa, 0x06062b2b, - 0xf9f9d4d5, 0x2e2e2e2e, 0xd1d1d1d2, 0x3231fbfc, 0xcdce0404, 0xfbfc3232, 0x0403cdce, 0x2221e4e5, - 0xddde1b1b, 0xe4e52222, 0x1b1addde, 0x2d2ce9ea, 0xd2d31616, 0xe9ea2d2d, 0x1615d2d3, 0x45452222, - 0xbabaddde, 0x22224545, 0xddddbabb, 0x46461313, 0xb9b9eced, 0x13134646, 0xececb9ba, 0x49493535, - 0xb6b6cacb, 0x35354949, 0xcacab6b7, 0x3e3deeef, 0xc1c21111, 0xeeef3e3e, 0x1110c1c2, 0x4d4d0505, - 0xb2b2fafb, 0x05054d4d, 0xfafab2b3, 0x52525252, 0xadadadae, 0x3332cccd, 0xcccd3333, 0x403fd4d5, - 0xbfc02b2b, 0xd4d54040, 0x2b2abfc0, 0x5a59f5f6, 0xa5a60a0a, 0xf5f65a5a, 0x0a09a5a6, 0x72722929, - 0x8d8dd6d7, 0x29297272, 0xd6d68d8e, 0x74744040, 0x8b8bbfc0, 0x40407474, 0xbfbf8b8c, 0x5251dadb, - 0xadae2525, 0xdadb5252, 0x2524adae, 0x77771616, 0x8888e9ea, 0x16167777, 0xe9e98889, 0x7c7c5f5f, - 0x8383a0a1, 0x5f5f7c7c, 0xa0a08384, 0x6f6ee1e2, 0x90911e1e, 0xe1e26f6f, 0x1e1d9091, 0x5c5bb1b2, - 0xa3a44e4e, 0xb1b25c5c, 0x4e4da3a4, 0x7170bbbc, 0x8e8f4444, 0xbbbc7171, 0x44438e8f, 0x12121212, - 0xedededee, 0x22222222, 0xddddddde, 0x3f3f3f3f, 0xc0c0c0c1, 0x6d6d6d6d, 0x92929293, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, - 0x03030303, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, - 0xfcfcfcfd, 0xfcfcfcfd, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, 0x0403feff, - 0x0403feff, 0x0403feff, 0x0403feff, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, - 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfbfc0101, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, - 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0xfeff0404, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, - 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x0100fbfc, 0x07070707, 0x07070707, - 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, - 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, - 0xf5f5fcfd, 0x03030a0a, 0xfcfcf5f6, 0x09090909, 0xf6f6f6f7, 0x0706f8f9, 0xf8f90707, 0x0c0bfcfd, - 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x11110808, 0xeeeef7f8, 0x08081111, 0xf7f7eeef, 0x11111111, - 0xeeeeeeef, 0x13130101, 0xececfeff, 0x01011313, 0xfefeeced, 0x100ff4f5, 0xeff00b0b, 0xf4f51010, - 0x0b0aeff0, 0x1716f9fa, 0xe8e90606, 0xf9fa1717, 0x0605e8e9, 0x1f1f1212, 0xe0e0edee, 0x12121f1f, - 0xedede0e1, 0x20200808, 0xdfdff7f8, 0x08082020, 0xf7f7dfe0, 0x21212121, 0xdedededf, 0x2423feff, - 0xdbdc0101, 0xfeff2424, 0x0100dbdc, 0x1716e8e9, 0xe8e91717, 0x1f1eeeef, 0xe0e11111, 0xeeef1f1f, - 0x1110e0e1, 0x36361515, 0xc9c9eaeb, 0x15153636, 0xeaeac9ca, 0x37372525, 0xc8c8dadb, 0x25253737, - 0xdadac8c9, 0x2c2bf3f4, 0xd3d40c0c, 0xf3f42c2c, 0x0c0bd3d4, 0x39390808, 0xc6c6f7f8, 0x08083939, - 0xf7f7c6c7, 0x3d3d3d3d, 0xc2c2c2c3, 0x4241fafb, 0xbdbe0505, 0xfafb4242, 0x0504bdbe, 0x2d2cdbdc, - 0xd2d32424, 0xdbdc2d2d, 0x2423d2d3, 0x3c3be2e3, 0xc3c41d1d, 0xe2e33c3c, 0x1d1cc3c4, 0x5c5c2d2d, - 0xa3a3d2d3, 0x2d2d5c5c, 0xd2d2a3a4, 0x5d5d1919, 0xa2a2e6e7, 0x19195d5d, 0xe6e6a2a3, 0x61614747, - 0x9e9eb8b9, 0x47476161, 0xb8b89e9f, 0x5352e9ea, 0xacad1616, 0xe9ea5353, 0x1615acad, 0x66660707, - 0x9999f8f9, 0x07076666, 0xf8f8999a, 0x6d6d6d6d, 0x92929293, 0x4443bbbc, 0xbbbc4444, 0x5554c6c7, - 0xaaab3939, 0xc6c75555, 0x3938aaab, 0x7877f2f3, 0x87880d0d, 0xf2f37878, 0x0d0c8788, 0x6e6dcecf, - 0x91923131, 0xcecf6e6e, 0x31309192, 0x7b7a9798, 0x84856868, 0x97987b7b, 0x68678485, 0x18181818, - 0xe7e7e7e8, 0x2e2e2e2e, 0xd1d1d1d2, 0x54545454, 0xabababac, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040404, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, - 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, - 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0x0504feff, 0xfafb0101, 0xfafb0101, 0xfafb0101, - 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfafb0101, 0xfeff0505, - 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, 0xfeff0505, - 0xfeff0505, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0100fafb, - 0x0100fafb, 0x0100fafb, 0x0100fafb, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, - 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0x0a0a0303, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, - 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0xf5f5fcfd, 0x03030a0a, - 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, 0x03030a0a, - 0x03030a0a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, - 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x03030d0d, 0xfcfcf2f3, 0x0908f6f7, 0xf6f70909, 0x0f0efbfc, - 0xf0f10404, 0xfbfc0f0f, 0x0403f0f1, 0x16160b0b, 0xe9e9f4f5, 0x0b0b1616, 0xf4f4e9ea, 0x15151515, - 0xeaeaeaeb, 0x18180202, 0xe7e7fdfe, 0x02021818, 0xfdfde7e8, 0x1413f1f2, 0xebec0e0e, 0xf1f21414, - 0x0e0debec, 0x26261717, 0xd9d9e8e9, 0x17172626, 0xe8e8d9da, 0x1d1cf7f8, 0xe2e30808, 0xf7f81d1d, - 0x0807e2e3, 0x27270b0b, 0xd8d8f4f5, 0x0b0b2727, 0xf4f4d8d9, 0x29292929, 0xd6d6d6d7, 0x2d2cfeff, - 0xd2d30101, 0xfeff2d2d, 0x0100d2d3, 0x1d1ce2e3, 0xe2e31d1d, 0x2726e9ea, 0xd8d91616, 0xe9ea2727, - 0x1615d8d9, 0x43431b1b, 0xbcbce4e5, 0x1b1b4343, 0xe4e4bcbd, 0x45452f2f, 0xbabad0d1, 0x2f2f4545, - 0xd0d0babb, 0x3837f0f1, 0xc7c80f0f, 0xf0f13838, 0x0f0ec7c8, 0x47470b0b, 0xb8b8f4f5, 0x0b0b4747, - 0xf4f4b8b9, 0x4c4c4c4c, 0xb3b3b3b4, 0x5352f9fa, 0xacad0606, 0xf9fa5353, 0x0605acad, 0x3938d2d3, - 0xc6c72d2d, 0xd2d33939, 0x2d2cc6c7, 0x4b4adbdc, 0xb4b52424, 0xdbdc4b4b, 0x2423b4b5, 0x73733838, - 0x8c8cc7c8, 0x38387373, 0xc7c78c8d, 0x75751f1f, 0x8a8ae0e1, 0x1f1f7575, 0xe0e08a8b, 0x7a7a5858, - 0x8585a7a8, 0x58587a7a, 0xa7a78586, 0x6867e3e4, 0x97981c1c, 0xe3e46868, 0x1c1b9798, 0x5554aaab, - 0xaaab5555, 0x6a69b7b8, 0x95964848, 0xb7b86a6a, 0x48479596, 0x1e1e1e1e, 0xe1e1e1e2, 0x3a3a3a3a, - 0xc5c5c5c6, 0x69696969, 0x96969697, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x05050505, 0x05050505, - 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, - 0x05050505, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, - 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, - 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0x0706fdfe, 0xf8f90202, - 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, 0xf8f90202, - 0xf8f90202, 0xf8f90202, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, - 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0xfdfe0707, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, - 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, 0x0201f8f9, - 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, - 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, - 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0xf4f4f4f5, 0x0d0d0303, 0x0d0d0303, - 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, 0x0d0d0303, - 0x0d0d0303, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, - 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0xf2f2fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, - 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0xfbfbf0f1, 0x0b0af4f5, 0xf4f50b0b, 0x1211fafb, - 0xedee0505, 0xfafb1212, 0x0504edee, 0x1a1a0d0d, 0xe5e5f2f3, 0x0d0d1a1a, 0xf2f2e5e6, 0x1a1a1a1a, - 0xe5e5e5e6, 0x1d1d0202, 0xe2e2fdfe, 0x02021d1d, 0xfdfde2e3, 0x1817eff0, 0xe7e81010, 0xeff01818, - 0x100fe7e8, 0x2e2e1c1c, 0xd1d1e3e4, 0x1c1c2e2e, 0xe3e3d1d2, 0x2322f6f7, 0xdcdd0909, 0xf6f72323, - 0x0908dcdd, 0x2f2f0d0d, 0xd0d0f2f3, 0x0d0d2f2f, 0xf2f2d0d1, 0x31313131, 0xcecececf, 0x3635feff, - 0xc9ca0101, 0xfeff3636, 0x0100c9ca, 0x2322dcdd, 0xdcdd2323, 0x2f2ee5e6, 0xd0d11a1a, 0xe5e62f2f, - 0x1a19d0d1, 0x51512020, 0xaeaedfe0, 0x20205151, 0xdfdfaeaf, 0x53533838, 0xacacc7c8, 0x38385353, - 0xc7c7acad, 0x4342edee, 0xbcbd1212, 0xedee4343, 0x1211bcbd, 0x56560d0d, 0xa9a9f2f3, 0x0d0d5656, - 0xf2f2a9aa, 0x5b5b5b5b, 0xa4a4a4a5, 0x6362f8f9, 0x9c9d0707, 0xf8f96363, 0x07069c9d, 0x4443c9ca, - 0xbbbc3636, 0xc9ca4444, 0x3635bbbc, 0x5a59d3d4, 0xa5a62c2c, 0xd3d45a5a, 0x2c2ba5a6, 0x7c7bdedf, - 0x83842121, 0xdedf7c7c, 0x21208384, 0x67669899, 0x98996767, 0x7f7ea9aa, 0x80815656, 0xa9aa7f7f, - 0x56558081, 0x25252525, 0xdadadadb, 0x45454545, 0xbabababb, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, - 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0x0807fdfe, 0xf7f80202, 0xf7f80202, 0xf7f80202, - 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, 0xf7f80202, - 0xf7f80202, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, - 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0xfdfe0808, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, - 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, 0x0201f7f8, - 0x0201f7f8, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, - 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0x0d0d0d0d, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, - 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, 0xf2f2f2f3, - 0xf2f2f2f3, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, - 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0x0f0f0404, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, - 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, 0xf0f0fbfc, - 0xf0f0fbfc, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, - 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x04040f0f, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, - 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0xfafaedee, 0x0d0cf2f3, 0xf2f30d0d, 0x1514f9fa, - 0xeaeb0606, 0xf9fa1515, 0x0605eaeb, 0x1e1e0f0f, 0xe1e1f0f1, 0x0f0f1e1e, 0xf0f0e1e2, 0x1e1e1e1e, - 0xe1e1e1e2, 0x22220202, 0xddddfdfe, 0x02022222, 0xfdfdddde, 0x1c1beced, 0xe3e41313, 0xeced1c1c, - 0x1312e3e4, 0x36362020, 0xc9c9dfe0, 0x20203636, 0xdfdfc9ca, 0x2928f4f5, 0xd6d70b0b, 0xf4f52929, - 0x0b0ad6d7, 0x37370f0f, 0xc8c8f0f1, 0x0f0f3737, 0xf0f0c8c9, 0x39393939, 0xc6c6c6c7, 0x3f3efeff, - 0xc0c10101, 0xfeff3f3f, 0x0100c0c1, 0x2827d7d8, 0xd7d82828, 0x3736e1e2, 0xc8c91e1e, 0xe1e23737, - 0x1e1dc8c9, 0x5e5e2525, 0xa1a1dadb, 0x25255e5e, 0xdadaa1a2, 0x60604141, 0x9f9fbebf, 0x41416060, - 0xbebe9fa0, 0x4e4deaeb, 0xb1b21515, 0xeaeb4e4e, 0x1514b1b2, 0x64640f0f, 0x9b9bf0f1, 0x0f0f6464, - 0xf0f09b9c, 0x6a6a6a6a, 0x95959596, 0x7473f7f8, 0x8b8c0808, 0xf7f87474, 0x08078b8c, 0x4f4ec0c1, - 0xb0b13f3f, 0xc0c14f4f, 0x3f3eb0b1, 0x6968cccd, 0x96973333, 0xcccd6969, 0x33329697, 0x78778788, - 0x87887878, 0x2b2b2b2b, 0xd4d4d4d5, 0x50505050, 0xafafafb0, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, - 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, - 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, - 0xf8f8f8f9, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, - 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0x0a09fcfd, 0xf5f60303, 0xf5f60303, 0xf5f60303, - 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, 0xf5f60303, - 0xf5f60303, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, - 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0xfcfd0a0a, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, - 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, 0x0302f5f6, - 0x0302f5f6, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, - 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0xefefeff0, 0xefefeff0, 0xefefeff0, - 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, - 0xefefeff0, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, - 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0x12120505, 0xededfafb, 0xededfafb, 0xededfafb, - 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, 0xededfafb, - 0xededfafb, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, - 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x05051212, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, - 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0xfafaebec, 0x0f0ef0f1, 0xf0f10f0f, 0x1817f8f9, - 0xe7e80707, 0xf8f91818, 0x0706e7e8, 0x23231111, 0xdcdceeef, 0x11112323, 0xeeeedcdd, 0x22222222, - 0xddddddde, 0x26260303, 0xd9d9fcfd, 0x03032626, 0xfcfcd9da, 0x201fe9ea, 0xdfe01616, 0xe9ea2020, - 0x1615dfe0, 0x3d3d2525, 0xc2c2dadb, 0x25253d3d, 0xdadac2c3, 0x2f2ef2f3, 0xd0d10d0d, 0xf2f32f2f, - 0x0d0cd0d1, 0x3f3f1111, 0xc0c0eeef, 0x11113f3f, 0xeeeec0c1, 0x41414141, 0xbebebebf, 0x4847feff, - 0xb7b80101, 0xfeff4848, 0x0100b7b8, 0x2e2dd1d2, 0xd1d22e2e, 0x3f3edcdd, 0xc0c12323, 0xdcdd3f3f, - 0x2322c0c1, 0x6b6b2b2b, 0x9494d4d5, 0x2b2b6b6b, 0xd4d49495, 0x6e6e4b4b, 0x9191b4b5, 0x4b4b6e6e, - 0xb4b49192, 0x5958e7e8, 0xa6a71818, 0xe7e85959, 0x1817a6a7, 0x72721111, 0x8d8deeef, 0x11117272, - 0xeeee8d8e, 0x79797979, 0x86868687, 0x5b5ab7b8, 0xa4a54848, 0xb7b85b5b, 0x4847a4a5, 0x7877c5c6, - 0x87883a3a, 0xc5c67878, 0x3a398788, 0x31313131, 0xcecececf, 0x5c5c5c5c, 0xa3a3a3a4, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, - 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0xf7f7f7f8, - 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, - 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, - 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0x0b0afcfd, 0xf4f50303, - 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xf4f50303, - 0xf4f50303, 0xf4f50303, 0xf4f50303, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, - 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0xfcfd0b0b, 0x0302f4f5, - 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, - 0x0302f4f5, 0x0302f4f5, 0x0302f4f5, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, - 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0xedededee, - 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, - 0xedededee, 0xedededee, 0xedededee, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, - 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0x14140505, 0xebebfafb, - 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, 0xebebfafb, - 0xebebfafb, 0xebebfafb, 0xebebfafb, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, - 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x05051414, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, - 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x1110eeef, 0xeeef1111, 0x1b1af8f9, - 0xe4e50707, 0xf8f91b1b, 0x0706e4e5, 0x27271313, 0xd8d8eced, 0x13132727, 0xececd8d9, 0x27272727, - 0xd8d8d8d9, 0x2b2b0303, 0xd4d4fcfd, 0x03032b2b, 0xfcfcd4d5, 0x2423e7e8, 0xdbdc1818, 0xe7e82424, - 0x1817dbdc, 0x45452a2a, 0xbabad5d6, 0x2a2a4545, 0xd5d5babb, 0x3534f1f2, 0xcacb0e0e, 0xf1f23535, - 0x0e0dcacb, 0x47471313, 0xb8b8eced, 0x13134747, 0xececb8b9, 0x49494949, 0xb6b6b6b7, 0x504ffdfe, - 0xafb00202, 0xfdfe5050, 0x0201afb0, 0x3433cbcc, 0xcbcc3434, 0x4645d8d9, 0xb9ba2727, 0xd8d94646, - 0x2726b9ba, 0x79793030, 0x8686cfd0, 0x30307979, 0xcfcf8687, 0x7c7c5454, 0x8383abac, 0x54547c7c, - 0xabab8384, 0x6463e4e5, 0x9b9c1b1b, 0xe4e56464, 0x1b1a9b9c, 0x6665aeaf, 0x999a5151, 0xaeaf6666, - 0x5150999a, 0x37373737, 0xc8c8c8c9, 0x68686868, 0x97979798, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, - 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0xf6f6f6f7, - 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, - 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, - 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, 0x0c0bfcfd, - 0x0c0bfcfd, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, - 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xf3f40303, 0xfcfd0c0c, 0xfcfd0c0c, - 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, - 0xfcfd0c0c, 0xfcfd0c0c, 0xfcfd0c0c, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, - 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, 0x0302f3f4, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, - 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0x17170606, 0xe8e8f9fa, - 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, - 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0xe8e8f9fa, 0x06061717, 0x06061717, 0x06061717, 0x06061717, - 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, 0x06061717, - 0x06061717, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, - 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0xf9f9e8e9, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, - 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x0403fbfc, 0xfbfc0404, 0x0605fdfe, - 0xf9fa0202, 0xfdfe0606, 0x0201f9fa, 0x08080404, 0xf7f7fbfc, 0x04040808, 0xfbfbf7f8, 0x08080808, - 0xf7f7f7f8, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x0807fbfc, 0xf7f80404, 0xfbfc0808, - 0x0403f7f8, 0x0e0e0808, 0xf1f1f7f8, 0x08080e0e, 0xf7f7f1f2, 0x0c0bfdfe, 0xf3f40202, 0xfdfe0c0c, - 0x0201f3f4, 0x10100404, 0xefeffbfc, 0x04041010, 0xfbfbeff0, 0x10101010, 0xefefeff0, 0x12120000, - 0xedee0000, 0x00001212, 0xffffedee, 0x0c0bf3f4, 0xf3f40c0c, 0x100ff7f8, 0xeff00808, 0xf7f81010, - 0x0807eff0, 0x1a1a0a0a, 0xe5e5f5f6, 0x0a0a1a1a, 0xf5f5e5e6, 0x1c1c1212, 0xe3e3edee, 0x12121c1c, - 0xedede3e4, 0x1615f9fa, 0xe9ea0606, 0xf9fa1616, 0x0605e9ea, 0x1c1c0404, 0xe3e3fbfc, 0x04041c1c, - 0xfbfbe3e4, 0x1e1e1e1e, 0xe1e1e1e2, 0x201ffdfe, 0xdfe00202, 0xfdfe2020, 0x0201dfe0, 0x1615edee, - 0xe9ea1212, 0xedee1616, 0x1211e9ea, 0x1e1df1f2, 0xe1e20e0e, 0xf1f21e1e, 0x0e0de1e2, 0x2e2e1616, - 0xd1d1e9ea, 0x16162e2e, 0xe9e9d1d2, 0x2e2e0c0c, 0xd1d1f3f4, 0x0c0c2e2e, 0xf3f3d1d2, 0x30302222, - 0xcfcfddde, 0x22223030, 0xddddcfd0, 0x2827f5f6, 0xd7d80a0a, 0xf5f62828, 0x0a09d7d8, 0x32320404, - 0xcdcdfbfc, 0x04043232, 0xfbfbcdce, 0x36363636, 0xc9c9c9ca, 0x2221ddde, 0xddde2222, 0x2a29e3e4, - 0xd5d61c1c, 0xe3e42a2a, 0x1c1bd5d6, 0x3c3bf9fa, 0xc3c40606, 0xf9fa3c3c, 0x0605c3c4, 0x4c4c1a1a, - 0xb3b3e5e6, 0x1a1a4c4c, 0xe5e5b3b4, 0x4c4c2a2a, 0xb3b3d5d6, 0x2a2a4c4c, 0xd5d5b3b4, 0x3635e7e8, - 0xc9ca1818, 0xe7e83636, 0x1817c9ca, 0x4e4e0e0e, 0xb1b1f1f2, 0x0e0e4e4e, 0xf1f1b1b2, 0x52523e3e, - 0xadadc1c2, 0x3e3e5252, 0xc1c1adae, 0x4a49ebec, 0xb5b61414, 0xebec4a4a, 0x1413b5b6, 0x58580202, - 0xa7a7fdfe, 0x02025858, 0xfdfda7a8, 0x5c5c5c5c, 0xa3a3a3a4, 0x3c3bcbcc, 0xc3c43434, 0xcbcc3c3c, - 0x3433c3c4, 0x76763434, 0x8989cbcc, 0x34347676, 0xcbcb898a, 0x4a49d3d4, 0xb5b62c2c, 0xd3d44a4a, - 0x2c2bb5b6, 0x76764a4a, 0x8989b5b6, 0x4a4a7676, 0xb5b5898a, 0x76762020, 0x8989dfe0, 0x20207676, - 0xdfdf898a, 0x6665f3f4, 0x999a0c0c, 0xf3f46666, 0x0c0b999a, 0x605fd7d8, 0x9fa02828, 0xd7d86060, - 0x28279fa0, 0x7675ddde, 0x898a2222, 0xddde7676, 0x2221898a, 0x5857a7a8, 0xa7a85858, 0x6867b1b2, - 0x97984e4e, 0xb1b26868, 0x4e4d9798, 0x0c0c0c0c, 0xf3f3f3f4, 0x16161616, 0xe9e9e9ea, 0x2a2a2a2a, - 0xd5d5d5d6, 0x48484848, 0xb7b7b7b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0xfdfe0000, - 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, - 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, - 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, - 0xf9f9f9fa, 0x09090303, 0xf6f6fcfd, 0x03030909, 0xfcfcf6f7, 0x0908fcfd, 0xf6f70303, 0xfcfd0909, - 0x0302f6f7, 0x0605f9fa, 0xf9fa0606, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0xf9f9f3f4, 0x0c0c0c0c, - 0xf3f3f3f4, 0x0f0f0000, 0xf0f10000, 0x00000f0f, 0xfffff0f1, 0x0c0bf6f7, 0xf3f40909, 0xf6f70c0c, - 0x0908f3f4, 0x18180f0f, 0xe7e7f0f1, 0x0f0f1818, 0xf0f0e7e8, 0x1211f9fa, 0xedee0606, 0xf9fa1212, - 0x0605edee, 0x18180606, 0xe7e7f9fa, 0x06061818, 0xf9f9e7e8, 0x18181818, 0xe7e7e7e8, 0x1b1b0000, - 0xe4e50000, 0x00001b1b, 0xffffe4e5, 0x1211edee, 0xedee1212, 0x1817f3f4, 0xe7e80c0c, 0xf3f41818, - 0x0c0be7e8, 0x27270f0f, 0xd8d8f0f1, 0x0f0f2727, 0xf0f0d8d9, 0x2a2a1b1b, 0xd5d5e4e5, 0x1b1b2a2a, - 0xe4e4d5d6, 0x2120f6f7, 0xdedf0909, 0xf6f72121, 0x0908dedf, 0x2a2a0606, 0xd5d5f9fa, 0x06062a2a, - 0xf9f9d5d6, 0x2d2d2d2d, 0xd2d2d2d3, 0x3332fcfd, 0xcccd0303, 0xfcfd3333, 0x0302cccd, 0x2120e4e5, - 0xdedf1b1b, 0xe4e52121, 0x1b1adedf, 0x2d2ceaeb, 0xd2d31515, 0xeaeb2d2d, 0x1514d2d3, 0x45452121, - 0xbabadedf, 0x21214545, 0xdedebabb, 0x45451212, 0xbabaedee, 0x12124545, 0xededbabb, 0x48483636, - 0xb7b7c9ca, 0x36364848, 0xc9c9b7b8, 0x3f3eedee, 0xc0c11212, 0xedee3f3f, 0x1211c0c1, 0x4e4e0606, - 0xb1b1f9fa, 0x06064e4e, 0xf9f9b1b2, 0x51515151, 0xaeaeaeaf, 0x3332cccd, 0xcccd3333, 0x3f3ed5d6, - 0xc0c12a2a, 0xd5d63f3f, 0x2a29c0c1, 0x5a59f6f7, 0xa5a60909, 0xf6f75a5a, 0x0908a5a6, 0x72722a2a, - 0x8d8dd5d6, 0x2a2a7272, 0xd5d58d8e, 0x75753f3f, 0x8a8ac0c1, 0x3f3f7575, 0xc0c08a8b, 0x5150dbdc, - 0xaeaf2424, 0xdbdc5151, 0x2423aeaf, 0x78781515, 0x8787eaeb, 0x15157878, 0xeaea8788, 0x7b7b6060, - 0x84849fa0, 0x60607b7b, 0x9f9f8485, 0x6f6ee1e2, 0x90911e1e, 0xe1e26f6f, 0x1e1d9091, 0x5d5cb1b2, - 0xa2a34e4e, 0xb1b25d5d, 0x4e4da2a3, 0x7271babb, 0x8d8e4545, 0xbabb7272, 0x45448d8e, 0x12121212, - 0xedededee, 0x21212121, 0xdedededf, 0x3f3f3f3f, 0xc0c0c0c1, 0x6c6c6c6c, 0x93939394, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, 0x03030303, - 0x03030303, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, 0xfcfcfcfd, - 0xfcfcfcfd, 0xfcfcfcfd, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, - 0x03030000, 0x03030000, 0x03030000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, - 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0x00000303, 0x00000303, 0x00000303, 0x00000303, - 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, - 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, - 0xf7f7fbfc, 0x04040808, 0xfbfbf7f8, 0x08080808, 0xf7f7f7f8, 0x0807f7f8, 0xf7f80808, 0x0c0bfbfc, - 0xf3f40404, 0xfbfc0c0c, 0x0403f3f4, 0x10100808, 0xefeff7f8, 0x08081010, 0xf7f7eff0, 0x10101010, - 0xefefeff0, 0x14140000, 0xebec0000, 0x00001414, 0xffffebec, 0x100ff3f4, 0xeff00c0c, 0xf3f41010, - 0x0c0beff0, 0x1817fbfc, 0xe7e80404, 0xfbfc1818, 0x0403e7e8, 0x20201010, 0xdfdfeff0, 0x10102020, - 0xefefdfe0, 0x20200808, 0xdfdff7f8, 0x08082020, 0xf7f7dfe0, 0x20202020, 0xdfdfdfe0, 0x24240000, - 0xdbdc0000, 0x00002424, 0xffffdbdc, 0x1817e7e8, 0xe7e81818, 0x201feff0, 0xdfe01010, 0xeff02020, - 0x100fdfe0, 0x34341414, 0xcbcbebec, 0x14143434, 0xebebcbcc, 0x38382424, 0xc7c7dbdc, 0x24243838, - 0xdbdbc7c8, 0x2c2bf3f4, 0xd3d40c0c, 0xf3f42c2c, 0x0c0bd3d4, 0x38380808, 0xc7c7f7f8, 0x08083838, - 0xf7f7c7c8, 0x3c3c3c3c, 0xc3c3c3c4, 0x403ffbfc, 0xbfc00404, 0xfbfc4040, 0x0403bfc0, 0x2c2bdbdc, - 0xd3d42424, 0xdbdc2c2c, 0x2423d3d4, 0x3c3be3e4, 0xc3c41c1c, 0xe3e43c3c, 0x1c1bc3c4, 0x5c5c2c2c, - 0xa3a3d3d4, 0x2c2c5c5c, 0xd3d3a3a4, 0x5c5c1818, 0xa3a3e7e8, 0x18185c5c, 0xe7e7a3a4, 0x60604848, - 0x9f9fb7b8, 0x48486060, 0xb7b79fa0, 0x5453ebec, 0xabac1414, 0xebec5454, 0x1413abac, 0x64640808, - 0x9b9bf7f8, 0x08086464, 0xf7f79b9c, 0x6c6c6c6c, 0x93939394, 0x4443bbbc, 0xbbbc4444, 0x5453c7c8, - 0xabac3838, 0xc7c85454, 0x3837abac, 0x7877f3f4, 0x87880c0c, 0xf3f47878, 0x0c0b8788, 0x6c6bcfd0, - 0x93943030, 0xcfd06c6c, 0x302f9394, 0x7c7b9798, 0x83846868, 0x97987c7c, 0x68678384, 0x18181818, - 0xe7e7e7e8, 0x2c2c2c2c, 0xd3d3d3d4, 0x54545454, 0xabababac, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040404, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, - 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, - 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, - 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0x00000404, - 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, - 0x00000404, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, - 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0x08080404, - 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0x08080404, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, - 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0xf7f7fbfc, 0x04040808, - 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, 0x04040808, - 0x04040808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, - 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x05050f0f, 0xfafaf0f1, 0x0a09f5f6, 0xf5f60a0a, 0x0f0efafb, - 0xf0f10505, 0xfafb0f0f, 0x0504f0f1, 0x14140a0a, 0xebebf5f6, 0x0a0a1414, 0xf5f5ebec, 0x14141414, - 0xebebebec, 0x19190000, 0xe6e70000, 0x00001919, 0xffffe6e7, 0x1413f0f1, 0xebec0f0f, 0xf0f11414, - 0x0f0eebec, 0x28281919, 0xd7d7e6e7, 0x19192828, 0xe6e6d7d8, 0x1e1df5f6, 0xe1e20a0a, 0xf5f61e1e, - 0x0a09e1e2, 0x28280a0a, 0xd7d7f5f6, 0x0a0a2828, 0xf5f5d7d8, 0x28282828, 0xd7d7d7d8, 0x2d2d0000, - 0xd2d30000, 0x00002d2d, 0xffffd2d3, 0x1e1de1e2, 0xe1e21e1e, 0x2827ebec, 0xd7d81414, 0xebec2828, - 0x1413d7d8, 0x41411919, 0xbebee6e7, 0x19194141, 0xe6e6bebf, 0x46462d2d, 0xb9b9d2d3, 0x2d2d4646, - 0xd2d2b9ba, 0x3736f0f1, 0xc8c90f0f, 0xf0f13737, 0x0f0ec8c9, 0x46460a0a, 0xb9b9f5f6, 0x0a0a4646, - 0xf5f5b9ba, 0x4b4b4b4b, 0xb4b4b4b5, 0x5554fafb, 0xaaab0505, 0xfafb5555, 0x0504aaab, 0x3736d2d3, - 0xc8c92d2d, 0xd2d33737, 0x2d2cc8c9, 0x4b4adcdd, 0xb4b52323, 0xdcdd4b4b, 0x2322b4b5, 0x73733737, - 0x8c8cc8c9, 0x37377373, 0xc8c88c8d, 0x73731e1e, 0x8c8ce1e2, 0x1e1e7373, 0xe1e18c8d, 0x78785a5a, - 0x8787a5a6, 0x5a5a7878, 0xa5a58788, 0x6968e1e2, 0x96971e1e, 0xe1e26969, 0x1e1d9697, 0x5554aaab, - 0xaaab5555, 0x6968b9ba, 0x96974646, 0xb9ba6969, 0x46459697, 0x1e1e1e1e, 0xe1e1e1e2, 0x3c3c3c3c, - 0xc3c3c3c4, 0x69696969, 0x96969697, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x05050505, 0x05050505, - 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, 0x05050505, - 0x05050505, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, - 0xfafafafb, 0xfafafafb, 0xfafafafb, 0xfafafafb, 0x05050000, 0x05050000, 0x05050000, 0x05050000, - 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0x05050000, 0xfafb0000, - 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, 0xfafb0000, - 0xfafb0000, 0xfafb0000, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, - 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0x00000505, 0xfffffafb, 0xfffffafb, 0xfffffafb, - 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, 0xfffffafb, - 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, - 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, - 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0x0f0f0505, 0x0f0f0505, - 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, 0x0f0f0505, - 0x0f0f0505, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, - 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0xf0f0fafb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, - 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0xf9f9f3f4, 0x0c0bf3f4, 0xf3f40c0c, 0x1211f9fa, - 0xedee0606, 0xf9fa1212, 0x0605edee, 0x18180c0c, 0xe7e7f3f4, 0x0c0c1818, 0xf3f3e7e8, 0x18181818, - 0xe7e7e7e8, 0x1e1e0000, 0xe1e20000, 0x00001e1e, 0xffffe1e2, 0x1817edee, 0xe7e81212, 0xedee1818, - 0x1211e7e8, 0x30301e1e, 0xcfcfe1e2, 0x1e1e3030, 0xe1e1cfd0, 0x2423f9fa, 0xdbdc0606, 0xf9fa2424, - 0x0605dbdc, 0x30300c0c, 0xcfcff3f4, 0x0c0c3030, 0xf3f3cfd0, 0x30303030, 0xcfcfcfd0, 0x36360000, - 0xc9ca0000, 0x00003636, 0xffffc9ca, 0x2423dbdc, 0xdbdc2424, 0x302fe7e8, 0xcfd01818, 0xe7e83030, - 0x1817cfd0, 0x4e4e1e1e, 0xb1b1e1e2, 0x1e1e4e4e, 0xe1e1b1b2, 0x54543636, 0xababc9ca, 0x36365454, - 0xc9c9abac, 0x4241edee, 0xbdbe1212, 0xedee4242, 0x1211bdbe, 0x54540c0c, 0xababf3f4, 0x0c0c5454, - 0xf3f3abac, 0x5a5a5a5a, 0xa5a5a5a6, 0x605ff9fa, 0x9fa00606, 0xf9fa6060, 0x06059fa0, 0x4241c9ca, - 0xbdbe3636, 0xc9ca4242, 0x3635bdbe, 0x5a59d5d6, 0xa5a62a2a, 0xd5d65a5a, 0x2a29a5a6, 0x7e7de1e2, - 0x81821e1e, 0xe1e27e7e, 0x1e1d8182, 0x6665999a, 0x999a6666, 0x7e7dabac, 0x81825454, 0xabac7e7e, - 0x54538182, 0x24242424, 0xdbdbdbdc, 0x42424242, 0xbdbdbdbe, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, - 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, - 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, - 0xf9fa0000, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, - 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, - 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, - 0xfffff9fa, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, - 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0x0c0c0606, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, - 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, 0xf3f3f9fa, - 0xf3f3f9fa, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, - 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x06060c0c, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, - 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0xf8f8eaeb, 0x0e0df1f2, 0xf1f20e0e, 0x1514f8f9, - 0xeaeb0707, 0xf8f91515, 0x0706eaeb, 0x1c1c0e0e, 0xe3e3f1f2, 0x0e0e1c1c, 0xf1f1e3e4, 0x1c1c1c1c, - 0xe3e3e3e4, 0x23230000, 0xdcdd0000, 0x00002323, 0xffffdcdd, 0x1c1beaeb, 0xe3e41515, 0xeaeb1c1c, - 0x1514e3e4, 0x38382323, 0xc7c7dcdd, 0x23233838, 0xdcdcc7c8, 0x2a29f1f2, 0xd5d60e0e, 0xf1f22a2a, - 0x0e0dd5d6, 0x38380e0e, 0xc7c7f1f2, 0x0e0e3838, 0xf1f1c7c8, 0x38383838, 0xc7c7c7c8, 0x3f3f0000, - 0xc0c10000, 0x00003f3f, 0xffffc0c1, 0x2a29d5d6, 0xd5d62a2a, 0x3837e3e4, 0xc7c81c1c, 0xe3e43838, - 0x1c1bc7c8, 0x5b5b2323, 0xa4a4dcdd, 0x23235b5b, 0xdcdca4a5, 0x62623f3f, 0x9d9dc0c1, 0x3f3f6262, - 0xc0c09d9e, 0x4d4ceaeb, 0xb2b31515, 0xeaeb4d4d, 0x1514b2b3, 0x62620e0e, 0x9d9df1f2, 0x0e0e6262, - 0xf1f19d9e, 0x69696969, 0x96969697, 0x7776f8f9, 0x88890707, 0xf8f97777, 0x07068889, 0x4d4cc0c1, - 0xb2b33f3f, 0xc0c14d4d, 0x3f3eb2b3, 0x6968cecf, 0x96973131, 0xcecf6969, 0x31309697, 0x77768889, - 0x88897777, 0x2a2a2a2a, 0xd5d5d5d6, 0x4d4d4d4d, 0xb2b2b2b3, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, - 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0x07070707, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, - 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, 0xf8f8f8f9, - 0xf8f8f8f9, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, - 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0xf8f90000, 0xf8f90000, 0xf8f90000, - 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, - 0xf8f90000, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, - 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0x00000707, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, - 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, 0xfffff8f9, - 0xfffff8f9, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, - 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0x0e0e0e0e, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, - 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, 0xf1f1f1f2, - 0xf1f1f1f2, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, - 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0x15150707, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, - 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, 0xeaeaf8f9, - 0xeaeaf8f9, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, - 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x07071515, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, - 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0xf7f7eff0, 0x100feff0, 0xeff01010, 0x1817f7f8, - 0xe7e80808, 0xf7f81818, 0x0807e7e8, 0x20201010, 0xdfdfeff0, 0x10102020, 0xefefdfe0, 0x20202020, - 0xdfdfdfe0, 0x28280000, 0xd7d80000, 0x00002828, 0xffffd7d8, 0x201fe7e8, 0xdfe01818, 0xe7e82020, - 0x1817dfe0, 0x40402828, 0xbfbfd7d8, 0x28284040, 0xd7d7bfc0, 0x302feff0, 0xcfd01010, 0xeff03030, - 0x100fcfd0, 0x40401010, 0xbfbfeff0, 0x10104040, 0xefefbfc0, 0x40404040, 0xbfbfbfc0, 0x48480000, - 0xb7b80000, 0x00004848, 0xffffb7b8, 0x302fcfd0, 0xcfd03030, 0x403fdfe0, 0xbfc02020, 0xdfe04040, - 0x201fbfc0, 0x68682828, 0x9797d7d8, 0x28286868, 0xd7d79798, 0x70704848, 0x8f8fb7b8, 0x48487070, - 0xb7b78f90, 0x5857e7e8, 0xa7a81818, 0xe7e85858, 0x1817a7a8, 0x70701010, 0x8f8feff0, 0x10107070, - 0xefef8f90, 0x78787878, 0x87878788, 0x5857b7b8, 0xa7a84848, 0xb7b85858, 0x4847a7a8, 0x7877c7c8, - 0x87883838, 0xc7c87878, 0x38378788, 0x30303030, 0xcfcfcfd0, 0x58585858, 0xa7a7a7a8, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, - 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0x08080808, 0xf7f7f7f8, - 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, - 0xf7f7f7f8, 0xf7f7f7f8, 0xf7f7f7f8, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, - 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0x08080000, 0xf7f80000, - 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, 0xf7f80000, - 0xf7f80000, 0xf7f80000, 0xf7f80000, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, - 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0xfffff7f8, - 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, - 0xfffff7f8, 0xfffff7f8, 0xfffff7f8, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, - 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0x10101010, 0xefefeff0, - 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, 0xefefeff0, - 0xefefeff0, 0xefefeff0, 0xefefeff0, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, - 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0x10100808, 0xefeff7f8, - 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, - 0xefeff7f8, 0xefeff7f8, 0xefeff7f8, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, - 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x08081010, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, - 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x1211edee, 0xedee1212, 0x1b1af6f7, - 0xe4e50909, 0xf6f71b1b, 0x0908e4e5, 0x24241212, 0xdbdbedee, 0x12122424, 0xededdbdc, 0x24242424, - 0xdbdbdbdc, 0x2d2d0000, 0xd2d30000, 0x00002d2d, 0xffffd2d3, 0x2423e4e5, 0xdbdc1b1b, 0xe4e52424, - 0x1b1adbdc, 0x48482d2d, 0xb7b7d2d3, 0x2d2d4848, 0xd2d2b7b8, 0x3635edee, 0xc9ca1212, 0xedee3636, - 0x1211c9ca, 0x48481212, 0xb7b7edee, 0x12124848, 0xededb7b8, 0x48484848, 0xb7b7b7b8, 0x51510000, - 0xaeaf0000, 0x00005151, 0xffffaeaf, 0x3635c9ca, 0xc9ca3636, 0x4847dbdc, 0xb7b82424, 0xdbdc4848, - 0x2423b7b8, 0x75752d2d, 0x8a8ad2d3, 0x2d2d7575, 0xd2d28a8b, 0x7e7e5151, 0x8181aeaf, 0x51517e7e, - 0xaeae8182, 0x6362e4e5, 0x9c9d1b1b, 0xe4e56363, 0x1b1a9c9d, 0x6362aeaf, 0x9c9d5151, 0xaeaf6363, - 0x51509c9d, 0x36363636, 0xc9c9c9ca, 0x6c6c6c6c, 0x93939394, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, - 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0x09090909, 0xf6f6f6f7, - 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, - 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0xf6f6f6f7, 0x09090000, 0x09090000, 0x09090000, 0x09090000, - 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, 0x09090000, - 0x09090000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, - 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0xf6f70000, 0x00000909, 0x00000909, - 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, 0x00000909, - 0x00000909, 0x00000909, 0x00000909, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, - 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, 0xfffff6f7, - 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, - 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0xedededee, 0xedededee, 0xedededee, - 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, 0xedededee, - 0xedededee, 0xedededee, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, - 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0x1b1b0909, 0xe4e4f6f7, - 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, - 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0xe4e4f6f7, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, - 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, 0x09091b1b, - 0x09091b1b, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, - 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0xf6f6e4e5, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, - 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0504fafb, 0xfafb0505, 0xfafb0505, - 0x0504fafb, 0x0b0b0606, 0xf4f4f9fa, 0x06060b0b, 0xf9f9f4f5, 0x08080000, 0xf7f80000, 0x00000808, - 0xfffff7f8, 0x0b0b0b0b, 0xf4f4f4f5, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x11110c0c, - 0xeeeef3f4, 0x0c0c1111, 0xf3f3eeef, 0x11111111, 0xeeeeeeef, 0x12120606, 0xededf9fa, 0x06061212, - 0xf9f9edee, 0x0b0af7f8, 0xf4f50808, 0xf7f80b0b, 0x0807f4f5, 0x0f0f0000, 0xf0f10000, 0x00000f0f, - 0xfffff0f1, 0x14140000, 0xebec0000, 0x00001414, 0xffffebec, 0x19191212, 0xe6e6edee, 0x12121919, - 0xedede6e7, 0x19190b0b, 0xe6e6f4f5, 0x0b0b1919, 0xf4f4e6e7, 0x19191919, 0xe6e6e6e7, 0x0e0df1f2, - 0xf1f20e0e, 0xf1f20e0e, 0x0e0df1f2, 0x1a1a0000, 0xe5e60000, 0x00001a1a, 0xffffe5e6, 0x1211f4f5, - 0xedee0b0b, 0xf4f51212, 0x0b0aedee, 0x1615f8f9, 0xe9ea0707, 0xf8f91616, 0x0706e9ea, 0x22221a1a, - 0xdddde5e6, 0x1a1a2222, 0xe5e5ddde, 0x22221212, 0xddddedee, 0x12122222, 0xededddde, 0x22222222, - 0xddddddde, 0x23230b0b, 0xdcdcf4f5, 0x0b0b2323, 0xf4f4dcdd, 0x1d1d0000, 0xe2e30000, 0x00001d1d, - 0xffffe2e3, 0x1615eced, 0xe9ea1313, 0xeced1616, 0x1312e9ea, 0x1a19f0f1, 0xe5e60f0f, 0xf0f11a1a, - 0x0f0ee5e6, 0x25250000, 0xdadb0000, 0x00002525, 0xffffdadb, 0x2c2c1b1b, 0xd3d3e4e5, 0x1b1b2c2c, - 0xe4e4d3d4, 0x2c2c2424, 0xd3d3dbdc, 0x24242c2c, 0xdbdbd3d4, 0x2c2c1212, 0xd3d3edee, 0x12122c2c, - 0xededd3d4, 0x2120f5f6, 0xdedf0a0a, 0xf5f62121, 0x0a09dedf, 0x2d2d2d2d, 0xd2d2d2d3, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, - 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, - 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, - 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, - 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, - 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, - 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, - 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, - 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x03030000, 0xfcfd0000, - 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, 0xf8f90000, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x07070000, - 0xf8f90000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0403fbfc, 0xfbfc0404, 0xf9fa0a0a, - 0x0605f5f6, 0xf3f40000, 0x0c0c0000, 0xf3f3f9fa, 0xf3f40606, 0x0c0bf9fa, 0x0c0c0606, 0xfffff1f2, - 0x00000e0e, 0x0c0c0c0c, 0xf3f3f3f4, 0xedee0000, 0x12120000, 0xf3f40e0e, 0x0c0bf1f2, 0xf9f9edee, - 0xf9fa1212, 0x0605edee, 0x06061212, 0xededf5f6, 0xedee0a0a, 0x1211f5f6, 0x12120a0a, 0xffffe9ea, - 0x00001616, 0xe7e80000, 0x18180000, 0xf3f3e9ea, 0xf3f41616, 0x0c0be9ea, 0x0c0c1616, 0xe7e7f7f8, - 0xe7e80808, 0x1817f7f8, 0x18180808, 0xf9f9e5e6, 0xf9fa1a1a, 0x0605e5e6, 0x06061a1a, 0xffffe3e4, - 0x00001c1c, 0x14141414, 0xebebebec, 0xe5e5f1f2, 0x1a1a0e0e, 0xf3f3e1e2, 0x0c0c1e1e, 0xdfdff5f6, - 0x20200a0a, 0xdfdfedee, 0x20201212, 0xe5e5e5e6, 0x1a1a1a1a, 0xebebddde, 0x14142222, 0xf3f3d9da, - 0x0c0c2626, 0xdfdfdfe0, 0x20202020, 0x20202020, 0xd7d7e9ea, 0xddddddde, 0x22222222, 0x00000000, - 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, - 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, - 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, - 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, - 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, - 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, - 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, - 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, - 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, - 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, - 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, - 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, - 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x0605f9fa, 0xf9fa0606, 0xf7f80e0e, - 0x0807f1f2, 0xffffedee, 0x00001212, 0xeff00a0a, 0x100ff5f6, 0xe7e80000, 0x18180000, 0xf7f7e7e8, - 0xf7f81818, 0x0807e7e8, 0x08081818, 0x12121212, 0xedededee, 0xeff01414, 0x100febec, 0xe5e5f1f2, - 0xe5e60e0e, 0x1a19f1f2, 0x1a1a0e0e, 0xffffe1e2, 0x00001e1e, 0xddde0000, 0x22220000, 0xf7f7ddde, - 0xf7f82222, 0x0807ddde, 0x08082222, 0xedede1e2, 0xedee1e1e, 0x1211e1e2, 0x12121e1e, 0xddddf5f6, - 0xddde0a0a, 0x2221f5f6, 0x22220a0a, 0xddddebec, 0x22221414, 0xffffd7d8, 0x00002828, 0x1e1e1e1e, - 0xe1e1e1e2, 0xededd7d8, 0x12122828, 0xd3d40000, 0x2c2c0000, 0xd3d3eff0, 0x2c2c1010, 0xdbdbdbdc, - 0xdbdbdbdc, 0x24242424, 0xd3d3e5e6, 0x2c2c1a1a, 0xe5e5d1d2, 0x1a1a2e2e, 0xededcbcc, 0x12123434, - 0xc9c9ebec, 0xd3d3d3d4, 0x2c2c2c2c, 0xc9c9dfe0, 0xd1d1d1d2, 0xd1d1d1d2, 0x2e2e2e2e, 0x00000000, - 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, - 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, - 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, - 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, - 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, - 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, - 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, - 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, - 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, - 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, - 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, - 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, - 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, - 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, - 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, - 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, - 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, - 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, - 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, - 0xf5f60000, 0x00000a0a, 0xfffff5f6, 0x00000000, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, - 0x04040404, 0xfbfbfbfc, 0x0a0a0a0a, 0xf5f5f5f6, 0x0a0a0000, 0xf5f60000, 0x00000a0a, 0xfffff5f6, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, - 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x0807f7f8, 0xf7f80808, 0xeff00808, - 0x100ff7f8, 0xe7e80000, 0x18180000, 0xf7f7e7e8, 0xf7f81818, 0x0807e7e8, 0x08081818, 0xeff01414, - 0x100febec, 0xffffe3e4, 0x00001c1c, 0xe7e7eff0, 0xe7e81010, 0x1817eff0, 0x18181010, 0xdfe00000, - 0x20200000, 0xefefe3e4, 0xeff01c1c, 0x100fe3e4, 0x10101c1c, 0xdfdff7f8, 0xdfe00808, 0xf7f7dfe0, - 0xf7f82020, 0x0807dfe0, 0x08082020, 0x201ff7f8, 0x20200808, 0x18181818, 0xe7e7e7e8, 0xe7e81818, - 0x1817e7e8, 0xdfdfebec, 0x20201414, 0xffffd7d8, 0x00002828, 0xefefd7d8, 0x10102828, 0xd3d40000, - 0xd3d40000, 0xffffd3d4, 0x00002c2c, 0x2c2c0000, 0x2c2c0000, 0xdfdfdfe0, 0x20202020, 0xd3d3eff0, - 0x2c2c1010, 0xd3d3e7e8, 0xe7e7d3d4, 0x18182c2c, 0x2c2c1818, 0xefefcfd0, 0x10103030, 0xdbdbdbdc, - 0xdbdbdbdc, 0x24242424, 0x24242424, 0xcbcbebec, 0x28282828, 0xd7d7d7d8, 0xcbcbdfe0, 0x00000000, - 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, - 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, - 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, - 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, - 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, - 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, - 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, - 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, - 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, - 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, - 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, - 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, - 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, - 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, - 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, - 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, - 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, - 0xf3f40000, 0x00000c0c, 0xfffff3f4, 0x00000000, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, - 0x04040404, 0xfbfbfbfc, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0000, 0xf3f40000, 0x00000c0c, 0xfffff3f4, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, - 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, - 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, - 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, - 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, - 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, - 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, - 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, - 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, - 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, - 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, - 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, - 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, - 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, - 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x06060606, 0xf9f9f9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x14141414, 0xebebebec, 0x20202020, 0xdfdfdfe0, 0x2e2e2e2e, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 -}; - - -const uint32 Indeo3::correctionhighorder[] = { - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, - 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, - 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x0302feff, 0xfcfd0101, 0xfeff0303, 0x0100fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, - 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, - 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, - 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, - 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, - 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x0403feff, - 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, 0xfcfcfcfd, - 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, 0x03030303, - 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, 0x00000000, - 0x03030303, 0xfcfcfcfd, 0x0403feff, 0xfbfc0101, 0xfeff0404, 0x0100fbfc, 0x07070707, 0xf8f8f8f9, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, - 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, - 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, - 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, - 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, - 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, - 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, 0x03030a0a, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x0504feff, 0xfafb0101, 0xfeff0505, 0x0100fafb, 0x0a0a0303, 0xf5f5fcfd, - 0x03030a0a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, - 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, - 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, - 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, - 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, - 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, - 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, - 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, - 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, - 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, - 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, - 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, - 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x05050505, - 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, - 0xf2f2fcfd, 0x00000000, 0x05050505, 0xfafafafb, 0x0706fdfe, 0xf8f90202, 0xfdfe0707, 0x0201f8f9, - 0x0b0b0b0b, 0xf4f4f4f5, 0x0d0d0303, 0xf2f2fcfd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, - 0x04040f0f, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x0807fdfe, 0xf7f80202, 0xfdfe0808, 0x0201f7f8, - 0x0d0d0d0d, 0xf2f2f2f3, 0x0f0f0404, 0xf0f0fbfc, 0x04040f0f, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, - 0x05051212, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x0a09fcfd, 0xf5f60303, 0xfcfd0a0a, 0x0302f5f6, - 0x10101010, 0xefefeff0, 0x12120505, 0xededfafb, 0x05051212, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, - 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x0b0afcfd, 0xf4f50303, - 0xfcfd0b0b, 0x0302f4f5, 0x12121212, 0xedededee, 0x14140505, 0xebebfafb, 0x05051414, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x09090909, 0xf6f6f6f7, - 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, - 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, - 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, - 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, - 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, - 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, - 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, - 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, - 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, - 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, - 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, - 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, - 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, - 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, - 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, - 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, - 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, - 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, - 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, - 0xf9f9e8e9, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x0c0bfcfd, 0xf3f40303, 0xfcfd0c0c, 0x0302f3f4, - 0x14141414, 0xebebebec, 0x17170606, 0xe8e8f9fa, 0x06061717, 0xf9f9e8e9, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, - 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, - 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, - 0x00000000, 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, - 0x02020202, 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, - 0xfdfdfdfe, 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x02020202, 0xfdfdfdfe, - 0x02020000, 0xfdfe0000, 0x00000202, 0xfffffdfe, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, - 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, - 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, - 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, - 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, - 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, 0x03030000, - 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, 0xfcfcfcfd, - 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, 0x03030303, - 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, 0x00000000, - 0x03030303, 0xfcfcfcfd, 0x03030000, 0xfcfd0000, 0x00000303, 0xfffffcfd, 0x06060606, 0xf9f9f9fa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, - 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, - 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, - 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, - 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, - 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, - 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, 0x04040404, 0xfbfbfbfc, - 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, 0x04040808, 0x00000000, - 0x04040404, 0xfbfbfbfc, 0x04040000, 0xfbfc0000, 0x00000404, 0xfffffbfc, 0x08080404, 0xf7f7fbfc, - 0x04040808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, - 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, - 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, - 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, - 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, - 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, - 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, - 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, - 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, - 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, - 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, - 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, - 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x05050505, - 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, - 0xf0f0fafb, 0x00000000, 0x05050505, 0xfafafafb, 0x05050000, 0xfafb0000, 0x00000505, 0xfffffafb, - 0x0a0a0a0a, 0xf5f5f5f6, 0x0f0f0505, 0xf0f0fafb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, - 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, - 0x06060c0c, 0x00000000, 0x06060606, 0xf9f9f9fa, 0x06060000, 0xf9fa0000, 0x00000606, 0xfffff9fa, - 0x0c0c0c0c, 0xf3f3f3f4, 0x0c0c0606, 0xf3f3f9fa, 0x06060c0c, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, - 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, - 0x07071515, 0x00000000, 0x07070707, 0xf8f8f8f9, 0x07070000, 0xf8f90000, 0x00000707, 0xfffff8f9, - 0x0e0e0e0e, 0xf1f1f1f2, 0x15150707, 0xeaeaf8f9, 0x07071515, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, - 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, 0x08080808, 0xf7f7f7f8, 0x08080000, 0xf7f80000, - 0x00000808, 0xfffff7f8, 0x10101010, 0xefefeff0, 0x10100808, 0xefeff7f8, 0x08081010, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, 0x09090909, 0xf6f6f6f7, - 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, - 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, - 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, - 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, - 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, - 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, - 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, - 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, - 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, - 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, - 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, - 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, - 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, - 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, - 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, - 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, - 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, - 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, - 0xf6f70000, 0x00000909, 0xfffff6f7, 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, - 0xf6f6e4e5, 0x00000000, 0x09090909, 0xf6f6f6f7, 0x09090000, 0xf6f70000, 0x00000909, 0xfffff6f7, - 0x12121212, 0xedededee, 0x1b1b0909, 0xe4e4f6f7, 0x09091b1b, 0xf6f6e4e5, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0x03030000, - 0x03030000, 0x03030000, 0x03030000, 0x03030000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, - 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0xfcfd0000, 0x00000303, - 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, 0x00000303, - 0x00000303, 0x00000303, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, - 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0xfffffcfd, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, - 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0x07070000, 0xf8f90000, 0xf8f90000, - 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, 0xf8f90000, - 0xf8f90000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, - 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, - 0x02020000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, - 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, - 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, - 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, - 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0x06060000, 0x06060000, 0x06060000, 0x06060000, - 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, 0x06060000, - 0x06060000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, - 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0xf9fa0000, 0x00000606, 0x00000606, - 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, 0x00000606, - 0x00000606, 0x00000606, 0x00000606, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, - 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, 0xfffff9fa, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, - 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, 0x02020000, - 0x02020000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, - 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0xfdfe0000, 0x00000202, 0x00000202, - 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, 0x00000202, - 0x00000202, 0x00000202, 0x00000202, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, - 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, 0xfffffdfe, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, - 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0x0a0a0a0a, 0xf5f5f5f6, - 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, - 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0xf5f5f5f6, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, - 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, 0x0a0a0000, - 0x0a0a0000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, - 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0xf5f60000, 0x00000a0a, 0x00000a0a, - 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, 0x00000a0a, - 0x00000a0a, 0x00000a0a, 0x00000a0a, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, - 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, 0xfffff5f6, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, - 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, 0x04040000, - 0x04040000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, - 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0xfbfc0000, 0x00000404, 0x00000404, - 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, 0x00000404, - 0x00000404, 0x00000404, 0x00000404, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, - 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, 0xfffffbfc, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, - 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0x04040404, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, 0xfbfbfbfc, - 0xfbfbfbfc, 0xfbfbfbfc, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, - 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, 0x0c0c0000, - 0x0c0c0000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, - 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0xf3f40000, 0x00000c0c, 0x00000c0c, - 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, 0x00000c0c, - 0x00000c0c, 0x00000c0c, 0x00000c0c, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, - 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, 0xfffff3f4, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, - 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, - 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, - 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, - 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, 0x02020202, - 0x02020202, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, - 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0xfdfdfdfe, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, 0x06060606, - 0x06060606, 0x06060606, 0x06060606, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, 0xf9f9f9fa, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, - 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0x0c0c0c0c, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, 0xf3f3f3f4, - 0xf3f3f3f4, 0xf3f3f3f4, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, - 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0x14141414, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, - 0xebebebec, 0xebebebec, 0xebebebec, 0xebebebec, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, 0x20202020, - 0x20202020, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, - 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0xdfdfdfe0, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, - 0x2e2e2e2e, 0x2e2e2e2e, 0x2e2e2e2e, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, 0xd1d1d1d2, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 -}; - -} // End of namespace Graphics - -#endif // USE_INDEO3 diff --git a/graphics/video/coktelvideo/indeo3.h b/graphics/video/coktelvideo/indeo3.h deleted file mode 100644 index af6ef26449..0000000000 --- a/graphics/video/coktelvideo/indeo3.h +++ /dev/null @@ -1,126 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/scummsys.h" - -#ifdef USE_INDEO3 - -/* Intel Indeo 3 decompressor, derived from ffmpeg. - * - * Original copyright note: - * Intel Indeo 3 (IV31, IV32, etc.) video decoder for ffmpeg - * written, produced, and directed by Alan Smithee - */ - -#ifndef GRAPHICS_VIDEO_INDEO3_H -#define GRAPHICS_VIDEO_INDEO3_H - -#include "common/stream.h" - -namespace Graphics { - class PaletteLUT; - class SierraLight; -} - -namespace Graphics { - -class Indeo3 { -public: - enum DitherAlgorithm { - kDitherNone = 0, - kDitherSierraLight - }; - - Indeo3(int16 width, int16 height, Graphics::PaletteLUT *palLUT); - ~Indeo3(); - - static bool isIndeo3(byte *data, uint32 dataLen); - - void setDither(DitherAlgorithm dither); - - bool decompressFrame(byte *inData, uint32 dataLen, - byte *outData, uint16 width, uint16 height); - -private: - static const int _corrector_type_0[24]; - static const int _corrector_type_2[8]; - static const uint32 correction[]; - static const uint32 correctionloworder[]; - static const uint32 correctionhighorder[]; - - struct YUVBufs { - byte *Ybuf; - byte *Ubuf; - byte *Vbuf; - byte *the_buf; - uint32 the_buf_size; - uint16 y_w, y_h; - uint16 uv_w, uv_h; - }; - - int16 _width; - int16 _height; - YUVBufs _iv_frame[2]; - YUVBufs *_cur_frame; - YUVBufs *_ref_frame; - - byte *_ModPred; - uint16 *_corrector_type; - - Graphics::PaletteLUT *_palLUT; - - DitherAlgorithm _dither; - Graphics::SierraLight *_ditherSL; - - struct BlitState { - uint32 curX, curY; - uint16 widthY, widthUV; - uint16 heightY, heightUV; - uint16 uwidthUV, uwidthOut; - uint16 uheightUV, uheightOut; - uint16 scaleWYUV, scaleWYOut; - uint16 scaleHYUV, scaleHYOut; - uint16 lineWidthOut, lineHeightOut; - byte *bufY, *bufU, *bufV, *bufOut; - }; - - void buildModPred(); - void allocFrames(); - - void decodeChunk(byte *cur, byte *ref, int width, int height, - const byte *buf1, uint32 fflags2, const byte *hdr, - const byte *buf2, int min_width_160); - - void blitFrame(BlitState &s); - - void blitLine(BlitState &s); - void blitLineDither(BlitState &s); -}; - -} // End of namespace Graphics - -#endif // GRAPHICS_VIDEO_INDEO3_H - -#endif // USE_INDEO3 -- cgit v1.2.3 From a802e1e64f56b5c6b0534a481e84418078b2699f Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Aug 2010 00:33:59 +0000 Subject: VIDEO: Stub a VideoDecoder-like CoktelDecoder This creates a new CoktelDecoder class using the VideoDecoder interface, which will eventually become the new way to decode PreIMD, IMD and VMD videos. Since the VideoPlayer in gob is not yet ready for this, we're disabling all video playback in the gob engine for now. svn-id: r51850 --- engines/gob/demos/demoplayer.cpp | 10 +- engines/gob/inter_v6.cpp | 2 +- engines/gob/mult_v2.cpp | 4 +- engines/gob/scenery.cpp | 6 +- engines/gob/videoplayer.cpp | 413 ++++++++++++++++---------------------- engines/gob/videoplayer.h | 60 ++---- graphics/module.mk | 1 + graphics/video/coktel_decoder.cpp | 105 ++++++++++ graphics/video/coktel_decoder.h | 119 +++++++++++ 9 files changed, 429 insertions(+), 291 deletions(-) create mode 100644 graphics/video/coktel_decoder.cpp create mode 100644 graphics/video/coktel_decoder.h diff --git a/engines/gob/demos/demoplayer.cpp b/engines/gob/demos/demoplayer.cpp index 38e20a46ee..d6c3ac73a5 100644 --- a/engines/gob/demos/demoplayer.cpp +++ b/engines/gob/demos/demoplayer.cpp @@ -155,8 +155,8 @@ void DemoPlayer::playVideo(const char *fileName) { int16 x = _rebase0 ? 0 : -1; int16 y = _rebase0 ? 0 : -1; if (_vm->_vidPlayer->primaryOpen(file, x, y)) { - bool videoSupportsDouble = - ((_vm->_vidPlayer->getFeatures() & Graphics::CoktelVideo::kFeaturesSupportsDouble) != 0); + bool videoSupportsDouble = false; + //((_vm->_vidPlayer->getFeatures() & Graphics::CoktelDecoder::kFeaturesSupportsDouble) != 0); if (_autoDouble) { int16 defX = _rebase0 ? 0 : _vm->_vidPlayer->getDefaultX(); @@ -215,7 +215,7 @@ void DemoPlayer::playVideoNormal() { } void DemoPlayer::playVideoDoubled() { - Common::String fileNameOpened = _vm->_vidPlayer->getFileName(); + Common::String fileNameOpened = _vm->_vidPlayer->getPrimaryFileName(); _vm->_vidPlayer->primaryClose(); int16 x = _rebase0 ? 0 : -1; @@ -223,10 +223,10 @@ void DemoPlayer::playVideoDoubled() { if (_vm->_vidPlayer->primaryOpen(fileNameOpened.c_str(), x, y, VideoPlayer::kFlagScreenSurface)) { - for (int i = 0; i < _vm->_vidPlayer->getFramesCount(); i++) { + for (int i = 0; i < _vm->_vidPlayer->getFrameCount(); i++) { _vm->_vidPlayer->playFrame(i); - Graphics::CoktelVideo::State state = _vm->_vidPlayer->getState(); + Graphics::CoktelDecoder::State state;// = _vm->_vidPlayer->getState(); int16 w = state.right - state.left + 1; int16 h = state.bottom - state.top + 1; diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp index cbc831b5a1..9c03ea0b95 100644 --- a/engines/gob/inter_v6.cpp +++ b/engines/gob/inter_v6.cpp @@ -231,7 +231,7 @@ bool Inter_v6::o6_loadCursor(OpFuncParams ¶ms) { return false; } - int16 framesCount = _vm->_vidPlayer->getFramesCount(vmdSlot); + int16 framesCount = _vm->_vidPlayer->getFrameCount(vmdSlot); for (int i = 0; i < framesCount; i++) { _vm->_vidPlayer->slotPlay(vmdSlot); diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp index 6acd096e58..6dcc01f836 100644 --- a/engines/gob/mult_v2.cpp +++ b/engines/gob/mult_v2.cpp @@ -737,7 +737,7 @@ void Mult_v2::newCycleAnim(Mult_Object &animObj) { if (animData.animation < 0) { if ((animObj.videoSlot > 0) && (_vm->_vidPlayer->getCurrentFrame(animObj.videoSlot - 1) < - _vm->_vidPlayer->getFramesCount(animObj.videoSlot - 1))) { + _vm->_vidPlayer->getFrameCount(animObj.videoSlot - 1))) { animData.newCycle = 0; return; } @@ -1139,7 +1139,7 @@ void Mult_v2::playImd(const char *imdFile, Mult::Mult_ImdKey &key, int16 dir, palFrame = 0; if (lastFrame == -1) - lastFrame = _vm->_vidPlayer->getFramesCount() - 1; + lastFrame = _vm->_vidPlayer->getFrameCount() - 1; baseFrame = startFrame % (lastFrame - palFrame + 1); _vm->_vidPlayer->primaryPlay(baseFrame + palFrame, baseFrame + palFrame, 0, diff --git a/engines/gob/scenery.cpp b/engines/gob/scenery.cpp index a6d6c06544..6b5982ec3e 100644 --- a/engines/gob/scenery.cpp +++ b/engines/gob/scenery.cpp @@ -616,8 +616,8 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags, return; } - if (frame >= _vm->_vidPlayer->getFramesCount(obj.videoSlot - 1)) - frame = _vm->_vidPlayer->getFramesCount(obj.videoSlot - 1) - 1; + if (frame >= _vm->_vidPlayer->getFrameCount(obj.videoSlot - 1)) + frame = _vm->_vidPlayer->getFrameCount(obj.videoSlot - 1) - 1; // Seek to frame if (_vm->_vidPlayer->getCurrentFrame(obj.videoSlot - 1) < 256) { @@ -632,10 +632,12 @@ void Scenery::updateAnim(int16 layer, int16 frame, int16 animation, int16 flags, _vm->_vidPlayer->slotPlay(obj.videoSlot - 1); } + /* // Subtitle Graphics::CoktelVideo::State state = _vm->_vidPlayer->getState(obj.videoSlot - 1); if (state.flags & Graphics::CoktelVideo::kStateSpeech) _vm->_draw->printTotText(state.speechId); + */ destX = 0; destY = 0; diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index 51bc1b88a5..d6de1cb652 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -40,130 +40,17 @@ namespace Gob { const char *VideoPlayer::_extensions[] = { "IMD", "IMD", "VMD", "RMD", "SMD" }; -VideoPlayer::Video::Video(GobEngine *vm) : _vm(vm), _stream(0), _video(0) { -} - -VideoPlayer::Video::~Video() { - close(); -} - -bool VideoPlayer::Video::open(const char *fileName, Type which, int16 width, int16 height) { - close(); - - int16 handle = _vm->_dataIO->openData(fileName); - - if (handle < 0) { - warning("Couldn't open video \"%s\": No such file", fileName); - return false; - } - - _stream = _vm->_dataIO->openAsStream(handle, true); - - if (which == kVideoTypeIMD) { - _video = new Graphics::Imd(); - } else if (which == kVideoTypePreIMD) { - _video = new Graphics::PreImd(width, height); - } else if (which == kVideoTypeVMD) { - _video = new Graphics::Vmd(_vm->_video->_palLUT); - } else if (which == kVideoTypeRMD) { - _video = new Graphics::Vmd(_vm->_video->_palLUT); - } else { - warning("Couldn't open video \"%s\": Invalid video Type", fileName); - close(); - return false; - } - - if (!_video->load(_stream)) { - warning("While loading video \"%s\"", fileName); - close(); - return false; - } - - _fileName = fileName; - - _defaultX = _video->getX(); - _defaultY = _video->getY(); - - return true; -} - -void VideoPlayer::Video::close() { - delete _video; - delete _stream; - - _video = 0; - _stream = 0; - _fileName.clear(); - memset(&_state, 0, sizeof(Graphics::CoktelVideo::State)); - _defaultX = _defaultY = 0; -} - -bool VideoPlayer::Video::isOpen() const { - return (_video != 0); -} - -const char *VideoPlayer::Video::getFileName() const { - return _fileName.c_str(); -} - -Graphics::CoktelVideo *VideoPlayer::Video::getVideo() { - return _video; -} - -const Graphics::CoktelVideo *VideoPlayer::Video::getVideo() const { - return _video; -} - -uint32 VideoPlayer::Video::getFeatures() const { - return _video->getFeatures(); -} - -Graphics::CoktelVideo::State VideoPlayer::Video::getState() const { - return _state; -} - -int16 VideoPlayer::Video::getDefaultX() const { - return _defaultX; -} - -int16 VideoPlayer::Video::getDefaultY() const { - return _defaultY; -} - -bool VideoPlayer::Video::hasExtraData(const char *fileName) const { - if (!_video) - return false; - - return _video->hasExtraData(fileName); -} - -Common::MemoryReadStream *VideoPlayer::Video::getExtraData(const char *fileName) { - if (!_video) - return 0; - - return _video->getExtraData(fileName); -} - -Graphics::CoktelVideo::State VideoPlayer::Video::nextFrame() { - if (_video) - _state = _video->nextFrame(); - - return _state; -} - +VideoPlayer::VideoPlayer(GobEngine *vm) : _vm(vm), _primaryVideo(0), + _ownSurf(false), _backSurf(false), _needBlit(false), + _noCursorSwitch(false), _woodruffCohCottWorkaround(false) { -VideoPlayer::VideoPlayer(GobEngine *vm) : _vm(vm) { - _primaryVideo = new Video(vm); - _ownSurf = false; - _backSurf = false; - _needBlit = false; - _noCursorSwitch = false; - _woodruffCohCottWorkaround = false; + for (int i = 0; i < kVideoSlotCount; i++) + _videoSlots[i] = 0; } VideoPlayer::~VideoPlayer() { delete _primaryVideo; - for (uint i = 0; i < _videoSlots.size(); i++) + for (int i = 0; i < kVideoSlotCount; i++) delete _videoSlots[i]; } @@ -224,6 +111,39 @@ bool VideoPlayer::findFile(char *fileName, Type &which) { return true; } +Graphics::CoktelDecoder *VideoPlayer::openVideo(const char *fileName, Type which, uint16 width, uint16 height) { + Common::SeekableReadStream *stream = _vm->_dataIO->getDataStream(fileName); + if (!stream) + return 0; + + Graphics::CoktelDecoder *video = 0; + if (which == kVideoTypeIMD) + warning("TODO: IMD"); + //_video = new Graphics::Imd(); + else if (which == kVideoTypePreIMD) + video = new Graphics::PreIMDDecoder(width, height, *_vm->_mixer, Audio::Mixer::kSFXSoundType); + else if (which == kVideoTypeVMD) + warning("TODO: VMD"); + //_video = new Graphics::Vmd(_vm->_video->_palLUT); + else if (which == kVideoTypeRMD) + warning("TODO: RMD"); + //_video = new Graphics::Vmd(_vm->_video->_palLUT); + else + warning("Couldn't open video \"%s\": Invalid video Type", fileName); + + if (!video) { + delete stream; + return 0; + } + + if (!video->load(*stream)) { + delete video; + return 0; + } + + return video; +} + bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y, int32 flags, Type which, int16 width, int16 height) { @@ -234,10 +154,14 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y, if (!findFile(fileName, which)) return false; - if (scumm_strnicmp(_primaryVideo->getFileName(), fileName, strlen(fileName))) { - if (!_primaryVideo->open(fileName, which, width, height)) + if (scumm_strnicmp(_primaryFileName.c_str(), fileName, strlen(fileName))) { + primaryClose(); + + if (!(_primaryVideo = openVideo(fileName, which, (uint16) width, (uint16) height))) return false; + _primaryFileName = fileName; + // WORKAROUND: In some rare cases, the cursor should still be // displayed while a video is playing. _noCursorSwitch = false; @@ -269,8 +193,8 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y, _backSurf = false; surf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, - _primaryVideo->getVideo()->getWidth(), - _primaryVideo->getVideo()->getHeight(), 0); + _primaryVideo->getWidth(), + _primaryVideo->getHeight(), 0); _vm->_draw->_spritesArray[x] = surf; x = 0; @@ -286,23 +210,24 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y, surf = _vm->_draw->_spritesArray[_backSurf ? 21 : 20]; } + /* _primaryVideo->getVideo()->setVideoMemory(surf->getVidMem(), surf->getWidth(), surf->getHeight()); + */ } else - _primaryVideo->getVideo()->setVideoMemory(); + ;//_primaryVideo->getVideo()->setVideoMemory(); _needBlit = ((flags & kFlagUseBackSurfaceContent) != 0) && ((flags & kFlagFrontSurface) != 0); - - _primaryVideo->getVideo()->enableSound(*_vm->_mixer); } - if (!_primaryVideo->isOpen()) + if (!_primaryVideo) return false; - _primaryVideo->getVideo()->setFrameRate(_vm->_util->getFrameRate()); - _primaryVideo->getVideo()->setXY(x, y); - WRITE_VAR(7, _primaryVideo->getVideo()->getFramesCount()); + //_primaryVideo->getVideo()->setFrameRate(_vm->_util->getFrameRate()); + //_primaryVideo->getVideo()->setXY(x, y); + + WRITE_VAR(7, _primaryVideo->getFrameCount()); return true; } @@ -311,16 +236,16 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, uint16 palCmd, int16 palStart, int16 palEnd, int16 palFrame, int16 endFrame, bool fade, int16 reverseTo, bool forceSeek) { - if (!_primaryVideo->isOpen()) + if (!_primaryVideo) return false; - Graphics::CoktelVideo &video = *(_primaryVideo->getVideo()); + Graphics::CoktelDecoder &video = *_primaryVideo; breakKey = 27; if (startFrame < 0) - startFrame = video.getCurrentFrame(); + startFrame = video.getCurFrame(); if (lastFrame < 0) - lastFrame = video.getFramesCount() - 1; + lastFrame = video.getFrameCount() - 1; if (palFrame < 0) palFrame = startFrame; if (endFrame < 0) @@ -328,12 +253,14 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, palCmd &= 0x3F; int16 realStartFrame = startFrame; - if (video.getCurrentFrame() != startFrame) { - if (!forceSeek && (video.getFeatures() & Graphics::CoktelVideo::kFeaturesSound)) - startFrame = video.getCurrentFrame(); + /* + if (video.getCurFrame() != startFrame) { + if (!forceSeek && (video.getFeatures() & Graphics::CoktelDecoder::kFeaturesSound)) + startFrame = video.getCurFrame(); else - video.seekFrame(startFrame); + video.seek(startFrame); } + */ video.seek(startFrame); _vm->_draw->_showCursor = _noCursorSwitch ? 3 : 0; @@ -357,17 +284,17 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, fade = false; } - if (!_noCursorSwitch) - video.waitEndFrame(); + /*if (!_noCursorSwitch) + video.waitEndFrame();*/ startFrame++; } evalBgShading(video); if (reverseTo >= 0) { - int16 toFrame = video.getFramesCount() - reverseTo; - for (int i = video.getCurrentFrame(); i >= toFrame; i--) { - video.seekFrame(i, SEEK_SET, true); + int16 toFrame = video.getFrameCount() - reverseTo; + for (int i = video.getCurFrame(); i >= toFrame; i--) { + video.seek(i, SEEK_SET, true); bool b = doPlay(i, breakKey, 0, 0, 0, 0, 0); evalBgShading(video); @@ -377,8 +304,8 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, memset((char *)_vm->_draw->_vgaPalette, 0, 768); } - if (!_noCursorSwitch) - video.waitEndFrame(); + /*if (!_noCursorSwitch) + video.waitEndFrame();*/ } } @@ -388,11 +315,19 @@ bool VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, } void VideoPlayer::primaryClose() { - _primaryVideo->close(); + delete _primaryVideo; + _primaryVideo = 0; + + _primaryFileName.clear(); } int VideoPlayer::slotOpen(const char *videoFile, Type which, int16 width, int16 height) { - Video *video = new Video(_vm); + int slot = getNextFreeSlot(); + if (slot == -1) + return -1; + + Graphics::CoktelDecoder *&video = _videoSlots[slot]; + char fileName[256]; strncpy0(fileName, videoFile, 250); @@ -402,59 +337,49 @@ int VideoPlayer::slotOpen(const char *videoFile, Type which, int16 width, int16 return -1; } - if (!video->open(fileName, which, width, height)) { - delete video; + if (!(video = openVideo(fileName, which, width, height))) return -1; - } - - video->getVideo()->setVideoMemory(); - video->getVideo()->enableSound(*_vm->_mixer); - int slot = getNextFreeSlot(); + //video->getVideo()->setVideoMemory(); + //video->getVideo()->enableSound(*_vm->_mixer); - _videoSlots[slot] = video; - - WRITE_VAR(7, video->getVideo()->getFramesCount()); + WRITE_VAR(7, video->getFrameCount()); return slot; } int VideoPlayer::getNextFreeSlot() { - uint slot; - - for (slot = 0; slot < _videoSlots.size(); slot++) - if (!_videoSlots[slot]) - break; + for (int i = 0; i < kVideoSlotCount; i++) + if (!_videoSlots[i]) + return i; - if (slot == _videoSlots.size()) - _videoSlots.push_back(0); - - return slot; + warning("VideoPlayer::getNextFreeSlot(): No free video slot"); + return -1; } void VideoPlayer::slotPlay(int slot, int16 frame) { - if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot]) + if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot]) return; - Graphics::CoktelVideo &video = *(_videoSlots[slot]->getVideo()); + Graphics::CoktelDecoder &video = *_videoSlots[slot]; if (frame < 0) - frame = video.getCurrentFrame(); + frame = video.getCurFrame(); - if (frame >= video.getFramesCount()) + if (((uint16) frame) >= video.getFrameCount()) return; - if (video.getCurrentFrame() != frame) - video.seekFrame(frame); + if (video.getCurFrame() != frame) + video.seek(frame); - _videoSlots[slot]->nextFrame(); + //_videoSlots[slot]->nextFrame(); WRITE_VAR(11, frame); evalBgShading(video); } void VideoPlayer::slotClose(int slot) { - if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot]) + if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot]) return; delete _videoSlots[slot]; @@ -465,147 +390,147 @@ void VideoPlayer::slotCopyFrame(int slot, byte *dest, uint16 left, uint16 top, uint16 width, uint16 height, uint16 x, uint16 y, uint16 pitch, int16 transp) { - if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot]) + if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot]) return; - _videoSlots[slot]->getVideo()->copyCurrentFrame(dest, - left, top, width, height, x, y, pitch, transp); + /*_videoSlots[slot]->getVideo()->copyCurrentFrame(dest, + left, top, width, height, x, y, pitch, transp);*/ } void VideoPlayer::slotCopyPalette(int slot, int16 palStart, int16 palEnd) { - if ((slot < 0) || (((uint) slot) >= _videoSlots.size()) || !_videoSlots[slot]) + if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot]) return; - copyPalette(*(_videoSlots[slot]->getVideo()), palStart, palEnd); + //copyPalette(*(_videoSlots[slot]->getVideo()), palStart, palEnd); } void VideoPlayer::slotWaitEndFrame(int slot, bool onlySound) { - Video *video = getVideoBySlot(slot); + Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) { - Graphics::CoktelVideo &cVideo = *video->getVideo(); + /* + Graphics::CoktelDecoder &cVideo = *video->getVideo(); - if (!onlySound || (cVideo.getFeatures() & Graphics::CoktelVideo::kFeaturesSound)) + if (!onlySound || (cVideo.getFeatures() & Graphics::CoktelDecoder::kFeaturesSound)) cVideo.waitEndFrame(); + */ } } bool VideoPlayer::slotIsOpen(int slot) const { - if ((slot >= 0) && (((uint) slot) < _videoSlots.size()) && _videoSlots[slot]) + if ((slot < 0) || (slot >= kVideoSlotCount) || !_videoSlots[slot]) return true; return false; } void VideoPlayer::slotSetDoubleMode(int slot, bool doubleMode) { - Video *video = getVideoBySlot(slot); + /* + Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) video->getVideo()->setDoubleMode(doubleMode); + */ } -const VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) const { +const Graphics::CoktelDecoder *VideoPlayer::getVideoBySlot(int slot) const { if (slot < 0) { - if (_primaryVideo->isOpen()) + if (_primaryVideo) return _primaryVideo; - } else if (((uint) slot) < _videoSlots.size() && _videoSlots[slot]) + } else if ((slot < kVideoSlotCount) && _videoSlots[slot]) return _videoSlots[slot]; return 0; } -VideoPlayer::Video *VideoPlayer::getVideoBySlot(int slot) { +Graphics::CoktelDecoder *VideoPlayer::getVideoBySlot(int slot) { if (slot < 0) { - if (_primaryVideo->isOpen()) + if (_primaryVideo) return _primaryVideo; - } else if (((uint) slot) < _videoSlots.size() && _videoSlots[slot]) + } else if ((slot < kVideoSlotCount) && _videoSlots[slot]) return _videoSlots[slot]; return 0; } -const char *VideoPlayer::getFileName(int slot) const { - const Video *video = getVideoBySlot(slot); - - if (video) - return video->getFileName(); - - return ""; +const Common::String &VideoPlayer::getPrimaryFileName() const { + return _primaryFileName; } uint16 VideoPlayer::getFlags(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getVideo()->getFlags(); + return 0;//return video->getVideo()->getFlags(); return 0; } -int16 VideoPlayer::getFramesCount(int slot) const { - const Video *video = getVideoBySlot(slot); +int16 VideoPlayer::getFrameCount(int slot) const { + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getVideo()->getFramesCount(); + return video->getFrameCount(); return 0; } int16 VideoPlayer::getCurrentFrame(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getVideo()->getCurrentFrame(); + return video->getCurFrame(); return 0; } int16 VideoPlayer::getWidth(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getVideo()->getWidth(); + return video->getWidth(); return 0; } int16 VideoPlayer::getHeight(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getVideo()->getHeight(); + return video->getHeight(); return 0; } int16 VideoPlayer::getDefaultX(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getDefaultX(); + return 0;//return video->getDefaultX(); return 0; } int16 VideoPlayer::getDefaultY(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getDefaultY(); + return 0;//return video->getDefaultY(); return 0; } uint32 VideoPlayer::getFeatures(int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getFeatures(); + return 0;//return video->getFeatures(); return 0; } -Graphics::CoktelVideo::State VideoPlayer::getState(int slot) const { +void VideoPlayer::getState(int slot) const { + /* const Video *video = getVideoBySlot(slot); Graphics::CoktelVideo::State state; @@ -613,22 +538,23 @@ Graphics::CoktelVideo::State VideoPlayer::getState(int slot) const { state = video->getState(); return state; + */ } bool VideoPlayer::hasExtraData(const char *fileName, int slot) const { - const Video *video = getVideoBySlot(slot); + const Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->hasExtraData(fileName); + return false;//return video->hasExtraData(fileName); return false; } Common::MemoryReadStream *VideoPlayer::getExtraData(const char *fileName, int slot) { - Video *video = getVideoBySlot(slot); + Graphics::CoktelDecoder *video = getVideoBySlot(slot); if (video) - return video->getExtraData(fileName); + return 0;//return video->getExtraData(fileName); return 0; } @@ -640,15 +566,14 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey, if (!_primaryVideo) return; - Video &video = *_primaryVideo; - Graphics::CoktelVideo &cVideo = *video.getVideo(); + Graphics::CoktelDecoder &video = *_primaryVideo; - if (cVideo.getCurrentFrame() != frame) - cVideo.seekFrame(frame); + if (video.getCurFrame() != frame) + video.seek(frame); if (palFrame < 0) palFrame = 0; if (endFrame < 0) - endFrame = cVideo.getFramesCount() - 1; + endFrame = video.getFrameCount() - 1; bool modifiedPal = false; @@ -658,7 +583,7 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey, _vm->_draw->_applyPal = true; if (palCmd >= 4) - copyPalette(cVideo, palStart, palEnd); + copyPalette(video, palStart, palEnd); } if (modifiedPal && (palCmd == 8) && !_backSurf) @@ -668,7 +593,7 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey, if (_needBlit) _vm->_draw->forceBlit(); - Graphics::CoktelVideo::State state = video.nextFrame(); + Graphics::CoktelDecoder::State state;// = video.nextFrame(); WRITE_VAR(11, frame); if (_woodruffCohCottWorkaround && (frame == 32)) { @@ -689,14 +614,16 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey, _vm->_video->dirtyRectsAll(); } - if ((state.flags & Graphics::CoktelVideo::kStatePalette) && (palCmd > 1)) { - copyPalette(cVideo, palStart, palEnd); + /* + if ((state.flags & Graphics::CoktelDecoder::kStatePalette) && (palCmd > 1)) { + copyPalette(video, palStart, palEnd); if (!_backSurf) _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); else _vm->_draw->_applyPal = true; } + */ if (modifiedPal && (palCmd == 8) && _backSurf) _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc); @@ -713,9 +640,11 @@ void VideoPlayer::playFrame(int16 frame, int16 breakKey, _vm->_video->retrace(); } + /* // Subtitle - if (state.flags & Graphics::CoktelVideo::kStateSpeech) + if (state.flags & Graphics::CoktelDecoder::kStateSpeech) _vm->_draw->printTotText(state.speechId); + */ if (modifiedPal && ((palCmd == 2) || (palCmd == 4))) _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, -2, 0); @@ -730,7 +659,7 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey, _vm->_util->processInput(); if (_vm->shouldQuit()) { - _primaryVideo->getVideo()->disableSound(); + //_primaryVideo->getVideo()->disableSound(); return true; } @@ -740,9 +669,9 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey, _vm->_inter->storeKey(_vm->_util->checkKey()); if (VAR(0) == (unsigned) breakKey) { - _primaryVideo->getVideo()->disableSound(); + //_primaryVideo->getVideo()->disableSound(); // Seek to the last frame. Some scripts depend on that. - _primaryVideo->getVideo()->seekFrame(endFrame, SEEK_SET, true); + _primaryVideo->seek(endFrame, SEEK_SET, true); return true; } } @@ -750,37 +679,45 @@ bool VideoPlayer::doPlay(int16 frame, int16 breakKey, return false; } -void VideoPlayer::copyPalette(Graphics::CoktelVideo &video, int16 palStart, int16 palEnd) { - if (!(video.getFeatures() & Graphics::CoktelVideo::kFeaturesPalette)) +void VideoPlayer::copyPalette(Graphics::CoktelDecoder &video, int16 palStart, int16 palEnd) { + /* + if (!(video.getFeatures() & Graphics::CoktelDecoder::kFeaturesPalette)) return; + */ if (palStart < 0) palStart = 0; if (palEnd < 0) palEnd = 255; + /* memcpy(((char *)(_vm->_global->_pPaletteDesc->vgaPal)) + palStart * 3, video.getPalette() + palStart * 3, (palEnd - palStart + 1) * 3); + */ } void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY, int16 varFrames, int16 varWidth, int16 varHeight) { if (primaryOpen(videoFile)) { - int16 x, y, width, height; + int16 x = -1, y = -1, width = -1, height = -1; + /* x = _primaryVideo->getVideo()->getX(); y = _primaryVideo->getVideo()->getY(); width = _primaryVideo->getVideo()->getWidth(); height = _primaryVideo->getVideo()->getHeight(); + */ + /* if (VAR_OFFSET(varX) == 0xFFFFFFFF) _primaryVideo->getVideo()->getFrameCoords(1, x, y, width, height); + */ WRITE_VAR_OFFSET(varX, x); WRITE_VAR_OFFSET(varY, y); - WRITE_VAR_OFFSET(varFrames, _primaryVideo->getVideo()->getFramesCount()); + WRITE_VAR_OFFSET(varFrames, _primaryVideo->getFrameCount()); WRITE_VAR_OFFSET(varWidth, width); WRITE_VAR_OFFSET(varHeight, height); @@ -794,11 +731,13 @@ void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY, } } -void VideoPlayer::evalBgShading(Graphics::CoktelVideo &video) { +void VideoPlayer::evalBgShading(Graphics::CoktelDecoder &video) { + /* if (video.isSoundPlaying()) _vm->_sound->bgShade(); else _vm->_sound->bgUnshade(); + */ } } // End of namespace Gob diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h index 8ca8aebf44..f885e96428 100644 --- a/engines/gob/videoplayer.h +++ b/engines/gob/videoplayer.h @@ -29,7 +29,7 @@ #include "common/array.h" #include "common/str.h" -#include "graphics/video/coktelvideo/coktelvideo.h" +#include "graphics/video/coktel_decoder.h" #include "gob/util.h" @@ -88,16 +88,16 @@ public: bool slotIsOpen(int slot) const; - const char *getFileName(int slot = -1) const; + const Common::String &getPrimaryFileName() const; uint16 getFlags(int slot = -1) const; - int16 getFramesCount(int slot = -1) const; + int16 getFrameCount(int slot = -1) const; int16 getCurrentFrame(int slot = -1) const; int16 getWidth(int slot = -1) const; int16 getHeight(int slot = -1) const; int16 getDefaultX(int slot = -1) const; int16 getDefaultY(int slot = -1) const; - Graphics::CoktelVideo::State getState(int slot = -1) const; + void getState(int slot = -1) const; uint32 getFeatures(int slot = -1) const; bool hasExtraData(const char *fileName, int slot = -1) const; @@ -107,47 +107,17 @@ public: int16 varFrames, int16 varWidth, int16 varHeight); private: - class Video { - public: - Video(GobEngine *vm); - ~Video(); - - bool open(const char *fileName, Type which, int16 width, int16 height); - void close(); - - bool isOpen() const; - - const char *getFileName() const; - Graphics::CoktelVideo *getVideo(); - const Graphics::CoktelVideo *getVideo() const; - - Graphics::CoktelVideo::State getState() const; - uint32 getFeatures() const; - - int16 getDefaultX() const; - int16 getDefaultY() const; - - bool hasExtraData(const char *fileName) const; - Common::MemoryReadStream *getExtraData(const char *fileName); - - Graphics::CoktelVideo::State nextFrame(); - - private: - GobEngine *_vm; - - Common::String _fileName; - DataStream *_stream; - Graphics::CoktelVideo *_video; - Graphics::CoktelVideo::State _state; - int16 _defaultX, _defaultY; - }; + static const int kVideoSlotCount = 32; static const char *_extensions[]; GobEngine *_vm; - Common::Array